fix date parsing when using international dates (package date edit), RT#8027
[freeside.git] / FS / FS / UI / Web.pm
index 6a97f96..821b191 100644 (file)
@@ -4,6 +4,7 @@ use strict;
 use vars qw($DEBUG @ISA @EXPORT_OK $me);
 use Exporter;
 use FS::Conf;
+use FS::Misc::DateTime qw( parse_datetime );
 use FS::Record qw(dbdef);
 use FS::cust_main;  # are sql_balance and sql_date_balance in the right module?
 
@@ -30,7 +31,7 @@ sub parse_beginning_ending {
   if ( $cgi->param($prefix.'begin') =~ /^(\d+)$/ ) {
     $beginning = $1;
   } elsif ( $cgi->param($prefix.'beginning') =~ /^([ 0-9\-\/]{1,64})$/ ) {
-    $beginning = str2time($1) || 0;
+    $beginning = parse_datetime($1) || 0;
   }
 
   my $ending = 4294967295; #2^32-1
@@ -38,7 +39,7 @@ sub parse_beginning_ending {
     $ending = $1 - 1;
   } elsif ( $cgi->param($prefix.'ending') =~ /^([ 0-9\-\/]{1,64})$/ ) {
     #probably need an option to turn off the + 86399
-    $ending = str2time($1) + 86399;
+    $ending = parse_datetime($1) + 86399;
   }
 
   ( $beginning, $ending );
@@ -138,6 +139,10 @@ sub svc_label_link {
 
 sub svc_X_link {
   my ($x, $m, $part_svc, $cust_svc) = @_ or return '';
+
+  return $x
+   unless $FS::CurrentUser::CurrentUser->access_right('View customer services');
+
   my $ahref = svc_url(
     'ahref'    => 1,
     'm'        => $m,
@@ -149,6 +154,15 @@ sub svc_X_link {
   "$ahref$x</A>";
 }
 
+#this probably needs an ACL too...
+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) = @_;
 
@@ -201,6 +215,8 @@ sub cust_header {
   warn "FS::UI:Web::cust_header called"
     if $DEBUG;
 
+  my $conf = new FS::Conf;
+
   my %header2method = (
     'Customer'                 => 'name',
     'Cust. Status'             => 'ucfirst_cust_status',
@@ -222,10 +238,30 @@ sub cust_header {
     'Day phone'                => 'daytime', # XXX should use msgcat, but how?
     'Night phone'              => 'night',   # XXX should use msgcat, but how?
     'Fax number'               => 'fax',
+    '(bill) Address 1'         => 'address1',
+    '(bill) Address 2'         => 'address2',
+    '(bill) City'              => 'city',
+    '(bill) State'             => 'state',
+    '(bill) Zip'               => 'zip',
+    '(bill) Country'           => 'country_full',
+    '(bill) Day phone'         => 'daytime', # XXX should use msgcat, but how?
+    '(bill) Night phone'       => 'night',   # XXX should use msgcat, but how?
+    '(bill) Fax number'        => 'fax',
+    '(service) Address 1'      => 'ship_address1',
+    '(service) Address 2'      => 'ship_address2',
+    '(service) City'           => 'ship_city',
+    '(service) State'          => 'ship_state',
+    '(service) Zip'            => 'ship_zip',
+    '(service) Country'        => 'ship_country_full',
+    '(service) Day phone'      => 'ship_daytime', # XXX should use msgcat, how?
+    '(service) Night phone'    => 'ship_night',   # XXX should use msgcat, how?
+    '(service) Fax number'     => 'ship_fax',
     'Invoicing email(s)'       => 'invoicing_list_emailonly_scalar',
     'Payment Type'             => 'payby',
     'Current Balance'          => 'current_balance',
   );
+  $header2method{'Cust#'} = 'display_custnum'
+    if $conf->exists('cust_main-default_agent_custid');
 
   my %header2colormethod = (
     'Cust. Status' => 'cust_statuscolor',
@@ -235,6 +271,7 @@ sub cust_header {
   );
   my %header2align = (
     'Cust. Status' => 'c',
+    'Cust#'        => 'r',
   );
 
   my $cust_fields;
@@ -248,7 +285,6 @@ sub cust_header {
 
   } else {
 
-    my $conf = new FS::Conf;
     if (    $conf->exists('cust-fields')
          && $conf->config('cust-fields') =~ /^([\w\. \|\#\(\)]+):?/
        )
@@ -265,7 +301,7 @@ sub cust_header {
   }
 
   @cust_header = split(/ \| /, $cust_fields);
-  @cust_fields = map { $header2method{$_} } @cust_header;
+  @cust_fields = map { $header2method{$_} || $_ } @cust_header;
   @cust_colors = map { exists $header2colormethod{$_}
                          ? $header2colormethod{$_}
                          : ''
@@ -298,9 +334,13 @@ sub cust_sql_fields {
 
   cust_header(@_);
   #inefficientish, but tiny lists and only run once per page
+
+  my @add_fields = qw( address1 address2 city state zip daytime night fax );
   push @fields,
     grep { my $field = $_; grep { $_ eq $field } @cust_fields }
-         qw( address1 address2 city state zip daytime night fax payby );
+         ( @add_fields, ( map "ship_$_", @add_fields ), 'payby' );
+
+  push @fields, 'agent_custid';
 
   my @extra_fields = ();
   if (grep { $_ eq 'current_balance' } @cust_fields) {
@@ -323,29 +363,61 @@ setting is supplied, the <B>cust-fields</B> configuration value.
 
 =cut
 
+
 sub cust_fields {
-  my $svc_x = shift;
-  warn "FS::UI::Web::cust_fields called for $svc_x ".
+  my $record = shift;
+  warn "FS::UI::Web::cust_fields called for $record ".
        "(cust_fields: @cust_fields)"
     if $DEBUG > 1;
 
   #cust_header(@_) unless @cust_fields; #now need to cache to keep cust_fields
   #                                     #override incase we were passed as a sub
-
+  
   my $seen_unlinked = 0;
+
   map { 
-    if ( $svc_x->custnum ) {
-      warn "  $svc_x -> $_"
-        if $DEBUG > 1;
-      $svc_x->$_(@_);
+    if ( $record->custnum ) {
+      warn "  $record -> $_" if $DEBUG > 1;
+      $record->$_(@_);
     } else {
-      warn "  ($svc_x unlinked)"
-        if $DEBUG > 1;
+      warn "  ($record unlinked)" if $DEBUG > 1;
       $seen_unlinked++ ? '' : '(unlinked)';
     }
   } @cust_fields;
 }
 
+=item cust_fields_subs
+
+Returns an array of subroutine references for returning customer field values.
+This is similar to cust_fields, but returns each field's sub as a distinct 
+element.
+
+=cut
+
+sub cust_fields_subs {
+  my $unlinked_warn = 0;
+  return map { 
+    my $f = $_;
+    if( $unlinked_warn++ ) {
+      sub {
+        my $record = shift;
+        if( $record->custnum ) {
+          $record->$f(@_);
+        }
+        else {
+          '(unlinked)'
+        };
+      }
+    } 
+    else {
+      sub {
+        my $record = shift;
+        $record->$f(@_) if $record->custnum;
+      }
+    }
+  } @cust_fields;
+}
+
 =item cust_colors
 
 Returns an array of subroutine references (or empty strings) for returning
@@ -549,7 +621,9 @@ sub job_status {
 
   my @return;
   if ( $job && $job->status ne 'failed' ) {
-    @return = ( 'progress', $job->statustext );
+    my ($progress, $action) = split ',', $job->statustext, 2; 
+    $action ||= 'Server processing job';
+    @return = ( 'progress', $progress, $action );
   } elsif ( !$job ) { #handle job gone case : job successful
                       # so close popup, redirect parent window...
     @return = ( 'complete' );
@@ -557,6 +631,7 @@ sub job_status {
     @return = ( 'error', $job ? $job->statustext : $jobnum );
   }
 
+  #to_json(\@return);  #waiting on deb 5.0 for new JSON.pm?
   objToJson(\@return);
 
 }