211 lines
6.8 KiB
PHP
211 lines
6.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace ESI_CRVI_AGENDA\models;
|
|
|
|
class CRVI_Incident_Model extends Main_Model {
|
|
public $id;
|
|
public $beneficiaire_id;
|
|
public $event_id;
|
|
public $resume_incident;
|
|
public $commentaire_incident;
|
|
public $created_at;
|
|
|
|
public function __construct($data = []) {
|
|
foreach ($data as $key => $value) {
|
|
if (property_exists($this, $key)) {
|
|
$this->$key = $value;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Charger un incident par ID
|
|
* @param int $id
|
|
* @return self|null
|
|
*/
|
|
public static function load($id) {
|
|
global $wpdb;
|
|
$table_name = $wpdb->prefix . 'crvi_agenda_incident';
|
|
|
|
$incident = $wpdb->get_row($wpdb->prepare(
|
|
"SELECT * FROM $table_name WHERE id = %d",
|
|
$id
|
|
));
|
|
|
|
if (!$incident) {
|
|
return null;
|
|
}
|
|
|
|
return new self([
|
|
'id' => $incident->id,
|
|
'beneficiaire_id' => $incident->beneficiaire_id,
|
|
'event_id' => $incident->event_id,
|
|
'resume_incident' => $incident->resume_incident,
|
|
'commentaire_incident' => $incident->commentaire_incident,
|
|
'created_at' => $incident->created_at ?? null,
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Créer un incident
|
|
* @param array $data
|
|
* @return int|WP_Error ID de l'incident créé ou erreur
|
|
*/
|
|
public static function create(array $data) {
|
|
global $wpdb;
|
|
$table_name = $wpdb->prefix . 'crvi_agenda_incident';
|
|
|
|
// Validation des champs requis
|
|
if (empty($data['event_id'])) {
|
|
return new \WP_Error('validation_error', 'L\'ID de l\'événement est requis', ['status' => 400]);
|
|
}
|
|
|
|
if (empty($data['beneficiaire_id'])) {
|
|
return new \WP_Error('validation_error', 'L\'ID du bénéficiaire est requis', ['status' => 400]);
|
|
}
|
|
|
|
if (empty($data['resume_incident'])) {
|
|
return new \WP_Error('validation_error', 'Le résumé de l\'incident est requis', ['status' => 400]);
|
|
}
|
|
|
|
// Préparer les données pour l'insertion
|
|
$insert_data = [
|
|
'beneficiaire_id' => (int) $data['beneficiaire_id'],
|
|
'event_id' => (int) $data['event_id'],
|
|
'resume_incident' => sanitize_text_field($data['resume_incident']),
|
|
'commentaire_incident' => isset($data['commentaire_incident']) ? sanitize_textarea_field($data['commentaire_incident']) : null,
|
|
];
|
|
|
|
// Insérer en base
|
|
$result = $wpdb->insert(
|
|
$table_name,
|
|
$insert_data,
|
|
[
|
|
'%d', // beneficiaire_id
|
|
'%d', // event_id
|
|
'%s', // resume_incident
|
|
'%s', // commentaire_incident
|
|
]
|
|
);
|
|
|
|
if ($result === false) {
|
|
return new \WP_Error('database_error', 'Erreur lors de l\'insertion de l\'incident en base de données', ['status' => 500]);
|
|
}
|
|
|
|
return $wpdb->insert_id;
|
|
}
|
|
|
|
/**
|
|
* Récupérer tous les incidents avec filtres optionnels
|
|
* @param array $filters Filtres optionnels (event_id, beneficiaire_id)
|
|
* @return array
|
|
*/
|
|
public static function get_all($filters = []) {
|
|
global $wpdb;
|
|
$table_name = $wpdb->prefix . 'crvi_agenda_incident';
|
|
|
|
$where_clauses = [];
|
|
$where_values = [];
|
|
|
|
// Construire les clauses WHERE selon les filtres
|
|
if (!empty($filters['event_id'])) {
|
|
$where_clauses[] = 'event_id = %d';
|
|
$where_values[] = (int) $filters['event_id'];
|
|
}
|
|
|
|
if (!empty($filters['beneficiaire_id'])) {
|
|
$where_clauses[] = 'beneficiaire_id = %d';
|
|
$where_values[] = (int) $filters['beneficiaire_id'];
|
|
}
|
|
|
|
// Construire la requête
|
|
$query = "SELECT * FROM $table_name";
|
|
if (!empty($where_clauses)) {
|
|
$query .= ' WHERE ' . implode(' AND ', $where_clauses);
|
|
}
|
|
$query .= ' ORDER BY id DESC';
|
|
|
|
// Exécuter la requête
|
|
if (!empty($where_values)) {
|
|
$incidents = $wpdb->get_results($wpdb->prepare($query, $where_values));
|
|
} else {
|
|
$incidents = $wpdb->get_results($query);
|
|
}
|
|
|
|
$result = [];
|
|
foreach ($incidents as $incident) {
|
|
$result[] = new self([
|
|
'id' => $incident->id,
|
|
'beneficiaire_id' => $incident->beneficiaire_id,
|
|
'event_id' => $incident->event_id,
|
|
'resume_incident' => $incident->resume_incident,
|
|
'commentaire_incident' => $incident->commentaire_incident,
|
|
'created_at' => $incident->created_at ?? null,
|
|
]);
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Récupérer tous les incidents pour un événement
|
|
* @param int $event_id
|
|
* @return array
|
|
*/
|
|
public static function get_by_event($event_id) {
|
|
global $wpdb;
|
|
$table_name = $wpdb->prefix . 'crvi_agenda_incident';
|
|
|
|
$incidents = $wpdb->get_results($wpdb->prepare(
|
|
"SELECT * FROM $table_name WHERE event_id = %d ORDER BY id DESC",
|
|
$event_id
|
|
));
|
|
|
|
$result = [];
|
|
foreach ($incidents as $incident) {
|
|
$result[] = new self([
|
|
'id' => $incident->id,
|
|
'beneficiaire_id' => $incident->beneficiaire_id,
|
|
'event_id' => $incident->event_id,
|
|
'resume_incident' => $incident->resume_incident,
|
|
'commentaire_incident' => $incident->commentaire_incident,
|
|
'created_at' => $incident->created_at ?? null,
|
|
]);
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Récupérer tous les incidents pour un bénéficiaire
|
|
* @param int $beneficiaire_id
|
|
* @return array
|
|
*/
|
|
public static function get_by_beneficiaire($beneficiaire_id) {
|
|
global $wpdb;
|
|
$table_name = $wpdb->prefix . 'crvi_agenda_incident';
|
|
|
|
$incidents = $wpdb->get_results($wpdb->prepare(
|
|
"SELECT * FROM $table_name WHERE beneficiaire_id = %d ORDER BY id DESC",
|
|
$beneficiaire_id
|
|
));
|
|
|
|
$result = [];
|
|
foreach ($incidents as $incident) {
|
|
$result[] = new self([
|
|
'id' => $incident->id,
|
|
'beneficiaire_id' => $incident->beneficiaire_id,
|
|
'event_id' => $incident->event_id,
|
|
'resume_incident' => $incident->resume_incident,
|
|
'commentaire_incident' => $incident->commentaire_incident,
|
|
'created_at' => $incident->created_at ?? null,
|
|
]);
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
}
|
|
|