package Business::PayPal::API::TransactionSearch;
$Business::PayPal::API::TransactionSearch::VERSION = '0.71_02'; # TRIAL
use 5.008001;
use strict;
use warnings;

use SOAP::Lite 0.67;
use Business::PayPal::API ();

our @ISA       = qw(Business::PayPal::API);
our @EXPORT_OK = qw( TransactionSearch );

sub TransactionSearch {
    my $self = shift;
    my %args = @_;

    my %types = (
        StartDate        => 'xs:dateTime',
        EndDate          => 'xs:dateTime',
        Payer            => 'ebl:EmailAddressType',
        Receiver         => 'ebl:EmailAddressType',
        ReceiptID        => 'xs:string',
        ProfileID        => 'xs:string',
        TransactionID    => 'xs:string',
        InvoiceID        => 'xs:string',
        PayerName        => 'xs:string',
        AuctionItemNumer => 'xs:string',
        TransactionClass => '',
        Amount           => 'ebl:BasicAmountType',
        CurrencyCode     => 'xs:token',
        Status           => '',
    );

    my @trans = (
        $self->version_req,
        SOAP::Data->name( StartDate => $args{StartDate} )
            ->type( delete $types{StartDate} )
    );

    for my $type ( keys %types ) {
        next unless $args{$type};
        push @trans,
            SOAP::Data->name( $type => $args{$type} )->type( $types{$type} );
    }

    my $request
        = SOAP::Data->name(
        TransactionSearchRequest => \SOAP::Data->value( @trans ) )
        ->type( "ns:TransactionSearchRequestType" );

    my $som = $self->doCall( TransactionSearchReq => $request )
        or return;

    my $path = '/Envelope/Body/TransactionSearchResponse';

    my %response = ();
    unless ( $self->getBasic( $som, $path, \%response ) ) {
        $self->getErrors( $som, $path, \%response );
        return %response;
    }

    return $self->getFieldsList(
        $som,
        $path . '/PaymentTransactions',
        {   Timestamp        => 'Timestamp',
            Timezone         => 'Timezone',
            Type             => 'Type',
            Payer            => 'Payer',
            PayerDisplayName => 'PayerDisplayName',
            TransactionID    => 'TransactionID',
            Status           => 'Status',
            GrossAmount      => 'GrossAmount',
            FeeAmount        => 'FeeAmount',
            NetAmount        => 'NetAmount',
        }
    );
}

1;

=pod

=encoding UTF-8

=head1 NAME

Business::PayPal::API::TransactionSearch - PayPal TransactionSearch API

=head1 VERSION

version 0.71_02

=head1 SYNOPSIS

    use Business::PayPal::API::TransactionSearch;

    # see Business::PayPal::API documentation for parameters
    my $pp = Business::PayPal::API::TransactionSearch->new( ... );

    my $transactions = $pp->TransactionSearch(
        StartDate     => '1998-01-01T00:00:00Z',
        TransactionID => $transid,
    );

=head1 DESCRIPTION

L<Business::PayPal::API::TransactionSearch> implements PayPal's
B<TransactionSearch> API using SOAP::Lite to make direct API calls to
PayPal's SOAP API server. It also implements support for testing via
PayPal's I<sandbox>. Please see L<Business::PayPal::API> for details
on using the PayPal sandbox.

=head2 TransactionSearch

Implements PayPal's B<TransactionSearch> API call. Supported
parameters include:

  StartDate (required)
  EndDate
  Payer
  Receiver
  TransactionID
  PayerName
  AuctionItemNumber
  InvoiceID
  TransactionClass
  Amount
  CurrencyCode
  Status

as described in the PayPal "Web Services API Reference" document. The
syntax for StartDate is:

  YYYY-MM-DDTHH:MM:SSZ

'T' and 'Z' are literal characters 'T' and 'Z' respectively, e.g.:

  2005-12-22T08:51:28Z

Returns a list reference containing up to 100 matching records (as per
the PayPal Web Services API). Each record is a hash reference with the
following fields:

  Timestamp
  Timezone
  Type
  Payer
  PayerDisplayName
  TransactionID
  Status
  GrossAmount
  FeeAmount
  NetAmount

Example:

    my $records = $pp->TransactionSearch(
        StartDate => '2006-03-21T22:29:55Z',
        InvoiceID => '599294993',
    );

    for my $rec ( @$records ) {
        print "Record:\n";
        print "TransactionID: " . $rec->{TransactionID} . "\n";
        print "Payer Email: " . $rec->{Payer} . "\n";
        print "Amount: " . $rec->{GrossAmount} . "\n\n";
    }

=head2 ERROR HANDLING

See the B<ERROR HANDLING> section of L<Business::PayPal::API> for
information on handling errors.

=head2 EXPORT

None by default.

=head1 SEE ALSO

L<https://developer.paypal.com/en_US/pdf/PP_APIReference.pdf>

=head1 AUTHORS

=over 4

=item *

Scott Wiersdorf <scott@perlcode.org>

=item *

Danny Hembree <danny@dynamical.org>

=item *

Bradley M. Kuhn <bkuhn@ebb.org>

=back

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2006-2015 by Scott Wiersdorf, Danny Hembree, Bradley M. Kuhn.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut

__END__

# ABSTRACT: PayPal TransactionSearch API

