Skip to content

Plataforma técnica · Nostromo

Sevastopol ETL Island

Islands Nostromo ETL

EtlViewIsland es la única UI del frontend para disparar loaders de Nostromo. Vive en admin/ (mismo módulo que el resto del workspace SUPER_ADMIN) y consume directamente /api/etl/* del Orchestrator. No hay tenant ni período del workspace involucrado — los loaders operan a nivel de plataforma sobre la base maestra.

La island sostiene un historial in-memory de los últimos 10 runs disparados desde esa sesión, con polling automático cada 3s sobre los running.

DecisiónMotivo
5 scripts hardcoded en AVAILABLE_SCRIPTSEl catálogo cambia con baja frecuencia y se versiona junto con el backend. Hardcoded simplifica vs. carga dinámica.
Período YYYY-MM con default mes actualgetCurrentPeriod() autocompleta — el caso típico es cargar el mes en curso.
Selector visual de script (grid de cards)Cada script lleva ícono + descripción para identificación rápida. El click selecciona; el dispatch es botón aparte.
Modo BC: month (default) o customToggle entre rango derivado del período o fechaInicio/fechaFin explícitos. Útil para backfill no-mensual.
impuesto_2cat: periodoTipo + utm opcionalmensual es el default operacional; all regenera todos los tramos (mensual/quincenal/semanal/diario). UTM vacío exige que exista en parametros.indicadores.
Moneda BC con default ALLCubre el caso común (UF + USD + EUR juntos). Override solo si se debugea uno.
Polling cada 3s solo si hay runs runningensurePolling arranca el intervalo cuando runningCount() > 0; se detiene al terminar. Sin runs activos, sin tráfico.
Historial limitado a 10 entradasBuffer de la sesión. Para auditoría de largo plazo el operador consulta logs server-side.
Validación de fechas en clientefechaInicio > fechaFin se rechaza antes del POST. Evita rebote del backend.
Toast diferenciado por estadocompleted → success; failed con timedOut → “timeout”; failed con exit code → "exit {N}". El operador entiende inmediatamente qué pasó.
Sin useActiveTenant ni useActivePeriodEl ETL no es per-tenant — escribe en parametros.* (global) o en bases de tenants identificados por archivo (run_cargas_sii).
IDNombrePeríodo requeridoFlags adicionales
sii_loaderSII Loader
previred_loaderPrevired Loader
correccion_monetariaCorrección Monetaria
banco_central_loaderBanco Central Loadermoneda, fechaInicio/fechaFin opcionales
impuesto_2cat_loaderImpuesto 2ª Categoría LoaderperiodoTipo, utm opcional
EstadoUI
runningPill ámbar, polling activo.
completedPill verde + toast success.
failedPill rojo + toast con razón (timeout o exit code).
unknownPID no encontrado en registry — toast informativo.
const POLL_INTERVAL_MS = 3000;
createEffect(() => {
if (runningCount() > 0) ensurePolling();
});
onCleanup(() => {
if (pollTimer) clearInterval(pollTimer);
});

refreshExecution(pid) actualiza endedAt, exitCode, errorTail, timedOut desde /api/etl/status/:pid. La UI re-renderiza por reactividad del signal executions.

Método + rutaUso
POST /api/etl/triggerDispara el loader. Body: { script, period, year, month, periodoTipo?, utm?, fechaInicio?, fechaFin?, moneda? }.
GET /api/etl/status/:pidEstado del run. Poleado cada 3s mientras esté running.
{
"script": "banco_central_loader",
"period": "2026-05",
"year": "2026",
"month": "05",
"fechaInicio": "2026-05-01",
"fechaFin": "2026-05-31",
"moneda": "UF"
}

fechaInicio/fechaFin solo se envían si bcRangeMode === "custom". moneda solo si no es ALL.

{
"script": "impuesto_2cat_loader",
"period": "2026-05",
"year": "2026",
"month": "05",
"periodoTipo": "mensual",
"utm": "67890.50"
}

utm solo si está provisto explícitamente. Si vacío, el controller valida que exista en parametros.indicadores.

sevastopol/src/components/islands/admin/EtlViewIsland.tsx — 566 líneas, una sola island con ToastProvider envolvente.