From: mark Date: Fri, 7 Aug 2009 21:59:42 +0000 (+0000) Subject: Fix idiotic bug; start adding transret.php method for returns X-Git-Tag: Business_OnlinePayment_WesternACH_0_05 X-Git-Url: http://git.freeside.biz/gitweb/?p=Business-OnlinePayment-WesternACH.git;a=commitdiff_plain;h=8e5f7d36a1555a7f55fceb5ffababc6f6f3a5cab Fix idiotic bug; start adding transret.php method for returns --- diff --git a/lib/Business/OnlinePayment/WesternACH.pm b/lib/Business/OnlinePayment/WesternACH.pm index 7c3263f..69a52e1 100644 --- a/lib/Business/OnlinePayment/WesternACH.pm +++ b/lib/Business/OnlinePayment/WesternACH.pm @@ -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 {