O cupom Magento Multiple aplica-se ao carrinho

9

Estou trabalhando há 2 dias para aplicar vários cupons no carrinho. Sei que existem módulos disponíveis para isso. Mas eu não quero usá-lo. Quero um código personalizado para que eu possa aplicar mais de 1 código de cupom no pedido único.

Por favor ajude. Estou muito cansado depois de trabalhar nas mesmas coisas. insira a descrição da imagem aqui

Zaheerabbas
fonte
11
Aqui você vai stackoverflow.com/questions/15138237/…
Tim Hallman 18/15
Btw, sua pergunta é assustadoramente semelhante ao que eu só ligada acima, que é a partir de 2013.
Tim Hallman
@ Tim ~ ​​Eu não acho que esse seja o melhor método, pois envolve adicionar colunas diretamente às tabelas de vendas, ignorando os métodos convencionais do Magento. Na verdade, eu brinquei com isso agora, e com 2 reescritas e algumas linhas de código, isso pode ser facilmente alcançado. Além disso, a resposta nesse link permite apenas a adição de 2 códigos. Ill postar uma resposta em um pouco
Shaughn
@ Shaughn pls publica seu código.
Zaheerabbas
poderia me dar um exemplo zip, ou seja diretórios mais específicas Por favor, agradeça de
alexmalara

Respostas:

14

No seu módulo personalizado, adicione o seguinte a config.xml:

<models>
    <salesrule>
        <rewrite>
            <quote_discount>Namespace_Module_Rewrite_SalesRule_Model_Quote_Discount</quote_discount>
        </rewrite>
    </salesrule>
</models>
<frontend>
    <routers>
        <checkout>
            <args>
                <modules>
                    <Namespace_Module before="Mage_Checkout">Namespace_Module_Checkout</Namespace_Module>
                </modules>
            </args>
        </checkout>
    </routers>
</frontend>

A primeira é uma reescrita Mage_SalesRule_Model_Quote_DiscountparaNamespace_Module_Rewrite_SalesRule_Model_Quote_Discount

O segundo é o controlador sobrecarregado Mage_Checkout_CartController

Em seguida, adicione o seguinte arquivo app/code/community/Namespace/Module/controllers/Checkout/CartController.php e insira o seguinte código:

<?php

require_once 'Mage/Checkout/controllers/CartController.php';

class Namespace_Module_Checkout_CartController extends Mage_Checkout_CartController
{
    /**
     * Initialize coupon
     */
    public function couponPostAction()
    {
        /**
         * No reason continue with empty shopping cart
         */
        if (!$this->_getCart()->getQuote()->getItemsCount()) {
            $this->_goBack();
            return;
        }

        $couponCode = (string) $this->getRequest()->getParam('coupon_code');
        if ($this->getRequest()->getParam('remove') == 1) {
            $couponCode = '';
        }
        $oldCouponCode = $this->_getQuote()->getCouponCode();

        if (!strlen($couponCode) && !strlen($oldCouponCode)) {
            $this->_goBack();
            return;
        }

        try {
            $codeLength = strlen($couponCode);
            $isCodeLengthValid = $codeLength && $codeLength <= Mage_Checkout_Helper_Cart::COUPON_CODE_MAX_LENGTH;

            // Combine multiple coupons
            $couponFlag = true;

            if ($isCodeLengthValid) {
                $del = ',';

                if ($oldCouponCode) {

                    if ($oldCouponCode == $couponCode) {
                        $couponCode = $oldCouponCode;
                    } else {
                        $couponCode = $oldCouponCode . $del . $couponCode;
                    }
                }
            } else {
                $couponCode = '';
            }

            $this->_getQuote()->getShippingAddress()->setCollectShippingRates(true);
            $this->_getQuote()->setCouponCode($couponCode)
                ->collectTotals()
                ->save();

            if ($codeLength) {
                if ($isCodeLengthValid && $couponFlag) {
                    $this->_getSession()->addSuccess(
                        $this->__('Coupon code "%s" was applied.', Mage::helper('core')->escapeHtml($couponCode))
                    );
                } else {
                    $this->_getSession()->addError(
                        $this->__('Coupon code "%s" is not valid.', Mage::helper('core')->escapeHtml($couponCode))
                    );
                }
            } else {
                $this->_getSession()->addSuccess($this->__('Coupon code was canceled.'));
            }

        } catch (Mage_Core_Exception $e) {
            $this->_getSession()->addError($e->getMessage());
        } catch (Exception $e) {
            $this->_getSession()->addError($this->__('Cannot apply the coupon code.'));
            Mage::logException($e);
        }

        $this->_goBack();
    }
}

Você notará que eu adicionei uma seção para combinar códigos de cupom delimitados por ",". Obviamente, isso pode ser mais refinado e você pode adicionar verificações adicionais, etc., mas esse código deve funcionar imediatamente.

E, finalmente, precisamos adicionar a peça que faz toda a mágica. Adicione o arquivoapp/code/community/Namespace/Module/Rewrite/SalesRule/Model/Quote/Discount.php

e adicione o conteúdo:

