feat(sat): factura global + fecha_efectiva, fallback tenant-contribuyente, fix anio_global typo
Factura Global & fecha_efectiva: - Migracion 045_factura_global.sql: periodicidad, meses_global, año_global, fecha_efectiva - sat-parser.service.ts: extrae InformacionGlobal del XML - sat.service.ts: calcFechaEfectiva con soporte bimestral (periodicidad 05) - metricas-compute, dashboard, impuestos, cfdi, export, conciliacion, alertas: reemplaza fecha_emision-1h por COALESCE(fecha_efectiva, fecha_emision-1h) - Script recalc-metricas.ts para recalculo manual Fallback datos fiscales tenant → contribuyente: - contribuyente.service.ts: fetchTenantFiscalData + mergeContribuyenteWithTenant rellena regimenFiscal, codigoPostal y domicilio cuando el contribuyente tiene el mismo RFC que el tenant y sus campos estan vacios - contribuyente.controller.ts y contribuyente-config.controller.ts: pasan req.user!.tenantId al servicio Fix critico SAT sync: - sat.service.ts: anio_global → año_global en INSERT/UPDATE de CFDIs (la migracion creo 'año_global' con tilde; el codigo usaba 'anio_global', causando fallo en 100% de inserciones de CFDI) - determineChunkMonths: salta sondeo si existe job previo con requestIds - MAX_POLL_ATTEMPTS: 45 → 500 (~8h) para syncs iniciales grandes Docs: - docs/sessions/2026-05-22-factura-global-contribuyente-fallback.md
This commit is contained in:
@@ -176,7 +176,7 @@ async function alertaRiesgoCancelaciones(pool: Pool, contribuyenteId?: string |
|
||||
COUNT(*)::int as total,
|
||||
COUNT(CASE WHEN status IN ('Cancelado', '0') THEN 1 END)::int as cancelados
|
||||
FROM cfdis
|
||||
WHERE fecha_emision >= $1::date
|
||||
WHERE (fecha_emision - interval '1 hour') >= $1::date
|
||||
${cf}
|
||||
`, [fechaDesde]);
|
||||
|
||||
@@ -359,7 +359,7 @@ async function alertaCancelacionPeriodoAnterior(pool: Pool, contribuyenteId?: st
|
||||
FROM cfdis
|
||||
WHERE status IN ('Cancelado', '0')
|
||||
AND fecha_cancelacion >= $1::date
|
||||
AND fecha_emision < $1::date
|
||||
AND COALESCE(fecha_efectiva, fecha_emision - interval '1 hour') < $1::date
|
||||
${cf}
|
||||
`, [inicioMes]);
|
||||
|
||||
@@ -529,7 +529,7 @@ async function alertaResicoPfLimiteIngresos(
|
||||
FROM cfdis
|
||||
WHERE type = 'EMITIDO'
|
||||
AND status NOT IN ('Cancelado', '0')
|
||||
AND EXTRACT(YEAR FROM fecha_emision) = $1
|
||||
AND EXTRACT(YEAR FROM COALESCE(fecha_efectiva, fecha_emision - interval '1 hour')) = $1
|
||||
AND contribuyente_id = $2
|
||||
`, [año, safeId]);
|
||||
|
||||
@@ -659,8 +659,8 @@ export async function getDiscrepanciasPorMes(
|
||||
|
||||
const { rows } = await pool.query(`
|
||||
SELECT
|
||||
EXTRACT(YEAR FROM fecha_emision)::int as año,
|
||||
EXTRACT(MONTH FROM fecha_emision)::int as mes,
|
||||
EXTRACT(YEAR FROM COALESCE(fecha_efectiva, fecha_emision - interval '1 hour'))::int as año,
|
||||
EXTRACT(MONTH FROM COALESCE(fecha_efectiva, fecha_emision - interval '1 hour'))::int as mes,
|
||||
COUNT(*)::int as count
|
||||
FROM cfdis
|
||||
WHERE type = 'RECIBIDO' AND ${VIGENTE}
|
||||
|
||||
Reference in New Issue
Block a user