Pregunta

I tiene una categoría de productos que necesitan (legalmente) a tener su tasa de impuestos cambió cuando usted está pidiendo más de una cierta cantidad. He ampliado los distintos modelos de impuestos para conseguir este trabajo cuando se agrega un nuevo producto al carro, pero estoy teniendo problemas cuando el usuario actualiza las cantidades en la cesta o añade un articulo adicional que la punta de las cantidades que ya están en el carro por encima del umbral cantidad.

Problema 1:

En primer lugar, no estoy 100% qué evento (s) para observar. He intentado lo siguiente;

checkout_cart_save_after (basado en esto -> https://stackoverflow.com/questions/ 14362702 / magento-programáticamente-update-cesta-via-evento )

checkout_cart_update_items_after (basado en esto -> https: // stackoverflow. com / preguntas / 5104482 / programación-add-producto-a-compra-con-precio-cambio )

sales_quote_save_before (basado en esto -> https://stackoverflow.com/questions/ 7638858 / magento-Recalcular-carro-Total-en-observador )

Problema 2:

Soy capaz de acceder a los elementos de cotización de la cesta, hay un montón de maneras de hacer eso parece. También soy capaz de repetir por los elementos individuales en el carro, propiedades de actualización de esos artículos y después guardar los elementos (al menos temporalmente). Sin embargo, no soy capaz entonces de guardar la cita y volver a calcular los impuestos en el pago y envío.

Parte de la razón es que, aunque puedo tener acceso al carro de cotización, no estoy seguro de qué método utilizar para poder escribir en él.

Lo que he intentado:

Lo que he tratado en términos de acceso a los contenidos de la cesta ha dependido del evento que he observado, pero lo 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 ser, al menos, lo que permite que tenga acceso a la cita, ejecute a través de ellos y actualizar los elementos es

6.
$quote = Mage::getSingleton('checkout/session')->getQuote();
$cartItems = $quote->getAllVisibleItems();

Esto me permite actualizar cada elemento cotización cuando iterar (creo que el uso de fijadores de magia ya que no puedo encontrar métodos correspondientes). Tenía la esperanza de ser capaz de actualizar el Impuesto ID de clase para el elemento cita y luego volver a calcular los impuestos. Si utilizo el siguiente (donde $ taxClassId es diferente al ya utilizado por cada artículo cita);

$item->setTaxClassId( $taxClassId );
$item->getProduct()->setIsSuperMode(true);
$item->save;

Y a continuación, registra los resultados;

Mage::log($item->debug(), null,'taxobserver.log', true);

Esto demuestra que, efectivamente, he actualizado este artículo cita y cambiado el número de identificación fiscal. Sin embargo, si a continuación, seguir adelante y tratar de salvar el presupuesto modificado;

$quote->setTotalsCollectedFlag(false)->collectTotals();
$quote->save();     

Y luego depurar nuevo;

Mage::log($item->debug(), null,'taxobserver.log', true);

Mis cambios no se han guardado, el cambio de artículo cita se ha restablecido y el carro totales no se vuelven a calcular. Comenzando a preguntarse si encontrar un edificio alto para saltar podría ser la solución para éste.

¿Fue útil?

Solución

Mi sugerencia sería poner un observador en el caso sales_quote_collect_totals_before que se dispara en el método Mage_Sales_Model_Quote::collectTotals antes de que comience el proceso de recolección total. A continuación, desde el interior de este método de observador, iterar los elementos de cotización y cambia la clase de impuestos sobre la (ya cargado) producto objeto se puede recuperar desde el punto cotización.

Después de configurar la información sobre el objeto del producto, lo que sea que hagas, no tratar de guardarlo en la base de datos. Tener el conjunto de clases de impuestos, según sea necesario en el producto objeto de la memoria será lo suficientemente bueno para tener la lógica totales por cobrar que se encuentra en la recolección Mage_Tax_Model_Sales_Total_Quote_Tax qué clase de impuestos debería tener como base de cálculos en. Guardar el producto (como parece estar tratando de hacer en su ejemplo de código anterior) hará que los principales problemas de rendimiento, va a crear condiciones de carrera en el proceso de cálculo, y simplemente no es una buena práctica.

La razón de que los eventos que está tratando de trabajar con no le están permitiendo a lograr lo que usted está tratando de lograr es porque todos vienen después de que el cómputo total, un proceso que sólo se puede ejecutar una vez antes de guardar la cita.

Vale la pena señalar sobre el proceso de cobro totales es que una vez corrida, sin hacer trabajo extra, no se puede llamar de nuevo para tener en base a los cambios que ha realizado en los artículos de cotización que volver a calcular. Ver este lazo bits que he tomado de la serie de blogs de una compañera mía recientemente juntos sobre los totales de cobro revertido proceso:

Ahora que usted entiende lo que ocurre durante la recolección de los totales proceso, puede que le resulte conveniente o necesario llamar directamente usted mismo. Antes de que comience a sentirse demasiado confiado con el uso collectTotals para sus propios fines, sin embargo, mantienen la siguiente regla en cuenta:

Productos No puede añadirse a la cita después de collectTotals se ejecuta!

. . . a menos cachés artículo las direcciones de cotización se borran.

Casi el método de "cobro revertido" del total de cada modelo se basa en ir a buscar la citar a los elementos de la dirección y el bucle a través de ellos. La primera vez getAllItems se ejecuta en una dirección cita, la recolección de artículos es en realidad almacena en caché con una clave única, y es esta colección que es almacenado en caché devuelto en llamadas posteriores.

Si sucede que tiene una idea de realmente sumergirse en lo más profundo de cómo los totales de cobro revertido proceso funciona, se puede comprobar a cabo la primera de las cuatro series de piezas en la colección total aquí para leer más en profundidad: http://www.classyllama.com/content/unravelling-magentos-collecttotals collectTotals de desenredar Magento: Introducción

En resumen, tiene que ser la captura de un evento que durará antes de que el proceso de cobro totales (y antes de getAllItems se denominan en las direcciones de cotización), de modo que los cambios que realice en los artículos serán utilizados por los coleccionistas totales. No he verificado que el evento sales_quote_collect_totals_before sugerido ejecuta antes de realizar ninguna llamada al getAllItems en la dirección de la cita, pero estoy casi seguro de que va a trabajar para lo que necesita. Pero si no, es de esperar que he proporcionado un contexto suficiente para que usted pueda determinar qué caso de que necesite la captura de hacer que funcione.

Otros consejos

Hay otro caso: sales_quote_item_set_product en Mage_Sales_Model_Quote_Item :: setProducto

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

Se puede modificar la clase de impuestos producto utilizando este evento. Utilice el método quoteItem getQty para encontrar el qty añadido al carro.

Tal vez tratando de cambiar el taxclass podría no ser el mejor enfoque. ¿Por qué no crear un producto similar para aquellos productos que utilizan la clase de impuestos más alta y establecer un Cant mínima en la compra de ese producto. A continuación, utilice el checkout_cart_update_items_after a los productos de intercambio en torno basados ??en el qty total en el carrito?

Esto definitivamente no es una 'mejor práctica' pero podría ayudarle a pensar en otra dirección.

Alternativamente intentar la creación de algo con http://www.mageworx.com/ multi-tasas-magento-extension.html donde se agrega una 'tasa' para el impuesto adicional. En realidad, esto podría ser una manera más agradable de hacer, pero no lo puedo mostrar en los totales de impuestos, más como una línea de orden total adicional.

Utilice esta <sales_quote_collect_totals_before>

y en su función de hacer como

 public function quoteCollectTotalsBefore(Varien_Event_Observer $observer)
    $quote = $observer->getQuote();
    foreach ($quote->getAllItems() as $item)
    {
        $product = $item->getProduct();
        $product->setTaxClassId($product_tax_class_id);
    }
 }

Espero que esto funcionará definitivamente

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top