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, $cb='') { global $dbh; $this->id_empr=$id_empr; $this->id_notice=$id_notice; $this->service=new stdClass(); if ($bulletinage) { $this->id_bulletin=$bulletinage; $this->id_notice=0; } if ($cb) { $query="select expl_id,expl_notice,expl_bulletin from exemplaires where expl_cb='$cb' limit 1"; $result=mysql_query($query, $dbh); if (($expl=mysql_fetch_object($result))) { $this->id_notice=$expl->expl_notice; $this->id_bulletin=$expl->expl_bulletin; $this->expl_id=$expl->expl_id; $this->expl_cb=$cb; } else { $this->id_bulletin=0; $this->id_notice=0; } } 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) { $query='SELECT num_notice FROM bulletins WHERE bulletin_id='.$this->id_bulletin; $result=mysql_query($query, $dbh); if (mysql_num_rows($result)) { while ($bulletin=mysql_fetch_object($result)) { $notice=new notice_affichage($bulletin->num_notice, 0, 0, 0); $notice->bulletin_id=$this->id_bulletin; $notice->do_header(); $this->notice=$notice->notice_header; } } } } function get_empr_info() { global $dbh; $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='".$this->id_notice . "' and resa_idbulletin='".$this->id_bulletin . "' order by resa_date limit 1"; $result=mysql_query($query, $dbh); if (mysql_num_rows($result)) { if (($row=mysql_fetch_object($result))) { $link="empr_cb . "\">" . $row->nom_prenom . ""; return $link; } } return ''; } function get_empr_info_cb() { global $dbh; $query="select resa_idempr as empr, id_resa, resa_cb, concat(ifnull(concat(empr_nom,' '),''),empr_prenom) as nom_prenom, empr_cb from resa, empr where resa_cb='" . $this->expl_cb."' and resa_idempr=id_empr limit 1"; $result=mysql_query($query, $dbh); if (mysql_num_rows($result)) { if (($row=mysql_fetch_object($result))) { $link="empr_cb . "\">" . $row->nom_prenom . ""; return $link; } } return ''; } 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, docs_location l, docs_section se"; $query .= " where e.expl_id=$id_expl"; $query .= " and s.idstatut=e.expl_statut"; $query .= " and l.idlocation=e.expl_location"; $query .= " and se.idsection=e.expl_section"; $query .= " and s.statut_visible_opac=1"; $query .= " and l.location_visible_opac=1"; $query .= " and se.section_visible_opac=1"; $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; } function check_localisation_expl() { global $dbh, $msg, $pmb_transferts_actif, $transferts_choix_lieu_opac; // recup de la localisation de l'emprunteur $query="select empr_location from empr where id_empr=".$this->id_empr; $res=mysql_query($query, $dbh); $empr=mysql_fetch_object($res); $empr_location=$empr->empr_location; if($this->id_notice) $field_expl=" expl_notice=$this->id_notice "; else $field_expl=" expl_bulletin=$this->id_bulletin "; // vérifier si un exemplaire est disponible dans les localisation autorisées if ($pmb_transferts_actif && $transferts_choix_lieu_opac != 3) { $transf_possible=" and (s.transfert_flag=1 or expl_location=$empr_location )"; $requete="select expl_id from exemplaires e ,docs_statut s where $field_expl and expl_location in (select resa_loc from resa_loc where resa_emprloc=$empr_location ) and s.idstatut=e.expl_statut and s.statut_allow_resa=1 $transf_possible limit 1"; $res=mysql_query($requete, $dbh); if (mysql_num_rows($res)) { return TRUE; } $this->message="".$msg["resa_no_expl_in_location_transferable"].""; } else { $requete="select expl_id from exemplaires e ,docs_statut s where $field_expl and expl_location in (select resa_loc from resa_loc where resa_emprloc=$empr_location ) and s.idstatut=e.expl_statut and s.statut_allow_resa=1 limit 1"; $res=mysql_query($requete, $dbh); if (mysql_num_rows($res)) { return TRUE; } // recup de la liste des localisations ou l'emprunteur peut réserver un exemplaire $requete="select location_libelle from resa_loc, docs_location where resa_emprloc=$empr_location and idlocation=resa_loc"; $res=mysql_query($requete, $dbh); $locations=""; if (mysql_num_rows($res)) { while (($row=mysql_fetch_object($res))) { if($locations) $locations .=", "; $locations .= $row->location_libelle; } } $this->message="".str_replace("!!loc_liste!!", $locations,$msg["resa_no_expl_in_location"]) . ""; } return FALSE; } function can_reserve() { global $dbh; global $msg; global $quota_resa; global $pmb_transferts_actif, $transferts_choix_lieu_opac, $pmb_location_reservation; $this->service->error=""; if (!$this->empr_exists()) { $this->service->error="check_empr_exists"; return FALSE; } if (!$this->notice_exists()) { $this->service->error="check_notice_exists"; return FALSE; } //les quotas if (!$quota_resa) { //Si un quota atteint (check_quota inclu le message + la mise à 0 ou 1 de $this->force) if (($ret=$this->check_quota())) { $this->service->message=$ret["ERROR"]; $this->service->error="check_quota"; return FALSE; } } if ($this->resa_exists()) { $this->service->error="check_resa_exists"; return FALSE; } if ($this->allready_loaned()) { $this->service->error="check_allready_loaned"; return FALSE; } // check_statut inclus la possibilité de réserver ou pas les docs dispo if ($this->check_statut()) { // $this->service->error est affecté dans check_statut() return FALSE; } if ($pmb_location_reservation) { if (!$this->check_localisation_expl()) { $this->service->error="check_localisation_expl"; return FALSE; } } return TRUE; } // <----------------- add() : ajout d'une réservation ------------------> function add($idloc_retrait=0) { global $dbh; global $msg; global $quota_resa; global $pmb_transferts_actif, $transferts_choix_lieu_opac, $pmb_location_reservation; $this->service->error=""; if (!$this->empr_exists()) { $this->service->error="check_empr_exists"; return FALSE; } if (!$this->notice_exists()) { $this->service->error="check_notice_exists"; return FALSE; } //les quotas if (!$quota_resa) { //Si un quota atteint (check_quota inclu le message + la mise à 0 ou 1 de $this->force) if (($ret=$this->check_quota())) { $this->service->message=$ret["ERROR"]; $this->service->error="check_quota"; return FALSE; } } if ($this->resa_exists()) { $this->service->error="check_resa_exists"; return FALSE; } if ($this->allready_loaned()) { $this->service->error="check_allready_loaned"; return FALSE; } // check_statut inclus la possibilité de réserver ou pas les docs dispo if ($this->check_statut()) { // $this->service->error est affecté dans check_statut() return FALSE; } if ($pmb_location_reservation) { if (!$this->check_localisation_expl()) { $this->service->error="check_localisation_expl"; return FALSE; } } // tout est OK, écriture de la réservation en table // On récupère d'abord la durée $t=get_time($this->id_empr, $this->id_notice, $this->id_bulletin); $query="INSERT INTO resa (id_resa, resa_idempr, resa_idnotice, resa_idbulletin, resa_date, resa_loc_retrait) "; $query .= "VALUES ('', '" . $this->id_empr . "', "; if ($this->id_notice) $query .= "'".$this->id_notice."',0 ,"; elseif ($this->id_bulletin) $query .= "0, '" . $this->id_bulletin . "',"; $query .= " SYSDATE(),"; if (($pmb_transferts_actif == "1") && ($transferts_choix_lieu_opac == "1")) { $rqt="SELECT empr_location FROM empr WHERE id_empr=".$this->id_empr; $idloc_retrait=mysql_result(mysql_query($rqt), 0); } $query .= "'$idloc_retrait' )"; $result=mysql_query($query, $dbh); if (!$result) { $this->message="$query -> $msg[resa_no_create]"; $this->service->error="resa_no_create"; return FALSE; } else { $this->id=mysql_insert_id($dbh); $this->message=$msg["resa_ajoutee"]; // 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='$idloc_retrait', resarc_from_opac= 0, 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); } return TRUE; } // <----------------- 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 $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; } } } // <----------------- check_quota() : vérification du dépassement de quota --------------------------> function check_quota() { $error=check_quota_resa($this->id_empr, $this->id_notice,$this->id_bulletin); if ($error["ERROR"]) { $this->message=$error["MESSAGE"]; $this->force=$error["FORCE"]; } return $error["ERROR"]; } // <----------------- 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 $opac_resa_dispo; // les résa de disponibles sont-elles autorisées ? global $msg, $pmb_location_reservation; // on checke s'il y a des exemplaires prêtables $query="select expl_id ,expl_cb from exemplaires e, docs_statut s"; if ($this->id_notice) $query .= " where s.idstatut=e.expl_statut and s.statut_allow_resa=1 and e.expl_notice=".$this->id_notice; elseif ($this->id_bulletin) $query .= " where s.idstatut=e.expl_statut and s.statut_allow_resa=1 and e.expl_bulletin=".$this->id_bulletin; if ($pmb_location_reservation) { $query_loc="select empr_location from empr where id_empr=".$this->id_empr; $res=mysql_query($query_loc, $dbh); $empr=mysql_fetch_object($res); $empr_location=$empr->empr_location; $query .= " and e.expl_location in (select resa_loc from resa_loc where resa_emprloc=$empr_location) "; } $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]"; $this->service->error="check_statut"; return 1; } // on regarde si les résa de disponibles sont autorisées if ($opac_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 ($reservable=mysql_fetch_object($result)) { $req2="select count(1) from pret where pret_idexpl=".$reservable->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=".$reservable->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) { // Si résa validé il n'est pas disponible en prêt $req4="select count(1) from resa where resa_cb='".$reservable->expl_cb."' and resa_confirmee='1'"; $req4_result=mysql_query($req4, $dbh); if (!mysql_result($req4_result, 0, 0)) { $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; $this->service->error="check_doc_dispo"; return 2; } // rien de spécial return 0; } function get_resa_cb() { global $dbh; global $pmb_resa_dispo; // les résa de disponibles sont-elles autorisées ? global $msg, $pmb_location_reservation, $deflt_docs_location, $pmb_transferts_actif, $transferts_choix_lieu_opac; $this->expl_affectable=array(); $this->expl_reservable=array(); $this->expl_transferable=array(); // on check s'il y a des exemplaires prêtables $query="select expl_id,expl_cb from exemplaires e, docs_statut s"; if ($this->id_notice) $query .= " where s.idstatut=e.expl_statut and s.statut_allow_resa=1 and e.expl_notice=".$this->id_notice; elseif ($this->id_bulletin) $query .= " where s.idstatut=e.expl_statut and s.statut_allow_resa=1 and e.expl_bulletin=".$this->id_bulletin; if ($pmb_location_reservation) { $query_loc="select empr_location from empr where id_empr=".$this->id_empr; $res=mysql_query($query_loc, $dbh); $empr=mysql_fetch_object($res); $empr_location=$empr->empr_location; $query .= " and e.expl_location in (select resa_loc from resa_loc where resa_emprloc=$empr_location) "; } $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; } 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, expl_location"; $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) { // Si résa validé il n'est pas disponible en prêt $req4="select count(1) from resa where resa_cb='".addslashes($pretable->expl_cb)."' and resa_confirmee='1'"; $req4_result=mysql_query($req4, $dbh); if (!mysql_result($req4_result, 0, 0)) { $this->expl_affectable[]=$pretable->expl_cb; } if ($req3_obj->expl_location != $deflt_docs_location) { $this->expl_transferable[]=$pretable->expl_cb; } } } $this->expl_reservable[]=$pretable->expl_cb; } // Calcul du rang de réservation du lecteur $rank=1; if ($pmb_transferts_actif == "1") { switch ($transferts_choix_lieu_opac) { case "1": //retrait de la resa sur lieu choisi par le lecteur $where=" AND resa_loc_retrait=" . $deflt_docs_location; break; case "2": //retrait de la resa sur lieu fixé $where=" AND resa_loc_retrait=" . $deflt_docs_location; break; case "3": //retrait de la resa sur lieu exemplaire $from=" ,exemplaires "; $where=" AND expl_cb='" . $pretable->expl_cb."' and expl_location=" . $deflt_docs_location; break; default: //retrait de la resa sur lieu lecteur $from=" ,empr "; $where=" AND resa_idempr=id_empr and empr_location=".$deflt_docs_location; break; } //switch $transferts_choix_lieu_opac } // chercher le premier (par ordre de rang, donc de date de début de résa, non validé $rqt="SELECT id_resa, resa_idempr,resa_loc_retrait FROM resa $from WHERE resa_idnotice='" . $this->id_notice."' AND resa_idbulletin='" . $this->id_bulletin. "' AND resa_cb='' AND resa_date_fin='0000-00-00' $where ORDER BY resa_date "; /* if($pmb_location_reservation) { $rqt="SELECT resa_idempr FROM resa ,empr WHERE resa_idnotice='".$this->id_notice."' AND resa_idbulletin='".$this->id_bulletin."' and resa_idempr=id_empr and empr_location in (select resa_loc from resa_loc where resa_emprloc=$empr_location) ORDER BY resa_date"; } else { $rqt="SELECT resa_idempr FROM resa WHERE resa_idnotice='".$this->id_notice."' AND resa_idbulletin='".$this->id_bulletin."' ORDER BY resa_date"; } */ $result=mysql_query($rqt, $dbh); while (($resa=mysql_fetch_object($result))) { if($resa->resa_idempr == $this->id_empr) break; $rank++; } $this->resa_rank=$rank; //print $query ."
".$rank."
"; // rien de spécial return 0; } } # fin de déclaration classe reservation} # fin de définition }