use strict;
use Tie::RefHash;
use FS::Conf;
-use FS::Record qw(qsearch qsearchs);
+use FS::Record qw(qsearch qsearchs dbdef);
+use FS::Msgcat qw(gettext);
use FS::agent;
use FS::cust_main_county;
use FS::part_pkg;
use FS::svc_acct_pop;
use FS::cust_main;
use FS::cust_pkg;
-use FS::Msgcat qw(gettext);
+use FS::svc_acct;
+use FS::acct_snarf;
+use FS::queue;
use FS::ClientAPI; #hmm
FS::ClientAPI->register_handlers(
my $conf = new FS::Conf;
- my $signup_info = {
+ use vars qw($signup_info); #cache for performance;
+ $signup_info ||= {
'cust_main_county' =>
[ map { $_->hashref } qsearch('cust_main_county', {}) ],
+ 'agent' =>
+ [
+ map { $_->hashref }
+ qsearch('agent', dbdef->table('agent')->column('disabled')
+ ? { 'disabled' => '' }
+ : {}
+ )
+ ],
+
+ 'part_referral' =>
+ [
+ map { $_->hashref }
+ qsearch('part_referral',
+ dbdef->table('part_referral')->column('disabled')
+ ? { 'disabled' => '' }
+ : {}
+ )
+ ],
+
'agentnum2part_pkg' =>
{
map {
grep { $_->svcpart('svc_acct') && $href->{ $_->pkgpart } }
qsearch( 'part_pkg', { 'disabled' => '' } )
];
- } qsearch('agent', {} )
+ } qsearch('agent', dbdef->table('agent')->column('disabled')
+ ? { 'disabled' => '' }
+ : {}
+ )
},
'svc_acct_pop' => [ map { $_->hashref } qsearch('svc_acct_pop',{} ) ],
'payby' => [ $conf->config('signup_server-payby') ],
+ 'cvv_enabled' => defined dbdef->table('cust_main')->column('paycvv'),
+
'msgcat' => { map { $_=>gettext($_) } qw(
passwords_dont_match invalid_card unknown_card_type not_a
) },
'countrydefault' => $conf->config('countrydefault') || 'US',
+ 'refnum' => $conf->config('signup_server-default_refnum'),
+
};
- if ( $conf->config('signup_server-default_agentnum') ) {
+ if (
+ $conf->config('signup_server-default_agentnum')
+ && !exists $signup_info->{'part_pkg'} #cache for performance
+ ) {
my $agentnum = $conf->config('signup_server-default_agentnum');
my $agent = qsearchs( 'agent', { 'agentnum' => $agentnum } )
or die "fatal: signup_server-default_agentnum $agentnum not found\n";
my $packet = shift;
my $conf = new FS::Conf;
- my $error = '';
#things that aren't necessary in base class, but are for signup server
#return "Passwords don't match"
# if $hashref->{'_password'} ne $hashref->{'_password2'}
- $error ||= gettext('empty_password') unless $packet->{'_password'};
+ return { 'error' => gettext('empty_password') }
+ unless $packet->{'_password'};
# a bit inefficient for large numbers of pops
- $error ||= gettext('no_access_number_selected')
+ return { 'error' => gettext('no_access_number_selected') }
unless $packet->{'popnum'} || !scalar(qsearch('svc_acct_pop',{} ));
#shares some stuff with htdocs/edit/process/cust_main.cgi... take any
map { $_ => $packet->{$_} } qw(
last first ss company address1 address2 city county state zip country
- daytime night fax payby payinfo paydate payname referral_custnum comments
+ daytime night fax payby payinfo paycvv paydate payname referral_custnum
+ comments
),
} );
- $error ||= "Illegal payment type"
+ return { 'error' => "Illegal payment type" }
unless grep { $_ eq $packet->{'payby'} }
$conf->config('signup_server-payby');
$packet->{'pkgpart'} =~ /^(\d+)$/ or '' =~ /^()$/;
my $pkgpart = $1;
- $error ||= 'Please select a package' unless $pkgpart; #msgcat
+ return { 'error' => 'Please select a package' } unless $pkgpart; #msgcat
my $part_pkg =
qsearchs( 'part_pkg', { 'pkgpart' => $pkgpart } )
- or $error ||= "WARNING: unknown pkgpart: $pkgpart";
- my $svcpart = $part_pkg->svcpart('svc_acct') unless $error;
+ or return { 'error' => "WARNING: unknown pkgpart: $pkgpart" };
+ my $svcpart = $part_pkg->svcpart('svc_acct');
my $cust_pkg = new FS::cust_pkg ( {
#later#'custnum' => $custnum,
'pkgpart' => $packet->{'pkgpart'},
} );
- $error ||= $cust_pkg->check;
+ my $error = $cust_pkg->check;
+ return { 'error' => $error } if $error;
my $svc_acct = new FS::svc_acct ( {
'svcpart' => $svcpart,
qw( username _password sec_phrase popnum ),
} );
+ my @acct_snarf;
+ my $snarfnum = 1;
+ while ( exists($packet->{"snarf_machine$snarfnum"})
+ && length($packet->{"snarf_machine$snarfnum"}) ) {
+ my $acct_snarf = new FS::acct_snarf ( {
+ 'machine' => $packet->{"snarf_machine$snarfnum"},
+ 'protocol' => $packet->{"snarf_protocol$snarfnum"},
+ 'username' => $packet->{"snarf_username$snarfnum"},
+ '_password' => $packet->{"snarf_password$snarfnum"},
+ } );
+ $snarfnum++;
+ push @acct_snarf, $acct_snarf;
+ }
+ $svc_acct->child_objects( \@acct_snarf );
+
my $y = $svc_acct->setdefault; # arguably should be in new method
- $error ||= $y unless ref($y);
+ return { 'error' => $y } if $y && !ref($y);
+
+ $error = $svc_acct->check;
+ return { 'error' => $error } if $error;
- $error ||= $svc_acct->check;
+ #setup a job dependancy to delay provisioning
+ my $placeholder = new FS::queue ( {
+ 'job' => 'FS::ClientAPI::Signup::__placeholder',
+ 'status' => 'locked',
+ } );
+ $error = $placeholder->insert;
+ return { 'error' => $error } if $error;
use Tie::RefHash;
tie my %hash, 'Tie::RefHash';
%hash = ( $cust_pkg => [ $svc_acct ] );
#msgcat
- $error ||= $cust_main->insert( \%hash, \@invoicing_list, 'noexport' => 1 );
+ $error = $cust_main->insert(
+ \%hash,
+ \@invoicing_list,
+ 'depend_jobnum' => $placeholder->jobnum,
+ );
+ if ( $error ) {
+ my $perror = $placeholder->delete;
+ $error .= " (Additionally, error removing placeholder: $perror)" if $perror;
+ return { 'error' => $error };
+ }
- if ( ! $error && $conf->exists('signup_server-realtime') ) {
+ if ( $conf->exists('signup_server-realtime') ) {
#warn "[fs_signup_server] Billing customer...\n" if $Debug;
local $FS::svc_Common::noexport_hack = 1;
$cust_main->cancel('quiet'=>1);
- $error = '_decline';
+ my $perror = $placeholder->depended_delete;
+ warn "error removing provisioning jobs after decline: $perror" if $perror;
+ unless ( $perror ) {
+ $perror = $placeholder->delete;
+ warn "error removing placeholder after decline: $perror" if $perror;
+ }
+
+ return { 'error' => '_decline' };
}
}
- $cust_main->reexport unless $error;
- return { error => $error };
+ $error = $placeholder->delete;
+ return { 'error' => $error } if $error;
+
+ return { error => '' };
}