1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
order_loader.php
См. документацию.
1<?
3
5use \Bitrix\Main\Type\RandomSequence;
6use \Bitrix\Sale;
7
9{
10 const DEFUALT_VERSION = 2.05;
11 const PARTIAL_VERSION = 2.1;
12
13 const DEBUG_FILE = "1c_order_exchange.log";
14 const DEBUG_MODE = true;
15
17 public $importer;
18
19 var $strError = "";
20 var $SumFormat = ".";
21 var $QuantityFormat = ".";
22 var $sdp = "";
24 var $bNewVersion = false;
28
29 public $crmCompatibleMode = false;
30 public $marked_code = '[1C_Exchange:Order.deducted]';
31 public $delimiter_reason = "&nbsp;&nbsp;<br/>";
32
33 static $useStoreControl = null;
34 static $operationType = "";
35 static $documentType = "";
36 static $versionSchema = "";
37
38 public $strErrorDocument = "";
39 public $version1C = "";
40 public $xmlid1C = "";
41 public $orderIdOrig = "";
42
43 public $modifyItem = array();
45
46
47 public function getSiteId()
48 {
49 static $siteId = null;
50 if($siteId === null)
51 {
52 $siteId = \Bitrix\Main\Config\Option::get("sale", "1C_SITE_NEW_ORDERS");
53
54 if($siteId == "")
55 $siteId = \Bitrix\Main\Application::getInstance()->getContext()->getSite();
56 }
57 return $siteId;
58 }
59
61 {
62 if($shipment->isShipped())
63 $shipment->setField('DEDUCTED','N');
64
65 return $shipment->delete();
66 }
67
69 {
70 if($payment->isPaid())
71 $payment->setPaid('N');
72
73 return $payment->delete();
74 }
75
77 {
78 if($this->isMarkedOrder($order))
79 {
80 if( $order->isShipped())
81 {
82 $this->unMarkedOrder($order);
83 }
84 }
85 }
86 public function setMarkedOrder(\Bitrix\Sale\Order $order)
87 {
88 $order->setField('MARKED', 'Y');
89 $oldReasonMarked = $order->getField('REASON_MARKED');
90 $newReasonMarked = ($oldReasonMarked == '' ? '':$oldReasonMarked.$this->delimiter_reason).GetMessage("CC_BSC1_ERROR_EXCHANGE_1C_ORDER_DEDUCTED").$this->marked_code;
91 $order->setField('REASON_MARKED', $newReasonMarked);
92 }
93 public function unMarkedOrder(\Bitrix\Sale\Order $order)
94 {
95 $manyReason = array();
96 if(mb_strpos($order->getField('REASON_MARKED'), $this->marked_code) !== false)
97 {
98 $arReason = explode($this->delimiter_reason, $order->getField('REASON_MARKED'));
99
100 if(count($arReason) > 1)
101 {
102 foreach($arReason as $reason)
103 {
104 if(mb_strpos($reason, $this->marked_code) === false)
105 $manyReason[] = $reason;
106 }
107 if(count($manyReason)>0)
108 $order->setField('REASON_MARKED', implode($this->delimiter_reason, $manyReason));
109 }
110 else
111 {
112 $order->setField('MARKED', 'N');
113 $order->setField('REASON_MARKED', '');
114 }
115 }
116 }
117 public function isMarkedOrder(\Bitrix\Sale\Order $order)
118 {
119 return (
120 $order->getField('MARKED') == 'Y'
121 && mb_strpos($order->getField('REASON_MARKED'), $this->marked_code) !== false
122 ) ?
123 true : false;
124 }
125
126 public function createPaymentCompatible1C(\Bitrix\Sale\Order $order, $arDocument)
127 {
128 if( !$order->isCanceled())
129 {
130 if(
131 ( $needAmount = $order->getPrice() - $order->getSumPaid())
132 && $needAmount > 0
133 )
134 {
136 $paymentCollection = $order->getPaymentCollection();
137 $paymentServiceId = self::getDefaultPaySystem();
138
139 $paySystem = \Bitrix\Sale\PaySystem\Manager::getObjectById($paymentServiceId);
140 $payment = $paymentCollection->createItem($paySystem);
141
142 $date = new Bitrix\Main\Type\Date(CDatabase::FormatDate(str_replace("T", " ", $arDocument["TRAITS"][GetMessage("CC_BSC1_1C_PAYED_DATE")]), "YYYY-MM-DD HH:MI:SS", CLang::GetDateFormat("FULL", LANG)));
143 $payment->setField("PAY_VOUCHER_DATE", $date);
144 $payment->setField("SUM", $needAmount);
145 $payment->setField("CURRENCY", CSaleLang::GetLangCurrency($this->getSiteId())) ;
146 $payment->setField("COMMENTS", GetMessage("CC_BSC1_PAYMENT_COMMENTS_1C"));
147 $payment->setField("PAID", "Y");
148 $payment->setField("EXTERNAL_PAYMENT", "F");
149 }
150 }
151 }
152 public function beforePaidCompatible1C(\Bitrix\Sale\Order $order)
153 {
154 if( !$order->isCanceled())
155 {
156 $paymentCompatible1CId = $this->getPaymentCompatible1CByOrder($order);
157
158 $paymentCollection = $order->getPaymentCollection();
159
160 if(is_set($paymentCompatible1CId))
161 {
163 $payment = $paymentCollection->getItemById($paymentCompatible1CId);
164
165 if(is_set($payment))
166 {
167 /*if(
168 !$payment->isPaid()
169 || !$order->isPaid()
170 )
171 $payment->delete();
172 else*/
173 if($payment->isPaid())
174 $payment->setPaid('N');
175 }
176 }
177 }
178 }
179 public function afterPaidCompatible1C(\Bitrix\Sale\Order $order)
180 {
181 if( !$order->isCanceled())
182 {
183 $paymentCompatible1CId = $this->getPaymentCompatible1CByOrder($order);
184 $paymentCollection = $order->getPaymentCollection();
185
186 if(is_set($paymentCompatible1CId))
187 {
189 $payment = $paymentCollection->getItemById($paymentCompatible1CId);
190
191 if(is_set($payment))
192 {
193 if(
194 ($needAmount = $order->getPrice() - $order->getSumPaid())
195 && $needAmount > 0
196 )
197 {
198
199 /*$originalValues = $payment->getFields()->getOriginalValues();
200 if(array_key_exists('PAID', $originalValues))
201 $oldPaid = $originalValues['PAID'];
202
203 if(!$onlyLastPaid || $oldPaid == 'Y')
204 {*/
205 $payment->setField('SUM', $needAmount);
206 $payment->setPaid('Y');
207 /*}*/
208 }
209 elseif(!$payment->isPaid())
210 {
211 $payment->delete();
212 }
213 }
214 }
215 }
216 }
217 public function getPaymentCompatible1CByOrder(\Bitrix\Sale\Order $order)
218 {
219 $paymentCompatible1CId = null;
221 $paymentCollection = $order->getPaymentCollection();
222
223 foreach($paymentCollection as $payment)
224 {
225 if($payment->getField('EXTERNAL_PAYMENT') == 'F')
226 $paymentCompatible1CId = $payment->getId();
227 }
228
229 return $paymentCompatible1CId;
230 }
231
232 public function createEntityCompatible1C(\Bitrix\Sale\Order $order, $arDocument)
233 {
234 if ($arDocument["TRAITS"][GetMessage("CC_BSC1_1C_PAYED_DATE")] <> '')
235 {
236 $paymentCompatible1CId = $this->getPaymentCompatible1CByOrder($order);
237
238 if(!is_set($paymentCompatible1CId))
239 {
240 $this->createPaymentCompatible1C($order, $arDocument);
241 }
242 }
243
244 if($arDocument["TRAITS"][GetMessage("CC_BSC1_1C_DELIVERY_DATE")] <> '')
245 {
246 if(!$order->isShipped())
247 {
248 $this->setMarkedOrder($order);
249 }
250 }
251 }
252 public function updateEntityCompatible1C(\Bitrix\Sale\Order $order, $arDocument)
253 {
254 if($arDocument["VERSION_1C"] != $order->getField('VERSION_1C') || ($order->getField('VERSION_1C') == '' || $arDocument["VERSION_1C"] == ''))
255 {
256 if ( $arDocument["TRAITS"][GetMessage("CC_BSC1_1C_PAYED_DATE")] <> '')
257 {
258 if(
259 ( $paymentCompatible1CId = $this->getPaymentCompatible1CByOrder($order))
260 && $paymentCompatible1CId > 0
261 )
262 {
263 $this->beforePaidCompatible1C($order);
264 $this->afterPaidCompatible1C($order);
265 }
266 else
267 {
268 $this->createPaymentCompatible1C($order, $arDocument);
269 }
270 }
271 elseif( !$order->isCanceled())
272 {
273 $paymentCompatible1CId = $this->getPaymentCompatible1CByOrder($order);
274 if(
275 is_set($paymentCompatible1CId)
276 && $paymentCompatible1CId > 0
277 )
278 {
279 $paymentCollection = $order->getPaymentCollection();
280
282 $payment = $paymentCollection->getItemById($paymentCompatible1CId);
283
284 if(is_set($payment))
285 {
286 $payment->setField('PAID','N');
287 $payment->delete();
288 }
289 }
290 }
291
292 if($arDocument["TRAITS"][GetMessage("CC_BSC1_1C_DELIVERY_DATE")] <> '')
293 {
294 if($this->isMarkedOrder($order))
295 {
297 }
298 else
299 {
300 if(!$order->isShipped())
301 {
302 $this->setMarkedOrder($order);
303 }
304 }
305 }
306 else
307 {
308 if($this->isMarkedOrder($order))
309 {
310 $this->unMarkedOrder($order);
311 }
312 }
313 }
314 }
315
316 public function getLogFileDir()
317 {
318 return $_SERVER["DOCUMENT_ROOT"]."/".COption::GetOptionString("main", "upload_dir", "upload")."/1c_exchange/";
319 }
320
321 public function getLogFilePath()
322 {
323 return $this->getLogFileDir().self::DEBUG_FILE;
324 }
325
326 public function logMessage($message = '')
327 {
328 if(!static::DEBUG_MODE || !mb_strlen($message))
329 return;
330
331 file_put_contents(
332 $this->getLogFilePath(),
333 $this->getTimeStampString().' '.$message.PHP_EOL,
334 FILE_APPEND
335 );
336 }
337 public function getTimeStampString()
338 {
339 return '['.date('H:i:s').']';
340 }
341
342 public static function onBeforeUpdateOrderWithoutShipmentsPayments(Bitrix\Main\Event $event)
343 {
344 $parameters = $event->getParameters();
346 $order = $parameters['ENTITY'];
347 if (!$order instanceof Bitrix\Sale\Order)
348 {
349 return new Bitrix\Main\EventResult(
350 Bitrix\Main\EventResult::ERROR,
351 new Bitrix\Sale\ResultError(Bitrix\Main\Localization\Loc::getMessage('SALE_EVENT_COMPATIBILITY_ORDER_SAVE_WRONG_ORDER'), 'SALE_EVENT_COMPATIBILITY_ORDER_SAVE_WRONG_ORDER'),
352 'sale'
353 );
354 }
356 foreach($order->getShipmentCollection() as $shipment)
357 {
358 if (!$shipment->isSystem() && $shipment->getId() == null)
359 {
360 $shipment->delete();
361 }
362 }
363
365 foreach($order->getPaymentCollection() as $payment)
366 {
367 if ($payment->getId() == null)
368 {
369 $payment->delete();
370 }
371 }
372
373 foreach($order->getPaymentCollection() as $payment)
374 {
375 $changedKey = $payment->getFields()->getChangedKeys();
376 $originalValues = $payment->getFields()->getOriginalValues();
377 if(is_array($changedKey) && count($changedKey)>0)
378 {
379 foreach($changedKey as $key)
380 {
381 if(is_set($originalValues, $key))
382 {
383 $payment->setField($key, $originalValues[$key]);
384 }
385 }
386 }
387 }
388 return new Bitrix\Main\EventResult( Bitrix\Main\EventResult::SUCCESS, null, 'sale');
389 }
390
391 public static function onBeforeSaveOrderWithoutShipmentsPayments(Bitrix\Main\Event $event)
392 {
393 $parameters = $event->getParameters();
394
396 $order = $parameters['ENTITY'];
397 if (!$order instanceof Bitrix\Sale\Order)
398 {
399 return new Bitrix\Main\EventResult(
400 Bitrix\Main\EventResult::ERROR,
401 new Bitrix\Sale\ResultError(Bitrix\Main\Localization\Loc::getMessage('SALE_EVENT_COMPATIBILITY_ORDER_SAVE_WRONG_ORDER'), 'SALE_EVENT_COMPATIBILITY_ORDER_SAVE_WRONG_ORDER'),
402 'sale'
403 );
404 }
405
406 $serviceId = \Bitrix\Main\Config\Option::get('sale', '1C_IMPORT_DEFAULT_SHIPMENT_SERVICE', 0);
407 if(intval($serviceId)<=0)
408 {
409 $serviceId = Bitrix\Sale\Delivery\Services\EmptyDeliveryService::getEmptyDeliveryServiceId();
410 if($serviceId<=0)
411 {
412 \CSaleDelivery::createNoDeliveryServiceAgent();
413 $serviceId = Bitrix\Sale\Delivery\Services\EmptyDeliveryService::getEmptyDeliveryServiceId();
414 }
415 }
416
418 foreach($order->getShipmentCollection() as $shipment)
419 {
420 if (!$shipment->isSystem() && $shipment->getId() == null)
421 {
422 $shipment->delete();
423 }
424 if ($shipment->isSystem())
425 $shipment->setFieldNoDemand('DELIVERY_ID', $serviceId);
426 }
428 foreach($order->getPaymentCollection() as $payment)
429 {
430 if ($payment->getId() == null)
431 {
432 $payment->delete();
433 }
434 }
435 return new Bitrix\Main\EventResult( Bitrix\Main\EventResult::SUCCESS, null, 'sale');
436 }
437
438 function getDocumentId($type,$code,$xmlId1CDocument)
439 {
440 $result = array();
441
442 switch($type)
443 {
444 case 'Shipment':
445 case 'Payment':
446 if($code <> '')
447 $result = array('ID'=>$code);
448 break;
449 case 'Order':
450 if($code <> '')
451 $result = array('ID'=>$this->getOrderIdByDocument($code));
452 break;
453 }
454
455 if(($code == '' || $result['ID'] === false) && $xmlId1CDocument <> '')//try to search document from 1C // !==false fix for accountNumberPrefix
456 {
457 switch($type)
458 {
459 case 'Shipment':
460 if($shimpentCode1C = \Bitrix\Sale\Internals\ShipmentTable::getList(array(
461 'select' => array('ID', 'ID_1C','ORDER_ID'),
462 'filter' => array('ID_1C' => $xmlId1CDocument)
463 ))->fetch())
464 {
465 $result['ID'] = $shimpentCode1C['ID'];
466 $result['ORDER_ID'] = $shimpentCode1C['ORDER_ID'];
467 }
468 break;
469 case 'Payment':
470 if($paymentCode1C = \Bitrix\Sale\Internals\PaymentTable::getList(array(
471 'select' => array('ID', 'ID_1C','ORDER_ID'),
472 'filter' => array('ID_1C' => $xmlId1CDocument),
473 'order' => array('ID' => 'DESC')
474 ))->fetch())
475 {
476 $result['ID'] = $paymentCode1C['ID'];
477 $result['ORDER_ID'] = $paymentCode1C['ORDER_ID'];
478 }
479 break;
480 case 'Order':
481 if($OrderCode1C = \Bitrix\Sale\Internals\OrderTable::getList(array(
482 'select' => array('ID', 'ID_1C'),
483 'filter' => array('ID_1C' => $xmlId1CDocument),
484 'order' => array('ID' => 'DESC')
485 ))->fetch())
486 {
487 $result['ID'] = $OrderCode1C['ID'];
488 }
489 break;
490 }
491 }
492 return $result;
493 }
494 function getOrderIdByDocument($orderCode)
495 {
496 $accountNumberPrefix = \Bitrix\Main\Config\Option::get("sale", "1C_SALE_ACCOUNT_NUMBER_SHOP_PREFIX", "");
497 if($orderCode <> '')
498 {
499 if(is_numeric($orderCode))
500 {
501 if (!$orderByID = \Bitrix\Sale\Internals\OrderTable::getById($orderCode)->fetch())
502 {
503 if (!$orderBy1CID = \Bitrix\Sale\Internals\OrderTable::getList(array(
504 'select' => array('ID'),
505 'filter' => array('ID_1C' => $orderCode),
506 'order' => array('ID' => 'DESC')
507 ))->fetch()
508 )
509 {
510 if (!$orderByAccountNumber = \Bitrix\Sale\Internals\OrderTable::getList(array(
511 'select' => array('ID'),
512 'filter' => array('ACCOUNT_NUMBER' => $orderCode),
513 'order' => array('ID' => 'DESC')
514 ))->fetch()
515 )
516 {
517 if ($accountNumberPrefix != "")
518 {
519 if(mb_strpos($orderCode, $accountNumberPrefix) === 0)
520 {
521 $orderCode = mb_substr($orderCode, mb_strlen($accountNumberPrefix));
522 if ($orderByID = \Bitrix\Sale\Internals\OrderTable::getById($orderCode)->fetch())
523 {
524 return $orderByID['ID'];
525 }
526 }
527 }
528 }
529 else
530 return $orderByAccountNumber['ID'];
531 }
532 else
533 return $orderBy1CID['ID'];
534 }
535 else
536 return $orderByID['ID'];
537 }
538 else
539 {
540 if (!$orderBy1CID = \Bitrix\Sale\Internals\OrderTable::getList(array(
541 'select' => array('ID'),
542 'filter' => array('ID_1C' => $orderCode),
543 'order' => array('ID' => 'DESC')
544 ))->fetch()
545 )
546 {
547 if (!$orderByAccountNumber = \Bitrix\Sale\Internals\OrderTable::getList(array(
548 'select' => array('ID'),
549 'filter' => array('ACCOUNT_NUMBER' => $orderCode),
550 'order' => array('ID' => 'DESC')
551 ))->fetch()
552 )
553 {
554 if ($accountNumberPrefix != "")
555 {
556 if(mb_strpos($orderCode, $accountNumberPrefix) === 0)
557 {
558 $orderCode = mb_substr($orderCode, mb_strlen($accountNumberPrefix));
559 if (!$orderByID = \Bitrix\Sale\Internals\OrderTable::getById($orderCode)->fetch())
560 {
561 if ($orderByAccountNumber = \Bitrix\Sale\Internals\OrderTable::getList(array(
562 'select' => array('ID'),
563 'filter' => array('ACCOUNT_NUMBER' => $orderCode),
564 'order' => array('ID' => 'DESC')
565 ))->fetch()
566 )
567 {
568 return $orderByAccountNumber['ID'];
569 }
570 }
571 else
572 return $orderByID['ID'];
573 }
574 }
575 }
576 else
577 return $orderByAccountNumber['ID'];
578 }
579 else
580 return $orderBy1CID['ID'];
581 }
582 }
583 return false;
584 }
585 function addBasketForShipment($arDocument, $newBasketItems, \Bitrix\Sale\Shipment $shipment)
586 {
587 $documentBasketItems = array();
588 $documentShipmentItems = array();
589 if(!empty($newBasketItems["items"]))
590 {
591 $arDocumentUpdate = array();
592 foreach ($newBasketItems["items"] as $k=>$documentItems)
593 {
594 foreach ($documentItems as $itemID => $arItem)
595 {
596 if($arItem["TYPE"] == GetMessage("CC_BSC1_ITEM"))
597 {
598 $documentBasketItems[][$itemID] = $arItem;
599 $arDocumentUpdate[][$itemID] = $arDocument['items'][$k][$itemID];
600 }
601 else
602 {
603 $documentShipmentItems = $arItem;
604 //$documentShipmentItems['CURRENCY'] = $newBasketItems['CURRENCY'];
605 $documentShipmentItems['CURRENCY'] = CSaleLang::GetLangCurrency($this->getSiteId());
606 $documentShipmentItems['DELIVERY_PRICE'] = $arItem['PRICE'];
607 }
608 }
609 }
610 if(count($arDocumentUpdate)>0)
611 $arDocument['items'] = $arDocumentUpdate;
612
613 if(is_array($documentBasketItems) && count($documentBasketItems)>0)
614 $this->addProduct($arDocument, $documentBasketItems, $documentShipmentItems, $shipment);
615 }
616 }
617 function updateOrderWithoutShipmentsPayments(array $arOrder)
618 {
619 global $APPLICATION;
620
622 $key = $eventManager->addEventHandler('sale', 'OnSaleOrderBeforeSaved', Array($this, "onBeforeUpdateOrderWithoutShipmentsPayments"));
623
624 $dbOrder = CSaleOrder::GetList(array(), array("ID" => $arOrder["ID"]), false, false, array("ID", "LID", "PERSON_TYPE_ID", "PAYED", "DATE_PAYED", "CANCELED", "DATE_CANCELED", "REASON_CANCELED", "STATUS_ID", "DATE_STATUS", "PAY_VOUCHER_NUM", "PAY_VOUCHER_DATE", "PRICE_DELIVERY", "ALLOW_DELIVERY", "DATE_ALLOW_DELIVERY", "PRICE", "CURRENCY", "DISCOUNT_VALUE", "USER_ID", "PAY_SYSTEM_ID", "DELIVERY_ID", "DATE_INSERT", "DATE_INSERT_FORMAT", "DATE_UPDATE", "USER_DESCRIPTION", "ADDITIONAL_INFO", "COMMENTS", "TAX_VALUE", "DELIVERY_DOC_NUM", "DELIVERY_DOC_DATE", "STORE_ID", "ACCOUNT_NUMBER", "VERSION", "VERSION_1C", "ID_1C"));
625 if($orderInfo = $dbOrder->Fetch())
626 {
627 if($arOrder["VERSION_1C"] != $orderInfo["VERSION_1C"] || ($orderInfo["VERSION_1C"] == '' || $arOrder["VERSION_1C"] == '')) // skip update if the same version
628 {
629 $this->logMessage("Order.VERSION_1C: ".$orderInfo["VERSION_1C"]);
630 $this->logMessage("Document.VERSION_1C: ".$arOrder["VERSION_1C"]);
631 $this->logMessage("Order.ID_1C: ".$orderInfo["ID_1C"]);
632 $this->logMessage("Order.PAYED: ".$orderInfo["PAYED"]);
633 $this->logMessage("Order.STATUS_ID: ".$orderInfo["STATUS_ID"]);
634
635 $arOrderFields = array();
636 $orderId = $orderInfo["ID"];
637 CSaleOrderChange::AddRecord($orderId, "ORDER_1C_IMPORT");
638 if($arOrder["XML_1C_DOCUMENT_ID"] != $orderInfo["ID_1C"])
639 $arOrderFields["ID_1C"] = $arOrder["XML_1C_DOCUMENT_ID"];
640
641 $registry = \Bitrix\Sale\Registry::getInstance(\Bitrix\Sale\Registry::REGISTRY_TYPE_ORDER);
642
644 $orderClass = $registry->getOrderClassName();
645
646 $order = $orderClass::load($orderId);
647
648 if(
649 ($orderInfo["PAYED"] != "Y" || is_set($this->getPaymentCompatible1CByOrder($order)))
650 /*&& $orderInfo["ALLOW_DELIVERY"] != "Y"*/
651 && $orderInfo["STATUS_ID"] != "F")
652 {
654 array(),
655 array("ORDER_ID" => $orderId),
656 false,
657 false,
658 array("ID", "TAX_NAME", "VALUE", "VALUE_MONEY", "CODE", "IS_IN_PRICE")
659 );
660 $bTaxFound = false;
661 if($arOrderTax = $dbOrderTax->Fetch())
662 {
663 $bTaxFound = true;
664 if(intval($arOrderTax["VALUE_MONEY"]) != intval($arOrder["TAX"]["VALUE_MONEY"]) || intval($arOrderTax["VALUE"]) != intval($arOrder["TAX"]["VALUE"]) || ($arOrderTax["IS_IN_PRICE"] != $arOrder["TAX"]["IS_IN_PRICE"]))
665 {
666 if(intval($arOrder["TAX"]["VALUE"])>0)
667 {
668 $arFields = Array(
669 "TAX_NAME" => $arOrder["TAX"]["NAME"],
670 "ORDER_ID" => $orderId,
671 "VALUE" => $arOrder["TAX"]["VALUE"],
672 "IS_PERCENT" => "Y",
673 "IS_IN_PRICE" => $arOrder["TAX"]["IS_IN_PRICE"],
674 "VALUE_MONEY" => $arOrder["TAX"]["VALUE_MONEY"],
675 "CODE" => "VAT1C",
676 "APPLY_ORDER" => "100"
677 );
678 CSaleOrderTax::Update($arOrderTax["ID"], $arFields);
679 $arOrderFields["TAX_VALUE"] = $arOrder["TAX"]["VALUE_MONEY"];
680 }
681 else
682 {
683 CSaleOrderTax::Delete($arOrderTax["ID"]);
684 $arOrderFields["TAX_VALUE"] = 0;
685 }
686 }
687 }
688
689 if(!$bTaxFound)
690 {
691 if(intval($arOrder["TAX"]["VALUE"])>0)
692 {
693 $arFields = Array(
694 "TAX_NAME" => $arOrder["TAX"]["NAME"],
695 "ORDER_ID" => $orderId,
696 "VALUE" => $arOrder["TAX"]["VALUE"],
697 "IS_PERCENT" => "Y",
698 "IS_IN_PRICE" => $arOrder["TAX"]["IS_IN_PRICE"],
699 "VALUE_MONEY" => $arOrder["TAX"]["VALUE_MONEY"],
700 "CODE" => 'VAT1C',
701 "APPLY_ORDER" => '100',
702 );
704 $arOrderFields["TAX_VALUE"] = $arOrder["TAX"]["VALUE_MONEY"];
705 }
706 }
707
708 $arShoppingCart = array();
709 $bNeedUpdate = false;
710
711 $this->logMessage("Document.items: ".print_r($arOrder["items"], true));
712
713 $basket = $order->getBasket();
714
715 foreach($basket as $basketItem)
716 {
718
719 $arFields = Array();
720 $foundedBasketItem = false;
721 foreach($arOrder["items"] as $k=>$items)
722 {
723 if($this->existsBasketItem($basketItem, $items))
724 {
725 $foundedBasketItem = true;
726
727 if($basketItem->getField("QUANTITY") != $items[$basketItem->getField("PRODUCT_XML_ID")]["QUANTITY"])
728 $arFields["QUANTITY"] = $items[$basketItem->getField("PRODUCT_XML_ID")]["QUANTITY"];
729 if($basketItem->getField("PRICE") != $items[$basketItem->getField("PRODUCT_XML_ID")]["PRICE"])
730 $arFields["PRICE"] = $items[$basketItem->getField("PRODUCT_XML_ID")]["PRICE"];
731 if($basketItem->getField("VAT_RATE") != $items[$basketItem->getField("PRODUCT_XML_ID")]["VAT_RATE"])
732 $arFields["VAT_RATE"] = $items[$basketItem->getField("PRODUCT_XML_ID")]["VAT_RATE"];
733 //if($basketItem->getField("DISCOUNT_PRICE") != $items[$basketItem->getField("PRODUCT_XML_ID")]["DISCOUNT_PRICE"])
734 $arFields["DISCOUNT_PRICE"] = $items[$basketItem->getField("PRODUCT_XML_ID")]["DISCOUNT_PRICE"];
735
736 if(count($arFields)>0)
737 {
738 $arFields["ID"] = $basketItem->getField("ID");
739 if(DoubleVal($arFields["QUANTITY"]) <= 0)
740 $arFields["QUANTITY"] = $basketItem->getField("QUANTITY");
741 $bNeedUpdate = true;
742 $arShoppingCart[] = $arFields;
743 }
744 else
745 {
746 $arShoppingCart[] = array(
747 "ID"=> $basketItem->getField("ID"),
748 "QUANTITY"=> $basketItem->getField("QUANTITY"),
749 "CANCEL_CALLBACK_FUNC"=> $basketItem->getField("CANCEL_CALLBACK_FUNC"),
750 "MODULE"=> $basketItem->getField("MODULE"),
751 "PRODUCT_ID"=> $basketItem->getField("PRODUCT_ID"),
752 "PRODUCT_PROVIDER_CLASS"=> $basketItem->getField("PRODUCT_PROVIDER_CLASS"),
753 "RESERVED"=> $basketItem->getField("RESERVED"),
754 "RESERVE_QUANTITY"=> $basketItem->getField("RESERVE_QUANTITY"),
755 "TYPE"=> $basketItem->getField("TYPE"),
756 "SET_PARENT_ID"=> $basketItem->getField("SET_PARENT_ID"),
757 "PRICE"=> $basketItem->getField("PRICE"),
758 "VAT_RATE"=> $basketItem->getField("VAT_RATE"),
759 "DISCOUNT_PRICE"=> $basketItem->getField("DISCOUNT_PRICE"),
760 "PRODUCT_XML_ID"=> $basketItem->getField("PRODUCT_XML_ID"),
761 "PROPS"=> $this->getBasketProperty($items[$basketItem->getField("PRODUCT_XML_ID")])
762 );
763 }
764
765 $arOrder["items"][$k][$basketItem->getField("PRODUCT_XML_ID")]["CHECKED"] = "Y";
766 }
767 }
768
769 if(!$foundedBasketItem)
770 {
771 if($arOrder["CANCELED"] != "true" && $arOrder["TRAITS"][GetMessage("CC_BSC1_CANCEL")] != "true" && $orderInfo["CANCELED"] == "N")
772 {
773 $bNeedUpdate = true;
774 }
775 }
776 }
777
778 if(!empty($arOrder["items"]))
779 {
780 foreach ($arOrder["items"] as $k=>$items)
781 {
782 foreach ($items as $itemID => $item)
783 {
784 if ($item["CHECKED"] != "Y")
785 {
786 if ($item["TYPE"] == GetMessage("CC_BSC1_ITEM"))
787 {
788 if ($arBasketFields = $this->prepareProduct4Basket($itemID, $item, $orderId, $orderInfo))
789 {
790 $arBasketFields['PROPS'] = $this->getBasketProperty($item);
791 $arShoppingCart[] = $arBasketFields;
792 $bNeedUpdate = true;
793 }
794 }
795 elseif ($item["TYPE"] == GetMessage("CC_BSC1_SERVICE"))
796 {
797 if (intval($item["PRICE"]) != intval($orderInfo["PRICE_DELIVERY"]))
798 $arOrderFields["PRICE_DELIVERY"] = $item["PRICE"];
799 }
800 }
801 }
802 }
803 }
804
805 $this->logMessage("Order.NewItems: ".print_r($arShoppingCart, true));
806
807 $isUsed = \Bitrix\Sale\Compatible\DiscountCompatibility::isUsed();
808 \Bitrix\Sale\Compatible\DiscountCompatibility::stopUsageCompatible();
809
810 if($bNeedUpdate)
811 {
812 $arErrors = array();
813 if(!CSaleBasket::DoSaveOrderBasket($orderId, $orderInfo["LID"], $orderInfo["USER_ID"], $arShoppingCart, $arErrors))
814 {
815 $e = $APPLICATION->GetException();
816 if(is_object($e))
817 $this->strErrorDocument .= "\n ".GetMessage("CC_BSC1_ORDER_ERROR_3", Array('#XML_1C_DOCUMENT_ID#'=>$this->getXMLDocumentID())).$e->GetString();
818
819 }
820 }
821 $this->logMessage("Document.AMOUNT: ".$arOrder["AMOUNT"]);
822 $this->logMessage("Order.AMOUNT: ".$orderInfo["PRICE"]);
823 $this->logMessage("Order.AMOUNT: ".$orderInfo["DISCOUNT_VALUE"]);
824 $this->logMessage("Document.COMMENT: ".$arOrder["COMMENT"]);
825 $this->logMessage("Order.COMMENTS: ".$orderInfo["COMMENTS"]);
826
827 if($this->strErrorDocument == '')
828 {
829 //if(DoubleVal($arOrder["AMOUNT"]) > 0 && $arOrder["AMOUNT"] != $orderInfo["PRICE"])
830 // $arOrderFields["PRICE"] = $arOrder["AMOUNT"];
831 if(DoubleVal($orderInfo["DISCOUNT_VALUE"]) > 0)
832 $arOrderFields["DISCOUNT_VALUE"] = 0;
833 if($arOrder["COMMENT"] <> '' && $arOrder["COMMENT"] != $orderInfo["COMMENTS"])
834 $arOrderFields["COMMENTS"] = $arOrder["COMMENT"];
835 $arOrderFields["UPDATED_1C"] = "Y";
836 if(!empty($arOrderFields))
837 CSaleOrder::Update($orderId, $arOrderFields);
838 }
839
840 if($isUsed === true)
841 {
842 \Bitrix\Sale\Compatible\DiscountCompatibility::revertUsageCompatible();
843 }
844 }
845 else
846 {
847 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_ORDER_ERROR_4", Array('#XML_1C_DOCUMENT_ID#'=>$this->getXMLDocumentID())).GetMessage("CC_BSC1_FINAL_NOT_EDIT", Array("#ID#" => $orderId));
848 }
849 }
850
851 $this->logMessage("Document.CANCELED: ".$arOrder["CANCELED"]);
852 $this->logMessage("Document.CANCEL: ".$arOrder["TRAITS"][GetMessage("CC_BSC1_CANCEL")]);
853 $this->logMessage("Order.CANCELED: ".$orderInfo["CANCELED"]);
854
855 $arAditFields = Array();
856 if($arOrder["CANCELED"] == "true" || $arOrder["TRAITS"][GetMessage("CC_BSC1_CANCEL")] == "true")
857 {
858 if($orderInfo["CANCELED"] == "N")
859 {
860 CSaleOrder::CancelOrder($orderInfo["ID"], "Y", $arOrder["COMMENT"]);
861 $arAditFields["UPDATED_1C"] = "Y";
862 }
863 }
864 else
865 {
866 if($arOrder["CANCELED"] != "true" && $arOrder["TRAITS"][GetMessage("CC_BSC1_CANCEL")] != "true")
867 {
868 if($orderInfo["CANCELED"] == "Y")
869 {
870 CSaleOrder::CancelOrder($orderInfo["ID"], "N", $arOrder["COMMENT"]);
871 $arAditFields["UPDATED_1C"] = "Y";
872 }
873 }
874 }
875
876
877 if(\Bitrix\Main\Config\Option::get("sale", "1C_CHANGE_STATUS_FROM_1C", "") && $arOrder["TRAITS"][GetMessage("CC_BSC1_1C_STATUS_ID")] <> '')
878 {
879 if($orderInfo["STATUS_ID"] != $arOrder["TRAITS"][GetMessage("CC_BSC1_1C_STATUS_ID")])
880 {
881 CSaleOrder::StatusOrder($orderInfo["ID"], $arOrder["TRAITS"][GetMessage("CC_BSC1_1C_STATUS_ID")]);
882 }
883 }
884
885 if(count($arAditFields)>0)
886 CSaleOrder::Update($orderInfo["ID"], $arAditFields);
887 }
888 else
889 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_ORDER_ERROR_4", Array('#XML_1C_DOCUMENT_ID#'=>$this->getXMLDocumentID())).GetMessage("CC_BSC1_ORDER_NOT_FOUND", Array("#ID#" => $arOrder["ID"]));
890
891 removeEventHandler('sale', 'OnSaleOrderBeforeSaved', $key);
892 }
893
894 function saveOrderCompatibility($arDocument, $arAditFields=array())
895 {
896 $documentBasketItems = array();
897 $this->arPersonTypesIDs = array();
898 $this->arExportInfo = array();
899
900 $this->logMessage("Document.items: ".print_r($arDocument["items"], true));
901
902 if(!empty($arDocument["items"]) && $arDocument['AMOUNT'] <> '')
903 {
904 if($this->documentMustHaveProducts($arDocument))
905 {
906 $arDocument = $this->getUserByProperty($arDocument);
907 $this->setPersonTypesID();
908 $this->setExportInfo();
909
910 $this->logMessage("personType: ".$arDocument["PERSON_TYPE_ID"]);
911 $this->logMessage("personTypesIDs: ".print_r($this->arPersonTypesIDs, true));
912 $this->logMessage("exportInfo: ".print_r($this->arExportInfo, true));
913
914 if(intval($arDocument["PERSON_TYPE_ID"]) <= 0)
915 {
916 $arDocument = $this->getPersonType($arDocument);
917 }
918 if(intval($arDocument["PERSON_TYPE_ID"]) > 0)
919 {
920 $arAgent = $this->getExportInfo($arDocument);
921
922 if(intval($arDocument["USER_ID"]) > 0)
923 {
924 $orderFields = $this->prepareOrderFields($arDocument);
925
926 $arAditFields["DATE_INSERT"] = CDatabase::FormatDate($arDocument["DATE"]." ".$arDocument["TIME"], "YYYY-MM-DD HH:MI:SS", CLang::GetDateFormat("FULL", LANG));
927
928 foreach($arDocument["items"] as $k=>$items)
929 {
930 foreach($items as $productID=>$item)
931 {
932 if($item['TYPE'] <> GetMessage("CC_BSC1_SERVICE"))
933 {
934 $orderFields["BASKET_ITEMS"][$k] = $this->prepareProduct4Basket($productID, $item, false, $orderFields);
935 $orderFields["BASKET_ITEMS"][$k]['PROPS'] = $this->getBasketProperty($item);
936 }
937 }
938 }
939
940 $orderFields["TAX_LIST"] = $this->getOrderTaxList($arDocument);
941 $orderFields = $this->getOrderProperty($arAgent, $orderFields, $arDocument);
942
943 $this->logMessage("BASKET_ITEMS: ".print_r($orderFields["BASKET_ITEMS"], true));
944
945 $arOrder = $this->saveOrder($arDocument, $orderFields, $arAditFields);
946 return $arOrder;
947 }
948 else
949 {
950 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_ORDER_ERROR_4", Array('#XML_1C_DOCUMENT_ID#'=>$this->getXMLDocumentID())).GetMessage("CC_BSC1_ORDER_USER_PROBLEM", Array("#ID#" => $arDocument["ID_1C"]));
951 if(!empty($arErrors))
952 {
953 foreach($arErrors as $v)
954 {
955 $this->strErrorDocument .= "\n".$v["TEXT"];
956 }
957 }
958 }
959 }
960 else
961 {
962 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_ORDER_ERROR_4", Array('#XML_1C_DOCUMENT_ID#'=>$this->getXMLDocumentID())).GetMessage("CC_BSC1_ORDER_PERSON_TYPE_PROBLEM", Array("#ID#" => $arDocument["ID_1C"]));
963 }
964 }
965 else
966 {
967 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_ORDER_BASKET_ITEMS_PROBLEM");
968 }
969 }
970 else
971 {
972 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_ORDER_BASKET_ITEMS_AMOUNT_NULL_PROBLEM");
973 }
974
975 return array();
976 }
977 function Paid(\Bitrix\Sale\Payment $payment, $arDocument)
978 {
979 $this->logMessage("PaidPayment: ");
980 $this->logMessage("Document.PAYED: ".$arDocument["TRAITS"][GetMessage("CC_BSC1_1C_PAYED")]);
981 $this->logMessage("Document.Date: ".$arDocument["DATE"]);
982 $this->logMessage("Document.PAY_VOUCHER_NUM: ".$arDocument["TRAITS"][GetMessage("CC_BSC1_1C_PAYED_NUM")]);
983
984 if(intval($payment->getId())>0)
985 {
986 if ($arDocument["TRAITS"][GetMessage("CC_BSC1_1C_PAYED")] == "true")
987 {
988 if($arDocument["CANCELED"] !== "true" && $arDocument["TRAITS"][GetMessage("CC_BSC1_CANCEL")] !== "true")
989 {
990 if (!$payment->isPaid())
991 {
992 $this->logMessage("PaidPayment: Y");
993 $r = $payment->setPaid('Y');
994 if (!$r->isSuccess())
995 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_ORDER_ERROR_4", Array('#XML_1C_DOCUMENT_ID#'=>$arDocument['XML_1C_DOCUMENT_ID']))." ".array_shift($r->getErrors())->getMessage();
996 }
997 }
998
999 return true;
1000 }
1001 }
1002 return false;
1003 }
1004
1005 function Ship(\Bitrix\Sale\Shipment $shipment, $arDocument)
1006 {
1008 $order = $shipment->getCollection()->getOrder();
1009
1010 if(mb_strlen($arDocument["DATE"]) > 1)
1011 {
1012 if($arDocument["TRAITS"][GetMessage("CC_BSC1_DEDUCTED")] == "true" && !$shipment->isShipped())
1013 {
1014 $shipment->setField('ALLOW_DELIVERY','Y');
1015 $shipment->setField('DEDUCTED','Y');
1016 }
1017
1018 $date = new Bitrix\Main\Type\Date(CDatabase::FormatDate(str_replace("T", " ", $arDocument["DATE"]), "YYYY-MM-DD HH:MI:SS", CLang::GetDateFormat("FULL", LANG)));
1019 $shipment->setField("DELIVERY_DOC_DATE", $date);
1020
1021 if($arDocument["TRAITS"][GetMessage("CC_BSC1_1C_DELIVERY_NUM")] <> '')
1022 $shipment->setField("DELIVERY_DOC_NUM", $arDocument["TRAITS"][GetMessage("CC_BSC1_1C_DELIVERY_NUM")]);
1023
1024 if (isset($arDocument["TRAITS"][GetMessage("CC_BSC1_1C_TRACKING_NUMBER")]) && strval($arDocument["TRAITS"][GetMessage("CC_BSC1_1C_TRACKING_NUMBER")]) != '')
1025 $shipment->setField('TRACKING_NUMBER', $arDocument["TRAITS"][GetMessage("CC_BSC1_1C_TRACKING_NUMBER")]);
1026 }
1027 }
1028 function saveOrder($arDocument, $orderFields, $arAditFields)
1029 {
1030 $arOrder = $arDocument;
1031 unset($arOrder['ID']);
1032
1033 if($arOrder["ID"] = CSaleOrder::DoSaveOrder($orderFields, $arAditFields, 0, $arErrors))
1034 {
1035 //add/update user profile
1036 if(intval($arOrder["USER_PROFILE_ID"]) > 0)
1037 {
1038 if($arOrder["USER_PROFILE_VERSION"] != $arOrder["AGENT"]["VERSION"])
1039 CSaleOrderUserProps::Update($arOrder["USER_PROFILE_ID"], array("VERSION_1C" => $arOrder["AGENT"]["VERSION"], "NAME" => $arOrder["AGENT"]["AGENT_NAME"], "USER_ID" => $arOrder["USER_ID"]));
1040 $dbUPV = CSaleOrderUserPropsValue::GetList(array(), array("USER_PROPS_ID" =>$arOrder["USER_PROFILE_ID"]));
1041 while($arUPV = $dbUPV->Fetch())
1042 {
1043 $arOrder["AGENT"]["PROFILE_PROPS_VALUE"][$arUPV["ORDER_PROPS_ID"]] = array("ID" => $arUPV["ID"], "VALUE" => $arUPV["VALUE"]);
1044 }
1045 }
1046
1047 if(intval($arOrder["USER_PROFILE_ID"]) <= 0 || (intval($arOrder["USER_PROFILE_ID"]) > 0 && $arOrder["USER_PROFILE_VERSION"] != $arOrder["AGENT"]["VERSION"]))
1048 {
1049 $dbOrderProperties = CSaleOrderProps::GetList(
1050 array("SORT" => "ASC"),
1051 array(
1052 "PERSON_TYPE_ID" => $arOrder["PERSON_TYPE_ID"],
1053 "ACTIVE" => "Y",
1054 "UTIL" => "N",
1055 "USER_PROPS" => "Y",
1056 ),
1057 false,
1058 false,
1059 array("ID", "TYPE", "NAME", "CODE", "USER_PROPS", "SORT", "MULTIPLE")
1060 );
1061 while ($arOrderProperties = $dbOrderProperties->Fetch())
1062 {
1063 $curVal = $orderFields["ORDER_PROP"][$arOrderProperties["ID"]];
1064
1065 if ($curVal <> '')
1066 {
1067 if (intval($arOrder["USER_PROFILE_ID"]) <= 0)
1068 {
1069 $arFields = array(
1070 "NAME" => $arOrder["AGENT"]["AGENT_NAME"],
1071 "USER_ID" => $arOrder["USER_ID"],
1072 "PERSON_TYPE_ID" => $arOrder["PERSON_TYPE_ID"],
1073 "XML_ID" => $arOrder["AGENT"]["ID"],
1074 "VERSION_1C" => $arOrder["AGENT"]["VERSION"],
1075 );
1076 $arOrder["USER_PROFILE_ID"] = CSaleOrderUserProps::Add($arFields);
1077 }
1078 if(intval($arOrder["USER_PROFILE_ID"]) > 0)
1079 {
1080 $arFields = array(
1081 "USER_PROPS_ID" => $arOrder["USER_PROFILE_ID"],
1082 "ORDER_PROPS_ID" => $arOrderProperties["ID"],
1083 "NAME" => $arOrderProperties["NAME"],
1084 "VALUE" => $curVal
1085 );
1086 if(empty($arOrder["AGENT"]["PROFILE_PROPS_VALUE"][$arOrderProperties["ID"]]))
1087 {
1089 }
1090 elseif($arOrder["AGENT"]["PROFILE_PROPS_VALUE"][$arOrderProperties["ID"]]["VALUE"] != $curVal)
1091 {
1092 CSaleOrderUserPropsValue::Update($arOrder["AGENT"]["PROFILE_PROPS_VALUE"][$arOrderProperties["ID"]]["ID"], $arFields);
1093 }
1094 }
1095 }
1096 }
1097 }
1098 }
1099 else
1100 {
1101 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_ORDER_ADD_PROBLEM", Array("#ID#" => $arDocument["XML_1C_DOCUMENT_ID"]));
1102 if(is_array($arErrors))
1103 $this->strErrorDocument .= "\n".implode(', ',$arErrors);
1104
1105 }
1106 return $arOrder;
1107 }
1108
1109 function addProduct($arDocument, $documentBasketItems, $documentShipmentItems, \Bitrix\Sale\Shipment $shipment)
1110 {
1111 $this->logMessage("addProduct.documentBasketItems: ".print_r($documentBasketItems, true));
1112 $this->logMessage("addProduct.shipment: ".$shipment->getId());
1113 $this->logMessage("addProduct.documentShipmentItems: ".print_r($documentShipmentItems, true));
1114
1116 $order = $shipment->getCollection()->getOrder();
1117
1118 foreach($documentBasketItems as $item)
1119 {
1120 foreach($item as $itemID=>$arItem)
1121 {
1122 $arBasketFields = $this->prepareProduct4Basket($itemID, $arItem, $order->getId(), array('SITE_ID'=>$order->getField('LID'),'CURRENCY'=>$order->getField('CURRENCY'),'LID'=>$order->getField('LID')));
1123 $item = $order->getBasket()->createItem($arBasketFields["MODULE"], $arBasketFields["PRODUCT_ID"]);
1124
1126 if ($propertyCollection = $item->getPropertyCollection())
1127 {
1128 $property = $this->getBasketProperty($arItem);
1129 if(is_array($property) && count($property)>0)
1130 $propertyCollection->setProperty($property);
1131 }
1132
1133 unset($arBasketFields["ORDER_ID"]);
1134 unset($arBasketFields["MODULE"]);
1135 unset($arBasketFields["PRODUCT_ID"]);
1136 unset($arBasketFields["LID"]);
1137 unset($arBasketFields["PROPS"]);
1138
1139 $item->setFields($arBasketFields);
1140 }
1141 }
1142
1143 $this->updateShipmentQuantityFromDocument($arDocument, $shipment);
1144 }
1145
1147 {
1148 $this->logMessage("UpdatePayment: ");
1149 $this->logMessage("ID: ".$arDocument['ID']);
1150 $this->logMessage("ORDER_ID: ".$arDocument['ORDER_ID']);
1151 $this->logMessage("Payment.VERSION_1C: ".$payment->getField('VERSION_1C'));
1152 $this->logMessage("Document.VERSION_1C: ".$arDocument["VERSION_1C"]);
1153
1154 if($arDocument["VERSION_1C"] != $payment->getField('VERSION_1C') || ($payment->getField('VERSION_1C') == '' || $arDocument["VERSION_1C"] == '')) // skip update if the same version
1155 {
1156 $this->logMessage("Payment.isPaid: ".($payment->isPaid()? 'Y':'N'));
1157
1158 if (!$payment->isPaid())
1159 {
1160 $this->logMessage("Payment.SUM: ".$payment->getField('SUM'));
1161 $this->logMessage("Document.AMOUNT: ".$arDocument["AMOUNT"]);
1162 $this->logMessage("Payment.isPaid: ".$payment->getField('COMMENT'));
1163 $this->logMessage("Document.isPaid: ".$arDocument["COMMENT"]);
1164
1165 if ($arDocument["AMOUNT"] != $payment->getField('SUM'))
1166
1167 $payment->setField("SUM", $arDocument["AMOUNT"]);
1168 if ($arDocument["COMMENT"] <> '' && $arDocument["COMMENT"] != $payment->getField('COMMENT'))
1169 $payment->setField("COMMENTS", $arDocument["COMMENT"]);
1170 }
1171
1172 if ($arDocument["TRAITS"][GetMessage("CC_BSC1_1C_PAYED_DATE")] <> '')
1173 {
1174 $date = new Bitrix\Main\Type\Date(CDatabase::FormatDate(str_replace("T", " ", $arDocument["TRAITS"][GetMessage("CC_BSC1_1C_PAYED_DATE")]), "YYYY-MM-DD HH:MI:SS", CLang::GetDateFormat("FULL", LANG)));
1175 $payment->setField("PAY_VOUCHER_DATE", $date);
1176 }
1177
1178 if ($arDocument["TRAITS"][GetMessage("CC_BSC1_1C_PAYED_NUM")] <> '')
1179 $payment->setField("PAY_VOUCHER_NUM", $arDocument["TRAITS"][GetMessage("CC_BSC1_1C_PAYED_NUM")]);
1180 }
1181
1182 $this->logMessage("Document.CANCELED: ".$arDocument["CANCELED"]);
1183 $this->logMessage("Document.CANCEL: ".$arDocument["TRAITS"][GetMessage("CC_BSC1_CANCEL")]);
1184
1185 if($arDocument["TRAITS"][GetMessage("CC_BSC1_CANCEL")] == "true")
1186 {
1187 if($payment->isPaid())
1188 {
1189 $payment->setPaid('N');
1190 $payment->setField("COMMENTS",$arDocument["COMMENT"]);
1191 }
1192 }
1193 else
1194 {
1195 if($arDocument["TRAITS"][GetMessage("CC_BSC1_1C_RETURN")] == "true")
1196 {
1197 $payment->setField("IS_RETURN", 'Y');
1198 $payment->setField("PAY_RETURN_COMMENT", $arDocument["TRAITS"][GetMessage("CC_BSC1_1C_RETURN_REASON")]);
1199 }
1200 }
1201 }
1202 function addPaymentFromDocumentByOrder(array $arDocument, \Bitrix\Sale\Order $order)
1203 {
1204 $this->logMessage("NewPayment: ");
1205 $this->logMessage("ORDER_ID: ".$arDocument['ORDER_ID']);
1206 $this->logMessage("CURRENCY: ".CSaleLang::GetLangCurrency($this->getSiteId()));
1207 $this->logMessage("Document.VERSION_1C: ".$arDocument["VERSION_1C"]);
1208 $this->logMessage("Document.AMOUNT: ".$arDocument["AMOUNT"]);
1209 $this->logMessage("Document.COMMENT: ".$arDocument["COMMENT"]);
1210 $this->logMessage("Document.PAYED: ".$arDocument["TRAITS"][GetMessage("CC_BSC1_1C_PAYED")]);
1211 $this->logMessage("Document.PAYED_DATE: ".$arDocument["TRAITS"][GetMessage("CC_BSC1_1C_PAYED_DATE")]);
1212 $this->logMessage("Document.PAYED_NUM: ".$arDocument["TRAITS"][GetMessage("CC_BSC1_1C_PAYED_NUM")]);
1213
1214 $paymentServiceId = intval(\Bitrix\Main\Config\Option::get('sale', self::getOptionNameByType(), 0));
1215 if($paymentServiceId<=0)
1217
1218 if ($paySystem = \Bitrix\Sale\PaySystem\Manager::getObjectById($paymentServiceId))
1219 {
1221 $paymentCollection = $order->getPaymentCollection();
1222 $payment = $paymentCollection->createItem($paySystem);
1223
1224 $payment->setField("SUM", $arDocument["AMOUNT"]);
1225 $payment->setField("CURRENCY", CSaleLang::GetLangCurrency($this->getSiteId())) ;
1226
1227 $payment->setField("COMMENTS", $arDocument["COMMENT"]);
1228
1229 if ($arDocument["TRAITS"][GetMessage("CC_BSC1_1C_PAYED")] == "true")
1230 {
1231 $this->logMessage("Payment.Paid: Y");
1232
1233 $payment->setField('PAID', 'Y');
1234
1235 if ($arDocument["TRAITS"][GetMessage("CC_BSC1_1C_PAYED_DATE")] <> '')
1236 {
1237 $date = new Bitrix\Main\Type\Date(CDatabase::FormatDate(str_replace("T", " ", $arDocument["TRAITS"][GetMessage("CC_BSC1_1C_PAYED_DATE")]), "YYYY-MM-DD HH:MI:SS", CLang::GetDateFormat("FULL", LANG)));
1238 $payment->setField("PAY_VOUCHER_DATE", $date);
1239 }
1240
1241 if ($arDocument["TRAITS"][GetMessage("CC_BSC1_1C_PAYED_NUM")] <> '')
1242 $payment->setField("PAY_VOUCHER_NUM", $arDocument["TRAITS"][GetMessage("CC_BSC1_1C_PAYED_NUM")]);
1243 }
1244
1245 return $payment;
1246
1247 }
1248 else
1249 $this->strErrorDocument .= "\n ".GetMessage("CC_BSC1_PAYMENT_ERROR_7", Array('#XML_1C_DOCUMENT_ID#'=>$this->getXMLDocumentID())).GetMessage("CC_BSC1_ORDER_NOT_FOUND");
1250
1251 return null;
1252 }
1253
1254 function addOrderWithoutShipmentsPayments(array $arDocument, $addOrderField=array())
1255 {
1256 $this->logMessage("NewShipmentNewOrder: ");
1257
1259 $key = $eventManager->addEventHandler('sale', 'OnSaleOrderBeforeSaved', Array($this, "onBeforeSaveOrderWithoutShipmentsPayments"));
1260
1261 $addOrderField['EXTERNAL_ORDER'] = 'Y';
1262 $arOrder = $this->saveOrderCompatibility($arDocument, $addOrderField);
1263
1264 removeEventHandler('sale', 'OnSaleOrderBeforeSaved', $key);
1265
1266 return $arOrder;
1267 }
1269 {
1270 $this->logMessage("NewShipment: ");
1271
1272 $serviceId = \Bitrix\Main\Config\Option::get('sale', '1C_IMPORT_DEFAULT_SHIPMENT_SERVICE', 0);
1273 if(intval($serviceId)<=0)
1274 {
1276 if($serviceId<=0)
1277 {
1280 }
1281 }
1283
1284 $shipmentCollection = $order->getShipmentCollection();
1285
1286 $shipment = $shipmentCollection->createItem($service);
1287
1288 $shipment->setField('DELIVERY_NAME', $service ? $service->getName() : 'Not Found');
1289
1290 $this->updateShipmentQuantityFromDocument($arDocument, $shipment);
1291
1292 return $shipment;
1293 }
1295 {
1296 if ($this->checkVersion1C($shipment)) // skip update if the same version
1297 {
1298 $basket = $shipment->getCollection()->getOrder()->getBasket();
1299
1300 foreach ($basket as $basketItem)
1301 {
1302 foreach ($arDocument['items'] as $k=>$item)
1303 {
1304 if(
1305 $this->existsBasketItem($basketItem, $item) &&
1306 $item[$basketItem->getField('PRODUCT_XML_ID')]['PRICE'] == $basketItem->getField('PRICE')
1307 )
1308 {
1309 if(!$this->checkConditionForShipmentByBasket($basketItem, $shipment))
1310 continue;
1311
1312 $shipmentItemCollection = $shipment->getShipmentItemCollection();
1313 $shipmentItem = $shipmentItemCollection->getItemByBasketCode($basketItem->getBasketCode());
1314 if ($shipmentItem === null)
1315 $shipmentItemQuantity = 0;
1316 else
1317 $shipmentItemQuantity = $shipmentItem->getQuantity();
1318
1319
1320 $externalQuantity = intval($item[$basketItem->getField('PRODUCT_XML_ID')]['QUANTITY']);
1321
1322 if($externalQuantity < $shipmentItemQuantity)
1323 {
1324 $needQuantity = $shipmentItemQuantity-$externalQuantity;
1325
1326 $this->setShipmentItemQuantity(array('minus',$needQuantity), $basketItem, $shipment);
1327 }
1328 elseif($externalQuantity > $shipmentItemQuantity)
1329 {
1330 $availableQuantityByProducts = $this->getAvailableQuentityProduct($basketItem, $shipment);
1331
1332 if($externalQuantity <= $availableQuantityByProducts)
1333 {
1334 $needQuantity = $externalQuantity-$shipmentItemQuantity;
1335
1336 $this->updateShipmentItemQuantity($needQuantity, $basketItem, $shipment);
1337
1338 }
1339 elseif(\Bitrix\Main\Config\Option::get("sale", "1C_IMPORT_UPDATE_BASKET_QUANTITY", 'Y')=='Y')
1340 {
1341 $this->updateBasketNeedExternalQuantity($externalQuantity, $availableQuantityByProducts, $basketItem, $shipment);
1342 }
1343 else
1344 {
1345 $this->strErrorDocument .= "\n ".GetMessage("CC_BSC1_SHIPMENT_ERROR_8", Array('#ID#'=>$shipment->getId(),'#XML_1C_DOCUMENT_ID#'=>$this->getXMLDocumentID()));
1346 }
1347 }
1348
1349 $arDocument['items'][$k][$basketItem->getField('PRODUCT_XML_ID')]["CHECKED"] = "Y";
1350
1351 }
1352 elseif(
1353 $this->existsBasketItem($basketItem, $item) &&
1354 $item[$basketItem->getField('PRODUCT_XML_ID')]['PRICE'] <> $basketItem->getField('PRICE')
1355 )
1356 {
1357 $this->addNeedModifyItem('CHANGE_PRODUCTS',array(
1358 'PRODUCT_XML_ID'=>$basketItem->getField('PRODUCT_XML_ID'),
1359 'PRICE_ORIG'=>$basketItem->getField('PRICE'),
1360 'PRICE_NEW'=>$item[$basketItem->getField('PRODUCT_XML_ID')]['PRICE_ONE'],
1361 'BASKET_ID'=>$basketItem->getId(),
1362 'SHIPMENT_ID'=>$shipment->getId(),
1363 ));
1364 }
1365 }
1366 }
1367
1368 if(!empty($arDocument["items"]))
1369 {
1370 $newBasketItems = array();
1371 foreach ($arDocument["items"] as $k=>$item)
1372 {
1373 foreach ($item as $itemID => $arItem)
1374 {
1375 if ($arItem["CHECKED"] != "Y")
1376 {
1377 if ($product = $this->getProductChangePrice($itemID, $arItem['PRICE_ONE']))
1378 {
1379 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_SHIPMENT_ERROR_9", Array('#XML_1C_DOCUMENT_ID#'=>$this->getXMLDocumentID()));
1380 }
1381 else
1382 {
1383 $newBasketItems['items'][$k][$itemID] = $arItem;
1384 }
1385 }
1386 }
1387 }
1388
1389
1390 if(is_array($newBasketItems) && count($newBasketItems)>0)
1391 {
1392 $newBasketItems['ORDER_ID'] = $arDocument['ORDER_ID'];
1393 $newBasketItems['CURRENCY'] = CSaleLang::GetLangCurrency($this->getSiteId());
1394 $this->addBasketForShipment($arDocument, $newBasketItems, $shipment);
1395 }
1396 }
1397 }
1398
1399 if(!$shipment->isShipped())
1400 {
1401 foreach ($arDocument['items'] as $item)
1402 {
1403 foreach ($item as $arItem)
1404 {
1405 if($arItem["TYPE"] == GetMessage("CC_BSC1_SERVICE"))
1406 {
1407 if (intval($arItem["PRICE"]) != intval($shipment->getField('PRICE_DELIVERY')))
1408 {
1409 $shipment->setBasePriceDelivery($arItem["PRICE"], true);
1410 $shipment->setField('CURRENCY',CSaleLang::GetLangCurrency($this->getSiteId()));
1411 }
1412
1413 }
1414 }
1415 }
1416 if ($arDocument["COMMENT"] <> '' && $arDocument["COMMENT"] != $shipment->getField('COMMENT'))
1417 $shipment->setField("COMMENTS", $arDocument["COMMENT"]);
1418 }
1419
1420 if($arDocument["TRAITS"][GetMessage("CC_BSC1_1C_DELIVERY_NUM")] <> '')
1421 $shipment->setField("DELIVERY_DOC_NUM", $arDocument["TRAITS"][GetMessage("CC_BSC1_1C_DELIVERY_NUM")]);
1422
1423 if (isset($arDocument["TRAITS"][GetMessage("CC_BSC1_1C_TRACKING_NUMBER")]) && strval($arDocument["TRAITS"][GetMessage("CC_BSC1_1C_TRACKING_NUMBER")]) != '')
1424 $shipment->setField('TRACKING_NUMBER', $arDocument["TRAITS"][GetMessage("CC_BSC1_1C_TRACKING_NUMBER")]);
1425
1426 if($arDocument["TRAITS"][GetMessage("CC_BSC1_CANCEL")] == "true")
1427 {
1428 if($shipment->isShipped())
1429 {
1430 $shipment->setField('DEDUCTED','N');
1431 }
1432 }
1433 }
1434
1435 function deleteShipmentItemsByDocument($arDocument, \Bitrix\Sale\Shipment $shipment)
1436 {
1437 if ($this->checkVersion1C($shipment)) // skip update if the same version
1438 {
1440 $basket = $shipment->getCollection()->getOrder()->getBasket();
1441 foreach($basket as $basketItem)
1442 {
1443 foreach($arDocument['items'] as $item)
1444 {
1445 if(!$this->existsBasketItem($basketItem, $item))
1446 {
1447 $shipmentItems = $shipment->getShipmentItemCollection()->getItemByBasketCode($basketItem->getId());
1448 if (!is_null($shipmentItems))
1449 {
1450 $shipmentItems->delete();
1451 $this->logMessage("BasketItem: " . "[" . $shipmentItems->getId() . "]" . $shipmentItems->getField('NAME'));
1452 }
1453 }
1454 }
1455 }
1456 }
1457 }
1458
1459 function updateShipmentNeedQuantity($externalQuantity, \Bitrix\Sale\BasketItem $basketItem, \Bitrix\Sale\Shipment $shipment, $shipmentItemFields)
1460 {
1461 $availableQuantityByProducts = $this->getAvailableQuentityProduct($basketItem->getId());
1462
1463 if(empty($availableQuantityByProducts['SYSTEM'][$basketItem->getField('PRODUCT_XML_ID')]))
1464 {
1465 $systemShipmentQuantity = 0;
1466 }
1467 else
1468 {
1469 $systemShipmentQuantity = intval($availableQuantityByProducts['SYSTEM'][$basketItem->getField('PRODUCT_XML_ID')]);
1470 }
1471
1472 $needQuantity = $externalQuantity-$shipmentItemFields['QUANTITY'];
1473
1474 if($systemShipmentQuantity >= $needQuantity)
1475 {
1476 $this->updateShipmentNeedQuantityFromSystem($needQuantity, $basketItem, $shipment);
1477 }
1478 else
1479 {
1480 $needQuantityWithoutSystem = $needQuantity-$systemShipmentQuantity;
1481
1482 $this->updateShipmentNeedQuantityFromBasketItems( $needQuantityWithoutSystem, $needQuantity, $basketItem, $shipment);
1483 }
1484 }
1485 function updateShipmentNeedQuantityFromBasketItems( $needQuantityWithoutSystem, $needQuantity, \Bitrix\Sale\BasketItem $basketItem, \Bitrix\Sale\Shipment $shipment)
1486 {
1487 $order = $basketItem->getCollection()->getOrder();
1488
1489 foreach($order->getShipmentCollection() as $shipmentAny)
1490 {
1491 if($shipmentAny->isSystem())
1492 continue;
1493 if($shipmentAny->getId() == $shipment->getId())
1494 continue;
1495 if(!$this->checkConditionForShipmentByBasket($basketItem, $shipmentAny))
1496 continue;
1497
1498 $shipmentItemAny = $shipmentAny->getShipmentItemCollection()->getItemByBasketCode($basketItem->getBasketCode());
1499 if($shipmentItemAny === null)
1500 continue;
1501
1502 if($needQuantityWithoutSystem < $shipmentItemAny->getQuantity())
1503 {
1504 $this->setShipmentItemQuantity(array('minus',$needQuantityWithoutSystem), $basketItem, $shipmentAny);
1505
1506 $needQuantityWithoutSystem = 0;
1507 }
1508 elseif($needQuantityWithoutSystem >= $shipmentItemAny->getQuantity())
1509 {
1510 $shipmentItemAnyQuantity = $shipmentItemAny->getQuantity();
1511 $this->setShipmentItemQuantity(array('minus',$shipmentItemAnyQuantity), $basketItem, $shipmentAny);
1512
1513 $needQuantityWithoutSystem = $needQuantityWithoutSystem - $shipmentItemAnyQuantity;
1514 }
1515
1516 if($needQuantityWithoutSystem == 0)
1517 {
1518 $this->setShipmentItemQuantity(array('plus',$needQuantity), $basketItem, $shipment);
1519 break;
1520 }
1521 }
1522 }
1523 function updateShipmentItemQuantity($needQuantity, \Bitrix\Sale\BasketItem $basketItem, \Bitrix\Sale\Shipment $shipment)
1524 {
1525 $systemShipmentQuantity = $this->getAvailableSystemQuentityProduct($basketItem, $shipment);
1526 $this->logMessage("updateShipmentItemQuantity.systemShipmentQuantity: ".$systemShipmentQuantity);
1527
1528 if($systemShipmentQuantity >= $needQuantity)
1529 {
1530
1531 $this->setShipmentItemQuantity(array('plus',$needQuantity), $basketItem, $shipment);
1532 }
1533 else
1534 {
1535 $needQuantityWithoutSystem = $needQuantity-$systemShipmentQuantity;
1536 $this->logMessage("updateShipmentItemQuantity.needQuantityWithoutSystem: ".$needQuantityWithoutSystem);
1537
1538 $this->updateShipmentNeedQuantityFromBasketItems($needQuantityWithoutSystem, $needQuantity, $basketItem, $shipment);
1539 }
1540 }
1541 function setShipmentItemQuantity($needQuantity, \Bitrix\Sale\BasketItem $basketItem, \Bitrix\Sale\Shipment $shipment)
1542 {
1543 $this->logMessage("setShipmentItemQuantity.needQuantity: ".print_r($needQuantity,true));
1544
1545 $shipmentItemCollection = $shipment->getShipmentItemCollection();
1546 $shipmentItem = $shipmentItemCollection->getItemByBasketCode($basketItem->getBasketCode());
1547 if ($shipmentItem === null)
1548 $shipmentItem = $shipmentItemCollection->createItem($basketItem);
1549
1550 if($needQuantity[0]=='plus')
1551 {
1552 $r=$shipmentItem->setQuantity($shipmentItem->getQuantity()+ $needQuantity[1]);
1553 }
1554 elseif($needQuantity[0]=='minus')
1555 {
1556 if($shipmentItem->getField('QUANTITY')==$needQuantity[1])
1557 $r=$shipmentItem->delete();
1558 else
1559 $r=$shipmentItem->setQuantity($shipmentItem->getQuantity()+($needQuantity[1] * -1));
1560 }
1561 if(!$r->isSuccess())
1562 {
1563 $error = array_shift($r->getErrors());
1564 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_SHIPMENT_ERROR_10", Array('#ID#'=>$shipment->getId(),'#XML_1C_DOCUMENT_ID#'=>$this->getXMLDocumentID())).$error->getMessage();
1565
1566 }
1567 }
1568
1569 function updateShipmentNeedQuantityFromSystem($Quantity, \Bitrix\Sale\BasketItem $basketItem, \Bitrix\Sale\Shipment $shipment)
1570 {
1571 $needQuantity = array('plus',$Quantity);
1572
1573 $this->setShipmentItemQuantity($Quantity, $basketItem, $shipment);
1574 }
1575
1576 function updateBasketNeedExternalQuantity($externalQuantity, $availableQuantityByProducts, \Bitrix\Sale\BasketItem $basketItem, \Bitrix\Sale\Shipment $shipment)
1577 {
1578
1579 $needQuantity = $externalQuantity - $availableQuantityByProducts;
1580 $this->logMessage("updateBasketNeedExternalQuantity.needQuantity: ".$needQuantity);
1581 $this->logMessage("updateBasketNeedExternalQuantity.basketId: ".$basketItem->getId());
1582
1583 $fields = array();
1584 $fields["QUANTITY"] = $basketItem->getField('QUANTITY')+$needQuantity;
1585 $basketItem->setFields($fields);
1586
1587 $availableQuantityByProducts = $this->getAvailableQuentityProduct($basketItem, $shipment);
1588 $this->logMessage("updateBasketNeedExternalQuantity.availableQuantityByProducts: ".$availableQuantityByProducts);
1589 $this->logMessage("updateBasketNeedExternalQuantity.externalQuantity: ".$externalQuantity);
1590
1591 if($externalQuantity <= $availableQuantityByProducts)
1592 {
1593 $this->updateShipmentItemQuantity($externalQuantity, $basketItem, $shipment);
1594 }
1595 else
1596 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_SHIPMENT_ERROR_11", Array('#ID#'=>$shipment->getId(),'#XML_1C_DOCUMENT_ID#'=>$this->getXMLDocumentID()));
1597 }
1599 {
1600 $documentType = '';
1601
1602 switch ($operationType)
1603 {
1604 case 'pay_system_c_operation':
1605 case 'pay_system_b_operation':
1606 case 'pay_system_a_operation':
1607 $documentType = 'payment';
1608 break;
1609 case 'shipment_operation':
1610 $documentType = 'shipment';
1611 break;
1612 case 'order_operation':
1613 $documentType = 'order';
1614 break;
1615 }
1616
1617 return $documentType;
1618 }
1620 {
1621 switch ($type)
1622 {
1623 case GetMessage("CC_BSC1_PAYMENT_C"):
1624 self::$operationType = 'pay_system_c_operation';
1625 break;
1626 case GetMessage("CC_BSC1_PAYMENT_B"):
1627 self::$operationType = 'pay_system_b_operation';
1628 break;
1629 case GetMessage("CC_BSC1_PAYMENT_A"):
1630 self::$operationType = 'pay_system_a_operation';
1631 break;
1632 case GetMessage("CC_BSC1_SHIPMENT"):
1633 self::$operationType = 'shipment_operation';
1634 break;
1635 case GetMessage("CC_BSC1_ORDER"):
1636 self::$operationType = 'order_operation';
1637 break;
1638 }
1639 }
1641 {
1642 $this->version1C = $version1C;
1643 }
1644 function setXMLDocumentID($xmlid)
1645 {
1646 $this->xmlid1C = $xmlid;
1647 }
1649 {
1650 $this->orderIdOrig = $code;
1651 }
1652 function getVersion1C()
1653 {
1654 return $this->version1C;
1655 }
1657 {
1658 return $this->xmlid1C;
1659 }
1661 {
1662 return $this->orderIdOrig;
1663 }
1665 {
1666 if ($basketItem->getCollection()->getOrder()->getField("STATUS_ID") == "F")
1667 return false;
1668
1669 if(!$this->checkVersion1C($shipment))
1670 return false;
1671
1672 if ($shipment->isShipped())
1673 return false;
1674
1675 return true;
1676 }
1677
1681 protected static function getDefaultPaySystem()
1682 {
1683 static $id = null;
1684 static $innerPsId = null;
1685
1686 if (!is_set($id))
1687 $id = (int)\Bitrix\Main\Config\Option::get('sale', '1C_IMPORT_DEFAULT_PS_ORDER_PAID', 0);
1688
1689 if (!is_set($innerPsId))
1691
1692 if($id > 0)
1693 {
1694 if($innerPsId > 0)
1695 {
1696 if($innerPsId == $id)
1697 return false;
1698 }
1699 }
1700 else
1701 {
1703 'select' => array('ID'),
1704 'filter' => array('!ACTION_FILE' => 'inner', 'ACTIVE'=>'Y'),
1705 'order' => array('ID'=>'ASC')
1706 ));
1707 if($result = $r->fetch())
1708 {
1709 $id = (int)$result['ID'];
1710 }
1711 else
1712 return false;
1713 }
1714
1715 return $id;
1716 }
1717
1719 {
1720 static $psOnStatusPaymentOrder = null;
1721 static $innerPsId = null;
1722
1723 if (!is_set($psOnStatusPaymentOrder))
1724 $psOnStatusPaymentOrder = \Bitrix\Main\Config\Option::get('sale', '1C_IMPORT_DEFAULT_PS_ORDER_PAID', 0);
1725
1726 if (!is_set($innerPsId))
1728
1729 if($psOnStatusPaymentOrder > 0)
1730 {
1731 if($innerPsId > 0)
1732 {
1733 if($innerPsId == $psOnStatusPaymentOrder)
1734 return false;
1735 }
1736 }
1737 else
1738 return false;
1739
1740 return true;
1741 }
1742 function checkVersion1C(\Bitrix\Sale\Shipment $shipment)
1743 {
1744 if ($this->getVersion1C() != $shipment->getField('VERSION_1C') || ($shipment->getField('VERSION_1C') == '' || $this->getVersion1C() == ''))
1745 return true;
1746 else
1747 return false;
1748 }
1750 {
1751 if($this->crmCompatibleMode)
1752 {
1753 $_SESSION['versionSchema'] = self::DEFUALT_VERSION;
1754 }
1755 else
1756 $_SESSION['versionSchema'] = $versionSchema;
1757 }
1759 {
1760 if(empty($this->arPersonTypesIDs))
1761 {
1762 $dbPT = CSalePersonType::GetList(array(), array("ACTIVE" => "Y", "LIDS" => $this->getSiteId()));
1763 while($arPT = $dbPT->Fetch())
1764 {
1765 $this->arPersonTypesIDs[] = $arPT["ID"];
1766 }
1767 }
1768 }
1769 function setExportInfo()
1770 {
1771 if(empty($this->arExportInfo))
1772 {
1773 $dbExport = CSaleExport::GetList(array(), array("PERSON_TYPE_ID" => $this->arPersonTypesIDs));
1774 while($arExport = $dbExport->Fetch())
1775 {
1776 $this->arExportInfo[$arExport["PERSON_TYPE_ID"]] = unserialize($arExport["VARS"], ['allowed_classes' => false]);
1777 }
1778 }
1779 }
1780 function getPersonType($arOrder)
1781 {
1782 foreach($this->arExportInfo as $pt => $value)
1783 {
1784 if(
1785 (($value["IS_FIZ"] == "Y" && $arOrder["AGENT"]["TYPE"] == "FIZ")
1786 || ($value["IS_FIZ"] == "N" && $arOrder["AGENT"]["TYPE"] != "FIZ"))
1787 )
1788 $arOrder["PERSON_TYPE_ID"] = $pt;
1789 }
1790 return $arOrder;
1791 }
1792 function getExportInfo($arOrder)
1793 {
1794 $arAgent = $this->arExportInfo[$arOrder["PERSON_TYPE_ID"]];
1795 foreach($arAgent as $k => $v)
1796 {
1797 if(empty($v) ||
1798 (
1799 (empty($v["VALUE"]) || $v["TYPE"] != "PROPERTY") &&
1800 (empty($arOrder["USER_PROPS"])
1801 || (is_array($v) && is_string($v["VALUE"]) && empty($arOrder["USER_PROPS"][$v["VALUE"]]))
1802 )
1803 )
1804 )
1805 unset($arAgent[$k]);
1806 }
1807 return $arAgent;
1808 }
1809 function prepareOrderFields($arOrder)
1810 {
1811 return array(
1812 "SITE_ID" => $this->getSiteId(),
1813 "PERSON_TYPE_ID" => $arOrder["PERSON_TYPE_ID"],
1814 "PAYED" => "N",
1815 "CANCELED" => "N",
1816 "STATUS_ID" => "N",
1817 "PRICE" => $arOrder["AMOUNT"],
1818 "CURRENCY" => CSaleLang::GetLangCurrency($this->getSiteId()),
1819 "USER_ID" => $arOrder["USER_ID"],
1820 "TAX_VALUE" => doubleval($arOrder["TAX"]["VALUE_MONEY"]),
1821 "COMMENTS" => $arOrder["COMMENT"],
1822 "BASKET_ITEMS" => array(),
1823 "TAX_LIST" => array(),
1824 "ORDER_PROP" => array(),
1825 );
1826 }
1827 function getOrderTaxList($arOrder)
1828 {
1829 $orderFields = array();
1830 if(!empty($arOrder["TAX"]))
1831 {
1832 $orderFields[] = array(
1833 "NAME" => $arOrder["TAX"]["NAME"],
1834 "IS_PERCENT" => "Y",
1835 "VALUE" => $arOrder["TAX"]["VALUE"],
1836 "VALUE_MONEY" => $arOrder["TAX"]["VALUE_MONEY"],
1837 "IS_IN_PRICE" => $arOrder["TAX"]["IS_IN_PRICE"],
1838 "CODE" => 'VAT1C',
1839 "APPLY_ORDER" => '100',
1840 );
1841 }
1842 return $orderFields;
1843 }
1844 function getBasketProperty($item)
1845 {
1846 $result = array();
1847 if(is_array($item['ATTRIBUTES']))
1848 {
1849 foreach($item['ATTRIBUTES'] as $id=>$value)
1850 {
1851 $result[] = array('CODE'=>$id, 'VALUE'=>$value);
1852 }
1853 }
1854
1855 return $result;
1856 }
1857 function getOrderProperty($arAgent, $orderFields, $arOrder)
1858 {
1859 foreach($arAgent as $k => $v)
1860 {
1861 if(!empty($arOrder["ORDER_PROPS"][$k]))
1862 {
1863 $orderFields["ORDER_PROP"][$v["VALUE"]] = $arOrder["ORDER_PROPS"][$k];
1864 }
1865 if(empty($orderFields["ORDER_PROP"][$v["VALUE"]]) && !empty($arOrder["USER_PROPS"][$v["VALUE"]]))
1866 {
1867 $orderFields["ORDER_PROP"][$v["VALUE"]] = $arOrder["USER_PROPS"][$v["VALUE"]];
1868 }
1869 }
1870 return $orderFields;
1871 }
1873 {
1874 $optionName = '';
1875 switch(self::$operationType)
1876 {
1877 case 'pay_system_b_operation':
1878 $optionName = '1C_IMPORT_DEFAULT_PS_B';
1879 break;
1880 case 'pay_system_c_operation':
1881 $optionName = '1C_IMPORT_DEFAULT_PS';
1882 break;
1883 case 'pay_system_a_operation':
1884 $optionName = '1C_IMPORT_DEFAULT_PS_A';
1885 break;
1886 }
1887 return $optionName;
1888 }
1890 {
1891 return doubleval(str_replace(" ", "", str_replace(",", ".", (!empty($_SESSION['versionSchema']) ? $_SESSION['versionSchema'] : self::DEFUALT_VERSION))));
1892 }
1893
1895 {
1896 $this->needModifyItem[$type][]=$id;
1897 }
1898 function addModifyItem($type,$id)
1899 {
1900 if(!in_array($id, $this->modifyItem[$type]))
1901 $this->modifyItem[$type][]=$id;
1902 }
1903
1904 function getProductChangePrice($itemID,$priceNew=null)
1905 {
1906 if (!empty($this->needModifyItem['CHANGE_PRODUCTS']) && count($this->needModifyItem['CHANGE_PRODUCTS']) > 0)
1907 {
1908 foreach ($this->needModifyItem['CHANGE_PRODUCTS'] as $products)
1909 {
1910 if ($products['PRODUCT_XML_ID'] == $itemID)
1911 {
1912
1913 if(!empty($priceNew))
1914 {
1915 if($products['PRICE_NEW'] == $priceNew)
1916 return $products;
1917 }
1918 else
1919 return $products;
1920 }
1921 }
1922 }
1923 return false;
1924 }
1926 {
1927 $systemQuantity = 0;
1928 $systemShipment = $shipment->getCollection()->getSystemShipment();
1929 $systemShipmentItem = $systemShipment->getShipmentItemCollection();
1930 if (!is_null($systemShipmentItem))
1931 {
1932 $sipmentItem = $systemShipmentItem->getItemByBasketCode($basketItem->getBasketCode());
1933 if($sipmentItem !== null)
1934 $systemQuantity = $sipmentItem->getQuantity();
1935 }
1936 return $systemQuantity;
1937 }
1939 {
1940 $quantity = 0;
1941 $order = $basketItem->getCollection()->getOrder();
1942 foreach($order->getShipmentCollection() as $shipment)
1943 {
1944 if($this->checkConditionForShipmentByBasket($basketItem, $shipment))
1945 {
1946 $sipmentItem = $shipment->getShipmentItemCollection()->getItemByBasketCode($basketItem->getBasketCode());
1947 if($sipmentItem !== null)
1948 $quantity +=$sipmentItem->getQuantity();
1949 }
1950 }
1951 return $quantity;
1952 }
1953
1954 function getUserByProperty($arOrder)
1955 {
1956 if(!empty($arOrder["AGENT"]) && $arOrder["AGENT"]["ID"] <> '')
1957 {
1958 $arOrder["PERSON_TYPE_ID"] = 0;
1959 $arOrder["USER_ID"] = 0;
1960 $arErrors = array();
1961 $dbUProp = CSaleOrderUserProps::GetList(array(), array("XML_ID" => $arOrder["AGENT"]["ID"]), false, false, array("ID", "NAME", "USER_ID", "PERSON_TYPE_ID", "XML_ID", "VERSION_1C"));
1962 if ($arUProp = $dbUProp->Fetch()) {
1963 $arOrder["USER_ID"] = $arUProp["USER_ID"];
1964 $arOrder["PERSON_TYPE_ID"] = $arUProp["PERSON_TYPE_ID"];
1965 $arOrder["USER_PROFILE_ID"] = $arUProp["ID"];
1966 $arOrder["USER_PROFILE_VERSION"] = $arUProp["VERSION_1C"];
1967
1968 $dbUPropValue = CSaleOrderUserPropsValue::GetList(array(), array("USER_PROPS_ID" => $arUProp["ID"]));
1969 while ($arUPropValue = $dbUPropValue->Fetch()) {
1970 $arOrder["USER_PROPS"][$arUPropValue["ORDER_PROPS_ID"]] = $arUPropValue["VALUE"];
1971 }
1972 } else {
1973 if ($arOrder["AGENT"]["ID"] <> '') {
1974 $arAI = explode("#", $arOrder["AGENT"]["ID"]);
1975 if (intval($arAI[0]) > 0) {
1976 $dbUser = CUser::GetByID($arAI[0]);
1977 if ($arU = $dbUser->Fetch()) {
1978 if (htmlspecialcharsback(mb_substr(htmlspecialcharsbx($arU["ID"]."#".$arU["LOGIN"]."#".$arU["LAST_NAME"]." ".$arU["NAME"]." ".$arU["SECOND_NAME"]), 0, 80)) == $arOrder["AGENT"]["ID"]) {
1979 $arOrder["USER_ID"] = $arU["ID"];
1980 }
1981 }
1982 }
1983 }
1984
1985 if (intval($arOrder["USER_ID"]) <= 0) {
1986 //create new user
1987 $arUser = array(
1988 "NAME" => $arOrder["AGENT"]["ITEM_NAME"],
1989 "EMAIL" => $arOrder["AGENT"]["CONTACT"]["MAIL_NEW"],
1990 );
1991
1992 if ($arUser["NAME"] == '')
1993 $arUser["NAME"] = $arOrder["AGENT"]["CONTACT"]["CONTACT_PERSON"];
1994
1995 $emServer = $_SERVER["SERVER_NAME"];
1996 if(mb_strpos($_SERVER["SERVER_NAME"], ".") === false)
1997 $emServer .= ".bx";
1998
1999 if ($arUser["EMAIL"] == '')
2000 $arUser["EMAIL"] = "buyer" . time() . GetRandomCode(2) . "@" . $emServer;
2001
2002 $arOrder["USER_ID"] = CSaleUser::DoAutoRegisterUser($arUser["EMAIL"], $arUser["NAME"], $this->getSiteId(), $arErrors, array("XML_ID"=>$arOrder["AGENT"]["ID"], "EXTERNAL_AUTH_ID"=>Sale\Exchange\Entity\UserImportBase::EXTERNAL_AUTH_ID));
2003
2004 $obUser = new CUser;
2005 $userFields[] = array();
2006
2007 if($arOrder["AGENT"]["CONTACT"]["PHONE"] <> '')
2008 $userFields["WORK_PHONE"] = $arOrder["AGENT"]["CONTACT"]["PHONE"];
2009
2010 if(count($userFields)>0)
2011 {
2012 if(!$obUser->Update($arOrder["USER_ID"], $userFields, true))
2013 $this->strErrorDocument .= "\n".$obUser->LAST_ERROR;
2014 }
2015 }
2016 }
2017 }
2018 return $arOrder;
2019 }
2020
2021 function elementHandler($path, $attr)
2022 {
2023 $val = $attr[GetMessage("SALE_EXPORT_FORM_SUMM")];
2024 if($val <> '')
2025 {
2026 if(preg_match("#".GetMessage("SALE_EXPORT_FORM_CRD")."=(.);{0,1}#", $val, $match))
2027 {
2028 $this->sdp = $match[1];
2029 }
2030 }
2031
2032 self::setVersionSchema($attr[GetMessage("CC_BSC1_COM_INFO_VARSION")]);
2033 }
2034
2035 function existsBasketItem(\Bitrix\Sale\BasketItem $basketItem, array $item = array())
2036 {
2037 if(!empty($item[$basketItem->getField("PRODUCT_XML_ID")]))
2038 {
2039 $propertyItem = $this->getBasketProperty($item[$basketItem->getField("PRODUCT_XML_ID")]);
2040
2041 $propertyBasketItem = array();
2043 if($basketPropertyCollection = $basketItem->getPropertyCollection())
2044 $propertyBasketItem = $basketPropertyCollection->getPropertyValues();
2045
2046 if(!empty($propertyItem) && is_array($propertyItem))
2047 {
2048 if($basketPropertyCollection->isPropertyAlreadyExists($propertyItem))
2049 return true;
2050 }
2051 elseif(count($propertyBasketItem)<=0)
2052 return true;
2053 }
2054 return false;
2055 }
2056
2057 protected function getXMLStream(CXMLFileStream $fileStream)
2058 {
2059 $startPosition = 0;
2060 $endPosition = 0;
2061
2062 $positionLast = $fileStream->getPosition();
2063
2064 if(isset($positionLast[1]))
2065 $endPosition = $positionLast[1];
2066
2067 $localSession = Application::getInstance()->getLocalSession('BX_CML2_EXPORT');
2068 $proccessXmlEntry = $localSession->get('proccess_xml_entry');
2069 if (is_array($proccessXmlEntry))
2070 {
2071 $position = $proccessXmlEntry;
2072
2073 if(isset($position[1]))
2074 $startPosition = $position[1];
2075 }
2076 else
2077 {
2078 foreach(explode("/", $positionLast[2]) as $pathPart)
2079 {
2080 @list($elementPosition, $elementName) = explode("@", $pathPart, 2);
2081 $positionStack[] = $elementPosition;
2082 }
2083 $startPosition = array_pop($positionStack);
2084 }
2085
2086 $localSession->set('proccess_xml_entry', $fileStream->getPosition());
2087
2088 if (($endPosition - $startPosition) <= 0)
2089 {
2090 return '';
2091 }
2092
2093 $xmlChunk = $fileStream->readFilePart($startPosition, $endPosition);
2094
2095 return \Bitrix\Main\Text\Encoding::convertEncoding($xmlChunk, $positionLast[0], LANG_CHARSET, $error);
2096 }
2097
2098 public function clearSessionData(): void
2099 {
2100 Application::getInstance()->getLocalSession('BX_CML2_EXPORT')->set('proccess_xml_entry', '');
2101 }
2102
2103 protected function nodeHandlerPartialVersion($arDocument)
2104 {
2108
2109 if(Sale\Configuration::useStoreControl() || \Bitrix\Main\Config\Option::get('catalog', 'enable_reservation', 'N')=='Y')
2110 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_USE_STORE_SALE_1");
2111 else
2112 {
2113 if(\Bitrix\Main\Config\Option::get("main", "~sale_converted_15", 'N') <> 'Y')
2114 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_CONVERT_SALE");
2115 else
2116 {
2117 if(\Bitrix\Main\Config\Option::get("sale", "allow_deduction_on_delivery", "N") == 'Y')
2118 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_SALE_ALLOW_DEDUCTION_ON_DELIVERY_ERROR");
2119 else
2120 {
2121 if(!self::getDefaultPaySystem())
2122 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_PS_ON_STATUS_PAYMENT_ORDER_ERROR");
2123 else
2124 {
2125 $this->logMessage("OperationType: ".$arDocument['OPERATION_TYPE']);
2126
2127 $registry = \Bitrix\Sale\Registry::getInstance(\Bitrix\Sale\Registry::REGISTRY_TYPE_ORDER);
2128
2130 $orderClass = $registry->getOrderClassName();
2131
2132 switch($arDocument['OPERATION_TYPE'])
2133 {
2134 case 'order_operation':
2135
2137 if($arDocument["XML_1C_DOCUMENT_ID"] <> '')
2138 {
2139 $this->setVersion1C($arDocument["VERSION_1C"]);
2140 $this->setXMLDocumentID($arDocument["XML_1C_DOCUMENT_ID"]);
2141
2142 $this->logMessage("Document.XML_1C_DOCUMENT_ID: ".$arDocument['XML_1C_DOCUMENT_ID']);
2143 $this->logMessage("Document.VERSION_1C: ".$arDocument['VERSION_1C']);
2144
2145 if(intval($arDocument["ID"])>0)
2146 {
2147 $this->logMessage("UpdateOrder:");
2148 $this->logMessage("ID: ".$arDocument['ID']);
2149
2150 $this->updateOrderWithoutShipmentsPayments($arDocument);
2151 if($this->strErrorDocument == '')
2152 {
2153 $order = $orderClass::load($arDocument["ID"]);
2154
2155 $this->updateEntityCompatible1C($order, $arDocument);
2156
2157 $order->setField('UPDATED_1C', 'Y');
2158 $order->setField('VERSION_1C', $this->getVersion1C());
2159 $order->setField('ID_1C', $this->getXMLDocumentID());
2160 $r = $order->save();
2161 if (!$r->isSuccess())
2162 $this->strErrorDocument .= array_shift($r->getErrors())->getMessage();
2163 }
2164 }
2165 elseif(\Bitrix\Main\Config\Option::get("sale", "1C_IMPORT_NEW_ORDERS", "Y") == "Y")
2166 {
2167 $this->logMessage("NewOrder:");
2168
2169 $arOrder = $this->addOrderWithoutShipmentsPayments($arDocument);
2170
2171 if(intval($arOrder['ID'])>0)
2172 {
2173 $order = $orderClass::load($arOrder["ID"]);
2174 if($this->strErrorDocument == '')
2175 {
2176 $this->createEntityCompatible1C($order, $arDocument);
2177
2178 $order->setField('EXTERNAL_ORDER','Y');
2179 $order->setField('UPDATED_1C','Y');
2180 $order->setField('VERSION_1C', $this->getVersion1C());
2181 $order->setField('ID_1C', $this->getXMLDocumentID());
2182
2183 if($arDocument["DATE"] <> '')
2184 $order->setField('DATE_INSERT', new Bitrix\Main\Type\DateTime(CDatabase::FormatDate($arDocument["DATE"]." ".$arDocument["TIME"], "YYYY-MM-DD HH:MI:SS", CLang::GetDateFormat("FULL", LANG))));
2185 $r = $order->save();
2186 if(!$r->isSuccess())
2187 $this->strErrorDocument .= array_shift($r->getErrors())->getMessage();
2188 }
2189 }
2190 else
2191 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_ORDER_ERROR_2", Array('#XML_1C_DOCUMENT_ID#'=>$arDocument['XML_1C_DOCUMENT_ID']));
2192 }
2193 }
2194 else
2195 {
2196 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_ORDER_ERROR_1");
2197 }
2198 break;
2199 case 'pay_system_b_operation':
2200 case 'pay_system_c_operation':
2201 case 'pay_system_a_operation':
2202
2204 if(isset($arDocument['PAYMENT_ORDER_ID']) && $arDocument['ORDER_ID'] == '')
2205 $arDocument['ORDER_ID'] = $arDocument['PAYMENT_ORDER_ID'];
2206
2207 if($arDocument["XML_1C_DOCUMENT_ID"] <> '')
2208 {
2209 $this->setVersion1C($arDocument["VERSION_1C"]);
2210 $this->setXMLDocumentID($arDocument["XML_1C_DOCUMENT_ID"]);
2211
2212 $this->logMessage("Document.XML_1C_DOCUMENT_ID: ".$arDocument['XML_1C_DOCUMENT_ID']);
2213 $this->logMessage("Document.VERSION_1C: ".$arDocument['VERSION_1C']);
2214
2215 if($arDocument['ORDER_ID'] !== false)
2216 {
2217 if($order = $orderClass::load($arDocument['ORDER_ID']))
2218 {
2219 if (!$order->isCanceled())
2220 {
2221 if ($order->getField("STATUS_ID") != "F")
2222 {
2223 if($arDocument['CANCELED'] == "true")
2224 {
2225 $paymentCollection = $order->getPaymentCollection();
2226
2227 if($arDocument["ID"] <> '' && ($payment = $paymentCollection->getItemById($arDocument["ID"])))
2228 {
2229 $deletePayment = $this->deleteDocumentPayment($payment);
2230 if(!$deletePayment->isSuccess())
2231 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_ORDER_ERROR_4", Array('#XML_1C_DOCUMENT_ID#'=>$arDocument['XML_1C_DOCUMENT_ID'])).array_shift($deletePayment->getErrors())->getMessage();
2232 }
2233 else
2234 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_PAYMENT_ERROR_9", Array( '#ORDER_ID#'=>$arDocument['ORDER_ID'], '#XML_1C_DOCUMENT_ID#'=>$arDocument['XML_1C_DOCUMENT_ID']));
2235 }
2236 else
2237 {
2238 if($arDocument["ID"] <> '')
2239 {
2240 $paymentCollection = $order->getPaymentCollection();
2241
2242 if($payment = $paymentCollection->getItemById($arDocument["ID"]))
2243 {
2244 $this->beforePaidCompatible1C($order);
2245
2246 $this->updatePaymentFromDocument($arDocument, $payment);
2247
2248 if($this->strErrorDocument == '')
2249 {
2250 $this->Paid($payment, $arDocument);
2251
2252 $this->afterPaidCompatible1C($order);
2253
2254 if($this->strErrorDocument == '')
2255 {
2256 $payment->setField('UPDATED_1C','Y');
2257 $payment->setField('VERSION_1C', $this->getVersion1C());
2258 $payment->setField('ID_1C',$this->getXMLDocumentID());
2259 }
2260 }
2261 }
2262 else
2263 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_PAYMENT_ERROR_3", Array("#ID#" => $arDocument["ID"], '#ORDER_ID#'=>$arDocument['ORDER_ID'], '#XML_1C_DOCUMENT_ID#'=>$arDocument['XML_1C_DOCUMENT_ID']));
2264 }
2265 elseif (\Bitrix\Main\Config\Option::get("sale", "1C_IMPORT_NEW_PAYMENT", "Y") == 'Y') // create new payment (ofline 1C))
2266 {
2267 $this->beforePaidCompatible1C($order);
2268
2269 $payment = $this->addPaymentFromDocumentByOrder($arDocument, $order);
2270 if($this->strErrorDocument == '' && !is_null($payment))
2271 {
2272 $this->Paid($payment, $arDocument);
2273
2274 $this->afterPaidCompatible1C($order);
2275
2276 if($this->strErrorDocument == '')
2277 {
2278 $payment->setField('EXTERNAL_PAYMENT','Y');
2279 $payment->setField('VERSION_1C', $this->getVersion1C());
2280 $payment->setField('ID_1C',$this->getXMLDocumentID());
2281 }
2282 }
2283 }
2284 }
2285 }
2286 else
2287 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_PAYMENT_ERROR_10", Array('#ORDER_ID#'=>$order->getId(), '#XML_1C_DOCUMENT_ID#'=>$arDocument['XML_1C_DOCUMENT_ID']));
2288 }
2289 else
2290 {
2291 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_PAYMENT_ERROR_11", Array('#ORDER_ID#'=>$order->getId(), '#XML_1C_DOCUMENT_ID#'=>$arDocument['XML_1C_DOCUMENT_ID']));
2292 }
2293
2294 }
2295 else
2296 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_PAYMENT_ERROR_8",array('#ORDER_ID#'=>$order->getId(), '#XML_1C_DOCUMENT_ID#'=>$this->getXMLDocumentID()));
2297 }
2298 else
2299 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_PAYMENT_ERROR_5",array('#XML_1C_DOCUMENT_ID#'=>$this->getXMLDocumentID()));
2300 }
2301 else
2302 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_PAYMENT_ERROR_6");
2303
2304 if($this->strErrorDocument == '')
2305 {
2306 $order->setField('UPDATED_1C', 'Y');
2307
2308 $r = $order->save();
2309 if(!$r->isSuccess())
2310 $this->strErrorDocument .= array_shift($r->getErrors())->getMessage();
2311 }
2312
2313 break;
2314 case 'shipment_operation':
2315
2316 if(isset($arDocument['SHIPMENT_ORDER_ID']) && $arDocument['ORDER_ID'] == '')
2317 $arDocument['ORDER_ID'] = $arDocument['SHIPMENT_ORDER_ID'];
2318
2319 if($arDocument["XML_1C_DOCUMENT_ID"] <> '')
2320 {
2321 $this->setVersion1C($arDocument["VERSION_1C"]);
2322 $this->setXMLDocumentID($arDocument["XML_1C_DOCUMENT_ID"]);
2323 $this->setOrderIdOriginal($arDocument["ORDER_ID_ORIG"]);
2324
2325 $this->logMessage("Document.XML_1C_DOCUMENT_ID: ".$arDocument['XML_1C_DOCUMENT_ID']);
2326 $this->logMessage("Document.VERSION_1C: ".$arDocument['VERSION_1C']);
2327 $this->logMessage("Document.ORDER_ID_ORIG: ".$arDocument['ORDER_ID_ORIG']);
2328
2329 if($arDocument['ORDER_ID'] !== false)
2330 {
2332 if($order = $orderClass::load($arDocument['ORDER_ID']))
2333 {
2334 if ($order->getField("STATUS_ID") != "F")
2335 {
2336 if($arDocument["CANCELED"] == "true")
2337 {
2338 if ($arDocument["ID"] <> '' && ($shipment = $order->getShipmentCollection()->getItemById($arDocument['ID'])))
2339 {
2340 $deleteShipment = $this->deleteDocumentShipment($shipment);
2341 if(!$deleteShipment->isSuccess())
2342 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_ORDER_ERROR_4", Array('#XML_1C_DOCUMENT_ID#'=>$arDocument['XML_1C_DOCUMENT_ID'])).array_shift($deleteShipment->getErrors())->getMessage();
2343 }
2344 else
2345 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_SHIPMENT_ERROR_16", Array( '#ORDER_ID#'=>$arDocument['ORDER_ID'], '#XML_1C_DOCUMENT_ID#'=>$arDocument['XML_1C_DOCUMENT_ID']));
2346 }
2347 else
2348 {
2349 if($arDocument["ID"] <> '')
2350 {
2351 if ($shipment = $order->getShipmentCollection()->getItemById($arDocument['ID']))
2352 {
2354 if (!$shipment->isSystem())
2355 {
2356 if (!$shipment->isShipped())
2357 {
2358 $this->deleteShipmentItemsByDocument($arDocument, $shipment);
2359
2360 $this->updateShipmentQuantityFromDocument($arDocument, $shipment);
2361
2362 if($this->strErrorDocument == '')
2363 {
2364 $this->Ship($shipment, $arDocument);
2365
2367
2368 if($this->strErrorDocument == '')
2369 {
2370 $shipment->setField('UPDATED_1C','Y');
2371 $shipment->setField('VERSION_1C', $this->getVersion1C());
2372 $shipment->setField('ID_1C',$this->getXMLDocumentID());
2373 }
2374 }
2375 }
2376 else
2377 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_SHIPMENT_ERROR_2", Array("#ID#" => $arDocument["ID"],'#ORDER_ID#'=>$arDocument['ORDER_ID'],'#XML_1C_DOCUMENT_ID#'=>$arDocument['XML_1C_DOCUMENT_ID']));
2378 }
2379 else
2380 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_SHIPMENT_ERROR_14", Array("#ID#" => $arDocument["ID"],'#ORDER_ID#'=>$arDocument['ORDER_ID'],'#XML_1C_DOCUMENT_ID#'=>$arDocument['XML_1C_DOCUMENT_ID']));
2381 }
2382 else
2383 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_SHIPMENT_ERROR_3", Array("#ID#" => $arDocument["ID"],'#ORDER_ID#'=>$arDocument['ORDER_ID'],'#XML_1C_DOCUMENT_ID#'=>$arDocument['XML_1C_DOCUMENT_ID']));
2384 }
2385 elseif(\Bitrix\Main\Config\Option::get("sale", "1C_IMPORT_NEW_SHIPMENT", 'Y')=='Y')
2386 {
2387 $shipment = $this->addShipmentFromDocumentByOrder($arDocument, $order);
2388
2389 if($this->strErrorDocument == '')
2390 {
2391 $this->Ship($shipment, $arDocument);
2392
2394
2395 if($this->strErrorDocument == '')
2396 {
2397 $shipment->setField('VERSION_1C',$this->getVersion1C());
2398 $shipment->setField('ID_1C', $this->getXMLDocumentID());
2399 $shipment->setField('EXTERNAL_DELIVERY','Y');
2400 $shipment->setField('UPDATED_1C','Y');
2401 }
2402 }
2403 }
2404 }
2405 }
2406 else
2407 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_SHIPMENT_ERROR_18", Array('#ORDER_ID#'=>$order->getId(), '#XML_1C_DOCUMENT_ID#'=>$this->getXMLDocumentID()));
2408 }
2409 else
2410 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_SHIPMENT_ERROR_15",array('#ORDER_ID#'=>$order->getId(),'#XML_1C_DOCUMENT_ID#'=>$this->getXMLDocumentID()));
2411 }
2412 elseif(\Bitrix\Main\Config\Option::get("sale", "1C_IMPORT_NEW_ORDER_NEW_SHIPMENT", "Y") == 'Y') // create new shipment (ofline 1C))
2413 {
2414 if($arDocument["CANCELED"] != "true")
2415 {
2417 $arOrder = $this->addOrderWithoutShipmentsPayments($arDocument);
2418 if($arOrder['ID']>0)
2419 {
2420 $order = $orderClass::load($arOrder['ID']);
2421 $shipment = $this->addShipmentFromDocumentByOrder($arDocument, $order);
2422
2423 if($this->strErrorDocument == '')
2424 {
2425 $this->Ship($shipment, $arDocument);
2426
2427 if($this->strErrorDocument == '')
2428 {
2429 $shipment->setField('VERSION_1C', $this->getVersion1C());
2430 $shipment->setField('ID_1C', $this->getXMLDocumentID());
2431 $shipment->setField('EXTERNAL_DELIVERY', 'Y');
2432 $shipment->setField('UPDATED_1C', 'Y');
2433
2434 $order->setField('VERSION_1C', $this->getVersion1C());
2435 $order->setField('ID_1C', $this->getOrderIdOriginal());
2436 $order->setField('EXTERNAL_ORDER', 'Y');
2437
2438 }
2439 }
2440 }
2441 else
2442 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_SHIPMENT_ERROR_7", Array('#XML_1C_DOCUMENT_ID#'=>$this->getXMLDocumentID()));
2443 }
2444 else
2445 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_SHIPMENT_ERROR_17", Array('#XML_1C_DOCUMENT_ID#'=>$this->getXMLDocumentID()));
2446 }
2447 else
2448 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_SHIPMENT_ERROR_5", Array("#ID#" => $arDocument["ID"],'#XML_1C_DOCUMENT_ID#'=>$this->getXMLDocumentID()));
2449 }
2450 else
2451 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_SHIPMENT_ERROR_6", Array("#ID#" => $arDocument["ID"]));
2452
2453 if($this->strErrorDocument == '')
2454 {
2455 if($order->isShipped())
2456 {
2457 if($this->arParams["FINAL_STATUS_ON_DELIVERY"] <> '' &&
2458 $order->getField("STATUS_ID") != "F" &&
2459 $order->getField("STATUS_ID") != $this->arParams["FINAL_STATUS_ON_DELIVERY"]
2460 )
2461 {
2462 $order->setField("STATUS_ID", $this->arParams["FINAL_STATUS_ON_DELIVERY"]);
2463 }
2464 }
2465
2466 $order->setField('UPDATED_1C', 'Y');
2467
2468 $r=$order->save();
2469 if (!$r->isSuccess())
2470 $this->strErrorDocument .= array_shift($r->getErrorMessages());
2471 }
2472
2473 break;
2474 }
2475 }
2476 }
2477 }
2478 }
2479 $this->logMessage("FinalExchange \r\n\r\n");
2480
2481 \Bitrix\Main\Config\Option::set('sale', 'onec_exchange_type', 'partial');
2482 \Bitrix\Main\Config\Option::set('sale', 'onec_exchange_last_time', time());
2483 }
2484
2486 {
2487 $value = $dataXml->GetArray();
2488
2492 if(!empty($value[GetMessage("CC_BSC1_DOCUMENT")]))
2493 {
2494 $value = $value[GetMessage("CC_BSC1_DOCUMENT")];
2495
2496 $arDocument = $this->collectDocumentInfo($value);
2497
2498 if(!empty($arDocument))
2499 {
2500 $this->logMessage("StartExchange:");
2501 $this->logMessage("VersionSchema: ".self::getVersionSchema());
2502
2503 if (self::getVersionSchema() >= self::PARTIAL_VERSION)
2504 {
2505 $this->strErrorDocument .= "\n".GetMessage("CC_BSC1_CRM_SCHEME_NOT_SUPPORTED");
2506 }
2507 else
2508 {
2509 self::oldSaveOrder($arDocument, ['CRM'=>'Y']);
2510
2511 \Bitrix\Main\Config\Option::set('sale', 'onec_exchange_type', 'default_crm');
2512 \Bitrix\Main\Config\Option::set('sale', 'onec_exchange_last_time', time());
2513 }
2514 }
2515 $this->strError .= $this->strErrorDocument;
2516 }
2517 }
2518
2519 public function nodeHandlerDefaultModuleOneC(CDataXML $dataXml)
2520 {
2521 $value = $dataXml->GetArray();
2522
2526 if(!empty($value[GetMessage("CC_BSC1_DOCUMENT")]))
2527 {
2528 $value = $value[GetMessage("CC_BSC1_DOCUMENT")];
2529
2530 $arDocument = $this->collectDocumentInfo($value);
2531
2532 if(!empty($arDocument))
2533 {
2534 $this->logMessage("StartExchange:");
2535 $this->logMessage("VersionSchema: ".self::getVersionSchema());
2536
2537 if (self::getVersionSchema() >= self::PARTIAL_VERSION)
2538 {
2539 $this->nodeHandlerPartialVersion($arDocument);
2540 }
2541 else
2542 {
2543 self::oldSaveOrder($arDocument);
2544
2545 \Bitrix\Main\Config\Option::set('sale', 'onec_exchange_type', 'default');
2546 \Bitrix\Main\Config\Option::set('sale', 'onec_exchange_last_time', time());
2547 }
2548 }
2549 $this->strError .= $this->strErrorDocument;
2550 }
2551 }
2552
2553 function nodeHandler(CDataXML $dataXml, CXMLFileStream $fileStream)
2554 {
2555 $value = $dataXml->GetArray();
2556 $xmlStream = $this->getXMLStream($fileStream);
2558
2559 if($importer instanceof Sale\Exchange\ImportOneCBase)
2560 {
2561 $r = new Sale\Result();
2562
2563 if($importer instanceof Sale\Exchange\ImportOneCSubordinateSale)
2564 {
2565 $documentData = array($value[GetMessage("CC_BSC1_DOCUMENT")]);
2566 }
2567 elseif($importer instanceof Sale\Exchange\ImportOneCPackage)
2568 {
2569 $documentData = $value[GetMessage("CC_BSC1_CONTAINER")]['#'][GetMessage("CC_BSC1_DOCUMENT")];
2570 }
2571 else
2572 {
2573 $documentData = array($value[GetMessage("CC_BSC1_AGENT")]["#"]);
2574 }
2575
2576 if(!is_array($documentData) || count($documentData)<=0)
2577 $r->addError(new \Bitrix\Main\Error(GetMessage("CC_BSC1_DOCUMENT_XML_EMPTY")));
2578
2579 if($r->isSuccess())
2580 {
2582 $r = $importer::checkSettings();
2583 if($r->isSuccess())
2584 {
2585 if($xmlStream <> '')
2586 $importer->setRawData($xmlStream);
2587
2588 $r = $importer->process($documentData);
2589 }
2590 }
2591
2592 if(!$r->isSuccess())
2593 {
2594 foreach($r->getErrorMessages() as $errorMessages)
2595 {
2596 if($errorMessages <> '')
2597 $this->strError .= "\n".$errorMessages;
2598 }
2599 }
2600
2601 if($r->hasWarnings())
2602 {
2603 if(count($r->getWarningMessages())>0)
2604 {
2605 foreach($r->getWarningMessages() as $warningMessages)
2606 {
2607 if($warningMessages <> '')
2608 $this->strError .= "\n".$warningMessages;
2609 }
2610 }
2611 }
2612
2613 \Bitrix\Main\Config\Option::set('sale', 'onec_exchange_type', 'container');
2614 \Bitrix\Main\Config\Option::set('sale', 'onec_exchange_last_time', time());
2615 }
2616 elseif(!empty($value[GetMessage("CC_BSC1_DOCUMENT")]))
2617 {
2618 //$this->nodeHandlerDefaultModuleOneC($dataXml);
2619 }
2620 elseif(\Bitrix\Main\Config\Option::get("sale", "1C_IMPORT_NEW_ORDERS", "Y") == "Y")
2621 {
2625 $value = $value[GetMessage("CC_BSC1_AGENT")]["#"];
2626 $arAgentInfo = $this->collectAgentInfo($value);
2627
2628 if(!empty($arAgentInfo["AGENT"]))
2629 {
2630 $mode = false;
2631 $arErrors = array();
2632 $dbUProp = CSaleOrderUserProps::GetList(array(), array("XML_ID" => $arAgentInfo["AGENT"]["ID"]), false, false, array("ID", "NAME", "USER_ID", "PERSON_TYPE_ID", "XML_ID", "VERSION_1C"));
2633 if($arUProp = $dbUProp->Fetch())
2634 {
2635 if($arUProp["VERSION_1C"] != $arAgentInfo["AGENT"]["VERSION"])
2636 {
2637 $mode = "update";
2638 $arAgentInfo["PROFILE_ID"] = $arUProp["ID"];
2639 $arAgentInfo["PERSON_TYPE_ID"] = $arUProp["PERSON_TYPE_ID"];
2640 $arAgentInfo["USER_ID"] = $arUProp["USER_ID"];
2641 }
2642 }
2643 else
2644 {
2645 $user = Sale\Exchange\Entity\UserProfileImportLoader::getUserByCode($arAgentInfo["AGENT"]["ID"]);
2646 if(!empty($user))
2647 {
2648 $arAgentInfo["USER_ID"] = $user['ID'];
2649 }
2650 else
2651 {
2652 $arUser = array(
2653 "NAME" => $arAgentInfo["AGENT"]["ITEM_NAME"],
2654 "EMAIL" => $arAgentInfo["AGENT"]["CONTACT"]["MAIL_NEW"],
2655 );
2656
2657 if($arUser["NAME"] == '')
2658 $arUser["NAME"] = $arAgentInfo["AGENT"]["CONTACT"]["CONTACT_PERSON"];
2659
2660 $emServer = $_SERVER["SERVER_NAME"];
2661 if(mb_strpos($_SERVER["SERVER_NAME"], ".") === false)
2662 $emServer .= ".bx";
2663 if($arUser["EMAIL"] == '')
2664 $arUser["EMAIL"] = "buyer".time().GetRandomCode(2)."@".$emServer;
2665
2666 $arAgentInfo["USER_ID"] = CSaleUser::DoAutoRegisterUser($arUser["EMAIL"], $arUser["NAME"], $this->arParams["SITE_NEW_ORDERS"], $arErrors, array("XML_ID"=>$arAgentInfo["AGENT"]["ID"], "EXTERNAL_AUTH_ID"=>Sale\Exchange\Entity\UserImportBase::EXTERNAL_AUTH_ID));
2667 }
2668
2669 if(intval($arAgentInfo["USER_ID"]) > 0)
2670 {
2671 $mode = "add";
2672
2673 $obUser = new CUser;
2674 $userFields[] = array();
2675
2676 if($arAgentInfo["AGENT"]["CONTACT"]["PHONE"] <> '')
2677 $userFields["WORK_PHONE"] = $arAgentInfo["AGENT"]["CONTACT"]["PHONE"];
2678
2679 if(count($userFields)>0)
2680 {
2681 if(!$obUser->Update($arAgentInfo["USER_ID"], $userFields, true))
2682 $this->strError .= "\n".$obUser->LAST_ERROR;
2683 }
2684 }
2685 else
2686 {
2687 $this->strError .= "\n".GetMessage("CC_BSC1_AGENT_USER_PROBLEM", Array("#ID#" => $arAgentInfo["AGENT"]["ID"]));
2688 if(!empty($arErrors))
2689 {
2690 foreach($arErrors as $v)
2691 {
2692 $this->strError .= "\n".$v["TEXT"];
2693 }
2694 }
2695 }
2696 }
2697
2698 if($mode)
2699 {
2700 if(empty($arPersonTypesIDs))
2701 {
2702 $dbPT = CSalePersonType::GetList(array(), array("ACTIVE" => "Y", "LIDS" => $this->arParams["SITE_NEW_ORDERS"]));
2703 while($arPT = $dbPT->Fetch())
2704 {
2705 $arPersonTypesIDs[] = $arPT["ID"];
2706 }
2707 }
2708
2709 if(empty($arExportInfo))
2710 {
2711 $dbExport = CSaleExport::GetList(array(), array("PERSON_TYPE_ID" => $arPersonTypesIDs));
2712 while($arExport = $dbExport->Fetch())
2713 {
2714 $arExportInfo[$arExport["PERSON_TYPE_ID"]] = unserialize($arExport["VARS"], ['allowed_classes' => false]);
2715 }
2716 }
2717
2718 if(intval($arAgentInfo["PERSON_TYPE_ID"]) <= 0)
2719 {
2720 foreach($arExportInfo as $pt => $value)
2721 {
2722 if(($value["IS_FIZ"] == "Y" && $arAgentInfo["AGENT"]["TYPE"] == "FIZ")
2723 || ($value["IS_FIZ"] == "N" && $arAgentInfo["AGENT"]["TYPE"] != "FIZ")
2724 )
2725 $arAgentInfo["PERSON_TYPE_ID"] = $pt;
2726 }
2727 }
2728
2729 if(intval($arAgentInfo["PERSON_TYPE_ID"]) > 0)
2730 {
2731 $arAgentInfo["ORDER_PROPS_VALUE"] = array();
2732 $arAgentInfo["PROFILE_PROPS_VALUE"] = array();
2733
2734 $arAgent = $arExportInfo[$arAgentInfo["PERSON_TYPE_ID"]];
2735
2736 foreach($arAgent as $k => $v)
2737 {
2738 if($v["VALUE"] == '' || $v["TYPE"] != "PROPERTY")
2739 unset($arAgent[$k]);
2740 }
2741
2742 foreach($arAgent as $k => $v)
2743 {
2744 if(!empty($arAgentInfo["ORDER_PROPS"][$k]))
2745 $arAgentInfo["ORDER_PROPS_VALUE"][$v["VALUE"]] = $arAgentInfo["ORDER_PROPS"][$k];
2746 }
2747
2748 if (intval($arAgentInfo["PROFILE_ID"]) > 0)
2749 {
2750 CSaleOrderUserProps::Update($arUProp["ID"], array("VERSION_1C" => $arAgentInfo["AGENT"]["VERSION"], "NAME" => $arAgentInfo["AGENT"]["AGENT_NAME"], "USER_ID" => $arAgentInfo["USER_ID"]));
2751 $dbUPV = CSaleOrderUserPropsValue::GetList(array(), array("USER_PROPS_ID" => $arAgentInfo["PROFILE_ID"]));
2752 while($arUPV = $dbUPV->Fetch())
2753 {
2754 $arAgentInfo["PROFILE_PROPS_VALUE"][$arUPV["ORDER_PROPS_ID"]] = array("ID" => $arUPV["ID"], "VALUE" => $arUPV["VALUE"]);
2755 }
2756 }
2757
2758 if(empty($arOrderProps[$arAgentInfo["PERSON_TYPE_ID"]]))
2759 {
2760 $dbOrderProperties = CSaleOrderProps::GetList(
2761 array("SORT" => "ASC"),
2762 array(
2763 "PERSON_TYPE_ID" => $arAgentInfo["PERSON_TYPE_ID"],
2764 "ACTIVE" => "Y",
2765 "UTIL" => "N",
2766 "USER_PROPS" => "Y",
2767 ),
2768 false,
2769 false,
2770 array("ID", "TYPE", "NAME", "CODE", "USER_PROPS", "SORT", "MULTIPLE")
2771 );
2772 while ($arOrderProperties = $dbOrderProperties->Fetch())
2773 {
2774 $arOrderProps[$arAgentInfo["PERSON_TYPE_ID"]][] = $arOrderProperties;
2775 }
2776 }
2777
2778 foreach($arOrderProps[$arAgentInfo["PERSON_TYPE_ID"]] as $arOrderProperties)
2779 {
2780 $curVal = $arAgentInfo["ORDER_PROPS_VALUE"][$arOrderProperties["ID"]];
2781
2782 if ($curVal <> '')
2783 {
2784 if (intval($arAgentInfo["PROFILE_ID"]) <= 0)
2785 {
2786 $arFields = array(
2787 "NAME" => $arAgentInfo["AGENT"]["AGENT_NAME"],
2788 "USER_ID" => $arAgentInfo["USER_ID"],
2789 "PERSON_TYPE_ID" => $arAgentInfo["PERSON_TYPE_ID"],
2790 "XML_ID" => $arAgentInfo["AGENT"]["ID"],
2791 "VERSION_1C" => $arAgentInfo["AGENT"]["VERSION"],
2792 );
2793 $arAgentInfo["PROFILE_ID"] = CSaleOrderUserProps::Add($arFields);
2794 }
2795 if(intval($arAgentInfo["PROFILE_ID"]) > 0)
2796 {
2797 $arFields = array(
2798 "USER_PROPS_ID" => $arAgentInfo["PROFILE_ID"],
2799 "ORDER_PROPS_ID" => $arOrderProperties["ID"],
2800 "NAME" => $arOrderProperties["NAME"],
2801 "VALUE" => $curVal
2802 );
2803 if(empty($arAgentInfo["PROFILE_PROPS_VALUE"][$arOrderProperties["ID"]]))
2804 {
2806 }
2807 elseif($arAgentInfo["PROFILE_PROPS_VALUE"][$arOrderProperties["ID"]]["VALUE"] != $curVal)
2808 {
2809 CSaleOrderUserPropsValue::Update($arAgentInfo["PROFILE_PROPS_VALUE"][$arOrderProperties["ID"]]["ID"], $arFields);
2810 }
2811 }
2812 }
2813 }
2814 }
2815 else
2816 {
2817 $this->strError .= "\n".GetMessage("CC_BSC1_AGENT_PERSON_TYPE_PROBLEM", Array("#ID#" => $arAgentInfo["AGENT"]["ID"]));
2818 }
2819 }
2820 }
2821 else
2822 {
2823 $this->strError .= "\n".GetMessage("CC_BSC1_AGENT_NO_AGENT_ID");
2824 }
2825 };
2826 }
2827
2828 function ToFloat($str)
2829 {
2830 static $search = false;
2831 static $replace = false;
2832 if(!$search)
2833 {
2834 if($this->sdp <> '')
2835 {
2836 $search = array("\xc2\xa0", "\xa0", " ", $this->sdp, ",");
2837 $replace = array("", "", "", ".", ".");
2838 }
2839 else
2840 {
2841 $search = array("\xc2\xa0", "\xa0", " ", ",");
2842 $replace = array("", "", "", ".");
2843 }
2844 }
2845
2846 $res1 = str_replace($search, $replace, $str);
2847 $res2 = doubleval($res1);
2848
2849 return $res2;
2850 }
2851
2852 function ToInt($str)
2853 {
2854 static $search = false;
2855 static $replace = false;
2856 if(!$search)
2857 {
2858 if($this->sdp <> '')
2859 {
2860 $search = array("\xa0", " ", $this->sdp, ",");
2861 $replace = array("", "", ".", ".");
2862 }
2863 else
2864 {
2865 $search = array("\xa0", " ", ",");
2866 $replace = array("", "", ".");
2867 }
2868 }
2869
2870 $res1 = str_replace($search, $replace, $str);
2871 $res2 = intval($res1);
2872
2873 return $res2;
2874 }
2875
2876 function collectDocumentInfo($value)
2877 {
2878 $bNeedFull = false;
2879 $arOrder = array();
2880
2881 $arOrder["ORDER_ID"] = false;
2882
2883 $arOrder["OPERATION"] = $value["#"][GetMessage("CC_BSC1_OPERATION")][0]["#"];
2884
2885 self::setOperationType($value["#"][GetMessage("CC_BSC1_OPERATION")][0]["#"]);
2886
2887 $arOrder["OPERATION_TYPE"] = self::$operationType ;
2888
2889 $this->documentType = self::setDocumentType(self::$operationType);
2890
2891 if(in_array(
2892 $this->documentType,
2893 array(
2894 'shipment',
2895 'payment',
2896 'order'
2897 ))
2898 )
2899 {
2900 $arOrder["ID"] = $value["#"][GetMessage("CC_BSC1_NUMBER")][0]["#"];
2901 $arOrder["XML_1C_DOCUMENT_ID"] = $value["#"][GetMessage("CC_BSC1_ID")][0]["#"];
2902
2903 switch ($this->documentType)
2904 {
2905 case 'payment':
2906
2907 $paymentResult = $this->getDocumentId('Payment', $arOrder["ID"], $arOrder["XML_1C_DOCUMENT_ID"]);
2908
2909 if(isset($paymentResult['ID']))
2910 $arOrder['ID'] = $paymentResult['ID'];
2911 if(isset($paymentResult['ORDER_ID']))
2912 $arOrder['PAYMENT_ORDER_ID'] = $paymentResult['ORDER_ID'];
2913
2914 $arOrder["ORDER_ID_ORIG"] = $value["#"][GetMessage("CC_BSC1_NUMBER_BASE")][0]["#"];
2915 $arOrder["ORDER_ID"] = $value["#"][GetMessage("CC_BSC1_NUMBER_BASE")][0]["#"];
2916
2917 $arOrder["ORDER_ID"] = $this->getOrderIdByDocument($arOrder["ORDER_ID"]);
2918
2919 break;
2920 case 'shipment':
2921
2922 $shipmentResult = $this->getDocumentId('Shipment', $arOrder["ID"], $arOrder["XML_1C_DOCUMENT_ID"]);
2923
2924 if(isset($shipmentResult['ID']))
2925 $arOrder['ID'] = $shipmentResult['ID'];
2926 if(isset($shipmentResult['ORDER_ID']))
2927 $arOrder['SHIPMENT_ORDER_ID'] = $shipmentResult['ORDER_ID'];
2928
2929 $arOrder["ORDER_ID_ORIG"] = $value["#"][GetMessage("CC_BSC1_NUMBER_BASE")][0]["#"];
2930 $arOrder["ORDER_ID"] = $value["#"][GetMessage("CC_BSC1_NUMBER_BASE")][0]["#"];
2931
2932 $arOrder["ORDER_ID"] = $this->getOrderIdByDocument($arOrder["ORDER_ID"]);
2933
2934 break;
2935 case 'order':
2936
2937 $orderResult = $this->getDocumentId('Order', $arOrder["ID"], $arOrder["XML_1C_DOCUMENT_ID"]);
2938 if(isset($orderResult['ID']))
2939 $arOrder['ID'] = $orderResult['ID'];
2940
2941 //if ($accountNumberPrefix != "")
2942 // $arOrder["ID"] = substr($arOrder["ID"], strlen($accountNumberPrefix));
2943 break;
2944 }
2945
2946 $arOrder["AMOUNT"] = $value["#"][GetMessage("CC_BSC1_SUMM")][0]["#"];
2947 $arOrder["AMOUNT"] = $this->ToFloat($arOrder["AMOUNT"]);
2948
2949 $arOrder["COMMENT"] = $value["#"][GetMessage("CC_BSC1_COMMENT")][0]["#"];
2950
2951 $arOrder["CANCELED"] = $value["#"][GetMessage("CC_BSC1_CANCELED")][0]["#"];
2952 $arOrder["VERSION_1C"] = $value["#"][GetMessage("CC_BSC1_VERSION_1C")][0]["#"];
2953 $arOrder["ID_1C"] = $value["#"][GetMessage("CC_BSC1_ID_1C")][0]["#"];
2954 $arOrder["DATE"] = $value["#"][GetMessage("CC_BSC1_1C_DATE")][0]["#"];
2955
2956 $arOrder["OPERATION"] = $value["#"][GetMessage("CC_BSC1_OPERATION")][0]["#"];
2957 $arOrder["TRAITS"] = array();
2958
2959 switch ($this->documentType)
2960 {
2961 case 'order':
2962 //if (strlen($arOrder["ID"]) <= 0 && strlen($arOrder["ID_1C"]) > 0)
2963 $bNeedFull = true;
2964 break;
2965 case 'shipment':
2966 $bNeedFull = true;
2967 break;
2968 }
2969
2970 if (is_array($value["#"][GetMessage("CC_BSC1_REK_VALUES")][0]["#"][GetMessage("CC_BSC1_REK_VALUE")]) && !empty($value["#"][GetMessage("CC_BSC1_REK_VALUES")][0]["#"][GetMessage("CC_BSC1_REK_VALUE")])) {
2971 foreach ($value["#"][GetMessage("CC_BSC1_REK_VALUES")][0]["#"][GetMessage("CC_BSC1_REK_VALUE")] as $val) {
2972 $arOrder["TRAITS"][$val["#"][GetMessage("CC_BSC1_NAME")][0]["#"]] = $val["#"][GetMessage("CC_BSC1_VALUE")][0]["#"];
2973 }
2974 }
2975
2976 $taxValue = 0;
2977 $taxName = "";
2978 $arOrder["items"] = array();
2979 $basketItems = array();
2980 if (is_array($value["#"][GetMessage("CC_BSC1_ITEMS")][0]["#"]) && is_array($value["#"][GetMessage("CC_BSC1_ITEMS")][0]["#"][GetMessage("CC_BSC1_ITEM")])) {
2981 foreach ($value["#"][GetMessage("CC_BSC1_ITEMS")][0]["#"][GetMessage("CC_BSC1_ITEM")] as $val) {
2982
2983 $val = $val["#"];
2984 if(is_array($val))
2985 {
2986 $productID = $val[GetMessage("CC_BSC1_ID")][0]["#"];
2987
2988 $discountPrice = "";
2989 $priceAll = $this->ToFloat($val[GetMessage("CC_BSC1_SUMM")][0]["#"]);
2990 $priceone = $this->ToFloat($val[GetMessage("CC_BSC1_PRICE_PER_UNIT")][0]["#"]);
2991 if (DoubleVal($priceone) <= 0)
2992 $priceone = $this->ToFloat($val[GetMessage("CC_BSC1_PRICE_ONE")][0]["#"]);
2993
2994 $quantity = $this->ToFloat($val[GetMessage("CC_BSC1_QUANTITY")][0]["#"]);
2995 if (doubleval($quantity) > 0) {
2996 $price = Sale\PriceMaths::roundPrecision($priceAll / $quantity);
2997 $priceone = Sale\PriceMaths::roundPrecision($priceone);
2998
2999 if(isset($val[GetMessage("CC_BSC1_DISCOUNTS")]) && $val[GetMessage("CC_BSC1_DISCOUNTS")][0]["#"][GetMessage("CC_BSC1_DISCOUNT")][0]["#"][GetMessage("CC_BSC1_SUMM")][0]['#']<>'')
3000 {
3001 if ($priceone != $price)
3002 $discountPrice = DoubleVal($priceone - $price);
3003 }
3004 else
3005 $price = $priceone;
3006
3007 //DISCOUNTS!
3008 $basketItems = Array(
3009 "NAME" => $val[GetMessage("CC_BSC1_NAME")][0]["#"],
3010 "PRICE" => $price,
3011 "PRICE_ONE" => $priceone,
3012 "QUANTITY" => $quantity,
3013 "DISCOUNT_PRICE" => $discountPrice,
3014 );
3015
3016
3017 if (is_array($val[GetMessage("CC_BSC1_ITEM_UNIT")]) && is_array($val[GetMessage("CC_BSC1_ITEM_UNIT")][0]["#"])) {
3018 $basketItems["MEASURE_CODE"] = $val[GetMessage("CC_BSC1_ITEM_UNIT")][0]["#"][GetMessage("CC_BSC1_ITEM_UNIT_CODE")][0]["#"];
3019 $basketItems["MEASURE_NAME"] = $val[GetMessage("CC_BSC1_ITEM_UNIT")][0]["#"][GetMessage("CC_BSC1_ITEM_UNIT_NAME")][0]["#"];
3020 }
3021
3022 if (is_array($val[GetMessage("CC_BSC1_REK_VALUES")][0]["#"][GetMessage("CC_BSC1_REK_VALUE")])) {
3023 foreach ($val[GetMessage("CC_BSC1_REK_VALUES")][0]["#"][GetMessage("CC_BSC1_REK_VALUE")] as $val1) {
3024 if ($val1["#"][GetMessage("CC_BSC1_NAME")][0]["#"] == GetMessage("CC_BSC1_ITEM_TYPE"))
3025 {
3026 $basketItems["TYPE"] = $val1["#"][GetMessage("CC_BSC1_VALUE")][0]["#"];
3027 }
3028 elseif (mb_strpos($val1["#"][GetMessage("CC_BSC1_NAME")][0]["#"], GetMessage("CC_BSC1_PROP_BASKET")."#") === 0)
3029 {
3030 $markerPosition = mb_strpos($val1["#"][GetMessage("CC_BSC1_NAME")][0]["#"], GetMessage("CC_BSC1_PROP_BASKET")."#");
3031 $idBasketProperty = mb_substr($val1["#"][GetMessage("CC_BSC1_NAME")][0]["#"], $markerPosition + mb_strlen(GetMessage("CC_BSC1_PROP_BASKET")."#"));
3032 $basketItems["ATTRIBUTES"][$idBasketProperty] = $val1["#"][GetMessage("CC_BSC1_VALUE")][0]["#"];
3033 }
3034
3035 }
3036 }
3037
3038 if ($value["#"][GetMessage("CC_BSC1_TAXES")][0]["#"][GetMessage("CC_BSC1_TAX")][0]["#"][GetMessage("CC_BSC1_NAME")][0]["#"] <> '') {
3039 $taxValueTmp = (int)$val[GetMessage("CC_BSC1_TAXES")][0]["#"][GetMessage("CC_BSC1_TAX")][0]["#"][GetMessage("CC_BSC1_TAX_VALUE")][0]["#"];
3040 $basketItems["VAT_RATE"] = $taxValueTmp / 100;
3041
3042 if ($taxValueTmp > $taxValue)
3043 {
3044 $taxName = $val[GetMessage("CC_BSC1_TAXES")][0]["#"][GetMessage("CC_BSC1_TAX")][0]["#"][GetMessage("CC_BSC1_NAME")][0]["#"];
3045 $taxValue = $taxValueTmp;
3046 }
3047 }
3048 }
3049
3050 if (self::getVersionSchema() >= self::PARTIAL_VERSION)
3051 $arOrder["items"][][$productID] = $basketItems;
3052 else
3053 $arOrder["items"][$productID] = $basketItems;
3054 }
3055 }
3056 }
3057
3058 if(intval($taxValue)>0)
3059 {
3060 $price = $this->ToFloat($value["#"][GetMessage("CC_BSC1_TAXES")][0]["#"][GetMessage("CC_BSC1_TAX")][0]["#"][GetMessage("CC_BSC1_SUMM")][0]["#"]);
3061 $arOrder["TAX"] = Array(
3062 "NAME" => $taxName,
3063 "VALUE" =>$taxValue,
3064 "IS_IN_PRICE" => ($value["#"][GetMessage("CC_BSC1_TAXES")][0]["#"][GetMessage("CC_BSC1_TAX")][0]["#"][GetMessage("CC_BSC1_IN_PRICE")][0]["#"]=="true"?"Y":"N"),
3065 "VALUE_MONEY" => $price,
3066 );
3067 }
3068
3069 if($bNeedFull)
3070 {
3071 IncludeModuleLangFile($_SERVER['DOCUMENT_ROOT']."/bitrix/modules/sale/general/export.php");
3072 $arOrder["DATE"] = $value["#"][GetMessage("CC_BSC1_1C_DATE")][0]["#"];
3073 $arOrder["TIME"] = $value["#"][GetMessage("CC_BSC1_1C_TIME")][0]["#"];
3074
3075 if(!empty($value["#"][GetMessage("SALE_EXPORT_CONTRAGENTS")][0]["#"]))
3076 {
3077 $arAgentInfo = $this->collectAgentInfo($value["#"][GetMessage("SALE_EXPORT_CONTRAGENTS")][0]["#"][GetMessage("SALE_EXPORT_CONTRAGENT")][0]["#"]);
3078 $arOrder["AGENT"] = $arAgentInfo["AGENT"];
3079
3080 $arOrder["ORDER_PROPS"] = $arAgentInfo["ORDER_PROPS"];
3081
3082 if($arOrder["TRAITS"][GetMessage("SALE_EXPORT_DELIVERY_ADDRESS")] <> '')
3083 {
3084 if(!empty($arOrder["AGENT"]["REGISTRATION_ADDRESS"]))
3085 $arOrder["AGENT"]["REGISTRATION_ADDRESS"]["PRESENTATION"] = $arOrder["TRAITS"][GetMessage("SALE_EXPORT_DELIVERY_ADDRESS")];
3086 if(!empty($arOrder["AGENT"]["ADDRESS"]))
3087 $arOrder["AGENT"]["ADDRESS"]["PRESENTATION"] = $arOrder["TRAITS"][GetMessage("SALE_EXPORT_DELIVERY_ADDRESS")];
3088 }
3089 }
3090 }
3091 }
3092 return $arOrder;
3093 }
3094
3096 {
3097 if(empty($data))
3098 return false;
3099 IncludeModuleLangFile($_SERVER['DOCUMENT_ROOT']."/bitrix/modules/sale/general/export.php");
3100
3101 $result = array();
3102 $schema = array("ID", "VERSION", "ITEM_NAME", "OFICIAL_NAME", "FULL_NAME", "INN", "KPP", "OKPO_CODE", "EGRPO", "OKVED", "OKDP", "OKOPF", "OKFC", "OKPO",
3103 "REGISTRATION_ADDRESS" => array("PRESENTATION", "POST_CODE", "COUNTRY", "REGION", "STATE", "SMALL_CITY", "CITY", "STREET", "HOUSE", "BUILDING", "FLAT"),
3104 "UR_ADDRESS" => array("PRESENTATION", "POST_CODE", "COUNTRY", "REGION", "STATE", "SMALL_CITY", "CITY", "STREET", "HOUSE", "BUILDING", "FLAT"),
3105 "ADDRESS" => array("PRESENTATION", "POST_CODE", "COUNTRY", "REGION", "STATE", "SMALL_CITY", "CITY", "STREET", "HOUSE", "BUILDING", "FLAT"),
3106 "CONTACTS" => array("CONTACT" => array("WORK_PHONE_NEW", "MAIL_NEW")),
3107 "REPRESENTATIVES" => array("REPRESENTATIVE" => array("CONTACT_PERSON")),
3108
3109 );
3110
3111 foreach($schema as $k => $v)
3112 {
3113 if(is_array($v))
3114 {
3115 if(isset($data[GetMessage("SALE_EXPORT_".$k)]) && !empty($data[GetMessage("SALE_EXPORT_".$k)][0]["#"]))
3116 {
3117 $adr = $data[GetMessage("SALE_EXPORT_".$k)][0]["#"];
3118 foreach($v as $kk => $vv)
3119 {
3120 if(is_array($vv))
3121 {
3122 if(isset($adr[GetMessage("SALE_EXPORT_".$kk)]) && !empty($adr[GetMessage("SALE_EXPORT_".$kk)][0]["#"]) > 0)
3123 {
3124 foreach($vv as $vvv)
3125 {
3126 foreach($adr[GetMessage("SALE_EXPORT_".$kk)] as $val)
3127 {
3128 if($val["#"][GetMessage("SALE_EXPORT_TYPE")][0]["#"] == GetMessage("SALE_EXPORT_".$vvv)
3129 && $val["#"][GetMessage("SALE_EXPORT_VALUE")][0]["#"] <> ''
3130 )
3131 $result["AGENT"][$kk][$vvv] = $val["#"][GetMessage("SALE_EXPORT_VALUE")][0]["#"];
3132 elseif(empty($val["#"][GetMessage("SALE_EXPORT_TYPE")][0]["#"]) && $val["#"][GetMessage("SALE_EXPORT_RELATION")][0]["#"] == GetMessage("SALE_EXPORT_CONTACT_PERSON"))
3133 $result["AGENT"]["CONTACT"][$vvv] = $val["#"][GetMessage("SALE_EXPORT_ITEM_NAME")][0]["#"];
3134
3135 }
3136 }
3137 }
3138 }
3139 else
3140 {
3141 if(isset($adr[GetMessage("SALE_EXPORT_".$vv)]) && $adr[GetMessage("SALE_EXPORT_".$vv)][0]["#"] <> '')
3142 {
3143 $result["AGENT"][$k][$vv] = $adr[GetMessage("SALE_EXPORT_".$vv)][0]["#"];
3144 }
3145 else
3146 {
3147 if(!empty($adr[GetMessage("SALE_EXPORT_ADDRESS_FIELD")]))
3148 {
3149 foreach($adr[GetMessage("SALE_EXPORT_ADDRESS_FIELD")] as $val)
3150 {
3151 if($val["#"][GetMessage("SALE_EXPORT_TYPE")][0]["#"] == GetMessage("SALE_EXPORT_".$vv)
3152 && $val["#"][GetMessage("SALE_EXPORT_VALUE")][0]["#"] <> ''
3153 )
3154 $result["AGENT"][$k][$vv] = $val["#"][GetMessage("SALE_EXPORT_VALUE")][0]["#"];
3155 }
3156 }
3157 }
3158 }
3159 }
3160 }
3161 }
3162 else
3163 {
3164 if(isset($data[GetMessage("SALE_EXPORT_".$v)]) && $data[GetMessage("SALE_EXPORT_".$v)][0]["#"] <> '')
3165 $result["AGENT"][$v] = $data[GetMessage("SALE_EXPORT_".$v)][0]["#"];
3166 }
3167 }
3168
3169 $result["AGENT"]["AGENT_NAME"] = $result["AGENT"]["ITEM_NAME"];
3170 $result["AGENT"]["CONTACT"]["EMAIL"] = $result["AGENT"]["CONTACT"]["MAIL_NEW"];
3171 $result["AGENT"]["CONTACT"]["PHONE"] = $result["AGENT"]["CONTACT"]["WORK_PHONE_NEW"];
3172 $result["AGENT"]["OKPO"] = $result["AGENT"]["OKPO_CODE"];
3173
3174
3175 $result["ORDER_PROPS"] = array();
3176 foreach($result["AGENT"] as $k => $v)
3177 {
3178 if(!is_array($v) && !empty($v))
3179 $result["ORDER_PROPS"][$k] = $v;
3180 else
3181 {
3182 if($k == "CONTACT")
3183 {
3184 $result["ORDER_PROPS"]["EMAIL"] = $v["MAIL_NEW"];
3185 $result["ORDER_PROPS"]["PHONE"] = $v["WORK_PHONE_NEW"];
3186 }
3187 elseif($k == "REPRESENTATIVE")
3188 {
3189 $result["ORDER_PROPS"]["CONTACT_PERSON"] = $v["CONTACT_PERSON"];
3190 }
3191 elseif($k == "REGISTRATION_ADDRESS" || $k == "UR_ADDRESS")
3192 {
3193 $result["ORDER_PROPS"]["ADDRESS_FULL"] = $v["PRESENTATION"];
3194 $result["ORDER_PROPS"]["INDEX"] = $v["POST_CODE"];
3195 foreach($v as $k1 => $v1)
3196 {
3197 if($v1 <> '' && empty($result["ORDER_PROPS"][$k1]))
3198 $result["ORDER_PROPS"][$k1] = $v1;
3199 }
3200 }
3201 elseif($k == "ADDRESS")
3202 {
3203 $result["ORDER_PROPS"]["F_ADDRESS_FULL"] = $v["PRESENTATION"];
3204 $result["ORDER_PROPS"]["F_INDEX"] = $v["POST_CODE"];
3205 foreach($v as $k1 => $v1)
3206 {
3207 if($v1 <> '' && empty($result["ORDER_PROPS"]["F_".$k1]))
3208 $result["ORDER_PROPS"]["F_".$k1] = $v1;
3209 }
3210 }
3211 }
3212 }
3213
3214 if($result["AGENT"]["OFICIAL_NAME"] <> '' && $result["AGENT"]["INN"] <> '')
3215 $result["AGENT"]["TYPE"] = "UR";
3216 elseif($result["AGENT"]["INN"] <> '')
3217 $result["AGENT"]["TYPE"] = "IP";
3218 else
3219 $result["AGENT"]["TYPE"] = "FIZ";
3220
3221 return $result;
3222 }
3223
3224 function prepareProduct4Basket($itemID, $arItem, $orderId, $orderInfo)
3225 {
3226 $arFields = array();
3227
3228 $products = array();
3229 $productType = array();
3230 $arIBlockElement = array();
3231
3232 if(CModule::IncludeModule("iblock"))
3233 {
3234 $dbIBlockElement = CIBlockElement::GetList(array(), array("XML_ID" => $itemID, "ACTIVE" => "Y", "CHECK_PERMISSIONS" => "Y"), false, false, array("ID", "IBLOCK_ID", "XML_ID", "NAME", "DETAIL_PAGE_URL"));
3235 while($arElement = $dbIBlockElement->Fetch())
3236 {
3237 $products[] = $arElement;
3238 }
3239
3240 if(count($products)>1)
3241 {
3242 foreach($products as $product)
3243 {
3244 $ar = \CCatalogProduct::GetByID($product["ID"]);
3245 $productType[$ar['TYPE']] = $product;
3246 }
3247
3248 if(array_key_exists(3, $productType) && array_key_exists(4, $productType))
3249 {
3250 $arIBlockElement = $productType[4];
3251 }
3252 }
3253 elseif(count($products)==1)
3254 {
3255 $arIBlockElement = $products[0];
3256 }
3257
3258 if($arIBlockElement)
3259 {
3260 if(empty($this->arIBInfo[$arIBlockElement["IBLOCK_ID"]]))
3261 {
3262 $dbIBlock = CIBlock::GetList(
3263 array(),
3264 array("ID" => $arIBlockElement["IBLOCK_ID"])
3265 );
3266 if ($arIBlock = $dbIBlock->Fetch())
3267 {
3268 $this->arIBInfo[$arIBlockElement["IBLOCK_ID"]] = $arIBlock;
3269 }
3270 }
3271
3272 $arProps[] = array(
3273 "NAME" => "Catalog XML_ID",
3274 "CODE" => "CATALOG.XML_ID",
3275 "VALUE" => $this->arIBInfo[$arIBlockElement["IBLOCK_ID"]]["XML_ID"]
3276 );
3277
3278 $arProps[] = array(
3279 "NAME" => "Product XML_ID",
3280 "CODE" => "PRODUCT.XML_ID",
3281 "VALUE" => $arIBlockElement["XML_ID"]
3282 );
3283 $arProduct = CCatalogProduct::GetByID($arIBlockElement["ID"]);
3284
3285 $arFields = array(
3286 "ORDER_ID" => $orderId,
3287 "PRODUCT_ID" => $arIBlockElement["ID"],
3288 "PRICE" => $arItem["PRICE"],
3289 "CURRENCY" => $orderInfo["CURRENCY"],
3290 "WEIGHT" => $arProduct["WEIGHT"],
3291 "QUANTITY" => $arItem["QUANTITY"],
3292 "LID" => $orderInfo["LID"],
3293 "DELAY" => "N",
3294 "CAN_BUY" => "Y",
3295 "NAME" => $arIBlockElement["NAME"],
3296 "MODULE" => "catalog",
3297 "NOTES" => $arProduct["CATALOG_GROUP_NAME"],
3298 "PRODUCT_PROVIDER_CLASS" => "CCatalogProductProvider",
3299 "DETAIL_PAGE_URL" => $arIBlockElement["DETAIL_PAGE_URL"],
3300 "CATALOG_XML_ID" => $this->arIBInfo[$arIBlockElement["IBLOCK_ID"]]["XML_ID"],
3301 "PRODUCT_XML_ID" => $arIBlockElement["XML_ID"],
3302 "IGNORE_CALLBACK_FUNC" => "Y",
3303 "VAT_RATE" => $arItem["VAT_RATE"],
3304 "CUSTOM_PRICE"=>"Y",
3305 );
3306 }
3307 }
3308
3309 if(empty($arFields))
3310 {
3311 $arFields = array(
3312 "ORDER_ID" => $orderId,
3313 "PRICE" => $arItem["PRICE"],
3314 "CURRENCY" => $orderInfo["CURRENCY"],
3315 "QUANTITY" => $arItem["QUANTITY"],
3316 "LID" => $orderInfo["LID"],
3317 "DELAY" => "N",
3318 "CAN_BUY" => "Y",
3319 "NAME" => $arItem["NAME"],
3320 "MODULE" => "1c_exchange",
3321 "PRODUCT_PROVIDER_CLASS" => false,
3322 "CATALOG_XML_ID" => "1c_exchange",
3323 "PRODUCT_XML_ID" => $itemID,
3324 "IGNORE_CALLBACK_FUNC" => "Y",
3325 "VAT_RATE" => $arItem["VAT_RATE"],
3326 "DISCOUNT_PRICE" => $arItem["DISCOUNT_PRICE"],
3327 "CUSTOM_PRICE" => "Y",
3328 );
3329 if($this->bNewVersion)
3330 {
3331 $arFields["MEASURE_CODE"] = $arItem["MEASURE_CODE"];
3332 $arFields["MEASURE_NAME"] = $arItem["MEASURE_NAME"];
3333 }
3334
3335 $ri = new RandomSequence($itemID);
3336 $arFields["PRODUCT_ID"] = $ri->rand(1000000, 9999999);
3337 }
3338 if($arFields["LID"] == '')
3339 $arFields["LID"] = $orderInfo["SITE_ID"];
3340
3341 return $arFields;
3342 }
3343 function documentMustHaveProducts($arDocument)
3344 {
3345 foreach($arDocument["items"] as $items)
3346 {
3347 foreach ($items as $itemID => $arItem)
3348 {
3349 if($arItem["TYPE"] == GetMessage("CC_BSC1_ITEM"))
3350 {
3351 return true;
3352 }
3353 }
3354 }
3355
3356 return false;
3357 }
3358
3359 function oldSaveOrder($arOrder, $option=array())
3360 {
3361 global $APPLICATION;
3362 global $USER;
3363
3364 $userId = 0;
3365 if (isset($USER) && $USER instanceof CUser)
3366 $userId = (int)$USER->GetID();
3367
3368 $isInvoice = (isset($option['CRM']) && $option['CRM']=='Y');
3369
3371 $parentEntity = $isInvoice ? \Bitrix\Crm\Invoice\Compatible\Helper::class: CSaleOrder::class;
3373 $basketEntity = $isInvoice ? \Bitrix\Crm\Invoice\Compatible\BasketHelper::class: CSaleBasket::class;
3375 $changeEntity = $isInvoice ? \Bitrix\Crm\Invoice\Internals\InvoiceChangeTable::class: \Bitrix\Sale\Internals\OrderChangeTable::class;
3377 $taxEntity = $isInvoice ? CCrmInvoiceTax::class: CSaleOrderTax::class;
3378
3379 if ($arOrder["ID"] == '' && $arOrder["ID_1C"] <> '')//try to search order from 1C
3380 {
3381 $dbOrder = $parentEntity::GetList(array("ID" => "DESC"), array("ID_1C" => $arOrder["ID_1C"]), false, false, array("ID", "ID_1C"));
3382 if ($orderInfo = $dbOrder->Fetch()) {
3383 $arOrder["ID"] = $orderInfo["ID"];
3384 }
3385 }
3386 if($arOrder["ID"] <> '') // exists site order
3387 {
3388 $dbOrder = $parentEntity::GetList(array(), array("ID" => $arOrder["ID"]), false, false, array("ID", "LID", "PERSON_TYPE_ID", "PAYED", "DATE_PAYED", "CANCELED", "DATE_CANCELED", "REASON_CANCELED", "STATUS_ID", "DATE_STATUS", "PAY_VOUCHER_NUM", "PAY_VOUCHER_DATE", "PRICE_DELIVERY", "ALLOW_DELIVERY", "DATE_ALLOW_DELIVERY", "PRICE", "CURRENCY", "DISCOUNT_VALUE", "USER_ID", "PAY_SYSTEM_ID", "DELIVERY_ID", "DATE_INSERT", "DATE_INSERT_FORMAT", "DATE_UPDATE", "USER_DESCRIPTION", "ADDITIONAL_INFO", "COMMENTS", "TAX_VALUE", "DELIVERY_DOC_NUM", "DELIVERY_DOC_DATE", "STORE_ID", "ACCOUNT_NUMBER", "VERSION", "VERSION_1C", "ID_1C"));
3389 if($orderInfo = $dbOrder->Fetch())
3390 {
3391 if($arOrder["VERSION_1C"] != $orderInfo["VERSION_1C"] || ($orderInfo["VERSION_1C"] == '' || $arOrder["VERSION_1C"] == '')) // skip update if the same version
3392 {
3393 $arOrderFields = array();
3394 $orderId = $orderInfo["ID"];
3395
3396 if($isInvoice)
3397 {
3398 if ($invoice = \Bitrix\Crm\Invoice\Invoice::load($orderId))
3399 {
3400 $basket = $invoice->getBasket();
3401 }
3402 }
3403
3404 $changeEntity::Add(['ORDER_ID'=>$orderId, 'TYPE'=>'ORDER_1C_IMPORT', 'USER_ID'=>$userId]);
3405 if($arOrder["ID_1C"] != $orderInfo["ID_1C"])
3406 $arOrderFields["ID_1C"] = $arOrder["ID_1C"];
3407
3408 $arOrderFields["VERSION_1C"] = $arOrder["VERSION_1C"];
3409
3410 if($orderInfo["PAYED"] != "Y" && $orderInfo["ALLOW_DELIVERY"] != "Y" && $orderInfo["STATUS_ID"] != "F")
3411 {
3412 $dbOrderTax = $taxEntity::GetList(
3413 array(),
3414 array("ORDER_ID" => $orderId),
3415 false,
3416 false,
3417 array("ID", "TAX_NAME", "VALUE", "VALUE_MONEY", "CODE", "IS_IN_PRICE")
3418 );
3419 $bTaxFound = false;
3420 if($arOrderTax = $dbOrderTax->Fetch())
3421 {
3422 $bTaxFound = true;
3423 if(intval($arOrderTax["VALUE_MONEY"]) != intval($arOrder["TAX"]["VALUE_MONEY"]) || intval($arOrderTax["VALUE"]) != intval($arOrder["TAX"]["VALUE"]) || ($arOrderTax["IS_IN_PRICE"] != $arOrder["TAX"]["IS_IN_PRICE"]))
3424 {
3425 if(intval($arOrder["TAX"]["VALUE"])>0)
3426 {
3427 $arFields = Array(
3428 "TAX_NAME" => $arOrder["TAX"]["NAME"],
3429 "ORDER_ID" => $orderId,
3430 "VALUE" => $arOrder["TAX"]["VALUE"],
3431 "IS_PERCENT" => "Y",
3432 "IS_IN_PRICE" => $arOrder["TAX"]["IS_IN_PRICE"],
3433 "VALUE_MONEY" => $arOrder["TAX"]["VALUE_MONEY"],
3434 "CODE" => "VAT1C",
3435 "APPLY_ORDER" => "100"
3436 );
3437 $taxEntity::Update($arOrderTax["ID"], $arFields);
3438 $arOrderFields["TAX_VALUE"] = $arOrder["TAX"]["VALUE_MONEY"];
3439 }
3440 else
3441 {
3442 $taxEntity::Delete($arOrderTax["ID"]);
3443 $arOrderFields["TAX_VALUE"] = 0;
3444 }
3445 }
3446 }
3447
3448 if(!$bTaxFound)
3449 {
3450 if(intval($arOrder["TAX"]["VALUE"])>0)
3451 {
3452 $arFields = Array(
3453 "TAX_NAME" => $arOrder["TAX"]["NAME"],
3454 "ORDER_ID" => $orderId,
3455 "VALUE" => $arOrder["TAX"]["VALUE"],
3456 "IS_PERCENT" => "Y",
3457 "IS_IN_PRICE" => $arOrder["TAX"]["IS_IN_PRICE"],
3458 "VALUE_MONEY" => $arOrder["TAX"]["VALUE_MONEY"],
3459 "CODE" => 'VAT1C',
3460 "APPLY_ORDER" => '100',
3461 );
3462 $taxEntity::Add($arFields);
3463 $arOrderFields["TAX_VALUE"] = $arOrder["TAX"]["VALUE_MONEY"];
3464 }
3465 }
3466
3467 $arShoppingCart = array();
3468 $bNeedUpdate = false;
3469 $dbBasket = $basketEntity::GetList(
3470 array("NAME" => "ASC"),
3471 array("ORDER_ID" => $orderId),
3472 false,
3473 false,
3474 array(
3475 "ID",
3476 "QUANTITY",
3477 "CANCEL_CALLBACK_FUNC",
3478 "MODULE",
3479 "PRODUCT_ID",
3480 "PRODUCT_PROVIDER_CLASS",
3481 "RESERVED",
3482 "RESERVE_QUANTITY",
3483 "TYPE",
3484 "SET_PARENT_ID",
3485 "PRICE",
3486 "VAT_RATE",
3487 "DISCOUNT_PRICE",
3488 "PRODUCT_XML_ID",
3489 )
3490 );
3491
3492 while ($arBasket = $dbBasket->Fetch())
3493 {
3494 $arFields = Array();
3495 if(!empty($arOrder["items"][$arBasket["PRODUCT_XML_ID"]]))
3496 {
3497 if($arBasket["QUANTITY"] != $arOrder["items"][$arBasket["PRODUCT_XML_ID"]]["QUANTITY"])
3498 $arFields["QUANTITY"] = $arOrder["items"][$arBasket["PRODUCT_XML_ID"]]["QUANTITY"];
3499 if($arBasket["PRICE"] != $arOrder["items"][$arBasket["PRODUCT_XML_ID"]]["PRICE"])
3500 $arFields["PRICE"] = $arOrder["items"][$arBasket["PRODUCT_XML_ID"]]["PRICE"];
3501 if($arBasket["VAT_RATE"] != $arOrder["items"][$arBasket["PRODUCT_XML_ID"]]["VAT_RATE"])
3502 $arFields["VAT_RATE"] = $arOrder["items"][$arBasket["PRODUCT_XML_ID"]]["VAT_RATE"];
3503 if($arBasket["DISCOUNT_PRICE"] != $arOrder["items"][$arBasket["PRODUCT_XML_ID"]]["DISCOUNT_PRICE"])
3504 $arFields["DISCOUNT_PRICE"] = $arOrder["items"][$arBasket["PRODUCT_XML_ID"]]["DISCOUNT_PRICE"];
3505
3506 if(count($arFields)>0)
3507 {
3508 $bNeedUpdate = true;
3509
3510 if($isInvoice)
3511 {
3513 $basketItem = $basket->getItemById($arBasket['ID']);
3514 if(isset($arFields['QUANTITY']))
3515 $basketItem->setField('QUANTITY', $arFields['QUANTITY']);
3516 if(isset($arFields['PRICE']))
3517 $basketItem->setPrice($arFields['PRICE']);
3518 if(isset($arFields['VAT_RATE']))
3519 $basketItem->setField('VAT_RATE', $arFields['VAT_RATE']);
3520 if(isset($arFields['DISCOUNT_PRICE']))
3521 $basketItem->setField('DISCOUNT_PRICE', $arFields['DISCOUNT_PRICE']);
3522 }
3523 else
3524 {
3525 $arFields["ID"] = $arBasket["ID"];
3526 if(DoubleVal($arFields["QUANTITY"]) <= 0)
3527 $arFields["QUANTITY"] = $arBasket["QUANTITY"];
3528
3529 $arShoppingCart[] = $arFields;
3530 }
3531 }
3532 else
3533 {
3534 $arShoppingCart[] = $arBasket;
3535 }
3536 //CSaleBasket::Update($arBasket["ID"], $arFields);
3537
3538 $arOrder["items"][$arBasket["PRODUCT_XML_ID"]]["CHECKED"] = "Y";
3539 }
3540 else
3541 {
3542 if($arOrder['CANCELED'] != "true" && $arOrder["TRAITS"][GetMessage("CC_BSC1_CANCELED")] != "true" && $orderInfo["CANCELED"] == "N")
3543 {
3544 if($isInvoice)
3545 {
3546 $basket->getItemById($arBasket["ID"])
3547 ->delete();
3548 }
3549 else
3550 {
3551 $bNeedUpdate = true;
3552 //CSaleBasket::Delete($arBasket["ID"]);
3553 }
3554 }
3555 }
3556 }
3557
3558 if(!empty($arOrder["items"]))
3559 {
3560 $priceDelivery = 0;
3561 foreach ($arOrder["items"] as $itemID => $arItem)
3562 {
3563 if ($arItem["CHECKED"] != "Y")
3564 {
3565 if ($arItem["TYPE"] == GetMessage("CC_BSC1_ITEM"))
3566 {
3567 $currencyTo = CSaleLang::GetLangCurrency($this->arParams["SITE_NEW_ORDERS"]);
3568 if($orderInfo['CURRENCY'] == $currencyTo)
3569 {
3570 $bNeedUpdate = true;
3571
3572 if ($arBasketFields = $this->prepareProduct4Basket($itemID, $arItem, $orderId, $orderInfo))
3573 {
3574 if($isInvoice)
3575 {
3576 $basketItem = $basket->createItem($arBasketFields['MODULE'], $arBasketFields['PRODUCT_ID']);
3577 $basketItem->setPrice($arBasketFields['PRICE'], true);
3578 unset($arBasketFields['MODULE'], $arBasketFields['PRODUCT_ID'], $arBasketFields['PRICE'], $arBasketFields['ORDER_ID']);
3579
3580 $basketItem->setFields($arBasketFields);
3581 }
3582 else
3583 {
3584 $arShoppingCart[] = $arBasketFields;
3585 }
3586 }
3587 }
3588 else
3589 {
3590 $this->strError .= "\r\n ".GetMessage("CC_BSC1_ORDER_ERROR_5", Array('#XML_1C_DOCUMENT_ID#'=>$arOrder['ID'], '#CURRENCY_FROM#'=>$orderInfo['CURRENCY'], '#CURRENCY_TO#'=>$currencyTo));
3591 }
3592 }
3593 elseif ($arItem["TYPE"] == GetMessage("CC_BSC1_SERVICE"))
3594 {
3595 $priceDelivery = $arItem["PRICE"];
3596 }
3597
3598 if($hasServiceItem)
3599 {
3600 if ($priceDelivery != intval($orderInfo["PRICE_DELIVERY"]))
3601 {
3602 if($arItem["TYPE"] == GetMessage("CC_BSC1_SERVICE"))
3603 $arOrderFields["PRICE_DELIVERY"] = $priceDelivery;
3604 }
3605 }
3606 else
3607 {
3608 if ($priceDelivery != intval($orderInfo["PRICE_DELIVERY"]))
3609 $arOrderFields["PRICE_DELIVERY"] = $priceDelivery;
3610 }
3611
3612 }
3613 }
3614 }
3615
3616 $isUsed = \Bitrix\Sale\Compatible\DiscountCompatibility::isUsed();
3617 \Bitrix\Sale\Compatible\DiscountCompatibility::stopUsageCompatible();
3618
3619 if($bNeedUpdate)
3620 {
3621 if($isInvoice)
3622 {
3623 $invoice->save();
3624 }
3625 else
3626 {
3627 $arErrors = array();
3628 if(!$basketEntity::DoSaveOrderBasket($orderId, $orderInfo["LID"], $orderInfo["USER_ID"], $arShoppingCart, $arErrors))
3629 {
3630 $e = $APPLICATION->GetException();
3631 if(is_object($e))
3632 $this->strError .= "\r\n ".GetMessage("CC_BSC1_ORDER_ERROR_3", Array('#XML_1C_DOCUMENT_ID#'=>$arOrder["ID"])).$e->GetString();
3633 }
3634 }
3635 }
3636
3637 if(DoubleVal($orderInfo["DISCOUNT_VALUE"]) > 0)
3638 $arOrderFields["DISCOUNT_VALUE"] = 0;
3639 if($arOrder["COMMENT"] <> '' && $arOrder["COMMENT"] != $orderInfo["COMMENTS"])
3640 $arOrderFields["COMMENTS"] = $arOrder["COMMENT"];
3641 $arOrderFields["UPDATED_1C"] = "Y";
3642
3643 if(!empty($arOrderFields))
3644 $parentEntity::Update($orderId, $arOrderFields);
3645 if($isUsed === true)
3646 {
3647 \Bitrix\Sale\Compatible\DiscountCompatibility::revertUsageCompatible();
3648 }
3649 }
3650 else
3651 {
3652 $this->strError .= "\n".GetMessage("CC_BSC1_FINAL_NOT_EDIT", Array("#ID#" => $orderId));
3653 }
3654 }
3655
3656 $arAditFields = Array();
3657 if($arOrder['CANCELED'] == "true" || $arOrder["TRAITS"][GetMessage("CC_BSC1_CANCELED")] == "true" || $arOrder["TRAITS"][GetMessage("CC_BSC1_CANCEL")] == "true")
3658 {
3659 if($orderInfo["CANCELED"] == "N")
3660 {
3661 $parentEntity::CancelOrder($orderInfo["ID"], "Y", $arOrder["COMMENT"]);
3662 $arAditFields["UPDATED_1C"] = "Y";
3663 }
3664 }
3665 else
3666 {
3667 if($arOrder["TRAITS"][GetMessage("CC_BSC1_CANCELED")] != "true")
3668 {
3669 if($orderInfo["CANCELED"] == "Y")
3670 {
3671 $parentEntity::CancelOrder($orderInfo["ID"], "N", $arOrder["COMMENT"]);
3672 $arAditFields["UPDATED_1C"] = "Y";
3673 }
3674 }
3675
3676 if(mb_strlen($arOrder["TRAITS"][GetMessage("CC_BSC1_1C_PAYED_DATE")]) > 1)
3677 {
3678 if($orderInfo["PAYED"]=="N")
3679 $parentEntity::PayOrder($orderInfo["ID"], "Y");
3680 $arAditFields["PAY_VOUCHER_DATE"] = CDatabase::FormatDate(str_replace("T", " ", $arOrder["TRAITS"][GetMessage("CC_BSC1_1C_PAYED_DATE")]), "YYYY-MM-DD HH:MI:SS", CLang::GetDateFormat("FULL", LANG));
3681 if($arOrder["TRAITS"][GetMessage("CC_BSC1_1C_PAYED_NUM")] <> '')
3682 $arAditFields["PAY_VOUCHER_NUM"] = $arOrder["TRAITS"][GetMessage("CC_BSC1_1C_PAYED_NUM")];
3683 $arAditFields["UPDATED_1C"] = "Y";
3684 }
3685
3686 if(mb_strlen($arOrder["TRAITS"][GetMessage("CC_BSC1_1C_DELIVERY_DATE")]) > 1)
3687 {
3688 if(!$isInvoice)
3689 {
3690 if($orderInfo["ALLOW_DELIVERY"]=="N")
3691 CSaleOrder::DeliverOrder($orderInfo["ID"], "Y");
3692 }
3693
3694 $arAditFields["DATE_ALLOW_DELIVERY"] = CDatabase::FormatDate(str_replace("T", " ", $arOrder["TRAITS"][GetMessage("CC_BSC1_1C_DELIVERY_DATE")]), "YYYY-MM-DD HH:MI:SS", CLang::GetDateFormat("FULL", LANG));
3695 $arAditFields["DELIVERY_DOC_DATE"] = $arAditFields["DATE_ALLOW_DELIVERY"];
3696
3697 if($this->arParams["FINAL_STATUS_ON_DELIVERY"] <> '' && $orderInfo["STATUS_ID"] != "F" && $orderInfo["STATUS_ID"] != $this->arParams["FINAL_STATUS_ON_DELIVERY"])
3698 static::setStatus($orderInfo["ID"], $this->arParams["FINAL_STATUS_ON_DELIVERY"], $isInvoice);
3699 if($arOrder["TRAITS"][GetMessage("CC_BSC1_1C_DELIVERY_NUM")] <> '')
3700 $arAditFields["DELIVERY_DOC_NUM"] = $arOrder["TRAITS"][GetMessage("CC_BSC1_1C_DELIVERY_NUM")];
3701 $arAditFields["UPDATED_1C"] = "Y";
3702 }
3703 }
3704
3705
3706 if($this->arParams["CHANGE_STATUS_FROM_1C"] && $arOrder["TRAITS"][GetMessage("CC_BSC1_1C_STATUS_ID")] <> '')
3707 {
3708 if($orderInfo["STATUS_ID"] != $arOrder["TRAITS"][GetMessage("CC_BSC1_1C_STATUS_ID")])
3709 {
3710 static::setStatus($orderInfo["ID"], $arOrder["TRAITS"][GetMessage("CC_BSC1_1C_STATUS_ID")], $isInvoice);
3711 $arAditFields["UPDATED_1C"] = "Y";
3712 }
3713 }
3714
3715 if(count($arAditFields)>0)
3716 $parentEntity::Update($orderInfo["ID"], $arAditFields);
3717 }
3718 else
3719 $this->strError .= "\n".GetMessage("CC_BSC1_ORDER_NOT_FOUND", Array("#ID#" => $arOrder["ID"]));
3720 }
3721 elseif($this->arParams["IMPORT_NEW_ORDERS"] == "Y") // create new order (ofline 1C)
3722 {
3723 if(!empty($arOrder["AGENT"]) && $arOrder["AGENT"]["ID"] <> '')
3724 {
3725 $arOrder["PERSON_TYPE_ID"] = 0;
3726 $arOrder["USER_ID"] = 0;
3727 $arErrors = array();
3728 $dbUProp = CSaleOrderUserProps::GetList(array(), array("XML_ID" => $arOrder["AGENT"]["ID"]), false, false, array("ID", "NAME", "USER_ID", "PERSON_TYPE_ID", "XML_ID", "VERSION_1C"));
3729 if($arUProp = $dbUProp->Fetch())
3730 {
3731 $arOrder["USER_ID"] = $arUProp["USER_ID"];
3732 $arOrder["PERSON_TYPE_ID"] = $arUProp["PERSON_TYPE_ID"];
3733 $arOrder["USER_PROFILE_ID"] = $arUProp["ID"];
3734 $arOrder["USER_PROFILE_VERSION"] = $arUProp["VERSION_1C"];
3735
3736 $dbUPropValue = CSaleOrderUserPropsValue::GetList(array(), array("USER_PROPS_ID" => $arUProp["ID"]));
3737 while($arUPropValue = $dbUPropValue->Fetch())
3738 {
3739 $arOrder["USER_PROPS"][$arUPropValue["ORDER_PROPS_ID"]] = $arUPropValue["VALUE"];
3740 }
3741 }
3742 else
3743 {
3744 if($arOrder["AGENT"]["ID"] <> '')
3745 {
3746 $arAI = explode("#", $arOrder["AGENT"]["ID"]);
3747 if(intval($arAI[0]) > 0)
3748 {
3749 $dbUser = CUser::GetByID($arAI[0]);
3750 if($arU = $dbUser->Fetch())
3751 {
3752 if(htmlspecialcharsback(mb_substr(htmlspecialcharsbx($arU["ID"]."#".$arU["LOGIN"]."#".$arU["LAST_NAME"]." ".$arU["NAME"]." ".$arU["SECOND_NAME"]), 0, 80)) == $arOrder["AGENT"]["ID"])
3753 {
3754 $arOrder["USER_ID"] = $arU["ID"];
3755 }
3756 }
3757 }
3758 }
3759
3760 if(intval($arOrder["USER_ID"]) <= 0)
3761 {
3762 //create new user
3763 $arUser = array(
3764 "NAME" => $arOrder["AGENT"]["ITEM_NAME"],
3765 "EMAIL" => $arOrder["AGENT"]["CONTACT"]["MAIL_NEW"],
3766 );
3767
3768 if ($arUser["NAME"] == '')
3769 $arUser["NAME"] = $arOrder["AGENT"]["CONTACT"]["CONTACT_PERSON"];
3770
3771 $emServer = $_SERVER["SERVER_NAME"];
3772 if(mb_strpos($_SERVER["SERVER_NAME"], ".") === false)
3773 $emServer .= ".bx";
3774
3775 if ($arUser["EMAIL"] == '')
3776 $arUser["EMAIL"] = "buyer".time().GetRandomCode(2)."@".$emServer;
3777
3778 $arOrder["USER_ID"] = CSaleUser::DoAutoRegisterUser($arUser["EMAIL"], $arUser["NAME"], $this->arParams["SITE_NEW_ORDERS"], $arErrors, array("XML_ID"=>$arOrder["AGENT"]["ID"], "EXTERNAL_AUTH_ID"=>Sale\Exchange\Entity\UserImportBase::EXTERNAL_AUTH_ID));
3779
3780 $obUser = new CUser;
3781 $userFields[] = array();
3782
3783 if($arOrder["AGENT"]["CONTACT"]["PHONE"] <> '')
3784 $userFields["WORK_PHONE"] = $arOrder["AGENT"]["CONTACT"]["PHONE"];
3785
3786 if(count($userFields)>0)
3787 {
3788 if(!$obUser->Update($arOrder["USER_ID"], $userFields, true))
3789 $this->strError .= "\n".$obUser->LAST_ERROR;
3790 }
3791 }
3792 }
3793
3794 if(empty($arPersonTypesIDs))
3795 {
3796 $dbPT = CSalePersonType::GetList(array(), array("ACTIVE" => "Y", "LIDS" => $this->arParams["SITE_NEW_ORDERS"]));
3797 while($arPT = $dbPT->Fetch())
3798 {
3799 $arPersonTypesIDs[] = $arPT["ID"];
3800 }
3801 }
3802
3803 if(empty($arExportInfo))
3804 {
3805 $dbExport = CSaleExport::GetList(array(), array("PERSON_TYPE_ID" => $arPersonTypesIDs));
3806 while($arExport = $dbExport->Fetch())
3807 {
3808 $arExportInfo[$arExport["PERSON_TYPE_ID"]] = unserialize($arExport["VARS"], ['allowed_classes' => false]);
3809 }
3810 }
3811
3812 if(intval($arOrder["PERSON_TYPE_ID"]) <= 0)
3813 {
3814 foreach($arExportInfo as $pt => $value)
3815 {
3816 if(
3817 (($value["IS_FIZ"] == "Y" && $arOrder["AGENT"]["TYPE"] == "FIZ")
3818 || ($value["IS_FIZ"] == "N" && $arOrder["AGENT"]["TYPE"] != "FIZ"))
3819 )
3820 $arOrder["PERSON_TYPE_ID"] = $pt;
3821 }
3822 }
3823
3824 if(intval($arOrder["PERSON_TYPE_ID"]) > 0)
3825 {
3826 $arAgent = $arExportInfo[$arOrder["PERSON_TYPE_ID"]];
3827 foreach($arAgent as $k => $v)
3828 {
3829 if(
3830 empty($v)
3831 || !is_array($v)
3832 || (
3833 (empty($v["VALUE"]) || $v["TYPE"] !== "PROPERTY")
3834 && (
3835 empty($arOrder["USER_PROPS"])
3836 || (is_array($v) && is_string($v["VALUE"]) && empty($arOrder["USER_PROPS"][$v["VALUE"]]))
3837 )
3838 )
3839 )
3840 {
3841 unset($arAgent[$k]);
3842 }
3843 }
3844
3845 if(intval($arOrder["USER_ID"]) > 0)
3846 {
3847 $orderFields = array(
3848 "SITE_ID" => $this->arParams["SITE_NEW_ORDERS"],
3849 "PERSON_TYPE_ID" => $arOrder["PERSON_TYPE_ID"],
3850 "PAYED" => "N",
3851 "CANCELED" => "N",
3852 "STATUS_ID" => "N",
3853 "PRICE" => $arOrder["AMOUNT"],
3854 "CURRENCY" => CSaleLang::GetLangCurrency($this->arParams["SITE_NEW_ORDERS"]),
3855 "USER_ID" => $arOrder["USER_ID"],
3856 "TAX_VALUE" => doubleval($arOrder["TAX"]["VALUE_MONEY"]),
3857 "COMMENTS" => $arOrder["COMMENT"],
3858 "BASKET_ITEMS" => array(),
3859 "TAX_LIST" => array(),
3860 "ORDER_PROP" => array(),
3861 );
3862 $arAditFields = array(
3863 "EXTERNAL_ORDER" => "Y",
3864 "ID_1C" => $arOrder["ID_1C"],
3865 "VERSION_1C" => $arOrder["VERSION_1C"],
3866 "UPDATED_1C" => "Y",
3867 "DATE_INSERT" => CDatabase::FormatDate($arOrder["DATE"]." ".$arOrder["TIME"], "YYYY-MM-DD HH:MI:SS", CLang::GetDateFormat("FULL", LANG)),
3868 );
3869
3870 foreach($arOrder["items"] as $productID => $val)
3871 {
3872 $orderFields["BASKET_ITEMS"][] = $this->prepareProduct4Basket($productID, $val, false, $orderFields);
3873 }
3874
3875 if(!empty($arOrder["TAX"]))
3876 {
3877 $orderFields["TAX_LIST"][] = array(
3878 "NAME" => $arOrder["TAX"]["NAME"],
3879 "IS_PERCENT" => "Y",
3880 "VALUE" => $arOrder["TAX"]["VALUE"],
3881 "VALUE_MONEY" => $arOrder["TAX"]["VALUE_MONEY"],
3882 "IS_IN_PRICE" => $arOrder["TAX"]["IS_IN_PRICE"],
3883 "CODE" => 'VAT1C',
3884 "APPLY_ORDER" => '100',
3885 );
3886 }
3887
3888 foreach($arAgent as $k => $v)
3889 {
3890 if(!empty($arOrder["ORDER_PROPS"][$k]))
3891 {
3892 $orderFields["ORDER_PROP"][$v["VALUE"]] = $arOrder["ORDER_PROPS"][$k];
3893 }
3894 if(empty($orderFields["ORDER_PROP"][$v["VALUE"]]) && !empty($arOrder["USER_PROPS"][$v["VALUE"]]))
3895 {
3896 $orderFields["ORDER_PROP"][$v["VALUE"]] = $arOrder["USER_PROPS"][$v["VALUE"]];
3897 }
3898 }
3899
3900 $importSettings = Sale\Exchange\OneC\ImportSettings::getCurrent();
3901 $deliverySystemId = $importSettings->shipmentServiceFor(Sale\Exchange\EntityType::SHIPMENT);
3902 $orderFields['DELIVERY_ID'] = ($deliverySystemId? $deliverySystemId : null);
3903
3904 if($arOrder["ID"] = $parentEntity::DoSaveOrder($orderFields, $arAditFields, 0, $arErrors))
3905 {
3906 $arAditFields = array("UPDATED_1C" => "Y");
3907 $parentEntity::Update($arOrder["ID"], $arAditFields);
3908
3909 //add/update user profile
3910 if(intval($arOrder["USER_PROFILE_ID"]) > 0)
3911 {
3912 if($arOrder["USER_PROFILE_VERSION"] != $arOrder["AGENT"]["VERSION"])
3913 CSaleOrderUserProps::Update($arOrder["USER_PROFILE_ID"], array("VERSION_1C" => $arOrder["AGENT"]["VERSION"], "NAME" => $arOrder["AGENT"]["AGENT_NAME"], "USER_ID" => $arOrder["USER_ID"]));
3914 $dbUPV = CSaleOrderUserPropsValue::GetList(array(), array("USER_PROPS_ID" =>$arOrder["USER_PROFILE_ID"]));
3915 while($arUPV = $dbUPV->Fetch())
3916 {
3917 $arOrder["AGENT"]["PROFILE_PROPS_VALUE"][$arUPV["ORDER_PROPS_ID"]] = array("ID" => $arUPV["ID"], "VALUE" => $arUPV["VALUE"]);
3918 }
3919 }
3920
3921 if(intval($arOrder["USER_PROFILE_ID"]) <= 0 || (intval($arOrder["USER_PROFILE_ID"]) > 0 && $arOrder["USER_PROFILE_VERSION"] != $arOrder["AGENT"]["VERSION"]))
3922 {
3923 $dbOrderProperties = CSaleOrderProps::GetList(
3924 array("SORT" => "ASC"),
3925 array(
3926 "PERSON_TYPE_ID" => $arOrder["PERSON_TYPE_ID"],
3927 "ACTIVE" => "Y",
3928 "UTIL" => "N",
3929 "USER_PROPS" => "Y",
3930 ),
3931 false,
3932 false,
3933 array("ID", "TYPE", "NAME", "CODE", "USER_PROPS", "SORT", "MULTIPLE")
3934 );
3935 while ($arOrderProperties = $dbOrderProperties->Fetch())
3936 {
3937 $curVal = $orderFields["ORDER_PROP"][$arOrderProperties["ID"]];
3938
3939 if ($curVal <> '')
3940 {
3941 if (intval($arOrder["USER_PROFILE_ID"]) <= 0)
3942 {
3943 $arFields = array(
3944 "NAME" => $arOrder["AGENT"]["AGENT_NAME"],
3945 "USER_ID" => $arOrder["USER_ID"],
3946 "PERSON_TYPE_ID" => $arOrder["PERSON_TYPE_ID"],
3947 "XML_ID" => $arOrder["AGENT"]["ID"],
3948 "VERSION_1C" => $arOrder["AGENT"]["VERSION"],
3949 );
3950 $arOrder["USER_PROFILE_ID"] = CSaleOrderUserProps::Add($arFields);
3951 }
3952 if(intval($arOrder["USER_PROFILE_ID"]) > 0)
3953 {
3954 $arFields = array(
3955 "USER_PROPS_ID" => $arOrder["USER_PROFILE_ID"],
3956 "ORDER_PROPS_ID" => $arOrderProperties["ID"],
3957 "NAME" => $arOrderProperties["NAME"],
3958 "VALUE" => $curVal
3959 );
3960 if(empty($arOrder["AGENT"]["PROFILE_PROPS_VALUE"][$arOrderProperties["ID"]]))
3961 {
3963 }
3964 elseif($arOrder["AGENT"]["PROFILE_PROPS_VALUE"][$arOrderProperties["ID"]]["VALUE"] != $curVal)
3965 {
3966 CSaleOrderUserPropsValue::Update($arOrder["AGENT"]["PROFILE_PROPS_VALUE"][$arOrderProperties["ID"]]["ID"], $arFields);
3967 }
3968 }
3969 }
3970 }
3971 }
3972 }
3973 else
3974 {
3975 $this->strError .= "\n".GetMessage("CC_BSC1_ORDER_ADD_PROBLEM", Array("#ID#" => $arOrder["ID_1C"]));
3976 if(is_array($arErrors))
3977 $this->strError .= "\n".implode(', ',$arErrors);
3978 }
3979 }
3980 else
3981 {
3982 $this->strError .= "\n".GetMessage("CC_BSC1_ORDER_USER_PROBLEM", Array("#ID#" => $arOrder["ID_1C"]));
3983 if(!empty($arErrors))
3984 {
3985 foreach($arErrors as $v)
3986 {
3987 $this->strError .= "\n".$v["TEXT"];
3988 }
3989 }
3990 }
3991 }
3992 else
3993 {
3994 $this->strError .= "\n".GetMessage("CC_BSC1_ORDER_PERSON_TYPE_PROBLEM", Array("#ID#" => $arOrder["ID_1C"]));
3995 }
3996 }
3997 else
3998 {
3999 $this->strError .= "\n".GetMessage("CC_BSC1_ORDER_NO_AGENT_ID", Array("#ID#" => $arOrder["ID_1C"]));
4000 }
4001 }
4002 }
4003
4004 static public function setStatus($id, $statusId, $isInvoice)
4005 {
4006 if($isInvoice)
4007 {
4008 $invoice = new \CCrmInvoice(false);
4009 $invoice->SetStatus($id, $statusId);
4010 }
4011 else
4012 {
4013 $order = new CSaleOrder();
4014 $order->StatusOrder($id, $statusId);
4015 }
4016 }
4017}
4018?>
return[Dependency::CONTAINER=> Container::class, Dependency::IBLOCK_INFO=> IblockInfo::class, Dependency::PRODUCT_CONVERTER=> ProductConverter::class, Dependency::REPOSITORY_FACADE=> Repository::class, Dependency::PRODUCT_FACTORY=> ProductFactory::class, Dependency::PRODUCT_REPOSITORY=> ProductRepository::class, ProductFactory::PRODUCT=> Product::class, Dependency::SECTION_FACTORY=> SectionFactory::class, Dependency::SECTION_REPOSITORY=> SectionRepository::class, SectionFactory::SECTION=> Section::class, SectionFactory::SECTION_COLLECTION=> SectionCollection::class, Dependency::SKU_FACTORY=> SkuFactory::class, Dependency::SKU_REPOSITORY=> SkuRepository::class, SkuFactory::SIMPLE_SKU=> SimpleSku::class, SkuFactory::SKU=> Sku::class, SkuFactory::SKU_COLLECTION=> SkuCollection::class, Dependency::PROPERTY_FACTORY=> PropertyFactory::class, Dependency::PROPERTY_REPOSITORY=> PropertyRepository::class, PropertyFactory::PROPERTY=> Property::class, PropertyFactory::PROPERTY_COLLECTION=> PropertyCollection::class, Dependency::PROPERTY_VALUE_FACTORY=> PropertyValueFactory::class, PropertyValueFactory::PROPERTY_VALUE=> PropertyValue::class, PropertyValueFactory::PROPERTY_VALUE_COLLECTION=> PropertyValueCollection::class, Dependency::PROPERTY_FEATURE_FACTORY=> PropertyFeatureFactory::class, Dependency::PROPERTY_FEATURE_REPOSITORY=> PropertyFeatureRepository::class, PropertyFeatureFactory::PROPERTY_FEATURE=> PropertyFeature::class, PropertyFeatureFactory::PROPERTY_FEATURE_COLLECTION=> PropertyFeatureCollection::class, Dependency::PRICE_FACTORY=> PriceFactory::class, Dependency::PRICE_REPOSITORY=> PriceRepository::class, PriceFactory::SIMPLE_PRICE=> SimplePrice::class, PriceFactory::QUANTITY_DEPENDENT_PRICE=> QuantityDependentPrice::class, PriceFactory::PRICE_COLLECTION=> PriceCollection::class, Dependency::IMAGE_FACTORY=> ImageFactory::class, Dependency::IMAGE_REPOSITORY=> ImageRepository::class, ImageFactory::DETAIL_IMAGE=> DetailImage::class, ImageFactory::PREVIEW_IMAGE=> PreviewImage::class, ImageFactory::MORE_PHOTO_IMAGE=> MorePhotoImage::class, ImageFactory::IMAGE_COLLECTION=> ImageCollection::class, Dependency::MEASURE_RATIO_FACTORY=> MeasureRatioFactory::class, Dependency::MEASURE_RATIO_REPOSITORY=> MeasureRatioRepository::class, MeasureRatioFactory::SIMPLE_MEASURE_RATIO=> SimpleMeasureRatio::class, MeasureRatioFactory::MEASURE_RATIO_COLLECTION=> MeasureRatioCollection::class, Dependency::BARCODE_FACTORY=> BarcodeFactory::class, Dependency::BARCODE_REPOSITORY=> BarcodeRepository::class, BarcodeFactory::BARCODE=> Barcode::class, BarcodeFactory::BARCODE_COLLECTION=> BarcodeCollection::class, Dependency::STORE_PRODUCT_FACTORY=> StoreProductFactory::class, Dependency::STORE_PRODUCT_REPOSITORY=> StoreProductRepository::class, StoreProductFactory::STORE_PRODUCT=> StoreProduct::class, StoreProductFactory::STORE_PRODUCT_COLLECTION=> StoreProductCollection::class, 'sku.tree'=> SkuTree::class, 'integration.seo.facebook.facade'=> FacebookFacade::class, 'integration.seo.facebook.product.processor'=> FacebookProductProcessor::class, 'integration.seo.facebook.product.repository'=> FacebookProductRepository::class,]
Определения .container.php:139
$path
Определения access_edit.php:21
$type
Определения options.php:106
while($arIBType=$dbIBlockType->Fetch()) $dbIBlock
Определения options.php:178
global $APPLICATION
Определения include.php:80
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
static getInstance()
Определения application.php:98
static get($moduleId, $name, $default="", $siteId=false)
Определения option.php:30
static set($moduleId, $name, $value="", $siteId="")
Определения option.php:261
static getInstance()
Определения eventmanager.php:31
Определения date.php:9
static getObjectById($deliveryId)
Определения manager.php:438
static getList(array $params=array())
Определения manager.php:84
static getInnerPaySystemId()
Определения manager.php:642
static getObjectById($id)
Определения manager.php:719
Определения payment.php:19
static roundPrecision($value)
Определения pricemaths.php:16
static getInstance($type)
Определения registry.php:183
static GetByID($ID)
Определения product.php:625
static FormatDate($strDate, $format="DD.MM.YYYY HH:MI:SS", $new_format="DD.MM.YYYY HH:MI:SS")
Определения database.php:476
static createNoDeliveryServiceAgent()
Определения delivery.php:1596
static AddRecord($orderId, $type, $data=array(), $entityName=null, $entityId=null)
Определения order_change.php:126
static CancelOrder($ID, $val, $description="")
Определения order.php:2303
static StatusOrder($ID, $val)
Определения order.php:2449
static Delete($ID)
Определения order_tax.php:89
static Update($ID, $arFields)
Определения order_tax.php:73
static Update($ID, $arFields)
Определения order_user_props.php:297
static Update($ID, $arFields)
Определения order_user_props_value.php:51
static DoAutoRegisterUser($autoEmail, $payerName, $siteId, &$arErrors, $arOtherFields=null)
Определения basket.php:3614
static GetByID($ID)
Определения user.php:3820
Определения xml.php:396
GetArray()
Определения xml.php:451
static GetList($order=Array("ID"=> "DESC"), $filter=Array(), $group=false, $arNavStartParams=false, $select=array())
Определения export.php:3049
static GetLangCurrency($siteId)
Определения settings.php:52
Определения order.php:9
static Update($ID, $arFields, $bDateUpdate=true)
Определения order.php:140
static GetList($arOrder=array("ID"=>"DESC"), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array(), $arOptions=array())
Определения order.php:339
Определения order_loader.php:9
addOrderWithoutShipmentsPayments(array $arDocument, $addOrderField=array())
Определения order_loader.php:1254
setOperationType($type)
Определения order_loader.php:1619
$bNewVersion
Определения order_loader.php:24
setXMLDocumentID($xmlid)
Определения order_loader.php:1644
getOptionNameByType()
Определения order_loader.php:1872
setVersionSchema($versionSchema=false)
Определения order_loader.php:1749
updateShipmentItemQuantity($needQuantity, \Bitrix\Sale\BasketItem $basketItem, \Bitrix\Sale\Shipment $shipment)
Определения order_loader.php:1523
getPersonType($arOrder)
Определения order_loader.php:1780
$arPersonTypesIDs
Определения order_loader.php:25
ToFloat($str)
Определения order_loader.php:2828
getOrderIdOriginal()
Определения order_loader.php:1660
nodeHandlerDefaultModuleOneC(CDataXML $dataXml)
Определения order_loader.php:2519
setVersion1C($version1C)
Определения order_loader.php:1640
getLogFilePath()
Определения order_loader.php:321
nodeHandlerDefaultModuleOneCCRM(CDataXML $dataXml)
Определения order_loader.php:2485
$QuantityFormat
Определения order_loader.php:21
$delimiter_reason
Определения order_loader.php:31
getOrderTaxList($arOrder)
Определения order_loader.php:1827
isMarkedOrder(\Bitrix\Sale\Order $order)
Определения order_loader.php:117
setDocumentType($operationType)
Определения order_loader.php:1598
$needModifyItem
Определения order_loader.php:44
prepareProduct4Basket($itemID, $arItem, $orderId, $orderInfo)
Определения order_loader.php:3224
static setStatus($id, $statusId, $isInvoice)
Определения order_loader.php:4004
saveOrderCompatibility($arDocument, $arAditFields=array())
Определения order_loader.php:894
getAvailableSystemQuentityProduct(\Bitrix\Sale\BasketItem $basketItem, \Bitrix\Sale\Shipment $shipment)
Определения order_loader.php:1925
Paid(\Bitrix\Sale\Payment $payment, $arDocument)
Определения order_loader.php:977
addModifyItem($type, $id)
Определения order_loader.php:1898
static $operationType
Определения order_loader.php:34
$arExportInfo
Определения order_loader.php:26
$crmCompatibleMode
Определения order_loader.php:29
addShipmentFromDocumentByOrder(array $arDocument, \Bitrix\Sale\Order $order)
Определения order_loader.php:1268
createEntityCompatible1C(\Bitrix\Sale\Order $order, $arDocument)
Определения order_loader.php:232
addBasketForShipment($arDocument, $newBasketItems, \Bitrix\Sale\Shipment $shipment)
Определения order_loader.php:585
const DEBUG_FILE
Определения order_loader.php:13
getSiteId()
Определения order_loader.php:47
setExportInfo()
Определения order_loader.php:1769
const PARTIAL_VERSION
Определения order_loader.php:11
getLogFileDir()
Определения order_loader.php:316
ToInt($str)
Определения order_loader.php:2852
getTimeStampString()
Определения order_loader.php:337
getProductChangePrice($itemID, $priceNew=null)
Определения order_loader.php:1904
setOrderIdOriginal($code)
Определения order_loader.php:1648
checkConditionForShipmentByBasket(\Bitrix\Sale\BasketItem $basketItem, \Bitrix\Sale\Shipment $shipment)
Определения order_loader.php:1664
updateShipmentNeedQuantityFromBasketItems( $needQuantityWithoutSystem, $needQuantity, \Bitrix\Sale\BasketItem $basketItem, \Bitrix\Sale\Shipment $shipment)
Определения order_loader.php:1485
updatePaymentFromDocument(array $arDocument, \Bitrix\Sale\Payment $payment)
Определения order_loader.php:1146
collectAgentInfo($data=array())
Определения order_loader.php:3095
updateShipmentNeedQuantity($externalQuantity, \Bitrix\Sale\BasketItem $basketItem, \Bitrix\Sale\Shipment $shipment, $shipmentItemFields)
Определения order_loader.php:1459
$arParams
Определения order_loader.php:23
prepareOrderFields($arOrder)
Определения order_loader.php:1809
static $documentType
Определения order_loader.php:35
$strError
Определения order_loader.php:19
getVersion1C()
Определения order_loader.php:1652
static $versionSchema
Определения order_loader.php:36
getOrderIdByDocument($orderCode)
Определения order_loader.php:494
unMarkedOrder(\Bitrix\Sale\Order $order)
Определения order_loader.php:93
static $useStoreControl
Определения order_loader.php:33
const DEFUALT_VERSION
Определения order_loader.php:10
getDocumentId($type, $code, $xmlId1CDocument)
Определения order_loader.php:438
$xmlid1C
Определения order_loader.php:40
deleteDocumentShipment(\Bitrix\Sale\Shipment $shipment)
Определения order_loader.php:60
setShipmentItemQuantity($needQuantity, \Bitrix\Sale\BasketItem $basketItem, \Bitrix\Sale\Shipment $shipment)
Определения order_loader.php:1541
documentMustHaveProducts($arDocument)
Определения order_loader.php:3343
logMessage($message='')
Определения order_loader.php:326
checkVersion1C(\Bitrix\Sale\Shipment $shipment)
Определения order_loader.php:1742
getVersionSchema()
Определения order_loader.php:1889
$arIBInfo
Определения order_loader.php:27
$importer
Определения order_loader.php:17
checkPSOnStatusPaymentOrder()
Определения order_loader.php:1718
setMarkedOrder(\Bitrix\Sale\Order $order)
Определения order_loader.php:86
$SumFormat
Определения order_loader.php:20
collectDocumentInfo($value)
Определения order_loader.php:2876
deleteDocumentPayment(\Bitrix\Sale\Payment $payment)
Определения order_loader.php:68
getAvailableQuentityProduct(\Bitrix\Sale\BasketItem $basketItem, \Bitrix\Sale\Shipment $shipment)
Определения order_loader.php:1938
saveOrder($arDocument, $orderFields, $arAditFields)
Определения order_loader.php:1028
$sdp
Определения order_loader.php:22
$strErrorDocument
Определения order_loader.php:38
getExportInfo($arOrder)
Определения order_loader.php:1792
const DEBUG_MODE
Определения order_loader.php:14
updateShipmentNeedQuantityFromSystem($Quantity, \Bitrix\Sale\BasketItem $basketItem, \Bitrix\Sale\Shipment $shipment)
Определения order_loader.php:1569
updateBasketNeedExternalQuantity($externalQuantity, $availableQuantityByProducts, \Bitrix\Sale\BasketItem $basketItem, \Bitrix\Sale\Shipment $shipment)
Определения order_loader.php:1576
getXMLStream(CXMLFileStream $fileStream)
Определения order_loader.php:2057
addNeedModifyItem($type, $id)
Определения order_loader.php:1894
static getDefaultPaySystem()
Определения order_loader.php:1681
getBasketProperty($item)
Определения order_loader.php:1844
getOrderProperty($arAgent, $orderFields, $arOrder)
Определения order_loader.php:1857
afterShippedCompatible1C(\Bitrix\Sale\Order $order)
Определения order_loader.php:76
getUserByProperty($arOrder)
Определения order_loader.php:1954
setPersonTypesID()
Определения order_loader.php:1758
$modifyItem
Определения order_loader.php:43
$orderIdOrig
Определения order_loader.php:41
clearSessionData()
Определения order_loader.php:2098
updateShipmentQuantityFromDocument(array $arDocument, \Bitrix\Sale\Shipment $shipment)
Определения order_loader.php:1294
elementHandler($path, $attr)
Определения order_loader.php:2021
$marked_code
Определения order_loader.php:30
$version1C
Определения order_loader.php:39
getXMLDocumentID()
Определения order_loader.php:1656
static GetList($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
Определения order_props.php:410
static Add($arFields)
Определения order_tax.php:105
static GetList($arOrder=array("TAX_NAME"=> "ASC"), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
Определения order_tax.php:7
static Add($arFields)
Определения order_user_props.php:132
static GetList($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
Определения order_user_props.php:7
static Add($arFields)
Определения order_user_props_value.php:178
static GetList($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
Определения order_user_props_value.php:7
static GetList($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
Определения person_type.php:7
Определения user.php:6037
Определения xml.php:836
$str
Определения commerceml2.php:63
$dbOrderTax
Определения commerceml.php:56
$arFields
Определения dblapprove.php:5
$data['IS_AVAILABLE']
Определения .description.php:13
$orderId
Определения payment.php:5
if(errorBox) return true
Определения file_new.php:1035
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
$_SERVER["DOCUMENT_ROOT"]
Определения cron_frame.php:9
global $USER
Определения csv_new_run.php:40
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
Определения options.php:195
const LANG_CHARSET
Определения include.php:65
$siteId
Определения ajax.php:8
htmlspecialcharsback($str)
Определения tools.php:2693
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
Определения tools.php:2701
GetRandomCode($len=8)
Определения tools.php:2180
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
is_set($a, $k=false)
Определения tools.php:2133
GetMessage($name, $aReplace=null)
Определения tools.php:3397
$value
Определения Param.php:39
Order
Определения order.php:6
Определения ufield.php:9
$user
Определения mysql_to_pgsql.php:33
Определения buffer.php:3
trait Error
Определения error.php:11
$payment
Определения payment.php:14
$order
Определения payment.php:8
$paymentCollection
Определения payment.php:11
$service
Определения payment.php:18
$message
Определения payment.php:8
$event
Определения prolog_after.php:141
return false
Определения prolog_main_admin.php:185
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$ar
Определения options.php:199
if(empty($signedUserToken)) $key
Определения quickway.php:257
</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
if(CSalePaySystemAction::GetParamValue("DATE_PAY_BEFORE", false)) $dbBasket
Определения html.php:162
$items
Определения template.php:224
$option
Определения options.php:1711
$val
Определения options.php:1793
$optionName
Определения options.php:1735
$eventManager
Определения include.php:412
$error
Определения subscription_card_product.php:20
$k
Определения template_pdf.php:567
$arIBlock['PROPERTY']
Определения yandex_detail.php:172
$fields
Определения yandex_run.php:501