From a3f072a46910c9f195873c840ce940558304da78 Mon Sep 17 00:00:00 2001
From: Agustin Ruiz Diaz <agustin.ruiz.diaz@fing.edu.uy>
Date: Thu, 28 Oct 2021 21:11:38 -0300
Subject: [PATCH] Audit message fix.

Specific parameter messages depending on it's nature which are generated by ParameterService.
---
 src/Controllers/ParameterController.ts | 15 +++---
 src/Services/ParameterService.ts       | 69 ++++++++++++++++++++------
 2 files changed, 62 insertions(+), 22 deletions(-)

diff --git a/src/Controllers/ParameterController.ts b/src/Controllers/ParameterController.ts
index c15ca26..11a151c 100644
--- a/src/Controllers/ParameterController.ts
+++ b/src/Controllers/ParameterController.ts
@@ -47,29 +47,30 @@ const getDefaultExtraData: Handler = async (req: Request, res: Response) => {
 
 const updateParameterValue: Handler = async (req: Request, res: Response) => {
   const { parameters } = req.body;
+  let auditoria: string;
   try {
     switch (parameters[0].parameterType) {
       case ParameterType.DefaultWeight:
-        await ParameterService.updateDefaultWeight(parameters[0]);
+        auditoria = await ParameterService.updateDefaultWeight(parameters[0]);
         break;
       case ParameterType.MinorPAL:
       case ParameterType.AdultPAL:
       case ParameterType.Maternity:
-        await ParameterService.updateExtraData(parameters);
+        auditoria = await ParameterService.updateExtraData(parameters);
         break;
       case ParameterType.TEE:
-        await ParameterService.updateTEE(parameters);
+        auditoria = await ParameterService.updateTEE(parameters);
         break;
       case ParameterType.BMR:
-        await ParameterService.updateBMR(parameters);
+        auditoria = await ParameterService.updateBMR(parameters);
         break;
       case ParameterType.GrowthEnergy:
-        await ParameterService.updateGrowthEnergy(parameters[0]);
+        auditoria = await ParameterService.updateGrowthEnergy(parameters[0]);
         break;
       default:
-        break;
+        throw new Error('Invalid parameter type');
     }
-    audit(req, `Cambió el parametro ${parameters[0].parameterType} a ${parameters[0].value} para ${parameters[0].sex} ${parameters[0].ageRang} `);
+    audit(req, auditoria);
     return res.status(200).send();
   } catch (error) {
     const e = error as Error;
diff --git a/src/Services/ParameterService.ts b/src/Services/ParameterService.ts
index 6fc7e66..f40fe0d 100644
--- a/src/Services/ParameterService.ts
+++ b/src/Services/ParameterService.ts
@@ -10,6 +10,7 @@ import DefaultWeight from '../Models/DefaultWeight';
 import DefaultWeightDTO from '../DTOs/DefaultWeightDTO';
 import ParameterWrapperDTO from '../DTOs/ParameterWrapperDTO';
 import { extraDataIDs } from '../Config/Constants';
+import ParameterType from '../Enum/ParameterType';
 
 const pushExtraData = (rows: DefaultExtraData[], arr: number[]): void => {
   rows.forEach((row: DefaultExtraData) => {
@@ -196,7 +197,7 @@ const getParameters = async (): Promise<ParameterWrapperDTO> => {
   return res;
 };
 
-const updateGrowthEnergy = async (parameter: EquationConstantDTO): Promise<void> => {
+const updateGrowthEnergy = async (parameter: EquationConstantDTO): Promise<string> => {
   await EquationConstant.update(
     { value: parameter.value },
     {
@@ -214,9 +215,10 @@ const updateGrowthEnergy = async (parameter: EquationConstantDTO): Promise<void>
   }).catch((err) => {
     throw err;
   });
+  return `Cambió la energia de crecimiento a "${parameter.value}" para individuos de sexo ${parameter.sex} de ${parameter.ageRange}`;
 };
 
-const updateBMR = async (parameters: EquationConstantDTO[]): Promise<void> => {
+const updateBMR = async (parameters: EquationConstantDTO[]): Promise<string> => {
   const sexo: string = parameters[0].sex;
   const edad: string = parameters[0].ageRange;
   const orders: number[] = [];
@@ -237,9 +239,10 @@ const updateBMR = async (parameters: EquationConstantDTO[]): Promise<void> => {
   await EquationConstant.bulkCreate(parameters, {
     updateOnDuplicate: ['value'],
   });
+  return `Cambió la ecuacion TMB a "${parameters[orders.indexOf(0)].value} + ${parameters[orders.indexOf(1)].value}*MP" para individuos de sexo ${parameters[0].sex} de edades en el rango ${parameters[0].ageRange}`;
 };
 
-const updateTEE = async (parameters: EquationConstantDTO[]): Promise<void> => {
+const updateTEE = async (parameters: EquationConstantDTO[]): Promise<string> => {
   const sexo: string = parameters[0].sex;
   const edad: string = parameters[0].ageRange;
   const orders: number[] = [];
@@ -250,8 +253,16 @@ const updateTEE = async (parameters: EquationConstantDTO[]): Promise<void> => {
     if (orders.includes(parameter.order)) {
       throw new Error('Order must be different for all array items.');
     }
+    if (!(parameter.order >= 0 && parameter.order <= 3)) {
+      throw new Error('Order must be between 0 and 3.');
+    }
     orders.push(parameter.order);
   });
+
+  // build audit message
+  let auditMessage = `Cambió la ecuacion GET a "${parameters[orders.indexOf(0)].value} + ${parameters[orders.indexOf(1)].value}*MP`;
+
+  // TEE parameters update
   switch (parameters[0].ageRange) {
     case AgeBracket.m0:
     case AgeBracket.m1:
@@ -275,6 +286,7 @@ const updateTEE = async (parameters: EquationConstantDTO[]): Promise<void> => {
       await EquationConstant.bulkCreate(paramsToUpdate, {
         updateOnDuplicate: ['value'],
       });
+      auditMessage += `" para los individuos de sexo ${parameters[0].sex} de entre 0 a 5 meses`;
       break;
     }
     case AgeBracket.m6:
@@ -299,6 +311,7 @@ const updateTEE = async (parameters: EquationConstantDTO[]): Promise<void> => {
       await EquationConstant.bulkCreate(paramsToUpdate, {
         updateOnDuplicate: ['value'],
       });
+      auditMessage += `" para los individuos de sexo ${parameters[0].sex} de entre 6 a 11 meses`;
       break;
     }
     case AgeBracket.a1:
@@ -334,15 +347,17 @@ const updateTEE = async (parameters: EquationConstantDTO[]): Promise<void> => {
       await EquationConstant.bulkCreate(paramsToUpdate, {
         updateOnDuplicate: ['value'],
       });
+      auditMessage += ` + ${parameters[orders.indexOf(2)].value}*MP^2" para los individuos de sexo ${parameters[0].sex} de entre 1 a 17 años`;
       break;
     }
     default: {
       throw new Error(`Age range ${parameters[0].ageRange} does not have TEE constants.`);
     }
   }
+  return auditMessage;
 };
 
-const updateDefaultWeight = async (parameter: DefaultWeightDTO): Promise<void> => {
+const updateDefaultWeight = async (parameter: DefaultWeightDTO): Promise<string> => {
   await DefaultWeight.update(
     { value: parameter.value },
     {
@@ -358,12 +373,13 @@ const updateDefaultWeight = async (parameter: DefaultWeightDTO): Promise<void> =
   }).catch((err) => {
     throw err;
   });
+  return `Cambió el peso a ${parameter.value} para ${parameter.sex} ${parameter.ageRange}`;
 };
 
-const updatePercentage = async (params: DefaultExtraDataDTO[], total: number): Promise<void> => {
+const updatePercentage = async (params: DefaultExtraDataDTO[], total: number): Promise<string> => {
   if (total === 100) {
     // No se mete en un for porque hay problemas con el await
-    await DefaultExtraData.update(
+    /* await DefaultExtraData.update(
       { value: params[0].value },
       {
         where: {
@@ -413,10 +429,17 @@ const updatePercentage = async (params: DefaultExtraDataDTO[], total: number): P
     });
   } else {
     throw new Error('These percentages must add up to 100.');
+   */
+    DefaultExtraData.bulkCreate(params, {
+      updateOnDuplicate: ['value'],
+    }).catch((err) => {
+      throw err;
+    });
   }
+  return `Cambió los parametros prevalencia de actividad fisica liviana menores a ${params[0].value}, moderada a ${params[1].value} e intensa a ${params[2].value} para menores de entre 6 y 17 años `;
 };
 
-const updatePair = async (param: DefaultExtraDataDTO, pairID: string): Promise<void> => {
+const updatePair = async (param: DefaultExtraDataDTO, pairID: string): Promise<string> => {
   await DefaultExtraData.update(
     { value: param.value },
     {
@@ -447,6 +470,7 @@ const updatePair = async (param: DefaultExtraDataDTO, pairID: string): Promise<v
   }).catch((err) => {
     throw err;
   });
+  return `Cambió los parametros porcentuales ${param.id} y ${pairID} a ${param.value}% y ${100 - param.value}% respectivamente, para adultos`;
 };
 
 const validateID = (id: string): boolean => {
@@ -459,9 +483,10 @@ const validateID = (id: string): boolean => {
   return false;
 };
 
-const updateExtraData = async (parameters: DefaultExtraDataDTO[]): Promise<void> => {
+const updateExtraData = async (parameters: DefaultExtraDataDTO[]): Promise<string> => {
   const ids: string[] = [];
   let total = 0;
+  let auditMessage = '';
 
   parameters.forEach((param: DefaultExtraDataDTO) => {
     ids.push(param.id);
@@ -471,7 +496,7 @@ const updateExtraData = async (parameters: DefaultExtraDataDTO[]): Promise<void>
   if (ids.includes(extraDataIDs.minLowPrev)) {
     if (ids.includes(extraDataIDs.minModPrev) && ids.includes(extraDataIDs.minIntPrev)) {
       if (ids.length === 3) {
-        await updatePercentage(parameters, total);
+        auditMessage = await updatePercentage(parameters, total);
       } else {
         throw new Error('Too many parameters sent.');
       }
@@ -479,17 +504,17 @@ const updateExtraData = async (parameters: DefaultExtraDataDTO[]): Promise<void>
       throw new Error('Missing parameter for update.');
     }
   } else if (ids.includes(extraDataIDs.urbPopPerc)) {
-    await updatePair(parameters[0], extraDataIDs.rurPopPerc);
+    auditMessage = await updatePair(parameters[0], extraDataIDs.rurPopPerc);
   } else if (ids.includes(extraDataIDs.rurPopPerc)) {
-    await updatePair(parameters[0], extraDataIDs.urbPopPerc);
+    auditMessage = await updatePair(parameters[0], extraDataIDs.urbPopPerc);
   } else if (ids.includes(extraDataIDs.urbAdultActPerc)) {
-    await updatePair(parameters[0], extraDataIDs.urbAdultLowPerc);
+    auditMessage = await updatePair(parameters[0], extraDataIDs.urbAdultLowPerc);
   } else if (ids.includes(extraDataIDs.urbAdultLowPerc)) {
-    await updatePair(parameters[0], extraDataIDs.urbAdultActPerc);
+    auditMessage = await updatePair(parameters[0], extraDataIDs.urbAdultActPerc);
   } else if (ids.includes(extraDataIDs.rurAdultActPerc)) {
-    await updatePair(parameters[0], extraDataIDs.rurAdultLowPerc);
+    auditMessage = await updatePair(parameters[0], extraDataIDs.rurAdultLowPerc);
   } else if (ids.includes(extraDataIDs.rurAdultLowPerc)) {
-    await updatePair(parameters[0], extraDataIDs.rurAdultActPerc);
+    auditMessage = await updatePair(parameters[0], extraDataIDs.rurAdultActPerc);
   } else if (validateID(parameters[0].id)) {
     await DefaultExtraData.update(
       { value: parameters[0].value },
@@ -504,12 +529,26 @@ const updateExtraData = async (parameters: DefaultExtraDataDTO[]): Promise<void>
       if (result[0] === 0) {
         throw new Error('No rows were updated.');
       }
+      auditMessage = `Cambió el parametro ${parameters[0].id} a ${parameters[0].value}`;
+      if (parameters[0].parameterType === ParameterType.MinorPAL) {
+        auditMessage += ' para menores de 6 a 17 años';
+      } else if (parameters[0].parameterType === ParameterType.AdultPAL) {
+        auditMessage += ' para mayores';
+      } else if (parameters[0].parameterType === ParameterType.Maternity) {
+        auditMessage += ' para mujeres mayores';
+        if (parameters[0].id === 'pregnancyExtraEnergy18to29' || parameters[0].id === 'lactationExtraEnergy18to29') {
+          auditMessage += ' de 18 a 29 años';
+        } else {
+          auditMessage += ' de 30 a 59 años';
+        }
+      }
     }).catch((err) => {
       throw err;
     });
   } else {
     throw new Error('Invalid parameter ID.');
   }
+  return auditMessage;
 };
 
 export default {
-- 
GitLab