Bug 2505 - Add commented use warnings where missing in the circ/ directory
[koha.git] / circ / returns.pl
index b72fd8e..2611099 100755 (executable)
@@ -15,9 +15,9 @@
 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
 # A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
 #
-# You should have received a copy of the GNU General Public License along with
-# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
-# Suite 330, Boston, MA  02111-1307 USA
+# You should have received a copy of the GNU General Public License along
+# with Koha; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
 =head1 returns.pl
 
@@ -26,7 +26,7 @@ script to execute returns of books
 =cut
 
 use strict;
-# use warnings; # FIXME
+#use warnings; FIXME - Bug 2505
 
 use CGI;
 use C4::Context;
@@ -41,19 +41,20 @@ use C4::Reserves;
 use C4::Biblio;
 use C4::Items;
 use C4::Members;
-use C4::Branch; # GetBranchName
+use C4::Branch; # GetBranches GetBranchName
 use C4::Koha;   # FIXME : is it still useful ?
+use C4::RotatingCollections;
 
 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;
-       }
+    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
@@ -72,7 +73,6 @@ my ( $template, $librarian, $cookie ) = get_template_and_user(
 my $branches = GetBranches();
 my $printers = GetPrinters();
 
-#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');
 
@@ -87,16 +87,25 @@ my %riduedate;
 my %riborrowernumber;
 my @inputloop;
 foreach ( $query->param ) {
-    (next) unless (/ri-(\d*)/);
+    my $counter;
+    if (/ri-(\d*)/) {
+        $counter = $1;
+        if ($counter > 20) {
+            next;
+        }
+    }
+    else {
+        next;
+    }
+
     my %input;
-    my $counter = $1;
-    (next) if ( $counter > 20 );
     my $barcode        = $query->param("ri-$counter");
     my $duedate        = $query->param("dd-$counter");
     my $borrowernumber = $query->param("bn-$counter");
     $counter++;
 
-    # decode barcode
+    # decode barcode    ## Didn't we already decode them before passing them back last time??
+    $barcode =~ s/^\s*|\s*$//g; # remove leading/trailing whitespace
     $barcode = barcodedecode($barcode) if(C4::Context->preference('itemBarcodeInputFilter'));
 
     ######################
@@ -125,42 +134,30 @@ if ( $query->param('resbarcode') ) {
     my $borrowernumber = $query->param('borrowernumber');
     my $resbarcode     = $query->param('resbarcode');
     my $diffBranchReturned = $query->param('diffBranch');
-    # set to waiting....
     my $iteminfo   = GetBiblioFromItemNumber($item);
     # fix up item type for display
     $iteminfo->{'itemtype'} = C4::Context->preference('item-level_itypes') ? $iteminfo->{'itype'} : $iteminfo->{'itemtype'};
-    my $diffBranchSend;
-    
-#     addin in ModReserveAffect the possibility to check if the document is expected in this library or not,
-# if not we send a value in reserve waiting for not implementting waiting status
-    if ($userenv_branch ne $diffBranchReturned) {
-        $diffBranchSend = $diffBranchReturned;
-    }
-    else {
-        $diffBranchSend = undef;
-    }
-    ModReserveAffect( $item, $borrowernumber,$diffBranchSend);
-#   check if we have other reservs for this document, if we have a return send the message of transfer
+    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 $borcnum = $borr->{'cardnumber'};
-    my $name    = $borr->{'surname'} . ", " . $borr->{'title'} . " " . $borr->{'firstname'};
-     
-    my $slip = $query->param('resslip');
-
+    my $name   = $borr->{'surname'} . ", " . $borr->{'title'} . " " . $borr->{'firstname'};
     if ( $messages->{'transfert'} ) {
         $template->param(
             itemtitle      => $iteminfo->{'title'},
-                       itembiblionumber => $iteminfo->{'biblionumber'},
+            itembiblionumber => $iteminfo->{'biblionumber'},
             iteminfo       => $iteminfo->{'author'},
             tobranchname   => GetBranchName($messages->{'transfert'}),
             name           => $name,
             borrowernumber => $borrowernumber,
-            borcnum        => $borcnum,
+            borcnum        => $borr->{'cardnumber'},
             borfirstname   => $borr->{'firstname'},
             borsurname     => $borr->{'surname'},
-            diffbranch     => 1
+            diffbranch     => 1,
         );
     }
 }
@@ -169,38 +166,58 @@ my $borrower;
 my $returned = 0;
 my $messages;
 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)
+#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 choosen to initiate a transfer
-       my $transferitem = $query->param('transferitem');
-       my $tobranch     = $query->param('tobranch');
-       ModItemTransfer($transferitem, $userenv_branch, $tobranch); 
+# 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) {
-    $barcode = barcodedecode($barcode)  if(C4::Context->preference('itemBarcodeInputFilter'));
+    $barcode =~ s/^\s*|\s*$//g; # remove leading/trailing whitespace
+    $barcode = barcodedecode($barcode) if C4::Context->preference('itemBarcodeInputFilter');
+    $itemnumber = GetItemnumberFromBarcode($barcode);
+
+    if ( C4::Context->preference("InProcessingToShelvingCart") ) {
+        my $item = GetItem( $itemnumber );
+        if ( $item->{'location'} eq 'PROC' ) {
+            $item->{'location'} = 'CART';
+            ModItem( $item, $item->{'biblionumber'}, $item->{'itemnumber'} );
+        }
+    }
+
+    if ( C4::Context->preference("ReturnToShelvingCart") ) {
+        my $item = GetItem( $itemnumber );
+        $item->{'location'} = 'CART';
+        ModItem( $item, $item->{'biblionumber'}, $item->{'itemnumber'} );
+    }
+
 #
 # save the return
 #
     ( $returned, $messages, $issueinformation, $borrower ) =
-      AddReturn( $barcode, $userenv_branch, $exemptfine, $dropboxmode);
+      AddReturn( $barcode, $userenv_branch, $exemptfine, $dropboxmode);     # do the return
+
     # get biblio description
-    my $biblio = GetBiblioFromItemNumber($issueinformation->{'itemnumber'});
+    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'},
+        homebranchname   => GetBranchName( $biblio->{'homebranch'} ),
         author           => $biblio->{'author'},
         itembarcode      => $biblio->{'barcode'},
         itemtype         => $biblio->{'itemtype'},
@@ -208,41 +225,33 @@ if ($barcode) {
         itembiblionumber => $biblio->{'biblionumber'},    
     );
 
+    my %input = (
+        counter => 0,
+        first   => 1,
+        barcode => $barcode,
+    );
+
     if ($returned) {
-        $returneditems{0}    = $barcode;
-        $riborrowernumber{0} = $borrower->{'borrowernumber'};
-        $riduedate{0}        = $issueinformation->{'date_due'};
-        my %input;
-        $input{counter}        = 0;
-        $input{first}          = 1;
-        $input{barcode}        = $barcode;
+        my $duedate = $issueinformation->{'date_due'};
+        $returneditems{0}      = $barcode;
+        $riborrowernumber{0}   = $borrower->{'borrowernumber'};
+        $riduedate{0}          = $duedate;
         $input{borrowernumber} = $borrower->{'borrowernumber'};
-        $input{duedate}        = $issueinformation->{'date_due'};
-        $input{return_overdue} = 1 if ($issueinformation->{'date_due'} lt $today->output('iso'));
+        $input{duedate}        = $duedate;
+        $input{return_overdue} = 1 if ($duedate and $duedate lt $today->output('iso'));
         push( @inputloop, \%input );
-
-        # check if the branch is the same as homebranch
-        # if not, we want to put a message
-        if ( $biblio->{'homebranch'} ne $userenv_branch ) {
-            $template->param( homebranch => $biblio->{'homebranch'} );
-        }
     }
     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{borrowernumber} = 'Item Cancelled';
+            $input{borrowernumber} = 'Item Cancelled';  # FIXME: should be in display layer ?
             $riborrowernumber{0}   = 'Item Cancelled';
         }
         else {
-            $input{borrowernumber} = ' ';
+            $input{borrowernumber} = ' ';  # This seems clearly bogus.
             $riborrowernumber{0}   = ' ';
         }
         push( @inputloop, \%input );
