%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/bitrix/www/bitrix/modules/sale/lib/helpers/admin/blocks/
Upload File :
Create Path :
Current File : //home/bitrix/www/bitrix/modules/sale/lib/helpers/admin/blocks/orderbasketshipment.php

<?php

namespace Bitrix\Sale\Helpers\Admin\Blocks;

use Bitrix\Highloadblock as HL;
use Bitrix\Main\Config\Option;
use Bitrix\Main\Loader;
use Bitrix\Main\Localization\Loc;
use Bitrix\Sale\Order;
use Bitrix\Sale\Result;
use Bitrix\Sale\ResultError;
use Bitrix\Sale\Shipment;
use Bitrix\Sale\UserMessageException;
use Bitrix\Main\Entity\EntityError;
use Bitrix\Sale\Configuration;

Loc::loadMessages(__FILE__);

require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/sale/general/admin_tool.php");

class OrderBasketShipment extends OrderBasket
{
	protected $shipment = null;
	protected static $useStoreControl = null;
	protected $systemJsObjName = 'BX.Sale.Admin.SystemShipmentBasketObj';

	/**
	 * @param \Bitrix\Sale\Shipment $shipment
	 * @param string $jsObjName
	 * @param string $idPrefix
	 * @throws \Bitrix\Main\ArgumentNullException
	 */
	public function __construct(Shipment $shipment, $jsObjName = "", $idPrefix = "")
	{
		self::$useStoreControl = Configuration::useStoreControl();
		$order = $shipment->getCollection()->getOrder();
		$this->visibleColumns = $this->getVisibleColumns('sale_shipment_basket');
		parent::__construct($order, $jsObjName, $idPrefix);

		$this->shipment = $shipment;
		$this->data = array();
		$this->mode = self::VIEW_MODE;
	}

	public function getEdit($defTails = false)
	{
		$result = '
			<script>
				function searchProductByBarcode(_this)
				{
					event = window.event;
					if(event.keyCode == 13)
					{
						'.$this->jsObjName.'.checkProductByBarcode(_this.nextElementSibling);
						event.preventDefault();
					}
				}
			</script>
			<div class="adm-s-gray-title" style="padding-right: 2px;">
				'.Loc::getMessage("SALE_ORDER_SHIPMENT_BASKET_COMPOSITION").'
				<div class="adm-s-gray-title-btn-container">
					<span
						class="adm-btn adm-btn-green adm-btn-add"
						onClick="'.$this->systemJsObjName.'.addProductSearch();"
						>'.
							Loc::getMessage("SALE_ORDER_BASKET_PRODUCT_ADD").
					'</span>
				</div>
				<div class="adm-s-gray-title-btn-container" style="margin-right: 25px;">
					<span class="adm-bus-order-find-by-barcode" onclick="BX.Sale.Admin.GeneralShipment.findProductByBarcode(this);">'.Loc::getMessage('SALE_ORDER_SHIPMENT_BASKET_FIND_BY_BARCODE').'</span>
				</div>
				<div class="adm-s-gray-title-btn-container" style="margin-right: 25px; display: none;">
					<input type="text" style="width: 150px;" onkeypress="searchProductByBarcode(this);">
					<span class="adm-btn" onclick="'.$this->jsObjName.'.checkProductByBarcode(this);">'.Loc::getMessage('SALE_ORDER_SHIPMENT_BASKET_FIND').'</span>
				</div>
				<div class="clb"></div>
			</div>';

		$result .= '
			<div class="adm-s-order-table-ddi">
				<table class="adm-s-order-table-ddi-table" style="width: 100%;" id="'.$this->idPrefix.'sale_order_edit_product_table">
					<thead>
					<tr>
						<td>
							<span class="adm-s-order-table-title-icon"
								title="'.Loc::getMessage("SALE_ORDER_BASKET_SETTINGS_BUTTON_TITLE").'"
								onclick="'.$this->jsObjName.'.onHeadMenu(this);"
								>
							</span>
						</td>
						<td></td>';

		foreach($this->visibleColumns as $id => $name)
			if ($id == 'STORE')
				$result .= "<td style='width: 200px'>".$name."</td>";
			else
				$result .= "<td>".$name."</td>";

		$result .= '</tr>
					</thead>
				</table>
			</div>';

		$result .= '<div class="adm-list-table-footer" id="b_sale_order_shipment_footer" style="margin-top: -5px; padding-top: 10px;">
			<span class="adm-selectall-wrap" style="margin-top: 5px; font-weight: bold;">'.Loc::getMessage('SALE_ORDER_SHIPMENT_BASKET_GOODS_ALL').': </span><span class="adm-selectall-wrap" style="margin-top: 5px; font-weight: bold;" id="'.$this->idPrefix.'_count">0</span>
			<span class="adm-selectall-wrap" style="margin-top: 5px; font-weight: bold;">'.Loc::getMessage('SALE_ORDER_SHIPMENT_BASKET_GOODS_SELECTED').': </span><span class="adm-selectall-wrap" style="margin-top: 5px; font-weight: bold;" id="'.$this->idPrefix.'_selected_count">0</span>
			<span class="adm-selectall-wrap" style="margin-top: 5px; font-weight: bold;">'.str_replace(array('#CURRENT_PAGE#', '#COUNT_PAGE#'), array('1', '1'),Loc::getMessage('SALE_ORDER_SHIPMENT_BASKET_PAGE')).'</span>
		</div>';

		$result .= '<div class="adm-list-table-footer" id="b_sale_order_shipment_footer">
			<span class="adm-selectall-wrap">
				<input type="checkbox" class="adm-checkbox adm-designed-checkbox" name="action_target" value="selected" id="action_target" '.($this->shipment->isShipped() ? 'disabled' : '').'>
				<label for="action_target" class="adm-checkbox adm-designed-checkbox-label"></label>
				<label title="'.Loc::getMessage('SALE_ORDER_SHIPMENT_BASKET_APPLY').'" for="action_target" class="adm-checkbox-label">'.Loc::getMessage('SALE_ORDER_SHIPMENT_BASKET_APPLY_FOR_ALL').'</label>
			</span>

			<span class="adm-table-item-edit-wrap adm-table-item-edit-single">
				<a href="javascript:void(0);" class="adm-table-btn-delete adm-edit-disable" hidefocus="true" title="" id="action_delete_button" onclick="'.$this->jsObjName.'.groupMoveToSystemBasket(this);"></a>
			</span>
		</div>';

		return $result;
	}

