Tenho uma categoria de produtos que (legalmente) precisam ter sua taxa de imposto alterada quando você está solicitando mais do que uma determinada quantidade. Estendi os vários modelos de impostos para que isso funcione quando você adiciona um novo produto ao carrinho, mas estou com problemas quando o usuário atualiza as quantidades no carrinho ou adiciona produtos adicionais que ultrapassam o limite do carrinho. montante.
Problema 1:
Antes de tudo, não sou 100% dos eventos a serem observados. Eu tentei o seguinte;
checkout_cart_save_after
(com base nisso -> https://stackoverflow.com/questions/14362702/magento-programatically-update-cart-via-event )
checkout_cart_update_items_after
(com base nisso -> https://stackoverflow.com/questions/5104482/programmatically-add-product-to-cart-with-price-change )
sales_quote_save_before
(com base nisso -> https://stackoverflow.com/questions/7638858/magento-recalculate-cart-total-in-observer )
Problema 2:
Consigo acessar os itens de cotação do carrinho, existem várias maneiras de fazer isso ao que parece. Também posso percorrer os itens individuais no carrinho, atualizar as propriedades desses itens e salvá-los (pelo menos temporariamente). No entanto, não consigo salvar a cotação e recalcular os impostos na finalização da compra.
Parte do motivo é que, embora eu possa acessar a cotação do carrinho, não sei ao certo qual método usar para poder escrever nele.
O que eu tentei:
O que eu tentei em termos de acesso ao conteúdo do carrinho dependeu do evento que observei, mas tentei o seguinte;
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();
O que parece pelo menos permitir que eu acesse a cotação, execute-a e atualize os itens é
6.
$quote = Mage::getSingleton('checkout/session')->getQuote();
$cartItems = $quote->getAllVisibleItems();
Isso me permite atualizar cada item de cotação quando iterar (acredito que usando setters mágicos, pois não consigo encontrar nenhum método correspondente). Esperava poder atualizar o ID da classe de imposto para o item de cotação e recalcular os impostos. Se eu usar o seguinte (onde $ taxClassId é diferente daquele já usado por cada item de cotação);
$item->setTaxClassId( $taxClassId );
$item->getProduct()->setIsSuperMode(true);
$item->save;
E então registre os resultados;
Mage::log($item->debug(), null,'taxobserver.log', true);
Isso mostra que eu realmente atualizei este item de cotação e alterei a identificação fiscal. No entanto, se eu seguir adiante e tentar salvar a cotação modificada;
$quote->setTotalsCollectedFlag(false)->collectTotals();
$quote->save();
E então depure novamente;
Mage::log($item->debug(), null,'taxobserver.log', true);
Minhas alterações não foram salvas, a alteração do item de cotação foi redefinida e os totais do carrinho não são recalculados. Começando a pensar se encontrar um prédio alto para pular pode ser a solução para este.