*/
class Mage_Adminhtml_Block_Sales_Items_Abstract extends Mage_Adminhtml_Block_Template
{
/**
* Renderers with render type key
* block => the block name
* template => the template file
* renderer => the block object
*
* @var array
*/
protected $_itemRenders = array();
/**
* Renderers for other column with column name key
* block => the block name
* template => the template file
* renderer => the block object
*
* @var array
*/
protected $_columnRenders = array();
/**
* Flag - if it is set method canEditQty will return value of it
*
* @var boolean | null
*/
protected $_canEditQty = null;
/**
* Init block
*
*/
protected function _construct()
{
$this->addColumnRender('qty', 'adminhtml/sales_items_column_qty', 'sales/items/column/qty.phtml');
$this->addColumnRender('name', 'adminhtml/sales_items_column_name', 'sales/items/column/name.phtml');
parent::_construct();
}
/**
* Add item renderer
*
* @param string $type
* @param string $block
* @param string $template
* @return Mage_Adminhtml_Block_Sales_Items_Abstract
*/
public function addItemRender($type, $block, $template)
{
$this->_itemRenders[$type] = array(
'block' => $block,
'template' => $template,
'renderer' => null
);
return $this;
}
/**
* Add column renderer
*
* @param string $column
* @param string $block
* @param string $template
* @return Mage_Adminhtml_Block_Sales_Items_Abstract
*/
public function addColumnRender($column, $block, $template, $type=null)
{
if (!is_null($type)) {
$column .= '_' . $type;
}
$this->_columnRenders[$column] = array(
'block' => $block,
'template' => $template,
'renderer' => null
);
return $this;
}
/**
* Retrieve item renderer block
*
* @param string $type
* @return Mage_Core_Block_Abstract
*/
public function getItemRenderer($type)
{
if (!isset($this->_itemRenders[$type])) {
$type = 'default';
}
if (is_null($this->_itemRenders[$type]['renderer'])) {
$this->_itemRenders[$type]['renderer'] = $this->getLayout()
->createBlock($this->_itemRenders[$type]['block'])
->setTemplate($this->_itemRenders[$type]['template']);
foreach ($this->_columnRenders as $columnType=>$renderer) {
$this->_itemRenders[$type]['renderer']->addColumnRender($columnType, $renderer['block'], $renderer['template']);
}
}
return $this->_itemRenders[$type]['renderer'];
}
/**
* Retrieve column renderer block
*
* @param string $column
* @param string $compositePart
* @return Mage_Core_Block_Abstract
*/
public function getColumnRenderer($column, $compositePart='')
{
if (isset($this->_columnRenders[$column . '_' . $compositePart])) {
$column .= '_' . $compositePart;
}
if (!isset($this->_columnRenders[$column])) {
return false;
}
if (is_null($this->_columnRenders[$column]['renderer'])) {
$this->_columnRenders[$column]['renderer'] = $this->getLayout()
->createBlock($this->_columnRenders[$column]['block'])
->setTemplate($this->_columnRenders[$column]['template'])
->setRenderedBlock($this);
}
return $this->_columnRenders[$column]['renderer'];
}
/**
* Retrieve rendered item html content
*
* @param Varien_Object $item
* @return string
*/
public function getItemHtml(Varien_Object $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 Varien_Object $item
* @return string
*/
public function getItemExtraInfoHtml(Varien_Object $item)
{
$extraInfoBlock = $this->getChild('order_item_extra_info');
if ($extraInfoBlock) {
return $extraInfoBlock
->setItem($item)
->toHtml();
}
return '';
}
/**
* Retrieve rendered column html content
*
* @param Varien_Object $item
* @param string $column the column key
* @param string $field the custom item field
* @return string
*/
public function getColumnHtml(Varien_Object $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 (!is_null($field)) {
$block->setField($field);
}
return $block->toHtml();
}
return ' ';
}
public function getCreditmemo()
{
return Mage::registry('current_creditmemo');
}
/**
* ######################### SALES ##################################
*/
/**
* Retrieve available order
*
* @return Mage_Sales_Model_Order
*/
public function getOrder()
{
if ($this->hasOrder()) {
return $this->getData('order');
}
if (Mage::registry('current_order')) {
return Mage::registry('current_order');
}
if (Mage::registry('order')) {
return Mage::registry('order');
}
if ($this->getInvoice())
{
return $this->getInvoice()->getOrder();
}
if ($this->getCreditmemo())
{
return $this->getCreditmemo()->getOrder();
}
if ($this->getItem()->getOrder())
{
return $this->getItem()->getOrder();
}
Mage::throwException(Mage::helper('sales')->__('Cannot get order instance'));
}
/**
* Retrieve price data object
*
* @return Mage_Sales_Model_Order
*/
public function getPriceDataObject()
{
$obj = $this->getData('price_data_object');
if (is_null($obj)) {
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 formated 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 include tax html formated content
*
* @param Varien_Object $item
* @return string
*/
public function displayPriceInclTax(Varien_Object $item)
{
$qty = ($item->getQtyOrdered() ? $item->getQtyOrdered() : ($item->getQty() ? $item->getQty() : 1));
$baseTax = ($item->getTaxBeforeDiscount() ? $item->getTaxBeforeDiscount() : ($item->getTaxAmount() ? $item->getTaxAmount() : 0));
$tax = ($item->getBaseTaxBeforeDiscount() ? $item->getBaseTaxBeforeDiscount() : ($item->getBaseTaxAmount() ? $item->getBaseTaxAmount() : 0));
$basePriceTax = 0;
$priceTax = 0;
if (floatval($qty)) {
$basePriceTax = $item->getBasePrice()+$baseTax/$qty;
$priceTax = $item->getPrice()+$tax/$qty;
}
return $this->displayPrices(
$this->getOrder()->getStore()->roundPrice($basePriceTax),
$this->getOrder()->getStore()->roundPrice($priceTax)
);
}
/**
* Retrieve subtotal price include tax html formated content
*
* @param Varien_Object $item
* @return string
*/
public function displaySubtotalInclTax($item)
{
$baseTax = ($item->getTaxBeforeDiscount() ? $item->getTaxBeforeDiscount() : ($item->getTaxAmount() ? $item->getTaxAmount() : 0));
$tax = ($item->getBaseTaxBeforeDiscount() ? $item->getBaseTaxBeforeDiscount() : ($item->getBaseTaxAmount() ? $item->getBaseTaxAmount() : 0));
return $this->displayPrices(
$item->getBaseRowTotal()+$baseTax,
$item->getRowTotal()+$tax
);
}
/**
* Retrieve tax calculation html content
*
* @param Varien_Object $item
* @return string
*/
public function displayTaxCalculation(Varien_Object $item)
{
if ($item->getTaxPercent() && $item->getTaxString() == '') {
$percents = array($item->getTaxPercent());
} else if ($item->getTaxString()) {
$percents = explode(Mage_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 persent html content
*
* @param Varien_Object $item
* @return string
*/
public function displayTaxPercent(Varien_Object $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
*
* @return Mage_Adminhtml_Block_Sales_Items_Abstract
* @see self::_canEditQty
* @see self::canEditQty
*/
public function setCanEditQty($value) {
$this->_canEditQty = $value;
return $this;
}
/**
* Check availability to edit quantity of item
*
* @return boolean
*/
public function canEditQty()
{
/**
* If parent block has set
*/
if (!is_null($this->_canEditQty)) {
return $this->_canEditQty;
}
/**
* Disable editing of quantity of item if creating of shipment forced
* and ship partially disabled for order
*/
if ($this->getOrder()->getForcedDoShipmentWithInvoice()
&& ($this->canShipPartially($this->getOrder()) || $this->canShipPartiallyItem($this->getOrder()))
) {
return false;
}
if ($this->getOrder()->getPayment()->canCapture()) {
return $this->getOrder()->getPayment()->canCapturePartial();
}
return true;
}
public function canCapture()
{
if (Mage::getSingleton('admin/session')->isAllowed('sales/order/actions/capture')) {
return $this->getInvoice()->canCapture();
}
return false;
}
public function formatPrice($price)
{
return $this->getOrder()->formatPrice($price);
}
/**
* Retrieve source
*
* @return Mage_Sales_Model_Order_Invoice
*/
public function getSource()
{
return $this->getInvoice();
}
/**
* Retrieve invoice model instance
*
* @return Mage_Sales_Model_Invoice
*/
public function getInvoice()
{
return Mage::registry('current_invoice');
}
/**
* CREDITMEMO
*/
public function canReturnToStock() {
$canReturnToStock = Mage::getStoreConfig(Mage_CatalogInventory_Model_Stock_Item::XML_PATH_CAN_SUBTRACT);
if (Mage::getStoreConfig(Mage_CatalogInventory_Model_Stock_Item::XML_PATH_CAN_SUBTRACT)) {
return true;
} else {
return false;
}
}
/**
* Whether to show 'Return to stock' checkbox for item
* @param Mage_Sales_Model_Order_Creditmemo_Item $item
* @return bool
*/
public function canReturnItemToStock($item=null) {
$canReturnToStock = Mage::getStoreConfig(Mage_CatalogInventory_Model_Stock_Item::XML_PATH_CAN_SUBTRACT);
if (!is_null($item)) {
if (!$item->hasCanReturnToStock()) {
$product = Mage::getModel('catalog/product')->load($item->getOrderItem()->getProductId());
if ( $product->getId() && $product->getStockItem()->getManageStock() ) {
$item->setCanReturnToStock(true);
}
else {
$item->setCanReturnToStock(false);
}
}
$canReturnToStock = $item->getCanReturnToStock();
}
return $canReturnToStock;
}
/**
* Whether to show 'Return to stock' column for item parent
* @param Mage_Sales_Model_Order_Creditmemo_Item $item
* @return bool
*/
public function canParentReturnToStock($item = null)
{
$canReturnToStock = Mage::getStoreConfig(Mage_CatalogInventory_Model_Stock_Item::XML_PATH_CAN_SUBTRACT);
if (!is_null($item)) {
if ( $item->getCreditmemo()->getOrder()->hasCanReturnToStock() ) {
$canReturnToStock = $item->getCreditmemo()->getOrder()->getCanReturnToStock();
}
} elseif ( $this->getOrder()->hasCanReturnToStock() ) {
$canReturnToStock = $this->getOrder()->getCanReturnToStock();
}
return $canReturnToStock;
}
/**
* Return true if can ship partially
*
* @param Mage_Sales_Model_Order|null $order
* @return boolean
*/
public function canShipPartially($order = null)
{
if (is_null($order) || !$order instanceof Mage_Sales_Model_Order) {
$order = Mage::registry('current_shipment')->getOrder();
}
$value = $order->getCanShipPartially();
if (!is_null($value) && !$value) {
return false;
}
return true;
}
/**
* Return true if can ship items partially
*
* @param Mage_Sales_Model_Order|null $order
* @return boolean
*/
public function canShipPartiallyItem($order = null)
{
if (is_null($order) || !$order instanceof Mage_Sales_Model_Order) {
$order = Mage::registry('current_shipment')->getOrder();
}
$value = $order->getCanShipPartiallyItem();
if (!is_null($value) && !$value) {
return false;
}
return true;
}
public function isShipmentRegular()
{
if (!$this->canShipPartiallyItem() || !$this->canShipPartially()) {
return false;
}
return true;
}
}