view/set svc_phone forwardst and email from self-service, RT13622
[freeside.git] / FS / FS / ClientAPI / MyAccount.pm
index 8859f22..2d2ea01 100644 (file)
@@ -18,6 +18,7 @@ use FS::Conf;
 use FS::Record qw(qsearch qsearchs dbh);
 use FS::Msgcat qw(gettext);
 use FS::Misc qw(card_types);
+use FS::Misc::DateTime qw(parse_datetime);
 use FS::ClientAPI_SessionCache;
 use FS::svc_acct;
 use FS::svc_domain;
@@ -637,6 +638,7 @@ sub process_payment {
   #false laziness w/process/payment.cgi
   my $payinfo;
   my $paycvv = '';
+  my $paynum = '';
   if ( $payby eq 'CHEK' || $payby eq 'DCHK' ) {
   
     $p->{'payinfo1'} =~ /^([\dx]+)$/
@@ -698,6 +700,7 @@ sub process_payment {
     'payname'  => $payname,
     'paybatch' => $paybatch, #this doesn't actually do anything
     'paycvv'   => $paycvv,
+    'paynum_ref' => \$paynum,
     'pkgnum'   => $session->{'pkgnum'},
     'discount_term' => $discount_term,
     'selfservice' => 1,
@@ -740,7 +743,46 @@ sub process_payment {
     }
   }
 
-  return { 'error' => '' };
+  my $receipt_html = '';
+  if($paynum) { 
+      # currently supported for realtime CC only; send receipt data to SS
+      my $cust_pay = qsearchs('cust_pay', { 'paynum' => $paynum } );
+      if($cust_pay) {
+       $receipt_html = qq!
+<TABLE BGCOLOR="#cccccc" BORDER=0 CELLSPACING=2>
+
+<TR>
+  <TD ALIGN="right">Payment#</TD>
+  <TD BGCOLOR="#FFFFFF"><B>! . $cust_pay->paynum . qq!</B></TD>
+</TR>
+
+<TR>
+  <TD ALIGN="right">Date</TD>
+
+  <TD BGCOLOR="#FFFFFF"><B>! . 
+       time2str("%a&nbsp;%b&nbsp;%o,&nbsp;%Y&nbsp;%r", $cust_pay->_date)
+                                                           . qq!</B></TD>
+</TR>
+
+
+<TR>
+  <TD ALIGN="right">Amount</TD>
+  <TD BGCOLOR="#FFFFFF"><B>! . $cust_pay->paid . qq!</B></TD>
+
+</TR>
+
+<TR>
+  <TD ALIGN="right">Payment method</TD>
+  <TD BGCOLOR="#FFFFFF"><B>! . $cust_pay->payby_name .' #'. $cust_pay->paymask
+                                                               . qq!</B></TD>
+</TR>
+
+</TABLE>
+!;
+      }
+  }
+
+  return { 'error' => '', 'receipt_html' => $receipt_html, };
 
 }
 
@@ -978,6 +1020,7 @@ sub list_pkgs {
     'wholesale_view' => 1,
     'login_svcpart' => [ $conf->config('selfservice_server-login_svcpart') ],
     'date_format' => $conf->config('date_format') || '%m/%d/%Y',
+    'lnp' => $conf->exists('svc_phone-lnp'),
       };
   }
 
@@ -996,6 +1039,10 @@ sub list_pkgs {
                                         if $context eq 'agent'
                                         && $conf->exists('agent-showpasswords')
                                         && $_->part_svc->svcdb eq 'svc_acct';
+                                      $ref->{svchash} = { $_->svc_x->hash } if 
+                                        $_->part_svc->svcdb eq 'svc_phone';
+                                      $ref->{svchash}->{svcpart} =  $_->part_svc->svcpart
+                                        if $_->part_svc->svcdb eq 'svc_phone'; # hack
                                       $ref;
                                     } $_->cust_svc
                               ],
