From d8e562a218d2c8acaae865890face7ea06ee062d Mon Sep 17 00:00:00 2001 From: Lari Taskula Date: Tue, 7 Feb 2017 13:52:29 +0200 Subject: [PATCH] Bug 18072: Add Koha::Item->can_be_transferred 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 Signed-off-by: Tomas Cohen Arazi Signed-off-by: Kyle M Hall Signed-off-by: Nick Clemens --- Koha/Exceptions/Library.pm | 17 +++++++++++ Koha/Item.pm | 59 ++++++++++++++++++++++++++++++++++++- t/db_dependent/Koha/Items.t | 50 ++++++++++++++++++++++++++++++- 3 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 Koha/Exceptions/Library.pm diff --git a/Koha/Exceptions/Library.pm b/Koha/Exceptions/Library.pm new file mode 100644 index 0000000000..d4b0cfebc3 --- /dev/null +++ b/Koha/Exceptions/Library.pm @@ -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; diff --git a/Koha/Item.pm b/Koha/Item.pm index bea05f8317..6d81cc5566 100644 --- a/Koha/Item.pm +++ b/Koha/Item.pm @@ -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 ) diff --git a/t/db_dependent/Koha/Items.t b/t/db_dependent/Koha/Items.t index 862f8328c7..e40396b9e1 100644 --- a/t/db_dependent/Koha/Items.t +++ b/t/db_dependent/Koha/Items.t @@ -19,14 +19,16 @@ 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' ); -- 2.39.5