import { McpToolProvider, McpToolDefinition, McpToolHandler, McpContext, } from '../interfaces'; /** * Financial Tools Service * Provides MCP tools for financial reporting and analysis. * Used by: ADMIN role only */ export class FinancialToolsService implements McpToolProvider { getTools(): McpToolDefinition[] { return [ { name: 'get_financial_report', description: 'Genera reporte financiero (ingresos, gastos, utilidad)', category: 'financial', parameters: { type: 'object', properties: { type: { type: 'string', enum: ['income', 'expenses', 'profit', 'summary'], description: 'Tipo de reporte', default: 'summary', }, start_date: { type: 'string', format: 'date', description: 'Fecha inicial', }, end_date: { type: 'string', format: 'date', description: 'Fecha final', }, branch_id: { type: 'string', format: 'uuid', description: 'Filtrar por sucursal', }, }, required: ['type'], }, returns: { type: 'object' }, }, { name: 'get_accounts_receivable', description: 'Obtiene cuentas por cobrar (clientes que deben)', category: 'financial', parameters: { type: 'object', properties: { status: { type: 'string', enum: ['all', 'current', 'overdue'], default: 'all', }, min_amount: { type: 'number' }, limit: { type: 'number', default: 50 }, }, }, returns: { type: 'object', properties: { total: { type: 'number' }, count: { type: 'number' }, accounts: { type: 'array' }, }, }, }, { name: 'get_accounts_payable', description: 'Obtiene cuentas por pagar (deudas a proveedores)', category: 'financial', parameters: { type: 'object', properties: { status: { type: 'string', enum: ['all', 'current', 'overdue'], default: 'all', }, due_date_before: { type: 'string', format: 'date' }, limit: { type: 'number', default: 50 }, }, }, returns: { type: 'object', properties: { total: { type: 'number' }, count: { type: 'number' }, accounts: { type: 'array' }, }, }, }, { name: 'get_cash_flow', description: 'Analiza flujo de caja (entradas y salidas)', category: 'financial', parameters: { type: 'object', properties: { period: { type: 'string', enum: ['week', 'month', 'quarter'], default: 'month', }, branch_id: { type: 'string', format: 'uuid' }, }, }, returns: { type: 'object', properties: { inflows: { type: 'number' }, outflows: { type: 'number' }, net_flow: { type: 'number' }, by_category: { type: 'array' }, }, }, }, { name: 'get_kpis', description: 'Obtiene indicadores clave de desempeno (KPIs)', category: 'financial', parameters: { type: 'object', properties: { period: { type: 'string', enum: ['month', 'quarter', 'year'], default: 'month', }, }, }, returns: { type: 'object', properties: { gross_margin: { type: 'number' }, net_margin: { type: 'number' }, inventory_turnover: { type: 'number' }, avg_collection_days: { type: 'number' }, }, }, }, ]; } getHandler(toolName: string): McpToolHandler | undefined { const handlers: Record = { get_financial_report: this.getFinancialReport.bind(this), get_accounts_receivable: this.getAccountsReceivable.bind(this), get_accounts_payable: this.getAccountsPayable.bind(this), get_cash_flow: this.getCashFlow.bind(this), get_kpis: this.getKPIs.bind(this), }; return handlers[toolName]; } private async getFinancialReport( params: { type: string; start_date?: string; end_date?: string; branch_id?: string }, context: McpContext ): Promise { // TODO: Connect to FinancialService return { type: params.type, period: { start: params.start_date || new Date().toISOString().split('T')[0], end: params.end_date || new Date().toISOString().split('T')[0], }, income: 125000.00, expenses: 85000.00, gross_profit: 40000.00, net_profit: 32000.00, breakdown: { sales: 120000.00, services: 5000.00, cost_of_goods: 65000.00, operating_expenses: 20000.00, taxes: 8000.00, }, message: 'Conectar a FinancialService real', }; } private async getAccountsReceivable( params: { status?: string; min_amount?: number; limit?: number }, context: McpContext ): Promise { // TODO: Connect to AccountsService return { total: 45000.00, count: 12, overdue_total: 15000.00, overdue_count: 4, accounts: [ { customer: 'Cliente A', amount: 5000.00, due_date: '2026-01-20', days_overdue: 5, status: 'overdue', }, { customer: 'Cliente B', amount: 8000.00, due_date: '2026-02-01', days_overdue: 0, status: 'current', }, ].slice(0, params.limit || 50), message: 'Conectar a AccountsService real', }; } private async getAccountsPayable( params: { status?: string; due_date_before?: string; limit?: number }, context: McpContext ): Promise { // TODO: Connect to AccountsService return { total: 32000.00, count: 8, overdue_total: 5000.00, overdue_count: 2, accounts: [ { supplier: 'Proveedor X', amount: 12000.00, due_date: '2026-01-28', status: 'current', }, { supplier: 'Proveedor Y', amount: 5000.00, due_date: '2026-01-15', days_overdue: 10, status: 'overdue', }, ].slice(0, params.limit || 50), message: 'Conectar a AccountsService real', }; } private async getCashFlow( params: { period?: string; branch_id?: string }, context: McpContext ): Promise { // TODO: Connect to FinancialService return { period: params.period || 'month', inflows: 95000.00, outflows: 72000.00, net_flow: 23000.00, opening_balance: 45000.00, closing_balance: 68000.00, by_category: [ { category: 'Ventas', type: 'inflow', amount: 90000.00 }, { category: 'Cobranzas', type: 'inflow', amount: 5000.00 }, { category: 'Compras', type: 'outflow', amount: 55000.00 }, { category: 'Nomina', type: 'outflow', amount: 12000.00 }, { category: 'Gastos operativos', type: 'outflow', amount: 5000.00 }, ], message: 'Conectar a FinancialService real', }; } private async getKPIs( params: { period?: string }, context: McpContext ): Promise { // TODO: Connect to AnalyticsService return { period: params.period || 'month', gross_margin: 32.5, net_margin: 18.2, inventory_turnover: 4.5, avg_collection_days: 28, current_ratio: 1.8, quick_ratio: 1.2, return_on_assets: 12.5, trends: { gross_margin_change: 2.1, net_margin_change: 1.5, }, message: 'Conectar a AnalyticsService real', }; } }