
Sistema ERP SaaS multiempresa diseñado para el mercado peruano: facturación electrónica SUNAT, POS, inventario kardex valorizado y módulo restaurante en una arquitectura modular desacoplada.
Contexto
Proyecto personal de punta a punta: un ERP SaaS multiempresa orientado a bodegas, minimarkets, restaurantes, pollerías, ferreterías, farmacias y distribuidoras. Soporta negocios con ventas al contado y al crédito, con la facturación electrónica SUNAT como núcleo operativo.
Problema
Los negocios peruanos operan bajo requisitos legales que los sistemas genéricos no cubren: facturación electrónica SUNAT con UBL 2.1 y firma digital, control de inventario valorizado tipo kardex, métodos de pago locales (Yape, Plin) y operación multiempresa. El software monolítico tradicional no escala para servir a varias empresas sin mezclar datos ni ceder rendimiento.
Solución
Se construyó un monólito modular desacoplado: backend Laravel con 12 módulos, frontend SPA en React y TypeScript, y comunicación entre módulos basada en eventos. Cada módulo define su propio contexto acotado y expone su lógica mediante servicios, repositorios y DTOs.
Módulos clave
- POS y caja — grilla de productos con búsqueda rápida, cliente por defecto “Clientes Varios”, validación de identificación por DNI/RUC, regla SUNAT que exige identificar al cliente en ventas superiores a S/700, múltiples métodos de pago (efectivo, Yape, Plin, tarjeta, transferencia, crédito, mixto) y apertura/cierre de caja.
- Facturación electrónica SUNAT — generación de XML UBL 2.1 con Greenter: facturas, boletas, notas de crédito y débito y guías de remisión. Firma digital, recuperación de CDR, QR, envío asíncrono por colas que nunca bloquea la venta y seguimiento de estados (pendiente, firmado, enviado, aceptado/rechazado) con soporte de entorno beta.
- Inventario — multi-almacén con control de stock, kardex físico y valorizado bajo costo promedio ponderado, movimientos de entrada, salida, transferencia y ajuste, alertas de stock bajo y reportes.
- Módulo restaurante — layout visual del salón, comandas con envío automático a cocina, KDS (Kitchen Display System) con prioridades, recetas con consumo automático de ingredientes, combos y modificadores, e impresión térmica por estación.
- Compras y ventas — gestión de proveedores, órdenes de compra con recepción e ingreso a almacén, cuentas por pagar y cobrar, cotizaciones, ventas a crédito con validación de límite y descuentos por producto, porcentaje o monto fijo.
- Tesorería y reportes — apertura/cierre de caja, ingresos y egresos, flujo de caja, ventas por día/semana/mes, producto, categoría, sucursal y vendedor, valorización de inventario y exportación a PDF, Excel y CSV.
Arquitectura
- Monólito modular con contextos acotados: la lógica de negocio vive en Services, el acceso a datos en Repositories y los controladores solo validan y orquestan.
- Comunicación por dominio mediante eventos. Un
SaleCreateddispara en paralelo el descuento de stock, la generación de factura SUNAT y la creación de la cuenta por cobrar. - Jobs asíncronos procesados con Redis y Laravel Horizon; diseño preparado para CQRS.
- RBAC granular con Spatie Permission, auditoría con snapshots antes/después, scoping multiempresa por
company_iden toda la base, IDs UUID y soft deletes. - Schemas Zod compartidos entre frontend y backend para validación tipada en ambos lados.
- Infraestructura por código con Docker; la misma stack de contenedores sirve desarrollo y producción.
- Estrategia de escalado definida: monólito modular, extracción de servicios independientes y microservicios con event streaming.
Mi aporte
Diseño de la arquitectura modular, implementación de los 12 módulos backend en Laravel, frontend completo en React con TanStack Query, integración de facturación SUNAT con Greenter, orquestación por eventos, contenerización con Docker, estrategia de despliegue y suite de pruebas con Pest en backend y Vitest con MSW en frontend.
Retos técnicos
- Integración SUNAT: generación y firma de XML UBL 2.1, envío asíncrono a través de colas y reconciliación de estados con el CDR.
- Consistencia multiempresa: aislamiento de datos por
company_idsin sacrificar el rendimiento de las consultas indexadas. - Operación de restaurante en tiempo real: comandas a cocina, KDS y salida de impresión térmica por estación.
- Sincronización de stock y cuentas por cobrar sin acoplar los módulos entre sí.
Resultados
- Plataforma lista para operar en negocios reales con cumplimiento SUNAT completo.
- Arquitectura desacoplada y testeada, diseñada para escalar desde un MVP hasta miles de empresas.
- Inventario y tesorería trazables en todo momento mediante kardex y auditoría.
Stack tecnológico
Laravel · PHP · React · TypeScript · PostgreSQL · Redis · Docker · Greenter · TailwindCSS · Zod · TanStack Query · Laravel Horizon · Sanctum · Spatie Permission · Pest · Vitest