%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/sale/lib/helpers/admin/blocks/ |
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; } }