
2024 · Desarrollador full-stack (Laravel)
Sistema de Gestión de Inventario
Inventario multialmacén con códigos QR, roles y aislamiento por usuario en Laravel
- Laravel 10
- PHP 8.2
- Alpine.js
- Tailwind CSS
- Cloudinary
- PHPUnit
- Docker
- Multi-tenant
- Aislado por usuario
- Identificación
- QR únicos por producto
- Calidad
- Tests PHPUnit + Pint
El problema
Controlar stock repartido en varios almacenes físicos sin hojas de cálculo dispersas: saber qué producto hay, dónde, en qué estado y poder localizarlo escaneando una etiqueta. El público objetivo son pequeñas y medianas empresas (retail, logística, depósitos) donde cada responsable necesita su propio inventario, aislado del de los demás.
Decisiones de arquitectura
- Laravel 10 + Blade + Alpine.js, sin SPA pesada. Vite para el bundling de assets. La interactividad justa (filtros, escáner) se resuelve con Alpine, sin el coste de un framework cliente.
- Multi-tenancy por
user_id: cada consulta se filtra por usuario en lugar de montar un esquema por inquilino. Sencillo de razonar y de testear. - Cloudinary para las imágenes de producto: almacenamiento y CDN externos, transformaciones automáticas, sin cargar el servidor propio.
- QR únicos generados en el
creatingdel modelo, exportables a PNG/SVG y escaneables desde la cámara del navegador para localizar un producto al instante. - Autenticación con Passport + Sanctum: tokens OAuth2 pensando en un futuro cliente móvil, y sesiones para el panel web.
- SQLite en desarrollo, MySQL/PostgreSQL en producción; despliegue reproducible con Docker (PHP 8.2 + Apache) y migraciones automáticas.
Modelo de datos
Usuarios (con rol administrador u operario) que poseen productos, almacenes y categorías. Cada producto pertenece a un almacén (relación N:1), se clasifica en varias categorías (N:M con tabla pivote), tiene estado (en stock, con incidencia…), un QR único y sus imágenes en Cloudinary.
Endurecimiento de seguridad
El trabajo más interesante no fue añadir features, sino cerrar agujeros. Documenté y resolví una tanda de hallazgos:
- IDOR: las consultas de edición, detalle y cambio de estado se filtran por
id_userpara que nadie acceda a productos ajenos. - Contaminación entre inquilinos: un test de aislamiento (
CrossTenantIsolationTest) verifica que un usuario nunca ve datos de otro. - Mass assignment controlado (
$request->only(...),id_userfuera de$fillable), rate limiting en login/registro/QR y revocación de tokens al cerrar sesión.
Resultado
Una aplicación que gestiona inventario real multialmacén, con identificación física por QR y separación estricta de datos entre usuarios, cubierta por tests de funcionalidad (autenticación, QR, roles, aislamiento) y desplegable de forma reproducible con Docker. El énfasis: que sea segura por defecto, no solo funcional.