X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2FClientAPI%2FSignup.pm;h=65bb4e3d5d7ce4a4d07cc86416a736d89806b9ec;hb=d7eafc9c9aae2bf47ea19a56cc5bb1380c5874e4;hp=d0ac419ec6c7ae6e821e86cdf0128e4eac628267;hpb=e4a707839edd433eac3f766c6106e06842d7428e;p=freeside.git diff --git a/FS/FS/ClientAPI/Signup.pm b/FS/FS/ClientAPI/Signup.pm index d0ac419ec..65bb4e3d5 100644 --- a/FS/FS/ClientAPI/Signup.pm +++ b/FS/FS/ClientAPI/Signup.pm @@ -1,7 +1,7 @@ package FS::ClientAPI::Signup; use strict; -use vars qw($DEBUG $me); +use vars qw( $DEBUG $me ); use Data::Dumper; use Tie::RefHash; use FS::Conf; @@ -26,6 +26,15 @@ use FS::payby; $DEBUG = 0; $me = '[FS::ClientAPI::Signup]'; +sub clear_cache { + warn "$me clear_cache called\n" if $DEBUG; + my $cache = new FS::ClientAPI_SessionCache( { + 'namespace' => 'FS::ClientAPI::Signup', + } ); + $cache->clear(); + return {}; +} + sub signup_info { my $packet = shift; @@ -61,7 +70,9 @@ sub signup_info { } } grep { $_->svcpart($svc_x) && ( $href->{ $_->pkgpart } - || $_->agentnum == $agent->agentnum + || ( $_->agentnum + && $_->agentnum == $agent->agentnum + ) ) } qsearch( 'part_pkg', { 'disabled' => '' } ) @@ -82,13 +93,37 @@ sub signup_info { my @agent_fields = qw( agentnum agent ); + my @bools = qw( emailinvoiceonly security_phrase ); + + my @signup_bools = qw( no_company recommend_daytime recommend_email ); + + my @signup_server_scalars = qw( default_pkgpart default_svcpart ); + + my @selfservice_textareas = qw( head body_header body_footer ); + + my @selfservice_scalars = qw( + body_bgcolor box_bgcolor + text_color link_color vlink_color hlink_color alink_color + font title_color title_align title_size menu_bgcolor menu_fontsize + ); + + #XXX my @selfservice_bools = qw( + # menu_skipblanks menu_skipheadings menu_nounderline + #); + + #my $selfservice_binaries = qw( + # title_left_image title_right_image + # menu_top_image menu_body_image menu_bottom_image + #); + $signup_info_cache = { + 'cust_main_county' => [ map $_->hashref, qsearch('cust_main_county', {} ) ], 'agent' => [ map { my $agent = $_; - map { $_ => $agent->get($_) } @agent_fields; + +{ map { $_ => $agent->get($_) } @agent_fields } } qsearch('agent', { 'disabled' => '' } ) ], @@ -105,50 +140,53 @@ sub signup_info { 'security_phrase' => $conf->exists('security_phrase'), - 'payby' => [ $conf->config('signup_server-payby') ], - - 'card_types' => card_types(), - - 'paytypes' => [ @FS::cust_main::paytypes ], - - 'cvv_enabled' => 1, - - 'stateid_enabled' => $conf->exists('show_stateid'), - - 'paystate_enabled' => $conf->exists('show_bankstate'), + 'nomadix' => $conf->exists('signup_server-nomadix'), - 'ship_enabled' => 1, - - 'msgcat' => $msgcat, - - 'label' => $label, - - 'statedefault' => scalar($conf->config('statedefault')) || 'CA', - - 'countrydefault' => scalar($conf->config('countrydefault')) || 'US', - - 'refnum' => scalar($conf->config('signup_server-default_refnum')), - - 'default_pkgpart' => scalar($conf->config('signup_server-default_pkgpart')), - - 'signup_service' => $svc_x, - 'default_svcpart' => scalar($conf->config('signup_server-default_svcpart')), + 'payby' => [ $conf->config('signup_server-payby') ], - 'head' => join("\n", $conf->config('selfservice-head') ), - 'body_header' => join("\n", $conf->config('selfservice-body_header') ), - 'body_footer' => join("\n", $conf->config('selfservice-body_footer') ), - 'body_bgcolor' => scalar( $conf->config('selfservice-body_bgcolor') ), - 'box_bgcolor' => scalar( $conf->config('selfservice-box_bgcolor') ), + 'payby_longname' => [ map { FS::payby->longname($_) } + $conf->config('signup_server-payby') ], - 'company_name' => scalar($conf->config('company_name')), + 'card_types' => card_types(), + ( map { $_ => $conf->exists("signup-$_") } @signup_bools ), + + ( map { $_ => scalar($conf->config("signup_server-$_")) } + @signup_server_scalars + ), + + ( map { $_ => join("\n", $conf->config("selfservice-$_")) } + @selfservice_textareas + ), + ( map { $_ => scalar($conf->config("selfservice-$_")) } + @selfservice_scalars + ), + + #( map { $_ => scalar($conf->config_binary("selfservice-$_")) } + # @selfservice_binaries + #), + + 'agentnum2part_pkg' => $agentnum2part_pkg, + 'svc_acct_pop' => [ map $_->hashref, qsearch('svc_acct_pop',{} ) ], + 'nomadix' => $conf->exists('signup_server-nomadix'), + 'payby' => [ $conf->config('signup_server-payby') ], + 'card_types' => card_types(), + 'paytypes' => [ @FS::cust_main::paytypes ], + 'cvv_enabled' => 1, + 'stateid_enabled' => $conf->exists('show_stateid'), + 'paystate_enabled' => $conf->exists('show_bankstate'), + 'ship_enabled' => 1, + 'msgcat' => $msgcat, + 'label' => $label, + 'statedefault' => scalar($conf->config('statedefault')) || 'CA', + 'countrydefault' => scalar($conf->config('countrydefault')) || 'US', + 'refnum' => scalar($conf->config('signup_server-default_refnum')), + 'signup_service' => $svc_x, + 'company_name' => scalar($conf->config('company_name')), #per-agent? 'agent_ship_address' => scalar($conf->exists('agent-ship_address')), - - 'no_company' => scalar($conf->exists('signup-no_company')), - 'require_phone' => scalar($conf->exists('cust_main-require_phone')), - 'recommend_daytime' => scalar($conf->exists('signup-recommend_daytime')), - 'recommend_email' => scalar($conf->exists('signup-recommend_email')), + 'require_phone' => scalar($conf->exists('cust_main-require_phone')), + 'logo' => scalar($conf->config_binary('logo.png')), }; @@ -288,7 +326,9 @@ sub signup_info { my $hide = 0; if ( FS::payby->realtime($payby) ) { my $payment_gateway = - $agent->payment_gateway( 'method' => FS::payby->payby2bop($payby) ); + $agent->payment_gateway( 'method' => FS::payby->payby2bop($payby), + 'nofatal' => 1, + ); if ( $payment_gateway && $payment_gateway->gateway_namespace eq 'Business::OnlineThirdPartyPayment' @@ -332,6 +372,36 @@ sub signup_info { foreach qw( address1 city county state zip country ); } + #some of the above could probably be cached, too + + my $signup_info_cache_agent = $cache->get("signup_info_cache_agent$agentnum"); + + if ( $signup_info_cache_agent ) { + + warn "$me loading cached signup info for agentnum $agentnum\n" + if $DEBUG > 1; + + } else { + + warn "$me populating signup info cache for agentnum $agentnum\n" + if $DEBUG > 1; + + $signup_info_cache_agent = { + #( map { $_ => scalar( $conf->config($_, $agentnum) ) } + # qw( company_name ) ), + ( map { $_ => scalar( $conf->config("selfservice-$_", $agentnum ) ) } + qw( body_bgcolor box_bgcolor menu_bgcolor ) ), + ( map { $_ => join("\n", $conf->config("selfservice-$_", $agentnum ) ) } + qw( head body_header body_footer ) ), + }; + + $cache->set("signup_info_cache_agent$agentnum", $signup_info_cache_agent); + + } + + $signup_info->{$_} = $signup_info_cache_agent->{$_} + foreach keys %$signup_info_cache_agent; + } # else { # delete $signup_info->{'part_pkg'}; @@ -347,9 +417,14 @@ sub signup_info { my $agent_signup_info = { %$signup_info }; delete $agent_signup_info->{agentnum2part_pkg}; $agent_signup_info->{'agent'} = $session->{'agent'}; - $agent_signup_info; - } else { - $signup_info; + return $agent_signup_info; + } + elsif ( exists $packet->{'keys'} ) { + my @keys = @{ $packet->{'keys'} }; + return { map { $_ => $signup_info->{$_} } @keys }; + } + else { + return $signup_info; } } @@ -398,6 +473,9 @@ sub new_customer { unless $packet->{'popnum'} || !scalar(qsearch('svc_acct_pop',{} )); } + elsif ( $svc_x eq 'svc_pbx' ) { + #possibly some validation will be needed + } my $agentnum; if ( exists $packet->{'session_id'} ) { @@ -467,14 +545,12 @@ sub new_customer { return { 'error' => "Unknown reseller" } unless $agent; - my $payment_gateway = - $agent->payment_gateway( 'method' => FS::payby->payby2bop($payby) ); + my $gw = $agent->payment_gateway( 'method' => FS::payby->payby2bop($payby), + 'nofatal' => 1, + ); - if ($payment_gateway->gateway_namespace eq - 'Business::OnlineThirdPartyPayment' - ) { - $cust_main->payby('BILL'); # MCRD better? - } + $cust_main->payby('BILL') # MCRD better? + if $gw && $gw->gateway_namespace eq 'Business::OnlineThirdPartyPayment'; } $cust_main->payinfo($cust_main->daytime) @@ -510,14 +586,14 @@ sub new_customer { #return { 'error' => $error } if $error; #should be all auto-magic and shit - my $svc; + my @svc = (); if ( $svc_x eq 'svc_acct' ) { - $svc = new FS::svc_acct ( { + my $svc = new FS::svc_acct { 'svcpart' => $svcpart, map { $_ => $packet->{$_} } qw( username _password sec_phrase popnum ), - } ); + }; my @acct_snarf; my $snarfnum = 1; @@ -533,24 +609,55 @@ sub new_customer { push @acct_snarf, $acct_snarf; } $svc->child_objects( \@acct_snarf ); + push @svc, $svc; } elsif ( $svc_x eq 'svc_phone' ) { - $svc = new FS::svc_phone ( { + push @svc, new FS::svc_phone ( { 'svcpart' => $svcpart, map { $_ => $packet->{$_} } qw( countrycode phonenum sip_password pin ), } ); + } elsif ( $svc_x eq 'svc_pbx' ) { + + push @svc, new FS::svc_pbx ( { + 'svcpart' => $svcpart, + map { $_ => $packet->{$_} } + qw( id title ), + } ); + } else { die "unknown signup service $svc_x"; } - my $y = $svc->setdefault; # arguably should be in new method - return { 'error' => $y } if $y && !ref($y); + if ($packet->{'mac_addr'} && $conf->exists('signup_server-mac_addr_svcparts')) + { - #$error = $svc->check; - #return { 'error' => $error } if $error; + my %mac_addr_svcparts = map { $_ => 1 } + $conf->config('signup_server-mac_addr_svcparts'); + my @pkg_svc = grep { $_->quantity && $mac_addr_svcparts{$_->svcpart} } + $cust_pkg->part_pkg->pkg_svc; + + return { 'error' => 'No service defined to assign mac address' } + unless @pkg_svc; + + my $svc = new FS::svc_acct { + 'svcpart' => $pkg_svc[0]->svcpart, #multiple matches? alas.. + 'username' => $packet->{'mac_addr'}, + '_password' => '', #blank as requested (set passwordmin to 0) + }; + + push @svc, $svc; + + } + + foreach my $svc ( @svc ) { + my $y = $svc->setdefault; # arguably should be in new method + return { 'error' => $y } if $y && !ref($y); + #$error = $svc->check; + #return { 'error' => $error } if $error; + } #setup a job dependancy to delay provisioning my $placeholder = new FS::queue ( { @@ -562,7 +669,7 @@ sub new_customer { use Tie::RefHash; tie my %hash, 'Tie::RefHash'; - %hash = ( $cust_pkg => [ $svc ] ); + %hash = ( $cust_pkg => \@svc ); #msgcat $error = $cust_main->insert( \%hash, @@ -577,26 +684,22 @@ sub new_customer { if ( $conf->exists('signup_server-realtime') ) { - #warn "[fs_signup_server] Billing customer...\n" if $Debug; + #warn "$me Billing customer...\n" if $Debug; my $bill_error = $cust_main->bill; - #warn "[fs_signup_server] error billing new customer: $bill_error" + #warn "$me error billing new customer: $bill_error" # if $bill_error; $bill_error = $cust_main->apply_payments_and_credits; - #warn "[fs_signup_server] error applying payments and credits for". + #warn "$me error applying payments and credits for". # " new customer: $bill_error" # if $bill_error; - if ($cust_main->_new_bop_required()) { - $bill_error = $cust_main->realtime_collect( - method => FS::payby->payby2bop( $packet->{payby} ), - depend_jobnum => $placeholder->jobnum, - ); - } else { - $bill_error = $cust_main->collect('realtime' => 1); - } - #warn "[fs_signup_server] error collecting from new customer: $bill_error" + $bill_error = $cust_main->realtime_collect( + method => FS::payby->payby2bop( $packet->{payby} ), + depend_jobnum => $placeholder->jobnum, + ); + #warn "$me error collecting from new customer: $bill_error" # if $bill_error; if ($bill_error && ref($bill_error) eq 'HASH') { @@ -608,6 +711,11 @@ sub new_customer { }; } + $bill_error = $cust_main->apply_payments_and_credits; + #warn "$me error applying payments and credits for". + # " new customer: $bill_error" + # if $bill_error; + if ( $cust_main->balance > 0 ) { #this makes sense. credit is "un-doing" the invoice @@ -643,14 +751,25 @@ sub new_customer { my %return = ( 'error' => '', 'signup_service' => $svc_x, + 'custnum' => $cust_main->custnum, ); - if ( $svc_x eq 'svc_acct' ) { - $return{$_} = $svc->$_() for qw( username _password ); - } elsif ( $svc_x eq 'svc_phone' ) { - $return{$_} = $svc->$_() for qw( countrycode phonenum sip_password pin ); - } else { - die "unknown signup service $svc_x"; + if ( $svc[0] ) { + + $return{'svcnum'} = $svc[0]->svcnum; + + if ( $svc_x eq 'svc_acct' ) { + $return{$_} = $svc[0]->$_() for qw( username _password ); + } elsif ( $svc_x eq 'svc_phone' ) { + $return{$_} = $svc[0]->$_() for qw(countrycode phonenum sip_password pin); + } elsif ( $svc_x eq 'svc_pbx' ) { + #$return{$_} = $svc[0]->$_() for qw( ) #nothing yet + } else { + return {'error' => "configuration error: unknown signup service $svc_x"}; + #die "unknown signup service $svc_x"; + # return an error that's visible to someone somewhere + } + } return \%return;