1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
affiliate.php
См. документацию.
1<?php
2
8
10
11$GLOBALS["SALE_AFFILIATE"] = Array();
12$GLOBALS["SALE_AFFILIATE_TIER_TMP_CACHE"] = Array();
13$GLOBALS["SALE_PRODUCT_SECTION_CACHE"] = Array();
14$GLOBALS["BASE_LANG_CURRENCIES"] = array();
15$GLOBALS["SALE_CONVERT_CURRENCY_CACHE"] = array();
16
18{
19 private const VALUE_STORAGE_ID = 'SALE_AFFILIATE';
27 private static function getSession(): ?Session
28 {
30 $session = Application::getInstance()->getSession();
31 if (!$session->isAccessible())
32 {
33 return null;
34 }
35
36 return $session;
37 }
38
39 public static function CheckFields($ACTION, &$arFields, $ID = 0)
40 {
42 global $DB;
43
44 if ((is_set($arFields, "SITE_ID") || $ACTION=="ADD") && $arFields["SITE_ID"] == '')
45 {
46 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("ACGA1_NO_SITE"), "EMPTY_SITE_ID");
47 return false;
48 }
49 if ((is_set($arFields, "USER_ID") || $ACTION=="ADD") && intval($arFields["USER_ID"]) <= 0)
50 {
51 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("ACGA1_NO_USER"), "EMPTY_USER_ID");
52 return false;
53 }
54 if (is_set($arFields, "USER_ID"))
55 {
56 $dbUser = CUser::GetByID($arFields["USER_ID"]);
57 if (!$dbUser->Fetch())
58 {
59 $GLOBALS["APPLICATION"]->ThrowException(str_replace("#ID#", $arFields["USER_ID"], GetMessage("SKGU_NO_USER")), "ERROR_NO_USER_ID");
60 return false;
61 }
62 }
63 if ((is_set($arFields, "PLAN_ID") || $ACTION=="ADD") && intval($arFields["PLAN_ID"]) <= 0)
64 {
65 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("ACGA1_NO_PLAN"), "EMPTY_PLAN_ID");
66 return false;
67 }
68
69 $ID = intval($ID);
70 $arAffiliate = false;
71 if ($ACTION != "ADD")
72 {
73 if ($ID <= 0)
74 {
75 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("ACGA1_ERROR_FUNC"), "FUNCTION_ERROR");
76 return false;
77 }
78 else
79 {
80 $arAffiliate = CSaleAffiliate::GetByID($ID);
81 if (!$arAffiliate)
82 {
83 $GLOBALS["APPLICATION"]->ThrowException(str_replace("#ID#", $ID, GetMessage("ACGA1_NO_AFFILIATE")), "NO_AFFILIATE");
84 return false;
85 }
86 }
87 }
88
89 if (is_set($arFields, "AFFILIATE_ID") && intval($arFields["AFFILIATE_ID"]) <= 0)
90 $arFields["AFFILIATE_ID"] = false;
91
92 if ((is_set($arFields, "ACTIVE") || $ACTION=="ADD") && $arFields["ACTIVE"] != "Y")
93 $arFields["ACTIVE"] = "N";
94
95 if ((is_set($arFields, "FIX_PLAN") || $ACTION=="ADD") && $arFields["FIX_PLAN"] != "Y")
96 $arFields["FIX_PLAN"] = "N";
97
98 if ((is_set($arFields, "DATE_CREATE") || $ACTION=="ADD") && (!$GLOBALS["DB"]->IsDate($arFields["DATE_CREATE"], false, LANG, "FULL")))
99 {
100 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("ACGA1_BAD_DATE"), "ERROR_DATE_CREATE");
101 return false;
102 }
103
104 if (is_set($arFields, "PAID_SUM"))
105 {
106 $arFields["PAID_SUM"] = str_replace(",", ".", $arFields["PAID_SUM"]);
107 $arFields["PAID_SUM"] = DoubleVal($arFields["PAID_SUM"]);
108 }
109
110 if (is_set($arFields, "APPROVED_SUM"))
111 {
112 $arFields["APPROVED_SUM"] = str_replace(",", ".", $arFields["APPROVED_SUM"]);
113 $arFields["APPROVED_SUM"] = DoubleVal($arFields["APPROVED_SUM"]);
114 }
115
116 if (is_set($arFields, "PENDING_SUM"))
117 {
118 $arFields["PENDING_SUM"] = str_replace(",", ".", $arFields["PENDING_SUM"]);
119 $arFields["PENDING_SUM"] = DoubleVal($arFields["PENDING_SUM"]);
120 }
121
122 if (is_set($arFields, "ITEMS_NUMBER"))
123 $arFields["ITEMS_NUMBER"] = intval($arFields["ITEMS_NUMBER"]);
124
125 if (is_set($arFields, "ITEMS_SUM"))
126 {
127 $arFields["ITEMS_SUM"] = str_replace(",", ".", $arFields["ITEMS_SUM"]);
128 $arFields["ITEMS_SUM"] = DoubleVal($arFields["ITEMS_SUM"]);
129 }
130
131 unset($arFields['TIMESTAMP_X']);
132 $arFields['~TIMESTAMP_X'] = $DB->GetNowFunction();
133
134 return True;
135 }
136
137 public static function Delete($ID)
138 {
139 global $DB;
140
141 $ID = intval($ID);
142
143 $db_events = GetModuleEvents("sale", "OnBeforeAffiliateDelete");
144 while ($arEvent = $db_events->Fetch())
145 if (ExecuteModuleEventEx($arEvent, Array($ID))===false)
146 return false;
147
148 if ($ID <= 0)
149 return False;
150
152 return false;
153
154 unset($GLOBALS["SALE_AFFILIATE"]["SALE_AFFILIATE_CACHE_".$ID]);
155
156 $bResult = $DB->Query("DELETE FROM b_sale_affiliate WHERE ID = ".$ID." ", true);
157
158 $events = GetModuleEvents("sale", "OnAfterAffiliateDelete");
159 while ($arEvent = $events->Fetch())
160 ExecuteModuleEventEx($arEvent, Array($ID, $bResult));
161
162 return $bResult;
163 }
164
165 public static function GetByID($ID)
166 {
167 global $DB;
168
169 $ID = intval($ID);
170 if ($ID <= 0)
171 return false;
172
173 if (isset($GLOBALS["SALE_AFFILIATE"]["SALE_AFFILIATE_CACHE_".$ID]) && is_array($GLOBALS["SALE_AFFILIATE"]["SALE_AFFILIATE_CACHE_".$ID]))
174 {
175 return $GLOBALS["SALE_AFFILIATE"]["SALE_AFFILIATE_CACHE_".$ID];
176 }
177 else
178 {
179 $strSql =
180 "SELECT A.ID, A.SITE_ID, A.USER_ID, A.AFFILIATE_ID, A.PLAN_ID, A.ACTIVE, A.PAID_SUM, ".
181 " A.APPROVED_SUM, A.PENDING_SUM, A.ITEMS_NUMBER, A.ITEMS_SUM, A.AFF_SITE, A.AFF_DESCRIPTION, A.FIX_PLAN, ".
182 " ".$DB->DateToCharFunction("A.TIMESTAMP_X", "FULL")." as TIMESTAMP_X, ".
183 " ".$DB->DateToCharFunction("A.DATE_CREATE", "FULL")." as DATE_CREATE, ".
184 " ".$DB->DateToCharFunction("A.LAST_CALCULATE", "FULL")." as LAST_CALCULATE ".
185 "FROM b_sale_affiliate A ".
186 "WHERE A.ID = ".$ID." ";
187
188 $db_res = $DB->Query($strSql);
189 if ($res = $db_res->Fetch())
190 {
191 $GLOBALS["SALE_AFFILIATE"]["SALE_AFFILIATE_CACHE_".$ID] = $res;
192 return $GLOBALS["SALE_AFFILIATE"]["SALE_AFFILIATE_CACHE_".$ID];
193 }
194 }
195
196 return false;
197 }
198
199 public static function GetAffiliate($affiliateID = 0)
200 {
201 $request = Context::getCurrent()->getRequest();
202 $session = static::getSession();
203
204 $affiliateID = (int)$affiliateID;
205
206 if ($affiliateID <= 0)
207 {
208 $affiliateParam = Option::get('sale', 'affiliate_param_name', 'partner');
209 if ($affiliateParam !== '')
210 {
211 $rawValue = $request->getQuery($affiliateParam);
212 if (!is_array($rawValue))
213 {
214 $affiliateID = (int)$rawValue;
215 }
216 unset($rawValue);
217 }
218 }
219
220 if ($affiliateID <= 0 && $session !== null)
221 {
222 if ($session->has(self::VALUE_STORAGE_ID))
223 {
224 $affiliateID = (int)$session->get(self::VALUE_STORAGE_ID);
225 }
226 }
227
228 if ($affiliateID <= 0)
229 {
230 $affiliateID = (int)$request->getCookie(self::VALUE_STORAGE_ID);
231 }
232
233 if ($affiliateID > 0)
234 {
235 if ($session !== null)
236 {
237 $session->set(self::VALUE_STORAGE_ID, $affiliateID);
238 }
239
240 $cookieTime = (int)Option::get('sale', 'affiliate_life_time');
241 $cookieTime =
242 $cookieTime > 0
243 ? time() + $cookieTime * 86400
244 : null
245 ;
246 $secureCookie = Option::get('sale', 'use_secure_cookies') === 'Y' && $request->isHttps();
247
248 $cookie = new Cookie(self::VALUE_STORAGE_ID, (string)$affiliateID, $cookieTime);
249 $cookie
250 ->setSecure($secureCookie)
251 ->setHttpOnly(false)
252 ->setSpread(Cookie::SPREAD_DOMAIN | Cookie::SPREAD_SITES)
253 ;
254
255 $response = Context::getCurrent()->getResponse();
256
257 $response->addCookie($cookie);
258
259 unset($response);
260 unset($cookie);
261
262 }
263 unset($session);
264 unset($request);
265
266 return $affiliateID;
267 }
268
269 public static function Calculate($dateFrom = false, $dateTo = false, $datePlanFrom = false, $datePlanTo = false)
270 {
271 global $DB;
272
274 "ACTIVE" => "Y",
275 "ORDER_ALLOW_DELIVERY" => "Y"
276 );
277 if (!$dateFrom || $dateFrom == '')
278 {
279 if (!$dateTo || $dateTo == '')
280 $dateTo = date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")), time()+CTimeZone::GetOffset());
281
282 $arFilter[">=ORDER_DATE_ALLOW_DELIVERY"] = $dateFrom;
283 $arFilter["<ORDER_DATE_ALLOW_DELIVERY"] = $dateTo;
284 }
285 else
286 {
287 $dateTo = false;
288 }
289
290 if (!$datePlanFrom || $datePlanFrom == '')
291 $datePlanFrom = $dateFrom;
292
293 if (!$datePlanTo || $datePlanTo == '')
294 $datePlanTo = $dateTo;
295
296 $dbAffiliates = CSaleAffiliate::GetList(
297 array(),
298 $arFilter,
299 array(
300 "ID",
301 "SITE_ID",
302 "USER_ID",
303 "AFFILIATE_ID",
304 "PLAN_ID",
305 "ACTIVE",
306 "TIMESTAMP_X",
307 "DATE_CREATE",
308 "PAID_SUM",
309 "APPROVED_SUM",
310 "PENDING_SUM",
311 "ITEMS_NUMBER",
312 "ITEMS_SUM",
313 "FIX_PLAN",
314 "MAX" => "ORDER_ID"
315 )
316 );
317 while ($arAffiliates = $dbAffiliates->Fetch())
318 CSaleAffiliate::CalculateAffiliate($arAffiliates, $dateFrom, $dateTo, $datePlanFrom, $datePlanTo);
319
320 }
321
322 public static function CheckAffiliateFunc($affiliate)
323 {
324 if (is_array($affiliate))
325 {
326 $arAffiliate = $affiliate;
327 $affiliateID = intval($arAffiliate["ID"]);
328
329 if ($affiliateID <= 0)
330 {
331 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("ACGA1_ERROR_FUNC"), "FUNCTION_ERROR");
332 return false;
333 }
334 }
335 else
336 {
337 $affiliateID = intval($affiliate);
338 if ($affiliateID <= 0)
339 return False;
340
341 $dbAffiliate = CSaleAffiliate::GetList(
342 array(),
343 array("ID" => $affiliateID, "ACTIVE" => "Y", "PLAN_ACTIVE" => "Y"),
344 false,
345 false,
346 array("ID", "SITE_ID", "USER_ID", "AFFILIATE_ID", "PLAN_ID", "ACTIVE", "TIMESTAMP_X", "DATE_CREATE", "PAID_SUM", "APPROVED_SUM", "PENDING_SUM", "ITEMS_NUMBER", "ITEMS_SUM", "LAST_CALCULATE", "FIX_PLAN", "PLAN_BASE_RATE", "PLAN_BASE_RATE_TYPE", "PLAN_BASE_RATE_CURRENCY")
347 );
348 $arAffiliate = $dbAffiliate->Fetch();
349 if (!$arAffiliate)
350 {
351 $GLOBALS["APPLICATION"]->ThrowException(str_replace("#ID#", $affiliateID, GetMessage("ACGA1_NO_AFFILIATE")), "NO_AFFILIATE");
352 return false;
353 }
354 }
355
356 return $arAffiliate;
357 }
358
359 public static function SetAffiliatePlan($affiliate, $dateFrom = false, $dateTo = false)
360 {
361 global $DB;
362
363 $arAffiliate = CSaleAffiliate::CheckAffiliateFunc($affiliate);
364 if (!$arAffiliate)
365 return False;
366
367 // If not fixed plan
368 $affiliateID = intval($arAffiliate["ID"]);
369
370 // If fixed plan
371 if ($arAffiliate["FIX_PLAN"] == "Y")
372 {
373 $dbAffiliatePlan = CSaleAffiliatePlan::GetList(
374 array(),
375 array(
376 "ID" => $arAffiliate["PLAN_ID"],
377 "ACTIVE" => "Y",
378 "SITE_ID" => $arAffiliate["SITE_ID"]
379 ),
380 false,
381 false,
382 array("ID", "SITE_ID", "NAME", "TIMESTAMP_X", "ACTIVE", "BASE_RATE", "BASE_RATE_TYPE", "BASE_RATE_CURRENCY", "MIN_PAY", "MIN_PLAN_VALUE")
383 );
384 $arAffiliatePlan = $dbAffiliatePlan->Fetch();
385 if (!$arAffiliatePlan)
386 {
388 "ACTIVE" => "N"
389 );
390 $res = CSaleAffiliate::Update($affiliateID, $arFields);
391 if ($res)
392 $GLOBALS["APPLICATION"]->ThrowException(str_replace("#ID#", $affiliateID, GetMessage("ACGA1_NO_PLAN_DEACT")), "NO_PLAN");
393
394 return false;
395 }
396
397 return $arAffiliatePlan;
398 }
399
400 if (!$dateFrom || $dateFrom == '')
401 {
402 if ($arAffiliate["LAST_CALCULATE"] <> '')
403 $dateFrom = $arAffiliate["LAST_CALCULATE"];
404 else
405 $dateFrom = date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")), mktime(0, 0, 0, 1, 1, 1990));
406 }
407 if (!$dateTo || $dateTo == '')
408 $dateTo = date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")), time()+CTimeZone::GetOffset());
409
410 $affiliatePlanType = COption::GetOptionString("sale", "affiliate_plan_type", "N");
411
412 $itemsValue = 0;
413
414 if ($affiliatePlanType == "N")
415 {
416 $dbOrders = \Bitrix\Sale\Internals\OrderTable::getList(
417 array(
418 'filter' => array(
419 "=ALLOW_DELIVERY" => "Y",
420 ">=DATE_ALLOW_DELIVERY" => $dateFrom,
421 "<DATE_ALLOW_DELIVERY" => $dateTo,
422 "=AFFILIATE_ID" => $affiliateID,
423 "=LID" => $arAffiliate["SITE_ID"],
424 ),
425 'runtime' => array(
426 new \Bitrix\Main\Entity\ExpressionField('BASKET_QUANTITY', 'SUM(%s)', array('BASKET.QUANTITY'))
427 ),
428 'select' => array('BASKET_QUANTITY')
429 )
430 );
431 if ($arOrder = $dbOrders->fetch())
432 $itemsValue = $arOrder["BASKET_QUANTITY"];
433 }
434 else
435 {
436 $dbOrders = \Bitrix\Sale\Internals\OrderTable::getList(
437 array(
438 'filter' => array(
439 "=ALLOW_DELIVERY" => "Y",
440 ">=DATE_ALLOW_DELIVERY" => $dateFrom,
441 "<DATE_ALLOW_DELIVERY" => $dateTo,
442 "=AFFILIATE_ID" => $affiliateID,
443 "=LID" => $arAffiliate["SITE_ID"],
444 ),
445 'runtime' => array(
446 new \Bitrix\Main\Entity\ExpressionField('ORDER_SUM_PRICE', 'SUM(%s)', array('PRICE'))
447 ),
448 'select' => array('ORDER_SUM_PRICE')
449 )
450 );
451 if ($arOrder = $dbOrders->fetch())
452 $price = $arOrder["ORDER_SUM_PRICE"];
453
454 $dbOrders = \Bitrix\Sale\Internals\OrderTable::getList(
455 array(
456 'filter' => array(
457 "=ALLOW_DELIVERY" => "Y",
458 ">=DATE_ALLOW_DELIVERY" => $dateFrom,
459 "<DATE_ALLOW_DELIVERY" => $dateTo,
460 "=AFFILIATE_ID" => $affiliateID,
461 "=LID" => $arAffiliate["SITE_ID"],
462 ),
463 'runtime' => array(
464 new \Bitrix\Main\Entity\ExpressionField('ORDER_PRICE_DELIVERY', 'SUM(%s)', array('PRICE_DELIVERY'))
465 ),
466 'select' => array('ORDER_PRICE_DELIVERY')
467 )
468 );
469 if ($arOrder = $dbOrders->fetch())
470 $priceDelivery = $arOrder["ORDER_PRICE_DELIVERY"];
471
472 $dbOrders = \Bitrix\Sale\Internals\OrderTable::getList(
473 array(
474 'filter' => array(
475 "=ALLOW_DELIVERY" => "Y",
476 ">=DATE_ALLOW_DELIVERY" => $dateFrom,
477 "<DATE_ALLOW_DELIVERY" => $dateTo,
478 "=AFFILIATE_ID" => $affiliateID,
479 "=LID" => $arAffiliate["SITE_ID"],
480 ),
481 'runtime' => array(
482 new \Bitrix\Main\Entity\ExpressionField('ORDER_TAX_VALUE', 'SUM(%s)', array('TAX_VALUE'))
483 ),
484 'select' => array('ORDER_TAX_VALUE')
485 )
486 );
487 if ($arOrder = $dbOrders->fetch())
488 $priceTax = $arOrder["ORDER_TAX_VALUE"];
489
490 $itemsValue = $price - $priceDelivery - $priceTax;
491 }
492
493 if (DoubleVal($itemsValue) > 0)
494 {
495 $dbAffiliatePlan = CSaleAffiliatePlan::GetList(
496 array("MIN_PLAN_VALUE" => "DESC"),
497 array(
498 "+<=MIN_PLAN_VALUE" => $itemsValue,
499 "ACTIVE" => "Y",
500 "SITE_ID" => $arAffiliate["SITE_ID"]
501 ),
502 false,
503 false,
504 array("ID", "SITE_ID", "NAME", "TIMESTAMP_X", "ACTIVE", "BASE_RATE", "BASE_RATE_TYPE", "BASE_RATE_CURRENCY", "MIN_PAY", "MIN_PLAN_VALUE")
505 );
506 if ($arAffiliatePlan = $dbAffiliatePlan->Fetch())
507 {
508 if ($arAffiliate["FIX_PLAN"] != "Y")
509 {
511 "PLAN_ID" => $arAffiliatePlan["ID"]
512 );
513 $res = CSaleAffiliate::Update($affiliateID, $arFields);
514 if (!$res)
515 return false;
516 }
517 }
518 else
519 {
521 "ACTIVE" => "N"
522 );
523 $res = CSaleAffiliate::Update($affiliateID, $arFields);
524 if ($res)
525 $GLOBALS["APPLICATION"]->ThrowException(str_replace("#ID#", $affiliateID, GetMessage("ACGA1_NO_PLAN_DEACT")), "NO_PLAN");
526
527 return false;
528 }
529
530 return $arAffiliatePlan;
531 }
532 else
533 return true;
534 }
535
536 public static function CalculateAffiliate($affiliate, $dateFrom = false, $dateTo = false, $datePlanFrom = false, $datePlanTo = false)
537 {
538 global $DB;
539
540 $disableCalculate = false;
541
542 // Prepare function params - affiliate
543 $arAffiliate = CSaleAffiliate::CheckAffiliateFunc($affiliate);
544 if (!$arAffiliate)
545 return False;
546
547 $db_events = GetModuleEvents("sale", "OnBeforeAffiliateCalculate");
548 while ($arEvent = $db_events->Fetch())
549 {
550 if (ExecuteModuleEventEx($arEvent, Array(&$arAffiliate, &$dateFrom, &$dateTo, &$datePlanFrom, &$datePlanTo, &$disableCalculate)) === false)
551 {
552 return false;
553 }
554 }
555
556 $affiliateID = intval($arAffiliate["ID"]);
557 if ($disableCalculate === true)
558 {
559 return True;
560 }
561
562 if (!$dateFrom || $dateFrom == '')
563 {
564 if ($arAffiliate["LAST_CALCULATE"] <> '')
565 $dateFrom = $arAffiliate["LAST_CALCULATE"];
566 else
567 $dateFrom = date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")), mktime(0, 0, 0, 1, 1, 1990));
568 }
569 if (!$dateTo || $dateTo == '')
570 $dateTo = date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")), time()+CTimeZone::GetOffset());
571
572 // Get affiliate plan
573 $arAffiliatePlan = CSaleAffiliate::SetAffiliatePlan($arAffiliate, $datePlanFrom, $datePlanTo);
574
575 if (!$arAffiliatePlan)
576 return False;
577 if ($arAffiliatePlan && !is_array($arAffiliatePlan))
578 return true;
579
580 // Get affiliate plan params
581 $arPlanSections = array();
582 $dbPlanSection = CSaleAffiliatePlanSection::GetList(
583 array(),
584 array("PLAN_ID" => $arAffiliate["PLAN_ID"]),
585 false,
586 false,
587 array("ID", "MODULE_ID", "SECTION_ID", "RATE", "RATE_TYPE", "RATE_CURRENCY")
588 );
589 while ($arPlanSection = $dbPlanSection->Fetch())
590 {
591 $arPlanSections[$arPlanSection["MODULE_ID"].$arPlanSection["SECTION_ID"]] = $arPlanSection;
592 }
593
594 // Get affiliate parents
595 $arAffiliateParents = array();
596
597 $affiliateParent = intval($arAffiliate["AFFILIATE_ID"]);
598 $count = 0;
599 while (($affiliateParent > 0) && ($count < 5))
600 {
601 $dbAffiliateParent = CSaleAffiliate::GetList(
602 array(),
603 array("ID" => $affiliateParent, "ACTIVE" => "Y"),
604 false,
605 false,
606 array("ID", "AFFILIATE_ID")
607 );
608 if ($arAffiliateParent = $dbAffiliateParent->Fetch())
609 {
610 $count++;
611 $arAffiliateParents[] = $affiliateParent;
612 $affiliateParent = intval($arAffiliateParent["AFFILIATE_ID"]);
613 }
614 else
615 {
616 $affiliateParent = 0;
617 }
618 }
619
620 // Get tier
621 if (!array_key_exists("SALE_AFFILIATE_TIER_TMP_CACHE", $GLOBALS))
622 $GLOBALS["SALE_AFFILIATE_TIER_TMP_CACHE"] = array();
623
624 if (!array_key_exists($arAffiliate["SITE_ID"], $GLOBALS["SALE_AFFILIATE_TIER_TMP_CACHE"]))
625 {
626 $dbAffiliateTier = CSaleAffiliateTier::GetList(array(), array("SITE_ID" => $arAffiliate["SITE_ID"]), false, false, array("RATE1", "RATE2", "RATE3", "RATE4", "RATE5"));
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"]));
629 else
630 $GLOBALS["SALE_AFFILIATE_TIER_TMP_CACHE"][$arAffiliate["SITE_ID"]] = array(0, 0, 0, 0, 0);
631 }
632
633 // Orders cicle
634 $affiliateSum = 0;
635 $affiliateCurrency = CSaleLang::GetLangCurrency($arAffiliate["SITE_ID"]);
636
637 $dbOrders = \Bitrix\Sale\Internals\OrderTable::getList(
638 array(
639 'filter' => array(
640 "=ALLOW_DELIVERY" => 'Y',
641 ">=DATE_ALLOW_DELIVERY" => $dateFrom,
642 "<DATE_ALLOW_DELIVERY" => $dateTo,
643 "=AFFILIATE_ID" => $affiliateID,
644 "=LID" => $arAffiliate["SITE_ID"],
645 "=CANCELED" => 'N',
646 ),
647 'select' => array(
648 "ID",
649 "LID",
650 "PRICE_DELIVERY",
651 "PRICE",
652 "CURRENCY",
653 "TAX_VALUE",
654 "AFFILIATE_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'
661 ),
662 'order' => array('ID' => 'ASC')
663 )
664 );
665 while ($arOrder = $dbOrders->fetch())
666 {
667 $arProductSections = array();
668
669 if (!array_key_exists("SALE_PRODUCT_SECTION_CACHE", $GLOBALS))
670 $GLOBALS["SALE_PRODUCT_SECTION_CACHE"] = array();
671
672 if (array_key_exists($arOrder["BASKET_MODULE"].$arOrder["BASKET_PRODUCT_ID"], $GLOBALS["SALE_PRODUCT_SECTION_CACHE"]))
673 {
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);
677 }
678 else
679 {
680 if ($arOrder["BASKET_MODULE"] == "catalog")
681 {
682 CModule::IncludeModule("iblock");
683 CModule::IncludeModule("catalog");
684
685 $arSku = CCatalogSku::GetProductInfo($arOrder["BASKET_PRODUCT_ID"]);
686 if ($arSku && count($arSku) > 0)
687 $elementId = $arSku["ID"];
688 else
689 $elementId = $arOrder["BASKET_PRODUCT_ID"];
690
691 $elementSectionIterator = Bitrix\Iblock\SectionElementTable::getList(array(
692 'select' => array('IBLOCK_SECTION_ID'),
693 'filter' => array('=IBLOCK_ELEMENT_ID' => $elementId, '=ADDITIONAL_PROPERTY_ID' => null),
694 ));
695 $elementSectionList = [];
696 while ($elementSection = $elementSectionIterator->fetch())
697 {
698 $arSectionsChains = \CIBlockSection::GetNavChain(0, $elementSection['IBLOCK_SECTION_ID'], array('ID'), true);
699 foreach ($arSectionsChains as $arSectionsChain)
700 {
701 $elementSectionList[$arSectionsChain['ID']] = $arSectionsChain['ID'];
702 }
703 }
704 unset($elementSectionIterator);
705
706 if ($elementSectionList)
707 {
708 sort($elementSectionList);
710 'select' => array('ID', 'LEFT_MARGIN'),
711 'filter' => array('@ID' => $elementSectionList),
712 'order' => array('LEFT_MARGIN' => 'DESC')
713 ));
714 while($section = $sectionIterator->fetch())
715 {
716 $arProductSections[] = $section['ID'];
717 }
718 unset($sectionIterator);
719 }
720 unset($elementSectionList);
721 }
722 else
723 {
724 $events = GetModuleEvents("sale", "OnAffiliateGetSections");
725 if ($arEvent = $events->Fetch())
726 $arProductSections = ExecuteModuleEventEx($arEvent, Array($arOrder["BASKET_MODULE"], $arOrder["BASKET_PRODUCT_ID"]));
727 }
728
729 $GLOBALS["SALE_PRODUCT_SECTION_CACHE"] = $GLOBALS["SALE_PRODUCT_SECTION_CACHE"] + array($arOrder["BASKET_MODULE"].$arOrder["BASKET_PRODUCT_ID"] => $arProductSections);
730 if (count($GLOBALS["SALE_PRODUCT_SECTION_CACHE"]) > 20)
731 array_shift($GLOBALS["SALE_PRODUCT_SECTION_CACHE"]);
732 }
733
734 $realRate = $arAffiliatePlan["BASE_RATE"];
735 $realRateType = $arAffiliatePlan["BASE_RATE_TYPE"];
736 $realRateCurrency = $arAffiliatePlan["BASE_RATE_CURRENCY"];
737
738 $coountArProd = count($arProductSections);
739 for ($i = 0; $i < $coountArProd; $i++)
740 {
741 if (!empty($arPlanSections[$arOrder["BASKET_MODULE"].$arProductSections[$i]]))
742 {
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"];
746 break;
747 }
748 }
749
750 if ($realRateType == "P")
751 {
752 if ($arOrder["CURRENCY"] != $affiliateCurrency)
753 {
754 if (!array_key_exists("SALE_CONVERT_CURRENCY_CACHE", $GLOBALS))
755 $GLOBALS["SALE_CONVERT_CURRENCY_CACHE"] = array();
756
757 if (!array_key_exists($arOrder["CURRENCY"]."-".$affiliateCurrency, $GLOBALS["SALE_CONVERT_CURRENCY_CACHE"]))
758 $GLOBALS["SALE_CONVERT_CURRENCY_CACHE"][$arOrder["CURRENCY"]."-".$affiliateCurrency] = CCurrencyRates::GetConvertFactor($arOrder["CURRENCY"], $affiliateCurrency);
759
760 $affiliateSum += \Bitrix\Sale\PriceMaths::roundPrecision((($arOrder["BASKET_PRICE"] * $arOrder["BASKET_QUANTITY"]) * $GLOBALS["SALE_CONVERT_CURRENCY_CACHE"][$arOrder["CURRENCY"]."-".$affiliateCurrency] * $realRate) / 100);
761 }
762 else
763 {
764 $affiliateSum += \Bitrix\Sale\PriceMaths::roundPrecision((($arOrder["BASKET_PRICE"] * $arOrder["BASKET_QUANTITY"]) * $realRate) / 100);
765 }
766 }
767 else
768 {
769 if ($realRateCurrency != $affiliateCurrency)
770 {
771 if (!array_key_exists("SALE_CONVERT_CURRENCY_CACHE", $GLOBALS))
772 $GLOBALS["SALE_CONVERT_CURRENCY_CACHE"] = array();
773
774 if (!array_key_exists($realRateCurrency."-".$affiliateCurrency, $GLOBALS["SALE_CONVERT_CURRENCY_CACHE"]))
775 $GLOBALS["SALE_CONVERT_CURRENCY_CACHE"][$realRateCurrency."-".$affiliateCurrency] = CCurrencyRates::GetConvertFactor($realRateCurrency, $affiliateCurrency);
776
777 $affiliateSum += roundEx($realRate * $GLOBALS["SALE_CONVERT_CURRENCY_CACHE"][$realRateCurrency."-".$affiliateCurrency], SALE_VALUE_PRECISION);
778 }
779 else
780 {
781 $affiliateSum += roundEx($realRate, SALE_VALUE_PRECISION);
782 }
783 }
784 }
785
787 "=PENDING_SUM" => "PENDING_SUM + ".$affiliateSum,
788 "LAST_CALCULATE" => $dateTo
789 );
790 $res = CSaleAffiliate::Update($affiliateID, $arFields);
791 if (!$res)
792 return False;
793
794 if ($affiliateSum > 0)
795 {
796 $cnt = min(count($arAffiliateParents), count($GLOBALS["SALE_AFFILIATE_TIER_TMP_CACHE"][$arAffiliate["SITE_ID"]]));
797 for ($i = 0; $i < $cnt; $i++)
798 {
799 $affiliateSumTmp = roundEx($affiliateSum * $GLOBALS["SALE_AFFILIATE_TIER_TMP_CACHE"][$arAffiliate["SITE_ID"]][$i] / 100, SALE_VALUE_PRECISION);
800
802 "=PENDING_SUM" => "PENDING_SUM + ".$affiliateSumTmp
803 );
804 CSaleAffiliate::Update($arAffiliateParents[$i], $arFields);
805 }
806 }
807
808 $events = GetModuleEvents("sale", "OnAfterAffiliateCalculate");
809 while ($arEvent = $events->Fetch())
810 ExecuteModuleEventEx($arEvent, Array($affiliateID));
811
812 return True;
813 }
814
815 public static function PayAffiliate($affiliate, $payType, &$paySum)
816 {
817 global $DB;
818
819 $arAffiliate = CSaleAffiliate::CheckAffiliateFunc($affiliate);
820 if (!$arAffiliate)
821 return False;
822
823 $db_events = GetModuleEvents("sale", "OnBeforePayAffiliate");
824 while ($arEvent = $db_events->Fetch())
825 if (ExecuteModuleEventEx($arEvent, Array(&$arAffiliate, &$payType))===false)
826 return false;
827
828 $arPayTypes = array("U", "P");
829 if ($payType == '' || !in_array($payType, $arPayTypes))
830 {
831 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("ACGA1_BAD_FUNC1"), "ERROR_FUNCTION_CALL");
832 return False;
833 }
834
835 $arAffiliate["PENDING_SUM"] = str_replace(",", ".", $arAffiliate["PENDING_SUM"]);
836 $arAffiliate["PENDING_SUM"] = DoubleVal($arAffiliate["PENDING_SUM"]);
837 $paySum = $arAffiliate["PENDING_SUM"];
838
839 if ($arAffiliate["PENDING_SUM"] > 0)
840 {
841 if (!array_key_exists("BASE_LANG_CURRENCIES", $GLOBALS))
842 $GLOBALS["BASE_LANG_CURRENCIES"] = array();
843
844 if (!array_key_exists($arAffiliate["SITE_ID"], $GLOBALS["BASE_LANG_CURRENCIES"]))
845 $GLOBALS["BASE_LANG_CURRENCIES"][$arAffiliate["SITE_ID"]] = CSaleLang::GetLangCurrency($arAffiliate["SITE_ID"]);
846
847 if ($payType == "U")
848 {
849 if (!CSaleUserAccount::UpdateAccount($arAffiliate["USER_ID"], $arAffiliate["PENDING_SUM"], $GLOBALS["BASE_LANG_CURRENCIES"][$arAffiliate["SITE_ID"]], "AFFILIATE"))
850 {
851 if ($ex = $GLOBALS["APPLICATION"]->GetException())
852 $GLOBALS["APPLICATION"]->ThrowException($ex->GetString(), "ACCT_UPDATE_ERROR");
853 else
854 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("ACGA1_ERROR_TRANSF_MONEY"), "ACCT_UPDATE_ERROR");
855
856 return False;
857 }
858 //$arFields = array("PENDING_SUM" => 0);
859 }
860 //else
861 //{
862 // $arFields = array("=PAID_SUM" => "PAID_SUM + PENDING_SUM", "PENDING_SUM" => 0);
863 //}
864 $arFields = array("=PAID_SUM" => "PAID_SUM + PENDING_SUM", "PENDING_SUM" => 0);
865
866 if (!CSaleAffiliate::Update($arAffiliate["ID"], $arFields))
867 {
868 if ($ex = $GLOBALS["APPLICATION"]->GetException())
869 $GLOBALS["APPLICATION"]->ThrowException($ex->GetString().(($payType == "U") ? GetMessage("ACGA1_TRANSF_MONEY") : ""), "AF_UPDATE_ERROR");
870 else
871 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("ACGA1_ERROR_UPDATE_SUM").(($payType == "U") ? GetMessage("ACGA1_TRANSF_MONEY") : ""), "AF_UPDATE_ERROR");
872
873 return False;
874 }
875
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"]],
881 "DEBIT" => "Y",
882 "DESCRIPTION" => "AFFILIATE_IN",
883 "EMPLOYEE_ID" => ($GLOBALS["USER"]->IsAuthorized() ? $GLOBALS["USER"]->GetID() : False)
884 );
886
887 if ($payType == "U")
888 {
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"]],
894 "DEBIT" => "N",
895 "DESCRIPTION" => "AFFILIATE_ACCT",
896 "EMPLOYEE_ID" => ($GLOBALS["USER"]->IsAuthorized() ? $GLOBALS["USER"]->GetID() : False)
897 );
899 }
900 }
901
902 $ID = $arAffiliate["ID"];
903 $events = GetModuleEvents("sale", "OnAfterPayAffiliate");
904 while ($arEvent = $events->Fetch())
905 ExecuteModuleEventEx($arEvent, Array($ID));
906
907 return True;
908 }
909
910 public static function ClearAffiliateSum($affiliate)
911 {
912 global $DB;
913
914 $arAffiliate = CSaleAffiliate::CheckAffiliateFunc($affiliate);
915 if (!$arAffiliate)
916 return False;
917
918 $arAffiliate["PAID_SUM"] = str_replace(",", ".", $arAffiliate["PAID_SUM"]);
919 $arAffiliate["PAID_SUM"] = DoubleVal($arAffiliate["PAID_SUM"]);
920
921 if ($arAffiliate["PAID_SUM"] > 0)
922 {
923 if (!array_key_exists("BASE_LANG_CURRENCIES", $GLOBALS))
924 $GLOBALS["BASE_LANG_CURRENCIES"] = array();
925
926 if (!array_key_exists($arAffiliate["SITE_ID"], $GLOBALS["BASE_LANG_CURRENCIES"]))
927 $GLOBALS["BASE_LANG_CURRENCIES"][$arAffiliate["SITE_ID"]] = CSaleLang::GetLangCurrency($arAffiliate["SITE_ID"]);
928
929 if (!CSaleAffiliate::Update($arAffiliate["ID"], array("PAID_SUM" => 0)))
930 {
931 if ($ex = $GLOBALS["APPLICATION"]->GetException())
932 $GLOBALS["APPLICATION"]->ThrowException($ex->GetString(), "AF_UPDATE_ERROR");
933 else
934 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("ACGA1_ERROR_UPDATE_SUM"), "AF_UPDATE_ERROR");
935
936 return False;
937 }
938
940 "AFFILIATE_ID" => $arAffiliate["ID"],
941 "TRANSACT_DATE" => date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL", SITE_ID))),
942 "AMOUNT" => $arAffiliate["PAID_SUM"],
943 "CURRENCY" => $GLOBALS["BASE_LANG_CURRENCIES"][$arAffiliate["SITE_ID"]],
944 "DEBIT" => "N",
945 "DESCRIPTION" => "AFFILIATE_CLEAR",
946 "EMPLOYEE_ID" => ($GLOBALS["USER"]->IsAuthorized() ? $GLOBALS["USER"]->GetID() : False)
947 );
949 }
950
951 return True;
952 }
953
954 public static function OnBeforeUserDelete($UserID)
955 {
956 global $DB;
957 if (intval($UserID) <= 0)
958 {
959 $GLOBALS["APPLICATION"]->ThrowException("Empty user ID", "EMPTY_USER_ID");
960 return false;
961 }
962
963 $dbAffiliate = CSaleAffiliate::GetList(array(), array("USER_ID" => $UserID), false, array("nTopCount" => 1), array("ID", "USER_ID"));
964 if ($arAffiliate = $dbAffiliate->Fetch())
965 {
966 $GLOBALS["APPLICATION"]->ThrowException(str_replace("#USER_ID#", $UserID, GetMessage("AF_ERROR_USER")), "ERROR_AFFILIATE");
967 return False;
968 }
969 return true;
970 }
971}
$count
Определения admin_tab.php:4
$affiliateParam
Определения affiliate.php:2
$db_res
Определения options_user_settings.php:8
if(!Loader::includeModule('catalog')) if(!AccessController::getCurrent() ->check(ActionDictionary::ACTION_PRICE_EDIT)) if(!check_bitrix_sessid()) $request
Определения catalog_reindex.php:36
static getInstance()
Определения application.php:98
static getList(array $parameters=array())
Определения datamanager.php:431
static roundPrecision($value)
Определения pricemaths.php:16
static GetConvertFactor($curFrom, $curTo, $valDate="")
Определения currency_rate.php:407
Определения affiliate.php:18
static CheckAffiliateFunc($affiliate)
Определения affiliate.php:322
static Delete($ID)
Определения affiliate.php:137
static GetAffiliate($affiliateID=0)
Определения affiliate.php:199
static GetByID($ID)
Определения affiliate.php:165
static SetAffiliatePlan($affiliate, $dateFrom=false, $dateTo=false)
Определения affiliate.php:359
static OnBeforeUserDelete($UserID)
Определения affiliate.php:954
static PayAffiliate($affiliate, $payType, &$paySum)
Определения affiliate.php:815
static CheckFields($ACTION, &$arFields, $ID=0)
Определения affiliate.php:39
static Calculate($dateFrom=false, $dateTo=false, $datePlanFrom=false, $datePlanTo=false)
Определения affiliate.php:269
static ClearAffiliateSum($affiliate)
Определения affiliate.php:910
static CalculateAffiliate($affiliate, $dateFrom=false, $dateTo=false, $datePlanFrom=false, $datePlanTo=false)
Определения affiliate.php:536
static OnAffiliateDelete($affiliateID)
Определения affiliate_transact.php:60
static UpdateAccount($userID, $sum, $currency, $description="", $orderID=0, $notes="", $paymentId=null)
Определения user.php:589
static GetList($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
Определения affiliate.php:9
static Update($ID, $arFields)
Определения affiliate.php:224
static GetList($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
Определения affiliate_plan.php:9
static GetList($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
Определения affiliate_plan_section.php:7
static GetList($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
Определения affiliate_tier.php:7
static Add($arFields)
Определения affiliate_transact.php:135
static GetLangCurrency($siteId)
Определения settings.php:52
$arFields
Определения dblapprove.php:5
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$res
Определения filter_act.php:7
if($ajaxMode) $ID
Определения get_user.php:27
global $DB
Определения cron_frame.php:29
$arSku
Определения csv_new_run.php:183
$ACTION
Определения csv_new_setup.php:27
roundEx($value, $prec=0)
Определения tools.php:4635
ExecuteModuleEventEx($arEvent, $arParams=[])
Определения tools.php:5214
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
Определения tools.php:5177
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
is_set($a, $k=false)
Определения tools.php:2133
GetMessage($name, $aReplace=null)
Определения tools.php:3397
Определения culture.php:9
Определения ufield.php:9
$GLOBALS['____1690880296']
Определения license.php:1
$i
Определения factura.php:643
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
const SALE_VALUE_PRECISION
Определения include.php:46
$response
Определения result.php:21
const SITE_ID
Определения sonet_set_content_view.php:12
$GLOBALS['_____370096793']
Определения update_client.php:1
$arFilter
Определения user_search.php:106