PageRenderTime 54ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

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

https://bitbucket.org/sevenly/magento-ce
PHP | 357 lines | 217 code | 47 blank | 93 comment | 22 complexity | c69dc240c71ac26678ee263ff1ec5719 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@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_Weee
  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. class Mage_Weee_Model_Observer extends Mage_Core_Model_Abstract
  27. {
  28. /**
  29. * Assign custom renderer for product create/edit form weee attribute element
  30. *
  31. * @param Varien_Event_Observer $observer
  32. * @return Mage_Weee_Model_Observer
  33. */
  34. public function setWeeeRendererInForm(Varien_Event_Observer $observer)
  35. {
  36. //adminhtml_catalog_product_edit_prepare_form
  37. $form = $observer->getEvent()->getForm();
  38. // $product = $observer->getEvent()->getProduct();
  39. $attributes = Mage::getSingleton('weee/tax')->getWeeeAttributeCodes(true);
  40. foreach ($attributes as $code) {
  41. if ($weeeTax = $form->getElement($code)) {
  42. $weeeTax->setRenderer(
  43. Mage::app()->getLayout()->createBlock('weee/renderer_weee_tax')
  44. );
  45. }
  46. }
  47. return $this;
  48. }
  49. /**
  50. * Exclude WEEE attributes from standard form generation
  51. *
  52. * @param Varien_Event_Observer $observer
  53. * @return Mage_Weee_Model_Observer
  54. */
  55. public function updateExcludedFieldList(Varien_Event_Observer $observer)
  56. {
  57. //adminhtml_catalog_product_form_prepare_excluded_field_list
  58. $block = $observer->getEvent()->getObject();
  59. $list = $block->getFormExcludedFieldList();
  60. $attributes = Mage::getSingleton('weee/tax')->getWeeeAttributeCodes(true);
  61. $list = array_merge($list, array_values($attributes));
  62. $block->setFormExcludedFieldList($list);
  63. return $this;
  64. }
  65. /**
  66. * Add additional price calculation to select object which is using for select indexed data
  67. *
  68. * @param Varien_Event_Observer $observer
  69. * @return Mage_Weee_Model_Observer
  70. */
  71. public function prepareCatalogIndexSelect(Varien_Event_Observer $observer)
  72. {
  73. $storeId = (int)$observer->getEvent()->getStoreId();
  74. if (!Mage::helper('weee')->isEnabled($storeId)) {
  75. return $this;
  76. }
  77. switch(Mage::helper('weee')->getListPriceDisplayType()) {
  78. case Mage_Weee_Model_Tax::DISPLAY_EXCL_DESCR_INCL:
  79. case Mage_Weee_Model_Tax::DISPLAY_EXCL:
  80. return $this;
  81. }
  82. /** @var $select Varien_Db_Select */
  83. $select = $observer->getEvent()->getSelect();
  84. $table = $observer->getEvent()->getTable();
  85. $websiteId = (int)Mage::app()->getStore($storeId)->getWebsiteId();
  86. $customerGroupId = (int)Mage::getSingleton('customer/session')->getCustomerGroupId();
  87. $response = $observer->getEvent()->getResponseObject();
  88. $additionalCalculations = $response->getAdditionalCalculations();
  89. $attributes = Mage::getSingleton('weee/tax')->getWeeeAttributeCodes();
  90. if ($attributes && Mage::helper('weee')->isDiscounted()) {
  91. $joinConditions = array(
  92. "discount_percent.entity_id = {$table}.entity_id",
  93. $select->getAdapter()->quoteInto('discount_percent.website_id = ?', $websiteId),
  94. $select->getAdapter()->quoteInto('discount_percent.customer_group_id = ?', $customerGroupId)
  95. );
  96. $tableWeeDiscount = Mage::getSingleton('weee/tax')->getResource()->getTable('weee/discount');
  97. $select->joinLeft(
  98. array('discount_percent' => $tableWeeDiscount),
  99. implode(' AND ', $joinConditions),
  100. array()
  101. );
  102. }
  103. $checkDiscountField = $select->getAdapter()->getCheckSql(
  104. 'discount_percent.value IS NULL', 0, 'discount_percent.value');
  105. foreach ($attributes as $attribute) {
  106. $fieldAlias = sprintf('weee_%s_table.value', $attribute);
  107. $checkAdditionalCalculation = $select->getAdapter()->getCheckSql("{$fieldAlias} IS NULL", 0, $fieldAlias);
  108. if (Mage::helper('weee')->isDiscounted()) {
  109. $additionalCalculations[] = sprintf('+(%s*(1-(%s/100)))', $checkAdditionalCalculation, $checkDiscountField);
  110. } else {
  111. $additionalCalculations[] = "+($checkAdditionalCalculation)";
  112. }
  113. }
  114. $response->setAdditionalCalculations($additionalCalculations);
  115. /** @var $rateRequest Varien_Object */
  116. $rateRequest = Mage::getSingleton('tax/calculation')->getRateRequest();
  117. $attributes = Mage::getSingleton('weee/tax')->getWeeeTaxAttributeCodes();
  118. foreach ($attributes as $attribute) {
  119. $attributeId = (int)Mage::getSingleton('eav/entity_attribute')
  120. ->getIdByCode(Mage_Catalog_Model_Product::ENTITY, $attribute);
  121. $tableAlias = sprintf('weee_%s_table', $attribute);
  122. $quotedTableAlias = $select->getAdapter()->quoteTableAs($tableAlias, null);
  123. $attributeSelect = $this->_getSelect();
  124. $attributeSelect
  125. ->from(array($tableAlias => Mage::getSingleton('weee/tax')->getResource()->getTable('weee/tax')))
  126. ->where("{$quotedTableAlias}.attribute_id = ?", $attributeId)
  127. ->where("{$quotedTableAlias}.website_id IN(?)", array($websiteId, 0))
  128. ->where("{$quotedTableAlias}.country = ?", $rateRequest->getCountryId())
  129. ->where("{$quotedTableAlias}.state IN(?)", array($rateRequest->getRegionId(), '*'));
  130. $order = array(
  131. sprintf('%s.state %s', $tableAlias, Varien_Db_Select::SQL_DESC),
  132. sprintf('%s.website_id %s', $tableAlias, Varien_Db_Select::SQL_DESC)
  133. );
  134. $attributeSelect->order($order);
  135. $joinCondition = sprintf('%s.entity_id = %s.entity_id', $table, $quotedTableAlias);
  136. $select->joinLeft(
  137. array($tableAlias => $attributeSelect),
  138. $joinCondition,
  139. array()
  140. );
  141. }
  142. return $this;
  143. }
  144. /**
  145. * Get empty select object
  146. *
  147. * @return Varien_Db_Select
  148. */
  149. protected function _getSelect()
  150. {
  151. return Mage::getSingleton('weee/tax')->getResource()->getReadConnection()->select();
  152. }
  153. /**
  154. * Add new attribute type to manage attributes interface
  155. *
  156. * @param Varien_Event_Observer $observer
  157. * @return Mage_Weee_Model_Observer
  158. */
  159. public function addWeeeTaxAttributeType(Varien_Event_Observer $observer)
  160. {
  161. // adminhtml_product_attribute_types
  162. $response = $observer->getEvent()->getResponse();
  163. $types = $response->getTypes();
  164. $types[] = array(
  165. 'value' => 'weee',
  166. 'label' => Mage::helper('weee')->__('Fixed Product Tax'),
  167. 'hide_fields' => array(
  168. 'is_unique',
  169. 'is_required',
  170. 'frontend_class',
  171. 'is_configurable',
  172. '_scope',
  173. '_default_value',
  174. '_front_fieldset',
  175. ),
  176. 'disabled_types' => array(
  177. Mage_Catalog_Model_Product_Type::TYPE_GROUPED,
  178. )
  179. );
  180. $response->setTypes($types);
  181. return $this;
  182. }
  183. /**
  184. * Automaticaly assign backend model to weee attributes
  185. *
  186. * @param Varien_Event_Observer $observer
  187. * @return Mage_Weee_Model_Observer
  188. */
  189. public function assignBackendModelToAttribute(Varien_Event_Observer $observer)
  190. {
  191. $backendModel = Mage_Weee_Model_Attribute_Backend_Weee_Tax::getBackendModelName();
  192. /** @var $object Mage_Eav_Model_Entity_Attribute_Abstract */
  193. $object = $observer->getEvent()->getAttribute();
  194. if ($object->getFrontendInput() == 'weee') {
  195. $object->setBackendModel($backendModel);
  196. if (!$object->getApplyTo()) {
  197. $applyTo = array();
  198. foreach (Mage_Catalog_Model_Product_Type::getOptions() as $option) {
  199. if ($option['value'] == Mage_Catalog_Model_Product_Type::TYPE_GROUPED) {
  200. continue;
  201. }
  202. $applyTo[] = $option['value'];
  203. }
  204. $object->setApplyTo($applyTo);
  205. }
  206. }
  207. return $this;
  208. }
  209. /**
  210. * Add custom element type for attributes form
  211. *
  212. * @param Varien_Event_Observer $observer
  213. */
  214. public function updateElementTypes(Varien_Event_Observer $observer)
  215. {
  216. $response = $observer->getEvent()->getResponse();
  217. $types = $response->getTypes();
  218. $types['weee'] = Mage::getConfig()->getBlockClassName('weee/element_weee_tax');
  219. $response->setTypes($types);
  220. return $this;
  221. }
  222. /**
  223. * Update WEEE amounts discount percents
  224. *
  225. * @param Varien_Event_Observer $observer
  226. * @return Mage_Weee_Model_Observer
  227. */
  228. public function updateDiscountPercents(Varien_Event_Observer $observer)
  229. {
  230. if (!Mage::helper('weee')->isEnabled()) {
  231. return $this;
  232. }
  233. $productCondition = $observer->getEvent()->getProductCondition();
  234. if ($productCondition) {
  235. $eventProduct = $productCondition;
  236. } else {
  237. $eventProduct = $observer->getEvent()->getProduct();
  238. }
  239. Mage::getModel('weee/tax')->updateProductsDiscountPercent($eventProduct);
  240. return $this;
  241. }
  242. /**
  243. * Update configurable options of the product view page
  244. *
  245. * @param Varien_Event_Observer $observer
  246. * @return Mage_Weee_Model_Observer
  247. */
  248. public function updateCofigurableProductOptions(Varien_Event_Observer $observer)
  249. {
  250. /* @var $weeeHelper Mage_Weee_Helper_Data */
  251. $weeeHelper = Mage::helper('weee');
  252. if (!$weeeHelper->isEnabled()) {
  253. return $this;
  254. }
  255. $response = $observer->getEvent()->getResponseObject();
  256. $options = $response->getAdditionalOptions();
  257. $_product = Mage::registry('current_product');
  258. if (!$_product) {
  259. return $this;
  260. }
  261. $amount = $weeeHelper->getAmount($_product);
  262. $origAmount = $weeeHelper->getOriginalAmount($_product);
  263. $attributes = $weeeHelper->getProductWeeeAttributes($_product, null, null, null, $weeeHelper->isTaxable());
  264. $amountInclTaxes = $weeeHelper->getAmountInclTaxes($attributes);
  265. $taxes = $amountInclTaxes - $amount;
  266. $options['oldPlusDisposition'] = $origAmount;
  267. $options['plusDisposition'] = $amount;
  268. $options['plusDispositionTax'] = ($taxes < 0) ? 0 : $taxes;
  269. // Exclude Weee amount from excluding tax amount
  270. if (!$weeeHelper->typeOfDisplay($_product, array(0, 1, 4))) {
  271. $options['exclDisposition'] = true;
  272. }
  273. $response->setAdditionalOptions($options);
  274. return $this;
  275. }
  276. /**
  277. * Process bundle options selection for prepare view json
  278. *
  279. * @param Varien_Event_Observer $observer
  280. * @return Mage_Weee_Model_Observer
  281. */
  282. public function updateBundleProductOptions(Varien_Event_Observer $observer)
  283. {
  284. /* @var $weeeHelper Mage_Weee_Helper_Data */
  285. $weeeHelper = Mage::helper('weee');
  286. if (!$weeeHelper->isEnabled()) {
  287. return $this;
  288. }
  289. $response = $observer->getEvent()->getResponseObject();
  290. $selection = $observer->getEvent()->getSelection();
  291. $options = $response->getAdditionalOptions();
  292. $_product = Mage::registry('current_product');
  293. $typeDynamic = Mage_Bundle_Block_Adminhtml_Catalog_Product_Edit_Tab_Attributes_Extend::DYNAMIC;
  294. if (!$_product || $_product->getPriceType() != $typeDynamic) {
  295. return $this;
  296. }
  297. $amount = $weeeHelper->getAmount($selection);
  298. $attributes = $weeeHelper->getProductWeeeAttributes($_product, null, null, null, $weeeHelper->isTaxable());
  299. $amountInclTaxes = $weeeHelper->getAmountInclTaxes($attributes);
  300. $taxes = $amountInclTaxes - $amount;
  301. $options['plusDisposition'] = $amount;
  302. $options['plusDispositionTax'] = ($taxes < 0) ? 0 : $taxes;
  303. // Exclude Weee amount from excluding tax amount
  304. if (!$weeeHelper->typeOfDisplay($_product, array(0, 1, 4))) {
  305. $options['exclDisposition'] = true;
  306. }
  307. $response->setAdditionalOptions($options);
  308. return $this;
  309. }
  310. }