# Auditoría De Layouts De Editores Fecha de auditoría: 18 de agosto de 2026. ## Objetivo Inventariar los editores reales del frontend del ERP y clasificarlos respecto a la norma visual vigente de edición focalizada. Esta auditoría: - inventaría rutas, páginas y dialogs de edición activos; - clasifica cada caso por tipo; - evalúa el layout actual frente a la norma; - detecta desviaciones y excepciones justificadas; - propone una secuencia pequeña de migración. Esta auditoría no migra masivamente las pantallas. ## Norma visual de referencia SSOT vigente: - `packages/rdx-ui/docs/page-layouts.md` - `packages/rdx-ui/docs/contributing-ui.md` Resumen operativo: - los editores de página completa deben usar por defecto shell `app-fullscreen`; - la navegación mínima sale por `PageFormHeader` o un header de dominio equivalente; - el contenido del editor se centra mediante `RdxEditorPageLayout`; - `complexity="simple"` aplica a formularios focalizados centrados; - `complexity="complex"` aplica a documentos o editores con `main + aside`, bloques especializados y footer sticky; - los dialogs e inline editors no deben migrarse automáticamente a fullscreen. ## Método de investigación Búsquedas y fuentes revisadas: - rutas y layouts en `apps/web/src/routes/app-routes.tsx` y `modules/*/src/web/*routes.tsx` - contratos de layout en `modules/core/src/web/lib/modules/module-client.interface.ts` - primitivas Rdx en: - `packages/rdx-ui/src/components/editor-page/rdx-editor-page-layout.tsx` - `packages/rdx-ui/src/components/editor-page/rdx-editor-sticky-footer.tsx` - `modules/core/src/web/components/form/form-actions/page-form-header.tsx` - `apps/web/src/layout/app-fullscreen-layout.tsx` - `apps/web/src/layout/app-sidebar-layout.tsx` - módulos revisados: - `identity` - `customers` - `customer-invoices` - `companies` - `catalogs` - `document-series` - `supplier` - búsquedas textuales sobre: - `layout: "app-fullscreen"` - `layout: "app-sidebar"` - `RdxEditorPageLayout` - `PageFormHeader` - `RdxEditorStickyFooter` - `create` - `update` - `edit` - `Dialog` ## Inventario | Module | Feature | Route | Type | Current layout | Rdx editor layout | Compliance | Risk | Priority | Recommended action | Evidence | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | `identity` | Account self-service | `/account` | `PAGE_SIMPLE` | `app-fullscreen` | `simple` | `COMPLIANT` | `LOW` | `-` | Ninguna. Mantener como referencia de editor simple focalizado. | `modules/identity/src/web/account-routes.tsx`, `modules/identity/src/web/account/ui/pages/account-page.tsx` | | `identity` | Change password dialog | Sin ruta propia. Dialog dentro de `/account` | `DIALOG` | Host `app-fullscreen` | No aplica | `COMPLIANT` | `LOW` | `-` | Ninguna. Mantener como dialog de edición contenida. | `modules/identity/src/web/account/ui/pages/account-page.tsx` | | `customers` | Create customer | `/customers/create` | `PAGE_SIMPLE` | `app-fullscreen` | `simple` | `COMPLIANT` | `LOW` | `-` | Ninguna. Referencia vigente de editor simple. | `modules/customers/src/web/customer-routes.tsx`, `modules/customers/src/web/create/ui/pages/customer-create-page.tsx` | | `customers` | Update customer | `/customers/:id/edit` | `PAGE_SIMPLE` | `app-fullscreen` | `simple` | `COMPLIANT` | `LOW` | `-` | Ninguna. Referencia vigente de editor simple. | `modules/customers/src/web/customer-routes.tsx`, `modules/customers/src/web/update/ui/pages/customer-update-page.tsx` | | `customers` | Quick create customer | Sin ruta propia. Dialog reutilizado desde proformas | `DIALOG` | Host `app-fullscreen` | No aplica | `COMPLIANT` | `LOW` | `-` | Ninguna. Mantenerlo como creación rápida embebida. | `modules/customers/src/common/features/quick-create-customer/ui/dialogs/quick-create-customer-dialog.tsx` | | `companies` | Company details settings | `/settings/company/details` | `PAGE_SIMPLE` | `app-sidebar` | No usa `RdxEditorPageLayout` | `EXCEPTION_JUSTIFIED` | `MEDIUM` | `P3` | Mantener en settings por ahora. Revaluar solo si se define una variante focalizada específica para formularios de settings. | `modules/companies/src/web/company-routes.tsx`, `modules/companies/src/web/settings/company-details/ui/pages/company-details-settings-page.tsx` | | `customer-invoices` | Verifactu settings | `/settings/billing/verifactu` | `PAGE_SIMPLE` | `app-sidebar` | No usa `RdxEditorPageLayout` | `EXCEPTION_JUSTIFIED` | `MEDIUM` | `P3` | Mantener en settings por ahora. Revaluar junto con una política específica de formularios largos dentro de settings. | `modules/customer-invoices/src/web/customer-invoice-routes.tsx`, `modules/customer-invoices/src/web/settings/verifactu/ui/pages/company-verifactu-settings-page.tsx` | | `customer-invoices` | Create proforma | `/proformas/create` | `PAGE_SIMPLE` | `app-fullscreen` | `simple` | `COMPLIANT` | `MEDIUM` | `-` | Ninguna. Mantener como bootstrap inicial de proforma hacia el editor documental completo. | `modules/customer-invoices/src/web/customer-invoice-routes.tsx`, `modules/customer-invoices/src/web/proformas/create/ui/pages/proforma-create-page.tsx`, `modules/customer-invoices/src/web/proformas/create/ui/blocks/proforma-create-form.tsx` | | `customer-invoices` | Update proforma | `/proformas/:id/edit` | `PAGE_COMPLEX` | `app-fullscreen` | `complex` | `COMPLIANT` | `HIGH` | `-` | Ninguna. Mantener como referencia vigente de editor complejo. | `modules/customer-invoices/src/web/customer-invoice-routes.tsx`, `modules/customer-invoices/src/web/proformas/update/ui/pages/proforma-update-page.tsx`, `modules/customer-invoices/src/web/proformas/update/ui/editors/proforma-update-editor-form.tsx` | | `customer-invoices` | Change proforma status | Sin ruta propia. Dialog usado desde listado y detalle | `DIALOG` | Host mixto (`app-sidebar` o `app-fullscreen`) | No aplica | `COMPLIANT` | `LOW` | `-` | Ninguna. Es una edición contenida por dialog, no candidata a fullscreen. | `modules/customer-invoices/src/web/proformas/change-status/ui/change-status-dialog.tsx`, `modules/customer-invoices/src/web/proformas/list/ui/pages/list-proformas-page.tsx`, `modules/customer-invoices/src/web/proformas/detail/ui/pages/proforma-detail-page.tsx` | | `catalogs` | Payment methods create/update | Host: `/settings/general/payment-methods` | `DIALOG` | Host `app-sidebar` | No aplica | `COMPLIANT` | `LOW` | `-` | Ninguna. Mantener como edición contenida en dialog dentro de settings. | `modules/catalogs/src/web/catalogs-routes.tsx`, `modules/catalogs/src/web/settings/payment-methods/ui/pages/payment-methods-settings-page.tsx`, `modules/catalogs/src/web/settings/payment-methods/ui/components/payment-method-form-dialog.tsx` | | `catalogs` | Payment terms create/update | Host: `/settings/general/payment-terms` | `DIALOG` | Host `app-sidebar` | No aplica | `COMPLIANT` | `LOW` | `-` | Ninguna. Mantener como dialog aunque su contenido interno sea más rico. | `modules/catalogs/src/web/catalogs-routes.tsx`, `modules/catalogs/src/web/settings/payment-terms/ui/pages/payment-terms-settings-page.tsx`, `modules/catalogs/src/web/settings/payment-terms/ui/components/payment-term-form-dialog.tsx` | | `catalogs` | Tax regimes create/update | Host: `/settings/general/tax-regimes` | `DIALOG` | Host `app-sidebar` | No aplica | `COMPLIANT` | `LOW` | `-` | Ninguna. Mantener como dialog de edición contenida. | `modules/catalogs/src/web/catalogs-routes.tsx`, `modules/catalogs/src/web/settings/tax-regimes/ui/pages/tax-regimes-settings-page.tsx`, `modules/catalogs/src/web/settings/tax-regimes/ui/components/tax-regime-form-dialog.tsx` | | `customer-invoices` | Issued invoices create/edit references | Referencias a `/issued-invoices/create` y `/customer-invoices/:id/edit`, sin ruta activa | `UNCLEAR` | Sin ruta activa | No aplica | `UNKNOWN` | `MEDIUM` | `P2` | Aclarar si esas rutas deben existir o limpiar referencias muertas antes de cualquier trabajo visual. | `modules/customer-invoices/src/web/issued-invoices/list/ui/pages/list-issued-invoices-page.tsx`, `modules/customer-invoices/src/web/issued-invoices/list/ui/blocks/issued-invoices-grid/issued-invoices-grid.tsx`, `modules/customer-invoices/src/web/customer-invoice-routes.tsx` | | `document-series` | Frontend editor activo | No detectado | `LEGACY_OR_UNUSED` | Sin route frontend | No aplica | `UNKNOWN` | `LOW` | `P3` | Confirmar si el módulo tendrá UI activa antes de cualquier migración de layout. | Sin `src/web/*routes.tsx` ni páginas frontend activas en `modules/document-series` | | `supplier` | Frontend editor activo | No detectado | `LEGACY_OR_UNUSED` | Sin route frontend | No aplica | `UNKNOWN` | `LOW` | `P3` | Resolver primero si el módulo se reactiva o se limpia; no priorizar migración visual. | Sin `src/web/*routes.tsx`; solo `modules/supplier/src/web/shared/*` | ## Editores conformes Conformes respecto a la norma vigente: - `customers/create` - `customers/update` - `/account` - `proformas/:id/edit` Motivos comunes observados: - ruta bajo `app-fullscreen`; - navegación mínima por `PageFormHeader` o header de dominio equivalente; - uso explícito de `RdxEditorPageLayout`; - geometría coherente con `simple` o `complex` según caso; - acciones de salida/guardado visibles y no delegadas al sidebar. ## Desviaciones ### 1. `proformas/create` HECHO OBSERVADO - la ruta usa `app-fullscreen`; - la página usa header de edición y `RdxEditorPageLayout complexity="simple"`; - el flujo de alta actual solo captura cabecera inicial y deriva después al editor documental completo; - no existe todavía editor de líneas, `aside`, totales sticky ni footer persistente equivalentes a `proformas/:id/edit`. IMPACTO - el create queda alineado con el patrón focalizado simple sin fingir que ya es el editor documental completo; - la diferencia visual restante frente a `update` responde a una diferencia funcional real y no a drift accidental de layout. DECISIÓN - `PAGE_SIMPLE`; - `COMPLIANT`. ### 2. Referencias a create/edit de issued invoices sin ruta activa HECHO OBSERVADO - hay referencias a `/issued-invoices/create` y a `/customer-invoices/:id/edit`; - `customer-invoice-routes.tsx` no declara esas rutas activas. IMPACTO - el inventario de editores queda ambiguo en esa área; - puede existir deuda de navegación muerta o una funcionalidad incompleta; - no conviene planificar migración visual ahí hasta aclarar si hay editor real. RECOMENDACIÓN - confirmar si esas rutas deben implementarse; - si no, limpiar referencias muertas antes de meterlas en cualquier backlog de layouts. ## Excepciones justificadas ### Company details settings HECHO OBSERVADO - es un formulario de página completa; - vive bajo `/settings/company/details`; - depende del shell de settings con `app-sidebar`. INFERENCIA - la navegación lateral de settings forma parte funcional de la tarea y hoy actúa como mecanismo primario de cambio de subsección. DECISIÓN DE AUDITORÍA - `EXCEPTION_JUSTIFIED` por ahora; - no priorizar fullscreen salvo que el sistema de settings evolucione con una variante focalizada explícita. ### Verifactu settings HECHO OBSERVADO - es un formulario de configuración largo; - vive bajo `/settings/billing/verifactu`; - comparte patrón de settings con shell lateral. INFERENCIA - igual que en `company/details`, la tarea sigue integrada en navegación de settings y no en un editor aislado. DECISIÓN DE AUDITORÍA - `EXCEPTION_JUSTIFIED` por ahora; - revisar sólo si se aborda una política transversal de formularios largos dentro de settings. ## Dialogs e inline editors Dialogs correctamente clasificados y no candidatos automáticos a fullscreen: - `QuickCreateCustomerDialog` - `PaymentMethodFormDialog` - `PaymentTermFormDialog` - `TaxRegimeFormDialog` - dialog de cambio de contraseña de `/account` - `ChangeProformaStatusDialog` No se detectaron rutas independientes que deban reclasificarse desde `DIALOG` o `INLINE` a `PAGE_*`. No se detectaron inline editors de entidad de primer nivel con route propia. Sí existen bloques especializados internos, como el editor de líneas de proformas, pero forman parte de un `PAGE_COMPLEX` y no deben inventariarse como pantalla independiente. ## Incoherencias create/update Agregados revisados: - `customers` - `create` y `update` comparten patrón y están alineados. - `proformas` - `create` usa `RdxEditorPageLayout complexity="simple"` porque hoy es un bootstrap inicial; - `update` usa `RdxEditorPageLayout complexity="complex"` porque ya es el editor documental completo con `main`, bloques especializados y footer sticky. Conclusión: - la diferencia create/update restante es funcional legítima: `create` todavía no edita el documento completo y `update` sí. ## Riesgos de migración Riesgos bajos: - `customers/create` - `customers/update` - `/account` Riesgos medios: - `proformas/create` por convivencia con quick-create/select customer dialogs y porque el flujo actual parece de bootstrap inicial, no de edición documental completa; - `company/details` y `verifactu` si se intentara moverlos fuera del shell settings. Riesgos altos: - `proformas/:id/edit`, aunque hoy ya cumple. Cualquier cambio allí impacta: - scroll complejo - footer sticky - totales embebidos - `aside` - dialogs anidados ## Plan incremental ### Fase A - completada: migración de `proformas/create` Motivo: - era el único `PAGE_*` activo no plenamente alineado con el patrón Rdx; - ya usaba `app-fullscreen`, así que el salto era incremental; - permite distinguir mejor entre bootstrap inicial y editor documental completo del agregado Proforma. ### Fase B - revisar si `company/details` y `verifactu` deben seguir como excepción de settings o si merece una variante focalizada específica para formularios largos dentro de settings Motivo: - ahora mismo la excepción parece razonable; - no conviene forzar fullscreen sin una decisión explícita sobre el sistema de settings. ### Fase C - aclarar `issued-invoices` create/edit Motivo: - primero hay que determinar si existe editor real o solo referencias muertas. ### Fase D - hacer una auditoría UX más fina de dialogs ricos, empezando por `payment-terms` Motivo: - no es un incumplimiento de fullscreen; - sí es el dialog más complejo de los auditados y puede requerir reglas específicas de consistencia interna. ## No cambios Durante esta auditoría: - no se modificaron rutas ni layouts runtime de `customers`, `companies`, `customer-invoices`, `catalogs`, `identity`, `document-series` o `supplier`; - no se tocaron hooks, controllers, formularios, React Query ni backend de los editores auditados; - el único cambio de código del turno es este documento operativo de auditoría.