[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"footer-root-categories-fr-FR":3,"tool-content-ccn-banque-fr":83,"footer-cities-fr":143},[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":137,"source":138,"category":139,"audience":140,"publish_mode":141,"hero_image":142,"hero_image_alt":85},"ccn-banque","CCN de la Banque — calculateur complet","Calculateur CCN de la Banque IDCC 2120 | Expert Zoom","Outil interactif couvrant l'indemnité de licenciement, le préavis, la grille salariale, le 13e mois, les congés et la période d'essai de la CCN de la Banque (IDCC 2120).","Ce calculateur couvre les 6 fonctions clés de la convention collective de la Banque (IDCC 2120) : indemnité de licenciement (formule 1\u002F5 mensualité par semestre), préavis (1-2 mois techniciens, 3 mois cadres), grille salariale 11 niveaux A-K (avenant 25\u002F04\u002F2024), 13e mois obligatoire avec prime d'ancienneté, congés payés (26 jours ouvrés) et période d'essai (6 mois cadres).",[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 Banque — IDCC 2120","WebApplication",{"name":94,"@type":95,"identifier":96},"Convention collective de la Banque","Thing","IDCC 2120",{"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 la période d'essai de la convention collective de la Banque (IDCC 2120).","All","FinanceApplication",true,[110,113,116,119,122,125,128,131,134],{"a":111,"q":112},"Dans la CCN de la Banque (IDCC 2120), l'indemnité est calculée à raison de 1\u002F5 de mensualité par semestre complet d'ancienneté pour les salariés embauchés à partir du 1er janvier 2000 (soit 2\u002F5 de mois par an). La mensualité de référence correspond au 1\u002F13e du salaire annuel brut. Un plafond de 15 mensualités s'applique aux embauches depuis 2000. Cette formule est plus favorable que le Code du travail (1\u002F4 mois\u002Fan) pour les premières années d'ancienneté.","Comment calculer l'indemnité de licenciement dans la convention collective de la Banque ?",{"a":114,"q":115},"L'article 30 de la CCN de la Banque fixe les durées suivantes : pour les techniciens, 1 mois si l'ancienneté est inférieure à 2 ans, 2 mois au-delà. Pour les cadres, la durée est uniformément de 3 mois quelle que soit l'ancienneté. Le préavis est doublé pour les travailleurs handicapés (RQTH), dans la limite de 3 mois.","Quelle est la durée du préavis en cas de licenciement dans la Banque ?",{"a":117,"q":118},"Oui, la CCN de la Banque prévoit un 13e mois obligatoire. Le salaire annuel est versé en 13 mensualités égales, ce qui représente un avantage de 8,3 % par rapport à un salaire versé sur 12 mois. Le 13e mois est versé avec le salaire de décembre, ou en fractions selon un accord d'entreprise.","Y a-t-il un 13e mois obligatoire dans la convention collective de la Banque ?",{"a":120,"q":121},"La CCN de la Banque comprend 11 niveaux de classification : niveaux A à G pour les techniciens et H à K pour les cadres. Selon l'avenant du 25 avril 2024, les minima annuels bruts vont de 22 937 € (niveau A, sans ancienneté) à 61 645 € (niveau K, 20 ans d'ancienneté). Chaque niveau comporte 5 tranches d'ancienneté (0, 5, 10, 15 et 20 ans).","Quelle est la grille de salaires minimum dans la convention collective de la Banque ?",{"a":123,"q":124},"La CCN de la Banque octroie 26 jours ouvrés de congés payés annuels, soit un jour de plus que les 25 jours ouvrés correspondant à la base légale de 30 jours ouvrables (L3141-3). Ce jour supplémentaire est acquis après 1 an d'ancienneté. En-deçà d'un an, les droits sont calculés à raison de 2,5 jours ouvrés par mois travaillé.","Combien de jours de congés payés accorde la convention collective de la Banque ?",{"a":126,"q":127},"En plus du 13e mois, la CCN de la Banque prévoit une prime d'ancienneté calculée sur le salaire de base : 3 % après 3 ans d'ancienneté, 6 % après 6 ans, 9 % après 9 ans et 12 % après 15 ans. Cette prime est cumulable avec le 13e mois et représente un avantage salarial significatif pour les salariés fidèles.","Quelle est la prime d'ancienneté dans la convention collective de la Banque ?",{"a":129,"q":130},"Pour les techniciens, la période d'essai est de 3 mois renouvelable une fois (6 mois maximum), conformément au Code du travail. Pour les cadres, la CCN prévoit une durée initiale de 6 mois renouvelable pour 4 mois (10 mois maximum), ce qui est plus long que le délai légal de 4+4 mois. Cette durée allongée pour les cadres est moins favorable pour le salarié.","Quelle est la durée de la période d'essai dans la convention collective de la Banque ?",{"a":132,"q":133},"La CCN de la Banque (IDCC 2120) s'applique aux établissements de crédit, banques, caisses d'épargne et certains établissements financiers dont le siège social est en France métropolitaine. Elle couvre les salariés de droit privé (techniciens et cadres) à l'exclusion des fonctionnaires et agents de statut public. Il convient de vérifier si votre employeur est adhérent à l'AFB (Association Française des Banques) ou couvert par un accord de branche.","La convention collective de la Banque s'applique-t-elle à toutes les banques ?",{"a":135,"q":136},"Pour les heures supplémentaires, la CCN de la Banque applique les taux légaux du Code du travail : +25 % pour les 8 premières heures supplémentaires par semaine, +50 % au-delà. Ces majorations peuvent se traduire par un complément de salaire ou par l'attribution de repos compensateur équivalent, selon les accords en vigueur dans l'établissement.","Quelles sont les majorations pour heures supplémentaires dans la convention collective de la Banque ?","\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 de la Banque — IDCC 2120\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    body {\n      font-family: system-ui, -apple-system, sans-serif;\n      background: #fafaf9;\n      color: #1c1917;\n      font-size: 15px;\n      line-height: 1.5;\n    }\n    .tool-root {\n      max-width: 720px;\n      margin: 0 auto;\n      padding: 1.25rem 1rem 2rem;\n    }\n    .tool-header {\n      margin-bottom: 1.25rem;\n    }\n    .tool-header h1 {\n      font-size: 1.2rem;\n      font-weight: 700;\n      color: #1c1917;\n    }\n    .tool-header .idcc-badge {\n      display: inline-flex;\n      align-items: center;\n      gap: 0.3rem;\n      background: #eff6ff;\n      color: #1d4ed8;\n      border: 1px solid #bfdbfe;\n      border-radius: 9999px;\n      padding: 0.2rem 0.65rem;\n      font-size: 0.78rem;\n      font-weight: 600;\n      margin-top: 0.35rem;\n    }\n\n    \u002F* Tabs *\u002F\n    .tab-list {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 0.35rem;\n      border-bottom: 2px solid #e7e5e4;\n      margin-bottom: 1.25rem;\n      padding-bottom: 0;\n    }\n    .tab-btn {\n      display: flex;\n      align-items: center;\n      gap: 0.3rem;\n      background: none;\n      border: none;\n      cursor: pointer;\n      padding: 0.5rem 0.85rem;\n      font-size: 0.85rem;\n      font-weight: 500;\n      color: #78716c;\n      border-bottom: 2px solid transparent;\n      margin-bottom: -2px;\n      border-radius: 0.25rem 0.25rem 0 0;\n      transition: color 0.15s, border-color 0.15s;\n    }\n    .tab-btn:hover { color: #1d4ed8; }\n    .tab-btn.active {\n      color: #1d4ed8;\n      border-bottom-color: #2563eb;\n      background: #eff6ff;\n    }\n\n    \u002F* Panel *\u002F\n    .panel { display: none; }\n    .panel.visible { display: block; }\n\n    \u002F* Rule callout *\u002F\n    .rule-callout {\n      display: flex;\n      gap: 0.65rem;\n      background: #eff6ff;\n      border: 1px solid #bfdbfe;\n      border-radius: 0.75rem;\n      padding: 0.85rem 1rem;\n      margin-bottom: 1.25rem;\n      font-size: 0.875rem;\n      color: #1e3a8a;\n      align-items: flex-start;\n    }\n    .rule-callout i { flex-shrink: 0; margin-top: 2px; }\n\n    \u002F* Form elements *\u002F\n    .form-group { margin-bottom: 1.1rem; }\n    .form-label {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      font-size: 0.85rem;\n      font-weight: 500;\n      color: #44403c;\n      margin-bottom: 0.4rem;\n    }\n    .form-label .value-display {\n      font-weight: 700;\n      color: #1c1917;\n      font-variant-numeric: tabular-nums;\n    }\n    input[type=range] {\n      width: 100%;\n      accent-color: #2563eb;\n      cursor: pointer;\n    }\n    .pills {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 0.4rem;\n    }\n    .pill {\n      padding: 0.3rem 0.75rem;\n      border-radius: 9999px;\n      font-size: 0.82rem;\n      font-weight: 500;\n      cursor: pointer;\n      border: 1.5px solid #d6d3d1;\n      background: #fff;\n      color: #44403c;\n      transition: all 0.15s;\n    }\n    .pill.selected {\n      background: #2563eb;\n      border-color: #2563eb;\n      color: #fff;\n    }\n    select {\n      width: 100%;\n      padding: 0.5rem 0.75rem;\n      border: 1.5px solid #d6d3d1;\n      border-radius: 0.5rem;\n      background: #fff;\n      font-size: 0.875rem;\n      color: #1c1917;\n      cursor: pointer;\n    }\n    select:focus { outline: 2px solid #2563eb; }\n\n    \u002F* Result card *\u002F\n    .result-card {\n      background: #fff;\n      border: 1.5px solid #e7e5e4;\n      border-radius: 0.75rem;\n      padding: 1rem 1.25rem;\n      margin-top: 1.1rem;\n    }\n    .result-label {\n      font-size: 0.8rem;\n      color: #78716c;\n      text-transform: uppercase;\n      letter-spacing: 0.04em;\n      font-weight: 600;\n      margin-bottom: 0.3rem;\n    }\n    .result-value {\n      font-size: 1.65rem;\n      font-weight: 800;\n      color: #2563eb;\n      font-variant-numeric: tabular-nums;\n    }\n    .result-sub {\n      font-size: 0.82rem;\n      color: #78716c;\n      margin-top: 0.25rem;\n    }\n\n    \u002F* Divider in result *\u002F\n    .result-rows {\n      display: flex;\n      flex-direction: column;\n      gap: 0.5rem;\n      margin-top: 0.5rem;\n    }\n    .result-row {\n      display: flex;\n      justify-content: space-between;\n      font-size: 0.85rem;\n    }\n    .result-row .rr-label { color: #78716c; }\n    .result-row .rr-val { font-weight: 600; font-variant-numeric: tabular-nums; }\n\n    \u002F* Disclaimer *\u002F\n    .disclaimer {\n      margin-top: 1.75rem;\n      font-size: 0.78rem;\n      color: #a8a29e;\n      border-top: 1px solid #e7e5e4;\n      padding-top: 0.85rem;\n      line-height: 1.6;\n    }\n    .disclaimer a { color: #2563eb; text-decoration: none; }\n    .disclaimer a:hover { text-decoration: underline; }\n\n    \u002F* Toggle *\u002F\n    .toggle-group {\n      display: flex;\n      gap: 0.4rem;\n    }\n    .toggle-btn {\n      flex: 1;\n      padding: 0.45rem 0.5rem;\n      border: 1.5px solid #d6d3d1;\n      border-radius: 0.5rem;\n      background: #fff;\n      font-size: 0.83rem;\n      font-weight: 500;\n      cursor: pointer;\n      color: #44403c;\n      text-align: center;\n      transition: all 0.15s;\n    }\n    .toggle-btn.selected {\n      background: #2563eb;\n      border-color: #2563eb;\n      color: #fff;\n    }\n\n    \u002F* Grid table *\u002F\n    .grid-table {\n      width: 100%;\n      border-collapse: collapse;\n      font-size: 0.8rem;\n      margin-top: 0.75rem;\n    }\n    .grid-table th {\n      background: #f5f5f4;\n      padding: 0.4rem 0.5rem;\n      text-align: left;\n      font-weight: 600;\n      color: #44403c;\n      border-bottom: 1px solid #e7e5e4;\n    }\n    .grid-table td {\n      padding: 0.35rem 0.5rem;\n      border-bottom: 1px solid #f5f5f4;\n    }\n    .grid-table tr.highlight td {\n      background: #eff6ff;\n      font-weight: 700;\n      color: #1d4ed8;\n    }\n    .hidden { display: none; }\n  \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody>\n\u003C!-- CCN IDCC 2120 — deviations\n     indemnite: L1234-9 baseline (1\u002F4 + 1\u002F3) → CCN: 2\u002F5 mois\u002Fan (1\u002F5 × semestre), cap 15 mois (embauche ≥ 2000) — source: art. CCN banque, JoBExit IDCC 2120\n     preavis: L1234-1 → CCN: techniciens 1-2 mois, cadres 3 mois (art. 30 CCN)\n     salaire-min: SMIC → CCN: grille 11 niveaux A→K avec ancienneté, avenant 25\u002F04\u002F2024\n     prime-annuelle: aucun minimum légal → CCN: 13e mois obligatoire + prime ancienneté 3%\u002F6%\u002F9%\u002F12%\n     conges: 30j ouvrables L3141-3 → CCN: 26 jours ouvrés (vs 25 jours ouvrés légal), art. CCN\n     duree-essai: L1221-19 cadres 4+4 → CCN cadres: 6+4 mois (art. 11 CCN) — moins favorable pour l'employé\n     heures-supp: L3121-36 +25%\u002F+50% → CCN: identique, aucune déviation → SKIP -->\n\n\u003Cmain class=\"tool-root\">\n  \u003Cdiv class=\"tool-header\">\n    \u003Ch1>Calculateur — Convention Collective de la Banque\u003C\u002Fh1>\n    \u003Cdiv class=\"idcc-badge\">\n      \u003Ci data-lucide=\"landmark\" style=\"width:13px;height:13px\">\u003C\u002Fi>\n      IDCC 2120\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003Cnav class=\"tab-list\" role=\"tablist\" aria-label=\"Fonctions CCN\">\n    \u003Cbutton class=\"tab-btn\" data-tab=\"indemnite\" role=\"tab\">\n      \u003Ci data-lucide=\"calculator\" style=\"width:14px;height:14px\">\u003C\u002Fi> Indemnité\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"preavis\" role=\"tab\">\n      \u003Ci data-lucide=\"clock\" style=\"width:14px;height:14px\">\u003C\u002Fi> Préavis\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"salaire-min\" role=\"tab\">\n      \u003Ci data-lucide=\"bar-chart-2\" style=\"width:14px;height:14px\">\u003C\u002Fi> Grille salariale\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"prime-annuelle\" role=\"tab\">\n      \u003Ci data-lucide=\"gift\" style=\"width:14px;height:14px\">\u003C\u002Fi> 13e mois\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"conges\" role=\"tab\">\n      \u003Ci data-lucide=\"sun\" style=\"width:14px;height:14px\">\u003C\u002Fi> Congés\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"duree-essai\" role=\"tab\">\n      \u003Ci data-lucide=\"user-check\" style=\"width:14px;height:14px\">\u003C\u002Fi> Période d'essai\n    \u003C\u002Fbutton>\n  \u003C\u002Fnav>\n\n  \u003C!-- ── PANEL: Indemnité de licenciement ── -->\n  \u003Csection class=\"panel\" data-panel=\"indemnite\" role=\"tabpanel\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:16px;height:16px\">\u003C\u002Fi>\n      \u003Cp>La CCN de la Banque prévoit \u003Cstrong>1\u002F5 de mensualité par semestre d'ancienneté\u003C\u002Fstrong> (soit 2\u002F5 par an), plus favorable que le Code du travail (L1234-9 : 1\u002F4 par an les 10 premières années). Toutefois, un plafond de \u003Cstrong>15 mensualités\u003C\u002Fstrong> s'applique pour les embauches à partir du 1er janvier 2000. La mensualité de référence est le 1\u002F13 du salaire annuel brut.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">\n        Salaire annuel brut (€)\n        \u003Cspan class=\"value-display\" id=\"ind-salaire-display\">36 000 €\u003C\u002Fspan>\n      \u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"ind-salaire\" min=\"22000\" max=\"120000\" step=\"500\" value=\"36000\">\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">\n        Ancienneté (années)\n        \u003Cspan class=\"value-display\" id=\"ind-anc-display\">5 ans\u003C\u002Fspan>\n      \u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"ind-anc\" min=\"1\" max=\"40\" step=\"1\" value=\"5\">\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">Date d'embauche\u003C\u002Flabel>\n      \u003Cdiv class=\"pills\" id=\"ind-embauche-pills\">\n        \u003Cbutton class=\"pill selected\" data-val=\"post2000\">Après le 01\u002F01\u002F2000\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-val=\"pre2000\">Avant le 01\u002F01\u002F2000\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">Catégorie\u003C\u002Flabel>\n      \u003Cdiv class=\"pills\" id=\"ind-cat-pills\">\n        \u003Cbutton class=\"pill selected\" data-val=\"technicien\">Technicien\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-val=\"cadre\">Cadre\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-card\" id=\"ind-result\">\n      \u003Cdiv class=\"result-label\">Indemnité brute estimée\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"ind-montant\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"ind-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fsection>\n\n  \u003C!-- ── PANEL: Préavis ── -->\n  \u003Csection class=\"panel\" data-panel=\"preavis\" role=\"tabpanel\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:16px;height:16px\">\u003C\u002Fi>\n      \u003Cp>L'article 30 de la CCN de la Banque fixe des durées de préavis précises : \u003Cstrong>1 mois (techniciens &lt; 2 ans) ou 2 mois (techniciens ≥ 2 ans)\u003C\u002Fstrong>, et \u003Cstrong>3 mois pour les cadres\u003C\u002Fstrong> quelle que soit l'ancienneté. Le préavis est doublé pour les travailleurs handicapés (maximum 3 mois).\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">Catégorie\u003C\u002Flabel>\n      \u003Cdiv class=\"toggle-group\" id=\"pre-cat-toggle\">\n        \u003Cbutton class=\"toggle-btn selected\" data-val=\"technicien\">Technicien\u003C\u002Fbutton>\n        \u003Cbutton class=\"toggle-btn\" data-val=\"cadre\">Cadre\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"form-group\" id=\"pre-anc-group\">\n      \u003Clabel class=\"form-label\">\n        Ancienneté (années)\n        \u003Cspan class=\"value-display\" id=\"pre-anc-display\">3 ans\u003C\u002Fspan>\n      \u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"pre-anc\" min=\"0\" max=\"30\" step=\"1\" value=\"3\">\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">Type de rupture\u003C\u002Flabel>\n      \u003Cdiv class=\"pills\" id=\"pre-type-pills\">\n        \u003Cbutton class=\"pill selected\" 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=\"form-group\">\n      \u003Clabel class=\"form-label\">Travailleur handicapé (RQTH) ?\u003C\u002Flabel>\n      \u003Cdiv class=\"toggle-group\" id=\"pre-rqth-toggle\">\n        \u003Cbutton class=\"toggle-btn selected\" data-val=\"non\">Non\u003C\u002Fbutton>\n        \u003Cbutton class=\"toggle-btn\" data-val=\"oui\">Oui\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Durée du préavis\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"pre-duree\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"pre-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fsection>\n\n  \u003C!-- ── PANEL: Grille salariale ── -->\n  \u003Csection class=\"panel\" data-panel=\"salaire-min\" role=\"tabpanel\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:16px;height:16px\">\u003C\u002Fi>\n      \u003Cp>La CCN de la Banque prévoit une \u003Cstrong>grille de classification en 11 niveaux\u003C\u002Fstrong> (A à G pour les techniciens, H à K pour les cadres) avec des minima progressifs selon l'ancienneté. Avenant du 25 avril 2024, applicable au 1er mai 2024. Pour les cadres de plus de 50 ans, un plancher de \u003Cstrong>36 000 € brut\u002Fan\u003C\u002Fstrong> est garanti.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">Niveau \u002F Classification\u003C\u002Flabel>\n      \u003Cselect id=\"sal-niveau\">\n        \u003Coptgroup label=\"Techniciens\">\n          \u003Coption value=\"A\">Niveau A\u003C\u002Foption>\n          \u003Coption value=\"B\">Niveau B\u003C\u002Foption>\n          \u003Coption value=\"C\">Niveau C\u003C\u002Foption>\n          \u003Coption value=\"D\">Niveau D\u003C\u002Foption>\n          \u003Coption value=\"E\" selected>Niveau E\u003C\u002Foption>\n          \u003Coption value=\"F\">Niveau F\u003C\u002Foption>\n          \u003Coption value=\"G\">Niveau G\u003C\u002Foption>\n        \u003C\u002Foptgroup>\n        \u003Coptgroup label=\"Cadres\">\n          \u003Coption value=\"H\">Niveau H\u003C\u002Foption>\n          \u003Coption value=\"I\">Niveau I\u003C\u002Foption>\n          \u003Coption value=\"J\">Niveau J\u003C\u002Foption>\n          \u003Coption value=\"K\">Niveau K\u003C\u002Foption>\n        \u003C\u002Foptgroup>\n      \u003C\u002Fselect>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">Tranche d'ancienneté\u003C\u002Flabel>\n      \u003Cdiv class=\"pills\" id=\"sal-anc-pills\">\n        \u003Cbutton class=\"pill selected\" data-val=\"0\">0 an\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-val=\"5\">5 ans\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-val=\"10\">10 ans\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-val=\"15\">15 ans\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-val=\"20\">20 ans\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Salaire annuel brut minimum (2024)\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"sal-montant\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-rows\">\n        \u003Cdiv class=\"result-row\">\n          \u003Cspan class=\"rr-label\">Mensuel brut minimum\u003C\u002Fspan>\n          \u003Cspan class=\"rr-val\" id=\"sal-mensuel\">—\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"result-row\">\n          \u003Cspan class=\"rr-label\">Mensuel avec 13e mois (÷13)\u003C\u002Fspan>\n          \u003Cspan class=\"rr-val\" id=\"sal-mensuel13\">—\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"sal-note\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fsection>\n\n  \u003C!-- ── PANEL: 13e mois & prime d'ancienneté ── -->\n  \u003Csection class=\"panel\" data-panel=\"prime-annuelle\" role=\"tabpanel\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:16px;height:16px\">\u003C\u002Fi>\n      \u003Cp>La CCN de la Banque impose un \u003Cstrong>13e mois obligatoire\u003C\u002Fstrong> : le salaire annuel est versé en 13 mensualités égales. S'y ajoute une \u003Cstrong>prime d'ancienneté\u003C\u002Fstrong> progressive (3 % à 3 ans, 6 % à 6 ans, 9 % à 9 ans, 12 % à 15 ans), calculée sur le salaire de base.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">\n        Salaire mensuel de base (€)\n        \u003Cspan class=\"value-display\" id=\"pri-sal-display\">2 500 €\u003C\u002Fspan>\n      \u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"pri-sal\" min=\"1802\" max=\"10000\" step=\"50\" value=\"2500\">\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">\n        Ancienneté (années)\n        \u003Cspan class=\"value-display\" id=\"pri-anc-display\">4 ans\u003C\u002Fspan>\n      \u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"pri-anc\" min=\"0\" max=\"30\" step=\"1\" value=\"4\">\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Rémunération annuelle totale estimée\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"pri-total\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-rows\">\n        \u003Cdiv class=\"result-row\">\n          \u003Cspan class=\"rr-label\">Salaire de base annuel (13 mois)\u003C\u002Fspan>\n          \u003Cspan class=\"rr-val\" id=\"pri-base13\">—\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"result-row\">\n          \u003Cspan class=\"rr-label\">Prime d'ancienneté\u003C\u002Fspan>\n          \u003Cspan class=\"rr-val\" id=\"pri-anc-val\">—\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"result-row\">\n          \u003Cspan class=\"rr-label\">Taux d'ancienneté appliqué\u003C\u002Fspan>\n          \u003Cspan class=\"rr-val\" id=\"pri-taux\">—\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fsection>\n\n  \u003C!-- ── PANEL: Congés payés ── -->\n  \u003Csection class=\"panel\" data-panel=\"conges\" role=\"tabpanel\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:16px;height:16px\">\u003C\u002Fi>\n      \u003Cp>La CCN de la Banque octroie \u003Cstrong>26 jours ouvrés de congés payés\u003C\u002Fstrong> par an (contre 25 jours ouvrés correspondant aux 30 jours ouvrables légaux). Ce jour supplémentaire s'applique après 1 an d'ancienneté. Pour une embauche en cours d'année, les droits sont acquis à raison de \u003Cstrong>2,5 jours ouvrés par mois travaillé\u003C\u002Fstrong>.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">\n        Ancienneté (années complètes)\n        \u003Cspan class=\"value-display\" id=\"cong-anc-display\">2 ans\u003C\u002Fspan>\n      \u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"cong-anc\" min=\"0\" max=\"30\" step=\"1\" value=\"2\">\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">\n        Mois travaillés cette année (si entrée en cours d'année)\n        \u003Cspan class=\"value-display\" id=\"cong-mois-display\">12 mois\u003C\u002Fspan>\n      \u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"cong-mois\" min=\"1\" max=\"12\" step=\"1\" value=\"12\">\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Congés annuels\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"cong-jours\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-rows\">\n        \u003Cdiv class=\"result-row\">\n          \u003Cspan class=\"rr-label\">Base légale (30j ouvrables)\u003C\u002Fspan>\n          \u003Cspan class=\"rr-val\">25 jours ouvrés\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"result-row\">\n          \u003Cspan class=\"rr-label\">Jour supplémentaire CCN\u003C\u002Fspan>\n          \u003Cspan class=\"rr-val\" id=\"cong-sup\">—\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"cong-note\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fsection>\n\n  \u003C!-- ── PANEL: Période d'essai ── -->\n  \u003Csection class=\"panel\" data-panel=\"duree-essai\" role=\"tabpanel\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:16px;height:16px\">\u003C\u002Fi>\n      \u003Cp>Pour les \u003Cstrong>cadres\u003C\u002Fstrong>, la CCN de la Banque prévoit une période d'essai initiale de \u003Cstrong>6 mois\u003C\u002Fstrong> (renouvelable une fois pour 4 mois, soit 10 mois maximum), contre 4+4 mois selon le Code du travail — moins favorable pour le salarié. Pour les techniciens, la durée est conforme au droit commun (3+3 mois).\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">Catégorie\u003C\u002Flabel>\n      \u003Cdiv class=\"toggle-group\" id=\"ess-cat-toggle\">\n        \u003Cbutton class=\"toggle-btn selected\" data-val=\"technicien\">Technicien\u003C\u002Fbutton>\n        \u003Cbutton class=\"toggle-btn\" data-val=\"cadre\">Cadre\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">Renouvellement prévu au contrat ?\u003C\u002Flabel>\n      \u003Cdiv class=\"toggle-group\" id=\"ess-renouv-toggle\">\n        \u003Cbutton class=\"toggle-btn selected\" data-val=\"non\">Non\u003C\u002Fbutton>\n        \u003Cbutton class=\"toggle-btn\" data-val=\"oui\">Oui\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Durée de la période d'essai\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"ess-duree\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-rows\">\n        \u003Cdiv class=\"result-row\">\n          \u003Cspan class=\"rr-label\">Durée initiale\u003C\u002Fspan>\n          \u003Cspan class=\"rr-val\" id=\"ess-initial\">—\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"result-row\">\n          \u003Cspan class=\"rr-label\">Si renouvellement\u003C\u002Fspan>\n          \u003Cspan class=\"rr-val\" id=\"ess-renouv-dur\">—\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"result-row\">\n          \u003Cspan class=\"rr-label\">Maximum total\u003C\u002Fspan>\n          \u003Cspan class=\"rr-val\" id=\"ess-max\">—\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"result-row\">\n          \u003Cspan class=\"rr-label\">Baseline code du travail\u003C\u002Fspan>\n          \u003Cspan class=\"rr-val\" id=\"ess-baseline\">—\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fsection>\n\n  \u003Cp class=\"disclaimer\">\n    Calcul indicatif basé sur la CCN IDCC 2120 (Convention collective de la Banque).\n    Source : \u003Ca href=\"https:\u002F\u002Fwww.legifrance.gouv.fr\u002Fconv_coll\u002Fid\u002FKALICONT000005635780\" target=\"_blank\" rel=\"noopener\">Legifrance\u003C\u002Fa>.\n    Grille salariale : avenant du 25 avril 2024.\n    Pour validation légale\n  \u003C\u002Fp>\n\u003C\u002Fmain>\n\n\u003Cscript>\n(function () {\n  'use strict';\n\n  \u002F\u002F ── Helpers ──\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  function $ (id) { return document.getElementById(id); }\n\n  \u002F\u002F ── Salary grid IDCC 2120 — Avenant 25\u002F04\u002F2024 ──\n  \u002F\u002F [niveau][ancienneté: 0,5,10,15,20 ans] = salaire brut annuel €\n  const GRID = {\n    A: [22937, 22937, 22937, 22937, 22937],\n    B: [22937, 22937, 22937, 22937, 23199],\n    C: [22937, 22937, 22937, 23006, 23650],\n    D: [22937, 23318, 23974, 24640, 25338],\n    E: [23790, 24350, 25037, 25746, 26478],\n    F: [25822, 26424, 27176, 27951, 28766],\n    G: [28479, 29174, 30028, 30914, 31820],\n    H: [31351, 32110, 33082, 34068, 35091],\n    I: [38284, 39240, 40418, 41630, 42880],\n    J: [46255, 47402, 48826, 50299, 51808],\n    K: [55036, 56417, 58100, 59850, 61645],\n  };\n  const ANC_IDX = [0, 5, 10, 15, 20]; \u002F\u002F ancienneté brackets\n\n  \u002F\u002F ── Tab system ──\n  const tabBtns = document.querySelectorAll('[data-tab]');\n  const panels = document.querySelectorAll('[data-panel]');\n\n  function activate (id) {\n    tabBtns.forEach(t => t.classList.toggle('active', t.dataset.tab === id));\n    panels.forEach(p => {\n      const match = p.dataset.panel === id;\n      p.classList.toggle('visible', match);\n      p.classList.toggle('hidden', !match);\n    });\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 Init from hash or default\n  const hashTab = location.hash.slice(1);\n  const firstTab = tabBtns[0] && tabBtns[0].dataset.tab;\n  const initTab = (hashTab && document.querySelector(`[data-tab=\"${hashTab}\"]`)) ? hashTab : firstTab;\n  activate(initTab);\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  \u002F\u002F ══════════════════════════════════════════\n  \u002F\u002F PANEL 1 — Indemnité de licenciement\n  \u002F\u002F ══════════════════════════════════════════\n  const indState = { salaire: 36000, anc: 5, embauche: 'post2000', cat: 'technicien' };\n\n  function computeInd () {\n    const { salaire, anc, embauche, cat } = indState;\n    \u002F\u002F Mensualité de référence = salaire annuel \u002F 13\n    const mensualite = salaire \u002F 13;\n    \u002F\u002F Nombre de semestres complets\n    const semestres = Math.floor(anc * 2);\n    let raw;\n    if (embauche === 'post2000') {\n      \u002F\u002F 1\u002F5 mensualité × semestre (2\u002F5 par an)\n      raw = mensualite * (1 \u002F 5) * semestres;\n      \u002F\u002F Cap: 15 mensualités\n      const cap = mensualite * 15;\n      raw = Math.min(raw, cap);\n    } else {\n      \u002F\u002F Avant 2000: 1\u002F2 × (13\u002F14.5) mensualité par semestre, cap selon catégorie\n      const coeff = 13 \u002F 14.5;\n      raw = mensualite * 0.5 * coeff * semestres;\n      const capSem = cat === 'cadre' ? 24 : 18;\n      const cap = mensualite * coeff * capSem;\n      raw = Math.min(raw, cap);\n    }\n    return { montant: raw, mensualite, semestres };\n  }\n\n  function renderInd () {\n    const { montant, mensualite, semestres } = computeInd();\n    $('ind-montant').textContent = fmt.format(montant);\n    $('ind-detail').textContent = `Mensualité de référence : ${fmtDec.format(mensualite)} — ${semestres} semestre(s) d'ancienneté`;\n  }\n\n  $('ind-salaire').addEventListener('input', function () {\n    indState.salaire = +this.value;\n    $('ind-salaire-display').textContent = fmt.format(indState.salaire);\n    renderInd();\n  });\n  $('ind-anc').addEventListener('input', function () {\n    indState.anc = +this.value;\n    $('ind-anc-display').textContent = indState.anc + ' ans';\n    renderInd();\n  });\n  document.querySelectorAll('#ind-embauche-pills .pill').forEach(p => {\n    p.addEventListener('click', function () {\n      document.querySelectorAll('#ind-embauche-pills .pill').forEach(x => x.classList.remove('selected'));\n      this.classList.add('selected');\n      indState.embauche = this.dataset.val;\n      renderInd();\n    });\n  });\n  document.querySelectorAll('#ind-cat-pills .pill').forEach(p => {\n    p.addEventListener('click', function () {\n      document.querySelectorAll('#ind-cat-pills .pill').forEach(x => x.classList.remove('selected'));\n      this.classList.add('selected');\n      indState.cat = this.dataset.val;\n      renderInd();\n    });\n  });\n  renderInd();\n\n  \u002F\u002F ══════════════════════════════════════════\n  \u002F\u002F PANEL 2 — Préavis\n  \u002F\u002F ══════════════════════════════════════════\n  const preState = { cat: 'technicien', anc: 3, type: 'licenciement', rqth: 'non' };\n\n  function computePre () {\n    const { cat, anc, type, rqth } = preState;\n    let mois;\n    if (cat === 'cadre') {\n      mois = 3;\n    } else {\n      \u002F\u002F Technicien\n      if (type === 'licenciement') {\n        mois = anc \u003C 2 ? 1 : 2;\n      } else {\n        \u002F\u002F Démission\n        mois = 1;\n      }\n    }\n    let detail = '';\n    if (rqth === 'oui') {\n      const doubled = Math.min(mois * 2, 3);\n      detail = `Doublé RQTH (plafonné à 3 mois) → ${doubled} mois`;\n      mois = doubled;\n    }\n    return { mois, detail };\n  }\n\n  function renderPre () {\n    const { mois, detail } = computePre();\n    $('pre-duree').textContent = mois + (mois > 1 ? ' mois' : ' mois');\n    $('pre-detail').textContent = detail || (preState.cat === 'cadre' ? 'Art. 30 CCN — cadres, tous niveaux d\\'ancienneté' : 'Art. 30 CCN — techniciens');\n  }\n\n  document.querySelectorAll('#pre-cat-toggle .toggle-btn').forEach(b => {\n    b.addEventListener('click', function () {\n      document.querySelectorAll('#pre-cat-toggle .toggle-btn').forEach(x => x.classList.remove('selected'));\n      this.classList.add('selected');\n      preState.cat = this.dataset.val;\n      $('pre-anc-group').style.display = preState.cat === 'cadre' ? 'none' : '';\n      renderPre();\n    });\n  });\n  $('pre-anc').addEventListener('input', function () {\n    preState.anc = +this.value;\n    $('pre-anc-display').textContent = preState.anc + ' an' + (preState.anc > 1 ? 's' : '');\n    renderPre();\n  });\n  document.querySelectorAll('#pre-type-pills .pill').forEach(p => {\n    p.addEventListener('click', function () {\n      document.querySelectorAll('#pre-type-pills .pill').forEach(x => x.classList.remove('selected'));\n      this.classList.add('selected');\n      preState.type = this.dataset.val;\n      renderPre();\n    });\n  });\n  document.querySelectorAll('#pre-rqth-toggle .toggle-btn').forEach(b => {\n    b.addEventListener('click', function () {\n      document.querySelectorAll('#pre-rqth-toggle .toggle-btn').forEach(x => x.classList.remove('selected'));\n      this.classList.add('selected');\n      preState.rqth = this.dataset.val;\n      renderPre();\n    });\n  });\n  renderPre();\n\n  \u002F\u002F ══════════════════════════════════════════\n  \u002F\u002F PANEL 3 — Grille salariale\n  \u002F\u002F ══════════════════════════════════════════\n  const salState = { niveau: 'E', anc: 0 };\n\n  function getGridVal () {\n    const ancIdx = ANC_IDX.reduce((best, val, i) => (val \u003C= salState.anc ? i : best), 0);\n    return GRID[salState.niveau][ancIdx];\n  }\n\n  function renderSal () {\n    const annual = getGridVal();\n    const monthly = annual \u002F 12;\n    const monthly13 = annual \u002F 13;\n    const isCadre = ['H','I','J','K'].includes(salState.niveau);\n    $('sal-montant').textContent = fmt.format(annual);\n    $('sal-mensuel').textContent = fmtDec.format(monthly);\n    $('sal-mensuel13').textContent = fmtDec.format(monthly13);\n    let note = '';\n    if (isCadre && salState.anc >= 0) {\n      note = 'Cadres > 50 ans : plancher garanti de 36 000 € brut\u002Fan.';\n    }\n    $('sal-note').textContent = note;\n  }\n\n  $('sal-niveau').addEventListener('change', function () {\n    salState.niveau = this.value;\n    renderSal();\n  });\n  document.querySelectorAll('#sal-anc-pills .pill').forEach(p => {\n    p.addEventListener('click', function () {\n      document.querySelectorAll('#sal-anc-pills .pill').forEach(x => x.classList.remove('selected'));\n      this.classList.add('selected');\n      salState.anc = +this.dataset.val;\n      renderSal();\n    });\n  });\n  renderSal();\n\n  \u002F\u002F ══════════════════════════════════════════\n  \u002F\u002F PANEL 4 — 13e mois & prime d'ancienneté\n  \u002F\u002F ══════════════════════════════════════════\n  const priState = { sal: 2500, anc: 4 };\n\n  function getAncTaux (anc) {\n    if (anc >= 15) return 0.12;\n    if (anc >= 9)  return 0.09;\n    if (anc >= 6)  return 0.06;\n    if (anc >= 3)  return 0.03;\n    return 0;\n  }\n\n  function renderPri () {\n    const { sal, anc } = priState;\n    const base13 = sal * 13;\n    const taux = getAncTaux(anc);\n    const primeAnc = sal * 12 * taux; \u002F\u002F prime sur salaire de base annuel (12 mois)\n    const total = base13 + primeAnc;\n    $('pri-total').textContent = fmt.format(total);\n    $('pri-base13').textContent = fmt.format(base13);\n    $('pri-anc-val').textContent = fmt.format(primeAnc);\n    $('pri-taux').textContent = (taux * 100).toFixed(0) + ' %';\n  }\n\n  $('pri-sal').addEventListener('input', function () {\n    priState.sal = +this.value;\n    $('pri-sal-display').textContent = fmt.format(priState.sal);\n    renderPri();\n  });\n  $('pri-anc').addEventListener('input', function () {\n    priState.anc = +this.value;\n    $('pri-anc-display').textContent = priState.anc + ' an' + (priState.anc > 1 ? 's' : '');\n    renderPri();\n  });\n  renderPri();\n\n  \u002F\u002F ══════════════════════════════════════════\n  \u002F\u002F PANEL 5 — Congés payés\n  \u002F\u002F ══════════════════════════════════════════\n  const congState = { anc: 2, mois: 12 };\n\n  function renderCong () {\n    const { anc, mois } = congState;\n    const hasFullYear = anc >= 1;\n    let jours;\n    let sup;\n    let note;\n    if (hasFullYear) {\n      if (mois >= 12) {\n        jours = 26;\n        sup = '+1 jour CCN accordé';\n        note = 'Droit complet après 1 an d\\'ancienneté.';\n      } else {\n        \u002F\u002F prorata sur 25 jours + 1 sup si mois = 12\n        jours = Math.floor(mois * 2.5);\n        jours = Math.min(jours, 26);\n        sup = 'Pro-rata ' + mois + ' mois';\n        note = 'Calcul proratisé : 2,5 jours ouvrés\u002Fmois travaillé.';\n      }\n    } else {\n      jours = Math.floor(mois * 2.5);\n      jours = Math.min(jours, 25);\n      sup = 'Droit à partir de 1 an d\\'ancienneté';\n      note = 'Le 26e jour est acquis après 1 an d\\'ancienneté.';\n    }\n    $('cong-jours').textContent = jours + ' jours ouvrés';\n    $('cong-sup').textContent = sup;\n    $('cong-note').textContent = note;\n  }\n\n  $('cong-anc').addEventListener('input', function () {\n    congState.anc = +this.value;\n    $('cong-anc-display').textContent = congState.anc + ' an' + (congState.anc > 1 ? 's' : '');\n    renderCong();\n  });\n  $('cong-mois').addEventListener('input', function () {\n    congState.mois = +this.value;\n    $('cong-mois-display').textContent = congState.mois + ' mois';\n    renderCong();\n  });\n  renderCong();\n\n  \u002F\u002F ══════════════════════════════════════════\n  \u002F\u002F PANEL 6 — Période d'essai\n  \u002F\u002F ══════════════════════════════════════════\n  const essState = { cat: 'technicien', renouv: 'non' };\n\n  function renderEss () {\n    const { cat, renouv } = essState;\n    let initial, renewDur, maxTotal, baseline;\n    if (cat === 'technicien') {\n      initial = '3 mois';\n      renewDur = '3 mois';\n      maxTotal = '6 mois';\n      baseline = '3 mois + renouvellement 3 mois (L1221-19)';\n    } else {\n      initial = '6 mois';\n      renewDur = '4 mois';\n      maxTotal = '10 mois';\n      baseline = '4 mois + renouvellement 4 mois (L1221-19) — CCN moins favorable';\n    }\n    $('ess-initial').textContent = initial;\n    $('ess-renouv-dur').textContent = renewDur;\n    $('ess-max').textContent = maxTotal;\n    $('ess-baseline').textContent = baseline;\n    if (renouv === 'oui') {\n      $('ess-duree').textContent = maxTotal;\n    } else {\n      $('ess-duree').textContent = initial;\n    }\n  }\n\n  document.querySelectorAll('#ess-cat-toggle .toggle-btn').forEach(b => {\n    b.addEventListener('click', function () {\n      document.querySelectorAll('#ess-cat-toggle .toggle-btn').forEach(x => x.classList.remove('selected'));\n      this.classList.add('selected');\n      essState.cat = this.dataset.val;\n      renderEss();\n    });\n  });\n  document.querySelectorAll('#ess-renouv-toggle .toggle-btn').forEach(b => {\n    b.addEventListener('click', function () {\n      document.querySelectorAll('#ess-renouv-toggle .toggle-btn').forEach(x => x.classList.remove('selected'));\n      this.classList.add('selected');\n      essState.renouv = this.dataset.val;\n      renderEss();\n    });\n  });\n  renderEss();\n\n  \u002F\u002F ── Lucide icons ──\n  if (typeof lucide !== 'undefined') lucide.createIcons();\n})();\n\u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","generated","juridique","consumer","both","https:\u002F\u002Fpub-bdebbd2dad294475a2da0eb657815b6b.r2.dev\u002Ftools\u002Fccn-banque-5fb909f929.webp",[]]