[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"tool-content-ccn-personnels-pact-et-arim-fr":3,"footer-cities-fr":60},{"slug":4,"title":5,"page_title":6,"description":7,"content_md":8,"local_slug":4,"json_ld":9,"faq":29,"tool_html":54,"source":55,"category":56,"audience":57,"publish_mode":58,"hero_image":59,"hero_image_alt":5},"ccn-personnels-pact-et-arim","CCN des personnels PACT et ARIM — calculateur complet","Calculateur CCN PACT et ARIM IDCC 1278 | Expert Zoom","Outil interactif couvrant le préavis, le 13e mois, les congés payés et la grille salariale de la CCN des personnels PACT et ARIM (IDCC 1278).","Ce calculateur interactif couvre les 4 fonctions clés de la convention collective des personnels PACT et ARIM (IDCC 1278) : durée de préavis selon statut et ancienneté, prime de 13e mois obligatoire (art. 16), jours de congés conventionnels avec bonus d'ancienneté, et grille de salaires par coefficient (Avenant n° 30, janvier 2025).",[10],{"name":11,"@type":12,"about":13,"author":17,"@context":20,"isPartOf":21,"inLanguage":24,"description":25,"operatingSystem":26,"applicationCategory":27,"isAccessibleForFree":28},"Calculateur CCN des personnels PACT et ARIM — IDCC 1278","WebApplication",{"name":14,"@type":15,"identifier":16},"Convention collective des personnels PACT et ARIM","Thing","IDCC 1278",{"name":18,"@type":19},"Expert-Zoom","Organization","https:\u002F\u002Fschema.org",{"url":22,"@type":23},"\u002Ffr\u002Fmagazine\u002Fjuridique\u002Fles-conventions-collectives-en-france","Article","fr","Outil interactif couvrant le préavis, le 13e mois, les congés payés et la grille salariale de la convention collective des personnels PACT et ARIM (IDCC 1278).","All","FinanceApplication",true,[30,33,36,39,42,45,48,51],{"a":31,"q":32},"La CCN des personnels PACT et ARIM (art. 11) prévoit des préavis plus favorables que la loi. Pour les non-cadres : 2 semaines (\u003C 6 mois), 1 mois (6 mois – 2 ans), 2 mois (2 – 10 ans), et 2 mois 1\u002F2 au-delà de 10 ans. Pour les cadres : 1 mois (\u003C 6 mois) puis 3 mois dès 6 mois d'ancienneté. Durant le préavis, 2 heures par jour sont accordées pour recherche d'emploi, payées sans réduction de salaire.","Quelle est la durée du préavis dans la convention collective PACT et ARIM ?",{"a":34,"q":35},"Oui. L'article 16 de la CCN instaure un 13e mois obligatoire pour tout salarié justifiant d'au moins 2 ans d'ancienneté au 31 décembre. Il est calculé sur le salaire de décembre, proratisé selon le temps de présence effectif dans l'année. Une avance de 50 % peut être demandée lors du départ en congés d'été.","La CCN PACT et ARIM prévoit-elle un 13e mois ?",{"a":37,"q":38},"La CCN accorde 30 jours ouvrables de base (identique à la loi) auxquels s'ajoutent des jours d'ancienneté : +1 jour après 5 ans, +2 jours après 10 ans d'ancienneté dans la structure. À cela s'ajoutent 3 jours mobiles annuels. Un salarié avec 10 ans ou plus bénéficie donc de 35 jours ouvrables au total.","Combien de jours de congés payés prévoit la CCN PACT et ARIM ?",{"a":40,"q":41},"La rémunération minimale est calculée selon la formule : Salaire = Partie fixe + (Valeur du point × Coefficient). Au 1er janvier 2025 (Avenant n° 30), la valeur du point est de 1,99 € et la partie fixe de 880,24 € pour un horaire 35h\u002F35h. Le coefficient varie selon la classification du poste (de 285 pour un employé E1 à 800 pour un cadre C3).","Comment est calculé le salaire minimum dans la CCN PACT et ARIM ?",{"a":43,"q":44},"Non. La convention collective des personnels PACT et ARIM n'améliore pas le calcul de l'indemnité de licenciement au-delà du minimum légal. Elle applique la formule de l'article L1234-9 du code du travail : 1\u002F4 de mois de salaire par année jusqu'à 10 ans, puis 1\u002F3 de mois pour chaque année au-delà de 10 ans.","L'indemnité de licenciement est-elle plus favorable dans la CCN PACT et ARIM ?",{"a":46,"q":47},"Non. La CCN PACT et ARIM applique les majorations légales standard : +25 % pour les 8 premières heures supplémentaires (semaines 36 à 43) et +50 % au-delà. Aucune majoration conventionnelle supplémentaire n'est prévue. Le temps de travail est organisé sur 35 heures hebdomadaires, avec possibilité d'annualisation à 1 554 heures.","Les heures supplémentaires bénéficient-elles d'une majoration spécifique dans la CCN PACT et ARIM ?",{"a":49,"q":50},"La CCN des personnels PACT et ARIM (IDCC 1278) a été fusionnée avec la CCN des organismes gestionnaires de foyers (IDCC 2336) par arrêté du 1er août 2019 pour former la Convention Collective Nationale de l'Habitat et du Logement Accompagnés. Les droits acquis sont maintenus et les nouvelles grilles de salaires sont publiées sous l'IDCC 1278\u002F2336 fusionné.","Quelle est la situation actuelle de la CCN PACT et ARIM ?",{"a":52,"q":53},"La CCN s'applique aux salariés des associations PACT (Propagande et Action Contre les Taudis) et ARIM (Associations pour la Réhabilitation et l'Amélioration de l'Habitat) — organismes à vocation sociale œuvrant pour l'amélioration de l'habitat et l'accompagnement des ménages défavorisés. Cette CCN couvre les conseillers habitat, assistants sociaux, techniciens et cadres de ces structures.","Qui est concerné par la convention collective PACT et ARIM ?","\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 des personnels PACT et ARIM — IDCC 1278\u003C\u002Ftitle>\n  \u003Cscript src=\"https:\u002F\u002Funpkg.com\u002Flucide@latest\u002Fdist\u002Fumd\u002Flucide.min.js\">\u003C\u002Fscript>\n  \u003Cstyle>\n    *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n\n    :root {\n      --bg: #fafaf9;\n      --surface: #ffffff;\n      --border: #e7e5e4;\n      --accent: #2563eb;\n      --accent-light: #eff6ff;\n      --accent-dark: #1d4ed8;\n      --text: #1c1917;\n      --text-muted: #78716c;\n      --success-bg: #f0fdf4;\n      --success-border: #bbf7d0;\n      --success-text: #15803d;\n      --warn-bg: #fffbeb;\n      --warn-border: #fde68a;\n      --warn-text: #92400e;\n      --info-bg: #eff6ff;\n      --info-border: #bfdbfe;\n      --info-text: #1e40af;\n      --radius: 0.75rem;\n      --radius-sm: 0.5rem;\n      --shadow: 0 1px 3px rgba(0,0,0,.08), 0 1px 2px rgba(0,0,0,.05);\n    }\n\n    body {\n      font-family: system-ui, -apple-system, sans-serif;\n      background: var(--bg);\n      color: var(--text);\n      line-height: 1.5;\n      padding: 1rem;\n    }\n\n    .tool-root { max-width: 680px; margin: 0 auto; }\n\n    \u002F* Header *\u002F\n    .tool-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: flex-start;\n      margin-bottom: 1.25rem;\n      gap: 0.75rem;\n    }\n    .tool-header h1 {\n      font-size: 1.1rem;\n      font-weight: 700;\n      color: var(--text);\n      line-height: 1.3;\n    }\n    .idcc-badge {\n      background: var(--accent);\n      color: #fff;\n      font-size: 0.7rem;\n      font-weight: 700;\n      padding: 0.25rem 0.6rem;\n      border-radius: 9999px;\n      white-space: nowrap;\n      flex-shrink: 0;\n    }\n\n    \u002F* Tabs *\u002F\n    .tab-list {\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    .tab-list::-webkit-scrollbar { display: none; }\n    .tab-btn {\n      padding: 0.5rem 0.85rem;\n      font-size: 0.825rem;\n      font-weight: 600;\n      color: var(--text-muted);\n      background: none;\n      border: none;\n      border-bottom: 2px solid transparent;\n      cursor: pointer;\n      white-space: nowrap;\n      margin-bottom: -2px;\n      border-radius: var(--radius-sm) var(--radius-sm) 0 0;\n      transition: color .15s, border-color .15s, background .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\n    \u002F* Panels *\u002F\n    .panel { display: block; }\n    .panel.hidden { display: none; }\n\n    \u002F* Rule callout *\u002F\n    .rule-callout {\n      display: flex;\n      gap: 0.65rem;\n      align-items: flex-start;\n      background: var(--info-bg);\n      border: 1px solid var(--info-border);\n      border-radius: var(--radius-sm);\n      padding: 0.75rem 0.9rem;\n      margin-bottom: 1.1rem;\n      font-size: 0.85rem;\n      color: var(--info-text);\n      line-height: 1.4;\n    }\n    .rule-callout i { flex-shrink: 0; margin-top: 1px; }\n\n    \u002F* Card *\u002F\n    .card {\n      background: var(--surface);\n      border: 1px solid var(--border);\n      border-radius: var(--radius);\n      padding: 1.1rem 1.2rem;\n      margin-bottom: 1rem;\n      box-shadow: var(--shadow);\n    }\n    .card-title {\n      font-size: 0.8rem;\n      font-weight: 700;\n      text-transform: uppercase;\n      letter-spacing: .04em;\n      color: var(--text-muted);\n      margin-bottom: 0.9rem;\n    }\n\n    \u002F* Form controls *\u002F\n    .field { margin-bottom: 0.9rem; }\n    .field label {\n      display: block;\n      font-size: 0.82rem;\n      font-weight: 600;\n      margin-bottom: 0.35rem;\n    }\n    .field-row { display: flex; gap: 0.75rem; align-items: center; }\n\n    input[type=range] {\n      flex: 1;\n      accent-color: var(--accent);\n      height: 4px;\n      cursor: pointer;\n    }\n    .range-val {\n      font-size: 0.82rem;\n      font-weight: 700;\n      color: var(--accent);\n      min-width: 4.5rem;\n      text-align: right;\n      font-variant-numeric: tabular-nums;\n    }\n\n    select {\n      width: 100%;\n      padding: 0.45rem 0.65rem;\n      border: 1px solid var(--border);\n      border-radius: var(--radius-sm);\n      font-size: 0.85rem;\n      background: var(--surface);\n      color: var(--text);\n      cursor: pointer;\n    }\n\n    \u002F* Pills *\u002F\n    .pills { display: flex; gap: 0.4rem; flex-wrap: wrap; }\n    .pill {\n      padding: 0.35rem 0.75rem;\n      border: 1.5px solid var(--border);\n      border-radius: 9999px;\n      font-size: 0.8rem;\n      font-weight: 600;\n      cursor: pointer;\n      background: var(--surface);\n      color: var(--text-muted);\n      transition: all .15s;\n    }\n    .pill.active {\n      background: var(--accent);\n      border-color: var(--accent);\n      color: #fff;\n    }\n\n    \u002F* Result *\u002F\n    .result-card {\n      background: linear-gradient(135deg, var(--accent) 0%, var(--accent-dark) 100%);\n      border-radius: var(--radius);\n      padding: 1.1rem 1.2rem;\n      color: #fff;\n      margin-bottom: 1rem;\n    }\n    .result-label { font-size: 0.78rem; opacity: .85; margin-bottom: 0.2rem; }\n    .result-value {\n      font-size: 1.75rem;\n      font-weight: 800;\n      font-variant-numeric: tabular-nums;\n      letter-spacing: -.02em;\n    }\n    .result-sub { font-size: 0.78rem; opacity: .75; margin-top: 0.25rem; }\n\n    \u002F* Info rows *\u002F\n    .info-row {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      padding: 0.4rem 0;\n      border-bottom: 1px solid var(--border);\n      font-size: 0.83rem;\n    }\n    .info-row:last-child { border-bottom: none; }\n    .info-row .lbl { color: var(--text-muted); }\n    .info-row .val { font-weight: 700; font-variant-numeric: tabular-nums; }\n\n    \u002F* Salary grid table *\u002F\n    .grid-table { width: 100%; border-collapse: collapse; font-size: 0.8rem; }\n    .grid-table th {\n      background: var(--accent-light);\n      color: var(--accent-dark);\n      padding: 0.4rem 0.6rem;\n      text-align: left;\n      font-weight: 700;\n      font-size: 0.75rem;\n    }\n    .grid-table td {\n      padding: 0.35rem 0.6rem;\n      border-bottom: 1px solid var(--border);\n      font-variant-numeric: tabular-nums;\n    }\n    .grid-table tr:hover td { background: var(--accent-light); }\n    .grid-table tr.highlight td { background: var(--success-bg); font-weight: 700; color: var(--success-text); }\n\n    \u002F* Toggle *\u002F\n    .toggle-wrap { display: flex; align-items: center; gap: 0.5rem; cursor: pointer; }\n    .toggle {\n      position: relative;\n      width: 2.5rem;\n      height: 1.35rem;\n      background: var(--border);\n      border-radius: 9999px;\n      transition: background .15s;\n      flex-shrink: 0;\n    }\n    .toggle.on { background: var(--accent); }\n    .toggle::after {\n      content: '';\n      position: absolute;\n      top: 0.15rem;\n      left: 0.15rem;\n      width: 1.05rem;\n      height: 1.05rem;\n      background: #fff;\n      border-radius: 50%;\n      transition: left .15s;\n      box-shadow: 0 1px 3px rgba(0,0,0,.2);\n    }\n    .toggle.on::after { left: 1.3rem; }\n    .toggle-label { font-size: 0.82rem; font-weight: 600; }\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: 0.85rem;\n      margin-top: 0.5rem;\n      line-height: 1.5;\n    }\n    .disclaimer a { color: var(--accent); text-decoration: none; }\n    .disclaimer a:hover { text-decoration: underline; }\n  \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody>\n\u003C!-- CCN IDCC 1278 — deviations from Code du Travail\n     preavis:        L1234-1 → Non-cadres >10 ans: 2.5 mois (vs 2 mois légal); Cadres: jusqu'à 3 mois\n                     Source: Art. 11 CCN, Avenant du 26 mai 2009 (Legifrance KALITEXT000021509775)\n     prime-annuelle: aucune obligation légale → Art. 16 CCN: 1 mois de salaire après 2 ans ancienneté\n                     Source: Art. 16 CCN (Legifrance KALIARTI000021549344)\n     conges:         L3141-3 (30 j) → +1 j après 5 ans, +2 j après 10 ans + 3 jours mobiles\n                     Source: Art. 15 CCN PACT ARIM\n     salaire-min:    grille conventionnelle par coefficient (valeur du point + partie fixe)\n                     Source: Avenant n° 30 du 19 novembre 2024 (applicable 1er janvier 2025)\n-->\n\u003Cmain class=\"tool-root\">\n  \u003Cdiv class=\"tool-header\">\n    \u003Ch1>Convention collective des personnels PACT et ARIM\u003C\u002Fh1>\n    \u003Cspan class=\"idcc-badge\">IDCC 1278\u003C\u002Fspan>\n  \u003C\u002Fdiv>\n\n  \u003Cnav class=\"tab-list\" role=\"tablist\" aria-label=\"Fonctions de la CCN\">\n    \u003Cbutton class=\"tab-btn\" data-tab=\"preavis\" role=\"tab\">Préavis\u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"prime\" role=\"tab\">13e mois\u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"conges\" role=\"tab\">Congés\u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"salaire\" role=\"tab\">Grille salariale\u003C\u002Fbutton>\n  \u003C\u002Fnav>\n\n  \u003C!-- ======= TAB: PREAVIS ======= -->\n  \u003Cdiv class=\"panel\" data-panel=\"preavis\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" size=\"16\">\u003C\u002Fi>\n      \u003Cp>La CCN PACT et ARIM (art. 11) prévoit des préavis plus longs que la loi : \u003Cstrong>2 mois 1\u002F2 pour les non-cadres au-delà de 10 ans\u003C\u002Fstrong> (vs 2 mois légaux) et \u003Cstrong>3 mois pour les cadres\u003C\u002Fstrong> dès 6 mois d'ancienneté.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"card-title\">Vos informations\u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Statut\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"preavis-statut-pills\">\n          \u003Cbutton class=\"pill active\" data-val=\"non-cadre\">Non-cadre \u002F Technicien\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"cadre\">Cadre\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Ancienneté\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"preavis-anc-pills\">\n          \u003Cbutton class=\"pill active\" data-val=\"0\">Moins de 6 mois\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"1\">6 mois – 2 ans\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"2\">2 – 10 ans\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"3\">Plus de 10 ans\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\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=\"preavis-result\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"preavis-sub\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"info-row\">\n        \u003Cspan class=\"lbl\">Selon le code du travail\u003C\u002Fspan>\n        \u003Cspan class=\"val\" id=\"preavis-legal\">—\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"info-row\">\n        \u003Cspan class=\"lbl\">Plus favorable de\u003C\u002Fspan>\n        \u003Cspan class=\"val\" id=\"preavis-delta\">—\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"info-row\">\n        \u003Cspan class=\"lbl\">Heures de recherche d'emploi\u003C\u002Fspan>\n        \u003Cspan class=\"val\">2h\u002Fjour payées (non-cadres)\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ======= TAB: PRIME ANNUELLE ======= -->\n  \u003Cdiv class=\"panel hidden\" data-panel=\"prime\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" size=\"16\">\u003C\u002Fi>\n      \u003Cp>L'article 16 de la CCN impose un \u003Cstrong>13e mois obligatoire\u003C\u002Fstrong> à partir de 2 ans d'ancienneté, calculé sur le salaire de décembre, proratisé selon le temps de présence. Aucune obligation équivalente n'existe dans le code du travail.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"card-title\">Vos informations\u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel for=\"prime-salaire\">Salaire mensuel brut de décembre\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"prime-salaire\" min=\"1700\" max=\"6000\" step=\"50\" value=\"2200\">\n          \u003Cspan class=\"range-val\" id=\"prime-salaire-val\">2 200 €\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel for=\"prime-anc\">Ancienneté (années révolues au 31\u002F12)\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"prime-anc\" min=\"0\" max=\"35\" step=\"1\" value=\"5\">\n          \u003Cspan class=\"range-val\" id=\"prime-anc-val\">5 ans\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel for=\"prime-presence\">Mois de présence effective dans l'année\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"prime-presence\" min=\"1\" max=\"12\" step=\"1\" value=\"12\">\n          \u003Cspan class=\"range-val\" id=\"prime-presence-val\">12 mois\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Prime de 13e mois brute\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"prime-result\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"prime-sub\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\" id=\"prime-details\">\n      \u003Cdiv class=\"info-row\">\n        \u003Cspan class=\"lbl\">Éligible\u003C\u002Fspan>\n        \u003Cspan class=\"val\" id=\"prime-eligible\">—\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"info-row\">\n        \u003Cspan class=\"lbl\">Salaire de référence (décembre)\u003C\u002Fspan>\n        \u003Cspan class=\"val\" id=\"prime-ref\">—\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"info-row\">\n        \u003Cspan class=\"lbl\">Proratisation (présence)\u003C\u002Fspan>\n        \u003Cspan class=\"val\" id=\"prime-prorata\">—\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"info-row\">\n        \u003Cspan class=\"lbl\">Avance possible (demande estivale)\u003C\u002Fspan>\n        \u003Cspan class=\"val\" id=\"prime-avance\">—\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ======= TAB: CONGES ======= -->\n  \u003Cdiv class=\"panel hidden\" data-panel=\"conges\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" size=\"16\">\u003C\u002Fi>\n      \u003Cp>La CCN PACT et ARIM accorde des \u003Cstrong>jours supplémentaires selon l'ancienneté\u003C\u002Fstrong> (+1 j après 5 ans, +2 j après 10 ans) et \u003Cstrong>3 jours mobiles\u003C\u002Fstrong> annuels, dépassant le minimum légal de 30 jours ouvrables.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"card-title\">Vos informations\u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel for=\"conges-anc\">Ancienneté dans la structure\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"conges-anc\" min=\"0\" max=\"30\" step=\"1\" value=\"3\">\n          \u003Cspan class=\"range-val\" id=\"conges-anc-val\">3 ans\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Temps partiel\u003C\u002Flabel>\n        \u003Cdiv class=\"toggle-wrap\" id=\"conges-tp-toggle\">\n          \u003Cdiv class=\"toggle\" id=\"conges-tp-btn\">\u003C\u002Fdiv>\n          \u003Cspan class=\"toggle-label\" id=\"conges-tp-label\">Non\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\" id=\"conges-tp-field\" style=\"display:none\">\n        \u003Clabel for=\"conges-taux\">Taux de travail (%)\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"conges-taux\" min=\"20\" max=\"99\" step=\"5\" value=\"80\">\n          \u003Cspan class=\"range-val\" id=\"conges-taux-val\">80 %\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Congés payés annuels (jours ouvrables)\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"conges-result\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"conges-sub\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"info-row\">\n        \u003Cspan class=\"lbl\">Base légale (L3141-3)\u003C\u002Fspan>\n        \u003Cspan class=\"val\">30 jours ouvrables\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"info-row\">\n        \u003Cspan class=\"lbl\">Bonus ancienneté CCN\u003C\u002Fspan>\n        \u003Cspan class=\"val\" id=\"conges-bonus-anc\">—\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"info-row\">\n        \u003Cspan class=\"lbl\">Jours mobiles CCN\u003C\u002Fspan>\n        \u003Cspan class=\"val\">3 jours\u002Fan\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"info-row\">\n        \u003Cspan class=\"lbl\">Total (hors jours mobiles)\u003C\u002Fspan>\n        \u003Cspan class=\"val\" id=\"conges-total-base\">—\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"info-row\">\n        \u003Cspan class=\"lbl\">Total avec jours mobiles\u003C\u002Fspan>\n        \u003Cspan class=\"val\" id=\"conges-total-mobiles\">—\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ======= TAB: SALAIRE MIN ======= -->\n  \u003Cdiv class=\"panel hidden\" data-panel=\"salaire\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" size=\"16\">\u003C\u002Fi>\n      \u003Cp>La CCN prévoit une grille de salaires par coefficient basée sur une \u003Cstrong>valeur du point conventionnel\u003C\u002Fstrong> (1,99 €\u002Fpt pour 35h × 35h au 01\u002F01\u002F2025). Ces minima dépassent le SMIC pour les classifications supérieures.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"card-title\">Paramètres (Avenant n° 30 — 01\u002F01\u002F2025)\u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel for=\"sal-coefficient\">Coefficient hiérarchique\u003C\u002Flabel>\n        \u003Cselect id=\"sal-coefficient\">\n          \u003Coption value=\"285\">285 — Employé niveau 1 (E1)\u003C\u002Foption>\n          \u003Coption value=\"320\">320 — Employé niveau 2 (E2)\u003C\u002Foption>\n          \u003Coption value=\"355\">355 — Employé niveau 3 (E3)\u003C\u002Foption>\n          \u003Coption value=\"395\">395 — Agent de maîtrise AM1\u003C\u002Foption>\n          \u003Coption value=\"440\">440 — Agent de maîtrise AM2\u003C\u002Foption>\n          \u003Coption value=\"490\">490 — Technicien supérieur T1\u003C\u002Foption>\n          \u003Coption value=\"550\">550 — Technicien supérieur T2\u003C\u002Foption>\n          \u003Coption value=\"620\">620 — Cadre C1\u003C\u002Foption>\n          \u003Coption value=\"700\">700 — Cadre C2\u003C\u002Foption>\n          \u003Coption value=\"800\">800 — Cadre C3\u003C\u002Foption>\n        \u003C\u002Fselect>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Organisation du temps de travail\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"sal-ott-pills\">\n          \u003Cbutton class=\"pill active\" data-val=\"3535\">35h payées 35h\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"3539\">35h payées 39h\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Salaire minimum conventionnel brut\u002Fmois\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"sal-result\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"sal-sub\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"info-row\">\n        \u003Cspan class=\"lbl\">Valeur du point\u003C\u002Fspan>\n        \u003Cspan class=\"val\" id=\"sal-vpt\">—\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"info-row\">\n        \u003Cspan class=\"lbl\">Partie fixe\u003C\u002Fspan>\n        \u003Cspan class=\"val\" id=\"sal-pfix\">—\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"info-row\">\n        \u003Cspan class=\"lbl\">Coefficient sélectionné\u003C\u002Fspan>\n        \u003Cspan class=\"val\" id=\"sal-coef\">—\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"info-row\">\n        \u003Cspan class=\"lbl\">SMIC mensuel brut (2025)\u003C\u002Fspan>\n        \u003Cspan class=\"val\">1 801,80 €\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"card-title\">Grille complète 35h\u002F35h\u003C\u002Fdiv>\n      \u003Ctable class=\"grid-table\" id=\"sal-grid\">\n        \u003Cthead>\n          \u003Ctr>\n            \u003Cth>Classification\u003C\u002Fth>\n            \u003Cth>Coefficient\u003C\u002Fth>\n            \u003Cth>Salaire min.\u003C\u002Fth>\n          \u003C\u002Ftr>\n        \u003C\u002Fthead>\n        \u003Ctbody>\u003C\u002Ftbody>\n      \u003C\u002Ftable>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003Cp class=\"disclaimer\">\n    Calcul indicatif basé sur la CCN IDCC 1278 (personnels PACT et ARIM, désormais intégrée à la CCN Habitat et Logement Accompagnés).\n    Source : \u003Ca href=\"https:\u002F\u002Fwww.legifrance.gouv.fr\u002Fconv_coll\u002Fid\u002FKALITEXT000005650474\u002F\" target=\"_blank\" rel=\"noopener\">Legifrance\u003C\u002Fa>.\n    Pour toute validation légale\n  \u003C\u002Fp>\n\u003C\u002Fmain>\n\n\u003Cscript>\n\u002F\u002F ─── State ────────────────────────────────────────────────────────────────────\nconst state = {\n  preavis: { statut: 'non-cadre', anc: 0 },\n  prime: { salaire: 2200, anc: 5, presence: 12 },\n  conges: { anc: 3, tp: false, taux: 80 },\n  salaire: { coefficient: 285, ott: '3535' }\n};\n\n\u002F\u002F ─── Formatters ───────────────────────────────────────────────────────────────\nconst fmtEUR = v => new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', maximumFractionDigits: 0 }).format(v);\nconst fmtEURd = v => new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(v);\n\n\u002F\u002F ─── Préavis computation ──────────────────────────────────────────────────────\nconst PREAVIS_CCN = {\n  'non-cadre': [\n    { label: '2 semaines', months: 0.5 },   \u002F\u002F \u003C 6 mois\n    { label: '1 mois',     months: 1 },      \u002F\u002F 6m–2ans\n    { label: '2 mois',     months: 2 },      \u002F\u002F 2–10 ans\n    { label: '2 mois 1\u002F2', months: 2.5 }    \u002F\u002F > 10 ans\n  ],\n  'cadre': [\n    { label: '1 mois',   months: 1 },   \u002F\u002F \u003C 6 mois\n    { label: '3 mois',   months: 3 },   \u002F\u002F 6m–2ans\n    { label: '3 mois',   months: 3 },   \u002F\u002F 2–10 ans\n    { label: '3 mois',   months: 3 }    \u002F\u002F > 10 ans\n  ]\n};\nconst PREAVIS_LEGAL = {\n  'non-cadre': [\n    { label: 'Pas de minimum légal', months: 0 },\n    { label: '1 mois', months: 1 },\n    { label: '2 mois', months: 2 },\n    { label: '2 mois', months: 2 }\n  ],\n  'cadre': [\n    { label: 'Pas de minimum légal', months: 0 },\n    { label: '1 mois', months: 1 },\n    { label: '2 mois', months: 2 },\n    { label: '2 mois', months: 2 }\n  ]\n};\n\nfunction computePreavis() {\n  const { statut, anc } = state.preavis;\n  const ccn   = PREAVIS_CCN[statut][anc];\n  const legal = PREAVIS_LEGAL[statut][anc];\n  const delta = ccn.months - legal.months;\n  return { ccn, legal, delta };\n}\n\nfunction renderPreavis() {\n  const { ccn, legal, delta } = computePreavis();\n  document.getElementById('preavis-result').textContent = ccn.label;\n  document.getElementById('preavis-sub').textContent =\n    state.preavis.statut === 'cadre' ? 'Cadres — art. 11 CCN PACT ARIM' : 'Non-cadres — art. 11 CCN PACT ARIM';\n  document.getElementById('preavis-legal').textContent = legal.label;\n  if (delta > 0) {\n    document.getElementById('preavis-delta').textContent = `+${delta \u003C 1 ? '2 semaines' : delta + ' mois'} par rapport à la loi`;\n  } else if (legal.months === 0) {\n    document.getElementById('preavis-delta').textContent = 'La loi ne prévoit pas de minimum';\n  } else {\n    document.getElementById('preavis-delta').textContent = 'Identique au code du travail';\n  }\n}\n\n\u002F\u002F ─── Prime annuelle computation ───────────────────────────────────────────────\nfunction computePrime() {\n  const { salaire, anc, presence } = state.prime;\n  const eligible = anc >= 2;\n  if (!eligible) return { eligible: false, amount: 0, avance: 0 };\n  const amount = salaire * (presence \u002F 12);\n  const avance = amount \u002F 2;\n  return { eligible: true, amount, avance, salaire, presence };\n}\n\nfunction renderPrime() {\n  const r = computePrime();\n  document.getElementById('prime-eligible').textContent = r.eligible ? 'Oui' : 'Non (ancienneté \u003C 2 ans)';\n  if (!r.eligible) {\n    document.getElementById('prime-result').textContent = '0 €';\n    document.getElementById('prime-sub').textContent = 'Ancienneté insuffisante (\u003C 2 ans requis)';\n    document.getElementById('prime-ref').textContent = '—';\n    document.getElementById('prime-prorata').textContent = '—';\n    document.getElementById('prime-avance').textContent = '—';\n    return;\n  }\n  document.getElementById('prime-result').textContent = fmtEUR(r.amount);\n  document.getElementById('prime-sub').textContent = `Art. 16 CCN — basé sur ${r.presence} mois de présence`;\n  document.getElementById('prime-ref').textContent = fmtEURd(r.salaire);\n  document.getElementById('prime-prorata').textContent = `${r.presence}\u002F12 mois`;\n  document.getElementById('prime-avance').textContent = fmtEURd(r.avance) + ' (sur demande en été)';\n}\n\n\u002F\u002F ─── Congés computation ───────────────────────────────────────────────────────\nfunction computeConges() {\n  const { anc, tp, taux } = state.conges;\n  const base = 30;\n  const bonusAnc = anc >= 10 ? 2 : (anc >= 5 ? 1 : 0);\n  const mobiles = 3;\n  let total = base + bonusAnc;\n  let totalMobiles = total + mobiles;\n  if (tp) {\n    total = Math.round(total * taux \u002F 100);\n    totalMobiles = Math.round(totalMobiles * taux \u002F 100);\n  }\n  return { base, bonusAnc, mobiles, total, totalMobiles };\n}\n\nfunction renderConges() {\n  const r = computeConges();\n  document.getElementById('conges-result').textContent = r.totalMobiles + ' jours ouvrables';\n  document.getElementById('conges-sub').textContent = `Dont ${r.total} j CP + ${r.mobiles} j mobiles`;\n  document.getElementById('conges-bonus-anc').textContent =\n    r.bonusAnc === 0 ? '0 jour (\u003C 5 ans)' : `+${r.bonusAnc} jour${r.bonusAnc > 1 ? 's' : ''} (ancienneté ≥ ${r.bonusAnc === 1 ? 5 : 10} ans)`;\n  document.getElementById('conges-total-base').textContent = r.total + ' jours ouvrables';\n  document.getElementById('conges-total-mobiles').textContent = r.totalMobiles + ' jours ouvrables';\n}\n\n\u002F\u002F ─── Salaire min computation ───────────────────────────────────────────────────\nconst SAL_PARAMS = {\n  '3535': { vpt: 1.99, pfix: 880.24 },\n  '3539': { vpt: 2.22, pfix: 971.56 }\n};\n\nconst SAL_GRID = [\n  { label: 'Employé E1',        coef: 285 },\n  { label: 'Employé E2',        coef: 320 },\n  { label: 'Employé E3',        coef: 355 },\n  { label: 'Agent maîtrise AM1',coef: 395 },\n  { label: 'Agent maîtrise AM2',coef: 440 },\n  { label: 'Tech. sup. T1',     coef: 490 },\n  { label: 'Tech. sup. T2',     coef: 550 },\n  { label: 'Cadre C1',          coef: 620 },\n  { label: 'Cadre C2',          coef: 700 },\n  { label: 'Cadre C3',          coef: 800 },\n];\n\nfunction salMin(coef, ott) {\n  const { vpt, pfix } = SAL_PARAMS[ott];\n  return pfix + vpt * coef;\n}\n\nfunction computeSalaire() {\n  const { coefficient, ott } = state.salaire;\n  const params = SAL_PARAMS[ott];\n  const amount = salMin(coefficient, ott);\n  return { amount, ...params, coefficient };\n}\n\nfunction renderSalaire() {\n  const r = computeSalaire();\n  document.getElementById('sal-result').textContent = fmtEURd(r.amount);\n  document.getElementById('sal-sub').textContent = `Avenant n° 30 — valeur du point ${r.vpt.toFixed(2)} € — coef. ${r.coefficient}`;\n  document.getElementById('sal-vpt').textContent = fmtEURd(r.vpt) + '\u002Fpoint';\n  document.getElementById('sal-pfix').textContent = fmtEURd(r.pfix);\n  document.getElementById('sal-coef').textContent = r.coefficient;\n\n  \u002F\u002F Build grid\n  const tbody = document.querySelector('#sal-grid tbody');\n  tbody.innerHTML = '';\n  SAL_GRID.forEach(row => {\n    const sal = salMin(row.coef, state.salaire.ott);\n    const tr = document.createElement('tr');\n    if (row.coef === state.salaire.coefficient) tr.className = 'highlight';\n    tr.innerHTML = `\u003Ctd>${row.label}\u003C\u002Ftd>\u003Ctd>${row.coef}\u003C\u002Ftd>\u003Ctd>${fmtEURd(sal)}\u003C\u002Ftd>`;\n    tbody.appendChild(tr);\n  });\n}\n\n\u002F\u002F ─── Render dispatch ──────────────────────────────────────────────────────────\nfunction renderAll() { renderPreavis(); renderPrime(); renderConges(); renderSalaire(); }\n\n\u002F\u002F ─── Tabs ─────────────────────────────────────────────────────────────────────\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 => p.classList.toggle('hidden', p.dataset.panel !== id));\n  if (location.hash !== '#' + id) location.hash = id;\n  requestAnimationFrame(() => window.dispatchEvent(new Event('resize')));\n}\n\ntabBtns.forEach(t => t.addEventListener('click', () => activate(t.dataset.tab)));\nconst hashTab = location.hash.slice(1);\nconst validTabs = ['preavis', 'prime', 'conges', 'salaire'];\nactivate(validTabs.includes(hashTab) ? hashTab : 'preavis');\n\n\u002F\u002F ─── Pill helper ─────────────────────────────────────────────────────────────\nfunction pillGroup(id, onChange) {\n  document.getElementById(id).addEventListener('click', e => {\n    const pill = e.target.closest('.pill');\n    if (!pill) return;\n    document.querySelectorAll(`#${id} .pill`).forEach(p => p.classList.remove('active'));\n    pill.classList.add('active');\n    onChange(pill.dataset.val);\n  });\n}\n\n\u002F\u002F ─── Event wiring ─────────────────────────────────────────────────────────────\n\u002F\u002F Préavis\npillGroup('preavis-statut-pills', v => { state.preavis.statut = v; renderPreavis(); });\npillGroup('preavis-anc-pills',    v => { state.preavis.anc = +v; renderPreavis(); });\n\n\u002F\u002F Prime\n['prime-salaire','prime-anc','prime-presence'].forEach(id => {\n  const el = document.getElementById(id);\n  const valEl = document.getElementById(id + '-val');\n  el.addEventListener('input', () => {\n    const k = id.replace('prime-', '');\n    state.prime[k] = +el.value;\n    if (k === 'salaire') valEl.textContent = fmtEURd(+el.value);\n    else if (k === 'anc') valEl.textContent = el.value + ' ans';\n    else valEl.textContent = el.value + ' mois';\n    renderPrime();\n  });\n});\n\n\u002F\u002F Congés\nconst congesAncEl = document.getElementById('conges-anc');\ncongesAncEl.addEventListener('input', () => {\n  state.conges.anc = +congesAncEl.value;\n  document.getElementById('conges-anc-val').textContent = congesAncEl.value + ' ans';\n  renderConges();\n});\ndocument.getElementById('conges-tp-toggle').addEventListener('click', () => {\n  state.conges.tp = !state.conges.tp;\n  document.getElementById('conges-tp-btn').classList.toggle('on', state.conges.tp);\n  document.getElementById('conges-tp-label').textContent = state.conges.tp ? 'Oui' : 'Non';\n  document.getElementById('conges-tp-field').style.display = state.conges.tp ? 'block' : 'none';\n  renderConges();\n});\nconst congesTauxEl = document.getElementById('conges-taux');\ncongesTauxEl.addEventListener('input', () => {\n  state.conges.taux = +congesTauxEl.value;\n  document.getElementById('conges-taux-val').textContent = congesTauxEl.value + ' %';\n  renderConges();\n});\n\n\u002F\u002F Salaire\ndocument.getElementById('sal-coefficient').addEventListener('change', e => {\n  state.salaire.coefficient = +e.target.value;\n  renderSalaire();\n});\npillGroup('sal-ott-pills', v => { state.salaire.ott = v; renderSalaire(); });\n\n\u002F\u002F ─── Initial render ───────────────────────────────────────────────────────────\n\u002F\u002F Set initial range display values\ndocument.getElementById('prime-salaire-val').textContent = fmtEURd(state.prime.salaire);\ndocument.getElementById('prime-anc-val').textContent = state.prime.anc + ' ans';\ndocument.getElementById('prime-presence-val').textContent = state.prime.presence + ' mois';\ndocument.getElementById('conges-anc-val').textContent = state.conges.anc + ' ans';\ndocument.getElementById('conges-taux-val').textContent = state.conges.taux + ' %';\nrenderAll();\n\n\u002F\u002F ─── Lucide icons ─────────────────────────────────────────────────────────────\nlucide.createIcons();\n\n\u002F\u002F ─── ResizeObserver (iframe contract) ────────────────────────────────────────\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\u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","generated","juridique","consumer","both","https:\u002F\u002Fpub-bdebbd2dad294475a2da0eb657815b6b.r2.dev\u002Ftools\u002Fccn-personnels-pact-et-arim-1cae9aed0c.webp",[]]