Crvi/app/models/Incident_Model.php
2026-01-20 07:54:37 +01:00

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;
}
}