Skip to content

[BUG] Coupon usage on free shipping #4757

Open
@DegrizNet

Description

@DegrizNet

Is there an existing issue for this?

  • I have searched the existing issues

Current Behavior

If we create sales rule where there is limited coupon usage and we do not have pecentage or fixed discount on order and only free shipping coupon usage is counted.

Expected Behavior

If we have coupon on free shipping with lmited usage (for example 1) when somebody makes order it should

Steps To Reproduce

Image

Image

Environment

OpenMage 20.1.0-rc6
PHP 8.1.31

Anything else?

This fixed issue for me:
app/code/core/Mage/SalesRule/Model/Observer.php

    public function sales_order_afterPlace($observer)
    {
        /** @var Mage_Sales_Model_Order $order */
        $order = $observer->getEvent()->getOrder();
    
        if (!$order) {
            return $this;
        }
    
        // lookup rule ids
        $ruleIds = explode(',', $order->getAppliedRuleIds());
        $ruleIds = array_unique($ruleIds);
    
        $ruleCustomer = null;
        $customerId = $order->getCustomerId();
    
        // Check if coupon exists
        $couponCode = $order->getCouponCode();
        $hasCoupon = !empty($couponCode);
        
        // Modified condition: Process if discount exists OR if a coupon was applied with free shipping
        $hasDiscount = $order->getDiscountAmount() != 0;
        $hasFreeShipping = $order->getShippingAmount() == 0 && $hasCoupon;
        
        if ($hasDiscount || $hasFreeShipping) {
            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();
                    }
                }
            }
            
            if ($hasCoupon) {
                $coupon = Mage::getModel('salesrule/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());
                    }
                }
            }
        }
        return $this;
    }`

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions