Bug 18072: Add Koha::Item->can_be_transferred
authorLari Taskula <lari.taskula@jns.fi>
Tue, 7 Feb 2017 11:52:29 +0000 (13:52 +0200)
committerNick Clemens <nick@bywatersolutions.com>
Wed, 18 Jul 2018 17:29:04 +0000 (17:29 +0000)
This patch adds a new method Koha::Item->can_be_transferred.

Includes unit test.

To test:
1. prove t/db_dependent/Koha/Items.t

Signed-off-by: Josef Moravec <josef.moravec@gmail.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>

Signed-off-by: Nick Clemens <nick@bywatersolutions.com>

Koha/Exceptions/Library.pm [new file with mode: 0644]
Koha/Item.pm
t/db_dependent/Koha/Items.t

diff --git a/Koha/Exceptions/Library.pm b/Koha/Exceptions/Library.pm
new file mode 100644 (file)
index 0000000..d4b0cfe
--- /dev/null
@@ -0,0 +1,17 @@
+package Koha::Exceptions::Library;
+
+use Modern::Perl;
+
+use Exception::Class (
+
+    'Koha::Exceptions::Library::Exception' => {
+        description => 'Something went wrong!',
+    },
+
+    'Koha::Exceptions::Library::NotFound' => {
+        isa => 'Koha::Exceptions::Library::Exception',
+        description => 'Library not found',
+    },
+);
+
+1;
index bea05f8..6d81cc5 100644 (file)
@@ -27,10 +27,13 @@ use Koha::DateUtils qw( dt_from_string );
 use C4::Context;
 use Koha::Checkouts;
 use Koha::IssuingRules;
-use Koha::Item::Transfer;
+use Koha::Item::Transfer::Limits;
+use Koha::Item::Transfers;
 use Koha::Patrons;
 use Koha::Libraries;
 
+use Koha::Exceptions::Library;
+
 use base qw(Koha::Object);
 
 =head1 NAME
@@ -189,6 +192,60 @@ sub can_article_request {
     return q{};
 }
 
+=head3 can_be_transferred
+
+Checks if an item can be transferred to given library.
+
+This feature is controlled by two system preferences:
+UseBranchTransferLimits to enable / disable the feature
+BranchTransferLimitsType to use either an itemnumber or ccode as an identifier
+                         for setting the limitations
+
+    MANDATORY PARAMETERS:
+    $to   : Koha::Library or branchcode string
+    OPTIONAL PARAMETERS:
+    $from : Koha::Library or branchcode string  # if not given, item holdingbranch
+                                                # will be used instead
+
+=cut
+
+sub can_be_transferred {
+    my ($self, $to, $from) = @_;
+
+    if (ref($to) ne 'Koha::Library') {
+        my $tobranchcode = defined $to ? $to : '';
+        $to = Koha::Libraries->find($tobranchcode);
+        unless ($to) {
+            Koha::Exceptions::Library::NotFound->throw(
+                error => "Library '$tobranchcode' not found.",
+            );
+        }
+    }
+    if (defined $from && ref($from) ne 'Koha::Library') {
+        my $frombranchcode = defined $from ? $from : '';
+        $from = Koha::Libraries->find($frombranchcode);
+        unless ($from) {
+            Koha::Exceptions::Library::NotFound->throw(
+                error => "Library '$frombranchcode' not found.",
+            );
+        }
+    }
+
+    $to = $to->branchcode;
+    $from = defined $from ? $from->branchcode : $self->holdingbranch;
+
+    return 1 if $from eq $to; # Transfer to current branch is allowed
+    return 1 unless C4::Context->preference('UseBranchTransferLimits');
+
+    my $limittype = C4::Context->preference('BranchTransferLimitsType');
+    return Koha::Item::Transfer::Limits->search({
+        toBranch => $to,
+        fromBranch => $from,
+        $limittype => $limittype eq 'itemtype'
+                        ? $self->effective_itemtype : $self->ccode
+    })->count ? 0 : 1;
+}
+
 =head3 article_request_type
 
 my $type = $item->article_request_type( $borrower )
index 862f832..e40396b 100644 (file)
 
 use Modern::Perl;
 
-use Test::More tests => 8;
+use Test::More tests => 9;
 
 use C4::Circulation;
 use Koha::Item;
+use Koha::Item::Transfer::Limits;
 use Koha::Items;
 use Koha::Database;
 
 use t::lib::TestBuilder;
+use t::lib::Mocks;
 
 my $schema = Koha::Database->new->schema;
 $schema->storage->txn_begin;
@@ -118,6 +120,52 @@ subtest 'checkout' => sub {
     is( $checkout, undef, 'Koha::Item->checkout should return undef if there is no *current* checkout on this item' );
 };
 
+subtest 'can_be_transferred' => sub {
+    plan tests => 8;
+
+    t::lib::Mocks::mock_preference('UseBranchTransferLimits', 1);
+    t::lib::Mocks::mock_preference('BranchTransferLimitsType', 'itemtype');
+
+    my $library1 = $builder->build( { source => 'Branch' } )->{branchcode};
+    my $library2 = $builder->build( { source => 'Branch' } )->{branchcode};
+    my $item  = Koha::Item->new({
+        biblionumber     => $biblioitem->{biblionumber},
+        biblioitemnumber => $biblioitem->{biblioitemnumber},
+        homebranch       => $library1,
+        holdingbranch    => $library1,
+        itype            => 'test',
+        barcode          => "newbarcode",
+    })->store;
+    $nb_of_items++;
+
+    is(Koha::Item::Transfer::Limits->search({
+        fromBranch => $library1,
+        toBranch => $library2,
+    })->count, 0, 'There are no transfer limits between libraries.');
+    ok($item->can_be_transferred($library2),
+       'Item can be transferred between libraries.');
+
+    my $limit = Koha::Item::Transfer::Limit->new({
+        fromBranch => $library1,
+        toBranch => $library2,
+        itemtype => $item->effective_itemtype,
+    })->store;
+    is(Koha::Item::Transfer::Limits->search({
+        fromBranch => $library1,
+        toBranch => $library2,
+    })->count, 1, 'Given we have added a transfer limit,');
+    is($item->can_be_transferred($library2), 0,
+       'Item can no longer be transferred between libraries.');
+    is($item->can_be_transferred($library2, $library1), 0,
+       'We get the same result also if we pass the from-library parameter.');
+    eval { $item->can_be_transferred(); };
+    is(ref($@), 'Koha::Exceptions::Library::NotFound', 'Exception thrown when no library given.');
+    eval { $item->can_be_transferred('heaven'); };
+    is(ref($@), 'Koha::Exceptions::Library::NotFound', 'Exception thrown when invalid library is given.');
+    eval { $item->can_be_transferred($library2, 'hell'); };
+    is(ref($@), 'Koha::Exceptions::Library::NotFound', 'Exception thrown when invalid library is given.');
+};
+
 $retrieved_item_1->delete;
 is( Koha::Items->search->count, $nb_of_items + 1, 'Delete should have deleted the item' );