27 function($className, $id)
35 $orderClass = $registry->getOrderClassName();
38 $order = $orderClass::load($id);
45 $this->
addError(
new Error(
'order is not exists', 200540400001));
55 $entity = new \Bitrix\Sale\Rest\Entity\Order();
56 return [
'ORDER'=>
$entity->prepareFieldInfos(
64 return $this->toArray(
$order);
74 $order = $r->getData()[
'ORDER'];
78 if(is_array(
$result[
'ORDER'][
'PAYMENTS']))
82 $paySystems = Manager::getListWithRestrictions(
84 ->getPaymentCollection()
88 foreach ($paySystems as $paySystem)
90 if((
int)$paySystem[
'PAY_SYSTEM_ID']>0)
92 $fields[
'LIST_PAY_SYSTEM_WITH_RESTRICTIONS'][]=[
93 'ID'=>$paySystem[
'PAY_SYSTEM_ID'],
100 if(is_array(
$result[
'ORDER'][
'SHIPMENTS']))
104 $services = \Bitrix\Sale\Delivery\Services\Manager::getRestrictedObjectsList(
106 ->getShipmentCollection()
107 ->getItemByIndex($ix)
112 $fields[
'LIST_DELIIVERY_SERVICES_RESTRICTIONS'][]=[
134 $order = $r->getData()[
'ORDER'];
169 $order = $r->getData()[
'ORDER'];
170 return $this->toArray(
$order);
188 $order = $r->getData()[
'ORDER'];
193 $this->addErrors($r->getErrors());
198 return $this->toArray(
$order);
202 $this->addErrors($r->getErrors());
213 $order = $r->getData()[
'ORDER'];
214 return $this->toArray(
$order);
231 $order = $r->getData()[
'ORDER'];
236 $this->addErrors($r->getErrors());
241 return $this->toArray(
$order);
245 $this->addErrors($r->getErrors());
251 PageNavigation $pageNavigation,
255 bool $__calculateTotalCount =
true
261 new \Bitrix\Main\Entity\ReferenceField(
263 '\Bitrix\Sale\Internals\PersonType',
264 array(
'=this.PERSON_TYPE_ID' =>
'ref.ID')
266 new \Bitrix\Main\Entity\ReferenceField(
268 '\Bitrix\Sale\Internals\StatusTable',
269 array(
'=this.STATUS_ID' =>
'ref.ID')
276 $orderClass = $registry->getOrderClassName();
283 'offset' => $pageNavigation->getOffset(),
284 'limit' => $pageNavigation->getLimit(),
285 'runtime' => $runtime,
286 'count_total' => $__calculateTotalCount,
307 if ($r->hasWarnings())
318 return [
'DELIVERY_ID_LIST'=>
$order->getDeliveryIdList()];
323 return [
'PAYMENTS'=>$this->toArray(
$order)[
'ORDER'][
'PAYMENTS']];
328 return [
'PAY_SYSTEM_ID_LIST'=>
$order->getPaySystemIdList()];
333 return [
'PRINTED_CHECKS'=>
$order->getPrintedChecks()];
338 return [
'SHIPMENTS'=>$this->toArray(
$order)[
'ORDER'][
'SHIPMENTS']];
343 return [
'BASKET_ITEMS'=>$this->toArray(
$order)[
'ORDER'][
'BASKET_ITEMS']];
348 return $order->getField(
'CURRENCY');
353 return $order->getField(
'DATE_INSERT');
359 return $this->toArray(
$order)[
'DISCOUNTS'];
364 return $order->getPersonTypeId();
369 return $order->getPrice();
374 return [
'PROPERTY_VALUES'=>$this->toArray(
$order)[
'ORDER'][
'PROPERTY_VALUES']];
379 return $order->getSiteId();
384 return $order->getSumPaid();
400 return $order->getTaxPrice();
405 return $order->getTaxValue();
410 return $order->getUserId();
415 return $order->getVatRate();
420 return $order->getVatSum();
425 return $order->isCanceled()?
'Y':
'N';
430 return $order->isExternal()?
'Y':
'N';
435 return $order->isMarked()?
'Y':
'N';
440 return $order->isPaid()?
'Y':
'N';
445 return $order->isShipped()?
'Y':
'N';
450 return $order->isUsedVat()?
'Y':
'N';
477 $builder = $this->getBuilder();
481 $errorsContainer = $builder->getErrorsContainer();
485 if($builder->getErrorsContainer()->getErrorCollection()->count()<=0)
487 $builder->getErrorsContainer()->addError(
new Error(
'unknow error', 200550000001));
489 $errorsContainer = $builder->getErrorsContainer();
492 if($errorsContainer->getErrorCollection()->count()>0)
493 $r->addErrors($errorsContainer->getErrors());
495 $r->setData([
'ORDER'=>$builder->getOrder()]);
506 if (isset(
$fields[
'ORDER'][
'ID']))
511 $orderBuilder = $this->getBuilder();
514 if($orderBuilder->getErrorsContainer()->getErrorCollection()->count()>0)
515 $r->addErrors($orderBuilder->getErrorsContainer()->getErrors());
517 $r->setData([
'ORDER'=>
$order]);
529 $data[
'ORDER'][
'PERSON_TYPE_ID'] =
$order->getPersonTypeId();
531 $orderBuilder = $this->getBuilder();
534 if($orderBuilder->getErrorsContainer()->getErrorCollection()->count()>0)
535 $r->addErrors($orderBuilder->getErrorsContainer()->getErrors());
537 $r->setData([
'ORDER'=>
$order]);
551 if(isset(
$fields[
'BASKET_ITEMS']))
552 unset(
$fields[
'BASKET_ITEMS']);
553 if(isset(
$fields[
'PROPERTY_VALUES']))
554 unset(
$fields[
'PROPERTY_VALUES']);
557 if(isset(
$fields[
'SHIPMENTS']))
559 if(isset(
$fields[
'TRADE_BINDINGS']))
560 unset(
$fields[
'TRADE_BINDINGS']);
563 if(isset(
$fields[
'REQUISITE_LINKS']))
564 unset(
$fields[
'REQUISITE_LINKS']);
569 private static function setFlagActionImport()
578 self::setFlagActionImport();
583 public function resolveExternalIdToInternalId(
array $fields)
585 LoggerDiag::addMessage(
'ORDER_RESOLVE_EXTERNAL_ID_TO_INTERNAL_ID_SOURCE_FIELDS', var_export(
$fields,
true));
593 $internalOrderId = -1;
595 $externalId =
$fields[
'ORDER'][
'XML_ID'];
596 $ixExternal[
'ORDER'][
'MAP'][$externalId] =
$fields[
'ORDER'][
'ID'];
600 if(intval($internalId)>0)
602 $fields[
'ORDER'][
'ID'] = $internalId;
603 $ixInternal[
'ORDER'][
'MAP'][$externalId] = $internalId;
604 $internalOrderId =
$fields[
'ORDER'][
'ID'];
608 $fields[
'ORDER'][
'STATUS_ID' ] = $internalOrderStatusId<>
''? $internalOrderStatusId:
$instance->getDefaultOrderStatusId();
612 if(intval($internalId)<=0)
615 $internalPersonTypeId = $this->getInternalId(
$fields[
'ORDER'][
'PERSON_TYPE_XML_ID'],
'PERSON_TYPE_TYPE');
616 $fields[
'ORDER'][
'PERSON_TYPE_ID'] = $internalPersonTypeId>0 ? $internalPersonTypeId:
$instance->getDefaultPersonTypeId();
625 $orderClass = $registry->getOrderClassName();
627 $order = $orderClass::load($internalId);
628 $fields[
'ORDER'][
'PERSON_TYPE_ID'] =
$order->getPersonTypeId();
633 if(is_array(
$fields[
'ORDER'][
'PROPERTY_VALUES']))
635 foreach(
$fields[
'ORDER'][
'PROPERTY_VALUES'] as
$k=>&$item)
637 $internalIdExternalSystem = $item[
'ORDER_PROPS_ID'];
638 $externalId = $item[
'ORDER_PROPS_XML_ID'];
640 unset($item[
'ORDER_PROPS_ID']);
641 unset($item[
'ORDER_PROPS_XML_ID']);
646 $ixExternal[
'PROPERTIES'][
$k][
'MAP'][$externalId] = $internalIdExternalSystem;
649 if(intval($internalId)>0)
651 $item[
'ORDER_PROPS_ID'] = $internalId;
652 $ixInternal[
'PROPERTIES'][
$k][
'MAP'][$externalId] = $internalId;
662 if(is_array(
$fields[
'ORDER'][
'BASKET_ITEMS']))
665 foreach(
$fields[
'ORDER'][
'BASKET_ITEMS'] as
$k=>&$item)
667 $internalIdExternalSystem = $item[
'ID'];
668 $externalId = $item[
'XML_ID'];
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;
675 $properties = $item[
'PROPERTIES'];
676 if(
count($properties)>0)
678 foreach ($properties as $kp=>&$property)
680 $property[
'BASKET_ID'] = $ixInternal[
'BASKET_ITEMS'][
$k][
'MAP'][$externalId];
682 if(intval($internalIdBasketProps)>0)
684 $ixInternal[
'BASKET_ITEMS'][
$k][
'PROPERTIES'][$kp][$property[
'XML_ID']] = $internalIdBasketProps;
685 $property[
'ID'] = $internalIdBasketProps;
687 $ixExternal[
'BASKET_ITEMS'][
$k][
'PROPERTIES'][$kp][
'MAP'][$property[
'XML_ID']] = $property[
'ID'];
693 [
'PROPERTIES'=>$properties],
694 $this->prepareFieldsBasketItem($item)
697 $item[
'ID'] = $ixInternal[
'BASKET_ITEMS'][
$k][
'MAP'][$externalId];
701 if(is_array(
$fields[
'ORDER'][
'PAYMENTS']))
703 foreach(
$fields[
'ORDER'][
'PAYMENTS'] as
$k=>&$item)
705 $externalId = $item[
'XML_ID'];
706 $ixExternal[
'PAYMENTS'][
$k][
'MAP'][$externalId] = $item[
'ID'];
710 if(intval($internalId)>0)
712 $item[
'ID'] = $internalId;
713 $ixInternal[
'PAYMENTS'][
$k][
'MAP'][$externalId] = $internalId;
716 $externalPaySystemId = $item[
'PAY_SYSTEM_XML_ID'];
717 $ixExternal[
'PAYMENTS'][
$k][
'PAY_SYSTEMS'][
'MAP'][$externalPaySystemId] = $item[
'PAY_SYSTEM_ID'];
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'];
726 if(is_array(
$fields[
'ORDER'][
'SHIPMENTS']))
728 foreach(
$fields[
'ORDER'][
'SHIPMENTS'] as
$k=>&$item)
730 $externalId = $item[
'XML_ID'];
731 $ixExternal[
'SHIPMENTS'][
$k][
'MAP'][$externalId] = $item[
'ID'];
735 $internalShipmentId = (intval($internalId)>0)? $internalId:-1;
736 if(intval($internalId)>0)
738 $item[
'ID'] = $internalId;
739 $ixInternal[
'SHIPMENTS'][
$k][$externalId] = $internalId;
742 $externalDeliveryId = $item[
'DELIVERY_XML_ID'];
743 $ixExternal[
'SHIPMENTS'][
$k][
'DELIVERY_SYSTEM'][
'MAP'][$externalDeliveryId] = $item[
'DELIVERY_ID'];
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'];
750 $externalDeliveryStatusId = $item[
'STATUS_XML_ID'];
751 $ixExternal[
'SHIPMENTS'][
$k][
'DELIVERY_STATUS'][
'MAP'][$externalDeliveryStatusId] = $item[
'STATUS_ID'];
753 unset($item[
'STATUS_XML_ID']);
755 $item[
'STATUS_ID'] = $internalDeliveryStatusId<>
''? $internalDeliveryStatusId:
$instance->getDefaultDeliveryStatusId();
756 $ixInternal[
'SHIPMENTS'][
$k][
'DELIVERY_STATUS'][
'MAP'][$externalDeliveryStatusId] = $item[
'STATUS_ID'];
758 foreach($item[
'SHIPMENT_ITEMS'] as $kb=>&$shipmentItem)
760 unset($shipmentItem[
'ID']);
761 unset($shipmentItem[
'ORDER_DELIVERY_ID']);
764 if(intval($internalIdShipmentItem)>0)
766 $shipmentItem[
'ID'] = $internalIdShipmentItem;
767 if(intval($internalId)>0)
768 $shipmentItem[
'ORDER_DELIVERY_ID'] = $internalId;
770 $ixInternal[
'SHIPMENTS'][
$k][
'SHIPMENT_ITEMS'][$kb][
'MAP'][$externalId] = $internalIdShipmentItem;
775 foreach ($ixExternal[
'BASKET_ITEMS'] as
$map)
777 $internal = current(
$map[
'MAP']);
779 if($shipmentItem[
'BASKET_ID'] == $internal)
781 $external = key(
$map[
'MAP']);
787 $result->addError(
new Error(
'Modify fields error. ShipmentItem xmlId is invalid',200550000002));
792 foreach ($ixInternal[
'BASKET_ITEMS'] as
$map)
794 if(isset(
$map[
'MAP'][$external]))
796 $shipmentItem[
'BASKET_ID'] =
$map[
'MAP'][$external];
803 $item = $this->prepareFieldsShipment($item);
807 if($this->isCrmModuleInstalled())
809 if(is_array(
$fields[
'ORDER'][
'TRADE_BINDINGS']))
811 foreach(
$fields[
'ORDER'][
'TRADE_BINDINGS'] as
$k=>&$item)
813 $externalId = $item[
'XML_ID'];
814 $ixExternal[
'TRADE_BINDINGS'][
$k][
'MAP'][$externalId] = $item[
'ID'];
820 if(intval($internalId)>0)
822 $item[
'ID'] = $internalId;
823 $ixInternal[
'TRADE_BINDINGS'][
$k][
'MAP'][$externalId] = $internalId;
827 $externalTradePlatformId = $item[
'TRADING_PLATFORM_XML_ID'];
828 $ixExternal[
'TRADE_BINDINGS'][
$k][
'TRADING_PLATFORMS'][
'MAP'][$externalTradePlatformId] = $item[
'TRADING_PLATFORM_ID'];
830 unset($item[
'TRADING_PLATFORM_XML_ID']);
831 $internalTradePlatformId = $this->
getInternalId($externalTradePlatformId,
'TRADING_PLATFORM_TYPE');
833 $item[
'TRADING_PLATFORM_ID'] = $internalTradePlatformId>0 ? $internalTradePlatformId:0;
834 $ixInternal[
'TRADE_BINDINGS'][
$k][
'TRADING_PLATFORM'][
'MAP'][$externalTradePlatformId] = $item[
'TRADING_PLATFORM_ID'];
838 if(is_array(
$fields[
'ORDER'][
'CLIENTS']))
840 foreach(
$fields[
'ORDER'][
'CLIENTS'] as
$k=>&$item)
842 $externalId = $item[
'XML_ID'];
843 $ixExternal[
'CLIENTS'][
$k][
'MAP'][$externalId] = $item[
'ID'];
846 $internalId = $this->
getInternalId($externalId, ENTITY_CRM_CONTACT_COMPANY_COLLECTION);
847 if(intval($internalId)>0)
849 $item[
'ID'] = $internalId;
850 $ixInternal[
'CLIENTS'][
$k][
'MAP'][$externalId] = $internalId;
859 $fields[
'ORDER'][
'TRADE_BINDINGS'] = [];
860 unset(
$fields[
'ORDER'][
'CLIENTS']);
866 LoggerDiag::addMessage(
'ORDER_RESOLVE_EXTERNAL_ID_TO_INTERNAL_ID_SUCCESS', var_export(
$fields,
true));
870 LoggerDiag::addMessage(
'ORDER_RESOLVE_EXTERNAL_ID_TO_INTERNAL_ID_ERROR');
879 return $loader->getFieldsByExternalId($externalId);
882 private function prepareFieldsBasketItem(
$fields)
887 $code = $loader->getCodeAfterDelimiter(
$fields[
'PRODUCT_XML_ID']);
890 $product = $loader->getFieldsByExternalId(
$fields[
'PRODUCT_XML_ID']);
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"]
909 "PRODUCT_ID" => $ri->rand(1000000, 9999999),
912 "PRODUCT_PROVIDER_CLASS" =>
null,
913 "CATALOG_XML_ID" =>
null,
914 "MEASURE_CODE" =>
$fields[
"MEASURE_CODE"],
915 "MEASURE_NAME" =>
$fields[
"MEASURE_NAME"],
925 $result[
"IGNORE_CALLBACK_FUNC"] =
"Y";
937 private function prepareFieldsShipment($item)
941 $item[
'CUSTOM_PRICE_DELIVERY'] =
'Y';
950 self::setFlagActionImport();
954 LoggerDiag::addMessage(
'ORDER_IMPORT_ACTION_WITH_RESOLVE_EXTERNAL_ID_TO_INTERNAL_ID', var_export(
$fields,
true));
956 $r = $this->resolveExternalIdToInternalId(
$fields);
960 $result = $this->modifyAction($r->getData()[
'DATA']);
969 LoggerDiag::addMessage(
'ORDER_IMPORT_ACTION_WITH_RESOLVE_EXTERNAL_ID_TO_INTERNAL_ID_ERROR', var_export($this->
getErrors(),
true));
974 LoggerDiag::addMessage(
'ORDER_IMPORT_ACTION_WITH_RESOLVE_EXTERNAL_ID_TO_INTERNAL_ID_SUCCESS');
985 'PERSON_TYPE_XML_ID',
994 $orderPropertyValuesFields = [
997 'ORDER_PROPS_XML_ID',
1002 $basketItemFields = [
1016 $basketItemPropertiesFields = [
1024 'PAY_SYSTEM_XML_ID',
1035 'PAY_RETURN_COMMENT',
1040 'BASE_PRICE_DELIVERY',
1044 'REASON_UNDO_DEDUCTED',
1046 'DELIVERY_DOC_DATE',
1058 $shipmentItemsFields = [
1064 $result[
'ORDER'] = array_intersect_key(
$fields[
'ORDER'], array_flip($orderFields));
1066 if(isset(
$fields[
'ORDER'][
'PROPERTY_VALUES']))
1068 foreach(
$fields[
'ORDER'][
'PROPERTY_VALUES'] as
$k=>$v)
1069 $result[
'ORDER'][
'PROPERTY_VALUES'][
$k] = array_intersect_key($v, array_flip($orderPropertyValuesFields));
1072 if(isset(
$fields[
'ORDER'][
'BASKET_ITEMS']))
1074 foreach(
$fields[
'ORDER'][
'BASKET_ITEMS'] as
$k=>$item)
1076 $result[
'ORDER'][
'BASKET_ITEMS'][
$k] = array_intersect_key($item, array_flip($basketItemFields));
1078 if(isset($item[
'PROPERTIES']))
1080 foreach($item[
'PROPERTIES'] as $kProps=>$pros)
1082 $result[
'ORDER'][
'BASKET_ITEMS'][
$k][
'PROPERTIES'][$kProps] = array_intersect_key($pros, array_flip($basketItemPropertiesFields));
1088 if(isset(
$fields[
'ORDER'][
'PAYMENTS']))
1092 $result[
'ORDER'][
'PAYMENTS'][
$k] = array_intersect_key(
$payment, array_flip($paymentFields));
1096 if(isset(
$fields[
'ORDER'][
'SHIPMENTS']))
1098 foreach(
$fields[
'ORDER'][
'SHIPMENTS'] as
$k=>$shipment)
1100 $result[
'ORDER'][
'SHIPMENTS'][
$k] = array_intersect_key($shipment, array_flip($shipmentFields));
1102 if(isset($shipment[
'SHIPMENT_ITEMS']))
1104 foreach($shipment[
'SHIPMENT_ITEMS'] as $kShipmentItem=>$shipmentItem)
1106 $result[
'ORDER'][
'SHIPMENTS'][
$k][
'SHIPMENT_ITEMS'][$kShipmentItem] = array_intersect_key($shipmentItem, array_flip($shipmentItemsFields));
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'
1147 $r = $this->checkReadPermissionEntity();
1150 ||
$name ==
'importdelete'
1153 $r = $this->checkModifyPermissionEntity();
1157 $r = parent::checkPermissionEntity(
$name);
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)