[Koha-patches] [PATCH] Bugfix: [1/3] overdue_notices.pl does not process all advertised fields

Chris Nighswonger cnighswonger at foundations.edu
Tue Feb 16 16:56:02 CET 2010


Note: overdue_notices.pl really needs to be completely re-written.

The script does not process all fields advertised in tools/letter.pl
This patch adds code to process all fields advertised as well as any
from the items table.

It also adds two additional tags for use in the letter templates:

<item></item> which should enclose all fields from the biblio, biblioitems,
and items tables.

<fine></fine> which should be enclosed by the item tag and should
enclose a currency identifier per ISO 4217. If this tag is present with
a proper identifier, the fine for that item will be displayed in the
proper currency format. Note: ISO 4217 changes from time to time therefore
all currencies may not be supported. If you find one that is not
supported, please file a bug with the Locale::Currency::Format author
Tan D Nguyen <tnguyen at cpan doe org>.

An example of the implimentation of these two tags in a notice template
might be like:

The following item(s) is/are currently overdue:

<item>"<<biblio.title>>" by <<biblio.author>>, <<items.itemcallnumber>>, Barcode: <<items.barcode>> Fine: <fine>GBP</fine></item>

Which, assuming two items were overdue, would result in a notice like:

The following item(s) is/are currently overdue:

"A Short History of Western Civilization" by Harrison, John B, 909.09821 H2451, Barcode: 08030003 Fine: £3.50
"History of Western Civilization" by Hayes, Carlton Joseph Huntley, 909.09821 H3261 v.1, Barcode: 08030004 Fine: £3.50
---
 C4/Letters.pm                    |   11 ++++--
 misc/cronjobs/overdue_notices.pl |   68 ++++++++++++++++++++++++++------------
 2 files changed, 54 insertions(+), 25 deletions(-)

diff --git a/C4/Letters.pm b/C4/Letters.pm
index 002455f..fb8de54 100644
--- a/C4/Letters.pm
+++ b/C4/Letters.pm
@@ -22,12 +22,13 @@ use warnings;
 
 use MIME::Lite;
 use Mail::Sendmail;
+use Encode;
+use Carp;
+
 use C4::Members;
 use C4::Log;
 use C4::SMS;
 use C4::Debug;
-use Encode;
-use Carp;
 
 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
 
@@ -506,7 +507,6 @@ sub parseletter {
         carp "ERROR: parseletter() 1st argument 'letter' empty";
         return;
     }
-    # 	warn "Parseletter : ($letter, $table, $pk ...)";
     my $sth = parseletter_sth($table);
     unless ($sth) {
         warn "parseletter_sth('$table') failed to return a valid sth.  No substitution will be done for that table.";
@@ -520,15 +520,18 @@ sub parseletter {
 
     my $values = $sth->fetchrow_hashref;
 
+
     # and get all fields from the table
     my $columns = C4::Context->dbh->prepare("SHOW COLUMNS FROM $table");
     $columns->execute;
     while ( ( my $field ) = $columns->fetchrow_array ) {
         my $replacefield = "<<$table.$field>>";
+        $values->{$field} =~ s/\p{P}(?=$)//g if $values->{$field};
         my $replacedby   = $values->{$field} || '';
         ($letter->{title}  ) and $letter->{title}   =~ s/$replacefield/$replacedby/g;
         ($letter->{content}) and $letter->{content} =~ s/$replacefield/$replacedby/g;
     }
+    return $letter;
 }
 
 =head2 EnqueueLetter
@@ -770,7 +773,7 @@ ENDSQL
     return $sth->fetchall_arrayref({});
 }
 
