कार्ट उद्धरण आइटम पर कर की दर को संशोधित करें और पुनर्गणना करें


31

मेरे पास उन उत्पादों की एक श्रेणी है जो (कानूनी रूप से) एक निश्चित मात्रा से अधिक ऑर्डर करने पर उनकी कर दर को बदलने की आवश्यकता होती है। जब आप कार्ट में एक नया उत्पाद जोड़ते हैं, तो मुझे यह काम करने के लिए विभिन्न कर मॉडलों को बढ़ाया जाता है, लेकिन मुझे तब समस्या होती है जब उपयोगकर्ता कार्ट में मात्रा को अपडेट करता है या अतिरिक्त उत्पादों को जोड़ता है जो थ्रेशोल्ड पर पहले से ही कार्ट में मात्राओं को टिप देते हैं रकम।

समस्या 1:

सबसे पहले, मैं 100% नहीं हूँ जो घटना (ओं) को निरीक्षण करने के लिए है। मैंने निम्नलिखित कोशिश की है;

checkout_cart_save_after(इस पर आधारित -> https://stackoverflow.com/questions/14362702/magento-programatically-update-cart-via-event )

checkout_cart_update_items_after(इस पर आधारित -> https://stackoverflow.com/questions/5104482/programmatically-add-product-to-cart-with-price-change )

sales_quote_save_before(इस पर आधारित -> https://stackoverflow.com/questions/7638858/magento-recalculate-cart-total-in-observer )

समस्या 2:

मैं कार्ट से उद्धरण आइटम तक पहुंचने में सक्षम हूं, ऐसा करने के तरीकों का भार है कि ऐसा लगता है। मैं कार्ट में अलग-अलग वस्तुओं के माध्यम से पुनरावृति करने में सक्षम हूं, उन वस्तुओं के गुणों को अपडेट करें और फिर आइटम (कम से कम अस्थायी रूप से) को बचाएं। हालांकि, मैं तब बोली को बचाने और चेकआउट में करों को पुनर्गठित करने में सक्षम नहीं हूं।

इसका एक कारण यह है कि जब तक मैं कार्ट उद्धरण का उपयोग कर सकता हूं, मुझे यकीन नहीं है कि इसे लिखने के लिए कौन सी विधि का उपयोग किया जा सकता है।

मैंने क्या प्रयास किया है:

मैंने अपने द्वारा देखी गई घटना पर निर्भर करते हुए कार्ट की सामग्री तक पहुँचने की कोशिश की है, लेकिन मैंने निम्नलिखित सभी की कोशिश की है;

1. 
$item = $observer->getQuoteItem;

2.
$cart = Mage::getSingleton('checkout/cart');
$cartItems = $cart->getCart()->getItems(); 

3.
$cart = $observer->getData('cart');
$quote = $cart->getData('quote');
$cartItems = $quote->getAllVisibleItems();

4.
$cartHelper = Mage::helper('checkout/cart');
$cartItems = $cartHelper->getCart()->getItems(); 

5.
$quote = Mage::getModel('checkout/cart');
$cartItems = $quote->getItems(); 

ऐसा लगता है कि कम से कम मुझे उद्धरण तक पहुँचने की अनुमति है, उनके माध्यम से चलाएं और आइटम को अपडेट करें

6.
$quote = Mage::getSingleton('checkout/session')->getQuote();
$cartItems = $quote->getAllVisibleItems();

यह मुझे प्रत्येक उद्धरण आइटम को अपडेट करने की अनुमति देता है, जब मैं इसके माध्यम से पुनरावृति करता हूं (मुझे विश्वास है कि मैं जादू बसने वालों का उपयोग कर सकता हूं क्योंकि मुझे कोई संगत विधियां नहीं मिल सकती हैं)। मैं उद्धरण आइटम के लिए टैक्स क्लास आईडी को अपडेट करने और फिर करों को पुनर्गणना करने में सक्षम होने की उम्मीद कर रहा था। यदि मैं निम्नलिखित का उपयोग करता हूं (जहां $ टैक्सक्लासआईड प्रत्येक उद्धरण आइटम द्वारा पहले से ही उपयोग किए गए के लिए अलग है);

$item->setTaxClassId( $taxClassId );
$item->getProduct()->setIsSuperMode(true);
$item->save;

और फिर परिणाम लॉग करें;

Mage::log($item->debug(), null,'taxobserver.log', true);

यह दिखाता है कि मैंने वास्तव में इस उद्धरण आइटम को अपडेट किया है और कर आईडी को बदल दिया है। हालाँकि, अगर मैं इसके माध्यम से अनुसरण करता हूं और संशोधित उद्धरण को बचाने की कोशिश करता हूं;

$quote->setTotalsCollectedFlag(false)->collectTotals();
$quote->save();     

और फिर फिर से डीबग करें;

Mage::log($item->debug(), null,'taxobserver.log', true);

मेरे परिवर्तन सहेजे नहीं गए हैं, उद्धरण आइटम परिवर्तन को रीसेट कर दिया गया है और कार्ट योगों को पुनर्गणना नहीं की गई है। आश्चर्यचकित होना शुरू हो जाता है कि कूदने के लिए एक ऊंची इमारत ढूंढना इस के लिए समाधान हो सकता है।


कृपया किसी को भी इसे हल करने में मेरी मदद करें: stackoverflow.com/questions/27978781/… धन्यवाद।
सतीश

जवाबों:


35

मेरा सुझाव उस sales_quote_collect_totals_beforeघटना पर एक पर्यवेक्षक लगाना होगा जो Mage_Sales_Model_Quote::collectTotalsकुल संग्रह प्रक्रिया शुरू करने से पहले विधि में निकाल दिया जाता है। फिर इस ऑब्जर्वर विधि के अंदर से, उद्धरण आइटम को पुनरावृत्त करें और (पहले से लोड किए गए) उत्पाद ऑब्जेक्ट पर कर वर्ग को बदल दें जिसे आप उद्धरण आइटम से पुनर्प्राप्त कर सकते हैं।

आपके द्वारा उत्पाद ऑब्जेक्ट पर जानकारी सेट करने के बाद, आप जो भी करते हैं, उसे डेटाबेस में सहेजने का प्रयास न करें। स्मृति में उत्पाद ऑब्जेक्ट पर आवश्यकतानुसार कर वर्ग सेट होने से, एकत्र किए गए कुल योग तर्क के लिए पर्याप्त अच्छा होगाMage_Tax_Model_Sales_Total_Quote_Tax पिकअप जिस पर यह गणना करनी चाहिए वह किस वर्ग के आधार पर होनी चाहिए। उत्पाद को सहेजना (जैसा कि आप ऊपर दिए गए अपने कोड नमूने में करने की कोशिश कर रहे हैं) प्रमुख प्रदर्शन मुद्दों का कारण होगा, गणना प्रक्रिया में दौड़ की स्थिति पैदा करेगा, और बस अच्छा अभ्यास नहीं है।

कारण यह है कि आप जिन घटनाओं के साथ काम करने की कोशिश कर रहे हैं वे आपको यह पूरा करने में सक्षम नहीं कर रहे हैं कि आप क्या हासिल करने की कोशिश कर रहे हैं क्योंकि वे सभी कुल गणना के बाद आते हैं, एक प्रक्रिया जो केवल बोली को बचाने से पहले एक बार चलाई जाती है।

कलेक्ट टोटल्स प्रक्रिया के बारे में बताने के लायक यह है कि एक बार चलाने के बाद, अतिरिक्त काम किए बिना, आप इसे फिर से कॉल नहीं कर सकते हैं कि आपके द्वारा उद्धरण आइटम में किए गए परिवर्तनों के आधार पर इसे फिर से गणना करें। इस टाई-बिट को देखें, जो मैंने ब्लॉग श्रृंखला से लिया है, मेरा एक सहयोगी हाल ही में एकत्रित योग प्रक्रिया पर एक साथ रखा गया है:

अब जब आप समझते हैं कि योग संग्रह प्रक्रिया के दौरान क्या होता है, तो आप इसे सुविधाजनक या आवश्यक रूप से सीधे स्वयं कह सकते हैं। इससे पहले कि आप अपने स्वयं के प्रयोजनों के लिए संग्रहणीय का उपयोग करने के साथ बहुत आत्मविश्वास महसूस करना शुरू करें, हालांकि, निम्नलिखित नियम को ध्यान में रखें:

संग्रह के चलने के बाद उत्पादों को उद्धरण में नहीं जोड़ा जा सकता है!

। । । जब तक कि कोट्स के आइटम कैश साफ़ नहीं हो जाते।

लगभग हर कुल मॉडल की "कलेक्ट" विधि पते से उद्धरण आइटम प्राप्त करने और उनके माध्यम से लूप करने पर निर्भर करती है। पहली बार getAllItems एक उद्धरण पते पर चलाया जाता है, आइटम संग्रह वास्तव में एक अद्वितीय कुंजी के साथ कैश किया जाता है, और यह यह कैश्ड संग्रह है जिसे बाद की कॉल पर वापस किया जाता है।

यदि आप वास्तव में डाइविंग प्रक्रिया को इकट्ठा करने की प्रक्रिया की गहराई में डाइविंग करने के लिए करते हैं, तो आप कुल संग्रह पर चार भाग श्रृंखलाओं में से पहले की जाँच कर सकते हैं यहाँ और अधिक गहराई से पढ़ने के लिए: Unvelveling Magento के संग्रहपत्र: परिचय

संक्षेप में, आपको एक ऐसी घटना को पकड़ने की आवश्यकता है, जो एकत्र योग प्रक्रिया से पहले चलती है (और getAllItems से पहले उद्धरण पते पर कहा जाता है) ताकि आपके द्वारा आइटम में किए गए परिवर्तन कुल कलेक्टरों द्वारा उपयोग किए जाएंगे। मैंने सत्यापित नहीं किया है कि सुझाए गए sales_quote_collect_totals_beforeईवेंट getAllItemsउद्धरण पते पर किसी भी कॉल से पहले चलता है , लेकिन मैं लगभग निश्चित हूं कि यह आपकी जरूरत के लिए काम करेगा। यदि नहीं, तो उम्मीद है कि मैंने आपके लिए यह सुनिश्चित करने के लिए पर्याप्त संदर्भ प्रदान किया है कि किस घटना को आपको इसे काम करने के लिए पकड़ना होगा।


यह उत्तर इस बात से परे है कि मैं किस चीज की आशा करता हूं। शानदार, समय निकालने के लिए धन्यवाद। शानदार जवाब।
मैकनाब

अरे! इस पर सारा दिन बिताने और इसे काम करने के लिए नहीं मिलने के बाद II को आखिरकार एहसास हुआ कि यह मॉड्यूल में कहीं और बुरी तरह से फिर से लिखे गए मॉडल के लिए था। यह पूरी तरह से काम करता है और मैंने इससे भार सीखा है, फिर से धन्यवाद डेविड।
मैकनाब

@McNab आपको यह सुनकर खुशी हुई कि यह काम कर रहा है। निश्चित रूप से Magento के अधिक जटिल क्षेत्रों में से एक के साथ निपटा जा रहा है। :)
डेविडलगर

लिंक किए गए ब्लॉग पर +1। मैंने इसे पहली बार पढ़ने के दौरान अनदेखा किया। यह एक बड़ी मदद है।
pspahn

6

एक और घटना है: sales_quote_item_set_productMage_Sales_Model_Quote_Item :: setProduct में

Mage::dispatchEvent('sales_quote_item_set_product', array(
            'product' => $product,
            'quote_item'=>$this
        ));

आप इस घटना का उपयोग करके उत्पाद कर वर्ग को संशोधित कर सकते हैं। कार्ट में जोड़े गए मात्रा को खोजने के लिए quotItem getQty विधि का उपयोग करें।


इसके लिए धन्यवाद, यह जानना उपयोगी है - मुझे @ davidalger के उत्तर के आधार पर पता चलता है कि मुझे उत्पाद के कर वर्ग को अब संशोधित नहीं करना चाहिए, लेकिन उद्धरण मॉडल। हालांकि जानकर अच्छा लगा।
मैकनाब

ठीक है, आप वास्तव में उद्धरण आइटम कर वर्ग को संशोधित कर सकते हैं, आपके पास ईवेंट में quotItem ऑब्जेक्ट तक पहुंच भी है।
पांडावेबस्टेडो

आह ठीक है - मैं गलत समझा। स्पष्ट करने के लिए धन्यवाद :)
McNab

@PandaWebStudio, बोली वस्तु के लिए कस्टम टैक्स राशि कैसे सेट करें? यहाँ मेरा सवाल है, magento.stackexchange.com/questions/274520/…
jafar pinjar

2

शायद टैक्सक्लास को बदलने की कोशिश करना सबसे अच्छा तरीका नहीं हो सकता है। उन उत्पादों के लिए एक समान उत्पाद क्यों नहीं बनाते हैं जो उच्च कर वर्ग का उपयोग करते हैं और उस उत्पाद के लिए कार्ट में न्यूनतम मात्रा निर्धारित करते हैं। तब का उपयोग करेंcheckout_cart_update_items_after कार्ट में कुल मात्रा के आधार पर उत्पादों को स्वैप करने लिए ?

यह निश्चित रूप से एक 'सर्वोत्तम अभ्यास' नहीं है, लेकिन यह आपको दूसरी दिशा में सोचने में मदद कर सकता है।

वैकल्पिक रूप से http://www.mageworx.com/multi-fees-magento-extension.html के साथ कुछ स्थापित करने का प्रयास करें जहां आप अतिरिक्त कर के लिए एक 'शुल्क' जोड़ते हैं। यह वास्तव में इसे करने का एक अच्छा तरीका हो सकता है, लेकिन यह एक अतिरिक्त आदेश कुल लाइन के रूप में कर योगों में नहीं दिखाएगा।


उत्तर सैंडर के लिए धन्यवाद। यह एक अच्छा विचार है और मैंने इसके बारे में नहीं सोचा था। मैं आपको बताता हूं कि मुझे यह क्यों नहीं पसंद है कि - अंतर्निहित उत्पाद सभी चल रहे हैं हालांकि Unirgy का uMarketplace सुइट है और यह एक कार्य का एक राक्षस है जहां इसे पाने के लिए यह मूल्य तुलना साइट के रूप में चल रहा है। मुझे लगता है कि यह एक बड़ा काम हो सकता है। अगर मुझे यह उद्धरण आइटम अपडेट नहीं मिल रहा है तो मुझे इसे देखना होगा।
मैकनाब

धिक्कार है, मैं आपके उत्तर को भी नहीं बढ़ा सकता क्योंकि मैंने इस इनाम पर अपना सारा प्रतिनिधि खर्च कर दिया है! +1 :) जब मैं कुछ और बढ़ाऊंगा
मैकनाब

हाहा कोई समस्या नहीं है, मैं इस मुद्दे को समझता हूं और यह मामले के लिए एक अच्छा समाधान नहीं होगा। मैं शायद multifees तो साथ जाना चाहते हैं, कि एक 'क्लीनर' समाधान है
Sander Mangel

एफडब्ल्यूआईडब्ल्यू, मैं इस मार्ग का सुझाव नहीं दूंगा ... केवल अगर यह बिक्री और ट्रैकिंग सूची के लिए लेखांकन को एक संभावित दुःस्वप्न बना देगा। जैसा कि ओपी ने कहा, सबसे अच्छा अभ्यास नहीं है, लेकिन मैं जोड़ूंगा: यह हल करने की तुलना में अधिक परेशानियों का कारण होगा।
davidalger

0

इसे इस्तेमाल करो <sales_quote_collect_totals_before>

और अपने कार्य में पसंद करते हैं

 public function quoteCollectTotalsBefore(Varien_Event_Observer $observer)
    $quote = $observer->getQuote();
    foreach ($quote->getAllItems() as $item)
    {
        $product = $item->getProduct();
        $product->setTaxClassId($product_tax_class_id);
    }
 }

मुझे उम्मीद है कि यह निश्चित रूप से काम करेगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.