<?php

class Namespace_Module_Rewrite_SalesRule_Model_Quote_Discount extends Mage_SalesRule_Model_Quote_Discount
{
    /**
     * Collect address discount amount
     *
     * @param   Mage_Sales_Model_Quote_Address $address
     * @return  Mage_SalesRule_Model_Quote_Discount
     */
    public function collect(Mage_Sales_Model_Quote_Address $address)
    {
        Mage_Sales_Model_Quote_Address_Total_Abstract::collect($address);
        $quote = $address->getQuote();
        $store = Mage::app()->getStore($quote->getStoreId());
        $this->_calculator->reset($address);

        $items = $this->_getAddressItems($address);
        if (!count($items)) {
            return $this;
        }

        $couponCode = $quote->getCouponCode();
        $couponArray = explode(',',$couponCode);

        foreach ($couponArray as $couponCode) {
            $this->_calculator->init($store->getWebsiteId(), $quote->getCustomerGroupId(), $couponCode);
            $this->_calculator->initTotals($items, $address);

            $eventArgs = array(
                'website_id'        => $store->getWebsiteId(),
                'customer_group_id' => $quote->getCustomerGroupId(),
                'coupon_code'       => $couponCode,
            );

            $address->setDiscountDescription(array());
            $items = $this->_calculator->sortItemsByPriority($items);
            foreach ($items as $item) {
                if ($item->getNoDiscount()) {
                    $item->setDiscountAmount(0);
                    $item->setBaseDiscountAmount(0);
                }
                else {
                    /**
                     * Child item discount we calculate for parent
                     */
                    if ($item->getParentItemId()) {
                        continue;
                    }

                    $eventArgs['item'] = $item;
                    Mage::dispatchEvent('sales_quote_address_discount_item', $eventArgs);

                    if ($item->getHasChildren() && $item->isChildrenCalculated()) {
                        foreach ($item->getChildren() as $child) {
                            $this->_calculator->process($child);
                            $eventArgs['item'] = $child;
                            Mage::dispatchEvent('sales_quote_address_discount_item', $eventArgs);

                            $this->_aggregateItemDiscount($child);
                        }
                    } else {
                        $this->_calculator->process($item);
                        $this->_aggregateItemDiscount($item);
                    }
                }
            }

            /**
             * process weee amount
             */
            if (Mage::helper('weee')->isEnabled() && Mage::helper('weee')->isDiscounted($store)) {
                $this->_calculator->processWeeeAmount($address, $items);
            }

            /**
             * Process shipping amount discount
             */
            $address->setShippingDiscountAmount(0);
            $address->setBaseShippingDiscountAmount(0);
            if ($address->getShippingAmount()) {
                $this->_calculator->processShippingAmount($address);
                $this->_addAmount(-$address->getShippingDiscountAmount());
                $this->_addBaseAmount(-$address->getBaseShippingDiscountAmount());
            }

            $this->_calculator->prepareDescription($address);
        }

        return $this;
    }
}

Basicamente, o que isso faz é quebrar a picada do cupom, percorrer cada código de cupom, calcular e atualizar os totais da cotação.

Para testar, eu configurei 2 regras do carrinho de compras:

  • teste 1 - 10% de desconto no preço do produto - Parar o processamento de outras regras: Não
  • teste 2 - 10% de desconto no preço do produto - Parar o processamento de outras regras: Não

Sem cupom: sem cupom

Teste de cupom 1 adicionado: teste de cupom adicionado 1

Teste de cupom adicionado 2 teste de cupom adicionado 1

Eu testei com desconto de valor fixo e isso funciona como esperado também.

E, como eu disse, você pode precisar adicionar verificações adicionais, possivelmente duplicatas, mas é aqui que você começaria. Para o frontend, você pode adicionar alguma lógica, dividir os códigos da maneira que preferir ou deixar como está.

Shaughn
fonte
Também esqueci de mencionar, você obviamente precisa substituir Namespace / Módulo com o nome do módulo real, etc.
Shaughn
Depois de editar esta resposta, agora está funcionando como na captura de tela acima. Agora, como posso cancelar um cupom específico depois de aplicar vários cupons?
Zaheerabbas 28/05
Obrigado Shaughn pela resposta, funcionou para mim no magento 1.9, mas eu não consegui fazê-lo funcionar na versão 1.8, ele não exibe nada no navegador e gera erro de tamanho de memória esgotado no apache error.log (não no magento error / system.log )
Haris
Hey Saddam, o problema de memória é provavelmente um dos muitos problemas, mas o que você pode fazer é agrupar o código em um bloco try catch e registrar quaisquer erros que surjam. Verifique também a configuração de memória máxima no php e verifique se há memória suficiente acessível. Pouco antes do loop, você pode contar os códigos dos cupons e verificar quantos existem, como eu suspeito, existem alguns que são carregados na memória.
Shaughn
11
Para impedir facilmente o uso múltiplo dos mesmos códigos de cupom, você pode simplesmente usar array_unique $ couponArray = array_unique (explode (',', $ couponCode));
Julian