58 Formulario de Ajustes de Inventario en Laravel Entradas con Nuevo Lote y Salidas de Stock 📦✏️

Duración: 12 min
Módulo: Módulo Inventario y sus acciones Lección 3 de 6

¡Contenido Exclusivo!

Adquiere este curso para tener acceso inmediato a esta y a **todas las lecciones Premium**.

Inscribirse Ahora por $10.00 Acceso instantáneo de por vida y código fuente incluido.

Descripción

🚀 Lección 58: Formulario de Ajustes de Inventario en Laravel: Entradas con Nuevo Lote y Salidas de Stock

En este capítulo abordamos uno de los desafíos lógicos más complejos del Módulo de Inventarios. Desarrollamos un formulario dinámico de Ajustes de Inventario capaz de ramificar su comportamiento para ejecutar dos operaciones críticas: la baja directa de medicamentos caducados (Salidas) y la reposición gratuita de stock mediante nuevos lotes sin alterar las cuentas por pagar de compras (Entradas).

🎯 El Objetivo Central

Construir un controlador transaccional que discrimine el tipo de ajuste en el frontend. Si es una Salida, descuenta y limpia las alertas del POS; si es una Entrada, despliega campos extendidos para registrar un lote inédito, impactando atómicamente múltiples tablas de la base de datos.

📉 1. Flujo de Salida: Eliminación de Stock Vencido

Validamos de forma práctica la depuración del stock en mal estado utilizando el lector de barras:

  • Remoción Lógica: Al escanear un medicamento en color rojo (ej. lote con 20 unidades vencidas), el sistema procesa el ajuste negativo.
  • Sincronización: Al guardarse, el backend da de baja las unidades. Automáticamente, el "semáforo de vencimientos" del Dashboard principal se limpia (el contador baja a cero) y el producto queda completamente bloqueado y removido de la pantalla de ventas en el POS.

📈 2. Flujo de Entrada Dinámica: Reposición por Proveedor (Laboratorio)

Desarrollamos una solución avanzada para un caso común en farmacias: cuando un laboratorio repone un producto vencido por uno nuevo de forma gratuita. No es una compra (porque no hay egreso de caja ni deuda), pero requiere registrar un lote nuevo.

  • Campos Mutables en el Frontend: Si el usuario selecciona tipo "Entrada", el formulario se expande mediante JavaScript para mostrar campos idénticos al módulo de compras: Proveedor, Código de Lote, Fecha de Fabricación, Fecha de Vencimiento, Precios (Compra/Venta) y Parámetros de Stock (Mínimo/Máximo).
  • Búsqueda Indexada: La búsqueda del producto ya no consulta el inventario actual, sino la tabla global de productos para heredar las propiedades base del fármaco.

🗄️ Impacto Atómico en la Base de Datos (Múltiples Tablas)

Para mantener la integridad absoluta de los datos, la acción de Guardar Entrada ejecuta un bloque que afecta en paralelo a 3 tablas:

  1. 📦 inventarios: Inserta el registro de existencias con el stock actual ingresado, dejando el campo compra_id en null al no ser una transacción comercial.
  2. 📝 inventario_ajustes: Persiste la bitácora con el motivo explícito (ej. "Reposición de productos vencidos").
  3. 🔢 lotes: Crea e indexa la nueva entidad de lote (ej. Lote 2026) con su respectivo semáforo cronológico de caducidad.

🗑️ Lógica de Reversión Total (Acción Eliminar)

Implementamos una estricta regla de negocio para la cancelación de ajustes erróneos:

  • El sistema no permite "editar" un ajuste debido a la complejidad de los lotes creados. En su lugar, se habilita una acción de Eliminar con cascada controlada. Si el administrador borra el ajuste, el backend remueve simultáneamente la bitácora, el lote creado y el saldo en inventario, devolviendo las 3 tablas a su estado original exacto.

Al finalizar este capítulo, los estudiantes dominarán la manipulación avanzada de formularios mutables y el control transaccional relacional en Laravel. ¡En la siguiente lección continuaremos expandiendo el inventario abordando el módulo de Traslados internos entre sucursales!