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;
}
}