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:
parent
7816d09e71
commit
d8e562a218
|
|
@ -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;
|
||||
59
Koha/Item.pm
59
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 )
|
||||
|
|
|
|||
|
|
@ -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' );
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue