#
# 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 Carp 'verbose';
+$SIG{ __DIE__ } = sub { Carp::confess( @_ ) };
+
use CGI qw ( -utf8 );
use DateTime;
use C4::Context;
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 $userenv = C4::Context->userenv;
my $userenv_branch = $userenv->{'branch'} // '';
my $printer = $userenv->{'branchprinter'} // '';
+my $forgivemanualholdsexpire = $query->param('forgivemanualholdsexpire');
my $overduecharges = (C4::Context->preference('finesMode') && C4::Context->preference('finesMode') ne 'off');
#
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(
$query->param('return_date_override_remember');
if ($return_date_override) {
if ( C4::Context->preference('SpecifyReturnDate') ) {
- # FIXME we really need to stop adding more uses of C4::Dates
- if ( $return_date_override =~ C4::Dates->regexp('syspref') ) {
-
+ 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
return_date_override_remember => 1
) if ($return_date_override_remember);
- my $dt = dt_from_string($return_date_override);
$return_date_override =
- DateTime::Format::MySQL->format_datetime($dt);
+ DateTime::Format::MySQL->format_datetime( $return_date_override_dt );
}
}
else {
#
# save the return
#
- ( $returned, $messages, $issueinformation, $borrower ) =
- AddReturn( $barcode, $userenv_branch, $exemptfine, $dropboxmode, $return_date_override, $dropboxdate );
- 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'},
+ biblionumber => $biblio->{'biblionumber'},
borrower => $borrower,
additional_materials => $biblio->{'materials'},
);
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');
}
}
}
- 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,
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" ) {
}
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;
$ri{hour} = $duedate->hour();
$ri{minute} = $duedate->minute();
$ri{duedate} = output_pref($duedate);
- my ($b) = GetMemberDetails( $riborrowernumber{$_}, 0 );
+ my $b = C4::Members::GetMember( borrowernumber => $riborrowernumber{$_} );
unless ( $dropboxmode ) {
$ri{return_overdue} = 1 if (DateTime->compare($duedate, DateTime->now()) == -1);
} else {
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'};
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"),
);
-$itemnumber = GetItemnumberFromBarcode( $query->param('barcode') );
+$itemnumber = GetItemnumberFromBarcode( $barcode );
if ( $itemnumber ) {
my ( $holdingBranch, $collectionBranch ) = GetCollectionItemBranches( $itemnumber );
+ $holdingBranch //= '';
+ $collectionBranch //= '';
if ( ! ( $holdingBranch eq $collectionBranch ) ) {
$template->param(
collectionItemNeedsTransferred => 1,