/** * Compara paso a paso los 3 componentes del cálculo de egresos 612 en Feb 2025: * 1) Query exacto que usa calcularEgresosPorRegimen (con FECHA_RANGO / FECHA_PAGO_RANGO) * 2) Vs el drill-down usando fecha efectiva por fila * Detalle al CFDI para encontrar discrepancias. */ import { prisma, tenantDb } from '../src/config/database.js'; async function main() { const tenant = await prisma.tenant.findFirst({ where: { rfc: 'DESPACHO_MO3NI6U8_B9VGG' }, select: { id: true, databaseName: true } }); if (!tenant) return; const pool = await tenantDb.getPool(tenant.id, tenant.databaseName); const fi = '2025-02-01'; const ff = '2025-02-28'; const contrib = 'd745a915-6a23-4818-944b-a7e1e18e536a'; const reg = '612'; const IMP_TRAS = `COALESCE(iva_traslado_mxn,0) + COALESCE(ieps_traslado_mxn,0) + COALESCE(impuestos_locales_trasladado_mxn,0)`; const IMP_TRAS_PAGO = `COALESCE(iva_traslado_pago_mxn,0) + COALESCE(ieps_traslado_pago_mxn,0)`; const EXCL = `COALESCE((SELECT SUM(COALESCE(cc.importe_mxn,0) - COALESCE(cc.descuento_mxn,0)) FROM cfdi_conceptos cc WHERE cc.cfdi_id = cfdis.id AND cc.clave_prod_serv IN ('84121603','93161608','85101501','85121800')), 0)`; // QUERY 1 FACTURAS (idéntico a calcularEgresosPorRegimen) const f = await pool.query( `SELECT uuid, total_mxn, (${IMP_TRAS}) AS imp, (${EXCL}) AS excl, COALESCE(total_mxn,0) - (${IMP_TRAS}) - (${EXCL}) AS neto, cfdi_tipo_relacion AS rel FROM cfdis WHERE type='RECIBIDO' AND tipo_comprobante='I' AND metodo_pago='PUE' AND status NOT IN ('Cancelado','0') AND fecha_emision >= $1::date AND fecha_emision < ($2::date + interval '1 day') AND regimen_fiscal_receptor = $3 AND contribuyente_id = $4 ORDER BY fecha_emision`, [fi, ff, reg, contrib], ); const sumF = f.rows.reduce((s, r) => s + Number(r.neto), 0); console.log(`FACTURAS I PUE reg=${reg}: n=${f.rows.length} sum_neto=${sumF.toFixed(2)}`); // QUERY 2 PAGOS P const p = await pool.query( `SELECT uuid, monto_pago_mxn, (${IMP_TRAS_PAGO}) AS imp, COALESCE(monto_pago_mxn,0) - (${IMP_TRAS_PAGO}) AS neto, fecha_pago_p, fecha_emision FROM cfdis WHERE type='RECIBIDO' AND tipo_comprobante='P' AND status NOT IN ('Cancelado','0') AND fecha_pago_p >= $1::date AND fecha_pago_p < ($2::date + interval '1 day') AND regimen_fiscal_receptor = $3 AND contribuyente_id = $4 ORDER BY fecha_pago_p`, [fi, ff, reg, contrib], ); const sumP = p.rows.reduce((s, r) => s + Number(r.neto), 0); console.log(`PAGOS P reg=${reg} (fecha_pago_p): n=${p.rows.length} sum_neto=${sumP.toFixed(2)}`); // También probar con fecha_emision del P (alternativo) const pEmis = await pool.query( `SELECT uuid, COALESCE(monto_pago_mxn,0) - (${IMP_TRAS_PAGO}) AS neto, fecha_pago_p, fecha_emision FROM cfdis WHERE type='RECIBIDO' AND tipo_comprobante='P' AND status NOT IN ('Cancelado','0') AND fecha_emision >= $1::date AND fecha_emision < ($2::date + interval '1 day') AND regimen_fiscal_receptor = $3 AND contribuyente_id = $4 ORDER BY fecha_emision`, [fi, ff, reg, contrib], ); const sumPe = pEmis.rows.reduce((s, r) => s + Number(r.neto), 0); console.log(` (alt) PAGOS P filtrados por fecha_emision: n=${pEmis.rows.length} sum_neto=${sumPe.toFixed(2)}`); // QUERY 3 NC const n = await pool.query( `SELECT uuid, total_mxn, (${IMP_TRAS}) AS imp, (${EXCL}) AS excl, COALESCE(total_mxn,0) - (${IMP_TRAS}) - (${EXCL}) AS neto, cfdi_tipo_relacion AS rel FROM cfdis WHERE type='RECIBIDO' AND tipo_comprobante='E' AND metodo_pago='PUE' AND COALESCE(cfdi_tipo_relacion,'') <> '07' AND status NOT IN ('Cancelado','0') AND fecha_emision >= $1::date AND fecha_emision < ($2::date + interval '1 day') AND regimen_fiscal_receptor = $3 AND contribuyente_id = $4`, [fi, ff, reg, contrib], ); const sumN = n.rows.reduce((s, r) => s + Number(r.neto), 0); console.log(`NC E PUE excl 07 reg=${reg}: n=${n.rows.length} sum_neto=${sumN.toFixed(2)}`); console.log(`\nTotal ON-THE-FLY (reg 612): ${(sumF + sumP - sumN).toFixed(2)}`); console.log(`Cache dice: 446180.10`); console.log(`Delta: ${((sumF + sumP - sumN) - 446180.10).toFixed(2)}`); // Detalle de los P para investigar — fecha_emision vs fecha_pago_p console.log(`\nDetalle PAGOS P (filtrados por fecha_pago_p):`); for (const r of p.rows) { console.log(` ${r.uuid.substring(0,8)} monto=${Number(r.monto_pago_mxn).toFixed(2)} neto=${Number(r.neto).toFixed(2)} fecha_pago_p=${r.fecha_pago_p?.toISOString?.()?.slice(0,10)} fecha_emision=${r.fecha_emision?.toISOString?.()?.slice(0,10)}`); } await prisma.$disconnect(); } main().catch(async e => { console.error(e); await prisma.$disconnect().catch(() => {}); process.exit(1); });