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:

[
PR=(CD\times TE)+SS
]

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.

[
PR=(2\times5)+4=14\ 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

CampoDescripción
idIdentificador único
nombreNombre del material
unidadLitros, kilos, unidades
consumo_diarioConsumo promedio
plazo_entregaDías de entrega
stock_seguridadReserva adicional
dias_alertaAnticipación para alertar vencimientos

Tabla de lotes

CampoDescripción
idIdentificador del lote
materia_idReferencia a la materia prima
codigo_loteCódigo del proveedor
fecha_recepcionDía de ingreso
fecha_vencimientoFecha de vencimiento
cantidad_disponibleCantidad actual
estadoDisponible, 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 0
CHECK (consumo_diario >= 0),
plazo_entrega INTEGER NOT NULL DEFAULT 0
CHECK (plazo_entrega >= 0),
stock_seguridad REAL NOT NULL DEFAULT 0
CHECK (stock_seguridad >= 0),
dias_alerta INTEGER NOT NULL DEFAULT 30
CHECK (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 NULL
CHECK (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:

LoteCantidadVencimiento
ACE-0014 litros20/11/2026
ACE-0026 litros15/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:

  1. Lotes que todavía están dentro del plazo normal de utilización.

  2. Lotes próximos a vencer que requieren atención.

  3. 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

LoteRecepciónVencimientoPrioridad
Lote A01/09/202620/11/2026Primera
Lote B15/10/202615/03/2027Segunda
Lote C20/10/202630/06/2027Tercera

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
|
v
Consultar la base de datos
|
v
Calcular stock utilizable
|
v
¿Stock <= punto de reposición?
| Sí
v
Generar alerta de compra
|
v
Consultar fechas de los lotes
|
v
¿Lote próximo a vencer?
| Sí
v
Generar alerta de vencimiento
|
v
Mostrar 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 sqlite3
from datetime import date, timedelta
DB = "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 utilizable
materiales = conexion.execute("""
SELECT
m.id,
m.nombre,
m.unidad,
m.consumo_diario,
m.plazo_entrega,
m.stock_seguridad,
COALESCE(SUM(
CASE
WHEN l.estado = 'disponible'
AND l.fecha_vencimiento >= ?
THEN l.cantidad_disponible
ELSE 0
END
), 0) AS stock_actual
FROM materias_primas m
LEFT JOIN lotes l
ON l.materia_id = m.id
GROUP 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 vencer
lotes = conexion.execute("""
SELECT
m.nombre AS material,
m.unidad,
m.dias_alerta,
l.codigo_lote,
l.fecha_vencimiento,
l.cantidad_disponible
FROM lotes l
JOIN materias_primas m
ON m.id = l.materia_id
WHERE l.estado = 'disponible'
AND l.cantidad_disponible > 0
ORDER BY l.fecha_vencimiento
""").fetchall()
print("\n=== ALERTAS DE VENCIMIENTO ===")
for lote in lotes:
vencimiento = date.fromisoformat(
lote["fecha_vencimiento"]
)
dias_restantes = (vencimiento - hoy).days
if 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?

  1. Abre el archivo de la base de datos.

  2. Consulta las materias primas registradas.

  3. Calcula las existencias utilizables, excluyendo lotes vencidos o en cuarentena.

  4. Calcula el punto de reposición de cada material.

  5. Genera un aviso cuando el stock alcanza el umbral.

  6. Revisa las fechas de vencimiento de los lotes disponibles.

  7. 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
|
v
Detectar evento
|
v
Generar notificación
|
v
Webhook
|
v
Aplicación receptora
|
v
Correo / 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:

  1. Registrar el proveedor.

  2. Identificar el producto.

  3. Registrar el código de lote.

  4. Anotar la fecha de recepción.

  5. Cargar la fecha de vencimiento.

  6. Registrar la cantidad recibida.

Al utilizar una materia prima:

  1. Consultar los lotes disponibles.

  2. Aplicar el criterio FEFO.

  3. Registrar la cantidad consumida.

  4. Actualizar las existencias.

  5. Conservar el historial del movimiento.

Al finalizar el día:

  1. Ejecutar el control automatizado.

  2. Revisar las alertas de reposición.

  3. Identificar los lotes próximos a vencer.

  4. Preparar las compras necesarias.

  5. 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

Entradas más populares de este blog

Imagina cómo sería la vida sin tecnología.

Mejor software de gestión de proyectos en 2026: precios y comparativa

Por qué no me preocupa que la IA nos mate a todos: riesgos reales de la inteligencia artificial