big update for reseller interface
authorivan <ivan>
Tue, 24 Aug 2004 11:16:57 +0000 (11:16 +0000)
committerivan <ivan>
Tue, 24 Aug 2004 11:16:57 +0000 (11:16 +0000)
23 files changed:
FS/FS/ClientAPI/Agent.pm
FS/FS/ClientAPI/MyAccount.pm
FS/FS/ClientAPI/Signup.pm
FS/FS/Conf.pm
FS/FS/cust_main.pm
fs_selfservice/FS-SelfService/SelfService.pm
fs_selfservice/FS-SelfService/cgi/agent.cgi
fs_selfservice/FS-SelfService/cgi/agent_customer_menu.html [new file with mode: 0644]
fs_selfservice/FS-SelfService/cgi/agent_delete_svc.html [new file with mode: 0644]
fs_selfservice/FS-SelfService/cgi/agent_logout.html [new file with mode: 0644]
fs_selfservice/FS-SelfService/cgi/agent_main.html
fs_selfservice/FS-SelfService/cgi/agent_menu.html [new file with mode: 0644]
fs_selfservice/FS-SelfService/cgi/agent_order_pkg.html [new file with mode: 0644]
fs_selfservice/FS-SelfService/cgi/agent_provision.html [new file with mode: 0644]
fs_selfservice/FS-SelfService/cgi/agent_provision_svc_acct.html [new file with mode: 0644]
fs_selfservice/FS-SelfService/cgi/list_customers.html
fs_selfservice/FS-SelfService/cgi/order_pkg.html [new file with mode: 0644]
fs_selfservice/FS-SelfService/cgi/provision.html
fs_selfservice/FS-SelfService/cgi/provision_list.html [new file with mode: 0644]
fs_selfservice/FS-SelfService/cgi/selfservice.cgi
fs_selfservice/FS-SelfService/cgi/svc_acct.html [new file with mode: 0644]
fs_selfservice/FS-SelfService/cgi/view_customer.html
httemplate/search/cust_main.cgi

index 212faaa..1cc11d5 100644 (file)
@@ -6,12 +6,14 @@ use strict;
 use vars qw($cache);
 use Digest::MD5 qw(md5_hex);
 use Cache::SharedMemoryCache; #store in db?
-use FS::Record qw(qsearchs); # qsearch);
+use FS::Record qw(qsearchs qsearch dbdef dbh);
 use FS::agent;
+use FS::cust_main;
 
 use FS::ClientAPI;
 FS::ClientAPI->register_handlers(
   'Agent/agent_login'          => \&agent_login,
+  'Agent/agent_logout'         => \&agent_logout,
   'Agent/agent_info'           => \&agent_info,
   'Agent/agent_list_customers' => \&agent_list_customers,
 );
@@ -52,6 +54,16 @@ sub agent_login {
   };
 }
 
