Overview

Packages

  • currencysymbol
  • MAbout
  • Mage
    • Admin
    • Adminhtml
    • AdminNotification
    • Api
    • Api2
    • Authorizenet
    • Backup
    • Bundle
    • Captcha
    • Catalog
    • CatalogIndex
    • CatalogInventory
    • CatalogRule
    • CatalogSearch
    • Centinel
    • Checkout
    • Cms
    • Compiler
    • Connect
    • Contacts
    • Core
    • Cron
    • CurrencySymbol
    • Customer
    • Dataflow
    • Directory
    • DirtectPost
    • Downloadable
    • Eav
    • GiftMessage
    • GoogleAnalytics
    • GoogleBase
    • GoogleCheckout
    • ImportExport
    • Index
    • Install
    • Log
    • Media
    • Newsletter
    • Oauth
    • Page
    • PageCache
    • Paygate
    • Payment
    • Paypal
    • PaypalUk
    • Persistent
    • Poll
    • ProductAlert
    • Rating
    • Reports
    • Review
    • Rss
    • Rule
    • Sales
    • SalesRule
    • Sedfriend
    • Sendfriend
    • Shipping
    • Sitemap
    • Tag
    • Tax
    • Usa
    • Weee
    • Widget
    • Wishlist
    • XmlConnect
  • None
  • Phoenix
    • Moneybookers
  • PHP
  • Zend
    • Date
    • Mime
    • XmlRpc

