Pregunta

He estado trabajando en un proyecto que requiere que los clientes obtengan un código de descuento automático aplicado a su canasta en función de los artículos que están allí.

Pensé que esto estaba funcionando perfectamente con la lógica del código a continuación. Estaba viendo que el código se generara (en la parte posterior y mostraba un descuento en el carrito). Sin embargo, hoy se ha planteado que el crédito al cliente no puede ser utilizado exclusivamente para pagar un pedido.

He reducido con éxito a este módulo que cuando está deshabilitado el problema no está presente. Sin embargo, mi creencia es que, dado que estamos generando el código sobre la marcha y dejando que Magento maneje el descuento real, esto debería funcionar como normales. La depuración muestra que el gran total sigue siendo el precio original al verificar si está disponible en el pago gratuito.

¿Hay alguna lógica adicional que necesito para ingresar para que esto sea compatible?

Tenga en cuenta que tengo un nombre de espacio / módulo enmascarado ligeramente debido a razones de confidencialidad del cliente, por lo que puede detectar algunos errores a continuación en esto, pero por favor, ignorar, como el código, ejecute y ejecute lo que esperé.

expectativas :

Si un cliente cumple con los criterios para un descuento se genera un código de descuento y obtienen un descuento en el carrito.

Si el cliente tiene suficiente crédito de tienda para pagar en su totalidad, deberían poder pagar en su totalidad con el crédito de la tienda.

real :

Se genera el código de descuento (cuando corresponde)

El cliente no puede usar el crédito de la tienda para pagar en su totalidad para su compra.

Observador: 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;
}

lógica de ayuda: De nuevo, como se mencionó anteriormente, he enmascarado cualquier cosa que creo que podría revelar la lógica empresarial o violar la confidencialidad del cliente. Como antes, los dos métodos aquí simplemente generan el cupón del código de descuento (que puedo ver trabajar en administrador y aplican un descuento) y calcula un descuento (esta es una lógica de negocios completamente)

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;
    }

¿Fue útil?

Solución

En caso de que alguien se presente en un problema similar en el futuro, he logrado resolver cuál era la causa de mi problema.Los totales de recolección estaban estableciendo una bandera, lo que lo hace que no se contara después de que se aplicara el descuento.

Mage::getSingleton('checkout/cart')
        ->getQuote()
        ->setCouponCode(strlen($couponCode) ? $couponCode : '')
        ->collectTotals()
        ->save();

Reemplazo de lo anterior con:

Mage::getSingleton('checkout/cart')
            ->getQuote()
            ->setCouponCode(strlen($couponCode) ? $couponCode : '')
            ->save();

Esto significa que al intentar aplicar el crédito al cliente, se calcula el total y se convierte en elegible para el pago de cero de pago.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top