From: jeff Date: Wed, 12 Dec 2007 05:58:43 +0000 (+0000) Subject: self-service can select domain on provision (#2801) X-Git-Tag: TRIXBOX_2_6~185 X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=ffa1f64207647ee1c5126bfad6a246526f4c677c self-service can select domain on provision (#2801) --- diff --git a/FS/FS/ClientAPI/MyAccount.pm b/FS/FS/ClientAPI/MyAccount.pm index 6e4545aee..61078a94e 100644 --- a/FS/FS/ClientAPI/MyAccount.pm +++ b/FS/FS/ClientAPI/MyAccount.pm @@ -1033,10 +1033,17 @@ sub provision_acct { if $p->{'_password'} ne $p->{'_password2'}; return { 'error' => gettext('empty_password') } unless length($p->{'_password'}); + + if ($p->{'domsvc'}) { + my %domains = domain_select_hash FS::svc_acct(map { $_ => $p->{$_} } + qw ( svcpart pkgnum ) ); + return { 'error' => gettext('invalid_domain') } + unless ($domains{$p->{'domsvc'}}); + } _provision( 'FS::svc_acct', - [qw(username _password)], - [qw(username _password)], + [qw(username _password domsvc)], + [qw(username _password domsvc)], $p, @_ ); diff --git a/FS/FS/ClientAPI/Signup.pm b/FS/FS/ClientAPI/Signup.pm index d33dd799c..61325b9e1 100644 --- a/FS/FS/ClientAPI/Signup.pm +++ b/FS/FS/ClientAPI/Signup.pm @@ -287,6 +287,32 @@ sub signup_info { } +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; diff --git a/FS/FS/Setup.pm b/FS/FS/Setup.pm index d8099c6a9..d265d937f 100644 --- a/FS/FS/Setup.pm +++ b/FS/FS/Setup.pm @@ -504,6 +504,10 @@ sub msgcat_messages { 'en_US' => 'Driver\'s License State', }, + 'invalid_domain' => { + 'en_US' => 'Invalid domain', + }, + ); } diff --git a/FS/FS/svc_acct.pm b/FS/FS/svc_acct.pm index 1cddbeeec..259d093c6 100644 --- a/FS/FS/svc_acct.pm +++ b/FS/FS/svc_acct.pm @@ -2549,5 +2549,61 @@ schema.html from the base documentation. =cut +=item domain_select_hash %OPTIONS + +Returns a hash SVCNUM => DOMAIN ... representing the domains this customer +may at present purchase. + +Currently available options are: I I + +=cut + +sub domain_select_hash { + my ($self, %options) = @_; + my %domains = (); + my $part_svc; + my $cust_pkg; + + if (ref($self)) { + $part_svc = $self->part_svc; + $cust_pkg = $self->cust_svc->cust_pkg + if $self->cust_svc; + } + + $part_svc = qsearchs('part_svc', { 'svcpart' => $options{svcpart} }) + if $options{'svcpart'}; + + $cust_pkg = qsearchs('cust_pkg', { 'pkgnum' => $options{pkgnum} }) + if $options{'pkgnum'}; + + if ($part_svc && ( $part_svc->part_svc_column('domsvc')->columnflag eq 'S' + || $part_svc->part_svc_column('domsvc')->columnflag eq 'F')) { + %domains = map { $_->svcnum => $_->domain } + map { qsearchs('svc_domain', { 'svcnum' => $_ }) } + split(',', $part_svc->part_svc_column('domsvc')->columnvalue); + }elsif ($cust_pkg && !$conf->exists('svc_acct-alldomains') ) { + %domains = map { $_->svcnum => $_->domain } + map { qsearchs('svc_domain', { 'svcnum' => $_->svcnum }) } + map { qsearch('cust_svc', { 'pkgnum' => $_->pkgnum } ) } + qsearch('cust_pkg', { 'custnum' => $cust_pkg->custnum }); + }else{ + %domains = map { $_->svcnum => $_->domain } qsearch('svc_domain', {} ); + } + + if ($part_svc && $part_svc->part_svc_column('domsvc')->columnflag eq 'D') { + my $svc_domain = qsearchs('svc_domain', + { 'svcnum' => $part_svc->part_svc_column('domsvc')->columnvalue } ); + if ( $svc_domain ) { + $domains{$svc_domain->svcnum} = $svc_domain->domain; + }else{ + warn "unknown svc_domain.svcnum for part_svc_column domsvc: ". + $part_svc->part_svc_column('domsvc')->columnvalue; + + } + } + + (%domains); +} + 1; diff --git a/fs_selfservice/FS-SelfService/SelfService.pm b/fs_selfservice/FS-SelfService/SelfService.pm index 9b3b71a8e..2999245f2 100644 --- a/fs_selfservice/FS-SelfService/SelfService.pm +++ b/fs_selfservice/FS-SelfService/SelfService.pm @@ -51,13 +51,14 @@ $socket .= '.'.$tag if defined $tag && length($tag); 'unprovision_svc' => 'MyAccount/unprovision_svc', 'myaccount_passwd' => 'MyAccount/myaccount_passwd', 'signup_info' => 'Signup/signup_info', + 'domain_select_hash' => 'Signup/domain_select_hash', # expose? 'new_customer' => 'Signup/new_customer', 'agent_login' => 'Agent/agent_login', 'agent_logout' => 'Agent/agent_logout', 'agent_info' => 'Agent/agent_info', 'agent_list_customers' => 'Agent/agent_list_customers', ); -@EXPORT_OK = ( keys(%autoload), qw( regionselector expselect popselector ) ); +@EXPORT_OK = ( keys(%autoload), qw( regionselector expselect popselector domainselector) ); $ENV{'PATH'} ='/usr/bin:/usr/ucb:/bin'; $ENV{'SHELL'} = '/bin/sh'; @@ -1243,6 +1244,66 @@ END } +=item domainselector HASHREF | LIST + +Takes as input a hashref or list of key/value pairs with the following keys: + +=over 4 + +=item pkgnum + +Package number + +=item domsvc + +Service number of the selected item. + +=back + +Returns an HTML fragment for domain selection. + +=cut + +sub domainselector { + my $param; + if ( ref($_[0]) ) { + $param = shift; + } else { + $param = { @_ }; + } + my $domsvc= $param->{'domsvc'}; + my $rv = + domain_select_hash(map {$_ => $param->{$_}} qw(pkgnum svcpart pkgpart) ); + my $domains = $rv->{'domains'}; + $domsvc = $rv->{'domsvc'} unless $domsvc; + + return '' + unless scalar(keys %$domains); + + if (scalar(keys %$domains) == 1) { + my $key; + foreach(keys %$domains) { + $key = $_; + } + return 'Domain'. $domains->{$key}. + '' + } + + my $text .= qq!Domain!; + + $text; + +} + =back =head1 RESELLER FUNCTIONS diff --git a/fs_selfservice/FS-SelfService/cgi/selfservice.cgi b/fs_selfservice/FS-SelfService/cgi/selfservice.cgi index 9cf8c4b1e..b5a672059 100644 --- a/fs_selfservice/FS-SelfService/cgi/selfservice.cgi +++ b/fs_selfservice/FS-SelfService/cgi/selfservice.cgi @@ -14,7 +14,7 @@ use FS::SelfService qw( login customer_info invoice process_prepay list_pkgs order_pkg signup_info order_recharge part_svc_info provision_acct provision_external - unprovision_svc change_pkg + unprovision_svc change_pkg domainselector list_svcs list_svc_usage list_support_usage myaccount_passwd ); @@ -439,7 +439,7 @@ sub process_svc_acct { my $result = provision_acct ( 'session_id' => $session_id, map { $_ => $cgi->param($_) } qw( - pkgnum svcpart username _password _password2 sec_phrase popnum ) + pkgnum svcpart username domsvc _password _password2 sec_phrase popnum ) ); if ( exists $result->{'error'} && $result->{'error'} ) { @@ -563,7 +563,7 @@ package FS::SelfService::_selfservicecgi; #use FS::SelfService qw(regionselector expselect popselector); use HTML::Entities; -use FS::SelfService qw(popselector); +use FS::SelfService qw(popselector domainselector); #false laziness w/agent.cgi sub include { diff --git a/fs_selfservice/FS-SelfService/cgi/svc_acct.html b/fs_selfservice/FS-SelfService/cgi/svc_acct.html index abed8786e..00244386b 100644 --- a/fs_selfservice/FS-SelfService/cgi/svc_acct.html +++ b/fs_selfservice/FS-SelfService/cgi/svc_acct.html @@ -15,6 +15,9 @@ Username +<%= + $OUT .= domainselector(pkgnum=>$pkgnum, svcpart=>$svcpart); +%> Password diff --git a/httemplate/edit/svc_acct.cgi b/httemplate/edit/svc_acct.cgi index f9c407472..ed4760970 100755 --- a/httemplate/edit/svc_acct.cgi +++ b/httemplate/edit/svc_acct.cgi @@ -212,38 +212,11 @@ Service # <% $svcnum ? "$svcnum" : " (NEW)" %>
% } % } % -% if ( $part_svc->part_svc_column('domsvc')->columnflag eq 'D' ) { -% my $svc_domain = qsearchs('svc_domain', { -% 'svcnum' => $part_svc->part_svc_column('domsvc')->columnvalue, -% } ); -% if ( $svc_domain ) { -% $svc_domain{$svc_domain->svcnum} = $svc_domain; -% } else { -% warn "unknown svc_domain.svcnum for part_svc_column domsvc: ". -% $part_svc->part_svc_column('domsvc')->columnvalue; -% } -% } -% -% if ( $part_svc->part_svc_column('domsvc')->columnflag eq 'S' ) { -% foreach my $domain -% (split(',',$part_svc->part_svc_column('domsvc')->columnvalue)) { -% my $svc_domain = -% qsearchs('svc_domain', { 'svcnum' => $domain } ); -% $svc_domain{$svc_domain->svcnum} = $svc_domain if $svc_domain; -% } -% }elsif ($cust_pkg && !$conf->exists('svc_acct-alldomains') ) { -% my @cust_svc = -% map { qsearch('cust_svc', { 'pkgnum' => $_->pkgnum } ) } -% qsearch('cust_pkg', { 'custnum' => $cust_pkg->custnum } ); -% foreach my $cust_svc ( @cust_svc ) { -% my $svc_domain = -% qsearchs('svc_domain', { 'svcnum' => $cust_svc->svcnum } ); -% $svc_domain{$svc_domain->svcnum} = $svc_domain if $svc_domain; -% } -% } else { -% %svc_domain = map { $_->svcnum => $_ } qsearch('svc_domain', {} ); -% } -% +% %svc_domain = (%svc_domain, +% domain_select_hash FS::svc_acct('svcpart' => $svcpart, +% 'pkgnum' => $pkgnum, +% ) +% ); % @@ -252,14 +225,14 @@ Service # <% $svcnum ? "$svcnum" : " (NEW)" %>