Saya memiliki kategori produk yang (secara hukum) perlu mengubah tarif pajaknya saat Anda memesan lebih dari jumlah tertentu. Saya telah memperluas berbagai model pajak agar ini berfungsi ketika Anda menambahkan produk baru ke troli, tetapi saya mengalami masalah ketika pengguna memperbarui jumlah di troli atau menambahkan produk tambahan yang memberi tip jumlah yang sudah ada di troli melewati ambang jumlah.
Masalah 1:
Pertama-tama, saya tidak 100% acara yang harus diamati. Saya sudah mencoba yang berikut ini;
checkout_cart_save_after
(berdasarkan ini -> https://stackoverflow.com/questions/14362702/magento-programatically-update-cart-via-event )
checkout_cart_update_items_after
(berdasarkan ini -> https://stackoverflow.com/questions/5104482/programmatically-add-product-to-cart-with-price-change )
sales_quote_save_before
(berdasarkan ini -> https://stackoverflow.com/questions/7638858/magento-recalculate-cart-total-in-observer )
Masalah 2:
Saya dapat mengakses item kutipan dari troli, ada banyak cara untuk melakukannya. Saya juga dapat melakukan iterasi melalui item individual di troli, memperbarui properti item tersebut dan kemudian menyimpan item (setidaknya untuk sementara). Namun, saya tidak dapat menyimpan kutipan dan menghitung kembali pajak di kasir.
Sebagian alasannya adalah bahwa sementara saya dapat mengakses kutipan keranjang, saya tidak yakin metode mana yang digunakan untuk dapat menulis kepadanya.
Apa yang Sudah Saya Coba:
Apa yang saya coba dalam hal mengakses isi troli tergantung pada peristiwa yang saya amati tetapi saya sudah mencoba semua hal berikut;
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();
Salah satu yang tampaknya setidaknya memungkinkan saya untuk mengakses kutipan, menjalankannya dan memperbarui item
6.
$quote = Mage::getSingleton('checkout/session')->getQuote();
$cartItems = $quote->getAllVisibleItems();
Ini memungkinkan saya untuk memperbarui setiap item kutipan ketika saya mengulanginya (saya percaya menggunakan setter ajaib karena saya tidak dapat menemukan metode yang sesuai). Saya berharap dapat memperbarui ID Kelas Pajak untuk item penawaran dan kemudian menghitung ulang pajak. Jika saya menggunakan yang berikut (di mana $ taxClassId berbeda dengan yang sudah digunakan oleh setiap item penawaran);
$item->setTaxClassId( $taxClassId );
$item->getProduct()->setIsSuperMode(true);
$item->save;
Dan kemudian catat hasilnya;
Mage::log($item->debug(), null,'taxobserver.log', true);
Ini menunjukkan bahwa saya memang memperbarui item kutipan ini dan mengubah ID pajak. Namun, jika saya kemudian menindaklanjuti dan mencoba menyimpan kutipan yang dimodifikasi;
$quote->setTotalsCollectedFlag(false)->collectTotals();
$quote->save();
Dan kemudian debug lagi;
Mage::log($item->debug(), null,'taxobserver.log', true);
Perubahan saya belum disimpan, perubahan item kutipan telah diatur ulang dan total keranjang tidak dihitung ulang. Mulai bertanya-tanya apakah menemukan gedung tinggi untuk melompat mungkin menjadi solusi untuk yang satu ini.
sumber
Jawaban:
Saran saya adalah menempatkan pengamat pada
sales_quote_collect_totals_before
acara yang dipecat diMage_Sales_Model_Quote::collectTotals
metode sebelum memulai proses pengumpulan total. Kemudian dari dalam metode pengamat ini, ulangi item-item kuotasi dan ubah kelas pajak pada objek produk (yang sudah dimuat) yang dapat Anda ambil dari item kuotasi.Setelah Anda mengatur informasi tentang objek produk, apa pun yang Anda lakukan, JANGAN mencoba dan menyimpannya ke database. Memiliki kelas pajak yang ditetapkan sesuai kebutuhan pada objek produk dalam memori akan cukup baik untuk memiliki logika kumpulkan total yang ditemukan di
Mage_Tax_Model_Sales_Total_Quote_Tax
kelas pajak mana yang harus dijadikan dasar perhitungannya. Menyimpan produk (seperti yang Anda coba lakukan dalam contoh kode Anda di atas) akan menyebabkan masalah kinerja utama, akan menciptakan kondisi balapan dalam proses perhitungan, dan sama sekali bukan praktik yang baik.Alasan bahwa peristiwa yang Anda coba kerjakan tidak memungkinkan Anda untuk mencapai apa yang ingin Anda capai adalah karena semuanya datang setelah perhitungan total, suatu proses yang hanya dijalankan sekali sebelum menyimpan kutipan.
Layak menunjukkan tentang proses kumpulkan total adalah bahwa sekali dijalankan, tanpa melakukan pekerjaan tambahan, Anda tidak dapat memanggilnya lagi untuk menghitung ulang berdasarkan perubahan yang Anda buat pada item penawaran. Lihat tie-bit yang saya ambil dari seri blog ini yang baru-baru ini dikumpulkan oleh rekan saya dalam proses kumpulkan total:
Jika Anda benar-benar memiliki firasat untuk benar-benar menyelam ke kedalaman bagaimana proses pengumpulan total bekerja, Anda dapat memeriksa seri pertama dari empat bagian tentang pengumpulan total di sini untuk bacaan lebih mendalam: Mengurai koleksi Magento'sTotals: Pendahuluan
Untuk meringkas, Anda harus menangkap suatu peristiwa yang berjalan sebelum proses kumpulkan total (dan sebelum getAllItems dipanggil pada alamat kutipan) sehingga perubahan yang Anda buat pada item akan digunakan oleh total pengumpul. Saya belum memverifikasi bahwa
sales_quote_collect_totals_before
acara yang disarankan berjalan sebelum ada panggilan kegetAllItems
pada alamat kutipan, tapi saya hampir yakin itu akan bekerja untuk apa yang Anda butuhkan. Tetapi jika tidak, mudah-mudahan saya telah memberikan konteks yang cukup bagi Anda untuk mencari tahu acara mana yang perlu Anda tangkap untuk membuatnya bekerja.sumber
Ada acara lain:
sales_quote_item_set_product
di Mage_Sales_Model_Quote_Item :: setProductAnda dapat memodifikasi kelas pajak produk menggunakan acara ini. Gunakan metode getQty quoteItem untuk menemukan jumlah yang ditambahkan ke keranjang.
sumber
Mungkin mencoba mengubah kelas pajak mungkin bukan pendekatan terbaik. Mengapa tidak membuat produk serupa untuk produk-produk yang menggunakan kelas pajak yang lebih tinggi dan tentukan jumlah minimum dalam keranjang untuk produk itu. Kemudian gunakan
checkout_cart_update_items_after
untuk menukar produk berdasarkan jumlah total dalam keranjang?Ini jelas bukan 'praktik terbaik' tetapi mungkin membantu Anda berpikir ke arah lain.
Atau coba atur sesuatu dengan http://www.mageworx.com/multi-fees-magento-extension.html di mana Anda menambahkan 'biaya' untuk pajak tambahan. Ini mungkin sebenarnya cara yang lebih baik untuk melakukannya tetapi tidak akan muncul dalam total pajak, lebih sebagai total baris pesanan tambahan.
sumber
Gunakan ini
<sales_quote_collect_totals_before>
dan dalam fungsi Anda suka
Saya harap ini akan bekerja dengan pasti
sumber