Movimientos de Inventario
El módulo de movimientos de inventario permite registrar las entradas (compras, devoluciones de clientes) y salidas (ventas, devoluciones a proveedores) de productos, actualizando automáticamente el stock disponible.Los movimientos de inventario son la única forma de modificar el stock de productos en el sistema. Esto garantiza trazabilidad completa de todos los cambios de inventario.
Tipos de Movimientos
El sistema soporta dos tipos de movimientos:Entrada
Aumenta el stock de un productoEjemplos:
- Compra a proveedores
- Devoluciones de clientes
- Producción interna
- Ajustes por conteo físico (positivos)
Salida
Disminuye el stock de un productoEjemplos:
- Ventas a clientes
- Devoluciones a proveedores
- Productos dañados/pérdidas
- Ajustes por conteo físico (negativos)
Registrar Entrada
Las entradas aumentan el stock de un producto y se registran en la tablamovimientos para trazabilidad.
Proceso de Entrada
Acceder al formulario de entrada
Desde la lista de productos, haz clic en Entrada en la barra de navegación superior, o navega a
http://localhost/inventario/movimientos/entrada.php.Seleccionar producto
Usa el menú desplegable para seleccionar el producto al que deseas agregar stock. El sistema muestra todos los productos disponibles.
Ingresar cantidad
Especifica la cantidad de unidades a agregar. Debe ser un número entero positivo mayor o igual a 1.
Formulario de Entrada
El formulario enmovimientos/entrada.php:27-41 permite seleccionar el producto y cantidad:
movimientos/entrada.php
Procesamiento de la Entrada
Cuando se envía el formulario, el código enmovimientos/entrada.php:7-22 procesa la entrada:
movimientos/entrada.php
Transacciones atómicas: El sistema realiza dos operaciones separadas (INSERT en movimientos y UPDATE en productos). En producción, considera usar transacciones SQL para garantizar que ambas operaciones se completen o ninguna se ejecute:
Registrar Salida
Las salidas disminuyen el stock de un producto, con validación automática de stock disponible.Proceso de Salida
Acceder al formulario de salida
Desde la lista de productos, haz clic en Salida en la barra de navegación superior, o navega a
http://localhost/inventario/movimientos/salida.php.Seleccionar producto
Usa el menú desplegable para seleccionar el producto del que deseas retirar stock.
Formulario de Salida
El formulario enmovimientos/salida.php:36-50 es similar al de entrada:
movimientos/salida.php
Validación de Stock Disponible
La característica clave de las salidas es la validación de stock (movimientos/salida.php:7-29):
movimientos/salida.php
Estructura de la Tabla Movimientos
Cada movimiento registrado contiene la siguiente información:Identificador único del movimiento. Clave primaria auto-incremental.
ID del producto relacionado. Clave foránea que referencia
productos.id.Tipo de movimiento: “entrada” (aumenta stock) o “salida” (disminuye stock).
Cantidad de unidades del movimiento. Siempre es un número positivo.
Fecha y hora en que se registró el movimiento. Se establece automáticamente al valor actual con
DEFAULT CURRENT_TIMESTAMP.Actualización Automática de Stock
El stock de productos se actualiza automáticamente con cada movimiento:- Entrada (Aumentar)
- Salida (Disminuir)
- Stock anterior: 10
- Entrada: +5
- Stock nuevo: 15
Consultar Historial de Movimientos
Aunque el sistema actualmente no incluye una interfaz para consultar el historial, puedes ver todos los movimientos directamente en la base de datos:- Qué producto fue movido
- Si fue entrada o salida
- Cuántas unidades
- Cuándo ocurrió el movimiento
Casos de Uso Comunes
Registrar una compra a proveedor
Registrar una compra a proveedor
- Navega a Entrada
- Selecciona el producto comprado
- Ingresa la cantidad recibida
- Registra la entrada
Registrar una venta
Registrar una venta
- Navega a Salida
- Selecciona el producto vendido
- Ingresa la cantidad vendida
- Registra la salida
Ajuste de inventario por conteo físico
Ajuste de inventario por conteo físico
Si realizas un conteo físico y encuentras discrepancias:Si encontraste más stock del registrado:
- Usa Entrada para ajustar la diferencia positiva
- Usa Salida para ajustar la diferencia negativa
- Registra una salida de 3 unidades para ajustar
Productos dañados o pérdidas
Productos dañados o pérdidas
Si tienes productos dañados o perdidos que no se pueden vender:
- Navega a Salida
- Selecciona el producto afectado
- Ingresa la cantidad de unidades dañadas/perdidas
- Registra la salida
Flujo de Movimientos de Inventario
Mejoras Recomendadas
Página de historial
Crear una interfaz para consultar y filtrar todos los movimientos registrados con detalles completos.
Campo de motivo/notas
Agregar un campo opcional para documentar el motivo de cada movimiento (venta, devolución, ajuste, etc.).
Usuario que registró
Registrar qué usuario (
$_SESSION['usuario']) realizó cada movimiento para auditoría completa.Mostrar stock actual
En los formularios de entrada/salida, mostrar el stock actual de cada producto junto a su nombre.
Movimientos masivos
Permitir registrar múltiples productos en un solo movimiento (útil para compras con varios artículos).
Alertas de stock bajo
Mostrar una alerta cuando el stock de un producto caiga por debajo de un mínimo configurado.
Solución de Problemas
Error: Stock insuficiente (pero el stock parece suficiente)
Error: Stock insuficiente (pero el stock parece suficiente)
Verifica:
- Que el stock en la base de datos coincida con el mostrado en la interfaz
- Que otro usuario no haya registrado una salida simultáneamente
- Ejecuta
SELECT stock FROM productos WHERE id=Xdirectamente en MySQL para confirmar el stock real
- Edición manual de la tabla productos (sin pasar por movimientos)
- Errores en transacciones anteriores que no completaron ambas operaciones
Los movimientos se registran pero el stock no cambia
Los movimientos se registran pero el stock no cambia
Esto puede ocurrir si:
- La consulta UPDATE tiene un error de sintaxis (revisa
$conn->error) - El usuario MySQL no tiene permisos UPDATE en la tabla productos
- La columna
stockno existe o tiene un nombre diferente - Hay un trigger en la base de datos que interfiere con el UPDATE
El historial de movimientos no se guarda
El historial de movimientos no se guarda
Si la tabla movimientos no registra los movimientos:
- Verifica que la tabla
movimientosexista en la base de datos - Confirma que la consulta INSERT no tiene errores (revisa
$conn->error) - Verifica permisos INSERT del usuario MySQL
- Revisa que
producto_idsea una clave foránea válida
Stock negativo después de una salida
Stock negativo después de una salida
Si logras registrar una salida que deja stock negativo:Solución permanente: Agrega una restricción CHECK en MySQL 8.0+:
- La validación de stock puede tener un error lógico
- Puede haber una condición de carrera (race condition) con múltiples usuarios
Reportes e Informes
Puedes generar reportes útiles consultando la tabla de movimientos:- Productos más movidos
- Movimientos del día
- Productos con más salidas
Seguridad
Próximos Pasos
Gestión de Productos
Aprende a crear y editar productos
Estructura de Base de Datos
Entiende las relaciones entre tablas
Roles de Usuario
Configura permisos para movimientos
Solución de Problemas
Resuelve problemas comunes