import { useEffect, useState } from 'react'; import { Link, useParams } from 'react-router'; import { DocumentPdfProjection } from '../components/DocumentPdfProjection'; import { Alert, LoadingBlock, errorMessage } from '../components/Feedback'; import { Icon } from '../components/Icon'; import { inspectionActStatusClass, inspectionActStatusLabel, inspectionActVersionEventLabel, } from '../features/inspections/inspectionActPresentation'; import { InspectionClosurePanel } from '../features/inspections/InspectionClosurePanel'; import { InspectionFindingsPanel } from '../features/inspections/InspectionFindingsPanel'; import { getInspectionVisit } from '../lib/api'; import type { InspectionVisit } from '../lib/api'; import { getInspectionActF4, type InspectionActF4 } from '../lib/inspectionActF4Api'; import { formatDate } from '../lib/format'; export function InspectionActEditorPage() { const { actId } = useParams(); const [visit, setVisit] = useState(null); const [act, setAct] = useState(null); const [loading, setLoading] = useState(Boolean(actId)); const [error, setError] = useState(''); useEffect(() => { if (!actId) return; setLoading(true); setError(''); getInspectionActF4(actId) .then(async (value) => { setAct(value); setVisit(await getInspectionVisit(value.visitId)); }) .catch((requestError) => setError(errorMessage(requestError))) .finally(() => setLoading(false)); }, [actId]); if (!actId) { return
Inspecciones/Acta
OPERACIÓN EXCLUSIVA EN APK

Crear acta de inspección

Las actas sólo pueden generarse durante la inspección física desde la aplicación móvil.

Usá la APK con un usuario inspector. El dashboard recibirá el Acta, sus Hallazgos y constancias cuando la aplicación sincronice.

Volver a inspecciones
; } if (loading) return ; const isSealed = act?.status === 'SEALED' || act?.status === 'CLOSED'; return
Inspecciones/{visit && <>{visit.code}/}{act?.code ?? 'Acta'}
ACTA DE INSPECCIÓN · SÓLO LECTURA

{act?.title ?? 'Acta'}

{act ? `${act.code} · versión ${act.currentVersion}` : 'Consulta del documento sincronizado desde la APK.'}

{act && {inspectionActStatusLabel(act.status)}}
{error && {error}} {visit &&

{visit.code} El contenido constatado y los Hallazgos se registran desde la APK. Una vez bloqueada, el Acta ya no vuelve a borrador; la manifestación de empresa puede completarse posteriormente por enlace seguro.

} {act?.report &&

Informe relacionado: {act.report.code}. {act.report.pdfStatus === 'READY' ? 'El documento PDF está disponible.' : 'El contenido está congelado y el PDF continúa pendiente de composición.'}

} {isSealed && act && !act.report &&

Informe pendiente de emisión. El Acta ya está sellada y habilita el circuito documental del INF.

} {act?.status === 'CANCELLED' && Cancelada: {act.cancellationReason}} {act &&
CONTENIDO SINCRONIZADO

{act.code}

Actualizado {formatDate(act.updatedAt)}
Fecha y hora{formatDate(act.occurredAt)}
Título{act.title}
Urgencia{act.urgency === 'URGENT' ? 'Urgente' : 'No urgente'}
Hallazgos{act.findingCount}
DESCRIPCIÓN DE LO ACTUADO

{act.summary}

{act.observations && <>OBSERVACIONES

{act.observations}

}
INVENTARIO DEL ACTA

Referencias congeladas

{act.assets.length}
{act.assets.map((asset) =>
{asset.name}{asset.code} · {asset.typeName}
)}
} {act && } {act && } {act && } {act &&
VERSIONES INMUTABLES

Historial exacto del acta

Cada transición conserva el contenido y las versiones de los registros referenciados.

{act.versions.length}
{act.versions.map((version) =>
v{version.versionNumber}{inspectionActVersionEventLabel(version.event)}{formatDate(version.createdAt)} · {version.actorUsername ?? 'sistema'}
{JSON.stringify(version.snapshot, null, 2)}
)}
}
; }