/app/code/core/Mage/Sales/Model/Order.php
PHP | 2222 lines | 1168 code | 197 blank | 857 comment | 211 complexity | e71f5d183b860d820e9d44d6b4331e47 MD5 | raw file
Possible License(s): CC-BY-SA-3.0
Large files files are truncated, but you can click here to view the full file
- <?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) 2012 Magento Inc. (http://www.magentocommerce.com)
- * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
- */
- /**
- * Order model
- *
- * Supported events:
- * sales_order_load_after
- * sales_order_save_before
- * sales_order_save_after
- * sales_order_delete_before
- * sales_order_delete_after
- *
- * @method Mage_Sales_Model_Resource_Order _getResource()
- * @method Mage_Sales_Model_Resource_Order getResource()
- * @method string getState()
- * @method string getStatus()
- * @method Mage_Sales_Model_Order setStatus(string $value)
- * @method string getCouponCode()
- * @method Mage_Sales_Model_Order setCouponCode(string $value)
- * @method string getProtectCode()
- * @method Mage_Sales_Model_Order setProtectCode(string $value)
- * @method string getShippingDescription()
- * @method Mage_Sales_Model_Order setShippingDescription(string $value)
- * @method int getIsVirtual()
- * @method Mage_Sales_Model_Order setIsVirtual(int $value)
- * @method int getStoreId()
- * @method Mage_Sales_Model_Order setStoreId(int $value)
- * @method int getCustomerId()
- * @method Mage_Sales_Model_Order setCustomerId(int $value)
- * @method float getBaseDiscountAmount()
- * @method Mage_Sales_Model_Order setBaseDiscountAmount(float $value)
- * @method float getBaseDiscountCanceled()
- * @method Mage_Sales_Model_Order setBaseDiscountCanceled(float $value)
- * @method float getBaseDiscountInvoiced()
- * @method Mage_Sales_Model_Order setBaseDiscountInvoiced(float $value)
- * @method float getBaseDiscountRefunded()
- * @method Mage_Sales_Model_Order setBaseDiscountRefunded(float $value)
- * @method float getBaseGrandTotal()
- * @method Mage_Sales_Model_Order setBaseGrandTotal(float $value)
- * @method float getBaseShippingAmount()
- * @method Mage_Sales_Model_Order setBaseShippingAmount(float $value)
- * @method float getBaseShippingCanceled()
- * @method Mage_Sales_Model_Order setBaseShippingCanceled(float $value)
- * @method float getBaseShippingInvoiced()
- * @method Mage_Sales_Model_Order setBaseShippingInvoiced(float $value)
- * @method float getBaseShippingRefunded()
- * @method Mage_Sales_Model_Order setBaseShippingRefunded(float $value)
- * @method float getBaseShippingTaxAmount()
- * @method Mage_Sales_Model_Order setBaseShippingTaxAmount(float $value)
- * @method float getBaseShippingTaxRefunded()
- * @method Mage_Sales_Model_Order setBaseShippingTaxRefunded(float $value)
- * @method float getBaseSubtotal()
- * @method Mage_Sales_Model_Order setBaseSubtotal(float $value)
- * @method float getBaseSubtotalCanceled()
- * @method Mage_Sales_Model_Order setBaseSubtotalCanceled(float $value)
- * @method float getBaseSubtotalInvoiced()
- * @method Mage_Sales_Model_Order setBaseSubtotalInvoiced(float $value)
- * @method float getBaseSubtotalRefunded()
- * @method Mage_Sales_Model_Order setBaseSubtotalRefunded(float $value)
- * @method float getBaseTaxAmount()
- * @method Mage_Sales_Model_Order setBaseTaxAmount(float $value)
- * @method float getBaseTaxCanceled()
- * @method Mage_Sales_Model_Order setBaseTaxCanceled(float $value)
- * @method float getBaseTaxInvoiced()
- * @method Mage_Sales_Model_Order setBaseTaxInvoiced(float $value)
- * @method float getBaseTaxRefunded()
- * @method Mage_Sales_Model_Order setBaseTaxRefunded(float $value)
- * @method float getBaseToGlobalRate()
- * @method Mage_Sales_Model_Order setBaseToGlobalRate(float $value)
- * @method float getBaseToOrderRate()
- * @method Mage_Sales_Model_Order setBaseToOrderRate(float $value)
- * @method float getBaseTotalCanceled()
- * @method Mage_Sales_Model_Order setBaseTotalCanceled(float $value)
- * @method float getBaseTotalInvoiced()
- * @method Mage_Sales_Model_Order setBaseTotalInvoiced(float $value)
- * @method float getBaseTotalInvoicedCost()
- * @method Mage_Sales_Model_Order setBaseTotalInvoicedCost(float $value)
- * @method float getBaseTotalOfflineRefunded()
- * @method Mage_Sales_Model_Order setBaseTotalOfflineRefunded(float $value)
- * @method float getBaseTotalOnlineRefunded()
- * @method Mage_Sales_Model_Order setBaseTotalOnlineRefunded(float $value)
- * @method float getBaseTotalPaid()
- * @method Mage_Sales_Model_Order setBaseTotalPaid(float $value)
- * @method float getBaseTotalQtyOrdered()
- * @method Mage_Sales_Model_Order setBaseTotalQtyOrdered(float $value)
- * @method float getBaseTotalRefunded()
- * @method Mage_Sales_Model_Order setBaseTotalRefunded(float $value)
- * @method float getDiscountAmount()
- * @method Mage_Sales_Model_Order setDiscountAmount(float $value)
- * @method float getDiscountCanceled()
- * @method Mage_Sales_Model_Order setDiscountCanceled(float $value)
- * @method float getDiscountInvoiced()
- * @method Mage_Sales_Model_Order setDiscountInvoiced(float $value)
- * @method float getDiscountRefunded()
- * @method Mage_Sales_Model_Order setDiscountRefunded(float $value)
- * @method float getGrandTotal()
- * @method Mage_Sales_Model_Order setGrandTotal(float $value)
- * @method float getShippingAmount()
- * @method Mage_Sales_Model_Order setShippingAmount(float $value)
- * @method float getShippingCanceled()
- * @method Mage_Sales_Model_Order setShippingCanceled(float $value)
- * @method float getShippingInvoiced()
- * @method Mage_Sales_Model_Order setShippingInvoiced(float $value)
- * @method float getShippingRefunded()
- * @method Mage_Sales_Model_Order setShippingRefunded(float $value)
- * @method float getShippingTaxAmount()
- * @method Mage_Sales_Model_Order setShippingTaxAmount(float $value)
- * @method float getShippingTaxRefunded()
- * @method Mage_Sales_Model_Order setShippingTaxRefunded(float $value)
- * @method float getStoreToBaseRate()
- * @method Mage_Sales_Model_Order setStoreToBaseRate(float $value)
- * @method float getStoreToOrderRate()
- * @method Mage_Sales_Model_Order setStoreToOrderRate(float $value)
- * @method float getSubtotal()
- * @method Mage_Sales_Model_Order setSubtotal(float $value)
- * @method float getSubtotalCanceled()
- * @method Mage_Sales_Model_Order setSubtotalCanceled(float $value)
- * @method float getSubtotalInvoiced()
- * @method Mage_Sales_Model_Order setSubtotalInvoiced(float $value)
- * @method float getSubtotalRefunded()
- * @method Mage_Sales_Model_Order setSubtotalRefunded(float $value)
- * @method float getTaxAmount()
- * @method Mage_Sales_Model_Order setTaxAmount(float $value)
- * @method float getTaxCanceled()
- * @method Mage_Sales_Model_Order setTaxCanceled(float $value)
- * @method float getTaxInvoiced()
- * @method Mage_Sales_Model_Order setTaxInvoiced(float $value)
- * @method float getTaxRefunded()
- * @method Mage_Sales_Model_Order setTaxRefunded(float $value)
- * @method float getTotalCanceled()
- * @method Mage_Sales_Model_Order setTotalCanceled(float $value)
- * @method float getTotalInvoiced()
- * @method Mage_Sales_Model_Order setTotalInvoiced(float $value)
- * @method float getTotalOfflineRefunded()
- * @method Mage_Sales_Model_Order setTotalOfflineRefunded(float $value)
- * @method float getTotalOnlineRefunded()
- * @method Mage_Sales_Model_Order setTotalOnlineRefunded(float $value)
- * @method float getTotalPaid()
- * @method Mage_Sales_Model_Order setTotalPaid(float $value)
- * @method float getTotalQtyOrdered()
- * @method Mage_Sales_Model_Order setTotalQtyOrdered(float $value)
- * @method float getTotalRefunded()
- * @method Mage_Sales_Model_Order setTotalRefunded(float $value)
- * @method int getCanShipPartially()
- * @method Mage_Sales_Model_Order setCanShipPartially(int $value)
- * @method int getCanShipPartiallyItem()
- * @method Mage_Sales_Model_Order setCanShipPartiallyItem(int $value)
- * @method int getCustomerIsGuest()
- * @method Mage_Sales_Model_Order setCustomerIsGuest(int $value)
- * @method int getCustomerNoteNotify()
- * @method Mage_Sales_Model_Order setCustomerNoteNotify(int $value)
- * @method int getBillingAddressId()
- * @method Mage_Sales_Model_Order setBillingAddressId(int $value)
- * @method int getCustomerGroupId()
- * @method Mage_Sales_Model_Order setCustomerGroupId(int $value)
- * @method int getEditIncrement()
- * @method Mage_Sales_Model_Order setEditIncrement(int $value)
- * @method int getEmailSent()
- * @method Mage_Sales_Model_Order setEmailSent(int $value)
- * @method int getForcedShipmentWithInvoice()
- * @method Mage_Sales_Model_Order setForcedShipmentWithInvoice(int $value)
- * @method int getGiftMessageId()
- * @method Mage_Sales_Model_Order setGiftMessageId(int $value)
- * @method int getPaymentAuthExpiration()
- * @method Mage_Sales_Model_Order setPaymentAuthExpiration(int $value)
- * @method int getPaypalIpnCustomerNotified()
- * @method Mage_Sales_Model_Order setPaypalIpnCustomerNotified(int $value)
- * @method int getQuoteAddressId()
- * @method Mage_Sales_Model_Order setQuoteAddressId(int $value)
- * @method int getQuoteId()
- * @method Mage_Sales_Model_Order setQuoteId(int $value)
- * @method int getShippingAddressId()
- * @method Mage_Sales_Model_Order setShippingAddressId(int $value)
- * @method float getAdjustmentNegative()
- * @method Mage_Sales_Model_Order setAdjustmentNegative(float $value)
- * @method float getAdjustmentPositive()
- * @method Mage_Sales_Model_Order setAdjustmentPositive(float $value)
- * @method float getBaseAdjustmentNegative()
- * @method Mage_Sales_Model_Order setBaseAdjustmentNegative(float $value)
- * @method float getBaseAdjustmentPositive()
- * @method Mage_Sales_Model_Order setBaseAdjustmentPositive(float $value)
- * @method float getBaseShippingDiscountAmount()
- * @method Mage_Sales_Model_Order setBaseShippingDiscountAmount(float $value)
- * @method float getBaseSubtotalInclTax()
- * @method Mage_Sales_Model_Order setBaseSubtotalInclTax(float $value)
- * @method Mage_Sales_Model_Order setBaseTotalDue(float $value)
- * @method float getPaymentAuthorizationAmount()
- * @method Mage_Sales_Model_Order setPaymentAuthorizationAmount(float $value)
- * @method float getShippingDiscountAmount()
- * @method Mage_Sales_Model_Order setShippingDiscountAmount(float $value)
- * @method float getSubtotalInclTax()
- * @method Mage_Sales_Model_Order setSubtotalInclTax(float $value)
- * @method Mage_Sales_Model_Order setTotalDue(float $value)
- * @method float getWeight()
- * @method Mage_Sales_Model_Order setWeight(float $value)
- * @method string getCustomerDob()
- * @method Mage_Sales_Model_Order setCustomerDob(string $value)
- * @method string getIncrementId()
- * @method Mage_Sales_Model_Order setIncrementId(string $value)
- * @method string getAppliedRuleIds()
- * @method Mage_Sales_Model_Order setAppliedRuleIds(string $value)
- * @method string getBaseCurrencyCode()
- * @method Mage_Sales_Model_Order setBaseCurrencyCode(string $value)
- * @method string getCustomerEmail()
- * @method Mage_Sales_Model_Order setCustomerEmail(string $value)
- * @method string getCustomerFirstname()
- * @method Mage_Sales_Model_Order setCustomerFirstname(string $value)
- * @method string getCustomerLastname()
- * @method Mage_Sales_Model_Order setCustomerLastname(string $value)
- * @method string getCustomerMiddlename()
- * @method Mage_Sales_Model_Order setCustomerMiddlename(string $value)
- * @method string getCustomerPrefix()
- * @method Mage_Sales_Model_Order setCustomerPrefix(string $value)
- * @method string getCustomerSuffix()
- * @method Mage_Sales_Model_Order setCustomerSuffix(string $value)
- * @method string getCustomerTaxvat()
- * @method Mage_Sales_Model_Order setCustomerTaxvat(string $value)
- * @method string getDiscountDescription()
- * @method Mage_Sales_Model_Order setDiscountDescription(string $value)
- * @method string getExtCustomerId()
- * @method Mage_Sales_Model_Order setExtCustomerId(string $value)
- * @method string getExtOrderId()
- * @method Mage_Sales_Model_Order setExtOrderId(string $value)
- * @method string getGlobalCurrencyCode()
- * @method Mage_Sales_Model_Order setGlobalCurrencyCode(string $value)
- * @method string getHoldBeforeState()
- * @method Mage_Sales_Model_Order setHoldBeforeState(string $value)
- * @method string getHoldBeforeStatus()
- * @method Mage_Sales_Model_Order setHoldBeforeStatus(string $value)
- * @method string getOrderCurrencyCode()
- * @method Mage_Sales_Model_Order setOrderCurrencyCode(string $value)
- * @method string getOriginalIncrementId()
- * @method Mage_Sales_Model_Order setOriginalIncrementId(string $value)
- * @method string getRelationChildId()
- * @method Mage_Sales_Model_Order setRelationChildId(string $value)
- * @method string getRelationChildRealId()
- * @method Mage_Sales_Model_Order setRelationChildRealId(string $value)
- * @method string getRelationParentId()
- * @method Mage_Sales_Model_Order setRelationParentId(string $value)
- * @method string getRelationParentRealId()
- * @method Mage_Sales_Model_Order setRelationParentRealId(string $value)
- * @method string getRemoteIp()
- * @method Mage_Sales_Model_Order setRemoteIp(string $value)
- * @method string getShippingMethod()
- * @method Mage_Sales_Model_Order setShippingMethod(string $value)
- * @method string getStoreCurrencyCode()
- * @method Mage_Sales_Model_Order setStoreCurrencyCode(string $value)
- * @method string getStoreName()
- * @method Mage_Sales_Model_Order setStoreName(string $value)
- * @method string getXForwardedFor()
- * @method Mage_Sales_Model_Order setXForwardedFor(string $value)
- * @method string getCustomerNote()
- * @method Mage_Sales_Model_Order setCustomerNote(string $value)
- * @method string getCreatedAt()
- * @method Mage_Sales_Model_Order setCreatedAt(string $value)
- * @method string getUpdatedAt()
- * @method Mage_Sales_Model_Order setUpdatedAt(string $value)
- * @method int getTotalItemCount()
- * @method Mage_Sales_Model_Order setTotalItemCount(int $value)
- * @method int getCustomerGender()
- * @method Mage_Sales_Model_Order setCustomerGender(int $value)
- * @method float getHiddenTaxAmount()
- * @method Mage_Sales_Model_Order setHiddenTaxAmount(float $value)
- * @method float getBaseHiddenTaxAmount()
- * @method Mage_Sales_Model_Order setBaseHiddenTaxAmount(float $value)
- * @method float getShippingHiddenTaxAmount()
- * @method Mage_Sales_Model_Order setShippingHiddenTaxAmount(float $value)
- * @method float getBaseShippingHiddenTaxAmnt()
- * @method Mage_Sales_Model_Order setBaseShippingHiddenTaxAmnt(float $value)
- * @method float getHiddenTaxInvoiced()
- * @method Mage_Sales_Model_Order setHiddenTaxInvoiced(float $value)
- * @method float getBaseHiddenTaxInvoiced()
- * @method Mage_Sales_Model_Order setBaseHiddenTaxInvoiced(float $value)
- * @method float getHiddenTaxRefunded()
- * @method Mage_Sales_Model_Order setHiddenTaxRefunded(float $value)
- * @method float getBaseHiddenTaxRefunded()
- * @method Mage_Sales_Model_Order setBaseHiddenTaxRefunded(float $value)
- * @method float getShippingInclTax()
- * @method Mage_Sales_Model_Order setShippingInclTax(float $value)
- * @method float getBaseShippingInclTax()
- * @method Mage_Sales_Model_Order setBaseShippingInclTax(float $value)
- *
- * @category Mage
- * @package Mage_Sales
- * @author Magento Core Team <core@magentocommerce.com>
- */
- class Mage_Sales_Model_Order extends Mage_Sales_Model_Abstract
- {
- const ENTITY = 'order';
- /**
- * XML configuration paths
- */
- const XML_PATH_EMAIL_TEMPLATE = 'sales_email/order/template';
- const XML_PATH_EMAIL_GUEST_TEMPLATE = 'sales_email/order/guest_template';
- const XML_PATH_EMAIL_IDENTITY = 'sales_email/order/identity';
- const XML_PATH_EMAIL_COPY_TO = 'sales_email/order/copy_to';
- const XML_PATH_EMAIL_COPY_METHOD = 'sales_email/order/copy_method';
- const XML_PATH_EMAIL_ENABLED = 'sales_email/order/enabled';
- const XML_PATH_UPDATE_EMAIL_TEMPLATE = 'sales_email/order_comment/template';
- const XML_PATH_UPDATE_EMAIL_GUEST_TEMPLATE = 'sales_email/order_comment/guest_template';
- const XML_PATH_UPDATE_EMAIL_IDENTITY = 'sales_email/order_comment/identity';
- const XML_PATH_UPDATE_EMAIL_COPY_TO = 'sales_email/order_comment/copy_to';
- const XML_PATH_UPDATE_EMAIL_COPY_METHOD = 'sales_email/order_comment/copy_method';
- const XML_PATH_UPDATE_EMAIL_ENABLED = 'sales_email/order_comment/enabled';
- /**
- * Order states
- */
- const STATE_NEW = 'new';
- const STATE_PENDING_PAYMENT = 'pending_payment';
- const STATE_PROCESSING = 'processing';
- const STATE_COMPLETE = 'complete';
- const STATE_CLOSED = 'closed';
- const STATE_CANCELED = 'canceled';
- const STATE_HOLDED = 'holded';
- const STATE_PAYMENT_REVIEW = 'payment_review';
- /**
- * Order statuses
- */
- const STATUS_FRAUD = 'fraud';
- /**
- * Order flags
- */
- const ACTION_FLAG_CANCEL = 'cancel';
- const ACTION_FLAG_HOLD = 'hold';
- const ACTION_FLAG_UNHOLD = 'unhold';
- const ACTION_FLAG_EDIT = 'edit';
- const ACTION_FLAG_CREDITMEMO= 'creditmemo';
- const ACTION_FLAG_INVOICE = 'invoice';
- const ACTION_FLAG_REORDER = 'reorder';
- const ACTION_FLAG_SHIP = 'ship';
- const ACTION_FLAG_COMMENT = 'comment';
- /**
- * Report date types
- */
- const REPORT_DATE_TYPE_CREATED = 'created';
- const REPORT_DATE_TYPE_UPDATED = 'updated';
- /*
- * Identifier for history item
- */
- const HISTORY_ENTITY_NAME = 'order';
- protected $_eventPrefix = 'sales_order';
- protected $_eventObject = 'order';
- protected $_addresses = null;
- protected $_items = null;
- protected $_payments = null;
- protected $_statusHistory = null;
- protected $_invoices;
- protected $_tracks;
- protected $_shipments;
- protected $_creditmemos;
- protected $_relatedObjects = array();
- protected $_orderCurrency = null;
- protected $_baseCurrency = null;
- /**
- * Array of action flags for canUnhold, canEdit, etc.
- *
- * @var array
- */
- protected $_actionFlag = array();
- /**
- * Flag: if after order placing we can send new email to the customer.
- *
- * @var bool
- */
- protected $_canSendNewEmailFlag = true;
- /*
- * Identifier for history item
- *
- * @var string
- */
- protected $_historyEntityName = self::HISTORY_ENTITY_NAME;
- /**
- * Initialize resource model
- */
- protected function _construct()
- {
- $this->_init('Mage_Sales_Model_Resource_Order');
- }
- /**
- * Clear order object data
- *
- * @param string $key data key
- * @return Mage_Sales_Model_Order
- */
- public function unsetData($key=null)
- {
- parent::unsetData($key);
- if (is_null($key)) {
- $this->_items = null;
- }
- return $this;
- }
- /**
- * Retrieve can flag for action (edit, unhold, etc..)
- *
- * @param string $action
- * @return boolean|null
- */
- public function getActionFlag($action)
- {
- if (isset($this->_actionFlag[$action])) {
- return $this->_actionFlag[$action];
- }
- return null;
- }
- /**
- * Set can flag value for action (edit, unhold, etc...)
- *
- * @param string $action
- * @param boolean $flag
- * @return Mage_Sales_Model_Order
- */
- public function setActionFlag($action, $flag)
- {
- $this->_actionFlag[$action] = (boolean) $flag;
- return $this;
- }
- /**
- * Return flag for order if it can sends new email to customer.
- *
- * @return bool
- */
- public function getCanSendNewEmailFlag()
- {
- return $this->_canSendNewEmailFlag;
- }
- /**
- * Set flag for order if it can sends new email to customer.
- *
- * @param bool $flag
- * @return Mage_Sales_Model_Order
- */
- public function setCanSendNewEmailFlag($flag)
- {
- $this->_canSendNewEmailFlag = (boolean) $flag;
- return $this;
- }
- /**
- * Load order by system increment identifier
- *
- * @param string $incrementId
- * @return Mage_Sales_Model_Order
- */
- public function loadByIncrementId($incrementId)
- {
- return $this->loadByAttribute('increment_id', $incrementId);
- }
- /**
- * Load order by custom attribute value. Attribute value should be unique
- *
- * @param string $attribute
- * @param string $value
- * @return Mage_Sales_Model_Order
- */
- public function loadByAttribute($attribute, $value)
- {
- $this->load($value, $attribute);
- return $this;
- }
- /**
- * Retrieve store model instance
- *
- * @return Mage_Core_Model_Store
- */
- public function getStore()
- {
- $storeId = $this->getStoreId();
- if ($storeId) {
- return Mage::app()->getStore($storeId);
- }
- return Mage::app()->getStore();
- }
- /**
- * Retrieve order cancel availability
- *
- * @return bool
- */
- public function canCancel()
- {
- if ($this->canUnhold()) { // $this->isPaymentReview()
- return false;
- }
- $allInvoiced = true;
- foreach ($this->getAllItems() as $item) {
- if ($item->getQtyToInvoice()) {
- $allInvoiced = false;
- break;
- }
- }
- if ($allInvoiced) {
- return false;
- }
- $state = $this->getState();
- if ($this->isCanceled() || $state === self::STATE_COMPLETE || $state === self::STATE_CLOSED) {
- return false;
- }
- if ($this->getActionFlag(self::ACTION_FLAG_CANCEL) === false) {
- return false;
- }
- /**
- * Use only state for availability detect
- */
- /*foreach ($this->getAllItems() as $item) {
- if ($item->getQtyToCancel()>0) {
- return true;
- }
- }
- return false;*/
- return true;
- }
- /**
- * Getter whether the payment can be voided
- * @return bool
- */
- public function canVoidPayment()
- {
- if ($this->canUnhold() || $this->isPaymentReview()) {
- return false;
- }
- $state = $this->getState();
- if ($this->isCanceled() || $state === self::STATE_COMPLETE || $state === self::STATE_CLOSED) {
- return false;
- }
- return $this->getPayment()->canVoid(new Varien_Object);
- }
- /**
- * Retrieve order invoice availability
- *
- * @return bool
- */
- public function canInvoice()
- {
- if ($this->canUnhold() || $this->isPaymentReview()) {
- return false;
- }
- $state = $this->getState();
- if ($this->isCanceled() || $state === self::STATE_COMPLETE || $state === self::STATE_CLOSED) {
- return false;
- }
- if ($this->getActionFlag(self::ACTION_FLAG_INVOICE) === false) {
- return false;
- }
- foreach ($this->getAllItems() as $item) {
- if ($item->getQtyToInvoice()>0 && !$item->getLockedDoInvoice()) {
- return true;
- }
- }
- return false;
- }
- /**
- * Retrieve order credit memo (refund) availability
- *
- * @return bool
- */
- public function canCreditmemo()
- {
- if ($this->hasForcedCanCreditmemo()) {
- return $this->getForcedCanCreditmemo();
- }
- if ($this->canUnhold() || $this->isPaymentReview()) {
- return false;
- }
- if ($this->isCanceled() || $this->getState() === self::STATE_CLOSED) {
- return false;
- }
- /**
- * We can have problem with float in php (on some server $a=762.73;$b=762.73; $a-$b!=0)
- * for this we have additional diapason for 0
- * TotalPaid - contains amount, that were not rounded.
- */
- if (abs($this->getStore()->roundPrice($this->getTotalPaid()) - $this->getTotalRefunded()) < .0001) {
- return false;
- }
- if ($this->getActionFlag(self::ACTION_FLAG_EDIT) === false) {
- return false;
- }
- return true;
- }
- /**
- * Retrieve order hold availability
- *
- * @return bool
- */
- public function canHold()
- {
- $state = $this->getState();
- if ($this->isCanceled() || $this->isPaymentReview()
- || $state === self::STATE_COMPLETE || $state === self::STATE_CLOSED || $state === self::STATE_HOLDED) {
- return false;
- }
- if ($this->getActionFlag(self::ACTION_FLAG_HOLD) === false) {
- return false;
- }
- return true;
- }
- /**
- * Retrieve order unhold availability
- *
- * @return bool
- */
- public function canUnhold()
- {
- if ($this->getActionFlag(self::ACTION_FLAG_UNHOLD) === false || $this->isPaymentReview()) {
- return false;
- }
- return $this->getState() === self::STATE_HOLDED;
- }
- /**
- * Check if comment can be added to order history
- *
- * @return bool
- */
- public function canComment()
- {
- if ($this->getActionFlag(self::ACTION_FLAG_COMMENT) === false) {
- return false;
- }
- return true;
- }
- /**
- * Retrieve order shipment availability
- *
- * @return bool
- */
- public function canShip()
- {
- if ($this->canUnhold() || $this->isPaymentReview()) {
- return false;
- }
- if ($this->getIsVirtual() || $this->isCanceled()) {
- return false;
- }
- if ($this->getActionFlag(self::ACTION_FLAG_SHIP) === false) {
- return false;
- }
- foreach ($this->getAllItems() as $item) {
- if ($item->getQtyToShip()>0 && !$item->getIsVirtual()
- && !$item->getLockedDoShip())
- {
- return true;
- }
- }
- return false;
- }
- /**
- * Retrieve order edit availability
- *
- * @return bool
- */
- public function canEdit()
- {
- if ($this->canUnhold()) {
- return false;
- }
- $state = $this->getState();
- if ($this->isCanceled() || $this->isPaymentReview()
- || $state === self::STATE_COMPLETE || $state === self::STATE_CLOSED) {
- return false;
- }
- if (!$this->getPayment()->getMethodInstance()->canEdit()) {
- return false;
- }
- if ($this->getActionFlag(self::ACTION_FLAG_EDIT) === false) {
- return false;
- }
- return true;
- }
- /**
- * Retrieve order reorder availability
- *
- * @return bool
- */
- public function canReorder()
- {
- return $this->_canReorder(false);
- }
- /**
- * Check the ability to reorder ignoring the availability in stock or status of the ordered products
- *
- * @return bool
- */
- public function canReorderIgnoreSalable()
- {
- return $this->_canReorder(true);
- }
- /**
- * Retrieve order reorder availability
- *
- * @param bool $ignoreSalable
- * @return bool
- */
- protected function _canReorder($ignoreSalable = false)
- {
- if ($this->canUnhold() || $this->isPaymentReview() || !$this->getCustomerId()) {
- return false;
- }
- $products = array();
- foreach ($this->getItemsCollection() as $item) {
- $products[] = $item->getProductId();
- }
- if (!empty($products)) {
- /*
- * @TODO ACPAOC: Use product collection here, but ensure that product
- * is loaded with order store id, otherwise there'll be problems with isSalable()
- * for configurables, bundles and other composites
- *
- */
- /*
- $productsCollection = Mage::getModel('Mage_Catalog_Model_Product')->getCollection()
- ->setStoreId($this->getStoreId())
- ->addIdFilter($products)
- ->addAttributeToSelect('status')
- ->load();
- foreach ($productsCollection as $product) {
- if (!$product->isSalable()) {
- return false;
- }
- }
- */
- foreach ($products as $productId) {
- $product = Mage::getModel('Mage_Catalog_Model_Product')
- ->setStoreId($this->getStoreId())
- ->load($productId);
- if (!$product->getId() || (!$ignoreSalable && !$product->isSalable())) {
- return false;
- }
- }
- }
- if ($this->getActionFlag(self::ACTION_FLAG_REORDER) === false) {
- return false;
- }
- return true;
- }
- /**
- * Check whether the payment is in payment review state
- * In this state order cannot be normally processed. Possible actions can be:
- * - accept or deny payment
- * - fetch transaction information
- *
- * @return bool
- */
- public function isPaymentReview()
- {
- return $this->getState() === self::STATE_PAYMENT_REVIEW;
- }
- /**
- * Check whether payment can be accepted or denied
- *
- * @return bool
- */
- public function canReviewPayment()
- {
- return $this->isPaymentReview() && $this->getPayment()->canReviewPayment();
- }
- /**
- * Check whether there can be a transaction update fetched for payment in review state
- *
- * @return bool
- */
- public function canFetchPaymentReviewUpdate()
- {
- return $this->isPaymentReview() && $this->getPayment()->canFetchTransactionInfo();
- }
- /**
- * Retrieve order configuration model
- *
- * @return Mage_Sales_Model_Order_Config
- */
- public function getConfig()
- {
- return Mage::getSingleton('Mage_Sales_Model_Order_Config');
- }
- /**
- * Place order payments
- *
- * @return Mage_Sales_Model_Order
- */
- protected function _placePayment()
- {
- $this->getPayment()->place();
- return $this;
- }
- /**
- * Retrieve order payment model object
- *
- * @return Mage_Sales_Model_Order_Payment
- */
- public function getPayment()
- {
- foreach ($this->getPaymentsCollection() as $payment) {
- if (!$payment->isDeleted()) {
- return $payment;
- }
- }
- return false;
- }
- /**
- * Declare order billing address
- *
- * @param Mage_Sales_Model_Order_Address $address
- * @return Mage_Sales_Model_Order
- */
- public function setBillingAddress(Mage_Sales_Model_Order_Address $address)
- {
- $old = $this->getBillingAddress();
- if (!empty($old)) {
- $address->setId($old->getId());
- }
- $this->addAddress($address->setAddressType('billing'));
- return $this;
- }
- /**
- * Declare order shipping address
- *
- * @param Mage_Sales_Model_Order_Address $address
- * @return Mage_Sales_Model_Order
- */
- public function setShippingAddress(Mage_Sales_Model_Order_Address $address)
- {
- $old = $this->getShippingAddress();
- if (!empty($old)) {
- $address->setId($old->getId());
- }
- $this->addAddress($address->setAddressType('shipping'));
- return $this;
- }
- /**
- * Retrieve order billing address
- *
- * @return Mage_Sales_Model_Order_Address
- */
- public function getBillingAddress()
- {
- foreach ($this->getAddressesCollection() as $address) {
- if ($address->getAddressType()=='billing' && !$address->isDeleted()) {
- return $address;
- }
- }
- return false;
- }
- /**
- * Retrieve order shipping address
- *
- * @return Mage_Sales_Model_Order_Address|bool
- */
- public function getShippingAddress()
- {
- foreach ($this->getAddressesCollection() as $address) {
- if ($address->getAddressType() == 'shipping' && !$address->isDeleted()) {
- return $address;
- }
- }
- return false;
- }
- /**
- * Order state setter.
- * If status is specified, will add order status history with specified comment
- * the setData() cannot be overriden because of compatibility issues with resource model
- *
- * @param string $state
- * @param string|bool $status
- * @param string $comment
- * @param bool $isCustomerNotified
- * @return Mage_Sales_Model_Order
- */
- public function setState($state, $status = false, $comment = '', $isCustomerNotified = null)
- {
- return $this->_setState($state, $status, $comment, $isCustomerNotified, true);
- }
- /**
- * Order state protected setter.
- * By default allows to set any state. Can also update status to default or specified value
- * 小omplete and closed states are encapsulated intentionally, see the _checkState()
- *
- * @param string $state
- * @param string|bool $status
- * @param string $comment
- * @param bool $isCustomerNotified
- * @param $shouldProtectState
- * @return Mage_Sales_Model_Order
- */
- protected function _setState($state, $status = false, $comment = '',
- $isCustomerNotified = null, $shouldProtectState = false)
- {
- // attempt to set the specified state
- if ($shouldProtectState) {
- if ($this->isStateProtected($state)) {
- Mage::throwException(
- Mage::helper('Mage_Sales_Helper_Data')->__('The Order State "%s" must not be set manually.', $state)
- );
- }
- }
- $this->setData('state', $state);
- // add status history
- if ($status) {
- if ($status === true) {
- $status = $this->getConfig()->getStateDefaultStatus($state);
- }
- $this->setStatus($status);
- $history = $this->addStatusHistoryComment($comment, false); // no sense to set $status again
- $history->setIsCustomerNotified($isCustomerNotified); // for backwards compatibility
- }
- return $this;
- }
- /**
- * Whether specified state can be set from outside
- * @param $state
- * @return bool
- */
- public function isStateProtected($state)
- {
- if (empty($state)) {
- return false;
- }
- return self::STATE_COMPLETE == $state || self::STATE_CLOSED == $state;
- }
- /**
- * Retrieve label of order status
- *
- * @return string
- */
- public function getStatusLabel()
- {
- return $this->getConfig()->getStatusLabel($this->getStatus());
- }
- /**
- * Add status change information to history
- *
- * @param string $status
- * @param string $comment
- * @param bool $isCustomerNotified
- * @return Mage_Sales_Model_Order
- */
- public function addStatusToHistory($status, $comment = '', $isCustomerNotified = false)
- {
- $history = $this->addStatusHistoryComment($comment, $status)
- ->setIsCustomerNotified($isCustomerNotified);
- return $this;
- }
- /*
- * Add a comment to order
- * Different or default status may be specified
- *
- * @param string $comment
- * @param string $status
- * @return Mage_Sales_Order_Status_History
- */
- public function addStatusHistoryComment($comment, $status = false)
- {
- if (false === $status) {
- $status = $this->getStatus();
- } elseif (true === $status) {
- $status = $this->getConfig()->getStateDefaultStatus($this->getState());
- } else {
- $this->setStatus($status);
- }
- $history = Mage::getModel('Mage_Sales_Model_Order_Status_History')
- ->setStatus($status)
- ->setComment($comment)
- ->setEntityName($this->_historyEntityName);
- $this->addStatusHistory($history);
- return $history;
- }
- /**
- * Overrides entity id, which will be saved to comments history status
- *
- * @param string $status
- * @return Mage_Sales_Model_Order
- */
- public function setHistoryEntityName( $entityName )
- {
- $this->_historyEntityName = $entityName;
- return $this;
- }
- /**
- * Place order
- *
- * @return Mage_Sales_Model_Order
- */
- public function place()
- {
- Mage::dispatchEvent('sales_order_place_before', array('order'=>$this));
- $this->_placePayment();
- Mage::dispatchEvent('sales_order_place_after', array('order'=>$this));
- return $this;
- }
- public function hold()
- {
- if (!$this->canHold()) {
- Mage::throwException(Mage::helper('Mage_Sales_Helper_Data')->__('Hold action is not available.'));
- }
- $this->setHoldBeforeState($this->getState());
- $this->setHoldBeforeStatus($this->getStatus());
- $this->setState(self::STATE_HOLDED, true);
- return $this;
- }
- /**
- * Attempt to unhold the order
- *
- * @return Mage_Sales_Model_Order
- * @throws Mage_Core_Exception
- */
- public function unhold()
- {
- if (!$this->canUnhold()) {
- Mage::throwException(Mage::helper('Mage_Sales_Helper_Data')->__('Unhold action is not available.'));
- }
- $this->setState($this->getHoldBeforeState(), $this->getHoldBeforeStatus());
- $this->setHoldBeforeState(null);
- $this->setHoldBeforeStatus(null);
- return $this;
- }
- /**
- * Cancel order
- *
- * @return Mage_Sales_Model_Order
- */
- public function cancel()
- {
- if ($this->canCancel()) {
- $this->getPayment()->cancel();
- $this->registerCancellation();
- Mage::dispatchEvent('order_cancel_after', array('order' => $this));
- }
- return $this;
- }
- /**
- * Prepare order totals to cancellation
- * @param string $comment
- * @param bool $graceful
- * @return Mage_Sales_Model_Order
- * @throws Mage_Core_Exception
- */
- public function registerCancellation($comment = '', $graceful = true)
- {
- if ($this->canCancel()) {
- $cancelState = self::STATE_CANCELED;
- foreach ($this->getAllItems() as $item) {
- if ($cancelState != self::STATE_PROCESSING && $item->getQtyToRefund()) {
- if ($item->getQtyToShip() > $item->getQtyToCancel()) {
- $cancelState = self::STATE_PROCESSING;
- } else {
- $cancelState = self::STATE_COMPLETE;
- }
- }
- $item->cancel();
- }
- $this->setSubtotalCanceled($this->getSubtotal() - $this->getSubtotalInvoiced());
- $this->setBaseSubtotalCanceled($this->getBaseSubtotal() - $this->getBaseSubtotalInvoiced());
- $this->setTaxCanceled($this->getTaxAmount() - $this->getTaxInvoiced());
- $this->setBaseTaxCanceled($this->getBaseTaxAmount() - $this->getBaseTaxInvoiced());
- $this->setShippingCanceled($this->getShippingAmount() - $this->getShippingInvoiced());
- $this->setBaseShippingCanceled($this->getBaseShippingAmount() - $this->getBaseShippingInvoiced());
- $this->setDiscountCanceled(abs($this->getDiscountAmount()) - $this->getDiscountInvoiced());
- $this->setBaseDiscountCanceled(abs($this->getBaseDiscountAmount()) - $this->getBaseDiscountInvoiced());
- $this->setTotalCanceled($this->getGrandTotal() - $this->getTotalPaid());
- $this->setBaseTotalCanceled($this->getBaseGrandTotal() - $this->getBaseTotalPaid());
- $this->_setState($cancelState, true, $comment);
- } elseif (!$graceful) {
- Mage::throwException(Mage::helper('Mage_Sales_Helper_Data')->__('Order does not allow to be canceled.'));
- }
- return $this;
- }
- /**
- * Retrieve tracking numbers
- *
- * @return array
- */
- public function getTrackingNumbers()
- {
- if ($this->getData('tracking_numbers')) {
- return explode(',', $this->getData('tracking_numbers'));
- }
- return array();
- }
- /**
- * Return model of shipping carrier
- *
- * @return bool|float|Mage_Shipping_Model_Carrier_Abstract
- */
- public function getShippingCarrier()
- {
- $carrierModel = $this->getData('shipping_carrier');
- if (is_null($carrierModel)) {
- $carrierModel = false;
- /**
- * $method - carrier_method
- */
- $method = $this->getShippingMethod(true);
- if ($method instanceof Varien_Object) {
- $className = Mage::getStoreConfig('carriers/' . $method->getCarrierCode() . '/model');
- if ($className) {
- $carrierModel = Mage::getModel($className);
- }
- }
- $this->setData('shipping_carrier', $carrierModel);
- }
- return $carrierModel;
- }
- /**
- * Retrieve shipping method
- *
- * @param bool $asObject return carrier code and shipping method data as object
- * @return string|Varien_Object
- */
- public function getShippingMethod($asObject = false)
- {
- $shippingMethod = parent::getShippingMethod();
- if (!$asObject) {
- return $shippingMethod;
- } else {
- list($carrierCode, $method) = explode('_', $shippingMethod, 2);
- return new Varien_Object(array(
- 'carrier_code' => $carrierCode,
- 'method' => $method
- ));
- }
- }
- /**
- * Send email with order data
- *
- * @return Mage_Sales_Model_Order
- */
- public function sendNewOrderEmail()
- {
- $storeId = $this->getStore()->getId();
- if (!Mage::helper('Mage_Sales_Helper_Data')->canSendNewOrderEmail($storeId)) {
- return $this;
- }
- // Get the destination email addresses to send copies to
- $copyTo = $this->_getEmails(self::XML_PATH_EMAIL_COPY_TO);
- $copyMethod = Mage::getStoreConfig(self::XML_PATH_EMAIL_COPY_METHOD, $storeId);
- // Start store emulation process
- $appEmulation = Mage::getSingleton('Mage_Core_Model_App_Emulation');
- $initialEnvironmentInfo = $appEmulation->startEnvironmentEmulation($storeId);
- try {
- // Retrieve specified view block from appropriate design package (depends on emulated store)
- $paymentBlock = Mage::helper('Mage_Payment_Helper_Data')->getInfoBlock($this->getPayment())
- ->setArea('frontend')
- ->setIsSecureMode(true);
- $paymentBlock->getMethod()->setStore($storeId);
- $paymentBlockHtml = $paymentBlock->toHtml();
- } catch (Exception $exception) {
- // Stop store emulation process
- $appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
- throw $exception;
- }
- // Stop store emulation process
- $appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
- // Retrieve corresponding email template id and customer name
- if ($this->getCustomerIsGuest()) {
- $templateId = Mage::getStoreConfig(self::XML_PATH_EMAIL_GUEST_TEMPLATE, $storeId);
- $customerName = $this->getBillingAddress()->getName();
- } else {
- $templateId = Mage::getStoreConfig(self::XML_PATH_EMAIL_TEMPLATE, $storeId);
- $customerName = $this->getCustomerName();
- }
- $mailer = Mage::getModel('Mage_Core_Model_Email_Template_Mailer');
- $emailInfo = Mage::getModel('Mage_Core_Model_Email_Info');
- $emailInfo->addTo($this->getCustomerEmail(), $customerName);
- if ($copyTo && $copyMethod == 'bcc') {
- // Add bcc to customer email
- foreach ($copyTo as $email) {
- $emailInfo->addBcc($email);
- }
- }
- $mailer->addEmailInfo($emailInfo);
- // Email copies are sent as separated emails if their copy method is 'copy'
- if ($copyTo && $copyMethod == 'copy') {
- foreach ($copyTo as $email) {
- $emailInfo = Mage::getModel('Mage_Core_Model_Email_Info');
- $emailInfo->addTo($email);
- $mailer->addEmailInfo($emailInfo);
- }
- }
- // Set all required params and send emails
- $mailer->setSender(Mage::getStoreConfig(self::XML_PATH_EMAIL_IDENTITY, $storeId));
- $mailer->setStoreId($storeId);
- $mailer->setTemplateId($templateId);
- $mailer->setTemplateParams(array(
- 'order' => $this,
- 'billing' => $this->getBillingAddress(),
- 'payment_html' => $paymentBlockHtml
- )
- );
- $mailer->send();
- $this->setEmailSent(true);
- $this->_getResource()->saveAttribute($this, 'email_sent');
- return $this;
- }
- /**
- * Send email with order update information
- *
- * @param boolean $notifyCustomer
- * @param string $comment
- * @return Mage_Sales_Model_Order
- */
- public function sendOrderUpdateEmail($notifyCustomer = true, $comment = '')
- {
- $storeId = $this->getStore()->getId();
- if (!Mage::helper('Mage_Sales_Helper_Data')->canSendOrderCommentEmail($storeId)) {
- return $this;
- }
- // Get the destination email addresses to send copies to
- $copyTo = $this->_getEmails(self::XML_PATH_UPDATE_EMAIL_COPY_TO);
- $copyMethod = Mage::getStoreConfig(self::XML_PATH_UPDATE_EMAIL_COPY_METHOD, $storeId);
- // Check if at least one recepient is found
- if (!$notifyCustomer && !$copyTo) {
- return $this;
- }
- // Retrieve corresponding email template id and customer name
- if ($this->getCustomerIsGuest()) {
- $templateId = Mage::getStoreConfig(self::XML_PATH_UPDATE_EMAIL_GUEST_TEMPLATE, $storeId);
- $customerName = $this->getBillingAddress()->getName();
- } else {
- $templateId = Mage::getStoreConfig(self::XML_PATH_UPDATE_EMAIL_TEMPLATE, $storeId);
- $customerName = $this->getCustomerName();
- }
- $mailer = Mage::getModel('Mage_Core_Model_Email_Template_Mailer');
- if ($notifyCustomer) {
- $emailInfo = Mage::getModel('Mage_Core_Model_Email_Info');
- $emailInfo->addTo($this->getCustomerEmail(), $customerName);
- if ($copyTo && $copyMethod == 'bcc') {
- // Add bcc to customer email
- foreach ($copyTo as $email) {
- $emailInfo->addBcc($email);
- }
- }
- $mailer->addEmailInfo($emailInfo);
- }
- // Email copies are sent as separated emails if their copy method is
- // 'copy' or a customer should not be notified
- if ($copyTo && ($copyMethod == 'copy' || !$notifyCustomer)) {
- foreach ($copyTo as $email) {
- $emailInfo = Mage::getModel('Mage_Core_Model_Email_Info');
- $emailInfo->addTo($email);
- $mailer->addEmailInfo($emailInfo);
- }
- }
- // Set all required params and send emails
- $mailer->setSender(Mage::getStoreConfig(self::XML_PATH_UPDATE_EMAIL_IDENTITY, $storeId));
- $mailer->setStoreId($storeId);
- $mailer->setTemplateId($templateId);
- $mailer->setTemplateParams(array(
- 'order' => $this,
- 'comment' => $comment,
- 'billing' => $this->getBillingAddress()
- )
- );
- $mailer->send();
- return $this;
- }
- protected function _getEmails($configPath)
- {
- $data = Mage::getStoreConfig($configPath, $this->getStoreId());
- if (!empty($data)) {
- return explode(',', $data);
- }
- return false;
- }
- /*********************** ADDRESSES ***************************/
- public function getAddressesCollection()
- {
- if (is_null($this->_addresses)) {
- $this->_addresses = Mage::getResourceModel('Mage_Sales_Model_Resource_Order_Address_Collection')
- ->setOrderFilter($this);
- if ($this->getId()) {
- foreach ($this->_addresses as $address) {
- $address->setOrder($this);
- }
- }
- }
- return $this->_addresses;
- }
- public function getAddressById($addressId)
- {
- foreach ($this->getAddressesCollection() as $address) {
- if ($address->getId()==$addressId) {
- return $address;
- }
- }
- return false;
- }
- public function addAddress(Mage_Sales_Model_Order_Address $address)
- {
- $address->setOrder($this)->setParentId($this->getId());
- if (!$address->getId()) {
- $this->getAddressesCollection()->addItem($address);
- }
- return $this;
- }
- public function getItemsCollection($filterByTypes = array(), $nonChildrenOnly = false)
- {
- if (is_null($this->_items)) {
- $this->_items = Mage::getResourceModel('Mage_Sales_Model_Resource_Order_Item_Collection')
- ->setOrderFilter($this);
- if ($filterByTypes) {
- $this->_items->filterByTypes($filterByTypes);
- }
- if ($nonChildrenOnly) {
- $this->_items->filterByParent();
- }
- if ($this->getId()) {
- …
Large files files are truncated, but you can click here to view the full file