CP/DEV
Sistema de Gestión de Inventario

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 creating del 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_user para 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_user fuera 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.