From f43a0be89cba81ccc7ac1c13b8c1a8a93fdd9d57 Mon Sep 17 00:00:00 2001 From: odentas Date: Tue, 16 Dec 2025 21:50:10 +0100 Subject: [PATCH] fix: Reconstruction correcte de salariesByDate depuis prefill MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Ajout d'un état temporaire prefillSalariesData pour stocker les données JSON - Nouveau useEffect qui reconstruit salariesByDate après parsing des dates - Mapping correct des clés (date DD/MM + numéro) au lieu de deviner les groupIdx - Fix: les montants s'affichent maintenant correctement dans les champs --- components/contrats/NouveauCDDUForm.tsx | 135 +++++++++++++++++------- 1 file changed, 97 insertions(+), 38 deletions(-) diff --git a/components/contrats/NouveauCDDUForm.tsx b/components/contrats/NouveauCDDUForm.tsx index 6cbede3..948b348 100644 --- a/components/contrats/NouveauCDDUForm.tsx +++ b/components/contrats/NouveauCDDUForm.tsx @@ -495,6 +495,8 @@ export function NouveauCDDUForm({ const [salaryMode, setSalaryMode] = useState<"global" | "par_date">("global"); // Salaires par date : Record const [salariesByDate, setSalariesByDate] = useState>({}); + // Stockage temporaire des salaires par date depuis le prefill (avant parsing des dates) + const [prefillSalariesData, setPrefillSalariesData] = useState(null); const [notes, setNotes] = useState(""); const [validerDirect, setValiderDirect] = useState<"Oui" | "Non">("Oui"); @@ -809,49 +811,14 @@ export function NouveauCDDUForm({ // Charger salaires par date si présents dans le prefill if (prefill.salaires_par_date && typeof prefill.salaires_par_date === "object") { setSalaryMode("par_date"); - - // Construire le dictionnaire salariesByDate depuis la structure JSON - const newSalariesByDate: Record = {}; - const salairesData = prefill.salaires_par_date as any; - - // Charger les représentations - if (salairesData.representations && Array.isArray(salairesData.representations)) { - salairesData.representations.forEach((rep: any) => { - if (rep.items && Array.isArray(rep.items)) { - rep.items.forEach((item: any) => { - const key = `rep_${rep.date}_${item.numero - 1}`; - newSalariesByDate[key] = item.montant; - }); - } - }); - } - - // Charger les répétitions - if (salairesData.repetitions && Array.isArray(salairesData.repetitions)) { - salairesData.repetitions.forEach((serv: any) => { - if (serv.items && Array.isArray(serv.items)) { - serv.items.forEach((item: any) => { - const key = `serv_${serv.date}_${item.numero - 1}`; - newSalariesByDate[key] = item.montant; - }); - } - }); - } - - // Charger les jours travaillés - if (salairesData.jours_travail && Array.isArray(salairesData.jours_travail)) { - salairesData.jours_travail.forEach((jour: any) => { - const key = `jour_${jour.date}_0`; - newSalariesByDate[key] = jour.montant; - }); - } - - setSalariesByDate(newSalariesByDate); + // Stocker temporairement les données - elles seront mappées après le parsing des dates + setPrefillSalariesData(prefill.salaires_par_date); setMontantSalaire(""); } else { // Mode global : charger le montant classique setMontantSalaire(prefill.montant ?? ""); setSalaryMode("global"); + setPrefillSalariesData(null); } setMontantFromCalculator(false); @@ -1377,6 +1344,98 @@ useEffect(() => { }, [prefill, dupeApplied]); + // Reconstruction de salariesByDate depuis prefillSalariesData une fois que les dates sont parsées + useEffect(() => { + if (!prefillSalariesData || !dateDebut) return; + + const newSalariesByDate: Record = {}; + + // Créer un mapping par date DD/MM et numéro d'item + const salaryMap = new Map(); + + // Parser les représentations + if (prefillSalariesData.representations && Array.isArray(prefillSalariesData.representations)) { + prefillSalariesData.representations.forEach((rep: any) => { + if (rep.items && Array.isArray(rep.items)) { + rep.items.forEach((item: any) => { + salaryMap.set(`rep_${rep.date}_${item.numero}`, item.montant); + }); + } + }); + } + + // Parser les répétitions + if (prefillSalariesData.repetitions && Array.isArray(prefillSalariesData.repetitions)) { + prefillSalariesData.repetitions.forEach((serv: any) => { + if (serv.items && Array.isArray(serv.items)) { + serv.items.forEach((item: any) => { + salaryMap.set(`serv_${serv.date}_${item.numero}`, item.montant); + }); + } + }); + } + + // Parser les jours travaillés + if (prefillSalariesData.jours_travail && Array.isArray(prefillSalariesData.jours_travail)) { + prefillSalariesData.jours_travail.forEach((jour: any) => { + salaryMap.set(`jour_${jour.date}_1`, jour.montant); + }); + } + + // Maintenant, reconstruire salariesByDate avec les bonnes clés en fonction des dates parsées + const yearContext = dateDebut; + + // Représentations + if (datesRep && datesRep.length > 0) { + const allRepDates = parseFormattedDatesWithQuantities(datesRep, yearContext, "rep"); + allRepDates.forEach((dateInfo) => { + for (let i = 0; i < dateInfo.quantity; i++) { + const inputKey = `${dateInfo.key}_${i}`; + const dateFr = dateInfo.date; // format DD/MM + const lookupKey = `rep_${dateFr}_${i + 1}`; + const montant = salaryMap.get(lookupKey); + if (montant !== undefined) { + newSalariesByDate[inputKey] = montant; + } + } + }); + } + + // Répétitions + if (datesServ && datesServ.length > 0) { + const allServDates = parseFormattedDatesWithQuantities(datesServ, yearContext, "serv"); + allServDates.forEach((dateInfo) => { + for (let i = 0; i < dateInfo.quantity; i++) { + const inputKey = `${dateInfo.key}_${i}`; + const dateFr = dateInfo.date; + const lookupKey = `serv_${dateFr}_${i + 1}`; + const montant = salaryMap.get(lookupKey); + if (montant !== undefined) { + newSalariesByDate[inputKey] = montant; + } + } + }); + } + + // Jours travaillés + if (joursTravail && joursTravail.length > 0) { + const allJoursDates = parseFormattedDatesWithQuantities(joursTravail, yearContext, "jour"); + allJoursDates.forEach((dateInfo) => { + const inputKey = `${dateInfo.key}_0`; + const dateFr = dateInfo.date; + const lookupKey = `jour_${dateFr}_1`; + const montant = salaryMap.get(lookupKey); + if (montant !== undefined) { + newSalariesByDate[inputKey] = montant; + } + }); + } + + setSalariesByDate(newSalariesByDate); + // Une fois mappé, on peut effacer le prefill temporaire + setPrefillSalariesData(null); + }, [prefillSalariesData, datesRep, datesServ, joursTravail, dateDebut]); + const { open: showLeaveConfirm, confirmLeave, cancelLeave, allowNavRef } = useUnsavedChangesPrompt(isDirty && !redirecting && !loading); useEffect(() => {