From 61f40a0d7af5b4b7bbd582be24b2f3a71aa13e48 Mon Sep 17 00:00:00 2001 From: shopkeeperdev Date: Tue, 21 Oct 2025 14:55:37 -0400 Subject: [PATCH] Initial --- .../View/Items/Renderer/DefaultRenderer.php | 102 ++++++++++++++++++ Plugin/Order/View/ItemsColumns.php | 30 ++++++ etc/adminhtml/di.xml | 14 +++ etc/module.xml | 9 ++ registration.php | 8 ++ 5 files changed, 163 insertions(+) create mode 100644 Plugin/Order/View/Items/Renderer/DefaultRenderer.php create mode 100644 Plugin/Order/View/ItemsColumns.php create mode 100644 etc/adminhtml/di.xml create mode 100644 etc/module.xml create mode 100644 registration.php diff --git a/Plugin/Order/View/Items/Renderer/DefaultRenderer.php b/Plugin/Order/View/Items/Renderer/DefaultRenderer.php new file mode 100644 index 0000000..369f9c6 --- /dev/null +++ b/Plugin/Order/View/Items/Renderer/DefaultRenderer.php @@ -0,0 +1,102 @@ +productRepository = $productRepository; + } + + /** + * Modify columns to remove tax columns and add cost column + * + * @param \Magento\Sales\Block\Adminhtml\Order\View\Items\Renderer\DefaultRenderer $subject + * @param array $result + * @return array + */ + public function afterGetColumns($subject, $result) + { + // Remove tax columns + unset($result['tax-amount']); + unset($result['tax-percent']); + + // Add cost column after price + $newColumns = []; + foreach ($result as $key => $value) { + $newColumns[$key] = $value; + if ($key === 'price') { + $newColumns['cost'] = 'col-cost'; + } + } + + return $newColumns; + } + + /** + * Add HTML rendering for cost column + * + * @param \Magento\Sales\Block\Adminhtml\Order\View\Items\Renderer\DefaultRenderer $subject + * @param string $result + * @param \Magento\Sales\Model\Order\Item $item + * @param string $column + * @return string + */ + public function afterGetColumnHtml($subject, $result, $item, $column) + { + if ($column === 'cost') { + try { + $product = $this->productRepository->getById($item->getProductId()); + $cost = $product->getCost(); + if ($cost) { + return $subject->getOrder()->formatPrice($cost); + } else { + return __('N/A'); + } + } catch (NoSuchEntityException $e) { + return __('N/A'); + } + } + + // Make product name and SKU clickable + if ($column === 'product') { + $productUrl = $subject->getUrl('catalog/product/edit', ['id' => $item->getProductId()]); + + // Replace product name with linked version + $productName = $item->getName(); + $linkedName = '' + . $subject->escapeHtml($productName) . ''; + $result = str_replace($subject->escapeHtml($productName), $linkedName, $result); + + // Replace SKU with linked version + $sku = $item->getSku(); + $linkedSku = '' + . $subject->escapeHtml($sku) . ''; + $result = str_replace($subject->escapeHtml($sku), $linkedSku, $result); + } + + return $result; + } + + /** + * Add column header for cost + * + * @param \Magento\Sales\Block\Adminhtml\Order\View\Items\Renderer\DefaultRenderer $subject + * @param string $result + * @param string $columnName + * @return string + */ + public function afterGetHeaderText($subject, $result, $columnName) + { + if ($columnName === 'cost') { + return __('Cost'); + } + return $result; + } +} diff --git a/Plugin/Order/View/ItemsColumns.php b/Plugin/Order/View/ItemsColumns.php new file mode 100644 index 0000000..2d1bd46 --- /dev/null +++ b/Plugin/Order/View/ItemsColumns.php @@ -0,0 +1,30 @@ + $value) { + $newColumns[$key] = $value; + if ($key === 'price') { + $newColumns['cost'] = 'Cost'; + } + } + + return $newColumns; + } +} diff --git a/etc/adminhtml/di.xml b/etc/adminhtml/di.xml new file mode 100644 index 0000000..4ad58dc --- /dev/null +++ b/etc/adminhtml/di.xml @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/etc/module.xml b/etc/module.xml new file mode 100644 index 0000000..16680b7 --- /dev/null +++ b/etc/module.xml @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/registration.php b/registration.php new file mode 100644 index 0000000..c247303 --- /dev/null +++ b/registration.php @@ -0,0 +1,8 @@ +