Требовалось: почистить все корзины пользователей, которые БЕЗ заказа отменить все неоплаченные заказы |
через апи битрикса долго, решила через 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();";
} |