Bug 33080: Allow pagination to be built from stashed values
[srvgit] / C4 / RotatingCollections.pm
index 4f7473b..a1f8df7 100644 (file)
@@ -25,17 +25,13 @@ package C4::RotatingCollections;
 use Modern::Perl;
 
 use C4::Context;
-use C4::Circulation;
 use C4::Reserves qw(CheckReserves);
 use Koha::Database;
 
-use DBI;
-
-use Data::Dumper;
+use Try::Tiny qw( catch try );
 
 use vars qw(@ISA @EXPORT);
 
-# set the version for version checking
 
 =head1 NAME
 
@@ -63,12 +59,15 @@ BEGIN {
       TransferCollection
 
       GetCollectionItemBranches
+      isItemInAnyCollection
+      isItemInThisCollection
     );
 }
 
 =head2  CreateCollection
  ( $success, $errorcode, $errormessage ) = CreateCollection( $title, $description );
- Creates a new collection
+
+Creates a new collection
 
  Input:
    $title: short description of the club or service
@@ -167,7 +166,8 @@ sub UpdateCollection {
 =head2 DeleteCollection
 
  ( $success, $errorcode, $errormessage ) = DeleteCollection( $colId );
- Deletes a collection of the given id
+
+Deletes a collection of the given id
 
  Input:
    $colId : id of the Archetype to be deleted
@@ -200,7 +200,8 @@ sub DeleteCollection {
 =head2 GetCollections
 
  $collections = GetCollections();
- Returns data about all collections
+
+Returns data about all collections
 
  Output:
   On Success:
@@ -230,8 +231,8 @@ sub GetCollections {
 
  ( $results, $success, $errorcode, $errormessage ) = GetItemsInCollection( $colId );
 
- Returns information about the items in the given collection
+Returns information about the items in the given collection
+
  Input:
    $colId: The id of the collection
 
@@ -398,7 +399,7 @@ sub RemoveItemFromCollection {
 
 =head2 TransferCollection
 
- ( $success, $errorcode, $errormessage ) = TransferCollection( $colId, $colBranchcode );
+ ( $success, $messages ) = TransferCollection( $colId, $colBranchcode );
 
 Transfers a collection to another branch
 
@@ -408,8 +409,7 @@ Transfers a collection to another branch
 
  Output:
    $success: 1 if all database operations were successful, 0 otherwise
-   $errorCode: Code for reason of failure, good for translating errors in templates
-   $errorMessage: English description of error
+   $messages: Arrayref of messages for user feedback
 
 =cut
 
@@ -418,10 +418,10 @@ sub TransferCollection {
 
     ## Check for all necessary parameters
     if ( !$colId ) {
-        return ( 0, 1, "NO_ID" );
+        return ( 0, [{ type => 'error', code => 'NO_ID' }] );
     }
     if ( !$colBranchcode ) {
-        return ( 0, 2, "NO_BRANCHCODE" );
+        return ( 0, [{ type => 'error', code => 'NO_BRANCHCODE' }] );
     }
 
     my $dbh = C4::Context->dbh;
@@ -433,7 +433,8 @@ sub TransferCollection {
                         colBranchcode = ? 
                         WHERE colId = ?"
     );
-    $sth->execute( $colBranchcode, $colId ) or return ( 0, 4, $sth->errstr() );
+    $sth->execute( $colBranchcode, $colId ) or return 0;
+    my $to_library = Koha::Libraries->find( $colBranchcode );
 
     $sth = $dbh->prepare(q{
         SELECT items.itemnumber, items.barcode FROM collections_tracking
@@ -442,16 +443,70 @@ sub TransferCollection {
         WHERE issues.borrowernumber IS NULL
           AND collections_tracking.colId = ?
     });
-    $sth->execute($colId) or return ( 0, 4, $sth->errstr );
-    my @results;
+    $sth->execute($colId) or return 0;
+    my $messages;
     while ( my $item = $sth->fetchrow_hashref ) {
-        my ($status) = CheckReserves( $item->{itemnumber} );
-        my @transfers = C4::Circulation::GetTransfers( $item->{itemnumber} );
-        C4::Circulation::transferbook( $colBranchcode, $item->{barcode}, my $ignore_reserves = 1 ) unless ( $status eq 'Waiting' || @transfers );
+        my $item_object = Koha::Items->find( $item->{itemnumber} );
+        try {
+            $item_object->request_transfer(
+                {
+                    to            => $to_library,
+                    reason        => 'RotatingCollection',
+                    ignore_limits => 0
+                }
+            );    # Request transfer
+        }
+        catch {
+            if ( $_->isa('Koha::Exceptions::Item::Transfer::InQueue') ) {
+                my $exception      = $_;
+                my $found_transfer = $_->transfer;
+                if (   $found_transfer->in_transit
+                    || $found_transfer->reason eq 'Reserve' )
+                {
+                    my $transfer = $item_object->request_transfer(
+                        {
+                            to            => $to_library,
+                            reason        => "RotatingCollection",
+                            ignore_limits => 0,
+                            enqueue       => 1
+                        }
+                    );    # Queue transfer
+                    push @{$messages},
+                      {
+                        type           => 'alert',
+                        code           => 'enqueued',
+                        item           => $item_object,
+                        found_transfer => $found_transfer
+                      };
+                }
+                else {
+                    my $transfer = $item_object->request_transfer(
+                        {
+                            to            => $to_library,
+                            reason        => "RotatingCollection",
+                            ignore_limits => 0,
+                            replace       => 1
+                        }
+                    );    # Replace transfer
+                    # NOTE: If we just replaced a StockRotationAdvance,
+                    # it will get enqueued afresh on the next cron run
+                }
+            }
+            elsif ( $_->isa('Koha::Exceptions::Item::Transfer::Limit') ) {
+                push @{$messages},
+                  {
+                    type => 'error',
+                    code => 'limits',
+                    item => $item_object
+                  };
+            }
+            else {
+                $_->rethrow();
+            }
+        };
     }
 
-    return 1;
-
+    return (1, $messages);
 }
 
 =head2 GetCollectionItemBranches
@@ -506,7 +561,7 @@ sub isItemInThisCollection {
 
 =head2 isItemInAnyCollection
 
-$inCollection = isItemInAnyCollection( $itemnumber );
+  my $inCollection = isItemInAnyCollection( $itemnumber );
 
 =cut
 
@@ -516,7 +571,7 @@ sub isItemInAnyCollection {
     my $dbh = C4::Context->dbh;
 
     my $sth = $dbh->prepare(
-        "SELECT itemnumber FROM collections_tracking WHERE itemnumber = ?");
+        "SELECT itemnumber FROM collections_tracking JOIN collections USING (colId) WHERE itemnumber = ?");
     $sth->execute($itemnumber) or return (0);
 
     my $row = $sth->fetchrow_hashref;