50 Cancelación de Ventas en Laravel Reversión de Stock, Arqueo y Estado 🗑️🔄 Sistema de Farmacia

Duración: 10 min
Módulo: Módulo Ventas Lección 6 de 11

¡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 50: Anulación de Ventas en Laravel: Reajuste Automático de Stock y Reversión en Caja

En este capítulo abordamos uno de los procesos de auditoría más delicados en los sistemas de puntos de venta (POS): la Anulación o Cancelación de una Venta Emitida. Programamos la lógica en el backend para revertir de manera segura los efectos financieros y logísticos de una transacción cancelada, garantizando la consistencia absoluta de los datos.

🎯 El Objetivo Central

Implementar el método de reversión de ventas en Laravel para devolver automáticamente las unidades facturadas a sus lotes de origen en el inventario y restar el flujo de efectivo del arqueo de caja activo.

🛣️ Configuración de Rutas y Estado de Anulación

Para mantener la trazabilidad y cumplir con las normas contables, establecemos que una venta nunca se elimina físicamente de la base de datos (evitando registros huérfanos), sino que se transforma:

  • Ruta de Control: Habilitamos la ruta para procesar el cambio de estado mediante el método update o un controlador dedicado a cancelaciones.
  • Flujo del Estado: El campo estado de la tabla ventas cambia de "Emitido" a "Anulado". De este modo, la cabecera de la transacción permanece en el historial para auditorías, pero deja de sumar en las métricas de ingresos netos.

🔄 Reversión Lógica en el Backend (Paso a Paso)

Cuando un administrador o cajero autorizado presiona el botón de "Anular", Laravel ejecuta un proceso transaccional en tres niveles:

  1. 📈 Restauración del Inventario (Stock): El sistema recorre la tabla venta_detalles asociada a esa venta. Toma la cantidad vendida de cada medicamento y la suma de regreso al stock_actual del lote e inventario_id exacto de donde salió, reactivando los productos que previamente se marcaron con stock cero.
  2. 📉 Contra-asiento en el Arqueo de Caja: Para que el dinero cuadre perfectamente al finalizar la jornada, el sistema identifica el arqueo abierto y genera un movimiento de reversión (o resta el monto directamente del total ingresado), asegurando que el Efectivo Esperado en caja coincida con el dinero físico real.
  3. 📜 Actualización del Historial Inmutable: La tabla venta_historiales actualiza el estado del JSON a "Anulado", guardando la trazabilidad de quién ejecutó la cancelación y el motivo de la misma en el campo de notas.

Al concluir esta lección, los estudiantes habrán dominado el manejo de transacciones complejas y reversiones de stock en Laravel, cerrando el ciclo comercial del software de manera profesional. ¡En el próximo capítulo iniciaremos con el bloque final de reportes estadísticos y gráficos de rendimiento!