Fix idiotic bug; start adding transret.php method for returns Business_OnlinePayment_WesternACH_0_05
authormark <mark>
Fri, 7 Aug 2009 21:59:42 +0000 (21:59 +0000)
committermark <mark>
Fri, 7 Aug 2009 21:59:42 +0000 (21:59 +0000)
lib/Business/OnlinePayment/WesternACH.pm

index 7c3263f..69a52e1 100644 (file)
@@ -5,6 +5,7 @@ use Carp;
 use Business::OnlinePayment 3;
 use Business::OnlinePayment::HTTPS;
 use XML::Simple;
+use MIME::Base64;
 use Date::Format 'time2str';
 use Date::Parse  'str2time';
 use vars qw($VERSION @ISA $me $DEBUG);
@@ -151,7 +152,12 @@ sub submit {
       # get_returns puts its results here
       my $tid = $reply->{Response}->{TransactionID};
       if($self->{_content}->{command} eq 'get_returns') {
-        $self->{_content}->{returns} =  [ map { $_->{value} } @$tid ];
+        if(ref($tid) eq 'ARRAY') {
+          $self->{_content}->{returns} =  [ map { $_->{value} } @$tid ];
+        }
+        else {
+          $self->{_content}->{returns} = [ $tid->{value} ];
+        }
       }
       else { # It's not get_returns
         $self->authorization($tid->{value});
@@ -174,19 +180,70 @@ sub get_returns {
   if(exists($content->{'command'})) {
     croak 'get_returns: command is already set on this transaction';
   }
-  $content->{'command'} = 'get_returns';
-  $self->submit;
-  if($self->is_success) {
-    if(exists($content->{'returns'})) {
-      return @{$content->{'returns'}};
+  if ($content->{'returns_method'} eq 'transret') {
+    $Business::OnlinePayment::HTTPS::DEBUG = $DEBUG;
+    if (defined($content->{'login'}) and defined($content->{'password'})) {
+      # date range doesn't work quite right with transret
+      my $path = ('transret.php?style=csv&sort=id&date=');
+      my $starttime = str2time($self->_start);
+      my $endtime = str2time($self->_end) - 1;
+      $DB::single=1;
+      my @months = map { s/^(....)(..)$/$1-$2-01/; $_ } (
+          time2str('%Y%m', $starttime)..time2str('%Y%m', $endtime)
+          );
+      my $headers = { 
+         Authorization => 'Basic ' . MIME::Base64::encode($content->{'login'} . ':' . $content->{'password'}) 
+          };
+      my @tids;
+      foreach my $m (@months) {
+        $self->path($path . $m);
+        my ($page, $reply, %headers) = 
+            $self->https_get(
+              { headers => $headers },
+              {},
+            );
+        if ($reply =~ /^200/) {
+          $self->is_success(1);
+        }
+        else {
+          $self->error_message($reply);
+          carp $page if $DEBUG > 1;
+          $self->is_success(0);
+          return;
+        }
+        foreach my $trans (split("\cJ", $page)) {
+          my @fields = split(',', $trans);
+          # fields:
+          # id, Date Returned, Type, Amount, Name, Customer ID Number, Email Address, Invoice Number, Status Code, SEC
+          # we only care about id and date.
+          next if scalar(@fields) < 10;
+          next if not($fields[0] =~ /^\d+$/);
+          my $rettime = str2time($fields[1]);
+          next if (!$rettime or $rettime < $starttime or $rettime > $endtime);
+          carp $trans if $DEBUG > 1;
+          push @tids, $fields[0];
+        }
+      }
+      return @tids;
     }
     else {
-      return ();
+      croak 'login and password required';
     }
-  }
+  } 
   else {
+    $content->{'command'} = 'get_returns';
+    $self->submit;
+    if($self->is_success) {
+      if(exists($content->{'returns'})) {
+        return @{$content->{'returns'}};
+      }
+      else {
+        return ();
+      }
+    } else {
     # you need to check error_message() for details.
     return ();
+    }
   }
 }
 
@@ -266,9 +323,14 @@ sub _full_name {
 
 sub _start {
   my $self = shift;
-  my $start = time2str('%Y-%m-%d', str2time($self->{_content}->{start}));
-  croak "Invalid start date: '".$self->{_content}->{start} if !$start;
-  return $start;
+  if($self->{_content}->{start}) {
+    my $start = time2str('%Y-%m-%d', str2time($self->{_content}->{start}));
+    croak "Invalid start date: '".$self->{_content}->{start} if !$start;
+    return $start;
+  }
+  else {
+    return time2str('%Y-%m-%d', time - 86400);
+  }
 }
 
 sub _end {