	public function getView($index = 0)
	{
		$exceptionFields = array('QUANTITY', 'REMAINING_QUANTITY');
		foreach ($exceptionFields as $field)
		{
			if (array_key_exists($field, $this->visibleColumns))
				unset($this->visibleColumns[$field]);
		}

		$result = '
				<div class="adm-s-order-table-ddi">
					<table class="adm-s-order-table-ddi-table" style="width: 100%;" id="'.$this->idPrefix.'_'.$index.'">
						<thead>
						<tr>';

		foreach ($this->visibleColumns as $id => $name)
		{
			if ($id == 'STORE')
				$result .= "<td style='width: 200px'>".$name."</td>";
			else
				$result .= "<td>".$name."</td>";
		}
		$result .= '</tr>
					</thead>
				</table>
			</div>';

		$result .= $this->getViewScript($index, $this->visibleColumns);
		return $result;
	}

	protected static function getDefaultVisibleColumns()
	{
		$columnName = array(
			"NUMBER" => Loc::getMessage("SALE_ORDER_BASKET_SETTINGS_COL_NUMBER"),
			"IMAGE" => Loc::getMessage("SALE_ORDER_BASKET_SETTINGS_COL_IMAGE"),
			"NAME" => Loc::getMessage("SALE_ORDER_BASKET_SETTINGS_COL_NAME"),
			"PROPS" => Loc::getMessage("SALE_ORDER_BASKET_SETTINGS_COL_PROPS"),
			"QUANTITY" => Loc::getMessage("SALE_ORDER_BASKET_SETTINGS_COL_QUANTITY"),
			"AMOUNT" => Loc::getMessage("SALE_ORDER_BASKET_SETTINGS_COL_AMOUNT")
		);

		if (self::$useStoreControl)
		{
			$columnName = array_merge(
				$columnName,
				array(
					"STORE" => Loc::getMessage("SALE_ORDER_BASKET_SETTINGS_COL_STORE"),
					"CUR_AMOUNT" => Loc::getMessage("SALE_ORDER_BASKET_SETTINGS_COL_CUR_AMOUNT"),
					"REMAINING_QUANTITY" => Loc::getMessage("SALE_ORDER_BASKET_SETTINGS_COL_REMAINING_QUANTITY"),
					"BARCODE" => Loc::getMessage("SALE_ORDER_BASKET_SETTINGS_COL_BARCODE"),
				)
			);
		}
		return $columnName;
	}

	/**
	 * @return array
	 */
	protected static function getDefaultUnShippedVisibleColumns()
	{
		return array(
			"NUMBER" => Loc::getMessage("SALE_ORDER_BASKET_SETTINGS_COL_NUMBER"),
			"IMAGE" => Loc::getMessage("SALE_ORDER_BASKET_SETTINGS_COL_IMAGE"),
			"NAME" => Loc::getMessage("SALE_ORDER_BASKET_SETTINGS_COL_NAME"),
			"PROPS" => Loc::getMessage("SALE_ORDER_BASKET_SETTINGS_COL_PROPS"),
			"AMOUNT" => Loc::getMessage("SALE_ORDER_BASKET_SETTINGS_COL_QUANTITY")
		);
	}

