Не нашли ответы на свои вопросы в наших публикациях? Задайте вопрос в службу техподдержки!
ПРОВЕРКА КОРРЕКТНОСТИ НАЧИСЛЕНИЙ И НУЛЕВЫХ ЗАПИСЕЙ (ВЕРСИЯ 2.0)
ВНИМАНИЕ: перед запуском скрипта рекомендуется сделать бэкап!
Чтобы проверить корректность начислений, списаний, транзакций необходимо выполнить данный код:
Данный скрипт берет из транзакции пользователя только АКТИВНЫЕ ЗАПИСИ у которых количество бонусов БОЛЬШЕ НУЛЯ.
т.е. если у пользователя есть отрицательные транзакции (оплата бонусами, списание юонусов) они не учитываются.
Если у пользователя есть транзакции которые еще не активировались (отложенна активация) они не учитываются! Если у трназакции есть только дата окончания то транзакция активна и она учитывается в общей сумме (на данный момент времени)
т.е. в итоге получается сумма только активных на данный момент бонусов.
Bitrix\Main\Loader::includeModule("vbcherepanov.bonus");
$BBCORE=new \ITRound\Vbchbbonus\Vbchbbcore();
$siteID=$BBCORE->SITE_ID;
unset($BBCORE);
$arUserID=[];
$l=\ITRound\Vbchbbonus\BonusTable::getList(
[
'select'=>['USERID'],
]
);
while($l1=$l->fetch()){
$arUserID[]=$l1['USERID'];
}
$arUserID=array_filter(array_unique($arUserID));
//выставить в false если надо только просмотреть некорректные записи
$check=true;
// true - создать корректирующие записи, выровнять значения false - просто вывод неравных записей
$setZerro=true;
// при отрицательном значении выставить в 0(создается корректирующая транзакция для нулевой суммы)
if(sizeof($arUserID)>0){
foreach($arUserID as $u_id){
$res1=\ITRound\Vbchbbonus\AccountTable::getList(
[
'filter'=>['USER_ID'=>$u_id]
]
);
if($res=$res1->fetch()){
$tr=\ITRound\Vbchbbonus\BonusTable::getList(
[
'filter'=>[
'=USERID'=>intval($res['USER_ID']),
'=BONUSACCOUNTSID'=>intval($res['BONUSACCOUNTSID']),
'ACTIVE'=>'Y',
'>BONUS'=>0
],
'select'=>['USERID','BNS'],
'runtime' => array(
new \Bitrix\Main\Entity\ExpressionField('BNS', 'SUM(BONUS)')
)
]
);
while($trans=$tr->fetch()){
if(floatval($trans['BNS'])!=floatval($res['CURRENT_BUDGET']) ||
floatval($res['CURRENT_BUDGET'])<0
){
echo 'Пользователь ='. $res['USER_ID'].' -На счету: '.
$res['CURRENT_BUDGET']. ' = По транзакциям: '.$trans['BNS'].PHP_EOL;
if($check) {
if($setZerro){
if(floatval($trans['BNS'])<0){
\Bitrix\Main\Application::getConnection()->startTransaction();
$l = \ITRound\Vbchbbonus\BonusTable::add(
[
'USERID'=>intval($res['USER_ID']),
'BONUSACCOUNTSID'=>intval($res['BONUSACCOUNTSID']),
'TYPES'=>'BONUS',
'LID'=>$siteID,
'ACTIVE'=>'Y',
'BONUS' => -1*$trans['BNS'],
'PARTPAY'=>0,
'DESCRIPTION'=>'Выравнивание в 0',
]
);
if ($l->isSuccess()) {
\Bitrix\Main\Application::getConnection()->commitTransaction();
} else {
\Bitrix\Main\Application::getConnection()->rollbackTransaction();
}
$trans['BNS']=0;
}
}
if(floatval($trans['BNS'])<0) $trans['BNS']=0;
\Bitrix\Main\Application::getConnection()->startTransaction();
$l = \ITRound\Vbchbbonus\AccountTable::update($res['ID'],
['CURRENT_BUDGET' => $trans['BNS']]
);
if ($l->isSuccess()) {
\Bitrix\Main\Application::getConnection()->commitTransaction();
} else {
\Bitrix\Main\Application::getConnection()->rollbackTransaction();
}
}
}
}
}else{
$tr=\ITRound\Vbchbbonus\BonusTable::getList(
[
'filter'=>[
'=USERID'=>intval($u_id),
'=BONUSACCOUNTSID'=>intval($res['BONUSACCOUNTSID']),
'ACTIVE'=>'Y',
'>BONUS'=>0
], 'select'=>['USERID','BNS','BONUSACCOUNTSID'], 'runtime' => array( new \Bitrix\Main\Entity\ExpressionField('BNS', 'SUM(BONUS)') ) ] ); while($trans=$tr->fetch()){ if(floatval($trans['BNS'])!=floatval($res['CURRENT_BUDGET']) || floatval($res['CURRENT_BUDGET'])<0 ){ echo 'Пользователь ='. $u_id.' -Счета нет: '. $res['CURRENT_BUDGET']. ' = По транзакциям: '.$trans['BNS'].PHP_EOL; if($check) { if($setZerro){ if(floatval($trans['BNS'])<0){ \Bitrix\Main\Application::getConnection()->startTransaction(); $l = \ITRound\Vbchbbonus\BonusTable::add( [ 'USERID'=>intval($u_id), 'BONUSACCOUNTSID'=>intval($trans['BONUSACCOUNTSID']), 'TYPES'=>'BONUS', 'LID'=>$siteID, 'ACTIVE'=>'Y', 'BONUS' => -1*$trans['BNS'], 'PARTPAY'=>0, 'DESCRIPTION'=>'Выравнивание в 0', ] ); if ($l->isSuccess()) { \Bitrix\Main\Application::getConnection()->commitTransaction(); } else { \Bitrix\Main\Application::getConnection()->rollbackTransaction(); } $trans['BNS']=0; } } if(floatval($trans['BNS'])<0) $trans['BNS']=0; \Bitrix\Main\Application::getConnection()->startTransaction(); $l = \ITRound\Vbchbbonus\AccountTable::add( [ 'CURRENT_BUDGET' => $trans['BNS'], 'USER_ID'=>$trans['USERID'], 'BONUSACCOUNTSID'=>intval($trans['BONUSACCOUNTSID']), 'CURRENCY'=>'RUB', ] ); if ($l->isSuccess()) { \Bitrix\Main\Application::getConnection()->commitTransaction(); } else { \Bitrix\Main\Application::getConnection()->rollbackTransaction(); } } } } } } }
Данный код можно выполнить в административном разделе сайта (Командная PHP строка ) /bitrix/admin/php_command_line.php?lang=ru
Или создать php файл на хостинге, поместить туда этот код и запустить в браузере
при создании файла, в начале файла (перед вставляемым кодом) прописать
<?php
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');
Назад в раздел