@@ -265,23 +274,24 @@ if ( $messages->{'WasTransfered'} ) {
 }
 
 if ( $messages->{'NeedsTransfer'} ){
-       $template->param(
-               found          => 1,
-               needstransfer  => 1,
-               itemnumber => $issueinformation->{'itemnumber'}
-       );
+    $template->param(
+        found          => 1,
+        needstransfer  => 1,
+        itemnumber     => $itemnumber,
+    );
 }
 
 if ( $messages->{'Wrongbranch'} ){
-       $template->param(
-               wrongbranch => 1,
-       );
+    $template->param(
+        wrongbranch => 1,
+    );
 }
 
-# adding a case of wrong transfert, if the document wasn't transfered in the good library (according to branchtransfer (tobranch) BDD)
+# 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(
+    $messages->{'WrongTransfer'} = GetBranchName( $messages->{'WrongTransfer'} );
+    $template->param(
         WrongTransfer  => 1,
         TransferWaitingAt => $messages->{'WrongTransfer'},
         WrongTransferItem => $messages->{'WrongTransferItem'},
@@ -308,7 +318,6 @@ if ( $messages->{'WrongTransfer'} and not $messages->{'WasTransfered'}) {
     );
 }
 
-
 #
 # reserve found and item arrived at the expected branch
 #
