Files
HoruxDespachosNuevo/apps/api/scripts/test-proxy-sync.ts
Horux Dev 099f34c903 feat(sat): reporte diario de errores SAT por proxy
- Agrega tabla sat_proxy_errors con proxy_usado, error_code, stage, message.
- sat-client.service.ts expone proxyInfo usado en cada conexión SAT.
- sat.service.ts registra errores de bloqueo/devolución del SAT en sat_proxy_errors
  y guarda proxyUsed en sat_sync_jobs.
- Nuevo job sat-proxy-report.job.ts: cron 8 AM CDMX, envía email a ADMIN_EMAIL
  con errores de las últimas 24h agrupados por proxy/error_code.
- Template de email sat-proxy-report.ts y método sendSatProxyReport.
- Registra el cron en src/index.ts.
- Actualiza docs/SAT-SYNC-IMPLEMENTATION.md.
2026-08-03 14:27:19 +00:00

72 lines
2.4 KiB
TypeScript

import 'dotenv/config';
import { prisma } from '../src/config/database.js';
import { startSync } from '../src/services/sat/sat.service.js';
const TENANT_ID = 'bcffc3ce-e5f5-4a66-b6bf-28da47bf7a41';
const CONTRIBUYENTE_ID = '75a26067-66b2-4b5c-9dde-9ecc628a1e03';
function getYesterdayEndCDMX(): Date {
const now = new Date();
return new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() - 1, 12, 0, 0));
}
function getThreeDaysAgoStartCDMX(): Date {
const yesterday = getYesterdayEndCDMX();
return new Date(Date.UTC(yesterday.getUTCFullYear(), yesterday.getUTCMonth(), yesterday.getUTCDate() - 2, 0, 0, 0));
}
async function sleep(ms: number) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function main() {
const dateFrom = getThreeDaysAgoStartCDMX();
const dateTo = getYesterdayEndCDMX();
console.log('[Proxy Test] Iniciando sync con proxy para Miguel Angel Romero Estrada');
console.log(`[Proxy Test] RFC: ROEM691011EZ4`);
console.log(`[Proxy Test] Rango: ${dateFrom.toISOString()}${dateTo.toISOString()}`);
const jobId = await startSync(TENANT_ID, 'daily', dateFrom, dateTo, CONTRIBUYENTE_ID);
console.log(`[Proxy Test] Job creado: ${jobId}`);
let previousStatus: string | null = null;
while (true) {
const job = await prisma.satSyncJob.findUnique({ where: { id: jobId } });
if (!job) {
console.log('[Proxy Test] Job no encontrado');
process.exit(1);
}
const statusLine = `[Proxy Test] Status: ${job.status} | found=${job.cfdisFound} downloaded=${job.cfdisDownloaded} inserted=${job.cfdisInserted} updated=${job.cfdisUpdated} progress=${job.progressPercent}% | error=${job.errorMessage || 'none'}`;
if (job.status !== previousStatus) {
console.log(statusLine);
previousStatus = job.status;
} else {
process.stdout.write('.');
}
if (job.status === 'completed' || job.status === 'failed') {
console.log('\n[Proxy Test] Resultado final:');
console.log(JSON.stringify({
id: job.id,
status: job.status,
cfdisFound: job.cfdisFound,
cfdisDownloaded: job.cfdisDownloaded,
cfdisInserted: job.cfdisInserted,
cfdisUpdated: job.cfdisUpdated,
errorMessage: job.errorMessage,
completedAt: job.completedAt,
}, null, 2));
break;
}
await sleep(15000);
}
}
main().catch(err => {
console.error('[Proxy Test] Error:', err);
process.exit(1);
});