/** * Simula el drill-down bucket=ingresos para un contribuyente/mes y muestra * cada CFDI que aparecería en el drill. Permite comparar con el total del * dashboard. */ import { prisma, tenantDb } from '../src/config/database.js'; import { resolveContribuyenteContext } from '../src/utils/contribuyente-context.js'; const tenantRfc = process.argv[2] || 'DESPACHO_MO3NI6U8_B9VGG'; const contribuyenteId = process.argv[3] || 'b3761db6-0b8d-4251-8078-4ddc31e9c75b'; const yearMonth = process.argv[4] || '2025-05'; const GRUPO_PF_EMPRESARIAL = ['606', '612', '621', '625', '626']; const GRUPO_PM_OTROS = ['601', '603', '607', '608', '610', '611', '614', '615', '620', '622', '623', '624']; async function main() { const tenant = await prisma.tenant.findFirst({ where: { rfc: tenantRfc }, select: { id: true, databaseName: true } }); if (!tenant) return; const pool = await tenantDb.getPool(tenant.id, tenant.databaseName); const [anio, mes] = yearMonth.split('-').map(Number); const lastDay = new Date(anio, mes, 0).getDate(); const fi = `${yearMonth}-01`; const ff = `${yearMonth}-${String(lastDay).padStart(2, '0')}`; const ctx = await resolveContribuyenteContext(pool, tenant.id, contribuyenteId); const esEmisor = ctx.esEmisor; const esReceptor = ctx.esReceptor; const g1 = GRUPO_PF_EMPRESARIAL.map(r => `'${r}'`).join(','); const g3 = GRUPO_PM_OTROS.map(r => `'${r}'`).join(','); const FECHA_EFECTIVA = `CASE WHEN tipo_comprobante = 'P' THEN fecha_pago_p ELSE fecha_emision END`; // Query idéntico al drill-down bucket=ingresos const { rows } = await pool.query( `SELECT uuid, tipo_comprobante, metodo_pago, regimen_fiscal_emisor, regimen_fiscal_receptor, cfdi_tipo_relacion, total_mxn, monto_pago_mxn, fecha_emision, fecha_pago_p FROM cfdis WHERE 1=1 AND ( ( ${esEmisor} AND regimen_fiscal_emisor IN (${g1}) AND ( (tipo_comprobante = 'I' AND metodo_pago = 'PUE') OR tipo_comprobante = 'P' OR (tipo_comprobante = 'E' AND metodo_pago = 'PUE' AND COALESCE(cfdi_tipo_relacion, '') <> '07') ) ) OR ( ${esReceptor} AND tipo_comprobante = 'N' AND metodo_pago = 'PUE' AND regimen_fiscal_receptor = '605' ) OR ( ${esEmisor} AND regimen_fiscal_emisor IN (${g3}) AND ( (tipo_comprobante = 'I' AND metodo_pago IN ('PUE','PPD')) OR (tipo_comprobante = 'E' AND metodo_pago = 'PUE') ) ) ) AND status NOT IN ('Cancelado','0') AND ${FECHA_EFECTIVA} >= $1::date AND ${FECHA_EFECTIVA} < ($2::date + interval '1 day') ORDER BY ${FECHA_EFECTIVA}`, [fi, ff], ); console.log(`\n=== Drill bucket=ingresos ${yearMonth} contrib=${ctx.rfc} ===`); console.log(`Filas: ${rows.length}\n`); let sumTotal = 0, sumPago = 0; for (const r of rows) { console.log(` ${r.uuid.substring(0,8)} ${r.tipo_comprobante}${r.metodo_pago ? '/' + r.metodo_pago : ''}${r.cfdi_tipo_relacion ? ' rel=' + r.cfdi_tipo_relacion : ''} reg=${r.regimen_fiscal_emisor || r.regimen_fiscal_receptor} total=${Number(r.total_mxn || 0).toFixed(2)} pago=${Number(r.monto_pago_mxn || 0).toFixed(2)}`); sumTotal += Number(r.total_mxn || 0); sumPago += Number(r.monto_pago_mxn || 0); } console.log(`\nSuma total_mxn (bruto drill): ${sumTotal.toFixed(2)}`); console.log(`Suma monto_pago_mxn: ${sumPago.toFixed(2)}`); console.log(`(Total bruto cuenta I + E a total, y P a monto_pago)`); await prisma.$disconnect(); } main().catch(async e => { console.error(e); await prisma.$disconnect().catch(() => {}); process.exit(1); });