allow exports to add links to customer view (#1407)
[freeside.git] / FS / FS / UI / Web.pm
index 18afc3d..e4a9ac1 100644 (file)
@@ -1,13 +1,18 @@
 package FS::UI::Web;
 
 use strict;
-use vars qw($DEBUG $me);
+use vars qw($DEBUG @ISA @EXPORT_OK $me);
+use Exporter;
 use FS::Conf;
 use FS::Record qw(dbdef);
+use FS::cust_main;  # are sql_balance and sql_date_balance in the right module?
 
 #use vars qw(@ISA);
 #use FS::UI
 #@ISA = qw( FS::UI );
+@ISA = qw( Exporter );
+
+@EXPORT_OK = qw( svc_url );
 
 $DEBUG = 0;
 $me = '[FS::UID::Web]';
@@ -18,19 +23,20 @@ $me = '[FS::UID::Web]';
 
 use Date::Parse;
 sub parse_beginning_ending {
-  my($cgi) = @_;
+  my($cgi, $prefix) = @_;
+  $prefix .= '_' if $prefix;
 
   my $beginning = 0;
-  if ( $cgi->param('begin') =~ /^(\d+)$/ ) {
+  if ( $cgi->param($prefix.'begin') =~ /^(\d+)$/ ) {
     $beginning = $1;
-  } elsif ( $cgi->param('beginning') =~ /^([ 0-9\-\/]{1,64})$/ ) {
+  } elsif ( $cgi->param($prefix.'beginning') =~ /^([ 0-9\-\/]{1,64})$/ ) {
     $beginning = str2time($1) || 0;
   }
 
   my $ending = 4294967295; #2^32-1
-  if ( $cgi->param('end') =~ /^(\d+)$/ ) {
+  if ( $cgi->param($prefix.'end') =~ /^(\d+)$/ ) {
     $ending = $1 - 1;
-  } elsif ( $cgi->param('ending') =~ /^([ 0-9\-\/]{1,64})$/ ) {
+  } elsif ( $cgi->param($prefix.'ending') =~ /^([ 0-9\-\/]{1,64})$/ ) {
     #probably need an option to turn off the + 86399
     $ending = str2time($1) + 86399;
   }
@@ -112,6 +118,7 @@ sub svc_url {
     $url .= 'svcnum=' if $query =~ /^\d+(;|$)/ or $query eq '';
   }
 
+  import FS::CGI 'rooturl'; #WTF!  why is this necessary
   my $return = rooturl(). "$opt{action}/$url$query";
 
   $return = qq!<A HREF="$return">! if $opt{ahref};
@@ -142,6 +149,14 @@ sub svc_X_link {
   "$ahref$x</A>";
 }
 
+sub svc_export_links {
+  my ($m, $part_svc, $cust_svc) = @_ or return '';
+
+  my $ahref = $cust_svc->export_links;
+
+  join('', @$ahref);
+}
+
 sub parse_lt_gt {
   my($cgi, $field) = @_;
 
@@ -157,7 +172,7 @@ sub parse_lt_gt {
     warn "checking for ${field}_$op field\n"
       if $DEBUG;
 
-    if ( $cgi->param($field."_$op") =~ /^\s*\$?\s*([\d\,\s]+(\.\d\d)?)\s*$/ ) {
+    if ( $cgi->param($field."_$op") =~ /^\s*\$?\s*(-?[\d\,\s]+(\.\d\d)?)\s*$/ ) {
 
       my $num = $1;
       $num =~ s/[\,\s]+//g;
@@ -174,17 +189,6 @@ sub parse_lt_gt {
 
 }
 
-sub bytecount_unexact {
-  my $bc = shift;
-  return("$bc bytes")
-    if ($bc < 1000);
-  return(sprintf("%.2f Kbytes", $bc/1000))
-    if ($bc < 1000000);
-  return(sprintf("%.2f Mbytes", $bc/1000000))
-    if ($bc < 1000000000);
-  return(sprintf("%.2f Gbytes", $bc/1000000000));
-}
-
 ###
 # cust_main report subroutines
 ###
@@ -225,7 +229,10 @@ sub cust_header {
     'Country'                  => 'country_full',
     'Day phone'                => 'daytime', # XXX should use msgcat, but how?
     'Night phone'              => 'night',   # XXX should use msgcat, but how?
+    'Fax number'               => 'fax',
     'Invoicing email(s)'       => 'invoicing_list_emailonly_scalar',
+    'Payment Type'             => 'payby',
+    'Current Balance'          => 'current_balance',
   );
 
   my %header2colormethod = (
@@ -301,9 +308,14 @@ sub cust_sql_fields {
   #inefficientish, but tiny lists and only run once per page
   push @fields,
     grep { my $field = $_; grep { $_ eq $field } @cust_fields }
-         qw( address1 address2 city state zip daytime night );
+         qw( address1 address2 city state zip daytime night fax payby );
+
+  my @extra_fields = ();
+  if (grep { $_ eq 'current_balance' } @cust_fields) {
+    push @extra_fields, FS::cust_main->balance_sql . " AS current_balance";
+  }
 
-  map "cust_main.$_", @fields;
+  map("cust_main.$_", @fields), @extra_fields;
 }
 
 =item cust_fields OBJECT [ CUST_FIELDS_VALUE ]
@@ -415,7 +427,7 @@ use Carp;
 use Storable qw(nfreeze);
 use MIME::Base64;
 use JSON;
-use FS::UID;
+use FS::UID qw(getotaker);
 use FS::Record qw(qsearchs);
 use FS::queue;
 
@@ -488,6 +500,7 @@ sub start_job {
       push @{$param{$field}}, $value;
     }
   }
+  $param{CurrentUser} = getotaker();
   warn "FS::UI::Web::start_job\n".
        join('', map {
                       if ( ref($param{$_}) ) {