Server IP : 80.87.202.40 / Your IP : 216.73.216.169 Web Server : Apache System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64 User : bitrix ( 600) PHP Version : 8.2.27 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/vkapi.market/lib/sale/order/ |
Upload File : |
<?php namespace VKapi\Market\Sale\Order; use Bitrix\Main\Localization\Loc; use VKapi\Market\Manager; use VKapi\Market\Exception\BaseException; use VKapi\Market\Exception\ORMException; \Bitrix\Main\Localization\Loc::loadMessages(__FILE__); /** * ����� �� ����� � ������ ������� �� �� ��� ������� ��������� � �� */ class Item { const PAYMENT_STATUS_NOT_PAID = 'not_paid'; const PAYMENT_STATUS_PAID = 'paid'; const PAYMENT_STATUS_RETURNED = 'returned'; public const VK_STATUS_NEW = 0; public const VK_STATUS_AGREE = 1; public const VK_STATUS_COLLECT = 2; public const VK_STATUS_DELIVER = 3; public const VK_STATUS_COMPLETED = 4; public const VK_STATUS_CANCELED = 5; public const VK_STATUS_RETURNED = 6; /** * @var string ������ ����� �������� ����� */ private $vkOrderItem = null; /** * @var string ��� ������ 11212-867 */ private $vkOrderDisplayId = ''; /** * @var int ����� ������ */ private $vkOrderId = 0; /** * @var int ������ � ������� ������ ����� */ private $vkOrderGroupId = 0; /** * @var int ���������� ������� ������ */ private $vkOrderUserId = 0; /** * @var int ���� �������, Unixtime */ private $vkOrderDate = 0; /** * @var int ������ ������ 0-6 */ private $vkOrderStatus = 0; /** * @var string ������ ����� - not_paid, paid, returned */ private $vkOrderPaymentStatus = self::PAYMENT_STATUS_NOT_PAID; /** * ����� ���� ������ * @var int */ private $vkOrderTotalPrice = 0; /** * ������ �� ��������� * @var int */ private $vkOrderPromocodeDiscount = 0; private $vkOrderPromocodeDiscountCurrency = 'RUB'; /** * �������� �������� * @var int */ private $vkOrderDeliveryPrice = 0; private $vkOrderDeliveryPriceCurrency = 'RUB'; /** * ����� * @var int */ private $vkOrderCurrency = 'RUB'; /** * @var string ����������� ��������� */ private $vkOrderComment = ''; /** * @var string ����������� �������, ���������� */ private $vkOrderMerchantComment = ''; /** * @var string ����������� �� ���������� �� �������, � ������ 5.139 */ private $vkOrderCommentForUser = ''; /** * @var int ������ */ private $vkOrderWidth = 0; /** * @var int ����� */ private $vkOrderLength = 0; /** * @var int ����� */ private $vkOrderHeight = 0; /** * @var int ��� */ private $vkOrderWeight = 0; /** * @var string ����� �� ���������� ���, � ������ 5.159 */ private $vkOrderReceiptLink = ''; /** * @var array �������� �������� */ private $vkOrderDelivery = []; /** * @var string FIO ��������� */ private $vkOrderBuyerName = ''; /** * @var string ������� ��������� */ private $vkOrderBuyerPhone = ''; /** * @var array -������ ������� ������� �� �� */ private $vkOrderItems = []; /** * ��������� ����������� * @var Sync\Item */ private $oSyncItem = null; /** * @param $oSyncItem - ��������� ����������� */ public function __construct(\VKapi\Market\Sale\Order\Sync\Item $oSyncItem) { $this->oSyncItem = $oSyncItem; if (!$this->manager()->isInstalledSaleModule()) { throw new \VKapi\Market\Exception\BaseException($this->getMessage('MODULE_SALE_IS_NOT_INSTALLED'), 'ERROR_MODULE_SALE_NOT_FOUND'); } if (!$this->manager()->isInstalledCatalogModule()) { throw new \VKapi\Market\Exception\BaseException($this->getMessage('MODULE_CATALOG_IS_NOT_INSTALLED'), 'ERROR_MODULE_CATALOG_NOT_FOUND'); } if (!$this->manager()->isInstalledIblockModule()) { throw new \VKapi\Market\Exception\BaseException($this->getMessage('MODULE_IBLOCK_IS_NOT_INSTALLED'), 'ERROR_MODULE_IBLOCK_NOT_FOUND'); } } /** * * ������ ����� �� ����� \CUser * @return \CUser */ public function oldUser() { if (!isset($this->oOldUser)) { $this->oOldUser = new \CUser(); } return $this->oOldUser; } /** * ������ ����� �� Manager * @return \VKapi\Market\Manager */ public function manager() { return \VKapi\Market\Manager::getInstance(); } /** * @return \VKapi\Market\Sale\Order\Sync\Item */ public function syncItem() { return $this->oSyncItem; } /** * ������ ����� ����� �� ����� � ������� ����� ������ ������� � ������� � �� * Fields: ID:int, ORDER_ID:int, VKORDER_ID:int, VKUSER_ID:int, GROUP_ID:int, SYNC_ID:int */ public function syncRefTable() { if (!isset($this->oSyncRefTable)) { $this->oSyncRefTable = new \VKapi\Market\Sale\Order\Sync\RefTable(); } return $this->oSyncRefTable; } /** * ������ �������� */ public function getMessage($name, $arReplace = null) { return $this->manager()->getMessage('LIB.SALE.ORDER.ITEM.' . $name, $arReplace); } /** * �������� �������� ������ ������� �� ��, �� ��������� ��������� * @param $arItem */ public function setVkOrder(array $arItem) { $this->vkOrderItem = $arItem; $this->vkOrderId = (int) $arItem['id']; $this->vkOrderGroupId = (int) $arItem['group_id']; $this->vkOrderUserId = (int) $arItem['user_id']; $this->vkOrderDisplayId = (string) $arItem['display_order_id']; if (empty($this->vkOrderDisplayId)) { $this->vkOrderDisplayId = sprintf('%s-%s', $this->vkOrderUserId, $this->vkOrderId); } $this->vkOrderDate = (int) $arItem['date']; $this->vkOrderDeliveryPrice = (int) $arItem['delivery_price']; $this->vkOrderStatus = (int) $arItem['status']; $this->vkOrderPaymentStatus = (string) $arItem['payment']['payment_status']; $this->vkOrderCurrency = $arItem['total_price']['currency']['name']; $this->vkOrderTotalPrice = (int) $arItem['total_price']['amount'] / 100; $this->vkOrderComment = (string) $arItem['comment']; $this->vkOrderMerchantComment = (string) $arItem['merchant_comment']; $this->vkOrderCommentForUser = (string) ($arItem['comment_for_user'] ?: ''); $this->vkOrderWidth = (int) $arItem['dimensions']['width']; $this->vkOrderLength = (int) $arItem['dimensions']['length']; $this->vkOrderHeight = (int) $arItem['dimensions']['height']; $this->vkOrderWeight = (int) $arItem['weight']; $this->vkOrderReceiptLink = (string) ($arItem['receipt_link'] ?: ''); $this->vkOrderDelivery = $arItem['delivery']; $this->vkOrderBuyerName = (string) $arItem['recipient']['name']; $this->vkOrderBuyerPhone = (string) $arItem['recipient']['phone']; $this->vkOrderPromocodeDiscount = 0; $this->vkOrderDeliveryPrice = 0; if (!isset($arItem['price_details'])) { return $this; } $arPriceDetails = array_combine(array_column($arItem['price_details'], 'title'), $arItem['price_details']); if (isset($arPriceDetails[$this->getMessage('DELIVERY_COST')])) { $this->vkOrderDeliveryPrice = abs((int) $arPriceDetails[$this->getMessage('DELIVERY_COST')]['price']['amount'] ?? 0); $this->vkOrderDeliveryPriceCurrency = (string) $arPriceDetails[$this->getMessage('DELIVERY_COST')]['price']['currency']['name'] ?? 'RUB'; if ($this->vkOrderDeliveryPrice > 0) { $this->vkOrderDeliveryPrice = $this->vkOrderDeliveryPrice / 100; } } if (isset($arPriceDetails[$this->getMessage('PROMOCODE_COST')])) { $this->vkOrderPromocodeDiscount = abs((int) $arPriceDetails[$this->getMessage('PROMOCODE_COST')]['price']['amount'] ?? 0); $this->vkOrderPromocodeDiscountCurrency = (string) $arPriceDetails[$this->getMessage('PROMOCODE_COST')]['price']['currency']['name'] ?? 'RUB'; if ($this->vkOrderPromocodeDiscount > 0) { $this->vkOrderPromocodeDiscount = $this->vkOrderPromocodeDiscount / 100; } } return $this; } /** * �������� ����� ������ �������� �� �� * @param array $arVkOrderItems */ public function setVkOrderItems(array $arVkOrderItems) { $this->vkOrderItems = $arVkOrderItems; } /** * @return array */ public function getVkOrderItems() { return $this->vkOrderItems; } /** * �������� ��������� �� ������ ������� * @return false */ public function isExistOrder() { if (!empty($this->getOrderId())) { return true; } return false; } /** * ����� ID ��������� ������ ������������ ������ * @return mixed|null * @throws \Bitrix\Main\ArgumentException * @throws \Bitrix\Main\ObjectPropertyException * @throws \Bitrix\Main\SystemException */ public function getOrderId() { // �������� ������ ������ � ������ ����������� $dbr = $this->syncRefTable()->getList(['filter' => ['VKORDER_ID' => $this->vkOrderId, 'VKUSER_ID' => $this->vkOrderUserId], 'limit' => 1]); if ($ar = $dbr->fetch()) { return $ar['ORDER_ID']; } return null; } /** * ������� ������� ��������� ������ � ������ � �� * @param $orderId * @throws \VKapi\Market\Exception\BaseException * @throws \VKapi\Market\Exception\ORMException */ public function saveRef($orderId) { // �������� ������ ������ � ������ ����������� $ar = $this->syncRefTable()->getList(['filter' => ['VKORDER_ID' => $this->vkOrderId, 'VKUSER_ID' => $this->vkOrderUserId], 'limit' => 1])->fetch(); if ($ar) { // ���� ��������� if ($ar['ORDER_ID'] != $orderId) { throw new \VKapi\Market\Exception\BaseException($this->getMessage('ERROR_ORDER_ID_IS_DIFFERENT', ['#OLD_ID#' => $ar['ORDER_ID'], '#ID#' => $orderId])); } } else { $arFields = ['VKORDER_ID' => $this->vkOrderId, 'VKUSER_ID' => $this->vkOrderUserId, 'ORDER_ID' => $orderId, 'GROUP_ID' => $this->vkOrderGroupId, 'SYNC_ID' => $this->syncItem()->getId()]; $result = $this->syncRefTable()->add($arFields); if (!$result->isSuccess()) { throw new \VKapi\Market\Exception\ORMException($result); } } } /** * �������� ������, ������� ����� ������� ��� ���� ������� �� �� */ public function createOrder() { $registry = \Bitrix\Sale\Registry::getInstance(\Bitrix\Sale\Registry::REGISTRY_TYPE_ORDER); $userId = $this->findOrCreateUserId(); // �� ������������ $this->createSaleFUser($userId); /** * @var $basket \Bitrix\Sale\Basket */ $basketClassName = $registry->getBasketClassName(); $basket = $basketClassName::create($this->syncItem()->getSiteId()); if (count($this->vkOrderItems)) { // ������ �������� ��� ������� � ������� �� $vkBasketItemsCost = 0; foreach ($this->vkOrderItems as $vkOrderbasetItem) { $vkBasketItemsCost += (int) $vkOrderbasetItem['price']['amount'] / 100 * $vkOrderbasetItem["quantity"]; } // ��������� �� ������������ ������������ ������ $promocodeDiscountKoef = $this->vkOrderPromocodeDiscount / $vkBasketItemsCost; // �� ��������� � ���������� ������ ������� ������ $promocodeDiscount = $this->vkOrderPromocodeDiscount; $lastIndex = count($this->vkOrderItems) - 1; foreach ($this->vkOrderItems as $vkOrderBasketItemIndex => $vkOrderBasketItem) { // ��������� ������������� ������ �������� $arProduct = $this->getProductByVkOrderItem($vkOrderBasketItem); if (empty($arProduct)) { throw new \VKapi\Market\Exception\BaseException($this->getMessage('ERROR_VKITEM_NOT_FOUND', ['#NAME#' => $vkOrderBasketItem['title'], '#ID#' => $vkOrderBasketItem['item_id'], '#VKORDER_ID#' => $this->vkOrderDisplayId, '#GROUP_ID#' => $this->vkOrderGroupId]), 'ERROR_VK_ORDER_ITEM_NOT_FOUND', $vkOrderBasketItem); } $productFields = ["PRODUCT_ID" => $arProduct['ID'], "BASE_PRICE" => $arProduct['PRICE'], "CURRENCY" => $arProduct['CURRENCY'], "QUANTITY" => $arProduct['QUANTITY'], "LID" => $this->syncItem()->getSiteId(), "DELAY" => "N", "CAN_BUY" => "Y", "NAME" => $arProduct['NAME'], 'MODULE' => 'catalog', 'PRODUCT_PROVIDER_CLASS' => \Bitrix\Catalog\Product\Basket::getDefaultProviderName()]; $r = \Bitrix\Catalog\Product\Basket::addProductToBasket($basket, $productFields, ['USER_ID' => $userId, 'SITE_ID' => $this->syncItem()->getSiteId()]); if ($r->isSuccess()) { $resultData = $r->getData(); if (isset($resultData['BASKET_ITEM'])) { /** * @var \Bitrix\Sale\BasketItem $basketItem */ $basketItem = $resultData['BASKET_ITEM']; } else { throw new \VKapi\Market\Exception\BaseException('ERROR_ADD_BASKET_ITEM_TO_ORDER', 'ERROR_ADD_BASKET_ITEM_TO_ORDER'); } } else { throw new \VKapi\Market\Exception\BaseException($this->getMessage('ERROR_ADD_PRODUCT_TO_BASKET', ['#PRODUCT_ID#' => $arProduct['ID'], '#MESSAGE#' => $r->getErrorCollection()->current()->getMessage()]), 'ERROR_ADD_BASKET_ITEM_TO_ORDER'); } if (!$this->vkOrderPromocodeDiscount) { $basketItem->setPrice($arProduct['PRICE'], true); } else { if ($lastIndex > $vkOrderBasketItemIndex) { $value = floor($arProduct['PRICE'] * $promocodeDiscountKoef); $basketItem->setPrice($arProduct['PRICE'] - $value, true); $promocodeDiscount -= $value * $arProduct['QUANTITY']; } else { $basketItem->setPrice($arProduct['PRICE'] - $promocodeDiscount / $arProduct['QUANTITY'], true); } } } } /** * @var $order \Bitrix\Sale\Order */ $orderClassName = $registry->getOrderClassName(); $order = $orderClassName::create($this->syncItem()->getSiteId(), $userId); $order->setPersonTypeId($this->syncItem()->getPersonalTypeId()); $order->setBasket($basket); /** * @var $shipment \Bitrix\Sale\Shipment */ $shipmentCollection = $order->getShipmentCollection(); $deliveryType = mb_strtolower($this->vkOrderDelivery["type"]); if (strpos($deliveryType, mb_strtolower($this->getMessage('DELIVERY_TYPE_POINT'))) !== false) { $deliveryType = mb_strtolower($this->getMessage('DELIVERY_TYPE_POINT')); } // ��� �������� $shipment = null; switch ($deliveryType) { case mb_strtolower($this->getMessage('DELIVERY_TYPE_COURIER')): // 'address' => '�����, ������, ����, ���: ����, ������: ������, ��� ��������: ��� ��������, ����: ����, ��������/����: ��������', // 'type' => '�������� ��������', if ($this->syncItem()->getDeliveryIdCourier()) { $shipment = $shipmentCollection->createItem(\Bitrix\Sale\Delivery\Services\Manager::getObjectById($this->syncItem()->getDeliveryIdCourier())); } elseif ($this->syncItem()->getDeliveryId()) { $shipment = $shipmentCollection->createItem(\Bitrix\Sale\Delivery\Services\Manager::getObjectById($this->syncItem()->getDeliveryId())); } break; case mb_strtolower($this->getMessage('DELIVERY_TYPE_POCHTA')): // 'address' => '143921, �����, ������, �������, � ������, �����������, 1, 112', // 'type' => '� �������� ������� ���������', if ($this->syncItem()->getDeliveryIdPochta()) { $shipment = $shipmentCollection->createItem(\Bitrix\Sale\Delivery\Services\Manager::getObjectById($this->syncItem()->getDeliveryIdPochta())); } elseif ($this->syncItem()->getDeliveryId()) { $shipment = $shipmentCollection->createItem(\Bitrix\Sale\Delivery\Services\Manager::getObjectById($this->syncItem()->getDeliveryId())); } break; case mb_strtolower($this->getMessage('DELIVERY_TYPE_POINT')): // [ // 'address' => '��������� ��, �.26, ������ 2, ������, +7 (499) 391-56-22', // 'type' => '�������� � ����� ���� Boxberry', // 'delivery_point' => // [ // 'id' => 1870, // 'external_id' => '10.039', // 'outpost_only' => false, // 'cash_only' => false, // 'address' => // [ // 'id' => 59208, // 'additional_address' => '����� ����������. // 17-������� ���. // ���� - 1 // ����� ����� ��� �� �����, ��� �� ������� ���.', // 'address' => '��������� ��, �.26, ������ 2', // 'city_id' => 1, // 'country_id' => 1, // 'latitude' => 55.743365, // 'longitude' => 37.861474, // 'metro_station_id' => 37, // 'phone' => '+7 (499) 391-56-22', // 'timetable' => // [ // 'fri' => // [ // 'close_time' => 1200, // 'open_time' => 600, // 'break_close_time' => 0, // 'break_open_time' => 0, // ], // 'mon' => // [ // 'close_time' => 1200, // 'open_time' => 600, // 'break_close_time' => 0, // 'break_open_time' => 0, // ], // 'sat' => // [ // 'close_time' => 1200, // 'open_time' => 600, // 'break_close_time' => 0, // 'break_open_time' => 0, // ], // 'sun' => // [ // 'close_time' => 1200, // 'open_time' => 600, // 'break_close_time' => 0, // 'break_open_time' => 0, // ], // 'thu' => // [ // 'close_time' => 1200, // 'open_time' => 600, // 'break_close_time' => 0, // 'break_open_time' => 0, // ], // 'tue' => // [ // 'close_time' => 1200, // 'open_time' => 600, // 'break_close_time' => 0, // 'break_open_time' => 0, // ], // 'wed' => // [ // 'close_time' => 1200, // 'open_time' => 600, // 'break_close_time' => 0, // 'break_open_time' => 0, // ], // ], // 'title' => '������ ���������_7739_�', // 'work_info_status' => 'timetable', // ], // 'display_title' => 'Boxberry, �����', // 'service_id' => 2, // ], // ] if ($this->syncItem()->getDeliveryIdPoint()) { $shipment = $shipmentCollection->createItem(\Bitrix\Sale\Delivery\Services\Manager::getObjectById($this->syncItem()->getDeliveryIdPoint())); } elseif ($this->syncItem()->getDeliveryId()) { $shipment = $shipmentCollection->createItem(\Bitrix\Sale\Delivery\Services\Manager::getObjectById($this->syncItem()->getDeliveryId())); } break; case mb_strtolower($this->getMessage('DELIVERY_TYPE_PICKUP')): default: // 'address' => '', // 'type' => '��������', if ($this->syncItem()->getDeliveryId()) { $shipment = $shipmentCollection->createItem(\Bitrix\Sale\Delivery\Services\Manager::getObjectById($this->syncItem()->getDeliveryId())); } } if (!is_null($shipment)) { $shipment->setBasePriceDelivery($this->vkOrderDeliveryPrice, true); $shipment->setField('PRICE_DELIVERY', $this->vkOrderDeliveryPrice); if (!empty($this->vkOrderDelivery['track_number'])) { $shipment->setField('TRACKING_NUMBER', $this->vkOrderDelivery['track_number']); } /** * @var \Bitrix\Sale\BasketItem $basketItem */ $shipmentItemCollection = $shipment->getShipmentItemCollection(); foreach ($basket as $basketItem) { $item = $shipmentItemCollection->createItem($basketItem); $item->setQuantity($basketItem->getQuantity()); } } // ������ ----- $paymentCollection = $order->getPaymentCollection(); if ($this->syncItem()->getPaymentId()) { $payment = $paymentCollection->createItem(\Bitrix\Sale\PaySystem\Manager::getObjectById($this->syncItem()->getPaymentId())); $payment->setField("CURRENCY", $this->vkOrderCurrency); $payment->setField("SUM", $order->getPrice()); if ($this->vkOrderPaymentStatus == self::PAYMENT_STATUS_PAID) { $payment->setPaid('Y'); $payment->setField('COMMENTS', $this->getMessage('SET_PAID_Y', ['#DATE#' => date('d.m.Y H:i:s')])); } } /** * @var $propValue \Bitrix\Sale\PropertyValue */ $propertyCollection = $order->getPropertyCollection(); if ($this->syncItem()->getFioPropertyId()) { $propValue = $this->findPropValueByPropId($propertyCollection, $this->syncItem()->getFioPropertyId()); if ($propValue) { $propValue->setValue($this->vkOrderBuyerName); } } if ($this->syncItem()->getPhonePropertyId()) { $propValue = $this->findPropValueByPropId($propertyCollection, $this->syncItem()->getPhonePropertyId()); if ($propValue) { $propValue->setValue($this->vkOrderBuyerPhone); } } if ($this->syncItem()->getVkOrderPropertyId()) { $propValue = $this->findPropValueByPropId($propertyCollection, $this->syncItem()->getVkOrderPropertyId()); if ($propValue) { $propValue->setValue($this->vkOrderUserId . '-' . $this->vkOrderId); } } if ($this->syncItem()->getAddressPropertyId()) { $propValue = $this->findPropValueByPropId($propertyCollection, $this->syncItem()->getAddressPropertyId()); if ($propValue) { $propValue->setValue((string) $this->vkOrderDelivery['address']); } } if ($this->syncItem()->getCommentForUserPropertyId()) { $propValue = $this->findPropValueByPropId($propertyCollection, $this->syncItem()->getCommentForUserPropertyId()); if ($propValue) { $propValue->setValue($this->vkOrderCommentForUser); } } if ($this->syncItem()->getWidthPropertyId()) { $propValue = $this->findPropValueByPropId($propertyCollection, $this->syncItem()->getWidthPropertyId()); if ($propValue) { $propValue->setValue($this->vkOrderWidth); } } if ($this->syncItem()->getHeightPropertyId()) { $propValue = $this->findPropValueByPropId($propertyCollection, $this->syncItem()->getHeightPropertyId()); if ($propValue) { $propValue->setValue($this->vkOrderHeight); } } if ($this->syncItem()->getLengthPropertyId()) { $propValue = $this->findPropValueByPropId($propertyCollection, $this->syncItem()->getLengthPropertyId()); if ($propValue) { $propValue->setValue($this->vkOrderLength); } } if ($this->syncItem()->getWeightPropertyId()) { $propValue = $this->findPropValueByPropId($propertyCollection, $this->syncItem()->getWeightPropertyId()); if ($propValue) { $propValue->setValue($this->vkOrderWeight); } } $order->setField('DATE_INSERT', \Bitrix\Main\Type\DateTime::createFromTimestamp($this->vkOrderDate)); $order->setField('USER_DESCRIPTION', $this->vkOrderComment); $order->setField('COMMENTS', $this->vkOrderMerchantComment); if ($this->vkOrderPromocodeDiscount) { $order->setField('COMMENTS', $this->getMessage('PROMOCODE_COST_COMMENT', ['#COMMENT#' => $this->vkOrderMerchantComment, '#DISCOUNT#' => $this->vkOrderPromocodeDiscount, '#CURRENCY#' => $this->vkOrderPromocodeDiscountCurrency])); } $statusId = $this->syncItem()->getStatusIdByVkStatus($this->vkOrderStatus); if (!empty($statusId)) { $resultSetStatus = $order->setField('STATUS_ID', $statusId); if (!$resultSetStatus->isSuccess()) { throw new \VKapi\Market\Exception\BaseException($resultSetStatus->getErrorCollection()->current()->getMessage(), 'ERROR_SALE_ORDER_ITEM_SET_STATUS'); } } // ������ $this->manager()->sendEvent(\VKapi\Market\Manager::EVENT_ON_BEFORE_ORDER_CREATE, ['order' => $order, 'item' => $this]); $result = $order->save(); if (!$result->isSuccess()) { throw new \VKapi\Market\Exception\ORMException($result); } $this->saveRef($result->getId()); // ������ $this->manager()->sendEvent(\VKapi\Market\Manager::EVENT_ON_AFTER_ORDER_CREATE, ['order' => $order, 'item' => $this]); return $result->getId(); } /** * ���������� ������, ������� ����� ������� ��������� ������� ������ ���������� �� �� */ public function updateOrder() { $orderId = (int) $this->getOrderId(); $registry = \Bitrix\Sale\Registry::getInstance(\Bitrix\Sale\Registry::REGISTRY_TYPE_ORDER); /** * @var $orderClassName \Bitrix\Sale\Order * @var $order \Bitrix\Sale\Order */ $orderClassName = $registry->getOrderClassName(); $order = $orderClassName::load($orderId); if (empty($order)) { throw new \VKapi\Market\Exception\BaseException($this->getMessage('ERROR_ORDER_NOT_FOUND', ['#ORDER_ID#' => $orderId, '#VKORDER_ID#' => $this->vkOrderDisplayId, '#GROUP_ID#' => $this->vkOrderGroupId]), 'ERROR_ORDER_NOT_FOUND'); } /** * @var $payment \Bitrix\Sale\Payment */ $paymentCollection = $order->getPaymentCollection(); $payment = $paymentCollection->getItemByIndex(0); if (!is_null($payment)) { if ($this->vkOrderPaymentStatus == self::PAYMENT_STATUS_PAID && !$payment->isPaid()) { $payment->setField('COMMENTS', $this->getMessage('SET_PAID_Y', ['#DATE#' => date('d.m.Y H:i:s')])); $resPayment = $payment->setPaid('Y'); } elseif ($this->vkOrderPaymentStatus != self::PAYMENT_STATUS_PAID && $payment->isPaid()) { $payment->setField('COMMENTS', $this->getMessage('SET_PAID_N', ['#DATE#' => date('d.m.Y H:i:s')])); $resPayment = $payment->setPaid('N'); } if ($payment->getSum() <= 0 && $payment->getSumPaid() <= 0) { $payment->setField("SUM", $order->getPrice()); } if ($resPayment instanceof \Bitrix\Sale\Result && !$resPayment->isSuccess()) { throw new \VKapi\Market\Exception\BaseException($this->getMessage('ERROR_SALE_ORDER_ITEM_SET_PAYMENT_STATUS', ['#ORDER_ID#' => $orderId, '#VKORDER_ID#' => $this->vkOrderDisplayId, '#GROUP_ID#' => $this->vkOrderGroupId, '#MSG#' => $resPayment->getErrorCollection()->current()->getMessage()]), 'ERROR_SALE_ORDER_ITEM_SET_PAYMENT_STATUS'); } } $order->setField('COMMENTS', $this->vkOrderMerchantComment); /** * @var $propValue \Bitrix\Sale\PropertyValue */ $propertyCollection = $order->getPropertyCollection(); if ($this->syncItem()->getCommentForUserPropertyId()) { $propValue = $this->findPropValueByPropId($propertyCollection, $this->syncItem()->getCommentForUserPropertyId()); if ($propValue) { $propValue->setValue($this->vkOrderCommentForUser); } } if ($this->syncItem()->getWidthPropertyId()) { $propValue = $this->findPropValueByPropId($propertyCollection, $this->syncItem()->getWidthPropertyId()); if ($propValue) { $propValue->setValue($this->vkOrderWidth); } } if ($this->syncItem()->getHeightPropertyId()) { $propValue = $this->findPropValueByPropId($propertyCollection, $this->syncItem()->getHeightPropertyId()); if ($propValue) { $propValue->setValue($this->vkOrderHeight); } } if ($this->syncItem()->getLengthPropertyId()) { $propValue = $this->findPropValueByPropId($propertyCollection, $this->syncItem()->getLengthPropertyId()); if ($propValue) { $propValue->setValue($this->vkOrderLength); } } if ($this->syncItem()->getWeightPropertyId()) { $propValue = $this->findPropValueByPropId($propertyCollection, $this->syncItem()->getWeightPropertyId()); if ($propValue) { $propValue->setValue($this->vkOrderWeight); } } $order->setField('USER_DESCRIPTION', $this->vkOrderComment); $order->setField('COMMENTS', $this->vkOrderMerchantComment); $statusId = $this->syncItem()->getStatusIdByVkStatus($this->vkOrderStatus); if (!empty($statusId) && $order->getField('STATUS_ID') != $statusId) { $resultSetStatus = $order->setField('STATUS_ID', $statusId); if (!$resultSetStatus->isSuccess()) { throw new \VKapi\Market\Exception\BaseException($this->getMessage('ERROR_SALE_ORDER_ITEM_SET_STATUS', ['#ORDER_ID#' => $orderId, '#VKORDER_ID#' => $this->vkOrderDisplayId, '#GROUP_ID#' => $this->vkOrderGroupId, '#MSG#' => $resPayment->getErrorCollection()->current()->getMessage()]), 'ERROR_SALE_ORDER_ITEM_SET_STATUS'); } } /** * @var $shipmentItem \Bitrix\Sale\Shipment */ $shipmentCollection = $order->getShipmentCollection(); $shipment = null; foreach ($shipmentCollection as $shipmentItem) { if ($shipmentItem->isSystem()) { continue; } $shipment = $shipmentItem; break; } if (is_null($shipment)) { $shipment = null; $deliveryType = mb_strtolower($this->vkOrderDelivery["type"]); if (strpos($deliveryType, mb_strtolower($this->getMessage('DELIVERY_TYPE_POINT'))) !== false) { $deliveryType = mb_strtolower($this->getMessage('DELIVERY_TYPE_POINT')); } switch ($deliveryType) { case mb_strtolower($this->getMessage('DELIVERY_TYPE_COURIER')): // 'address' => '�����, ������, ����, ���: ����, ������: ������, ��� ��������: ��� ��������, ����: ����, ��������/����: ��������', // 'type' => '�������� ��������', if ($this->syncItem()->getDeliveryIdCourier()) { $shipment = $shipmentCollection->createItem(\Bitrix\Sale\Delivery\Services\Manager::getObjectById($this->syncItem()->getDeliveryIdCourier())); } elseif ($this->syncItem()->getDeliveryId()) { $shipment = $shipmentCollection->createItem(\Bitrix\Sale\Delivery\Services\Manager::getObjectById($this->syncItem()->getDeliveryId())); } break; case mb_strtolower($this->getMessage('DELIVERY_TYPE_POCHTA')): // 'address' => '143921, �����, ������, �������, � ������, �����������, 1, 112', // 'type' => '� �������� ������� ���������', if ($this->syncItem()->getDeliveryIdPochta()) { $shipment = $shipmentCollection->createItem(\Bitrix\Sale\Delivery\Services\Manager::getObjectById($this->syncItem()->getDeliveryIdPochta())); } elseif ($this->syncItem()->getDeliveryId()) { $shipment = $shipmentCollection->createItem(\Bitrix\Sale\Delivery\Services\Manager::getObjectById($this->syncItem()->getDeliveryId())); } break; case mb_strtolower($this->getMessage('DELIVERY_TYPE_POINT')): // [ // 'address' => '��������� ��, �.26, ������ 2, ������, +7 (499) 391-56-22', // 'type' => '�������� � ����� ���� Boxberry', // 'delivery_point' => // [ // 'id' => 1870, // 'external_id' => '10.039', // 'outpost_only' => false, // 'cash_only' => false, // 'address' => // [ // 'id' => 59208, // 'additional_address' => '����� ����������. // 17-������� ���. // ���� - 1 // ����� ����� ��� �� �����, ��� �� ������� ���.', // 'address' => '��������� ��, �.26, ������ 2', // 'city_id' => 1, // 'country_id' => 1, // 'latitude' => 55.743365, // 'longitude' => 37.861474, // 'metro_station_id' => 37, // 'phone' => '+7 (499) 391-56-22', // 'timetable' => // [ // 'fri' => // [ // 'close_time' => 1200, // 'open_time' => 600, // 'break_close_time' => 0, // 'break_open_time' => 0, // ], // 'mon' => // [ // 'close_time' => 1200, // 'open_time' => 600, // 'break_close_time' => 0, // 'break_open_time' => 0, // ], // 'sat' => // [ // 'close_time' => 1200, // 'open_time' => 600, // 'break_close_time' => 0, // 'break_open_time' => 0, // ], // 'sun' => // [ // 'close_time' => 1200, // 'open_time' => 600, // 'break_close_time' => 0, // 'break_open_time' => 0, // ], // 'thu' => // [ // 'close_time' => 1200, // 'open_time' => 600, // 'break_close_time' => 0, // 'break_open_time' => 0, // ], // 'tue' => // [ // 'close_time' => 1200, // 'open_time' => 600, // 'break_close_time' => 0, // 'break_open_time' => 0, // ], // 'wed' => // [ // 'close_time' => 1200, // 'open_time' => 600, // 'break_close_time' => 0, // 'break_open_time' => 0, // ], // ], // 'title' => '������ ���������_7739_�', // 'work_info_status' => 'timetable', // ], // 'display_title' => 'Boxberry, �����', // 'service_id' => 2, // ], // ] if ($this->syncItem()->getDeliveryIdPoint()) { $shipment = $shipmentCollection->createItem(\Bitrix\Sale\Delivery\Services\Manager::getObjectById($this->syncItem()->getDeliveryIdPoint())); } elseif ($this->syncItem()->getDeliveryId()) { $shipment = $shipmentCollection->createItem(\Bitrix\Sale\Delivery\Services\Manager::getObjectById($this->syncItem()->getDeliveryId())); } break; case mb_strtolower($this->getMessage('DELIVERY_TYPE_PICKUP')): default: // 'address' => '', // 'type' => '��������', if ($this->syncItem()->getDeliveryId()) { $shipment = $shipmentCollection->createItem(\Bitrix\Sale\Delivery\Services\Manager::getObjectById($this->syncItem()->getDeliveryId())); } } } if (!is_null($shipment) && !empty($this->vkOrderDelivery['track_number']) && $this->vkOrderDelivery['track_number'] != $shipment->getField('TRACKING_NUMBER')) { $shipment->setField('TRACKING_NUMBER', $this->vkOrderDelivery['track_number']); } // ������ $this->manager()->sendEvent(\VKapi\Market\Manager::EVENT_ON_BEFORE_ORDER_UPDATE, ['order' => $order, 'item' => $this]); $result = $order->save(); if (!$result->isSuccess()) { throw new \VKapi\Market\Exception\ORMException($result); } return $result->getId(); } /** * ���������� ������ ��������, ������� ��� ������ ����� ���� * @param $phone * @return array|string|string[]|null */ protected function preparePhone($phone) { $phone = preg_replace('/[^\\d]+/', '', $phone); $phoneNumber = \Bitrix\Main\PhoneNumber\Parser::getInstance()->parse('+' . $phone); // ���������� ����������� ������ if (!$phoneNumber->isValid() || is_null($phoneNumber->getCountry())) { $phoneTmp = preg_replace('/^0([0-9]{9})$/', '380\\1', $phone); $phoneNumber = \Bitrix\Main\PhoneNumber\Parser::getInstance()->parse('+' . $phoneTmp); } // ������ 8 �� 7 � �������� ������ if (!$phoneNumber->isValid() || is_null($phoneNumber->getCountry())) { $phoneTmp = preg_replace('/^8([0-9]{10})$/', '7\\1', $phone); $phoneNumber = \Bitrix\Main\PhoneNumber\Parser::getInstance()->parse('+' . $phoneTmp); } // ������� ����� ������� ������ ��������������� $phone = preg_replace('/^\\+/', '', $phoneNumber->format(\Bitrix\Main\PhoneNumber\Format::E164)); // ���� �� ������� ������� // ����������� 7 � ����� ������ if (!$phoneNumber->isValid() && strlen($phone) == 10) { $phoneNumber = \Bitrix\Main\PhoneNumber\Parser::getInstance()->parse('+7' . $phone); if ($phoneNumber->isValid()) { $phone = preg_replace('/^\\+/', '', $phoneNumber->format(\Bitrix\Main\PhoneNumber\Format::E164)); } } return $phone; } /** * �������� ���������� ������ �������� �� ����� ���������� ��� ������� ������ * @param $phone * @return bool */ protected function isValidPhone($phone) { $phone = $this->preparePhone($phone); $phoneNumber = \Bitrix\Main\PhoneNumber\Parser::getInstance()->parse('+' . $phone); if ($phoneNumber->isValid()) { return true; } return false; } /** * ����� ���������� �� ������ �������� * @param $phone * @return array|false * @throws \Bitrix\Main\ArgumentException * @throws \Bitrix\Main\ObjectPropertyException * @throws \Bitrix\Main\SystemException */ protected function findUserByPhone($phone) { $phone = $this->preparePhone($this->vkOrderBuyerPhone); if (strlen(trim($phone)) <= 0) { return false; } $arFilter = ['PHONE_NUMBER' => '+' . $phone]; $dbrUser = \Bitrix\Main\UserTable::getList(['limit' => 1, 'order' => ['ID' => 'ASC'], 'filter' => $arFilter, 'select' => ['ID', 'PHONE_NUMBER' => 'PHONE_AUTH.PHONE_NUMBER', 'ACTIVE']]); $arUser = $dbrUser->fetch(); return $arUser; } /** * �������� ������ �� ����� ��������� ��������� ��� ���������� * @return bool|mixed */ public function isRequiredUserPhone() { static $flag; if (!isset($flag)) { $flag = \Bitrix\Main\Config\Option::get('main', 'new_user_phone_required', 'N') == 'Y'; } return $flag; } /** * ������ ���������� �� ������ ��������, ���� ���, �� �������� � ������ ������������� * @return int|mixed|string * @throws \Bitrix\Main\ArgumentException * @throws \Bitrix\Main\ObjectPropertyException * @throws \Bitrix\Main\SystemException * @throws \VKapi\Market\Exception\BaseException */ protected function findOrCreateUserId() { $arAddFields = []; $phone = $this->preparePhone($this->vkOrderBuyerPhone); if ($this->isValidPhone($phone)) { // ��� ���������� $arUser = $this->findUserByPhone($phone); if ($arUser) { return $arUser['ID']; } $arAddFields['PHONE_NUMBER'] = '+' . $phone; } elseif ($this->isRequiredUserPhone()) { // ������� �� ������� ���� ������� �� ������� ����� �������� $arAddFields['PHONE_NUMBER'] = '+79999999999'; } // ��� �� XML_ID------------------------------- $dbrUser = \Bitrix\Main\UserTable::getList(['limit' => 1, 'filter' => ["XML_ID" => 'vkapi_market_user_' . $this->vkOrderUserId], 'select' => ['ID']]); if ($arUser = $dbrUser->fetch()) { return $arUser['ID']; } // �� �����, ������� ----------------------- // ��� --- $arParts = explode(' ', $this->vkOrderBuyerName); $arParts = array_map('trim', $arParts); $arParts = array_values(array_diff($arParts, [''])); if (count($arParts) > 2) { $arAddFields['NAME'] = $arParts[0]; $arAddFields['LAST_NAME'] = $arParts[1]; $arAddFields['SECOND_NAME'] = $arParts[2]; } elseif (count($arParts) > 1) { $arAddFields['NAME'] = $arParts[0]; $arAddFields['LAST_NAME'] = $arParts[1]; } elseif (count($arParts) > 0) { $arAddFields['NAME'] = $arParts[0]; } $userId = $this->createUser($arAddFields); return $userId; } /** * ���������� ���������� * @param $arFields * @return int|mixed|string * @throws \VKapi\Market\Exception\BaseException */ protected function createUser($arFields) { global $APPLICATION, $DB, $USER_FIELD_MANAGER; $oUserTypeEntity = new \CUserTypeEntity(); $oUserFieldEnum = new \CUserFieldEnum(); $APPLICATION->ResetException(); $randomEmail = \Bitrix\Main\Security\Random::getString(10) . '@local.loc'; $checkword = md5(uniqid() . \CMain::GetServerUniqID()); $arFields = array_merge(["CHECKWORD" => \Bitrix\Main\Security\Password::hash($checkword), "~CHECKWORD_TIME" => $DB->CurrentTimeFunction(), "EMAIL" => $randomEmail, "ACTIVE" => "Y", "NAME" => "", "XML_ID" => 'vkapi_market_user_' . (int) $this->vkOrderUserId, "LAST_NAME" => "", "SITE_ID" => $this->syncItem()->getSiteId(), "LANGUAGE_ID" => LANGUAGE_ID], $arFields); // ����� ���������� if (!isset($arFields["GROUP_ID"])) { $def_group = \COption::GetOptionString("main", "new_user_registration_def_group", ""); if ($def_group != "") { $arFields["GROUP_ID"] = explode(",", $def_group); } else { $arFields["GROUP_ID"] = []; } } $arFields["PASSWORD"] = $arFields["CONFIRM_PASSWORD"] = \CUser::GeneratePasswordByPolicy($arFields["GROUP_ID"]); $arFields["LID"] = $arFields["SITE_ID"]; $arFields["CHECKWORD"] = $checkword; // ������� ��������� ��� �� ��������� � ��������� ����� ������ ��� ������ ���������, ���� �� ���������� ���������� $dbrUserTypeEntity = $oUserTypeEntity->GetList([], ['ENTITY_ID' => 'USER', 'MANDATORY' => 'Y']); while ($arUserTypeEntity = $dbrUserTypeEntity->Fetch()) { if (array_key_exists($arUserTypeEntity['FIELD_NAME'], $arFields)) { continue; } switch ($arUserTypeEntity['USER_TYPE_ID']) { case 'string': if ($arUserTypeEntity['MIN_LENGTH']) { $arFields[$arUserTypeEntity['FIELD_NAME']] = str_repeat('0', $arUserTypeEntity['MIN_LENGTH']); } break; case 'integer': case 'double': case 'file': $arFields[$arUserTypeEntity['FIELD_NAME']] = 0; break; case 'datetime': $arFields[$arUserTypeEntity['FIELD_NAME']] = date('d.m.Y H:i:s'); break; case 'date': $arFields[$arUserTypeEntity['FIELD_NAME']] = date('d.m.Y'); break; case 'boolean': $arFields[$arUserTypeEntity['FIELD_NAME']] = false; break; case 'enumeration': $dbrEnumValues = $oUserFieldEnum->GetList([], ['USER_FIELD_ID' => $arUserTypeEntity['ID'], 'DEF' => 'Y']); if ($arEnumValue = $dbrEnumValues->Fetch()) { $arFields[$arUserTypeEntity['FIELD_NAME']] = $arEnumValue['ID']; break; } $dbrEnumValues = $oUserFieldEnum->GetList(['SORT' => 'ASC'], ['USER_FIELD_ID' => $arUserTypeEntity['ID']]); if ($arEnumValue = $dbrEnumValues->Fetch()) { $arFields[$arUserTypeEntity['FIELD_NAME']] = $arEnumValue['ID']; } break; case 'video': case 'hlblock': case 'iblock_section': case 'iblock_element': case 'string_formatted': break; } } foreach (GetModuleEvents("vkapi.market", "OnBeforeUserAdd", true) as $arEvent) { if (ExecuteModuleEventEx($arEvent, [&$arFields]) === false) { // wait true or \VKapi\Market\Exception\BaseException } } $bRandLogin = false; if (!is_set($arFields, "LOGIN")) { $arFields["LOGIN"] = \Bitrix\Main\Security\Random::getString(50); $bRandLogin = true; } $userId = (int) $this->oldUser()->add($arFields); if (!$userId) { throw new \VKapi\Market\Exception\BaseException($this->getMessage('ERROR_CREATE_USER', ['#MSG#' => $this->oldUser()->LAST_ERROR]), 'ERROR_CREATE_USER', ['vkOrderId' => $this->vkOrderDisplayId, 'arFields' => $arFields]); } if ($bRandLogin) { $this->oldUser()->Update($userId, ["LOGIN" => "user" . $userId]); $arFields["LOGIN"] = "user" . $userId; } // �������� ���������� email if ($arFields['EMAIL'] == $randomEmail) { $DB->Query("UPDATE b_user SET EMAIL='' WHERE ID=" . $userId); $arFields['EMAIL'] = ''; } // �������� ���������� ������ �������� if ($this->isRequiredUserPhone() && $arFields['PHONE_NUMBER'] == '+79999999999') { $this->deleteTemporaryPhone($userId); } $arFields["USER_ID"] = $userId; $arEventFields = $arFields; unset($arEventFields["PASSWORD"]); unset($arEventFields["CONFIRM_PASSWORD"]); foreach (GetModuleEvents("vkapi.market", "OnAfterUserAdd", true) as $arEvent) { if (ExecuteModuleEventEx($arEvent, [&$arFields]) === false) { // wait true or \VKapi\Market\Exception\BaseException } } return $userId; } /** * ������ �������� ����� �������� * @return void * @throws \Bitrix\Main\ArgumentException * @throws \Bitrix\Main\ObjectPropertyException * @throws \Bitrix\Main\SystemException */ public function deleteTemporaryPhone($userId = 0) { $filter = ['PHONE_NUMBER' => '+79999999999']; if ($userId > 0) { $filter['USER_ID'] = $userId; } $dbr = \Bitrix\Main\UserPhoneAuthTable::getList(['select' => ['ID'], 'filter' => $filter]); if ($ar = $dbr->fetch()) { \Bitrix\Main\UserPhoneAuthTable::delete($ar['ID']); } } /** * ������� ���������� �� ������, �� �� ������� � ��������� � ����� * @param $userId * @return false|int|mixed|null */ public function createSaleFUser($userId) { /** * #bx_651765591_15581938 * ������ �������� (logvinov@braind.agecy) �������29 ����� 2022 14:15 * ������������, ��� ����� ������� ������� ��������� �����: Call to undefined method Bitrix\Sale\ResultError::getField() * ��� �������������: ������ �� Callback API - [100] Argument 'FUSER_ID' is null or empty */ global $DB; $userId = intval($userId); if (!$userId) { return 0; } $arFUserListTmp = \CSaleUser::GetList(["USER_ID" => $userId]); if (!empty($arFUserListTmp)) { return $arFUserListTmp['ID']; } $arFields = ["=DATE_INSERT" => $DB->GetNowFunction(), "=DATE_UPDATE" => $DB->GetNowFunction(), "USER_ID" => $userId, "CODE" => md5(time() . \Bitrix\Main\Security\Random::getString(10, true))]; $fUserId = (int) \CSaleUser::_Add($arFields); return $fUserId; } /** * ���������� ����� �������� �������� ������ � ������ * @param $arVkOrderItem * @return null|mixed */ public function getProductByVkOrderItem($arVkOrderItem) { if (!isset($arVkOrderItem['item'])) { return null; } $vkItemId = (int) $arVkOrderItem['item']['id']; $vkGroupId = abs((int) $arVkOrderItem['item']['owner_id']); $historyGood = new \VKapi\Market\Export\History\Good(); $arElement = $historyGood->findElementByVkIdGroupId($vkItemId, $vkGroupId); if (!$arElement) { return null; } $arReturn = ['ID' => $arElement['ID'], 'NAME' => $arElement['NAME'] ?? $arVkOrderItem['item']['name'], 'PRICE' => (int) $arVkOrderItem['price']['amount'] / 100, 'CURRENCY' => (string) $arVkOrderItem['price']['currency']['name'], 'QUANTITY' => (int) $arVkOrderItem['quantity']]; return $arReturn; } /** * ������ ����� �� ������� �������� �� ���� �������� * @param $propCollection * @param $propId * @return mixed|null */ public function findPropValueByPropId($propCollection, $propId) { /** * @var \Bitrix\Sale\Internals\CollectableEntity[] * @var $item \Bitrix\Sale\Internals\CollectableEntity|\Bitrix\Sale\PropertyValue * */ foreach ($propCollection as $item) { if ($item->getPropertyId() > 0 && $propId == $item->getPropertyId()) { return $propCollection[$item->getInternalIndex()]; } } return null; } } ?>