fix: Corriger envoi des dates de représentation à PDFMonkey et intégrer calendrier dans staff/contrats

This commit is contained in:
Renaud 2025-10-20 22:51:29 +02:00
parent ed08f3270c
commit b3b56a9b4e
2 changed files with 83 additions and 11 deletions

View file

@ -358,7 +358,7 @@ export async function POST(
type_numobjet: production?.prod_type || "",
date_debut: formatDate(contract.start_date),
date_fin: formatDate(contract.end_date),
dates_travaillees: contract.jours_travail || "",
dates_travaillees: contract.jours_representations || "",
salaire_brut: contract.gross_pay
? parseFloat(contract.gross_pay.toString()).toLocaleString('fr-FR', {
minimumFractionDigits: 2,

View file

@ -302,7 +302,11 @@ export default function ContractEditor({
const [nbRepresentations, setNbRepresentations] = useState<number | "">(contract.cachets_representations || "");
const [nbServicesRepetition, setNbServicesRepetition] = useState<number | "">(contract.services_repetitions || "");
const [datesRepresentations, setDatesRepresentations] = useState(contract.jours_representations || "");
const [datesRepresentationsDisplay, setDatesRepresentationsDisplay] = useState("");
const [datesRepresentationsOpen, setDatesRepresentationsOpen] = useState(false);
const [datesRepetitions, setDatesRepetitions] = useState(contract.jours_repetitions || "");
const [datesRepetitionsDisplay, setDatesRepetitionsDisplay] = useState("");
const [datesRepetitionsOpen, setDatesRepetitionsOpen] = useState(false);
const [heuresTotal, setHeuresTotal] = useState<number | "">(contract.nombre_d_heures || "");
const [minutesTotal, setMinutesTotal] = useState<"0" | "30">((contract.minutes_total || "0") as "0" | "30");
const [joursTravail, setJoursTravail] = useState(contract.jours_travail || "");
@ -329,6 +333,20 @@ export default function ContractEditor({
setNbServicesRepetition(contract.services_repetitions || "");
setDatesRepresentations(contract.jours_representations || "");
setDatesRepetitions(contract.jours_repetitions || "");
// Initialiser les affichages avec formatage smart si présentes
if (contract.jours_representations) {
const yearContext = contract.start_date || new Date().toISOString().slice(0, 10);
const parsed = parseDateString(contract.jours_representations, yearContext);
setDatesRepresentationsDisplay(parsed.pdfFormatted);
}
if (contract.jours_repetitions) {
const yearContext = contract.start_date || new Date().toISOString().slice(0, 10);
const parsed = parseDateString(contract.jours_repetitions, yearContext);
setDatesRepetitionsDisplay(parsed.pdfFormatted);
}
setHeuresTotal(contract.nombre_d_heures || "");
setMinutesTotal((contract.minutes_total || "0") as "0" | "30");
@ -386,6 +404,26 @@ export default function ContractEditor({
setJoursTravail(result.selectedDates.join(", "));
setJoursTravailDisplay(result.pdfFormatted);
};
// Handler pour le calendrier des dates de représentations
const handleDatesRepresentationsApply = (result: {
selectedDates: string[];
hasMultiMonth: boolean;
pdfFormatted: string;
}) => {
setDatesRepresentations(result.selectedDates.join(", "));
setDatesRepresentationsDisplay(result.pdfFormatted);
};
// Handler pour le calendrier des dates de répétitions
const handleDatesRepetitionsApply = (result: {
selectedDates: string[];
hasMultiMonth: boolean;
pdfFormatted: string;
}) => {
setDatesRepetitions(result.selectedDates.join(", "));
setDatesRepetitionsDisplay(result.pdfFormatted);
};
// Fonction pour ouvrir le PDF avec URL pré-signée
const openPdf = async () => {
@ -1947,21 +1985,55 @@ export default function ContractEditor({
</div>
<div>
<label className="text-xs text-muted-foreground">Dates de représentations</label>
<Input
value={datesRepresentations}
onChange={(e) => setDatesRepresentations(e.target.value)}
placeholder="ex : 12/10, 13/10, 24/10"
/>
<div className="flex items-center gap-2">
<div className="flex-1 px-3 py-2 rounded-lg border bg-slate-50 text-sm text-slate-700 min-h-[42px] flex items-center">
{datesRepresentationsDisplay || (datesRepresentations ? datesRepresentations : "Cliquez pour sélectionner…")}
</div>
<button
type="button"
onClick={() => setDatesRepresentationsOpen(true)}
className="px-3 py-2 rounded-lg border bg-white text-sm hover:bg-slate-50 transition whitespace-nowrap"
>
Modifier
</button>
</div>
</div>
<div>
<label className="text-xs text-muted-foreground">Dates de répétitions</label>
<Input
value={datesRepetitions}
onChange={(e) => setDatesRepetitions(e.target.value)}
placeholder="ex : 10/10, 11/10"
/>
<div className="flex items-center gap-2">
<div className="flex-1 px-3 py-2 rounded-lg border bg-slate-50 text-sm text-slate-700 min-h-[42px] flex items-center">
{datesRepetitionsDisplay || (datesRepetitions ? datesRepetitions : "Cliquez pour sélectionner…")}
</div>
<button
type="button"
onClick={() => setDatesRepetitionsOpen(true)}
className="px-3 py-2 rounded-lg border bg-white text-sm hover:bg-slate-50 transition whitespace-nowrap"
>
Modifier
</button>
</div>
</div>
</div>
{/* Calendriers pour représentations et répétitions */}
<DatePickerCalendar
isOpen={datesRepresentationsOpen}
onClose={() => setDatesRepresentationsOpen(false)}
onApply={handleDatesRepresentationsApply}
initialDates={datesRepresentations ? datesRepresentations.split(", ") : []}
title="Sélectionner les dates de représentations"
minDate={contract.start_date?.slice(0, 10)}
maxDate={contract.end_date?.slice(0, 10)}
/>
<DatePickerCalendar
isOpen={datesRepetitionsOpen}
onClose={() => setDatesRepetitionsOpen(false)}
onApply={handleDatesRepetitionsApply}
initialDates={datesRepetitions ? datesRepetitions.split(", ") : []}
title="Sélectionner les dates de répétitions"
minDate={contract.start_date?.slice(0, 10)}
maxDate={contract.end_date?.slice(0, 10)}
/>
{/* Nouveaux champs pour heures total et par jour */}
<h4 className="text-sm font-medium mb-3 mt-6">Heures de travail</h4>