public function updateRuleProductData(Mage_SalesRule_Model_Rule $rule) { // foreach ($rule->getActions()->getActions() as $action) { // break; // } $ruleId = $rule->getId(); $read = $this->_getReadAdapter(); $write = $this->_getWriteAdapter(); $write->delete($this->getTable('salesrule/rule_product'), $write->quoteInto('rule_id=?', $ruleId)); if (!$rule->getIsActive()) { return $this; } if ($rule->getUsesPerCoupon() > 0) { $usedPerCoupon = $read->fetchOne('select count(*) from ' . $this->getTable('salesrule/rule_customer') . ' where rule_id=?', $ruleId); if ($usedPerCoupon >= $rule->getUsesPerCoupon()) { return $this; } } $productIds = explode(',', $rule->getProductIds()); $websiteIds = explode(',', $rule->getWebsiteIds()); $customerGroupIds = explode(',', $rule->getCustomerGroupIds()); $fromTime = strtotime($rule->getFromDate()); $toTime = strtotime($rule->getToDate()); if ($toTime) { $toTime += 86400; } $couponCode = $rule->getCouponCode() ? "'" . $rule->getCouponCode() . "'" : 'NULL'; $sortOrder = (int) $rule->getSortOrder(); $rows = array(); $header = 'replace into ' . $this->getTable('salesrule/rule_product') . ' (rule_id, from_time, to_time, website_id, customer_group_id, product_id, coupon_code, sort_order) values '; try { $write->beginTransaction(); foreach ($productIds as $productId) { foreach ($websiteIds as $websiteId) { foreach ($customerGroupIds as $customerGroupId) { $rows[] = "('{$ruleId}', '{$fromTime}', '{$toTime}', '{$websiteId}', '{$customerGroupId}', '{$productId}', {$couponCode}, '{$sortOrder}')"; if (sizeof($rows) == 100) { $sql = $header . join(',', $rows); $write->query($sql); $rows = array(); } } } } if (!empty($rows)) { $sql = $header . join(',', $rows); $write->query($sql); } $write->commit(); } catch (Exception $e) { $write->rollback(); throw $e; } return $this; }
/** * Update auto generated Specific Coupon if it's rule changed * * @param Mage_SalesRule_Model_Rule $rule * @return Mage_SalesRule_Model_Resource_Coupon */ public function updateSpecificCoupons(Mage_SalesRule_Model_Rule $rule) { if (!$rule || !$rule->getId() || !$rule->hasDataChanges()) { return $this; } $updateArray = array(); if ($rule->dataHasChangedFor('uses_per_coupon')) { $updateArray['usage_limit'] = $rule->getUsesPerCoupon(); } if ($rule->dataHasChangedFor('uses_per_customer')) { $updateArray['usage_per_customer'] = $rule->getUsesPerCustomer(); } $ruleNewDate = new Zend_Date($rule->getToDate()); $ruleOldDate = new Zend_Date($rule->getOrigData('to_date')); if ($ruleNewDate->compare($ruleOldDate)) { $updateArray['expiration_date'] = $rule->getToDate(); } if (!empty($updateArray)) { $this->_getWriteAdapter()->update($this->getTable('salesrule/coupon'), $updateArray, array('rule_id = ?' => $rule->getId(), 'generated_by_dotmailer is null')); } //update coupons added by dotmailer. not to change expiration date $dotmailerUpdateArray = $updateArray; unset($dotmailerUpdateArray['expiration_date']); if (!empty($dotmailerUpdateArray)) { $this->_getWriteAdapter()->update($this->getTable('salesrule/coupon'), $dotmailerUpdateArray, array('rule_id = ?' => $rule->getId(), 'generated_by_dotmailer is 1')); } return $this; }
/** * Update auto generated Specific Coupon if it's rule changed * * @param Mage_SalesRule_Model_Rule $rule * @return Mage_SalesRule_Model_Resource_Coupon */ public function updateSpecificCoupons(Mage_SalesRule_Model_Rule $rule) { if (!$rule || !$rule->getId() || !$rule->hasDataChanges()) { return $this; } $updateArray = array(); if ($rule->dataHasChangedFor('uses_per_coupon')) { $updateArray['usage_limit'] = $rule->getUsesPerCoupon(); } if ($rule->dataHasChangedFor('uses_per_customer')) { $updateArray['usage_per_customer'] = $rule->getUsesPerCustomer(); } $ruleNewDate = new Zend_Date($rule->getToDate()); $ruleOldDate = new Zend_Date($rule->getOrigData('to_date')); if ($ruleNewDate->compare($ruleOldDate)) { $updateArray['expiration_date'] = $rule->getToDate(); } if (!empty($updateArray)) { $this->_getWriteAdapter()->update($this->getTable('salesrule_coupon'), $updateArray, array('rule_id = ?' => $rule->getId())); } return $this; }
/** * Check if rule can be applied for specific address/quote/customer * * @param Mage_SalesRule_Model_Rule $rule * @param Mage_Sales_Model_Quote_Address $address * @return bool */ protected function _canProcessRule($rule, $address) { if (!$rule->hasIsValid()) { /** * too many times used in general */ if ($rule->getUsesPerCoupon() && $rule->getTimesUsed() >= $rule->getUsesPerCoupon()) { $rule->setIsValid(false); return false; } /** * too many times used for this customer */ $ruleId = $rule->getId(); if ($ruleId && $rule->getUsesPerCustomer()) { $customerId = $address->getQuote()->getCustomerId(); $ruleCustomer = Mage::getModel('salesrule/rule_customer'); $ruleCustomer->loadByCustomerRule($customerId, $ruleId); if ($ruleCustomer->getId()) { if ($ruleCustomer->getTimesUsed() >= $rule->getUsesPerCustomer()) { $rule->setIsValid(false); return false; } } } $rule->afterLoad(); /** * quote does not meet rule's conditions */ if (!$rule->validate($address)) { $rule->setIsValid(false); return false; } /** * passed all validations, remember to be valid */ $rule->setIsValid(true); } return $rule->getIsValid(); }