diff --git a/Minima CCNPA 2025 (1).xlsx b/Minima CCNPA 2025 (1).xlsx new file mode 100644 index 0000000..15ad4ca Binary files /dev/null and b/Minima CCNPA 2025 (1).xlsx differ diff --git a/app/(app)/minima-ccn/ccneac/page.tsx b/app/(app)/minima-ccn/ccneac/page.tsx index d4a4c13..9c03358 100644 --- a/app/(app)/minima-ccn/ccneac/page.tsx +++ b/app/(app)/minima-ccn/ccneac/page.tsx @@ -11,65 +11,22 @@ import ArtistesCirqueContent from './artistes-cirque-data'; import EmploisNonArtistiquesContent from './emplois-non-artistiques-data'; import SimulateurContent from '@/components/simulateur/SimulateurContent'; import CalculatorComponent from '@/components/Calculator'; +import { useDraggableModal } from '@/hooks/useDraggableModal'; export default function CCNEACPage() { usePageTitle("Minima CCNEAC"); const [isSimulateurOpen, setIsSimulateurOpen] = useState(false); const [isCalculatorOpen, setIsCalculatorOpen] = useState(false); const [modalPosition, setModalPosition] = useState({ x: 0, y: 0 }); - const [isDragging, setIsDragging] = useState(false); - const [dragOffset, setDragOffset] = useState({ x: 0, y: 0 }); const modalRef = React.useRef(null); + // Gestion du drag & drop du modal - const handleMouseDown = (e: React.MouseEvent) => { - if (!modalRef.current) return; - - // Si c'est le premier drag, calculer la position réelle du modal - if (modalPosition.x === 0 && modalPosition.y === 0) { - const rect = modalRef.current.getBoundingClientRect(); - setModalPosition({ x: rect.left, y: rect.top }); - setDragOffset({ - x: e.clientX - rect.left, - y: e.clientY - rect.top, - }); - } else { - setDragOffset({ - x: e.clientX - modalPosition.x, - y: e.clientY - modalPosition.y, - }); - } - - setIsDragging(true); - }; - - useEffect(() => { - const handleMouseMove = (e: MouseEvent) => { - if (!isDragging) return; - - const newX = e.clientX - dragOffset.x; - const newY = e.clientY - dragOffset.y; - - setModalPosition({ - x: newX, - y: newY, - }); - }; - - const handleMouseUp = () => { - setIsDragging(false); - }; - - if (isDragging) { - document.addEventListener('mousemove', handleMouseMove); - document.addEventListener('mouseup', handleMouseUp); - } - - return () => { - document.removeEventListener('mousemove', handleMouseMove); - document.removeEventListener('mouseup', handleMouseUp); - }; - }, [isDragging, dragOffset]); + const { onPointerDown, onPointerMove, onPointerUp } = useDraggableModal( + modalRef, + setModalPosition, + { constrainToViewport: true, disableIframeDuringDrag: true } + ); // Écouter les messages de l'iframe pour ouvrir la calculatrice useEffect(() => { @@ -298,31 +255,23 @@ export default function CCNEACPage() { {/* Modale compacte qui sort du bouton */} {isSimulateurOpen && ( <> - {/* Overlay transparent pour fermer au clic */} -
{ - setIsSimulateurOpen(false); - setModalPosition({ x: 0, y: 0 }); // Réinitialiser la position - }} - /> - {/* Modale compacte déplaçable */}
e.stopPropagation()} > {/* Header draggable */}

@@ -335,7 +284,7 @@ export default function CCNEACPage() { }} className="p-1.5 rounded-lg hover:bg-slate-100 transition-colors" aria-label="Fermer le simulateur" - onMouseDown={(e) => e.stopPropagation()} + onPointerDown={(e) => e.stopPropagation()} > diff --git a/app/(app)/minima-ccn/ccnpa/Minima CCNPA 2025 - CAT C.pdf b/app/(app)/minima-ccn/ccnpa/Minima CCNPA 2025 - CAT C.pdf new file mode 100644 index 0000000..f5968ee Binary files /dev/null and b/app/(app)/minima-ccn/ccnpa/Minima CCNPA 2025 - CAT C.pdf differ diff --git a/app/(app)/minima-ccn/ccnpa/artistes-interpretes.tsx b/app/(app)/minima-ccn/ccnpa/artistes-interpretes.tsx new file mode 100644 index 0000000..a7a1082 --- /dev/null +++ b/app/(app)/minima-ccn/ccnpa/artistes-interpretes.tsx @@ -0,0 +1,166 @@ +"use client"; + +import React from 'react'; +import { Mic, Info } from 'lucide-react'; + +function euro(n: number) { + return new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR' }).format(n); +} + +const InfoRow: React.FC<{ children: React.ReactNode }> = ({ children }) => ( +
+
+
+

{children}

+
+); + +export default function ArtistesInterpretes() { + return ( +
+ {/* En-tête */} +
+
+
+ +
+
+

Artistes Interprètes

+

Salaires minima applicables au 1er janvier 2025 (Avenant n°20 du 29 novembre 2024, non étendu)

+

Rémunération au cachet

+
+
+
+ + {/* Émissions dramatiques */} +
+
Émissions dramatiques (article 5.14.1)
+
+
Définition
+
Cachet
+
+ {[{def:"Journée de répétition ou d'enregistrement",val:289.23},{def:'Journée unique',val:304.99},{def:"Prestation de lecture d'une durée inférieure à 4 heures",val:152.49}].map((r,idx)=> ( +
+
{r.def}
+
{euro(r.val)}
+
+ ))} +
+ + {/* Émissions de variétés */} +
+
Émissions de variétés (article 5.14.2)
+
Répétitions effectuées en dehors de la journée d'enregistrement
+
+
Définition
+
Cachet
+
+ {[{def:"Répétition d'une durée inférieure ou égale à 4 heures",val:184.90},{def:"Répétition d'une durée supérieure à 4 heures",val:289.23}].map((r,idx)=> ( +
+
{r.def}
+
{euro(r.val)}
+
+ ))} +
+
Enregistrement
+
{euro(419.31)}
+
+
+ + {/* Émissions lyriques */} +
+
Émissions lyriques (article 5.14.3)
+
Répétition ou enregistrement
+
+
Définition
+
Cachet
+
+ {[{def:'Soliste',val:432.86},{def:'Artistes des chœurs',val:289.23}].map((r,idx)=> ( +
+
{r.def}
+
{euro(r.val)}
+
+ ))} +
Préparation ou déchiffrage (3 heures maximum)
+ {[{def:'Soliste',val:165.96},{def:"Artistes des chœurs",val:110.89}].map((r,idx)=> ( +
+
{r.def}
+
{euro(r.val)}
+
+ ))} +
+ + {/* Émissions chorégraphiques */} +
+
Émissions chorégraphiques (article 5.14.4)
+
Répétition ou enregistrement (6h de travail effectif au maximum)
+ {[{def:'Soliste',val:432.86},{def:'Corps de ballet',val:289.23}].map((r,idx)=> ( +
+
{r.def}
+
{euro(r.val)}
+
+ ))} +
+ + {/* Reportages / Actualité */} +
+
Reportages / Actualité
+
+
Définition
+
Cachet
+
+
+
Reportage (art. 6.2.1.b, pas de gré à gré)
+
{euro(73.64)}
+
+
+
Prestation d'actualité (art. 6.3.1, pas de gré à gré)
+
{euro(170.16)}
+
+
+ + {/* Indemnités de costumes */} +
+
Indemnités de costumes (article 5.13)
+
Indemnités visées à l'article 5.13.1
+
+
Définition
+
Montant
+
+ {[{def:'Engagement pour une journée unique — Tenue de ville',val:18.34},{def:'Engagement pour une journée unique — Tenue de soirée',val:30.10},{def:'Engagement pour plusieurs jours — Tenue de ville',val:14.67},{def:'Engagement pour plusieurs jours — Tenue de soirée',val:24.77}].map((r,idx)=> ( +
+
{r.def}
+
{euro(r.val)}
+
+ ))} +
Indemnités visées à l'article 5.13.2
+ {[{def:'Homme — pourpoint',val:14.56},{def:'Femme — Tutu court',val:14.56},{def:'Femme — Tutu romantique',val:24.77},{def:'Chaussons',val:5.60}].map((r,idx)=> ( +
+
{r.def}
+
{euro(r.val)}
+
+ ))} +
+ + {/* Notes et définitions */} +
+ + La durée du travail journalière est de 9 heures (6 heures pour les mineurs de moins de 16 ans), y compris le temps passé à l'habillage et au maquillage, dans la limite d'une heure. La durée du travail hebdomadaire est de 45 heures (5 × 9 heures) pour les adultes. + + + Émissions dramatiques : artistes engagés pour la réalisation télévisuelle d'œuvres ou extraits d'œuvres dramatiques (...), y compris artistes sans texte à respecter (voix hors champ, lectures de commentaires). + + + Émissions chorégraphiques : réalisations télévisuelles d'œuvres chorégraphiques (suite de pas/enchaînements réglés), à l'exclusion des artistes d'interprétation d'un texte parlé/chanté ou d'un numéro de variétés. + + + Émissions lyriques : réalisations télévisuelles d'œuvres lyriques ou émissions avec extraits lyriques ; inclut artistes des chœurs à l'image si intégrés à l'action dramatique. À l'exclusion des artistes d'interprétation d'un texte parlé/numéro de variétés ou de danse (ces derniers relèvent des dispositions des émissions dramatiques). + + + Émissions de variétés : prestations dans des conditions autres que celles prévues pour les émissions dramatiques, lyriques ou chorégraphiques, à l'exclusion des artistes chorégraphiques. + +
+
+ ); +} diff --git a/app/(app)/minima-ccn/ccnpa/artistes-musiciens.tsx b/app/(app)/minima-ccn/ccnpa/artistes-musiciens.tsx new file mode 100644 index 0000000..2b4f6aa --- /dev/null +++ b/app/(app)/minima-ccn/ccnpa/artistes-musiciens.tsx @@ -0,0 +1,109 @@ +"use client"; + +import React from 'react'; +import { Music, Info } from 'lucide-react'; + +function euro(n: number) { + return new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR' }).format(n); +} + +const MUSICIENS_CACHETS = [ + { def: 'Cachet initial (avec un mode) pour un service de 3 heures', montant: 106.05 }, + { def: 'Cachet initial (avec un mode) pour un service de 4 heures', montant: 137.87 }, + { def: 'Cachet initial (avec un mode) pour un engagement à la journée (isolée, enregistrement)', montant: 228.02 }, + { def: 'Cachet initial (avec un mode) pour un engagement à la journée (3 journées isolées ou 2 journées consécutives sur 7 jours)', montant: 217.41 }, + { def: 'Cachet initial (avec un mode) pour un engagement à la journée (5 journées isolées ou 3 journées consécutives sur 7 jours)', montant: 190.89 }, +]; + +const MUSICIENS_ABATTEMENTS = [ + { seuil: '+ 10 musiciens', value: '-10%' }, + { seuil: '+ 20 musiciens', value: '-15%' }, + { seuil: '+ 30 musiciens', value: '-20%' }, + { seuil: '+ 40 musiciens', value: '-25%' }, +]; + +const MUSICIENS_REPETITIONS = [ + { def: 'Cachet pour un service de trois heures', montant: 63.63 }, + { def: 'Cachet pour un double service de trois heures', montant: 106.05 }, +]; + +const InfoRow: React.FC<{ children: React.ReactNode }> = ({ children }) => ( +
+
+
+

{children}

+
+); + +export default function ArtistesMusiciens() { + return ( +
+ {/* En-tête */} +
+
+
+ +
+
+

Artistes Musiciens

+

Salaires applicables au 1er janvier 2025 (Avenant n°20 du 29 novembre 2024, non étendu)

+
+
+
+ + {/* Cachets minima */} +
+
+
Définition du cachet
+
Cachets minima
+
+ {MUSICIENS_CACHETS.map((row, idx) => ( +
+
{row.def}
+
{euro(row.montant)}
+
+ ))} +
+ + {/* Abattement pour ensemble */} +
+
+
+

Abattement pour ensemble

+

+ En cas d'interprétation d'ensemble, abattement appliqué sur les cachets définis ci-avant en fonction du nombre de musiciens participant à l'ensemble. +

+
+
+
+
Seuil
+
Abattement
+
+ {MUSICIENS_ABATTEMENTS.map((a, i) => ( +
+
{a.seuil}
+
{a.value}
+
+ ))} +
+
+
+ + {/* Cachets répétitions */} +
+
Cachet pour répétitions
+
+
Définition
+
Cachet
+
+ {MUSICIENS_REPETITIONS.map((r, idx) => ( +
+
{r.def}
+
{euro(r.montant)}
+
+ ))} +
+
+ ); +} diff --git a/app/(app)/minima-ccn/ccnpa/categorie-a-data.tsx b/app/(app)/minima-ccn/ccnpa/categorie-a-data.tsx new file mode 100644 index 0000000..372f358 --- /dev/null +++ b/app/(app)/minima-ccn/ccnpa/categorie-a-data.tsx @@ -0,0 +1,615 @@ +"use client"; + +import React from 'react'; +import { Briefcase, ShoppingBag } from 'lucide-react'; + +const parseEuro = (str: string) => { + if (!str || str === '-') return null; + const cleaned = str.replace(/\s/g, '').replace('€', '').replace(',', '.'); + return parseFloat(cleaned); +}; + +const euro = (n: number | null) => { + if (n === null) return '-'; + return new Intl.NumberFormat('fr-FR', { + minimumFractionDigits: 2, + maximumFractionDigits: 2 + }).format(n) + ' €'; +}; + +export default function CategorieAContent() { + return ( +
+ {/* En-tête */} +
+

+ Catégorie A - Personnel d'administration et commercial +

+

+ Minima conventionnels pour le personnel administratif et commercial de la production audiovisuelle +

+

+ Grille de salaires CCNPA (IDCC 2642) - Valeurs 2025 +

+
+ + {/* Hors niveau */} +
+

+ + + Hors niveau +

+ +
+ + + + + + + + + + + + + + + + + + + + + +
EmploisSalaire minimum
Producteur{euro(null)}
Directeur général (non mandataire social){euro(null)}
Directeur général délégué (non mandataire social){euro(null)}
+
+
+ + {/* Niveau I - Administration */} +
+

+ + + Niveau I - Filière Administration +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
EmploisSalaire minimum CDI/CDD
Délégué Général{euro(parseEuro("3 314,29 €"))}
Directeur général adjoint{euro(parseEuro("3 314,29 €"))}
Directeur des productions{euro(parseEuro("3 314,29 €"))}
Directeur des programmes{euro(parseEuro("3 314,29 €"))}
+
+
+ + {/* Niveau II - Administration */} +
+

+ + + Niveau II - Filière Administration +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EmploisSalaire minimum CDI/CDD
Directeur des jeux{euro(parseEuro("3 162,15 €"))}
Secrétaire général{euro(parseEuro("3 013,00 €"))}
Directeur administratif et financier{euro(parseEuro("3 013,00 €"))}
Directeur financier{euro(parseEuro("2 892,47 €"))}
Directeur juridique{euro(parseEuro("2 892,47 €"))}
Directeur technique{euro(parseEuro("2 892,47 €"))}
Directeur des ressources humaines{euro(parseEuro("2 892,47 €"))}
Directeur littéraire{euro(parseEuro("2 892,47 €"))}
Directeur du développement{euro(parseEuro("2 892,47 €"))}
Directeur informatique{euro(parseEuro("2 892,47 €"))}
Directeur de la Comptabilité{euro(parseEuro("2 892,47 €"))}
Directeur de la communication{euro(parseEuro("2 892,47 €"))}
+
+
+ + {/* Niveau II - Commercial et édition */} +
+

+ + + Niveau II - Filière Commercial et édition +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
EmploisSalaire minimum CDI/CDD
Directeur du Pôle Edition - Distribution{euro(parseEuro("2 892,47 €"))}
Directeur multimedia{euro(parseEuro("2 892,47 €"))}
Directeur produits dérivés{euro(parseEuro("2 892,47 €"))}
Directeur commercial{euro(parseEuro("2 651,44 €"))}
+
+
+ + {/* Niveau IIIA - Administration */} +
+

+ + + Niveau IIIA - Filière Administration +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EmploisSalaire minimum CDI/CDD
Responsable administratif et financier{euro(parseEuro("2 651,44 €"))}
Chef comptable{euro(parseEuro("2 530,92 €"))}
Responsable des ressources humaines{euro(parseEuro("2 530,92 €"))}
Responsable du développement{euro(parseEuro("2 530,92 €"))}
Responsable informatique{euro(parseEuro("2 530,92 €"))}
Responsable juridique{euro(parseEuro("2 530,92 €"))}
Contrôleur de gestion{euro(parseEuro("2 410,40 €"))}
Responsable de la trésorerie{euro(parseEuro("2 410,40 €"))}
Responsable de la communication{euro(parseEuro("2 410,40 €"))}
Responsable de la paie{euro(parseEuro("2 339,74 €"))}
Responsable technique{euro(parseEuro("2 289,87 €"))}
Responsable des services généraux{euro(parseEuro("2 289,87 €"))}
Chargé de mission{euro(parseEuro("2 289,87 €"))}
Attaché de direction{euro(parseEuro("2 171,66 €"))}
+
+
+ + {/* Niveau IIIA - Commercial et édition */} +
+

+ + + Niveau IIIA - Filière Commercial et édition +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
EmploisSalaire minimum CDI/CDD
Responsable des sites web/multimedia{euro(parseEuro("2 410,40 €"))}
Responsable des ventes{euro(parseEuro("2 289,87 €"))}
Responsable des produits dérivés{euro(parseEuro("2 289,87 €"))}
Responsable acquisitions{euro(parseEuro("2 289,87 €"))}
+
+
+ + {/* Niveau IIIB - Administration */} +
+

+ + + Niveau IIIB - Filière Administration +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EmploisSalaire minimum CDI/CDD
Responsable de la comptabilité{euro(parseEuro("2 169,36 €"))}
Responsable de l'administration du personnel{euro(parseEuro("2 169,36 €"))}
Attaché de presse{euro(parseEuro("2 048,84 €"))}
Collaborateur juridique{euro(parseEuro("2 048,84 €"))}
Contrôleur de gestion junior{euro(parseEuro("2 048,84 €"))}
Informaticien{euro(parseEuro("2 048,84 €"))}
Responsable d'exploitation{euro(parseEuro("2 048,84 €"))}
Chargé d'étude{euro(parseEuro("2 028,56 €"))}
+
+
+ + {/* Niveau IIIB - Commercial et édition */} +
+

+ + + Niveau IIIB - Filière Commercial et édition +

+ +
+ + + + + + + + + + + + + +
EmploisSalaire minimum CDI/CDD
Responsable des supports{euro(parseEuro("2 048,84 €"))}
+
+
+ + {/* Niveau IV - Administration */} +
+

+ + + Niveau IV - Filière Administration +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EmploisSalaire minimum CDI/CDD
Comptable{euro(parseEuro("1 988,58 €"))}
Gestionnaire paie{euro(parseEuro("1 988,58 €"))}
Webmestre{euro(parseEuro("1 928,32 €"))}
Chargé des services généraux{euro(parseEuro("1 828,83 €"))}
Assistant de direction{euro(parseEuro("1 828,83 €"))}
Assistant juridique{euro(parseEuro("1 828,83 €"))}
+
+
+ + {/* Niveau IV - Commercial et édition */} +
+

+ + + Niveau IV - Filière Commercial et édition +

+ +
+ + + + + + + + + + + + + + + + + +
EmploisSalaire minimum CDI/CDD
Gestionnaire des supports{euro(parseEuro("1 909,23 €"))}
Vendeur{euro(parseEuro("1 828,83 €"))}
+
+
+ + {/* Niveau V - Administration */} +
+

+ + + Niveau V - Filière Administration +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EmploisSalaire minimum CDI/CDD
Secrétaire - assistant{euro(parseEuro("1 828,83 €"))}
Secrétaire - standardiste{euro(parseEuro("1 828,83 €"))}
Responsable d'entretien{euro(parseEuro("1 828,83 €"))}
Assistant paye{euro(parseEuro("1 828,83 €"))}
Assistant comptable{euro(parseEuro("1 828,83 €"))}
Assistant de la communication{euro(parseEuro("1 828,83 €"))}
Agent des services généraux{euro(parseEuro("1 828,83 €"))}
+
+
+ + {/* Niveau V - Commercial et édition */} +
+

+ + + Niveau V - Filière Commercial et édition +

+ +
+ + + + + + + + + + + + + + + + + +
EmploisSalaire minimum CDI/CDD
Assistant web / téléphonie / multimedia{euro(parseEuro("1 828,83 €"))}
Assistant commercial{euro(parseEuro("1 828,83 €"))}
+
+
+ + {/* Niveau VI - Administration */} +
+

+ + + Niveau VI - Filière Administration +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EmploisSalaire minimum CDI/CDD
Hôtesse - standardiste{euro(parseEuro("1 828,83 €"))}
Chauffeur d'entreprise{euro(parseEuro("1 828,83 €"))}
Agent d'exploitation{euro(parseEuro("1 828,83 €"))}
Coursier{euro(parseEuro("1 828,83 €"))}
Gardien{euro(parseEuro("1 828,83 €"))}
Agent d'entretien{euro(parseEuro("1 828,83 €"))}
+
+
+
+ ); +} diff --git a/app/(app)/minima-ccn/ccnpa/categorie-b-fiction-data-part2.tsx b/app/(app)/minima-ccn/ccnpa/categorie-b-fiction-data-part2.tsx new file mode 100644 index 0000000..b8ed527 --- /dev/null +++ b/app/(app)/minima-ccn/ccnpa/categorie-b-fiction-data-part2.tsx @@ -0,0 +1,799 @@ +"use client"; + +import React, { useState, useMemo } from 'react'; +import { Sparkles, Film, ClipboardList, Search, ChevronDown, ChevronUp } from 'lucide-react'; + +const parseEuro = (str: string) => { + if (!str || str === '-') return null; + const cleaned = str.replace(/\s/g, '').replace('€', '').replace(',', '.'); + return parseFloat(cleaned); +}; + +const euro = (n: number | null) => { + if (n === null) return '-'; + return new Intl.NumberFormat('fr-FR', { + minimumFractionDigits: 2, + maximumFractionDigits: 2 + }).format(n) + ' €'; +}; + +interface Emploi { + nom: string; + filiere: string; + niveau: string; + cddu: { + semaine35h: number | null; + semaine39h: number | null; + jour7h: number | null; + jour8h: number | null; + mois35h: number | null; + mois39h: number | null; + }; + cdi: number | null; +} + +const emploisData: Emploi[] = [ + // Filière D - Maquillage & Coiffure + { + nom: "Blocker / Rigger", + filiere: "D", + niveau: "IV", + cddu: { + semaine35h: parseEuro("873,86 €"), + semaine39h: parseEuro("998,69 €"), + jour7h: parseEuro("194,19 €"), + jour8h: parseEuro("221,93 €"), + mois35h: parseEuro("3 320,66 €"), + mois39h: parseEuro("3 795,03 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Chef électricien", + filiere: "D", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("989,68 €"), + semaine39h: parseEuro("1 131,06 €"), + jour7h: parseEuro("219,93 €"), + jour8h: parseEuro("251,35 €"), + mois35h: parseEuro("3 760,77 €"), + mois39h: parseEuro("4 298,01 €"), + }, + cdi: parseEuro("2 289,87 €"), + }, + { + nom: "Chef machiniste", + filiere: "D", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("989,68 €"), + semaine39h: parseEuro("1 131,06 €"), + jour7h: parseEuro("219,93 €"), + jour8h: parseEuro("251,35 €"), + mois35h: parseEuro("3 760,77 €"), + mois39h: parseEuro("4 298,01 €"), + }, + cdi: parseEuro("2 289,87 €"), + }, + { + nom: "Chef maquilleur", + filiere: "D", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("884,43 €"), + semaine39h: parseEuro("1 010,78 €"), + jour7h: parseEuro("196,54 €"), + jour8h: parseEuro("224,62 €"), + mois35h: parseEuro("3 360,84 €"), + mois39h: parseEuro("3 840,95 €"), + }, + cdi: parseEuro("2 410,40 €"), + }, + { + nom: "Coiffeur", + filiere: "D", + niveau: "V", + cddu: { + semaine35h: parseEuro("714,32 €"), + semaine39h: parseEuro("816,36 €"), + jour7h: parseEuro("158,74 €"), + jour8h: parseEuro("181,41 €"), + mois35h: parseEuro("2 714,40 €"), + mois39h: parseEuro("3 102,16 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Coiffeur perruquier", + filiere: "D", + niveau: "IV", + cddu: { + semaine35h: parseEuro("893,19 €"), + semaine39h: parseEuro("1 020,79 €"), + jour7h: parseEuro("198,49 €"), + jour8h: parseEuro("226,84 €"), + mois35h: parseEuro("3 394,11 €"), + mois39h: parseEuro("3 878,98 €"), + }, + cdi: parseEuro("1 988,58 €"), + }, + { + nom: "Conducteur de groupe", + filiere: "D", + niveau: "IV", + cddu: { + semaine35h: parseEuro("881,41 €"), + semaine39h: parseEuro("1 007,33 €"), + jour7h: parseEuro("195,87 €"), + jour8h: parseEuro("223,85 €"), + mois35h: parseEuro("3 349,36 €"), + mois39h: parseEuro("3 827,83 €"), + }, + cdi: parseEuro("1 988,58 €"), + }, + { + nom: "Électricien / Éclairagiste", + filiere: "D", + niveau: "V", + cddu: { + semaine35h: parseEuro("811,99 €"), + semaine39h: parseEuro("927,99 €"), + jour7h: parseEuro("180,44 €"), + jour8h: parseEuro("206,22 €"), + mois35h: parseEuro("3 085,55 €"), + mois39h: parseEuro("3 526,34 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Machiniste", + filiere: "D", + niveau: "V", + cddu: { + semaine35h: parseEuro("811,99 €"), + semaine39h: parseEuro("927,99 €"), + jour7h: parseEuro("180,44 €"), + jour8h: parseEuro("206,22 €"), + mois35h: parseEuro("3 085,55 €"), + mois39h: parseEuro("3 526,34 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Maquilleur", + filiere: "D", + niveau: "V", + cddu: { + semaine35h: parseEuro("714,32 €"), + semaine39h: parseEuro("816,36 €"), + jour7h: parseEuro("158,74 €"), + jour8h: parseEuro("181,41 €"), + mois35h: parseEuro("2 714,40 €"), + mois39h: parseEuro("3 102,16 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Maquilleur et coiffeur effets spéciaux", + filiere: "D", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("1 072,06 €"), + semaine39h: parseEuro("1 225,21 €"), + jour7h: parseEuro("238,24 €"), + jour8h: parseEuro("272,27 €"), + mois35h: parseEuro("4 073,83 €"), + mois39h: parseEuro("4 655,79 €"), + }, + cdi: parseEuro("2 169,36 €"), + }, + { + nom: "Prothésiste", + filiere: "D", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("1 072,06 €"), + semaine39h: parseEuro("1 225,21 €"), + jour7h: parseEuro("238,24 €"), + jour8h: parseEuro("272,27 €"), + mois35h: parseEuro("4 073,83 €"), + mois39h: parseEuro("4 655,79 €"), + }, + cdi: parseEuro("2 169,36 €"), + }, + + // Filière E - Post-production + { + nom: "Assistant de post-production", + filiere: "E", + niveau: "IV", + cddu: { + semaine35h: parseEuro("626,05 €"), + semaine39h: parseEuro("715,48 €"), + jour7h: parseEuro("139,12 €"), + jour8h: parseEuro("159,00 €"), + mois35h: parseEuro("2 378,97 €"), + mois39h: parseEuro("2 718,82 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Assistant monteur", + filiere: "E", + niveau: "IV", + cddu: { + semaine35h: parseEuro("714,32 €"), + semaine39h: parseEuro("816,36 €"), + jour7h: parseEuro("158,74 €"), + jour8h: parseEuro("181,41 €"), + mois35h: parseEuro("2 714,40 €"), + mois39h: parseEuro("3 102,16 €"), + }, + cdi: parseEuro("1 928,32 €"), + }, + { + nom: "Assistant monteur adjoint", + filiere: "E", + niveau: "VI", + cddu: { + semaine35h: parseEuro("463,28 €"), + semaine39h: parseEuro("529,47 €"), + jour7h: parseEuro("102,95 €"), + jour8h: parseEuro("117,66 €"), + mois35h: parseEuro("2 342,34 €"), + mois39h: parseEuro("2 676,95 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Chargé de post-production", + filiere: "E", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("1 051,06 €"), + semaine39h: parseEuro("1 201,21 €"), + jour7h: parseEuro("233,57 €"), + jour8h: parseEuro("266,94 €"), + mois35h: parseEuro("3 994,02 €"), + mois39h: parseEuro("4 564,58 €"), + }, + cdi: parseEuro("2 651,44 €"), + }, + { + nom: "Chef monteur", + filiere: "E", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("1 127,35 €"), + semaine39h: parseEuro("1 288,39 €"), + jour7h: parseEuro("250,52 €"), + jour8h: parseEuro("286,31 €"), + mois35h: parseEuro("4 283,91 €"), + mois39h: parseEuro("4 895,89 €"), + }, + cdi: parseEuro("2 651,44 €"), + }, + { + nom: "Directeur de post-production", + filiere: "E", + niveau: "II", + cddu: { + semaine35h: parseEuro("1 264,33 €"), + semaine39h: parseEuro("1 444,95 €"), + jour7h: parseEuro("280,96 €"), + jour8h: parseEuro("321,10 €"), + mois35h: parseEuro("4 804,45 €"), + mois39h: parseEuro("5 490,78 €"), + }, + cdi: parseEuro("2 892,47 €"), + }, + { + nom: "Étalonneur", + filiere: "E", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("964,96 €"), + semaine39h: parseEuro("1 102,82 €"), + jour7h: parseEuro("214,44 €"), + jour8h: parseEuro("245,07 €"), + mois35h: parseEuro("3 666,86 €"), + mois39h: parseEuro("4 190,69 €"), + }, + cdi: parseEuro("2 169,36 €"), + }, + { + nom: "Infographiste", + filiere: "E", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("1 051,06 €"), + semaine39h: parseEuro("1 201,21 €"), + jour7h: parseEuro("233,57 €"), + jour8h: parseEuro("266,94 €"), + mois35h: parseEuro("3 994,02 €"), + mois39h: parseEuro("4 564,58 €"), + }, + cdi: parseEuro("2 530,92 €"), + }, + { + nom: "Mixeur", + filiere: "E", + niveau: "II", + cddu: { + semaine35h: parseEuro("1 348,40 €"), + semaine39h: parseEuro("1 541,03 €"), + jour7h: parseEuro("299,65 €"), + jour8h: parseEuro("342,45 €"), + mois35h: parseEuro("5 123,93 €"), + mois39h: parseEuro("5 855,91 €"), + }, + cdi: parseEuro("2 892,47 €"), + }, + { + nom: "Superviseur d'effets spéciaux postproduction", + filiere: "E", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("1 180,27 €"), + semaine39h: parseEuro("1 348,88 €"), + jour7h: parseEuro("262,28 €"), + jour8h: parseEuro("299,75 €"), + mois35h: parseEuro("4 485,04 €"), + mois39h: parseEuro("5 125,75 €"), + }, + cdi: parseEuro("2 651,44 €"), + }, + { + nom: "Truquiste", + filiere: "E", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("979,97 €"), + semaine39h: parseEuro("1 119,97 €"), + jour7h: parseEuro("217,77 €"), + jour8h: parseEuro("248,88 €"), + mois35h: parseEuro("3 723,90 €"), + mois39h: parseEuro("4 255,88 €"), + }, + cdi: parseEuro("2 530,92 €"), + }, + + // Filière F - Production + { + nom: "Administrateur de production", + filiere: "F", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("877,44 €"), + semaine39h: parseEuro("1 002,79 €"), + jour7h: parseEuro("194,99 €"), + jour8h: parseEuro("222,84 €"), + mois35h: parseEuro("3 334,28 €"), + mois39h: parseEuro("3 810,59 €"), + }, + cdi: parseEuro("2 591,18 €"), + }, + { + nom: "Assistant de production", + filiere: "F", + niveau: "IV", + cddu: { + semaine35h: parseEuro("714,32 €"), + semaine39h: parseEuro("816,36 €"), + jour7h: parseEuro("158,74 €"), + jour8h: parseEuro("181,41 €"), + mois35h: parseEuro("2 714,40 €"), + mois39h: parseEuro("3 102,16 €"), + }, + cdi: parseEuro("1 988,58 €"), + }, + { + nom: "Assistant de production adjoint", + filiere: "F", + niveau: "VI", + cddu: { + semaine35h: parseEuro("463,28 €"), + semaine39h: parseEuro("529,47 €"), + jour7h: parseEuro("102,95 €"), + jour8h: parseEuro("117,66 €"), + mois35h: parseEuro("2 342,34 €"), + mois39h: parseEuro("2 676,95 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Assistant régisseur adjoint", + filiere: "F", + niveau: "VI", + cddu: { + semaine35h: parseEuro("463,28 €"), + semaine39h: parseEuro("529,47 €"), + jour7h: parseEuro("102,95 €"), + jour8h: parseEuro("117,66 €"), + mois35h: parseEuro("2 342,34 €"), + mois39h: parseEuro("2 676,95 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Chargé de production", + filiere: "F", + niveau: "II", + cddu: { + semaine35h: parseEuro("962,49 €"), + semaine39h: parseEuro("1 099,99 €"), + jour7h: parseEuro("213,89 €"), + jour8h: parseEuro("244,44 €"), + mois35h: parseEuro("3 657,48 €"), + mois39h: parseEuro("4 179,96 €"), + }, + cdi: parseEuro("2 892,47 €"), + }, + { + nom: "Chauffeur", + filiere: "F", + niveau: "VI", + cddu: { + semaine35h: parseEuro("482,48 €"), + semaine39h: parseEuro("551,41 €"), + jour7h: parseEuro("107,22 €"), + jour8h: parseEuro("122,53 €"), + mois35h: parseEuro("2 342,34 €"), + mois39h: parseEuro("2 676,95 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Comptable de production", + filiere: "F", + niveau: "IV", + cddu: { + semaine35h: parseEuro("750,78 €"), + semaine39h: parseEuro("858,04 €"), + jour7h: parseEuro("166,84 €"), + jour8h: parseEuro("190,68 €"), + mois35h: parseEuro("2 852,98 €"), + mois39h: parseEuro("3 260,54 €"), + }, + cdi: parseEuro("2 169,36 €"), + }, + { + nom: "Directeur de production", + filiere: "F", + niveau: "I", + cddu: { + semaine35h: parseEuro("1 532,22 €"), + semaine39h: parseEuro("1 751,11 €"), + jour7h: parseEuro("340,49 €"), + jour8h: parseEuro("389,14 €"), + mois35h: parseEuro("5 822,44 €"), + mois39h: parseEuro("6 654,20 €"), + }, + cdi: parseEuro("3 314,29 €"), + }, + { + nom: "Producteur exécutif", + filiere: "F", + niveau: "HN", + cddu: { + semaine35h: null, + semaine39h: null, + jour7h: null, + jour8h: null, + mois35h: null, + mois39h: null, + }, + cdi: null, + }, + { + nom: "Régisseur / Responsable des repérages", + filiere: "F", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("830,81 €"), + semaine39h: parseEuro("949,50 €"), + jour7h: parseEuro("184,63 €"), + jour8h: parseEuro("211,00 €"), + mois35h: parseEuro("3 157,09 €"), + mois39h: parseEuro("3 608,09 €"), + }, + cdi: parseEuro("2 169,36 €"), + }, + { + nom: "Régisseur adjoint", + filiere: "F", + niveau: "IV", + cddu: { + semaine35h: parseEuro("714,32 €"), + semaine39h: parseEuro("816,36 €"), + jour7h: parseEuro("158,74 €"), + jour8h: parseEuro("181,41 €"), + mois35h: parseEuro("2 714,40 €"), + mois39h: parseEuro("3 102,16 €"), + }, + cdi: parseEuro("1 988,58 €"), + }, + { + nom: "Régisseur général", + filiere: "F", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("962,49 €"), + semaine39h: parseEuro("1 099,99 €"), + jour7h: parseEuro("213,89 €"), + jour8h: parseEuro("244,44 €"), + mois35h: parseEuro("3 657,48 €"), + mois39h: parseEuro("4 179,96 €"), + }, + cdi: parseEuro("2 651,44 €"), + }, + { + nom: "Responsable des enfants", + filiere: "F", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("746,08 €"), + semaine39h: parseEuro("852,66 €"), + jour7h: parseEuro("165,80 €"), + jour8h: parseEuro("189,48 €"), + mois35h: parseEuro("2 835,09 €"), + mois39h: parseEuro("3 240,10 €"), + }, + cdi: parseEuro("2 048,84 €"), + }, + { + nom: "Secrétaire de production", + filiere: "F", + niveau: "V", + cddu: { + semaine35h: parseEuro("626,05 €"), + semaine39h: parseEuro("715,48 €"), + jour7h: parseEuro("139,12 €"), + jour8h: parseEuro("159,00 €"), + mois35h: parseEuro("2 378,97 €"), + mois39h: parseEuro("2 718,82 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, +]; + +const filieres = [ + { code: 'D', nom: 'Plateaux et tournage', icon: Sparkles, color: 'pink' }, + { code: 'E', nom: 'Postproduction', icon: Film, color: 'indigo' }, + { code: 'F', nom: 'Production', icon: ClipboardList, color: 'green' }, +]; + +const colorClasses = { + pink: { + bg: 'bg-pink-50', + border: 'border-pink-200', + text: 'text-pink-900', + hover: 'hover:bg-pink-100', + gradient: 'from-pink-500 to-rose-600', + ring: 'ring-pink-500', + }, + indigo: { + bg: 'bg-indigo-50', + border: 'border-indigo-200', + text: 'text-indigo-900', + hover: 'hover:bg-indigo-100', + gradient: 'from-indigo-500 to-purple-600', + ring: 'ring-indigo-500', + }, + green: { + bg: 'bg-green-50', + border: 'border-green-200', + text: 'text-green-900', + hover: 'hover:bg-green-100', + gradient: 'from-green-500 to-emerald-600', + ring: 'ring-green-500', + }, +}; + +interface EmploiCardProps { + emploi: Emploi; + color: keyof typeof colorClasses; +} + +function EmploiCard({ emploi, color }: EmploiCardProps) { + const [isExpanded, setIsExpanded] = useState(false); + const [activeTab, setActiveTab] = useState<'cddu' | 'cdi'>('cdi'); + const colors = colorClasses[color]; + + return ( +
+ {/* Header */} + + + {/* Content */} + {isExpanded && ( +
+ {/* Tabs */} +
+ + +
+ + {/* Content based on tab */} + {activeTab === 'cdi' ? ( +
+

Salaire mensuel minimum

+

{euro(emploi.cdi)}

+
+ ) : ( +
+ {/* Par semaine */} +
+

Par semaine

+
+
+

Base 35h

+

{euro(emploi.cddu.semaine35h)}

+
+
+

Base 39h

+

{euro(emploi.cddu.semaine39h)}

+
+
+
+ + {/* Par jour */} +
+

Par jour

+
+
+

Base 7h

+

{euro(emploi.cddu.jour7h)}

+
+
+

Base 8h

+

{euro(emploi.cddu.jour8h)}

+
+
+
+ + {/* Par mois */} +
+

Par mois

+
+
+

Base 35h

+

{euro(emploi.cddu.mois35h)}

+
+
+

Base 39h

+

{euro(emploi.cddu.mois39h)}

+
+
+
+
+ )} +
+ )} +
+ ); +} + +interface CategorieBFictionDataPart2Props { + activeFiliere: string; +} + +export default function CategorieBFictionDataPart2({ activeFiliere }: CategorieBFictionDataPart2Props) { + const [searchTerm, setSearchTerm] = useState(''); + + const filteredEmplois = useMemo(() => { + // D'abord filtrer par la filière active + let result = emploisData.filter(e => e.filiere === activeFiliere); + + // Puis appliquer le filtre de recherche + if (searchTerm) { + result = result.filter(e => + e.nom.toLowerCase().includes(searchTerm.toLowerCase()) + ); + } + + return result.sort((a, b) => a.nom.localeCompare(b.nom)); + }, [activeFiliere, searchTerm]); + + // Déterminer la couleur en fonction de la filière + const getColorForFiliere = (filiereCode: string): keyof typeof colorClasses => { + const filiere = filieres.find(f => f.code === filiereCode); + return (filiere?.color as keyof typeof colorClasses) || 'blue'; + }; + + return ( +
+ {/* En-tête */} +
+

+ Filières D, E et F +

+

+ {emploisData.length} emplois - Grille de salaires CCNPA (IDCC 2642) - Valeurs 2025 +

+
+ + {/* Recherche */} +
+ {/* Barre de recherche */} +
+ + setSearchTerm(e.target.value)} + placeholder="Rechercher un emploi (nom ou filière D/E/F)..." + className="w-full pl-10 pr-4 py-2.5 rounded-lg border border-slate-200 focus:ring-2 focus:ring-cyan-500 focus:border-transparent text-sm" + /> +
+ + {/* Résultats */} +
+
+

+ {filteredEmplois.length} emploi{filteredEmplois.length > 1 ? 's' : ''} trouvé{filteredEmplois.length > 1 ? 's' : ''} +

+ {searchTerm && ( + + )} +
+ +
+ {filteredEmplois.map((emploi, index) => ( + + ))} +
+ + {filteredEmplois.length === 0 && ( +
+

Aucun emploi trouvé pour cette recherche.

+
+ )} +
+
+
+ ); +} diff --git a/app/(app)/minima-ccn/ccnpa/categorie-b-fiction-data-part3.tsx b/app/(app)/minima-ccn/ccnpa/categorie-b-fiction-data-part3.tsx new file mode 100644 index 0000000..83b1f4a --- /dev/null +++ b/app/(app)/minima-ccn/ccnpa/categorie-b-fiction-data-part3.tsx @@ -0,0 +1,603 @@ +"use client"; + +import React, { useState, useMemo } from 'react'; +import { Clapperboard, Volume2, Globe, Search, ChevronDown, ChevronUp } from 'lucide-react'; + +const parseEuro = (str: string) => { + if (!str || str === '-') return null; + const cleaned = str.replace(/\s/g, '').replace('€', '').replace(',', '.'); + return parseFloat(cleaned); +}; + +const euro = (n: number | null) => { + if (n === null) return '-'; + return new Intl.NumberFormat('fr-FR', { + minimumFractionDigits: 2, + maximumFractionDigits: 2 + }).format(n) + ' €'; +}; + +interface Emploi { + nom: string; + filiere: string; + niveau: string; + cddu: { + semaine35h: number | null; + semaine39h: number | null; + jour7h: number | null; + jour8h: number | null; + mois35h: number | null; + mois39h: number | null; + }; + cdi: number | null; +} + +const emploisData: Emploi[] = [ + // Filière G - Réalisation + { + nom: "1er assistant réalisateur", + filiere: "G", + niveau: "II", + cddu: { + semaine35h: parseEuro("962,49 €"), + semaine39h: parseEuro("1 099,99 €"), + jour7h: parseEuro("213,89 €"), + jour8h: parseEuro("244,44 €"), + mois35h: parseEuro("3 657,48 €"), + mois39h: parseEuro("4 179,96 €"), + }, + cdi: parseEuro("2 892,47 €"), + }, + { + nom: "2ème assistant réalisateur", + filiere: "G", + niveau: "IV", + cddu: { + semaine35h: parseEuro("804,93 €"), + semaine39h: parseEuro("919,92 €"), + jour7h: parseEuro("178,87 €"), + jour8h: parseEuro("204,43 €"), + mois35h: parseEuro("3 058,73 €"), + mois39h: parseEuro("3 495,68 €"), + }, + cdi: parseEuro("1 988,58 €"), + }, + { + nom: "Assistant réalisateur adjoint", + filiere: "G", + niveau: "VI", + cddu: { + semaine35h: parseEuro("463,28 €"), + semaine39h: parseEuro("529,47 €"), + jour7h: parseEuro("102,95 €"), + jour8h: parseEuro("117,66 €"), + mois35h: parseEuro("2 342,34 €"), + mois39h: parseEuro("2 676,95 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Assistant scripte adjoint", + filiere: "G", + niveau: "VI", + cddu: { + semaine35h: parseEuro("463,28 €"), + semaine39h: parseEuro("529,47 €"), + jour7h: parseEuro("102,95 €"), + jour8h: parseEuro("117,66 €"), + mois35h: parseEuro("2 342,34 €"), + mois39h: parseEuro("2 676,95 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Conseiller technique à la réalisation", + filiere: "G", + niveau: "II", + cddu: { + semaine35h: parseEuro("1 051,06 €"), + semaine39h: parseEuro("1 201,21 €"), + jour7h: parseEuro("233,57 €"), + jour8h: parseEuro("266,94 €"), + mois35h: parseEuro("3 994,02 €"), + mois39h: parseEuro("4 564,58 €"), + }, + cdi: parseEuro("3 013,00 €"), + }, + { + nom: "Répétiteur", + filiere: "G", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("746,08 €"), + semaine39h: parseEuro("852,66 €"), + jour7h: parseEuro("165,80 €"), + jour8h: parseEuro("189,48 €"), + mois35h: parseEuro("2 835,09 €"), + mois39h: parseEuro("3 240,10 €"), + }, + cdi: parseEuro("2 048,84 €"), + }, + { + nom: "Scripte", + filiere: "G", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("962,49 €"), + semaine39h: parseEuro("1 099,99 €"), + jour7h: parseEuro("213,89 €"), + jour8h: parseEuro("244,44 €"), + mois35h: parseEuro("3 657,48 €"), + mois39h: parseEuro("4 179,96 €"), + }, + cdi: parseEuro("2 651,44 €"), + }, + { + nom: "Storyboarder", + filiere: "G", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("894,37 €"), + semaine39h: parseEuro("1 022,14 €"), + jour7h: parseEuro("198,75 €"), + jour8h: parseEuro("227,14 €"), + mois35h: parseEuro("3 398,61 €"), + mois39h: parseEuro("3 884,11 €"), + }, + cdi: parseEuro("2 169,36 €"), + }, + + // Filière H - Son + { + nom: "Assistant son", + filiere: "H", + niveau: "IV", + cddu: { + semaine35h: parseEuro("714,32 €"), + semaine39h: parseEuro("816,36 €"), + jour7h: parseEuro("158,74 €"), + jour8h: parseEuro("181,41 €"), + mois35h: parseEuro("2 714,40 €"), + mois39h: parseEuro("3 102,16 €"), + }, + cdi: parseEuro("1 928,32 €"), + }, + { + nom: "Assistant son adjoint", + filiere: "H", + niveau: "VI", + cddu: { + semaine35h: parseEuro("463,28 €"), + semaine39h: parseEuro("529,47 €"), + jour7h: parseEuro("102,95 €"), + jour8h: parseEuro("117,66 €"), + mois35h: parseEuro("2 342,34 €"), + mois39h: parseEuro("2 676,95 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Bruiteur", + filiere: "H", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("1 051,06 €"), + semaine39h: parseEuro("1 201,21 €"), + jour7h: parseEuro("233,57 €"), + jour8h: parseEuro("266,94 €"), + mois35h: parseEuro("3 994,02 €"), + mois39h: parseEuro("4 564,58 €"), + }, + cdi: parseEuro("2 530,92 €"), + }, + { + nom: "Chef OPS / Ingénieur du son", + filiere: "H", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("1 212,78 €"), + semaine39h: parseEuro("1 386,03 €"), + jour7h: parseEuro("269,51 €"), + jour8h: parseEuro("308,01 €"), + mois35h: parseEuro("4 608,56 €"), + mois39h: parseEuro("5 266,91 €"), + }, + cdi: parseEuro("2 651,44 €"), + }, + { + nom: "Perchiste / 1er assistant son", + filiere: "H", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("882,10 €"), + semaine39h: parseEuro("1 008,12 €"), + jour7h: parseEuro("196,02 €"), + jour8h: parseEuro("224,03 €"), + mois35h: parseEuro("3 351,98 €"), + mois39h: parseEuro("3 830,83 €"), + }, + cdi: parseEuro("2 410,40 €"), + }, + + // Filière I - Web + { + nom: "Assistant technique web", + filiere: "I", + niveau: "VI", + cddu: { + semaine35h: parseEuro("463,28 €"), + semaine39h: parseEuro("529,47 €"), + jour7h: parseEuro("102,95 €"), + jour8h: parseEuro("117,66 €"), + mois35h: parseEuro("2 006,02 €"), + mois39h: parseEuro("2 292,59 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Concepteur de programme web", + filiere: "I", + niveau: "I", + cddu: { + semaine35h: parseEuro("785,78 €"), + semaine39h: parseEuro("898,03 €"), + jour7h: parseEuro("174,62 €"), + jour8h: parseEuro("199,56 €"), + mois35h: parseEuro("3 402,43 €"), + mois39h: parseEuro("3 888,47 €"), + }, + cdi: parseEuro("2 969,12 €"), + }, + { + nom: "Coordinateur de diffusion web", + filiere: "I", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("519,92 €"), + semaine39h: parseEuro("594,19 €"), + jour7h: parseEuro("115,54 €"), + jour8h: parseEuro("132,04 €"), + mois35h: parseEuro("2 251,23 €"), + mois39h: parseEuro("2 572,83 €"), + }, + cdi: parseEuro("1 959,62 €"), + }, + { + nom: "Coordinateur de production web", + filiere: "I", + niveau: "II", + cddu: { + semaine35h: parseEuro("590,82 €"), + semaine39h: parseEuro("675,22 €"), + jour7h: parseEuro("131,29 €"), + jour8h: parseEuro("150,05 €"), + mois35h: parseEuro("2 558,24 €"), + mois39h: parseEuro("2 923,70 €"), + }, + cdi: parseEuro("2 197,15 €"), + }, + { + nom: "Designer web", + filiere: "I", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("543,55 €"), + semaine39h: parseEuro("621,20 €"), + jour7h: parseEuro("120,79 €"), + jour8h: parseEuro("138,05 €"), + mois35h: parseEuro("2 353,59 €"), + mois39h: parseEuro("2 689,80 €"), + }, + cdi: parseEuro("2 019,01 €"), + }, + { + nom: "Editeur artistique web", + filiere: "I", + niveau: "IV", + cddu: { + semaine35h: parseEuro("502,19 €"), + semaine39h: parseEuro("573,93 €"), + jour7h: parseEuro("111,60 €"), + jour8h: parseEuro("127,54 €"), + mois35h: parseEuro("2 174,48 €"), + mois39h: parseEuro("2 485,11 €"), + }, + cdi: parseEuro("1 900,24 €"), + }, + { + nom: "Gestionnaire de diffusion internet (traffic manager)", + filiere: "I", + niveau: "V", + cddu: { + semaine35h: parseEuro("463,28 €"), + semaine39h: parseEuro("529,47 €"), + jour7h: parseEuro("102,95 €"), + jour8h: parseEuro("117,66 €"), + mois35h: parseEuro("2 006,02 €"), + mois39h: parseEuro("2 292,59 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Opérateur web / Opérateur multicam web", + filiere: "I", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("567,18 €"), + semaine39h: parseEuro("648,21 €"), + jour7h: parseEuro("126,04 €"), + jour8h: parseEuro("144,05 €"), + mois35h: parseEuro("2 455,89 €"), + mois39h: parseEuro("2 806,72 €"), + }, + cdi: parseEuro("2 137,77 €"), + }, + { + nom: "Technicien de développement web", + filiere: "I", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("519,92 €"), + semaine39h: parseEuro("594,19 €"), + jour7h: parseEuro("115,54 €"), + jour8h: parseEuro("132,04 €"), + mois35h: parseEuro("2 251,23 €"), + mois39h: parseEuro("2 572,83 €"), + }, + cdi: parseEuro("1 959,62 €"), + }, + { + nom: "Technicien vidéo web", + filiere: "I", + niveau: "V", + cddu: { + semaine35h: parseEuro("463,28 €"), + semaine39h: parseEuro("529,47 €"), + jour7h: parseEuro("102,95 €"), + jour8h: parseEuro("117,66 €"), + mois35h: parseEuro("2 006,02 €"), + mois39h: parseEuro("2 292,59 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, +]; + +const filieres = [ + { code: 'G', nom: 'Réalisation', icon: Clapperboard, color: 'orange' }, + { code: 'H', nom: 'Son', icon: Volume2, color: 'red' }, + { code: 'I', nom: 'Web', icon: Globe, color: 'teal' }, +]; + +const colorClasses = { + orange: { + bg: 'bg-orange-50', + border: 'border-orange-200', + text: 'text-orange-900', + hover: 'hover:bg-orange-100', + gradient: 'from-orange-500 to-amber-600', + ring: 'ring-orange-500', + }, + red: { + bg: 'bg-red-50', + border: 'border-red-200', + text: 'text-red-900', + hover: 'hover:bg-red-100', + gradient: 'from-red-500 to-rose-600', + ring: 'ring-red-500', + }, + teal: { + bg: 'bg-teal-50', + border: 'border-teal-200', + text: 'text-teal-900', + hover: 'hover:bg-teal-100', + gradient: 'from-teal-500 to-cyan-600', + ring: 'ring-teal-500', + }, +}; + +interface EmploiCardProps { + emploi: Emploi; + color: keyof typeof colorClasses; +} + +function EmploiCard({ emploi, color }: EmploiCardProps) { + const [isExpanded, setIsExpanded] = useState(false); + const [activeTab, setActiveTab] = useState<'cddu' | 'cdi'>('cdi'); + const colors = colorClasses[color]; + + return ( +
+ {/* Header */} + + + {/* Content */} + {isExpanded && ( +
+ {/* Tabs */} +
+ + +
+ + {/* Content based on tab */} + {activeTab === 'cdi' ? ( +
+

Salaire mensuel minimum

+

{euro(emploi.cdi)}

+
+ ) : ( +
+ {/* Par semaine */} +
+

Par semaine

+
+
+

Base 35h

+

{euro(emploi.cddu.semaine35h)}

+
+
+

Base 39h

+

{euro(emploi.cddu.semaine39h)}

+
+
+
+ + {/* Par jour */} +
+

Par jour

+
+
+

Base 7h

+

{euro(emploi.cddu.jour7h)}

+
+
+

Base 8h

+

{euro(emploi.cddu.jour8h)}

+
+
+
+ + {/* Par mois */} +
+

Par mois

+
+
+

Base 35h

+

{euro(emploi.cddu.mois35h)}

+
+
+

Base 39h

+

{euro(emploi.cddu.mois39h)}

+
+
+
+
+ )} +
+ )} +
+ ); +} + +interface CategorieBFictionDataPart3Props { + activeFiliere: string; +} + +export default function CategorieBFictionDataPart3({ activeFiliere }: CategorieBFictionDataPart3Props) { + const [searchTerm, setSearchTerm] = useState(''); + + const filteredEmplois = useMemo(() => { + // D'abord filtrer par la filière active + let result = emploisData.filter(e => e.filiere === activeFiliere); + + // Puis appliquer le filtre de recherche + if (searchTerm) { + result = result.filter(e => + e.nom.toLowerCase().includes(searchTerm.toLowerCase()) + ); + } + + return result.sort((a, b) => a.nom.localeCompare(b.nom)); + }, [activeFiliere, searchTerm]); + + // Déterminer la couleur en fonction de la filière + const getColorForFiliere = (filiereCode: string): keyof typeof colorClasses => { + const filiere = filieres.find(f => f.code === filiereCode); + return (filiere?.color as keyof typeof colorClasses) || 'blue'; + }; + + return ( +
+ {/* En-tête */} +
+

+ Filières G, H et I +

+

+ {emploisData.length} emplois - Grille de salaires CCNPA (IDCC 2642) - Valeurs 2025 +

+
+ + {/* Recherche */} +
+ {/* Barre de recherche */} +
+ + setSearchTerm(e.target.value)} + placeholder="Rechercher un emploi (nom ou filière G/H/I)..." + className="w-full pl-10 pr-4 py-2.5 rounded-lg border border-slate-200 focus:ring-2 focus:ring-cyan-500 focus:border-transparent text-sm" + /> +
+ + {/* Résultats */} +
+
+

+ {filteredEmplois.length} emploi{filteredEmplois.length > 1 ? 's' : ''} trouvé{filteredEmplois.length > 1 ? 's' : ''} +

+ {searchTerm && ( + + )} +
+ +
+ {filteredEmplois.map((emploi, index) => ( + + ))} +
+ + {filteredEmplois.length === 0 && ( +
+

Aucun emploi trouvé pour cette recherche.

+
+ )} +
+
+
+ ); +} diff --git a/app/(app)/minima-ccn/ccnpa/categorie-b-fiction-data.tsx b/app/(app)/minima-ccn/ccnpa/categorie-b-fiction-data.tsx new file mode 100644 index 0000000..b3d52cc --- /dev/null +++ b/app/(app)/minima-ccn/ccnpa/categorie-b-fiction-data.tsx @@ -0,0 +1,979 @@ +"use client"; + +import React, { useState, useMemo } from 'react'; +import { Pencil, Palette, Camera, Search, ChevronDown, ChevronUp } from 'lucide-react'; + +const parseEuro = (str: string) => { + if (!str || str === '-') return null; + const cleaned = str.replace(/\s/g, '').replace('€', '').replace(',', '.'); + return parseFloat(cleaned); +}; + +const euro = (n: number | null) => { + if (n === null) return '-'; + return new Intl.NumberFormat('fr-FR', { + minimumFractionDigits: 2, + maximumFractionDigits: 2 + }).format(n) + ' €'; +}; + +interface Emploi { + nom: string; + filiere: string; + niveau: string; + cddu: { + semaine35h: number | null; + semaine39h: number | null; + jour7h: number | null; + jour8h: number | null; + mois35h: number | null; + mois39h: number | null; + }; + cdi: number | null; +} + +const emploisData: Emploi[] = [ + // Filière A - Écriture + { + nom: "Chargé de recherche", + filiere: "A", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("803,07 €"), + semaine39h: parseEuro("917,80 €"), + jour7h: parseEuro("178,46 €"), + jour8h: parseEuro("203,95 €"), + mois35h: parseEuro("3 051,68 €"), + mois39h: parseEuro("3 487,62 €"), + }, + cdi: parseEuro("2 530,92 €"), + }, + { + nom: "Chargé de sélection", + filiere: "A", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("822,67 €"), + semaine39h: parseEuro("940,19 €"), + jour7h: parseEuro("182,82 €"), + jour8h: parseEuro("208,93 €"), + mois35h: parseEuro("3 126,14 €"), + mois39h: parseEuro("3 572,72 €"), + }, + cdi: parseEuro("2 590,58 €"), + }, + { + nom: "Collaborateur artistique", + filiere: "A", + niveau: "IV", + cddu: { + semaine35h: parseEuro("534,27 €"), + semaine39h: parseEuro("610,60 €"), + jour7h: parseEuro("118,73 €"), + jour8h: parseEuro("135,69 €"), + mois35h: parseEuro("2 342,34 €"), + mois39h: parseEuro("2 676,95 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Conseiller artistique d'émission", + filiere: "A", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("807,61 €"), + semaine39h: parseEuro("922,98 €"), + jour7h: parseEuro("179,47 €"), + jour8h: parseEuro("205,11 €"), + mois35h: parseEuro("3 068,91 €"), + mois39h: parseEuro("3 507,31 €"), + }, + cdi: parseEuro("2 590,58 €"), + }, + { + nom: "Coordinateur d'écriture (ex script éditeur)", + filiere: "A", + niveau: "II", + cddu: { + semaine35h: parseEuro("877,44 €"), + semaine39h: parseEuro("1 002,79 €"), + jour7h: parseEuro("194,99 €"), + jour8h: parseEuro("222,84 €"), + mois35h: parseEuro("3 334,28 €"), + mois39h: parseEuro("3 810,59 €"), + }, + cdi: parseEuro("3 013,00 €"), + }, + { + nom: "Dir. de collection / Dir. de programmation", + filiere: "A", + niveau: "II", + cddu: { + semaine35h: parseEuro("1 127,35 €"), + semaine39h: parseEuro("1 288,39 €"), + jour7h: parseEuro("250,52 €"), + jour8h: parseEuro("286,31 €"), + mois35h: parseEuro("4 283,91 €"), + mois39h: parseEuro("4 895,89 €"), + }, + cdi: parseEuro("2 952,74 €"), + }, + { + nom: "Directeur artistique", + filiere: "A", + niveau: "II", + cddu: { + semaine35h: parseEuro("1 127,35 €"), + semaine39h: parseEuro("1 288,39 €"), + jour7h: parseEuro("250,52 €"), + jour8h: parseEuro("286,31 €"), + mois35h: parseEuro("4 283,91 €"), + mois39h: parseEuro("4 895,89 €"), + }, + cdi: parseEuro("2 952,74 €"), + }, + { + nom: "Directeur de la distribution", + filiere: "A", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("877,44 €"), + semaine39h: parseEuro("1 002,79 €"), + jour7h: parseEuro("194,99 €"), + jour8h: parseEuro("222,84 €"), + mois35h: parseEuro("3 334,28 €"), + mois39h: parseEuro("3 810,59 €"), + }, + cdi: parseEuro("2 530,92 €"), + }, + { + nom: "Directeur des dialogues", + filiere: "A", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("746,08 €"), + semaine39h: parseEuro("852,66 €"), + jour7h: parseEuro("165,80 €"), + jour8h: parseEuro("189,48 €"), + mois35h: parseEuro("2 835,09 €"), + mois39h: parseEuro("3 240,10 €"), + }, + cdi: parseEuro("2 048,84 €"), + }, + { + nom: "Documentaliste", + filiere: "A", + niveau: "II", + cddu: { + semaine35h: parseEuro("838,98 €"), + semaine39h: parseEuro("958,83 €"), + jour7h: parseEuro("186,44 €"), + jour8h: parseEuro("213,07 €"), + mois35h: parseEuro("3 188,12 €"), + mois39h: parseEuro("3 643,55 €"), + }, + cdi: parseEuro("2 892,47 €"), + }, + { + nom: "Enquêteur / Recherchiste", + filiere: "A", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("768,45 €"), + semaine39h: parseEuro("878,23 €"), + jour7h: parseEuro("170,77 €"), + jour8h: parseEuro("195,16 €"), + mois35h: parseEuro("2 920,11 €"), + mois39h: parseEuro("3 337,26 €"), + }, + cdi: parseEuro("2 169,36 €"), + }, + { + nom: "Responsable d'enquête / de recherche", + filiere: "A", + niveau: "II", + cddu: { + semaine35h: parseEuro("838,98 €"), + semaine39h: parseEuro("958,83 €"), + jour7h: parseEuro("186,44 €"), + jour8h: parseEuro("213,07 €"), + mois35h: parseEuro("3 188,12 €"), + mois39h: parseEuro("3 643,55 €"), + }, + cdi: parseEuro("2 892,47 €"), + }, + + // Filière B - Décor & Costume + { + nom: "1er assistant décorateur", + filiere: "B", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("962,49 €"), + semaine39h: parseEuro("1 099,99 €"), + jour7h: parseEuro("213,89 €"), + jour8h: parseEuro("244,44 €"), + mois35h: parseEuro("3 657,48 €"), + mois39h: parseEuro("4 179,96 €"), + }, + cdi: parseEuro("2 530,92 €"), + }, + { + nom: "2ème assistant décorateur", + filiere: "B", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("839,05 €"), + semaine39h: parseEuro("958,92 €"), + jour7h: parseEuro("186,46 €"), + jour8h: parseEuro("213,09 €"), + mois35h: parseEuro("3 188,41 €"), + mois39h: parseEuro("3 643,88 €"), + }, + cdi: parseEuro("2 109,10 €"), + }, + { + nom: "Accessoiriste", + filiere: "B", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("810,81 €"), + semaine39h: parseEuro("926,64 €"), + jour7h: parseEuro("180,18 €"), + jour8h: parseEuro("205,92 €"), + mois35h: parseEuro("3 081,06 €"), + mois39h: parseEuro("3 521,20 €"), + }, + cdi: parseEuro("2 048,84 €"), + }, + { + nom: "Assistant décorateur adjoint", + filiere: "B", + niveau: "VI", + cddu: { + semaine35h: parseEuro("463,28 €"), + semaine39h: parseEuro("529,47 €"), + jour7h: parseEuro("102,95 €"), + jour8h: parseEuro("117,66 €"), + mois35h: parseEuro("2 342,34 €"), + mois39h: parseEuro("2 676,95 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Chef constructeur", + filiere: "B", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("1 221,74 €"), + semaine39h: parseEuro("1 396,28 €"), + jour7h: parseEuro("271,50 €"), + jour8h: parseEuro("310,28 €"), + mois35h: parseEuro("4 642,63 €"), + mois39h: parseEuro("5 305,84 €"), + }, + cdi: parseEuro("2 651,44 €"), + }, + { + nom: "Chef costumier", + filiere: "B", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("894,37 €"), + semaine39h: parseEuro("1 022,14 €"), + jour7h: parseEuro("198,75 €"), + jour8h: parseEuro("227,14 €"), + mois35h: parseEuro("3 398,61 €"), + mois39h: parseEuro("3 884,11 €"), + }, + cdi: parseEuro("2 169,36 €"), + }, + { + nom: "Chef d'équipe de décor", + filiere: "B", + niveau: "IV", + cddu: { + semaine35h: parseEuro("1 114,05 €"), + semaine39h: parseEuro("1 273,20 €"), + jour7h: parseEuro("247,57 €"), + jour8h: parseEuro("282,93 €"), + mois35h: parseEuro("4 233,38 €"), + mois39h: parseEuro("4 838,13 €"), + }, + cdi: parseEuro("2 530,92 €"), + }, + { + nom: "Chef décorateur", + filiere: "B", + niveau: "II", + cddu: { + semaine35h: parseEuro("1 664,48 €"), + semaine39h: parseEuro("1 902,26 €"), + jour7h: parseEuro("369,88 €"), + jour8h: parseEuro("422,73 €"), + mois35h: parseEuro("6 325,03 €"), + mois39h: parseEuro("7 228,58 €"), + }, + cdi: parseEuro("3 013,00 €"), + }, + { + nom: "Constructeur de décor", + filiere: "B", + niveau: "IV", + cddu: { + semaine35h: parseEuro("932,11 €"), + semaine39h: parseEuro("1 065,27 €"), + jour7h: parseEuro("207,14 €"), + jour8h: parseEuro("236,73 €"), + mois35h: parseEuro("3 542,03 €"), + mois39h: parseEuro("4 048,02 €"), + }, + cdi: parseEuro("2 481,29 €"), + }, + { + nom: "Costumier", + filiere: "B", + niveau: "IV", + cddu: { + semaine35h: parseEuro("714,32 €"), + semaine39h: parseEuro("816,36 €"), + jour7h: parseEuro("158,74 €"), + jour8h: parseEuro("181,41 €"), + mois35h: parseEuro("2 714,40 €"), + mois39h: parseEuro("3 102,16 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Créateur de costume", + filiere: "B", + niveau: "II", + cddu: { + semaine35h: parseEuro("1 640,95 €"), + semaine39h: parseEuro("1 875,37 €"), + jour7h: parseEuro("364,66 €"), + jour8h: parseEuro("416,75 €"), + mois35h: parseEuro("6 235,62 €"), + mois39h: parseEuro("7 126,40 €"), + }, + cdi: parseEuro("3 013,00 €"), + }, + { + nom: "Décorateur", + filiere: "B", + niveau: "II", + cddu: { + semaine35h: parseEuro("1 069,70 €"), + semaine39h: parseEuro("1 222,51 €"), + jour7h: parseEuro("237,71 €"), + jour8h: parseEuro("271,67 €"), + mois35h: parseEuro("4 064,86 €"), + mois39h: parseEuro("4 645,54 €"), + }, + cdi: parseEuro("2 892,47 €"), + }, + { + nom: "Dessinateur en décor", + filiere: "B", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("839,05 €"), + semaine39h: parseEuro("958,92 €"), + jour7h: parseEuro("186,46 €"), + jour8h: parseEuro("213,09 €"), + mois35h: parseEuro("3 188,41 €"), + mois39h: parseEuro("3 643,88 €"), + }, + cdi: parseEuro("2 109,10 €"), + }, + { + nom: "Électricien déco / Machiniste déco", + filiere: "B", + niveau: "V", + cddu: { + semaine35h: parseEuro("920,25 €"), + semaine39h: parseEuro("1 051,72 €"), + jour7h: parseEuro("204,50 €"), + jour8h: parseEuro("233,72 €"), + mois35h: parseEuro("3 496,97 €"), + mois39h: parseEuro("3 996,52 €"), + }, + cdi: parseEuro("2 169,36 €"), + }, + { + nom: "Ensemblier - décorateur", + filiere: "B", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("962,49 €"), + semaine39h: parseEuro("1 099,99 €"), + jour7h: parseEuro("213,89 €"), + jour8h: parseEuro("244,44 €"), + mois35h: parseEuro("3 657,48 €"), + mois39h: parseEuro("4 179,96 €"), + }, + cdi: parseEuro("2 530,92 €"), + }, + { + nom: "Habilleur", + filiere: "B", + niveau: "V", + cddu: { + semaine35h: parseEuro("643,70 €"), + semaine39h: parseEuro("735,66 €"), + jour7h: parseEuro("143,04 €"), + jour8h: parseEuro("163,48 €"), + mois35h: parseEuro("2 446,06 €"), + mois39h: parseEuro("2 795,49 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Maçon de décor", + filiere: "B", + niveau: "V", + cddu: { + semaine35h: parseEuro("920,25 €"), + semaine39h: parseEuro("1 051,72 €"), + jour7h: parseEuro("204,50 €"), + jour8h: parseEuro("233,72 €"), + mois35h: parseEuro("3 496,97 €"), + mois39h: parseEuro("3 996,52 €"), + }, + cdi: parseEuro("2 169,36 €"), + }, + { + nom: "Menuisier-traceur-toupilleur de décor", + filiere: "B", + niveau: "V", + cddu: { + semaine35h: parseEuro("949,67 €"), + semaine39h: parseEuro("1 085,34 €"), + jour7h: parseEuro("211,04 €"), + jour8h: parseEuro("241,19 €"), + mois35h: parseEuro("3 608,76 €"), + mois39h: parseEuro("4 124,29 €"), + }, + cdi: parseEuro("2 410,40 €"), + }, + { + nom: "Métallier / Serrurier / Mécanicien de décor", + filiere: "B", + niveau: "V", + cddu: { + semaine35h: parseEuro("920,25 €"), + semaine39h: parseEuro("1 051,72 €"), + jour7h: parseEuro("204,50 €"), + jour8h: parseEuro("233,72 €"), + mois35h: parseEuro("3 496,97 €"), + mois39h: parseEuro("3 996,52 €"), + }, + cdi: parseEuro("2 169,36 €"), + }, + { + nom: "Peintre de décor", + filiere: "B", + niveau: "V", + cddu: { + semaine35h: parseEuro("920,25 €"), + semaine39h: parseEuro("1 051,72 €"), + jour7h: parseEuro("204,50 €"), + jour8h: parseEuro("233,72 €"), + mois35h: parseEuro("3 496,97 €"), + mois39h: parseEuro("3 996,52 €"), + }, + cdi: parseEuro("2 169,36 €"), + }, + { + nom: "Peintre en lettres / en faux bois de décor", + filiere: "B", + niveau: "V", + cddu: { + semaine35h: parseEuro("920,25 €"), + semaine39h: parseEuro("1 051,72 €"), + jour7h: parseEuro("204,50 €"), + jour8h: parseEuro("233,72 €"), + mois35h: parseEuro("3 496,97 €"), + mois39h: parseEuro("3 996,52 €"), + }, + cdi: parseEuro("2 169,36 €"), + }, + { + nom: "Régisseur d'extérieurs", + filiere: "B", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("839,05 €"), + semaine39h: parseEuro("958,92 €"), + jour7h: parseEuro("186,46 €"), + jour8h: parseEuro("213,09 €"), + mois35h: parseEuro("3 188,41 €"), + mois39h: parseEuro("3 643,88 €"), + }, + cdi: parseEuro("2 109,10 €"), + }, + { + nom: "Rippeur", + filiere: "B", + niveau: "V", + cddu: { + semaine35h: parseEuro("822,58 €"), + semaine39h: parseEuro("940,09 €"), + jour7h: parseEuro("182,80 €"), + jour8h: parseEuro("208,91 €"), + mois35h: parseEuro("3 125,81 €"), + mois39h: parseEuro("3 572,35 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Staffeur de décor", + filiere: "B", + niveau: "V", + cddu: { + semaine35h: parseEuro("949,67 €"), + semaine39h: parseEuro("1 085,34 €"), + jour7h: parseEuro("211,04 €"), + jour8h: parseEuro("241,19 €"), + mois35h: parseEuro("3 608,76 €"), + mois39h: parseEuro("4 124,29 €"), + }, + cdi: parseEuro("2 169,36 €"), + }, + { + nom: "Styliste", + filiere: "B", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("804,93 €"), + semaine39h: parseEuro("919,92 €"), + jour7h: parseEuro("178,87 €"), + jour8h: parseEuro("204,43 €"), + mois35h: parseEuro("3 058,73 €"), + mois39h: parseEuro("3 495,68 €"), + }, + cdi: parseEuro("2 048,84 €"), + }, + { + nom: "Tapissier de décor", + filiere: "B", + niveau: "V", + cddu: { + semaine35h: parseEuro("920,25 €"), + semaine39h: parseEuro("1 051,72 €"), + jour7h: parseEuro("204,50 €"), + jour8h: parseEuro("233,72 €"), + mois35h: parseEuro("3 496,97 €"), + mois39h: parseEuro("3 996,52 €"), + }, + cdi: parseEuro("2 169,36 €"), + }, + + // Filière C - Image + { + nom: "1er assistant OPV / pointeur", + filiere: "C", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("968,32 €"), + semaine39h: parseEuro("1 106,66 €"), + jour7h: parseEuro("215,18 €"), + jour8h: parseEuro("245,92 €"), + mois35h: parseEuro("3 679,63 €"), + mois39h: parseEuro("4 205,28 €"), + }, + cdi: parseEuro("2 651,44 €"), + }, + { + nom: "2ème assistant OPV", + filiere: "C", + niveau: "V", + cddu: { + semaine35h: parseEuro("714,32 €"), + semaine39h: parseEuro("816,36 €"), + jour7h: parseEuro("158,74 €"), + jour8h: parseEuro("181,41 €"), + mois35h: parseEuro("2 714,40 €"), + mois39h: parseEuro("3 102,16 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Assistant lumière", + filiere: "C", + niveau: "IV", + cddu: { + semaine35h: parseEuro("764,93 €"), + semaine39h: parseEuro("874,20 €"), + jour7h: parseEuro("169,98 €"), + jour8h: parseEuro("194,27 €"), + mois35h: parseEuro("2 906,72 €"), + mois39h: parseEuro("3 321,95 €"), + }, + cdi: parseEuro("2 018,71 €"), + }, + { + nom: "Assistant OPV adjoint", + filiere: "C", + niveau: "VI", + cddu: { + semaine35h: parseEuro("463,28 €"), + semaine39h: parseEuro("529,47 €"), + jour7h: parseEuro("102,95 €"), + jour8h: parseEuro("117,66 €"), + mois35h: parseEuro("2 342,34 €"), + mois39h: parseEuro("2 676,95 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Cadreur / OPV", + filiere: "C", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("1 125,04 €"), + semaine39h: parseEuro("1 285,76 €"), + jour7h: parseEuro("250,01 €"), + jour8h: parseEuro("285,72 €"), + mois35h: parseEuro("4 275,15 €"), + mois39h: parseEuro("4 885,87 €"), + }, + cdi: parseEuro("2 651,44 €"), + }, + { + nom: "Directeur photo", + filiere: "C", + niveau: "I", + cddu: { + semaine35h: parseEuro("1 762,00 €"), + semaine39h: parseEuro("2 013,72 €"), + jour7h: parseEuro("391,56 €"), + jour8h: parseEuro("447,49 €"), + mois35h: parseEuro("6 695,61 €"), + mois39h: parseEuro("7 652,11 €"), + }, + cdi: parseEuro("3 314,29 €"), + }, + { + nom: "Opérateur de transfert et de traitement numérique", + filiere: "C", + niveau: "V", + cddu: { + semaine35h: parseEuro("714,32 €"), + semaine39h: parseEuro("816,36 €"), + jour7h: parseEuro("158,74 €"), + jour8h: parseEuro("181,41 €"), + mois35h: parseEuro("2 714,40 €"), + mois39h: parseEuro("3 102,17 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Opérateur spécial (steadicamer)", + filiere: "C", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("1 180,27 €"), + semaine39h: parseEuro("1 348,88 €"), + jour7h: parseEuro("262,28 €"), + jour8h: parseEuro("299,75 €"), + mois35h: parseEuro("4 485,04 €"), + mois39h: parseEuro("5 125,75 €"), + }, + cdi: parseEuro("2 651,44 €"), + }, + { + nom: "Photographe de plateau", + filiere: "C", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("810,81 €"), + semaine39h: parseEuro("926,64 €"), + jour7h: parseEuro("180,18 €"), + jour8h: parseEuro("205,92 €"), + mois35h: parseEuro("3 081,06 €"), + mois39h: parseEuro("3 521,20 €"), + }, + cdi: parseEuro("2 229,61 €"), + }, + { + nom: "Pupitreur lumière", + filiere: "C", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("932,11 €"), + semaine39h: parseEuro("1 065,27 €"), + jour7h: parseEuro("207,14 €"), + jour8h: parseEuro("236,73 €"), + mois35h: parseEuro("3 542,03 €"), + mois39h: parseEuro("4 048,02 €"), + }, + cdi: parseEuro("2 481,29 €"), + }, + { + nom: "Superviseur d'effets spéciaux image", + filiere: "C", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("1 051,06 €"), + semaine39h: parseEuro("1 201,21 €"), + jour7h: parseEuro("233,57 €"), + jour8h: parseEuro("266,94 €"), + mois35h: parseEuro("3 994,02 €"), + mois39h: parseEuro("4 564,58 €"), + }, + cdi: parseEuro("2 530,92 €"), + }, + { + nom: "Technicien vidéo", + filiere: "C", + niveau: "IV", + cddu: { + semaine35h: parseEuro("822,58 €"), + semaine39h: parseEuro("940,09 €"), + jour7h: parseEuro("182,80 €"), + jour8h: parseEuro("208,91 €"), + mois35h: parseEuro("3 125,81 €"), + mois39h: parseEuro("3 572,35 €"), + }, + cdi: parseEuro("2 109,10 €"), + }, +]; + +const filieres = [ + { code: 'A', nom: 'Contenu du programme et collaboration artistique', icon: Pencil, color: 'violet' }, + { code: 'B', nom: 'Costumes, décor', icon: Palette, color: 'blue' }, + { code: 'C', nom: 'Image', icon: Camera, color: 'cyan' }, +]; + +const colorClasses = { + violet: { + bg: 'bg-violet-50', + border: 'border-violet-200', + text: 'text-violet-900', + hover: 'hover:bg-violet-100', + gradient: 'from-violet-500 to-purple-600', + ring: 'ring-violet-500', + }, + blue: { + bg: 'bg-blue-50', + border: 'border-blue-200', + text: 'text-blue-900', + hover: 'hover:bg-blue-100', + gradient: 'from-blue-500 to-indigo-600', + ring: 'ring-blue-500', + }, + cyan: { + bg: 'bg-cyan-50', + border: 'border-cyan-200', + text: 'text-cyan-900', + hover: 'hover:bg-cyan-100', + gradient: 'from-cyan-500 to-blue-600', + ring: 'ring-cyan-500', + }, +}; + +interface EmploiCardProps { + emploi: Emploi; + color: keyof typeof colorClasses; +} + +function EmploiCard({ emploi, color }: EmploiCardProps) { + const [isExpanded, setIsExpanded] = useState(false); + const [activeTab, setActiveTab] = useState<'cddu' | 'cdi'>('cdi'); + const colors = colorClasses[color]; + + return ( +
+ {/* Header */} + + + {/* Content */} + {isExpanded && ( +
+ {/* Tabs */} +
+ + +
+ + {/* Content based on tab */} + {activeTab === 'cdi' ? ( +
+

Salaire mensuel minimum

+

{euro(emploi.cdi)}

+
+ ) : ( +
+ {/* Par semaine */} +
+

Par semaine

+
+
+

Base 35h

+

{euro(emploi.cddu.semaine35h)}

+
+
+

Base 39h

+

{euro(emploi.cddu.semaine39h)}

+
+
+
+ + {/* Par jour */} +
+

Par jour

+
+
+

Base 7h

+

{euro(emploi.cddu.jour7h)}

+
+
+

Base 8h

+

{euro(emploi.cddu.jour8h)}

+
+
+
+ + {/* Par mois */} +
+

Par mois

+
+
+

Base 35h

+

{euro(emploi.cddu.mois35h)}

+
+
+

Base 39h

+

{euro(emploi.cddu.mois39h)}

+
+
+
+
+ )} +
+ )} +
+ ); +} + +interface CategorieBFictionContentProps { + activeFiliere: string; +} + +export default function CategorieBFictionContent({ activeFiliere }: CategorieBFictionContentProps) { + const [searchTerm, setSearchTerm] = useState(''); + + const filteredEmplois = useMemo(() => { + // D'abord filtrer par la filière active + let result = emploisData.filter(e => e.filiere === activeFiliere); + + // Puis appliquer le filtre de recherche + if (searchTerm) { + result = result.filter(e => + e.nom.toLowerCase().includes(searchTerm.toLowerCase()) + ); + } + + return result.sort((a, b) => a.nom.localeCompare(b.nom)); + }, [activeFiliere, searchTerm]); + + // Obtenir les infos de la filière active + const activeFiliereInfo = filieres.find(f => f.code === activeFiliere); + const colorForActive = (activeFiliereInfo?.color as keyof typeof colorClasses) || 'violet'; + + return ( +
+ {/* En-tête */} +
+

+ Filière {activeFiliere} - {activeFiliereInfo?.nom || 'Filière'} +

+

+ {filteredEmplois.length} emploi{filteredEmplois.length > 1 ? 's' : ''} - Grille de salaires CCNPA (IDCC 2642) - Valeurs 2025 +

+
+ + {/* Recherche */} +
+ {/* Barre de recherche */} +
+ + setSearchTerm(e.target.value)} + placeholder={`Rechercher dans ${activeFiliereInfo?.nom || 'la filière'}...`} + className="w-full pl-10 pr-4 py-2.5 rounded-lg border border-slate-200 focus:ring-2 focus:ring-cyan-500 focus:border-transparent text-sm" + /> +
+ + {/* Résultats */} +
+
+

+ {filteredEmplois.length} emploi{filteredEmplois.length > 1 ? 's' : ''} trouvé{filteredEmplois.length > 1 ? 's' : ''} +

+ {searchTerm && ( + + )} +
+ +
+ {filteredEmplois.map((emploi, index) => ( + + ))} +
+ + {filteredEmplois.length === 0 && ( +
+

Aucun emploi trouvé pour cette recherche.

+
+ )} +
+
+
+ ); +} diff --git a/app/(app)/minima-ccn/ccnpa/categorie-b-fiction.tsx b/app/(app)/minima-ccn/ccnpa/categorie-b-fiction.tsx new file mode 100644 index 0000000..394b95c --- /dev/null +++ b/app/(app)/minima-ccn/ccnpa/categorie-b-fiction.tsx @@ -0,0 +1,90 @@ +"use client"; + +import React, { useState } from 'react'; +import CategorieBFictionDataPart1 from './categorie-b-fiction-data'; +import CategorieBFictionDataPart2 from './categorie-b-fiction-data-part2'; +import CategorieBFictionDataPart3 from './categorie-b-fiction-data-part3'; + +type Filiere = 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I'; + +const filieres: { code: Filiere; nom: string; part: 1 | 2 | 3 }[] = [ + { code: 'A', nom: 'Contenu du programme et collaboration artistique', part: 1 }, + { code: 'B', nom: 'Costumes, décor', part: 1 }, + { code: 'C', nom: 'Image', part: 1 }, + { code: 'D', nom: 'Plateaux et tournage', part: 2 }, + { code: 'E', nom: 'Postproduction', part: 2 }, + { code: 'F', nom: 'Production', part: 2 }, + { code: 'G', nom: 'Réalisation', part: 3 }, + { code: 'H', nom: 'Son', part: 3 }, + { code: 'I', nom: 'Web', part: 3 }, +]; + +export default function CategorieBFiction() { + const [activeFiliere, setActiveFiliere] = useState('A'); + const [hoveredFiliere, setHoveredFiliere] = useState(null); + + return ( +
+ {/* En-tête de la catégorie */} +
+

