пятница, 21 сентября 2018 г.

Битрикс начисление на внутренний счет при изменении статуса заказа

Пост для истории, обнаружил сейчас что в драфте много лет лежит пост. Решил что раз он начал писаться, то достоин появиться, пусть даже спустя много лет :)


Событие OnSaleStatusOrder уже deprecated в продакшне не применять)
Смотрю на кусок кода и думаю ... как же ужасно выглядит сочетание UpperCamelCase и underscore и зачем я это сотворил :)

----------------
Недавно делал реализацию под битрикс функционала 100 рублей за друга


AddEventHandler("sale", "OnSaleStatusOrder", Array("check_sale_status_aff", "OnSaleStatusOrder_aff"));

class check_sale_status_aff
{

function OnSaleStatusOrder_aff($ID, $val)
{

// Код статуса заказа P = оплачен, F = отправлен, N = принят
if ($val == "P")
{
// Получаем параметры заказа
$arOrder = CSaleOrder::GetByID($ID);
$AFFILIATE_ID = $arOrder["AFFILIATE_ID"];
$PRICE = $arOrder["PRICE"];

//ПРОВЕРЯЕМ ЧТО СУММА ЗАКАЗА БОЛЬШЕ 500 рублей
//ПРОВЕРЯЕМ К КАКОМУ АФФИЛЕЙТУ ОТНОСИТСЯ ЗАКАЗ
//ПРОВЕРЯЕМ НАЧИСЛЯЛИ ЛИ ЗА ЭТОГО ПОЛЬЗОВАТЕЛЯ УЖЕ БОНУС
//НАЧИСЛЯЕМ БОНУС

$arFilter = Array("ID" => $arOrder["AFFILIATE_ID"]);
$rsUser = CSaleAffiliate::GetList(array(), $arFilter, false, false, array("USER_ID"));
$arUser = $rsUser->Fetch();
$aff_userid=$arUser["USER_ID"];

$arFilter = Array("USER_ID" => $arUser["USER_ID"], "DEBIT" => "Y", "AMOUNT" => "100");
$rsTran = CSaleUserTransact::GetList(array(), $arFilter, false, false, array());
$exist = $rsTran->GetNext();
if (!isset($exist['USER_ID'])AND $PRICE>=500 AND $aff_userid>0){
CSaleUserAccount::UpdateAccount($aff_userid,100 ,$arOrder['CURRENCY'], "Бонус за друга ID=".$arOrder['USER_ID'].", Заказ №=".$ID, $ID);
}

}

}

}

Как заставить элементы каталога обновиться

  Периодически возникает такая ситуация при разработке или отладке обмена с 1С, что требуется загружать одни и те же давно подготовленные файлы. В своём обычном поведении битрикс второй раз загружать один и тот же файл не будет, если в нем не поменять определенные данные.
  Да можно заходить в каждый файл и править его. Или заходить в каждый элемент каталога, менять там что-то и пересохранять, но согласитесь это так себе вариант.
  А если же файл большой или для теста надо обновлять много данных?
  Поэтому самый простой вариант будет для каталога сбрасывать запросом к базе, тот самый вычисленный хэш, который проверяется при загрузке элементов.
----------
update b_iblock_element
set tmp_id = 0
where
iblock_id = 1
and tmp_id <> '0'

tmp_id искомый хэш, типа varchar
При обновлении "Не обменом" он выставялется в значение '0'.
При обновлении "Обменом" он выставляется в значение тега <НомерВерсии>