new: Мой ФэшнБлог

Почистить ВСЕ корзины пользователей, отменить ВСЕ неоплаченные заказы

Требовалось:
почистить все корзины пользователей, которые БЕЗ заказа
отменить все неоплаченные заказы
через апи битрикса долго, решила через SQL запросы тут /bitrix/admin/sql.php?lang=en&del_query=Y

Битрикс тоже так делает, если чо http://bxapi.ru/src/?module_id=sale&name=Basket::deleteOld

почистить ВСЕ корзины, БЕЗ заказа
Delete from b_sale_basket where ORDER_ID is null or ORDER_ID=''
свойства удаленных товаров в корзине потом почистить
DELETE
            FROM b_sale_basket_props
            WHERE b_sale_basket_props.BASKET_ID NOT IN (
                SELECT b_sale_basket.ID FROM b_sale_basket
            );

отменить ВСЕ неоплаченные заказы
\Bitrix\Main\Loader::includeModule('sale');
$dbRes = \Bitrix\Sale\Order::getList([
   'select' => ['ID'],
 'filter' => [
     "STATUS_ID"=>"N",
     "PAYED" => "N", //неоплаченные
     "CANCELED" =>"N", //неотмененные
 ],
 'order' => ['ID' => 'DESC']
]);
$i = 0;
while ($order = $dbRes->fetch()){
  $i++;
   var_dump($order);
   CSaleOrder::Update($order["ID"], ["CANCELED" =>"Y"]);
}
echo $i;
апдейт
для отмены лучше
\CSaleOrder::CancelOrder($orderId, "Y", "reason cancel text");
Задача:
автоматическое закрытие неоплаченных заказов
  • обычными пользователями спустя 30 дней после их создания.
  • дилеров спустя 90 дней после их создания.
CSaleOrder::Update  использует глобального $USER, а он в агентах не определен
Call to a member function GetUserGroupArray() on null (0)
/home/bitrix/ext_www/git.nikaverro.com/bitrix/modules/sale/lib/compatible/ordercompatibility.php:224
заменила на CSaleOrder::CancelOrder

в init.php
function CancelUnpaidOrders(): array{
    $arResult = [];
    if(\Bitrix\Main\Loader::includeModule('sale')) {
        //получим список дилеров
        $filter = [
            "ACTIVE"=>"Y",
            "GROUPS_ID" => 15
        ];
        $params = ['FIELDS'=>['ID']];
        $rsUsers = CUser::GetList(($by="LOGIN"), ($order="desc"), $filter,$params);
        $arDealersIds = [];
        while($arUser = $rsUsers->Fetch()){
            $arDealersIds[] = $arUser['ID'];
        }

        $day = new \Bitrix\Main\Type\DateTime();
        $day->add("-30 days"); //для юзеров

        $dbRes = \Bitrix\Sale\Order::getList([
            'select' => ['ID','USER_ID','DATE_INSERT'],
            'filter' => [
                "STATUS_ID" => "N",
                "PAYED" => "N", //неоплаченные
                "CANCELED" => "N", //неотмененные
                "<DATE_INSERT" => $day->format("d.m.Y H:i:s"), //дата создания более 30 дней назад
            ],
            'order' => ['ID' => 'DESC']
        ]);
        $day->add("-60 days"); //для дилеров

        while ($arOrder = $dbRes->fetch()) {
            $temp = $arOrder["ID"]." - ".$arOrder['DATE_INSERT']->format("d.m.Y H:i:s");
            if(in_array($arOrder['USER_ID'],$arDealersIds)){//если дилер
                if($arOrder['DATE_INSERT'] < $day){
                    \CSaleOrder::CancelOrder($arOrder["ID"], "Y", "payment date is overdue");
                    $arResult["dealer"][] = $temp;
                }
                else {
                    $arResult["dealer2"][] = $temp;
                }
            }
            else{
                $arResult["client"][] = $temp;
                \CSaleOrder::CancelOrder($arOrder["ID"], "Y", "payment date is overdue");
            }
        }
    }
    return $arResult;
}
агент раз в сутки
function CancelUnpaidOrdersAgent(): string
{
    CancelUnpaidOrders();
    return "CancelUnpaidOrdersAgent();";
}