Ho una categoria di prodotti che (legalmente) devono cambiare l'aliquota fiscale quando ordini più di un determinato quantitativo. Ho esteso i vari modelli fiscali per farlo funzionare quando aggiungi un nuovo prodotto al carrello, ma sto riscontrando problemi quando l'utente aggiorna le quantità nel carrello o aggiunge altri prodotti che ribaltano le quantità già presenti nel carrello oltre la soglia quantità.
Problema 1:
Prima di tutto, non sono al 100% quale evento (i) da osservare. Ho provato quanto segue;
checkout_cart_save_after
(basato su questo -> https://stackoverflow.com/questions/14362702/magento-programmatic-update-cart-via-event )
checkout_cart_update_items_after
(basato su questo -> https://stackoverflow.com/questions/5104482/programmatical-add-product-to-cart-with-price-change )
sales_quote_save_before
(basato su questo -> https://stackoverflow.com/questions/7638858/magento-recalculate-cart-total-in-observer )
Problema 2:
Sono in grado di accedere agli articoli di preventivo dal carrello, ci sono molti modi per farlo, a quanto pare. Sono anche in grado di scorrere i singoli articoli nel carrello, aggiornare le proprietà di tali articoli e quindi salvare gli articoli (almeno temporaneamente). Tuttavia, non sono quindi in grado di salvare il preventivo e ricalcolare le tasse alla cassa.
Parte del motivo è che mentre posso accedere al preventivo del carrello, non sono sicuro del metodo da utilizzare per poterlo scrivere.
Quello che ho provato:
Quello che ho provato in termini di accesso al contenuto del carrello è dipeso dall'evento che ho osservato ma ho provato tutto quanto segue;
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();
Quello che sembra almeno consentirmi di accedere al preventivo, scorrerli e aggiornare gli articoli è
6.
$quote = Mage::getSingleton('checkout/session')->getQuote();
$cartItems = $quote->getAllVisibleItems();
Questo mi permette di aggiornare ogni elemento di preventivo quando eseguo l'iterazione (credo di usare setter magici in quanto non riesco a trovare alcun metodo corrispondente). Speravo di poter aggiornare l'ID della classe di imposta per l'articolo di preventivo e quindi ricalcolare le tasse. Se utilizzo quanto segue (dove $ taxClassId è diverso da quello già utilizzato da ciascun elemento di preventivo);
$item->setTaxClassId( $taxClassId );
$item->getProduct()->setIsSuperMode(true);
$item->save;
E quindi registra i risultati;
Mage::log($item->debug(), null,'taxobserver.log', true);
Indica che ho effettivamente aggiornato questo articolo di preventivo e modificato l'ID fiscale. Tuttavia, se poi seguo e provo a salvare il preventivo modificato;
$quote->setTotalsCollectedFlag(false)->collectTotals();
$quote->save();
E quindi eseguire nuovamente il debug;
Mage::log($item->debug(), null,'taxobserver.log', true);
Le mie modifiche non sono state salvate, la modifica dell'articolo preventivo è stata ripristinata e i totali del carrello non vengono ricalcolati. Iniziare a chiedersi se trovare un edificio alto per saltare potrebbe essere la soluzione per questo.