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 <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>
This commit is contained in:
Lari Taskula 2017-02-07 13:52:29 +02:00 committed by Nick Clemens
parent 7816d09e71
commit d8e562a218
3 changed files with 124 additions and 2 deletions

View File

@ -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;

View 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 )

View File

@ -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' );