Análisis del código de Pymetory según la solicitud del Prof. Héctor en Reunión 13.
«Revise el código, revise qué patrones de diseño está utilizando para poderlos documentar.»
Los 5 principios de diseño orientado a objetos evaluados sobre la base de código de Pymetory (Laravel 11, PHP 8.3).
Cada clase debe tener una sola razón para cambiar.
TransferController (solo transferencias), ApiKeyController (solo API keys), UserController (solo usuarios), KanbanController (solo kanban). Los modelos Lote, Material, Bodega tienen responsabilidad única.InventoryController (7 responsabilidades: dashboard, PDF, CSV, ajuste, bodega, material, consumo). ChatLLMController (5 responsabilidades: chat, sesiones, modelos, providers CRUD, RAG). Esto es aceptable en controladores Laravel por convención del framework, pero es técnicamente una violación de SRP.Abierto para extensión, cerrado para modificación.
scopeFefoOrder(), scopeCriticos(), scopeActivos(), scopeVenceEn() permiten extender consultas sin modificar el modelo.classifyQuery() permite agregar nuevos tipos de intención sin modificar la lógica existente.llm_providers permite agregar nuevos backends sin tocar el código del chat.Las clases derivadas deben poder sustituir a sus clases base sin alterar el comportamiento.
Controller sin romper el contrato del framework.Lote extends Model, Material extends Model — todas las subclases de Eloquent respetan los contratos de Illuminate\Database\Eloquent\Model.User $user, KanbanItem $item, ApiKey $apiKey).Ningún cliente debe depender de interfaces que no usa.
Depender de abstracciones, no de concreciones.
User $user, Lote $lote).Auth, DB, Request.DB::, Auth::, Http::, Log::, Pdf:: — esto acopla el código a Laravel, pero es una práctica estándar del ecosistema y no afecta la mantenibilidad en este contexto.Siguiendo la directriz del Prof. Héctor: «Prefiero 5 bien sustentados que 11 de relleno. Cada patrón con su evidencia.»
| # | Patrón | Tipo | Evidencia (archivo : ubicación) |
|---|---|---|---|
| 1 | Strategy | GoF | app/Http/Controllers/ChatLLMController.php — mapa $endpoints (L298-303) + $cfg=$endpoints[$llmSource] |
| 2 | Chain of Responsibility | GoF | app/Http/Middleware/CheckRole.php::handle() — $next($request) · alias role en bootstrap/app.php |
| 3 | Active Record | PoEAA | app/Models/Lote.php, Material.php — relaciones Eloquent + getIsCriticalAttribute() (L58-61) |
| 4 | Transaction Script | PoEAA | TransferController::store() — DB::transaction + lockForUpdate (L66-145); ConsumptionController::consumeFefo() |
| 5 | Factory Method | GoF | database/factories/{Material,Lote,Bodega,ApiKey}Factory.php::definition() |
📎 Complementarios (no contabilizados como aporte propio): Service Layer (AlertService) y patrones del framework Laravel — MVC, Facade, Singleton (service container).
Estos patrones son parte integral del ecosistema Laravel. No fueron implementados manualmente, pero el proyecto los hereda y los aprovecha. Se documentan como contexto arquitectónico, no como aporte propio.
| Patrón | Dónde lo provee Laravel | Cómo lo usa Pymetory |
|---|---|---|
| MVC | Arquitectura nativa del framework | Modelos Eloquent → Controladores → Vistas React/Inertia |
| Facade | Service Container + Facade base class | DB::, Auth::, Http::, Log::, Pdf:: |
| Singleton | Service Container con binding singleton | Auth, DB, Cache — una instancia por ciclo de vida |
El patrón de dominio más importante de Pymetory, exigido por el Prof. Héctor como regla inmutable del sistema.
app/Models/Lote.php — scopeFefoOrder()public function scopeFefoOrder($query) { return $query->where('status', '!=', 'consumed') ->orderBy('expiration_date', 'asc'); }
Propósito: Garantizar que los productos con fecha de vencimiento más próxima se consuman primero, cumpliendo con la normativa de gestión de inventarios perecederos.
Uso: Dashboard, reporte PDF, exportación CSV, alertas FEFO, consultas RAG del ChatLLM.
Este análisis debe incluirse en el documento final de Trabajo de Grado, sección de Arquitectura o Implementación.
El desarrollo de Pymetory sigue una arquitectura MVC sobre Laravel 11 con 5 patrones de diseño implementados y evidenciados:
app/Models/Lote.php, Material.php, Bodega.php).ChatLLMController.php L69-81, L298-303).ChatLLMController.php L342-354).DB::transaction() en TransferController, InventoryController).database/factories/, 53 tests).Adicionalmente, el proyecto hereda 3 patrones del framework Laravel: MVC, Facade y Singleton — documentados como contexto arquitectónico, no como implementación propia.
Cumplimiento SOLID: 3/5 principios cumplidos (OCP, LSP, ISP), 2/5 parcial (SRP, DIP) por convenciones del ecosistema Laravel. Las desviaciones son estándar en el framework y no comprometen la mantenibilidad.