Basket-Calc
view release on metacpan or search on metacpan
lib/Basket/Calc.pm view on Meta::CPAN
package Basket::Calc;
use 5.010001;
use Mouse;
use experimental 'smartmatch';
# ABSTRACT: Basket/Cart calculation library with support for currency conversion, discounts and tax
our $VERSION = '0.5'; # VERSION
use Scalar::Util qw(looks_like_number);
use Finance::Currency::Convert::Yahoo;
use Carp;
has 'debug' => (
is => 'rw',
isa => 'Bool',
trigger => \&_set_debug,
lazy => 1,
default => sub { 0 },
lib/Basket/Calc.pm view on Meta::CPAN
return;
}
foreach my $key ('price') {
unless (exists $item->{$key} and $item->{$key}) {
carp "$key missing";
return;
}
}
unless (looks_like_number($item->{price})) {
carp "'price' is not a number";
return;
}
# calculate amount from quantity and price
if (exists $item->{quantity}) {
if (!looks_like_number($item->{quantity}) || ($item->{quantity} < 0)) {
carp "'quantity' is not a number or smaller than 0";
return;
}
$item->{amount} = $item->{price} * $item->{quantity};
}
else {
$item->{amount} = $item->{price};
$item->{quantity} = 1;
}
lib/Basket/Calc.pm view on Meta::CPAN
carp "'$key' missing";
return;
}
}
unless ($discount->{type} =~ m/^(percent|amount)$/x) {
carp "'type' has to be either percent, or amount";
return;
}
unless (looks_like_number($discount->{value})) {
carp "'value' is not a number";
return;
}
given ($discount->{type}) {
when ('percent') {
if ($discount->{value} <= 0 or $discount->{value} > 1) {
carp "'percent' has to be a decimal between 0 and 1";
return;
}
t/01-example.t view on Meta::CPAN
#!perl
use Test::More tests => 14;
BEGIN { use_ok('Basket::Calc'); }
use Basket::Calc;
use Scalar::Util qw(looks_like_number);
my $result;
# new instance tests
my $basket = Basket::Calc->new(currency => 'NZD', tax => .15);
isa_ok($basket, 'Basket::Calc');
ok($basket->tax == .15, 'tax rate set');
ok($basket->currency eq 'NZD', 'base currency set');
# add items in base currency
t/01-example.t view on Meta::CPAN
discount => 15,
},
'calculate totals (fixed amount discount)',
);
# add foreign currency items
$result = $basket->add_item({ price => 59, currency => 'EUR' });
ok(
$result->{quantity} == 1
&& $result->{price} == 59
&& looks_like_number($result->{amount})
&& $result->{orig_amount} == 59
&& $result->{currency} eq 'NZD'
&& $result->{orig_currency} eq 'EUR',
'add non-base currency item',
);
$result =
$basket->add_item({ price => 14.90, currency => 'USD', quantity => 2 });
ok(
$result->{quantity} == 2
&& $result->{price} == 14.90
&& looks_like_number($result->{amount})
&& $result->{orig_amount} == 29.80
&& $result->{currency} eq 'NZD'
&& $result->{orig_currency} eq 'USD',
'add non-base currency item with quantity',
);
( run in 0.420 second using v1.01-cache-2.11-cpan-607d282f910 )