+ Catégorie B - Fiction +

+

+ Grille des salaires par filière - Production audiovisuelle fiction +

+ {/* Ligne d'information globale supprimée pour alléger l'en-tête */} +
+ + {/* Sélection des filières */} +
+

+ Sélectionnez une filière pour explorer les emplois : +

+ +
+ {filieres.map((filiere) => ( +
+ + + {/* Tooltip */} + {hoveredFiliere === filiere.code && ( +
+ {filiere.nom} +
+
+
+
+ )} +
+ ))} +
+ + {/* Contenu */} +
+ {filieres.find(f => f.code === activeFiliere)?.part === 1 && } + {filieres.find(f => f.code === activeFiliere)?.part === 2 && } + {filieres.find(f => f.code === activeFiliere)?.part === 3 && } +
+
+
+ ); +} diff --git a/app/(app)/minima-ccn/ccnpa/categorie-b-flux-data-part2.tsx b/app/(app)/minima-ccn/ccnpa/categorie-b-flux-data-part2.tsx new file mode 100644 index 0000000..eefef80 --- /dev/null +++ b/app/(app)/minima-ccn/ccnpa/categorie-b-flux-data-part2.tsx @@ -0,0 +1,828 @@ +"use client"; + +import React, { useState, useMemo } from 'react'; +import { Sparkles, Film, ClipboardList, Search, ChevronDown, ChevronUp } from 'lucide-react'; + +const parseEuro = (str: string) => { + if (!str || str === '-') return null; + const cleaned = str.replace(/\s/g, '').replace('€', '').replace(',', '.'); + return parseFloat(cleaned); +}; + +const euro = (n: number | null) => { + if (n === null) return '-'; + return new Intl.NumberFormat('fr-FR', { + minimumFractionDigits: 2, + maximumFractionDigits: 2 + }).format(n) + ' €'; +}; + +interface Emploi { + nom: string; + filiere: string; + niveau: string; + cddu: { + semaine35h: number | null; + semaine39h: number | null; + jour7h: number | null; + jour8h: number | null; + mois35h: number | null; + mois39h: number | null; + }; + cdi: number | null; +} + +const emploisData: Emploi[] = [ + // Filière D - Maquillage & Coiffure + { + nom: "Blocker / Rigger", + filiere: "D", + niveau: "IV", + cddu: { + semaine35h: parseEuro("861,07 €"), + semaine39h: parseEuro("984,08 €"), + jour7h: parseEuro("191,35 €"), + jour8h: parseEuro("218,68 €"), + mois35h: parseEuro("3 272,07 €"), + mois39h: parseEuro("3 739,49 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Chef électricien", + filiere: "D", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("975,19 €"), + semaine39h: parseEuro("1 114,51 €"), + jour7h: parseEuro("216,71 €"), + jour8h: parseEuro("247,67 €"), + mois35h: parseEuro("3 705,74 €"), + mois39h: parseEuro("4 235,12 €"), + }, + cdi: parseEuro("2 289,87 €"), + }, + { + nom: "Chef machiniste", + filiere: "D", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("975,19 €"), + semaine39h: parseEuro("1 114,51 €"), + jour7h: parseEuro("216,71 €"), + jour8h: parseEuro("247,67 €"), + mois35h: parseEuro("3 705,74 €"), + mois39h: parseEuro("4 235,12 €"), + }, + cdi: parseEuro("2 289,87 €"), + }, + { + nom: "Chef maquilleur", + filiere: "D", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("871,49 €"), + semaine39h: parseEuro("995,99 €"), + jour7h: parseEuro("193,66 €"), + jour8h: parseEuro("221,33 €"), + mois35h: parseEuro("3 311,66 €"), + mois39h: parseEuro("3 784,74 €"), + }, + cdi: parseEuro("2 410,40 €"), + }, + { + nom: "Coiffeur", + filiere: "D", + niveau: "V", + cddu: { + semaine35h: parseEuro("703,86 €"), + semaine39h: parseEuro("804,41 €"), + jour7h: parseEuro("156,41 €"), + jour8h: parseEuro("178,76 €"), + mois35h: parseEuro("2 674,68 €"), + mois39h: parseEuro("3 056,77 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Coiffeur perruquier", + filiere: "D", + niveau: "IV", + cddu: { + semaine35h: parseEuro("880,12 €"), + semaine39h: parseEuro("1 005,85 €"), + jour7h: parseEuro("195,58 €"), + jour8h: parseEuro("223,52 €"), + mois35h: parseEuro("3 344,44 €"), + mois39h: parseEuro("3 822,21 €"), + }, + cdi: parseEuro("1 988,58 €"), + }, + { + nom: "Électricien / Éclairagiste", + filiere: "D", + niveau: "V", + cddu: { + semaine35h: parseEuro("800,11 €"), + semaine39h: parseEuro("914,41 €"), + jour7h: parseEuro("177,80 €"), + jour8h: parseEuro("203,20 €"), + mois35h: parseEuro("3 040,40 €"), + mois39h: parseEuro("3 474,73 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Machiniste", + filiere: "D", + niveau: "V", + cddu: { + semaine35h: parseEuro("800,11 €"), + semaine39h: parseEuro("914,41 €"), + jour7h: parseEuro("177,80 €"), + jour8h: parseEuro("203,20 €"), + mois35h: parseEuro("3 040,40 €"), + mois39h: parseEuro("3 474,73 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Maquilleur", + filiere: "D", + niveau: "V", + cddu: { + semaine35h: parseEuro("703,86 €"), + semaine39h: parseEuro("804,41 €"), + jour7h: parseEuro("156,41 €"), + jour8h: parseEuro("178,76 €"), + mois35h: parseEuro("2 674,68 €"), + mois39h: parseEuro("3 056,77 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Maquilleur et coiffeur effets spéciaux", + filiere: "D", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("1 056,37 €"), + semaine39h: parseEuro("1 207,28 €"), + jour7h: parseEuro("234,75 €"), + jour8h: parseEuro("268,28 €"), + mois35h: parseEuro("4 014,21 €"), + mois39h: parseEuro("4 587,65 €"), + }, + cdi: parseEuro("2 169,36 €"), + }, + + // Filière E - Post-production + { + nom: "Assistant de post-production", + filiere: "E", + niveau: "IV", + cddu: { + semaine35h: parseEuro("616,88 €"), + semaine39h: parseEuro("705,01 €"), + jour7h: parseEuro("137,09 €"), + jour8h: parseEuro("156,67 €"), + mois35h: parseEuro("2 344,16 €"), + mois39h: parseEuro("2 679,03 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Assistant monteur", + filiere: "E", + niveau: "IV", + cddu: { + semaine35h: parseEuro("703,86 €"), + semaine39h: parseEuro("804,41 €"), + jour7h: parseEuro("156,41 €"), + jour8h: parseEuro("178,76 €"), + mois35h: parseEuro("2 674,68 €"), + mois39h: parseEuro("3 056,77 €"), + }, + cdi: parseEuro("1 928,32 €"), + }, + { + nom: "Assistant monteur adjoint", + filiere: "E", + niveau: "VI", + cddu: { + semaine35h: parseEuro("456,50 €"), + semaine39h: parseEuro("521,72 €"), + jour7h: parseEuro("101,45 €"), + jour8h: parseEuro("115,94 €"), + mois35h: parseEuro("2 342,34 €"), + mois39h: parseEuro("2 676,95 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Chargé de post-production", + filiere: "E", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("1 035,68 €"), + semaine39h: parseEuro("1 183,63 €"), + jour7h: parseEuro("230,15 €"), + jour8h: parseEuro("263,03 €"), + mois35h: parseEuro("3 935,57 €"), + mois39h: parseEuro("4 497,78 €"), + }, + cdi: parseEuro("2 651,44 €"), + }, + { + nom: "Chef monteur", + filiere: "E", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("1 110,85 €"), + semaine39h: parseEuro("1 269,54 €"), + jour7h: parseEuro("246,86 €"), + jour8h: parseEuro("282,12 €"), + mois35h: parseEuro("4 221,22 €"), + mois39h: parseEuro("4 824,24 €"), + }, + cdi: parseEuro("2 651,44 €"), + }, + { + nom: "Directeur de post-production", + filiere: "E", + niveau: "II", + cddu: { + semaine35h: parseEuro("1 245,64 €"), + semaine39h: parseEuro("1 423,59 €"), + jour7h: parseEuro("276,81 €"), + jour8h: parseEuro("316,35 €"), + mois35h: parseEuro("4 733,44 €"), + mois39h: parseEuro("5 409,64 €"), + }, + cdi: parseEuro("2 892,47 €"), + }, + { + nom: "Étalonneur", + filiere: "E", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("950,84 €"), + semaine39h: parseEuro("1 086,68 €"), + jour7h: parseEuro("211,30 €"), + jour8h: parseEuro("241,48 €"), + mois35h: parseEuro("3 613,20 €"), + mois39h: parseEuro("4 129,36 €"), + }, + cdi: parseEuro("2 169,36 €"), + }, + { + nom: "Infographiste", + filiere: "E", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("1 035,68 €"), + semaine39h: parseEuro("1 183,63 €"), + jour7h: parseEuro("230,15 €"), + jour8h: parseEuro("263,03 €"), + mois35h: parseEuro("3 935,57 €"), + mois39h: parseEuro("4 497,78 €"), + }, + cdi: parseEuro("2 530,92 €"), + }, + { + nom: "Mixeur", + filiere: "E", + niveau: "II", + cddu: { + semaine35h: parseEuro("1 328,48 €"), + semaine39h: parseEuro("1 518,26 €"), + jour7h: parseEuro("295,22 €"), + jour8h: parseEuro("337,39 €"), + mois35h: parseEuro("5 048,21 €"), + mois39h: parseEuro("5 769,37 €"), + }, + cdi: parseEuro("2 892,47 €"), + }, + { + nom: "Superviseur d'effets spéciaux postproduction", + filiere: "E", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("1 162,83 €"), + semaine39h: parseEuro("1 328,95 €"), + jour7h: parseEuro("258,41 €"), + jour8h: parseEuro("295,32 €"), + mois35h: parseEuro("4 418,76 €"), + mois39h: parseEuro("5 050,00 €"), + }, + cdi: parseEuro("2 651,44 €"), + }, + { + nom: "Truquiste", + filiere: "E", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("965,63 €"), + semaine39h: parseEuro("1 103,58 €"), + jour7h: parseEuro("214,59 €"), + jour8h: parseEuro("245,24 €"), + mois35h: parseEuro("3 669,41 €"), + mois39h: parseEuro("4 193,60 €"), + }, + cdi: parseEuro("2 530,92 €"), + }, + + // Filière F - Production + { + nom: "Administrateur de production", + filiere: "F", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("864,60 €"), + semaine39h: parseEuro("988,11 €"), + jour7h: parseEuro("192,13 €"), + jour8h: parseEuro("219,58 €"), + mois35h: parseEuro("3 285,48 €"), + mois39h: parseEuro("3 754,83 €"), + }, + cdi: parseEuro("2 591,18 €"), + }, + { + nom: "Aide de plateau", + filiere: "F", + niveau: "VI", + cddu: { + semaine35h: parseEuro("475,42 €"), + semaine39h: parseEuro("543,34 €"), + jour7h: parseEuro("105,65 €"), + jour8h: parseEuro("120,74 €"), + mois35h: parseEuro("2 342,34 €"), + mois39h: parseEuro("2 676,95 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Assistant d'émission", + filiere: "F", + niveau: "VI", + cddu: { + semaine35h: parseEuro("456,50 €"), + semaine39h: parseEuro("521,72 €"), + jour7h: parseEuro("101,45 €"), + jour8h: parseEuro("115,94 €"), + mois35h: parseEuro("2 342,34 €"), + mois39h: parseEuro("2 676,95 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Assistant de production", + filiere: "F", + niveau: "IV", + cddu: { + semaine35h: parseEuro("703,86 €"), + semaine39h: parseEuro("804,41 €"), + jour7h: parseEuro("156,41 €"), + jour8h: parseEuro("178,76 €"), + mois35h: parseEuro("2 674,68 €"), + mois39h: parseEuro("3 056,77 €"), + }, + cdi: parseEuro("1 988,58 €"), + }, + { + nom: "Assistant de production adjoint", + filiere: "F", + niveau: "VI", + cddu: { + semaine35h: parseEuro("456,50 €"), + semaine39h: parseEuro("521,72 €"), + jour7h: parseEuro("101,45 €"), + jour8h: parseEuro("115,94 €"), + mois35h: parseEuro("2 342,34 €"), + mois39h: parseEuro("2 676,95 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Assistant régisseur adjoint", + filiere: "F", + niveau: "VI", + cddu: { + semaine35h: parseEuro("456,50 €"), + semaine39h: parseEuro("521,72 €"), + jour7h: parseEuro("101,45 €"), + jour8h: parseEuro("115,94 €"), + mois35h: parseEuro("2 342,34 €"), + mois39h: parseEuro("2 676,95 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Chargé de production", + filiere: "F", + niveau: "II", + cddu: { + semaine35h: parseEuro("948,41 €"), + semaine39h: parseEuro("1 083,90 €"), + jour7h: parseEuro("210,76 €"), + jour8h: parseEuro("240,87 €"), + mois35h: parseEuro("3 603,95 €"), + mois39h: parseEuro("4 118,79 €"), + }, + cdi: parseEuro("2 892,47 €"), + }, + { + nom: "Chauffeur", + filiere: "F", + niveau: "VI", + cddu: { + semaine35h: parseEuro("475,42 €"), + semaine39h: parseEuro("543,34 €"), + jour7h: parseEuro("105,65 €"), + jour8h: parseEuro("120,74 €"), + mois35h: parseEuro("2 342,34 €"), + mois39h: parseEuro("2 676,95 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Chauffeur de salle", + filiere: "F", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("880,12 €"), + semaine39h: parseEuro("1 005,85 €"), + jour7h: parseEuro("195,58 €"), + jour8h: parseEuro("223,52 €"), + mois35h: parseEuro("3 344,44 €"), + mois39h: parseEuro("3 822,21 €"), + }, + cdi: parseEuro("2 169,36 €"), + }, + { + nom: "Coordinateur d'émission", + filiere: "F", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("735,16 €"), + semaine39h: parseEuro("840,18 €"), + jour7h: parseEuro("163,37 €"), + jour8h: parseEuro("186,71 €"), + mois35h: parseEuro("2 793,61 €"), + mois39h: parseEuro("3 192,68 €"), + }, + cdi: parseEuro("2 147,87 €"), + }, + { + nom: "Directeur de production", + filiere: "F", + niveau: "I", + cddu: { + semaine35h: parseEuro("1 509,58 €"), + semaine39h: parseEuro("1 725,23 €"), + jour7h: parseEuro("335,46 €"), + jour8h: parseEuro("383,39 €"), + mois35h: parseEuro("5 736,40 €"), + mois39h: parseEuro("6 555,86 €"), + }, + cdi: parseEuro("3 314,29 €"), + }, + { + nom: "Producteur exécutif", + filiere: "F", + niveau: "HN", + cddu: { + semaine35h: null, + semaine39h: null, + jour7h: null, + jour8h: null, + mois35h: null, + mois39h: null, + }, + cdi: null, + }, + { + nom: "Régisseur / Responsable des repérages", + filiere: "F", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("818,65 €"), + semaine39h: parseEuro("935,61 €"), + jour7h: parseEuro("181,92 €"), + jour8h: parseEuro("207,91 €"), + mois35h: parseEuro("3 110,89 €"), + mois39h: parseEuro("3 555,29 €"), + }, + cdi: parseEuro("2 169,36 €"), + }, + { + nom: "Régisseur adjoint", + filiere: "F", + niveau: "IV", + cddu: { + semaine35h: parseEuro("703,86 €"), + semaine39h: parseEuro("804,41 €"), + jour7h: parseEuro("156,41 €"), + jour8h: parseEuro("178,76 €"), + mois35h: parseEuro("2 674,68 €"), + mois39h: parseEuro("3 056,77 €"), + }, + cdi: parseEuro("1 988,58 €"), + }, + { + nom: "Régisseur de plateau / Chef de plateau", + filiere: "F", + niveau: "IV", + cddu: { + semaine35h: parseEuro("703,86 €"), + semaine39h: parseEuro("804,41 €"), + jour7h: parseEuro("156,41 €"), + jour8h: parseEuro("178,76 €"), + mois35h: parseEuro("2 674,68 €"), + mois39h: parseEuro("3 056,77 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Régisseur général", + filiere: "F", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("948,41 €"), + semaine39h: parseEuro("1 083,90 €"), + jour7h: parseEuro("210,76 €"), + jour8h: parseEuro("240,87 €"), + mois35h: parseEuro("3 603,95 €"), + mois39h: parseEuro("4 118,79 €"), + }, + cdi: parseEuro("2 651,44 €"), + }, + { + nom: "Responsable des enfants", + filiere: "F", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("735,16 €"), + semaine39h: parseEuro("840,18 €"), + jour7h: parseEuro("163,37 €"), + jour8h: parseEuro("186,71 €"), + mois35h: parseEuro("2 793,61 €"), + mois39h: parseEuro("3 192,68 €"), + }, + cdi: parseEuro("2 048,84 €"), + }, + { + nom: "Secrétaire de production", + filiere: "F", + niveau: "V", + cddu: { + semaine35h: parseEuro("616,88 €"), + semaine39h: parseEuro("705,01 €"), + jour7h: parseEuro("137,09 €"), + jour8h: parseEuro("156,67 €"), + mois35h: parseEuro("2 344,16 €"), + mois39h: parseEuro("2 679,03 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, +]; + +const filieres = [ + { code: 'D', nom: 'Plateaux et tournage', icon: Sparkles, color: 'pink' }, + { code: 'E', nom: 'Postproduction', icon: Film, color: 'indigo' }, + { code: 'F', nom: 'Production', icon: ClipboardList, color: 'green' }, +]; + +const colorClasses = { + pink: { + bg: 'bg-pink-50', + border: 'border-pink-200', + text: 'text-pink-900', + hover: 'hover:bg-pink-100', + gradient: 'from-pink-500 to-rose-600', + ring: 'ring-pink-500', + }, + indigo: { + bg: 'bg-indigo-50', + border: 'border-indigo-200', + text: 'text-indigo-900', + hover: 'hover:bg-indigo-100', + gradient: 'from-indigo-500 to-purple-600', + ring: 'ring-indigo-500', + }, + green: { + bg: 'bg-green-50', + border: 'border-green-200', + text: 'text-green-900', + hover: 'hover:bg-green-100', + gradient: 'from-green-500 to-emerald-600', + ring: 'ring-green-500', + }, +}; + +interface EmploiCardProps { + emploi: Emploi; + color: keyof typeof colorClasses; +} + +function EmploiCard({ emploi, color }: EmploiCardProps) { + const [isExpanded, setIsExpanded] = useState(false); + const [activeTab, setActiveTab] = useState<'cddu' | 'cdi'>('cdi'); + const colors = colorClasses[color]; + + return ( +
+ {/* Header */} + + + {/* Content */} + {isExpanded && ( +
+ {/* Tabs */} +
+ + +
+ + {/* Content based on tab */} + {activeTab === 'cdi' ? ( +
+

Salaire mensuel minimum

+

{euro(emploi.cdi)}

+
+ ) : ( +
+ {/* Par semaine */} +
+

Par semaine

+
+
+

Base 35h

+

{euro(emploi.cddu.semaine35h)}

+
+
+

Base 39h

+

{euro(emploi.cddu.semaine39h)}

+
+
+
+ + {/* Par jour */} +
+

Par jour

+
+
+

Base 7h

+

{euro(emploi.cddu.jour7h)}

+
+
+

Base 8h

+

{euro(emploi.cddu.jour8h)}

+
+
+
+ + {/* Par mois */} +
+

Par mois

+
+
+

Base 35h

+

{euro(emploi.cddu.mois35h)}

+
+
+

Base 39h

+

{euro(emploi.cddu.mois39h)}

+
+
+
+
+ )} +
+ )} +
+ ); +} + +interface CategorieBFluxDataPart2Props { + activeFiliere: string; +} + +export default function CategorieBFluxDataPart2({ activeFiliere }: CategorieBFluxDataPart2Props) { + const [searchTerm, setSearchTerm] = useState(''); + + const filteredEmplois = useMemo(() => { + // D'abord filtrer par la filière active + let result = emploisData.filter(e => e.filiere === activeFiliere); + + // Puis appliquer le filtre de recherche + if (searchTerm) { + result = result.filter(e => + e.nom.toLowerCase().includes(searchTerm.toLowerCase()) + ); + } + + return result.sort((a, b) => a.nom.localeCompare(b.nom)); + }, [activeFiliere, searchTerm]); + + // Déterminer la couleur en fonction de la filière + const getColorForFiliere = (filiereCode: string): keyof typeof colorClasses => { + const filiere = filieres.find(f => f.code === filiereCode); + return (filiere?.color as keyof typeof colorClasses) || 'blue'; + }; + const activeFiliereInfo = filieres.find(f => f.code === activeFiliere); + + return ( +
+ {/* En-tête */} +
+

+ Filière {activeFiliere} - {activeFiliereInfo?.nom || 'Filière'} +

+

+ {emploisData.length} emplois - Grille de salaires CCNPA (IDCC 2642) - Valeurs 2025 +

+
+ + {/* Recherche */} +
+ {/* Barre de recherche */} +
+ + setSearchTerm(e.target.value)} + placeholder={`Rechercher dans ${activeFiliereInfo?.nom || 'la filière'}...`} + className="w-full pl-10 pr-4 py-2.5 rounded-lg border border-slate-200 focus:ring-2 focus:ring-amber-500 focus:border-transparent text-sm" + /> +
+ + {/* Résultats */} +
+
+

+ {filteredEmplois.length} emploi{filteredEmplois.length > 1 ? 's' : ''} trouvé{filteredEmplois.length > 1 ? 's' : ''} +

+ {searchTerm && ( + + )} +
+ +
+ {filteredEmplois.map((emploi, index) => ( + + ))} +
+ + {filteredEmplois.length === 0 && ( +
+

Aucun emploi trouvé pour cette recherche.

+
+ )} +
+
+
+ ); +} diff --git a/app/(app)/minima-ccn/ccnpa/categorie-b-flux-data-part3.tsx b/app/(app)/minima-ccn/ccnpa/categorie-b-flux-data-part3.tsx new file mode 100644 index 0000000..dd0ed95 --- /dev/null +++ b/app/(app)/minima-ccn/ccnpa/categorie-b-flux-data-part3.tsx @@ -0,0 +1,632 @@ +"use client"; + +import React, { useState, useMemo } from 'react'; +import { Clapperboard, Volume2, Globe, Search, ChevronDown, ChevronUp } from 'lucide-react'; + +const parseEuro = (str: string) => { + if (!str || str === '-') return null; + const cleaned = str.replace(/\s/g, '').replace('€', '').replace(',', '.'); + return parseFloat(cleaned); +}; + +const euro = (n: number | null) => { + if (n === null) return '-'; + return new Intl.NumberFormat('fr-FR', { + minimumFractionDigits: 2, + maximumFractionDigits: 2 + }).format(n) + ' €'; +}; + +interface Emploi { + nom: string; + filiere: string; + niveau: string; + cddu: { + semaine35h: number | null; + semaine39h: number | null; + jour7h: number | null; + jour8h: number | null; + mois35h: number | null; + mois39h: number | null; + }; + cdi: number | null; +} + +const emploisData: Emploi[] = [ + // Filière G - Réalisation + { + nom: "1er assistant réalisateur", + filiere: "G", + niveau: "II", + cddu: { + semaine35h: parseEuro("948,41 €"), + semaine39h: parseEuro("1 083,90 €"), + jour7h: parseEuro("210,76 €"), + jour8h: parseEuro("240,87 €"), + mois35h: parseEuro("3 603,95 €"), + mois39h: parseEuro("4 118,79 €"), + }, + cdi: parseEuro("2 892,47 €"), + }, + { + nom: "2ème assistant réalisateur", + filiere: "G", + niveau: "IV", + cddu: { + semaine35h: parseEuro("793,15 €"), + semaine39h: parseEuro("906,46 €"), + jour7h: parseEuro("176,26 €"), + jour8h: parseEuro("201,43 €"), + mois35h: parseEuro("3 013,97 €"), + mois39h: parseEuro("3 444,52 €"), + }, + cdi: parseEuro("1 988,58 €"), + }, + { + nom: "Assistant réalisateur", + filiere: "G", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("881,28 €"), + semaine39h: parseEuro("1 007,18 €"), + jour7h: parseEuro("195,84 €"), + jour8h: parseEuro("223,82 €"), + mois35h: parseEuro("3 348,87 €"), + mois39h: parseEuro("3 827,27 €"), + }, + cdi: parseEuro("2 229,61 €"), + }, + { + nom: "Conseiller technique à la réalisation", + filiere: "G", + niveau: "II", + cddu: { + semaine35h: parseEuro("1 035,68 €"), + semaine39h: parseEuro("1 183,63 €"), + jour7h: parseEuro("230,15 €"), + jour8h: parseEuro("263,03 €"), + mois35h: parseEuro("3 935,57 €"), + mois39h: parseEuro("4 497,78 €"), + }, + cdi: parseEuro("3 013,00 €"), + }, + { + nom: "Réalisateur", + filiere: "G", + niveau: "HN", + cddu: { + semaine35h: null, + semaine39h: null, + jour7h: null, + jour8h: null, + mois35h: null, + mois39h: null, + }, + cdi: null, + }, + { + nom: "Scripte", + filiere: "G", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("948,41 €"), + semaine39h: parseEuro("1 083,90 €"), + jour7h: parseEuro("210,76 €"), + jour8h: parseEuro("240,87 €"), + mois35h: parseEuro("3 603,95 €"), + mois39h: parseEuro("4 118,79 €"), + }, + cdi: parseEuro("2 651,44 €"), + }, + { + nom: "Storyboarder", + filiere: "G", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("881,28 €"), + semaine39h: parseEuro("1 007,18 €"), + jour7h: parseEuro("195,84 €"), + jour8h: parseEuro("223,82 €"), + mois35h: parseEuro("3 348,87 €"), + mois39h: parseEuro("3 827,27 €"), + }, + cdi: parseEuro("2 169,36 €"), + }, + + // Filière H - Son + { + nom: "Assistant son", + filiere: "H", + niveau: "IV", + cddu: { + semaine35h: parseEuro("703,86 €"), + semaine39h: parseEuro("804,41 €"), + jour7h: parseEuro("156,41 €"), + jour8h: parseEuro("178,76 €"), + mois35h: parseEuro("2 674,68 €"), + mois39h: parseEuro("3 056,77 €"), + }, + cdi: parseEuro("1 928,32 €"), + }, + { + nom: "Assistant son adjoint", + filiere: "H", + niveau: "VI", + cddu: { + semaine35h: parseEuro("456,50 €"), + semaine39h: parseEuro("521,72 €"), + jour7h: parseEuro("101,45 €"), + jour8h: parseEuro("115,94 €"), + mois35h: parseEuro("2 342,34 €"), + mois39h: parseEuro("2 676,95 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Bruiteur", + filiere: "H", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("1 035,68 €"), + semaine39h: parseEuro("1 183,63 €"), + jour7h: parseEuro("230,15 €"), + jour8h: parseEuro("263,03 €"), + mois35h: parseEuro("3 935,57 €"), + mois39h: parseEuro("4 497,78 €"), + }, + cdi: parseEuro("2 530,92 €"), + }, + { + nom: "Chef OPS / Ingénieur du son", + filiere: "H", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("1 194,86 €"), + semaine39h: parseEuro("1 365,55 €"), + jour7h: parseEuro("265,52 €"), + jour8h: parseEuro("303,46 €"), + mois35h: parseEuro("4 540,45 €"), + mois39h: parseEuro("5 189,07 €"), + }, + cdi: parseEuro("2 651,44 €"), + }, + { + nom: "Mixeur (direct ou conditions du direct)", + filiere: "H", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("1 035,68 €"), + semaine39h: parseEuro("1 183,63 €"), + jour7h: parseEuro("230,15 €"), + jour8h: parseEuro("263,03 €"), + mois35h: parseEuro("3 935,57 €"), + mois39h: parseEuro("4 497,78 €"), + }, + cdi: parseEuro("2 530,92 €"), + }, + { + nom: "OPS", + filiere: "H", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("881,28 €"), + semaine39h: parseEuro("1 007,18 €"), + jour7h: parseEuro("195,84 €"), + jour8h: parseEuro("223,82 €"), + mois35h: parseEuro("3 348,87 €"), + mois39h: parseEuro("3 827,27 €"), + }, + cdi: parseEuro("2 169,36 €"), + }, + { + nom: "Perchiste / 1er assistant son", + filiere: "H", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("869,19 €"), + semaine39h: parseEuro("993,36 €"), + jour7h: parseEuro("193,15 €"), + jour8h: parseEuro("220,75 €"), + mois35h: parseEuro("3 302,93 €"), + mois39h: parseEuro("3 774,77 €"), + }, + cdi: parseEuro("2 410,40 €"), + }, + { + nom: "Technicien instruments (backliner)", + filiere: "H", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("881,28 €"), + semaine39h: parseEuro("1 007,18 €"), + jour7h: parseEuro("195,84 €"), + jour8h: parseEuro("223,82 €"), + mois35h: parseEuro("3 348,87 €"), + mois39h: parseEuro("3 827,27 €"), + }, + cdi: parseEuro("2 386,53 €"), + }, + + // Filière I - Web + { + nom: "Assistant technique web", + filiere: "I", + niveau: "VI", + cddu: { + semaine35h: parseEuro("456,50 €"), + semaine39h: parseEuro("521,72 €"), + jour7h: parseEuro("101,45 €"), + jour8h: parseEuro("115,94 €"), + mois35h: parseEuro("1 976,67 €"), + mois39h: parseEuro("2 259,04 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Concepteur de programme web", + filiere: "I", + niveau: "I", + cddu: { + semaine35h: parseEuro("774,28 €"), + semaine39h: parseEuro("884,89 €"), + jour7h: parseEuro("172,06 €"), + jour8h: parseEuro("196,64 €"), + mois35h: parseEuro("3 352,63 €"), + mois39h: parseEuro("3 831,57 €"), + }, + cdi: parseEuro("2 969,12 €"), + }, + { + nom: "Coordinateur de diffusion web", + filiere: "I", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("512,31 €"), + semaine39h: parseEuro("585,49 €"), + jour7h: parseEuro("113,85 €"), + jour8h: parseEuro("130,11 €"), + mois35h: parseEuro("2 218,29 €"), + mois39h: parseEuro("2 535,18 €"), + }, + cdi: parseEuro("1 959,62 €"), + }, + { + nom: "Coordinateur de production web", + filiere: "I", + niveau: "II", + cddu: { + semaine35h: parseEuro("582,17 €"), + semaine39h: parseEuro("665,34 €"), + jour7h: parseEuro("129,37 €"), + jour8h: parseEuro("147,85 €"), + mois35h: parseEuro("2 520,81 €"), + mois39h: parseEuro("2 880,91 €"), + }, + cdi: parseEuro("2 197,15 €"), + }, + { + nom: "Designer web", + filiere: "I", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("535,60 €"), + semaine39h: parseEuro("612,11 €"), + jour7h: parseEuro("119,02 €"), + jour8h: parseEuro("136,03 €"), + mois35h: parseEuro("2 319,14 €"), + mois39h: parseEuro("2 650,44 €"), + }, + cdi: parseEuro("2 019,01 €"), + }, + { + nom: "Editeur artistique web", + filiere: "I", + niveau: "IV", + cddu: { + semaine35h: parseEuro("494,84 €"), + semaine39h: parseEuro("565,53 €"), + jour7h: parseEuro("109,96 €"), + jour8h: parseEuro("125,67 €"), + mois35h: parseEuro("2 142,66 €"), + mois39h: parseEuro("2 448,75 €"), + }, + cdi: parseEuro("1 900,24 €"), + }, + { + nom: "Gestionnaire de diffusion internet (traffic manager)", + filiere: "I", + niveau: "V", + cddu: { + semaine35h: parseEuro("456,50 €"), + semaine39h: parseEuro("521,72 €"), + jour7h: parseEuro("101,45 €"), + jour8h: parseEuro("115,94 €"), + mois35h: parseEuro("1 976,67 €"), + mois39h: parseEuro("2 259,04 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Opérateur web / Opérateur multicam web", + filiere: "I", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("558,88 €"), + semaine39h: parseEuro("638,72 €"), + jour7h: parseEuro("124,20 €"), + jour8h: parseEuro("141,94 €"), + mois35h: parseEuro("2 419,95 €"), + mois39h: parseEuro("2 765,65 €"), + }, + cdi: parseEuro("2 137,77 €"), + }, + { + nom: "Technicien de développement web", + filiere: "I", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("512,31 €"), + semaine39h: parseEuro("585,49 €"), + jour7h: parseEuro("113,85 €"), + jour8h: parseEuro("130,11 €"), + mois35h: parseEuro("2 218,29 €"), + mois39h: parseEuro("2 535,18 €"), + }, + cdi: parseEuro("1 959,62 €"), + }, + { + nom: "Technicien vidéo web", + filiere: "I", + niveau: "V", + cddu: { + semaine35h: parseEuro("456,50 €"), + semaine39h: parseEuro("521,72 €"), + jour7h: parseEuro("101,45 €"), + jour8h: parseEuro("115,94 €"), + mois35h: parseEuro("1 976,67 €"), + mois39h: parseEuro("2 259,04 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, +]; + +const filieres = [ + { code: 'G', nom: 'Réalisation', icon: Clapperboard, color: 'orange' }, + { code: 'H', nom: 'Son', icon: Volume2, color: 'red' }, + { code: 'I', nom: 'Web', icon: Globe, color: 'teal' }, +]; + +const colorClasses = { + orange: { + bg: 'bg-orange-50', + border: 'border-orange-200', + text: 'text-orange-900', + hover: 'hover:bg-orange-100', + gradient: 'from-orange-500 to-amber-600', + ring: 'ring-orange-500', + }, + red: { + bg: 'bg-red-50', + border: 'border-red-200', + text: 'text-red-900', + hover: 'hover:bg-red-100', + gradient: 'from-red-500 to-rose-600', + ring: 'ring-red-500', + }, + teal: { + bg: 'bg-teal-50', + border: 'border-teal-200', + text: 'text-teal-900', + hover: 'hover:bg-teal-100', + gradient: 'from-teal-500 to-cyan-600', + ring: 'ring-teal-500', + }, +}; + +interface EmploiCardProps { + emploi: Emploi; + color: keyof typeof colorClasses; +} + +function EmploiCard({ emploi, color }: EmploiCardProps) { + const [isExpanded, setIsExpanded] = useState(false); + const [activeTab, setActiveTab] = useState<'cddu' | 'cdi'>('cdi'); + const colors = colorClasses[color]; + + return ( +
+ {/* Header */} + + + {/* Content */} + {isExpanded && ( +
+ {/* Tabs */} +
+ + +
+ + {/* Content based on tab */} + {activeTab === 'cdi' ? ( +
+

Salaire mensuel minimum

+

{euro(emploi.cdi)}

+
+ ) : ( +
+ {/* Par semaine */} +
+

Par semaine

+
+
+

Base 35h

+

{euro(emploi.cddu.semaine35h)}

+
+
+

Base 39h

+

{euro(emploi.cddu.semaine39h)}

+
+
+
+ + {/* Par jour */} +
+

Par jour

+
+
+

Base 7h

+

{euro(emploi.cddu.jour7h)}

+
+
+

Base 8h

+

{euro(emploi.cddu.jour8h)}

+
+
+
+ + {/* Par mois */} +
+

Par mois

+
+
+

Base 35h

+

{euro(emploi.cddu.mois35h)}

+
+
+

Base 39h

+

{euro(emploi.cddu.mois39h)}

+
+
+
+
+ )} +
+ )} +
+ ); +} + +interface CategorieBFluxDataPart3Props { + activeFiliere: string; +} + +export default function CategorieBFluxDataPart3({ activeFiliere }: CategorieBFluxDataPart3Props) { + const [searchTerm, setSearchTerm] = useState(''); + + const filteredEmplois = useMemo(() => { + // D'abord filtrer par la filière active + let result = emploisData.filter(e => e.filiere === activeFiliere); + + // Puis appliquer le filtre de recherche + if (searchTerm) { + result = result.filter(e => + e.nom.toLowerCase().includes(searchTerm.toLowerCase()) + ); + } + + return result.sort((a, b) => a.nom.localeCompare(b.nom)); + }, [activeFiliere, searchTerm]); + + // Déterminer la couleur en fonction de la filière + const getColorForFiliere = (filiereCode: string): keyof typeof colorClasses => { + const filiere = filieres.find(f => f.code === filiereCode); + return (filiere?.color as keyof typeof colorClasses) || 'blue'; + }; + const activeFiliereInfo = filieres.find(f => f.code === activeFiliere); + + return ( +
+ {/* En-tête */} +
+

+ Filière {activeFiliere} - {activeFiliereInfo?.nom || 'Filière'} +

+

+ {emploisData.length} emplois - Grille de salaires CCNPA (IDCC 2642) - Valeurs 2025 +

+
+ + {/* Recherche */} +
+ {/* Barre de recherche */} +
+ + setSearchTerm(e.target.value)} + placeholder={`Rechercher dans ${activeFiliereInfo?.nom || 'la filière'}...`} + className="w-full pl-10 pr-4 py-2.5 rounded-lg border border-slate-200 focus:ring-2 focus:ring-amber-500 focus:border-transparent text-sm" + /> +
+ + {/* Résultats */} +
+
+

+ {filteredEmplois.length} emploi{filteredEmplois.length > 1 ? 's' : ''} trouvé{filteredEmplois.length > 1 ? 's' : ''} +

+ {searchTerm && ( + + )} +
+ +
+ {filteredEmplois.map((emploi, index) => ( + + ))} +
+ + {filteredEmplois.length === 0 && ( +
+

Aucun emploi trouvé pour cette recherche.

+
+ )} +
+
+
+ ); +} diff --git a/app/(app)/minima-ccn/ccnpa/categorie-b-flux-data.tsx b/app/(app)/minima-ccn/ccnpa/categorie-b-flux-data.tsx new file mode 100644 index 0000000..a20056f --- /dev/null +++ b/app/(app)/minima-ccn/ccnpa/categorie-b-flux-data.tsx @@ -0,0 +1,1094 @@ +"use client"; + +import React, { useState, useMemo } from 'react'; +import { Pencil, Palette, Camera, Search, ChevronDown, ChevronUp } from 'lucide-react'; + +const parseEuro = (str: string) => { + if (!str || str === '-') return null; + const cleaned = str.replace(/\s/g, '').replace('€', '').replace(',', '.'); + return parseFloat(cleaned); +}; + +const euro = (n: number | null) => { + if (n === null) return '-'; + return new Intl.NumberFormat('fr-FR', { + minimumFractionDigits: 2, + maximumFractionDigits: 2 + }).format(n) + ' €'; +}; + +interface Emploi { + nom: string; + filiere: string; + niveau: string; + cddu: { + semaine35h: number | null; + semaine39h: number | null; + jour7h: number | null; + jour8h: number | null; + mois35h: number | null; + mois39h: number | null; + }; + cdi: number | null; +} + +const emploisData: Emploi[] = [ + // Filière A - Écriture + { + nom: "Chargé d'enquête / de recherche", + filiere: "A", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("791,32 €"), + semaine39h: parseEuro("904,37 €"), + jour7h: parseEuro("175,85 €"), + jour8h: parseEuro("200,97 €"), + mois35h: parseEuro("3 007,02 €"), + mois39h: parseEuro("3 436,58 €"), + }, + cdi: parseEuro("2 530,92 €"), + }, + { + nom: "Chargé de sélection", + filiere: "A", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("810,63 €"), + semaine39h: parseEuro("926,43 €"), + jour7h: parseEuro("180,14 €"), + jour8h: parseEuro("205,87 €"), + mois35h: parseEuro("3 080,39 €"), + mois39h: parseEuro("3 520,43 €"), + }, + cdi: parseEuro("2 590,58 €"), + }, + { + nom: "Collaborateur artistique", + filiere: "A", + niveau: "IV", + cddu: { + semaine35h: parseEuro("526,45 €"), + semaine39h: parseEuro("601,66 €"), + jour7h: parseEuro("116,99 €"), + jour8h: parseEuro("133,70 €"), + mois35h: parseEuro("2 342,34 €"), + mois39h: parseEuro("2 676,95 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Collaborateur de sélection", + filiere: "A", + niveau: "IV", + cddu: { + semaine35h: parseEuro("634,28 €"), + semaine39h: parseEuro("724,89 €"), + jour7h: parseEuro("140,95 €"), + jour8h: parseEuro("161,09 €"), + mois35h: parseEuro("2 410,26 €"), + mois39h: parseEuro("2 754,58 €"), + }, + cdi: parseEuro("2 048,84 €"), + }, + { + nom: "Conseiller artistique d'émission", + filiere: "A", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("795,79 €"), + semaine39h: parseEuro("909,47 €"), + jour7h: parseEuro("176,84 €"), + jour8h: parseEuro("202,11 €"), + mois35h: parseEuro("3 024,00 €"), + mois39h: parseEuro("3 455,99 €"), + }, + cdi: parseEuro("2 590,58 €"), + }, + { + nom: "Coordinateur d'écriture (ex script éditeur)", + filiere: "A", + niveau: "II", + cddu: { + semaine35h: parseEuro("864,60 €"), + semaine39h: parseEuro("988,11 €"), + jour7h: parseEuro("192,13 €"), + jour8h: parseEuro("219,58 €"), + mois35h: parseEuro("3 285,48 €"), + mois39h: parseEuro("3 754,83 €"), + }, + cdi: parseEuro("3 013,00 €"), + }, + { + nom: "Directeur artistique", + filiere: "A", + niveau: "II", + cddu: { + semaine35h: parseEuro("1 110,85 €"), + semaine39h: parseEuro("1 269,54 €"), + jour7h: parseEuro("246,86 €"), + jour8h: parseEuro("282,12 €"), + mois35h: parseEuro("4 221,22 €"), + mois39h: parseEuro("4 824,24 €"), + }, + cdi: parseEuro("2 952,74 €"), + }, + { + nom: "Directeur de jeux", + filiere: "A", + niveau: "I", + cddu: { + semaine35h: parseEuro("1 110,85 €"), + semaine39h: parseEuro("1 269,54 €"), + jour7h: parseEuro("246,86 €"), + jour8h: parseEuro("282,12 €"), + mois35h: parseEuro("4 221,22 €"), + mois39h: parseEuro("4 824,24 €"), + }, + cdi: parseEuro("2 952,14 €"), + }, + { + nom: "Directeur de programmation", + filiere: "A", + niveau: "II", + cddu: { + semaine35h: parseEuro("1 110,85 €"), + semaine39h: parseEuro("1 269,54 €"), + jour7h: parseEuro("246,86 €"), + jour8h: parseEuro("282,12 €"), + mois35h: parseEuro("4 221,22 €"), + mois39h: parseEuro("4 824,24 €"), + }, + cdi: parseEuro("2 952,74 €"), + }, + { + nom: "Directeur de sélection", + filiere: "A", + niveau: "I", + cddu: { + semaine35h: parseEuro("1 110,85 €"), + semaine39h: parseEuro("1 269,54 €"), + jour7h: parseEuro("246,86 €"), + jour8h: parseEuro("282,12 €"), + mois35h: parseEuro("4 221,22 €"), + mois39h: parseEuro("4 824,24 €"), + }, + cdi: parseEuro("2 892,47 €"), + }, + { + nom: "Documentaliste", + filiere: "A", + niveau: "II", + cddu: { + semaine35h: parseEuro("826,70 €"), + semaine39h: parseEuro("944,80 €"), + jour7h: parseEuro("183,71 €"), + jour8h: parseEuro("209,96 €"), + mois35h: parseEuro("3 141,46 €"), + mois39h: parseEuro("3 590,23 €"), + }, + cdi: parseEuro("2 892,47 €"), + }, + { + nom: "Enquêteur / Recherchiste", + filiere: "A", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("757,20 €"), + semaine39h: parseEuro("865,38 €"), + jour7h: parseEuro("168,27 €"), + jour8h: parseEuro("192,31 €"), + mois35h: parseEuro("2 877,37 €"), + mois39h: parseEuro("3 288,42 €"), + }, + cdi: parseEuro("2 169,36 €"), + }, + { + nom: "Illustrateur sonore", + filiere: "A", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("777,33 €"), + semaine39h: parseEuro("888,38 €"), + jour7h: parseEuro("172,74 €"), + jour8h: parseEuro("197,42 €"), + mois35h: parseEuro("2 953,86 €"), + mois39h: parseEuro("3 375,83 €"), + }, + cdi: parseEuro("2 410,40 €"), + }, + { + nom: "Préparateur de questions", + filiere: "A", + niveau: "IV", + cddu: { + semaine35h: parseEuro("634,28 €"), + semaine39h: parseEuro("724,89 €"), + jour7h: parseEuro("140,95 €"), + jour8h: parseEuro("161,09 €"), + mois35h: parseEuro("2 410,26 €"), + mois39h: parseEuro("2 754,58 €"), + }, + cdi: parseEuro("2 147,87 €"), + }, + { + nom: "Producteur artistique", + filiere: "A", + niveau: "II", + cddu: { + semaine35h: parseEuro("1 110,85 €"), + semaine39h: parseEuro("1 269,54 €"), + jour7h: parseEuro("246,86 €"), + jour8h: parseEuro("282,12 €"), + mois35h: parseEuro("4 221,22 €"), + mois39h: parseEuro("4 824,24 €"), + }, + cdi: parseEuro("2 952,74 €"), + }, + { + nom: "Programmateur artistique d'émission", + filiere: "A", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("735,16 €"), + semaine39h: parseEuro("840,18 €"), + jour7h: parseEuro("163,37 €"), + jour8h: parseEuro("186,71 €"), + mois35h: parseEuro("2 793,61 €"), + mois39h: parseEuro("3 192,68 €"), + }, + cdi: parseEuro("2 048,84 €"), + }, + { + nom: "Responsable d'enquête / de recherche", + filiere: "A", + niveau: "II", + cddu: { + semaine35h: parseEuro("826,70 €"), + semaine39h: parseEuro("944,80 €"), + jour7h: parseEuro("183,71 €"), + jour8h: parseEuro("209,96 €"), + mois35h: parseEuro("3 141,46 €"), + mois39h: parseEuro("3 590,23 €"), + }, + cdi: parseEuro("2 892,47 €"), + }, + { + nom: "Responsable de questions", + filiere: "A", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("777,33 €"), + semaine39h: parseEuro("888,38 €"), + jour7h: parseEuro("172,74 €"), + jour8h: parseEuro("197,42 €"), + mois35h: parseEuro("2 953,86 €"), + mois39h: parseEuro("3 375,83 €"), + }, + cdi: parseEuro("2 651,44 €"), + }, + + // Filière B - Décor & Costume + { + nom: "1er assistant décorateur", + filiere: "B", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("948,41 €"), + semaine39h: parseEuro("1 083,90 €"), + jour7h: parseEuro("210,76 €"), + jour8h: parseEuro("240,87 €"), + mois35h: parseEuro("3 603,95 €"), + mois39h: parseEuro("4 118,79 €"), + }, + cdi: parseEuro("2 530,92 €"), + }, + { + nom: "2ème assistant décorateur", + filiere: "B", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("826,78 €"), + semaine39h: parseEuro("944,89 €"), + jour7h: parseEuro("183,73 €"), + jour8h: parseEuro("209,97 €"), + mois35h: parseEuro("3 141,75 €"), + mois39h: parseEuro("3 590,56 €"), + }, + cdi: parseEuro("2 109,10 €"), + }, + { + nom: "Accessoiriste", + filiere: "B", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("798,94 €"), + semaine39h: parseEuro("913,07 €"), + jour7h: parseEuro("177,54 €"), + jour8h: parseEuro("202,91 €"), + mois35h: parseEuro("3 035,97 €"), + mois39h: parseEuro("3 469,67 €"), + }, + cdi: parseEuro("2 048,84 €"), + }, + { + nom: "Assistant décorateur adjoint", + filiere: "B", + niveau: "VI", + cddu: { + semaine35h: parseEuro("456,50 €"), + semaine39h: parseEuro("521,72 €"), + jour7h: parseEuro("101,45 €"), + jour8h: parseEuro("115,94 €"), + mois35h: parseEuro("2 342,34 €"), + mois39h: parseEuro("2 676,95 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Chef constructeur", + filiere: "B", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("1 203,69 €"), + semaine39h: parseEuro("1 375,64 €"), + jour7h: parseEuro("267,49 €"), + jour8h: parseEuro("305,70 €"), + mois35h: parseEuro("4 574,02 €"), + mois39h: parseEuro("5 227,43 €"), + }, + cdi: parseEuro("2 651,44 €"), + }, + { + nom: "Chef costumier", + filiere: "B", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("881,28 €"), + semaine39h: parseEuro("1 007,18 €"), + jour7h: parseEuro("195,84 €"), + jour8h: parseEuro("223,82 €"), + mois35h: parseEuro("3 348,87 €"), + mois39h: parseEuro("3 827,27 €"), + }, + cdi: parseEuro("2 169,36 €"), + }, + { + nom: "Chef décorateur", + filiere: "B", + niveau: "II", + cddu: { + semaine35h: parseEuro("1 639,88 €"), + semaine39h: parseEuro("1 874,15 €"), + jour7h: parseEuro("364,42 €"), + jour8h: parseEuro("416,48 €"), + mois35h: parseEuro("6 231,55 €"), + mois39h: parseEuro("7 121,75 €"), + }, + cdi: parseEuro("3 013,00 €"), + }, + { + nom: "Constructeur de décor", + filiere: "B", + niveau: "IV", + cddu: { + semaine35h: parseEuro("918,47 €"), + semaine39h: parseEuro("1 049,68 €"), + jour7h: parseEuro("204,10 €"), + jour8h: parseEuro("233,26 €"), + mois35h: parseEuro("3 490,19 €"), + mois39h: parseEuro("3 988,78 €"), + }, + cdi: parseEuro("2 481,29 €"), + }, + { + nom: "Costumier", + filiere: "B", + niveau: "IV", + cddu: { + semaine35h: parseEuro("703,86 €"), + semaine39h: parseEuro("804,41 €"), + jour7h: parseEuro("156,41 €"), + jour8h: parseEuro("178,76 €"), + mois35h: parseEuro("2 674,68 €"), + mois39h: parseEuro("3 056,77 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Créateur de costume", + filiere: "B", + niveau: "II", + cddu: { + semaine35h: parseEuro("1 616,70 €"), + semaine39h: parseEuro("1 847,66 €"), + jour7h: parseEuro("359,27 €"), + jour8h: parseEuro("410,59 €"), + mois35h: parseEuro("6 143,47 €"), + mois39h: parseEuro("7 021,08 €"), + }, + cdi: parseEuro("3 013,00 €"), + }, + { + nom: "Décorateur", + filiere: "B", + niveau: "II", + cddu: { + semaine35h: parseEuro("1 054,04 €"), + semaine39h: parseEuro("1 204,62 €"), + jour7h: parseEuro("234,23 €"), + jour8h: parseEuro("267,69 €"), + mois35h: parseEuro("4 005,37 €"), + mois39h: parseEuro("4 577,55 €"), + }, + cdi: parseEuro("2 892,47 €"), + }, + { + nom: "Électricien déco / Machiniste déco", + filiere: "B", + niveau: "V", + cddu: { + semaine35h: parseEuro("906,79 €"), + semaine39h: parseEuro("1 036,33 €"), + jour7h: parseEuro("201,51 €"), + jour8h: parseEuro("230,30 €"), + mois35h: parseEuro("3 445,79 €"), + mois39h: parseEuro("3 938,04 €"), + }, + cdi: parseEuro("2 169,36 €"), + }, + { + nom: "Ensemblier - décorateur", + filiere: "B", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("948,41 €"), + semaine39h: parseEuro("1 083,90 €"), + jour7h: parseEuro("210,76 €"), + jour8h: parseEuro("240,87 €"), + mois35h: parseEuro("3 603,95 €"), + mois39h: parseEuro("4 118,79 €"), + }, + cdi: parseEuro("2 530,92 €"), + }, + { + nom: "Habilleur", + filiere: "B", + niveau: "V", + cddu: { + semaine35h: parseEuro("634,28 €"), + semaine39h: parseEuro("724,89 €"), + jour7h: parseEuro("140,95 €"), + jour8h: parseEuro("161,09 €"), + mois35h: parseEuro("2 410,26 €"), + mois39h: parseEuro("2 754,58 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Menuisier-traceur-toupilleur de décor", + filiere: "B", + niveau: "V", + cddu: { + semaine35h: parseEuro("935,78 €"), + semaine39h: parseEuro("1 069,46 €"), + jour7h: parseEuro("207,95 €"), + jour8h: parseEuro("237,66 €"), + mois35h: parseEuro("3 555,95 €"), + mois39h: parseEuro("4 063,93 €"), + }, + cdi: parseEuro("2 410,40 €"), + }, + { + nom: "Métallier / Serrurier / Mécanicien de décor", + filiere: "B", + niveau: "V", + cddu: { + semaine35h: parseEuro("906,79 €"), + semaine39h: parseEuro("1 036,33 €"), + jour7h: parseEuro("201,51 €"), + jour8h: parseEuro("230,30 €"), + mois35h: parseEuro("3 445,79 €"), + mois39h: parseEuro("3 938,04 €"), + }, + cdi: parseEuro("2 169,36 €"), + }, + { + nom: "Peintre en lettres / en faux bois de décor", + filiere: "B", + niveau: "V", + cddu: { + semaine35h: parseEuro("906,79 €"), + semaine39h: parseEuro("1 036,33 €"), + jour7h: parseEuro("201,51 €"), + jour8h: parseEuro("230,30 €"), + mois35h: parseEuro("3 445,79 €"), + mois39h: parseEuro("3 938,04 €"), + }, + cdi: parseEuro("2 169,36 €"), + }, + { + nom: "Régisseur d'extérieurs", + filiere: "B", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("826,78 €"), + semaine39h: parseEuro("944,89 €"), + jour7h: parseEuro("183,73 €"), + jour8h: parseEuro("209,97 €"), + mois35h: parseEuro("3 141,75 €"), + mois39h: parseEuro("3 590,56 €"), + }, + cdi: parseEuro("2 109,10 €"), + }, + { + nom: "Rippeur", + filiere: "B", + niveau: "V", + cddu: { + semaine35h: parseEuro("810,55 €"), + semaine39h: parseEuro("926,34 €"), + jour7h: parseEuro("180,12 €"), + jour8h: parseEuro("205,85 €"), + mois35h: parseEuro("3 080,07 €"), + mois39h: parseEuro("3 520,07 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Styliste", + filiere: "B", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("793,15 €"), + semaine39h: parseEuro("906,46 €"), + jour7h: parseEuro("176,26 €"), + jour8h: parseEuro("201,43 €"), + mois35h: parseEuro("3 013,97 €"), + mois39h: parseEuro("3 444,52 €"), + }, + cdi: parseEuro("2 048,84 €"), + }, + + // Filière C - Image + { + nom: "1er assistant OPV / pointeur", + filiere: "C", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("954,15 €"), + semaine39h: parseEuro("1 090,46 €"), + jour7h: parseEuro("212,03 €"), + jour8h: parseEuro("242,32 €"), + mois35h: parseEuro("3 625,78 €"), + mois39h: parseEuro("4 143,74 €"), + }, + cdi: parseEuro("2 651,44 €"), + }, + { + nom: "2ème assistant OPV", + filiere: "C", + niveau: "V", + cddu: { + semaine35h: parseEuro("703,86 €"), + semaine39h: parseEuro("804,41 €"), + jour7h: parseEuro("156,41 €"), + jour8h: parseEuro("178,76 €"), + mois35h: parseEuro("2 674,68 €"), + mois39h: parseEuro("3 056,77 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Assistant OPV adjoint", + filiere: "C", + niveau: "VI", + cddu: { + semaine35h: parseEuro("456,50 €"), + semaine39h: parseEuro("521,72 €"), + jour7h: parseEuro("101,45 €"), + jour8h: parseEuro("115,94 €"), + mois35h: parseEuro("2 342,34 €"), + mois39h: parseEuro("2 676,95 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Cadreur / OPV", + filiere: "C", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("1 108,57 €"), + semaine39h: parseEuro("1 266,94 €"), + jour7h: parseEuro("246,35 €"), + jour8h: parseEuro("281,54 €"), + mois35h: parseEuro("4 212,58 €"), + mois39h: parseEuro("4 814,37 €"), + }, + cdi: parseEuro("2 651,44 €"), + }, + { + nom: "Chef OPV", + filiere: "C", + niveau: "II", + cddu: { + semaine35h: parseEuro("1 245,64 €"), + semaine39h: parseEuro("1 423,59 €"), + jour7h: parseEuro("276,81 €"), + jour8h: parseEuro("316,35 €"), + mois35h: parseEuro("4 733,44 €"), + mois39h: parseEuro("5 409,64 €"), + }, + cdi: parseEuro("3 013,00 €"), + }, + { + nom: "Directeur photo", + filiere: "C", + niveau: "I", + cddu: { + semaine35h: parseEuro("1 735,96 €"), + semaine39h: parseEuro("1 983,96 €"), + jour7h: parseEuro("385,77 €"), + jour8h: parseEuro("440,88 €"), + mois35h: parseEuro("6 596,66 €"), + mois39h: parseEuro("7 539,02 €"), + }, + cdi: parseEuro("3 314,29 €"), + }, + { + nom: "Ingénieur de la vision", + filiere: "C", + niveau: "II", + cddu: { + semaine35h: parseEuro("1 245,64 €"), + semaine39h: parseEuro("1 423,59 €"), + jour7h: parseEuro("276,81 €"), + jour8h: parseEuro("316,35 €"), + mois35h: parseEuro("4 733,44 €"), + mois39h: parseEuro("5 409,64 €"), + }, + cdi: parseEuro("3 013,00 €"), + }, + { + nom: "Ingénieur de la vision adjoint", + filiere: "C", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("881,28 €"), + semaine39h: parseEuro("1 007,18 €"), + jour7h: parseEuro("195,84 €"), + jour8h: parseEuro("223,82 €"), + mois35h: parseEuro("3 348,87 €"), + mois39h: parseEuro("3 827,27 €"), + }, + cdi: parseEuro("2 169,36 €"), + }, + { + nom: "Monteur", + filiere: "C", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("927,66 €"), + semaine39h: parseEuro("1 060,18 €"), + jour7h: parseEuro("206,15 €"), + jour8h: parseEuro("235,60 €"), + mois35h: parseEuro("3 525,09 €"), + mois39h: parseEuro("4 028,66 €"), + }, + cdi: parseEuro("2 289,87 €"), + }, + { + nom: "Opérateur de transfert et de traitement numérique", + filiere: "C", + niveau: "V", + cddu: { + semaine35h: parseEuro("703,86 €"), + semaine39h: parseEuro("804,41 €"), + jour7h: parseEuro("156,41 €"), + jour8h: parseEuro("178,76 €"), + mois35h: parseEuro("2 674,68 €"), + mois39h: parseEuro("3 056,78 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Opérateur magnéto / Opérateur magnéto ralenti", + filiere: "C", + niveau: "V", + cddu: { + semaine35h: parseEuro("669,07 €"), + semaine39h: parseEuro("764,65 €"), + jour7h: parseEuro("148,68 €"), + jour8h: parseEuro("169,92 €"), + mois35h: parseEuro("2 542,47 €"), + mois39h: parseEuro("2 905,67 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Opérateur régie-vidéo", + filiere: "C", + niveau: "V", + cddu: { + semaine35h: parseEuro("669,07 €"), + semaine39h: parseEuro("764,65 €"), + jour7h: parseEuro("148,68 €"), + jour8h: parseEuro("169,92 €"), + mois35h: parseEuro("2 542,47 €"), + mois39h: parseEuro("2 905,67 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Opérateur spécial (steadicamer)", + filiere: "C", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("1 162,83 €"), + semaine39h: parseEuro("1 328,95 €"), + jour7h: parseEuro("258,41 €"), + jour8h: parseEuro("295,32 €"), + mois35h: parseEuro("4 418,76 €"), + mois39h: parseEuro("5 050,00 €"), + }, + cdi: parseEuro("2 651,44 €"), + }, + { + nom: "Opérateur synthétiseur", + filiere: "C", + niveau: "V", + cddu: { + semaine35h: parseEuro("669,07 €"), + semaine39h: parseEuro("764,65 €"), + jour7h: parseEuro("148,68 €"), + jour8h: parseEuro("169,92 €"), + mois35h: parseEuro("2 542,47 €"), + mois39h: parseEuro("2 905,67 €"), + }, + cdi: parseEuro("1 828,83 €"), + }, + { + nom: "Photographe de plateau", + filiere: "C", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("798,94 €"), + semaine39h: parseEuro("913,07 €"), + jour7h: parseEuro("177,54 €"), + jour8h: parseEuro("202,91 €"), + mois35h: parseEuro("3 035,97 €"), + mois39h: parseEuro("3 469,67 €"), + }, + cdi: parseEuro("2 229,61 €"), + }, + { + nom: "Pupitreur lumière", + filiere: "C", + niveau: "IIIB", + cddu: { + semaine35h: parseEuro("918,47 €"), + semaine39h: parseEuro("1 049,68 €"), + jour7h: parseEuro("204,10 €"), + jour8h: parseEuro("233,26 €"), + mois35h: parseEuro("3 490,19 €"), + mois39h: parseEuro("3 988,78 €"), + }, + cdi: parseEuro("2 481,29 €"), + }, + { + nom: "Superviseur d'effets spéciaux image", + filiere: "C", + niveau: "IIIA", + cddu: { + semaine35h: parseEuro("1 035,68 €"), + semaine39h: parseEuro("1 183,63 €"), + jour7h: parseEuro("230,15 €"), + jour8h: parseEuro("263,03 €"), + mois35h: parseEuro("3 935,57 €"), + mois39h: parseEuro("4 497,78 €"), + }, + cdi: parseEuro("2 530,92 €"), + }, + { + nom: "Technicien truquiste", + filiere: "C", + niveau: "IV", + cddu: { + semaine35h: parseEuro("810,55 €"), + semaine39h: parseEuro("926,34 €"), + jour7h: parseEuro("180,12 €"), + jour8h: parseEuro("205,85 €"), + mois35h: parseEuro("3 080,07 €"), + mois39h: parseEuro("3 520,07 €"), + }, + cdi: parseEuro("2 109,10 €"), + }, + { + nom: "Technicien vidéo", + filiere: "C", + niveau: "IV", + cddu: { + semaine35h: parseEuro("810,55 €"), + semaine39h: parseEuro("926,34 €"), + jour7h: parseEuro("180,12 €"), + jour8h: parseEuro("205,85 €"), + mois35h: parseEuro("3 080,07 €"), + mois39h: parseEuro("3 520,07 €"), + }, + cdi: parseEuro("2 109,10 €"), + }, + { + nom: "Assistant lumière", + filiere: "C", + niveau: "IV", + cddu: { + semaine35h: parseEuro("753,73 €"), + semaine39h: parseEuro("861,41 €"), + jour7h: parseEuro("167,50 €"), + jour8h: parseEuro("191,42 €"), + mois35h: parseEuro("2 864,18 €"), + mois39h: parseEuro("3 273,34 €"), + }, + cdi: parseEuro("2 018,71 €"), + }, +]; + +const filieres = [ + { code: 'A', nom: 'Contenu du programme et collaboration artistique', icon: Pencil, color: 'violet' }, + { code: 'B', nom: 'Costumes, décor', icon: Palette, color: 'blue' }, + { code: 'C', nom: 'Image', icon: Camera, color: 'cyan' }, +]; + +const colorClasses = { + violet: { + bg: 'bg-violet-50', + border: 'border-violet-200', + text: 'text-violet-900', + hover: 'hover:bg-violet-100', + gradient: 'from-violet-500 to-purple-600', + ring: 'ring-violet-500', + }, + blue: { + bg: 'bg-blue-50', + border: 'border-blue-200', + text: 'text-blue-900', + hover: 'hover:bg-blue-100', + gradient: 'from-blue-500 to-indigo-600', + ring: 'ring-blue-500', + }, + cyan: { + bg: 'bg-cyan-50', + border: 'border-cyan-200', + text: 'text-cyan-900', + hover: 'hover:bg-cyan-100', + gradient: 'from-cyan-500 to-teal-600', + ring: 'ring-cyan-500', + }, +}; + +interface EmploiCardProps { + emploi: Emploi; + color: keyof typeof colorClasses; +} + +function EmploiCard({ emploi, color }: EmploiCardProps) { + const [isExpanded, setIsExpanded] = useState(false); + const [activeTab, setActiveTab] = useState<'cddu' | 'cdi'>('cdi'); + const colors = colorClasses[color]; + + return ( +
+ {/* Header */} + + + {/* Content */} + {isExpanded && ( +
+ {/* Tabs */} +
+ + +
+ + {/* Content based on tab */} + {activeTab === 'cdi' ? ( +
+

Salaire mensuel minimum

+

{euro(emploi.cdi)}

+
+ ) : ( +
+ {/* Par semaine */} +
+

Par semaine

+
+
+

Base 35h

+

{euro(emploi.cddu.semaine35h)}

+
+
+

Base 39h

+

{euro(emploi.cddu.semaine39h)}

+
+
+
+ + {/* Par jour */} +
+

Par jour

+
+
+

Base 7h

+

{euro(emploi.cddu.jour7h)}

+
+
+

Base 8h

+

{euro(emploi.cddu.jour8h)}

+
+
+
+ + {/* Par mois */} +
+

Par mois

+
+
+

Base 35h

+

{euro(emploi.cddu.mois35h)}

+
+
+

Base 39h

+

{euro(emploi.cddu.mois39h)}

+
+
+
+
+ )} +
+ )} +
+ ); +} + +interface CategorieBFluxDataPart1Props { + activeFiliere: string; +} + +export default function CategorieBFluxDataPart1({ activeFiliere }: CategorieBFluxDataPart1Props) { + const [searchTerm, setSearchTerm] = useState(''); + + const filteredEmplois = useMemo(() => { + // D'abord filtrer par la filière active + let result = emploisData.filter(e => e.filiere === activeFiliere); + + // Puis appliquer le filtre de recherche + if (searchTerm) { + result = result.filter(e => + e.nom.toLowerCase().includes(searchTerm.toLowerCase()) + ); + } + + return result.sort((a, b) => a.nom.localeCompare(b.nom)); + }, [activeFiliere, searchTerm]); + + // Déterminer la couleur en fonction de la filière + const getColorForFiliere = (filiereCode: string): keyof typeof colorClasses => { + const filiere = filieres.find(f => f.code === filiereCode); + return (filiere?.color as keyof typeof colorClasses) || 'blue'; + }; + const activeFiliereInfo = filieres.find(f => f.code === activeFiliere); + + return ( +
+ {/* En-tête */} +
+

+ Filière {activeFiliere} - {activeFiliereInfo?.nom || 'Filière'} +

+

+ {emploisData.length} emplois - Grille de salaires CCNPA (IDCC 2642) - Valeurs 2025 +

+
+ + {/* Recherche */} +
+ {/* Barre de recherche */} +
+ + setSearchTerm(e.target.value)} + placeholder={`Rechercher dans ${activeFiliereInfo?.nom || 'la filière'}...`} + className="w-full pl-10 pr-4 py-2.5 rounded-lg border border-slate-200 focus:ring-2 focus:ring-amber-500 focus:border-transparent text-sm" + /> +
+ + {/* Résultats */} +
+
+

+ {filteredEmplois.length} emploi{filteredEmplois.length > 1 ? 's' : ''} trouvé{filteredEmplois.length > 1 ? 's' : ''} +

+ {searchTerm && ( + + )} +
+ +
+ {filteredEmplois.map((emploi, index) => ( + + ))} +
+ + {filteredEmplois.length === 0 && ( +
+

Aucun emploi trouvé pour cette recherche.

+
+ )} +
+
+
+ ); +} diff --git a/app/(app)/minima-ccn/ccnpa/categorie-b-flux.tsx b/app/(app)/minima-ccn/ccnpa/categorie-b-flux.tsx new file mode 100644 index 0000000..dc74aa1 --- /dev/null +++ b/app/(app)/minima-ccn/ccnpa/categorie-b-flux.tsx @@ -0,0 +1,92 @@ +"use client"; + +import React, { useState } from 'react'; +import CategorieBFluxDataPart1 from './categorie-b-flux-data'; +import CategorieBFluxDataPart2 from './categorie-b-flux-data-part2'; +import CategorieBFluxDataPart3 from './categorie-b-flux-data-part3'; + +type Filiere = 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I'; + +const filieres: { code: Filiere; nom: string; part: 1 | 2 | 3 }[] = [ + { code: 'A', nom: 'Contenu du programme et collaboration artistique', part: 1 }, + { code: 'B', nom: 'Costumes, décor', part: 1 }, + { code: 'C', nom: 'Image', part: 1 }, + { code: 'D', nom: 'Plateaux et tournage', part: 2 }, + { code: 'E', nom: 'Postproduction', part: 2 }, + { code: 'F', nom: 'Production', part: 2 }, + { code: 'G', nom: 'Réalisation', part: 3 }, + { code: 'H', nom: 'Son', part: 3 }, + { code: 'I', nom: 'Web', part: 3 }, +]; + +export default function CategorieBFlux() { + const [activeFiliere, setActiveFiliere] = useState('A'); + const [hoveredFiliere, setHoveredFiliere] = useState(null); + + return ( +
+ {/* En-tête de la catégorie */} +
+

