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 )