Внимание! Фичу обнуления трафика нельзя использовать совместно с фичей "Если > 0 и по окончанию услуги трафик клиента будет меньше этого значения - снятие за услугу будет отменено" (в настройках услуги) - после обнуления трафика при окончании услуги стоимость будет выставлена в 0. Если такое случилось - запускаем скрипт:
#!/usr/bin/perl
# ------------------- NoDeny ------------------
# (с) Volik Stanislav (http://nodeny.com.ua)
# ---------------------------------------------
package install;
use strict;
use FindBin;
use lib $FindBin::Bin;
use nod;
use services;
my $M = __PACKAGE__->new(
file_cfg => 'sat.cfg',
file_log => 'install.log',
);
my $do_it;
$M->{cmd_line_options} = {
'z=i' => \$do_it,
};
$M->Start;
my %stats = ();
my $errors = 0;
{
tolog '<<< Восстановление платежей для обнуленных по трафику услуг >>>';
my $db = Db->sql('SELECT * FROM pays WHERE cash=0 AND mid>0 AND category=100');
while( my %p = $db->line )
{
my $reason = Debug->do_eval($p{reason}) or next;
$reason->{no_traf_no_cash} or next;
$reason->{traf} < 0 or next;
my $cash = $reason->{cash};
$cash < 0 or next;
$stats{-$cash}++;
$do_it or next;
delete $reason->{no_traf_no_cash};
delete $reason->{traf};
my $r = Debug->dump($reason);
{
Db->begin_work or last;
my $rows1 = Db->do('UPDATE pays SET cash=cash+(?), reason=? WHERE id=?', $cash, $r, $p{id});
my $rows2 = Db->do('UPDATE users SET balance=balance+(?) WHERE id=?', $cash, $p{mid});
if( $rows1 < 1 || $rows2 < 1 || !Db->commit )
{
Db->rollback;
$errors++;
}
}
$do_it--;
}
}
tolog 'Статистика: стоимость услуги - количество платежей', \%stats;
tolog 'Ошибок:', $errors;
1;
цитирую:
В прикреплении файл zerofix.pl.
1) Сделать бекап БД
2) скопировать файл в /usr/local/nodeny
3) запустить:
perl zerofix.pl -v
Скрипт выведет только статистику, делать ничего не будет!
Вам нужно обратить внимание на статистику - соответствует ли она примерно реальным данным
4) запускаем только на одном платеже:
perl zerofix.pl -v -z=1
в итоге выполнится восстановление ОДНОГО платежа. Посмотрите в sql запросе
UPDATE users SET balance=balance+('-xxx') WHERE id='yyy'
yyy - это его id. Откройте в админке его учетку и посмотрите - все ли правильно восстановилось: и платеж и баланс
5) запускаем для всех:
perl zerofix.pl -v -z=10000
В конце смотрим что количество ошибок = 0