diff --git a/src/Controllers/CalculatorController.ts b/src/Controllers/CalculatorController.ts index 51a0f43f142915352c4bbe53300d8aad1394805f..dbdf560b0567eb1f89dd47a8f69b5a8c83de48cf 100644 --- a/src/Controllers/CalculatorController.ts +++ b/src/Controllers/CalculatorController.ts @@ -1,7 +1,6 @@ import { Handler, Request, Response, Router, } from 'express'; -import AgeGroupJSON from '../DTOs/AgeGroupJSON'; import CalculatorService from '../Services/CalculatorService'; import CalculatorResponse from '../DTOs/CalculatorResponseDTO'; import logger from '../Logger/logger'; @@ -9,9 +8,10 @@ import logger from '../Logger/logger'; const router = Router(); const getREP: Handler = async (req: Request, res: Response) => { - const groups: AgeGroupJSON[] = req.body; + const { groups, extraData } = req.body; try { - const EnergyReq: CalculatorResponse = CalculatorService.calculateEnergeticRequirement(groups); + const EnergyReq: + CalculatorResponse = CalculatorService.calculateEnergeticRequirement(groups, extraData); return res.status(200).send(EnergyReq); } catch (error) { const e = error as Error; diff --git a/src/DTOs/AdultPALDTO.ts b/src/DTOs/AdultPALDTO.ts new file mode 100644 index 0000000000000000000000000000000000000000..ed5a73cb44c064cb61e48079f5de029748da756e --- /dev/null +++ b/src/DTOs/AdultPALDTO.ts @@ -0,0 +1,10 @@ +type AdultPAL = { + urbanPercentage: number; + activeUrbanPAL: number; + lowUrbanPAL: number; + ruralPercentage: number; + activeRuralPAL: number; + lowRuralPAL: number; +}; + +export default AdultPAL; diff --git a/src/DTOs/AgeGroupDTO.ts b/src/DTOs/AgeGroupDTO.ts index 5acf22c1c9045c5d83bc02d16868e07b8d2fe4ef..b7d9768b2d37d62b7ded91172dd0a697da4facb4 100644 --- a/src/DTOs/AgeGroupDTO.ts +++ b/src/DTOs/AgeGroupDTO.ts @@ -2,10 +2,10 @@ import AgeBracket from '../Enum/AgeBracket'; import Sex from '../Enum/Sex'; type AgeGroup = { - edad: AgeBracket; - sexo: Sex; - pesoMediano: number; - cantidad: number; + age: AgeBracket; + sex: Sex; + medianWeight: number; + population: number; }; export default AgeGroup; diff --git a/src/DTOs/AgeGroupJSON.ts b/src/DTOs/AgeGroupJSON.ts index c8a111c0483005ff9db7a1de541cc14ff063ded7..6459407ed0aac27ae9791ca069d5295b45137859 100644 --- a/src/DTOs/AgeGroupJSON.ts +++ b/src/DTOs/AgeGroupJSON.ts @@ -1,8 +1,8 @@ type AgeGroupJSON = { - edad: string; - sexo: string; - pesoMediano: string; - cantidad: string; + age: string; // TODO: check enum + sex: string; + medianWeight: number; // TODO: check if it can be number again + population: number; // TODO: check if it can be number again }; export default AgeGroupJSON; diff --git a/src/DTOs/CalculatorResponseDTO.ts b/src/DTOs/CalculatorResponseDTO.ts index c4195f7d8f82b03e7d79c0310056e0b2f994a6f3..dc7df45f2b91d24ce1426550a52b62bb95763158 100644 --- a/src/DTOs/CalculatorResponseDTO.ts +++ b/src/DTOs/CalculatorResponseDTO.ts @@ -2,8 +2,8 @@ import EnergeticRequirement from './EnergeticRequirementDTO'; import GroupEnergeticRequirement from './GroupEnergeticRequirementDTO'; type CalculatorResponse = { - requerimientosPorGrupo: GroupEnergeticRequirement[]; - requerimientoTotal: EnergeticRequirement; + groupsRequirements: GroupEnergeticRequirement[]; + totalRequirement: EnergeticRequirement; }; export default CalculatorResponse; diff --git a/src/DTOs/EnergeticRequirementDTO.ts b/src/DTOs/EnergeticRequirementDTO.ts index ef11f41e11285421e15b7ff0745744f9be5065e1..c808a904027651c33c285569df261f0d7c9b996b 100644 --- a/src/DTOs/EnergeticRequirementDTO.ts +++ b/src/DTOs/EnergeticRequirementDTO.ts @@ -1,7 +1,7 @@ type EnergeticRequirement = { - requerimientoEnergeticoPerCapita: number; - requerimientoEnergeticoTotal: number; - poblacionTotal: number; + perCapita: number; + total: number; + totalPopulation: number; }; export default EnergeticRequirement; diff --git a/src/DTOs/ExtraDataDTO.ts b/src/DTOs/ExtraDataDTO.ts new file mode 100644 index 0000000000000000000000000000000000000000..dbed21805cc09e168f0a253dcea171cf6cbd4ea3 --- /dev/null +++ b/src/DTOs/ExtraDataDTO.ts @@ -0,0 +1,13 @@ +import AdultPAL from './AdultPALDTO'; +import IndividualMaternity from './IndividualMaternityDTO'; +import MinorPAL from './MinorPALDTO'; +import PopulationMaternity from './PopulationMaternityDTO'; + +type ExtraData = { + minorPAL: MinorPAL | undefined; + adultPAL: AdultPAL | undefined; + maternity18To29: IndividualMaternity | PopulationMaternity | undefined; + maternity30To59: IndividualMaternity | PopulationMaternity | undefined; +}; + +export default ExtraData; diff --git a/src/DTOs/GroupEnergeticRequirementDTO.ts b/src/DTOs/GroupEnergeticRequirementDTO.ts index f0148429ee84ffb5bfdaabeaac73fbdb801c7ce9..391a86a0494e204f48419f3b67dbcf640319a403 100644 --- a/src/DTOs/GroupEnergeticRequirementDTO.ts +++ b/src/DTOs/GroupEnergeticRequirementDTO.ts @@ -1,9 +1,9 @@ import AgeGroupJSON from './AgeGroupJSON'; type GroupEnergeticRequirement = { - grupoEtario: AgeGroupJSON; - requerimientoEnergeticoPerCapita: number; - requerimientoEnergeticoTotal: number; + group: AgeGroupJSON; + perCapita: number; + total: number; }; export default GroupEnergeticRequirement; diff --git a/src/DTOs/IndividualMaternityDTO.ts b/src/DTOs/IndividualMaternityDTO.ts new file mode 100644 index 0000000000000000000000000000000000000000..df99fff99dc84fcd21ecaaa73531a359df9f889a --- /dev/null +++ b/src/DTOs/IndividualMaternityDTO.ts @@ -0,0 +1,6 @@ +type IndividualMaternity = { + pregnantWomen: number; + lactatingWomen: number; +}; + +export default IndividualMaternity; diff --git a/src/DTOs/MinorPALDTO.ts b/src/DTOs/MinorPALDTO.ts new file mode 100644 index 0000000000000000000000000000000000000000..75b39bd4b6272e007b03fcb2b22e2e3ccf7c8789 --- /dev/null +++ b/src/DTOs/MinorPALDTO.ts @@ -0,0 +1,7 @@ +type MinorPAL = { + lowPALPrevalence: number; + moderatePALPrevalence: number; + intensePALPrevalence: number; +}; + +export default MinorPAL; diff --git a/src/DTOs/PopulationMaternityDTO.ts b/src/DTOs/PopulationMaternityDTO.ts new file mode 100644 index 0000000000000000000000000000000000000000..940f618adef39ceaa551e8dd37fc6ee7dc413407 --- /dev/null +++ b/src/DTOs/PopulationMaternityDTO.ts @@ -0,0 +1,6 @@ +type PopulationMaternity = { + countryBirthRate: number; + countryPopulation: number; +}; + +export default PopulationMaternity; diff --git a/src/Enum/ParameterType.ts b/src/Enum/ParameterType.ts index f2ce0420bf75f91cee0fd4975c474d6e95f1b8ae..519746ebc4e832ee84655fcfcd2408e804398073 100644 --- a/src/Enum/ParameterType.ts +++ b/src/Enum/ParameterType.ts @@ -1,8 +1,8 @@ enum ParameterType { - NAF = 'NAF', - PesoPorDefecto = 'Peso por defecto', - EmbarazoYLactancia = 'Embarazo y lactancia', - ConstanteDeEcuacion = 'Constante de ecuacion' + PAL = 'NAF', + DefaultWeight = 'Peso por defecto', + Maternity = 'Embarazo y lactancia', + EquationConstant = 'Constante de ecuacion' } export default ParameterType; diff --git a/src/Enum/Sex.ts b/src/Enum/Sex.ts index 83d5304cb5cc3b6064b52143d9cf5f765a85806a..4c388f05f1e2641a83434544958f06ac83f3aaed 100644 --- a/src/Enum/Sex.ts +++ b/src/Enum/Sex.ts @@ -1,6 +1,6 @@ enum Sex { - Masculino = 'Masculino', - Femenino = 'Femenino', + Male = 'Masculino', + Female = 'Femenino', } export default Sex; diff --git a/src/Models/Parameter.ts b/src/Models/Parameter.ts index 35b130662806aada16ac16d5ab58836213aa57d2..ae2b4aeca1f19015e78524edcc8c0b53d13d592e 100644 --- a/src/Models/Parameter.ts +++ b/src/Models/Parameter.ts @@ -1,11 +1,16 @@ +import ParameterType from '../Enum/ParameterType'; + class Parameter { name: string; value: number; - constructor(name: string, value: number) { + parameterType: ParameterType; + + constructor(name: string, value: number, parameterType: ParameterType) { this.name = name; this.value = value; + this.parameterType = parameterType; } } diff --git a/src/Services/CalculatorService.ts b/src/Services/CalculatorService.ts index e0f628e668aebe230f458e17a2d1f16af01fefc6..e101097a1e18a0c57af9234a09855bc422b77de5 100644 --- a/src/Services/CalculatorService.ts +++ b/src/Services/CalculatorService.ts @@ -4,15 +4,17 @@ import ParserService from './ParserService'; import AgeGroup from '../DTOs/AgeGroupDTO'; import CalculatorResponse from '../DTOs/CalculatorResponseDTO'; import AgeGroupJSON from '../DTOs/AgeGroupJSON'; +import ExtraData from '../DTOs/ExtraDataDTO'; -const calculateEnergeticRequirement = (data: AgeGroupJSON[]): CalculatorResponse => { - const parametros = new Map<number[], AgeGroup>(); - const ageGroups = ParserService.parseGroups(data); +// eslint-disable-next-line max-len +const calculateEnergeticRequirement = (groups: AgeGroupJSON[], data: ExtraData): CalculatorResponse => { + const parameters = new Map<number[], AgeGroup>(); + const ageGroups = ParserService.parseGroups(groups); ageGroups.forEach((group: AgeGroup) => { - parametros.set(ParameterService.getEquationValues(group.edad, group.sexo), group); + parameters.set(ParameterService.getEquationValues(group.age, group.sex), group); }); - const res: CalculatorResponse = ERCalculator.calculateER(parametros); + const res: CalculatorResponse = ERCalculator.calculateER(parameters, data); return res; }; diff --git a/src/Services/ERCalculator.ts b/src/Services/ERCalculator.ts index 6be7f98ec3b015fe103f03619f1a23943b2b7c81..3a3513adfbb7360e8542761c3e07fc6c8c2d4973 100644 --- a/src/Services/ERCalculator.ts +++ b/src/Services/ERCalculator.ts @@ -2,46 +2,231 @@ import AgeGroup from '../DTOs/AgeGroupDTO'; import EnergeticRequirement from '../DTOs/EnergeticRequirementDTO'; import CalculatorResponse from '../DTOs/CalculatorResponseDTO'; import GroupEnergeticRequirement from '../DTOs/GroupEnergeticRequirementDTO'; -import ParserService from './ParserService'; +import ExtraData from '../DTOs/ExtraDataDTO'; +import MinorPAL from '../DTOs/MinorPALDTO'; +import AdultPAL from '../DTOs/AdultPALDTO'; +import IndividualMaternity from '../DTOs/IndividualMaternityDTO'; +import PopulationMaternity from '../DTOs/PopulationMaternityDTO'; +import Sex from '../Enum/Sex'; import AgeBracket from '../Enum/AgeBracket'; +import ParserService from './ParserService'; + +// 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 teeLow: number = teeModerate - (teeModerate * params[4]) / 100; + const teeIntense: number = teeModerate + (teeModerate * params[5]) / 100; + + const ret: number = (teeLow * preval.lowPALPrevalence) / 100 + + (teeModerate * preval.moderatePALPrevalence) / 100 + + (teeIntense * preval.intensePALPrevalence) / 100; + + return ret; +}; + +// 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; +}; + +// 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 + + (popData.lowUrbanPAL * params[5]) / 100; + + const ret = (ruralPAL * popData.ruralPercentage) / 100 + + (urbanPAL * popData.urbanPercentage) / 100; + return ret; +}; + +// eslint-disable-next-line max-len +const calculateERWomenIndividual = (group: AgeGroup, params: number[], popData: IndividualMaternity, req: number): number => { + const percentPregnantWomen = (popData.pregnantWomen * 100) / group.population; + const percentLactatingWomen = (popData.lactatingWomen * 100) / group.population; + + const reqPregnantWomen = (percentPregnantWomen * (req + params[6])) / 100; + const reqLactatingWomen = (percentLactatingWomen * (req + params[7])) / 100; + const reqRestOfWomen = ((100 - percentPregnantWomen - percentLactatingWomen) * req) / 100; + + return reqPregnantWomen + reqLactatingWomen + reqRestOfWomen; +}; + +// eslint-disable-next-line max-len +const calculateERWomenPopulation = (group: AgeGroup, params: number[], popData: PopulationMaternity, req: number): number => { + const annualBirths = popData.countryBirthRate * popData.countryPopulation; + + const percentPregnantWomen = (annualBirths * 75) / group.population; + const percentLactatingWomen = (annualBirths * 50) / group.population; + + const reqPregnantWomen = (percentPregnantWomen * (req + params[6])) / 100; + const reqLactatingWomen = (percentLactatingWomen * (req + params[7])) / 100; + const reqRestOfWomen = ((100 - percentPregnantWomen - percentLactatingWomen) * req) / 100; + + return reqPregnantWomen + reqLactatingWomen + reqRestOfWomen; +}; const calculateLessThanAYear = (group: AgeGroup, params: number[]): GroupEnergeticRequirement => { - const requirement = params[0] + (params[1] * group.pesoMediano) + params[2]; + const requirement = params[0] + (params[1] * group.medianWeight) + params[2]; const groupRequirement: GroupEnergeticRequirement = { - grupoEtario: ParserService.unparseGroup(group), - requerimientoEnergeticoPerCapita: requirement, - requerimientoEnergeticoTotal: requirement * group.cantidad, + group: ParserService.unparseGroup(group), + perCapita: requirement, + total: requirement * group.population, }; return groupRequirement; }; -const calculateOneToFiveYears = (group: AgeGroup, params: number[]): GroupEnergeticRequirement => { +const calculate1To5Years = (group: AgeGroup, params: number[]): GroupEnergeticRequirement => { const requirement = params[0] - + (params[1] * group.pesoMediano) - + (params[2] * (group.pesoMediano ** 2)) + + (params[1] * group.medianWeight) + + (params[2] * (group.medianWeight ** 2)) + params[3]; const groupRequirement: GroupEnergeticRequirement = { - grupoEtario: ParserService.unparseGroup(group), - requerimientoEnergeticoPerCapita: requirement, - requerimientoEnergeticoTotal: requirement * group.cantidad, + group: ParserService.unparseGroup(group), + perCapita: requirement, + total: requirement * group.population, }; return groupRequirement; }; -const calculateER = (groupParameters: Map<number[], AgeGroup>): CalculatorResponse => { +// eslint-disable-next-line max-len +const calculate6To17Years = (group: AgeGroup, params: number[], data: ExtraData): GroupEnergeticRequirement => { + let tee: number; + if (typeof (data.minorPAL) === 'undefined') { + throw new Error('Missing data'); + } else { + tee = calculateTEE(group, params, data.minorPAL); + } + + const requirement = tee + params[3]; + + const groupRequirement: GroupEnergeticRequirement = { + group: ParserService.unparseGroup(group), + perCapita: requirement, + total: requirement * group.population, + }; + + return groupRequirement; +}; + +// eslint-disable-next-line max-len +const calculate18To29Years = (group: AgeGroup, params: number[], data: ExtraData): GroupEnergeticRequirement => { + let bmr: number; + let pal: number; + if (typeof (data.adultPAL) === 'undefined') { + throw new Error('Missing data'); + } else { + bmr = calculateBMR(group, params); + pal = calculatePAL(params, data.adultPAL); + } + + 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 (data.maternity18To29 === undefined) { + throw new Error('Missing data'); + } else if (isIndividualMaternity(data.maternity18To29)) { + requirement = calculateERWomenIndividual(group, params, data.maternity18To29, requirement); + } else { + requirement = calculateERWomenPopulation(group, params, data.maternity18To29, requirement); + } + } + + const groupRequirement: GroupEnergeticRequirement = { + group: ParserService.unparseGroup(group), + perCapita: requirement, + total: requirement * group.population, + }; + + return groupRequirement; +}; + +// eslint-disable-next-line max-len +const calculate30To59Years = (group: AgeGroup, params: number[], data: ExtraData): GroupEnergeticRequirement => { + let bmr: number; + let pal: number; + if (typeof (data.adultPAL) === 'undefined') { + throw new Error('Missing data'); + } else { + bmr = calculateBMR(group, params); + pal = calculatePAL(params, data.adultPAL); + } + + 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.maternity30To59) === 'undefined') { + throw new Error('Missing data'); + } else if (isIndividualMaternity(data.maternity30To59)) { + requirement = calculateERWomenIndividual(group, params, data.maternity30To59, requirement); + } else { + requirement = calculateERWomenPopulation(group, params, data.maternity30To59, requirement); + } + } + + const groupRequirement: GroupEnergeticRequirement = { + group: ParserService.unparseGroup(group), + perCapita: requirement, + total: requirement * group.population, + }; + + return groupRequirement; +}; + +// eslint-disable-next-line max-len +const calculate60PlusYears = (group: AgeGroup, params: number[], data: ExtraData): GroupEnergeticRequirement => { + let bmr: number; + let pal: number; + if (typeof (data.adultPAL) === 'undefined') { + throw new Error('Missing data'); + } else { + bmr = calculateBMR(group, params); + pal = calculatePAL(params, data.adultPAL); + } + + const requirement: number = bmr * pal; + + const groupRequirement: GroupEnergeticRequirement = { + group: ParserService.unparseGroup(group), + perCapita: requirement, + total: requirement * group.population, + }; + + return groupRequirement; +}; + +// eslint-disable-next-line max-len +const calculateER = (groupParameters: Map<number[], AgeGroup>, data: ExtraData): CalculatorResponse => { let totalOfPeople = 0; let totalRequirement = 0; const requirements: GroupEnergeticRequirement[] = []; groupParameters.forEach((group: AgeGroup, params: number[]) => { - totalOfPeople += group.cantidad; + totalOfPeople += group.population; let groupRequirement: GroupEnergeticRequirement; - switch (group.edad) { + switch (group.age) { case AgeBracket.m0: case AgeBracket.m1: case AgeBracket.m2: @@ -62,26 +247,53 @@ const calculateER = (groupParameters: Map<number[], AgeGroup>): CalculatorRespon case AgeBracket.a3: case AgeBracket.a4: case AgeBracket.a5: { - groupRequirement = calculateOneToFiveYears(group, params); + groupRequirement = calculate1To5Years(group, params); + break; + } + case AgeBracket.a6: + case AgeBracket.a7: + case AgeBracket.a8: + case AgeBracket.a9: + case AgeBracket.a10: + case AgeBracket.a11: + case AgeBracket.a12: + case AgeBracket.a13: + case AgeBracket.a14: + case AgeBracket.a15: + case AgeBracket.a16: + case AgeBracket.a17: { + groupRequirement = calculate6To17Years(group, params, data); + break; + } + case AgeBracket.a18_29: { + groupRequirement = calculate18To29Years(group, params, data); + break; + } + case AgeBracket.a30_59: { + groupRequirement = calculate30To59Years(group, params, data); + break; + } + case AgeBracket.a60: { + groupRequirement = calculate60PlusYears(group, params, data); break; } default: { throw new Error('Parsing error, attribute edad does not respect format'); } } - totalRequirement += groupRequirement.requerimientoEnergeticoTotal; + totalRequirement += groupRequirement.total; requirements.push(groupRequirement); }); const totalER: EnergeticRequirement = { - requerimientoEnergeticoPerCapita: totalRequirement / totalOfPeople, - requerimientoEnergeticoTotal: totalRequirement, - poblacionTotal: totalOfPeople, + perCapita: totalRequirement / totalOfPeople, + total: totalRequirement, + totalPopulation: totalOfPeople, }; const result: CalculatorResponse = { - requerimientosPorGrupo: requirements, - requerimientoTotal: totalER, + groupsRequirements: requirements, + totalRequirement: totalER, }; return result; diff --git a/src/Services/ParameterService.ts b/src/Services/ParameterService.ts index 06ed93dc4f73d86acbecbe63ef2b1195fdd253e1..30f6085b228efb7e6534bcad8818c630f1bf9916 100644 --- a/src/Services/ParameterService.ts +++ b/src/Services/ParameterService.ts @@ -7,177 +7,328 @@ const getEquationValues = (ageBracket: AgeBracket, sex: Sex): number[] => { let res: number[] = []; switch (ageBracket) { case (AgeBracket.m0): { - if (sex === Sex.Masculino) { + if (sex === Sex.Male) { // -152 + (92.8*MP) + 211 res = [-152, 92.8, 211]; - } else if (sex === Sex.Femenino) { + } else if (sex === Sex.Female) { // -152 + (92.8*MP) + 178 res = [-152, 92.8, 178]; } break; } case (AgeBracket.m1): { - if (sex === Sex.Masculino) { + if (sex === Sex.Male) { // -152 + (92.8*MP) + 183 res = [-152, 92.8, 183]; - } else if (sex === Sex.Femenino) { + } else if (sex === Sex.Female) { // -152 + (92.8*MP) + 161 res = [-152, 92.8, 161]; } break; } case (AgeBracket.m2): { - if (sex === Sex.Masculino) { + if (sex === Sex.Male) { // -152 + (92.8*MP) + 139 res = [-152, 92.8, 139]; - } else if (sex === Sex.Femenino) { + } else if (sex === Sex.Female) { // -152 + (92.8*MP) + 134 res = [-152, 92.8, 134]; } break; } case (AgeBracket.m3): { - if (sex === Sex.Masculino) { + if (sex === Sex.Male) { // -152 + (92.8*MP) + 53 res = [-152, 92.8, 53]; - } else if (sex === Sex.Femenino) { + } else if (sex === Sex.Female) { // -152 + (92.8*MP) + 68 res = [-152, 92.8, 68]; } break; } case (AgeBracket.m4): { - if (sex === Sex.Masculino) { + if (sex === Sex.Male) { // -152 + (92.8*MP) + 46 res = [-152, 92.8, 46]; - } else if (sex === Sex.Femenino) { + } else if (sex === Sex.Female) { // -152 + (92.8*MP) + 57 res = [-152, 92.8, 57]; } break; } case (AgeBracket.m5): { - if (sex === Sex.Masculino) { + if (sex === Sex.Male) { // -152 + (92.8*MP) + 36 res = [-152, 92.8, 36]; - } else if (sex === Sex.Femenino) { + } else if (sex === Sex.Female) { // -152 + (92.8*MP) + 47 res = [-152, 92.8, 47]; } break; } case (AgeBracket.m6): { - if (sex === Sex.Masculino) { + if (sex === Sex.Male) { // -99.4 + (88.6*MP) + 17 res = [-99.4, 88.6, 17]; - } else if (sex === Sex.Femenino) { + } else if (sex === Sex.Female) { // -99.4 + (88.6*MP) + 20 res = [-99.4, 88.6, 20]; } break; } case (AgeBracket.m7): { - if (sex === Sex.Masculino) { + if (sex === Sex.Male) { // -99.4 + (88.6*MP) + 16 res = [-99.4, 88.6, 16]; - } else if (sex === Sex.Femenino) { + } else if (sex === Sex.Female) { // -99.4 + (88.6*MP) + 17 res = [-99.4, 88.6, 17]; } break; } case (AgeBracket.m8): { - if (sex === Sex.Masculino) { + if (sex === Sex.Male) { // -99.4 + (88.6*MP) + 14 res = [-99.4, 88.6, 14]; - } else if (sex === Sex.Femenino) { + } else if (sex === Sex.Female) { // -99.4 + (88.6*MP) + 15 res = [-99.4, 88.6, 15]; } break; } case (AgeBracket.m9): { - if (sex === Sex.Masculino) { + if (sex === Sex.Male) { // -99.4 + (88.6*MP) + 21 res = [-99.4, 88.6, 21]; - } else if (sex === Sex.Femenino) { + } else if (sex === Sex.Female) { // -99.4 + (88.6*MP) + 18 res = [-99.4, 88.6, 18]; } break; } case (AgeBracket.m10): { - if (sex === Sex.Masculino) { + if (sex === Sex.Male) { // -99.4 + (88.6*MP) + 21 res = [-99.4, 88.6, 21]; - } else if (sex === Sex.Femenino) { + } else if (sex === Sex.Female) { // -99.4 + (88.6*MP) + 15 res = [-99.4, 88.6, 15]; } break; } case (AgeBracket.m11): { - if (sex === Sex.Masculino) { + if (sex === Sex.Male) { // -99.4 + (88.6*MP) + 22 res = [-99.4, 88.6, 22]; - } else if (sex === Sex.Femenino) { + } else if (sex === Sex.Female) { // -99.4 + (88.6*MP) + 14 res = [-99.4, 88.6, 14]; } break; } case (AgeBracket.a1): { - if (sex === Sex.Masculino) { + if (sex === Sex.Male) { // 310.2 + (63.3*MP) - 0.263*MP^2 + 13 res = [310.2, 63.3, -0.263, 13]; - } else if (sex === Sex.Femenino) { + } else if (sex === Sex.Female) { // 263.4 + (65.3*MP) - 0.454*MP^2 + 13 res = [263.4, 65.3, -0.454, 13]; } break; } case (AgeBracket.a2): { - if (sex === Sex.Masculino) { + if (sex === Sex.Male) { // 310.2 + (63.3*MP) - 0.263*MP^2 + 12 res = [310.2, 63.3, -0.263, 12]; - } else if (sex === Sex.Femenino) { + } else if (sex === Sex.Female) { // 263.4 + (65.3*MP) - 0.454*MP^2 + 13 res = [263.4, 65.3, -0.454, 13]; } break; } case (AgeBracket.a3): { - if (sex === Sex.Masculino) { + if (sex === Sex.Male) { // 310.2 + (63.3*MP) - 0.263*MP^2 + 12 res = [310.2, 63.3, -0.263, 12]; - } else if (sex === Sex.Femenino) { + } else if (sex === Sex.Female) { // 263.4 + (65.3*MP) - 0.454*MP^2 + 11 res = [263.4, 65.3, -0.454, 11]; } break; } case (AgeBracket.a4): { - if (sex === Sex.Masculino) { + if (sex === Sex.Male) { // 310.2 + (63.3*MP) - 0.263*MP^2 + 11 res = [310.2, 63.3, -0.263, 11]; - } else if (sex === Sex.Femenino) { + } else if (sex === Sex.Female) { // 263.4 + (65.3*MP) - 0.454*MP^2 + 10 res = [263.4, 65.3, -0.454, 10]; } break; } case (AgeBracket.a5): { - if (sex === Sex.Masculino) { + if (sex === Sex.Male) { // 310.2 + (63.3*MP) - 0.263*MP^2 + 11 res = [310.2, 63.3, -0.263, 11]; - } else if (sex === Sex.Femenino) { + } else if (sex === Sex.Female) { // 263.4 + (65.3*MP) - 0.454*MP^2 + 10 res = [263.4, 65.3, -0.454, 10]; } break; } + case (AgeBracket.a6): { + if (sex === Sex.Male) { + // 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% 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% 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% 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% 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% 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% 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% 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% 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% 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% 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% 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% 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% 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% 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% 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% 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% 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% 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% 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% 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% 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% 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% 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) * PAL + res = [15.057, 692.2, 1.95, 1.65, 1.85, 1.55]; + } else if (sex === Sex.Female) { + // (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 + 873.1) * PAL + res = [11.472, 873.1, 1.95, 1.65, 1.85, 1.55]; + } else if (sex === Sex.Female) { + // (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) * PAL + res = [11.711, 587.7, 1.95, 1.65, 1.85, 1.55]; + } else if (sex === Sex.Female) { + // (9.082*MP + 658.5) * PAL + res = [9.082, 658.5, 1.95, 1.65, 1.85, 1.55]; + } + break; + } + default: { - throw new Error('Parsing error, attribute edad does not respect format'); + throw new Error(`Parsing error, attribute edad does not respect format ${ageBracket}`); } } return res; diff --git a/src/Services/ParserService.ts b/src/Services/ParserService.ts index b9aedc9f4780a9abb1ce2a9a84019154efadb655..dc7131b412cf5b78d381501b62d6d2073cf0ee03 100644 --- a/src/Services/ParserService.ts +++ b/src/Services/ParserService.ts @@ -161,16 +161,16 @@ import Sex from '../Enum/Sex'; const parseGroups = (groups: AgeGroupJSON[]): AgeGroup[] => { const retGroups: AgeGroup[] = []; - groups.forEach((obj: AgeGroupJSON) => { + groups.forEach((ageGroup: AgeGroupJSON) => { // if (typeof (obj.pesoMediano) !== 'number' || typeof (obj.cantidad) !== 'number') { // console.log('Estas haciendo cualquiera flaco'); // throw new Error('Parsing error, attributes do not respect format'); // } const group: AgeGroup = { - edad: obj.edad as AgeBracket, - sexo: obj.sexo as Sex, - pesoMediano: parseFloat(obj.pesoMediano), - cantidad: parseFloat(obj.cantidad), + age: ageGroup.age as AgeBracket, + sex: ageGroup.sex as Sex, + medianWeight: ageGroup.medianWeight, + population: ageGroup.population, }; retGroups.push(group); }); @@ -179,10 +179,10 @@ const parseGroups = (groups: AgeGroupJSON[]): AgeGroup[] => { const unparseGroup = (group: AgeGroup): AgeGroupJSON => { const retGroup: AgeGroupJSON = { - edad: group.edad as string, - sexo: group.sexo as string, - pesoMediano: String(group.pesoMediano), - cantidad: String(group.cantidad), + age: group.age as string, + sex: group.sex as string, + medianWeight: group.medianWeight, + population: group.population, }; return retGroup; }; diff --git a/swagger.yaml b/swagger.yaml index a531d9d80720a482901607fbe7aa5350473c9656..1adc477fc20beebe342c36d78a08df80e30b3a9f 100644 --- a/swagger.yaml +++ b/swagger.yaml @@ -46,19 +46,21 @@ paths: - BearerAuth: [] /repCalculator: - post: - tags: - - Calculation + post: + tags: + - Calculation summary: Given population data calculates its energetic requirement requestBody: content: application/json: schema: - $ref: '#/components/schemas/AgeGroupJSON' + $ref: '#/components/schemas/ReqCalculation' required: true responses: '200': description: Ok. + '400': + description: Bad request. security: - BearerAuth: [] components: @@ -107,11 +109,92 @@ components: type: string AgeGroupJSON: properties: - edad: + age: type: string - sexo: + sex: type: string - pesoMediano: + medianWeight: type: string - cantidad: - type: string \ No newline at end of file + population: + type: string + required: + - age + - sex + - medianWeight + - population + MinorPAL: + properties: + lowPALPrevalence: + type: number + moderatePALPrevalence: + type: number + intensePALPrevalence: + type: number + required: + - lowPALPrevalence + - moderatePALPrevalence + - intensePALPrevalence + AdultPAL: + properties: + urbanPercentage: + type: number + activeUrbanPAL: + type: number + lowUrbanPAL: + type: number + ruralPercentage: + type: number + activeRuralPAL: + type: number + lowRuralPAL: + type: number + required: + - urbanPercentage + - activeUrbanPAL + - lowUrbanPAL + - ruralPercentage + - activeRuralPAL + - lowRuralPAL + IndividualMaternity: + properties: + pregnantWomen: + type: number + lactatingWomen: + type: number + required: + - pregnantWomen + - lactatingWomen + PopulationMaternity: + properties: + countryBirthRate: + type: number + countryPopulation: + type: number + required: + - countryBirthRate + - countryPopulation + ExtraData: + properties: + minorPAL: + $ref: '#/components/schemas/MinorPAL' + adultPAL: + $ref: '#/components/schemas/AdultPAL' + maternity18to29: + oneOf: + - $ref: '#/components/schemas/IndividualMaternity' + - $ref: '#/components/schemas/PopulationMaternity' + maternity30to59: + oneOf: + - $ref: '#/components/schemas/IndividualMaternity' + - $ref: '#/components/schemas/PopulationMaternity' + ReqCalculation: + properties: + groups: + type: array + items: + $ref: '#/components/schemas/AgeGroupJSON' + extraData: + $ref: '#/components/schemas/ExtraData' + required: + - groups + - extraData \ No newline at end of file