X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fdetail_format.pm;h=2417b3aca4091c49a52157d7e009a03aa07fa39b;hb=be0e9e416110d38acdc864a9019bfc47870ee5c2;hp=144aaa75f85484e105c63655ef782aa7988bf5e6;hpb=0d16979c948a691c95ef92f4ac7a2921a9e8c998;p=freeside.git diff --git a/FS/FS/detail_format.pm b/FS/FS/detail_format.pm index 144aaa75f..2417b3aca 100644 --- a/FS/FS/detail_format.pm +++ b/FS/FS/detail_format.pm @@ -5,7 +5,8 @@ use vars qw( $DEBUG ); use FS::Conf; use FS::cdr; use FS::cust_bill_pkg_detail; -use Date::Format qw(time2str); +use FS::L10N; +use Date::Language; use Text::CSV_XS; my $me = '[FS::detail_format]'; @@ -44,6 +45,9 @@ OPTIONS may contain: rated_price, rated_seconds, rated_minutes, and svcnum. This can be changed with the C method. +- locale: a locale string to use for static text and date formats. This + is optional. + =cut sub new { @@ -58,11 +62,21 @@ sub new { die "$me error loading $class: $@" if $@; my %opt = @_; - my $self = { conf => FS::Conf->new, - csv => Text::CSV_XS->new, + my $locale = $opt{'locale'} || ''; + my $conf = FS::Conf->new(locale => $locale); + $locale ||= $conf->config('locale') || 'en_US'; + + my %locale_info = FS::Locales->locale_info($locale); + my $language_name = $locale_info{'name'}; + + my $self = { conf => FS::Conf->new(locale => $locale), + csv => Text::CSV_XS->new({ binary => 1 }), inbound => ($opt{'inbound'} ? 1 : 0), buffer => ($opt{'buffer'} || []), - }; + _lh => FS::L10N->get_handle($locale), + _dh => eval { Date::Language->new($language_name) } || + Date::Language->new() + }; bless $self, $class; } @@ -139,7 +153,7 @@ sub header { my $self = shift; FS::cust_bill_pkg_detail->new( - { 'format' => 'C', 'detail' => $self->header_detail } + { 'format' => 'C', 'detail' => $self->mt($self->header_detail) } ) } @@ -171,8 +185,12 @@ sub single_detail { die "$me error combining ".$self->csv->error_input."\n" if !$status; + my $object = $self->{inbound} ? $cdr->cdr_termination(1) : $cdr; + my $price = $object->rated_price if $object; + $price = 0 if $cdr->freesidestatus eq 'no-charge'; + FS::cust_bill_pkg_detail->new( { - 'amount' => $cdr->rated_price, + 'amount' => $price, 'classnum' => $cdr->rated_classnum, 'duration' => $cdr->rated_seconds, 'regionname' => $cdr->rated_regionname, @@ -224,6 +242,18 @@ sub money_char { $self->{money_char} ||= ($self->conf->config('money_char') || '$'); } +# localization methods + +sub time2str_local { + my $self = shift; + $self->{_dh}->time2str(@_); +} + +sub mt { + my $self = shift; + $self->{_lh}->maketext(@_); +} + #imitate previous behavior for now sub duration { @@ -231,6 +261,7 @@ sub duration { my $cdr = shift; my $object = $self->{inbound} ? $cdr->cdr_termination(1) : $cdr; my $sec = $object->rated_seconds if $object; + $sec ||= 0; # XXX termination objects don't have rated_granularity so this may # result in inbound CDRs being displayed as min/sec when they shouldn't. # Should probably fix this. @@ -250,6 +281,7 @@ sub price { my $cdr = shift; 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 : ''; }