[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"footer-root-categories-fr-FR":3,"tool-content-ccn-de-l-industrie-pharmaceutique-accord-fr":83,"footer-cities-fr":158},[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":152,"source":153,"category":154,"audience":155,"publish_mode":156,"hero_image":157,"hero_image_alt":85},"ccn-de-l-industrie-pharmaceutique-accord","CCN industrie pharmaceutique — calculateur complet","Calculateur CCN Industrie Pharmaceutique IDCC 176 | Expert Zoom","Outil interactif couvrant l'indemnité de licenciement, le préavis, la grille des salaires, la prime d'ancienneté et les congés de la CCN industrie pharmaceutique (IDCC 176).","Ce calculateur couvre les 5 principales déviations de la convention collective de l'industrie pharmaceutique (IDCC 176) par rapport au code du travail : indemnité de licenciement à taux progressif (art. 36), durée du préavis selon le groupe de classification (art. 35), grille des salaires minimums à 21 niveaux (avenant 2024-2025), prime d'ancienneté obligatoire de 3 % à 18 % (art. 25), et congés supplémentaires pour enfants à charge (art. 26).",[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, la durée du préavis, la grille des salaires minimums, la prime d'ancienneté et les congés payés 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 ?","Question",{"text":116,"@type":117},"La CCN industrie pharmaceutique (IDCC 176, art. 36) applique un taux progressif : 0,30 mois\u002Fan pour les 5 premières années, 0,34 mois\u002Fan de 5 à 10 ans, 0,38 mois\u002Fan de 10 à 15 ans, et 0,41 mois\u002Fan au-delà. Une majoration d'un mois supplémentaire s'applique pour les salariés de plus de 45 ans ou avec 15+ ans d'ancienneté. Plafond : 20 mois.","Answer",{"name":119,"@type":114,"acceptedAnswer":120},"Quelle est la durée du préavis de licenciement dans la convention pharmaceutique IDCC 176 ?",{"text":121,"@type":117},"2 mois pour les groupes 1 à 3, 3 mois pour les groupes 4 à 5, et 4 mois pour le groupe 6 et au-delà (contrats depuis le 01\u002F07\u002F2009). Ces durées dépassent le minimum légal du code du travail.",{"name":123,"@type":114,"acceptedAnswer":124},"Quels sont les salaires minimums de la convention pharmaceutique en 2025 ?",{"text":125,"@type":117},"La grille 2025 comprend 21 niveaux : de 1 815,55 €\u002Fmois (niveau 1A\u002F1B) à 6 829,19 €\u002Fmois (niveau 11), tous supérieurs au SMIC 2025.",{"name":127,"@type":114,"acceptedAnswer":128},"La prime d'ancienneté est-elle obligatoire dans la convention pharmaceutique ?",{"text":129,"@type":117},"Oui, l'article 25 impose une prime progressive de 3 % à partir de 3 ans jusqu'à 18 % à 18 ans d'ancienneté, calculée sur le salaire minimum conventionnel du salarié.",[131,133,135,138,140,143,146,149],{"a":132,"q":113},"La CCN industrie pharmaceutique (IDCC 176, art. 36) applique un taux progressif plus favorable que le code du travail : 0,30 mois de salaire brut par année pour les 5 premières années, 0,34 mois\u002Fan de 5 à 10 ans, 0,38 mois\u002Fan de 10 à 15 ans, et 0,41 mois\u002Fan au-delà de 15 ans. Une majoration d'un mois supplémentaire s'applique si le salarié a plus de 45 ans ou une ancienneté d'au moins 15 ans. Le montant est plafonné à 20 mois de salaire hors majorations.",{"a":134,"q":119},"La durée du préavis est fixée par l'article 35 de la CCN et varie selon le groupe de classification : 2 mois pour les groupes 1 à 3, 3 mois pour les groupes 4 à 5, et 4 mois pour le groupe 6 et au-delà (contrats signés à partir du 01\u002F07\u002F2009). Pour les contrats antérieurs, les groupes 5 et supérieurs bénéficient de 3 mois. Ces durées sont supérieures au minimum légal (1 à 2 mois selon le code du travail).",{"a":136,"q":137},"La grille conventionnelle 2025 (avenant IDCC 176) comprend 21 niveaux de classification, de 1 815,55 € brut\u002Fmois pour le niveau 1A\u002F1B jusqu'à 6 829,19 € pour le niveau 11, calculés sur une base de 151,67 heures mensuelles (35h\u002Fsemaine). Ces minima sont tous supérieurs au SMIC 2025 (1 801,80 €\u002Fmois).","Quels sont les salaires minimums de la convention collective de l'industrie pharmaceutique en 2025 ?",{"a":139,"q":127},"Oui. L'article 25 de la CCN industrie pharmaceutique impose une prime d'ancienneté progressive : 3 % du salaire minimum conventionnel (SMC) à partir de 3 ans d'ancienneté, avec une augmentation de 3 points tous les 3 ans jusqu'à un plafond de 18 % atteint à 18 ans d'ancienneté. Cette prime est versée avec chaque bulletin de paie, indépendamment du salaire réel.",{"a":141,"q":142},"L'article 26 de la CCN industrie pharmaceutique accorde 2 jours ouvrables supplémentaires de congés par enfant à charge de moins de 21 ans au 31 mai de l'année précédente. Un salarié avec 2 enfants bénéficie donc de 34 jours ouvrables par an (30 légaux + 4 supplémentaires), et 36 jours avec 3 enfants.","Combien de jours de congés payés supplémentaires prévoit la CCN pharmaceutique pour les salariés avec enfants ?",{"a":144,"q":145},"La CCN industrie pharmaceutique applique les majorations légales : +25 % pour les 8 premières heures supplémentaires (heures 36 à 43) et +50 % au-delà (heures 44+). Le contingent annuel d'heures supplémentaires est de 220 heures. Des repos compensateurs obligatoires s'appliquent au-delà du contingent : 30 min\u002Fheure pour les entreprises de moins de 20 salariés et 1 heure\u002Fheure pour les plus grandes.","Quelles sont les majorations pour heures supplémentaires dans la convention pharmaceutique IDCC 176 ?",{"a":147,"q":148},"Non, la convention collective nationale de l'industrie pharmaceutique ne prévoit pas de 13e mois obligatoire au niveau national. Ce bénéfice peut toutefois exister dans des accords d'entreprise ou d'établissement. En revanche, la prime d'ancienneté (art. 25) est elle bien obligatoire et constitue un avantage distinct.","La CCN industrie pharmaceutique prévoit-elle un 13e mois obligatoire ?",{"a":150,"q":151},"La convention collective nationale de l'industrie pharmaceutique (IDCC 176, JO 3104) s'applique aux entreprises dont l'activité principale relève de la fabrication, de la recherche et développement, de la vente ou de la distribution de médicaments et produits pharmaceutiques, quel que soit leur effectif, dès lors qu'elles sont établies en France métropolitaine ou dans les DOM.","Quand la CCN industrie pharmaceutique IDCC 176 s'applique-t-elle ?","\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\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      --muted: #78716c;\n      --success-bg: #f0fdf4;\n      --success-border: #bbf7d0;\n      --success-text: #15803d;\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      --shadow-md: 0 4px 6px rgba(0,0,0,.07), 0 2px 4px rgba(0,0,0,.06);\n    }\n\n    body {\n      font-family: system-ui, -apple-system, sans-serif;\n      background: var(--bg);\n      color: var(--text);\n      font-size: 0.9375rem;\n      line-height: 1.6;\n    }\n\n    .tool-root {\n      max-width: 680px;\n      margin: 0 auto;\n      padding: 1.25rem 1rem 2rem;\n    }\n\n    \u002F* Header *\u002F\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      line-height: 1.3;\n    }\n    .tool-header .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.55rem;\n      border-radius: 9999px;\n      margin-top: 0.35rem;\n    }\n\n    \u002F* Tabs *\u002F\n    .tabs-bar {\n      display: flex;\n      gap: 0.125rem;\n      background: var(--border);\n      border-radius: var(--radius) var(--radius) 0 0;\n      padding: 0.25rem;\n      overflow-x: auto;\n      scrollbar-width: none;\n    }\n    .tabs-bar::-webkit-scrollbar { display: none; }\n\n    .tab-btn {\n      flex-shrink: 0;\n      display: flex;\n      align-items: center;\n      gap: 0.35rem;\n      padding: 0.45rem 0.85rem;\n      border: none;\n      background: transparent;\n      border-radius: calc(var(--radius) - 0.25rem);\n      font-size: 0.8125rem;\n      font-weight: 500;\n      color: var(--muted);\n      cursor: pointer;\n      transition: background 0.15s, color 0.15s;\n      white-space: nowrap;\n    }\n    .tab-btn:hover { background: rgba(255,255,255,.6); color: var(--text); }\n    .tab-btn.active {\n      background: var(--surface);\n      color: var(--accent);\n      font-weight: 600;\n      box-shadow: var(--shadow);\n    }\n    .tab-btn svg { width: 14px; height: 14px; }\n\n    \u002F* Panel *\u002F\n    .panel-wrapper {\n      background: var(--surface);\n      border: 1px solid var(--border);\n      border-top: none;\n      border-radius: 0 0 var(--radius) var(--radius);\n      padding: 1.25rem 1.25rem 1rem;\n    }\n    .panel { display: none; }\n    .panel.active { display: block; }\n\n    \u002F* Rule callout *\u002F\n    .rule-callout {\n      display: flex;\n      gap: 0.65rem;\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.75rem 1rem;\n      margin-bottom: 1.25rem;\n      font-size: 0.84rem;\n      color: var(--info-text);\n    }\n    .rule-callout svg { width: 16px; height: 16px; flex-shrink: 0; margin-top: 2px; }\n\n    \u002F* Form fields *\u002F\n    .field { margin-bottom: 1rem; }\n    .field label {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      font-size: 0.84rem;\n      font-weight: 500;\n      color: var(--text);\n      margin-bottom: 0.35rem;\n    }\n    .field label span.val {\n      font-weight: 700;\n      color: var(--accent);\n      font-variant-numeric: tabular-nums;\n    }\n    input[type=range] {\n      width: 100%;\n      accent-color: var(--accent);\n      height: 6px;\n      cursor: pointer;\n    }\n    select {\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      background: var(--surface);\n      color: var(--text);\n      cursor: pointer;\n      appearance: none;\n      background-image: url(\"data:image\u002Fsvg+xml,%3Csvg xmlns='http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2378716c' stroke-width='2'%3E%3Cpath d='m6 9 6 6 6-6'\u002F%3E%3C\u002Fsvg%3E\");\n      background-repeat: no-repeat;\n      background-position: right 0.75rem center;\n      padding-right: 2rem;\n    }\n\n    \u002F* Pills *\u002F\n    .pills { display: flex; gap: 0.5rem; flex-wrap: wrap; }\n    .pill {\n      padding: 0.35rem 0.85rem;\n      border: 1.5px 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(--muted);\n      transition: all 0.15s;\n    }\n    .pill.active {\n      border-color: var(--accent);\n      background: var(--accent-light);\n      color: var(--accent);\n    }\n\n    \u002F* Toggle *\u002F\n    .toggle-row {\n      display: flex;\n      align-items: center;\n      gap: 0.75rem;\n      margin-bottom: 1rem;\n    }\n    .toggle-label { font-size: 0.84rem; font-weight: 500; }\n    .toggle {\n      position: relative;\n      width: 42px;\n      height: 24px;\n      flex-shrink: 0;\n    }\n    .toggle input { opacity: 0; width: 0; height: 0; position: absolute; }\n    .toggle-track {\n      position: absolute; inset: 0;\n      background: var(--border);\n      border-radius: 9999px;\n      transition: background 0.15s;\n      cursor: pointer;\n    }\n    .toggle input:checked ~ .toggle-track { background: var(--accent); }\n    .toggle-thumb {\n      position: absolute;\n      top: 3px; left: 3px;\n      width: 18px; height: 18px;\n      background: white;\n      border-radius: 50%;\n      box-shadow: var(--shadow);\n      transition: transform 0.15s;\n      pointer-events: none;\n    }\n    .toggle input:checked ~ .toggle-track ~ .toggle-thumb { transform: translateX(18px); }\n\n    \u002F* Result card *\u002F\n    .result-card {\n      background: var(--success-bg);\n      border: 1.5px solid var(--success-border);\n      border-radius: var(--radius);\n      padding: 1rem 1.25rem;\n      margin-top: 1.25rem;\n    }\n    .result-card .result-label {\n      font-size: 0.78rem;\n      font-weight: 600;\n      color: var(--success-text);\n      text-transform: uppercase;\n      letter-spacing: 0.04em;\n      margin-bottom: 0.25rem;\n    }\n    .result-card .result-value {\n      font-size: 1.6rem;\n      font-weight: 800;\n      font-variant-numeric: tabular-nums;\n      color: var(--success-text);\n      line-height: 1.2;\n    }\n    .result-card .result-sub {\n      font-size: 0.8rem;\n      color: var(--success-text);\n      opacity: 0.8;\n      margin-top: 0.2rem;\n    }\n    .result-details {\n      margin-top: 0.75rem;\n      padding-top: 0.75rem;\n      border-top: 1px solid var(--success-border);\n      display: grid;\n      gap: 0.3rem;\n    }\n    .result-detail-row {\n      display: flex;\n      justify-content: space-between;\n      font-size: 0.8rem;\n      color: var(--success-text);\n    }\n    .result-detail-row .detail-key { opacity: 0.8; }\n    .result-detail-row .detail-val { font-weight: 600; font-variant-numeric: tabular-nums; }\n\n    \u002F* Disclaimer *\u002F\n    .disclaimer {\n      margin-top: 1.5rem;\n      padding-top: 1rem;\n      border-top: 1px solid var(--border);\n      font-size: 0.76rem;\n      color: var(--muted);\n      line-height: 1.5;\n    }\n    .disclaimer a { color: var(--accent); text-decoration: none; }\n    .disclaimer a:hover { text-decoration: underline; }\n\n    \u002F* Section divider *\u002F\n    .section-title {\n      font-size: 0.78rem;\n      font-weight: 700;\n      text-transform: uppercase;\n      letter-spacing: 0.06em;\n      color: var(--muted);\n      margin-bottom: 0.65rem;\n      margin-top: 1rem;\n    }\n    .section-title:first-child { margin-top: 0; }\n\n    .two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; }\n    @media (max-width: 420px) { .two-col { grid-template-columns: 1fr; } }\n\n    .hidden { display: none !important; }\n  \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody>\n\n\u003C!-- CCN IDCC 176 — deviations detected\n     indemnite: L1234-9 → taux progressif 0.3\u002F0.34\u002F0.38 mois\u002Fan + majorations > 45 ans (art. 36 CCN)\n     preavis: L1234-1 → 2 à 4 mois selon groupe de classification (art. 35 CCN)\n     salaire-min: SMIC → grille à 21 niveaux de 1815 € à 6829 € (Avenant 2024-2025)\n     prime-anciennete: absent L → 3 % à 18 % selon ancienneté sur SMC (art. 25 CCN)\n     conges: L3141-3 → 2 jours supplémentaires par enfant à charge \u003C 21 ans (art. 26 CCN)\n-->\n\n\u003Cmain class=\"tool-root\">\n  \u003Cdiv class=\"tool-header\">\n    \u003Ch1>Convention collective — Industrie pharmaceutique\u003C\u002Fh1>\n    \u003Cdiv class=\"badge\">\n      \u003Ci data-lucide=\"shield-check\">\u003C\u002Fi>\n      IDCC 176\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003Cdiv class=\"tabs-bar\" role=\"tablist\">\n    \u003Cbutton class=\"tab-btn\" data-tab=\"indemnite\" role=\"tab\">\n      \u003Ci data-lucide=\"calculator\">\u003C\u002Fi> Indemnité\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"preavis\" role=\"tab\">\n      \u003Ci data-lucide=\"clock\">\u003C\u002Fi> Préavis\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"salaire-min\" role=\"tab\">\n      \u003Ci data-lucide=\"euro\">\u003C\u002Fi> Grille salaires\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"prime-anciennete\" role=\"tab\">\n      \u003Ci data-lucide=\"trending-up\">\u003C\u002Fi> Ancienneté\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"conges\" role=\"tab\">\n      \u003Ci data-lucide=\"calendar\">\u003C\u002Fi> Congés\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n\n  \u003Cdiv class=\"panel-wrapper\">\n\n    \u003C!-- ======== TAB 1 : INDEMNITÉ DE LICENCIEMENT ======== -->\n    \u003Cdiv class=\"panel\" data-panel=\"indemnite\" role=\"tabpanel\">\n      \u003Cdiv class=\"rule-callout\">\n        \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n        \u003Cp>La CCN industrie pharmaceutique (art. 36) prévoit un taux progressif plus favorable que le code du travail : \u003Cstrong>0,30 mois\u002Fan jusqu'à 5 ans\u003C\u002Fstrong>, 0,34 mois\u002Fan de 5 à 10 ans, 0,38 mois\u002Fan de 10 à 15 ans, avec une majoration d'\u003Cstrong>1 mois supplémentaire\u003C\u002Fstrong> pour les salariés de plus de 45 ans ou avec 15+ ans d'ancienneté.\u003C\u002Fp>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"section-title\">Paramètres\u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>\n          Salaire brut mensuel de référence\n          \u003Cspan class=\"val\" id=\"ind-sal-val\">3 000 €\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"ind-sal\" min=\"1500\" max=\"10000\" step=\"50\" value=\"3000\">\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>\n          Ancienneté (années complètes)\n          \u003Cspan class=\"val\" id=\"ind-anc-val\">8 ans\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"ind-anc\" min=\"1\" max=\"40\" step=\"1\" value=\"8\">\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Motif du licenciement\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"ind-motif\">\n          \u003Cbutton class=\"pill active\" data-val=\"economique\">Économique\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"personnel\">Personnel \u002F autre\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"inaptitude\">Inaptitude\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"toggle-row\">\n        \u003Clabel class=\"toggle\">\n          \u003Cinput type=\"checkbox\" id=\"ind-age\">\n          \u003Cdiv class=\"toggle-track\">\u003C\u002Fdiv>\n          \u003Cdiv class=\"toggle-thumb\">\u003C\u002Fdiv>\n        \u003C\u002Flabel>\n        \u003Cspan class=\"toggle-label\">Salarié de plus de 45 ans\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"result-card\" id=\"ind-result\">\n        \u003Cdiv class=\"result-label\">Indemnité conventionnelle estimée\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-value\" id=\"ind-total\">–\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\n    \u003C!-- ======== TAB 2 : PRÉAVIS ======== -->\n    \u003Cdiv class=\"panel\" data-panel=\"preavis\" role=\"tabpanel\">\n      \u003Cdiv class=\"rule-callout\">\n        \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n        \u003Cp>La CCN pharmaceutique (art. 35) fixe des préavis plus longs que le code du travail, modulés par le groupe de classification : \u003Cstrong>2 mois\u003C\u002Fstrong> (groupes 1–3), \u003Cstrong>3 mois\u003C\u002Fstrong> (groupes 4–5), \u003Cstrong>4 mois\u003C\u002Fstrong> (groupe 6 et supérieur). Pour les contrats antérieurs au 01\u002F07\u002F2009, les groupes 5+ bénéficient de 3 mois.\u003C\u002Fp>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"section-title\">Paramètres\u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Groupe de classification\u003C\u002Flabel>\n        \u003Cselect id=\"prev-groupe\">\n          \u003Coption value=\"1-3\">Groupes 1 à 3\u003C\u002Foption>\n          \u003Coption value=\"4-5\" selected>Groupes 4 à 5\u003C\u002Foption>\n          \u003Coption value=\"6+\">Groupe 6 et supérieur\u003C\u002Foption>\n        \u003C\u002Fselect>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Date d'embauche\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"prev-contrat\">\n          \u003Cbutton class=\"pill active\" data-val=\"apres\">Après le 01\u002F07\u002F2009\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"avant\">Avant le 01\u002F07\u002F2009\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Type de rupture\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"prev-type\">\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\n      \u003Cdiv class=\"result-card\" id=\"prev-result\">\n        \u003Cdiv class=\"result-label\">Durée de préavis conventionnelle\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-value\" id=\"prev-total\">–\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-sub\" id=\"prev-sub\">\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-details\" id=\"prev-details\">\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003C!-- ======== TAB 3 : GRILLE SALAIRES ======== -->\n    \u003Cdiv class=\"panel\" data-panel=\"salaire-min\" role=\"tabpanel\">\n      \u003Cdiv class=\"rule-callout\">\n        \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n        \u003Cp>La CCN industrie pharmaceutique publie une grille de 21 niveaux de classification (de 1A\u002F1B à niveau 11) avec des minima allant de \u003Cstrong>1 815 € à 6 829 € brut\u002Fmois\u003C\u002Fstrong> pour 151,67 heures mensuelles (35h\u002Fsemaine). Ces minima sont supérieurs au SMIC pour tous les niveaux (avenant 2024-2025).\u003C\u002Fp>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"section-title\">Paramètres\u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Niveau de classification\u003C\u002Flabel>\n        \u003Cselect id=\"sal-niveau\">\n          \u003Coption value=\"1815.55\">1A \u002F 1B — 1 815,55 €\u003C\u002Foption>\n          \u003Coption value=\"1834.05\">1C \u002F 2A — 1 834,05 €\u003C\u002Foption>\n          \u003Coption value=\"1871.06\">2B — 1 871,06 €\u003C\u002Foption>\n          \u003Coption value=\"1954.31\">2C \u002F 3A — 1 954,31 €\u003C\u002Foption>\n          \u003Coption value=\"2000.56\">3B — 2 000,56 €\u003C\u002Foption>\n          \u003Coption value=\"2167.06\">3C \u002F 4A — 2 167,06 €\u003C\u002Foption>\n          \u003Coption value=\"2241.07\">4B — 2 241,07 €\u003C\u002Foption>\n          \u003Coption value=\"2453.82\">4C \u002F 5A — 2 453,82 €\u003C\u002Foption>\n          \u003Coption value=\"2555.57\">5B — 2 555,57 €\u003C\u002Foption>\n          \u003Coption value=\"2833.08\">5C \u002F 6A — 2 833,08 €\u003C\u002Foption>\n          \u003Coption value=\"2962.59\">6B — 2 962,59 €\u003C\u002Foption>\n          \u003Coption value=\"3304.85\">6C — 3 304,85 €\u003C\u002Foption>\n          \u003Coption value=\"3434.35\">7A — 3 434,35 €\u003C\u002Foption>\n          \u003Coption value=\"4017.12\">7B — 4 017,12 €\u003C\u002Foption>\n          \u003Coption value=\"4146.62\">8A — 4 146,62 €\u003C\u002Foption>\n          \u003Coption value=\"4840.39\">8B — 4 840,39 €\u003C\u002Foption>\n          \u003Coption value=\"4969.89\">9A — 4 969,89 €\u003C\u002Foption>\n          \u003Coption value=\"5793.17\">9B — 5 793,17 €\u003C\u002Foption>\n          \u003Coption value=\"6311.18\">10 — 6 311,18 €\u003C\u002Foption>\n          \u003Coption value=\"6829.19\">11 — 6 829,19 €\u003C\u002Foption>\n        \u003C\u002Fselect>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>\n          Durée hebdomadaire contractuelle\n          \u003Cspan class=\"val\" id=\"sal-heures-val\">35 h\u002Fsem\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"sal-heures\" min=\"17.5\" max=\"39\" step=\"0.5\" value=\"35\">\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"result-card\" id=\"sal-result\">\n        \u003Cdiv class=\"result-label\">Salaire minimum conventionnel\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-value\" id=\"sal-total\">–\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-sub\" id=\"sal-sub\">\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-details\" id=\"sal-details\">\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003C!-- ======== TAB 4 : PRIME D'ANCIENNETÉ ======== -->\n    \u003Cdiv class=\"panel\" data-panel=\"prime-anciennete\" role=\"tabpanel\">\n      \u003Cdiv class=\"rule-callout\">\n        \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n        \u003Cp>La CCN pharmaceutique (art. 25) impose une prime d'ancienneté progressive absente du code du travail : \u003Cstrong>3 % dès 3 ans\u003C\u002Fstrong>, 6 % à 6 ans, jusqu'à \u003Cstrong>18 % à partir de 18 ans\u003C\u002Fstrong> d'ancienneté, calculée sur le salaire minimum conventionnel (SMC) du niveau du salarié.\u003C\u002Fp>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"section-title\">Paramètres\u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Niveau de classification\u003C\u002Flabel>\n        \u003Cselect id=\"anc-niveau\">\n          \u003Coption value=\"1815.55\">1A \u002F 1B — 1 815,55 €\u003C\u002Foption>\n          \u003Coption value=\"1834.05\">1C \u002F 2A — 1 834,05 €\u003C\u002Foption>\n          \u003Coption value=\"1871.06\">2B — 1 871,06 €\u003C\u002Foption>\n          \u003Coption value=\"1954.31\">2C \u002F 3A — 1 954,31 €\u003C\u002Foption>\n          \u003Coption value=\"2000.56\">3B — 2 000,56 €\u003C\u002Foption>\n          \u003Coption value=\"2167.06\">3C \u002F 4A — 2 167,06 €\u003C\u002Foption>\n          \u003Coption value=\"2241.07\" selected>4B — 2 241,07 €\u003C\u002Foption>\n          \u003Coption value=\"2453.82\">4C \u002F 5A — 2 453,82 €\u003C\u002Foption>\n          \u003Coption value=\"2555.57\">5B — 2 555,57 €\u003C\u002Foption>\n          \u003Coption value=\"2833.08\">5C \u002F 6A — 2 833,08 €\u003C\u002Foption>\n          \u003Coption value=\"2962.59\">6B — 2 962,59 €\u003C\u002Foption>\n          \u003Coption value=\"3304.85\">6C — 3 304,85 €\u003C\u002Foption>\n          \u003Coption value=\"3434.35\">7A — 3 434,35 €\u003C\u002Foption>\n          \u003Coption value=\"4017.12\">7B — 4 017,12 €\u003C\u002Foption>\n          \u003Coption value=\"4146.62\">8A — 4 146,62 €\u003C\u002Foption>\n          \u003Coption value=\"4840.39\">8B — 4 840,39 €\u003C\u002Foption>\n          \u003Coption value=\"4969.89\">9A — 4 969,89 €\u003C\u002Foption>\n          \u003Coption value=\"5793.17\">9B — 5 793,17 €\u003C\u002Foption>\n          \u003Coption value=\"6311.18\">10 — 6 311,18 €\u003C\u002Foption>\n          \u003Coption value=\"6829.19\">11 — 6 829,19 €\u003C\u002Foption>\n        \u003C\u002Fselect>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>\n          Ancienneté dans l'entreprise\n          \u003Cspan class=\"val\" id=\"anc-anc-val\">5 ans\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"anc-anc\" min=\"0\" max=\"30\" step=\"1\" value=\"5\">\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"result-card\" id=\"anc-result\">\n        \u003Cdiv class=\"result-label\">Prime d'ancienneté mensuelle estimée\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-value\" id=\"anc-total\">–\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-sub\" id=\"anc-sub\">\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-details\" id=\"anc-details\">\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003C!-- ======== TAB 5 : CONGÉS PAYÉS ======== -->\n    \u003Cdiv class=\"panel\" data-panel=\"conges\" role=\"tabpanel\">\n      \u003Cdiv class=\"rule-callout\">\n        \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n        \u003Cp>La CCN pharmaceutique (art. 26) accorde \u003Cstrong>2 jours ouvrables supplémentaires\u003C\u002Fstrong> par enfant à charge de moins de 21 ans au 31 mai de l'année précédente, en plus des 30 jours ouvrables légaux. Un salarié avec 3 enfants bénéficie ainsi de 36 jours ouvrables par an.\u003C\u002Fp>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"section-title\">Paramètres\u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>\n          Nombre d'enfants à charge (moins de 21 ans)\n          \u003Cspan class=\"val\" id=\"cong-enfants-val\">0 enfant\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"cong-enfants\" min=\"0\" max=\"8\" step=\"1\" value=\"0\">\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>\n          Mois travaillés dans la période de référence (1 juin → 31 mai)\n          \u003Cspan class=\"val\" id=\"cong-mois-val\">12 mois\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"cong-mois\" min=\"1\" max=\"12\" step=\"1\" value=\"12\">\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"toggle-row\">\n        \u003Clabel class=\"toggle\">\n          \u003Cinput type=\"checkbox\" id=\"cong-partiel\">\n          \u003Cdiv class=\"toggle-track\">\u003C\u002Fdiv>\n          \u003Cdiv class=\"toggle-thumb\">\u003C\u002Fdiv>\n        \u003C\u002Flabel>\n        \u003Cspan class=\"toggle-label\">Temps partiel\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\" id=\"cong-partiel-field\" style=\"display:none\">\n        \u003Clabel>\n          Quotité travaillée\n          \u003Cspan class=\"val\" id=\"cong-quotite-val\">80 %\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"cong-quotite\" min=\"20\" max=\"99\" step=\"1\" value=\"80\">\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"result-card\" id=\"cong-result\">\n        \u003Cdiv class=\"result-label\">Congés payés conventionnels\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-value\" id=\"cong-total\">–\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\n  \u003C\u002Fdiv>\u003C!-- \u002Fpanel-wrapper -->\n\n  \u003Cp class=\"disclaimer\">\n    Calcul indicatif basé sur la CCN IDCC 176 (industrie pharmaceutique).\n    Source : \u003Ca href=\"https:\u002F\u002Fwww.legifrance.gouv.fr\u002Fconv_coll\u002Fid\u002FKALICONT000005635269\u002F\" target=\"_blank\" rel=\"noopener\">Légifrance\u003C\u002Fa> — Avenant grilles 2024-2025.\n    Pour toute validation légale\n  \u003C\u002Fp>\n\n\u003C\u002Fmain>\n\n\u003Cscript>\n\u002F* ─── UTILITIES ─────────────────────────────────────────────────────────── *\u002F\nconst fmt = new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', maximumFractionDigits: 0 });\nconst fmtDec = new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', minimumFractionDigits: 2, maximumFractionDigits: 2 });\nfunction fmtEur(v) { return fmt.format(Math.round(v)); }\nfunction fmtEur2(v) { return fmtDec.format(v); }\n\n\u002F* ─── TABS ───────────────────────────────────────────────────────────────── *\u002F\nconst tabBtns = document.querySelectorAll('[data-tab]');\nconst panels = document.querySelectorAll('[data-panel]');\n\nfunction activate(id) {\n  tabBtns.forEach(t => t.classList.toggle('active', t.dataset.tab === id));\n  panels.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}\ntabBtns.forEach(t => t.addEventListener('click', () => activate(t.dataset.tab)));\n\nconst hashTab = location.hash.slice(1);\nconst firstTab = tabBtns[0]?.dataset.tab;\nconst validHash = [...tabBtns].find(t => t.dataset.tab === hashTab);\nactivate(validHash ? hashTab : firstTab);\n\n\u002F* ─── RESIZE OBSERVER ───────────────────────────────────────────────────── *\u002F\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* ─── PILLS HELPER ───────────────────────────────────────────────────────── *\u002F\nfunction makePills(containerId, onChange) {\n  const container = document.getElementById(containerId);\n  let current = container.querySelector('.pill.active')?.dataset.val;\n  container.querySelectorAll('.pill').forEach(pill => {\n    pill.addEventListener('click', () => {\n      container.querySelectorAll('.pill').forEach(p => p.classList.remove('active'));\n      pill.classList.add('active');\n      current = pill.dataset.val;\n      onChange(current);\n    });\n  });\n  return () => current;\n}\n\n\u002F* ═══════════════════════════════════════════════════════════════════════════\n   TAB 1 — INDEMNITÉ DE LICENCIEMENT\n   Art. 36 CCN IDCC 176\n   Taux : 0-5 ans → 0.30\u002Fan, 5-10 ans → 0.34\u002Fan, 10-15 ans → 0.38\u002Fan,\n          15+ ans → 0.41\u002Fan (estimated from progression)\n   Majoration : +1 mois si > 45 ans OU ancienneté ≥ 15 ans\n   Cap légal : 20 mois de salaire (hors majorations d'âge\u002Fancienneté)\n═══════════════════════════════════════════════════════════════════════════ *\u002F\n{\n  const salEl = document.getElementById('ind-sal');\n  const ancEl = document.getElementById('ind-anc');\n  const ageEl = document.getElementById('ind-age');\n  const salVal = document.getElementById('ind-sal-val');\n  const ancVal = document.getElementById('ind-anc-val');\n  const totalEl = document.getElementById('ind-total');\n  const subEl = document.getElementById('ind-sub');\n  const detailsEl = document.getElementById('ind-details');\n\n  let motif = 'economique';\n  const getMotif = makePills('ind-motif', v => { motif = v; computeInd(); });\n\n  function computeInd() {\n    const sal = +salEl.value;\n    const anc = +ancEl.value;\n    const over45 = ageEl.checked;\n\n    if (anc \u003C 1) {\n      totalEl.textContent = '0 €';\n      subEl.textContent = 'Ancienneté insuffisante (minimum 8 mois requis)';\n      detailsEl.innerHTML = '';\n      return;\n    }\n\n    \u002F\u002F Progressive rate per bracket\n    let indemnite = 0;\n    \u002F\u002F Bracket 1 : 0 → 5 years : 0.30\u002Fyear\n    const y1 = Math.min(anc, 5);\n    indemnite += y1 * 0.30 * sal;\n    \u002F\u002F Bracket 2 : 5 → 10 years : 0.34\u002Fyear\n    if (anc > 5) {\n      const y2 = Math.min(anc - 5, 5);\n      indemnite += y2 * 0.34 * sal;\n    }\n    \u002F\u002F Bracket 3 : 10 → 15 years : 0.38\u002Fyear\n    if (anc > 10) {\n      const y3 = Math.min(anc - 10, 5);\n      indemnite += y3 * 0.38 * sal;\n    }\n    \u002F\u002F Bracket 4 : 15+ years : 0.41\u002Fyear (estimated progression)\n    if (anc > 15) {\n      indemnite += (anc - 15) * 0.41 * sal;\n    }\n\n    \u002F\u002F Cap at 20 months (excluding age\u002Fseniority bonus)\n    const cap = 20 * sal;\n    indemnite = Math.min(indemnite, cap);\n\n    \u002F\u002F Bonus: +1 month if over 45 OR 15+ years seniority\n    let bonus = 0;\n    const hasMajoration = over45 || anc >= 15;\n    if (hasMajoration) bonus = sal;\n\n    const total = indemnite + bonus;\n\n    \u002F\u002F Inaptitude: same formula (no difference in this CCN)\n    \u002F\u002F Démission: no indemnity (except for 15+ years in some CCNs — not applicable here)\n\n    totalEl.textContent = fmtEur(total);\n    subEl.textContent = `Ancienneté : ${anc} an${anc > 1 ? 's' : ''} — Salaire de référence : ${fmtEur(sal)}\u002Fmois`;\n\n    let rows = `\n      \u003Cdiv class=\"result-detail-row\">\u003Cspan class=\"detail-key\">Indemnité conventionnelle (avant majoration)\u003C\u002Fspan>\u003Cspan class=\"detail-val\">${fmtEur(indemnite)}\u003C\u002Fspan>\u003C\u002Fdiv>\n    `;\n    if (hasMajoration) {\n      const reason = over45 && anc >= 15 ? '> 45 ans + 15+ ans ancienneté' : over45 ? '> 45 ans' : '15+ ans ancienneté';\n      rows += `\u003Cdiv class=\"result-detail-row\">\u003Cspan class=\"detail-key\">Majoration (${reason})\u003C\u002Fspan>\u003Cspan class=\"detail-val\">+ ${fmtEur(bonus)}\u003C\u002Fspan>\u003C\u002Fdiv>`;\n    }\n    rows += `\u003Cdiv class=\"result-detail-row\">\u003Cspan class=\"detail-key\">Indemnité légale comparative (L1234-9)\u003C\u002Fspan>\u003Cspan class=\"detail-val\">${fmtEur(computeLegal(sal, anc))}\u003C\u002Fspan>\u003C\u002Fdiv>`;\n    detailsEl.innerHTML = rows;\n  }\n\n  function computeLegal(sal, anc) {\n    let leg = 0;\n    const y1 = Math.min(anc, 10);\n    leg += y1 * 0.25 * sal;\n    if (anc > 10) leg += (anc - 10) * (1\u002F3) * sal;\n    return leg;\n  }\n\n  salEl.addEventListener('input', () => { salVal.textContent = fmtEur(salEl.value); computeInd(); });\n  ancEl.addEventListener('input', () => { ancVal.textContent = ancEl.value + ' an' + (+ancEl.value > 1 ? 's' : ''); computeInd(); });\n  ageEl.addEventListener('change', computeInd);\n  computeInd();\n}\n\n\u002F* ═══════════════════════════════════════════════════════════════════════════\n   TAB 2 — PRÉAVIS DE LICENCIEMENT\n   Art. 35 CCN IDCC 176\n═══════════════════════════════════════════════════════════════════════════ *\u002F\n{\n  const groupeEl = document.getElementById('prev-groupe');\n  const totalEl = document.getElementById('prev-total');\n  const subEl = document.getElementById('prev-sub');\n  const detailsEl = document.getElementById('prev-details');\n\n  let contrat = 'apres';\n  let typeRupture = 'licenciement';\n  makePills('prev-contrat', v => { contrat = v; computePrev(); });\n  makePills('prev-type', v => { typeRupture = v; computePrev(); });\n\n  function computePrev() {\n    const groupe = groupeEl.value;\n    let mois = 0;\n\n    if (typeRupture === 'demission') {\n      \u002F\u002F Démission: generally half the licenciement notice in France\n      \u002F\u002F CCN pharma doesn't specify a different rule → same as licenciement for most groups\n      \u002F\u002F We still apply the CCN durations (they apply to démission too per art. 35)\n    }\n\n    if (contrat === 'apres') {\n      \u002F\u002F Contrats à partir du 01\u002F07\u002F2009\n      if (groupe === '1-3') mois = 2;\n      else if (groupe === '4-5') mois = 3;\n      else mois = 4; \u002F\u002F 6+\n    } else {\n      \u002F\u002F Contrats avant 01\u002F07\u002F2009\n      if (groupe === '1-3') mois = 2;\n      else if (groupe === '4-5') mois = 3;\n      else mois = 3; \u002F\u002F 6+ : 3 months for old contracts\n    }\n\n    \u002F\u002F Legal baseline\n    let legMois = 0;\n    if (groupe === '1-3') legMois = 1;\n    else if (groupe === '4-5') legMois = 2;\n    else legMois = 2;\n\n    totalEl.textContent = mois + ' mois';\n    subEl.textContent = typeRupture === 'demission'\n      ? 'Préavis en cas de démission — vérifier l\\'accord d\\'entreprise'\n      : 'Durée de préavis en cas de licenciement (hors faute grave\u002Flourde)';\n\n    detailsEl.innerHTML = `\n      \u003Cdiv class=\"result-detail-row\">\u003Cspan class=\"detail-key\">Durée CCN pharma\u003C\u002Fspan>\u003Cspan class=\"detail-val\">${mois} mois\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail-row\">\u003Cspan class=\"detail-key\">Durée légale minimale (L1234-1)\u003C\u002Fspan>\u003Cspan class=\"detail-val\">${legMois} mois\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail-row\">\u003Cspan class=\"detail-key\">Avantage conventionnel\u003C\u002Fspan>\u003Cspan class=\"detail-val\">+ ${mois - legMois} mois\u003C\u002Fspan>\u003C\u002Fdiv>\n    `;\n  }\n\n  groupeEl.addEventListener('change', computePrev);\n  computePrev();\n}\n\n\u002F* ═══════════════════════════════════════════════════════════════════════════\n   TAB 3 — GRILLE SALARIALE (salaire minimum conventionnel)\n   Avenant 2024-2025 IDCC 176\n═══════════════════════════════════════════════════════════════════════════ *\u002F\n{\n  const niveauEl = document.getElementById('sal-niveau');\n  const heuresEl = document.getElementById('sal-heures');\n  const heuresVal = document.getElementById('sal-heures-val');\n  const totalEl = document.getElementById('sal-total');\n  const subEl = document.getElementById('sal-sub');\n  const detailsEl = document.getElementById('sal-details');\n\n  const SMIC_MENSUEL = 1801.80; \u002F\u002F SMIC 2025\n\n  function computeSal() {\n    const smcBase = parseFloat(niveauEl.value);\n    const heures = parseFloat(heuresEl.value);\n    \u002F\u002F Prorated for non-35h contracts\n    const smc = smcBase * (heures \u002F 35);\n    const hourly = smc \u002F (heures * 52 \u002F 12);\n\n    totalEl.textContent = fmtEur2(smc);\n    subEl.textContent = `Pour ${heures}h\u002Fsemaine — soit ${fmtEur2(hourly)}\u002Fheure brut`;\n\n    detailsEl.innerHTML = `\n      \u003Cdiv class=\"result-detail-row\">\u003Cspan class=\"detail-key\">SMC base 35h (grille CCN)\u003C\u002Fspan>\u003Cspan class=\"detail-val\">${fmtEur2(smcBase)}\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail-row\">\u003Cspan class=\"detail-key\">SMIC mensuel 2025\u003C\u002Fspan>\u003Cspan class=\"detail-val\">${fmtEur2(SMIC_MENSUEL)}\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail-row\">\u003Cspan class=\"detail-key\">Écart avec le SMIC\u003C\u002Fspan>\u003Cspan class=\"detail-val\">+ ${fmtEur2(Math.max(0, smc - SMIC_MENSUEL))}\u003C\u002Fspan>\u003C\u002Fdiv>\n    `;\n  }\n\n  niveauEl.addEventListener('change', computeSal);\n  heuresEl.addEventListener('input', () => {\n    heuresVal.textContent = heuresEl.value + ' h\u002Fsem';\n    computeSal();\n  });\n  computeSal();\n}\n\n\u002F* ═══════════════════════════════════════════════════════════════════════════\n   TAB 4 — PRIME D'ANCIENNETÉ\n   Art. 25 CCN IDCC 176\n   Taux : 3% à 3 ans, +3% tous les 3 ans, plafonné à 18% à partir de 18 ans\n═══════════════════════════════════════════════════════════════════════════ *\u002F\n{\n  const niveauEl = document.getElementById('anc-niveau');\n  const ancEl = document.getElementById('anc-anc');\n  const ancVal = document.getElementById('anc-anc-val');\n  const totalEl = document.getElementById('anc-total');\n  const subEl = document.getElementById('anc-sub');\n  const detailsEl = document.getElementById('anc-details');\n\n  function getTaux(anc) {\n    if (anc \u003C 3) return 0;\n    const palier = Math.floor(anc \u002F 3);\n    return Math.min(palier * 3, 18);\n  }\n\n  function computeAnc() {\n    const smc = parseFloat(niveauEl.value);\n    const anc = parseInt(ancEl.value);\n    const taux = getTaux(anc);\n    const prime = (taux \u002F 100) * smc;\n\n    if (taux === 0) {\n      totalEl.textContent = '0 €';\n      subEl.textContent = 'Pas encore de prime d\\'ancienneté (ancienneté \u003C 3 ans)';\n      detailsEl.innerHTML = '\u003Cdiv class=\"result-detail-row\">\u003Cspan class=\"detail-key\">Prime dès 3 ans d\\'ancienneté\u003C\u002Fspan>\u003Cspan class=\"detail-val\">3 %\u003C\u002Fspan>\u003C\u002Fdiv>';\n      return;\n    }\n\n    totalEl.textContent = fmtEur2(prime);\n    subEl.textContent = `${taux} % du SMC (${fmtEur2(smc)}) — ancienneté : ${anc} ans`;\n\n    const nextPalier = Math.ceil((anc + 1) \u002F 3) * 3;\n    let rows = `\n      \u003Cdiv class=\"result-detail-row\">\u003Cspan class=\"detail-key\">Taux applicable\u003C\u002Fspan>\u003Cspan class=\"detail-val\">${taux} %\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail-row\">\u003Cspan class=\"detail-key\">SMC de référence\u003C\u002Fspan>\u003Cspan class=\"detail-val\">${fmtEur2(smc)}\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail-row\">\u003Cspan class=\"detail-key\">Prime mensuelle brute\u003C\u002Fspan>\u003Cspan class=\"detail-val\">${fmtEur2(prime)}\u003C\u002Fspan>\u003C\u002Fdiv>\n    `;\n    if (taux \u003C 18) {\n      rows += `\u003Cdiv class=\"result-detail-row\">\u003Cspan class=\"detail-key\">Prochain palier (${nextPalier} ans → ${Math.min(getTaux(nextPalier), 18)} %)\u003C\u002Fspan>\u003Cspan class=\"detail-val\">dans ${nextPalier - anc} an${nextPalier - anc > 1 ? 's' : ''}\u003C\u002Fspan>\u003C\u002Fdiv>`;\n    } else {\n      rows += `\u003Cdiv class=\"result-detail-row\">\u003Cspan class=\"detail-key\">Taux maximum atteint\u003C\u002Fspan>\u003Cspan class=\"detail-val\">18 % (plafond CCN)\u003C\u002Fspan>\u003C\u002Fdiv>`;\n    }\n    detailsEl.innerHTML = rows;\n  }\n\n  niveauEl.addEventListener('change', computeAnc);\n  ancEl.addEventListener('input', () => {\n    const v = parseInt(ancEl.value);\n    ancVal.textContent = v + ' an' + (v > 1 ? 's' : '');\n    computeAnc();\n  });\n  computeAnc();\n}\n\n\u002F* ═══════════════════════════════════════════════════════════════════════════\n   TAB 5 — CONGÉS PAYÉS\n   Art. 26 CCN IDCC 176\n   +2 jours ouvrables par enfant à charge \u003C 21 ans\n═══════════════════════════════════════════════════════════════════════════ *\u002F\n{\n  const enfantsEl = document.getElementById('cong-enfants');\n  const moisEl = document.getElementById('cong-mois');\n  const quotiteEl = document.getElementById('cong-quotite');\n  const partielEl = document.getElementById('cong-partiel');\n  const enfantsVal = document.getElementById('cong-enfants-val');\n  const moisVal = document.getElementById('cong-mois-val');\n  const quotiteVal = document.getElementById('cong-quotite-val');\n  const partielField = document.getElementById('cong-partiel-field');\n  const totalEl = document.getElementById('cong-total');\n  const subEl = document.getElementById('cong-sub');\n  const detailsEl = document.getElementById('cong-details');\n\n  partielEl.addEventListener('change', () => {\n    partielField.style.display = partielEl.checked ? '' : 'none';\n    computeCong();\n  });\n\n  function computeCong() {\n    const enfants = parseInt(enfantsEl.value);\n    const mois = parseInt(moisEl.value);\n    const partiel = partielEl.checked;\n    const quotite = parseInt(quotiteEl.value) \u002F 100;\n\n    \u002F\u002F Base légale: 2.5 jours ouvrables par mois travaillé\n    const baseLegal = Math.min(mois * 2.5, 30);\n\n    \u002F\u002F Majoration enfants : +2 jours par enfant\n    const majorEnfants = enfants * 2;\n\n    \u002F\u002F Total brut CCN\n    let totalBrut = baseLegal + majorEnfants;\n\n    \u002F\u002F Prorata temps partiel\n    \u002F\u002F Note: les congés sont proportionnels pour le temps partiel uniquement sur la durée travaillée\n    \u002F\u002F Les jours pour enfants restent intacts\n    const congesBase = Math.min(mois * 2.5, 30);\n    const totalCCN = partiel ? Math.min(congesBase, 30) + majorEnfants : totalBrut;\n\n    totalEl.textContent = Math.round(totalCCN) + ' jours ouvrables';\n    subEl.textContent = partiel\n      ? `Temps partiel à ${Math.round(quotite * 100)} % — dont ${majorEnfants} j. pour enfant(s)`\n      : enfants > 0\n        ? `Dont ${majorEnfants} jour${majorEnfants > 1 ? 's' : ''} supplémentaire${majorEnfants > 1 ? 's' : ''} pour enfant${enfants > 1 ? 's' : ''}`\n        : 'Congés légaux sans majoration enfants';\n\n    detailsEl.innerHTML = `\n      \u003Cdiv class=\"result-detail-row\">\u003Cspan class=\"detail-key\">Congés de base (${mois} mois travaillés)\u003C\u002Fspan>\u003Cspan class=\"detail-val\">${Math.round(congesBase)} j.\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail-row\">\u003Cspan class=\"detail-key\">Majoration enfants (${enfants} × 2 j.)\u003C\u002Fspan>\u003Cspan class=\"detail-val\">+ ${majorEnfants} j.\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail-row\">\u003Cspan class=\"detail-key\">Total CCN pharma\u003C\u002Fspan>\u003Cspan class=\"detail-val\">${Math.round(totalCCN)} j. ouvrables\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail-row\">\u003Cspan class=\"detail-key\">Légal sans CCN\u003C\u002Fspan>\u003Cspan class=\"detail-val\">${Math.round(congesBase)} j. ouvrables\u003C\u002Fspan>\u003C\u002Fdiv>\n    `;\n  }\n\n  enfantsEl.addEventListener('input', () => {\n    const v = parseInt(enfantsEl.value);\n    enfantsVal.textContent = v + ' enfant' + (v > 1 ? 's' : '');\n    computeCong();\n  });\n  moisEl.addEventListener('input', () => {\n    moisVal.textContent = moisEl.value + ' mois';\n    computeCong();\n  });\n  quotiteEl.addEventListener('input', () => {\n    quotiteVal.textContent = quotiteEl.value + ' %';\n    computeCong();\n  });\n  computeCong();\n}\n\n\u002F* ─── INIT LUCIDE ICONS ─────────────────────────────────────────────────── *\u002F\ndocument.addEventListener('DOMContentLoaded', () => {\n  if (window.lucide) lucide.createIcons();\n});\nif (document.readyState !== 'loading') {\n  if (window.lucide) lucide.createIcons();\n}\n\u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","generated","juridique","consumer","both","https:\u002F\u002Fpub-bdebbd2dad294475a2da0eb657815b6b.r2.dev\u002Ftools\u002Fccn-de-l-industrie-pharmaceutique-accord-eff55f87ff.webp",[]]