কার্টের উদ্ধৃতি আইটেমগুলিতে করের হারটি সংশোধন করুন এবং পুনরায় গণনা করুন


31

আমার কাছে এমন একটি বিভাগের পণ্য রয়েছে যা যখন আপনি নির্দিষ্ট পরিমাণের চেয়ে বেশি অর্ডার দিচ্ছেন তখন (আইনগতভাবে) তাদের করের হার পরিবর্তন করা দরকার। আপনি কার্টে নতুন পণ্য যুক্ত করার সময় আমি এই কাজটি করার জন্য বিভিন্ন করের মডেলগুলি প্রসারিত করেছি, তবে যখন ব্যবহারকারী কার্টের পরিমাণগুলি আপডেট করে বা অতিরিক্ত পণ্য যুক্ত করে যা কার্টের মধ্যে ইতিমধ্যে থ্রেশহোল্ডের উপরের পরিমাণগুলি টিপ দেয় তখন আমার সমস্যা হয় পরিমাণ।

সমস্যা 1:

প্রথমত, আমি কোন ইভেন্ট (গুলি) পালন করব তা 100% নই। আমি নিম্নলিখিত চেষ্টা করেছি;

checkout_cart_save_after(এর উপর ভিত্তি করে -> https://stackoverflow.com/questions/14362702/magento-programatic-update-cart-via-event )

checkout_cart_update_items_after(এর উপর ভিত্তি করে -> https://stackoverflow.com/questions/5104482/programmatic-add-product-to-cart-with-price- পরিবর্তন )

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();

আমি যখন পুনরাবৃত্তি করি তখন প্রতিটি উদ্ধৃতি আইটেম আপডেট করার অনুমতি দেয় (আমি বিশ্বাস করি যে যাদু সেটটারগুলি ব্যবহার করে কারণ আমি কোনও সম্পর্কিত পদ্ধতি খুঁজে পাচ্ছি না)। আমি উদ্ধৃত আইটেমের জন্য ট্যাক্স ক্লাসের আইডি আপডেট করতে সক্ষম হবো এবং তারপরে করগুলি পুনরায় গণনা করতে সক্ষম হব। আমি যদি নিম্নলিখিতটি ব্যবহার করি (যেখানে qu ট্যাক্সক্লাসআইড প্রতিটি উদ্ধৃতি আইটেম দ্বারা ইতিমধ্যে ব্যবহৃত একের চেয়ে আলাদা);

$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মোট সংগ্রহ প্রক্রিয়া শুরুর আগে পদ্ধতিতে বরখাস্ত হওয়া ইভেন্টটিতে একটি পর্যবেক্ষক রাখুন । তারপরে এই পর্যবেক্ষক পদ্ধতির অভ্যন্তর থেকে, উদ্ধৃতি আইটেমগুলি পুনরাবৃত্তি করুন এবং কোট আইটেমটি থেকে উদ্ধার করতে পারেন (ইতিমধ্যে লোড হওয়া) পণ্য বস্তুতে কর শ্রেণি পরিবর্তন করুন change

আপনি পণ্যের বস্তুতে তথ্য সেট করার পরে, আপনি যা কিছু করেন না কেন, চেষ্টা করবেন না এবং এটি ডাটাবেসে সংরক্ষণ করবেন না। মেমোরিতে পণ্য সামগ্রীতে প্রয়োজনীয় হিসাবে ট্যাক্স শ্রেণীর সেট করা Mage_Tax_Model_Sales_Total_Quote_Taxপিকআপে সংগ্রহের মোট যুক্তি যুক্ত করার পক্ষে যথেষ্ট হবে যেটি কর শ্রেণীর উপর নির্ভর করে তার গণনার ভিত্তি করা উচিত। পণ্যটি সংরক্ষণ করার (যেমন আপনি নিজের কোডের নমুনায় উপরের দিকে চেষ্টা করার চেষ্টা করছেন বলে মনে করছেন) বড় পারফরম্যান্সের সমস্যা সৃষ্টি করবে, গণনা প্রক্রিয়ায় রেসের পরিস্থিতি তৈরি করবে এবং এটি সহজ অভ্যাস নয়।

আপনি যে ইভেন্টগুলির সাথে কাজ করার চেষ্টা করছেন তার কারণ আপনি যা অর্জন করতে চাইছেন তা সম্পাদন করতে সক্ষম করছে না কারণ এগুলি সমস্ত মোট গণনার পরে আসে, একটি প্রক্রিয়া যা উদ্ধৃতি সংরক্ষণের আগে একবার চালানো হয়।

সংগ্রহের মোট সংগ্রহ প্রক্রিয়াটি উল্লেখ করার মতো মূল্য হ'ল একবার অতিরিক্ত কাজ না করে চালানো, আপনি উদ্ধৃতি আইটেমগুলিতে যে পরিবর্তনগুলি করেছেন তার উপর ভিত্তি করে এটি পুনরায় গণনা করার জন্য আপনি এটিকে আবার কল করতে পারবেন না। এই টাই-বিটটি দেখুন আমি সম্প্রতি ব্লগ সিরিজ থেকে সংগ্রহ করেছি মোট সংগ্রহ প্রক্রিয়াটিতে একত্রে আমার একটি চালিকা:

মোট সংগ্রহ প্রক্রিয়া চলাকালীন কী ঘটেছিল তা এখন আপনি বুঝতে পেরেছেন, আপনি নিজেরাই সরাসরি এটি কল করা সুবিধাজনক বা প্রয়োজনীয় বলে মনে করতে পারেন। আপনার নিজের উদ্দেশ্যে সংগ্রহটোটাল ব্যবহার করে খুব আত্মবিশ্বাস বোধ করার আগে, নীচের নিয়মটি মাথায় রাখুন:

সংগ্রহশালার চালুর পরে পণ্যগুলি উদ্ধৃতিতে যুক্ত করা যায় না!

। । । যদি না উদ্ধৃতি ঠিকানার আইটেম ক্যাশে সাফ হয়।

প্রায় প্রতিটি মোট মডেলের "সংগ্রহ" পদ্ধতি ঠিকানা থেকে উদ্ধৃতি আইটেম আনতে এবং সেগুলির মধ্য দিয়ে লুপিংয়ের উপর নির্ভর করে। প্রথমবার getAllItems একটি উদ্ধৃতি ঠিকানায় চালানো হয়, আইটেম সংগ্রহটি আসলে একটি অনন্য কী দিয়ে ক্যাশে হয় এবং এটি এই ক্যাশেড সংগ্রহ যা পরবর্তী কলগুলিতে ফিরে আসে।

সংগ্রহের মোট প্রক্রিয়া কীভাবে কাজ করে তার গভীরতায় ডাইভিংয়ের জন্য যদি আপনার কালি খাঁটি হয়ে পড়ে থাকে তবে আপনি আরও সংগ্রহের আরও গভীরতার সাথে এখানে মোট সংগ্রহের চারটি অংশের সিরিজের প্রথমটি পরীক্ষা করতে পারেন : ম্যাগান্তোর সংগ্রহশালাটি অবমুক্ত করা: পরিচিতি

সংক্ষিপ্তসার হিসাবে, আপনি সংগ্রহের মোট প্রক্রিয়া করার আগে চলমান একটি ইভেন্টটি ধরা দরকার (এবং getAllItems এর উদ্ধৃতি ঠিকানাগুলিতে ডাকা হওয়ার আগে) যাতে আপনার আইটেমগুলিতে করা পরিবর্তনগুলি মোট সংগ্রহকারীরা ব্যবহার করবেন। আমি যাচাই করে দেখিনি যে প্রস্তাবিত sales_quote_collect_totals_beforeইভেন্টটি getAllItemsউদ্ধৃতি ঠিকানায় কোনও কল করার আগে চলে , তবে আমি নিশ্চিত যে এটি আপনার প্রয়োজনীয়তার জন্য কাজ করবে almost তবে যদি তা না হয়, তবে আশা করি যে কোনও ইভেন্টটি এটির কাজ করতে আপনাকে ধরতে হবে তা নির্ধারণ করার জন্য আমি আপনার জন্য যথেষ্ট প্রসঙ্গ সরবরাহ করেছি।


এই উত্তরটি আমি যা আশা করেছিলাম তার বাইরেও। উজ্জ্বল, সময় দেওয়ার জন্য ধন্যবাদ। চমত্কার উত্তর।
ম্যাকনাব

আহা! এটিতে সারা দিন ব্যয় করার পরে এবং এটি II তে কাজ না করার পরে অবশেষে বুঝতে পেরেছিল যে এটি মডিউলের অন্য কোথাও খারাপভাবে পুনর্লিখন করা মডেলের কাছে নেমে গেছে। এটি নিখুঁতভাবে কাজ করে এবং আমি এগুলি থেকে বোঝা শিখলাম, আবার ডেভিডকে ধন্যবাদ।
ম্যাকনাব

আপনি এটি কাজ করে শুনে শুনে এমসনাব খুশী হন। অবশ্যই মোকেন্তোর অন্যতম জটিল ক্ষেত্রের সাথে মোকাবিলা করা হচ্ছে। :)
ডেভিডালগার

লিঙ্কযুক্ত ব্লগে +1 করুন। আমি প্রথম কয়েকবার এটি পড়েছি over এটি একটি বড় সাহায্য।
pspahn

6

আর একটি ইভেন্ট রয়েছে: sales_quote_item_set_productম্যাজেস_সেলস_মোডেল_কোট_আইটেম :: সেট প্রোডাক্ট

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

আপনি এই ইভেন্টটি ব্যবহার করে পণ্য কর শ্রেণিটি সংশোধন করতে পারেন। কার্টে যুক্ত হওয়া কোটিটি খুঁজে পেতে উদ্ধৃতি আইটেম গেটকিটি পদ্ধতিটি ব্যবহার করুন।


এর জন্য ধন্যবাদ, এটি জেনে রাখা কার্যকর - আমি @ ডেভিডালারের উত্তরের ভিত্তিতে উপলব্ধি করেছিলাম যে এখন আমার পণ্যের কর শ্রেণিটি পরিবর্তন করা উচিত নয়, তবে উদ্ধৃতি মডেল। যদিও জানা ভাল।
ম্যাকনাব

ঠিক আছে, আপনি আসলে কোট আইটেম ট্যাক্স ক্লাসটি সংশোধন করতে পারেন, আপনার ইভেন্টটিতে কোট আইটেম অবজেক্টে অ্যাক্সেসও রয়েছে।
পান্ডা ওয়েবেস্টুডিও

আহ ঠিক আছে - আমি ভুল বুঝেছি। স্পষ্ট করার জন্য ধন্যবাদ :)
ম্যাকনাব

