Question

I have an external application and I have to update the billing and shipping details of an existing order. The problem is that the billing city doesn't get saved with the rest of the data. I'm using Magento 1.8. The code was inspired by this thread: Change shipping and billing address from order programmatically

$order = Mage::getModel('sales/order')->load($orderId); 
$shippingAddress = Mage::getModel('sales/order_address')->load($order->getShippingAddress()->getId()); 
$billingAddress = Mage::getModel('sales/order_address')->load($order->getBillingAddress()->getId());

$shippingAddress = Mage::getModel('sales/order_address')
->setFirstname("value")
->setLastname("value")
->setCompany("value")
->setStreet("value"))
->setCity("value")
->setRegion("value")
->setPostcode("value")
->setTelephone("value")->save();

$billingAddress = Mage::getModel('sales/order_address')
->setFirstname("value")
->setLastname("value")
->setCompany("value")
->setStreet("value"))
->setCity("value")
->setRegion("value")
->setPostcode("value")
->setTelephone("value")->save();
Was it helpful?

Solution

Deni,you have already loaded shipping Address and Billing address from order So you don't need create new Mage::getModel('sales/order_address') object You just need to edit address object

$shippingAddress = Mage::getModel('sales/order_address')->load($order->getShippingAddress()->getId()); 
$billingAddress = Mage::getModel('sales/order_address')->load($order->getBillingAddress()->getId());

/* here i have edit exiting order shipping objects */
$shippingAddress ->
->setFirstname("value")
->setLastname("value")
->setCompany("value")
->setStreet("value"))
->setCity("value")
->setRegion("value")
->setPostcode("value")
->setTelephone("value")->save();

$billingAddres
->setFirstname("value")
->setLastname("value")
->setCompany("value")
->setStreet("value"))
->setCity("value")
->setRegion("value")
->setPostcode("value")
->setTelephone("value")->save();

You need to add ->setRegionId() for get region if you region id of this country

OTHER TIPS

Try this in place of your code snippet:

$order = Mage::getModel('sales/order')->load($orderId); 
$orderAddress = Mage::getModel('sales/order_address');
$shippingAddress = $orderAddress->load($order->getShippingAddress()->getId(); 
$billingAddress = $orderAddress->load($order->getBillingAddress()->getId();

$shippingAddress                                     /* = Mage::getModel('sales/order_address') */
->setFirstname("value")
->setLastname("value")
->setCompany("value")
->setStreet("value")
->setCity("value")
->setRegion("value")
->setPostcode("value")
->setTelephone("value")->save();

$billingAddress                                      /* = Mage::getModel('sales/order_address') */
->setFirstname("value")
->setLastname("value")
->setCompany("value")
->setStreet("value")
->setCity("value")
->setRegion("value")
->setPostcode("value")
->setTelephone("value")->save();

Here is the complete working code, I also included a custom shipping and billing attribute in case someone needs it:

Mage::app('default');
$order = Mage::getModel('sales/order')->loadByIncrementId($_POST['nr_comanda']);
$shippingAddress = Mage::getModel('sales/order_address')->load($order->getShippingAddress()->getId()); 
$billingAddress = Mage::getModel('sales/order_address')->load($order->getBillingAddress()->getId());

$shippingAddress
->setCompany($_POST[''])    
->setFirstname($_POST[''])
->setLastname($_POST[''])
->setTelephone($_POST[''])
->setStreet($_POST[''])
->setCity($_POST[''])
->setRegion($_POST[''])
->setData('custom_attribute', '123')
->setPostcode($_POST[''])->save();

$billingAddress
->setCompany($_POST[''])    
->setFirstname($_POST[''])
->setLastname($_POST[''])
->setTelephone($_POST[''])  
->setStreet($_POST[''])
->setCity($_POST[''])
->setRegion($_POST[''])
->setData('custom_attribute', '123')
->setPostcode($_POST[''])->save();
Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange
scroll top