	/**
	 * @param array $inParams
	 * @return array|null
	 */
	public function prepareData(array $inParams = array())
	{
		$result = null;
		/** @var \Bitrix\Sale\ShipmentCollection $shipmentCollection */
		$shipmentCollection = $this->shipment->getCollection();
		$shipmentItemCollection = $this->shipment->getShipmentItemCollection();
		$result = $this->getProductsInfo($shipmentItemCollection);
		$result = $this->getOffersSkuParams($result);
		$result['UNSHIPPED_PRODUCTS'] = array();

		if ($this->shipment->getId() > 0)
		{
			/** @var \Bitrix\Sale\Shipment $systemShipment */
			$systemShipment = $shipmentCollection->getSystemShipment();
			$systemItemsCollection = $systemShipment->getShipmentItemCollection();

			$systemCollectionProduct = $this->getProductsInfo($systemItemsCollection);
			$systemCollectionProduct = $this->getOffersSkuParams($systemCollectionProduct);
			$result['UNSHIPPED_PRODUCTS'] = array_diff_key($systemCollectionProduct['ITEMS'], $result['ITEMS']);
		}

		return $result;
	}

	/**
	 * @param \Bitrix\Sale\ShipmentItemCollection $shipmentItemCollection
	 * @return array
	 * @throws \Bitrix\Main\LoaderException
	 */
	public function getProductsInfo($shipmentItemCollection)
	{
		/** @var \Bitrix\Sale\Shipment $shipment */
		$shipment = $shipmentItemCollection->getShipment();
		$systemShipmentItemCollection = null;
		$systemShipmentItem = null;

		$result = array(
			"ITEMS" => array()
		);

		if (!$shipment->isSystem())
		{
			/** @var \Bitrix\Sale\Shipment $systemShipment */
			$systemShipment = $shipment->getCollection()->getSystemShipment();
			$systemShipmentItemCollection = $systemShipment->getShipmentItemCollection();
		}

		$items = array();

		$catalogProductsIds = array();

		/** @var \Bitrix\Sale\ShipmentItem $item */
		foreach($shipmentItemCollection as $item)
		{
			$basketItem = $item->getBasketItem();

			if ($basketItem && $basketItem->getField("MODULE") == "catalog")
				$catalogProductsIds[] = $basketItem->getProductId();
		}

		if(!empty($catalogProductsIds))
			$catalogProductsFields = self::getProductsData($catalogProductsIds, $this->order->getSiteId(), $this->visibleColumns, $this->order->getUserId());

		/** @var \Bitrix\Sale\ShipmentItem $item */
		foreach($shipmentItemCollection as $item)
		{
			$params = array();

			$basketItem = $item->getBasketItem();
			if ($basketItem)
			{
				if ($systemShipmentItemCollection)
				{
					/** @var \Bitrix\Sale\ShipmentItemCollection $systemShipmentItemCollection */
					$systemShipmentItem = $systemShipmentItemCollection->getItemByBasketCode($basketItem->getBasketCode());
				}

				$productId = $basketItem->getProductId();

				if ($basketItem->getField("MODULE") == "catalog" && !empty($catalogProductsFields[$productId]))
					$params = $catalogProductsFields[$productId];

				if (intval($basketItem->getField("MEASURE_CODE")) > 0)
					$params["MEASURE_CODE"] = intval($basketItem->getField("MEASURE_CODE"));
				elseif (!isset($params["MEASURE_CODE"]))
					$params["MEASURE_CODE"] = 0;

				if(strlen($basketItem->getField("MEASURE_NAME")) > 0)
					$params["MEASURE_TEXT"] = $basketItem->getField("MEASURE_NAME");
				elseif(!isset($params["MEASURE_TEXT"]))
					$params["MEASURE_TEXT"] = "";

				if ($basketItem->isBundleParent())
				{
					$params["BASE_ELEMENTS_QUANTITY"] = $basketItem->getBundleBaseQuantity();
					if (!isset($params['IS_SET_ITEM']))
						$params['IS_SET_ITEM'] = 'N';
					if (!isset($params['IS_SET_PARENT']))
						$params['IS_SET_PARENT'] = 'Y';
					if (!isset($params['OLD_PARENT_ID']))
						$params['OLD_PARENT_ID'] = '';
				}
				$params["BASKET_ID"] = $basketItem->getId();
				$params["PRODUCT_PROVIDER_CLASS"] = $basketItem->getProvider();
				$params["NAME"] = $basketItem->getField("NAME");
				$params["MODULE"] = $basketItem->getField("MODULE");

				$itemStoreCollection = $item->getShipmentItemStoreCollection();

				/** @var \Bitrix\Sale\ShipmentItemStore $barcode */
				$params['BARCODE_INFO'] = array();
				foreach ($itemStoreCollection as $barcode)
				{
					$storeId = $barcode->getStoreId();
					if (!isset($params['BARCODE_INFO'][$storeId]))
						$params['BARCODE_INFO'][$storeId] = array();

					$params['BARCODE_INFO'][$storeId][] = array(
						'ID' => $barcode->getId(),
						'BARCODE' => $barcode->getField('BARCODE'),
						'QUANTITY' => $barcode->getQuantity()
					);
				}

				if (!$shipment->isSystem())
					$params['ORDER_DELIVERY_BASKET_ID'] = $item->getId();

				$systemItemQuantity = ($systemShipmentItem) ? $systemShipmentItem->getQuantity() : 0;
				$params["QUANTITY"] = floatval($item->getQuantity() + $systemItemQuantity);
				$params["AMOUNT"] = floatval($item->getQuantity());
				$params["PRICE"] = $basketItem->getPrice();
				$params["CURRENCY"] = $basketItem->getCurrency();
				$params["PRODUCT_PROVIDER_CLASS"] = $basketItem->getProvider();
				$params["PROPS"] = array();

				/** @var \Bitrix\Sale\BasketPropertyItem $property */
				foreach($basketItem->getPropertyCollection() as $property)
				{
					$params["PROPS"][] = array(
						"VALUE" => $property->getField("VALUE"),
						"NAME" => $property->getField("NAME"),
						"CODE" => $property->getField("CODE"),
						"SORT" => $property->getField("SORT")
					);
				}

				if(\Bitrix\Main\Loader::includeModule("catalog"))
				{
					$productInfo = \CCatalogSku::GetProductInfo($productId);
					$params["OFFERS_IBLOCK_ID"] = $productInfo["OFFER_IBLOCK_ID"];
					$params["IBLOCK_ID"] = $productInfo["IBLOCK_ID"];
					$params["PRODUCT_ID"] = $productInfo["ID"];
				}

				if ($basketItem->isBundleChild())
					$params["PARENT_BASKET_ID"] = $basketItem->getParentBasketItem()->getId();

				//If product became bundle, but in saved order it is a simple product.
				if ($basketItem->getBasketCode() == intval($basketItem->getBasketCode()) && !$basketItem->isBundleParent() && !empty($params['SET_ITEMS']))
				{
					unset($params['SET_ITEMS'], $params['OLD_PARENT_ID']);
					$params['IS_SET_PARENT'] = 'N';
				}
			}
			else
			{
				if ($systemShipmentItemCollection)
				{
					/** @var \Bitrix\Sale\ShipmentItemCollection $systemShipmentItemCollection */
					$systemShipmentItem = $systemShipmentItemCollection->getItemByBasketId($item->getBasketId());
				}

				$systemItemQuantity = ($systemShipmentItem) ? $systemShipmentItem->getQuantity() : 0;
				$params = array(
					'NAME' => Loc::getMessage("SALE_ORDER_SHIPMENT_BASKET_WRONG_BASKET_ITEM"),
					'QUANTITY' => floatval($item->getQuantity() + $systemItemQuantity),
					'AMOUNT' => floatval($item->getQuantity()),
					'BASKET_ID' => $item->getBasketId(),
				);
			}

			$items[$params['BASKET_ID']] = $params;
		}

		$bundleChild = array();
		foreach ($items as $basketId => $item)
		{
			$parentBasketId = $item['PARENT_BASKET_ID'];
			if ($parentBasketId > 0)
			{
				$item['IS_SET_ITEM'] = 'Y';
				$item['OLD_PARENT_ID'] = $items[$parentBasketId]['OLD_PARENT_ID'];
				$bundleChild[$parentBasketId][] = $item;
				unset($items[$basketId]);
			}
		}

		foreach ($items as $basketId => $item)
		{
			if (isset($bundleChild[$basketId]))
				$items[$basketId]['SET_ITEMS'] = $bundleChild[$basketId];
		}

		$result['ITEMS'] = $items;

		return $result;
	}

