223 lines
8.6 KiB
JavaScript
223 lines
8.6 KiB
JavaScript
import api from './api';
|
|
import { handleRequest, simulateLatency } from './serviceUtils';
|
|
|
|
/**
|
|
* Service de Fornecedores do Financeiro V2
|
|
* Gerencia comunicação com as rotas de fornecedores
|
|
* Baseado na lógica antiga: Consult_Get para listar, POST para criar/editar
|
|
*/
|
|
export const fornecedoresService = {
|
|
/**
|
|
* Busca todos os fornecedores
|
|
* Baseado na lógica antiga: Consult_Get com Resulte: "Status_fornecedores"
|
|
* Tenta múltiplas rotas possíveis:
|
|
* - /Status_fornecedores/apresentar (baseado no Resulte)
|
|
* - /fornecedores/apresentar (rota padrão)
|
|
* Retorna: Base_Dados_API com array de fornecedores
|
|
* @returns {Promise<Array>}
|
|
*/
|
|
fetchFornecedores: () => handleRequest({
|
|
mockFn: () => simulateLatency([]),
|
|
apiFn: async () => {
|
|
console.log('[fornecedoresService] Iniciando busca de fornecedores...');
|
|
|
|
// Tenta primeiro a rota baseada no Resulte da lógica antiga
|
|
const rotasPossiveis = [
|
|
'/fornecedores',
|
|
'/fornecedores/apresentar',
|
|
'/status_fornecedores/apresentar'
|
|
];
|
|
|
|
for (const rota of rotasPossiveis) {
|
|
try {
|
|
console.log(`[fornecedoresService] Tentando rota: ${rota}`);
|
|
const response = await api.get(rota);
|
|
console.log('[fornecedoresService] Resposta recebida:', response.data);
|
|
|
|
// Novo formato: { dados: [...], total: number }
|
|
if (response.data?.dados && Array.isArray(response.data.dados)) {
|
|
console.log(`[fornecedoresService] Dados extraídos do novo formato (dados):`, response.data.dados.length, 'itens', `(total: ${response.data.total})`);
|
|
return response.data.dados;
|
|
}
|
|
|
|
// Se retornar Base_Dados_API (estrutura antiga), extrai o array
|
|
if (response.data?.Base_Dados_API) {
|
|
const dados = Array.isArray(response.data.Base_Dados_API)
|
|
? response.data.Base_Dados_API
|
|
: Object.values(response.data.Base_Dados_API || {});
|
|
console.log(`[fornecedoresService] Dados extraídos de Base_Dados_API:`, dados.length, 'itens');
|
|
return dados;
|
|
}
|
|
|
|
// Se vier como array direto
|
|
if (Array.isArray(response.data)) {
|
|
console.log(`[fornecedoresService] Dados recebidos como array:`, response.data.length, 'itens');
|
|
return response.data;
|
|
}
|
|
|
|
// Se vier como objeto com chaves numéricas
|
|
if (typeof response.data === 'object' && response.data !== null) {
|
|
const dados = Object.values(response.data);
|
|
console.log(`[fornecedoresService] Dados extraídos de objeto:`, dados.length, 'itens');
|
|
return dados;
|
|
}
|
|
|
|
console.warn(`[fornecedoresService] Formato de resposta não reconhecido para rota ${rota}`);
|
|
} catch (err) {
|
|
console.warn(`[fornecedoresService] Erro na rota ${rota}:`, err.message);
|
|
// Continua para próxima rota
|
|
if (rota === rotasPossiveis[rotasPossiveis.length - 1]) {
|
|
// Se é a última rota, lança o erro
|
|
console.error('[fornecedoresService] Todas as rotas falharam');
|
|
throw err;
|
|
}
|
|
}
|
|
}
|
|
|
|
console.warn('[fornecedoresService] Nenhuma rota funcionou, retornando array vazio');
|
|
return [];
|
|
}
|
|
}),
|
|
|
|
/**
|
|
* Cria um novo fornecedor
|
|
* Rota: POST /fornecedores/create
|
|
* Payload: objeto com campos do formulário
|
|
* @param {Object} fornecedorData - Dados do fornecedor
|
|
* @returns {Promise<Object>}
|
|
*/
|
|
createFornecedor: (fornecedorData) => handleRequest({
|
|
mockFn: () => simulateLatency({
|
|
...fornecedorData,
|
|
idfornecedores: Date.now(),
|
|
id: Date.now()
|
|
}),
|
|
apiFn: async () => {
|
|
// Mapeia campos do formulário para o formato esperado pelo backend
|
|
const payload = {
|
|
nome_da_empresa: fornecedorData.nome_da_empresa || fornecedorData.nome || '',
|
|
email: fornecedorData.email || '',
|
|
cpf_cnpj: fornecedorData.cpf_cnpj || '',
|
|
telefone: fornecedorData.telefone || '',
|
|
tipo_pessoa: fornecedorData.tipo_pessoa || 'JURIDICA',
|
|
servico: fornecedorData.servico || '',
|
|
obs: fornecedorData.obs || '',
|
|
endereco: fornecedorData.endereco || '',
|
|
bairro: fornecedorData.bairro || '',
|
|
cidade: fornecedorData.cidade || '',
|
|
uf: fornecedorData.uf || '',
|
|
cep: fornecedorData.cep || '',
|
|
// idregra enviado como lista
|
|
idregra: Array.isArray(fornecedorData.idregra) ? fornecedorData.idregra : (fornecedorData.idregra ? [fornecedorData.idregra] : [])
|
|
};
|
|
|
|
const response = await api.post('/fornecedores/create', payload);
|
|
return response.data;
|
|
}
|
|
}),
|
|
|
|
/**
|
|
* Atualiza um fornecedor existente
|
|
* Rota: POST /fornecedores/edit
|
|
* Payload: objeto com campos do formulário incluindo idfornecedores
|
|
* @param {number|string} id - idfornecedores
|
|
* @param {Object} fornecedorData - Dados atualizados do fornecedor
|
|
* @returns {Promise<Object>}
|
|
*/
|
|
updateFornecedor: (id, fornecedorData) => handleRequest({
|
|
mockFn: () => simulateLatency({
|
|
...fornecedorData,
|
|
idfornecedores: id,
|
|
id: id
|
|
}),
|
|
apiFn: async () => {
|
|
// Mapeia campos do formulário para o formato esperado pelo backend
|
|
const payload = {
|
|
idfornecedores: id,
|
|
nome_da_empresa: fornecedorData.nome_da_empresa || fornecedorData.nome || '',
|
|
email: fornecedorData.email || '',
|
|
cpf_cnpj: fornecedorData.cpf_cnpj || '',
|
|
telefone: fornecedorData.telefone || '',
|
|
tipo_pessoa: fornecedorData.tipo_pessoa || 'JURIDICA',
|
|
servico: fornecedorData.servico || '',
|
|
obs: fornecedorData.obs || '',
|
|
endereco: fornecedorData.endereco || '',
|
|
bairro: fornecedorData.bairro || '',
|
|
cidade: fornecedorData.cidade || '',
|
|
uf: fornecedorData.uf || '',
|
|
cep: fornecedorData.cep || '',
|
|
// idregra enviado como lista
|
|
idregra: Array.isArray(fornecedorData.idregra) ? fornecedorData.idregra : (fornecedorData.idregra ? [fornecedorData.idregra] : [])
|
|
};
|
|
|
|
const response = await api.post('/fornecedores/edit', payload);
|
|
return response.data;
|
|
}
|
|
}),
|
|
|
|
/**
|
|
* Exclui um fornecedor
|
|
* Rota: POST /fornecedores/delete (ou conforme element.Manipuladores[2].Route)
|
|
* @param {number|string} id - idfornecedores
|
|
* @returns {Promise<any>}
|
|
*/
|
|
deleteFornecedor: (id) => handleRequest({
|
|
mockFn: () => simulateLatency({ success: true }),
|
|
apiFn: async () => {
|
|
try {
|
|
console.log('[fornecedoresService] Tentando excluir fornecedor via DELETE /fornecedores/delete:', id);
|
|
const response = await api.delete('/fornecedores/delete', {
|
|
data: { idfornecedores: id }
|
|
});
|
|
return response.data;
|
|
} catch (err) {
|
|
console.warn('[fornecedoresService] Falha no DELETE /fornecedores/delete, tentando fallback DELETE com ID na URL:', err.message);
|
|
// Fallback: tenta DELETE /fornecedores/:id
|
|
try {
|
|
const response = await api.delete(`/fornecedores/${id}`);
|
|
return response.data;
|
|
} catch (err2) {
|
|
console.error('[fornecedoresService] Erro ao excluir fornecedor (todas as rotas):', err2);
|
|
throw err2;
|
|
}
|
|
}
|
|
}
|
|
}),
|
|
|
|
/**
|
|
* Busca movimentações aplicadas a uma ou mais regras (usado no extrato do fornecedor)
|
|
* Rota: POST /regra_aplicada
|
|
* @param {number|string|Array} idregra - ID ou lista de IDs de regra
|
|
* @param {string} tipoOperacao - 'C' ou 'D'
|
|
* @param {Array} [idempresa] - Lista de IDs de empresa (opcional)
|
|
* @returns {Promise<Array>}
|
|
*/
|
|
fetchRegraAplicada: (idregra, tipoOperacao, idempresa) => handleRequest({
|
|
mockFn: () => simulateLatency([]),
|
|
apiFn: async () => {
|
|
// Normaliza idregra como array
|
|
const regraIds = Array.isArray(idregra) ? idregra : (idregra ? [idregra] : []);
|
|
|
|
const payload = {
|
|
idregra: regraIds,
|
|
tipoOperacao: tipoOperacao,
|
|
...(idempresa && Array.isArray(idempresa) && idempresa.length > 0 ? { idempresa } : {})
|
|
};
|
|
|
|
const response = await api.post('/regra_aplicada', payload);
|
|
|
|
// Ajuste conforme estrutura de retorno da rota
|
|
if (response.data?.linha_tempo) {
|
|
return response.data.linha_tempo;
|
|
}
|
|
|
|
if (response.data?.Base_Dados_API) {
|
|
return Array.isArray(response.data.Base_Dados_API)
|
|
? response.data.Base_Dados_API
|
|
: Object.values(response.data.Base_Dados_API);
|
|
}
|
|
return Array.isArray(response.data) ? response.data : [];
|
|
}
|
|
})
|
|
};
|