@ পান্ডাওয়েব স্টুডিও, কোট আইটেমের জন্য কাস্টম ট্যাক্সের পরিমাণ কীভাবে সেট করবেন? এখানে আমার প্রশ্নটি রয়েছে, magento.stackexchange.com/Qestions/274520/…
জাফর পিনজার

2

হয়তো ট্যাক্সক্লাস পরিবর্তন করার চেষ্টা সেরা পন্থা নাও হতে পারে। যেসব পণ্য উচ্চতর কর শ্রেণি ব্যবহার করে এবং সেই পণ্যটির জন্য কার্টে একটি ন্যূনতম পরিমাণ নির্ধারণ করে কেন তাদের জন্য অনুরূপ পণ্য তৈরি করা হয় না। তারপরে checkout_cart_update_items_afterকার্টের মোট পরিমাণের উপর নির্ভর করে পণ্যগুলি অদলবদল করতে ব্যবহার করবেন ?

এটি অবশ্যই 'সেরা অনুশীলন' নয় তবে এটি আপনাকে অন্য দিকে ভাবতে সহায়তা করতে পারে।

বিকল্পভাবে http://www.mageworx.com/m Multi-fees-magento-extension.html দিয়ে কিছু সেট আপ করার চেষ্টা করুন যেখানে আপনি অতিরিক্ত শুল্কের জন্য 'ফি' যুক্ত করেন। এটি বাস্তবে এটি করার একটি দুর্দান্ত উপায় হতে পারে তবে এটি অতিরিক্ত করের মোট লাইন হিসাবে আরও বেশি করে করের মধ্যে প্রদর্শিত হবে না।


