diff --git a/src/Controllers/SheetController.ts b/src/Controllers/SheetController.ts
index 57cc9bcaab7fbf6df0bcef01a6a5efb3a3f51b80..63b65e7b5fd4bb1bd2843995afcbbcf3fb406d3b 100644
--- a/src/Controllers/SheetController.ts
+++ b/src/Controllers/SheetController.ts
@@ -1,21 +1,19 @@
import {
Handler, Request, Response, Router,
} from 'express';
+import { SheetParserResponse } from '../Models/SheetParserResponse';
import SheetService from '../Services/SheetService';
const router = Router();
-// const parseExcel = async (req:Request, res:Response) => {
-// res.status(200).send(parseExcelService());
-// };
-
const parseSheet: Handler = async (req: Request, res: Response) => {
const sheet: Buffer = req.body;
try {
- const parsedSheet: JSON = SheetService.parseSheetService(sheet);
+ const parsedSheet: SheetParserResponse = SheetService.parseSheetService(sheet);
return res.status(200).send(parsedSheet);
} catch (error) {
- return res.status(400).send({ error });
+ const e = error as Error;
+ return res.status(400).json({ error: e.message });
}
};
diff --git a/src/Models/SheetParserResponse.ts b/src/Models/SheetParserResponse.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c29b9e8aa94f52bc8ac2512aba15bbc90e26d29a
--- /dev/null
+++ b/src/Models/SheetParserResponse.ts
@@ -0,0 +1,31 @@
+type SheetParserResponse = {
+ hombresMenores: Menores[] | null;
+ mujeresMenores: Menores[] | null;
+ hombres: Mayores[] | null;
+ mujeres: Mayores[] | null;
+} | null;
+
+type Menores = {
+ edad: number;
+ peso: number;
+} | null;
+
+type Mayores = {
+ edad: number;
+ peso?: number;
+ talla?: number;
+} | null;
+
+type MenoresSheet = {
+ 'Edad (meses)': number;
+ 'Peso (Kg)': number;
+};
+type MayoresSheet = {
+ 'Edad (años)': number;
+ 'Peso (Kg)': number;
+ 'Talla (cm)': number;
+};
+
+export type {
+ SheetParserResponse, Menores, Mayores, MenoresSheet, MayoresSheet,
+};
diff --git a/src/Services/SheetService.ts b/src/Services/SheetService.ts
index 846ca0e5e60c4b5b57e2daebcd18236c8348401b..79f94f559f76761daa7232daf033ba181fed1962 100644
--- a/src/Services/SheetService.ts
+++ b/src/Services/SheetService.ts
@@ -1,39 +1,138 @@
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 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;
+// };
-/* EXPORT FUNCTIONS */
+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 parseSheetService = (data: Buffer): JSON => {
- const workbook: XLSX.WorkBook = XLSX.read(data);
- let parsed: JSON = JSON.parse('{}');
+ const aux = XLSX.utils.sheet_to_json(worksheet, { range: newRange }) as unknown as MayoresSheet[];
- const sheetName = workbook.SheetNames[0];
- const worksheet: XLSX.WorkSheet = workbook.Sheets[sheetName];
+ 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 has ocurred in parseSheetService');
+ if (ref === undefined) throw new Error('An error ocurred');
const range = XLSX.utils.decode_range(ref);
- range.s.c = 0; // 0 == XLSX.utils.decode_col("A")
- range.e.c = 1; // 1 == XLSX.utils.decode_col("B")
+ range.s.c = 0;
+ range.e.c = 2;
const newRange = XLSX.utils.encode_range(range);
- const workSheetWithRowDeleted: XLSX.WorkSheet = deleteRow(worksheet, 0);
- // eslint-disable-next-line max-len
- parsed = XLSX.utils.sheet_to_json(workSheetWithRowDeleted, { range: newRange }) as unknown as JSON;
+
+ 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
diff --git a/src/Services/test.xlsx b/src/Services/test.xlsx
index b667311d3984b4b12e566d04533cd3c294f50c94..9fef8e5821051fe4270710bcec7daf0e25d1894a 100644
Binary files a/src/Services/test.xlsx and b/src/Services/test.xlsx differ