|
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 => 53; |
21 |
use Test::More tests => 56; |
| 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 329-335
subtest "GetIssuingCharges tests" => sub {
Link Here
|
| 329 |
|
329 |
|
| 330 |
my ( $reused_itemnumber_1, $reused_itemnumber_2 ); |
330 |
my ( $reused_itemnumber_1, $reused_itemnumber_2 ); |
| 331 |
subtest "CanBookBeRenewed tests" => sub { |
331 |
subtest "CanBookBeRenewed tests" => sub { |
| 332 |
plan tests => 95; |
332 |
plan tests => 99; |
| 333 |
|
333 |
|
| 334 |
C4::Context->set_preference('ItemsDeniedRenewal',''); |
334 |
C4::Context->set_preference('ItemsDeniedRenewal',''); |
| 335 |
# Generate test biblio |
335 |
# Generate test biblio |
|
Lines 1355-1360
subtest "CanBookBeRenewed tests" => sub {
Link Here
|
| 1355 |
$item_3->itemcallnumber || '' ), |
1355 |
$item_3->itemcallnumber || '' ), |
| 1356 |
"Account line description must not contain 'Lost Items ', but be title, barcode, itemcallnumber" |
1356 |
"Account line description must not contain 'Lost Items ', but be title, barcode, itemcallnumber" |
| 1357 |
); |
1357 |
); |
|
|
1358 |
|
| 1359 |
# Recalls |
| 1360 |
t::lib::Mocks::mock_preference('UseRecalls', 1); |
| 1361 |
Koha::CirculationRules->set_rules({ |
| 1362 |
categorycode => undef, |
| 1363 |
branchcode => undef, |
| 1364 |
itemtype => undef, |
| 1365 |
rules => { |
| 1366 |
recalls_allowed => 10, |
| 1367 |
renewalsallowed => 5, |
| 1368 |
}, |
| 1369 |
}); |
| 1370 |
my $recall_borrower = $builder->build_object({ class => 'Koha::Patrons' }); |
| 1371 |
my $recall_biblio = $builder->build_object({ class => 'Koha::Biblios' }); |
| 1372 |
my $recall_item1 = $builder->build_object({ class => 'Koha::Items' }, { value => { biblionumber => $recall_biblio->biblionumber } }); |
| 1373 |
my $recall_item2 = $builder->build_object({ class => 'Koha::Items' }, { value => { biblionumber => $recall_biblio->biblionumber } }); |
| 1374 |
|
| 1375 |
AddIssue( $renewing_borrower, $recall_item1->barcode ); |
| 1376 |
|
| 1377 |
# item-level and this item: renewal not allowed |
| 1378 |
my $recall = Koha::Recall->new({ |
| 1379 |
biblionumber => $recall_item1->biblionumber, |
| 1380 |
itemnumber => $recall_item1->itemnumber, |
| 1381 |
borrowernumber => $recall_borrower->borrowernumber, |
| 1382 |
branchcode => $recall_borrower->branchcode, |
| 1383 |
item_level_recall => 1, |
| 1384 |
status => 'R', |
| 1385 |
})->store; |
| 1386 |
( $renewokay, $error ) = CanBookBeRenewed( $renewing_borrowernumber, $recall_item1->itemnumber ); |
| 1387 |
is( $error, 'recalled', 'Cannot renew item that has been recalled' ); |
| 1388 |
$recall->set_cancelled; |
| 1389 |
|
| 1390 |
# biblio-level requested recall: renewal not allowed |
| 1391 |
$recall = Koha::Recall->new({ |
| 1392 |
biblionumber => $recall_item1->biblionumber, |
| 1393 |
itemnumber => undef, |
| 1394 |
borrowernumber => $recall_borrower->borrowernumber, |
| 1395 |
branchcode => $recall_borrower->branchcode, |
| 1396 |
item_level_recall => 0, |
| 1397 |
status => 'R', |
| 1398 |
})->store; |
| 1399 |
( $renewokay, $error ) = CanBookBeRenewed( $renewing_borrowernumber, $recall_item1->itemnumber ); |
| 1400 |
is( $error, 'recalled', 'Cannot renew item if biblio is recalled and has no item allocated' ); |
| 1401 |
$recall->set_cancelled; |
| 1402 |
|
| 1403 |
# item-level and not this item: renewal allowed |
| 1404 |
$recall = Koha::Recall->new({ |
| 1405 |
biblionumber => $recall_item2->biblionumber, |
| 1406 |
itemnumber => $recall_item2->itemnumber, |
| 1407 |
borrowernumber => $recall_borrower->borrowernumber, |
| 1408 |
branchcode => $recall_borrower->branchcode, |
| 1409 |
item_level_recall => 1, |
| 1410 |
status => 'R', |
| 1411 |
})->store; |
| 1412 |
( $renewokay, $error ) = CanBookBeRenewed( $renewing_borrowernumber, $recall_item1->itemnumber ); |
| 1413 |
is( $renewokay, 1, 'Can renew item if item-level recall on biblio is not on this item' ); |
| 1414 |
$recall->set_cancelled; |
| 1415 |
|
| 1416 |
# biblio-level waiting recall: renewal allowed |
| 1417 |
$recall = Koha::Recall->new({ |
| 1418 |
biblionumber => $recall_item1->biblionumber, |
| 1419 |
itemnumber => undef, |
| 1420 |
borrowernumber => $recall_borrower->borrowernumber, |
| 1421 |
branchcode => $recall_borrower->branchcode, |
| 1422 |
item_level_recall => 0, |
| 1423 |
status => 'R', |
| 1424 |
})->store; |
| 1425 |
$recall->set_waiting({ item => $recall_item1 }); |
| 1426 |
( $renewokay, $error ) = CanBookBeRenewed( $renewing_borrowernumber, $recall_item1->itemnumber ); |
| 1427 |
is( $renewokay, 1, 'Can renew item if biblio-level recall has already been allocated an item' ); |
| 1428 |
$recall->set_cancelled; |
| 1358 |
}; |
1429 |
}; |
| 1359 |
|
1430 |
|
| 1360 |
subtest "GetUpcomingDueIssues" => sub { |
1431 |
subtest "GetUpcomingDueIssues" => sub { |
|
Lines 1835-1840
subtest 'AddIssue & AllowReturnToBranch' => sub {
Link Here
|
| 1835 |
# TODO t::lib::Mocks::mock_preference('AllowReturnToBranch', 'homeorholdingbranch'); |
1906 |
# TODO t::lib::Mocks::mock_preference('AllowReturnToBranch', 'homeorholdingbranch'); |
| 1836 |
}; |
1907 |
}; |
| 1837 |
|
1908 |
|
|
|
1909 |
subtest 'AddIssue | recalls' => sub { |
| 1910 |
plan tests => 3; |
| 1911 |
|
| 1912 |
t::lib::Mocks::mock_preference("UseRecalls", 1); |
| 1913 |
t::lib::Mocks::mock_preference("item-level_itypes", 1); |
| 1914 |
my $patron1 = $builder->build_object({ class => 'Koha::Patrons' }); |
| 1915 |
my $patron2 = $builder->build_object({ class => 'Koha::Patrons' }); |
| 1916 |
my $item = $builder->build_sample_item; |
| 1917 |
Koha::CirculationRules->set_rules({ |
| 1918 |
branchcode => undef, |
| 1919 |
itemtype => undef, |
| 1920 |
categorycode => undef, |
| 1921 |
rules => { |
| 1922 |
recalls_allowed => 10, |
| 1923 |
}, |
| 1924 |
}); |
| 1925 |
|
| 1926 |
# checking out item that they have recalled |
| 1927 |
my $recall1 = Koha::Recall->new({ |
| 1928 |
borrowernumber => $patron1->borrowernumber, |
| 1929 |
biblionumber => $item->biblionumber, |
| 1930 |
itemnumber => $item->itemnumber, |
| 1931 |
item_level_recall => 1, |
| 1932 |
branchcode => $patron1->branchcode, |
| 1933 |
status => 'R', |
| 1934 |
})->store; |
| 1935 |
AddIssue( $patron1->unblessed, $item->barcode, undef, undef, undef, undef, { recall_id => $recall1->recall_id } ); |
| 1936 |
$recall1 = Koha::Recalls->find( $recall1->recall_id ); |
| 1937 |
is( $recall1->finished, 1, 'Recall was fulfilled when patron checked out item' ); |
| 1938 |
AddReturn( $item->barcode, $item->homebranch ); |
| 1939 |
|
| 1940 |
# this item is has a recall request. cancel recall |
| 1941 |
my $recall2 = Koha::Recall->new({ |
| 1942 |
borrowernumber => $patron2->borrowernumber, |
| 1943 |
biblionumber => $item->biblionumber, |
| 1944 |
itemnumber => $item->itemnumber, |
| 1945 |
item_level_recall => 1, |
| 1946 |
branchcode => $patron2->branchcode, |
| 1947 |
status => 'R', |
| 1948 |
})->store; |
| 1949 |
AddIssue( $patron1->unblessed, $item->barcode, undef, undef, undef, undef, { recall_id => $recall2->recall_id, cancel_recall => 'cancel' } ); |
| 1950 |
$recall2 = Koha::Recalls->find( $recall2->recall_id ); |
| 1951 |
is( $recall2->cancelled, 1, 'Recall was cancelled when patron checked out item' ); |
| 1952 |
AddReturn( $item->barcode, $item->homebranch ); |
| 1953 |
|
| 1954 |
# this item is waiting to fulfill a recall. revert recall |
| 1955 |
my $recall3 = Koha::Recall->new({ |
| 1956 |
borrowernumber => $patron2->borrowernumber, |
| 1957 |
biblionumber => $item->biblionumber, |
| 1958 |
itemnumber => $item->itemnumber, |
| 1959 |
item_level_recall => 1, |
| 1960 |
branchcode => $patron2->branchcode, |
| 1961 |
status => 'R', |
| 1962 |
})->store; |
| 1963 |
$recall3->set_waiting; |
| 1964 |
AddIssue( $patron1->unblessed, $item->barcode, undef, undef, undef, undef, { recall_id => $recall3->recall_id, cancel_recall => 'revert' } ); |
| 1965 |
$recall3 = Koha::Recalls->find( $recall3->recall_id ); |
| 1966 |
is( $recall3->requested, 1, 'Recall was reverted from waiting when patron checked out item' ); |
| 1967 |
AddReturn( $item->barcode, $item->homebranch ); |
| 1968 |
}; |
| 1969 |
|
| 1970 |
|
| 1838 |
subtest 'CanBookBeIssued + Koha::Patron->is_debarred|has_overdues' => sub { |
1971 |
subtest 'CanBookBeIssued + Koha::Patron->is_debarred|has_overdues' => sub { |
| 1839 |
plan tests => 8; |
1972 |
plan tests => 8; |
| 1840 |
|
1973 |
|
|
Lines 3739-3744
subtest 'CanBookBeIssued | notforloan' => sub {
Link Here
|
| 3739 |
# TODO test with AllowNotForLoanOverride = 1 |
3872 |
# TODO test with AllowNotForLoanOverride = 1 |
| 3740 |
}; |
3873 |
}; |
| 3741 |
|
3874 |
|
|
|
3875 |
subtest 'CanBookBeIssued | recalls' => sub { |
| 3876 |
plan tests => 3; |
| 3877 |
|
| 3878 |
t::lib::Mocks::mock_preference("UseRecalls", 1); |
| 3879 |
t::lib::Mocks::mock_preference("item-level_itypes", 1); |
| 3880 |
my $patron1 = $builder->build_object({ class => 'Koha::Patrons' }); |
| 3881 |
my $patron2 = $builder->build_object({ class => 'Koha::Patrons' }); |
| 3882 |
my $item = $builder->build_sample_item; |
| 3883 |
Koha::CirculationRules->set_rules({ |
| 3884 |
branchcode => undef, |
| 3885 |
itemtype => undef, |
| 3886 |
categorycode => undef, |
| 3887 |
rules => { |
| 3888 |
recalls_allowed => 10, |
| 3889 |
}, |
| 3890 |
}); |
| 3891 |
|
| 3892 |
# item-level recall |
| 3893 |
my $recall = Koha::Recall->new({ |
| 3894 |
borrowernumber => $patron1->borrowernumber, |
| 3895 |
biblionumber => $item->biblionumber, |
| 3896 |
itemnumber => $item->itemnumber, |
| 3897 |
item_level_recall => 1, |
| 3898 |
branchcode => $patron1->branchcode, |
| 3899 |
status => 'R', |
| 3900 |
})->store; |
| 3901 |
|
| 3902 |
my ( $issuingimpossible, $needsconfirmation ) = CanBookBeIssued( $patron2, $item->barcode, undef, undef, undef, undef ); |
| 3903 |
is( $needsconfirmation->{RECALLED}->recall_id, $recall->recall_id, "Another patron has placed an item-level recall on this item" ); |
| 3904 |
|
| 3905 |
$recall->set_cancelled; |
| 3906 |
|
| 3907 |
# biblio-level recall |
| 3908 |
$recall = Koha::Recall->new({ |
| 3909 |
borrowernumber => $patron1->borrowernumber, |
| 3910 |
biblionumber => $item->biblionumber, |
| 3911 |
itemnumber => undef, |
| 3912 |
item_level_recall => 0, |
| 3913 |
branchcode => $patron1->branchcode, |
| 3914 |
status => 'R', |
| 3915 |
})->store; |
| 3916 |
|
| 3917 |
( $issuingimpossible, $needsconfirmation ) = CanBookBeIssued( $patron2, $item->barcode, undef, undef, undef, undef ); |
| 3918 |
is( $needsconfirmation->{RECALLED}->recall_id, $recall->recall_id, "Another patron has placed a biblio-level recall and this item is eligible to fill it" ); |
| 3919 |
|
| 3920 |
$recall->set_cancelled; |
| 3921 |
|
| 3922 |
# biblio-level recall |
| 3923 |
$recall = Koha::Recall->new({ |
| 3924 |
borrowernumber => $patron1->borrowernumber, |
| 3925 |
biblionumber => $item->biblionumber, |
| 3926 |
itemnumber => undef, |
| 3927 |
item_level_recall => 0, |
| 3928 |
branchcode => $patron1->branchcode, |
| 3929 |
status => 'R', |
| 3930 |
})->store; |
| 3931 |
$recall->set_waiting({ item => $item, expirationdate => dt_from_string() }); |
| 3932 |
|
| 3933 |
my ( undef, undef, undef, $messages ) = CanBookBeIssued( $patron1, $item->barcode, undef, undef, undef, undef ); |
| 3934 |
is( $messages->{RECALLED}, $recall->recall_id, "This book can be issued by this patron and they have placed a recall" ); |
| 3935 |
|
| 3936 |
$recall->set_cancelled; |
| 3937 |
}; |
| 3938 |
|
| 3742 |
subtest 'AddReturn should clear items.onloan for unissued items' => sub { |
3939 |
subtest 'AddReturn should clear items.onloan for unissued items' => sub { |
| 3743 |
plan tests => 1; |
3940 |
plan tests => 1; |
| 3744 |
|
3941 |
|
|
Lines 3754-3759
subtest 'AddReturn should clear items.onloan for unissued items' => sub {
Link Here
|
| 3754 |
is( $item->onloan, undef, 'AddReturn did clear items.onloan' ); |
3951 |
is( $item->onloan, undef, 'AddReturn did clear items.onloan' ); |
| 3755 |
}; |
3952 |
}; |
| 3756 |
|
3953 |
|
|
|
3954 |
subtest 'AddReturn | recalls' => sub { |
| 3955 |
plan tests => 3; |
| 3956 |
|
| 3957 |
t::lib::Mocks::mock_preference("UseRecalls", 1); |
| 3958 |
t::lib::Mocks::mock_preference("item-level_itypes", 1); |
| 3959 |
my $patron1 = $builder->build_object({ class => 'Koha::Patrons' }); |
| 3960 |
my $patron2 = $builder->build_object({ class => 'Koha::Patrons' }); |
| 3961 |
my $item1 = $builder->build_sample_item; |
| 3962 |
Koha::CirculationRules->set_rules({ |
| 3963 |
branchcode => undef, |
| 3964 |
itemtype => undef, |
| 3965 |
categorycode => undef, |
| 3966 |
rules => { |
| 3967 |
recalls_allowed => 10, |
| 3968 |
}, |
| 3969 |
}); |
| 3970 |
|
| 3971 |
# this item can fill a recall with pickup at this branch |
| 3972 |
AddIssue( $patron1->unblessed, $item1->barcode ); |
| 3973 |
my $recall1 = Koha::Recall->new({ |
| 3974 |
borrowernumber => $patron2->borrowernumber, |
| 3975 |
biblionumber => $item1->biblionumber, |
| 3976 |
itemnumber => $item1->itemnumber, |
| 3977 |
item_level_recall => 1, |
| 3978 |
branchcode => $item1->homebranch, |
| 3979 |
status => 'R', |
| 3980 |
})->store; |
| 3981 |
my ( $doreturn, $messages, $iteminfo, $borrowerinfo ) = AddReturn( $item1->barcode, $item1->homebranch ); |
| 3982 |
is( $messages->{RecallFound}->recall_id, $recall1->recall_id, "Recall found" ); |
| 3983 |
$recall1->set_cancelled; |
| 3984 |
|
| 3985 |
# this item can fill a recall but needs transfer |
| 3986 |
AddIssue( $patron1->unblessed, $item1->barcode ); |
| 3987 |
$recall1 = Koha::Recall->new({ |
| 3988 |
borrowernumber => $patron2->borrowernumber, |
| 3989 |
biblionumber => $item1->biblionumber, |
| 3990 |
itemnumber => $item1->itemnumber, |
| 3991 |
item_level_recall => 1, |
| 3992 |
branchcode => $patron2->branchcode, |
| 3993 |
status => 'R', |
| 3994 |
})->store; |
| 3995 |
( $doreturn, $messages, $iteminfo, $borrowerinfo ) = AddReturn( $item1->barcode, $item1->homebranch ); |
| 3996 |
is( $messages->{RecallNeedsTransfer}, $item1->homebranch, "Recall requiring transfer found" ); |
| 3997 |
$recall1->set_cancelled; |
| 3998 |
|
| 3999 |
# this item is already in transit, do not ask to transfer |
| 4000 |
AddIssue( $patron1->unblessed, $item1->barcode ); |
| 4001 |
$recall1 = Koha::Recall->new({ |
| 4002 |
borrowernumber => $patron2->borrowernumber, |
| 4003 |
biblionumber => $item1->biblionumber, |
| 4004 |
itemnumber => $item1->itemnumber, |
| 4005 |
item_level_recall => 1, |
| 4006 |
branchcode => $patron2->branchcode, |
| 4007 |
status => 'R', |
| 4008 |
})->store; |
| 4009 |
$recall1->start_transfer; |
| 4010 |
( $doreturn, $messages, $iteminfo, $borrowerinfo ) = AddReturn( $item1->barcode, $patron2->branchcode ); |
| 4011 |
is( $messages->{TransferredRecall}->recall_id, $recall1->recall_id, "In transit recall found" ); |
| 4012 |
$recall1->set_cancelled; |
| 4013 |
}; |
| 3757 |
|
4014 |
|
| 3758 |
subtest 'AddRenewal and AddIssuingCharge tests' => sub { |
4015 |
subtest 'AddRenewal and AddIssuingCharge tests' => sub { |
| 3759 |
|
4016 |
|