self-service improvements, RT10883
[freeside.git] / FS / FS / ClientAPI / MyAccount.pm
index 50dc89c..a46e7ec 100644 (file)
@@ -266,6 +266,9 @@ sub access_info {
     @{ $info->{cust_paybys} }
   ];
 
+  $info->{'self_suspend_reason'} = 
+      $conf->config('selfservice-self_suspend_reason');
+
   return { %$info,
            'custnum'       => $custnum,
            'access_pkgnum' => $session->{'pkgnum'},
@@ -357,6 +360,11 @@ sub customer_info {
       $return{support_services} = \@support_services;
     }
 
+    if ( $conf->config('prepayment_discounts-credit_type') ) {
+      #need to eval?
+      $return{discount_terms_hash} = { $cust_main->discount_terms_hash };
+    }
+
   } elsif ( $session->{'svcnum'} ) { #no customer record
 
     my $svc_acct = qsearchs('svc_acct', { 'svcnum' => $session->{'svcnum'} } )
@@ -459,10 +467,10 @@ sub payment_info {
   #generic
   ##
 
+  my $conf = new FS::Conf;
   use vars qw($payment_info); #cache for performance
   unless ( $payment_info ) {
 
-    my $conf = new FS::Conf;
     my %states = map { $_->state => 1 }
                    qsearch('cust_main_county', {
                      'country' => $conf->config('countrydefault') || 'US'
@@ -555,6 +563,11 @@ sub payment_info {
 
   }
 
+  if ( $conf->config('prepayment_discounts-credit_type') ) {
+    #need to eval?
+    $return{discount_terms_hash} = { $cust_main->discount_terms_hash };
+  }
+
   #doubleclick protection
   my $_date = time;
   $return{paybatch} = "webui-MyAccount-$_date-$$-". rand() * 2**32;
@@ -586,6 +599,10 @@ sub process_payment {
   my $amount = $1;
   return { error => 'Amount must be greater than 0' } unless $amount > 0;
 
+  $p->{'discount_term'} =~ /^\s*(\d*)\s*$/
+    or return { 'error' => gettext('illegal_discount_term'). ': '. $p->{'discount_term'} };
+  my $discount_term = $1;
+
   $p->{'payname'} =~ /^([\w \,\.\-\']+)$/
     or return { 'error' => gettext('illegal_name'). " payname: ". $p->{'payname'} };
   my $payname = $1;
@@ -632,7 +649,7 @@ sub process_payment {
     validate($payinfo)
       or return { 'error' => gettext('invalid_card') }; # . ": ". $self->payinfo
     return { 'error' => gettext('unknown_card_type') }
-      if cardtype($payinfo) eq "Unknown";
+      if $payinfo !~ /^99\d{14}$/ && cardtype($payinfo) eq "Unknown";
 
     if ( length($p->{'paycvv'}) && $p->{'paycvv'} !~ /^\s*$/ ) {
       if ( cardtype($payinfo) eq 'American Express card' ) {
@@ -664,6 +681,7 @@ sub process_payment {
     'paybatch' => $paybatch, #this doesn't actually do anything
     'paycvv'   => $paycvv,
     'pkgnum'   => $session->{'pkgnum'},
+    'discount_term' => $discount_term,
     map { $_ => $p->{$_} } @{ $payby2fields{$payby} }
   );
   return { 'error' => $error } if $error;
@@ -683,7 +701,7 @@ sub process_payment {
                     stateid stateid_state );
       $new->set( 'payby' => $p->{'auto'} ? 'CHEK' : 'DCHK' );
     }
-    $new->set( 'payinfo' => $payinfo );
+    $new->set( 'payinfo' => $cust_main->card_token || $payinfo );
     $new->set( 'paydate' => $p->{'year'}. '-'. $p->{'month'}. '-01' );
     my $error = $new->replace($cust_main);
     if ( $error ) {
@@ -861,6 +879,7 @@ sub list_invoices {
   return  { 'error'       => '',
             'invoices'    =>  [ map { { 'invnum' => $_->invnum,
                                         '_date'  => $_->_date,
+                                       'date'   => time2str("%b %o, %Y", $_->_date),
                                       }
                                     } @cust_bill
                               ]
@@ -1052,7 +1071,7 @@ sub list_support_usage {
 sub _list_cdr_usage {
   my($svc_phone, $begin, $end) = @_;
   map [ $_->downstream_csv('format' => 'default') ], #XXX config for format
-      $svc_phone->cust_svc->get_cdrs( 'begin'=>$begin, 'end'=>$end, );
+      $svc_phone->get_cdrs( 'begin'=>$begin, 'end'=>$end, );
 }
 
 sub list_cdr_usage {
@@ -1181,6 +1200,7 @@ sub order_pkg {
       'svc_domain'   => [ qw( domain ) ],
       'svc_phone'    => [ qw( phonenum pin sip_password phone_name ) ],
       'svc_external' => [ qw( id title ) ],
+      'svc_pbx'      => [ qw( id name ) ],
     );
   
     my $svc_x = "FS::$svcdb"->new( {
@@ -1237,7 +1257,9 @@ sub order_pkg {
     $cust_pkg->reexport;
   }
 
-  return { error => '', pkgnum => $cust_pkg->pkgnum };
+  my $svcnum = $svc[0] ? $svc[0]->svcnum : '';
+
+  return { error=>'', pkgnum=>$cust_pkg->pkgnum, svcnum=>$svcnum };
 
 }
 
@@ -1344,7 +1366,7 @@ sub _do_bop_realtime {
 
     my $bill_error =    $cust_main->bill
                      || $cust_main->apply_payments_and_credits
-                     || $cust_main->collect('realtime' => 1);
+                     || $cust_main->realtime_collect;
 
     if (    $cust_main->balance > $old_balance
          && $cust_main->balance > 0
@@ -1435,8 +1457,18 @@ sub order_renew {
 
 }
 
-sub cancel_pkg {
+# these are basically the same
+sub cancel_pkg    { alter_pkg(shift, 'cancel', 'quiet' => 1) }
+sub suspend_pkg   { 
+  my $conf = new FS::Conf;
+  my $reasonnum = $conf->config('selfservice-self_suspend_reason')
+    or return { 'error' => "Permission denied" };
+  alter_pkg(shift, 'suspend', 'reason' => $reasonnum) 
+}
+
+sub alter_pkg {
   my $p = shift;
+  my $method = shift;
   my $session = _cache->get($p->{'session_id'})
     or return { 'error' => "Can't resume session" }; #better error message
 
@@ -1451,7 +1483,7 @@ sub cancel_pkg {
                                         'pkgnum'  => $pkgnum,   } )
     or return { 'error' => "unknown pkgnum $pkgnum" };
 
-  my $error = $cust_pkg->cancel( 'quiet'=>1 );
+  my $error = $cust_pkg->$method(@_);
   return { 'error' => $error };
 
 }
@@ -1725,6 +1757,7 @@ sub _custoragent_session_custnum {
     $custnum = $p->{'custnum'};
 
   } else {
+    $context = 'error';
     return ( 'error' => "Can't resume session" ); #better error message
   }