Checkpoint: Ajout de la projection annuelle prévisionnel-réel dans Masse salariale : import contrôlé du fichier modèle 2025-2027, réel 2026 provenant uniquement des liasses Salaires, ajustements administrateur limités aux primes et évolutions de l'année courante/future, conservation des centimes, modèle de calcul testé et documentation. 72 tests, TypeScript et build validés.
This commit is contained in:
68
server/masseSalarialeWorkbookImport.test.ts
Normal file
68
server/masseSalarialeWorkbookImport.test.ts
Normal file
@@ -0,0 +1,68 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { parseMasseSalarialeWorkbookRows } from "./masseSalarialeWorkbookImport";
|
||||
|
||||
describe("import du modèle Masse salariale", () => {
|
||||
it("importe les prévisionnels sans confondre taux, primes et évolutions", () => {
|
||||
const rows: Array<Array<string | number | Date | null>> = Array.from({ length: 5 }, () => []);
|
||||
rows.push([
|
||||
null,
|
||||
"000001",
|
||||
"NOM",
|
||||
"PRENOM",
|
||||
"Poste",
|
||||
new Date("2024-01-01T00:00:00.000Z"),
|
||||
35_000,
|
||||
37_000,
|
||||
2_000,
|
||||
2_916.67,
|
||||
0.45,
|
||||
1_000,
|
||||
36_000,
|
||||
39_000,
|
||||
2_500,
|
||||
3_000,
|
||||
0.46,
|
||||
1_500,
|
||||
40_000,
|
||||
43_000,
|
||||
2_000,
|
||||
3_333.33,
|
||||
null,
|
||||
2_000,
|
||||
0.5,
|
||||
]);
|
||||
|
||||
const parsed = parseMasseSalarialeWorkbookRows(rows);
|
||||
|
||||
expect(parsed.salaries).toHaveLength(1);
|
||||
expect(parsed.remunerations).toHaveLength(3);
|
||||
expect(parsed.remunerations.find((row) => row.annee === 2026)).toMatchObject({
|
||||
salaireAnnuelBrutHorsPrimesCents: 3_600_000,
|
||||
salaireAnnuelBrutAvecPrimesCents: 3_900_000,
|
||||
primeAstreinteCents: 250_000,
|
||||
evolutionCents: 150_000,
|
||||
tauxChargeBps: 4_600,
|
||||
primeCents: 0,
|
||||
});
|
||||
expect(parsed.remunerations.find((row) => row.annee === 2027)).toMatchObject({
|
||||
primeCents: 50,
|
||||
evolutionCents: 200_000,
|
||||
tauxChargeBps: null,
|
||||
});
|
||||
});
|
||||
|
||||
it("accepte les lignes SheetJS sans cellule A vide et les dates Excel numériques", () => {
|
||||
const rows: Array<Array<string | number | Date | null>> = Array.from({ length: 5 }, () => []);
|
||||
rows.push([
|
||||
"000002", "NOM", "PRENOM", "Poste", 45_292,
|
||||
35_000, 37_000, 2_000, 2_916.67, 0.45, 1_000,
|
||||
36_000, 39_000, 2_500, 3_000, 0.46, 1_500,
|
||||
40_000, 43_000, 2_000, 3_333.33, null, 2_000, 0.5,
|
||||
]);
|
||||
|
||||
const parsed = parseMasseSalarialeWorkbookRows(rows);
|
||||
|
||||
expect(parsed.salaries).toMatchObject([{ matricule: "000002", dateEmbauche: "2024-01-01" }]);
|
||||
expect(parsed.remunerations).toHaveLength(3);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user