If you want restrict coupon code for some associate simple products
Like for example if you have one configurable product and it associated 5 simple products(associate products). I created coupon code to apply only 3 simple product if i add separate simple products it work but when if add configurable it won't work.
if i add 5th product to cart it work .if i add configurable products it won't work.
Configurable product :: testconfig simple products :: 1,2,3,4,5.If you want use your coupon need to apply 4 and 5 product only. You need to change the below file.
Magento/Quote/Model/CouponManagement.php
override this file into your custom module using di.xml and change the below function
public function set($cartId, $couponCode)
Before adding customization look like below
public function set($cartId, $couponCode)
{
/** @var \Magento\Quote\Model\Quote $quote */
$quote = $this->quoteRepository->getActive($cartId);
if (!$quote->getItemsCount()) {
throw new NoSuchEntityException(__('The "%1" Cart doesn\'t contain products.', $cartId));
}
if (!$quote->getStoreId()) {
throw new NoSuchEntityException(__('Cart isn\'t assigned to correct store'));
}
$quote->getShippingAddress()->setCollectShippingRates(true);
try {
$quote->setCouponCode($couponCode);
$this->quoteRepository->save($quote->collectTotals());
} catch (\Exception $e) {
throw new CouldNotSaveException(
__("The coupon code couldn't be applied. Verify the coupon code and try again.")
);
}
if ($quote->getCouponCode() != $couponCode) {
throw new NoSuchEntityException(__("The coupon code isn't valid. Verify the code and try again."));
}
return true;
}
I did some changes like below
public function set($cartId, $couponCode)
{
$couponCode = trim($couponCode);
/** @var \Magento\Quote\Model\Quote $quote */
$quote = $this->quoteRepository->getActive($cartId);
if (!$quote->getItemsCount()) {
throw new NoSuchEntityException(__('Cart %1 doesn\'t contain products', $cartId));
}
$quote->getShippingAddress()->setCollectShippingRates(true);
$items = $quote->getAllItems();
$skuslist = array();
$customskulist = array("1","2","3","4","5");
foreach ($items as $item) {
if (!in_array($item->getSku(), $skuslist, true)) {
array_push($skuslist, $item->getSku());
}
}
$containsSearch = count(array_intersect($skuslist, $customskulist)) == count($skuslist);
$ruleId = $this->coupon->loadByCode($couponCode)->getRuleId();
if(strtoupper($couponCode) == "SAVE10" && $containsSearch == "" && $ruleId == 22){
throw new NoSuchEntityException(__('Coupon code is not valid 456'));
return FALSE;
}else{
try {
$quote->setCouponCode($couponCode);
$this->quoteRepository->save($quote->collectTotals());
} catch (\Exception $e) {
throw new CouldNotSaveException(__('Could not apply coupon code'));
}
}
if ($quote->getCouponCode() != $couponCode) {
throw new NoSuchEntityException(__('Coupon code is not valid123'));
}
return true;
}
Comments
Post a Comment