summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--FS/FS/ClientAPI/MyAccount.pm11
-rw-r--r--FS/FS/ClientAPI/Signup.pm26
-rw-r--r--FS/FS/Setup.pm4
-rw-r--r--FS/FS/svc_acct.pm56
-rw-r--r--fs_selfservice/FS-SelfService/SelfService.pm63
-rw-r--r--fs_selfservice/FS-SelfService/cgi/selfservice.cgi6
-rw-r--r--fs_selfservice/FS-SelfService/cgi/svc_acct.html3
-rwxr-xr-xhttemplate/edit/svc_acct.cgi41
8 files changed, 170 insertions, 40 deletions
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<pkgnum> I<svcpart>
+
+=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 '<INPUT TYPE="hidden" NAME="domsvc" VALUE="">'
+ unless scalar(keys %$domains);
+
+ if (scalar(keys %$domains) == 1) {
+ my $key;
+ foreach(keys %$domains) {
+ $key = $_;
+ }
+ return '<TR><TD ALIGN="right">Domain</TD><TD>'. $domains->{$key}.
+ '<INPUT TYPE="hidden" NAME="domsvc" VALUE="'. $key. '"></TD></TR>'
+ }
+
+ my $text .= qq!<TR><TD ALIGN="right">Domain</TD><TD><SELECT NAME="domsvc" SIZE=1 STYLE="width: 20em"><OPTION>(Choose Domain)!;
+
+
+ foreach my $domain ( sort { $domains->{$a} cmp $domains->{$b} } keys %$domains ) {
+ $text .= qq!<OPTION VALUE="!. $domain. '"'.
+ ( ( $domsvc && $domain == $domsvc ) ? ' SELECTED' : '' ). ">".
+ $domains->{$domain};
+ }
+
+ $text .= qq!</SELECT></TD></TR>!;
+
+ $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 @@
<TD ALIGN="right">Username</TD>
<TD><INPUT TYPE="text" NAME="username" VALUE="<%= $username %>"></TD>
</TR>
+<%=
+ $OUT .= domainselector(pkgnum=>$pkgnum, svcpart=>$svcpart);
+%>
<TR>
<TD ALIGN="right">Password</TD>
<TD><INPUT TYPE="password" NAME="_password" VALUE="<%= $_password %>"></TD>
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 ? "<B>$svcnum</B>" : " (NEW)" %><BR>
% }
% }
%
-% 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 ? "<B>$svcnum</B>" : " (NEW)" %><BR>
<TD>
<SELECT NAME="domsvc" SIZE=1>
% foreach my $svcnum (
-% sort { $svc_domain{$a}->domain cmp $svc_domain{$b}->domain }
+% sort { $svc_domain{$a} cmp $svc_domain{$b} }
% keys %svc_domain
% ) {
% my $svc_domain = $svc_domain{$svcnum};
%
- <OPTION VALUE="<% $svc_domain->svcnum %>" <% $svc_domain->svcnum == $domsvc ? ' SELECTED' : '' %>><% $svc_domain->domain %>
+ <OPTION VALUE="<% $svcnum %>" <% $svcnum == $domsvc ? ' SELECTED' : '' %>><% $svc_domain{$svcnum} %>
% }
</SELECT>