Checkpoint: La vue Établissements de la page OPEX recalcule désormais dynamiquement les montants par établissement depuis les postes éditables (totalPostes × ratio_base_repartition), au lieu de lire les montants pré-calculés erronés du JSON source (qui étaient doublés). Le total des établissements est maintenant cohérent avec le total des postes.

This commit is contained in:
Manus
2026-06-10 07:30:44 +00:00
parent 7c30c7b82b
commit fa30872300

View File

@@ -597,14 +597,44 @@ export default function DsiOpex() {
);
// Établissements (vue par établissement)
const filteredEtabs = useMemo(() => {
// ── Vue établissements : recalcul dynamique depuis les postes éditables (version C) ────────────
// Le total de chaque établissement = somme(montant_poste × ratio_etab)
// ratio_etab = base_repartition_etab / somme_base_repartition_tous_etabs
const etablissementsRecalcules = useMemo(() => {
const srcData = getOpexDataForAnnee(annee);
return srcData.etablissements.filter(e => {
const totalBase = srcData.etablissements.reduce((s, e) => s + e.base_repartition, 0);
if (totalBase === 0) return srcData.etablissements;
// Total des postes éditables (source de vérité)
const totalPostes = opexState.lignes.reduce((s, l) => s + l.montant, 0);
return srcData.etablissements.map(etab => {
const ratio = etab.base_repartition / totalBase;
const totalEtab = Math.round(totalPostes * ratio);
// Ventiler chaque poste éditable au prorata
const montantsRecalcules: Record<string, number> = {};
for (const ligne of opexState.lignes) {
if (ligne.montant > 0) {
montantsRecalcules[ligne.libelle] = Math.round(ligne.montant * ratio);
}
}
return {
...etab,
montants: montantsRecalcules,
total: totalEtab,
};
});
}, [opexState.lignes, annee]);
const filteredEtabs = useMemo(() => {
return etablissementsRecalcules.filter(e => {
if (search && !e.nom.toLowerCase().includes(search.toLowerCase()) &&
!e.code.toLowerCase().includes(search.toLowerCase())) return false;
return true;
});
}, [search]);
}, [etablissementsRecalcules, search]);
const sortedEtabs = useMemo(() => {
const arr = [...filteredEtabs];