diff --git a/src/DTOs/AgeGroupJSON.ts b/src/DTOs/AgeGroupJSON.ts index 6459407ed0aac27ae9791ca069d5295b45137859..6b774a10a0d341dbf49d9f530d4fccd9bd231962 100644 --- a/src/DTOs/AgeGroupJSON.ts +++ b/src/DTOs/AgeGroupJSON.ts @@ -1,8 +1,8 @@ type AgeGroupJSON = { - age: string; // TODO: check enum + age: string; sex: string; - medianWeight: number; // TODO: check if it can be number again - population: number; // TODO: check if it can be number again + medianWeight: number; + population: number; }; export default AgeGroupJSON; diff --git a/src/Schemas/updateParameterValueBody.ts b/src/Schemas/updateParameterValueBody.ts index d46e0e29c5c0c28b60a10bdf0166bc1b24acfb1f..2f3288cc581bdfc574f56617e759aebe5376196d 100644 --- a/src/Schemas/updateParameterValueBody.ts +++ b/src/Schemas/updateParameterValueBody.ts @@ -1,43 +1,46 @@ const updateParameterValueBody = { type: 'object' as const, - required: ['parameter'], + required: ['parameters, parameterType'], properties: { - parameter: { - type: 'object' as const, - properties: { - ageRange: { - type: 'string' as const, - }, - sex: { - type: 'string' as const, - }, - id: { - type: 'string' as const, - }, - value: { - type: 'number' as const, - }, - parameterType: { - type: 'string' as const, - }, - order: { - type: 'number' as const, - }, - description: { - type: 'string' as const, - }, + parameters: { + type: 'array' as const, + items: { + type: 'object' as const, + properties: { + ageRange: { + type: 'string' as const, + }, + sex: { + type: 'string' as const, + }, + id: { + type: 'string' as const, + }, + value: { + type: 'number' as const, + }, + parameterType: { + type: 'string' as const, + }, + order: { + type: 'number' as const, + }, + description: { + type: 'string' as const, + }, + }, + oneOf: [ + { + required: ['parameterType', 'ageRange', 'sex', 'value'], + }, + { + required: ['parameterType', 'id', 'value'], + }, + { + required: ['parameterType', 'ageRange', 'sex', 'order', 'value'], + }, + ], }, - oneOf: [ - { - required: ['parameterType', 'ageRange', 'sex', 'value'], - }, - { - required: ['parameterType', 'id', 'value'], - }, - { - required: ['parameterType', 'ageRange', 'sex', 'order', 'value'], - }, - ], }, }, }; diff --git a/src/Services/ERCalculator.ts b/src/Services/ERCalculator.ts index 18a67dfa2086428304db4ab116794b0ee42a311b..77bd5491ac05e9e70ac39e81e4669c6227432c0e 100644 --- a/src/Services/ERCalculator.ts +++ b/src/Services/ERCalculator.ts @@ -36,11 +36,9 @@ const calculateTEE = (group: AgeGroup, params: number[], preval: MinorPAL): numb const teeLow: number = teeModerate + (teeModerate * params[4]) / 100; const teeIntense: number = teeModerate + (teeModerate * params[5]) / 100; - const ret: number = (teeLow * preval.lowPALPrevalence) / 100 + return (teeLow * preval.lowPALPrevalence) / 100 + (teeModerate * preval.moderatePALPrevalence) / 100 + (teeIntense * preval.intensePALPrevalence) / 100; - - return ret; }; // BMR (Basal Metabolic Rate) = TMB (Tasa Metabolica Basal) diff --git a/src/Services/ParameterService.ts b/src/Services/ParameterService.ts index fe73c58d3a13d62c1da423682e9a7484da670019..b5e96405fe1b9e4d7217ddbb5aab4ca66af77c21 100644 --- a/src/Services/ParameterService.ts +++ b/src/Services/ParameterService.ts @@ -11,6 +11,13 @@ import DefaultWeightDTO from '../DTOs/DefaultWeightDTO'; import ParameterWrapperDTO from '../DTOs/ParameterWrapperDTO'; import { extraDataIDs } from '../Config/Constants'; +const pushExtraData = (rows: DefaultExtraData[], arr: number[]): void => { + rows.forEach((row: DefaultExtraData) => { + const constant: DefaultExtraDataDTO = ParameterMapper.defaultExtraDataToDTO(row); + arr.push(constant.value); + }); +}; + const getEquationValues = async (ageBracket: AgeBracket, sex: Sex): Promise<number[]> => { const res: number[] = []; await EquationConstant.findAll({ @@ -47,10 +54,7 @@ const getEquationValues = async (ageBracket: AgeBracket, sex: Sex): Promise<numb order: [['order', 'ASC']], }) .then((rows: DefaultExtraData[]) => { - rows.forEach((row: DefaultExtraData) => { - const constant: DefaultExtraDataDTO = ParameterMapper.defaultExtraDataToDTO(row); - res.push(constant.value); - }); + pushExtraData(rows, res); }); break; } @@ -71,10 +75,7 @@ const getEquationValues = async (ageBracket: AgeBracket, sex: Sex): Promise<numb order: [['order', 'ASC']], }) .then((rows: DefaultExtraData[]) => { - rows.forEach((row: DefaultExtraData) => { - const constant: DefaultExtraDataDTO = ParameterMapper.defaultExtraDataToDTO(row); - res.push(constant.value); - }); + pushExtraData(rows, res); }); } else { await DefaultExtraData.findAll({ @@ -87,10 +88,7 @@ const getEquationValues = async (ageBracket: AgeBracket, sex: Sex): Promise<numb order: [['order', 'ASC']], }) .then((rows: DefaultExtraData[]) => { - rows.forEach((row: DefaultExtraData) => { - const constant: DefaultExtraDataDTO = ParameterMapper.defaultExtraDataToDTO(row); - res.push(constant.value); - }); + pushExtraData(rows, res); }); } break; @@ -112,10 +110,7 @@ const getEquationValues = async (ageBracket: AgeBracket, sex: Sex): Promise<numb order: [['order', 'ASC']], }) .then((rows: DefaultExtraData[]) => { - rows.forEach((row: DefaultExtraData) => { - const constant: DefaultExtraDataDTO = ParameterMapper.defaultExtraDataToDTO(row); - res.push(constant.value); - }); + pushExtraData(rows, res); }); } else { await DefaultExtraData.findAll({ @@ -128,10 +123,7 @@ const getEquationValues = async (ageBracket: AgeBracket, sex: Sex): Promise<numb order: [['order', 'ASC']], }) .then((rows: DefaultExtraData[]) => { - rows.forEach((row: DefaultExtraData) => { - const constant: DefaultExtraDataDTO = ParameterMapper.defaultExtraDataToDTO(row); - res.push(constant.value); - }); + pushExtraData(rows, res); }); } break; @@ -147,10 +139,7 @@ const getEquationValues = async (ageBracket: AgeBracket, sex: Sex): Promise<numb order: [['order', 'ASC']], }) .then((rows: DefaultExtraData[]) => { - rows.forEach((row: DefaultExtraData) => { - const constant: DefaultExtraDataDTO = ParameterMapper.defaultExtraDataToDTO(row); - res.push(constant.value); - }); + pushExtraData(rows, res); }); break; } @@ -255,6 +244,29 @@ const updatePercentage = async (params: DefaultExtraDataDTO[], total: number): P } }; +const updatePair = async (param: DefaultExtraDataDTO, pairID: string): Promise<void> => { + await DefaultExtraData.update( + { value: param.value }, + { + where: { + id: param.id, + }, + }, + ).catch((err) => { + throw err; + }); + await DefaultExtraData.update( + { value: (100 - param.value) }, + { + where: { + id: pairID, + }, + }, + ).catch((err) => { + throw err; + }); +}; + const updateExtraData = async (parameters: DefaultExtraDataDTO[]): Promise<void> => { const ids: string[] = []; let total = 0; @@ -271,23 +283,17 @@ const updateExtraData = async (parameters: DefaultExtraDataDTO[]): Promise<void> throw new Error('Missing parameter for update'); } } else if (ids.includes(extraDataIDs.urbPopPerc)) { - if (ids.includes(extraDataIDs.rurPopPerc)) { - updatePercentage(parameters, total); - } else { - throw new Error('Missing parameter for update'); - } + updatePair(parameters[0], extraDataIDs.rurPopPerc); + } else if (ids.includes(extraDataIDs.rurPopPerc)) { + updatePair(parameters[0], extraDataIDs.urbPopPerc); } else if (ids.includes(extraDataIDs.urbAdultActPerc)) { - if (ids.includes(extraDataIDs.urbAdultLowPerc)) { - updatePercentage(parameters, total); - } else { - throw new Error('Missing parameter for update'); - } + updatePair(parameters[0], extraDataIDs.urbAdultLowPerc); + } else if (ids.includes(extraDataIDs.urbAdultLowPerc)) { + updatePair(parameters[0], extraDataIDs.urbAdultActPerc); } else if (ids.includes(extraDataIDs.rurAdultActPerc)) { - if (ids.includes(extraDataIDs.rurAdultLowPerc)) { - updatePercentage(parameters, total); - } else { - throw new Error('Missing parameter for update'); - } + updatePair(parameters[0], extraDataIDs.rurAdultLowPerc); + } else if (ids.includes(extraDataIDs.rurAdultLowPerc)) { + updatePair(parameters[0], extraDataIDs.rurAdultActPerc); } else { await DefaultExtraData.update( { value: parameters[0].value }, @@ -311,334 +317,3 @@ export default { updateDefaultWeight, updateExtraData, }; - -// const getEquationValues = (ageBracket: AgeBracket, sex: Sex): number[] => { -// let res: number[] = []; -// switch (ageBracket) { -// case (AgeBracket.m0): { -// if (sex === Sex.Male) { -// // -152 + (92.8*MP) + 211 -// res = [-152, 92.8, 211]; -// } else if (sex === Sex.Female) { -// // -152 + (92.8*MP) + 178 -// res = [-152, 92.8, 178]; -// } -// break; -// } -// case (AgeBracket.m1): { -// if (sex === Sex.Male) { -// // -152 + (92.8*MP) + 183 -// res = [-152, 92.8, 183]; -// } else if (sex === Sex.Female) { -// // -152 + (92.8*MP) + 161 -// res = [-152, 92.8, 161]; -// } -// break; -// } -// case (AgeBracket.m2): { -// if (sex === Sex.Male) { -// // -152 + (92.8*MP) + 139 -// res = [-152, 92.8, 139]; -// } else if (sex === Sex.Female) { -// // -152 + (92.8*MP) + 134 -// res = [-152, 92.8, 134]; -// } -// break; -// } -// case (AgeBracket.m3): { -// if (sex === Sex.Male) { -// // -152 + (92.8*MP) + 53 -// res = [-152, 92.8, 53]; -// } else if (sex === Sex.Female) { -// // -152 + (92.8*MP) + 68 -// res = [-152, 92.8, 68]; -// } -// break; -// } -// case (AgeBracket.m4): { -// if (sex === Sex.Male) { -// // -152 + (92.8*MP) + 46 -// res = [-152, 92.8, 46]; -// } else if (sex === Sex.Female) { -// // -152 + (92.8*MP) + 57 -// res = [-152, 92.8, 57]; -// } -// break; -// } -// case (AgeBracket.m5): { -// if (sex === Sex.Male) { -// // -152 + (92.8*MP) + 36 -// res = [-152, 92.8, 36]; -// } else if (sex === Sex.Female) { -// // -152 + (92.8*MP) + 47 -// res = [-152, 92.8, 47]; -// } -// break; -// } -// case (AgeBracket.m6): { -// if (sex === Sex.Male) { -// // -99.4 + (88.6*MP) + 17 -// res = [-99.4, 88.6, 17]; -// } else if (sex === Sex.Female) { -// // -99.4 + (88.6*MP) + 20 -// res = [-99.4, 88.6, 20]; -// } -// break; -// } -// case (AgeBracket.m7): { -// if (sex === Sex.Male) { -// // -99.4 + (88.6*MP) + 16 -// res = [-99.4, 88.6, 16]; -// } else if (sex === Sex.Female) { -// // -99.4 + (88.6*MP) + 17 -// res = [-99.4, 88.6, 17]; -// } -// break; -// } -// case (AgeBracket.m8): { -// if (sex === Sex.Male) { -// // -99.4 + (88.6*MP) + 14 -// res = [-99.4, 88.6, 14]; -// } else if (sex === Sex.Female) { -// // -99.4 + (88.6*MP) + 15 -// res = [-99.4, 88.6, 15]; -// } -// break; -// } -// case (AgeBracket.m9): { -// if (sex === Sex.Male) { -// // -99.4 + (88.6*MP) + 21 -// res = [-99.4, 88.6, 21]; -// } else if (sex === Sex.Female) { -// // -99.4 + (88.6*MP) + 18 -// res = [-99.4, 88.6, 18]; -// } -// break; -// } -// case (AgeBracket.m10): { -// if (sex === Sex.Male) { -// // -99.4 + (88.6*MP) + 21 -// res = [-99.4, 88.6, 21]; -// } else if (sex === Sex.Female) { -// // -99.4 + (88.6*MP) + 15 -// res = [-99.4, 88.6, 15]; -// } -// break; -// } -// case (AgeBracket.m11): { -// if (sex === Sex.Male) { -// // -99.4 + (88.6*MP) + 22 -// res = [-99.4, 88.6, 22]; -// } else if (sex === Sex.Female) { -// // -99.4 + (88.6*MP) + 14 -// res = [-99.4, 88.6, 14]; -// } -// break; -// } -// case (AgeBracket.a1): { -// 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.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.Male) { -// // 310.2 + (63.3*MP) - 0.263*MP^2 + 12 -// res = [310.2, 63.3, -0.263, 12]; -// } 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.Male) { -// // 310.2 + (63.3*MP) - 0.263*MP^2 + 12 -// res = [310.2, 63.3, -0.263, 12]; -// } 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.Male) { -// // 310.2 + (63.3*MP) - 0.263*MP^2 + 11 -// res = [310.2, 63.3, -0.263, 11]; -// } 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.Male) { -// // 310.2 + (63.3*MP) - 0.263*MP^2 + 11 -// res = [310.2, 63.3, -0.263, 11]; -// } 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'); -// } -// } -// return res; -// };