diff --git a/app/api/staff/amendments/create/route.ts b/app/api/staff/amendments/create/route.ts index 5349924..78f8662 100644 --- a/app/api/staff/amendments/create/route.ts +++ b/app/api/staff/amendments/create/route.ts @@ -42,13 +42,22 @@ export async function POST(request: NextRequest) { pdf_s3_key, } = body; - if (!contract_id || !date_effet || !elements_avenantes || elements_avenantes.length === 0) { + if (!contract_id || !date_effet) { return NextResponse.json( { error: "Données manquantes" }, { status: 400 } ); } + // Pour les modifications, au moins un élément doit être sélectionné + // Pour les annulations, aucun élément n'est requis + if (type_avenant === "modification" && (!elements_avenantes || elements_avenantes.length === 0)) { + return NextResponse.json( + { error: "Au moins un élément doit être sélectionné pour une modification" }, + { status: 400 } + ); + } + // Récupérer le contrat pour validation et numérotation const { data: contract, error: contractError } = await supabase .from("cddu_contracts") @@ -82,7 +91,7 @@ export async function POST(request: NextRequest) { date_effet, type_avenant, motif_avenant: motif_avenant || null, - elements_avenantes: elements_avenantes, + elements_avenantes: elements_avenantes || [], objet_data: objet_data || null, duree_data: duree_data || null, lieu_horaire_data: lieu_horaire_data || null, @@ -104,64 +113,67 @@ export async function POST(request: NextRequest) { } // Mettre à jour le contrat avec les nouvelles données + // Pour les annulations, on ne met pas à jour le contrat const updateData: any = {}; - if (elements_avenantes.includes("objet") && objet_data) { - if (objet_data.profession_code && objet_data.profession_label) { - updateData.profession = `${objet_data.profession_code} - ${objet_data.profession_label}`; + if (type_avenant === "modification") { + if (elements_avenantes.includes("objet") && objet_data) { + if (objet_data.profession_code && objet_data.profession_label) { + updateData.profession = `${objet_data.profession_code} - ${objet_data.profession_label}`; + } + if (objet_data.production_name) { + updateData.production_name = objet_data.production_name; + } + if (objet_data.production_numero_objet) { + updateData.numero_objet = objet_data.production_numero_objet; + } } - if (objet_data.production_name) { - updateData.production_name = objet_data.production_name; - } - if (objet_data.production_numero_objet) { - updateData.numero_objet = objet_data.production_numero_objet; - } - } - if (elements_avenantes.includes("duree") && duree_data) { - if (duree_data.date_debut) { - updateData.start_date = duree_data.date_debut; + if (elements_avenantes.includes("duree") && duree_data) { + if (duree_data.date_debut) { + updateData.start_date = duree_data.date_debut; + } + if (duree_data.date_fin) { + updateData.end_date = duree_data.date_fin; + } + if (duree_data.nb_representations !== undefined) { + updateData.cachets_representations = duree_data.nb_representations; + } + if (duree_data.nb_repetitions !== undefined) { + updateData.services_repetitions = duree_data.nb_repetitions; + } + if (duree_data.nb_heures !== undefined) { + updateData.nombre_d_heures = duree_data.nb_heures; + } + if (duree_data.dates_representations) { + updateData.jours_representations = duree_data.dates_representations; + } + if (duree_data.dates_repetitions) { + updateData.jours_repetitions = duree_data.dates_repetitions; + } + if (duree_data.jours_travail) { + updateData.jours_travail = duree_data.jours_travail; + } } - if (duree_data.date_fin) { - updateData.end_date = duree_data.date_fin; - } - if (duree_data.nb_representations !== undefined) { - updateData.cachets_representations = duree_data.nb_representations; - } - if (duree_data.nb_repetitions !== undefined) { - updateData.services_repetitions = duree_data.nb_repetitions; - } - if (duree_data.nb_heures !== undefined) { - updateData.nombre_d_heures = duree_data.nb_heures; - } - if (duree_data.dates_representations) { - updateData.jours_representations = duree_data.dates_representations; - } - if (duree_data.dates_repetitions) { - updateData.jours_repetitions = duree_data.dates_repetitions; - } - if (duree_data.jours_travail) { - updateData.jours_travail = duree_data.jours_travail; - } - } - if (elements_avenantes.includes("lieu_horaire") && lieu_horaire_data) { - if (lieu_horaire_data.lieu) { - updateData.lieu_travail = lieu_horaire_data.lieu; + if (elements_avenantes.includes("lieu_horaire") && lieu_horaire_data) { + if (lieu_horaire_data.lieu) { + updateData.lieu_travail = lieu_horaire_data.lieu; + } } - } - if (elements_avenantes.includes("remuneration") && remuneration_data) { - if (remuneration_data.gross_pay !== undefined) { - updateData.gross_pay = remuneration_data.gross_pay; + if (elements_avenantes.includes("remuneration") && remuneration_data) { + if (remuneration_data.gross_pay !== undefined) { + updateData.gross_pay = remuneration_data.gross_pay; + } + if (remuneration_data.precisions_salaire) { + updateData.precisions_salaire = remuneration_data.precisions_salaire; + } + if (remuneration_data.type_salaire) { + updateData.type_salaire = remuneration_data.type_salaire; + } } - if (remuneration_data.precisions_salaire) { - updateData.precisions_salaire = remuneration_data.precisions_salaire; - } - if (remuneration_data.type_salaire) { - updateData.type_salaire = remuneration_data.type_salaire; - } - } + } // Fin du if (type_avenant === "modification") // Mettre à jour le contrat si des données ont été modifiées if (Object.keys(updateData).length > 0) { diff --git a/app/api/staff/amendments/generate-pdf/route.ts b/app/api/staff/amendments/generate-pdf/route.ts index 9d908dd..ab1ebb9 100644 --- a/app/api/staff/amendments/generate-pdf/route.ts +++ b/app/api/staff/amendments/generate-pdf/route.ts @@ -173,12 +173,19 @@ export async function POST(request: NextRequest) { // Déterminer les éléments avenantés const elementsAvenantes = amendmentData.elements || []; + const typeAvenant = amendmentData.type_avenant || "modification"; + let elementsText = ""; if (elementsAvenantes.includes("objet")) elementsText += "Objet,"; if (elementsAvenantes.includes("duree")) elementsText += "Durée de l'engagement,"; if (elementsAvenantes.includes("lieu_horaire")) elementsText += "Lieu et horaires,"; if (elementsAvenantes.includes("remuneration")) elementsText += "Rémunération,"; elementsText = elementsText.replace(/,$/, ""); // Retirer la virgule finale + + // Si c'est une annulation, on n'affiche pas d'éléments spécifiques + if (typeAvenant === "annulation") { + elementsText = "Annulation du contrat"; + } // Préparer les données pour le PDF (valeurs du contrat ou de l'avenant) const professionData = amendmentData.objet_data || {}; @@ -250,7 +257,7 @@ export async function POST(request: NextRequest) { // Construction du payload pour PDFMonkey const dataPayload = { - annulation: "Non", + annulation: typeAvenant === "annulation" ? "Oui" : "Non", structure_name: organization?.name || orgDetails.structure || "", structure_adresse: orgDetails.adresse || "", structure_cpville: orgDetails.cp || "", diff --git a/app/layout.tsx b/app/layout.tsx index ec83e9c..d719795 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -55,15 +55,30 @@ export default function RootLayout({ children }: { children: React.ReactNode }) Espace Paie Odentas - - + + + {/* Favicons */} + + + + {/* Apple Touch Icon */} + + + + + {/* Manifest PWA */} - + + {/* Theme color */} - + + + {/* PWA */} + + {/* Barre de progression pour les changements de page */} diff --git a/components/staff/NouvelAvenantPageClient.tsx b/components/staff/NouvelAvenantPageClient.tsx index c6d2aec..dbe369d 100644 --- a/components/staff/NouvelAvenantPageClient.tsx +++ b/components/staff/NouvelAvenantPageClient.tsx @@ -158,9 +158,14 @@ export default function NouvelAvenantPageClient() { // Validation const canSubmit = useMemo(() => { + // Pour une annulation, pas besoin de sélectionner des éléments + if (typeAvenant === "annulation") { + return !!(selectedContract && dateEffet); + } + // Pour une modification, il faut au moins un élément if (!selectedContract || !dateEffet || selectedElements.length === 0) return false; return true; - }, [selectedContract, dateEffet, selectedElements]); + }, [selectedContract, dateEffet, selectedElements, typeAvenant]); // Génération du PDF const handleGeneratePdf = async () => { @@ -172,6 +177,7 @@ export default function NouvelAvenantPageClient() { contract_id: selectedContract.id, date_effet: dateEffet, date_signature: dateSignature || undefined, + type_avenant: typeAvenant, elements: selectedElements, objet_data: selectedElements.includes("objet") ? objetData : undefined, duree_data: selectedElements.includes("duree") ? dureeData : undefined, @@ -443,48 +449,67 @@ export default function NouvelAvenantPageClient() { - {/* Éléments à avenanter */} -
-

- Éléments à avenanter * -

-
- {[ - { value: "objet" as const, label: "Objet (profession, production)" }, - { value: "duree" as const, label: "Durée de l'engagement" }, - { value: "lieu_horaire" as const, label: "Lieu et horaires" }, - { value: "remuneration" as const, label: "Rémunération" }, - ].map((element) => ( -
- - ))} + + ))} +
- + )} - {/* Formulaires conditionnels */} - {selectedElements.includes("objet") && ( + {/* Message pour les annulations */} + {typeAvenant === "annulation" && ( +
+
+
+ +
+
+
Avenant d'annulation
+
+ Cet avenant annulera le contrat à partir de la date d'effet. Aucune modification spécifique n'est requise. +
+
+
+
+ )} + + {/* Formulaires conditionnels - Seulement pour les modifications */} + {typeAvenant === "modification" && selectedElements.includes("objet") && (
)} - {selectedElements.includes("duree") && ( + {typeAvenant === "modification" && selectedElements.includes("duree") && (
)} - {selectedElements.includes("remuneration") && ( + {typeAvenant === "modification" && selectedElements.includes("remuneration") && (