use C4::Branch; # GetBranches
use C4::Log; # logaction
use C4::Koha qw(GetAuthorisedValueByCode);
+use C4::Overdues qw(CalcFine UpdateFine);
use Data::Dumper;
use Koha::DateUtils;
use Koha::Calendar;
$branches->{$hbr}->{PE} and $messages->{'IsPermanent'} = $hbr;
}
- # if indy branches and returning to different branch, refuse the return
- if ($hbr ne $branch && C4::Context->preference("IndependantBranches")){
+ # if indy branches and returning to different branch, refuse the return unless canreservefromotherbranches is turned on
+ if ($hbr ne $branch && C4::Context->preference("IndependantBranches") && !(C4::Context->preference("canreservefromotherbranches"))){
$messages->{'Wrongbranch'} = {
Wrongbranch => $branch,
Rightbranch => $hbr,
# case of a return of document (deal with issues and holdingbranch)
if ($doreturn) {
+ my $today = DateTime->now( time_zone => C4::Context->tz() );
+ my $datedue = $issue->{date_due};
$borrower or warn "AddReturn without current borrower";
my $circControlBranch;
if ($dropbox) {
# FIXME: check issuedate > returndate, factoring in holidays
#$circControlBranch = _GetCircControlBranch($item,$borrower) unless ( $item->{'issuedate'} eq C4::Dates->today('iso') );;
$circControlBranch = _GetCircControlBranch($item,$borrower);
+ my $datedue = $issue->{date_due};
+ $issue->{'overdue'} = DateTime->compare($issue->{'date_due'}, $today ) == -1 ? 1 : 0;
}
if ($borrowernumber) {
+ if($issue->{'overdue'}){
+ my ( $amount, $type, $daycounttotal ) = C4::Overdues::CalcFine( $item, $borrower->{categorycode},$branch, $datedue, $today );
+ $type ||= q{};
+ if ( $amount > 0 && ( C4::Context->preference('finesMode') eq 'production' )) {
+ C4::Overdues::UpdateFine(
+ $issue->{itemnumber},
+ $issue->{borrowernumber},
+ $amount, $type, output_pref($datedue)
+ );
+ }
+ }
MarkIssueReturned($borrowernumber, $item->{'itemnumber'}, $circControlBranch, '', $borrower->{'privacy'});
$messages->{'WasReturned'} = 1; # FIXME is the "= 1" right? This could be the borrower hash.
}
my $circcontrol = C4::Context::preference('CircControl');
my $issuingrule = GetIssuingRule( $borrower->{categorycode}, $item->{itype}, $branchcode );
my $finedays = $issuingrule->{finedays};
+ my $unit = $issuingrule->{lengthunit};
# exit if no finedays defined
return unless $finedays;
- my $grace = DateTime::Duration->new( days => $issuingrule->{firstremind} );
+ # finedays is in days, so hourly loans must multiply by 24
+ # thus 1 hour late equals 1 day suspension * finedays rate
+ $finedays = $finedays * 24 if ($unit eq 'hours');
+
+ # grace period is measured in the same units as the loan
+ my $grace = DateTime::Duration->new( $unit => $issuingrule->{firstremind} );
if ( ( $deltadays - $grace )->is_positive ) { # you can't compare DateTime::Durations with logical operators
my $new_debar_dt = $dt_today->clone()->add_duration( $deltadays * $finedays );