Control inteligente de inventario: cómo automatizar el stock y las alertas de vencimiento
En un pequeño taller de producción, quedarse sin una materia prima puede detener toda la actividad. Del mismo modo, descubrir que un aceite, una esencia, un colorante o cualquier otro insumo ha vencido puede representar una pérdida económica que podría haberse evitado.
Muchas veces estos inconvenientes tienen un origen común: el inventario se administra de manera manual, con anotaciones, planillas desactualizadas o controles que dependen exclusivamente de la memoria de una persona.
La tecnología permite cambiar esta situación.
Mediante una base de datos relacional y algunos procesos automatizados es posible conocer las existencias, controlar los lotes, anticipar las compras y recibir avisos cuando una materia prima está próxima a vencer.
El objetivo de esta guía es mostrar cómo diseñar un sistema sencillo de control de inventario utilizando herramientas accesibles, como SQLite y Python, sin necesidad de contratar inicialmente un software empresarial.
1. ¿Qué es un sistema automatizado de inventario?
Un sistema automatizado de inventario es una solución informática que registra los movimientos de materiales y utiliza reglas previamente definidas para identificar situaciones que requieren atención.
A diferencia de una planilla convencional, puede consultar la información periódicamente y generar alertas sin que una persona tenga que revisar cada registro.
Sus funciones principales pueden ser:
Registrar entradas y salidas de materias primas.
Consultar las existencias disponibles.
Identificar materiales por debajo del punto de reposición.
Controlar fechas de vencimiento.
Identificar lotes que deben utilizarse primero.
Generar avisos para realizar compras.
Mantener un historial de movimientos.
La automatización no elimina la necesidad de realizar inventarios físicos. Su función es mejorar el seguimiento diario y detectar diferencias antes de que se conviertan en problemas mayores.
2. Stock mínimo, stock de seguridad y punto de reposición
Para construir un sistema confiable es necesario diferenciar tres conceptos que suelen confundirse.
Stock mínimo: cantidad mínima que el negocio desea mantener como referencia para evitar quedarse sin materiales.
Stock de seguridad: reserva adicional destinada a cubrir imprevistos, como aumentos de consumo o demoras de proveedores.
Punto de reposición: nivel de existencias en el que conviene iniciar una nueva compra para que el material llegue antes de agotarse.
Una fórmula sencilla para calcularlo es:
Donde:
PR: punto de reposición.
CD: consumo diario promedio.
TE: tiempo de entrega del proveedor en días.
SS: stock de seguridad.
Ejemplo práctico
Un taller utiliza aproximadamente 2 litros de aceite de coco por día. El proveedor tarda 5 días en entregar y el negocio mantiene una reserva de seguridad de 4 litros.
Esto significa que cuando las existencias utilizables alcancen los 14 litros, el sistema debería generar una alerta de reposición.
El cálculo es una aproximación inicial. Si el consumo o los plazos de entrega varían mucho, conviene utilizar históricos, estacionalidad y niveles de servicio para ajustar el stock de seguridad. https://finance.utah.gov/state-agency-resources/policy/08-06_00/
3. Diseñar una base de datos relacional
Una base de datos relacional permite organizar la información en tablas conectadas mediante identificadores.
Para un taller pequeño podemos comenzar con dos tablas fundamentales:
Tabla de materias primas
| Campo | Descripción |
|---|---|
| id | Identificador único |
| nombre | Nombre del material |
| unidad | Litros, kilos, unidades |
| consumo_diario | Consumo promedio |
| plazo_entrega | Días de entrega |
| stock_seguridad | Reserva adicional |
| dias_alerta | Anticipación para alertar vencimientos |
Tabla de lotes
| Campo | Descripción |
|---|---|
| id | Identificador del lote |
| materia_id | Referencia a la materia prima |
| codigo_lote | Código del proveedor |
| fecha_recepcion | Día de ingreso |
| fecha_vencimiento | Fecha de vencimiento |
| cantidad_disponible | Cantidad actual |
| estado | Disponible, cuarentena o consumido |
La relación entre ambas tablas permite que una misma materia prima tenga varios lotes con diferentes fechas de vencimiento.
Por ejemplo, el taller puede tener tres lotes de aceite de coco: uno recibido en septiembre, otro en octubre y otro en noviembre. Cada uno tendrá su propia cantidad y fecha de vencimiento.
Esta separación es importante: controlar solamente la cantidad total de aceite no permite saber qué lote debe utilizarse primero.
Crear las tablas con SQLite
SQLite es una buena alternativa para comenzar porque funciona con una base de datos almacenada en un archivo y no requiere instalar un servidor independiente. Python incluye el módulo sqlite3 para trabajar con ella. https://docs.python.org/3/library/sqlite3.html
El siguiente ejemplo crea la estructura básica:
PRAGMA foreign_keys = ON;CREATE TABLE materias_primas (id INTEGER PRIMARY KEY,nombre TEXT NOT NULL,unidad TEXT NOT NULL,consumo_diario REAL NOT NULL DEFAULT 0CHECK (consumo_diario >= 0),plazo_entrega INTEGER NOT NULL DEFAULT 0CHECK (plazo_entrega >= 0),stock_seguridad REAL NOT NULL DEFAULT 0CHECK (stock_seguridad >= 0),dias_alerta INTEGER NOT NULL DEFAULT 30CHECK (dias_alerta >= 0));CREATE TABLE lotes (id INTEGER PRIMARY KEY,materia_id INTEGER NOT NULL,codigo_lote TEXT NOT NULL,fecha_recepcion TEXT NOT NULL,fecha_vencimiento TEXT NOT NULL,cantidad_disponible REAL NOT NULLCHECK (cantidad_disponible >= 0),estado TEXT NOT NULL DEFAULT 'disponible'CHECK (estado IN ('disponible','cuarentena','consumido')),FOREIGN KEY (materia_id)REFERENCES materias_primas(id),UNIQUE (materia_id, codigo_lote));
La clave primaria identifica cada registro y la clave foránea relaciona los lotes con sus respectivas materias primas.
Las restricciones también ayudan a evitar cantidades negativas y estados no contemplados.
Importante: SQLite requiere habilitar las claves foráneas en cada conexión. Por eso el programa Python que veremos más adelante incluye esa configuración.
4. Control de lotes y fechas de vencimiento
Uno de los errores más frecuentes en los pequeños talleres es registrar solamente la cantidad total de una materia prima.
Imaginemos que tenemos 10 litros de un aceite, pero distribuidos en dos lotes:
| Lote | Cantidad | Vencimiento |
|---|---|---|
| ACE-001 | 4 litros | 20/11/2026 |
| ACE-002 | 6 litros | 15/03/2027 |
Aunque el inventario total sea de 10 litros, no toda la materia prima tiene la misma prioridad de utilización.
Por eso es necesario registrar cada lote por separado.
La automatización puede identificar tres situaciones:
Lotes que todavía están dentro del plazo normal de utilización.
Lotes próximos a vencer que requieren atención.
Lotes cuya fecha de vencimiento ya pasó y deben bloquearse para su uso hasta que se determine su disposición.
No basta con enviar un aviso: también es importante que el personal pueda identificar físicamente cada lote.
5. Aplicar el método FEFO para reducir pérdidas
<badge color="success">Estrategia recomendada</badge>
FEFO corresponde a First Expired, First Out, que significa «primero en vencer, primero en salir».
Este método establece que debe utilizarse primero el lote cuya fecha de vencimiento sea más cercana, siempre que se encuentre dentro de su período permitido de uso.
Es diferente del método FIFO (First In, First Out), que prioriza el lote que ingresó primero al almacén.
La diferencia es importante porque un material recibido más recientemente puede tener una fecha de vencimiento anterior a otro que lleva más tiempo almacenado.
Ejemplo de aplicación
| Lote | Recepción | Vencimiento | Prioridad |
|---|---|---|---|
| Lote A | 01/09/2026 | 20/11/2026 | Primera |
| Lote B | 15/10/2026 | 15/03/2027 | Segunda |
| Lote C | 20/10/2026 | 30/06/2027 | Tercera |
El sistema debería ordenar los lotes por fecha de vencimiento y sugerir la utilización del Lote A antes que los demás.
La documentación de Odoo explica cómo aplicar FEFO mediante la identificación de lotes, fechas de vencimiento y fechas límite de retirada. https://www.odoo.com/documentation/master/applications/inventory_and_mrp/inventory/shipping_receiving/removal_strategies/fefo.html
Una precaución: FEFO no autoriza utilizar un material vencido. Los lotes vencidos deben quedar identificados y separados de las existencias disponibles, siguiendo los procedimientos de calidad y seguridad correspondientes.
6. Crear alertas automáticas de reposición y vencimiento
Aquí comienza la parte más interesante del sistema.
Una vez que la información está organizada, un programa puede consultar la base de datos y comparar las existencias y fechas con las reglas establecidas.
Podemos definir dos tipos de alertas.
Alerta de reposición
Se genera cuando el inventario utilizable es igual o inferior al punto de reposición.
Alerta de vencimiento
Se genera cuando un lote se encuentra dentro del período de anticipación definido para recibir un aviso.
Por ejemplo:
30 días antes: alerta preventiva.
15 días antes: alerta prioritaria.
Fecha de vencimiento superada: identificación de lote vencido y bloqueo de utilización.
Los plazos deben adaptarse al tipo de materia prima y a las recomendaciones del proveedor.
¿Cómo funciona el proceso?
Inicio|vConsultar la base de datos|vCalcular stock utilizable|v¿Stock <= punto de reposición?| SívGenerar alerta de compra|vConsultar fechas de los lotes|v¿Lote próximo a vencer?| SívGenerar alerta de vencimiento|vMostrar resultados
El programa puede ejecutarse una vez al día o con la frecuencia que necesite el negocio.
7. Ejemplo de automatización con Python
Para demostrar cómo funciona, utilizaremos Python y SQLite.
El siguiente script consulta la base de datos, calcula el punto de reposición y revisa los lotes próximos a vencer.
No requiere instalar bibliotecas externas: utiliza módulos incluidos en Python.
import sqlite3from datetime import date, timedeltaDB = "inventario.db"hoy = date.today()with sqlite3.connect(DB) as conexion:conexion.execute("PRAGMA foreign_keys = ON")conexion.row_factory = sqlite3.Row# Consultar materias primas y calcular stock utilizablemateriales = conexion.execute("""SELECTm.id,m.nombre,m.unidad,m.consumo_diario,m.plazo_entrega,m.stock_seguridad,COALESCE(SUM(CASEWHEN l.estado = 'disponible'AND l.fecha_vencimiento >= ?THEN l.cantidad_disponibleELSE 0END), 0) AS stock_actualFROM materias_primas mLEFT JOIN lotes lON l.materia_id = m.idGROUP BY m.id""", (hoy.isoformat(),)).fetchall()print("\n=== ALERTAS DE REPOSICIÓN ===")for material in materiales:punto_reposicion = (material["consumo_diario"]* material["plazo_entrega"]+ material["stock_seguridad"])stock = material["stock_actual"]if stock <= punto_reposicion:print(f"REPOSICIÓN: {material['nombre']} | "f"Stock: {stock} {material['unidad']} | "f"Punto de reposición: "f"{punto_reposicion:.2f}")# Consultar lotes próximos a vencerlotes = conexion.execute("""SELECTm.nombre AS material,m.unidad,m.dias_alerta,l.codigo_lote,l.fecha_vencimiento,l.cantidad_disponibleFROM lotes lJOIN materias_primas mON m.id = l.materia_idWHERE l.estado = 'disponible'AND l.cantidad_disponible > 0ORDER BY l.fecha_vencimiento""").fetchall()print("\n=== ALERTAS DE VENCIMIENTO ===")for lote in lotes:vencimiento = date.fromisoformat(lote["fecha_vencimiento"])dias_restantes = (vencimiento - hoy).daysif dias_restantes < 0:print(f"LOTE VENCIDO: {lote['material']} | "f"Lote: {lote['codigo_lote']} | "f"Vencido hace {abs(dias_restantes)} días")elif dias_restantes <= lote["dias_alerta"]:print(f"PRÓXIMO A VENCER: {lote['material']} | "f"Lote: {lote['codigo_lote']} | "f"Vence en {dias_restantes} días")print("\nControl de inventario finalizado.")
¿Qué hace este programa?
Abre el archivo de la base de datos.
Consulta las materias primas registradas.
Calcula las existencias utilizables, excluyendo lotes vencidos o en cuarentena.
Calcula el punto de reposición de cada material.
Genera un aviso cuando el stock alcanza el umbral.
Revisa las fechas de vencimiento de los lotes disponibles.
Informa cuáles están próximos a vencer y cuáles ya vencieron.
El programa muestra los avisos en pantalla. Es un ejemplo didáctico: para utilizarlo en un negocio real hay que completar la carga de datos, registrar correctamente las entradas y salidas, y definir cómo se gestionarán las notificaciones.
8. Webhooks: conectar el inventario con otras aplicaciones
Además de ejecutar un script periódicamente, es posible utilizar webhooks para comunicar el sistema de inventario con otras herramientas.
Un webhook es un mecanismo que permite enviar información automáticamente cuando ocurre un evento determinado.
Por ejemplo:
Cuando el stock cae por debajo del punto de reposición, se envía un aviso.
Cuando se registra un lote próximo a vencer, se notifica al responsable.
Cuando se confirma una compra, se actualiza el estado de reposición.
Ejemplo de flujo de trabajo
Base de datos|vDetectar evento|vGenerar notificación|vWebhook|vAplicación receptora|vCorreo / Panel / Mensajería
Una aplicación receptora podría ser un panel de control, un sistema de correo o una plataforma de automatización.
Es importante diferenciar ambos mecanismos:
Script programado: consulta la información en intervalos definidos.
Webhook: transmite un evento cuando se produce una condición o cambio.
Para un taller pequeño, comenzar con un script diario suele ser suficiente. Los webhooks pueden incorporarse cuando se necesitan integraciones y notificaciones más inmediatas.
Seguridad de los webhooks
Los webhooks deben protegerse. No conviene dejar una dirección de recepción abierta y sin controles.
Entre las medidas recomendadas se encuentran:
Verificar las firmas digitales de los mensajes.
Utilizar HTTPS.
Validar los datos recibidos.
Evitar procesar dos veces un mismo evento.
Limitar la cantidad de solicitudes.
No almacenar contraseñas ni secretos en el código fuente.
OWASP recomienda controles como HMAC-SHA256, protección contra repetición de eventos e idempotencia para evitar que una misma notificación produzca acciones duplicadas. https://cheatsheetseries.owasp.org/cheatsheets/Webhook_Security_Cheat_Sheet.html
9. Cómo organizar el trabajo diario del taller
Un sistema de inventario solamente funciona bien cuando la información se mantiene actualizada.
Por eso es conveniente establecer un procedimiento sencillo.
Al recibir una materia prima:
Registrar el proveedor.
Identificar el producto.
Registrar el código de lote.
Anotar la fecha de recepción.
Cargar la fecha de vencimiento.
Registrar la cantidad recibida.
Al utilizar una materia prima:
Consultar los lotes disponibles.
Aplicar el criterio FEFO.
Registrar la cantidad consumida.
Actualizar las existencias.
Conservar el historial del movimiento.
Al finalizar el día:
Ejecutar el control automatizado.
Revisar las alertas de reposición.
Identificar los lotes próximos a vencer.
Preparar las compras necesarias.
Investigar cualquier diferencia importante entre el inventario físico y el digital.
Es recomendable que las salidas se registren mediante movimientos de inventario, en lugar de modificar cantidades manualmente sin dejar constancia. De esta forma se puede reconstruir el historial de cada material.
10. Seguridad, respaldos y mantenimiento
Un inventario digital contiene información importante para el funcionamiento del negocio. Perder esos datos puede provocar compras innecesarias, interrupciones de producción y dificultades para reconstruir los movimientos.
Por eso es necesario establecer medidas básicas:
Copias de seguridad: programar respaldos periódicos de la base de datos y conservar copias en una ubicación independiente.
Acceso restringido: cada usuario debe disponer únicamente de los permisos que necesita.
Actualizaciones: mantener Python, las aplicaciones y los componentes utilizados en versiones seguras.
Protección de credenciales: no incluir contraseñas ni claves de servicios externos directamente en los scripts.
Pruebas de recuperación: comprobar que los respaldos pueden restaurarse correctamente.
Auditoría de movimientos: registrar quién realizó cada entrada, salida o modificación importante.
Para un taller que utiliza SQLite, esta solución puede funcionar muy bien como prototipo o sistema local. Si el negocio crece y necesita varios usuarios trabajando simultáneamente, acceso remoto o integraciones más complejas, puede ser conveniente migrar a PostgreSQL u otra base de datos cliente-servidor.
11. Ejemplo de aplicación en un emprendimiento artesanal
Imaginemos un pequeño taller que fabrica jabones artesanales y trabaja con diferentes materias primas:
Glicerina.
Aceite de coco.
Aceites vegetales.
Esencias.
Colorantes.
Envases y etiquetas.
El sistema registra cada ingreso, identifica los lotes y controla sus fechas de vencimiento.
Cuando el aceite de coco alcanza el punto de reposición, el programa genera un aviso para iniciar la compra.
Al mismo tiempo, si una esencia tiene un lote próximo a vencer, el responsable recibe una notificación para revisar su utilización y planificar la producción, siempre respetando las condiciones de calidad y seguridad del producto.
Con esta información el emprendimiento puede:
Evitar interrupciones por falta de materias primas.
Reducir pérdidas por vencimiento.
Mejorar la planificación de compras.
Conocer el consumo de cada insumo.
Identificar materiales de mayor rotación.
Mantener un historial de los lotes utilizados.
El resultado es una gestión más ordenada y una mayor capacidad para anticiparse a los problemas.
Un inventario inteligente empieza con buenos datos
Automatizar el inventario no significa instalar un sistema costoso ni incorporar tecnología compleja desde el primer día.
Un pequeño taller puede comenzar con una base de datos sencilla, registros de lotes y un script que revise periódicamente las existencias y fechas de vencimiento.
A medida que las necesidades aumenten, se pueden incorporar paneles de control, notificaciones, webhooks y herramientas de gestión más avanzadas.
La clave está en registrar correctamente las entradas y salidas, controlar cada lote y establecer reglas claras para generar alertas.
La automatización permite pasar de una gestión reactiva —comprar cuando algo se termina o descubrir tarde que un insumo venció— a una gestión preventiva, basada en información y anticipación.
En un pequeño negocio, evitar una parada de producción o recuperar una materia prima que estaba a punto de vencer también es una forma concreta de mejorar la rentabilidad.

Comentarios
Publicar un comentario