If you have a high rate of orders, or customers that take their time finalizing checkout, then you might have noticed an odd problem with your Sales > Orders. If a customer adds product XYZ into their cart and proceeds to Google Checkout, then a product is deactivated from the magento system, we have no way of stopping the order flow for that customer - At least not a reliable one. What happens is an order created in the magento system with no products and $0 due. The order looks totally find for the customer however you'll never be able to cancel the order based on the canCancel() method in Mage_Sales_Model_Order.
The solution is to watch the <checkout_submit_all_after> event and immediately cancel orders as they are created. You could override the Mage_GoogleCheckout_Model_Api_Xml_Callback::_responseNewOrderNotification() method, however I tried to be as non-obtrusive as I can with magento core code.
YourCustomModule/GoogleCheckout/etc/config.xml
<events>
<checkout_submit_all_after>
<observers>
<yourcustommodule_googlecheckout_observer>
<type>singleton</type>
<class>YourModule_GoogleCheckout_Model_Observer</class>
<method>observeForEmptyOrders</method>
<yourcustommodule_googlecheckout_observer>
</observers>
</checkout_submit_all_after>
</events>
And in your Model/Observer.php class:
class FoxConnect_GoogleCheckout_Model_Observer
{
public function observeForEmptyOrders($observer) {
$order = $observer->getEvent()->getOrder();
if ($order->getPayment()->getMethod() != 'googlecheckout') return;
if (count($order->getAllItems()) == 0) {
$order->getPayment()->getMethodInstance()->cancel( $order->getPayment());
$order->setStatus( Mage_Sales_Model_Order::STATE_CANCELED );
$order->save();
}
}
}