#
# This file is part of Koha.
#
-# Koha is free software; you can redistribute it and/or modify it under the
-# terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 2 of the License, or (at your option) any later
-# version.
+# Koha is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
#
-# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+# Koha is distributed in the hope that it will be useful, but
+# WITHOUT ANY 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.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
=head1 returns.pl
use strict;
use warnings;
-use CGI;
+use Carp 'verbose';
+$SIG{ __DIE__ } = sub { Carp::confess( @_ ) };
+
+use CGI qw ( -utf8 );
use DateTime;
use C4::Context;
use C4::Auth qw/:DEFAULT get_session/;
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, $librarian, $cookie ) = get_template_and_user(
{
- template_name => "circ/returns.tmpl",
+ template_name => "circ/returns.tt",
query => $query,
type => "intranet",
authnotrequired => 0,
}
);
+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;
+}
+
+# Print a reserve slip on this page
+if ( $query->param('print_slip') ) {
+ $template->param(
+ print_slip => 1,
+ borrowernumber => $query->param('borrowernumber'),
+ biblionumber => $query->param('biblionumber'),
+ );
+}
+
#####################
#Global vars
my $branches = GetBranches();
my $printers = GetPrinters();
+my $userenv = C4::Context->userenv;
+my $userenv_branch = $userenv->{'branch'} // '';
+my $printer = $userenv->{'branchprinter'} // '';
+my $forgivemanualholdsexpire = $query->param('forgivemanualholdsexpire');
-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.....
#
my $resbarcode = $query->param('resbarcode');
my $diffBranchReturned = $query->param('diffBranch');
my $iteminfo = GetBiblioFromItemNumber($item);
+ my $cancel_reserve = $query->param('cancel_reserve');
# 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);
+
+ if ( $cancel_reserve ) {
+ CancelReserve({ borrowernumber => $borrowernumber, itemnumber => $item, charge_cancel_fee => !$forgivemanualholdsexpire });
+ } else {
+ 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 $borr = GetMember( borrowernumber => $nextreservinfo );
my $name = $borr->{'surname'} . ", " . $borr->{'title'} . " " . $borr->{'firstname'};
if ( $messages->{'transfert'} ) {
$template->param(
#dropbox: get last open day (today - 1)
my $today = DateTime->now( time_zone => C4::Context->tz());
my $dropboxdate = $calendar->addDate($today, -1);
+
+my $return_date_override = $query->param('return_date_override');
+my $return_date_override_remember =
+ $query->param('return_date_override_remember');
+if ($return_date_override) {
+ if ( C4::Context->preference('SpecifyReturnDate') ) {
+ my $return_date_override_dt = eval {dt_from_string( $return_date_override ) };
+ if ( $return_date_override_dt ) {
+ # note that we've overriden the return date
+ $template->param( return_date_was_overriden => 1);
+ # Save the original format if we are remembering for this series
+ $template->param(
+ return_date_override => $return_date_override,
+ return_date_override_remember => 1
+ ) if ($return_date_override_remember);
+
+ $return_date_override =
+ DateTime::Format::MySQL->format_datetime( $return_date_override_dt );
+ }
+ }
+ else {
+ $return_date_override = q{};
+ }
+}
+
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);
+ ModItemTransfer($transferitem, $userenv_branch, $tobranch);
}
if ($canceltransfer){
$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'} );
- }
- }
-
#
# save the return
#
- ( $returned, $messages, $issueinformation, $borrower ) =
- AddReturn( $barcode, $userenv_branch, $exemptfine, $dropboxmode); # do the return
- my $homeorholdingbranchreturn = C4::Context->preference('HomeOrHoldingBranchReturn');
- $homeorholdingbranchreturn ||= 'homebranch';
# get biblio description
my $biblio = GetBiblioFromItemNumber($itemnumber);
);
}
+ # make sure return branch respects home branch circulation rules, default to homebranch
+ my $hbr = GetBranchItemRule($biblio->{'homebranch'}, $itemtype->{itemtype})->{'returnbranch'} || "homebranch";
+ my $returnbranch = $biblio->{$hbr} ;
+
$template->param(
title => $biblio->{'title'},
homebranch => $biblio->{'homebranch'},
- homebranchname => GetBranchName( $biblio->{$homeorholdingbranchreturn} ),
+ returnbranch => $returnbranch,
author => $biblio->{'author'},
itembarcode => $biblio->{'barcode'},
itemtype => $biblio->{'itemtype'},
ccode => $biblio->{'ccode'},
- itembiblionumber => $biblio->{'biblionumber'},
- additional_materials => $biblio->{'materials'}
+ itembiblionumber => $biblio->{'biblionumber'},
+ biblionumber => $biblio->{'biblionumber'},
+ borrower => $borrower,
+ additional_materials => $biblio->{'materials'},
);
my %input = (
barcode => $barcode,
);
+ # do the return
+ ( $returned, $messages, $issueinformation, $borrower ) =
+ AddReturn( $barcode, $userenv_branch, $exemptfine, $dropboxmode, $return_date_override, $dropboxdate );
+
if ($returned) {
my $time_now = DateTime->now( time_zone => C4::Context->tz )->truncate( to => 'minute');
my $duedate = $issueinformation->{date_due}->strftime('%Y-%m-%d %H:%M');
$riduedate{0} = $duedate;
$input{borrowernumber} = $borrower->{'borrowernumber'};
$input{duedate} = $duedate;
- $input{return_overdue} = 1 if (DateTime->compare($issueinformation->{date_due}, $time_now) == -1);
+ unless ( $dropboxmode ) {
+ $input{return_overdue} = 1 if (DateTime->compare($issueinformation->{date_due}, DateTime->now()) == -1);
+ } else {
+ $input{return_overdue} = 1 if (DateTime->compare($issueinformation->{date_due}, $dropboxdate) == -1);
+ }
push( @inputloop, \%input );
if ( C4::Context->preference("FineNotifyAtCheckin") ) {
my ( $od, $issue, $fines ) = GetMemberIssuesAndFines( $borrower->{'borrowernumber'} );
- if ($fines > 0) {
+ if ($fines && $fines > 0) {
$template->param( fines => sprintf("%.2f",$fines) );
$template->param( fineborrowernumber => $borrower->{'borrowernumber'} );
}
}
-
+
if (C4::Context->preference("WaitingNotifyAtCheckin") ) {
#Check for waiting holds
my @reserves = GetReservesFromBorrowernumber($borrower->{'borrowernumber'});
if ( $num_res->{'found'} eq 'W' && $num_res->{'branchcode'} eq $userenv_branch) {
$waiting_holds++;
}
- }
+ }
if ($waiting_holds > 0) {
$template->param(
waiting_holds => $waiting_holds,
}
}
}
- elsif ( !$messages->{'BadBarcode'} ) {
- $input{duedate} = 0;
- $returneditems{0} = $barcode;
- $riduedate{0} = 0;
- push( @inputloop, \%input );
- }
+ $template->param( privacy => $borrower->{privacy} );
}
$template->param( inputloop => \@inputloop );
if ( $messages->{'NeedsTransfer'} ){
$template->param(
found => 1,
- needstransfer => 1,
+ needstransfer => $messages->{'NeedsTransfer'},
itemnumber => $itemnumber,
);
}
my $reserve = $messages->{'ResFound'};
my $branchname = $branches->{ $reserve->{'branchcode'} }->{'branchname'};
- my ($borr) = GetMemberDetails( $reserve->{'borrowernumber'}, 0 );
+ my $borr = C4::Members::GetMember( borrowernumber => $reserve->{'borrowernumber'} );
my $name = $borr->{'surname'} . ", " . $borr->{'title'} . " " . $borr->{'firstname'};
$template->param(
wname => $name,
wbortitle => $borr->{'title'},
wborphone => $borr->{'phone'},
wboremail => $borr->{'email'},
+ wborstnum => $borr->{streetnumber},
wboraddress => $borr->{'address'},
wboraddress2 => $borr->{'address2'},
wborcity => $borr->{'city'},
if ( $messages->{'ResFound'}) {
my $reserve = $messages->{'ResFound'};
my $branchname = $branches->{ $reserve->{'branchcode'} }->{'branchname'};
- my ($borr) = GetMemberDetails( $reserve->{'borrowernumber'}, 0 );
+ my $borr = C4::Members::GetMember( borrowernumber => $reserve->{'borrowernumber'} );
if ( $reserve->{'ResFound'} eq "Waiting" or $reserve->{'ResFound'} eq "Reserved" ) {
if ( $reserve->{'ResFound'} eq "Waiting" ) {
boremail => $borr->{'email'},
boraddress => $borr->{'address'},
boraddress2 => $borr->{'address2'},
+ borstnum => $borr->{streetnumber},
borcity => $borr->{'city'},
borzip => $borr->{'zipcode'},
borcnum => $borr->{'cardnumber'},
}
elsif ( $code eq 'NotIssued' ) {
$err{notissued} = 1;
- $err{msg} = $branches->{ $messages->{'IsPermanent'} }->{'branchname'};
+ $err{msg} = '';
+ $err{msg} = $branches->{ $messages->{'IsPermanent'} }->{'branchname'} if $messages->{'IsPermanent'};
}
elsif ( $code eq 'LocalUse' ) {
$err{localuse} = 1;
$err{debarborrowernumber} = $borrower->{borrowernumber};
$err{debarname} = "$borrower->{firstname} $borrower->{surname}";
}
+ elsif ( $code eq 'PrevDebarred' ) {
+ $err{prevdebarred} = $messages->{'PrevDebarred'};
+ }
+ elsif ( $code eq 'ForeverDebarred' ) {
+ $err{foreverdebarred} = $messages->{'ForeverDebarred'};
+ }
+ elsif ( $code eq 'NotForLoanStatusUpdated' ) {
+ $err{NotForLoanStatusUpdated} = $messages->{NotForLoanStatusUpdated};
+ }
else {
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
$ri{hour} = $duedate->hour();
$ri{minute} = $duedate->minute();
$ri{duedate} = output_pref($duedate);
- my ($b) = GetMemberDetails( $riborrowernumber{$_}, 0 );
- $ri{return_overdue} = 1 if (DateTime->compare($duedate, DateTime->now()) == -1 );
+ my $b = C4::Members::GetMember( borrowernumber => $riborrowernumber{$_} );
+ unless ( $dropboxmode ) {
+ $ri{return_overdue} = 1 if (DateTime->compare($duedate, DateTime->now()) == -1);
+ } else {
+ $ri{return_overdue} = 1 if (DateTime->compare($duedate, $dropboxdate) == -1);
+ }
$ri{borrowernumber} = $b->{'borrowernumber'};
$ri{borcnum} = $b->{'cardnumber'};
$ri{borfirstname} = $b->{'firstname'};
my $item = GetItem( 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'};
- $ri{itemtitle} = $biblio->{'title'};
- $ri{itemauthor} = $biblio->{'author'};
- $ri{itemcallnumber} = $biblio->{'itemcallnumber'};
- $ri{itemtype} = $biblio->{'itemtype'};
- $ri{itemnote} = $biblio->{'itemnotes'};
- $ri{ccode} = $biblio->{'ccode'};
- $ri{itemnumber} = $biblio->{'itemnumber'};
- $ri{barcode} = $bar_code;
- $ri{homebranch} = $item->{'homebranch'};
- $ri{holdingbranch} = $item->{'holdingbranch'};
+ $ri{itembiblionumber} = $biblio->{'biblionumber'};
+ $ri{itemtitle} = $biblio->{'title'};
+ $ri{itemauthor} = $biblio->{'author'};
+ $ri{itemcallnumber} = $biblio->{'itemcallnumber'};
+ $ri{itemtype} = $biblio->{'itemtype'};
+ $ri{itemnote} = $biblio->{'itemnotes'};
+ $ri{itemnotes_nonpublic} = $item->{'itemnotes_nonpublic'};
+ $ri{ccode} = $biblio->{'ccode'};
+ $ri{itemnumber} = $biblio->{'itemnumber'};
+ $ri{barcode} = $bar_code;
+ $ri{homebranch} = $item->{'homebranch'};
+ $ri{holdingbranch} = $item->{'holdingbranch'};
$ri{location} = $biblio->{'location'};
my $shelfcode = $ri{'location'};
}
push @riloop, \%ri;
}
+my ($genbrname, $genprname);
+if (my $b = $branches->{$userenv_branch}) {
+ $genbrname = $b->{'branchname'};
+}
+if (my $p = $printers->{$printer}) {
+ $genprname = $p->{'printername'};
+}
$template->param(
riloop => \@riloop,
- genbrname => $branches->{$userenv_branch}->{'branchname'},
- genprname => $printers->{$printer}->{'printername'},
- branchname => $branches->{$userenv_branch}->{'branchname'},
+ genbrname => $genbrname,
+ genprname => $genprname,
+ branchname => $genbrname,
printer => $printer,
errmsgloop => \@errmsgloop,
exemptfine => $exemptfine,
dropboxmode => $dropboxmode,
dropboxdate => output_pref($dropboxdate),
+ forgivemanualholdsexpire => $forgivemanualholdsexpire,
overduecharges => $overduecharges,
- soundon => C4::Context->preference("SoundOn"),
+ AudioAlerts => C4::Context->preference("AudioAlerts"),
BlockReturnOfWithdrawnItems => C4::Context->preference("BlockReturnOfWithdrawnItems"),
);
-### Comment out rotating collections for now to allow it a little more time to bake
-### for 3.4; in particular, must ensure that it doesn't fight with transfers required
-### to fill hold requests
-### -- Galen Charlton 2010-10-06
-#my $itemnumber = GetItemnumberFromBarcode( $query->param('barcode') );
-#if ( $itemnumber ) {
-# my ( $holdingBranch, $collectionBranch ) = GetCollectionItemBranches( $itemnumber );
-# if ( ! ( $holdingBranch eq $collectionBranch ) ) {
-# $template->param(
-# collectionItemNeedsTransferred => 1,
-# collectionBranch => GetBranchName($collectionBranch),
-# );
-# }
-#}
+$itemnumber = GetItemnumberFromBarcode( $barcode );
+if ( $itemnumber ) {
+ my ( $holdingBranch, $collectionBranch ) = GetCollectionItemBranches( $itemnumber );
+ $holdingBranch //= '';
+ $collectionBranch //= '';
+ if ( ! ( $holdingBranch eq $collectionBranch ) ) {
+ $template->param(
+ collectionItemNeedsTransferred => 1,
+ collectionBranch => GetBranchName($collectionBranch),
+ );
+ }
+}
# actually print the page!
output_html_with_http_headers $query, $cookie, $template->output;