Internal metadata in cart items + smart matching for items.

This commit is contained in:
Juerd Waalboer 2013-02-28 01:16:37 +01:00
parent c1db0fc1e9
commit 788dc3dc12
2 changed files with 12 additions and 7 deletions

View file

@ -14,9 +14,11 @@ sub new {
} }
sub add { sub add {
my ($self, $user, $amount, $description) = @_; my ($self, $user, $amount, $description, $data) = @_;
$user ||= '$you'; $user ||= '$you';
$data ||= {};
push @{ $self->{ $user } }, { push @{ $self->{ $user } }, {
%$data, # Internal stuff, not logged or printed.
amount => $amount, amount => $amount,
description => $description, description => $description,
}; };
@ -104,14 +106,17 @@ sub checkout {
} }
sub select_items { sub select_items {
my ($self, $regex) = @_; my ($self, $key, $smartmatch) = @_;
$regex ||= qr/(?:)/; # Match everything if no regex is given
use v5.12; # New smartmatch semantics
my $match_all = (@_ == 1); # Match everything if no key/match is given.
my @matches; my @matches;
for my $user (keys %$self) { for my $user (keys %$self) {
for my $item (@{ $self->{$user} }) { for my $item (@{ $self->{$user} }) {
push @matches, { user => $user, %$item } push @matches, { user => $user, %$item }
if $item->{description} =~ /$regex/; if $match_all or $item->{ $key } ~~ $smartmatch;
} }
} }

View file

@ -11,7 +11,7 @@ sub command :Tab(deposit) {
return "Amount to deposit into your account", \&amount; return "Amount to deposit into your account", \&amount;
} }
if ($cart->select_items(qr/^Deposit$/)) { if ($cart->select_items(is_deposit => 1)) {
# No other plugin recognised the input, so it must be a new user. # No other plugin recognised the input, so it must be a new user.
$self->{new_user} = $command; $self->{new_user} = $command;
return "Add new account for user '$command'?", \&create; return "Add new account for user '$command'?", \&create;
@ -26,7 +26,7 @@ sub amount {
$amount = parse_amount($amount) $amount = parse_amount($amount)
or return REJECT, "Invalid amount"; or return REJECT, "Invalid amount";
$cart->add(undef, +$amount, "Deposit"); $cart->add(undef, +$amount, "Deposit", { is_deposit => 1 });
return ACCEPT; return ACCEPT;
} }
@ -46,7 +46,7 @@ sub create {
sub hook_checkout { sub hook_checkout {
my ($class, $cart, $user, $transaction_id) = @_; my ($class, $cart, $user, $transaction_id) = @_;
my $sum; my $sum;
$sum += $_->{amount} for $cart->select_items(qr/^Deposit$/); $sum += $_->{amount} for $cart->select_items(is_deposit => 1);
say sprintf "Don't forget to add EUR %.2f to the cash box!", $sum if $sum; say sprintf "Don't forget to add EUR %.2f to the cash box!", $sum if $sum;
} }