selfservice command to suspend packages, RT#9989
authormark <mark>
Tue, 23 Nov 2010 01:39:01 +0000 (01:39 +0000)
committermark <mark>
Tue, 23 Nov 2010 01:39:01 +0000 (01:39 +0000)
FS/FS/ClientAPI/MyAccount.pm
FS/FS/ClientAPI_XMLRPC.pm
FS/FS/Conf.pm
fs_selfservice/FS-SelfService/SelfService.pm
fs_selfservice/FS-SelfService/cgi/process_suspend_pkg.html [new file with mode: 0644]
fs_selfservice/FS-SelfService/cgi/provision_list.html
fs_selfservice/FS-SelfService/cgi/selfservice.cgi

index 1e1d1d3..29e374c 100644 (file)
@@ -266,6 +266,9 @@ sub access_info {
     @{ $info->{cust_paybys} }
   ];
 
+  $info->{'self_suspend_reason'} = 
+      $conf->config('selfservice-self_suspend_reason', $cust_main->agentnum);
+
   return { %$info,
            'custnum'       => $custnum,
            'access_pkgnum' => $session->{'pkgnum'},
@@ -1453,6 +1456,32 @@ sub order_renew {
 
 }
 
+sub suspend_pkg {
+  my $p = shift;
+  my $session = _cache->get($p->{'session_id'})
+    or return { 'error' => "Can't resume session" }; #better error message
+
+  my $custnum = $session->{'custnum'};
+
+  my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } )
+    or return { 'error' => "unknown custnum $custnum" };
+
+  my $conf = new FS::Conf;
+  my $reasonnum = 
+    $conf->config('selfservice-self_suspend_reason', $cust_main->agentnum)
+      or return { 'error' => 'Permission denied' };
+
+  my $pkgnum = $p->{'pkgnum'};
+
+  my $cust_pkg = qsearchs('cust_pkg', { 'custnum' => $custnum,
+                                        'pkgnum'  => $pkgnum,   } )
+    or return { 'error' => "unknown pkgnum $pkgnum" };
+
+  my $error = $cust_pkg->suspend(reason => $reasonnum);
+  return { 'error' => $error };
+
+}
+
 sub cancel_pkg {
   my $p = shift;
   my $session = _cache->get($p->{'session_id'})
@@ -1469,7 +1498,7 @@ sub cancel_pkg {
                                         'pkgnum'  => $pkgnum,   } )
     or return { 'error' => "unknown pkgnum $pkgnum" };
 
-  my $error = $cust_pkg->cancel( 'quiet'=>1 );
+  my $error = $cust_pkg->cancel('quiet' => 1);
   return { 'error' => $error };
 
 }
