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 )