[freeside-commits] branch FREESIDE_3_BRANCH updated. 612e58b49d5f1b9421d6bc33e4e63232a9cd4f49

Mark Wells mark at 420.am
Thu Oct 6 16:48:30 PDT 2016


The branch, FREESIDE_3_BRANCH has been updated
       via  612e58b49d5f1b9421d6bc33e4e63232a9cd4f49 (commit)
       via  203bdd8c6e9e3d12526f80aa064c32ef7e42663a (commit)
       via  8bd159590e349d9d49855333bb770be3c2ba64c1 (commit)
       via  25eda4efc27a2f7aecece010bee4ef1ef6ce81f2 (commit)
       via  87807a1e2d66cea4aa4bcc7c6694adab11a5f5a0 (commit)
       via  5a01b56c54b68254488418cffa5ec7dd75004525 (commit)
       via  3266069ed722e942150d209d1eeb5604e5ddbae8 (commit)
      from  0e5715ba57a4dd19047c7cdcd1416b9e4daa097c (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 612e58b49d5f1b9421d6bc33e4e63232a9cd4f49
Author: Mark Wells <mark at freeside.biz>
Date:   Thu Oct 6 16:30:50 2016 -0700

    fix prospect creation from EUS API, #39776

diff --git a/FS/FS/ClientAPI/Signup.pm b/FS/FS/ClientAPI/Signup.pm
index e8822f0..0a9813f 100644
--- a/FS/FS/ClientAPI/Signup.pm
+++ b/FS/FS/ClientAPI/Signup.pm
@@ -1299,7 +1299,15 @@ sub new_prospect {
         'title'     => $title,
     });
     if (!$part_referral) {
-      return { error => "Unknown referral type: '$title'" };
+      $part_referral = FS::part_referral->new({
+        'agentnum' => $agentnum,
+        'title'    => $title,
+        'referral' => $title,
+      });
+      $error = $part_referral->insert;
+      if ( $error ) {
+        warn "ERROR: could not create referral type '$title': $error\n";
+      }
     }
     $refnum = $part_referral->refnum;
   } elsif ( $packet->{refnum} ) {
@@ -1348,9 +1356,8 @@ sub new_prospect {
   }
   $location->set('country', $country);
   $location->set('state', $state);
-  $prospect->set('cust_location', $location);
 
-  $error ||= $prospect->insert; # also does location
+  $error ||= $prospect->insert( cust_location => $location );
   return { error => $error } if $error;
 
   my $contact = FS::contact->new({
diff --git a/ng_selfservice/coverage_post.php b/ng_selfservice/coverage_post.php
index 657a2ff..c457002 100644
--- a/ng_selfservice/coverage_post.php
+++ b/ng_selfservice/coverage_post.php
@@ -10,7 +10,7 @@ $xml = file_get_contents('php://input');
 $doc = new SimpleXMLElement($xml);
 $cd = $doc->CustomerDetails;
 if ($DEBUG) {
-    error_log(var_dump($cd));
+    error_log(print_r($cd),1);
 }
 
 // State and Country are names rather than codes, but we fix that on the other
@@ -35,9 +35,9 @@ $prospect = Array();
 foreach ($map_fields as $k => $v) {
     $prospect[$k] = (string)($cd->$v);
 }
-error_log(var_dump($prospect));
+error_log(print_r($prospect),1);
 $freeside = new FreesideSelfService();
 $result = $freeside->new_prospect($prospect);
-error_log(var_dump($result));
+error_log(print_r($result),1);
 
 ?>

commit 203bdd8c6e9e3d12526f80aa064c32ef7e42663a
Author: Mark Wells <mark at freeside.biz>
Date:   Thu Oct 6 16:30:32 2016 -0700

    fix tower height, #39776

diff --git a/httemplate/misc/tower-export.html b/httemplate/misc/tower-export.html
index d359a97..9d63640 100644
--- a/httemplate/misc/tower-export.html
+++ b/httemplate/misc/tower-export.html
@@ -18,7 +18,7 @@ if ( $cgi->param('format') eq 'tc' ) {
     next if ( !$tower->latitude or !$tower->longitude );
 
     my $name = $tower->towername;
-    my $height = ( ($tower->altitude || 0 ) + ($tower->height || 0) ) / 3.28;
+    my $height = ($tower->height || 0) / 3.28;
     $name =~ s(,)( )g;
     $text .= join(',',
       $name,

commit 8bd159590e349d9d49855333bb770be3c2ba64c1
Author: Mark Wells <mark at freeside.biz>
Date:   Thu Oct 6 16:30:28 2016 -0700

    tower location CSV download, #39776
    
    Conflicts:
    	httemplate/browse/tower.html

diff --git a/httemplate/browse/tower.html b/httemplate/browse/tower.html
index ab6be30..16e44c6 100644
--- a/httemplate/browse/tower.html
+++ b/httemplate/browse/tower.html
@@ -5,6 +5,8 @@
                       $p.'edit/tower.html',
                      'Sector coverage maps' =>
                       $p.'search/sector.html',
+                     'Download CSV for towercoverage.com' =>
+                      $p.'misc/tower-export.html?format=tc'
                   ],
   'query'       => { 'table' => 'tower', },
   'count_query' => 'SELECT COUNT(*) FROM tower',
diff --git a/httemplate/edit/tower.html b/httemplate/edit/tower.html
index f27f6ac..377a33e 100644
--- a/httemplate/edit/tower.html
+++ b/httemplate/edit/tower.html
@@ -26,9 +26,9 @@
                         'default_ip_addr' => 'Tower IP address',
                         'latitude'        => 'Latitude',
                         'longitude'       => 'Longitude',
-                        'altitude'        => 'Altitude',
-                        'height'          => 'Height',
-                        'veg_height'      => 'Vegetation height',
+                        'altitude'        => 'Altitude (feet)',
+                        'height'          => 'Height (feet)',
+                        'veg_height'      => 'Vegetation height (feet)',
                         'color'           => 'Color',
                       },
 &>
diff --git a/httemplate/misc/tower-export.html b/httemplate/misc/tower-export.html
new file mode 100644
index 0000000..d359a97
--- /dev/null
+++ b/httemplate/misc/tower-export.html
@@ -0,0 +1,36 @@
+<%init>
+# currently, browse/tower just shows all towers, so do the same here
+my @towers = qsearch({ table => 'tower' });
+http_header('Content-Type' => 'text/csv');
+http_header('Content-Disposition' => 'attachment;filename=towers.csv');
+if ( $cgi->param('format') eq 'tc' ) {
+  # towercoverage.com format: not a true CSV, no quoting (so no way to include
+  # commas in any field, so we strip them)
+
+  # lat/long are signed decimals, northeast positive
+  # height is in meters
+  # Description/Group are not necessary
+  # sector/antenna information (orientation, beamwidth, gain, frequency,
+  # etc.) is in what TC calls a "Coverage", which can't be edited this way.
+  my $text = "SiteName,Latitude,Longitude,Description,Group,Height\n";
+
+  foreach my $tower (@towers) {
+    next if ( !$tower->latitude or !$tower->longitude );
+
+    my $name = $tower->towername;
+    my $height = ( ($tower->altitude || 0 ) + ($tower->height || 0) ) / 3.28;
+    $name =~ s(,)( )g;
+    $text .= join(',',
+      $name,
+      $tower->latitude,
+      $tower->longitude,
+      '',
+      '',
+      $height,
+    ) . "\n";
+  }
+  $m->print($text);
+} else {
+  die('unknown format '.$cgi->param('format'));
+}
+</%init>

commit 25eda4efc27a2f7aecece010bee4ef1ef6ce81f2
Author: Mark Wells <mark at freeside.biz>
Date:   Thu Oct 6 16:26:31 2016 -0700

    create prospects from towercoverage.com EUS, #39776

diff --git a/ng_selfservice/coverage_post.php b/ng_selfservice/coverage_post.php
new file mode 100644
index 0000000..657a2ff
--- /dev/null
+++ b/ng_selfservice/coverage_post.php
@@ -0,0 +1,43 @@
+<?
+
+$DEBUG = 1;
+
+require_once('freeside.class.php');
+
+$xml = file_get_contents('php://input');
+//error_log($xml);
+
+$doc = new SimpleXMLElement($xml);
+$cd = $doc->CustomerDetails;
+if ($DEBUG) {
+    error_log(var_dump($cd));
+}
+
+// State and Country are names rather than codes, but we fix that on the other
+// end.
+// It doesn't look like TowerCoverage ever sends a company name.
+$map_fields = Array(
+    'first'           => 'FirstName',
+    'last'            => 'LastName',
+    'address1'        => 'StreetAddress',
+    'city'            => 'City',
+    'state'           => 'State',
+    'country'         => 'Country',
+    'zip'             => 'ZIP',
+    'phone_daytime'   => 'PhoneNumber',
+    'emailaddress'    => 'EmailAddress',
+    'comment'         => 'Comment',
+    'referral_title'  => 'HearAbout',
+);
+
+$prospect = Array();
+// missing from this: any way to set the agent. this should use the API key.
+foreach ($map_fields as $k => $v) {
+    $prospect[$k] = (string)($cd->$v);
+}
+error_log(var_dump($prospect));
+$freeside = new FreesideSelfService();
+$result = $freeside->new_prospect($prospect);
+error_log(var_dump($result));
+
+?>

commit 87807a1e2d66cea4aa4bcc7c6694adab11a5f5a0
Author: Mark Wells <mark at freeside.biz>
Date:   Thu Oct 6 16:26:18 2016 -0700

    make new_prospect smarter, #39776

diff --git a/FS/FS/ClientAPI/Signup.pm b/FS/FS/ClientAPI/Signup.pm
index 4ee272c..e8822f0 100644
--- a/FS/FS/ClientAPI/Signup.pm
+++ b/FS/FS/ClientAPI/Signup.pm
@@ -1251,9 +1251,11 @@ sub get_agentnum {
 
 Creates a new L<FS::prospect_main> entry. PACKET must contain:
 
-- either agentnum or session_id (unless signup_server-default_agentnum exists)
+- either agentnum or session_id; if not, signup_server-default_agentnum will
+be used and must not be empty
 
-- refnum (unless signup_server-default_refnum exists)
+- either refnum or referral_title; if not, signup_server-default_refnum will
+be used and must not be empty
 
 - last and first (names), and optionally company and title
 
@@ -1261,8 +1263,15 @@ Creates a new L<FS::prospect_main> entry. PACKET must contain:
 
 - emailaddress
 
+and can also contain:
+
 - one or more of phone_daytime, phone_night, phone_mobile, and phone_fax
 
+- a 'comment' (will be attached to the contact)
+
+State and country will be normalized to Freeside state/country codes if
+necessary.
+
 =cut
 
 sub new_prospect {
@@ -1275,10 +1284,29 @@ sub new_prospect {
   my $dbh = dbh;
   my $conf = FS::Conf->new;
 
+  my $error;
+
   my $agentnum = get_agentnum($packet);
   return $agentnum if ref $agentnum;
-  my $refnum = $packet->{refnum}
-               || $conf->config('signup_server-default_refnum');
+  my $refnum;
+  if ( my $title = $packet->{referral_title} ) {
+    my $part_referral = qsearchs('part_referral', {
+        'agentnum'  => $agentnum,
+        'title'     => $title,
+    });
+    $part_referral ||= qsearchs('part_referral', {
+        'agentnum'  => '',
+        'title'     => $title,
+    });
+    if (!$part_referral) {
+      return { error => "Unknown referral type: '$title'" };
+    }
+    $refnum = $part_referral->refnum;
+  } elsif ( $packet->{refnum} ) {
+    $refnum = $packet->{refnum};
+  }
+  $refnum ||= $conf->config('signup_server-default_refnum');
+  return { error => "Signup referral type is not configured" } if !$refnum;
 
   my $prospect = FS::prospect_main->new({
       'agentnum' => $agentnum,
@@ -1287,12 +1315,42 @@ sub new_prospect {
   });
 
   my $location = FS::cust_location->new;
-  foreach ( qw(address1 address2 city county state zip country ) ) {
+  foreach ( qw(address1 address2 city county zip ) ) {
     $location->set($_, $packet->{$_});
   }
+  # normalize country and state if they're not already ISO codes
+  # easier than doing it on the client side--we already have the tables here
+  my $country = $packet->{country};
+  my $state = $packet->{state};
+  if (length($country) > 2) {
+    # it likes title case
+    $country = join(' ', map ucfirst, split(/\s+/, $country));
+    my $lsc = Locale::SubCountry->new($country);
+    if ($lsc) {
+      $country = uc($lsc->country_code);
+
+      if ($lsc->has_sub_countries) {
+        if ( $lsc->full_name($state) eq 'unknown' ) {
+          # then we were probably given a full name, so resolve it
+          $state = $lsc->code($state);
+          if ( $state eq 'unknown' ) {
+            # doesn't resolve as a full name either, return an error
+            $error = "Unknown state: ".$packet->{state};
+          } else {
+            $state = uc($state);
+          }
+        }
+      } # else state doesn't matter
+    } else {
+      # couldn't find the country in LSC
+      $error = "Unknown country: $country";
+    }
+  }
+  $location->set('country', $country);
+  $location->set('state', $state);
   $prospect->set('cust_location', $location);
-  
-  my $error = $prospect->insert; # also does location
+
+  $error ||= $prospect->insert; # also does location
   return { error => $error } if $error;
 
   my $contact = FS::contact->new({
@@ -1301,7 +1359,7 @@ sub new_prospect {
       invoice_dest  => 'Y',
   });
   # use emailaddress pseudo-field behavior here
-  foreach (qw(last first title emailaddress)) {
+  foreach (qw(last first title emailaddress comment)) {
     $contact->set($_, $packet->{$_});
   }
   $error = $contact->insert;

commit 5a01b56c54b68254488418cffa5ec7dd75004525
Author: Mark Wells <mark at freeside.biz>
Date:   Thu Oct 6 16:26:08 2016 -0700

    add part_referral external ID for API signups, #39776

diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm
index cd8213a..2acbe3d 100644
--- a/FS/FS/Schema.pm
+++ b/FS/FS/Schema.pm
@@ -2445,11 +2445,12 @@ sub tables_hashref {
         'refnum',   'serial',     '',        '', '', '', 
         'referral', 'varchar',    '',   $char_d, '', '', 
         'disabled', 'char',   'NULL',         1, '', '', 
-        'agentnum', 'int',    'NULL',        '', '', '', 
+        'agentnum', 'int',    'NULL',        '', '', '',
+        'title',   'varchar', 'NULL',   $char_d, '', '', 
       ],
-      'primary_key' => 'refnum',
-      'unique' => [],
-      'index' => [ ['disabled'], ['agentnum'], ],
+      'primary_key'  => 'refnum',
+      'unique'       => [ ['agentnum', 'title'] ],
+      'index'        => [ ['disabled'], ['agentnum'], ],
     },
 
     'part_svc' => {
diff --git a/FS/FS/part_referral.pm b/FS/FS/part_referral.pm
index 992e1c5..38f9fc1 100644
--- a/FS/FS/part_referral.pm
+++ b/FS/FS/part_referral.pm
@@ -44,6 +44,9 @@ The following fields are currently supported:
 
 =item agentnum - Optional agentnum (see L<FS::agent>)
 
+=item title - an optional external string that identifies this
+referral source, such as an advertising campaign code.
+
 =back
 
 =head1 NOTE
@@ -101,6 +104,7 @@ sub check {
     || $self->ut_text('referral')
     || $self->ut_enum('disabled', [ '', 'Y' ] )
     #|| $self->ut_foreign_keyn('agentnum', 'agent', 'agentnum')
+    || $self->ut_textn('title')
     || ( $setup_hack
            ? $self->ut_foreign_keyn('agentnum', 'agent', 'agentnum' )
            : $self->ut_agentnum_acl('agentnum', 'Edit global advertising sources')
diff --git a/httemplate/edit/part_referral.html b/httemplate/edit/part_referral.html
index e9fd794..04287d6 100755
--- a/httemplate/edit/part_referral.html
+++ b/httemplate/edit/part_referral.html
@@ -3,11 +3,13 @@
                 'table'       => 'part_referral',
                 'fields'      => [ 'referral',
                                    { field=>'agentnum', type=>'select-agent', },
+                                   'title',
                                    { field=>'disabled', type=>'checkbox', value=>'Y'  } ,
                                  ],
                 'labels'      => { 'refnum'   => 'Ad Source',
                                    'referral' => 'Advertising source',
                                    'agentnum' => 'Agent',
+                                   'title'    => 'External ID',
                                    'disabled' => 'Disabled',
                                  },
                 'viewall_dir' => 'browse',

commit 3266069ed722e942150d209d1eeb5604e5ddbae8
Author: Mark Wells <mark at freeside.biz>
Date:   Thu Oct 6 15:55:25 2016 -0700

    create prospects through signup API, #39776

diff --git a/FS/FS/ClientAPI/Signup.pm b/FS/FS/ClientAPI/Signup.pm
index 7c70a67..4ee272c 100644
--- a/FS/FS/ClientAPI/Signup.pm
+++ b/FS/FS/ClientAPI/Signup.pm
@@ -7,7 +7,7 @@ use Data::Dumper;
 use Tie::RefHash;
 use Digest::SHA qw(sha512_hex);
 use FS::Conf;
-use FS::Record qw(qsearch qsearchs dbdef);
+use FS::Record qw(qsearch qsearchs dbdef dbh);
 use FS::CGI qw(popurl);
 use FS::Msgcat qw(gettext);
 use FS::Misc qw(card_types);
@@ -30,6 +30,25 @@ use FS::part_tag;
 $DEBUG = 0;
 $me = '[FS::ClientAPI::Signup]';
 
+=head1 NAME
+
+FS::ClientAPI::Signup - Front-end API for signing up customers
+
+=head1 DESCRIPTION
+
+This module provides the ClientAPI functions for talking to a signup
+server. The signup server is open to the public, i.e. does not require a
+login. The back-end Freeside server creates customers, orders packages and
+services, and processes initial payments.
+
+=head1 METHODS
+
+=over 4
+
+=cut
+
+# document the rest of this as we work on it
+
 sub clear_cache {
   warn "$me clear_cache called\n" if $DEBUG;
   my $cache = new FS::ClientAPI_SessionCache( {
@@ -498,21 +517,8 @@ sub new_customer {
     #possibly some validation will be needed
   }
 
-  my $agentnum;
-  if ( exists $packet->{'session_id'} ) {
-    my $cache = new FS::ClientAPI_SessionCache( {
-      'namespace' => 'FS::ClientAPI::Agent',
-    } );
-    my $session = $cache->get($packet->{'session_id'});
-    if ( $session ) {
-      $agentnum = $session->{'agentnum'};
-    } else {
-      return { 'error' => "Can't resume session" }; #better error message
-    }
-  } else {
-    $agentnum = $packet->{agentnum}
-                || $conf->config('signup_server-default_agentnum');
-  }
+  my $agentnum = get_agentnum($packet);
+  return $agentnum if ref($agentnum);
 
   my ($bill_hash, $ship_hash);
   foreach my $f (FS::cust_main->location_fields) {
@@ -932,21 +938,8 @@ sub new_customer_minimal {
     #possibly some validation will be needed
   }
 
-  my $agentnum;
-  if ( exists $packet->{'session_id'} ) {
-    my $cache = new FS::ClientAPI_SessionCache( {
-      'namespace' => 'FS::ClientAPI::Agent',
-    } );
-    my $session = $cache->get($packet->{'session_id'});
-    if ( $session ) {
-      $agentnum = $session->{'agentnum'};
-    } else {
-      return { 'error' => "Can't resume session" }; #better error message
-    }
-  } else {
-    $agentnum = $packet->{agentnum}
-                || $conf->config('signup_server-default_agentnum');
-  }
+  my $agentnum = get_agentnum($packet);
+  return $agentnum if ref($agentnum);
 
   #shares some stuff with htdocs/edit/process/cust_main.cgi... take any
   # common that are still here and library them.
@@ -1221,4 +1214,128 @@ sub capture_payment {
 
 }
 
+=item get_agentnum PACKET
+
+Given a PACKET from the signup server, looks up the agentnum to use for signing
+up a customer. This will use 'session_id' if the agent is authenticated,
+otherwise 'agentnum', otherwise the 'signup_server-default_agentnum' config. If
+the agent can't be found, returns an error packet.
+
+=cut
+
+sub get_agentnum {
+  my $packet = shift;
+  my $conf = new FS::Conf;
+  my $agentnum;
+  if ( exists $packet->{'session_id'} ) {
+    my $cache = new FS::ClientAPI_SessionCache( {
+      'namespace' => 'FS::ClientAPI::Agent',
+    } );
+    my $session = $cache->get($packet->{'session_id'});
+    if ( $session ) {
+      $agentnum = $session->{'agentnum'};
+    } else {
+      return { 'error' => "Can't resume session" }; #better error message
+    }
+  } else {
+    $agentnum = $packet->{agentnum}
+                || $conf->config('signup_server-default_agentnum');
+  }
+  if ( $agentnum and FS::agent->count('agentnum = ?', $agentnum) ) {
+    return $agentnum;
+  }
+  return { 'error' => 'Signup is not configured' };
+}
+
+=item new_prospect PACKET
+
+Creates a new L<FS::prospect_main> entry. PACKET must contain:
+
+- either agentnum or session_id (unless signup_server-default_agentnum exists)
+
+- refnum (unless signup_server-default_refnum exists)
+
+- last and first (names), and optionally company and title
+
+- address1, city, state, country, zip, and optionally address2
+
+- emailaddress
+
+- one or more of phone_daytime, phone_night, phone_mobile, and phone_fax
+
+=cut
+
+sub new_prospect {
+
+  my $packet = shift;
+  warn "$me new_prospect called\n".Dumper($packet) if $DEBUG;
+
+  my $oldAutoCommit = $FS::UID::AutoCommit;
+  local $FS::UID::AutoCommit = 0;
+  my $dbh = dbh;
+  my $conf = FS::Conf->new;
+
+  my $agentnum = get_agentnum($packet);
+  return $agentnum if ref $agentnum;
+  my $refnum = $packet->{refnum}
+               || $conf->config('signup_server-default_refnum');
+
+  my $prospect = FS::prospect_main->new({
+      'agentnum' => $agentnum,
+      'refnum'   => $refnum,
+      'company'  => $packet->{company},
+  });
+
+  my $location = FS::cust_location->new;
+  foreach ( qw(address1 address2 city county state zip country ) ) {
+    $location->set($_, $packet->{$_});
+  }
+  $prospect->set('cust_location', $location);
+  
+  my $error = $prospect->insert; # also does location
+  return { error => $error } if $error;
+
+  my $contact = FS::contact->new({
+      prospectnum   => $prospect->prospectnum,
+      locationnum   => $location->locationnum,
+      invoice_dest  => 'Y',
+  });
+  # use emailaddress pseudo-field behavior here
+  foreach (qw(last first title emailaddress)) {
+    $contact->set($_, $packet->{$_});
+  }
+  $error = $contact->insert;
+  if ( $error ) {
+    $dbh->rollback if $oldAutoCommit;
+    return { error => $error };
+  }
+
+  foreach my $phone_type (qsearch('phone_type', {})) {
+    my $key = 'phone_' . lc($phone_type->typename);
+    my $phonenum = $packet->{$key};
+    if ( $phonenum ) {
+      # just to not have to supply country code from the other end
+      my $number = Number::Phone->new($location->country, $phonenum);
+      if (!$number) {
+        $error = 'invalid phone number';
+      } else {
+        my $phone = FS::contact_phone->new({
+            contactnum    => $contact->contactnum,
+            phonenum      => $phonenum,
+            countrycode   => $number->country_code,
+            phonetypenum  => $phone_type->phonetypenum,
+        });
+        $error = $phone->insert;
+      }
+      if ( $error ) {
+        $dbh->rollback if $oldAutoCommit;
+        return { error => $phone_type->typename . ' phone: ' . $error };
+      }
+    }
+  } # foreach $phone_type
+  
+  $dbh->commit if $oldAutoCommit;
+  return { prospectnum => $prospect->prospectnum };
+}
+
 1;
diff --git a/FS/FS/ClientAPI_XMLRPC.pm b/FS/FS/ClientAPI_XMLRPC.pm
index 7a1fc3e..de3e55d 100644
--- a/FS/FS/ClientAPI_XMLRPC.pm
+++ b/FS/FS/ClientAPI_XMLRPC.pm
@@ -189,6 +189,7 @@ sub ss2clientapi {
   'new_customer_minimal'      => 'Signup/new_customer_minimal',
   'capture_payment'           => 'Signup/capture_payment',
   'clear_signup_cache'        => 'Signup/clear_cache',
+  'new_prospect'              => 'Signup/new_prospect',
   'new_agent'                 => 'Agent/new_agent',
   'agent_login'               => 'Agent/agent_login',
   'agent_logout'              => 'Agent/agent_logout',
diff --git a/fs_selfservice/FS-SelfService/SelfService.pm b/fs_selfservice/FS-SelfService/SelfService.pm
index 32b2ded..700e60b 100644
--- a/fs_selfservice/FS-SelfService/SelfService.pm
+++ b/fs_selfservice/FS-SelfService/SelfService.pm
@@ -109,6 +109,7 @@ $socket .= '.'.$tag if defined $tag && length($tag);
   'new_customer'              => 'Signup/new_customer',
   'new_customer_minimal'      => 'Signup/new_customer_minimal',
   'capture_payment'           => 'Signup/capture_payment',
+  'new_prospect'              => 'Signup/new_prospect',
   #N/A 'clear_signup_cache'        => 'Signup/clear_cache',
   'new_agent'                 => 'Agent/new_agent',
   'agent_login'               => 'Agent/agent_login',

-----------------------------------------------------------------------

Summary of changes:
 FS/FS/ClientAPI/Signup.pm                    |  244 ++++++++++++++++++++++----
 FS/FS/ClientAPI_XMLRPC.pm                    |    1 +
 FS/FS/Schema.pm                              |    9 +-
 FS/FS/part_referral.pm                       |    4 +
 fs_selfservice/FS-SelfService/SelfService.pm |    1 +
 httemplate/browse/tower.html                 |    2 +
 httemplate/edit/part_referral.html           |    2 +
 httemplate/edit/tower.html                   |    6 +-
 httemplate/misc/tower-export.html            |   36 ++++
 ng_selfservice/coverage_post.php             |   43 +++++
 10 files changed, 310 insertions(+), 38 deletions(-)
 create mode 100644 httemplate/misc/tower-export.html
 create mode 100644 ng_selfservice/coverage_post.php




More information about the freeside-commits mailing list