Browse Source

+ needs_input (не отлажено)

Yuriy Zhilovets 5 months ago
parent
commit
9b4b3ab382
2 changed files with 139 additions and 53 deletions
  1. 109 3
      modules/commands.pm
  2. 30 50
      modules/rules.pm

+ 109 - 3
modules/commands.pm

@@ -89,7 +89,7 @@ async sub command_info
   my $uid = $fsa->note("uid");
   my $uid = $fsa->note("uid");
   my $client = await $abon_client->get_p($info, "client", "/client/$uid");
   my $client = await $abon_client->get_p($info, "client", "/client/$uid");
   reply($info, 
   reply($info, 
-    sprintf("<u>%s</u>: %d", _("Лицевой счет"), $client->{uid}),
+    sprintf("<u>%s</u>: %d", _("Номер учетной записи"), $client->{uid}),
     sprintf("<u>%s</u>: %s", _("Логин"), $client->{login}),
     sprintf("<u>%s</u>: %s", _("Логин"), $client->{login}),
     sprintf("<u>%s</u>: %s", _("ФИО"), $client->{fio}),
     sprintf("<u>%s</u>: %s", _("ФИО"), $client->{fio}),
     sprintf("<u>%s</u>: %s", _("Адрес"), $client->{address}),
     sprintf("<u>%s</u>: %s", _("Адрес"), $client->{address}),
@@ -147,14 +147,94 @@ async sub command_service
   reply($info, @list);
   reply($info, @list);
 };
 };
 
 
+######################################
+
 async sub command_transfer
 async sub command_transfer
 {
 {
   my ($fsa, $info) = @_;
   my ($fsa, $info) = @_;
-  reply($info, _("Введите лицевой счет пользователя, которому вы хотите перевести деньги со своего счета"));
+  reply($info, _("Введите номер личного счета пользователя, которому вы хотите перевести деньги со своего собственного счета"));
   
   
   $fsa->delete_note("xfer_to");
   $fsa->delete_note("xfer_to");
   $fsa->delete_note("xfer_amount");
   $fsa->delete_note("xfer_amount");
-  $fsa->state("xfer_needs_uid");
+  $fsa->delete_note("xfer_fio");
+  
+  return needs_input(
+    fsa => $fsa,
+    name => "xfer_to",
+    item => _("номер личного счета"),
+    process => _("перевод денег"),
+  );
+}
+
+async sub verify_xfer_to
+{
+  my ($fsa, $target_uid, $info) = @_;
+  my $uid = $fsa->note("uid");
+     
+  return _("Номер личного счета должен состоять из цифр") unless $target_uid =~ /^\d+$/;
+  return _("Нельзя перевести деньги себе самому") if $uid==$target_uid;
+     
+  my $res = await $abon_client->get_p($info, "client", "/client/$target_uid");
+  return _("Абонент") . " $target_uid " . _("отключен") if $res->{disabled};
+  
+  $fsa->note(xfer_fio => $res->{fio});
+  return undef;
+}
+
+async sub use_xfer_to
+{
+  my ($fsa, $target_uid, $info) = @_;
+  my $uid = $fsa->note("uid");
+     
+  my $nick = $fsa->note("xfer_fio");
+  my @fio = split(/\s+/, $nick);
+  if (@fio)
+  {
+    my $f = shift(@fio);
+    $nick = join(" ", (substr($f, 0, 1) . ".", @fio));
+  }
+     
+  reply(
+    $info, _("Получатель денег: ") .  $nick,
+    _("Теперь введите сумму, которую хотите перевести"),
+  );
+
+  return needs_input(
+    fsa => $fsa,
+    name => "xfer_amount",
+    item => _("сумму"),
+    process => _("перевод денег"),
+  );     
+} 
+
+sub verify_xfer_amount
+{
+  my ($fsa, $amount, $info) = @_;
+  my $uid = $fsa->note("uid");
+     
+  $amount =~ s/,/./g;
+  $amount =~ s/[^\d\.]//g;
+  my $tmp = $amount;
+  my $count = $amount =~ tr/.//;
+     
+  return _("Вы ввели неправильную сумму") if !$amount || $count>1;
+}
+
+async sub use_xfer_amount
+{
+  my ($fsa, $amount, $info) = @_;
+  my $uid = $fsa->note("uid");
+  my $to_uid = $fsa->note("xfer_to");
+     
+  reply_with($info, {
+    inline_menu => [[
+      { text=>_("Подтвердите перевод"), callback_data=>"\x00/transfer" },
+      ]]
+    },
+    sprintf("%.2f %s %s %d", $amount, $config->{currency}->{human}, _(" на счет абонента"), $to_uid),
+  );
+     
+  return "command";
 }
 }
 
 
 async sub callback_transfer
 async sub callback_transfer
@@ -164,6 +244,7 @@ async sub callback_transfer
   
   
   my $to_uid = $fsa->delete_note("xfer_to");
   my $to_uid = $fsa->delete_note("xfer_to");
   my $amount = $fsa->delete_note("xfer_amount");
   my $amount = $fsa->delete_note("xfer_amount");
