8 use Test::More tests => 7;
17 use t::lib::TestBuilder;
21 use lib $FindBin::Bin;
22 use_ok('C4::Reserves', qw( AddReserve CheckReserves ));
25 my $schema = Koha::Database->schema;
26 $schema->storage->txn_begin;
28 my $builder = t::lib::TestBuilder->new;
30 my $library1 = $builder->build({ source => 'Branch', });
31 my $library2 = $builder->build({ source => 'Branch', });
32 my $library3 = $builder->build({ source => 'Branch', });
33 my $library4 = $builder->build({ source => 'Branch', });
34 my $itemtype = $builder->build(
37 value => { notforloan => 0, rentalcharge => 0 }
43 my $borrowers_count = 5;
45 my $biblio = $builder->build_sample_biblio();
46 my $item = Koha::Item->new(
48 biblionumber => $biblio->biblionumber,
49 homebranch => $library4->{branchcode},
50 holdingbranch => $library3->{branchcode},
52 exclude_from_local_holds_priority => 0,
56 my @branchcodes = ( $library1->{branchcode}, $library2->{branchcode}, $library3->{branchcode}, $library4->{branchcode}, $library3->{branchcode}, $library4->{branchcode} );
57 my $patron_category = $builder->build({ source => 'Category', value => {exclude_from_local_holds_priority => 0} });
58 # Create some borrowers
60 foreach ( 0 .. $borrowers_count-1 ) {
61 my $borrowernumber = Koha::Patron->new({
62 firstname => 'my firstname',
63 surname => 'my surname ' . $_,
64 categorycode => $patron_category->{categorycode},
65 branchcode => $branchcodes[$_],
66 })->store->borrowernumber;
67 push @borrowernumbers, $borrowernumber;
70 # Create five item level holds
72 foreach my $borrowernumber (@borrowernumbers) {
75 branchcode => $branchcodes[$i],
76 borrowernumber => $borrowernumber,
77 biblionumber => $biblio->biblionumber,
85 my ($status, $reserve, $all_reserves);
87 t::lib::Mocks::mock_preference( 'LocalHoldsPriority', 0 );
88 ($status, $reserve, $all_reserves) = CheckReserves($item);
89 ok( $reserve->{borrowernumber} eq $borrowernumbers[0], "Received expected results with LocalHoldsPriority disabled" );
91 t::lib::Mocks::mock_preference( 'LocalHoldsPriority', 1 );
93 t::lib::Mocks::mock_preference( 'LocalHoldsPriorityPatronControl', 'PickupLibrary' );
94 t::lib::Mocks::mock_preference( 'LocalHoldsPriorityItemControl', 'homebranch' );
95 ($status, $reserve, $all_reserves) = CheckReserves($item);
96 ok( $reserve->{borrowernumber} eq $borrowernumbers[2], "Received expected results with PickupLibrary/homebranch" );
98 t::lib::Mocks::mock_preference( 'LocalHoldsPriorityPatronControl', 'PickupLibrary' );
99 t::lib::Mocks::mock_preference( 'LocalHoldsPriorityItemControl', 'holdingbranch' );
100 ($status, $reserve, $all_reserves) = CheckReserves($item);
101 ok( $reserve->{borrowernumber} eq $borrowernumbers[1], "Received expected results with PickupLibrary/holdingbranch" );
103 t::lib::Mocks::mock_preference( 'LocalHoldsPriorityPatronControl', 'HomeLibrary' );
104 t::lib::Mocks::mock_preference( 'LocalHoldsPriorityItemControl', 'holdingbranch' );
105 ($status, $reserve, $all_reserves) = CheckReserves($item);
106 ok( $reserve->{borrowernumber} eq $borrowernumbers[2], "Received expected results with HomeLibrary/holdingbranch" );
108 t::lib::Mocks::mock_preference( 'LocalHoldsPriorityPatronControl', 'HomeLibrary' );
109 t::lib::Mocks::mock_preference( 'LocalHoldsPriorityItemControl', 'homebranch' );
110 ($status, $reserve, $all_reserves) = CheckReserves($item);
111 ok( $reserve->{borrowernumber} eq $borrowernumbers[3], "Received expected results with HomeLibrary/homebranch" );
113 $schema->storage->txn_rollback;
115 subtest "exclude from local holds" => sub {
118 $schema->storage->txn_begin;
120 t::lib::Mocks::mock_preference( 'LocalHoldsPriority', 1 );
121 t::lib::Mocks::mock_preference( 'LocalHoldsPriorityPatronControl', 'HomeLibrary' );
122 t::lib::Mocks::mock_preference( 'LocalHoldsPriorityItemControl', 'homebranch' );
124 my $category_ex = $builder->build_object({ class => 'Koha::Patron::Categories', value => {exclude_from_local_holds_priority => 1} });
125 my $category_nex = $builder->build_object({ class => 'Koha::Patron::Categories', value => {exclude_from_local_holds_priority => 0} });
127 my $lib1 = $builder->build_object({ class => 'Koha::Libraries' });
128 my $lib2 = $builder->build_object({ class => 'Koha::Libraries' });
130 my $item1 = $builder->build_sample_item({exclude_from_local_holds_priority => 0, homebranch => $lib1->branchcode});
131 my $item2 = $builder->build_sample_item({exclude_from_local_holds_priority => 1, homebranch => $lib1->branchcode});
133 my $patron_ex_l2 = $builder->build_object({ class => 'Koha::Patrons', value => {branchcode => $lib2->branchcode, categorycode => $category_ex->categorycode}});
134 my $patron_ex_l1 = $builder->build_object({ class => 'Koha::Patrons', value => {branchcode => $lib1->branchcode, categorycode => $category_ex->categorycode}});
135 my $patron_nex_l2 = $builder->build_object({ class => 'Koha::Patrons', value => {branchcode => $lib2->branchcode, categorycode => $category_nex->categorycode}});
136 my $patron_nex_l1 = $builder->build_object({ class => 'Koha::Patrons', value => {branchcode => $lib1->branchcode, categorycode => $category_nex->categorycode}});
140 branchcode => $patron_nex_l2->branchcode,
141 borrowernumber => $patron_nex_l2->borrowernumber,
142 biblionumber => $item1->biblionumber,
148 branchcode => $patron_ex_l1->branchcode,
149 borrowernumber => $patron_ex_l1->borrowernumber,
150 biblionumber => $item1->biblionumber,
156 branchcode => $patron_nex_l1->branchcode,
157 borrowernumber => $patron_nex_l1->borrowernumber,
158 biblionumber => $item1->biblionumber,
163 my ($status, $reserve, $all_reserves);
164 ($status, $reserve, $all_reserves) = CheckReserves($item1);
165 is($reserve->{borrowernumber}, $patron_nex_l1->borrowernumber, "Patron not excluded with local holds priorities is next checkout");
171 branchcode => $patron_nex_l2->branchcode,
172 borrowernumber => $patron_nex_l2->borrowernumber,
173 biblionumber => $item1->biblionumber,
179 branchcode => $patron_ex_l1->branchcode,
180 borrowernumber => $patron_ex_l1->borrowernumber,
181 biblionumber => $item1->biblionumber,
186 ($status, $reserve, $all_reserves) = CheckReserves($item1);
187 is($reserve->{borrowernumber}, $patron_nex_l2->borrowernumber, "Local patron is excluded from priority");
193 branchcode => $patron_nex_l2->branchcode,
194 borrowernumber => $patron_nex_l2->borrowernumber,
195 biblionumber => $item2->biblionumber,
201 branchcode => $patron_nex_l1->branchcode,
202 borrowernumber => $patron_nex_l1->borrowernumber,
203 biblionumber => $item2->biblionumber,
208 ($status, $reserve, $all_reserves) = CheckReserves($item2);
209 is($reserve->{borrowernumber}, $patron_nex_l2->borrowernumber, "Patron from other library is next checkout because item is excluded");
211 $schema->storage->txn_rollback;