[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"footer-root-categories-fr-FR":3,"tool-content-ccn-pharmacie-officine-fr":83,"footer-cities-fr":166},[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":134,"tool_html":160,"source":161,"category":162,"audience":163,"publish_mode":164,"hero_image":165,"hero_image_alt":85},"ccn-pharmacie-officine","CCN de la pharmacie d'officine — calculateur complet","Calculateur CCN Pharmacie d'Officine IDCC 1996 | Expert Zoom","Outil interactif couvrant l'indemnité de licenciement, le préavis, la grille salariale, la prime d'ancienneté, les congés et les majorations de nuit de la CCN Pharmacie d'Officine (IDCC 1996, brochure n°3052).","Ce calculateur couvre les 6 principales dérogations de la convention collective de la pharmacie d'officine (IDCC 1996) par rapport au Code du travail : indemnité de licenciement (barème 1\u002F10e–2\u002F10e–3\u002F10e, dès 8 mois d'ancienneté), durée du préavis (cadres 3 mois), grille salariale par coefficient (valeur du point 5,278 € en 2026), prime d'ancienneté obligatoire (3 à 12 %), congés supplémentaires selon ancienneté (+1 à +3 jours), et majorations pour travail de nuit (+20 % et +40 %).",[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 Pharmacie d'Officine — IDCC 1996","WebApplication",{"name":94,"@type":95,"identifier":96},"Convention collective nationale de la pharmacie d'officine","Thing","IDCC 1996",{"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 salariale, la prime d'ancienneté, les congés payés et les majorations de nuit de la convention collective de la pharmacie d'officine (IDCC 1996, brochure n°3052).","All","FinanceApplication",true,{"@type":110,"@context":100,"mainEntity":111},"FAQPage",[112,118,122,126,130],{"name":113,"@type":114,"acceptedAnswer":115},"Comment calculer l'indemnité de licenciement dans la convention collective de la pharmacie d'officine ?","Question",{"text":116,"@type":117},"La CCN Pharmacie d'Officine (IDCC 1996) prévoit un barème propre : 1\u002F10e de mois de salaire par année pour les 5 premières années, 2\u002F10e pour les années 6 à 15, et 3\u002F10e au-delà. La condition d'ancienneté est réduite à 8 mois. Si le barème légal (1\u002F4 et 1\u002F3 de mois) est plus favorable, c'est celui-ci qui s'applique.","Answer",{"name":119,"@type":114,"acceptedAnswer":120},"Quelle est la durée du préavis dans la pharmacie d'officine ?",{"text":121,"@type":117},"Les non-cadres bénéficient d'un préavis de 1 mois (ancienneté \u003C 2 ans) ou 2 mois (≥ 2 ans). Les cadres ont 3 mois de préavis. Les travailleurs reconnus handicapés bénéficient d'un préavis doublé (max 3 mois).",{"name":123,"@type":114,"acceptedAnswer":124},"Quelle est la grille de salaires de la pharmacie d'officine en 2026 ?",{"text":125,"@type":117},"La grille est fondée sur des coefficients de 100 à 800 avec une valeur du point de 5,278 € (accord janvier 2026). Le salaire minimum mensuel brut = coefficient × 5,278 €.",{"name":127,"@type":114,"acceptedAnswer":128},"La convention collective de la pharmacie prévoit-elle une prime d'ancienneté ?",{"text":129,"@type":117},"Oui, la prime d'ancienneté est obligatoire : 3 % à 3 ans, 6 % à 6 ans, 9 % à 9 ans et 12 % à 12 ans d'ancienneté, calculée sur le salaire minimum conventionnel du coefficient du salarié.",{"name":131,"@type":114,"acceptedAnswer":132},"Combien de jours de congés payés dans la pharmacie d'officine ?",{"text":133,"@type":117},"30 jours ouvrables de base + jours supplémentaires selon ancienneté : +1 jour à 10 ans, +3 jours à 20 ans. Des jours de fractionnement (1-2 jours) peuvent également s'ajouter.",[135,137,139,141,143,145,148,151,154,157],{"a":136,"q":113},"La CCN Pharmacie d'Officine (IDCC 1996) prévoit un barème propre : 1\u002F10e de mois de salaire par année pour les 5 premières années, 2\u002F10e pour les années 6 à 15, et 3\u002F10e au-delà. La condition d'ancienneté est réduite à 8 mois (contre 1 an légalement). Si le barème légal (1\u002F4 et 1\u002F3 de mois) est plus favorable, c'est celui-ci qui s'applique.",{"a":138,"q":119},"Selon la CCN IDCC 1996, les non-cadres bénéficient d'un préavis de 1 mois si leur ancienneté est inférieure à 2 ans, et de 2 mois au-delà. Les cadres ont droit à 3 mois de préavis, que ce soit en cas de licenciement ou de démission. Les travailleurs reconnus handicapés bénéficient d'un préavis doublé (maximum 3 mois).",{"a":140,"q":123},"La grille salariale de la CCN Pharmacie d'Officine est fondée sur un système de coefficients allant de 100 à 800. La valeur du point est fixée à 5,278 € depuis l'accord du 19 janvier 2026 (hausse de 1,21 %). Le salaire mensuel brut minimum se calcule : coefficient × 5,278 €. Soit par exemple 1 824 € pour le coefficient 100 et 4 222 € pour le coefficient 800.",{"a":142,"q":127},"Oui. La CCN Pharmacie d'Officine prévoit une prime d'ancienneté obligatoire et progressive : 3 % du salaire minimum conventionnel à partir de 3 ans d'ancienneté, 6 % à 6 ans, 9 % à 9 ans et 12 % à 12 ans. Cette prime doit figurer sur une ligne séparée du bulletin de salaire et ne peut pas être fondue dans le salaire de base.",{"a":144,"q":131},"Le droit de base est de 30 jours ouvrables par an, conformément à la loi. La CCN accorde en plus des jours supplémentaires selon l'ancienneté : +1 jour à partir de 10 ans d'ancienneté et +3 jours à partir de 20 ans, soit jusqu'à 33 jours ouvrables par an. Des jours de fractionnement (1 à 2 jours) peuvent s'ajouter si des congés sont pris hors période principale.",{"a":146,"q":147},"Oui. La CCN IDCC 1996 prévoit des majorations spécifiques pour les pharmacies ouvertes au public : +20 % pour les heures travaillées entre 20h et 22h ou entre 5h et 8h, et +40 % pour les heures travaillées entre 22h et 5h. Ces majorations s'appliquent en supplément du salaire normal et sont distinctes des majorations pour heures supplémentaires.","Y a-t-il des majorations pour travail de nuit dans la pharmacie d'officine ?",{"a":149,"q":150},"Non, la CCN Pharmacie d'Officine ne prévoit pas de 13e mois obligatoire. Certaines entreprises peuvent néanmoins le verser par usage ou accord d'entreprise. La convention collective prévoit en revanche une prime d'ancienneté obligatoire pouvant atteindre 12 % du salaire minimum conventionnel.","La pharmacie d'officine prévoit-elle un 13e mois ?",{"a":152,"q":153},"Les heures supplémentaires sont majorées à hauteur de 25 % pour les 8 premières heures au-delà de la durée légale hebdomadaire, et de 50 % au-delà. Ces taux sont conformes au barème légal (L3121-36 du Code du travail). Les heures de nuit bénéficient en outre de majorations spécifiques à la CCN.","Quel est le taux de majoration pour les heures supplémentaires en pharmacie d'officine ?",{"a":155,"q":156},"La CCN Pharmacie d'Officine (IDCC 1996) fixe la condition d'ancienneté minimale à 8 mois pour bénéficier de l'indemnité de licenciement, ce qui est plus favorable que le Code du travail qui exige 1 an d'ancienneté (L1234-9).","Quelle est la condition d'ancienneté pour bénéficier de l'indemnité de licenciement en pharmacie d'officine ?",{"a":158,"q":159},"La prime d'ancienneté prévue par la CCN Pharmacie d'Officine est calculée sur la base du salaire minimum conventionnel du coefficient du salarié, proportionnellement aux heures effectivement travaillées. Un salarié à temps partiel percevra donc une prime proratisée selon son taux d'emploi.","Comment s'applique la prime d'ancienneté si le salarié est à temps partiel ?","\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 Pharmacie d'Officine — IDCC 1996\u003C\u002Ftitle>\n  \u003Cscript src=\"https:\u002F\u002Funpkg.com\u002Flucide@latest\u002Fdist\u002Fumd\u002Flucide.min.js\">\u003C\u002Fscript>\n  \u003Cstyle>\n    \u002F* Design tokens *\u002F\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: #16a34a;\n      --success-bg: #f0fdf4;\n      --warning: #ca8a04;\n      --warning-bg: #fefce8;\n      --radius: 0.75rem;\n      --radius-sm: 0.5rem;\n      --shadow: 0 1px 3px rgba(0,0,0,0.08);\n    }\n    *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n    body {\n      font-family: system-ui, -apple-system, sans-serif;\n      background: var(--bg);\n      color: var(--text);\n      font-size: 15px;\n      line-height: 1.5;\n    }\n    .tool-root { max-width: 780px; margin: 0 auto; padding: 1.25rem 1rem 2rem; }\n\n    \u002F* Header *\u002F\n    .tool-header {\n      display: flex; align-items: center; justify-content: space-between;\n      margin-bottom: 1.25rem; flex-wrap: wrap; gap: 0.5rem;\n    }\n    .tool-header h1 {\n      font-size: 1.15rem; font-weight: 700; color: var(--text);\n    }\n    .idcc-badge {\n      background: var(--accent-light); color: var(--accent-dark);\n      font-size: 0.75rem; font-weight: 600; padding: 0.2rem 0.6rem;\n      border-radius: 9999px; white-space: nowrap;\n    }\n\n    \u002F* Tabs *\u002F\n    .tabs-bar {\n      display: flex; gap: 0; overflow-x: auto; border-bottom: 2px solid var(--border);\n      margin-bottom: 1.25rem; scrollbar-width: none;\n    }\n    .tabs-bar::-webkit-scrollbar { display: none; }\n    .tab-btn {\n      flex-shrink: 0; padding: 0.6rem 1rem;\n      background: none; border: none; border-bottom: 2px solid transparent;\n      margin-bottom: -2px; cursor: pointer; font-size: 0.85rem; font-weight: 500;\n      color: var(--text-muted); transition: color .15s, border-color .15s;\n      white-space: nowrap; display: flex; align-items: center; gap: 0.35rem;\n    }\n    .tab-btn:hover { color: var(--accent); }\n    .tab-btn.active { color: var(--accent); border-bottom-color: var(--accent); }\n    .tab-btn svg { width: 14px; height: 14px; }\n\n    \u002F* Panels *\u002F\n    .panel { display: none; }\n    .panel.active { display: block; }\n\n    \u002F* Rule callout *\u002F\n    .rule-callout {\n      background: var(--accent-light); border: 1px solid #bfdbfe;\n      border-radius: var(--radius-sm); padding: 0.75rem 1rem;\n      display: flex; gap: 0.6rem; align-items: flex-start; margin-bottom: 1.25rem;\n    }\n    .rule-callout svg { width: 16px; height: 16px; color: var(--accent); flex-shrink: 0; margin-top: 2px; }\n    .rule-callout p { font-size: 0.875rem; color: #1e40af; line-height: 1.5; }\n    .rule-callout strong { font-weight: 700; }\n\n    \u002F* Form elements *\u002F\n    .form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; margin-bottom: 1.25rem; }\n    @media (max-width: 520px) { .form-grid { grid-template-columns: 1fr; } }\n    .field { display: flex; flex-direction: column; gap: 0.35rem; }\n    .field label { font-size: 0.8rem; font-weight: 600; color: var(--text-muted); text-transform: uppercase; letter-spacing: .03em; }\n    .field-row { display: flex; align-items: center; gap: 0.5rem; }\n    .field-row input[type=range] { flex: 1; }\n    .field-val { font-size: 0.875rem; font-weight: 700; color: var(--accent); min-width: 70px; text-align: right; font-variant-numeric: tabular-nums; }\n\n    input[type=range] {\n      -webkit-appearance: none; height: 4px; background: var(--border);\n      border-radius: 2px; outline: none; cursor: pointer;\n    }\n    input[type=range]::-webkit-slider-thumb {\n      -webkit-appearance: none; width: 18px; height: 18px; border-radius: 50%;\n      background: var(--accent); cursor: pointer; border: 2px solid #fff;\n      box-shadow: 0 1px 3px rgba(0,0,0,.2);\n    }\n    input[type=range]::-moz-range-thumb {\n      width: 18px; height: 18px; border-radius: 50%;\n      background: var(--accent); cursor: pointer; border: 2px solid #fff;\n    }\n\n    select {\n      width: 100%; padding: 0.5rem 0.75rem; border: 1px solid var(--border);\n      border-radius: var(--radius-sm); background: var(--surface); font-size: 0.875rem;\n      color: var(--text); cursor: pointer; outline: none;\n    }\n    select:focus { border-color: var(--accent); }\n\n    \u002F* Pills *\u002F\n    .pills { display: flex; gap: 0.4rem; flex-wrap: wrap; }\n    .pill {\n      padding: 0.35rem 0.75rem; border: 1.5px solid var(--border);\n      border-radius: 9999px; background: var(--surface); font-size: 0.8rem;\n      cursor: pointer; font-weight: 500; color: var(--text-muted); transition: all .15s;\n    }\n    .pill.active { border-color: var(--accent); background: var(--accent-light); color: var(--accent-dark); }\n\n    \u002F* Result card *\u002F\n    .result-card {\n      background: var(--surface); border: 1.5px solid var(--border);\n      border-radius: var(--radius); padding: 1.25rem; margin-top: 0.5rem;\n      box-shadow: var(--shadow);\n    }\n    .result-label { font-size: 0.78rem; font-weight: 600; color: var(--text-muted); text-transform: uppercase; letter-spacing: .04em; margin-bottom: 0.4rem; }\n    .result-main { font-size: 2rem; font-weight: 800; color: var(--accent); font-variant-numeric: tabular-nums; line-height: 1.1; }\n    .result-sub { font-size: 0.8rem; color: var(--text-muted); margin-top: 0.3rem; }\n    .result-breakdown { margin-top: 0.75rem; border-top: 1px solid var(--border); padding-top: 0.75rem; }\n    .result-row { display: flex; justify-content: space-between; font-size: 0.82rem; margin-bottom: 0.25rem; }\n    .result-row .rk { color: var(--text-muted); }\n    .result-row .rv { font-weight: 600; font-variant-numeric: tabular-nums; }\n\n    \u002F* Disclaimer *\u002F\n    .disclaimer {\n      margin-top: 1.5rem; padding: 0.75rem 1rem;\n      background: #f5f5f4; border-radius: var(--radius-sm);\n      font-size: 0.75rem; color: var(--text-muted); line-height: 1.6;\n      border-left: 3px solid var(--border);\n    }\n    .disclaimer a { color: var(--accent); text-decoration: none; }\n    .disclaimer a:hover { text-decoration: underline; }\n\n    \u002F* Salary grid table *\u002F\n    .grid-table { width: 100%; border-collapse: collapse; font-size: 0.82rem; margin-top: 0.75rem; }\n    .grid-table th { background: var(--accent-light); color: var(--accent-dark); font-weight: 700; padding: 0.5rem 0.75rem; text-align: left; border: 1px solid #bfdbfe; }\n    .grid-table td { padding: 0.4rem 0.75rem; border: 1px solid var(--border); }\n    .grid-table tr:nth-child(even) td { background: #fafaf9; }\n    .grid-table tr:hover td { background: var(--accent-light); }\n\n    \u002F* Night premium badge *\u002F\n    .premium-row {\n      display: flex; justify-content: space-between; align-items: center;\n      padding: 0.5rem 0.75rem; border-radius: var(--radius-sm);\n      background: var(--success-bg); border: 1px solid #bbf7d0;\n      font-size: 0.82rem; margin-top: 0.4rem;\n    }\n    .premium-row .pk { color: #15803d; }\n    .premium-row .pv { font-weight: 700; color: #16a34a; font-variant-numeric: tabular-nums; }\n  \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody>\n\u003C!-- CCN IDCC 1996 — Pharmacie d'Officine — deviations\n     indemnite: L1234-9 → taux 1\u002F10e, 2\u002F10e, 3\u002F10e progressif selon ancienneté (art. 21, 37, 38 CCN)\n                          + ancienneté minimale 8 mois (vs 1 an légal)\n     preavis: L1234-1 → 1 mois (non-cadre \u003C2 ans), 2 mois (non-cadre ≥2 ans), 3 mois (cadres)\n     salaire-min: coefficient 100-800, valeur du point €5,278 (accord 19 jan 2026)\n     prime-anciennete: 3%, 6%, 9%, 12% selon paliers d'ancienneté (3\u002F6\u002F9\u002F12 ans)\n     conges: +1 jour (10 ans), +3 jours (20 ans) d'ancienneté au-delà des 30 jours légaux\n     nuit: +20% (20h-22h ou 5h-8h), +40% (22h-5h) — spécifique CCN\n     Source: convention.fr, legisocial.fr, juristique.org — IDCC 1996 -->\n\n\u003Cmain class=\"tool-root\">\n  \u003Cdiv class=\"tool-header\">\n    \u003Ch1>CCN Pharmacie d'Officine\u003C\u002Fh1>\n    \u003Cspan class=\"idcc-badge\">IDCC 1996\u003C\u002Fspan>\n  \u003C\u002Fdiv>\n\n  \u003C!-- Tabs bar -->\n  \u003Cdiv class=\"tabs-bar\" role=\"tablist\">\n    \u003Cbutton class=\"tab-btn\" data-tab=\"indemnite\" role=\"tab\" aria-selected=\"false\">\n      \u003Ci data-lucide=\"calculator\">\u003C\u002Fi>Indemnité\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"preavis\" role=\"tab\" aria-selected=\"false\">\n      \u003Ci data-lucide=\"clock\">\u003C\u002Fi>Préavis\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"salaire\" role=\"tab\" aria-selected=\"false\">\n      \u003Ci data-lucide=\"bar-chart-2\">\u003C\u002Fi>Grille salariale\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"anciennete\" role=\"tab\" aria-selected=\"false\">\n      \u003Ci data-lucide=\"trending-up\">\u003C\u002Fi>Prime ancienneté\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"conges\" role=\"tab\" aria-selected=\"false\">\n      \u003Ci data-lucide=\"calendar\">\u003C\u002Fi>Congés\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"nuit\" role=\"tab\" aria-selected=\"false\">\n      \u003Ci data-lucide=\"moon\">\u003C\u002Fi>Travail de nuit\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ─────────── PANEL: INDEMNITÉ ─────────── -->\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 Pharmacie d'Officine prévoit un barème propre : \u003Cstrong>1\u002F10e de mois par année (0-5 ans), 2\u002F10e (6-15 ans), 3\u002F10e (au-delà)\u003C\u002Fstrong>, avec une condition d'ancienneté réduite à \u003Cstrong>8 mois\u003C\u002Fstrong> (contre 1 an dans le Code du travail). Note : les taux légaux (1\u002F4 et 1\u002F3) s'appliquent si plus favorables pour le salarié.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\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=\"1600\" max=\"7000\" step=\"50\" value=\"2500\">\n          \u003Cspan class=\"field-val\" id=\"ind-salaire-val\">2 500 €\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Ancienneté (années)\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"ind-anc\" min=\"1\" max=\"40\" step=\"1\" value=\"10\">\n          \u003Cspan class=\"field-val\" id=\"ind-anc-val\">10 ans\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"field\" style=\"margin-bottom:1.25rem\">\n      \u003Clabel>Motif de rupture\u003C\u002Flabel>\n      \u003Cdiv class=\"pills\" id=\"ind-motif-pills\">\n        \u003Cbutton class=\"pill active\" data-val=\"licenciement\">Licenciement\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-val=\"retraite_emp\">Départ à la retraite (salarié)\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-val=\"retraite_miss\">Mise à la retraite (employeur)\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"ind-result\">\n      \u003Cdiv class=\"result-label\">Indemnité estimée\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-main\" id=\"ind-amount\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"ind-sub\">\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-breakdown\" id=\"ind-breakdown\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ─────────── PANEL: 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 distingue \u003Cstrong>cadres\u003C\u002Fstrong> (3 mois dans les deux sens) et \u003Cstrong>non-cadres\u003C\u002Fstrong> (1 mois &lt;2 ans, 2 mois ≥2 ans). Les travailleurs en situation de handicap bénéficient d'un préavis doublé (max 3 mois).\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Statut\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"pr-statut-pills\">\n          \u003Cbutton class=\"pill active\" data-val=\"non-cadre\">Non-cadre\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"cadre\">Cadre\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Ancienneté (années)\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"pr-anc\" min=\"0\" max=\"40\" step=\"1\" value=\"3\">\n          \u003Cspan class=\"field-val\" id=\"pr-anc-val\">3 ans\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"field\" style=\"margin-bottom:1.25rem\">\n      \u003Clabel>Type de rupture\u003C\u002Flabel>\n      \u003Cdiv class=\"pills\" id=\"pr-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\n    \u003Cdiv class=\"field\" style=\"margin-bottom:1.25rem\">\n      \u003Clabel>Travailleur en situation de handicap (RQTH) ?\u003C\u002Flabel>\n      \u003Cdiv class=\"pills\" id=\"pr-handicap-pills\">\n        \u003Cbutton class=\"pill active\" data-val=\"non\">Non\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-val=\"oui\">Oui (préavis doublé)\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"pr-result\">\n      \u003Cdiv class=\"result-label\">Durée du préavis\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-main\" id=\"pr-duree\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"pr-sub\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ─────────── PANEL: GRILLE SALARIALE ─────────── -->\n  \u003Cdiv class=\"panel\" data-panel=\"salaire\" role=\"tabpanel\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN Pharmacie d'Officine prévoit une grille par \u003Cstrong>coefficient (100 à 800)\u003C\u002Fstrong>, avec une valeur du point de \u003Cstrong>5,278 €\u003C\u002Fstrong> au 1er janvier 2026. Le salaire mensuel brut minimum = coefficient × valeur du point.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Coefficient \u002F Poste\u003C\u002Flabel>\n        \u003Cselect id=\"sal-coeff\">\n          \u003Coption value=\"100\">100 — Employé(e) (entrée)\u003C\u002Foption>\n          \u003Coption value=\"110\">110 — Agent de comptoir débutant\u003C\u002Foption>\n          \u003Coption value=\"120\">120 — Préparateur(trice) débutant(e)\u003C\u002Foption>\n          \u003Coption value=\"150\">150 — Employé(e) qualifié(e)\u003C\u002Foption>\n          \u003Coption value=\"180\">180 — Préparateur(trice) confirmé(e)\u003C\u002Foption>\n          \u003Coption value=\"200\">200 — Technicien(ne) labo \u002F autonome\u003C\u002Foption>\n          \u003Coption value=\"220\">220 — Préparateur(trice) expérimenté(e)\u003C\u002Foption>\n          \u003Coption value=\"240\" selected>240 — Chef de rayon \u002F Adjoint\u003C\u002Foption>\n          \u003Coption value=\"300\">300 — Pharmacien(ne) adjoint(e) débutant\u003C\u002Foption>\n          \u003Coption value=\"350\">350 — Pharmacien(ne) adjoint(e)\u003C\u002Foption>\n          \u003Coption value=\"400\">400 — Pharmacien(ne) confirmé(e)\u003C\u002Foption>\n          \u003Coption value=\"430\">430 — Pharmacien(ne) senior\u003C\u002Foption>\n          \u003Coption value=\"500\">500 — Pharmacien(ne) expérimenté(e)\u003C\u002Foption>\n          \u003Coption value=\"600\">600 — Directeur(trice) adjoint(e)\u003C\u002Foption>\n          \u003Coption value=\"700\">700 — Directeur(trice) pharmacie\u003C\u002Foption>\n          \u003Coption value=\"800\">800 — Directeur(trice) confirmé(e)\u003C\u002Foption>\n        \u003C\u002Fselect>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Heures hebdomadaires\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"sal-heures\" min=\"24\" max=\"39\" step=\"0.5\" value=\"35\">\n          \u003Cspan class=\"field-val\" id=\"sal-heures-val\">35 h\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"sal-result\">\n      \u003Cdiv class=\"result-label\">Salaire brut mensuel minimum\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-main\" id=\"sal-amount\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"sal-sub\">\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-breakdown\" id=\"sal-breakdown\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdetails style=\"margin-top:1rem\">\n      \u003Csummary style=\"cursor:pointer; font-size:0.82rem; color:var(--text-muted); font-weight:600\">Voir les principaux coefficients 2026\u003C\u002Fsummary>\n      \u003Ctable class=\"grid-table\" style=\"margin-top:0.5rem\">\n        \u003Cthead>\u003Ctr>\u003Cth>Coefficient\u003C\u002Fth>\u003Cth>Profil indicatif\u003C\u002Fth>\u003Cth>Salaire mini brut\u002Fmois\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\n        \u003Ctbody id=\"sal-table-body\">\u003C\u002Ftbody>\n      \u003C\u002Ftable>\n    \u003C\u002Fdetails>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ─────────── PANEL: PRIME ANCIENNETÉ ─────────── -->\n  \u003Cdiv class=\"panel\" data-panel=\"anciennete\" role=\"tabpanel\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN prévoit une \u003Cstrong>prime d'ancienneté obligatoire\u003C\u002Fstrong> progressive : \u003Cstrong>3% à 3 ans, 6% à 6 ans, 9% à 9 ans, 12% à 12 ans\u003C\u002Fstrong>, calculée sur le salaire minimum conventionnel du coefficient du salarié (hors majorations et primes diverses). Elle doit figurer sur une ligne séparée du bulletin de salaire.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Salaire minimum conventionnel mensuel\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"anc-salmin\" min=\"1600\" max=\"6500\" step=\"50\" value=\"2500\">\n          \u003Cspan class=\"field-val\" id=\"anc-salmin-val\">2 500 €\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Ancienneté (années)\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"anc-years\" min=\"0\" max=\"35\" step=\"1\" value=\"7\">\n          \u003Cspan class=\"field-val\" id=\"anc-years-val\">7 ans\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"anc-result\">\n      \u003Cdiv class=\"result-label\">Prime d'ancienneté mensuelle\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-main\" id=\"anc-amount\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"anc-sub\">\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-breakdown\" id=\"anc-breakdown\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ─────────── PANEL: CONGÉS ─────────── -->\n  \u003Cdiv class=\"panel\" data-panel=\"conges\" role=\"tabpanel\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>Au-delà des \u003Cstrong>30 jours ouvrables légaux\u003C\u002Fstrong>, la CCN accorde des jours supplémentaires selon l'ancienneté : \u003Cstrong>+1 jour à partir de 10 ans\u003C\u002Fstrong>, \u003Cstrong>+3 jours à partir de 20 ans\u003C\u002Fstrong> (soit jusqu'à 33 jours ouvrables\u002Fan). Des jours de fractionnement s'ajoutent en cas de prise de congés hors période principale.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Ancienneté (années)\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"cg-anc\" min=\"0\" max=\"35\" step=\"1\" value=\"12\">\n          \u003Cspan class=\"field-val\" id=\"cg-anc-val\">12 ans\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Jours pris hors période principale (juil-août)\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"cg-frac-pills\">\n          \u003Cbutton class=\"pill active\" data-val=\"0\">0 jour\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"3_5\">3 à 5 jours\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"6_plus\">6 jours ou plus\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"cg-result\">\n      \u003Cdiv class=\"result-label\">Droit annuel aux congés payés\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-main\" id=\"cg-total\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"cg-sub\">\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-breakdown\" id=\"cg-breakdown\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ─────────── PANEL: TRAVAIL DE NUIT ─────────── -->\n  \u003Cdiv class=\"panel\" data-panel=\"nuit\" role=\"tabpanel\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN Pharmacie d'Officine prévoit des \u003Cstrong>majorations spécifiques pour le travail de nuit\u003C\u002Fstrong> (pharmacies ouvertes au public) : \u003Cstrong>+20 % entre 20h-22h et 5h-8h\u003C\u002Fstrong>, \u003Cstrong>+40 % entre 22h et 5h\u003C\u002Fstrong>. Ces majorations s'appliquent en supplément du salaire habituel et sont distinctes des majorations pour heures supplémentaires.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Taux horaire brut (€)\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"nuit-taux\" min=\"10\" max=\"60\" step=\"0.5\" value=\"18\">\n          \u003Cspan class=\"field-val\" id=\"nuit-taux-val\">18,00 €\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Plage travaillée\u003C\u002Flabel>\n        \u003Cselect id=\"nuit-plage\">\n          \u003Coption value=\"soiree\">20h–22h ou 5h–8h (majoration +20 %)\u003C\u002Foption>\n          \u003Coption value=\"nuit_profonde\">22h–5h (majoration +40 %)\u003C\u002Foption>\n          \u003Coption value=\"mixte\">Mixte (20h–22h + 22h–5h)\u003C\u002Foption>\n        \u003C\u002Fselect>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Heures en plage +20 % (h)\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"nuit-h20\" min=\"0\" max=\"8\" step=\"0.5\" value=\"2\">\n          \u003Cspan class=\"field-val\" id=\"nuit-h20-val\">2 h\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Heures en plage +40 % (h)\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"nuit-h40\" min=\"0\" max=\"8\" step=\"0.5\" value=\"3\">\n          \u003Cspan class=\"field-val\" id=\"nuit-h40-val\">3 h\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"nuit-result\">\n      \u003Cdiv class=\"result-label\">Majoration nuit estimée\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-main\" id=\"nuit-amount\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"nuit-sub\">\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-breakdown\" id=\"nuit-breakdown\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- Shared disclaimer -->\n  \u003Cdiv class=\"disclaimer\">\n    \u003Ci data-lucide=\"shield\" style=\"width:12px;height:12px;vertical-align:middle;margin-right:4px;\">\u003C\u002Fi>\n    Calcul indicatif basé sur la CCN IDCC 1996 (Pharmacie d'Officine, brochure n°3052).\n    Source : \u003Ca href=\"https:\u002F\u002Fwww.legifrance.gouv.fr\u002Fsearch\u002F#\" target=\"_blank\" rel=\"noopener\">Legifrance\u003C\u002Fa> — Accord de branche janvier 2026 (valeur du point 5,278 €).\n    Pour une validation légale\n  \u003C\u002Fdiv>\n\u003C\u002Fmain>\n\n\u003Cscript>\n\u002F\u002F ─── Formatters ───────────────────────────────────────────────────────────────\nconst fmtEUR = v => new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', maximumFractionDigits: 2 }).format(v);\nconst fmtNum = v => new Intl.NumberFormat('fr-FR', { maximumFractionDigits: 2 }).format(v);\n\n\u002F\u002F ─── State objects ────────────────────────────────────────────────────────────\nconst indState = { salaire: 2500, anc: 10, motif: 'licenciement' };\nconst prState  = { statut: 'non-cadre', anc: 3, type: 'licenciement', handicap: 'non' };\nconst salState = { coeff: 240, heures: 35 };\nconst ancState = { salmin: 2500, years: 7 };\nconst cgState  = { anc: 12, frac: '0' };\nconst nuitState = { taux: 18, plage: 'soiree', h20: 2, h40: 3 };\n\n\u002F\u002F ─── INDEMNITÉ ────────────────────────────────────────────────────────────────\nfunction computeInd(s) {\n  const { salaire, anc, motif } = s;\n\n  \u002F\u002F CCN formula (art 21\u002F37\u002F38 IDCC 1996)\n  \u002F\u002F 1\u002F10 par an pour les 5 premières années\n  \u002F\u002F 2\u002F10 par an pour les années 6 à 15\n  \u002F\u002F 3\u002F10 par an au-delà de 15 ans\n  let ccn = 0;\n  if (anc \u003C= 5) {\n    ccn = salaire * (1\u002F10) * anc;\n  } else if (anc \u003C= 15) {\n    ccn = salaire * (1\u002F10) * 5 + salaire * (2\u002F10) * (anc - 5);\n  } else {\n    ccn = salaire * (1\u002F10) * 5 + salaire * (2\u002F10) * 10 + salaire * (3\u002F10) * (anc - 15);\n  }\n\n  \u002F\u002F Legal formula (L1234-9) — apply if more favorable\n  let legal = 0;\n  if (anc \u003C= 10) {\n    legal = salaire * (1\u002F4) * anc;\n  } else {\n    legal = salaire * (1\u002F4) * 10 + salaire * (1\u002F3) * (anc - 10);\n  }\n\n  let coeff = 1;\n  if (motif === 'retraite_emp') coeff = 0.5;  \u002F\u002F simplified\n  if (motif === 'retraite_miss') coeff = 1;\n\n  const base = Math.max(ccn, legal) * coeff;\n  const isCCN = ccn >= legal;\n\n  return { base, ccn: ccn * coeff, legal: legal * coeff, isCCN };\n}\n\nfunction renderInd() {\n  const r = computeInd(indState);\n  document.getElementById('ind-amount').textContent = fmtEUR(r.base);\n  document.getElementById('ind-sub').textContent = r.isCCN\n    ? 'Barème CCN appliqué (plus favorable que le légal pour cet ancienneté)'\n    : 'Barème légal L1234-9 appliqué (plus favorable que le CCN)';\n  const bd = document.getElementById('ind-breakdown');\n  bd.innerHTML = `\n    \u003Cdiv class=\"result-row\">\u003Cspan class=\"rk\">Calcul CCN (barème propre)\u003C\u002Fspan>\u003Cspan class=\"rv\">${fmtEUR(r.ccn)}\u003C\u002Fspan>\u003C\u002Fdiv>\n    \u003Cdiv class=\"result-row\">\u003Cspan class=\"rk\">Calcul légal L1234-9\u003C\u002Fspan>\u003Cspan class=\"rv\">${fmtEUR(r.legal)}\u003C\u002Fspan>\u003C\u002Fdiv>\n    \u003Cdiv class=\"result-row\">\u003Cspan class=\"rk\">Retenu (plus favorable)\u003C\u002Fspan>\u003Cspan class=\"rv\" style=\"color:var(--accent)\">${fmtEUR(r.base)}\u003C\u002Fspan>\u003C\u002Fdiv>\n  `;\n}\n\n\u002F\u002F ─── PRÉAVIS ──────────────────────────────────────────────────────────────────\nfunction computePr(s) {\n  let mois;\n  if (s.statut === 'cadre') {\n    mois = 3;\n  } else {\n    if (s.type === 'demission') {\n      mois = 1;\n    } else {\n      mois = s.anc >= 2 ? 2 : 1;\n    }\n  }\n  if (s.handicap === 'oui') {\n    mois = Math.min(mois * 2, 3);\n  }\n  return { mois };\n}\n\nfunction renderPr() {\n  const r = computePr(prState);\n  document.getElementById('pr-duree').textContent = r.mois + ' mois';\n  document.getElementById('pr-sub').textContent =\n    prState.statut === 'cadre'\n      ? 'Cadres : 3 mois (licenciement et démission)'\n      : prState.anc >= 2\n        ? 'Non-cadre, ancienneté ≥ 2 ans : 2 mois'\n        : 'Non-cadre, ancienneté \u003C 2 ans : 1 mois';\n}\n\n\u002F\u002F ─── SALAIRE MIN ──────────────────────────────────────────────────────────────\nconst POINT_VALEUR = 5.278; \u002F\u002F accord 19 jan 2026\nconst COEFFS_GRID = [\n  [100,'Employé(e) entrée'], [110,'Agent comptoir déb.'], [120,'Préparateur déb.'],\n  [150,'Employé qualifié'], [180,'Préparateur confirmé'], [200,'Technicien labo'],\n  [220,'Préparateur expérimenté'], [240,'Chef rayon \u002F Adjoint'],\n  [300,'Pharmacien adjoint déb.'], [350,'Pharmacien adjoint'],\n  [400,'Pharmacien confirmé'], [430,'Pharmacien senior'],\n  [500,'Pharmacien expérimenté'], [600,'Directeur adjoint'],\n  [700,'Directeur pharmacie'], [800,'Directeur confirmé']\n];\n\nfunction computeSal(s) {\n  const base35 = s.coeff * POINT_VALEUR;\n  const adjusted = base35 * (s.heures \u002F 35);\n  return { base35, adjusted };\n}\n\nfunction renderSal() {\n  const r = computeSal(salState);\n  document.getElementById('sal-amount').textContent = fmtEUR(r.adjusted);\n  document.getElementById('sal-sub').textContent =\n    `Coefficient ${salState.coeff} × ${fmtNum(POINT_VALEUR)} € = ${fmtEUR(r.base35)} brut\u002Fmois (35 h) — proratisé à ${salState.heures} h`;\n  const bd = document.getElementById('sal-breakdown');\n  bd.innerHTML = `\n    \u003Cdiv class=\"result-row\">\u003Cspan class=\"rk\">Valeur du point (jan. 2026)\u003C\u002Fspan>\u003Cspan class=\"rv\">${fmtNum(POINT_VALEUR)} €\u003C\u002Fspan>\u003C\u002Fdiv>\n    \u003Cdiv class=\"result-row\">\u003Cspan class=\"rk\">Coefficient sélectionné\u003C\u002Fspan>\u003Cspan class=\"rv\">${salState.coeff}\u003C\u002Fspan>\u003C\u002Fdiv>\n    \u003Cdiv class=\"result-row\">\u003Cspan class=\"rk\">Salaire mini 35 h\u003C\u002Fspan>\u003Cspan class=\"rv\">${fmtEUR(r.base35)}\u003C\u002Fspan>\u003C\u002Fdiv>\n    \u003Cdiv class=\"result-row\">\u003Cspan class=\"rk\">Proratisé ${salState.heures} h\u003C\u002Fspan>\u003Cspan class=\"rv\" style=\"color:var(--accent)\">${fmtEUR(r.adjusted)}\u003C\u002Fspan>\u003C\u002Fdiv>\n  `;\n  \u002F\u002F Populate table\n  const tbody = document.getElementById('sal-table-body');\n  if (tbody) {\n    tbody.innerHTML = COEFFS_GRID.map(([c, label]) =>\n      `\u003Ctr>\u003Ctd>\u003Cstrong>${c}\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>${label}\u003C\u002Ftd>\u003Ctd>${fmtEUR(c * POINT_VALEUR)}\u003C\u002Ftd>\u003C\u002Ftr>`\n    ).join('');\n  }\n}\n\n\u002F\u002F ─── PRIME ANCIENNETÉ ─────────────────────────────────────────────────────────\nfunction computeAnc(s) {\n  let pct = 0;\n  if (s.years >= 12) pct = 0.12;\n  else if (s.years >= 9) pct = 0.09;\n  else if (s.years >= 6) pct = 0.06;\n  else if (s.years >= 3) pct = 0.03;\n  const prime = s.salmin * pct;\n  return { pct, prime };\n}\n\nfunction renderAnc() {\n  const r = computeAnc(ancState);\n  document.getElementById('anc-amount').textContent = r.pct > 0 ? fmtEUR(r.prime) : '0 €';\n  document.getElementById('anc-sub').textContent = r.pct > 0\n    ? `Taux : ${(r.pct*100).toFixed(0)} % × salaire mini conventionnel`\n    : 'Ancienneté \u003C 3 ans — prime non encore due';\n  const bd = document.getElementById('anc-breakdown');\n  bd.innerHTML = `\n    \u003Cdiv class=\"result-row\">\u003Cspan class=\"rk\">Ancienneté saisie\u003C\u002Fspan>\u003Cspan class=\"rv\">${ancState.years} an(s)\u003C\u002Fspan>\u003C\u002Fdiv>\n    \u003Cdiv class=\"result-row\">\u003Cspan class=\"rk\">Taux applicable\u003C\u002Fspan>\u003Cspan class=\"rv\">${(r.pct*100).toFixed(0)} %\u003C\u002Fspan>\u003C\u002Fdiv>\n    \u003Cdiv class=\"result-row\">\u003Cspan class=\"rk\">Base de calcul (sal. mini)\u003C\u002Fspan>\u003Cspan class=\"rv\">${fmtEUR(ancState.salmin)}\u003C\u002Fspan>\u003C\u002Fdiv>\n    \u003Cdiv class=\"result-row\">\u003Cspan class=\"rk\">Prime mensuelle\u003C\u002Fspan>\u003Cspan class=\"rv\" style=\"color:var(--accent)\">${fmtEUR(r.prime)}\u003C\u002Fspan>\u003C\u002Fdiv>\n    \u003Cdiv class=\"result-row\">\u003Cspan class=\"rk\">Prime annuelle\u003C\u002Fspan>\u003Cspan class=\"rv\">${fmtEUR(r.prime * 12)}\u003C\u002Fspan>\u003C\u002Fdiv>\n  `;\n}\n\n\u002F\u002F ─── CONGÉS ───────────────────────────────────────────────────────────────────\nfunction computeCg(s) {\n  let base = 30;\n  let extra = 0;\n  if (s.anc >= 20) extra = 3;\n  else if (s.anc >= 10) extra = 1;\n\n  let frac = 0;\n  if (s.frac === '6_plus') frac = 2;\n  else if (s.frac === '3_5') frac = 1;\n\n  return { base, extra, frac, total: base + extra + frac };\n}\n\nfunction renderCg() {\n  const r = computeCg(cgState);\n  document.getElementById('cg-total').textContent = r.total + ' j. ouvrables';\n  document.getElementById('cg-sub').textContent =\n    r.extra > 0 || r.frac > 0\n      ? `Base légale ${r.base} + ancienneté +${r.extra} + fractionnement +${r.frac}`\n      : 'Droit légal standard (ancienneté \u003C 10 ans, pas de fractionnement)';\n  const bd = document.getElementById('cg-breakdown');\n  bd.innerHTML = `\n    \u003Cdiv class=\"result-row\">\u003Cspan class=\"rk\">Base légale (L3141-3)\u003C\u002Fspan>\u003Cspan class=\"rv\">${r.base} j\u003C\u002Fspan>\u003C\u002Fdiv>\n    \u003Cdiv class=\"result-row\">\u003Cspan class=\"rk\">Supplément ancienneté CCN\u003C\u002Fspan>\u003Cspan class=\"rv\">+${r.extra} j\u003C\u002Fspan>\u003C\u002Fdiv>\n    \u003Cdiv class=\"result-row\">\u003Cspan class=\"rk\">Jours de fractionnement\u003C\u002Fspan>\u003Cspan class=\"rv\">+${r.frac} j\u003C\u002Fspan>\u003C\u002Fdiv>\n    \u003Cdiv class=\"result-row\">\u003Cspan class=\"rk\">Total\u003C\u002Fspan>\u003Cspan class=\"rv\" style=\"color:var(--accent)\">${r.total} j\u003C\u002Fspan>\u003C\u002Fdiv>\n  `;\n}\n\n\u002F\u002F ─── TRAVAIL DE NUIT ──────────────────────────────────────────────────────────\nfunction computeNuit(s) {\n  const plage = document.getElementById('nuit-plage').value;\n  let total = 0;\n  let h20show = s.h20, h40show = s.h40;\n\n  if (plage === 'soiree') {\n    h40show = 0;\n    total = s.taux * h20show * 0.20;\n  } else if (plage === 'nuit_profonde') {\n    h20show = 0;\n    total = s.taux * h40show * 0.40;\n  } else {\n    total = s.taux * h20show * 0.20 + s.taux * h40show * 0.40;\n  }\n\n  return { total, maj20: s.taux * h20show * 0.20, maj40: s.taux * h40show * 0.40, h20show, h40show };\n}\n\nfunction renderNuit() {\n  const plage = document.getElementById('nuit-plage').value;\n  const h20Row = document.getElementById('nuit-h20').closest('.field');\n  const h40Row = document.getElementById('nuit-h40').closest('.field');\n  h20Row.style.display = plage === 'nuit_profonde' ? 'none' : '';\n  h40Row.style.display = plage === 'soiree' ? 'none' : '';\n\n  const r = computeNuit(nuitState);\n  document.getElementById('nuit-amount').textContent = fmtEUR(r.total);\n  document.getElementById('nuit-sub').textContent = 'Majoration nuit seule (hors salaire de base)';\n  const bd = document.getElementById('nuit-breakdown');\n  bd.innerHTML = `\n    ${r.h20show > 0 ? `\u003Cdiv class=\"result-row\">\u003Cspan class=\"rk\">Plage +20 % (${r.h20show} h × ${fmtNum(nuitState.taux)} € × 20 %)\u003C\u002Fspan>\u003Cspan class=\"rv\">${fmtEUR(r.maj20)}\u003C\u002Fspan>\u003C\u002Fdiv>` : ''}\n    ${r.h40show > 0 ? `\u003Cdiv class=\"result-row\">\u003Cspan class=\"rk\">Plage +40 % (${r.h40show} h × ${fmtNum(nuitState.taux)} € × 40 %)\u003C\u002Fspan>\u003Cspan class=\"rv\">${fmtEUR(r.maj40)}\u003C\u002Fspan>\u003C\u002Fdiv>` : ''}\n    \u003Cdiv class=\"result-row\">\u003Cspan class=\"rk\">Total majoration nuit\u003C\u002Fspan>\u003Cspan class=\"rv\" style=\"color:var(--accent)\">${fmtEUR(r.total)}\u003C\u002Fspan>\u003C\u002Fdiv>\n  `;\n}\n\n\u002F\u002F ─── TAB SYSTEM ───────────────────────────────────────────────────────────────\nconst tabs = document.querySelectorAll('[data-tab]');\nconst panels = document.querySelectorAll('[data-panel]');\n\nfunction activate(id) {\n  tabs.forEach(t => {\n    t.classList.toggle('active', t.dataset.tab === id);\n    t.setAttribute('aria-selected', t.dataset.tab === id ? 'true' : 'false');\n  });\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  \u002F\u002F Render current panel\n  if (id === 'indemnite') renderInd();\n  if (id === 'preavis') renderPr();\n  if (id === 'salaire') renderSal();\n  if (id === 'anciennete') renderAnc();\n  if (id === 'conges') renderCg();\n  if (id === 'nuit') renderNuit();\n}\n\ntabs.forEach(t => t.addEventListener('click', () => activate(t.dataset.tab)));\nconst hashTab = location.hash.slice(1);\nconst validHash = document.querySelector(`[data-tab=\"${hashTab}\"]`) ? hashTab : 'indemnite';\nactivate(validHash);\n\n\u002F\u002F ─── Input listeners ──────────────────────────────────────────────────────────\n\u002F\u002F Indemnité\ndocument.getElementById('ind-salaire').addEventListener('input', e => {\n  indState.salaire = +e.target.value;\n  document.getElementById('ind-salaire-val').textContent = fmtEUR(+e.target.value);\n  renderInd();\n});\ndocument.getElementById('ind-anc').addEventListener('input', e => {\n  indState.anc = +e.target.value;\n  document.getElementById('ind-anc-val').textContent = +e.target.value + ' 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\ndocument.getElementById('pr-anc').addEventListener('input', e => {\n  prState.anc = +e.target.value;\n  document.getElementById('pr-anc-val').textContent = +e.target.value + ' ans';\n  renderPr();\n});\ndocument.querySelectorAll('#pr-statut-pills .pill').forEach(p => {\n  p.addEventListener('click', () => {\n    document.querySelectorAll('#pr-statut-pills .pill').forEach(x => x.classList.remove('active'));\n    p.classList.add('active');\n    prState.statut = p.dataset.val;\n    renderPr();\n  });\n});\ndocument.querySelectorAll('#pr-type-pills .pill').forEach(p => {\n  p.addEventListener('click', () => {\n    document.querySelectorAll('#pr-type-pills .pill').forEach(x => x.classList.remove('active'));\n    p.classList.add('active');\n    prState.type = p.dataset.val;\n    renderPr();\n  });\n});\ndocument.querySelectorAll('#pr-handicap-pills .pill').forEach(p => {\n  p.addEventListener('click', () => {\n    document.querySelectorAll('#pr-handicap-pills .pill').forEach(x => x.classList.remove('active'));\n    p.classList.add('active');\n    prState.handicap = p.dataset.val;\n    renderPr();\n  });\n});\n\n\u002F\u002F Salaire\ndocument.getElementById('sal-coeff').addEventListener('change', e => {\n  salState.coeff = +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 = (+e.target.value).toFixed(1).replace('.0','') + ' h';\n  renderSal();\n});\n\n\u002F\u002F Prime ancienneté\ndocument.getElementById('anc-salmin').addEventListener('input', e => {\n  ancState.salmin = +e.target.value;\n  document.getElementById('anc-salmin-val').textContent = fmtEUR(+e.target.value);\n  renderAnc();\n});\ndocument.getElementById('anc-years').addEventListener('input', e => {\n  ancState.years = +e.target.value;\n  document.getElementById('anc-years-val').textContent = +e.target.value + ' ans';\n  renderAnc();\n});\n\n\u002F\u002F Congés\ndocument.getElementById('cg-anc').addEventListener('input', e => {\n  cgState.anc = +e.target.value;\n  document.getElementById('cg-anc-val').textContent = +e.target.value + ' ans';\n  renderCg();\n});\ndocument.querySelectorAll('#cg-frac-pills .pill').forEach(p => {\n  p.addEventListener('click', () => {\n    document.querySelectorAll('#cg-frac-pills .pill').forEach(x => x.classList.remove('active'));\n    p.classList.add('active');\n    cgState.frac = p.dataset.val;\n    renderCg();\n  });\n});\n\n\u002F\u002F Nuit\ndocument.getElementById('nuit-taux').addEventListener('input', e => {\n  nuitState.taux = +e.target.value;\n  document.getElementById('nuit-taux-val').textContent = fmtNum(+e.target.value) + ' €';\n  renderNuit();\n});\ndocument.getElementById('nuit-plage').addEventListener('change', () => renderNuit());\ndocument.getElementById('nuit-h20').addEventListener('input', e => {\n  nuitState.h20 = +e.target.value;\n  document.getElementById('nuit-h20-val').textContent = (+e.target.value).toFixed(1).replace('.0','') + ' h';\n  renderNuit();\n});\ndocument.getElementById('nuit-h40').addEventListener('input', e => {\n  nuitState.h40 = +e.target.value;\n  document.getElementById('nuit-h40-val').textContent = (+e.target.value).toFixed(1).replace('.0','') + ' h';\n  renderNuit();\n});\n\n\u002F\u002F ─── ResizeObserver (iframe contract) ────────────────────────────────────────\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 ─── Icons ────────────────────────────────────────────────────────────────────\nif (window.lucide) lucide.createIcons();\n\u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","generated","juridique","consumer","both","https:\u002F\u002Fpub-bdebbd2dad294475a2da0eb657815b6b.r2.dev\u002Ftools\u002Fccn-pharmacie-officine-bcec96981f.webp",[]]