index 32e96b8..48b94eb 100644 (file)
@@ -91,6 +91,7 @@ sub ss2clientapi {
   'renew_info'                => 'MyAccount/renew_info',
   'order_renew'               => 'MyAccount/order_renew',
   'cancel_pkg'                => 'MyAccount/cancel_pkg',    #add to ss cgi!
+  'suspend_pkg'               => 'MyAccount/suspend_pkg',   #add to ss cgi!
   'charge'                    => 'MyAccount/charge',        #?
   'part_svc_info'             => 'MyAccount/part_svc_info',
   'provision_acct'            => 'MyAccount/provision_acct',
index 1d946a5..08bdedd 100644 (file)
@@ -2294,6 +2294,32 @@ and customer address. Include units.',
   },
 
   {
+    'key'         => 'selfservice-self_suspend_reason',
+    'section'     => 'self-service',
+    'description' => 'Suspend reason when customers suspend their own packages. Set to nothing to disallow self-suspension.',
+    'type'        => 'select-sub',
+    'options_sub' => sub { require FS::Record;
+                           require FS::reason;
+                           my $type = qsearchs('reason_type', 
+                             { class => 'S' }) 
+                              or return ();
+                          map { $_->reasonnum => $_->reason }
+                               FS::Record::qsearch('reason', 
+                                 { reason_type => $type->typenum } 
+                               );
+                        },
+    'option_sub'  => sub { require FS::Record;
+                           require FS::reason;
+                          my $reason = FS::Record::qsearchs(
+                            'reason', { 'reasonnum' => shift }
+                          );
+                           $reason ? $reason->reason : '';
+                        },
+
+    'per_agent'   => 1,
+  },
+
+  {
     'key'         => 'card_refund-days',
     'section'     => 'billing',
     'description' => 'After a payment, the number of days a refund link will be available for that payment.  Defaults to 120.',
index fc9a37a..990ff20 100644 (file)
@@ -53,6 +53,7 @@ $socket .= '.'.$tag if defined $tag && length($tag);
   'renew_info'                => 'MyAccount/renew_info',
   'order_renew'               => 'MyAccount/order_renew',
   'cancel_pkg'                => 'MyAccount/cancel_pkg',    #add to ss cgi!
+  'suspend_pkg'               => 'MyAccount/suspend_pkg',   #add to ss cgi!
   'charge'                    => 'MyAccount/charge',        #?
   'part_svc_info'             => 'MyAccount/part_svc_info',
   'provision_acct'            => 'MyAccount/provision_acct',
diff --git a/fs_selfservice/FS-SelfService/cgi/process_suspend_pkg.html b/fs_selfservice/FS-SelfService/cgi/process_suspend_pkg.html
new file mode 100644 (file)
index 0000000..d5c62f4
--- /dev/null
@@ -0,0 +1,3 @@
+<%= $url = "$selfurl?session=$session_id;action="; ''; %>
+<%= include('header', 'Package suspended') %>
+<%= include('footer') %>
index 88d1c84..818cd9f 100644 (file)
@@ -9,18 +9,30 @@ function areyousure(href, message) {
 
 <TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 BGCOLOR="#ffffff">
 
-<%= foreach my $pkg (
-      grep {    scalar(@{$_->{part_svc}})
-             || scalar(@{$_->{cust_svc}})
-           } @cust_pkg
+<%=
+
+foreach my $pkg (
+    grep {    scalar(@{$_->{part_svc}})
+           || scalar(@{$_->{cust_svc}})
+         } @cust_pkg
     ) {
+  my $susp = $pkg->{'susp'} || '';
+  warn $pkg->{'pkg'}. ' '.$susp."\n";
+  my @pkg_actions = ( [ 'customer_change_pkg' => 'change' ] );
+  push @pkg_actions, [ 'process_suspend_pkg' => 'suspend' ] 
+    if $self_suspend_reason and !$susp;
 
+  my $bgcolor = $susp ? '"#ff9900"' : '"#8888ff"';
   $OUT .= #'<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 BGCOLOR="#ffffff">'.
-          '<TR><TH BGCOLOR="#6666ff" COLSPAN=2>'.
-          $pkg->{'pkg'}. '</TH><TH BGCOLOR="#6666ff" >' .
-          qq!(<A style="font-size: smaller;color: #000000" HREF="! .
-          qq!${url}customer_change_pkg;pkgnum=$pkg->{'pkgnum'};pkg=$pkg->{'pkg'}">! .
-          'change</A>)</TH></TR>';
+          '<TR><TH BGCOLOR='.$bgcolor.' COLSPAN=2>'.
+          $pkg->{'pkg'}. ($susp && ' (suspended)').
+          '</TH><TH ALIGN="left" BGCOLOR='.$bgcolor.'>';
+  foreach my $action (@pkg_actions) {
+    $OUT .= '(<A style="font-size: smaller;color: #000000" HREF="' .
+            $url . $action->[0] . ';pkgnum=' . $pkg->{'pkgnum'} . ';pkg=' .
+            $pkg->{'pkg'} . '">' . $action->[1] . '</A>) ';
+  }
+  $OUT .= '</TH></TR>';
 
   my $col1 = "ffffff";
   my $col2 = "dddddd";
index 711bd4e..d23e6ba 100644 (file)
@@ -14,7 +14,7 @@ use FS::SelfService qw(
   payment_info process_payment realtime_collect process_prepay
   list_pkgs order_pkg signup_info order_recharge
   part_svc_info provision_acct provision_external
-  unprovision_svc change_pkg domainselector
+  unprovision_svc change_pkg suspend_pkg domainselector
   list_svcs list_svc_usage list_cdr_usage list_support_usage
   myaccount_passwd
   mason_comp
@@ -73,7 +73,7 @@ $session_id = $cgi->param('session');
 
 #order|pw_list XXX ???
 $cgi->param('action') =~
-    /^(myaccount|view_invoice|make_payment|make_ach_payment|make_term_payment|make_thirdparty_payment|payment_results|ach_payment_results|recharge_prepay|recharge_results|logout|change_bill|change_ship|change_pay|process_change_bill|process_change_ship|process_change_pay|customer_order_pkg|process_order_pkg|customer_change_pkg|process_change_pkg|process_order_recharge|provision|provision_svc|process_svc_acct|process_svc_external|delete_svc|view_usage|view_usage_details|view_cdr_details|view_support_details|change_password|process_change_password)$/
+    /^(myaccount|view_invoice|make_payment|make_ach_payment|make_term_payment|make_thirdparty_payment|payment_results|ach_payment_results|recharge_prepay|recharge_results|logout|change_bill|change_ship|change_pay|process_change_bill|process_change_ship|process_change_pay|customer_order_pkg|process_order_pkg|customer_change_pkg|process_change_pkg|process_order_recharge|provision|provision_svc|process_svc_acct|process_svc_external|delete_svc|view_usage|view_usage_details|view_cdr_details|view_support_details|change_password|process_change_password|customer_suspend_pkg|process_suspend_pkg)$/
   or die "unknown action ". $cgi->param('action');
 my $action = $1;
 
@@ -329,6 +329,24 @@ sub process_change_pkg {
 
 }
 
+sub process_suspend_pkg {
+  my $results = '';
+  $results = suspend_pkg (
+    'session_id' => $session_id,
+    map { $_ => $cgi->param($_) } 
+      qw( pkgnum )
+    );
+  if ( $results->{'error'} ) {
+    $action = 'provision';
+    return {
+      'error' => '<FONT COLOR="#FF0000">'. $results->{'error'}. '</FONT>',
+    }
+  }
+  else {
+    return $results;
+  }
+}
+
 sub process_order_recharge {
 
   my $results = '';