the block name * template => the template file * renderer => the block object * * @var array */ protected $_columnRenders = []; /** * Flag - if it is set method canEditQty will return value of it * * @var bool|null */ protected $_canEditQty; /** * Core registry * * @var \Magento\Framework\Registry */ protected $_coreRegistry; /** * @var \Magento\CatalogInventory\Api\StockRegistryInterface */ protected $stockRegistry; /** * @var \Magento\CatalogInventory\Api\StockConfigurationInterface */ protected $stockConfiguration; /** * @param \Magento\Backend\Block\Template\Context $context * @param \Magento\CatalogInventory\Api\StockRegistryInterface $stockRegistry * @param \Magento\CatalogInventory\Api\StockConfigurationInterface $stockConfiguration * @param \Magento\Framework\Registry $registry * @param array $data */ public function __construct( \Magento\Backend\Block\Template\Context $context, \Magento\CatalogInventory\Api\StockRegistryInterface $stockRegistry, \Magento\CatalogInventory\Api\StockConfigurationInterface $stockConfiguration, \Magento\Framework\Registry $registry, array $data = [] ) { $this->stockRegistry = $stockRegistry; $this->stockConfiguration = $stockConfiguration; $this->_coreRegistry = $registry; parent::__construct($context, $data); } /** * Add column renderers * * @param array $blocks * @return $this */ public function setColumnRenders(array $blocks) { foreach ($blocks as $blockName) { $block = $this->getLayout()->getBlock($blockName); if ($block->getRenderedBlock() === null) { $block->setRenderedBlock($this); } $this->_columnRenders[$blockName] = $block; } return $this; } /** * Retrieve item renderer block * * @param string $type * @return \Magento\Framework\View\Element\AbstractBlock * @throws \RuntimeException */ public function getItemRenderer($type) { /** @var $renderer \Magento\Sales\Block\Adminhtml\Items\AbstractItems */ $renderer = $this->getChildBlock($type) ?: $this->getChildBlock(self::DEFAULT_TYPE); if (!$renderer instanceof \Magento\Framework\View\Element\BlockInterface) { throw new \RuntimeException('Renderer for type "' . $type . '" does not exist.'); } $renderer->setColumnRenders($this->getLayout()->getGroupChildNames($this->getNameInLayout(), 'column')); return $renderer; } /** * Retrieve column renderer block * * @param string $column * @param string $compositePart * @return \Magento\Framework\View\Element\AbstractBlock */ public function getColumnRenderer($column, $compositePart = '') { $column = 'column_' . $column; if (isset($this->_columnRenders[$column . '_' . $compositePart])) { $column .= '_' . $compositePart; } if (!isset($this->_columnRenders[$column])) { return false; } return $this->_columnRenders[$column]; } /** * Retrieve rendered item html content * * @param \Magento\Framework\DataObject $item * @return string */ public function getItemHtml(\Magento\Framework\DataObject $item) { if ($item->getOrderItem()) { $type = $item->getOrderItem()->getProductType(); } else { $type = $item->getProductType(); } return $this->getItemRenderer($type)->setItem($item)->setCanEditQty($this->canEditQty())->toHtml(); } /** * Retrieve rendered item extra info html content * * @param \Magento\Framework\DataObject $item * @return string */ public function getItemExtraInfoHtml(\Magento\Framework\DataObject $item) { $extraInfoBlock = $this->getChildBlock('order_item_extra_info'); if ($extraInfoBlock) { return $extraInfoBlock->setItem($item)->toHtml(); } return ''; } /** * Retrieve rendered column html content * * @param \Magento\Framework\DataObject $item * @param string $column the column key * @param string $field the custom item field * @return string */ public function getColumnHtml(\Magento\Framework\DataObject $item, $column, $field = null) { if ($item->getOrderItem()) { $block = $this->getColumnRenderer($column, $item->getOrderItem()->getProductType()); } else { $block = $this->getColumnRenderer($column, $item->getProductType()); } if ($block) { $block->setItem($item); if ($field !== null) { $block->setField($field); } return $block->toHtml(); } return ' '; } /** * Get credit memo * * @return mixed */ public function getCreditmemo() { return $this->_coreRegistry->registry('current_creditmemo'); } /** * ######################### SALES ################################## */ /** * Retrieve available order * * @throws \Magento\Framework\Exception\LocalizedException * @return Order */ public function getOrder() { if ($this->hasOrder()) { return $this->getData('order'); } if ($this->_coreRegistry->registry('current_order')) { return $this->_coreRegistry->registry('current_order'); } if ($this->_coreRegistry->registry('order')) { return $this->_coreRegistry->registry('order'); } if ($this->getInvoice()) { return $this->getInvoice()->getOrder(); } if ($this->getCreditmemo()) { return $this->getCreditmemo()->getOrder(); } if ($this->getItem()->getOrder()) { return $this->getItem()->getOrder(); } throw new \Magento\Framework\Exception\LocalizedException(__('We can\'t get the order instance right now.')); } /** * Retrieve price data object * * @return Order */ public function getPriceDataObject() { $obj = $this->getData('price_data_object'); if ($obj === null) { return $this->getOrder(); } return $obj; } /** * Retrieve price attribute html content * * @param string $code * @param bool $strong * @param string $separator * @return string */ public function displayPriceAttribute($code, $strong = false, $separator = '
') { if ($code == 'tax_amount' && $this->getOrder()->getRowTaxDisplayPrecision()) { return $this->displayRoundedPrices( $this->getPriceDataObject()->getData('base_' . $code), $this->getPriceDataObject()->getData($code), $this->getOrder()->getRowTaxDisplayPrecision(), $strong, $separator ); } else { return $this->displayPrices( $this->getPriceDataObject()->getData('base_' . $code), $this->getPriceDataObject()->getData($code), $strong, $separator ); } } /** * Retrieve price formatted html content * * @param float $basePrice * @param float $price * @param bool $strong * @param string $separator * @return string */ public function displayPrices($basePrice, $price, $strong = false, $separator = '
') { return $this->displayRoundedPrices($basePrice, $price, 2, $strong, $separator); } /** * Display base and regular prices with specified rounding precision * * @param float $basePrice * @param float $price * @param int $precision * @param bool $strong * @param string $separator * @return string */ public function displayRoundedPrices($basePrice, $price, $precision = 2, $strong = false, $separator = '
') { if ($this->getOrder()->isCurrencyDifferent()) { $res = ''; $res .= $this->getOrder()->formatBasePricePrecision($basePrice, $precision); $res .= $separator; $res .= $this->getOrder()->formatPricePrecision($price, $precision, true); } else { $res = $this->getOrder()->formatPricePrecision($price, $precision); if ($strong) { $res = '' . $res . ''; } } return $res; } /** * Retrieve tax calculation html content * * @param \Magento\Framework\DataObject $item * @return string */ public function displayTaxCalculation(\Magento\Framework\DataObject $item) { if ($item->getTaxPercent() && $item->getTaxString() == '') { $percents = [$item->getTaxPercent()]; } elseif ($item->getTaxString()) { $percents = explode(\Magento\Tax\Model\Config::CALCULATION_STRING_SEPARATOR, $item->getTaxString()); } else { return '0%'; } foreach ($percents as &$percent) { $percent = sprintf('%.2f%%', $percent); } return implode(' + ', $percents); } /** * Retrieve tax with percent html content * * @param \Magento\Framework\DataObject $item * @return string */ public function displayTaxPercent(\Magento\Framework\DataObject $item) { if ($item->getTaxPercent()) { return sprintf('%s%%', $item->getTaxPercent() + 0); } else { return '0%'; } } /** * INVOICES */ /** * Check shipment availability for current invoice * * @return bool */ public function canCreateShipment() { foreach ($this->getInvoice()->getAllItems() as $item) { if ($item->getOrderItem()->getQtyToShip()) { return true; } } return false; } /** * Setter for flag _canEditQty * * @param bool $value * @return $this * @see self::_canEditQty * @see self::canEditQty */ public function setCanEditQty($value) { $this->_canEditQty = $value; return $this; } /** * Check availability to edit quantity of item * * @return bool */ public function canEditQty() { /** * If parent block has set */ if ($this->_canEditQty !== null) { return $this->_canEditQty; } /** * Disable editing of quantity of item if creating of shipment forced * and ship partially disabled for order */ if ($this->getOrder()->getForcedShipmentWithInvoice() && ($this->canShipPartially($this->getOrder()) || $this->canShipPartiallyItem($this->getOrder())) ) { return false; } if ($this->getOrder()->getPayment()->canCapture()) { return $this->getOrder()->getPayment()->canCapturePartial(); } return true; } /** * Check capture availability * * @return bool */ public function canCapture() { if ($this->_authorization->isAllowed('Magento_Sales::capture')) { return $this->getInvoice()->canCapture(); } return false; } /** * Retrieve formated price * * @param float $price * @return string */ public function formatPrice($price) { return $this->getOrder()->formatPrice($price); } /** * Retrieve source * * @return \Magento\Sales\Model\Order\Invoice */ public function getSource() { return $this->getInvoice(); } /** * Retrieve invoice model instance * * @return \Magento\Sales\Model\Order\Invoice */ public function getInvoice() { return $this->_coreRegistry->registry('current_invoice'); } /** * @param \Magento\Store\Model\Store $store * @return bool */ public function canReturnToStock($store = null) { return $this->stockConfiguration->canSubtractQty($store); } /** * Whether to show 'Return to stock' checkbox for item * * @param Item $item * @return bool */ public function canReturnItemToStock($item = null) { if (null !== $item) { if (!$item->hasCanReturnToStock()) { $stockItem = $this->stockRegistry->getStockItem( $item->getOrderItem()->getProductId(), $item->getOrderItem()->getStore()->getWebsiteId() ); $item->setCanReturnToStock($stockItem->getManageStock()); } return $item->getCanReturnToStock(); } return $this->canReturnToStock(); } /** * Whether to show 'Return to stock' column for item parent * * @param Item $item * @return bool */ public function canParentReturnToStock($item = null) { if ($item !== null) { if ($item->getCreditmemo()->getOrder()->hasCanReturnToStock()) { return $item->getCreditmemo()->getOrder()->getCanReturnToStock(); } } elseif ($this->getOrder()->hasCanReturnToStock()) { return $this->getOrder()->getCanReturnToStock(); } return $this->canReturnToStock(); } /** * Return true if can ship partially * * @param Order|null $order * @return bool */ public function canShipPartially($order = null) { if ($order === null || !$order instanceof Order) { $order = $this->_coreRegistry->registry('current_shipment')->getOrder(); } $value = $order->getCanShipPartially(); if ($value !== null && !$value) { return false; } return true; } /** * Return true if can ship items partially * * @param Order|null $order * @return bool */ public function canShipPartiallyItem($order = null) { if ($order === null || !$order instanceof Order) { $order = $this->_coreRegistry->registry('current_shipment')->getOrder(); } $value = $order->getCanShipPartiallyItem(); if ($value !== null && !$value) { return false; } return true; } /** * Check is shipment is regular * * @return bool */ public function isShipmentRegular() { if (!$this->canShipPartiallyItem() || !$this->canShipPartially()) { return false; } return true; } }