From c83dea1e1aee13b5e4336b2d22fbbf3e63226767 Mon Sep 17 00:00:00 2001
From: Agustin <agusr1999@gmail.com>
Date: Mon, 20 Sep 2021 18:49:15 -0300
Subject: [PATCH] ER calculations done for all ages, still untested, some new
 translations

Also changes extra data dto to separate maternity data for age groups 18 to 29 and 30 to 59
---
 src/DTOs/ExtraDataDTO.ts          |  3 +-
 src/Services/CalculatorService.ts |  4 +-
 src/Services/ERCalculator.ts      | 83 ++++++++++++++++++-------------
 src/Services/ParameterService.ts  | 67 +++++++++++++------------
 4 files changed, 88 insertions(+), 69 deletions(-)

diff --git a/src/DTOs/ExtraDataDTO.ts b/src/DTOs/ExtraDataDTO.ts
index 0964397..dbed218 100644
--- a/src/DTOs/ExtraDataDTO.ts
+++ b/src/DTOs/ExtraDataDTO.ts
@@ -6,7 +6,8 @@ import PopulationMaternity from './PopulationMaternityDTO';
 type ExtraData = {
   minorPAL: MinorPAL | undefined;
   adultPAL: AdultPAL | undefined;
-  maternity: IndividualMaternity | PopulationMaternity | undefined;
+  maternity18To29: IndividualMaternity | PopulationMaternity | undefined;
+  maternity30To59: IndividualMaternity | PopulationMaternity | undefined;
 };
 
 export default ExtraData;
diff --git a/src/Services/CalculatorService.ts b/src/Services/CalculatorService.ts
index a5a838b..e101097 100644
--- a/src/Services/CalculatorService.ts
+++ b/src/Services/CalculatorService.ts
@@ -4,10 +4,10 @@ import ParserService from './ParserService';
 import AgeGroup from '../DTOs/AgeGroupDTO';
 import CalculatorResponse from '../DTOs/CalculatorResponseDTO';
 import AgeGroupJSON from '../DTOs/AgeGroupJSON';
-import extraData from '../DTOs/ExtraDataDTO';
+import ExtraData from '../DTOs/ExtraDataDTO';
 
 // eslint-disable-next-line max-len
