From cd4cf2ec5b0b25b729b6733f9137a786ea70c762 Mon Sep 17 00:00:00 2001
From: Kyle M Hall <kyle@bywatersolutions.com>
Date: Tue, 16 Sep 2014 12:51:13 -0400
Subject: [PATCH] Bug 12933 - Add ability to print overdue slip from staff intranet

Some librarians would like to be able to print an overdues slip from the
staff intranet. This slip would be defined as the print transport
version of the ODUE slip.

Test Plan:
1) Apply this patch
2) Locate a patron with overdues
3) Define a print version of the ODUE slip
4) Try Print > Print overdues
---
 C4/Members.pm                                      |   19 +++++
 C4/Overdues.pm                                     |   71 ++++++++++++++++++++
 Koha/Template/Plugin/Borrowers.pm                  |   12 +++-
 .../prog/en/includes/members-toolbar.inc           |   11 +++-
 misc/cronjobs/overdue_notices.pl                   |   70 -------------------
 5 files changed, 111 insertions(+), 72 deletions(-)

diff --git a/C4/Members.pm b/C4/Members.pm
index e3a5538..21d44b5 100644
--- a/C4/Members.pm
+++ b/C4/Members.pm
@@ -104,6 +104,7 @@ BEGIN {
         GetBorrowersWithEmail
 
         HasOverdues
+        GetOverdues
     );
 
     #Modify data
@@ -2493,6 +2494,24 @@ sub HasOverdues {
     return $count;
 }
 
+sub GetOverdues {
+    my ( $borrowernumber ) = @_;
+
+    my $sql = "
+        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 = ?
+    ";
+
+    my $sth = C4::Context->dbh->prepare( $sql );
+    $sth->execute( $borrowernumber );
+
+    return $sth->fetchall_arrayref({});
+}
+
 END { }    # module clean-up code here (global destructor)
 
 1;
diff --git a/C4/Overdues.pm b/C4/Overdues.pm
index 31314d6..4a5c7a1 100644
--- a/C4/Overdues.pm
+++ b/C4/Overdues.pm
@@ -24,12 +24,14 @@ use strict;
 use Date::Calc qw/Today Date_to_Days/;
 use Date::Manip qw/UnixDate/;
 use List::MoreUtils qw( uniq );
+use Locale::Currency::Format 1.28;
 
 use C4::Circulation;
 use C4::Context;
 use C4::Accounts;
 use C4::Log; # logaction
 use C4::Debug;
+use C4::Budgets qw(GetCurrency);
 
 use vars qw($VERSION @ISA @EXPORT);
 