Classes

  • Mage_Bundle_Model_Sales_Order_Pdf_Items_Creditmemo
  • Mage_Bundle_Model_Sales_Order_Pdf_Items_Invoice
  • Mage_ImportExport_Model_Resource_Helper_Mysql4
  • Mage_Sales_Billing_AgreementController
  • Mage_Sales_Block_Adminhtml_Billing_Agreement
  • Mage_Sales_Block_Adminhtml_Billing_Agreement_Grid
  • Mage_Sales_Block_Adminhtml_Billing_Agreement_View
  • Mage_Sales_Block_Adminhtml_Billing_Agreement_View_Form
  • Mage_Sales_Block_Adminhtml_Billing_Agreement_View_Tab_Info
  • Mage_Sales_Block_Adminhtml_Billing_Agreement_View_Tab_Orders
  • Mage_Sales_Block_Adminhtml_Billing_Agreement_View_Tabs
  • Mage_Sales_Block_Adminhtml_Customer_Edit_Tab_Agreement
  • Mage_Sales_Block_Adminhtml_Customer_Edit_Tab_Recurring_Profile
  • Mage_Sales_Block_Adminhtml_Recurring_Profile
  • Mage_Sales_Block_Adminhtml_Recurring_Profile_Edit_Form
  • Mage_Sales_Block_Adminhtml_Recurring_Profile_Grid
  • Mage_Sales_Block_Adminhtml_Recurring_Profile_View
  • Mage_Sales_Block_Adminhtml_Recurring_Profile_View_Tab_Info
  • Mage_Sales_Block_Adminhtml_Recurring_Profile_View_Tab_Orders
  • Mage_Sales_Block_Adminhtml_Report_Filter_Form
  • Mage_Sales_Block_Adminhtml_Report_Filter_Form_Coupon
  • Mage_Sales_Block_Adminhtml_Report_Filter_Form_Order
  • Mage_Sales_Block_Billing_Agreement_View
  • Mage_Sales_Block_Billing_Agreements
  • Mage_Sales_Block_Guest_Links
  • Mage_Sales_Block_Items_Abstract
  • Mage_Sales_Block_Order_Comments
  • Mage_Sales_Block_Order_Creditmemo
  • Mage_Sales_Block_Order_Creditmemo_Items
  • Mage_Sales_Block_Order_Creditmemo_Totals
  • Mage_Sales_Block_Order_Details
  • Mage_Sales_Block_Order_Email_Creditmemo_Items
  • Mage_Sales_Block_Order_Email_Invoice_Items
  • Mage_Sales_Block_Order_Email_Items
  • Mage_Sales_Block_Order_Email_Items_Default
  • Mage_Sales_Block_Order_Email_Items_Order_Default
  • Mage_Sales_Block_Order_Email_Items_Order_Grouped
  • Mage_Sales_Block_Order_Email_Shipment_Items
  • Mage_Sales_Block_Order_History
  • Mage_Sales_Block_Order_Info
  • Mage_Sales_Block_Order_Info_Buttons
  • Mage_Sales_Block_Order_Invoice
  • Mage_Sales_Block_Order_Invoice_Items
  • Mage_Sales_Block_Order_Invoice_Totals
  • Mage_Sales_Block_Order_Item_Renderer_Default
  • Mage_Sales_Block_Order_Item_Renderer_Grouped
  • Mage_Sales_Block_Order_Items
  • Mage_Sales_Block_Order_Print
  • Mage_Sales_Block_Order_Print_Creditmemo
  • Mage_Sales_Block_Order_Print_Invoice
  • Mage_Sales_Block_Order_Print_Shipment
  • Mage_Sales_Block_Order_Recent
  • Mage_Sales_Block_Order_Shipment
  • Mage_Sales_Block_Order_Shipment_Items
  • Mage_Sales_Block_Order_Totals
  • Mage_Sales_Block_Order_View
  • Mage_Sales_Block_Payment_Form_Billing_Agreement
  • Mage_Sales_Block_Payment_Info_Billing_Agreement
  • Mage_Sales_Block_Recurring_Profile_View
  • Mage_Sales_Block_Recurring_Profiles
  • Mage_Sales_Block_Reorder_Sidebar
  • Mage_Sales_Block_Widget_Guest_Form
  • Mage_Sales_Controller_Abstract
  • Mage_Sales_DownloadController
  • Mage_Sales_Exception
  • Mage_Sales_Helper_Data
  • Mage_Sales_Helper_Guest
  • Mage_Sales_Helper_Reorder
  • Mage_Sales_Model_Abstract
  • Mage_Sales_Model_Api2_Order
  • Mage_Sales_Model_Api2_Order_Address
  • Mage_Sales_Model_Api2_Order_Address_Rest
  • Mage_Sales_Model_Api2_Order_Address_Rest_Admin_V1
  • Mage_Sales_Model_Api2_Order_Address_Rest_Customer_V1
  • Mage_Sales_Model_Api2_Order_Comment
  • Mage_Sales_Model_Api2_Order_Comment_Rest
  • Mage_Sales_Model_Api2_Order_Comment_Rest_Admin_V1
  • Mage_Sales_Model_Api2_Order_Comment_Rest_Customer_V1
  • Mage_Sales_Model_Api2_Order_Item
  • Mage_Sales_Model_Api2_Order_Item_Rest
  • Mage_Sales_Model_Api2_Order_Item_Rest_Admin_V1
  • Mage_Sales_Model_Api2_Order_Item_Rest_Customer_V1
  • Mage_Sales_Model_Api2_Order_Rest
  • Mage_Sales_Model_Api2_Order_Rest_Admin_V1
  • Mage_Sales_Model_Api2_Order_Rest_Customer_V1
  • Mage_Sales_Model_Api_Resource
  • Mage_Sales_Model_Billing_Agreement
  • Mage_Sales_Model_Config
  • Mage_Sales_Model_Config_Ordered
  • Mage_Sales_Model_Convert_Order
  • Mage_Sales_Model_Convert_Quote
  • Mage_Sales_Model_Email_Template
  • Mage_Sales_Model_Entity_Order
  • Mage_Sales_Model_Entity_Order_Address
  • Mage_Sales_Model_Entity_Order_Address_Collection
  • Mage_Sales_Model_Entity_Order_Attribute_Backend_Billing
  • Mage_Sales_Model_Entity_Order_Attribute_Backend_Child
  • Mage_Sales_Model_Entity_Order_Attribute_Backend_Parent
  • Mage_Sales_Model_Entity_Order_Attribute_Backend_Shipping
  • Mage_Sales_Model_Entity_Order_Collection
  • Mage_Sales_Model_Entity_Order_Creditmemo
  • Mage_Sales_Model_Entity_Order_Creditmemo_Attribute_Backend_Child
  • Mage_Sales_Model_Entity_Order_Creditmemo_Attribute_Backend_Parent
  • Mage_Sales_Model_Entity_Order_Creditmemo_Collection
  • Mage_Sales_Model_Entity_Order_Creditmemo_Comment
  • Mage_Sales_Model_Entity_Order_Creditmemo_Comment_Collection
  • Mage_Sales_Model_Entity_Order_Creditmemo_Item
  • Mage_Sales_Model_Entity_Order_Creditmemo_Item_Collection
  • Mage_Sales_Model_Entity_Order_Invoice
  • Mage_Sales_Model_Entity_Order_Invoice_Attribute_Backend_Child
  • Mage_Sales_Model_Entity_Order_Invoice_Attribute_Backend_Item
  • Mage_Sales_Model_Entity_Order_Invoice_Attribute_Backend_Order
  • Mage_Sales_Model_Entity_Order_Invoice_Attribute_Backend_Parent
  • Mage_Sales_Model_Entity_Order_Invoice_Collection
  • Mage_Sales_Model_Entity_Order_Invoice_Comment
  • Mage_Sales_Model_Entity_Order_Invoice_Comment_Collection
  • Mage_Sales_Model_Entity_Order_Invoice_Item
  • Mage_Sales_Model_Entity_Order_Invoice_Item_Collection
  • Mage_Sales_Model_Entity_Order_Item
  • Mage_Sales_Model_Entity_Order_Item_Collection
  • Mage_Sales_Model_Entity_Order_Payment
  • Mage_Sales_Model_Entity_Order_Payment_Collection
  • Mage_Sales_Model_Entity_Order_Shipment
  • Mage_Sales_Model_Entity_Order_Shipment_Attribute_Backend_Child
  • Mage_Sales_Model_Entity_Order_Shipment_Attribute_Backend_Parent
  • Mage_Sales_Model_Entity_Order_Shipment_Collection
  • Mage_Sales_Model_Entity_Order_Shipment_Comment
  • Mage_Sales_Model_Entity_Order_Shipment_Comment_Collection
  • Mage_Sales_Model_Entity_Order_Shipment_Item
  • Mage_Sales_Model_Entity_Order_Shipment_Item_Collection
  • Mage_Sales_Model_Entity_Order_Shipment_Track
  • Mage_Sales_Model_Entity_Order_Shipment_Track_Collection
  • Mage_Sales_Model_Entity_Order_Status_History
  • Mage_Sales_Model_Entity_Order_Status_History_Collection
  • Mage_Sales_Model_Entity_Quote
  • Mage_Sales_Model_Entity_Quote_Address
  • Mage_Sales_Model_Entity_Quote_Address_Attribute_Backend
  • Mage_Sales_Model_Entity_Quote_Address_Attribute_Backend_Child
  • Mage_Sales_Model_Entity_Quote_Address_Attribute_Backend_Parent
  • Mage_Sales_Model_Entity_Quote_Address_Attribute_Backend_Region
  • Mage_Sales_Model_Entity_Quote_Address_Attribute_Frontend
  • Mage_Sales_Model_Entity_Quote_Address_Attribute_Frontend_Custbalance
  • Mage_Sales_Model_Entity_Quote_Address_Attribute_Frontend_Discount
  • Mage_Sales_Model_Entity_Quote_Address_Attribute_Frontend_Grand
  • Mage_Sales_Model_Entity_Quote_Address_Attribute_Frontend_Shipping
  • Mage_Sales_Model_Entity_Quote_Address_Attribute_Frontend_Subtotal
  • Mage_Sales_Model_Entity_Quote_Address_Attribute_Frontend_Tax
  • Mage_Sales_Model_Entity_Quote_Address_Collection
  • Mage_Sales_Model_Entity_Quote_Address_Item
  • Mage_Sales_Model_Entity_Quote_Address_Item_Collection
  • Mage_Sales_Model_Entity_Quote_Address_Rate
  • Mage_Sales_Model_Entity_Quote_Address_Rate_Collection
  • Mage_Sales_Model_Entity_Quote_Collection
  • Mage_Sales_Model_Entity_Quote_Item
  • Mage_Sales_Model_Entity_Quote_Item_Collection
  • Mage_Sales_Model_Entity_Quote_Payment
  • Mage_Sales_Model_Entity_Quote_Payment_Collection
  • Mage_Sales_Model_Entity_Sale_Collection
  • Mage_Sales_Model_Entity_Setup
  • Mage_Sales_Model_Mysql4_Abstract
  • Mage_Sales_Model_Mysql4_Billing_Agreement
  • Mage_Sales_Model_Mysql4_Billing_Agreement_Collection
  • Mage_Sales_Model_Mysql4_Collection_Abstract
  • Mage_Sales_Model_Mysql4_Order
  • Mage_Sales_Model_Mysql4_Order_Abstract
  • Mage_Sales_Model_Mysql4_Order_Address
  • Mage_Sales_Model_Mysql4_Order_Address_Collection
  • Mage_Sales_Model_Mysql4_Order_Attribute_Backend_Billing
  • Mage_Sales_Model_Mysql4_Order_Attribute_Backend_Child
  • Mage_Sales_Model_Mysql4_Order_Attribute_Backend_Parent
  • Mage_Sales_Model_Mysql4_Order_Attribute_Backend_Shipping
  • Mage_Sales_Model_Mysql4_Order_Collection
  • Mage_Sales_Model_Mysql4_Order_Collection_Abstract
  • Mage_Sales_Model_Mysql4_Order_Comment_Collection_Abstract
  • Mage_Sales_Model_Mysql4_Order_Creditmemo
  • Mage_Sales_Model_Mysql4_Order_Creditmemo_Attribute_Backend_Child
  • Mage_Sales_Model_Mysql4_Order_Creditmemo_Attribute_Backend_Parent
  • Mage_Sales_Model_Mysql4_Order_Creditmemo_Collection
  • Mage_Sales_Model_Mysql4_Order_Creditmemo_Comment
  • Mage_Sales_Model_Mysql4_Order_Creditmemo_Comment_Collection
  • Mage_Sales_Model_Mysql4_Order_Creditmemo_Grid_Collection
  • Mage_Sales_Model_Mysql4_Order_Creditmemo_Item
  • Mage_Sales_Model_Mysql4_Order_Creditmemo_Item_Collection
  • Mage_Sales_Model_Mysql4_Order_Grid_Collection
  • Mage_Sales_Model_Mysql4_Order_Invoice
  • Mage_Sales_Model_Mysql4_Order_Invoice_Attribute_Backend_Child
  • Mage_Sales_Model_Mysql4_Order_Invoice_Attribute_Backend_Item
  • Mage_Sales_Model_Mysql4_Order_Invoice_Attribute_Backend_Order
  • Mage_Sales_Model_Mysql4_Order_Invoice_Attribute_Backend_Parent
  • Mage_Sales_Model_Mysql4_Order_Invoice_Collection
  • Mage_Sales_Model_Mysql4_Order_Invoice_Comment
  • Mage_Sales_Model_Mysql4_Order_Invoice_Comment_Collection
  • Mage_Sales_Model_Mysql4_Order_Invoice_Grid_Collection
  • Mage_Sales_Model_Mysql4_Order_Invoice_Item
  • Mage_Sales_Model_Mysql4_Order_Invoice_Item_Collection
  • Mage_Sales_Model_Mysql4_Order_Item
  • Mage_Sales_Model_Mysql4_Order_Item_Collection
  • Mage_Sales_Model_Mysql4_Order_Payment
  • Mage_Sales_Model_Mysql4_Order_Payment_Collection
  • Mage_Sales_Model_Mysql4_Order_Payment_Transaction
  • Mage_Sales_Model_Mysql4_Order_Payment_Transaction_Collection
  • Mage_Sales_Model_Mysql4_Order_Shipment
  • Mage_Sales_Model_Mysql4_Order_Shipment_Attribute_Backend_Child
  • Mage_Sales_Model_Mysql4_Order_Shipment_Attribute_Backend_Parent
  • Mage_Sales_Model_Mysql4_Order_Shipment_Collection
  • Mage_Sales_Model_Mysql4_Order_Shipment_Comment
  • Mage_Sales_Model_Mysql4_Order_Shipment_Comment_Collection
  • Mage_Sales_Model_Mysql4_Order_Shipment_Grid_Collection
  • Mage_Sales_Model_Mysql4_Order_Shipment_Item
  • Mage_Sales_Model_Mysql4_Order_Shipment_Item_Collection
  • Mage_Sales_Model_Mysql4_Order_Shipment_Track
  • Mage_Sales_Model_Mysql4_Order_Shipment_Track_Collection
  • Mage_Sales_Model_Mysql4_Order_Status
  • Mage_Sales_Model_Mysql4_Order_Status_Collection
  • Mage_Sales_Model_Mysql4_Order_Status_History
  • Mage_Sales_Model_Mysql4_Order_Status_History_Collection
  • Mage_Sales_Model_Mysql4_Order_Tax
  • Mage_Sales_Model_Mysql4_Order_Tax_Collection
  • Mage_Sales_Model_Mysql4_Quote
  • Mage_Sales_Model_Mysql4_Quote_Address
  • Mage_Sales_Model_Mysql4_Quote_Address_Attribute_Backend
  • Mage_Sales_Model_Mysql4_Quote_Address_Attribute_Backend_Child
  • Mage_Sales_Model_Mysql4_Quote_Address_Attribute_Backend_Parent
  • Mage_Sales_Model_Mysql4_Quote_Address_Attribute_Backend_Region
  • Mage_Sales_Model_Mysql4_Quote_Address_Attribute_Frontend
  • Mage_Sales_Model_Mysql4_Quote_Address_Attribute_Frontend_Custbalance
  • Mage_Sales_Model_Mysql4_Quote_Address_Attribute_Frontend_Discount
  • Mage_Sales_Model_Mysql4_Quote_Address_Attribute_Frontend_Grand
  • Mage_Sales_Model_Mysql4_Quote_Address_Attribute_Frontend_Shipping
  • Mage_Sales_Model_Mysql4_Quote_Address_Attribute_Frontend_Subtotal
  • Mage_Sales_Model_Mysql4_Quote_Address_Attribute_Frontend_Tax
  • Mage_Sales_Model_Mysql4_Quote_Address_Collection
  • Mage_Sales_Model_Mysql4_Quote_Address_Item
  • Mage_Sales_Model_Mysql4_Quote_Address_Item_Collection
  • Mage_Sales_Model_Mysql4_Quote_Address_Rate
  • Mage_Sales_Model_Mysql4_Quote_Address_Rate_Collection
  • Mage_Sales_Model_Mysql4_Quote_Collection
  • Mage_Sales_Model_Mysql4_Quote_Item
  • Mage_Sales_Model_Mysql4_Quote_Item_Collection
  • Mage_Sales_Model_Mysql4_Quote_Item_Option
  • Mage_Sales_Model_Mysql4_Quote_Item_Option_Collection
  • Mage_Sales_Model_Mysql4_Quote_Payment
  • Mage_Sales_Model_Mysql4_Quote_Payment_Collection
  • Mage_Sales_Model_Mysql4_Recurring_Profile
  • Mage_Sales_Model_Mysql4_Recurring_Profile_Collection
  • Mage_Sales_Model_Mysql4_Report
  • Mage_Sales_Model_Mysql4_Report_Abstract
  • Mage_Sales_Model_Mysql4_Report_Bestsellers
  • Mage_Sales_Model_Mysql4_Report_Bestsellers_Collection
  • Mage_Sales_Model_Mysql4_Report_Collection_Abstract
  • Mage_Sales_Model_Mysql4_Report_Invoiced
  • Mage_Sales_Model_Mysql4_Report_Invoiced_Collection_Invoiced
  • Mage_Sales_Model_Mysql4_Report_Invoiced_Collection_Order
  • Mage_Sales_Model_Mysql4_Report_Order
  • Mage_Sales_Model_Mysql4_Report_Order_Collection
  • Mage_Sales_Model_Mysql4_Report_Order_Updatedat_Collection
  • Mage_Sales_Model_Mysql4_Report_Refunded
  • Mage_Sales_Model_Mysql4_Report_Refunded_Collection_Order
  • Mage_Sales_Model_Mysql4_Report_Refunded_Collection_Refunded
  • Mage_Sales_Model_Mysql4_Report_Shipping
  • Mage_Sales_Model_Mysql4_Report_Shipping_Collection_Order
  • Mage_Sales_Model_Mysql4_Report_Shipping_Collection_Shipment
  • Mage_Sales_Model_Mysql4_Sale_Collection
  • Mage_Sales_Model_Mysql4_Setup
  • Mage_Sales_Model_Observer
  • Mage_Sales_Model_Order
  • Mage_Sales_Model_Order_Address
  • Mage_Sales_Model_Order_Api
  • Mage_Sales_Model_Order_Api_V2
  • Mage_Sales_Model_Order_Config
  • Mage_Sales_Model_Order_Creditmemo
  • Mage_Sales_Model_Order_Creditmemo_Api
  • Mage_Sales_Model_Order_Creditmemo_Api_V2
  • Mage_Sales_Model_Order_Creditmemo_Comment
  • Mage_Sales_Model_Order_Creditmemo_Config
  • Mage_Sales_Model_Order_Creditmemo_Item
  • Mage_Sales_Model_Order_Creditmemo_Total_Abstract
  • Mage_Sales_Model_Order_Creditmemo_Total_Cost
  • Mage_Sales_Model_Order_Creditmemo_Total_Discount
  • Mage_Sales_Model_Order_Creditmemo_Total_Grand
  • Mage_Sales_Model_Order_Creditmemo_Total_Shipping
  • Mage_Sales_Model_Order_Creditmemo_Total_Subtotal
  • Mage_Sales_Model_Order_Creditmemo_Total_Tax
  • Mage_Sales_Model_Order_Invoice
  • Mage_Sales_Model_Order_Invoice_Api
  • Mage_Sales_Model_Order_Invoice_Api_V2
  • Mage_Sales_Model_Order_Invoice_Comment
  • Mage_Sales_Model_Order_Invoice_Config
  • Mage_Sales_Model_Order_Invoice_Item
  • Mage_Sales_Model_Order_Invoice_Total_Abstract
  • Mage_Sales_Model_Order_Invoice_Total_Cost
  • Mage_Sales_Model_Order_Invoice_Total_Discount
  • Mage_Sales_Model_Order_Invoice_Total_Grand
  • Mage_Sales_Model_Order_Invoice_Total_Shipping
  • Mage_Sales_Model_Order_Invoice_Total_Subtotal
  • Mage_Sales_Model_Order_Invoice_Total_Tax
  • Mage_Sales_Model_Order_Item
  • Mage_Sales_Model_Order_Payment
  • Mage_Sales_Model_Order_Payment_Transaction
  • Mage_Sales_Model_Order_Pdf_Abstract
  • Mage_Sales_Model_Order_Pdf_Creditmemo
  • Mage_Sales_Model_Order_Pdf_Invoice
  • Mage_Sales_Model_Order_Pdf_Items_Abstract
  • Mage_Sales_Model_Order_Pdf_Items_Creditmemo_Default
  • Mage_Sales_Model_Order_Pdf_Items_Creditmemo_Grouped
  • Mage_Sales_Model_Order_Pdf_Items_Invoice_Default
  • Mage_Sales_Model_Order_Pdf_Items_Invoice_Grouped
  • Mage_Sales_Model_Order_Pdf_Items_Shipment_Default
  • Mage_Sales_Model_Order_Pdf_Shipment
  • Mage_Sales_Model_Order_Pdf_Shipment_Packaging
  • Mage_Sales_Model_Order_Pdf_Total_Default
  • Mage_Sales_Model_Order_Shipment
  • Mage_Sales_Model_Order_Shipment_Api
  • Mage_Sales_Model_Order_Shipment_Api_V2
  • Mage_Sales_Model_Order_Shipment_Comment
  • Mage_Sales_Model_Order_Shipment_Item
  • Mage_Sales_Model_Order_Shipment_Track
  • Mage_Sales_Model_Order_Status
  • Mage_Sales_Model_Order_Status_History
  • Mage_Sales_Model_Order_Tax
  • Mage_Sales_Model_Order_Total
  • Mage_Sales_Model_Order_Total_Abstract
  • Mage_Sales_Model_Order_Total_Config_Base
  • Mage_Sales_Model_Payment_Method_Billing_AgreementAbstract
  • Mage_Sales_Model_Quote
  • Mage_Sales_Model_Quote_Address
  • Mage_Sales_Model_Quote_Address_Item
  • Mage_Sales_Model_Quote_Address_Rate
  • Mage_Sales_Model_Quote_Address_Total
  • Mage_Sales_Model_Quote_Address_Total_Abstract
  • Mage_Sales_Model_Quote_Address_Total_Custbalance
  • Mage_Sales_Model_Quote_Address_Total_Discount
  • Mage_Sales_Model_Quote_Address_Total_Grand
  • Mage_Sales_Model_Quote_Address_Total_Msrp
  • Mage_Sales_Model_Quote_Address_Total_Nominal
  • Mage_Sales_Model_Quote_Address_Total_Nominal_Collector
  • Mage_Sales_Model_Quote_Address_Total_Nominal_Recurring_Initial
  • Mage_Sales_Model_Quote_Address_Total_Nominal_Recurring_Trial
  • Mage_Sales_Model_Quote_Address_Total_Nominal_RecurringAbstract
  • Mage_Sales_Model_Quote_Address_Total_Nominal_Shipping
  • Mage_Sales_Model_Quote_Address_Total_Nominal_Subtotal
  • Mage_Sales_Model_Quote_Address_Total_Shipping
  • Mage_Sales_Model_Quote_Address_Total_Subtotal
  • Mage_Sales_Model_Quote_Address_Total_Tax
  • Mage_Sales_Model_Quote_Config
  • Mage_Sales_Model_Quote_Item
  • Mage_Sales_Model_Quote_Item_Abstract
  • Mage_Sales_Model_Quote_Item_Option
  • Mage_Sales_Model_Quote_Payment
  • Mage_Sales_Model_Recurring_Profile
  • Mage_Sales_Model_Resource_Abstract
  • Mage_Sales_Model_Resource_Billing_Agreement
  • Mage_Sales_Model_Resource_Billing_Agreement_Collection
  • Mage_Sales_Model_Resource_Collection_Abstract
  • Mage_Sales_Model_Resource_Helper_Mysql4
  • Mage_Sales_Model_Resource_Order
  • Mage_Sales_Model_Resource_Order_Abstract
  • Mage_Sales_Model_Resource_Order_Address
  • Mage_Sales_Model_Resource_Order_Address_Collection
  • Mage_Sales_Model_Resource_Order_Attribute_Backend_Billing
  • Mage_Sales_Model_Resource_Order_Attribute_Backend_Child
  • Mage_Sales_Model_Resource_Order_Attribute_Backend_Parent
  • Mage_Sales_Model_Resource_Order_Attribute_Backend_Shipping
  • Mage_Sales_Model_Resource_Order_Collection
  • Mage_Sales_Model_Resource_Order_Collection_Abstract
  • Mage_Sales_Model_Resource_Order_Comment_Collection_Abstract
  • Mage_Sales_Model_Resource_Order_Creditmemo
  • Mage_Sales_Model_Resource_Order_Creditmemo_Attribute_Backend_Child
  • Mage_Sales_Model_Resource_Order_Creditmemo_Attribute_Backend_Parent
  • Mage_Sales_Model_Resource_Order_Creditmemo_Collection
  • Mage_Sales_Model_Resource_Order_Creditmemo_Comment
  • Mage_Sales_Model_Resource_Order_Creditmemo_Comment_Collection
  • Mage_Sales_Model_Resource_Order_Creditmemo_Grid_Collection
  • Mage_Sales_Model_Resource_Order_Creditmemo_Item
  • Mage_Sales_Model_Resource_Order_Creditmemo_Item_Collection
  • Mage_Sales_Model_Resource_Order_Grid_Collection
  • Mage_Sales_Model_Resource_Order_Invoice
  • Mage_Sales_Model_Resource_Order_Invoice_Attribute_Backend_Child
  • Mage_Sales_Model_Resource_Order_Invoice_Attribute_Backend_Item
  • Mage_Sales_Model_Resource_Order_Invoice_Attribute_Backend_Order
  • Mage_Sales_Model_Resource_Order_Invoice_Attribute_Backend_Parent
  • Mage_Sales_Model_Resource_Order_Invoice_Collection
  • Mage_Sales_Model_Resource_Order_Invoice_Comment
  • Mage_Sales_Model_Resource_Order_Invoice_Comment_Collection
  • Mage_Sales_Model_Resource_Order_Invoice_Grid_Collection
  • Mage_Sales_Model_Resource_Order_Invoice_Item
  • Mage_Sales_Model_Resource_Order_Invoice_Item_Collection
  • Mage_Sales_Model_Resource_Order_Item
  • Mage_Sales_Model_Resource_Order_Item_Collection
  • Mage_Sales_Model_Resource_Order_Payment
  • Mage_Sales_Model_Resource_Order_Payment_Collection
  • Mage_Sales_Model_Resource_Order_Payment_Transaction
  • Mage_Sales_Model_Resource_Order_Payment_Transaction_Collection
  • Mage_Sales_Model_Resource_Order_Shipment
  • Mage_Sales_Model_Resource_Order_Shipment_Attribute_Backend_Child
  • Mage_Sales_Model_Resource_Order_Shipment_Attribute_Backend_Parent
  • Mage_Sales_Model_Resource_Order_Shipment_Collection
  • Mage_Sales_Model_Resource_Order_Shipment_Comment
  • Mage_Sales_Model_Resource_Order_Shipment_Comment_Collection
  • Mage_Sales_Model_Resource_Order_Shipment_Grid_Collection
  • Mage_Sales_Model_Resource_Order_Shipment_Item
  • Mage_Sales_Model_Resource_Order_Shipment_Item_Collection
  • Mage_Sales_Model_Resource_Order_Shipment_Track
  • Mage_Sales_Model_Resource_Order_Shipment_Track_Collection
  • Mage_Sales_Model_Resource_Order_Status
  • Mage_Sales_Model_Resource_Order_Status_Collection
  • Mage_Sales_Model_Resource_Order_Status_History
  • Mage_Sales_Model_Resource_Order_Status_History_Collection
  • Mage_Sales_Model_Resource_Order_Tax
  • Mage_Sales_Model_Resource_Order_Tax_Collection
  • Mage_Sales_Model_Resource_Quote
  • Mage_Sales_Model_Resource_Quote_Address
  • Mage_Sales_Model_Resource_Quote_Address_Attribute_Backend
  • Mage_Sales_Model_Resource_Quote_Address_Attribute_Backend_Child
  • Mage_Sales_Model_Resource_Quote_Address_Attribute_Backend_Parent
  • Mage_Sales_Model_Resource_Quote_Address_Attribute_Backend_Region
  • Mage_Sales_Model_Resource_Quote_Address_Attribute_Frontend
  • Mage_Sales_Model_Resource_Quote_Address_Attribute_Frontend_Custbalance
  • Mage_Sales_Model_Resource_Quote_Address_Attribute_Frontend_Discount
  • Mage_Sales_Model_Resource_Quote_Address_Attribute_Frontend_Grand
  • Mage_Sales_Model_Resource_Quote_Address_Attribute_Frontend_Shipping
  • Mage_Sales_Model_Resource_Quote_Address_Attribute_Frontend_Subtotal
  • Mage_Sales_Model_Resource_Quote_Address_Attribute_Frontend_Tax
  • Mage_Sales_Model_Resource_Quote_Address_Collection
  • Mage_Sales_Model_Resource_Quote_Address_Item
  • Mage_Sales_Model_Resource_Quote_Address_Item_Collection
  • Mage_Sales_Model_Resource_Quote_Address_Rate
  • Mage_Sales_Model_Resource_Quote_Address_Rate_Collection
  • Mage_Sales_Model_Resource_Quote_Collection
  • Mage_Sales_Model_Resource_Quote_Item
  • Mage_Sales_Model_Resource_Quote_Item_Collection
  • Mage_Sales_Model_Resource_Quote_Item_Option
  • Mage_Sales_Model_Resource_Quote_Item_Option_Collection
  • Mage_Sales_Model_Resource_Quote_Payment
  • Mage_Sales_Model_Resource_Quote_Payment_Collection
  • Mage_Sales_Model_Resource_Recurring_Profile
  • Mage_Sales_Model_Resource_Recurring_Profile_Collection
  • Mage_Sales_Model_Resource_Report
  • Mage_Sales_Model_Resource_Report_Abstract
  • Mage_Sales_Model_Resource_Report_Bestsellers
  • Mage_Sales_Model_Resource_Report_Bestsellers_Collection
  • Mage_Sales_Model_Resource_Report_Collection_Abstract
  • Mage_Sales_Model_Resource_Report_Invoiced
  • Mage_Sales_Model_Resource_Report_Invoiced_Collection_Invoiced
  • Mage_Sales_Model_Resource_Report_Invoiced_Collection_Order
  • Mage_Sales_Model_Resource_Report_Order
  • Mage_Sales_Model_Resource_Report_Order_Collection
  • Mage_Sales_Model_Resource_Report_Order_Createdat
  • Mage_Sales_Model_Resource_Report_Order_Updatedat
  • Mage_Sales_Model_Resource_Report_Order_Updatedat_Collection
  • Mage_Sales_Model_Resource_Report_Refunded
  • Mage_Sales_Model_Resource_Report_Refunded_Collection_Order
  • Mage_Sales_Model_Resource_Report_Refunded_Collection_Refunded
  • Mage_Sales_Model_Resource_Report_Shipping
  • Mage_Sales_Model_Resource_Report_Shipping_Collection_Order
  • Mage_Sales_Model_Resource_Report_Shipping_Collection_Shipment
  • Mage_Sales_Model_Resource_Sale_Collection
  • Mage_Sales_Model_Resource_Setup
  • Mage_Sales_Model_Service_Order
  • Mage_Sales_Model_Service_Quote
  • Mage_Sales_Model_Status_List
  • Mage_Sales_OrderController
  • Mage_Sales_Recurring_ProfileController
  • Mage_Shipping_TrackingController
  • Test

