(() => {
'use strict';
const PTA = window.PTA;
if (!PTA) return;
const { readJsonResponse, apiErrorMessage, escapeHtml, formatDuration, formatDate } = PTA.utils;
let current = null;
const el = (id) => document.getElementById(id);
const selectedAgentId = () => Number(el('pta-agent')?.value || 0);
function show(text, type = 'info') {
const box = el('pta-message');
if (!box) return;
box.className = `message message-${type}`;
box.textContent = text;
}
function card(label, value, detail = '') {
return `${escapeHtml(label)}${escapeHtml(value)}${detail ? `${escapeHtml(detail)}` : ''}`;
}
function renderSummary(data) {
current = data;
const agent = data.agent || {};
const quota = data.quota || {};
const counters = data.counters || {};
el('pta-content').hidden = false;
el('pta-agent-name').textContent = `${agent.prenom || ''} ${agent.nom || ''}`.trim();
el('pta-agent-meta').textContent = [
agent.matricule,
agent.poste_libelle || 'Poste non renseigné',
agent.structure_principale_nom || 'Sans lieu principal',
agent.type_contrat === 'PERMANENT' ? 'Contrat permanent' : 'Contrat non permanent',
].filter(Boolean).join(' — ');
el('pta-summary-cards').innerHTML = [
card('Année civile PTA', `${formatDate(quota.date_debut_periode)} → ${formatDate(quota.date_fin_periode)}`),
card('Quotité', `${Number(quota.quotite_travail || 0).toLocaleString('fr-FR')} %`, `Référence : ${formatDuration(Number(quota.quota_reference_minutes || 96420))}`),
card('Quota à réaliser', quota.quota_cible || formatDuration(Number(quota.quota_cible_minutes || 0))),
card('Déjà affecté', quota.affectees || formatDuration(Number(quota.minutes_affectees || 0))),
card('Reste à affecter', quota.restantes || formatDuration(Number(quota.minutes_restantes || 0))),
card('Formation', `${counters.formation_duree || '0 h 00'} / ${counters.formation_cible_duree || '0 h 00'}`),
card('Congés annuels', `${Number(counters.conges_annuels_jours || 0)} / ${Number(counters.conges_annuels_cible || 25)} jours`),
card('Fractionnement', `${Number(counters.jours_fractionnement || 0)} / ${Number(counters.jours_fractionnement_cible || 2)} jours`),
].join('');
el('pta-category-body').innerHTML = (data.categories || []).map((category) => `
| ${escapeHtml(category.libelle)} | ${escapeHtml(category.duree)} | ${Number(category.jours || 0)} |
`).join('') || '| Aucune affectation sur la période. |
';
el('pta-controls').innerHTML = (data.controls || []).map((control) => {
const level = String(control.niveau || 'INFO').toLowerCase();
return `${escapeHtml(control.niveau || 'INFO')}${escapeHtml(control.message || '')}`;
}).join('') || 'Aucun contrôle disponible.
';
renderConstraints(data.constraints || []);
renderWishes(data.wishes || []);
const refDate = el('pta-reference-date').value;
el('pta-open-agent-view').href = `agents.php?agent_id=${Number(agent.id_agent)}&month=${encodeURIComponent(refDate.slice(0, 7))}`;
el('pta-open-planning').href = `planning.php?agent_id=${Number(agent.id_agent)}`;
el('pta-constraint-start').value ||= quota.date_debut_periode || '';
el('pta-constraint-end').value ||= quota.date_fin_periode || '';
}
function renderConstraints(items) {
el('pta-constraint-list').innerHTML = items.map((item) => `
${item.type_contrainte === 'TEMPS_PARTIEL_THERAPEUTIQUE' ? 'Temps partiel thérapeutique' : 'Préconisation médicale'}
${escapeHtml(formatDate(item.date_debut))} → ${item.date_fin ? escapeHtml(formatDate(item.date_fin)) : 'sans fin'} — ${escapeHtml(item.commentaire)}
`).join('') || 'Aucune contrainte active sur cette période.
';
}
function renderWishes(items) {
el('pta-wish-list').innerHTML = items.map((item) => `
${item.type_souhait === 'INTERDICTION' ? 'Interdiction' : 'Préférence'} — ${escapeHtml(item.structure_nom)}
Priorité ${Number(item.priorite)}${item.distance_km !== null ? ` — ${Number(item.distance_km).toLocaleString('fr-FR')} km` : ''}${item.commentaire ? ` — ${escapeHtml(item.commentaire)}` : ''}
`).join('') || 'Aucune préférence ou interdiction enregistrée.
';
}
async function load() {
const agentId = selectedAgentId();
const date = el('pta-reference-date')?.value;
if (!agentId || !date) {
show('Choisissez un agent et une date de référence.', 'error');
return;
}
show('Calcul du PTA en cours…');
try {
const response = await fetch(`api/pta_summary.php?agent_id=${agentId}&date=${encodeURIComponent(date)}`);
const data = await readJsonResponse(response);
if (!response.ok) throw new Error(apiErrorMessage(data, 'Impossible de charger le PTA.'));
renderSummary(data);
show('PTA actualisé.', 'success');
} catch (error) {
show(error.message, 'error');
}
}
async function post(url, payload) {
const response = await fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ csrf_token: window.PTA_CONFIG.csrfToken, ...payload }),
});
const data = await readJsonResponse(response);
if (!response.ok) throw new Error(apiErrorMessage(data, 'Opération impossible.'));
return data;
}
async function saveConstraint(event) {
event.preventDefault();
if (!selectedAgentId()) return;
try {
await post('api/pta_constraint.php', {
agent_id: selectedAgentId(),
type_contrainte: el('pta-constraint-type').value,
date_debut: el('pta-constraint-start').value,
date_fin: el('pta-constraint-end').value,
quotite_temporaire: el('pta-constraint-rate').value,
maximum_heures_jour: el('pta-constraint-day-max').value,
maximum_heures_semaine: el('pta-constraint-week-max').value,
interdit_matin: el('pta-forbid-morning').checked,
interdit_midi: el('pta-forbid-midday').checked,
interdit_soir: el('pta-forbid-evening').checked,
commentaire: el('pta-constraint-comment').value,
});
event.currentTarget.reset();
await load();
} catch (error) { show(error.message, 'error'); }
}
async function saveWish(event) {
event.preventDefault();
if (!selectedAgentId()) return;
try {
await post('api/pta_wish.php', {
agent_id: selectedAgentId(),
structure_id: Number(el('pta-wish-structure').value),
type_souhait: el('pta-wish-type').value,
priorite: Number(el('pta-wish-priority').value),
distance_km: el('pta-wish-distance').value,
commentaire: el('pta-wish-comment').value,
});
event.currentTarget.reset();
el('pta-wish-priority').value = '1';
await load();
} catch (error) { show(error.message, 'error'); }
}
async function handleDelete(event) {
const constraint = event.target.closest('.pta-delete-constraint');
const wish = event.target.closest('.pta-delete-wish');
if (!constraint && !wish) return;
if (!window.confirm('Confirmer la suppression ?')) return;
try {
if (constraint) {
await post('api/pta_constraint.php', { action: 'DELETE', agent_id: selectedAgentId(), constraint_id: Number(constraint.dataset.id) });
} else {
await post('api/pta_wish.php', { action: 'DELETE', agent_id: selectedAgentId(), wish_id: Number(wish.dataset.id) });
}
await load();
} catch (error) { show(error.message, 'error'); }
}
function init() {
el('load-pta')?.addEventListener('click', load);
el('pta-constraint-form')?.addEventListener('submit', saveConstraint);
el('pta-wish-form')?.addEventListener('submit', saveWish);
el('pta-content')?.addEventListener('click', handleDelete);
const params = window.PTA_PAGE_CONFIG?.params || {};
if (params.agentId) el('pta-agent').value = String(params.agentId);
if (params.date) el('pta-reference-date').value = params.date;
if (params.agentId) load();
}
PTA.modules.pta = { init, load };
})();