=sysdate() or resa_date_fin='0000-00-00',0,1) as perimee, date_format(resa_date_debut, '".$msg["format_date"]."') as aff_resa_date_debut, if(resa_date_fin='0000-00-00', '', date_format(resa_date_fin, '".$msg["format_date"]."')) as aff_resa_date_fin, date_format(resa_date, '".$msg["format_date"]."') as aff_resa_date " ; $sql.=" FROM (((resa LEFT JOIN notices AS notices_m ON resa_idnotice = notices_m.notice_id ) "; $sql.=" LEFT JOIN bulletins ON resa_idbulletin = bulletins.bulletin_id) "; $sql.=" LEFT JOIN notices AS notices_s ON bulletin_notice = notices_s.notice_id), "; $sql.=" empr "; if ($idempr) $sql.=" where id_empr='$idempr' AND resa_idempr = id_empr "; elseif ($idnotice || $idbulletin) $sql.=" where resa_idnotice = '$idnotice' AND resa_idbulletin='$idbulletin' and resa_idempr = id_empr "; else $sql.=" where resa_idempr = id_empr "; if ($where) $sql.=" AND ".$where ; $sql.=" group by resa_idnotice, resa_idbulletin, resa_idempr "; $sql.=" order by ".$order ; $req = mysql_query($sql) or die("Erreur SQL !
".$sql."
".mysql_error()); if ($info_gestion) { $aff_final .= "
" ; $aff_final .= $msg['resa_show_all']."".$data['tit'].""; elseif ($resa_idbulletin) $link = "".$data['tit'].""; } else $link = $data['tit']; if (!$idnotice && !$idbulletin) $aff_final .= "$link"; if (!$idempr) { if (SESSrights & CIRCULATION_AUTH) $aff_final .= "".$data['empr_nom'].", ".$data['empr_prenom'].""; else $aff_final .= "".$data['empr_nom'].", ".$data['empr_prenom'].""; } $aff_final .= "".$rank.""; $aff_final .= "".$data['aff_resa_date'].""; $aff_final .= "".$situation.""; $aff_final .= "".$data['aff_resa_date_fin'].""; // gestion du formulaire de validation/suppression if ($info_gestion) { $aff_final .= "\n"; if ($data['resa_cb']) $aff_final .= "X" ; else $aff_final .= " " ; $aff_final .= "\n" ; } $aff_final .= "\n"; } } $aff_final .= ""; if ($info_gestion) { $aff_final .= ""; $aff_final .= "
"; $aff_final .= ""; $aff_final .= "
" ; } mysql_free_result ($req); return $aff_final ; } // cette fonction va retourner un tableau des résa pas traitées function resa_list_resa_a_traiter () { /* Traitement : chercher toutes les réservations non traitées (resa_cb ="") construire le tableau avec le titre de l'ouvrage, le nom du réservataire et son rang */ global $dbh ; global $msg; $tableau_final=array(); $order="tit, resa_idnotice, resa_idbulletin, resa_date" ; $sql="SELECT resa_idnotice, resa_idbulletin, resa_date, resa_date_fin, resa_cb, resa_idempr, empr_nom, empr_prenom, empr_cb, "; $sql.=" trim(concat(ifnull(notices_m.tit1,''),ifnull(notices_s.tit1,''),' ',ifnull(bulletin_numero,''), if (mention_date, concat(' (',mention_date,')') ,''))) as tit, id_resa, "; $sql.=" IF(resa_date_fin>=sysdate() or resa_date_fin='0000-00-00',0,1) as perimee, date_format(resa_date_debut, '".$msg["format_date"]."') as aff_resa_date_debut, if(resa_date_fin='0000-00-00', '', date_format(resa_date_fin, '".$msg["format_date"]."')) as aff_resa_date_fin, date_format(resa_date, '".$msg["format_date"]."') as aff_resa_date " ; $sql.=" FROM (((resa LEFT JOIN notices AS notices_m ON resa_idnotice = notices_m.notice_id ) "; $sql.=" LEFT JOIN bulletins ON resa_idbulletin = bulletins.bulletin_id) "; $sql.=" LEFT JOIN notices AS notices_s ON bulletin_notice = notices_s.notice_id), empr "; $sql.=" where resa_idempr=id_empr and (resa_cb='' or resa_cb is null) "; $sql.=" group by resa_idnotice, resa_idbulletin, resa_idempr "; $sql.=" order by ".$order ; $req = mysql_query($sql) or die("Erreur SQL !
".$sql."
".mysql_error()); if (!mysql_num_rows($req)) return $tableau_final; while ($data = mysql_fetch_array($req)) { $rank = recupere_rang($data['resa_idempr'], $data['resa_idnotice'], $data['resa_idbulletin']) ; $tableau_final[] = array( 'resa_tit' => $data['tit'], 'resa_idnotice' => $data['resa_idnotice'], 'resa_idbulletin' => $data['resa_idbulletin'], 'resa_idempr' => $data['resa_idempr'], 'resa_empr' => $data['empr_nom']." ".$data['empr_prenom'], 'rank' => $rank ) ; } // fin while mysql_free_result ($req); return $tableau_final ; } function resa_ranger_list () { global $dbh ; global $msg; global $begin_result_liste; global $end_result_liste; $sql="SELECT resa_cb, expl_id from resa_ranger left join exemplaires on resa_cb=expl_cb "; $res = mysql_query($sql, $dbh) ; while ($ranger = mysql_fetch_object($res)) { if ($ranger->expl_id) { if($stuff = get_expl_info($ranger->expl_id)) { $stuff = check_pret($stuff); $aff_final .= print_info($stuff,0,0,0); } else { $aff_final .= "$form_cb_expl : ${msg[395]}"; } } } if ($aff_final) return $begin_result_liste.$aff_final.$end_result_liste; else return $msg['resa_liste_docranger_nodoc'] ; } // permet de savoir si un CB expl est déjà affecté à une résa function verif_cb_utilise ($cb) { global $dbh ; $rqt = "select id_resa from resa where resa_cb='".$cb."' "; $res = mysql_query ($rqt, $dbh) ; $nb=mysql_num_rows($res) ; if (!$nb) return 0 ; $obj=mysql_fetch_object($res) ; return $obj->id_resa ; } function affecte_cb ($cb) { global $dbh ; // chercher s'il s'agit d'une notice ou d'un bulletin $rqt = "select expl_notice, expl_bulletin from exemplaires where expl_cb='".$cb."' "; $res = mysql_query ($rqt, $dbh) ; $nb=mysql_num_rows($res) ; if (!$nb) return 0 ; $obj=mysql_fetch_object($res) ; // chercher le premier (par ordre de rang, donc de date de début de résa, non validé $rqt = "select id_resa, resa_idempr from resa where resa_idnotice='".$obj->expl_notice."' and resa_idbulletin='".$obj->expl_bulletin."' and resa_cb='' and resa_date_fin='0000-00-00' order by resa_date "; $res = mysql_query ($rqt, $dbh) ; if (!mysql_num_rows($res)) return 0 ; $obj_resa=mysql_fetch_object($res) ; $nb_days = get_time($obj_resa->resa_idempr,$obj->expl_notice,$obj->expl_bulletin) ; // mettre resa_cb à jour pour cette resa $rqt = "update resa set resa_cb='".$cb."' " ; $rqt .= ", resa_date_debut=sysdate() " ; $rqt .= ", resa_date_fin=date_add(sysdate(), interval $nb_days DAY) " ; $rqt .= " where id_resa='".$obj_resa->id_resa."' "; $res = mysql_query ($rqt, $dbh); return $obj_resa->id_resa ; } function desaffecte_cb ($cb) { global $dbh ; $rqt = "update resa set resa_cb='', resa_date_debut='0000-00-00', resa_date_fin='0000-00-00' where resa_cb='".$cb."' "; $res = mysql_query ($rqt, $dbh) ; return mysql_affected_rows($dbh) ; } function recupere_cb ($id) { global $dbh ; $rqt = "select resa_cb from resa where id_resa='".$id."' "; $res = mysql_query ($rqt, $dbh) ; $nb=mysql_num_rows($res) ; if (!$nb) return "" ; $obj=mysql_fetch_object($res) ; return $obj->resa_cb ; } // calcul du rang d'un emprunteur sur une réservation function recupere_rang($id_empr, $id_notice, $id_bulletin) { global $dbh; $rank = 1; if (!$id_notice) $id_notice=0; if (!$id_bulletin) $id_bulletin=0 ; $query = "select resa_idempr from resa where resa_idnotice='".$id_notice."' and resa_idbulletin='".$id_bulletin."' order by resa_date"; $result = mysql_query($query, $dbh); while($resa=mysql_fetch_object($result)) { if($resa->resa_idempr == $id_empr) break; $rank++; } return $rank; } //Récupération de la durée de réservation pour une notice ou un bulletin et un emprunteur 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["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=mysql_query($requete); if (mysql_num_rows($resultat)) $t=mysql_result($resultat,0,0); else $t=0; } return $t; } function check_quota_resa($id_empr,$id_notice,$id_bulletin) { global $dbh; global $msg; global $pmb_quotas_avances; global $_quotas_elements_; 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 ($id_notice) { $quota_type="BOOK_NMBR_QUOTA"; $struct["NOTI"]=$id_notice; $elt_name="NOTICETYPE"; } else { $quota_type="BOOK_NMBR_SERIAL_QUOTA"; $struct["BULL"]=$id_bulletin; $elt_name="BULLETINTYPE"; } //Initialisation du quota $qt=new quota($quota_type); $struct["READER"]=$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($_quotas_elements_[$elt],$struct); //Initialisation du quota de prêt $qt_pret=new quota("LEND_NMBR_QUOTA"); $struct_pret["READER"]=$id_empr; $struct_pret["EXPL"]=$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; return $error; } } else { $error["ERROR"]=true; //Erreur $error["MESSAGE"]=$qt_pret->error_message."
".$msg["resa_quota_pret_error"]; //Peut-on forcer ou pas la résa $error["FORCE"] = 0; return $error; } return $error; } else return $error; } // retourne un tableau constitué des exemplaires disponibles pour une résa donnée function expl_dispo ($no_notice=0, $no_bulletin=0) { global $dbh; // on récupère les données des exemplaires $requete = "SELECT expl_id, expl_cb, expl_cote, expl_notice, expl_bulletin, pret_retour, location_libelle, section_libelle, statut_libelle "; $requete .= " FROM exemplaires, docs_location, docs_section, docs_statut"; $requete .= " LEFT JOIN pret ON exemplaires.expl_id=pret.pret_idexpl"; $requete .= " WHERE expl_notice='$no_notice' and expl_bulletin='$no_bulletin' "; $requete .= " AND exemplaires.expl_location=docs_location.idlocation"; $requete .= " AND exemplaires.expl_section=docs_section.idsection "; $requete .= " AND exemplaires.expl_statut=docs_statut.idstatut "; $requete .= " order by location_libelle, section_libelle, expl_cote "; $result = mysql_query($requete, $dbh); while($expl = mysql_fetch_object($result)) { if(!$expl->pret_retour && !verif_cb_utilise($expl->expl_cb)) $tableau[] = array ( 'expl_id' => $expl->expl_id, 'expl_cb' => $expl->expl_cb, 'expl_notice' => $expl->expl_notice, 'expl_bulletin' => $expl->expl_bulletin, 'expl_cote' => $expl->expl_cote, 'location' => $expl->location_libelle, 'section' => $expl->section_libelle, 'statut' => $expl->statut_libelle ) ; } return $tableau ; } function check_statut($id_notice=0, $id_bulletin=0) { global $dbh; global $opac_resa_dispo; // les résa de disponibles sont-elles autorisées ? global $msg; global $message_resa,$empr_location,$pmb_location_reservation; // on checke s'il y a des exemplaires réservables et visibles if($id_notice) { $query = "select expl_id, expl_cb from exemplaires e, docs_statut s, docs_location l, docs_section se"; $query .= " where (e.expl_notice='$id_notice' ) and s.statut_allow_resa=1 and s.statut_visible_opac=1 and l.location_visible_opac=1 and se.section_visible_opac=1"; $query .= " and s.idstatut=e.expl_statut"; $query .= " and e.expl_location=l.idlocation"; $query .= " and e.expl_section=se.idsection "; } elseif($id_bulletin) { $query = "select expl_id, expl_cb from exemplaires e, docs_statut s, docs_location l, docs_section se"; $query .= " where (e.expl_bulletin='$id_bulletin' ) and s.statut_allow_resa=1 and s.statut_visible_opac=1 and l.location_visible_opac=1 and se.section_visible_opac=1" ; $query .= " and s.idstatut=e.expl_statut"; $query .= " and e.expl_location=l.idlocation"; $query .= " and e.expl_section=se.idsection "; } else { $message_resa.= "".$msg["resa_no_expl"].""; return 0; } if($pmb_location_reservation) { $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 $message_resa.= "".$msg["resa_no_expl"].""; return 0; } // on regarde si les résa de disponibles sont autorisées if ($opac_resa_dispo=="1") return 1; // 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_cb, 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_cb) { // 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) { $message_resa = "$msg[resa_doc_dispo]"; $message_resa .= $list_dispo; //signifie que : opac_resa_dispo == 0 && exemplaire(s) dispo(s) return 0; // return 2; } // rien de spécial return 1; } function allready_loaned($id_notice=0, $id_bulletin=0, $id_empr) { global $dbh; global $msg; $query = "select count(1) from pret p, exemplaires e"; $query .= " where p.pret_idempr='$id_empr' and e.expl_notice='$id_notice' and e.expl_bulletin='$id_bulletin' "; $query .= " and p.pret_idexpl=e.expl_id"; $result = @mysql_query($query, $dbh); if (@mysql_result($result, 0, 0)) { return $msg[resa_deja_doc] ; } return ""; } function alert_mail_users_pmb($id_notice=0, $id_bulletin=0, $id_empr, $annul=0) { global $dbh; global $msg, $charset; global $opac_biblio_name, $opac_biblio_email ; global $opac_url_base ; // paramétrage OPAC: choix du nom de la bibliothèque comme expéditeur $requete = "select location_libelle, email from empr, docs_location where empr_location=idlocation and id_empr='$id_empr' "; $res = mysql_query($requete, $dbh); $loc=mysql_fetch_object($res) ; $PMBusernom = $loc->location_libelle ; $PMBuserprenom = '' ; $PMBuseremail = $loc->email ; if ($PMBuseremail) { $query = "select distinct empr_prenom, empr_nom, empr_cb, empr_mail, empr_tel1, empr_tel2, empr_ville, location_libelle, nom, prenom, user_email, date_format(sysdate(), '".$msg["format_date_heure"]."') as aff_quand from empr, docs_location, users where id_empr='$id_empr' and empr_location=idlocation and user_email like('%@%') and user_alert_resamail=1"; $result = @mysql_query($query, $dbh); $headers = "MIME-Version: 1.0\n"; $headers .= "Content-type: text/html; charset=".$charset."\n"; $output_final=''; while ($empr=@mysql_fetch_object($result)) { if (!$output_final) { $output_final = "" ; if ($annul==1) { $output_final .= "".$msg["mail_obj_resa_canceled"] ; $sujet = $msg["mail_obj_resa_canceled"] ; } elseif ($annul==2) { $output_final .= "".$msg["mail_obj_resa_reaffected"] ; $sujet = $msg["mail_obj_resa_reaffected"] ; } else { $output_final .= "".$msg["mail_obj_resa_added"] ; $sujet = $msg["mail_obj_resa_added"] ; } $output_final .= " ".$empr->aff_quand."
".$empr->empr_prenom." ".$empr->empr_nom."
".$empr->empr_mail." / ".$empr->empr_tel1." / ".$empr->empr_tel2.""; if ($empr->empr_cp || $empr->empr_ville) $output_final .= "
".$empr->empr_cp." ".$empr->empr_ville.""; $output_final .= "
".$msg[situation].": ".$empr->location_libelle."
"; if ($id_notice) { $current = new notice_affichage($id_notice,array(),0,1); $current->do_header(); $current->do_isbd(1,1); $output_final .= "

".$current->notice_header."

"; $output_final .= $current->notice_isbd; $output_final .= $current->affichage_expl ; } else { $output_final .= bulletin_affichage_reduit($id_bulletin) ; $output_final .= notice_affichage::expl_list("m",0,$id_bulletin) ; } $output_final .= "
"; } $res_envoi=mailpmb($empr->nom." ".$empr->prenom, $empr->user_email,$sujet." ".$empr->aff_quand,$output_final,$PMBusernom, $PMBuseremail, $headers, "", "", 1); } } }