1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
order.php
См. документацию.
1<?php
2
3
4namespace Bitrix\Sale\Controller;
5
6
7use Bitrix\Main\Engine\AutoWire\ExactParameter;
8use Bitrix\Main\Engine\Response\DataType\Page;
9use Bitrix\Main\Error;
10use Bitrix\Main\Type\RandomSequence;
11use Bitrix\Main\UI\PageNavigation;
12use Bitrix\Sale\Helpers\Order\Builder\BuildingException;
13use Bitrix\Sale\PaySystem\Manager;
14use Bitrix\Sale\Registry;
15use Bitrix\Sale;
16use Bitrix\Sale\Rest\Synchronization\Loader\Factory;
17use Bitrix\Sale\Rest\Synchronization\LoggerDiag;
18use Bitrix\Sale\Result;
19
20class Order extends Controller
21{
22 public function getPrimaryAutoWiredParameter()
23 {
24 return new ExactParameter(
25 Sale\Order::class,
26 'order',
27 function($className, $id)
28 {
29 $id = (int)$id;
30 if ($id > 0)
31 {
33
35 $orderClass = $registry->getOrderClassName();
36
38 $order = $orderClass::load($id);
39 if ($order instanceof Sale\OrderBase)
40 {
41 return $order;
42 }
43 }
44
45 $this->addError(new Error('order is not exists', 200540400001));
46
47 return null;
48 }
49 );
50 }
51
52 //region Actions
53 public function getFieldsAction()
54 {
55 $entity = new \Bitrix\Sale\Rest\Entity\Order();
56 return ['ORDER'=>$entity->prepareFieldInfos(
57 $entity->getFields()
58 )];
59 }
60
61 public function getAction(\Bitrix\Sale\Order $order)
62 {
63 //TODO: return $order->toArray();
64 return $this->toArray($order);
65 }
66
67 public function tryModifyAction(array $fields)
68 {
69 $r = $this->modify($fields);
70
71 if($r->isSuccess())
72 {
74 $order = $r->getData()['ORDER'];
75
76 $result = $this->toArray($order);
77
78 if(is_array($result['ORDER']['PAYMENTS']))
79 {
80 foreach ($result['ORDER']['PAYMENTS'] as $ix=>&$fields)
81 {
82 $paySystems = Manager::getListWithRestrictions(
83 $order
84 ->getPaymentCollection()
85 ->getItemByIndex($ix)
86 );
87
88 foreach ($paySystems as $paySystem)
89 {
90 if((int)$paySystem['PAY_SYSTEM_ID']>0) //Without Inner
91 {
92 $fields['LIST_PAY_SYSTEM_WITH_RESTRICTIONS'][]=[
93 'ID'=>$paySystem['PAY_SYSTEM_ID'],
94 ];
95 }
96 }
97 }
98 }
99
100 if(is_array($result['ORDER']['SHIPMENTS']))
101 {
102 foreach ($result['ORDER']['SHIPMENTS'] as $ix=>&$fields)
103 {
104 $services = \Bitrix\Sale\Delivery\Services\Manager::getRestrictedObjectsList(
105 $order
106 ->getShipmentCollection()
107 ->getItemByIndex($ix)
108 );
109
110 foreach ($services as $service)
111 {
112 $fields['LIST_DELIIVERY_SERVICES_RESTRICTIONS'][]=[
113 'ID'=>$service->getId(),
114 ];
115 }
116 }
117 }
118 return $result;
119 }
120 else
121 {
122 $this->addErrors($r->getErrors());
123 return null;
124 }
125 }
126
127 public function modifyAction(array $fields)
128 {
129 $r = $this->modify($fields);
130
131 if($r->isSuccess())
132 {
134 $order = $r->getData()['ORDER'];
135
136 $r = $order->save();
137 if(!$r->isSuccess())
138 {
139 $this->addErrors($r->getErrors());
140 return null;
141 }
142 elseif($r->hasWarnings())
143 {
144 $this->addErrors($r->getWarnings());
145 return null;
146 }
147
148 //TODO: return $order->toArray();
149 return $this->toArray($order);
150 }
151 elseif($r->hasWarnings())
152 {
153 $this->addErrors($r->getWarnings());
154 return null;
155 }
156 else
157 {
158 $this->addErrors($r->getErrors());
159 return null;
160 }
161 }
162
163 public function tryAddAction(array $fields)
164 {
165 $r = $this->add($fields);
166
167 if($r->isSuccess())
168 {
169 $order = $r->getData()['ORDER'];
170 return $this->toArray($order);
171 }
172 else
173 {
174 $this->addErrors($r->getErrors());
175 return null;
176 }
177 }
178
179 public function addAction(array $fields)
180 {
181 $result = null;
182
183 $r = $this->add($fields);
184
185 if($r->isSuccess())
186 {
188 $order = $r->getData()['ORDER'];
189
190 $r = $order->save();
191 if(!$r->isSuccess())
192 {
193 $this->addErrors($r->getErrors());
194 return null;
195 }
196
197 //TODO: return $order->toArray();
198 return $this->toArray($order);
199 }
200 else
201 {
202 $this->addErrors($r->getErrors());
203 return null;
204 }
205 }
206
208 {
209 $r = $this->update($order, $fields);
210
211 if($r->isSuccess())
212 {
213 $order = $r->getData()['ORDER'];
214 return $this->toArray($order);
215 }
216 else
217 {
218 $this->addErrors($r->getErrors());
219 return null;
220 }
221 }
222
223 public function updateAction(\Bitrix\Sale\Order $order, array $fields)
224 {
225 $result = null;
226 $r = $this->update($order, $fields);
227
228 if($r->isSuccess())
229 {
231 $order = $r->getData()['ORDER'];
232
233 $r = $order->save();
234 if(!$r->isSuccess())
235 {
236 $this->addErrors($r->getErrors());
237 return null;
238 }
239
240 //TODO: return $order->toArray();
241 return $this->toArray($order);
242 }
243 else
244 {
245 $this->addErrors($r->getErrors());
246 return null;
247 }
248 }
249
250 public function listAction(
251 PageNavigation $pageNavigation,
252 array $select = [],
253 array $filter = [],
254 array $order = [],
255 bool $__calculateTotalCount = true
256 ): Page
257 {
258 $select = empty($select) ? ['*'] : $select;
259 $order = empty($order) ? ['ID' => 'ASC'] : $order;
260 $runtime = [
261 new \Bitrix\Main\Entity\ReferenceField(
262 'PERSON_TYPE',
263 '\Bitrix\Sale\Internals\PersonType',
264 array('=this.PERSON_TYPE_ID' => 'ref.ID')
265 ),
266 new \Bitrix\Main\Entity\ReferenceField(
267 'STATUS_TABLE',
268 '\Bitrix\Sale\Internals\StatusTable',
269 array('=this.STATUS_ID' => 'ref.ID')
270 )
271 ];
272
274
276 $orderClass = $registry->getOrderClassName();
277
278 $iterator = $orderClass::getList(
279 [
280 'select' => $select,
281 'filter' => $filter,
282 'order' => $order,
283 'offset' => $pageNavigation->getOffset(),
284 'limit' => $pageNavigation->getLimit(),
285 'runtime' => $runtime,
286 'count_total' => $__calculateTotalCount,
287 ]
288 );
289 $orders = $iterator->fetchAll();
290 $totalCount = $__calculateTotalCount ? $iterator->getCount() : 0;
291
292 return new Page('ORDERS', $orders, $totalCount);
293 }
294
295 public function deleteAction(\Bitrix\Sale\Order $order)
296 {
297 $r = $order->delete($order->getId());
298 if($r->isSuccess())
299 $r = $order->save();
300
301 if(!$r->isSuccess())
302 {
303 $this->addErrors($r->getErrors());
304 return null;
305 }
306
307 if ($r->hasWarnings())
308 {
309 $this->addErrors($r->getWarnings());
310 return null;
311 }
312
313 return true;
314 }
315
317 {
318 return ['DELIVERY_ID_LIST'=>$order->getDeliveryIdList()];
319 }
320
321 public function getPaymentsAction(\Bitrix\Sale\Order $order)
322 {
323 return ['PAYMENTS'=>$this->toArray($order)['ORDER']['PAYMENTS']];
324 }
325
327 {
328 return ['PAY_SYSTEM_ID_LIST'=>$order->getPaySystemIdList()];
329 }
330
331 public function getPrintedChecksAction(\Bitrix\Sale\Order $order)
332 {
333 return ['PRINTED_CHECKS'=>$order->getPrintedChecks()];
334 }
335
336 public function getShipmentsAction(\Bitrix\Sale\Order $order)
337 {
338 return ['SHIPMENTS'=>$this->toArray($order)['ORDER']['SHIPMENTS']];
339 }
340
341 public function getBasketAction(\Bitrix\Sale\Order $order)
342 {
343 return ['BASKET_ITEMS'=>$this->toArray($order)['ORDER']['BASKET_ITEMS']];
344 }
345
346 public function getCurrencyAction(\Bitrix\Sale\Order $order)
347 {
348 return $order->getField('CURRENCY');
349 }
350
351 public function getDateInsertAction(\Bitrix\Sale\Order $order)
352 {
353 return $order->getField('DATE_INSERT');
354 }
355
356 public function getApplyDiscountAction(\Bitrix\Sale\Order $order)
357 {
358 //TODO: return $order->getDiscount()->toArray();
359 return $this->toArray($order)['DISCOUNTS'];
360 }
361
362 public function getPersonTypeIdAction(\Bitrix\Sale\Order $order)
363 {
364 return $order->getPersonTypeId();
365 }
366
367 public function getPriceAction(\Bitrix\Sale\Order $order)
368 {
369 return $order->getPrice();
370 }
371
373 {
374 return ['PROPERTY_VALUES'=>$this->toArray($order)['ORDER']['PROPERTY_VALUES']];
375 }
376
377 public function getSiteIdAction(\Bitrix\Sale\Order $order)
378 {
379 return $order->getSiteId();
380 }
381
382 public function getSumPaidAction(\Bitrix\Sale\Order $order)
383 {
384 return $order->getSumPaid();
385 }
386/*
387 public function getTaxListAction(\Bitrix\Sale\Order $order)
388 {
389 //TODO: return $order->getTax()->toArray();
390 return $this->toArray($order)['TAX'];
391 }
392
393 public function getTaxLocationAction(\Bitrix\Sale\Order $order)
394 {
395 return $order->getTaxLocation();
396 }
397*/
398 public function getTaxPriceAction(\Bitrix\Sale\Order $order)
399 {
400 return $order->getTaxPrice();
401 }
402
403 public function getTaxValueAction(\Bitrix\Sale\Order $order)
404 {
405 return $order->getTaxValue();
406 }
407
408 public function getUserIdAction(\Bitrix\Sale\Order $order)
409 {
410 return $order->getUserId();
411 }
412
413 public function getVatRateAction(\Bitrix\Sale\Order $order)
414 {
415 return $order->getVatRate();
416 }
417
418 public function getVatSumAction(\Bitrix\Sale\Order $order)
419 {
420 return $order->getVatSum();
421 }
422
423 public function isCanceledAction(\Bitrix\Sale\Order $order)
424 {
425 return $order->isCanceled()?'Y':'N';
426 }
427
428 public function isExternalAction(\Bitrix\Sale\Order $order)
429 {
430 return $order->isExternal()?'Y':'N';
431 }
432
433 public function isMarkedAction(\Bitrix\Sale\Order $order)
434 {
435 return $order->isMarked()?'Y':'N';
436 }
437
438 public function isPaidAction(\Bitrix\Sale\Order $order)
439 {
440 return $order->isPaid()?'Y':'N';
441 }
442
443 public function isShippedAction(\Bitrix\Sale\Order $order)
444 {
445 return $order->isShipped()?'Y':'N';
446 }
447
448 public function isUsedVatAction(\Bitrix\Sale\Order $order)
449 {
450 return $order->isUsedVat()?'Y':'N';
451 }
452
453 //public function applyDiscountAction(\Bitrix\Sale\Order $order, array $data)
454 //public function refreshAction(\Bitrix\Sale\Order $order, array $data)
455
456 //endregion
457
458 //region admin Actions
459 //public function cancelOrderAction(\Bitrix\Sale\Order $order, array $data)
460 //public function saveCommentsAction(\Bitrix\Sale\Order $order, array $data)
461 //public function saveStatusAction(\Bitrix\Sale\Order $order, array $data)
462 //public function changeResponsibleUserAction(\Bitrix\Sale\Order $order, array $data)
463 //public function updatePaymentStatusAction()
464 //public function updateShipmentStatusAction()
465 //public function changeDeliveryServiceAction()
466 //public function checkProductBarcodeAction()
467 //public function deleteCouponAction(\Bitrix\Sale\Order $order, array $data)
468 //public function addCouponsAction(\Bitrix\Sale\Order $order, array $data)
469 //public function getProductIdByBarcodeAction()
470 //public function refreshOrderDataAction(\Bitrix\Sale\Order $order, array $data)
471 //endregion
472
473 protected function modify(array $fields)
474 {
475 $r = new Result();
476
477 $builder = $this->getBuilder();
478 try
479 {
480 $builder->build($fields);
481 $errorsContainer = $builder->getErrorsContainer();
482 }
483 catch(BuildingException)
484 {
485 if($builder->getErrorsContainer()->getErrorCollection()->count()<=0)
486 {
487 $builder->getErrorsContainer()->addError(new Error('unknow error', 200550000001));
488 }
489 $errorsContainer = $builder->getErrorsContainer();
490 }
491
492 if($errorsContainer->getErrorCollection()->count()>0)
493 $r->addErrors($errorsContainer->getErrors());
494 else
495 $r->setData(['ORDER'=>$builder->getOrder()]);
496
497 return $r;
498 }
499
500 protected function add(array $fields)
501 {
502 $r = new Result();
503
504 $fields = ['ORDER'=>$fields];
505
506 if (isset($fields['ORDER']['ID']))
507 {
508 unset($fields['ORDER']['ID']);
509 }
510
511 $orderBuilder = $this->getBuilder();
512 $order = $orderBuilder->buildEntityOrder($fields);
513
514 if($orderBuilder->getErrorsContainer()->getErrorCollection()->count()>0)
515 $r->addErrors($orderBuilder->getErrorsContainer()->getErrors());
516 else
517 $r->setData(['ORDER'=>$order]);
518
519 return $r;
520 }
521
522 protected function update(\Bitrix\Sale\Order $order, array $fields)
523 {
524 $r = new Result();
525 $data=[];
526
527 $data['ORDER'] = $fields;
528 $data['ORDER']['ID'] = $order->getId();
529 $data['ORDER']['PERSON_TYPE_ID'] = $order->getPersonTypeId();
530
531 $orderBuilder = $this->getBuilder();
532 $order = $orderBuilder->buildEntityOrder($data);
533
534 if($orderBuilder->getErrorsContainer()->getErrorCollection()->count()>0)
535 $r->addErrors($orderBuilder->getErrorsContainer()->getErrors());
536 else
537 $r->setData(['ORDER'=>$order]);
538
539 return $r;
540 }
541
542 protected function get(\Bitrix\Sale\Order $order, array $fields=[])
543 {
544 return $this->toArray($order, $fields);
545 }
546
547 static public function prepareFields(array $fields)
548 {
549 $fields = isset($fields['ORDER'])? $fields['ORDER']:[];
550
551 if(isset($fields['BASKET_ITEMS']))
552 unset($fields['BASKET_ITEMS']);
553 if(isset($fields['PROPERTY_VALUES']))
554 unset($fields['PROPERTY_VALUES']);
555 if(isset($fields['PAYMENTS']))
556 unset($fields['PAYMENTS']);
557 if(isset($fields['SHIPMENTS']))
558 unset($fields['SHIPMENTS']);
559 if(isset($fields['TRADE_BINDINGS']))
560 unset($fields['TRADE_BINDINGS']);
561 if(isset($fields['CLIENTS']))
562 unset($fields['CLIENTS']);
563 if(isset($fields['REQUISITE_LINKS']))
564 unset($fields['REQUISITE_LINKS']);
565
566 return $fields;
567 }
568
569 private static function setFlagActionImport()
570 {
571 //TODO: huck для блокировки исходящего события в \Bitrix\Sale\Rest\RestManager::processEvent(). Блокируется действием - import т.к. запрос входящий
573 $instance->setAction(\Bitrix\Sale\Rest\Synchronization\Manager::ACTION_IMPORT);
574 }
575
576 public function importDeleteAction(\Bitrix\Sale\Order $order)
577 {
578 self::setFlagActionImport();
579
580 return $this->deleteAction($order);
581 }
582
583 public function resolveExternalIdToInternalId(array $fields)
584 {
585 LoggerDiag::addMessage('ORDER_RESOLVE_EXTERNAL_ID_TO_INTERNAL_ID_SOURCE_FIELDS', var_export($fields, true));
586
587 $result = new Result();
588
590
591 $ixInternal = [];
592 $ixExternal = [];
593 $internalOrderId = -1;
594
595 $externalId = $fields['ORDER']['XML_ID'];
596 $ixExternal['ORDER']['MAP'][$externalId] = $fields['ORDER']['ID'];
597
598 unset($fields['ORDER']['ID']);
599 $internalId = $this->getInternalId($fields['ORDER']['XML_ID'], Registry::ENTITY_ORDER);
600 if(intval($internalId)>0)
601 {
602 $fields['ORDER']['ID'] = $internalId;
603 $ixInternal['ORDER']['MAP'][$externalId] = $internalId;
604 $internalOrderId = $fields['ORDER']['ID'];
605 }
606
607 $internalOrderStatusId = $this->getInternalId($fields['ORDER']['STATUS_XML_ID'], Registry::ENTITY_ORDER_STATUS);
608 $fields['ORDER']['STATUS_ID' ] = $internalOrderStatusId<>''? $internalOrderStatusId:$instance->getDefaultOrderStatusId();
609
610 // значения определются только для нового заказа.
611 // в отличии от реста магазина в рамках реста импорта изменение значений полей заказа - сайта, типа плательщика или пользователя не производится
612 if(intval($internalId)<=0)
613 {
614 //TODO: предусмотреть связь с внешней системой
615 $internalPersonTypeId = $this->getInternalId($fields['ORDER']['PERSON_TYPE_XML_ID'], 'PERSON_TYPE_TYPE');
616 $fields['ORDER']['PERSON_TYPE_ID'] = $internalPersonTypeId>0 ? $internalPersonTypeId:$instance->getDefaultPersonTypeId();
617 $fields['ORDER']['USER_ID'] = \CSaleUser::GetAnonymousUserID();
618 $fields['ORDER']['SITE_ID'] = $instance->getDefaultSiteId();
619 }
620 else
621 {
623
625 $orderClass = $registry->getOrderClassName();
626
627 $order = $orderClass::load($internalId);
628 $fields['ORDER']['PERSON_TYPE_ID'] = $order->getPersonTypeId();
629 $fields['ORDER']['USER_ID'] = $order->getUserId();
630 $fields['ORDER']['SITE_ID'] = $order->getSiteId();
631 }
632
633 if(is_array($fields['ORDER']['PROPERTY_VALUES']))
634 {
635 foreach($fields['ORDER']['PROPERTY_VALUES'] as $k=>&$item)
636 {
637 $internalIdExternalSystem = $item['ORDER_PROPS_ID'];
638 $externalId = $item['ORDER_PROPS_XML_ID'];
639
640 unset($item['ORDER_PROPS_ID']);
641 unset($item['ORDER_PROPS_XML_ID']);
642 unset($item['ID']);//id не передается т.к. запись значения свойства идентифицируется только по orderPropsId
643
644 if($externalId<>'')
645 {
646 $ixExternal['PROPERTIES'][$k]['MAP'][$externalId] = $internalIdExternalSystem;
647
648 $internalId = $this->getInternalId($externalId, Registry::ENTITY_PROPERTY);
649 if(intval($internalId)>0)
650 {
651 $item['ORDER_PROPS_ID'] = $internalId;
652 $ixInternal['PROPERTIES'][$k]['MAP'][$externalId] = $internalId;
653 }
654 }
655 else
656 {
657 unset($item);
658 }
659 }
660 }
661
662 if(is_array($fields['ORDER']['BASKET_ITEMS']))
663 {
664 $n = 1;
665 foreach($fields['ORDER']['BASKET_ITEMS'] as $k=>&$item)
666 {
667 $internalIdExternalSystem = $item['ID'];
668 $externalId = $item['XML_ID'];
669
670 $internalId = $this->getInternalId($externalId, Registry::ENTITY_BASKET, ['ORDER_ID'=>$internalOrderId]);
671 $internalBasketItemId = (intval($internalId)>0)? $internalId:-1;
672 $ixInternal['BASKET_ITEMS'][$k]['MAP'][$externalId] = (intval($internalId)>0)? $internalId:'n'.$n++;
673 $ixExternal['BASKET_ITEMS'][$k]['MAP'][$externalId] = $internalIdExternalSystem;
674
675 $properties = $item['PROPERTIES'];
676 if(count($properties)>0)
677 {
678 foreach ($properties as $kp=>&$property)
679 {
680 $property['BASKET_ID'] = $ixInternal['BASKET_ITEMS'][$k]['MAP'][$externalId];
681 $internalIdBasketProps = $this->getInternalId($property['XML_ID'], Registry::ENTITY_BASKET_PROPERTIES_COLLECTION, ['BASKET_ID'=>$internalBasketItemId]);
682 if(intval($internalIdBasketProps)>0)
683 {
684 $ixInternal['BASKET_ITEMS'][$k]['PROPERTIES'][$kp][$property['XML_ID']] = $internalIdBasketProps;
685 $property['ID'] = $internalIdBasketProps;
686 }
687 $ixExternal['BASKET_ITEMS'][$k]['PROPERTIES'][$kp]['MAP'][$property['XML_ID']] = $property['ID'];
688 }
689 }
690
691
692 $item = array_merge(
693 ['PROPERTIES'=>$properties],
694 $this->prepareFieldsBasketItem($item)
695 );
696
697 $item['ID'] = $ixInternal['BASKET_ITEMS'][$k]['MAP'][$externalId];
698 }
699 }
700
701 if(is_array($fields['ORDER']['PAYMENTS']))
702 {
703 foreach($fields['ORDER']['PAYMENTS'] as $k=>&$item)
704 {
705 $externalId = $item['XML_ID'];
706 $ixExternal['PAYMENTS'][$k]['MAP'][$externalId] = $item['ID'];
707
708 unset($item['ID']);
709 $internalId = $this->getInternalId($externalId, Registry::ENTITY_PAYMENT_COLLECTION, ['ORDER_ID'=>$internalOrderId]);
710 if(intval($internalId)>0)
711 {
712 $item['ID'] = $internalId;
713 $ixInternal['PAYMENTS'][$k]['MAP'][$externalId] = $internalId;
714 }
715
716 $externalPaySystemId = $item['PAY_SYSTEM_XML_ID'];
717 $ixExternal['PAYMENTS'][$k]['PAY_SYSTEMS']['MAP'][$externalPaySystemId] = $item['PAY_SYSTEM_ID'];
718
719 unset($item['PAY_SYSTEM_XML_ID']);
720 $internalPaySystemId = $this->getInternalId($externalPaySystemId, 'PAY_SYSTEM_TYPE');
721 $item['PAY_SYSTEM_ID'] = $internalPaySystemId>0 ? $internalPaySystemId:$instance->getDefaultPaySystemId();
722 $ixInternal['PAYMENTS'][$k]['PAY_SYSTEM']['MAP'][$externalPaySystemId] = $item['PAY_SYSTEM_ID'];
723 }
724 }
725
726 if(is_array($fields['ORDER']['SHIPMENTS']))
727 {
728 foreach($fields['ORDER']['SHIPMENTS'] as $k=>&$item)
729 {
730 $externalId = $item['XML_ID'];
731 $ixExternal['SHIPMENTS'][$k]['MAP'][$externalId] = $item['ID'];
732
733 unset($item['ID']);
734 $internalId = $this->getInternalId($item['XML_ID'], Registry::ENTITY_SHIPMENT_COLLECTION, ['ORDER_ID'=>$internalOrderId]);
735 $internalShipmentId = (intval($internalId)>0)? $internalId:-1;
736 if(intval($internalId)>0)
737 {
738 $item['ID'] = $internalId;
739 $ixInternal['SHIPMENTS'][$k][$externalId] = $internalId;
740 }
741
742 $externalDeliveryId = $item['DELIVERY_XML_ID'];
743 $ixExternal['SHIPMENTS'][$k]['DELIVERY_SYSTEM']['MAP'][$externalDeliveryId] = $item['DELIVERY_ID'];
744
745 unset($item['DELIVERY_XML_ID']);
746 $internalDeliveryId = $this->getInternalId($externalDeliveryId, 'DELIVERY_SYSTEM_TYPE');
747 $item['DELIVERY_ID'] = $internalDeliveryId>0 ? $internalDeliveryId:$instance->getDefaultDeliverySystemId();
748 $ixInternal['SHIPMENTS'][$k]['DELIVERY_SYSTEM']['MAP'][$externalDeliveryId] = $item['DELIVERY_ID'];
749
750 $externalDeliveryStatusId = $item['STATUS_XML_ID'];
751 $ixExternal['SHIPMENTS'][$k]['DELIVERY_STATUS']['MAP'][$externalDeliveryStatusId] = $item['STATUS_ID'];
752
753 unset($item['STATUS_XML_ID']);
754 $internalDeliveryStatusId = $this->getInternalId($externalDeliveryStatusId, Registry::ENTITY_DELIVERY_STATUS);
755 $item['STATUS_ID'] = $internalDeliveryStatusId<>''? $internalDeliveryStatusId:$instance->getDefaultDeliveryStatusId();
756 $ixInternal['SHIPMENTS'][$k]['DELIVERY_STATUS']['MAP'][$externalDeliveryStatusId] = $item['STATUS_ID'];
757
758 foreach($item['SHIPMENT_ITEMS'] as $kb=>&$shipmentItem)
759 {
760 unset($shipmentItem['ID']);
761 unset($shipmentItem['ORDER_DELIVERY_ID']);
762 $internalIdShipmentItem = $this->getInternalId($shipmentItem['XML_ID'], Registry::ENTITY_SHIPMENT_ITEM_COLLECTION, ['ORDER_DELIVERY_ID'=>$internalShipmentId]);
763
764 if(intval($internalIdShipmentItem)>0)
765 {
766 $shipmentItem['ID'] = $internalIdShipmentItem;
767 if(intval($internalId)>0)
768 $shipmentItem['ORDER_DELIVERY_ID'] = $internalId;
769
770 $ixInternal['SHIPMENTS'][$k]['SHIPMENT_ITEMS'][$kb]['MAP'][$externalId] = $internalIdShipmentItem;
771 }
772
773 // получим из внешнего соответствие xmlId => id.внешней системы, внешний идентификатор по внутреннему id внейшней системы
774 $external = '';
775 foreach ($ixExternal['BASKET_ITEMS'] as $map)
776 {
777 $internal = current($map['MAP']);
778
779 if($shipmentItem['BASKET_ID'] == $internal)
780 {
781 $external = key($map['MAP']);
782 break;
783 }
784 }
785
786 if($external=='')
787 $result->addError(new Error('Modify fields error. ShipmentItem xmlId is invalid',200550000002));
788
789 if($external<>'')
790 {
791 // получим реальный id корзины из внутренниго соответсвия xmlId => id.внутрений сиситемы
792 foreach ($ixInternal['BASKET_ITEMS'] as $map)
793 {
794 if(isset($map['MAP'][$external]))
795 {
796 $shipmentItem['BASKET_ID'] = $map['MAP'][$external];
797 break;
798 }
799 }
800 }
801 }
802
803 $item = $this->prepareFieldsShipment($item);
804 }
805 }
806
807 if($this->isCrmModuleInstalled())
808 {
809 if(is_array($fields['ORDER']['TRADE_BINDINGS']))
810 {
811 foreach($fields['ORDER']['TRADE_BINDINGS'] as $k=>&$item)
812 {
813 $externalId = $item['XML_ID'];
814 $ixExternal['TRADE_BINDINGS'][$k]['MAP'][$externalId] = $item['ID'];
815
816 unset($item['ID']);
817 if($externalId<>'') // условие для БУС. xmlId из БУС не передается
818 {
819 $internalId = $this->getInternalId($externalId, Registry::ENTITY_TRADE_BINDING_COLLECTION, ['ORDER_ID'=>$internalOrderId]);
820 if(intval($internalId)>0)
821 {
822 $item['ID'] = $internalId;
823 $ixInternal['TRADE_BINDINGS'][$k]['MAP'][$externalId] = $internalId;
824 }
825 }
826
827 $externalTradePlatformId = $item['TRADING_PLATFORM_XML_ID'];
828 $ixExternal['TRADE_BINDINGS'][$k]['TRADING_PLATFORMS']['MAP'][$externalTradePlatformId] = $item['TRADING_PLATFORM_ID'];
829
830 unset($item['TRADING_PLATFORM_XML_ID']);
831 $internalTradePlatformId = $this->getInternalId($externalTradePlatformId, 'TRADING_PLATFORM_TYPE');
832 //TODO: need default value <> 0
833 $item['TRADING_PLATFORM_ID'] = $internalTradePlatformId>0 ? $internalTradePlatformId:0;
834 $ixInternal['TRADE_BINDINGS'][$k]['TRADING_PLATFORM']['MAP'][$externalTradePlatformId] = $item['TRADING_PLATFORM_ID'];
835 }
836 }
837
838 if(is_array($fields['ORDER']['CLIENTS']))
839 {
840 foreach($fields['ORDER']['CLIENTS'] as $k=>&$item)
841 {
842 $externalId = $item['XML_ID'];
843 $ixExternal['CLIENTS'][$k]['MAP'][$externalId] = $item['ID'];
844
845 unset($item['ID']);
846 $internalId = $this->getInternalId($externalId, ENTITY_CRM_CONTACT_COMPANY_COLLECTION);
847 if(intval($internalId)>0)
848 {
849 $item['ID'] = $internalId;
850 $ixInternal['CLIENTS'][$k]['MAP'][$externalId] = $internalId;
851 }
852 }
853 }
854 }
855 else
856 {
857 // оставляем ключ TRADE_BINDINGS чтобы на строне БУС не удалить реальные привязки источников к заказам.
858 // источники в рамках обмена не поддерживаются. Их подменяет настройка сайт со стороны БУС и источник на строне Б24
859 $fields['ORDER']['TRADE_BINDINGS'] = [];
860 unset($fields['ORDER']['CLIENTS']);
861 }
862
863 if($result->isSuccess())
864 {
865 $result->setData(['DATA'=>$fields]);
866 LoggerDiag::addMessage('ORDER_RESOLVE_EXTERNAL_ID_TO_INTERNAL_ID_SUCCESS', var_export($fields, true));
867 }
868 else
869 {
870 LoggerDiag::addMessage('ORDER_RESOLVE_EXTERNAL_ID_TO_INTERNAL_ID_ERROR');
871 }
872
873 return $result;
874 }
875
876 protected function getInternalId($externalId, $typeName, $params=[])
877 {
878 $loader = Factory::create($typeName, $params);
879 return $loader->getFieldsByExternalId($externalId);
880 }
881
882 private function prepareFieldsBasketItem($fields)
883 {
885 $loader = Factory::create('PRODUCT');
886
887 $code = $loader->getCodeAfterDelimiter($fields['PRODUCT_XML_ID']);
888 $product = $code<>'' ? $loader->getFieldsByExternalId($code):array();
889 if(empty($product))
890 $product = $loader->getFieldsByExternalId($fields['PRODUCT_XML_ID']);
891
892 if(!empty($product))
893 {
894 $result = array(
895 "PRODUCT_ID" => $product["ID"],
896 "NAME" => $product["NAME"],
897 "MODULE" => "catalog",
898 "PRODUCT_PROVIDER_CLASS" => "CCatalogProductProvider",
899 "CATALOG_XML_ID" => $product["IBLOCK_XML_ID"],
900 "DETAIL_PAGE_URL" => $product["DETAIL_PAGE_URL"],
901 "WEIGHT" => $product["WEIGHT"],
902 "NOTES" => $product["CATALOG_GROUP_NAME"]
903 );
904 }
905 else
906 {
907 $ri = new RandomSequence($fields['PRODUCT_XML_ID']);
908 $result = array(
909 "PRODUCT_ID" => $ri->rand(1000000, 9999999),
910 "NAME" => $fields["NAME"],
911 "MODULE" => null,
912 "PRODUCT_PROVIDER_CLASS" => null,
913 "CATALOG_XML_ID" => null,
914 "MEASURE_CODE" => $fields["MEASURE_CODE"],
915 "MEASURE_NAME" => $fields["MEASURE_NAME"],
916 //"DISCOUNT_PRICE" => $item['DISCOUNT']['PRICE'],
917 );
918 }
919
920 $result["LID"] = $instance->getDefaultSiteId();
921 $result["QUANTITY"] = $fields["QUANTITY"];
922 $result["CURRENCY"] = $fields["CURRENCY"];
923 $result["DELAY"] = "N";
924 $result["CAN_BUY"] = "Y";
925 $result["IGNORE_CALLBACK_FUNC"] = "Y";
926 $result["PRODUCT_XML_ID"] = $fields["PRODUCT_XML_ID"];
927 $result["XML_ID"] = $fields["XML_ID"];
928
929 $result["PRICE"] = $fields["PRICE"];
930
931 $result["VAT_RATE"] = $fields["VAT_RATE"];
932 $result["VAT_INCLUDED"] = $fields["VAT_INCLUDED"];
933
934 return $result;
935 }
936
937 private function prepareFieldsShipment($item)
938 {
939 // т.к. сопоставление служб доставок через xml подразумевает передачу суммы от БУС в Б24 (а не расчет)
940 // принудительно указываем что цена кастомная
941 $item['CUSTOM_PRICE_DELIVERY'] = 'Y';
942
943 return $item;
944 }
945
946 public function importAction(array $fields)
947 {
948 $result = new Result();
949
950 self::setFlagActionImport();
951
953
954 LoggerDiag::addMessage('ORDER_IMPORT_ACTION_WITH_RESOLVE_EXTERNAL_ID_TO_INTERNAL_ID', var_export($fields, true));
955
956 $r = $this->resolveExternalIdToInternalId($fields);
957
958 if($r->isSuccess())
959 {
960 $result = $this->modifyAction($r->getData()['DATA']);
961 }
962 else
963 {
964 $this->addErrors($r->getErrors());
965 }
966
967 if(count($this->getErrors())>0)
968 {
969 LoggerDiag::addMessage('ORDER_IMPORT_ACTION_WITH_RESOLVE_EXTERNAL_ID_TO_INTERNAL_ID_ERROR', var_export($this->getErrors(), true));
970 return null;
971 }
972 else
973 {
974 LoggerDiag::addMessage('ORDER_IMPORT_ACTION_WITH_RESOLVE_EXTERNAL_ID_TO_INTERNAL_ID_SUCCESS');
975 return $result;
976 }
977 }
978
980 {
981 $orderFields = [
982 'USER_ID',
983 'CURRENCY',
984 'LID',
985 'PERSON_TYPE_XML_ID',
986 'STATUS_XML_ID',
987 'CANCELED',
988 'REASON_CANCELED',
989 'COMMENTS',
990 'XML_ID',
991 'ID',
992 ];
993
994 $orderPropertyValuesFields = [
995 'NAME',
996 'CODE',
997 'ORDER_PROPS_XML_ID',
998 'VALUE',
999 'ORDER_PROPS_ID'
1000 ];
1001
1002 $basketItemFields = [
1003 'PRODUCT_XML_ID',
1004 'NAME',
1005 'MEASURE_CODE',
1006 'MEASURE_NAME',
1007 'QUANTITY',
1008 'CURRENCY',
1009 'XML_ID',
1010 'ID',
1011 'PRICE',
1012 'VAT_RATE',
1013 'VAT_INCLUDED',
1014 ];
1015
1016 $basketItemPropertiesFields = [
1017 'NAME',
1018 'VALUE',
1019 'CODE',
1020 'XML_ID'
1021 ];
1022
1023 $paymentFields = [
1024 'PAY_SYSTEM_XML_ID',
1025 'PAY_SYSTEM_ID',
1026 'PAID',
1027 'PAY_VOUCHER_NUM',
1028 'PAY_VOUCHER_DATE',
1029 'XML_ID',
1030 'ID',
1031 'SUM',
1032 'IS_RETURN',
1033 'PAY_RETURN_NUM',
1034 'PAY_RETURN_DATE',
1035 'PAY_RETURN_COMMENT',
1036 'COMMENTS',
1037 ];
1038
1039 $shipmentFields = [
1040 'BASE_PRICE_DELIVERY',
1041 'PRICE_DELIVERY',
1042 'ALLOW_DELIVERY',
1043 'DEDUCTED',
1044 'REASON_UNDO_DEDUCTED',
1045 'DELIVERY_DOC_NUM',
1046 'DELIVERY_DOC_DATE',
1047 'TRACKING_NUMBER',
1048 'XML_ID',
1049 'ID',
1050 'CANCELED',
1051 'COMMENTS',
1052 'STATUS_XML_ID',
1053 'STATUS_ID',
1054 'DELIVERY_XML_ID',
1055 'DELIVERY_ID',
1056 ];
1057
1058 $shipmentItemsFields = [
1059 'BASKET_ID',
1060 'QUANTITY',
1061 'XML_ID',
1062 ];
1063
1064 $result['ORDER'] = array_intersect_key($fields['ORDER'], array_flip($orderFields));
1065
1066 if(isset($fields['ORDER']['PROPERTY_VALUES']))
1067 {
1068 foreach($fields['ORDER']['PROPERTY_VALUES'] as $k=>$v)
1069 $result['ORDER']['PROPERTY_VALUES'][$k] = array_intersect_key($v, array_flip($orderPropertyValuesFields));
1070 }
1071
1072 if(isset($fields['ORDER']['BASKET_ITEMS']))
1073 {
1074 foreach($fields['ORDER']['BASKET_ITEMS'] as $k=>$item)
1075 {
1076 $result['ORDER']['BASKET_ITEMS'][$k] = array_intersect_key($item, array_flip($basketItemFields));
1077
1078 if(isset($item['PROPERTIES']))
1079 {
1080 foreach($item['PROPERTIES'] as $kProps=>$pros)
1081 {
1082 $result['ORDER']['BASKET_ITEMS'][$k]['PROPERTIES'][$kProps] = array_intersect_key($pros, array_flip($basketItemPropertiesFields));
1083 }
1084 }
1085 }
1086 }
1087
1088 if(isset($fields['ORDER']['PAYMENTS']))
1089 {
1090 foreach($fields['ORDER']['PAYMENTS'] as $k=>$payment)
1091 {
1092 $result['ORDER']['PAYMENTS'][$k] = array_intersect_key($payment, array_flip($paymentFields));
1093 }
1094 }
1095
1096 if(isset($fields['ORDER']['SHIPMENTS']))
1097 {
1098 foreach($fields['ORDER']['SHIPMENTS'] as $k=>$shipment)
1099 {
1100 $result['ORDER']['SHIPMENTS'][$k] = array_intersect_key($shipment, array_flip($shipmentFields));
1101
1102 if(isset($shipment['SHIPMENT_ITEMS']))
1103 {
1104 foreach($shipment['SHIPMENT_ITEMS'] as $kShipmentItem=>$shipmentItem)
1105 {
1106 $result['ORDER']['SHIPMENTS'][$k]['SHIPMENT_ITEMS'][$kShipmentItem] = array_intersect_key($shipmentItem, array_flip($shipmentItemsFields));
1107 }
1108 }
1109 }
1110 }
1111
1112 return $result;
1113 }
1114
1115 protected function checkPermissionEntity($name)
1116 {
1117 if($name == 'getdeliveryidlist'
1118 || $name == 'getpayments'
1119 || $name == 'getpaysystemidlist'
1120 || $name == 'getprintedchecks'
1121 || $name == 'getshipments'
1122 || $name == 'getbasket'
1123 || $name == 'getcurrency'
1124 || $name == 'getdateinsert'
1125 || $name == 'getdeliverylocation'
1126 || $name == 'getapplydiscount'
1127 || $name == 'getpersontypeid'
1128 || $name == 'getprice'
1129 || $name == 'getpropertyvalues'
1130 || $name == 'getsiteid'
1131 || $name == 'getsumpaid'
1132 || $name == 'gettaxlist'
1133 || $name == 'gettaxlocation'
1134 || $name == 'gettaxprice'
1135 || $name == 'gettaxvalue'
1136 || $name == 'getuserid'
1137 || $name == 'getvatrate'
1138 || $name == 'getvatsum'
1139 || $name == 'iscanceled'
1140 || $name == 'isexternal'
1141 || $name == 'ismarked'
1142 || $name == 'ispaid'
1143 || $name == 'isshipped'
1144 || $name == 'isusedvat'
1145 )
1146 {
1147 $r = $this->checkReadPermissionEntity();
1148 }
1149 elseif($name == 'import'
1150 || $name == 'importdelete'
1151 )
1152 {
1153 $r = $this->checkModifyPermissionEntity();
1154 }
1155 else
1156 {
1157 $r = parent::checkPermissionEntity($name);
1158 }
1159 return $r;
1160 }
1161}
addError(Error $error)
Определения controller.php:1070
addErrors(array $errors)
Определения controller.php:1083
getPrimaryAutoWiredParameter()
Определения controller.php:334
Определения error.php:15
getCurrencyAction(\Bitrix\Sale\Order $order)
Определения order.php:346
getSumPaidAction(\Bitrix\Sale\Order $order)
Определения order.php:382
getPrintedChecksAction(\Bitrix\Sale\Order $order)
Определения order.php:331
getPaySystemIdListAction(\Bitrix\Sale\Order $order)
Определения order.php:326
isUsedVatAction(\Bitrix\Sale\Order $order)
Определения order.php:448
getTaxPriceAction(\Bitrix\Sale\Order $order)
Определения order.php:398
prepareFieldsImport($fields)
Определения order.php:979
getAction(\Bitrix\Sale\Order $order)
Определения order.php:61
tryAddAction(array $fields)
Определения order.php:163
importDeleteAction(\Bitrix\Sale\Order $order)
Определения order.php:576
isMarkedAction(\Bitrix\Sale\Order $order)
Определения order.php:433
isCanceledAction(\Bitrix\Sale\Order $order)
Определения order.php:423
getApplyDiscountAction(\Bitrix\Sale\Order $order)
Определения order.php:356
getVatRateAction(\Bitrix\Sale\Order $order)
Определения order.php:413
update(\Bitrix\Sale\Order $order, array $fields)
Определения order.php:522
getPropertyValuesAction(\Bitrix\Sale\Order $order)
Определения order.php:372
getTaxValueAction(\Bitrix\Sale\Order $order)
Определения order.php:403
checkPermissionEntity($name)
Определения order.php:1115
getPriceAction(\Bitrix\Sale\Order $order)
Определения order.php:367
getDateInsertAction(\Bitrix\Sale\Order $order)
Определения order.php:351
getPersonTypeIdAction(\Bitrix\Sale\Order $order)
Определения order.php:362
getSiteIdAction(\Bitrix\Sale\Order $order)
Определения order.php:377
isPaidAction(\Bitrix\Sale\Order $order)
Определения order.php:438
importAction(array $fields)
Определения order.php:946
static prepareFields(array $fields)
Определения order.php:547
getFieldsAction()
Определения order.php:53
add(array $fields)
Определения order.php:500
isExternalAction(\Bitrix\Sale\Order $order)
Определения order.php:428
tryUpdateAction(\Bitrix\Sale\Order $order, array $fields)
Определения order.php:207
getPaymentsAction(\Bitrix\Sale\Order $order)
Определения order.php:321
getBasketAction(\Bitrix\Sale\Order $order)
Определения order.php:341
getShipmentsAction(\Bitrix\Sale\Order $order)
Определения order.php:336
isShippedAction(\Bitrix\Sale\Order $order)
Определения order.php:443
getDeliveryIdListAction(\Bitrix\Sale\Order $order)
Определения order.php:316
modify(array $fields)
Определения order.php:473
getUserIdAction(\Bitrix\Sale\Order $order)
Определения order.php:408
deleteAction(\Bitrix\Sale\Order $order)
Определения order.php:295
getInternalId($externalId, $typeName, $params=[])
Определения order.php:876
getVatSumAction(\Bitrix\Sale\Order $order)
Определения order.php:418
const ENTITY_BASKET_PROPERTIES_COLLECTION
Определения registry.php:33
const ENTITY_SHIPMENT_COLLECTION
Определения registry.php:26
const ENTITY_BASKET
Определения registry.php:30
const ENTITY_PROPERTY
Определения registry.php:52
const ENTITY_TRADE_BINDING_COLLECTION
Определения registry.php:55
const ENTITY_PAYMENT_COLLECTION
Определения registry.php:22
static getInstance($type)
Определения registry.php:183
const ENTITY_ORDER
Определения registry.php:20
const ENTITY_SHIPMENT_ITEM_COLLECTION
Определения registry.php:38
const REGISTRY_TYPE_ORDER
Определения registry.php:16
const ENTITY_ORDER_STATUS
Определения registry.php:48
const ENTITY_DELIVERY_STATUS
Определения registry.php:49
static create($typeName, $params=[])
Определения factory.php:12
static GetAnonymousUserID()
Определения basket.php:3562
$data['IS_AVAILABLE']
Определения .description.php:13
</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
$entity
$select
Определения iblock_catalog_list.php:194
$filter
Определения iblock_catalog_list.php:54
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
Определения options.php:195
$name
Определения menu_edit.php:35
$map
Определения config.php:5
listAction(PageNavigation $pageNavigation, array $select=[], array $filter=[], array $order=[], bool $__calculateTotalCount=true)
Определения listaction.php:29
toArray(bool $recursive=false)
Определения ActiveRecordImplementation.php:562
Определения handlers.php:8
getErrors()
Определения errorableimplementation.php:34
trait Error
Определения error.php:11
$payment
Определения payment.php:14
$order
Определения payment.php:8
$service
Определения payment.php:18
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$instance
Определения ps_b24_final.php:14
</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($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
$totalCount
Определения subscription_card_product.php:51
$k
Определения template_pdf.php:567
$n
Определения update_log.php:107
$iterator
Определения yandex_run.php:610
$fields
Определения yandex_run.php:501