Checkpoint: Masse salariale enrichie : import Excel administrateur côté serveur, projections annuelles 2025-2027 importées du fichier de référence, réel 2026 exclusivement calculé sur les liasses archivées, conservation des montants de référence et des centimes, éditions limitées aux primes et évolutions de l'exercice courant/futur. 74 tests, TypeScript et build validés.
All checks were successful
Validation applicative / TypeScript, tests et build (push) Successful in 5m21s
All checks were successful
Validation applicative / TypeScript, tests et build (push) Successful in 5m21s
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import type { MasseSalarialeImportRemuneration, MasseSalarialeImportSalarie } from "./db";
|
||||
import XLSX from "xlsx";
|
||||
|
||||
type SpreadsheetValue = string | number | Date | null | undefined;
|
||||
|
||||
@@ -95,3 +96,23 @@ export function parseMasseSalarialeWorkbookRows(rows: SpreadsheetValue[][]): Mas
|
||||
|
||||
return { salaries, remunerations };
|
||||
}
|
||||
|
||||
/**
|
||||
* Lit le fichier exclusivement côté serveur, afin que les données de masse
|
||||
* salariale ne soient ni transformées ni renvoyées par le navigateur.
|
||||
*/
|
||||
export function parseMasseSalarialeWorkbookBuffer(buffer: Buffer): MasseSalarialeWorkbookImport {
|
||||
const workbook = XLSX.read(buffer, { type: "buffer", cellDates: true });
|
||||
const sheet = workbook.Sheets["Masse salariale"];
|
||||
if (!sheet) throw new Error("Feuille Masse salariale introuvable");
|
||||
const rows = XLSX.utils.sheet_to_json<SpreadsheetValue[]>(sheet, {
|
||||
header: 1,
|
||||
raw: true,
|
||||
defval: null,
|
||||
});
|
||||
const parsed = parseMasseSalarialeWorkbookRows(rows);
|
||||
if (parsed.salaries.length === 0 || parsed.remunerations.length === 0) {
|
||||
throw new Error("Le fichier ne contient aucune prévision exploitable");
|
||||
}
|
||||
return parsed;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user