0

I am having an API that give me price of metals and I want to use that price just before placing an order and re calculate the cart price before order has been placed.

In order to do that I created an observer. Here is the code for config file:

<?xml version="1.0" encoding="UTF-8"?>
<config>
<modules>
    <CustomPriceUpdate_Checkout>
        <version>0.0.1</version>
    </CustomPriceUpdate_Checkout>
</modules>
<global>
    <models>
        <myCustomPriceUpdate_Checkout>
            <class>CustomPriceUpdate_Checkout_Model</class>
        </myCustomPriceUpdate_Checkout>
    </models>
    <events>
        <sales_order_place_before>
            <observers>
                <modify_product_price>
                    <type>singleton</type>
                    <class>myCustomPriceUpdate_Checkout/observer</class>
                    <method>update_price</method>
                </modify_product_price>
            </observers>
        </sales_order_place_before>
    </events>
</global>
</config>

Observer.php:

<?php
class CustomPriceUpdate_Checkout_Model_Observer{
  public function update_price($observer){
    $client = new SoapClient('http://domain.com/index.php/api/v2_soap/?wsdl');
    $session = $client->login('username', 'key');  
    $quote = $observer->getQuote(); 
    foreach ($quote->getAllItems() as $item) {
        $product = $item->getProduct();//if you need it
        $product_id = $product->getId();
        $price = $product->getPrice();
        $discountprice = 23;
        $newPrice = ($price)+($discountprice);
        $product->setPrice($newPrice);
        $result = $client->catalogProductUpdate($session, $product_id, array(
                        'price' => $newPrice,
                    ),'brisbanebullion');
        Mage::log($product_id, null, "order.log", true);
    }
  }
}

I am using catalogProductUpdate API to update the price. The above code is only updating the price of Product, but its not updating the cart prices.

If I use the trigger "checkout_cart_save_before", then its changing price in both cart and catalog.

Can anyone please suggest me, which trigger I should use to update cart price just when user click place order button on checkout page.

6
  • you want to update your price only in cart? Commented Jan 27, 2017 at 8:26
  • I want to update price on both cart and catalog. Commented Jan 27, 2017 at 8:34
  • means each time your customer place order you will fetch price from api and save price in cart and catalog. is your price is changing frequently? @sachin Commented Jan 27, 2017 at 8:57
  • Metal prices getting change every minute, so I want the order to be place with latest price. I am also running cron job to update catalog price in every 3 hours. Commented Jan 27, 2017 at 9:08
  • There may be some conflict if customers take longer time to complete payment Commented Jan 27, 2017 at 9:14

1 Answer 1

0

You can use sales_order_place_before Event

resides in app/code/core/Mage/Sales/Model/Order.php place() Function

$order = $observer->getEvent()->getOrder();
$quote = $order->getQuote();
$quoteid=$quote->getId();
if($quoteid) {
    foreach($quote->getAllItems() as $item){
        $item->setCustomPrice(<YOUR PRICE>);
        $item->setOriginalCustomPrice(<YOUR PRICE>);
    }
}
3
  • I tired the above solution and changed my code as you mentioned above, but its only updating the catelog price. Its not updating the cart price. Commented Jan 27, 2017 at 13:17
  • Have you set the price of quote item also? Commented Jan 27, 2017 at 13:20
  • @SachinNagpal find updated answer Commented Jan 27, 2017 at 13:42

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.