X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2FClientAPI%2FSignup.pm;h=4655b0984d79722d86b7570ff84265428bf8fff3;hb=73f34cbe08a9be968a2557cd6906dde5bb9a97a3;hp=710c16c7ab1c80b623cd324bbaef8c9e9bdb750b;hpb=8141f1dde4994789cbc6298e6cfdf3050d2fbfdc;p=freeside.git diff --git a/FS/FS/ClientAPI/Signup.pm b/FS/FS/ClientAPI/Signup.pm index 710c16c7a..4655b0984 100644 --- a/FS/FS/ClientAPI/Signup.pm +++ b/FS/FS/ClientAPI/Signup.pm @@ -3,14 +3,17 @@ package FS::ClientAPI::Signup; 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( @@ -23,11 +26,31 @@ sub signup_info { 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 { @@ -38,7 +61,10 @@ sub signup_info { 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',{} ) ], @@ -47,6 +73,8 @@ sub signup_info { '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 ) }, @@ -55,9 +83,14 @@ sub signup_info { '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"; @@ -79,14 +112,14 @@ sub new_customer { 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 @@ -100,12 +133,13 @@ sub new_customer { 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'); @@ -116,18 +150,19 @@ sub new_customer { $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, @@ -135,18 +170,51 @@ sub new_customer { 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; @@ -172,13 +240,22 @@ sub new_customer { 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 => '' }; }