show a total range for prorate quotations
authorIvan Kohler <ivan@freeside.biz>
Thu, 29 Jun 2017 20:39:41 +0000 (13:39 -0700)
committerIvan Kohler <ivan@freeside.biz>
Thu, 29 Jun 2017 20:39:41 +0000 (13:39 -0700)
FS/FS/Template_Mixin.pm
FS/FS/quotation.pm

index 758b8ce..2dcf7d0 100644 (file)
@@ -1161,14 +1161,27 @@ sub print_generic {
       if ( $invoice_data{finance_section} &&
            $section->{'description'} eq $invoice_data{finance_section} );
 
-    $section->{'subtotal'} = $other_money_char.
-                             sprintf('%.2f', $section->{'subtotal'})
-      if $multisection;
+    if ( $multisection ) {
+
+      if ( ref($section->{'subtotal'}) ) {
+
+        $section->{'subtotal'} =
+          sprintf("$other_money_char%.2f to $other_money_char%.2f",
+                    $section->{'subtotal'}[0],
+                    $section->{'subtotal'}[1]
+                 );
+
+      } else {
+
+        $section->{'subtotal'} = $other_money_char.
+                                 sprintf('%.2f', $section->{'subtotal'})
 
-    # continue some normalization
-    $section->{'amount'}   = $section->{'subtotal'}
-      if $multisection;
+      }
+
+      # continue some normalization
+      $section->{'amount'}   = $section->{'subtotal'}
 
+    }
 
     if ( $section->{'description'} ) {
       push @buf, ( [ &$escape_function($section->{'description'}), '' ],
@@ -1367,7 +1380,16 @@ sub print_generic {
     foreach ( @new_total_items ) {
       my ($item, $amount) = ($_->{'total_item'}, $_->{'total_amount'});
       $_->{'total_item'}   = &$embolden_function( $item );
-      $_->{'total_amount'} = &$embolden_function( $other_money_char.$amount );
+
+      if ( ref($amount) ) {
+        $_->{'total_amount'} = &$embolden_function(
+                                 $other_money_char.$amount->[0]. ' to '.
+                                 $other_money_char.$amount->[1]
+                               );
+      } else {
+        $_->{'total_amount'} = &$embolden_function( $other_money_char.$amount );
+      }
+
       # but if it's multisection, don't append to @total_items. the adjust
       # section has all this stuff
       push @total_items, $_ if !$multisection;
index f4c68d5..6b0c914 100644 (file)
@@ -138,8 +138,9 @@ sub check {
 
   $self->usernum($FS::CurrentUser::CurrentUser->usernum) unless $self->usernum;
 
-  return 'confidence must be an integer between 1 and 100'
-    if length($self->confidence) && (($self->confidence < 1) || ($self->confidence > 100));
+  return 'confidence percentage must be an integer between 1 and 100'
+    if length($self->confidence)
+    && ( ($self->confidence < 1) || ($self->confidence > 100) );
 
   return 'prospectnum or custnum must be specified'
     if ! $self->prospectnum
@@ -277,9 +278,10 @@ sub _items_sections {
   my %opt = @_;
   my $escape = $opt{escape}; # the only one we care about
 
+
   my %show; # package frequency => 1 if there's anything to display
   my %subtotals = (); # package frequency => subtotal
-  my $disable_total = 0;
+  my $prorate_total = 0;
   foreach my $pkg ($self->quotation_pkg) {
 
     my $part_pkg = $pkg->part_pkg;
@@ -293,7 +295,7 @@ sub _items_sections {
     #this is a shitty hack based on what's in part_pkg/ at the moment
     # but its good enough for the 99% common case of preventing totals from
     # displaying for prorate packages
-    $disable_total = 1
+    $prorate_total = 1
       if $part_pkg->plan =~ /^(prorate|torrus|agent$)/
       || $part_pkg->option('recur_method') eq 'prorate'
       || ( $part_pkg->option('sync_bill_date')
@@ -301,6 +303,9 @@ sub _items_sections {
              && $self->cust_main->billing_pkgs #num_billing_pkgs when we have it
          );
 
+    #possible improvement: keep track of flat vs. prorate totals to make the
+    # bottom range more accurate when mixing flat and prorate packages
+
   }
   my @pkg_freq_order = keys %{ FS::Misc->pkg_freqs };
 
@@ -335,15 +340,31 @@ sub _items_sections {
     };
   }
 
-  unless ( $disable_total || $no_recurring ) {
+  unless ( $no_recurring ) {
     my $total = 0;
     $total += $_ for values %subtotals;
-    push @sections, {
-      'description' => 'First payment',
+    my %total = (
       'sort_weight' => 0,
-      'category'   => 'Total category', #required but what's it used for?
-      'subtotal'    => sprintf('%.2f',$total)
-    };
+      'category'    => 'Total category', #required but what's it used for?
+    );
+
+    if ( $prorate_total ) {
+
+      push @sections, {
+        %total,
+        'description' => 'First payment (depending on day of month)',
+        'subtotal'    => [ $subtotals{0}, $total ],
+      };
+
+    } else {
+
+      push @sections, {
+        %total,
+        'description' => 'First payment',
+        'subtotal'    => $total,
+      };
+    }
+
   }
 
   return \@sections, [];