12 use Test::More tests => 36;
15 use_ok('C4::Circulation');
18 my $dbh = C4::Context->dbh;
21 $dbh->{AutoCommit} = 0;
22 $dbh->{RaiseError} = 1;
24 my $CircControl = C4::Context->preference('CircControl');
25 my $HomeOrHoldingBranch = C4::Context->preference('HomeOrHoldingBranch');
29 holdingbranch => 'MPL'
36 # No userenv, PickupLibrary
37 C4::Context->set_preference('CircControl', 'PickupLibrary');
39 C4::Context->preference('CircControl'),
41 'CircControl changed to PickupLibrary'
44 C4::Circulation::_GetCircControlBranch($item, $borrower),
45 $item->{$HomeOrHoldingBranch},
46 '_GetCircControlBranch returned item branch (no userenv defined)'
49 # No userenv, PatronLibrary
50 C4::Context->set_preference('CircControl', 'PatronLibrary');
52 C4::Context->preference('CircControl'),
54 'CircControl changed to PatronLibrary'
57 C4::Circulation::_GetCircControlBranch($item, $borrower),
58 $borrower->{branchcode},
59 '_GetCircControlBranch returned borrower branch'
62 # No userenv, ItemHomeLibrary
63 C4::Context->set_preference('CircControl', 'ItemHomeLibrary');
65 C4::Context->preference('CircControl'),
67 'CircControl changed to ItemHomeLibrary'
70 $item->{$HomeOrHoldingBranch},
71 C4::Circulation::_GetCircControlBranch($item, $borrower),
72 '_GetCircControlBranch returned item branch'
75 diag('Now, set a userenv');
76 C4::Context->_new_userenv('xxx');
77 C4::Context::set_userenv(0,0,0,'firstname','surname', 'MPL', 'Midway Public Library', '', '', '');
78 is(C4::Context->userenv->{branch}, 'MPL', 'userenv set');
80 # Userenv set, PickupLibrary
81 C4::Context->set_preference('CircControl', 'PickupLibrary');
83 C4::Context->preference('CircControl'),
85 'CircControl changed to PickupLibrary'
88 C4::Circulation::_GetCircControlBranch($item, $borrower),
90 '_GetCircControlBranch returned current branch'
93 # Userenv set, PatronLibrary
94 C4::Context->set_preference('CircControl', 'PatronLibrary');
96 C4::Context->preference('CircControl'),
98 'CircControl changed to PatronLibrary'
101 C4::Circulation::_GetCircControlBranch($item, $borrower),
102 $borrower->{branchcode},
103 '_GetCircControlBranch returned borrower branch'
106 # Userenv set, ItemHomeLibrary
107 C4::Context->set_preference('CircControl', 'ItemHomeLibrary');
109 C4::Context->preference('CircControl'),
111 'CircControl changed to ItemHomeLibrary'
114 C4::Circulation::_GetCircControlBranch($item, $borrower),
115 $item->{$HomeOrHoldingBranch},
116 '_GetCircControlBranch returned item branch'
119 # Reset initial configuration
120 C4::Context->set_preference('CircControl', $CircControl);
122 C4::Context->preference('CircControl'),
124 'CircControl reset to its initial value'
127 # Set a simple circ policy
128 $dbh->do('DELETE FROM issuingrules');
130 q{INSERT INTO issuingrules (categorycode, branchcode, itemtype, reservesallowed,
131 maxissueqty, issuelength, lengthunit,
132 renewalsallowed, renewalperiod)
144 # Test C4::Circulation::ProcessOfflinePayment
145 my $sth = C4::Context->dbh->prepare("SELECT COUNT(*) FROM accountlines WHERE amount = '-123.45' AND accounttype = 'Pay'");
147 my ( $original_count ) = $sth->fetchrow_array();
149 C4::Context->dbh->do("INSERT INTO borrowers ( cardnumber, surname, firstname, categorycode, branchcode ) VALUES ( '99999999999', 'Hall', 'Kyle', 'S', 'MPL' )");
151 C4::Circulation::ProcessOfflinePayment({ cardnumber => '99999999999', amount => '123.45' });
154 my ( $new_count ) = $sth->fetchrow_array();
156 ok( $new_count == $original_count + 1, 'ProcessOfflinePayment makes payment correctly' );
158 C4::Context->dbh->do("DELETE FROM accountlines WHERE borrowernumber IN ( SELECT borrowernumber FROM borrowers WHERE cardnumber = '99999999999' )");
159 C4::Context->dbh->do("DELETE FROM borrowers WHERE cardnumber = '99999999999'");
162 # CanBookBeRenewed tests
164 # Generate test biblio
165 my $biblio = MARC::Record->new();
166 my $title = 'Silence in the library';
167 $biblio->append_fields(
168 MARC::Field->new('100', ' ', ' ', a => 'Moffat, Steven'),
169 MARC::Field->new('245', ' ', ' ', a => $title),
172 my ($biblionumber, $biblioitemnumber) = AddBiblio($biblio, '');
174 my $barcode = 'R00000342';
177 my ($item_bibnum, $item_bibitemnum, $itemnumber) =
178 AddItem({ homebranch => $branch,
179 holdingbranch => $branch,
180 barcode => $barcode, } , $biblionumber);
182 my $barcode2 = 'R00000343';
183 my ($item_bibnum2, $item_bibitemnum2, $itemnumber2) =
184 AddItem({ homebranch => $branch,
185 holdingbranch => $branch,
186 barcode => $barcode2, } , $biblionumber);
189 my %renewing_borrower_data = (
191 surname => 'Renewal',
193 branchcode => $branch,
196 my %reserving_borrower_data = (
197 firstname => 'Katrin',
198 surname => 'Reservation',
200 branchcode => $branch,
203 my $renewing_borrowernumber = AddMember(%renewing_borrower_data);
204 my $reserving_borrowernumber = AddMember(%reserving_borrower_data);
206 my $renewing_borrower = GetMember( borrowernumber => $renewing_borrowernumber );
208 my $constraint = 'a';
214 my $checkitem = undef;
217 my $datedue = AddIssue( $renewing_borrower, $barcode);
218 is (defined $datedue, 1, "Item 1 checked out, due date: $datedue");
220 my $datedue2 = AddIssue( $renewing_borrower, $barcode2);
221 is (defined $datedue2, 1, "Item 2 checked out, due date: $datedue2");
223 my $borrowing_borrowernumber = GetItemIssue($itemnumber)->{borrowernumber};
224 is ($borrowing_borrowernumber, $renewing_borrowernumber, "Item checked out to $renewing_borrower->{firstname} $renewing_borrower->{surname}");
226 my ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber, 1);
227 is( $renewokay, 1, 'Can renew, no holds for this title or item');
230 diag("Biblio-level hold, renewal test");
232 $branch, $reserving_borrowernumber, $biblionumber,
233 $constraint, $bibitems, $priority, $resdate, $expdate, $notes,
234 $title, $checkitem, $found
237 ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber);
238 is( $renewokay, 0, '(Bug 10663) Cannot renew, reserved');
239 is( $error, 'on_reserve', '(Bug 10663) Cannot renew, reserved (returned error is on_reserve)');
241 ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber2);
242 is( $renewokay, 0, '(Bug 10663) Cannot renew, reserved');
243 is( $error, 'on_reserve', '(Bug 10663) Cannot renew, reserved (returned error is on_reserve)');
245 my $reserveid = C4::Reserves::GetReserveId({ biblionumber => $biblionumber, borrowernumber => $reserving_borrowernumber});
246 CancelReserve({ reserve_id => $reserveid });
249 diag("Item-level hold, renewal test");
251 $branch, $reserving_borrowernumber, $biblionumber,
252 $constraint, $bibitems, $priority, $resdate, $expdate, $notes,
253 $title, $itemnumber, $found
256 ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber, 1);
257 is( $renewokay, 0, '(Bug 10663) Cannot renew, item reserved');
258 is( $error, 'on_reserve', '(Bug 10663) Cannot renew, item reserved (returned error is on_reserve)');
260 ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber2, 1);
261 is( $renewokay, 1, 'Can renew item 2, item-level hold is on item 1');
264 diag("Items can't fill hold for reasons");
265 ModItem({ notforloan => 1 }, $biblionumber, $itemnumber);
266 ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber, 1);
267 is( $renewokay, 1, 'Can renew, item is marked not for loan, hold does not block');
268 ModItem({ notforloan => 0, itype => '' }, $biblionumber, $itemnumber,1);
270 # FIXME: Add more for itemtype not for loan etc.
272 $reserveid = C4::Reserves::GetReserveId({ biblionumber => $biblionumber, itemnumber => $itemnumber, borrowernumber => $reserving_borrowernumber});
273 CancelReserve({ reserve_id => $reserveid });
275 diag("Too many renewals");
277 # set policy to forbid renewals
278 $dbh->do('UPDATE issuingrules SET renewalsallowed = 0');
280 ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber);
281 is( $renewokay, 0, 'Cannot renew, 0 renewals allowed');
282 is( $error, 'too_many', 'Cannot renew, 0 renewals allowed (returned code is too_many)');
287 # GetUpcomingDueIssues tests
288 my $barcode = 'R00000342';
289 my $barcode2 = 'R00000343';
293 my %a_borrower_data = (
294 firstname => 'Fridolyn',
297 branchcode => $branch,
300 my $a_borrower_borrowernumber = AddMember(%a_borrower_data);
301 my $a_borrower = GetMember( borrowernumber => $a_borrower_borrowernumber );
303 my $yesterday = DateTime->today(time_zone => C4::Context->tz())->add( days => -1 );
304 my $two_days_ahead = DateTime->today(time_zone => C4::Context->tz())->add( days => 2 );
306 my $datedue = AddIssue( $a_borrower, $barcode, $yesterday );
307 my $datedue2 = AddIssue( $a_borrower, $barcode2, $two_days_ahead );
309 diag( "GetUpcomingDueIssues tests" );
312 my $upcoming_dues = C4::Circulation::GetUpcomingDueIssues( { days_in_advance => $i } );
313 is ( scalar( @$upcoming_dues ), 0, "No items due in less than two days ($i days in advance)" );
317 my $upcoming_dues = C4::Circulation::GetUpcomingDueIssues( { days_in_advance => $i } );
318 is ( scalar( @$upcoming_dues ), 1,
319 "Bug 9362: Only one item due in more than 2 days ($i days in advance)" );