";
return $action;
}
function do_action($id_empr) {
global $pmb_gestion_amende, $lang, $include_path;
global $finance_recouvrement_lecteur_statut;
$action="action_".$id_empr;
global $$action,$msg,$charset,$finance_statut_perdu;
$act=$$action;
//Récupération du solde du compte
$frais_relance=0;
$id_compte=comptes::get_compte_id_from_empr($id_empr,2);
if ($id_compte) {
$cpte=new comptes($id_compte);
$frais_relance=$cpte->summarize_transactions("","",0,$realisee=-1);
if (($frais_relance)&&($frais_relance<0)) {
$frais_relance=-$frais_relance;
} else $frais_relance=0;
}
//Si action différent de zéro, alors changement
$quatre=false;
if ($act!=0) {
//Récupération de la liste des prêts
$amende=new amende($id_empr);
// on efface le cache pour qu'il soit remis à jour au prochain accès
$req="delete from cache_amendes where id_empr=$id_empr ";
mysql_query($req);
$montant_total=0;
for ($j=0; $jt_id_expl); $j++) {
$params=$amende->t_id_expl[$j];
//Si c'est juste un changement de niveau
if ($act<4) {
//Si il y a attente de changement d'état
if ($params["amende"]["niveau_relance"]<$params["amende"]["niveau"]) {
//Si le niveau attendu est supérieur ou égal au niveau demandé
if ($params["amende"]["niveau"]>=$act) {
//On passe au niveau demandé
$niveau=$act;
} else {
//Sinon on passe au niveau prévu
$niveau=$params["amende"]["niveau"];
}
//Enregistrement du changement de niveau
$requete="update pret set niveau_relance=$niveau, date_relance=now(), printed=0 where pret_idempr=$id_empr and pret_idexpl=".$params["id_expl"];
mysql_query($requete);
}
//Si le niveau supposé est inférieur au dernier niveau validé (ex : prolongations,...), on peut revenir..
if ($params["amende"]["niveau"]<$params["amende"]["niveau_relance"]) {
if ($params["amende"]["niveau_relance"]>=$act) {
//On passe au niveau demandé
$niveau=$act;
} else {
//Sinon on passe au niveau prévu
$niveau=$params["amende"]["niveau"];
}
//Enregistrement du changement de niveau
$requete="update pret set niveau_relance=$niveau, date_relance=now(), printed=0 where pret_idempr=$id_empr and pret_idexpl=".$params["id_expl"];
mysql_query($requete);
}
} else {
//Sinon, c'est plus grave, on passe en recouvrement !!
$quatre=true;
//Si niveau prévu = 4
if ($params["amende"]["niveau"]==4) {
//Passage des ouvrages en statut perdu
$requete="update exemplaires set expl_statut=$finance_statut_perdu where expl_id=".$params["id_expl"];
mysql_query($requete);
//Débit du compte lecteur + tarif des relances
$debit=$amende->get_amende($params["id_expl"]);
$debit=$debit["valeur"];
$id_compte=comptes::get_compte_id_from_empr($id_empr,2);
if ($id_compte) { //&&($debit)
$compte=new comptes($id_compte);
//Enregistrement transaction
$id_transaction=$compte->record_transaction("",$debit,-1,sprintf($msg["relance_recouvr_transaction"],$params["id_expl"]),0);
//Validation
$compte->validate_transaction($id_transaction);
$montant_total+=$debit;
$requete="select pret_date from pret where pret_idexpl=".$params["id_expl"];
$resultat=mysql_query($requete);
$r=mysql_fetch_object($resultat);
$req_pret_date= ", date_pret='".$r->pret_date."' ";
$requete="select log.date_log as date_log, log.niveau_reel as niv
from log_expl_retard as expl,log_retard as log
where expl.num_log_retard=log.id_log and log.idempr=$id_empr and expl.expl_id=".$params["id_expl"] ." order by log.date_log limit 3";
$res=mysql_query($requete);
$req_date_relance="";
$i=1;
while($log = mysql_fetch_object($res)){
$req_date_relance.= ", date_relance".$i++."='".$log->date_log."' ";
}
$requete="insert into recouvrements set empr_id=$id_empr, id_expl=".$params["id_expl"].", date_rec= now(), libelle='',recouvr_type=0, montant='$debit' $req_pret_date $req_date_relance";
mysql_query($requete);
// Essayer de retrouver le prix de l'exemplaire
$requete="select expl_prix, prix from exemplaires, notices where (notice_id=expl_notice or notice_id=expl_bulletin) and expl_id =".$params["id_expl"];
$resultat=mysql_query($requete);
$prix=0;
if($r=mysql_fetch_object($resultat)) {
if(!$prix=1*($r->expl_prix)) $prix=1*($r->prix);
}
$requete="insert into recouvrements set empr_id=$id_empr, id_expl=".$params["id_expl"].", date_rec=now(), libelle='', recouvr_type=1, montant='$prix' $req_pret_date $req_date_relance";
mysql_query($requete);
// on modifie le status du lecteur si demandé
if($finance_recouvrement_lecteur_statut){
$requete="update empr set empr_statut=$finance_recouvrement_lecteur_statut where id_empr=$id_empr";
mysql_query($requete);
}
}
//Supression du pret
$requete="delete from pret where pret_idexpl=".$params["id_expl"];
mysql_query($requete);
$requete="update exemplaires set expl_note=concat(expl_note,' ','".$msg["relance_non_rendu_expl"]."'),expl_lastempr='".$id_empr."' where expl_id=".$params["id_expl"];
mysql_query($requete);
$requete="update empr set empr_msg=trim(concat(empr_msg,' ','".addslashes($msg["relance_recouvrement"])."')) where id_empr=".$id_empr;
mysql_query($requete);
}
}
//Ajout solde du compte amendes
if ($quatre) {
if ($frais_relance) {
$requete="insert into recouvrements (empr_id,id_expl,date_rec,libelle,montant) values($id_empr,0,now(),'".$msg["relance_frais_relance"]."',".$frais_relance.")";
mysql_query($requete);
$montant_total+=$frais_relance;
}
//Passage en perte pour la bibliothèque
//Débit sur le compte 0
//if ($montant_total) {
// $requete="insert into transactions (compte_id,user_id,user_name,machine,date_enrgt,date_prevue,date_effective,montant,sens,realisee,commentaire,encaissement) values(0,$PMBuserid,'".$PMBusername."','".$_SERVER["REMOTE_ADDR"]."', now(), now(), now(), ".($montant_total*1).", -1, 1,'Recouvrement lecteur : ".$params["id_expl"]."',0)";
// mysql_query($requete);
//}
}
}
//Traitement des frais
$niveau_min=$act;
$the_frais = 0;
if ($pmb_gestion_amende == 1) {
$frais="finance_relance_".$niveau_min;
global $$frais;
$the_frais = $$frais;
}
else {
$quota_name = "";
switch ($niveau_min) {
case 1:
$quota_name="AMENDERELANCE_FRAISPREMIERERELANCE";
break;
case 2:
$quota_name="AMENDERELANCE_FRAISDEUXIEMERELANCE";
break;
case 3:
$quota_name="AMENDERELANCE_FRAISTROISIEMERELANCE";
break;
default:
break;
}
$qt = new quota($quota_name, "$include_path/quotas/own/$lang/finances.xml");
$struct["READER"] = $id_empr;
$the_frais = $qt -> get_quota_value($struct);
}
if($the_frais){
if ($id_compte) {
$compte=new comptes($id_compte);
//Enregistrement transaction
$cpte->record_transaction("",$the_frais,-1,sprintf($msg["relance_frais_relance_level"],$niveau_min));
}
}
}
}
function send_mail($id_empr, $relance) {
global $pmb_gestion_devise,$msg,$charset;
global $biblio_name,$biblio_email,$biblio_phone, $PMBuseremailbcc;
// l'objet du mail
$var = "mailretard_".$relance."objet";
global $$var;
eval ("\$objet=\"".$$var."\";");
// la formule de politesse du bas (le signataire)
$var = "mailretard_".$relance."fdp";
global $$var;
eval ("\$fdp=\"".$$var."\";");
// le texte après la liste des ouvrages en retard
$var = "mailretard_".$relance."after_list";
global $$var;
eval ("\$after_list=\"".$$var."\";");
// le texte avant la liste des ouvrges en retard
$var = "mailretard_".$relance."before_list";
global $$var;
eval ("\$before_list=\"".$$var."\";");
// le "Madame, Monsieur," ou tout autre truc du genre "Cher adhérent,"
$var = "mailretard_".$relance."madame_monsieur";
global $$var;
eval ("\$madame_monsieur=\"".$$var."\";");
if($madame_monsieur) $texte_mail.=$madame_monsieur."\r\n\r\n";
if($before_list) $texte_mail.=$before_list."\r\n\r\n";
//Récupération des exemplaires
$rqt = "select pret_idempr, expl_id, expl_cb from pret, exemplaires where pret_idempr='".$id_empr."' and pret_retour < curdate() and pret_idexpl=expl_id order by pret_date " ;
$req = mysql_query($rqt) or die('Erreur SQL ! '.$rqt.' '.mysql_error());
$i=0;
$total_amendes=0;
//Calcul des frais de relance
$id_compte=comptes::get_compte_id_from_empr($id_empr,2);
if ($id_compte) {
$cpte=new comptes($id_compte);
$frais_relance=$cpte->summarize_transactions("","",0,$realisee=-1);
if ($frais_relance<0) $frais_relance=-$frais_relance; else $frais_relance=0;
}
while ($data = mysql_fetch_array($req)) {
//Calcul des amendes
$valeur=0;
$amende=new amende($data["pret_idempr"]);
$amd=$amende->get_amende($data["expl_id"]);
if ($amd["valeur"]) {
$valeur=$amd["valeur"];
$total_amendes+=$valeur;
}
/* Récupération des infos exemplaires et prêt */
$requete = "SELECT notices_m.notice_id as m_id, notices_s.notice_id as s_id, expl_cb, pret_date, pret_retour, tdoc_libelle, trim(concat(ifnull(notices_m.tit1,''),ifnull(notices_s.tit1,''),' ',ifnull(bulletin_numero,''), if (mention_date, concat(' (',mention_date,')') ,''))) as tit, ";
$requete.= " date_format(pret_date, '".$msg["format_date"]."') as aff_pret_date, ";
$requete.= " date_format(pret_retour, '".$msg["format_date"]."') as aff_pret_retour, ";
$requete.= " IF(pret_retour>sysdate(),0,1) as retard, notices_m.tparent_id, notices_m.tnvol " ;
$requete.= "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), docs_type , pret ";
$requete.= "WHERE expl_cb='".addslashes($data['expl_cb'])."' and expl_typdoc = idtyp_doc and pret_idexpl = expl_id ";
$res = mysql_query($requete);
$expl = mysql_fetch_object($res);
$responsabilites=array() ;
$header_aut = "" ;
$responsabilites = get_notice_authors(($expl->m_id+$expl->s_id)) ;
$as = array_search ("0", $responsabilites["responsabilites"]) ;
if ($as!== FALSE && $as!== NULL) {
$auteur_0 = $responsabilites["auteurs"][$as] ;
$auteur = new auteur($auteur_0["id"]);
$header_aut .= $auteur->isbd_entry;
} else {
$aut1_libelle=array();
$as = array_keys ($responsabilites["responsabilites"], "1" ) ;
for ($i = 0 ; $i < count($as) ; $i++) {
$indice = $as[$i] ;
$auteur_1 = $responsabilites["auteurs"][$indice] ;
$auteur = new auteur($auteur_1["id"]);
$aut1_libelle[]= $auteur->isbd_entry;
}
$header_aut .= implode (", ",$aut1_libelle) ;
}
$header_aut ? $auteur=" / ".$header_aut : $auteur="";
// récupération du titre de série
$tit_serie="";
if ($expl->tparent_id && $expl->m_id) {
$parent = new serie($expl->tparent_id);
$tit_serie = $parent->name;
if ($expl->tnvol)
$tit_serie .= ', '.$expl->tnvol;
}
if ($tit_serie) {
$expl->tit = $tit_serie.'. '.$expl->tit;
}
$texte_mail.=$expl->tit.$auteur."\r\n";
$texte_mail.=" -".sprintf($msg["relance_mail_retard_dates"],$expl->aff_pret_date,$expl->aff_pret_retour);
if ($valeur) $texte_mail.=" ".sprintf($msg["relance_mail_retard_amende"],round($valeur,2)." ".$pmb_gestion_devise);
$texte_mail.="\r\n";
$i++;
}
if ($total_amendes) $texte_mail.="\r\n".sprintf($msg["relance_mail_retard_total_amendes"],$total_amendes." ".$pmb_gestion_devise);
if ($frais_relance) $texte_mail.="\r\n".$msg["relance_lettre_retard_frais_relance"].comptes::format_simple($frais_relance);
if (($frais_relance)||($valeur)) $texte_mail.="\r\n".$msg["relance_lettre_retard_total_du"].comptes::format_simple($valeur+$frais_relance);
$texte_mail.="\r\n\r\n";
if($after_list) $texte_mail.=$after_list."\r\n\r\n";
if($fdp) $texte_mail.=$fdp."\r\n\r\n";
$texte_mail.=mail_bloc_adresse();
//Si mail de rappel affecté au responsable du groupe
$requete="select id_groupe,resp_groupe from groupe,empr_groupe where id_groupe=groupe_id and empr_id=$id_empr and resp_groupe and mail_rappel limit 1";
$res=mysql_query($requete);
/* Récupération du nom, prénom et mail du lecteur destinataire */
if(mysql_num_rows($res) > 0) {
$requete="select id_empr, empr_mail, empr_nom, empr_prenom from empr where id_empr='".mysql_result($res, 0,1)."'";
$result=mysql_query($requete);
$coords_dest=mysql_fetch_object($result);
} else {
$requete="select id_empr, empr_mail, empr_nom, empr_prenom from empr where id_empr=$id_empr";
$res=mysql_query($requete);
$coords_dest=mysql_fetch_object($res);
}
/* Récupération du nom, prénom et mail du lecteur concerné */
$requete="select id_empr, empr_mail, empr_nom, empr_prenom, empr_cb from empr where id_empr=$id_empr";
$res=mysql_query($requete);
$coords=mysql_fetch_object($res);
//remplacement nom et prenom
$texte_mail=str_replace("!!empr_name!!", $coords->empr_nom,$texte_mail);
$texte_mail=str_replace("!!empr_first_name!!", $coords->empr_prenom,$texte_mail);
// function mailpmb($to_nom="", $to_mail, $obj="", $corps="", $from_name="", $from_mail, $headers, $copie_CC="", $copie_BCC="", $faire_nl2br=0, $pieces_jointes=array()) {
$res_envoi=mailpmb($coords_dest->empr_prenom." ".$coords_dest->empr_nom, $coords_dest->empr_mail,$objet." : ".$coords->empr_prenom." ".mb_strtoupper($coords->empr_nom,$charset)." (".$coords->empr_cb.")",$texte_mail,$biblio_name, $biblio_email,"Content-Type: text/plain; charset=\"$charset\"\n", "", $PMBuseremailbcc, 1);
return $res_envoi;
}
function print_relance($id_empr,$mail=true) {
global $mailretard_priorite_email, $mailretard_priorite_email_3;
global $dbh,$charset, $msg, $pmb_gestion_financiere, $pmb_gestion_amende;
global $mail_sended;
$mail_sended=0;
$not_mail=0;
if (($pmb_gestion_financiere)&&($pmb_gestion_amende)) {
$req="delete from cache_amendes where id_empr=".$id_empr;
mysql_query($req);
$amende=new amende($id_empr);
$level=$amende->get_max_level();
$niveau_min=$level["level_min"];
$id_expl=$level["level_min_id_expl"];
$total_amende = $amende->get_total_amendes();
}
//Si mail de rappel affecté au groupe, on envoi au responsable
$requete="select id_groupe,resp_groupe from groupe,empr_groupe where id_groupe=groupe_id and empr_id=$id_empr and resp_groupe and mail_rappel limit 1";
$res=mysql_query($requete);
if(mysql_num_rows($res) > 0) {
$requete="select empr_mail from empr where id_empr='".mysql_result($res,0,1)."'";
$res=mysql_query($requete);
if (@mysql_num_rows($res)) {
list($empr_mail)=mysql_fetch_row($res);
}
} else {
$requete="select empr_mail from empr where id_empr=$id_empr";
$resultat=mysql_query($requete);
if (@mysql_num_rows($resultat)) {
list($empr_mail)=mysql_fetch_row($resultat);
}
}
if ($niveau_min) {
//Si c'est un mail
if (((($mailretard_priorite_email==1)||($mailretard_priorite_email==2))&&($empr_mail))&&( ($niveau_min<3)||($mailretard_priorite_email_3) )&&($mail)) {
if (send_mail($id_empr,$niveau_min)) {
$requete="update pret set printed=1 where pret_idexpl=".$id_expl;
mysql_query($requete,$dbh);
$mail_sended=1;
}
} else {
$requete="update pret set printed=2 where pret_idexpl=".$id_expl;
mysql_query($requete,$dbh);
$not_mail=1;
//Débit du compte lecteur
/*$frais="finance_relance_".$niveau_min;
global $$frais;
if ($$frais) {
$id_compte=comptes::get_compte_id_from_empr($id_empr,2);
if ($id_compte) {
$cpte=new comptes($id_compte);
$cpte->record_transaction("",$$frais,-1,sprintf($msg["relance_frais_relance_level"],$niveau_min));
}
}*/
}
}
$req="delete from cache_amendes where id_empr=".$id_empr;
mysql_query($req);
//On loggue les infos de la lettre
$niveau_courant = $niveau_min;
if($niveau_courant){
$niveau_suppose = $level["level_normal"];
$cpt_id=comptes::get_compte_id_from_empr($id_empr,2);
$cpt=new comptes($cpt_id);
$solde=$cpt->update_solde();
$frais_relance=$cpt->summarize_transactions("","",0,$realisee=-1);
if ($frais_relance<0) $frais_relance=-$frais_relance; else $frais_relance=0;
$req="insert into log_retard (niveau_reel,niveau_suppose,amende_totale,frais,idempr,log_printed,log_mail) values('".$niveau_courant."','".$niveau_suppose."','".$total_amende."','".$frais_relance."','".$id_empr."', '".$not_mail."', '".$mail_sended."')";
mysql_query($req,$dbh);
$id_log_ret = mysql_insert_id();
$reqexpl = "select pret_idexpl as expl from pret where pret_retour< CURDATE() and pret_idempr=$id_empr";
$resexple=mysql_query($reqexpl,$dbh);
while(($liste = mysql_fetch_object($resexple))){
$dates_resa_sql = " date_format(pret_date, '".$msg["format_date"]."') as aff_pret_date, date_format(pret_retour, '".$msg["format_date"]."') as aff_pret_retour " ;
$requete = "SELECT notices_m.notice_id as m_id, notices_s.notice_id as s_id, pret_idempr, expl_id, expl_cb,expl_cote, pret_date, pret_retour, tdoc_libelle, section_libelle, location_libelle, trim(concat(ifnull(notices_m.tit1,''),ifnull(notices_s.tit1,''),' ',ifnull(bulletin_numero,''), if (mention_date!='', concat(' (',mention_date,')') ,''))) as tit, ".$dates_resa_sql.", " ;
$requete.= " notices_m.tparent_id, notices_m.tnvol " ;
$requete.= " 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), docs_type, docs_section, docs_location, pret ";
$requete.= " WHERE expl_id='".$liste->expl."' and expl_typdoc = idtyp_doc and expl_section = idsection and expl_location = idlocation and pret_idexpl = expl_id ";
$res_det_expl = mysql_query($requete) ;
$expl = mysql_fetch_object($res_det_expl);
if (($pmb_gestion_financiere)&&($pmb_gestion_amende)) {
$amd = $amende->get_amende($liste->expl);
}
$req_ins="insert into log_expl_retard (titre,expl_id,expl_cb,date_pret,date_retour,amende,num_log_retard) values('".addslashes($expl->tit)."','".$expl->expl_id."','".$expl->expl_cb."','".$expl->pret_date."','".$expl->pret_retour."','".$amd["valeur"]."','".$id_log_ret."')";
mysql_query($req_ins,$dbh);
}
}
return $not_mail;
}
function filter_niveau($liste_ids,$champ,$selected="",$sort=false) {
global $all_level,$late_ids;
$ret="";
$t=array();
$v=array();
//Recherche des lecteurs en retard
if (!$late_ids) {
$requete="select distinct pret_idempr from pret where pret_retour< CURDATE() and pret_idempr in (".implode(",",$liste_ids).")";
$res_id=mysql_query($requete);
if (($res_id)&&(mysql_num_rows($res_id))) {
while ($r=mysql_fetch_object($res_id)) {
$late_ids[$r->pret_idempr]=1;
}
} else $late_ids=array();
}
for ($i=0;$i<=count($liste_ids)-1;$i++) {
if (isset($late_ids[$liste_ids[$i]])) {
$amende=new amende($liste_ids[$i]);
$level=$amende->get_max_level();
$t[$liste_ids[$i]]=$level[$champ];
$v[$liste_ids[$i]]=$level;
}
}
if ($all_level) {
$liste_ids=array_keys($all_level);
//afin de gérer les filtres combinés..
$all_level=array(0);
}
for ($i=0;$i<=count($liste_ids)-1;$i++) {
if (($selected)&&(is_array($selected))) {
$as=array_search($v[$liste_ids[$i]][$champ],$selected);
if (($as!==FALSE)&&($as!==NULL)) $all_level[$liste_ids[$i]]=$v[$liste_ids[$i]];
}
}
if ($sort==true) sort($t[$champ],SORT_NUMERIC);
$result=array_unique($t);
sort($result,SORT_NUMERIC);
for ($i=0;$i<=count($result)-1;$i++) {
if ($result[$i]!=0) {
$ret.="";
}
}
return $ret;
}
// Pour localiser les relances : $deflt2docs_location, $pmb_lecteurs_localises, $empr_location_id ;
$loc_filter = "";
if ($pmb_lecteurs_localises) {
$empr_location_id = $deflt2docs_location;
$loc_filter = "and empr_location = '".$empr_location_id."' ";
}
//Traitement avant affichage
switch ($act) {
case 'solo':
$id_empr=$relance_solo;
do_action($id_empr);
break;
case 'solo_print':
$id_empr=$relance_solo;
print_relance($id_empr,false);
break;
case 'solo_mail':
$id_empr=$relance_solo;
print_relance($id_empr);
break;
case 'valid':
for ($i=0; $iid_empr);
$level=$amende->get_max_level();
$niveau_min=$level["level_min"];
$printed=$level["printed"];
if ((!$printed)&&($niveau_min)) {
$not_mail = print_relance($r->id_empr);
if (($not_mail == 1) || (!$mail_sended) ||($mailretard_priorite_email==2 && $niveau_min < 3)) { //mail_sended <=> globale
$not_all_mail[] = $r->id_empr;
}
}
}
}
if (count($not_all_mail) > 0) {
print "
";
}
//Fermeture de la fenêtre d'impression si tout est parti par mail
break;
case 'export':
$req="TRUNCATE TABLE cache_amendes";
mysql_query($req);
$requete = "select id_empr from empr, pret, exemplaires where 1 ";
$requete.=" and id_empr in (".implode(",",$empr).") ";
//$requete.= $loc_filter;
$requete.= "and pret_retour< CURDATE() and pret_idempr=id_empr and pret_idexpl=expl_id group by id_empr";
$resultat=mysql_query($requete);
$not_all_mail=0;
while ($r=mysql_fetch_object($resultat)) {
$amende=new amende($r->id_empr);
$level=$amende->get_max_level();
$niveau_min=$level["level_min"];
$printed=$level["printed"];
if ((!$printed)&&($niveau_min)) {
$not_all_mail+=print_relance($r->id_empr);
}
}
print "
";
//Fermeture de la fenêtre d'impression si tout est parti par mail
break;
case 'raz_printed':
$req="TRUNCATE TABLE cache_amendes";
mysql_query($req);
$requete="update pret set printed=0 where printed!=0";
if ($printed_cd) {
$requete.=" and date_relance='".stripslashes($printed_cd)."'";
}
mysql_query($requete);
break;
}
echo "