From 0dd05e9ff98263d2d42b419b1e278a5a3bc594b2 Mon Sep 17 00:00:00 2001 From: jeff Date: Thu, 12 Apr 2007 03:16:43 +0000 Subject: [PATCH] input and output on data volume fields specified with k,m,g,or t --- FS/FS/Conf.pm | 14 +++++++++++ FS/FS/UI/Web.pm | 26 ++++++++++++++++++++ FS/FS/part_pkg.pm | 33 +++++++++++++++++++++++++ FS/FS/part_pkg/flat.pm | 16 ++++++++++++ FS/FS/part_svc.pm | 8 ++++-- FS/FS/svc_acct.pm | 47 ++++++++++++++++++++++++++++++++++++ FS/bin/freeside-queued | 1 + httemplate/browse/part_pkg.cgi | 2 +- httemplate/browse/part_svc.cgi | 5 +++- httemplate/edit/part_pkg.cgi | 4 ++- httemplate/edit/part_svc.cgi | 7 +++--- httemplate/edit/process/part_pkg.cgi | 8 +++++- httemplate/edit/process/svc_acct.cgi | 5 ++++ httemplate/edit/svc_acct.cgi | 28 ++++++++++----------- httemplate/view/svc_acct.cgi | 15 ++++-------- 15 files changed, 186 insertions(+), 33 deletions(-) diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm index 374b58341..8bff460fe 100644 --- a/FS/FS/Conf.pm +++ b/FS/FS/Conf.pm @@ -1755,6 +1755,20 @@ httemplate/docs/config.html 'type' => 'checkbox', }, + { + 'key' => 'datavolume-forcemegabytes', + 'section' => 'UI', + 'description' => 'All data volumes are expressed in megabytes', + 'type' => 'checkbox', + }, + + { + 'key' => 'datavolume-significantdigits', + 'section' => 'UI', + 'description' => 'number of significant digits to use to represent data volumes', + 'type' => 'text', + }, + ); 1; diff --git a/FS/FS/UI/Web.pm b/FS/FS/UI/Web.pm index 9ddcf142d..a05a667b3 100644 --- a/FS/FS/UI/Web.pm +++ b/FS/FS/UI/Web.pm @@ -4,6 +4,7 @@ use strict; use vars qw($DEBUG $me); use FS::Conf; use FS::Record qw(dbdef); +use Number::Format; #use vars qw(@ISA); #use FS::UI @@ -186,6 +187,31 @@ sub bytecount_unexact { return(sprintf("%.2f Gbytes", $bc/1000000000)); } +sub parse_bytecount { + my $bc = shift; + return $bc if (($bc =~ tr/.//) > 1); + $bc =~ /^\s*([\d.]*)\s*([kKmMgGtT]?)[bB]?\s*$/ or return $bc; + my $base = $1; + return $bc unless length $base; + my $exponent = index ' kmgt', lc($2); + return $bc if ($exponent < 0 && $2); + $exponent = 0 if ($exponent < 0); + return $base * 1024 ** $exponent; +} + +sub display_bytecount { + my $bc = shift; + return $bc unless ($bc =~ /^(\d+)$/); + my $conf = new FS::Conf; + my $f = new Number::Format; + my $precision = $conf->exists('datavolume-significantdigits') + ? $conf->config('datavolume-significantdigits') + : 3; + my $unit = $conf->exists('datavolume-forcemegabytes') ? 'M' : 'A'; + + return $f->format_bytes($bc, precision => $precision, unit => $unit); +} + ### # cust_main report subroutines ### diff --git a/FS/FS/part_pkg.pm b/FS/FS/part_pkg.pm index 03222fa49..3110c1cfa 100644 --- a/FS/FS/part_pkg.pm +++ b/FS/FS/part_pkg.pm @@ -817,6 +817,39 @@ sub plan_info { \%plans; } +=item format OPTION DATA + +Returns data formatted according to the function 'format' described +in the plan info. Returns DATA if no such function exists. + +=cut + +sub format { + my ($self, $option, $data) = (shift, shift, shift); + if (exists($plans{$self->plan}->{fields}->{$option}{format})) { + &{$plans{$self->plan}->{fields}->{$option}{format}}($data); + }else{ + $data; + } +} + +=item prase OPTION DATA + +Returns data parsed according to the function 'parse' described +in the plan info. Returns DATA if no such function exists. + +=cut + +sub parse { + my ($self, $option, $data) = (shift, shift, shift); + if (exists($plans{$self->plan}->{fields}->{$option}{parse})) { + &{$plans{$self->plan}->{fields}->{$option}{parse}}($data); + }else{ + $data; + } +} + + =back =head1 NEW PLAN CLASSES diff --git a/FS/FS/part_pkg/flat.pm b/FS/FS/part_pkg/flat.pm index 94b7d9947..c0fbb5a7f 100644 --- a/FS/FS/part_pkg/flat.pm +++ b/FS/FS/part_pkg/flat.pm @@ -28,27 +28,43 @@ use FS::part_pkg; }, 'upbytes' => { 'name' => 'Upload limit for this package', 'default' => '', + 'format' => \&FS::UI::Web::display_bytecount, + 'parse' => \&FS::UI::Web::parse_bytecount, }, 'downbytes' => { 'name' => 'Download limit for this package', 'default' => '', + 'format' => \&FS::UI::Web::display_bytecount, + 'parse' => \&FS::UI::Web::parse_bytecount, }, 'totalbytes' => { 'name' => 'Transfer limit for this package', 'default' => '', + 'format' => \&FS::UI::Web::display_bytecount, + 'parse' => \&FS::UI::Web::parse_bytecount, }, 'recharge_amount' => { 'name' => 'Cost of recharge for this package', 'default' => '', + 'format' => \&FS::UI::Web::display_bytecount, + 'parse' => \&FS::UI::Web::parse_bytecount, }, 'recharge_seconds' => { 'name' => 'Recharge time for this package', 'default' => '', + 'format' => \&FS::UI::Web::display_bytecount, + 'parse' => \&FS::UI::Web::parse_bytecount, }, 'recharge_upbytes' => { 'name' => 'Recharge upload for this package', 'default' => '', + 'format' => \&FS::UI::Web::display_bytecount, + 'parse' => \&FS::UI::Web::parse_bytecount, }, 'recharge_downbytes' => { 'name' => 'Recharge download for this package', 'default' => '', + 'format' => \&FS::UI::Web::display_bytecount, + 'parse' => \&FS::UI::Web::parse_bytecount, }, 'recharge_totalbytes' => { 'name' => 'Recharge transfer for this package', 'default' => '', + 'format' => \&FS::UI::Web::display_bytecount, + 'parse' => \&FS::UI::Web::parse_bytecount, }, }, 'fieldorder' => [ 'setup_fee', 'recur_fee', 'unused_credit', diff --git a/FS/FS/part_svc.pm b/FS/FS/part_svc.pm index 5b4e54cc2..4fae457e2 100644 --- a/FS/FS/part_svc.pm +++ b/FS/FS/part_svc.pm @@ -145,9 +145,11 @@ sub insert { my $flag = $self->getfield($svcdb.'__'.$field.'_flag'); #if ( uc($flag) =~ /^([DFMAX])$/ ) { if ( uc($flag) =~ /^([A-Z])$/ ) { #part_svc_column will test it + my $parser = FS::part_svc->svc_table_fields($svcdb)->{$field}->{parse} + || sub { shift }; $part_svc_column->setfield('columnflag', $1); $part_svc_column->setfield('columnvalue', - $self->getfield($svcdb.'__'.$field) + &$parser($self->getfield($svcdb.'__'.$field)) ); if ( $previous ) { $error = $part_svc_column->replace($previous); @@ -264,9 +266,11 @@ sub replace { my $flag = $new->getfield($svcdb.'__'.$field.'_flag'); #if ( uc($flag) =~ /^([DFMAX])$/ ) { if ( uc($flag) =~ /^([A-Z])$/ ) { #part_svc_column will test it + my $parser = FS::part_svc->svc_table_fields($svcdb)->{$field}->{parse} + || sub { shift }; $part_svc_column->setfield('columnflag', $1); $part_svc_column->setfield('columnvalue', - $new->getfield($svcdb.'__'.$field) + &$parser($new->getfield($svcdb.'__'.$field)) ); if ( $previous ) { $error = $part_svc_column->replace($previous); diff --git a/FS/FS/svc_acct.pm b/FS/FS/svc_acct.pm index 1ef211946..be5a6d35e 100644 --- a/FS/FS/svc_acct.pm +++ b/FS/FS/svc_acct.pm @@ -273,6 +273,53 @@ sub table_info { disable_inventory => 1, disable_select => 1, }, + 'upbytes' => { label => 'Upload', + type => 'text', + disable_inventory => 1, + disable_select => 1, + 'format' => \&FS::UI::Web::display_bytecount, + 'parse' => \&FS::UI::Web::parse_bytecount, + }, + 'downbytes' => { label => 'Download', + type => 'text', + disable_inventory => 1, + disable_select => 1, + 'format' => \&FS::UI::Web::display_bytecount, + 'parse' => \&FS::UI::Web::parse_bytecount, + }, + 'totalbytes'=> { label => 'Total up and download', + type => 'text', + disable_inventory => 1, + disable_select => 1, + 'format' => \&FS::UI::Web::display_bytecount, + 'parse' => \&FS::UI::Web::parse_bytecount, + }, + 'seconds_threshold' => { label => 'Seconds', + type => 'text', + disable_inventory => 1, + disable_select => 1, + }, + 'upbytes_threshold' => { label => 'Upload', + type => 'text', + disable_inventory => 1, + disable_select => 1, + 'format' => \&FS::UI::Web::display_bytecount, + 'parse' => \&FS::UI::Web::parse_bytecount, + }, + 'downbytes_threshold' => { label => 'Download', + type => 'text', + disable_inventory => 1, + disable_select => 1, + 'format' => \&FS::UI::Web::display_bytecount, + 'parse' => \&FS::UI::Web::parse_bytecount, + }, + 'totalbytes_threshold'=> { label => 'Total up and download', + type => 'text', + disable_inventory => 1, + disable_select => 1, + 'format' => \&FS::UI::Web::display_bytecount, + 'parse' => \&FS::UI::Web::parse_bytecount, + }, }, }; } diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 93d735d1a..b3128f08f 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -9,6 +9,7 @@ use FS::Daemon qw(daemonize1 drop_root logfile daemonize2 sigint sigterm); use FS::Record qw(qsearch qsearchs); use FS::queue; use FS::queue_depend; +use FS::UI::Web; # no autoloading for non-FS classes... use Net::SSH 0.07; diff --git a/httemplate/browse/part_pkg.cgi b/httemplate/browse/part_pkg.cgi index 6b62ec67b..5acf17ef2 100755 --- a/httemplate/browse/part_pkg.cgi +++ b/httemplate/browse/part_pkg.cgi @@ -189,7 +189,7 @@ push @fields, sub { shift->plan || '(legacy)' }, { 'data' => $1, 'align' => 'right', }, - { 'data' => $2, + { 'data' => $part_pkg->format($1,$2), 'align' => 'left', }, ]; diff --git a/httemplate/browse/part_svc.cgi b/httemplate/browse/part_svc.cgi index 369495571..92c0840b0 100755 --- a/httemplate/browse/part_svc.cgi +++ b/httemplate/browse/part_svc.cgi @@ -135,6 +135,9 @@ function part_export_areyousure(href) { % % my($n1)=''; % foreach my $field ( @fields ) { +% my $formatter = +% FS::part_svc->svc_table_fields($svcdb)->{$field}->{format} +% || sub { shift }; % my $flag = $part_svc->part_svc_column($field)->columnflag; % @@ -143,7 +146,7 @@ function part_export_areyousure(href) { <% $flag{$flag} %> -% my $value = $part_svc->part_svc_column($field)->columnvalue; +% my $value = &$formatter($part_svc->part_svc_column($field)->columnvalue); % if ( $flag =~ /^[MA]$/ ) { % $inventory_class{$value} % ||= qsearchs('inventory_class', { 'classnum' => $value } ); diff --git a/httemplate/edit/part_pkg.cgi b/httemplate/edit/part_pkg.cgi index ce3e8547f..bdd3f304a 100755 --- a/httemplate/edit/part_pkg.cgi +++ b/httemplate/edit/part_pkg.cgi @@ -323,10 +323,12 @@ Reseller information % % $html .= ''. $href->{$field}{'name'}. ''; % +% my $format = sub { shift }; +% $format = $href->{$field}{'format'} if exists($href->{$field}{'format'}); % if ( ! exists($href->{$field}{'type'}) ) { % $html .= qq!!; % } elsif ( $href->{$field}{'type'} eq 'checkbox' ) { diff --git a/httemplate/edit/part_svc.cgi b/httemplate/edit/part_svc.cgi index 6ba9240e3..9432839e7 100755 --- a/httemplate/edit/part_svc.cgi +++ b/httemplate/edit/part_svc.cgi @@ -166,12 +166,13 @@ that field. % % foreach my $field (@fields) { % -% my $part_svc_column = $part_svc->part_svc_column($field); -% my $value = $part_svc_column->columnvalue; -% my $flag = $part_svc_column->columnflag; % #my $def = $defs{$layer}{$field}; % my $def = FS::part_svc->svc_table_fields($layer)->{$field}; % my $label = $def->{'def_label'} || $def->{'label'}; +% my $formatter = $def->{'format'} || sub { shift }; +% my $part_svc_column = $part_svc->part_svc_column($field); +% my $value = &$formatter($part_svc_column->columnvalue); +% my $flag = $part_svc_column->columnflag; % % if ( $bgcolor eq $bgcolor1 ) { % $bgcolor = $bgcolor2; diff --git a/httemplate/edit/process/part_pkg.cgi b/httemplate/edit/process/part_pkg.cgi index 1158222b6..5fc59c14d 100755 --- a/httemplate/edit/process/part_pkg.cgi +++ b/httemplate/edit/process/part_pkg.cgi @@ -6,11 +6,17 @@ % %my $old = qsearchs('part_pkg',{'pkgpart'=>$pkgpart}) if $pkgpart; % +%tie my %plans, 'Tie::IxHash', %{ FS::part_pkg::plan_info() }; +%my $href = $plans{$cgi->param('plan')}->{'fields'}; +% %#fixup plandata %my $plandata = $cgi->param('plandata'); %my @plandata = split(',', $plandata); %$cgi->param('plandata', -% join('', map { "$_=". join(', ', $cgi->param($_)). "\n" } @plandata ) +% join('', map { my $parser = sub { shift }; +% $parser = $href->{$_}{parse} if exists($href->{$_}{parse}); +% "$_=". join(', ', &$parser($cgi->param($_))). "\n" +% } @plandata ) %); % %foreach (qw( setuptax recurtax disabled )) { diff --git a/httemplate/edit/process/svc_acct.cgi b/httemplate/edit/process/svc_acct.cgi index 30552c846..65ac5c176 100755 --- a/httemplate/edit/process/svc_acct.cgi +++ b/httemplate/edit/process/svc_acct.cgi @@ -23,6 +23,11 @@ %#unmunge usergroup %$cgi->param('usergroup', [ $cgi->param('radius_usergroup') ] ); % +%#unmunge bytecounts +%foreach (map { $_,$_."_threshold" } qw( upbytes downbytes totalbytes )) { +% $cgi->param($_, FS::UI::Web::parse_bytecount($cgi->param($_)) ); +%} +% %my %hash = $svcnum ? $old->hash : (); %map { % $hash{$_} = scalar($cgi->param($_)); diff --git a/httemplate/edit/svc_acct.cgi b/httemplate/edit/svc_acct.cgi index 01f665a45..e0610b22f 100755 --- a/httemplate/edit/svc_acct.cgi +++ b/httemplate/edit/svc_acct.cgi @@ -386,27 +386,27 @@ Service # <% $svcnum ? "$svcnum" : " (NEW)" %>
% } % -% if ( $curuser->access_right('Edit usage') ) { -% my %label = ( seconds => 'Seconds', -% upbytes => 'Upload bytes', -% downbytes => 'Download bytes', -% totalbytes => 'Total bytes', -% ); -% foreach my $uf (keys %label) { -% my $tf = $uf . "_threshold"; -% if ( $svc_acct->$tf ne '' ) { - +% my %label = ( seconds => 'Time', +% upbytes => 'Upload bytes', +% downbytes => 'Download bytes', +% totalbytes => 'Total bytes', +% ); +% foreach my $uf (keys %label) { +% my $tf = $uf . "_threshold"; +% if ( $curuser->access_right('Edit usage') ) { <% $label{$uf} %> remaining - + (blank disables) <% $label{$uf} %> threshold - (blank or zero disables <% lc($label{$uf}) %> remaining) + (blank disables) -% } +% }else{ + + % } -% } +% } % %foreach my $r ( grep { /^r(adius|[cr])_/ } fields('svc_acct') ) { % $r =~ /^^r(adius|[cr])_(.+)$/ or next; #? diff --git a/httemplate/view/svc_acct.cgi b/httemplate/view/svc_acct.cgi index 86478681c..2ad9b8ef9 100755 --- a/httemplate/view/svc_acct.cgi +++ b/httemplate/view/svc_acct.cgi @@ -245,17 +245,19 @@ Service #<% $svcnum %> % } -% my %ulabel = ( seconds => 'Seconds', +% my %ulabel = ( seconds => 'Time', % upbytes => 'Upload bytes', % downbytes => 'Download bytes', % totalbytes => 'Total bytes', % ); % foreach my $uf ( keys %ulabel ) { % my $tf = $uf . "_threshold"; -% if ( $svc_acct->$tf ne '' ) { +% if ( $svc_acct->$uf ne '' ) { +% my $v = $uf eq 'seconds' ? duration_exact($svc_acct->$uf) +% : FS::UI::Web::display_bytecount($svc_acct->$uf); <% $ulabel{$uf} %> remaining - <% $svc_acct->$uf %> + <% $v %> % } @@ -286,13 +288,6 @@ Service #<% $svcnum %> RADIUS groups <% join('
', $svc_acct->radius_groups) %> -% if ( $svc_acct->seconds =~ /^\d+$/ ) { - - - Prepaid time - <% duration_exact($svc_acct->seconds) %> - -% } % %# Can this be abstracted further? Maybe a library function like %# widget('HTML', 'view', $svc_acct) ? It would definitely make UI -- 2.11.0