Cleanup previous attempt at insurance. Begin new attempt.
Add a field to the driver where the user can enter in insurance data with i18n. Add a method to calculate the cost of insurance for all packages.
This commit is contained in:
parent
2b4bfb8eec
commit
e81ec9718c
3 changed files with 50 additions and 59 deletions
|
|
@ -93,9 +93,6 @@ sub buildXML {
|
||||||
}
|
}
|
||||||
$packageData{Size} = [ 'REGULAR' ];
|
$packageData{Size} = [ 'REGULAR' ];
|
||||||
$packageData{Machinable} = [ 'true' ];
|
$packageData{Machinable} = [ 'true' ];
|
||||||
if ($self->get('addInsurance')) {
|
|
||||||
$packageData{ValueOfContents} = $cost;
|
|
||||||
}
|
|
||||||
push @{ $xmlTop->{Package} }, \%packageData;
|
push @{ $xmlTop->{Package} }, \%packageData;
|
||||||
}
|
}
|
||||||
my $xml = XMLout(\%xmlHash,
|
my $xml = XMLout(\%xmlHash,
|
||||||
|
|
@ -158,6 +155,7 @@ sub calculate {
|
||||||
}
|
}
|
||||||
##Summarize costs from returned data
|
##Summarize costs from returned data
|
||||||
$cost = $self->_calculateFromXML($xmlData, @shippableUnits);
|
$cost = $self->_calculateFromXML($xmlData, @shippableUnits);
|
||||||
|
$cost += $self->_calculateInsurance(@shippableUnits);
|
||||||
return $cost;
|
return $cost;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -215,6 +213,29 @@ sub _calculateFromXML {
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
#-------------------------------------------------------------------
|
||||||
|
|
||||||
|
=head2 _calculateInsurance ( @shippableUnits )
|
||||||
|
|
||||||
|
Takes data from the USPS and returns the calculated shipping price.
|
||||||
|
|
||||||
|
=head3 @shippableUnits
|
||||||
|
|
||||||
|
The set of shippable units, which are required to do quantity and cost lookups.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub _calculateInsurance {
|
||||||
|
my ($self, @shippableUnits) = @_;
|
||||||
|
my $cost = 0;
|
||||||
|
return $cost unless $self-get('addInsurance') && $self->get('insuranceRates');
|
||||||
|
my @insuranceTable = map { my ($cost,$value) = split /:/, $_; [$cost, $value]; }
|
||||||
|
split /\r?\n/, $self->get('insuranceRates');
|
||||||
|
##Sort by increasing value for easy post processing
|
||||||
|
my @insuranceTable = map { $_->[1] } sort { $a <=> $b } map { [ $_->[0], $_ ] } @insuranceTable;
|
||||||
|
return $cost;
|
||||||
|
}
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------
|
||||||
|
|
||||||
=head2 definition ( $session )
|
=head2 definition ( $session )
|
||||||
|
|
||||||
This subroutine returns an arrayref of hashrefs, used to validate data put into
|
This subroutine returns an arrayref of hashrefs, used to validate data put into
|
||||||
|
|
@ -275,6 +296,12 @@ sub definition {
|
||||||
hoverHelp => $i18n->get('add insurance help'),
|
hoverHelp => $i18n->get('add insurance help'),
|
||||||
defaultValue => 0,
|
defaultValue => 0,
|
||||||
},
|
},
|
||||||
|
insuranceRates => {
|
||||||
|
fieldType => 'textarea',
|
||||||
|
label => $i18n->get('insurance rates'),
|
||||||
|
hoverHelp => $i18n->get('insurance rates help'),
|
||||||
|
defaultValue => "50:1.75\n100:2.25",
|
||||||
|
},
|
||||||
##Note, if a flat fee is added to this driver, then according to the license
|
##Note, if a flat fee is added to this driver, then according to the license
|
||||||
##terms the website must display a note to the user (shop customer) that additional
|
##terms the website must display a note to the user (shop customer) that additional
|
||||||
##fees have been added.
|
##fees have been added.
|
||||||
|
|
|
||||||
|
|
@ -97,7 +97,7 @@ our $I18N = {
|
||||||
'add insurance' => {
|
'add insurance' => {
|
||||||
message => q|Ship with insurance?|,
|
message => q|Ship with insurance?|,
|
||||||
lastUpdated => 1253988886,
|
lastUpdated => 1253988886,
|
||||||
context => q|Label for a type of shipping from the USPS.|,
|
context => q|Label for the edit screen.|,
|
||||||
},
|
},
|
||||||
|
|
||||||
'add insurance help' => {
|
'add insurance help' => {
|
||||||
|
|
@ -106,6 +106,18 @@ our $I18N = {
|
||||||
context => q|Label for a type of shipping from the USPS.|,
|
context => q|Label for a type of shipping from the USPS.|,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
'insurance rates' => {
|
||||||
|
message => q|Insurance Rate Table|,
|
||||||
|
lastUpdated => 1253988886,
|
||||||
|
context => q|Label for the edit screen.|,
|
||||||
|
},
|
||||||
|
|
||||||
|
'insurance rates help' => {
|
||||||
|
message => q|Enter in one field per line with the format, value:cost.<br />value is the value of the contents.<br />cost is the cost of insurance at that value.|,
|
||||||
|
lastUpdated => 1253988884,
|
||||||
|
context => q|Help for the insurance rate field.|,
|
||||||
|
},
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
|
||||||
|
|
@ -757,63 +757,15 @@ SKIP: {
|
||||||
|
|
||||||
$properties = $driver->get();
|
$properties = $driver->get();
|
||||||
$properties->{addInsurance} = 1;
|
$properties->{addInsurance} = 1;
|
||||||
|
$properties->{insuranceTable} = <<EOTABLE;
|
||||||
|
5:1.00
|
||||||
|
10:2.00
|
||||||
|
15:3.00
|
||||||
|
20:4.00
|
||||||
|
25:50.00
|
||||||
|
EOTABLE
|
||||||
$driver->update($properties);
|
$driver->update($properties);
|
||||||
|
|
||||||
$xml = $driver->buildXML($cart, @shippableUnits);
|
|
||||||
my $xmlData = XMLin($xml,
|
|
||||||
KeepRoot => 1,
|
|
||||||
ForceArray => ['Package'],
|
|
||||||
);
|
|
||||||
cmp_deeply(
|
|
||||||
$xmlData,
|
|
||||||
{
|
|
||||||
RateV3Request => {
|
|
||||||
USERID => $userId,
|
|
||||||
Package => [
|
|
||||||
{
|
|
||||||
ID => 0,
|
|
||||||
ZipDestination => '53715', ZipOrigination => '97123',
|
|
||||||
Pounds => '1', Ounces => '8',
|
|
||||||
Size => 'REGULAR', Service => 'PRIORITY',
|
|
||||||
Machinable => 'true', ValueOfContents => 7.50,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}
|
|
||||||
},
|
|
||||||
'buildXML: contains ValueOfContents when insurance is requested'
|
|
||||||
);
|
|
||||||
like($xml, qr/RateV3Request USERID.+?Package ID=.+?Service.+?ZipOrigination.+?ZipDestination.+?Pounds.+?Ounces.+?Size.+?Machinable/, '... and tag order');
|
|
||||||
|
|
||||||
SKIP: {
|
|
||||||
|
|
||||||
skip 'No userId for testing', 2 unless $hasRealUserId;
|
|
||||||
|
|
||||||
my $response = $driver->_doXmlRequest($xml);
|
|
||||||
ok($response->is_success, '... _doXmlRequest to USPS successful');
|
|
||||||
my $xmlData = XMLin($response->content, ForceArray => [qw/Package/],);
|
|
||||||
diag $response->content;
|
|
||||||
# cmp_deeply(
|
|
||||||
# $xmlData,
|
|
||||||
# {
|
|
||||||
# Package => [
|
|
||||||
# {
|
|
||||||
# ID => 0,
|
|
||||||
# ZipOrigination => ignore(), ZipDestination => ignore(),
|
|
||||||
# Ounces => ignore(), Pounds => ignore(),
|
|
||||||
# Size => ignore(), Zone => ignore(),
|
|
||||||
# Postage => {
|
|
||||||
# CLASSID => ignore(),
|
|
||||||
# MailService => ignore(),
|
|
||||||
# Rate => num(8,8), ##A number around 10...
|
|
||||||
# }
|
|
||||||
# },
|
|
||||||
# ],
|
|
||||||
# },
|
|
||||||
# '... returned data from USPS in correct format. If this test fails, the driver may need to be updated'
|
|
||||||
# );
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
# Cleanup
|
# Cleanup
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue