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 ------------------> public function __construct($id_empr=0, $id_notice=0, $bulletinage=0, $cb='') { $this->id_empr = $id_empr+0; $this->id_notice = $id_notice+0; $this->service = new stdClass(); if($bulletinage) { $this->id_bulletin = $bulletinage; $this->id_notice = 0; } $this->fetch_data(); if($cb) { $query = "select expl_id,expl_notice,expl_bulletin from exemplaires where expl_cb='$cb' limit 1"; $result = pmb_mysql_query($query); if (($expl = pmb_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; $this->expl_cb = '0'; } } } protected function fetch_data() { if($this->id_empr && ($this->id_notice || $this->id_bulletin)) { $query = "select * from resa where resa_idempr = ".$this->id_empr." AND resa_idnotice = ".$this->id_notice." AND resa_idbulletin = ".$this->id_bulletin; $result = pmb_mysql_query($query); if($query && pmb_mysql_num_rows($result)) { $row = pmb_mysql_fetch_object($result); $this->id = $row->id_resa; $this->date = $row->resa_date; $this->formatted_date = format_date($this->date); $this->date_debut = $row->resa_date_debut; $this->formatted_date_debut = format_date($this->date_debut); $this->date_fin = $row->resa_date_fin; $this->formatted_date_fin = format_date($this->date_fin); $this->confirmee = $row->resa_confirmee; $this->loc_retrait = $row->resa_loc_retrait; $this->resa_pnb_flag = $row->resa_pnb_flag; $this->expl_cb = $row->resa_cb; } } } public function get_empr_info() { $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 = pmb_mysql_query($query); if (pmb_mysql_num_rows($result)) { if(($row=pmb_mysql_fetch_object($result))) { $link="empr_cb."\">".$row->nom_prenom.""; return $link; } } return ''; } public function get_empr_info_cb() { $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 = pmb_mysql_query($query); if (pmb_mysql_num_rows($result)) { if(($row=pmb_mysql_fetch_object($result))) { $link="empr_cb."\">".$row->nom_prenom.""; return $link; } } return ''; } public static function check_expl_reservable($id_expl) { $id_expl += 0; $query = "select e.expl_cb as cb, e.expl_id as id, s.pret_flag as pretable, 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 = pmb_mysql_query($query); if (($expl = pmb_mysql_fetch_array($result))) { if (!$expl['pretable']) { // l'exemplaire est en consultation sur place return 0; } } else { // exemplaire inconnu return 0; } // on check si l'exemplaire est déjà en prêt $query = "select pret_idempr from pret where pret_idexpl=$id_expl limit 1"; $result = pmb_mysql_query($query); if (@ pmb_mysql_num_rows($result)) { // l'exemplaire est déjà en prêt 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 = pmb_mysql_query($query); if (pmb_mysql_num_rows($result)) { // l'exemplaire a une réservation return 0; } // l'exemplaire est disponible pour valider une réservation return 1; } public function get_query_expl_lendable() { global $pmb_location_reservation; $query = "select expl_id ,expl_cb from exemplaires e, docs_statut s where s.idstatut=e.expl_statut and s.statut_allow_resa=1"; $query .= " and ".$this->get_restrict_expl_notice_query(); if($pmb_location_reservation) { $query_loc = "select empr_location from empr where id_empr=".$this->id_empr; $res = pmb_mysql_query($query_loc); $empr = pmb_mysql_fetch_object($res); $query.=" and e.expl_location in (select resa_loc from resa_loc where resa_emprloc=".$empr->empr_location.") "; } return $query; } public function check_localisation_expl() { global $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 = pmb_mysql_query($query); $empr = pmb_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 = pmb_mysql_query($requete); if(pmb_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 = pmb_mysql_query($requete); if(pmb_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 = pmb_mysql_query($requete); $locations=""; if(pmb_mysql_num_rows($res)) { while(($row=pmb_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; } public function can_reserve() { 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) $ret=$this->check_quota(); if ($ret["ERROR"]) { $this->service->message=$ret["MESSAGE"]; $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 ------------------> public function add($idloc_retrait=0, $force=0) { global $msg; global $quota_resa; global $pmb_transferts_actif, $transferts_choix_lieu_opac,$pmb_location_reservation; $this->service->error=""; if(!$force){ 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) $ret = $this->check_quota(); if ($ret["ERROR"]) { $this->service->message=$ret["MESSAGE"]; $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=static::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, resa_pnb_flag) "; $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 = pmb_mysql_result(pmb_mysql_query($rqt),0); } $query .= "'$idloc_retrait', '" . $this->resa_pnb_flag . "' )"; $result = pmb_mysql_query($query); if(!$result) { $this->message = "$query -> $msg[resa_no_create]"; $this->service->error="resa_no_create"; return FALSE; }else { $this->id = pmb_mysql_insert_id(); $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 = pmb_mysql_fetch_object(pmb_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 = pmb_mysql_result(pmb_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', resarc_pnb_flag = '" . $this->resa_pnb_flag . "' "; pmb_mysql_query($query); $stat_id = pmb_mysql_insert_id(); // 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."'"; pmb_mysql_query($query); } return TRUE; } // <----------------- delete() : suppression d'une réservation ------------------> public function delete() { 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 = @pmb_mysql_query($query); // 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."' "; pmb_mysql_query($rqt_arch); 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 = pmb_mysql_query($query); if(pmb_mysql_num_rows($result)) { // d'autres réservataires existent $next_empr = pmb_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 = pmb_mysql_query($query); $total_ex = pmb_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 = pmb_mysql_query($query); $total_sortis = pmb_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 --------------------------> public function check_quota() { global $msg; global $pmb_quotas_avances; global $pmb_resa_quota_pret_depasse; //Initialisation résultat $error=array(); $error["ERROR"]=false; //Si les quotas avancés sont autorisés if ($pmb_quotas_avances) { $struct=array(); //Quota de notice ou bulletin ? if ($this->id_notice) { $quota_type="BOOK_NMBR_QUOTA"; $struct["NOTI"]=$this->id_notice; $elt_name="NOTICETYPE"; } else { $quota_type="BOOK_NMBR_SERIAL_QUOTA"; $struct["NOTI"] = bulletinage::get_notice_id_from_id($this->id_bulletin); $struct["BULL"]=$this->id_bulletin; $elt_name="BULLETINTYPE"; } //Initialisation du quota $qt=new quota($quota_type); $struct["READER"]=$this->id_empr; //Si résa bloquée en cas de dépassement de quota de prêt if (!$pmb_resa_quota_pret_depasse) { //Le quota de prêt est-il atteint pour cette notice ou bulletin //Récupération de l'élément indirect à tester $elt=$qt->get_element_by_name($elt_name); //Récupération de l'exemplaire le plus défavorable associé à la réservation $object_id=$qt->get_object_for_indirect_element(quota::$_quotas_[$qt->descriptor]['_elements_'][$elt],$struct); //Initialisation du quota de prêt $qt_pret=new quota("LEND_NMBR_QUOTA"); $struct_pret=array(); $struct_pret["READER"]=$this->id_empr; $struct_pret["EXPL"]=$object_id; $struct_pret["NOTI"] = exemplaire::get_expl_notice_from_id($object_id); $struct_pret["BULL"] = exemplaire::get_expl_bulletin_from_id($object_id); $r=$qt_pret->check_quota($struct_pret); } else $r=false; //Si quota de prêt non violé alors on regarde les quotas de réservation if (!$r) { //Vérification $r=$qt->check_quota($struct); //Si quota violé if ($r) { $error["ERROR"]=true; //Erreur $error["MESSAGE"]=$qt->error_message; //Peut-on forcer ou pas la résa $error["FORCE"] = $qt->force; } } else { $error["ERROR"]=true; //Erreur $error["MESSAGE"]=$qt_pret->error_message."
".$msg["resa_quota_pret_error"]; //Peut-on forcer ou pas la résa $r_force=$qt->check_quota($struct); if($r_force){ $error["FORCE"] = $qt->force; } else $error["FORCE"] = 0; } } if ($error["ERROR"]) { $this->message=$error["MESSAGE"]; $this->force=$error["FORCE"]; } return $error; } // <----------------- empr_exists() : vérification de l'existence de l'utilisateur ------------------> public function empr_exists() { global $msg; $query = "select count(1) from empr where id_empr=".$this->id_empr; $result = @pmb_mysql_query($query); if(!@pmb_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 ------------------> public function notice_exists() { 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 = @pmb_mysql_query($query); if(!@pmb_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 ------------------> public function resa_exists() { 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 = @pmb_mysql_query($query); if(@pmb_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 ------------------> public function allready_loaned() { 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 = @pmb_mysql_query($query); if(@pmb_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 */ public function check_statut() { global $pmb_resa_dispo; // les résa de disponibles sont-elles autorisées ? global $msg,$pmb_location_reservation; if ($this->id_notice) { $notice = new mono_display($this->id_notice, 0); $this->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 = $this->get_query_expl_lendable(); $result = pmb_mysql_query($query); if(!@pmb_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; } // Réservations possibles de documents sortis ? if($pmb_resa_dispo=='2') { $nb_expl_available = count(expl_dispo($this->id_notice, $this->id_bulletin)); if(!$nb_expl_available) return 1; } // on regarde si les résa de disponibles sont autorisées if ($pmb_resa_dispo) 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 = pmb_mysql_fetch_object($result)) { $req2 = "select count(1) from pret where pret_idexpl=".$pretable->expl_id; $req2_result = pmb_mysql_query($req2); if(!pmb_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 = pmb_mysql_query($req3); $req3_obj = pmb_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='".$pretable->expl_cb."' and resa_confirmee='1'"; $req4_result = pmb_mysql_query($req4); if(!pmb_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; } public function get_resa_cb() { 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 = $this->get_query_expl_lendable(); $result = pmb_mysql_query($query); if(!@pmb_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 = pmb_mysql_fetch_object($result))) { $req2 = "select count(1) from pret where pret_idexpl=".$pretable->expl_id; $req2_result = pmb_mysql_query($req2); if(!pmb_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 = pmb_mysql_query($req3); $req3_obj = pmb_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 = pmb_mysql_query($req4); if(!pmb_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; $from= ""; $where = ""; 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 = pmb_mysql_query($rqt); while(($resa=pmb_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; } public function transfert_resa_dispo($loc){ global $msg; $loc=intval($loc); $rqt = "SELECT ". "trim(concat(ifnull(notices_m.tit1,''),ifnull(notices_s.tit1,''),' ',ifnull(bulletin_numero,''), if (mention_date, concat(' (',mention_date,')') ,''))) as tit, ". "expl_cb, ". "location_libelle, ". "expl_id , lender_libelle ". "FROM (((exemplaires ". "LEFT JOIN notices AS notices_m ON expl_notice=notices_m.notice_id) ". "LEFT JOIN bulletins ON expl_bulletin = bulletins.bulletin_id) ". "LEFT JOIN notices AS notices_s ON bulletin_notice = notices_s.notice_id) ". "INNER JOIN docs_location ON expl_location=idlocation ". "INNER JOIN docs_statut ON expl_statut=idstatut ". "INNER JOIN lenders ON idlender=expl_owner " . "WHERE ". "pret_flag=1 ". "and transfert_flag=1 ". "AND expl_notice=".$this->id_notice." ". "AND expl_bulletin=".$this->id_bulletin." ". "AND expl_location<>".$loc." ". "ORDER BY transfert_ordre"; $res = pmb_mysql_query($rqt); $count=0; if ($res) { while (($data = pmb_mysql_fetch_array($res))) { $sel_expl=1; $statut=""; $req_res = "select count(1) from resa where resa_cb='".addslashes($data[1])."' and resa_confirmee='1'"; $req_res_result = pmb_mysql_query($req_res); if(pmb_mysql_result($req_res_result, 0, 0)) { $sel_expl=0; } $req_pret = "select date_format(pret_retour, '".$msg["format_date"]."') as aff_pret_retour from pret where pret_idexpl='".$data[3]."' "; $req_pret_result = pmb_mysql_query($req_pret); if(pmb_mysql_num_rows($req_pret_result)) { $sel_expl=0; } $req="select count(1) from transferts_demande, transferts where etat_demande ='0' and num_expl='".$data[3]."' and etat_transfert=0 and id_transfert=num_transfert "; $r = pmb_mysql_query($req); if(pmb_mysql_result($r, 0, 0)) { $sel_expl=0; } if($sel_expl) { $count++; }else{ } } } return $count; } public function set_on_empr_fiche($on_empr_fiche=false) { $this->on_empr_fiche = $on_empr_fiche; } public function get_restrict_expl_location_query($filter_loc_retrait=false) { global $pmb_lecteurs_localises; global $deflt_resas_location; global $pmb_transferts_actif, $transferts_choix_lieu_opac; global $f_loc, $f_dispo_loc; $resa_expl_location = $f_loc; $sql_expl_loc = ''; if ($pmb_lecteurs_localises && !$this->on_empr_fiche){ if ($resa_expl_location=="") $resa_expl_location = $deflt_resas_location; if ($filter_loc_retrait && $resa_expl_location==0 && $this->loc_retrait) $resa_expl_location = $this->loc_retrait; if ($resa_expl_location && $f_dispo_loc) $sql_expl_loc= " and (expl_location='".$resa_expl_location."' or expl_location='".$f_dispo_loc."') "; elseif ($resa_expl_location) $sql_expl_loc .= " and expl_location='".$resa_expl_location."' "; elseif ($f_dispo_loc) $sql_expl_loc= " and expl_location='".$f_dispo_loc."' "; } if ($pmb_transferts_actif=="1" && $resa_expl_location && !$this->on_empr_fiche) { switch ($transferts_choix_lieu_opac) { case "1": //retrait de la resa sur lieu choisi par le lecteur break; case "2": //retrait de la resa sur lieu fixé break; case "3": //retrait de la resa sur lieu exemplaire if (!$this->on_empr_fiche) { if ($resa_expl_location && $f_dispo_loc) $sql_expl_loc .= " and (expl_location='".$resa_expl_location."' or expl_location='".$f_dispo_loc."') "; elseif ($resa_expl_location) $sql_expl_loc .= " and expl_location='".$resa_expl_location."' "; elseif ($f_dispo_loc) $sql_expl_loc .= " and expl_location='".$f_dispo_loc."' "; } break; default: //retrait de la resa sur lieu lecteur if (!$this->on_empr_fiche) { if ($resa_expl_location && $f_dispo_loc) $sql_expl_loc .= " and (expl_location='".$resa_expl_location."' or expl_location='".$f_dispo_loc."') "; elseif ($resa_expl_location) $sql_expl_loc .= " and expl_location='".$resa_expl_location."' "; elseif ($f_dispo_loc) $sql_expl_loc .= " and expl_location='".$f_dispo_loc."' "; } break; } } return $sql_expl_loc; } public function get_restrict_expl_notice_query() { if ($this->id_notice) { return " expl_notice=".$this->id_notice; } elseif ($this->id_bulletin) { return " expl_bulletin=".$this->id_bulletin; } else { //pour le bien de la construction SQL, ceci n'est pas censé se produire return " (expl_notice=0 and expl_bulletin=0)"; } } /** * On retourne la requête concernant les exemplaires prêtables pour la notice * @param number $location Localisation * @param string $outside Pour la localisation ou en dehors * @return string */ public function get_expl_lendable_query($location=0, $outside=false, $filter_loc_retrait=false) { $query = "SELECT * FROM exemplaires, docs_statut WHERE expl_statut=idstatut AND statut_allow_resa=1 "; if($location) { if($outside) { $query .= " AND expl_location <> ".$location; } else { $query .= " AND expl_location = ".$location; } } else { $query .= $this->get_restrict_expl_location_query($filter_loc_retrait); } $query .= " AND ".$this->get_restrict_expl_notice_query(); return $query; } /** * On retourne les exemplaires prêtables pour la notice * @param number $location Localisation * @param string $outside Pour la localisation ou en dehors * @return array */ public function get_expl_lendable($location=0, $outside=false) { $expl_lendable = array(); $query = $this->get_expl_lendable_query($location, $outside); $result = pmb_mysql_query($query); while($row = pmb_mysql_fetch_object($result)) { $expl_lendable[] = $row; } return $expl_lendable; } /** * On compte le nombre total d'exemplaires prêtables pour la notice * @param number $location Localisation * @param string $outside Pour la localisation ou en dehors * @return string */ public function get_number_expl_lendable($location=0, $outside=false) { $query = $this->get_expl_lendable_query($location, $outside); $tresult = pmb_mysql_query($query); return pmb_mysql_num_rows($tresult); } public function get_number_expl_transferts_lendable($location=0, $outside=false) { $query = $this->get_expl_lendable_query($location, $outside, true); $tresult = pmb_mysql_query($query); return pmb_mysql_num_rows($tresult); } /** * On compte le nombre d'exemplaires sortis */ public function get_number_expl_out() { $query = "SELECT count(1) as qte FROM exemplaires , pret WHERE pret_idexpl=expl_id ".$this->get_restrict_expl_location_query(); $query .= " AND ".$this->get_restrict_expl_notice_query(); $tresult = pmb_mysql_query($query); return pmb_mysql_result($tresult, 0, 0); } /** * On compte le nombre d'exemplaires en circulation */ public function get_number_expl_in_circ() { $query = "SELECT count(1) FROM exemplaires, serialcirc_expl WHERE num_serialcirc_expl_id=expl_id ".$this->get_restrict_expl_location_query(); $query .= " AND ".$this->get_restrict_expl_notice_query(); $tresult = pmb_mysql_query($query); return pmb_mysql_result($tresult, 0, 0); } /** * On compte le nombre d'exemplaires disponibles */ public function get_number_expl_available() { // on compte le nombre total d'exemplaires prêtables pour la notice // on compte le nombre d'exemplaires sortis // on compte le nombre d'exemplaires en circulation // on en déduit le nombre d'exemplaires disponibles $number = $this->get_number_expl_lendable() - $this->get_number_expl_out() - $this->get_number_expl_in_circ(); return $number; } public function get_exemplaire() { if(!isset($this->exemplaire)) { $this->exemplaire = new exemplaire($this->expl_cb, $this->expl_id); } return $this->exemplaire; } public function set_exemplaire($exemplaire) { $this->exemplaire = $exemplaire; } public function get_id() { return $this->id; } //Récupération de la durée de réservation pour une notice ou un bulletin et un emprunteur public static function get_time($id_empr,$id_notice,$id_bulletin) { global $pmb_quotas_avances; //Si les quotas avancés sont actifs if ($pmb_quotas_avances) { $struct=array(); if ($id_notice) { $struct["NOTI"]=$id_notice; $quota_type="BOOK_TIME_QUOTA"; } else { $struct["NOTI"] = bulletinage::get_notice_id_from_id($id_bulletin); $struct["BULL"]=$id_bulletin; $quota_type="BOOK_TIME_SERIAL_QUOTA"; } $struct["READER"]=$id_empr; $qt=new quota($quota_type); $t=$qt->get_quota_value($struct); if ($t==-1) $t=0; } else { //Sinon je regarde la durée de réservation la plus défavorable par type de document if ($id_notice) $requete="select min(duree_resa) from docs_type, exemplaires where expl_notice=$id_notice and expl_typdoc=idtyp_doc"; else $requete="select min(duree_resa) from docs_type, exemplaires where expl_bulletin=$id_bulletin and expl_typdoc=idtyp_doc"; $resultat=pmb_mysql_query($requete); if (pmb_mysql_num_rows($resultat)) $t=pmb_mysql_result($resultat,0,0); else $t=0; } return $t; } public static function get_notice_title($id_notice,$id_bulletin) { if ($id_notice) { $mono_display = new mono_display($id_notice); return $mono_display->header; } elseif ($id_bulletin) { $bulletinage_display = new bulletinage_display($id_bulletin); return $bulletinage_display->header; } } public static function get_cb_from_id($id) { $rqt = "select resa_cb from resa where id_resa='".$id."' "; $res = pmb_mysql_query($rqt) ; $nb=pmb_mysql_num_rows($res) ; if (!$nb) return "" ; $obj=pmb_mysql_fetch_object($res) ; return $obj->resa_cb ; } public static function verif_cb_resa_flag($cb){ $query = " select statut_allow_resa from exemplaires , docs_statut where expl_cb='".addslashes($cb)."' and idstatut=expl_statut"; $result = pmb_mysql_query($query); if(pmb_mysql_num_rows($result)) { $expl = pmb_mysql_fetch_object($result); return $expl->statut_allow_resa; } } public function get_expl_locations_lendable($location=0, $outside=false) { $locations = array(); $expl_lendable = $this->get_expl_lendable($location, $outside); foreach ($expl_lendable as $expl) { $locations[] = $expl->expl_location; } $locations = array_unique($locations); return $locations; } public static function get_instance_from_id($resa_id) { $result = pmb_mysql_query("SELECT resa_idempr, resa_idnotice, resa_idbulletin FROM resa WHERE id_resa = $resa_id"); if (pmb_mysql_num_rows($result)) { while ($row = pmb_mysql_fetch_assoc($result)) { return new reservation($row['resa_idempr'], $row['resa_idnotice'], $row['resa_idbulletin']); } } return null; } } # fin de déclaration classe reservation } # fin de définition