So what we need to do here is:
1. Add a column to sales_flat_shipment which will store invoice increment id (say invoice_id)
2. Before invoice and shipment are saved, get the invoice’s latest increment id and increment it by 1 (to get next invoice increment id)
3. Give that invoice increment id to shipment object, so it will get saved along with other shipment columns
Here we go technically,
Firstly, add a column to sales_flat_shipment table.
<?php
$installer = $this;
$installer->startSetup();
$installer->run(“
ALTER TABLE sales_flat_shipment ADD COLUMN invoice_id VARCHAR(50) AFTER increment_id
“);
$installer->endSetup();
?>
Then, override InvoiceController.php of sales/order: Mage/Adminhtml/controllers/Sales/Order/InvoiceController.php
Paste this code to newly overridden file:
<?php
require_once(‘Mage/Adminhtml/controllers/Sales/Order/InvoiceController.php’);
class Namespace_Module_Sales_Order_InvoiceController extends Mage_Adminhtml_Sales_Order_InvoiceController
{
/**
* @author – Kalpesh Mehta
* @desc – Rewritten this method for linking shipment and invoice
*/
public function saveAction()
{
$data = $this->getRequest()->getPost(‘invoice’);
$orderId = $this->getRequest()->getParam(‘order_id’);
if (!empty($data[‘comment_text’])) {
Mage::getSingleton(‘adminhtml/session’)
->setCommentText($data[‘comment_text’]);
}
try {
$invoice = $this->_initInvoice();
if ($invoice) {
if (!empty($data[‘capture_case’])) {
$invoice->setRequestedCaptureCase($data[‘capture_case’]);
}
if (!empty($data[‘comment_text’])) {
$invoice->addComment($data[‘comment_text’], isset($data[‘comment_customer_notify’]), isset($data[‘is_visible_on_front’]));
}
$invoice->register();
if (!empty($data[‘send_email’])) {
$invoice->setEmailSent(true);
}
$invoice->getOrder()->setCustomerNoteNotify(!empty($data[‘send_email’]));
$invoice->getOrder()->setIsInProcess(true);
$transactionSave = Mage::getModel(‘core/resource_transaction’)
->addObject($invoice)
->addObject($invoice->getOrder());
$shipment = false;
if (!empty($data[‘do_shipment’]) || (int) $invoice->getOrder()->getForcedDoShipmentWithInvoice()) {
$shipment = $this->_prepareShipment($invoice);
if ($shipment) {
//Get last invoice increment ID
$invoiceLast = Mage::getModel(‘sales/order_invoice’)->getCollection()
->setOrder(‘increment_id’,’DESC’)
->setPageSize(1)
->setCurPage(1);
$invLastIncrId = $invoiceLast->getFirstItem()->getIncrementId();
$invNewIncrId = (int)$invLastIncrId + 1; //incrementing by 1
$shipment->setInvoiceId($invNewIncrId); //setting data for our sales_flat_shipment table column invoice_id
$shipment->setEmailSent($invoice->getEmailSent());
$transactionSave->addObject($shipment);
}
}
$transactionSave->save();
if (!empty($data[‘do_shipment’]) || (int) $invoice->getOrder()->getForcedDoShipmentWithInvoice()) {
$this->_getSession()->addSuccess($this->__(‘The invoice and shipment have been created.’));
} else {
$this->_getSession()->addSuccess($this->__(‘The invoice has been created.’));
}
// send invoice/shipment emails
$comment = ”;
if (isset($data[‘comment_customer_notify’])) {
$comment = $data[‘comment_text’];
}
try {
$invoice->sendEmail(!empty($data[‘send_email’]), $comment);
} catch (Exception $e) {
Mage::logException($e);
$this->_getSession()->addError($this->__(‘Unable to send the invoice email.’));
}
if ($shipment) {
try {
$shipment->sendEmail(!empty($data[‘send_email’]));
} catch (Exception $e) {
Mage::logException($e);
$this->_getSession()->addError($this->__(‘Unable to send the shipment email.’));
}
}
Mage::getSingleton(‘adminhtml/session’)->getCommentText(true);
$this->_redirect(‘*/sales_order/view’, array(‘order_id’ => $orderId));
} else {
$this->_redirect(‘*/*/new’, array(‘order_id’ => $orderId));
}
return;
} catch (Mage_Core_Exception $e) {
$this->_getSession()->addError($e->getMessage());
} catch (Exception $e) {
$this->_getSession()->addError($this->__(‘Unable to save the invoice.’));
Mage::logException($e);
}
$this->_redirect(‘*/*/new’, array(‘order_id’ => $orderId));
}
}