/** * @covers \Magento\SalesRule\Model\Rule\Action\Discount\CartFixed::calculate */ public function testCalculate() { $this->rule->setData(['id' => 1, 'discount_amount' => 10.0]); $this->address->expects($this->any())->method('getCartFixedRules')->will($this->returnValue([])); $store = $this->getMock('Magento\\Store\\Model\\Store', [], [], '', false); $this->priceCurrency->expects($this->atLeastOnce())->method('convert')->will($this->returnArgument(0)); $this->priceCurrency->expects($this->atLeastOnce())->method('round')->will($this->returnArgument(0)); $this->quote->expects($this->any())->method('getStore')->will($this->returnValue($store)); /** validators data */ $this->validator->expects($this->once())->method('getItemPrice')->with($this->item)->will($this->returnValue(100)); $this->validator->expects($this->once())->method('getItemBasePrice')->with($this->item)->will($this->returnValue(100)); $this->validator->expects($this->once())->method('getItemOriginalPrice')->with($this->item)->will($this->returnValue(100)); $this->validator->expects($this->once())->method('getItemBaseOriginalPrice')->with($this->item)->will($this->returnValue(100)); $this->address->expects($this->once())->method('setCartFixedRules')->with([1 => 0.0]); $this->model->calculate($this->rule, $this->item, 1); $this->assertEquals($this->data->getAmount(), 10); $this->assertEquals($this->data->getBaseAmount(), 10); $this->assertEquals($this->data->getOriginalAmount(), 10); $this->assertEquals($this->data->getBaseOriginalAmount(), 100); }
/** * @param \Magento\SalesRule\Model\Rule $rule * @param \Magento\Sales\Model\Quote\Item\AbstractItem $item * @param float $qty * @return \Magento\SalesRule\Model\Rule\Action\Discount\Data */ public function calculate($rule, $item, $qty) { /** @var \Magento\SalesRule\Model\Rule\Action\Discount\Data $discountData */ $discountData = $this->discountFactory->create(); $itemPrice = $this->validator->getItemPrice($item); $baseItemPrice = $this->validator->getItemBasePrice($item); $itemOriginalPrice = $this->validator->getItemOriginalPrice($item); $baseItemOriginalPrice = $this->validator->getItemBaseOriginalPrice($item); $x = $rule->getDiscountStep(); $y = $rule->getDiscountAmount(); if (!$x || $y > $x) { return $discountData; } $buyAndDiscountQty = $x + $y; $fullRuleQtyPeriod = floor($qty / $buyAndDiscountQty); $freeQty = $qty - $fullRuleQtyPeriod * $buyAndDiscountQty; $discountQty = $fullRuleQtyPeriod * $y; if ($freeQty > $x) { $discountQty += $freeQty - $x; } $discountData->setAmount($discountQty * $itemPrice); $discountData->setBaseAmount($discountQty * $baseItemPrice); $discountData->setOriginalAmount($discountQty * $itemOriginalPrice); $discountData->setBaseOriginalAmount($discountQty * $baseItemOriginalPrice); return $discountData; }
/** * Processing object before save data * * @return $this */ protected function _beforeSave() { if (!$this->getRuleId() && $this->_rule instanceof \Magento\SalesRule\Model\Rule) { $this->setRuleId($this->_rule->getId()); } return parent::_beforeSave(); }
/** * @param float $qty * @param \Magento\SalesRule\Model\Rule $rule * @return float */ public function fixQuantity($qty, $rule) { $step = $rule->getDiscountStep(); if ($step) { $qty = floor($qty / $step) * $step; } return $qty; }
/** * Add rule to filter * * @param Rule|int $rule * @return $this */ public function addRuleToFilter($rule) { if ($rule instanceof Rule) { $ruleId = $rule->getId(); } else { $ruleId = (int) $rule; } $this->addFieldToFilter('rule_id', $ruleId); return $this; }
public function testBeforeSaveResetConditionToNull() { $conditionMock = $this->setupConditionMock(); //Make sure that we reset _condition in beforeSave method $this->conditionCombineFactoryMock->expects($this->exactly(2))->method('create')->willReturn($conditionMock); $prodConditionMock = $this->setupProdConditionMock(); $this->condProdCombineFactoryMock->expects($this->exactly(2))->method('create')->willReturn($prodConditionMock); $this->model->beforeSave(); $this->model->getConditions(); $this->model->getActions(); }
/** * @param RuleDataModel $dataModel * @param \Magento\SalesRule\Model\Rule $ruleModel * @return $this */ protected function mapActionConditions(RuleDataModel $dataModel, \Magento\SalesRule\Model\Rule $ruleModel) { $actionConditionSerialized = $ruleModel->getActionsSerialized(); if ($actionConditionSerialized) { $actionConditionArray = unserialize($actionConditionSerialized); $actionConditionDataModel = $this->arrayToConditionDataModel($actionConditionArray); $dataModel->setActionCondition($actionConditionDataModel); } else { $dataModel->setActionCondition(null); } return $this; }
/** * Get metadata for sales rule form. It will be merged with form UI component declaration. * * @param Rule $rule * @return array * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function getMetadataValues(\Magento\SalesRule\Model\Rule $rule) { $customerGroups = $this->groupRepository->getList($this->searchCriteriaBuilder->create())->getItems(); $applyOptions = [['label' => __('Percent of product price discount'), 'value' => Rule::BY_PERCENT_ACTION], ['label' => __('Fixed amount discount'), 'value' => Rule::BY_FIXED_ACTION], ['label' => __('Fixed amount discount for whole cart'), 'value' => Rule::CART_FIXED_ACTION], ['label' => __('Buy X get Y free (discount amount is Y)'), 'value' => Rule::BUY_X_GET_Y_ACTION]]; $couponTypesOptions = []; $couponTypes = $this->salesRuleFactory->create()->getCouponTypes(); foreach ($couponTypes as $key => $couponType) { $couponTypesOptions[] = ['label' => $couponType, 'value' => $key]; } $labels = $rule->getStoreLabels(); return ['rule_information' => ['children' => ['website_ids' => ['arguments' => ['data' => ['config' => ['options' => $this->store->getWebsiteValuesForForm()]]]], 'is_active' => ['arguments' => ['data' => ['config' => ['options' => [['label' => __('Active'), 'value' => '1'], ['label' => __('Inactive'), 'value' => '0']]]]]], 'customer_group_ids' => ['arguments' => ['data' => ['config' => ['options' => $this->objectConverter->toOptionArray($customerGroups, 'id', 'code')]]]], 'coupon_type' => ['arguments' => ['data' => ['config' => ['options' => $couponTypesOptions]]]], 'is_rss' => ['arguments' => ['data' => ['config' => ['options' => [['label' => __('Yes'), 'value' => '1'], ['label' => __('No'), 'value' => '0']]]]]]]], 'actions' => ['children' => ['simple_action' => ['arguments' => ['data' => ['config' => ['options' => $applyOptions]]]], 'discount_amount' => ['arguments' => ['data' => ['config' => ['value' => '0']]]], 'discount_qty' => ['arguments' => ['data' => ['config' => ['value' => '0']]]], 'apply_to_shipping' => ['arguments' => ['data' => ['config' => ['options' => [['label' => __('Yes'), 'value' => '1'], ['label' => __('No'), 'value' => '0']]]]]], 'stop_rules_processing' => ['arguments' => ['data' => ['config' => ['options' => [['label' => __('Yes'), 'value' => '1'], ['label' => __('No'), 'value' => '0']]]]]]]], 'labels' => ['children' => ['store_labels[0]' => ['arguments' => ['data' => ['config' => ['value' => isset($labels[0]) ? $labels[0] : '']]]]]]]; }
/** * @param $mailType * @param $mail * @param $name * @param $couponCode * @param $storeId */ public function saveMail($mailType, $mail, $name, $couponCode, $storeId) { if ($couponCode != '') { $coupon = $this->_coupon->loadByCode($couponCode); $rule = $this->_rule->load($coupon->getRuleId()); $couponAmount = $rule->getDiscountAmount(); switch ($rule->getSimpleAction()) { case 'cart_fixed': $couponType = 1; break; case 'by_percent': $couponType = 2; break; default: $couponType = 0; break; } } else { $couponType = 0; $couponAmount = 0; } $sent = $this->_mailsent; $date = $this->_dateTime; $sent->setMailType($mailType)->setStoreId($storeId)->setCustomerEmail($mail)->setCustomerName($name)->setCouponNumber($couponCode)->setCouponType($couponType)->setCouponAmount($couponAmount)->setSentAt($date->gmtDate())->save(); }
/** * @param \Magento\SalesRule\Model\Rule $rule * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item * @param float $qty * @return \Magento\SalesRule\Model\Rule\Action\Discount\Data */ public function calculate($rule, $item, $qty) { /** @var \Magento\SalesRule\Model\Rule\Action\Discount\Data $discountData */ $discountData = $this->discountFactory->create(); $store = $item->getQuote()->getStore(); $itemPrice = $this->validator->getItemPrice($item); $baseItemPrice = $this->validator->getItemBasePrice($item); $itemOriginalPrice = $this->validator->getItemOriginalPrice($item); $baseItemOriginalPrice = $this->validator->getItemBaseOriginalPrice($item); $quoteAmount = $this->priceCurrency->convert($rule->getDiscountAmount(), $store); $discountData->setAmount($qty * ($itemPrice - $quoteAmount)); $discountData->setBaseAmount($qty * ($baseItemPrice - $rule->getDiscountAmount())); $discountData->setOriginalAmount($qty * ($itemOriginalPrice - $quoteAmount)); $discountData->setBaseOriginalAmount($qty * ($baseItemOriginalPrice - $rule->getDiscountAmount())); return $discountData; }
public function testGetActionsFieldSetId() { $formName = 'form_name'; $this->model->setId(100); $expectedResult = 'form_namerule_actions_fieldset_100'; $this->assertEquals($expectedResult, $this->model->getActionsFieldSetId($formName)); }
/** * {@inheritdoc} */ public function loadRelations() { $pluginInfo = $this->pluginList->getNext($this->subjectType, 'loadRelations'); if (!$pluginInfo) { return parent::loadRelations(); } else { return $this->___callPlugins('loadRelations', func_get_args(), $pluginInfo); } }
public function testToDataModel() { $array = ['rule_id' => '1', 'name' => 'testrule', 'is_active' => '1', 'conditions_serialized' => 'a:7:{s:4:"type";s:46:"Magento\\SalesRule\\Model\\Rule\\Condition\\Combine";s:9:"attribute";N;' . 's:8:"operator";N;s:5:"value";s:1:"1";s:18:"is_value_processed";N;s:10:"aggregator";s:3:"all";' . 's:10:"conditions";a:1:{i:0;a:5:{s:4:"type";s:46:"Magento\\SalesRule\\Model\\Rule\\Condition\\Address";' . 's:9:"attribute";s:13:"base_subtotal";s:8:"operator";s:2:">=";s:5:"value";s:3:"100";' . 's:18:"is_value_processed";b:0;}}}', 'actions_serialized' => 'a:7:{s:4:"type";s:54:"Magento\\SalesRule\\Model\\Rule\\Condition\\Product\\Combine";s:9:"attribute";N;' . 's:8:"operator";N;s:5:"value";s:1:"1";s:18:"is_value_processed";N;s:10:"aggregator";s:3:"all";' . 's:10:"conditions";a:1:{i:0;a:5:{s:4:"type";s:46:"Magento\\SalesRule\\Model\\Rule\\Condition\\Product";' . 's:9:"attribute";s:16:"attribute_set_id";s:8:"operator";s:2:"==";s:5:"value";s:1:"4";' . 's:18:"is_value_processed";b:0;}}}', 'coupon_type' => '1', 'coupon_code' => '', 'store_labels' => [0 => 'TestRule', 1 => 'TestRuleForDefaultStore']]; $dataModel = $this->getMockBuilder('\\Magento\\SalesRule\\Model\\Data\\Rule')->disableOriginalConstructor()->setMethods(['create', 'getStoreLabels', 'setStoreLabels', 'getCouponType', 'setCouponType'])->getMock(); $dataLabel = $this->getMockBuilder('\\Magento\\SalesRule\\Api\\Data\\RuleLabel')->setMethods(['setStoreId', 'setStoreLabel', 'setStoreLabels'])->disableOriginalConstructor()->getMock(); $dataCondition = $this->getMockBuilder('\\Magento\\SalesRule\\Model\\Data\\Condition')->setMethods(['setData'])->disableOriginalConstructor()->getMock(); $this->ruleLabelFactory->expects($this->any())->method('create')->willReturn($dataLabel); $this->conditionDataFactory->expects($this->any())->method('create')->willReturn($dataCondition); $this->ruleDataFactory->expects($this->any())->method('create')->willReturn($dataModel); $this->salesRule->expects($this->any())->method('getData')->willReturn($array); $this->salesRule->expects($this->once())->method('getConditionsSerialized')->willReturn($array['conditions_serialized']); $dataModel->expects($this->atLeastOnce())->method('getStoreLabels')->willReturn($array['store_labels']); $dataModel->expects($this->atLeastOnce())->method('setStoreLabels'); $dataModel->expects($this->atLeastOnce())->method('getCouponType')->willReturn(\Magento\SalesRule\Model\Rule::COUPON_TYPE_NO_COUPON); $dataModel->expects($this->atLeastOnce())->method('setCouponType'); $return = $this->model->toDataModel($this->salesRule); $this->assertSame($dataModel, $return); }
/** * @param \Magento\SalesRule\Model\Rule $rule * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item * @param float $qty * @param float $rulePercent * @return Data */ protected function _calculate($rule, $item, $qty, $rulePercent) { /** @var \Magento\SalesRule\Model\Rule\Action\Discount\Data $discountData */ $discountData = $this->discountFactory->create(); $itemPrice = $this->validator->getItemPrice($item); $baseItemPrice = $this->validator->getItemBasePrice($item); $itemOriginalPrice = $this->validator->getItemOriginalPrice($item); $baseItemOriginalPrice = $this->validator->getItemBaseOriginalPrice($item); $_rulePct = $rulePercent / 100; $discountData->setAmount(($qty * $itemPrice - $item->getDiscountAmount()) * $_rulePct); $discountData->setBaseAmount(($qty * $baseItemPrice - $item->getBaseDiscountAmount()) * $_rulePct); $discountData->setOriginalAmount(($qty * $itemOriginalPrice - $item->getDiscountAmount()) * $_rulePct); $discountData->setBaseOriginalAmount(($qty * $baseItemOriginalPrice - $item->getBaseDiscountAmount()) * $_rulePct); if (!$rule->getDiscountQty() || $rule->getDiscountQty() > $qty) { $discountPercent = min(100, $item->getDiscountPercent() + $rulePercent); $item->setDiscountPercent($discountPercent); } return $discountData; }
/** * @param Rule $ruleModel * @return $this */ protected function mapCouponType(Rule $ruleModel) { if ($ruleModel->getCouponType()) { $mappedValue = ''; switch ($ruleModel->getCouponType()) { case RuleInterface::COUPON_TYPE_NO_COUPON: $mappedValue = \Magento\SalesRule\Model\Rule::COUPON_TYPE_NO_COUPON; break; case RuleInterface::COUPON_TYPE_SPECIFIC_COUPON: $mappedValue = \Magento\SalesRule\Model\Rule::COUPON_TYPE_SPECIFIC; break; case RuleInterface::COUPON_TYPE_AUTO: $mappedValue = \Magento\SalesRule\Model\Rule::COUPON_TYPE_AUTO; break; default: } $ruleModel->setCouponType($mappedValue); } return $this; }
public function testLoadCouponCode() { $this->coupon->expects($this->once())->method('loadPrimaryByRule')->with(1); $this->coupon->expects($this->once())->method('setRule')->with($this->model)->willReturnSelf(); $this->coupon->expects($this->once())->method('setIsPrimary')->with(true)->willReturnSelf(); $this->coupon->expects($this->once())->method('getCode')->willReturn('test_code'); $this->coupon->expects($this->once())->method('getUsageLimit')->willReturn(1); $this->model->setId(1); $this->model->setUsesPerCoupon(null); $this->model->setUseAutoGeneration(false); $this->model->loadCouponCode(); $this->assertEquals(1, $this->model->getUsesPerCoupon()); }
/** * @param \Magento\SalesRule\Model\Rule $rule * @param \Magento\Sales\Model\Quote\Item\AbstractItem $item * @param float $qty * @return Data */ public function calculate($rule, $item, $qty) { $rulePercent = max(0, 100 - $rule->getDiscountAmount()); $discountData = $this->_calculate($rule, $item, $qty, $rulePercent); return $discountData; }
/** * {@inheritdoc} */ public function offsetGet($offset) { $pluginInfo = $this->pluginList->getNext($this->subjectType, 'offsetGet'); if (!$pluginInfo) { return parent::offsetGet($offset); } else { return $this->___callPlugins('offsetGet', func_get_args(), $pluginInfo); } }
/** * Update auto generated Specific Coupon if it's rule changed * * @param \Magento\SalesRule\Model\Rule $rule * @return $this */ public function updateSpecificCoupons(\Magento\SalesRule\Model\Rule $rule) { if (!$rule || !$rule->getId() || !$rule->hasDataChanges()) { return $this; } $updateArray = []; if ($rule->dataHasChangedFor('uses_per_coupon')) { $updateArray['usage_limit'] = $rule->getUsesPerCoupon(); } if ($rule->dataHasChangedFor('uses_per_customer')) { $updateArray['usage_per_customer'] = $rule->getUsesPerCustomer(); } $ruleNewDate = $this->dateTime->formatDate($rule->getToDate()); $ruleOldDate = $this->dateTime->formatDate($rule->getOrigData('to_date')); if ($ruleNewDate != $ruleOldDate) { $updateArray['expiration_date'] = $rule->getToDate(); } if (!empty($updateArray)) { $this->getConnection()->update($this->getTable('salesrule_coupon'), $updateArray, ['rule_id = ?' => $rule->getId(), 'generated_by_dotmailer is null']); } //update coupons generated by dotmailer. not to change expiration date $dotmailerUpdateArray = $updateArray; unset($dotmailerUpdateArray['expiration_date']); if (!empty($dotmailerUpdateArray)) { $this->getConnection()->update($this->getTable('salesrule_coupon'), $dotmailerUpdateArray, ['rule_id = ?' => $rule->getId(), 'generated_by_dotmailer is 1']); } return $this; }
/** * Set rule instance * * @param \Magento\SalesRule\Model\Rule $rule * @return $this */ public function setRule(\Magento\SalesRule\Model\Rule $rule) { $this->setRuleId($rule->getId()); return $this; }
/** * Set coupon code to address if $rule contains validated coupon * * @param Address $address * @param \Magento\SalesRule\Model\Rule $rule * @param mixed $couponCode * @return $this */ public function maintainAddressCouponCode($address, $rule, $couponCode) { /* Rule is a part of rules collection, which includes only rules with 'No Coupon' type or with validated coupon. As a result, if rule uses coupon code(s) ('Specific' or 'Auto' Coupon Type), it always contains validated coupon */ if ($rule->getCouponType() != \Magento\SalesRule\Model\Rule::COUPON_TYPE_NO_COUPON) { $address->setCouponCode($couponCode); } return $this; }
/** * Save product attributes currently used in conditions and actions of rule * * @param \Magento\SalesRule\Model\Rule $rule * @param mixed $attributes * @return $this */ public function setActualProductAttributes($rule, $attributes) { $connection = $this->getConnection(); $connection->delete($this->getTable('salesrule_product_attribute'), ['rule_id=?' => $rule->getId()]); //Getting attribute IDs for attribute codes $attributeIds = []; $select = $this->getConnection()->select()->from(['a' => $this->getTable('eav_attribute')], ['a.attribute_id'])->where('a.attribute_code IN (?)', [$attributes]); $attributesFound = $this->getConnection()->fetchAll($select); if ($attributesFound) { foreach ($attributesFound as $attribute) { $attributeIds[] = $attribute['attribute_id']; } $data = []; foreach ($rule->getCustomerGroupIds() as $customerGroupId) { foreach ($rule->getWebsiteIds() as $websiteId) { foreach ($attributeIds as $attribute) { $data[] = ['rule_id' => $rule->getId(), 'website_id' => $websiteId, 'customer_group_id' => $customerGroupId, 'attribute_id' => $attribute]; } } } $connection->insertMultiple($this->getTable('salesrule_product_attribute'), $data); } return $this; }
/** * Update auto generated Specific Coupon if it's rule changed * * @param \Magento\SalesRule\Model\Rule $rule * @return $this */ public function updateSpecificCoupons(\Magento\SalesRule\Model\Rule $rule) { if (!$rule || !$rule->getId() || !$rule->hasDataChanges()) { return $this; } $updateArray = []; 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 \DateTime($rule->getToDate()); $ruleOldDate = new \DateTime($rule->getOrigData('to_date')); if ($ruleNewDate != $ruleOldDate) { $updateArray['expiration_date'] = $rule->getToDate(); } if (!empty($updateArray)) { $this->getConnection()->update($this->getTable('salesrule_coupon'), $updateArray, ['rule_id = ?' => $rule->getId()]); } return $this; }
/** * @param \Magento\SalesRule\Model\Rule $rule * @param \Magento\Sales\Model\Quote\Item\AbstractItem $item * @param float $qty * @return \Magento\SalesRule\Model\Rule\Action\Discount\Data */ public function calculate($rule, $item, $qty) { /** @var \Magento\SalesRule\Model\Rule\Action\Discount\Data $discountData */ $discountData = $this->discountFactory->create(); $ruleTotals = $this->validator->getRuleItemTotalsInfo($rule->getId()); $quote = $item->getQuote(); $address = $item->getAddress(); $itemPrice = $this->validator->getItemPrice($item); $baseItemPrice = $this->validator->getItemBasePrice($item); $itemOriginalPrice = $this->validator->getItemOriginalPrice($item); $baseItemOriginalPrice = $this->validator->getItemBaseOriginalPrice($item); /** * prevent applying whole cart discount for every shipping order, but only for first order */ if ($quote->getIsMultiShipping()) { $usedForAddressId = $this->getCartFixedRuleUsedForAddress($rule->getId()); if ($usedForAddressId && $usedForAddressId != $address->getId()) { return $discountData; } else { $this->setCartFixedRuleUsedForAddress($rule->getId(), $address->getId()); } } $cartRules = $address->getCartFixedRules(); if (!isset($cartRules[$rule->getId()])) { $cartRules[$rule->getId()] = $rule->getDiscountAmount(); } if ($cartRules[$rule->getId()] > 0) { $store = $quote->getStore(); if ($ruleTotals['items_count'] <= 1) { $quoteAmount = $store->convertPrice($cartRules[$rule->getId()]); $baseDiscountAmount = min($baseItemPrice * $qty, $cartRules[$rule->getId()]); } else { $discountRate = $baseItemPrice * $qty / $ruleTotals['base_items_price']; $maximumItemDiscount = $rule->getDiscountAmount() * $discountRate; $quoteAmount = $store->convertPrice($maximumItemDiscount); $baseDiscountAmount = min($baseItemPrice * $qty, $maximumItemDiscount); $this->validator->decrementRuleItemTotalsCount($rule->getId()); } $baseDiscountAmount = $store->roundPrice($baseDiscountAmount); $cartRules[$rule->getId()] -= $baseDiscountAmount; $discountData->setAmount($store->roundPrice(min($itemPrice * $qty, $quoteAmount))); $discountData->setBaseAmount($baseDiscountAmount); $discountData->setOriginalAmount(min($itemOriginalPrice * $qty, $quoteAmount)); $discountData->setBaseOriginalAmount($store->roundPrice($baseItemOriginalPrice)); } $address->setCartFixedRules($cartRules); return $discountData; }
/** * Return discount item qty * * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item * @param \Magento\SalesRule\Model\Rule $rule * @return int */ public function getItemQty($item, $rule) { $qty = $item->getTotalQty(); $discountQty = $rule->getDiscountQty(); return $discountQty ? min($qty, $discountQty) : $qty; }
/** * Save product attributes currently used in conditions and actions of rule * * @param \Magento\SalesRule\Model\Rule $rule * @param mixed $attributes * @return $this */ public function setActualProductAttributes($rule, $attributes) { $write = $this->_getWriteAdapter(); $write->delete($this->getTable('salesrule_product_attribute'), array('rule_id=?' => $rule->getId())); //Getting attribute IDs for attribute codes $attributeIds = array(); $select = $this->_getReadAdapter()->select()->from(array('a' => $this->getTable('eav_attribute')), array('a.attribute_id'))->where('a.attribute_code IN (?)', array($attributes)); $attributesFound = $this->_getReadAdapter()->fetchAll($select); if ($attributesFound) { foreach ($attributesFound as $attribute) { $attributeIds[] = $attribute['attribute_id']; } $data = array(); foreach ($rule->getCustomerGroupIds() as $customerGroupId) { foreach ($rule->getWebsiteIds() as $websiteId) { foreach ($attributeIds as $attribute) { $data[] = array('rule_id' => $rule->getId(), 'website_id' => $websiteId, 'customer_group_id' => $customerGroupId, 'attribute_id' => $attribute); } } } $write->insertMultiple($this->getTable('salesrule_product_attribute'), $data); } return $this; }