source: pmb4.2/trunk/fuentes/pmb/circ/relance/relance.inc.php @ 815

Last change on this file since 815 was 815, checked in by jrpelegrina, 4 years ago

Initial release of pmb 4.2

  • Property svn:executable set to *
File size: 37.9 KB
Line 
1<?php
2// +-------------------------------------------------+
3// © 2002-2004 PMB Services / www.sigb.net pmb@sigb.net et contributeurs (voir www.sigb.net)
4// +-------------------------------------------------+
5// $Id: relance.inc.php,v 1.81.2.1 2015-09-15 07:26:28 jpermanne Exp $
6
7if (stristr($_SERVER['REQUEST_URI'], ".inc.php")) die("no access");
8
9require_once($include_path."/mail.inc.php") ;
10require_once ($include_path."/mailing.inc.php");
11require_once ("$include_path/notice_authors.inc.php"); 
12
13//Gestion des relances
14require_once($class_path."/amende.class.php");
15require_once($class_path."/comptes.class.php");
16require_once($class_path."/serie.class.php");
17require_once ("$class_path/author.class.php"); 
18require_once("$class_path/progress_bar.class.php");     
19
20function get_action($id_empr,$niveau,$niveau_normal) {
21        global $msg, $charset, $pmb_recouvrement_auto;
22        $action="<input type='hidden' name='empr[]' value='".$id_empr."'>
23        <select name='action_".$id_empr."'>
24        ";
25        $action.="<option value='0'>".$msg["relance_do_nothing"]."</option>\n";
26
27        //if ((($niveau==$niveau_normal)||(($niveau==3)&&($niveau_normal==4)))&&($niveau!=0)) {
28        //      $action.="<option value='edit'>Editer la lettre</option>";
29        //}
30        if ($niveau>$niveau_normal) {
31                $action.="<option value='$niveau_normal' ";
32                $action.="selected";
33                $action.=">".sprintf($msg["relance_back_level"],$niveau_normal)."</option>\n";
34        }
35        if ($niveau<$niveau_normal) {
36                if ($niveau_normal==4) $nn=3; else $nn=$niveau_normal;
37                if ($niveau==4) $nd=3; else $nd=$niveau+1;
38                for ($i=$nd; $i<=$nn; $i++) {
39                        $action.="<option value='$i' ";
40                        if ($i==$nn) $action.="selected";
41                        $action.=">".sprintf($msg["relance_change_level"],$i)."</option>\n";
42                }
43                if ($niveau_normal==4) {
44                        $action.="<option value='4' ";
45                        if (($niveau==3) && ($pmb_recouvrement_auto)) $action.=" selected";
46                        $action.=">".$msg["relance_go_recouvr"]."</option>\n";
47                }
48        }
49        $action.="</select>
50        ";
51        return $action;
52}
53
54function do_action($id_empr) {
55        global $pmb_gestion_amende, $lang, $include_path;
56        global $finance_recouvrement_lecteur_statut;
57        $action="action_".$id_empr;
58        global $$action,$msg,$charset,$finance_statut_perdu;
59        $act=$$action;
60       
61        //Récupération du solde du compte
62        $frais_relance=0;
63        $id_compte=comptes::get_compte_id_from_empr($id_empr,2);
64        if ($id_compte) {
65                $cpte=new comptes($id_compte);
66                $frais_relance=$cpte->summarize_transactions("","",0,$realisee=-1);
67                if (($frais_relance)&&($frais_relance<0)) {
68                        $frais_relance=-$frais_relance;
69                } else $frais_relance=0;
70        }
71       
72        //Si action différent de zéro, alors changement
73        $quatre=false;
74        if ($act!=0) {
75                //Récupération de la liste des prêts
76                $amende=new amende($id_empr);
77                // on efface le cache pour qu'il soit remis à jour au prochain accès
78                $req="delete from cache_amendes where id_empr=$id_empr ";
79                pmb_mysql_query($req);
80               
81                $montant_total=0;
82                for ($j=0; $j<count($amende->t_id_expl); $j++) {
83                        $params=$amende->t_id_expl[$j];
84                        //Si c'est juste un changement de niveau
85                        if ($act<4) {
86                                //Si il y a attente de changement d'état
87                                if ($params["amende"]["niveau_relance"]<$params["amende"]["niveau"]) {
88                                        //Si le niveau attendu est supérieur ou égal au niveau demandé
89                                        if ($params["amende"]["niveau"]>=$act) {
90                                                //On passe au niveau demandé
91                                                $niveau=$act;
92                                        } else {
93                                                //Sinon on passe au niveau prévu
94                                                $niveau=$params["amende"]["niveau"];
95                                        }
96                                        //Enregistrement du changement de niveau
97                                        $requete="update pret set niveau_relance=$niveau, date_relance=now(), printed=0 where pret_idempr=$id_empr and pret_idexpl=".$params["id_expl"];
98                                       
99                                        pmb_mysql_query($requete);
100                                }
101                                //Si le niveau supposé est inférieur au dernier niveau validé (ex : prolongations,...), on peut revenir..
102                                if ($params["amende"]["niveau"]<$params["amende"]["niveau_relance"]) {
103                                        if ($params["amende"]["niveau_relance"]>=$act) {
104                                                //On passe au niveau demandé
105                                                $niveau=$act;
106                                        } else {
107                                                //Sinon on passe au niveau prévu
108                                                $niveau=$params["amende"]["niveau"];
109                                        }
110                                        //Enregistrement du changement de niveau
111                                        $requete="update pret set niveau_relance=$niveau, date_relance=now(), printed=0 where pret_idempr=$id_empr and pret_idexpl=".$params["id_expl"];
112                                       
113                                        pmb_mysql_query($requete);
114                                }
115                        } else {
116                                //Sinon, c'est plus grave, on passe en recouvrement !!
117                                $quatre=true;
118                                //Si niveau prévu = 4
119                                if ($params["amende"]["niveau"]==4) {
120                                        //Passage des ouvrages en statut perdu
121                                        $requete="update exemplaires set expl_statut=$finance_statut_perdu where expl_id=".$params["id_expl"];
122                                        pmb_mysql_query($requete);                                             
123                                        //Débit du compte lecteur + tarif des relances
124                                        $debit=$amende->get_amende($params["id_expl"]);
125                                        $debit=$debit["valeur"];
126                                        $id_compte=comptes::get_compte_id_from_empr($id_empr,2);
127                                        if ($id_compte) { //&&($debit)
128                                                $compte=new comptes($id_compte);
129                                                //Enregistrement transaction
130                                                $id_transaction=$compte->record_transaction("",$debit,-1,sprintf($msg["relance_recouvr_transaction"],$params["id_expl"]),0);
131                                                //Validation
132                                                $compte->validate_transaction($id_transaction);
133                                                $montant_total+=$debit;
134                                               
135                                                $requete="select pret_date from pret where pret_idexpl=".$params["id_expl"];
136                                                $resultat=pmb_mysql_query($requete);
137                                                $r=pmb_mysql_fetch_object($resultat);
138                                                $req_pret_date= ", date_pret='".$r->pret_date."' ";
139                                               
140                                                $requete="select  log.date_log as date_log, log.niveau_reel as niv
141                                                from log_expl_retard as expl,log_retard as log
142                                                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";
143                                               
144                                                $res=pmb_mysql_query($requete);
145                                                $req_date_relance="";
146                                                $i=1;
147                                                while($log = pmb_mysql_fetch_object($res)){
148                                                        $req_date_relance.= ", date_relance".$i++."='".$log->date_log."' ";
149                                                }
150                                               
151                                                $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";
152                                                pmb_mysql_query($requete);
153                                                                                       
154                                                // Essayer de retrouver le prix de l'exemplaire
155                                                $requete="select expl_prix, prix from exemplaires, notices where (notice_id=expl_notice or notice_id=expl_bulletin) and expl_id =".$params["id_expl"];
156                                                $resultat=pmb_mysql_query($requete);
157                                                $prix=0;
158                                                if($r=pmb_mysql_fetch_object($resultat)) {
159                                                        if(!$prix=1*($r->expl_prix)) $prix=1*($r->prix);                       
160                                                }
161                                                $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";
162                                                pmb_mysql_query($requete);
163                                               
164                                                // on modifie le status du lecteur si demandé
165                                                if($finance_recouvrement_lecteur_statut){
166                                                        $requete="update empr set empr_statut=$finance_recouvrement_lecteur_statut where id_empr=$id_empr";
167                                                        pmb_mysql_query($requete);
168                                                }       
169                                        }
170
171                                        //Supression du pret
172                                        $requete="delete from pret where pret_idexpl=".$params["id_expl"];
173                                        pmb_mysql_query($requete);
174                                        $requete="update exemplaires set expl_note=concat(expl_note,' ','".$msg["relance_non_rendu_expl"]."'),expl_lastempr='".$id_empr."' where expl_id=".$params["id_expl"];
175                                        pmb_mysql_query($requete);
176                                        $requete="update empr set empr_msg=trim(concat(empr_msg,' ','".addslashes($msg["relance_recouvrement"])."')) where id_empr=".$id_empr;
177                                        pmb_mysql_query($requete);
178                                }
179                        }
180                       
181                        //Ajout solde du compte amendes
182                        if ($quatre) {
183                                if ($frais_relance) {
184                                        $requete="insert into recouvrements (empr_id,id_expl,date_rec,libelle,montant) values($id_empr,0,now(),'".$msg["relance_frais_relance"]."',".$frais_relance.")";
185                                        pmb_mysql_query($requete);
186                                        $montant_total+=$frais_relance;
187                                }
188                                               
189                                //Passage en perte pour la bibliothèque
190                                //Débit sur le compte 0
191                                //if ($montant_total) {
192                                //      $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)";
193                                //      pmb_mysql_query($requete);
194                                //}
195                        }
196                }
197                //Traitement des frais
198                $niveau_min=$act;
199                $the_frais = 0;
200                if ($pmb_gestion_amende == 1) {
201                        $frais="finance_relance_".$niveau_min;
202                        global $$frais;
203                        $the_frais = $$frais;                                           
204                }
205                else {
206                        $quota_name = "";
207                        switch ($niveau_min) {
208                                case 1:
209                                        $quota_name="AMENDERELANCE_FRAISPREMIERERELANCE";
210                                        break;
211                                case 2:
212                                        $quota_name="AMENDERELANCE_FRAISDEUXIEMERELANCE";
213                                        break;
214                                case 3:
215                                        $quota_name="AMENDERELANCE_FRAISTROISIEMERELANCE";
216                                        break;
217                                default:
218                                        break;
219                        }
220                        $qt = new quota($quota_name, "$include_path/quotas/own/$lang/finances.xml");
221                        $struct["READER"] = $id_empr;
222                        $the_frais = $qt -> get_quota_value($struct);
223                        if ($the_frais == -1) $the_frais = 0;
224                }
225               
226                if($the_frais){
227                        if ($id_compte) { 
228                                $compte=new comptes($id_compte);
229                                //Enregistrement transaction
230                                $cpte->record_transaction("",$the_frais,-1,sprintf($msg["relance_frais_relance_level"],$niveau_min));
231                        }
232                }
233        }
234}
235
236function send_mail($id_empr, $relance) {
237        global $pmb_gestion_devise,$msg,$charset;
238        global $biblio_name,$biblio_email,$biblio_phone, $PMBuseremailbcc;
239        // l'objet du mail
240        $var = "mailretard_".$relance."objet";
241        global $$var;
242        eval ("\$objet=\"".$$var."\";");
243
244        // la formule de politesse du bas (le signataire)
245        $var = "mailretard_".$relance."fdp";
246        global $$var;
247        eval ("\$fdp=\"".$$var."\";");
248
249        // le texte après la liste des ouvrages en retard
250        $var = "mailretard_".$relance."after_list";
251        global $$var;
252        eval ("\$after_list=\"".$$var."\";");
253
254        // le texte avant la liste des ouvrges en retard
255        $var = "mailretard_".$relance."before_list";
256        global $$var;
257        eval ("\$before_list=\"".$$var."\";");
258
259        // le "Madame, Monsieur," ou tout autre truc du genre "Cher adhérent,"
260        $var = "mailretard_".$relance."madame_monsieur";
261        global $$var;
262        eval ("\$madame_monsieur=\"".$$var."\";");
263
264        if($madame_monsieur) $texte_mail.=$madame_monsieur."\r\n\r\n";
265        if($before_list) $texte_mail.=$before_list."\r\n\r\n";
266
267        //Récupération des exemplaires
268        $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 " ;
269        $req = pmb_mysql_query($rqt) or die('Erreur SQL !<br />'.$rqt.'<br />'.pmb_mysql_error()); 
270
271        $i=0;
272        $total_amendes=0;
273       
274        //Calcul des frais de relance
275        $id_compte=comptes::get_compte_id_from_empr($id_empr,2);
276        if ($id_compte) {
277                $cpte=new comptes($id_compte);
278                $frais_relance=$cpte->summarize_transactions("","",0,$realisee=-1);
279                if ($frais_relance<0) $frais_relance=-$frais_relance; else $frais_relance=0;
280        }
281
282        while ($data = pmb_mysql_fetch_array($req)) {
283                //Calcul des amendes
284                $valeur=0;
285                $amende=new amende($data["pret_idempr"]);
286                $amd=$amende->get_amende($data["expl_id"]);
287                if ($amd["valeur"]) {
288                        $valeur=$amd["valeur"];
289                        $total_amendes+=$valeur;
290                }
291       
292                /* Récupération des infos exemplaires et prêt */
293                $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, ";
294                $requete.= " date_format(pret_date, '".$msg["format_date"]."') as aff_pret_date, ";
295                $requete.= " date_format(pret_retour, '".$msg["format_date"]."') as aff_pret_retour, ";
296                $requete.= " IF(pret_retour>sysdate(),0,1) as retard, notices_m.tparent_id, notices_m.tnvol " ; 
297                $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 ";
298                $requete.= "WHERE expl_cb='".addslashes($data['expl_cb'])."' and expl_typdoc = idtyp_doc and pret_idexpl = expl_id  ";
299               
300                $res = pmb_mysql_query($requete);
301                $expl = pmb_mysql_fetch_object($res);
302               
303                $responsabilites=array() ;
304                $header_aut = "" ;
305                $responsabilites = get_notice_authors(($expl->m_id+$expl->s_id)) ;
306                $as = array_search ("0", $responsabilites["responsabilites"]) ;
307                        if ($as!== FALSE && $as!== NULL) {
308                        $auteur_0 = $responsabilites["auteurs"][$as] ;
309                        $auteur = new auteur($auteur_0["id"]);
310                        $header_aut .= $auteur->isbd_entry;
311                        } else {
312                                $aut1_libelle=array();
313                                $as = array_keys ($responsabilites["responsabilites"], "1" ) ;
314                                        for ($i = 0 ; $i < count($as) ; $i++) {
315                                                $indice = $as[$i] ;
316                                                $auteur_1 = $responsabilites["auteurs"][$indice] ;
317                                                $auteur = new auteur($auteur_1["id"]);
318                                                $aut1_libelle[]= $auteur->isbd_entry;
319                                        }
320                               
321                                $header_aut .= implode (", ",$aut1_libelle) ;
322                        }
323                $header_aut ? $auteur=" / ".$header_aut : $auteur="";
324
325                // récupération du titre de série
326                $tit_serie="";
327                if ($expl->tparent_id && $expl->m_id) {
328                        $parent = new serie($expl->tparent_id);
329                        $tit_serie = $parent->name;
330                        if ($expl->tnvol)
331                                $tit_serie .= ', '.$expl->tnvol;
332                        }
333                if ($tit_serie) {
334                        $expl->tit = $tit_serie.'. '.$expl->tit;
335                        }
336
337                $texte_mail.=$expl->tit.$auteur."\r\n";
338                $texte_mail.="    -".sprintf($msg["relance_mail_retard_dates"],$expl->aff_pret_date,$expl->aff_pret_retour);
339                if ($valeur) $texte_mail.=" ".sprintf($msg["relance_mail_retard_amende"],comptes::format_simple($valeur));
340                $texte_mail.="\r\n";
341                $i++;
342        }
343        if ($total_amendes) $texte_mail.="\r\n".sprintf($msg["relance_mail_retard_total_amendes"],comptes::format_simple($total_amendes));
344       
345        if ($frais_relance) $texte_mail.="\r\n".$msg["relance_lettre_retard_frais_relance"].comptes::format_simple($frais_relance);
346       
347        if (($frais_relance)&&($total_amendes)) $texte_mail.="\r\n".$msg["relance_lettre_retard_total_du"].comptes::format_simple($total_amendes+$frais_relance);
348
349        $texte_mail.="\r\n\r\n";
350        if($after_list) $texte_mail.=$after_list."\r\n\r\n";
351        if($fdp) $texte_mail.=$fdp."\r\n\r\n";
352        $texte_mail.=mail_bloc_adresse();
353
354        //Si mail de rappel affecté au responsable du groupe
355        $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";
356        $res=pmb_mysql_query($requete);
357        /* Récupération du nom, prénom et mail du lecteur destinataire */
358        if(pmb_mysql_num_rows($res) > 0) {
359                $requete="select id_empr, empr_mail, empr_nom, empr_prenom from empr where id_empr='".pmb_mysql_result($res, 0,1)."'";
360                $result=pmb_mysql_query($requete);
361                $coords_dest=pmb_mysql_fetch_object($result);
362        } else {
363                $requete="select id_empr, empr_mail, empr_nom, empr_prenom from empr where id_empr=$id_empr";
364                $res=pmb_mysql_query($requete);
365                $coords_dest=pmb_mysql_fetch_object($res);
366        }
367
368        /* Récupération du nom, prénom et mail du lecteur concerné */
369        $requete="select id_empr, empr_mail, empr_nom, empr_prenom, empr_cb from empr where id_empr=$id_empr";
370        $res=pmb_mysql_query($requete);
371        $coords=pmb_mysql_fetch_object($res);
372       
373        //remplacement nom et prenom
374        $texte_mail=str_replace("!!empr_name!!", $coords->empr_nom,$texte_mail); 
375        $texte_mail=str_replace("!!empr_first_name!!", $coords->empr_prenom,$texte_mail); 
376
377        // function mailpmb($to_nom="", $to_mail, $obj="", $corps="", $from_name="", $from_mail, $headers, $copie_CC="", $copie_BCC="", $faire_nl2br=0, $pieces_jointes=array()) {
378        $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);
379        return $res_envoi;
380}
381
382function print_relance($id_empr,$mail=true) {
383        global $mailretard_priorite_email, $mailretard_priorite_email_3;
384        global $dbh,$charset, $msg, $pmb_gestion_financiere, $pmb_gestion_amende;
385        global $mail_sended;
386       
387        $mail_sended=0;
388        $not_mail=0;
389        if (($pmb_gestion_financiere)&&($pmb_gestion_amende)) {
390                $req="delete from cache_amendes where id_empr=".$id_empr;
391                pmb_mysql_query($req);
392                $amende=new amende($id_empr);
393                $level=$amende->get_max_level();
394                $niveau_min=$level["level_min"];
395                $id_expl=$level["level_min_id_expl"];
396                $total_amende = $amende->get_total_amendes();
397        }
398       
399        //Si mail de rappel affecté au groupe, on envoi au responsable
400        $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";
401        $res=pmb_mysql_query($requete);
402        if(pmb_mysql_num_rows($res) > 0) {
403                $requete="select empr_mail from empr where id_empr='".pmb_mysql_result($res,0,1)."'";
404                $res=pmb_mysql_query($requete);
405                if (@pmb_mysql_num_rows($res)) {
406                        list($empr_mail)=pmb_mysql_fetch_row($res);
407                }
408        } else {
409                $requete="select empr_mail from empr where id_empr=$id_empr";
410                $resultat=pmb_mysql_query($requete);
411                if (@pmb_mysql_num_rows($resultat)) {
412                        list($empr_mail)=pmb_mysql_fetch_row($resultat);
413                }
414        }
415       
416        if ($niveau_min) {
417                //Si c'est un mail
418                if (((($mailretard_priorite_email==1)||($mailretard_priorite_email==2))&&($empr_mail))&&( ($niveau_min<3)||($mailretard_priorite_email_3) )&&($mail)) {
419                        if (send_mail($id_empr,$niveau_min)) {
420                                $requete="update pret set printed=1 where pret_idexpl=".$id_expl;
421                                pmb_mysql_query($requete,$dbh);         
422                                $mail_sended=1;                 
423                        }
424                } else {
425                        $requete="update pret set printed=2 where pret_idexpl=".$id_expl;
426                        pmb_mysql_query($requete,$dbh);
427                        $not_mail=1;
428                        //Débit du compte lecteur
429                        /*$frais="finance_relance_".$niveau_min;
430                        global $$frais;
431                        if ($$frais) {
432                                $id_compte=comptes::get_compte_id_from_empr($id_empr,2);
433                                if ($id_compte) {
434                                        $cpte=new comptes($id_compte);
435                                        $cpte->record_transaction("",$$frais,-1,sprintf($msg["relance_frais_relance_level"],$niveau_min));
436                                }
437                        }*/
438                }
439        }
440        $req="delete from cache_amendes where id_empr=".$id_empr;
441        pmb_mysql_query($req);
442        //On loggue les infos de la lettre
443        $niveau_courant = $niveau_min;
444       
445        if($niveau_courant){
446               
447                $niveau_suppose = $level["level_normal"];
448                $cpt_id=comptes::get_compte_id_from_empr($id_empr,2);
449                $cpt=new comptes($cpt_id);
450                $solde=$cpt->update_solde();
451                $frais_relance=$cpt->summarize_transactions("","",0,$realisee=-1);
452                if ($frais_relance<0) $frais_relance=-$frais_relance; else $frais_relance=0;
453       
454                $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."')";
455                pmb_mysql_query($req,$dbh);             
456                $id_log_ret = pmb_mysql_insert_id();
457
458                $reqexpl = "select pret_idexpl as expl from pret where pret_retour<     CURDATE() and pret_idempr=$id_empr";
459                $resexple=pmb_mysql_query($reqexpl,$dbh);
460                while(($liste = pmb_mysql_fetch_object($resexple))){                   
461                        $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 " ;
462                        $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.", " ;
463                        $requete.= " notices_m.tparent_id, notices_m.tnvol " ;
464                        $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 ";
465                        $requete.= " WHERE expl_id='".$liste->expl."' and expl_typdoc = idtyp_doc and expl_section = idsection and expl_location = idlocation and pret_idexpl = expl_id  ";
466                        $res_det_expl = pmb_mysql_query($requete) ;
467                        $expl = pmb_mysql_fetch_object($res_det_expl);
468                        if (($pmb_gestion_financiere)&&($pmb_gestion_amende)) {         
469                                $amd = $amende->get_amende($liste->expl);
470                        }
471                        $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."')";
472                        pmb_mysql_query($req_ins,$dbh);
473                }
474        }                       
475        return $not_mail;
476}
477
478
479function filter_niveau($liste_ids,$champ,$selected="",$sort=false) {
480        global $all_level,$late_ids;
481        $ret="";
482        $t=array();
483        $v=array();
484
485        //Recherche des lecteurs en retard
486        if (!$late_ids) {
487                $requete="select distinct pret_idempr from pret where pret_retour<      CURDATE() and pret_idempr in (".implode(",",$liste_ids).")";
488                $res_id=pmb_mysql_query($requete);
489                if (($res_id)&&(pmb_mysql_num_rows($res_id))) {
490                        while ($r=pmb_mysql_fetch_object($res_id)) {
491                                $late_ids[$r->pret_idempr]=1;
492                        }
493                } else $late_ids=array();
494        }
495       
496        for ($i=0;$i<=count($liste_ids)-1;$i++) {
497                if (isset($late_ids[$liste_ids[$i]])) {
498                        $amende=new amende($liste_ids[$i]);
499                        $level=$amende->get_max_level();
500                        $t[$liste_ids[$i]]=$level[$champ];
501                        $v[$liste_ids[$i]]=$level;
502                }
503        }
504        if ($all_level) {
505                $liste_ids=array_keys($all_level);
506                //afin de gérer les filtres combinés..
507                if (($selected)&&(is_array($selected))) {
508                        if (!(count($selected) == 1 && ($selected[0] == -1))) {
509                                $all_level=array(0);
510                        }
511                }
512        }
513        for ($i=0;$i<=count($liste_ids)-1;$i++) {
514                if (($selected)&&(is_array($selected))) {
515                $as=array_search($v[$liste_ids[$i]][$champ],$selected);
516                if (($as!==FALSE)&&($as!==NULL)) $all_level[$liste_ids[$i]]=$v[$liste_ids[$i]];
517        }
518        }
519        if ($sort==true) sort($t[$champ],SORT_NUMERIC);
520        $result=array_unique($t);
521        sort($result,SORT_NUMERIC);
522        for ($i=0;$i<=count($result)-1;$i++) {
523                if ($result[$i]!=0) {
524                        $ret.="<option value='".$result[$i]."'";
525                        if (($selected)&&(is_array($selected))) {
526                        $as=array_search($result[$i],$selected);
527                        if (($as!==FALSE)&&($as!==NULL)) $ret.=" selected";     
528                }                               
529                        $ret.=">".$result[$i]."</option>";             
530                }
531        }
532        return $ret;
533}
534
535function filter_loc_expl($liste_ids,$champ,$selected="",$sort=false){
536        global $dbh,$charset;
537
538        global $all_level;
539        $ret="";
540       
541        if((($selected)&&(is_array($selected))) && !(count($selected) == 1 && ($selected[0] == -1))){
542                if(is_array($all_level) && count($all_level)){//Je repart des bons lecteurs
543                        $liste_ids=array_keys($all_level);
544                }
545       
546                $requete="SELECT pret_idempr FROM pret JOIN exemplaires ON pret_idexpl=expl_id JOIN docs_location ON expl_location=idlocation WHERE location_libelle IN ('".implode("','",$selected)."') ";
547                if(count($liste_ids)){
548                        $requete.="AND pret_idempr IN (".implode(",",$liste_ids).")";
549                }
550                $requete.=" GROUP BY pret_idempr";
551                $res=pmb_mysql_query($requete,$dbh);
552                if($res && pmb_mysql_num_rows($res)){
553                        $new_all_level=array(0);
554                        while ($empr=pmb_mysql_fetch_object($res)) {
555                                if($all_level[$empr->pret_idempr]){
556                                        $new_all_level[$empr->pret_idempr]=$all_level[$empr->pret_idempr];
557                                }else{
558                                        $amende=new amende($empr->pret_idempr);
559                                        $new_all_level[$empr->pret_idempr]=$amende->get_max_level();
560                                }
561                               
562                        }
563                        $all_level=$new_all_level;
564                }else{
565                        $all_level=array(0);
566                }
567        }
568       
569        if(!is_array($selected)){
570                $selected=array();
571        }
572        $requete="SELECT idlocation, location_libelle FROM docs_location GROUP BY location_libelle ORDER BY location_libelle";
573        $res=pmb_mysql_query($requete,$dbh);
574        if($res && pmb_mysql_num_rows($res)){
575                while ($ligne=pmb_mysql_fetch_object($res)) {
576                        $ret.="<option value='".htmlentities($ligne->location_libelle,ENT_QUOTES,$charset)."'";
577                        if(in_array($ligne->location_libelle,$selected)) $ret.=" selected";     
578                        $ret.=">".htmlentities($ligne->location_libelle,ENT_QUOTES,$charset)."</option>";       
579                }
580        }
581        return $ret;
582}
583
584// Pour localiser les relances : $deflt2docs_location, $pmb_lecteurs_localises, $empr_location_id ;
585$loc_filter = "";
586if ($pmb_lecteurs_localises) {
587        $empr_location_id = $deflt2docs_location;
588        $loc_filter = "and empr_location = '".$empr_location_id."' ";
589}
590
591//Traitement avant affichage
592switch ($act) {
593        case 'solo':
594                $id_empr=$relance_solo;
595                do_action($id_empr);
596                break;
597        case 'solo_print':
598                $id_empr=$relance_solo;
599                print_relance($id_empr,false);
600                break;
601        case 'solo_mail':
602                $id_empr=$relance_solo;
603                print_relance($id_empr);
604                break;
605        case 'valid':
606                for ($i=0; $i<count($empr); $i++) {
607                        $id_empr=$empr[$i];
608                        do_action($id_empr);
609                }
610                break;
611        case 'print':
612                $not_all_mail = array();
613                if ($empr) {
614                        $requete = "select id_empr from empr, pret, exemplaires where 1 ";
615                        $requete.=" and id_empr in (".implode(",",$empr).") ";
616                        //$requete.= $loc_filter;
617                        $requete.= "and pret_retour<CURDATE() and pret_idempr=id_empr and pret_idexpl=expl_id group by id_empr";
618                        $resultat=pmb_mysql_query($requete);
619                        $not_mail = 0;
620                        $mail_sended = 0;
621                        while ($r=pmb_mysql_fetch_object($resultat)) {
622                                $amende=new amende($r->id_empr);
623                                $level=$amende->get_max_level();
624                                $niveau_min=$level["level_min"];
625                                $printed=$level["printed"];
626                                if ((!$printed)&&($niveau_min)) {
627                                        $not_mail = print_relance($r->id_empr);
628                                        if (($not_mail == 1) || (!$mail_sended) ||($mailretard_priorite_email==2 && $niveau_min < 3)) { //mail_sended <=> globale
629                                                $not_all_mail[] = $r->id_empr;
630                                        }
631                                }
632                        }
633                }
634
635                if (count($not_all_mail) > 0) {
636                        print "
637                        <form name='print_empr_ids' action='pdf.php?pdfdoc=lettre_retard' target='lettre' method='post'>
638                        ";             
639                        for ($i=0; $i<count($not_all_mail); $i++) {
640                                print "<input type='hidden' name='empr_print[]' value='".$not_all_mail[$i]."'/>";
641                        }       
642                        print " <script>openPopUp('','lettre', 600, 500, -2, -2, 'toolbar=no, dependent=yes, resizable=yes');
643                                document.print_empr_ids.submit();
644                                </script>
645                        </form>
646                        ";
647                }
648                //Fermeture de la fenêtre d'impression si tout est parti par mail
649                break;
650        case 'export':
651                $req="TRUNCATE TABLE cache_amendes";
652                pmb_mysql_query($req);
653                $requete = "select id_empr from empr, pret, exemplaires where 1 ";
654                $requete.=" and id_empr in (".implode(",",$empr).") ";
655                //$requete.= $loc_filter;
656                $requete.= "and pret_retour< CURDATE() and pret_idempr=id_empr and pret_idexpl=expl_id group by id_empr";
657                $resultat=pmb_mysql_query($requete);
658                $not_all_mail=0;
659                while ($r=pmb_mysql_fetch_object($resultat)) {
660                        $amende=new amende($r->id_empr);
661                        $level=$amende->get_max_level();
662                        $niveau_min=$level["level_min"];
663                        $printed=$level["printed"];
664                        if ((!$printed)&&($niveau_min)) {
665                                $not_all_mail+=print_relance($r->id_empr);             
666                        }
667                }
668               
669                print "
670                <form name='print_empr_ids' action='./circ/relance/relance_export.php';' target='lettre' method='post'>
671                        <script>openPopUp('','lettre', 600, 500, -2, -2, 'toolbar=no, dependent=yes, resizable=yes');
672                        document.print_empr_ids.submit();
673                        </script>
674                </form>";
675               
676                //Fermeture de la fenêtre d'impression si tout est parti par mail
677                break; 
678        case 'raz_printed':
679                $req="TRUNCATE TABLE cache_amendes";
680                pmb_mysql_query($req);
681                $requete="update pret set printed=0 where printed!=0";
682                if ($printed_cd) {
683                        $requete.=" and date_relance='".stripslashes($printed_cd)."'";
684                }
685                pmb_mysql_query($requete);
686                break;
687}
688
689
690echo "<h1>".$msg["relance_menu"]."&nbsp;:&nbsp;".$msg["relance_to_do"]."&nbsp;<span id='nb_relance_to_do'>&nbsp;</span></h1>";
691
692// Juste pour la progress bar , on execute ceci:
693$req ="select id_empr  from empr, pret, exemplaires, empr_categ where 1 ";
694$req.= $loc_filter;
695$req.= "and pret_retour<CURDATE() and pret_idempr=id_empr and pret_idexpl=expl_id and id_categ_empr=empr_categ group by id_empr";
696$res=pmb_mysql_query($req);
697
698$nb=pmb_mysql_num_rows($res);
699if($nb>2){     
700        $progress_bar=new progress_bar($msg["relance_progress_bar"],$nb,3);             
701}
702
703// Calendrier activé : Est-il bien paramétré sur le site de gestion par défaut des lecteurs ?
704if ($pmb_utiliser_calendrier) {
705        $req_date_calendrier = "select count(num_location) as nb from ouvertures where date_ouverture >=curdate() and ouvert=1 and num_location=".$deflt2docs_location;
706        $res_date_calendrier = pmb_mysql_query($req_date_calendrier);
707        if ($res_date_calendrier) {
708                if (!pmb_mysql_result($res_date_calendrier, 0, "nb")) {
709                        warning("", "<span class='erreur'>".$msg["calendrier_active_and_empty"]."</span>");
710                }
711        }
712}
713
714$requete ="select id_empr, empr_nom, empr_prenom, empr_cb, count(pret_idexpl) as empr_nb, empr_codestat, empr_mail, libelle from empr, pret, exemplaires, empr_categ where 1 ";
715$requete.= $loc_filter;
716$requete.= "and pret_retour<CURDATE() and pret_idempr=id_empr and pret_idexpl=expl_id and id_categ_empr=empr_categ group by id_empr order by empr_nom, empr_prenom";
717
718if (($empr_sort_rows)||($empr_show_rows)||($empr_filter_rows)) {
719        require_once($class_path."/filter_list.class.php");
720        if ($pmb_lecteurs_localises) $localisation=",l";
721        if($pmb_transferts_actif){
722                $loc_expl=",13";
723        }else{
724                $loc_expl="";
725        }
726        $p_perso=new pret_parametres_perso("pret");
727        $filter_p_perso = "";
728        if(count($p_perso->t_fields)) {
729                foreach ($p_perso->t_fields as $id=>$field) {
730                        if($field["FILTERS"]) {
731                                        $filter_p_perso.= ",#p".$id;
732                        }
733                }
734        }
735        $filter=new filter_list("empr","empr_list","b,n,c,cs,g","b,n,c,g".$localisation.",2,3,cs".$loc_expl.$filter_p_perso,"n,g");
736        if ($pmb_lecteurs_localises) {
737                $lo="f".$filter->fixedfields["l"]["ID"];
738                global $$lo;
739                if (!$$lo) {
740                        $tableau=array();
741                        $tableau[0]=$deflt2docs_location;
742                        $$lo=$tableau;
743                }
744        }
745        $filter->fixedcolumns="b,n,c";
746        $filter->original_query=$requete;
747        $filter->multiple=1;
748        $t=array();
749        $t["table"]="";
750        $t["row_even"]="even";
751        $t["row_odd"]="odd";
752        $t["cols"][0]="";
753        $filter->css=$t;
754        $filter->select_original="table_filter_tempo.empr_nb,empr_mail";
755        $filter->original_query="select id_empr,count(pret_idexpl) as empr_nb from empr,pret where pret_retour<CURDATE() and pret_idempr=id_empr group by empr.id_empr";
756        $filter->from_original="";
757        $filter->activate_filters();
758        if (!$filter->error) {
759                $aff_filters="<script type='text/javascript' src='./javascript/tablist.js'></script><form class='form-$current_module' id='form_filters' name='form_filters' method='post' action='".$PHP_SELF."?categ=relance&sub=todo'><h3>".$msg["filters_tris"]."</h3>";
760                $aff_filters.="<div class='form-contenu'><div id=\"el1Parent\" class=\"notice-parent\"><img src=\"./images/plus.gif\" name=\"imEx\" class=\"img_plus\" id=\"el1Img\" title=\"".$msg['admin_param_detail']."\" border=\"0\" onClick=\"expandBase('el1', true); return false;\">
761                                                                <b>".$msg["filters"]."</b></div>
762                                                <div id=\"el1Child\" style=\"margin-left:7px;display:none;\">";
763                $aff_filters.=$filter->display_filters();
764                $aff_filters.="</div><div class='row'></div><div id=\"el2Parent\" class=\"notice-parent\"><img src=\"./images/plus.gif\" name=\"imEx\" class=\"img_plus\" id=\"el2Img\" title=\"".$msg['admin_param_detail']."\" border=\"0\" onClick=\"expandBase('el2', true); return false;\">
765                                                        <b>".$msg["tris_dispos"]."</b></div>
766                                                        <div id=\"el2Child\" style=\"margin-left:7px;display:none;\">";
767                $aff_filters.=$filter->display_sort();
768                $aff_filters.="</div></div><div class='row'></div><input type='submit' class='bouton' value='".$msg["empr_sort_filter_button"]."'></form>";
769                $aff_filters.=$filter->make_human_filters();
770                $aff_filters.="<script>
771                                                function envoi() {
772                                                        var formulaire=document.form_filters;
773                                                        var j=0;
774                                                        for (i=0;i<formulaire.elements.length;i++) {
775                                                                var values=new Array();
776                                                                if (formulaire.elements[i].type=='select-multiple') {
777                                                                        for (j=0; j<formulaire.elements[i].options.length; j++) {
778                                                                                if (formulaire.elements[i].options[j].selected) {
779                                                                                        values[values.length]=formulaire.elements[i].options[j].value;
780                                                                                }
781                                                                        }
782                                                                } else values[0]=formulaire.elements[i].value;
783                                                                if (values.length) {
784                                                                        for (j=0; j<values.length; j++) {
785                                                                                var nouvelelement=document.createElement('input');
786                                                                                nouvelelement.setAttribute('type','hidden');
787                                                                                nouvelelement.setAttribute('name',formulaire.elements[i].name);
788                                                                                nouvelelement.value=values[j];
789                                                                                document.relance_action.appendChild(nouvelelement);     
790                                                                        }
791                                                                }
792                                                        }
793                                                        document.relance_action.submit();
794                                                }
795                                        </script>";
796                print $aff_filters;
797                if ($all_level) {
798                        $pos=strpos($filter->query,"where");
799                        $requete=substr($filter->query,0,$pos+6);
800                        $requete.=$filter->params["REFERENCE"][0][value].".".$filter->params["REFERENCEKEY"][0][value]." in (".implode(",",array_keys($all_level)).") and ";
801                        $requete.=substr($filter->query,$pos+6,strlen($filter->query)-($pos+6));
802                } else $requete=$filter->query;
803                $colonnes=$filter->display_columns();
804                $script="envoi();";
805        } else print $filter->error_message;
806} else {
807        $script="this.form.submit();";
808        $colonnes="<th>".$msg["relance_code_empr"]."</th><th>".$msg["relance_name_empr"]."</th><th>".$msg["59"]."</th><th>".$msg["codestat_empr"]."</th><th>".$msg["groupe_empr"]."</th>";
809}
810echo "<form name='relance_action' action='./circ.php?categ=relance&sub=todo' method='post'>
811<input type='hidden' name='relance_solo' value=''/>
812<input type='hidden' name='act' value=''/>
813<input type='hidden' name='printed_cd' value=''/>";
814
815echo "<script type='text/javascript' src='./javascript/sorttable.js'></script>
816        <table width='100%' class='sortable'>";
817echo "<tr>".$colonnes."<th>".$msg["relance_nb_retard"]."</th><th>".$msg["relance_dernier_niveau"]."</th><th>".$msg["relance_date_derniere"]."</th><th>".$msg["relance_imprime"]."</th><th>".$msg["relance_niveau_suppose"]."</th><th>".$msg["relance_action_prochaine"]."</th><th>&nbsp;</th></tr>";
818
819$resultat=pmb_mysql_query($requete);
820$pair=false;
821//Nombre de relances à faire
822$nb_relances = 0;
823while ($r=pmb_mysql_fetch_array($resultat)) {
824        if (!$pair) $pair_impair = "odd"; else $pair_impair = "even";
825        $tr_javascript=" onmouseover=\"this.className='surbrillance'\" onmouseout=\"this.className='$pair_impair'\" ";
826        if ($all_level[$r["id_empr"]]) $level=$all_level[$r["id_empr"]];       
827        else {
828                $amende=new amende($r["id_empr"]);
829                $level=$amende->get_max_level();
830        }
831        if (($level["level_normal"])||($level["level_min"])) {
832                $pair=!$pair;
833                print "<tr class='$pair_impair' $tr_javascript>";
834                print "<td>".htmlentities($r["empr_cb"],ENT_QUOTES,$charset)."</td>";
835                print "<td><a href='./circ.php?categ=pret&id_empr=".$r["id_empr"]."'>".htmlentities($r["empr_nom"]." ".$r["empr_prenom"],ENT_QUOTES,$charset)."</a></td>";
836                print "<td>".htmlentities($r["libelle_categ"],ENT_QUOTES,$charset)."</td>";
837                print "<td>".htmlentities($r["libelle_codestat"],ENT_QUOTES,$charset)."</td>";
838                print "<td>".htmlentities($r["group_name"],ENT_QUOTES,$charset)."</td>";
839                print "<td>".htmlentities($r["empr_nb"],ENT_QUOTES,$charset)."</td>";
840                $niveau=$level["level"];
841                $niveau_min=$level["level_min"];
842                $niveau_normal=$level["level_normal"];
843                $printed=$level["printed"];
844                $date_relance=$level["level_min_date_relance"];
845                $list_dates[$date_relance]=format_date($date_relance);
846                if ($printed) {
847                        $list_dates_relance[$date_relance]=$list_dates[$date_relance];
848                        $dr=explode("-",$date_relance);
849                        $list_dates_sort[$date_relance]=mktime(0,0,0,$dr[1],$dr[2],$dr[0]);
850                }
851                //Tri des dates
852                if (count($list_dates_sort)) {
853                        arsort($list_dates_sort);
854                }
855                print "<td>$niveau_min</td>";
856                print "<td>".$list_dates[$date_relance]."</td>";
857                print "<td>".($printed?"x":"")."</td>";
858                print "<td>$niveau_normal</td>";
859                print "<td>".get_action($r["id_empr"],$niveau_min,$niveau_normal)."</td>";
860                print "<td><input type='button' class='bouton_small' value='".$msg["relance_row_valid"]."' onClick=\"this.form.act.value='solo'; this.form.relance_solo.value='".$r["id_empr"]."'; $script\"/>&nbsp;";
861               
862                //Si mail de rappel affecté au responsable du groupe
863                $requete="select id_groupe,resp_groupe from groupe,empr_groupe where id_groupe=groupe_id and empr_id=".$r["id_empr"]." and resp_groupe and mail_rappel limit 1";
864                $res=pmb_mysql_query($requete);
865                if(pmb_mysql_num_rows($res) > 0) {
866                        $requete="select id_empr, empr_mail from empr where id_empr='".pmb_mysql_result($res, 0,1)."'";
867                        $result=pmb_mysql_query($requete);
868                        $has_mail = (pmb_mysql_result($result, 0,1) ? 1 : 0);
869                } else {
870                        $has_mail = ($r["empr_mail"] ? 1 : 0);
871                }
872
873                if ($niveau_min) {
874                        print "<input type='button' class='bouton_small' value='".$msg["relance_row_print"]."' onClick=\"openPopUp('pdf.php?pdfdoc=lettre_retard&id_empr=".$r["id_empr"]."&niveau=".$niveau_min."','lettre', 600, 500, -2, -2, 'toolbar=no, dependent=yes, resizable=yes'); this.form.act.value='solo_print'; this.form.relance_solo.value='".$r["id_empr"]."'; $script\"/>";
875                        if (((($mailretard_priorite_email==1)||($mailretard_priorite_email==2))&&($has_mail))&&(($niveau_min<3)||($mailretard_priorite_email_3==1 && $niveau_min>=3)))
876                                print "<input type='button' class='bouton_small' value='".$msg["relance_row_mail"]."' onClick=\"this.form.act.value='solo_mail'; this.form.relance_solo.value='".$r["id_empr"]."'; $script\"/>";
877                }
878                print "</td>";
879                print "</tr>\n";
880                $nb_relances++;
881        }
882}
883echo "</table>";
884print "<div class='right'>";
885print "<input type='button' class='bouton' value='".$msg["relance_valid_all"]."' onClick=\"this.form.act.value='valid'; this.form.relance_solo.value=''; $script\"/>&nbsp;";
886print "<input type='button' class='bouton' value='".$msg["relance_print_nonprinted"]."' onClick=\"this.form.act.value='print'; this.form.relance_solo.value=''; $script\"/>&nbsp;";
887print "<input type='button' class='bouton' value='".$msg["relance_export"]."' onClick=\"this.form.act.value='export'; this.form.relance_solo.value=''; $script\"/>&nbsp;";
888
889if (count($list_dates_relance)) {
890        print "<input type='button' value='".addslashes($msg["print_relance_clear"])."' onClick=\"if (confirm('".sprintf(addslashes($msg["confirm_print_relance_clear"]),"'+this.form.clear_date.options[this.form.clear_date.selectedIndex].text+' ?'").")) { this.form.act.value='raz_printed'; this.form.printed_cd.value=this.form.clear_date.options[this.form.clear_date.selectedIndex].value; $script }\" class='bouton'/>&nbsp;<select name='clear_date'>";
891        print "<option value=''>".$msg["print_relance_clear_all"]."</option>\n";
892        foreach ($list_dates_sort as $val=>$stamp) {
893                $lib=$list_dates_relance[$val];
894                print "<option value='$val'>".$lib."</option>\n";
895        }
896        print "</select>";
897}
898print "</div></form>";
899print "<script type='text/javascript'>document.getElementById('nb_relance_to_do').innerHTML='(".$nb_relances.")';</script>";
900if($progress_bar)$progress_bar->hide();
901?>
Note: See TracBrowser for help on using the repository browser.