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