Este repositorio contiene una aplicación de escritorio desarrollada en Java (AWT/Swing) para la gestión de inventarios basada en lotes y fechas de vencimiento.
El sistema implementa principalmente la lógica FEFO (First Expired, First Out) —una extensión práctica del modelo FIFO— priorizando la salida de productos próximos a caducar para reducir mermas y optimizar la rotación de stock.
Este proyecto corresponde al proyecto final de la asignatura Programación Orientada a Objetos (POO) y fue diseñado para demostrar la aplicación práctica de conceptos de diseño orientado a objetos, arquitectura en capas, persistencia con bases de datos relacionales y reglas de negocio reales.
A diferencia de un inventario tradicional que solo maneja cantidades totales, este sistema gestiona lotes individuales, permitiendo un control detallado de cada producto:
-
Entradas por Lote
Registro de nuevos productos con identificación de lote, fecha de vencimiento, cantidad y costo. -
Lógica FEFO / FIFO
El sistema sugiere y prioriza automáticamente el retiro del lote más próximo a vencer, respetando el orden de ingreso cuando las fechas son equivalentes. -
Control de Caducidad
Visualización explícita de:- productos vencidos
- productos próximos a vencer
- stock disponible priorizado
-
Autenticación de Usuarios
Sistema de login con roles (Administrador / Empleado) gestionados desde la base de datos. -
Entradas (Compras)
Registro detallado de ingresos de stock: proveedor, lote, fecha de vencimiento, cantidad y costo. -
Salidas (Ventas / Retiros / Merma)
Descuento inteligente de stock.
Al solicitar una cantidad, el sistema debita automáticamente de los lotes correspondientes siguiendo la prioridad FEFO. -
Alertas Visuales
Indicadores para:- lotes vencidos
- productos próximos a vencer
- stock bajo
-
Reportes
Historial de movimientos de entradas y salidas para control y trazabilidad.
El proyecto sigue una arquitectura en capas, separando claramente la interfaz de usuario, la lógica de negocio y el acceso a datos.
- Lenguaje: Java 20
- Interfaz de Usuario: Java Swing (JFrames, JDialogs)
- Base de Datos: MySQL 8.0+
- Acceso a Datos: JDBC (Java Database Connectivity)
- Gestión de Construcción: Apache Ant
-
src/Class
Contiene la lógica de negocio y acceso a datos:Conexion.java: Utilidad / Singleton para la gestión de la conexión JDBC.Entradas.java,Salidas.java,Productos.java:
Implementan las reglas de negocio (cálculo de stock, validaciones, lógica FEFO).
-
src/View
Interfaz gráfica:frm_Login.java: Punto de entrada de la aplicación.- Formularios y diálogos para gestión del sistema.
-
src/OtherScript.sql: Script de creación y carga inicial de la base de datos.
-
config- Archivos de configuración externos (
db.properties).
- Archivos de configuración externos (
- JDK 20 o superior
- MySQL Server en ejecución
- NetBeans IDE (opcional, recomendado para edición de UI)
A diferencia de un inventario tradicional que solo cuenta cantidades, este sistema controla lotes individuales con sus fechas de vencimiento. Cuando se realiza una venta, automáticamente descuenta del lote más próximo a vencer.
- Entradas: Registro de compras con proveedor, costo, lote y fecha de vencimiento
- Salidas: Descuento automático desde los lotes que vencen primero
- Alertas: Notificaciones de productos con stock bajo o lotes vencidos
- Reportes: Historial de entradas y salidas
- Autenticación: Control de usuarios con roles (Administrador/Empleado)
- Java 20 - Lenguaje principal
- Java Swing - Interfaz gráfica
- MySQL 8.0+ - Base de datos
- JDBC - Conexión a base de datos
- Apache Ant - Compilación
- Java JDK 20 o superior
- MySQL Server 8.0+
- NetBeans (opcional)
Descarga estos archivos JAR y colócalos en la carpeta lib/:
JCalendar 1.4
- Link: https://sourceforge.net/projects/agendaj/files/lib/jcalendar-1.4.jar/download
- Archivo:
jcalendar-1.4.jar
MySQL Connector/J 8.0.33
- Link: https://downloads.mysql.com/archives/c-j/
- Archivo:
mysql-connector-j-8.0.33.jar
Nota: Las librerías externas no se incluyen en el repositorio para mantener buenas prácticas de versionado.
Ejecuta el script SQL:
mysql -u root -p < src/Other/Script.sqlEsto crea la base de datos supermercado y las tablas necesarias.
Edita el archivo config/db.properties:
db.name=supermercado
db.url=jdbc:mysql://localhost:3306/supermercado
db.user=root
db.password=tu_contraseñaDesde NetBeans:
- Abrir proyecto
- Ejecutar
frm_Login.java
Desde terminal:
ant runsrc/
├── Class/ # Lógica de negocio
│ ├── Conexion.java # Gestión de BD
│ ├── Productos.java
│ ├── Entradas.java
│ └── Salidas.java
│
├── View/ # Interfaz gráfica
│ ├── frm_Login.java
│ ├── frm_Principal.java
│ ├── frm_Entradas.java
│ └── frm_Salidas.java
│
└── Other/
└── Script.sql # Base de datos
config/
└── db.properties # Configuración
lib/ # Librerías externas
├── jcalendar-1.4.jar
└── mysql-connector-j-8.0.33.jar
Las conexiones a la base de datos y la lógica de negocio están protegidas. Solo se exponen métodos públicos necesarios.
public class Conexion {
private static Connection conexion; // Privado
public static Connection establecerConexion() { // Público
// Lógica protegida
}
}Separación clara entre capas: la interfaz gráfica no conoce detalles de SQL, solo trabaja con objetos.
Cada clase tiene una responsabilidad única. Cambios en la lógica de negocio no afectan la interfaz.
Cuando se solicita una salida de 50 unidades y hay:
- Lote A: 30 unidades (vence el 15/01)
- Lote B: 40 unidades (vence el 22/01)
El sistema automáticamente:
- Descuenta 30 del Lote A (queda en 0)
- Descuenta 20 del Lote B (quedan 20)





