|
|
@@ -1,357 +1,198 @@
|
|
|
use Modern::Perl;
|
|
|
-use AnyEvent;
|
|
|
use utf8;
|
|
|
|
|
|
-use Mojo::Base -strict, -async_await;
|
|
|
+use Mojo::Base -strict, -async_await, -signatures;
|
|
|
use Data::Dumper;
|
|
|
|
|
|
-use bdcom;
|
|
|
-use cdata;
|
|
|
-
|
|
|
our $client;
|
|
|
-our $redis;
|
|
|
-our $db;
|
|
|
-
|
|
|
-##############################################
|
|
|
+our $fsa;
|
|
|
+our $abon_client;
|
|
|
|
|
|
-sub command_help :Alias("помощь")
|
|
|
+sub __
|
|
|
{
|
|
|
- my $cmd = shift;
|
|
|
- my $args = shift;
|
|
|
- my $chatid = shift;
|
|
|
- my $rest = shift;
|
|
|
-
|
|
|
-# TEMP
|
|
|
-# <b>/purge-all-trees</b> <i>ip-адрес-устройства</i> - Очистить все деревья PON
|
|
|
-#
|
|
|
- notify($chatid, <<"---", $rest);
|
|
|
-<b>/purge</b> <i>ip-адрес-устройства номер-дерева</i> - Очистить дерево PON
|
|
|
-<b>/почистить</b> <i>ip-адрес-устройства номер-дерева</i>
|
|
|
-<b>/purge_all_trees</b> <i>ip-адрес-устройства</i> - Очистить ВСЕ деревья
|
|
|
-<b>/почистить_все_деревья</b> <i>ip-адрес-устройства</i> - Очистить ВСЕ деревья
|
|
|
-<b>/inspect</b> <i>ip-адрес-устройства номер-дерева</i> - Информация об ONU на дереве
|
|
|
-<b>/проверить</b> <i>ip-адрес-устройства номер-дерева</i>
|
|
|
-<b>/onu</b> <i>ip-адрес-устройства номер-дерева</i> - Краткая информация ONU на дереве
|
|
|
-<b>/ону</b> <i>ip-адрес-устройства номер-дерева</i>
|
|
|
----
|
|
|
+ @_;
|
|
|
}
|
|
|
|
|
|
-async sub command_find :Alias("где")
|
|
|
-{
|
|
|
- my $cmd = shift;
|
|
|
- my $args = shift;
|
|
|
- my $chatid = shift;
|
|
|
- my $rest = shift;
|
|
|
-
|
|
|
- my $onu_mac = uc $args->[0];
|
|
|
-
|
|
|
- return notify($chatid, "Не указан MAC ONU") unless $onu_mac;
|
|
|
-
|
|
|
- my $olts;
|
|
|
- eval {
|
|
|
- $olts = await $client->get_p("device", "/pon");
|
|
|
- };
|
|
|
-
|
|
|
- my @keys = $redis->keys("gpon-*");
|
|
|
-
|
|
|
- my $search_res = 0;
|
|
|
-
|
|
|
- foreach my $x (@keys) {
|
|
|
- my %values = $redis->hgetall($x);
|
|
|
- my $record = \%values;
|
|
|
-
|
|
|
- if ( $record->{mac} && $record->{mac} =~ $onu_mac ) {
|
|
|
- my @key_parts = split("-", $x);
|
|
|
- my $dev_id = @key_parts[1];
|
|
|
-
|
|
|
- my @olt_f = grep { $dev_id == $_->{entity} } @$olts;
|
|
|
- my $olt = @olt_f[0];
|
|
|
+##############################################
|
|
|
|
|
|
- unless ($olt) {
|
|
|
- notify($chatid, "Не существует OLT id=$dev_id") unless $olt;
|
|
|
- } else {
|
|
|
- notify($chatid, "$olt->{name} ($olt->{ip}) $record->{name} (MAC-ONU: $record->{mac})");
|
|
|
- $search_res = 1;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+our $commands = [
|
|
|
+ {command=>"help", name=>__("Помощь"), description=>__("Список доступных команд"), hide_in_kb=>1},
|
|
|
+ {command=>"info", name=>__("Информация"), description=>__("Информация о пользователе")},
|
|
|
+ {command=>"balance", name=>__("Баланс"), description=>__("Проверка баланса")},
|
|
|
+ {command=>"service", name=>__("Сервисы"), description=>__("Подключенные сервисы")},
|
|
|
+ {command=>"credit", name=>__("Кредит"), description=>__("Установка кредита")},
|
|
|
+ {command=>"logout", name=>__("Выход"), description=>__("Выход")},
|
|
|
+];
|
|
|
|
|
|
- return notify($chatid, "Не нашёл MAC ONU=\"$onu_mac\"") unless $search_res;
|
|
|
+##############################################
|
|
|
|
|
|
+sub command_help($chatid, $uid, $rest)
|
|
|
+{
|
|
|
+ my @list = map { "<b>/$_->{command}</b> " . _($_->{description}) } @$commands;
|
|
|
+ notify($chatid, join("\n", @list), $rest);
|
|
|
}
|
|
|
|
|
|
-# inspect 172.25.7.1 2 - посмотреть информацию об ONU на дереве 2 устройства 172.25.7.1
|
|
|
-async sub command_inspect :Alias("проверить")
|
|
|
+sub command_start($chatid, $uid, $from)
|
|
|
{
|
|
|
- my $cmd = shift;
|
|
|
- my $args = shift;
|
|
|
- my $chatid = shift;
|
|
|
- my $rest = shift;
|
|
|
-
|
|
|
- my $ip = $args->[0];
|
|
|
- my $tree = $args->[1];
|
|
|
-
|
|
|
- return notify($chatid, "Не указан IP-адрес") unless $ip;
|
|
|
- return notify($chatid, "Не указан номер дерева") unless $tree;
|
|
|
-
|
|
|
- return notify($chatid, "Неправильный IP-адрес: $ip") unless is_valid_ip($ip);
|
|
|
+ set_new_state("");
|
|
|
+}
|
|
|
|
|
|
- my $res;
|
|
|
- eval {
|
|
|
- $res = await $client->get_p("device", "/pon?query=ip=\"$ip\"");
|
|
|
- };
|
|
|
- return notify($chatid, "Ошибка: " . parse_error($@)) if $@;
|
|
|
- return notify($chatid, "Устройство с ip=$ip не найдено") if @$res<1;
|
|
|
-
|
|
|
- my $dev = $res->[0];
|
|
|
+sub command_logout($chatid, $uid, $rest)
|
|
|
+{
|
|
|
+ notify($chatid, _("Благодарим за использование нашего бота"));
|
|
|
|
|
|
- my $sub;
|
|
|
- if ($dev->{type} =~ /^BDCOM/)
|
|
|
- {
|
|
|
- $sub = reference("bdcom_inspect");
|
|
|
-# $sub = sub { bdcom->inspect(@_) };
|
|
|
- }
|
|
|
- elsif ($dev->{type} =~ /^C-DATA/)
|
|
|
+ $client->del("client", "/client/$uid/telegram");
|
|
|
+ if (my $err = $client->error)
|
|
|
{
|
|
|
- $sub = reference("cdata_inspect");
|
|
|
+ report($chatid, $err);
|
|
|
}
|
|
|
|
|
|
- return notify($chatid, "Неправильный номер дерева: $tree") unless is_valid_tree($dev->{type}, $tree);
|
|
|
-
|
|
|
- return notify($chatid, "Устройство $ip '$dev->{name}' неизвестного типа $dev->{type}") unless $sub;
|
|
|
-
|
|
|
-# notify($chatid, "Смотрю дерево $tree на устройстве $ip '$dev->{name}'");
|
|
|
+ $fsa->notes(uid => undef);
|
|
|
+ set_new_state("logged_out");
|
|
|
+}
|
|
|
|
|
|
- my $text;
|
|
|
- eval {
|
|
|
- $text = await $sub->($ip, $dev->{login}, $dev->{password}, $tree);
|
|
|
- };
|
|
|
+async sub command_balance
|
|
|
+{
|
|
|
+ my ($chatid, $uid, $rest) = @_;
|
|
|
+ my $money = await $abon_client->get_p($chatid, "client", "/client/$uid/money?human=1");
|
|
|
+ my $cur = $money->{human};
|
|
|
|
|
|
- return notify($chatid, "$ip '$dev->{name}': $@") if $@;
|
|
|
+ my @lines = (
|
|
|
+ sprintf("<u>%s:</u> <b>%.2f $cur</b> (%s %.2f $cur + %s %.2f $cur) ",
|
|
|
+ _("Ваш баланс"), $money->{balance}, ("депозит"), $money->{deposit}, _("кредит"), $money->{credit}),
|
|
|
+ );
|
|
|
|
|
|
- notify($chatid, "$ip '$dev->{name}' дерево $tree
|
|
|
-<code>$text</code>");
|
|
|
-
|
|
|
-};
|
|
|
-
|
|
|
-# onu 172.25.7.1 2 - получить короткую информацию об ONU на дереве 2 устройства 172.25.7.1
|
|
|
-async sub command_onu :Alias("ону")
|
|
|
-{
|
|
|
- my $cmd = shift;
|
|
|
- my $args = shift;
|
|
|
- my $chatid = shift;
|
|
|
- my $rest = shift;
|
|
|
+ push @lines, sprintf("<u>%s:</u> %s", _("Оплачено до"), format_date($money->{last_day})) if $money->{last_day} ne "-";
|
|
|
+ push @lines, sprintf("<u>%s:</u> %d%%", _("Скидка"), $money->{reduction}) if $money->{reduction};
|
|
|
|
|
|
- my $ip = $args->[0];
|
|
|
- my $tree = $args->[1];
|
|
|
+ push @lines, sprintf("<u>%s:</u> <b>%.2f $cur</b> %s (%s)",
|
|
|
+ _("Последнее снятие"), $money->{last_withdrawal}->{sum}, format_time($money->{last_withdrawal}->{date}), $money->{last_withdrawal}->{comment})
|
|
|
+ if $money->{last_withdrawal}->{sum};
|
|
|
+ push @lines, sprintf("<u>%s:</u> <b>%.2f $cur</b> %s", _("Последний платеж"), $money->{last_payment}->{sum}, format_time($money->{last_payment}->{date}))
|
|
|
+ if $money->{last_payment}->{sum};
|
|
|
|
|
|
- return notify($chatid, "Не указан IP-адрес") unless $ip;
|
|
|
- return notify($chatid, "Не указан номер дерева") unless $tree;
|
|
|
-
|
|
|
- return notify($chatid, "Неправильный IP-адрес: $ip") unless is_valid_ip($ip);
|
|
|
-
|
|
|
- my $res;
|
|
|
- eval {
|
|
|
- $res = await $client->get_p("device", "/pon?query=ip=\"$ip\"");
|
|
|
- };
|
|
|
- return notify($chatid, "Ошибка: " . parse_error($@)) if $@;
|
|
|
- return notify($chatid, "Устройство с ip=$ip не найдено") if @$res<1;
|
|
|
-
|
|
|
- my $dev = $res->[0];
|
|
|
-
|
|
|
- my $sub;
|
|
|
- if ($dev->{type} =~ /^BDCOM/)
|
|
|
- {
|
|
|
- $sub = reference("bdcom_onu");
|
|
|
- }
|
|
|
- elsif ($dev->{type} =~ /^C-DATA/)
|
|
|
+ for (keys %{ $money->{accounts} })
|
|
|
{
|
|
|
- $sub = reference("cdata_onu");
|
|
|
+ push @lines, sprintf("<u>%s:</u> <b>%.2f $cur</b>", $_, $money->{accounts}->{$_});
|
|
|
}
|
|
|
+
|
|
|
+ reply($rest, @lines);
|
|
|
+}
|
|
|
|
|
|
- return notify($chatid, "Неправильный номер дерева: $tree") unless is_valid_tree($dev->{type}, $tree);
|
|
|
-
|
|
|
- return notify($chatid, "Устройство $ip '$dev->{name}' неизвестного типа $dev->{type}") unless $sub;
|
|
|
-
|
|
|
-# notify($chatid, "Смотрю дерево $tree на устройстве $ip '$dev->{name}'");
|
|
|
-
|
|
|
- my $text;
|
|
|
- eval {
|
|
|
- $text = await $sub->($ip, $dev->{login}, $dev->{password}, $tree);
|
|
|
- };
|
|
|
-
|
|
|
- return notify($chatid, "$ip '$dev->{name}': $@") if $@;
|
|
|
-
|
|
|
- notify($chatid, "$ip '$dev->{name}' дерево $tree
|
|
|
-<code>$text</code>");
|
|
|
-
|
|
|
-};
|
|
|
-
|
|
|
-# purge 172.1.1.1 2 - почистить дерево 2 на ПОН
|
|
|
-async sub command_purge :Alias("почистить")
|
|
|
+async sub command_info
|
|
|
{
|
|
|
- my $cmd = shift;
|
|
|
- my $args = shift;
|
|
|
- my $chatid = shift;
|
|
|
- my $rest = shift;
|
|
|
-
|
|
|
- my $ip = $args->[0];
|
|
|
- my $tree = $args->[1];
|
|
|
-
|
|
|
- return notify($chatid, "Не указан IP-адрес") unless $ip;
|
|
|
- return notify($chatid, "Не указан номер дерева") unless $tree;
|
|
|
+ my ($chatid, $uid, $rest) = @_;
|
|
|
+ my $client = await $abon_client->get_p($chatid, "client", "/client/$uid");
|
|
|
+ reply($rest,
|
|
|
+ sprintf("<u>%s</u>: %d", _("Лицевой счет"), $client->{uid}),
|
|
|
+ sprintf("<u>%s</u>: %s", _("Логин"), $client->{login}),
|
|
|
+ sprintf("<u>%s</u>: %s", _("ФИО"), $client->{fio}),
|
|
|
+ sprintf("<u>%s</u>: %s", _("Адрес"), $client->{address}),
|
|
|
+ sprintf("<u>%s</u>: %s", _("Телефон"), $client->{phone}),
|
|
|
+ );
|
|
|
+}
|
|
|
|
|
|
- return notify($chatid, "Неправильный IP-адрес: $ip") unless is_valid_ip($ip);
|
|
|
-
|
|
|
- my $res;
|
|
|
- eval {
|
|
|
- $res = await $client->get_p("device", "/pon?query=ip=\"$ip\"");
|
|
|
- };
|
|
|
- return notify($chatid, "Ошибка: " . parse_error($@)) if $@;
|
|
|
- return notify($chatid, "Устройство с ip=$ip не найдено") if @$res<1;
|
|
|
-
|
|
|
- my $dev = $res->[0];
|
|
|
+async sub command_credit
|
|
|
+{
|
|
|
+ my ($chatid, $uid, $rest) = @_;
|
|
|
+ my $money = await $abon_client->get_p($chatid, "client", "/client/$uid/money?human=1");
|
|
|
|
|
|
- my $sub;
|
|
|
- if ($dev->{type} =~ /^BDCOM/)
|
|
|
- {
|
|
|
- $sub = reference("bdcom_purge");
|
|
|
- }
|
|
|
- elsif ($dev->{type} =~ /^C-DATA/)
|
|
|
+ if ($money->{credit} > 0)
|
|
|
{
|
|
|
- $sub = reference("cdata_purge");
|
|
|
+ return reply($rest, sprintf("%s <b>%.2f %s</b>", _("У вас уже установлен кредит"), $money->{credit}, $money->{human}));
|
|
|
}
|
|
|
-
|
|
|
- return notify($chatid, "Неправильный номер дерева: $tree") unless is_valid_tree($dev->{type}, $tree);
|
|
|
-
|
|
|
- return notify($chatid, "Устройство $ip '$dev->{name}' неизвестного типа $dev->{type}") unless $sub;
|
|
|
-
|
|
|
- notify($chatid, "Очищаю дерево $tree на устройстве $ip '$dev->{name}'");
|
|
|
-
|
|
|
- my $text;
|
|
|
- eval {
|
|
|
- $text = await $sub->($ip, $dev->{login}, $dev->{password}, $tree, 1);
|
|
|
- };
|
|
|
-
|
|
|
- return notify($chatid, "$ip '$dev->{name}': $@") if $@;
|
|
|
|
|
|
- notify($chatid, "$ip '$dev->{name}' дерево $tree
|
|
|
-<code>$text</code>");
|
|
|
-
|
|
|
-};
|
|
|
+ reply_with($rest, {
|
|
|
+ inline_menu => [[
|
|
|
+ { text=>_("Я согласен с условиями"), callback_data=>"/set-credit" },
|
|
|
+ ]],
|
|
|
+ },
|
|
|
+ _("Вы можете самостоятельно установить кредит на два дня"),
|
|
|
+ _("<b>Ограничения</b>: только для физических лиц, продлевать кредит повторно до оплаты нельзя. При следующей оплате кредит будет погашен"),
|
|
|
+ );
|
|
|
+}
|
|
|
|
|
|
-# purge_all_trees 172.1.1.1 - почистить все деревья на устройстве 172.1.1.1
|
|
|
-async sub command_purge_all_trees :Alias("почистить_все_деревья")
|
|
|
+async sub command_set_credit
|
|
|
{
|
|
|
- my $cmd = shift;
|
|
|
- my $args = shift;
|
|
|
- my $chatid = shift;
|
|
|
- my $rest = shift;
|
|
|
-
|
|
|
- my $ip = $args->[0];
|
|
|
-
|
|
|
- return notify($chatid, "Не указан IP-адрес") unless $ip;
|
|
|
+ my ($chatid, $uid, $rest) = @_;
|
|
|
|
|
|
- return notify($chatid, "Неправильный IP-адрес: $ip") unless is_valid_ip($ip);
|
|
|
-
|
|
|
- my $res;
|
|
|
- eval {
|
|
|
- $res = await $client->get_p("device", "/pon?query=ip=\"$ip\"");
|
|
|
- };
|
|
|
- return notify($chatid, "Ошибка: " . parse_error($@)) if $@;
|
|
|
- return notify($chatid, "Устройство с ip=$ip не найдено") if @$res<1;
|
|
|
+ my $res = await $abon_client->post_p($chatid, "client", "/client/$uid/credit", {human=>1});
|
|
|
+ return reply($rest, _("Кредит не имеет смысла для бесплатных тарифных планов")) if $res->{credit} == 0;
|
|
|
|
|
|
- my $dev = $res->[0];
|
|
|
-
|
|
|
- my $sub;
|
|
|
- if ($dev->{type} =~ /^BDCOM/)
|
|
|
- {
|
|
|
- $sub = reference("bdcom_purgeall");
|
|
|
- }
|
|
|
- elsif ($dev->{type} =~ /^C-DATA/)
|
|
|
- {
|
|
|
- $sub = reference("cdata_purgeall");
|
|
|
- }
|
|
|
-
|
|
|
- my $tree_count = get_tree_count($dev->{type});
|
|
|
-
|
|
|
- notify($chatid, "$ip '$dev->{name}'\nВыполняю очистку ВСЕХ деревьев.\nОперация может быть долгой. Ожидайте.\nКоличество деревьев: $tree_count");
|
|
|
-
|
|
|
- return notify($chatid, "Устройство $ip '$dev->{name}' неизвестного типа $dev->{type}") unless $sub;
|
|
|
+ await reply($rest,
|
|
|
+ sprintf("%s <b>%.2f %s</b>", _("Установлен кредит "), $res->{credit}, $res->{human}),
|
|
|
+ "",
|
|
|
+ );
|
|
|
|
|
|
- my $res_ref;
|
|
|
- eval {
|
|
|
- $res_ref = await $sub->($ip, $dev->{login}, $dev->{password}, $tree_count, 1);
|
|
|
-# say Dumper @{$res_ref};
|
|
|
- };
|
|
|
-
|
|
|
- return notify($chatid, "$ip '$dev->{name}': $@") if $@;
|
|
|
-
|
|
|
-# Also note that your bot will not be able to send more than 20 messages per minute to the same group.
|
|
|
- my $w;
|
|
|
- $w = AnyEvent->timer (after => 1, interval => 3, cb => sub {
|
|
|
- if (scalar @{$res_ref} == 0) {
|
|
|
- undef $w;
|
|
|
- }
|
|
|
-
|
|
|
- my $text = shift @{$res_ref};
|
|
|
- if ($text) {
|
|
|
- notify($chatid, "$ip '$dev->{name}'
|
|
|
-<code>$text</code>");
|
|
|
- }
|
|
|
-
|
|
|
- });
|
|
|
-
|
|
|
-};
|
|
|
-
|
|
|
-###################################
|
|
|
-
|
|
|
-sub is_valid_ip
|
|
|
-{
|
|
|
- return $_[0] =~ /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
|
|
|
+ command_balance($chatid, $uid, $rest);
|
|
|
}
|
|
|
|
|
|
-sub get_tree_count
|
|
|
+=cut
|
|
|
+$VAR1 = [
|
|
|
+ {
|
|
|
+ 'tariff' => {
|
|
|
+ 'monthly' => '0',
|
|
|
+ 'dayly' => '0',
|
|
|
+ 'entity' => 1000,
|
|
|
+ 'speed' => 0,
|
|
|
+ 'name_ru' => "\x{414}\x{43b}\x{44f} \x{441}\x{43e}\x{442}\x{440}\x{443}\x{434}\x{43d}\x{438}\x{43a}\x{43e}\x{432} MOL"
|
|
|
+ },
|
|
|
+ 'name' => 'pppoe',
|
|
|
+ 'name_ru' => 'PPPoE',
|
|
|
+ 'entity' => 32320,
|
|
|
+ 'disabled' => 0
|
|
|
+ },
|
|
|
+ {
|
|
|
+ 'tariff' => {
|
|
|
+ 'speed' => 0,
|
|
|
+ 'name_ru' => "\x{414}\x{43b}\x{44f} \x{441}\x{43e}\x{442}\x{440}\x{443}\x{434}\x{43d}\x{438}\x{43a}\x{43e}\x{432} MOL",
|
|
|
+ 'entity' => 1000,
|
|
|
+ 'monthly' => '0',
|
|
|
+ 'dayly' => '0'
|
|
|
+ },
|
|
|
+ 'name' => 'ipoe',
|
|
|
+ 'entity' => 17,
|
|
|
+ 'name_ru' => 'IPoE',
|
|
|
+ 'disabled' => 0
|
|
|
+ }
|
|
|
+ ];
|
|
|
+=cut
|
|
|
+
|
|
|
+async sub command_service
|
|
|
{
|
|
|
- my $devtype = shift;
|
|
|
- if ($devtype =~ /^BDCOM P3608/) {
|
|
|
- return 8;
|
|
|
- } elsif ($devtype =~ /^BDCOM P3600-08/) {
|
|
|
- return 8;
|
|
|
- } elsif ($devtype =~ /^BDCOM P3600-16/) {
|
|
|
- return 16;
|
|
|
- } elsif ($devtype =~ /^BDCOM P3616/) {
|
|
|
- return 16;
|
|
|
- } elsif ($devtype =~ /^BDCOM P3310/) {
|
|
|
- return 4;
|
|
|
- } elsif ($devtype =~ /^C-DATA FD1208/) {
|
|
|
- return 8;
|
|
|
- } elsif ($devtype =~ /^C-DATA FD1216/) {
|
|
|
- return 16;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- return 0;
|
|
|
- }
|
|
|
-}
|
|
|
+ my ($chatid, $uid, $rest) = @_;
|
|
|
+
|
|
|
+ my $res = await $abon_client->get_p($chatid, "client", "/client/$uid/service?human=1&as-array=1");
|
|
|
+ my @list = map { sprintf("<u>%s:</u> %s (%s '%s')", $_->{name_ru}, format_wd($_->{tariff}, $_->{human}), _("тариф"), $_->{tariff}->{name_ru}) }
|
|
|
+ grep { !$_->{disabled} } @$res;
|
|
|
+
|
|
|
+ reply($rest, @list);
|
|
|
+};
|
|
|
|
|
|
-sub is_valid_tree
|
|
|
+sub format_wd($rec, $cur)
|
|
|
{
|
|
|
- my $devtype = shift;
|
|
|
- my $tree_num = shift;
|
|
|
+ return _("бесплатно") if $rec->{dayly} == 0 && $rec->{monthly} == 0;
|
|
|
|
|
|
- my $tree_count = get_tree_count($devtype);
|
|
|
+ my $m = sprintf("<b>%.2f $cur</b> %s", $rec->{monthly}, _("в месяц")) if $rec->{monthly} != 0;
|
|
|
+ my $d = sprintf("<b>%.2f $cur</b> %s", $rec->{dayly}, _("в месяц")) if $rec->{dayly} != 0;
|
|
|
|
|
|
- return ($tree_num <= $tree_count) && ($tree_num > 0);
|
|
|
+ return ("$m + $d") if $m && $d;
|
|
|
+ return $m if $m;
|
|
|
+ return $d if $d;
|
|
|
}
|
|
|
|
|
|
+################################################
|
|
|
+
|
|
|
sub parse_error
|
|
|
{
|
|
|
my $e = shift;
|
|
|
-
|
|
|
return $e unless ref $e;
|
|
|
|
|
|
return "$e->{code} $e->{message} $e->{body}";
|
|
|
}
|
|
|
|
|
|
1;
|
|
|
+
|
|
|
+# что будет, если, к примеру, установка кредита вернет ошибку?
|
|
|
+# сервисы
|
|
|
+# перевод денег
|