+sub agent_logout {
+  my $p = shift;
+  if ( $p->{'session_id'} ) {
+    $cache->remove($p->{'session_id'});
+    return { 'error' => '' };
+  } else {
+    return { 'error' => "Can't resume session" }; #better error message
+  }
+}
+
 sub agent_info {
   my $p = shift;
 
@@ -92,12 +104,76 @@ sub agent_list_customers {
 
   my @cust_main = ();
 
-  warn $p->{'susp'};
+  #warn $p->{'search'};
+  if ( $p->{'search'} =~ /^\s*(\d+)\s*$/ ) { # customer # search
+    push @cust_main, qsearch('cust_main', { 'agentnum' => $agentnum,
+                                            'custnum'  => $1         } );
+  } elsif ( $p->{'search'} =~ /^\s*(\S.*\S)\s*$/ ) { #value search
+    my $value = lc($1);
+    my $q_value = dbh->quote($value);
+
+    #exact
+    my $sql = " AND ( LOWER(last) = $q_value OR LOWER(company) = $q_value";
+    $sql .= " OR LOWER(ship_last) = $q_value OR LOWER(ship_company) = $q_value"
+      if defined dbdef->table('cust_main')->column('ship_last');
+    $sql .= ' )';
+
+    push @cust_main, qsearch( 'cust_main',
+                              { 'agentnum' => $agentnum },
+                              '',
+                              $sql
+                            );
+
+    unless ( @cust_main ) {
+      warn "no exact match, trying substring/fuzzy\n";
+
+      #still some false laziness w/ search/cust_main.cgi
+
+      #substring
+      push @cust_main, qsearch( 'cust_main',
+                                { 'agentnum' => $agentnum,
+                                  'last'     => { 'op'    => 'ILIKE',
+                                                  'value' => "%$q_value%" } } );
+
+      push @cust_main, qsearch( 'cust_main',
+                                { 'agentnum'  => $agentnum,
+                                  'ship_last' => { 'op'    => 'ILIKE',
+                                                   'value' => "%$q_value%" } } )
+        if defined dbdef->table('cust_main')->column('ship_last');
+
+      push @cust_main, qsearch( 'cust_main',
+                                { 'agentnum' => $agentnum,
+                                  'company'  => { 'op'    => 'ILIKE',
+                                                  'value' => "%$q_value%" } } );
+
+      push @cust_main, qsearch( 'cust_main',
+                                { 'agentnum'     => $agentnum,
+                                  'ship_company' => { 'op' => 'ILIKE',
+                                                   'value' => "%$q_value%" } } )
+        if defined dbdef->table('cust_main')->column('ship_last');
+
+      #fuzzy
+      push @cust_main, FS::cust_main->fuzzy_search(
+        { 'last'     => $value },
+        { 'agentnum' => $agentnum }
+      );
+      push @cust_main, FS::cust_main->fuzzy_search(
+        { 'company'  => $value },
+        { 'agentnum' => $agentnum }
+      );
+
+    }
+  }
 
+  #aggregate searches
   push @cust_main,
     map $agent->$_(), map $_.'_cust_main',
       grep $p->{$_}, qw( prospect active susp cancel );
 
+  #eliminate dups?
+  my %saw = ();
+  @cust_main = grep { !$saw{$_->custnum}++ } @cust_main;
+
   { customers => [ map {
                          my $cust_main = $_;
                          my $hashref = $cust_main->hashref;
index 639cb7b..34dad38 100644 (file)
@@ -109,23 +109,8 @@ sub logout {
 sub customer_info {
   my $p = shift;
 
-  my($session, $custnum, $context);
-  if ( $p->{'session_id'} ) {
-    $context = 'customer';
-    $session = $cache->get($p->{'session_id'})
-      or return { 'error' => "Can't resume session" }; #better error message
-    $custnum = $session->{'custnum'};
-  } elsif ( $p->{'agent_session_id'} ) {
-    $context = 'agent';
-    my $agent_cache = new Cache::SharedMemoryCache( {
-      'namespace' => 'FS::ClientAPI::Agent',
-    } );
-    $session = $agent_cache->get($p->{'agent_session_id'})
-      or return { 'error' => "Can't resume session" }; #better error message
-    $custnum = $p->{'custnum'};
-  } else {
-    return { 'error' => "Can't resume session" }; #better error message
-  }
+  my($context, $session, $custnum) = _custoragent_session_custnum($p);
+  return { 'error' => $session } if $context eq 'error';
 
   my %return;
   if ( $custnum ) { #customer record
@@ -451,31 +436,42 @@ sub cancel {
 
 sub list_pkgs {
   my $p = shift;
-  my $session = $cache->get($p->{'session_id'})
-    or return { 'error' => "Can't resume session" }; #better error message
 
-  my $custnum = $session->{'custnum'};
+  my($context, $session, $custnum) = _custoragent_session_custnum($p);
+  return { 'error' => $session } if $context eq 'error';
 
-  my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } )
+  my $search = { 'custnum' => $custnum };
+  $search->{'agentnum'} = $session->{'agentnum'} if $context eq 'agent';
+  my $cust_main = qsearchs('cust_main', $search )
     or return { 'error' => "unknown custnum $custnum" };
 
   #return { 'cust_pkg' => [ map { $_->hashref } $cust_main->ncancelled_pkgs ] };
 
+  my $conf = new FS::Conf;
+
   { 'svcnum'   => $session->{'svcnum'},
+    'custnum'  => $custnum,
     'cust_pkg' => [ map {
                           { $_->hash,
                             $_->part_pkg->hash,
                             part_svc =>
                               [ map $_->hashref, $_->available_part_svc ],
                             cust_svc => 
-                              [ map { { $_->hash,
-                                        label => [ $_->label ],
-                                      }
+                              [ map { my $ref = { $_->hash,
+                                                  label => [ $_->label ],
+                                                };
+                                      $ref->{_password} = $_->svc_x->_password
+                                        if $context eq 'agent'
+                                        && $conf->exists('agent-showpasswords')
+                                        && $_->part_svc->svcdb eq 'svc_acct';
+                                      $ref;
                                     } $_->cust_svc
                               ],
                           };
                         } $cust_main->ncancelled_pkgs
                   ],
+    'small_custview' =>
+      small_custview( $cust_main, $conf->config('defaultcountry') ),
   };
 
 }
@@ -483,28 +479,11 @@ sub list_pkgs {
 sub order_pkg {
   my $p = shift;
 
-  my($session, $custnum, $context);
-
-  if ( $p->{'session_id'} ) {
-    $context = 'customer';
-    $session = $cache->get($p->{'session_id'})
-      or return { 'error' => "Can't resume session" }; #better error message
-    $custnum = $session->{'custnum'};
-  } elsif ( $p->{'agent_session_id'} ) {
-    $context = 'agent';
-    my $agent_cache = new Cache::SharedMemoryCache( {
-      'namespace' => 'FS::ClientAPI::Agent',
-    } );
-    $session = $agent_cache->get($p->{'agent_session_id'})
-      or return { 'error' => "Can't resume session" }; #better error message
-    $custnum = $p->{'custnum'};
-  } else {
-    return { 'error' => "Can't resume session" }; #better error message
-  }
+  my($context, $session, $custnum) = _custoragent_session_custnum($p);
+  return { 'error' => $session } if $context eq 'error';
 
   my $search = { 'custnum' => $custnum };
   $search->{'agentnum'} = $session->{'agentnum'} if $context eq 'agent';
-
   my $cust_main = qsearchs('cust_main', $search )
     or return { 'error' => "unknown custnum $custnum" };
 
@@ -632,12 +611,12 @@ sub cancel_pkg {
 sub provision_acct {
   my $p = shift;
 
-  my $session = $cache->get($p->{'session_id'})
-    or return { 'error' => "Can't resume session" }; #better error message
+  my($context, $session, $custnum) = _custoragent_session_custnum($p);
+  return { 'error' => $session } if $context eq 'error';
 
-  my $custnum = $session->{'custnum'};
-
-  my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } )
+  my $search = { 'custnum' => $custnum };
+  $search->{'agentnum'} = $session->{'agentnum'} if $context eq 'agent';
+  my $cust_main = qsearchs('cust_main', $search )
     or return { 'error' => "unknown custnum $custnum" };
 
   my $pkgnum = $p->{'pkgnum'};
@@ -671,12 +650,12 @@ sub provision_acct {
 sub part_svc_info {
   my $p = shift;
 
-  my $session = $cache->get($p->{'session_id'})
-    or return { 'error' => "Can't resume session" }; #better error message
-
-  my $custnum = $session->{'custnum'};
+  my($context, $session, $custnum) = _custoragent_session_custnum($p);
+  return { 'error' => $session } if $context eq 'error';
 
-  my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } )
+  my $search = { 'custnum' => $custnum };
+  $search->{'agentnum'} = $session->{'agentnum'} if $context eq 'agent';
+  my $cust_main = qsearchs('cust_main', $search )
     or return { 'error' => "unknown custnum $custnum" };
 
   my $pkgnum = $p->{'pkgnum'};
@@ -693,11 +672,14 @@ sub part_svc_info {
     or return { 'error' => "unknown svcpart $svcpart for pkgnum $pkgnum" };
   my $part_svc = $pkg_svc->part_svc;
 
+  my $conf = new FS::Conf;
+
   return {
     'svc'     => $part_svc->svc,
     'svcdb'   => $part_svc->svcdb,
     'pkgnum'  => $pkgnum,
     'svcpart' => $svcpart,
+    'custnum' => $custnum,
 
     'security_phrase' => 0, #XXX !
     'svc_acct_pop'    => [], #XXX !
@@ -705,6 +687,10 @@ sub part_svc_info {
     'init_popstate'   => '',
     'popac'           => '',
     'acstate'         => '',
+
+    'small_custview' =>
+      small_custview( $cust_main, $conf->config('defaultcountry') ),
+
   };
 
 }
@@ -712,12 +698,12 @@ sub part_svc_info {
 sub unprovision_svc {
   my $p = shift;
 
-  my $session = $cache->get($p->{'session_id'})
-    or return { 'error' => "Can't resume session" }; #better error message
-
-  my $custnum = $session->{'custnum'};
+  my($context, $session, $custnum) = _custoragent_session_custnum($p);
+  return { 'error' => $session } if $context eq 'error';
 
-  my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } )
+  my $search = { 'custnum' => $custnum };
+  $search->{'agentnum'} = $session->{'agentnum'} if $context eq 'agent';
+  my $cust_main = qsearchs('cust_main', $search )
     or return { 'error' => "unknown custnum $custnum" };
 
   my $svcnum = $p->{'svcnum'};
@@ -728,11 +714,47 @@ sub unprovision_svc {
   return { 'error' => "Service $svcnum does not belong to customer $custnum" }
     unless $cust_svc->cust_pkg->custnum == $custnum;
 
+  my $conf = new FS::Conf;
+
   return { 'svc'   => $cust_svc->part_svc->svc,
-           'error' => $cust_svc->cancel
+           'error' => $cust_svc->cancel,
+           'small_custview' =>
+             small_custview( $cust_main, $conf->config('defaultcountry') ),
          };
 
 }
 
+#--
+
+sub _custoragent_session_custnum {
+  my $p = shift;
+
+  my($context, $session, $custnum);
+  if ( $p->{'session_id'} ) {
+
+    $context = 'customer';
+    $session = $cache->get($p->{'session_id'})
+      or return { 'error' => "Can't resume session" }; #better error message
+    $custnum = $session->{'custnum'};
+
+  } elsif ( $p->{'agent_session_id'} ) {
+
+    $context = 'agent';
+    my $agent_cache = new Cache::SharedMemoryCache( {
+      'namespace' => 'FS::ClientAPI::Agent',
+    } );
+    $session = $agent_cache->get($p->{'agent_session_id'})
+      or return { 'error' => "Can't resume session" }; #better error message
+    $custnum = $p->{'custnum'};
+
+  } else {
+    return { 'error' => "Can't resume session" }; #better error message
+  }
+
+  ($context, $session, $custnum);
+
+}
+
+
 1;
 
index 81ed5e6..bdcd2fb 100644 (file)
@@ -76,7 +76,7 @@ sub signup_info {
     'cvv_enabled' => defined dbdef->table('cust_main')->column('paycvv'),
 
     'msgcat' => { map { $_=>gettext($_) } qw(
-      passwords_dont_match invalid_card unknown_card_type not_a
+      passwords_dont_match invalid_card unknown_card_type not_a empty_password
     ) },
 
     'statedefault' => $conf->config('statedefault') || 'CA',
index bfef628..c8f0d81 100644 (file)
@@ -759,7 +759,7 @@ httemplate/docs/config.html
   {
     'key'         => 'showpasswords',
     'section'     => 'UI',
-    'description' => 'Display unencrypted user passwords in the web interface',
+    'description' => 'Display unencrypted user passwords in the backend (employee) web interface',
     'type'        => 'checkbox',
   },
 
@@ -1276,6 +1276,13 @@ httemplate/docs/config.html
     'type'        => 'text',
   },
 
+  {
+    'key'         => 'agent-showpasswords',
+    'section'     => '',
+    'description' => 'Display unencrypted user passwords in the agent (reseller) interface',
+    'type'        => 'checkbox',
+  },
+
 );
 
 1;
index 58d1a28..1540b61 100644 (file)
@@ -13,6 +13,7 @@ BEGIN {
 }
 use Date::Format;
 #use Date::Manip;
+use String::Approx qw(amatch);
 use Business::CreditCard;
 use FS::UID qw( getotaker dbh );
 use FS::Record qw( qsearchs qsearch dbdef );
@@ -2949,6 +2950,42 @@ sub cancel_sql { "
           )
 "; }
 
+=item fuzzy_search FUZZY_HASHREF [ HASHREF, SELECT, EXTRA_SQL, CACHE_OBJ ]
+
+Performs a fuzzy (approximate) search and returns the matching FS::cust_main
+records.  Currently, only I<last> or I<company> may be specified (the
+appropriate ship_ field is also searched if applicable).
+
+Additional options are the same as FS::Record::qsearch
+
+=cut
+
+sub fuzzy_search {
+  my( $self, $fuzzy, $hash, @opt) = @_;
+  #$self
+  $hash ||= {};
+  my @cust_main = ();
+
+  check_and_rebuild_fuzzyfiles();
+  foreach my $field ( keys %$fuzzy ) {
+    my $sub = \&{"all_$field"};
+    my %match = ();
+    $match{$_}=1 foreach ( amatch($fuzzy->{$field}, ['i'], @{ &$sub() } ) );
+
+    foreach ( keys %match ) {
+      push @cust_main, qsearch('cust_main', { %$hash, $field=>$_}, @opt);
+      push @cust_main, qsearch('cust_main', { %$hash, "ship_$field"=>$_}, @opt)
+        if defined dbdef->table('cust_main')->column('ship_last');
+    }
+  }
+
+  my %saw = ();
+  @cust_main = grep { !$saw{$_->custnum}++ } @cust_main;
+
+  @cust_main;
+
+}
+
 =back
 
 =head1 SUBROUTINES
index ae6d376..de33b75 100644 (file)
@@ -40,6 +40,7 @@ $socket .= '.'.$tag if defined $tag && length($tag);
   'signup_info'          => 'Signup/signup_info',
   'new_customer'         => 'Signup/new_customer',
   'agent_login'          => 'Agent/agent_login',
+  'agent_logout'         => 'Agent/agent_logout',
   'agent_info'           => 'Agent/agent_info',
   'agent_list_customers' => 'Agent/agent_list_customers',
 );
index 6d2fd58..b887098 100644 (file)
@@ -9,10 +9,12 @@ use CGI;
 use CGI::Carp qw(fatalsToBrowser);
 use Business::CreditCard;
 use Text::Template;
-use FS::SelfService qw( agent_login agent_info
+#use HTML::Entities;
+use FS::SelfService qw( agent_login agent_logout agent_info
                         agent_list_customers
                         signup_info new_customer
-                        customer_info order_pkg
+                        customer_info list_pkgs order_pkg
+                        part_svc_info provision_acct unprovision_svc
                       );
 
 $DEBUG = 0;
@@ -65,7 +67,7 @@ $session_id = $cgi->param('session');
 
 warn "$me checking action\n" if $DEBUG;
 $cgi->param('action') =~
-   /^(agent_main|signup|process_signup|list_customers|view_customer|process_order_pkg)$/
+   /^(agent_main|signup|process_signup|list_customers|view_customer|agent_provision|provision_svc|process_svc_acct|delete_svc|agent_order_pkg|process_order_pkg|logout)$/
   or die "unknown action ". $cgi->param('action');
 my $action = $1;
 
@@ -87,6 +89,11 @@ warn "$me done processing template $action\n" if $DEBUG;
 
 #-- 
 
+sub logout {
+  $action = 'agent_logout';
+  agent_logout( 'session_id' => $session_id );
+}
+
 sub agent_main { agent_info( 'session_id' => $session_id ); }
 
 sub signup { signup_info( 'session_id' => $session_id ); }
@@ -184,15 +191,55 @@ sub process_signup {
 }
 
 sub list_customers {
-  agent_list_customers( 'session_id' => $session_id,
-                        map { $_ => $cgi->param($_) }
-                          grep defined($cgi->param($_)),
-                               qw(prospect active susp cancel)
-                      );
+
+  my $results = 
+    agent_list_customers( 'session_id' => $session_id,
+                          map { $_ => $cgi->param($_) }
+                            grep defined($cgi->param($_)),
+                                 qw(prospect active susp cancel),
+                                 'search',
+                        );
+
+  if ( scalar( @{$results->{'customers'}} ) == 1 ) {
+    $action = 'view_customer';
+    customer_info (
+      'agent_session_id' => $session_id,
+      'custnum'          => $results->{'customers'}[0]{'custnum'},
+    );
+  } else {
+    $results;
+  }
+
 }
 
 sub view_customer {
 
+  #my $init_data = signup_info( 'session_id' => $session_id );
+  #if ( $init_data->{'error'} ) {
+  #  if ( $init_data->{'error'} eq "Can't resume session" ) { #ick
+  #    do_template('agent_login',{});
+  #    exit;
+  #  } else { #?
+  #    die $init_data->{'error'};
+  #  }
+  #}
+  #
+  #my $customer_info =
+  customer_info (
+    'agent_session_id' => $session_id,
+    'custnum'          => $cgi->param('custnum'),
+  );
+  #
+  #return {
+  #  ( map { $_ => $init_data->{$_} }
+  #        qw( part_pkg security_phrase svc_acct_pop ),
+  #  ),
+  #  %$customer_info,
+  #};
+}
+
+sub agent_order_pkg {
+
   my $init_data = signup_info( 'session_id' => $session_id );
   if ( $init_data->{'error'} ) {
     if ( $init_data->{'error'} eq "Can't resume session" ) { #ick
@@ -205,16 +252,91 @@ sub view_customer {
 
   my $customer_info = customer_info (
     'agent_session_id' => $session_id,
-    'custnum'          => $cgi->param('custnum')
+    'custnum'          => $cgi->param('custnum'),
   );
 
-
   return {
     ( map { $_ => $init_data->{$_} }
           qw( part_pkg security_phrase svc_acct_pop ),
     ),
     %$customer_info,
   };
+
+}
+
+sub agent_provision {
+  my $result = list_pkgs(
+    'agent_session_id' => $session_id,
+    'custnum'          => $cgi->param('custnum'),
+  );
+  die $result->{'error'} if exists $result->{'error'} && $result->{'error'};
+  $result;
+}
+
+sub provision_svc {
+
+  my $result = part_svc_info(
+    'agent_session_id' => $session_id,
+    map { $_ => $cgi->param($_) } qw( pkgnum svcpart custnum ),
+  );
+  die $result->{'error'} if exists $result->{'error'} && $result->{'error'};
+
+  $result->{'svcdb'} =~ /^svc_(.*)$/
+    #or return { 'error' => 'Unknown svcdb '. $result->{'svcdb'} };
+    or die 'Unknown svcdb '. $result->{'svcdb'};
+  $action .= "_$1";
+  $action = "agent_$action";
+
+  $result;
+}
+
+sub process_svc_acct {
+
+  my $result = provision_acct (
+    'agent_session_id' => $session_id,
+    map { $_ => $cgi->param($_) } qw(
+      custnum pkgnum svcpart username _password _password2 sec_phrase popnum )
+  );
+
+  if ( exists $result->{'error'} && $result->{'error'} ) { 
+    #warn "$result $result->{'error'}"; 
+    $action = 'provision_svc_acct';
+    $action = "agent_$action";
+    return {
+      $cgi->Vars,
+      %{ part_svc_info( 'agent_session_id' => $session_id,
+                        map { $_ => $cgi->param($_) } qw(pkgnum svcpart custnum)
+                      )
+      },
+      'error' => $result->{'error'},
+    };
+  } else {
+    #warn "$result $result->{'error'}"; 
+    $action = 'agent_provision';
+    return {
+      %{agent_provision()},
+      'message' => $result->{'svc'}. ' setup sucessfully.',
+    };
+  }
+
+}
+
+sub delete_svc {
+  my $result = unprovision_svc(
+    'agent_session_id' => $session_id,
+    'custnum'          => $cgi->param('custnum'),
+    'svcnum'           => $cgi->param('svcnum'),
+  );
+
+  $action = 'agent_provision';
+
+  return {
+    %{agent_provision()},
+    'message' => $result->{'error'}
+                   ? '<FONT COLOR="#FF0000">'. $result->{'error'}. '</FONT>'
+                   : $result->{'svc'}. ' removed.'
+  };
+
 }
 
 sub process_order_pkg {
@@ -223,11 +345,12 @@ sub process_order_pkg {
 
   unless ( length($cgi->param('_password')) ) {
     my $init_data = signup_info( 'session_id' => $session_id );
-    $results = { 'error' => $init_data->{msgcat}{empty_password} }
+    #die $init_data->{'error'} if $init_data->{'error'};
+    $results = { 'error' => $init_data->{msgcat}{empty_password} };
   }
   if ( $cgi->param('_password') ne $cgi->param('_password2') ) {
     my $init_data = signup_info( 'session_id' => $session_id );
-    $results = { error => $init_data->{msgcat}{passwords_dont_match} };
+    $results = { 'error' => $init_data->{msgcat}{passwords_dont_match} };
     $cgi->param('_password', '');
     $cgi->param('_password2', '');
   }
@@ -238,17 +361,22 @@ sub process_order_pkg {
         qw( custnum pkgpart username _password _password2 sec_phrase popnum )
   );
 
-  $action = 'view_customer';
-  $cgi->delete( grep { $_ ne 'custnum' } $cgi->param )
-    unless $results->{'error'};
-
-  return {
-    $cgi->Vars,
-    %{view_customer()},
-    'message' => $results->{'error'}
-                   ? '<FONT COLOR="#FF0000">'. $results->{'error'}. '</FONT>'
-                   : 'Package order sucessful.'
-  };
+  if ( $results->{'error'} ) {
+    $action = 'agent_order_pkg';
+    return {
+      $cgi->Vars,
+      %{agent_order_pkg()},
+      #'message' => '<FONT COLOR="#FF0000">'. $results->{'error'}. '</FONT>',
+      'error' => '<FONT COLOR="#FF0000">'. $results->{'error'}. '</FONT>',
+    };
+  } else {
+    $action = 'view_customer';
+    #$cgi->delete( grep { $_ ne 'custnum' } $cgi->param );
+    return {
+      %{view_customer()},
+      'message' => 'Package order sucessful.',
+    };
+  }
 
 }
 
@@ -277,5 +405,23 @@ sub do_template {
 }
 
 package FS::SelfService::_agentcgi;
+
+use HTML::Entities;
 use FS::SelfService qw(regionselector expselect popselector);
 
+#false laziness w/selfservice.cgi
+sub include {
+  my $name = shift;
+  my $template = new Text::Template( TYPE   => 'FILE',
+                                     SOURCE => "$main::template_dir/$name.html",
+                                     DELIMITERS => [ '<%=', '%>' ],
+                                     UNTAINT => 1,                   
+                                   )
+    or die $Text::Template::ERROR;
+
+  $template->fill_in( PACKAGE => 'FS::SelfService::_agentcgi',
+                      #HASH    => $fill_in
+                    );
+
+}
+
diff --git a/fs_selfservice/FS-SelfService/cgi/agent_customer_menu.html b/fs_selfservice/FS-SelfService/cgi/agent_customer_menu.html
new file mode 100644 (file)
index 0000000..603fc0b
--- /dev/null
@@ -0,0 +1,7 @@
+<%= $url = "$selfurl?session=$session_id;custnum=$custnum;action="; ''; %>
+<TD VALIGN="top" HEIGHT=384 BGCOLOR="#dddddd">
+<A HREF="<%= $url %>agent_provision">Setup services</A><BR><BR>
+<A HREF="<%= $url %>agent_order_pkg">Purchase additional package</A><BR><BR>
+
+</TD>
+
diff --git a/fs_selfservice/FS-SelfService/cgi/agent_delete_svc.html b/fs_selfservice/FS-SelfService/cgi/agent_delete_svc.html
new file mode 100644 (file)
index 0000000..e8be07e
--- /dev/null
@@ -0,0 +1,20 @@
+<HTML><HEAD><TITLE>MyAccount</TITLE></HEAD>
+<BODY BGCOLOR="#eeeeee"><FONT SIZE=5>MyAccount</FONT><BR><BR>
+<%= $url = "$selfurl?session=$session_id;action="; ''; %>
+<TABLE BORDER=0 CELLPADDING=4><TR>
+<%= include('myaccount_menu') %>
+<TD VALIGN="top">
+<%= $small_custview %>
+<BR>
+<%= if ( $error ) {
+
+  $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">Error: $error</FONT>!;
+} else {
+  $OUT .= "<FONT SIZE=4>$svc removed.</FONT>";
+} %>
+
+</TD></TR></TABLE>
+<HR>
+<FONT SIZE="-2">powered by <a href="http://www.sisd.com/freeside">freeside</a></FONT>
+</BODY></HTML>
+
diff --git a/fs_selfservice/FS-SelfService/cgi/agent_logout.html b/fs_selfservice/FS-SelfService/cgi/agent_logout.html
new file mode 100644 (file)
index 0000000..9809467
--- /dev/null
@@ -0,0 +1,5 @@
+<HTML><HEAD><TITLE>Reseller</TITLE></HEAD>
+<BODY BGCOLOR="#eeeeee"><FONT SIZE=5>Reseller</FONT><BR><BR>
+You have been logged out.
+</BODY></HTML>
+
index 6297345..9dd3383 100644 (file)
@@ -1,10 +1,9 @@
-<HTML><HEAD><TITLE>Reseller Main</TITLE></HEAD>
-<BODY BGCOLOR="#eeeeee"><FONT SIZE=5>Reseller Main</FONT><BR><BR>
+<HTML><HEAD><TITLE>Reseller</TITLE></HEAD>
+<BODY BGCOLOR="#eeeeee"><FONT SIZE=5>Reseller</FONT><BR><BR>
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<TABLE BORDER=0 CELLPADDING=4><TR><TD VALIGN="top" HEIGHT=384 BGCOLOR="#dddddd">
-<A HREF="<%= $url %>agent_main">Reseller Main</A><BR>
-<!-- <A HREF="<%= $url %>other">SomethingElse</A><BR> -->
-</TD><TD VALIGN="top">
+<TABLE BORDER=0 CELLPADDING=4><TR>
+<%= include('agent_menu') %>
+<TD VALIGN="top">
 
 <%= $message
       ? "<FONT SIZE=\"+2\"><B>$message</B></FONT>"
 <TR><TD BGCOLOR="#dddddd">
 
   <B><%= $num_prospect %></B>
-  <A HREF="<%= $url %>list_customers;prospect=1">prospects</A>
+  <%= $num_prospect ? qq!<A HREF="${url}list_customers;prospect=1">! : '' %>prospects</A>
 
   <BR><FONT COLOR="#00CC00"><B><%= $num_active %></B></FONT>
-  <A HREF="<%= $url %>list_customers;active=1">active</A>
+  <%= $num_active ? qq!<A HREF="${url}list_customers;active=1">! : '' %>active</A>
 
   <BR><FONT COLOR="#FF9900"><B><%= $num_susp %></B></FONT>
-  <A HREF="<%= $url %>list_customers;susp=1">suspended</A>
+  <%= $num_susp ? qq!<A HREF="${url}list_customers;susp=1">! : '' %>suspended</A>
 
   <BR><FONT COLOR="#FF0000"><B><%= $num_cancel %></B></FONT>
-  <A HREF="<%= $url %>list_customers;cancel=1">cancelled</A>
+  <%= $num_cancel ? qq!<A HREF="${url}list_customers;cancel=1">! : '' %>cancelled</A>
 
 </TD></TR></TABLE>
 
-<BR><A HREF="<%= $url %>signup">New customer<!--/prospect--></A>
-
 </TD></TR></TABLE>
 <HR>
 <FONT SIZE="-2">powered by <a href="http://www.sisd.com/freeside">freeside</a></FONT>
diff --git a/fs_selfservice/FS-SelfService/cgi/agent_menu.html b/fs_selfservice/FS-SelfService/cgi/agent_menu.html
new file mode 100644 (file)
index 0000000..84a2953
--- /dev/null
@@ -0,0 +1,15 @@
+<%= $url = "$selfurl?session=$session_id;action="; ''; %>
+<TD VALIGN="top" HEIGHT=384 BGCOLOR="#dddddd">
+
+<A HREF="<%= $url %>agent_main">Overview</A><BR><BR>
+<A HREF="<%= $url %>signup">New customer<!--/prospect--></A><BR><BR>
+<FORM ACTION="<%= $selfurl %>">
+<INPUT TYPE="hidden" NAME="session" VALUE="<%= $session_id %>">
+<INPUT TYPE="hidden" NAME="action" VALUE="list_customers">
+<INPUT TYPE="text" NAME="search" SIZE=20><BR>
+<SMALL><I>cust&nbsp;#,&nbsp;last&nbsp;name,&nbsp;or&nbsp;company</I></SMALL><BR>
+<INPUT TYPE="submit" VALUE="Search customers"><BR>
+</FORM>
+<A HREF="<%= $url %>logout">Logout</A><BR><BR>
+
+</TD>
diff --git a/fs_selfservice/FS-SelfService/cgi/agent_order_pkg.html b/fs_selfservice/FS-SelfService/cgi/agent_order_pkg.html
new file mode 100644 (file)
index 0000000..0a665c9
--- /dev/null
@@ -0,0 +1,19 @@
+<HTML><HEAD><TITLE>Reseller</TITLE></HEAD>
+<BODY BGCOLOR="#eeeeee"><FONT SIZE=5>Reseller</FONT><BR><BR>
+<%= $url = "$selfurl?session=$session_id;custnum=$custnum;action="; ''; %>
+<TABLE BORDER=0 CELLPADDING=4><TR>
+<%= include('agent_menu') %>
+<TD VALIGN="top">
+<%= $small_custview %>
+<BR>
+
+<TABLE BORDER=0 CELLPADDING=4><TR>
+<%= include('agent_customer_menu') %>
+<TD VALIGN="top">
+<%= include('order_pkg') %>
+</TD></TR></TABLE>
+
+</TD></TR></TABLE>
+<HR>
+<FONT SIZE="-2">powered by <a href="http://www.sisd.com/freeside">freeside</a></FONT>
+</BODY></HTML>
diff --git a/fs_selfservice/FS-SelfService/cgi/agent_provision.html b/fs_selfservice/FS-SelfService/cgi/agent_provision.html
new file mode 100644 (file)
index 0000000..8770e2f
--- /dev/null
@@ -0,0 +1,25 @@
+<HTML><HEAD><TITLE>Reseller</TITLE></HEAD>
+<BODY BGCOLOR="#eeeeee"><FONT SIZE=5>Reseller</FONT><BR><BR>
+<%= $url = "$selfurl?session=$session_id;custnum=$custnum;action="; ''; %>
+<TABLE BORDER=0 CELLPADDING=4><TR>
+<%= include('agent_menu') %>
+<TD VALIGN="top">
+
+<%= $message
+      ? "<FONT SIZE=\"+2\"><B>$message</B></FONT><BR><BR>"
+      : ''
+%>
+
+<%= $small_custview %>
+<BR>
+
+<TABLE BORDER=0 CELLPADDING=4><TR>
+<%= include('agent_customer_menu') %>
+<TD VALIGN="top">
+<%= include('provision_list') %>
+</TD></TR></TABLE>
+
+</TD></TR></TABLE>
+<HR>
+<FONT SIZE="-2">powered by <a href="http://www.sisd.com/freeside">freeside</a></FONT>
+</BODY></HTML>
diff --git a/fs_selfservice/FS-SelfService/cgi/agent_provision_svc_acct.html b/fs_selfservice/FS-SelfService/cgi/agent_provision_svc_acct.html
new file mode 100644 (file)
index 0000000..8d299cd
--- /dev/null
@@ -0,0 +1,19 @@
+<HTML><HEAD><TITLE>Reseller</TITLE></HEAD>
+<BODY BGCOLOR="#eeeeee"><FONT SIZE=5>Reseller</FONT><BR><BR>
+<%= $url = "$selfurl?session=$session_id;custnum=$custnum;action="; ''; %>
+<TABLE BORDER=0 CELLPADDING=4><TR>
+<%= include('agent_menu') %>
+<TD VALIGN="top">
+<%= $small_custview %>
+<BR>
+<TABLE BORDER=0 CELLPADDING=4><TR>
+<%= include('agent_customer_menu') %>
+<TD VALIGN="top">
+<%= include('svc_acct') %>
+</TD></TR></TABLE>
+
+</TD></TR></TABLE>
+<HR>
+<FONT SIZE="-2">powered by <a href="http://www.sisd.com/freeside">freeside</a></FONT>
+</BODY></HTML>
+
index 6d4ba56..858e5e9 100644 (file)
@@ -1,10 +1,9 @@
-<HTML><HEAD><TITLE>Reseller Main</TITLE></HEAD>
-<BODY BGCOLOR="#eeeeee"><FONT SIZE=5>Reseller Main</FONT><BR><BR>
+<HTML><HEAD><TITLE>Reseller</TITLE></HEAD>
+<BODY BGCOLOR="#eeeeee"><FONT SIZE=5>Reseller</FONT><BR><BR>
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<TABLE BORDER=0 CELLPADDING=4><TR><TD VALIGN="top" HEIGHT=384 BGCOLOR="#dddddd">
-<A HREF="<%= $url %>agent_main">Reseller Main</A><BR>
-<!-- <A HREF="<%= $url %>other">SomethingElse</A><BR> -->
-</TD><TD VALIGN="top">
+<TABLE BORDER=0 CELLPADDING=4><TR>
+<%= include('agent_menu') %>
+<TD VALIGN="top">
 
 <%=
   if ( @customers ) {
@@ -38,4 +37,3 @@
 <FONT SIZE="-2">powered by <a href="http://www.sisd.com/freeside">freeside</a></FONT>
 </BODY></HTML>
 
-
diff --git a/fs_selfservice/FS-SelfService/cgi/order_pkg.html b/fs_selfservice/FS-SelfService/cgi/order_pkg.html
new file mode 100644 (file)
index 0000000..9cdd4cd
--- /dev/null
@@ -0,0 +1,75 @@
+<SCRIPT TYPE="text/javascript">
+function enable_order_pkg () {
+  if ( document.OrderPkgForm.pkgpart.selectedIndex > 0 ) {
+    document.OrderPkgForm.submit.disabled = false;
+  } else {
+    document.OrderPkgForm.submit.disabled = true;
+  }
+}
+</SCRIPT>
+<FONT SIZE=4>Purchase additional package</FONT><BR><BR>
+<%= if ( $error ) {
+  $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">$error</FONT><BR><BR>!;
+} ''; %>
+<FORM NAME="OrderPkgForm" ACTION="<%= $selfurl %>" METHOD=POST>
+<INPUT TYPE="hidden" NAME="session" VALUE="<%= $session_id %>">
+<INPUT TYPE="hidden" NAME="action" VALUE="process_order_pkg">
+<INPUT TYPE="hidden" NAME="custnum" VALUE="<%= $custnum %>">
+<TABLE BGCOLOR="#cccccc" BORDER=0 CELLSPACING=0>
+<TR>
+  <TD COLSPAN=2><SELECT NAME="pkgpart" onChange="enable_order_pkg()">
+  <OPTION VALUE="">
+
+  <%=
+    foreach my $part_pkg ( @part_pkg ) {
+      $OUT .= '<OPTION VALUE="'. $part_pkg->{'pkgpart'}. '"';
+      $OUT .= ' SELECTED' if $pkgpart && $part_pkg->{'pkgpart'} == $pkgpart;
+      $OUT .= '>'. $part_pkg->{'pkg'};
+    }
+  %>
+
+  </SELECT></TD>
+</TR>
+<TR>
+  <TD ALIGN="right">Username</TD>
+  <TD><INPUT TYPE="text" NAME="username" VALUE="<%= $username %>"></TD>
+</TR>
+<TR>
+  <TD ALIGN="right">Password</TD>
+  <TD><INPUT TYPE="password" NAME="_password" VALUE="<%= $_password %>"></TD>
+</TR>
+<TR>
+  <TD ALIGN="right">Re-enter Password</TD>
+  <TD><INPUT TYPE="password" NAME="_password2" VALUE="<%= $_password2 %>"></TD>
+</TR>
+<%=
+  if ( $security_phrase ) {
+    $OUT .= <<ENDOUT;
+<TR>
+  <TD ALIGN="right">Security Phrase</TD>
+  <TD><INPUT TYPE="text" NAME="sec_phrase" VALUE="$sec_phrase">
+  </TD>
+</TR>
+ENDOUT
+  } else {
+    $OUT .= '<INPUT TYPE="hidden" NAME="sec_phrase" VALUE="">';
+  }
+%>
+<%=
+  if ( @svc_acct_pop ) {
+    $OUT .= '<TR><TD ALIGN="right">Access number</TD><TD>'.
+            popselector( 'popnum'        => $popnum,
+                         'pops'          => \@svc_acct_pop,
+                         'init_popstate' => $init_popstate,
+                         'popac'         => $popac,
+                         'acstate'       => $acstate,
+                       ).
+            '</TD></TR>';
+  } else {
+    $OUT .= popselector(popnum=>$popnum, pops=>\@svc_acct_pop);
+  }
+%>
+</TABLE>
+<INPUT NAME="submit" TYPE="submit" VALUE="Purchase" disabled>
+</FORM>
+
index 326f902..6d80e89 100644 (file)
@@ -4,73 +4,7 @@
 <TABLE BORDER=0 CELLPADDING=4><TR>
 <%= include('myaccount_menu') %>
 <TD VALIGN="top">
-<FONT SIZE=4>Setup services</FONT><BR><BR>
-
-<SCRIPT>
-function areyousure(href, message) {
-    if (confirm(message) == true)
-        window.location.href = href;
-}
-</SCRIPT>
-
-<%= foreach my $pkg (
-      grep {    scalar(@{$_->{part_svc}})
-             || scalar(@{$_->{cust_svc}})
-           } @cust_pkg
-    ) {
-
-  $OUT .= '<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 BGCOLOR="#ffffff">'.
-          '<TR><TH BGCOLOR="#6666ff" COLSPAN=3>'.
-          $pkg->{'pkg'}.
-          '</TH></TR>';
-
-  my $col1 = "ffffff";
-  my $col2 = "dddddd";
-  my $col = $col1;
-
-  foreach my $cust_svc ( @{ $pkg->{cust_svc} } ) {
-    my $td = qq!<TD BGCOLOR="#$col"!;
-
-    $OUT .= '<TR>'.
-              "$td ALIGN=right>". $cust_svc->{label}[0]. ': </TD>'.
-              "$td><B>". $cust_svc->{label}[1]. '</B></TD>'.
-              "$td><FONT SIZE=-1>";
-              
-    #if ( $cust_svc->{label}[2] eq 'svc_acct' ) {
-    #  $OUT .= qq!(<A HREF="${url}changepw;svcnum=$cust_svc->{'svcnum'}">!.
-    #          'change&nbsp;pw) ';
-    #}
-
-    unless ( $cust_svc->{'svcnum'} == $svcnum ) {
-      $OUT .= qq!(<A HREF="javascript:areyousure('${url}delete_svc;svcnum=$cust_svc->{svcnum}', 'This will perminantly delete the $cust_svc->{label}[1] $cust_svc->{label}[0].  Are you sure?')">!.
-              'delete</A>)';
-
-    }
-    $OUT .= '</FONT></TD></TR>';
-    $col = $col eq $col1 ? $col2 : $col1;
-  }
-
-  $OUT .= '<TR><TD COLSPAN=3 BGCOLOR="#000000"></TD></TR>'
-    if scalar(@{$pkg->{part_svc}}) && scalar(@{$pkg->{cust_svc}});
-
-  my $col = $col1;
-
-  foreach my $part_svc ( @{ $pkg->{part_svc} } ) {
-
-    my $td = qq!<TD BGCOLOR="#$col"!;
-
-    $OUT .= "<TR>$td COLSPAN=3>".
-            qq!<A HREF="${url}provision_svc;pkgnum=$pkg->{'pkgnum'};svcpart=$part_svc->{'svcpart'}">!.
-            'Setup '. $part_svc->{'svc'}. '</A> '.
-            '('. $part_svc->{'num_avail'}. ' available)'.
-            '</TD></TR>';
-    $col = $col eq $col1 ? $col2 : $col1;
-  }
-
-  $OUT .= '</TABLE><BR>';
-
-} %>
-
+<%= include('provision_list') %>
 </TD></TR></TABLE>
 <HR>
 <FONT SIZE="-2">powered by <a href="http://www.sisd.com/freeside">freeside</a></FONT>
diff --git a/fs_selfservice/FS-SelfService/cgi/provision_list.html b/fs_selfservice/FS-SelfService/cgi/provision_list.html
new file mode 100644 (file)
index 0000000..7e70593
--- /dev/null
@@ -0,0 +1,74 @@
+<FONT SIZE=4>Setup services</FONT><BR><BR>
+
+<SCRIPT>
+function areyousure(href, message) {
+    if (confirm(message) == true)
+        window.location.href = href;
+}
+</SCRIPT>
+
+<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 BGCOLOR="#ffffff">
+
+<%= foreach my $pkg (
+      grep {    scalar(@{$_->{part_svc}})
+             || scalar(@{$_->{cust_svc}})
+           } @cust_pkg
+    ) {
+
+  $OUT .= #'<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 BGCOLOR="#ffffff">'.
+          '<TR><TH BGCOLOR="#6666ff" COLSPAN=3>'.
+          $pkg->{'pkg'}.
+          '</TH></TR>';
+
+  my $col1 = "ffffff";
+  my $col2 = "dddddd";
+  my $col = $col1;
+
+  foreach my $cust_svc ( @{ $pkg->{cust_svc} } ) {
+    my $td = qq!<TD BGCOLOR="#$col"!;
+
+    $OUT .= '<TR>'.
+              "$td ALIGN=right>". $cust_svc->{label}[0]. ': </TD>'.
+              "$td><B>". $cust_svc->{label}[1]. '</B>';
+    $OUT .= '<BR><I>password: '. encode_entities($cust_svc->{_password}). '</I>'
+      if exists($cust_svc->{_password});
+    $OUT .= '</TD>'.
+              "$td><FONT SIZE=-1>";
+              
+    #if ( $cust_svc->{label}[2] eq 'svc_acct' ) {
+    #  $OUT .= qq!(<A HREF="${url}changepw;svcnum=$cust_svc->{'svcnum'}">!.
+    #          'change&nbsp;pw) ';
+    #}
+
+    unless ( $cust_svc->{'svcnum'} == $svcnum ) {
+      $OUT .= qq!(<A HREF="javascript:areyousure('${url}delete_svc;svcnum=$cust_svc->{svcnum}', 'This will perminantly delete the $cust_svc->{label}[1] $cust_svc->{label}[0].  Are you sure?')">!.
+              'delete</A>)';
+
+    }
+    $OUT .= '</FONT></TD></TR>';
+    $col = $col eq $col1 ? $col2 : $col1;
+  }
+
+  $OUT .= '<TR><TD COLSPAN=3 BGCOLOR="#000000"></TD></TR>'
+    if scalar(@{$pkg->{part_svc}}) && scalar(@{$pkg->{cust_svc}});
+
+  $col = $col1;
+
+  foreach my $part_svc ( @{ $pkg->{part_svc} } ) {
+
+    my $td = qq!<TD BGCOLOR="#$col"!;
+
+    $OUT .= "<TR>$td COLSPAN=3 ALIGN=center>".
+            qq!<A HREF="${url}provision_svc;pkgnum=$pkg->{'pkgnum'};svcpart=$part_svc->{'svcpart'}">!.
+            'Setup '. $part_svc->{'svc'}. '</A> '.
+            '('. $part_svc->{'num_avail'}. ' available)'.
+            '</TD></TR>';
+    $col = $col eq $col1 ? $col2 : $col1;
+  }
+
+  #$OUT .= '</TABLE><BR>';
+  $OUT .= '<TR><TD BGCOLOR="#eeeeee" COLSPAN=3>&nbsp;</TD></TR>';
+
+} %>
+
+</TABLE>
index d8e044a..44dd8bb 100644 (file)
@@ -6,6 +6,7 @@ use subs qw(do_template);
 use CGI;
 use CGI::Carp qw(fatalsToBrowser);
 use Text::Template;
+use HTML::Entities;
 use FS::SelfService qw( login customer_info invoice
                         payment_info process_payment 
                         list_pkgs
@@ -176,7 +177,9 @@ sub logout {
 }
 
 sub provision {
-  list_pkgs( 'session_id' => $session_id );
+  my $result = list_pkgs( 'session_id' => $session_id );
+  die $result->{'error'} if exists $result->{'error'} && $result->{'error'};
+  $result;
 }
 
 sub provision_svc {
@@ -204,7 +207,7 @@ sub process_svc_acct {
   );
 
   if ( exists $result->{'error'} && $result->{'error'} ) { 
-    warn "$result $result->{'error'}"; 
+    #warn "$result $result->{'error'}"; 
     $action = 'provision_svc_acct';
     return {
       $cgi->Vars,
@@ -215,7 +218,7 @@ sub process_svc_acct {
       'error' => $result->{'error'},
     };
   } else {
-    warn "$result $result->{'error'}"; 
+    #warn "$result $result->{'error'}"; 
     return $result;
   }
 
@@ -255,8 +258,10 @@ sub do_template {
 package FS::SelfService::_selfservicecgi;
 
 #use FS::SelfService qw(regionselector expselect popselector);
+use HTML::Entities;
 use FS::SelfService qw(popselector);
 
+#false laziness w/agent.cgi
 sub include {
   my $name = shift;
   my $template = new Text::Template( TYPE   => 'FILE',
@@ -266,7 +271,9 @@ sub include {
                                    )
     or die $Text::Template::ERROR;
 
-  $template->fill_in();
+  $template->fill_in( PACKAGE => 'FS::SelfService::_selfservicecgi',
+                      #HASH    => $fill_in
+                    );
 
 }
 
diff --git a/fs_selfservice/FS-SelfService/cgi/svc_acct.html b/fs_selfservice/FS-SelfService/cgi/svc_acct.html
new file mode 100644 (file)
index 0000000..abed878
--- /dev/null
@@ -0,0 +1,55 @@
+<FONT SIZE=4>Setup <%= $svc %></FONT><BR><BR>
+
+<%= if ( $error ) {
+  $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">Error setting up $svc: $error!.
+          '</FONT><BR><BR>';
+} ''; %>
+<FORM ACTION="<%= $selfurl %>" METHOD=POST>
+<INPUT TYPE="hidden" NAME="session" VALUE="<%= $session_id %>">
+<INPUT TYPE="hidden" NAME="action" VALUE="process_svc_acct">
+<INPUT TYPE="hidden" NAME="custnum" VALUE="<%= $custnum %>">
+<INPUT TYPE="hidden" NAME="pkgnum" VALUE="<%= $pkgnum %>">
+<INPUT TYPE="hidden" NAME="svcpart" VALUE="<%= $svcpart %>">
+<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 BGCOLOR="#cccccc">
+<TR>
+  <TD ALIGN="right">Username</TD>
+  <TD><INPUT TYPE="text" NAME="username" VALUE="<%= $username %>"></TD>
+</TR>
+<TR>
+  <TD ALIGN="right">Password</TD>
+  <TD><INPUT TYPE="password" NAME="_password" VALUE="<%= $_password %>"></TD>
+</TR>
+<TR>
+  <TD ALIGN="right">Re-enter Password</TD>
+  <TD><INPUT TYPE="password" NAME="_password2" VALUE="<%= $_password2 %>"></TD>
+</TR>
+<%=
+  if ( $security_phrase ) {
+    $OUT .= <<ENDOUT;
+<TR>
+  <TD ALIGN="right">Security Phrase</TD>
+  <TD><INPUT TYPE="text" NAME="sec_phrase" VALUE="$sec_phrase">
+  </TD>
+</TR>
+ENDOUT
+  } else {
+    $OUT .= '<INPUT TYPE="hidden" NAME="sec_phrase" VALUE="">';
+  }
+%>
+<%=
+  if ( @svc_acct_pop ) {
+    $OUT .= '<TR><TD ALIGN="right">Access number</TD><TD>'.
+            popselector( 'popnum'        => $popnum,
+                         'pops'          => \@svc_acct_pop,
+                         'init_popstate' => $init_popstate,
+                         'popac'         => $popac,
+                         'acstate'       => $acstate,
+                       ).
+            '</TD></TR>';
+  } else {
+    $OUT .= popselector(popnum=>$popnum, pops=>\@svc_acct_pop);
+  }
+%>
+</TABLE>
+<INPUT TYPE="submit" VALUE="Setup">
+</FORM>
index e4e9be2..11e4432 100644 (file)
@@ -1,10 +1,9 @@
-<HTML><HEAD><TITLE>View Customer</TITLE></HEAD>
-<BODY BGCOLOR="#eeeeee"><FONT SIZE=5>View Customer</FONT><BR><BR>
+<HTML><HEAD><TITLE>Reseller</TITLE></HEAD>
+<BODY BGCOLOR="#eeeeee"><FONT SIZE=5>Reseller</FONT><BR><BR>
 <%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<TABLE BORDER=0 CELLPADDING=4><TR><TD VALIGN="top" HEIGHT=384 BGCOLOR="#dddddd">
-<A HREF="<%= $url %>agent_main">Reseller Main</A><BR>
-<!-- <A HREF="<%= $url %>other">SomethingElse</A><BR> -->
-</TD><TD VALIGN="top">
+<TABLE BORDER=0 CELLPADDING=4><TR>
+<%= include('agent_menu') %>
+<TD VALIGN="top">
 
 <%= $message
       ? "<FONT SIZE=\"+2\"><B>$message</B></FONT><BR><BR>"
 
 <%= $small_custview %>
 
-<BR>Purchase additional package
-<FORM ACTION="<%= $selfurl %>" METHOD=POST>
-<INPUT TYPE="hidden" NAME="session" VALUE="<%= $session_id %>">
-<INPUT TYPE="hidden" NAME="action" VALUE="process_order_pkg">
-<INPUT TYPE="hidden" NAME="custnum" VALUE="<%= $custnum %>">
-<TABLE BGCOLOR="#cccccc" BORDER=0 CELLSPACING=0>
-<TR>
-  <TD COLSPAN=2><SELECT NAME="pkgpart"><OPTION VALUE="">
+<BR>
 
-  <%=
-    foreach my $part_pkg ( @part_pkg ) {
-      $OUT .= '<OPTION VALUE="'. $part_pkg->{'pkgpart'}. '"';
-      $OUT .= ' SELECTED' if $pkgpart && $part_pkg->{'pkgpart'} == $pkgpart;
-      $OUT .= '>'. $part_pkg->{'pkg'};
-    }
-  %>
+<TABLE BORDER=0 CELLPADDING=4><TR>
+<%= include('agent_customer_menu') %>
+<TD VALIGN="top">
 
-  </SELECT></TD>
-</TR>
-<TR>
-  <TD ALIGN="right">Username</TD>
-  <TD><INPUT TYPE="text" NAME="username" VALUE="<%= $username %>"></TD>
-</TR>
-<TR>
-  <TD ALIGN="right">Password</TD>
-  <TD><INPUT TYPE="password" NAME="_password" VALUE="<%= $_password %>"></TD>
-</TR>
-<TR>
-  <TD ALIGN="right">Re-enter Password</TD>
-  <TD><INPUT TYPE="password" NAME="_password2" VALUE="<%= $_password2 %>"></TD>
-</TR>
-<%=
-  if ( $security_phrase ) {
-    $OUT .= <<ENDOUT;
-<TR>
-  <TD ALIGN="right">Security Phrase</TD>
-  <TD><INPUT TYPE="text" NAME="sec_phrase" VALUE="$sec_phrase">
-  </TD>
-</TR>
-ENDOUT
-  } else {
-    $OUT .= '<INPUT TYPE="hidden" NAME="sec_phrase" VALUE="">';
-  }
-%>
-<%=
-  if ( @svc_acct_pop ) {
-    $OUT .= '<TR><TD ALIGN="right">Access number</TD><TD>'.
-            popselector( 'popnum'        => $popnum,
-                         'pops'          => \@svc_acct_pop,
-                         'init_popstate' => $init_popstate,
-                         'popac'         => $popac,
-                         'acstate'       => $acstate,
-                       ).
-            '</TD></TR>';
-  } else {
-    $OUT .= popselector(popnum=>$popnum, pops=>\@svc_acct_pop);
-  }
-%>
-</TABLE>
-<INPUT TYPE="submit" VALUE="Purchase">
-</FORM>
+</TD></TR></TABLE>
 
 </TD></TR></TABLE>
 <HR>
index 632d68d..27f23de 100755 (executable)
@@ -498,28 +498,12 @@ sub lastsearch {
   }
 
   if ( $last_type{'Fuzzy'} || $last_type{'All'} ) {
-
-    &FS::cust_main::check_and_rebuild_fuzzyfiles;
-    my $all_last = &FS::cust_main::all_last;
-
-    my %last;
-    if ( $last_type{'Fuzzy'} || $last_type{'All'} ) { 
-      foreach ( amatch($last, [ qw(i) ], @$all_last) ) {
-        $last{$_}++; 
-      }
-    }
-
-    #if ($last_type{'Sound-alike'}) {
-    #}
-
-    foreach ( keys %last ) {
-      push @cust_main, qsearch('cust_main',{'last'=>$_});
-      push @cust_main, qsearch('cust_main',{'ship_last'=>$_})
-        if defined dbdef->table('cust_main')->column('ship_last');
-    }
-
+    push @cust_main, FS::cust_main->fuzzy_search( { 'last' => $last } );
   }
 
+  #if ($last_type{'Sound-alike'}) {
+  #}
+
   \@cust_main;
 }
 
@@ -561,26 +545,10 @@ sub companysearch {
   }
 
   if ( $company_type{'Fuzzy'} || $company_type{'All'} ) {
+    push @cust_main, FS::cust_main->fuzzy_search( { 'company' => $company } );
+  }
 
-    &FS::cust_main::check_and_rebuild_fuzzyfiles;
-    my $all_company = &FS::cust_main::all_company;
-
-    my %company;
-    if ( $company_type{'Fuzzy'} || $company_type{'All'} ) { 
-      foreach ( amatch($company, [ qw(i) ], @$all_company ) ) {
-        $company{$_}++;
-      }
-    }
-
-    #if ($company_type{'Sound-alike'}) {
-    #}
-
-    foreach ( keys %company ) {
-      push @cust_main, qsearch('cust_main',{'company'=>$_});
-      push @cust_main, qsearch('cust_main',{'ship_company'=>$_})
-        if defined dbdef->table('cust_main')->column('ship_last');
-    }
-
+  if ($company_type{'Sound-alike'}) {
   }
 
   \@cust_main;