Modulo preperación de quimicos - chemicalPreparation
Propósito
Registra y gestiona preparaciones de productos químicos para plantas de tratamiento, actualizando inventario por lotes, y emitiendo notificaciones cuando el inventario es insuficiente o está por debajo del mínimo.
Dónde se usa
- Rutas:
src/routes/v1/chemicalPreparation/chemicalPreparation.tsregistradas ensrc/routes/v1/index.ts. - Controlador:
src/controllers/chemicalPreparation/chemicalPreparationController.ts. - Modelo:
src/models/chemicalPreparation.tse interfazsrc/interfaces/IChemicalPreparation/IChemicalPreparation.ts. - Integraciones:
ChemicalProduct(inventario y lotes),NotifyManager(notificaciones),TreatmentPlant,User.
Endpoints
POST
/chemical-preparation- Middlewares:
validateJwt,tenantMiddleware,validateFunctionalityPermission(FUNCTIONALITIES.SETTING_DOSING_CREATION),chemicalPreparationValidator. - Crea un registro de preparación y descuenta inventario por lotes del producto químico indicado.
- Emite notificaciones de inventario insuficiente o bajo inventario según corresponda.
- Middlewares:
GET
/chemical-preparations- Middlewares:
validateJwt,tenantMiddleware,validateFunctionalityPermission(FUNCTIONALITIES.SETTING_DOSING_LIST). - Lista preparaciones con datos poblados de producto, usuario y planta.
- Middlewares:
GET
/chemical-preparation/:id- Detalle de una preparación con datos poblados.
GET
/chemical-preparation-by-plant/:treatmentPlantId- Lista preparaciones asociadas a una planta específica.
Datos principales (IChemicalPreparation)
treatmentPlantId: ObjectId de la planta.chemicalProductId: ObjectId del producto químico.quantityToPrepare: cantidad a preparar.units: unidades (validadas porvalidUnits).preparedBy: usuario que preparó.preparedAt: fecha de preparación (por defectoDate.nowen el modelo si no se envía).status:PREPARED|CANCELLED(por defectoPREPARED).notes: notas libres.state:active|inactive(segúnvalidState).
Nota: el arreglo lotsUsed existe a nivel de interfaz pero está temporalmente oculto en el esquema del modelo.
Flujo de creación (POST /chemical-preparation)
- Selección de modelos por tenant: usa conexión multitenant (
getModel) sireq.dbConnectionexiste; de lo contrario usa modelos globales. - Validación de producto e inventario:
- Busca
ChemicalProductporchemicalProductId. - Si
availableQuantity <= 0oquantityToPrepare <= 0, responde 400 y puede generar notificaciónnoInventory(ver notificaciones).
- Busca
- Descuento por lotes:
- Usa
helpers/deductFromLots/distributeQuantitypara distribuir la cantidad requerida (quantityToPrepare) comenzando por los lotes con fecha de expiración más cercana. - Actualiza cada lote con su nueva
quantitymedianteupdateOnepor_iddel subdocumento del lote. - Recalcula y actualiza
availableQuantitydel producto a partir de la suma de los lotes resultantes; también refrescalastUpdated. - Si la cantidad total por lotes no alcanza (remainingQuantity > 0), responde 400.
- Usa
- Notificación de inventario bajo (lowInventory):
- Si el nuevo
availableQuantityes menor o igual aminQuantity, crea notificación para rolesSUPERVISOR/OPERADOR.
- Si el nuevo
- Creación del registro:
- Inserta el documento
ChemicalPreparationcon elbodyoriginal. - Responde 201 con el documento creado.
- Inserta el documento
Reglas de negocio de inventario (distributeQuantity)
- Ordena los lotes por
expirationDateascendente. - Descuenta de cada lote lo necesario hasta cumplir la cantidad a preparar, respetando cantidades disponibles.
- Retorna
updatedInventory(lotes con su nuevaquantity) yremainingQuantity(cantidad faltante si no alcanza el inventario total).
Notificaciones
- Se usa
createNotifyManagerdel controladornotifyManagerControllerpara persistir notificaciones en el tenant actual (si aplica). - Tipos relevantes en este flujo:
noInventory: cuando no hay inventario suficiente para preparar. Mensaje generado con mapeo de nombre de químico (chemicalNameMapping).lowInventory: cuandoavailableQuantityqueda por debajo del mínimo configurado.
- Reglas por rol:
TREEA_ADMIN: no genera notificaciones en estos casos.SUPERVISORoOPERADOR: se crea la notificación en la BD del cliente.
Validaciones de entrada
Validator src/validators/chemicalPreparation.ts (express-validator):
- Requeridos:
treatmentPlantId,chemicalProductId,quantityToPrepare,units,preparedBy,preparedAt.
Seguridad y permisos
- Autenticación JWT (
validateJwt). - Contexto tenant (
tenantMiddleware) para enrutar a la conexión de BD del cliente. - Permisos por funcionalidad (
validateFunctionalityPermission):- Crear:
FUNCTIONALITIES.SETTING_DOSING_CREATION. - Listar/consultar:
FUNCTIONALITIES.SETTING_DOSING_LIST.
- Crear:
Relación con dosificación (Setting Dosing)
- La preparación registra el acto de preparar cierta cantidad de un producto antes o durante la operación de dosificación.
- El descuento de inventario por lotes asegura coherencia con la disponibilidad de producto usada en la dosificación.
- Las notificaciones
noInventory/lowInventoryayudan a anticipar faltantes que impactarían la continuidad de la dosificación.
Consideraciones de diseño
- Multitenancy: todos los accesos a modelos soportan
req.dbConnectionpara aislar datos por cliente. - Consistencia de inventario: el
availableQuantityse deriva de la suma de lotes actualizados para evitar desalineación. - Precisión numérica: se usa
Decimal.jspara operaciones de resta/suma de cantidades. - Mapeo de nombres:
chemicalNameMappingestandariza el nombre en mensajes de notificación.
Ejemplos de uso (request minimos)
POST /chemical-preparation
json
{
"treatmentPlantId": "<ObjectId>",
"chemicalProductId": "<ObjectId>",
"quantityToPrepare": 120.5,
"units": "L",
"preparedBy": "<ObjectId usuario>",
"preparedAt": "2025-10-06T12:00:00.000Z",
"notes": "Preparación para turno tarde"
}GET /chemical-preparations
- Respuesta incluye
chemicalProductId,preparedBy,treatmentPlantIdpoblados con campos básicos.
Posibles errores y respuestas
- 400: inventario insuficiente para la cantidad a preparar.
- 400: inventario no positivo o cantidad a preparar no válida.
- 500: error interno (por ejemplo, producto no encontrado, fallos de BD).
Archivos clave
- Controlador:
src/controllers/chemicalPreparation/chemicalPreparationController.ts - Modelo:
src/models/chemicalPreparation.ts - Interfaz:
src/interfaces/IChemicalPreparation/IChemicalPreparation.ts - Rutas:
src/routes/v1/chemicalPreparation/chemicalPreparation.tsy registro ensrc/routes/v1/index.ts - Lógica de lotes:
src/helpers/deductFromLots/distributeQuantity.ts - Notificaciones:
src/controllers/notifyManagerController.ts - Validator:
src/validators/chemicalPreparation.ts
Pendiente
- Habilitar
lotsUseden el modelo para auditar qué lotes se consumieron por preparación.