RT# 80514 Selfservice can update ssn/stateid payment info
[freeside.git] / FS / FS / ClientAPI / MyAccount.pm
index ce887ef..f827874 100644 (file)
@@ -237,6 +237,13 @@ sub login {
 
     $svc_x = $svc_phone;
 
+  } elsif ( $p->{'domain'} eq 'ip_mac' ) {
+
+      my $svc_broadband = qsearchs( 'svc_broadband', { 'mac_addr' => $p->{'username'} } );
+      return { error => 'IP address not found' }
+        unless $svc_broadband;
+      $svc_x = $svc_broadband;
+
   } elsif ( $p->{email}
               && (my $contact = FS::contact->by_selfservice_email($p->{email}))
           )
@@ -623,6 +630,8 @@ sub customer_info_short {
     for (@cust_main_editable_fields) {
       $return{$_} = $cust_main->get($_);
     }
+    $return{$_} = $cust_main->masked($_) for qw/ss stateid/;
+
     #maybe a little more expensive, but it should be cached by now
     for (@location_editable_fields) {
       $return{$_} = $cust_main->bill_location->get($_)
@@ -914,6 +923,7 @@ sub payment_info {
   $return{paybatch} = $return{payunique};  #back compat
 
   $return{credit_card_surcharge_percentage} = $conf->config('credit-card-surcharge-percentage', $cust_main->agentnum);
+  $return{credit_card_surcharge_flatfee} = $conf->config('credit-card-surcharge-flatfee', $cust_main->agentnum);
 
   return { 'error' => '',
            %return,
@@ -1717,12 +1727,18 @@ sub update_payby {
      $p->{'payinfo'} = $payinfo1. '@'. $payinfo2;
    }
 
+  # Perform update within a transaction
+  local $FS::UID::AutoCommit = 0;
+
   my $cust_payby = qsearchs('cust_payby', {
                               'custnum'      => $custnum,
                               'custpaybynum' => $p->{'custpaybynum'},
                            })
     or return { 'error' => 'unknown custpaybynum '. $p->{'custpaybynum'} };
 
+  my $cust_main = qsearchs( 'cust_main', {custnum => $cust_payby->custnum} )
+    or return { 'error' => 'unknown custnum '.$cust_payby->custnum };
+
   foreach my $field (
     qw( weight payby payinfo paycvv paydate payname paystate paytype payip )
   ) {
@@ -1731,9 +1747,22 @@ sub update_payby {
   }
 
   my $error = $cust_payby->replace;
+
+  if (!$error) {
+    my $is_changed = 0;
+    for my $field ( qw/ss stateid/ ) {
+      next if !exists $p->{$field} || $p->{$field} =~ /^x/i;
+      $cust_main->set( $field, $p->{$field} );
+      $is_changed = 1;
+    }
+    $error = $cust_main->replace if $is_changed;
+  }
+
   if ( $error ) {
+    dbh->rollback;
     return { 'error' => $error };
   } else {
+    dbh->commit;
     return { 'custpaybynum' => $cust_payby->custpaybynum };
   }
   
@@ -3582,6 +3611,11 @@ sub list_tickets {
 
   # unavoidable false laziness w/ httemplate/view/cust_main/tickets.html
   if ( $FS::TicketSystem::system && FS::TicketSystem->selfservice_priority ) {
+
+    @tickets = grep { $_->{'_selfservice_priority'}
+                        !~ /^\s*(closed?|resolved?|done)\s*/i }
+                 @tickets;
+
     my $conf = new FS::Conf;
     my $dir = $conf->exists('ticket_system-priority_reverse') ? -1 : 1;
     +{ tickets => [ 
@@ -3887,4 +3921,3 @@ sub _custoragent_session_custnum {
 }
 
 1;
-