import axios from 'axios'; import { API_BASE_URL } from '../config/api'; // Crear instancia de axios const api = axios.create({ baseURL: API_BASE_URL, headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', }, }); // Interceptor para agregar token en cada request api.interceptors.request.use( (config) => { const token = localStorage.getItem('token'); if (token) { config.headers.Authorization = `Bearer ${token}`; } return config; }, (error) => { return Promise.reject(error); } ); // Interceptor para manejar errores de respuesta api.interceptors.response.use( (response) => response, (error) => { if (error.response?.status === 401) { // Token expirado o inválido localStorage.removeItem('token'); localStorage.removeItem('user'); window.location.href = '/login'; } return Promise.reject(error); } ); // Auth Services export const authService = { register: async (userData) => { // Register user but DON'T save token - user needs to pay and activate via email first const response = await api.post('/register', userData); return response.data; }, login: async (credentials) => { const response = await api.post('/login', credentials); if (response.data.success) { localStorage.setItem('token', response.data.data.token); localStorage.setItem('user', JSON.stringify(response.data.data.user)); } return response.data; }, // Activate account from email link activateAccount: async (token) => { const response = await api.post('/activate', { token }); if (response.data.success) { localStorage.setItem('token', response.data.data.token); localStorage.setItem('user', JSON.stringify(response.data.data.user)); } return response.data; }, // Resend activation email resendActivation: async (email) => { const response = await api.post('/resend-activation', { email }); return response.data; }, logout: async () => { try { await api.post('/logout'); } finally { localStorage.removeItem('token'); localStorage.removeItem('user'); } }, getCurrentUser: () => { const user = localStorage.getItem('user'); return user ? JSON.parse(user) : null; }, isAuthenticated: () => { return !!localStorage.getItem('token'); }, }; // ============================================ // Account Services (Contas) // ============================================ export const accountService = { // Listar todas as contas getAll: async (params = {}) => { const response = await api.get('/accounts', { params }); return response.data; }, // Obter uma conta específica getById: async (id) => { const response = await api.get(`/accounts/${id}`); return response.data; }, // Criar nova conta create: async (data) => { const response = await api.post('/accounts', data); return response.data; }, // Atualizar conta update: async (id, data) => { const response = await api.put(`/accounts/${id}`, data); return response.data; }, // Excluir conta delete: async (id) => { const response = await api.delete(`/accounts/${id}`); return response.data; }, // Obter saldo total getTotalBalance: async () => { const response = await api.get('/accounts-total'); return response.data; }, // Recalcular saldos de todas as contas recalculateAllBalances: async () => { const response = await api.post('/accounts/recalculate-all'); return response.data; }, // Recalcular saldo de uma conta específica recalculateBalance: async (id) => { const response = await api.post(`/accounts/${id}/recalculate`); return response.data; }, // Ajustar saldo de uma conta (calcula initial_balance automaticamente) adjustBalance: async (id, targetBalance) => { const response = await api.post(`/accounts/${id}/adjust-balance`, { target_balance: targetBalance }); return response.data; }, // Tipos de conta disponíveis types: { cash: 'Dinheiro', checking: 'Conta Corrente', savings: 'Poupança', credit_card: 'Cartão de Crédito', asset: 'Ativo', liability: 'Passivo', }, // Ícones sugeridos por tipo icons: { cash: 'bi-cash-stack', checking: 'bi-bank', savings: 'bi-piggy-bank', credit_card: 'bi-credit-card', asset: 'bi-graph-up-arrow', liability: 'bi-graph-down-arrow', }, }; // ============================================ // Cost Center Services (Centros de Custo) // ============================================ export const costCenterService = { // Listar todos os centros de custo getAll: async (params = {}) => { const response = await api.get('/cost-centers', { params }); return response.data; }, // Obter um centro de custo específico getById: async (id) => { const response = await api.get(`/cost-centers/${id}`); return response.data; }, // Criar novo centro de custo create: async (data) => { const response = await api.post('/cost-centers', data); return response.data; }, // Atualizar centro de custo update: async (id, data) => { const response = await api.put(`/cost-centers/${id}`, data); return response.data; }, // Excluir centro de custo delete: async (id) => { const response = await api.delete(`/cost-centers/${id}`); return response.data; }, // Adicionar palavra-chave addKeyword: async (id, keyword, isCaseSensitive = false) => { const response = await api.post(`/cost-centers/${id}/keywords`, { keyword, is_case_sensitive: isCaseSensitive, }); return response.data; }, // Remover palavra-chave removeKeyword: async (id, keywordId) => { const response = await api.delete(`/cost-centers/${id}/keywords/${keywordId}`); return response.data; }, // Encontrar centro de custo por texto matchByText: async (text) => { const response = await api.post('/cost-centers/match', { text }); return response.data; }, }; // ============================================ // Category Services (Categorias) // ============================================ export const categoryService = { // Listar todas as categorias getAll: async (params = {}) => { const response = await api.get('/categories', { params }); return response.data; }, // Obter uma categoria específica getById: async (id) => { const response = await api.get(`/categories/${id}`); return response.data; }, // Criar nova categoria create: async (data) => { const response = await api.post('/categories', data); return response.data; }, // Atualizar categoria update: async (id, data) => { const response = await api.put(`/categories/${id}`, data); return response.data; }, // Excluir categoria delete: async (id) => { const response = await api.delete(`/categories/${id}`); return response.data; }, // Adicionar palavra-chave addKeyword: async (id, keyword, isCaseSensitive = false) => { const response = await api.post(`/categories/${id}/keywords`, { keyword, is_case_sensitive: isCaseSensitive, }); return response.data; }, // Remover palavra-chave removeKeyword: async (id, keywordId) => { const response = await api.delete(`/categories/${id}/keywords/${keywordId}`); return response.data; }, // Encontrar categoria por texto matchByText: async (text, type = null) => { const response = await api.post('/categories/match', { text, type }); return response.data; }, // Reordenar categorias reorder: async (orders) => { const response = await api.post('/categories/reorder', { orders }); return response.data; }, // Categorização em lote - Preview categorizeBatchPreview: async (onlyUncategorized = true, limit = 50, filters = null) => { const response = await api.post('/categories/categorize-batch/preview', { only_uncategorized: onlyUncategorized, preview_limit: limit, filters: filters, }); return response.data; }, // Categorização em lote - Executar categorizeBatch: async (onlyUncategorized = true, transactionIds = null, filters = null) => { const response = await api.post('/categories/categorize-batch', { only_uncategorized: onlyUncategorized, transaction_ids: transactionIds, filters: filters, }); return response.data; }, // Categorização em lote manual - aplicar categoria/centro de custo selecionados categorizeBatchManual: async (categoryId, costCenterId, filters, addKeyword = false, transactionIds = null) => { const response = await api.post('/categories/categorize-batch/manual', { category_id: categoryId, cost_center_id: costCenterId, filters: filters, add_keyword: addKeyword, transaction_ids: transactionIds, }); return response.data; }, // Tipos de categoria disponíveis types: { income: 'Receita', expense: 'Despesa', both: 'Ambos', }, }; // ============================================ // Liability Account Services (Contas Passivo) // ============================================ export const liabilityAccountService = { // Listar todas as contas passivo getAll: async (params = {}) => { const response = await api.get('/liability-accounts', { params }); return response.data; }, // Obter uma conta passivo específica com parcelas getById: async (id) => { const response = await api.get(`/liability-accounts/${id}`); return response.data; }, // Criar nova conta passivo manualmente create: async (data) => { const response = await api.post('/liability-accounts', data); return response.data; }, // Atualizar conta passivo update: async (id, data) => { const response = await api.put(`/liability-accounts/${id}`, data); return response.data; }, // Excluir conta passivo delete: async (id) => { const response = await api.delete(`/liability-accounts/${id}`); return response.data; }, // Importar contrato de arquivo Excel import: async (formData) => { const response = await api.post('/liability-accounts/import', formData, { headers: { 'Content-Type': 'multipart/form-data', }, }); return response.data; }, // Obter parcelas de uma conta getInstallments: async (accountId) => { const response = await api.get(`/liability-accounts/${accountId}/installments`); return response.data; }, // Atualizar uma parcela updateInstallment: async (accountId, installmentId, data) => { const response = await api.put(`/liability-accounts/${accountId}/installments/${installmentId}`, data); return response.data; }, // Obter resumo geral getSummary: async () => { const response = await api.get('/liability-summary'); return response.data; }, // Conciliação - Listar parcelas pendentes de conciliação getPendingReconciliation: async () => { const response = await api.get('/liability-accounts/pending-reconciliation'); return response.data; }, // Conciliação - Buscar transações elegíveis para vincular a uma parcela getEligibleTransactions: async (accountId, installmentId, params = {}) => { const response = await api.get(`/liability-accounts/${accountId}/installments/${installmentId}/eligible-transactions`, { params }); return response.data; }, // Conciliação - Vincular uma parcela a uma transação reconcile: async (accountId, installmentId, transactionId, markAsPaid = true) => { const response = await api.post(`/liability-accounts/${accountId}/installments/${installmentId}/reconcile`, { transaction_id: transactionId, mark_as_paid: markAsPaid, }); return response.data; }, // Conciliação - Remover vínculo entre parcela e transação unreconcile: async (accountId, installmentId) => { const response = await api.delete(`/liability-accounts/${accountId}/installments/${installmentId}/reconcile`); return response.data; }, // Status disponíveis para contas statuses: { active: 'Activo', paid_off: 'Liquidado', defaulted: 'En mora', renegotiated: 'Renegociado', }, // Status disponíveis para parcelas installmentStatuses: { pending: 'Pendiente', paid: 'Pagado', partial: 'Parcial', overdue: 'Vencido', cancelled: 'Cancelado', }, // Download template Excel downloadTemplate: async () => { const response = await api.get('/liability-accounts/template', { responseType: 'blob', }); return response.data; }, // Obter tipos de contrato getContractTypes: async () => { const response = await api.get('/liability-accounts/contract-types'); return response.data; }, // Criar conta passivo via wizard createWithWizard: async (data) => { const response = await api.post('/liability-accounts/wizard', data); return response.data; }, }; // ============================================ // Asset Account Services (Contas Ativo) // ============================================ export const assetAccountService = { // Listar todos os ativos getAll: async (params = {}) => { const response = await api.get('/asset-accounts', { params }); return response.data; }, // Obter um ativo específico getById: async (id) => { const response = await api.get(`/asset-accounts/${id}`); return response.data; }, // Criar novo ativo manualmente create: async (data) => { const response = await api.post('/asset-accounts', data); return response.data; }, // Atualizar ativo update: async (id, data) => { const response = await api.put(`/asset-accounts/${id}`, data); return response.data; }, // Excluir ativo delete: async (id) => { const response = await api.delete(`/asset-accounts/${id}`); return response.data; }, // Obter tipos de ativos e opções getAssetTypes: async () => { const response = await api.get('/asset-accounts/asset-types'); return response.data; }, // Criar ativo via wizard createWithWizard: async (data) => { const response = await api.post('/asset-accounts/wizard', data); return response.data; }, // Obter resumo geral getSummary: async () => { const response = await api.get('/asset-summary'); return response.data; }, // Atualizar valor de mercado updateValue: async (id, currentValue, note = null) => { const response = await api.put(`/asset-accounts/${id}/value`, { current_value: currentValue, note: note, }); return response.data; }, // Registrar venda/baixa dispose: async (id, data) => { const response = await api.post(`/asset-accounts/${id}/dispose`, data); return response.data; }, // Status disponíveis statuses: { active: 'Activo', sold: 'Vendido', depreciated: 'Depreciado', written_off: 'Dado de baja', }, }; // ============================================ // Transaction Services (Transações) // ============================================ export const transactionService = { // Listar transações com filtros getAll: async (params = {}) => { const response = await api.get('/transactions', { params }); return response.data; }, // Obter uma transação específica getById: async (id) => { const response = await api.get(`/transactions/${id}`); return response.data; }, // Criar nova transação create: async (data) => { const response = await api.post('/transactions', data); return response.data; }, // Atualizar transação update: async (id, data) => { const response = await api.put(`/transactions/${id}`, data); return response.data; }, // Excluir transação delete: async (id) => { const response = await api.delete(`/transactions/${id}`); return response.data; }, // Marcar como concluída complete: async (id, data = {}) => { const response = await api.post(`/transactions/${id}/complete`, data); return response.data; }, // Cancelar transação cancel: async (id) => { const response = await api.post(`/transactions/${id}/cancel`); return response.data; }, // Reverter para pendente revert: async (id) => { const response = await api.post(`/transactions/${id}/revert`); return response.data; }, // Duplicar transação duplicate: async (id) => { const response = await api.post(`/transactions/${id}/duplicate`); return response.data; }, // Obter resumo getSummary: async (params = {}) => { const response = await api.get('/transactions-summary', { params }); return response.data; }, // Listar transações agrupadas por semana e divisa getByWeek: async (params = {}) => { const response = await api.get('/transactions-by-week', { params }); return response.data; }, // Tipos de transação types: { credit: 'Crédito', debit: 'Débito', }, // Status de transação statuses: { pending: 'Pendente', completed: 'Concluída', cancelled: 'Cancelada', }, // Cores por status statusColors: { pending: 'warning', completed: 'success', cancelled: 'secondary', }, // Cores por tipo typeColors: { credit: 'success', debit: 'danger', }, // Efetivação rápida (direto da listagem) quickComplete: async (id, data = {}) => { const response = await api.post(`/transactions/${id}/quick-complete`, data); return response.data; }, // Transferência entre contas transfer: async (data) => { const response = await api.post('/transactions/transfer', data); return response.data; }, // Dividir transação em múltiplas categorias split: async (id, splits) => { const response = await api.post(`/transactions/${id}/split`, { splits }); return response.data; }, // Desfazer divisão de transação unsplit: async (id) => { const response = await api.post(`/transactions/${id}/unsplit`); return response.data; }, // Obter divisões de uma transação getSplits: async (id) => { const response = await api.get(`/transactions/${id}/splits`); return response.data; }, // Desvincular transferência (remover flag is_transfer) unlinkTransfer: async (id) => { const response = await api.post(`/transactions/${id}/unlink-transfer`); return response.data; }, // Buscar parcelas de passivo compatíveis para conciliação findLiabilityInstallments: async (id, toleranceDays = 15) => { const response = await api.get(`/transactions/${id}/liability-installments`, { params: { tolerance_days: toleranceDays } }); return response.data; }, // Conciliar transação com parcela de passivo reconcileWithLiability: async (transactionId, installmentId) => { const response = await api.post(`/transactions/${transactionId}/reconcile-liability`, { installment_id: installmentId }); return response.data; }, }; // ============================================ // Import Services (Importação de Extratos) // ============================================ export const importService = { // Upload de arquivo para preview upload: async (formData) => { const response = await api.post('/import/upload', formData, { headers: { 'Content-Type': 'multipart/form-data', }, }); return response.data; }, // Obter headers do arquivo getHeaders: async (data) => { const response = await api.post('/import/headers', data); return response.data; }, // Processar importação process: async (data) => { const response = await api.post('/import/process', data); return response.data; }, // Listar mapeamentos salvos getMappings: async () => { const response = await api.get('/import/mappings'); return response.data; }, // Obter um mapeamento getMapping: async (id) => { const response = await api.get(`/import/mappings/${id}`); return response.data; }, // Atualizar mapeamento updateMapping: async (id, data) => { const response = await api.put(`/import/mappings/${id}`, data); return response.data; }, // Excluir mapeamento deleteMapping: async (id) => { const response = await api.delete(`/import/mappings/${id}`); return response.data; }, // Listar presets de bancos getPresets: async () => { const response = await api.get('/import/presets'); return response.data; }, // Criar mapeamento a partir de preset createFromPreset: async (preset) => { const response = await api.post('/import/presets/create', { preset }); return response.data; }, // Histórico de importações getHistory: async () => { const response = await api.get('/import/history'); return response.data; }, // Obter definições de campos getFields: async () => { const response = await api.get('/import/fields'); return response.data; }, }; // ============================================ // Duplicate Detection Services (Detecção de Duplicatas) // ============================================ export const duplicateService = { // Listar transações duplicadas potenciais getAll: async () => { const response = await api.get('/duplicate-transactions'); return response.data; }, // Obter estatísticas de duplicatas getStats: async () => { const response = await api.get('/duplicate-transactions/stats'); return response.data; }, // Listar pagamentos suspeitos (mesmo valor, datas próximas) getSuspicious: async (days = 7) => { const response = await api.get('/duplicate-transactions/suspicious', { params: { days } }); return response.data; }, // Excluir uma transação duplicada delete: async (id) => { const response = await api.delete(`/duplicate-transactions/${id}`); return response.data; }, // Ignorar par de transações (não são duplicatas) ignore: async (transaction1Id, transaction2Id) => { const response = await api.post('/duplicate-transactions/ignore', { transaction1_id: transaction1Id, transaction2_id: transaction2Id, }); return response.data; }, // Auto-delete: Deletar todas as duplicatas mantendo apenas a com maior ID autoDelete: async (duplicateIds = null) => { const response = await api.post('/duplicate-transactions/auto-delete', { duplicate_ids: duplicateIds, // null = todas, array = selecionadas }); return response.data; }, }; // ============================================ // Transfer Detection Services (Detecção de Transferências) // ============================================ export const transferDetectionService = { // Listar possíveis transferências entre contas getAll: async (toleranceDays = 3) => { const response = await api.get('/transfer-detection', { params: { tolerance_days: toleranceDays } }); return response.data; }, // Buscar possíveis pares para uma transação específica findPairs: async (transactionId, toleranceDays = 7) => { const response = await api.get(`/transfer-detection/${transactionId}/pairs`, { params: { tolerance_days: toleranceDays } }); return response.data; }, // Obter estatísticas de transferências getStats: async () => { const response = await api.get('/transfer-detection/stats'); return response.data; }, // Confirmar transferência (vincular as duas transações) confirm: async (debitId, creditId) => { const response = await api.post('/transfer-detection/confirm', { debit_id: debitId, credit_id: creditId, }); return response.data; }, // Confirmar múltiplas transferências em lote confirmBatch: async (transfers) => { const response = await api.post('/transfer-detection/confirm-batch', { transfers: transfers.map(t => ({ debit_id: t.debit.id, credit_id: t.credit.id, })), }); return response.data; }, // Ignorar par (não é transferência) ignore: async (debitId, creditId) => { const response = await api.post('/transfer-detection/ignore', { debit_id: debitId, credit_id: creditId, }); return response.data; }, // Excluir ambas as transações deleteBoth: async (debitId, creditId) => { const response = await api.post('/transfer-detection/delete-both', { debit_id: debitId, credit_id: creditId, }); return response.data; }, }; // ============================================ // Refund Detection Service // ============================================ export const refundDetectionService = { // Listar possíveis pares de reembolso (gasto + devolução que se anulam) getAll: async (toleranceDays = 7) => { const response = await api.get('/refund-detection', { params: { tolerance_days: toleranceDays } }); return response.data; }, // Confirmar par de reembolso confirm: async (debitId, creditId) => { const response = await api.post('/refund-detection/confirm', { debit_id: debitId, credit_id: creditId, }); return response.data; }, // Confirmar múltiplos pares em lote confirmBatch: async (refunds) => { const response = await api.post('/refund-detection/confirm-batch', { pairs: refunds.map(r => ({ debit_id: r.debit.id, credit_id: r.credit.id, })), }); return response.data; }, // Ignorar par ignore: async (debitId, creditId) => { const response = await api.post('/refund-detection/ignore', { debit_id: debitId, credit_id: creditId, }); return response.data; }, // Desfazer par de reembolso undo: async (transactionId) => { const response = await api.post('/refund-detection/undo', { transaction_id: transactionId, }); return response.data; }, }; // ============================================ // Dashboard Service // ============================================ export const dashboardService = { // Resumo geral do dashboard getSummary: async () => { const response = await api.get('/dashboard/summary'); return response.data; }, // Fluxo de caixa mensal getCashflow: async (months = 12, endDate = null) => { const params = { months }; if (endDate) params.end_date = endDate; const response = await api.get('/dashboard/cashflow', { params }); return response.data; }, // Despesas por categoria getExpensesByCategory: async (months = 3) => { const response = await api.get('/dashboard/expenses-by-category', { params: { months } }); return response.data; }, // Receitas por categoria getIncomeByCategory: async (months = 3) => { const response = await api.get('/dashboard/income-by-category', { params: { months } }); return response.data; }, // Diferenças entre valores planejados e efetivos getPaymentVariances: async (months = 3) => { const response = await api.get('/dashboard/payment-variances', { params: { months } }); return response.data; }, // Dados do calendário (transações + recorrentes pendentes) getCalendar: async (year, month) => { const params = {}; if (year) params.year = year; if (month) params.month = month; const response = await api.get('/dashboard/calendar', { params }); return response.data; }, // Transações de um dia específico getCalendarDay: async (date) => { const response = await api.get('/dashboard/calendar-day', { params: { date } }); return response.data; }, // Transações pendentes dos próximos dias getUpcoming: async (days = 7) => { const response = await api.get('/dashboard/upcoming', { params: { days } }); return response.data; }, // Transações em atraso getOverdue: async (limit = 50) => { const response = await api.get('/dashboard/overdue', { params: { limit } }); return response.data; }, }; // ============================================ // Recurring Transactions Service (Transações Recorrentes) // ============================================ export const recurringService = { // Obter frequências disponíveis getFrequencies: async () => { const response = await api.get('/recurring/frequencies'); return response.data; }, // === TEMPLATES === // Listar todos os templates getTemplates: async (params = {}) => { const response = await api.get('/recurring', { params }); return response.data; }, // Obter um template específico getTemplate: async (id) => { const response = await api.get(`/recurring/${id}`); return response.data; }, // Criar template manualmente createTemplate: async (data) => { const response = await api.post('/recurring', data); return response.data; }, // Criar template a partir de uma transação createFromTransaction: async (data) => { const response = await api.post('/recurring/from-transaction', data); return response.data; }, // Atualizar template updateTemplate: async (id, data) => { const response = await api.put(`/recurring/${id}`, data); return response.data; }, // Excluir template deleteTemplate: async (id) => { const response = await api.delete(`/recurring/${id}`); return response.data; }, // Pausar template pauseTemplate: async (id) => { const response = await api.post(`/recurring/${id}/pause`); return response.data; }, // Retomar template resumeTemplate: async (id) => { const response = await api.post(`/recurring/${id}/resume`); return response.data; }, // Listar instâncias de um template getTemplateInstances: async (templateId, params = {}) => { const response = await api.get(`/recurring/${templateId}/instances`, { params }); return response.data; }, // === INSTÂNCIAS === // Listar todas as instâncias pendentes getPendingInstances: async (params = {}) => { const response = await api.get('/recurring/pending', { params }); return response.data; }, // Listar instâncias vencidas getOverdueInstances: async () => { const response = await api.get('/recurring/overdue'); return response.data; }, // Listar instâncias próximas do vencimento getDueSoonInstances: async (days = 7) => { const response = await api.get('/recurring/due-soon', { params: { days } }); return response.data; }, // Marcar instância como paga (cria transação) payInstance: async (instanceId, data = {}) => { const response = await api.post(`/recurring-instances/${instanceId}/pay`, data); return response.data; }, // Conciliar instância com transação existente reconcileInstance: async (instanceId, transactionId, notes = null) => { const response = await api.post(`/recurring-instances/${instanceId}/reconcile`, { transaction_id: transactionId, notes, }); return response.data; }, // Buscar transações candidatas para conciliação findCandidates: async (instanceId, daysTolerance = 7) => { const response = await api.get(`/recurring-instances/${instanceId}/candidates`, { params: { days_tolerance: daysTolerance }, }); return response.data; }, // Pular instância skipInstance: async (instanceId, reason = null) => { const response = await api.post(`/recurring-instances/${instanceId}/skip`, { reason }); return response.data; }, // Cancelar instância cancelInstance: async (instanceId, reason = null) => { const response = await api.post(`/recurring-instances/${instanceId}/cancel`, { reason }); return response.data; }, // Atualizar instância individual updateInstance: async (instanceId, data) => { const response = await api.put(`/recurring-instances/${instanceId}`, data); return response.data; }, // Regenerar instâncias para todos os templates ativos regenerateAll: async () => { const response = await api.post('/recurring/regenerate-all'); return response.data; }, }; // ============================================ // Business Settings Services (Configurações de Negócio - Markup) // ============================================ export const businessSettingService = { // Listar todas as configurações getAll: async () => { const response = await api.get('/business-settings'); return response.data; }, // Obter configuração padrão ativa getDefault: async () => { const response = await api.get('/business-settings/default'); return response.data; }, // Obter uma configuração específica getById: async (id) => { const response = await api.get(`/business-settings/${id}`); return response.data; }, // Criar nova configuração create: async (data) => { const response = await api.post('/business-settings', data); return response.data; }, // Atualizar configuração update: async (id, data) => { const response = await api.put(`/business-settings/${id}`, data); return response.data; }, // Excluir configuração delete: async (id) => { const response = await api.delete(`/business-settings/${id}`); return response.data; }, // Recalcular markup recalculateMarkup: async (id) => { const response = await api.post(`/business-settings/${id}/recalculate-markup`); return response.data; }, // Simular preço de venda simulatePrice: async (id, cmv) => { const response = await api.post(`/business-settings/${id}/simulate-price`, { cmv }); return response.data; }, }; // ============================================ // Product Sheet Services (Fichas Técnicas - CMV) // ============================================ export const productSheetService = { // Listar todas as fichas getAll: async (params = {}) => { const response = await api.get('/product-sheets', { params }); return response.data; }, // Obter uma ficha específica getById: async (id) => { const response = await api.get(`/product-sheets/${id}`); return response.data; }, // Criar nova ficha create: async (data) => { const response = await api.post('/product-sheets', data); return response.data; }, // Atualizar ficha update: async (id, data) => { const response = await api.put(`/product-sheets/${id}`, data); return response.data; }, // Excluir ficha delete: async (id) => { const response = await api.delete(`/product-sheets/${id}`); return response.data; }, // Adicionar item à ficha addItem: async (sheetId, itemData) => { const response = await api.post(`/product-sheets/${sheetId}/items`, itemData); return response.data; }, // Atualizar item da ficha updateItem: async (sheetId, itemId, itemData) => { const response = await api.put(`/product-sheets/${sheetId}/items/${itemId}`, itemData); return response.data; }, // Remover item da ficha removeItem: async (sheetId, itemId) => { const response = await api.delete(`/product-sheets/${sheetId}/items/${itemId}`); return response.data; }, // Recalcular preço de venda recalculatePrice: async (id, businessSettingId = null) => { const response = await api.post(`/product-sheets/${id}/recalculate-price`, { business_setting_id: businessSettingId, }); return response.data; }, // Duplicar ficha duplicate: async (id) => { const response = await api.post(`/product-sheets/${id}/duplicate`); return response.data; }, // Listar categorias getCategories: async () => { const response = await api.get('/product-sheets/categories'); return response.data; }, // Listar tipos de componentes getItemTypes: async () => { const response = await api.get('/product-sheets/item-types'); return response.data; }, }; // ============================================ // Fichas Técnicas de Serviços (Service Sheets) // ============================================ export const serviceSheetService = { // Listar todas as fichas de serviço getAll: async (params = {}) => { const response = await api.get('/service-sheets', { params }); return response.data; }, // Obter uma ficha específica get: async (id) => { const response = await api.get(`/service-sheets/${id}`); return response.data; }, // Criar nova ficha create: async (data) => { const response = await api.post('/service-sheets', data); return response.data; }, // Atualizar ficha update: async (id, data) => { const response = await api.put(`/service-sheets/${id}`, data); return response.data; }, // Excluir ficha delete: async (id) => { const response = await api.delete(`/service-sheets/${id}`); return response.data; }, // Adicionar item/insumo à ficha addItem: async (sheetId, itemData) => { const response = await api.post(`/service-sheets/${sheetId}/items`, itemData); return response.data; }, // Atualizar item da ficha updateItem: async (sheetId, itemId, itemData) => { const response = await api.put(`/service-sheets/${sheetId}/items/${itemId}`, itemData); return response.data; }, // Remover item da ficha removeItem: async (sheetId, itemId) => { const response = await api.delete(`/service-sheets/${sheetId}/items/${itemId}`); return response.data; }, // Duplicar ficha duplicate: async (id) => { const response = await api.post(`/service-sheets/${id}/duplicate`); return response.data; }, // Listar categorias getCategories: async () => { const response = await api.get('/service-sheets/categories'); return response.data; }, // Listar tipos de itens getItemTypes: async () => { const response = await api.get('/service-sheets/item-types'); return response.data; }, // Simular preço simulate: async (data) => { const response = await api.post('/service-sheets/simulate', data); return response.data; }, }; // ============================================ // Campanhas Promocionais (Promotional Campaigns) // ============================================ export const campaignService = { // Listar todas as campanhas getAll: async (params = {}) => { const response = await api.get('/campaigns', { params }); return response.data; }, // Obter uma campanha específica getById: async (id) => { const response = await api.get(`/campaigns/${id}`); return response.data; }, // Criar nova campanha create: async (data) => { const response = await api.post('/campaigns', data); return response.data; }, // Atualizar campanha update: async (id, data) => { const response = await api.put(`/campaigns/${id}`, data); return response.data; }, // Excluir campanha delete: async (id) => { const response = await api.delete(`/campaigns/${id}`); return response.data; }, // Duplicar campanha duplicate: async (id) => { const response = await api.post(`/campaigns/${id}/duplicate`); return response.data; }, // Adicionar produtos à campanha addProducts: async (campaignId, productIds) => { const response = await api.post(`/campaigns/${campaignId}/products`, { product_ids: productIds, }); return response.data; }, // Remover produtos da campanha removeProducts: async (campaignId, productIds) => { const response = await api.delete(`/campaigns/${campaignId}/products`, { data: { product_ids: productIds }, }); return response.data; }, // Atualizar desconto de um produto na campanha updateProductDiscount: async (campaignId, productId, discountData) => { const response = await api.put( `/campaigns/${campaignId}/products/${productId}`, discountData ); return response.data; }, // Obter presets disponíveis getPresets: async () => { const response = await api.get('/campaigns/presets'); return response.data; }, // Preview de preços com desconto preview: async (data) => { const response = await api.post('/campaigns/preview', data); return response.data; }, }; // ============================================ // Financial Goals (Metas Financieras) // ============================================ export const financialGoalService = { // Listar todas las metas getAll: async (params = {}) => { const response = await api.get('/financial-goals', { params }); return response.data; }, // Obtener una meta específica getById: async (id) => { const response = await api.get(`/financial-goals/${id}`); return response.data; }, // Crear nueva meta create: async (data) => { const response = await api.post('/financial-goals', data); return response.data; }, // Actualizar meta update: async (id, data) => { const response = await api.put(`/financial-goals/${id}`, data); return response.data; }, // Eliminar meta delete: async (id) => { const response = await api.delete(`/financial-goals/${id}`); return response.data; }, // Añadir contribución addContribution: async (goalId, data) => { const response = await api.post(`/financial-goals/${goalId}/contributions`, data); return response.data; }, // Eliminar contribución removeContribution: async (goalId, contributionId) => { const response = await api.delete(`/financial-goals/${goalId}/contributions/${contributionId}`); return response.data; }, }; // ============================================ // Budgets (Presupuestos) // ============================================ export const budgetService = { // Listar presupuestos de un período getAll: async (params = {}) => { const response = await api.get('/budgets', { params }); return response.data; }, // Obtener un presupuesto específico getById: async (id) => { const response = await api.get(`/budgets/${id}`); return response.data; }, // Crear nuevo presupuesto create: async (data) => { const response = await api.post('/budgets', data); return response.data; }, // Actualizar presupuesto update: async (id, data) => { const response = await api.put(`/budgets/${id}`, data); return response.data; }, // Eliminar presupuesto delete: async (id) => { const response = await api.delete(`/budgets/${id}`); return response.data; }, // Obtener categorías disponibles getAvailableCategories: async (params = {}) => { const response = await api.get('/budgets/available-categories', { params }); return response.data; }, // Copiar al próximo mes copyToNextMonth: async (year, month) => { const response = await api.post('/budgets/copy-to-next-month', { year, month }); return response.data; }, // Resumen anual getYearSummary: async (params = {}) => { const response = await api.get('/budgets/year-summary', { params }); return response.data; }, }; // ============================================ // Reports (Reportes) // ============================================ export const reportService = { // Resumen general getSummary: async (params = {}) => { const response = await api.get('/reports/summary', { params }); return response.data; }, // Resumen ejecutivo getExecutiveSummary: async (params = {}) => { const response = await api.get('/reports/executive-summary', { params }); return response.data; }, // Por categoría getByCategory: async (params = {}) => { const response = await api.get('/reports/by-category', { params }); return response.data; }, // Por centro de costos getByCostCenter: async (params = {}) => { const response = await api.get('/reports/by-cost-center', { params }); return response.data; }, // Evolución mensual getMonthlyEvolution: async (params = {}) => { const response = await api.get('/reports/monthly-evolution', { params }); return response.data; }, // Por día de la semana getByDayOfWeek: async (params = {}) => { const response = await api.get('/reports/by-day-of-week', { params }); return response.data; }, // Top gastos getTopExpenses: async (params = {}) => { const response = await api.get('/reports/top-expenses', { params }); return response.data; }, // Comparar períodos comparePeriods: async (params = {}) => { const response = await api.get('/reports/compare-periods', { params }); return response.data; }, // Reporte de cuentas getAccountsReport: async () => { const response = await api.get('/reports/accounts'); return response.data; }, // Proyección getProjection: async (params = {}) => { const response = await api.get('/reports/projection', { params }); return response.data; }, // Gráfico de projeção de saldo getProjectionChart: async (params = {}) => { const response = await api.get('/reports/projection-chart', { params }); return response.data; }, // Reporte de recurrentes getRecurringReport: async () => { const response = await api.get('/reports/recurring'); return response.data; }, // Reporte de pasivos/deudas getLiabilities: async () => { const response = await api.get('/reports/liabilities'); return response.data; }, // Transacciones futuras getFutureTransactions: async (params = {}) => { const response = await api.get('/reports/future-transactions', { params }); return response.data; }, // Transacciones vencidas getOverdue: async () => { const response = await api.get('/reports/overdue'); return response.data; }, }; // ============================================ // Financial Health (Salud Financiera) // ============================================ export const financialHealthService = { // Obtener salud financiera completa get: async () => { const response = await api.get('/financial-health'); return response.data; }, // Historial de puntuación getHistory: async (params = {}) => { const response = await api.get('/financial-health/history', { params }); return response.data; }, }; // ============================================ // User Preferences (Preferências do Usuário) // ============================================ export const preferencesService = { // Obter preferências get: async () => { const response = await api.get('/preferences'); return response.data; }, // Atualizar preferências update: async (data) => { const response = await api.put('/preferences', data); return response.data; }, // Enviar notificação de teste testNotification: async () => { const response = await api.post('/preferences/test-notification'); return response.data; }, }; // ============================================ // Profile Service (Perfil do Usuário) // ============================================ export const profileService = { // Obter dados do usuário get: async () => { const response = await api.get('/me'); return response.data; }, // Atualizar perfil (nome, email, senha) update: async (data) => { const response = await api.put('/profile', data); // Atualizar localStorage se sucesso if (response.data.success && response.data.data?.user) { localStorage.setItem('user', JSON.stringify(response.data.data.user)); } return response.data; }, }; export default api;