Bugzilla – Attachment 8782 Details for
Bug 7852
Hourly loan fines are not working
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
[Signed-Off] Use hour or day deltas to calculate overdue durations
Signed-Off-Use-hour-or-day-deltas-to-calculate-ove.patch (text/plain), 5.04 KB, created by
Kyle M Hall
on 2012-04-02 17:03:09 UTC
(
hide
)
Description:
[Signed-Off] Use hour or day deltas to calculate overdue durations
Filename:
MIME Type:
Creator:
Kyle M Hall
Created:
2012-04-02 17:03:09 UTC
Size:
5.04 KB
patch
obsolete
>From fd02e8d0d0ab51e7045ed4f4cc7253904ca0fe92 Mon Sep 17 00:00:00 2001 >From: Colin Campbell <colin.campbell@ptfs-europe.com> >Date: Thu, 15 Sep 2011 12:42:12 +0100 >Subject: [PATCH] [Signed-Off] Use hour or day deltas to calculate overdue durations > >If durations are calculated by subtraction they will use units >larger than those we care about and these are not convertable >to the smaller units we are attempting to enumerate >Use the appropriate delta methods to calculate theee fines > >Adds a separate hours_between method to calendar >This should strictly be checking opening hours (of which >closed days are a special case) of the relevant branch >These need adding to branches > >http://bugs.koha-community.org/show_bug.cgi?id=7852 >Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> >--- > C4/Overdues.pm | 46 ++++++++++++++++++++++++++++------------------ > Koha/Calendar.pm | 23 ++++++++++++++++++++--- > 2 files changed, 48 insertions(+), 21 deletions(-) > >diff --git a/C4/Overdues.pm b/C4/Overdues.pm >index 7676a87..a23acc0 100644 >--- a/C4/Overdues.pm >+++ b/C4/Overdues.pm >@@ -254,29 +254,15 @@ or "Final Notice". But CalcFine never defined any value. > sub CalcFine { > my ( $item, $bortype, $branchcode, $due_dt, $end_date ) = @_; > my $start_date = $due_dt->clone(); >- my $dbh = C4::Context->dbh; >- my $amount = 0; >- my $charge_duration; > # get issuingrules (fines part will be used) > my $data = C4::Circulation::GetIssuingRule($bortype, $item->{itemtype}, $branchcode); >- if(C4::Context->preference('finesCalendar') eq 'noFinesWhenClosed') { >- my $calendar = Koha::Calendar->new( branchcode => $branchcode ); >- $charge_duration = $calendar->days_between( $start_date, $end_date ); >- } else { >- $charge_duration = $end_date - $start_date; >- } >- # correct for grace period. > my $fine_unit = $data->{lengthunit}; > $fine_unit ||= 'days'; >- my $chargeable_units; >- if ($fine_unit eq 'hours') { >- $chargeable_units = $charge_duration->hours(); # TODO closed times??? >- } >- else { >- $chargeable_units = $charge_duration->days; >- } >+ >+ my $chargeable_units = _get_chargeable_units($fine_unit, $start_date, $end_date, $branchcode); > my $days_minus_grace = $chargeable_units - $data->{firstremind}; >- if ($data->{'chargeperiod'} && $days_minus_grace ) { >+ my $amount = 0; >+ if ($data->{'chargeperiod'} && $days_minus_grace ) { > $amount = int($chargeable_units / $data->{'chargeperiod'}) * $data->{'fine'};# TODO fine calc should be in cents > } else { > # a zero (or null) chargeperiod means no charge. >@@ -288,6 +274,30 @@ sub CalcFine { > # FIXME: chargename is NEVER populated anywhere. > } > >+sub _get_chargeable_units { >+ my ($unit, $dt1, $dt2, $branchcode) = @_; >+ my $charge_units = 0; >+ my $charge_duration; >+ if ($unit eq 'hours') { >+ if(C4::Context->preference('finesCalendar') eq 'noFinesWhenClosed') { >+ my $calendar = Koha::Calendar->new( branchcode => $branchcode ); >+ $charge_duration = $calendar->hours_between( $dt1, $dt2 ); >+ } else { >+ $charge_duration = $dt2->delta_ms( $dt1 ); >+ } >+ return $charge_duration->in_units('hours'); >+ } >+ else { # days >+ if(C4::Context->preference('finesCalendar') eq 'noFinesWhenClosed') { >+ my $calendar = Koha::Calendar->new( branchcode => $branchcode ); >+ $charge_duration = $calendar->days_between( $dt1, $dt2 ); >+ } else { >+ $charge_duration = $dt2->delta_days( $dt1 ); >+ } >+ return $charge_duration->in_units('days'); >+ } >+} >+ > > =head2 GetSpecialHolidays > >diff --git a/Koha/Calendar.pm b/Koha/Calendar.pm >index 1e7299c..75c5c9e 100644 >--- a/Koha/Calendar.pm >+++ b/Koha/Calendar.pm >@@ -168,11 +168,9 @@ sub days_between { > my $self = shift; > my $start_dt = shift; > my $end_dt = shift; >- $start_dt->truncate( to => 'hours' ); >- $end_dt->truncate( to => 'hours' ); > > # start and end should not be closed days >- my $duration = $end_dt - $start_dt; >+ my $duration = $end_dt->delta_days($start_dt); > $start_dt->truncate( to => 'days' ); > $end_dt->truncate( to => 'days' ); > while ( DateTime->compare( $start_dt, $end_dt ) == -1 ) { >@@ -185,6 +183,25 @@ sub days_between { > > } > >+sub hours_between { >+ my ($self, $start_dt, $end_dt) = @_; >+ my $duration = $end_dt->delta_ms($start_dt); >+ $start_dt->truncate( to => 'days' ); >+ $end_dt->truncate( to => 'days' ); >+ # NB this is a kludge in that it assumes all days are 24 hours >+ # However for hourly loans the logic should be expanded to >+ # take into account open/close times then it would be a duration >+ # of library open hours >+ while ( DateTime->compare( $start_dt, $end_dt ) == -1 ) { >+ $start_dt->add( days => 1 ); >+ if ( $self->is_holiday($start_dt) ) { >+ $duration->subtract( hours => 24 ); >+ } >+ } >+ return $duration; >+ >+} >+ > sub _mockinit { > my $self = shift; > $self->{weekly_closed_days} = [ 1, 0, 0, 0, 0, 0, 0 ]; # Sunday only >-- >1.7.2.5
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 7852
:
8702
|
8779
|
8780
|
8782
|
8816