+ $batch;
+}
+
+sub parse_item {
+ my ($self, $resp) = @_;
+
+ my ($mon, $day, $year, $hour, $min, $sec) =
+ $resp->{respDateTime} =~ /^(..)(..)(....)(..)(..)(..)$/;
+ my $dt = DateTime->new(
+ year => $year,
+ month => $mon,
+ day => $day,
+ hour => $hour,
+ minute => $min,
+ second => $sec,
+ );
+
+ my %failure_status = (
+ # API version 2.6, April 2013
+ '00' => undef, # Approved
+ '04' => 'pickup',
+ '33' => 'expired',
+ '41' => 'stolen',
+ '42' => 'inactive',
+ '43' => 'stolen',
+ '44' => 'inactive',
+ 'B7' => 'blacklisted', # Fraud
+ 'B9' => 'blacklisted', # On Negative File
+ 'BB' => 'stolen', # Possible Compromise
+ 'BG' => 'blacklisted', # Blocked Account
+ 'BQ' => 'blacklisted', # Issuer has Flagged Account as Suspected Fraud
+ 'C4' => 'nsf', # Over Credit Limit
+ 'D5' => 'blacklisted', # On Negative File
+ 'D7' => 'nsf', # Insufficient Funds
+ 'F3' => 'inactive', # Account Closed
+ 'K6' => 'nsf', # NSF
+ ); # all others are "decline"
+
+ my $failure_status = undef;
+ my $error_message;
+
+ if ( $resp->{procStatus} ) {
+ $error_message = $resp->{procStatusMessage};
+ } elsif ( $resp->{respCode} ) {
+ $error_message = $resp->{respCodeMessage};
+ $failure_status = $failure_status{ $resp->{respCode} } || 'decline';