Question

Je travaille sur un projet qui oblige les clients à obtenir un code de réduction automatique appliqué à leur panier sur la base d'articles qui sont là-bas.

Je pensais que cela fonctionnait parfaitement avec la logique de code ci-dessous. Je voyais que le code est généré (à l'arrière et a montré un rabais sur le panier). Cependant, aujourd'hui, il a été soulevé que le crédit client ne peut pas être exclusivement utilisé pour payer une commande.

Je l'ai réduit avec succès à ce module qui, lorsqu'il est désactivé le problème n'est pas présent. Je crains cependant que, puisque nous générons le code à la volée et que la magentaine manipule la remise actuelle, cela devrait fonctionner comme normal. Le débogage montre que le total du total est toujours le prix initial lors de la vérification si elle est disponible dans la commande gratuite.

existe-t-il une logique supplémentaire que j'ai besoin d'entrer pour que cela soit compatible?

Sachez que j'ai un nom de noms de noms / module masqué légèrement en raison des raisons de confidentialité du client afin que vous puissiez repérer certaines erreurs ci-dessous, mais s'il vous plaît ne pas tenir compte tel que le code exécute et exécutez ce que je m'y attendais.

attentes :

Si un client répond aux critères d'un remise, un code de réduction est généré et obtenez une réduction contre le chariot.

Si le client a suffisamment de crédit en magasin pour payer intégralement, ils devraient pouvoir payer en totalité le crédit en magasin.

réel :

Le code de réduction est généré (le cas échéant)

Le client est incapable d'utiliser le crédit en magasin pour payer en totalité pour leur achat.

Observateur: Checkout_Cart_Product_Add_Après

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

logique d'assistance: Encore une fois ci-dessus, j'ai masqué tout ce que je ressens révélerait potentiellement une logique commerciale ou une violation de la confidentialité du client. Comme auparavant, les deux méthodes génèrent simplement le coupon de code de réduction (que je peux voir travailler dans l'administrateur et appliquer une réduction) et calcule une réduction (c'est entièrement logique commerciale)

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

Était-ce utile?

La solution

Donc, au cas où n'importe qui appartient à un problème similaire à l'avenir, j'ai réussi à déterminer quelle était la cause de mon problème.Les totaux de collecte définissent un drapeau qui lui permettait de ne pas compter après l'application de la remise.

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

Remplacement de ce qui précède avec:

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

Cela signifie que lorsque vous essayez d'appliquer le crédit client, il calcule le total et devient admissible à la caisse de paiement zéro.

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top