(() => { 'use strict'; const PTA = window.PTA; if (!PTA) throw new Error('PTA core doit être chargé avant structure-overview.js'); const { openStructurePdfButton } = PTA.elements; const { escapeHtml, readJsonResponse, apiErrorMessage, parseIsoWeek, formatDate } = PTA.utils; const typeLabel = (type) => type === 'EXTRASCOLAIRE' ? 'Extrascolaire' : 'Périscolaire'; function entryBadge(entry) { return `
${escapeHtml(entry.heure_debut)}–${escapeHtml(entry.heure_fin)} ${escapeHtml(entry.motif_libelle)} ${entry.statut === 'BROUILLON' ? 'Brouillon' : ''}
`; } function coveragePanel(coverage) { if (!coverage?.configured) { return `
Couverture non configurée Définissez les horaires de présence minimale dans Administration pour détecter automatiquement les créneaux vides.
`; } const gaps = Array.isArray(coverage.gaps) ? coverage.gaps : []; if (!gaps.length) { return `
Couverture complète Aucun manque d’agent détecté sur les plages de couverture configurées.
`; } const items = gaps.slice(0, 8).map((gap) => `
  • ${escapeHtml(gap.jour_libelle)} ${escapeHtml(gap.heure_debut)}–${escapeHtml(gap.heure_fin)} : ${Number(gap.agents_manquants)} agent${Number(gap.agents_manquants) > 1 ? 's' : ''} manquant${Number(gap.agents_manquants) > 1 ? 's' : ''}
  • `).join(''); const more = gaps.length > 8 ? `
  • … et ${gaps.length - 8} autre${gaps.length - 8 > 1 ? 's' : ''} plage${gaps.length - 8 > 1 ? 's' : ''}.
  • ` : ''; return `
    ⚠ ${gaps.length} plage${gaps.length > 1 ? 's' : ''} insuffisamment couverte${gaps.length > 1 ? 's' : ''}
    `; } function render(data) { const container = document.querySelector('#structure-overview-content'); const empty = document.querySelector('#structure-overview-empty'); const days = parseIsoWeek(data.week.value); if (!container || !empty) return; empty.hidden = true; container.hidden = false; if (!data.agents.length) { container.innerHTML = `

    ${escapeHtml(data.structure.nom)}

    ${typeLabel(data.structure.type_affectation)} · semaine du ${formatDate(days[0]?.date)} au ${formatDate(days[days.length - 1]?.date)}

    0 agent
    ${coveragePanel(data.coverage)}
    Aucun agent n’est rattaché ou planifié sur ce lieu pour cette semaine.
    `; return; } const headerDays = days.map((day) => `${day.label}${day.display}`).join(''); const rows = data.agents.map((agent) => { const cells = days.map((day) => { const entries = agent.entries.filter((entry) => entry.date_jour === day.date); return `${entries.length ? entries.map((entry) => entryBadge(entry)).join('') : ''}`; }).join(''); return ` ${escapeHtml(agent.prenom)} ${escapeHtml(agent.nom)} ${escapeHtml(agent.matricule)} ${agent.lieu_principal ? 'Lieu principal' : 'Affectation ponctuelle'} ${cells} ${escapeHtml(agent.quota.restantes.libelle)} sur ${escapeHtml(agent.quota.quota_cible.libelle)} ${Number(agent.quota.quotite_travail).toLocaleString('fr-FR')} % `; }).join(''); container.innerHTML = `

    ${escapeHtml(data.structure.nom)}

    ${typeLabel(data.structure.type_affectation)} · semaine du ${formatDate(days[0]?.date)} au ${formatDate(days[days.length - 1]?.date)}

    ${data.agents.length} agent${data.agents.length > 1 ? 's' : ''}
    ${coveragePanel(data.coverage)}
    ${headerDays} ${rows}
    AgentQuota restant
    `; } function updatePdfButton() { if (!openStructurePdfButton) return; const structureId = document.querySelector('#overview-structure')?.value; const week = document.querySelector('#overview-week')?.value; openStructurePdfButton.disabled = !(structureId && week); } function openPdf() { const structureId = document.querySelector('#overview-structure')?.value; const week = document.querySelector('#overview-week')?.value; if (!structureId || !week) return; const params = new URLSearchParams({ structure_id: structureId, week }); window.open(`api/structure_planning_pdf.php?${params.toString()}`, '_blank', 'noopener'); } async function load() { const structureId = document.querySelector('#overview-structure')?.value; const week = document.querySelector('#overview-week')?.value; const container = document.querySelector('#structure-overview-content'); const empty = document.querySelector('#structure-overview-empty'); updatePdfButton(); if (!container || !empty) return; if (!structureId || !week) { empty.hidden = false; empty.textContent = 'Choisissez un lieu d’affectation et une semaine.'; container.hidden = true; return; } empty.hidden = false; empty.textContent = 'Chargement du planning du lieu…'; container.hidden = true; try { const params = new URLSearchParams({ structure_id: structureId, week }); const response = await fetch(`api/structure_overview.php?${params.toString()}`); const data = await readJsonResponse(response); if (!response.ok) throw new Error(apiErrorMessage(data, 'Impossible de charger la vue du lieu.')); render(data); } catch (error) { empty.hidden = false; empty.textContent = error.message; } } function init() { document.querySelector('#load-structure-overview')?.addEventListener('click', load); document.querySelector('#overview-structure')?.addEventListener('change', load); document.querySelector('#overview-week')?.addEventListener('change', load); openStructurePdfButton?.addEventListener('click', openPdf); updatePdfButton(); } PTA.modules.structureOverview = { init, load, render, updatePdfButton }; })();