1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
recurring.php
См. документацию.
1<?php
2
5
7
8/***********************************************************************/
9/*********** CSaleRecurring ******************************************/
10/***********************************************************************/
11$GLOBALS["SALE_RECURRING"] = Array();
12
14{
15 public static function CheckFields($ACTION, &$arFields, $ID = 0)
16 {
17 if ((is_set($arFields, "USER_ID") || $ACTION=="ADD") && intval($arFields["USER_ID"]) <= 0)
18 {
19 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGR_EMPTY_USER_ID"), "NO_USER_ID");
20 return false;
21 }
22 if ((is_set($arFields, "NEXT_DATE") || $ACTION=="ADD") && $arFields["NEXT_DATE"] == '')
23 {
24 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGR_EMPTY_NEXT_DATE"), "NO_NEXT_DATE");
25 return false;
26 }
27 if ((is_set($arFields, "ORDER_ID") || $ACTION=="ADD") && intval($arFields["ORDER_ID"]) <= 0)
28 {
29 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGR_EMPTY_ORDER_ID"), "NO_ORDER_ID");
30 return false;
31 }
32
33 if (is_set($arFields, "USER_ID"))
34 {
35 $dbUser = CUser::GetByID($arFields["USER_ID"]);
36 if (!$dbUser->Fetch())
37 {
38 $GLOBALS["APPLICATION"]->ThrowException(str_replace("#ID#", $arFields["USER_ID"], GetMessage("SKGR_NO_USER")), "ERROR_NO_USER_ID");
39 return false;
40 }
41 }
42
43 if (is_set($arFields, "ORDER_ID"))
44 {
45 if (!($arOrder = CSaleOrder::GetByID($arFields["ORDER_ID"])))
46 {
47 $GLOBALS["APPLICATION"]->ThrowException(str_replace("#ID#", $arFields["ORDER_ID"], GetMessage("SKGR_NO_ORDER")), "ERROR_NO_ORDER");
48 return false;
49 }
50 }
51
52 if (is_set($arFields, "PRICE") || $ACTION=="ADD")
53 {
54 $arFields["PRICE"] = str_replace(",", ".", $arFields["PRICE"]);
55 $arFields["PRICE"] = DoubleVal($arFields["PRICE"]);
56 }
57
58 if ((is_set($arFields, "RECUR_SCHEME_TYPE") || $ACTION=="ADD") && !array_key_exists($arFields["RECUR_SCHEME_TYPE"], $GLOBALS["SALE_TIME_PERIOD_TYPES"]))
59 {
60 $arTypes = array_keys($GLOBALS["SALE_TIME_PERIOD_TYPES"]);
61 $arFields["RECUR_SCHEME_TYPE"] = $arTypes[1];
62 }
63
64 if ((is_set($arFields, "WITHOUT_ORDER") || $ACTION=="ADD") && $arFields["WITHOUT_ORDER"] != "Y")
65 $arFields["WITHOUT_ORDER"] = "N";
66 if ((is_set($arFields, "CANCELED") || $ACTION=="ADD") && $arFields["CANCELED"] != "Y")
67 $arFields["CANCELED"] = "N";
68
70 $helper = $connection->getSqlHelper();
71 unset($arFields['TIMESTAMP_X']);
72 $arFields['~TIMESTAMP_X'] = $helper->getCurrentDateTimeFunction();
73
74 return true;
75 }
76
77 public static function Update($ID, $arFields)
78 {
79 global $DB;
80
81 $ID = intval($ID);
82 if ($ID <= 0)
83 return False;
84
86 return false;
87
88 $strUpdate = $DB->PrepareUpdate("b_sale_recurring", $arFields);
89 $strSql = "UPDATE b_sale_recurring SET ".$strUpdate." WHERE ID = ".$ID." ";
90 $DB->Query($strSql);
91
92 unset($GLOBALS["SALE_RECURRING"]["SALE_RECURRING_CACHE_".$ID]);
93
94 return $ID;
95 }
96
97 public static function Delete($ID)
98 {
99 global $DB;
100
101 $ID = intval($ID);
102 if ($ID <= 0)
103 return False;
104
105 unset($GLOBALS["SALE_RECURRING"]["SALE_RECURRING_CACHE_".$ID]);
106
107 return $DB->Query("DELETE FROM b_sale_recurring WHERE ID = ".$ID." ", true);
108 }
109
110 public static function ExecuteCallbackFunction($callbackFunc = "", $module = "", $productID = 0)
111 {
112 $callbackFunc = trim($callbackFunc);
113 $module = trim($module);
114 $productID = intval($productID);
115
116 $result = False;
117 if ($callbackFunc <> '')
118 {
119 if ($module <> '' && $module != "main")
120 CModule::IncludeModule($module);
121
122 $arArgs = array($productID);
123 $numArgs = func_num_args();
124 if ($numArgs > 3)
125 for ($i = 3; $i < $numArgs; $i++)
126 $arArgs[] = func_get_arg($i);
127
128 $result = call_user_func_array($callbackFunc, $arArgs);
129 }
130
131 return $result;
132 }
133
134 public static function CheckRecurring()
135 {
136 if (defined("SALE_PROC_REC_NUM"))
137 $processRecords = SALE_PROC_REC_NUM;
138 else
139 $processRecords = 3;
140
141 $dbRecurring = CSaleRecurring::GetList(
142 array(),
143 array(
144 "<=NEXT_DATE" => Date($GLOBALS["DB"]->DateFormatToPHP(CLang::GetDateFormat("FULL", SITE_ID))),
145 "CANCELED" => "N",
146 "!REMAINING_ATTEMPTS" => 0
147 ),
148 false,
149 array("nTopCount" => $processRecords),
150 array("ID")
151 );
152 $cnt = 0;
153 while ($arRecurring = $dbRecurring->Fetch())
154 {
155 CSaleRecurring::NextPayment($arRecurring["ID"]);
156 $cnt++;
157 if ($cnt >= $processRecords)
158 break;
159 }
160 }
161
162 public static function NextPayment($ID)
163 {
164 global $DB;
165 global $USER;
166
167 $ID = intval($ID);
168 if ($ID <= 0)
169 {
170 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGR_NO_RECID"), "NO_RECORD_ID");
171 return False;
172 }
173
174 $arRecur = CSaleRecurring::GetByID($ID);
175 if (!$arRecur)
176 {
177 $GLOBALS["APPLICATION"]->ThrowException(str_replace("#ID#", $ID, GetMessage("SKGR_NO_RECID1")), "NO_RECORD");
178 return False;
179 }
180
181 $arOrder = CSaleOrder::GetByID($arRecur["ORDER_ID"]);
182 if (!$arOrder)
183 {
184 $GLOBALS["APPLICATION"]->ThrowException(str_replace("#ID#", $arRecur["ORDER_ID"], GetMessage("SKGR_NO_ORDER1")), "NO_ORDER");
185 return False;
186 }
187
188
189 $bSuccess = True;
190 $newOrderID = intval($arRecur["ORDER_ID"]);
191
193 if ($productProvider = CSaleBasket::GetProductProvider($arRecur))
194 {
195 $arProduct = $productProvider::RecurringOrderProduct(array(
196 "PRODUCT_ID" => $arRecur["PRODUCT_ID"],
197 "USER_ID" => $arOrder["USER_ID"]
198 ));
199 }
200 else
201 {
203 $arRecur["CALLBACK_FUNC"],
204 $arRecur["MODULE"],
205 $arRecur["PRODUCT_ID"],
206 $arOrder["USER_ID"]
207 );
208 }
209
210 if (!$arProduct || !is_array($arProduct) || empty($arProduct))
211 {
212 CSaleRecurring::CancelRecurring($arRecur["ID"], "Y", "Product is not found");
213
214 return true;
215 }
216
217 if ($arProduct["WITHOUT_ORDER"] == "Y" || $arRecur["SUCCESS_PAYMENT"] == "Y")
218 {
219 $baseSiteCurrency = CSaleLang::GetLangCurrency($arOrder["LID"]);
220 $productPrice = \Bitrix\Sale\PriceMaths::roundPrecision(CCurrencyRates::ConvertCurrency($arProduct["PRICE"], $arProduct["CURRENCY"], $baseSiteCurrency));
221
222 // Delivery
223 $deliveryPrice = 0;
224 $deliveryID = 0;
225 $arOrder["DELIVERY_ID"] = intval($arOrder["DELIVERY_ID"]);
226 if ($arOrder["DELIVERY_ID"] > 0)
227 {
228 $deliveryLocation = 0;
229 $dbOrderPropValues = CSaleOrderPropsValue::GetList(
230 array(),
231 array(
232 "ORDER_ID" => $arRecur["ORDER_ID"],
233 "PROP_IS_LOCATION" => "Y"
234 ),
235 false,
236 false,
237 array("VALUE")
238 );
239 if ($arOrderPropValues = $dbOrderPropValues->Fetch())
240 $deliveryLocation = intval($arOrderPropValues["VALUE"]);
241
242 $dbDelivery = CSaleDelivery::GetList(
243 array("SORT" => "ASC", "NAME" => "ASC"),
244 array(
245 "LID" => $arOrder["LID"],
246 "WEIGHT" => DoubleVal($arProduct["WEIGHT"]) * DoubleVal($arProduct["QUANTITY"]), // Changed by Sigurd, 2007-08-16
247 "ORDER_PRICE" => $productPrice * DoubleVal($arProduct["QUANTITY"]),
248 "ACTIVE" => "Y",
249 "LOCATION" => $deliveryLocation
250 )
251 );
252 while ($arDelivery = $dbDelivery->Fetch())
253 {
254 $deliveryPriceTmp = \Bitrix\Sale\PriceMaths::roundPrecision(CCurrencyRates::ConvertCurrency($arDelivery["PRICE"], $arDelivery["CURRENCY"], $baseSiteCurrency));
255 if (intval($arDelivery["ID"]) == $arOrder["DELIVERY_ID"])
256 {
257 $deliveryID = intval($arDelivery["ID"]);
258 $deliveryPrice = $deliveryPriceTmp;
259 break;
260 }
261 if ($deliveryPriceTmp < $deliveryPrice || $deliveryID <= 0)
262 {
263 $deliveryID = intval($arDelivery["ID"]);
264 $deliveryPrice = $deliveryPriceTmp;
265 }
266 }
267
268 if ($deliveryID <= 0)
269 {
270 $deliveryID = \Bitrix\Sale\Delivery\Services\EmptyDeliveryService::getEmptyDeliveryServiceId();
271
272 if ($deliveryID > 0)
273 {
274 $deliveryID = \CSaleDelivery::getCodeById($deliveryID);
275 }
276 }
277
278 if ($deliveryID <= 0)
279 {
280 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGR_NO_DELIVERY"), "NO_DELIVERY");
281 return False;
282 }
283 }
284
285 // Sale discounts
286 $discount = 0;
287 $discountPrice = $productPrice;
288 $discountProduct = 0;
289 $dbDiscount = CSaleDiscount::GetList(
290 array("SORT" => "ASC"),
291 array(
292 "LID" => $arOrder["LID"],
293 "ACTIVE" => "Y",
294 "!>ACTIVE_FROM" => Date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL"))),
295 "!<ACTIVE_TO" => Date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL"))),
296 "<=PRICE_FROM" => $productPrice,
297 ">=PRICE_TO" => $productPrice,
298 "USER_GROUPS" => $USER->GetUserGroup($arOrder['USER_ID']),
299 )
300 );
301 if ($arDiscount = $dbDiscount->Fetch())
302 {
303 if ($arDiscount["DISCOUNT_TYPE"] == "P")
304 {
305 $discountProduct = \Bitrix\Sale\PriceMaths::roundPrecision($productPrice * $arDiscount["DISCOUNT_VALUE"] / 100);
306 $discount = \Bitrix\Sale\PriceMaths::roundPrecision($discountProduct * DoubleVal($arProduct["QUANTITY"])); // Changed by Sigurd, 2007-08-16
307 $discountPrice = $productPrice - $discountProduct;
308 }
309 else
310 {
311 $discountValue = CCurrencyRates::ConvertCurrency($arDiscount["DISCOUNT_VALUE"], $arDiscount["CURRENCY"], $baseSiteCurrency);
312 $discountValue = \Bitrix\Sale\PriceMaths::roundPrecision($discountValue);
313
314 $discountProduct = \Bitrix\Sale\PriceMaths::roundPrecision(1.0 * $discountValue / DoubleVal($arProduct["QUANTITY"]));// Changed by Sigurd, 2007-08-16
315 $discount = \Bitrix\Sale\PriceMaths::roundPrecision($curDiscount * DoubleVal($arProduct["QUANTITY"]));
316 $discountPrice = $productPrice - $discountProduct;
317 }
318 }
319
320 $bUseVat = false;
321 $vatRate = 0;
322 if(DoubleVal($arProduct["VAT_RATE"]) > 0)
323 {
324 $bUseVat = true;
325 $vatRate = $arProduct["VAT_RATE"];
326 }
327
328 // Tax
329 $arTaxExempt = array();
330 $dbUserGroups = CUser::GetUserGroupEx($arOrder["USER_ID"]);
331 while ($arUserGroups = $dbUserGroups->Fetch())
332 {
333 $dbTaxExemptTmp = CSaleTax::GetExemptList(array("GROUP_ID" => $arUserGroups["GROUP_ID"]));
334 while ($arTaxExemptTmp = $dbTaxExemptTmp->Fetch())
335 {
336 $arTaxExemptTmp["TAX_ID"] = intval($arTaxExemptTmp["TAX_ID"]);
337 if (!in_array($arTaxExemptTmp["TAX_ID"], $arTaxExempt))
338 $arTaxExempt[] = $arTaxExemptTmp["TAX_ID"];
339 }
340 }
341
342 $taxPrice = 0;
343 $taxVatPrice = 0;
344 if(!$bUseVat)
345 {
346 $taxLocation = 0;
347 $dbOrderPropValues = CSaleOrderPropsValue::GetList(
348 array(),
349 array(
350 "ORDER_ID" => $arRecur["ORDER_ID"],
351 "PROP_IS_LOCATION4TAX" => "Y"
352 ),
353 false,
354 false,
355 array("VALUE")
356 );
357 if ($arOrderPropValues = $dbOrderPropValues->Fetch())
358 $taxLocation = intval($arOrderPropValues["VALUE"]);
359
360 $arTaxList = array();
361 $dbTaxRateTmp = CSaleTaxRate::GetList(
362 array("APPLY_ORDER" => "ASC"),
363 array(
364 "LID" => $arOrder["LID"],
365 "PERSON_TYPE_ID" => $arOrder["PERSON_TYPE_ID"],
366 "ACTIVE" => "Y",
367 "LOCATION" => $taxLocation
368 )
369 );
370 while ($arTaxRateTmp = $dbTaxRateTmp->Fetch())
371 {
372 if (!in_array(intval($arTaxRateTmp["TAX_ID"]), $arTaxExempt))
373 {
374 $arTaxList[] = $arTaxRateTmp;
375 }
376 }
377 }
378 else
379 {
380 $arTaxList[] = Array(
381 "ID" => 0,
382 "TAX_NAME" => GetMessage("SKGR_VAT"),
383 "IS_PERCENT" => "Y",
384 "VALUE" => $vatRate*100,
385 "VALUE_MONEY" => 0,
386 "APPLY_ORDER" => 100,
387 "IS_IN_PRICE" => "Y",
388 "CODE" => "VAT"
389 );
390 }
391
392
393 $arTaxSums = array();
394
395 if (!empty($arTaxList))
396 {
397 if(!$bUseVat)
398 {
399 $taxPriceTmp = CSaleOrderTax::CountTaxes(
400 $discountPrice * DoubleVal($arProduct["QUANTITY"]),
402 $baseSiteCurrency
403 );
404
405 for ($di = 0, $intCount = count($arTaxList); $di < $intCount; $di++)
406 {
407 $arTaxList[$di]["VALUE_MONEY"] += $arTaxList[$di]["TAX_VAL"];
408 }
409
410 for ($di = 0, $intCount = count($arTaxList); $di < $intCount; $di++)
411 {
412 $arTaxSums[$arTaxList[$di]["TAX_ID"]]["VALUE"] = $arTaxList[$di]["VALUE_MONEY"];
413 $arTaxSums[$arTaxList[$di]["TAX_ID"]]["NAME"] = $arTaxList[$di]["NAME"];
414 if ($arTaxList[$di]["IS_IN_PRICE"] != "Y")
415 {
416 $taxPrice += $arTaxList[$di]["VALUE_MONEY"];
417 }
418 }
419 }
420 else
421 {
422 $arTaxList[0]["VALUE_MONEY"] = \Bitrix\Sale\PriceMaths::roundPrecision((($discountPrice / ($vatRate +1)) * $vatRate) * DoubleVal($arProduct["QUANTITY"]));
423 $taxVatPrice = $arTaxList[0]["VALUE_MONEY"];
424 }
425 }
426
427
428 // Changed by Sigurd, 2007-08-16
429 $totalOrderPrice = $discountPrice * DoubleVal($arProduct["QUANTITY"]) + $deliveryPrice + $taxPrice;
430
431 $arProduct["WITHOUT_ORDER"] = (($arProduct["WITHOUT_ORDER"]=="Y") ? "Y" : "N");
432 if ($arProduct["WITHOUT_ORDER"] == "N")
433 {
434 $DB->StartTransaction();
435
436 // Saving
437 $currentFUser = Sale\Fuser::getIdByUserId((int)$arOrder['USER_ID']);
438
440 "FUSER_ID" => $currentFUser,
441 "PRODUCT_ID" => $arProduct["PRODUCT_ID"],
442 "PRODUCT_NAME" => $arProduct["PRODUCT_NAME"],
443 "PRODUCT_URL" => $arProduct["PRODUCT_URL"],
444 "PRODUCT_PRICE_ID" => $arProduct["PRODUCT_PRICE_ID"],
445 "PRICE" => $arProduct["PRICE"],
446 "CURRENCY" => $arProduct["CURRENCY"],
447 "WEIGHT" => $arProduct["WEIGHT"],
448 "QUANTITY" => $arProduct["QUANTITY"],
449 "LID" => $arOrder["LID"],
450 "DELAY" => "N",
451 "CAN_BUY" => "Y",
452 "NAME" => $arProduct["NAME"],
453 "CALLBACK_FUNC" => $arProduct["CALLBACK_FUNC"],
454 "ORDER_CALLBACK_FUNC" => $arProduct["ORDER_CALLBACK_FUNC"],
455 "CANCEL_CALLBACK_FUNC" => $arProduct["CANCEL_CALLBACK_FUNC"],
456 "PAY_CALLBACK_FUNC" => $arProduct["PAY_CALLBACK_FUNC"],
457 "PRODUCT_PROVIDER_CLASS" => $arProduct["PRODUCT_PROVIDER_CLASS"],
458 "MODULE" => $arRecur["MODULE"],
459 "NOTES" => $arProduct["CATALOG_GROUP_NAME"],
460 "DETAIL_PAGE_URL" => $arProduct["DETAIL_PAGE_URL"],
461 "VATE_RATE" => $arProduct["VATE_RATE"],
462 "PRODUCT_XML_ID" => $arProduct["PRODUCT_XML_ID"],
463 "TYPE" => $arProduct["TYPE"],
464 "RENEWAL" => "Y"
465 );
466
467 $basketID = CSaleBasket::Add($arFields);
468
469 $basketID = intval($basketID);
470 if ($basketID <= 0)
471 $bSuccess = False;
472
473 if ($bSuccess)
474 {
475 if (CModule::IncludeModule("statistic"))
476 CStatistic::Set_Event("eStore", "add2basket", $arFields["PRODUCT_ID"]);
477
479 "LID" => $arOrder["LID"],
480 "PERSON_TYPE_ID" => $arOrder["PERSON_TYPE_ID"],
481 "PAYED" => "N",
482 "CANCELED" => "N",
483 "STATUS_ID" => "N",
484 "PRICE_DELIVERY" => $deliveryPrice,
485 "ALLOW_DELIVERY" => "N",
486 "PRICE" => $totalOrderPrice,
487 "CURRENCY" => $baseSiteCurrency,
488 "DISCOUNT_VALUE" => $discount,
489 "USER_ID" => $arOrder["USER_ID"],
490 "PAY_SYSTEM_ID" => $arOrder["PAY_SYSTEM_ID"],
491 "DELIVERY_ID" => $deliveryID,
492 "USER_DESCRIPTION" => $arOrder["USER_DESCRIPTION"],
493 "TAX_VALUE" => (($bUseVat)? $taxVatPrice : $taxPrice),
494 "STAT_GID" => $arOrder["STAT_GID"],
495 "RECURRING_ID" => $arRecur["ID"]
496 );
497
498 $newOrderID = CSaleOrder::Add($arFields);
499
500 $newOrderID = intval($newOrderID);
501 if ($newOrderID <= 0)
502 $bSuccess = False;
503 }
504
505 if ($bSuccess)
506 {
507 $arDiscounts = array();
508 $arDiscounts[$basketID] = $discountProduct;
509 CSaleBasket::OrderBasket($newOrderID, $currentFUser, $arOrder["LID"], $arDiscounts);
510 }
511
512 if ($bSuccess)
513 {
514 for ($it = 0, $intCount = count($arTaxList); $it < $intCount; $it++)
515 {
517 "ORDER_ID" => $newOrderID,
518 "TAX_NAME" => $arTaxList[$it]["TAX_NAME"],
519 "IS_PERCENT" => $arTaxList[$it]["IS_PERCENT"],
520 "VALUE" => ($arTaxList[$it]["IS_PERCENT"]=="Y") ? $arTaxList[$it]["VALUE"] : RoundEx(CCurrencyRates::ConvertCurrency($arTaxList[$it]["VALUE"], $arTaxList[$it]["CURRENCY"], $baseSiteCurrency), 2),
521 "VALUE_MONEY" => $arTaxList[$it]["VALUE_MONEY"],
522 "APPLY_ORDER" => $arTaxList[$it]["APPLY_ORDER"],
523 "IS_IN_PRICE" => $arTaxList[$it]["IS_IN_PRICE"],
524 "CODE" => $arTaxList[$it]["CODE"]
525 );
527 }
528
529 $dbOrderPropValues = CSaleOrderPropsValue::GetList(
530 array(),
531 array("ORDER_ID" => $arRecur["ORDER_ID"]),
532 false,
533 false,
534 array("ORDER_PROPS_ID", "NAME", "CODE", "VALUE", "PROP_IS_PAYER", "PROP_IS_EMAIL")
535 );
536 while ($arOrderPropValues = $dbOrderPropValues->Fetch())
537 {
539 "ORDER_ID" => $newOrderID,
540 "ORDER_PROPS_ID" => $arOrderPropValues["ORDER_PROPS_ID"],
541 "NAME" => $arOrderPropValues["NAME"],
542 "CODE" => $arOrderPropValues["CODE"],
543 "VALUE" => $arOrderPropValues["VALUE"]
544 );
546
547 if ($arOrderPropValues["PROP_IS_PAYER"] == "Y")
548 $payerName = $arOrderPropValues["VALUE"];
549 if ($arOrderPropValues["PROP_IS_EMAIL"] == "Y")
550 $payerEMail = $arOrderPropValues["VALUE"];
551 }
552 }
553
554 if ($bSuccess)
555 {
556 if (CModule::IncludeModule("statistic"))
557 CStatistic::Set_Event("eStore", "order_create", $newOrderID);
558 }
559
560 if ($bSuccess)
561 {
562 $strOrderList = "";
563 $dbBasketTmp = CSaleBasket::GetList(
564 array("NAME" => "ASC"),
565 array("ORDER_ID" => $newOrderID)
566 );
567 while ($arBasketTmp = $dbBasketTmp->Fetch())
568 {
569 $strOrderList .= $arBasketTmp["NAME"]." - ".$arBasketTmp["QUANTITY"]." ".GetMessage("SALE_QUANTITY_UNIT");
570 $strOrderList .= "\n";
571 }
572
573 if ($payerName == '' || $payerEMail == '')
574 {
575 $dbUser = CUser::GetByID($arOrder["USER_ID"]);
576 if ($arUser = $dbUser->Fetch())
577 {
578 if ($payerName == '')
579 $payerName = $arUser["NAME"].(($arUser["NAME"] == '' || $arUser["LAST_NAME"] == '') ? "" : " ").$arUser["LAST_NAME"];
580 if ($payerEMail == '')
581 $payerEMail = $arUser["EMAIL"];
582 }
583 }
584
585 $arFields = Array(
586 "ORDER_ID" => $newOrderID,
587 "ORDER_DATE" => Date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT", $arOrder["LID"]))),
588 "ORDER_USER" => $payerName,
589 "PRICE" => SaleFormatCurrency($totalOrderPrice, $baseSiteCurrency),
590 "BCC" => COption::GetOptionString("sale", "order_email", "order@".$SERVER_NAME),
591 "EMAIL" => $payerEMail,
592 "ORDER_LIST" => $strOrderList,
593 "SALE_EMAIL" => COption::GetOptionString("sale", "order_email", "order@".$SERVER_NAME)
594 );
595 $eventName = "SALE_NEW_ORDER_RECURRING";
596
597 $bSend = true;
598 foreach(GetModuleEvents("sale", "OnOrderRecurringSendEmail", true) as $arEvent)
599 {
600 if (ExecuteModuleEventEx($arEvent, Array($newOrderID, &$eventName, &$arFields))===false)
601 $bSend = false;
602 }
603
604 if($bSend)
605 {
606 $event = new CEvent;
607 $event->Send($eventName, $arOrder["LID"], $arFields, "N");
608 }
609 }
610
611 if ($bSuccess)
612 $DB->Commit();
613 else
614 $DB->Rollback();
615 }
616 }
617 else
618 {
619 $totalOrderPrice = $arOrder["PRICE"];
620 $baseSiteCurrency = $arOrder["CURRENCY"];
621 }
622
623 $res = False;
624 if ($bSuccess)
625 {
626 $res = CSaleUserAccount::Pay($arOrder["USER_ID"], $totalOrderPrice, $baseSiteCurrency, $newOrderID, True);
627 if ($res)
628 {
629 if ($arProduct["WITHOUT_ORDER"] == "N")
630 {
631 CSaleOrder::PayOrder($newOrderID, "Y", False, False, $arRecur["ID"]);
632 CSaleOrder::DeliverOrder($newOrderID, "Y", $arRecur["ID"]);
633 CSaleOrder::DeductOrder($newOrderID, "Y", "", true, array(), $arRecur["ID"]);
634 }
635 else
636 {
638 if ($productProvider = CSaleBasket::GetProductProvider($arProduct))
639 {
640 $r = $productProvider::DeliverProduct(array(
641 "PRODUCT_ID" => $arProduct["PRODUCT_ID"],
642 "USER_ID" => $arOrder["USER_ID"],
643 "PAID" => true,
644 'BASKET_ID' => $basketID
645 ));
646 }
647 else
648 {
650 $arProduct["PAY_CALLBACK_FUNC"],
651 $arRecur["MODULE"],
652 $arProduct["PRODUCT_ID"],
653 $arOrder["USER_ID"],
654 true
655 );
656 }
657 }
658
660 "ORDER_ID" => $newOrderID,
661 "PRODUCT_NAME" => $arProduct["PRODUCT_NAME"],
662 "PRODUCT_URL" => $arProduct["PRODUCT_URL"],
663 "PRICE_TYPE" => $arProduct["PRICE_TYPE"],
664 "RECUR_SCHEME_TYPE" => $arProduct["RECUR_SCHEME_TYPE"],
665 "RECUR_SCHEME_LENGTH" => $arProduct["RECUR_SCHEME_LENGTH"],
666 "WITHOUT_ORDER" => $arProduct["WITHOUT_ORDER"],
667 "PRIOR_DATE" => Date($GLOBALS["DB"]->DateFormatToPHP(CLang::GetDateFormat("FULL", SITE_ID))),
668 "NEXT_DATE" => $arProduct["NEXT_DATE"],
669 "REMAINING_ATTEMPTS" => (Defined("SALE_PROC_REC_ATTEMPTS") ? SALE_PROC_REC_ATTEMPTS : 3),
670 "SUCCESS_PAYMENT" => "Y"
671 );
672
673 CSaleRecurring::Update($arRecur["ID"], $arFields);
674 }
675 else
676 {
678 "ORDER_ID" => $newOrderID,
679 "PRODUCT_NAME" => $arProduct["PRODUCT_NAME"],
680 "PRODUCT_URL" => $arProduct["PRODUCT_URL"],
681 "PRICE_TYPE" => $arProduct["PRICE_TYPE"],
682 "RECUR_SCHEME_LENGTH" => $arProduct["RECUR_SCHEME_LENGTH"],
683 "RECUR_SCHEME_TYPE" => $arProduct["RECUR_SCHEME_TYPE"],
684 "WITHOUT_ORDER" => $arProduct["WITHOUT_ORDER"],
685 "NEXT_DATE" => Date($GLOBALS["DB"]->DateFormatToPHP(CLang::GetDateFormat("FULL", SITE_ID)), time() + SALE_PROC_REC_TIME + CTimeZone::GetOffset()),
686 "REMAINING_ATTEMPTS" => (intval($arRecur["REMAINING_ATTEMPTS"]) - 1),
687 "SUCCESS_PAYMENT" => "N"
688 );
689 CSaleRecurring::Update($arRecur["ID"], $arFields);
690
691 if ((intval($arRecur["REMAINING_ATTEMPTS"]) - 1) <= 0)
692 {
693 CSaleRecurring::CancelRecurring($arRecur["ID"], "Y", "Can't pay order");
694 /*
695 $arFields["CANCELED"] = "Y";
696 $arFields["DATE_CANCELED"] = Date(CDatabase::DateFormatToPHP(CLang::GetDateFormat("FULL", LANG)));
697 $arFields["CANCELED_REASON"] = "Can't pay order";
698 */
699 }
700 }
701 }
702
703 return $res;
704 }
705
706 public static function CancelRecurring($ID, $val, $description = "")
707 {
708 global $DB, $USER;
709
710 $ID = intval($ID);
711 $val = (($val != "Y") ? "N" : "Y");
713
714 if ($ID <= 0)
715 {
716 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGR_EMPTY_SUBSCR"), "NO_RECURRING_ID");
717 return False;
718 }
719
721 if (!$arRecurring)
722 {
723 $GLOBALS["APPLICATION"]->ThrowException(str_replace("#ID#", $ID, GetMessage("SKGR_NO_SUBSCR")), "NO_RECURRING");
724 return False;
725 }
726
727 if ($arRecurring["CANCELED"] == $val)
728 {
729 $GLOBALS["APPLICATION"]->ThrowException(str_replace("#ID#", $ID, GetMessage("SKGR_DUB_CANCEL")), "ALREADY_FLAG");
730 return False;
731 }
732
734 "CANCELED" => $val,
735 "DATE_CANCELED" => (($val == "Y") ? Date(CDatabase::DateFormatToPHP(CLang::GetDateFormat("FULL", LANG))) : False),
736 "CANCELED_REASON" => ( $description <> '' ? $description : false )
737 );
739
740 unset($GLOBALS["SALE_RECURRING"]["SALE_RECURRING_CACHE_".$ID]);
741
743 $dbUser = CUser::GetByID($arRecurring["USER_ID"]);
744 $arUser = $dbUser->Fetch();
745
746 $arOrder = CSaleOrder::GetByID($arRecurring["ORDER_ID"]);
747
749 "RECURRING_ID" => $ID,
750 "PRODUCT_NAME" => $arRecurring["PRODUCT_NAME"],
751 "EMAIL" => $arUser["EMAIL"],
752 "CANCELED_REASON" => $description,
753 "SALE_EMAIL" => COption::GetOptionString("sale", "order_email", "order@".$SERVER_NAME)
754 );
755 $eventName = "SALE_RECURRING_CANCEL";
756
757 $bSend = true;
758 foreach(GetModuleEvents("sale", "OnOrderRecurringCancelSendEmail", true) as $arEvent)
759 {
760 if (ExecuteModuleEventEx($arEvent, Array($ID, &$eventName, &$arFields))===false)
761 $bSend = false;
762 }
763
764 if($bSend)
765 {
766 $event = new CEvent;
767 $event->Send($eventName, $arOrder["LID"], $arFields, "N");
768 }
769
770 return $res;
771 }
772
773 public static function AgentCheckRecurring()
774 {
775 $bTmpUser = False;
776 if (!isset($GLOBALS["USER"]) || !is_object($GLOBALS["USER"]))
777 {
778 $bTmpUser = True;
779 $GLOBALS["USER"] = new CUser;
780 }
781
783
784 global $pPERIOD;
785 if (defined("SALE_PROC_REC_FREQUENCY") && intval(SALE_PROC_REC_FREQUENCY) > 0)
786 $pPERIOD = intval(SALE_PROC_REC_FREQUENCY);
787 else
788 $pPERIOD = 7200;
789
790 if ($bTmpUser)
791 {
792 unset($GLOBALS["USER"]);
793 }
794
795 return "CSaleRecurring::AgentCheckRecurring();";
796 }
797
798 public static function OnCurrencyDelete($Currency)
799 {
800 global $DB;
801 if ($Currency == '') return false;
802
803 return $DB->Query("DELETE FROM b_sale_recurring WHERE CURRENCY = '".$DB->ForSql($ID)."' ", true);
804 }
805
806 public static function OnUserDelete($UserID)
807 {
808 global $DB;
809 $UserID = intval($UserID);
810
811 return $DB->Query("DELETE FROM b_sale_recurring WHERE USER_ID = ".$UserID." ", true);
812 }
813}
$connection
Определения actionsdefinitions.php:38
$arTypes
Определения options.php:23
$arRecurring
Определения options.php:1889
static getConnection($name="")
Определения application.php:638
Определения date.php:9
static ConvertCurrency($valSum, $curFrom, $curTo, $valDate="")
Определения currency_rate.php:393
static ExecuteCallbackFunction($callbackFunc="", $module="", $productID=0)
Определения basket.php:1822
static GetProductProvider($arBasketItem)
Определения basket.php:24
static GetList($arOrder=array("SORT"=> "ASC", "NAME"=> "ASC"), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array(' *'))
Определения delivery.php:989
static DeductOrder($ID, $val, $description="", $bAutoDeduction=true, $arStoreBarcodeOrderFormData=array(), $recurringID=0)
Определения order.php:2101
static Add($arFields)
Определения order_props_values.php:242
static GetList($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
Определения order_props_values.php:12
static CountTaxes($Price, &$arTaxList, $DefCurrency)
Определения order_tax.php:124
Определения recurring.php:14
static ExecuteCallbackFunction($callbackFunc="", $module="", $productID=0)
Определения recurring.php:110
static Delete($ID)
Определения recurring.php:97
static CheckRecurring()
Определения recurring.php:134
static OnUserDelete($UserID)
Определения recurring.php:806
static AgentCheckRecurring()
Определения recurring.php:773
static OnCurrencyDelete($Currency)
Определения recurring.php:798
static CheckFields($ACTION, &$arFields, $ID=0)
Определения recurring.php:15
static CancelRecurring($ID, $val, $description="")
Определения recurring.php:706
static Update($ID, $arFields)
Определения recurring.php:77
static GetExemptList($arFilter=array())
Определения tax.php:609
static Pay($userID, $paySum, $payCurrency, $orderID=0, $useCC=true, $paymentId=null)
Определения user.php:305
static GetByID($ID)
Определения user.php:3820
static GetUserGroupEx($ID)
Определения user.php:3427
Определения event.php:13
static GetList($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
Определения basket.php:33
static GetList($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
Определения discount.php:15
static GetLangCurrency($siteId)
Определения settings.php:52
static Add($arFields)
Определения order.php:10
static Add($arFields)
Определения order_tax.php:105
static GetByID($ID)
Определения recurring.php:10
static GetList($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
Определения recurring.php:47
static GetList($arOrder=array("APPLY_ORDER"=>"ASC"), $arFilter=array())
Определения tax_rate.php:29
Определения user.php:6037
$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
$result
Определения get_property_values.php:14
if($ajaxMode) $ID
Определения get_user.php:27
if(Loader::includeModule( 'bitrix24')) elseif(Loader::includeModule('intranet') &&CIntranetUtils::getPortalZone() !=='ru') $description
Определения .description.php:24
global $DB
Определения cron_frame.php:29
global $USER
Определения csv_new_run.php:40
$ACTION
Определения csv_new_setup.php:27
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
$GLOBALS['____1690880296']
Определения license.php:1
$event
Определения prolog_after.php:141
$bUseVat
Определения factura.php:595
for( $i=0, $max=count( $arBasketIDs);$i< $max;$i++) if($arOrder['DELIVERY_VAT_RATE'] > 0) if(is_array( $arBasketOrder) &&!empty( $arBasketOrder)) if(floatval($arOrder["DISCOUNT_VALUE"]) > 0) $arTaxList
Определения factura.php:640
$i
Определения factura.php:643
$discount
Определения waybill.php:788
</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
SaleFormatCurrency($fSum, $strCurrency, $OnlyValue=false, $withoutFormat=false)
Определения include.php:142
const SALE_PROC_REC_FREQUENCY
Определения include.php:29
const SALE_PROC_REC_NUM
Определения include.php:23
const SALE_PROC_REC_TIME
Определения include.php:27
const SALE_PROC_REC_ATTEMPTS
Определения include.php:25
$val
Определения options.php:1793
const SITE_ID
Определения sonet_set_content_view.php:12
$GLOBALS['_____370096793']
Определения update_client.php:1