Lines 18-24
Link Here
|
18 |
use Modern::Perl; |
18 |
use Modern::Perl; |
19 |
use utf8; |
19 |
use utf8; |
20 |
|
20 |
|
21 |
use Test::More tests => 48; |
21 |
use Test::More tests => 51; |
22 |
use Test::Exception; |
22 |
use Test::Exception; |
23 |
use Test::MockModule; |
23 |
use Test::MockModule; |
24 |
use Test::Deep qw( cmp_deeply ); |
24 |
use Test::Deep qw( cmp_deeply ); |
Lines 278-284
Koha::CirculationRules->set_rules(
Link Here
|
278 |
|
278 |
|
279 |
my ( $reused_itemnumber_1, $reused_itemnumber_2 ); |
279 |
my ( $reused_itemnumber_1, $reused_itemnumber_2 ); |
280 |
subtest "CanBookBeRenewed tests" => sub { |
280 |
subtest "CanBookBeRenewed tests" => sub { |
281 |
plan tests => 83; |
281 |
plan tests => 87; |
282 |
|
282 |
|
283 |
C4::Context->set_preference('ItemsDeniedRenewal',''); |
283 |
C4::Context->set_preference('ItemsDeniedRenewal',''); |
284 |
# Generate test biblio |
284 |
# Generate test biblio |
Lines 1251-1256
subtest "CanBookBeRenewed tests" => sub {
Link Here
|
1251 |
$item_3->itemcallnumber || '' ), |
1251 |
$item_3->itemcallnumber || '' ), |
1252 |
"Account line description must not contain 'Lost Items ', but be title, barcode, itemcallnumber" |
1252 |
"Account line description must not contain 'Lost Items ', but be title, barcode, itemcallnumber" |
1253 |
); |
1253 |
); |
|
|
1254 |
|
1255 |
# Recalls |
1256 |
t::lib::Mocks::mock_preference('UseRecalls', 1); |
1257 |
Koha::CirculationRules->set_rules({ |
1258 |
categorycode => undef, |
1259 |
branchcode => undef, |
1260 |
itemtype => undef, |
1261 |
rules => { |
1262 |
recalls_allowed => 10, |
1263 |
renewalsallowed => 5, |
1264 |
}, |
1265 |
}); |
1266 |
my $recall_borrower = $builder->build_object({ class => 'Koha::Patrons' }); |
1267 |
my $recall_biblio = $builder->build_object({ class => 'Koha::Biblios' }); |
1268 |
my $recall_item1 = $builder->build_object({ class => 'Koha::Items' }, { value => { biblionumber => $recall_biblio->biblionumber } }); |
1269 |
my $recall_item2 = $builder->build_object({ class => 'Koha::Items' }, { value => { biblionumber => $recall_biblio->biblionumber } }); |
1270 |
|
1271 |
AddIssue( $renewing_borrower, $recall_item1->barcode ); |
1272 |
|
1273 |
# item-level and this item: renewal not allowed |
1274 |
my $recall = Koha::Recall->new({ |
1275 |
biblionumber => $recall_item1->biblionumber, |
1276 |
itemnumber => $recall_item1->itemnumber, |
1277 |
borrowernumber => $recall_borrower->borrowernumber, |
1278 |
branchcode => $recall_borrower->branchcode, |
1279 |
item_level_recall => 1, |
1280 |
status => 'R', |
1281 |
})->store; |
1282 |
( $renewokay, $error ) = CanBookBeRenewed( $renewing_borrowernumber, $recall_item1->itemnumber ); |
1283 |
is( $error, 'recalled', 'Cannot renew item that has been recalled' ); |
1284 |
$recall->set_cancelled; |
1285 |
|
1286 |
# biblio-level requested recall: renewal not allowed |
1287 |
$recall = Koha::Recall->new({ |
1288 |
biblionumber => $recall_item1->biblionumber, |
1289 |
itemnumber => undef, |
1290 |
borrowernumber => $recall_borrower->borrowernumber, |
1291 |
branchcode => $recall_borrower->branchcode, |
1292 |
item_level_recall => 0, |
1293 |
status => 'R', |
1294 |
})->store; |
1295 |
( $renewokay, $error ) = CanBookBeRenewed( $renewing_borrowernumber, $recall_item1->itemnumber ); |
1296 |
is( $error, 'recalled', 'Cannot renew item if biblio is recalled and has no item allocated' ); |
1297 |
$recall->set_cancelled; |
1298 |
|
1299 |
# item-level and not this item: renewal allowed |
1300 |
$recall = Koha::Recall->new({ |
1301 |
biblionumber => $recall_item2->biblionumber, |
1302 |
itemnumber => $recall_item2->itemnumber, |
1303 |
borrowernumber => $recall_borrower->borrowernumber, |
1304 |
branchcode => $recall_borrower->branchcode, |
1305 |
item_level_recall => 1, |
1306 |
status => 'R', |
1307 |
})->store; |
1308 |
( $renewokay, $error ) = CanBookBeRenewed( $renewing_borrowernumber, $recall_item1->itemnumber ); |
1309 |
is( $renewokay, 1, 'Can renew item if item-level recall on biblio is not on this item' ); |
1310 |
$recall->set_cancelled; |
1311 |
|
1312 |
# biblio-level waiting recall: renewal allowed |
1313 |
$recall = Koha::Recall->new({ |
1314 |
biblionumber => $recall_item1->biblionumber, |
1315 |
itemnumber => undef, |
1316 |
borrowernumber => $recall_borrower->borrowernumber, |
1317 |
branchcode => $recall_borrower->branchcode, |
1318 |
item_level_recall => 0, |
1319 |
status => 'R', |
1320 |
})->store; |
1321 |
$recall->set_waiting({ item => $recall_item1 }); |
1322 |
( $renewokay, $error ) = CanBookBeRenewed( $renewing_borrowernumber, $recall_item1->itemnumber ); |
1323 |
is( $renewokay, 1, 'Can renew item if biblio-level recall has already been allocated an item' ); |
1324 |
$recall->set_cancelled; |
1254 |
}; |
1325 |
}; |
1255 |
|
1326 |
|
1256 |
subtest "GetUpcomingDueIssues" => sub { |
1327 |
subtest "GetUpcomingDueIssues" => sub { |
Lines 1731-1736
subtest 'AddIssue & AllowReturnToBranch' => sub {
Link Here
|
1731 |
# TODO t::lib::Mocks::mock_preference('AllowReturnToBranch', 'homeorholdingbranch'); |
1802 |
# TODO t::lib::Mocks::mock_preference('AllowReturnToBranch', 'homeorholdingbranch'); |
1732 |
}; |
1803 |
}; |
1733 |
|
1804 |
|
|
|
1805 |
subtest 'AddIssue | recalls' => sub { |
1806 |
plan tests => 3; |
1807 |
|
1808 |
t::lib::Mocks::mock_preference("UseRecalls", 1); |
1809 |
t::lib::Mocks::mock_preference("item-level_itypes", 1); |
1810 |
my $patron1 = $builder->build_object({ class => 'Koha::Patrons' }); |
1811 |
my $patron2 = $builder->build_object({ class => 'Koha::Patrons' }); |
1812 |
my $item = $builder->build_sample_item; |
1813 |
Koha::CirculationRules->set_rules({ |
1814 |
branchcode => undef, |
1815 |
itemtype => undef, |
1816 |
categorycode => undef, |
1817 |
rules => { |
1818 |
recalls_allowed => 10, |
1819 |
}, |
1820 |
}); |
1821 |
|
1822 |
# checking out item that they have recalled |
1823 |
my $recall1 = Koha::Recall->new({ |
1824 |
borrowernumber => $patron1->borrowernumber, |
1825 |
biblionumber => $item->biblionumber, |
1826 |
itemnumber => $item->itemnumber, |
1827 |
item_level_recall => 1, |
1828 |
branchcode => $patron1->branchcode, |
1829 |
status => 'R', |
1830 |
})->store; |
1831 |
AddIssue( $patron1->unblessed, $item->barcode, undef, undef, undef, undef, { recall_id => $recall1->recall_id } ); |
1832 |
$recall1 = Koha::Recalls->find( $recall1->recall_id ); |
1833 |
is( $recall1->finished, 1, 'Recall was fulfilled when patron checked out item' ); |
1834 |
AddReturn( $item->barcode, $item->homebranch ); |
1835 |
|
1836 |
# this item is has a recall request. cancel recall |
1837 |
my $recall2 = Koha::Recall->new({ |
1838 |
borrowernumber => $patron2->borrowernumber, |
1839 |
biblionumber => $item->biblionumber, |
1840 |
itemnumber => $item->itemnumber, |
1841 |
item_level_recall => 1, |
1842 |
branchcode => $patron2->branchcode, |
1843 |
status => 'R', |
1844 |
})->store; |
1845 |
AddIssue( $patron1->unblessed, $item->barcode, undef, undef, undef, undef, { recall_id => $recall2->recall_id, cancel_recall => 'cancel' } ); |
1846 |
$recall2 = Koha::Recalls->find( $recall2->recall_id ); |
1847 |
is( $recall2->cancelled, 1, 'Recall was cancelled when patron checked out item' ); |
1848 |
AddReturn( $item->barcode, $item->homebranch ); |
1849 |
|
1850 |
# this item is waiting to fulfill a recall. revert recall |
1851 |
my $recall3 = Koha::Recall->new({ |
1852 |
borrowernumber => $patron2->borrowernumber, |
1853 |
biblionumber => $item->biblionumber, |
1854 |
itemnumber => $item->itemnumber, |
1855 |
item_level_recall => 1, |
1856 |
branchcode => $patron2->branchcode, |
1857 |
status => 'R', |
1858 |
})->store; |
1859 |
$recall3->set_waiting; |
1860 |
AddIssue( $patron1->unblessed, $item->barcode, undef, undef, undef, undef, { recall_id => $recall3->recall_id, cancel_recall => 'revert' } ); |
1861 |
$recall3 = Koha::Recalls->find( $recall3->recall_id ); |
1862 |
is( $recall3->requested, 1, 'Recall was reverted from waiting when patron checked out item' ); |
1863 |
AddReturn( $item->barcode, $item->homebranch ); |
1864 |
}; |
1865 |
|
1866 |
|
1734 |
subtest 'CanBookBeIssued + Koha::Patron->is_debarred|has_overdues' => sub { |
1867 |
subtest 'CanBookBeIssued + Koha::Patron->is_debarred|has_overdues' => sub { |
1735 |
plan tests => 8; |
1868 |
plan tests => 8; |
1736 |
|
1869 |
|
Lines 3151-3156
subtest 'CanBookBeIssued | notforloan' => sub {
Link Here
|
3151 |
# TODO test with AllowNotForLoanOverride = 1 |
3284 |
# TODO test with AllowNotForLoanOverride = 1 |
3152 |
}; |
3285 |
}; |
3153 |
|
3286 |
|
|
|
3287 |
subtest 'CanBookBeIssued | recalls' => sub { |
3288 |
plan tests => 2; |
3289 |
|
3290 |
t::lib::Mocks::mock_preference("UseRecalls", 1); |
3291 |
t::lib::Mocks::mock_preference("item-level_itypes", 1); |
3292 |
my $patron1 = $builder->build_object({ class => 'Koha::Patrons' }); |
3293 |
my $patron2 = $builder->build_object({ class => 'Koha::Patrons' }); |
3294 |
my $item = $builder->build_sample_item; |
3295 |
Koha::CirculationRules->set_rules({ |
3296 |
branchcode => undef, |
3297 |
itemtype => undef, |
3298 |
categorycode => undef, |
3299 |
rules => { |
3300 |
recalls_allowed => 10, |
3301 |
}, |
3302 |
}); |
3303 |
|
3304 |
# item-level recall |
3305 |
my $recall = Koha::Recall->new({ |
3306 |
borrowernumber => $patron1->borrowernumber, |
3307 |
biblionumber => $item->biblionumber, |
3308 |
itemnumber => $item->itemnumber, |
3309 |
item_level_recall => 1, |
3310 |
branchcode => $patron1->branchcode, |
3311 |
status => 'R', |
3312 |
})->store; |
3313 |
|
3314 |
my ( $issuingimpossible, $needsconfirmation ) = CanBookBeIssued( $patron2, $item->barcode, undef, undef, undef, undef ); |
3315 |
is( $needsconfirmation->{RECALLED}->recall_id, $recall->recall_id, "Another patron has placed an item-level recall on this item" ); |
3316 |
|
3317 |
$recall->set_cancelled; |
3318 |
|
3319 |
# biblio-level recall |
3320 |
$recall = Koha::Recall->new({ |
3321 |
borrowernumber => $patron1->borrowernumber, |
3322 |
biblionumber => $item->biblionumber, |
3323 |
itemnumber => undef, |
3324 |
item_level_recall => 0, |
3325 |
branchcode => $patron1->branchcode, |
3326 |
status => 'R', |
3327 |
})->store; |
3328 |
|
3329 |
( $issuingimpossible, $needsconfirmation ) = CanBookBeIssued( $patron2, $item->barcode, undef, undef, undef, undef ); |
3330 |
is( $needsconfirmation->{RECALLED}->recall_id, $recall->recall_id, "Another patron has placed a biblio-level recall and this item is eligible to fill it" ); |
3331 |
|
3332 |
$recall->set_cancelled; |
3333 |
}; |
3334 |
|
3154 |
subtest 'AddReturn should clear items.onloan for unissued items' => sub { |
3335 |
subtest 'AddReturn should clear items.onloan for unissued items' => sub { |
3155 |
plan tests => 1; |
3336 |
plan tests => 1; |
3156 |
|
3337 |
|
Lines 3166-3171
subtest 'AddReturn should clear items.onloan for unissued items' => sub {
Link Here
|
3166 |
is( $item->onloan, undef, 'AddReturn did clear items.onloan' ); |
3347 |
is( $item->onloan, undef, 'AddReturn did clear items.onloan' ); |
3167 |
}; |
3348 |
}; |
3168 |
|
3349 |
|
|
|
3350 |
subtest 'AddReturn | recalls' => sub { |
3351 |
plan tests => 3; |
3352 |
|
3353 |
t::lib::Mocks::mock_preference("UseRecalls", 1); |
3354 |
t::lib::Mocks::mock_preference("item-level_itypes", 1); |
3355 |
my $patron1 = $builder->build_object({ class => 'Koha::Patrons' }); |
3356 |
my $patron2 = $builder->build_object({ class => 'Koha::Patrons' }); |
3357 |
my $item1 = $builder->build_sample_item; |
3358 |
Koha::CirculationRules->set_rules({ |
3359 |
branchcode => undef, |
3360 |
itemtype => undef, |
3361 |
categorycode => undef, |
3362 |
rules => { |
3363 |
recalls_allowed => 10, |
3364 |
}, |
3365 |
}); |
3366 |
|
3367 |
# this item can fill a recall with pickup at this branch |
3368 |
AddIssue( $patron1->unblessed, $item1->barcode ); |
3369 |
my $recall1 = Koha::Recall->new({ |
3370 |
borrowernumber => $patron2->borrowernumber, |
3371 |
biblionumber => $item1->biblionumber, |
3372 |
itemnumber => $item1->itemnumber, |
3373 |
item_level_recall => 1, |
3374 |
branchcode => $item1->homebranch, |
3375 |
status => 'R', |
3376 |
})->store; |
3377 |
my ( $doreturn, $messages, $iteminfo, $borrowerinfo ) = AddReturn( $item1->barcode, $item1->homebranch ); |
3378 |
is( $messages->{RecallFound}->recall_id, $recall1->recall_id, "Recall found" ); |
3379 |
$recall1->set_cancelled; |
3380 |
|
3381 |
# this item can fill a recall but needs transfer |
3382 |
AddIssue( $patron1->unblessed, $item1->barcode ); |
3383 |
$recall1 = Koha::Recall->new({ |
3384 |
borrowernumber => $patron2->borrowernumber, |
3385 |
biblionumber => $item1->biblionumber, |
3386 |
itemnumber => $item1->itemnumber, |
3387 |
item_level_recall => 1, |
3388 |
branchcode => $patron2->branchcode, |
3389 |
status => 'R', |
3390 |
})->store; |
3391 |
( $doreturn, $messages, $iteminfo, $borrowerinfo ) = AddReturn( $item1->barcode, $item1->homebranch ); |
3392 |
is( $messages->{RecallNeedsTransfer}, $item1->homebranch, "Recall requiring transfer found" ); |
3393 |
$recall1->set_cancelled; |
3394 |
|
3395 |
# this item is already in transit, do not ask to transfer |
3396 |
AddIssue( $patron1->unblessed, $item1->barcode ); |
3397 |
$recall1 = Koha::Recall->new({ |
3398 |
borrowernumber => $patron2->borrowernumber, |
3399 |
biblionumber => $item1->biblionumber, |
3400 |
itemnumber => $item1->itemnumber, |
3401 |
item_level_recall => 1, |
3402 |
branchcode => $patron2->branchcode, |
3403 |
status => 'R', |
3404 |
})->store; |
3405 |
$recall1->start_transfer; |
3406 |
( $doreturn, $messages, $iteminfo, $borrowerinfo ) = AddReturn( $item1->barcode, $patron2->branchcode ); |
3407 |
is( $messages->{TransferredRecall}->recall_id, $recall1->recall_id, "In transit recall found" ); |
3408 |
$recall1->set_cancelled; |
3409 |
}; |
3169 |
|
3410 |
|
3170 |
subtest 'AddRenewal and AddIssuingCharge tests' => sub { |
3411 |
subtest 'AddRenewal and AddIssuingCharge tests' => sub { |
3171 |
|
3412 |
|