diff --git a/src/DTOs/ExtraDataDTO.ts b/src/DTOs/ExtraDataDTO.ts index 0964397beb6453c86b0772b4daabf2e06036d7d6..dbed21805cc09e168f0a253dcea171cf6cbd4ea3 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 a5a838b44cbdb83008054105773f2447b6eb26e9..e101097a1e18a0c57af9234a09855bc422b77de5 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 0ee877d208d6193a7a7c391802b8d86405c0b97e..b75ec53f40bcb868ec6a2e9939c9c8dec0399fd9 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 521b26e7f5f5fb7e888e165f90e8b6615cfdfc5c..bd847cec4da5ff828c24962dc95fe798e2784760 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; }