use FS::cust_main;
use FS::cust_pkg;
use FS::svc_acct;
+use FS::svc_phone;
use FS::acct_snarf;
use FS::queue;
use FS::reg_code;
-$DEBUG = 2;
+$DEBUG = 0;
$me = '[FS::ClientAPI::Signup]';
sub signup_info {
warn "$me signup_info called on $packet\n" if $DEBUG;
my $conf = new FS::Conf;
+ my $svc_x = $conf->config('signup_server-service') || 'svc_acct';
my $cache = new FS::ClientAPI_SessionCache( {
'namespace' => 'FS::ClientAPI::Signup',
my $agentnum2part_pkg =
{
map {
- my $href = $_->pkgpart_hashref;
- $_->agentnum =>
+ my $agent = $_;
+ my $href = $agent->pkgpart_hashref;
+ $agent->agentnum =>
[
map { { 'payby' => [ $_->payby ],
'freq_pretty' => $_->freq_pretty,
'options' => { $_->options },
%{$_->hashref}
} }
- grep { $_->svcpart('svc_acct') && $href->{ $_->pkgpart } }
+ grep { $_->svcpart($svc_x)
+ && ( $href->{ $_->pkgpart }
+ || $_->agentnum == $agent->agentnum
+ )
+ }
qsearch( 'part_pkg', { 'disabled' => '' } )
];
} qsearch('agent', { 'disabled' => '' })
};
warn "label: ". Dumper($label). "\n" if $DEBUG > 2;
+ my @agent_fields = qw( agentnum agent );
+
$signup_info_cache = {
'cust_main_county' => [ map $_->hashref,
qsearch('cust_main_county', {} )
],
- 'agent' => [ map $_->hashref,
+ 'agent' => [ map { my $agent = $_;
+ map { $_ => $agent->get($_) } @agent_fields;
+ }
qsearch('agent', { 'disabled' => '' } )
],
'default_pkgpart' => scalar($conf->config('signup_server-default_pkgpart')),
+ 'signup_service' => $svc_x,
+ 'default_svcpart' => scalar($conf->config('signup_server-default_svcpart')),
+
+ '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') ),
+
+ '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')),
+
};
$cache->set('signup_info_cache', $signup_info_cache);
%{$_->hashref}
};
}
- grep { $_->svcpart('svc_acct') }
+ grep { $_->svcpart($svc_x) }
map { $_->part_pkg }
qsearchs( 'reg_code', { 'code' => $packet->{'reg_code'},
'agentnum' => $agentnum, } )
'options' => { $_->options },
%{$_->hashref}
} }
- grep { $_->svcpart('svc_acct') }
+ grep { $_->svcpart($svc_x) }
qsearch( 'part_pkg', { 'promo_code' => {
op=>'ILIKE',
value=>$packet->{'promo_code'}
];
warn "$me done setting agent-specific adv. source list\n" if $DEBUG > 1;
+ my $agent = qsearchs('agent', { 'agentnum' => $agentnum } );
+
+ $signup_info->{'agent_name'} = $agent->agent;
+
+ $signup_info->{'company_name'} = $conf->config('company_name', $agentnum);
+
+ if ( $signup_info->{'agent_ship_address'} && $agent->agent_custnum ) {
+ my $cust_main = $agent->agent_cust_main;
+ my $prefix = length($cust_main->ship_last) ? 'ship_' : '';
+ $signup_info->{"ship_$_"} = $cust_main->get("$prefix$_")
+ foreach qw( address1 city county state zip country );
+ }
+
}
# else {
# delete $signup_info->{'part_pkg'};
}
+sub domain_select_hash {
+ my $packet = shift;
+
+ my $response = {};
+
+ if ($packet->{pkgpart}) {
+ my $part_pkg = qsearchs('part_pkg' => { 'pkgpart' => $packet->{pkgpart} } );
+ #$packet->{svcpart} = $part_pkg->svcpart('svc_acct')
+ $packet->{svcpart} = $part_pkg->svcpart
+ if $part_pkg;
+ }
+
+ if ($packet->{svcpart}) {
+ my $part_svc = qsearchs('part_svc' => { 'svcpart' => $packet->{svcpart} } );
+ $response->{'domsvc'} = $part_svc->part_svc_column('domsvc')->columnvalue
+ if ($part_svc && $part_svc->part_svc_column('domsvc')->columnflag eq 'D');
+ }
+
+ $response->{'domains'}
+ = { domain_select_hash FS::svc_acct( map { $_ => $packet->{$_} }
+ qw(svcpart pkgnum)
+ ) };
+
+ $response;
+}
+
sub new_customer {
my $packet = shift;
my $conf = new FS::Conf;
+ my $svc_x = $conf->config('signup_server-service') || 'svc_acct';
+
+ if ( $svc_x eq 'svc_acct' ) {
- #things that aren't necessary in base class, but are for signup server
- #return "Passwords don't match"
- # if $hashref->{'_password'} ne $hashref->{'_password2'}
- return { 'error' => gettext('empty_password') }
- unless length($packet->{'_password'});
- # a bit inefficient for large numbers of pops
- return { 'error' => gettext('no_access_number_selected') }
- unless $packet->{'popnum'} || !scalar(qsearch('svc_acct_pop',{} ));
+ #things that aren't necessary in base class, but are for signup server
+ #return "Passwords don't match"
+ # if $hashref->{'_password'} ne $hashref->{'_password2'}
+ return { 'error' => gettext('empty_password') }
+ unless length($packet->{'_password'});
+ # a bit inefficient for large numbers of pops
+ return { 'error' => gettext('no_access_number_selected') }
+ unless $packet->{'popnum'} || !scalar(qsearch('svc_acct_pop',{} ));
+
+ }
my $agentnum;
if ( exists $packet->{'session_id'} ) {
} );
+ my $agent = qsearchs('agent', { 'agentnum' => $agentnum } );
+ if ( $conf->exists('agent_ship_address') && $agent->agent_custnum ) {
+ my $agent_cust_main = $agent->agent_cust_main;
+ my $prefix = length($agent_cust_main->ship_last) ? 'ship_' : '';
+ $cust_main->set("ship_$_", $agent_cust_main->get("$prefix$_") )
+ foreach qw( address1 city county state zip country );
+
+ $cust_main->set("ship_$_", $cust_main->get($_))
+ foreach qw( last first );
+
+ }
+
+
return { 'error' => "Illegal payment type" }
unless grep { $_ eq $packet->{'payby'} }
$conf->config('signup_server-payby');
my $part_pkg =
qsearchs( 'part_pkg', { 'pkgpart' => $pkgpart } )
or return { 'error' => "WARNING: unknown pkgpart: $pkgpart" };
- my $svcpart = $part_pkg->svcpart('svc_acct');
+ my $svcpart = $part_pkg->svcpart($svc_x);
my $reg_code = '';
if ( $packet->{'reg_code'} ) {
#my $error = $cust_pkg->check;
#return { 'error' => $error } if $error;
- my $svc_acct = new FS::svc_acct ( {
- 'svcpart' => $svcpart,
- map { $_ => $packet->{$_} }
- qw( username _password sec_phrase popnum ),
- } );
+ #should be all auto-magic and shit
+ my $svc;
+ if ( $svc_x eq 'svc_acct' ) {
- 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"},
+ $svc = new FS::svc_acct ( {
+ 'svcpart' => $svcpart,
+ map { $_ => $packet->{$_} }
+ qw( username _password sec_phrase popnum ),
} );
- $snarfnum++;
- push @acct_snarf, $acct_snarf;
+
+ 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->child_objects( \@acct_snarf );
+
+ } elsif ( $svc_x eq 'svc_phone' ) {
+
+ $svc = new FS::svc_phone ( {
+ 'svcpart' => $svcpart,
+ map { $_ => $packet->{$_} }
+ qw( countrycode phonenum sip_password pin ),
+ } );
+
+ } else {
+ die "unknown signup service $svc_x";
}
- $svc_acct->child_objects( \@acct_snarf );
- my $y = $svc_acct->setdefault; # arguably should be in new method
+ my $y = $svc->setdefault; # arguably should be in new method
return { 'error' => $y } if $y && !ref($y);
- #$error = $svc_acct->check;
+ #$error = $svc->check;
#return { 'error' => $error } if $error;
#setup a job dependancy to delay provisioning
use Tie::RefHash;
tie my %hash, 'Tie::RefHash';
- %hash = ( $cust_pkg => [ $svc_acct ] );
+ %hash = ( $cust_pkg => [ $svc ] );
#msgcat
$error = $cust_main->insert(
\%hash,
#warn "[fs_signup_server] error billing new customer: $bill_error"
# if $bill_error;
- $cust_main->apply_payments_and_credits;
+ $bill_error = $cust_main->apply_payments_and_credits;
+ #warn "[fs_signup_server] error applying payments and credits for".
+ # " new customer: $bill_error"
+ # if $bill_error;
$bill_error = $cust_main->collect('realtime' => 1);
#warn "[fs_signup_server] error collecting from new customer: $bill_error"
if ( $cust_main->balance > 0 ) {
#this makes sense. credit is "un-doing" the invoice
- $cust_main->credit( $cust_main->balance, 'signup server decline' );
+ $cust_main->credit( $cust_main->balance, 'signup server decline',
+ 'reason_type' => $conf->config('signup_credit_type'),
+ );
$cust_main->apply_credits;
#should check list for errors...
$error = $placeholder->delete;
return { 'error' => $error } if $error;
- return { error => '' };
+ my %return = ( 'error' => '',
+ 'signup_service' => $svc_x,
+ );
+
+ 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";
+ }
+
+ return \%return;
}