[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"footer-root-categories-fr-FR":3,"tool-content-ccn-poissonnerie-fr":83,"footer-cities-fr":140},[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":134,"source":135,"category":136,"audience":137,"publish_mode":138,"hero_image":139,"hero_image_alt":85},"ccn-poissonnerie","CCN de la poissonnerie — calculateur complet","Calculateur CCN Poissonnerie IDCC 1504 | Expert Zoom","Outil interactif couvrant l'indemnité de licenciement, le préavis, la grille salariale, la prime d'ancienneté, la prime annuelle et les heures supplémentaires de la CCN de la poissonnerie (IDCC 1504).","Ce calculateur complet couvre les 6 principales dérogations de la convention collective de la poissonnerie (IDCC 1504) par rapport au code du travail : indemnité de licenciement (formule 1\u002F10 + 1\u002F5), préavis (3 mois en démission), grille salariale 2025 (1 831,80 € à 4 104,62 €), prime d'ancienneté obligatoire (3 % à 10 %), prime annuelle de fin d'année (2 % du brut annuel) et heures supplémentaires annualisées.",[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 Poissonnerie — IDCC 1504","WebApplication",{"name":94,"@type":95,"identifier":96},"Convention collective de la poissonnerie","Thing","IDCC 1504",{"name":98,"@type":99},"Expert-Zoom","Organization","https:\u002F\u002Fschema.org",{"url":102,"@type":103},"\u002Ffr\u002Fmagazine\u002Fjuridique\u002Fles-conventions-collectives-en-france","Article","fr","Outil interactif couvrant l'indemnité de licenciement, le préavis, la grille salariale, la prime d'ancienneté, la prime annuelle et les heures supplémentaires de la convention collective de la poissonnerie (IDCC 1504).","All","FinanceApplication",true,[110,113,116,119,122,125,128,131],{"a":111,"q":112},"La CCN Poissonnerie (IDCC 1504) prévoit une indemnité de 1\u002F10 de mois par année pour les 4 premières années, puis 1\u002F5 de mois par année à partir de la 5e année. Le seuil d'ancienneté requis est de 2 ans (contre 8 mois dans le code du travail). Si l'indemnité légale (1\u002F4 + 1\u002F3) est plus favorable, c'est elle qui s'applique.","Quelle est l'indemnité de licenciement dans la convention collective de la poissonnerie ?",{"a":114,"q":115},"Pour un licenciement : moins de 6 mois d'ancienneté = 1 semaine, de 6 mois à 2 ans = 1 mois, au-delà de 2 ans = 2 mois. En cas de démission, le préavis conventionnel est de 3 mois pour tous les salariés, réductible d'un commun accord. Le salarié licencié a droit à 2 heures payées par jour pour rechercher un emploi.","Quelle est la durée du préavis dans la convention collective poissonnerie ?",{"a":117,"q":118},"La grille salariale 2025 de la CCN Poissonnerie (Avenant 2025) s'étend de 1 831,80 € brut\u002Fmois (niveau I – employé qualifié) à 4 104,62 € brut\u002Fmois (niveau VII – cadre supérieur), pour 151,67 heures mensuelles. Ces minima sont supérieurs au SMIC.","Quels sont les salaires minimums de la convention collective poissonnerie en 2025 ?",{"a":120,"q":121},"Oui, la CCN Poissonnerie impose une prime d'ancienneté obligatoire dès 3 ans de présence dans l'entreprise. Le barème est : 3 % à 3 ans, 4 % à 4 ans, 5 % à 5 ans, 7 % à 7 ans, 10 % à partir de 10 ans. Cette prime s'applique sur le salaire minimum conventionnel garanti.","La convention collective poissonnerie prévoit-elle une prime d'ancienneté ?",{"a":123,"q":124},"La CCN Poissonnerie prévoit une prime de fin d'année obligatoire égale à 2 % de la rémunération brute annuelle du salarié, sans condition d'ancienneté. Elle est versée en deux fois : 50 % en juin et le solde en décembre. Il n'y a pas de 13ème mois stricto sensu, mais cette prime est cumulable sauf si un accord d'entreprise prévoit un avantage au moins équivalent.","Y a-t-il un 13ème mois ou une prime annuelle dans la convention collective poissonnerie ?",{"a":126,"q":127},"La CCN Poissonnerie calcule les heures supplémentaires sur une base annualisée. Le seuil est de 1 607 heures par an. Pour les entreprises de ≤ 20 salariés : majoration de +25 % de 1 607 à 1 960 h\u002Fan, puis +50 % au-delà. Pour les entreprises de > 20 salariés : +50 % à partir de 1 870 h\u002Fan (Avenant n°63 du 22 novembre 2007).","Comment sont calculées les heures supplémentaires dans la CCN Poissonnerie ?",{"a":129,"q":130},"La CCN Poissonnerie prévoit des périodes d'essai plus courtes que le code du travail : 1 mois pour les employés (renouvelable une fois), 2 mois pour les agents de maîtrise (renouvelable une fois), et 3 mois pour les cadres (renouvelable une fois). Le renouvellement doit être convenu par écrit au moins 10 jours avant la fin de la première période.","Quelle est la durée de la période d'essai dans la convention collective poissonnerie ?",{"a":132,"q":133},"Oui. La CCN Poissonnerie impose une mutuelle santé obligatoire pour tous les salariés, avec participation de l'employeur d'au moins 50 %. La prévoyance est obligatoire pour tous les salariés (cadres et non-cadres), ce qui est plus favorable que le code du travail qui ne la rend obligatoire que pour les cadres.","La CCN Poissonnerie prévoit-elle une mutuelle et une prévoyance obligatoires ?","\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 Poissonnerie IDCC 1504\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    :root {\n      --bg: #fafaf9;\n      --card: #ffffff;\n      --border: #e7e5e4;\n      --accent: #2563eb;\n      --accent-light: #dbeafe;\n      --accent-dark: #1d4ed8;\n      --text: #1c1917;\n      --text-muted: #78716c;\n      --success-bg: #f0fdf4;\n      --success-border: #bbf7d0;\n      --success-text: #166534;\n      --warning-bg: #fffbeb;\n      --warning-border: #fde68a;\n      --warning-text: #92400e;\n      --info-bg: #eff6ff;\n      --info-border: #bfdbfe;\n      --info-text: #1e40af;\n      --radius: 0.75rem;\n      --radius-sm: 0.375rem;\n      --shadow: 0 1px 3px 0 rgb(0 0 0 \u002F .1), 0 1px 2px -1px rgb(0 0 0 \u002F .1);\n      --shadow-md: 0 4px 6px -1px rgb(0 0 0 \u002F .1), 0 2px 4px -2px rgb(0 0 0 \u002F .1);\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    .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.25rem;\n      font-weight: 700;\n      color: var(--text);\n      display: flex;\n      align-items: center;\n      gap: 0.5rem;\n      flex-wrap: wrap;\n    }\n    .tool-header h1 svg { color: var(--accent); flex-shrink: 0; }\n    .badge {\n      display: inline-flex;\n      align-items: center;\n      background: var(--accent-light);\n      color: var(--accent-dark);\n      font-size: 0.75rem;\n      font-weight: 600;\n      padding: 0.125rem 0.5rem;\n      border-radius: 9999px;\n    }\n    .tool-header p {\n      color: var(--text-muted);\n      font-size: 0.875rem;\n      margin-top: 0.25rem;\n    }\n    \u002F* Tabs *\u002F\n    .tabs-nav {\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    }\n    .tabs-nav::-webkit-scrollbar { display: none; }\n    .tab-btn {\n      display: flex;\n      align-items: center;\n      gap: 0.375rem;\n      padding: 0.5rem 0.875rem;\n      border: none;\n      background: none;\n      font-size: 0.8125rem;\n      font-weight: 500;\n      color: var(--text-muted);\n      cursor: pointer;\n      white-space: nowrap;\n      border-bottom: 2px solid transparent;\n      margin-bottom: -2px;\n      border-radius: var(--radius-sm) var(--radius-sm) 0 0;\n      transition: color .15s, border-color .15s;\n    }\n    .tab-btn:hover { color: var(--accent); }\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    \u002F* Panels *\u002F\n    .panel { display: none; }\n    .panel.active { display: block; }\n    \u002F* Rule callout *\u002F\n    .rule-callout {\n      display: flex;\n      gap: 0.625rem;\n      background: var(--info-bg);\n      border: 1px solid var(--info-border);\n      border-radius: var(--radius);\n      padding: 0.875rem 1rem;\n      margin-bottom: 1.25rem;\n    }\n    .rule-callout svg { color: var(--accent); flex-shrink: 0; margin-top: 2px; }\n    .rule-callout p { font-size: 0.875rem; color: var(--info-text); line-height: 1.5; }\n    .rule-callout strong { font-weight: 600; }\n    \u002F* Card *\u002F\n    .card {\n      background: var(--card);\n      border: 1px solid var(--border);\n      border-radius: var(--radius);\n      padding: 1.25rem;\n      box-shadow: var(--shadow);\n      margin-bottom: 1rem;\n    }\n    .card-title {\n      font-size: 0.8125rem;\n      font-weight: 600;\n      text-transform: uppercase;\n      letter-spacing: .04em;\n      color: var(--text-muted);\n      margin-bottom: 1rem;\n      display: flex;\n      align-items: center;\n      gap: 0.375rem;\n    }\n    .card-title svg { width: 14px; height: 14px; }\n    \u002F* Form fields *\u002F\n    .field { margin-bottom: 1rem; }\n    .field:last-child { margin-bottom: 0; }\n    label {\n      display: flex;\n      justify-content: space-between;\n      align-items: baseline;\n      font-size: 0.875rem;\n      font-weight: 500;\n      margin-bottom: 0.375rem;\n    }\n    label .val {\n      font-weight: 700;\n      color: var(--accent);\n      font-variant-numeric: tabular-nums;\n    }\n    input[type=\"range\"] {\n      width: 100%;\n      accent-color: var(--accent);\n      cursor: pointer;\n      height: 4px;\n    }\n    select, input[type=\"number\"] {\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      appearance: none;\n      cursor: pointer;\n    }\n    select:focus, input[type=\"number\"]:focus {\n      outline: 2px solid var(--accent);\n      outline-offset: 1px;\n    }\n    \u002F* Pills *\u002F\n    .pills {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 0.375rem;\n    }\n    .pill {\n      padding: 0.3125rem 0.75rem;\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 .15s;\n    }\n    .pill.active {\n      border-color: var(--accent);\n      background: var(--accent-light);\n      color: var(--accent-dark);\n    }\n    \u002F* Result card *\u002F\n    .result-card {\n      background: linear-gradient(135deg, var(--accent) 0%, var(--accent-dark) 100%);\n      border-radius: var(--radius);\n      padding: 1.25rem 1.5rem;\n      color: white;\n      margin-top: 1.25rem;\n    }\n    .result-label {\n      font-size: 0.8125rem;\n      font-weight: 500;\n      opacity: 0.85;\n      margin-bottom: 0.25rem;\n    }\n    .result-main {\n      font-size: 2rem;\n      font-weight: 800;\n      font-variant-numeric: tabular-nums;\n      line-height: 1.2;\n    }\n    .result-detail {\n      font-size: 0.8125rem;\n      opacity: 0.8;\n      margin-top: 0.375rem;\n    }\n    .result-rows {\n      display: flex;\n      flex-direction: column;\n      gap: 0.25rem;\n      margin-top: 0.75rem;\n    }\n    .result-row {\n      display: flex;\n      justify-content: space-between;\n      font-size: 0.8125rem;\n      padding: 0.375rem 0;\n      border-top: 1px solid rgba(255,255,255,.2);\n    }\n    .result-row:first-child { border-top: none; }\n    .result-row .rr-val { font-weight: 700; font-variant-numeric: tabular-nums; }\n    \u002F* Grille table *\u002F\n    .grid-table {\n      width: 100%;\n      border-collapse: collapse;\n      font-size: 0.8125rem;\n    }\n    .grid-table th {\n      background: var(--accent-light);\n      color: var(--accent-dark);\n      font-weight: 600;\n      padding: 0.5rem 0.75rem;\n      text-align: left;\n      border-bottom: 1px solid var(--border);\n    }\n    .grid-table td {\n      padding: 0.5rem 0.75rem;\n      border-bottom: 1px solid var(--border);\n      font-variant-numeric: tabular-nums;\n    }\n    .grid-table tr:hover td { background: var(--bg); }\n    .grid-table .highlight td {\n      background: var(--accent-light);\n      font-weight: 600;\n      color: var(--accent-dark);\n    }\n    \u002F* Highlight box *\u002F\n    .highlight-box {\n      background: var(--success-bg);\n      border: 1px solid var(--success-border);\n      border-radius: var(--radius-sm);\n      padding: 0.75rem 1rem;\n      margin-top: 0.75rem;\n      font-size: 0.875rem;\n      color: var(--success-text);\n    }\n    .highlight-box strong { font-weight: 600; }\n    \u002F* Warning box *\u002F\n    .warning-box {\n      background: var(--warning-bg);\n      border: 1px solid var(--warning-border);\n      border-radius: var(--radius-sm);\n      padding: 0.625rem 1rem;\n      margin-top: 0.75rem;\n      font-size: 0.8125rem;\n      color: var(--warning-text);\n    }\n    \u002F* Disclaimer *\u002F\n    .disclaimer {\n      font-size: 0.8rem;\n      color: var(--text-muted);\n      border-top: 1px solid var(--border);\n      margin-top: 1.5rem;\n      padding-top: 0.875rem;\n      line-height: 1.5;\n    }\n    .disclaimer a { color: var(--accent); text-decoration: none; }\n    .disclaimer a:hover { text-decoration: underline; }\n    \u002F* Grid highlight row (selected) *\u002F\n    .selected-row td {\n      background: var(--accent-light) !important;\n      color: var(--accent-dark);\n      font-weight: 700;\n    }\n  \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody>\n\u003C!-- CCN IDCC 1504 — deviations\n     indemnite: L1234-9 (1\u002F4+1\u002F3) → 1\u002F10 (\u003C 5 ans) + 1\u002F5 (≥ 5 ans), seuil 2 ans (source: Convention collective poissonnerie IDCC 1504)\n     preavis: L1234-1 aligné sur licenciement; démission 3 mois (source: CCN 1504 art. préavis)\n     salaire-min: grille publiée Avenant 2025 €1 831,80 → €4 104,62 (source: LégiSocial + Legifrance)\n     prime-anciennete: 3% à 3 ans → 10% à 10 ans (source: Annexe II CCN 1504)\n     prime-annuelle: 2% de la rémunération brute annuelle, versement juin+décembre (source: CCN 1504)\n     heures-supp: calcul annualisé — seuil 1 607h\u002Fan; ≤20 sal.: +25% de 1596 à 1960h, +50% au-delà (source: Avenant n°63 du 22\u002F11\u002F2007 KALITEXT000018659338)\n-->\n\u003Cmain class=\"tool-root\">\n  \u003Cdiv class=\"tool-header\">\n    \u003Ch1>\n      \u003Ci data-lucide=\"calculator\">\u003C\u002Fi>\n      Calculateur CCN de la Poissonnerie\n      \u003Cspan class=\"badge\">IDCC 1504\u003C\u002Fspan>\n    \u003C\u002Fh1>\n    \u003Cp>Indemnité, préavis, grille salariale, primes et heures supplémentaires\u003C\u002Fp>\n  \u003C\u002Fdiv>\n\n  \u003Cnav class=\"tabs-nav\" role=\"tablist\">\n    \u003Cbutton class=\"tab-btn\" data-tab=\"indemnite\" role=\"tab\">\n      \u003Ci data-lucide=\"banknote\">\u003C\u002Fi> Indemnité\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"preavis\" role=\"tab\">\n      \u003Ci data-lucide=\"clock\">\u003C\u002Fi> Préavis\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"salaire-min\" role=\"tab\">\n      \u003Ci data-lucide=\"trending-up\">\u003C\u002Fi> Grille salariale\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"prime-anciennete\" role=\"tab\">\n      \u003Ci data-lucide=\"award\">\u003C\u002Fi> Ancienneté\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"prime-annuelle\" role=\"tab\">\n      \u003Ci data-lucide=\"gift\">\u003C\u002Fi> Prime annuelle\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"heures-supp\" role=\"tab\">\n      \u003Ci data-lucide=\"timer\">\u003C\u002Fi> Heures supp.\n    \u003C\u002Fbutton>\n  \u003C\u002Fnav>\n\n  \u003C!-- ═══════════════════════════════════ TAB: INDEMNITÉ ═══════════════════════════════════ -->\n  \u003Cdiv class=\"panel\" data-panel=\"indemnite\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN Poissonnerie (IDCC 1504) prévoit une indemnité de \u003Cstrong>1\u002F10 de mois par année\u003C\u002Fstrong> pour moins de 5 ans et de \u003Cstrong>1\u002F5 de mois à partir de la 5e année\u003C\u002Fstrong> — formule différente du code du travail (1\u002F4 + 1\u002F3). Le seuil d'ancienneté est de \u003Cstrong>2 ans\u003C\u002Fstrong> (contre 8 mois légaux).\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"card-title\">\u003Ci data-lucide=\"sliders-horizontal\">\u003C\u002Fi> Vos données\u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Salaire brut mensuel de référence \u003Cspan class=\"val\" id=\"ind-sal-val\">2 500 €\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"ind-salaire\" min=\"1400\" max=\"8000\" step=\"50\" value=\"2500\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Ancienneté (années complètes) \u003Cspan class=\"val\" id=\"ind-anc-val\">5 ans\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"ind-anciennete\" min=\"0\" max=\"40\" step=\"1\" value=\"5\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel style=\"margin-bottom:.5rem\">Motif du licenciement\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"ind-motif-pills\">\n          \u003Cbutton class=\"pill active\" data-val=\"economique\">Économique\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"personnel\">Personnel\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"inaptitude\">Inaptitude\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"ind-result\">\n      \u003Cdiv class=\"result-label\">Indemnité conventionnelle estimée\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-main\" id=\"ind-montant\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"ind-detail\">Saisissez vos données\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-rows\" id=\"ind-rows\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"warning-box\" id=\"ind-warning\" style=\"display:none\">\n      \u003Cstrong>Attention :\u003C\u002Fstrong> ancienneté inférieure à 2 ans — le seuil conventionnel n'est pas atteint (aucune indemnité conventionnelle).\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"warning-box\" style=\"display:block;margin-top:.75rem\">\n      \u003Cstrong>Note :\u003C\u002Fstrong> En cas de résultat inférieur à l'indemnité légale (L1234-9 : 1\u002F4 + 1\u002F3), le salarié a droit au minimum légal, plus favorable.\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ═══════════════════════════════════ TAB: PRÉAVIS ═══════════════════════════════════ -->\n  \u003Cdiv class=\"panel\" data-panel=\"preavis\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>Pour le licenciement, la CCN Poissonnerie suit la grille légale. En cas de \u003Cstrong>démission\u003C\u002Fstrong>, le préavis est de \u003Cstrong>3 mois\u003C\u002Fstrong> pour tous les salariés (peut être réduit d'un commun accord). Les employés bénéficient de \u003Cstrong>2 heures payées par jour\u003C\u002Fstrong> pour rechercher un emploi (sauf démission).\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"card-title\">\u003Ci data-lucide=\"sliders-horizontal\">\u003C\u002Fi> Vos données\u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel style=\"margin-bottom:.5rem\">Type de rupture\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"prea-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          \u003Cbutton class=\"pill\" data-val=\"retraite\">Départ à la retraite\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Ancienneté (années complètes) \u003Cspan class=\"val\" id=\"prea-anc-val\">3 ans\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"prea-anciennete\" min=\"0\" max=\"40\" step=\"1\" value=\"3\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel style=\"margin-bottom:.5rem\">Catégorie professionnelle\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"prea-cat-pills\">\n          \u003Cbutton class=\"pill active\" data-val=\"employe\">Employé\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"maitrise\">Agent de maîtrise\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"cadre\">Cadre\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"prea-result\">\n      \u003Cdiv class=\"result-label\">Durée de préavis\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-main\" id=\"prea-duree\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"prea-detail\">Saisissez vos données\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-rows\" id=\"prea-rows\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ═══════════════════════════════════ TAB: GRILLE SALARIALE ═══════════════════════════════════ -->\n  \u003Cdiv class=\"panel\" data-panel=\"salaire-min\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN Poissonnerie dispose d'une \u003Cstrong>grille de salaires minimaux conventionnels\u003C\u002Fstrong> (Avenant 2025) allant de \u003Cstrong>1 831,80 €\u003C\u002Fstrong> (niveau I) à \u003Cstrong>4 104,62 €\u003C\u002Fstrong> (niveau VII), pour 151,67 h\u002Fmois. Ces minima sont supérieurs au SMIC.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"card-title\">\u003Ci data-lucide=\"list\">\u003C\u002Fi> Grille des salaires minimaux (2025, 151,67 h\u002Fmois)\u003C\u002Fdiv>\n      \u003Cdiv style=\"overflow-x:auto\">\n        \u003Ctable class=\"grid-table\" id=\"grille-table\">\n          \u003Cthead>\n            \u003Ctr>\n              \u003Cth>Niveau\u003C\u002Fth>\n              \u003Cth>Classification\u003C\u002Fth>\n              \u003Cth>Salaire min. brut\u002Fmois\u003C\u002Fth>\n            \u003C\u002Ftr>\n          \u003C\u002Fthead>\n          \u003Ctbody>\n            \u003Ctr data-niveau=\"1\">\u003Ctd>I\u003C\u002Ftd>\u003Ctd>Employé qualifié\u003C\u002Ftd>\u003Ctd>1 831,80 €\u003C\u002Ftd>\u003C\u002Ftr>\n            \u003Ctr data-niveau=\"2\">\u003Ctd>II\u003C\u002Ftd>\u003Ctd>Employé spécialisé\u003C\u002Ftd>\u003Ctd>1 898,20 €\u003C\u002Ftd>\u003C\u002Ftr>\n            \u003Ctr data-niveau=\"3\">\u003Ctd>III\u003C\u002Ftd>\u003Ctd>Employé hautement qualifié\u003C\u002Ftd>\u003Ctd>1 986,40 €\u003C\u002Ftd>\u003C\u002Ftr>\n            \u003Ctr data-niveau=\"4\">\u003Ctd>IV\u003C\u002Ftd>\u003Ctd>Agent de maîtrise\u003C\u002Ftd>\u003Ctd>2 234,90 €\u003C\u002Ftd>\u003C\u002Ftr>\n            \u003Ctr data-niveau=\"5\">\u003Ctd>V\u003C\u002Ftd>\u003Ctd>Agent de maîtrise confirmé\u003C\u002Ftd>\u003Ctd>2 583,00 €\u003C\u002Ftd>\u003C\u002Ftr>\n            \u003Ctr data-niveau=\"6\">\u003Ctd>VI\u003C\u002Ftd>\u003Ctd>Cadre\u003C\u002Ftd>\u003Ctd>3 251,80 €\u003C\u002Ftd>\u003C\u002Ftr>\n            \u003Ctr data-niveau=\"7\">\u003Ctd>VII\u003C\u002Ftd>\u003Ctd>Cadre supérieur\u003C\u002Ftd>\u003Ctd>4 104,62 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003C\u002Ftbody>\n        \u003C\u002Ftable>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"card-title\">\u003Ci data-lucide=\"calculator\">\u003C\u002Fi> Calculer pour un niveau\u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel style=\"margin-bottom:.5rem\">Votre niveau conventionnel\u003C\u002Flabel>\n        \u003Cselect id=\"grille-niveau\">\n          \u003Coption value=\"1\">Niveau I — Employé qualifié\u003C\u002Foption>\n          \u003Coption value=\"2\">Niveau II — Employé spécialisé\u003C\u002Foption>\n          \u003Coption value=\"3\" selected>Niveau III — Employé hautement qualifié\u003C\u002Foption>\n          \u003Coption value=\"4\">Niveau IV — Agent de maîtrise\u003C\u002Foption>\n          \u003Coption value=\"5\">Niveau V — Agent de maîtrise confirmé\u003C\u002Foption>\n          \u003Coption value=\"6\">Niveau VI — Cadre\u003C\u002Foption>\n          \u003Coption value=\"7\">Niveau VII — Cadre supérieur\u003C\u002Foption>\n        \u003C\u002Fselect>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Heures hebdomadaires \u003Cspan class=\"val\" id=\"grille-h-val\">35 h\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"grille-heures\" min=\"24\" max=\"48\" step=\"1\" value=\"35\">\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Salaire minimum conventionnel\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-main\" id=\"grille-montant\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"grille-detail\">Pour 35 h\u002Fsemaine\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-rows\" id=\"grille-rows\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ═══════════════════════════════════ TAB: PRIME ANCIENNETÉ ═══════════════════════════════════ -->\n  \u003Cdiv class=\"panel\" data-panel=\"prime-anciennete\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN Poissonnerie impose une \u003Cstrong>prime d'ancienneté obligatoire\u003C\u002Fstrong> dès 3 ans de présence. Elle est calculée en pourcentage du salaire minimum conventionnel garanti : de \u003Cstrong>3 % à 3 ans\u003C\u002Fstrong> jusqu'à \u003Cstrong>10 % à 10 ans et plus\u003C\u002Fstrong>.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"card-title\">\u003Ci data-lucide=\"sliders-horizontal\">\u003C\u002Fi> Vos données\u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Salaire brut mensuel de base \u003Cspan class=\"val\" id=\"anc-sal-val\">2 000 €\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"anc-salaire\" min=\"1400\" max=\"6000\" step=\"50\" value=\"2000\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Ancienneté (années complètes) \u003Cspan class=\"val\" id=\"anc-anc-val\">5 ans\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"anc-anciennete\" min=\"0\" max=\"30\" step=\"1\" value=\"5\">\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Prime d'ancienneté mensuelle\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-main\" id=\"anc-montant\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"anc-detail\">Saisissez vos données\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-rows\" id=\"anc-rows\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"highlight-box\">\n      \u003Cstrong>Barème conventionnel :\u003C\u002Fstrong> 3 ans → 3 % · 4 ans → 4 % · 5 ans → 5 % · 7 ans → 7 % · 10 ans et + → 10 %\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ═══════════════════════════════════ TAB: PRIME ANNUELLE ═══════════════════════════════════ -->\n  \u003Cdiv class=\"panel\" data-panel=\"prime-annuelle\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN Poissonnerie prévoit une \u003Cstrong>prime de fin d'année obligatoire\u003C\u002Fstrong> égale à \u003Cstrong>2 % de la rémunération brute annuelle\u003C\u002Fstrong> de chaque salarié, sans condition d'ancienneté. Versement en 2 fois : 50 % en juin, solde en décembre.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"card-title\">\u003Ci data-lucide=\"sliders-horizontal\">\u003C\u002Fi> Vos données\u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Salaire brut mensuel \u003Cspan class=\"val\" id=\"pan-sal-val\">2 200 €\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"pan-salaire\" min=\"1400\" max=\"8000\" step=\"50\" value=\"2200\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Mois travaillés dans l'année \u003Cspan class=\"val\" id=\"pan-mois-val\">12 mois\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"pan-mois\" min=\"1\" max=\"12\" step=\"1\" value=\"12\">\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Prime annuelle conventionnelle\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-main\" id=\"pan-montant\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"pan-detail\">Versée en 2 fois (juin + décembre)\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-rows\" id=\"pan-rows\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ═══════════════════════════════════ TAB: HEURES SUPP ═══════════════════════════════════ -->\n  \u003Cdiv class=\"panel\" data-panel=\"heures-supp\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN Poissonnerie organise les heures supplémentaires sur une \u003Cstrong>base annualisée\u003C\u002Fstrong> (seuil 1 607 h\u002Fan). Pour les entreprises de ≤ 20 salariés : majoration à \u003Cstrong>+25 %\u003C\u002Fstrong> de 1 596 h à 1 960 h, puis \u003Cstrong>+50 %\u003C\u002Fstrong> au-delà. Pour les entreprises de &gt; 20 salariés : +50 % dès 1 870 h (Avenant n°63, 2007).\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"card-title\">\u003Ci data-lucide=\"sliders-horizontal\">\u003C\u002Fi> Vos données\u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel style=\"margin-bottom:.5rem\">Taille de l'entreprise\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"hs-taille-pills\">\n          \u003Cbutton class=\"pill active\" data-val=\"small\">≤ 20 salariés\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"large\">&gt; 20 salariés\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Taux horaire brut \u003Cspan class=\"val\" id=\"hs-taux-val\">14,50 €\u002Fh\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"hs-taux\" min=\"9\" max=\"50\" step=\"0.5\" value=\"14.5\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Heures travaillées dans l'année \u003Cspan class=\"val\" id=\"hs-heures-val\">1 750 h\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"hs-heures\" min=\"1200\" max=\"2200\" step=\"10\" value=\"1750\">\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Majoration heures supplémentaires\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-main\" id=\"hs-montant\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"hs-detail\">Calcul sur base annualisée\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-rows\" id=\"hs-rows\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- Disclaimer -->\n  \u003Cp class=\"disclaimer\">\n    Calcul indicatif basé sur la CCN de la Poissonnerie IDCC 1504.\n    Source : \u003Ca href=\"https:\u002F\u002Fwww.legifrance.gouv.fr\u002Fconv_coll\u002Fid\u002FKALICONT000005635410\u002F\" target=\"_blank\" rel=\"noopener\">Legifrance\u003C\u002Fa>.\n    Pour validation légale\n    Données salariales : Avenant n°63 (2007) et barème 2025.\n  \u003C\u002Fp>\n\u003C\u002Fmain>\n\n\u003Cscript>\n\u002F\u002F ─── STATE PER TAB ───────────────────────────────────────────\nconst fmt = new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', maximumFractionDigits: 0 });\nconst fmtDec = new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', minimumFractionDigits: 2, maximumFractionDigits: 2 });\n\n\u002F\u002F ─── GRILLE SALARIALE DATA ───────────────────────────────────\nconst grilleData = [\n  { niveau: 1, label: 'I – Employé qualifié', base151: 1831.80 },\n  { niveau: 2, label: 'II – Employé spécialisé', base151: 1898.20 },\n  { niveau: 3, label: 'III – Employé hautement qualifié', base151: 1986.40 },\n  { niveau: 4, label: 'IV – Agent de maîtrise', base151: 2234.90 },\n  { niveau: 5, label: 'V – Agent de maîtrise confirmé', base151: 2583.00 },\n  { niveau: 6, label: 'VI – Cadre', base151: 3251.80 },\n  { niveau: 7, label: 'VII – Cadre supérieur', base151: 4104.62 },\n];\n\n\u002F\u002F ─── INDEMNITÉ ───────────────────────────────────────────────\nconst indState = { salaire: 2500, anciennete: 5, motif: 'economique' };\n\nfunction computeIndemnite(s) {\n  if (s.anciennete \u003C 2) return { montant: 0, insuffisant: true, detail: '' };\n  const anc = s.anciennete;\n  let ind = 0;\n  \u002F\u002F Moins de 5 ans : 1\u002F10 par an\n  const tranche1 = Math.min(anc, 4); \u002F\u002F années 1 à 4\n  const tranche2 = Math.max(0, anc - 4); \u002F\u002F à partir de la 5ème\n  ind = (tranche1 * (s.salaire \u002F 10)) + (tranche2 * (s.salaire \u002F 5));\n  \u002F\u002F Calcul légal pour comparaison\n  const legal1 = Math.min(anc, 10) * (s.salaire \u002F 4);\n  const legal2 = Math.max(0, anc - 10) * (s.salaire \u002F 3);\n  const legal = legal1 + legal2;\n  \u002F\u002F Plus favorable\n  const final = Math.max(ind, legal);\n  return { montant: final, conventionnel: ind, legal, insuffisant: false, detail: `${anc} an(s) d'ancienneté` };\n}\n\nfunction renderIndemnite() {\n  const res = computeIndemnite(indState);\n  const warn = document.getElementById('ind-warning');\n  if (res.insuffisant) {\n    document.getElementById('ind-montant').textContent = '0 €';\n    document.getElementById('ind-detail').textContent = 'Ancienneté \u003C 2 ans — seuil non atteint';\n    document.getElementById('ind-rows').innerHTML = '';\n    warn.style.display = 'block';\n    return;\n  }\n  warn.style.display = 'none';\n  document.getElementById('ind-montant').textContent = fmtDec.format(res.montant);\n  document.getElementById('ind-detail').textContent = res.detail;\n  document.getElementById('ind-rows').innerHTML = `\n    \u003Cdiv class=\"result-row\">\u003Cspan>Indemnité conventionnelle (CCN 1504)\u003C\u002Fspan>\u003Cspan class=\"rr-val\">${fmtDec.format(res.conventionnel)}\u003C\u002Fspan>\u003C\u002Fdiv>\n    \u003Cdiv class=\"result-row\">\u003Cspan>Indemnité légale (L1234-9)\u003C\u002Fspan>\u003Cspan class=\"rr-val\">${fmtDec.format(res.legal)}\u003C\u002Fspan>\u003C\u002Fdiv>\n    \u003Cdiv class=\"result-row\">\u003Cspan>Montant retenu (max. des deux)\u003C\u002Fspan>\u003Cspan class=\"rr-val\">${fmtDec.format(res.montant)}\u003C\u002Fspan>\u003C\u002Fdiv>\n  `;\n}\n\ndocument.getElementById('ind-salaire').addEventListener('input', e => {\n  indState.salaire = +e.target.value;\n  document.getElementById('ind-sal-val').textContent = fmt.format(indState.salaire);\n  renderIndemnite();\n});\ndocument.getElementById('ind-anciennete').addEventListener('input', e => {\n  indState.anciennete = +e.target.value;\n  document.getElementById('ind-anc-val').textContent = indState.anciennete + ' ans';\n  renderIndemnite();\n});\ndocument.getElementById('ind-motif-pills').addEventListener('click', e => {\n  const pill = e.target.closest('[data-val]');\n  if (!pill) return;\n  indState.motif = pill.dataset.val;\n  document.querySelectorAll('#ind-motif-pills .pill').forEach(p => p.classList.toggle('active', p === pill));\n  renderIndemnite();\n});\n\n\u002F\u002F ─── PRÉAVIS ─────────────────────────────────────────────────\nconst preaState = { type: 'licenciement', anciennete: 3, categorie: 'employe' };\n\nfunction computePreavis(s) {\n  if (s.type === 'demission') {\n    return { duree: '3 mois', detail: 'Démission — préavis conventionnel', info: 'Réductible d\\'un commun accord entre les parties' };\n  }\n  if (s.type === 'retraite') {\n    if (s.anciennete \u003C 0.5) return { duree: '1 semaine', detail: 'Mise à la retraite — moins de 6 mois', info: '' };\n    if (s.anciennete \u003C 2) return { duree: '1 mois', detail: 'Mise à la retraite — 6 mois à 2 ans', info: '' };\n    return { duree: '2 mois', detail: 'Mise à la retraite — 2 ans et plus', info: '' };\n  }\n  \u002F\u002F Licenciement\n  if (s.anciennete \u003C 0.5) return { duree: '1 semaine', detail: 'Licenciement — moins de 6 mois', info: '+2 h\u002Fjour rémunérées pour recherche d\\'emploi' };\n  if (s.anciennete \u003C 2) return { duree: '1 mois', detail: 'Licenciement — 6 mois à 2 ans', info: '+2 h\u002Fjour rémunérées pour recherche d\\'emploi' };\n  return { duree: '2 mois', detail: 'Licenciement — 2 ans et plus', info: '+2 h\u002Fjour rémunérées pour recherche d\\'emploi' };\n}\n\nfunction renderPreavis() {\n  const res = computePreavis(preaState);\n  document.getElementById('prea-duree').textContent = res.duree;\n  document.getElementById('prea-detail').textContent = res.detail;\n  document.getElementById('prea-rows').innerHTML = res.info\n    ? `\u003Cdiv class=\"result-row\">\u003Cspan>Avantage CCN\u003C\u002Fspan>\u003Cspan class=\"rr-val\">${res.info}\u003C\u002Fspan>\u003C\u002Fdiv>`\n    : '';\n}\n\ndocument.getElementById('prea-type-pills').addEventListener('click', e => {\n  const pill = e.target.closest('[data-val]');\n  if (!pill) return;\n  preaState.type = pill.dataset.val;\n  document.querySelectorAll('#prea-type-pills .pill').forEach(p => p.classList.toggle('active', p === pill));\n  renderPreavis();\n});\ndocument.getElementById('prea-anciennete').addEventListener('input', e => {\n  preaState.anciennete = +e.target.value;\n  document.getElementById('prea-anc-val').textContent = preaState.anciennete + ' ans';\n  renderPreavis();\n});\ndocument.getElementById('prea-cat-pills').addEventListener('click', e => {\n  const pill = e.target.closest('[data-val]');\n  if (!pill) return;\n  preaState.categorie = pill.dataset.val;\n  document.querySelectorAll('#prea-cat-pills .pill').forEach(p => p.classList.toggle('active', p === pill));\n  renderPreavis();\n});\n\n\u002F\u002F ─── GRILLE SALARIALE ────────────────────────────────────────\nconst grilleState = { niveau: 3, heures: 35 };\n\nfunction computeGrille(s) {\n  const row = grilleData.find(r => r.niveau === s.niveau);\n  if (!row) return { montant: 0, label: '' };\n  const base = row.base151;\n  const montant = base * (s.heures \u002F 35); \u002F\u002F proratisation sur 35h de référence\n  return { montant, label: row.label, base };\n}\n\nfunction renderGrille() {\n  const res = computeGrille(grilleState);\n  document.getElementById('grille-montant').textContent = fmtDec.format(res.montant);\n  document.getElementById('grille-detail').textContent = `Pour ${grilleState.heures} h\u002Fsemaine — ${res.label}`;\n  document.getElementById('grille-rows').innerHTML = `\n    \u003Cdiv class=\"result-row\">\u003Cspan>Salaire de base mensuel (151,67 h)\u003C\u002Fspan>\u003Cspan class=\"rr-val\">${fmtDec.format(res.base)}\u003C\u002Fspan>\u003C\u002Fdiv>\n    \u003Cdiv class=\"result-row\">\u003Cspan>Proratisé à ${grilleState.heures} h\u002Fsem.\u003C\u002Fspan>\u003Cspan class=\"rr-val\">${fmtDec.format(res.montant)}\u003C\u002Fspan>\u003C\u002Fdiv>\n  `;\n  \u002F\u002F Highlight table row\n  document.querySelectorAll('#grille-table tbody tr').forEach((tr, i) => {\n    tr.classList.toggle('selected-row', i + 1 === grilleState.niveau);\n  });\n}\n\ndocument.getElementById('grille-niveau').addEventListener('change', e => {\n  grilleState.niveau = +e.target.value;\n  renderGrille();\n});\ndocument.getElementById('grille-heures').addEventListener('input', e => {\n  grilleState.heures = +e.target.value;\n  document.getElementById('grille-h-val').textContent = grilleState.heures + ' h';\n  renderGrille();\n});\n\n\u002F\u002F ─── PRIME ANCIENNETÉ ────────────────────────────────────────\nconst ancState = { salaire: 2000, anciennete: 5 };\nconst ancBareme = [\n  { min: 3, max: 3, taux: 0.03 },\n  { min: 4, max: 4, taux: 0.04 },\n  { min: 5, max: 6, taux: 0.05 },\n  { min: 7, max: 9, taux: 0.07 },\n  { min: 10, max: 99, taux: 0.10 },\n];\n\nfunction getTauxAnciennete(anc) {\n  if (anc \u003C 3) return 0;\n  for (const b of ancBareme) {\n    if (anc >= b.min && anc \u003C= b.max) return b.taux;\n  }\n  return 0;\n}\n\nfunction computeAnciennete(s) {\n  const taux = getTauxAnciennete(s.anciennete);\n  const montant = s.salaire * taux;\n  return { montant, taux, detail: taux === 0 ? 'Moins de 3 ans — pas de prime' : `${(taux * 100).toFixed(0)} % du salaire de base` };\n}\n\nfunction renderAnciennete() {\n  const res = computeAnciennete(ancState);\n  document.getElementById('anc-montant').textContent = fmtDec.format(res.montant);\n  document.getElementById('anc-detail').textContent = res.detail;\n  document.getElementById('anc-rows').innerHTML = res.taux > 0\n    ? `\u003Cdiv class=\"result-row\">\u003Cspan>Taux appliqué\u003C\u002Fspan>\u003Cspan class=\"rr-val\">${(res.taux * 100).toFixed(0)} %\u003C\u002Fspan>\u003C\u002Fdiv>\n       \u003Cdiv class=\"result-row\">\u003Cspan>Prime mensuelle brute\u003C\u002Fspan>\u003Cspan class=\"rr-val\">${fmtDec.format(res.montant)}\u003C\u002Fspan>\u003C\u002Fdiv>\n       \u003Cdiv class=\"result-row\">\u003Cspan>Prime annuelle (× 12)\u003C\u002Fspan>\u003Cspan class=\"rr-val\">${fmtDec.format(res.montant * 12)}\u003C\u002Fspan>\u003C\u002Fdiv>`\n    : '';\n}\n\ndocument.getElementById('anc-salaire').addEventListener('input', e => {\n  ancState.salaire = +e.target.value;\n  document.getElementById('anc-sal-val').textContent = fmt.format(ancState.salaire);\n  renderAnciennete();\n});\ndocument.getElementById('anc-anciennete').addEventListener('input', e => {\n  ancState.anciennete = +e.target.value;\n  document.getElementById('anc-anc-val').textContent = ancState.anciennete + ' ans';\n  renderAnciennete();\n});\n\n\u002F\u002F ─── PRIME ANNUELLE ──────────────────────────────────────────\nconst panState = { salaire: 2200, mois: 12 };\n\nfunction computePrimeAnnuelle(s) {\n  const annuel = s.salaire * s.mois;\n  const prime = annuel * 0.02;\n  return {\n    montant: prime,\n    juin: prime \u002F 2,\n    dec: prime \u002F 2,\n    annuel,\n    detail: `2 % de ${fmtDec.format(annuel)} brut annuel`\n  };\n}\n\nfunction renderPrimeAnnuelle() {\n  const res = computePrimeAnnuelle(panState);\n  document.getElementById('pan-montant').textContent = fmtDec.format(res.montant);\n  document.getElementById('pan-detail').textContent = res.detail;\n  document.getElementById('pan-rows').innerHTML = `\n    \u003Cdiv class=\"result-row\">\u003Cspan>Versement juin (50 %)\u003C\u002Fspan>\u003Cspan class=\"rr-val\">${fmtDec.format(res.juin)}\u003C\u002Fspan>\u003C\u002Fdiv>\n    \u003Cdiv class=\"result-row\">\u003Cspan>Versement décembre (50 %)\u003C\u002Fspan>\u003Cspan class=\"rr-val\">${fmtDec.format(res.dec)}\u003C\u002Fspan>\u003C\u002Fdiv>\n    \u003Cdiv class=\"result-row\">\u003Cspan>Total annuel\u003C\u002Fspan>\u003Cspan class=\"rr-val\">${fmtDec.format(res.montant)}\u003C\u002Fspan>\u003C\u002Fdiv>\n  `;\n}\n\ndocument.getElementById('pan-salaire').addEventListener('input', e => {\n  panState.salaire = +e.target.value;\n  document.getElementById('pan-sal-val').textContent = fmt.format(panState.salaire);\n  renderPrimeAnnuelle();\n});\ndocument.getElementById('pan-mois').addEventListener('input', e => {\n  panState.mois = +e.target.value;\n  document.getElementById('pan-mois-val').textContent = panState.mois + ' mois';\n  renderPrimeAnnuelle();\n});\n\n\u002F\u002F ─── HEURES SUPP ─────────────────────────────────────────────\nconst hsState = { taille: 'small', taux: 14.5, heures: 1750 };\n\nfunction computeHeuresSupp(s) {\n  const seuil = 1607;\n  let detail = [];\n  let majoration = 0;\n  const heures = s.heures;\n  if (heures \u003C= seuil) {\n    return { majoration: 0, hSup: 0, detail: 'Pas d\\'heures supplémentaires (≤ 1 607 h\u002Fan)', rows: [] };\n  }\n  const hSup = heures - seuil;\n  if (s.taille === 'small') {\n    \u002F\u002F ≤ 20 sal: +25% de 1607 à 1960h (soit 353h max), +50% au-delà\n    const h25 = Math.min(heures, 1960) - seuil;\n    const h50 = Math.max(0, heures - 1960);\n    const m25 = h25 > 0 ? h25 * s.taux * 0.25 : 0;\n    const m50 = h50 > 0 ? h50 * s.taux * 0.50 : 0;\n    majoration = m25 + m50;\n    detail.push(h25 > 0 ? `${h25} h × +25 % = ${fmtDec.format(m25)}` : null);\n    detail.push(h50 > 0 ? `${h50} h × +50 % = ${fmtDec.format(m50)}` : null);\n    return {\n      majoration, hSup,\n      detail: `${hSup} h sup. — entreprise ≤ 20 sal.`,\n      rows: detail.filter(Boolean)\n    };\n  } else {\n    \u002F\u002F > 20 sal: +50% dès 1870h (selon interprétation CCN)\n    const seuilGrande = 1870;\n    if (heures \u003C= seuilGrande) {\n      \u002F\u002F Heures entre 1607 et 1870 : taux légal standard +25% \u002F +50%\n      const h25 = Math.min(heures, seuil + 8 * 52) - seuil; \u002F\u002F 8 premières heures hebdo\n      const h50eff = Math.max(0, heures - (seuil + 8 * 52));\n      const m25 = Math.max(0, h25) * s.taux * 0.25;\n      const m50 = h50eff * s.taux * 0.50;\n      majoration = m25 + m50;\n      detail.push(h25 > 0 ? `${h25.toFixed(0)} h × +25 %` : null);\n      detail.push(h50eff > 0 ? `${h50eff.toFixed(0)} h × +50 %` : null);\n    } else {\n      \u002F\u002F Au-delà de 1870h : tout à +50%\n      const hAll = heures - seuil;\n      majoration = hAll * s.taux * 0.50;\n      detail.push(`${hAll} h × +50 % = ${fmtDec.format(majoration)}`);\n    }\n    return {\n      majoration, hSup,\n      detail: `${hSup} h sup. — entreprise > 20 sal.`,\n      rows: detail.filter(Boolean)\n    };\n  }\n}\n\nfunction renderHeuresSupp() {\n  const res = computeHeuresSupp(hsState);\n  document.getElementById('hs-montant').textContent = fmtDec.format(res.majoration);\n  document.getElementById('hs-detail').textContent = res.detail;\n  document.getElementById('hs-rows').innerHTML = [\n    res.rows.map(r => `\u003Cdiv class=\"result-row\">\u003Cspan>${r}\u003C\u002Fspan>\u003C\u002Fdiv>`).join(''),\n    `\u003Cdiv class=\"result-row\">\u003Cspan>Total majorations annuelles\u003C\u002Fspan>\u003Cspan class=\"rr-val\">${fmtDec.format(res.majoration)}\u003C\u002Fspan>\u003C\u002Fdiv>`\n  ].join('');\n}\n\ndocument.getElementById('hs-taille-pills').addEventListener('click', e => {\n  const pill = e.target.closest('[data-val]');\n  if (!pill) return;\n  hsState.taille = pill.dataset.val;\n  document.querySelectorAll('#hs-taille-pills .pill').forEach(p => p.classList.toggle('active', p === pill));\n  renderHeuresSupp();\n});\ndocument.getElementById('hs-taux').addEventListener('input', e => {\n  hsState.taux = +e.target.value;\n  document.getElementById('hs-taux-val').textContent = e.target.value + ' €\u002Fh';\n  renderHeuresSupp();\n});\ndocument.getElementById('hs-heures').addEventListener('input', e => {\n  hsState.heures = +e.target.value;\n  document.getElementById('hs-heures-val').textContent = (+e.target.value).toLocaleString('fr-FR') + ' h';\n  renderHeuresSupp();\n});\n\n\u002F\u002F ─── TABS LOGIC ──────────────────────────────────────────────\nconst tabBtns = document.querySelectorAll('[data-tab]');\nconst tabPanels = document.querySelectorAll('[data-panel]');\n\nfunction activate(id) {\n  tabBtns.forEach(t => t.classList.toggle('active', t.dataset.tab === id));\n  tabPanels.forEach(p => {\n    const isActive = p.dataset.panel === id;\n    p.classList.toggle('active', isActive);\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\ntabBtns.forEach(t => t.addEventListener('click', () => activate(t.dataset.tab)));\n\n\u002F\u002F ─── RESIZE OBSERVER ────────────────────────────────────────\nconst ro = new ResizeObserver(() => {\n  const h = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);\n  parent.postMessage({ type: 'resize', height: h }, '*');\n});\nro.observe(document.documentElement);\n\n\u002F\u002F ─── INIT ────────────────────────────────────────────────────\ndocument.addEventListener('DOMContentLoaded', () => {\n  lucide.createIcons();\n  \u002F\u002F Activate initial 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 initialTab = validTabs.includes(hashTab) ? hashTab : validTabs[0];\n  activate(initialTab);\n  \u002F\u002F Initial renders\n  renderIndemnite();\n  renderPreavis();\n  renderGrille();\n  renderAnciennete();\n  renderPrimeAnnuelle();\n  renderHeuresSupp();\n});\n\u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","generated","juridique","consumer","both","https:\u002F\u002Fpub-bdebbd2dad294475a2da0eb657815b6b.r2.dev\u002Ftools\u002Fccn-poissonnerie-5e6d7987b9.webp",[]]