Plataforma técnica · Sevastopol
Manual Panel en Sevastopol
Islands Command Manual Cuentas
Propósito
Section titled “Propósito”ManualPanel no es una island independiente — es un componente lateral que otras islands montan para mostrar el manual contable de una cuenta. La instancia más visible está en ChartOfAccountsViewIsland (panel a la derecha de la tabla), pero cualquier island puede emitir plan-cuentas:select para que esa instancia cargue la cuenta solicitada.
El panel es read-only — la edición vive en PlanCuentasCommandIsland del subdominio.
Decisiones de UX
Section titled “Decisiones de UX”| Decisión | Motivo |
|---|---|
AbortController por carga | Cada cambio de props.account aborta el fetch anterior — evita race conditions cuando el usuario navega rápido entre cuentas. |
loadSequence como id incremental | Doble protección: aunque el AbortController falle, isCurrentLoad descarta resultados de fetches obsoletos antes de hacer setManual. |
| Estados explícitos: idle / loading / ready / empty / error | Cada uno con UI dedicada — el operador siempre sabe qué pasa. 404 se trata como empty, no como error. |
| Estructura del manual: Debe, Haber, NIC, Ejemplos, Asientos, Ver también, Tags | Refleja 1:1 el editor del admin. Solo muestra secciones con contenido (Show when por cada una). |
Renderizado Markdown vía MarkdownView | Debe, Haber y descripción de ejemplos aceptan formato. Asientos tipo se pintan como tabla estructurada. |
Ver también como botones clickeables | Click emite plan-cuentas:select para navegar al manual de la cuenta referenciada — sin acoplar el panel al consumidor. |
| Wrapped vs unwrapped response | El backend puede devolver { manual: {...} } o el objeto directamente. isWrappedManual lo detecta para sostener ambos formatos. |
| Cierre con botón explícito | El consumidor pasa onClose y el panel solo lo invoca — la decisión de cerrar es del padre. |
Estados
Section titled “Estados”| Estado | UI |
|---|---|
idle | Panel oculto (!props.open o sin cuenta). |
loading | ”Cargando manual…” |
empty | ”Esta cuenta aún no tiene manual” (incluye 404). |
error | Banner rojo: “No se pudo cargar el manual de esta cuenta.” |
ready | Render completo del manual. |
Secciones renderizadas
Section titled “Secciones renderizadas”| Sección | Tipo | Condición |
|---|---|---|
| Debe | Markdown | manual.debe no vacío. |
| Haber | Markdown | manual.haber no vacío. |
| NIC-IFRS | Estructurado (Norma + Tratamiento + Referencia) | Alguno de los tres campos presente. |
| Ejemplos | Lista de Markdown con título | manual.ejemplos.length > 0. |
| Asientos tipo | Lista con título + tabla D/H (código + concepto) | manual.asientos_tipo.length > 0. |
| Ver también | Botones clickeables (códigos) | manual.ver_tambien.length > 0. |
| Tags | Chips planas | manual.tags.length > 0. |
Eventos
Section titled “Eventos”| Evento | Dirección | Propósito |
|---|---|---|
plan-cuentas:select | Emite | Click en código de “Ver también” — pide a cualquier consumidor saltar al manual de esa cuenta. |
Endpoints
Section titled “Endpoints”| Método + ruta | Uso |
|---|---|
GET /api/manual-cuentas/:codigo | Manual de la cuenta. 404 se trata como “sin manual aún”. |
Backend de referencia
Section titled “Backend de referencia”El manual contable vive en Mongo. El endpoint del tenant (/api/manual-cuentas) es solo lectura; la edición vive en /api/command/manual-cuentas (admin), descrita en Plan de Cuentas (UI).