&AddIssue
&AddRenewal
&GetRenewCount
+ &GetSoonestRenewDate
&GetItemIssue
&GetItemIssues
&GetIssuingCharges
my $dbh = C4::Context->dbh;
my $renews = 1;
- my $renewokay = 0;
+ my $renewokay = 1;
my $error;
my $item = GetItem($itemnumber) or return ( 0, 'no_item' );
my $issuingrule = GetIssuingRule($borrower->{categorycode}, $item->{itype}, $branchcode);
- if ( ( $issuingrule->{renewalsallowed} > $itemissue->{renewals} ) || $override_limit ) {
- $renewokay = 1;
- } else {
+ if ( $issuingrule->{norenewalbefore} ) {
+
+ # Get current time and add norenewalbefore. If this is smaller than date_due, it's too soon for renewal.
+ if (
+ DateTime->now( time_zone => C4::Context->tz() )->add(
+ $issuingrule->{lengthunit} => $issuingrule->{norenewalbefore}
+ ) < $itemissue->{date_due}
+ )
+ {
+ $renewokay = 0;
+ $error = "too_soon";
+ }
+ }
+
+ if ( $issuingrule->{renewalsallowed} <= $itemissue->{renewals} ) {
+ $renewokay = 0;
$error = "too_many";
}
+ if ( $override_limit ) {
+ $renewokay = 1;
+ $error = undef;
+ }
+
my ( $resfound, $resrec, undef ) = C4::Reserves::CheckReserves( $itemnumber );
if ( $resfound ) { # '' when no hold was found
return ( $renewcount, $renewsallowed, $renewsleft );
}
+=head2 GetSoonestRenewDate
+
+ $NoRenewalBeforeThisDate = &GetSoonestRenewDate($borrowernumber, $itemnumber);
+
+Find out the soonest possible renew date of a borrowed item.
+
+C<$borrowernumber> is the borrower number of the patron who currently
+has the item on loan.
+
+C<$itemnumber> is the number of the item to renew.
+
+C<$GetSoonestRenewDate> returns the DateTime of the soonest possible renew date,
+based on the value "No renewal before" of the applicable issuing rule. Returns the
+current date if the item can already be renewed.
+
+=cut
+
+sub GetSoonestRenewDate {
+ my ( $borrowernumber, $itemnumber ) = @_;
+
+ my $dbh = C4::Context->dbh;
+
+ my $item = GetItem($itemnumber) or return ( 0, 'no_item' );
+ my $itemissue = GetItemIssue($itemnumber) or return ( 0, 'no_checkout' );
+
+ $borrowernumber ||= $itemissue->{borrowernumber};
+ my $borrower = C4::Members::GetMemberDetails($borrowernumber)
+ or return;
+
+ my $branchcode = _GetCircControlBranch( $item, $borrower );
+ my $issuingrule =
+ GetIssuingRule( $borrower->{categorycode}, $item->{itype}, $branchcode );
+
+ my $now = DateTime->now( time_zone => C4::Context->tz() );
+
+ if ( $issuingrule->{norenewalbefore} ) {
+ my $soonestrenewal =
+ $itemissue->{date_due}->subtract(
+ $issuingrule->{lengthunit} => $issuingrule->{norenewalbefore} );
+
+ $soonestrenewal = $now > $soonestrenewal ? $now : $soonestrenewal;
+ return $soonestrenewal;
+ }
+ return $now;
+}
+
=head2 GetIssuingCharges
($charge, $item_type) = &GetIssuingCharges($itemnumber, $borrowernumber);
(!$relatives) ? push @previousissues, $it : push @relprevissues, $it;
}
($it->{'renewcount'},$it->{'renewsallowed'},$it->{'renewsleft'}) = C4::Circulation::GetRenewCount($it->{'borrowernumber'},$it->{'itemnumber'}); #Add renewal count to item data display
+
+ $it->{'soonestrenewdate'} = output_pref(
+ C4::Circulation::GetSoonestRenewDate(
+ $it->{borrowernumber}, $it->{itemnumber}
+ )
+ );
}
}
<input type="checkbox" class="radio" name="items[]" value="[% todayissue.itemnumber %]" />
[% END %]
</span>
- [% IF todayissue.renewsallowed && todayissue.renewsleft %]
+ [% IF todayissue.renewsallowed && todayissue.renewsleft && !todayissue.renew_error_too_soon %]
<span class="renewals">([% todayissue.renewsleft %] of [% todayissue.renewsallowed %] renewals remaining)</span>
[% END %]
<span class="renewals-disabled">
[% END %]
- [% IF ( todayissue.renew_error_on_reserve ) %]
- <a href="/cgi-bin/koha/reserve/request.pl?biblionumber=[% todayissue.biblionumber %]">On hold</a>
- [% END %]
- [% IF ( todayissue.renew_error_too_many ) %]
- Not renewable
- [% END %]
+ [% IF ( todayissue.renew_error_on_reserve ) %]
+ <a href="/cgi-bin/koha/reserve/request.pl?biblionumber=[% todayissue.biblionumber %]">On hold</a>
+ [% ELSIF ( todayissue.renew_error_too_many ) %]
+ Not renewable
+ [% ELSIF ( todayissue.renew_error_too_soon ) %]
+ No renewal before [% todayissue.soonestrenewdate %]
+ <span class="renewals">([% todayissue.renewsleft %] of [% todayissue.renewsallowed %] renewals remaining)</span>
+ [% END %]
[% IF ( todayissue.can_confirm ) %]
</span>
[% END %]
<input type="checkbox" class="radio" name="items[]" value="[% previssue.itemnumber %]" />
[% END %]
</span>
- [% IF previssue.renewsallowed && previssue.renewsleft %]
+ [% IF previssue.renewsallowed && previssue.renewsleft && !previssue.renew_error_too_soon %]
<span class="renewals">([% previssue.renewsleft %] of [% previssue.renewsallowed %] renewals remaining)</span>
[% END %]
<span class="renewals-disabled">
[% END %]
- [% IF ( previssue.renew_error_on_reserve ) %]
- <a href="/cgi-bin/koha/reserve/request.pl?biblionumber=[% previssue.biblionumber %]">On hold</a>
- [% END %]
- [% IF ( previssue.renew_error_too_many ) %]
- Not renewable
- [% END %]
+ [% IF ( previssue.renew_error_on_reserve ) %]
+ <a href="/cgi-bin/koha/reserve/request.pl?biblionumber=[% previssue.biblionumber %]">On Hold</a>
+ [% ELSIF ( previssue.renew_error_too_many ) %]
+ Not renewable
+ [% ELSIF ( previssue.renew_error_too_soon ) %]
+ No renewal before [% previssue.soonestrenewdate %]
+ <span class="renewals">([% previssue.renewsleft %] of [% previssue.renewsallowed %] renewals remaining)</span>
+ [% END %]
[% IF ( previssue.can_confirm ) %]
</span>
[% END %]
<input type="checkbox" name="items[]" value="[% issueloo.itemnumber %]" />
[% END %]
</span>
- [% IF issueloo.renewsallowed && issueloo.renewsleft %]
+ [% IF issueloo.renewsallowed && issueloo.renewsleft && !issueloo.norenew_reason_too_soon %]
<span class="renewals">([% issueloo.renewsleft %] of [% issueloo.renewsallowed %] renewals remaining)</span>
[% END %]
<span class="renewals-disabled">
[% END %]
[% IF ( issueloo.norenew_reason_on_reserve ) %]
- <a href="/cgi-bin/koha/reserve/request.pl?biblionumber=[% issueloo.biblionumber %]">On Hold</a>
+ <a href="/cgi-bin/koha/reserve/request.pl?biblionumber=[% issueloo.biblionumber %]">On Hold</a>
+ [% ELSIF ( issueloo.norenew_reason_too_many ) %]
+ Not renewable
+ [% ELSIF ( issueloo.norenew_reason_too_soon ) %]
+ No renewal before [% issueloo.soonestrenewdate %]
+ <span class="renewals">([% issueloo.renewsleft %] of [% issueloo.renewsallowed %] renewals remaining)</span>
[% END %]
- [% IF ( issueloo.norenew_reason_too_many ) %]
- Not renewable
- [% END %]
[% IF ( issueloo.can_confirm ) %]
</span>
[% END %]
$row{renew_failed} = $renew_failed{ $issue->{itemnumber} };
$row{return_failed} = $return_failed{ $issue->{barcode} };
($row{'renewcount'},$row{'renewsallowed'},$row{'renewsleft'}) = C4::Circulation::GetRenewCount($issue->{'borrowernumber'},$issue->{'itemnumber'}); #Add renewal count to item data display
+
+ $row{'soonestrenewdate'} = output_pref(
+ C4::Circulation::GetSoonestRenewDate(
+ $issue->{borrowernumber},
+ $issue->{itemnumber}
+ )
+ );
+
push( @{$localissue}, \%row );
}
return $localissue;