Refactored EU tax plugin code to reduce code duplication and added tests.
This commit is contained in:
parent
6bdf5f42ed
commit
2e5250afe1
3 changed files with 326 additions and 223 deletions
|
|
@ -31,18 +31,29 @@ my $quiet; # this line required
|
||||||
my $session = start(); # this line required
|
my $session = start(); # this line required
|
||||||
|
|
||||||
# upgrade functions go here
|
# upgrade functions go here
|
||||||
|
addEuTaxRecheckWorkflow( $session );
|
||||||
|
|
||||||
finish($session); # this line required
|
finish($session); # this line required
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
# Describe what our function does
|
sub addEuTaxRecheckWorkflow {
|
||||||
#sub exampleFunction {
|
my $session = shift;
|
||||||
# my $session = shift;
|
|
||||||
# print "\tWe're doing some stuff here that you should know about... " unless $quiet;
|
print "\tAdding EU Tax plugin VAT number recheck workflow..." unless $quiet;
|
||||||
# # and here's our code
|
|
||||||
# print "DONE!\n" unless $quiet;
|
my $workflow = WebGUI::Workflow->create( $session, {
|
||||||
#}
|
title => 'Recheck unverified EU VAT numbers',
|
||||||
|
description =>
|
||||||
|
'Utility workflow that automatically rechecks VAT numbers that could not be checked when they were submitted',
|
||||||
|
enabled => 1,
|
||||||
|
type => 'None',
|
||||||
|
mode => 'parallel',
|
||||||
|
}, 'taxeurecheckworkflow01' );
|
||||||
|
$workflow->addActivity( 'WebGUI::Workflow::Activity::RecheckVATNumber', 'taxeurecheckactivity01' );
|
||||||
|
|
||||||
|
print "Done\n" unless $quiet;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# -------------- DO NOT EDIT BELOW THIS LINE --------------------------------
|
# -------------- DO NOT EDIT BELOW THIS LINE --------------------------------
|
||||||
|
|
|
||||||
|
|
@ -150,34 +150,13 @@ sub addVATNumber {
|
||||||
my $db = $self->session->db;
|
my $db = $self->session->db;
|
||||||
my $i18n = WebGUI::International->new( $self->session, 'TaxDriver_EU' );
|
my $i18n = WebGUI::International->new( $self->session, 'TaxDriver_EU' );
|
||||||
|
|
||||||
WebGUI::Error::InvalidParam->throw( 'A VAT number is required' )
|
my $result = $self->updateVATNumber( $number, $user, $localCheckOnly );
|
||||||
unless $number;
|
|
||||||
WebGUI::Error::InvalidParam->throw( 'The second argument must be an instanciated WebGUI::User object' )
|
if ( $result eq 'INVALID' ) {
|
||||||
unless ref $user eq 'WebGUI::User';
|
|
||||||
WebGUI::Error::InvalidParam->throw( 'Visitor cannot add VAT numbers' )
|
|
||||||
if $user->isVisitor;
|
|
||||||
|
|
||||||
# Check number
|
|
||||||
my $validator = Business::Tax::VAT::Validation->new;
|
|
||||||
my $numberIsValid = $localCheckOnly ? $validator->local_check( $number ) : $validator->check( $number );
|
|
||||||
|
|
||||||
# Number contains syntax error does not exist. Do not write the code to the db.
|
|
||||||
if ( !$numberIsValid && $validator->get_last_error_code <= 16 ) {
|
|
||||||
return $i18n->get('vat number invalid');
|
return $i18n->get('vat number invalid');
|
||||||
}
|
}
|
||||||
|
elsif ( $result eq 'VALID' ) {
|
||||||
# Write the code to the db.
|
return;
|
||||||
$db->write( 'replace into tax_eu_vatNumbers (userId,countryCode,vatNumber,viesValidated,viesErrorCode,approved) values (?,?,?,?,?,?)', [
|
|
||||||
$user->userId,
|
|
||||||
substr( $number, 0 , 2 ),
|
|
||||||
$number,
|
|
||||||
$numberIsValid ? 1 : 0,
|
|
||||||
$numberIsValid ? undef : $validator->get_last_error_code,
|
|
||||||
0,
|
|
||||||
] );
|
|
||||||
|
|
||||||
if ( $numberIsValid ) {
|
|
||||||
return undef;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
my $workflow = WebGUI::Workflow::Instance->create( $self->session, {
|
my $workflow = WebGUI::Workflow::Instance->create( $self->session, {
|
||||||
|
|
@ -192,6 +171,49 @@ sub addVATNumber {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sub updateVATNumber {
|
||||||
|
my $self = shift;
|
||||||
|
my $number = shift;
|
||||||
|
my $user = shift || $self->session->user;
|
||||||
|
my $localCheckOnly = shift;
|
||||||
|
my $db = $self->session->db;
|
||||||
|
|
||||||
|
WebGUI::Error::InvalidParam->throw( 'A VAT number is required' )
|
||||||
|
unless $number;
|
||||||
|
WebGUI::Error::InvalidParam->throw( 'The second argument must be an instanciated WebGUI::User object' )
|
||||||
|
unless ref $user eq 'WebGUI::User';
|
||||||
|
WebGUI::Error::InvalidParam->throw( 'Visitor cannot add VAT numbers' )
|
||||||
|
if $user->isVisitor;
|
||||||
|
|
||||||
|
# Check number
|
||||||
|
my $validator = Business::Tax::VAT::Validation->new;
|
||||||
|
my $numberIsValid = $localCheckOnly ? $validator->local_check( $number ) : $validator->check( $number );
|
||||||
|
|
||||||
|
# Number contains syntax error does not exist. Do not write the code to the db.
|
||||||
|
if ( !$numberIsValid && $validator->get_last_error_code <= 16 ) {
|
||||||
|
return 'INVALID';
|
||||||
|
}
|
||||||
|
|
||||||
|
# Write the code to the db.
|
||||||
|
$db->write( 'replace into tax_eu_vatNumbers (userId,countryCode,vatNumber,viesValidated,viesErrorCode,approved) values (?,?,?,?,?,?)', [
|
||||||
|
$user->userId,
|
||||||
|
substr( $number, 0 , 2 ),
|
||||||
|
$number,
|
||||||
|
$numberIsValid ? 1 : 0,
|
||||||
|
$numberIsValid ? undef : $validator->get_last_error_code,
|
||||||
|
0,
|
||||||
|
] );
|
||||||
|
|
||||||
|
if ( $numberIsValid ) {
|
||||||
|
return 'VALID';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return 'UNKNOWN';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
#-------------------------------------------------------------------
|
||||||
|
|
||||||
=head2 appendCartItemVars ( var, cartItem )
|
=head2 appendCartItemVars ( var, cartItem )
|
||||||
|
|
@ -845,32 +867,9 @@ sub recheckVATNumber {
|
||||||
my $number = shift;
|
my $number = shift;
|
||||||
my $user = shift || $self->session->user;
|
my $user = shift || $self->session->user;
|
||||||
|
|
||||||
my $validator = Business::Tax::VAT::Validation->new;
|
my $result = $self->updateVATNumber( $number, $user );
|
||||||
|
|
||||||
my $isValid = $validator->check( $number );
|
return $result;
|
||||||
my $errorCode = $validator->get_last_error_code;
|
|
||||||
|
|
||||||
if ( $isValid ) {
|
|
||||||
$self->session->db->write(
|
|
||||||
'update tax_eu_vatNumbers set viesValidated=?, viesErrorCode=? where vatNumber=? and userId=?',
|
|
||||||
[
|
|
||||||
1,
|
|
||||||
undef,
|
|
||||||
$number,
|
|
||||||
$user->userId,
|
|
||||||
],
|
|
||||||
);
|
|
||||||
|
|
||||||
return 'VALID';
|
|
||||||
}
|
|
||||||
elsif ( $errorCode < 17 ) {
|
|
||||||
$self->deleteVATNumber( $number, $user );
|
|
||||||
|
|
||||||
return 'INVALID';
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return 'UNKNOWN';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
#-------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -32,22 +32,54 @@ use WebGUI::Shop::AddressBook;
|
||||||
# Init
|
# Init
|
||||||
my $session = WebGUI::Test->session;
|
my $session = WebGUI::Test->session;
|
||||||
|
|
||||||
|
# Test user
|
||||||
my $taxUser = WebGUI::User->new( $session, 'new' );
|
my $taxUser = WebGUI::User->new( $session, 'new' );
|
||||||
$taxUser->username( 'Tex Evasion' );
|
$taxUser->username( 'Tex Evasion' );
|
||||||
WebGUI::Test->usersToDelete($taxUser);
|
WebGUI::Test->usersToDelete($taxUser);
|
||||||
|
|
||||||
|
# Test VAT numbers
|
||||||
|
my $testVAT_NL = 'NL123456789B12';
|
||||||
|
my $testVAT_BE = 'BE0123456789';
|
||||||
|
my $noServiceVAT= 'NotGonnaWork';
|
||||||
|
my $invalidVAT = 'ByNoMeansAllowed';
|
||||||
|
my $visitorUser = WebGUI::User->new( $session, 1 );
|
||||||
|
|
||||||
|
# Test SKU
|
||||||
my $sku = WebGUI::Asset->getRoot($session)->addChild( {
|
my $sku = WebGUI::Asset->getRoot($session)->addChild( {
|
||||||
className => 'WebGUI::Asset::Sku::Donation',
|
className => 'WebGUI::Asset::Sku::Donation',
|
||||||
title => 'Taxable donation',
|
title => 'Taxable donation',
|
||||||
defaultPrice => 100.00,
|
defaultPrice => 100.00,
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
my $book = WebGUI::Shop::AddressBook->create($session);
|
||||||
|
|
||||||
|
# setup address in EU but not in residential country of merchant
|
||||||
|
my $beAddress = $book->addAddress({
|
||||||
|
label => 'BE',
|
||||||
|
city => 'Antwerpen',
|
||||||
|
country => 'Belgium',
|
||||||
|
});
|
||||||
|
|
||||||
|
# setup address in residential country of merchant
|
||||||
|
my $nlAddress = $book->addAddress({
|
||||||
|
label => 'NL',
|
||||||
|
city => 'Delft',
|
||||||
|
country => 'Netherlands',
|
||||||
|
});
|
||||||
|
|
||||||
|
# setup address outside EU
|
||||||
|
my $usAddress = $book->addAddress({
|
||||||
|
label => 'outside eu',
|
||||||
|
city => 'New Amsterdam',
|
||||||
|
country => 'US',
|
||||||
|
});
|
||||||
|
|
||||||
my $cart;
|
my $cart;
|
||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
# Tests
|
# Tests
|
||||||
|
|
||||||
my $tests = 58;
|
my $tests = 317;
|
||||||
plan tests => 1 + $tests;
|
plan tests => 1 + $tests;
|
||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
@ -59,12 +91,12 @@ SKIP: {
|
||||||
|
|
||||||
skip 'Unable to load module WebGUI::Shop::TaxDriver::EU', $tests unless $loaded;
|
skip 'Unable to load module WebGUI::Shop::TaxDriver::EU', $tests unless $loaded;
|
||||||
|
|
||||||
#######################################################################
|
#######################################################################
|
||||||
#
|
#
|
||||||
# new
|
# new
|
||||||
#
|
#
|
||||||
#######################################################################
|
#######################################################################
|
||||||
|
{
|
||||||
my $taxer = WebGUI::Shop::TaxDriver::EU->new($session);
|
my $taxer = WebGUI::Shop::TaxDriver::EU->new($session);
|
||||||
|
|
||||||
isa_ok($taxer, 'WebGUI::Shop::TaxDriver::EU');
|
isa_ok($taxer, 'WebGUI::Shop::TaxDriver::EU');
|
||||||
|
|
@ -72,46 +104,49 @@ SKIP: {
|
||||||
isa_ok($taxer->session, 'WebGUI::Session', 'session method returns a session object');
|
isa_ok($taxer->session, 'WebGUI::Session', 'session method returns a session object');
|
||||||
|
|
||||||
is($session->getId, $taxer->session->getId, 'session method returns OUR session object');
|
is($session->getId, $taxer->session->getId, 'session method returns OUR session object');
|
||||||
|
}
|
||||||
|
|
||||||
#######################################################################
|
#######################################################################
|
||||||
#
|
#
|
||||||
# className
|
# className
|
||||||
#
|
#
|
||||||
#######################################################################
|
#######################################################################
|
||||||
|
{
|
||||||
|
my $taxer = WebGUI::Shop::TaxDriver::EU->new($session);
|
||||||
|
|
||||||
is( $taxer->className, 'WebGUI::Shop::TaxDriver::EU', 'className returns correct class name' );
|
is( $taxer->className, 'WebGUI::Shop::TaxDriver::EU', 'className returns correct class name' );
|
||||||
|
}
|
||||||
|
|
||||||
#######################################################################
|
#######################################################################
|
||||||
#
|
#
|
||||||
# getConfigurationScreen
|
# getConfigurationScreen
|
||||||
#
|
#
|
||||||
#######################################################################
|
#######################################################################
|
||||||
|
|
||||||
#### TODO: Figure out how to test this.
|
#### TODO: Figure out how to test this.
|
||||||
|
|
||||||
#######################################################################
|
|
||||||
#
|
|
||||||
# getCountryCode
|
|
||||||
#
|
|
||||||
#######################################################################
|
|
||||||
|
|
||||||
|
#######################################################################
|
||||||
|
#
|
||||||
|
# getCountryCode / getCOuntryName
|
||||||
|
#
|
||||||
|
#######################################################################
|
||||||
|
{
|
||||||
|
my $taxer = WebGUI::Shop::TaxDriver::EU->new($session);
|
||||||
|
|
||||||
is( $taxer->getCountryCode( 'Netherlands' ), 'NL', 'getCountryCode returns correct code for country inside EU.' );
|
is( $taxer->getCountryCode( 'Netherlands' ), 'NL', 'getCountryCode returns correct code for country inside EU.' );
|
||||||
is( $taxer->getCountryCode( 'United States' ), undef, 'getCountryCode returns undef for countries outside EU.' );
|
is( $taxer->getCountryCode( 'United States' ), undef, 'getCountryCode returns undef for countries outside EU.' );
|
||||||
|
|
||||||
#######################################################################
|
|
||||||
#
|
|
||||||
# getCountryName
|
|
||||||
#
|
|
||||||
#######################################################################
|
|
||||||
|
|
||||||
is( $taxer->getCountryName( 'NL' ), 'Netherlands', 'getCountryName returns correct name for country code within EU.' );
|
is( $taxer->getCountryName( 'NL' ), 'Netherlands', 'getCountryName returns correct name for country code within EU.' );
|
||||||
is( $taxer->getCountryName( 'US' ), undef, 'getCountryName returns undef for county codes outside EU.' );
|
is( $taxer->getCountryName( 'US' ), undef, 'getCountryName returns undef for county codes outside EU.' );
|
||||||
|
}
|
||||||
|
|
||||||
#######################################################################
|
#######################################################################
|
||||||
#
|
#
|
||||||
# addVATNumber
|
# updateVATNumber
|
||||||
#
|
#
|
||||||
#######################################################################
|
#######################################################################
|
||||||
|
{
|
||||||
|
my $taxer = WebGUI::Shop::TaxDriver::EU->new($session);
|
||||||
|
|
||||||
$session->user( {userId=>$taxUser->userId} );
|
$session->user( {userId=>$taxUser->userId} );
|
||||||
|
|
||||||
|
|
@ -120,59 +155,118 @@ SKIP: {
|
||||||
local *Business::Tax::VAT::Validation::new;
|
local *Business::Tax::VAT::Validation::new;
|
||||||
$validator->fake_new( 'Business::Tax::VAT::Validation' );
|
$validator->fake_new( 'Business::Tax::VAT::Validation' );
|
||||||
|
|
||||||
my $testVAT_NL = 'NL123456789B12';
|
eval { $taxer->updateVATNumber };
|
||||||
my $testVAT_BE = 'BE0123456789';
|
|
||||||
my $noServiceVAT= 'NotGonnaWork';
|
|
||||||
my $invalidVAT = 'ByNoMeansAllowed';
|
|
||||||
my $visitorUser = WebGUI::User->new( $session, 1 );
|
|
||||||
|
|
||||||
eval { $taxer->addVATNumber };
|
|
||||||
my $e = Exception::Class->caught();
|
my $e = Exception::Class->caught();
|
||||||
isa_ok( $e, 'WebGUI::Error::InvalidParam', 'A VAT number is required' );
|
isa_ok( $e, 'WebGUI::Error::InvalidParam', 'A VAT number is required' );
|
||||||
is( $e, 'A VAT number is required', 'addVATNumber returns correct message for missing VAT number' );
|
is( $e, 'A VAT number is required', 'updateVATNumber returns correct message for missing VAT number' );
|
||||||
|
|
||||||
eval { $taxer->addVATNumber( $testVAT_NL, 'NotAUserObject' ) };
|
eval { $taxer->updateVATNumber( $testVAT_NL, 'NotAUserObject' ) };
|
||||||
$e = Exception::Class->caught();
|
$e = Exception::Class->caught();
|
||||||
isa_ok( $e, 'WebGUI::Error::InvalidParam', 'Second argument must be a user object' );
|
isa_ok( $e, 'WebGUI::Error::InvalidParam', 'Second argument must be a user object' );
|
||||||
is( $e, 'The second argument must be an instanciated WebGUI::User object', 'addVATNumber returns correct message when user object is of wrong type' );
|
is( $e, 'The second argument must be an instanciated WebGUI::User object', 'updateVATNumber returns correct message when user object is of wrong type' );
|
||||||
|
|
||||||
eval { $taxer->addVATNumber( $testVAT_NL, $visitorUser ) };
|
eval { $taxer->updateVATNumber( $testVAT_NL, $visitorUser ) };
|
||||||
$e = Exception::Class->caught();
|
$e = Exception::Class->caught();
|
||||||
isa_ok( $e, 'WebGUI::Error::InvalidParam', 'User may not be visitor' );
|
isa_ok( $e, 'WebGUI::Error::InvalidParam', 'User may not be visitor' );
|
||||||
is( $e, 'Visitor cannot add VAT numbers', 'addVATNumber returns correct message when user is visitor' );
|
is( $e, 'Visitor cannot add VAT numbers', 'updateVATNumber returns correct message when user is visitor' );
|
||||||
|
|
||||||
|
for my $errorCode ( 0 .. 16 ) {
|
||||||
|
$validator->set_always( 'check', 0 );
|
||||||
|
$validator->set_always( 'get_last_error_code', $errorCode );
|
||||||
|
|
||||||
|
is(
|
||||||
|
$taxer->updateVATNumber( $invalidVAT, $taxUser ),
|
||||||
|
'INVALID',
|
||||||
|
"updateVATNumber returns INVALID for error $errorCode",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
for my $errorCode ( 17 .. 255 ) {
|
||||||
|
$validator->set_always( 'check', 0 );
|
||||||
|
$validator->set_always( 'get_last_error_code', $errorCode );
|
||||||
|
|
||||||
|
is(
|
||||||
|
$taxer->updateVATNumber( $invalidVAT, $taxUser ),
|
||||||
|
'UNKNOWN',
|
||||||
|
"updateVATNumber returns UNKNOWN for error $errorCode",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$validator->set_always( 'check', 1 );
|
||||||
|
$validator->set_always( 'get_last_error_code', undef );
|
||||||
|
is(
|
||||||
|
$taxer->updateVATNumber( $testVAT_NL, $taxUser ),
|
||||||
|
'VALID',
|
||||||
|
"updateVATNumber returns VALID for valid numbers",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#######################################################################
|
||||||
|
#
|
||||||
|
# addVATNumber
|
||||||
|
#
|
||||||
|
#######################################################################
|
||||||
|
{
|
||||||
|
my $taxer = WebGUI::Shop::TaxDriver::EU->new($session);
|
||||||
|
|
||||||
|
my $response;
|
||||||
|
local *WebGUI::Shop::TaxDriver::EU::updateVATNumber = sub { return $response };
|
||||||
|
|
||||||
#----- invalid vat number
|
#----- invalid vat number
|
||||||
$validator->set_always( 'check', 0 );
|
$response = 'INVALID';
|
||||||
$validator->set_always( 'get_last_error_code', 1 );
|
is(
|
||||||
my $response = $taxer->addVATNumber( $invalidVAT, $taxUser );
|
$taxer->addVATNumber( $invalidVAT, $taxUser ),
|
||||||
is( $response, 'The entered VAT number is invalid.', 'Invalid VAT numbers return an error message' );
|
'The entered VAT number is invalid.',
|
||||||
|
'addVATNumber returns the correct error message for invalid numbers',
|
||||||
|
);
|
||||||
|
|
||||||
#----- service unavailable
|
#----- service unavailable
|
||||||
$validator->set_always( 'check', 0 );
|
$response = 'UNKNOWN';
|
||||||
$validator->set_always( 'get_last_error_code', 17 );
|
like(
|
||||||
my $response = $taxer->addVATNumber( $noServiceVAT, $taxUser );
|
$taxer->addVATNumber( $noServiceVAT, $taxUser ),
|
||||||
ok( $response =~ m{^Number validation is currently not available.}, 'When VIES is down a message is returned' );
|
qr{^Number validation is currently not available.},
|
||||||
|
'addVATNumber returns the correct message when VIES is unavailable',
|
||||||
|
);
|
||||||
|
|
||||||
my $workflows = WebGUI::Workflow::Instance->getAllInstances( $session );
|
my $workflows = WebGUI::Workflow::Instance->getAllInstances( $session );
|
||||||
my ($workflow) = grep { $_->get('parameters')->{ vatNumber } eq $noServiceVAT } @{ $workflows };
|
my ($workflow) = grep { $_->get('parameters')->{ vatNumber } eq $noServiceVAT } @{ $workflows };
|
||||||
ok( defined $workflow , 'A recheck workflow has been fired' );
|
ok( defined $workflow , 'addVATNumber fires a recheck workflow when VIES is down' );
|
||||||
|
|
||||||
#----- valid number
|
#----- valid number
|
||||||
$validator->set_always( 'check', 1 );
|
$response = 'VALID';
|
||||||
$validator->set_always( 'get_last_error_code', undef );
|
ok(
|
||||||
my $response = $taxer->addVATNumber( $testVAT_NL, $taxUser );
|
!defined $taxer->addVATNumber( $testVAT_NL, $taxUser ),
|
||||||
ok( !defined $response , 'Valid VAT numbers return undef.' );
|
'Valid VAT numbers return undef.',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
# Add another number for later testing purposes.
|
#######################################################################
|
||||||
my $responseBE = $taxer->addVATNumber( $testVAT_BE, $taxUser );
|
#
|
||||||
|
# recheckVATNumber
|
||||||
|
#
|
||||||
|
#######################################################################
|
||||||
|
{
|
||||||
|
my $taxer = WebGUI::Shop::TaxDriver::EU->new($session);
|
||||||
|
|
||||||
|
for my $response ( qw{ INVALID VALID UNKNOWN } ) {
|
||||||
|
local *WebGUI::Shop::TaxDriver::EU::updateVATNumber = sub { return $response };
|
||||||
|
|
||||||
#######################################################################
|
is(
|
||||||
#
|
$taxer->recheckVATNumber( $invalidVAT, $taxUser ),
|
||||||
# getVATNumbers
|
$response,
|
||||||
#
|
"recheckVATNumber returns correct value when updateVATNumber returns $response",
|
||||||
#######################################################################
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#######################################################################
|
||||||
|
#
|
||||||
|
# getVATNumbers / deleteVATNumber
|
||||||
|
#
|
||||||
|
#######################################################################
|
||||||
|
{
|
||||||
|
my $taxer = setupTestNumbers();
|
||||||
|
|
||||||
my $expectNL = {
|
my $expectNL = {
|
||||||
userId => $taxUser->userId,
|
userId => $taxUser->userId,
|
||||||
countryCode => 'NL',
|
countryCode => 'NL',
|
||||||
|
|
@ -196,25 +290,23 @@ SKIP: {
|
||||||
$vatNumbers = $taxer->getVATNumbers( 'BE', $taxUser );
|
$vatNumbers = $taxer->getVATNumbers( 'BE', $taxUser );
|
||||||
cmp_bag( $vatNumbers, [ $expectBE ], 'getVATNumbers filters on country code when one is passed' );
|
cmp_bag( $vatNumbers, [ $expectBE ], 'getVATNumbers filters on country code when one is passed' );
|
||||||
|
|
||||||
#######################################################################
|
|
||||||
#
|
|
||||||
# deleteVATNumber
|
|
||||||
#
|
|
||||||
#######################################################################
|
|
||||||
|
|
||||||
$taxer->deleteVATNumber( $testVAT_BE, $taxUser );
|
$taxer->deleteVATNumber( $testVAT_BE, $taxUser );
|
||||||
$vatNumbers = $taxer->getVATNumbers( undef, $taxUser );
|
$vatNumbers = $taxer->getVATNumbers( undef, $taxUser );
|
||||||
cmp_bag( $vatNumbers, [ $expectNL ], 'deleteVATNumber deletes number' );
|
cmp_bag( $vatNumbers, [ $expectNL ], 'deleteVATNumber deletes number' );
|
||||||
|
|
||||||
$taxer->deleteVATNumber( $testVAT_NL, $taxUser );
|
$taxer->deleteVATNumber( $testVAT_NL, $taxUser );
|
||||||
#######################################################################
|
}
|
||||||
#
|
|
||||||
# addGroupRate
|
#######################################################################
|
||||||
#
|
#
|
||||||
#######################################################################
|
# addGroup / getGroupRate / deleteGroup
|
||||||
|
#
|
||||||
|
#######################################################################
|
||||||
|
{
|
||||||
|
my $taxer = setupTestNumbers();
|
||||||
|
|
||||||
eval { $taxer->addGroup };
|
eval { $taxer->addGroup };
|
||||||
$e = Exception::Class->caught();
|
my $e = Exception::Class->caught();
|
||||||
isa_ok( $e, 'WebGUI::Error::InvalidParam', 'addGroup requires a group name' );
|
isa_ok( $e, 'WebGUI::Error::InvalidParam', 'addGroup requires a group name' );
|
||||||
is( $e, 'A group name is required', 'addGroup returns correct message for omitted group name' );
|
is( $e, 'A group name is required', 'addGroup returns correct message for omitted group name' );
|
||||||
|
|
||||||
|
|
@ -265,51 +357,54 @@ SKIP: {
|
||||||
];
|
];
|
||||||
cmp_bag( $taxGroups, $expectGroups, 'addGroup saves correctly' );
|
cmp_bag( $taxGroups, $expectGroups, 'addGroup saves correctly' );
|
||||||
|
|
||||||
|
|
||||||
#######################################################################
|
|
||||||
#
|
|
||||||
# getGroupRate
|
# getGroupRate
|
||||||
#
|
ok(
|
||||||
#######################################################################
|
$taxer->getGroupRate( $id0 ) == 0
|
||||||
|
&& $taxer->getGroupRate( $id100 ) == 100
|
||||||
ok( $taxer->getGroupRate( $id0 ) == 0
|
&& $taxer->getGroupRate( $id50_5 ) == 50.5,
|
||||||
&& $taxer->getGroupRate( $id100 ) == 100
|
|
||||||
&& $taxer->getGroupRate( $id50_5 ) == 50.5,
|
|
||||||
'getGroup rate gets correct rates'
|
'getGroup rate gets correct rates'
|
||||||
);
|
);
|
||||||
|
|
||||||
|
# deleteGroup
|
||||||
|
eval { $taxer->deleteGroup };
|
||||||
|
my $e = Exception::Class->caught();
|
||||||
|
isa_ok( $e, 'WebGUI::Error::InvalidParam', 'addGroup requires a group id' );
|
||||||
|
is( $e, 'A group id is required', 'addGroup returns correct message for missing group id' );
|
||||||
|
|
||||||
#######################################################################
|
$taxer->deleteGroup( $id50_5 );
|
||||||
#
|
|
||||||
# getTaxRate
|
$taxGroups = $taxer->get( 'taxGroups' );
|
||||||
#
|
cmp_bag( $taxGroups, [
|
||||||
#######################################################################
|
{
|
||||||
|
name => 'Group0',
|
||||||
|
rate => 0,
|
||||||
|
id => $id0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name => 'Group100',
|
||||||
|
rate => 100,
|
||||||
|
id => $id100,
|
||||||
|
},
|
||||||
|
], 'deleteGroup deletes correctly' );
|
||||||
|
|
||||||
|
# Clean up a bit.
|
||||||
|
$taxer->deleteGroup( $_ ) for ( $id0, $id100 );
|
||||||
|
}
|
||||||
|
|
||||||
|
#######################################################################
|
||||||
|
#
|
||||||
|
# getTaxRate
|
||||||
|
#
|
||||||
|
#######################################################################
|
||||||
|
{
|
||||||
|
my $taxer = setupTestNumbers();
|
||||||
|
my $id100 = $taxer->addGroup( 'Group100', 100 );
|
||||||
|
my $id50_5 = $taxer->addGroup( 'Group50.5', 50.5 );
|
||||||
|
|
||||||
$taxer->update( { 'automaticViesApproval' => 1 } );
|
$taxer->update( { 'automaticViesApproval' => 1 } );
|
||||||
my $book = WebGUI::Shop::AddressBook->create($session);
|
|
||||||
|
|
||||||
# setup address in EU but not in residential country of merchant
|
|
||||||
my $beAddress = $book->addAddress({
|
|
||||||
label => 'BE',
|
|
||||||
city => 'Antwerpen',
|
|
||||||
country => 'Belgium',
|
|
||||||
});
|
|
||||||
|
|
||||||
# setup address in residential country of merchant
|
|
||||||
my $nlAddress = $book->addAddress({
|
|
||||||
label => 'NL',
|
|
||||||
city => 'Delft',
|
|
||||||
country => 'Netherlands',
|
|
||||||
});
|
|
||||||
|
|
||||||
# setup address outside EU
|
|
||||||
my $usAddress = $book->addAddress({
|
|
||||||
label => 'outside eu',
|
|
||||||
city => 'New Amsterdam',
|
|
||||||
country => 'US',
|
|
||||||
});
|
|
||||||
|
|
||||||
eval { $taxer->getTaxRate(); };
|
eval { $taxer->getTaxRate(); };
|
||||||
$e = Exception::Class->caught();
|
my $e = Exception::Class->caught();
|
||||||
isa_ok($e, 'WebGUI::Error::InvalidParam', 'getTaxRate: error handling for not sending a sku');
|
isa_ok($e, 'WebGUI::Error::InvalidParam', 'getTaxRate: error handling for not sending a sku');
|
||||||
is($e->error, 'Must pass in a WebGUI::Asset::Sku object', 'getTaxRate: error handling for not sending a sku');
|
is($e->error, 'Must pass in a WebGUI::Asset::Sku object', 'getTaxRate: error handling for not sending a sku');
|
||||||
|
|
||||||
|
|
@ -323,27 +418,31 @@ SKIP: {
|
||||||
$sku->setTaxConfiguration( 'WebGUI::Shop::TaxDriver::EU', { taxGroup => $id100 } );
|
$sku->setTaxConfiguration( 'WebGUI::Shop::TaxDriver::EU', { taxGroup => $id100 } );
|
||||||
is( $taxer->getTaxRate( $sku ), 100, 'getTaxRate returns tax group set by sku when no address is given');
|
is( $taxer->getTaxRate( $sku ), 100, 'getTaxRate returns tax group set by sku when no address is given');
|
||||||
|
|
||||||
# Address outside EU
|
# Addresses inside EU with VAT number
|
||||||
is( $taxer->getTaxRate( $sku, $usAddress ), 0, 'getTaxRate: shipping addresses outside EU are tax exempt' );
|
|
||||||
|
|
||||||
# Addresses inside EU
|
|
||||||
is( $taxer->getTaxRate( $sku, $beAddress ), 100, 'getTaxRate: shipping addresses inside EU w/o VAT number pay tax' );
|
|
||||||
is( $taxer->getTaxRate( $sku, $nlAddress ), 100, 'getTaxRate: shipping addresses in country of merchant w/o VAT number pay tax' );
|
|
||||||
|
|
||||||
# Add VAT numbers
|
|
||||||
$taxer->addVATNumber( $testVAT_NL, $taxUser, 1);
|
|
||||||
$taxer->addVATNumber( $testVAT_BE, $taxUser, 1);
|
|
||||||
|
|
||||||
is( $taxer->getTaxRate( $sku, $beAddress ), 0,
|
is( $taxer->getTaxRate( $sku, $beAddress ), 0,
|
||||||
'getTaxRate: shipping addresses inside EU but other country than merchant w/ VAT number are tax exempt.'
|
'getTaxRate: shipping addresses inside EU but other country than merchant w/ VAT number are tax exempt.'
|
||||||
);
|
);
|
||||||
is( $taxer->getTaxRate( $sku, $nlAddress ), 100, 'getTaxRate: shipping addresses in country of merchant w/ VAT number pay tax' );
|
is( $taxer->getTaxRate( $sku, $nlAddress ), 100, 'getTaxRate: shipping addresses in country of merchant w/ VAT number pay tax' );
|
||||||
|
|
||||||
#######################################################################
|
$taxer->deleteVATNumber( $testVAT_NL, $taxUser );
|
||||||
#
|
$taxer->deleteVATNumber( $testVAT_BE, $taxUser );
|
||||||
# appendCartItemVars
|
|
||||||
#
|
# Addresses inside EU without VAT number
|
||||||
#######################################################################
|
is( $taxer->getTaxRate( $sku, $beAddress ), 100, 'getTaxRate: shipping addresses inside EU w/o VAT number pay tax' );
|
||||||
|
is( $taxer->getTaxRate( $sku, $nlAddress ), 100, 'getTaxRate: shipping addresses in country of merchant w/o VAT number pay tax' );
|
||||||
|
|
||||||
|
# Address outside EU
|
||||||
|
is( $taxer->getTaxRate( $sku, $usAddress ), 0, 'getTaxRate: shipping addresses outside EU are tax exempt' );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#######################################################################
|
||||||
|
#
|
||||||
|
# appendCartItemVars
|
||||||
|
#
|
||||||
|
#######################################################################
|
||||||
|
{
|
||||||
|
my $taxer = setupTestNumbers();
|
||||||
|
|
||||||
eval { $taxer->appendCartItemVars };
|
eval { $taxer->appendCartItemVars };
|
||||||
my $e = Exception::Class->caught();
|
my $e = Exception::Class->caught();
|
||||||
|
|
@ -399,12 +498,16 @@ SKIP: {
|
||||||
taxAmount => '0.00',
|
taxAmount => '0.00',
|
||||||
must => 'be kept',
|
must => 'be kept',
|
||||||
}, 'appendCartItemVars returns correct data for address outside EU.' );
|
}, 'appendCartItemVars returns correct data for address outside EU.' );
|
||||||
|
}
|
||||||
|
|
||||||
#######################################################################
|
#######################################################################
|
||||||
#
|
#
|
||||||
# getTransactionTaxData
|
# getTransactionTaxData
|
||||||
#
|
#
|
||||||
#######################################################################
|
#######################################################################
|
||||||
|
{
|
||||||
|
my $taxer = setupTestNumbers();
|
||||||
|
$taxer->update( { 'automaticViesApproval' => 1 } );
|
||||||
|
|
||||||
my $details = $taxer->getTransactionTaxData( $sku, $usAddress );
|
my $details = $taxer->getTransactionTaxData( $sku, $usAddress );
|
||||||
cmp_deeply( $details, {
|
cmp_deeply( $details, {
|
||||||
|
|
@ -433,35 +536,25 @@ SKIP: {
|
||||||
className => 'WebGUI::Shop::TaxDriver::EU',
|
className => 'WebGUI::Shop::TaxDriver::EU',
|
||||||
useVATNumber => 0,
|
useVATNumber => 0,
|
||||||
}, 'getTransactionTaxData returns correct hashref for addresses in EU w/o VAT number' );
|
}, 'getTransactionTaxData returns correct hashref for addresses in EU w/o VAT number' );
|
||||||
|
|
||||||
#######################################################################
|
|
||||||
#
|
|
||||||
# deleteGroup
|
|
||||||
#
|
|
||||||
#######################################################################
|
|
||||||
|
|
||||||
eval { $taxer->deleteGroup };
|
|
||||||
$e = Exception::Class->caught();
|
|
||||||
isa_ok( $e, 'WebGUI::Error::InvalidParam', 'addGroup requires a group id' );
|
|
||||||
is( $e, 'A group id is required', 'addGroup returns correct message for missing group id' );
|
|
||||||
|
|
||||||
$taxer->deleteGroup( $id50_5 );
|
|
||||||
|
|
||||||
$taxGroups = $taxer->get( 'taxGroups' );
|
|
||||||
cmp_bag( $taxGroups, [
|
|
||||||
{
|
|
||||||
name => 'Group0',
|
|
||||||
rate => 0,
|
|
||||||
id => $id0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name => 'Group100',
|
|
||||||
rate => 100,
|
|
||||||
id => $id100,
|
|
||||||
},
|
|
||||||
], 'deleteGroup deletes correctly' );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} #SKIP BLOCK
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
sub setupTestNumbers {
|
||||||
|
my $taxer = WebGUI::Shop::TaxDriver::EU->new($session);
|
||||||
|
|
||||||
|
$session->db->write('delete from taxDriver where className=?', [ 'WebGUI::Shop::TaxDriver::EU' ]);
|
||||||
|
$session->db->write('delete from tax_eu_vatNumbers');
|
||||||
|
|
||||||
|
$taxer->addVATNumber( $testVAT_NL, $taxUser, 1);
|
||||||
|
$taxer->addVATNumber( $testVAT_BE, $taxUser, 1);
|
||||||
|
|
||||||
|
return $taxer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
# Cleanup
|
# Cleanup
|
||||||
END {
|
END {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue