Returns reworking to handle empty GetItemIssue
[koha.git] / circ / returns.pl
index 4697d13..4ceb2b4 100755 (executable)
@@ -1,12 +1,8 @@
 #!/usr/bin/perl
-# WARNING: This file contains mixed-sized tabs! (some 4-character, some 8)
-# WARNING: Currently, 4-character tabs seem to be dominant
-# WARNING: But there are still lots of 8-character tabs
-
-#written 11/3/2002 by Finlay
-#script to execute returns of books
 
 # Copyright 2000-2002 Katipo Communications
+#           2006 SAN-OP
+#           2007 BibLibre, Paul POULAIN
 #
 # This file is part of Koha.
 #
 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
 # Suite 330, Boston, MA  02111-1307 USA
 
+=head1 returns.pl
+
+script to execute returns of books
+
+=cut
+
 use strict;
+# use warnings; # FIXME
+
 use CGI;
-use C4::Circulation::Circ2;
-use C4::Date;
-use C4::Search;
+use C4::Context;
+use C4::Auth qw/:DEFAULT get_session/;
 use C4::Output;
+use C4::Circulation;
+use C4::Dates qw/format_date/;
+use Date::Calc qw/Add_Delta_Days/;
+use C4::Calendar;
 use C4::Print;
-use C4::Reserves2;
-use C4::Auth;
-use C4::Interface::CGI::Output;
-use HTML::Template;
-use C4::Koha;
+use C4::Reserves;
+use C4::Biblio;
+use C4::Items;
+use C4::Members;
+use C4::Branch; # GetBranches GetBranchName
+use C4::Koha;   # FIXME : is it still useful ?
 
 my $query = new CGI;
 
+if (!C4::Context->userenv){
+       my $sessionID = $query->cookie("CGISESSID");
+       my $session = get_session($sessionID);
+       if ($session->param('branch') eq 'NO_LIBRARY_SET'){
+               # no branch set we can't return
+               print $query->redirect("/cgi-bin/koha/circ/selectbranchprinter.pl");
+               exit;
+       }
+} 
+
 #getting the template
-my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
+my ( $template, $librarian, $cookie ) = get_template_and_user(
     {
         template_name   => "circ/returns.tmpl",
         query           => $query,
         type            => "intranet",
         authnotrequired => 0,
-        flagsrequired   => { circulate => 1 },
+        flagsrequired   => { circulate => "circulate_remaining_permissions" },
     }
 );
 
 #####################
 #Global vars
-my %env;
-my $headerbackgroundcolor = '#99cc33';
-my $linecolor1            = '#ffffcc';
-my $linecolor2            = 'white';
+my $branches = GetBranches();
+my $printers = GetPrinters();
 
-my $branches = getbranches();
-my $printers = getprinters( \%env );
-
-my $branch  = C4::Context->userenv->{'branch'};
-my $printer = C4::Context->userenv->{'branchprinter'};
+#my $branch  = C4::Context->userenv?C4::Context->userenv->{'branch'}:"";
+my $printer = C4::Context->userenv ? C4::Context->userenv->{'branchprinter'} : "";
+my $overduecharges = (C4::Context->preference('finesMode') && C4::Context->preference('finesMode') ne 'off');
 
+my $userenv_branch = C4::Context->userenv->{'branch'} || '';
 #
 # Some code to handle the error if there is no branch or printer setting.....
 #
 
-$env{'branchcode'} = $branch;
-$env{'printer'}    = $printer;
-$env{'queue'}      = $printer;
-
 # Set up the item stack ....
 my %returneditems;
 my %riduedate;
