У меня возникла проблема с единственным кодом купона Magento, который помечается как используемый в момент, когда клиент нажимает кнопку Разместить заказ. Если платеж Paypal не удался или клиент покинул страницу до завершения заказа, он не сможет вернуться и повторно заказать этот купон, который установлен только один раз и уже отмечен.
Я нашел фрагмент кода, который уменьшает количество раз, когда купоны использовались пользователем и позволяет ему повторно использовать купон. К сожалению, он получает сообщение об ошибке при попытке подключения страницы Paypal при нажатии кнопки выбора места. Чтобы иметь возможность использовать купон в другой раз и получить доступ к странице Paypal, мне необходимо удалить строки в базе данных SQL в таблицах salesrule_coupon_usage и salesrule_customer с этим идентификатором клиента.
Вот код, который мне нужно изменить, чтобы автоматически удалять информацию об использовании купона для идентификатора клиента:
public function cancel($observer)
{
$order = $observer->getEvent()->getPayment()->getOrder();
if ($order->canCancel()) {
if ($code = $order->getCouponCode()) {
$coupon = Mage::getModel('salesrule/coupon')->load($code, 'code');
if ($coupon->getTimesUsed() > 0) {
$coupon->setTimesUsed($coupon->getTimesUsed() - 1);
$coupon->save();
}
$rule = Mage::getModel('salesrule/rule')->load($coupon->getRuleId());
error_log("\nrule times used=" . $rule->getTimesUsed(), 3, "var/log/debug.log");
if ($rule->getTimesUsed() > 0) {
$rule->setTimesUsed($rule->getTimesUsed()-1);
$rule->save();
}
if ($customerId = $order->getCustomerId()) {
if ($customerCoupon = Mage::getModel('salesrule/rule_customer')->loadByCustomerRule($customerId, $rule->getId())) {
$couponUsage = new Varien_Object();
Mage::getResourceModel('salesrule/coupon_usage')->loadByCustomerCoupon($couponUsage, $customerId, $coupon->getId());
if ($couponUsage->getTimesUsed() > 0) {
/* I can't find any #@[email protected]$ interface to do anything but increment a coupon_usage record */
$resource = Mage::getSingleton('core/resource');
$writeConnection = $resource->getConnection('core_write');
$tableName = $resource->getTableName('salesrule_coupon_usage');
$query = "UPDATE {$tableName} SET times_used = times_used-1 "
. "WHERE coupon_id = {$coupon->getId()} AND customer_id = {$customerId} AND times_used > 0";
$writeConnection->query($query);
}
if ($customerCoupon->getTimesUsed() > 0) {
$customerCoupon->setTimesUsed($customerCoupon->getTimesUsed()-1);
$customerCoupon->save();
}
}
}
}
}
}