RT# 77964 - Placed waive setup fee check back to billing.pm, and added check for...
[freeside.git] / FS / FS / part_pkg / flat.pm
index 504def0..cfee584 100644 (file)
@@ -15,6 +15,7 @@ use Tie::IxHash;
 use List::Util qw( min );
 use FS::UI::bytecount;
 use FS::Conf;
+use Time::Local 'timelocal';
 
 #ask FS::UID to run this stuff for us later
 FS::UID->install_callback( sub {
@@ -127,12 +128,13 @@ sub calc_setup {
 
   my $discount = 0;
   if ( $charge > 0 ) {
-      $param->{'setup_charge'} = $charge;
-      $discount = $self->calc_discount($cust_pkg, $sdate, $details, $param);
-      delete $param->{'setup_charge'};
+    $param->{'setup_charge'} = $charge;
+    $discount = $self->calc_discount($cust_pkg, $sdate, $details, $param);
+    delete $param->{'setup_charge'};
   }
 
   sprintf( '%.2f', ($cust_pkg->quantity || 1) * ($charge - $discount) );
+
 }
 
 sub base_setup {
@@ -182,13 +184,27 @@ sub cutoff_day {
   if ( $self->option('sync_bill_date',1) ) {
     my $next_bill = $cust_pkg->cust_main->next_bill_date;
     if ( $next_bill ) {
-      # careful here. if the prorate calculation is going to round to 
-      # the nearest day, this needs to always return the same result
-      if ( $self->option('prorate_round_day', 1) ) {
-        my $hour = (localtime($next_bill))[2];
-        $next_bill += 64800 if $hour >= 12;
-      }
       return (localtime($next_bill))[3];
+    } else {
+      # This is the customer's only active package and hasn't been billed
+      # yet, so set the cutoff day to either today or tomorrow, whichever
+      # would result in a full period after rounding.
+      my $setup = $cust_pkg->setup; # because it's "now"
+      my $rounding_mode = $self->option('prorate_round_day',1);
+      return () if !$setup or !$rounding_mode;
+      my ($sec, $min, $hour, $mday, $mon, $year) = localtime($setup);
+
+      if (   ( $rounding_mode == 1 and $hour >= 12 )
+          or ( $rounding_mode == 3 and ( $sec > 0 or $min > 0 or $hour > 0 ))
+      ) {
+        # then the prorate period will be rounded down to start from
+        # midnight tomorrow, so the cutoff day should be the current day +
+        # 1.
+        $setup = timelocal(59,59,23,$mday,$mon,$year) + 1;
+        $mday = (localtime($setup))[3];
+      }
+      # otherwise, it will be rounded up, so leave the cutoff day at today.
+      return $mday;
     }
   }
   return ();