1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
discount_save.php
См. документацию.
1<?php
2
7
9{
10 public const ENTITY_ID = 1;
11
12 public const TYPE_PERCENT = 'P';
13 public const TYPE_FIX = 'F';
14
15 public const COUNT_TIME_ALL = 'U';
16 public const COUNT_TIME_INTERVAL = 'D';
17 public const COUNT_TIME_PERIOD = 'P';
18
19 public const ACTION_TIME_ALL = 'U';
20 public const ACTION_TIME_INTERVAL = 'D';
21 public const ACTION_TIME_PERIOD = 'P';
22
23 public const APPLY_MODE_REPLACE = 'R';
24 public const APPLY_MODE_ADD = 'A';
25 public const APPLY_MODE_DISABLE = 'D';
26
27 static protected $intDisable = 0;
28 static protected $intDiscountUserID = 0;
29 static protected $userGroups = array();
30 static protected $discountFilterCache = array();
31 static protected $discountResultCache = array();
32
33 public static function Enable()
34 {
35 self::$intDisable++;
36 }
37
38 public static function Disable()
39 {
40 self::$intDisable--;
41 }
42
43 public static function IsEnabled()
44 {
45 return (0 <= self::$intDisable);
46 }
47
48 public static function SetDiscountUserID($intUserID)
49 {
50 $intUserID = (int)$intUserID;
51 if ($intUserID > 0)
52 self::$intDiscountUserID = $intUserID;
53 }
54
55 public static function ClearDiscountUserID()
56 {
57 self::$intDiscountUserID = 0;
58 }
59
60 public static function GetDiscountUserID()
61 {
62 return self::$intDiscountUserID;
63 }
64
65 public static function GetDiscountSaveTypes($boolFull = false)
66 {
67 $boolFull = ($boolFull === true);
68 if ($boolFull)
69 {
70 return array(
71 self::TYPE_PERCENT => Loc::getMessage('BT_CAT_CAT_DSC_SV_TYPE_PERCENT'),
72 self::TYPE_FIX => Loc::getMessage('BT_CAT_CAT_DSC_SV_TYPE_FIX')
73 );
74 }
75 return array(
76 self::TYPE_PERCENT,
77 self::TYPE_FIX
78 );
79 }
80
81 public static function GetApplyModeList($extendedMode = false)
82 {
83 $extendedMode = ($extendedMode === true);
84 if ($extendedMode)
85 {
86 return array(
87 self::APPLY_MODE_REPLACE => Loc::getMessage('BX_CAT_DISCSAVE_APPLY_MODE_R'),
88 self::APPLY_MODE_ADD => Loc::getMessage('BX_CAT_DISCSAVE_APPLY_MODE_A'),
89 self::APPLY_MODE_DISABLE => Loc::getMessage('BX_CAT_DISCSAVE_APPLY_MODE_D')
90 );
91 }
92 return array(
93 self::APPLY_MODE_REPLACE,
94 self::APPLY_MODE_ADD,
95 self::APPLY_MODE_DISABLE
96 );
97 }
98
99 public static function CheckFields($strAction, &$arFields, $intID = 0)
100 {
101 global $APPLICATION;
102 global $DB;
103 global $USER;
104
105 $strAction = mb_strtoupper($strAction);
106 if ('UPDATE' != $strAction && 'ADD' != $strAction)
107 return false;
108 $intID = (int)$intID;
109
111
112 $boolResult = true;
113 $arMsg = array();
114
115 $clearFields = array(
116 'ID',
117 '~ID',
118 'UNPACK',
119 '~UNPACK',
120 '~CONDITIONS',
121 'CONDITIONS',
122 'USE_COUPONS',
123 '~USE_COUPONS',
124 'HANDLERS',
125 '~HANDLERS',
126 '~TYPE',
127 '~RENEWAL',
128 '~PRIORITY',
129 '~LAST_DISCOUNT',
130 '~VERSION',
131 'TIMESTAMP_X',
132 'DATE_CREATE',
133 '~DATE_CREATE',
134 '~MODIFIED_BY',
135 '~CREATED_BY'
136 );
137 if ($strAction == 'UPDATE')
138 $clearFields[] = 'CREATED_BY';
139 $arFields = array_filter($arFields, 'CCatalogDiscountSave::clearFields');
140 foreach ($clearFields as &$fieldName)
141 {
142 if (isset($arFields[$fieldName]))
143 unset($arFields[$fieldName]);
144 }
145 unset($fieldName, $clearFields);
146
147 $arFields['TYPE'] = self::ENTITY_ID;
148 $arFields["RENEWAL"] = 'N';
149 $arFields['PRIORITY'] = 1;
150 $arFields['LAST_DISCOUNT'] = 'N';
152 $arFields['USE_COUPONS'] = 'N';
153
154 if ((is_set($arFields, "SITE_ID") || $strAction=="ADD") && empty($arFields["SITE_ID"]))
155 {
156 $arMsg[] = array('id' => 'SITE_ID', 'text' => Loc::getMessage('BT_MOD_CAT_DSC_SV_ERR_EMPTY_SITE'));
157 $boolResult = false;
158 }
159 else
160 {
161 $rsSites = CSite::GetByID($arFields['SITE_ID']);
162 if (!$arSite = $rsSites->Fetch())
163 {
164 $arMsg[] = array('id' => 'SITE_ID','text' => Loc::getMessage('BT_MOD_CAT_DSC_SV_ERR_BAD_SITE'));
165 $boolResult = false;
166 }
167 }
168
169 if ((is_set($arFields, "NAME") || $strAction=="ADD") && (trim($arFields["NAME"]) == ''))
170 {
171 $arMsg[] = array('id' => 'NAME', 'text' => Loc::getMessage('BT_MOD_CAT_DSC_SV_ERR_EMPTY_NAME'));
172 $boolResult = false;
173 }
174 if ((is_set($arFields, "ACTIVE") || $strAction=="ADD") && $arFields["ACTIVE"] != "N")
175 $arFields["ACTIVE"] = "Y";
176 if ((is_set($arFields,'SORT') || $strAction == 'ADD') && intval($arFields['SORT']) <= 0)
177 $arFields['SORT'] = 500;
178 if ((is_set($arFields, "CURRENCY") || $strAction=="ADD") && empty($arFields["CURRENCY"]))
179 {
180 $arMsg[] = array('id' => 'CURRENCY', 'text' => Loc::getMessage('BT_MOD_CAT_DSC_SV_ERR_EMPTY_CURRENCY'));
181 $boolResult = false;
182 }
183 if ((is_set($arFields, "ACTIVE_FROM") || $strAction=="ADD") && (!$DB->IsDate($arFields["ACTIVE_FROM"], false, LANGUAGE_ID, "FULL")))
184 $arFields["ACTIVE_FROM"] = false;
185 if ((is_set($arFields, "ACTIVE_TO") || $strAction=="ADD") && (!$DB->IsDate($arFields["ACTIVE_TO"], false, LANGUAGE_ID, "FULL")))
186 $arFields["ACTIVE_TO"] = false;
187
188 if ((is_set($arFields,'COUNT_SIZE') || $strAction == 'ADD') && intval($arFields['COUNT_SIZE']) < 0)
189 $arFields['COUNT_SIZE'] = 0;
190 if ((is_set($arFields,'COUNT_TYPE') || $strAction == 'ADD') && !in_array($arFields['COUNT_TYPE'],array('D','M','Y')))
191 $arFields['COUNT_TYPE'] = 'Y';
192 if ((is_set($arFields, "COUNT_FROM") || $strAction=="ADD") && (!$DB->IsDate($arFields["COUNT_FROM"], false, LANGUAGE_ID, "FULL")))
193 $arFields["COUNT_FROM"] = false;
194 if ((is_set($arFields, "COUNT_TO") || $strAction=="ADD") && (!$DB->IsDate($arFields["COUNT_TO"], false, LANGUAGE_ID, "FULL")))
195 $arFields["COUNT_TO"] = false;
196
197 if (is_set($arFields,'COUNT_PERIOD'))
198 unset($arFields['COUNT_PERIOD']);
199 $strCountPeriod = self::COUNT_TIME_ALL;
200 if (is_set($arFields,'COUNT_SIZE') && intval($arFields['COUNT_SIZE']) > 0)
201 $strCountPeriod = self::COUNT_TIME_PERIOD;
202 if (!empty($arFields["COUNT_FROM"]) || !empty($arFields["COUNT_TO"]))
203 $strCountPeriod = self::COUNT_TIME_INTERVAL;
204 $arFields['COUNT_PERIOD'] = $strCountPeriod;
205
206 if ((is_set($arFields,'ACTION_SIZE') || $strAction == 'ADD') && intval($arFields['ACTION_SIZE']) < 0)
207 $arFields['ACTION_SIZE'] = 0;
208 if ((is_set($arFields,'ACTION_TYPE') || $strAction == 'ADD') && !in_array($arFields['ACTION_TYPE'],array('D','M','Y')))
209 $arFields['ACTION_TYPE'] = 'Y';
210
211 $intUserID = 0;
212 $boolUserExist = CCatalog::IsUserExists();
213 if ($boolUserExist)
214 $intUserID = (int)$USER->GetID();
215 $strDateFunction = $DB->GetNowFunction();
216 $arFields['~TIMESTAMP_X'] = $strDateFunction;
217 if ($boolUserExist)
218 {
219 if (!array_key_exists('MODIFIED_BY', $arFields) || (int)$arFields["MODIFIED_BY"] <= 0)
220 $arFields["MODIFIED_BY"] = $intUserID;
221 }
222 if ('ADD' == $strAction)
223 {
224 $arFields['~DATE_CREATE'] = $strDateFunction;
225 if ($boolUserExist)
226 {
227 if (!array_key_exists('CREATED_BY', $arFields) || (int)$arFields["CREATED_BY"] <= 0)
228 $arFields["CREATED_BY"] = $intUserID;
229 }
230 }
231
232 if (is_set($arFields,'RANGES') || $strAction == 'ADD')
233 {
234 if (!is_array($arFields['RANGES']) || empty($arFields['RANGES']))
235 {
236 $arMsg[] = array('id' => 'RANGES', 'text' => Loc::getMessage('BT_MOD_CAT_DSC_SV_ERR_EMPTY_RANGES'));
237 $boolResult = false;
238 }
239 else
240 {
241 $boolRepeat = false;
242 $arRangeList = array();
243 foreach ($arFields['RANGES'] as &$arRange)
244 {
245 if (!is_array($arRange) || empty($arRange))
246 {
247 $arMsg[] = array('id' => 'RANGES','text' => Loc::getMessage('BT_MOD_CAT_DSC_SV_ERR_BAD_RANGE'));
248 $boolResult = false;
249 }
250 else
251 {
252 if (empty($arRange['TYPE']) || $arRange['TYPE'] != self::TYPE_FIX)
253 $arRange['TYPE'] = self::TYPE_PERCENT;
254 if (isset($arRange['VALUE']))
255 {
256 $arRange["VALUE"] = str_replace(",", ".", $arRange["VALUE"]);
257 $arRange["VALUE"] = doubleval($arRange["VALUE"]);
258 if (!(0 < $arRange["VALUE"]))
259 {
260 $arMsg[] = array('id' => 'RANGES','text' => Loc::getMessage('BT_MOD_CAT_DSC_SV_ERR_BAD_RANGE_VALUE'));
261 $boolResult = false;
262 }
263 elseif (self::TYPE_PERCENT == $arRange['TYPE'] && 100 < $arRange["VALUE"])
264 {
265 $arMsg[] = array('id' => 'RANGES','text' => Loc::getMessage('BT_MOD_CAT_DSC_SV_ERR_BAD_RANGE_VALUE'));
266 $boolResult = false;
267 }
268 }
269 else
270 {
271 $arMsg[] = array('id' => 'RANGES','text' => Loc::getMessage('BT_MOD_CAT_DSC_SV_ERR_BAD_RANGE_VALUE'));
272 $boolResult = false;
273 }
274
275 if (isset($arRange['RANGE_FROM']))
276 {
277 $arRange["RANGE_FROM"] = str_replace(",", ".", $arRange["RANGE_FROM"]);
278 $arRange["RANGE_FROM"] = doubleval($arRange["RANGE_FROM"]);
279 if (0 > $arRange["RANGE_FROM"])
280 {
281 $arMsg[] = array('id' => 'RANGES','text' => Loc::getMessage('BT_MOD_CAT_DSC_SV_ERR_BAD_RANGE_FROM'));
282 $boolResult = false;
283 }
284 else
285 {
286 if (in_array($arRange["RANGE_FROM"], $arRangeList))
287 {
288 $boolRepeat = true;
289 }
290 else
291 {
292 $arRangeList[] = $arRange["RANGE_FROM"];
293 }
294 }
295 }
296 else
297 {
298 $arMsg[] = array('id' => 'RANGES','text' => Loc::getMessage('BT_MOD_CAT_DSC_SV_ERR_BAD_RANGE_FROM'));
299 $boolResult = false;
300 }
301 }
302 }
303 if (isset($arRange))
304 unset($arRange);
305 if ($boolRepeat)
306 {
307 $arMsg[] = array('id' => 'RANGES','text' => Loc::getMessage('BT_MOD_CAT_DSC_SV_ERR_DUP_RANGE_FROM'));
308 $boolResult = false;
309 }
310 }
311 }
312 if (isset($arFields['GROUP_IDS']) || $strAction == 'ADD')
313 {
314 if (!empty($arFields['GROUP_IDS']))
315 {
316 if (!is_array($arFields['GROUP_IDS']))
317 $arFields['GROUP_IDS'] = array($arFields['GROUP_IDS']);
318 $arValid = array();
319 foreach ($arFields['GROUP_IDS'] as &$intGroupID)
320 {
321 $intGroupID = (int)$intGroupID;
322 if (0 < $intGroupID && 2 != $intGroupID)
323 $arValid[] = $intGroupID;
324 }
325 if (isset($intGroupID))
326 unset($intGroupID);
327 $arFields['GROUP_IDS'] = array_unique($arValid);
328 }
329 if (empty($arFields['GROUP_IDS']))
330 {
331 $arMsg[] = array('id' => 'GROUP_IDS','text' => Loc::getMessage('BT_MOD_CAT_DSC_SV_ERR_EMPTY_GROUP_IDS'));
332 $boolResult = false;
333 }
334 }
335 if ($boolResult)
336 {
337 $cond = new CCatalogCondTree();
338 $boolCond = $cond->Init(BT_COND_MODE_GENERATE, BT_COND_BUILD_CATALOG, array());
339 if (!$boolCond)
340 {
341 $boolResult = false;
342 }
343 else
344 {
345 $arFields['CONDITIONS'] = $cond->GetDefaultConditions();
346 $arFields['UNPACK'] = $cond->Generate($arFields['CONDITIONS'], array());
347 $arFields['CONDITIONS'] = serialize($arFields['CONDITIONS']);
348 }
349 }
350
351 if (!$boolResult)
352 {
353 $obError = new CAdminException($arMsg);
354 $APPLICATION->ResetException();
355 $APPLICATION->ThrowException($obError);
356 }
357 return $boolResult;
358 }
359
360 public static function GetByID($intID)
361 {
362 $intID = (int)$intID;
363 if ($intID <= 0)
364 return false;
365
366 return CCatalogDiscountSave::GetList(array(), array('ID' => $intID), false, false, array());
367 }
368
369 public static function GetArrayByID($intID)
370 {
371 $intID = (int)$intID;
372 if ($intID <= 0)
373 return false;
374
375 $rsDiscounts = CCatalogDiscountSave::GetList(array(), array('ID' => $intID), false, false, array());
376 if ($arDiscount = $rsDiscounts->Fetch())
377 return $arDiscount;
378
379 return false;
380 }
381
382 public static function Delete($intID)
383 {
384 global $DB;
385
386 $intID = (int)$intID;
387 if ($intID <= 0)
388 return false;
389
390 $DB->Query("delete from b_catalog_disc_save_range where DISCOUNT_ID = ".$intID);
391 $DB->Query("delete from b_catalog_disc_save_group where DISCOUNT_ID = ".$intID);
392 $DB->Query("delete from b_catalog_disc_save_user where DISCOUNT_ID = ".$intID);
393
394 return $DB->Query("delete from b_catalog_discount where ID = ".$intID." and TYPE = ".self::ENTITY_ID, true);
395 }
396
397/*
398* @deprecated deprecated since catalog 14.5.3
399*/
400 protected static function __ClearGroupsCache($intID = 0)
401 {
402 return true;
403 }
404
405/*
406* @deprecated deprecated since catalog 14.5.3
407*/
408 protected static function __AddGroupsCache($intID, $arGroups = array())
409 {
410 return true;
411 }
412
413/*
414* @deprecated deprecated since catalog 14.5.3
415*/
416 protected static function __UpdateGroupsCache($intID, $arGroups = array())
417 {
418 return true;
419 }
420
421 public static function ChangeActive($intID, $boolActive = true)
422 {
423 $intID = (int)$intID;
424 if ($intID <= 0)
425 return false;
426
427 return CCatalogDiscountSave::Update($intID, array('ACTIVE' => ($boolActive === true ? 'Y' : 'N')), false);
428 }
429
430 public static function UserDiscountCalc($intID,$arFields = array(),$boolNew = false)
431 {
432
433 }
434
435/*
436* @deprecated deprecated since catalog 14.5.3
437*/
438 protected static function __GetDiscountGroups($arUserGroups)
439 {
440 return array();
441 }
442
443 public static function GetDiscount($arParams = array(), $getAll = false)
444 {
445 global $DB, $USER;
446
447 $adminSection = (defined('ADMIN_SECTION') && ADMIN_SECTION === true);
448
449 $arResult = array();
450
451 if (!CCatalog::IsUserExists() || !$USER->IsAuthorized() || !self::IsEnabled())
452 return $arResult;
453
454 foreach (GetModuleEvents("catalog", "OnGetDiscountSave", true) as $arEvent)
455 {
456 $mxResult = ExecuteModuleEventEx($arEvent, $arParams);
457 if ($mxResult !== true)
458 return $mxResult;
459 }
460
461 if (empty($arParams) || !is_array($arParams))
462 return $arResult;
463
464 $intUserID = 0;
465 $arUserGroups = array();
466 $strSiteID = false;
467 if (isset($arParams['USER_ID']))
468 $intUserID = (int)$arParams['USER_ID'];
469 if (isset($arParams['USER_GROUPS']))
470 $arUserGroups = $arParams['USER_GROUPS'];
471 if (isset($arParams['SITE_ID']))
472 $strSiteID = $arParams['SITE_ID'];
473
474 if (self::GetDiscountUserID() > 0)
475 {
476 $intUserID = (int)self::GetDiscountUserID();
477 $arUserGroups = array();
478 }
479 if ($intUserID <= 0 && !$adminSection)
480 {
481 $intUserID = (int)$USER->GetID();
482 $arUserGroups = array();
483 }
484 if (empty($arUserGroups))
485 {
486 if (!isset(self::$userGroups[$intUserID]))
487 self::$userGroups[$intUserID] = $USER->GetUserGroup($intUserID);
488 $arUserGroups = self::$userGroups[$intUserID];
489 }
490 if (empty($arUserGroups) || !is_array($arUserGroups) || $intUserID <= 0)
491 return $arResult;
492 $key = array_search(2, $arUserGroups);
493 if ($key !== false)
494 unset($arUserGroups[$key]);
495 if (empty($arUserGroups))
496 return $arResult;
498 if (empty($arUserGroups))
499 return $arResult;
500 if ($strSiteID === false)
501 $strSiteID = SITE_ID;
502 $cacheKey = md5('U'.implode('_', $arUserGroups));
503 if (!isset(self::$discountFilterCache[$cacheKey]))
504 self::$discountFilterCache[$cacheKey] = CCatalogDiscountSave::__GetDiscountIDByGroup($arUserGroups);
505 if (empty(self::$discountFilterCache[$cacheKey]))
506 return $arResult;
507
508 $arCurrentDiscountID = self::$discountFilterCache[$cacheKey];
509 unset($cacheKey);
510 if (isset($arParams['ID']))
511 {
513 if (!empty($arParams['ID']))
514 $arCurrentDiscountID = array_intersect($arCurrentDiscountID, $arParams['ID']);
515 }
516
517 if (!empty($arCurrentDiscountID))
518 {
519 $getAll = ($getAll === true);
520 $cacheKey = 'DS'.implode('_', $arCurrentDiscountID).'|'.$strSiteID;
521 if (!isset(self::$discountResultCache[$cacheKey]))
522 {
523 self::$discountResultCache[$cacheKey] = array();
524
525 $intCurrentTime = microtime(true);
526 $strDate = date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")), $intCurrentTime);
528 'ID' => $arCurrentDiscountID,
529 'SITE_ID' => $strSiteID,
530 'TYPE' => self::ENTITY_ID,
531 'ACTIVE' => 'Y',
532 '+<=ACTIVE_FROM' => $strDate,
533 '+>=ACTIVE_TO' => $strDate
534 );
535 CTimeZone::Disable();
537 CTimeZone::Enable();
538 while ($arDiscSave = $rsDiscSaves->Fetch())
539 {
540 $arDiscSave['ACTION_SIZE'] = (int)$arDiscSave['ACTION_SIZE'];
541 $arDiscSave['COUNT_SIZE'] = (int)$arDiscSave['COUNT_SIZE'];
542 $arDiscSave['ACTIVE_FROM_UT'] = false;
543 $arDiscSave['ACTIVE_TO_UT'] = false;
544 $arDiscSave['COUNT_FROM_UT'] = false;
545 $arDiscSave['COUNT_TO_UT'] = false;
546 $arDiscSave['TYPE'] = (int)$arDiscSave['TYPE'];
547 $arDiscSave['MODULE_ID'] = 'catalog';
548 $arDiscSave['MICROTIME'] = $intCurrentTime;
549 $arDiscSave['LAST_DISCOUNT'] = 'N';
550 $arDiscSave['PRIORITY'] = 1;
551
552 self::$discountResultCache[$cacheKey][] = $arDiscSave;
553 }
554 unset($arDiscSave, $rsDiscSaves);
555 unset($intCurrentTime);
556 }
557 $discountList = self::$discountResultCache[$cacheKey];
558 unset($cacheKey);
559 foreach ($discountList as $arDiscSave)
560 {
561 $strCountPeriod = self::COUNT_TIME_ALL;
562 $strActionPeriod = self::ACTION_TIME_ALL;
563 $arCountPeriodBack = array();
564 $arActionPeriodBack = array();
565 $arActionPeriod = array();
566
567 $arStartDate = false;
568 $arOldOrderSumm = false;
569 $arOrderSumm = false;
570 $boolPeriodInsert = true;
571
572 $intCountTime = $arDiscSave['MICROTIME'];
573 $arOrderFilter = array(
574 'USER_ID' => $intUserID,
575 'LID' => $arDiscSave['SITE_ID'],
576 'PAYED' => 'Y',
577 'CANCELED' => 'N',
578 );
579 $arOldOrderFilter = $arOrderFilter;
580
581 if (!empty($arDiscSave['ACTIVE_FROM']) || !empty($arDiscSave['ACTIVE_TO']))
582 {
583 $strActionPeriod = self::ACTION_TIME_INTERVAL;
584 if (!empty($arDiscSave['ACTIVE_FROM']))
585 $arDiscSave['ACTIVE_FROM_UT'] = MakeTimeStamp($arDiscSave['ACTIVE_FROM']);
586 if (!empty($arDiscSave['ACTIVE_TO']))
587 $arDiscSave['ACTIVE_TO_UT'] = MakeTimeStamp($arDiscSave['ACTIVE_TO']);
588 }
589 elseif ($arDiscSave['ACTION_SIZE'] > 0 && in_array($arDiscSave['ACTION_TYPE'], array('D','M','Y')))
590 {
591 $strActionPeriod = self::ACTION_TIME_PERIOD;
592 $arActionPeriodBack = CCatalogDiscountSave::__GetTimeStampArray($arDiscSave['ACTION_SIZE'], $arDiscSave['ACTION_TYPE']);
593 $arActionPeriod = CCatalogDiscountSave::__GetTimeStampArray($arDiscSave['ACTION_SIZE'], $arDiscSave['ACTION_TYPE'], true);
594 }
595 if (!empty($arDiscSave['COUNT_FROM']) || !empty($arDiscSave['COUNT_TO']))
596 {
597 $strCountPeriod = self::COUNT_TIME_INTERVAL;
598 if (!empty($arDiscSave['COUNT_FROM']))
599 $arDiscSave['COUNT_FROM_UT'] = MakeTimeStamp($arDiscSave['COUNT_FROM']);
600 if (!empty($arDiscSave['COUNT_TO']))
601 {
602 $arDiscSave['COUNT_TO_UT'] = MakeTimeStamp($arDiscSave['COUNT_TO']);
603 if ($arDiscSave['COUNT_TO_UT'] > $intCountTime)
604 {
605 $arDiscSave['COUNT_TO_UT'] = $intCountTime;
606 $arDiscSave['COUNT_TO'] = ConvertTimeStamp($intCountTime, 'FULL');
607 }
608 }
609 }
610 elseif ($arDiscSave['COUNT_SIZE'] > 0 && in_array($arDiscSave['COUNT_TYPE'],array('D','M','Y')))
611 {
612 $strCountPeriod = self::COUNT_TIME_PERIOD;
613 $arCountPeriodBack = CCatalogDiscountSave::__GetTimeStampArray($arDiscSave['COUNT_SIZE'], $arDiscSave['COUNT_TYPE']);
614 }
615
616 if ($strCountPeriod == self::COUNT_TIME_INTERVAL)
617 {
618 if (false !== $arDiscSave['COUNT_FROM_UT'])
619 {
620 if ($arDiscSave['COUNT_FROM_UT'] > $intCountTime)
621 continue;
622 if (false !== $arDiscSave['COUNT_TO_UT'] && $arDiscSave['COUNT_TO_UT'] <= $arDiscSave['COUNT_FROM_UT'])
623 continue;
624 if (false !== $arDiscSave['ACTIVE_TO_UT'] && $arDiscSave['COUNT_FROM_UT'] >= $arDiscSave['ACTIVE_TO_UT'])
625 continue;
626 }
627 if (false !== $arDiscSave['COUNT_TO_UT'])
628 {
629 if ($strActionPeriod == self::ACTION_TIME_PERIOD && ($arDiscSave['COUNT_TO_UT'] < AddToTimeStamp($arActionPeriodBack, $intCountTime)))
630 continue;
631 }
632 }
633
634 if ($strActionPeriod == self::ACTION_TIME_PERIOD)
635 {
636 if ($strCountPeriod == self::COUNT_TIME_PERIOD)
637 {
639 'DISCOUNT_ID' => $arDiscSave['ID'],
640 'USER_ID' => $intUserID,
641 'ACTIVE_FROM' => date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")),AddToTimeStamp($arActionPeriodBack, $intCountTime)),
642 ));
643 if (is_array($arStartDate) && !empty($arStartDate))
644 {
645 $arOldOrderFilter['<DATE_INSERT'] = $arStartDate['ACTIVE_FROM_FORMAT'];
646 $arOldOrderFilter['>=DATE_INSERT'] = date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")), AddToTimeStamp($arCountPeriodBack, MakeTimeStamp($arStartDate['ACTIVE_FROM_FORMAT'])));
647
648 $arOldOrderSumm = CCatalogDiscountSave::__SaleOrderSumm($arOldOrderFilter, $arDiscSave['CURRENCY']);
649 }
650 }
651 else
652 {
654 array(
655 'DISCOUNT_ID' => $arDiscSave['ID'],
656 'USER_ID' => $intUserID,
657 ),
658 array(
659 'ACTIVE_FROM' => false,
660 'DELETE' => false,
661 )
662 );
663 if (is_array($arStartDate) && !empty($arStartDate))
664 {
665 $intTimeStart = MakeTimeStamp($arStartDate['ACTIVE_FROM_FORMAT']);
666 $intTimeFinish = MakeTimeStamp($arStartDate['ACTIVE_TO_FORMAT']);
667 if (!($intTimeStart <= $intCountTime && $intTimeFinish >= $intCountTime))
668 {
669 continue;
670 }
671 else
672 {
673 $boolPeriodInsert = false;
674 }
675 }
676 }
677 }
678
679 $intTimeStart = false;
680 $intTimeFinish = false;
681
682 if ($strCountPeriod == self::COUNT_TIME_INTERVAL)
683 {
684 $intTimeStart = (!empty($arDiscSave['COUNT_FROM']) ? $arDiscSave['COUNT_FROM'] : false);
685 $intTimeFinish = (!empty($arDiscSave['COUNT_TO']) ? $arDiscSave['COUNT_TO'] : false);
686 }
687 elseif ($strCountPeriod == self::COUNT_TIME_PERIOD)
688 {
689 $intTimeStart = date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")),AddToTimeStamp($arCountPeriodBack, $intCountTime));
690 }
691 if ($intTimeStart)
692 $arOrderFilter['>=DATE_INSERT'] = $intTimeStart;
693 if ($intTimeFinish)
694 $arOrderFilter['<DATE_INSERT'] = $intTimeFinish;
695
696 $arOrderSumm = CCatalogDiscountSave::__SaleOrderSumm($arOrderFilter, $arDiscSave['CURRENCY']);
697
698 if (is_array($arOldOrderSumm) && 0 < $arOldOrderSumm['RANGE_SUMM'])
699 {
700 if ($arOrderSumm['RANGE_SUMM'] <= $arOldOrderSumm['RANGE_SUMM'])
701 {
702 $arOrderSumm = $arOldOrderSumm;
703 }
704 else
705 {
706 $arOldOrderSumm = false;
707 }
708 }
709
711 array('RANGE_FROM' => 'DESC'),
712 array('DISCOUNT_ID' => $arDiscSave['ID'], '<=RANGE_FROM' => $arOrderSumm['RANGE_SUMM']),
713 false,
714 array('nTopCount' => 1)
715 );
716 $arRange = $rsRanges->Fetch();
717 if (!empty($arRange) || $getAll)
718 {
719 if (!empty($arRange))
720 {
721 if ($strActionPeriod == self::ACTION_TIME_PERIOD)
722 {
723 if ($strCountPeriod == self::COUNT_TIME_PERIOD)
724 {
725 if (!is_array($arOldOrderSumm))
726 {
728 'DISCOUNT_ID' => $arDiscSave['ID'],
729 'USER_ID' => $intUserID,
730 'ACTIVE_FROM' => date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")),$intCountTime),
731 'ACTIVE_TO' => date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")),AddToTimeStamp($arActionPeriod,$intCountTime)),
732 'RANGE_FROM' => -1,
733 ));
734 }
735 }
736 else
737 {
738 if ($boolPeriodInsert)
739 {
741 array(
742 'DISCOUNT_ID' => $arDiscSave['ID'],
743 'USER_ID' => $intUserID,
744 'ACTIVE_FROM' => date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")),$intCountTime),
745 'ACTIVE_TO' => date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")),AddToTimeStamp($arActionPeriod,$intCountTime)),
746 'RANGE_FROM' => -1,
747 ),
748 array(
749 'SEARCH' => true,
750 'DELETE' => false,
751 )
752 );
753 }
754 }
755 }
756 }
757
758 unset($arDiscSave['ACTIVE_FROM_UT'], $arDiscSave['ACTIVE_TO_UT'], $arDiscSave['COUNT_FROM_UT'], $arDiscSave['COUNT_TO_UT']);
759 unset($arDiscSave['MICROTIME']);
760
761 $arOneResult = $arDiscSave;
762 if (!empty($arRange))
763 {
764 $arOneResult['VALUE'] = $arRange['VALUE'];
765 $arOneResult['VALUE_TYPE'] = $arRange['TYPE'];
766 $arOneResult['RANGE_FROM'] = $arRange['RANGE_FROM'];
767 $arOneResult['MAX_DISCOUNT'] = 0;
768 }
769 else
770 {
771 $arOneResult['VALUE'] = 0;
772 $arOneResult['VALUE_TYPE'] = self::TYPE_PERCENT;
773 $arOneResult['MAX_DISCOUNT'] = 0;
775 array('RANGE_FROM' => 'ASC'),
776 array('DISCOUNT_ID' => $arDiscSave['ID']),
777 false,
778 array('nTopCount' => 1)
779 );
780 $arRange = $rsRanges->Fetch();
781 $arOneResult['NEXT_RANGE_FROM'] = $arRange['RANGE_FROM'];
782 $arOneResult['NEXT_VALUE'] = $arRange['VALUE'];
783 $arOneResult['NEXT_VALUE_TYPE'] = $arRange['TYPE'];
784 }
785 $arOneResult['SUMM'] = $arOrderSumm['SUMM'];
786 $arOneResult['SUMM_CURRENCY'] = $arOrderSumm['CURRENCY'];
787 $arOneResult['RANGE_SUMM'] = $arOrderSumm['RANGE_SUMM'];
788 $arOneResult['LAST_ORDER_DATE'] = $arOrderSumm['LAST_ORDER_DATE'];
789 $arResult[] = $arOneResult;
790 }
791 }
792 }
793 return $arResult;
794 }
795
796 public static function GetPeriodTypeList($boolFull = true)
797 {
798 $boolFull = ($boolFull === true);
799 if ($boolFull)
800 {
802 'D' => Loc::getMessage('BT_MOD_CAT_DSC_SV_MESS_PERIOD_DAY'),
803 'M' => Loc::getMessage('BT_MOD_CAT_DSC_SV_MESS_PERIOD_MONTH'),
804 'Y' => Loc::getMessage('BT_MOD_CAT_DSC_SV_MESS_PERIOD_YEAR'),
805 );
806 }
807 else
808 {
809 $arResult = array('D','M','Y');
810 }
811 return $arResult;
812 }
813
814 protected static function __SaleOrderSumm($arOrderFilter, $strCurrency)
815 {
816 $arOrderSumm = array(
817 'ORDER_FILTER' => $arOrderFilter,
818 'SUMM' => 0,
819 'CURRENCY' => '',
820 'LAST_ORDER_DATE' => '',
821 'TIMESTAMP' => 0,
822 'RANGE_SUMM' => 0,
823 'RANGE_SUMM_CURRENCY' => $strCurrency
824 );
825 foreach (GetModuleEvents('catalog', 'OnSaleOrderSumm', true) as $arEvent)
826 {
827 $mxOrderCount = ExecuteModuleEventEx($arEvent, array($arOrderFilter));
828 if (!empty($mxOrderCount) && is_array($mxOrderCount))
829 {
830 $mxOrderCount['PRICE'] = (float)$mxOrderCount['PRICE'];
831
832 $arOrderSumm['LAST_ORDER_DATE'] = $mxOrderCount['LAST_ORDER_DATE'];
833 $arOrderSumm['SUMM'] = $mxOrderCount['PRICE'];
834 $arOrderSumm['CURRENCY'] = $mxOrderCount['CURRENCY'];
835 $arOrderSumm['TIMESTAMP'] = $mxOrderCount['TIMESTAMP'];
836 $arOrderSumm['RANGE_SUMM'] = (
837 $mxOrderCount['CURRENCY'] != $strCurrency
838 ? CCurrencyRates::ConvertCurrency($mxOrderCount['PRICE'], $mxOrderCount['CURRENCY'], $strCurrency)
839 : $mxOrderCount['PRICE']
840 );
841 break;
842 }
843 }
844 foreach (GetModuleEvents('catalog', 'OnSaleOrderSummResult', true) as $arEvent)
845 {
846 ExecuteModuleEventEx($arEvent, array(&$arOrderSumm));
847 }
848 return $arOrderSumm;
849 }
850
851 protected static function __GetTimeStampArray($intSize, $strType, $boolDir = false)
852 {
853 if ('D' == $strType)
854 $arTimeStamp = array('DD' => ($boolDir ? $intSize : -$intSize));
855 elseif('M' == $strType)
856 $arTimeStamp = array('MM' => ($boolDir ? $intSize : -$intSize));
857 elseif ('Y' == $strType)
858 $arTimeStamp = array('YYYY' => ($boolDir ? $intSize : -$intSize));
859 else
860 $arTimeStamp = array();
861 return $arTimeStamp;
862 }
863
864 protected static function clearFields($value)
865 {
866 return ($value !== null);
867 }
868}
$arParams
Определения access_dialog.php:21
global $APPLICATION
Определения include.php:80
$arResult
Определения generate_coupon.php:16
const BT_COND_MODE_GENERATE
Определения catalog_cond.php:20
const BT_COND_BUILD_CATALOG
Определения catalog_cond.php:24
const ACTUAL_VERSION
Определения discount.php:93
static getCurrencyList()
Определения currencymanager.php:109
static getMessage($code, $replace=null, $language=null)
Определения loc.php:30
static normalizeArrayValuesByInt(&$map, $sorted=true)
Определения collection.php:150
static __GetTimeStampArray($intSize, $strType, $boolDir=false)
Определения discount_save.php:851
static ClearDiscountUserID()
Определения discount_save.php:55
static GetDiscountSaveTypes($boolFull=false)
Определения discount_save.php:65
const COUNT_TIME_INTERVAL
Определения discount_save.php:16
const ACTION_TIME_INTERVAL
Определения discount_save.php:20
static Disable()
Определения discount_save.php:38
static $discountFilterCache
Определения discount_save.php:30
static __ClearGroupsCache($intID=0)
Определения discount_save.php:400
static GetByID($intID)
Определения discount_save.php:360
const APPLY_MODE_REPLACE
Определения discount_save.php:23
static GetArrayByID($intID)
Определения discount_save.php:369
const ENTITY_ID
Определения discount_save.php:10
static GetApplyModeList($extendedMode=false)
Определения discount_save.php:81
static SetDiscountUserID($intUserID)
Определения discount_save.php:48
const TYPE_PERCENT
Определения discount_save.php:12
const APPLY_MODE_ADD
Определения discount_save.php:24
static UserDiscountCalc($intID, $arFields=array(), $boolNew=false)
Определения discount_save.php:430
static __AddGroupsCache($intID, $arGroups=array())
Определения discount_save.php:408
static CheckFields($strAction, &$arFields, $intID=0)
Определения discount_save.php:99
const COUNT_TIME_ALL
Определения discount_save.php:15
const ACTION_TIME_ALL
Определения discount_save.php:19
const COUNT_TIME_PERIOD
Определения discount_save.php:17
static __SaleOrderSumm($arOrderFilter, $strCurrency)
Определения discount_save.php:814
static $intDiscountUserID
Определения discount_save.php:28
static IsEnabled()
Определения discount_save.php:43
static __UpdateGroupsCache($intID, $arGroups=array())
Определения discount_save.php:416
static GetDiscountUserID()
Определения discount_save.php:60
const ACTION_TIME_PERIOD
Определения discount_save.php:21
static GetDiscount($arParams=array(), $getAll=false)
Определения discount_save.php:443
static Enable()
Определения discount_save.php:33
static GetPeriodTypeList($boolFull=true)
Определения discount_save.php:796
const TYPE_FIX
Определения discount_save.php:13
const APPLY_MODE_DISABLE
Определения discount_save.php:25
static $intDisable
Определения discount_save.php:27
static $discountResultCache
Определения discount_save.php:31
static Delete($intID)
Определения discount_save.php:382
static __GetDiscountGroups($arUserGroups)
Определения discount_save.php:438
static ChangeActive($intID, $boolActive=true)
Определения discount_save.php:421
static clearFields($value)
Определения discount_save.php:864
static $userGroups
Определения discount_save.php:29
static IsUserExists()
Определения catalog.php:1812
static ConvertCurrency($valSum, $curFrom, $curTo, $valDate="")
Определения currency_rate.php:393
static GetRangeByDiscount($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
Определения discount_save.php:214
static Update($intID, $arFields, $boolCalc=false)
Определения discount_save.php:44
static GetList($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
Определения discount_save.php:101
static __UpdateUserInfoByDiscount($arParams, $arSettings=array())
Определения discount_save.php:539
static __GetUserInfoByDiscount($arParams, $arSettings=array())
Определения discount_save.php:494
static __GetDiscountIDByGroup($arUserGroup=array())
Определения discount_save.php:456
$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
$arGroups
Определения options.php:1766
$rsSites
Определения options.php:477
global $DB
Определения cron_frame.php:29
global $USER
Определения csv_new_run.php:40
ExecuteModuleEventEx($arEvent, $arParams=[])
Определения tools.php:5214
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
Определения tools.php:5177
is_set($a, $k=false)
Определения tools.php:2133
AddToTimeStamp($arrAdd, $stmp=false)
Определения tools.php:687
MakeTimeStamp($datetime, $format=false)
Определения tools.php:538
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
if(empty($signedUserToken)) $key
Определения quickway.php:257
const ADMIN_SECTION
Определения rss.php:2
const SITE_ID
Определения sonet_set_content_view.php:12
$arFilter
Определения user_search.php:106