self-service improvements, RT10883
authorlevinse <levinse>
Wed, 15 Dec 2010 15:09:45 +0000 (15:09 +0000)
committerlevinse <levinse>
Wed, 15 Dec 2010 15:09:45 +0000 (15:09 +0000)
FS/FS/ClientAPI/MyAccount.pm
FS/FS/Conf.pm
fs_selfservice/FS-SelfService/cgi/provision.html
fs_selfservice/FS-SelfService/cgi/selfservice.cgi
fs_selfservice/FS-SelfService/cgi/ws_list.html [new file with mode: 0644]

index 3fc51b3..181c994 100644 (file)
@@ -171,6 +171,13 @@ sub login {
                            );
     return { error => 'User not found.' } unless $svc_acct;
 
+    if($conf->exists('selfservice_server-login_svcpart')) {
+       my @svcpart = $conf->config('selfservice_server-login_svcpart');
+       my $svcpart = $svc_acct->cust_svc->svcpart;
+       return { error => 'Invalid user.' } 
+           unless grep($_ eq $svcpart, @svcpart);
+    }
+
     return { error => 'Incorrect password.' }
       unless $svc_acct->check_password($p->{'password'});
 
@@ -915,9 +922,42 @@ sub list_pkgs {
   my $cust_main = qsearchs('cust_main', $search )
     or return { 'error' => "unknown custnum $custnum" };
 
-  #return { 'cust_pkg' => [ map { $_->hashref } $cust_main->ncancelled_pkgs ] };
-
   my $conf = new FS::Conf;
+  
+# the duplication below is necessary:
+# 1. to maintain the current buggy behaviour wrt the cust_pkg and part_pkg
+# hashes overwriting each other (setup and no_auto fields). Fixing that is a
+# non-backwards-compatible change breaking the software of anyone using the API
+# instead of the stock selfservice
+# 2. to return cancelled packages as well - for wholesale and non-wholesale
+  if( $conf->exists('selfservice_server-view-wholesale') ) {
+    return { 'svcnum'   => $session->{'svcnum'},
+           'custnum'  => $custnum,
+           'cust_pkg' => [ map {
+                          { $_->hash,
+                            part_pkg => [ map $_->hashref, $_->part_pkg ],
+                            part_svc =>
+                              [ map $_->hashref, $_->available_part_svc ],
+                            cust_svc => 
+                              [ map { my $ref = { $_->hash,
+                                                  label => [ $_->label ],
+                                                };
+                                      $ref->{_password} = $_->svc_x->_password
+                                        if $context eq 'agent'
+                                        && $conf->exists('agent-showpasswords')
+                                        && $_->part_svc->svcdb eq 'svc_acct';
+                                      $ref;
+                                    } $_->cust_svc
+                              ],
+                          };
+                        } $cust_main->cust_pkg
+                  ],
+    'small_custview' =>
+      small_custview( $cust_main, $conf->config('countrydefault') ),
+    'wholesale_view' => 1,
+    'date_format' => $conf->config('date_format') || '%m/%d/%Y',
+      };
+  }
 
   { 'svcnum'   => $session->{'svcnum'},
     'custnum'  => $custnum,
index 072982a..ba0bc5b 100644 (file)
@@ -2270,6 +2270,21 @@ and customer address. Include units.',
   },
 
   {
+    'key'         => 'selfservice_server-login_svcpart',
+    'section'     => 'self-service',
+    'description' => 'If specified, only allow the specified svcparts to login to self-service.',
+    'type'        => 'select-part_svc',
+    'multiple'    => 1,
+  },
+  
+  {
+    'key'         => 'selfservice_server-view-wholesale',
+    'section'     => 'self-service',
+    'description' => 'If enabled, use a wholesale package view in the self-service.',
+    'type'        => 'checkbox',
+  },
+  
+  {
     'key'         => 'selfservice-agent_signup',
     'section'     => 'self-service',
     'description' => 'Allow agent signup via self-service.',
index 7c0f861..10d17f5 100644 (file)
@@ -1,6 +1,11 @@
-<%= $url = "$selfurl?session=$session_id;action="; ''; %>
-<%= include('header', 'Setup my services') %>
+<%= $url = "$selfurl?session=$session_id;action="; 
+    $heading1 = "Setup my services";
+    $heading1 = "Package list" if $wholesale_view;
+    $provision_list = "provision_list";
+    $provision_list = "ws_list" if $wholesale_view;
+    ''; %>
+<%= include('header', $heading1) %>
 
-<%= include('provision_list') %>
+<%= include($provision_list) %>
 
 <%= include('footer') %>
index 25d61ac..0ef4e9a 100644 (file)
@@ -615,6 +615,8 @@ sub logout {
 sub provision {
   my $result = list_pkgs( 'session_id' => $session_id );
   die $result->{'error'} if exists $result->{'error'} && $result->{'error'};
+  $result->{'pkgpart'} = $cgi->param('pkgpart') if $cgi->param('pkgpart');
+  $result->{'filter'} = $cgi->param('filter') if $cgi->param('filter');
   $result;
 }
 
diff --git a/fs_selfservice/FS-SelfService/cgi/ws_list.html b/fs_selfservice/FS-SelfService/cgi/ws_list.html
new file mode 100644 (file)
index 0000000..7b62db4
--- /dev/null
@@ -0,0 +1,72 @@
+<%=
+
+sub ws_pkglink {
+    my($cat,$count,$link) = (shift,shift,shift);
+    return "0 $cat <BR>" unless $count->{$cat};
+    return qq! <A HREF="${link};filter=$cat">$count->{$cat}</A> $cat <BR> !;
+}
+
+sub ws_pkgstatus {
+    my $pkg = shift;
+    $status = "unbilled";
+    $status = "active" if ( $pkg->{setup} && !$pkg->{cancel}
+           && !$pkg->{susp} );
+    $status = "suspended" if ( $pkg->{susp} && !$pkg->{cancel} );
+    $status = "cancelled" if $pkg->{cancel};
+    $status;
+}
+
+sub pdate {
+    my($field,$date_format) = (shift,shift);
+    return "<TD>".Date::Format::time2str($date_format,$field)."</TD>" 
+       if $field > 0;
+    '<TD></TD>';
+}
+
+if ( $pkgpart ) {
+    $OUT .= qq! <TABLE BORDER="1"><TR><TH>Package</TH><TH>Status</TH> !;
+    $OUT .= "<TH>Setup</TH><TH>Last Bill</TH><TH>Next Bill</TH><TH>Adjourn</TH>";
+    $OUT .= "<TH>Suspend</TH><TH>Expire</TH><TH>Contract End</TH>";
+    $OUT .= "<TH>Cancel</TH></TR>";
+    foreach my $pkg ( @cust_pkg ) {
+       my $part_pkg = $pkg->{part_pkg}[0];
+       $status = ws_pkgstatus($pkg);
+       if($pkg->{pkgpart} == $pkgpart && ($filter eq $status || !$filter) ) {
+           $OUT .= "<TR><TD>$part_pkg->{pkg}</TD><TD>$status</TD>"; 
+           $OUT .= pdate($pkg->{setup},$date_format);
+           $OUT .= pdate($pkg->{last_bill},$date_format);
+           $OUT .= pdate($pkg->{bill},$date_format);
+           $OUT .= pdate($pkg->{adjourn},$date_format);
+           $OUT .= pdate($pkg->{susp},$date_format);
+           $OUT .= pdate($pkg->{expire},$date_format);
+           $OUT .= pdate($pkg->{contract_end},$date_format);
+           $OUT .= pdate($pkg->{cancel},$date_format);
+           $OUT .= "</TR>";
+       }
+    }
+    $OUT .= "</TABLE>";
+}
+else {
+    my %pkgparts;
+    foreach my $pkg ( @cust_pkg ) {
+       my $status = ws_pkgstatus($pkg);
+       $pkgparts{$pkg->{pkgpart}}{$status}++;
+       my $part_pkg = $pkg->{part_pkg}[0];
+       $pkgparts{$pkg->{pkgpart}}{pkg} = $part_pkg->{pkg};
+    }
+
+    $OUT .= qq! <TABLE BORDER="1"><TR><TH>Package</TH><TH>Status</TH></TR> !;
+    my($pkgpart,$counts);
+    while(($pkgpart,$count) = each %pkgparts){
+       my $link = "${url}provision;pkgpart=$pkgpart";
+       $OUT .= qq! <TR><TD><A HREF="$link">$count->{pkg}</A></TD><TD> !;
+       $OUT .= ws_pkglink("unbilled",$count,$link);
+       $OUT .= ws_pkglink("active",$count,$link);
+       $OUT .= ws_pkglink("suspended",$count,$link);
+       $OUT .= ws_pkglink("cancelled",$count,$link);
+       $OUT .= "</TD></TR>";
+    }
+    $OUT .= "</TABLE>";
+}
+
+%>