PageRenderTime 26ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/app/code/core/Mage/Downloadable/Model/Observer.php

https://github.com/speedupmate/Magento-CE-Mirror
PHP | 296 lines | 203 code | 21 blank | 72 comment | 55 complexity | 7cee54fb920078a8e59cf0f51febf9eb MD5 | raw file
  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@magento.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.magento.com for more information.
  20. *
  21. * @category Mage
  22. * @package Mage_Downloadable
  23. * @copyright Copyright (c) 2006-2020 Magento, Inc. (http://www.magento.com)
  24. * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
  25. */
  26. /**
  27. * Downloadable Products Observer
  28. *
  29. * @category Mage
  30. * @package Mage_Downloadable
  31. * @author Magento Core Team <core@magentocommerce.com>
  32. */
  33. class Mage_Downloadable_Model_Observer
  34. {
  35. const XML_PATH_DISABLE_GUEST_CHECKOUT = 'catalog/downloadable/disable_guest_checkout';
  36. /**
  37. * Prepare product to save
  38. *
  39. * @param Varien_Object $observer
  40. * @return Mage_Downloadable_Model_Observer
  41. */
  42. public function prepareProductSave($observer)
  43. {
  44. $request = $observer->getEvent()->getRequest();
  45. $product = $observer->getEvent()->getProduct();
  46. if ($downloadable = $request->getPost('downloadable')) {
  47. $product->setDownloadableData($downloadable);
  48. }
  49. return $this;
  50. }
  51. /**
  52. * Save data from order to purchased links
  53. *
  54. * @param Varien_Object $observer
  55. * @return Mage_Downloadable_Model_Observer
  56. */
  57. public function saveDownloadableOrderItem($observer)
  58. {
  59. $orderItem = $observer->getEvent()->getItem();
  60. if (!$orderItem->getId()) {
  61. //order not saved in the database
  62. return $this;
  63. }
  64. $product = $orderItem->getProduct();
  65. if ($product && $product->getTypeId() != Mage_Downloadable_Model_Product_Type::TYPE_DOWNLOADABLE) {
  66. return $this;
  67. }
  68. if (Mage::getModel('downloadable/link_purchased')->load($orderItem->getId(), 'order_item_id')->getId()) {
  69. return $this;
  70. }
  71. if (!$product) {
  72. $product = Mage::getModel('catalog/product')
  73. ->setStoreId($orderItem->getOrder()->getStoreId())
  74. ->load($orderItem->getProductId());
  75. }
  76. if ($product->getTypeId() == Mage_Downloadable_Model_Product_Type::TYPE_DOWNLOADABLE) {
  77. $links = $product->getTypeInstance(true)->getLinks($product);
  78. if ($linkIds = $orderItem->getProductOptionByCode('links')) {
  79. $linkPurchased = Mage::getModel('downloadable/link_purchased');
  80. Mage::helper('core')->copyFieldset(
  81. 'downloadable_sales_copy_order',
  82. 'to_downloadable',
  83. $orderItem->getOrder(),
  84. $linkPurchased
  85. );
  86. Mage::helper('core')->copyFieldset(
  87. 'downloadable_sales_copy_order_item',
  88. 'to_downloadable',
  89. $orderItem,
  90. $linkPurchased
  91. );
  92. $linkSectionTitle = (
  93. $product->getLinksTitle()?
  94. $product->getLinksTitle():Mage::getStoreConfig(Mage_Downloadable_Model_Link::XML_PATH_LINKS_TITLE)
  95. );
  96. $linkPurchased->setLinkSectionTitle($linkSectionTitle)
  97. ->save();
  98. foreach ($linkIds as $linkId) {
  99. if (isset($links[$linkId])) {
  100. $linkPurchasedItem = Mage::getModel('downloadable/link_purchased_item')
  101. ->setPurchasedId($linkPurchased->getId())
  102. ->setOrderItemId($orderItem->getId());
  103. Mage::helper('core')->copyFieldset(
  104. 'downloadable_sales_copy_link',
  105. 'to_purchased',
  106. $links[$linkId],
  107. $linkPurchasedItem
  108. );
  109. $linkHash = strtr(base64_encode(microtime() . $linkPurchased->getId() . $orderItem->getId()
  110. . $product->getId()), '+/=', '-_,');
  111. $numberOfDownloads = $links[$linkId]->getNumberOfDownloads()*$orderItem->getQtyOrdered();
  112. $linkPurchasedItem->setLinkHash($linkHash)
  113. ->setNumberOfDownloadsBought($numberOfDownloads)
  114. ->setStatus(Mage_Downloadable_Model_Link_Purchased_Item::LINK_STATUS_PENDING)
  115. ->setCreatedAt($orderItem->getCreatedAt())
  116. ->setUpdatedAt($orderItem->getUpdatedAt())
  117. ->save();
  118. }
  119. }
  120. }
  121. }
  122. return $this;
  123. }
  124. /**
  125. * Set checkout session flag if order has downloadable product(s)
  126. *
  127. * @param Varien_Object $observer
  128. * @return Mage_Downloadable_Model_Observer
  129. */
  130. public function setHasDownloadableProducts($observer)
  131. {
  132. $session = Mage::getSingleton('checkout/session');
  133. if (!$session->getHasDownloadableProducts()) {
  134. $order = $observer->getEvent()->getOrder();
  135. foreach ($order->getAllItems() as $item) {
  136. /* @var $item Mage_Sales_Model_Order_Item */
  137. if ($item->getProductType() == Mage_Downloadable_Model_Product_Type::TYPE_DOWNLOADABLE
  138. || $item->getRealProductType() == Mage_Downloadable_Model_Product_Type::TYPE_DOWNLOADABLE
  139. || $item->getProductOptionByCode('is_downloadable'))
  140. {
  141. $session->setHasDownloadableProducts(true);
  142. break;
  143. }
  144. }
  145. }
  146. return $this;
  147. }
  148. /**
  149. * Set status of link
  150. *
  151. * @param Varien_Object $observer
  152. * @return Mage_Downloadable_Model_Observer
  153. */
  154. public function setLinkStatus($observer)
  155. {
  156. $order = $observer->getEvent()->getOrder();
  157. if (!$order->getId()) {
  158. //order not saved in the database
  159. return $this;
  160. }
  161. /* @var $order Mage_Sales_Model_Order */
  162. $status = '';
  163. $linkStatuses = array(
  164. 'pending' => Mage_Downloadable_Model_Link_Purchased_Item::LINK_STATUS_PENDING,
  165. 'expired' => Mage_Downloadable_Model_Link_Purchased_Item::LINK_STATUS_EXPIRED,
  166. 'avail' => Mage_Downloadable_Model_Link_Purchased_Item::LINK_STATUS_AVAILABLE,
  167. 'payment_pending' => Mage_Downloadable_Model_Link_Purchased_Item::LINK_STATUS_PENDING_PAYMENT,
  168. 'payment_review' => Mage_Downloadable_Model_Link_Purchased_Item::LINK_STATUS_PAYMENT_REVIEW
  169. );
  170. $downloadableItemsStatuses = array();
  171. $orderItemStatusToEnable = Mage::getStoreConfig(
  172. Mage_Downloadable_Model_Link_Purchased_Item::XML_PATH_ORDER_ITEM_STATUS, $order->getStoreId()
  173. );
  174. if ($order->getState() == Mage_Sales_Model_Order::STATE_HOLDED) {
  175. $status = $linkStatuses['pending'];
  176. } elseif ($order->isCanceled()
  177. || $order->getState() == Mage_Sales_Model_Order::STATE_CLOSED
  178. || $order->getState() == Mage_Sales_Model_Order::STATE_COMPLETE
  179. ) {
  180. $expiredStatuses = array(
  181. Mage_Sales_Model_Order_Item::STATUS_CANCELED,
  182. Mage_Sales_Model_Order_Item::STATUS_REFUNDED,
  183. );
  184. foreach ($order->getAllItems() as $item) {
  185. if ($item->getProductType() == Mage_Downloadable_Model_Product_Type::TYPE_DOWNLOADABLE
  186. || $item->getRealProductType() == Mage_Downloadable_Model_Product_Type::TYPE_DOWNLOADABLE
  187. ) {
  188. if (in_array($item->getStatusId(), $expiredStatuses)) {
  189. $downloadableItemsStatuses[$item->getId()] = $linkStatuses['expired'];
  190. } else {
  191. $downloadableItemsStatuses[$item->getId()] = $linkStatuses['avail'];
  192. }
  193. }
  194. }
  195. } elseif ($order->getState() == Mage_Sales_Model_Order::STATE_PENDING_PAYMENT) {
  196. $status = $linkStatuses['payment_pending'];
  197. } elseif ($order->getState() == Mage_Sales_Model_Order::STATE_PAYMENT_REVIEW) {
  198. $status = $linkStatuses['payment_review'];
  199. } else {
  200. $availableStatuses = array($orderItemStatusToEnable, Mage_Sales_Model_Order_Item::STATUS_INVOICED);
  201. foreach ($order->getAllItems() as $item) {
  202. if ($item->getProductType() == Mage_Downloadable_Model_Product_Type::TYPE_DOWNLOADABLE
  203. || $item->getRealProductType() == Mage_Downloadable_Model_Product_Type::TYPE_DOWNLOADABLE
  204. ) {
  205. if ($item->getStatusId() == Mage_Sales_Model_Order_Item::STATUS_BACKORDERED &&
  206. $orderItemStatusToEnable == Mage_Sales_Model_Order_Item::STATUS_PENDING &&
  207. !in_array(Mage_Sales_Model_Order_Item::STATUS_BACKORDERED, $availableStatuses, true) ) {
  208. $availableStatuses[] = Mage_Sales_Model_Order_Item::STATUS_BACKORDERED;
  209. }
  210. if (in_array($item->getStatusId(), $availableStatuses)) {
  211. $downloadableItemsStatuses[$item->getId()] = $linkStatuses['avail'];
  212. }
  213. }
  214. }
  215. }
  216. if (!$downloadableItemsStatuses && $status) {
  217. foreach ($order->getAllItems() as $item) {
  218. if ($item->getProductType() == Mage_Downloadable_Model_Product_Type::TYPE_DOWNLOADABLE
  219. || $item->getRealProductType() == Mage_Downloadable_Model_Product_Type::TYPE_DOWNLOADABLE
  220. ) {
  221. $downloadableItemsStatuses[$item->getId()] = $status;
  222. }
  223. }
  224. }
  225. if ($downloadableItemsStatuses) {
  226. $linkPurchased = Mage::getResourceModel('downloadable/link_purchased_item_collection')
  227. ->addFieldToFilter('order_item_id', array('in' => array_keys($downloadableItemsStatuses)));
  228. foreach ($linkPurchased as $link) {
  229. if ($link->getStatus() != $linkStatuses['expired']
  230. && !empty($downloadableItemsStatuses[$link->getOrderItemId()])
  231. ) {
  232. $link->setStatus($downloadableItemsStatuses[$link->getOrderItemId()])
  233. ->save();
  234. }
  235. }
  236. }
  237. return $this;
  238. }
  239. /**
  240. * Check is allowed guest checkuot if quote contain downloadable product(s)
  241. *
  242. * @param Varien_Event_Observer $observer
  243. * @return Mage_Downloadable_Model_Observer
  244. */
  245. public function isAllowedGuestCheckout(Varien_Event_Observer $observer)
  246. {
  247. $quote = $observer->getEvent()->getQuote();
  248. /* @var $quote Mage_Sales_Model_Quote */
  249. $store = $observer->getEvent()->getStore();
  250. $result = $observer->getEvent()->getResult();
  251. $isContain = false;
  252. foreach ($quote->getAllItems() as $item) {
  253. if (($product = $item->getProduct()) &&
  254. $product->getTypeId() == Mage_Downloadable_Model_Product_Type::TYPE_DOWNLOADABLE) {
  255. $isContain = true;
  256. }
  257. }
  258. if ($isContain && Mage::getStoreConfigFlag(self::XML_PATH_DISABLE_GUEST_CHECKOUT, $store)) {
  259. $result->setIsAllowed(false);
  260. }
  261. return $this;
  262. }
  263. /**
  264. * Initialize product options renderer with downloadable specific params
  265. *
  266. * @param Varien_Event_Observer $observer
  267. * @return Mage_Downloadable_Model_Observer
  268. */
  269. public function initOptionRenderer(Varien_Event_Observer $observer)
  270. {
  271. $block = $observer->getBlock();
  272. $block->addOptionsRenderCfg('downloadable', 'downloadable/catalog_product_configuration');
  273. return $this;
  274. }
  275. }