Bug 29790: Restore warning if deletion of serial item fails
[srvgit] / Koha / Holds.pm
index d1d8b29..6885b4d 100644 (file)
@@ -4,22 +4,21 @@ package Koha::Holds;
 #
 # 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 3 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>.
 
 use Modern::Perl;
 
-use Carp;
 
 use Koha::Database;
 
@@ -39,7 +38,7 @@ Koha::Holds - Koha Hold object set class
 
 =head3 waiting
 
-Returns a set of holds that are waiting from an existing set
+returns a set of holds that are waiting from an existing set
 
 =cut
 
@@ -49,6 +48,97 @@ sub waiting {
     return $self->search( { found => 'W' } );
 }
 
+=head3 unfilled
+
+returns a set of holds that are unfilled from an existing set
+
+=cut
+
+sub unfilled {
+    my ( $self ) = @_;
+
+    return $self->search( { found => undef } );
+}
+
+=head3 forced_hold_level
+
+If a patron has multiple holds for a single record,
+those holds must be either all record level holds,
+or they must all be item level holds.
+
+This method should be used with Hold sets where all
+Hold objects share the same patron and record.
+
+This method will return 'item' if the patron has
+at least one item level hold. It will return 'record'
+if the patron has holds but none are item level,
+Finally, if the patron has no holds, it will return
+undef which indicates the patron may select either
+record or item level holds, barring any other rules
+that would prevent one or the other.
+
+=cut
+
+sub forced_hold_level {
+    my ($self) = @_;
+
+    my $item_level_count = $self->search( { itemnumber => { '!=' => undef } } )->count();
+    return 'item' if $item_level_count > 0;
+
+    my $record_level_count = $self->search( { itemnumber => undef } )->count();
+    return 'record' if $record_level_count > 0;
+
+    return;
+}
+
+=head3 get_items_that_can_fill
+
+    my $items = $holds->get_items_that_can_fill();
+
+Return the list of items that can fill the hold set.
+
+Items that are not:
+
+  in transit
+  waiting
+  lost
+  widthdrawn
+  not for loan
+  not on loan
+
+=cut
+
+sub get_items_that_can_fill {
+    my ( $self ) = @_;
+
+    my @biblionumbers = $self->get_column('biblionumber');
+
+    my @branchtransfers = map { $_->itemnumber }
+      Koha::Item::Transfers->search(
+          { datearrived => undef },
+          {
+              columns => ['itemnumber'],
+              collapse => 1,
+          }
+      );
+    my @waiting_holds = map { $_->itemnumber }
+      Koha::Holds->search(
+          { 'found' => 'W' },
+          {
+              columns => ['itemnumber'],
+              collapse => 1,
+          }
+      );
+
+    return Koha::Items->search(
+        {
+            biblionumber => { in => \@biblionumbers },
+            itemnumber   => { -not_in => [ @branchtransfers, @waiting_holds ] },
+            onloan       => undef,
+        }
+    )->filter_by_for_hold();
+}
+
 =head3 type
 
 =cut