diff --git a/app/controllers/Plugin.php b/app/controllers/Plugin.php index 5a22af6..700d137 100644 --- a/app/controllers/Plugin.php +++ b/app/controllers/Plugin.php @@ -467,7 +467,8 @@ class CRVI_Plugin { 'permissions' => self::get_user_permissions(), 'couleurs_rdv' => self::get_couleurs_rdv_acf_data(), 'couleurs_permanence' => self::get_couleurs_permanence_acf_data(), - 'indisponibilites_intervenants' => self::get_intervenants_disponibilites() + 'indisponibilites_intervenants' => self::get_intervenants_disponibilites(), + 'beneficiaires' => self::get_beneficiaires_acf_data() ]; wp_localize_script($script_handle, 'crviACFData', $acf_data); @@ -840,6 +841,45 @@ class CRVI_Plugin { return $intervenants_data; } + /** + * Récupère les données des bénéficiaires (notamment leur statut liste rouge) + */ + private static function get_beneficiaires_acf_data() { + $transient_key = 'crvi_beneficiaires_liste_rouge'; + $beneficiaires_data = get_transient($transient_key); + + if (false === $beneficiaires_data) { + $beneficiaires_data = []; + + // Vérifier que ACF est actif + if (!function_exists('get_field')) { + return $beneficiaires_data; + } + + // Récupérer tous les bénéficiaires + $beneficiaires = get_posts([ + 'post_type' => 'beneficiaire', + 'numberposts' => -1, + 'post_status' => 'publish' + ]); + + foreach ($beneficiaires as $beneficiaire) { + // Récupérer le champ ACF personne_en_liste_rouge + $personne_en_liste_rouge = get_field('field_69495826ac495', $beneficiaire->ID); + + $beneficiaires_data[$beneficiaire->ID] = [ + 'id' => $beneficiaire->ID, + 'personne_en_liste_rouge' => (bool) $personne_en_liste_rouge + ]; + } + + // Mettre en cache pour 3 heures + set_transient($transient_key, $beneficiaires_data, 3 * HOUR_IN_SECONDS); + } + + return $beneficiaires_data; + } + /** * crvi+script loader */ diff --git a/app/models/Event_Model.php b/app/models/Event_Model.php index e974f4d..2713116 100644 --- a/app/models/Event_Model.php +++ b/app/models/Event_Model.php @@ -1673,8 +1673,20 @@ class CRVI_Event_Model extends Main_Model { 'id' => (int) $event['id'], 'date_rdv' => $event['date_rdv'], 'heure_rdv' => $event['heure_rdv'], + 'type' => $event['type'] ?? '', + 'statut' => $event['statut'] ?? '', + 'commentaire' => $event['commentaire'] ?? '', ]; + // Charger le bénéficiaire et son statut liste rouge + if (!empty($event['id_beneficiaire'])) { + $personne_en_liste_rouge = false; + if (function_exists('get_field')) { + $personne_en_liste_rouge = get_field('field_69495826ac495', $event['id_beneficiaire']); + } + $enriched_event['personne_en_liste_rouge'] = (bool) $personne_en_liste_rouge; + } + // Charger l'intervenant if (!empty($event['id_intervenant'])) { $intervenant = CRVI_Intervenant_Model::load($event['id_intervenant'], ['id', 'nom', 'prenom']); diff --git a/assets/js/modules/agenda-modal-buttons.js b/assets/js/modules/agenda-modal-buttons.js index 1b7baec..0d24d31 100644 --- a/assets/js/modules/agenda-modal-buttons.js +++ b/assets/js/modules/agenda-modal-buttons.js @@ -515,6 +515,12 @@ function displayHistoriqueTimeline(historiqueData) {
+ ${rdv.personne_en_liste_rouge ? ` +
+ + Personne en liste rouge +
+ ` : ''}
Intervenant: ${intervenantNom}
diff --git a/assets/js/modules/agenda-modal-display.js b/assets/js/modules/agenda-modal-display.js index 018eb10..fb73fbd 100644 --- a/assets/js/modules/agenda-modal-display.js +++ b/assets/js/modules/agenda-modal-display.js @@ -215,6 +215,25 @@ export function fillViewBlock(event) { if (eventId) { checkAndDisplayIncidentsButton(eventId); } + + // Afficher l'alerte de statut si présent ou absent + const statut = event?.statut || event?.extendedProps?.statut || ''; + const statutAlert = document.getElementById('statutAlert'); + const statutAlertText = document.getElementById('statutAlertText'); + + if (statutAlert && statutAlertText) { + if (statut === 'absent' || statut === 'absence') { + statutAlert.className = 'alert alert-danger mb-3'; + statutAlertText.textContent = 'La personne a été marquée comme absente à ce rendez-vous.'; + statutAlert.style.display = 'block'; + } else if (statut === 'present') { + statutAlert.className = 'alert alert-success mb-3'; + statutAlertText.textContent = 'La personne a été présente à ce rendez-vous.'; + statutAlert.style.display = 'block'; + } else { + statutAlert.style.display = 'none'; + } + } } /** diff --git a/assets/js/modules/agenda-modal-select.js b/assets/js/modules/agenda-modal-select.js index 72f75dc..57615e2 100644 --- a/assets/js/modules/agenda-modal-select.js +++ b/assets/js/modules/agenda-modal-select.js @@ -535,3 +535,42 @@ export function clearDisponibilitesCache() { disponibilitesCache.clear(); lastPopulateCall = null; } + +/** + * Initialise le listener pour afficher l'alerte "Personne en liste rouge" + */ +export function initializeBeneficiaireListeRougeAlert() { + const beneficiaireSelect = document.getElementById('id_beneficiaire'); + const alertElement = document.getElementById('beneficiaire-liste-rouge-alert'); + + if (!beneficiaireSelect || !alertElement) { + return; + } + + // Fonction pour vérifier et afficher l'alerte + const checkListeRouge = () => { + const selectedBeneficiaireId = beneficiaireSelect.value; + + // Vérifier si le bénéficiaire est en liste rouge via crviACFData + if (selectedBeneficiaireId && window.crviACFData && window.crviACFData.beneficiaires) { + const beneficiaireData = window.crviACFData.beneficiaires[selectedBeneficiaireId]; + + if (beneficiaireData && beneficiaireData.personne_en_liste_rouge) { + alertElement.style.display = 'block'; + } else { + alertElement.style.display = 'none'; + } + } else { + alertElement.style.display = 'none'; + } + }; + + // Écouter les changements du select + beneficiaireSelect.addEventListener('change', checkListeRouge); + + // Écouter aussi les événements Select2 si présent + if (window.jQuery) { + jQuery(beneficiaireSelect).on('select2:select', checkListeRouge); + jQuery(beneficiaireSelect).on('select2:clear', checkListeRouge); + } +} diff --git a/assets/js/modules/agenda-modal.js b/assets/js/modules/agenda-modal.js index 195f39d..842381a 100644 --- a/assets/js/modules/agenda-modal.js +++ b/assets/js/modules/agenda-modal.js @@ -8,7 +8,7 @@ import { initializeEntityCreators } from './agenda-entity-creator.js'; // Modules refactorisés import { clearDomCache, clearFormFields } from './agenda-modal-dom.js'; import { initializeModalButtons } from './agenda-modal-buttons.js'; -import { initializeSelect2, populateSelects, filterTraducteursByLangue, getIsUpdatingSelects, clearDisponibilitesCache } from './agenda-modal-select.js'; +import { initializeSelect2, populateSelects, filterTraducteursByLangue, getIsUpdatingSelects, clearDisponibilitesCache, initializeBeneficiaireListeRougeAlert } from './agenda-modal-select.js'; import { fillFormWithDate, fillFormWithEvent, resetForm, showFormErrors, clearFormErrors, handleEventFormSubmit } from './agenda-modal-forms.js'; import { fillViewBlock, updateModalDisplay, checkIfEventIsPast } from './agenda-modal-display.js'; @@ -282,6 +282,7 @@ export function openModal(mode, eventData = null) { initializeSelect2(); initializeTimeComfort(); initializeLangueFilter(); + initializeBeneficiaireListeRougeAlert(); // Initialiser les boutons (une seule fois) initializeModalButtons({ diff --git a/templates/modules/modals/event-modal.php b/templates/modules/modals/event-modal.php index eaa0c31..4ffa6e1 100644 --- a/templates/modules/modals/event-modal.php +++ b/templates/modules/modals/event-modal.php @@ -15,6 +15,12 @@ $crvi_is_front_context = ($crvi_agenda_context !== 'admin');