saveinmed/saveinmed-frontend/src/services/produtoVendaService.ts
Tiago Yamamoto b39caf0fd0 first commit
2025-12-17 13:58:26 -03:00

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 [];
}
}
};