Автоматические скидки купоны конфликтуют с нулевым платежом
-
13-12-2019 - |
Вопрос
Я работал над проектом, который требует, чтобы клиенты получали автоматический код скидки, применяемый к их корзине на основе там предметов.
Я думал, что это отлично работает с логикой кода ниже. Я видел, как код генерируется (в заднем конце и показал скидку на корзину). Однако сегодня было поднято, что кредит клиента не может быть использован исключительно для оплаты заказа.
Я успешно сузил его к этому модулю, который при отключении проблема отсутствует. Моя верь, однако, это то, что с тех пор, как мы создаем код на лету и позволить Magento обрабатывать фактическую скидку, это должно работать как обычно. Отладка показывает, что Grand Total по-прежнему является оригинальной ценой при проверке, если она доступна в бесплатной оформлении заказа.
Есть ли дополнительная логика, которую мне требуется, чтобы ввести для этого, чтобы быть совместимым?
Пожалуйста, будьте в курсе, что я немного замаскировал имя пространства имен / модулей из-за причин конфиденциальности клиента, чтобы вы могли обнаружить некоторые ошибки в этом ниже, но, пожалуйста, не обращайте внимания на то, что код выполняет и запускает то, что я ожидал.
<Сильные> Ожидания :
Если клиент соответствует критериям для скидки, генерируется код скидки, и они получают скидку против корзины.
Если клиент имеет достаточный кредит магазина, чтобы заплатить в полном объеме, они должны быть в состоянии заплатить в полном объеме с помощью кредитного кредита.
<Сильные> Фактические :
Code Code Code (если применимо)
Клиент не может использовать кредит магазина, чтобы заплатить полностью для их покупки.
Observer: checkout_cart_product_add_after
public function checkout_cart_product_add_after($observer)
{
if (!Mage::helper('core')->isModuleOutputEnabled('Namespace_WholesaleDiscount')) {
return;
}
/*
* When emptying the cart this observer is updated
* due to the setting of it to 0 for deletion.
* This prevents running the observer and thus resetting items in quote.
*/
$request = Mage::app()->getRequest()->getParam('update_cart_action');
if ($request == 'empty_cart') {
return;
}
try {
$model = Mage::getModel('salesrule/rule')
->getCollection()
->addFieldToSelect('*')
->addFieldToFilter('name', array('eq' => sprintf('WHOLESALE AUTO_%s', Mage::getSingleton('customer/session')->getSessionId())))
->load();
if ($model->count() < 1) {
// No coupon yet.
$helper = Mage::helper('wholesalediscount');
$helper->createDiscountCode($helper->getDiscountAmount(), Mage::getSingleton('customer/session')->getSessionId());
$model = Mage::getModel('salesrule/rule')
->getCollection()
->addFieldToFilter('name', array('eq' => sprintf('WHOLESALE AUTO_%s', Mage::getSingleton('customer/session')->getSessionId())))
->getFirstItem();
} else {
$helper = Mage::helper('wholesalediscount');
$model = $model->getFirstItem();
$model->setDiscountAmount($helper->getDiscountAmount());
$code = Mage::helper('core')->getRandomString(16);
// Magento initializes the coupon_code, but on model load it is code.
$model->setCouponCode($code);
$model->setCode($code);
$model->save();
}
$couponCode = $model->getCode();
/* END This part is my extra, just to load our coupon for this specific customer */
Mage::getSingleton('checkout/cart')
->getQuote()
->getShippingAddress()
->setCollectShippingRates(true);
Mage::getSingleton('checkout/cart')
->getQuote()
->setCouponCode(strlen($couponCode) ? $couponCode : '')
->collectTotals()
->save();
} catch (Exception $e) {
Mage::logException($e);
}
return $this;
}
.
Helper Logic: Опять же, как указано выше, я замаскировал все, что я чувствую, потенциально раскроет либо бизнес-логику, либо нарушать любую конфиденциальность клиента. Как и прежде, два метода здесь просто генерируют купон кода скидки (который я могу видеть работать в Admin и применил скидку) и вычисляет скидку (это совершенно деловая логика)
public function createDiscountCode($discount, $reference)
{
$now = new Zend_Date();
$now->setTimezone('UTC');
$data = array(
'product_ids' => null,
'name' => sprintf('WHOLESALE AUTO_%s', $reference),
'description' => null,
'is_active' => 1,
'website_ids' => array(Mage::app()->getWebsite()->getId()),
'customer_group_ids' => array(Mage::getSingleton('customer/session')->getCustomerGroupId()),
'coupon_type' => 2,
'coupon_code' => Mage::helper('core')->getRandomString(16),
'uses_per_coupon' => 1,
'uses_per_customer' => 1,
'from_date' => $now->getFullYear() . "-". $now->getMonth() . "-" . $now->getDay(),
'to_date' => null,
'sort_order' => null,
'is_rss' => 1,
'rule' => array(
'conditions' => array(
array(
'type' => 'salesrule/rule_condition_combine',
'aggregator' => 'all',
'value' => 1,
'new_child' => null
)
)
),
'simple_action' => 'cart_fixed',
'discount_amount' => $this->getDiscountAmount(),
'discount_qty' => 0,
'discount_step' => null,
'apply_to_shipping' => 0,
'simple_free_shipping' => 0,
'stop_rules_processing' => 0,
'rule' => array(
'actions' => array(
array(
'type' => 'salesrule/rule_condition_product_combine',
'aggregator' => 'all',
'value' => 1,
'new_child' => null
)
)
),
'store_labels' => array('E-Liquids With Kits')
);
$model = Mage::getModel('salesrule/rule');
$validateResult = $model->validateData(new Varien_Object($data));
if ($validateResult == true) {
if (isset($data['simple_action']) && $data['simple_action'] == 'by_percent'
&& isset($data['discount_amount'])) {
$data['discount_amount'] = min(100, $data['discount_amount']);
}
if (isset($data['rule']['conditions'])) {
$data['conditions'] = $data['rule']['conditions'];
}
if (isset($data['rule']['actions'])) {
$data['actions'] = $data['rule']['actions'];
}
unset($data['rule']);
$model->setData($data);
$model->save();
}
}
/*
* Use this to calculate how much money off is allowed based on whats in the cart.
*/
public function getDiscountAmount()
{
$customer = Mage::getSingleton('customer/session')->getCustomer();
$cart = Mage::getModel('checkout/cart');
$discountItems = array();
/* Exclude some Business logic here */
foreach ($cart->getQuote()->getAllVisibleItems() as $_item) {
$product = Mage::getModel('catalog/product')->load($_item->getProduct()->getId());
/* Business Logic to decide if this item is relevent */
$discountItems[] = $_item;
}
// Calculate Discount
$appliedDiscounts = 0;
$discount = 0;
foreach ($discountitem as $_item) {
if ($appliedDiscounts < $allowed) {
$i = 0;
while ($appliedDiscounts < $allowed && $i < $_item->getQty()) {
$appliedDiscounts++;
$discount += $_item->getProduct()->getFinalPrice();
$i++;
}
}
}
return $discount;
}
. Решение
Так что на случай, если кто-то наступает на аналогичную проблему в будущем, мне удалось выработать, какова была причина моей проблемы.Собирательные итоги устанавливали флаг, заставляющий его не подчиниться после применения скидки.
Mage::getSingleton('checkout/cart')
->getQuote()
->setCouponCode(strlen($couponCode) ? $couponCode : '')
->collectTotals()
->save();
.
Замена вышеуказанного с:
Mage::getSingleton('checkout/cart')
->getQuote()
->setCouponCode(strlen($couponCode) ? $couponCode : '')
->save();
.
Это означает, что при попытке применить кредит клиента, он пересчитывает общее количество и имеет право на оформление заказа нуля.