Business-Tax-VAT-Validation

 view release on metacpan or  search on metacpan

lib/Business/Tax/VAT/Validation.pm  view on Meta::CPAN


=item *
 20  Connexion to the VIES database failed.

=item *
 21  The VIES interface failed to parse a stream. This error occurs unpredictabely, so you should retry your validation request.

=item *
257  Invalid response, please contact the author of this module. : This normally only happens if this software doesn't recognize any valid pattern into the response document: this generally means that the database interface has been modified, and you...

=item *
500  The VIES server encountered an internal server error.
Error 500 : soap:Server TIMEOUT
Error 500 : soap:Server MS_UNAVAILABLE

=back

If error_code > 16,  you should temporarily accept the provided number, and periodically perform new checks until response is OK or error < 17
If error_code > 256, you should temporarily accept the provided number, contact the author, and perform a new check when the software is updated.

=cut

sub get_last_error {
    $_[0]->{error};
}

sub get_last_error_code {
    $_[0]->{error_code};
}

=item B<get_last_response> - Returns the full last response

=cut

sub get_last_response {
    $_[0]->{response};
}

### PRIVATE FUNCTIONS ==========================================================
sub _get_ua {
    my ($self) = @_;
    my $ua = LWP::UserAgent->new;
    if ( ref $self->{proxy} eq 'ARRAY' ) {
        $ua->proxy( @{ $self->{proxy} } );
    } else {
        $ua->env_proxy;
    }
    $ua->agent( 'Business::Tax::VAT::Validation/'. $Business::Tax::VAT::Validation::VERSION );
    return $ua;
}

sub _check_vies {
  my ($self, $vatNumber, $countryCode) = @_;
  my $ua = $self->_get_ua();
  my $request = HTTP::Request->new(POST => $self->{baseurl});
  $request->content(_in_soap_envelope($vatNumber, $countryCode));
  $request->content_type("text/xml; charset=utf-8");

  my $response = $ua->request($request);

  return $countryCode . '-' . $vatNumber if $self->_is_res_ok( $response->code, $response->decoded_content );
}

sub _check_hmrc {
    my ($self, $vatNumber, $countryCode) = @_;
    my $ua = $self->_get_ua();

    my $request = HTTP::Request->new(GET => $self->{hmrc_baseurl}.$vatNumber);
    $request->header(Accept => 'application/vnd.hmrc.1.0+json');
    my $response = $ua->request($request);

    $self->{res} = $response->decoded_content;
    if ($response->code == 200) {
        my $data = decode_json($self->{res});
        $self->{information}->{name} = $data->{target}->{name};
        my $line = 1;
        my $address = "";
        while (defined $data->{target}->{address}->{"line$line"}) {
            $address .= $data->{target}->{address}->{"line$line"}."\n";
            $line++;
        }
        $address .= $data->{target}->{address}->{postcode};
        $address .= "\n".$data->{target}->{address}->{countryCode};
        $self->{information}->{address} = $address;
        $self->_set_error( -1, 'Valid VAT Number');
    }
    elsif ($response->code == 404) {
        return $self->_set_error( 2, 'Invalid VAT Number ('.$vatNumber.')');
    }
    elsif ($response->code == 400) {
        return $self->_set_error( 3, 'VAT number badly formed ('.$vatNumber.')');
    }
    else {
        return $self->_set_error( 500, 'Could not contact HMRC: '.$response->status_line);
    }

    return $countryCode . '-' . $vatNumber;
}

sub _format_vatn {
    my ( $self, $vatn, $mscc ) = @_;
    my $null = '';
    $vatn =~ s/\-/ /g;
    $vatn =~ s/\./ /g;
    $vatn =~ s/\s+/ /g;
    if ( !$mscc && $vatn =~ s/^($self->{members}) ?/$null/e ) {
        $mscc = $1;
    }
    return $self->_set_error( 0, "Unknown MS code" )
      if $mscc !~ m/^($self->{members})$/;
    my $re = $self->{re}{$mscc};
    return $self->_set_error( 1, "Invalid VAT number format" )
      if $vatn !~ m/^$re$/;
    ( $vatn, $mscc );
}

sub _in_soap_envelope {
    my ($vatNumber, $countryCode)=@_;
    return <<EWWSOAP;
<s11:Envelope xmlns:s11='http://schemas.xmlsoap.org/soap/envelope/'>
     <s11:Body>
     <tns1:checkVat xmlns:tns1='urn:ec.europa.eu:taxud:vies:services:checkVat:types'>
     <tns1:countryCode>$countryCode</tns1:countryCode>
     <tns1:vatNumber>$vatNumber</tns1:vatNumber>
     </tns1:checkVat>
     </s11:Body>
     </s11:Envelope>
EWWSOAP
}

sub _is_res_ok {
    my ( $self, $code, $res ) = @_;



( run in 1.588 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )