QA Robot
Доработка проекта на Bitrix
Универсальные примеры кода с комментариями, которые помогут сделать работу QA Robot незаметной для администрации сайта.

Приведенный код - лишь пример. Требуется адаптация под конкретный проект.
1. Где заявки от QA Robot?

Самое первое и главное - идентифицировать заявку/заказ, который был оставлен роботом. Идентификация производится по email (QA Robot генерирует email определенного вида). Чтобы определить, является ли данный email настоящим, или был сгенерирован QA Robot - используйте следующий метод:
class Helper{
    public static function isDsMonitorBotEmail($email){
        $isBot = false;
        $botEmailPattern = [
             "dsmon@yandex.ru",
             "dsmontest@google.com",
             "dsmontestrobot@gmail.com",
             "dsrobot@test.ru&quot",
             "dsemailtest@aawdawd.ru",
             "dstestemail@mail.ru",
             "dsemailpattern@gmail.ru",
             "dsmonitortesting@yahoo.com",
             "dstestololol@alligator.ru",
             "dstestterminator@ms.com";
       ];

       foreach ($botEmailPattern as $pattern) {
             if (strstr($email, $pattern)) {
                   $isBot = true;
             }
       }

       return $isBot;
   }
}
2. Перехватить email-уведомления

Чтобы на почту администратору не уходили постоянные уведомления при заказах, сгенерированных при тестировании - можно использовать универсальный код для перехвата исходящих сообщений. В зависимости от конкретного проекта перечень EVENT_NAME может изменяться, могут меняться ключи $arFields, в которых хранится email

AddEventHandler("main", "OnBeforeEventSend", array("EmailHandlerClass", "OnBeforeEventSend"));

class EmailHandlerClass
{
    function OnBeforeEventSend(&$arFields, &$arTemplate)
    {
        fwrite($f, var_export($arFields, true));
        fwrite($f, var_export($arTemplate, true));
        if ($arTemplate["EVENT_NAME"] == "SALE_NEW_ORDER" ||
            $arTemplate["EVENT_NAME"] == "FORM_FILLING_SIMPLE_FORM_1"
        ) {
            if (Helper::isDsMonitorBotEmail($arFields["EMAIL"]) ||
                Helper::isDsMonitorBotEmail($arFields["QUESTION_EMAIL"])
            ) {
                $originalEmail = $arTemplate["EMAIL_TO"];
                $originalSubject = $arTemplate["SUBJECT"];

                $arTemplate["EMAIL_TO"] = "<Ваш email, на который будут уходить все уведомления, сгенерированные робото>";
                $arTemplate["SUBJECT"] = "[from QA Robot to " . $originalEmail . "]" . $originalSubject;
            }
        }
    }
}
3. Удалить тестовые заказы/заявки из административной панели

Каждая проверка, как правило, оставляет после себя в адм. панели заказы. Чтобы эти заказы не мешали обработке заказов от реальных клиентов - используется периодически запускаемый скрипт, который будет такие заказы удалять.
<?
/* удаляет все заказы и пользователей, которые сгенерированы роботом. 
Периодичность запуска: в зависимости от периодичности запуска QA Robot, но не реже раза в сутки
*/
require_once($_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/include.php");

CModule::IncludeModule("sale");
CModule::IncludeModule("form");
global $DB;

$fromTime = time() - 3600 * 24; // берём заказы за последние сутки
$toTime = time();

$arFilter = Array(
    ">=DATE_INSERT" => date($DB->DateFormatToPHP(CSite::GetDateFormat("SHORT")), $fromTime)
);

//Суть - берём заказы младше суток, но старше 10 минут.
$rsSales = CSaleOrder::GetList(array("DATE_INSERT" => "ASC"), $arFilter);
while ($arSales = $rsSales->Fetch()) {
    $createUTS = strtotime($arSales["DATE_INSERT"]);
    if (($toTime - $createUTS) > 600) {
        //строго заказы созданные БОЛЕЕ 10 минут назад.
        //Чтобы роботы успевали проверить их наличие через админку

        $email = ((CUser::GetByID($arSales["USER_ID"]))->GetNext())["EMAIL"];
        if (Helper::isDsMonitorBotEmail($email)) {
            CSaleOrder::Delete($arSales["ID"]);
            if (CUser::Delete($arSales["USER_ID"])) echo "User deleted.";
        }
    }
}
<?
/* удаляет все элементы веб-формы, которые сгенерированы роботом. 
Периодичность запуска: в зависимости от периодичности запуска QA Robot, но не реже раза в сутки
*/
require_once($_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/include.php");

CModule::IncludeModule("sale");
CModule::IncludeModule("form");
global $DB;

$fromTime = time() - 3600 * 24; // берём заказы за последние сутки
$toTime = time();

$FORM_ID = 1;// ID веб-формы

// фильтр по полям результата
$arFilter = array(
    "DATE_CREATE_1" => date($DB->DateFormatToPHP(CSite::GetDateFormat("SHORT")), $fromTime)
);


$rsResults = CFormResult::GetList($FORM_ID,
    ($by = "s_timestamp"),
    ($order = "desc"),
    $arFilter,
    $is_filtered,
    "Y");
while ($arResult = $rsResults->Fetch()) {
    $createUTS = strtotime($arResult["DATE_CREATE"]);
    if (($toTime - $createUTS) > 600) {
        //строго элементы созданные БОЛЕЕ 10 минут назад.

        $arAnswer = CFormResult::GetDataByID(
            $arResult["ID"],
            array(),
            $arResult,
            $arAnswer2);

        $userEmail = $arAnswer["QUESTION_EMAIL"][0]["USER_TEXT"];


        if (Helper::isDsMonitorBotEmail($userEmail)) {

            CFormResult::Delete($arResult["ID"]);
            echo "Form width ID = " . $arResult["ID"] . " deleted<br>";
            $query = \Bitrix\Main\UserTable::getList(array(
                'filter' => array(
                    'EMAIL' => $userEmail
                )
            ));
            $userId = "";
            while ($user = $query->fetch()) {
                $userId = $user["ID"];
                if (CUser::Delete($userId)) echo "User width email: " . $userEmail . " deleted<br>";
            }
        }
    }
}
Made on
Tilda