use Data::Dumper;
use Koha::DateUtils;
use Koha::Calendar;
+use Koha::Borrower::Debarments;
use Carp;
use Date::Calc qw(
Today
&GetOpenIssue
&AnonymiseIssueHistory
&CheckIfIssuedToPatron
+ &IsItemIssued
);
# subs to deal with returns
my $sth = $dbh->prepare("SELECT notforloan FROM itemtypes WHERE itemtype = ?");
$sth->execute($item->{'itemtype'});
my $notforloan=$sth->fetchrow_hashref();
- $sth->finish();
if ($notforloan->{'notforloan'}) {
if (!C4::Context->preference("AllowNotForLoanOverride")) {
$issuingimpossible{NOT_FOR_LOAN} = 1;
# find reserves.....
# if we don't have a reserve with the status W, we launch the Checkreserves routine
my ($resfound, $resrec);
- ($resfound, $resrec, undef) = C4::Reserves::CheckReserves( $item->{'itemnumber'} ) unless ( $item->{'withdrawn'} );
+ my $lookahead= C4::Context->preference('ConfirmFutureHolds'); #number of days to look for future holds
+ ($resfound, $resrec, undef) = C4::Reserves::CheckReserves( $item->{'itemnumber'}, undef, $lookahead ) unless ( $item->{'withdrawn'} );
if ($resfound) {
$resrec->{'ResFound'} = $resfound;
$messages->{'ResFound'} = $resrec;
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 .
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();
}
}
(?,?,?,?)");
$usth->execute($data->{'borrowernumber'},$accdata->{'accountno'},$nextaccntno,$newamtos);
}
- $msth->finish; # $msth might actually have data left
}
$amountleft *= -1 if ($amountleft > 0);
my $desc = "Item Returned " . $item_id;
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
my $sth = $dbh->prepare( $statement );
$sth->execute( @bind_parameters );
my $upcoming_dues = $sth->fetchall_arrayref({});
- $sth->finish;
return $upcoming_dues;
}
=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);
=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;
- $sth->finish;
- 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.
);
$sth->execute( $datedue->strftime('%Y-%m-%d %H:%M'), $renews, $lastreneweddate, $borrowernumber, $itemnumber );
- $sth->finish;
# Update the renewal count on the item, and tell zebra to reindex
$renews = $biblio->{'renewals'} + 1;
}
}
+ # 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;
$sth->execute( $bornum, $itemno );
my $data = $sth->fetchrow_hashref;
$renewcount = $data->{'renewals'} if $data->{'renewals'};
- $sth->finish;
# $item and $borrower should be calculated
my $branchcode = _GetCircControlBranch($item, $borrower);
}
}
- $sth->finish; # we havent _explicitly_ fetched all rows
return ( $charge, $item_type );
}
";
my $sth = $dbh->prepare($query);
$sth->execute( $borrowernumber, $itemnumber, $nextaccntno, $charge, $charge, $manager_id );
- $sth->finish;
}
=head2 GetTransfers
my $sth = $dbh->prepare($query);
$sth->execute($itemnumber);
my @row = $sth->fetchrow_array();
- $sth->finish;
return @row;
}
while ( my $data = $sth->fetchrow_hashref ) {
push @gettransfers, $data;
}
- $sth->finish;
return (@gettransfers);
}
sub DeleteTransfer {
my ($itemnumber) = @_;
+ return unless $itemnumber;
my $dbh = C4::Context->dbh;
my $sth = $dbh->prepare(
"DELETE FROM branchtransfers
WHERE itemnumber=?
AND datearrived IS NULL "
);
- $sth->execute($itemnumber);
- $sth->finish;
+ return $sth->execute($itemnumber);
}
=head2 AnonymiseIssueHistory
"update branchtransfers set datearrived = now(),tobranch=?,comments='wrongtransfer' where itemnumber= ? AND datearrived IS NULL"
);
$sth->execute($FromLibrary,$itemNumber);
- $sth->finish;
# second step create a new line of branchtransfer to the right location .
ModItemTransfer($itemNumber, $FromLibrary, $waitingAtLibrary);
my $sth = $dbh->prepare($query);
$sth->execute($branchcode,$week_day);
my $result=$sth->fetchrow;
-$sth->finish;
return $result;
}
my $sth = $dbh->prepare($query);
$sth->execute($years,$month,$day,$branchcode);
my $countspecial=$sth->fetchrow ;
-$sth->finish;
return $countspecial;
}
my $sth = $dbh->prepare($query);
$sth->execute($month,$day,$branchcode);
my $countspecial=$sth->fetchrow ;
-$sth->finish;
return $countspecial;
}
my $sth = $dbh->prepare($query);
$sth->execute($barcode);
my $exist=$sth->fetchrow ;
-$sth->finish;
return $exist;
}
WHERE issues.itemnumber=?");
$sth->execute($itemnumber);
my $issues=$sth->fetchrow_hashref();
- $sth->finish;
# If a borrower lost the item, add a replacement cost to the their record
if ( my $borrowernumber = $issues->{borrowernumber} ){
my $sth = $dbh->prepare("SELECT * FROM pending_offline_operations WHERE branchcode=? ORDER BY timestamp");
$sth->execute(C4::Context->userenv->{'branch'});
my $results = $sth->fetchall_arrayref({});
- $sth->finish;
return $results;
}
sub GetOfflineOperation {
+ my $operationid = shift;
+ return unless $operationid;
my $dbh = C4::Context->dbh;
my $sth = $dbh->prepare("SELECT * FROM pending_offline_operations WHERE operationid=?");
- $sth->execute( shift );
- my $result = $sth->fetchrow_hashref;
- $sth->finish;
- return $result;
+ $sth->execute( $operationid );
+ return $sth->fetchrow_hashref;
}
sub AddOfflineOperation {
return;
}
+=head2 IsItemIssued
+
+ IsItemIssued( $itemnumber )
+
+ Return 1 if the item is on loan, otherwise return 0
+
+=cut
+
+sub IsItemIssued {
+ my $itemnumber = shift;
+ my $dbh = C4::Context->dbh;
+ my $sth = $dbh->prepare(q{
+ SELECT COUNT(*)
+ FROM issues
+ WHERE itemnumber = ?
+ });
+ $sth->execute($itemnumber);
+ return $sth->fetchrow;
+}
1;