[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"footer-root-categories-fr-FR":3,"tool-content-ccn-boyauderie-fr":83,"footer-cities-fr":146},[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":109,"tool_html":140,"source":141,"category":142,"audience":143,"publish_mode":144,"hero_image":145,"hero_image_alt":85},"ccn-boyauderie","CCN de la boyauderie — calculateur complet","Calculateur CCN Boyauderie IDCC 1543 | Expert Zoom","Outil interactif couvrant indemnité de licenciement, préavis, grille salariale, 13e mois, congés payés et heures supplémentaires de la CCN de la boyauderie (IDCC 1543).","Ce calculateur couvre l'ensemble des dispositions spécifiques de la convention collective de la boyauderie (IDCC 1543) : indemnité de licenciement (comparée au plancher légal), durée de préavis par statut, grille salariale par coefficient, 13e mois obligatoire et prime d'ancienneté, jours de congés supplémentaires selon l'ancienneté, et majorations pour heures supplémentaires incluant la prime dimanche.",[90],{"name":91,"@type":92,"about":93,"author":97,"@context":100,"isPartOf":101,"inLanguage":104,"description":105,"operatingSystem":106,"applicationCategory":107,"isAccessibleForFree":108},"Calculateur CCN de la boyauderie — IDCC 1543","WebApplication",{"name":94,"@type":95,"identifier":96},"Convention collective de la boyauderie","Thing","IDCC 1543",{"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, le 13e mois, les congés payés et les heures supplémentaires de la convention collective de la boyauderie (IDCC 1543).","All","FinanceApplication",true,[110,113,116,119,122,125,128,131,134,137],{"a":111,"q":112},"La CCN boyauderie (IDCC 1543) prévoit une formule propre : 1\u002F10 de mois de salaire par année d'ancienneté pour les 10 premières années, puis 4\u002F15 de mois par année au-delà. Toutefois, cette formule est moins favorable que celle du code du travail (1\u002F4 puis 1\u002F3 de mois). En pratique, c'est toujours le montant légal qui s'applique comme plancher.","Comment calculer l'indemnité de licenciement dans la convention collective de la boyauderie ?",{"a":114,"q":115},"Pour les ouvriers et employés : 1 mois si moins de 2 ans d'ancienneté, 2 mois au-delà. Les agents de maîtrise bénéficient de 2 mois dès le premier jour. Les cadres ont un préavis de 3 mois. La démission suit les mêmes durées.","Quelle est la durée du préavis dans la CCN boyauderie ?",{"a":117,"q":118},"Depuis la fusion avec l'IDCC 1586 (charcuterie-salaison) en 2019, la grille s'étend du coefficient 125 (environ 1 802 €\u002Fmois) au coefficient 700 (environ 5 611 €\u002Fmois). Elle comporte 10 niveaux avec des échelons correspondant aux différents degrés de qualification, de l'ouvrier de base au cadre supérieur.","Quelle est la grille de salaires de la convention collective boyauderie ?",{"a":120,"q":121},"Oui. La convention collective rend le 13e mois obligatoire, versé en deux fois : 50 % en juin et 50 % en novembre. Son montant est proratisé en fonction du nombre de mois de présence effective dans l'année.","Le 13e mois est-il obligatoire dans la CCN boyauderie ?",{"a":123,"q":124},"Oui. La prime d'ancienneté est progressive : +2 % du salaire mensuel après 2 ans d'ancienneté, puis +1 % supplémentaire par année jusqu'à un plafond de +12 % à 12 ans de service.","Existe-t-il une prime d'ancienneté dans la CCN boyauderie ?",{"a":126,"q":127},"Oui. En plus des 30 jours ouvrables légaux, la convention prévoit des jours supplémentaires selon l'ancienneté : +1 jour à partir de 15 ans, +2 jours à partir de 20 ans et +3 jours à partir de 25 ans d'ancienneté.","La CCN boyauderie accorde-t-elle des jours de congés supplémentaires ?",{"a":129,"q":130},"Les taux de majoration sont identiques au code du travail : +25 % pour les 8 premières heures supplémentaires (36e au 43e heure) et +50 % au-delà. La CCN y ajoute une prime spécifique pour le travail du dimanche (+50 %, cumulable avec les majorations heures sup.), et autorise le remplacement du paiement par un repos compensateur équivalent.","Quelles sont les majorations pour heures supplémentaires dans la CCN boyauderie ?",{"a":132,"q":133},"Par arrêté ministériel du 23 janvier 2019, la convention collective de la boyauderie (IDCC 1543) a été fusionnée avec la convention collective des industries charcutières, de la salaison et des conserves de viandes (IDCC 1586), désignée comme branche de rattachement. Une période de transition de 5 ans permettait le maintien des avantages acquis ; depuis 2024, les dispositions de l'IDCC 1586 s'appliquent pleinement.","Qu'est-ce que la fusion de la CCN boyauderie avec l'IDCC 1586 ?",{"a":135,"q":136},"La CCN boyauderie prévoit un seuil de 2 ans d'ancienneté pour son calcul conventionnel. Cependant, le code du travail (art. L1237-19) ouvre droit à l'indemnité dès 8 mois d'ancienneté, et ce plancher légal s'impose toujours.","Quelle est l'ancienneté minimale pour bénéficier de l'indemnité de licenciement dans la CCN boyauderie ?",{"a":138,"q":139},"La CCN boyauderie (IDCC 1543) existe toujours formellement, mais ses dispositions sont largement absorbées depuis 2024 par la convention collective des industries charcutières (IDCC 1586) suite à la fusion de 2019. Les salariés embauchés ou transférés relèvent désormais essentiellement de l'IDCC 1586, tout en conservant les avantages individuels acquis sous l'IDCC 1543.","La CCN boyauderie est-elle encore en vigueur en 2026 ?","\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 Boyauderie — IDCC 1543\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: #dbeafe;\n      --accent-dark: #1d4ed8;\n      --text: #1c1917;\n      --text-muted: #78716c;\n      --callout-bg: #eff6ff;\n      --callout-border: #bfdbfe;\n      --result-bg: #f0fdf4;\n      --result-border: #bbf7d0;\n      --result-text: #14532d;\n      --warn-bg: #fef3c7;\n      --warn-border: #fde68a;\n      --warn-text: #78350f;\n      --radius: 0.75rem;\n      --radius-sm: 0.5rem;\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 1.5rem;\n    }\n\n    .tool-header {\n      margin-bottom: 1.25rem;\n    }\n\n    .tool-header h1 {\n      font-size: 1.15rem;\n      font-weight: 700;\n      color: var(--text);\n      line-height: 1.3;\n    }\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-dark);\n      font-size: 0.75rem;\n      font-weight: 600;\n      padding: 0.2rem 0.6rem;\n      border-radius: 999px;\n      margin-top: 0.35rem;\n    }\n\n    \u002F* Tabs *\u002F\n    .tab-list {\n      display: flex;\n      gap: 0;\n      border-bottom: 2px solid var(--border);\n      margin-bottom: 1.25rem;\n      overflow-x: auto;\n      scrollbar-width: none;\n    }\n    .tab-list::-webkit-scrollbar { display: none; }\n\n    .tab-btn {\n      display: flex;\n      align-items: center;\n      gap: 0.35rem;\n      padding: 0.6rem 0.9rem;\n      font-size: 0.8125rem;\n      font-weight: 600;\n      color: var(--text-muted);\n      background: transparent;\n      border: none;\n      border-bottom: 2px solid transparent;\n      margin-bottom: -2px;\n      cursor: pointer;\n      white-space: nowrap;\n      transition: color 0.15s, border-color 0.15s;\n    }\n    .tab-btn:hover { color: var(--accent); }\n    .tab-btn.active {\n      color: var(--accent);\n      border-bottom-color: var(--accent);\n    }\n    .tab-btn svg { width: 14px; height: 14px; flex-shrink: 0; }\n\n    \u002F* Panels *\u002F\n    .tab-panel { display: none; }\n    .tab-panel.active { display: block; }\n\n    \u002F* Rule callout *\u002F\n    .rule-callout {\n      display: flex;\n      gap: 0.65rem;\n      background: var(--callout-bg);\n      border: 1px solid var(--callout-border);\n      border-radius: var(--radius-sm);\n      padding: 0.8rem 1rem;\n      margin-bottom: 1.1rem;\n      font-size: 0.85rem;\n    }\n    .rule-callout svg { width: 16px; height: 16px; color: var(--accent); flex-shrink: 0; margin-top: 0.15rem; }\n    .rule-callout p { color: #1e40af; line-height: 1.5; }\n    .rule-callout strong { font-weight: 700; }\n\n    .warn-callout {\n      display: flex;\n      gap: 0.65rem;\n      background: var(--warn-bg);\n      border: 1px solid var(--warn-border);\n      border-radius: var(--radius-sm);\n      padding: 0.8rem 1rem;\n      margin-bottom: 1.1rem;\n      font-size: 0.85rem;\n    }\n    .warn-callout svg { width: 16px; height: 16px; color: #92400e; flex-shrink: 0; margin-top: 0.15rem; }\n    .warn-callout p { color: var(--warn-text); line-height: 1.5; }\n\n    \u002F* Form elements *\u002F\n    .field {\n      margin-bottom: 1rem;\n    }\n    .field label {\n      display: flex;\n      justify-content: space-between;\n      align-items: baseline;\n      font-size: 0.8125rem;\n      font-weight: 600;\n      color: var(--text);\n      margin-bottom: 0.4rem;\n    }\n    .field label span {\n      font-weight: 700;\n      color: var(--accent);\n      font-variant-numeric: tabular-nums;\n    }\n\n    input[type=\"range\"] {\n      width: 100%;\n      height: 5px;\n      accent-color: var(--accent);\n      cursor: pointer;\n    }\n\n    .pills {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 0.4rem;\n    }\n    .pill {\n      padding: 0.35rem 0.75rem;\n      border: 1.5px solid var(--border);\n      border-radius: 999px;\n      font-size: 0.78125rem;\n      font-weight: 600;\n      cursor: pointer;\n      background: var(--surface);\n      color: var(--text-muted);\n      transition: all 0.12s;\n    }\n    .pill.active {\n      background: var(--accent);\n      border-color: var(--accent);\n      color: #fff;\n    }\n\n    select {\n      width: 100%;\n      padding: 0.5rem 0.75rem;\n      border: 1.5px 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    }\n\n    input[type=\"number\"] {\n      width: 100%;\n      padding: 0.5rem 0.75rem;\n      border: 1.5px solid var(--border);\n      border-radius: var(--radius-sm);\n      font-size: 0.875rem;\n      font-variant-numeric: tabular-nums;\n      background: var(--surface);\n      color: var(--text);\n    }\n\n    \u002F* Result card *\u002F\n    .result-card {\n      background: var(--result-bg);\n      border: 1.5px solid var(--result-border);\n      border-radius: var(--radius);\n      padding: 1rem 1.25rem;\n      margin-top: 1.25rem;\n    }\n    .result-label {\n      font-size: 0.78125rem;\n      font-weight: 600;\n      color: #166534;\n      text-transform: uppercase;\n      letter-spacing: 0.05em;\n      margin-bottom: 0.35rem;\n    }\n    .result-value {\n      font-size: 1.75rem;\n      font-weight: 800;\n      color: var(--result-text);\n      font-variant-numeric: tabular-nums;\n      line-height: 1.2;\n    }\n    .result-detail {\n      font-size: 0.8rem;\n      color: #166534;\n      margin-top: 0.4rem;\n      line-height: 1.5;\n    }\n\n    .result-duration {\n      font-size: 1.5rem;\n      font-weight: 800;\n      color: var(--result-text);\n      font-variant-numeric: tabular-nums;\n    }\n\n    \u002F* Grid table *\u002F\n    .grid-table {\n      width: 100%;\n      border-collapse: collapse;\n      font-size: 0.8125rem;\n      margin-top: 0.75rem;\n    }\n    .grid-table th {\n      background: var(--accent-light);\n      color: var(--accent-dark);\n      font-weight: 700;\n      padding: 0.45rem 0.6rem;\n      text-align: left;\n      border-bottom: 2px solid var(--callout-border);\n    }\n    .grid-table td {\n      padding: 0.4rem 0.6rem;\n      border-bottom: 1px solid var(--border);\n      font-variant-numeric: tabular-nums;\n    }\n    .grid-table tr:last-child td { border-bottom: none; }\n    .grid-table tr.highlighted td {\n      background: var(--accent-light);\n      font-weight: 700;\n      color: var(--accent-dark);\n    }\n\n    \u002F* Two-col layout *\u002F\n    .two-col {\n      display: grid;\n      grid-template-columns: 1fr 1fr;\n      gap: 0.75rem;\n      margin-bottom: 1rem;\n    }\n    @media (max-width: 480px) {\n      .two-col { grid-template-columns: 1fr; }\n    }\n\n    \u002F* Disclaimer *\u002F\n    .disclaimer {\n      font-size: 0.75rem;\n      color: var(--text-muted);\n      border-top: 1px solid var(--border);\n      margin-top: 1.5rem;\n      padding-top: 1rem;\n      line-height: 1.55;\n    }\n    .disclaimer a { color: var(--accent); text-decoration: none; }\n    .disclaimer a:hover { text-decoration: underline; }\n\n    .section-title {\n      font-size: 0.8125rem;\n      font-weight: 700;\n      color: var(--text-muted);\n      text-transform: uppercase;\n      letter-spacing: 0.05em;\n      margin-bottom: 0.65rem;\n    }\n\n    .hidden { display: none !important; }\n  \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody>\n\u003C!-- CCN IDCC 1543 — deviations vs code du travail\n     indemnite:   L1234-9 → 1\u002F10 mois × ans (≤10) + 4\u002F15 mois × ans (>10), seuil 2 ans\n                  source: Legifrance KALITEXT000005649964 + fusion IDCC 1586\n     preavis:     L1234-1 → non-cadres 1 mois (\u003C2 ans) \u002F 2 mois (≥2 ans), AM 2 mois, cadres 3 mois\n     salaire-min: grille par coefficient 125→700 (source: avenant salarial IDCC 1586 2024)\n     prime:       13ème mois obligatoire (juin+novembre) + ancienneté 2% à 12% (source: CCN 1586 art. salaires)\n     conges:      30 j + 1 j à 15 ans, +2 j à 20 ans, +3 j à 25 ans (source: CCN 1586)\n     heures-supp: taux identiques L3121-36 (+25%\u002F+50%) mais prime dimanche +50% cumulable\n-->\n\u003Cmain class=\"tool-root\">\n  \u003Cdiv class=\"tool-header\">\n    \u003Ch1>Calculateur — Convention collective de la boyauderie\u003C\u002Fh1>\n    \u003Cdiv class=\"badge\">\n      \u003Ci data-lucide=\"landmark\">\u003C\u002Fi>\n      IDCC 1543\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- TAB LIST -->\n  \u003Cdiv class=\"tab-list\" role=\"tablist\">\n    \u003Cbutton class=\"tab-btn\" data-tab=\"indemnite\" role=\"tab\">\n      \u003Ci data-lucide=\"scale\">\u003C\u002Fi>\n      Indemnité\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"preavis\" role=\"tab\">\n      \u003Ci data-lucide=\"clock\">\u003C\u002Fi>\n      Préavis\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"salaire-min\" role=\"tab\">\n      \u003Ci data-lucide=\"bar-chart-2\">\u003C\u002Fi>\n      Grille salariale\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"prime\" role=\"tab\">\n      \u003Ci data-lucide=\"gift\">\u003C\u002Fi>\n      13e mois &amp; ancienneté\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"conges\" role=\"tab\">\n      \u003Ci data-lucide=\"sun\">\u003C\u002Fi>\n      Congés\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"heures-supp\" role=\"tab\">\n      \u003Ci data-lucide=\"timer\">\u003C\u002Fi>\n      H. supp.\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ═══════════════════════════════════════════════════════════ -->\n  \u003C!-- TAB: INDEMNITÉ DE LICENCIEMENT                            -->\n  \u003C!-- ═══════════════════════════════════════════════════════════ -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"indemnite\">\n    \u003Cdiv class=\"warn-callout\">\n      \u003Ci data-lucide=\"alert-triangle\">\u003C\u002Fi>\n      \u003Cp>\u003Cstrong>Attention :\u003C\u002Fstrong> la CCN boyauderie prévoit une formule \u003Cstrong>moins favorable\u003C\u002Fstrong> que le code du travail. Le code du travail prime si son calcul est plus élevé. En pratique, l'indemnité légale (art. L1234-9) s'applique toujours en plancher.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La convention collective prévoit : \u003Cstrong>1\u002F10 de mois × années ≤ 10 ans\u003C\u002Fstrong>, puis \u003Cstrong>4\u002F15 de mois × années &gt; 10 ans\u003C\u002Fstrong>. Seuil d'ancienneté : 2 ans. Le code du travail (1\u002F4 + 1\u002F3) est plus favorable — il prime toujours.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"field\">\n      \u003Clabel>Salaire brut mensuel de référence \u003Cspan id=\"ind-sal-val\">2 500 €\u003C\u002Fspan>\u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"ind-sal\" min=\"1500\" max=\"8000\" step=\"50\" value=\"2500\">\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"field\">\n      \u003Clabel>Ancienneté \u003Cspan id=\"ind-anc-val\">5 ans\u003C\u002Fspan>\u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"ind-anc\" min=\"2\" max=\"35\" step=\"1\" value=\"5\">\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"field\">\n      \u003Cdiv class=\"section-title\">Motif du licenciement\u003C\u002Fdiv>\n      \u003Cdiv class=\"pills\">\n        \u003Cbutton class=\"pill active\" data-group=\"ind-motif\" data-val=\"perso\">Personnel \u002F réel et sérieux\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-group=\"ind-motif\" data-val=\"eco\">Économique\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-group=\"ind-motif\" data-val=\"inap\">Inaptitude\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv id=\"ind-result\" class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Indemnité estimée\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"ind-amount\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"ind-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ═══════════════════════════════════════════════════════════ -->\n  \u003C!-- TAB: PRÉAVIS                                               -->\n  \u003C!-- ═══════════════════════════════════════════════════════════ -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"preavis\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN boyauderie prévoit des préavis distincts selon le statut et l'ancienneté : \u003Cstrong>1 mois\u003C\u002Fstrong> pour les non-cadres (moins de 2 ans), \u003Cstrong>2 mois\u003C\u002Fstrong> (≥ 2 ans), \u003Cstrong>2 mois\u003C\u002Fstrong> pour les agents de maîtrise, \u003Cstrong>3 mois\u003C\u002Fstrong> pour les cadres.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"field\">\n      \u003Cdiv class=\"section-title\">Statut\u003C\u002Fdiv>\n      \u003Cdiv class=\"pills\">\n        \u003Cbutton class=\"pill active\" data-group=\"pr-statut\" data-val=\"employe\">Ouvrier \u002F Employé\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-group=\"pr-statut\" data-val=\"am\">Agent de maîtrise\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-group=\"pr-statut\" data-val=\"cadre\">Cadre\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"field\">\n      \u003Cdiv class=\"section-title\">Ancienneté\u003C\u002Fdiv>\n      \u003Cdiv class=\"pills\" id=\"pr-anc-pills\">\n        \u003Cbutton class=\"pill active\" data-group=\"pr-anc\" data-val=\"moins2\">Moins de 2 ans\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-group=\"pr-anc\" data-val=\"plus2\">2 ans et plus\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"field\">\n      \u003Cdiv class=\"section-title\">Sens\u003C\u002Fdiv>\n      \u003Cdiv class=\"pills\">\n        \u003Cbutton class=\"pill active\" data-group=\"pr-sens\" data-val=\"licenciement\">Licenciement\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-group=\"pr-sens\" data-val=\"demission\">Démission\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv id=\"pr-result\" class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Durée du préavis\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-duration\" id=\"pr-duration\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"pr-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ═══════════════════════════════════════════════════════════ -->\n  \u003C!-- TAB: GRILLE SALARIALE                                      -->\n  \u003C!-- ═══════════════════════════════════════════════════════════ -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"salaire-min\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN prévoit une \u003Cstrong>grille salariale par coefficient\u003C\u002Fstrong> (125 à 700) nettement supérieure au SMIC pour les niveaux qualifiés. Grille issue de l'avenant salarial 2024 (fusion IDCC 1586).\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"field\">\n      \u003Clabel for=\"sm-coeff\">Niveau \u002F Coefficient\u003C\u002Flabel>\n      \u003Cselect id=\"sm-coeff\">\n        \u003Coption value=\"125\">Niveau I — Coeff. 125 (ouvrier de base)\u003C\u002Foption>\n        \u003Coption value=\"140\">Niveau I — Coeff. 140\u003C\u002Foption>\n        \u003Coption value=\"145\">Niveau II — Coeff. 145\u003C\u002Foption>\n        \u003Coption value=\"165\">Niveau II — Coeff. 165\u003C\u002Foption>\n        \u003Coption value=\"185\">Niveau II — Coeff. 185\u003C\u002Foption>\n        \u003Coption value=\"200\">Niveau III — Coeff. 200\u003C\u002Foption>\n        \u003Coption value=\"220\">Niveau III — Coeff. 220\u003C\u002Foption>\n        \u003Coption value=\"230\">Niveau III — Coeff. 230\u003C\u002Foption>\n        \u003Coption value=\"255\">Niveau IV — Coeff. 255\u003C\u002Foption>\n        \u003Coption value=\"270\">Niveau IV — Coeff. 270\u003C\u002Foption>\n        \u003Coption value=\"305\">Niveau V — Coeff. 305\u003C\u002Foption>\n        \u003Coption value=\"345\">Niveau V — Coeff. 345\u003C\u002Foption>\n        \u003Coption value=\"350\">Niveau VI — Coeff. 350\u003C\u002Foption>\n        \u003Coption value=\"400\">Niveau VII — Coeff. 400\u003C\u002Foption>\n        \u003Coption value=\"600\">Niveau VIII — Coeff. 600\u003C\u002Foption>\n        \u003Coption value=\"700\">Niveau IX — Coeff. 700\u003C\u002Foption>\n      \u003C\u002Fselect>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"field\">\n      \u003Clabel>Heures hebdomadaires \u003Cspan id=\"sm-h-val\">35 h\u003C\u002Fspan>\u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"sm-h\" min=\"20\" max=\"48\" step=\"0.5\" value=\"35\">\n    \u003C\u002Fdiv>\n\n    \u003Cdiv id=\"sm-result\" class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Salaire minimum mensuel brut\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"sm-amount\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"sm-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv style=\"margin-top:1.25rem\">\n      \u003Cdiv class=\"section-title\">Grille indicative (base 151,67 h\u002Fmois)\u003C\u002Fdiv>\n      \u003Ctable class=\"grid-table\" id=\"sm-table\">\n        \u003Cthead>\n          \u003Ctr>\n            \u003Cth>Coefficient\u003C\u002Fth>\n            \u003Cth>Catégorie\u003C\u002Fth>\n            \u003Cth>Salaire brut\u002Fmois\u003C\u002Fth>\n          \u003C\u002Ftr>\n        \u003C\u002Fthead>\n        \u003Ctbody>\n          \u003Ctr>\u003Ctd>125\u003C\u002Ftd>\u003Ctd>Ouvrier de base\u003C\u002Ftd>\u003Ctd>1 801,80 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>140\u003C\u002Ftd>\u003Ctd>Ouvrier qualifié N1\u003C\u002Ftd>\u003Ctd>1 820 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>165\u003C\u002Ftd>\u003Ctd>Ouvrier qualifié N2\u003C\u002Ftd>\u003Ctd>1 880 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>200\u003C\u002Ftd>\u003Ctd>Ouvrier spécialisé \u002F Technicien N1\u003C\u002Ftd>\u003Ctd>2 020 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>255\u003C\u002Ftd>\u003Ctd>Technicien qualifié\u003C\u002Ftd>\u003Ctd>2 364 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>305\u003C\u002Ftd>\u003Ctd>Agent de maîtrise N1\u003C\u002Ftd>\u003Ctd>2 720 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>350\u003C\u002Ftd>\u003Ctd>Agent de maîtrise N2\u003C\u002Ftd>\u003Ctd>3 212 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>400\u003C\u002Ftd>\u003Ctd>Cadre N1\u003C\u002Ftd>\u003Ctd>3 465 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>600\u003C\u002Ftd>\u003Ctd>Cadre confirmé\u003C\u002Ftd>\u003Ctd>4 862 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>700\u003C\u002Ftd>\u003Ctd>Cadre supérieur\u003C\u002Ftd>\u003Ctd>5 611 €\u003C\u002Ftd>\u003C\u002Ftr>\n        \u003C\u002Ftbody>\n      \u003C\u002Ftable>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ═══════════════════════════════════════════════════════════ -->\n  \u003C!-- TAB: 13E MOIS & PRIME D'ANCIENNETÉ                        -->\n  \u003C!-- ═══════════════════════════════════════════════════════════ -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"prime\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN rend le \u003Cstrong>13e mois obligatoire\u003C\u002Fstrong> (50 % en juin, 50 % en novembre) et prévoit une \u003Cstrong>prime d'ancienneté progressive\u003C\u002Fstrong> : +2 % dès 2 ans, puis +1 % par an supplémentaire jusqu'à +12 % à 12 ans de service.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"field\">\n      \u003Clabel>Salaire brut mensuel \u003Cspan id=\"pr2-sal-val\">2 500 €\u003C\u002Fspan>\u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"pr2-sal\" min=\"1500\" max=\"8000\" step=\"50\" value=\"2500\">\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"field\">\n      \u003Clabel>Ancienneté \u003Cspan id=\"pr2-anc-val\">5 ans\u003C\u002Fspan>\u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"pr2-anc\" min=\"0\" max=\"25\" step=\"1\" value=\"5\">\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"field\">\n      \u003Clabel>Mois de présence effective dans l'année \u003Cspan id=\"pr2-mois-val\">12 mois\u003C\u002Fspan>\u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"pr2-mois\" min=\"1\" max=\"12\" step=\"1\" value=\"12\">\n    \u003C\u002Fdiv>\n\n    \u003Cdiv id=\"prime-result\" class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Primes estimées (annuelles)\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"pr2-amount\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"pr2-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ═══════════════════════════════════════════════════════════ -->\n  \u003C!-- TAB: CONGÉS PAYÉS                                          -->\n  \u003C!-- ═══════════════════════════════════════════════════════════ -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"conges\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN accorde des \u003Cstrong>jours de congés supplémentaires selon l'ancienneté\u003C\u002Fstrong> : +1 jour à 15 ans, +2 jours à 20 ans, +3 jours à 25 ans, au-delà des 30 jours ouvrables légaux.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"field\">\n      \u003Clabel>Ancienneté \u003Cspan id=\"cg-anc-val\">10 ans\u003C\u002Fspan>\u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"cg-anc\" min=\"0\" max=\"35\" step=\"1\" value=\"10\">\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"field\">\n      \u003Cdiv class=\"section-title\">Temps de travail\u003C\u002Fdiv>\n      \u003Cdiv class=\"pills\">\n        \u003Cbutton class=\"pill active\" data-group=\"cg-temps\" data-val=\"plein\">Temps plein\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-group=\"cg-temps\" data-val=\"partiel\">Temps partiel\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv id=\"cg-h-field\" class=\"field hidden\">\n      \u003Clabel>Taux d'occupation \u003Cspan id=\"cg-h-val\">80 %\u003C\u002Fspan>\u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"cg-h\" min=\"20\" max=\"99\" step=\"1\" value=\"80\">\n    \u003C\u002Fdiv>\n\n    \u003Cdiv id=\"cg-result\" class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Congés payés annuels\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"cg-jours\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"cg-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ═══════════════════════════════════════════════════════════ -->\n  \u003C!-- TAB: HEURES SUPPLÉMENTAIRES                                -->\n  \u003C!-- ═══════════════════════════════════════════════════════════ -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"heures-supp\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>Les taux de majoration sont identiques au code du travail (+25 % \u002F +50 %), mais la CCN ajoute une \u003Cstrong>prime dimanche de +50 %\u003C\u002Fstrong> cumulable avec les majorations heures sup., et autorise le remplacement par du repos compensateur.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"field\">\n      \u003Clabel>Salaire horaire brut \u003Cspan id=\"hs-taux-val\">16,50 €\u003C\u002Fspan>\u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"hs-taux\" min=\"11.88\" max=\"60\" step=\"0.5\" value=\"16.50\">\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"field\">\n      \u003Clabel>Heures supp. tranche 1 (36e–43e h) \u003Cspan id=\"hs-t1-val\">4 h\u003C\u002Fspan>\u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"hs-t1\" min=\"0\" max=\"8\" step=\"0.5\" value=\"4\">\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"field\">\n      \u003Clabel>Heures supp. tranche 2 (&gt; 43e h) \u003Cspan id=\"hs-t2-val\">0 h\u003C\u002Fspan>\u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"hs-t2\" min=\"0\" max=\"20\" step=\"0.5\" value=\"0\">\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"field\">\n      \u003Cdiv class=\"section-title\">Travail du dimanche ?\u003C\u002Fdiv>\n      \u003Cdiv class=\"pills\">\n        \u003Cbutton class=\"pill\" data-group=\"hs-dim\" data-val=\"oui\">Oui — +50 %\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill active\" data-group=\"hs-dim\" data-val=\"non\">Non\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv id=\"hs-result\" class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Majoration totale brute estimée\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"hs-amount\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"hs-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- SHARED DISCLAIMER -->\n  \u003Cp class=\"disclaimer\">\n    Calcul indicatif basé sur la CCN IDCC 1543 (boyauderie) et la convention de branche IDCC 1586 (fusion 2019).\n    Source : \u003Ca href=\"https:\u002F\u002Fwww.legifrance.gouv.fr\u002Fconv_coll\u002Fid\u002FKALITEXT000005649964\u002F\" target=\"_blank\" rel=\"noopener\">Légifrance — IDCC 1543\u003C\u002Fa> et\n    \u003Ca href=\"https:\u002F\u002Fwww.legifrance.gouv.fr\u002Fconv_coll\u002Fid\u002FKALICONT000005635631\u002F\" target=\"_blank\" rel=\"noopener\">IDCC 1586\u003C\u002Fa>.\n    Pour validation légale\n  \u003C\u002Fp>\n\u003C\u002Fmain>\n\n\u003Cscript>\n\u002F\u002F ═══════════════════════════════════════════════════════════════\n\u002F\u002F STATE\n\u002F\u002F ═══════════════════════════════════════════════════════════════\nconst state = {\n  \u002F\u002F indemnite\n  ind: { sal: 2500, anc: 5, motif: 'perso' },\n  \u002F\u002F preavis\n  pr: { statut: 'employe', anc: 'moins2', sens: 'licenciement' },\n  \u002F\u002F salaire min\n  sm: { coeff: 125, h: 35 },\n  \u002F\u002F prime\n  pr2: { sal: 2500, anc: 5, mois: 12 },\n  \u002F\u002F conges\n  cg: { anc: 10, temps: 'plein', h: 80 },\n  \u002F\u002F heures supp\n  hs: { taux: 16.5, t1: 4, t2: 0, dim: 'non' }\n};\n\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 });\n\n\u002F\u002F ═══════════════════════════════════════════════════════════════\n\u002F\u002F SALARY GRID (coeff → monthly base at 151.67h)\n\u002F\u002F ═══════════════════════════════════════════════════════════════\nconst GRID = {\n  125: 1801.80, 140: 1820, 145: 1743, 165: 1880, 185: 1940,\n  200: 2020, 220: 2190, 230: 2280, 255: 2364, 270: 2450,\n  305: 2720, 345: 3022, 350: 3212, 400: 3465, 600: 4862, 700: 5611\n};\n\n\u002F\u002F ═══════════════════════════════════════════════════════════════\n\u002F\u002F COMPUTE FUNCTIONS\n\u002F\u002F ═══════════════════════════════════════════════════════════════\nfunction computeIndemnite(s) {\n  const { sal, anc, motif } = s.ind;\n  if (anc \u003C 2) return { amount: 0, detail: \"Ancienneté insuffisante (seuil : 2 ans pour la CCN).\" };\n\n  \u002F\u002F CCN formula\n  const ccn = anc \u003C= 10\n    ? (1\u002F10) * sal * anc\n    : (1\u002F10) * sal * 10 + (4\u002F15) * sal * (anc - 10);\n\n  \u002F\u002F Legal formula (L1234-9) — always applies as floor\n  const legal = anc \u003C= 10\n    ? (1\u002F4) * sal * anc\n    : (1\u002F4) * sal * 10 + (1\u002F3) * sal * (anc - 10);\n\n  const amount = Math.max(ccn, legal);\n  const formulaUsed = amount === legal ? 'légale (plus favorable)' : 'conventionnelle';\n\n  \u002F\u002F Specific multipliers\n  let mult = 1;\n  if (motif === 'eco') mult = 1; \u002F\u002F same formula\n  if (motif === 'inap') mult = 2; \u002F\u002F inaptitude non-professionnelle : x2\n\n  const finalAmount = amount * mult;\n\n  let detail = `Formule ${formulaUsed}. `;\n  if (motif === 'inap') detail += 'Inaptitude : indemnité doublée. ';\n  detail += `CCN : ${fmtDec.format(ccn)} — Légale : ${fmtDec.format(legal)}`;\n\n  return { amount: finalAmount, detail };\n}\n\nfunction computePreavis(s) {\n  const { statut, anc, sens } = s.pr;\n  let mois = 0;\n\n  if (statut === 'employe') {\n    mois = (anc === 'moins2') ? 1 : 2;\n  } else if (statut === 'am') {\n    mois = 2;\n  } else if (statut === 'cadre') {\n    mois = 3;\n  }\n\n  const label = mois === 1 ? '1 mois' : `${mois} mois`;\n  let detail = '';\n  if (statut === 'employe' && anc === 'moins2') {\n    detail = 'Ouvrier\u002FEmployé avec moins de 2 ans — même règle que le code du travail.';\n  } else if (statut === 'employe') {\n    detail = 'Ouvrier\u002FEmployé avec ≥ 2 ans — plus favorable que le code du travail (souvent 1 mois légal).';\n  } else if (statut === 'am') {\n    detail = 'Agent de maîtrise — 2 mois dès le premier jour.';\n  } else {\n    detail = 'Cadre — 3 mois, conforme aux standards conventionnels.';\n  }\n  if (sens === 'demission') detail += ' Même durée en cas de démission.';\n\n  return { label, detail };\n}\n\nfunction computeSalMin(s) {\n  const { coeff, h } = s.sm;\n  const base151 = GRID[coeff] || GRID[125];\n  const prorata = base151 * (h \u002F 35);\n  const detail = `Base 151,67 h\u002Fmois : ${fmtDec.format(base151)} — Proratisé ${h} h\u002Fsem : ${fmtDec.format(prorata)}`;\n  return { amount: prorata, base: base151, detail };\n}\n\nfunction computePrime(s) {\n  const { sal, anc, mois } = s.pr2;\n\n  \u002F\u002F 13e mois\n  const treizieme = sal * (mois \u002F 12);\n\n  \u002F\u002F Prime d'ancienneté\n  let tauxAnc = 0;\n  if (anc >= 2 && anc \u003C 3) tauxAnc = 0.02;\n  else if (anc >= 3 && anc \u003C 4) tauxAnc = 0.03;\n  else if (anc >= 4 && anc \u003C 5) tauxAnc = 0.04;\n  else if (anc >= 5 && anc \u003C 6) tauxAnc = 0.05;\n  else if (anc >= 6 && anc \u003C 7) tauxAnc = 0.06;\n  else if (anc >= 7 && anc \u003C 8) tauxAnc = 0.07;\n  else if (anc >= 8 && anc \u003C 9) tauxAnc = 0.08;\n  else if (anc >= 9 && anc \u003C 10) tauxAnc = 0.09;\n  else if (anc >= 10 && anc \u003C 11) tauxAnc = 0.10;\n  else if (anc >= 11 && anc \u003C 12) tauxAnc = 0.11;\n  else if (anc >= 12) tauxAnc = 0.12;\n\n  const primeAnc = sal * tauxAnc * 12; \u002F\u002F annuelle\n  const total = treizieme + primeAnc;\n\n  let detail = `13e mois (${mois}\u002F12 mois) : ${fmtDec.format(treizieme)}`;\n  if (tauxAnc > 0) {\n    detail += ` | Prime ancienneté ${(tauxAnc*100).toFixed(0)} %\u002Fan : ${fmtDec.format(primeAnc)}`;\n  } else {\n    detail += ` | Prime ancienneté : 0 (seuil : 2 ans)`;\n  }\n\n  return { amount: total, detail };\n}\n\nfunction computeConges(s) {\n  const { anc, temps, h } = s.cg;\n\n  const baseJours = 30;\n  let extra = 0;\n  if (anc >= 15 && anc \u003C 20) extra = 1;\n  else if (anc >= 20 && anc \u003C 25) extra = 2;\n  else if (anc >= 25) extra = 3;\n\n  let total = baseJours + extra;\n  if (temps === 'partiel') total = Math.round(total * (h \u002F 100));\n\n  let detail = `Base légale : 30 j. ouvrables`;\n  if (extra > 0) detail += ` + ${extra} j. CCN (ancienneté ${anc} ans)`;\n  if (temps === 'partiel') detail += ` × ${h} % (temps partiel)`;\n  detail += ` = ${total} jours ouvrables\u002Fan`;\n\n  return { jours: total, extra, detail };\n}\n\nfunction computeHeuresSupp(s) {\n  const { taux, t1, t2, dim } = s.hs;\n\n  const maj1 = t1 * taux * 0.25;   \u002F\u002F +25% sur tranche 1\n  const maj2 = t2 * taux * 0.50;   \u002F\u002F +50% sur tranche 2\n  const dimBonus = dim === 'oui' ? (t1 + t2) * taux * 0.50 : 0;\n  const total = maj1 + maj2 + dimBonus;\n\n  let detail = '';\n  if (t1 > 0) detail += `Tranche 1 (${t1} h × +25 %) : ${fmtDec.format(maj1)}`;\n  if (t2 > 0) detail += (detail ? ' | ' : '') + `Tranche 2 (${t2} h × +50 %) : ${fmtDec.format(maj2)}`;\n  if (dim === 'oui') detail += (detail ? ' | ' : '') + `Prime dimanche (+50 %) : ${fmtDec.format(dimBonus)}`;\n  if (!detail) detail = 'Aucune heure supplémentaire saisie.';\n\n  return { amount: total, detail };\n}\n\n\u002F\u002F ═══════════════════════════════════════════════════════════════\n\u002F\u002F RENDER FUNCTIONS\n\u002F\u002F ═══════════════════════════════════════════════════════════════\nfunction renderIndemnite() {\n  const r = computeIndemnite(state);\n  document.getElementById('ind-amount').textContent = r.amount > 0 ? fmt.format(r.amount) : '—';\n  document.getElementById('ind-detail').textContent = r.detail;\n}\n\nfunction renderPreavis() {\n  const r = computePreavis(state);\n  document.getElementById('pr-duration').textContent = r.label;\n  document.getElementById('pr-detail').textContent = r.detail;\n}\n\nfunction renderSalMin() {\n  const r = computeSalMin(state);\n  document.getElementById('sm-amount').textContent = fmtDec.format(r.amount);\n  document.getElementById('sm-detail').textContent = r.detail;\n\n  \u002F\u002F highlight selected row\n  const coeff = state.sm.coeff;\n  document.querySelectorAll('#sm-table tbody tr').forEach((tr, i) => {\n    const coeffVals = [125, 140, 165, 200, 255, 305, 350, 400, 600, 700];\n    tr.classList.toggle('highlighted', coeffVals[i] == coeff);\n  });\n}\n\nfunction renderPrime() {\n  const r = computePrime(state);\n  document.getElementById('pr2-amount').textContent = fmtDec.format(r.amount);\n  document.getElementById('pr2-detail').textContent = r.detail;\n}\n\nfunction renderConges() {\n  const r = computeConges(state);\n  document.getElementById('cg-jours').textContent = r.jours + ' jours';\n  document.getElementById('cg-detail').textContent = r.detail;\n}\n\nfunction renderHeuresSupp() {\n  const r = computeHeuresSupp(state);\n  document.getElementById('hs-amount').textContent = r.amount > 0 ? fmtDec.format(r.amount) : '0,00 €';\n  document.getElementById('hs-detail').textContent = r.detail;\n}\n\nfunction renderAll() {\n  renderIndemnite();\n  renderPreavis();\n  renderSalMin();\n  renderPrime();\n  renderConges();\n  renderHeuresSupp();\n}\n\n\u002F\u002F ═══════════════════════════════════════════════════════════════\n\u002F\u002F TABS\n\u002F\u002F ═══════════════════════════════════════════════════════════════\nconst tabs = document.querySelectorAll('[data-tab]');\nconst panels = document.querySelectorAll('[data-panel]');\n\nfunction activate(id) {\n  tabs.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}\n\ntabs.forEach(t => t.addEventListener('click', () => activate(t.dataset.tab)));\n\nconst hashTab = location.hash.slice(1);\nconst firstTab = tabs[0]?.dataset.tab || 'indemnite';\nactivate(document.querySelector(`[data-tab=\"${hashTab}\"]`) ? hashTab : firstTab);\n\n\u002F\u002F ═══════════════════════════════════════════════════════════════\n\u002F\u002F PILLS\n\u002F\u002F ═══════════════════════════════════════════════════════════════\ndocument.querySelectorAll('.pill').forEach(btn => {\n  btn.addEventListener('click', () => {\n    const group = btn.dataset.group;\n    document.querySelectorAll(`[data-group=\"${group}\"]`).forEach(p => p.classList.remove('active'));\n    btn.classList.add('active');\n\n    if (group === 'ind-motif') state.ind.motif = btn.dataset.val;\n    if (group === 'pr-statut') {\n      state.pr.statut = btn.dataset.val;\n      \u002F\u002F hide ancienneté for non-employe\n      document.getElementById('pr-anc-pills').parentElement.style.display =\n        btn.dataset.val === 'employe' ? '' : 'none';\n      renderPreavis();\n    }\n    if (group === 'pr-anc') { state.pr.anc = btn.dataset.val; renderPreavis(); return; }\n    if (group === 'pr-sens') { state.pr.sens = btn.dataset.val; renderPreavis(); return; }\n    if (group === 'cg-temps') {\n      state.cg.temps = btn.dataset.val;\n      document.getElementById('cg-h-field').classList.toggle('hidden', btn.dataset.val !== 'partiel');\n    }\n    if (group === 'hs-dim') state.hs.dim = btn.dataset.val;\n\n    renderAll();\n    triggerResize();\n  });\n});\n\n\u002F\u002F ═══════════════════════════════════════════════════════════════\n\u002F\u002F SLIDERS\n\u002F\u002F ═══════════════════════════════════════════════════════════════\nfunction linkSlider(id, label, displayFn, stateKey, subKey) {\n  const el = document.getElementById(id);\n  const lbl = document.getElementById(label);\n  el.addEventListener('input', () => {\n    const v = parseFloat(el.value);\n    state[stateKey][subKey] = v;\n    lbl.textContent = displayFn(v);\n    renderAll();\n    triggerResize();\n  });\n  lbl.textContent = displayFn(parseFloat(el.value));\n}\n\nlinkSlider('ind-sal', 'ind-sal-val', v => fmt.format(v), 'ind', 'sal');\nlinkSlider('ind-anc', 'ind-anc-val', v => v + ' an' + (v > 1 ? 's' : ''), 'ind', 'anc');\nlinkSlider('pr2-sal', 'pr2-sal-val', v => fmt.format(v), 'pr2', 'sal');\nlinkSlider('pr2-anc', 'pr2-anc-val', v => v + ' an' + (v > 1 ? 's' : ''), 'pr2', 'anc');\nlinkSlider('pr2-mois', 'pr2-mois-val', v => v + ' mois', 'pr2', 'mois');\nlinkSlider('cg-anc', 'cg-anc-val', v => v + ' an' + (v > 1 ? 's' : ''), 'cg', 'anc');\nlinkSlider('cg-h', 'cg-h-val', v => v + ' %', 'cg', 'h');\nlinkSlider('hs-taux', 'hs-taux-val', v => fmtDec.format(v), 'hs', 'taux');\nlinkSlider('hs-t1', 'hs-t1-val', v => v + ' h', 'hs', 't1');\nlinkSlider('hs-t2', 'hs-t2-val', v => v + ' h', 'hs', 't2');\n\n\u002F\u002F ═══════════════════════════════════════════════════════════════\n\u002F\u002F SALARY MIN SELECT\n\u002F\u002F ═══════════════════════════════════════════════════════════════\ndocument.getElementById('sm-coeff').addEventListener('change', e => {\n  state.sm.coeff = parseInt(e.target.value);\n  renderSalMin();\n  triggerResize();\n});\n\ndocument.getElementById('sm-h').addEventListener('input', e => {\n  state.sm.h = parseFloat(e.target.value);\n  document.getElementById('sm-h-val').textContent = state.sm.h + ' h';\n  renderSalMin();\n  triggerResize();\n});\n\n\u002F\u002F ═══════════════════════════════════════════════════════════════\n\u002F\u002F RESIZE + LUCIDE\n\u002F\u002F ═══════════════════════════════════════════════════════════════\nfunction triggerResize() {\n  requestAnimationFrame(() => {\n    const h = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);\n    parent.postMessage({ type: 'resize', height: h }, '*');\n  });\n}\n\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\ndocument.addEventListener('DOMContentLoaded', () => {\n  lucide.createIcons();\n  renderAll();\n  triggerResize();\n});\n\n\u002F\u002F Also init right away in case DOM is already ready\nif (document.readyState !== 'loading') {\n  lucide.createIcons();\n  renderAll();\n  triggerResize();\n}\n\u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","generated","juridique","consumer","both","https:\u002F\u002Fpub-bdebbd2dad294475a2da0eb657815b6b.r2.dev\u002Ftools\u002Fccn-boyauderie-a92e978adf.webp",[]]