use DateTime;
use DateTime::Duration;
use Koha::Database;
-use Koha::DateUtils;
+use Koha::DateUtils qw( dt_from_string );
use Koha::Item::Transfer;
use Test::Warn;
);
# Relationship to rota
- isa_ok( $sritem->itemnumber, 'Koha::Item', "Fetched related item." );
- is( $sritem->itemnumber->itemnumber, $itm->itemnumber, "Related rota OK." );
+ isa_ok( $sritem->item, 'Koha::Item', "Fetched related item." );
+ is( $sritem->item->itemnumber, $itm->itemnumber, "Related rota OK." );
# Relationship to stage
isa_ok( $sritem->stage, 'Koha::StockRotationStage', "Fetched related stage." );
}
);
my $dbitem = Koha::StockRotationItems->find($sritem->{itemnumber_id});
- $dbitem->itemnumber->homebranch($dbitem->stage->branchcode_id);
- $dbitem->itemnumber->holdingbranch($dbitem->stage->branchcode_id);
+ $dbitem->item->homebranch($dbitem->stage->branchcode_id);
+ $dbitem->item->holdingbranch($dbitem->stage->branchcode_id);
$dbitem->stage->position(1);
my $dbrota = $dbitem->stage->rota;
);
my $branch = $builder->build({ source => 'Branch' });
- $dbitem->itemnumber->holdingbranch($branch->{branchcode});
+ $dbitem->item->holdingbranch($branch->{branchcode});
# - homebranch != holdingbranch [1]
is(
);
# Set to incorrect homebranch.
- $dbitem->itemnumber->holdingbranch($dbitem->stage->branchcode_id);
- $dbitem->itemnumber->homebranch($branch->{branchcode});
+ $dbitem->item->holdingbranch($dbitem->stage->branchcode_id);
+ $dbitem->item->homebranch($branch->{branchcode});
# - homebranch != stockrotationstage.branch & not in transit [1]
is(
$dbitem->needs_repatriating, 1,
}
}
);
- my $item_id = $sritem_1->itemnumber->itemnumber;
+ my $item_id = $sritem_1->item->itemnumber;
my $srstage_1 = $sritem_1->stage;
$sritem_1->discard_changes;
$sritem_1->stage->position(1);
$sritem_1->stage->duration(50);
my $branch = $builder->build({ source => 'Branch' });
- $sritem_1->itemnumber->holdingbranch($branch->{branchcode});
+ $sritem_1->item->holdingbranch($branch->{branchcode});
# Test a straight up repatriate
ok($sritem_1->repatriate, "Repatriation done.");
- my $intransfer = $sritem_1->itemnumber->get_transfer;
+ my $intransfer = $sritem_1->item->get_transfer;
is($intransfer->frombranch, $branch->{branchcode}, "Origin correct.");
is($intransfer->tobranch, $sritem_1->stage->branchcode_id, "Target Correct.");
# Reset
$intransfer->datearrived(dt_from_string())->store;
- $sritem_1->itemnumber->holdingbranch($branch->{branchcode});
+ $sritem_1->item->holdingbranch($branch->{branchcode});
# Setup a conflicting manual transfer
my $item = Koha::Items->find($item_id);
# Reset
$intransfer->datearrived(dt_from_string())->store;
- $sritem_1->itemnumber->holdingbranch($branch->{branchcode});
+ $sritem_1->item->holdingbranch($branch->{branchcode});
# Confirm that stockrotation ignores transfer limits
t::lib::Mocks::mock_preference('UseBranchTransferLimits', 1);
{
fromBranch => $branch->{branchcode},
toBranch => $srstage_1->branchcode_id,
- itemtype => $sritem_1->itemnumber->effective_itemtype,
+ itemtype => $sritem_1->item->effective_itemtype,
}
)->store;
# Stockrotation should overrule transfer limits
ok($sritem_1->repatriate, "Repatriation done regardless of transfer limits.");
- $intransfer = $sritem_1->itemnumber->get_transfer;
+ $intransfer = $sritem_1->item->get_transfer;
is($intransfer->frombranch, $branch->{branchcode}, "Origin correct.");
is($intransfer->tobranch, $sritem_1->stage->branchcode_id, "Target Correct.");
};
subtest "Tests for needs_advancing." => sub {
- plan tests => 7;
+ plan tests => 8;
$schema->storage->txn_begin;
# Test behaviour of item freshly added to rota.
}
);
$dbitem = Koha::StockRotationItems->find($sritem->{itemnumber_id});
- $dbitem->itemnumber->homebranch($dbitem->stage->branchcode_id);
- $dbitem->itemnumber->holdingbranch($dbitem->stage->branchcode_id);
+ $dbitem->item->homebranch($dbitem->stage->branchcode_id);
+ $dbitem->item->holdingbranch($dbitem->stage->branchcode_id);
$dbitem->stage->position(1);
$dbitem->stage->duration(50);
dt_from_string() - DateTime::Duration->new( days => 75 )
)->store;
is($dbitem->needs_advancing, 1, "Ready to be advanced.");
+
+ # Bug 30518: Confirm that DST boundaries do not explode.
+ # mock_config does not work here, because of tz vs timezone subroutines
+ my $context = Test::MockModule->new('C4::Context');
+ $context->mock( 'tz', sub {
+ 'Europe/London';
+ });
+ my $bad_date = dt_from_string("2020-09-29T01:15:30", 'iso');
+ $dbtransfer->datesent($bad_date)->store;
+ $dbtransfer->datearrived($bad_date)->store;
+ $dbitem->stage->duration(180)->store;
+ is( $dbitem->needs_advancing, 1, "DST boundary doesn't cause failure." );
+ $context->unmock('tz');
+
+ # Test that missing historical branch transfers do not crash
$dbtransfer->delete;
- warning_is {$dbitem->needs_advancing} "We have no historical branch transfer for itemnumber " . $dbitem->itemnumber->itemnumber . "; This should not have happened!", "Missing transfer is warned.";
+ warning_is {$dbitem->needs_advancing} "We have no historical branch transfer for item " . $dbitem->item->itemnumber . "; This should not have happened!", "Missing transfer is warned.";
$schema->storage->txn_rollback;
};
subtest "Tests for advance." => sub {
- plan tests => 44;
+ plan tests => 48;
$schema->storage->txn_begin;
my $sritem_1 = $builder->build_object(
}
);
$sritem_1->discard_changes;
- $sritem_1->itemnumber->holdingbranch($sritem_1->stage->branchcode_id);
- my $item_id = $sritem_1->itemnumber->itemnumber;
+ $sritem_1->item->holdingbranch($sritem_1->stage->branchcode_id);
+ my $item_id = $sritem_1->item->itemnumber;
my $srstage_1 = $sritem_1->stage;
$srstage_1->position(1)->duration(50)->store; # Configure stage.
# Configure item
- $sritem_1->itemnumber->holdingbranch($srstage_1->branchcode_id)->store;
- $sritem_1->itemnumber->homebranch($srstage_1->branchcode_id)->store;
+ $sritem_1->item->holdingbranch($srstage_1->branchcode_id)->store;
+ $sritem_1->item->homebranch($srstage_1->branchcode_id)->store;
# Sanity check
is($sritem_1->stage->stage_id, $srstage_1->stage_id, "Stage sanity check.");
## Test results
is($sritem_1->stage->stage_id, $srstage_2->stage_id, "Stage updated.");
is(
- $sritem_1->itemnumber->homebranch,
+ $sritem_1->item->homebranch,
$srstage_2->branchcode_id,
"Item homebranch updated"
);
- my $transfer_request = $sritem_1->itemnumber->get_transfer;
+ my $transfer_request = $sritem_1->item->get_transfer;
is($transfer_request->frombranch, $srstage_1->branchcode_id, "Origin correct.");
is($transfer_request->tobranch, $srstage_2->branchcode_id, "Target Correct.");
is($transfer_request->datesent, undef, "Transfer requested, but not sent.");
# Arrive at new branch
$transfer_request->datearrived(dt_from_string())->store;
- $sritem_1->itemnumber->holdingbranch($srstage_2->branchcode_id)->store;
+ $sritem_1->item->holdingbranch($srstage_2->branchcode_id)->store;
# Test a cyclical advance
ok($sritem_1->advance, "Cyclical advancement done.");
## Test results
is($sritem_1->stage->stage_id, $srstage_1->stage_id, "Stage updated.");
is(
- $sritem_1->itemnumber->homebranch,
+ $sritem_1->item->homebranch,
$srstage_1->branchcode_id,
"Item homebranch updated"
);
- $transfer_request = $sritem_1->itemnumber->get_transfer;
+ $transfer_request = $sritem_1->item->get_transfer;
is($transfer_request->frombranch, $srstage_2->branchcode_id, "Origin correct.");
is($transfer_request->tobranch, $srstage_1->branchcode_id, "Target correct.");
# Arrive at new branch
$transfer_request->datearrived(dt_from_string())->store;
- $sritem_1->itemnumber->holdingbranch($srstage_1->branchcode_id)->store;
+ $sritem_1->item->holdingbranch($srstage_1->branchcode_id)->store;
# Confirm that stockrotation ignores transfer limits
t::lib::Mocks::mock_preference('UseBranchTransferLimits', 1);
{
fromBranch => $srstage_1->branchcode_id,
toBranch => $srstage_2->branchcode_id,
- itemtype => $sritem_1->itemnumber->effective_itemtype,
+ itemtype => $sritem_1->item->effective_itemtype,
}
)->store;
## Test results
is($sritem_1->stage->stage_id, $srstage_2->stage_id, "Stage updated ignoring transfer limits.");
is(
- $sritem_1->itemnumber->homebranch,
+ $sritem_1->item->homebranch,
$srstage_2->branchcode_id,
"Item homebranch updated ignoring transfer limits"
);
- $transfer_request = $sritem_1->itemnumber->get_transfer;
+ $transfer_request = $sritem_1->item->get_transfer;
is($transfer_request->frombranch, $srstage_1->branchcode_id, "Origin correct ignoring transfer limits.");
is($transfer_request->tobranch, $srstage_2->branchcode_id, "Target correct ignoring transfer limits.");
# Arrive at new branch
$transfer_request->datearrived(dt_from_string())->store;
- $sritem_1->itemnumber->holdingbranch($srstage_2->branchcode_id)->store;
+ $sritem_1->item->holdingbranch($srstage_2->branchcode_id)->store;
# Setup a conflicting manual transfer
my $item = Koha::Items->find($item_id);
isnt($transfer_request->datecancelled, undef, "Conflicting manual transfer was cancelled");
# StockRotationAdvance transfer added
- $transfer_request = $sritem_1->itemnumber->get_transfer;
+ $transfer_request = $sritem_1->item->get_transfer;
is($transfer_request->reason, 'StockrotationAdvance', "StockrotationAdvance transfer added");
is($transfer_request->frombranch, $srstage_2->branchcode_id, "Origin correct.");
is($transfer_request->tobranch, $srstage_1->branchcode_id, "Target correct.");
# Arrive at new branch
$transfer_request->datearrived(dt_from_string())->store;
- $sritem_1->itemnumber->holdingbranch($srstage_1->branchcode_id)->store;
+ $sritem_1->item->holdingbranch($srstage_1->branchcode_id)->store;
# Setup a conflicting reserve transfer
$item->request_transfer({ to => $srstage_2->branchcode, reason => "Reserve" });
# StockRotationAdvance transfer added
my $transfer_requests = Koha::Item::Transfers->search(
{
- itemnumber => $sritem_1->itemnumber->itemnumber,
+ itemnumber => $sritem_1->item->itemnumber,
datearrived => undef,
datecancelled => undef
}
# Arrive at new branch
$transfer_request->datearrived(dt_from_string())->store;
- $sritem_1->itemnumber->holdingbranch($srstage_2->branchcode_id)->store;
+ $sritem_1->item->holdingbranch($srstage_2->branchcode_id)->store;
# StockRotationAdvance transfer added
- $transfer_request = $sritem_1->itemnumber->get_transfer;
+ $transfer_request = $sritem_1->item->get_transfer;
is($transfer_request->reason, 'StockrotationAdvance', "StockrotationAdvance transfer remains after reserve is met");
is($transfer_request->frombranch, $srstage_1->branchcode_id, "Origin correct.");
is($transfer_request->tobranch, $srstage_2->branchcode_id, "Target correct.");
# Arrive at new branch
$transfer_request->datearrived(dt_from_string())->store;
- $sritem_1->itemnumber->holdingbranch($srstage_2->branchcode_id)->store;
+ $sritem_1->item->holdingbranch($srstage_2->branchcode_id)->store;
+
+ # Checked out item, advanced to next stage, checkedout from next stage
+ # transfer should be generated, but not initiated
+ my $issue = $builder->build_object({
+ class => 'Koha::Checkouts',
+ value => {
+ branchcode => $srstage_1->branchcode_id,
+ itemnumber => $sritem_1->item->itemnumber,
+ returndate => undef
+ }
+ });
+ $sritem_1->item->holdingbranch($srstage_1->branchcode_id)->store;
+ ok($sritem_1->advance, "Advancement done.");
+ $transfer_request = $sritem_1->item->get_transfer;
+ is($transfer_request->frombranch, $srstage_1->branchcode_id, "Origin correct.");
+ is($transfer_request->tobranch, $srstage_1->branchcode_id, "Target correct.");
+ is($transfer_request->datesent, undef, "Transfer waiting to initiate until return.");
+
+ $issue->delete; #remove issue
+ $sritem_1->advance; #advance back to second stage
+ # Set arrived
+ $transfer_request->datearrived(dt_from_string())->store;
+ $sritem_1->item->holdingbranch($srstage_2->branchcode_id)->store;
+
$srstage_1->rota->cyclical(0)->store; # Set Rota to non-cyclical.
# Arrive at new branch
$transfer_request->datearrived(dt_from_string())->store;
- $sritem_1->itemnumber->holdingbranch($srstage_3->branchcode_id)->store;
+ $sritem_1->item->holdingbranch($srstage_3->branchcode_id)->store;
# Advance again, Remove from rota.
ok($sritem_1->advance, "Non-cyclical advance.");
}
);
$dbitem = Koha::StockRotationItems->find($sritem->{itemnumber_id});
- $dbitem->itemnumber->homebranch($dbitem->stage->branchcode_id)->store;
- $dbitem->itemnumber->holdingbranch($dbitem->stage->branchcode_id)->store;
+ $dbitem->item->homebranch($dbitem->stage->branchcode_id)->store;
+ $dbitem->item->holdingbranch($dbitem->stage->branchcode_id)->store;
is($dbitem->investigate->{reason}, 'initiation', "fresh item at stagebranch initiates.");
# Test item not at stagebranch with branchtransfer history ['repatriation']
$dbitem = Koha::StockRotationItems->find($sritem->{itemnumber_id});
my $dbtransfer = Koha::Item::Transfer->new({
'itemnumber' => $dbitem->itemnumber_id,
- 'frombranch' => $dbitem->itemnumber->homebranch,
- 'tobranch' => $dbitem->itemnumber->homebranch,
+ 'frombranch' => $dbitem->item->homebranch,
+ 'tobranch' => $dbitem->item->homebranch,
'datesent' => dt_from_string(),
'datearrived' => dt_from_string(),
'reason' => "StockrotationAdvance",
$dbitem = Koha::StockRotationItems->find($sritem->{itemnumber_id});
$dbtransfer = Koha::Item::Transfer->new({
'itemnumber' => $dbitem->itemnumber_id,
- 'frombranch' => $dbitem->itemnumber->homebranch,
+ 'frombranch' => $dbitem->item->homebranch,
'tobranch' => $dbitem->stage->branchcode_id,
'datesent' => dt_from_string(),
'datearrived' => dt_from_string(),
'reason' => "StockrotationAdvance",
})->store;
- $dbitem->itemnumber->homebranch($dbitem->stage->branchcode_id)->store;
- $dbitem->itemnumber->holdingbranch($dbitem->stage->branchcode_id)->store;
+ $dbitem->item->homebranch($dbitem->stage->branchcode_id)->store;
+ $dbitem->item->holdingbranch($dbitem->stage->branchcode_id)->store;
is($dbitem->investigate->{reason}, 'not-ready', "older item at stagebranch not-ready.");
# Test item due for advancement ['advancement']
my $arrived_duration = DateTime::Duration->new( days => 52);
$dbtransfer = Koha::Item::Transfer->new({
'itemnumber' => $dbitem->itemnumber_id,
- 'frombranch' => $dbitem->itemnumber->homebranch,
+ 'frombranch' => $dbitem->item->homebranch,
'tobranch' => $dbitem->stage->branchcode_id,
'datesent' => dt_from_string() - $sent_duration,
'datearrived' => dt_from_string() - $arrived_duration,
'reason' => "StockrotationAdvance",
})->store;
- $dbitem->itemnumber->homebranch($dbitem->stage->branchcode_id)->store;
- $dbitem->itemnumber->holdingbranch($dbitem->stage->branchcode_id)->store;
+ $dbitem->item->homebranch($dbitem->stage->branchcode_id)->store;
+ $dbitem->item->holdingbranch($dbitem->stage->branchcode_id)->store;
is($dbitem->investigate->{reason}, 'advancement',
"Item ready for advancement.");
$arrived_duration = DateTime::Duration->new( days => 52);
$dbtransfer = Koha::Item::Transfer->new({
'itemnumber' => $dbitem->itemnumber_id,
- 'frombranch' => $dbitem->itemnumber->homebranch,
+ 'frombranch' => $dbitem->item->homebranch,
'tobranch' => $dbitem->stage->branchcode_id,
'datesent' => dt_from_string() - $sent_duration,
'datearrived' => dt_from_string() - $arrived_duration,
'reason' => "StockrotationAdvance",
})->store;
- $dbitem->itemnumber->homebranch($dbitem->stage->branchcode_id)->store;
- $dbitem->itemnumber->holdingbranch($dbitem->stage->branchcode_id)->store;
+ $dbitem->item->homebranch($dbitem->stage->branchcode_id)->store;
+ $dbitem->item->holdingbranch($dbitem->stage->branchcode_id)->store;
is($dbitem->investigate->{reason}, 'in-demand',
"Item advances, but in-demand.");
$arrived_duration = DateTime::Duration->new( days => 52);
$dbtransfer = Koha::Item::Transfer->new({
'itemnumber' => $dbitem->itemnumber_id,
- 'frombranch' => $dbitem->itemnumber->homebranch,
+ 'frombranch' => $dbitem->item->homebranch,
'tobranch' => $dbitem->stage->branchcode_id,
'datesent' => dt_from_string() - $sent_duration,
'datearrived' => dt_from_string() - $arrived_duration,
});
my $dbitem = Koha::StockRotationItems->find($sritem->{itemnumber_id});
my $firstbranch = $dbitem->stage->branchcode_id;
- $dbitem->itemnumber->holdingbranch($firstbranch)->store;
+ $dbitem->item->holdingbranch($firstbranch)->store;
my $dbstage = $dbitem->stage;
$dbstage->position(1)->duration(50)->store; # Configure stage.
# Configure item
- $dbitem->itemnumber->holdingbranch($firstbranch)->store;
- $dbitem->itemnumber->homebranch($firstbranch)->store;
+ $dbitem->item->holdingbranch($firstbranch)->store;
+ $dbitem->item->homebranch($firstbranch)->store;
# Sanity check
is($dbitem->stage->stage_id, $dbstage->stage_id, "Stage sanity check.");
# Test an item in transfer, toggle cancels transfer and resets indemand.
ok($dbitem->advance, "Advancement done.");
$dbitem->get_from_storage;
- my $transfer = $dbitem->itemnumber->get_transfer;
+ my $transfer = $dbitem->item->get_transfer;
is(ref($transfer), 'Koha::Item::Transfer', 'Item set to in transfer as expected');
is($transfer->frombranch, $firstbranch, 'Transfer from set correctly');
is($transfer->tobranch, $secondbranch, 'Transfer to set correctly');
isnt($updated_transfer->datearrived, undef, 'Transfer datearrived set as expected');
is($dbitem->indemand, 0, "Item retains indemand as expected.");
is($dbitem->stage_id, $dbstage->id, 'Item stage reset as expected.');
- is($dbitem->itemnumber->homebranch, $firstbranch, 'Item homebranch reset as expected.');
+ is($dbitem->item->homebranch, $firstbranch, 'Item homebranch reset as expected.');
$schema->storage->txn_rollback;
};