# Fase B3 — Historial y versiones de activos Versión: `0.10.0` ## Objetivo Conservar el estado exacto de cada activo a través del tiempo, sin depender de la auditoría general para reconstruirlo. ## Modelo La tabla append-only `asset_versions` registra una versión completa cuando: - se crea un activo; - cambian su identificación, jerarquía o atributos; - cambia su estado de información; - se crea, reemplaza o retira su geometría. Cada snapshot incluye datos principales, tipo y padre, atributos configurables, geometría GeoJSON, metadatos de captura, actor, origen, request ID y fecha. El evento de auditoría correspondiente conserva además el número de versión generado, permitiendo relacionar ambos registros. La columna `assets.current_version` identifica la versión vigente. La migración genera automáticamente una versión `BASELINE` para cada activo que ya existía al desplegar B3. ## Inmutabilidad El usuario runtime de la API recibe solamente `SELECT` e `INSERT` sobre `asset_versions`. No recibe `UPDATE` ni `DELETE`. Una versión guardada no puede ser reescrita por la aplicación. ## API - `GET /api/v3/asset-versions`: historial global paginado y filtrable; - `GET /api/v3/assets/:id/versions`: línea de tiempo de un activo; - `GET /api/v3/assets/:id/versions/:versionNumber`: snapshot exacto. Los filtros globales incluyen búsqueda, tipo, estado, clase de cambio y rango de fechas. ## Seguridad Todas las rutas requieren `assets.read_history`. La migración asigna lectura histórica a `admin`, `director`, `supervisor`, `inspector` y `auditor`. ## Interfaz - la sección **Historial** reemplaza el placeholder y muestra las versiones de todos los activos; - cada activo incluye su propia línea de tiempo; - el visor distingue la versión vigente y muestra datos, atributos, ubicación y el snapshot técnico exacto; - la lista maestra muestra el número de versión vigente. ## Fuera de B3 - restauración automática de versiones anteriores; - fotografías, documentos y evidencias; - importaciones masivas; - relevamiento Android y sincronización offline.