Tengo una categoría de productos a los que (legalmente) se les debe cambiar su tasa de impuestos cuando realiza un pedido de más de una cantidad determinada. He ampliado los diversos modelos de impuestos para que esto funcione cuando agrega un nuevo producto al carrito, pero tengo problemas cuando el usuario actualiza las cantidades en el carrito o agrega productos adicionales que inclinan las cantidades que ya están en el carrito por encima del umbral cantidad.
Problema 1:
En primer lugar, no estoy al 100% de los eventos que debo observar. He intentado lo siguiente;
checkout_cart_save_after
(basado en esto -> https://stackoverflow.com/questions/14362702/magento-programatic-update-cart-via-event )
checkout_cart_update_items_after
(basado en esto -> https://stackoverflow.com/questions/5104482/programmatic-add-product-to-cart-with-price-change )
sales_quote_save_before
(basado en esto -> https://stackoverflow.com/questions/7638858/magento-recalculate-cart-total-in-observer )
Problema 2:
Puedo acceder a los artículos de presupuesto desde el carrito, parece que hay muchas maneras de hacerlo. También puedo iterar a través de los artículos individuales en el carrito, actualizar las propiedades de esos artículos y luego guardarlos (al menos temporalmente). Sin embargo, no puedo guardar la cotización y volver a calcular los impuestos en el proceso de pago.
Parte de la razón es que, si bien puedo acceder a la cotización del carrito, no estoy seguro de qué método utilizar para poder escribir en él.
Lo que he probado:
Lo que he intentado en términos de acceso al contenido del carrito ha dependido del evento que he observado, pero he intentado todo lo siguiente;
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();
El que parece al menos permitirme acceder a la cotización, revisarlo y actualizar los elementos es
6.
$quote = Mage::getSingleton('checkout/session')->getQuote();
$cartItems = $quote->getAllVisibleItems();
Esto me permite actualizar cada elemento de cotización cuando itero (creo que usando setters mágicos ya que no puedo encontrar ningún método correspondiente). Esperaba poder actualizar la identificación de la clase de impuestos para el artículo de la cotización y luego volver a calcular los impuestos. Si uso lo siguiente (donde $ taxClassId es diferente al que ya usa cada artículo de cotización);
$item->setTaxClassId( $taxClassId );
$item->getProduct()->setIsSuperMode(true);
$item->save;
Y luego registrar los resultados;
Mage::log($item->debug(), null,'taxobserver.log', true);
Muestra que efectivamente actualicé este artículo de cotización y cambié la identificación fiscal. Sin embargo, si sigo adelante e intento guardar la cita modificada;
$quote->setTotalsCollectedFlag(false)->collectTotals();
$quote->save();
Y luego depurar de nuevo;
Mage::log($item->debug(), null,'taxobserver.log', true);
Mis cambios no se han guardado, el cambio del artículo de presupuesto se ha restablecido y los totales del carrito no se vuelven a calcular. Comenzar a preguntarse si encontrar un edificio alto para saltar podría ser la solución para este.