Checkpoint: Inventaire PC distinct par année : clé budgetsi_inventaire_data_YYYY dans localStorage, ImportModal utilise l'année active (useAnnee), indicateur visuel des imports par année dans la modale, useBudgetData + Budget2027 + DsiCapex rechargent l'inventaire à chaque changement d'année
This commit is contained in:
@@ -1,17 +1,16 @@
|
||||
// Hook pour charger et gérer les données budget depuis localStorage (import inventaire)
|
||||
// Hook pour charger et gérer les données budget depuis localStorage (import inventaire par année)
|
||||
// Design: Corporate Modernism — Itinova Budget SI 2027
|
||||
|
||||
import { useState, useMemo, useEffect } from 'react';
|
||||
import type { BudgetData, Etablissement, EtablissementStats, SortField, SortOrder, FilterType } from '../types/budget';
|
||||
import { useParametres } from '../contexts/ParametresContext';
|
||||
|
||||
const INVENTAIRE_KEY = 'budgetsi_inventaire_data';
|
||||
import { useAnnee, getInventaireStorageKey } from '../contexts/AnneeContext';
|
||||
|
||||
// ─── Lecture localStorage ─────────────────────────────────────────────────────
|
||||
|
||||
function loadInventaireData(): BudgetData | null {
|
||||
function loadInventaireData(annee: number): BudgetData | null {
|
||||
try {
|
||||
const raw = localStorage.getItem(INVENTAIRE_KEY);
|
||||
const raw = localStorage.getItem(getInventaireStorageKey(annee));
|
||||
if (!raw) return null;
|
||||
return JSON.parse(raw) as BudgetData;
|
||||
} catch {
|
||||
@@ -65,29 +64,41 @@ function recalculerStats(
|
||||
|
||||
export function useBudgetData() {
|
||||
const { parametres } = useParametres();
|
||||
const { annee } = useAnnee();
|
||||
const [search, setSearch] = useState('');
|
||||
const [sortField, setSortField] = useState<SortField>('budget_total');
|
||||
const [sortOrder, setSortOrder] = useState<SortOrder>('desc');
|
||||
const [filterType, setFilterType] = useState<FilterType>('all');
|
||||
|
||||
// Données brutes depuis localStorage — rechargées à chaque montage + écoute storage
|
||||
const [rawData, setRawData] = useState<BudgetData | null>(() => loadInventaireData());
|
||||
// Données brutes depuis localStorage — rechargées à chaque changement d'année + écoute storage
|
||||
const [rawData, setRawData] = useState<BudgetData | null>(() => loadInventaireData(annee));
|
||||
|
||||
// Recharger quand l'année change
|
||||
useEffect(() => {
|
||||
setRawData(loadInventaireData(annee));
|
||||
}, [annee]);
|
||||
|
||||
useEffect(() => {
|
||||
const onStorage = (e: StorageEvent) => {
|
||||
if (e.key === INVENTAIRE_KEY) {
|
||||
setRawData(loadInventaireData());
|
||||
if (e.key === getInventaireStorageKey(annee)) {
|
||||
setRawData(loadInventaireData(annee));
|
||||
}
|
||||
};
|
||||
window.addEventListener('storage', onStorage);
|
||||
// Écouter aussi les changements dans le même onglet via custom event
|
||||
const onImport = () => setRawData(loadInventaireData());
|
||||
const onImport = (e: Event) => {
|
||||
const detail = (e as CustomEvent).detail;
|
||||
// Recharger seulement si l'import concerne l'année active
|
||||
if (!detail || detail.annee === annee) {
|
||||
setRawData(loadInventaireData(annee));
|
||||
}
|
||||
};
|
||||
window.addEventListener('budgetsi_inventaire_updated', onImport);
|
||||
return () => {
|
||||
window.removeEventListener('storage', onStorage);
|
||||
window.removeEventListener('budgetsi_inventaire_updated', onImport);
|
||||
};
|
||||
}, []);
|
||||
}, [annee]);
|
||||
|
||||
// Recalcul de tous les établissements selon les paramètres courants
|
||||
const etablissementsRecalcules = useMemo<Etablissement[]>(() => {
|
||||
@@ -113,7 +124,7 @@ export function useBudgetData() {
|
||||
const budgetGlobal = etablissementsRecalcules.reduce((s, e) => s + e.stats.budget_total, 0);
|
||||
return {
|
||||
date_calcul: rawData?.meta?.date_calcul ?? new Date().toISOString(),
|
||||
date_reference: '2027-01-01',
|
||||
date_reference: `${annee}-01-01`,
|
||||
seuil_fixes_ans: parametres.seuilFixesAns,
|
||||
seuil_portables_ans: parametres.seuilPortablesAns,
|
||||
cout_fixe: parametres.coutFixe,
|
||||
@@ -125,7 +136,7 @@ export function useBudgetData() {
|
||||
total_fixes_renouveler: totalFixesR,
|
||||
total_portables_renouveler: totalPortablesR,
|
||||
};
|
||||
}, [etablissementsRecalcules, rawData, parametres]);
|
||||
}, [etablissementsRecalcules, rawData, parametres, annee]);
|
||||
|
||||
const filteredAndSorted = useMemo(() => {
|
||||
let list: Etablissement[] = [...etablissementsRecalcules];
|
||||
|
||||
Reference in New Issue
Block a user