From ccae71021a1b4d657c47fbee01f922d15ead00a2 Mon Sep 17 00:00:00 2001 From: Juerd Waalboer Date: Sat, 11 Jun 2022 16:58:20 +0200 Subject: [PATCH] Get 'cash' working again Now implemented via a hidden user called '-cash'. This also introduces the concept of hidden accounts, that begin with '+' or '-', for result accounts and balance accounts. Future versions can further use this for more detailed bookkeeping. The idea behind the sign is that '-' accounts should be inverted to get the intuitive value. So if the account '-cash' has -13.37, that means there should be +13.37 in the cash box (or, well, once the rest of this is implemented and the initial values are then set correctly.) --- lib/RevBank/Cart.pm | 7 +++++++ lib/RevBank/Messages.pm | 6 ++++++ lib/RevBank/Users.pm | 9 +++++++-- plugins/adduser | 3 +++ plugins/stock | 3 +-- revbank.accounts | 3 +++ 6 files changed, 27 insertions(+), 4 deletions(-) diff --git a/lib/RevBank/Cart.pm b/lib/RevBank/Cart.pm index 817bbf0..2ff8d9e 100644 --- a/lib/RevBank/Cart.pm +++ b/lib/RevBank/Cart.pm @@ -8,6 +8,7 @@ no warnings qw(experimental::signatures); use Carp (); use List::Util (); use RevBank::Global; +use RevBank::Users; use RevBank::Cart::Entry; sub new($class) { @@ -65,6 +66,12 @@ sub checkout($self, $user) { return; } + if ($user =~ /^[-+]/) { + # Hidden internal accounts + my $canonical = RevBank::Users::parse_user($user); + $user = $canonical // RevBank::Users::create($user); + } + my $entries = $self->{entries}; my %deltas; diff --git a/lib/RevBank/Messages.pm b/lib/RevBank/Messages.pm index 5f2c692..af39c49 100644 --- a/lib/RevBank/Messages.pm +++ b/lib/RevBank/Messages.pm @@ -13,8 +13,10 @@ use base 'RevBank::Plugin'; BEGIN { RevBank::Plugins::register("RevBank::Messages"); + *hidden = \&RevBank::Users::is_hidden; } + sub command { return NEXT; } sub id { 'built in messages' } @@ -53,6 +55,8 @@ sub hook_reject($class, $plugin, $reason, $abort, @) { } sub hook_user_balance($class, $username, $old, $delta, $new, @) { + return if hidden $username; + my $sign = $delta->cents >= 0 ? '+' : '-'; my $rood = $new->cents < 0 ? '31;' : ''; my $abs = $delta->abs; @@ -63,6 +67,8 @@ sub hook_user_balance($class, $username, $old, $delta, $new, @) { } sub hook_user_created($class, $username, @) { + return if hidden $username; + say "New account '$username' created."; } diff --git a/lib/RevBank/Users.pm b/lib/RevBank/Users.pm index eb33f80..35fe23b 100644 --- a/lib/RevBank/Users.pm +++ b/lib/RevBank/Users.pm @@ -36,13 +36,14 @@ sub create($username) { print {$fh} "$username 0.00 $now\n" or die $!; close $fh or die $!; RevBank::Plugins::call_hooks("user_created", $username); + return $username; } sub update($username, $delta, $transaction_id) { open my $in, 'revbank.accounts' or die $!; open my $out, ">.revbank.$$" or die $!; - my $old; - my $new; + my $old = RevBank::Amount->new(0); + my $new = RevBank::Amount->new(0); while (defined (my $line = readline $in)) { my @a = split " ", $line; if (lc $a[0] eq lc $username) { @@ -82,6 +83,10 @@ sub parse_user($username) { return $users->{ lc $username }->[0]; } +sub is_hidden($username) { + return $username =~ /^[-+]/; +} + 1; diff --git a/plugins/adduser b/plugins/adduser index 2a5a592..52234de 100644 --- a/plugins/adduser +++ b/plugins/adduser @@ -16,6 +16,9 @@ sub username($self, $cart, $name, @) { return REJECT, "Sorry, whitespace is not allowed." if $name =~ /\s/; + return REJECT, "Sorry, invalid first character." + if $name =~ /^[-+*]/; + return REJECT, "That's too numeric to be a user name." if defined parse_amount($name); diff --git a/plugins/stock b/plugins/stock index 53c7f15..9f2b5f3 100644 --- a/plugins/stock +++ b/plugins/stock @@ -5,8 +5,7 @@ HELP1 "cash" => "Checkout without a user account"; sub command :Tab(cash) ($self, $cart, $command, @) { return NEXT if $command ne 'cash'; - call_hooks("checkout", $cart, 'cash', 0); # Fake checkout - $cart->empty; + $cart->checkout('-cash'); return ACCEPT; } diff --git a/revbank.accounts b/revbank.accounts index 7b3c499..5f92fc7 100644 --- a/revbank.accounts +++ b/revbank.accounts @@ -1,2 +1,5 @@ juerd +163.48 2022-06-04_02:19:56 +@2021-12-03_18:27:54 bla -36.00 2022-01-19_17:11:25 -@2022-01-19_17:00:43 + 0.00 2022-06-11_16:47:33 +fooooo 0.00 2022-06-11_16:52:48 +-cash -0.50 2022-06-11_16:56:36 -@2022-06-11_16:56:36