=head1 SYNOPSIS
-overdue_notices.pl [ -n ] [ -library <branchcode> ] [ -library <branchcode>...] [ -max <number of days> ] [ -csv [ <filename> ] ] [ -itemscontent <field list> ]
+overdue_notices.pl
+ [ -n ][ -library <branchcode> ][ -library <branchcode> ... ]
+ [ -max <number of days> ][ -csv [<filename>] ][ -itemscontent <field list> ]
+ [ -email <email_type> ... ]
Options:
-help brief help message
-itemscontent <list of fields> item information in templates
-borcat <categorycode> category code that must be included
-borcatout <categorycode> category code that must be excluded
+ -email <email_type> type of email that will be used. Can be 'email', 'emailpro' or 'B_email'. Repeatable.
=head1 OPTIONS
use it in order to send overdues on a specific date and not Now.
+=item B<-email>
+
+Allows to specify which type of email will be used. Can be email, emailpro or B_email. Repeatable.
+
=back
=head1 DESCRIPTION
my $nomail = 0;
my $MAX = 90;
my @branchcodes; # Branch(es) passed as parameter
+my @emails_to_use; # Emails to use for messaging
+my @emails; # Emails given in command-line parameters
my $csvfilename;
my $htmlfilename;
my $triggered = 0;
'date' => \$date,
'borcat=s' => \@myborcat,
'borcatout=s' => \@myborcatout,
+ 'email=s' => \@emails,
) or pod2usage(2);
pod2usage(1) if $help;
pod2usage( -verbose => 2 ) if $man;
next PERIOD;
}
- my $letter_template = C4::Letters::GetLetter (
- module => 'circulation',
- letter_code => $overdue_rules->{"letter$i"},
- branchcode => $branchcode
- );
-
# $letter->{'content'} is the text of the mail that is sent.
# this text contains fields that are replaced by their value. Those fields must be written between brackets
# The following fields are available :
# itemcount is interpreted here as the number of items in the overdue range defined by the current notice or all overdues < max if(-list-all).
- # <date> <itemcount> <firstname> <lastname> <address1> <address2> <address3> <city> <postcode>
+ # <date> <itemcount> <firstname> <lastname> <address1> <address2> <address3> <city> <postcode> <country>
my $borrower_sql = <<'END_SQL';
-SELECT distinct(issues.borrowernumber), firstname, surname, address, address2, city, zipcode, country, email
+SELECT distinct(issues.borrowernumber), firstname, surname, address, address2, city, zipcode, country, email, emailpro, B_email
FROM issues,borrowers,categories
WHERE issues.borrowernumber=borrowers.borrowernumber
AND borrowers.categorycode=categories.categorycode
$sth->execute(@borrower_parameters);
$verbose and warn $borrower_sql . "\n $branchcode | " . $overdue_rules->{'categorycode'} . "\n ($mindays, $maxdays)\nreturns " . $sth->rows . " rows";
- while ( my ( $borrowernumber, $firstname, $lastname,
- $address1, $address2, $city, $postcode, $country, $email
- ) = $sth->fetchrow )
- {
- $verbose and warn "borrower $firstname, $lastname ($borrowernumber) has items triggering level $i.";
+ while ( my $data = $sth->fetchrow_hashref ) {
+ my $borrowernumber = $data->{'borrowernumber'};
+ my $borr =
+ $data->{'firstname'} . ', '
+ . $data->{'surname'} . ' ('
+ . $borrowernumber . ')';
+ $verbose
+ and warn "borrower $borr has items triggering level $i.";
+
+ @emails_to_use = ();
+ my $notice_email =
+ C4::Members::GetNoticeEmailAddress($borrowernumber);
+ unless ($nomail) {
+ if (@emails) {
+ foreach (@emails) {
+ push @emails_to_use, $data->{$_} if ( $data->{$_} );
+ }
+ }
+ else {
+ push @emails_to_use, $notice_email if ($notice_email);
+ }
+ }
+
+ my $letter = C4::Letters::getletter( 'circulation', $overdue_rules->{"letter$i"}, $branchcode );
+
+ unless ($letter) {
+ $verbose and warn "Message '$overdue_rules->{letter$i}' content not found";
+
+ # might as well skip while PERIOD, no other borrowers are going to work.
+ # FIXME : Does this mean a letter must be defined in order to trigger a debar ?
+ next PERIOD;
+ }
if ( $overdue_rules->{"debarred$i"} ) {
#action taken is debarring
C4::Members::DebarMember($borrowernumber, '9999-12-31');
- $verbose and warn "debarring $borrowernumber $firstname $lastname\n";
+ $verbose and warn "debarring $borr\n";
}
my @params = ($listall ? ( $borrowernumber , 1 , $MAX ) : ( $borrowernumber, $mindays, $maxdays ));
$verbose and warn "STH2 PARAMS: borrowernumber = $borrowernumber, mindays = $mindays, maxdays = $maxdays";
my $j = 0;
my $exceededPrintNoticesMaxLines = 0;
while ( my $item_info = $sth2->fetchrow_hashref() ) {
- if ( ( !$email || $nomail ) && $PrintNoticesMaxLines && $j >= $PrintNoticesMaxLines ) {
+ if ( ( scalar(@emails_to_use) == 0 || $nomail ) && $PrintNoticesMaxLines && $j >= $PrintNoticesMaxLines ) {
$exceededPrintNoticesMaxLines = 1;
last;
}
}
$sth2->finish;
- my $letter = parse_letter(
+ $letter = parse_letter(
{ letter_code => $overdue_rules->{"letter$i"},
- letter => $letter_template,
borrowernumber => $borrowernumber,
branchcode => $branchcode,
items => \@items,
}
$letter->{'content'} =~ s/\<[^<>]*?\>//g; # Now that we've warned about them, remove them.
$letter->{'content'} =~ s/\<[^<>]*?\>//g; # 2nd pass for the double nesting.
-
- if ($nomail) {
-
+
+ if ( !$nomail && scalar @emails_to_use ) {
+ C4::Letters::EnqueueLetter(
+ { letter => $letter,
+ borrowernumber => $borrowernumber,
+ message_transport_type => 'email',
+ from_address => $admin_email_address,
+ to_address => join(',', @emails_to_use),
+ }
+ );
+ } else {
+ # if not sent by email then print
push @output_chunks,
prepare_letter_for_printing(
{ letter => $letter,
borrowernumber => $borrowernumber,
- firstname => $firstname,
- lastname => $lastname,
- address1 => $address1,
- address2 => $address2,
- city => $city,
- postcode => $postcode,
- email => $email,
+ firstname => $data->{'firstname'},
+ lastname => $data->{'surname'},
+ address1 => $data->{'address'},
+ address2 => $data->{'address2'},
+ city => $data->{'city'},
+ postcode => $data->{'zipcode'},
+ country => $data->{'country'},
+ email => $notice_email,
itemcount => $itemcount,
titles => $titles,
outputformat => defined $csvfilename ? 'csv' : defined $htmlfilename ? 'html' : '',
}
);
- } else {
- if ($email) {
- C4::Letters::EnqueueLetter(
- { letter => $letter,
- borrowernumber => $borrowernumber,
- message_transport_type => 'email',
- from_address => $admin_email_address,
- }
- );
- } else {
-
- # If we don't have an email address for this patron, send it to the admin to deal with.
- push @output_chunks,
- prepare_letter_for_printing(
- { letter => $letter,
- borrowernumber => $borrowernumber,
- firstname => $firstname,
- lastname => $lastname,
- address1 => $address1,
- address2 => $address2,
- city => $city,
- postcode => $postcode,
- email => $email,
- itemcount => $itemcount,
- titles => $titles,
- outputformat => defined $csvfilename ? 'csv' : defined $htmlfilename ? 'html' : '',
- }
- );
- }
}
}
$sth->finish;
print @output_chunks;
}
# Generate the content of the csv with headers
- my $content = join(";", qw(title name surname address1 address2 zipcode city email itemcount itemsinfo due_date issue_date)) . "\n";
+ my $content = join(";", qw(title name surname address1 address2 zipcode city country email itemcount itemsinfo due_date issue_date)) . "\n";
$content .= join( "\n", @output_chunks );
my $attachment = {
filename => defined $csvfilename ? 'attachment.csv' : 'attachment.txt',
- type => 'text/plain; charset="utf-8"',
+ type => 'text/plain',
content => $content,
};
my $letter = {
- 'content-type' => 'text/plain; charset="utf-8"',
title => 'Overdue Notices',
content => 'These messages were not sent directly to the patrons.',
};
}
my $currency_format;
- if ($params->{'letter'}->{'content'} =~ m/<fine>(.*)<\/fine>/o) { # process any fine tags...
+ if ( defined $params->{'letter'}->{'content'}
+ and $params->{'letter'}->{'content'} =~ m/<fine>(.*)<\/fine>/o )
+ { # process any fine tags...
$currency_format = $1;
- $params->{'letter'}->{'content'} =~ s/<fine>.*<\/fine>/<<items.fine>>/o;
+ $params->{'letter'}->{'content'} =~ s/<fine>.*<\/fine>/<<item.fine>>/o;
}
my @item_tables;
my $item_format = '';
foreach my $item (@$i) {
my $fine = GetFine($item->{'itemnumber'}, $params->{'borrowernumber'});
- if (!$item_format) {
+ if ( !$item_format and defined $params->{'letter'}->{'content'} ) {
$params->{'letter'}->{'content'} =~ m/(<item>.*<\/item>)/;
$item_format = $1;
}
}
}
- return C4::Letters::GetProcessedLetter (
+ return C4::Letters::GetPreparedLetter (
module => 'circulation',
letter_code => $params->{'letter_code'},
- letter => $params->{'letter'},
branchcode => $params->{'branchcode'},
tables => \%tables,
substitute => $substitute,
- repeat => { item => \@item_tables }
+ repeat => { item => \@item_tables },
);
}
if ( exists $params->{'outputformat'} && $params->{'outputformat'} eq 'csv' ) {
if ($csv->combine(
$params->{'firstname'}, $params->{'lastname'}, $params->{'address1'}, $params->{'address2'}, $params->{'postcode'},
- $params->{'city'}, $params->{'email'}, $params->{'itemcount'}, $params->{'titles'}
+ $params->{'city'}, $params->{'country'}, $params->{'email'}, $params->{'itemcount'}, $params->{'titles'}
)
) {
return $csv->string, "\n";