[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"footer-root-categories-fr-FR":3,"tool-content-ccn-pour-les-industries-de-produits-alimentaires-elabores-fr":83,"footer-cities-fr":157},[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":130,"tool_html":151,"source":152,"category":153,"audience":154,"publish_mode":155,"hero_image":156,"hero_image_alt":85},"ccn-pour-les-industries-de-produits-alimentaires-elabores","CCN Industries de produits alimentaires élaborés — calculateur complet","Calculateur CCN Industries de produits alimentaires élaborés IDCC 1396 | Expert Zoom","Outil interactif couvrant indemnité de licenciement, préavis, grille salariale, prime annuelle, congés payés et heures supplémentaires de la CCN des industries de produits alimentaires élaborés (IDCC 1396).","Ce calculateur couvre les 6 fonctions clés de la convention collective nationale des industries de produits alimentaires élaborés (IDCC 1396) : indemnité de licenciement (formule progressive cadres art. 12), préavis par catégorie (art. 11 et 26), grille de salaires minima 2025 (accord n° 119), prime annuelle obligatoire (art. 19 et 41), congés payés avec jours d'ancienneté (art. 32), et majorations heures supplémentaires (art. 38).",[90,109],{"name":91,"@type":92,"about":93,"author":97,"@context":100,"isPartOf":101,"inLanguage":104,"description":105,"operatingSystem":106,"applicationCategory":107,"isAccessibleForFree":108},"Calculateur CCN Industries de Produits Alimentaires Élaborés — IDCC 1396","WebApplication",{"name":94,"@type":95,"identifier":96},"Convention collective nationale pour les industries de produits alimentaires élaborés","Thing","IDCC 1396",{"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 annuelle, les congés payés et les heures supplémentaires de la convention collective des industries de produits alimentaires élaborés (IDCC 1396).","All","FinanceApplication",true,{"@type":110,"@context":100,"mainEntity":111},"FAQPage",[112,118,122,126],{"name":113,"@type":114,"acceptedAnswer":115},"Comment calculer l'indemnité de licenciement dans la convention collective des industries de produits alimentaires élaborés (IDCC 1396) ?","Question",{"text":116,"@type":117},"Pour les ingénieurs et cadres, la CCN IDCC 1396 prévoit une formule progressive : 2\u002F10 de mois par année pour les 5 premières années, 3\u002F10 pour les années 5 à 10, 4\u002F10 pour les années 10 à 20, et 5\u002F10 au-delà de 20 ans (art. 12). Pour les ouvriers, employés et TAM, la formule est identique au barème légal L1234-9.","Answer",{"name":119,"@type":114,"acceptedAnswer":120},"Quelle est la durée du préavis dans la convention collective IDCC 1396 ?",{"text":121,"@type":117},"Ouvriers et employés : 1 mois (\u003C 2 ans) ou 2 mois (≥ 2 ans). TAM : 2 mois. Ingénieurs et cadres : minimum 3 mois (art. 11 CCN 1396).",{"name":123,"@type":114,"acceptedAnswer":124},"Y a-t-il une prime de 13ème mois obligatoire dans la CCN IDCC 1396 ?",{"text":125,"@type":117},"Oui. La CCN IDCC 1396 impose une prime annuelle égale à 100 % du salaire mensuel de base sous condition d'un an d'ancienneté (art. 19 et 41), proratisée selon le temps de présence réel.",{"name":127,"@type":114,"acceptedAnswer":128},"Qui est couvert par la convention collective IDCC 1396 ?",{"text":129,"@type":117},"La CCN IDCC 1396 couvre les salariés des entreprises de fabrication de produits alimentaires élaborés (conserves, plats préparés, surgelés…) en France, soit environ 46 500 salariés dans plus de 1 000 entreprises.",[131,133,135,138,140,143,146,148],{"a":132,"q":113},"Pour les ingénieurs et cadres, la CCN IDCC 1396 prévoit une formule progressive plus favorable que le code du travail : 2\u002F10 de mois de salaire par année pour les 5 premières années, 3\u002F10 pour les années 5 à 10, 4\u002F10 pour les années 10 à 20, et 5\u002F10 au-delà de 20 ans (art. 12). Pour les ouvriers, employés et TAM, la formule est identique au barème légal : 1\u002F4 de mois par année jusqu'à 10 ans et 1\u002F3 au-delà (art. 29).",{"a":134,"q":119},"La CCN IDCC 1396 fixe des préavis par catégorie : ouvriers et employés avec moins de 2 ans d'ancienneté = 1 mois, avec 2 ans et plus = 2 mois ; techniciens et agents de maîtrise (TAM) = 2 mois quelle que soit l'ancienneté ; ingénieurs et cadres = minimum 3 mois (art. 11). Les cadres qui retrouvent un emploi avant la fin du préavis peuvent partir sans pénalité.",{"a":136,"q":137},"L'accord n° 119 du 24 janvier 2025 fixe les salaires minima conventionnels à compter du 1er janvier 2025, pour des coefficients allant de 350 à 700 (base 151,67 h\u002Fmois — 35 h\u002Fsemaine). Le minimum de la grille démarre à environ 1 843 € brut mensuel pour le coefficient 350 (niveau I) et dépasse 3 200 € pour le coefficient 700 (niveau VII — ingénieurs et cadres supérieurs).","Quelle est la grille de salaires minima de la convention collective des produits alimentaires élaborés en 2025 ?",{"a":139,"q":123},"Oui. La CCN IDCC 1396 prévoit une prime annuelle obligatoire équivalente à 100 % du salaire mensuel de base (hors heures supplémentaires exceptionnelles), sous condition d'un an d'ancienneté (art. 19 pour les cadres, art. 41 dispositions générales). Elle est proratisée en fonction du temps de présence réel sur la période de référence. Elle ne se cumule pas avec d'autres primes annuelles si leur total est au moins égal au montant conventionnel.",{"a":141,"q":142},"Oui. En plus des 30 jours ouvrables légaux, l'article 32 de la CCN IDCC 1396 prévoit jusqu'à 2 jours ouvrables supplémentaires liés à l'ancienneté : 1 jour à partir de 5 ans d'ancienneté et 2 jours à partir de 10 ans. Ces jours d'ancienneté peuvent être pris en dehors de la période principale de congés payés.","La convention collective IDCC 1396 accorde-t-elle des congés supplémentaires ?",{"a":144,"q":145},"L'article 38 de la CCN IDCC 1396 permet de remplacer la majoration salariale par un repos compensateur : 1h15 de repos par heure supplémentaire pour les heures de la 36e à la 43e, et 1h30 par heure au-delà de la 43e heure. En cas de paiement, les taux légaux s'appliquent (+25 % \u002F +50 %). Les heures exceptionnelles (nuit normale : +25 %, nuit exceptionnelle, dimanche et jours fériés : +50 %) s'ajoutent à ces majorations.","Comment sont majorées les heures supplémentaires dans la CCN des industries de produits alimentaires élaborés ?",{"a":147,"q":127},"La convention collective nationale des industries de produits alimentaires élaborés (IDCC 1396) couvre les entreprises fabricant des produits alimentaires transformés ou préparés en France (conserves, plats préparés, produits surgelés, etc.) — environ 46 500 salariés répartis dans plus de 1 000 entreprises. Elle s'applique aux ouvriers, employés, techniciens et agents de maîtrise (TAM), ingénieurs et cadres.",{"a":149,"q":150},"La convention collective nationale pour les industries de produits alimentaires élaborés est identifiée par le numéro IDCC 1396 et la brochure JO n° 3127. Son identifiant Legifrance est KALICONT000005635840. Elle a été signée le 17 janvier 1952, mise à jour par accord du 22 octobre 1985 et étendue par arrêté du 16 avril 1986.","Quelle est la référence officielle de la convention collective des produits alimentaires élaborés ?","\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 Industries de Produits Alimentaires Élaborés — IDCC 1396\u003C\u002Ftitle>\n  \u003Cscript src=\"https:\u002F\u002Funpkg.com\u002Flucide@latest\u002Fdist\u002Fumd\u002Flucide.min.js\">\u003C\u002Fscript>\n  \u003Cstyle>\n    \u002F* Design tokens *\u002F\n    :root {\n      --bg: #fafaf9;\n      --surface: #ffffff;\n      --border: #e7e5e4;\n      --accent: #2563eb;\n      --accent-light: #dbeafe;\n      --accent-dark: #1d4ed8;\n      --text: #1c1917;\n      --text-muted: #78716c;\n      --success: #16a34a;\n      --success-bg: #f0fdf4;\n      --info-bg: #eff6ff;\n      --info-border: #bfdbfe;\n      --radius: 0.75rem;\n      --radius-sm: 0.375rem;\n      --shadow: 0 1px 3px rgba(0,0,0,0.1), 0 1px 2px rgba(0,0,0,0.06);\n    }\n\n    * { box-sizing: border-box; margin: 0; padding: 0; }\n\n    body {\n      font-family: system-ui, -apple-system, sans-serif;\n      background: var(--bg);\n      color: var(--text);\n      font-size: 15px;\n      line-height: 1.5;\n    }\n\n    .tool-root {\n      max-width: 720px;\n      margin: 0 auto;\n      padding: 1.25rem 1rem 2rem;\n    }\n\n    \u002F* Header *\u002F\n    .tool-header {\n      margin-bottom: 1.25rem;\n    }\n    .tool-header h1 {\n      font-size: 1.125rem;\n      font-weight: 700;\n      color: var(--text);\n      margin-bottom: 0.25rem;\n    }\n    .tool-header .idcc-badge {\n      display: inline-flex;\n      align-items: center;\n      gap: 0.35rem;\n      background: var(--accent-light);\n      color: var(--accent);\n      font-size: 0.75rem;\n      font-weight: 600;\n      padding: 0.2rem 0.6rem;\n      border-radius: 9999px;\n    }\n\n    \u002F* Tabs *\u002F\n    .tabs-nav {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 0.25rem;\n      border-bottom: 2px solid var(--border);\n      margin-bottom: 1.25rem;\n    }\n    .tab-btn {\n      display: flex;\n      align-items: center;\n      gap: 0.35rem;\n      padding: 0.5rem 0.85rem;\n      font-size: 0.8125rem;\n      font-weight: 600;\n      color: var(--text-muted);\n      background: none;\n      border: none;\n      border-bottom: 2px solid transparent;\n      margin-bottom: -2px;\n      cursor: pointer;\n      border-radius: var(--radius-sm) var(--radius-sm) 0 0;\n      transition: color 0.15s, border-color 0.15s, background 0.15s;\n    }\n    .tab-btn:hover { color: var(--accent); background: var(--accent-light); }\n    .tab-btn.active { color: var(--accent); border-bottom-color: var(--accent); }\n    .tab-btn i { width: 14px; height: 14px; }\n\n    \u002F* Panels *\u002F\n    .tab-panel { display: none; }\n    .tab-panel.visible { display: block; }\n\n    \u002F* Rule callout *\u002F\n    .rule-callout {\n      display: flex;\n      gap: 0.75rem;\n      align-items: flex-start;\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 i { color: var(--accent); flex-shrink: 0; margin-top: 0.1rem; width: 18px; height: 18px; }\n    .rule-callout p { font-size: 0.875rem; color: var(--text); }\n    .rule-callout strong { color: var(--accent-dark); }\n\n    \u002F* Form *\u002F\n    .form-grid {\n      display: grid;\n      grid-template-columns: 1fr 1fr;\n      gap: 1rem;\n      margin-bottom: 1.25rem;\n    }\n    @media (max-width: 480px) { .form-grid { grid-template-columns: 1fr; } }\n\n    .form-field { display: flex; flex-direction: column; gap: 0.375rem; }\n    .form-field.full { grid-column: 1 \u002F -1; }\n\n    label {\n      font-size: 0.8125rem;\n      font-weight: 600;\n      color: var(--text);\n    }\n    .value-display {\n      font-size: 0.75rem;\n      color: var(--accent);\n      font-weight: 700;\n      font-variant-numeric: tabular-nums;\n    }\n\n    input[type=\"range\"] {\n      width: 100%;\n      accent-color: var(--accent);\n      height: 6px;\n      cursor: pointer;\n    }\n\n    select {\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(--surface);\n      color: var(--text);\n      cursor: pointer;\n      width: 100%;\n    }\n\n    \u002F* Pills *\u002F\n    .pills { display: flex; flex-wrap: wrap; gap: 0.4rem; }\n    .pill {\n      padding: 0.3rem 0.75rem;\n      border: 1px solid var(--border);\n      border-radius: 9999px;\n      font-size: 0.8rem;\n      font-weight: 500;\n      cursor: pointer;\n      background: var(--surface);\n      color: var(--text-muted);\n      transition: all 0.15s;\n    }\n    .pill.active {\n      background: var(--accent);\n      border-color: var(--accent);\n      color: white;\n    }\n\n    \u002F* Toggle *\u002F\n    .toggle-group { display: flex; gap: 0.375rem; }\n    .toggle-btn {\n      flex: 1;\n      padding: 0.45rem 0.5rem;\n      border: 1px solid var(--border);\n      border-radius: var(--radius-sm);\n      font-size: 0.8rem;\n      font-weight: 500;\n      cursor: pointer;\n      background: var(--surface);\n      color: var(--text-muted);\n      text-align: center;\n      transition: all 0.15s;\n    }\n    .toggle-btn.active {\n      background: var(--accent);\n      border-color: var(--accent);\n      color: white;\n      font-weight: 700;\n    }\n\n    \u002F* Result card *\u002F\n    .result-card {\n      background: var(--surface);\n      border: 1px solid var(--border);\n      border-radius: var(--radius);\n      padding: 1.25rem 1.5rem;\n      box-shadow: var(--shadow);\n      margin-bottom: 1rem;\n    }\n    .result-card .result-label {\n      font-size: 0.75rem;\n      font-weight: 600;\n      color: var(--text-muted);\n      text-transform: uppercase;\n      letter-spacing: 0.05em;\n      margin-bottom: 0.375rem;\n    }\n    .result-card .result-value {\n      font-size: 2rem;\n      font-weight: 800;\n      color: var(--accent);\n      font-variant-numeric: tabular-nums;\n      line-height: 1;\n      margin-bottom: 0.5rem;\n    }\n    .result-card .result-detail {\n      font-size: 0.8125rem;\n      color: var(--text-muted);\n    }\n\n    .result-breakdown {\n      margin-top: 0.75rem;\n      padding-top: 0.75rem;\n      border-top: 1px solid var(--border);\n      display: flex;\n      flex-direction: column;\n      gap: 0.25rem;\n    }\n    .breakdown-row {\n      display: flex;\n      justify-content: space-between;\n      font-size: 0.8125rem;\n    }\n    .breakdown-row span:first-child { color: var(--text-muted); }\n    .breakdown-row span:last-child { font-weight: 600; font-variant-numeric: tabular-nums; }\n\n    \u002F* Disclaimer *\u002F\n    .disclaimer {\n      font-size: 0.75rem;\n      color: var(--text-muted);\n      border-top: 1px solid var(--border);\n      padding-top: 1rem;\n      margin-top: 1rem;\n    }\n    .disclaimer a { color: var(--accent); text-decoration: none; }\n    .disclaimer a:hover { text-decoration: underline; }\n\n    \u002F* Salary table *\u002F\n    .salary-table {\n      width: 100%;\n      border-collapse: collapse;\n      font-size: 0.8125rem;\n      margin-top: 0.5rem;\n    }\n    .salary-table th {\n      background: var(--accent-light);\n      color: var(--accent-dark);\n      font-weight: 700;\n      padding: 0.4rem 0.6rem;\n      text-align: left;\n      font-size: 0.75rem;\n    }\n    .salary-table td {\n      padding: 0.35rem 0.6rem;\n      border-bottom: 1px solid var(--border);\n    }\n    .salary-table tr:last-child td { border-bottom: none; }\n    .salary-table tr:nth-child(even) td { background: var(--bg); }\n    .salary-table .highlight td { font-weight: 700; color: var(--accent); background: var(--accent-light) !important; }\n  \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody>\n\u003C!-- CCN IDCC 1396 — deviations\n     indemnite: L1234-9 → formule progressive cadres (2\u002F10+3\u002F10+4\u002F10+5\u002F10 selon ancienneté) (source: Article 12 CCN)\n     indemnite ouvriers: formule identique au légal (source: Article 29 CCN)\n     preavis: L1234-1 → ouvriers\u002Femployés 1-2 mois, TAM 2 mois, cadres min 3 mois (source: Articles 11, 26 CCN)\n     salaire-min: grille coefficients 350-700, accord n°116 (01\u002F01\u002F2024), accord n°119 (01\u002F01\u002F2025) (source: Article 17, accords salariaux)\n     prime-annuelle: L pas d'obligation légale → prime annuelle obligatoire = 100% salaire mensuel (source: Articles 19, 41 CCN)\n     conges: L3141-3 → +2 jours max pour ancienneté (source: Article 32 CCN)\n     heures-supp: L3121-36 → repos compensateur 1h15\u002F1h30, majorations exceptionnelles +50% nuit\u002Fdimanche\u002Ffériés (source: Article 38 CCN) -->\n\n\u003Cmain class=\"tool-root\">\n  \u003Cdiv class=\"tool-header\">\n    \u003Ch1>Convention collective — Industries de produits alimentaires élaborés\u003C\u002Fh1>\n    \u003Cspan class=\"idcc-badge\">\n      \u003Ci data-lucide=\"badge-check\">\u003C\u002Fi>\n      IDCC 1396\n    \u003C\u002Fspan>\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=\"calculator\">\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=\"banknote\">\u003C\u002Fi> Salaires min.\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=\"conges\" role=\"tab\">\n      \u003Ci data-lucide=\"calendar\">\u003C\u002Fi> Congés\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"heures-supp\" role=\"tab\">\n      \u003Ci data-lucide=\"timer\">\u003C\u002Fi> H. supp.\n    \u003C\u002Fbutton>\n  \u003C\u002Fnav>\n\n  \u003C!-- ===== INDEMNITÉ DE LICENCIEMENT ===== -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"indemnite\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>Pour les \u003Cstrong>ingénieurs et cadres\u003C\u002Fstrong>, la CCN IDCC 1396 prévoit une formule progressive plus favorable : \u003Cstrong>2\u002F10 × années 1–5 ans, 3\u002F10 × années 5–10 ans, 4\u002F10 × années 10–20 ans, 5\u002F10 × années au-delà de 20 ans\u003C\u002Fstrong> (art. 12). Pour les \u003Cstrong>ouvriers et employés\u003C\u002Fstrong>, la formule est identique au code du travail (art. 29).\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"form-field\">\n        \u003Clabel>Catégorie professionnelle\u003C\u002Flabel>\n        \u003Cdiv class=\"toggle-group\">\n          \u003Cbutton class=\"toggle-btn active\" data-ind-cat=\"cadre\">Cadre \u002F IC\u003C\u002Fbutton>\n          \u003Cbutton class=\"toggle-btn\" data-ind-cat=\"ouvrier\">Ouvrier \u002F Employé \u002F TAM\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-field\">\n        \u003Clabel>Motif de rupture\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\">\n          \u003Cbutton class=\"pill active\" data-ind-motif=\"licenciement\">Licenciement\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-ind-motif=\"rupture-conv\">Rupture conv.\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-field\">\n        \u003Clabel>\n          Salaire brut mensuel de référence\n          \u003Cspan class=\"value-display\" id=\"ind-salaire-display\">3 000 €\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"ind-salaire\" min=\"1500\" max=\"8000\" step=\"50\" value=\"3000\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-field\">\n        \u003Clabel>\n          Ancienneté\n          \u003Cspan class=\"value-display\" id=\"ind-anc-display\">8 ans\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"ind-anc\" min=\"1\" max=\"40\" step=\"1\" value=\"8\">\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\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-amount\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"ind-detail\">\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-breakdown\" id=\"ind-breakdown\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===== PRÉAVIS ===== -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"preavis\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN IDCC 1396 fixe des durées de préavis spécifiques par catégorie : \u003Cstrong>ouvriers\u002Femployés 1 à 2 mois, TAM 2 mois, ingénieurs et cadres minimum 3 mois\u003C\u002Fstrong> (art. 11 et 26). Les cadres qui retrouvent un emploi peuvent quitter le poste sans indemnité avant la fin du préavis.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"form-field full\">\n        \u003Clabel>Catégorie professionnelle\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\">\n          \u003Cbutton class=\"pill active\" data-pv-cat=\"ouvrier\">Ouvrier \u002F Employé\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-pv-cat=\"tam\">TAM\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-pv-cat=\"cadre\">Ingénieur \u002F Cadre\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-field full\" id=\"pv-anc-field\">\n        \u003Clabel>\n          Ancienneté\n          \u003Cspan class=\"value-display\" id=\"pv-anc-display\">3 ans\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"pv-anc\" min=\"0\" max=\"30\" step=\"1\" value=\"3\">\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Durée du préavis\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"pv-duration\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"pv-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===== SALAIRES MINIMUM ===== -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"salaire-min\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN IDCC 1396 publie une \u003Cstrong>grille salariale\u003C\u002Fstrong> par coefficient (350 à 700), mise à jour annuellement par accord. L'accord n° 119 du 24 janvier 2025 fixe les minima au \u003Cstrong>1er janvier 2025\u003C\u002Fstrong>. Tous les salaires sont basés sur 151,67 h\u002Fmois (35 h\u002Fsemaine).\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"form-field\">\n        \u003Clabel>Catégorie\u003C\u002Flabel>\n        \u003Cselect id=\"sm-categorie\">\n          \u003Coption value=\"oe\">Ouvriers \u002F Employés\u003C\u002Foption>\n          \u003Coption value=\"tam\">Techniciens \u002F AM\u003C\u002Foption>\n          \u003Coption value=\"ic\">Ingénieurs \u002F Cadres\u003C\u002Foption>\n        \u003C\u002Fselect>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-field\">\n        \u003Clabel>\n          Heures hebdomadaires\n          \u003Cspan class=\"value-display\" id=\"sm-heures-display\">35 h\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"sm-heures\" min=\"24\" max=\"48\" step=\"0.5\" value=\"35\">\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv id=\"sm-table-container\">\u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Salaire minimum conventionnel (base 35h)\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"sm-amount\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"sm-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===== PRIME ANNUELLE ===== -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"prime-annuelle\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN IDCC 1396 impose une \u003Cstrong>prime annuelle obligatoire\u003C\u002Fstrong> équivalente à \u003Cstrong>100 % du salaire mensuel de base\u003C\u002Fstrong> (novembre hors heures supp.), sous condition d'1 an d'ancienneté (art. 19 pour cadres, art. 41 dispositions générales). Elle est proratisée selon le temps de travail réel.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"form-field\">\n        \u003Clabel>\n          Salaire brut mensuel de base\n          \u003Cspan class=\"value-display\" id=\"pa-salaire-display\">2 800 €\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"pa-salaire\" min=\"1500\" max=\"8000\" step=\"50\" value=\"2800\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-field\">\n        \u003Clabel>\n          Ancienneté (mois d'activité sur 12)\n          \u003Cspan class=\"value-display\" id=\"pa-mois-display\">12 mois\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"pa-mois\" min=\"1\" max=\"12\" step=\"1\" value=\"12\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-field full\">\n        \u003Clabel>Situation\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\">\n          \u003Cbutton class=\"pill active\" data-pa-situation=\"plein\">Temps plein\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-pa-situation=\"partiel\">Temps partiel\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-field\" id=\"pa-partiel-field\" style=\"display:none\">\n        \u003Clabel>\n          Quotité temps partiel\n          \u003Cspan class=\"value-display\" id=\"pa-quotite-display\">80 %\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"pa-quotite\" min=\"20\" max=\"99\" step=\"1\" value=\"80\">\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Prime annuelle estimée\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"pa-amount\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"pa-detail\">\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-breakdown\" id=\"pa-breakdown\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===== CONGÉS PAYÉS ===== -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"conges\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN IDCC 1396 accorde les \u003Cstrong>30 jours ouvrables légaux\u003C\u002Fstrong> + jusqu'à \u003Cstrong>2 jours supplémentaires\u003C\u002Fstrong> liés à l'ancienneté (art. 32). Ces jours d'ancienneté peuvent être pris en dehors de la période principale de congés.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"form-field\">\n        \u003Clabel>\n          Ancienneté dans l'entreprise\n          \u003Cspan class=\"value-display\" id=\"cg-anc-display\">5 ans\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"cg-anc\" min=\"0\" max=\"40\" step=\"1\" value=\"5\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-field\">\n        \u003Clabel>\n          Mois de travail effectif (période de référence)\n          \u003Cspan class=\"value-display\" id=\"cg-mois-display\">12 mois\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"cg-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\">Jours de congés payés annuels\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"cg-total\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"cg-detail\">\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-breakdown\" id=\"cg-breakdown\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===== HEURES SUPPLÉMENTAIRES ===== -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"heures-supp\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN IDCC 1396 peut substituer un \u003Cstrong>repos compensateur\u003C\u002Fstrong> à la majoration salariale : \u003Cstrong>1h15 de repos par heure supp. (36e–43e h)\u003C\u002Fstrong> et \u003Cstrong>1h30 au-delà de la 43e h\u003C\u002Fstrong> (art. 38). Les heures exceptionnelles (nuit, dimanche, jours fériés) bénéficient d'une majoration de \u003Cstrong>+50 %\u003C\u002Fstrong>.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"form-field\">\n        \u003Clabel>\n          Salaire brut horaire\n          \u003Cspan class=\"value-display\" id=\"hs-taux-display\">18,00 €\u002Fh\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"hs-taux\" min=\"10\" max=\"80\" step=\"0.5\" value=\"18\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-field\">\n        \u003Clabel>Mode de compensation\u003C\u002Flabel>\n        \u003Cdiv class=\"toggle-group\">\n          \u003Cbutton class=\"toggle-btn active\" data-hs-mode=\"salaire\">Majoration salaire\u003C\u002Fbutton>\n          \u003Cbutton class=\"toggle-btn\" data-hs-mode=\"repos\">Repos compensateur\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-field\">\n        \u003Clabel>\n          Heures supp. tranche 1 (36e–43e h)\n          \u003Cspan class=\"value-display\" id=\"hs-t1-display\">5 h\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"hs-t1\" min=\"0\" max=\"8\" step=\"0.5\" value=\"5\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-field\">\n        \u003Clabel>\n          Heures supp. tranche 2 (au-delà 43e h)\n          \u003Cspan class=\"value-display\" id=\"hs-t2-display\">0 h\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"hs-t2\" min=\"0\" max=\"20\" step=\"0.5\" value=\"0\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-field full\">\n        \u003Clabel>Heures exceptionnelles (nuit \u002F dimanche \u002F féries)\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\">\n          \u003Cbutton class=\"pill active\" data-hs-exc=\"non\">Aucune\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-hs-exc=\"nuit\">Nuit normale (+25 %)\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-hs-exc=\"exc\">Nuit\u002Fdim.\u002Fférie exceptionnel (+50 %)\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-field\" id=\"hs-exc-hours-field\" style=\"display:none\">\n        \u003Clabel>\n          Heures exceptionnelles\n          \u003Cspan class=\"value-display\" id=\"hs-exc-h-display\">2 h\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"hs-exc-h\" min=\"0.5\" max=\"20\" step=\"0.5\" value=\"2\">\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\" id=\"hs-result-label\">Coût total heures supplémentaires\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"hs-amount\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"hs-detail\">\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-breakdown\" id=\"hs-breakdown\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003Cp class=\"disclaimer\">\n    Calcul indicatif basé sur la CCN IDCC 1396 — Industries de produits alimentaires élaborés.\n    Source : \u003Ca href=\"https:\u002F\u002Fwww.legifrance.gouv.fr\u002Fconv_coll\u002Fid\u002FKALICONT000005635840\u002F\" target=\"_blank\" rel=\"noopener\">Legifrance (KALICONT000005635840)\u003C\u002Fa>.\n    Pour validation légale\n  \u003C\u002Fp>\n\u003C\u002Fmain>\n\n\u003Cscript>\n  \u002F\u002F ---- State ----\n  const state = {\n    ind: { salaire: 3000, anc: 8, cat: 'cadre', motif: 'licenciement' },\n    pv: { cat: 'ouvrier', anc: 3 },\n    sm: { categorie: 'oe', heures: 35 },\n    pa: { salaire: 2800, mois: 12, situation: 'plein', quotite: 80 },\n    cg: { anc: 5, mois: 12 },\n    hs: { taux: 18, mode: 'salaire', t1: 5, t2: 0, exc: 'non', excH: 2 }\n  };\n\n  \u002F\u002F ---- Formatters ----\n  const fmtEUR = new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', maximumFractionDigits: 0 });\n  const fmtEURd = new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', minimumFractionDigits: 2, maximumFractionDigits: 2 });\n\n  \u002F\u002F ---- Grille salaires (accord n°119 \u002F jan 2025, indicatif) ----\n  const salaryGrid = {\n    oe: [\n      { coeff: 350, label: 'Niveau I – Échelon 1', min2025: 1843 },\n      { coeff: 370, label: 'Niveau I – Échelon 2', min2025: 1862 },\n      { coeff: 390, label: 'Niveau II – Échelon 1', min2025: 1895 },\n      { coeff: 410, label: 'Niveau II – Échelon 2', min2025: 1932 },\n      { coeff: 430, label: 'Niveau III – Échelon 1', min2025: 1978 },\n      { coeff: 455, label: 'Niveau III – Échelon 2', min2025: 2035 },\n    ],\n    tam: [\n      { coeff: 480, label: 'Niveau IV – Échelon 1', min2025: 2120 },\n      { coeff: 510, label: 'Niveau IV – Échelon 2', min2025: 2198 },\n      { coeff: 545, label: 'Niveau V – Échelon 1', min2025: 2302 },\n      { coeff: 580, label: 'Niveau V – Échelon 2', min2025: 2415 },\n    ],\n    ic: [\n      { coeff: 615, label: 'Niveau VI – Échelon 1', min2025: 2680 },\n      { coeff: 650, label: 'Niveau VI – Échelon 2', min2025: 2890 },\n      { coeff: 700, label: 'Niveau VII', min2025: 3210 },\n    ]\n  };\n\n  \u002F\u002F ---- Compute functions ----\n  function computeInd() {\n    const { salaire, anc, cat, motif } = state.ind;\n    let amount = 0;\n    let detail = '';\n    let breakdown = [];\n\n    if (cat === 'cadre') {\n      \u002F\u002F Art. 12 CCN : progressive formula\n      const s1 = Math.min(anc, 5);\n      const s2 = Math.max(0, Math.min(anc, 10) - 5);\n      const s3 = Math.max(0, Math.min(anc, 20) - 10);\n      const s4 = Math.max(0, anc - 20);\n\n      const a1 = s1 * 0.2 * salaire;\n      const a2 = s2 * 0.3 * salaire;\n      const a3 = s3 * 0.4 * salaire;\n      const a4 = s4 * 0.5 * salaire;\n      amount = a1 + a2 + a3 + a4;\n\n      if (s1 > 0) breakdown.push({ label: `${s1} an(s) × 2\u002F10 = ${(s1 * 0.2).toFixed(2)} mois`, value: fmtEUR.format(a1) });\n      if (s2 > 0) breakdown.push({ label: `${s2} an(s) × 3\u002F10 = ${(s2 * 0.3).toFixed(2)} mois`, value: fmtEUR.format(a2) });\n      if (s3 > 0) breakdown.push({ label: `${s3} an(s) × 4\u002F10 = ${(s3 * 0.4).toFixed(2)} mois`, value: fmtEUR.format(a3) });\n      if (s4 > 0) breakdown.push({ label: `${s4} an(s) × 5\u002F10 = ${(s4 * 0.5).toFixed(2)} mois`, value: fmtEUR.format(a4) });\n\n      detail = `Art. 12 CCN 1396 — formule progressive cadres, ${anc} an(s) d'ancienneté`;\n    } else {\n      \u002F\u002F Art. 29 = legal baseline\n      const tranche1 = Math.min(anc, 10);\n      const tranche2 = Math.max(0, anc - 10);\n      const a1 = tranche1 * (1 \u002F 4) * salaire;\n      const a2 = tranche2 * (1 \u002F 3) * salaire;\n      amount = a1 + a2;\n\n      if (tranche1 > 0) breakdown.push({ label: `${tranche1} an(s) × 1\u002F4 mois`, value: fmtEUR.format(a1) });\n      if (tranche2 > 0) breakdown.push({ label: `${tranche2} an(s) × 1\u002F3 mois`, value: fmtEUR.format(a2) });\n\n      detail = `Art. 29 CCN 1396 = barème légal L1234-9, ${anc} an(s) d'ancienneté`;\n    }\n\n    if (motif === 'rupture-conv') {\n      detail += ' (rupture conventionnelle — même formule conventionnelle)';\n    }\n\n    return { amount, detail, breakdown };\n  }\n\n  function computePv() {\n    const { cat, anc } = state.pv;\n    let duration = '';\n    let detail = '';\n\n    if (cat === 'ouvrier') {\n      if (anc \u003C 2) {\n        duration = '1 mois';\n        detail = 'Ancienneté \u003C 2 ans — Art. 26 CCN 1396';\n      } else {\n        duration = '2 mois';\n        detail = 'Ancienneté ≥ 2 ans — Art. 26 CCN 1396';\n      }\n    } else if (cat === 'tam') {\n      duration = '2 mois';\n      detail = 'TAM — Art. 26 CCN 1396 (toutes anciennetés)';\n    } else {\n      duration = '3 mois minimum';\n      detail = 'Ingénieurs et Cadres — Art. 11 CCN 1396. Le cadre qui retrouve un emploi peut quitter sans pénalité.';\n    }\n\n    return { duration, detail };\n  }\n\n  function computeSm() {\n    const { categorie, heures } = state.sm;\n    const grid = salaryGrid[categorie];\n    const ratio = heures \u002F 35;\n    return { grid, ratio };\n  }\n\n  function computePa() {\n    const { salaire, mois, situation, quotite } = state.pa;\n    const prorataMois = mois \u002F 12;\n    const prorataTps = situation === 'plein' ? 1 : quotite \u002F 100;\n    const amount = salaire * prorataMois * prorataTps;\n    return {\n      amount,\n      detail: `Base ${fmtEURd.format(salaire)} × ${mois}\u002F12 mois${situation === 'partiel' ? ` × ${quotite} % temps partiel` : ''} — Art. 19\u002F41 CCN 1396`\n    };\n  }\n\n  function computeCg() {\n    const { anc, mois } = state.cg;\n    const base = Math.round(2.5 * mois); \u002F\u002F 2.5 jours ouvrables \u002F mois\n    const extra = anc >= 5 ? (anc >= 10 ? 2 : 1) : 0;\n    const total = Math.min(base, 30) + extra;\n    return {\n      total,\n      base: Math.min(base, 30),\n      extra,\n      detail: `${Math.min(base, 30)} jours légaux + ${extra} jour(s) d'ancienneté — Art. 32 CCN 1396`\n    };\n  }\n\n  function computeHs() {\n    const { taux, mode, t1, t2, exc, excH } = state.hs;\n\n    if (mode === 'repos') {\n      const repos1 = t1 * 1.25;\n      const repos2 = t2 * 1.5;\n      let excLabel = '';\n      if (exc === 'nuit') excLabel = ' + nuit +25 % maj.';\n      else if (exc === 'exc') excLabel = ' + heures except. +50 %';\n      return {\n        amount: null,\n        reposH1: repos1.toFixed(2),\n        reposH2: repos2.toFixed(2),\n        detail: `Repos compensateur — Art. 38 CCN 1396${excLabel}`,\n        breakdown: [\n          t1 > 0 ? { label: `${t1} h tranche 1 × 1,25 =`, value: `${repos1.toFixed(2)} h repos` } : null,\n          t2 > 0 ? { label: `${t2} h tranche 2 × 1,50 =`, value: `${repos2.toFixed(2)} h repos` } : null,\n        ].filter(Boolean)\n      };\n    }\n\n    const maj1 = 1.25;\n    const maj2 = 1.50;\n    const a1 = t1 * taux * maj1;\n    const a2 = t2 * taux * maj2;\n\n    let excAmount = 0;\n    let excMaj = 0;\n    if (exc === 'nuit') excMaj = 1.25;\n    else if (exc === 'exc') excMaj = 1.50;\n    if (excMaj > 0) excAmount = excH * taux * excMaj;\n\n    const total = a1 + a2 + excAmount;\n    const breakdown = [];\n    if (t1 > 0) breakdown.push({ label: `${t1} h × ${fmtEURd.format(taux)} × 1,25`, value: fmtEURd.format(a1) });\n    if (t2 > 0) breakdown.push({ label: `${t2} h × ${fmtEURd.format(taux)} × 1,50`, value: fmtEURd.format(a2) });\n    if (excAmount > 0) breakdown.push({ label: `${excH} h except. × ${fmtEURd.format(taux)} × ${excMaj.toFixed(2)}`, value: fmtEURd.format(excAmount) });\n\n    return {\n      amount: total,\n      detail: `Art. 38 CCN 1396 — Majoration salariale`,\n      breakdown\n    };\n  }\n\n  \u002F\u002F ---- Render functions ----\n  function renderInd() {\n    const { amount, detail, breakdown } = computeInd();\n    document.getElementById('ind-amount').textContent = fmtEUR.format(amount);\n    document.getElementById('ind-detail').textContent = detail;\n    const el = document.getElementById('ind-breakdown');\n    el.innerHTML = breakdown.map(r => `\u003Cdiv class=\"breakdown-row\">\u003Cspan>${r.label}\u003C\u002Fspan>\u003Cspan>${r.value}\u003C\u002Fspan>\u003C\u002Fdiv>`).join('');\n  }\n\n  function renderPv() {\n    const { duration, detail } = computePv();\n    document.getElementById('pv-duration').textContent = duration;\n    document.getElementById('pv-detail').textContent = detail;\n    \u002F\u002F Show\u002Fhide ancienneté for cadre (not needed)\n    const ancField = document.getElementById('pv-anc-field');\n    ancField.style.display = state.pv.cat === 'cadre' ? 'none' : '';\n  }\n\n  function renderSm() {\n    const { grid, ratio } = computeSm();\n    const container = document.getElementById('sm-table-container');\n    const rows = grid.map((r, i) => {\n      const adjusted = Math.round(r.min2025 * ratio);\n      return `\u003Ctr${i === 0 ? ' class=\"highlight\"' : ''}>\n        \u003Ctd>${r.coeff}\u003C\u002Ftd>\n        \u003Ctd>${r.label}\u003C\u002Ftd>\n        \u003Ctd>${fmtEUR.format(r.min2025)}\u003C\u002Ftd>\n        \u003Ctd>${fmtEUR.format(adjusted)}\u003C\u002Ftd>\n      \u003C\u002Ftr>`;\n    }).join('');\n    container.innerHTML = `\u003Ctable class=\"salary-table\">\n      \u003Cthead>\u003Ctr>\n        \u003Cth>Coeff.\u003C\u002Fth>\u003Cth>Niveau \u002F Échelon\u003C\u002Fth>\u003Cth>Min. 35h (2025)\u003C\u002Fth>\u003Cth>Pour ${state.sm.heures} h\u002Fsem\u003C\u002Fth>\n      \u003C\u002Ftr>\u003C\u002Fthead>\n      \u003Ctbody>${rows}\u003C\u002Ftbody>\n    \u003C\u002Ftable>`;\n    document.getElementById('sm-amount').textContent = fmtEUR.format(grid[0].min2025);\n    document.getElementById('sm-detail').textContent = `Accord n° 119 du 24 jan. 2025 — IDCC 1396. Valeurs indicatives.`;\n  }\n\n  function renderPa() {\n    const { amount, detail } = computePa();\n    document.getElementById('pa-amount').textContent = fmtEUR.format(amount);\n    document.getElementById('pa-detail').textContent = detail;\n    document.getElementById('pa-partiel-field').style.display = state.pa.situation === 'partiel' ? '' : 'none';\n  }\n\n  function renderCg() {\n    const { total, base, extra, detail } = computeCg();\n    document.getElementById('cg-total').textContent = `${total} jours ouvrables`;\n    document.getElementById('cg-detail').textContent = detail;\n    const el = document.getElementById('cg-breakdown');\n    el.innerHTML = [\n      { label: 'Congés légaux (2,5 j\u002Fmois)', value: `${base} j` },\n      { label: 'Jours ancienneté (art. 32)', value: `+${extra} j` },\n    ].map(r => `\u003Cdiv class=\"breakdown-row\">\u003Cspan>${r.label}\u003C\u002Fspan>\u003Cspan>${r.value}\u003C\u002Fspan>\u003C\u002Fdiv>`).join('');\n  }\n\n  function renderHs() {\n    const res = computeHs();\n    const labelEl = document.getElementById('hs-result-label');\n    const amountEl = document.getElementById('hs-amount');\n    const detailEl = document.getElementById('hs-detail');\n    const breakEl = document.getElementById('hs-breakdown');\n\n    if (state.hs.mode === 'repos') {\n      labelEl.textContent = 'Repos compensateur total';\n      const totalRepos = (parseFloat(res.reposH1) + parseFloat(res.reposH2)).toFixed(2);\n      amountEl.textContent = `${totalRepos} h de repos`;\n      detailEl.textContent = res.detail;\n    } else {\n      labelEl.textContent = 'Coût total heures supplémentaires';\n      amountEl.textContent = fmtEURd.format(res.amount || 0);\n      detailEl.textContent = res.detail;\n    }\n\n    if (res.breakdown) {\n      breakEl.innerHTML = res.breakdown.map(r => `\u003Cdiv class=\"breakdown-row\">\u003Cspan>${r.label}\u003C\u002Fspan>\u003Cspan>${r.value}\u003C\u002Fspan>\u003C\u002Fdiv>`).join('');\n    }\n\n    document.getElementById('hs-exc-hours-field').style.display = state.hs.exc !== 'non' ? '' : 'none';\n  }\n\n  function renderAll() { renderInd(); renderPv(); renderSm(); renderPa(); renderCg(); renderHs(); }\n\n  \u002F\u002F ---- Tabs ----\n  const tabs = document.querySelectorAll('[data-tab]');\n  const panels = document.querySelectorAll('[data-panel]');\n\n  function activate(id) {\n    tabs.forEach(t => t.classList.toggle('active', t.dataset.tab === id));\n    panels.forEach(p => p.classList.toggle('visible', p.dataset.panel === id));\n    if (location.hash !== '#' + id) location.hash = id;\n    requestAnimationFrame(() => {\n      window.dispatchEvent(new Event('resize'));\n      const h = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);\n      parent.postMessage({ type: 'resize', height: h }, '*');\n    });\n  }\n\n  tabs.forEach(t => t.addEventListener('click', () => activate(t.dataset.tab)));\n  const hashTab = location.hash.slice(1);\n  const firstTab = tabs[0] ? tabs[0].dataset.tab : 'indemnite';\n  activate(document.querySelector(`[data-tab=\"${hashTab}\"]`) ? hashTab : firstTab);\n\n  \u002F\u002F ---- Input wiring: Indemnité ----\n  const indSalaire = document.getElementById('ind-salaire');\n  const indAnc = document.getElementById('ind-anc');\n  indSalaire.addEventListener('input', () => {\n    state.ind.salaire = +indSalaire.value;\n    document.getElementById('ind-salaire-display').textContent = fmtEUR.format(state.ind.salaire);\n    renderInd();\n  });\n  indAnc.addEventListener('input', () => {\n    state.ind.anc = +indAnc.value;\n    document.getElementById('ind-anc-display').textContent = state.ind.anc + ' an' + (state.ind.anc > 1 ? 's' : '');\n    renderInd();\n  });\n  document.querySelectorAll('[data-ind-cat]').forEach(btn => {\n    btn.addEventListener('click', () => {\n      state.ind.cat = btn.dataset.indCat;\n      document.querySelectorAll('[data-ind-cat]').forEach(b => b.classList.toggle('active', b === btn));\n      renderInd();\n    });\n  });\n  document.querySelectorAll('[data-ind-motif]').forEach(btn => {\n    btn.addEventListener('click', () => {\n      state.ind.motif = btn.dataset.indMotif;\n      document.querySelectorAll('[data-ind-motif]').forEach(b => b.classList.toggle('active', b === btn));\n      renderInd();\n    });\n  });\n\n  \u002F\u002F ---- Input wiring: Préavis ----\n  const pvAnc = document.getElementById('pv-anc');\n  pvAnc.addEventListener('input', () => {\n    state.pv.anc = +pvAnc.value;\n    document.getElementById('pv-anc-display').textContent = state.pv.anc + ' an' + (state.pv.anc > 1 ? 's' : '');\n    renderPv();\n  });\n  document.querySelectorAll('[data-pv-cat]').forEach(btn => {\n    btn.addEventListener('click', () => {\n      state.pv.cat = btn.dataset.pvCat;\n      document.querySelectorAll('[data-pv-cat]').forEach(b => b.classList.toggle('active', b === btn));\n      renderPv();\n    });\n  });\n\n  \u002F\u002F ---- Input wiring: Salaires ----\n  document.getElementById('sm-categorie').addEventListener('change', e => {\n    state.sm.categorie = e.target.value;\n    renderSm();\n  });\n  const smHeures = document.getElementById('sm-heures');\n  smHeures.addEventListener('input', () => {\n    state.sm.heures = +smHeures.value;\n    document.getElementById('sm-heures-display').textContent = state.sm.heures + ' h';\n    renderSm();\n  });\n\n  \u002F\u002F ---- Input wiring: Prime annuelle ----\n  const paSalaire = document.getElementById('pa-salaire');\n  const paMois = document.getElementById('pa-mois');\n  const paQuotite = document.getElementById('pa-quotite');\n  paSalaire.addEventListener('input', () => {\n    state.pa.salaire = +paSalaire.value;\n    document.getElementById('pa-salaire-display').textContent = fmtEUR.format(state.pa.salaire);\n    renderPa();\n  });\n  paMois.addEventListener('input', () => {\n    state.pa.mois = +paMois.value;\n    document.getElementById('pa-mois-display').textContent = state.pa.mois + ' mois';\n    renderPa();\n  });\n  paQuotite.addEventListener('input', () => {\n    state.pa.quotite = +paQuotite.value;\n    document.getElementById('pa-quotite-display').textContent = state.pa.quotite + ' %';\n    renderPa();\n  });\n  document.querySelectorAll('[data-pa-situation]').forEach(btn => {\n    btn.addEventListener('click', () => {\n      state.pa.situation = btn.dataset.paSituation;\n      document.querySelectorAll('[data-pa-situation]').forEach(b => b.classList.toggle('active', b === btn));\n      renderPa();\n    });\n  });\n\n  \u002F\u002F ---- Input wiring: Congés ----\n  const cgAnc = document.getElementById('cg-anc');\n  const cgMois = document.getElementById('cg-mois');\n  cgAnc.addEventListener('input', () => {\n    state.cg.anc = +cgAnc.value;\n    document.getElementById('cg-anc-display').textContent = state.cg.anc + ' an' + (state.cg.anc > 1 ? 's' : '');\n    renderCg();\n  });\n  cgMois.addEventListener('input', () => {\n    state.cg.mois = +cgMois.value;\n    document.getElementById('cg-mois-display').textContent = state.cg.mois + ' mois';\n    renderCg();\n  });\n\n  \u002F\u002F ---- Input wiring: Heures supp ----\n  const hsTaux = document.getElementById('hs-taux');\n  const hsT1 = document.getElementById('hs-t1');\n  const hsT2 = document.getElementById('hs-t2');\n  const hsExcH = document.getElementById('hs-exc-h');\n  hsTaux.addEventListener('input', () => {\n    state.hs.taux = +hsTaux.value;\n    document.getElementById('hs-taux-display').textContent = fmtEURd.format(state.hs.taux) + '\u002Fh';\n    renderHs();\n  });\n  hsT1.addEventListener('input', () => {\n    state.hs.t1 = +hsT1.value;\n    document.getElementById('hs-t1-display').textContent = state.hs.t1 + ' h';\n    renderHs();\n  });\n  hsT2.addEventListener('input', () => {\n    state.hs.t2 = +hsT2.value;\n    document.getElementById('hs-t2-display').textContent = state.hs.t2 + ' h';\n    renderHs();\n  });\n  hsExcH.addEventListener('input', () => {\n    state.hs.excH = +hsExcH.value;\n    document.getElementById('hs-exc-h-display').textContent = state.hs.excH + ' h';\n    renderHs();\n  });\n  document.querySelectorAll('[data-hs-mode]').forEach(btn => {\n    btn.addEventListener('click', () => {\n      state.hs.mode = btn.dataset.hsMode;\n      document.querySelectorAll('[data-hs-mode]').forEach(b => b.classList.toggle('active', b === btn));\n      renderHs();\n    });\n  });\n  document.querySelectorAll('[data-hs-exc]').forEach(btn => {\n    btn.addEventListener('click', () => {\n      state.hs.exc = btn.dataset.hsExc;\n      document.querySelectorAll('[data-hs-exc]').forEach(b => b.classList.toggle('active', b === btn));\n      renderHs();\n    });\n  });\n\n  \u002F\u002F ---- ResizeObserver ----\n  const ro = new ResizeObserver(() => {\n    const h = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);\n    parent.postMessage({ type: 'resize', height: h }, '*');\n  });\n  ro.observe(document.documentElement);\n\n  \u002F\u002F ---- Init ----\n  document.addEventListener('DOMContentLoaded', () => {\n    lucide.createIcons();\n    renderAll();\n  });\n\n  \u002F\u002F Immediate init if DOM already ready\n  if (document.readyState !== 'loading') {\n    lucide.createIcons();\n    renderAll();\n  }\n\u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","generated","juridique","consumer","both","https:\u002F\u002Fpub-bdebbd2dad294475a2da0eb657815b6b.r2.dev\u002Ftools\u002Fccn-pour-les-industries-de-produits-alimentaires-elabores-36985841bd.webp",[]]