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:
75
server/masseSalarialeProjection.test.ts
Normal file
75
server/masseSalarialeProjection.test.ts
Normal file
@@ -0,0 +1,75 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import {
|
||||
buildAnnualForecasts,
|
||||
buildAnnualPayrollActuals,
|
||||
isForecastAdjustmentEditable,
|
||||
} from "./masseSalarialeProjection";
|
||||
|
||||
describe("projection prévisionnelle et réelle de masse salariale", () => {
|
||||
it("duplique les données closes 2025 entre prévisionnel et réel", () => {
|
||||
const forecasts = buildAnnualForecasts([
|
||||
{
|
||||
annee: 2025,
|
||||
brutHorsAstreinteReferenceCents: 108_000,
|
||||
brutAvecPrimesReferenceCents: 120_000,
|
||||
primeAstreinteCents: 12_000,
|
||||
primeCents: 0,
|
||||
primeReferenceCents: 0,
|
||||
evolutionCents: 0,
|
||||
evolutionReferenceCents: 0,
|
||||
tauxChargeBps: 4_500,
|
||||
},
|
||||
]);
|
||||
|
||||
expect(forecasts.get(2025)).toMatchObject({
|
||||
brutHorsAstreinteCents: 108_000,
|
||||
brutAvecPrimesCents: 120_000,
|
||||
brutMensuelHorsAstreinteCents: 9_000,
|
||||
tauxChargeBps: 4_500,
|
||||
});
|
||||
});
|
||||
|
||||
it("recalcule le prévisionnel futur à partir de la référence importée et des seules modifications manuelles", () => {
|
||||
const forecasts = buildAnnualForecasts([
|
||||
{
|
||||
annee: 2026,
|
||||
brutHorsAstreinteReferenceCents: 114_000,
|
||||
brutAvecPrimesReferenceCents: 119_000,
|
||||
primeAstreinteCents: 6_000,
|
||||
primeCents: 1_500,
|
||||
primeReferenceCents: 1_000,
|
||||
evolutionCents: 6_000,
|
||||
evolutionReferenceCents: 5_000,
|
||||
tauxChargeBps: 4_600,
|
||||
},
|
||||
]);
|
||||
|
||||
expect(forecasts.get(2026)).toMatchObject({
|
||||
brutHorsAstreinteCents: 115_500,
|
||||
brutAvecPrimesCents: 120_500,
|
||||
brutMensuelHorsAstreinteCents: 9_625,
|
||||
});
|
||||
});
|
||||
|
||||
it("calcule le réel 2026 à partir des seuls bulletins mensuels archivés, sans extrapolation", () => {
|
||||
const actuals = buildAnnualPayrollActuals([
|
||||
{ annee: 2026, mois: 5, matricule: "test-1", brutMensuelCents: 10_000, brutAvecPrimesCents: 12_000, primeAstreinteCents: 1_000 },
|
||||
{ annee: 2026, mois: 6, matricule: "test-1", brutMensuelCents: 10_000, brutAvecPrimesCents: 11_000, primeAstreinteCents: 0 },
|
||||
]);
|
||||
|
||||
expect(actuals.get("test-1")?.get(2026)).toEqual({
|
||||
brutHorsAstreinteCents: 22_000,
|
||||
brutAvecPrimesCents: 23_000,
|
||||
brutMensuelHorsAstreinteCents: 11_000,
|
||||
primeAstreinteCents: 1_000,
|
||||
primeComplementaireCents: 2_000,
|
||||
moisDisponibles: [5, 6],
|
||||
});
|
||||
});
|
||||
|
||||
it("n'autorise la modification des primes et évolutions qu'à partir de l'année courante", () => {
|
||||
expect(isForecastAdjustmentEditable(2025, 2026)).toBe(false);
|
||||
expect(isForecastAdjustmentEditable(2026, 2026)).toBe(true);
|
||||
expect(isForecastAdjustmentEditable(2027, 2026)).toBe(true);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user