1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
|
<?php
/**
* Cette classe gère les interactions des utilisateurs (reservation, annulation d'une reservation) ainsi que leurs données personnelles
* (email, matricule, nom, prénom, ...)
*
* @Author : David Dubois
*
* @Param
*/
class Utilisateur
{
// Attributs
protected $id;
protected $nom;
protected $prenom;
protected $email;
protected $matricule;
protected $rang;
protected $db;
protected $reservations = array(); // réservations non encore envoyées par email
// Constructeur
public function __construct($id, $matricule, $nom, $prenom, $email, $rang)
{
$this->id = $id;
$this->matricule = $matricule;
$this->nom = $nom;
$this->prenom = $prenom;
$this->email = $email;
$this->rang = $rang;
$this->db = PDO2::getInstance()->db;
$this->initializeReservations();
}
/**
* Fonction "magique" utilisée par PHP pour serialiser un objet, on détermine quels attributs doivent être serialisés.
* ici j'exclus l'attribut db car un objet PDO n'est pas serialisable.
*/
public function __sleep()
{
return array('id', 'login', 'nom', 'prenom', 'email', 'matricule', 'rang', 'reservations');
}
/**
* Fonction "magique" utilisée par PHP pour déserialiser un objet.
* ici je récupère l'instance de la connexion PDO car elle n'avait pas pu être sérialisée.
*/
public function __wakeup()
{
$this->db = PDO2::getInstance()->db;
}
// Accesseurs
public function getNomComplet()
{
return substr($this->prenom, 0, 1) . '. ' . $this->nom;
}
public function getMatricule()
{
return $this->matricule;
}
public function getEmail()
{
return $this->email;
}
public function getRang()
{
return $this->rang;
}
public function getId()
{
return $this->id;
}
public function getReservations()
{
return $this->reservations;
}
// Méthodes
/**
* Effectue une proposition de réservation pour l'utilisateur
*
* @name: Utilisateur::reserver(matricule, jour, mois, annee, periode, commentaire = null)
* @access: public
*
* @params: matricule (string)
* jour (int)
* mois (int)
* annee (int)
* periode (string)
* commentaire (string ou null)
*
* @return: bool
*/
public function reserver($jour, $mois, $annee, $periode, $commentaire = null)
{
$id_jour = $annee . '_' . $mois . '_' . $jour . '_' . $periode;
//$occupation = '#ffcc00';
$nom_complet = $this->getNomComplet();
$requete = $this->db->prepare('INSERT INTO reservations(jour, statut, id_user, commentaire, machine)
VALUES(:id_jour, :statut, :utilisateur, :commentaire, :machine)'); //ajout par DD 21/07/2013
$requete->bindParam(':id_jour', $id_jour);
$requete->bindValue(':statut', 3);
$requete->bindParam(':utilisateur', $this->id);
//ajout par DD 21/07/2013
$requete->bindParam(':machine', $_SESSION['machine']);
// Si il n'y a pas de commentaire, on entre NULL dans la base de données
if (!$commentaire)
{
$requete->bindValue(':commentaire', null, PDO::PARAM_NULL);
}
else
{
$requete->bindParam(':commentaire', $commentaire, PDO::PARAM_STR);
}
// On vérifie que l'enregistrement a été effectué grace à la valeur de retour de PDOStatement::execute()
if (!$requete->execute())
{
$arr = $requete->errorInfo();
if (Config::read('debug'))
{
$_SESSION['erreurs']['reservation'] = 'Erreur : [SQLSTATE:' . $arr[0] . '][' . $arr[1] . '] ' . $arr[2];
}
else
{
if (substr($arr[2], 0, 15) == 'Duplicate entry')
{
$_SESSION['erreurs']['reservation'] = 'Réservation impossible, la salle est déjà réservée pour cette période.';
}
else
{
$_SESSION['erreurs']['reservation'] = 'Réservation non effectuée, une erreur s\'est produite';
}
}
return false;
}
$this->reservations[$id_jour] = new Reservation($id_jour, $commentaire);
$this->trierReservations();
return true;
}
public function annuler($id_jour)
{
/*
* On vérifie que l'utilisateur qui veut annuler une proposition est bien celui qui a fait cette proposition
* pour éviter que l'on puisse supprimer la proposition d'un autre.
* Un traitement sera fait en amont, en javascript pour ne pas afficher le menu contextuel sur une réservation
* n'appartenant pas à l'utilisateur.
*/
$verif = $this->db->prepare('SELECT id_user
FROM reservations
WHERE jour = :id_jour
AND machine = :machine'); //modifé par DD 21/7/13
$verif->bindParam(':id_jour', $id_jour);
$verif->bindParam(':machine', $_SESSION['machine']); //modifé par DD 21/7/13
$verif->execute();
$user = $verif->fetch();
if ($user['id_user'] == $this->id || $_SESSION['utilisateur']->getRang() == 'administrateur')
{
$requete = $this->db->prepare('DELETE FROM reservations
WHERE jour = :id_jour
AND machine = :machine'); //modifé par DD 21/7/13
$requete->bindParam(':id_jour', $id_jour);
$requete->bindParam(':machine', $_SESSION['machine']); //modifé par DD 21/7/13
$requete->execute();
$this->supprimerReservation($id_jour);
}
}
protected function initializeReservations()
{
$requete = "SELECT jour, commentaire
FROM reservations
WHERE id_user = :id
AND statut = 3
AND email_envoye = 0
AND machine = :machine"; //modifé par DD 21/7/13
$stmt = $this->db->prepare($requete);
$stmt->bindParam(":id", $this->id, PDO::PARAM_INT);
$stmt->bindParam(":machine", $_SESSION['machine'], PDO::PARAM_INT); //modifé par DD 21/7/13
$stmt->execute();
while ($res = $stmt->fetch())
{
$this->reservations[$res['jour']] = new Reservation($res['jour'], $res['commentaire']);
}
$this->trierReservations();
}
public function trierReservations()
{
function cmp(Reservation $a, Reservation $b)
{
if ($a->getOrder() == $b->getOrder()) {
return 0;
}
return ($a->getOrder() < $b->getOrder()) ? -1 : 1;
}
uasort($this->reservations, "cmp");
}
public function supprimerReservation($jour)
{
if (isset($this->reservations[$jour])) unset($this->reservations[$jour]);
}
}
?> |
Partager