+7 495 008 8452 пн.-пт. 10:00 – 17:00

Не нашли ответы на свои вопросы в наших публикациях? Задайте вопрос в службу техподдержки!


ПРОВЕРКА КОРРЕКТНОСТИ НАЧИСЛЕНИЙ И НУЛЕВЫХ ЗАПИСЕЙ (ВЕРСИЯ 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');




Назад в раздел



Часто задаваемые вопросы по модулям экспорта

Видео плейлист по настройке модулей экспорта