@@ -1011,6 +1058,8 @@ sub list_pkgs {
 sub list_svcs {
   my $p = shift;
 
+  my $conf = new FS::Conf;
+
   my($context, $session, $custnum) = _custoragent_session_custnum($p);
   return { 'error' => $session } if $context eq 'error';
 
@@ -1042,6 +1091,7 @@ sub list_svcs {
   { 
     'svcnum'   => $session->{'svcnum'},
     'custnum'  => $custnum,
+    'view_usage_nodomain' => $conf->exists('selfservice-view_usage_nodomain'),
     'svcs'     => [
       map { 
             my $svc_x = $_->svc_x;
@@ -1132,8 +1182,8 @@ sub list_support_usage {
 
 sub _list_cdr_usage {
   my($svc_phone, $begin, $end) = @_;
-  map [ $_->downstream_csv('format' => 'default') ], #XXX config for format
-      $svc_phone->get_cdrs( 'begin'=>$begin, 'end'=>$end, );
+  map [ $_->downstream_csv('format' => 'default', 'keeparray' => 1) ], #XXX config for format
+                       $svc_phone->get_cdrs( 'begin'=>$begin, 'end'=>$end, );
 }
 
 sub list_cdr_usage {
@@ -1270,7 +1320,7 @@ sub order_pkg {
       map { $_ => $p->{$_} } @{$fields{$svcdb}}
     } );
     
-    if ( $svcdb eq 'svc_acct' ) {
+    if ( $svcdb eq 'svc_acct' && exists($p->{"snarf_machine1"}) ) {
       my @acct_snarf;
       my $snarfnum = 1;
       while ( length($p->{"snarf_machine$snarfnum"}) ) {
@@ -1300,7 +1350,7 @@ sub order_pkg {
   tie my %hash, 'Tie::RefHash';
   %hash = ( $cust_pkg => \@svc );
   #msgcat
-  $error = $cust_main->order_pkgs( \%hash, '', 'noexport' => 1 );
+  $error = $cust_main->order_pkgs( \%hash, 'noexport' => 1 );
   return { 'error' => $error } if $error;
 
   my $conf = new FS::Conf;
@@ -1552,7 +1602,40 @@ sub alter_pkg {
 
 sub provision_phone {
  my $p = shift;
- my @bulkdid = @{$p->{'bulkdid'}};
+ my @bulkdid;
+ @bulkdid = @{$p->{'bulkdid'}} if $p->{'bulkdid'};
+
+ if($p->{'svcnum'} && $p->{'svcnum'} =~ /^\d+$/){
+      my($context, $session, $custnum) = _custoragent_session_custnum($p);
+      return { 'error' => $session } if $context eq 'error';
+    
+      my $svc_phone = qsearchs('svc_phone', { svcnum => $p->{'svcnum'} });
+      return { 'error' => 'service not found' } unless $svc_phone;
+      return { 'error' => 'invalid svcnum' } 
+        if $svc_phone && $svc_phone->cust_svc->cust_pkg->custnum != $custnum;
+
+      $svc_phone->email($p->{'email'}) 
+        if $svc_phone->email ne $p->{'email'} && $p->{'email'} =~ /^([\w\.\d@]+|)$/;
+      $svc_phone->forwarddst($p->{'forwarddst'}) 
+        if $svc_phone->forwarddst ne $p->{'forwarddst'} 
+            && $p->{'forwarddst'} =~ /^(\d+|)$/;
+      return { 'error' => $svc_phone->replace };
+ }
+
+# single DID LNP
+ unless($p->{'lnp'}) {
+    $p->{'lnp_desired_due_date'} = parse_datetime($p->{'lnp_desired_due_date'});
+    $p->{'lnp_status'} = "portingin";
+    return _provision( 'FS::svc_phone',
+                 [qw(lnp_desired_due_date lnp_other_provider 
+                   lnp_other_provider_account phonenum countrycode lnp_status)],
+                 [qw(phonenum countrycode)],
+                 $p,
+                 @_
+               );
+ }
+
+# single DID order
  unless (scalar(@bulkdid)) {
     return _provision( 'FS::svc_phone',
                  [qw(phonenum countrycode)],
@@ -1562,7 +1645,7 @@ sub provision_phone {
                );
  }
 
-# bulk case
+# bulk DID order case
   my $error;
   foreach my $did ( @bulkdid ) {
     $did =~ s/[^0-9]//g;
@@ -1701,7 +1784,7 @@ sub part_svc_info {
 
   my $conf = new FS::Conf;
 
-  return {
+  my $ret = {
     'svc'     => $part_svc->svc,
     'svcdb'   => $part_svc->svcdb,
     'pkgnum'  => $pkgnum,
@@ -1720,6 +1803,17 @@ sub part_svc_info {
 
   };
 
+  if ($p->{'svcnum'} && $p->{'svcnum'} =~ /^\d+$/ 
+                     && $ret->{'svcdb'} eq 'svc_phone') {
+        $ret->{'svcnum'} = $p->{'svcnum'};
+        my $svc_phone = qsearchs('svc_phone', { svcnum => $p->{'svcnum'} });
+        if ( $svc_phone && $svc_phone->cust_svc->cust_pkg->custnum == $custnum ) {
+            $ret->{'email'} = $svc_phone->email;
+            $ret->{'forwarddst'} = $svc_phone->forwarddst;
+        }
+  }
+
+  $ret;
 }
 
 sub unprovision_svc {