+ Catégorie B - Flux +

+

+ Grille des salaires par filière - Programmes de flux (jeux, divertissement, plateaux) +

+ {/* Ligne d'information globale supprimée pour alléger l'en-tête */} +
+ + {/* Boutons de filières */} +
+

+ Sélectionnez une filière pour explorer les emplois : +

+ +
+ {filieres.map((filiere) => ( +
+ + {hoveredFiliere === filiere.code && ( +
+ {filiere.nom} +
+
+
+
+ )} +
+ ))} +
+ + {/* Contenu */} +
+ {(() => { + const activePart = filieres.find(f => f.code === activeFiliere)?.part; + if (activePart === 1) return ; + if (activePart === 2) return ; + if (activePart === 3) return ; + return null; + })()} +
+
+
+ ); +} diff --git a/app/(app)/minima-ccn/ccnpa/categorie-b-hors-data-part2.tsx b/app/(app)/minima-ccn/ccnpa/categorie-b-hors-data-part2.tsx new file mode 100644 index 0000000..93fc0ee --- /dev/null +++ b/app/(app)/minima-ccn/ccnpa/categorie-b-hors-data-part2.tsx @@ -0,0 +1,352 @@ +"use client"; + +import React, { useState, useMemo } from 'react'; +import { Sparkles, Film, ClipboardList, Search, ChevronDown, ChevronUp } from 'lucide-react'; + +// Fonction pour parser les montants en euros +function parseEuro(value: string | null): number | null { + if (!value || value === '-') return null; + const cleaned = value.replace(/\s/g, '').replace('€', '').replace(',', '.'); + const parsed = parseFloat(cleaned); + return isNaN(parsed) ? null : parsed; +} + +// Fonction pour formater en euros +function euro(value: number | null): string { + if (value === null) return '-'; + return new Intl.NumberFormat('fr-FR', { + style: 'currency', + currency: 'EUR' + }).format(value); +} + +// Interface pour un emploi +interface Emploi { + nom: string; + filiere: string; + niveau: string; + cddu: { + semaine35h: number | null; + semaine39h: number | null; + jour7h: number | null; + jour8h: number | null; + mois35h: number | null; + mois39h: number | null; + }; + cdi: number | null; +} + +// Données des emplois - Filières D, E, F +const emploisData: Emploi[] = [ + // Filière D - Maquillage & Coiffure + { nom: "Blocker / Rigger", filiere: "D", niveau: "IV", cddu: { semaine35h: 852.54, semaine39h: 974.34, jour7h: 189.45, jour8h: 216.52, mois35h: 3239.67, mois39h: 3702.47 }, cdi: 1828.83 }, + { nom: "Chef électricien", filiere: "D", niveau: "IIIB", cddu: { semaine35h: 965.54, semaine39h: 1103.47, jour7h: 214.56, jour8h: 245.22, mois35h: 3669.05, mois39h: 4193.19 }, cdi: 2289.87 }, + { nom: "Chef machiniste", filiere: "D", niveau: "IIIB", cddu: { semaine35h: 965.54, semaine39h: 1103.47, jour7h: 214.56, jour8h: 245.22, mois35h: 3669.05, mois39h: 4193.19 }, cdi: 2289.87 }, + { nom: "Chef maquilleur", filiere: "D", niveau: "IIIA", cddu: { semaine35h: 862.86, semaine39h: 986.13, jour7h: 191.75, jour8h: 219.14, mois35h: 3278.87, mois39h: 3747.27 }, cdi: 2410.40 }, + { nom: "Coiffeur", filiere: "D", niveau: "V", cddu: { semaine35h: 696.89, semaine39h: 796.45, jour7h: 154.87, jour8h: 176.99, mois35h: 2648.20, mois39h: 3026.50 }, cdi: 1828.83 }, + { nom: "Coiffeur perruquier", filiere: "D", niveau: "IV", cddu: { semaine35h: 871.40, semaine39h: 995.89, jour7h: 193.65, jour8h: 221.31, mois35h: 3311.33, mois39h: 3784.37 }, cdi: 1988.58 }, + { nom: "Conducteur de groupe", filiere: "D", niveau: "IV", cddu: { semaine35h: 859.91, semaine39h: 982.76, jour7h: 191.09, jour8h: 218.39, mois35h: 3267.67, mois39h: 3734.47 }, cdi: 1988.58 }, + { nom: "Électricien / Éclairagiste", filiere: "D", niveau: "V", cddu: { semaine35h: 792.18, semaine39h: 905.35, jour7h: 176.04, jour8h: 201.19, mois35h: 3010.30, mois39h: 3440.33 }, cdi: 1828.83 }, + { nom: "Machiniste", filiere: "D", niveau: "V", cddu: { semaine35h: 792.18, semaine39h: 905.35, jour7h: 176.04, jour8h: 201.19, mois35h: 3010.30, mois39h: 3440.33 }, cdi: 1828.83 }, + { nom: "Maquilleur", filiere: "D", niveau: "V", cddu: { semaine35h: 696.89, semaine39h: 796.45, jour7h: 154.87, jour8h: 176.99, mois35h: 2648.20, mois39h: 3026.50 }, cdi: 1828.83 }, + { nom: "Maquilleur et coiffeur effets spéciaux", filiere: "D", niveau: "IIIB", cddu: { semaine35h: 1045.91, semaine39h: 1195.33, jour7h: 232.42, jour8h: 265.63, mois35h: 3974.47, mois39h: 4542.23 }, cdi: 2169.36 }, + { nom: "Prothésiste", filiere: "D", niveau: "IIIB", cddu: { semaine35h: 1045.91, semaine39h: 1195.33, jour7h: 232.42, jour8h: 265.63, mois35h: 3974.47, mois39h: 4542.23 }, cdi: 2169.36 }, + + // Filière E - Post-production + { nom: "Assistant de post-production", filiere: "E", niveau: "IV", cddu: { semaine35h: 610.78, semaine39h: 698.03, jour7h: 135.73, jour8h: 155.12, mois35h: 2342.34, mois39h: 2676.95 }, cdi: 1828.83 }, + { nom: "Assistant monteur", filiere: "E", niveau: "IV", cddu: { semaine35h: 696.89, semaine39h: 796.45, jour7h: 154.87, jour8h: 176.99, mois35h: 2648.20, mois39h: 3026.50 }, cdi: 1928.32 }, + { nom: "Assistant monteur adjoint", filiere: "E", niveau: "VI", cddu: { semaine35h: 451.99, semaine39h: 516.55, jour7h: 100.44, jour8h: 114.79, mois35h: 2342.34, mois39h: 2676.95 }, cdi: 1828.83 }, + { nom: "Chargé de post-production", filiere: "E", niveau: "IIIA", cddu: { semaine35h: 1025.42, semaine39h: 1171.91, jour7h: 227.87, jour8h: 260.42, mois35h: 3896.61, mois39h: 4453.25 }, cdi: 2651.44 }, + { nom: "Chef monteur", filiere: "E", niveau: "IIIA", cddu: { semaine35h: 1099.85, semaine39h: 1256.97, jour7h: 244.41, jour8h: 279.33, mois35h: 4179.43, mois39h: 4776.47 }, cdi: 2651.44 }, + { nom: "Conformateur", filiere: "E", niveau: "IIIB", cddu: { semaine35h: 941.43, semaine39h: 1075.92, jour7h: 209.21, jour8h: 239.09, mois35h: 3577.43, mois39h: 4088.48 }, cdi: 2169.36 }, + { nom: "Directeur de post-production", filiere: "E", niveau: "II", cddu: { semaine35h: 1245.64, semaine39h: 1423.59, jour7h: 276.81, jour8h: 316.35, mois35h: 4733.44, mois39h: 5409.64 }, cdi: 2892.47 }, + { nom: "Étalonneur", filiere: "E", niveau: "IIIB", cddu: { semaine35h: 941.43, semaine39h: 1075.92, jour7h: 209.21, jour8h: 239.09, mois35h: 3577.43, mois39h: 4088.48 }, cdi: 2169.36 }, + { nom: "Infographiste", filiere: "E", niveau: "IIIA", cddu: { semaine35h: 1025.42, semaine39h: 1171.91, jour7h: 227.87, jour8h: 260.42, mois35h: 3896.61, mois39h: 4453.25 }, cdi: 2530.92 }, + { nom: "Mixeur", filiere: "E", niveau: "II", cddu: { semaine35h: 1328.48, semaine39h: 1518.26, jour7h: 295.22, jour8h: 337.39, mois35h: 5048.21, mois39h: 5769.37 }, cdi: 2892.47 }, + { nom: "Mixeur (direct ou conditions du direct)", filiere: "E", niveau: "IIIA", cddu: { semaine35h: 1025.42, semaine39h: 1171.91, jour7h: 227.87, jour8h: 260.42, mois35h: 3896.61, mois39h: 4453.25 }, cdi: 2530.92 }, + { nom: "Superviseur d'effets spéciaux postproduction", filiere: "E", niveau: "IIIA", cddu: { semaine35h: 1162.83, semaine39h: 1328.95, jour7h: 258.41, jour8h: 295.32, mois35h: 4418.76, mois39h: 5050.00 }, cdi: 2651.44 }, + { nom: "Truquiste", filiere: "E", niveau: "IIIA", cddu: { semaine35h: 956.07, semaine39h: 1092.65, jour7h: 212.46, jour8h: 242.81, mois35h: 3633.08, mois39h: 4152.08 }, cdi: 2530.92 }, + + // Filière F - Production + { nom: "Administrateur de production", filiere: "F", niveau: "IIIA", cddu: { semaine35h: 856.04, semaine39h: 978.33, jour7h: 190.23, jour8h: 217.41, mois35h: 3252.95, mois39h: 3717.65 }, cdi: 2591.18 }, + { nom: "Aide de plateau", filiere: "F", niveau: "VI", cddu: { semaine35h: 470.71, semaine39h: 537.96, jour7h: 104.60, jour8h: 119.55, mois35h: 2342.34, mois39h: 2676.95 }, cdi: 1828.83 }, + { nom: "Assistant d'émission", filiere: "F", niveau: "VI", cddu: { semaine35h: 451.99, semaine39h: 516.55, jour7h: 100.44, jour8h: 114.79, mois35h: 2342.34, mois39h: 2676.95 }, cdi: 1828.83 }, + { nom: "Assistant de production", filiere: "F", niveau: "IV", cddu: { semaine35h: 696.89, semaine39h: 796.45, jour7h: 154.87, jour8h: 176.99, mois35h: 2648.20, mois39h: 3026.50 }, cdi: 1988.58 }, + { nom: "Assistant de production adjoint", filiere: "F", niveau: "VI", cddu: { semaine35h: 451.99, semaine39h: 516.55, jour7h: 100.44, jour8h: 114.79, mois35h: 2342.34, mois39h: 2676.95 }, cdi: 1828.83 }, + { nom: "Assistant régisseur adjoint", filiere: "F", niveau: "VI", cddu: { semaine35h: 451.99, semaine39h: 516.55, jour7h: 100.44, jour8h: 114.79, mois35h: 2342.34, mois39h: 2676.95 }, cdi: 1828.83 }, + { nom: "Chargé de production", filiere: "F", niveau: "II", cddu: { semaine35h: 939.02, semaine39h: 1073.16, jour7h: 208.67, jour8h: 238.48, mois35h: 3568.27, mois39h: 4078.01 }, cdi: 2892.47 }, + { nom: "Chauffeur", filiere: "F", niveau: "VI", cddu: { semaine35h: 470.71, semaine39h: 537.96, jour7h: 104.60, jour8h: 119.55, mois35h: 2342.34, mois39h: 2676.95 }, cdi: 1828.83 }, + { nom: "Chauffeur de salle", filiere: "F", niveau: "IIIB", cddu: { semaine35h: 871.40, semaine39h: 995.89, jour7h: 193.65, jour8h: 221.31, mois35h: 3311.33, mois39h: 3784.37 }, cdi: 2169.36 }, + { nom: "Comptable de production", filiere: "F", niveau: "IV", cddu: { semaine35h: 732.47, semaine39h: 837.11, jour7h: 162.77, jour8h: 186.02, mois35h: 2783.39, mois39h: 3181.01 }, cdi: 2169.36 }, + { nom: "Coordinateur d'émission", filiere: "F", niveau: "IIIB", cddu: { semaine35h: 727.88, semaine39h: 831.86, jour7h: 161.75, jour8h: 184.86, mois35h: 2765.95, mois39h: 3161.07 }, cdi: 2147.87 }, + { nom: "Directeur de production", filiere: "F", niveau: "I", cddu: { semaine35h: 1509.58, semaine39h: 1725.23, jour7h: 335.46, jour8h: 383.39, mois35h: 5736.40, mois39h: 6555.86 }, cdi: 3314.29 }, + { nom: "Dresseur", filiere: "F", niveau: "II", cddu: { semaine35h: 1099.85, semaine39h: 1256.97, jour7h: 244.41, jour8h: 279.33, mois35h: 4179.43, mois39h: 4776.47 }, cdi: 2952.74 }, + { nom: "Producteur exécutif", filiere: "", niveau: "HN", cddu: { semaine35h: null, semaine39h: null, jour7h: null, jour8h: null, mois35h: null, mois39h: null }, cdi: null }, + { nom: "Régisseur / Responsable des repérages", filiere: "F", niveau: "IIIB", cddu: { semaine35h: 810.55, semaine39h: 926.34, jour7h: 180.12, jour8h: 205.85, mois35h: 3080.09, mois39h: 3520.09 }, cdi: 2169.36 }, + { nom: "Régisseur adjoint", filiere: "F", niveau: "IV", cddu: { semaine35h: 696.89, semaine39h: 796.45, jour7h: 154.87, jour8h: 176.99, mois35h: 2648.20, mois39h: 3026.50 }, cdi: 1988.58 }, + { nom: "Régisseur de plateau / Chef de plateau", filiere: "F", niveau: "IV", cddu: { semaine35h: 696.89, semaine39h: 796.45, jour7h: 154.87, jour8h: 176.99, mois35h: 2648.20, mois39h: 3026.50 }, cdi: 1828.83 }, + { nom: "Régisseur général", filiere: "F", niveau: "IIIA", cddu: { semaine35h: 939.02, semaine39h: 1073.16, jour7h: 208.67, jour8h: 238.48, mois35h: 3568.27, mois39h: 4078.01 }, cdi: 2651.44 }, + { nom: "Régulateur de stationnement", filiere: "F", niveau: "VI", cddu: { semaine35h: 451.99, semaine39h: 516.55, jour7h: 100.44, jour8h: 114.79, mois35h: 2342.34, mois39h: 2676.95 }, cdi: 1828.83 }, + { nom: "Responsable des enfants", filiere: "F", niveau: "IIIB", cddu: { semaine35h: 727.88, semaine39h: 831.86, jour7h: 161.75, jour8h: 184.86, mois35h: 2765.95, mois39h: 3161.07 }, cdi: 2048.84 }, + { nom: "Secrétaire de production", filiere: "F", niveau: "V", cddu: { semaine35h: 610.78, semaine39h: 698.03, jour7h: 135.73, jour8h: 155.12, mois35h: 2342.34, mois39h: 2676.95 }, cdi: 1828.83 }, +]; + +// Définition des filières +const filieres = [ + { code: 'D', nom: 'Plateaux et tournage', icon: Sparkles, color: 'pink' }, + { code: 'E', nom: 'Postproduction', icon: Film, color: 'indigo' }, + { code: 'F', nom: 'Production', icon: ClipboardList, color: 'green' }, +]; + +// Classes de couleurs pour chaque filière +const colorClasses: Record = { + pink: { + bg: 'from-pink-50 to-rose-50', + border: 'border-pink-200', + text: 'text-pink-700', + hover: 'hover:border-pink-300', + gradient: 'from-pink-500 to-rose-600', + ring: 'ring-pink-200', + }, + indigo: { + bg: 'from-indigo-50 to-purple-50', + border: 'border-indigo-200', + text: 'text-indigo-700', + hover: 'hover:border-indigo-300', + gradient: 'from-indigo-500 to-purple-600', + ring: 'ring-indigo-200', + }, + green: { + bg: 'from-green-50 to-emerald-50', + border: 'border-green-200', + text: 'text-green-700', + hover: 'hover:border-green-300', + gradient: 'from-green-500 to-emerald-600', + ring: 'ring-green-200', + }, +}; + +// Composant pour une carte d'emploi +interface EmploiCardProps { + emploi: Emploi; + color: string; +} + +function EmploiCard({ emploi, color }: EmploiCardProps) { + const [isExpanded, setIsExpanded] = useState(false); + const [activeTab, setActiveTab] = useState<'cddu' | 'cdi'>('cdi'); + const colors = colorClasses[color]; + + return ( +
+ + + {isExpanded && emploi.niveau !== 'HN' && ( +
+ {/* Tabs CDI / CDDU */} +
+ + +
+ + {/* Contenu CDI */} + {activeTab === 'cdi' && ( +
+

Salaire mensuel

+

{euro(emploi.cdi)}

+

Base 35h / mois

+
+ )} + + {/* Contenu CDDU */} + {activeTab === 'cddu' && ( +
+ {/* Par semaine */} +
+

Par semaine

+
+
+

Base 35h

+

{euro(emploi.cddu.semaine35h)}

+
+
+

Base 39h

+

{euro(emploi.cddu.semaine39h)}

+
+
+
+ + {/* Par jour */} +
+

Par jour

+
+
+

Base 7h

+

{euro(emploi.cddu.jour7h)}

+
+
+

Base 8h

+

{euro(emploi.cddu.jour8h)}

+
+
+
+ + {/* Par mois */} +
+

Par mois

+
+
+

Base 35h

+

{euro(emploi.cddu.mois35h)}

+
+
+

Base 39h

+

{euro(emploi.cddu.mois39h)}

+
+
+
+
+ )} +
+ )} +
+ ); +} + +// Composant principal +interface CategorieBHorsDataPart2Props { + activeFiliere: string; +} + +export default function CategorieBHorsDataPart2({ activeFiliere }: CategorieBHorsDataPart2Props) { + const [searchTerm, setSearchTerm] = useState(''); + + const filteredEmplois = useMemo(() => { + // D'abord filtrer par la filière active + let result = emploisData.filter(e => e.filiere === activeFiliere); + + // Puis appliquer le filtre de recherche + if (searchTerm) { + result = result.filter(e => + e.nom.toLowerCase().includes(searchTerm.toLowerCase()) + ); + } + + return result.sort((a, b) => a.nom.localeCompare(b.nom)); + }, [activeFiliere, searchTerm]); + + // Déterminer la couleur en fonction de la filière + const getColorForFiliere = (filiereCode: string): keyof typeof colorClasses => { + const filiere = filieres.find(f => f.code === filiereCode); + return (filiere?.color as keyof typeof colorClasses) || 'blue'; + }; + const activeFiliereInfo = filieres.find(f => f.code === activeFiliere); + + return ( +
+ {/* En-tête */} +
+

