+ else {
+ $Business::OnlinePayment::HTTPS::DEBUG = $DEBUG;
+ $DB::single = $DEBUG;
+ if (defined($content->{'login'}) and defined($content->{'password'})) {
+ # transret.php doesn't respect date ranges. It returns anything from the
+ # same month as the date argument. Therefore we generate one request for
+ # each month in the date range, and then filter them by date later.
+ my $path = ('transret.php?style=csv&sort=id&date=');
+ my $starttime = str2time($self->_start);
+ my $endtime = str2time($self->_end) - 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);
+ # B:OP:HTTPS::https_get doesn't use $DEBUG.
+ my ($page, $reply, %headers) =
+ $self->https_get(
+ { headers => $headers },
+ {},
+ );
+ if ($reply =~ /^200/) {
+ $self->is_success(1);
+ }
+ else {
+ $self->error_message($reply);
+ carp $reply if $DEBUG;
+ carp $page if $DEBUG >= 3;
+ $self->is_success(0);
+ return;
+ }
+ my $index_date_ret = 2; # Usual position of 'Date Returned'
+ 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;
+ if($fields[0] eq 'id') {
+ # Use this header row to find the 'Date Returned' field.
+ ($index_date_ret) = grep { lc($fields[$_]) eq 'date returned' } ( 0..scalar(@fields)-1 );
+ $index_date_ret ||= 2;
+ }
+ next if not($fields[0] =~ /^\d+$/);
+ my $rettime = str2time($fields[$index_date_ret]);
+ next if (!$rettime or $rettime < $starttime or $rettime > $endtime);
+ carp $trans if $DEBUG > 1;
+ push @tids, $fields[0];
+ }
+ }
+ return @tids;
+ }
+ else {
+ croak 'login and password required';
+ }
+ }