Saltar a contenido

Autor: Iker Acevedo

Fecha creacion: 2026-10-17 Estado: propuesta (pendiente de aprobación) Tipo: estándar obligatorio

Estructura del proyecto

Árbol general

src/app/
├── core/
│   ├── experiencias/                     # Motor del sistema (se construye una vez)
│   │   ├── experiencias.models.ts        # ExperienciaDef, VersionesVista, tipos
│   │   ├── experiencias.registro.ts      # Lista de todas las experiencias
│   │   ├── experiencia-activa.store.ts   # Experiencia del usuario + respaldo
│   │   ├── version-activa.ts             # Resuelve qué versión de una vista se monta
│   │   └── shell-host.component.ts       # Monta el shell de la experiencia activa
│   ├── plataforma/                       # Cerebro del shell (compartido por todas las experiencias)
│   │   ├── plataforma.facade.ts          # Usuario, menú permitido, alertas, cerrar sesión
│   │   ├── plataforma.store.ts
│   │   └── plataforma.repository.ts
│   └── application/ ...                  # Servicios existentes (se mantienen)
│
├── experiencias/                         # Todo lo exclusivo de cada experiencia
│   ├── clasica/
│   │   ├── clasica.experiencia.ts        # Definición: id, nombre, estado, shell, organizador de menú
│   │   ├── shell/                        # Hoy: default-layout, header, sidebar, footer
│   │   ├── navegacion/organizar-menu.ts  # Cómo acomoda el menú (función pura)
│   │   ├── estilos/_tokens.scss          # Valores de los tokens para esta experiencia
│   │   └── ui/                           # UI kit: botón, tarjeta, tabla, modal... de esta experiencia
│   └── <otra-experiencia>/               # Misma estructura
│
├── components/                           # Componentes compartidos existentes (neutros, usan tokens)
│
└── views/<dominio>/<vista>/
    ├── <vista>.page.ts                   # Host de la ruta: crea el cerebro y monta la versión
    ├── <vista>.experiencias.ts           # Qué experiencias tienen versión de esta vista
    ├── models/<vista>.models.ts
    ├── repository/<vista>.repository.ts  # Único archivo que llama al API
    ├── state/
    │   ├── <vista>.store.ts              # Estado en signals
    │   └── <vista>.facade.ts             # Única puerta para las versiones visuales
    ├── helpers/<vista>.reglas.ts         # Funciones puras + .spec.ts
    └── experiencias/
        ├── clasica/                      # Obligatoria
        │   ├── <vista>-clasica.component.ts
        │   ├── <vista>-clasica.component.html
        │   ├── <vista>-clasica.component.scss
        │   └── partes/                   # Subcomponentes propios de esta versión (opcional)
        └── <otra-experiencia>/

Los nombres repository/, state/, models/ y helpers/ ya se usan en el proyecto (gestion-cuentas, ingreso-devoluciones); se mantienen.

Responsabilidades

Carpeta Hace No puede
core/experiencias/ Registrar experiencias, resolver la activa, montar shell y versiones Conocer vistas concretas
core/plataforma/ Datos del usuario, menú permitido, alertas globales Tener HTML o estilos
experiencias/<id>/ Shell, organizador de menú, tokens y UI kit de esa experiencia Lógica de negocio, HTTP, importar otra experiencia
views/**/repository/ HTTP y conversión de respuestas a modelos Estado, mensajes, HTML
views/**/state/ Estado (store) y acciones/lecturas (facade); permisos de la vista DOM, saber qué experiencia está activa
views/**/helpers/ Reglas puras Importar Angular, sessionStorage, HTTP
views/**/experiencias/<id>/ Pintar la vista en esa experiencia; estado solo visual Ver Crear una vista, sección 6

Quién puede importar a quién

flowchart LR
    VE["views/**/experiencias/X"] --> VS["views/**/state (facade)"]
    VE --> VM["views/**/models"]
    VE --> EUI["experiencias/X/ui"]
    VE --> CMP["components (neutros)"]
    VS --> VR["views/**/repository"]
    VS --> VH["views/**/helpers"]
    ESH["experiencias/X/shell"] --> PF["core/plataforma (facade)"]
    ESH --> EUI
Desde Puede importar Nunca importa
views/**/experiencias/X/ facade y models de su vista, experiencias/X/ui, components/ repository/, store, HttpClient, otra experiencia
views/**/state, repository, helpers, models Entre ellos y core/ Nada de experiencias/
experiencias/X/ core/plataforma, core/experiencias, su propio ui/ Otra experiencia, views/
core/ core/ views/; experiencias/ solo desde experiencias.registro.ts con import() diferido

Estas reglas se hacen cumplir con ESLint (no-restricted-imports por carpeta). Un PR que las rompa no pasa CI.

Nombres

Elemento Formato Ejemplo
Id de experiencia kebab-case, nombre de negocio estable clasica
Clave de vista <dominio>.<vista> tienda.pedidos
Versión de vista <Vista><Experiencia>Component en <vista>-<experiencia>.component.ts PedidosClasicaComponent
Selector app-<vista>-<experiencia> app-pedidos-clasica
Página <Vista>Page en <vista>.page.ts PedidosPage
Shell Shell<Experiencia>Component ShellClasicaComponent
Componente del UI kit app-<experiencia>-<pieza> app-clasica-boton

Los ids de experiencia y las claves de vista se guardan en la base de datos: no se renombran.

Historial de cambios

Fecha Autor Cambio
2026-10-17 Iker Acevedo Creación de la propuesta