	/**
	 * @param $data
	 * @param $request
	 * @return mixed
	 */
	public function modifyFromRequest($data, $request)
	{
		// recovery on delete
		foreach ($data['ITEMS'] as $code => $item)
		{
			$basketCode = $item['BASKET_ID'];

			if (!isset($request[$basketCode]))
			{
				$data['UNSHIPPED_PRODUCTS'][$code] = $data['ITEMS'][$code];
				unset($data['ITEMS'][$code]);
			}
		}

		// recovery on add
		foreach ($data['UNSHIPPED_PRODUCTS'] as $code => $item)
		{
			$basketCode = $item['BASKET_ID'];

			if (isset($request[$basketCode]))
			{
				$data['ITEMS'][$code] = $data['UNSHIPPED_PRODUCTS'][$code];
				unset($data['UNSHIPPED_PRODUCTS'][$code]);
			}
		}

		// recovery barcode info
		if ($request)
		{
			foreach ($request as $basketCode => $product)
			{
				$basket = $this->order->getBasket();
				/** @var \Bitrix\Sale\BasketItem $basketItem */
				$basketItem = $basket->getItemById($product['BASKET_ID']);
				if ($basketItem && $basketItem->isBundleChild())
				{
					$parentBasketItem = $basketItem->getParentBasketItem();
					foreach ($data['ITEMS'][$parentBasketItem->getId()]['SET_ITEMS'] as $id => $setItem)
					{
						if ($setItem['PRODUCT_ID'] == $product['PRODUCT_ID'])
						{
							$item = &$data['ITEMS'][$parentBasketItem->getId()]['SET_ITEMS'][$id];
							break;
						}
					}
				}
				else
				{
					$item = &$data['ITEMS'][$product['BASKET_ID']];
				}
				$item['AMOUNT'] = $product['AMOUNT'];
				$item['QUANTITY'] = $product['QUANTITY'];
				if ($product['BARCODE_INFO'])
				{
					foreach ($product['BARCODE_INFO'] as $id => $info)
					{
						$storeId = $info['STORE_ID'];
						if (!isset($item['BARCODE_INFO'][$storeId]))
						{
							$item['BARCODE_INFO'][$storeId] = array();
							if ($basketItem->isBundleParent())
							{
								$item['BARCODE_INFO'][$storeId][0] = array();
								$item['BARCODE_INFO'][$storeId][0]['QUANTITY'] = $info['QUANTITY'];
							}
							if ($info['BARCODE'])
							{
								foreach ($info['BARCODE'] as $barcode)
								{
									$item['BARCODE_INFO'][$storeId][] = array(
										'ID' => $barcode['ID'],
										'BARCODE' => $barcode['VALUE'],
										'QUANTITY' => ($basketItem->isbarcodeMulti()) ? 1 : $info['QUANTITY']
									);
								}
							}
						}
						else
						{
							foreach ($item['BARCODE_INFO'][$storeId] as &$barcodeInfo)
							{
								if ($info['BARCODE'])
								{
									$barcode = array_shift($info['BARCODE']);
									$barcodeInfo['ID'] = $barcode['ID'];
									$barcodeInfo['BARCODE'] = $barcode['VALUE'];
								}
								$barcodeInfo['QUANTITY'] = ($basketItem->isbarcodeMulti()) ? 1 : $info['QUANTITY'];
							}
							unset($barcodeInfo);
						}
					}
				}
			}
		}
		unset($item);

		return $data;
	}

