Bug 31439: Use pseudo element for bullet in results.tt
[srvgit] / circ / returns.pl
index f989071..4ba8812 100755 (executable)
@@ -47,7 +47,7 @@ use Koha::AuthorisedValues;
 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;
@@ -119,7 +119,6 @@ foreach ( $query->param ) {
     $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;
 
     ######################
@@ -181,11 +180,11 @@ if ( $query->param('recall_id') ) {
 
     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;
@@ -216,28 +215,21 @@ my $dest = $query->param('dest');
 #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);
     }
 }
 
@@ -254,7 +246,7 @@ if ($transit) {
     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;
             }
@@ -268,7 +260,7 @@ if ($transit) {
     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;
         }
@@ -285,7 +277,6 @@ if ($transit) {
 # 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 });
 
@@ -329,7 +320,10 @@ if ($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 =
@@ -340,10 +334,27 @@ if ($barcode) {
     $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');
@@ -384,7 +395,8 @@ if ($barcode) {
                 );
             }
         }
-    } 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;
@@ -395,6 +407,89 @@ if ($barcode) {
     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 );
 
@@ -474,7 +569,7 @@ if ( $messages->{'ResFound'} ) {
         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(
@@ -534,10 +629,10 @@ if ( $messages->{TransferredRecall} ) {
     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,
@@ -633,6 +728,8 @@ foreach my $code ( keys %$messages ) {
         ;
     } 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
@@ -661,7 +758,7 @@ foreach ( sort { $a <=> $b } keys %returneditems ) {
             $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);