[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"footer-root-categories-fr-FR":3,"tool-content-ccn-btp-ouvriers-petites-fr":83,"footer-cities-fr":147},[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":110,"tool_html":141,"source":142,"category":143,"audience":144,"publish_mode":145,"hero_image":146,"hero_image_alt":85},"ccn-btp-ouvriers-petites","CCN Bâtiment ouvriers petites entreprises — calculateur complet","Calculateur CCN Bâtiment Ouvriers ≤10 salariés IDCC 1596 | Expert Zoom","Outil interactif : indemnité de licenciement, préavis, congés d'ancienneté, période d'essai et indemnités de déplacement de la CCN bâtiment ouvriers petites entreprises (IDCC 1596).","Ce calculateur couvre les 5 principales dérogations de la CCN IDCC 1596 par rapport au code du travail : indemnité de licenciement (formule 1\u002F5 avec principe de faveur légal), préavis réduits (24h à 1 mois), congés d'ancienneté (+1 à +4 jours), période d'essai de 3 semaines non renouvelable, et indemnités de petits déplacements BTP (panier repas + trajet par zones km).",[90],{"name":91,"@type":92,"about":93,"author":98,"@context":101,"isPartOf":102,"inLanguage":105,"description":106,"operatingSystem":107,"applicationCategory":108,"isAccessibleForFree":109},"Calculateur CCN Bâtiment Ouvriers petites entreprises — IDCC 1596","WebApplication",{"name":94,"@type":95,"sameAs":96,"identifier":97},"Convention collective des ouvriers employés par les entreprises du bâtiment visées par le décret du 1er mars 1962 (entreprises occupant jusqu'à 10 salariés)","Thing","https:\u002F\u002Fwww.legifrance.gouv.fr\u002Fconv_coll\u002Fid\u002FKALICONT000005635221","IDCC 1596",{"name":99,"@type":100},"Expert-Zoom","Organization","https:\u002F\u002Fschema.org",{"url":103,"@type":104},"\u002Ffr\u002Fmagazine\u002Fjuridique\u002Fles-conventions-collectives-en-france","Article","fr","Outil interactif couvrant l'indemnité de licenciement, le préavis, les congés d'ancienneté, la période d'essai et les indemnités de déplacement de la convention collective des ouvriers du bâtiment (entreprises ≤ 10 salariés, IDCC 1596).","All","FinanceApplication",true,[111,114,117,120,123,126,129,132,135,138],{"a":112,"q":113},"La CCN IDCC 1596 prévoit 1\u002F5 de mois de salaire par année d'ancienneté pour les 10 premières années, et 2\u002F15 de mois par année au-delà. Cette formule étant moins favorable que le minimum légal (1\u002F4 puis 1\u002F3 de mois selon L1234-9), c'est en pratique la formule légale qui s'applique. Une majoration de 10 % est prévue pour les salariés de 55 ans ou plus.","Comment calculer l'indemnité de licenciement dans la CCN bâtiment petites entreprises (IDCC 1596) ?",{"a":115,"q":116},"La CCN IDCC 1596 prévoit des préavis très courts : 24 heures si moins de 6 mois d'ancienneté, 1 semaine entre 6 mois et 2 ans, et 1 mois au-delà de 2 ans. Ces durées sont bien plus courtes que celles prévues par le code du travail.","Quelle est la durée du préavis de licenciement pour un ouvrier du bâtiment (IDCC 1596) ?",{"a":118,"q":119},"En cas de démission, la CCN IDCC 1596 prévoit 2 jours de préavis pour moins de 3 mois d'ancienneté et 2 semaines au-delà. Il n'y a pas de préavis en cas de faute grave.","Quelle est la durée du préavis de démission pour un ouvrier du bâtiment ?",{"a":121,"q":122},"La CCN IDCC 1596 prévoit des jours de congé d'ancienneté supplémentaires : +1 jour à 10 ans d'ancienneté, +2 jours à 15 ans, +3 jours à 20 ans, +4 jours à 25 ans. Des bonus de fractionnement s'ajoutent si les congés sont pris hors de la période principale (1er mai au 31 octobre).","Quels sont les congés payés supplémentaires prévus par la CCN 1596 bâtiment ?",{"a":124,"q":125},"La CCN IDCC 1596 fixe la période d'essai à 3 semaines maximum pour les ouvriers. Elle n'est pas renouvelable, contrairement à la possibilité prévue par le code du travail (2 mois renouvelable une fois). Elle peut être rompue sans préavis pendant son déroulement.","Quelle est la durée de la période d'essai dans la convention collective bâtiment IDCC 1596 ?",{"a":127,"q":128},"L'indemnité de panier est une compensation versée aux ouvriers du bâtiment qui ne peuvent pas déjeuner à leur domicile. Son montant est d'environ 10,80 €\u002Fjour (selon les accords régionaux 2026). Elle n'est pas due si l'ouvrier mange chez lui ou si l'employeur fournit une cantine ou un repas gratuit.","Qu'est-ce que l'indemnité de panier dans le bâtiment IDCC 1596 ?",{"a":130,"q":131},"L'indemnité de trajet compense les frais de déplacement entre le domicile de l'ouvrier et le chantier. Son montant dépend de la distance (par tranches kilométriques) et est négocié au niveau régional ou départemental. À titre indicatif en Île-de-France 2026 : de 1,03 €\u002Fjour (0-5 km) à 7,18 €\u002Fjour (au-delà de 50 km).","Qu'est-ce que l'indemnité de trajet dans la convention collective bâtiment ?",{"a":133,"q":134},"Non, la CCN IDCC 1596 ne prévoit pas de 13ème mois ni de prime d'ancienneté en espèces. En revanche, elle accorde des jours de congés supplémentaires en fonction de l'ancienneté (voir question sur les congés payés).","La CCN IDCC 1596 prévoit-elle un 13ème mois ou une prime d'ancienneté ?",{"a":136,"q":137},"La CCN IDCC 1596 s'applique aux ouvriers employés par les entreprises du bâtiment occupant jusqu'à 10 salariés, visées par le décret du 1er mars 1962. Elle couvre les activités de construction, rénovation et travaux liés au bâtiment dans les petites structures artisanales.","Quelles entreprises sont couvertes par la CCN IDCC 1596 ?",{"a":139,"q":140},"Non. La CCN IDCC 1596 couvre uniquement les ouvriers. Les ETAM et cadres du bâtiment relèvent d'autres conventions collectives (notamment IDCC 2420 pour les cadres du bâtiment).","La CCN bâtiment IDCC 1596 s'applique-t-elle aux ETAM et cadres ?","\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 Bâtiment Ouvriers (≤10 salariés) — IDCC 1596\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      --card: #ffffff;\n      --border: #e7e5e4;\n      --accent: #2563eb;\n      --accent-light: #eff6ff;\n      --accent-dark: #1d4ed8;\n      --text: #1c1917;\n      --text-muted: #78716c;\n      --callout-bg: #eff6ff;\n      --callout-border: #bfdbfe;\n      --warning-bg: #fef3c7;\n      --warning-border: #fcd34d;\n      --warning-text: #92400e;\n      --success-bg: #f0fdf4;\n      --success-border: #bbf7d0;\n      --radius: 0.75rem;\n      --radius-sm: 0.5rem;\n    }\n\n    *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\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: 740px;\n      margin: 0 auto;\n      padding: 1.25rem 1rem 2rem;\n    }\n\n    \u002F* Header *\u002F\n    .tool-header {\n      margin-bottom: 1.25rem;\n    }\n    .tool-header h1 {\n      font-size: 1.125rem;\n      font-weight: 700;\n      color: var(--text);\n      line-height: 1.3;\n    }\n    .tool-header .idcc-badge {\n      display: inline-flex;\n      align-items: center;\n      gap: 0.3rem;\n      background: var(--accent);\n      color: #fff;\n      font-size: 0.75rem;\n      font-weight: 600;\n      padding: 0.2rem 0.6rem;\n      border-radius: 9999px;\n      margin-top: 0.4rem;\n    }\n\n    \u002F* Tabs *\u002F\n    .tabs-bar {\n      display: flex;\n      gap: 0.25rem;\n      border-bottom: 2px solid var(--border);\n      margin-bottom: 1.25rem;\n      overflow-x: auto;\n      scrollbar-width: none;\n      -ms-overflow-style: none;\n    }\n    .tabs-bar::-webkit-scrollbar { display: none; }\n\n    .tab-btn {\n      display: flex;\n      align-items: center;\n      gap: 0.35rem;\n      padding: 0.5rem 0.85rem;\n      font-size: 0.8125rem;\n      font-weight: 600;\n      color: var(--text-muted);\n      background: none;\n      border: none;\n      border-bottom: 2px solid transparent;\n      margin-bottom: -2px;\n      cursor: pointer;\n      white-space: nowrap;\n      border-radius: var(--radius-sm) var(--radius-sm) 0 0;\n      transition: color 0.15s, border-color 0.15s, background 0.15s;\n    }\n    .tab-btn:hover { color: var(--accent); background: var(--accent-light); }\n    .tab-btn.active {\n      color: var(--accent);\n      border-bottom-color: var(--accent);\n      background: var(--accent-light);\n    }\n    .tab-btn svg { width: 14px; height: 14px; }\n\n    \u002F* Panel *\u002F\n    .panel { display: none; }\n    .panel.active { display: block; }\n\n    \u002F* Rule callout *\u002F\n    .rule-callout {\n      display: flex;\n      gap: 0.75rem;\n      background: var(--callout-bg);\n      border: 1px solid var(--callout-border);\n      border-radius: var(--radius-sm);\n      padding: 0.75rem 1rem;\n      margin-bottom: 1.25rem;\n      font-size: 0.875rem;\n      color: #1e40af;\n    }\n    .rule-callout svg { flex-shrink: 0; width: 16px; height: 16px; margin-top: 0.15rem; }\n    .rule-callout strong { font-weight: 700; }\n\n    .warning-callout {\n      display: flex;\n      gap: 0.75rem;\n      background: var(--warning-bg);\n      border: 1px solid var(--warning-border);\n      border-radius: var(--radius-sm);\n      padding: 0.75rem 1rem;\n      margin-bottom: 1.25rem;\n      font-size: 0.875rem;\n      color: var(--warning-text);\n    }\n    .warning-callout svg { flex-shrink: 0; width: 16px; height: 16px; margin-top: 0.15rem; }\n\n    \u002F* Form *\u002F\n    .form-grid {\n      display: grid;\n      grid-template-columns: 1fr;\n      gap: 1rem;\n      margin-bottom: 1.25rem;\n    }\n    @media (min-width: 520px) {\n      .form-grid.two-col { grid-template-columns: 1fr 1fr; }\n    }\n\n    .field label {\n      display: block;\n      font-size: 0.8125rem;\n      font-weight: 600;\n      color: var(--text);\n      margin-bottom: 0.35rem;\n    }\n    .field .hint {\n      font-size: 0.75rem;\n      color: var(--text-muted);\n      margin-top: 0.2rem;\n    }\n\n    input[type=\"range\"] {\n      width: 100%;\n      accent-color: var(--accent);\n      cursor: pointer;\n      height: 4px;\n      margin: 0.4rem 0 0.2rem;\n    }\n    .range-value {\n      font-size: 0.8125rem;\n      font-weight: 600;\n      color: var(--accent);\n      font-variant-numeric: tabular-nums;\n    }\n\n    select {\n      width: 100%;\n      padding: 0.5rem 0.75rem;\n      border: 1px solid var(--border);\n      border-radius: var(--radius-sm);\n      font-size: 0.875rem;\n      background: var(--card);\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' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'\u002F%3E%3C\u002Fsvg%3E\");\n      background-repeat: no-repeat;\n      background-position: right 0.75rem center;\n      padding-right: 2rem;\n    }\n    select:focus { outline: 2px solid var(--accent); border-color: var(--accent); }\n\n    \u002F* Pills *\u002F\n    .pills {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 0.5rem;\n    }\n    .pill {\n      padding: 0.35rem 0.85rem;\n      border: 1.5px solid var(--border);\n      border-radius: 9999px;\n      font-size: 0.8125rem;\n      font-weight: 500;\n      cursor: pointer;\n      background: var(--card);\n      color: var(--text-muted);\n      transition: all 0.15s;\n    }\n    .pill:hover { border-color: var(--accent); color: var(--accent); }\n    .pill.active { background: var(--accent); border-color: var(--accent); color: #fff; font-weight: 600; }\n\n    \u002F* Result card *\u002F\n    .result-card {\n      background: var(--accent);\n      color: #fff;\n      border-radius: var(--radius);\n      padding: 1.25rem 1.5rem;\n      margin-bottom: 1rem;\n    }\n    .result-card .result-label {\n      font-size: 0.8125rem;\n      font-weight: 500;\n      opacity: 0.85;\n      margin-bottom: 0.25rem;\n    }\n    .result-card .result-value {\n      font-size: 2rem;\n      font-weight: 800;\n      font-variant-numeric: tabular-nums;\n      line-height: 1.2;\n    }\n    .result-card .result-detail {\n      font-size: 0.8125rem;\n      opacity: 0.85;\n      margin-top: 0.4rem;\n    }\n\n    .result-grid {\n      display: grid;\n      grid-template-columns: 1fr 1fr;\n      gap: 0.75rem;\n      margin-bottom: 1rem;\n    }\n    .result-mini {\n      background: var(--card);\n      border: 1px solid var(--border);\n      border-radius: var(--radius-sm);\n      padding: 0.75rem 1rem;\n    }\n    .result-mini .mini-label {\n      font-size: 0.75rem;\n      color: var(--text-muted);\n      margin-bottom: 0.2rem;\n    }\n    .result-mini .mini-value {\n      font-size: 1rem;\n      font-weight: 700;\n      font-variant-numeric: tabular-nums;\n      color: var(--text);\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      padding-top: 1rem;\n      margin-top: 1rem;\n      line-height: 1.5;\n    }\n    .disclaimer a { color: var(--accent); text-decoration: none; }\n    .disclaimer a:hover { text-decoration: underline; }\n\n    \u002F* Breakdown table *\u002F\n    .breakdown {\n      background: var(--card);\n      border: 1px solid var(--border);\n      border-radius: var(--radius-sm);\n      padding: 0.75rem 1rem;\n      margin-bottom: 1rem;\n      font-size: 0.8125rem;\n    }\n    .breakdown-row {\n      display: flex;\n      justify-content: space-between;\n      padding: 0.3rem 0;\n      border-bottom: 1px solid var(--border);\n    }\n    .breakdown-row:last-child { border-bottom: none; }\n    .breakdown-row .brow-label { color: var(--text-muted); }\n    .breakdown-row .brow-val { font-weight: 600; font-variant-numeric: tabular-nums; }\n  \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody>\n\u003Cmain class=\"tool-root\">\n\n  \u003C!-- CCN IDCC 1596 — deviations from Code du travail:\n       indemnite: L1234-9 baseline 1\u002F4+1\u002F3 → CCN 1\u002F5×années + 2\u002F15×années>10 (art. 10.8 CCN)\n       preavis: L1234-1 baseline 1m\u002F2m → CCN 24h\u002F\u003C6m; 1sem\u002F6m-2ans; 1m\u002F>2ans (art. 10.11 CCN)\n       conges: L3141-3 baseline 30j ouvrables → CCN ajoute congés d'ancienneté (+1 à +4 j, art. 9)\n       duree-essai: L1221-19 baseline 2 mois renouvelable → CCN 3 semaines non renouvelable\n       indemnites-deplacement: spécifiques BTP (panier ~€10.80 + trajet par zones kilométriques)\n  -->\n\n  \u003Cdiv class=\"tool-header\">\n    \u003Ch1>Calculateur CCN Bâtiment — Ouvriers des petites entreprises\u003C\u002Fh1>\n    \u003Cdiv class=\"idcc-badge\">\u003Ci data-lucide=\"building-2\">\u003C\u002Fi> IDCC 1596\u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- Tabs -->\n  \u003Cnav class=\"tabs-bar\" role=\"tablist\" aria-label=\"Fonctions calculateur\">\n    \u003Cbutton class=\"tab-btn\" data-tab=\"indemnite\" role=\"tab\" aria-selected=\"false\">\n      \u003Ci data-lucide=\"banknote\">\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=\"conges\" role=\"tab\" aria-selected=\"false\">\n      \u003Ci data-lucide=\"umbrella\">\u003C\u002Fi> Congés\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"essai\" role=\"tab\" aria-selected=\"false\">\n      \u003Ci data-lucide=\"user-check\">\u003C\u002Fi> Essai\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"deplacement\" role=\"tab\" aria-selected=\"false\">\n      \u003Ci data-lucide=\"truck\">\u003C\u002Fi> Déplacements\n    \u003C\u002Fbutton>\n  \u003C\u002Fnav>\n\n  \u003C!-- ======== TAB 1: INDEMNITÉ DE LICENCIEMENT ======== -->\n  \u003Csection class=\"panel\" data-panel=\"indemnite\" role=\"tabpanel\">\n\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cdiv>\n        \u003Cstrong>Formule CCN IDCC 1596 :\u003C\u002Fstrong> 1\u002F5 de mois × années pour les 10 premières années + 2\u002F15 de mois × années au-delà de 10 ans.\n        \u003Cstrong>Attention :\u003C\u002Fstrong> cette formule conventionnelle est \u003Cem>moins favorable\u003C\u002Fem> que le minimum légal (L1234-9 : 1\u002F4 puis 1\u002F3 de mois).\n        Le principe de faveur garantit l'application du montant le plus favorable. Majoration de \u003Cstrong>10 %\u003C\u002Fstrong> si le salarié est âgé d'au moins 55 ans.\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid two-col\">\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Salaire brut mensuel de référence\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"ind-salaire\" min=\"1500\" max=\"6000\" step=\"50\" value=\"2300\">\n        \u003Cdiv class=\"hint\">Moyenne des 3 ou 12 derniers mois (le plus favorable)\u003C\u002Fdiv>\n        \u003Cspan class=\"range-value\" id=\"ind-salaire-val\">2 300 €\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Ancienneté (années complètes)\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"ind-anciennete\" min=\"1\" max=\"40\" step=\"1\" value=\"5\">\n        \u003Cdiv class=\"hint\">Minimum 1 an pour ouvrir le droit\u003C\u002Fdiv>\n        \u003Cspan class=\"range-value\" id=\"ind-anciennete-val\">5 ans\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"field\" style=\"margin-bottom:1.25rem\">\n      \u003Clabel>Motif du licenciement\u003C\u002Flabel>\n      \u003Cdiv class=\"pills\" id=\"ind-motif-pills\">\n        \u003Cbutton class=\"pill active\" data-val=\"perso\">Motif personnel\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-val=\"eco\">Motif économique\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-val=\"inaptitude\">Inaptitude pro.\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"hint\">L'inaptitude professionnelle (AT\u002FMP) double l'indemnité conventionnelle\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"field\" style=\"margin-bottom:1.25rem\">\n      \u003Clabel>Âge du salarié\u003C\u002Flabel>\n      \u003Cdiv class=\"pills\" id=\"ind-age-pills\">\n        \u003Cbutton class=\"pill active\" data-val=\"normal\">Moins de 55 ans\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-val=\"senior\">55 ans ou plus (+10 %)\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-grid\">\n      \u003Cdiv class=\"result-mini\">\n        \u003Cdiv class=\"mini-label\">Indemnité CCN (conventionnelle)\u003C\u002Fdiv>\n        \u003Cdiv class=\"mini-value\" id=\"ind-result-ccn\">—\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"result-mini\">\n        \u003Cdiv class=\"mini-label\">Indemnité légale (L1234-9)\u003C\u002Fdiv>\n        \u003Cdiv class=\"mini-value\" id=\"ind-result-legal\">—\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Montant applicable (le plus favorable)\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"ind-result-final\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"ind-result-detail\">—\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"breakdown\" id=\"ind-breakdown\">\u003C\u002Fdiv>\n\n  \u003C\u002Fsection>\n\n  \u003C!-- ======== TAB 2: PRÉAVIS ======== -->\n  \u003Csection class=\"panel\" data-panel=\"preavis\" role=\"tabpanel\">\n\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cdiv>\n        \u003Cstrong>Préavis CCN IDCC 1596 :\u003C\u002Fstrong> Les durées sont \u003Cem>beaucoup plus courtes\u003C\u002Fem> que le code du travail (L1234-1) pour les ouvriers du bâtiment.\n        En cas de licenciement : 24 h si &lt; 6 mois, 1 semaine entre 6 mois et 2 ans, 1 mois au-delà.\n        En cas de démission : 2 jours si &lt; 3 mois, 2 semaines au-delà.\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid two-col\">\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Type de rupture\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"pre-type-pills\">\n          \u003Cbutton class=\"pill active\" data-val=\"licenciement\">Licenciement\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"demission\">Démission\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Ancienneté\u003C\u002Flabel>\n        \u003Cselect id=\"pre-anciennete\">\n          \u003Coption value=\"0\">Moins de 6 mois\u003C\u002Foption>\n          \u003Coption value=\"1\" selected>6 mois à 2 ans\u003C\u002Foption>\n          \u003Coption value=\"2\">Plus de 2 ans\u003C\u002Foption>\n        \u003C\u002Fselect>\n        \u003Cdiv class=\"hint\" id=\"pre-anciennete-hint\">Pour la démission, paliers à 3 mois et 3 mois+\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Durée du préavis CCN 1596\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"pre-result\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"pre-detail\">—\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-grid\">\n      \u003Cdiv class=\"result-mini\">\n        \u003Cdiv class=\"mini-label\">Durée légale (L1234-1)\u003C\u002Fdiv>\n        \u003Cdiv class=\"mini-value\" id=\"pre-legal\">—\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"result-mini\">\n        \u003Cdiv class=\"mini-label\">Comparaison\u003C\u002Fdiv>\n        \u003Cdiv class=\"mini-value\" id=\"pre-compare\">—\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"warning-callout\">\n      \u003Ci data-lucide=\"alert-triangle\">\u003C\u002Fi>\n      \u003Cdiv>En cas de \u003Cstrong>faute grave\u003C\u002Fstrong>, il n'y a pas de préavis. Le salarié peut également être dispensé de préavis d'un commun accord. Les durées ci-dessus s'appliquent aux ouvriers uniquement (IDCC 1596).\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n  \u003C\u002Fsection>\n\n  \u003C!-- ======== TAB 3: CONGÉS ANCIENNETÉ ======== -->\n  \u003Csection class=\"panel\" data-panel=\"conges\" role=\"tabpanel\">\n\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cdiv>\n        \u003Cstrong>Congés d'ancienneté CCN 1596 :\u003C\u002Fstrong> En plus des 30 jours ouvrables légaux (L3141-3), la convention accorde des jours supplémentaires en fonction de l'ancienneté :\n        +1 jour à 10 ans, +2 jours à 15 ans, +3 jours à 20 ans, +4 jours à 25 ans.\n        Un bonus de fractionnement est également prévu si les congés sont pris hors période principale.\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid two-col\">\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Ancienneté (années)\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"cong-anciennete\" min=\"0\" max=\"35\" step=\"1\" value=\"8\">\n        \u003Cspan class=\"range-value\" id=\"cong-anciennete-val\">8 ans\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Fractionnement des congés\u003C\u002Flabel>\n        \u003Cselect id=\"cong-fractionnement\">\n          \u003Coption value=\"0\">Pas de fractionnement hors période\u003C\u002Foption>\n          \u003Coption value=\"1\">3 à 5 jours hors période (+1 jour)\u003C\u002Foption>\n          \u003Coption value=\"2\">6 jours ou plus hors période (+2 jours)\u003C\u002Foption>\n        \u003C\u002Fselect>\n        \u003Cdiv class=\"hint\">Période principale : 1er mai au 31 octobre\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Total jours de congés par an\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"cong-result\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"cong-detail\">—\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"breakdown\" id=\"cong-breakdown\">\u003C\u002Fdiv>\n\n  \u003C\u002Fsection>\n\n  \u003C!-- ======== TAB 4: PÉRIODE D'ESSAI ======== -->\n  \u003Csection class=\"panel\" data-panel=\"essai\" role=\"tabpanel\">\n\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cdiv>\n        \u003Cstrong>Période d'essai CCN 1596 :\u003C\u002Fstrong> La convention prévoit une période d'essai de \u003Cstrong>3 semaines maximum\u003C\u002Fstrong> pour les ouvriers, \u003Cem>non renouvelable\u003C\u002Fem>.\n        C'est bien plus court que le code du travail (L1221-19 : 2 mois pour ouvriers\u002Femployés, renouvelable une fois).\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid two-col\">\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Date de début de contrat\u003C\u002Flabel>\n        \u003Cinput type=\"date\" id=\"essai-debut\" style=\"width:100%;padding:0.5rem 0.75rem;border:1px solid var(--border);border-radius:var(--radius-sm);font-size:0.875rem;\">\n        \u003Cdiv class=\"hint\">Date d'entrée dans l'entreprise\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Durée d'essai souhaitée\u003C\u002Flabel>\n        \u003Cselect id=\"essai-duree\">\n          \u003Coption value=\"7\">1 semaine (7 jours)\u003C\u002Foption>\n          \u003Coption value=\"14\">2 semaines (14 jours)\u003C\u002Foption>\n          \u003Coption value=\"21\" selected>3 semaines (21 jours) — maximum CCN\u003C\u002Foption>\n        \u003C\u002Fselect>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Fin de période d'essai\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"essai-result\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"essai-detail\">Non renouvelable selon CCN IDCC 1596\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-grid\">\n      \u003Cdiv class=\"result-mini\">\n        \u003Cdiv class=\"mini-label\">Durée max CCN 1596\u003C\u002Fdiv>\n        \u003Cdiv class=\"mini-value\">3 semaines\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"result-mini\">\n        \u003Cdiv class=\"mini-label\">Durée max légale (L1221-19)\u003C\u002Fdiv>\n        \u003Cdiv class=\"mini-value\">2 mois\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"warning-callout\">\n      \u003Ci data-lucide=\"alert-triangle\">\u003C\u002Fi>\n      \u003Cdiv>La période d'essai CCN \u003Cstrong>ne peut pas être renouvelée\u003C\u002Fstrong>, contrairement à la possibilité légale. Elle peut être rompue sans préavis par l'une ou l'autre des parties pendant la période d'essai.\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n  \u003C\u002Fsection>\n\n  \u003C!-- ======== TAB 5: INDEMNITÉS DE DÉPLACEMENT ======== -->\n  \u003Csection class=\"panel\" data-panel=\"deplacement\" role=\"tabpanel\">\n\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cdiv>\n        \u003Cstrong>Indemnités de petits déplacements BTP (CCN 1596) :\u003C\u002Fstrong> Spécifiques au secteur du bâtiment, ces indemnités compensent les frais de repas (\u003Cem>panier\u003C\u002Fem>) et de trajet domicile-chantier. Elles ne sont pas prévues par le code du travail et sont fixées par accords régionaux\u002Fdépartementaux.\n        Montants indicatifs Île-de-France 2026.\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid two-col\">\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Nombre de jours de chantier par mois\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"dep-jours\" min=\"1\" max=\"22\" step=\"1\" value=\"20\">\n        \u003Cdiv class=\"hint\">Jours où l'ouvrier travaille sur chantier (hors bureau)\u003C\u002Fdiv>\n        \u003Cspan class=\"range-value\" id=\"dep-jours-val\">20 jours\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Distance domicile → chantier (aller)\u003C\u002Flabel>\n        \u003Cselect id=\"dep-distance\">\n          \u003Coption value=\"0\">0 à 5 km — 1,03 €\u002Fj\u003C\u002Foption>\n          \u003Coption value=\"1\" selected>5 à 10 km — 1,38 €\u002Fj\u003C\u002Foption>\n          \u003Coption value=\"2\">10 à 20 km — 2,19 €\u002Fj\u003C\u002Foption>\n          \u003Coption value=\"3\">20 à 30 km — 3,29 €\u002Fj\u003C\u002Foption>\n          \u003Coption value=\"4\">30 à 40 km — 4,37 €\u002Fj\u003C\u002Foption>\n          \u003Coption value=\"5\">40 à 50 km — 5,75 €\u002Fj\u003C\u002Foption>\n          \u003Coption value=\"6\">Au-delà de 50 km — 7,18 €\u002Fj\u003C\u002Foption>\n        \u003C\u002Fselect>\n        \u003Cdiv class=\"hint\">Zones indicatives Île-de-France (accord Nov. 2025)\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"field\" style=\"margin-bottom:1.25rem\">\n      \u003Clabel>Indemnité panier repas\u003C\u002Flabel>\n      \u003Cdiv class=\"pills\" id=\"dep-panier-pills\">\n        \u003Cbutton class=\"pill active\" data-val=\"yes\">Repas hors domicile (≈ 10,80 €\u002Fj)\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-val=\"no\">Repas à domicile \u002F cantine employeur\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"hint\">L'indemnité de panier n'est pas due si l'ouvrier mange chez lui ou bénéficie d'une cantine\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Total indemnités de déplacement \u002F mois\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"dep-result\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"dep-detail\">—\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"breakdown\" id=\"dep-breakdown\">\u003C\u002Fdiv>\n\n    \u003Cdiv class=\"warning-callout\">\n      \u003Ci data-lucide=\"alert-triangle\">\u003C\u002Fi>\n      \u003Cdiv>Les montants varient selon le \u003Cstrong>département et la région\u003C\u002Fstrong>. Consultez l'accord territorial de la FFB ou de la CAPEB de votre département pour les tarifs en vigueur. Ces indemnités sont exonérées de cotisations sociales dans les limites URSSAF.\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n  \u003C\u002Fsection>\n\n  \u003C!-- Shared disclaimer -->\n  \u003Cp class=\"disclaimer\">\n    Calcul indicatif basé sur la CCN IDCC 1596 (ouvriers du bâtiment, entreprises ≤ 10 salariés — Brochure JO 3193).\n    Source : \u003Ca href=\"https:\u002F\u002Fwww.legifrance.gouv.fr\u002Fconv_coll\u002Fid\u002FKALICONT000005635221\" target=\"_blank\" rel=\"noopener\">Légifrance\u003C\u002Fa> •\n    \u003Ca href=\"https:\u002F\u002Fcode.travail.gouv.fr\u002Fconvention-collective\u002F1596-batiment-ouvriers-entreprises-occupant-jusqua-10-salaries\" target=\"_blank\" rel=\"noopener\">Code du travail numérique\u003C\u002Fa>.\n    Les montants salariaux et indemnités de déplacement font l'objet d'accords régionaux\u002Fdépartementaux — vérifiez auprès de votre FFB ou CAPEB locale.\n    Pour validation légale\n  \u003C\u002Fp>\n\n\u003C\u002Fmain>\n\n\u003Cscript>\n  const fmt = new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', maximumFractionDigits: 0 });\n  const fmtDec = new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', minimumFractionDigits: 2, maximumFractionDigits: 2 });\n\n  \u002F\u002F ── State ──────────────────────────────────────────────────────────\n  const state = {\n    ind: { salaire: 2300, anciennete: 5, motif: 'perso', age: 'normal' },\n    pre: { type: 'licenciement', anciennete: 1 },\n    cong: { anciennete: 8, fractionnement: 0 },\n    essai: { debut: '', duree: 21 },\n    dep: { jours: 20, distance: 1, panier: 'yes' },\n  };\n\n  \u002F\u002F Distance rates IDF 2026\n  const distRates = [1.03, 1.38, 2.19, 3.29, 4.37, 5.75, 7.18];\n\n  \u002F\u002F ── Compute functions ──────────────────────────────────────────────\n\n  function computeInd() {\n    const { salaire, anciennete, motif, age } = state.ind;\n    if (anciennete \u003C 1) return null;\n\n    \u002F\u002F CCN formula: 1\u002F5 × sal × années (≤10) + 2\u002F15 × sal × (années - 10) (>10)\n    let ccn = 0;\n    const tranche1 = Math.min(anciennete, 10);\n    const tranche2 = Math.max(0, anciennete - 10);\n    ccn = (1\u002F5) * salaire * tranche1 + (2\u002F15) * salaire * tranche2;\n\n    \u002F\u002F Senior bonus +10%\n    if (age === 'senior') ccn *= 1.10;\n    \u002F\u002F Inaptitude pro × 2\n    if (motif === 'inaptitude') ccn *= 2;\n\n    \u002F\u002F Legal formula: 1\u002F4 × sal × années (≤10) + 1\u002F3 × sal × (années - 10) (>10)\n    let legal = (1\u002F4) * salaire * Math.min(anciennete, 10) + (1\u002F3) * salaire * Math.max(0, anciennete - 10);\n\n    const applicable = Math.max(ccn, legal);\n    const useCCN = ccn >= legal;\n\n    return { ccn, legal, applicable, useCCN, tranche1, tranche2, salaire, anciennete };\n  }\n\n  function renderInd() {\n    const r = computeInd();\n    if (!r) {\n      document.getElementById('ind-result-final').textContent = 'Ancienneté insuffisante (\u003C 1 an)';\n      document.getElementById('ind-result-detail').textContent = '';\n      document.getElementById('ind-result-ccn').textContent = '—';\n      document.getElementById('ind-result-legal').textContent = '—';\n      document.getElementById('ind-breakdown').innerHTML = '';\n      return;\n    }\n\n    document.getElementById('ind-result-ccn').textContent = fmtDec.format(r.ccn);\n    document.getElementById('ind-result-legal').textContent = fmtDec.format(r.legal);\n    document.getElementById('ind-result-final').textContent = fmtDec.format(r.applicable);\n    document.getElementById('ind-result-detail').textContent = r.useCCN\n      ? 'Montant légal appliqué (L1234-9) — plus favorable que la formule CCN'\n      : 'Montant légal L1234-9 appliqué (principe de faveur)';\n\n    \u002F\u002F We always apply legal if higher, so detail wording:\n    document.getElementById('ind-result-detail').textContent = r.applicable === r.legal && r.legal > r.ccn\n      ? 'Montant légal L1234-9 appliqué (principe de faveur — plus élevé que la formule CCN)'\n      : r.applicable === r.ccn && r.ccn > r.legal\n        ? 'Formule CCN 1596 appliquée (avec majorations)'\n        : 'Montants identiques — formule légale appliquée';\n\n    const bonusSenior = state.ind.age === 'senior' ? ' + majoration 10 % senior' : '';\n    const bonusInapt = state.ind.motif === 'inaptitude' ? ' × 2 (inaptitude professionnelle)' : '';\n\n    document.getElementById('ind-breakdown').innerHTML = `\n      \u003Cdiv class=\"breakdown-row\">\u003Cspan class=\"brow-label\">Salaire référence\u003C\u002Fspan>\u003Cspan class=\"brow-val\">${fmtDec.format(r.salaire)}\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cdiv class=\"breakdown-row\">\u003Cspan class=\"brow-label\">Ancienneté totale\u003C\u002Fspan>\u003Cspan class=\"brow-val\">${r.anciennete} an${r.anciennete>1?'s':''}\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cdiv class=\"breakdown-row\">\u003Cspan class=\"brow-label\">CCN : 1\u002F5 × sal × ${r.tranche1} an${r.tranche1>1?'s':''}\u003C\u002Fspan>\u003Cspan class=\"brow-val\">${fmtDec.format((1\u002F5)*r.salaire*r.tranche1)}\u003C\u002Fspan>\u003C\u002Fdiv>\n      ${r.tranche2 > 0 ? `\u003Cdiv class=\"breakdown-row\">\u003Cspan class=\"brow-label\">CCN : 2\u002F15 × sal × ${r.tranche2} an${r.tranche2>1?'s':''} (&gt;10 ans)\u003C\u002Fspan>\u003Cspan class=\"brow-val\">${fmtDec.format((2\u002F15)*r.salaire*r.tranche2)}\u003C\u002Fspan>\u003C\u002Fdiv>` : ''}\n      ${bonusSenior ? `\u003Cdiv class=\"breakdown-row\">\u003Cspan class=\"brow-label\">Majoration senior (+10 %)\u003C\u002Fspan>\u003Cspan class=\"brow-val\">applicable\u003C\u002Fspan>\u003C\u002Fdiv>` : ''}\n      ${bonusInapt ? `\u003Cdiv class=\"breakdown-row\">\u003Cspan class=\"brow-label\">Doublement inaptitude pro\u003C\u002Fspan>\u003Cspan class=\"brow-val\">applicable\u003C\u002Fspan>\u003C\u002Fdiv>` : ''}\n      \u003Cdiv class=\"breakdown-row\">\u003Cspan class=\"brow-label\">Légal : 1\u002F4 × sal × ${Math.min(r.anciennete,10)} + 1\u002F3 × sal × ${Math.max(0,r.anciennete-10)}\u003C\u002Fspan>\u003Cspan class=\"brow-val\">${fmtDec.format(r.legal)}\u003C\u002Fspan>\u003C\u002Fdiv>\n    `;\n  }\n\n  function renderPre() {\n    const { type, anciennete } = state.pre;\n    let ccnDuree = '', legalDuree = '', compare = '';\n\n    if (type === 'licenciement') {\n      if (anciennete === 0) { ccnDuree = '24 heures'; legalDuree = '1 mois'; compare = 'CCN bien plus court'; }\n      else if (anciennete === 1) { ccnDuree = '1 semaine'; legalDuree = '1 mois'; compare = 'CCN plus court'; }\n      else { ccnDuree = '1 mois'; legalDuree = '2 mois'; compare = 'CCN plus court'; }\n      document.getElementById('pre-detail').textContent = 'Préavis de licenciement (art. 10.11 CCN 1596)';\n    } else {\n      \u002F\u002F démission: paliers à 3 mois\n      if (anciennete === 0) { ccnDuree = '2 jours'; legalDuree = '1 mois'; compare = 'CCN bien plus court'; }\n      else { ccnDuree = '2 semaines'; legalDuree = '2 mois'; compare = 'CCN plus court'; }\n      document.getElementById('pre-detail').textContent = 'Préavis de démission (art. 10.11 CCN 1596)';\n    }\n\n    document.getElementById('pre-result').textContent = ccnDuree;\n    document.getElementById('pre-legal').textContent = legalDuree;\n    document.getElementById('pre-compare').textContent = compare;\n\n    \u002F\u002F Update select options based on type\n    const sel = document.getElementById('pre-anciennete');\n    if (type === 'licenciement') {\n      sel.options[0].text = 'Moins de 6 mois';\n      sel.options[1].text = '6 mois à 2 ans';\n      sel.options[2].text = 'Plus de 2 ans';\n    } else {\n      sel.options[0].text = 'Moins de 3 mois';\n      sel.options[1].text = '3 mois à 2 ans';\n      sel.options[2].text = 'Plus de 2 ans';\n    }\n  }\n\n  function renderCong() {\n    const { anciennete, fractionnement } = state.cong;\n    const base = 30;\n    let extra = 0;\n    if (anciennete >= 25) extra = 4;\n    else if (anciennete >= 20) extra = 3;\n    else if (anciennete >= 15) extra = 2;\n    else if (anciennete >= 10) extra = 1;\n\n    const bonus = parseInt(fractionnement);\n    const total = base + extra + bonus;\n\n    document.getElementById('cong-result').textContent = `${total} jours ouvrables`;\n    document.getElementById('cong-detail').textContent = `Base légale : 30 j + ancienneté : +${extra} j + fractionnement : +${bonus} j`;\n\n    document.getElementById('cong-breakdown').innerHTML = `\n      \u003Cdiv class=\"breakdown-row\">\u003Cspan class=\"brow-label\">Base légale (L3141-3)\u003C\u002Fspan>\u003Cspan class=\"brow-val\">30 jours ouvrables\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cdiv class=\"breakdown-row\">\u003Cspan class=\"brow-label\">Congés d'ancienneté CCN (${anciennete} an${anciennete>1?'s':''})\u003C\u002Fspan>\u003Cspan class=\"brow-val\">+${extra} jour${extra>1?'s':''}\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cdiv class=\"breakdown-row\">\u003Cspan class=\"brow-label\">Bonus fractionnement hors période\u003C\u002Fspan>\u003Cspan class=\"brow-val\">+${bonus} jour${bonus>1?'s':''}\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cdiv class=\"breakdown-row\">\u003Cspan class=\"brow-label\">\u003Cstrong>Total\u003C\u002Fstrong>\u003C\u002Fspan>\u003Cspan class=\"brow-val\">\u003Cstrong>${total} jours\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fdiv>\n    `;\n  }\n\n  function renderEssai() {\n    const { debut, duree } = state.essai;\n    if (!debut) {\n      document.getElementById('essai-result').textContent = 'Sélectionnez une date';\n      return;\n    }\n    const d = new Date(debut);\n    d.setDate(d.getDate() + parseInt(duree));\n    const opts = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' };\n    document.getElementById('essai-result').textContent = d.toLocaleDateString('fr-FR', opts);\n    document.getElementById('essai-detail').textContent = `Fin d'essai après ${duree} jours calendaires — non renouvelable (CCN 1596)`;\n  }\n\n  function renderDep() {\n    const { jours, distance, panier } = state.dep;\n    const trajetRate = distRates[parseInt(distance)];\n    const panierAmount = panier === 'yes' ? 10.80 : 0;\n\n    const totalTrajet = trajetRate * jours;\n    const totalPanier = panierAmount * jours;\n    const total = totalTrajet + totalPanier;\n\n    document.getElementById('dep-result').textContent = fmtDec.format(total);\n    document.getElementById('dep-detail').textContent = `Panier : ${fmtDec.format(totalPanier)} + Trajet : ${fmtDec.format(totalTrajet)} (${jours} jours)`;\n\n    document.getElementById('dep-breakdown').innerHTML = `\n      \u003Cdiv class=\"breakdown-row\">\u003Cspan class=\"brow-label\">Indemnité de panier (${fmtDec.format(panierAmount)}\u002Fj × ${jours} j)\u003C\u002Fspan>\u003Cspan class=\"brow-val\">${fmtDec.format(totalPanier)}\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cdiv class=\"breakdown-row\">\u003Cspan class=\"brow-label\">Indemnité de trajet (${fmtDec.format(trajetRate)}\u002Fj × ${jours} j)\u003C\u002Fspan>\u003Cspan class=\"brow-val\">${fmtDec.format(totalTrajet)}\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cdiv class=\"breakdown-row\">\u003Cspan class=\"brow-label\">\u003Cstrong>Total mensuel\u003C\u002Fstrong>\u003C\u002Fspan>\u003Cspan class=\"brow-val\">\u003Cstrong>${fmtDec.format(total)}\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fdiv>\n    `;\n  }\n\n  \u002F\u002F ── Tabs ───────────────────────────────────────────────────────────\n  const tabBtns = document.querySelectorAll('[data-tab]');\n  const panels = document.querySelectorAll('[data-panel]');\n\n  function activate(id) {\n    tabBtns.forEach(t => {\n      const active = t.dataset.tab === id;\n      t.classList.toggle('active', active);\n      t.setAttribute('aria-selected', active);\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  }\n\n  tabBtns.forEach(t => t.addEventListener('click', () => activate(t.dataset.tab)));\n\n  \u002F\u002F ── Input wiring ──────────────────────────────────────────────────\n\n  \u002F\u002F Indemnité\n  document.getElementById('ind-salaire').addEventListener('input', e => {\n    state.ind.salaire = +e.target.value;\n    document.getElementById('ind-salaire-val').textContent = fmt.format(state.ind.salaire);\n    renderInd();\n  });\n  document.getElementById('ind-anciennete').addEventListener('input', e => {\n    state.ind.anciennete = +e.target.value;\n    document.getElementById('ind-anciennete-val').textContent = `${state.ind.anciennete} an${state.ind.anciennete>1?'s':''}`;\n    renderInd();\n  });\n  document.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      state.ind.motif = p.dataset.val;\n      renderInd();\n    });\n  });\n  document.querySelectorAll('#ind-age-pills .pill').forEach(p => {\n    p.addEventListener('click', () => {\n      document.querySelectorAll('#ind-age-pills .pill').forEach(x => x.classList.remove('active'));\n      p.classList.add('active');\n      state.ind.age = p.dataset.val;\n      renderInd();\n    });\n  });\n\n  \u002F\u002F Préavis\n  document.querySelectorAll('#pre-type-pills .pill').forEach(p => {\n    p.addEventListener('click', () => {\n      document.querySelectorAll('#pre-type-pills .pill').forEach(x => x.classList.remove('active'));\n      p.classList.add('active');\n      state.pre.type = p.dataset.val;\n      renderPre();\n    });\n  });\n  document.getElementById('pre-anciennete').addEventListener('change', e => {\n    state.pre.anciennete = +e.target.value;\n    renderPre();\n  });\n\n  \u002F\u002F Congés\n  document.getElementById('cong-anciennete').addEventListener('input', e => {\n    state.cong.anciennete = +e.target.value;\n    document.getElementById('cong-anciennete-val').textContent = `${state.cong.anciennete} an${state.cong.anciennete>1?'s':''}`;\n    renderCong();\n  });\n  document.getElementById('cong-fractionnement').addEventListener('change', e => {\n    state.cong.fractionnement = +e.target.value;\n    renderCong();\n  });\n\n  \u002F\u002F Essai\n  (function() {\n    const d = new Date();\n    d.setDate(d.getDate());\n    const iso = d.toISOString().slice(0,10);\n    document.getElementById('essai-debut').value = iso;\n    state.essai.debut = iso;\n  })();\n  document.getElementById('essai-debut').addEventListener('change', e => {\n    state.essai.debut = e.target.value;\n    renderEssai();\n  });\n  document.getElementById('essai-duree').addEventListener('change', e => {\n    state.essai.duree = +e.target.value;\n    renderEssai();\n  });\n\n  \u002F\u002F Déplacements\n  document.getElementById('dep-jours').addEventListener('input', e => {\n    state.dep.jours = +e.target.value;\n    document.getElementById('dep-jours-val').textContent = `${state.dep.jours} jour${state.dep.jours>1?'s':''}`;\n    renderDep();\n  });\n  document.getElementById('dep-distance').addEventListener('change', e => {\n    state.dep.distance = +e.target.value;\n    renderDep();\n  });\n  document.querySelectorAll('#dep-panier-pills .pill').forEach(p => {\n    p.addEventListener('click', () => {\n      document.querySelectorAll('#dep-panier-pills .pill').forEach(x => x.classList.remove('active'));\n      p.classList.add('active');\n      state.dep.panier = p.dataset.val;\n      renderDep();\n    });\n  });\n\n  \u002F\u002F ── Init ───────────────────────────────────────────────────────────\n  function init() {\n    lucide.createIcons();\n\n    \u002F\u002F Initial renders\n    renderInd();\n    renderPre();\n    renderCong();\n    renderEssai();\n    renderDep();\n\n    \u002F\u002F Initial display values\n    document.getElementById('ind-salaire-val').textContent = fmt.format(state.ind.salaire);\n    document.getElementById('ind-anciennete-val').textContent = `${state.ind.anciennete} ans`;\n    document.getElementById('cong-anciennete-val').textContent = `${state.cong.anciennete} ans`;\n    document.getElementById('dep-jours-val').textContent = `${state.dep.jours} jours`;\n\n    \u002F\u002F Activate tab from hash or default\n    const hashTab = location.hash.slice(1);\n    const validTabs = Array.from(tabBtns).map(t => t.dataset.tab);\n    const initial = validTabs.includes(hashTab) ? hashTab : validTabs[0];\n    activate(initial);\n  }\n\n  \u002F\u002F ── ResizeObserver ─────────────────────────────────────────────────\n  const ro = new ResizeObserver(() => {\n    const h = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);\n    parent.postMessage({ type: 'resize', height: h }, '*');\n  });\n  ro.observe(document.documentElement);\n\n  document.addEventListener('DOMContentLoaded', init);\n  if (document.readyState !== 'loading') init();\n\u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","generated","juridique","consumer","both","https:\u002F\u002Fpub-bdebbd2dad294475a2da0eb657815b6b.r2.dev\u002Ftools\u002Fccn-btp-ouvriers-petites-e3606b80af.webp",[]]