@@ -53,6 +55,7 @@ BEGIN {
         &RemoveNotifyLine
         &AddNotifyLine
         &GetOverdueMessageTransportTypes
+        &parse_letter
 	);
 	# subs to remove
 	push @EXPORT, qw(
@@ -947,6 +950,74 @@ sub GetOverdueMessageTransportTypes {
     return \@mtts;
 }
 
+=head2 parse_letter
+
+parses the letter template, replacing the placeholders with data
+specific to this patron, biblio, or item for overdues
+
+named parameters:
+  letter - required hashref
+  borrowernumber - required integer
+  substitute - optional hashref of other key/value pairs that should
+    be substituted in the letter content
+
+returns the C<letter> hashref, with the content updated to reflect the
+substituted keys and values.
+
+=cut
+
+sub parse_letter {
+    my $params = shift;
+    foreach my $required (qw( letter_code borrowernumber )) {
+        return unless ( exists $params->{$required} && $params->{$required} );
+    }
+
+    my $substitute = $params->{'substitute'} || {};
+    $substitute->{today} ||= C4::Dates->new()->output("syspref");
+
+    my %tables = ( 'borrowers' => $params->{'borrowernumber'} );
+    if ( my $p = $params->{'branchcode'} ) {
+        $tables{'branches'} = $p;
+    }
+
+    my $currencies = GetCurrency();
+    my $currency_format;
+    $currency_format = $currencies->{currency} if defined($currencies);
+
+    my @item_tables;
+    if ( my $i = $params->{'items'} ) {
+        my $item_format = '';
+        foreach my $item (@$i) {
+            my $fine = GetFine($item->{'itemnumber'}, $params->{'borrowernumber'});
+            if ( !$item_format and defined $params->{'letter'}->{'content'} ) {
+                $params->{'letter'}->{'content'} =~ m/(<item>.*<\/item>)/;
+                $item_format = $1;
+            }
+
+            $item->{'fine'} = currency_format($currency_format, "$fine", FMT_SYMBOL);
+            # if active currency isn't correct ISO code fallback to sprintf
+            $item->{'fine'} = sprintf('%.2f', $fine) unless $item->{'fine'};
+
+            push @item_tables, {
+                'biblio' => $item->{'biblionumber'},
+                'biblioitems' => $item->{'biblionumber'},
+                'items' => $item,
+                'issues' => $item->{'itemnumber'},
+            };
+        }
+    }
+
+    return C4::Letters::GetPreparedLetter (
+        module => 'circulation',
+        letter_code => $params->{'letter_code'},
+        branchcode => $params->{'branchcode'},
+        tables => \%tables,
+        substitute => $substitute,
+        repeat => { item => \@item_tables },
+        message_transport_type => $params->{message_transport_type},
+    );
+}
+
 1;
 __END__
 
diff --git a/Koha/Template/Plugin/Borrowers.pm b/Koha/Template/Plugin/Borrowers.pm
index b8f3de5..3e2c59b 100644
--- a/Koha/Template/Plugin/Borrowers.pm
+++ b/Koha/Template/Plugin/Borrowers.pm
@@ -22,7 +22,8 @@ use Modern::Perl;
 
 use base qw( Template::Plugin );
 
-use Koha::Borrower::Debarments qw//;
+use Koha::Borrower::Debarments qw();
+use C4::Members qw(HasOverdues);
 
 =pod
 
@@ -48,4 +49,13 @@ sub IsDebarred {
     return Koha::Borrower::Debarments::IsDebarred($borrower->{borrowernumber});
 }
 
+sub HasOverdues {
+    my ( $self, $borrowernumber ) = @_;
+
+    return unless $borrowernumber;
+
+    return C4::Members::HasOverdues($borrowernumber);
+}
+
+
 1;
diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/members-toolbar.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/members-toolbar.inc
index caa2fbf..3b61b96 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/includes/members-toolbar.inc
+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/members-toolbar.inc
@@ -1,3 +1,4 @@
+[% USE Borrowers %]
 <script type="text/javascript">
 //<![CDATA[
 $(document).ready(function(){
@@ -38,6 +39,11 @@ $(document).ready(function(){
         $(".btn-group").removeClass("open");
         return false;
     });
+    $("#print_overdues").click(function(){
+        window.open("/cgi-bin/koha/members/print_overdues.pl?borrowernumber=[% borrowernumber %]", "printwindow");
+        $(".btn-group").removeClass("open");
+        return false;
+    });
     $("#searchtohold").click(function(){
         searchToHold();
         return false;
@@ -123,7 +129,10 @@ function searchToHold(){
             <ul class="dropdown-menu">
                 [% IF ( CAN_user_borrowers ) %]<li><a id="printsummary" href="#">Print summary</a></li>[% END %]
                 <li><a id="printslip" href="#">Print slip</a></li>
-                <li><a id="printquickslip" href="#">Print quick slip</a></li>
+                <li><a id="printquickslip" href="#">Print quick slip[%  Borrowers.HasOverdues( borrowernumber ) %]</a></li>
+                [% IF Borrowers.HasOverdues( borrowernumber ) %]
+                    <li><a id="print_overdues" href="#">Print overdues</a></li>
+                [% END %]
             </ul>
     </div>
     <a id="searchtohold" class="btn btn-small" href="#"><i class="icon-search"></i> Search to hold</a>
diff --git a/misc/cronjobs/overdue_notices.pl b/misc/cronjobs/overdue_notices.pl
index 942cb6a..42366e9 100755
--- a/misc/cronjobs/overdue_notices.pl
+++ b/misc/cronjobs/overdue_notices.pl
@@ -40,7 +40,6 @@ use C4::Dates qw/format_date/;
 use C4::Debug;
 use C4::Letters;
 use C4::Overdues qw(GetFine GetOverdueMessageTransportTypes);
-use C4::Budgets qw(GetCurrency);
 
 use Koha::Borrower::Debarments qw(AddUniqueDebarment);
 use Koha::DateUtils;
@@ -795,75 +794,6 @@ if ( defined $htmlfilename ) {
 
 These methods are internal to the operation of overdue_notices.pl.
 
-=head2 parse_letter
-
-parses the letter template, replacing the placeholders with data
-specific to this patron, biblio, or item
-
-named parameters:
-  letter - required hashref
-  borrowernumber - required integer
-  substitute - optional hashref of other key/value pairs that should
-    be substituted in the letter content
-
-returns the C<letter> hashref, with the content updated to reflect the
-substituted keys and values.
-
-
-=cut
-
-sub parse_letter {
-    my $params = shift;
-    foreach my $required (qw( letter_code borrowernumber )) {
-        return unless ( exists $params->{$required} && $params->{$required} );
-    }
-
-    my $substitute = $params->{'substitute'} || {};
-    $substitute->{today} ||= C4::Dates->new()->output("syspref");
-
-    my %tables = ( 'borrowers' => $params->{'borrowernumber'} );
-    if ( my $p = $params->{'branchcode'} ) {
-        $tables{'branches'} = $p;
-    }
-
-    my $currencies = GetCurrency();
-    my $currency_format;
-    $currency_format = $currencies->{currency} if defined($currencies);
-
-    my @item_tables;
-    if ( my $i = $params->{'items'} ) {
-        my $item_format = '';
-        foreach my $item (@$i) {
-            my $fine = GetFine($item->{'itemnumber'}, $params->{'borrowernumber'});
-            if ( !$item_format and defined $params->{'letter'}->{'content'} ) {
-                $params->{'letter'}->{'content'} =~ m/(<item>.*<\/item>)/;
-                $item_format = $1;
-            }
-
-            $item->{'fine'} = currency_format($currency_format, "$fine", FMT_SYMBOL);
-            # if active currency isn't correct ISO code fallback to sprintf
-            $item->{'fine'} = sprintf('%.2f', $fine) unless $item->{'fine'};
-
-            push @item_tables, {
-                'biblio' => $item->{'biblionumber'},
-                'biblioitems' => $item->{'biblionumber'},
-                'items' => $item,
-                'issues' => $item->{'itemnumber'},
-            };
-        }
-    }
-
-    return C4::Letters::GetPreparedLetter (
-        module => 'circulation',
-        letter_code => $params->{'letter_code'},
-        branchcode => $params->{'branchcode'},
-        tables => \%tables,
-        substitute => $substitute,
-        repeat => { item => \@item_tables },
-        message_transport_type => $params->{message_transport_type},
-    );
-}
-
 =head2 prepare_letter_for_printing
 
 returns a string of text appropriate for printing in the event that an
-- 
1.7.2.5