API RESTful desarrollada con Spring Boot 3 y Java 21 para la gestión eficiente de inventarios y productos (Kardex). Este servicio permite administrar el ciclo de vida de los productos, controlar el stock (entradas y salidas), generar alertas de stock bajo y exportar datos para reportes.
- Lenguaje: Java 21 (LTS)
- Framework: Spring Boot (Web, Data JPA)
- Base de Datos: MySQL 8.0
- Herramientas de Build: Maven
- Contenerización: Docker & Docker Compose
- Utilidades: Lombok
- Entorno de Ejecución: Eclipse Temurin (JRE 21)
Asegúrate de tener instalado lo siguiente si vas a ejecutar el proyecto localmente sin Docker:
- Java JDK 21
- Maven
Si prefieres usar contenedores (recomendado):
- Docker Desktop
El proyecto utiliza variables de entorno para la conexión a la base de datos. Debes configurar un archivo .env en la raíz del proyecto (especialmente para Docker Compose) o configurar estas variables en tu IDE.
Variables requeridas:
| Variable | Descripción | Valor por Defecto (Docker) |
|---|---|---|
| MYSQL_HOST | Host de la base de datos | db (nombre del servicio en compose) o localhost |
| MYSQL_PORT | Puerto de la base de datos | 3306 |
| MYSQL_DATABASE | Nombre de la BD | producto_db (ejemplo) |
| MYSQL_USER | Usuario de la BD | root |
| MYSQL_PASSWORD | Contraseña de la BD | secret |
Esta opción levanta tanto la API como la base de datos MySQL automáticamente.
- Crea un archivo
.enven la raíz con tus credenciales (opcional si ya están en el compose). - Ejecuta el siguiente comando:
docker-compose up -d --buildLa API estará disponible en: http://localhost:8082
Asegúrate de tener una base de datos MySQL corriendo.
- Configura las variables de entorno en tu terminal o IDE, o edita
src/main/resources/application.propertiestemporalmente. - Ejecuta el proyecto con Maven Wrapper:
./mvnw spring-boot:runLa API expone los siguientes endpoints bajo el prefijo /api/kardex.
Retorna la lista completa de productos con su estado actual.
- Método: GET
- URL:
/api/kardex/products
Respuesta Exitosa (200 OK):
[
{
"id": 1,
"code": "P001",
"name": "Laptop Gamer",
"unit": "UNIDAD",
"category": "Electrónica",
"stock": 10,
"minStock": 2,
"status": "OK",
"lastUpdated": "2023-10-27T10:00:00"
}
]Registra un nuevo producto en el inventario.
- Método: POST
- URL:
/api/kardex/products
Cuerpo (JSON):
{
"code": "P001",
"name": "Laptop Gamer",
"unit": "UNIDAD",
"category": "Electrónica",
"stock": 10,
"minStock": 2
}Permite crear múltiples productos en una sola petición.
- Método: POST
- URL:
/api/kardex/products/batch
Cuerpo (JSON Array):
[
{ "code": "A1", "name": "Prod A", "unit": "U", "category": "Cat1", "stock": 100, "minStock": 10 },
{ "code": "B2", "name": "Prod B", "unit": "U", "category": "Cat1", "stock": 50, "minStock": 5 }
]Actualiza el stock de un producto (Entrada o Salida).
-
Método: PUT
-
URL:
/api/kardex/products/{id}/movement -
Parámetros (Query Params):
type: IN (Entrada) o OUT (Salida)qty: Cantidad a mover (Entero)reason: Razón del movimiento (Texto)
Ejemplo:
/api/kardex/products/1/movement?type=OUT&qty=2&reason=Venta
Obtiene productos cuyo stock es menor o igual al stock mínimo configurado.
- Método: GET
- URL:
/api/kardex/alerts
Obtiene la data formateada específicamente para ser exportada a reportes de Excel.
- Método: GET
- URL:
/api/kardex/reports/excel-data
Respuesta Ejemplo:
[
{
"codigoBarras": "P001",
"producto": "Laptop Gamer",
"categoria": "Electrónica",
"unidad": "UNIDAD",
"cantidadActual": 10,
"estadoInventario": "NORMAL",
"fechaUltimoMovimiento": "27/10/2023 10:00"
}
]El proyecto sigue una arquitectura en capas clásica:
src/main/java/studios/tkoh/producto_manager
├── config/ # Configuraciones (CORS, etc.)
├── controller/ # Controladores REST (Endpoints)
├── dto/ # Data Transfer Objects (Request/Response)
├── model/ # Entidades JPA (Base de datos)
├── repository/ # Interfaces Repository (Acceso a datos)
├── service/ # Lógica de negocio
│ └── impl/ # Implementación de servicios
└── ProductoManagerApplication.java # Clase principal
El proyecto incluye un Dockerfile optimizado en dos etapas (Multi-stage build):
- Build Stage: Usa una imagen de Maven para compilar el proyecto y descargar dependencias.
- Production Stage: Usa una imagen ligera JRE (
eclipse-temurin:21-jre-jammy) para ejecutar la aplicación, creando un usuario sin privilegios por seguridad.
🛠️ Desarrollado con 💙 por Studios TKOH