X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=C4%2FCirculation.pm;h=0a22b76a85b60632b1abdca4b33967af3969fe55;hb=e52b493611766b61a0018350adc590ab07e9c94b;hp=6516eddd7ea67510dc8b86ce198fa2b3f5ccb36f;hpb=924c4f69e07ca2072900187cfd082299964a4ad6;p=koha_fer diff --git a/C4/Circulation.pm b/C4/Circulation.pm index 6516eddd7e..0a22b76a85 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -47,6 +47,7 @@ use Algorithm::CheckDigits; use Data::Dumper; use Koha::DateUtils; use Koha::Calendar; +use Koha::Borrower::Debarments; use Carp; use Date::Calc qw( Today @@ -1920,6 +1921,16 @@ sub AddReturn { logaction("CIRCULATION", "RETURN", $borrowernumber, $item->{'itemnumber'}) if C4::Context->preference("ReturnLog"); + # Remove any OVERDUES related debarment if the borrower has no overdues + if ( $borrowernumber + && $borrower->{'debarred'} + && C4::Context->preference('AutoRemoveOverduesRestrictions') + && !HasOverdues( $borrowernumber ) + && @{ GetDebarments({ borrowernumber => $borrowernumber, type => 'OVERDUES' }) } + ) { + DelUniqueDebarment({ borrowernumber => $borrowernumber, type => 'OVERDUES' }); + } + # FIXME: make this comment intelligible. #adding message if holdingbranch is non equal a userenv branch to return the document to homebranch #we check, if we don't have reserv or transfert for this document, if not, return it to homebranch . @@ -2053,19 +2064,13 @@ sub _debar_user_on_return { my $new_debar_dt = $dt_today->clone()->add_duration( $deltadays * $finedays ); - if ( $borrower->{debarred} ) { - my $borrower_debar_dt = dt_from_string( $borrower->{debarred} ); - # Update patron only if new date > old - if ( DateTime->compare( $borrower_debar_dt, $new_debar_dt ) != - -1 ) - { - return; - } + Koha::Borrower::Debarments::AddUniqueDebarment({ + borrowernumber => $borrower->{borrowernumber}, + expiration => $new_debar_dt->ymd(), + type => 'SUSPENSION', + }); - } - C4::Members::DebarMember( $borrower->{borrowernumber}, - $new_debar_dt->ymd() ); return $new_debar_dt->ymd(); } } @@ -2311,12 +2316,12 @@ Returns a hashref sub GetOpenIssue { my ( $itemnumber ) = @_; - + return unless $itemnumber; my $dbh = C4::Context->dbh; my $sth = $dbh->prepare( "SELECT * FROM issues WHERE itemnumber = ? AND returndate IS NULL" ); $sth->execute( $itemnumber ); - my $issue = $sth->fetchrow_hashref(); - return $issue; + return $sth->fetchrow_hashref(); + } =head2 GetItemIssues @@ -2428,7 +2433,7 @@ FROM issues LEFT JOIN items USING (itemnumber) LEFT OUTER JOIN branches USING (branchcode) WHERE returndate is NULL -HAVING days_until_due > 0 AND days_until_due < ? +HAVING days_until_due >= 0 AND days_until_due <= ? END_SQL my @bind_parameters = ( $params->{'days_in_advance'} ); @@ -2463,17 +2468,19 @@ already renewed the loan. $error will contain the reason the renewal can not pro =cut sub CanBookBeRenewed { - - # check renewal status my ( $borrowernumber, $itemnumber, $override_limit ) = @_; + my $dbh = C4::Context->dbh; my $renews = 1; my $renewokay = 0; my $error; - my $borrower = C4::Members::GetMemberDetails( $borrowernumber, 0 ) or return; - my $item = GetItem($itemnumber) or return; - my $itemissue = GetItemIssue($itemnumber) or return; + 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); @@ -2520,27 +2527,32 @@ from the book's item type. =cut sub AddRenewal { - my $borrowernumber = shift or return; + my $borrowernumber = shift; my $itemnumber = shift or return; my $branch = shift; my $datedue = shift; my $lastreneweddate = shift || DateTime->now(time_zone => C4::Context->tz)->ymd(); + my $item = GetItem($itemnumber) or return; my $biblio = GetBiblioFromItemNumber($itemnumber) or return; my $dbh = C4::Context->dbh; + # Find the issues record for this book my $sth = - $dbh->prepare("SELECT * FROM issues - WHERE borrowernumber=? - AND itemnumber=?" - ); - $sth->execute( $borrowernumber, $itemnumber ); + $dbh->prepare("SELECT * FROM issues WHERE itemnumber = ?"); + $sth->execute( $itemnumber ); my $issuedata = $sth->fetchrow_hashref; - if(defined $datedue && ref $datedue ne 'DateTime' ) { + + return unless ( $issuedata ); + + $borrowernumber ||= $issuedata->{borrowernumber}; + + if ( defined $datedue && ref $datedue ne 'DateTime' ) { carp 'Invalid date passed to AddRenewal.'; return; } + # If the due date wasn't specified, calculate it by adding the # book's loan length to today's date or the current due date # based on the value of the RenewalPeriodBase syspref. @@ -2607,6 +2619,16 @@ sub AddRenewal { } } + # Remove any OVERDUES related debarment if the borrower has no overdues + my $borrower = C4::Members::GetMember( borrowernumber => $borrowernumber ); + if ( $borrowernumber + && $borrower->{'debarred'} + && !HasOverdues( $borrowernumber ) + && @{ GetDebarments({ borrowernumber => $borrowernumber, type => 'OVERDUES' }) } + ) { + DelUniqueDebarment({ borrowernumber => $borrowernumber, type => 'OVERDUES' }); + } + # Log the renewal UpdateStats( $branch, 'renew', $charge, '', $itemnumber, $item->{itype}, $borrowernumber, undef, $item->{'ccode'}); return $datedue;