RT# 80514 Selfservice can update ssn/stateid payment info
[freeside.git] / FS / FS / ClientAPI / MyAccount.pm
index f827874..60a70fd 100644 (file)
@@ -1727,9 +1727,6 @@ 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'},
@@ -1746,26 +1743,23 @@ sub update_payby {
     $cust_payby->set($field,$p->{$field});
   }
 
-  my $error = $cust_payby->replace;
+  # Update column if given a value, and the given value wasn't
+  # the value generated by $cust_main->masked($column);
+  $cust_main->set( $_, $p->{$_} )
+    for grep{ $p->{$_} !~ /^x/i; }
+        grep{ exists $p->{$_} }
+        qw/ss stateid/;
 
-  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;
-  }
+  # Perform updates within a transaction
+  local $FS::UID::AutoCommit = 0;
 
-  if ( $error ) {
+  if ( my $error = $cust_payby->replace || $cust_main->replace ) {
     dbh->rollback;
-    return { 'error' => $error };
-  } else {
-    dbh->commit;
-    return { 'custpaybynum' => $cust_payby->custpaybynum };
+    return { error => $error };
   }
-  
+
+  dbh->commit;
+  return { custpaybynum => $cust_payby->custpaybynum };
 }
 
 sub verify_payby {