Files
stemcell/app/code/Stemcell/Sales/Model/Order/ShipmentFactory.php
T
2026-09-15 10:26:34 +08:00

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;
}
}