2

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) {

}

1 Answer 1

1

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:

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.