-const calculateEnergeticRequirement = (groups: AgeGroupJSON[], data: extraData): CalculatorResponse => {
+const calculateEnergeticRequirement = (groups: AgeGroupJSON[], data: ExtraData): CalculatorResponse => {
   const parameters = new Map<number[], AgeGroup>();
   const ageGroups = ParserService.parseGroups(groups);
   ageGroups.forEach((group: AgeGroup) => {
diff --git a/src/Services/ERCalculator.ts b/src/Services/ERCalculator.ts
index 0ee877d..b75ec53 100644
--- a/src/Services/ERCalculator.ts
+++ b/src/Services/ERCalculator.ts
@@ -11,27 +11,38 @@ import Sex from '../Enum/Sex';
 import AgeBracket from '../Enum/AgeBracket';
 import ParserService from './ParserService';
 
-const calculateGET = (group: AgeGroup, params: number[], preval: MinorPAL): number => {
-  const getModerate: number = params[0]
+// eslint-disable-next-line max-len
+const isIndividualMaternity = (obj: IndividualMaternity | PopulationMaternity): obj is IndividualMaternity => {
+  if ((obj as IndividualMaternity).pregnantWomen) {
+    return true;
+  }
+  return false;
+};
+
+// TEE (Total Energetic Expenditure) = GET (Gasto Energetico Total)
+const calculateTEE = (group: AgeGroup, params: number[], preval: MinorPAL): number => {
+  const teeModerate: number = params[0]
   + (params[1] * group.medianWeight)
   - params[2] * (group.medianWeight * group.medianWeight);
 
-  const getLow: number = getModerate - (getModerate * params[4]) / 100;
-  const getIntense: number = getModerate + (getModerate * params[5]) / 100;
+  const teeLow: number = teeModerate - (teeModerate * params[4]) / 100;
+  const teeIntense: number = teeModerate + (teeModerate * params[5]) / 100;
 
-  const ret: number = (getLow * preval.lowPalPrevalence) / 100
-  + (getModerate * preval.moderatePALPrevalence) / 100
-  + (getIntense * preval.intensePALPrevalence) / 100;
+  const ret: number = (teeLow * preval.lowPalPrevalence) / 100
+  + (teeModerate * preval.moderatePALPrevalence) / 100
+  + (teeIntense * preval.intensePALPrevalence) / 100;
 
   return ret;
 };
 
-const calculateTMB = (group: AgeGroup, params: number[]): number => {
+// BMR (Basal Metabolic Rate) = TMB (Tasa Metabolica Basal)
+const calculateBMR = (group: AgeGroup, params: number[]): number => {
   const ret: number = params[0] * group.medianWeight + params[1];
   return ret;
 };
 
-const calculatePAL = (group: AgeGroup, params: number[], popData: AdultPAL): number => {
+// PAL (Physical activity level) = NAF (Nivel de Actividad Fisica)
+const calculatePAL = (params: number[], popData: AdultPAL): number => {
   const ruralPAL: number = (popData.activeRuralPAL * params[2]) / 100
   + (popData.lowRuralPAL * params[3]) / 100;
   const urbanPAL: number = (popData.activeUrbanPAL * params[4]) / 100
@@ -97,14 +108,14 @@ const calculate1To5Years = (group: AgeGroup, params: number[]): GroupEnergeticRe
 
 // eslint-disable-next-line max-len
 const calculate6To17Years = (group: AgeGroup, params: number[], data: ExtraData): GroupEnergeticRequirement => {
-  let get: number;
+  let tee: number;
   if (typeof (data.minorPAL) === 'undefined') {
     throw new Error('Missing data');
   } else {
-    get = calculateGET(group, params, data.minorPAL);
+    tee = calculateTEE(group, params, data.minorPAL);
   }
 
-  const requirement = get + params[3];
+  const requirement = tee + params[3];
 
   const groupRequirement: GroupEnergeticRequirement = {
     group: ParserService.unparseGroup(group),
@@ -117,24 +128,26 @@ const calculate6To17Years = (group: AgeGroup, params: number[], data: ExtraData)
 
 // eslint-disable-next-line max-len
 const calculate18To29Years = (group: AgeGroup, params: number[], data: ExtraData): GroupEnergeticRequirement => {
-  let tmb: number;
+  let bmr: number;
   let pal: number;
   if (typeof (data.adultPAL) === 'undefined') {
     throw new Error('Missing data');
   } else {
-    tmb = calculateTMB(group, params);
-    pal = calculatePAL(group, params, data.adultPAL);
+    bmr = calculateBMR(group, params);
+    pal = calculatePAL(params, data.adultPAL);
   }
 
-  let requirement: number = tmb * pal;
+  let requirement: number = bmr * pal;
 
+  // If the group's sex is Female, then you have to take into account
+  // the extra energy required by women that are pregnant or lactating
   if (group.sex === Sex.Female) {
-    if (typeof (data.maternity) === 'undefined') {
+    if (data.maternity18To29 === undefined) {
       throw new Error('Missing data');
-    } else if (typeof (data.maternity) === 'IndividualMaternity') {
-      requirement = calculateERWomenIndividual(group, params, data.maternity, requirement);
-    } else if (typeof (data.maternity) === 'PopulationMaternity') {
-      requirement = calculateERWomenPopulation(group, params, data.maternity, requirement);
+    } else if (isIndividualMaternity(data.maternity18To29)) {
+      requirement = calculateERWomenIndividual(group, params, data.maternity18To29, requirement);
+    } else {
+      requirement = calculateERWomenPopulation(group, params, data.maternity18To29, requirement);
     }
   }
 
@@ -149,24 +162,26 @@ const calculate18To29Years = (group: AgeGroup, params: number[], data: ExtraData
 
 // eslint-disable-next-line max-len
 const calculate30To59Years = (group: AgeGroup, params: number[], data: ExtraData): GroupEnergeticRequirement => {
-  let tmb: number;
+  let bmr: number;
   let pal: number;
   if (typeof (data.adultPAL) === 'undefined') {
     throw new Error('Missing data');
   } else {
-    tmb = calculateTMB(group, params);
-    pal = calculatePAL(group, params, data.adultPAL);
+    bmr = calculateBMR(group, params);
+    pal = calculatePAL(params, data.adultPAL);
   }
 
-  let requirement: number = tmb * pal;
+  let requirement: number = bmr * pal;
 
+  // If the group's sex is Female, then you have to take into account
+  // the extra energy required by women that are pregnant or lactating
   if (group.sex === Sex.Female) {
-    if (typeof (data.maternity) === 'undefined') {
+    if (typeof (data.maternity30To59) === 'undefined') {
       throw new Error('Missing data');
-    } else if (typeof (data.maternity) === 'IndividualMaternity') {
-      requirement = calculateERWomenIndividual(group, params, data.maternity, requirement);
-    } else if (typeof (data.maternity) === 'PopulationMaternity') {
-      requirement = calculateERWomenPopulation(group, params, data.maternity, requirement);
+    } else if (isIndividualMaternity(data.maternity30To59)) {
+      requirement = calculateERWomenIndividual(group, params, data.maternity30To59, requirement);
+    } else {
+      requirement = calculateERWomenPopulation(group, params, data.maternity30To59, requirement);
     }
   }
 
@@ -181,16 +196,16 @@ const calculate30To59Years = (group: AgeGroup, params: number[], data: ExtraData
 
 // eslint-disable-next-line max-len
 const calculate60PlusYears = (group: AgeGroup, params: number[], data: ExtraData): GroupEnergeticRequirement => {
-  let tmb: number;
+  let bmr: number;
   let pal: number;
   if (typeof (data.adultPAL) === 'undefined') {
     throw new Error('Missing data');
   } else {
-    tmb = calculateTMB(group, params);
-    pal = calculatePAL(group, params, data.adultPAL);
+    bmr = calculateBMR(group, params);
+    pal = calculatePAL(params, data.adultPAL);
   }
 
-  const requirement: number = tmb * pal;
+  const requirement: number = bmr * pal;
 
   const groupRequirement: GroupEnergeticRequirement = {
     group: ParserService.unparseGroup(group),
diff --git a/src/Services/ParameterService.ts b/src/Services/ParameterService.ts
index 521b26e..bd847ce 100644
--- a/src/Services/ParameterService.ts
+++ b/src/Services/ParameterService.ts
@@ -178,148 +178,151 @@ const getEquationValues = (ageBracket: AgeBracket, sex: Sex): number[] => {
     }
     case (AgeBracket.a6): {
       if (sex === Sex.Male) {
-        // 310.2 + (63.3*MP) - 0.263*MP^2 + 11, -15%/+15% para GET liviano/intenso
+        // 310.2 + (63.3*MP) - 0.263*MP^2 + 11, -15%/+15% for light/intense TEE
         res = [310.2, 63.3, -0.263, 12, 15, 15];
       } else if (sex === Sex.Female) {
-        // 263.4 + (65.3*MP) - 0.454*MP^2 + 10, -15%/+15% para GET liviano/intenso
+        // 263.4 + (65.3*MP) - 0.454*MP^2 + 10, -15%/+15% for light/intense TEE
         res = [263.4, 65.3, -0.454, 13, 15, 15];
       }
       break;
     }
     case (AgeBracket.a7): {
       if (sex === Sex.Male) {
-        // 310.2 + (63.3*MP) - 0.263*MP^2 + 14, -15%/+15% para GET liviano/intenso
+        // 310.2 + (63.3*MP) - 0.263*MP^2 + 14, -15%/+15% for light/intense TEE
         res = [310.2, 63.3, -0.263, 14, 15, 15];
       } else if (sex === Sex.Female) {
-        // 263.4 + (65.3*MP) - 0.454*MP^2 + 17, -15%/+15% para GET liviano/intenso
+        // 263.4 + (65.3*MP) - 0.454*MP^2 + 17, -15%/+15% for light/intense TEE
         res = [263.4, 65.3, -0.454, 17, 15, 15];
       }
       break;
     }
     case (AgeBracket.a8): {
       if (sex === Sex.Male) {
-        // 310.2 + (63.3*MP) - 0.263*MP^2 + 16, -15%/+15% para GET liviano/intenso
+        // 310.2 + (63.3*MP) - 0.263*MP^2 + 16, -15%/+15% for light/intense TEE
         res = [310.2, 63.3, -0.263, 16, 15, 15];
       } else if (sex === Sex.Female) {
-        // 263.4 + (65.3*MP) - 0.454*MP^2 + 20, -15%/+15% para GET liviano/intenso
+        // 263.4 + (65.3*MP) - 0.454*MP^2 + 20, -15%/+15% for light/intense TEE
         res = [263.4, 65.3, -0.454, 20, 15, 15];
       }
       break;
     }
     case (AgeBracket.a9): {
       if (sex === Sex.Male) {
-        // 310.2 + (63.3*MP) - 0.263*MP^2 + 19, -15%/+15% para GET liviano/intenso
+        // 310.2 + (63.3*MP) - 0.263*MP^2 + 19, -15%/+15% for light/intense TEE
         res = [310.2, 63.3, -0.263, 19, 15, 15];
       } else if (sex === Sex.Female) {
-        // 263.4 + (65.3*MP) - 0.454*MP^2 + 23, -15%/+15% para GET liviano/intenso
+        // 263.4 + (65.3*MP) - 0.454*MP^2 + 23, -15%/+15% for light/intense TEE
         res = [263.4, 65.3, -0.454, 23, 15, 15];
       }
       break;
     }
     case (AgeBracket.a10): {
       if (sex === Sex.Male) {
-        // 310.2 + (63.3*MP) - 0.263*MP^2 + 22, -15%/+15% para GET liviano/intenso
+        // 310.2 + (63.3*MP) - 0.263*MP^2 + 22, -15%/+15% for light/intense TEE
         res = [310.2, 63.3, -0.263, 22, 15, 15];
       } else if (sex === Sex.Female) {
-        // 263.4 + (65.3*MP) - 0.454*MP^2 + 25, -15%/+15% para GET liviano/intenso
+        // 263.4 + (65.3*MP) - 0.454*MP^2 + 25, -15%/+15% for light/intense TEE
         res = [263.4, 65.3, -0.454, 25, 15, 15];
       }
       break;
     }
     case (AgeBracket.a11): {
       if (sex === Sex.Male) {
-        // 310.2 + (63.3*MP) - 0.263*MP^2 + 25, -15%/+15% para GET liviano/intenso
+        // 310.2 + (63.3*MP) - 0.263*MP^2 + 25, -15%/+15% for light/intense TEE
         res = [310.2, 63.3, -0.263, 25, 15, 15];
       } else if (sex === Sex.Female) {
-        // 263.4 + (65.3*MP) - 0.454*MP^2 + 25, -15%/+15% para GET liviano/intenso
+        // 263.4 + (65.3*MP) - 0.454*MP^2 + 25, -15%/+15% for light/intense TEE
         res = [263.4, 65.3, -0.454, 25, 15, 15];
       }
       break;
     }
     case (AgeBracket.a12): {
       if (sex === Sex.Male) {
-        // 310.2 + (63.3*MP) - 0.263*MP^2 + 29, -15%/+15% para GET liviano/intenso
+        // 310.2 + (63.3*MP) - 0.263*MP^2 + 29, -15%/+15% for light/intense TEE
         res = [310.2, 63.3, -0.263, 29, 15, 15];
       } else if (sex === Sex.Female) {
-        // 263.4 + (65.3*MP) - 0.454*MP^2 + 26, -15%/+15% para GET liviano/intenso
+        // 263.4 + (65.3*MP) - 0.454*MP^2 + 26, -15%/+15% for light/intense TEE
         res = [263.4, 65.3, -0.454, 26, 15, 15];
       }
       break;
     }
     case (AgeBracket.a13): {
       if (sex === Sex.Male) {
-        // 310.2 + (63.3*MP) - 0.263*MP^2 + 33, -15%/+15% para GET liviano/intenso
+        // 310.2 + (63.3*MP) - 0.263*MP^2 + 33, -15%/+15% for light/intense TEE
         res = [310.2, 63.3, -0.263, 33, 15, 15];
       } else if (sex === Sex.Female) {
-        // 263.4 + (65.3*MP) - 0.454*MP^2 + 24, -15%/+15% para GET liviano/intenso
+        // 263.4 + (65.3*MP) - 0.454*MP^2 + 24, -15%/+15% for light/intense TEE
         res = [263.4, 65.3, -0.454, 24, 15, 15];
       }
       break;
     }
     case (AgeBracket.a14): {
       if (sex === Sex.Male) {
-        // 310.2 + (63.3*MP) - 0.263*MP^2 + 33, -15%/+15% para GET liviano/intenso
+        // 310.2 + (63.3*MP) - 0.263*MP^2 + 33, -15%/+15% for light/intense TEE
         res = [310.2, 63.3, -0.263, 33, 15, 15];
       } else if (sex === Sex.Female) {
-        // 263.4 + (65.3*MP) - 0.454*MP^2 + 19, -15%/+15% para GET liviano/intenso
+        // 263.4 + (65.3*MP) - 0.454*MP^2 + 19, -15%/+15% for light/intense TEE
         res = [263.4, 65.3, -0.454, 19, 15, 15];
       }
       break;
     }
     case (AgeBracket.a15): {
       if (sex === Sex.Male) {
-        // 310.2 + (63.3*MP) - 0.263*MP^2 + 31, -15%/+15% para GET liviano/intenso
+        // 310.2 + (63.3*MP) - 0.263*MP^2 + 31, -15%/+15% for light/intense TEE
         res = [310.2, 63.3, -0.263, 31, 15, 15];
       } else if (sex === Sex.Female) {
-        // 263.4 + (65.3*MP) - 0.454*MP^2 + 13, -15%/+15% para GET liviano/intenso
+        // 263.4 + (65.3*MP) - 0.454*MP^2 + 13, -15%/+15% for light/intense TEE
         res = [263.4, 65.3, -0.454, 13, 15, 15];
       }
       break;
     }
     case (AgeBracket.a16): {
       if (sex === Sex.Male) {
-        // 310.2 + (63.3*MP) - 0.263*MP^2 + 24, -15%/+15% para GET liviano/intenso
+        // 310.2 + (63.3*MP) - 0.263*MP^2 + 24, -15%/+15% for light/intense TEE
         res = [310.2, 63.3, -0.263, 24, 15, 15];
       } else if (sex === Sex.Female) {
-        // 263.4 + (65.3*MP) - 0.454*MP^2 + 5, -15%/+15% para GET liviano/intenso
+        // 263.4 + (65.3*MP) - 0.454*MP^2 + 5, -15%/+15% for light/intense TEE
         res = [263.4, 65.3, -0.454, 5, 15, 15];
       }
       break;
     }
     case (AgeBracket.a17): {
       if (sex === Sex.Male) {
-        // 310.2 + (63.3*MP) - 0.263*MP^2 + 14, -15%/+15% para GET liviano/intenso
+        // 310.2 + (63.3*MP) - 0.263*MP^2 + 14, -15%/+15% for light/intense TEE
         res = [310.2, 63.3, -0.263, 14, 15, 15];
       } else if (sex === Sex.Female) {
-        // 263.4 + (65.3*MP) - 0.454*MP^2 + 0, -15%/+15% para GET liviano/intenso
+        // 263.4 + (65.3*MP) - 0.454*MP^2 + 0, -15%/+15% for light/intense TEE
         res = [263.4, 65.3, -0.454, 0, 15, 15];
       }
       break;
     }
     case (AgeBracket.a18_29): {
       if (sex === Sex.Male) {
-        // (15.057*MP + 692.2) * NAF
-        res = [15.057, 692.2, 1.95, 1.65, 1.85, 1.55, 208, 251];
+        // (15.057*MP + 692.2) * PAL
+        res = [15.057, 692.2, 1.95, 1.65, 1.85, 1.55];
       } else if (sex === Sex.Female) {
-        // TODO: Parámetros para el cálculo de mujeres 18-29
+        // (14.818*MP + 486.6) * PAL, 208 and 251 extra energy for pregnant and lactating women
+        res = [14.818, 486.6, 1.95, 1.65, 1.85, 1.55, 208, 251];
       }
       break;
     }
     case (AgeBracket.a30_59): {
       if (sex === Sex.Male) {
-        // (11.472*MP + 863.1) * NAF
-        res = [11.472, 863.1, 1.95, 1.65, 1.85, 1.55, 208, 251];
+        // (11.472*MP + 873.1) * PAL
+        res = [11.472, 873.1, 1.95, 1.65, 1.85, 1.55];
       } else if (sex === Sex.Female) {
-        // TODO: Parámetros para el cálculo de mujeres 30-59
+        // (8.126*MP + 845.6) * PAL, 208 and 251 extra energy for pregnant and lactating women
+        res = [8.126, 845.6, 1.95, 1.65, 1.85, 1.55, 208, 251];
       }
       break;
     }
     case (AgeBracket.a60): {
       if (sex === Sex.Male) {
-        // (11.711*MP + 587.7) * NAF
+        // (11.711*MP + 587.7) * PAL
         res = [11.711, 587.7, 1.95, 1.65, 1.85, 1.55];
       } else if (sex === Sex.Female) {
-        // TODO: Parámetros para el cálculo de mujeres +60
+        // (9.082*MP + 658.5) * PAL
+        res = [9.082, 658.5, 1.95, 1.65, 1.85, 1.55];
       }
       break;
     }
-- 
GitLab