+ Filière {activeFiliere} - {activeFiliereInfo?.nom || 'Filière'} +

+

+ {emploisData.length} emplois - Grille de salaires CCNPA (IDCC 2642) - Valeurs 2025 +

+
+ + {/* Recherche */} +
+ {/* Barre de recherche */} +
+ + setSearchTerm(e.target.value)} + placeholder={`Rechercher dans ${activeFiliereInfo?.nom || 'la filière'}...`} + className="w-full pl-10 pr-4 py-2.5 rounded-lg border border-slate-200 focus:ring-2 focus:ring-emerald-500 focus:border-transparent text-sm" + /> +
+ + {/* Résultats */} +
+
+

+ {filteredEmplois.length} emploi{filteredEmplois.length > 1 ? 's' : ''} trouvé{filteredEmplois.length > 1 ? 's' : ''} +

+ {searchTerm && ( + + )} +
+ +
+ {filteredEmplois.map((emploi, index) => ( + + ))} +
+ + {filteredEmplois.length === 0 && ( +
+

Aucun emploi trouvé pour cette recherche.

+
+ )} +
+
+
+ ); +} diff --git a/app/(app)/minima-ccn/ccnpa/categorie-b-hors-data-part3.tsx b/app/(app)/minima-ccn/ccnpa/categorie-b-hors-data-part3.tsx new file mode 100644 index 0000000..b6d1a06 --- /dev/null +++ b/app/(app)/minima-ccn/ccnpa/categorie-b-hors-data-part3.tsx @@ -0,0 +1,334 @@ +"use client"; + +import React, { useState, useMemo } from 'react'; +import { Clapperboard, Volume2, Globe, Search, ChevronDown, ChevronUp } from 'lucide-react'; + +// Fonction pour parser les montants en euros +function parseEuro(value: string | null): number | null { + if (!value || value === '-') return null; + const cleaned = value.replace(/\s/g, '').replace('€', '').replace(',', '.'); + const parsed = parseFloat(cleaned); + return isNaN(parsed) ? null : parsed; +} + +// Fonction pour formater en euros +function euro(value: number | null): string { + if (value === null) return '-'; + return new Intl.NumberFormat('fr-FR', { + style: 'currency', + currency: 'EUR' + }).format(value); +} + +// Interface pour un emploi +interface Emploi { + nom: string; + filiere: string; + niveau: string; + cddu: { + semaine35h: number | null; + semaine39h: number | null; + jour7h: number | null; + jour8h: number | null; + mois35h: number | null; + mois39h: number | null; + }; + cdi: number | null; +} + +// Données des emplois - Filières G, H, I +const emploisData: Emploi[] = [ + // Filière G - Réalisation + { nom: "1er assistant réalisateur", filiere: "G", niveau: "II", cddu: { semaine35h: 939.02, semaine39h: 1073.16, jour7h: 208.67, jour8h: 238.48, mois35h: 3568.27, mois39h: 4078.01 }, cdi: 2892.47 }, + { nom: "2ème assistant réalisateur", filiere: "G", niveau: "IV", cddu: { semaine35h: 785.30, semaine39h: 897.48, jour7h: 174.51, jour8h: 199.44, mois35h: 2984.13, mois39h: 3410.42 }, cdi: 1988.58 }, + { nom: "Assistant réalisateur", filiere: "G", niveau: "IIIB", cddu: { semaine35h: 872.56, semaine39h: 997.21, jour7h: 193.90, jour8h: 221.60, mois35h: 3315.71, mois39h: 3789.38 }, cdi: 2229.61 }, + { nom: "Assistant réalisateur adjoint", filiere: "G", niveau: "VI", cddu: { semaine35h: 451.99, semaine39h: 516.55, jour7h: 100.44, jour8h: 114.79, mois35h: 2342.34, mois39h: 2676.95 }, cdi: 1828.83 }, + { nom: "Assistant scripte adjoint", filiere: "G", niveau: "VI", cddu: { semaine35h: 451.99, semaine39h: 516.55, jour7h: 100.44, jour8h: 114.79, mois35h: 2342.34, mois39h: 2676.95 }, cdi: 1828.83 }, + { nom: "Conseiller technique à la réalisation", filiere: "G", niveau: "II", cddu: { semaine35h: 1025.42, semaine39h: 1171.91, jour7h: 227.87, jour8h: 260.42, mois35h: 3896.61, mois39h: 4453.25 }, cdi: 3013.00 }, + { nom: "Réalisateur", filiere: "", niveau: "HN", cddu: { semaine35h: null, semaine39h: null, jour7h: null, jour8h: null, mois35h: null, mois39h: null }, cdi: null }, + { nom: "Répétiteur", filiere: "G", niveau: "IIIB", cddu: { semaine35h: 727.88, semaine39h: 831.86, jour7h: 161.75, jour8h: 184.86, mois35h: 2765.95, mois39h: 3161.07 }, cdi: 2048.84 }, + { nom: "Scripte", filiere: "G", niveau: "IIIA", cddu: { semaine35h: 939.02, semaine39h: 1073.16, jour7h: 208.67, jour8h: 238.48, mois35h: 3568.27, mois39h: 4078.01 }, cdi: 2651.44 }, + { nom: "Storyboarder", filiere: "G", niveau: "IIIB", cddu: { semaine35h: 872.56, semaine39h: 997.21, jour7h: 193.90, jour8h: 221.60, mois35h: 3315.71, mois39h: 3789.38 }, cdi: 2169.36 }, + + // Filière H - Son + { nom: "Assistant son", filiere: "H", niveau: "IV", cddu: { semaine35h: 696.89, semaine39h: 796.45, jour7h: 154.87, jour8h: 176.99, mois35h: 2648.20, mois39h: 3026.50 }, cdi: 1928.32 }, + { nom: "Assistant son adjoint", filiere: "H", niveau: "VI", cddu: { semaine35h: 451.99, semaine39h: 516.55, jour7h: 100.44, jour8h: 114.79, mois35h: 2342.34, mois39h: 2676.95 }, cdi: 1828.83 }, + { nom: "Bruiteur", filiere: "H", niveau: "IIIA", cddu: { semaine35h: 1025.42, semaine39h: 1171.91, jour7h: 227.87, jour8h: 260.42, mois35h: 3896.61, mois39h: 4453.25 }, cdi: 2530.92 }, + { nom: "Chef OPS / Ingénieur du son", filiere: "H", niveau: "IIIA", cddu: { semaine35h: 1194.86, semaine39h: 1365.55, jour7h: 265.52, jour8h: 303.46, mois35h: 4540.45, mois39h: 5189.07 }, cdi: 2651.44 }, + { nom: "Mixeur (direct ou conditions du direct)", filiere: "H", niveau: "IIIA", cddu: { semaine35h: 1025.42, semaine39h: 1171.91, jour7h: 227.87, jour8h: 260.42, mois35h: 3896.61, mois39h: 4453.25 }, cdi: 2530.92 }, + { nom: "OPS", filiere: "H", niveau: "IIIB", cddu: { semaine35h: 872.56, semaine39h: 997.21, jour7h: 193.90, jour8h: 221.60, mois35h: 3315.71, mois39h: 3789.38 }, cdi: 2169.36 }, + { nom: "Perchiste / 1er assistant son", filiere: "H", niveau: "IIIA", cddu: { semaine35h: 860.59, semaine39h: 983.53, jour7h: 191.24, jour8h: 218.56, mois35h: 3270.23, mois39h: 3737.39 }, cdi: 2410.40 }, + { nom: "Technicien instruments (backliner)", filiere: "H", niveau: "IIIB", cddu: { semaine35h: 872.56, semaine39h: 997.21, jour7h: 193.90, jour8h: 221.60, mois35h: 3315.71, mois39h: 3789.38 }, cdi: 2386.53 }, + + // Filière I - Web + { nom: "Assistant technique web", filiere: "I", niveau: "VI", cddu: { semaine35h: 451.99, semaine39h: 516.55, jour7h: 100.44, jour8h: 114.79, mois35h: 1957.10, mois39h: 2236.67 }, cdi: 1828.83 }, + { nom: "Concepteur de programme web", filiere: "I", niveau: "I", cddu: { semaine35h: 766.61, semaine39h: 876.13, jour7h: 170.36, jour8h: 194.70, mois35h: 3319.44, mois39h: 3793.63 }, cdi: 2969.12 }, + { nom: "Coordinateur de diffusion web", filiere: "I", niveau: "IIIB", cddu: { semaine35h: 507.23, semaine39h: 579.70, jour7h: 112.72, jour8h: 128.82, mois35h: 2196.32, mois39h: 2510.08 }, cdi: 1959.62 }, + { nom: "Coordinateur de production web", filiere: "I", niveau: "II", cddu: { semaine35h: 576.41, semaine39h: 658.75, jour7h: 128.09, jour8h: 146.39, mois35h: 2495.85, mois39h: 2852.39 }, cdi: 2197.15 }, + { nom: "Designer web", filiere: "I", niveau: "IIIA", cddu: { semaine35h: 530.30, semaine39h: 606.05, jour7h: 117.84, jour8h: 134.68, mois35h: 2296.18, mois39h: 2624.20 }, cdi: 2019.01 }, + { nom: "Editeur artistique web", filiere: "I", niveau: "IV", cddu: { semaine35h: 489.94, semaine39h: 559.93, jour7h: 108.88, jour8h: 124.43, mois35h: 2121.44, mois39h: 2424.50 }, cdi: 1900.24 }, + { nom: "Gestionnaire de diffusion internet (traffic manager)", filiere: "I", niveau: "V", cddu: { semaine35h: 451.99, semaine39h: 516.55, jour7h: 100.44, jour8h: 114.79, mois35h: 1957.10, mois39h: 2236.67 }, cdi: 1828.83 }, + { nom: "Opérateur web / Opérateur multicam web", filiere: "I", niveau: "IIIA", cddu: { semaine35h: 553.35, semaine39h: 632.40, jour7h: 122.97, jour8h: 140.53, mois35h: 2395.99, mois39h: 2738.27 }, cdi: 2137.77 }, + { nom: "Technicien de développement web", filiere: "I", niveau: "IIIB", cddu: { semaine35h: 507.23, semaine39h: 579.70, jour7h: 112.72, jour8h: 128.82, mois35h: 2196.32, mois39h: 2510.08 }, cdi: 1959.62 }, + { nom: "Technicien vidéo web", filiere: "I", niveau: "V", cddu: { semaine35h: 451.99, semaine39h: 516.55, jour7h: 100.44, jour8h: 114.79, mois35h: 1957.10, mois39h: 2236.67 }, cdi: 1828.83 }, +]; + +// Définition des filières +const filieres = [ + { code: 'G', nom: 'Réalisation', icon: Clapperboard, color: 'orange' }, + { code: 'H', nom: 'Son', icon: Volume2, color: 'red' }, + { code: 'I', nom: 'Web', icon: Globe, color: 'teal' }, +]; + +// Classes de couleurs pour chaque filière +const colorClasses: Record = { + orange: { + bg: 'from-orange-50 to-amber-50', + border: 'border-orange-200', + text: 'text-orange-700', + hover: 'hover:border-orange-300', + gradient: 'from-orange-500 to-amber-600', + ring: 'ring-orange-200', + }, + red: { + bg: 'from-red-50 to-rose-50', + border: 'border-red-200', + text: 'text-red-700', + hover: 'hover:border-red-300', + gradient: 'from-red-500 to-rose-600', + ring: 'ring-red-200', + }, + teal: { + bg: 'from-teal-50 to-cyan-50', + border: 'border-teal-200', + text: 'text-teal-700', + hover: 'hover:border-teal-300', + gradient: 'from-teal-500 to-cyan-600', + ring: 'ring-teal-200', + }, +}; + +// Composant pour une carte d'emploi +interface EmploiCardProps { + emploi: Emploi; + color: string; +} + +function EmploiCard({ emploi, color }: EmploiCardProps) { + const [isExpanded, setIsExpanded] = useState(false); + const [activeTab, setActiveTab] = useState<'cddu' | 'cdi'>('cdi'); + const colors = colorClasses[color]; + + return ( +
+ + + {isExpanded && emploi.niveau !== 'HN' && ( +
+ {/* Tabs CDI / CDDU */} +
+ + +
+ + {/* Contenu CDI */} + {activeTab === 'cdi' && ( +
+

Salaire mensuel

+

{euro(emploi.cdi)}

+

Base 35h / mois

+
+ )} + + {/* Contenu CDDU */} + {activeTab === 'cddu' && ( +
+ {/* Par semaine */} +
+

Par semaine

+
+
+

Base 35h

+

{euro(emploi.cddu.semaine35h)}

+
+
+

Base 39h

+

{euro(emploi.cddu.semaine39h)}

+
+
+
+ + {/* Par jour */} +
+

Par jour

+
+
+

Base 7h

+

{euro(emploi.cddu.jour7h)}

+
+
+

Base 8h

+

{euro(emploi.cddu.jour8h)}

+
+
+
+ + {/* Par mois */} +
+

Par mois

+
+
+

Base 35h

+

{euro(emploi.cddu.mois35h)}

+
+
+

Base 39h

+

{euro(emploi.cddu.mois39h)}

+
+
+
+
+ )} +
+ )} +
+ ); +} + +// Composant principal +interface CategorieBHorsDataPart3Props { + activeFiliere: string; +} + +export default function CategorieBHorsDataPart3({ activeFiliere }: CategorieBHorsDataPart3Props) { + const [searchTerm, setSearchTerm] = useState(''); + + const filteredEmplois = useMemo(() => { + // D'abord filtrer par la filière active + let result = emploisData.filter(e => e.filiere === activeFiliere); + + // Puis appliquer le filtre de recherche + if (searchTerm) { + result = result.filter(e => + e.nom.toLowerCase().includes(searchTerm.toLowerCase()) + ); + } + + return result.sort((a, b) => a.nom.localeCompare(b.nom)); + }, [activeFiliere, searchTerm]); + + // Déterminer la couleur en fonction de la filière + const getColorForFiliere = (filiereCode: string): keyof typeof colorClasses => { + const filiere = filieres.find(f => f.code === filiereCode); + return (filiere?.color as keyof typeof colorClasses) || 'blue'; + }; + const activeFiliereInfo = filieres.find(f => f.code === activeFiliere); + + return ( +
+ {/* En-tête */} +
+

