J'ai une catégorie de produits qui (légalement) doivent voir leur taux de taxe modifié lorsque vous commandez plus qu'une certaine quantité. J'ai étendu les différents modèles de taxe pour que cela fonctionne lorsque vous ajoutez un nouveau produit au panier, mais je rencontre des problèmes lorsque l'utilisateur met à jour les quantités dans le panier ou ajoute des produits supplémentaires qui font basculer les quantités déjà dans le panier au-delà du seuil montant.
Problème 1:
Tout d'abord, je ne suis pas à 100% quel (s) événement (s) observer. J'ai essayé ce qui suit;
checkout_cart_save_after
(basé sur ceci -> https://stackoverflow.com/questions/14362702/magento-programately-update-cart-via-event )
checkout_cart_update_items_after
(basé sur ceci -> https://stackoverflow.com/questions/5104482/programmatically-add-product-to-cart-with-price-change )
sales_quote_save_before
(basé sur ceci -> https://stackoverflow.com/questions/7638858/magento-recalculate-cart-total-in-observer )
Problème 2:
Je suis en mesure d'accéder aux articles du devis à partir du panier, il existe de nombreuses façons de le faire, semble-t-il. Je peux également parcourir les articles individuels du panier, mettre à jour les propriétés de ces articles, puis enregistrer les articles (au moins temporairement). Cependant, je ne suis pas en mesure de sauvegarder le devis et de recalculer les taxes lors du paiement.
Une partie de la raison est que même si je peux accéder au devis du panier, je ne sais pas quelle méthode utiliser pour pouvoir y écrire.
Ce que j'ai essayé:
Ce que j'ai essayé en termes d'accès au contenu du panier dépend de l'événement que j'ai observé, mais j'ai essayé tout ce qui suit;
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();
Celui qui semble au moins me permettre d'accéder au devis, de le parcourir et de mettre à jour les articles est
6.
$quote = Mage::getSingleton('checkout/session')->getQuote();
$cartItems = $quote->getAllVisibleItems();
Cela me permet de mettre à jour chaque élément de devis lorsque je répète (je crois que l'utilisation de setters magiques car je ne trouve aucune méthode correspondante). J'espérais pouvoir mettre à jour l'ID de classe de taxe pour l'élément de devis, puis recalculer les taxes. Si j'utilise ce qui suit (où $ taxClassId est différent de celui déjà utilisé par chaque élément de devis);
$item->setTaxClassId( $taxClassId );
$item->getProduct()->setIsSuperMode(true);
$item->save;
Et puis enregistrez les résultats;
Mage::log($item->debug(), null,'taxobserver.log', true);
Cela montre que j'ai effectivement mis à jour cet élément de devis et changé le numéro d'identification fiscale. Cependant, si je continue et essaie d'enregistrer le devis modifié;
$quote->setTotalsCollectedFlag(false)->collectTotals();
$quote->save();
Et puis déboguez à nouveau;
Mage::log($item->debug(), null,'taxobserver.log', true);
Mes modifications n'ont pas été enregistrées, la modification de l'élément de devis a été réinitialisée et les totaux du panier ne sont pas recalculés. Commencer à se demander si trouver un grand bâtiment pour sauter pourrait être la solution pour celui-ci.