diff options
| -rw-r--r-- | FS/FS/ClientAPI/MyAccount.pm | 11 | ||||
| -rw-r--r-- | FS/FS/ClientAPI/Signup.pm | 26 | ||||
| -rw-r--r-- | FS/FS/Setup.pm | 4 | ||||
| -rw-r--r-- | FS/FS/svc_acct.pm | 56 | ||||
| -rw-r--r-- | fs_selfservice/FS-SelfService/SelfService.pm | 63 | ||||
| -rw-r--r-- | fs_selfservice/FS-SelfService/cgi/selfservice.cgi | 6 | ||||
| -rw-r--r-- | fs_selfservice/FS-SelfService/cgi/svc_acct.html | 3 | ||||
| -rwxr-xr-x | httemplate/edit/svc_acct.cgi | 41 | 
8 files changed, 170 insertions, 40 deletions
diff --git a/FS/FS/ClientAPI/MyAccount.pm b/FS/FS/ClientAPI/MyAccount.pm index 5a20dc54f..b22e3f5a3 100644 --- a/FS/FS/ClientAPI/MyAccount.pm +++ b/FS/FS/ClientAPI/MyAccount.pm @@ -982,10 +982,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 e38294276..e6344e4aa 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 322fea902..d35e93e83 100644 --- a/FS/FS/svc_acct.pm +++ b/FS/FS/svc_acct.pm @@ -2380,5 +2380,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 c936353db..bbbfdc50d 100644 --- a/fs_selfservice/FS-SelfService/SelfService.pm +++ b/fs_selfservice/FS-SelfService/SelfService.pm @@ -50,13 +50,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'; @@ -1242,6 +1243,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 591112447..727730b9b 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 myaccount_passwd                        ); @@ -438,7 +438,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'} ) {  @@ -553,7 +553,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>  | 