+ Filière {activeFiliere} - {activeFiliereInfo?.nom || 'Filière'} +

+

+ {emploisData.length} emplois - Grille de salaires CCNPA (IDCC 2642) - Valeurs 2025 +

+
+ + {/* Recherche */} +
+ {/* Barre de recherche */} +
+ + setSearchTerm(e.target.value)} + placeholder={`Rechercher dans ${activeFiliereInfo?.nom || 'la filière'}...`} + className="w-full pl-10 pr-4 py-2.5 rounded-lg border border-slate-200 focus:ring-2 focus:ring-emerald-500 focus:border-transparent text-sm" + /> +
+ + {/* Résultats */} +
+
+

+ {filteredEmplois.length} emploi{filteredEmplois.length > 1 ? 's' : ''} trouvé{filteredEmplois.length > 1 ? 's' : ''} +

+ {searchTerm && ( + + )} +
+ +
+ {filteredEmplois.map((emploi, index) => ( + + ))} +
+ + {filteredEmplois.length === 0 && ( +
+

Aucun emploi trouvé pour cette recherche.

+
+ )} +
+
+
+ ); +} diff --git a/app/(app)/minima-ccn/ccnpa/categorie-b-hors-data.tsx b/app/(app)/minima-ccn/ccnpa/categorie-b-hors-data.tsx new file mode 100644 index 0000000..44fd3cc --- /dev/null +++ b/app/(app)/minima-ccn/ccnpa/categorie-b-hors-data.tsx @@ -0,0 +1,367 @@ +"use client"; + +import React, { useState, useMemo } from 'react'; +import { Pencil, Palette, Camera, Search, ChevronDown, ChevronUp } from 'lucide-react'; + +// Fonction pour parser les montants en euros +function parseEuro(value: string | null): number | null { + if (!value || value === '-') return null; + const cleaned = value.replace(/\s/g, '').replace('€', '').replace(',', '.'); + const parsed = parseFloat(cleaned); + return isNaN(parsed) ? null : parsed; +} + +// Fonction pour formater en euros +function euro(value: number | null): string { + if (value === null) return '-'; + return new Intl.NumberFormat('fr-FR', { + style: 'currency', + currency: 'EUR' + }).format(value); +} + +// Interface pour un emploi +interface Emploi { + nom: string; + filiere: string; + niveau: string; + cddu: { + semaine35h: number | null; + semaine39h: number | null; + jour7h: number | null; + jour8h: number | null; + mois35h: number | null; + mois39h: number | null; + }; + cdi: number | null; +} + +// Données des emplois - Filières A, B, C +const emploisData: Emploi[] = [ + // Filière A - Écriture + { nom: "Animatronicien", filiere: "A", niveau: "IIIA", cddu: { semaine35h: 769.64, semaine39h: 879.58, jour7h: 171.03, jour8h: 195.46, mois35h: 2924.61, mois39h: 3342.41 }, cdi: 2530.92 }, + { nom: "Chargé d'enquête / de recherche", filiere: "A", niveau: "IIIA", cddu: { semaine35h: 783.49, semaine39h: 895.41, jour7h: 174.11, jour8h: 198.98, mois35h: 2977.24, mois39h: 3402.56 }, cdi: 2530.92 }, + { nom: "Chargé de sélection", filiere: "A", niveau: "IIIA", cddu: { semaine35h: 802.60, semaine39h: 917.26, jour7h: 178.36, jour8h: 203.84, mois35h: 3049.89, mois39h: 3485.58 }, cdi: 2590.58 }, + { nom: "Collaborateur artistique", filiere: "A", niveau: "IV", cddu: { semaine35h: 521.24, semaine39h: 595.71, jour7h: 115.83, jour8h: 132.38, mois35h: 2342.34, mois39h: 2676.95 }, cdi: 1828.83 }, + { nom: "Collaborateur de sélection", filiere: "A", niveau: "IV", cddu: { semaine35h: 628.00, semaine39h: 717.71, jour7h: 139.56, jour8h: 159.49, mois35h: 2386.40, mois39h: 2727.30 }, cdi: 2048.84 }, + { nom: "Conseiller artistique d'émission", filiere: "A", niveau: "IIIA", cddu: { semaine35h: 787.91, semaine39h: 900.47, jour7h: 175.09, jour8h: 200.10, mois35h: 2994.06, mois39h: 3421.77 }, cdi: 2590.58 }, + { nom: "Coordinateur d'écriture (ex script éditeur)", filiere: "A", niveau: "II", cddu: { semaine35h: 856.04, semaine39h: 978.33, jour7h: 190.23, jour8h: 217.41, mois35h: 3252.95, mois39h: 3717.65 }, cdi: 3013.00 }, + { nom: "Dir. de collection / Dir. de programmation", filiere: "A", niveau: "II", cddu: { semaine35h: 1099.85, semaine39h: 1256.97, jour7h: 244.41, jour8h: 279.33, mois35h: 4179.43, mois39h: 4776.47 }, cdi: 2952.74 }, + { nom: "Directeur artistique", filiere: "A", niveau: "II", cddu: { semaine35h: 1099.85, semaine39h: 1256.97, jour7h: 244.41, jour8h: 279.33, mois35h: 4179.43, mois39h: 4776.47 }, cdi: 2952.74 }, + { nom: "Directeur de jeux", filiere: "A", niveau: "I", cddu: { semaine35h: 1099.85, semaine39h: 1256.97, jour7h: 244.41, jour8h: 279.33, mois35h: 4179.43, mois39h: 4776.47 }, cdi: 2952.14 }, + { nom: "Directeur de la distribution", filiere: "A", niveau: "IIIA", cddu: { semaine35h: 856.04, semaine39h: 978.33, jour7h: 190.23, jour8h: 217.41, mois35h: 3252.95, mois39h: 3717.65 }, cdi: 2530.92 }, + { nom: "Directeur de sélection", filiere: "A", niveau: "I", cddu: { semaine35h: 1099.85, semaine39h: 1256.97, jour7h: 244.41, jour8h: 279.33, mois35h: 4179.43, mois39h: 4776.47 }, cdi: 2892.47 }, + { nom: "Directeur des dialogues", filiere: "A", niveau: "IIIB", cddu: { semaine35h: 727.88, semaine39h: 831.86, jour7h: 161.75, jour8h: 184.86, mois35h: 2765.95, mois39h: 3161.07 }, cdi: 2048.84 }, + { nom: "Documentaliste", filiere: "A", niveau: "II", cddu: { semaine35h: 818.52, semaine39h: 935.45, jour7h: 181.89, jour8h: 207.88, mois35h: 3110.36, mois39h: 3554.68 }, cdi: 2892.47 }, + { nom: "Enquêteur / Recherchiste", filiere: "A", niveau: "IIIB", cddu: { semaine35h: 749.71, semaine39h: 856.81, jour7h: 166.60, jour8h: 190.40, mois35h: 2848.89, mois39h: 3255.86 }, cdi: 2169.36 }, + { nom: "Illustrateur sonore", filiere: "A", niveau: "IIIA", cddu: { semaine35h: 769.64, semaine39h: 879.58, jour7h: 171.03, jour8h: 195.46, mois35h: 2924.61, mois39h: 3342.41 }, cdi: 2410.40 }, + { nom: "Préparateur de questions", filiere: "A", niveau: "IV", cddu: { semaine35h: 628.00, semaine39h: 717.71, jour7h: 139.56, jour8h: 159.49, mois35h: 2386.40, mois39h: 2727.30 }, cdi: 2147.87 }, + { nom: "Producteur artistique", filiere: "A", niveau: "II", cddu: { semaine35h: 1099.85, semaine39h: 1256.97, jour7h: 244.41, jour8h: 279.33, mois35h: 4179.43, mois39h: 4776.47 }, cdi: 2952.74 }, + { nom: "Programmateur artistique d'émission", filiere: "A", niveau: "IIIB", cddu: { semaine35h: 727.88, semaine39h: 831.86, jour7h: 161.75, jour8h: 184.86, mois35h: 2765.95, mois39h: 3161.07 }, cdi: 2048.84 }, + { nom: "Responsable d'enquête / de recherche", filiere: "A", niveau: "II", cddu: { semaine35h: 818.52, semaine39h: 935.45, jour7h: 181.89, jour8h: 207.88, mois35h: 3110.36, mois39h: 3554.68 }, cdi: 2892.47 }, + { nom: "Responsable de questions", filiere: "A", niveau: "IIIA", cddu: { semaine35h: 769.64, semaine39h: 879.58, jour7h: 171.03, jour8h: 195.46, mois35h: 2924.61, mois39h: 3342.41 }, cdi: 2651.44 }, + + // Filière B - Décor & Costume + { nom: "1er assistant décorateur", filiere: "B", niveau: "IIIA", cddu: { semaine35h: 939.02, semaine39h: 1073.16, jour7h: 208.67, jour8h: 238.48, mois35h: 3568.27, mois39h: 4078.01 }, cdi: 2530.92 }, + { nom: "2ème assistant décorateur", filiere: "B", niveau: "IIIB", cddu: { semaine35h: 818.59, semaine39h: 935.53, jour7h: 181.91, jour8h: 207.90, mois35h: 3110.64, mois39h: 3555.01 }, cdi: 2109.10 }, + { nom: "Accessoiriste", filiere: "B", niveau: "IIIB", cddu: { semaine35h: 791.03, semaine39h: 904.03, jour7h: 175.78, jour8h: 200.90, mois35h: 3005.91, mois39h: 3435.32 }, cdi: 2048.84 }, + { nom: "Assistant décorateur adjoint", filiere: "B", niveau: "VI", cddu: { semaine35h: 451.99, semaine39h: 516.55, jour7h: 100.44, jour8h: 114.79, mois35h: 2342.34, mois39h: 2676.95 }, cdi: 1828.83 }, + { nom: "Chef constructeur", filiere: "B", niveau: "IIIA", cddu: { semaine35h: 1203.69, semaine39h: 1375.64, jour7h: 267.49, jour8h: 305.70, mois35h: 4574.02, mois39h: 5227.43 }, cdi: 2651.44 }, + { nom: "Chef costumier", filiere: "B", niveau: "IIIA", cddu: { semaine35h: 872.56, semaine39h: 997.21, jour7h: 193.90, jour8h: 221.60, mois35h: 3315.71, mois39h: 3789.38 }, cdi: 2169.36 }, + { nom: "Chef d'équipe de décor", filiere: "B", niveau: "IV", cddu: { semaine35h: 1086.87, semaine39h: 1242.14, jour7h: 241.53, jour8h: 276.03, mois35h: 4130.12, mois39h: 4720.13 }, cdi: 2530.92 }, + { nom: "Chef décorateur", filiere: "B", niveau: "II", cddu: { semaine35h: 1639.88, semaine39h: 1874.15, jour7h: 364.42, jour8h: 416.48, mois35h: 6231.55, mois39h: 7121.75 }, cdi: 3013.00 }, + { nom: "Constructeur de décor", filiere: "B", niveau: "IV", cddu: { semaine35h: 909.38, semaine39h: 1039.29, jour7h: 202.08, jour8h: 230.95, mois35h: 3455.63, mois39h: 3949.29 }, cdi: 2481.29 }, + { nom: "Costumier", filiere: "B", niveau: "IV", cddu: { semaine35h: 696.89, semaine39h: 796.45, jour7h: 154.87, jour8h: 176.99, mois35h: 2648.20, mois39h: 3026.50 }, cdi: 1828.83 }, + { nom: "Créateur de costume", filiere: "B", niveau: "II", cddu: { semaine35h: 1616.70, semaine39h: 1847.66, jour7h: 359.27, jour8h: 410.59, mois35h: 6143.47, mois39h: 7021.08 }, cdi: 3013.00 }, + { nom: "Décorateur", filiere: "B", niveau: "II", cddu: { semaine35h: 1043.61, semaine39h: 1192.70, jour7h: 231.91, jour8h: 265.04, mois35h: 3965.71, mois39h: 4532.23 }, cdi: 2892.47 }, + { nom: "Dessinateur en décor", filiere: "B", niveau: "IIIB", cddu: { semaine35h: 818.59, semaine39h: 935.53, jour7h: 181.91, jour8h: 207.90, mois35h: 3110.64, mois39h: 3555.01 }, cdi: 2109.10 }, + { nom: "Électricien déco / Machiniste déco", filiere: "B", niveau: "V", cddu: { semaine35h: 897.81, semaine39h: 1026.07, jour7h: 199.51, jour8h: 228.02, mois35h: 3411.68, mois39h: 3899.05 }, cdi: 2169.36 }, + { nom: "Ensemblier - décorateur", filiere: "B", niveau: "IIIA", cddu: { semaine35h: 939.02, semaine39h: 1073.16, jour7h: 208.67, jour8h: 238.48, mois35h: 3568.27, mois39h: 4078.01 }, cdi: 2530.92 }, + { nom: "Habilleur", filiere: "B", niveau: "V", cddu: { semaine35h: 628.00, semaine39h: 717.71, jour7h: 139.56, jour8h: 159.49, mois35h: 2386.40, mois39h: 2727.30 }, cdi: 1828.83 }, + { nom: "Maçon de décor", filiere: "B", niveau: "V", cddu: { semaine35h: 897.81, semaine39h: 1026.07, jour7h: 199.51, jour8h: 228.02, mois35h: 3411.68, mois39h: 3899.05 }, cdi: 2169.36 }, + { nom: "Menuisier-traceur-toupilleur de décor", filiere: "B", niveau: "V", cddu: { semaine35h: 926.51, semaine39h: 1058.87, jour7h: 205.89, jour8h: 235.30, mois35h: 3520.74, mois39h: 4023.70 }, cdi: 2410.40 }, + { nom: "Métallier / Serrurier / Mécanicien de décor", filiere: "B", niveau: "V", cddu: { semaine35h: 897.81, semaine39h: 1026.07, jour7h: 199.51, jour8h: 228.02, mois35h: 3411.68, mois39h: 3899.05 }, cdi: 2169.36 }, + { nom: "Peintre de décor", filiere: "B", niveau: "V", cddu: { semaine35h: 897.81, semaine39h: 1026.07, jour7h: 199.51, jour8h: 228.02, mois35h: 3411.68, mois39h: 3899.05 }, cdi: 2169.36 }, + { nom: "Peintre en lettres / en faux bois de décor", filiere: "B", niveau: "V", cddu: { semaine35h: 897.81, semaine39h: 1026.07, jour7h: 199.51, jour8h: 228.02, mois35h: 3411.68, mois39h: 3899.05 }, cdi: 2169.36 }, + { nom: "Régisseur d'extérieurs", filiere: "B", niveau: "IIIB", cddu: { semaine35h: 818.59, semaine39h: 935.53, jour7h: 181.91, jour8h: 207.90, mois35h: 3110.64, mois39h: 3555.01 }, cdi: 2109.10 }, + { nom: "Rippeur", filiere: "B", niveau: "V", cddu: { semaine35h: 802.52, semaine39h: 917.17, jour7h: 178.34, jour8h: 203.81, mois35h: 3049.58, mois39h: 3485.22 }, cdi: 1828.83 }, + { nom: "Staffeur de décor", filiere: "B", niveau: "V", cddu: { semaine35h: 926.51, semaine39h: 1058.87, jour7h: 205.89, jour8h: 235.30, mois35h: 3520.74, mois39h: 4023.70 }, cdi: 2169.36 }, + { nom: "Styliste", filiere: "B", niveau: "IIIB", cddu: { semaine35h: 785.30, semaine39h: 897.48, jour7h: 174.51, jour8h: 199.44, mois35h: 2984.13, mois39h: 3410.42 }, cdi: 2048.84 }, + { nom: "Tapissier de décor", filiere: "B", niveau: "V", cddu: { semaine35h: 897.81, semaine39h: 1026.07, jour7h: 199.51, jour8h: 228.02, mois35h: 3411.68, mois39h: 3899.05 }, cdi: 2169.36 }, + + // Filière C - Image + { nom: "1er assistant OPV / pointeur", filiere: "C", niveau: "IIIA", cddu: { semaine35h: 944.71, semaine39h: 1079.66, jour7h: 209.93, jour8h: 239.93, mois35h: 3589.89, mois39h: 4102.71 }, cdi: 2651.44 }, + { nom: "2ème assistant OPV", filiere: "C", niveau: "V", cddu: { semaine35h: 696.89, semaine39h: 796.45, jour7h: 154.87, jour8h: 176.99, mois35h: 2648.20, mois39h: 3026.50 }, cdi: 1828.83 }, + { nom: "Assistant lumière", filiere: "C", niveau: "IV", cddu: { semaine35h: 746.27, semaine39h: 852.88, jour7h: 165.84, jour8h: 189.53, mois35h: 2835.82, mois39h: 3240.93 }, cdi: 2018.71 }, + { nom: "Assistant OPV adjoint", filiere: "C", niveau: "VI", cddu: { semaine35h: 451.99, semaine39h: 516.55, jour7h: 100.44, jour8h: 114.79, mois35h: 2342.34, mois39h: 2676.95 }, cdi: 1828.83 }, + { nom: "Cadreur / OPV", filiere: "C", niveau: "IIIA", cddu: { semaine35h: 1097.60, semaine39h: 1254.40, jour7h: 243.91, jour8h: 278.76, mois35h: 4170.87, mois39h: 4766.70 }, cdi: 2651.44 }, + { nom: "Chef OPV", filiere: "C", niveau: "II", cddu: { semaine35h: 1245.64, semaine39h: 1423.59, jour7h: 276.81, jour8h: 316.35, mois35h: 4733.44, mois39h: 5409.64 }, cdi: 3013.00 }, + { nom: "Directeur photo", filiere: "C", niveau: "I", cddu: { semaine35h: 1735.96, semaine39h: 1983.96, jour7h: 385.77, jour8h: 440.88, mois35h: 6596.66, mois39h: 7539.02 }, cdi: 3314.29 }, + { nom: "Ingénieur de la vision", filiere: "C", niveau: "II", cddu: { semaine35h: 1245.64, semaine39h: 1423.59, jour7h: 276.81, jour8h: 316.35, mois35h: 4733.44, mois39h: 5409.64 }, cdi: 3013.00 }, + { nom: "Ingénieur de la vision adjoint", filiere: "C", niveau: "IIIB", cddu: { semaine35h: 872.56, semaine39h: 997.21, jour7h: 193.90, jour8h: 221.60, mois35h: 3315.71, mois39h: 3789.38 }, cdi: 2169.36 }, + { nom: "Monteur", filiere: "C", niveau: "IIIB", cddu: { semaine35h: 918.47, semaine39h: 1049.68, jour7h: 204.10, jour8h: 233.26, mois35h: 3490.19, mois39h: 3988.78 }, cdi: 2289.87 }, + { nom: "Opérateur de transfert et de traitement numérique", filiere: "C", niveau: "V", cddu: { semaine35h: 696.89, semaine39h: 796.45, jour7h: 154.87, jour8h: 176.99, mois35h: 2648.20, mois39h: 3026.51 }, cdi: 1828.83 }, + { nom: "Opérateur magnéto / Opérateur magnéto ralenti", filiere: "C", niveau: "V", cddu: { semaine35h: 662.45, semaine39h: 757.08, jour7h: 147.21, jour8h: 168.24, mois35h: 2517.30, mois39h: 2876.90 }, cdi: 1828.83 }, + { nom: "Opérateur régie-vidéo", filiere: "C", niveau: "V", cddu: { semaine35h: 662.45, semaine39h: 757.08, jour7h: 147.21, jour8h: 168.24, mois35h: 2517.30, mois39h: 2876.90 }, cdi: 1828.83 }, + { nom: "Opérateur spécial (steadicamer)", filiere: "C", niveau: "IIIA", cddu: { semaine35h: 1162.83, semaine39h: 1328.95, jour7h: 258.41, jour8h: 295.32, mois35h: 4418.76, mois39h: 5050.00 }, cdi: 2651.44 }, + { nom: "Opérateur synthétiseur", filiere: "C", niveau: "V", cddu: { semaine35h: 662.45, semaine39h: 757.08, jour7h: 147.21, jour8h: 168.24, mois35h: 2517.30, mois39h: 2876.90 }, cdi: 1828.83 }, + { nom: "Photographe de plateau", filiere: "C", niveau: "IIIB", cddu: { semaine35h: 791.03, semaine39h: 904.03, jour7h: 175.78, jour8h: 200.90, mois35h: 3005.91, mois39h: 3435.32 }, cdi: 2229.61 }, + { nom: "Pupitreur lumière", filiere: "C", niveau: "IIIB", cddu: { semaine35h: 909.38, semaine39h: 1039.29, jour7h: 202.08, jour8h: 230.95, mois35h: 3455.63, mois39h: 3949.29 }, cdi: 2481.29 }, + { nom: "Superviseur d'effets spéciaux image", filiere: "C", niveau: "IIIA", cddu: { semaine35h: 1025.42, semaine39h: 1171.91, jour7h: 227.87, jour8h: 260.42, mois35h: 3896.61, mois39h: 4453.25 }, cdi: 2530.92 }, + { nom: "Technicien truquiste", filiere: "C", niveau: "IV", cddu: { semaine35h: 802.52, semaine39h: 917.17, jour7h: 178.34, jour8h: 203.81, mois35h: 3049.58, mois39h: 3485.22 }, cdi: 2109.10 }, + { nom: "Technicien vidéo", filiere: "C", niveau: "IV", cddu: { semaine35h: 802.52, semaine39h: 917.17, jour7h: 178.34, jour8h: 203.81, mois35h: 3049.58, mois39h: 3485.22 }, cdi: 2109.10 }, +]; + +// Définition des filières +const filieres = [ + { code: 'A', nom: 'Contenu du programme et collaboration artistique', icon: Pencil, color: 'violet' }, + { code: 'B', nom: 'Costumes, décor', icon: Palette, color: 'blue' }, + { code: 'C', nom: 'Image', icon: Camera, color: 'cyan' }, +]; + +// Classes de couleurs pour chaque filière +const colorClasses: Record = { + violet: { + bg: 'from-violet-50 to-purple-50', + border: 'border-violet-200', + text: 'text-violet-700', + hover: 'hover:border-violet-300', + gradient: 'from-violet-500 to-purple-600', + ring: 'ring-violet-200', + }, + blue: { + bg: 'from-blue-50 to-indigo-50', + border: 'border-blue-200', + text: 'text-blue-700', + hover: 'hover:border-blue-300', + gradient: 'from-blue-500 to-indigo-600', + ring: 'ring-blue-200', + }, + cyan: { + bg: 'from-cyan-50 to-sky-50', + border: 'border-cyan-200', + text: 'text-cyan-700', + hover: 'hover:border-cyan-300', + gradient: 'from-cyan-500 to-sky-600', + ring: 'ring-cyan-200', + }, +}; + +// Composant pour une carte d'emploi +interface EmploiCardProps { + emploi: Emploi; + color: string; +} + +function EmploiCard({ emploi, color }: EmploiCardProps) { + const [isExpanded, setIsExpanded] = useState(false); + const [activeTab, setActiveTab] = useState<'cddu' | 'cdi'>('cdi'); + const colors = colorClasses[color]; + + return ( +
+ + + {isExpanded && ( +
+ {/* Tabs CDI / CDDU */} +
+ + +
+ + {/* Contenu CDI */} + {activeTab === 'cdi' && ( +
+

Salaire mensuel

+

{euro(emploi.cdi)}

+

Base 35h / mois

+
+ )} + + {/* Contenu CDDU */} + {activeTab === 'cddu' && ( +
+ {/* Par semaine */} +
+

Par semaine

+
+
+

Base 35h

+

{euro(emploi.cddu.semaine35h)}

+
+
+

Base 39h

+

{euro(emploi.cddu.semaine39h)}

+
+
+
+ + {/* Par jour */} +
+

Par jour

+
+
+

Base 7h

+

{euro(emploi.cddu.jour7h)}

+
+
+

Base 8h

+

{euro(emploi.cddu.jour8h)}

+
+
+
+ + {/* Par mois */} +
+

Par mois

+
+
+

Base 35h

+

{euro(emploi.cddu.mois35h)}

+
+
+

Base 39h

+

{euro(emploi.cddu.mois39h)}

+
+
+
+
+ )} +
+ )} +
+ ); +} + +// Composant principal +interface CategorieBHorsDataProps { + activeFiliere: string; +} + +export default function CategorieBHorsData({ activeFiliere }: CategorieBHorsDataProps) { + const [searchTerm, setSearchTerm] = useState(''); + + const filteredEmplois = useMemo(() => { + // D'abord filtrer par la filière active + let result = emploisData.filter(e => e.filiere === activeFiliere); + + // Puis appliquer le filtre de recherche + if (searchTerm) { + result = result.filter(e => + e.nom.toLowerCase().includes(searchTerm.toLowerCase()) + ); + } + + return result.sort((a, b) => a.nom.localeCompare(b.nom)); + }, [activeFiliere, searchTerm]); + + // Déterminer la couleur en fonction de la filière + const getColorForFiliere = (filiereCode: string): keyof typeof colorClasses => { + const filiere = filieres.find(f => f.code === filiereCode); + return (filiere?.color as keyof typeof colorClasses) || 'blue'; + }; + const activeFiliereInfo = filieres.find(f => f.code === activeFiliere); + + return ( +
+ {/* En-tête */} +
+

