From 1ce830d5932858709c2cb6bd4cc98f59807c964e Mon Sep 17 00:00:00 2001 From: Manus Date: Thu, 4 Jun 2026 13:48:45 +0000 Subject: [PATCH] =?UTF-8?q?Checkpoint:=20OPEX=20DSI=20:=20ajout=20d'un=20?= =?UTF-8?q?=C3=A9cran=20vide=20d=C3=A9di=C3=A9=20pour=20les=20ann=C3=A9es?= =?UTF-8?q?=20sans=20donn=C3=A9es,=20avec=20bouton=20"Cr=C3=A9er=20depuis?= =?UTF-8?q?=20N-1"=20(copie=20toutes=20les=20lignes=20de=20l'ann=C3=A9e=20?= =?UTF-8?q?pr=C3=A9c=C3=A9dente=20avec=20confirmation=20AlertDialog)=20et?= =?UTF-8?q?=20bouton=20"Ajouter=20une=20ligne=20manuellement".=20La=20fonc?= =?UTF-8?q?tion=20handleCreateFromN1=20clone=20les=20lignes=20N-1=20avec?= =?UTF-8?q?=20budget=5Fn1=20=3D=20montant=20N-1=20pour=20que=20les=20tenda?= =?UTF-8?q?nces=20soient=20calculables=20d=C3=A8s=20la=20cr=C3=A9ation.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/pages/DsiOpex.tsx | 74 +++++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/client/src/pages/DsiOpex.tsx b/client/src/pages/DsiOpex.tsx index 6d1b080..7bab533 100644 --- a/client/src/pages/DsiOpex.tsx +++ b/client/src/pages/DsiOpex.tsx @@ -454,6 +454,32 @@ export default function DsiOpex() { toast.info('Montants réinitialisés', { description: 'Les valeurs ont été restaurées depuis les données sources.' }); }, [isValidated, annee]); + // Créer depuis l'année précédente (N-1) + const handleCreateFromN1 = useCallback(() => { + const anneeN1 = annee - 1; + const stateN1 = loadOpexState(anneeN1); + if (stateN1.lignes.length === 0) { + toast.error(`Aucune donnée disponible pour ${anneeN1}`, { + description: `Veuillez d'abord créer ou importer l'OPEX ${anneeN1}.`, + }); + return; + } + // Cloner les lignes de N-1 en mettant budget_n1 = montant N-1 et montant = montant N-1 + const lignesClonees: LigneOpex[] = stateN1.lignes.map(l => ({ + ...l, + id: l.isCustom ? genId() : l.id, + budget_n1: l.montant, + montant: l.montant, + })); + const newState: OpexAnneeState = { lignes: lignesClonees, validated: false, savedAt: new Date().toISOString() }; + setOpexState(newState); + saveOpexState(annee, newState); + setIsDirty(false); + toast.success(`OPEX ${annee} créé depuis ${anneeN1}`, { + description: `${lignesClonees.length} postes de charges copiés. Vous pouvez maintenant les modifier.`, + }); + }, [annee]); + // Valider définitivement const handleValidate = useCallback(() => { const newState: OpexAnneeState = { @@ -822,8 +848,54 @@ export default function DsiOpex() { {/* Contenu principal */}
+ {/* === ÉTAT VIDE : année sans données === */} + {opexState.lignes.length === 0 && ( +
+
+ +
+

+ Aucune donnée pour {annee} +

+

+ L'OPEX {annee} n'a pas encore été créé. Vous pouvez le créer en copiant les charges de {annee - 1} ou en ajoutant les lignes manuellement. +

+
+ + + + + + + Créer l'OPEX {annee} depuis {annee - 1} ? + + Tous les postes de charges de {annee - 1} seront copiés comme base de travail pour {annee}. Les montants seront identiques et modifiables. + + + + Annuler + + Confirmer + + + + + +
+
+ )} + {/* === VUE PAR POSTE === */} - {viewMode === 'postes' && ( + {viewMode === 'postes' && opexState.lignes.length > 0 && (
{selectedCategorie !== 'Toutes' && (