	public function getScripts($recoveryData = array())
	{
		if(!static::$jsInited)
		{
			\Bitrix\Main\Page\Asset::getInstance()->addJs("/bitrix/js/sale/admin/order_basket.js");
			\Bitrix\Main\Page\Asset::getInstance()->addJs("/bitrix/js/sale/admin/order_shipment_basket.js");
			static::$jsInited = true;
		}
		$data =	$this->prepareData();
		
		if (!empty($recoveryData))
		{
			$data = $this->modifyFromRequest($data, $recoveryData['1']['PRODUCT']);
		}

		$keys = array_merge(array_keys($data["ITEMS"]), array_keys($data["UNSHIPPED_PRODUCTS"]));

		$result = '
			<script type="text/javascript">
				BX.message({
					SALE_ORDER_BASKET_ROW_SETTINGS: "'.\CUtil::JSEscape(Loc::getMessage("SALE_ORDER_BASKET_ROW_SETTINGS")).'",
					SALE_ORDER_BASKET_PROD_MENU_ADD: "'.\CUtil::JSEscape(Loc::getMessage("SALE_ORDER_BASKET_PROD_MENU_ADD")).'",
					SALE_ORDER_BASKET_PROD_MENU_DELETE: "'.\CUtil::JSEscape(Loc::getMessage("SALE_ORDER_BASKET_PROD_MENU_DELETE")).'",
					SALE_ORDER_BASKET_TURN: "'.\CUtil::JSEscape(Loc::getMessage("SALE_ORDER_BASKET_TURN")).'",
					SALE_ORDER_BASKET_EXPAND: "'.\CUtil::JSEscape(Loc::getMessage("SALE_ORDER_BASKET_EXPAND")).'",
					SALE_ORDER_BASKET_NO_PICTURE: "'.\CUtil::JSEscape(Loc::getMessage("SALE_ORDER_BASKET_NO_PICTURE")).'",
					SALE_ORDER_SHIPMENT_BASKET_SELECTED_PRODUCTS_DEL: "'.\CUtil::JSEscape(Loc::getMessage("SALE_ORDER_SHIPMENT_BASKET_SELECTED_PRODUCTS_DEL")).'",
					SALE_ORDER_SHIPMENT_BASKET_ALL_PRODUCTS_DEL: "'.\CUtil::JSEscape(Loc::getMessage("SALE_ORDER_SHIPMENT_BASKET_ALL_PRODUCTS_DEL")).'",
					SALE_ORDER_SHIPMENT_BASKET_ADD_NEW_STORE: "'.\CUtil::JSEscape(Loc::getMessage("SALE_ORDER_SHIPMENT_BASKET_ADD_NEW_STORE")).'",
					SALE_ORDER_SHIPMENT_BASKET_BARCODE: "'.\CUtil::JSEscape(Loc::getMessage("SALE_ORDER_SHIPMENT_BASKET_BARCODE")).'",
					SALE_ORDER_SHIPMENT_BASKET_CLOSE: "'.\CUtil::JSEscape(Loc::getMessage("SALE_ORDER_SHIPMENT_BASKET_CLOSE")).'",
					SALE_ORDER_SHIPMENT_BASKET_ADD: "'.\CUtil::JSEscape(Loc::getMessage("SALE_ORDER_SHIPMENT_BASKET_ADD")).'",
					SALE_ORDER_SHIPMENT_BASKET_NO_PRODUCTS: "'.\CUtil::JSEscape(Loc::getMessage("SALE_ORDER_SHIPMENT_BASKET_NO_PRODUCTS")).'",
					SALE_ORDER_SHIPMENT_BASKET_BARCODE_ALREADY_USED: "'.\CUtil::JSEscape(Loc::getMessage("SALE_ORDER_SHIPMENT_BASKET_BARCODE_ALREADY_USED")).'",
					SALE_ORDER_SHIPMENT_BASKET_BARCODE: "'.\CUtil::JSEscape(Loc::getMessage("SALE_ORDER_SHIPMENT_BASKET_BARCODE")).'",
					SALE_ORDER_SHIPMENT_BASKET_BARCODE_CLOSE: "'.\CUtil::JSEscape(Loc::getMessage("SALE_ORDER_SHIPMENT_BASKET_BARCODE_CLOSE")).'",
					SALE_ORDER_SHIPMENT_BASKET_BARCODE_ENTER: "'.\CUtil::JSEscape(Loc::getMessage("SALE_ORDER_SHIPMENT_BASKET_BARCODE_ENTER")).'",
					SALE_ORDER_SHIPMENT_BASKET_ERROR_ALREADY_SHIPPED: "'.\CUtil::JSEscape(Loc::getMessage("SALE_ORDER_SHIPMENT_BASKET_ERROR_ALREADY_SHIPPED")).'",
					SALE_ORDER_SHIPMENT_BASKET_ERROR_NOT_FOUND: "'.\CUtil::JSEscape(Loc::getMessage("SALE_ORDER_SHIPMENT_BASKET_ERROR_NOT_FOUND")).'",
					SALE_ORDER_SHIPMENT_BASKET_BARCODE_EMPTY: "'.\CUtil::JSEscape(Loc::getMessage("SALE_ORDER_SHIPMENT_BASKET_BARCODE_EMPTY")).'",
				});

				BX.ready(function(){
					'.$this->jsObjName.' = new BX.Sale.Admin.ShipmentBasketEdit({
						tableId: "'.$this->idPrefix.'sale_order_edit_product_table",
						productsOrder: '.\CUtil::PhpToJSObject($keys).',
						idPrefix: "'.$this->idPrefix.'",
						products: '.\CUtil::PhpToJSObject($data["ITEMS"]).',
						visibleColumns: '.\CUtil::PhpToJSObject($this->visibleColumns).',
						objName: "'.$this->jsObjName.'",
						isShipped: "'.$this->shipment->isShipped().'",
						totalBlockFields: {
							PRICE_DELIVERY_DISCOUNT: {
								id: "'.$this->idPrefix.'sale_order_edit_basket_price_delivery_discount",
								value: "'.roundEx(floatval(0), SALE_VALUE_PRECISION).'",
								type: "currency"
							}
						},
						dataForRecovery : '.\CUtil::PhpToJSObject($recoveryData).',
						useStoreControl : "'.self::$useStoreControl.'"
					});

					'.$this->systemJsObjName.' = new BX.Sale.Admin.SystemShipmentBasketEdit({
						tableId: "unshipped",
						productsOrder: '.\CUtil::PhpToJSObject($keys).',
						idPrefix: "del",
						products: '.\CUtil::PhpToJSObject($data["UNSHIPPED_PRODUCTS"]).',
						visibleColumns : '.\CUtil::PhpToJSObject(self::getDefaultUnShippedVisibleColumns()).',
						objName: "'.$this->systemJsObjName.'"
					});

					'.$this->jsObjName.'.link = '.$this->systemJsObjName.';
					'.$this->systemJsObjName.'.link = '.$this->jsObjName.';
				});';

		$result .= $this->settingsDialog->getScripts();
		$result .= '</script>';

		return $result;
	}