+ Filière {activeFiliere} - {activeFiliereInfo?.nom || 'Filière'} +

+

+ {emploisData.length} emplois - Grille de salaires CCNPA (IDCC 2642) - Valeurs 2025 +

+
+ + {/* Recherche */} +
+ {/* Barre de recherche */} +
+ + setSearchTerm(e.target.value)} + placeholder={`Rechercher dans ${activeFiliereInfo?.nom || 'la filière'}...`} + className="w-full pl-10 pr-4 py-2.5 rounded-lg border border-slate-200 focus:ring-2 focus:ring-emerald-500 focus:border-transparent text-sm" + /> +
+ + {/* Résultats */} +
+
+

+ {filteredEmplois.length} emploi{filteredEmplois.length > 1 ? 's' : ''} trouvé{filteredEmplois.length > 1 ? 's' : ''} +

+ {searchTerm && ( + + )} +
+ +
+ {filteredEmplois.map((emploi, index) => ( + + ))} +
+ + {filteredEmplois.length === 0 && ( +
+

Aucun emploi trouvé pour cette recherche.

+
+ )} +
+
+
+ ); +} diff --git a/app/(app)/minima-ccn/ccnpa/categorie-b-hors.tsx b/app/(app)/minima-ccn/ccnpa/categorie-b-hors.tsx new file mode 100644 index 0000000..672e10f --- /dev/null +++ b/app/(app)/minima-ccn/ccnpa/categorie-b-hors.tsx @@ -0,0 +1,92 @@ +"use client"; + +import React, { useState } from 'react'; +import CategorieBHorsData from './categorie-b-hors-data'; +import CategorieBHorsDataPart2 from './categorie-b-hors-data-part2'; +import CategorieBHorsDataPart3 from './categorie-b-hors-data-part3'; + +type Filiere = 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I'; + +const filieres: { code: Filiere; nom: string; part: 1 | 2 | 3 }[] = [ + { code: 'A', nom: 'Contenu du programme et collaboration artistique', part: 1 }, + { code: 'B', nom: 'Costumes, décor', part: 1 }, + { code: 'C', nom: 'Image', part: 1 }, + { code: 'D', nom: 'Plateaux et tournage', part: 2 }, + { code: 'E', nom: 'Postproduction', part: 2 }, + { code: 'F', nom: 'Production', part: 2 }, + { code: 'G', nom: 'Réalisation', part: 3 }, + { code: 'H', nom: 'Son', part: 3 }, + { code: 'I', nom: 'Web', part: 3 }, +]; + +export default function CategorieBHors() { + const [activeFiliere, setActiveFiliere] = useState('A'); + const [hoveredFiliere, setHoveredFiliere] = useState(null); + + const activePart = filieres.find(f => f.code === activeFiliere)?.part || 1; + + return ( +
+ {/* En-tête de la catégorie */} +
+

