@@ -, +, @@
- Checked update works correctly for existing circulation rules.
- Adding, deleting and overwriting circulation rules works.
- Renewals work for different circulation rules and changes
to the holiday calendar.
---
C4/Circulation.pm | 38 +++---
.../prog/en/modules/admin/smart-rules.tt | 2 +-
t/db_dependent/Circulation_issuingrules.t | 123 ++++++++++++++++++++
3 files changed, 145 insertions(+), 18 deletions(-)
create mode 100644 t/db_dependent/Circulation_issuingrules.t
--- a/C4/Circulation.pm
+++ a/C4/Circulation.pm
@@ -1335,9 +1335,9 @@ sub GetLoanLength {
# try to find issuelength & return the 1st available.
# check with borrowertype, itemtype and branchcode, then without one of those parameters
-
$sth->execute( $borrowertype, $itemtype, $branchcode );
my $loanlength = $sth->fetchrow_hashref;
+
return $loanlength
if defined($loanlength) && $loanlength->{issuelength};
@@ -2411,8 +2411,6 @@ END_SQL
Find out whether a borrowed item may be renewed.
-C<$dbh> is a DBI handle to the Koha database.
-
C<$borrowernumber> is the borrower number of the patron who currently
has the item on loan.
@@ -2422,7 +2420,7 @@ C<$override_limit>, if supplied with a true value, causes
the limit on the number of times that the loan can be renewed
(as controlled by the item type) to be ignored.
-C<$CanBookBeRenewed> returns a true value iff the item may be renewed. The
+C<$CanBookBeRenewed> returns a true value if the item may be renewed. The
item must currently be on loan to the specified borrower; renewals
must be allowed for the item's type; and the borrower must not have
already renewed the loan. $error will contain the reason the renewal can not proceed
@@ -2984,6 +2982,7 @@ C<$startdate> = C4::Dates object representing start date of loan period (assum
C<$itemtype> = itemtype code of item in question
C<$branch> = location whose calendar to use
C<$borrower> = Borrower object
+C<$isrenewal> = Boolean: is true if we want to calculate the date due for a renewal. Else is false.
=cut
@@ -3001,22 +3000,29 @@ sub CalcDateDue {
: qq{issuelength};
my $datedue;
+ if ( $startdate ) {
+ if (ref $startdate ne 'DateTime' ) {
+ $datedue = dt_from_string($datedue);
+ } else {
+ $datedue = $startdate->clone;
+ }
+ } else {
+ $datedue =
+ DateTime->now( time_zone => C4::Context->tz() )
+ ->truncate( to => 'minute' );
+ }
+
# calculate the datedue as normal
if ( C4::Context->preference('useDaysMode') eq 'Days' )
{ # ignoring calendar
- my $dt =
- DateTime->now( time_zone => C4::Context->tz() )
- ->truncate( to => 'minute' );
if ( $loanlength->{lengthunit} eq 'hours' ) {
- $dt->add( hours => $loanlength->{$length_key} );
+ $datedue->add( hours => $loanlength->{$length_key} );
} else { # days
- $dt->add( days => $loanlength->{$length_key} );
- $dt->set_hour(23);
- $dt->set_minute(59);
+ $datedue->add( days => $loanlength->{$length_key} );
+ $datedue->set_hour(23);
+ $datedue->set_minute(59);
}
- # break
- return $dt;
} else {
my $dur;
if ($loanlength->{lengthunit} eq 'hours') {
@@ -3025,11 +3031,8 @@ sub CalcDateDue {
else { # days
$dur = DateTime::Duration->new( days => $loanlength->{$length_key});
}
- if (ref $startdate ne 'DateTime' ) {
- $startdate = dt_from_string($startdate);
- }
my $calendar = Koha::Calendar->new( branchcode => $branch );
- $datedue = $calendar->addDate( $startdate, $dur, $loanlength->{lengthunit} );
+ $datedue = $calendar->addDate( $datedue, $dur, $loanlength->{lengthunit} );
if ($loanlength->{lengthunit} eq 'days') {
$datedue->set_hour(23);
$datedue->set_minute(59);
@@ -3053,6 +3056,7 @@ sub CalcDateDue {
}
# in all other cases, keep the date due as it is
+
}
# if ReturnBeforeExpiry ON the datedue can't be after borrower expirydate
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/smart-rules.tt
+++ a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/smart-rules.tt
@@ -75,7 +75,7 @@ for="tobranch">Clone these rules to: dbh();
+
+my $issuelength = 10;
+my $renewalperiod = 5;
+my $lengthunit = 'days';
+
+my $expected = {
+ issuelength => $issuelength,
+ renewalperiod => $renewalperiod,
+ lengthunit => $lengthunit
+};
+
+my $default = {
+ issuelength => 21,
+ renewalperiod => 21,
+ lengthunit => 'days'
+};
+
+my $loanlength;
+my $mock_undef = [
+ []
+];
+
+my $mock_loan_length = [
+ ['issuelength', 'renewalperiod', 'lengthunit'],
+ [$issuelength, $renewalperiod, $lengthunit]
+];
+
+my $categorycode = 'B';
+my $itemtype = 'MX';
+my $branchcode = 'FPL';
+
+#=== GetLoanLength
+$dbh->{mock_add_resultset} = $mock_loan_length;
+$loanlength = C4::Circulation::GetLoanLength($categorycode, $itemtype, $branchcode);
+is_deeply($loanlength, $expected, 'first matches');
+
+$dbh->{mock_add_resultset} = $mock_undef;
+$loanlength = C4::Circulation::GetLoanLength($categorycode, $itemtype, $branchcode);
+is_deeply($loanlength, $default, 'none matches');
+
+#=== CalcDateDue
+
+#Set syspref ReturnBeforeExpiry = 1 and useDaysMode = 'Days'
+$contextmodule->mock('preference', sub {
+ my ($self, $syspref) = @_;
+ given ( $syspref ) {
+ when ("ReturnBeforeExpiry"){ return 1; }
+ when ("useDaysMode"){ return 'Days'; }
+ default{ return; }
+ }
+});
+
+my $dateexpiry = '2013-01-01';
+
+my $borrower = {categorycode => 'B', dateexpiry => $dateexpiry};
+my $start_date = DateTime->new({year => 2013, month => 2, day => 9});
+$dbh->{mock_add_resultset} = $mock_loan_length;
+my $date = C4::Circulation::CalcDateDue( $start_date, $itemtype, $branchcode, $borrower );
+is($date, $dateexpiry . 'T23:59:00', 'date expiry');
+
+$dbh->{mock_add_resultset} = $mock_loan_length;
+$date = C4::Circulation::CalcDateDue( $start_date, $itemtype, $branchcode, $borrower, 1 );
+
+
+#Set syspref ReturnBeforeExpiry = 1 and useDaysMode != 'Days'
+$contextmodule->mock('preference', sub {
+ my ($self, $syspref) = @_;
+ given ( $syspref ) {
+ when ("ReturnBeforeExpiry"){ return 1; }
+ when ("useDaysMode"){ return 'noDays'; }
+ default{ return; }
+ }
+});
+
+$borrower = {categorycode => 'B', dateexpiry => $dateexpiry};
+$start_date = DateTime->new({year => 2013, month => 2, day => 9});
+$dbh->{mock_add_resultset} = $mock_loan_length;
+$date = C4::Circulation::CalcDateDue( $start_date, $itemtype, $branchcode, $borrower );
+is($date, $dateexpiry . 'T23:59:00', 'date expiry');
+
+$dbh->{mock_add_resultset} = $mock_loan_length;
+$date = C4::Circulation::CalcDateDue( $start_date, $itemtype, $branchcode, $borrower, 1 );
+
+
+#Set syspref ReturnBeforeExpiry = 0 and useDaysMode = 'Days'
+$contextmodule->mock('preference', sub {
+ my ($self, $syspref) = @_;
+ given ( $syspref ) {
+ when ("ReturnBeforeExpiry"){ return 0; }
+ when ("useDaysMode"){ return 'Days'; }
+ default{ return; }
+ }
+});
+
+$borrower = {categorycode => 'B', dateexpiry => $dateexpiry};
+$start_date = DateTime->new({year => 2013, month => 2, day => 9});
+$dbh->{mock_add_resultset} = $mock_loan_length;
+$date = C4::Circulation::CalcDateDue( $start_date, $itemtype, $branchcode, $borrower );
+is($date, '2013-02-' . (9 + $issuelength) . 'T23:59:00', "date expiry ( 9 + $issuelength )");
+
+$dbh->{mock_add_resultset} = $mock_loan_length;
+$date = C4::Circulation::CalcDateDue( $start_date, $itemtype, $branchcode, $borrower, 1 );
+is($date, '2013-02-' . (9 + $renewalperiod) . 'T23:59:00', "date expiry ( 9 + $renewalperiod )");
--