serializer = $serializer ?: \Magento\Framework\App\ObjectManager::getInstance() ->get(Json::class); parent::__construct($context, $stockRegistry, $stockConfiguration, $registry, $data); } /** * Truncate string * * @param string $value * @param int $length * @param string $etc * @param string &$remainder * @param bool $breakWords * @return string */ public function truncateString($value, $length = 80, $etc = '...', &$remainder = '', $breakWords = true) { return $this->filterManager->truncate( $value, ['length' => $length, 'etc' => $etc, 'remainder' => $remainder, 'breakWords' => $breakWords] ); } /** * Getting all available children for Invoice, Shipment or CreditMemo item * * @param \Magento\Framework\DataObject $item * @return array|null */ public function getChildren($item) { $itemsArray = []; $items = null; if ($item instanceof \Magento\Sales\Model\Order\Invoice\Item) { $items = $item->getInvoice()->getAllItems(); } elseif ($item instanceof \Magento\Sales\Model\Order\Shipment\Item) { $items = $item->getShipment()->getAllItems(); } elseif ($item instanceof \Magento\Sales\Model\Order\Creditmemo\Item) { $items = $item->getCreditmemo()->getAllItems(); } if ($items) { foreach ($items as $value) { $parentItem = $value->getOrderItem()->getParentItem(); if ($parentItem) { $itemsArray[$parentItem->getId()][$value->getOrderItemId()] = $value; } else { $itemsArray[$value->getOrderItem()->getId()][$value->getOrderItemId()] = $value; } } } if (isset($itemsArray[$item->getOrderItem()->getId()])) { return $itemsArray[$item->getOrderItem()->getId()]; } return null; } /** * Check if item can be shipped separately * * @param mixed $item * @return bool * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ public function isShipmentSeparately($item = null) { if ($item) { if ($item->getOrderItem()) { $item = $item->getOrderItem(); } $parentItem = $item->getParentItem(); if ($parentItem) { $options = $parentItem->getProductOptions(); if ($options) { return (isset($options['shipment_type']) && $options['shipment_type'] == AbstractType::SHIPMENT_SEPARATELY); } } else { $options = $item->getProductOptions(); if ($options) { return !(isset($options['shipment_type']) && $options['shipment_type'] == AbstractType::SHIPMENT_SEPARATELY); } } } $options = $this->getOrderItem()->getProductOptions(); if ($options) { if (isset($options['shipment_type']) && $options['shipment_type'] == AbstractType::SHIPMENT_SEPARATELY) { return true; } } return false; } /** * Check if child items calculated * * @param mixed $item * @return bool * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ public function isChildCalculated($item = null) { if ($item) { if ($item->getOrderItem()) { $item = $item->getOrderItem(); } $parentItem = $item->getParentItem(); if ($parentItem) { $options = $parentItem->getProductOptions(); if ($options) { return (isset($options['product_calculations']) && $options['product_calculations'] == AbstractType::CALCULATE_CHILD); } } else { $options = $item->getProductOptions(); if ($options) { return !(isset($options['product_calculations']) && $options['product_calculations'] == AbstractType::CALCULATE_CHILD); } } } $options = $this->getOrderItem()->getProductOptions(); if ($options) { if (isset($options['product_calculations']) && $options['product_calculations'] == AbstractType::CALCULATE_CHILD ) { return true; } } return false; } /** * Retrieve selection attributes values * * @param mixed $item * @return mixed|null */ public function getSelectionAttributes($item) { if ($item instanceof \Magento\Sales\Model\Order\Item) { $options = $item->getProductOptions(); } else { $options = $item->getOrderItem()->getProductOptions(); } if (isset($options['bundle_selection_attributes'])) { return $this->serializer->unserialize($options['bundle_selection_attributes']); } return null; } /** * Retrieve order item options array * * @return array */ public function getOrderOptions() { $result = []; $options = $this->getOrderItem()->getProductOptions(); if ($options) { if (isset($options['options'])) { $result = array_merge($result, $options['options']); } if (isset($options['additional_options'])) { $result = array_merge($result, $options['additional_options']); } if (!empty($options['attributes_info'])) { $result = array_merge($options['attributes_info'], $result); } } return $result; } /** * Retrieve order item * * @return mixed */ public function getOrderItem() { if ($this->getItem() instanceof \Magento\Sales\Model\Order\Item) { return $this->getItem(); } return $this->getItem()->getOrderItem(); } /** * Get html info for item * * @param mixed $item * @return string */ public function getValueHtml($item) { $result = $this->escapeHtml($item->getName()); if (!$this->isShipmentSeparately($item)) { $attributes = $this->getSelectionAttributes($item); if ($attributes) { $result = sprintf('%d', $attributes['qty']) . ' x ' . $result; } } if (!$this->isChildCalculated($item)) { $attributes = $this->getSelectionAttributes($item); if ($attributes) { $result .= " " . $this->getOrderItem()->getOrder()->formatPrice($attributes['price']); } } return $result; } /** * Check if we can show price info for this item * * @param object $item * @return bool */ public function canShowPriceInfo($item) { if ($item->getOrderItem()->getParentItem() && $this->isChildCalculated() || !$item->getOrderItem()->getParentItem() && !$this->isChildCalculated() ) { return true; } return false; } }