Guía para el Desarrollo de Componentes de Quartup normalizados

0. Contexto Actual: Componentes y Arquitectura Legacy de Componentes

A. Componentes

B. Componentes Legacy


1. Componentes de Quartup Normalizados: Un Enfoque Moderno

Los Componentes de Quartup Normalizados representan la evolución de los componentes Legacy, adoptando un estilo de desarrollo moderno y una arquitectura flexible.

El objetivo de esta normalización es establecer una estructura clara y separada de responsabilidades dentro del componente. Esto se logra mediante:

Este nuevo enfoque garantiza una mayor facilidad de gestión, productividad y mantenibilidad a largo plazo.


2. Definición y Creación del Componente (Guía Práctica)

Para ilustrar este proceso, utilizaremos el componente ConciliacionesFinancieras de la aplicación p_cial, y añadiremos algunos bloques de otros componentes para presentar una relación exhaustiva de los directorios usables en cualquier componente.


2.1. Nomenclatura del Componente

El componente debe crearse como un subdirectorio dentro del directorio de la aplicación (en nuestro ejemplo: /p_cial).

Regla de Lenguaje Ubicuo: El nombre del directorio debe tener una nomenclatura clara, con la terminología usada por los miembros del equipo (desarrolladores, expertos de negocio, analistas, probadores, etc.) y es una norma propuesta dentro del Domain-Driven Design.

Las tablas, al desarrollarse dentro del Legacy tendrán la nomenclatura del Legacy, y han de seguir las convenciones del mismo. Lo habitual es que cada componente use un prefijo de tablas independiente, pero no siempre es así. Lo que sí es imprescindible es que cada aplicación tenga un prefijo de tablas totalmente independiente de las demás.

Aplicación Directorio Aplicación Nombre del Componente Directorio del Componente Prefijo Tablas Componente Prefijo Tablas Aplicación
p_cial /p_cial/ ConciliacionesFinancieras /p_cial/ConciliacionesFinancieras/ cialtraf cial
p_pos /p_pos/ FacturasVentas /p_pos/FacturasVentas/ posfac pos

2.2. Estructura Estándar del Directorio

El componente debe seguir una Arquitectura de Capas con la siguiente jerarquía de directorios. Esta estructura separa las responsabilidades del Modelo, la Lógica y los Mecanismos de Persistencia.

Ejemplo de Estructura con los directorios normalizados posibles (cada componente creará/usará solo los que necesite):

p_cial/                                             // Aplicación
└── ConciliacionesFinancieras/                      // Raíz del Componente (PascalCase)
    ├── Columns                                     // Definiciones de Columnas especiales de Tablas
    │   └── ServiceTypeColumn.php
    ├── Models                                      // Definiciones de Tablas (Persistencia)
    │   ├── cialtrafmov.php
    │   └── cialtrafcop.php
    ├── ModelAugments                               // Ampliación de Models de otros Componentes, añadiendo más campos/índices/módulos
    │   ├── MaesartiPosStructureModelAugment.php
    │   └── MaesartiPosModulesModelAugment.php
    ├── ModelExtensions                             // Extensiones de clase Models reutilizables
    │   └── PostieDefault.php
    ├── Persistence                                 // Definiciones de procesos SQL persistentes (Stored functions/procedures)
    │   └── CialtrafmovSqlStoredLogic.php
    ├── Hooks                                       // Gestión de Hooks
    │   ├── Sedempser2sedempconHook.php
    │   └── Sedcue2DocuHubCustomerHook.php
    ├── DTOs                                        // DTOs
    │   └── SedcueDTO.php
    ├── Services                                    // Cálculos de lógica de negocio, pero sin persistencia
    │   └── Sedempser2sedempconService.php
    ├── Actions                                     // Acciones de lógica de negocio Adaptada a Eventos
    │   ├── SedcueStore.php
    │   ├── SedfacvenStore.php
    │   └── SedvefxxxStore.php
    └── Helpers                                     // Clases que aglutinan métodos variados estáticos
        └── StocksHelper.php

3. Responsabilidades de las Capas y Nomenclaturas

Dentro del directorio ConciliacionesFinancieras/, cada subdirectorio agrupa clases con una responsabilidad funcional clara:

Directorio Responsabilidad Principal Clase Padre (Kernel) Traits Sufijo Clase
Columns/ Definición de algunas columnas y su tipo de dato dentro de un Model. QU_ColReal, QU_ColLink Column
Models/ Definición de las tablas del componente. Representan la capa de Persistencia pura. QU_Table
ModelAugments/ Ampliación de otras clases Models, añadiendo más campos/índices/módulos. ItieStructure, ItieModules ModelAugment
ModelExtensions/ Extensiones de clase Models reutilizables. (Clases Propias)
Persistence/ Definiciones de procesos SQL persistentes. SqlStoredLogicInterface SqlStoredLogic
Hooks/ Contiene clases para manejar eventos de persistencia (INSERT/UPDATE/DELETE) y de transacción. ITieIUD, ITieTransaction Hook
DTOs/ Contiene clases DTO. (Clases Propias) ArrayableTrait, AutoAssignPropertiesTrait DTO
Services/ Contiene la lógica de negocio sin persistencia. (Clases Propias) Service
Actions/ Contiene la lógica de negocio adaptada que se ejecuta como respuesta a eventos (Hooks), como la creación automática de datos. (Clases Propias) Action Manager
Helpers/ Clases que aglutinan métodos variados estáticos. (Clases Propias) Helper

4. Uso de Namespaces (PSR-4)

Es obligatorio utilizar namespaces en todas las clases de la extensión (salvo en los Models debido a restricciones del Legacy), siguiendo la recomendación PSR-4. Esto mantiene el código organizado y evita conflictos de nombres.

4.1. Regla de Nomenclatura del Namespace

El namespace base debe formarse uniendo el nombre de la aplicación y el nombre del componente.

  1. La aplicación (p_cial) debe capitalizar las dos iniciales y eliminar el guion bajo: PCial.
  2. El nombre del componente (ConciliacionesFinancieras) y sus subdirectorios se añade directamente: PCial\ConciliacionesFinancieras\....

Por lo tanto, el namespace base para este componente es PCial\ConciliacionesFinancieras\. A partir de ahí, se definen sub-namespaces según la estructura de directorios.

Ejemplo de Código (Hook):

// Fichero: /p_cial/ConciliacionesFinancieras/Hooks/Cialtrafmov2reconciliacionHook.php
namespace PCial\ConciliacionesFinancieras\Hooks;    // Namespace base + Directorio

use ItieIUD;
// ... otras importaciones del Kernel

/**
 * PHP version 7
 *
 * @package    Quartup
 * ...
 */
class Cialtrafmov2reconciliacionHook implements ItieIUD
{
    // ... lógica del Hook
}

5. Carga de Clases (Autoloading)

Restricción y Particularidad de Quartup:

A diferencia de un proyecto estándar de PHP, no se debe utilizar composer.json ni Composer para la carga de clases (autoloading).

El sistema de Quartup se encarga de interpretar los namespaces que has definido y de cargar las clases automáticamente. Esta es una particularidad del entorno de Quartup que simplifica el proceso, evita conflictos, y se integra totalmente con el sistema Legacy de autoloading.