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:
@@ -597,14 +597,44 @@ export default function DsiOpex() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Établissements (vue par établissement)
|
// É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);
|
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()) &&
|
if (search && !e.nom.toLowerCase().includes(search.toLowerCase()) &&
|
||||||
!e.code.toLowerCase().includes(search.toLowerCase())) return false;
|
!e.code.toLowerCase().includes(search.toLowerCase())) return false;
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
}, [search]);
|
}, [etablissementsRecalcules, search]);
|
||||||
|
|
||||||
const sortedEtabs = useMemo(() => {
|
const sortedEtabs = useMemo(() => {
|
||||||
const arr = [...filteredEtabs];
|
const arr = [...filteredEtabs];
|
||||||
|
|||||||
Reference in New Issue
Block a user