[freeside-commits] branch FREESIDE_2_3_BRANCH updated. d8579d516be5964761aff5822a062504931df5cd

Mark Wells mark at 420.am
Thu Apr 11 14:31:18 PDT 2013


The branch, FREESIDE_2_3_BRANCH has been updated
       via  d8579d516be5964761aff5822a062504931df5cd (commit)
      from  212125689a2917ac15fac93d81dc26df21c291fd (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit d8579d516be5964761aff5822a062504931df5cd
Author: Mark Wells <mark at freeside.biz>
Date:   Thu Apr 11 14:23:30 2013 -0700

    improve deferred prorate billing with period > 1 month, #22311

diff --git a/FS/FS/part_pkg/prorate_Mixin.pm b/FS/FS/part_pkg/prorate_Mixin.pm
index f027c29..91b6f97 100644
--- a/FS/FS/part_pkg/prorate_Mixin.pm
+++ b/FS/FS/part_pkg/prorate_Mixin.pm
@@ -67,11 +67,11 @@ the base price per billing cycle.
 
 Options:
 - add_full_period: Bill for the time up to the prorate day plus one full
-billing period after that.
+  billing period after that.
 - prorate_round_day: Round the current time to the nearest full day, 
-instead of using the exact time.
+  instead of using the exact time.
 - prorate_defer_bill: Don't bill the prorate interval until the prorate 
-day arrives.
+  day arrives.
 - prorate_verbose: Generate details to explain the prorate calculations.
 
 =cut
@@ -123,31 +123,46 @@ sub calc_prorate {
 
   my $permonth = $charge / $self->freq;
   my $months = ( ( $self->freq - 1 ) + ($mend-$mnow) / ($mend-$mstart) );
-
-  if ( $self->option('prorate_verbose',1) 
-      and $months > 0 and $months < $self->freq ) {
-    push @$details, 
-          'Prorated (' . time2str('%b %d', $mnow) .
-            ' - ' . time2str('%b %d', $mend) . '): ' . $money_char . 
-            sprintf('%.2f', $permonth * $months + 0.00000001 );
-  }
+  # after this, $self->freq - 1 < $months <= $self->freq
 
   # add a full period if currently billing for a partial period
   # or periods up to freq_override if billing for an override interval
   if ( ($param->{'freq_override'} || 0) > 1 ) {
     $months += $param->{'freq_override'} - 1;
-  } 
-  elsif ( $add_period && $months < $self->freq) {
+    # freq_override - 1 correct here?
+    # (probably only if freq == 1, yes?)
+  } elsif ( $add_period && $months < $self->freq ) {
+
+    # 'add_period' is a misnomer.
+    # we add enough to make the total at least a full period
+    $months++;
+    $$sdate = $self->add_freq($mstart, 1);
+    # now $self->freq <= $months <= $self->freq + 1
+    # (note that this only happens if $months < $self->freq to begin with)
 
-    if ( $self->option('prorate_verbose',1) ) {
-      # calculate the prorated and add'l period charges
+  }
+
+  if ( $self->option('prorate_verbose',1) and $months > 0 ) {
+    if ( $months < $self->freq ) {
+      # we are billing a fractional period only
+      #       # (though maybe not a fractional month)
+      my $period_end = $self->add_freq($mstart);
+      push @$details, 
+      'Prorated (' . time2str('%b %d', $mnow) .
+      ' - ' . time2str('%b %d', $period_end) . '): ' . $money_char .
+      sprintf('%.2f', $permonth * $months + 0.00000001 );
+
+    } elsif ( $months > $self->freq ) {
+      # we are billing MORE than a full period
       push @$details,
-        'First full month: ' . $money_char . 
-          sprintf('%.2f', $permonth);
-    }
 
-    $months += $self->freq;
-    $$sdate = $self->add_freq($mstart);
+      'Prorated (' . time2str('%b %d', $mnow) .
+      ' - ' . time2str('%b %d', $mend) . '): ' . $money_char .
+      sprintf('%.2f', $permonth * ($months - $self->freq + 0.0000001)),
+
+      'First full period: ' . $money_char .
+      sprintf('%.2f', $permonth * $self->freq);
+    } # else $months == $self->freq, and no prorating has happened
   }
 
   $param->{'months'} = $months;

-----------------------------------------------------------------------

Summary of changes:
 FS/FS/part_pkg/prorate_Mixin.pm |   55 ++++++++++++++++++++++++--------------
 1 files changed, 35 insertions(+), 20 deletions(-)




More information about the freeside-commits mailing list