From f4aee207be4b336151c107086d54b2d4e92a8789 Mon Sep 17 00:00:00 2001
From: Pasi Kallinen <pasi.kallinen@pttk.fi>
Date: Mon, 12 May 2014 12:24:48 +0300
Subject: [PATCH] Bug 12224: Allow easy printing of patron check-ins for today

This adds a printing option to the staff client patron details page
to print a list of items the patron returned today at this branch.

To test:

1) Apply patch.
2) Check in tools > Notices & Slips that you have CHECKINSLIP slip,
   and have print message there. If not, run updatedatabase.pl
3) Check-in items for a patron.
4) Go to that patron's detail page, and from the Print-menu in
   the toolbar, select "Print checked-in today -slip"
5) You should get a slip of the patron's checked-in items.
6) Optionally, test Check-ins for the same patron, but in different
   branches - should only print items for the current branch.
7) Optionally, test Check-ins for the same patron, but returned
   in different day - should only print items for today.

Signed-off-by: Aleisha <aleishaamohia@hotmail.com>
---
 C4/Members.pm                                      | 66 ++++++++++++++++++++++
 .../data/mysql/en/mandatory/sample_notices.sql     | 12 ++++
 installer/data/mysql/updatedatabase.pl             | 18 ++++++
 .../prog/en/includes/members-toolbar.inc           |  6 ++
 members/printslip.pl                               |  7 ++-
 5 files changed, 108 insertions(+), 1 deletion(-)

diff --git a/C4/Members.pm b/C4/Members.pm
index 171f3c0..6246db2 100644
--- a/C4/Members.pm
+++ b/C4/Members.pm
@@ -105,6 +105,7 @@ BEGIN {
         &GetMessagesCount
 
         &IssueSlip
+        &CheckInSlip
         GetBorrowersWithEmail
 
         HasOverdues
@@ -2448,6 +2449,71 @@ sub IssueSlip {
     );
 }
 
+=head2 GetTodaysReturnsForBorrower
+
+    $returns = GetTodaysReturnsForBorrower($borrowernumber, $branch);
+
+Return a list of items borrower has checked-in today in branch.
+
+=cut
+
+sub GetTodaysReturnsForBorrower {
+    my ($borrowernumber, $branch) = @_;
+    my $dbh  = C4::Context->dbh;
+    my $date = POSIX::strftime("%Y-%m-%d",localtime());
+
+    my $query = "
+       SELECT itemnumber
+       FROM old_issues
+       WHERE DATE(returndate) = ?
+         AND borrowernumber = ?
+         AND branchcode = ?
+    ";
+
+    my $sth = $dbh->prepare($query);
+    $sth->execute($date, $borrowernumber, $branch);
+    my @results;
+
+    while ( my $data = $sth->fetchrow_hashref ) {
+        my $bibdata = GetBiblioFromItemNumber($data->{itemnumber});
+        push @results, $bibdata;
+    }
+    return \@results;
+}
+
+=head2 CheckInSlip
+
+    $letter = CheckInSlip($borrowernumber, $branch [, $message_transport_type ] );
+
+Returns the prepared letter data for items patron checked-in today in branch.
+message_transport_type defaults to 'print'.
+
+=cut
+
+sub CheckInSlip {
+    my ($borrowernumber, $branch, $mtt) = @_;
+    my $issues = GetTodaysReturnsForBorrower($borrowernumber, $branch);
+    my %repeat = (
+            'checkedin' => [ map {
+                'biblio' => $_,
+                'items'  => $_,
+                'issues' => $_,
+            }, @$issues ],
+        );
+
+    return  C4::Letters::GetPreparedLetter (
+        module => 'circulation',
+        letter_code => 'CHECKINSLIP',
+        branchcode => $branch,
+        tables => {
+            'branches'    => $branch,
+            'borrowers'   => $borrowernumber,
+        },
+        repeat => \%repeat,
+        message_transport_type => $mtt || 'print',
+    );
+}
+
 =head2 GetBorrowersWithEmail
 
     ([$borrnum,$userid], ...) = GetBorrowersWithEmail('me@example.com');
