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); }); });