*/ class Mage_SalesRule_Model_Observer { /** * Sales Rule Validator * * @var Mage_SalesRule_Model_Validator */ protected $_validator; /** * Get quote item validator/processor object * * @deprecated * @param Varien_Event $event * @return Mage_SalesRule_Model_Validator */ public function getValidator($event) { if (!$this->_validator) { $this->_validator = Mage::getModel('salesrule/validator') ->init($event->getWebsiteId(), $event->getCustomerGroupId(), $event->getCouponCode()); } return $this->_validator; } /** * Process quote item (apply discount to item) * * @deprecated process call movet to total model * @param Varien_Event_Observer $observer */ public function sales_quote_address_discount_item($observer) { $this->getValidator($observer->getEvent()) ->process($observer->getEvent()->getItem()); } /** * Registered callback: called after an order is placed * * @param Varien_Event_Observer $observer */ public function sales_order_afterPlace($observer) { $order = $observer->getEvent()->getOrder(); if (!$order) { return $this; } // lookup rule ids $ruleIds = explode(',', $order->getAppliedRuleIds()); $ruleIds = array_unique($ruleIds); $ruleCustomer = null; $customerId = $order->getCustomerId(); // use each rule (and apply to customer, if applicable) if ($order->getDiscountAmount() != 0) { foreach ($ruleIds as $ruleId) { if (!$ruleId) { continue; } $rule = Mage::getModel('salesrule/rule'); $rule->load($ruleId); if ($rule->getId()) { $rule->setTimesUsed($rule->getTimesUsed() + 1); $rule->save(); if ($customerId) { $ruleCustomer = Mage::getModel('salesrule/rule_customer'); $ruleCustomer->loadByCustomerRule($customerId, $ruleId); if ($ruleCustomer->getId()) { $ruleCustomer->setTimesUsed($ruleCustomer->getTimesUsed() + 1); } else { $ruleCustomer ->setCustomerId($customerId) ->setRuleId($ruleId) ->setTimesUsed(1); } $ruleCustomer->save(); } } } $coupon = Mage::getModel('salesrule/coupon'); /** @var Mage_SalesRule_Model_Coupon */ $coupon->load($order->getCouponCode(), 'code'); if ($coupon->getId()) { $coupon->setTimesUsed($coupon->getTimesUsed() + 1); $coupon->save(); if ($customerId) { $couponUsage = Mage::getResourceModel('salesrule/coupon_usage'); $couponUsage->updateCustomerCouponTimesUsed($customerId, $coupon->getId()); } } } } /** * Refresh sales coupons report statistics for last day * * @param Mage_Cron_Model_Schedule $schedule * @return Mage_SalesRule_Model_Observer */ public function aggregateSalesReportCouponsData($schedule) { Mage::app()->getLocale()->emulate(0); $currentDate = Mage::app()->getLocale()->date(); $date = $currentDate->subHour(25); Mage::getResourceModel('salesrule/report_rule')->aggregate($date); Mage::app()->getLocale()->revert(); return $this; } /** * Check rules that contains affected attribute * If rules were found they will be set to inactive and notice will be add to admin session * * @param string $attributeCode * @return Mage_SalesRule_Model_Observer */ protected function _checkSalesRulesAvailability($attributeCode) { /* @var $collection Mage_SalesRule_Model_Mysql4_Rule_Collection */ $collection = Mage::getResourceModel('salesrule/rule_collection') ->addAttributeInConditionFilter($attributeCode); $disabledRulesCount = 0; foreach ($collection as $rule) { /* @var $rule Mage_SalesRule_Model_Rule */ $rule->setIsActive(0); /* @var $rule->getConditions() Mage_SalesRule_Model_Rule_Condition_Combine */ $this->_removeAttributeFromConditions($rule->getConditions(), $attributeCode); $this->_removeAttributeFromConditions($rule->getActions(), $attributeCode); $rule->save(); $disabledRulesCount++; } if ($disabledRulesCount) { Mage::getSingleton('adminhtml/session')->addWarning( Mage::helper('salesrule')->__('%d Shopping Cart Price Rules based on "%s" attribute have been disabled.', $disabledRulesCount, $attributeCode)); } return $this; } /** * Remove catalog attribute condition by attribute code from rule conditions * * @param Mage_Rule_Model_Condition_Combine $combine * @param string $attributeCode */ protected function _removeAttributeFromConditions($combine, $attributeCode) { $conditions = $combine->getConditions(); foreach ($conditions as $conditionId => $condition) { if ($condition instanceof Mage_Rule_Model_Condition_Combine) { $this->_removeAttributeFromConditions($condition, $attributeCode); } if ($condition instanceof Mage_SalesRule_Model_Rule_Condition_Product) { if ($condition->getAttribute() == $attributeCode) { unset($conditions[$conditionId]); } } } $combine->setConditions($conditions); } /** * After save attribute if it is not used for promo rules already check rules for containing this attribute * * @param Varien_Event_Observer $observer * @return Mage_SalesRule_Model_Observer */ public function catalogAttributeSaveAfter(Varien_Event_Observer $observer) { $attribute = $observer->getEvent()->getAttribute(); if ($attribute->dataHasChangedFor('is_used_for_promo_rules') && !$attribute->getIsUsedForPromoRules()) { $this->_checkSalesRulesAvailability($attribute->getAttributeCode()); } return $this; } /** * After delete attribute check rules that contains deleted attribute * If rules was found they will seted to inactive and added notice to admin session * * @param Varien_Event_Observer $observer * @return Mage_SalesRule_Model_Observer */ public function catalogAttributeDeleteAfter(Varien_Event_Observer $observer) { $attribute = $observer->getEvent()->getAttribute(); if ($attribute->getIsUsedForPromoRules()) { $this->_checkSalesRulesAvailability($attribute->getAttributeCode()); } return $this; } /** * Append sales rule product attributes to select by quote item collection * * @param Varien_Event_Observer $observer * @return Mage_SalesRule_Model_Observer */ public function addProductAttributes(Varien_Event_Observer $observer) { // @var Varien_Object $attributesTransfer = $observer->getEvent()->getAttributes(); $attributes = Mage::getResourceModel('salesrule/rule') ->getActiveAttributes( Mage::app()->getWebsite()->getId(), Mage::getSingleton('customer/session')->getCustomer()->getGroupId() ); $result = array(); foreach ($attributes as $attribute) { $result[$attribute['attribute_code']] = true; } $attributesTransfer->addData($result); return $this; } /** * Add coupon's rule name to order data * * @param Varien_Event_Observer $observer * @return Mage_SalesRule_Model_Observer */ public function addSalesRuleNameToOrder($observer) { $order = $observer->getOrder(); $couponCode = $order->getCouponCode(); if (empty($couponCode)) { return $this; } /** * @var Mage_SalesRule_Model_Coupon $couponModel */ $couponModel = Mage::getModel('salesrule/coupon'); $couponModel->loadByCode($couponCode); $ruleId = $couponModel->getRuleId(); if (empty($ruleId)) { return $this; } /** * @var Mage_SalesRule_Model_Rule $ruleModel */ $ruleModel = Mage::getModel('salesrule/rule'); $ruleModel->load($ruleId); $order->setCouponRuleName($ruleModel->getName()); return $this; } }