fix: Reconstruction correcte de salariesByDate depuis prefill
- 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
This commit is contained in:
parent
6cebac9160
commit
f43a0be89c
1 changed files with 97 additions and 38 deletions
|
|
@ -495,6 +495,8 @@ export function NouveauCDDUForm({
|
||||||
const [salaryMode, setSalaryMode] = useState<"global" | "par_date">("global");
|
const [salaryMode, setSalaryMode] = useState<"global" | "par_date">("global");
|
||||||
// Salaires par date : Record<dateISO, montant>
|
// Salaires par date : Record<dateISO, montant>
|
||||||
const [salariesByDate, setSalariesByDate] = useState<Record<string, number | "">>({});
|
const [salariesByDate, setSalariesByDate] = useState<Record<string, number | "">>({});
|
||||||
|
// Stockage temporaire des salaires par date depuis le prefill (avant parsing des dates)
|
||||||
|
const [prefillSalariesData, setPrefillSalariesData] = useState<any>(null);
|
||||||
|
|
||||||
const [notes, setNotes] = useState("");
|
const [notes, setNotes] = useState("");
|
||||||
const [validerDirect, setValiderDirect] = useState<"Oui" | "Non">("Oui");
|
const [validerDirect, setValiderDirect] = useState<"Oui" | "Non">("Oui");
|
||||||
|
|
@ -809,49 +811,14 @@ export function NouveauCDDUForm({
|
||||||
// Charger salaires par date si présents dans le prefill
|
// Charger salaires par date si présents dans le prefill
|
||||||
if (prefill.salaires_par_date && typeof prefill.salaires_par_date === "object") {
|
if (prefill.salaires_par_date && typeof prefill.salaires_par_date === "object") {
|
||||||
setSalaryMode("par_date");
|
setSalaryMode("par_date");
|
||||||
|
// Stocker temporairement les données - elles seront mappées après le parsing des dates
|
||||||
// Construire le dictionnaire salariesByDate depuis la structure JSON
|
setPrefillSalariesData(prefill.salaires_par_date);
|
||||||
const newSalariesByDate: Record<string, number | ""> = {};
|
|
||||||
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);
|
|
||||||
setMontantSalaire("");
|
setMontantSalaire("");
|
||||||
} else {
|
} else {
|
||||||
// Mode global : charger le montant classique
|
// Mode global : charger le montant classique
|
||||||
setMontantSalaire(prefill.montant ?? "");
|
setMontantSalaire(prefill.montant ?? "");
|
||||||
setSalaryMode("global");
|
setSalaryMode("global");
|
||||||
|
setPrefillSalariesData(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
setMontantFromCalculator(false);
|
setMontantFromCalculator(false);
|
||||||
|
|
@ -1377,6 +1344,98 @@ useEffect(() => {
|
||||||
|
|
||||||
}, [prefill, dupeApplied]);
|
}, [prefill, dupeApplied]);
|
||||||
|
|
||||||
|
// Reconstruction de salariesByDate depuis prefillSalariesData une fois que les dates sont parsées
|
||||||
|
useEffect(() => {
|
||||||
|
if (!prefillSalariesData || !dateDebut) return;
|
||||||
|
|
||||||
|
const newSalariesByDate: Record<string, number | ""> = {};
|
||||||
|
|
||||||
|
// Créer un mapping par date DD/MM et numéro d'item
|
||||||
|
const salaryMap = new Map<string, number>();
|
||||||
|
|
||||||
|
// 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);
|
const { open: showLeaveConfirm, confirmLeave, cancelLeave, allowNavRef } = useUnsavedChangesPrompt(isDirty && !redirecting && !loading);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue