From 5d2ad73e98e3842881bfc040bb231d170f1b9cae Mon Sep 17 00:00:00 2001 From: Michael Hafen Date: Wed, 29 Apr 2009 16:02:11 -0600 Subject: [PATCH] Tweak ceilingDueDate and CalcDateDue This patch moves ceilingDueDate and ReturnBeforeExpiry checking into CalcDateDue(), so the renewal due date is also calculated with those. Also restores a check in CanBookBeIssued. If the due date isn't given call CalcDateDue and make sure it's not in the past. Signed-off-by: Galen Charlton Signed-off-by: Henri-Damien LAURENT --- C4/Circulation.pm | 50 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/C4/Circulation.pm b/C4/Circulation.pm index 91d024ecd5..3d35050444 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -651,7 +651,19 @@ sub CanBookBeIssued { # # DUE DATE is OK ? -- should already have checked. # - #$issuingimpossible{INVALID_DATE} = 1 unless ($duedate); + unless ( $duedate ) { + my $issuedate = strftime( "%Y-%m-%d", localtime ); + my $branch = (C4::Context->preference('CircControl') eq 'PickupLibrary') ? C4::Context->userenv->{'branch'} : + (C4::Context->preference('CircControl') eq 'PatronLibrary') ? $borrower->{'branchcode'} : + $item->{'homebranch'}; # fallback to item's homebranch + my $itype = ( C4::Context->preference('item-level_itypes') ) ? $item->{'itype'} : $biblioitem->{'itemtype'}; + my $loanlength = GetLoanLength( $borrower->{'categorycode'}, $itype, $branch ); + $duedate = CalcDateDue( C4::Dates->new( $issuedate, 'iso' ), $loanlength, $branch, $borrower ); + + # Offline circ calls AddIssue directly, doesn't run through here + # So issuingimpossible should be ok. + } + $issuingimpossible{INVALID_DATE} = $duedate->output('syspref') unless ( $duedate && $duedate->output('iso') ge C4::Dates->today('iso') ); # # BORROWER STATUS @@ -965,12 +977,7 @@ sub AddIssue { unless ($datedue) { my $itype = ( C4::Context->preference('item-level_itypes') ) ? $biblio->{'itype'} : $biblio->{'itemtype'}; my $loanlength = GetLoanLength( $borrower->{'categorycode'}, $itype, $branch ); - $datedue = CalcDateDue( C4::Dates->new( $issuedate, 'iso' ), $loanlength, $branch ); - - # if ReturnBeforeExpiry ON the datedue can't be after borrower expirydate - if ( C4::Context->preference('ReturnBeforeExpiry') && $datedue->output('iso') gt $borrower->{dateexpiry} ) { - $datedue = C4::Dates->new( $borrower->{dateexpiry}, 'iso' ); - } + $datedue = CalcDateDue( C4::Dates->new( $issuedate, 'iso' ), $loanlength, $branch, $borrower ); } $sth->execute( $borrower->{'borrowernumber'}, # borrowernumber @@ -1957,7 +1964,7 @@ sub AddRenewal { $item->{homebranch} # item's homebranch determines loanlength OR do we want the branch specified by the AddRenewal argument? ); #FIXME -- use circControl? - $datedue = CalcDateDue(C4::Dates->new(),$loanlength,$branch); # this branch is the transactional branch. + $datedue = CalcDateDue(C4::Dates->new(),$loanlength,$branch,$borrower); # this branch is the transactional branch. # The question of whether to use item's homebranch calendar is open. } @@ -2297,17 +2304,32 @@ C<$loanlength> = loan length prior to adjustment =cut sub CalcDateDue { - my ($startdate,$loanlength,$branch) = @_; + my ($startdate,$loanlength,$branch,$borrower) = @_; + my $datedue; + if(C4::Context->preference('useDaysMode') eq 'Days') { # ignoring calendar - my $datedue = time + ($loanlength) * 86400; + my $timedue = time + ($loanlength) * 86400; #FIXME - assumes now even though we take a startdate - my @datearr = localtime($datedue); - return C4::Dates->new( sprintf("%04d-%02d-%02d", 1900 + $datearr[5], $datearr[4] + 1, $datearr[3]), 'iso'); + my @datearr = localtime($timedue); + $datedue = C4::Dates->new( sprintf("%04d-%02d-%02d", 1900 + $datearr[5], $datearr[4] + 1, $datearr[3]), 'iso'); } else { my $calendar = C4::Calendar->new( branchcode => $branch ); - my $datedue = $calendar->addDate($startdate, $loanlength); - return $datedue; + $datedue = $calendar->addDate($startdate, $loanlength); } + + # if ReturnBeforeExpiry ON the datedue can't be after borrower expirydate + if ( C4::Context->preference('ReturnBeforeExpiry') && $datedue->output('iso') gt $borrower->{dateexpiry} ) { + $datedue = C4::Dates->new( $borrower->{dateexpiry}, 'iso' ); + } + + # if ceilingDueDate ON the datedue can't be after the ceiling date + if ( C4::Context->preference('ceilingDueDate') + && ( C4::Context->preference('ceilingDueDate') =~ C4::Dates->regexp('syspref') ) + && $datedue->output gt C4::Context->preference('ceilingDueDate') ) { + $datedue = C4::Dates->new( C4::Context->preference('ceilingDueDate') ); + } + + return $datedue; } =head2 CheckValidDatedue -- 2.39.5