How to get tracking information from order shipment in magento 2?
Magento 2 – Order Shipment Tracking Details
magento2sales-ordershipmentshipment-tracking
Related Solutions
You have two requirements here - 1) adding a barcode and 2) adding a tracking number.
Barcode:
Barcodes typically require custom fonts. How are you generating barcodes today? If you find yourself using an external service to render the barcode you can create the image offline and include. Using the font is more complex than the image as you must define a path to font on the server.
This is a good example of the type of work required in a custom module that extends Mage_Sales_Model_Order_Pdf_Packaging
:
/* Define a font path that is readable by the web server */
$fontPath = '/var/www/barcode-fonts/FRE3OF9X.TTF';
/* Load the font */
$page->setFont(Zend_Pdf_Font::fontWithPath($fontPath), 36);
/* Create barcode string. */
/* Note: Asterisks are required for code39 */
$barcodeImage = "*".$order->getIncrementId()."*";
/* Insert the barcode into the page */
$page->drawText($barcodeImage, 400, 800);
Source: http://www.magentocommerce.com/boards/viewthread/15807/
Tracking Number:
Adding the tracking number should be trivial compared to the above solution. The below solution lists tracking number separated 200px vertically from each other. In the same file as the barcode solution above:
$x = 400; $y = 800;
foreach($shipment->getTracksCollection() as $track){
/* Insert the tracking code into the page */
$page->drawText($track->getNumber(), $x, $y+=200);
}
3rd party plugin
There are third-party plugins available that allow you to create more flexible Packing Slip templates, etc. - many have barcodes built in. Here's one:
Good luck!
You need to keep in mind that each order can have multiple shipments and that each shipment can have multiple tracking numbers with multiple products.
Solution 1
After looking at app/code/core/Mage/Sales/Model/Order/Shipment.php
you see that there are two methods of interest:
getAllItems()
andgetAllTracks()
Which you can then use on your $order
object
$order = Mage::getModel('sales/order')->load($your_order_id);
$shipment_collection = Mage::getResourceModel('sales/order_shipment_collection')
->setOrderFilter($order)
->load();
foreach($shipment_collection as $shipment){
echo "Tracking number(s) for shipment:<br/>";
foreach($shipment->getAllTracks() as $tracking_number){
echo $tracking_number->getNumber() . "<br/>";
}
echo "Product(s) on shipment:<br/>";
foreach ($shipment->getAllItems() as $product){
echo $product->getName() . "<br/>";
}
}
Solution 2 - Direct SQL Statements
The reason I'm including this is because I always find it very useful to check the database structure when I'm struggling with something. After a quick glance at the database, you see some notable tables namely:
sales_flat_shipment
,sales_flat_shipment_item
andsales_flat_shipment_track
Immediately with these tables in mind, you know pretty much exactly how to find what you are looking for by simply looking at their column names.
$order = Mage::getModel('sales/order')->load($your_order_id);
$sales_flat_shipment = $this->_getTableName('sales_flat_shipment');
$sales_flat_shipment_track = $this->_getTableName('sales_flat_shipment_track');
$sales_flat_shipment_item = $this->_getTableName('sales_flat_shipment_item');
$connection = $this->_getConnection('core_read');
$sql = 'SELECT entity_id FROM ' . $sales_flat_shipment . ' WHERE order_id = ?';
$shipments = $connection->fetchAll($sql, $your_order_id);
foreach($shipments as $shipment){
$sql = 'SELECT * FROM ' . $sales_flat_shipment_track . ' WHERE parent_id = ?';
$tracking = $connection->fetchAll($sql, $shipment['entity_id']);
echo "Tracking number(s) for the order:<br/>";
foreach ($tracking as $track){
echo $track['track_number'] . "<br/>";
}
$sql = 'SELECT * FROM ' . $sales_flat_shipment_item . ' WHERE parent_id = ?';
$items = $connection->fetchAll($sql, $shipment['entity_id']);
echo "Product(s) on shipment:<br/>";
foreach ($items as $item){
echo $item['name'] . "<br/>";
}
}
public function _getConnection($type = 'core_read'){
return Mage::getSingleton('core/resource')->getConnection($type);
}
public function _getTableName($tableName){
return Mage::getSingleton('core/resource')->getTableName($tableName);
}
Best Answer
You can get all tracking details using this code :