102 lines
4.9 KiB
TypeScript
102 lines
4.9 KiB
TypeScript
/**
|
|
* 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); });
|