From: Mark Wells Date: Mon, 12 Sep 2016 19:25:21 +0000 (-0700) Subject: respect CDR price rounding in invoice details, #72451 and #72330 X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=17956978685bcc30c8532c94b89b4d481d337c4e respect CDR price rounding in invoice details, #72451 and #72330 --- diff --git a/FS/FS/detail_format.pm b/FS/FS/detail_format.pm index 78517dd5b..46c6300ad 100644 --- a/FS/FS/detail_format.pm +++ b/FS/FS/detail_format.pm @@ -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 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 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 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; diff --git a/FS/FS/part_pkg/voip_cdr.pm b/FS/FS/part_pkg/voip_cdr.pm index 7d9a7f5c9..50ae0af7c 100644 --- a/FS/FS/part_pkg/voip_cdr.pm +++ b/FS/FS/part_pkg/voip_cdr.pm @@ -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'); diff --git a/FS/FS/part_pkg/voip_tiered.pm b/FS/FS/part_pkg/voip_tiered.pm index 0ad0ff6bf..d8607a69e 100644 --- a/FS/FS/part_pkg/voip_tiered.pm +++ b/FS/FS/part_pkg/voip_tiered.pm @@ -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;