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

22
shared/opexValidation.ts Normal file
View File

@@ -0,0 +1,22 @@
/**
* Règles communes aux imports et écritures de bases de répartition OPEX.
*
* Les fichiers sources mélangent parfois des lignes d'établissement avec des
* en-têtes de catégories ou des totaux. Cette validation est appliquée côté
* client pour guider l'utilisateur et côté serveur pour protéger la BDD.
*/
const OPEX_SUMMARY_LABEL = /^(?:infog|s.curit|t.l.phonie|app(?:licatifs)?(?:\s|$)|total|ventilation|r.partition|nouveaut)/i;
/** Préserve l'affichage du code, tout en stabilisant casse et espaces. */
export function normalizeOpexEtablissementCode(value: string): string {
return value.trim().replace(/\s+/g, " ").toUpperCase();
}
/**
* Un code établissement OPEX débute toujours par son code numérique d'entité.
* Les suffixes composites historiques (« + CAC », « +MIC ») restent admis.
*/
export function isOpexEtablissementCode(value: string): boolean {
const code = normalizeOpexEtablissementCode(value);
return code.length > 0 && /^\d{4}[A-Z0-9 +]*$/.test(code) && !OPEX_SUMMARY_LABEL.test(code);
}