	public function getViewScript($index, $visibleColumns)
	{
		\Bitrix\Main\Page\Asset::getInstance()->addJs("/bitrix/js/sale/admin/order_shipment_basket.js");

		$data = $this->prepareData();
		
		return '<script>
			BX.message({
				SALE_ORDER_SHIPMENT_VIEW_BASKET_NO_PRODUCTS: "'.\CUtil::JSEscape(Loc::getMessage("SALE_ORDER_SHIPMENT_VIEW_BASKET_NO_PRODUCTS")).'",
				SALE_ORDER_SHIPMENT_BASKET_BARCODE: "'.\CUtil::JSEscape(Loc::getMessage("SALE_ORDER_SHIPMENT_BASKET_BARCODE")).'",
				SALE_ORDER_SHIPMENT_BASKET_BARCODE_CLOSE: "'.\CUtil::JSEscape(Loc::getMessage("SALE_ORDER_SHIPMENT_BASKET_BARCODE_CLOSE")).'",
				SALE_ORDER_SHIPMENT_BASKET_BARCODE_EMPTY: "'.\CUtil::JSEscape(Loc::getMessage("SALE_ORDER_SHIPMENT_BASKET_BARCODE_EMPTY")).'",
			});

			BX.ready(function()
			{
				var viewBasket_'.$index.' = new BX.Sale.Admin.ShipmentBasket({
					idPrefix: "'.$this->idPrefix.'",
					productsOrder: '.\CUtil::PhpToJSObject(array_keys($data["ITEMS"])).',
					tableId: "'.$this->idPrefix.'_'.$index.'",
					products: '.\CUtil::PhpToJSObject($data["ITEMS"]).',
					visibleColumns: '.\CUtil::PhpToJSObject($visibleColumns).'
				});
			});
		</script>';
	}

