I fall into next problem.
When i set up redemption limit as 1 per coupon, and set state considered as used coupon of order i.e. in checkout, after i add coupon to cart, it's disappear and appear again after each page reload.
After investigation, i've found that it first considered as invalid because it's used. But in fact it's used in the same order.
On next page reload coupon re-validated and appears. On next reload it again disappears as invalid. And that's happen in cycle...
This problem make possible to enter same coupon with redemption limit to another order if it disappears on current page load.
My quick and bit ugly solution is next.
In function uc_coupon_uc_coupon_validate() write
// Check maximum usage per code.
$actual_count = $coupon->usage['codes'][$coupon->code];
// If current coupon already added to order with status of used coupon,
// we must substract usage count to proper validate.
$coupon_used_status = variable_get('uc_coupon_used_order_status', 'processing');
if ($coupon->max_uses && $coupon_used_status == $order->order_status && $coupon->usage['codes'][$coupon->code] > 0 && isset($_SESSION['cart_order'])) {
$session_coupon = uc_coupon_session_get();
if (isset($session_coupon[$coupon->code]) && in_array($session_coupon[$coupon->code], array('revalidate', 'submit'))) {
$activated_count = db_query(
'SELECT COUNT(*) as usages FROM {uc_coupons_orders} uco
JOIN {uc_orders} uo ON uco.oid = uo.order_id
WHERE uco.code = :code AND uo.order_status = :order_status AND uo.order_id = :order_id',
array(':code' => $coupon->code, ':order_status' => $coupon_used_status, ':order_id' => $_SESSION['cart_order'])
)->fetchField();
if ($activated_count) {
$actual_count = $coupon->usage['codes'][$coupon->code] - 1;
}
}
}
if ($coupon->max_uses > 0 && !empty($coupon->usage['codes'][$coupon->code]) && $actual_count >= $coupon->max_uses) {
return t('This coupon has reached the maximum redemption limit.');
}
instead of
if ($coupon->max_uses > 0 && !empty($coupon->usage['codes'][$coupon->code]) && $coupon->usage['codes'][$coupon->code] >= $coupon->max_uses) {
return t('This coupon has reached the maximum redemption limit.');
}
Comments
Comment #1
wodenx commentedI believe this is fixed in 7.x-3.x -- can anyone verify this?