respect CDR price rounding in invoice details, #72451 and #72330
authorMark Wells <mark@freeside.biz>
Mon, 12 Sep 2016 19:25:21 +0000 (12:25 -0700)
committerMark Wells <mark@freeside.biz>
Mon, 12 Sep 2016 19:25:32 +0000 (12:25 -0700)
FS/FS/detail_format.pm
FS/FS/part_pkg/voip_cdr.pm
FS/FS/part_pkg/voip_tiered.pm

index 78517dd..46c6300 100644 (file)
@@ -35,9 +35,9 @@ a subclass.
 OPTIONS may contain:
 
 - buffer: an arrayref to store details into.  This may avoid the need for a
-large copy operation at the end of processing.  However, since summary formats
-will produce nothing until the end of processing, C<finish> must be called
-after all CDRs have been appended.
+large copy operation at the end of processing.  However, since summary
+formats will produce nothing until the end of processing, C<finish> must be
+called after all CDRs have been appended.
 
 - inbound: a flag telling the formatter to format CDRs for display to the
 receiving party, rather than the originator.  In this case, the
@@ -48,6 +48,9 @@ with the C<inbound> method.
 - locale: a locale string to use for static text and date formats.  This is
 optional.
 
+- rounding: the number of decimal places to show in the amount column. This
+is optional, and defaults to whatever's in the schema (which is 4).
+
 =cut
 
 sub new {
@@ -72,6 +75,7 @@ sub new {
   my $self = { conf => FS::Conf->new({ locale => $locale }),
                csv  => Text::CSV_XS->new({ binary => 1 }),
                inbound  => ($opt{'inbound'} ? 1 : 0),
+               rounding => $opt{'rounding'},
                buffer   => ($opt{'buffer'} || []),
                _lh      => FS::L10N->get_handle($locale),
                _dh      => eval { Date::Language->new($language_name) } ||
@@ -212,6 +216,8 @@ sub single_detail {
   my $object = $self->{inbound} ? $cdr->cdr_termination(1) : $cdr;
   my $price = $object->rated_price if $object;
   $price = 0 if $cdr->freesidestatus eq 'no-charge';
+  $price = sprintf('%.*f', $self->{'rounding'}, $price)
+    if $self->{'rounding'} and length($price);
 
   FS::cust_bill_pkg_detail->new( {
       'acctid'      => ($self->{inbound} ? '' : $cdr->acctid),
@@ -303,7 +309,15 @@ sub price {
   my $object = $self->{inbound} ? $cdr->cdr_termination(1) : $cdr;
   my $price = $object->rated_price if $object;
   $price = '0.00' if $object->freesidestatus eq 'no-charge';
-  length($price) ? $self->money_char . $price : '';
+  $price = sprintf('%.*f', $self->{'rounding'}, $price)
+    if $self->{'rounding'};
+  if (length($price)) {
+    $price = sprintf('%.*f', $self->{'rounding'}, $price)
+      if $self->{'rounding'};
+    return $self->money_char . $price;
+  } else {
+    return '';
+  }
 }
 
 1;
index 7d9a7f5..50ae0af 100644 (file)
@@ -423,7 +423,8 @@ sub calc_usage {
 
   my $formatter = FS::detail_format->new($output_format,
     buffer => $details,
-    locale => $cust_pkg->cust_main->locale
+    locale => $cust_pkg->cust_main->locale,
+    rounding  => ($self->option_cacheable('rounding') || 2),
   );
 
   my $use_duration = $self->option('use_duration');
index 0ad0ff6..d8607a6 100644 (file)
@@ -196,7 +196,10 @@ sub calc_usage {
 
   my $output_format = $self->option('output_format', 'Hush!') || 'default';
 
-  my $formatter = FS::detail_format->new($output_format, buffer => $details);
+  my $formatter = FS::detail_format->new($output_format,
+    buffer => $details,
+    rounding => ($self->option_cacheable('rounding') || 2))
+  ;
 
   my $charges = 0;