Magento एक चेकआउट या बंटवारे पर कई आदेश


10

स्टोर उत्पादों की आपूर्ति विभिन्न विक्रेताओं से की जाती है। एक चेकआउट के दौरान कार्ट में अपने उत्पादों के आधार पर प्रत्येक विक्रेता के लिए कई ऑर्डर बनाना आवश्यक है। क्या इस कार्य को प्राप्त करने के लिए कोई एक्सटेंशन है या क्या मुझे कस्टम चेकआउट मॉड्यूल विकसित करना शुरू करना चाहिए। Magento के अनुभवी डेवलपर्स के इस तरह के विस्तार की दृष्टि बनाने के लिए गर्म बिंदुओं के बारे में क्या? क्या आप मुझे संक्षिप्त चेकआउट फ्लो आर्किटेक्चर मैगनेटो फ्रेंडली (कोड स्तर के अनुसार संभव) समझा सकते हैं? बहुत अधिक धन्यवाद!


मल्टीशपिंग पर एक नज़र डालें कि कौन सा मैगेंटो बॉक्स से बाहर पेश करता है। और ड्रॉपशिप है लेकिन मुझे नहीं पता कि यह अच्छा है या यह क्या करने में सक्षम है। unirgy.com/products/udropship
Fabian

@mageUz, क्या आपने जवाब के नीचे काम किया है? यह मेरे लिए काम नहीं कर रहा है .. क्या आप अपना कोड पोस्ट कर सकते हैं?
मनोज कुमार

@ मुंजकुमार, हाँ, मैंने पहले ही मल्टीड्रेस चेकआउट लॉजिक का उपयोग करके ऑर्डर स्प्लिटिंग लागू कर दिया है, मुझे यकीन है कि नीचे दिया गया तर्क भी पूरी तरह से काम करता है।
मगेउज़

@mageUz, जब इस कोड का उपयोग करें शॉपिंग कार्ट खाली दिख रहा है .. कोई सुझाव ..
मनोज कुमार

नमस्ते जो मार्केटप्लेस स्प्लिट कार्ट मॉड्यूल स्टोर का उपयोग करके किया जा सकता है ।webkul.com/Magento-Marketplace-Split-artart.html । धन्यवाद
webkul

जवाबों:


9

यह checkout/type_onepageमॉडल के पुनर्लेखन के साथ काफी आसानी से संभव है ।
उस वर्ग में saveOrder()विधि को इस प्रकार से ओवरराइड करें :

public function saveOrder()
{
    $quote = $this->getQuote();

    // First build an array with the items split by vendor
    $sortedItems = array();
    foreach ($quote->getAllItems() as $item) {
        $vendor = $item->getProduct()->getVendor(); // <- whatever you need
        if (! isset($sortedItems[$vendor])) {
            $sortedItems[$vendor] = $item;
        }
    }
    foreach ($sortedItems as $vendor => $items) {
        // Empty quote
        foreach ($quote->getAllItems() as $item) {
            $quote->getItemsCollection()->removeItemByKey($item->getId());
        }
        foreach ($items as $item) {
            $quote->addItem($item);
        }
        // Update totals for vendor
        $quote->setTotalsCollectedFlag(false)->collectTotals();

        // Delegate to parent method to place an order for each vendor
        parent::saveOrder();
    }
    return $this;
}

लेकिन ध्यान रखें कि Magento में एक भुगतान एक चालान के साथ जुड़ा हुआ है, और प्रत्येक चालान एक आदेश के साथ जुड़ा हुआ है।

परिणाम में इसका मतलब है कि जैसे ही आपके पास कई ऑर्डर होंगे, आपने भुगतान भी विभाजित कर दिया होगा । अतः यह केवल तभी संभव है जब भुगतान विधि को भुगतान के दौरान उपयोगकर्ता के सहभागिता की आवश्यकता न हो।

अद्यतन : मूल जवाब parent::save()जो होना चाहिए था parent:saveOrder()। यह अब उदाहरण कोड में तय किया गया है।


सराहना करेंगे यदि आप मेरे समान प्रश्न पर एक नज़र डाल सकते हैं! magento.stackexchange.com/questions/6974/…
CaitlinHavener

क्या आप उपरोक्त कोड का उपयोग करके आदेश को विभाजित करने में सक्षम थे, जैसा कि मैं ऐसा ही करने की कोशिश कर रहा हूं, लेकिन बिना किसी भाग्य के नहीं
दीपक मल्लाह

1
रॉय, बेशक आपको माता-पिता होने के लिए मूल वर्ग का विस्तार करना होगा, लेकिन यह सरल PHP है, इसका Magento से कोई लेना-देना नहीं है। saveOrderमैगेंटो सीई 1.9 में विधि अभी भी मौजूद है और सक्रिय है जैसे यह हमेशा से रहा है।
विनय

