Magento – Create invoice and shipment in magento via cron based on store view and order age

magento-1.9MySQLPHPprogrammatically

I am looking for help setting up a cron job that will look at all orders in all store views that have a status of "pending" created in the past X minutes and create an invoice and a shipment for those orders.

I would like to create the invoice but not create the shipment for one store view, creating the invoice and shipment for all of the others.

I hope this is clear. I have searched and found some examples, but none that apply to this situation.

EDIT:

I have started with this, but it doesn't seem to work yet. Just trying to get all orders that exist as 'pending', create an invoice, and create a shipment:




try {

    $orders = Mage::getModel('sales/order')->getCollection()
        ->addFieldToFilter(
            'status',
            array(
                'nin' => array('complete', 'canceled', 'processing', 'holded', 'fraud'),
                'in' => 'pending',
            )
        )
        ->addAttributeToSelect('*');
}
catch (Mage_Core_Exception $e) {
}

try {

    foreach ($orders as $eachorder) {


        $order = Mage::getModel("sales/order")->load($eachorder->getId());
        if (!$order->canInvoice()) {
            Mage::throwException(Mage::helper('core')->__('Cannot create an invoice.'));
        }
        $invoice = Mage::getModel('sales/service_order', $order)->prepareInvoice();
        if (!$invoice->getTotalQty()) {
            Mage::throwException(Mage::helper('core')->__('Cannot create an invoice without products.'));
        }
        $invoice->setRequestedCaptureCase(Mage_Sales_Model_Order_Invoice::CAPTURE_ONLINE);
        $invoice->register();
        $transactionSave = Mage::getModel('core/resource_transaction')
            ->addObject($invoice)
            ->addObject($invoice->getOrder());
        $transactionSave->save();

        $shipment = $order->prepareShipment();

        if ($shipment) {
            $shipment->register();
            $order->setIsInProcess(true);

            $transaction_save = Mage::getModel('core/resource_transaction')
                ->addObject($shipment)
                ->addObject($shipment->getOrder())
                ->save();
        } else {
            throw new Exception("Cant get shipment");
        }

        $order->setState(Mage_Sales_Model_Order::STATE_COMPLETE);
        $order->save();
    }

}
catch (Mage_Core_Exception $e) {

}

Best Answer

user1618341,According magento an order can place from one store,Magento is save order store id at sales_flat_order,sales_flat_grid order.

At your collection you need get store_id.Also need rectify collection query,Please use * instead of some field

<?php
    try {
        $orders = Mage::getModel('sales/order')->getCollection()
            ->addFieldToFilter(
                'status',
                array(
                    'nin' => array('complete', 'canceled', 'processing', 'holded', 'fraud'),
                    'in' => 'pending',
                ))
            ->addAttributeToSelect('store_id')
            ->addAttributeToSelect('status');
    }
catch (Mage_Core_Exception $e) {
}

I have put the condition to skip create shipment for one store view[if($eachorder->getData('store_id')!=='YOUSKIPSTOREID'):]

see code:

try {

    foreach ($orders as $eachorder) {


        $order = Mage::getModel("sales/order")->load($eachorder->getId());
        if (!$order->canInvoice()) {
            Mage::throwException(Mage::helper('core')->__('Cannot create an invoice.'));
        }
        $invoice = Mage::getModel('sales/service_order', $order)->prepareInvoice();
        if (!$invoice->getTotalQty()) {
            Mage::throwException(Mage::helper('core')->__('Cannot create an invoice without products.'));
        }
        $invoice->setRequestedCaptureCase(Mage_Sales_Model_Order_Invoice::CAPTURE_ONLINE);
        $invoice->register();
        $transactionSave = Mage::getModel('core/resource_transaction')
            ->addObject($invoice)
            ->addObject($invoice->getOrder());
        $transactionSave->save();
        /* put code for skip for one store */
        if($eachorder->getData('store_id')!=='YOUSKIPSTOREID'):

            $shipment = $order->prepareShipment();

            if ($shipment) {
                $shipment->register();
                $order->setIsInProcess(true);

                $transaction_save = Mage::getModel('core/resource_transaction')
                    ->addObject($shipment)
                    ->addObject($shipment->getOrder())
                    ->save();
            } else {
                throw new Exception("Cant get shipment");
            }
        endif;

        $order->setState(Mage_Sales_Model_Order::STATE_COMPLETE);
        $order->save();
    }

}catch (Mage_Core_Exception $e) {

}

If you getting the issues for create invoice and shipment,Please see my Blog:

Create invoice:

Create Shipment:

Related Topic