Bug 6894: Order from suggestion defaulting to wrong currency
[koha_fer] / misc / cronjobs / overdue_notices.pl
index 04a5a0f..37774b5 100755 (executable)
@@ -1,6 +1,7 @@
 #!/usr/bin/perl
 
 # Copyright 2008 Liblime
+# Copyright 2010 BibLibre
 #
 # This file is part of Koha.
 #
@@ -19,7 +20,6 @@
 
 use strict;
 use warnings;
-use utf8;
 
 BEGIN {
 
@@ -103,13 +103,19 @@ Produces CSV data. if -n (no mail) flag is set, then this CSV data is
 sent to standard out or to a filename if provided. Otherwise, only
 overdues that could not be emailed are sent in CSV format to the admin.
 
+=item B<-html>
+
+Produces html data. if patron does not have a mail address or
+-n (no mail) flag is set, an html file is generated in the specified
+directory. This can be downloaded or futher processed by library staff.
+
 =item B<-itemscontent>
 
 comma separated list of fields that get substituted into templates in
 places of the E<lt>E<lt>items.contentE<gt>E<gt> placeholder. This
-defaults to issuedate,title,barcode,author
+defaults to due date,title,barcode,author
 
-Other possible values come from fields in the biblios, items, and
+Other possible values come from fields in the biblios, items and
 issues tables.
 
 =item B<-borcat>
@@ -250,7 +256,7 @@ my $csvfilename;
 my $htmlfilename;
 my $triggered = 0;
 my $listall = 0;
-my $itemscontent = join( ',', qw( issuedate title barcode author biblionumber ) );
+my $itemscontent = join( ',', qw( date_due title barcode author itemnumber ) );
 my @myborcat;
 my @myborcatout;
 
@@ -369,10 +375,11 @@ foreach my $branchcode (@branches) {
     $verbose and warn sprintf "branchcode : '%s' using %s\n", $branchcode, $admin_email_address;
 
     my $sth2 = $dbh->prepare( <<'END_SQL' );
-SELECT biblio.*, items.*, issues.*, TO_DAYS(NOW())-TO_DAYS(date_due) AS days_overdue
-  FROM issues,items,biblio
+SELECT biblio.*, items.*, issues.*, biblioitems.itemtype, TO_DAYS(NOW())-TO_DAYS(date_due) AS days_overdue
+  FROM issues,items,biblio, biblioitems
   WHERE items.itemnumber=issues.itemnumber
     AND biblio.biblionumber   = items.biblionumber
+    AND biblio.biblionumber   = biblioitems.biblionumber
     AND issues.borrowernumber = ?
     AND TO_DAYS(NOW())-TO_DAYS(date_due) BETWEEN ? and ?
 END_SQL
@@ -470,6 +477,7 @@ END_SQL
                     $verbose and warn "debarring $borrowernumber $firstname $lastname\n";
                 }
                 my @params = ($listall ? ( $borrowernumber , 1 , $MAX ) : ( $borrowernumber, $mindays, $maxdays ));
+                $verbose and warn "STH2 PARAMS: borrowernumber = $borrowernumber, mindays = $mindays, maxdays = $maxdays";
                 $sth2->execute(@params);
                 my $itemcount = 0;
                 my $titles = "";
@@ -486,14 +494,14 @@ END_SQL
                     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'});
+                    push @items, { itemnumber => $item_info->{'itemnumber'}, biblionumber => $item_info->{'biblionumber'} };
                 }
                 $sth2->finish;
                 $letter = parse_letter(
                     {   letter          => $letter,
                         borrowernumber  => $borrowernumber,
                         branchcode      => $branchcode,
-                        biblionumber    => \@items,
+                        items           => \@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
@@ -566,39 +574,38 @@ END_SQL
     }
 
     if (@output_chunks) {
-        if ($nomail) {
-            if ( defined $csvfilename ) {
-                print $csv_fh @output_chunks;
-            } elsif ( defined $htmlfilename ) {
-                print $html_fh @output_chunks;
-            } else {
-                local $, = "\f";    # pagebreak
-                print @output_chunks;
-            }
-        } 
+        if ( defined $csvfilename ) {
+            print $csv_fh @output_chunks;        
+        }
         elsif ( defined $htmlfilename ) {
             print $html_fh @output_chunks;        
         }
-        else {
-            my $attachment = {
-                filename => defined $csvfilename ? 'attachment.csv' : 'attachment.txt',
-                type => 'text/plain',
-                content => join( "\n", @output_chunks )
-            };
-
-            my $letter = {
-                title   => 'Overdue Notices',
-                content => 'These messages were not sent directly to the patrons.',
-            };
-            C4::Letters::EnqueueLetter(
-                {   letter                 => $letter,
-                    borrowernumber         => undef,
-                    message_transport_type => 'email',
-                    attachments            => [$attachment],
-                    to_address             => $admin_email_address,
-                }
-            );
+        elsif ($nomail){
+                local $, = "\f";    # pagebreak
+                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";
+        $content .= join( "\n", @output_chunks );
+            
+        my $attachment = {
+            filename => defined $csvfilename ? 'attachment.csv' : 'attachment.txt',
+            type => 'text/plain',
+            content => $content, 
+        };
+
+        my $letter = {
+            title   => 'Overdue Notices',
+            content => 'These messages were not sent directly to the patrons.',
+        };
+        C4::Letters::EnqueueLetter(
+            {   letter                 => $letter,
+                borrowernumber         => undef,
+                message_transport_type => 'email',
+                attachments            => [$attachment],
+                to_address             => $admin_email_address,
+            }
+        );
     }
 
 }
@@ -641,6 +648,9 @@ sub parse_letter { # FIXME: this code should probably be moved to C4::Letters:pa
         return unless exists $params->{$required};
     }
 
+   my $todaysdate = C4::Dates->new()->output("syspref");
+   $params->{'letter'}->{title}   =~ s/<<today>>/$todaysdate/g;
+   $params->{'letter'}->{content} =~ s/<<today>>/$todaysdate/g;
 
     if ( $params->{'substitute'} ) {
         while ( my ( $key, $replacedby ) = each %{ $params->{'substitute'} } ) {
@@ -656,27 +666,24 @@ sub parse_letter { # FIXME: this code should probably be moved to C4::Letters:pa
         $params->{'letter'} = C4::Letters::parseletter( $params->{'letter'}, 'branches', $params->{'branchcode'} );
     }
 
-    if ( $params->{'biblionumber'} ) {
+    if ( $params->{'items'} ) {
         my $item_format = '';
         PROCESS_ITEMS:
-        while (scalar(@{$params->{'biblionumber'}}) > 0) {
-            my $item = shift @{$params->{'biblionumber'}};
-            my $fine = GetFine($item, $params->{'borrowernumber'});
+        while (scalar(@{$params->{'items'}}) > 0) {
+            my $item = shift @{$params->{'items'}};
+            my $fine = GetFine($item->{'itemnumber'}, $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'} = C4::Letters::parseletter( $params->{'letter'}, 'biblio',      $item->{'biblionumber'} );
+            $params->{'letter'} = C4::Letters::parseletter( $params->{'letter'}, 'biblioitems', $item->{'biblionumber'} );
+            $params->{'letter'} = C4::Letters::parseletter( $params->{'letter'}, 'items', $item->{'itemnumber'} );
+            $params->{'letter'}->{'content'} =~ s/(<item>.*<\/item>)/$1\n$item_format/ if scalar(@{$params->{'items'}} > 0);
 
         }
     }