
Since that logic was factored into its own sub and is basically the same as what was used here, let's use it here too. This is still somewhat duplicated functionality from products::command. Should adding addons be done in _read_products instead?
136 lines
3.8 KiB
Perl
136 lines
3.8 KiB
Perl
#!perl
|
|
use List::Util;
|
|
|
|
# This plugin is intended for use on a separate terminal.
|
|
# Run revbank with REVBANK_STATIEGELD=1 on the bottle deposit terminal.
|
|
#
|
|
# In revbank.products, add the bottle/can deposit to products:
|
|
#
|
|
# clubmate 1.40 Club-Mate bottle +sb
|
|
# cola 0.90 Cola can +sc
|
|
# +sb 0.15@+statiegeld Bottle deposit
|
|
# +sc 0.25@+statiegeld Can deposit
|
|
#
|
|
# This plugin is called "statiegeld" to prevent confusion with the existing
|
|
# plugin "deposit":
|
|
# geld storten = deposit
|
|
# statiegeld = deposit
|
|
# (Note that the Dutch term "statiegeld" should only be displayed if you
|
|
# choose to use it in the product descriptions.)
|
|
|
|
our @addon_accounts = ("+statiegeld");
|
|
my $nope = "Sorry, no deposit on that product.\n";
|
|
|
|
our $S = ($ENV{REVBANK_STATIEGELD} // 0) == 1;
|
|
|
|
sub statiegeld_product($product_id, $products = undef) {
|
|
$products ||= RevBank::Plugin::products::_read_products();
|
|
|
|
my $product = $products->{$product_id} or return;
|
|
|
|
my @addons = @{ $product->{addons} };
|
|
my @relevant_addons;
|
|
|
|
while (my $product_id = shift @addons) {
|
|
my $addon = $products->{"+$product_id"} // $products->{$product_id};
|
|
|
|
push @relevant_addons, $addon
|
|
if !$addon->{percent}
|
|
and (List::Util::any { $addon->{contra} eq $_ } @addon_accounts)
|
|
and $addon->{price} > 0;
|
|
|
|
push @addons, @{ $addon->{addons} };
|
|
};
|
|
|
|
return 0 if not @relevant_addons;
|
|
return { product => $product, statiegeld_addons => \@relevant_addons };
|
|
}
|
|
|
|
sub hook_deposit_command($class, $prompt, $array, @) {
|
|
$$prompt =~ s/$/, or scan empty container/;
|
|
|
|
push @$array, sub($, $cart, $input, @) {
|
|
my $p = statiegeld_product($input) // return NEXT;
|
|
|
|
if (not $p) {
|
|
print $nope;
|
|
return NEXT;
|
|
}
|
|
|
|
local $S = 1;
|
|
return command($class, $cart, $input);
|
|
};
|
|
}
|
|
|
|
sub command ($invocant, $cart, $command, @) {
|
|
$S or return NEXT;
|
|
|
|
defined &RevBank::Plugin::products::_read_products
|
|
or die "statiegeld plugin requires products plugin";
|
|
|
|
my $sg = statiegeld_product($command) // return NEXT;
|
|
|
|
if (not $sg) {
|
|
print $nope;
|
|
return ACCEPT;
|
|
}
|
|
|
|
my $product = $sg->{product};
|
|
my $addons = $sg->{statiegeld_addons};
|
|
|
|
for my $addon (@$addons) {
|
|
my $d = "$addon->{description} ($product->{description})";
|
|
|
|
$cart
|
|
->add(+$addon->{price}, $d, { plugin => $invocant->id, addon_id => $addon->{id} })
|
|
->add_contra($addon->{contra}, -$addon->{price}, "$d for \$you");
|
|
}
|
|
|
|
return ACCEPT;
|
|
}
|
|
|
|
sub hook_added_entry ($class, $cart, $entry, @) {
|
|
$S or return;
|
|
$entry->has_attribute('plugin') or return;
|
|
|
|
if ($entry->attribute('plugin') eq 'market') {
|
|
print $nope;
|
|
$cart->delete($entry);
|
|
}
|
|
if ($entry->attribute('plugin') eq 'products') {
|
|
my $id = $class->id;
|
|
die "Configuration error: the '$id' plugin must be *before* the 'products' plugin in revbank.plugins.\n";
|
|
}
|
|
}
|
|
|
|
sub hook_prompt($class, $cart, $prompt, @) {
|
|
$S or return;
|
|
|
|
# Assumption: only the main prompt will have fewer than 3 \w characters
|
|
print "++ Scan product for deposit return ++\n" if $prompt !~ /\w{3,}/;
|
|
}
|
|
|
|
sub hook_input($class, $cart, $input, $split_input, @) {
|
|
$S or return;
|
|
|
|
# Hijack 'help' command so it never reaches the 'help' plugin.
|
|
|
|
if ($split_input and $input eq "help") {
|
|
print <<"END";
|
|
|
|
This is a beverage container (e.g. bottle) deposit return terminal to get your
|
|
money back; please use the other RevBank terminal for buying things and to read
|
|
the regular RevBank help text. (Normal RevBank commands are available.)
|
|
|
|
\e[1mJust scan the products and type your account name.\e[0m; deposits are only refunded
|
|
for container deposits on products that we have sold to you.
|
|
END
|
|
|
|
no warnings qw(exiting);
|
|
# "Exiting subroutine via %s"
|
|
# "(W exiting) You are exiting a subroutine by unconventional means,
|
|
# such as a goto, or a loop control statement."
|
|
|
|
redo OUTER; # this is phenominally vile :)
|
|
}
|
|
}
|