コード例 #1
1
 /**
  * @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);
 }
コード例 #2
0
ファイル: BuyXGetY.php プロジェクト: aiesh/magento2
 /**
  * @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;
 }
コード例 #3
0
ファイル: Coupon.php プロジェクト: Atlis/docker-magento2
 /**
  * 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();
 }
コード例 #4
0
ファイル: ByFixed.php プロジェクト: aiesh/magento2
 /**
  * @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;
 }
コード例 #5
0
 /**
  * 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;
 }
コード例 #6
0
ファイル: RuleTest.php プロジェクト: koliaGI/magento2
 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();
 }
コード例 #7
0
 /**
  * @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;
 }
コード例 #8
0
 /**
  * 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] : '']]]]]]];
 }
コード例 #9
0
ファイル: Data.php プロジェクト: ebizmarts/magento2-mandrill
 /**
  * @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();
 }
コード例 #10
0
 /**
  * @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;
 }
コード例 #11
0
ファイル: RuleTest.php プロジェクト: Doability/magento2dev
 public function testGetActionsFieldSetId()
 {
     $formName = 'form_name';
     $this->model->setId(100);
     $expectedResult = 'form_namerule_actions_fieldset_100';
     $this->assertEquals($expectedResult, $this->model->getActionsFieldSetId($formName));
 }
コード例 #12
0
 /**
  * {@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);
     }
 }
コード例 #13
0
 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);
 }
コード例 #14
0
 /**
  * @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;
 }
コード例 #15
0
 /**
  * @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;
 }
コード例 #16
0
 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());
 }
コード例 #17
0
ファイル: ToPercent.php プロジェクト: aiesh/magento2
 /**
  * @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;
 }
コード例 #18
0
 /**
  * {@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);
     }
 }
コード例 #19
0
 /**
  * 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;
 }
コード例 #20
0
ファイル: Coupon.php プロジェクト: shabbirvividads/magento2
 /**
  * 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;
 }
コード例 #21
0
 /**
  * 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;
 }
コード例 #22
0
ファイル: Rule.php プロジェクト: rafaelstz/magento2
 /**
  * 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;
 }
コード例 #23
0
 /**
  * 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;
 }
コード例 #24
0
ファイル: CartFixed.php プロジェクト: aiesh/magento2
 /**
  * @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;
 }
コード例 #25
0
ファイル: Utility.php プロジェクト: pradeep-wagento/magento2
 /**
  * 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;
 }
コード例 #26
0
ファイル: Rule.php プロジェクト: aiesh/magento2
 /**
  * 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;
 }