From 1c92b8eaf183d19767776ce4658014dd59ad129a Mon Sep 17 00:00:00 2001 From: Horux Dev Date: Sat, 16 May 2026 19:16:07 +0000 Subject: [PATCH] fix(sat): muestra extraccion inicial si no hay job initial completado MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problema: el boton 'Sincronizacion inicial (6 aƱos)' desaparecia cuando existia CUALQUIER job completado (daily, incremental, etc.). Esto era inconsistente con el cron incremental del backend, que requiere especificamente un job de tipo 'initial' completado. Resultado: usuarios que solo habian hecho sync diaria perdian la opcion de hacer la extraccion inicial completa, y el cron incremental tampoco corria porque no habia initial. Fix: - Backend getSyncStatus: agrega lastCompletedInitialJob (busca solo jobs type='initial' status='completed') - Frontend SyncStatus: muestra el boton de inicial si !lastCompletedInitialJob (ignora jobs diarios/incrementales) - SatSyncStatusResponse: agrega campo lastCompletedInitialJob --- apps/api/src/services/sat/sat.service.ts | 12 ++++++++++++ apps/web/components/sat/SyncStatus.tsx | 2 +- packages/shared/src/types/sat.ts | 1 + 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/apps/api/src/services/sat/sat.service.ts b/apps/api/src/services/sat/sat.service.ts index a2ff9ac..be99237 100644 --- a/apps/api/src/services/sat/sat.service.ts +++ b/apps/api/src/services/sat/sat.service.ts @@ -1388,6 +1388,7 @@ export async function getSyncStatus(tenantId: string, contribuyenteId?: string): hasActiveSync: boolean; currentJob?: SatSyncJob; lastCompletedJob?: SatSyncJob; + lastCompletedInitialJob?: SatSyncJob; totalCfdisSynced: number; }> { const contribuyenteFilter = contribuyenteId ? { contribuyenteId } : {}; @@ -1410,6 +1411,16 @@ export async function getSyncStatus(tenantId: string, contribuyenteId?: string): orderBy: { completedAt: 'desc' }, }); + const lastCompletedInitial = await prisma.satSyncJob.findFirst({ + where: { + tenantId, + ...contribuyenteFilter, + type: 'initial', + status: 'completed', + }, + orderBy: { completedAt: 'desc' }, + }); + const totals = await prisma.satSyncJob.aggregate({ where: { tenantId, @@ -1447,6 +1458,7 @@ export async function getSyncStatus(tenantId: string, contribuyenteId?: string): hasActiveSync: !!activeJob, currentJob: activeJob ? mapJob(activeJob) : undefined, lastCompletedJob: lastCompleted ? mapJob(lastCompleted) : undefined, + lastCompletedInitialJob: lastCompletedInitial ? mapJob(lastCompletedInitial) : undefined, totalCfdisSynced: totals._sum.cfdisInserted || 0, }; } diff --git a/apps/web/components/sat/SyncStatus.tsx b/apps/web/components/sat/SyncStatus.tsx index c6274c0..35fc249 100644 --- a/apps/web/components/sat/SyncStatus.tsx +++ b/apps/web/components/sat/SyncStatus.tsx @@ -236,7 +236,7 @@ export function SyncStatus({ fielConfigured, onSyncStarted, contribuyenteId }: S - {!status?.lastCompletedJob && ( + {!status?.lastCompletedInitialJob && (