/app/code/core/Mage/Sales/Model/Service/Order.php
PHP | 443 lines | 296 code | 33 blank | 114 comment | 80 complexity | fd2fbf2c4a5ab992321dfed882a83e66 MD5 | raw file
Possible License(s): CC-BY-SA-3.0, LGPL-2.1, GPL-2.0, WTFPL
- <?php
- /**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category Mage
- * @package Mage_Sales
- * @copyright Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
- * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
- */
- /**
- * Quote submit service model
- */
- class Mage_Sales_Model_Service_Order
- {
- /**
- * Order object
- *
- * @var Mage_Sales_Model_Order
- */
- protected $_order;
- /**
- * Quote convert object
- *
- * @var Mage_Sales_Model_Convert_Order
- */
- protected $_convertor;
- /**
- * Class constructor
- *
- * @param Mage_Sales_Model_Order $order
- */
- public function __construct(Mage_Sales_Model_Order $order)
- {
- $this->_order = $order;
- $this->_convertor = Mage::getModel('sales/convert_order');
- }
- /**
- * Quote convertor declaration
- *
- * @param Mage_Sales_Model_Convert_Order $convertor
- * @return Mage_Sales_Model_Service_Order
- */
- public function setConvertor(Mage_Sales_Model_Convert_Order $convertor)
- {
- $this->_convertor = $convertor;
- return $this;
- }
- /**
- * Get assigned order object
- *
- * @return Mage_Sales_Model_Order
- */
- public function getOrder()
- {
- return $this->_order;
- }
- /**
- * Prepare order invoice based on order data and requested items qtys
- *
- * @param array $data
- * @return Mage_Sales_Model_Order_Invoice
- */
- public function prepareInvoice($qtys = array())
- {
- $invoice = $this->_convertor->toInvoice($this->_order);
- $totalQty = 0;
- foreach ($this->_order->getAllItems() as $orderItem) {
- if (!$this->_canInvoiceItem($orderItem, $qtys)) {
- continue;
- }
- $item = $this->_convertor->itemToInvoiceItem($orderItem);
- if ($orderItem->isDummy()) {
- $qty = $orderItem->getQtyOrdered() ? $orderItem->getQtyOrdered() : 1;
- } else {
- if (isset($qtys[$orderItem->getId()])) {
- $qty = (float) $qtys[$orderItem->getId()];
- } elseif (!count($qtys)) {
- $qty = $orderItem->getQtyToInvoice();
- } else {
- continue;
- }
- }
- $totalQty += $qty;
- $item->setQty($qty);
- $invoice->addItem($item);
- }
- $invoice->setTotalQty($totalQty);
- $invoice->collectTotals();
- $this->_order->getInvoiceCollection()->addItem($invoice);
- return $invoice;
- }
- /**
- * Prepare order shipment based on order items and requested items qty
- *
- * @param array $data
- * @return Mage_Sales_Model_Order_Shipment
- */
- public function prepareShipment($qtys = array())
- {
- $totalQty = 0;
- $shipment = $this->_convertor->toShipment($this->_order);
- foreach ($this->_order->getAllItems() as $orderItem) {
- if (!$this->_canShipItem($orderItem, $qtys)) {
- continue;
- }
- $item = $this->_convertor->itemToShipmentItem($orderItem);
- if ($orderItem->isDummy(true)) {
- $qty = 1;
- } else {
- if (isset($qtys[$orderItem->getId()])) {
- $qty = min($qtys[$orderItem->getId()], $orderItem->getQtyToShip());
- } elseif (!count($qtys)) {
- $qty = $orderItem->getQtyToShip();
- } else {
- continue;
- }
- }
- $totalQty += $qty;
- $item->setQty($qty);
- $shipment->addItem($item);
- }
- $shipment->setTotalQty($totalQty);
- return $shipment;
- }
- /**
- * Prepare order creditmemo based on order items and requested params
- *
- * @param array $data
- * @return Mage_Sales_Model_Order_Creditmemo
- */
- public function prepareCreditmemo($data = array())
- {
- $totalQty = 0;
- $creditmemo = $this->_convertor->toCreditmemo($this->_order);
- $qtys = isset($data['qtys']) ? $data['qtys'] : array();
- foreach ($this->_order->getAllItems() as $orderItem) {
- if (!$this->_canRefundItem($orderItem, $qtys)) {
- continue;
- }
- $item = $this->_convertor->itemToCreditmemoItem($orderItem);
- if ($orderItem->isDummy()) {
- $qty = 1;
- } else {
- if (isset($qtys[$orderItem->getId()])) {
- $qty = (float) $qtys[$orderItem->getId()];
- } elseif (!count($qtys)) {
- $qty = $orderItem->getQtyToRefund();
- } else {
- continue;
- }
- }
- $totalQty += $qty;
- $item->setQty($qty);
- $creditmemo->addItem($item);
- }
- $creditmemo->setTotalQty($totalQty);
- $this->_initCreditmemoData($creditmemo, $data);
- $creditmemo->collectTotals();
- return $creditmemo;
- }
- /**
- * Prepare order creditmemo based on invoice items and requested requested params
- *
- * @param array $data
- * @return Mage_Sales_Model_Order_Creditmemo
- */
- public function prepareInvoiceCreditmemo($invoice, $data = array())
- {
- $totalQty = 0;
- $qtys = isset($data['qtys']) ? $data['qtys'] : array();
- $creditmemo = $this->_convertor->toCreditmemo($this->_order);
- $creditmemo->setInvoice($invoice);
- $invoiceQtysRefunded = array();
- foreach($invoice->getOrder()->getCreditmemosCollection() as $createdCreditmemo) {
- if ($createdCreditmemo->getState() != Mage_Sales_Model_Order_Creditmemo::STATE_CANCELED
- && $createdCreditmemo->getInvoiceId() == $invoice->getId()) {
- foreach($createdCreditmemo->getAllItems() as $createdCreditmemoItem) {
- $orderItemId = $createdCreditmemoItem->getOrderItem()->getId();
- if (isset($invoiceQtysRefunded[$orderItemId])) {
- $invoiceQtysRefunded[$orderItemId] += $createdCreditmemoItem->getQty();
- } else {
- $invoiceQtysRefunded[$orderItemId] = $createdCreditmemoItem->getQty();
- }
- }
- }
- }
- $invoiceQtysRefundLimits = array();
- foreach($invoice->getAllItems() as $invoiceItem) {
- $invoiceQtyCanBeRefunded = $invoiceItem->getQty();
- $orderItemId = $invoiceItem->getOrderItem()->getId();
- if (isset($invoiceQtysRefunded[$orderItemId])) {
- $invoiceQtyCanBeRefunded = $invoiceQtyCanBeRefunded - $invoiceQtysRefunded[$orderItemId];
- }
- $invoiceQtysRefundLimits[$orderItemId] = $invoiceQtyCanBeRefunded;
- }
- foreach ($invoice->getAllItems() as $invoiceItem) {
- $orderItem = $invoiceItem->getOrderItem();
- if (!$this->_canRefundItem($orderItem, $qtys, $invoiceQtysRefundLimits)) {
- continue;
- }
- $item = $this->_convertor->itemToCreditmemoItem($orderItem);
- if ($orderItem->isDummy()) {
- $qty = 1;
- } else {
- if (isset($qtys[$orderItem->getId()])) {
- $qty = (float) $qtys[$orderItem->getId()];
- } elseif (!count($qtys)) {
- $qty = $orderItem->getQtyToRefund();
- } else {
- continue;
- }
- if (isset($invoiceQtysRefundLimits[$orderItem->getId()])) {
- $qty = min($qty, $invoiceQtysRefundLimits[$orderItem->getId()]);
- }
- }
- $qty = min($qty, $invoiceItem->getQty());
- $totalQty += $qty;
- $item->setQty($qty);
- $creditmemo->addItem($item);
- }
- $creditmemo->setTotalQty($totalQty);
- $this->_initCreditmemoData($creditmemo, $data);
- if (!isset($data['shipping_amount'])) {
- $order = $invoice->getOrder();
- $isShippingInclTax = Mage::getSingleton('tax/config')->displaySalesShippingInclTax($order->getStoreId());
- if ($isShippingInclTax) {
- $baseAllowedAmount = $order->getBaseShippingInclTax()
- - $order->getBaseShippingRefunded()
- - $order->getBaseShippingTaxRefunded();
- } else {
- $baseAllowedAmount = $order->getBaseShippingAmount() - $order->getBaseShippingRefunded();
- $baseAllowedAmount = min($baseAllowedAmount, $invoice->getBaseShippingAmount());
- }
- $creditmemo->setBaseShippingAmount($baseAllowedAmount);
- }
- $creditmemo->collectTotals();
- return $creditmemo;
- }
- /**
- * Initialize creditmemo state based on requested parameters
- *
- * @param Mage_Sales_Model_Order_Creditmemo $creditmemo
- * @param array $data
- */
- protected function _initCreditmemoData($creditmemo, $data)
- {
- if (isset($data['shipping_amount'])) {
- $creditmemo->setBaseShippingAmount((float)$data['shipping_amount']);
- }
- if (isset($data['adjustment_positive'])) {
- $creditmemo->setAdjustmentPositive($data['adjustment_positive']);
- }
- if (isset($data['adjustment_negative'])) {
- $creditmemo->setAdjustmentNegative($data['adjustment_negative']);
- }
- }
- /**
- * Check if order item can be invoiced. Dummy item can be invoiced or with his childrens or
- * with parent item which is included to invoice
- *
- * @param Mage_Sales_Model_Order_Item $item
- * @param array $qtys
- * @return bool
- */
- protected function _canInvoiceItem($item, $qtys=array())
- {
- if ($item->getLockedDoInvoice()) {
- return false;
- }
- if ($item->isDummy()) {
- if ($item->getHasChildren()) {
- foreach ($item->getChildrenItems() as $child) {
- if (empty($qtys)) {
- if ($child->getQtyToInvoice() > 0) {
- return true;
- }
- } else {
- if (isset($qtys[$child->getId()]) && $qtys[$child->getId()] > 0) {
- return true;
- }
- }
- }
- return false;
- } else if($item->getParentItem()) {
- $parent = $item->getParentItem();
- if (empty($qtys)) {
- return $parent->getQtyToInvoice() > 0;
- } else {
- return isset($qtys[$parent->getId()]) && $qtys[$parent->getId()] > 0;
- }
- }
- } else {
- return $item->getQtyToInvoice() > 0;
- }
- }
- /**
- * Check if order item can be shiped. Dummy item can be shiped or with his childrens or
- * with parent item which is included to shipment
- *
- * @param Mage_Sales_Model_Order_Item $item
- * @param array $qtys
- * @return bool
- */
- protected function _canShipItem($item, $qtys=array())
- {
- if ($item->getIsVirtual() || $item->getLockedDoShip()) {
- return false;
- }
- if ($item->isDummy(true)) {
- if ($item->getHasChildren()) {
- if ($item->isShipSeparately()) {
- return true;
- }
- foreach ($item->getChildrenItems() as $child) {
- if ($child->getIsVirtual()) {
- continue;
- }
- if (empty($qtys)) {
- if ($child->getQtyToShip() > 0) {
- return true;
- }
- } else {
- if (isset($qtys[$child->getId()]) && $qtys[$child->getId()] > 0) {
- return true;
- }
- }
- }
- return false;
- } else if($item->getParentItem()) {
- $parent = $item->getParentItem();
- if (empty($qtys)) {
- return $parent->getQtyToShip() > 0;
- } else {
- return isset($qtys[$parent->getId()]) && $qtys[$parent->getId()] > 0;
- }
- }
- } else {
- return $item->getQtyToShip()>0;
- }
- }
- /**
- * Check if order item can be refunded
- *
- * @param Mage_Sales_Model_Order_Item $item
- * @param array $qtys
- * @param array $invoiceQtysRefundLimits
- * @return bool
- */
- protected function _canRefundItem($item, $qtys=array(), $invoiceQtysRefundLimits=array())
- {
- if ($item->isDummy()) {
- if ($item->getHasChildren()) {
- foreach ($item->getChildrenItems() as $child) {
- if (empty($qtys)) {
- if ($this->_canRefundNoDummyItem($child, $invoiceQtysRefundLimits)) {
- return true;
- }
- } else {
- if (isset($qtys[$child->getId()]) && $qtys[$child->getId()] > 0) {
- return true;
- }
- }
- }
- return false;
- } else if($item->getParentItem()) {
- $parent = $item->getParentItem();
- if (empty($qtys)) {
- return $this->_canRefundNoDummyItem($parent, $invoiceQtysRefundLimits);
- } else {
- return isset($qtys[$parent->getId()]) && $qtys[$parent->getId()] > 0;
- }
- }
- } else {
- return $this->_canRefundNoDummyItem($item, $invoiceQtysRefundLimits);
- }
- }
- /**
- * Check if no dummy order item can be refunded
- *
- * @param Mage_Sales_Model_Order_Item $item
- * @param array $invoiceQtysRefundLimits
- * @return bool
- */
- protected function _canRefundNoDummyItem($item, $invoiceQtysRefundLimits=array())
- {
- if ($item->getQtyToRefund() < 0) {
- return false;
- }
- if (isset($invoiceQtysRefundLimits[$item->getId()])) {
- return $invoiceQtysRefundLimits[$item->getId()] > 0;
- }
- return true;
- }
- }