191 lines
No EOL
5.5 KiB
TypeScript
191 lines
No EOL
5.5 KiB
TypeScript
/**
|
|
* Serviço para gerenciar produtos de venda via BFF
|
|
* Integração com https://bff-dev.saveinmed.com.br/api/v1/produtos-venda
|
|
*/
|
|
|
|
const BFF_BASE_URL = process.env.NEXT_PUBLIC_BFF_API_URL!;
|
|
|
|
export interface ProdutoVendaResponse {
|
|
id: string;
|
|
catalogo_id: string;
|
|
nome: string;
|
|
preco_venda: number;
|
|
observacoes?: string;
|
|
data_validade?: string;
|
|
empresa_id: string;
|
|
createdAt: string;
|
|
updatedAt: string;
|
|
}
|
|
|
|
export interface ProdutoCatalogoResponse {
|
|
$id: string;
|
|
descricao: string;
|
|
nome?: string;
|
|
"codigo-interno"?: string;
|
|
"codigo-ean"?: string;
|
|
"principio-ativo"?: string;
|
|
concentracao?: string;
|
|
"forma-farmaceutica"?: string;
|
|
"registro-anvisa"?: string;
|
|
prescricao?: string;
|
|
observacoes?: string;
|
|
laboratorios?: any;
|
|
categorias?: any;
|
|
"preco-base"?: number;
|
|
}
|
|
|
|
export interface ProdutoVendaData {
|
|
id: string;
|
|
catalogo_id: string;
|
|
nome: string;
|
|
descricao?: string;
|
|
codigo_ean?: string;
|
|
codigo_interno?: string;
|
|
preco_base?: number;
|
|
preco_venda: number;
|
|
laboratorio?: string;
|
|
categoria?: string;
|
|
lab_nome?: string;
|
|
cat_nome?: string;
|
|
observacoes?: string;
|
|
data_validade?: string;
|
|
principio_ativo?: string;
|
|
concentracao?: string;
|
|
forma_farmaceutica?: string;
|
|
registro_anvisa?: string;
|
|
prescricao?: string;
|
|
}
|
|
|
|
export interface ApiResponse<T = any> {
|
|
success: boolean;
|
|
data?: T;
|
|
error?: string;
|
|
}
|
|
|
|
export const produtoVendaService = {
|
|
/**
|
|
* Obtém o token de autenticação do localStorage
|
|
*/
|
|
getAuthToken: (): string | null => {
|
|
return localStorage.getItem('access_token');
|
|
},
|
|
|
|
/**
|
|
* Busca dados do catálogo de produtos por ID
|
|
*/
|
|
buscarCatalogoPorId: async (catalogoId: string): Promise<ProdutoCatalogoResponse | null> => {
|
|
try {
|
|
const token = produtoVendaService.getAuthToken();
|
|
if (!token) {
|
|
console.error('❌ Token de autenticação não encontrado');
|
|
return null;
|
|
}
|
|
|
|
|
|
const response = await fetch(`${BFF_BASE_URL}/produtos-catalogo/${catalogoId}`, {
|
|
method: 'GET',
|
|
headers: {
|
|
'accept': 'application/json',
|
|
'Authorization': `Bearer ${token}`,
|
|
},
|
|
});
|
|
|
|
if (response.ok) {
|
|
const data = await response.json();
|
|
return data;
|
|
} else {
|
|
const errorData = await response.json();
|
|
console.error('❌ Erro ao buscar produto do catálogo:', errorData);
|
|
return null;
|
|
}
|
|
} catch (error) {
|
|
console.error('💥 Erro ao buscar produto do catálogo:', error);
|
|
return null;
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Busca um produto de venda por ID e complementa com dados do catálogo
|
|
*/
|
|
buscarPorId: async (produtoId: string): Promise<ProdutoVendaData | null> => {
|
|
try {
|
|
const token = produtoVendaService.getAuthToken();
|
|
if (!token) {
|
|
console.error('❌ Token de autenticação não encontrado');
|
|
return null;
|
|
}
|
|
|
|
|
|
// 1. Buscar dados do produto de venda
|
|
const vendaResponse = await fetch(`${BFF_BASE_URL}/produtos-venda/${produtoId}`, {
|
|
method: 'GET',
|
|
headers: {
|
|
'accept': 'application/json',
|
|
'Authorization': `Bearer ${token}`,
|
|
},
|
|
});
|
|
|
|
if (!vendaResponse.ok) {
|
|
const errorData = await vendaResponse.json();
|
|
console.error('❌ Erro ao buscar produto de venda:', errorData);
|
|
return null;
|
|
}
|
|
|
|
const produtoVenda: ProdutoVendaResponse = await vendaResponse.json();
|
|
|
|
// 2. Buscar dados complementares do catálogo
|
|
let produtoCatalogo: ProdutoCatalogoResponse | null = null;
|
|
if (produtoVenda.catalogo_id) {
|
|
produtoCatalogo = await produtoVendaService.buscarCatalogoPorId(produtoVenda.catalogo_id);
|
|
}
|
|
|
|
// 3. Combinar os dados
|
|
const produtoCompleto: ProdutoVendaData = {
|
|
id: produtoVenda.id,
|
|
catalogo_id: produtoVenda.catalogo_id,
|
|
nome: produtoVenda.nome || produtoCatalogo?.nome || 'Produto sem nome',
|
|
descricao: produtoCatalogo?.descricao || '',
|
|
codigo_ean: produtoCatalogo?.['codigo-ean'] || '',
|
|
codigo_interno: produtoCatalogo?.['codigo-interno'] || '',
|
|
preco_base: produtoCatalogo?.['preco-base'] || 0,
|
|
preco_venda: produtoVenda.preco_venda,
|
|
laboratorio: produtoCatalogo?.laboratorios || '',
|
|
categoria: produtoCatalogo?.categorias || '',
|
|
lab_nome: '', // Será preenchido se necessário
|
|
cat_nome: '', // Será preenchido se necessário
|
|
observacoes: produtoVenda.observacoes,
|
|
data_validade: produtoVenda.data_validade,
|
|
principio_ativo: produtoCatalogo?.['principio-ativo'] || '',
|
|
concentracao: produtoCatalogo?.concentracao || '',
|
|
forma_farmaceutica: produtoCatalogo?.['forma-farmaceutica'] || '',
|
|
registro_anvisa: produtoCatalogo?.['registro-anvisa'] || '',
|
|
prescricao: produtoCatalogo?.prescricao || '',
|
|
};
|
|
|
|
return produtoCompleto;
|
|
|
|
} catch (error) {
|
|
console.error('💥 Erro ao buscar produto de venda:', error);
|
|
return null;
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Busca múltiplos produtos de venda por IDs
|
|
*/
|
|
buscarMultiplosPorIds: async (produtoIds: string[]): Promise<ProdutoVendaData[]> => {
|
|
try {
|
|
|
|
const produtosPromises = produtoIds.map(id => produtoVendaService.buscarPorId(id));
|
|
const produtosResults = await Promise.all(produtosPromises);
|
|
|
|
const produtosValidos = produtosResults.filter(produto => produto !== null) as ProdutoVendaData[];
|
|
|
|
return produtosValidos;
|
|
|
|
} catch (error) {
|
|
console.error('💥 Erro ao buscar múltiplos produtos de venda:', error);
|
|
return [];
|
|
}
|
|
}
|
|
}; |