Open
Description
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
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;
}`