	public static function updateData(Order &$order, &$shipment, $shipmentBasket)
	{
		/**@var \Bitrix\Sale\Shipment $shipment */
		$result = new Result();
		$shippingItems = array();
		$idsFromForm = array();
		$basket = $order->getBasket();
		$shipmentItemCollection = $shipment->getShipmentItemCollection();
		if (is_null(self::$useStoreControl))
			self::$useStoreControl = Configuration::useStoreControl();

		if(is_array($shipmentBasket))
		{
			// PREPARE DATA FOR SET_FIELDS
			foreach ($shipmentBasket as $items)
			{
				$items['QUANTITY'] = floatval(str_replace(',', '.', $items['QUANTITY']));
				$items['AMOUNT'] = floatval(str_replace(',', '.', $items['AMOUNT']));
				if (isset($items['BASKET_ID']) && $items['BASKET_ID'] > 0)
				{
					if (!$basketItem = $basket->getItemById($items['BASKET_ID']))
					{
						$result->addError( new ResultError(
						   Loc::getMessage('SALE_ORDER_SHIPMENT_BASKET_BASKET_ITEM_NOT_FOUND',  array(
							   '#BASKET_ITEM_ID#' => $items['BASKET_ID'],
						   )), 
							'PROVIDER_UNRESERVED_SHIPMENT_ITEM_WRONG_BASKET_ITEM')
						);
						return $result;
					}
					/** @var \Bitrix\Sale\BasketItem $basketItem */
					$basketCode = $basketItem->getBasketCode();
				}
				else
				{
					$basketCode = $items['BASKET_CODE'];
					if(!$basketItem = $basket->getItemByBasketCode($basketCode))
					{
						$result->addError( new ResultError(
						   Loc::getMessage('SALE_ORDER_SHIPMENT_BASKET_BASKET_ITEM_NOT_FOUND',  array(
							   '#BASKET_ITEM_ID#' => $items['BASKET_ID'],
						   )),
						   'PROVIDER_UNRESERVED_SHIPMENT_ITEM_WRONG_BASKET_ITEM')
						);
						return $result;
					}
				}

				$tmp = array(
					'BASKET_CODE' => $basketCode,
					'AMOUNT' => $items['AMOUNT'],
					'ORDER_DELIVERY_BASKET_ID' => $items['ORDER_DELIVERY_BASKET_ID']
				);
				$idsFromForm[$basketCode] = array();

				if ($items['BARCODE_INFO'] && self::$useStoreControl)
				{
					foreach ($items['BARCODE_INFO'] as $item)
					{
						if ($basketItem->isBundleParent())
						{
							$shippingItems[] = $tmp;
							continue;
						}

						$tmp['BARCODE'] = array(
							'ORDER_DELIVERY_BASKET_ID' => $items['ORDER_DELIVERY_BASKET_ID'],
							'STORE_ID' => $item['STORE_ID'],
							'QUANTITY' => ($basketItem->isBarcodeMulti()) ? 1 : $item['QUANTITY']
						);

						$barcodeCount = 0;
						if ($item['BARCODE'])
						{
							foreach ($item['BARCODE'] as $barcode)
							{
								$idsFromForm[$basketCode]['BARCODE_IDS'][$barcode['ID']] = true;
								if ($barcode['ID'] > 0)
									$tmp['BARCODE']['ID'] = $barcode['ID'];
								else
									unset($tmp['BARCODE']['ID']);
								$tmp['BARCODE']['BARCODE'] = $barcode['VALUE'];
								$shippingItems[] = $tmp;
								$barcodeCount++;
							}
						}
						elseif (!$basketItem->isBarcodeMulti())
						{
							$shippingItems[] = $tmp;
							continue;
						}


						if ($basketItem->isBarcodeMulti())
						{
							while ($barcodeCount < $item['QUANTITY'])
							{
								unset($tmp['BARCODE']['ID']);
								$tmp['BARCODE']['BARCODE'] = '';
								$shippingItems[] = $tmp;
								$barcodeCount++;
							}
						}
					}
				}
				else
				{
					$shippingItems[] = $tmp;
				}
			}
		}


		// DELETE FROM COLLECTION
		/** @var \Bitrix\Sale\ShipmentItem $shipmentItem */
		foreach ($shipmentItemCollection as $shipmentItem)
		{
			if (!array_key_exists($shipmentItem->getBasketCode(), $idsFromForm))
			{
				/** @var Result $r */
				$r = $shipmentItem->delete();
				if (!$r->isSuccess())
					$result->addErrors($r->getErrors());
			}

			$shipmentItemStoreCollection = $shipmentItem->getShipmentItemStoreCollection();

			/** @var \Bitrix\Sale\ShipmentItemStore $shipmentItemStore */
			foreach ($shipmentItemStoreCollection as $shipmentItemStore)
			{
				$shipmentItemId = $shipmentItemStore->getId();
				if (!isset($idsFromForm[$shipmentItem->getBasketCode()]['BARCODE_IDS'][$shipmentItemId]))
				{
					$delResult = $shipmentItemStore->delete();
					if (!$delResult->isSuccess())
						$result->addErrors($delResult->getErrors());
				}
			}
		}

		$isStartField = $shipmentItemCollection->isStartField();

		// SET DATA
		foreach ($shippingItems as $shippingItem)
		{
			if ((int)$shippingItem['ORDER_DELIVERY_BASKET_ID'] <= 0)
			{
				$basketCode = $shippingItem['BASKET_CODE'];
				/** @var \Bitrix\Sale\Order $order */
				$basketItem = $order->getBasket()->getItemByBasketCode($basketCode);

				/** @var \Bitrix\Sale\BasketItem $basketItem */
				$shipmentItem = $shipmentItemCollection->createItem($basketItem);
				if ($shipmentItem === null)
				{
					$result->addError(
						new EntityError(
							Loc::getMessage('SALE_ORDER_SHIPMENT_BASKET_ERROR_ALREADY_SHIPPED')
						)
					);
					return $result;
				}
				unset($shippingItem['BARCODE']['ORDER_DELIVERY_BASKET_ID']);
			}
			else
			{
				$shipmentItem = $shipmentItemCollection->getItemById($shippingItem['ORDER_DELIVERY_BASKET_ID']);
				$basketItem = $shipmentItem->getBasketItem();
			}

			if ($shippingItem['AMOUNT'] <= 0)
			{
				$result->addError(
					new EntityError(
						Loc::getMessage('SALE_ORDER_SHIPMENT_BASKET_ERROR_QUANTITY', array('#BASKET_ITEM#' => $basketItem->getField('NAME'))),
						'BASKET_ITEM_'.$basketItem->getBasketCode()
					)
				);
				continue;
			}

			if ($shipmentItem->getQuantity() < $shippingItem['AMOUNT'])
			{
				$order->setMathActionOnly(true);
				$setFieldResult = $shipmentItem->setField('QUANTITY', $shippingItem['AMOUNT']);
				$order->setMathActionOnly(false);

				if (!$setFieldResult->isSuccess())
					$result->addErrors($setFieldResult->getErrors());
			}

			if (!empty($shippingItem['BARCODE']) && self::$useStoreControl)
			{
				$barcode = $shippingItem['BARCODE'];

				/** @var \Bitrix\Sale\ShipmentItemStoreCollection $shipmentItemStoreCollection */
				$shipmentItemStoreCollection = $shipmentItem->getShipmentItemStoreCollection();
				if (!$basketItem->isBarcodeMulti())
				{
					/** @var Result $r */
					$r = $shipmentItemStoreCollection->setBarcodeQuantityFromArray($shipmentBasket[$basketItem->getId()]);
					if(!$r->isSuccess())
					{
						$result->addErrors($r->getErrors());
					}
				}

				if (isset($barcode['ID']) && intval($barcode['ID']) > 0)
				{
					/** @var \Bitrix\Sale\ShipmentItemStore $shipmentItemStore */
					if ($shipmentItemStore = $shipmentItemStoreCollection->getItemById($barcode['ID']))
					{
						unset($barcode['ID']);
						$setFieldResult = $shipmentItemStore->setFields($barcode);

						if (!$setFieldResult->isSuccess())
							$result->addErrors($setFieldResult->getErrors());
					}
				}
				else
				{
					$shipmentItemStore = $shipmentItemStoreCollection->createItem($basketItem);
					$setFieldResult = $shipmentItemStore->setFields($barcode);
					if (!$setFieldResult->isSuccess())
						$result->addErrors($setFieldResult->getErrors());
				}
			}

			$setFieldResult = $shipmentItem->setField('QUANTITY', $shippingItem['AMOUNT']);
			if (!$setFieldResult->isSuccess())
				$result->addErrors($setFieldResult->getErrors());
		}

		if ($isStartField)
		{
			$hasMeaningfulFields = $shipmentItemCollection->hasMeaningfulField();

			/** @var Result $r */
			$r = $shipmentItemCollection->doFinalAction($hasMeaningfulFields);
			if (!$r->isSuccess())
			{
				$result->addErrors($r->getErrors());
			}
		}

		return $result;
	}
}

Zerion Mini Shell 1.0