'use client'; import { useEffect, useState } from 'react'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { getSyncStatus, startSync } from '@/lib/api/sat'; import type { SatSyncStatusResponse } from '@horux/shared'; interface SyncStatusProps { fielConfigured: boolean; onSyncStarted?: () => void; } const statusLabels: Record = { pending: 'Pendiente', running: 'En progreso', completed: 'Completado', failed: 'Fallido', }; const statusColors: Record = { pending: 'bg-yellow-100 text-yellow-800', running: 'bg-blue-100 text-blue-800', completed: 'bg-green-100 text-green-800', failed: 'bg-red-100 text-red-800', }; export function SyncStatus({ fielConfigured, onSyncStarted }: SyncStatusProps) { const [status, setStatus] = useState(null); const [loading, setLoading] = useState(true); const [startingSync, setStartingSync] = useState(false); const [error, setError] = useState(''); const [showCustomDate, setShowCustomDate] = useState(false); const [dateFrom, setDateFrom] = useState(''); const [dateTo, setDateTo] = useState(''); const fetchStatus = async () => { try { const data = await getSyncStatus(); setStatus(data); } catch (err) { console.error('Error fetching sync status:', err); } finally { setLoading(false); } }; useEffect(() => { if (fielConfigured) { fetchStatus(); // Actualizar cada 30 segundos si hay sync activo const interval = setInterval(fetchStatus, 30000); return () => clearInterval(interval); } else { setLoading(false); } }, [fielConfigured]); const handleStartSync = async (type: 'initial' | 'daily', customDates?: boolean) => { setStartingSync(true); setError(''); try { const params: { type: 'initial' | 'daily'; dateFrom?: string; dateTo?: string } = { type }; if (customDates && dateFrom && dateTo) { // Convertir a formato completo con hora params.dateFrom = `${dateFrom}T00:00:00`; params.dateTo = `${dateTo}T23:59:59`; } await startSync(params); await fetchStatus(); setShowCustomDate(false); onSyncStarted?.(); } catch (err: any) { setError(err.response?.data?.error || 'Error al iniciar sincronizacion'); } finally { setStartingSync(false); } }; if (!fielConfigured) { return ( Sincronizacion SAT Configura tu FIEL para habilitar la sincronizacion automatica

La sincronizacion con el SAT requiere una FIEL valida configurada.

); } if (loading) { return ( Sincronizacion SAT

Cargando estado...

); } return ( Sincronizacion SAT Estado de la sincronizacion automatica de CFDIs {status?.hasActiveSync && status.currentJob && (
{statusLabels[status.currentJob.status]} {status.currentJob.type === 'initial' ? 'Sincronizacion inicial' : 'Sincronizacion diaria'}
{status.currentJob.status === 'running' && (
)}

{status.currentJob.cfdisDownloaded} CFDIs descargados

)} {status?.lastCompletedJob && !status.hasActiveSync && (
Ultima sincronizacion exitosa

{new Date(status.lastCompletedJob.completedAt!).toLocaleString('es-MX')}

{status.lastCompletedJob.cfdisInserted} CFDIs nuevos, {status.lastCompletedJob.cfdisUpdated} actualizados

)}

{status?.totalCfdisSynced || 0}

CFDIs sincronizados

3:00 AM

Sincronizacion diaria

{error && (

{error}

)} {/* Formulario de fechas personalizadas */} {showCustomDate && (
setDateFrom(e.target.value)} max={dateTo || undefined} />
setDateTo(e.target.value)} min={dateFrom || undefined} />
)}
{!status?.lastCompletedJob && ( )} ); }