diff --git a/family-calendar.php b/family-calendar.php index b679687..3249345 100644 --- a/family-calendar.php +++ b/family-calendar.php @@ -36,7 +36,7 @@ require __DIR__ . '/header.php';

- +
@@ -59,7 +59,7 @@ require __DIR__ . '/header.php';

📸

- +
@@ -96,7 +96,7 @@ require __DIR__ . '/header.php';
diff --git a/modules/family-calendar/family-calendar.css b/modules/family-calendar/family-calendar.css index cd609f1..09923ef 100644 --- a/modules/family-calendar/family-calendar.css +++ b/modules/family-calendar/family-calendar.css @@ -1,15 +1,24 @@ /* modules/family-calendar/family-calendar.css */ :root { + /* Couleurs sémantiques Calendrier */ --c-school-holiday: #e5d9f2; - --c-public-holiday: #e0e0e0; + --c-public-holiday: #e2e8f0; /* Plus marqué que l'original */ --c-off-carole: #ffedd5; --c-extra-off: #fee2e2; --c-selected: #bfdbfe; - --bg-alex: #f0fdfa; - --text-alex: #0f766e; + + /* Thèmes Parents (Sync Budget) */ + --bg-alex: #ecfeff; + --text-alex: #0891b2; --bg-laia: #fffbeb; - --text-laia: #b45309; + --text-laia: #d97706; + + /* Rappel des variables Global Design System pour cohérence */ + --pf-primary: #3b82f6; + --pf-border: #e2e8f0; + --pf-bg-lighter: #f8fafc; + --pf-shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05); } .pf-family-calendar .pf-main { @@ -27,29 +36,31 @@ .pf-btn-icon-text { background: white; border: 1px solid var(--pf-border); - border-radius: 20px; - padding: 8px 16px; + border-radius: 50px; + padding: 10px 20px; display: inline-flex; align-items: center; gap: 8px; - font-size: 0.85rem; + font-size: 0.9rem; font-weight: 600; + color: #475569; cursor: pointer; - transition: 0.2s; + transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); box-shadow: var(--pf-shadow-sm); } .pf-btn-icon-text:hover { border-color: var(--pf-primary); color: var(--pf-primary); - background: #f0f9ff; + background: #f8fafc; transform: translateY(-1px); + box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1); } /* Calendrier Mensuel */ .fc-month-calendar-wrapper { background: white; border: 1px solid var(--pf-border); - border-radius: var(--pf-radius-lg); + border-radius: 16px; padding: 24px; margin-bottom: 32px; box-shadow: var(--pf-shadow-sm); @@ -68,15 +79,16 @@ } .fc-month-nav-row h3 { margin: 0 !important; - font-size: 1.4rem !important; + font-size: 1.5rem !important; font-weight: 800 !important; + color: #0f172a; text-transform: capitalize !important; text-align: center !important; flex-grow: 1 !important; } .fc-nav-button { - width: 36px; - height: 36px; + width: 40px; + height: 40px; border-radius: 50%; border: 1px solid var(--pf-border); background: white; @@ -84,20 +96,22 @@ display: flex; align-items: center; justify-content: center; - font-size: 18px; - transition: 0.2s; + font-size: 20px; + transition: all 0.2s; + color: #64748b; } .fc-nav-button:hover { border-color: var(--pf-primary); color: var(--pf-primary); + background: #eff6ff; } .fc-view-controls { display: flex !important; width: 100% !important; - background: #e2e8f0 !important; + background: #f1f5f9 !important; padding: 4px !important; - border-radius: 8px !important; + border-radius: 12px !important; } .fc-view-button { flex: 1 !important; @@ -113,9 +127,9 @@ transition: 0.2s; } .fc-view-button--active { - background: white; - color: var(--pf-primary); - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + background: white !important; + color: var(--pf-primary) !important; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08) !important; font-weight: 700; } @@ -128,7 +142,21 @@ min-width: 100% !important; width: 100% !important; table-layout: fixed; - border-collapse: collapse !important; + border-collapse: separate !important; + border-spacing: 0; + border-radius: 12px; + overflow: hidden; + border: 1px solid var(--pf-border) !important; +} +.fc-month-table th { + padding: 10px !important; + font-size: 0.8rem !important; + background: #f8fafc !important; + color: #64748b !important; + font-weight: 700 !important; + text-transform: uppercase; + border-bottom: 1px solid var(--pf-border) !important; + border-right: 1px solid var(--pf-border) !important; } .fc-month-table td { height: 80px; @@ -137,15 +165,12 @@ vertical-align: top; position: relative; cursor: pointer; - border: 1px solid var(--pf-border) !important; + border-right: 1px solid var(--pf-border) !important; + border-bottom: 1px solid var(--pf-border) !important; + transition: background 0.1s; } -.fc-month-table th { - padding: 10px !important; - font-size: 0.8rem !important; - background: var(--pf-bg-lighter) !important; - color: var(--pf-text-muted); - text-transform: uppercase; - border: 1px solid var(--pf-border) !important; +.fc-month-table td:hover:not(.fc-day--other-month) { + background: #f1f5f9; } .fc-day--other-month { background: #fcfcfc !important; @@ -192,7 +217,8 @@ background: white; padding: 8px 16px; border-radius: 50px; - border: 1px solid #e2e8f0; + border: 1px solid var(--pf-border); + box-shadow: var(--pf-shadow-sm); } .fc-minimal-balance-card strong.alex { color: var(--text-alex); @@ -208,11 +234,12 @@ .fc-min-chip { display: flex; align-items: center; - background: var(--pf-bg-page); + background: white; border-radius: 20px; padding: 3px 10px; font-size: 0.75rem; - border: 1px solid #cbd5e1; + border: 1px solid var(--pf-border); + font-weight: 600; } .fc-min-chip .type { font-weight: 700; @@ -333,10 +360,11 @@ max-height: 80vh; overflow: auto; border: 1px solid var(--pf-border); - border-radius: 12px; + border-radius: 16px; background: white; box-shadow: var(--pf-shadow-sm); position: relative; + margin-bottom: 24px; } #planningTable { width: 100%; @@ -344,27 +372,59 @@ border-collapse: separate; border-spacing: 0; } + +/* ========================================================= + HARMONISATION DES BORDURES ET HEADERS STICKY (1px strict) + ========================================================= */ +#planningTable thead tr { + height: 30px; /* On fixe la hauteur pour un calcul parfait */ +} #planningTable thead th { position: sticky; - top: 0; - background: var(--pf-bg-lighter); - border-bottom: 1px solid var(--pf-border); - border-right: 1px solid var(--pf-border); + background: #f8fafc !important; + border: none !important; /* On supprime les bordures natives */ + + /* On utilise UNIQUEMENT des ombres internes pour simuler 1px de bordure sans doublement */ + box-shadow: + inset 0 -1px 0 var(--pf-border), + inset -1px 0 0 var(--pf-border) !important; + padding: 6px; font-size: 0.75rem; z-index: 20; + color: #475569; + background-clip: padding-box; } -.col-alex.header-group { +#planningTable thead tr:nth-child(1) th { + top: 0; + z-index: 22; /* Au premier plan */ +} +#planningTable thead tr:nth-child(2) th { + top: 30px; /* Exactement la hauteur de la ligne 1 */ + z-index: 21; +} +#planningTable thead tr:nth-child(3) th { + top: 60px; /* Ligne 1 + Ligne 2 */ + z-index: 20; +} + +.col-alex.header-group, +.col-alex-sub { background: var(--bg-alex) !important; - color: var(--text-alex); + color: var(--text-alex) !important; } -.col-laia.header-group { +.col-laia.header-group, +.col-laia-sub { background: var(--bg-laia) !important; - color: var(--text-laia); + color: var(--text-laia) !important; } + +/* Cellules standards du corps */ #planningTable tbody td { - border-right: 1px solid var(--pf-bg-lighter); - border-bottom: 1px solid var(--pf-bg-lighter); + position: relative; + border: none !important; /* Reset de sécurité */ + border-right: 1px solid var(--pf-border) !important; + border-bottom: 1px solid var(--pf-border) !important; height: 36px; padding: 0 4px; text-align: center; @@ -372,23 +432,19 @@ white-space: nowrap; cursor: pointer; } -.col-alex-sub { - background: var(--bg-alex); -} -.col-laia-sub { - background: var(--bg-laia); -} + +/* Dimensions des colonnes */ .col-month { width: 54px !important; min-width: 54px !important; max-width: 54px !important; background: white; - border-right: 2px solid var(--pf-border) !important; + text-align: center; + vertical-align: middle; } th.col-day, td.col-day { min-width: 35px !important; - border-right: 2px solid var(--pf-border) !important; } th.col-total, td.col-total, @@ -400,39 +456,69 @@ td.col-laia-sub { min-width: 32px !important; max-width: 32px !important; } + .rotated-text span { writing-mode: vertical-rl; transform: rotate(180deg); font-size: 0.7rem; color: var(--pf-text-muted); } + +/* ========================================================= + GESTION DES COLONNES STICKY (Mois & Semaine) + ========================================================= */ + #planningTable tbody td.col-sticky-mois { - position: sticky !important; - left: 0 !important; - z-index: 15 !important; - background: white !important; + writing-mode: vertical-rl; + transform: rotate(180deg); + border: none !important; + box-shadow: + inset 1px 0 0 var(--pf-border), + inset 0 1px 0 var(--pf-border) !important; + letter-spacing: 1px; } + +/* 2. Sticky Semaine (Body) */ #planningTable tbody td.col-sticky-sem { position: sticky !important; left: 54px !important; z-index: 14 !important; background: white !important; + /* Ombre portée pour délimiter la zone sticky du reste du tableau */ box-shadow: 4px 0 6px -2px rgba(0, 0, 0, 0.1); } + +/* 3. Sticky Mois (Header) */ #planningTable thead tr th.col-sticky-mois { position: sticky !important; top: 0 !important; left: 0 !important; z-index: 30 !important; background: var(--pf-bg-lighter) !important; + /* Les bordures sont gérées par le box-shadow général du thead th */ } + +/* 4. Sticky Semaine (Header) */ #planningTable thead tr th.col-sticky-sem { position: sticky !important; top: 0 !important; left: 54px !important; z-index: 29 !important; background: var(--pf-bg-lighter) !important; - box-shadow: 4px 0 6px -2px rgba(0, 0, 0, 0.1); + /* Ombre interne (bordures) + Ombre portée (effet sticky) */ + box-shadow: + inset 0 -1px 0 var(--pf-border), + inset -1px 0 0 var(--pf-border), + 4px 0 6px -2px rgba(0, 0, 0, 0.1) !important; +} + +/* Rétablissement horizontal pour les headers mois et semaine */ +#planningTable thead th.col-month, +#planningTable tbody td.col-sticky-sem { + writing-mode: horizontal-tb; + transform: none; + padding: 6px !important; + text-align: center; } /* Panneaux bas & Légendes */ @@ -442,6 +528,24 @@ td.col-laia-sub { gap: 24px; align-items: start; } + +/* Nouvelles bordures style "Budget" pour les conteneurs */ +.pf-card { + background: white; + border: 1px solid var(--pf-border); + border-radius: 16px; + box-shadow: var(--pf-shadow-sm); + padding: 24px; +} +.pf-card-title { + margin-top: 0; + margin-bottom: 16px; + font-size: 1.25rem; + color: #0f172a; + border-bottom: 1px solid var(--pf-border); + padding-bottom: 12px; +} + .pf-legend-grid { display: flex; flex-wrap: wrap; @@ -452,14 +556,18 @@ td.col-laia-sub { align-items: center; gap: 6px; font-size: 0.75rem; - padding: 4px 8px; + padding: 6px 10px; + background: #f8fafc; border: 1px solid var(--pf-border); - border-radius: 6px; + border-radius: 8px; + font-weight: 500; + color: #475569; } .pf-legend-color { width: 16px; height: 16px; - border-radius: 3px; + border-radius: 4px; + border: 1px solid rgba(0, 0, 0, 0.05); } .fc-legend-school-holiday { background: var(--c-school-holiday); @@ -485,33 +593,41 @@ td.col-laia-sub { background-size: contain; border: none; } + .fc-summary-header { display: flex; justify-content: space-between; align-items: center; - padding: 8px 16px; + margin-bottom: 16px; + padding-bottom: 12px; + border-bottom: 1px solid var(--pf-border); } .fc-summ-select { border: 1px solid var(--pf-border); border-radius: 6px; - padding: 2px 8px; - font-size: 0.75rem; - height: 24px; + padding: 4px 8px; + font-size: 0.8rem; + height: auto; + background: #f8fafc; } .fc-summary-item { display: flex; justify-content: space-between; padding: 12px 4px; - border-bottom: 1px solid var(--pf-bg-lighter); + border-bottom: 1px solid var(--pf-border); /* Ligne de séparation visible */ +} +.fc-summary-item:last-child { + border-bottom: none; } .fc-summary-label { font-size: 0.85rem; - color: var(--pf-text-muted); - font-weight: 500; + color: #64748b; + font-weight: 600; } .fc-summary-value { font-size: 1rem; font-weight: 700; + color: #0f172a; } /* Menu Contextuel Tactile */ @@ -618,22 +734,54 @@ td.col-laia-sub { font-size: 0.85rem; } .fc-holidays-table th { - background: var(--pf-bg-page); + background: #f8fafc; padding: 12px 16px; text-align: left; font-weight: 600; position: sticky; top: 0; - border-bottom: 1px solid var(--pf-border); + border-bottom: 2px solid var(--pf-border); } .fc-holidays-table td { padding: 10px 16px; - border-bottom: 1px solid var(--pf-bg-lighter); + border-bottom: 1px solid var(--pf-border); } .fc-holidays-table tr:nth-child(even) { background: #fafafa; } +/* === MODALES : Alignement du Header et de la Croix === */ +.pf-modal-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: 15px; + border-bottom: 1px solid var(--pf-border); + padding-bottom: 15px; +} + +.pf-modal-header .pf-modal-title { + margin: 0; + padding: 0; + border-bottom: none; /* On annule la bordure par défaut du global.css pour la déléguer au header */ + flex-grow: 1; +} + +.pf-modal-close { + background: none; + border: none; + font-size: 1.8rem; + line-height: 1; + cursor: pointer; + color: #94a3b8; + padding: 0 0 0 15px; + transition: color 0.2s; +} + +.pf-modal-close:hover { + color: #ef4444; /* Devient rouge au survol */ +} + /* Mobile */ @media (max-width: 768px) { .pf-family-calendar .pf-container { @@ -667,7 +815,7 @@ td.col-laia-sub { } .fc-bottom-grid { grid-template-columns: 1fr; - padding: 0 10px; + padding: 10px; } .fc-selection-menu { position: fixed !important; diff --git a/modules/family-calendar/family-calendar.js b/modules/family-calendar/family-calendar.js index a5e000e..67fcb79 100644 --- a/modules/family-calendar/family-calendar.js +++ b/modules/family-calendar/family-calendar.js @@ -1166,23 +1166,29 @@ document.addEventListener("DOMContentLoaded", () => { if (btnOpen && modal) { btnOpen.addEventListener("click", () => { - modal.style.display = "flex"; - // Remet l'année par défaut sur l'année actuellement affichée dans le calendrier + modal.classList.add("open"); // Utilisation propre de la classe CSS + document.body.classList.add("no-scroll"); + const yearSelect = document.getElementById("holidayYearSelect"); if (yearSelect) yearSelect.value = this.currentSchoolYearStart; this.modalSelectedYear = this.currentSchoolYearStart; this.renderModalHolidays(); }); } - if (btnClose && modal) - btnClose.addEventListener( - "click", - () => (modal.style.display = "none"), - ); - if (modal) - modal.addEventListener("click", (e) => { - if (e.target === modal) modal.style.display = "none"; + if (btnClose && modal) { + btnClose.addEventListener("click", () => { + modal.classList.remove("open"); + document.body.classList.remove("no-scroll"); }); + } + if (modal) { + modal.addEventListener("click", (e) => { + if (e.target === modal) { + modal.classList.remove("open"); + document.body.classList.remove("no-scroll"); + } + }); + } // --- GESTION MODALE CORRECTIF DES SOLDES (SNAPSHOTS) --- const btnSnap = document.getElementById("btnOpenSnapshotModal"); @@ -1191,10 +1197,10 @@ document.addEventListener("DOMContentLoaded", () => { const formSnap = document.getElementById("formSnapshot"); if (btnSnap && modalSnap) { - modalSnap.classList.add("is-open"); btnSnap.addEventListener("click", () => { - modalSnap.classList.add("is-open"); // Utilise flex au lieu de block pour le centrage + modalSnap.classList.add("open"); // On ouvre la modale correctement document.body.classList.add("no-scroll"); + // Pré-remplir la date avec le 1er jour du mois en cours const today = new Date(); const y = today.getFullYear(); @@ -1205,21 +1211,24 @@ document.addEventListener("DOMContentLoaded", () => { } if (btnCloseSnap && modalSnap) { - btnCloseSnap.addEventListener( - "click", - () => (modalSnap.style.display = "none"), - ); + btnCloseSnap.addEventListener("click", () => { + modalSnap.classList.remove("open"); + document.body.classList.remove("no-scroll"); + }); } if (modalSnap) { modalSnap.addEventListener("click", (e) => { - if (e.target === modalSnap) modalSnap.style.display = "none"; + if (e.target === modalSnap) { + modalSnap.classList.remove("open"); + document.body.classList.remove("no-scroll"); + } }); } if (formSnap) { formSnap.addEventListener("submit", async (e) => { - e.preventDefault(); // Empêche le rechargement de la page + e.preventDefault(); const payload = { person_id: document.getElementById("snapPerson").value, @@ -1229,16 +1238,15 @@ document.addEventListener("DOMContentLoaded", () => { }; try { - // On envoie à la nouvelle API await this.postApi( "/modules/family-calendar/includes/api/save-leave-snapshot.php", payload, ); - modalSnap.style.display = "none"; - formSnap.reset(); // On vide le formulaire + modalSnap.classList.remove("open"); // Fermeture propre + document.body.classList.remove("no-scroll"); + formSnap.reset(); - // On rafraîchit tout le calendrier pour appliquer le nouveau solde immédiatement await this.refreshAllData(); } catch (error) { alert("Erreur lors de la sauvegarde du correctif."); diff --git a/modules/family-calendar/includes/api/events-debug.log b/modules/family-calendar/includes/api/events-debug.log index 17c9ba3..b7b3782 100644 --- a/modules/family-calendar/includes/api/events-debug.log +++ b/modules/family-calendar/includes/api/events-debug.log @@ -41,3 +41,8 @@ [2026-01-30T23:17:09+01:00] RAW INPUT: [{"date":"2025-10-05","type":"AVIS","duration":1,"person":"Carole"},{"date":"2025-10-06","type":"AVIS","duration":1,"person":"Carole"},{"date":"2025-10-07","type":"AVIS","duration":1,"person":"Carole"},{"date":"2025-10-08","type":"AVIS","duration":1,"person":"Carole"}] [2026-02-20T16:05:33+01:00] RAW INPUT: [{"date":"2026-02-21","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2026-02-22","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2026-02-23","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2026-02-24","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2026-02-25","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2026-02-26","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2026-02-27","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2026-02-28","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2026-03-01","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2026-03-02","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2026-03-03","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2026-03-04","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2026-03-05","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2026-03-06","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2026-03-07","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2026-04-18","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2026-04-19","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2026-04-20","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2026-04-21","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2026-04-22","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2026-04-23","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2026-04-24","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2026-04-25","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2026-04-26","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2026-04-27","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2026-04-28","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2026-04-29","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2026-04-30","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2026-05-01","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2026-05-02","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2026-05-13","type":"VACANCES_SCOLAIRES","duration":1,"person":"Pont de l'Ascension"},{"date":"2026-05-14","type":"VACANCES_SCOLAIRES","duration":1,"person":"Pont de l'Ascension"},{"date":"2026-05-15","type":"VACANCES_SCOLAIRES","duration":1,"person":"Pont de l'Ascension"},{"date":"2026-05-16","type":"VACANCES_SCOLAIRES","duration":1,"person":"Pont de l'Ascension"},{"date":"2025-12-20","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2025-12-21","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2025-12-22","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2025-12-23","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2025-12-24","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2025-12-25","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2025-12-26","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2025-12-27","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2025-12-28","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2025-12-29","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2025-12-30","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2025-12-31","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2026-01-01","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2026-01-02","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2026-01-03","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2026-07-04","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-07-05","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-07-06","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-07-07","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-07-08","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-07-09","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-07-10","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-07-11","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-07-12","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-07-13","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-07-14","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-07-15","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-07-16","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-07-17","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-07-18","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-07-19","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-07-20","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-07-21","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-07-22","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-07-23","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-07-24","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-07-25","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-07-26","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-07-27","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-07-28","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-07-29","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-07-30","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-07-31","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-01","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-02","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-03","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-04","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-05","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-06","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-07","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-08","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-09","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-10","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-11","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-12","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-13","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-14","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-15","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-16","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-17","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-18","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-19","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-20","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-21","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-22","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-23","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-24","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-25","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-26","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-27","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-28","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2026-08-29","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Été"},{"date":"2025-10-18","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2025-10-19","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2025-10-20","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2025-10-21","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2025-10-22","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2025-10-23","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2025-10-24","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2025-10-25","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2025-10-26","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2025-10-27","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2025-10-28","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2025-10-29","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2025-10-30","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2025-10-31","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2025-11-01","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"}] [2026-02-20T16:15:32+01:00] RAW INPUT: [{"date":"2027-02-06","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2027-02-07","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2027-02-08","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2027-02-09","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2027-02-10","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2027-02-11","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2027-02-12","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2027-02-13","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2027-02-14","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2027-02-15","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2027-02-16","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2027-02-17","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2027-02-18","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2027-02-19","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2027-02-20","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances d'Hiver"},{"date":"2026-10-17","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2026-10-18","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2026-10-19","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2026-10-20","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2026-10-21","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2026-10-22","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2026-10-23","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2026-10-24","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2026-10-25","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2026-10-26","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2026-10-27","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2026-10-28","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2026-10-29","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2026-10-30","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2026-10-31","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de la Toussaint"},{"date":"2026-12-19","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2026-12-20","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2026-12-21","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2026-12-22","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2026-12-23","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2026-12-24","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2026-12-25","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2026-12-26","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2026-12-27","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2026-12-28","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2026-12-29","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2026-12-30","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2026-12-31","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2027-01-01","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2027-01-02","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Noël"},{"date":"2027-04-03","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2027-04-04","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2027-04-05","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2027-04-06","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2027-04-07","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2027-04-08","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2027-04-09","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2027-04-10","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2027-04-11","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2027-04-12","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2027-04-13","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2027-04-14","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2027-04-15","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2027-04-16","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"},{"date":"2027-04-17","type":"VACANCES_SCOLAIRES","duration":1,"person":"Vacances de Printemps"}] +[2026-05-06T10:14:03+02:00] RAW INPUT: [{"date":"2026-02-26","type":"AVIS","duration":1,"person":"Carole"}] +[2026-05-06T10:14:28+02:00] RAW INPUT: [{"date":"2026-02-24","type":"PEP_SICK","duration":1,"person":"Carole"}] +[2026-05-06T10:14:34+02:00] RAW INPUT: [{"date":"2026-02-23","type":"CENTRE","duration":1,"person":"Carole"}] +[2026-05-06T10:16:01+02:00] RAW INPUT: [{"date":"2026-01-19","type":"PEP_SICK","duration":1,"person":"Carole"}] +[2026-05-06T10:16:57+02:00] RAW INPUT: [{"date":"2026-03-19","type":"PEP_SICK","duration":1,"person":"Carole"}]