উত্তর স্যান্ডার জন্য ধন্যবাদ। এটি একটি ভাল ধারণা এবং আমি এটি সম্পর্কে চিন্তাও করি নি। আমি কেন বলব যে আমি কেন অভিনব নই - অন্তর্নিহিত পণ্যগুলি সমস্ত চলমান রয়েছে যদিও ইউনিরজির ইউমার্কেটপ্লেস স্যুট এবং এটি কোনও টাস্কের দানব হিসাবে এটি এটি যেখানে দামের তুলনা সাইট হিসাবে চলছে তেমন এটি পৌঁছে দেওয়া। আমি মনে করি এটি বড় কাজ হতে পারে। আমি যদি এই উদ্ধৃতি আইটেমটি আপডেট না করতে পারি তবে আমাকে এটি দেখতে হবে।
ম্যাকনাব

অভিশাপ, আমি আপনার উত্তরটিকে উজ্জীবিত করতে পারি না কারণ আমি আমার সমস্ত প্রতিবেদন এই অনুগ্রহের পিছনে ব্যয় করেছি! +1 :) যখন আমি আরও কিছু পেয়ে যাব v
ম্যাকনাব

হাহা কোন সমস্যা নেই, আমি বিষয়টি বুঝতে পারি এবং এটি মামলার পক্ষে ভাল সমাধান হতে পারে না। আমি সম্ভবত তখন মাল্টিফাইস নিয়ে যেতাম, এটি একটি 'ক্লিনার' সমাধান
স্যান্ডার ম্যানগেল

এফডাব্লুআইডাব্লু, আমি এই রুটটির পরামর্শ দেব না ... কেবলমাত্র যদি এটি বিক্রয় এবং ট্র্যাকিংয়ের জন্য অ্যাকাউন্টিংয়ের সম্ভাব্য দুঃস্বপ্ন দেখা দেয়। ওপি যেমন বলেছে, সেরা অনুশীলন নয়, তবে আমি যুক্ত করব: এটি সমাধানের চেয়ে আরও বেশি সমস্যার সৃষ্টি করবে।
ডেভিডালগার

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

আমি আশা করি এটি সংজ্ঞায়িতভাবে কাজ করবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.