3
मुझे इस स्निपेट के साथ समस्या थी क्योंकि 2 ऑर्डर में ग्रैंडटोटल और सबटोटल पूरे ऑर्डर के बराबर है। डिबगिंग के बाद मुझे पता चला कि वस्तुओं को हटाना और फिर से जोड़ना, यह कुल पते का संग्रह करने के बाद पते की कैश्ड वस्तुओं का उपयोग करेगा ... इसे हल करने के लिए प्रत्येक पते के लिए आइटम कैश को स्पष्ट करें: $ पता-> unsetData (' cached_items_all '); $ पते तक> unsetData ( 'cached_items_nominal'); $ पते तक> unsetData (cached_items_nonnominal ');
डियागो सैंटियागो

1
@Vinai $ बोली-> addItem ($ आइटम); यह कोड काम नहीं कर रहा है। आइटम जोड़ने के बाद I $ $ बोली-> getAllItems () फॉरच लूप की मदद से। लेकिन कोई आइटम नहीं था। क्या आप कृपया इस पर मेरी मदद कर सकते हैं?
अमित बेरा

1

निम्नलिखित का परीक्षण CE ver 1.9.0.x में किया गया है

/**
 * Overwrite core
 */
class Vendor_Module_Model_Checkout_Type_Onepage extends Mage_Checkout_Model_Type_Onepage
{
    protected $_oriAddresses = array();

    /**
     * Prepare order from quote_items  
     *
     * @param   array of Mage_Sales_Model_Quote_Item 
     * @return  Mage_Sales_Model_Order
     * @throws  Mage_Checkout_Exception
     */
    protected function _prepareOrder2($quoteItems)
    {
        $quote = $this->getQuote();
        $quote->unsReservedOrderId();
        $quote->reserveOrderId();

        // new instance of quote address
        $quote->setIsMultiShipping(true); // required for new instance of Mage_Sales_Model_Quote_Address
        $address = Mage::getModel('sales/quote_address');
        $weight = 0;
        $addressType = 'billing';
        foreach ($quoteItems as $quoteItem) {
            $address->addItem($quoteItem, $quoteItem->getQty());
            $weight += $quoteItem->getWeight();
            if (!$quoteItem->getIsVirtual()) {
                $addressType = 'shipping';
            }
        }
        // get original shipping address that contains multiple quote_items
        if (!isset($this->_oriAddresses[$addressType])) {
            $this->_oriAddresses[$addressType] = Mage::getResourceModel('sales/quote_address_collection')
                ->setQuoteFilter($quote->getId())
                ->addFieldToFilter('address_type', $addressType)
                ->getFirstItem();
        }
        Mage::helper('core')->copyFieldset('sales_convert_quote_address', 'to_customer_address', $this->_oriAddresses[$addressType], $address);
        Mage::helper('core')->copyFieldset('sales_convert_quote_address', 'to_order', $this->_oriAddresses[$addressType], $address);
        $address->setQuote($quote)
            ->setWeight($weight)
            ->setSubtotal(0)
            ->setBaseSubtotal(0)
            ->setGrandTotal(0)
            ->setBaseGrandTotal(0)
            ->setCollectShippingRates(true)
            ->collectTotals()
            ->collectShippingRates()        
            ;

        $convertQuote = Mage::getSingleton('sales/convert_quote');
        $order = $convertQuote->addressToOrder($address);
        $order->setBillingAddress(
            $convertQuote->addressToOrderAddress($quote->getBillingAddress())
        );

        if ($address->getAddressType() == 'billing') {
            $order->setIsVirtual(1);
        } else {
            $order->setShippingAddress($convertQuote->addressToOrderAddress($address));
        }

        $order->setPayment($convertQuote->paymentToOrderPayment($quote->getPayment()));
        if (Mage::app()->getStore()->roundPrice($address->getGrandTotal()) == 0) {
            $order->getPayment()->setMethod('free');
        }

        foreach ($quoteItems as $quoteItem) {
            $orderItem = $convertQuote->itemToOrderItem($quoteItem);  // use quote_item to transfer is_qty_decimal
            if ($quoteItem->getParentItem()) {
                $orderItem->setParentItem($order->getItemByQuoteItemId($quoteItem->getParentItem()->getId()));
            }
            $order->addItem($orderItem);
        }

        return $order;
    }

    /**
     * Overwrite core function
     */
    public function saveOrder()
    {
        $quote = $this->getQuote();
        if ($quote->getItemsCount() > 1) {
            $items = $quote->getAllVisibleItems();
            $group = array();
            $split = array();
            foreach ($items as $item) {
                if (Mage::helper('vendor')->checkSku($item->getSku())) {
                    $split[] = array($item); // one item per order
                } else {
                    $group[] = $item; // all other items in one order
                }
            }
            if (count($split)) {
                if (count($group)) {
                    $split[] = $group;
                }
                return $this->_splitQuote($split);
            }
        }
        return parent::saveOrder();
    }

    /**
     * Split quote to multiple orders
     * 
     * @param array of Mage_Sales_Model_Quote_Item
     * @return Mage_Checkout_Model_Type_Onepage
     */
    protected function _splitQuote($split)
    {
        $this->validate();
        $isNewCustomer = false;
        switch ($this->getCheckoutMethod()) {
            case self::METHOD_GUEST:
                $this->_prepareGuestQuote();
                break;
            case self::METHOD_REGISTER:
                $this->_prepareNewCustomerQuote();
                $isNewCustomer = true;
                break;
            default:
                $this->_prepareCustomerQuote();
                break;
        }
        if ($isNewCustomer) {
            try {
                $this->_involveNewCustomer();
            } catch (Exception $e) {
                Mage::logException($e);
            }
        }

        $quote = $this->getQuote()->save();
        $orderIds = array();
        Mage::getSingleton('core/session')->unsOrderIds();
        $this->_checkoutSession->clearHelperData();

        /**
         * a flag to set that there will be redirect to third party after confirmation
         * eg: paypal standard ipn
         */
        $redirectUrl = $quote->getPayment()->getOrderPlaceRedirectUrl();

        foreach ($split as $quoteItems) {
            $order = $this->_prepareOrder2($quoteItems);
            $order->place();
            $order->save();
            Mage::dispatchEvent('checkout_type_onepage_save_order_after',
                array('order'=>$order, 'quote'=>$quote));
            /**
             * we only want to send to customer about new order when there is no redirect to third party
             */
            if (!$redirectUrl && $order->getCanSendNewEmailFlag()) {
                $order->sendNewOrderEmail();
            }
            $orderIds[$order->getId()] = $order->getIncrementId();
        }

        Mage::getSingleton('core/session')->setOrderIds($orderIds);

        // add order information to the session
        $this->_checkoutSession
            ->setLastQuoteId($quote->getId())
            ->setLastSuccessQuoteId($quote->getId())
            ->setLastOrderId($order->getId())
            ->setRedirectUrl($redirectUrl)
            ->setLastRealOrderId($order->getIncrementId());

        // as well a billing agreement can be created
        $agreement = $order->getPayment()->getBillingAgreement();
        if ($agreement) {
            $this->_checkoutSession->setLastBillingAgreementId($agreement->getId());
        }

        // add recurring profiles information to the session
        $service = Mage::getModel('sales/service_quote', $quote);
        $profiles = $service->getRecurringPaymentProfiles();
        if ($profiles) {
            $ids = array();
            foreach ($profiles as $profile) {
                $ids[] = $profile->getId();
            }
            $this->_checkoutSession->setLastRecurringProfileIds($ids);
            // TODO: send recurring profile emails
        }

        Mage::dispatchEvent(
            'checkout_submit_all_after',
            array('order' => $order, 'quote' => $quote, 'recurring_profiles' => $profiles)
        );

        return $this;
    }
}

महत्वपूर्ण आपको उद्धरण से भव्य कुल प्राप्त करने के लिए अपने भुगतान के तरीकों को अनुकूलित करने की आवश्यकता है।


यह काम कर रहा है। धन्यवाद। विक्रेता द्वारा समूह कार्ट उद्धरण कैसे करें? अन्य तो "// एक आइटम प्रति आदेश" ..
सैयद इब्राहिम

1
$group[] = $item; // all other items in one orderआदेश के अनुसार कई आइटम रख सकते हैं, आप आसानी से ऐसे संशोधित कर सकते हैं जैसे कि प्रत्येक विक्रेता के पास है $group
kiatng

अद्यतन और यह काम कर रहा है। लेकिन भुगतान केवल अंतिम ऑर्डर के लिए कैप्चर किया जाता है (यदि हम कई ऑर्डर को विभाजित करते हैं)। हमें इसे अपडेट करने की आवश्यकता कैसे है? मुझे कुल भुगतान करने की आवश्यकता है।
सैयद इब्राहिम

कुल राशि बोली ऑब्जेक्ट में है, आप इसे लोड कर सकते हैं $quote->Mage::getModel('sales/quote')->load($lastOrder->getQuoteId())। फिर कई योग हैं $quoteजिनसे आप पुनः प्राप्त कर सकते हैं , जिनमें से एक है$quote->getGrandTotal()
kiatng
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.