# 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};
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.
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
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
: 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') {
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);
}
# in all other cases, keep the date due as it is
+
}
# if ReturnBeforeExpiry ON the datedue can't be after borrower expirydate
--- /dev/null
+#!/usr/bin/perl
+
+use Modern::Perl;
+
+use t::lib::Mocks::Context;
+use Test::More tests => 7;
+use Test::MockModule;
+use DBI;
+use DateTime;
+
+my $contextmodule = new Test::MockModule('C4::Context');
+$contextmodule->mock('_new_dbh', sub {
+ my $dbh = DBI->connect( 'DBI:Mock:', '', '' )
+ || die "Cannot create handle: $DBI::errstr\n";
+ return $dbh
+});
+
+use_ok('C4::Circulation');
+
+my $dbh = C4::Context->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 )");