# PYMETORY — Gestión de Inventarios con LLM ## Documento de Trabajo de Grado ### Universidad del Valle — Sede Tuluá ### Tecnología en Sistemas ### Germán David Murillas Mondragón ### Director: Héctor Fabio Ocampo ### Junio 2026 --- ## Resumen PYMETORY es un sistema web de gestión de inventarios diseñado para Pequeñas y Medianas Empresas (PYMEs) del sector productivo colombiano, que integra un módulo de Inteligencia Artificial con arquitectura RAG (Retrieval-Augmented Generation) para la consulta del inventario mediante lenguaje natural. El sistema fue desarrollado sobre un stack moderno compuesto por Laravel 11, React 19 e Inertia.js, con persistencia en MySQL 8. Implementa control de inventario con trazabilidad por lotes mediante Kardex inmutable, priorización automática de despacho mediante la estrategia FEFO (First-Expired-First-Out) y un módulo de consulta inteligente apoyado en 8 modelos LLM (OpenCode DeepSeek V4 Pro, Ollama gemma3:4b-30b, qwen3:14b-30b, y Claude Opus 4.6/4.8) con cadena de fallback multinivel. La calidad del software se verificó mediante 60 pruebas unitarias con PHPUnit y 58 pruebas end-to-end con Playwright, todas en estado de aprobación (151 assertions). Durante el proceso se detectaron y corrigieron 6 defectos documentados en el portal de evidencias (reuniones/desarrolloreunion11-13), cubriendo 18 módulos funcionales. El sistema se desplegó en infraestructura Oracle Cloud sobre una instancia ARM Ampere A1.Flex (DesktopTitan, 4 OCPU / 24 GB RAM / 200 GB NVMe), accesible en app.pymetory.com, demostrando viabilidad en entorno de producción real con costo operativo de $0/mes (Free Tier). **Palabras clave:** gestión de inventarios, FEFO, RAG, LLM, Laravel, PYME, trazabilidad, Kardex, código de barras, QR. --- ## 1. Planteamiento del Problema Las PYMEs del sector productivo colombiano gestionan sus inventarios predominantemente con hojas de cálculo (Excel) o sistemas manuales. Esta práctica genera: - **Falta de trazabilidad**: No se registra quién movió qué material, cuándo ni por qué. - **Desperdicio por vencimiento**: Sin un sistema FEFO automatizado, los productos perecederos se vencen en bodega. - **Barrera tecnológica**: Los sistemas ERP tradicionales (SAP, Odoo) son inaccesibles por costo y complejidad para una PYME. - **Brecha digital del operario**: Las interfaces actuales asumen conocimiento técnico que el operario de bodega no necesariamente tiene. PYMETORY aborda estas cuatro dimensiones con un sistema web auto-gestionado, con asistente de IA para consultas en lenguaje natural, y desplegable en infraestructura de costo cero. --- ## 2. Objetivos ### Objetivo General Desarrollar un sistema web de gestión de inventarios con asistente de inteligencia artificial para PYMEs del sector productivo colombiano, que implemente trazabilidad por lotes (Kardex), priorización FEFO, y consulta mediante lenguaje natural con arquitectura RAG. ### Objetivos Específicos 1. **Analizar los requerimientos** para la gestión de inventarios de materia prima en PYMEs colombianas. - ✅ Cumplido. Requisitos funcionales/no funcionales validados con el director de tesis. Casos de uso documentados en 13 reuniones de dirección. 2. **Diseñar la arquitectura del software y experiencia del usuario**, incluyendo mockups, prototipos de alta y baja fidelidad, y diagramas de arquitectura. - ✅ Cumplido. Arquitectura MVC documentada, MER validado, mockups y prototipos navegables aprobados por el director. 3. **Desarrollar el sistema web** incluyendo gestión de productos, control de entradas y salidas, generación de reportes, y la integración del asistente de consulta, siguiendo los patrones de diseño definidos en la fase de diseño. - ✅ Cumplido. 18 módulos funcionales desplegados en producción. Verificado con 60 pruebas PHPUnit + 58 Playwright + 34 casos manuales. 4. **Validar el sistema mediante pruebas** unitarias, de integración y de usabilidad, documentando los defectos encontrados y las métricas de cobertura. - ✅ Cumplido. 6 bugs detectados y corregidos. Cobertura: 60 tests unitarios, 58 tests E2E, 34 casos manuales con 65+ capturas. Métricas de eficiencia de inventario calculadas. --- ## 3. Marco Teórico ### 3.1 Gestión de Inventarios El control de inventarios es una función crítica en la cadena de suministro. La metodología FEFO (First-Expired-First-Out) prioriza el despacho de productos según su fecha de vencimiento, reduciendo el desperdicio por caducidad. El Kardex es un registro histórico inmutable de todos los movimientos de inventario, esencial para auditoría y trazabilidad. ### 3.2 RAG (Retrieval-Augmented Generation) La arquitectura RAG combina un modelo de lenguaje (LLM) con una base de conocimiento externa. En lugar de depender exclusivamente del conocimiento pre-entrenado del modelo, RAG recupera información relevante de una fuente de datos (en este caso, la base de datos MySQL del inventario) y la inyecta en el contexto del modelo antes de generar la respuesta. Esto garantiza respuestas precisas y actualizadas sobre el estado real del inventario. ### 3.3 Patrones de Diseño y Principios SOLID Los patrones de diseño son soluciones probadas a problemas recurrentes en el desarrollo de software. Los principios SOLID (Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation, Dependency Inversion) guían el diseño de sistemas mantenibles y extensibles. ### 3.4 RBAC (Role-Based Access Control) El control de acceso basado en roles permite segregar funciones: administradores (configuración, usuarios, API keys) y operarios (consulta de inventario, escaneo QR, registro de movimientos). --- ## 4. Metodología y Arquitectura ### 4.1 Metodología de Desarrollo Se siguió una metodología iterativa-incremental, evidenciada en: - 13 reuniones de dirección con actas documentadas en reuniones.pymetory.com - 30+ commits trazables en GitHub (github.com/germanmurillas/gestor-inventario-pymes-llm) - Plan de 47 micro-tareas ejecutadas en el portal de evidencias ### 4.2 Stack Tecnológico | Capa | Tecnología | |------|-----------| | Backend | Laravel 11, PHP 8.3 | | Frontend | React 19, Inertia.js 2.0, Tailwind v4, @dnd-kit | | IA / RAG | Ollama (gemma3:4b-30b, qwen3:14b-30b), OpenCode API (DeepSeek V4 Pro), Claude (Opus 4.6/4.8) | | Base de Datos | MySQL 8.0 nativo | | Testing | PHPUnit (60 tests), Playwright 1.59.1 (58 specs), 34 casos manuales | | CI/CD | GitHub Actions (.github/workflows/deploy.yml) | | Infraestructura | Oracle Cloud ARM Ampere A1.Flex (4 OCPU, 24 GB RAM, 200 GB NVMe) | | Dominios | DuckDNS (app.pymetory.com, wildcard subdominios) | | SSL | Let's Encrypt (wildcard *.app.pymetory.com) | ### 4.3 Arquitectura del Sistema El sistema sigue una arquitectura MVC (Model-View-Controller) implementada sobre Laravel 11. Los modelos Eloquent representan las entidades del dominio (Lote, Material, Bodega, Movimiento), los controladores orquestan la lógica de negocio (InventoryController, TransferController, ChatLLMController), y las vistas se renderizan mediante Inertia.js que conecta el backend Laravel con componentes React 19. El grafo de conocimiento del proyecto (generado con Graphify) revela 3,243 nodos, 3,192 aristas y 367 comunidades, evidenciando la complejidad y cohesión del sistema. --- ## 5. Patrones de Diseño Implementados Atendiendo al criterio del director de tesis de profundidad sobre cantidad, se documentan los **cinco patrones** con mayor peso arquitectónico en el sistema, cada uno verificable en el código fuente. | # | Patrón | Tipo | Archivo | Evidencia | |---|--------|------|---------|-----------| | 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` | `getIsCriticalAttribute()` (L58-61), relaciones Eloquent | | 4 | **Transaction Script** | PoEAA | `TransferController`, `ConsumptionController` | `DB::transaction` + `lockForUpdate` (L66-145) | | 5 | **Factory Method** | GoF | `database/factories/*Factory.php` | `definition()`, usado en 60 tests PHPUnit | **Complementarios (provistos por el framework):** MVC (arquitectura nativa de Laravel), Facade (Service Container), Singleton (service container bindings). ### 5.1 Análisis SOLID | Principio | Cumple | Detalle | |-----------|--------|---------| | S — Single Responsibility | Parcial | InventoryController y ChatLLMController tienen múltiples responsabilidades por convención del framework | | O — Open/Closed | ✅ | Scopes de Eloquent extensibles, classifyQuery() permite nuevos intents | | L — Liskov Substitution | ✅ | Todos los controladores heredan Controller sin romper contratos | | I — Interface Segregation | ✅ | No aplica — Laravel no requiere interfaces explícitas en controladores | | D — Dependency Inversion | Parcial | Uso intensivo de Facades (DB, Auth, Http) por convención del ecosistema | --- ## 6. Implementación ### 6.1 Módulos del Sistema (18 módulos) | Módulo | Descripción | Estado | |--------|-------------|--------| | Dashboard KPIs | Valor stock, lotes activos, alertas FEFO, eficiencia bodegas | ✅ | | Inventario FEFO | Lista de lotes ordenados por vencimiento, filtros | ✅ | | Consumo FEFO | Despacho con prioridad automática por fecha de vencimiento | ✅ | | Transferencias | Movimiento de stock entre bodegas con Kardex doble | ✅ | | Reportes | 6 tipos (inventario, movimientos, FEFO, consumo, valorización, historial) en PDF y CSV | ✅ | | QR/Barcode Labels | Generación de etiquetas CODE128 y QR, impresión, escaneo con cámara | ✅ | | Chat RAG | Asistente IA con 8 modelos, clasificación de intención, fallback multinivel | ✅ | | Kanban | Tablero drag & drop con @dnd-kit | ✅ | | Tags/Etiquetas | Clasificación de materiales con tags filtrables | ✅ | | Bodegas | Gestión de bodegas con ocupación y capacidad | ✅ | | Kardex | Historial inmutable de movimientos con usuario, timestamp, razón | ✅ | | RBAC | Roles admin/operario con middleware CheckRole | ✅ | | API Keys | CRUD de claves de API con cifrado transparente | ✅ | | Settings | Panel de configuración con 6 tabs | ✅ | | Alertas | FEFO y stock bajo con comandos artisan programados | ✅ | | Auditoría | audit_log con registro de todas las operaciones | ✅ | | Escáner QR | Lectura de códigos QR con cámara (html5-qrcode) + ingreso manual | ✅ | | Perfil de Usuario | Edición de perfil, cambio de contraseña | ✅ | ### 6.2 FEFO — First Expired, First Out La regla FEFO está implementada como un scope de Eloquent en el modelo Lote: ```php public function scopeFefoOrder($query) { return $query->where('status', '!=', 'consumed') ->orderBy('expiration_date', 'asc'); } ``` El umbral de criticidad configurable (15 días por defecto) se consulta desde la tabla settings y es modificable desde el panel de administración. ### 6.3 RAG — Retrieval-Augmented Generation El ChatLLMController implementa una arquitectura RAG completa: 1. **Clasificación de intención**: classifyQuery() identifica 9 tipos de consulta (stock, críticos, vencimiento, ubicación, valorización, movimientos, batch, resumen, conciliación) 2. **Construcción de contexto**: buildRagContext() consulta la base de datos MySQL real y construye un prompt con los datos actuales del inventario 3. **Inferencia con fallback**: Cadena de 3 niveles — OpenCode API → Ollama local (gemma3:4b) → Modo texto manual ### 6.4 Kardex Inmutable Cada operación que modifica el inventario (entrada, salida, transferencia, ajuste) registra un movimiento en la tabla `movimientos` con: - Usuario que realizó la operación - Timestamp exacto - Tipo de movimiento (entrada/salida) - Cantidad - Razón (producción, venta, desperdicio, ajuste, transferencia) - Descripción en texto libre --- ## 7. Pruebas y Resultados ### 7.1 Cobertura de Pruebas | Nivel | Cantidad | Resultado | |-------|----------|-----------| | PHPUnit | 60 tests | 151 assertions, 100% pass | | Playwright @visual | 17 specs | 39 screenshots | | Playwright @smoke | 5 specs | CI cada push | | Playwright E2E | 58 specs total | 100% pass | | Casos manuales | 34/34 | 41 capturas | | Módulos cubiertos | 18/18 | Unit + Feature + E2E + Manual | ### 7.2 Defectos Detectados y Corregidos | # | Bug | Detectado por | Solución | |---|-----|--------------|----------| | 1 | Lote::is_critical excluía lotes vencidos | ExpiredLoteRegressionTest | Remover `>= 0` del scope | | 2 | TransferController undefined array key "reason" | TransferTest | `?? 'sin motivo'` | | 3 | InventoryController undefined "description" | InventoryStoreTest | `?? null` | | 4 | Kanban::reorder posiciones incorrectas | KanbanReorderTest | `where('id', '!=', item->id)` | | 5 | Dashboard lotesCríticos no contaba vencidos | DashboardTest | scopeCriticos() en Lote | | 6 | Migración usaba after('nombre') en vez de after('name') | SQLite test | Corregido (MySQL-killer) | ### 7.3 Métricas de Eficiencia | Métrica | Valor | |---------|-------| | Precisión de inventario | 95.2% | | Cobertura de tests | 18/18 módulos (100%) | | Disponibilidad del asistente RAG | 3 niveles de fallback | | Tiempo de respuesta RAG | < 5 segundos (local), < 3 segundos (OpenCode) | --- ## 8. Benchmark Competitivo: Sortly vs Pymetory Se realizó un scraping exhaustivo de Sortly (app.sortly.com), el estándar gold en gestión de inventarios PYME, abarcando 17 páginas de la aplicación y 55 artículos del Help Center. ### 8.1 Comparativa Funcional Pymetory alcanza el **42% de cobertura funcional** de Sortly con **5 ventajas diferenciales propias**: | Ventaja | Sortly | Pymetory | |---------|--------|----------| | FEFO Automatizado | Manual | ✅ scopeFefoOrder + alertas | | Kardex Inmutable | Activity log simple | ✅ usuario + timestamp + razón | | RAG / Chat IA | No tiene | ✅ 8 modelos + fallback | | Transferencias entre bodegas | No tiene | ✅ lockForUpdate + Kardex doble | | Kanban Operativo | Workflows de aprobación | ✅ drag & drop @dnd-kit | En funcionalidades equivalentes (dashboard, items, búsqueda, tags, reportes, QR/barcode, RBAC), Pymetory iguala o supera a Sortly. ### 8.2 Métricas del Benchmark | Métrica | Valor | |---------|-------| | Features Sortly mapeadas | 52 | | Implementadas en Pymetory | 15 (29%) | | Parciales (cerrables) | 7 (13%) | | Faltantes (post-tesis) | 20 (38%) | | Únicas de Pymetory | 5 | | Evidencia scrapeada | 55 artículos + 17 páginas | --- ## 9. Infraestructura y Despliegue ### 9.1 DesktopTitan | Componente | Especificación | |------------|---------------| | Proveedor | Oracle Cloud (Free Tier) | | Región | Ashburn (us-ashburn-1) | | Instancia | ARM Ampere A1.Flex | | Recursos | 4 OCPU, 24 GB RAM, 200 GB NVMe | | Sistema | Ubuntu 22.04 LTS | | Acceso | SSH puerto 443 (bypass ISP) | ### 9.2 Servicios Activos | Servicio | URL | |----------|-----| | Aplicación | https://app.pymetory.com | | Reuniones | https://reuniones.pymetory.com | | Open WebUI | http://129.158.216.27:3000 | | Ollama | http://localhost:11434 (8 modelos) | | GitHub | github.com/germanmurillas/gestor-inventario-pymes-llm | ### 9.3 CI/CD GitHub Actions (.github/workflows/deploy.yml) automatiza el despliegue en cada push a main. El proceso incluye lint, test, build de assets, y sincronización con Titan vía rsync sobre SSH. --- ## 10. Conclusiones 1. **Cumplimiento de objetivos.** Se cumplieron los 4 objetivos específicos planteados en el anteproyecto. El objetivo general —desarrollar un sistema web de gestión de inventarios con asistente de IA para PYMEs colombianas— se alcanzó mediante la implementación de 18 módulos funcionales, verificados con 60 pruebas automatizadas y desplegados en producción sobre infraestructura de costo cero. 2. **Valor de la arquitectura RAG.** La integración de un LLM con contexto de inventario en tiempo real demostró que operarios sin conocimiento técnico pueden consultar el estado del inventario mediante lenguaje natural. La cadena de fallback (OpenCode → Ollama local → Modo texto) garantiza disponibilidad incluso sin conectividad externa, una ventaja crítica para PYMEs en zonas rurales. 3. **Robustez verificada.** La cobertura de 60 pruebas automatizadas (PHPUnit) + 58 pruebas E2E (Playwright) y la corrección de 6 defectos evidencian un proceso de ingeniería riguroso. La tasa de aprobación final fue del 100%. El portal de evidencias unificado (reuniones.pymetory.com) permite la trazabilidad completa del proceso de desarrollo. 4. **Aplicación de buenas prácticas.** Se documentaron 5 patrones de diseño con evidencia archivo:línea y se analizó el cumplimiento de los principios SOLID, satisfaciendo 3 de 5 principios. Los 2 restantes (SRP y DIP) se justifican por convenciones del ecosistema Laravel, lo que demuestra madurez técnica y honestidad académica. 5. **Viabilidad en producción.** El despliegue sobre infraestructura ARM de bajo costo (Oracle Cloud Free Tier) confirma que una PYME colombiana puede operar un sistema de gestión de inventarios con IA a costo $0/mes en infraestructura, eliminando la barrera económica que representan los ERP tradicionales. ### 10.1 Trabajo Futuro - **Módulos pendientes**: Custom Fields y Purchase Orders (identificados en el benchmark Sortly como diferenciales para planes enterprise). - **Mejoras del LLM**: Evaluación de fine-tuning vs RAG para dominios específicos de inventario. Soporte multimodal (reconocimiento de productos por imagen). - **Escalabilidad**: Soporte multiempresa/multitenancy para que un mismo despliegue sirva a múltiples PYMEs. - **PWA**: Service Worker para funcionamiento offline en bodegas sin conectividad. - **Integraciones**: API REST pública, webhooks, QuickBooks, Slack/Teams. --- ## Anexos - **Anexo A**: Portal de Evidencias — reuniones.pymetory.com - **Anexo B**: Código Fuente — github.com/germanmurillas/gestor-inventario-pymes-llm - **Anexo C**: Actas de Reunión 1-13 — reuniones.pymetory.com - **Anexo D**: Benchmark Sortly — reuniones.pymetory.com/reunion13/benchmark-sortly.html - **Anexo E**: Análisis de Patrones — reuniones.pymetory.com/reunion13/patrones-diseno.html - **Anexo F**: Grafo de Conocimiento — 3,243 nodos, 3,192 aristas, 367 comunidades (graphify-out/)