feat: facturación primer pago, fixes SAT/MP, autocompletado RFCs/conceptos
Backend: - Notificación email al admin cuando llega primer pago aprobado (sin factura auto) - Endpoints GET /pagos-sin-factura y POST /emitir-factura-pago para admin global - Fix vinculación org Facturapi Horux 360 (69f23a5a242e0af47a41fa0d) - Fix webhook MP: validación defensiva de x-signature header - Fix autocompleto RFCs: eliminado filtro por contribuyenteId - Fix autocompleto conceptos: eliminado filtro por contribuyenteId - SAT fixes: anti-bot CSF scraper, request reuse, date range fix, stale job thresholds - SAT sync request reuse across jobs para evitar agotar cuota diaria - Typo fix MP_ACCESS_TOKEN en .env - Trial invitations system backend Frontend: - Nueva página /admin/facturas-pendientes con tabla y emisión manual - Métrica 'Facturas pendientes' en /clientes (clickable) - Navegación onboarding FIEL/CSD corregida - Sidebar themes sincronizados - Fix SAT portal migration scraper (NetIQ) - Trial invitation acceptance pages
This commit is contained in:
47
scripts/test_auza_sync.js
Normal file
47
scripts/test_auza_sync.js
Normal file
@@ -0,0 +1,47 @@
|
||||
const { startSync, getSyncStatus } = require('/root/HoruxDespachosNuevo/apps/api/dist/services/sat/sat.service.js');
|
||||
|
||||
const TENANT_ID = '81116985-03cd-4843-97ba-05e8be9917c6';
|
||||
const DAYS = 15;
|
||||
|
||||
async function main() {
|
||||
const dateTo = new Date();
|
||||
const dateFrom = new Date(dateTo);
|
||||
dateFrom.setDate(dateFrom.getDate() - DAYS);
|
||||
|
||||
console.log(`[Test] Iniciando sync initial para AUZA640701TI9`);
|
||||
console.log(`[Test] Rango: ${dateFrom.toISOString().slice(0,10)} → ${dateTo.toISOString().slice(0,10)}`);
|
||||
|
||||
try {
|
||||
const jobId = await startSync(TENANT_ID, 'initial', dateFrom, dateTo);
|
||||
console.log(`[Test] Job creado: ${jobId}`);
|
||||
|
||||
// Monitorear progreso
|
||||
let completed = false;
|
||||
let attempts = 0;
|
||||
const maxAttempts = 60; // ~30 minutos (30s * 60)
|
||||
|
||||
while (!completed && attempts < maxAttempts) {
|
||||
await new Promise(r => setTimeout(r, 30000));
|
||||
attempts++;
|
||||
|
||||
const status = await getSyncStatus(TENANT_ID);
|
||||
console.log(`[Test] Intento ${attempts}: status=${status.currentJob?.status || 'none'}, progress=${status.currentJob?.progressPercent ?? 0}%, found=${status.currentJob?.cfdisFound ?? 0}, inserted=${status.currentJob?.cfdisInserted ?? 0}`);
|
||||
|
||||
if (!status.hasActiveSync) {
|
||||
completed = true;
|
||||
console.log(`[Test] Sync finalizado. Último job: ${status.lastCompletedJob?.status || 'N/A'}`);
|
||||
if (status.lastCompletedJob?.errorMessage) {
|
||||
console.log(`[Test] Error: ${status.lastCompletedJob.errorMessage}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!completed) {
|
||||
console.log(`[Test] Timeout después de ${maxAttempts} intentos. El job sigue corriendo.`);
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(`[Test] Error iniciando sync:`, err.message);
|
||||
}
|
||||
}
|
||||
|
||||
main().catch(console.error);
|
||||
Reference in New Issue
Block a user