import { useEffect, useState } from 'react'; import { Link } from 'react-router'; import { useAuth } from '../auth/AuthContext'; import { Alert, LoadingBlock, errorMessage } from '../components/Feedback'; import { Icon } from '../components/Icon'; import { getHealth } from '../lib/api'; import type { HealthResponse } from '../lib/api'; import { getDashboardSummaryF4 } from '../lib/dashboardF4Api'; import type { DashboardSummaryF4 } from '../lib/dashboardF4Api'; import { actionLabel, formatDate, formatDateOnly } from '../lib/format'; function todayDate(): string { const now = new Date(); const local = new Date(now.getTime() - now.getTimezoneOffset() * 60_000); return local.toISOString().slice(0, 10); } export function DashboardPage() { const { user, hasPermission } = useAuth(); const [summary, setSummary] = useState(null); const [health, setHealth] = useState(null); const [error, setError] = useState(''); useEffect(() => { Promise.all([getDashboardSummaryF4(), getHealth()]) .then(([dashboard, service]) => { setSummary(dashboard); setHealth(service); }) .catch((requestError) => setError(errorMessage(requestError))); }, []); return
RESUMEN OPERATIVO

Buen día, {user?.firstName}

Lo que requiere atención en Inspecciones, Actas, verificaciones e Informes.

{health?.status === 'ok' ? 'Sistema operativo' : 'Verificando sistema'}
{error && {error}} {!summary ? : <>
HOY

Qué requiere atención

INSPECCIONES PLANIFICADAS{summary.counts.plannedInspections}Pendientes de iniciar
VERIFICACIONES VENCIDAS{summary.counts.overdueControls}Hallazgos que requieren control técnico
ACTAS EN SEGUIMIENTO{summary.counts.actsInFollowUp}Respuestas, compromisos y regularización
ACTAS SIN INFORME{summary.counts.sealedActsWithoutReport}Actas selladas que todavía no tienen Informe
INVENTARIOS Y DOCUMENTOS

Estado general

INVENTARIO REAL{summary.counts.totalAssets}Instancias físicas registradas
SIN UBICACIÓN{summary.counts.assetsWithoutGeometry}Inventarios reales sin geometría
INFORMES EN PREPARACIÓN{summary.counts.reportsWorking}Informe creado, todavía no oficializado · {summary.counts.reportsOfficialized} oficializados
PRÓXIMAS VERIFICACIONES{summary.counts.controlsNext30Days}{summary.counts.findingsWithoutControlDate} Hallazgos abiertos sin fecha de control
{hasPermission('inspection_findings.read') &&
AGENDA TÉCNICA

Próximos controles

Hallazgos abiertos con una fecha de verificación definida. Este seguimiento técnico permite verificar regularización y detectar reincidencias.

Planificar verificaciones
{summary.upcomingControls.length === 0 &&

Todavía no hay controles programados.

} {summary.upcomingControls.map((control) =>
{control.title}

{control.assetCode} · {control.assetName} · {control.actCode}

)}
}
ACTIVIDAD DE CAMPO

Últimas actividades de los inspectores

Acciones operativas realizadas por inspectores asignados.

{summary.recentInspectorActivity.length === 0 ?

Todavía no hay actividad operativa de inspectores registrada.

: summary.recentInspectorActivity.map((event) =>
{actionLabel(event.action)}

{event.actorUsername ?? 'Inspector'}{event.entityType ? ` · ${event.entityType}` : ''}

)}
ACCESOS RÁPIDOS

Administración

InventariosInstancias reales organizadas por empresa, área y jerarquía {hasPermission('asset_types.read') && Configuración de InventariosJerarquía, tipos y campos configurables} {hasPermission('finding_catalog.manage') && Catálogo de hallazgosHallazgos aplicables según el tipo de Subinstalación} {hasPermission('users.read') && UsuariosAccesos y roles}
API {health?.version ?? '—'} · Base {health?.database === 'ok' ? 'operativa' : 'sin verificar'}
}
; }