Interfaces

  • Mage_Sales_Model_Resource_Helper_Interface
  • Overview
  • Package
  • Class
  • Tree
   1: <?php
   2: /**
   3:  * Magento
   4:  *
   5:  * NOTICE OF LICENSE
   6:  *
   7:  * This source file is subject to the Open Software License (OSL 3.0)
   8:  * that is bundled with this package in the file LICENSE.txt.
   9:  * It is also available through the world-wide-web at this URL:
  10:  * http://opensource.org/licenses/osl-3.0.php
  11:  * If you did not receive a copy of the license and are unable to
  12:  * obtain it through the world-wide-web, please send an email
  13:  * to license@magentocommerce.com so we can send you a copy immediately.
  14:  *
  15:  * DISCLAIMER
  16:  *
  17:  * Do not edit or add to this file if you wish to upgrade Magento to newer
  18:  * versions in the future. If you wish to customize Magento for your
  19:  * needs please refer to http://www.magentocommerce.com for more information.
  20:  *
  21:  * @category    Mage
  22:  * @package     Mage_Sales
  23:  * @copyright   Copyright (c) 2012 Magento Inc. (http://www.magentocommerce.com)
  24:  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  25:  */
  26: 
  27: /**
  28:  * Quote model
  29:  *
  30:  * Supported events:
  31:  *  sales_quote_load_after
  32:  *  sales_quote_save_before
  33:  *  sales_quote_save_after
  34:  *  sales_quote_delete_before
  35:  *  sales_quote_delete_after
  36:  *
  37:  * @method Mage_Sales_Model_Resource_Quote _getResource()
  38:  * @method Mage_Sales_Model_Resource_Quote getResource()
  39:  * @method Mage_Sales_Model_Quote setStoreId(int $value)
  40:  * @method string getCreatedAt()
  41:  * @method Mage_Sales_Model_Quote setCreatedAt(string $value)
  42:  * @method string getUpdatedAt()
  43:  * @method Mage_Sales_Model_Quote setUpdatedAt(string $value)
  44:  * @method string getConvertedAt()
  45:  * @method Mage_Sales_Model_Quote setConvertedAt(string $value)
  46:  * @method int getIsActive()
  47:  * @method Mage_Sales_Model_Quote setIsActive(int $value)
  48:  * @method Mage_Sales_Model_Quote setIsVirtual(int $value)
  49:  * @method int getIsMultiShipping()
  50:  * @method Mage_Sales_Model_Quote setIsMultiShipping(int $value)
  51:  * @method int getItemsCount()
  52:  * @method Mage_Sales_Model_Quote setItemsCount(int $value)
  53:  * @method float getItemsQty()
  54:  * @method Mage_Sales_Model_Quote setItemsQty(float $value)
  55:  * @method int getOrigOrderId()
  56:  * @method Mage_Sales_Model_Quote setOrigOrderId(int $value)
  57:  * @method float getStoreToBaseRate()
  58:  * @method Mage_Sales_Model_Quote setStoreToBaseRate(float $value)
  59:  * @method float getStoreToQuoteRate()
  60:  * @method Mage_Sales_Model_Quote setStoreToQuoteRate(float $value)
  61:  * @method string getBaseCurrencyCode()
  62:  * @method Mage_Sales_Model_Quote setBaseCurrencyCode(string $value)
  63:  * @method string getStoreCurrencyCode()
  64:  * @method Mage_Sales_Model_Quote setStoreCurrencyCode(string $value)
  65:  * @method string getQuoteCurrencyCode()
  66:  * @method Mage_Sales_Model_Quote setQuoteCurrencyCode(string $value)
  67:  * @method float getGrandTotal()
  68:  * @method Mage_Sales_Model_Quote setGrandTotal(float $value)
  69:  * @method float getBaseGrandTotal()
  70:  * @method Mage_Sales_Model_Quote setBaseGrandTotal(float $value)
  71:  * @method Mage_Sales_Model_Quote setCheckoutMethod(string $value)
  72:  * @method int getCustomerId()
  73:  * @method Mage_Sales_Model_Quote setCustomerId(int $value)
  74:  * @method Mage_Sales_Model_Quote setCustomerTaxClassId(int $value)
  75:  * @method Mage_Sales_Model_Quote setCustomerGroupId(int $value)
  76:  * @method string getCustomerEmail()
  77:  * @method Mage_Sales_Model_Quote setCustomerEmail(string $value)
  78:  * @method string getCustomerPrefix()
  79:  * @method Mage_Sales_Model_Quote setCustomerPrefix(string $value)
  80:  * @method string getCustomerFirstname()
  81:  * @method Mage_Sales_Model_Quote setCustomerFirstname(string $value)
  82:  * @method string getCustomerMiddlename()
  83:  * @method Mage_Sales_Model_Quote setCustomerMiddlename(string $value)
  84:  * @method string getCustomerLastname()
  85:  * @method Mage_Sales_Model_Quote setCustomerLastname(string $value)
  86:  * @method string getCustomerSuffix()
  87:  * @method Mage_Sales_Model_Quote setCustomerSuffix(string $value)
  88:  * @method string getCustomerDob()
  89:  * @method Mage_Sales_Model_Quote setCustomerDob(string $value)
  90:  * @method string getCustomerNote()
  91:  * @method Mage_Sales_Model_Quote setCustomerNote(string $value)
  92:  * @method int getCustomerNoteNotify()
  93:  * @method Mage_Sales_Model_Quote setCustomerNoteNotify(int $value)
  94:  * @method int getCustomerIsGuest()
  95:  * @method Mage_Sales_Model_Quote setCustomerIsGuest(int $value)
  96:  * @method string getRemoteIp()
  97:  * @method Mage_Sales_Model_Quote setRemoteIp(string $value)
  98:  * @method string getAppliedRuleIds()
  99:  * @method Mage_Sales_Model_Quote setAppliedRuleIds(string $value)
 100:  * @method string getReservedOrderId()
 101:  * @method Mage_Sales_Model_Quote setReservedOrderId(string $value)
 102:  * @method string getPasswordHash()
 103:  * @method Mage_Sales_Model_Quote setPasswordHash(string $value)
 104:  * @method string getCouponCode()
 105:  * @method Mage_Sales_Model_Quote setCouponCode(string $value)
 106:  * @method string getGlobalCurrencyCode()
 107:  * @method Mage_Sales_Model_Quote setGlobalCurrencyCode(string $value)
 108:  * @method float getBaseToGlobalRate()
 109:  * @method Mage_Sales_Model_Quote setBaseToGlobalRate(float $value)
 110:  * @method float getBaseToQuoteRate()
 111:  * @method Mage_Sales_Model_Quote setBaseToQuoteRate(float $value)
 112:  * @method string getCustomerTaxvat()
 113:  * @method Mage_Sales_Model_Quote setCustomerTaxvat(string $value)
 114:  * @method string getCustomerGender()
 115:  * @method Mage_Sales_Model_Quote setCustomerGender(string $value)
 116:  * @method float getSubtotal()
 117:  * @method Mage_Sales_Model_Quote setSubtotal(float $value)
 118:  * @method float getBaseSubtotal()
 119:  * @method Mage_Sales_Model_Quote setBaseSubtotal(float $value)
 120:  * @method float getSubtotalWithDiscount()
 121:  * @method Mage_Sales_Model_Quote setSubtotalWithDiscount(float $value)
 122:  * @method float getBaseSubtotalWithDiscount()
 123:  * @method Mage_Sales_Model_Quote setBaseSubtotalWithDiscount(float $value)
 124:  * @method int getIsChanged()
 125:  * @method Mage_Sales_Model_Quote setIsChanged(int $value)
 126:  * @method int getTriggerRecollect()
 127:  * @method Mage_Sales_Model_Quote setTriggerRecollect(int $value)
 128:  * @method string getExtShippingInfo()
 129:  * @method Mage_Sales_Model_Quote setExtShippingInfo(string $value)
 130:  * @method int getGiftMessageId()
 131:  * @method Mage_Sales_Model_Quote setGiftMessageId(int $value)
 132:  * @method bool|null getIsPersistent()
 133:  * @method Mage_Sales_Model_Quote setIsPersistent(bool $value)
 134:  *
 135:  * @category    Mage
 136:  * @package     Mage_Sales
 137:  * @author      Magento Core Team <core@magentocommerce.com>
 138:  */
 139: class Mage_Sales_Model_Quote extends Mage_Core_Model_Abstract
 140: {
 141:     protected $_eventPrefix = 'sales_quote';
 142:     protected $_eventObject = 'quote';
 143: 
 144:     /**
 145:      * Quote customer model object
 146:      *
 147:      * @var Mage_Customer_Model_Customer
 148:      */
 149:     protected $_customer;
 150: 
 151:     /**
 152:      * Quote addresses collection
 153:      *
 154:      * @var Mage_Eav_Model_Entity_Collection_Abstract
 155:      */
 156:     protected $_addresses = null;
 157: 
 158:     /**
 159:      * Quote items collection
 160:      *
 161:      * @var Mage_Eav_Model_Entity_Collection_Abstract
 162:      */
 163:     protected $_items = null;
 164: 
 165:     /**
 166:      * Quote payments
 167:      *
 168:      * @var Mage_Eav_Model_Entity_Collection_Abstract
 169:      */
 170:     protected $_payments = null;
 171: 
 172:     /**
 173:      * Different groups of error infos
 174:      *
 175:      * @var array
 176:      */
 177:     protected $_errorInfoGroups = array();
 178: 
 179:     /**
 180:      * Whether quote should not be saved
 181:      *
 182:      * @var bool
 183:      */
 184:     protected $_preventSaving = false;
 185: 
 186:     /**
 187:      * Init resource model
 188:      */
 189:     protected function _construct()
 190:     {
 191:         $this->_init('sales/quote');
 192:     }
 193: 
 194:     /**
 195:      * Init mapping array of short fields to
 196:      * its full names
 197:      *
 198:      * @return Varien_Object
 199:      */
 200:     protected function _initOldFieldsMap()
 201:     {
 202:         $this->_oldFieldsMap = Mage::helper('sales')->getOldFieldMap('quote');
 203:         return $this;
 204:     }
 205: 
 206:     /**
 207:      * Get quote store identifier
 208:      *
 209:      * @return int
 210:      */
 211:     public function getStoreId()
 212:     {
 213:         if (!$this->hasStoreId()) {
 214:             return Mage::app()->getStore()->getId();
 215:         }
 216:         return $this->_getData('store_id');
 217:     }
 218: 
 219:     /**
 220:      * Get quote store model object
 221:      *
 222:      * @return  Mage_Core_Model_Store
 223:      */
 224:     public function getStore()
 225:     {
 226:         return Mage::app()->getStore($this->getStoreId());
 227:     }
 228: 
 229:     /**
 230:      * Declare quote store model
 231:      *
 232:      * @param   Mage_Core_Model_Store $store
 233:      * @return  Mage_Sales_Model_Quote
 234:      */
 235:     public function setStore(Mage_Core_Model_Store $store)
 236:     {
 237:         $this->setStoreId($store->getId());
 238:         return $this;
 239:     }
 240: 
 241:     /**
 242:      * Get all available store ids for quote
 243:      *
 244:      * @return array
 245:      */
 246:     public function getSharedStoreIds()
 247:     {
 248:         $ids = $this->_getData('shared_store_ids');
 249:         if (is_null($ids) || !is_array($ids)) {
 250:             if ($website = $this->getWebsite()) {
 251:                 return $website->getStoreIds();
 252:             }
 253:             return $this->getStore()->getWebsite()->getStoreIds();
 254:         }
 255:         return $ids;
 256:     }
 257: 
 258:     /**
 259:      * Prepare data before save
 260:      *
 261:      * @return Mage_Sales_Model_Quote
 262:      */
 263:     protected function _beforeSave()
 264:     {
 265:         /**
 266:          * Currency logic
 267:          *
 268:          * global - currency which is set for default in backend
 269:          * base - currency which is set for current website. all attributes that
 270:          *      have 'base_' prefix saved in this currency
 271:          * store - all the time it was currency of website and all attributes
 272:          *      with 'base_' were saved in this currency. From now on it is
 273:          *      deprecated and will be duplication of base currency code.
 274:          * quote/order - currency which was selected by customer or configured by
 275:          *      admin for current store. currency in which customer sees
 276:          *      price thought all checkout.
 277:          *
 278:          * Rates:
 279:          *      store_to_base & store_to_quote/store_to_order - are deprecated
 280:          *      base_to_global & base_to_quote/base_to_order - must be used instead
 281:          */
 282: 
 283:         $globalCurrencyCode  = Mage::app()->getBaseCurrencyCode();
 284:         $baseCurrency = $this->getStore()->getBaseCurrency();
 285: 
 286:         if ($this->hasForcedCurrency()){
 287:             $quoteCurrency = $this->getForcedCurrency();
 288:         } else {
 289:             $quoteCurrency = $this->getStore()->getCurrentCurrency();
 290:         }
 291: 
 292:         $this->setGlobalCurrencyCode($globalCurrencyCode);
 293:         $this->setBaseCurrencyCode($baseCurrency->getCode());
 294:         $this->setStoreCurrencyCode($baseCurrency->getCode());
 295:         $this->setQuoteCurrencyCode($quoteCurrency->getCode());
 296: 
 297:         //deprecated, read above
 298:         $this->setStoreToBaseRate($baseCurrency->getRate($globalCurrencyCode));
 299:         $this->setStoreToQuoteRate($baseCurrency->getRate($quoteCurrency));
 300: 
 301:         $this->setBaseToGlobalRate($baseCurrency->getRate($globalCurrencyCode));
 302:         $this->setBaseToQuoteRate($baseCurrency->getRate($quoteCurrency));
 303: 
 304:         if (!$this->hasChangedFlag() || $this->getChangedFlag() == true) {
 305:             $this->setIsChanged(1);
 306:         } else {
 307:             $this->setIsChanged(0);
 308:         }
 309: 
 310:         if ($this->_customer) {
 311:             $this->setCustomerId($this->_customer->getId());
 312:         }
 313: 
 314:         parent::_beforeSave();
 315:     }
 316: 
 317:     /**
 318:      * Save related items
 319:      *
 320:      * @return Mage_Sales_Model_Quote
 321:      */
 322:     protected function _afterSave()
 323:     {
 324:         parent::_afterSave();
 325: 
 326:         if (null !== $this->_addresses) {
 327:             $this->getAddressesCollection()->save();
 328:         }
 329: 
 330:         if (null !== $this->_items) {
 331:             $this->getItemsCollection()->save();
 332:         }
 333: 
 334:         if (null !== $this->_payments) {
 335:             $this->getPaymentsCollection()->save();
 336:         }
 337:         return $this;
 338:     }
 339: 
 340:     /**
 341:      * Loading quote data by customer
 342:      *
 343:      * @return Mage_Sales_Model_Quote
 344:      */
 345:     public function loadByCustomer($customer)
 346:     {
 347:         if ($customer instanceof Mage_Customer_Model_Customer) {
 348:             $customerId = $customer->getId();
 349:         }
 350:         else {
 351:             $customerId = (int) $customer;
 352:         }
 353:         $this->_getResource()->loadByCustomerId($this, $customerId);
 354:         $this->_afterLoad();
 355:         return $this;
 356:     }
 357: 
 358:     /**
 359:      * Loading only active quote
 360:      *
 361:      * @param int $quoteId
 362:      * @return Mage_Sales_Model_Quote
 363:      */
 364:     public function loadActive($quoteId)
 365:     {
 366:         $this->_getResource()->loadActive($this, $quoteId);
 367:         $this->_afterLoad();
 368:         return $this;
 369:     }
 370: 
 371:     /**
 372:      * Loading quote by identifier
 373:      *
 374:      * @param int $quoteId
 375:      * @return Mage_Sales_Model_Quote
 376:      */
 377:     public function loadByIdWithoutStore($quoteId)
 378:     {
 379:         $this->_getResource()->loadByIdWithoutStore($this, $quoteId);
 380:         $this->_afterLoad();
 381:         return $this;
 382:     }
 383: 
 384:     /**
 385:      * Assign customer model object data to quote
 386:      *
 387:      * @param   Mage_Customer_Model_Customer $customer
 388:      * @return  Mage_Sales_Model_Quote
 389:      */
 390:     public function assignCustomer(Mage_Customer_Model_Customer $customer)
 391:     {
 392:         return $this->assignCustomerWithAddressChange($customer);
 393:     }
 394: 
 395:     /**
 396:      * Assign customer model to quote with billing and shipping address change
 397:      *
 398:      * @param  Mage_Customer_Model_Customer    $customer
 399:      * @param  Mage_Sales_Model_Quote_Address  $billingAddress
 400:      * @param  Mage_Sales_Model_Quote_Address  $shippingAddress
 401:      * @return Mage_Sales_Model_Quote
 402:      */
 403:     public function assignCustomerWithAddressChange(
 404:         Mage_Customer_Model_Customer    $customer,
 405:         Mage_Sales_Model_Quote_Address  $billingAddress  = null,
 406:         Mage_Sales_Model_Quote_Address  $shippingAddress = null
 407:     )
 408:     {
 409:         if ($customer->getId()) {
 410:             $this->setCustomer($customer);
 411: 
 412:             if (!is_null($billingAddress)) {
 413:                 $this->setBillingAddress($billingAddress);
 414:             } else {
 415:                 $defaultBillingAddress = $customer->getDefaultBillingAddress();
 416:                 if ($defaultBillingAddress && $defaultBillingAddress->getId()) {
 417:                     $billingAddress = Mage::getModel('sales/quote_address')
 418:                         ->importCustomerAddress($defaultBillingAddress);
 419:                     $this->setBillingAddress($billingAddress);
 420:                 }
 421:             }
 422: 
 423:             if (is_null($shippingAddress)) {
 424:                 $defaultShippingAddress = $customer->getDefaultShippingAddress();
 425:                 if ($defaultShippingAddress && $defaultShippingAddress->getId()) {
 426:                     $shippingAddress = Mage::getModel('sales/quote_address')
 427:                         ->importCustomerAddress($defaultShippingAddress);
 428:                 } else {
 429:                     $shippingAddress = Mage::getModel('sales/quote_address');
 430:                 }
 431:             }
 432:             $this->setShippingAddress($shippingAddress);
 433:         }
 434: 
 435:         return $this;
 436:     }
 437: 
 438:     /**
 439:      * Define customer object
 440:      *
 441:      * @param   Mage_Customer_Model_Customer $customer
 442:      * @return  Mage_Sales_Model_Quote
 443:      */
 444:     public function setCustomer(Mage_Customer_Model_Customer $customer)
 445:     {
 446:         $this->_customer = $customer;
 447:         $this->setCustomerId($customer->getId());
 448:         Mage::helper('core')->copyFieldset('customer_account', 'to_quote', $customer, $this);
 449:         return $this;
 450:     }
 451: 
 452:     /**
 453:      * Retrieve customer model object
 454:      *
 455:      * @return Mage_Customer_Model_Customer
 456:      */
 457:     public function getCustomer()
 458:     {
 459:         if (is_null($this->_customer)) {
 460:             $this->_customer = Mage::getModel('customer/customer');
 461:             if ($customerId = $this->getCustomerId()) {
 462:                 $this->_customer->load($customerId);
 463:                 if (!$this->_customer->getId()) {
 464:                     $this->_customer->setCustomerId(null);
 465:                 }
 466:             }
 467:         }
 468:         return $this->_customer;
 469:     }
 470: 
 471:     /**
 472:      * Retrieve customer group id
 473:      *
 474:      * @return int
 475:      */
 476:     public function getCustomerGroupId()
 477:     {
 478:         if ($this->hasData('customer_group_id')) {
 479:             return $this->getData('customer_group_id');
 480:         } else if ($this->getCustomerId()) {
 481:             return $this->getCustomer()->getGroupId();
 482:         } else {
 483:             return Mage_Customer_Model_Group::NOT_LOGGED_IN_ID;
 484:         }
 485:     }
 486: 
 487:     public function getCustomerTaxClassId()
 488:     {
 489:         /*
 490:         * tax class can vary at any time. so instead of using the value from session,
 491:         * we need to retrieve from db every time to get the correct tax class
 492:         */
 493:         //if (!$this->getData('customer_group_id') && !$this->getData('customer_tax_class_id')) {
 494:         $classId = Mage::getModel('customer/group')->getTaxClassId($this->getCustomerGroupId());
 495:         $this->setCustomerTaxClassId($classId);
 496:         //}
 497: 
 498:         return $this->getData('customer_tax_class_id');
 499:     }
 500: 
 501:     /**
 502:      * Retrieve quote address collection
 503:      *
 504:      * @return Mage_Eav_Model_Entity_Collection_Abstract
 505:      */
 506:     public function getAddressesCollection()
 507:     {
 508:         if (is_null($this->_addresses)) {
 509:             $this->_addresses = Mage::getModel('sales/quote_address')->getCollection()
 510:                 ->setQuoteFilter($this->getId());
 511: 
 512:             if ($this->getId()) {
 513:                 foreach ($this->_addresses as $address) {
 514:                     $address->setQuote($this);
 515:                 }
 516:             }
 517:         }
 518:         return $this->_addresses;
 519:     }
 520: 
 521:     /**
 522:      * Retrieve quote address by type
 523:      *
 524:      * @param   string $type
 525:      * @return  Mage_Sales_Model_Quote_Address
 526:      */
 527:     protected function _getAddressByType($type)
 528:     {
 529:         foreach ($this->getAddressesCollection() as $address) {
 530:             if ($address->getAddressType() == $type && !$address->isDeleted()) {
 531:                 return $address;
 532:             }
 533:         }
 534: 
 535:         $address = Mage::getModel('sales/quote_address')->setAddressType($type);
 536:         $this->addAddress($address);
 537:         return $address;
 538:     }
 539: 
 540:     /**
 541:      * Retrieve quote billing address
 542:      *
 543:      * @return Mage_Sales_Model_Quote_Address
 544:      */
 545:     public function getBillingAddress()
 546:     {
 547:         return $this->_getAddressByType(Mage_Sales_Model_Quote_Address::TYPE_BILLING);
 548:     }
 549: 
 550:     /**
 551:      * retrieve quote shipping address
 552:      *
 553:      * @return Mage_Sales_Model_Quote_Address
 554:      */
 555:     public function getShippingAddress()
 556:     {
 557:         return $this->_getAddressByType(Mage_Sales_Model_Quote_Address::TYPE_SHIPPING);
 558:     }
 559: 
 560:     public function getAllShippingAddresses()
 561:     {
 562:         $addresses = array();
 563:         foreach ($this->getAddressesCollection() as $address) {
 564:             if ($address->getAddressType()==Mage_Sales_Model_Quote_Address::TYPE_SHIPPING
 565:                 && !$address->isDeleted()) {
 566:                 $addresses[] = $address;
 567:             }
 568:         }
 569:         return $addresses;
 570:     }
 571: 
 572:     public function getAllAddresses()
 573:     {
 574:         $addresses = array();
 575:         foreach ($this->getAddressesCollection() as $address) {
 576:             if (!$address->isDeleted()) {
 577:                 $addresses[] = $address;
 578:             }
 579:         }
 580:         return $addresses;
 581:     }
 582: 
 583:     /**
 584:      *
 585:      * @param int $addressId
 586:      * @return Mage_Sales_Model_Quote_Address
 587:      */
 588:     public function getAddressById($addressId)
 589:     {
 590:         foreach ($this->getAddressesCollection() as $address) {
 591:             if ($address->getId()==$addressId) {
 592:                 return $address;
 593:             }
 594:         }
 595:         return false;
 596:     }
 597: 
 598:     public function getAddressByCustomerAddressId($addressId)
 599:     {
 600:         foreach ($this->getAddressesCollection() as $address) {
 601:             if (!$address->isDeleted() && $address->getCustomerAddressId()==$addressId) {
 602:                 return $address;
 603:             }
 604:         }
 605:         return false;
 606:     }
 607: 
 608:     public function getShippingAddressByCustomerAddressId($addressId)
 609:     {
 610:         foreach ($this->getAddressesCollection() as $address) {
 611:             if (!$address->isDeleted() && $address->getAddressType()==Mage_Sales_Model_Quote_Address::TYPE_SHIPPING
 612:                 && $address->getCustomerAddressId()==$addressId) {
 613:                 return $address;
 614:             }
 615:         }
 616:         return false;
 617:     }
 618: 
 619:     public function removeAddress($addressId)
 620:     {
 621:         foreach ($this->getAddressesCollection() as $address) {
 622:             if ($address->getId()==$addressId) {
 623:                 $address->isDeleted(true);
 624:                 break;
 625:             }
 626:         }
 627:         return $this;
 628:     }
 629: 
 630:     public function removeAllAddresses()
 631:     {
 632:         foreach ($this->getAddressesCollection() as $address) {
 633:             $address->isDeleted(true);
 634:         }
 635:         return $this;
 636:     }
 637: 
 638:     public function addAddress(Mage_Sales_Model_Quote_Address $address)
 639:     {
 640:         $address->setQuote($this);
 641:         if (!$address->getId()) {
 642:             $this->getAddressesCollection()->addItem($address);
 643:         }
 644:         return $this;
 645:     }
 646: 
 647:     /**
 648:      * Enter description here...
 649:      *
 650:      * @param Mage_Sales_Model_Quote_Address $address
 651:      * @return Mage_Sales_Model_Quote
 652:      */
 653:     public function setBillingAddress(Mage_Sales_Model_Quote_Address $address)
 654:     {
 655:         $old = $this->getBillingAddress();
 656: 
 657:         if (!empty($old)) {
 658:             $old->addData($address->getData());
 659:         } else {
 660:             $this->addAddress($address->setAddressType(Mage_Sales_Model_Quote_Address::TYPE_BILLING));
 661:         }
 662:         return $this;
 663:     }
 664: 
 665:     /**
 666:      * Enter description here...
 667:      *
 668:      * @param Mage_Sales_Model_Quote_Address $address
 669:      * @return Mage_Sales_Model_Quote
 670:      */
 671:     public function setShippingAddress(Mage_Sales_Model_Quote_Address $address)
 672:     {
 673:         if ($this->getIsMultiShipping()) {
 674:             $this->addAddress($address->setAddressType(Mage_Sales_Model_Quote_Address::TYPE_SHIPPING));
 675:         }
 676:         else {
 677:             $old = $this->getShippingAddress();
 678: 
 679:             if (!empty($old)) {
 680:                 $old->addData($address->getData());
 681:             } else {
 682:                 $this->addAddress($address->setAddressType(Mage_Sales_Model_Quote_Address::TYPE_SHIPPING));
 683:             }
 684:         }
 685:         return $this;
 686:     }
 687: 
 688:     public function addShippingAddress(Mage_Sales_Model_Quote_Address $address)
 689:     {
 690:         $this->setShippingAddress($address);
 691:         return $this;
 692:     }
 693: 
 694:     /**
 695:      * Retrieve quote items collection
 696:      *
 697:      * @param   bool $loaded
 698:      * @return  Mage_Eav_Model_Entity_Collection_Abstract
 699:      */
 700:     public function getItemsCollection($useCache = true)
 701:     {
 702:         if ($this->hasItemsCollection()) {
 703:             return $this->getData('items_collection');
 704:         }
 705:         if (is_null($this->_items)) {
 706:             $this->_items = Mage::getModel('sales/quote_item')->getCollection();
 707:             $this->_items->setQuote($this);
 708:         }
 709:         return $this->_items;
 710:     }
 711: 
 712:     /**
 713:      * Retrieve quote items array
 714:      *
 715:      * @return array
 716:      */
 717:     public function getAllItems()
 718:     {
 719:         $items = array();
 720:         foreach ($this->getItemsCollection() as $item) {
 721:             if (!$item->isDeleted()) {
 722:                 $items[] =  $item;
 723:             }
 724:         }
 725:         return $items;
 726:     }
 727: 
 728:     /**
 729:      * Get array of all items what can be display directly
 730:      *
 731:      * @return array
 732:      */
 733:     public function getAllVisibleItems()
 734:     {
 735:         $items = array();
 736:         foreach ($this->getItemsCollection() as $item) {
 737:             if (!$item->isDeleted() && !$item->getParentItemId()) {
 738:                 $items[] =  $item;
 739:             }
 740:         }
 741:         return $items;
 742:     }
 743: 
 744:     /**
 745:      * Checking items availability
 746:      *
 747:      * @return bool
 748:      */
 749:     public function hasItems()
 750:     {
 751:         return sizeof($this->getAllItems())>0;
 752:     }
 753: 
 754:     /**
 755:      * Checking availability of items with decimal qty
 756:      *
 757:      * @return bool
 758:      */
 759:     public function hasItemsWithDecimalQty()
 760:     {
 761:         foreach ($this->getAllItems() as $item) {
 762:             if ($item->getProduct()->getStockItem()
 763:                 && $item->getProduct()->getStockItem()->getIsQtyDecimal()) {
 764:                 return true;
 765:             }
 766:         }
 767:         return false;
 768:     }
 769: 
 770:     /**
 771:      * Checking product exist in Quote
 772:      *
 773:      * @param int $productId
 774:      * @return bool
 775:      */
 776:     public function hasProductId($productId)
 777:     {
 778:         foreach ($this->getAllItems() as $item) {
 779:             if ($item->getProductId() == $productId) {
 780:                 return true;
 781:             }
 782:         }
 783: 
 784:         return false;
 785:     }
 786: 
 787:     /**
 788:      * Retrieve item model object by item identifier
 789:      *
 790:      * @param   int $itemId
 791:      * @return  Mage_Sales_Model_Quote_Item
 792:      */
 793:     public function getItemById($itemId)
 794:     {
 795:         return $this->getItemsCollection()->getItemById($itemId);
 796:     }
 797: 
 798:     /**
 799:      * Remove quote item by item identifier
 800:      *
 801:      * @param   int $itemId
 802:      * @return  Mage_Sales_Model_Quote
 803:      */
 804:     public function removeItem($itemId)
 805:     {
 806:         $item = $this->getItemById($itemId);
 807: 
 808:         if ($item) {
 809:             $item->setQuote($this);
 810:             /**
 811:              * If we remove item from quote - we can't use multishipping mode
 812:              */
 813:             $this->setIsMultiShipping(false);
 814:             $item->isDeleted(true);
 815:             if ($item->getHasChildren()) {
 816:                 foreach ($item->getChildren() as $child) {
 817:                     $child->isDeleted(true);
 818:                 }
 819:             }
 820: 
 821:             $parent = $item->getParentItem();
 822:             if ($parent) {
 823:                 $parent->isDeleted(true);
 824:             }
 825: 
 826:             Mage::dispatchEvent('sales_quote_remove_item', array('quote_item' => $item));
 827:         }
 828: 
 829:         return $this;
 830:     }
 831: 
 832:     /**
 833:      * Mark all quote items as deleted (empty quote)
 834:      *
 835:      * @return Mage_Sales_Model_Quote
 836:      */
 837:     public function removeAllItems()
 838:     {
 839:         foreach ($this->getItemsCollection() as $itemId => $item) {
 840:             if (is_null($item->getId())) {
 841:                 $this->getItemsCollection()->removeItemByKey($itemId);
 842:             } else {
 843:                 $item->isDeleted(true);
 844:             }
 845:         }
 846:         return $this;
 847:     }
 848: 
 849:     /**
 850:      * Adding new item to quote
 851:      *
 852:      * @param   Mage_Sales_Model_Quote_Item $item
 853:      * @return  Mage_Sales_Model_Quote
 854:      */
 855:     public function addItem(Mage_Sales_Model_Quote_Item $item)
 856:     {
 857:         /**
 858:          * Temporary workaround for purchase process: it is too dangerous to purchase more than one nominal item
 859:          * or a mixture of nominal and non-nominal items, although technically possible.
 860:          *
 861:          * The problem is that currently it is implemented as sequential submission of nominal items and order, by one click.
 862:          * It makes logically impossible to make the process of the purchase failsafe.
 863:          * Proper solution is to submit items one by one with customer confirmation each time.
 864:          */
 865:         if ($item->isNominal() && $this->hasItems() || $this->hasNominalItems()) {
 866:             Mage::throwException(
 867:                 Mage::helper('sales')->__('Nominal item can be purchased standalone only. To proceed please remove other items from the quote.')
 868:             );
 869:         }
 870: 
 871:         $item->setQuote($this);
 872:         if (!$item->getId()) {
 873:             $this->getItemsCollection()->addItem($item);
 874:             Mage::dispatchEvent('sales_quote_add_item', array('quote_item' => $item));
 875:         }
 876:         return $this;
 877:     }
 878: 
 879:     /**
 880:      * Advanced func to add product to quote - processing mode can be specified there.
 881:      * Returns error message if product type instance can't prepare product.
 882:      *
 883:      * @param mixed $product
 884:      * @param null|float|Varien_Object $request
 885:      * @param null|string $processMode
 886:      * @return Mage_Sales_Model_Quote_Item|string
 887:      */
 888:     public function addProductAdvanced(Mage_Catalog_Model_Product $product, $request = null, $processMode = null)
 889:     {
 890:         if ($request === null) {
 891:             $request = 1;
 892:         }
 893:         if (is_numeric($request)) {
 894:             $request = new Varien_Object(array('qty'=>$request));
 895:         }
 896:         if (!($request instanceof Varien_Object)) {
 897:             Mage::throwException(Mage::helper('sales')->__('Invalid request for adding product to quote.'));
 898:         }
 899: 
 900:         $cartCandidates = $product->getTypeInstance(true)
 901:             ->prepareForCartAdvanced($request, $product, $processMode);
 902: 
 903:         /**
 904:          * Error message
 905:          */
 906:         if (is_string($cartCandidates)) {
 907:             return $cartCandidates;
 908:         }
 909: 
 910:         /**
 911:          * If prepare process return one object
 912:          */
 913:         if (!is_array($cartCandidates)) {
 914:             $cartCandidates = array($cartCandidates);
 915:         }
 916: 
 917:         $parentItem = null;
 918:         $errors = array();
 919:         $items = array();
 920:         foreach ($cartCandidates as $candidate) {
 921:             // Child items can be sticked together only within their parent
 922:             $stickWithinParent = $candidate->getParentProductId() ? $parentItem : null;
 923:             $candidate->setStickWithinParent($stickWithinParent);
 924:             $item = $this->_addCatalogProduct($candidate, $candidate->getCartQty());
 925:             if($request->getResetCount() && !$stickWithinParent && $item->getId() === $request->getId()) {
 926:                 $item->setData('qty', 0);
 927:             }
 928:             $items[] = $item;
 929: 
 930:             /**
 931:              * As parent item we should always use the item of first added product
 932:              */
 933:             if (!$parentItem) {
 934:                 $parentItem = $item;
 935:             }
 936:             if ($parentItem && $candidate->getParentProductId()) {
 937:                 $item->setParentItem($parentItem);
 938:             }
 939: 
 940:             /**
 941:              * We specify qty after we know about parent (for stock)
 942:              */
 943:             $item->addQty($candidate->getCartQty());
 944: 
 945:             // collect errors instead of throwing first one
 946:             if ($item->getHasError()) {
 947:                 $message = $item->getMessage();
 948:                 if (!in_array($message, $errors)) { // filter duplicate messages
 949:                     $errors[] = $message;
 950:                 }
 951:             }
 952:         }
 953:         if (!empty($errors)) {
 954:             Mage::throwException(implode("\n", $errors));
 955:         }
 956: 
 957:         Mage::dispatchEvent('sales_quote_product_add_after', array('items' => $items));
 958: 
 959:         return $item;
 960:     }
 961: 
 962: 
 963:     /**
 964:      * Add product to quote
 965:      *
 966:      * return error message if product type instance can't prepare product
 967:      *
 968:      * @param mixed $product
 969:      * @param null|float|Varien_Object $request
 970:      * @return Mage_Sales_Model_Quote_Item|string
 971:      */
 972:     public function addProduct(Mage_Catalog_Model_Product $product, $request = null)
 973:     {
 974:         return $this->addProductAdvanced(
 975:             $product,
 976:             $request,
 977:             Mage_Catalog_Model_Product_Type_Abstract::PROCESS_MODE_FULL
 978:         );
 979:     }
 980: 
 981:     /**
 982:      * Adding catalog product object data to quote
 983:      *
 984:      * @param   Mage_Catalog_Model_Product $product
 985:      * @return  Mage_Sales_Model_Quote_Item
 986:      */
 987:     protected function _addCatalogProduct(Mage_Catalog_Model_Product $product, $qty = 1)
 988:     {
 989:         $newItem = false;
 990:         $item = $this->getItemByProduct($product);
 991:         if (!$item) {
 992:             $item = Mage::getModel('sales/quote_item');
 993:             $item->setQuote($this);
 994:             if (Mage::app()->getStore()->isAdmin()) {
 995:                 $item->setStoreId($this->getStore()->getId());
 996:             }
 997:             else {
 998:                 $item->setStoreId(Mage::app()->getStore()->getId());
 999:             }
1000:             $newItem = true;
1001:         }
1002: 
1003:         /**
1004:          * We can't modify existing child items
1005:          */
1006:         if ($item->getId() && $product->getParentProductId()) {
1007:             return $item;
1008:         }
1009: 
1010:         $item->setOptions($product->getCustomOptions())
1011:             ->setProduct($product);
1012: 
1013:         // Add only item that is not in quote already (there can be other new or already saved item
1014:         if ($newItem) {
1015:             $this->addItem($item);
1016:         }
1017: 
1018:         return $item;
1019:     }
1020: 
1021:     /**
1022:      * Updates quote item with new configuration
1023:      *
1024:      * $params sets how current item configuration must be taken into account and additional options.
1025:      * It's passed to Mage_Catalog_Helper_Product->addParamsToBuyRequest() to compose resulting buyRequest.
1026:      *
1027:      * Basically it can hold
1028:      * - 'current_config', Varien_Object or array - current buyRequest that configures product in this item,
1029:      *   used to restore currently attached files
1030:      * - 'files_prefix': string[a-z0-9_] - prefix that was added at frontend to names of file options (file inputs), so they won't
1031:      *   intersect with other submitted options
1032:      *
1033:      * For more options see Mage_Catalog_Helper_Product->addParamsToBuyRequest()
1034:      *
1035:      * @param int $itemId
1036:      * @param Varien_Object $buyRequest
1037:      * @param null|array|Varien_Object $params
1038:      * @return Mage_Sales_Model_Quote_Item
1039:      *
1040:      * @see Mage_Catalog_Helper_Product::addParamsToBuyRequest()
1041:      */
1042:     public function updateItem($itemId, $buyRequest, $params = null)
1043:     {
1044:         $item = $this->getItemById($itemId);
1045:         if (!$item) {
1046:             Mage::throwException(Mage::helper('sales')->__('Wrong quote item id to update configuration.'));
1047:         }
1048:         $productId = $item->getProduct()->getId();
1049: 
1050:         //We need to create new clear product instance with same $productId
1051:         //to set new option values from $buyRequest
1052:         $product = Mage::getModel('catalog/product')
1053:             ->setStoreId($this->getStore()->getId())
1054:             ->load($productId);
1055: 
1056:         if (!$params) {
1057:             $params = new Varien_Object();
1058:         } else if (is_array($params)) {
1059:             $params = new Varien_Object($params);
1060:         }
1061:         $params->setCurrentConfig($item->getBuyRequest());
1062:         $buyRequest = Mage::helper('catalog/product')->addParamsToBuyRequest($buyRequest, $params);
1063: 
1064:         $buyRequest->setResetCount(true);
1065:         $resultItem = $this->addProduct($product, $buyRequest);
1066: 
1067:         if (is_string($resultItem)) {
1068:             Mage::throwException($resultItem);
1069:         }
1070: 
1071:         if ($resultItem->getParentItem()) {
1072:             $resultItem = $resultItem->getParentItem();
1073:         }
1074: 
1075:         if ($resultItem->getId() != $itemId) {
1076:             /*
1077:              * Product configuration didn't stick to original quote item
1078:              * It either has same configuration as some other quote item's product or completely new configuration
1079:              */
1080:             $this->removeItem($itemId);
1081: 
1082:             $items = $this->getAllItems();
1083:             foreach ($items as $item) {
1084:                 if (($item->getProductId() == $productId) && ($item->getId() != $resultItem->getId())) {
1085:                     if ($resultItem->compare($item)) {
1086:                         // Product configuration is same as in other quote item
1087:                         $resultItem->setQty($resultItem->getQty() + $item->getQty());
1088:                         $this->removeItem($item->getId());
1089:                         break;
1090:                     }
1091:                 }
1092:             }
1093:         } else {
1094:             $resultItem->setQty($buyRequest->getQty());
1095:         }
1096: 
1097:         return $resultItem;
1098:     }
1099: 
1100:     /**
1101:      * Retrieve quote item by product id
1102:      *
1103:      * @param   Mage_Catalog_Model_Product $product
1104:      * @return  Mage_Sales_Model_Quote_Item || false
1105:      */
1106:     public function getItemByProduct($product)
1107:     {
1108:         foreach ($this->getAllItems() as $item) {
1109:             if ($item->representProduct($product)) {
1110:                 return $item;
1111:             }
1112:         }
1113:         return false;
1114:     }
1115: 
1116:     public function getItemsSummaryQty()
1117:     {
1118:         $qty = $this->getData('all_items_qty');
1119:         if (is_null($qty)) {
1120:             $qty = 0;
1121:             foreach ($this->getAllItems() as $item) {
1122:                 if ($item->getParentItem()) {
1123:                     continue;
1124:                 }
1125: 
1126:                 if (($children = $item->getChildren()) && $item->isShipSeparately()) {
1127:                     foreach ($children as $child) {
1128:                         $qty+= $child->getQty()*$item->getQty();
1129:                     }
1130:                 } else {
1131:                     $qty+= $item->getQty();
1132:                 }
1133:             }
1134:             $this->setData('all_items_qty', $qty);
1135:         }
1136:         return $qty;
1137:     }
1138: 
1139:     public function getItemVirtualQty()
1140:     {
1141:         $qty = $this->getData('virtual_items_qty');
1142:         if (is_null($qty)) {
1143:             $qty = 0;
1144:             foreach ($this->getAllItems() as $item) {
1145:                 if ($item->getParentItem()) {
1146:                     continue;
1147:                 }
1148: 
1149:                 if (($children = $item->getChildren()) && $item->isShipSeparately()) {
1150:                     foreach ($children as $child) {
1151:                         if ($child->getProduct()->getIsVirtual()) {
1152:                             $qty+= $child->getQty();
1153:                         }
1154:                     }
1155:                 } else {
1156:                     if ($item->getProduct()->getIsVirtual()) {
1157:                         $qty+= $item->getQty();
1158:                     }
1159:                 }
1160:             }
1161:             $this->setData('virtual_items_qty', $qty);
1162:         }
1163:         return $qty;
1164:     }
1165: 
1166:     /*********************** PAYMENTS ***************************/
1167:     public function getPaymentsCollection()
1168:     {
1169:         if (is_null($this->_payments)) {
1170:             $this->_payments = Mage::getModel('sales/quote_payment')->getCollection()
1171:                 ->setQuoteFilter($this->getId());
1172: 
1173:             if ($this->getId()) {
1174:                 foreach ($this->_payments as $payment) {
1175:                     $payment->setQuote($this);
1176:                 }
1177:             }
1178:         }
1179:         return $this->_payments;
1180:     }
1181: 
1182:     /**
1183:      * @return Mage_Sales_Model_Quote_Payment
1184:      */
1185:     public function getPayment()
1186:     {
1187:         foreach ($this->getPaymentsCollection() as $payment) {
1188:             if (!$payment->isDeleted()) {
1189:                 return $payment;
1190:             }
1191:         }
1192:         $payment = Mage::getModel('sales/quote_payment');
1193:         $this->addPayment($payment);
1194:         return $payment;
1195:     }
1196: 
1197:     public function getPaymentById($paymentId)
1198:     {
1199:         foreach ($this->getPaymentsCollection() as $payment) {
1200:             if ($payment->getId()==$paymentId) {
1201:                 return $payment;
1202:             }
1203:         }
1204:         return false;
1205:     }
1206: 
1207:     public function addPayment(Mage_Sales_Model_Quote_Payment $payment)
1208:     {
1209:         $payment->setQuote($this);
1210:         if (!$payment->getId()) {
1211:             $this->getPaymentsCollection()->addItem($payment);
1212:         }
1213:         return $this;
1214:     }
1215: 
1216:     public function setPayment(Mage_Sales_Model_Quote_Payment $payment)
1217:     {
1218:         if (!$this->getIsMultiPayment() && ($old = $this->getPayment())) {
1219:             $payment->setId($old->getId());
1220:         }
1221:         $this->addPayment($payment);
1222: 
1223:         return $payment;
1224:     }
1225: 
1226:     public function removePayment()
1227:     {
1228:         $this->getPayment()->isDeleted(true);
1229:         return $this;
1230:     }
1231: 
1232:     /**
1233:      * Collect totals
1234:      *
1235:      * @return Mage_Sales_Model_Quote
1236:      */
1237:     public function collectTotals()
1238:     {
1239:         /**
1240:          * Protect double totals collection
1241:          */
1242:         if ($this->getTotalsCollectedFlag()) {
1243:             return $this;
1244:         }
1245:         Mage::dispatchEvent($this->_eventPrefix . '_collect_totals_before', array($this->_eventObject => $this));
1246: 
1247:         $this->setSubtotal(0);
1248:         $this->setBaseSubtotal(0);
1249: 
1250:         $this->setSubtotalWithDiscount(0);
1251:         $this->setBaseSubtotalWithDiscount(0);
1252: 
1253:         $this->setGrandTotal(0);
1254:         $this->setBaseGrandTotal(0);
1255: 
1256:         foreach ($this->getAllAddresses() as $address) {
1257:             $address->setSubtotal(0);
1258:             $address->setBaseSubtotal(0);
1259: 
1260:             $address->setGrandTotal(0);
1261:             $address->setBaseGrandTotal(0);
1262: 
1263:             $address->collectTotals();
1264: 
1265:             $this->setSubtotal((float) $this->getSubtotal() + $address->getSubtotal());
1266:             $this->setBaseSubtotal((float) $this->getBaseSubtotal() + $address->getBaseSubtotal());
1267: 
1268:             $this->setSubtotalWithDiscount(
1269:                 (float) $this->getSubtotalWithDiscount() + $address->getSubtotalWithDiscount()
1270:             );
1271:             $this->setBaseSubtotalWithDiscount(
1272:                 (float) $this->getBaseSubtotalWithDiscount() + $address->getBaseSubtotalWithDiscount()
1273:             );
1274: 
1275:             $this->setGrandTotal((float) $this->getGrandTotal() + $address->getGrandTotal());
1276:             $this->setBaseGrandTotal((float) $this->getBaseGrandTotal() + $address->getBaseGrandTotal());
1277:         }
1278: 
1279:         Mage::helper('sales')->checkQuoteAmount($this, $this->getGrandTotal());
1280:         Mage::helper('sales')->checkQuoteAmount($this, $this->getBaseGrandTotal());
1281: 
1282:         $this->setItemsCount(0);
1283:         $this->setItemsQty(0);
1284:         $this->setVirtualItemsQty(0);
1285: 
1286:         foreach ($this->getAllVisibleItems() as $item) {
1287:             if ($item->getParentItem()) {
1288:                 continue;
1289:             }
1290: 
1291:             $children = $item->getChildren();
1292:             if ($children && $item->isShipSeparately()) {
1293:                 foreach ($children as $child) {
1294:                     if ($child->getProduct()->getIsVirtual()) {
1295:                         $this->setVirtualItemsQty($this->getVirtualItemsQty() + $child->getQty()*$item->getQty());
1296:                     }
1297:                 }
1298:             }
1299: 
1300:             if ($item->getProduct()->getIsVirtual()) {
1301:                 $this->setVirtualItemsQty($this->getVirtualItemsQty() + $item->getQty());
1302:             }
1303:             $this->setItemsCount($this->getItemsCount()+1);
1304:             $this->setItemsQty((float) $this->getItemsQty()+$item->getQty());
1305:         }
1306: 
1307:         $this->setData('trigger_recollect', 0);
1308:         $this->_validateCouponCode();
1309: 
1310:         Mage::dispatchEvent($this->_eventPrefix . '_collect_totals_after', array($this->_eventObject => $this));
1311: 
1312:         $this->setTotalsCollectedFlag(true);
1313:         return $this;
1314:     }
1315: 
1316:     /**
1317:      * Get all quote totals (sorted by priority)
1318:      * Method process quote states isVirtual and isMultiShipping
1319:      *
1320:      * @return array
1321:      */
1322:     public function getTotals()
1323:     {
1324:         /**
1325:          * If quote is virtual we are using totals of billing address because
1326:          * all items assigned to it
1327:          */
1328:         if ($this->isVirtual()) {
1329:             return $this->getBillingAddress()->getTotals();
1330:         }
1331: 
1332:         $shippingAddress = $this->getShippingAddress();
1333:         $totals = $shippingAddress->getTotals();
1334:         // Going through all quote addresses and merge their totals
1335:         foreach ($this->getAddressesCollection() as $address) {
1336:             if ($address->isDeleted() || $address === $shippingAddress) {
1337:                 continue;
1338:             }
1339:             foreach ($address->getTotals() as $code => $total) {
1340:                 if (isset($totals[$code])) {
1341:                     $totals[$code]->merge($total);
1342:                 } else {
1343:                     $totals[$code] = $total;
1344:                 }
1345:             }
1346:         }
1347: 
1348:         $sortedTotals = array();
1349:         foreach ($this->getBillingAddress()->getTotalModels() as $total) {
1350:             /* @var $total Mage_Sales_Model_Quote_Address_Total_Abstract */
1351:             if (isset($totals[$total->getCode()])) {
1352:                 $sortedTotals[$total->getCode()] = $totals[$total->getCode()];
1353:             }
1354:         }
1355:         return $sortedTotals;
1356:     }
1357: 
1358:     public function addMessage($message, $index = 'error')
1359:     {
1360:         $messages = $this->getData('messages');
1361:         if (is_null($messages)) {
1362:             $messages = array();
1363:         }
1364: 
1365:         if (isset($messages[$index])) {
1366:             return $this;
1367:         }
1368: 
1369:         if (is_string($message)) {
1370:             $message = Mage::getSingleton('core/message')->error($message);
1371:         }
1372: 
1373:         $messages[$index] = $message;
1374:         $this->setData('messages', $messages);
1375:         return $this;
1376:     }
1377: 
1378:     /**
1379:      * Retrieve current quote messages
1380:      *
1381:      * @return array
1382:      */
1383:     public function getMessages()
1384:     {
1385:         $messages = $this->getData('messages');
1386:         if (is_null($messages)) {
1387:             $messages = array();
1388:             $this->setData('messages', $messages);
1389:         }
1390:         return $messages;
1391:     }
1392: 
1393:     /**
1394:      * Retrieve current quote errors
1395:      *
1396:      * @return array
1397:      */
1398:     public function getErrors()
1399:     {
1400:         $errors = array();
1401:         foreach ($this->getMessages() as $message) {
1402:             /* @var $error Mage_Core_Model_Message_Abstract */
1403:             if ($message->getType() == Mage_Core_Model_Message::ERROR) {
1404:                 array_push($errors, $message);
1405:             }
1406:         }
1407:         return $errors;
1408:     }
1409: 
1410:     /**
1411:      * Sets flag, whether this quote has some error associated with it.
1412:      *
1413:      * @param bool $flag
1414:      * @return Mage_Sales_Model_Quote
1415:      */
1416:     protected function _setHasError($flag)
1417:     {
1418:         return $this->setData('has_error', $flag);
1419:     }
1420: 
1421:     /**
1422:      * Sets flag, whether this quote has some error associated with it.
1423:      * When TRUE - also adds 'unknown' error information to list of quote errors.
1424:      * When FALSE - clears whole list of quote errors.
1425:      * It's recommended to use addErrorInfo() instead - to be able to remove error statuses later.
1426:      *
1427:      * @param bool $flag
1428:      * @return Mage_Sales_Model_Quote
1429:      * @see addErrorInfo()
1430:      */
1431:     public function setHasError($flag)
1432:     {
1433:         if ($flag) {
1434:             $this->addErrorInfo();
1435:         } else {
1436:             $this->_clearErrorInfo();
1437:         }
1438:         return $this;
1439:     }
1440: 
1441:     /**
1442:      * Clears list of errors, associated with this quote.
1443:      * Also automatically removes error-flag from oneself.
1444:      *
1445:      * @return Mage_Sales_Model_Quote
1446:      */
1447:     protected function _clearErrorInfo()
1448:     {
1449:         $this->_errorInfoGroups = array();
1450:         $this->_setHasError(false);
1451:         return $this;
1452:     }
1453: 
1454:     /**
1455:      * Adds error information to the quote.
1456:      * Automatically sets error flag.
1457:      *
1458:      * @param string $type An internal error type ('error', 'qty', etc.), passed then to adding messages routine
1459:      * @param string|null $origin Usually a name of module, that embeds error
1460:      * @param int|null $code Error code, unique for origin, that sets it
1461:      * @param string|null $message Error message
1462:      * @param Varien_Object|null $additionalData Any additional data, that caller would like to store
1463:      * @return Mage_Sales_Model_Quote
1464:      */
1465:     public function addErrorInfo($type = 'error', $origin = null, $code = null, $message = null, $additionalData = null)
1466:     {
1467:         if (!isset($this->_errorInfoGroups[$type])) {
1468:             $this->_errorInfoGroups[$type] = Mage::getModel('sales/status_list');
1469:         }
1470: 
1471:         $this->_errorInfoGroups[$type]->addItem($origin, $code, $message, $additionalData);
1472: 
1473:         if ($message !== null) {
1474:             $this->addMessage($message, $type);
1475:         }
1476:         $this->_setHasError(true);
1477: 
1478:         return $this;
1479:     }
1480: 
1481:     /**
1482:      * Removes error infos, that have parameters equal to passed in $params.
1483:      * $params can have following keys (if not set - then any item is good for this key):
1484:      *   'origin', 'code', 'message'
1485:      *
1486:      * @param string $type An internal error type ('error', 'qty', etc.), passed then to adding messages routine
1487:      * @param array $params
1488:      * @return Mage_Sales_Model_Quote
1489:      */
1490:     public function removeErrorInfosByParams($type = 'error', $params)
1491:     {
1492:         if ($type && !isset($this->_errorInfoGroups[$type])) {
1493:             return $this;
1494:         }
1495: 
1496:         $errorLists = array();
1497:         if ($type) {
1498:             $errorLists[] = $this->_errorInfoGroups[$type];
1499:         } else {
1500:             $errorLists = $this->_errorInfoGroups;
1501:         }
1502: 
1503:         foreach ($errorLists as $type => $errorList) {
1504:             $removedItems = $errorList->removeItemsByParams($params);
1505:             foreach ($removedItems as $item) {
1506:                 if ($item['message'] !== null) {
1507:                     $this->removeMessageByText($type, $item['message']);
1508:                 }
1509:             }
1510:         }
1511: 
1512:         $errorsExist = false;
1513:         foreach ($this->_errorInfoGroups as $errorListCheck) {
1514:             if ($errorListCheck->getItems()) {
1515:                 $errorsExist = true;
1516:                 break;
1517:             }
1518:         }
1519:         if (!$errorsExist) {
1520:             $this->_setHasError(false);
1521:         }
1522: 
1523:         return $this;
1524:     }
1525: 
1526:     /**
1527:      * Removes message by text
1528:      *
1529:      * @param string $type
1530:      * @param string $text
1531:      * @return Mage_Sales_Model_Quote
1532:      */
1533:     public function removeMessageByText($type = 'error', $text)
1534:     {
1535:         $messages = $this->getData('messages');
1536:         if (is_null($messages)) {
1537:             $messages = array();
1538:         }
1539: 
1540:         if (!isset($messages[$type])) {
1541:             return $this;
1542:         }
1543: 
1544:         $message = $messages[$type];
1545:         if ($message instanceof Mage_Core_Model_Message_Abstract) {
1546:             $message = $message->getText();
1547:         } else if (!is_string($message)) {
1548:             return $this;
1549:         }
1550:         if ($message == $text) {
1551:             unset($messages[$type]);
1552:             $this->setData('messages', $messages);
1553:         }
1554:         return $this;
1555:     }
1556: 
1557:     /**
1558:      * Generate new increment order id and associate it with current quote
1559:      *
1560:      * @return Mage_Sales_Model_Quote
1561:      */
1562:     public function reserveOrderId()
1563:     {
1564:         if (!$this->getReservedOrderId()) {
1565:             $this->setReservedOrderId($this->_getResource()->getReservedOrderId($this));
1566:         } else {
1567:             //checking if reserved order id was already used for some order
1568:             //if yes reserving new one if not using old one
1569:             if ($this->_getResource()->isOrderIncrementIdUsed($this->getReservedOrderId())) {
1570:                 $this->setReservedOrderId($this->_getResource()->getReservedOrderId($this));
1571:             }
1572:         }
1573:         return $this;
1574:     }
1575: 
1576:     public function validateMinimumAmount($multishipping = false)
1577:     {
1578:         $storeId = $this->getStoreId();
1579:         $minOrderActive = Mage::getStoreConfigFlag('sales/minimum_order/active', $storeId);
1580:         $minOrderMulti  = Mage::getStoreConfigFlag('sales/minimum_order/multi_address', $storeId);
1581:         $minAmount      = Mage::getStoreConfig('sales/minimum_order/amount', $storeId);
1582: 
1583:         if (!$minOrderActive) {
1584:             return true;
1585:         }
1586: 
1587:         $addresses = $this->getAllAddresses();
1588: 
1589:         if ($multishipping) {
1590:             if ($minOrderMulti) {
1591:                 foreach ($addresses as $address) {
1592:                     foreach ($address->getQuote()->getItemsCollection() as $item) {
1593:                         $amount = $item->getBaseRowTotal() - $item->getBaseDiscountAmount();
1594:                         if ($amount < $minAmount) {
1595:                             return false;
1596:                         }
1597:                     }
1598:                 }
1599:             } else {
1600:                 $baseTotal = 0;
1601:                 foreach ($addresses as $address) {
1602:                     /* @var $address Mage_Sales_Model_Quote_Address */
1603:                     $baseTotal += $address->getBaseSubtotalWithDiscount();
1604:                 }
1605:                 if ($baseTotal < $minAmount) {
1606:                     return false;
1607:                 }
1608:             }
1609:         } else {
1610:             foreach ($addresses as $address) {
1611:                 /* @var $address Mage_Sales_Model_Quote_Address */
1612:                 if (!$address->validateMinimumAmount()) {
1613:                     return false;
1614:                 }
1615:             }
1616:         }
1617:         return true;
1618:     }
1619: 
1620:     /**
1621:      * Check quote for virtual product only
1622:      *
1623:      * @return bool
1624:      */
1625:     public function isVirtual()
1626:     {
1627:         $isVirtual = true;
1628:         $countItems = 0;
1629:         foreach ($this->getItemsCollection() as $_item) {
1630:             /* @var $_item Mage_Sales_Model_Quote_Item */
1631:             if ($_item->isDeleted() || $_item->getParentItemId()) {
1632:                 continue;
1633:             }
1634:             $countItems ++;
1635:             if (!$_item->getProduct()->getIsVirtual()) {
1636:                 $isVirtual = false;
1637:                 break;
1638:             }
1639:         }
1640:         return $countItems == 0 ? false : $isVirtual;
1641:     }
1642: 
1643:     /**
1644:      * Check quote for virtual product only
1645:      *
1646:      * @return bool
1647:      */
1648:     public function getIsVirtual()
1649:     {
1650:         return intval($this->isVirtual());
1651:     }
1652: 
1653:     /**
1654:      * Has a virtual products on quote
1655:      *
1656:      * @return bool
1657:      */
1658:     public function hasVirtualItems()
1659:     {
1660:         $hasVirtual = false;
1661:         foreach ($this->getItemsCollection() as $_item) {
1662:             if ($_item->getParentItemId()) {
1663:                 continue;
1664:             }
1665:             if ($_item->getProduct()->isVirtual()) {
1666:                 $hasVirtual = true;
1667:             }
1668:         }
1669:         return $hasVirtual;
1670:     }
1671: 
1672:     /**
1673:      * Merge quotes
1674:      *
1675:      * @param   Mage_Sales_Model_Quote $quote
1676:      * @return  Mage_Sales_Model_Quote
1677:      */
1678:     public function merge(Mage_Sales_Model_Quote $quote)
1679:     {
1680:         Mage::dispatchEvent(
1681:             $this->_eventPrefix . '_merge_before',
1682:             array(
1683:                  $this->_eventObject=>$this,
1684:                  'source'=>$quote
1685:             )
1686:         );
1687: 
1688:         foreach ($quote->getAllVisibleItems() as $item) {
1689:             $found = false;
1690:             foreach ($this->getAllItems() as $quoteItem) {
1691:                 if ($quoteItem->compare($item)) {
1692:                     $quoteItem->setQty($quoteItem->getQty() + $item->getQty());
1693:                     $found = true;
1694:                     break;
1695:                 }
1696:             }
1697: 
1698:             if (!$found) {
1699:                 $newItem = clone $item;
1700:                 $this->addItem($newItem);
1701:                 if ($item->getHasChildren()) {
1702:                     foreach ($item->getChildren() as $child) {
1703:                         $newChild = clone $child;
1704:                         $newChild->setParentItem($newItem);
1705:                         $this->addItem($newChild);
1706:                     }
1707:                 }
1708:             }
1709:         }
1710: 
1711:         /**
1712:          * Init shipping and billing address if quote is new
1713:          */
1714:         if (!$this->getId()) {
1715:             $this->getShippingAddress();
1716:             $this->getBillingAddress();
1717:         }
1718: 
1719:         if ($quote->getCouponCode()) {
1720:             $this->setCouponCode($quote->getCouponCode());
1721:         }
1722: 
1723:         Mage::dispatchEvent(
1724:             $this->_eventPrefix . '_merge_after',
1725:             array(
1726:                  $this->_eventObject=>$this,
1727:                  'source'=>$quote
1728:             )
1729:         );
1730: 
1731:         return $this;
1732:     }
1733: 
1734:     /**
1735:      * Whether there are recurring items
1736:      *
1737:      * @return bool
1738:      */
1739:     public function hasRecurringItems()
1740:     {
1741:         foreach ($this->getAllVisibleItems() as $item) {
1742:             if ($item->getProduct() && $item->getProduct()->isRecurring()) {
1743:                 return true;
1744:             }
1745:         }
1746:         return false;
1747:     }
1748: 
1749:     /**
1750:      * Getter whether quote has nominal items
1751:      * Can bypass treating virtual items as nominal
1752:      *
1753:      * @param bool $countVirtual
1754:      * @return bool
1755:      */
1756:     public function hasNominalItems($countVirtual = true)
1757:     {
1758:         foreach ($this->getAllVisibleItems() as $item) {
1759:             if ($item->isNominal()) {
1760:                 if ((!$countVirtual) && $item->getProduct()->isVirtual()) {
1761:                     continue;
1762:                 }
1763:                 return true;
1764:             }
1765:         }
1766:         return false;
1767:     }
1768: 
1769:     /**
1770:      * Whether quote has nominal items only
1771:      *
1772:      * @return bool
1773:      */
1774:     public function isNominal()
1775:     {
1776:         foreach ($this->getAllVisibleItems() as $item) {
1777:             if (!$item->isNominal()) {
1778:                 return false;
1779:             }
1780:         }
1781:         return true;
1782:     }
1783: 
1784:     /**
1785:      * Create recurring payment profiles basing on the current items
1786:      *
1787:      * @return array
1788:      */
1789:     public function prepareRecurringPaymentProfiles()
1790:     {
1791:         if (!$this->getTotalsCollectedFlag()) {
1792:             // Whoops! Make sure nominal totals must be calculated here.
1793:             throw new Exception('Quote totals must be collected before this operation.');
1794:         }
1795: 
1796:         $result = array();
1797:         foreach ($this->getAllVisibleItems() as $item) {
1798:             $product = $item->getProduct();
1799:             if (is_object($product) && ($product->isRecurring())
1800:                 && $profile = Mage::getModel('sales/recurring_profile')->importProduct($product)
1801:             ) {
1802:                 $profile->importQuote($this);
1803:                 $profile->importQuoteItem($item);
1804:                 $result[] = $profile;
1805:             }
1806:         }
1807:         return $result;
1808:     }
1809: 
1810:     protected function _validateCouponCode()
1811:     {
1812:         $code = $this->_getData('coupon_code');
1813:         if (strlen($code)) {
1814:             $addressHasCoupon = false;
1815:             $addresses = $this->getAllAddresses();
1816:             if (count($addresses)>0) {
1817:                 foreach ($addresses as $address) {
1818:                     if ($address->hasCouponCode()) {
1819:                         $addressHasCoupon = true;
1820:                     }
1821:                 }
1822:                 if (!$addressHasCoupon) {
1823:                     $this->setCouponCode('');
1824:                 }
1825:             }
1826:         }
1827:         return $this;
1828:     }
1829: 
1830:     /**
1831:      * Trigger collect totals after loading, if required
1832:      *
1833:      * @return Mage_Sales_Model_Quote
1834:      */
1835:     protected function _afterLoad()
1836:     {
1837:         // collect totals and save me, if required
1838:         if (1 == $this->getData('trigger_recollect')) {
1839:             $this->collectTotals()->save();
1840:         }
1841:         return parent::_afterLoad();
1842:     }
1843: 
1844:     /**
1845:      * @deprecated after 1.4 beta1 - one page checkout responsibility
1846:      */
1847:     const CHECKOUT_METHOD_REGISTER  = 'register';
1848:     const CHECKOUT_METHOD_GUEST     = 'guest';
1849:     const CHECKOUT_METHOD_LOGIN_IN  = 'login_in';
1850: 
1851:     /**
1852:      * Return quote checkout method code
1853:      *
1854:      * @deprecated after 1.4 beta1 it is checkout module responsibility
1855:      * @param boolean $originalMethod if true return defined method from begining
1856:      * @return string
1857:      */
1858:     public function getCheckoutMethod($originalMethod = false)
1859:     {
1860:         if ($this->getCustomerId() && !$originalMethod) {
1861:             return self::CHECKOUT_METHOD_LOGIN_IN;
1862:         }
1863:         return $this->_getData('checkout_method');
1864:     }
1865: 
1866:     /**
1867:      * Check is allow Guest Checkout
1868:      *
1869:      * @deprecated after 1.4 beta1 it is checkout module responsibility
1870:      * @return bool
1871:      */
1872:     public function isAllowedGuestCheckout()
1873:     {
1874:         return Mage::helper('checkout')->isAllowedGuestCheckout($this, $this->getStoreId());
1875:     }
1876: 
1877:     /**
1878:      * Prevent quote from saving
1879:      *
1880:      * @return Mage_Sales_Model_Quote
1881:      */
1882:     public function preventSaving()
1883:     {
1884:         $this->_preventSaving = true;
1885:         return $this;
1886:     }
1887: 
1888:     /**
1889:      * Save quote with prevention checking
1890:      *
1891:      * @return Mage_Sales_Model_Quote
1892:      */
1893:     public function save()
1894:     {
1895:         if ($this->_preventSaving) {
1896:             return $this;
1897:         }
1898:         return parent::save();
1899:     }
1900: }
1901: 
Magento 1.7.0.2 API documentation generated by ApiGen 2.8.0