fix: Corriger envoi des dates de représentation à PDFMonkey et intégrer calendrier dans staff/contrats
This commit is contained in:
parent
ed08f3270c
commit
b3b56a9b4e
2 changed files with 83 additions and 11 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Reference in a new issue