use Koha::BiblioFrameworks;
use Koha::Calendar;
use Koha::Checkouts;
-use Koha::DateUtils qw( dt_from_string output_pref );
+use Koha::DateUtils qw( dt_from_string );
use Koha::Holds;
use Koha::Items;
use Koha::Item::Transfers;
$counter++;
# 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 $barcode;
######################
if ($recall) {
my $item;
- if ( !$recall->item_level_recall ) {
+ if ( !$recall->item_level ) {
$item = Koha::Items->find( $itemnumber );
}
- if ( $recall->branchcode ne $return_branch ) {
+ if ( $recall->pickup_library_id ne $return_branch ) {
$recall->start_transfer({ item => $item }) if !$recall->in_transit;
} else {
my $expirationdate = $recall->calc_expirationdate;
#dropbox: get last open day (today - 1)
my $dropboxdate = Koha::Checkouts::calculate_dropbox_date();
-my $return_date_override = $query->param('return_date_override');
-my $return_date_override_dt;
-my $return_date_override_remember =
- $query->param('return_date_override_remember');
+my $return_date_override = $query->param('return_date_override') || q{};
if ($return_date_override) {
if ( C4::Context->preference('SpecifyReturnDate') ) {
- $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{};
+ # note that we've overriden the return date
+ $template->param( return_date_was_overriden => 1 );
+
+ my $return_date_override_remember =
+ $query->param('return_date_override_remember');
+
+ # 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);
}
}
if ( $canceltransfer ) {
$transfer->cancel({ reason => 'Manual', force => 1});
if ( C4::Context->preference('UseRecalls') ) {
- my $recall_transfer_deleted = Koha::Recalls->find({ itemnumber => $itemnumber, status => 'in_transit' });
+ my $recall_transfer_deleted = Koha::Recalls->find({ item_id => $itemnumber, status => 'in_transit' });
if ( defined $recall_transfer_deleted ) {
$recall_transfer_deleted->revert_transfer;
}
my $transfer = $item->get_transfer;
$transfer->cancel({ reason => 'Manual', force => 1});
if ( C4::Context->preference('UseRecalls') ) {
- my $recall_transfer_deleted = Koha::Recalls->find({ itemnumber => $itemnumber, status => 'in_transit' });
+ my $recall_transfer_deleted = Koha::Recalls->find({ item_id => $itemnumber, status => 'in_transit' });
if ( defined $recall_transfer_deleted ) {
$recall_transfer_deleted->revert_transfer;
}
# actually return book and prepare item table.....
my $returnbranch;
if ($barcode) {
- $barcode =~ s/^\s*|\s*$//g; # remove leading/trailing whitespace
$barcode = barcodedecode($barcode) if $barcode;
my $item = Koha::Items->find({ barcode => $barcode });
barcode => $barcode,
);
- my $return_date = $dropboxmode ? $dropboxdate : $return_date_override_dt;
+ my $return_date =
+ $dropboxmode
+ ? $dropboxdate
+ : dt_from_string( $return_date_override );
# Block return if multi-part and confirm has not been received
my $needs_confirm =
$template->param( 'multiple_confirmed' => 1 )
if $query->param('multiple_confirm');
+ # Block return if bundle and confirm has not been received
+ my $bundle_confirm =
+ $item
+ && $item->is_bundle
+ && !$query->param('confirm_items_bundle_return');
+ $template->param( 'confirm_items_bundle_returned' => 1 )
+ if $query->param('confirm_items_bundle_return');
+
+ # is there a waiting hold for the item, for which cancellation
+ # has been requested?
+ if ($item) {
+ my $waiting_holds_to_be_cancelled = $item->holds->waiting->filter_by_has_cancellation_requests;
+ while ( my $hold = $waiting_holds_to_be_cancelled->next ) {
+ $hold->cancel;
+ }
+ }
+
# do the return
( $returned, $messages, $issue, $borrower ) =
AddReturn( $barcode, $userenv_branch, $exemptfine, $return_date )
- unless $needs_confirm;
+ unless ( $needs_confirm || $bundle_confirm );
if ($returned) {
my $time_now = dt_from_string()->truncate( to => 'minute');
);
}
}
- } elsif ( C4::Context->preference('ShowAllCheckins') and !$messages->{'BadBarcode'} and !$needs_confirm ) {
+
+ } elsif ( C4::Context->preference('ShowAllCheckins') and !$messages->{'BadBarcode'} and !$needs_confirm and !$bundle_confirm ) {
$input{duedate} = 0;
$returneditems{0} = $barcode;
$riduedate{0} = 0;
if ( $needs_confirm ) {
$template->param( needs_confirm => $needs_confirm );
}
+
+ if ( $bundle_confirm ) {
+ $template->param(
+ items_bundle_return_confirmation => 1,
+ );
+ }
+
+ # Mark missing bundle items as lost and report unexpected items
+ if ( $item && $item->is_bundle && $query->param('confirm_items_bundle_return') ) {
+ my $BundleLostValue = C4::Context->preference('BundleLostValue');
+ my $barcodes = $query->param('verify-items-bundle-contents-barcodes');
+ my @barcodes = map { s/^\s+|\s+$//gr } ( split /\n/, $barcodes );
+ my $expected_items = { map { $_->barcode => $_ } $item->bundle_items->as_list };
+ my $verify_items = Koha::Items->search( { barcode => { 'in' => \@barcodes } } );
+ my @unexpected_items;
+ my @missing_items;
+ my @bundle_items;
+ while ( my $verify_item = $verify_items->next ) {
+ # Fix and lost statuses
+ $verify_item->itemlost(0);
+
+ # Update last_seen
+ $verify_item->datelastseen( dt_from_string()->ymd() );
+
+ # Update last_borrowed if actual checkin
+ $verify_item->datelastborrowed( dt_from_string()->ymd() ) if $issue;
+
+ # Expected item, remove from lookup table
+ if ( delete $expected_items->{$verify_item->barcode} ) {
+ push @bundle_items, $verify_item;
+ }
+ # Unexpected item, warn and remove from bundle
+ else {
+ $verify_item->remove_from_bundle;
+ push @unexpected_items, $verify_item;
+ }
+
+ # Store results
+ $verify_item->store();
+ }
+ for my $missing_item ( keys %{$expected_items} ) {
+ my $bundle_item = $expected_items->{$missing_item};
+ # Mark as lost if it's not already lost
+ if ( !$bundle_item->itemlost ) {
+ $bundle_item->itemlost($BundleLostValue)->store();
+
+ # Add return_claim record if this is an actual checkin
+ if ($issue) {
+ $bundle_item->_result->create_related(
+ 'return_claims',
+ {
+ issue_id => $issue->issue_id,
+ itemnumber => $bundle_item->itemnumber,
+ borrowernumber => $issue->borrowernumber,
+ created_by => C4::Context->userenv()->{number},
+ created_on => dt_from_string
+ }
+ );
+ }
+ push @missing_items, $bundle_item;
+
+ # NOTE: We cannot use C4::LostItem here because the item itself doesn't have a checkout
+ # and thus would not get charged.. it's checked out as part of the bundle.
+ if ( C4::Context->preference('WhenLostChargeReplacementFee') && $issue ) {
+ C4::Accounts::chargelostitem(
+ $issue->borrowernumber,
+ $bundle_item->itemnumber,
+ $bundle_item->replacementprice,
+ sprintf( "%s %s %s",
+ $bundle_item->biblio->title || q{},
+ $bundle_item->barcode || q{},
+ $bundle_item->itemcallnumber || q{},
+ ),
+ );
+ }
+ }
+ }
+ $template->param(
+ unexpected_items => \@unexpected_items,
+ missing_items => \@missing_items,
+ bundle_items => \@bundle_items
+ );
+ }
}
$template->param( inputloop => \@inputloop );
my $biblio = $item->biblio;
my $diffBranchSend = !$branchCheck ? $reserve->{branchcode} : undef;
- ModReserveAffect( $reserve->{itemnumber}, $reserve->{borrowernumber}, $diffBranchSend, $reserve->{reserve_id}, $desk_id );
+ ModReserveAffect( $itemnumber, $reserve->{borrowernumber}, $diffBranchSend, $reserve->{reserve_id}, $desk_id );
my ( $messages, $nextreservinfo ) = GetOtherReserves($reserve->{itemnumber});
$template->param(
my $recall = $messages->{TransferredRecall};
# confirm transfer has arrived at the branch
- my $transfer = Koha::Item::Transfers->search({ datearrived => { '!=' => undef }, itemnumber => $recall->itemnumber }, { order_by => { -desc => 'datearrived' } })->next;
+ my $transfer = Koha::Item::Transfers->search({ datearrived => { '!=' => undef }, itemnumber => $recall->item_id }, { order_by => { -desc => 'datearrived' } })->next;
# if transfer has completed, show popup to confirm as waiting
- if ( defined $transfer and $transfer->tobranch eq $recall->branchcode ) {
+ if ( defined $transfer and $transfer->tobranch eq $recall->pickup_library_id ) {
$template->param(
found => 1,
recall => $recall,
;
} elsif ( $code eq 'TransferredRecall' ) {
;
+ } elsif ( $code eq 'InBundle' ) {
+ $template->param( InBundle => $messages->{InBundle} );
} 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{day} = $duedate->day();
$ri{hour} = $duedate->hour();
$ri{minute} = $duedate->minute();
- $ri{duedate} = output_pref($duedate);
+ $ri{duedate} = $duedate;
my $patron = Koha::Patrons->find( $riborrowernumber{$_} );
unless ( $dropboxmode ) {
$ri{return_overdue} = 1 if (DateTime->compare($duedate, dt_from_string()) == -1);