Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Калькуляция аффилиата из init.php

00 голосов
4
Битрикс не дает вставить такое длинное сообщение на форум. Перенес код на pastebin

Задача: проводить калькуляция аффилиатов автоматически.
Допустим, я хочу делать это каждый раз при изменении статуса доставки.
В init.php делаю событие свое. А в нем пишу вот такую вещь:

Код
function calculateAffiliates($orderId, $payed){
   if ($payed == "Y")
   {
      $arOrder = CSaleOrder::GetByID($orderId);
      CSaleAffiliate::CalculateAffiliate($arOrder["AFFILIATE_ID"], false, false, false, false);
   }
}


Кстати, я использую функцию в точности также, как она используется в modules/sale/admin/affiliate.php
Там при выборе списка аффилиатов и выборе пункта меня производится калькуляция. Код точно такой же.
Рисунок

И почему-то меняется дата последней калькуляции, но не начисляется сумма. А если я делаю то же самое через админку, то все работает.

Решил поискать причину сам и поиски завели меня в файл bitrix/monules/sale/general/affiliate.php
В нем в строке 487 выполняется вот такой код:
Код
      $dbOrders = CSaleOrder::GetList(
         array("ID" => "ASC"),
         array(
            "ALLOW_DELIVERY" => "Y",
            ">=DATE_ALLOW_DELIVERY" => $dateFrom,
            "<DATE_ALLOW_DELIVERY" => $dateTo,
            "AFFILIATE_ID" => $affiliateID,
            "LID" => $arAffiliate["SITE_ID"],
            "CANCELED" => "N"
         ),
         false,
         false,
         array(
            "ID",
            "LID",
            "PRICE_DELIVERY",
            "PRICE",
            "CURRENCY",
            "TAX_VALUE",
            "AFFILIATE_ID",
            "BASKET_QUANTITY",
            "BASKET_PRODUCT_ID",
            "BASKET_MODULE",
            "BASKET_PRICE",
            "BASKET_CURRENCY",
            "BASKET_DISCOUNT_PRICE"
         )
      );

Этот код, как не сложно догадаться, выбирает все заказы у которых AFFILIATE_ID равен нужному нам. И возвращает, согласно документации, объект класса CDBResult, содержащий ассоциативные массивы с ключами.

Но дело в том, что при, казалось бы, одном и том же запросе результат работы совершенно разный.
Внимание, сейчас будут простыни. Оденьте шапочку из фольги.

1. Такой результат, когда я использую функцию сам.
2. А вот так, если это делается через админку.

И теперь если мы используем метод Fetch для первого объекта, то результатом будет пустой массив и сумма не начисляется. А если мы используем тот же метод для второго объекта, то результат будет удовлетворительный.
Код
$dbOrders->Fetch()


Внимание, вопрос: ?
спросил 27 Ноя, 13 от maxdj (480 баллов)
Получилось реализовать?

4 Ответы

00 голосов
При всем при этом, если я вызываю тот же самый метод из обычного php файла, то все отлично работает.
Но почему он не работает из init.php? Он мне нужен именно как реакция на событие.
ответил 21 Янв, 14 от maxdj (480 баллов)
00 голосов
Если я создаю экземпляр класса, то тоже ничего не получается.
Код
      $aff = new CSaleAffiliate();
      $aff->CalculateAffiliate($arOrder["AFFILIATE_ID"], false, false, false, false);

Все также — дата меняется, но сумма не начисляется.

А если вызывать подсчет для всех:
Код
$aff->Calculate();

То падает с ошибкой:
Fatal error: Call to a member function DateFormatToPHP() on a non-object in /.. ./bitrix/modules/sale/general/affiliate.php on line 198

Какое все же решение задачи?
ответил 09 Май, 14 от maxdj (480 баллов)
00 голосов
Отвечает Александр Друзь:
ответил 05 Сен, 14 от maxdj (480 баллов)
00 голосов
Ну же, есть возможность получить оценку в журнал.
Не писать ведь мне в техподдержку, что встроенные классы не работают.
ответил 11 Янв, 15 от maxdj (480 баллов)

Похожие вопросы

0 голосов
4 ответов
0 голосов
6 ответов
спросил 09 Окт, 13 от Amentet (2,080 баллов)
0 голосов
7 ответов
спросил 24 Авг, 13 от Snezhka (2,240 баллов)
0 голосов
2 ответов
спросил 21 Авг, 13 от Shiori (180 баллов)
0 голосов
2 ответов
спросил 22 Июль, 13 от Cmeptb (160 баллов)