diff --git a/src/Controllers/SheetController.ts b/src/Controllers/SheetController.ts index 8658d81664d845cb843432bd05f3bf7dc91106bd..727fc2700141838ffbac52798702d4a67f5a7e56 100644 --- a/src/Controllers/SheetController.ts +++ b/src/Controllers/SheetController.ts @@ -4,13 +4,14 @@ import { import { SheetParserResponse } from '../Models/SheetParserResponse'; import SheetService from '../Services/SheetService'; import logger from '../Logger/logger'; +import AgeGroupJSON from '../DTOs/AgeGroupJSON'; const router = Router(); const parseSheet: Handler = async (req: Request, res: Response) => { const sheet: Buffer = req.body; try { - const parsedSheet: SheetParserResponse = SheetService.parseSheetService(sheet); + const parsedSheet: AgeGroupJSON[] = SheetService.parseSheetService(sheet); return res.status(200).send(parsedSheet); } catch (error) { const e = error as Error; diff --git a/src/Enum/AgeBracket.ts b/src/Enum/AgeBracket.ts index f3610df9f3b5d86a7861cb90bec46cb76800b016..2017b243bce735fb12ad292cb427a43e10f9d5a0 100644 --- a/src/Enum/AgeBracket.ts +++ b/src/Enum/AgeBracket.ts @@ -1,6 +1,6 @@ enum AgeBracket { m0 = '0 meses', - m1 = '1 mes', + m1 = '1 meses', m2 = '2 meses', m3 = '3 meses', m4 = '4 meses', diff --git a/src/Services/SheetService.ts b/src/Services/SheetService.ts index e30e75a1e5f332c98a5a69bf0670a1e916313cd9..31ac0cf150bf9115786884c35d2e1f174ab08aa6 100644 --- a/src/Services/SheetService.ts +++ b/src/Services/SheetService.ts @@ -1,8 +1,11 @@ import * as XLSX from 'xlsx'; import { SheetNames } from '../Config/Constants'; +import AgeGroupJSON from '../DTOs/AgeGroupJSON'; +import Sex from '../Enum/Sex'; import { SheetParserResponse, Menores, Mayores, MenoresSheet, MayoresSheet, } from '../Models/SheetParserResponse'; +import ParameterService from './ParameterService'; /* PRIVATE FUNCTIONS */ // const ec = (r: number, c: number): string => XLSX.utils.encode_cell({ r, c }); @@ -56,12 +59,30 @@ const parseBabies = (worksheet: XLSX.WorkSheet): Menores[] => { }); return res; }; +const getMedianFromArray = (arr: number[]): number => { + const arrSort = arr.sort((a, b) => a - b); + const len = arr.length; + const mid = Math.ceil(len / 2); + const median = len % 2 === 0 ? (arrSort[mid] + arrSort[mid - 1]) / 2 : arrSort[mid - 1]; + return median; +}; + +const getLiteralGroup = (age: number): string => { + if (age >= 18 && age <= 29) { + return '18-29'; + } if (age >= 30 && age <= 59) { + return '30-59'; + } if (age >= 60) { + return '60+'; + } + return `${age}`; +}; /* EXPORT FUNCTIONS */ -const parseSheetService = (data: Buffer): SheetParserResponse => { +const parseSheetService = (data: Buffer): AgeGroupJSON[] => { const workbook: XLSX.WorkBook = XLSX.read(data); - let parsed: SheetParserResponse = null; + const parsed: SheetParserResponse = null; let hombresMenores: Menores[] = []; let hombres: Mayores[] = []; let mujeresMenores: Menores[] = []; @@ -92,14 +113,109 @@ const parseSheetService = (data: Buffer): SheetParserResponse => { throw new Error(`Sheet name ${name} is not part of the scheme `); } }); - parsed = { - hombresMenores, - hombres, - mujeresMenores, - mujeres, - }; - - return parsed; + + const res: AgeGroupJSON[] = []; + + let auxObj: {[key: string]: number[]} = {}; + // group HombresMenores + // Iterate on hombresMenores and put + // elemnts on auxObj + hombresMenores.forEach((item) => { + if (item === null) throw new Error('Item is null'); + const bridge: string = (item.edad).toString(); + auxObj[bridge] = auxObj[bridge] ? auxObj[bridge] : []; + (auxObj[bridge]).push(item.peso); + }); + // creates AgeGroup and insert into res + let auxObjKeys = Object.keys(auxObj); + auxObjKeys.forEach((key) => { + const toInsert: AgeGroupJSON = { + age: `${key} meses`, + sex: Sex.Male, + medianWeight: getMedianFromArray(auxObj[key]), + population: auxObj[key].length, + }; + res.push(toInsert); + }); + + auxObj = {}; + + mujeresMenores.forEach((item) => { + if (item === null) throw new Error('Item is null'); + const bridge: string = (item.edad).toString(); + auxObj[bridge] = auxObj[bridge] ? auxObj[bridge] : []; + (auxObj[bridge]).push(item.peso); + }); + + // creates AgeGroup for mujeresMenores and insert into res + auxObjKeys = Object.keys(auxObj); + auxObjKeys.forEach((key) => { + const toInsert: AgeGroupJSON = { + age: `${key} meses`, + sex: Sex.Female, + medianWeight: getMedianFromArray(auxObj[key]), + population: auxObj[key].length, + }; + res.push(toInsert); + }); + + auxObj = {}; + hombres.forEach((item) => { + if (item === null) throw new Error('Item is null'); + const bridge: string = getLiteralGroup(item.edad); + auxObj[bridge] = auxObj[bridge] ? auxObj[bridge] : []; + let peso; + if (!item.peso) { + if (!item.talla) { throw new Error('Talla and Peso not defined'); } + // ParameterService. TODO: + peso = 0; + } else { + peso = item.peso; + } + (auxObj[bridge]).push(peso); + }); + + // creates AgeGroup for hombres and insert into res + auxObjKeys = Object.keys(auxObj); + auxObjKeys.forEach((key) => { + const toInsert: AgeGroupJSON = { + age: `${key} años`, + sex: Sex.Male, + medianWeight: getMedianFromArray(auxObj[key]), + population: auxObj[key].length, + }; + res.push(toInsert); + }); + + auxObj = {}; + mujeres.forEach((item) => { + if (item === null) throw new Error('Item is null'); + const bridge: string = getLiteralGroup(item.edad); + auxObj[bridge] = auxObj[bridge] ? auxObj[bridge] : []; + let peso; + if (!item.peso) { + if (!item.talla) { throw new Error('Talla and Peso not defined'); } + // ParameterService. TODO: + peso = 0; + } else { + peso = item.peso; + } + (auxObj[bridge]).push(peso); + }); + + // creates AgeGroup for hombres and insert into res + auxObjKeys = Object.keys(auxObj); + auxObjKeys.forEach((key) => { + const toInsert: AgeGroupJSON = { + age: `${key} años`, + sex: Sex.Female, + medianWeight: getMedianFromArray(auxObj[key]), + population: auxObj[key].length, + }; + res.push(toInsert); + }); + + return res; // TODO: depends on sheet layout what to do }; diff --git a/src/Services/test.xlsx b/src/Services/test.xlsx index 3edb2bfeb00af26dd42279a2a4ebbdd2beb50724..caa1d8a9c0b7b1c761755a5f9885356dd2df8a4d 100644 Binary files a/src/Services/test.xlsx and b/src/Services/test.xlsx differ