Skip to content

Latest commit

 

History

History
185 lines (147 loc) · 6.46 KB

File metadata and controls

185 lines (147 loc) · 6.46 KB

Refactor del Plugin POS - Arquitectura de Servicios

Resumen de Cambios

El trait monolítico PointOfSaleTrait (414 líneas) ha sido refactorizado en una arquitectura basada en servicios con responsabilidades separadas.

Nueva Estructura

1. PointOfSaleValidator (Lib/PointOfSaleValidator.php)

Responsabilidad: Validaciones de permisos y tokens

  • validateDelete() - Valida permisos de eliminación
  • validatePermissions() - Valida permisos de actualización
  • validateToken() - Valida tokens anti-duplicación
  • validateRequest() - Validación completa de request
  • validateSettings() - Validación de configuración del POS

2. PointOfSaleResponseBuilder (Lib/PointOfSaleResponseBuilder.php)

Responsabilidad: Construcción y envío de respuestas HTTP

  • setToken() - Establece el token de respuesta
  • addResponseData() - Añade datos a la respuesta
  • setSuccessResponse() - Establece respuesta de éxito
  • buildResponse() - Construye respuesta completa con mensajes
  • setResponse() - Envía la respuesta al cliente
  • getMessages() - Obtiene mensajes de log del sistema

3. PointOfSaleHookManager (Lib/PointOfSaleHookManager.php)

Responsabilidad: Gestión de hooks y elementos personalizados

  • addCustomDocumentField() - Añade campos personalizados
  • getCustomDocumentFields() - Obtiene campos personalizados
  • addCustomMenuElement() - Añade elementos de menú
  • getCustomMenuElements() - Obtiene elementos de menú
  • addHookAction() - Añade acciones de hook
  • getHookActions() - Obtiene acciones de hook
  • getPrintSaleTicketActions() - Acciones de impresión de ticket
  • getPrintDraftTicketActions() - Acciones de impresión de borrador
  • getPrintClosingTicketActions() - Acciones de impresión de cierre

4. PointOfSaleDataAccessTrait (Lib/PointOfSaleDataAccessTrait.php)

Responsabilidad: Acceso a datos (solo getters legítimos)

  • getParentFamilies() - Obtiene familias padre
  • getCashPaymentMethod() - Obtiene método de pago en efectivo
  • getDefaultCustomer() - Obtiene cliente por defecto
  • getDefaultDocument() - Obtiene documento por defecto
  • getSupportedDocuments() - Obtiene documentos soportados
  • getDenominations() - Obtiene denominaciones de moneda
  • getFieldOptions() - Obtiene opciones de campos
  • getCartColumnCount() - Cuenta columnas del carrito
  • getHomeProducts() - Obtiene productos iniciales
  • getPaymentMethods() - Obtiene métodos de pago
  • getDefaultWarehouse() - Obtiene almacén por defecto
  • getSession() - Obtiene sesión actual
  • getTerminal() - Obtiene terminal actual
  • getTerminalFromCompany() - Obtiene terminales de la empresa
  • setFamilyFilter() - Establece filtro de familia

5. BasePointOfSaleController (Lib/BasePointOfSaleController.php)

Responsabilidad: Clase base abstracta con inyección de servicios

  • Extiende Controller
  • Usa ExtensionsTrait y PointOfSaleDataAccessTrait
  • Inyecta los servicios: validator, responseBuilder, hookManager
  • Proporciona métodos delegadores a los servicios
  • setupServices() - Inicializa todos los servicios

Ventajas del Refactor

Separación de Responsabilidades (SRP)

Cada clase tiene una única responsabilidad bien definida.

Mejor Testabilidad

Puedes hacer unit tests de cada servicio de forma independiente.

// Ejemplo de test
$validator = new PointOfSaleValidator($mockController);
$result = $validator->validateToken();

Inyección de Dependencias

Los servicios se pueden mockear fácilmente para testing.

Menor Uso de Memoria

Solo se cargan las clases que realmente se usan (autoloading).

Mejor Mantenibilidad

Cada archivo es más pequeño y enfocado en una tarea específica.

Escalabilidad

Fácil añadir nuevos servicios sin modificar código existente.

Type Safety

Aprovecha PHP 8.1+ con tipado estricto en propiedades y métodos.

Migración desde el Trait Antiguo

Antes:

use FacturaScripts\Plugins\POS\Lib\PointOfSaleTrait;

class MiControladorPOS extends Controller
{
    use PointOfSaleTrait;

    public function miMetodo()
    {
        $this->validateRequest(); // Desde el trait
    }
}

Después:

use FacturaScripts\Plugins\POS\Lib\BasePointOfSaleController;

class MiControladorPOS extends BasePointOfSaleController
{
    public function privateCore(&$response, $user, $permissions): void
    {
        parent::privateCore($response, $user, $permissions);
        $this->setupServices(); // Inicializar servicios
    }

    public function miMetodo()
    {
        $this->validateRequest(); // Ahora delegado a validator
    }
}

Retrocompatibilidad

El PointOfSaleTrait original se mantiene pero está marcado como @deprecated. Esto permite que código existente siga funcionando mientras se migra gradualmente.

Impacto en Rendimiento

Prácticamente CERO con OPcache habilitado:

  • Los archivos se compilan una vez a bytecode
  • Se cachean en memoria
  • Peticiones posteriores usan el bytecode cacheado
  • Autoloading solo carga clases necesarias

Archivos Modificados

  1. ✅ Creado: Lib/PointOfSaleValidator.php
  2. ✅ Creado: Lib/PointOfSaleResponseBuilder.php
  3. ✅ Creado: Lib/PointOfSaleHookManager.php
  4. ✅ Creado: Lib/PointOfSaleDataAccessTrait.php
  5. ✅ Creado: Lib/BasePointOfSaleController.php
  6. ✅ Modificado: Controller/POS.php - Ahora extiende BasePointOfSaleController
  7. ✅ Modificado: Lib/PointOfSaleTrait.php - Marcado como deprecated

Próximos Pasos Recomendados

  1. Testing: Crear tests unitarios para cada servicio
  2. Migración gradual: Actualizar otros controladores que usen el trait antiguo
  3. Documentación: Añadir ejemplos de uso en el README principal
  4. Deprecation warning: En una versión futura, emitir warnings cuando se use el trait
  5. Eliminación: Remover el trait antiguo en v3.0

Ejemplo de Uso en Extensiones

namespace MiPlugin\Extension\Controller;

class MiExtensionPOS
{
    public function loadCustomDocumentFields()
    {
        // El hookManager está disponible en el controlador
        $this->addCustomDocumentField('cart', [
            'name' => 'mi_campo',
            'label' => 'Mi Campo Personalizado',
            'type' => 'text'
        ]);
    }
}

Autor del Refactor

  • Refactorización realizada el: 2025-12-13
  • Basado en el código original de Juan José Prieto Dzul

Nota: Este refactor sigue los principios SOLID y las mejores prácticas de PHP moderno.