201 $request = Context::getCurrent()->getRequest();
202 $session = static::getSession();
204 $affiliateID = (int)$affiliateID;
206 if ($affiliateID <= 0)
208 $affiliateParam = Option::get(
'sale',
'affiliate_param_name',
'partner');
212 if (!is_array($rawValue))
214 $affiliateID = (int)$rawValue;
220 if ($affiliateID <= 0 && $session !==
null)
222 if ($session->has(self::VALUE_STORAGE_ID))
224 $affiliateID = (int)$session->get(self::VALUE_STORAGE_ID);
228 if ($affiliateID <= 0)
230 $affiliateID = (int)
$request->getCookie(self::VALUE_STORAGE_ID);
233 if ($affiliateID > 0)
235 if ($session !==
null)
237 $session->set(self::VALUE_STORAGE_ID, $affiliateID);
240 $cookieTime = (int)Option::get(
'sale',
'affiliate_life_time');
243 ? time() + $cookieTime * 86400
246 $secureCookie = Option::get(
'sale',
'use_secure_cookies') ===
'Y' &&
$request->isHttps();
248 $cookie =
new Cookie(self::VALUE_STORAGE_ID, (
string)$affiliateID, $cookieTime);
250 ->setSecure($secureCookie)
252 ->setSpread(Cookie::SPREAD_DOMAIN | Cookie::SPREAD_SITES)
255 $response = Context::getCurrent()->getResponse();
269 public static function Calculate($dateFrom =
false, $dateTo =
false, $datePlanFrom =
false, $datePlanTo =
false)
275 "ORDER_ALLOW_DELIVERY" =>
"Y"
277 if (!$dateFrom || $dateFrom ==
'')
279 if (!$dateTo || $dateTo ==
'')
280 $dateTo = date(
$DB->DateFormatToPHP(CSite::GetDateFormat(
"FULL")), time()+CTimeZone::GetOffset());
282 $arFilter[
">=ORDER_DATE_ALLOW_DELIVERY"] = $dateFrom;
283 $arFilter[
"<ORDER_DATE_ALLOW_DELIVERY"] = $dateTo;
290 if (!$datePlanFrom || $datePlanFrom ==
'')
291 $datePlanFrom = $dateFrom;
293 if (!$datePlanTo || $datePlanTo ==
'')
294 $datePlanTo = $dateTo;
317 while ($arAffiliates = $dbAffiliates->Fetch())
368 $affiliateID = intval($arAffiliate[
"ID"]);
371 if ($arAffiliate[
"FIX_PLAN"] ==
"Y")
376 "ID" => $arAffiliate[
"PLAN_ID"],
378 "SITE_ID" => $arAffiliate[
"SITE_ID"]
382 array(
"ID",
"SITE_ID",
"NAME",
"TIMESTAMP_X",
"ACTIVE",
"BASE_RATE",
"BASE_RATE_TYPE",
"BASE_RATE_CURRENCY",
"MIN_PAY",
"MIN_PLAN_VALUE")
384 $arAffiliatePlan = $dbAffiliatePlan->Fetch();
385 if (!$arAffiliatePlan)
392 $GLOBALS[
"APPLICATION"]->ThrowException(str_replace(
"#ID#", $affiliateID,
GetMessage(
"ACGA1_NO_PLAN_DEACT")),
"NO_PLAN");
397 return $arAffiliatePlan;
400 if (!$dateFrom || $dateFrom ==
'')
402 if ($arAffiliate[
"LAST_CALCULATE"] <>
'')
403 $dateFrom = $arAffiliate[
"LAST_CALCULATE"];
405 $dateFrom = date(
$DB->DateFormatToPHP(CSite::GetDateFormat(
"FULL")), mktime(0, 0, 0, 1, 1, 1990));
407 if (!$dateTo || $dateTo ==
'')
408 $dateTo = date(
$DB->DateFormatToPHP(CSite::GetDateFormat(
"FULL")), time()+CTimeZone::GetOffset());
410 $affiliatePlanType = COption::GetOptionString(
"sale",
"affiliate_plan_type",
"N");
414 if ($affiliatePlanType ==
"N")
416 $dbOrders = \Bitrix\Sale\Internals\OrderTable::getList(
419 "=ALLOW_DELIVERY" =>
"Y",
420 ">=DATE_ALLOW_DELIVERY" => $dateFrom,
421 "<DATE_ALLOW_DELIVERY" => $dateTo,
422 "=AFFILIATE_ID" => $affiliateID,
423 "=LID" => $arAffiliate[
"SITE_ID"],
428 'select' =>
array(
'BASKET_QUANTITY')
431 if ($arOrder = $dbOrders->fetch())
432 $itemsValue = $arOrder[
"BASKET_QUANTITY"];
436 $dbOrders = \Bitrix\Sale\Internals\OrderTable::getList(
439 "=ALLOW_DELIVERY" =>
"Y",
440 ">=DATE_ALLOW_DELIVERY" => $dateFrom,
441 "<DATE_ALLOW_DELIVERY" => $dateTo,
442 "=AFFILIATE_ID" => $affiliateID,
443 "=LID" => $arAffiliate[
"SITE_ID"],
448 'select' =>
array(
'ORDER_SUM_PRICE')
451 if ($arOrder = $dbOrders->fetch())
452 $price = $arOrder[
"ORDER_SUM_PRICE"];
454 $dbOrders = \Bitrix\Sale\Internals\OrderTable::getList(
457 "=ALLOW_DELIVERY" =>
"Y",
458 ">=DATE_ALLOW_DELIVERY" => $dateFrom,
459 "<DATE_ALLOW_DELIVERY" => $dateTo,
460 "=AFFILIATE_ID" => $affiliateID,
461 "=LID" => $arAffiliate[
"SITE_ID"],
466 'select' =>
array(
'ORDER_PRICE_DELIVERY')
469 if ($arOrder = $dbOrders->fetch())
470 $priceDelivery = $arOrder[
"ORDER_PRICE_DELIVERY"];
472 $dbOrders = \Bitrix\Sale\Internals\OrderTable::getList(
475 "=ALLOW_DELIVERY" =>
"Y",
476 ">=DATE_ALLOW_DELIVERY" => $dateFrom,
477 "<DATE_ALLOW_DELIVERY" => $dateTo,
478 "=AFFILIATE_ID" => $affiliateID,
479 "=LID" => $arAffiliate[
"SITE_ID"],
484 'select' =>
array(
'ORDER_TAX_VALUE')
487 if ($arOrder = $dbOrders->fetch())
488 $priceTax = $arOrder[
"ORDER_TAX_VALUE"];
490 $itemsValue = $price - $priceDelivery - $priceTax;
493 if (DoubleVal($itemsValue) > 0)
496 array(
"MIN_PLAN_VALUE" =>
"DESC"),
498 "+<=MIN_PLAN_VALUE" => $itemsValue,
500 "SITE_ID" => $arAffiliate[
"SITE_ID"]
504 array(
"ID",
"SITE_ID",
"NAME",
"TIMESTAMP_X",
"ACTIVE",
"BASE_RATE",
"BASE_RATE_TYPE",
"BASE_RATE_CURRENCY",
"MIN_PAY",
"MIN_PLAN_VALUE")
506 if ($arAffiliatePlan = $dbAffiliatePlan->Fetch())
508 if ($arAffiliate[
"FIX_PLAN"] !=
"Y")
511 "PLAN_ID" => $arAffiliatePlan[
"ID"]
525 $GLOBALS[
"APPLICATION"]->ThrowException(str_replace(
"#ID#", $affiliateID,
GetMessage(
"ACGA1_NO_PLAN_DEACT")),
"NO_PLAN");
530 return $arAffiliatePlan;
536 public static function CalculateAffiliate($affiliate, $dateFrom =
false, $dateTo =
false, $datePlanFrom =
false, $datePlanTo =
false)
540 $disableCalculate =
false;
548 while ($arEvent = $db_events->Fetch())
550 if (
ExecuteModuleEventEx($arEvent, Array(&$arAffiliate, &$dateFrom, &$dateTo, &$datePlanFrom, &$datePlanTo, &$disableCalculate)) ===
false)
556 $affiliateID = intval($arAffiliate[
"ID"]);
557 if ($disableCalculate ===
true)
562 if (!$dateFrom || $dateFrom ==
'')
564 if ($arAffiliate[
"LAST_CALCULATE"] <>
'')
565 $dateFrom = $arAffiliate[
"LAST_CALCULATE"];
567 $dateFrom = date(
$DB->DateFormatToPHP(CSite::GetDateFormat(
"FULL")), mktime(0, 0, 0, 1, 1, 1990));
569 if (!$dateTo || $dateTo ==
'')
570 $dateTo = date(
$DB->DateFormatToPHP(CSite::GetDateFormat(
"FULL")), time()+CTimeZone::GetOffset());
575 if (!$arAffiliatePlan)
577 if ($arAffiliatePlan && !is_array($arAffiliatePlan))
581 $arPlanSections =
array();
584 array(
"PLAN_ID" => $arAffiliate[
"PLAN_ID"]),
587 array(
"ID",
"MODULE_ID",
"SECTION_ID",
"RATE",
"RATE_TYPE",
"RATE_CURRENCY")
589 while ($arPlanSection = $dbPlanSection->Fetch())
591 $arPlanSections[$arPlanSection[
"MODULE_ID"].$arPlanSection[
"SECTION_ID"]] = $arPlanSection;
595 $arAffiliateParents =
array();
597 $affiliateParent = intval($arAffiliate[
"AFFILIATE_ID"]);
599 while (($affiliateParent > 0) && (
$count < 5))
603 array(
"ID" => $affiliateParent,
"ACTIVE" =>
"Y"),
606 array(
"ID",
"AFFILIATE_ID")
608 if ($arAffiliateParent = $dbAffiliateParent->Fetch())
611 $arAffiliateParents[] = $affiliateParent;
612 $affiliateParent = intval($arAffiliateParent[
"AFFILIATE_ID"]);
616 $affiliateParent = 0;
621 if (!array_key_exists(
"SALE_AFFILIATE_TIER_TMP_CACHE",
$GLOBALS))
624 if (!array_key_exists($arAffiliate[
"SITE_ID"],
$GLOBALS[
"SALE_AFFILIATE_TIER_TMP_CACHE"]))
627 if ($arAffiliateTier = $dbAffiliateTier->Fetch())
628 $GLOBALS[
"SALE_AFFILIATE_TIER_TMP_CACHE"][$arAffiliate[
"SITE_ID"]] =
array(DoubleVal($arAffiliateTier[
"RATE1"]), DoubleVal($arAffiliateTier[
"RATE2"]), DoubleVal($arAffiliateTier[
"RATE3"]), DoubleVal($arAffiliateTier[
"RATE4"]), DoubleVal($arAffiliateTier[
"RATE5"]));
630 $GLOBALS[
"SALE_AFFILIATE_TIER_TMP_CACHE"][$arAffiliate[
"SITE_ID"]] =
array(0, 0, 0, 0, 0);
637 $dbOrders = \Bitrix\Sale\Internals\OrderTable::getList(
640 "=ALLOW_DELIVERY" =>
'Y',
641 ">=DATE_ALLOW_DELIVERY" => $dateFrom,
642 "<DATE_ALLOW_DELIVERY" => $dateTo,
643 "=AFFILIATE_ID" => $affiliateID,
644 "=LID" => $arAffiliate[
"SITE_ID"],
655 "BASKET_QUANTITY" =>
'BASKET.QUANTITY',
656 "BASKET_PRODUCT_ID" =>
'BASKET.PRODUCT_ID',
657 "BASKET_MODULE" =>
'BASKET.MODULE',
658 "BASKET_PRICE" =>
'BASKET.PRICE',
659 "BASKET_CURRENCY" =>
'BASKET.CURRENCY',
660 "BASKET_DISCOUNT_PRICE" =>
'BASKET.DISCOUNT_PRICE'
662 'order' =>
array(
'ID' =>
'ASC')
665 while ($arOrder = $dbOrders->fetch())
667 $arProductSections =
array();
669 if (!array_key_exists(
"SALE_PRODUCT_SECTION_CACHE",
$GLOBALS))
672 if (array_key_exists($arOrder[
"BASKET_MODULE"].$arOrder[
"BASKET_PRODUCT_ID"],
$GLOBALS[
"SALE_PRODUCT_SECTION_CACHE"]))
674 $arProductSections =
$GLOBALS[
"SALE_PRODUCT_SECTION_CACHE"][$arOrder[
"BASKET_MODULE"].$arOrder[
"BASKET_PRODUCT_ID"]];
675 unset(
$GLOBALS[
"SALE_PRODUCT_SECTION_CACHE"][$arOrder[
"BASKET_MODULE"].$arOrder[
"BASKET_PRODUCT_ID"]]);
676 $GLOBALS[
"SALE_PRODUCT_SECTION_CACHE"] =
$GLOBALS[
"SALE_PRODUCT_SECTION_CACHE"] +
array($arOrder[
"BASKET_MODULE"].$arOrder[
"BASKET_PRODUCT_ID"] => $arProductSections);
680 if ($arOrder[
"BASKET_MODULE"] ==
"catalog")
682 CModule::IncludeModule(
"iblock");
683 CModule::IncludeModule(
"catalog");
685 $arSku = CCatalogSku::GetProductInfo($arOrder[
"BASKET_PRODUCT_ID"]);
687 $elementId =
$arSku[
"ID"];
689 $elementId = $arOrder[
"BASKET_PRODUCT_ID"];
691 $elementSectionIterator = Bitrix\Iblock\SectionElementTable::getList(
array(
692 'select' =>
array(
'IBLOCK_SECTION_ID'),
693 'filter' =>
array(
'=IBLOCK_ELEMENT_ID' => $elementId,
'=ADDITIONAL_PROPERTY_ID' =>
null),
695 $elementSectionList = [];
696 while ($elementSection = $elementSectionIterator->fetch())
698 $arSectionsChains = \CIBlockSection::GetNavChain(0, $elementSection[
'IBLOCK_SECTION_ID'],
array(
'ID'),
true);
699 foreach ($arSectionsChains as $arSectionsChain)
701 $elementSectionList[$arSectionsChain[
'ID']] = $arSectionsChain[
'ID'];
704 unset($elementSectionIterator);
706 if ($elementSectionList)
708 sort($elementSectionList);
710 'select' =>
array(
'ID',
'LEFT_MARGIN'),
711 'filter' =>
array(
'@ID' => $elementSectionList),
712 'order' =>
array(
'LEFT_MARGIN' =>
'DESC')
714 while($section = $sectionIterator->fetch())
716 $arProductSections[] = $section[
'ID'];
718 unset($sectionIterator);
720 unset($elementSectionList);
725 if ($arEvent = $events->Fetch())
726 $arProductSections =
ExecuteModuleEventEx($arEvent, Array($arOrder[
"BASKET_MODULE"], $arOrder[
"BASKET_PRODUCT_ID"]));
729 $GLOBALS[
"SALE_PRODUCT_SECTION_CACHE"] =
$GLOBALS[
"SALE_PRODUCT_SECTION_CACHE"] +
array($arOrder[
"BASKET_MODULE"].$arOrder[
"BASKET_PRODUCT_ID"] => $arProductSections);
731 array_shift(
$GLOBALS[
"SALE_PRODUCT_SECTION_CACHE"]);
734 $realRate = $arAffiliatePlan[
"BASE_RATE"];
735 $realRateType = $arAffiliatePlan[
"BASE_RATE_TYPE"];
736 $realRateCurrency = $arAffiliatePlan[
"BASE_RATE_CURRENCY"];
738 $coountArProd =
count($arProductSections);
739 for (
$i = 0;
$i < $coountArProd;
$i++)
741 if (!empty($arPlanSections[$arOrder[
"BASKET_MODULE"].$arProductSections[
$i]]))
743 $realRate = $arPlanSections[$arOrder[
"BASKET_MODULE"].$arProductSections[
$i]][
"RATE"];
744 $realRateType = $arPlanSections[$arOrder[
"BASKET_MODULE"].$arProductSections[
$i]][
"RATE_TYPE"];
745 $realRateCurrency = $arPlanSections[$arOrder[
"BASKET_MODULE"].$arProductSections[
$i]][
"RATE_CURRENCY"];
750 if ($realRateType ==
"P")
752 if ($arOrder[
"CURRENCY"] != $affiliateCurrency)
754 if (!array_key_exists(
"SALE_CONVERT_CURRENCY_CACHE",
$GLOBALS))
757 if (!array_key_exists($arOrder[
"CURRENCY"].
"-".$affiliateCurrency,
$GLOBALS[
"SALE_CONVERT_CURRENCY_CACHE"]))
769 if ($realRateCurrency != $affiliateCurrency)
771 if (!array_key_exists(
"SALE_CONVERT_CURRENCY_CACHE",
$GLOBALS))
774 if (!array_key_exists($realRateCurrency.
"-".$affiliateCurrency,
$GLOBALS[
"SALE_CONVERT_CURRENCY_CACHE"]))
787 "=PENDING_SUM" =>
"PENDING_SUM + ".$affiliateSum,
788 "LAST_CALCULATE" => $dateTo
794 if ($affiliateSum > 0)
796 $cnt = min(
count($arAffiliateParents),
count(
$GLOBALS[
"SALE_AFFILIATE_TIER_TMP_CACHE"][$arAffiliate[
"SITE_ID"]]));
797 for (
$i = 0;
$i < $cnt;
$i++)
802 "=PENDING_SUM" =>
"PENDING_SUM + ".$affiliateSumTmp
809 while ($arEvent = $events->Fetch())
824 while ($arEvent = $db_events->Fetch())
828 $arPayTypes =
array(
"U",
"P");
829 if ($payType ==
'' || !in_array($payType, $arPayTypes))
831 $GLOBALS[
"APPLICATION"]->ThrowException(
GetMessage(
"ACGA1_BAD_FUNC1"),
"ERROR_FUNCTION_CALL");
835 $arAffiliate[
"PENDING_SUM"] = str_replace(
",",
".", $arAffiliate[
"PENDING_SUM"]);
836 $arAffiliate[
"PENDING_SUM"] = DoubleVal($arAffiliate[
"PENDING_SUM"]);
837 $paySum = $arAffiliate[
"PENDING_SUM"];
839 if ($arAffiliate[
"PENDING_SUM"] > 0)
841 if (!array_key_exists(
"BASE_LANG_CURRENCIES",
$GLOBALS))
844 if (!array_key_exists($arAffiliate[
"SITE_ID"],
$GLOBALS[
"BASE_LANG_CURRENCIES"]))
851 if ($ex =
$GLOBALS[
"APPLICATION"]->GetException())
852 $GLOBALS[
"APPLICATION"]->ThrowException($ex->GetString(),
"ACCT_UPDATE_ERROR");
854 $GLOBALS[
"APPLICATION"]->ThrowException(
GetMessage(
"ACGA1_ERROR_TRANSF_MONEY"),
"ACCT_UPDATE_ERROR");
864 $arFields =
array(
"=PAID_SUM" =>
"PAID_SUM + PENDING_SUM",
"PENDING_SUM" => 0);
868 if ($ex =
$GLOBALS[
"APPLICATION"]->GetException())
869 $GLOBALS[
"APPLICATION"]->ThrowException($ex->GetString().(($payType ==
"U") ?
GetMessage(
"ACGA1_TRANSF_MONEY") :
""),
"AF_UPDATE_ERROR");
871 $GLOBALS[
"APPLICATION"]->ThrowException(
GetMessage(
"ACGA1_ERROR_UPDATE_SUM").(($payType ==
"U") ?
GetMessage(
"ACGA1_TRANSF_MONEY") :
""),
"AF_UPDATE_ERROR");
877 "AFFILIATE_ID" => $arAffiliate[
"ID"],
878 "TRANSACT_DATE" => date(
$DB->DateFormatToPHP(CSite::GetDateFormat(
"FULL",
SITE_ID))),
879 "AMOUNT" => $arAffiliate[
"PENDING_SUM"],
880 "CURRENCY" =>
$GLOBALS[
"BASE_LANG_CURRENCIES"][$arAffiliate[
"SITE_ID"]],
882 "DESCRIPTION" =>
"AFFILIATE_IN",
883 "EMPLOYEE_ID" => (
$GLOBALS[
"USER"]->IsAuthorized() ?
$GLOBALS[
"USER"]->GetID() : False)
890 "AFFILIATE_ID" => $arAffiliate[
"ID"],
891 "TRANSACT_DATE" => date(
$DB->DateFormatToPHP(CSite::GetDateFormat(
"FULL",
SITE_ID))),
892 "AMOUNT" => $arAffiliate[
"PENDING_SUM"],
893 "CURRENCY" =>
$GLOBALS[
"BASE_LANG_CURRENCIES"][$arAffiliate[
"SITE_ID"]],
895 "DESCRIPTION" =>
"AFFILIATE_ACCT",
896 "EMPLOYEE_ID" => (
$GLOBALS[
"USER"]->IsAuthorized() ?
$GLOBALS[
"USER"]->GetID() : False)
902 $ID = $arAffiliate[
"ID"];
904 while ($arEvent = $events->Fetch())