use Modern::Perl;
-use Test::More tests => 8;
+use Test::More tests => 10;
-use C4::Circulation;
+use C4::Circulation qw( MarkIssueReturned AddReturn );
use Koha::Checkouts;
use Koha::Database;
use Koha::DateUtils qw( dt_from_string );
use t::lib::TestBuilder;
+use t::lib::Mocks;
my $schema = Koha::Database->new->schema;
$schema->storage->txn_begin;
-my $builder = t::lib::TestBuilder->new;
-my $library = $builder->build( { source => 'Branch' } );
-my $patron = $builder->build( { source => 'Borrower', value => { branchcode => $library->{branchcode} } } );
+my $builder = t::lib::TestBuilder->new;
+my $library = $builder->build( { source => 'Branch' } );
+my $patron = $builder->build(
+ { source => 'Borrower', value => { branchcode => $library->{branchcode} } }
+);
my $item_1 = $builder->build_sample_item;
my $item_2 = $builder->build_sample_item;
my $nb_of_checkouts = Koha::Checkouts->search->count;
my $new_checkout_1 = Koha::Checkout->new(
- { borrowernumber => $patron->{borrowernumber},
+ {
+ borrowernumber => $patron->{borrowernumber},
itemnumber => $item_1->itemnumber,
branchcode => $library->{branchcode},
}
)->store;
my $new_checkout_2 = Koha::Checkout->new(
- { borrowernumber => $patron->{borrowernumber},
+ {
+ borrowernumber => $patron->{borrowernumber},
itemnumber => $item_2->itemnumber,
branchcode => $library->{branchcode},
}
)->store;
-like( $new_checkout_1->issue_id, qr|^\d+$|, 'Adding a new checkout should have set the issue_id' );
-is( Koha::Checkouts->search->count, $nb_of_checkouts + 2, 'The 2 checkouts should have been added' );
+like( $new_checkout_1->issue_id, qr|^\d+$|,
+ 'Adding a new checkout should have set the issue_id' );
+is(
+ Koha::Checkouts->search->count,
+ $nb_of_checkouts + 2,
+ 'The 2 checkouts should have been added'
+);
my $retrieved_checkout_1 = Koha::Checkouts->find( $new_checkout_1->issue_id );
-is( $retrieved_checkout_1->itemnumber, $new_checkout_1->itemnumber, 'Find a checkout by id should return the correct checkout' );
+is(
+ $retrieved_checkout_1->itemnumber,
+ $new_checkout_1->itemnumber,
+ 'Find a checkout by id should return the correct checkout'
+);
subtest 'is_overdue' => sub {
plan tests => 6;
subtest 'item' => sub {
plan tests => 2;
my $item = $retrieved_checkout_1->item;
- is( ref( $item ), 'Koha::Item', 'Koha::Checkout->item should return a Koha::Item' );
- is( $item->itemnumber, $item_1->itemnumber, 'Koha::Checkout->item should return the correct item' );
+ is( ref($item), 'Koha::Item',
+ 'Koha::Checkout->item should return a Koha::Item' );
+ is( $item->itemnumber, $item_1->itemnumber,
+ 'Koha::Checkout->item should return the correct item' );
};
subtest 'patron' => sub {
plan tests => 3;
- my $patron = $builder->build_object({class=>'Koha::Patrons', value => {branchcode => $library->{branchcode}}});
+ my $patron = $builder->build_object(
+ {
+ class => 'Koha::Patrons',
+ value => { branchcode => $library->{branchcode} }
+ }
+ );
- my $item = $builder->build_sample_item;
+ my $item = $builder->build_sample_item;
my $checkout = Koha::Checkout->new(
- { borrowernumber => $patron->borrowernumber,
+ {
+ borrowernumber => $patron->borrowernumber,
itemnumber => $item->itemnumber,
branchcode => $library->{branchcode},
}
# Testing Koha::Old::Checkout->patron now
my $issue_id = $checkout->issue_id;
- C4::Circulation::MarkIssueReturned( $p->borrowernumber, $checkout->itemnumber );
+ C4::Circulation::MarkIssueReturned( $p->borrowernumber,
+ $checkout->itemnumber );
$p->delete;
my $old_issue = Koha::Old::Checkouts->find($issue_id);
is( $old_issue->patron, undef,
- 'Koha::Checkout->patron should return undef if the patron record has been deleted'
+'Koha::Checkout->patron should return undef if the patron record has been deleted'
);
};
$retrieved_checkout_1->delete;
-is( Koha::Checkouts->search->count, $nb_of_checkouts + 1, 'Delete should have deleted the checkout' );
+is(
+ Koha::Checkouts->search->count,
+ $nb_of_checkouts + 1,
+ 'Delete should have deleted the checkout'
+);
subtest 'issuer' => sub {
plan tests => 3;
- my $patron = $builder->build_object({class=>'Koha::Patrons', value => {branchcode => $library->{branchcode}}});
- my $issuer = $builder->build_object({class=>'Koha::Patrons', value => {branchcode => $library->{branchcode}}});
-
- my $item = $builder->build_sample_item;
- my $checkout = Koha::Checkout->new({
- borrowernumber => $patron->borrowernumber,
- issuer_id => $issuer->borrowernumber,
- itemnumber => $item->itemnumber,
- branchcode => $library->{branchcode},
- })->store;
+ my $patron = $builder->build_object(
+ {
+ class => 'Koha::Patrons',
+ value => { branchcode => $library->{branchcode} }
+ }
+ );
+ my $issuer = $builder->build_object(
+ {
+ class => 'Koha::Patrons',
+ value => { branchcode => $library->{branchcode} }
+ }
+ );
+
+ my $item = $builder->build_sample_item;
+ my $checkout = Koha::Checkout->new(
+ {
+ borrowernumber => $patron->borrowernumber,
+ issuer_id => $issuer->borrowernumber,
+ itemnumber => $item->itemnumber,
+ branchcode => $library->{branchcode},
+ }
+ )->store;
my $i = $checkout->issuer;
is( ref($i), 'Koha::Patron',
# Testing Koha::Old::Checkout->patron now
my $issue_id = $checkout->issue_id;
- C4::Circulation::MarkIssueReturned( $patron->borrowernumber, $checkout->itemnumber );
+ C4::Circulation::MarkIssueReturned( $patron->borrowernumber,
+ $checkout->itemnumber );
$i->delete;
my $old_issue = Koha::Old::Checkouts->find($issue_id);
is( $old_issue->issuer_id, undef,
- 'Koha::Checkout->issuer_id should return undef if the patron record has been deleted'
+'Koha::Checkout->issuer_id should return undef if the patron record has been deleted'
+ );
+
+};
+
+subtest 'Koha::Old::Checkouts->filter_by_todays_checkins' => sub {
+
+ plan tests => 3;
+
+ # We will create 7 checkins for a given patron
+ # 3 checked in today - 2 days, and 4 checked in today
+ my $librarian = $builder->build_object(
+ {
+ class => 'Koha::Patrons',
+ value => { branchcode => $library->{branchcode} }
+ }
+ );
+ t::lib::Mocks::mock_userenv( { patron => $librarian } );
+ my $patron = $builder->build_object(
+ {
+ class => 'Koha::Patrons',
+ value => { branchcode => $library->{branchcode} }
+ }
);
+ my @checkouts;
+ # Create 7 checkouts
+ for ( 0 .. 6 ) {
+ my $item = $builder->build_sample_item;
+ push @checkouts,
+ Koha::Checkout->new(
+ {
+ borrowernumber => $patron->borrowernumber,
+ itemnumber => $item->itemnumber,
+ branchcode => $library->{branchcode},
+ }
+ )->store;
+ }
+
+ # Checkin 3 today - 2 days
+ my $not_today = dt_from_string->add( days => -2 );
+ for my $i ( 0 .. 2 ) {
+ my $checkout = $checkouts[$i];
+ C4::Circulation::AddReturn(
+ $checkout->item->barcode, $library->{branchcode},
+ undef, $not_today->set_hour( int( rand(24) ) )
+ );
+ }
+ # Checkin 4 today
+ my $today = dt_from_string;
+ for my $i ( 3 .. 6 ) {
+ my $checkout = $checkouts[$i];
+ C4::Circulation::AddReturn(
+ $checkout->item->barcode, $library->{branchcode},
+ undef, $today->set_hour( int( rand(24) ) )
+ );
+ }
+
+ my $old_checkouts = $patron->old_checkouts;
+ is( $old_checkouts->count, 7, 'There should be 7 old checkouts' );
+ my $todays_checkins = $old_checkouts->filter_by_todays_checkins;
+ is( $todays_checkins->count, 4, 'There should be 4 checkins today' );
+ is_deeply(
+ [ $todays_checkins->get_column('itemnumber') ],
+ [ map { $_->itemnumber } @checkouts[ 3 .. 6 ] ],
+ q{Correct list of today's checkins}
+ );
};
$schema->storage->txn_rollback;
+subtest 'automatic_checkin' => sub {
+
+ plan tests => 9;
+
+ $schema->storage->txn_begin;
+
+ my $patron = $builder->build_object( { class => 'Koha::Patrons' } );
+
+ my $due_ac_item =
+ $builder->build_sample_item(
+ { homebranch => $patron->branchcode, itemlost => 0 } );
+ my $ac_item =
+ $builder->build_sample_item(
+ { homebranch => $patron->branchcode, itemlost => 0 } );
+ my $odue_ac_item =
+ $builder->build_sample_item(
+ { homebranch => $patron->branchcode, itemlost => 0 } );
+ my $normal_item =
+ $builder->build_sample_item(
+ { homebranch => $patron->branchcode, itemlost => 0 } );
+
+ $due_ac_item->itemtype->automatic_checkin(1)->store;
+ $odue_ac_item->itemtype->automatic_checkin(1)->store;
+ $ac_item->itemtype->automatic_checkin(1)->store;
+ $normal_item->itemtype->automatic_checkin(0)->store;
+
+ my $today = dt_from_string;
+ my $tomorrow = dt_from_string->add( days => 1 );
+ my $yesterday = dt_from_string->subtract( days => 1 );
+
+ # Checkout do for automatic checkin
+ my $checkout_due_aci = Koha::Checkout->new(
+ {
+ borrowernumber => $patron->borrowernumber,
+ itemnumber => $due_ac_item->itemnumber,
+ branchcode => $patron->branchcode,
+ date_due => $today,
+ }
+ )->store;
+
+ # Checkout not due for automatic checkin
+ my $checkout_odue_aci = Koha::Checkout->new(
+ {
+ borrowernumber => $patron->borrowernumber,
+ itemnumber => $odue_ac_item->itemnumber,
+ branchcode => $patron->branchcode,
+ date_due => $yesterday
+ }
+ )->store;
+
+ # Checkout not due for automatic checkin
+ my $checkout_aci = Koha::Checkout->new(
+ {
+ borrowernumber => $patron->borrowernumber,
+ itemnumber => $ac_item->itemnumber,
+ branchcode => $patron->branchcode,
+ date_due => $tomorrow
+ }
+ )->store;
+
+ # due checkout for nomal itemtype
+ my $checkout_ni = Koha::Checkout->new(
+ {
+ borrowernumber => $patron->borrowernumber,
+ itemnumber => $normal_item->itemnumber,
+ branchcode => $patron->branchcode,
+ date_due => $today,
+ }
+ )->store;
+
+ my $searched = Koha::Checkouts->find( $checkout_ni->issue_id );
+ is( $searched->issue_id, $checkout_ni->issue_id,
+ 'checkout for normal_item exists' );
+
+ $searched = Koha::Checkouts->find( $checkout_aci->issue_id );
+ is( $searched->issue_id, $checkout_aci->issue_id,
+ 'checkout for ac_item exists' );
+
+ $searched = Koha::Checkouts->find( $checkout_due_aci->issue_id );
+ is(
+ $searched->issue_id,
+ $checkout_due_aci->issue_id,
+ 'checkout for due_ac_item exists'
+ );
+
+ $searched = Koha::Checkouts->find( $checkout_odue_aci->issue_id );
+ is(
+ $searched->issue_id,
+ $checkout_odue_aci->issue_id,
+ 'checkout for odue_ac_item exists'
+ );
+
+ Koha::Checkouts->automatic_checkin;
+
+ $searched = Koha::Checkouts->find( $checkout_ni->issue_id );
+ is( $searched->issue_id, $checkout_ni->issue_id,
+ 'checkout for normal_item still exists' );
+
+ $searched = Koha::Checkouts->find( $checkout_aci->issue_id );
+ is( $searched->issue_id, $checkout_aci->issue_id,
+ 'checkout for ac_item still exists' );
+
+ $searched = Koha::Checkouts->find( $checkout_due_aci->issue_id );
+ is( $searched, undef, 'checkout for due_ac_item doesn\'t exist anymore' );
+
+ $searched = Koha::Checkouts->find( $checkout_odue_aci->issue_id );
+ is( $searched, undef, 'checkout for odue_ac_item doesn\'t exist anymore' );
+
+ $searched = Koha::Old::Checkouts->find( $checkout_odue_aci->issue_id );
+ is( dt_from_string($searched->returndate), $yesterday, 'old checkout for odue_ac_item has the right return date' );
+
+ $schema->storage->txn_rollback;
+}