revbank/plugins/deposit
Juerd Waalboer 5c16008038 Deposit method instructions are now part of the prompt
This hides the instructions if the answer is already given in the input line.
2018-07-22 23:08:49 +02:00

87 lines
2.1 KiB
Perl
Executable file

#!perl
# This plugin must at the end in the plugins file.
HELP "deposit <amount>" => "[Create and] deposit into an account";
sub command :Tab(deposit) {
my ($self, $cart, $command) = @_;
if ($command eq 'deposit') {
return "Amount to deposit into your account", \&amount;
}
if ($cart->select_items('is_deposit')) {
# No other plugin recognised the input, so it must be a new user.
$self->{new_user} = $command;
return "Add new account for user '$command'?", \&create;
}
return NEXT;
}
sub amount :Tab(13.37,42) {
my ($self, $cart, $amount) = @_;
$self->{amount} = parse_amount($amount)
or return REJECT, "Invalid amount";
call_hooks("deposit_methods", \my $message, $self->{deposit_methods} = {});
return $message . "How are we receiving this EUR $amount?", \&how
if keys %{ $self->{deposit_methods} };
$cart->add(undef, +$self->{amount}, "Deposit", { is_deposit => 1 });
return ACCEPT;
}
sub how :Tab(&how_tab) {
my ($self, $cart, $input) = @_;
my %methods = %{ $self->{deposit_methods} };
my $how = $self->{how} = $methods{$input}
or return REJECT, "'$input' is not a valid answer.";
if (@{ $how->{prompts} // [] }) {
return shift @{ $how->{prompts} }, \&how_prompt;
}
$cart->add(undef, +$self->{amount}, $how->{description}, { is_deposit => 1 });
return ACCEPT;
}
sub how_tab {
my ($self) = @_;
return keys %{ $self->{deposit_methods} };
}
sub how_prompt {
my ($self, $cart, $input) = @_;
my $how = $self->{how};
push @{ $how->{answers} }, $input;
if (@{ $how->{prompts} }) {
return shift @{ $how->{prompts} }, \&how_prompt;
}
my $desc = sprintf $how->{description}, @{ $how->{answers} };
$cart->add(undef, +$self->{amount}, $desc, { is_deposit => 1 });
return ACCEPT;
}
sub create :Tab(yes,no) {
my ($self, $cart, $yesno) = @_;
my $user = $self->{new_user};
if ($yesno eq "y" or $yesno eq "yes") {
RevBank::Users::create( $user );
$cart->checkout( $user );
return ACCEPT;
}
return ABORT;
}