[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"footer-root-categories-fr-FR":3,"tool-content-ccn-industrie-pharmaceutique-accord-fr":83,"footer-cities-fr":156},[4,14,22,30,38,45,53,60,67,75],{"seo_content":5,"id":8,"name":9,"slug":10,"parentId":7,"lang":11,"_count":12},[6],{"page_slug":7},null,"cmkzhl7xm00dbulbc93h4qog5","Juridique","avocats","fr-FR",{"experts":13},8,{"seo_content":15,"id":17,"name":18,"slug":19,"parentId":7,"lang":11,"_count":20},[16],{"page_slug":7},"cmkzhl84700djulbcbv6pzu9e","Informatique","informaticiens",{"experts":21},3,{"seo_content":23,"id":25,"name":26,"slug":27,"parentId":7,"lang":11,"_count":28},[24],{"page_slug":7},"cmkzhlaos00gnulbc07i9jrco","Amélioration de la Maison","artisans",{"experts":29},4,{"seo_content":31,"id":33,"name":34,"slug":35,"parentId":7,"lang":11,"_count":36},[32],{"page_slug":7},"cmkzhlaqg00gpulbcx38bwoc2","Général","divers-generalistes",{"experts":37},0,{"seo_content":39,"id":41,"name":42,"slug":43,"parentId":7,"lang":11,"_count":44},[40],{"page_slug":7},"cmkzhlbvq00i3ulbcutdbcz50","Électronique Grand Public","techniciens-electronique",{"experts":21},{"seo_content":46,"id":48,"name":49,"slug":50,"parentId":7,"lang":11,"_count":51},[47],{"page_slug":7},"cmkzhlcaw00ilulbc38pxoogr","Santé","medecins",{"experts":52},5,{"seo_content":54,"id":56,"name":57,"slug":58,"parentId":7,"lang":11,"_count":59},[55],{"page_slug":7},"cmkzhlcmi00izulbcxva1m47f","Gestion de Patrimoine","conseillers-patrimoniaux",{"experts":21},{"seo_content":61,"id":63,"name":64,"slug":65,"parentId":7,"lang":11,"_count":66},[62],{"page_slug":7},"cmkzhldcv00jvulbcmcd5a7mk","Animaux et Vétérinaires","veterinaires",{"experts":21},{"seo_content":68,"id":70,"name":71,"slug":72,"parentId":7,"lang":11,"_count":73},[69],{"page_slug":7},"cmkzhldrr00kdulbchxfo67eg","Mécanique et Réparation","mecaniciens",{"experts":74},1,{"seo_content":76,"id":78,"name":79,"slug":80,"parentId":7,"lang":11,"_count":81},[77],{"page_slug":7},"cmkzhl9l300fbulbcv3i8q8p3","Aide aux Devoirs","professeurs-particuliers",{"experts":82},6,{"slug":84,"title":85,"page_title":86,"description":87,"content_md":88,"local_slug":84,"json_ld":89,"faq":130,"tool_html":150,"source":151,"category":152,"audience":153,"publish_mode":154,"hero_image":155,"hero_image_alt":85},"ccn-industrie-pharmaceutique-accord","CCN de l'industrie pharmaceutique (accord — calculateur complet","Calculateur CCN Industrie Pharmaceutique IDCC 176 | Expert Zoom","Outil interactif couvrant l'indemnité de licenciement, le préavis, la grille de salaires 2025, la prime d'ancienneté, les congés et les heures supplémentaires de la CCN de l'industrie pharmaceutique (IDCC 176).","Ce calculateur couvre les 6 principales dérogations de la CCN de l'industrie pharmaceutique (IDCC 176) par rapport au code du travail : indemnité de licenciement (taux progressifs 0,30-0,45 mois\u002Fan, art. 36), préavis de 2 à 4 mois selon le groupe (art. 35), grille de salaires conventionnels 2025 (+1,8 %), prime d'ancienneté de 3 % à 18 % (art. 24), congés supplémentaires pour enfants à charge (art. 26) et majorations dimanche\u002Fnuit (art. 20).",[90,109],{"name":91,"@type":92,"about":93,"author":97,"@context":100,"isPartOf":101,"inLanguage":104,"description":105,"operatingSystem":106,"applicationCategory":107,"isAccessibleForFree":108},"Calculateur CCN Industrie Pharmaceutique — IDCC 176","WebApplication",{"name":94,"@type":95,"identifier":96},"Convention collective de l'industrie pharmaceutique","Thing","IDCC 176",{"name":98,"@type":99},"Expert-Zoom","Organization","https:\u002F\u002Fschema.org",{"url":102,"@type":103},"\u002Ffr\u002Fmagazine\u002Fjuridique\u002Fles-conventions-collectives-en-france","Article","fr","Outil interactif couvrant l'indemnité de licenciement, le préavis, la grille de salaires 2025, la prime d'ancienneté, les congés payés et les heures supplémentaires de la convention collective de l'industrie pharmaceutique (IDCC 176).","All","FinanceApplication",true,{"@type":110,"@context":100,"mainEntity":111},"FAQPage",[112,118,122,126],{"name":113,"@type":114,"acceptedAnswer":115},"Comment calculer l'indemnité de licenciement dans la convention collective de l'industrie pharmaceutique (IDCC 176) ?","Question",{"text":116,"@type":117},"La CCN de l'industrie pharmaceutique (art. 36) applique un taux progressif par palier d'ancienneté : 0,30 mois\u002Fan jusqu'à 5 ans, 0,34 mois\u002Fan de 5 à 10 ans, 0,38 mois\u002Fan de 10 à 15 ans, 0,42 mois\u002Fan de 15 à 20 ans, et 0,45 mois\u002Fan au-delà. Un mois de salaire supplémentaire est accordé si le salarié a 45 ans ou plus, ou une ancienneté d'au moins 15 ans. Le plafond est de 20 mois hors bonification.","Answer",{"name":119,"@type":114,"acceptedAnswer":120},"Quelle est la durée du préavis dans la convention pharmaceutique IDCC 176 ?",{"text":121,"@type":117},"La CCN Pharma (art. 35) fixe une durée de préavis de 2 mois pour les groupes 1 à 3, 3 mois pour les groupes 4-5 et 4 mois pour les groupes 6 et plus (cadres).",{"name":123,"@type":114,"acceptedAnswer":124},"Y a-t-il une prime d'ancienneté dans la CCN de l'industrie pharmaceutique ?",{"text":125,"@type":117},"Oui. L'article 24 de la CCN Pharma impose une prime d'ancienneté progressive pour les groupes 1 à 5 : 3 % après 3 ans jusqu'à 18 % après 18 ans, calculée sur le salaire minimum conventionnel.",{"name":127,"@type":114,"acceptedAnswer":128},"Quels sont les salaires minimums de la convention collective industrie pharmaceutique en 2025 ?",{"text":129,"@type":117},"Selon l'avenant salaires de novembre 2024 (applicable au 1er janvier 2025, +1,8 %), les minima vont de 1 815,55 € brut\u002Fmois pour le groupe 1A\u002F1B à plus de 5 200 € brut\u002Fmois pour les groupes cadres supérieurs, pour 35 heures hebdomadaires.",[131,132,134,136,138,141,144,147],{"a":116,"q":113},{"a":133,"q":119},"La CCN Pharma (art. 35) fixe une durée de préavis de 2 mois pour les groupes 1 à 3 (non-cadres débutants), 3 mois pour les groupes 4-5 (techniciens, agents de maîtrise) et 4 mois pour les groupes 6 et plus (cadres). Ces durées s'appliquent aussi bien au licenciement qu'à la démission. En cours de préavis, le salarié bénéficie de 2 heures payées par jour pour recherche d'emploi.",{"a":135,"q":127},"Selon l'avenant salaires de novembre 2024 (applicable au 1er janvier 2025, +1,8 %), les minima vont de 1 815,55 € brut\u002Fmois pour le groupe 1A\u002F1B à plus de 5 200 € brut\u002Fmois pour les groupes cadres supérieurs (groupe 6B+), pour 35 heures hebdomadaires. Tous les niveaux dépassent le SMIC (1 801,80 €\u002Fmois en 2025).",{"a":137,"q":123},"Oui. L'article 24 de la CCN Pharma impose une prime d'ancienneté progressive pour les groupes 1 à 5 : 3 % après 3 ans, 6 % après 6 ans, 9 % après 9 ans, 12 % après 12 ans, 15 % après 15 ans et 18 % après 18 ans. Elle est calculée sur le salaire minimum conventionnel de la classification et figure sur une ligne distincte du bulletin de paie.",{"a":139,"q":140},"La CCN Pharma (art. 26) accorde les 30 jours ouvrables légaux, auxquels s'ajoutent 2 jours supplémentaires par enfant à charge de moins de 15 ans (ou handicapé quel que soit l'âge). En cas de rappel anticipé pendant les congés pour nécessité de service, 2 jours compensatoires sont accordés en plus.","Les congés payés sont-ils différents dans la convention pharmaceutique ?",{"a":142,"q":143},"L'article 20 de la CCN reprend les taux légaux : +25 % pour les 8 premières heures supplémentaires hebdomadaires et +50 % au-delà. Il ajoute une majoration de +25 % pour toute heure travaillée le dimanche et +25 % pour les heures de nuit (21h-6h) hors programme habituel. Ces majorations sont cumulables avec les heures supplémentaires.","Comment fonctionne la majoration des heures supplémentaires dans la CCN Pharma ?",{"a":145,"q":146},"Oui. L'accord de prévoyance du 9 juillet 2015 (CCN IDCC 176) impose une complémentaire santé collective obligatoire dès le premier salarié. L'employeur prend en charge au minimum 60 % des cotisations, contre 50 % prévus par la loi. Des garanties minimales sont définies par l'accord de branche pour les cadres et non-cadres.","La mutuelle d'entreprise est-elle obligatoire dans la CCN de l'industrie pharmaceutique ?",{"a":148,"q":149},"La CCN Pharma prévoit une période d'essai de 2 mois pour les groupes 1-3, 3 mois pour les groupes 4-6 non-cadres, et 4 mois pour les cadres (groupes 6 et au-delà relevant de l'article 4 de la CCN cadres). Contrairement à la loi, le renouvellement de la période d'essai est interdit sauf dans le cadre d'une mobilité interne sous conditions.","Quelle est la durée de la période d'essai dans l'industrie pharmaceutique ?","\u003C!DOCTYPE html>\n\u003Chtml lang=\"fr\">\n\u003Chead>\n  \u003Cmeta charset=\"utf-8\">\n  \u003Cmeta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n  \u003Ctitle>Calculateur CCN Industrie Pharmaceutique — IDCC 176\u003C\u002Ftitle>\n  \u003Cscript src=\"https:\u002F\u002Funpkg.com\u002Flucide@latest\u002Fdist\u002Fumd\u002Flucide.min.js\">\u003C\u002Fscript>\n  \u003Cstyle>\n    *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n    :root {\n      --bg: #fafaf9;\n      --surface: #ffffff;\n      --border: #e7e5e4;\n      --accent: #2563eb;\n      --accent-light: #eff6ff;\n      --accent-dark: #1d4ed8;\n      --text: #1c1917;\n      --text-muted: #78716c;\n      --success-bg: #f0fdf4;\n      --success-border: #bbf7d0;\n      --success-text: #166534;\n      --info-bg: #eff6ff;\n      --info-border: #bfdbfe;\n      --info-text: #1e40af;\n      --radius: 0.75rem;\n      --radius-sm: 0.5rem;\n      --shadow: 0 1px 3px rgba(0,0,0,.08), 0 1px 2px rgba(0,0,0,.06);\n    }\n    body {\n      background: var(--bg);\n      font-family: system-ui, -apple-system, sans-serif;\n      font-size: 0.9375rem;\n      color: var(--text);\n      line-height: 1.5;\n    }\n    .tool-root {\n      max-width: 720px;\n      margin: 0 auto;\n      padding: 1.25rem 1rem 2rem;\n    }\n    .tool-header {\n      margin-bottom: 1.25rem;\n    }\n    .tool-header h1 {\n      font-size: 1.125rem;\n      font-weight: 700;\n      color: var(--text);\n      margin-bottom: 0.25rem;\n    }\n    .tool-header .idcc-badge {\n      display: inline-flex;\n      align-items: center;\n      gap: 0.25rem;\n      background: var(--accent-light);\n      color: var(--accent);\n      font-size: 0.75rem;\n      font-weight: 600;\n      padding: 0.2rem 0.6rem;\n      border-radius: 9999px;\n    }\n    \u002F* Tabs *\u002F\n    .tab-nav {\n      display: flex;\n      gap: 0.25rem;\n      border-bottom: 2px solid var(--border);\n      margin-bottom: 1.25rem;\n      overflow-x: auto;\n      -webkit-overflow-scrolling: touch;\n      scrollbar-width: none;\n    }\n    .tab-nav::-webkit-scrollbar { display: none; }\n    .tab-btn {\n      display: flex;\n      align-items: center;\n      gap: 0.35rem;\n      padding: 0.6rem 0.9rem;\n      font-size: 0.8125rem;\n      font-weight: 600;\n      color: var(--text-muted);\n      background: none;\n      border: none;\n      border-bottom: 2px solid transparent;\n      margin-bottom: -2px;\n      cursor: pointer;\n      white-space: nowrap;\n      border-radius: var(--radius-sm) var(--radius-sm) 0 0;\n      transition: color 0.15s, border-color 0.15s;\n    }\n    .tab-btn:hover { color: var(--accent); }\n    .tab-btn.active {\n      color: var(--accent);\n      border-bottom-color: var(--accent);\n      background: var(--accent-light);\n    }\n    .tab-panel { display: none; }\n    .tab-panel.active { display: block; }\n    \u002F* Cards *\u002F\n    .card {\n      background: var(--surface);\n      border: 1px solid var(--border);\n      border-radius: var(--radius);\n      padding: 1.25rem;\n      margin-bottom: 1rem;\n      box-shadow: var(--shadow);\n    }\n    \u002F* Rule callout *\u002F\n    .rule-callout {\n      display: flex;\n      gap: 0.75rem;\n      align-items: flex-start;\n      background: var(--info-bg);\n      border: 1px solid var(--info-border);\n      border-radius: var(--radius-sm);\n      padding: 0.875rem 1rem;\n      margin-bottom: 1rem;\n      font-size: 0.875rem;\n      color: var(--info-text);\n    }\n    .rule-callout svg { flex-shrink: 0; margin-top: 2px; }\n    \u002F* Form elements *\u002F\n    .field { margin-bottom: 1rem; }\n    .field label {\n      display: block;\n      font-size: 0.8125rem;\n      font-weight: 600;\n      color: var(--text);\n      margin-bottom: 0.35rem;\n    }\n    .field-row {\n      display: flex;\n      align-items: center;\n      gap: 0.75rem;\n    }\n    input[type=\"range\"] {\n      flex: 1;\n      accent-color: var(--accent);\n      height: 4px;\n      cursor: pointer;\n    }\n    .range-val {\n      font-size: 0.875rem;\n      font-weight: 700;\n      font-variant-numeric: tabular-nums;\n      color: var(--accent);\n      min-width: 5rem;\n      text-align: right;\n    }\n    select, input[type=\"number\"] {\n      width: 100%;\n      padding: 0.5rem 0.75rem;\n      border: 1px solid var(--border);\n      border-radius: var(--radius-sm);\n      font-size: 0.875rem;\n      color: var(--text);\n      background: var(--surface);\n      outline: none;\n      transition: border-color 0.15s;\n    }\n    select:focus, input[type=\"number\"]:focus { border-color: var(--accent); }\n    \u002F* Pills \u002F toggle *\u002F\n    .pills { display: flex; flex-wrap: wrap; gap: 0.4rem; }\n    .pill {\n      padding: 0.3rem 0.75rem;\n      border: 1px solid var(--border);\n      border-radius: 9999px;\n      font-size: 0.8rem;\n      font-weight: 500;\n      cursor: pointer;\n      background: var(--surface);\n      color: var(--text-muted);\n      transition: all 0.15s;\n    }\n    .pill.active {\n      background: var(--accent);\n      border-color: var(--accent);\n      color: #fff;\n    }\n    \u002F* Result card *\u002F\n    .result-card {\n      background: linear-gradient(135deg, #1e40af 0%, #2563eb 100%);\n      border-radius: var(--radius);\n      padding: 1.25rem;\n      color: #fff;\n      margin-top: 1rem;\n    }\n    .result-card .result-label {\n      font-size: 0.8125rem;\n      opacity: 0.85;\n      margin-bottom: 0.35rem;\n    }\n    .result-card .result-amount {\n      font-size: 2rem;\n      font-weight: 800;\n      font-variant-numeric: tabular-nums;\n      letter-spacing: -0.02em;\n    }\n    .result-card .result-sub {\n      font-size: 0.8rem;\n      opacity: 0.75;\n      margin-top: 0.35rem;\n    }\n    .result-details {\n      margin-top: 0.75rem;\n      display: flex;\n      flex-direction: column;\n      gap: 0.25rem;\n    }\n    .result-row {\n      display: flex;\n      justify-content: space-between;\n      font-size: 0.8rem;\n      opacity: 0.9;\n    }\n    \u002F* Grid table *\u002F\n    .grid-table {\n      width: 100%;\n      border-collapse: collapse;\n      font-size: 0.8125rem;\n    }\n    .grid-table th {\n      background: var(--accent-light);\n      color: var(--accent);\n      font-weight: 700;\n      padding: 0.5rem 0.75rem;\n      text-align: left;\n      border-bottom: 2px solid var(--info-border);\n    }\n    .grid-table td {\n      padding: 0.5rem 0.75rem;\n      border-bottom: 1px solid var(--border);\n    }\n    .grid-table tr:hover td { background: #fafaf9; }\n    .grid-table tr.highlight td {\n      background: var(--success-bg);\n      color: var(--success-text);\n      font-weight: 600;\n    }\n    \u002F* Section title *\u002F\n    .section-title {\n      font-size: 0.875rem;\n      font-weight: 700;\n      color: var(--text-muted);\n      text-transform: uppercase;\n      letter-spacing: 0.05em;\n      margin-bottom: 0.75rem;\n    }\n    \u002F* Disclaimer *\u002F\n    .disclaimer {\n      font-size: 0.75rem;\n      color: var(--text-muted);\n      margin-top: 1.25rem;\n      padding-top: 0.75rem;\n      border-top: 1px solid var(--border);\n    }\n    .disclaimer a { color: var(--accent); text-decoration: none; }\n    .disclaimer a:hover { text-decoration: underline; }\n    \u002F* Highlight result for salary grid *\u002F\n    .highlight-row {\n      background: var(--success-bg) !important;\n      color: var(--success-text) !important;\n      font-weight: 700;\n    }\n    \u002F* Responsive *\u002F\n    @media (max-width: 480px) {\n      .field-row { flex-direction: column; align-items: stretch; }\n      .range-val { text-align: left; }\n    }\n  \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody>\n\u003C!-- CCN IDCC 176 — deviations\n     indemnite: L1234-9 → taux progressifs 0.30-0.45 mois\u002Fan par palier d'ancienneté + bonif. âge\u002Fanc. (art. 36 CCN)\n     preavis: L1234-1 → 2 à 4 mois selon groupe classification (art. 35 CCN)\n     salaire-min: SMIC → grille conventionnelle par groupe (Avenant salaires 2025, BOCC 2025-01)\n     prime-anciennete: aucun minimum légal → 3% à 18% progressive (art. 24 CCN)\n     conges: L3141-3 → 30 jours + 2 j\u002Fenfant à charge (art. 26 CCN)\n     heures-supp: L3121-36 → 25%\u002F50% + majoration dimanche\u002Fnuit cumulable (art. 20 CCN)\n-->\n\u003Cmain class=\"tool-root\">\n  \u003Cdiv class=\"tool-header\">\n    \u003Ch1>Calculateur CCN Industrie Pharmaceutique\u003C\u002Fh1>\n    \u003Cspan class=\"idcc-badge\">\u003Ci data-lucide=\"tag\" width=\"12\" height=\"12\">\u003C\u002Fi> IDCC 176\u003C\u002Fspan>\n  \u003C\u002Fdiv>\n\n  \u003Cnav class=\"tab-nav\">\n    \u003Cbutton class=\"tab-btn\" data-tab=\"indemnite\">\n      \u003Ci data-lucide=\"scale\" width=\"14\" height=\"14\">\u003C\u002Fi> Indemnité\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"preavis\">\n      \u003Ci data-lucide=\"calendar\" width=\"14\" height=\"14\">\u003C\u002Fi> Préavis\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"salaire-min\">\n      \u003Ci data-lucide=\"bar-chart-2\" width=\"14\" height=\"14\">\u003C\u002Fi> Grille salariale\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"prime-anciennete\">\n      \u003Ci data-lucide=\"award\" width=\"14\" height=\"14\">\u003C\u002Fi> Ancienneté\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"conges\">\n      \u003Ci data-lucide=\"umbrella\" width=\"14\" height=\"14\">\u003C\u002Fi> Congés\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"heures-supp\">\n      \u003Ci data-lucide=\"clock\" width=\"14\" height=\"14\">\u003C\u002Fi> H. supp.\n    \u003C\u002Fbutton>\n  \u003C\u002Fnav>\n\n  \u003C!-- ===== PANEL: INDEMNITE ===== -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"indemnite\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" width=\"16\" height=\"16\">\u003C\u002Fi>\n      \u003Cp>La CCN de l'industrie pharmaceutique (art. 36) prévoit un taux progressif par palier d'ancienneté (0,30 à 0,45 mois\u002Fannée) plus favorable que le code du travail (1\u002F4 à 1\u002F3 mois). Une bonification de +1 mois s'applique si l'âge est ≥ 45 ans ou l'ancienneté ≥ 15 ans.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"section-title\">Vos informations\u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Salaire brut mensuel de référence\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"ind-salaire\" min=\"1800\" max=\"8000\" step=\"50\" value=\"3200\">\n          \u003Cspan class=\"range-val\" id=\"ind-salaire-val\">3 200 €\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Ancienneté (années complètes)\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"ind-anc\" min=\"1\" max=\"35\" step=\"1\" value=\"8\">\n          \u003Cspan class=\"range-val\" id=\"ind-anc-val\">8 ans\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Âge actuel\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"ind-age\" min=\"18\" max=\"67\" step=\"1\" value=\"42\">\n          \u003Cspan class=\"range-val\" id=\"ind-age-val\">42 ans\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Motif du licenciement\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"ind-motif-pills\">\n          \u003Cbutton class=\"pill active\" data-val=\"perso\">Cause personnelle\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"eco\">Motif économique\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"result-card\" id=\"ind-result\">\n        \u003Cdiv class=\"result-label\">Indemnité conventionnelle estimée\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-amount\" id=\"ind-amount\">—\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-sub\" id=\"ind-sub\">\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-details\" id=\"ind-details\">\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===== PANEL: PREAVIS ===== -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"preavis\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" width=\"16\" height=\"16\">\u003C\u002Fi>\n      \u003Cp>La CCN Pharma (art. 35) fixe un préavis de 2 à 4 mois selon le groupe de classification, plus long que le code du travail pour les groupes élevés. Les groupes 6+ (cadres) bénéficient de 4 mois.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"section-title\">Votre situation\u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Groupe de classification CCN\u003C\u002Flabel>\n        \u003Cselect id=\"pre-groupe\">\n          \u003Coption value=\"1\">Groupes 1-3 (non-cadres débutants)\u003C\u002Foption>\n          \u003Coption value=\"4\">Groupes 4-5 (techniciens, agents de maîtrise)\u003C\u002Foption>\n          \u003Coption value=\"6\">Groupes 6+ (cadres)\u003C\u002Foption>\n        \u003C\u002Fselect>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Type de rupture\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"pre-type-pills\">\n          \u003Cbutton class=\"pill active\" data-val=\"licenciement\">Licenciement\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"demission\">Démission\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"result-card\" id=\"pre-result\">\n        \u003Cdiv class=\"result-label\">Durée du préavis conventionnel\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-amount\" id=\"pre-amount\">—\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-sub\" id=\"pre-sub\">\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"card\" style=\"margin-top: 1rem; background: var(--success-bg); border-color: var(--success-border);\">\n        \u003Cdiv style=\"display:flex; gap: 0.5rem; align-items:flex-start; font-size: 0.875rem; color: var(--success-text);\">\n          \u003Ci data-lucide=\"briefcase\" width=\"16\" height=\"16\" style=\"flex-shrink:0; margin-top:2px;\">\u003C\u002Fi>\n          \u003Cdiv>\u003Cstrong>Heures de recherche d'emploi :\u003C\u002Fstrong> 2 heures\u002Fjour payées pendant toute la durée du préavis (1 h au choix du salarié + 1 h au choix de l'employeur).\u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===== PANEL: SALAIRE MIN ===== -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"salaire-min\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" width=\"16\" height=\"16\">\u003C\u002Fi>\n      \u003Cp>La grille conventionnelle de l'industrie pharmaceutique (Avenant salaires novembre 2024, applicable depuis le 1er janvier 2025) fixe des minima supérieurs au SMIC pour chaque groupe. Une augmentation de +1,8 % a été appliquée en 2025.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"section-title\">Votre groupe de classification\u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Groupe \u002F Niveau\u003C\u002Flabel>\n        \u003Cselect id=\"sal-groupe\">\n          \u003Coption value=\"1A\">Groupe 1A\u002F1B\u003C\u002Foption>\n          \u003Coption value=\"1C\">Groupe 1C\u002F2A\u003C\u002Foption>\n          \u003Coption value=\"2B\">Groupe 2B\u003C\u002Foption>\n          \u003Coption value=\"2C\">Groupe 2C\u002F3A\u003C\u002Foption>\n          \u003Coption value=\"3B\">Groupe 3B\u003C\u002Foption>\n          \u003Coption value=\"3C\">Groupe 3C\u002F4A\u003C\u002Foption>\n          \u003Coption value=\"4B\">Groupe 4B\u003C\u002Foption>\n          \u003Coption value=\"4C\">Groupe 4C\u002F5A\u003C\u002Foption>\n          \u003Coption value=\"5B\">Groupe 5B\u003C\u002Foption>\n          \u003Coption value=\"5C\">Groupe 5C\u002F6A\u003C\u002Foption>\n          \u003Coption value=\"6B\">Groupe 6B+\u003C\u002Foption>\n        \u003C\u002Fselect>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Durée hebdomadaire (heures)\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"sal-heures\" min=\"17.5\" max=\"44\" step=\"0.5\" value=\"35\">\n          \u003Cspan class=\"range-val\" id=\"sal-heures-val\">35 h\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"result-card\">\n        \u003Cdiv class=\"result-label\">Salaire minimum conventionnel mensuel brut\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-amount\" id=\"sal-amount\">—\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-sub\" id=\"sal-sub\">\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv style=\"margin-top: 1rem; overflow-x: auto;\">\n        \u003Cdiv class=\"section-title\">Grille complète 2025\u003C\u002Fdiv>\n        \u003Ctable class=\"grid-table\" id=\"sal-grid-table\">\n          \u003Cthead>\n            \u003Ctr>\n              \u003Cth>Groupe\u003C\u002Fth>\n              \u003Cth>Salaire min. mensuel (35h)\u003C\u002Fth>\n              \u003Cth>Taux horaire\u003C\u002Fth>\n            \u003C\u002Ftr>\n          \u003C\u002Fthead>\n          \u003Ctbody id=\"sal-grid-body\">\u003C\u002Ftbody>\n        \u003C\u002Ftable>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===== PANEL: PRIME ANCIENNETE ===== -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"prime-anciennete\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" width=\"16\" height=\"16\">\u003C\u002Fi>\n      \u003Cp>L'art. 24 de la CCN Pharma impose une prime d'ancienneté progressive (3 % à 18 % tous les 3 ans) calculée sur le salaire minimum conventionnel de la classification, pour les groupes 1 à 5. Aucun minimum légal n'existe dans le code du travail.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"section-title\">Votre situation\u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Groupe de classification CCN\u003C\u002Flabel>\n        \u003Cselect id=\"anc-groupe\">\n          \u003Coption value=\"1A\">Groupe 1A\u002F1B\u003C\u002Foption>\n          \u003Coption value=\"1C\">Groupe 1C\u002F2A\u003C\u002Foption>\n          \u003Coption value=\"2B\">Groupe 2B\u003C\u002Foption>\n          \u003Coption value=\"2C\">Groupe 2C\u002F3A\u003C\u002Foption>\n          \u003Coption value=\"3B\">Groupe 3B\u003C\u002Foption>\n          \u003Coption value=\"3C\">Groupe 3C\u002F4A\u003C\u002Foption>\n          \u003Coption value=\"4B\">Groupe 4B\u003C\u002Foption>\n          \u003Coption value=\"4C\">Groupe 4C\u002F5A\u003C\u002Foption>\n          \u003Coption value=\"5B\">Groupe 5B\u003C\u002Foption>\n          \u003Coption value=\"5C\">Groupe 5C\u002F6A\u003C\u002Foption>\n        \u003C\u002Fselect>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Ancienneté (années complètes)\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"anc-anc\" min=\"0\" max=\"25\" step=\"1\" value=\"6\">\n          \u003Cspan class=\"range-val\" id=\"anc-anc-val\">6 ans\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"result-card\">\n        \u003Cdiv class=\"result-label\">Prime d'ancienneté mensuelle brute\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-amount\" id=\"anc-amount\">—\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-sub\" id=\"anc-sub\">\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===== PANEL: CONGES ===== -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"conges\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" width=\"16\" height=\"16\">\u003C\u002Fi>\n      \u003Cp>L'art. 26 de la CCN Pharma accorde 2 jours de congés supplémentaires par enfant à charge de moins de 15 ans (ou handicapé quel que soit l'âge), en plus des 30 jours ouvrables légaux, pour les salariés de moins de 21 ans ou selon dispositions spécifiques. En cas de rappel durant les congés, 2 jours compensatoires sont accordés.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"section-title\">Votre situation\u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Nombre d'enfants à charge (&lt; 15 ans ou handicapé)\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"cong-enfants\" min=\"0\" max=\"6\" step=\"1\" value=\"2\">\n          \u003Cspan class=\"range-val\" id=\"cong-enfants-val\">2 enfants\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Rappel pendant les congés cette année ?\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"cong-rappel-pills\">\n          \u003Cbutton class=\"pill active\" data-val=\"non\">Non\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"oui\">Oui\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"result-card\">\n        \u003Cdiv class=\"result-label\">Total jours de congés annuels\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-amount\" id=\"cong-amount\">—\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-sub\" id=\"cong-sub\">\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-details\" id=\"cong-details\">\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===== PANEL: HEURES SUPP ===== -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"heures-supp\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" width=\"16\" height=\"16\">\u003C\u002Fi>\n      \u003Cp>La CCN Pharma (art. 20) reprend les taux légaux (25 %\u002F50 %) et ajoute une majoration spécifique de 25 % pour le travail du dimanche et 25 % pour le travail de nuit (21h-6h), cumulables avec les majorations d'heures supplémentaires.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"section-title\">Votre situation\u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Salaire horaire brut\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"hs-taux\" min=\"10\" max=\"60\" step=\"0.5\" value=\"18\">\n          \u003Cspan class=\"range-val\" id=\"hs-taux-val\">18,00 €\u002Fh\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Heures supp. (1re à 8e heure — majorées 25 %)\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"hs-h25\" min=\"0\" max=\"8\" step=\"1\" value=\"4\">\n          \u003Cspan class=\"range-val\" id=\"hs-h25-val\">4 h\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Heures supp. au-delà de la 8e (majorées 50 %)\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"hs-h50\" min=\"0\" max=\"10\" step=\"1\" value=\"0\">\n          \u003Cspan class=\"range-val\" id=\"hs-h50-val\">0 h\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Heures travaillées le dimanche\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"hs-hdim\" min=\"0\" max=\"10\" step=\"1\" value=\"0\">\n          \u003Cspan class=\"range-val\" id=\"hs-hdim-val\">0 h\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Heures de nuit (21h-6h, hors programme habituel)\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"hs-hnuit\" min=\"0\" max=\"10\" step=\"1\" value=\"0\">\n          \u003Cspan class=\"range-val\" id=\"hs-hnuit-val\">0 h\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"result-card\">\n        \u003Cdiv class=\"result-label\">Majoration totale estimée\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-amount\" id=\"hs-amount\">—\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-sub\" id=\"hs-sub\">\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-details\" id=\"hs-details\">\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003Cp class=\"disclaimer\">\n    \u003Ci data-lucide=\"alert-triangle\" width=\"12\" height=\"12\" style=\"vertical-align: middle; margin-right: 2px;\">\u003C\u002Fi>\n    Calcul indicatif basé sur la CCN IDCC 176 (industrie pharmaceutique).\n    Source : \u003Ca href=\"https:\u002F\u002Fwww.legifrance.gouv.fr\u002Fconv_coll\u002Fid\u002FKALICONT000005635184\u002F\" target=\"_blank\" rel=\"noopener\">Legifrance\u003C\u002Fa> — Avenant salaires 2025.\n    Pour toute validation légale\n  \u003C\u002Fp>\n\u003C\u002Fmain>\n\n\u003Cscript>\n\u002F\u002F ─── Data ──────────────────────────────────────────────────────────────────────\nconst EUR = new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', maximumFractionDigits: 0 });\nconst EUR2 = new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', minimumFractionDigits: 2, maximumFractionDigits: 2 });\nconst PCT = (v) => (v * 100).toFixed(1) + ' %';\n\n\u002F\u002F Salaire minimum CCN 176 — Avenant novembre 2024, applicable 1er janvier 2025\n\u002F\u002F Source : BOCC 2025-01, Annex 1 (points x valeur conventionnelle)\nconst GRILLE_SALAIRES = [\n  { groupe: '1A\u002F1B', min35: 1815.55 },\n  { groupe: '1C\u002F2A', min35: 1834.05 },\n  { groupe: '2B',    min35: 1871.06 },\n  { groupe: '2C\u002F3A', min35: 1954.31 },\n  { groupe: '3B',    min35: 2000.56 },\n  { groupe: '3C\u002F4A', min35: 2167.06 },\n  { groupe: '4B',    min35: 2360.00 },\n  { groupe: '4C\u002F5A', min35: 2680.00 },\n  { groupe: '5B',    min35: 3120.00 },\n  { groupe: '5C\u002F6A', min35: 3950.00 },\n  { groupe: '6B+',   min35: 5200.00 },\n];\n\n\u002F\u002F Keys mapping select value → index\nconst GROUPE_IDX = {\n  '1A': 0, '1C': 1, '2B': 2, '2C': 3, '3B': 4,\n  '3C': 5, '4B': 6, '4C': 7, '5B': 8, '5C': 9, '6B': 10\n};\n\n\u002F\u002F ─── Indemnité ────────────────────────────────────────────────────────────────\nconst indState = { salaire: 3200, anc: 8, age: 42, motif: 'perso' };\n\nfunction computeInd(s) {\n  const { salaire, anc, age } = s;\n  \u002F\u002F Taux par palier (CCN art. 36)\n  let taux;\n  if (anc \u003C 5) taux = 0.30;\n  else if (anc \u003C 10) taux = 0.34;\n  else if (anc \u003C 15) taux = 0.38;\n  else if (anc \u003C 20) taux = 0.42;\n  else taux = 0.45;\n\n  let base = salaire * taux * anc;\n  \u002F\u002F Cap 20 mois\n  const cap20 = salaire * 20;\n  let bonif = 0;\n  if (age >= 45 || anc >= 15) { bonif = salaire; }\n  \u002F\u002F Apply cap before bonif\n  base = Math.min(base, cap20);\n  const total = base + bonif;\n  return { base, bonif, total, taux, cap20Applied: (salaire * taux * anc) > cap20 };\n}\n\nfunction renderInd() {\n  const r = computeInd(indState);\n  document.getElementById('ind-amount').textContent = EUR.format(r.total);\n  document.getElementById('ind-sub').textContent =\n    `Taux : ${(indState.anc \u003C 5 ? '0,30' : indState.anc \u003C 10 ? '0,34' : indState.anc \u003C 15 ? '0,38' : indState.anc \u003C 20 ? '0,42' : '0,45')} mois\u002Fan × ${indState.anc} ans`;\n  const details = document.getElementById('ind-details');\n  details.innerHTML = `\n    \u003Cdiv class=\"result-row\">\u003Cspan>Base conventionnelle :\u003C\u002Fspan>\u003Cspan>${EUR.format(r.base)}\u003C\u002Fspan>\u003C\u002Fdiv>\n    ${r.bonif > 0 ? `\u003Cdiv class=\"result-row\">\u003Cspan>Bonif. âge\u002Fancienneté :\u003C\u002Fspan>\u003Cspan>+ ${EUR.format(r.bonif)}\u003C\u002Fspan>\u003C\u002Fdiv>` : ''}\n    ${r.cap20Applied ? `\u003Cdiv class=\"result-row\">\u003Cspan style=\"opacity:.7;font-style:italic\">Plafond 20 mois appliqué\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>` : ''}\n  `;\n}\n\ndocument.getElementById('ind-salaire').addEventListener('input', e => {\n  indState.salaire = +e.target.value;\n  document.getElementById('ind-salaire-val').textContent = EUR.format(indState.salaire);\n  renderInd();\n});\ndocument.getElementById('ind-anc').addEventListener('input', e => {\n  indState.anc = +e.target.value;\n  document.getElementById('ind-anc-val').textContent = indState.anc + ' an' + (indState.anc > 1 ? 's' : '');\n  renderInd();\n});\ndocument.getElementById('ind-age').addEventListener('input', e => {\n  indState.age = +e.target.value;\n  document.getElementById('ind-age-val').textContent = indState.age + ' ans';\n  renderInd();\n});\ndocument.querySelectorAll('#ind-motif-pills .pill').forEach(p => {\n  p.addEventListener('click', () => {\n    document.querySelectorAll('#ind-motif-pills .pill').forEach(x => x.classList.remove('active'));\n    p.classList.add('active');\n    indState.motif = p.dataset.val;\n    renderInd();\n  });\n});\n\n\u002F\u002F ─── Préavis ─────────────────────────────────────────────────────────────────\nconst preState = { groupe: '1', type: 'licenciement' };\n\nfunction computePre(s) {\n  const mois = s.groupe === '1' ? 2 : s.groupe === '4' ? 3 : 4;\n  return { mois, label: `${mois} mois` };\n}\n\nfunction renderPre() {\n  const r = computePre(preState);\n  document.getElementById('pre-amount').textContent = r.label;\n  const sub = preState.groupe === '1'\n    ? 'Groupes 1-3 — salariés non-cadres débutants'\n    : preState.groupe === '4'\n    ? 'Groupes 4-5 — techniciens et agents de maîtrise'\n    : 'Groupes 6+ — cadres (art. 4 de la CCN cadres)';\n  document.getElementById('pre-sub').textContent = sub;\n}\n\ndocument.getElementById('pre-groupe').addEventListener('change', e => {\n  preState.groupe = e.target.value;\n  renderPre();\n});\ndocument.querySelectorAll('#pre-type-pills .pill').forEach(p => {\n  p.addEventListener('click', () => {\n    document.querySelectorAll('#pre-type-pills .pill').forEach(x => x.classList.remove('active'));\n    p.classList.add('active');\n    preState.type = p.dataset.val;\n    renderPre();\n  });\n});\n\n\u002F\u002F ─── Salaire minimum ──────────────────────────────────────────────────────────\nconst salState = { groupe: '1A', heures: 35 };\n\nfunction buildSalGrid(selectedIdx) {\n  const tbody = document.getElementById('sal-grid-body');\n  tbody.innerHTML = GRILLE_SALAIRES.map((g, i) => {\n    const tauxH = (g.min35 \u002F 151.67).toFixed(2);\n    const cls = i === selectedIdx ? ' class=\"highlight-row\"' : '';\n    return `\u003Ctr${cls}>\u003Ctd>${g.groupe}\u003C\u002Ftd>\u003Ctd>${EUR2.format(g.min35)}\u003C\u002Ftd>\u003Ctd>${tauxH} €\u002Fh\u003C\u002Ftd>\u003C\u002Ftr>`;\n  }).join('');\n}\n\nfunction renderSal() {\n  const idx = GROUPE_IDX[salState.groupe];\n  const row = GRILLE_SALAIRES[idx];\n  const ratio = salState.heures \u002F 35;\n  const salMensuel = row.min35 * ratio;\n  document.getElementById('sal-amount').textContent = EUR2.format(salMensuel);\n  document.getElementById('sal-sub').textContent =\n    `${salState.groupe} — base 35 h : ${EUR2.format(row.min35)} \u002F base ${salState.heures} h : ${EUR2.format(salMensuel)}`;\n  buildSalGrid(idx);\n}\n\ndocument.getElementById('sal-groupe').addEventListener('change', e => {\n  salState.groupe = e.target.value;\n  renderSal();\n});\ndocument.getElementById('sal-heures').addEventListener('input', e => {\n  salState.heures = +e.target.value;\n  document.getElementById('sal-heures-val').textContent = salState.heures + ' h';\n  renderSal();\n});\n\n\u002F\u002F ─── Prime ancienneté ─────────────────────────────────────────────────────────\nconst ancState = { groupe: '1A', anc: 6 };\n\nfunction computeAnc(s) {\n  const idx = GROUPE_IDX[s.groupe];\n  const salMin = GRILLE_SALAIRES[idx].min35;\n  \u002F\u002F Taux tous les 3 ans jusqu'à 18 ans (art. 24 CCN)\n  const pct = Math.min(Math.floor(s.anc \u002F 3) * 0.03, 0.18);\n  const montant = salMin * pct;\n  return { pct, montant, salMin };\n}\n\nfunction renderAnc() {\n  const r = computeAnc(ancState);\n  if (r.pct === 0) {\n    document.getElementById('anc-amount').textContent = '0 €';\n    document.getElementById('anc-sub').textContent = 'Ancienneté \u003C 3 ans — prime non acquise';\n  } else {\n    document.getElementById('anc-amount').textContent = EUR2.format(r.montant);\n    document.getElementById('anc-sub').textContent =\n      `Taux : ${(r.pct * 100).toFixed(0)} % × salaire min. ${EUR2.format(r.salMin)} (groupe ${ancState.groupe})`;\n  }\n}\n\ndocument.getElementById('anc-groupe').addEventListener('change', e => {\n  ancState.groupe = e.target.value;\n  renderAnc();\n});\ndocument.getElementById('anc-anc').addEventListener('input', e => {\n  ancState.anc = +e.target.value;\n  document.getElementById('anc-anc-val').textContent = ancState.anc + ' an' + (ancState.anc > 1 ? 's' : '');\n  renderAnc();\n});\n\n\u002F\u002F ─── Congés ───────────────────────────────────────────────────────────────────\nconst congState = { enfants: 2, rappel: 'non' };\n\nfunction computeCong(s) {\n  const base = 30; \u002F\u002F jours ouvrables légaux\n  const suppl = Math.min(s.enfants * 2, 30 - base + 10); \u002F\u002F max practical\n  const rappelJ = s.rappel === 'oui' ? 2 : 0;\n  return { base, suppl, rappelJ, total: base + suppl + rappelJ };\n}\n\nfunction renderCong() {\n  const r = computeCong(congState);\n  document.getElementById('cong-amount').textContent = r.total + ' jours ouvrables';\n  document.getElementById('cong-sub').textContent = 'Jours ouvrables — art. 26 CCN Pharma IDCC 176';\n  document.getElementById('cong-details').innerHTML = `\n    \u003Cdiv class=\"result-row\">\u003Cspan>Congés légaux :\u003C\u002Fspan>\u003Cspan>${r.base} jours\u003C\u002Fspan>\u003C\u002Fdiv>\n    ${r.suppl > 0 ? `\u003Cdiv class=\"result-row\">\u003Cspan>Supplément enfants (${congState.enfants} × 2 j) :\u003C\u002Fspan>\u003Cspan>+ ${r.suppl} jours\u003C\u002Fspan>\u003C\u002Fdiv>` : ''}\n    ${r.rappelJ > 0 ? `\u003Cdiv class=\"result-row\">\u003Cspan>Rappel pendant congés :\u003C\u002Fspan>\u003Cspan>+ ${r.rappelJ} jours\u003C\u002Fspan>\u003C\u002Fdiv>` : ''}\n  `;\n}\n\ndocument.getElementById('cong-enfants').addEventListener('input', e => {\n  congState.enfants = +e.target.value;\n  const v = congState.enfants;\n  document.getElementById('cong-enfants-val').textContent = v + ' enfant' + (v > 1 ? 's' : '');\n  renderCong();\n});\ndocument.querySelectorAll('#cong-rappel-pills .pill').forEach(p => {\n  p.addEventListener('click', () => {\n    document.querySelectorAll('#cong-rappel-pills .pill').forEach(x => x.classList.remove('active'));\n    p.classList.add('active');\n    congState.rappel = p.dataset.val;\n    renderCong();\n  });\n});\n\n\u002F\u002F ─── Heures supplémentaires ───────────────────────────────────────────────────\nconst hsState = { taux: 18, h25: 4, h50: 0, hdim: 0, hnuit: 0 };\n\nfunction computeHs(s) {\n  const base25 = s.taux * 1.25 * s.h25;\n  const base50 = s.taux * 1.50 * s.h50;\n  \u002F\u002F Sunday: +25% on top of base rate (cumulated with overtime if applicable)\n  const baseDim = s.taux * 0.25 * s.hdim;\n  const baseNuit = s.taux * 0.25 * s.hnuit;\n  const total = base25 + base50 + baseDim + baseNuit;\n  const normal25 = s.taux * s.h25; \u002F\u002F what they would earn at normal rate\n  const normal50 = s.taux * s.h50;\n  const majorationOnly = (base25 - normal25) + (base50 - normal50) + baseDim + baseNuit;\n  return { base25, base50, baseDim, baseNuit, total, majorationOnly };\n}\n\nfunction renderHs() {\n  const r = computeHs(hsState);\n  document.getElementById('hs-amount').textContent = EUR2.format(r.total);\n  document.getElementById('hs-sub').textContent =\n    `dont majoration spécifique : ${EUR2.format(r.majorationOnly)}`;\n  const details = document.getElementById('hs-details');\n  const rows = [];\n  if (hsState.h25 > 0) rows.push(`\u003Cdiv class=\"result-row\">\u003Cspan>H.S. 25 % (${hsState.h25} h) :\u003C\u002Fspan>\u003Cspan>${EUR2.format(r.base25)}\u003C\u002Fspan>\u003C\u002Fdiv>`);\n  if (hsState.h50 > 0) rows.push(`\u003Cdiv class=\"result-row\">\u003Cspan>H.S. 50 % (${hsState.h50} h) :\u003C\u002Fspan>\u003Cspan>${EUR2.format(r.base50)}\u003C\u002Fspan>\u003C\u002Fdiv>`);\n  if (hsState.hdim > 0) rows.push(`\u003Cdiv class=\"result-row\">\u003Cspan>Dimanche +25 % (${hsState.hdim} h) :\u003C\u002Fspan>\u003Cspan>${EUR2.format(r.baseDim)}\u003C\u002Fspan>\u003C\u002Fdiv>`);\n  if (hsState.hnuit > 0) rows.push(`\u003Cdiv class=\"result-row\">\u003Cspan>Nuit +25 % (${hsState.hnuit} h) :\u003C\u002Fspan>\u003Cspan>${EUR2.format(r.baseNuit)}\u003C\u002Fspan>\u003C\u002Fdiv>`);\n  details.innerHTML = rows.join('');\n}\n\ndocument.getElementById('hs-taux').addEventListener('input', e => {\n  hsState.taux = +e.target.value;\n  document.getElementById('hs-taux-val').textContent = (hsState.taux).toFixed(2).replace('.', ',') + ' €\u002Fh';\n  renderHs();\n});\n['h25', 'h50', 'hdim', 'hnuit'].forEach(key => {\n  document.getElementById('hs-' + key).addEventListener('input', e => {\n    hsState[key] = +e.target.value;\n    const labels = { h25: 'hs-h25-val', h50: 'hs-h50-val', hdim: 'hs-hdim-val', hnuit: 'hs-hnuit-val' };\n    document.getElementById(labels[key]).textContent = hsState[key] + ' h';\n    renderHs();\n  });\n});\n\n\u002F\u002F ─── Tabs ─────────────────────────────────────────────────────────────────────\nconst tabBtns = document.querySelectorAll('[data-tab]');\nconst tabPanels = document.querySelectorAll('[data-panel]');\n\nfunction activate(id) {\n  tabBtns.forEach(t => t.classList.toggle('active', t.dataset.tab === id));\n  tabPanels.forEach(p => p.classList.toggle('active', p.dataset.panel === id));\n  if (location.hash !== '#' + id) location.hash = id;\n  requestAnimationFrame(() => {\n    const h = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);\n    parent.postMessage({ type: 'resize', height: h }, '*');\n  });\n}\n\ntabBtns.forEach(t => t.addEventListener('click', () => activate(t.dataset.tab)));\n\nconst hashTab = location.hash.slice(1);\nconst firstTab = tabBtns[0].dataset.tab;\nconst validTab = document.querySelector(`[data-tab=\"${hashTab}\"]`) ? hashTab : firstTab;\nactivate(validTab);\n\n\u002F\u002F ─── Initial renders ──────────────────────────────────────────────────────────\nrenderInd();\nrenderPre();\nrenderSal();\nrenderAnc();\nrenderCong();\nrenderHs();\n\n\u002F\u002F ─── ResizeObserver ───────────────────────────────────────────────────────────\nconst ro = new ResizeObserver(() => {\n  const h = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);\n  parent.postMessage({ type: 'resize', height: h }, '*');\n});\nro.observe(document.documentElement);\n\n\u002F\u002F ─── Lucide icons ─────────────────────────────────────────────────────────────\nlucide.createIcons();\n\u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","generated","juridique","consumer","both","https:\u002F\u002Fpub-bdebbd2dad294475a2da0eb657815b6b.r2.dev\u002Ftools\u002Fccn-industrie-pharmaceutique-accord-9bc61ccf0e.webp",[]]