5 votes

Arrêt programmé de la diminution de la quantité du stock lors de la passation d'une commande dans Magento.

J'aurais besoin d'arrêter de diminuer les stocks tout en passant une commande, J'ai besoin de faire cette activité seulement après un paiement réussi.

7voto

Manaf P M Points 453

Oui, nous pouvons désactiver cette diminution de la quantité de manière pragmatique.

Comment ?

Étendre le site Mage_Checkout_Model_Type_Onepage y Réécriture la méthode saveOrder

Changements

avant les lignes suivantes dans la méthode ci-dessus, sera autour de #740 à #742

    $service = Mage::getModel('sales/service_quote', $this->getQuote());
    $service->submitAll();

Ajouter

    $quote = $this->getQuote();
    # Ref: Mage_CatalogInventory_Model_Observer::subtractQuoteInventory
    $quote->setInventoryProcessed(true);

Ceci informera Magento que nous ne traitons pas l'inventaire pour le devis, de sorte qu'il ne diminuera pas la quantité même s'il est configuré pour le faire.

5voto

Nate Points 578

Système > Configuration > Catalogue > Inventaire > Options de stock

Diminuer le stock lorsque la commande est passée > Non

1voto

Quyen Dam Points 11

Pour tous ceux qui souhaitent obtenir plus d'informations sur la soustraction lors du passage d'une commande, il suffit d'étudier cet événement dans les deux Magento EE/CE.

sales_model_service_quote_submit_before

0voto

Andrew Points 7878

Vous pourriez simplement désactiver la gestion des stocks dans l'administration, à moins que vous n'ayez une raison particulière de procéder de cette façon ?

Vous pouvez configurer un observateur qui sera ajouté à la Qté après le succès du paiement : Vous pouvez consulter ici la liste des événements Magento auxquels vous pouvez vous connecter : http://www.nicksays.co.uk/magento_events_cheat_sheet/

 <events>
   <sales_order_payment_pay>
      <observers>
        <my_observer>
            <type>singleton</type>
            <class>my/observer</class>
            <method>addQty</method>
        </my_observer>
      </observers>
   </sales_order_payment_pay>     
</events>

Et ensuite votre observateur ajouterait la Qté en retour

<?php
class Company_My_Model_Observer
{
    public function addQty($event)
    {
        $order = $event->getInvoice()->getOrder(); // Mage_Sales_Model_Order
        $items = $order->getAllVisibleItems();

        foreach($items  as $item) {
             $qty = $item->getQtyOrdered(); // Amount to add back on
             $product = Mage::getModel('catalog/product')->load($item->getProductId());
             /**
              * Here you would load the product and add this amount back on
              */
        }

        return $this;
    }
}

Ça ne marchera probablement pas tel quel, mais vous voyez l'idée. Vous devez faire attention aux événements liés à Magento et au type de paiement, car les différents modules de paiement peuvent gérer ces événements de manière légèrement différente.

0voto

Dans certains cas, vous pouvez utiliser ce qui suit :

config.xml

<frontend>
    <routers>
        <sales_model_service_quote_submit_after>
            <observers>
                <inventory>
                    <type>singleton</type>
                    <class>Vendor_Name_Model_Observer</class>
                    <method>revertQuoteInventory</method>
                </inventory>
            </observers>
        </sales_model_service_quote_submit_after>
    </events>
</frontend>

Observer.php

public function revertQuoteInventory(Varien_Event_Observer $observer)
{
    $quote = $observer->getEvent()->getQuote();
    $inventory = Mage::getModel('cataloginventory/observer');
    $inventory->revertQuoteInventory($observer);
    $inventory->reindexQuoteInventory($observer);

    $quote->setInventoryProcessed(true);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X