import { SearchableSelect } from '../components/SearchableSelect'; import { useEffect, useState } from 'react'; import type { FormEvent } from 'react'; import { Link, useSearchParams } from 'react-router'; import { Alert, EmptyState, LoadingBlock, errorMessage } from '../components/Feedback'; import { Icon } from '../components/Icon'; import { useOperationalContext } from '../context/OperationalContext'; import { DocumentCenterTabs } from '../features/documents/DocumentCenterTabs'; import { inspectionActStatusClass, inspectionActStatusLabel } from '../features/inspections/inspectionActPresentation'; import { OperationalFilters } from '../features/inspections/OperationalFilters'; import type { PageMeta } from '../lib/api'; import { listInspectionActsGlobalF4, type InspectionActListItemF4, type InspectionActStatusF4, } from '../lib/inspectionActF4Api'; import { formatDate } from '../lib/format'; const statuses: Array<{ value: InspectionActStatusF4 | ''; label: string }> = [ { value: '', label: 'Todos los estados' }, { value: 'DRAFT', label: 'Borrador' }, { value: 'LOCKED', label: 'Bloqueada · esperando manifestación' }, { value: 'SEALED', label: 'Sellada' }, { value: 'CANCELLED', label: 'Cancelada' }, { value: 'READY', label: 'Lista para cerrar · legado' }, { value: 'CLOSED', label: 'Cerrada · legado' }, { value: 'RECTIFIED', label: 'Rectificada · legado' }, ]; function contextLabel(items: Array<{ name: string }>, empty: string): string { if (items.length === 0) return empty; const first = items[0]; if (!first) return empty; if (items.length === 1) return first.name; return `${first.name} +${items.length - 1}`; } export function ActsPage() { const [params, setParams] = useSearchParams(); const operationalContext = useOperationalContext(); const [items, setItems] = useState([]); const [meta, setMeta] = useState({ page: 1, pageSize: 25, total: 0, totalPages: 0 }); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const search = params.get('search') ?? ''; const rawStatus = params.get('status') ?? ''; const status = statuses.some((item) => item.value === rawStatus) ? rawStatus as InspectionActStatusF4 | '' : ''; const year = params.get('year') ?? ''; const companyId = operationalContext.companyId || params.get('companyId') || ''; const areaId = operationalContext.areaId || params.get('areaId') || ''; const inspectorId = params.get('inspectorId') ?? ''; const dateFrom = params.get('dateFrom') ?? ''; const dateTo = params.get('dateTo') ?? ''; const page = Math.max(1, Number(params.get('page') ?? 1) || 1); const [draftSearch, setDraftSearch] = useState(search); useEffect(() => { setLoading(true); setError(''); listInspectionActsGlobalF4({ page, pageSize: 25, search, status, year: year ? Number(year) : '', companyId, areaId, inspectorId, dateFrom, dateTo }) .then((response) => { setItems(response.data); setMeta(response.meta); }) .catch((requestError) => setError(errorMessage(requestError))) .finally(() => setLoading(false)); }, [page, search, status, year, companyId, areaId, inspectorId, dateFrom, dateTo]); const setFilter = (key: string, value: string) => { const next = new URLSearchParams(params); if (key === 'areaId') { operationalContext.setAreaId(value); next.delete('areaId'); next.delete('companyId'); } else if (key === 'companyId') { operationalContext.setCompanyId(value); next.delete('companyId'); } else { value ? next.set(key, value) : next.delete(key); } next.delete('page'); setParams(next); }; const applySearch = (event: FormEvent) => { event.preventDefault(); setFilter('search', draftSearch.trim()); }; const setPage = (value: number) => { const next = new URLSearchParams(params); value > 1 ? next.set('page', String(value)) : next.delete('page'); setParams(next); }; return
CENTRO DOCUMENTAL

Actas

Consulta global de actas con acceso a la inspección, hallazgos, inventario e informe relacionado.

{error && {error}} {loading ? : items.length === 0 ? :
{meta.total} acta{meta.total === 1 ? '' : 's'}Página {page} de {Math.max(meta.totalPages, 1)}
{items.map((act) => )}
ActaEmpresa / áreaInspecciónHallazgosEstadoInforme
{act.code}{act.title} · {formatDate(act.occurredAt)}
{contextLabel(act.companies, 'Empresa sin asignar')}{contextLabel(act.areas, 'Área sin asignar')}
{act.visit.code} {act.findingCount} {inspectionActStatusLabel(act.status)} {act.report ? {act.report.code}{act.report.pdfStatus === 'READY' ? 'PDF disponible' : 'PDF pendiente'} : ['SEALED', 'CLOSED'].includes(act.status) ? Pendiente de emisión : }
{meta.total ? `${(page - 1) * meta.pageSize + 1}–${Math.min(page * meta.pageSize, meta.total)} de ${meta.total}` : '0 resultados'}
}
; }