use C4::Members;
use C4::Reserves;
-use Test::More tests => 36;
+use Test::More tests => 48;
BEGIN {
use_ok('C4::Circulation');
$dbh->do(
q{INSERT INTO issuingrules (categorycode, branchcode, itemtype, reservesallowed,
maxissueqty, issuelength, lengthunit,
- renewalsallowed, renewalperiod)
+ renewalsallowed, renewalperiod,
+ fine, chargeperiod)
VALUES (?, ?, ?, ?,
?, ?, ?,
+ ?, ?,
?, ?
)
},
{},
'*', '*', '*', 25,
20, 14, 'days',
- 1, 7
+ 1, 7,
+ .10, 1
);
# Test C4::Circulation::ProcessOfflinePayment
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");
# set policy to forbid renewals
- $dbh->do('UPDATE issuingrules SET renewalsallowed = 0');
+ $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',
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..2) {
- my $upcoming_dues = C4::Circulation::GetUpcomingDueIssues( { days_in_advance => $i } );
- is ( scalar( @$upcoming_dues ), 0, "No items due in less than two days ($i days in advance)" );
+ 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) {
- my $upcoming_dues = C4::Circulation::GetUpcomingDueIssues( { days_in_advance => $i } );
+ $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;