diff --git a/installer/data/mysql/en/mandatory/sample_notices.sql b/installer/data/mysql/en/mandatory/sample_notices.sql
index 14c5634..cfc6ba3 100644
--- a/installer/data/mysql/en/mandatory/sample_notices.sql
+++ b/installer/data/mysql/en/mandatory/sample_notices.sql
@@ -162,3 +162,15 @@ VALUES ( 'circulation', 'OVERDUES_SLIP', '', 'Overdues Slip', '0', 'OVERDUES_SLI
 
 <item>"<<biblio.title>>" by <<biblio.author>>, <<items.itemcallnumber>>, Barcode: <<items.barcode>> Fine: <<items.fine>></item>
 ', 'print' );
+
+INSERT INTO  letter (module, code, branchcode, name, is_html, title, content, message_transport_type)
+VALUES ( 'circulation', 'CHECKINSLIP', '', 'Printed check-in slip', '1', 'Items returned today', '<<borrowers.firstname>> <<borrowers.surname>><br>
+<<branches.branchname>>, <<today>><br>
+You returned these items today:
+<ul>
+<checkedin>
+<li><<biblio.author>>: <<biblio.title>><br>
+Barcode: <<items.barcode>><br>
+</checkedin>
+</ul>', 'print'
+);
diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl
index 8a1d1b0..47a3efc 100755
--- a/installer/data/mysql/updatedatabase.pl
+++ b/installer/data/mysql/updatedatabase.pl
@@ -11341,6 +11341,24 @@ if ( CheckVersion($DBversion) ) {
     SetVersion($DBversion);
 }
 
+$DBversion = "3.21.00.054";
+if ( CheckVersion($DBversion) ) {
+    $dbh->do("
+INSERT INTO  letter (module, code, branchcode, name, is_html, title, content, message_transport_type)
+VALUES ( 'circulation', 'CHECKINSLIP', '', 'Printed check-in slip', '1', 'Items returned today', '<<borrowers.firstname>> <<borrowers.surname>><br>
+<<branches.branchname>>, <<today>><br>
+You returned these items today:
+<ul>
+<checkedin>
+<li><<biblio.author>>: <<biblio.title>><br>
+Barcode: <<items.barcode>><br>
+</checkedin>
+</ul>', 'print'
+);");
+    print "Upgrade to $DBversion done (Bug 12224 - Easy printing of patron check-in slip)\n";
+    SetVersion($DBversion);
+}
+
 # DEVELOPER PROCESS, search for anything to execute in the db_update directory
 # SEE bug 13068
 # if there is anything in the atomicupdate, read and execute it.
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 641bbad..e1f1e47 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/includes/members-toolbar.inc
+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/members-toolbar.inc
@@ -64,6 +64,11 @@ $(document).ready(function(){
         $(".btn-group").removeClass("open");
         return false;
     });
+    $("#printcheckinslip").click(function(){
+        printx_window("checkinslip");
+        $(".btn-group").removeClass("open");
+        return false;
+    });
     $("#searchtohold").click(function(){
         searchToHold();
         return false;
@@ -163,6 +168,7 @@ function searchToHold(){
                 [% IF Borrowers.HasOverdues( borrowernumber ) %]
                     <li><a id="print_overdues" href="#">Print overdues</a></li>
                 [% END %]
+                <li><a id="printcheckinslip" href="#">Print checked-in today -slip</a></li>
             </ul>
     </div>
     <a id="searchtohold" class="btn btn-small" href="#"><i class="fa fa-search"></i> Search to hold</a>
diff --git a/members/printslip.pl b/members/printslip.pl
index dfe93d7..0224893 100755
--- a/members/printslip.pl
+++ b/members/printslip.pl
@@ -76,7 +76,12 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
 my $borrowernumber = $input->param('borrowernumber');
 my $branch=C4::Context->userenv->{'branch'};
 my ($slip, $is_html);
-if (my $letter = IssueSlip ($session->param('branch') || $branch, $borrowernumber, $print eq "qslip")) {
+if ($print eq 'checkinslip') {
+    if (my $letter = CheckInSlip($borrowernumber, $session->param('branch') || $branch)) {
+        $slip = $letter->{content};
+        $is_html = $letter->{is_html};
+    }
+} elsif (my $letter = IssueSlip ($session->param('branch') || $branch, $borrowernumber, $print eq "qslip")) {
     $slip = $letter->{content};
     $is_html = $letter->{is_html};
 }
-- 
1.9.1