@@ -350,9 +359,10 @@ if ( $messages->{'ResFound'}) {
             debarred       => $borr->{'debarred'},
             gonenoaddress  => $borr->{'gonenoaddress'},
             barcode        => $barcode,
-            destbranch    => $reserve->{'branchcode'},
+            destbranch     => $reserve->{'branchcode'},
             borrowernumber => $reserve->{'borrowernumber'},
             itemnumber     => $reserve->{'itemnumber'},
+            reservenotes   => $reserve->{'reservenotes'},
         );
     } # else { ; }  # error?
 }
@@ -360,8 +370,6 @@ if ( $messages->{'ResFound'}) {
 # Error Messages
 my @errmsgloop;
 foreach my $code ( keys %$messages ) {
-
-    #    warn $code;
     my %err;
     my $exit_required_p = 0;
     if ( $code eq 'BadBarcode' ) {
@@ -405,9 +413,10 @@ foreach my $code ( keys %$messages ) {
     }
     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 );
@@ -439,12 +448,12 @@ if ($borrower) {
             my $items = $flags->{$flag}->{'itemlist'};
             foreach my $item (@$items) {
                 my $biblio = GetBiblioFromItemNumber( $item->{'itemnumber'});
-                my %waitingitem;
-                $waitingitem{biblionum} = $biblio->{'biblionumber'};
-                $waitingitem{barcode}   = $biblio->{'barcode'};
-                $waitingitem{title}     = $biblio->{'title'};
-                $waitingitem{brname}    = $branches->{ $biblio->{'holdingbranch'} }->{'branchname'};
-                push( @waitingitemloop, \%waitingitem );
+                push @waitingitemloop, {
+                    biblionum => $biblio->{'biblionumber'},
+                    barcode   => $biblio->{'barcode'},
+                    title     => $biblio->{'title'},
+                    brname    => $branches->{ $biblio->{'holdingbranch'} }->{'branchname'},
+                };
             }
             $flaginfo{itemloop} = \@waitingitemloop;
         }
@@ -455,13 +464,13 @@ if ($borrower) {
                 @$items )
             {
                 my $biblio = GetBiblioFromItemNumber( $item->{'itemnumber'});
-                my %overdueitem;
-                $overdueitem{duedate}   = format_date( $item->{'date_due'} );
-                $overdueitem{biblionum} = $biblio->{'biblionumber'};
-                $overdueitem{barcode}   = $biblio->{'barcode'};
-                $overdueitem{title}     = $biblio->{'title'};
-                $overdueitem{brname}    = $branches->{ $biblio->{'holdingbranch'}} ->{'branchname'};
-                push( @itemloop, \%overdueitem );
+                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;
@@ -490,32 +499,30 @@ my @riloop;
 foreach ( sort { $a <=> $b } keys %returneditems ) {
     my %ri;
     if ( $count++ < $returned_counter ) {
-        my $barcode = $returneditems{$_};
+        my $bar_code = $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];
             $ri{duedate} = format_date($duedate);
-            my ($borrower) = GetMemberDetails( $riborrowernumber{$_}, 0 );
+            my ($b)      = 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'};
+            $ri{borrowernumber} = $b->{'borrowernumber'};
+            $ri{borcnum}        = $b->{'cardnumber'};
+            $ri{borfirstname}   = $b->{'firstname'};
+            $ri{borsurname}     = $b->{'surname'};
+            $ri{bortitle}       = $b->{'title'};
+            $ri{bornote}        = $b->{'borrowernotes'};
+            $ri{borcategorycode}= $b->{'categorycode'};
         }
         else {
             $ri{borrowernumber} = $riborrowernumber{$_};
         }
 
         #        my %ri;
-        my $biblio = GetBiblioFromItemNumber(GetItemnumberFromBarcode($barcode));
+        my $biblio = GetBiblioFromItemNumber(GetItemnumberFromBarcode($bar_code));
         # fix up item type for display
         $biblio->{'itemtype'} = C4::Context->preference('item-level_itypes') ? $biblio->{'itype'} : $biblio->{'itemtype'};
         $ri{itembiblionumber} = $biblio->{'biblionumber'};
@@ -525,16 +532,16 @@ foreach ( sort { $a <=> $b } keys %returneditems ) {
         $ri{itemnote}         = $biblio->{'itemnotes'};
         $ri{ccode}            = $biblio->{'ccode'};
         $ri{itemnumber}       = $biblio->{'itemnumber'};
-        $ri{barcode}          = $barcode;
+        $ri{barcode}          = $bar_code;
     }
     else {
         last;
     }
-    push( @riloop, \%ri );
+    push @riloop, \%ri;
 }
-$template->param( riloop => \@riloop );
 
 $template->param(
+    riloop         => \@riloop,
     genbrname      => $branches->{$userenv_branch}->{'branchname'},
     genprname      => $printers->{$printer}->{'printername'},
     branchname     => $branches->{$userenv_branch}->{'branchname'},
@@ -542,9 +549,21 @@ $template->param(
     errmsgloop     => \@errmsgloop,
     exemptfine     => $exemptfine,
     dropboxmode    => $dropboxmode,
-    dropboxdate           => $dropboxdate->output(),
+    dropboxdate    => $dropboxdate->output(),
     overduecharges => $overduecharges,
+    soundon        => C4::Context->preference("SoundOn"),
 );
 
+my $itemnumber = GetItemnumberFromBarcode( $query->param('barcode') );
+if ( $itemnumber ) {
+    my ( $holdingBranch, $collectionBranch ) = GetCollectionItemBranches( $itemnumber );
+    if ( ! ( $holdingBranch eq $collectionBranch ) ) {
+        $template->param(
+          collectionItemNeedsTransferred => 1,
+          collectionBranch => GetBranchName($collectionBranch),
+        );
+    }
+}                                                                                                            
+
 # actually print the page!
 output_html_with_http_headers $query, $cookie, $template->output;