-sub _send_message_by_email ($) {
+sub _send_message_by_email ($;$$$) {
     my $message = shift or return;
 
     my $to_address = $message->{to_address};
diff --git a/misc/cronjobs/overdue_notices.pl b/misc/cronjobs/overdue_notices.pl
index b358797..a2f94a2 100755
--- a/misc/cronjobs/overdue_notices.pl
+++ b/misc/cronjobs/overdue_notices.pl
@@ -19,6 +19,7 @@
 
 use strict;
 use warnings;
+use utf8;
 
 BEGIN {
 
@@ -28,14 +29,17 @@ BEGIN {
     eval { require "$FindBin::Bin/../kohalib.pl" };
 }
 
+use Getopt::Long;
+use Pod::Usage;
+use Text::CSV_XS;
+use Locale::Currency::Format 1.28;
+use Encode;
+
 use C4::Context;
 use C4::Dates qw/format_date/;
 use C4::Debug;
 use C4::Letters;
-
-use Getopt::Long;
-use Pod::Usage;
-use Text::CSV_XS;
+use C4::Overdues qw(GetFine);
 
 =head1 NAME
 
@@ -244,7 +248,7 @@ my @branchcodes; # Branch(es) passed as parameter
 my $csvfilename;
 my $triggered = 0;
 my $listall = 0;
-my $itemscontent = join( ',', qw( issuedate title barcode author ) );
+my $itemscontent = join( ',', qw( issuedate title barcode author biblionumber ) );
 my @myborcat;
 my @myborcatout;
 
@@ -436,24 +440,27 @@ END_SQL
                     C4::Members::DebarMember($borrowernumber);
                     $verbose and warn "debarring $borrowernumber $firstname $lastname\n";
                 }
-                $sth2->execute( ($listall) ? ( $borrowernumber , 1 , $MAX ) : ( $borrowernumber, $mindays, $maxdays ) );
+                my @params = ($listall ? ( $borrowernumber , 1 , $MAX ) : ( $borrowernumber, $mindays, $maxdays ));
+                $sth2->execute(@params);
                 my $itemcount = 0;
                 my $titles = "";
+                my @items = ();
                 while ( my $item_info = $sth2->fetchrow_hashref() ) {
                     my @item_info = map { $_ =~ /^date|date$/ ? format_date( $item_info->{$_} ) : $item_info->{$_} || '' } @item_content_fields;
                     $titles .= join("\t", @item_info) . "\n";
                     $itemcount++;
+                    push (@items, $item_info->{'biblionumber'});
                 }
                 $sth2->finish;
-    
                 $letter = parse_letter(
-                    {   letter         => $letter,
-                        borrowernumber => $borrowernumber,
-                        branchcode     => $branchcode,
-                        substitute     => {
-                            bib             => $branch_details->{'branchname'},
-                            'items.content' => $titles
-                        }
+                    {   letter          => $letter,
+                        borrowernumber  => $borrowernumber,
+                        branchcode      => $branchcode,
+                        biblionumber    => \@items,
+                        substitute      => {    # this appears to be a hack to overcome incomplete features in this code.
+                                            bib             => $branch_details->{'branchname'}, # maybe 'bib' is a typo for 'lib<rary>'?
+                                            'items.content' => $titles
+                                           }
                     }
                 );
     
@@ -576,7 +583,7 @@ substituted keys and values.
 
 =cut
 
-sub parse_letter {
+sub parse_letter { # FIXME: this code should probably be moved to C4::Letters:parseletter
     my $params = shift;
     foreach my $required (qw( letter borrowernumber )) {
         return unless exists $params->{$required};
@@ -585,23 +592,42 @@ sub parse_letter {
     if ( $params->{'substitute'} ) {
         while ( my ( $key, $replacedby ) = each %{ $params->{'substitute'} } ) {
             my $replacefield = "<<$key>>";
-
             $params->{'letter'}->{title}   =~ s/$replacefield/$replacedby/g;
             $params->{'letter'}->{content} =~ s/$replacefield/$replacedby/g;
         }
     }
 
-    C4::Letters::parseletter( $params->{'letter'}, 'borrowers', $params->{'borrowernumber'} );
+    $params->{'letter'} = C4::Letters::parseletter( $params->{'letter'}, 'borrowers', $params->{'borrowernumber'} );
 
     if ( $params->{'branchcode'} ) {
-        C4::Letters::parseletter( $params->{'letter'}, 'branches', $params->{'branchcode'} );
+        $params->{'letter'} = C4::Letters::parseletter( $params->{'letter'}, 'branches', $params->{'branchcode'} );
     }
 
     if ( $params->{'biblionumber'} ) {
-        C4::Letters::parseletter( $params->{'letter'}, 'biblio',      $params->{'biblionumber'} );
-        C4::Letters::parseletter( $params->{'letter'}, 'biblioitems', $params->{'biblionumber'} );
-    }
+        my $item_format = '';
+        PROCESS_ITEMS:
+        while (scalar(@{$params->{'biblionumber'}}) > 0) {
+            my $item = shift @{$params->{'biblionumber'}};
+            my $fine = GetFine($item, $params->{'borrowernumber'});
+            if (!$item_format) {
+                $params->{'letter'}->{'content'} =~ m/(<item>.*<\/item>)/;
+                $item_format = $1;
+            }
+            if ($params->{'letter'}->{'content'} =~ m/<fine>(.*)<\/fine>/) { # process any fine tags...
+                no strict; # currency_format behaves badly if we quote the bareword for some reason...
+                my $formatted_fine = currency_format("$1", "$fine", FMT_SYMBOL);
+                use strict;
+                $formatted_fine = Encode::encode("utf8", $formatted_fine);
+                $params->{'letter'}->{'content'} =~ s/<fine>.*<\/fine>/$formatted_fine/;
+            }
+            $params->{'letter'} = C4::Letters::parseletter( $params->{'letter'}, 'biblio',      $item );
+            $params->{'letter'} = C4::Letters::parseletter( $params->{'letter'}, 'biblioitems', $item );
+            $params->{'letter'} = C4::Letters::parseletter( $params->{'letter'}, 'items', $item );
+            $params->{'letter'}->{'content'} =~ s/(<item>.*<\/item>)/$1\n$item_format/ if scalar(@{$params->{'biblionumber'}} > 0);
 
+        }
+    }
+    $params->{'letter'}->{'content'} =~ s/<\/{0,1}?item>//g; # strip all remaining item tags...
     return $params->{'letter'};
 }
 
-- 
1.6.0.4



More information about the Koha-patches mailing list