Checkpoint: Audit de robustesse et maintenabilité : calcul dynamique des tendances OPEX par véritable année N-1, filtrage/validation centralisés des codes établissement, transactions d'import et d'écriture, contraintes uniques CAPEX/OPEX avec déduplication, suppression effective de postes OPEX, nettoyage des gabarits et scripts morts, chargement différé XLSX, documentation métier et 22 tests passants.

This commit is contained in:
Manus
2026-08-17 20:50:33 +00:00
parent 31cdb257fb
commit 615dd46059
29 changed files with 1449 additions and 3307 deletions

View File

@@ -0,0 +1,50 @@
import { describe, expect, it } from "vitest";
import { calculateCategoryTrends } from "./opexTrends";
describe("calculateCategoryTrends", () => {
it("compare les montants de l'exercice affiché à ceux de sa vraie année N-1", () => {
const trends = calculateCategoryTrends(
[
{ categorie: "App global", montant: 504_980 },
{ categorie: "App HEP", montant: 98_000 },
],
[
{ categorie: "App global", montant: 505_730 },
{ categorie: "App HEP", montant: 98_000 },
],
);
// Régression : 2027 ne doit jamais réutiliser le +26 % (comparaison 2026/2025).
expect(trends["App global"]).toEqual({
montantN1: 505_730,
variationPct: -0.1,
tendance: "stable",
});
expect(trends["App HEP"]).toEqual({
montantN1: 98_000,
variationPct: 0,
tendance: "stable",
});
});
it("identifie une nouvelle catégorie et une variation significative", () => {
const trends = calculateCategoryTrends(
[
{ categorie: "App global", montant: 1_050 },
{ categorie: "Sécurité", montant: 20 },
],
[{ categorie: "App global", montant: 1_000 }],
);
expect(trends["App global"]).toEqual({
montantN1: 1_000,
variationPct: 5,
tendance: "hausse",
});
expect(trends["Sécurité"]).toEqual({
montantN1: null,
variationPct: null,
tendance: "new",
});
});
});