+  $fsa->delete_note("xfer_fio");
   
   
   unless ($to_uid && $amount)
   unless ($to_uid && $amount)
   {
   {
@@ -335,6 +416,30 @@ sub command_support
 
 
 ##################################################
 ##################################################
 
 
+sub needs_input(%args)
+{
+  my $name = $args{name};
+  my $fsa = $args{fsa};
+  
+  $fsa->delete_note($name);
+  $fsa->note(input_name => $name);
+  $fsa->note(input_again => _("Введите заново ") . $args{item} . _(" или нажмите Отмена, чтобы прервать ") . $args{process});
+  $fsa->note(input_process => $args{process});
+  $fsa->state("needs_input");
+  return "needs_input";
+}
+
+sub cancel_input
+{
+  my ($fsa, $info) = @_;
+  $fsa->delete_note($fsa->delete_note("input_name"));
+  $fsa->delete_note("input_again");
+  reply($info, ucfirst($fsa->delete_note("input_process")) . " " . _("отменён"));
+  $fsa->state("command");
+}
+
+##################################################
+
 sub format_wd($rec, $cur)
 sub format_wd($rec, $cur)
 {
 {
   return _("бесплатно") if $rec->{dayly} == 0 && $rec->{monthly} == 0;
   return _("бесплатно") if $rec->{dayly} == 0 && $rec->{monthly} == 0;
@@ -355,6 +460,7 @@ sub parse_error
   return "$e->{code} $e->{message} $e->{body}";
   return "$e->{code} $e->{message} $e->{body}";
 }
 }
 
 
+
 1;
 1;
 
 
 # локализация
 # локализация

+ 30 - 50
modules/rules.pm

@@ -47,7 +47,7 @@ my $rules = {
        {
        {
          reply($info, 
          reply($info, 
            _("Вас приветствует провайдер") . " " . $config->{provider},
            _("Вас приветствует провайдер") . " " . $config->{provider},
-           _("Введите номер лицевого счёта или логин")
+           _("Введите номер учетной записи или логин")
          );
          );
          
          
          return "needs_login";
          return "needs_login";
@@ -102,55 +102,6 @@ my $rules = {
    
    
    #### Перевод денег
    #### Перевод денег
    
    
-   xfer_needs_uid => async sub
-   {
-     my ($fsa, $target_uid, $info) = @_;
-     my $uid = $fsa->note("uid");
-     
-     $fsa->state("command"); # на случай die
-     
-     unless($target_uid)
-     {
-       reply($info, _("Перевод денег прерван"));
-     }
-
-     unless ($target_uid =~ /^\d+$/)
-     {
-       reply($info, _("Неправильный номер личного счета"), _("Введите его заново или пустую строку, если передумали пополнять"));
-       return "xfer_needs_uid";
-     }
-     
-     if ($uid==$target_uid)
-     {
-       reply($info, _("Нельзя перевести деньги себе самому"));
-       return "command";
-     }
-     
-     my $res = await $abon_client->get_p($info, "client", "/client/$target_uid");
-     
-     if ($res->{disabled})
-     {
-       reply($info, _("Абонент $target_uid отключен"));
-       return "command";
-     }
-     
-     my $nick = $res->{fio};
-     my @fio = split(/\s+/, $res->{fio});
-     if (@fio)
-     {
-       my $f = shift(@fio);
-       $nick = join(" ", (substr($f, 0, 1) . ".", @fio));
-     }
-     
-     reply(
-       $info, _("Получатель денег: ") .  $nick,
-       "Теперь введите сумму, которую хотите перевести",
-     );
-     
-     $fsa->note(xfer_to => $target_uid);
-     return "xfer_needs_amount";
-   }, 
-   
    xfer_needs_amount => async sub
    xfer_needs_amount => async sub
    {
    {
      my ($fsa, $amount, $info) = @_;
      my ($fsa, $amount, $info) = @_;
@@ -284,6 +235,35 @@ my $rules = {
      
      
      return "command";
      return "command";
    },
    },
+   
+   needs_input => async sub
+   {
+     my ($fsa, $input, $info) = @_;
+     my $uid = $fsa->note("uid");
+     
+     $fsa->state("command"); # на случай die
+     
+     my $name = $fsa->note("input_name");
+     my $sub = refpath("verify_$name") || sub { undef };
+     
+     my $error = await $sub->($fsa, $input, $info);
+     if ($error)
+     {
+       reply_with($info, {
+         inline_menu => [[
+           { text=>_("Отмена"), callback_data=>"\x00/cancel_input" },
+         ]]
+       }, $error, $fsa->note("input_again"));
+       return "needs_input";
+     }
+     else
+     {
+       $fsa->note($name => $input);
+       $sub = refpath("use_$name") || sub { "command" };
+       my $state = await $sub->($fsa, $input, $info);
+       return $state;
+     }
+   },
 
 
 };
 };