@@ -85,8 +96,8 @@ foreach ( $query->param ) {
     my $borrowernumber = $query->param("bn-$counter");
     $counter++;
 
-    # decode cuecat
-    $barcode = cuecatbarcodedecode($barcode);
+    # decode barcode    ## Didn't we already decode them before passing them back last time??
+    $barcode = barcodedecode($barcode) if(C4::Context->preference('itemBarcodeInputFilter'));
 
     ######################
     #Are these lines still useful ?
@@ -95,104 +106,128 @@ foreach ( $query->param ) {
     $riborrowernumber{$counter} = $borrowernumber;
 
     #######################
-    $input{counter} = $counter;
-    $input{barcode} = $barcode;
-    $input{duedate} = $duedate;
-    $input{bornum}  = $borrowernumber;
-    push ( @inputloop, \%input );
+    $input{counter}        = $counter;
+    $input{barcode}        = $barcode;
+    $input{duedate}        = $duedate;
+    $input{borrowernumber} = $borrowernumber;
+    push( @inputloop, \%input );
 }
 
 ############
 # Deal with the requests....
-if ( $query->param('resbarcode') ) {
-    my $item       = $query->param('itemnumber');
-    my $borrnum    = $query->param('borrowernumber');
-    my $resbarcode = $query->param('resbarcode');
-
-    # set to waiting....
-    my $iteminfo = getiteminformation( \%env, $item );
-#     if($iteminfo->{'holdingbranch'} ne $branch){
-#      UpdateHoldingbranch($branch,$item);
-#      }
-#   check if we have other reservs for this document, if we have a return send the message of transfer
-    my ($messages,$nextreservinfo) = OtherReserves($item);
-    my $branchname = getbranchname($messages->{'transfert'});
-    my ($borr) = getpatroninformation( \%env, $nextreservinfo, 0 );
-    my $borcnum = $borr->{'cardnumber'};
-    my $name    =
-      $borr->{'surname'} . " " . $borr->{'title'} . " " . $borr->{'firstname'};
-    my $slip = $query->param('resslip');
-#    printslip( \%env, $slip ); #removed by paul
 
+if ($query->param('WT-itemNumber')){
+       updateWrongTransfer ($query->param('WT-itemNumber'),$query->param('WT-waitingAt'),$query->param('WT-From'));
+}
+
+if ( $query->param('resbarcode') ) {
+    my $item           = $query->param('itemnumber');
+    my $borrowernumber = $query->param('borrowernumber');
+    my $resbarcode     = $query->param('resbarcode');
+    my $diffBranchReturned = $query->param('diffBranch');
+    my $iteminfo   = GetBiblioFromItemNumber($item);
+    # fix up item type for display
+    $iteminfo->{'itemtype'} = C4::Context->preference('item-level_itypes') ? $iteminfo->{'itype'} : $iteminfo->{'itemtype'};
+    my $diffBranchSend = ($userenv_branch ne $diffBranchReturned) ? $diffBranchReturned : undef;
+# diffBranchSend tells ModReserveAffect whether document is expected in this library or not,
+# i.e., whether to apply waiting status
+    ModReserveAffect( $item, $borrowernumber, $diffBranchSend);
+#   check if we have other reserves for this document, if we have a return send the message of transfer
+    my ( $messages, $nextreservinfo ) = GetOtherReserves($item);
+
+    my ($borr) = GetMemberDetails( $nextreservinfo, 0 );
+    my $name   = $borr->{'surname'} . ", " . $borr->{'title'} . " " . $borr->{'firstname'};
     if ( $messages->{'transfert'} ) {
-#      add the transfer routine
-#      C4::Circulation::Circ2::dotransfer($item,$iteminfo->{'holdingbranch'},$tobranchcd);
         $template->param(
-            itemtitle  => $iteminfo->{'title'},
-            iteminfo   => $iteminfo->{'author'},
-            branchname => $branchname,
-            name       => $name,
-            bornum     => $borrnum,
-            borcnum    => $borcnum,
-           borfirstname  => $borr->{'firstname'},
-            borsurname    => $borr->{'surname'},
-            diffbranch => 1
+            itemtitle      => $iteminfo->{'title'},
+                       itembiblionumber => $iteminfo->{'biblionumber'},
+            iteminfo       => $iteminfo->{'author'},
+            tobranchname   => GetBranchName($messages->{'transfert'}),
+            name           => $name,
+            borrowernumber => $borrowernumber,
+            borcnum        => $borr->{'cardnumber'},
+            borfirstname   => $borr->{'firstname'},
+            borsurname     => $borr->{'surname'},
+            diffbranch     => 1,
         );
     }
 }
 
-my $iteminformation;
 my $borrower;
 my $returned = 0;
 my $messages;
-my $barcode = $query->param('barcode');
+my $issueinformation;
+my $itemnumber;
+my $barcode     = $query->param('barcode');
+my $exemptfine  = $query->param('exemptfine');
+my $dropboxmode = $query->param('dropboxmode');
+my $dotransfer  = $query->param('dotransfer');
+my $calendar    = C4::Calendar->new( branchcode => $userenv_branch );
+       #dropbox: get last open day (today - 1)
+my $today       = C4::Dates->new();
+my $today_iso   = $today->output('iso');
+my $dropboxdate = $calendar->addDate($today, -1);
+if ($dotransfer){
+       # An item has been returned to a branch other than the homebranch, and the librarian has chosen to initiate a transfer
+       my $transferitem = $query->param('transferitem');
+       my $tobranch     = $query->param('tobranch');
+       ModItemTransfer($transferitem, $userenv_branch, $tobranch); 
+}
 
 # actually return book and prepare item table.....
 if ($barcode) {
-    # decode cuecat
-    $barcode = cuecatbarcodedecode($barcode);
-    ( $returned, $messages, $iteminformation, $borrower ) =
-      returnbook( $barcode, $branch );
+    $barcode = barcodedecode($barcode) if C4::Context->preference('itemBarcodeInputFilter');
+    $itemnumber = GetItemnumberFromBarcode($barcode);
+
+    ( $returned, $messages, $issueinformation, $borrower ) =
+      AddReturn( $barcode, $userenv_branch, $exemptfine, $dropboxmode);     # do the return
+
+    # get biblio description
+    my $biblio = GetBiblioFromItemNumber($itemnumber);
+    # fix up item type for display
+    $biblio->{'itemtype'} = C4::Context->preference('item-level_itypes') ? $biblio->{'itype'} : $biblio->{'itemtype'};
+
+    $template->param(
+        title            => $biblio->{'title'},
+        homebranch       => $biblio->{'homebranch'},
+        author           => $biblio->{'author'},
+        itembarcode      => $biblio->{'barcode'},
+        itemtype         => $biblio->{'itemtype'},
+        ccode            => $biblio->{'ccode'},
+        itembiblionumber => $biblio->{'biblionumber'},    
+    );
+
+    my %input = (
+        counter => 0,
+        first   => 1,
+        barcode => $barcode,
+    );
+
     if ($returned) {
-        $returneditems{0}    = $barcode;
-        $riborrowernumber{0} = $borrower->{'borrowernumber'};
-        $riduedate{0}        = $iteminformation->{'date_due'};
-        my %input;
-        $input{counter} = 0;
-        $input{first}   = 1;
-        $input{barcode} = $barcode;
-        $input{duedate} = $riduedate{0};
-        $input{bornum}  = $riborrowernumber{0};
-        push ( @inputloop, \%input );
+        my $duedate = $issueinformation->{'date_due'};
+        $returneditems{0}      = $barcode;
+        $riborrowernumber{0}   = $borrower->{'borrowernumber'};
+        $riduedate{0}          = $duedate;
+        $input{borrowernumber} = $borrower->{'borrowernumber'};
+        $input{duedate}        = $duedate;
+        $input{return_overdue} = 1 if ($duedate and $duedate lt $today->output('iso'));
+        push( @inputloop, \%input );
     }
     elsif ( !$messages->{'BadBarcode'} ) {
-        my %input;
-        $input{counter} = 0;
-        $input{first}   = 1;
-        $input{barcode} = $barcode;
-        $input{duedate} = 0;
-
+        $input{duedate}   = 0;
         $returneditems{0} = $barcode;
         $riduedate{0}     = 0;
         if ( $messages->{'wthdrawn'} ) {
-            $input{withdrawn} = 1;
-            $input{bornum}    = "Item Cancelled";
-            $riborrowernumber{0} = 'Item Cancelled';
+            $input{withdrawn}      = 1;
+            $input{borrowernumber} = 'Item Cancelled';  # FIXME: should be in display layer ?
+            $riborrowernumber{0}   = 'Item Cancelled';
         }
         else {
-            $input{bornum} = " ";
-            $riborrowernumber{0} = ' ';
+            $input{borrowernumber} = ' ';  # This seems clearly bogus.
+            $riborrowernumber{0}   = ' ';
         }
-        push ( @inputloop, \%input );
+        push( @inputloop, \%input );
     }
-    $template->param(
-        returned  => $returned,
-        itemtitle => $iteminformation->{'title'},
-
-        #                                                                      itembc => $iteminformation->{'barcode'},
-        #                                                                      itemdatedue => $iteminformation->{'datedue'},
-        itemauthor => $iteminformation->{'author'}
-    );
 }
 $template->param( inputloop => \@inputloop );
 
@@ -204,118 +239,107 @@ my $reserved = 0;
 #  if the document is transfered, we have warning message .
 
 if ( $messages->{'WasTransfered'} ) {
-#     my $res        = $messages->{'ResFound'};
-#     my $branchname = $branches->{ $res->{'branchcode'} }->{'branchname'};
-#     my ($borr) = getpatroninformation( \%env, $res->{'borrowernumber'}, 0 );
-#     my $name =
-#       $borr->{'surname'} . " " . $borr->{'title'} . " " . $borr->{'firstname'};
-    my ($iteminfo) = getiteminformation( \%env, 0, $barcode );
-
-#     if ( $res->{'ResFound'} eq "Waiting" ) {
-#              if($branch eq $res->{'branchcode'}){
-#                      $template->param(intransit => 0);
-#              } else {
-#                      $template->param(intransit => 1);
-#              }
-       
-        $template->param(
-               found         => 1,
-               transfer     => 1,
-               itemhomebranch => $branches->{$iteminfo->{'homebranch'} }->{'branchname'}
-        );
+    $template->param(
+        found          => 1,
+        transfer       => 1,
+    );
+}
 
-    }
+if ( $messages->{'NeedsTransfer'} ){
+       $template->param(
+               found          => 1,
+               needstransfer  => 1,
+               itemnumber     => $itemnumber,
+       );
+}
 
-if ( $messages->{'ResFound'} ) {
-    my $res        = $messages->{'ResFound'};
-    my $branchname = $branches->{ $res->{'branchcode'} }->{'branchname'};
-    my ($borr) = getpatroninformation( \%env, $res->{'borrowernumber'}, 0 );
-    my $name =
-      $borr->{'surname'} . " " . $borr->{'title'} . " " . $borr->{'firstname'};
-    my ($iteminfo) = getiteminformation( \%env, 0, $barcode );
-
-    if ( $res->{'ResFound'} eq "Waiting" ) {
-               if($branch eq $res->{'branchcode'}){
-                       $template->param(intransit => 0);
-               } else {
-                       $template->param(intransit => 1);
-               }
-       
-        $template->param(
-            found         => 1,
-            name          => $name,
-            borfirstname  => $borr->{'firstname'},
-            borsurname    => $borr->{'surname'},
-            bortitle      => $borr->{'title'},
-            borphone      => $borr->{'phone'},
-            boremail         => $borr->{'emailaddress'},
-            borstraddress => $borr->{'streetaddress'},
-            borcity       => $borr->{'city'},
-            borzip        => $borr->{'zipcode'},
-            bornum        => $res->{'borrowernumber'},
-            borcnum       => $borr->{'cardnumber'},
-                       debarred => $borr->{'debarred'},
-                       gonenoaddress => $borr->{'gonenoaddress'},
-                       currentbranch => $branches->{ $branch }->{'branchname'},
-            branchname  => $branches->{ $res->{'branchcode'} }->{'branchname'},
-            waiting     => 1,
-            itemnumber  => $res->{'itemnumber'},
-            itemtitle   => $iteminfo->{'title'},
-            itemauthor  => $iteminfo->{'author'},
-            itembarcode => $iteminfo->{'barcode'},
-            itemtype    => $iteminfo->{'itemtype'},
-            itembiblionumber => $iteminfo->{'biblionumber'}
-        );
+if ( $messages->{'Wrongbranch'} ){
+       $template->param(
+               wrongbranch => 1,
+       );
+}
 
-    }
-    if ( $res->{'ResFound'} eq "Reserved" ) {
-        my @da         = localtime( time() );
-        my $todaysdate =
-          sprintf( "%0.2d", ( $da[3] + 1 ) ) . "/"
-          . sprintf( "%0.2d", ( $da[4] + 1 ) ) . "/"
-          . ( $da[5] + 1900 );
-                 
-                if($branch eq $res->{'branchcode'}){
-                       $template->param(intransit => 0);
-               } else {
-                       $template->param(intransit => 1);
-               }
-                 
+# case of wrong transfert, if the document wasn't transfered to the right library (according to branchtransfer (tobranch) BDD)
+
+if ( $messages->{'WrongTransfer'} and not $messages->{'WasTransfered'}) {
+       $template->param(
+        WrongTransfer  => 1,
+        TransferWaitingAt => $messages->{'WrongTransfer'},
+        WrongTransferItem => $messages->{'WrongTransferItem'},
+    );
+
+    my $reserve    = $messages->{'ResFound'};
+    my $branchname = $branches->{ $reserve->{'branchcode'} }->{'branchname'};
+    my ($borr) = GetMemberDetails( $reserve->{'borrowernumber'}, 0 );
+    my $name = $borr->{'surname'} . ", " . $borr->{'title'} . " " . $borr->{'firstname'};
+    $template->param(
+            wname           => $name,
+            wborfirstname   => $borr->{'firstname'},
+            wborsurname     => $borr->{'surname'},
+            wbortitle       => $borr->{'title'},
+            wborphone       => $borr->{'phone'},
+            wboremail       => $borr->{'email'},
+            wboraddress     => $borr->{'address'},
+            wboraddress2    => $borr->{'address2'},
+            wborcity        => $borr->{'city'},
+            wborzip         => $borr->{'zipcode'},
+            wborrowernumber => $reserve->{'borrowernumber'},
+            wborcnum        => $borr->{'cardnumber'},
+            wtransfertFrom  => $userenv_branch,
+    );
+}
+
+#
+# reserve found and item arrived at the expected branch
+#
+if ( $messages->{'ResFound'}) {
+    my $reserve    = $messages->{'ResFound'};
+    my $branchname = $branches->{ $reserve->{'branchcode'} }->{'branchname'};
+    my ($borr) = GetMemberDetails( $reserve->{'borrowernumber'}, 0 );
+
+    if ( $reserve->{'ResFound'} eq "Waiting" or $reserve->{'ResFound'} eq "Reserved" ) {
+        if ( $reserve->{'ResFound'} eq "Waiting" ) {
+            $template->param(
+                waiting      => ($userenv_branch eq $reserve->{'branchcode'} ? 1 : 0 ),
+            );
+        } elsif ( $reserve->{'ResFound'} eq "Reserved" ) {
+            $template->param(
+                intransit    => ($userenv_branch eq $reserve->{'branchcode'} ? 0 : 1 ),
+                transfertodo => ($userenv_branch eq $reserve->{'branchcode'} ? 0 : 1 ),
+                resbarcode   => $barcode,
+                reserved     => 1,
+            );
+        }
+
+        # same params for Waiting or Reserved
         $template->param(
-            found       => 1,
-               currentbranch => $branches->{ $branch }->{'branchname'},
-            branchname  => $branches->{ $res->{'branchcode'} }->{'branchname'},
-            reserved    => 1,
-            today       => $todaysdate,
-            itemnumber  => $res->{'itemnumber'},
-            itemtitle   => $iteminfo->{'title'},
-            itemauthor  => $iteminfo->{'author'},
-            itembarcode => $iteminfo->{'barcode'},
-            itemtype    => $iteminfo->{'itemtype'},
-            itembiblionumber => $iteminfo->{'biblionumber'},
-            borsurname       => $borr->{'surname'},
-            bortitle         => $borr->{'title'},
-            borfirstname     => $borr->{'firstname'},
-            bornum           => $res->{'borrowernumber'},
-            borcnum          => $borr->{'cardnumber'},
-            borphone         => $borr->{'phone'},
-            borstraddress    => $borr->{'streetaddress'},
-            borsub           => $borr->{'suburb'},
-            borcity          => $borr->{'city'},
-            borzip           => $borr->{'zipcode'},
-            boremail         => $borr->{'emailaddress'},
-                       debarred => $borr->{'debarred'},
-                       gonenoaddress => $borr->{'gonenoaddress'},
-            barcode          => $barcode
+            found          => 1,
+            currentbranch  => $branches->{$userenv_branch}->{'branchname'},
+            destbranchname => $branches->{ $reserve->{'branchcode'} }->{'branchname'},
+            name           => $borr->{'surname'} . ", " . $borr->{'title'} . " " . $borr->{'firstname'},
+            borfirstname   => $borr->{'firstname'},
+            borsurname     => $borr->{'surname'},
+            bortitle       => $borr->{'title'},
+            borphone       => $borr->{'phone'},
+            boremail       => $borr->{'email'},
+            boraddress     => $borr->{'address'},
+            boraddress2    => $borr->{'address2'},
+            borcity        => $borr->{'city'},
+            borzip         => $borr->{'zipcode'},
+            borcnum        => $borr->{'cardnumber'},
+            debarred       => $borr->{'debarred'},
+            gonenoaddress  => $borr->{'gonenoaddress'},
+            barcode        => $barcode,
+            destbranch    => $reserve->{'branchcode'},
+            borrowernumber => $reserve->{'borrowernumber'},
+            itemnumber     => $reserve->{'itemnumber'},
         );
-    }
+    } # else { ; }  # error?
 }
 
 # Error Messages
 my @errmsgloop;
 foreach my $code ( keys %$messages ) {
-
-    #    warn $code;
     my %err;
     my $exit_required_p = 0;
     if ( $code eq 'BadBarcode' ) {
@@ -343,17 +367,29 @@ foreach my $code ( keys %$messages ) {
         $exit_required_p = 1;
     }
     elsif ( ( $code eq 'IsPermanent' ) && ( not $messages->{'ResFound'} ) ) {
-        if ( $messages->{'IsPermanent'} ne $branch ) {
+        if ( $messages->{'IsPermanent'} ne $userenv_branch ) {
             $err{ispermanent} = 1;
             $err{msg}         =
               $branches->{ $messages->{'IsPermanent'} }->{'branchname'};
         }
     }
+    elsif ( $code eq 'WrongTransfer' ) {
+        ;    # FIXME... anything to do here?
+    }
+    elsif ( $code eq 'WrongTransferItem' ) {
+        ;    # FIXME... anything to do here?
+    }
+    elsif ( $code eq 'NeedsTransfer' ) {
+    }
+    elsif ( $code eq 'Wrongbranch' ) {
+    }
+               
     else {
-        die "Unknown error code $code";    # XXX
+        die "Unknown error code $code";    # note we need all the (empty) elsif's above, or we die.
+        # This forces the issue of staying in sync w/ Circulation.pm
     }
     if (%err) {
-        push ( @errmsgloop, \%err );
+        push( @errmsgloop, \%err );
     }
     last if $exit_required_p;
 }
@@ -362,22 +398,18 @@ $template->param( errmsgloop => \@errmsgloop );
 # patrontable ....
 if ($borrower) {
     my $flags = $borrower->{'flags'};
-    my $color = '';
     my @flagloop;
     my $flagset;
     foreach my $flag ( sort keys %$flags ) {
         my %flaginfo;
-        ( $color eq $linecolor1 ) 
-          ? ( $color = $linecolor2 )
-          : ( $color = $linecolor1 );
         unless ($flagset) { $flagset = 1; }
-        $flaginfo{color}   = $color;
         $flaginfo{redfont} = ( $flags->{$flag}->{'noissues'} );
         $flaginfo{flag}    = $flag;
         if ( $flag eq 'CHARGES' ) {
-            $flaginfo{msg}     = $flag;
-            $flaginfo{charges} = 1;
-           $flaginfo{bornum} = $borrower->{borrowernumber};
+            $flaginfo{msg}            = $flag;
+            $flaginfo{charges}        = 1;
+            $flaginfo{chargeamount}   = $flags->{$flag}->{amount};
+            $flaginfo{borrowernumber} = $borrower->{borrowernumber};
         }
         elsif ( $flag eq 'WAITING' ) {
             $flaginfo{msg}     = $flag;
@@ -385,16 +417,13 @@ if ($borrower) {
             my @waitingitemloop;
             my $items = $flags->{$flag}->{'itemlist'};
             foreach my $item (@$items) {
-                my ($iteminformation) =
-                  getiteminformation( \%env, $item->{'itemnumber'}, 0 );
-                my %waitingitem;
-                $waitingitem{biblionum} = $iteminformation->{'biblionumber'};
-                $waitingitem{barcode}   = $iteminformation->{'barcode'};
-                $waitingitem{title}     = $iteminformation->{'title'};
-                $waitingitem{brname}    =
-                  $branches->{ $iteminformation->{'holdingbranch'} }->{
-                  'branchname'};
-                push ( @waitingitemloop, \%waitingitem );
+                my $biblio = GetBiblioFromItemNumber( $item->{'itemnumber'});
+                push @waitingitemloop, {
+                    biblionum => $biblio->{'biblionumber'},
+                    barcode   => $biblio->{'barcode'},
+                    title     => $biblio->{'title'},
+                    brname    => $branches->{ $biblio->{'holdingbranch'} }->{'branchname'},
+                };
             }
             $flaginfo{itemloop} = \@waitingitemloop;
         }
@@ -404,17 +433,14 @@ if ($borrower) {
             foreach my $item ( sort { $a->{'date_due'} cmp $b->{'date_due'} }
                 @$items )
             {
-                my ($iteminformation) =
-                  getiteminformation( \%env, $item->{'itemnumber'}, 0 );
-                my %overdueitem;
-                $overdueitem{duedate}   = format_date($item->{'date_due'});
-                $overdueitem{biblionum} = $iteminformation->{'biblionumber'};
-                $overdueitem{barcode}   = $iteminformation->{'barcode'};
-                $overdueitem{title}     = $iteminformation->{'title'};
-                $overdueitem{brname}    =
-                  $branches->{ $iteminformation->{'holdingbranch'} }->{
-                  'branchname'};
-                push ( @itemloop, \%overdueitem );
+                my $biblio = GetBiblioFromItemNumber( $item->{'itemnumber'});
+                push @itemloop, {
+                    duedate   => format_date($item->{'date_due'}),
+                    biblionum => $biblio->{'biblionumber'},
+                    barcode   => $biblio->{'barcode'},
+                    title     => $biblio->{'title'},
+                    brname    => $branches->{ $biblio->{'holdingbranch'} }->{'branchname'},
+                };
             }
             $flaginfo{itemloop} = \@itemloop;
             $flaginfo{overdue}  = 1;
@@ -423,99 +449,81 @@ if ($borrower) {
             $flaginfo{other} = 1;
             $flaginfo{msg}   = $flags->{$flag}->{'message'};
         }
-        push ( @flagloop, \%flaginfo );
+        push( @flagloop, \%flaginfo );
     }
     $template->param(
-        flagset        => $flagset,
-        flagloop       => \@flagloop,
-        ribornum       => $borrower->{'borrowernumber'},
-        riborcnum      => $borrower->{'cardnumber'},
-        riborsurname   => $borrower->{'surname'},
-        ribortitle     => $borrower->{'title'},
-        riborfirstname => $borrower->{'firstname'}
+        flagset          => $flagset,
+        flagloop         => \@flagloop,
+        riborrowernumber => $borrower->{'borrowernumber'},
+        riborcnum        => $borrower->{'cardnumber'},
+        riborsurname     => $borrower->{'surname'},
+        ribortitle       => $borrower->{'title'},
+        riborfirstname   => $borrower->{'firstname'}
     );
 }
 
-my $color = '';
-
 #set up so only the last 8 returned items display (make for faster loading pages)
+my $returned_counter = ( C4::Context->preference('numReturnedItemsToShow') ) ? C4::Context->preference('numReturnedItemsToShow') : 8;
 my $count = 0;
 my @riloop;
 foreach ( sort { $a <=> $b } keys %returneditems ) {
     my %ri;
-    if ( $count < 8 ) {
-        ( $color eq $linecolor1 ) 
-          ? ( $color = $linecolor2 )
-          : ( $color = $linecolor1 );
-        $ri{color} = $color;
+    if ( $count++ < $returned_counter ) {
         my $barcode = $returneditems{$_};
         my $duedate = $riduedate{$_};
         my $overduetext;
         my $borrowerinfo;
         if ($duedate) {
-            my @tempdate = split ( /-/, $duedate );
-           $ri{year}=$tempdate[0];
-           $ri{month}=$tempdate[1];
-           $ri{day}=$tempdate[2];
-            my $duedatenz  = "$tempdate[2]/$tempdate[1]/$tempdate[0]";
-            my @datearr    = localtime( time() );
-            my $todaysdate =
-              $datearr[5] . '-'
-              . sprintf( "%0.2d", ( $datearr[4] + 1 ) ) . '-'
-              . sprintf( "%0.2d", $datearr[3] );
-           $ri{duedate}=format_date($duedate);
-            my ($borrower) =
-              getpatroninformation( \%env, $riborrowernumber{$_}, 0 );
-            $ri{bornum}       = $borrower->{'borrowernumber'};
-            $ri{borcnum}      = $borrower->{'cardnumber'};
-            $ri{borfirstname} = $borrower->{'firstname'};
-            $ri{borsurname}   = $borrower->{'surname'};
-            $ri{bortitle}     = $borrower->{'title'};
+            my @tempdate = split( /-/, $duedate );
+            $ri{year}  = $tempdate[0];
+            $ri{month} = $tempdate[1];
+            $ri{day}   = $tempdate[2];
+            $ri{duedate} = format_date($duedate);
+            my ($borrower) = GetMemberDetails( $riborrowernumber{$_}, 0 );
+            $ri{return_overdue} = 1 if ($duedate lt $today->output('iso'));
+            $ri{borrowernumber} = $borrower->{'borrowernumber'};
+            $ri{borcnum}        = $borrower->{'cardnumber'};
+            $ri{borfirstname}   = $borrower->{'firstname'};
+            $ri{borsurname}     = $borrower->{'surname'};
+            $ri{bortitle}       = $borrower->{'title'};
+            $ri{bornote}        = $borrower->{'borrowernotes'};
+            $ri{borcategorycode}= $borrower->{'categorycode'};
         }
         else {
-            $ri{bornum} = $riborrowernumber{$_};
+            $ri{borrowernumber} = $riborrowernumber{$_};
         }
-#        my %ri;
-        my ($iteminformation) = getiteminformation( \%env, 0, $barcode );
-        $ri{color}            = $color;
-        $ri{itembiblionumber} = $iteminformation->{'biblionumber'};
-        $ri{itemtitle}        = $iteminformation->{'title'};
-        $ri{itemauthor}       = $iteminformation->{'author'};
-        $ri{itemtype}         = $iteminformation->{'itemtype'};
+
+        #        my %ri;
+        my $biblio = GetBiblioFromItemNumber(GetItemnumberFromBarcode($barcode));
+        # fix up item type for display
+        $biblio->{'itemtype'} = C4::Context->preference('item-level_itypes') ? $biblio->{'itype'} : $biblio->{'itemtype'};
+        $ri{itembiblionumber} = $biblio->{'biblionumber'};
+        $ri{itemtitle}        = $biblio->{'title'};
+        $ri{itemauthor}       = $biblio->{'author'};
+        $ri{itemtype}         = $biblio->{'itemtype'};
+        $ri{itemnote}         = $biblio->{'itemnotes'};
+        $ri{ccode}            = $biblio->{'ccode'};
+        $ri{itemnumber}       = $biblio->{'itemnumber'};
         $ri{barcode}          = $barcode;
     }
     else {
         last;
     }
-    $count++;
-    push ( @riloop, \%ri );
+    push( @riloop, \%ri );
 }
-$template->param( riloop => \@riloop );
 
 $template->param(
-    genbrname  => $branches->{$branch}->{'branchname'},
-    genprname  => $printers->{$printer}->{'printername'},
-    branch     => $branch,
-    printer    => $printer,
-    errmsgloop => \@errmsgloop
+    riloop         => \@riloop,
+    genbrname      => $branches->{$userenv_branch}->{'branchname'},
+    genprname      => $printers->{$printer}->{'printername'},
+    branchname     => $branches->{$userenv_branch}->{'branchname'},
+    printer        => $printer,
+    errmsgloop     => \@errmsgloop,
+    exemptfine     => $exemptfine,
+    dropboxmode    => $dropboxmode,
+    dropboxdate           => $dropboxdate->output(),
+    overduecharges => $overduecharges,
 );
 
 # actually print the page!
 output_html_with_http_headers $query, $cookie, $template->output;
-
-sub cuecatbarcodedecode {
-    my ($barcode) = @_;
-    chomp($barcode);
-    my @fields = split ( /\./, $barcode );
-    my @results = map( decode($_), @fields[ 1 .. $#fields ] );
-    if ( $#results == 2 ) {
-        return $results[2];
-    }
-    else {
-        return $barcode;
-    }
-}
-
-# Local Variables:
-# tab-width: 4
-# End: