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:
Colin Kuskie 2009-09-29 19:28:07 -07:00
parent 2b4bfb8eec
commit e81ec9718c
3 changed files with 50 additions and 59 deletions

View file

@ -93,9 +93,6 @@ sub buildXML {
}
$packageData{Size} = [ 'REGULAR' ];
$packageData{Machinable} = [ 'true' ];
if ($self->get('addInsurance')) {
$packageData{ValueOfContents} = $cost;
}
push @{ $xmlTop->{Package} }, \%packageData;
}
my $xml = XMLout(\%xmlHash,
@ -158,6 +155,7 @@ sub calculate {
}
##Summarize costs from returned data
$cost = $self->_calculateFromXML($xmlData, @shippableUnits);
$cost += $self->_calculateInsurance(@shippableUnits);
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 )
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'),
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
##terms the website must display a note to the user (shop customer) that additional
##fees have been added.

View file

@ -97,7 +97,7 @@ our $I18N = {
'add insurance' => {
message => q|Ship with insurance?|,
lastUpdated => 1253988886,
context => q|Label for a type of shipping from the USPS.|,
context => q|Label for the edit screen.|,
},
'add insurance help' => {
@ -106,6 +106,18 @@ our $I18N = {
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;

View file

@ -757,63 +757,15 @@ SKIP: {
$properties = $driver->get();
$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);
$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