117 lines
3.4 KiB
PHP
117 lines
3.4 KiB
PHP
<?php
|
|
|
|
namespace Stemcell\Sales\Model\Order;
|
|
|
|
use Magento\Framework\Serialize\Serializer\Json;
|
|
use Magento\Sales\Model\Order\Item;
|
|
|
|
class ShipmentFactory extends \Magento\Sales\Model\Order\ShipmentFactory
|
|
{
|
|
/**
|
|
* Serializer data
|
|
*
|
|
* @var Json
|
|
*/
|
|
private Json $serializer;
|
|
|
|
/**
|
|
* Validate order item before shipment
|
|
*
|
|
* @param Item $orderItem
|
|
* @param array $items
|
|
* @return bool
|
|
*/
|
|
private function validateItem(\Magento\Sales\Model\Order\Item $orderItem, array $items)
|
|
{
|
|
if (!$this->canShipItem($orderItem, $items)) {
|
|
return false;
|
|
}
|
|
|
|
// Remove from shipment items without qty or with qty=0
|
|
if (!$orderItem->isDummy(true)
|
|
&& (!isset($items[$orderItem->getId()]) || (float) $items[$orderItem->getId()] <= 0)
|
|
) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Set prepared items to shipment document
|
|
*
|
|
* @param \Magento\Sales\Api\Data\ShipmentInterface $shipment
|
|
* @param array $shipmentItems
|
|
* @return \Magento\Sales\Api\Data\ShipmentInterface
|
|
*/
|
|
private function setItemsToShipment(\Magento\Sales\Api\Data\ShipmentInterface $shipment, $shipmentItems)
|
|
{
|
|
$totalQty = 0;
|
|
|
|
/**
|
|
* Verify that composite products shipped separately has children, if not -> remove from collection
|
|
*/
|
|
/** @var \Magento\Sales\Model\Order\Shipment\Item $shipmentItem */
|
|
foreach ($shipmentItems as $key => $shipmentItem) {
|
|
if ($shipmentItem->getOrderItem()->getHasChildren()
|
|
&& $shipmentItem->getOrderItem()->isShipSeparately()
|
|
) {
|
|
$containerId = $shipmentItem->getOrderItem()->getId();
|
|
$childItems = array_filter($shipmentItems, function ($item) use ($containerId) {
|
|
return $containerId == $item->getOrderItem()->getParentItemId();
|
|
});
|
|
|
|
if (count($childItems) <= 0) {
|
|
unset($shipmentItems[$key]);
|
|
continue;
|
|
}
|
|
}
|
|
$totalQty += $shipmentItem->getQty();
|
|
$shipment->addItem($shipmentItem);
|
|
}
|
|
return $shipment->setTotalQty($totalQty);
|
|
}
|
|
|
|
/**
|
|
* Casts Qty to float or integer type
|
|
*
|
|
* @param Item $item
|
|
* @param string|int|float $qty
|
|
* @return float|int
|
|
*/
|
|
private function castQty(\Magento\Sales\Model\Order\Item $item, $qty)
|
|
{
|
|
if ($item->getIsQtyDecimal()) {
|
|
$qty = (double)$qty;
|
|
} else {
|
|
$qty = (int)$qty;
|
|
}
|
|
|
|
return $qty > 0 ? $qty : 0;
|
|
}
|
|
|
|
/**
|
|
* Adds tracks to the shipment.
|
|
*
|
|
* @param \Magento\Sales\Api\Data\ShipmentInterface $shipment
|
|
* @param array $tracks
|
|
* @throws \Magento\Framework\Exception\LocalizedException
|
|
* @return \Magento\Sales\Api\Data\ShipmentInterface
|
|
*/
|
|
protected function prepareTracks(\Magento\Sales\Api\Data\ShipmentInterface $shipment, array $tracks)
|
|
{
|
|
foreach ($tracks as $data) {
|
|
if (empty($data['number'])) {
|
|
throw new \Magento\Framework\Exception\LocalizedException(
|
|
__('Please enter a tracking number.')
|
|
);
|
|
}
|
|
|
|
$shipment->addTrack(
|
|
$this->trackFactory->create()->addData($data)
|
|
);
|
|
}
|
|
|
|
return $shipment;
|
|
}
|
|
}
|