Changed some hidden values for the record editor, shortened items labels,
[koha.git] / misc / overduenotices-30.pl
1 #!/usr/bin/perl -w
2 #-----------------------------------
3 # Script Name: overduenotices.pl
4 # Script Version: 1.0
5 # Date:  2003/9/7
6 # Author:  Stephen Hedges (shedges@skemotah.com)
7 # modified by Paul Poulain (paul@koha-fr.org)
8 # modified by Henri-Damien LAURENT (henridamien@koha-fr.org)
9 # Description: 
10 #       This script runs a Koha report of items using overduerules tables and letters tool management.
11 # Revision History:
12 #    1.0  2003/9/7: original version
13 #    1.5  2006/2/28: Modifications for managing Letters and overduerules
14 #-----------------------------------
15 # Copyright 2003 Skemotah Solutions
16 #
17 # This file is part of Koha.
18 #
19 # Koha is free software; you can redistribute it and/or modify it under the
20 # terms of the GNU General Public License as published by the Free Software
21 # Foundation; either version 2 of the License, or (at your option) any later
22 # version.
23 #
24 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
25 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
26 # A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
27 #
28 # You should have received a copy of the GNU General Public License along with
29 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
30 # Suite 330, Boston, MA  02111-1307 USA
31
32 use strict;
33 use C4::Context;
34 use C4::Date;
35 use Mail::Sendmail;  # comment out if not doing e-mail notices
36 use Getopt::Long;
37 use Data::Dumper;
38
39 my ($confirm, $nomail, $mybranch, $myborcat,$myborcatout, $letter, $MAX, $choice);
40 GetOptions(
41     'c'    => \$confirm,
42         'n'     => \$nomail,
43         'max=s' => \$MAX,
44         'all'   => \$choice,
45 );
46 unless ($confirm) {
47         print qq|
48 This script will send overdue notices by e-mail and prepare a file of\nnotices for printing if the borrower does not have e-mail.
49 You MUST edit this script for your library BEFORE you run it for the first time!
50 See the comments in the script for directions on changing the script.
51 This script has 2 parameters :
52         -c to confirm and remove this help & warning
53         -n to avoid sending any mail. Instead, all mail messages are printed on screen. Usefull for testing purposes.
54         -branch <branchcode> to select overdues for ONE specific branch.
55         -borcat <borcatcode> to select overdues for one borrower category,
56         -borcatout <borcatcode> to exclude this borrower category from overdunotices,
57         -max <MAX> MAXIMUM day count before stopping to send overdue notice,
58         -file <filename> to enter a specific filename to be read for message.
59         -all to include ALL the items that reader borrowed.
60
61 Do you wish to continue? (y/n)
62 |;
63         chomp($_ = <STDIN>);
64         exit unless (/^(y|Y|o|O)/i);  # comment these lines out once you've made the changes
65         
66 }
67 #warn 'site '.$mybranch.' text '.$letter;
68 my $dbh = C4::Context->dbh;
69 my $rqoverduebranches=$dbh->prepare("SELECT DISTINCT branchcode from overduerules where delay1>0");
70 $rqoverduebranches->execute;
71 while (my ($branchcode)=$rqoverduebranches->fetchrow){
72         warn "branchcode : $branchcode";
73         my $branchname;
74         my $emailaddress;
75         if ($branchcode){
76                 my $rqbranch=$dbh->prepare("SELECT * from branches where branchcode = ?");
77                 $rqbranch->execute($branchcode);
78                 my $data = $rqbranch->fetchrow_hashref;
79                 $emailaddress = $data->{branchemail};
80                 $branchname = $data->{branchname};
81         }
82         $emailaddress=C4::Context->preference('KohaAdminEmailAddress') unless ($emailaddress);
83
84         #print STDERR "$emailaddress\n";
85         #
86         # BEGINNING OF PARAMETERS
87         #
88         my $rqoverduerules=$dbh->prepare("SELECT * from overduerules where delay1>0 and branchcode = ?");
89         $rqoverduerules->execute($branchcode);
90         while (my $data=$rqoverduerules->fetchrow_hashref){
91                 for (my $i=1; $i<=3;$i++){
92                         #Two actions :
93                         # A- Send a letter
94                         # B- Debar
95                         my $mindays = $data->{"delay$i"}; # the notice will be sent after mindays days (grace period)
96                         my $rqdebarring=$dbh->prepare("UPDATE borrowers SET debarred=1 WHERE borrowernumber=?") if $data->{"debarred$i"};
97                         my $maxdays = ($data->{"delay".($i+1)}?
98                                                                 $data->{"delay".($i+1)}
99                                                                 :($MAX?$MAX:365)); # issues being more than maxdays late are managed somewhere else. (borrower probably suspended)
100                         #LETTER parameters
101                         my $smtpserver = 'smtp.wanadoo.fr'; # your smtp server (the server who sent mails)
102                         my $from = $emailaddress; # all the mails sent to the borrowers will appear coming from here.
103                         my $mailtitle = 'Overdue'; # the title of the mails
104                         $mailtitle = 'Issue status' if ($choice); # the title of the mails
105                         my $librarymail = $emailaddress; # all notices without mail are sent (in 1 mail) to this mail address. They must then be managed manually.
106                         my $letter = $data->{"letter$i"} if $data->{"letter$i"};
107                         # this parameter (the last) is the text of the mail that is sent.
108                         # this text contains fields that are replaced by their value. Those fields must be written between brackets
109                         # The following fields are available :
110                         # <date> <itemcount> <firstname> <lastname> <address1> <address2> <address3> <city> <postcode>
111                         my $mailtext=$letter;
112                         #
113                         # END OF PARAMETERS
114                         #
115                         open OUTFILE, ">overdues" or die "Cannot open file overdues: $!";
116                         
117                         # set the e-mail server -- comment out if not doing e-mail notices
118                         unshift @{$Mail::Sendmail::mailcfg{'smtp'}} , $smtpserver;
119                         #                                         set your own mail server name here
120                         
121                         my $strsth = "SELECT COUNT(*), issues.borrowernumber,firstname,surname,streetaddress,physstreet,city,zipcode, emailaddress, MIN(date_due) as longest_issue FROM issues,borrowers,categories WHERE returndate IS NULL AND issues.borrowernumber=borrowers.borrowernumber and borrowers.categorycode=categories.categorycode ";
122                         $strsth .= " and issues.branchcode='".$branchcode."' " if ($branchcode);
123                         $strsth .= " and borrowers.categorycode='".$data->{categorycode}."' " if ($data->{categorycode});
124                         $strsth .= " and categories.overduenoticerequired=1 group by issues.borrowernumber HAVING TO_DAYS(NOW())-TO_DAYS(longest_issue) BETWEEN $mindays and $maxdays ";
125                         my $sth = $dbh->prepare ($strsth);
126                         warn "".$strsth;
127                         my $sth2 = $dbh->prepare("SELECT biblio.title,biblio.author,items.barcode, issues.timestamp FROM issues,items,biblio WHERE items.itemnumber=issues.itemnumber and biblio.biblionumber=items.biblionumber AND issues.borrowernumber=? AND returndate IS NULL AND TO_DAYS(NOW())-TO_DAYS(date_due) BETWEEN $mindays and $maxdays");
128
129                         $sth->execute;
130                         # 
131                         # my $itemcount = 0;
132                         # my $row;
133                         my $count = 0;   # to keep track of how many notices are printed
134                         my $e_count = 0;   # and e-mailed
135                         my $date=format_date(localtime);
136                         my ($itemcount,$borrnum,$firstname,$lastname,$address1,$address2,$city,$postcode,$email);
137                         
138                         while (($itemcount,$borrnum,$firstname,$lastname,$address1,$address2,$city,$postcode,$email) = $sth->fetchrow) {
139                                 if ($data->{"debarred$i"}){
140                                         #action taken is debarring
141                                         $rqdebarring->execute($borrnum);
142                                         warn "debarring $borrnum $firstname $lastname";
143                                 }
144                 #               print STDERR "$itemcount,$borrnum,$firstname,$lastname,$address1,$address2,$city,$postcode,$email\n"; 
145                                 if ($letter){
146                                         my $notice .= $mailtext;
147                         #               print STDERR "$notice\n";
148                                         $notice =~ s/\<itemcount\>/$itemcount/g if ($itemcount);
149                                         $notice =~ s/\<firstname\>/$firstname/g if ($firstname);
150                                         $notice =~ s/\<lastname\>/$lastname/g if ($lastname);
151                                         $notice =~ s/\<address1\>/$address1/g if ($address1);
152                                         $notice =~ s/\<address2\>/$address2/g if ($address2);
153                                         $notice =~ s/\<city\>/$city/g if ($city);
154                                         $notice =~ s/\<postcode\>/$postcode/g if ($postcode);
155                                         $notice =~ s/\<date\>/$date/g if ($date);
156                                         $notice =~ s/\<bib\>/$branchname/g if ($branchname);
157                         
158                                         $sth2->execute($borrnum);
159                                         my $titles="";
160                                         my ($title, $author, $barcode, $issuedate);
161                                         while (($title, $author, $barcode,$issuedate) = $sth2->fetchrow){
162                                                 $titles .= "    ".format_date($issuedate)."     ".($barcode?$barcode:"")."      ".($title?$title:"")."  ".($author?$author:"")."\n";
163                                         }
164                         #                       print STDERR "$titles";
165                                         $notice =~ s/\<titles\>/$titles/g;
166                                         $sth2->finish;
167                                 # if not using e-mail notices, comment out the following lines
168                                         if ($email) {   # or you might check for borrowers.preferredcont 
169                                                 if ($nomail) {
170                                                         print "TO => $email\n";
171                                                         print "FROM => $from\n";
172                                                         print "SUBJECT => $mailtitle\n";
173                                                         print "MESSAGE => $notice\n";
174                                                 } else {
175                                                         my %mail = ( To      => $email,
176                                                                                         From    => $from,
177                                                                                         Subject => $mailtitle,
178                                                                                         Message => $notice,
179                                                                 );
180                                                         sendmail(%mail);
181                                                 }
182                                                 $e_count++
183                                         } else {
184                                                 print OUTFILE $notice;
185                                                 $count++;
186                                         }    # and comment this one out, too, if not using e-mail
187                                 }
188                         }
189                         $sth->finish;
190                         close OUTFILE;
191                         # if some notices have to be printed & managed by the library, send them to library mail address.
192                         if ($count) {
193                                 open ODUES, "overdues" or die "Cannot open file overdues: $!";
194                                 my $notice = "$e_count overdue notices e-mailed\n";
195                                 $notice .= "$count overdue notices in file for printing\n\n";
196                 
197                                 $notice .= <ODUES>;
198                                 if ($nomail) {
199                                         print "TO => $email\n" if $email;
200                                         print "FROM => $from\n";
201                                         print "SUBJECT => Koha overdue\n";
202                                         print "MESSAGE => $notice\n";
203                                 } else {
204                                         my %mail = ( To      => $email,
205                                                                         From    => $from,
206                                                                         Subject => 'Koha overdues',
207                                                                         Message => $notice,
208                                                 );
209                                         sendmail(%mail);
210                                 }
211                         }
212                 }
213         }
214 }