diff --git a/src/Enum/AgeBracket.ts b/src/Enum/AgeBracket.ts new file mode 100644 index 0000000000000000000000000000000000000000..24c996c20f489559ae5175a6122a2eac4d1591c2 --- /dev/null +++ b/src/Enum/AgeBracket.ts @@ -0,0 +1,36 @@ +enum AgeBracket { + '0 meses', + '1 mes', + '2 meses', + '3 meses', + '4 meses', + '5 meses', + '6 meses', + '7 meses', + '8 meses', + '9 meses', + '10 meses', + '11 meses', + '1 año', + '2 años', + '3 años', + '4 años', + '5 años', + '6 años', + '7 años', + '8 años', + '9 años', + '10 años', + '11 años', + '12 años', + '13 años', + '14 años', + '15 años', + '16 años', + '17 años', + '18-29 años', + '30-59 años', + '60+ años' +} + +export default AgeBracket; diff --git a/src/Enum/Sex.ts b/src/Enum/Sex.ts new file mode 100644 index 0000000000000000000000000000000000000000..924f7cd798470f5cb445026da643d93271978487 --- /dev/null +++ b/src/Enum/Sex.ts @@ -0,0 +1,6 @@ +enum Sex { + 'Masculino', + 'Femenino' +} + +export default Sex; diff --git a/src/Models/AgeGroup.ts b/src/Models/AgeGroup.ts new file mode 100644 index 0000000000000000000000000000000000000000..2ef8fa8eae882c4066ac1be51ec7e0b15281b001 --- /dev/null +++ b/src/Models/AgeGroup.ts @@ -0,0 +1,11 @@ +import AgeBracket from '../Enum/AgeBracket' +import Sex from '../Enum/Sex' + +type AgeGroup = { + edad: AgeBracket; + sexo: Sex; + pesoMediano: number; + cantidad: number; +} + +export default AgeGroup; diff --git a/src/Models/EnergeticRequirement.ts b/src/Models/EnergeticRequirement.ts new file mode 100644 index 0000000000000000000000000000000000000000..b1005f859be9890cc99032fd1d839c8b14e0bb26 --- /dev/null +++ b/src/Models/EnergeticRequirement.ts @@ -0,0 +1,6 @@ +type EnergeticRequirement = { + requerimientoEnergeticoPerCapita: number; + requerimientoEnergeticoTotal: number; +} + +export default EnergeticRequirement; diff --git a/src/Services/CalculatorService.ts b/src/Services/CalculatorService.ts new file mode 100644 index 0000000000000000000000000000000000000000..9a2ecae62d934f475a4b42ae6fd461f6410b225c --- /dev/null +++ b/src/Services/CalculatorService.ts @@ -0,0 +1 @@ +import AgeGroup from "../Models/AgeGroup"; \ No newline at end of file diff --git a/src/Services/SheetService.ts b/src/Services/SheetService.ts index 79f94f559f76761daa7232daf033ba181fed1962..035452a01fb9a0926ca76e41111d609d1c26c924 100644 --- a/src/Services/SheetService.ts +++ b/src/Services/SheetService.ts @@ -1,143 +1,143 @@ -import * as XLSX from 'xlsx'; -import { - SheetParserResponse, Menores, Mayores, MenoresSheet, MayoresSheet, -} from '../Models/SheetParserResponse'; - -/* PRIVATE FUNCTIONS */ -// const ec = (r: number, c: number): string => XLSX.utils.encode_cell({ r, c }); -// const deleteRow = (ws: XLSX.WorkSheet, rowIndex: number): XLSX.WorkSheet => { -// const work = ws; -// if (work['!ref'] === undefined) throw new Error('An error has ocurred in deleteRow'); -// const variable = XLSX.utils.decode_range(work['!ref']); -// for (let R = rowIndex; R < variable.e.r; R += 1) { -// for (let C = variable.s.c; C <= variable.e.c; C += 1) { -// work[ec(R, C)] = work[ec(R + 1, C)]; -// } -// } -// variable.e.r -= 1; -// work['!ref'] = XLSX.utils.encode_range(variable.s, variable.e); -// return work; -// }; - -const parseMen = (worksheet: XLSX.WorkSheet): Mayores[] => { - const res: Mayores[] = []; - const ref = worksheet['!ref']; - if (ref === undefined) throw new Error('An error ocurred'); - const range = XLSX.utils.decode_range(ref); - range.s.c = 0; - range.e.c = 2; - const newRange = XLSX.utils.encode_range(range); - - const aux = XLSX.utils.sheet_to_json(worksheet, { range: newRange }) as unknown as MayoresSheet[]; - - aux.forEach((element: MayoresSheet) => { - res.push( - { - edad: element['Edad (años)'], - peso: element['Peso (Kg)'], - talla: element['Talla (cm)'], - }, - ); - }); - return res; -}; - -const parseWomen = (worksheet: XLSX.WorkSheet): Mayores[] => { - const res: Mayores[] = []; - const ref = worksheet['!ref']; - if (ref === undefined) throw new Error('An error ocurred'); - const range = XLSX.utils.decode_range(ref); - range.s.c = 0; - range.e.c = 2; - const newRange = XLSX.utils.encode_range(range); - - const aux = XLSX.utils.sheet_to_json(worksheet, { range: newRange }) as unknown as MayoresSheet[]; - aux.forEach((element: MayoresSheet) => { - res.push( - { - edad: element['Edad (años)'], - peso: element['Peso (Kg)'], - talla: element['Talla (cm)'], - }, - ); - }); - return res; -}; - -const parseMenLessThanAYear = (worksheet: XLSX.WorkSheet): Menores[] => { - const res: Menores[] = []; - const aux = XLSX.utils.sheet_to_json(worksheet) as unknown as MenoresSheet[]; - aux.forEach((element: MenoresSheet) => { - res.push( - { - edad: element['Edad (meses)'], - peso: element['Peso (Kg)'], - }, - ); - }); - return res; -}; - -const parseWomenLessThanAYear = (worksheet: XLSX.WorkSheet): Menores[] => { - const res: Menores[] = []; - const aux = XLSX.utils.sheet_to_json(worksheet) as unknown as MenoresSheet[]; - aux.forEach((element: MenoresSheet) => { - res.push( - { - edad: element['Edad (meses)'], - peso: element['Peso (Kg)'], - }, - ); - }); - return res; -}; - -/* EXPORT FUNCTIONS */ - -const parseSheetService = (data: Buffer): SheetParserResponse => { - const workbook: XLSX.WorkBook = XLSX.read(data); - let parsed: SheetParserResponse = null; - let hombresMenores: Menores[] = []; - let hombres: Mayores[] = []; - let mujeresMenores: Menores[] = []; - let mujeres: Mayores[] = []; - - const sheetNames: string[] = workbook.SheetNames; - // Check there are 4 sheets, no more, no less - if (sheetNames.length !== 4) { - throw new Error('File does not respect scheme, there are more or less than 4 sheets'); - } - sheetNames.forEach((name) => { - const worksheet: XLSX.WorkSheet = workbook.Sheets[name]; - switch (name) { - case 'Hombres<1': - hombresMenores = parseMenLessThanAYear(worksheet); - break; - case 'Hombres': - hombres = parseMen(worksheet); - break; - case 'Mujeres<1': - mujeresMenores = parseWomenLessThanAYear(worksheet); - break; - case 'Mujeres': - mujeres = parseWomen(worksheet); - break; - - default: - throw new Error(`Sheet name ${name} is not part of the scheme `); - } - }); - parsed = { - hombresMenores, - hombres, - mujeresMenores, - mujeres, - }; - - return parsed; - // TODO: depends on sheet layout what to do -}; - -export default { - parseSheetService, -}; +import * as XLSX from 'xlsx'; +import { + SheetParserResponse, Menores, Mayores, MenoresSheet, MayoresSheet, +} from '../Models/SheetParserResponse'; + +/* PRIVATE FUNCTIONS */ +// const ec = (r: number, c: number): string => XLSX.utils.encode_cell({ r, c }); +// const deleteRow = (ws: XLSX.WorkSheet, rowIndex: number): XLSX.WorkSheet => { +// const work = ws; +// if (work['!ref'] === undefined) throw new Error('An error has ocurred in deleteRow'); +// const variable = XLSX.utils.decode_range(work['!ref']); +// for (let R = rowIndex; R < variable.e.r; R += 1) { +// for (let C = variable.s.c; C <= variable.e.c; C += 1) { +// work[ec(R, C)] = work[ec(R + 1, C)]; +// } +// } +// variable.e.r -= 1; +// work['!ref'] = XLSX.utils.encode_range(variable.s, variable.e); +// return work; +// }; + +const parseMen = (worksheet: XLSX.WorkSheet): Mayores[] => { + const res: Mayores[] = []; + const ref = worksheet['!ref']; + if (ref === undefined) throw new Error('An error ocurred'); + const range = XLSX.utils.decode_range(ref); + range.s.c = 0; + range.e.c = 2; + const newRange = XLSX.utils.encode_range(range); + + const aux = XLSX.utils.sheet_to_json(worksheet, { range: newRange }) as unknown as MayoresSheet[]; + + aux.forEach((element: MayoresSheet) => { + res.push( + { + edad: element['Edad (años)'], + peso: element['Peso (Kg)'], + talla: element['Talla (cm)'], + }, + ); + }); + return res; +}; + +const parseWomen = (worksheet: XLSX.WorkSheet): Mayores[] => { + const res: Mayores[] = []; + const ref = worksheet['!ref']; + if (ref === undefined) throw new Error('An error ocurred'); + const range = XLSX.utils.decode_range(ref); + range.s.c = 0; + range.e.c = 2; + const newRange = XLSX.utils.encode_range(range); + + const aux = XLSX.utils.sheet_to_json(worksheet, { range: newRange }) as unknown as MayoresSheet[]; + aux.forEach((element: MayoresSheet) => { + res.push( + { + edad: element['Edad (años)'], + peso: element['Peso (Kg)'], + talla: element['Talla (cm)'], + }, + ); + }); + return res; +}; + +const parseMenLessThanAYear = (worksheet: XLSX.WorkSheet): Menores[] => { + const res: Menores[] = []; + const aux = XLSX.utils.sheet_to_json(worksheet) as unknown as MenoresSheet[]; + aux.forEach((element: MenoresSheet) => { + res.push( + { + edad: element['Edad (meses)'], + peso: element['Peso (Kg)'], + }, + ); + }); + return res; +}; + +const parseWomenLessThanAYear = (worksheet: XLSX.WorkSheet): Menores[] => { + const res: Menores[] = []; + const aux = XLSX.utils.sheet_to_json(worksheet) as unknown as MenoresSheet[]; + aux.forEach((element: MenoresSheet) => { + res.push( + { + edad: element['Edad (meses)'], + peso: element['Peso (Kg)'], + }, + ); + }); + return res; +}; + +/* EXPORT FUNCTIONS */ + +const parseSheetService = (data: Buffer): SheetParserResponse => { + const workbook: XLSX.WorkBook = XLSX.read(data); + let parsed: SheetParserResponse = null; + let hombresMenores: Menores[] = []; + let hombres: Mayores[] = []; + let mujeresMenores: Menores[] = []; + let mujeres: Mayores[] = []; + + const sheetNames: string[] = workbook.SheetNames; + // Check there are 4 sheets, no more, no less + if (sheetNames.length !== 4) { + throw new Error('File does not respect scheme, there are more or less than 4 sheets'); + } + sheetNames.forEach((name) => { + const worksheet: XLSX.WorkSheet = workbook.Sheets[name]; + switch (name) { + case 'Hombres<1': + hombresMenores = parseMenLessThanAYear(worksheet); + break; + case 'Hombres': + hombres = parseMen(worksheet); + break; + case 'Mujeres<1': + mujeresMenores = parseWomenLessThanAYear(worksheet); + break; + case 'Mujeres': + mujeres = parseWomen(worksheet); + break; + + default: + throw new Error(`Sheet name ${name} is not part of the scheme `); + } + }); + parsed = { + hombresMenores, + hombres, + mujeresMenores, + mujeres, + }; + + return parsed; + // TODO: depends on sheet layout what to do +}; + +export default { + parseSheetService, +}; diff --git a/src/index.ts b/src/index.ts index 9fdd678e0bcf2d912ae8503fedaa1f7dedd5552b..18ca99641af256dff1c9124dfe8db221d31d945c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,49 +1,49 @@ -/* eslint-disable no-console */ -import express, { Application } from 'express'; -import 'dotenv/config'; -import cors from 'cors'; -import swaggerJsDoc, { Options } from 'swagger-jsdoc'; -import swaggerUi from 'swagger-ui-express'; -import Routes from './routes'; - -const app: Application = express(); -const PORT = process.env.PORT || 8000; - -// swagger init -const swaggerOptions: Options = { - swaggerDefinition: { - openapi: '3.0.0', - info: { - title: 'REPP Rest API', - version: '1.0.0', - description: '', - servers: ['http://localhost:3000'], - }, - }, - apis: ['src/routes.ts'], -}; -const swaggerDocs = swaggerJsDoc(swaggerOptions); - -// middlewares -app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocs)); - -app.use(express.json({ - limit: '50mb', -})); -app.use(express.urlencoded({ extended: false })); -app.use(cors({ - origin: '*', - methods: 'GET,HEAD,PUT,PATCH,POST,DELETE', - preflightContinue: false, - optionsSuccessStatus: 204, -})); - -app.use(express.raw({ - limit: '50mb', -})); - -app.use(Routes); - -app.listen(PORT, (): void => { - console.log(`REPP Backend running here 👉 https://localhost:${PORT}`); -}); +/* eslint-disable no-console */ +import express, { Application } from 'express'; +import 'dotenv/config'; +import cors from 'cors'; +import swaggerJsDoc, { Options } from 'swagger-jsdoc'; +import swaggerUi from 'swagger-ui-express'; +import Routes from './routes'; + +const app: Application = express(); +const PORT = process.env.PORT || 8000; + +// swagger init +const swaggerOptions: Options = { + swaggerDefinition: { + openapi: '3.0.0', + info: { + title: 'REPP Rest API', + version: '1.0.0', + description: '', + servers: ['http://localhost:3000'], + }, + }, + apis: ['src/routes.ts'], +}; +const swaggerDocs = swaggerJsDoc(swaggerOptions); + +// middlewares +app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocs)); + +app.use(express.json({ + limit: '50mb', +})); +app.use(express.urlencoded({ extended: false })); +app.use(cors({ + origin: '*', + methods: 'GET,HEAD,PUT,PATCH,POST,DELETE', + preflightContinue: false, + optionsSuccessStatus: 204, +})); + +app.use(express.raw({ + limit: '50mb', +})); + +app.use(Routes); + +app.listen(PORT, (): void => { + console.log(`REPP Backend running here 👉 https://localhost:${PORT}`); +});