62 $this->errorsContainer->setAcceptableErrorCodes(
63 $this->settingsContainer->getItemValue(
'acceptableErrorCodes')
80 ->buildTradeBindings()
87 ->setRelatedProperties()
113 $this->formData =
$data;
130 $this->isStartField = $this->order->isStartField();
138 $shipmentClassName = $this->registry->getShipmentClassName();
139 return array_merge([
'PROPERTIES'], $shipmentClassName::getAvailableFields());
144 $paymentClassName = $this->registry->getPaymentClassName();
145 return $paymentClassName::getAvailableFields();
150 return [
'RESPONSIBLE_ID',
'USER_DESCRIPTION',
'ORDER_TOPIC',
'ACCOUNT_NUMBER'];
153 public function setFields()
159 if(isset($this->formData[$field]))
161 $r = $this->order->setField($field, $this->formData[$field]);
170 if(isset($this->formData[
"PERSON_TYPE_ID"]) && intval($this->formData[
"PERSON_TYPE_ID"]) > 0)
173 $r = $this->order->setPersonTypeId(intval($this->formData[
'PERSON_TYPE_ID']));
178 $r = $this->order->setPersonTypeId(
179 OrderBuyer::getDefaultPersonType(
180 $this->order->getSiteId()
195 if (empty($this->formData[
"PROPERTIES"]))
200 $propCollection = $this->order->getPropertyCollection();
201 $res = $propCollection->setValuesFromPost(
203 $this->settingsContainer->getItemValue(
'propsFiles')
206 if (!
$res->isSuccess())
214 public function setRelatedProperties()
216 if (empty($this->formData[
"PROPERTIES"]))
221 $propCollection = $this->order->getPropertyCollection();
234 if (!
$res->isSuccess())
251 if (empty($this->formData[
"PROPERTIES"]) || empty($this->formData[
"USER_ID"]))
256 $profileId = $this->formData[
"USER_PROFILE"][
"ID"] ?? 0;
257 $profileName = $this->formData[
"USER_PROFILE"][
"NAME"] ??
'';
264 $this->order->getPersonTypeId(),
265 $this->formData[
"PROPERTIES"],
279 if(isset($this->formData[
"DISCOUNTS"]) && is_array($this->formData[
"DISCOUNTS"]))
281 $this->order->getDiscount()->setApplyResult($this->formData[
"DISCOUNTS"]);
283 $r = $this->order->getDiscount()->calculate();
287 $discountData = $r->getData();
288 $this->order->applyDiscount($discountData);
303 $shipments = $this->order->getShipmentCollection();
304 return $shipments->createItem();
311 $shipmentCollection = $this->order->getShipmentCollection();
314 foreach($this->formData[
"SHIPMENT"] as $shipmentData)
316 if(!isset($shipmentData[
'ID']))
319 $shipment = $shipmentCollection->getItemById($shipmentData[
'ID']);
321 if ($shipment ==
null)
324 $shipmentIds[] = $shipment->getId();
327 foreach ($shipmentCollection as $shipment)
329 if($shipment->isSystem())
332 if(!in_array($shipment->getId(), $shipmentIds))
334 $r = $shipment->delete();
335 if (!$r->isSuccess())
337 $this->errorsContainer->addErrors($r->getErrors());
352 $deliveryStatusClassName = $this->registry->getDeliveryStatusClassName();
353 $statusId = $deliveryStatusClassName::getInitialStatus();
355 elseif (isset($item[
'STATUS_ID']) && $item[
'STATUS_ID'] !== $defaultFields[
'STATUS_ID'])
357 $statusId = $item[
'STATUS_ID'];
363 public function buildShipments()
365 $isEmptyShipmentData = empty($this->formData[
"SHIPMENT"]) || !is_array($this->formData[
"SHIPMENT"]);
366 if ($isEmptyShipmentData)
368 $this->formData[
"SHIPMENT"] = [];
371 if ($isEmptyShipmentData && !$this->
getSettingsContainer()->getItemValue(
'createDefaultShipmentIfNeed'))
376 if($isEmptyShipmentData && $this->
getOrder()->isNew())
384 throw new BuildingException();
387 $shipmentCollection = $this->order->getShipmentCollection();
389 foreach($this->formData[
"SHIPMENT"] as $item)
391 $shipmentId = intval($item[
'ID'] ?? 0);
392 $isNew = ($shipmentId <= 0);
393 $deliveryService =
null;
396 if (!isset($item[
'DEDUCTED']) || $item[
'DEDUCTED'] !==
'Y')
398 $item[
'DEDUCTED'] =
'N';
402 isset($item[
'EXTRA_SERVICES']) && is_array($item[
'EXTRA_SERVICES'])
403 ? $item[
'EXTRA_SERVICES']
408 if (!empty($settableShipmentFields))
411 $product = $item[
'PRODUCT'] ??
null;
412 $storeId = (int)($item[
'DELIVERY_STORE_ID'] ?? 0);
413 $item = array_intersect_key($item, array_flip($settableShipmentFields));
414 if ($product !==
null)
416 $item[
'PRODUCT'] = $product;
423 $shipment = $shipmentCollection->createItem();
427 $shipment = $shipmentCollection->getItemById($shipmentId);
431 $this->errorsContainer->addError(
new Error(Loc::getMessage(
"SALE_HLP_ORDERBUILDER_SHIPMENT_NOT_FOUND").
" - ".$shipmentId));
436 $defaultFields = $shipment->getFieldValues();
439 $systemShipment = $shipmentCollection->getSystemShipment();
440 $systemShipmentItemCollection = $systemShipment->getShipmentItemCollection();
445 !isset($item[
'PRODUCT'])
446 && $shipment->getId() <= 0
450 $basket = $this->order->getBasket();
454 $basketItems = $basket->getBasketItems();
455 foreach($basketItems as $product)
457 $systemShipmentItem = $systemShipmentItemCollection->getItemByBasketCode($product->getBasketCode());
459 if($product->isBundleChild() || !$systemShipmentItem || $systemShipmentItem->getQuantity() <= 0)
463 'AMOUNT' => $systemShipmentItem->getQuantity(),
464 'BASKET_CODE' => $product->getBasketCode(),
469 elseif (isset($item[
'PRODUCT']) && is_array($item[
'PRODUCT']))
471 $products = $item[
'PRODUCT'];
474 if($item[
'DEDUCTED'] ==
'Y' && $products !==
null)
476 $basketResult = $this->buildShipmentBasket($shipment, $products);
478 if(!$basketResult->isSuccess())
480 $this->errorsContainer->addErrors($basketResult->getErrors());
484 $shipmentFields =
array(
485 'COMPANY_ID' => (isset($item[
'COMPANY_ID']) && intval($item[
'COMPANY_ID']) > 0) ? intval($item[
'COMPANY_ID']) : 0,
486 'DEDUCTED' => $item[
'DEDUCTED'] ??
'N',
487 'DELIVERY_DOC_NUM' => $item[
'DELIVERY_DOC_NUM'] ??
'',
488 'TRACKING_NUMBER' => $item[
'TRACKING_NUMBER'] ??
'',
489 'CURRENCY' => $this->order->getCurrency(),
490 'COMMENTS' => $item[
'COMMENTS'] ??
'',
493 if (!empty($item[
'IS_REALIZATION']))
495 $shipmentFields[
'IS_REALIZATION'] = $item[
'IS_REALIZATION'];
498 if (!empty($item[
'ACCOUNT_NUMBER']))
500 $shipmentFields[
'ACCOUNT_NUMBER'] = $item[
'ACCOUNT_NUMBER'];
503 if (!empty($item[
'XML_ID']))
505 $shipmentFields[
'XML_ID'] = $item[
'XML_ID'];
509 if ($statusId !==
'')
511 $shipmentFields[
'STATUS_ID'] = $statusId;
514 if (empty($item[
'COMPANY_ID']))
516 $shipmentFields[
'COMPANY_ID'] = $this->order->getField(
'COMPANY_ID');
519 if (empty($item[
'RESPONSIBLE_ID']))
521 $shipmentFields[
'RESPONSIBLE_ID'] = $this->order->getField(
'RESPONSIBLE_ID');
526 if (isset($item[
'PROFILE_ID']) && (
int)$item[
'PROFILE_ID'] > 0)
528 $deliveryId = (int)$item[
'PROFILE_ID'];
530 elseif (isset($item[
'DELIVERY_ID']))
532 $deliveryId = (int)$item[
'DELIVERY_ID'];
534 elseif ($shipment->getField(
'DELIVERY_ID'))
536 $deliveryId = $shipment->getField(
'DELIVERY_ID');
539 $shipmentFields[
'DELIVERY_ID'] = $deliveryId;
541 $dateFields = [
'DELIVERY_DOC_DATE',
'DATE_DEDUCTED',
'DATE_MARKED',
'DATE_CANCELED',
'DATE_RESPONSIBLE_ID'];
543 foreach($dateFields as $fieldName)
545 if(isset($item[$fieldName]))
547 if (is_string($item[$fieldName]))
551 $shipmentFields[$fieldName] =
new DateTime($item[$fieldName]);
553 catch (ObjectException $exception)
555 $this->errorsContainer->addError(
new Error(
'Wrong field "'.$fieldName.
'"'));
558 elseif ($item[$fieldName] instanceof Date)
560 $shipmentFields[$fieldName] = $item[$fieldName];
567 if($deliveryService = Delivery\Services\Manager::getObjectById($shipmentFields[
'DELIVERY_ID']))
569 if($deliveryService->isProfile())
571 $shipmentFields[
'DELIVERY_NAME'] = $deliveryService->getNameWithParent();
575 $shipmentFields[
'DELIVERY_NAME'] = $deliveryService->getName();
579 catch (ArgumentNullException $e)
581 $this->errorsContainer->addError(
new Error(Loc::getMessage(
'SALE_HLP_ORDERBUILDER_DELIVERY_NOT_FOUND'),
'OB_DELIVERY_NOT_FOUND'));
585 $responsibleId = $shipment->getField(
'RESPONSIBLE_ID');
587 if (($item[
'RESPONSIBLE_ID'] ??
null) !== $responsibleId || empty($responsibleId))
589 if (isset($item[
'RESPONSIBLE_ID']))
591 $shipmentFields[
'RESPONSIBLE_ID'] = $item[
'RESPONSIBLE_ID'];
595 $shipmentFields[
'RESPONSIBLE_ID'] = $this->order->getField(
'RESPONSIBLE_ID');
598 if (!empty($shipmentFields[
'RESPONSIBLE_ID']))
606 $shipment->setExtraServices($extraServices);
609 $setFieldsResult = $shipment->setFields($shipmentFields);
611 if(!$setFieldsResult->isSuccess())
613 $this->errorsContainer->addErrors($setFieldsResult->getErrors());
617 if (isset($item[
'PROPERTIES']) && is_array($item[
'PROPERTIES']))
620 $propCollection = $shipment->getPropertyCollection();
621 $res = $propCollection->setValuesFromPost($item, []);
623 if (!
$res->isSuccess())
634 foreach ($propCollection as $propValue)
636 if ($propValue->isUtil())
641 $property = $propValue->getProperty();
642 $relatedDeliveryIds = (isset($property[
'RELATION']) && is_array($property[
'RELATION']))
645 $property[
'RELATION'],
648 return $item[
'ENTITY_TYPE'] ===
'D';
656 !empty($relatedDeliveryIds)
657 && !in_array($shipment->getField(
'DELIVERY_ID'), $relatedDeliveryIds)
663 $res = $propValue->verify();
664 if (!
$res->isSuccess())
669 new Main\
Error(
$error->getMessage(), $propValue->getPropertyId(),
'SHIPMENT_PROPERTIES')
674 $res = $propValue->checkRequiredValue($propValue->getPropertyId(), $propValue->getValue());
675 if (!
$res->isSuccess())
680 new Main\
Error(
$error->getMessage(), $propValue->getPropertyId(),
'SHIPMENT_PROPERTIES')
690 $shipment->setStoreId($storeId);
693 if($item[
'DEDUCTED'] ==
'N' && $products !==
null)
695 $basketResult = $this->buildShipmentBasket($shipment, $products);
697 if(!$basketResult->isSuccess())
699 $this->errorsContainer->addErrors($basketResult->getErrors());
703 $isCustomPrice =
false;
704 if (isset($item[
'CUSTOM_PRICE_DELIVERY']))
706 $isCustomPrice = $item[
'CUSTOM_PRICE_DELIVERY'] ===
'Y';
710 'CUSTOM_PRICE_DELIVERY' => $isCustomPrice ?
'Y' :
'N',
711 'PRICE_DELIVERY' => (
float)str_replace(
',',
'.', $item[
'PRICE_DELIVERY'] ?? 0),
714 if (isset($item[
'ALLOW_DELIVERY']))
716 $fields[
'ALLOW_DELIVERY'] = $item[
'ALLOW_DELIVERY'] ===
'Y' ?
'Y' :
'N';
719 if (isset($item[
'BASE_PRICE_DELIVERY']))
721 $fields[
'BASE_PRICE_DELIVERY'] = (float)str_replace(
',',
'.', $item[
'BASE_PRICE_DELIVERY']);
724 $shipment = $this->
delegate->setShipmentPriceFields($shipment,
$fields);
726 if($deliveryService && !empty($item[
'ADDITIONAL']))
728 $modifiedShipment = $deliveryService->processAdditionalInfoShipmentEdit($shipment, $item[
'ADDITIONAL']);
731 if ($modifiedShipment && get_class($modifiedShipment) ==
$registry->getShipmentClassName())
733 $shipment = $modifiedShipment;
741 protected function removeShipmentItems(\Bitrix\Sale\Shipment $shipment, $products, $idsFromForm)
745 $shipmentItemCollection = $shipment->getShipmentItemCollection();
748 foreach ($shipmentItemCollection as $shipmentItem)
750 if (!array_key_exists($shipmentItem->getBasketCode(), $idsFromForm))
753 $r = $shipmentItem->delete();
754 if (!$r->isSuccess())
756 $result->addErrors($r->getErrors());
760 $shipmentItemStoreCollection = $shipmentItem->getShipmentItemStoreCollection();
761 if ($shipmentItemStoreCollection)
764 foreach ($shipmentItemStoreCollection as $shipmentItemStore)
766 $shipmentItemId = $shipmentItemStore->getId();
767 if (!isset($idsFromForm[$shipmentItem->getBasketCode()][
'BARCODE_IDS'][$shipmentItemId]))
769 $delResult = $shipmentItemStore->delete();
770 if (!$delResult->isSuccess())
772 $result->addErrors($delResult->getErrors());
794 public function buildShipmentBasket(&$shipment, $shipmentBasket)
798 $shippingItems =
array();
799 $idsFromForm =
array();
800 $basket = $this->order->getBasket();
801 $shipmentItemCollection = $shipment->getShipmentItemCollection();
804 if(is_array($shipmentBasket))
807 foreach ($shipmentBasket as
$items)
809 $items[
'QUANTITY'] = floatval(str_replace(
',',
'.',
$items[
'QUANTITY']));
810 $items[
'AMOUNT'] = floatval(str_replace(
',',
'.',
$items[
'AMOUNT']));
815 $items = $r->getData()[0];
819 $result->addErrors($r->getErrors());
825 if (!$basketItem = $basket->getItemById(
$items[
'BASKET_ID']))
828 Loc::getMessage(
'SALE_ORDER_SHIPMENT_BASKET_BASKET_ITEM_NOT_FOUND',
array(
829 '#BASKET_ITEM_ID#' =>
$items[
'BASKET_ID'],
831 'PROVIDER_UNRESERVED_SHIPMENT_ITEM_WRONG_BASKET_ITEM')
836 $basketCode = $basketItem->getBasketCode();
840 $basketCode =
$items[
'BASKET_CODE'];
841 if(!$basketItem = $basket->getItemByBasketCode($basketCode))
844 Loc::getMessage(
'SALE_ORDER_SHIPMENT_BASKET_BASKET_ITEM_NOT_FOUND',
array(
845 '#BASKET_ITEM_ID#' => $basketCode,
847 'PROVIDER_UNRESERVED_SHIPMENT_ITEM_WRONG_BASKET_ITEM')
853 $isSupportedMarkingCode =
false;
854 if (isset(
$items[
'IS_SUPPORTED_MARKING_CODE']))
856 $isSupportedMarkingCode =
$items[
'IS_SUPPORTED_MARKING_CODE'] ===
'Y';
860 'BASKET_CODE' => $basketCode,
861 'AMOUNT' =>
$items[
'AMOUNT'] ?? 0,
862 'ORDER_DELIVERY_BASKET_ID' =>
$items[
'ORDER_DELIVERY_BASKET_ID'] ?? 0,
863 'IS_SUPPORTED_MARKING_CODE' => $isSupportedMarkingCode ?
'Y' :
'N',
865 if (array_key_exists(
'XML_ID',
$items))
869 $idsFromForm[$basketCode] =
array();
872 isset(
$items[
'BARCODE_INFO'])
877 foreach (
$items[
'BARCODE_INFO'] as $item)
879 if (!$basketItem->isReservableItem())
881 $shippingItems[] =
$tmp;
885 $barcodeQuantity = ($basketItem->isBarcodeMulti() || $basketItem->isSupportedMarkingCode()) ? 1 : $item[
'QUANTITY'];
886 $barcodeStoreId = $item[
'STORE_ID'];
889 'ORDER_DELIVERY_BASKET_ID' =>
$items[
'ORDER_DELIVERY_BASKET_ID'] ?? 0,
890 'STORE_ID' => $barcodeStoreId,
891 'QUANTITY' => $barcodeQuantity,
894 $tmp[
'BARCODE_INFO'] = [
895 $item[
'STORE_ID'] => [
896 'STORE_ID' => (int)$barcodeStoreId,
897 'QUANTITY' => (
float)$barcodeQuantity,
902 if ($item[
'BARCODE'])
904 foreach ($item[
'BARCODE'] as $barcode)
906 $barcode[
'ID'] = (int)($barcode[
'ID'] ?? 0);
908 $tmp[
'BARCODE_INFO'][$barcodeStoreId][
'BARCODE'] = [
$barcode];
910 if (isset($barcode[
'MARKING_CODE']))
912 $barcode[
'MARKING_CODE'] = (string)$barcode[
'MARKING_CODE'];
919 $idsFromForm[$basketCode][
'BARCODE_IDS'][
$barcode[
'ID']] =
true;
921 if ($barcode[
'ID'] > 0)
927 unset(
$tmp[
'BARCODE'][
'ID']);
930 $tmp[
'BARCODE'][
'BARCODE'] = (string)$barcode[
'VALUE'];
931 $tmp[
'BARCODE'][
'MARKING_CODE'] =
$barcode[
'MARKING_CODE'];
933 $shippingItems[] =
$tmp;
937 elseif (!$basketItem->isBarcodeMulti() && !$basketItem->isSupportedMarkingCode())
939 $shippingItems[] =
$tmp;
944 if ($basketItem->isBarcodeMulti() || $basketItem->isSupportedMarkingCode())
946 while ($barcodeCount < $item[
'QUANTITY'])
948 unset(
$tmp[
'BARCODE'][
'ID']);
949 $tmp[
'BARCODE'][
'BARCODE'] =
'';
950 $tmp[
'BARCODE'][
'MARKING_CODE'] =
'';
951 $shippingItems[] =
$tmp;
959 $shippingItems[] =
$tmp;
965 $r = $this->removeShipmentItems($shipment, $shipmentBasket, $idsFromForm);
967 $result->addErrors($r->getErrors());
972 foreach ($shippingItems as $shippingItem)
974 if ((
int)$shippingItem[
'ORDER_DELIVERY_BASKET_ID'] <= 0)
976 $basketCode = $shippingItem[
'BASKET_CODE'];
978 $basketItem = $this->order->getBasket()->getItemByBasketCode($basketCode);
981 $shipmentItem = $shipmentItemCollection->createItem($basketItem);
983 if ($shipmentItem ===
null)
987 Loc::getMessage(
'SALE_ORDER_SHIPMENT_BASKET_ERROR_ALREADY_SHIPPED')
993 unset($shippingItem[
'BARCODE'][
'ORDER_DELIVERY_BASKET_ID']);
997 $shipmentItem = $shipmentItemCollection->getItemById($shippingItem[
'ORDER_DELIVERY_BASKET_ID']);
1001 $basketItem = $shipmentItem->getBasketItem();
1006 $systemShipment = $shipment->getCollection()->getSystemShipment();
1008 $systemShipmentItemCollection = $systemShipment->getShipmentItemCollection();
1010 $shipmentItem = $systemShipmentItemCollection->getItemById($shippingItem[
'ORDER_DELIVERY_BASKET_ID']);
1014 $basketItem = $shipmentItem->getBasketItem();
1015 $shipmentItem = $shipmentItemCollection->createItem($basketItem);
1016 $shipmentItem->setField(
'QUANTITY', $shipmentItem->getField(
'QUANTITY'));
1022 Loc::getMessage(
'SALE_HLP_ORDERBUILDER_SHIPMENT_ITEM_ERROR',[
1023 '#ID#' => $shippingItem[
'ORDER_DELIVERY_BASKET_ID'],
1033 if ($shippingItem[
'AMOUNT'] <= 0)
1037 Loc::getMessage(
'SALE_ORDER_SHIPMENT_BASKET_ERROR_QUANTITY',
array(
'#BASKET_ITEM#' => $basketItem->getField(
'NAME'))),
1038 'BASKET_ITEM_'.$basketItem->getBasketCode()
1045 if(!$r->isSuccess())
1046 $result->addErrors($r->getErrors());
1048 if (array_key_exists(
'XML_ID', $shippingItem))
1050 $setFieldResult = $shipmentItem->setField(
'XML_ID', $shippingItem[
'XML_ID']);
1051 if (!$setFieldResult->isSuccess())
1053 $result->addErrors($setFieldResult->getErrors());
1060 $hasMeaningfulFields = $shipmentItemCollection->hasMeaningfulField();
1063 $r = $shipmentItemCollection->doFinalAction($hasMeaningfulFields);
1064 if (!$r->isSuccess())
1066 $result->addErrors($r->getErrors());
1084 $this->order->setMathActionOnly(
true);
1085 $setFieldResult = $shipmentItem->
setField(
'QUANTITY',
$params[
'AMOUNT']);
1086 $this->order->setMathActionOnly(
false);
1088 if (!$setFieldResult->isSuccess())
1090 $result->addErrors($setFieldResult->getErrors());
1094 $r = $this->setBarcodeShipmentItem($shipmentItem,
$params);
1096 if($r->isSuccess() ==
false)
1098 $result->addErrors($r->getErrors());
1101 $setFieldResult = $shipmentItem->
setField(
'QUANTITY',
$params[
'AMOUNT']);
1103 if (!$setFieldResult->isSuccess())
1105 $result->addErrors($setFieldResult->getErrors());
1121 && $basketItem->isReservableItem()
1124 $barcode =
$params[
'BARCODE'];
1127 $shipmentItemStoreCollection = $shipmentItem->getShipmentItemStoreCollection();
1128 if ($shipmentItemStoreCollection)
1130 if (!$basketItem->isBarcodeMulti() && !$basketItem->isSupportedMarkingCode())
1133 $r = $shipmentItemStoreCollection->setBarcodeQuantityFromArray(
$params);
1134 if (!$r->isSuccess())
1136 $result->addErrors($r->getErrors());
1140 if (isset($barcode[
'ID']) && intval($barcode[
'ID']) > 0)
1143 if ($shipmentItemStore = $shipmentItemStoreCollection->getItemById($barcode[
'ID']))
1145 unset($barcode[
'ID']);
1146 $setFieldResult = $shipmentItemStore->setFields($barcode);
1148 if (!$setFieldResult->isSuccess())
1150 $result->addErrors($setFieldResult->getErrors());
1156 $shipmentItemStore = $shipmentItemStoreCollection->createItem($basketItem);
1157 $setFieldResult = $shipmentItemStore->setFields($barcode);
1158 if (!$setFieldResult->isSuccess())
1160 $result->addErrors($setFieldResult->getErrors());
1175 $payment->setField(
'SUM', $this->order->getPrice());
1187 foreach($this->formData[
"PAYMENT"] as $paymentData)
1189 if(!isset($paymentData[
'ID']))
1202 if(!in_array(
$payment->getId(), $paymentIds))
1205 if (!$r->isSuccess())
1207 $this->errorsContainer->addErrors($r->getErrors());
1221 return empty($this->formData[
"PAYMENT"]) || !is_array($this->formData[
"PAYMENT"]);
1232 public function buildPayments()
1235 if ($isEmptyPaymentData)
1237 $this->formData[
'PAYMENT'] = [];
1245 if($isEmptyPaymentData && $this->
getOrder()->isNew())
1253 $this->errorsContainer->addError(
new Error(
'Payments remove - error'));
1254 throw new BuildingException();
1259 foreach($this->formData[
"PAYMENT"] as $paymentData)
1261 $paymentId = (int)($paymentData[
'ID'] ?? 0);
1262 $isNew = ($paymentId <= 0);
1264 $products = $paymentData[
'PRODUCT'] ?? [];
1268 if(
count($settablePaymentFields)>0)
1269 $paymentData = array_intersect_key($paymentData, array_flip($settablePaymentFields));
1275 if (isset($paymentData[
'CURRENCY']) && !empty($paymentData[
'CURRENCY']) && $paymentData[
'CURRENCY'] !== $this->order->getCurrency())
1278 $paymentData[
'CURRENCY'] = $this->order->getCurrency();
1287 $this->errorsContainer->addError(
new Error(Loc::getMessage(
"SALE_HLP_ORDERBUILDER_PAYMENT_NOT_FOUND").
" - ".$paymentId));
1292 $isReturn = (isset($paymentData[
'IS_RETURN']) && ($paymentData[
'IS_RETURN'] ==
'Y' || $paymentData[
'IS_RETURN'] ==
'P'));
1295 if((
int)$paymentData[
'PAY_SYSTEM_ID'] > 0)
1297 $psService = PaySystem\Manager::getObjectById((
int)$paymentData[
'PAY_SYSTEM_ID']);
1299 $paymentData[
'PAY_SYSTEM_NAME'] = ($psService) ? $psService->getField(
'NAME') :
'';
1302 if (isset($paymentData[
'COMPANY_ID']))
1304 $paymentData[
'COMPANY_ID'] = (int)$paymentData[
'COMPANY_ID'];
1307 if (isset($paymentData[
'PAID']))
1309 $paymentFields[
'PAID'] = ($paymentData[
'PAID'] ===
'Y') ?
'Y' :
'N';
1310 unset($paymentData[
'PAID']);
1315 if(empty($paymentData[
'COMPANY_ID']))
1317 $paymentData[
'COMPANY_ID'] = $this->order->getField(
'COMPANY_ID');
1320 if(empty($paymentData[
'RESPONSIBLE_ID']))
1322 $paymentData[
'RESPONSIBLE_ID'] = $this->order->getField(
'RESPONSIBLE_ID');
1327 $dateFields = [
'DATE_PAID',
'DATE_PAY_BEFORE',
'DATE_BILL',
'PAY_RETURN_DATE',
'PAY_VOUCHER_DATE'];
1329 foreach($dateFields as $fieldName)
1331 if(isset($paymentData[$fieldName]) && is_string($paymentData[$fieldName]))
1335 $paymentData[$fieldName] =
new Date($paymentData[$fieldName]);
1337 catch (ObjectException $exception)
1339 $this->errorsContainer->addError(
new Error(
'Wrong field "'.$fieldName.
'"'));
1345 if($paymentItem->isPaid()
1346 && isset($paymentData[
'SUM'])
1347 && abs(floatval($paymentData[
'SUM']) - floatval($paymentItem->getSum())) > 0.001)
1349 $this->errorsContainer->addError(
new Error(Loc::getMessage(
"SALE_HLP_ORDERBUILDER_ERROR_PAYMENT_SUM")));
1358 if(isset($paymentData[
'SUM']))
1360 $paymentData[
'SUM'] = (float)str_replace(
',',
'.', $paymentData[
'SUM']);
1363 if(isset($paymentData[
'RESPONSIBLE_ID']))
1365 $paymentData[
'RESPONSIBLE_ID'] = !empty($paymentData[
'RESPONSIBLE_ID']) ? $paymentData[
'RESPONSIBLE_ID'] : $this->
getCurrentUserId();
1367 if($paymentData[
'RESPONSIBLE_ID'] != $paymentItem->getField(
'RESPONSIBLE_ID'))
1378 if($paymentItem->isInner() && isset($paymentData[
'SUM']) && $paymentData[
'SUM'] === 0)
1380 unset($paymentData[
'SUM']);
1383 $setResult = $paymentItem->setFields($paymentData);
1385 if(!$setResult->isSuccess())
1387 $this->errorsContainer->addErrors($setResult->getErrors());
1392 $this->buildPayableItems($paymentItem, $products);
1395 if($isReturn && $paymentData[
'IS_RETURN'])
1397 $setResult = $paymentItem->setReturn($paymentData[
'IS_RETURN']);
1399 if(!$setResult->isSuccess())
1401 $this->errorsContainer->addErrors($setResult->getErrors());
1405 if(!empty($paymentFields[
'PAID']))
1407 $setResult = $paymentItem->setPaid($paymentFields[
'PAID']);
1409 if(!$setResult->isSuccess())
1411 $this->errorsContainer->addErrors($setResult->getErrors());
1431 public function buildPayableItems(Payment
$payment,
array $payableItems): Result
1435 $basket = $this->order->getBasket();
1436 $payableItemCollection =
$payment->getPayableItemCollection();
1438 foreach ($payableItems as $item)
1440 $payableItem =
null;
1442 if (isset($item[
'BASKET_CODE']))
1445 $basketItem = $basket->getItemByBasketCode($item[
'BASKET_CODE']);
1448 $payableItem = $payableItemCollection->createItemByBasketItem($basketItem);
1451 elseif (isset($item[
'DELIVERY_ID']))
1454 foreach ($this->order->getShipmentCollection()->getNotSystemItems() as $shipment)
1457 $shipment->getId() === 0
1458 && (
int)$item[
'DELIVERY_ID'] === $shipment->getDeliveryId()
1461 $payableItem = $payableItemCollection->createItemByShipment($shipment);
1466 if ($payableItem ===
null)
1471 $quantity = floatval(str_replace(
',',
'.', $item[
'QUANTITY']));
1473 $payableItem->setField(
'QUANTITY', $quantity);
1481 if(!isset($this->formData[
"TRADE_BINDINGS"]))
1491 if(isset($this->formData[
"TRADE_BINDINGS"]) &&
count($this->formData[
"TRADE_BINDINGS"])>0)
1493 $tradeBindingCollection = $this->order->getTradeBindingCollection();
1495 foreach($this->formData[
"TRADE_BINDINGS"] as
$fields)
1497 $tradingPlatformId = (int)(
$fields[
'TRADING_PLATFORM_ID'] ?? 0);
1498 if ($tradingPlatformId === 0)
1507 $id = (int)(
$fields[
'ID'] ?? 0);
1508 $isNew = ($id <= 0);
1512 $binding = $tradeBindingCollection->createItem();
1516 $binding = $tradeBindingCollection->getItemById($id);
1520 $this->errorsContainer->addError(
new Error(
'Can\'t find Trade Binding with id:"'.$id.
'"',
'TRADE_BINDING_NOT_EXISTS'));
1527 $r = $binding->setFields(
$fields);
1530 if(!$r->isSuccess())
1531 $this->errorsContainer->addErrors($r->getErrors());
1542 $platformFields = TradingPlatformTable::getById($id)->fetchAll();
1544 if (!isset($platformFields[0]))
1546 $r->addError(
new Error(
'tradingPlatform is not exists'));
1556 $tradeBindingCollection = $this->order->getTradeBindingCollection();
1559 foreach($this->formData[
"TRADE_BINDINGS"] as $tradeBinding)
1561 if(!isset($tradeBinding[
'ID']))
1564 $binding = $tradeBindingCollection->getItemById($tradeBinding[
'ID']);
1566 if ($binding ==
null)
1569 $internalIx[] = $binding->getId();
1572 foreach ($tradeBindingCollection as $binding)
1574 if(!in_array($binding->getId(), $internalIx))
1576 $r = $binding->delete();
1577 if (!$r->isSuccess())
1579 $this->errorsContainer->addErrors($r->getErrors());
1591 if($this->isStartField)
1593 $hasMeaningfulFields = $this->order->hasMeaningfulField();
1594 $r = $this->order->doFinalAction($hasMeaningfulFields);
1596 if(!$r->isSuccess())
1598 $this->errorsContainer->addErrors($r->getErrors());
1622 if($fieldName <>
'')
1624 $result = $this->formData[$fieldName] ??
null;
1642 reset($personTypes);
1643 return key($personTypes);
1654 $res = \Bitrix\Sale\Internals\PersonTypeTable::getList(
array(
1655 'order' =>
array(
'SORT' =>
'ASC',
'NAME' =>
'ASC'),
1656 'filter' =>
array(
'=ACTIVE' =>
'Y',
'=PERSON_TYPE_SITE.SITE_ID' =>
$siteId),
1659 while ($personType =
$res->fetch())
1670 $userId = (int)($this->formData[
"USER_ID"] ?? 0);
1688 if (
$userId > 0 && empty($this->formData[
"USER_ID"]))
1690 $this->formData[
"USER_ID"] =
$userId;
1707 $orderProps = $this->order->getPropertyCollection();
1709 if (
$email = $orderProps->getUserEmail())
1714 if (
$name = $orderProps->getPayerName())
1719 if ($phone = $orderProps->getPhone())
1721 $phone = $phone->getValue();
1739 $this->formData[
'SITE_ID'],
1742 'PERSONAL_PHONE' => $phone,
1743 'PHONE_NUMBER' => $phone,
1751 $this->errorsContainer->addError(
new Error(
$val[
'TEXT'], 0,
'USER'));
1773 private function searchExistingUser(
$email, $phone): ?int
1775 $existingUserId =
null;
1786 if (isset(
$res[
'ID']))
1788 $existingUserId = (int)
$res[
'ID'];
1792 if (!$existingUserId && !empty($phone))
1797 if (!empty($normalizedPhone))
1804 '=PHONE_AUTH.PHONE_NUMBER' => $normalizedPhoneForRegistration,
1805 '=PERSONAL_PHONE' => $normalizedPhone,
1806 '=PERSONAL_MOBILE' => $normalizedPhone,
1811 if (isset(
$res[
'ID']))
1813 $existingUserId = (int)
$res[
'ID'];
1818 return $existingUserId;
1824 $currentUserId =
null;
1827 $currentUserId = (int)
$USER->GetID();
1828 if ($currentUserId <= 0)
1830 $currentUserId =
null;
1834 return $currentUserId;