use C4::Members;
use C4::Reserves;
-use Test::More tests => 30;
+use Test::More tests => 48;
BEGIN {
use_ok('C4::Circulation');
$dbh->{AutoCommit} = 0;
$dbh->{RaiseError} = 1;
+# Start with a clean slate
+$dbh->do('DELETE FROM issues');
+
my $CircControl = C4::Context->preference('CircControl');
my $HomeOrHoldingBranch = C4::Context->preference('HomeOrHoldingBranch');
'CircControl reset to its initial value'
);
+# Set a simple circ policy
+$dbh->do('DELETE FROM issuingrules');
+$dbh->do(
+ q{INSERT INTO issuingrules (categorycode, branchcode, itemtype, reservesallowed,
+ maxissueqty, issuelength, lengthunit,
+ renewalsallowed, renewalperiod,
+ fine, chargeperiod)
+ VALUES (?, ?, ?, ?,
+ ?, ?, ?,
+ ?, ?,
+ ?, ?
+ )
+ },
+ {},
+ '*', '*', '*', 25,
+ 20, 14, 'days',
+ 1, 7,
+ .10, 1
+);
+
# Test C4::Circulation::ProcessOfflinePayment
my $sth = C4::Context->dbh->prepare("SELECT COUNT(*) FROM accountlines WHERE amount = '-123.45' AND accounttype = 'Pay'");
$sth->execute();
C4::Context->dbh->do("DELETE FROM accountlines WHERE borrowernumber IN ( SELECT borrowernumber FROM borrowers WHERE cardnumber = '99999999999' )");
C4::Context->dbh->do("DELETE FROM borrowers WHERE cardnumber = '99999999999'");
-
+C4::Context->dbh->do("DELETE FROM accountlines");
{
# CanBookBeRenewed tests
my $barcode = 'R00000342';
my $branch = 'MPL';
- my ($item_bibnum, $item_bibitemnum, $itemnumber) =
- AddItem({ homebranch => $branch,
- holdingbranch => $branch,
- barcode => $barcode, } , $biblionumber);
+ my ( $item_bibnum, $item_bibitemnum, $itemnumber ) = AddItem(
+ {
+ homebranch => $branch,
+ holdingbranch => $branch,
+ barcode => $barcode,
+ replacementprice => 12.00
+ },
+ $biblionumber
+ );
my $barcode2 = 'R00000343';
- my ($item_bibnum2, $item_bibitemnum2, $itemnumber2) =
- AddItem({ homebranch => $branch,
- holdingbranch => $branch,
- barcode => $barcode2, } , $biblionumber);
+ my ( $item_bibnum2, $item_bibitemnum2, $itemnumber2 ) = AddItem(
+ {
+ homebranch => $branch,
+ holdingbranch => $branch,
+ barcode => $barcode2,
+ replacementprice => 23.00
+ },
+ $biblionumber
+ );
+
+ my $barcode3 = 'R00000346';
+ my ( $item_bibnum3, $item_bibitemnum3, $itemnumber3 ) = AddItem(
+ {
+ homebranch => $branch,
+ holdingbranch => $branch,
+ barcode => $barcode3,
+ replacementprice => 23.00
+ },
+ $biblionumber
+ );
# Create 2 borrowers
my %renewing_borrower_data = (
is( $error, 'on_reserve', '(Bug 10663) Cannot renew, reserved (returned error is on_reserve)');
my $reserveid = C4::Reserves::GetReserveId({ biblionumber => $biblionumber, borrowernumber => $reserving_borrowernumber});
- CancelReserve({ reserve_id => $reserveid });
-
+ my $reserving_borrower = GetMember( borrowernumber => $reserving_borrowernumber );
+ AddIssue($reserving_borrower, $barcode3);
+ my $reserve = $dbh->selectrow_hashref(
+ 'SELECT * FROM old_reserves WHERE reserve_id = ?',
+ { Slice => {} },
+ $reserveid
+ );
+ is($reserve->{found}, 'F', 'hold marked completed when checking out item that fills it');
diag("Item-level hold, renewal test");
AddReserve(
$reserveid = C4::Reserves::GetReserveId({ biblionumber => $biblionumber, itemnumber => $itemnumber, borrowernumber => $reserving_borrowernumber});
CancelReserve({ reserve_id => $reserveid });
+ # set policy to require that loans cannot be
+ # renewed until seven days prior to the due date
+ $dbh->do('UPDATE issuingrules SET norenewalbefore = 7');
+ ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber);
+ is( $renewokay, 0, 'Cannot renew, renewal is premature');
+ is( $error, 'too_soon', 'Cannot renew, renewal is premature (returned code is too_soon)');
+ is(
+ GetSoonestRenewDate($renewing_borrowernumber, $itemnumber),
+ $datedue->clone->add(days => -7),
+ 'renewals permitted 7 days before due date, as expected',
+ );
diag("Too many renewals");
- # FIXME: Check with circulation rules and renewalsallowed set properly configured
+ # set policy to forbid renewals
+ $dbh->do('UPDATE issuingrules SET norenewalbefore = NULL, renewalsallowed = 0');
( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber);
is( $renewokay, 0, 'Cannot renew, 0 renewals allowed');
is( $error, 'too_many', 'Cannot renew, 0 renewals allowed (returned code is too_many)');
+ # Test WhenLostForgiveFine and WhenLostChargeReplacementFee
+ diag("WhenLostForgiveFine and WhenLostChargeReplacementFee");
+ C4::Context->set_preference('WhenLostForgiveFine','1');
+ C4::Context->set_preference('WhenLostChargeReplacementFee','1');
+
+ C4::Overdues::UpdateFine( $itemnumber, $renewing_borrower->{borrowernumber},
+ 15.00, q{}, Koha::DateUtils::output_pref($datedue) );
+
+ LostItem( $itemnumber, 1 );
+
+ my $total_due = $dbh->selectrow_array(
+ 'SELECT SUM( amountoutstanding ) FROM accountlines WHERE borrowernumber = ?',
+ undef, $renewing_borrower->{borrowernumber}
+ );
+
+ ok( $total_due == 12, 'Borrower only charged replacement fee with both WhenLostForgiveFine and WhenLostChargeReplacementFee enabled' );
+
+ C4::Context->dbh->do("DELETE FROM accountlines");
+
+ C4::Context->set_preference('WhenLostForgiveFine','0');
+ C4::Context->set_preference('WhenLostChargeReplacementFee','0');
+
+ C4::Overdues::UpdateFine( $itemnumber2, $renewing_borrower->{borrowernumber},
+ 15.00, q{}, Koha::DateUtils::output_pref($datedue) );
+
+ LostItem( $itemnumber2, 1 );
+
+ $total_due = $dbh->selectrow_array(
+ 'SELECT SUM( amountoutstanding ) FROM accountlines WHERE borrowernumber = ?',
+ undef, $renewing_borrower->{borrowernumber}
+ );
+
+ ok( $total_due == 15, 'Borrower only charged fine with both WhenLostForgiveFine and WhenLostChargeReplacementFee disabled' );
+}
+
+{
+ # GetUpcomingDueIssues tests
+ my $barcode = 'R00000342';
+ my $barcode2 = 'R00000343';
+ my $barcode3 = 'R00000344';
+ my $branch = 'MPL';
+
+ #Create another record
+ my $biblio2 = MARC::Record->new();
+ my $title2 = 'Something is worng here';
+ $biblio2->append_fields(
+ MARC::Field->new('100', ' ', ' ', a => 'Anonymous'),
+ MARC::Field->new('245', ' ', ' ', a => $title2),
+ );
+ my ($biblionumber2, $biblioitemnumber2) = AddBiblio($biblio2, '');
+
+ #Create third item
+ AddItem(
+ {
+ homebranch => $branch,
+ holdingbranch => $branch,
+ barcode => $barcode3
+ },
+ $biblionumber2
+ );
+
+ # Create a borrower
+ my %a_borrower_data = (
+ firstname => 'Fridolyn',
+ surname => 'SOMERS',
+ categorycode => 'S',
+ branchcode => $branch,
+ );
+
+ my $a_borrower_borrowernumber = AddMember(%a_borrower_data);
+ my $a_borrower = GetMember( borrowernumber => $a_borrower_borrowernumber );
+
+ my $yesterday = DateTime->today(time_zone => C4::Context->tz())->add( days => -1 );
+ my $two_days_ahead = DateTime->today(time_zone => C4::Context->tz())->add( days => 2 );
+ my $today = DateTime->today(time_zone => C4::Context->tz());
+
+ my $datedue = AddIssue( $a_borrower, $barcode, $yesterday );
+ my $datedue2 = AddIssue( $a_borrower, $barcode2, $two_days_ahead );
+
+ my $upcoming_dues;
+
+ diag( "GetUpcomingDueIssues tests" );
+
+ for my $i(0..1) {
+ $upcoming_dues = C4::Circulation::GetUpcomingDueIssues( { days_in_advance => $i } );
+ is ( scalar( @$upcoming_dues ), 0, "No items due in less than one day ($i days in advance)" );
+ }
+
+ #days_in_advance needs to be inclusive, so 1 matches items due tomorrow, 0 items due today etc.
+ $upcoming_dues = C4::Circulation::GetUpcomingDueIssues( { days_in_advance => 2 } );
+ is ( scalar ( @$upcoming_dues), 1, "Only one item due in 2 days or less" );
+
+ for my $i(3..5) {
+ $upcoming_dues = C4::Circulation::GetUpcomingDueIssues( { days_in_advance => $i } );
+ is ( scalar( @$upcoming_dues ), 1,
+ "Bug 9362: Only one item due in more than 2 days ($i days in advance)" );
+ }
+
+ # Bug 11218 - Due notices not generated - GetUpcomingDueIssues needs to select due today items as well
+
+ my $datedue3 = AddIssue( $a_borrower, $barcode3, $today );
+
+ $upcoming_dues = C4::Circulation::GetUpcomingDueIssues( { days_in_advance => -1 } );
+ is ( scalar ( @$upcoming_dues), 0, "Overdues can not be selected" );
+
+ $upcoming_dues = C4::Circulation::GetUpcomingDueIssues( { days_in_advance => 0 } );
+ is ( scalar ( @$upcoming_dues), 1, "1 item is due today" );
+
+ $upcoming_dues = C4::Circulation::GetUpcomingDueIssues( { days_in_advance => 1 } );
+ is ( scalar ( @$upcoming_dues), 1, "1 item is due today, none tomorrow" );
+
+ $upcoming_dues = C4::Circulation::GetUpcomingDueIssues( { days_in_advance => 2 } );
+ is ( scalar ( @$upcoming_dues), 2, "2 items are due withing 2 days" );
+
+ $upcoming_dues = C4::Circulation::GetUpcomingDueIssues( { days_in_advance => 3 } );
+ is ( scalar ( @$upcoming_dues), 2, "2 items are due withing 2 days" );
+
+ $upcoming_dues = C4::Circulation::GetUpcomingDueIssues();
+ is ( scalar ( @$upcoming_dues), 2, "days_in_advance is 7 in GetUpcomingDueIssues if not provided" );
+
}
$dbh->rollback;