+ Catégorie B - Hors fiction & flux +

+

+ Grille des salaires par filière - Programmes ni fiction, ni flux +

+ {/* Ligne d'information globale supprimée pour alléger l'en-tête */} +
+ + {/* Sélection des filières */} +
+

+ Sélectionnez une filière pour explorer les emplois : +

+ +
+ {filieres.map((filiere) => ( +
+ + + {/* Tooltip */} + {hoveredFiliere === filiere.code && ( +
+ {filiere.nom} +
+
+
+
+ )} +
+ ))} +
+ + {/* Contenu */} +
+ {activePart === 1 && } + {activePart === 2 && } + {activePart === 3 && } +
+
+
+ ); +} diff --git a/app/(app)/minima-ccn/ccnpa/categorie-c.tsx b/app/(app)/minima-ccn/ccnpa/categorie-c.tsx new file mode 100644 index 0000000..cc91273 --- /dev/null +++ b/app/(app)/minima-ccn/ccnpa/categorie-c.tsx @@ -0,0 +1,122 @@ +"use client"; + +import React from 'react'; +import { Users, Info, Sparkles } from 'lucide-react'; + +function euro(n: number) { + return new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR' }).format(n); +} + +const HN_ROLES = [ + "Animateur d’émission", + "Artiste invité", + "Intervenant spécialisé (suivi du nom de la spécialité)", + "Invité / Intervenant", +]; + +const CACHETS = [ + { emploi: "Doublure lumière", journalier: 122.00 }, + { emploi: "Figurant - Ensemble de 30 personnes ou plus", journalier: 96.00 }, + { emploi: "Figurant - Ensemble de moins de 30 personnes", journalier: 98.00 }, +]; + +const SUPPLEMENTS = [ + { label: "Fourniture de costumes spéciaux (jaquette, costume de service, barman, steward, garçon de café, agent de police, costume d'époque ancienne, costume de soirée, habit, de maître d'hôtel, spencer, smoking, robe du soir, toutes teintes pouvant être exigées)", montant: 47.05 }, + { label: "Silhouettes (artistes de complément dont le personnage doit ressortir dans le champ de la caméra, jusqu’à 2 répliques)", montant: 42.24 }, + { label: "Essayage", montant: 15.53 }, +]; + + +const InfoRow: React.FC<{ children: React.ReactNode }> = ({ children }) => ( +
+
+
+

{children}

+
+); + +export default function CategorieC() { + return ( +
+ {/* En-tête */} +
+
+
+ +
+
+
+

Catégorie C

+ + Intervenants à l’image et artistes de complément + +
+

Salaires applicables au 1er janvier 2025 (Avenant n°20 du 29 novembre 2024, non étendu)

+
+
+
+ + {/* HN roles */} +
+

+ Emplois Hors Niveau (HN) +

+
    + {HN_ROLES.map((r, i) => ( +
  • {r} — HN
  • + ))} +
+
+ + {/* Cachets */} +
+
+
Emploi
+
Cachet minimum journalier
+
Semaine civile (5 jours)
+
+ {CACHETS.map((c, idx) => ( +
+
{c.emploi}
+
{euro(c.journalier)}
+
{euro(+(c.journalier * 4.5).toFixed(2))}
+
+ ))} +
+ + La demi-journée est rémunérée 65% du tarif journalier. La semaine civile de 5 jours est rémunérée 4,5 fois le tarif journalier. + +
+
+ + {/* Définition et suppléments */} +
+

Figurants — définitions

+
+ + (1) Ensemble de 30 personnes ou plus, portant costumes tout venant, de correction ordinaire, élégant de ville, tailleur, robe d'après-midi, de cocktail ou de dîner, teinte claire ou foncée pouvant être exigée, d'époque actuelle, avec désignation ou pas de la saison. + + + (2) Ensemble de moins de 30 personnes, mêmes conditions vestimentaires que ci-dessus. + +
+ +

Suppléments

+
    + {SUPPLEMENTS.map((s, i) => ( +
  • +
    +
    +
    + {s.label} — {euro(s.montant)} +
    +
  • + ))} +
+
+ +
+ ); +} diff --git a/app/(app)/minima-ccn/ccnpa/fiction-realisateur.tsx b/app/(app)/minima-ccn/ccnpa/fiction-realisateur.tsx new file mode 100644 index 0000000..f165cda --- /dev/null +++ b/app/(app)/minima-ccn/ccnpa/fiction-realisateur.tsx @@ -0,0 +1,87 @@ +"use client"; + +import React from 'react'; +import { Clapperboard, Info } from 'lucide-react'; + +function euro(value: number): string { + return new Intl.NumberFormat('fr-FR', { + style: 'currency', + currency: 'EUR', + }).format(value); +} + +export default function FictionRealisateur() { + const lines = [ + { label: 'Journalier', duree: '9 heures', montant: 300.07 }, + { label: 'Hebdomadaire', duree: '45 heures', montant: 1500.96 }, + { label: 'Mensuel', duree: '45 heures / semaine', montant: 5250.04 }, + ]; + + const InfoRow: React.FC<{ children: React.ReactNode }> = ({ children }) => ( +
+
+
+

{children}

+
+ ); + + return ( +
+ {/* En-tête */} +
+
+
+ +
+
+
+

Fiction - Réalisateur

+ + Filière G — Hors niveau + +
+

+ Annexe A de l'accord du 15 septembre 2023 relatif aux réalisateurs — applicable au 1er novembre 2023 (non étendu) +

+
+
+
+ + {/* Tableau */} +
+
+
Salaire minimum
+
Durée du travail
+
Montant minimum garanti
+
Applicable si
+
+ {lines.map((l, idx) => ( +
+
{l.label}
+
{l.duree}
+
{euro(l.montant)}
+
+ {l.label === 'Journalier' && (Engagement < 5 jours sur une même semaine calendaire)} + {l.label === 'Hebdomadaire' && (Engagement ≥ 5 jours sur la même semaine calendaire)} + {l.label === 'Mensuel' && (Engagement ≥ 13 semaines réparties sur 4 mois consécutifs)} +
+
+ ))} +
+ + {/* Notes */} +
+ + Depuis la loi du 7 juillet 2016, les réalisateurs relèvent du statut d’artistes du spectacle (art. L7121-2 du Code du travail) et de l’annexe X du règlement général d’assurance chômage. + + + La rémunération peut être établie en cachets ou en heures. Les montants indiqués sont des minima garantis, même si la durée effective n’atteint pas 9h ou 45h. + + + L’accord du 15 septembre 2023 précise la fonction et les conditions d’engagement des réalisateurs. L’annexe A fixe les minima spécifiques aux réalisateurs de fictions audiovisuelles. Application à compter du 1er novembre 2023 (non étendu). + +
+
+ ); +} diff --git a/app/(app)/minima-ccn/ccnpa/page.tsx b/app/(app)/minima-ccn/ccnpa/page.tsx new file mode 100644 index 0000000..7b3b4f7 --- /dev/null +++ b/app/(app)/minima-ccn/ccnpa/page.tsx @@ -0,0 +1,351 @@ +"use client"; + +import React, { useEffect, useState } from 'react'; +import { usePageTitle } from '@/hooks/usePageTitle'; +import Link from 'next/link'; +import { ArrowLeft, Scale, Calculator, X } from 'lucide-react'; +import CategorieAContent from './categorie-a-data'; +import CategorieBFiction from './categorie-b-fiction'; +import CategorieBFlux from './categorie-b-flux'; +import CategorieBHors from './categorie-b-hors'; +import FictionRealisateur from './fiction-realisateur'; +import CategorieC from './categorie-c'; +import ArtistesMusiciens from './artistes-musiciens'; +import ArtistesInterpretes from './artistes-interpretes'; +import SimulateurContent from '@/components/simulateur/SimulateurContent'; +import CalculatorComponent from '@/components/Calculator'; +import { useDraggableModal } from '@/hooks/useDraggableModal'; + +export default function CCNPAPage() { + usePageTitle("Minima CCNPA"); + const [isSimulateurOpen, setIsSimulateurOpen] = useState(false); + const [isCalculatorOpen, setIsCalculatorOpen] = useState(false); + const [modalPosition, setModalPosition] = useState({ x: 0, y: 0 }); + const modalRef = React.useRef(null); + + + // Gestion du drag & drop du modal + const { onPointerDown, onPointerMove, onPointerUp } = useDraggableModal( + modalRef, + setModalPosition, + { constrainToViewport: true, disableIframeDuringDrag: true } + ); + + // Écouter les messages de l'iframe pour ouvrir la calculatrice + useEffect(() => { + const handleMessage = (event: MessageEvent) => { + if (event.data?.type === 'openCalculator') { + setIsCalculatorOpen(true); + } + }; + + window.addEventListener('message', handleMessage); + return () => window.removeEventListener('message', handleMessage); + }, []); + + useEffect(() => { + // Script de gestion des onglets + const tabs = Array.from(document.querySelectorAll('[role="tab"]')); + const panels = Array.from(document.querySelectorAll('.ccnpa-panel')); + + function activateTab(tab: Element) { + tabs.forEach((t) => { + const selected = t === tab; + t.setAttribute('aria-selected', selected ? 'true' : 'false'); + (t as HTMLElement).tabIndex = selected ? 0 : -1; + }); + + panels.forEach((p) => { + const active = p.id === tab.getAttribute('aria-controls'); + p.classList.toggle('active', active); + if (active) { + p.removeAttribute('hidden'); + } else { + p.setAttribute('hidden', ''); + } + }); + + (tab as HTMLElement).focus({ preventScroll: true }); + } + + tabs.forEach((tab) => { + tab.addEventListener('click', () => activateTab(tab)); + }); + + // Navigation clavier + document.addEventListener('keydown', (e) => { + const current = document.querySelector('[role="tab"][aria-selected="true"]'); + if (!current) return; + const i = tabs.indexOf(current); + if (e.key === 'ArrowRight') { + e.preventDefault(); + activateTab(tabs[(i + 1) % tabs.length]); + } + if (e.key === 'ArrowLeft') { + e.preventDefault(); + activateTab(tabs[(i - 1 + tabs.length) % tabs.length]); + } + if (e.key === 'Home') { + e.preventDefault(); + activateTab(tabs[0]); + } + if (e.key === 'End') { + e.preventDefault(); + activateTab(tabs[tabs.length - 1]); + } + }); + }, []); + + return ( +
+ + + {/* Navigation retour */} + + + Retour aux minima CCN + + + {/* En-tête */} +
+
+
+ +
+
+
+

CCNPA (IDCC 2642)

+ + À jour 2025 + +
+

+ Convention Collective Nationale de la Production Audiovisuelle +

+

+ Grille des minima conventionnels pour les salariés de la production audiovisuelle. +
+ Tous les montants sont exprimés bruts. +

+
+
+
+ + {/* Onglets */} +
+

+ Cliquez sur un onglet pour accéder aux minima par catégorie professionnelle. +

+ +
+ + + + + + + + +
+ + {/* Panneaux */} +
+ +
+ + + + + + + + + + + + + + +
+ + {/* Bouton flottant Simulateur */} + + + {/* Modale compacte qui sort du bouton */} + {isSimulateurOpen && ( + <> + {/* Modale compacte déplaçable */} +
+ {/* Header draggable */} +
+

+ + Simulateur de paie +

+ +
+ + {/* Content avec scroll */} +
+ +
+
+ + )} + + {/* Calculatrice globale */} + setIsCalculatorOpen(false)} + /> +
+ ); +} diff --git a/app/(app)/minima-ccn/ccnsvp/page.tsx b/app/(app)/minima-ccn/ccnsvp/page.tsx index 237ba45..4b5e115 100644 --- a/app/(app)/minima-ccn/ccnsvp/page.tsx +++ b/app/(app)/minima-ccn/ccnsvp/page.tsx @@ -13,65 +13,34 @@ import Annexe5Content from './annexe5-data'; import Annexe6Content from './annexe6-data'; import SimulateurContent from '@/components/simulateur/SimulateurContent'; import CalculatorComponent from '@/components/Calculator'; +import { useDraggableModal } from '@/hooks/useDraggableModal'; export default function CCNSVPPage() { usePageTitle("Minima CCNSVP"); const [isSimulateurOpen, setIsSimulateurOpen] = useState(false); const [isCalculatorOpen, setIsCalculatorOpen] = useState(false); const [modalPosition, setModalPosition] = useState({ x: 0, y: 0 }); - const [isDragging, setIsDragging] = useState(false); - const [dragOffset, setDragOffset] = useState({ x: 0, y: 0 }); const modalRef = React.useRef(null); + // Etat de drag performant (hors React) + const dragState = React.useRef<{ + dragging: boolean; + startX: number; + startY: number; + origLeft: number; + origTop: number; + dx: number; + dy: number; + raf: number | null; + iframe: HTMLIFrameElement | null; + }>({ dragging: false, startX: 0, startY: 0, origLeft: 0, origTop: 0, dx: 0, dy: 0, raf: null, iframe: null }); + // Gestion du drag & drop du modal - const handleMouseDown = (e: React.MouseEvent) => { - if (!modalRef.current) return; - - // Si c'est le premier drag, calculer la position réelle du modal - if (modalPosition.x === 0 && modalPosition.y === 0) { - const rect = modalRef.current.getBoundingClientRect(); - setModalPosition({ x: rect.left, y: rect.top }); - setDragOffset({ - x: e.clientX - rect.left, - y: e.clientY - rect.top, - }); - } else { - setDragOffset({ - x: e.clientX - modalPosition.x, - y: e.clientY - modalPosition.y, - }); - } - - setIsDragging(true); - }; - - useEffect(() => { - const handleMouseMove = (e: MouseEvent) => { - if (!isDragging) return; - - const newX = e.clientX - dragOffset.x; - const newY = e.clientY - dragOffset.y; - - setModalPosition({ - x: newX, - y: newY, - }); - }; - - const handleMouseUp = () => { - setIsDragging(false); - }; - - if (isDragging) { - document.addEventListener('mousemove', handleMouseMove); - document.addEventListener('mouseup', handleMouseUp); - } - - return () => { - document.removeEventListener('mousemove', handleMouseMove); - document.removeEventListener('mouseup', handleMouseUp); - }; - }, [isDragging, dragOffset]); + const { onPointerDown, onPointerMove, onPointerUp } = useDraggableModal( + modalRef, + setModalPosition, + { constrainToViewport: true, disableIframeDuringDrag: true } + ); // Écouter les messages de l'iframe pour ouvrir la calculatrice useEffect(() => { @@ -594,31 +563,23 @@ export default function CCNSVPPage() { {/* Modale compacte qui sort du bouton */} {isSimulateurOpen && ( <> - {/* Overlay transparent pour fermer au clic */} -
{ - setIsSimulateurOpen(false); - setModalPosition({ x: 0, y: 0 }); // Réinitialiser la position - }} - /> - {/* Modale compacte déplaçable */}
e.stopPropagation()} > {/* Header draggable */}

@@ -631,7 +592,7 @@ export default function CCNSVPPage() { }} className="p-1.5 rounded-lg hover:bg-slate-100 transition-colors" aria-label="Fermer le simulateur" - onMouseDown={(e) => e.stopPropagation()} + onPointerDown={(e) => e.stopPropagation()} > diff --git a/app/(app)/minima-ccn/page.tsx b/app/(app)/minima-ccn/page.tsx index fc1ef42..e3446bc 100644 --- a/app/(app)/minima-ccn/page.tsx +++ b/app/(app)/minima-ccn/page.tsx @@ -91,33 +91,37 @@ export default function MinimaCCNPage() {

- {/* CCNPA - Bientôt disponible */} -
+ {/* CCNPA */} + {/* Badge */}
- - Bientôt disponible + + À jour 2025
{/* Icône */} -
-
); diff --git a/components/Calculator.tsx b/components/Calculator.tsx index 66620b8..6800d4f 100644 --- a/components/Calculator.tsx +++ b/components/Calculator.tsx @@ -191,10 +191,11 @@ export default function Calculator({ isOpen, onClose, onUseResult }: CalculatorP const calculatorRef = React.useRef(null); useEffect(() => { - if (isOpen && calculatorRef.current) { + // Focus une fois que le composant est monté (position non nulle) + if (isOpen && position !== null && calculatorRef.current) { calculatorRef.current.focus(); } - }, [isOpen]); + }, [isOpen, position]); if (!isOpen || position === null) return null; @@ -228,7 +229,13 @@ export default function Calculator({ isOpen, onClose, onUseResult }: CalculatorP {/* Body */}
{/* Display */} -
+
+ {/* Opérateur courant (badge) */} + {operator && ( + + {operator === '/' ? '÷' : operator === '*' ? '×' : operator === '-' ? '−' : operator} + + )} {display || '0'}
diff --git a/components/simulateur/SimulateurContent.tsx b/components/simulateur/SimulateurContent.tsx index f3bf1d0..8a0907a 100644 --- a/components/simulateur/SimulateurContent.tsx +++ b/components/simulateur/SimulateurContent.tsx @@ -81,6 +81,9 @@ export default function SimulateurContent({ hideInfoPanel = false }: SimulateurC border: none; background: white; } + .simulateur-iframe-sidebar.compact { + height: 420px; /* Taille plus compacte pour le modal */ + } `} {/* Layout avec simulateur et info */} @@ -89,8 +92,8 @@ export default function SimulateurContent({ hideInfoPanel = false }: SimulateurC {/* Simulateur principal */}
+ + + + + diff --git a/public/simulateur-embed.html b/public/simulateur-embed.html index f229283..ed84158 100644 --- a/public/simulateur-embed.html +++ b/public/simulateur-embed.html @@ -9,6 +9,129 @@ + @@ -210,10 +333,64 @@