aucun problème pour réserver 1 -> aucun exemplaire ne peut être reservé 2 -> un ou des exemplaires peuvent être reservés et un au moins des exemplaires est disponible */ //--------------------------------------------------------- // Méthodes //--------------------------------------------------------- // <----------------- constructeur ------------------> function reservation($id_empr=0, $id_notice=0, $bulletinage=0) { $this->id_empr = $id_empr; $this->id_notice = $id_notice; if($bulletinage) { $this->id_bulletin = $bulletinage; $this->id_notice = 0; } } function check_expl_reservable($id_expl) { global $dbh; $query = "select e.expl_cb as cb, e.expl_id as id, s.statut_allow_resa as reservable, e.expl_notice as notice, e.expl_bulletin as bulletin, e.expl_note as note, expl_comment, s.statut_libelle as statut"; $query .= " from exemplaires e, docs_statut s"; $query .= " where e.expl_id=$id_expl"; $query .= " and s.idstatut=e.expl_statut"; $query .= " limit 1"; $result = mysql_query($query, $dbh); if (($expl = mysql_fetch_array($result))) { if (!$expl['reservable']) { // l'exemplaire est en consultation sur place ou pas réservable return 0; } } else { // exemplaire inconnu return 0; } // on check si l'exemplaire a une réservation $query = "select resa_idempr as empr, id_resa, resa_cb, concat(ifnull(concat(empr_nom,' '),''),empr_prenom) as nom_prenom, empr_cb from resa left join empr on resa_idempr=id_empr where resa_idnotice='$expl->notice' and resa_idbulletin='$expl->bulletin' order by resa_date limit 1"; $result = mysql_query($query, $dbh); if (mysql_num_rows($result)) { // l'exemplaire a une réservation return 0; } // l'exemplaire est disponible pour valider une réservation return 1; } // <----------------- add() : ajout d'une réservation ------------------> function add() { global $dbh; global $msg; // quelques vérifications d'usage if (!$this->empr_exists() || !$this->notice_exists() || $this->resa_exists() || $this->allready_loaned()) return FALSE; // check_statut inclus la possibilité de réserver ou pas les docs dispo if($this->check_statut()) return FALSE; // tout est OK, écriture de la réservation en table $query = "insert into resa (id_resa, resa_idempr, resa_idnotice, resa_idbulletin, resa_date) "; $query .= "values ("; if($this->id_notice) $query .= "'', '".$this->id_empr."', '".$this->id_notice."',0 , NOW())"; elseif ($this->id_bulletin) $query .= "'', '".$this->id_empr."',0 ,'".$this->id_bulletin."', NOW())"; $result = mysql_query($query, $dbh); if(!$result) { $this->message = "$query ". $msg["resa_no_create"]; } else { $this->message = $msg["resa_ajoutee"]; $this->id = mysql_insert_id($dbh); // Archivage de la résa: info lecteur et notice et nombre d'exemplaire $rqt = "SELECT * FROM empr WHERE id_empr=".$this->id_empr; $empr = mysql_fetch_object(mysql_query($rqt)); $id_notice=$id_bulletin=0; if($this->id_notice) { $id_notice= $this->id_notice; $query = "SELECT count(*) FROM exemplaires where expl_notice='$id_notice'"; }elseif($this->id_bulletin) { $id_bulletin=$this->id_bulletin; $query = "SELECT count(*) FROM exemplaires where expl_bulletin='$id_bulletin'"; } $nb_expl = mysql_result(mysql_query($query),0); $query = "INSERT INTO resa_archive SET resarc_id_empr = '".$this->id_empr."', resarc_idnotice = '".$id_notice."', resarc_idbulletin = '".$id_bulletin."', resarc_date = SYSDATE(), resarc_loc_retrait = '0', resarc_from_opac= '1', resarc_empr_cp ='".addslashes($empr->empr_cp)."', resarc_empr_ville = '".addslashes($empr->empr_ville)."', resarc_empr_prof = '".addslashes($empr->empr_prof)."', resarc_empr_year = '".$empr->empr_year."', resarc_empr_categ = '".$empr->empr_categ."', resarc_empr_codestat = '".$empr->empr_codestat ."', resarc_empr_sexe = '".$empr->empr_sexe."', resarc_empr_location = '".$empr->empr_location."', resarc_expl_nb = '$nb_expl' "; mysql_query($query, $dbh); $stat_id = mysql_insert_id($dbh); // Lier achive et résa pour suivre l'évolution de la résa $query = "update resa SET resa_arc='$stat_id' where id_resa='".$this->id."'"; mysql_query($query, $dbh); } } // <----------------- delete() : suppression d'une réservation ------------------> function delete() { global $dbh; global $msg; // suppression de la réservation de la table des réservations $id_notice=$id_bulletin=0; if($this->id_notice) { $id_notice=$this->id_notice; $query = "delete from resa where resa_idempr=".$this->id_empr." and resa_idnotice=".$this->id_notice; } elseif($this->id_bulletin) { $id_bulletin=$this->id_bulletin; $query = "delete from resa where resa_idempr=".$this->id_empr." and resa_idbulletin=".$this->id_bulletin; } $result = @mysql_query($query, $dbh); // archivage resa $rqt_arch = "UPDATE resa_archive SET resarc_anulee = 1 WHERE resarc_id_empr = '".$this->id_empr."' and resarc_idnotice = '".$id_notice."' and resarc_idbulletin = '".$id_bulletin."' "; mysql_query($rqt_arch, $dbh); if(!$result) { $this->message = $msg[resa_no_suppr]; return FALSE; } else { // on checke l'existence d'autres réservataires $query = "select e.empr_nom, e.empr_prenom, e.empr_cb from resa r, empr e"; $query .= " where r.resa_idempr=e.id_empr"; if($this->id_notice) $query .= " and r.resa_idnotice=".$this->id_notice; elseif($this->id_bulletin) $query .= " and r.resa_idbulletin=".$this->id_bulletin; $query .= " order by r.resa_date limit 1"; $result = mysql_query($query, $dbh); if(mysql_num_rows($result)) { // d'autres réservataires existent $next_empr = mysql_fetch_object($result); $this->message = $msg[resa_supprimee]; // on regarde la disponibilité du document // on compte le nombre total d'exemplaires pour la notice if($this->id_notice) $query = "select count(1) from exemplaires where expl_notice=".$this->id_notice; elseif($this->id_bulletin) $query = "select count(1) from exemplaires where expl_bulletin=".$this->id_bulletin; $result = mysql_query($query, $dbh); $total_ex = mysql_result($result, 0, 0); // on compte le nombre d'exemplaires sortis $query = "select count(1) from exemplaires e, pret p"; if($this->id_notice) $query .= " where e.expl_notice=".$this->id_notice; elseif($this->id_bulletin) $query .= " where e.expl_bulletin=".$this->id_bulletin; $query .= " and p.pret_idexpl=e.expl_id"; $result = mysql_query($query, $dbh); $total_sortis = mysql_result($result, 0, 0); // on en déduit le nombre d'exemplaires disponibles $total_dispo = $total_ex - $total_sortis; if($total_dispo) { $this->message .= " $msg[resa_dispo_suivant] "; $this->message .= $next_empr->empr_nom." ".$next_empr->empr_prenom.". (".$next_empr->empr_cb.")"; } return TRUE; } else { $this->message = $msg[resa_supprimee]; return TRUE; } } } // <----------------- empr_exists() : vérification de l'existence de l'utilisateur ------------------> function empr_exists() { global $dbh; global $msg; $query = "select count(1) from empr where id_empr=".$this->id_empr; $result = @mysql_query($query, $dbh); if(!@mysql_result($result, 0, 0)) { $this->message = "$msg[resa_no_empr]"; return FALSE; } return TRUE; } // <----------------- notice_exists() : vérification de l'existence de la notice ou du bulletinage ------------------> function notice_exists() { global $dbh; global $msg; if($this->id_notice) $query = "select count(1) from notices where notice_id=".$this->id_notice; elseif ($this->id_bulletin) $query = "select count(1) from bulletins where bulletin_id=".$this->id_bulletin; $result = @mysql_query($query, $dbh); if(!@mysql_result($result, 0, 0)) { $this->message = "$msg[resa_no_doc]"; return FALSE; } return TRUE; } // <----------------- resa_exists() : vérification de l'existence de la réservation ------------------> function resa_exists() { global $dbh; global $msg; $query = "select count(1) from resa where resa_idempr=".$this->id_empr; if($this->id_notice) $query .= " and resa_idnotice=".$this->id_notice; elseif ($this->id_bulletin) $query .= " and resa_idbulletin=".$this->id_bulletin; $result = @mysql_query($query, $dbh); if(@mysql_result($result, 0, 0)) { $this->message = "$msg[resa_deja_resa]"; return TRUE; } return FALSE; } // <----------------- allready_loaned() : on regarde si l'emprunteur n'a pas déjà ce document ------------------> function allready_loaned() { global $dbh; global $msg; $query = "select count(1) from pret p, exemplaires e"; $query .= " where p.pret_idempr=".$this->id_empr; $query .= " and p.pret_idexpl=e.expl_id"; if($this->id_notice) $query .= " and e.expl_notice=".$this->id_notice; elseif ($this->id_bulletin) $query .= " and e.expl_bulletin=".$this->id_bulletin; $result = @mysql_query($query, $dbh); if(@mysql_result($result, 0, 0)) { $this->message = "$msg[resa_deja_doc]"; return TRUE; } return FALSE; } // <----------------- check_statut() : le genre de choses qu'on peut attendre en retour ------------------> /* fonction complexe à rediscuter : cas possibles : - doc en consultation sur place uniquement - doc mixed : exemplaire(s) en consultation sur place et exemplaire(s) en circulation - doc en circulation ET disponible La solution retenue : fetcher tous les exemplaires attachés à la notice et définir des flags de situation */ function check_statut() { global $dbh; global $pmb_resa_dispo; // les résa de disponibles sont-elles autorisées ? global $msg; if ($this->id_notice) { $notice = new notice_affichage($this->id_notice,0,0,0); $notice->do_header(); $this->notice = $notice->notice_header; } elseif ($this->id_bulletin) { $bulletin = new bulletinage($this->id_bulletin, 0); $this->notice = $bulletin->display; } // on checke s'il y a des exemplaires prêtables $query = "select expl_id from exemplaires e, docs_statut s"; if($this->id_notice) $query .= " where s.idstatut=e.expl_statut and s.pret_flag=1 and e.expl_notice=".$this->id_notice; elseif ($this->id_bulletin) $query .= " where s.idstatut=e.expl_statut and s.pret_flag=1 and e.expl_bulletin=".$this->id_bulletin; $result = mysql_query($query, $dbh); if(!@mysql_num_rows($result)) { // aucun exemplaire n'est disponible pour le prêt $this->message .= "$msg[resa] : ".$this->notice."
$msg[resa_no_expl]"; return 1; } // on regarde si les résa de disponibles sont autorisées if ($pmb_resa_dispo=="1") return 0; // on checke si un exemplaire est disponible // aka. si un des exemplaires en circulation n'est pas mentionné dans la table des prêts, // c'est qu'il est disponible à la bibliothèque $list_dispo = ''; while($pretable = mysql_fetch_object($result)) { $req2 = "select count(1) from pret where pret_idexpl=".$pretable->expl_id; $req2_result = mysql_query($req2, $dbh); if(!mysql_result($req2_result, 0, 0)) { // l'exemplaire ne figure pas dans la table pret -> dispo // on récupère les données exemplaires pour constituer le message $req3 = "select p.expl_cote, s.section_libelle, l.location_libelle"; $req3 .= " from exemplaires p, docs_section s, docs_location l"; $req3 .= " where p.expl_id=".$pretable->expl_id; $req3 .= " and s.idsection=p.expl_section"; $req3 .= " and l.idlocation=p.expl_location limit 1"; $req3_result = mysql_query($req3, $dbh); $req3_obj = mysql_fetch_object($req3_result); if($req3_obj->expl_cote) { $list_dispo .= '
'.$req3_obj->location_libelle.'.'; $list_dispo .= $req3_obj->section_libelle.' cote : '.$req3_obj->expl_cote; } } } if($list_dispo) { $this->message = "$msg[resa_doc_dispo]
"; $this->message .= $this->notice.$list_dispo; return 2; } // rien de spécial return 0; } } # fin de déclaration classe reservation } # fin de définition