first crack at payment processing with self-service (step two of the process)
[freeside.git] / FS / FS / ClientAPI / MyAccount.pm
index 9983b5d..2ce55a8 100644 (file)
@@ -4,14 +4,16 @@ use strict;
 use vars qw($cache);
 use Digest::MD5 qw(md5_hex);
 use Date::Format;
+use Business::CreditCard;
 use Cache::SharedMemoryCache; #store in db?
 use FS::CGI qw(small_custview); #doh
 use FS::Conf;
-use FS::Record qw(qsearchs);
+use FS::Record qw(qsearch qsearchs);
 use FS::svc_acct;
 use FS::svc_domain;
 use FS::cust_main;
 use FS::cust_bill;
+use FS::cust_main_county;
 
 use FS::ClientAPI; #hmm
 FS::ClientAPI->register_handlers(
@@ -19,6 +21,7 @@ FS::ClientAPI->register_handlers(
   'MyAccount/customer_info' => \&customer_info,
   'MyAccount/invoice'       => \&invoice,
   'MyAccount/cancel'        => \&cancel,
+  'MyAccount/payment_info'  => \&payment_info,
 );
 
 #store in db?
@@ -104,7 +107,6 @@ sub customer_info {
 
   }
 
-
   return { 'error'          => '',
            'custnum'        => $custnum,
            %return,
@@ -112,6 +114,104 @@ sub customer_info {
 
 }
 
+sub payment_info {
+  my $p = shift;
+  my $session = $cache->get($p->{'session_id'})
+    or return { 'error' => "Can't resume session" }; #better error message
+
+  my %return;
+
+  my $custnum = $session->{'custnum'};
+
+  my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } )
+    or return { 'error' => "unknown custnum $custnum" };
+
+  $return{balance} = $cust_main->balance;
+
+  $return{payname} = $cust_main->payname
+                     || ( $cust_main->first. ' '. $cust_main->get('last') );
+
+  $return{$_} = $cust_main->get($_) for qw(address1 address2 city state zip);
+
+  $return{payby} = $cust_main->payby;
+
+  if ( $cust_main->payby =~ /^(CARD|DCRD)$/ ) {
+    warn $return{card_type} = cardtype($cust_main->payinfo);
+    $return{payinfo} = $cust_main->payinfo;
+
+    if ( $cust_main->paydate  =~ /^(\d{4})-(\d{2})-\d{2}$/ ) { #Pg date format
+      @return{'month', 'year'} = ( $2, $1 );
+    } elsif ( $cust_main->paydate =~ /^(\d{1,2})-(\d{1,2}-)?(\d{4}$)/ ) {
+      @return{'month', 'year'} = ( $1, $3 );
+    }
+
+  }
+
+  #list all counties/states/countries
+  $return{'cust_main_county'} = 
+      [ map { $_->hashref } qsearch('cust_main_county', {}) ],
+
+  #shortcut for one-country folks
+  my $conf = new FS::Conf;
+  my %states = map { $_->state => 1 }
+                 qsearch('cust_main_county', {
+                   'country' => $conf->config('defaultcountry') || 'US'
+                 } );
+  $return{'states'} = [ sort { $a cmp $b } keys %states ];
+
+  $return{card_types} = {
+    'VISA' => 'VISA card',
+    'MasterCard' => 'MasterCard',
+    'Discover' => 'Discover card',
+    'American Express' => 'American Express card',
+  };
+
+  my $_date = time;
+  $return{paybatch} = "webui-MyAccount-$_date-$$-". rand() * 2**32;
+
+  return { 'error' => '',
+           %return,
+         };
+
+};
+
+sub make_payment{
+  my $p = shift;
+
+  my $session = $cache->get($p->{'session_id'})
+    or return { 'error' => "Can't resume session" }; #better error message
+
+  my %return;
+
+  my $custnum = $session->{'custnum'};
+
+  my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } )
+    or return { 'error' => "unknown custnum $custnum" };
+
+  if ( $p->{'save'} ) {
+    my $new = new FS::cust_main { $cust_main->hash };
+    $new->set( $_ => $p->{$_} )
+      foreach qw( payname address1 address2 city state zip payinfo );
+    $new->set( 'paydate' => $p->{'month'}. '-'. $p->{'year'} );
+    $new->set( 'payby' => $p->{'auto'} ? 'CARD' : 'DCRD' );
+    my $error = $new->replace($cust_main);
+    return { 'error' => $error } if $error;
+    $cust_main = $new;
+  }
+
+  my $error = $cust_main->realtime_bop( 'CC', $p->{'amount'}, quiet=>1,
+    'paydate' => $p->{'month'}. '-'. $p->{'year'},
+    map { $_ => $p->{$_} }
+      qw( payname address1 address2 city state zip payinfo )
+  );
+  return { 'error' => $error } if $error;
+
+  $cust_main->apply_payments;
+
+  return { 'error' => '' };
+
+}
+
 sub invoice {
   my $p = shift;
   my $session = $cache->get($p->{'session_id'})