Lines 6883-6888
subtest 'AddIssue records staff who checked out item if appropriate' => sub {
Link Here
|
6883 |
); |
6883 |
); |
6884 |
}; |
6884 |
}; |
6885 |
|
6885 |
|
|
|
6886 |
subtest 'AddIssue | booking status handling' => sub { |
6887 |
plan tests => 5; |
6888 |
|
6889 |
my $schema = Koha::Database->schema; |
6890 |
$schema->storage->txn_begin; |
6891 |
|
6892 |
my $patron1 = $builder->build_object( { class => 'Koha::Patrons' } ); |
6893 |
my $patron2 = $builder->build_object( { class => 'Koha::Patrons' } ); |
6894 |
my $pickup_library = $builder->build_object( { class => 'Koha::Libraries' } ); |
6895 |
my $item = $builder->build_sample_item( { bookable => 1 } ); |
6896 |
|
6897 |
# Test 1: Patron checks out item with their own booking - should mark as completed |
6898 |
my $booking1 = Koha::Booking->new( |
6899 |
{ |
6900 |
patron_id => $patron1->borrowernumber, |
6901 |
pickup_library_id => $pickup_library->branchcode, |
6902 |
item_id => $item->itemnumber, |
6903 |
biblio_id => $item->biblio->biblionumber, |
6904 |
start_date => dt_from_string(), |
6905 |
end_date => dt_from_string()->add( days => 7 ), |
6906 |
} |
6907 |
)->store(); |
6908 |
|
6909 |
my $issue1 = AddIssue( $patron1, $item->barcode, dt_from_string()->add( days => 7 ) ); |
6910 |
$booking1->discard_changes(); |
6911 |
|
6912 |
is( $booking1->status, 'completed', "Patron's own booking marked as completed when item checked out" ); |
6913 |
|
6914 |
# Clean up for next test |
6915 |
AddReturn( $item->barcode, $pickup_library->branchcode ); |
6916 |
$booking1->delete(); |
6917 |
|
6918 |
# Test 2: Another patron checks out item with different patron's booking overlapping actual booking period - should cancel booking |
6919 |
my $booking2 = Koha::Booking->new( |
6920 |
{ |
6921 |
patron_id => $patron1->borrowernumber, |
6922 |
pickup_library_id => $pickup_library->branchcode, |
6923 |
item_id => $item->itemnumber, |
6924 |
biblio_id => $item->biblio->biblionumber, |
6925 |
start_date => dt_from_string()->add( days => 1 ), |
6926 |
end_date => dt_from_string()->add( days => 5 ), |
6927 |
} |
6928 |
)->store(); |
6929 |
|
6930 |
my $issue2 = AddIssue( $patron2, $item->barcode, dt_from_string()->add( days => 3 ) ); |
6931 |
$booking2->discard_changes(); |
6932 |
|
6933 |
is( |
6934 |
$booking2->status, 'cancelled', |
6935 |
"Another patron's booking cancelled when checkout overlaps actual booking period" |
6936 |
); |
6937 |
|
6938 |
# Clean up for next test |
6939 |
AddReturn( $item->barcode, $pickup_library->branchcode ); |
6940 |
$booking2->delete(); |
6941 |
|
6942 |
# Test 3: Another patron checks out item - checkout period only in lead period - should NOT cancel booking |
6943 |
# First set up a lead period rule |
6944 |
Koha::CirculationRules->set_rules( |
6945 |
{ |
6946 |
branchcode => '*', |
6947 |
itemtype => $item->effective_itemtype, |
6948 |
rules => { |
6949 |
bookings_lead_period => 3, |
6950 |
}, |
6951 |
} |
6952 |
); |
6953 |
|
6954 |
my $booking3 = Koha::Booking->new( |
6955 |
{ |
6956 |
patron_id => $patron1->borrowernumber, |
6957 |
pickup_library_id => $pickup_library->branchcode, |
6958 |
item_id => $item->itemnumber, |
6959 |
biblio_id => $item->biblio->biblionumber, |
6960 |
start_date => dt_from_string()->add( days => 5 ), |
6961 |
end_date => dt_from_string()->add( days => 10 ), |
6962 |
} |
6963 |
)->store(); |
6964 |
|
6965 |
# Issue that would return before booking starts (only conflicts due to lead period) |
6966 |
my $issue3 = AddIssue( $patron2, $item->barcode, dt_from_string()->add( days => 4 ) ); |
6967 |
$booking3->discard_changes(); |
6968 |
|
6969 |
is( |
6970 |
$booking3->status, 'new', |
6971 |
"Another patron's booking NOT cancelled when checkout only conflicts with lead period" |
6972 |
); |
6973 |
|
6974 |
# Clean up for next test |
6975 |
AddReturn( $item->barcode, $pickup_library->branchcode ); |
6976 |
$booking3->delete(); |
6977 |
|
6978 |
# Test 4: Edge case - checkout period starts before booking and ends after booking (encompasses booking) |
6979 |
my $booking4 = Koha::Booking->new( |
6980 |
{ |
6981 |
patron_id => $patron1->borrowernumber, |
6982 |
pickup_library_id => $pickup_library->branchcode, |
6983 |
item_id => $item->itemnumber, |
6984 |
biblio_id => $item->biblio->biblionumber, |
6985 |
start_date => dt_from_string()->add( days => 2 ), |
6986 |
end_date => dt_from_string()->add( days => 4 ), |
6987 |
} |
6988 |
)->store(); |
6989 |
|
6990 |
# Issue that encompasses the entire booking period |
6991 |
my $issue4 = AddIssue( $patron2, $item->barcode, dt_from_string()->add( days => 6 ) ); |
6992 |
$booking4->discard_changes(); |
6993 |
|
6994 |
is( |
6995 |
$booking4->status, 'cancelled', |
6996 |
"Another patron's booking cancelled when checkout encompasses entire booking period" |
6997 |
); |
6998 |
|
6999 |
# Clean up for next test |
7000 |
AddReturn( $item->barcode, $pickup_library->branchcode ); |
7001 |
$booking4->delete(); |
7002 |
|
7003 |
# Test 5: No booking found - should not cause errors |
7004 |
my $issue5 = AddIssue( $patron1, $item->barcode, dt_from_string()->add( days => 7 ) ); |
7005 |
|
7006 |
ok( $issue5, "AddIssue works normally when no booking is found" ); |
7007 |
|
7008 |
$schema->storage->txn_rollback; |
7009 |
}; |
7010 |
|
6886 |
subtest "Item's onloan value should be set if checked out item is checked out to a different patron" => sub { |
7011 |
subtest "Item's onloan value should be set if checked out item is checked out to a different patron" => sub { |
6887 |
plan tests => 2; |
7012 |
plan tests => 2; |
6888 |
|
7013 |
|
6889 |
- |
|
|