From 4a5bb25cd0cc73381a34abc5ec178504334a5814 Mon Sep 17 00:00:00 2001 From: packeta <57401091+packeta@users.noreply.github.com> Date: Tue, 31 Aug 2021 16:47:10 +0200 Subject: [PATCH] V2.2.0 (#38) * Pes 258 orders grid new (#33) * PES-258: new orders grid * PES-258: new orders grid - sorting and inline weight edit validation * PES-258: new orders grid - filters * PES-258: new orders grid - columns_controls * PES-258: new orders grid - sorting simplification * PES-258: new orders grid - SQL expression simplification * PES-258: new orders grid - version increase * PES-258: new orders grid - SQL simplification * PES-258: new orders grid - DOC comment fix * PES-258: new orders grid - inline edit controller action simplification * PES-258: new orders grid - improvements * PES-258: new orders grid - improvements * Pes 265 new grid exports (#34) * PES-265: new grid csv exports * PES-265: new grid csv exports - non selected fix * PES-265: new grid csv exports - types * PES-278: total order weight fix (#35) * PES-278: total order weight fix * PES-278: total order weight fix * PES-278: php docs only * PES-278: change log update * PES: csv weight fix (#36) * PES-285: readme update (#37) Co-authored-by: FJiskra --- CHANGE_LOG.txt | 3 + Packetery/Checkout/Block/Adminhtml/Order.php | 20 - .../Checkout/Block/Adminhtml/Order/Grid.php | 326 -------------- .../Block/Adminhtml/Order/GridExport.php | 2 +- .../Adminhtml/Order/Renderer/Actions.php | 49 --- .../Adminhtml/Order/Renderer/Address.php | 28 -- .../Adminhtml/Order/Renderer/CodState.php | 15 - .../Adminhtml/Order/Renderer/CreatedDate.php | 31 -- .../Order/Renderer/DeliveryDestination.php | 76 ---- .../Adminhtml/Order/Renderer/ExportState.php | 15 - .../Adminhtml/Order/Renderer/ExportTime.php | 26 -- .../Block/Adminhtml/Order/Renderer/Name.php | 21 - .../Order/Renderer/OrderReference.php | 31 -- .../Adminhtml/Order/Renderer/OrderStatus.php | 40 -- .../Block/Adminhtml/Order/Renderer/Value.php | 41 -- .../Adminhtml/Export/GridToCsvCustom.php | 92 ---- .../Controller/Adminhtml/Order/ExportMass.php | 73 ++-- .../Controller/Adminhtml/Order/Index.php | 4 - .../Controller/Adminhtml/Order/InlineEdit.php | 47 +++ .../Checkout/Model/Carrier/AbstractBrain.php | 23 +- .../Model/Carrier/Imp/Packetery/Brain.php | 6 +- .../Imp/PacketeryPacketaDynamic/Brain.php | 6 +- .../Model/Export/ConvertToCsvCustom.php | 70 +--- .../Checkout/Model/Weight/Calculator.php | 80 ++++ Packetery/Checkout/Model/Weight/Item.php | 65 +++ .../Observer/Sales/OrderPlaceAfter.php | 23 +- .../Checkout/Ui/Component/ExportButton.php | 24 ++ .../Order/Listing/ByFieldColumnTrait.php | 17 + .../Order/Listing/Column/Actions.php | 76 ++++ .../Order/Listing/Column/CreatedDate.php | 60 +++ .../Order/Listing/Column/DateTime.php | 87 ++++ .../Listing/Column/DeliveryDestination.php | 88 ++++ .../Order/Listing/Column/FullName.php | 26 ++ .../Order/Listing/Column/OrderReference.php | 62 +++ .../Order/Listing/Column/OrderStatus.php | 60 +++ .../Order/Listing/Column/RecipientAddress.php | 41 ++ .../Component/Order/Listing/Column/Value.php | 63 +++ .../Component/Order/Listing/Column/YesNo.php | 33 ++ .../Listing/Filter/OrderStatusSelect.php | 26 ++ .../Component/Order/Listing/SearchResult.php | 40 ++ .../Checkout/Ui/Component/YesNoSelect.php | 20 + Packetery/Checkout/etc/di.xml | 2 +- Packetery/Checkout/etc/module.xml | 2 +- Packetery/Checkout/i18n/cs_CZ.csv | 2 + Packetery/Checkout/i18n/en_GB.csv | 2 + .../layout/packetery_order_index.xml | 8 + .../packetery_checkout_order_listing.xml | 396 ++++++------------ README.md | 6 +- 48 files changed, 1169 insertions(+), 1185 deletions(-) delete mode 100755 Packetery/Checkout/Block/Adminhtml/Order.php delete mode 100755 Packetery/Checkout/Block/Adminhtml/Order/Grid.php delete mode 100644 Packetery/Checkout/Block/Adminhtml/Order/Renderer/Actions.php delete mode 100755 Packetery/Checkout/Block/Adminhtml/Order/Renderer/Address.php delete mode 100755 Packetery/Checkout/Block/Adminhtml/Order/Renderer/CodState.php delete mode 100755 Packetery/Checkout/Block/Adminhtml/Order/Renderer/CreatedDate.php delete mode 100644 Packetery/Checkout/Block/Adminhtml/Order/Renderer/DeliveryDestination.php delete mode 100755 Packetery/Checkout/Block/Adminhtml/Order/Renderer/ExportState.php delete mode 100755 Packetery/Checkout/Block/Adminhtml/Order/Renderer/ExportTime.php delete mode 100755 Packetery/Checkout/Block/Adminhtml/Order/Renderer/Name.php delete mode 100755 Packetery/Checkout/Block/Adminhtml/Order/Renderer/OrderReference.php delete mode 100755 Packetery/Checkout/Block/Adminhtml/Order/Renderer/OrderStatus.php delete mode 100644 Packetery/Checkout/Block/Adminhtml/Order/Renderer/Value.php delete mode 100755 Packetery/Checkout/Controller/Adminhtml/Export/GridToCsvCustom.php create mode 100644 Packetery/Checkout/Controller/Adminhtml/Order/InlineEdit.php create mode 100644 Packetery/Checkout/Model/Weight/Calculator.php create mode 100644 Packetery/Checkout/Model/Weight/Item.php create mode 100644 Packetery/Checkout/Ui/Component/ExportButton.php create mode 100644 Packetery/Checkout/Ui/Component/Order/Listing/ByFieldColumnTrait.php create mode 100644 Packetery/Checkout/Ui/Component/Order/Listing/Column/Actions.php create mode 100644 Packetery/Checkout/Ui/Component/Order/Listing/Column/CreatedDate.php create mode 100644 Packetery/Checkout/Ui/Component/Order/Listing/Column/DateTime.php create mode 100644 Packetery/Checkout/Ui/Component/Order/Listing/Column/DeliveryDestination.php create mode 100644 Packetery/Checkout/Ui/Component/Order/Listing/Column/FullName.php create mode 100644 Packetery/Checkout/Ui/Component/Order/Listing/Column/OrderReference.php create mode 100644 Packetery/Checkout/Ui/Component/Order/Listing/Column/OrderStatus.php create mode 100644 Packetery/Checkout/Ui/Component/Order/Listing/Column/RecipientAddress.php create mode 100644 Packetery/Checkout/Ui/Component/Order/Listing/Column/Value.php create mode 100644 Packetery/Checkout/Ui/Component/Order/Listing/Column/YesNo.php create mode 100644 Packetery/Checkout/Ui/Component/Order/Listing/Filter/OrderStatusSelect.php create mode 100644 Packetery/Checkout/Ui/Component/Order/Listing/SearchResult.php create mode 100644 Packetery/Checkout/Ui/Component/YesNoSelect.php create mode 100644 Packetery/Checkout/view/adminhtml/layout/packetery_order_index.xml diff --git a/CHANGE_LOG.txt b/CHANGE_LOG.txt index 70f38ad..b125944 100644 --- a/CHANGE_LOG.txt +++ b/CHANGE_LOG.txt @@ -1,3 +1,6 @@ +2.2.0 - Added: inline order grid editation + - Fixed: cart and order weight calculation + 2.1.0 - Added: Packeta related checkout delivery option availability is based on specified pricing rules and carrier support of countries and delivery methods - Removed: default price and specific countries GUI removed from delivery method configuration - Added: Packeta multi-carrier ability and default price migration diff --git a/Packetery/Checkout/Block/Adminhtml/Order.php b/Packetery/Checkout/Block/Adminhtml/Order.php deleted file mode 100755 index 5b91745..0000000 --- a/Packetery/Checkout/Block/Adminhtml/Order.php +++ /dev/null @@ -1,20 +0,0 @@ -_controller = 'adminhtml_order'; - $this->_blockGroup = 'Packetery_Checkout'; - $this->_headerText = __('Orders'); - parent::_construct(); - - $this->removeButton('add'); - } -} diff --git a/Packetery/Checkout/Block/Adminhtml/Order/Grid.php b/Packetery/Checkout/Block/Adminhtml/Order/Grid.php deleted file mode 100755 index 22ba17c..0000000 --- a/Packetery/Checkout/Block/Adminhtml/Order/Grid.php +++ /dev/null @@ -1,326 +0,0 @@ -_collectionFactory = $collectionFactory; - $this->statusCollectionFactory = $statusCollectionFactory; - parent::__construct($context, $backendHelper, $data); - } - - /** - * @return void - */ - protected function _construct() - { - $this->setId('order_items'); - $this->setDefaultSort('order_number'); - $this->setDefaultDir('desc'); - - $this->setSaveParametersInSession(false); - - parent::_construct(); - } - - /** - * Prepare grid collection object - * - * @return $this - */ - - protected function _prepareCollection() - { - $collection = $this->_collectionFactory->create(); - - $this->setCollection($collection); - - return parent::_prepareCollection(); - } - - protected function _prepareMassaction() - { - $this->setMassactionIdField('id'); - $this->getMassactionBlock()->setFormFieldName('order_id'); - - $this->getMassactionBlock()->addItem('export', array( - 'label'=> __('CSV Export'), - 'url' => $this->getUrl('*/*/exportMass', array('' => '')) - )); - - return $this; - } - - /** - * Prepare default grid column - * - * @return $this - */ - protected function _prepareColumns() - { - parent::_prepareColumns(); - - $this->addColumn('order_number', array( - 'header' => __('Order number'), - 'sortable' => true, - 'index' => 'order_number', - 'renderer' => 'Packetery\Checkout\Block\Adminhtml\Order\Renderer\OrderReference' - )); - - $this->addColumn('created_at', array( - 'header' => __('Purchase Date'), - 'sortable' => false, - 'is_system' => true, - 'filter' => false, - 'renderer' => 'Packetery\Checkout\Block\Adminhtml\Order\Renderer\CreatedDate' - )); - - $this->addColumn('order_status', array( - 'header' => __('Order status'), - 'sortable' => false, - 'type' => 'options', - 'options' => self::getOrderStatues(), - 'filter_condition_callback' => [$this, 'filterOrderStatus'], - 'renderer' => 'Packetery\Checkout\Block\Adminhtml\Order\Renderer\OrderStatus' - )); - - $this->addColumn('recipient_lastname', array( - 'header' => __('Full name'), - 'sortable' => true, - 'index' => 'recipient_lastname', - 'filter_condition_callback' => [$this, 'filterOptionRecipientName'], - 'renderer' => 'Packetery\Checkout\Block\Adminhtml\Order\Renderer\Name', - )); - - $this->addColumn('recipient_company', array( - 'header' => __('Recipient company'), - 'sortable' => true, - 'index' => 'recipient_company' - )); - - $this->addColumn('recipient_email', array( - 'header' => __('Recipient Email'), - 'sortable' => true, - 'index' => 'recipient_email' - )); - - $this->addColumn('recipient_phone', array( - 'header' => __('Recipient phone number'), - 'sortable' => true, - 'index' => 'recipient_phone' - )); - - $this->addColumn('recipient_address', array( - 'header' => __('Recipient address'), - 'sortable' => true, - 'index' => 'recipient_street', - 'filter_condition_callback' => array($this, 'filterRecipientAddress'), - 'renderer' => 'Packetery\Checkout\Block\Adminhtml\Order\Renderer\Address' - )); - - $this->addColumn('cod', array( - 'header' => __('Cash on delivery'), - 'sortable' => false, - 'type' => 'options', - 'options' => self::getOptionArray(), - 'renderer' => 'Packetery\Checkout\Block\Adminhtml\Order\Renderer\CodState', - 'filter_condition_callback' => array($this, 'filterOptionCod') - )); - - $this->addColumn('currency', array( - 'header' => __('Currency'), - 'sortable' => true, - 'index' => 'currency' - )); - - $this->addColumn('value', array( - 'header' => __('Total price'), - 'sortable' => true, - 'type' => 'number', - 'index' => 'value', - 'renderer' => 'Packetery\Checkout\Block\Adminhtml\Order\Renderer\Value' - )); - - $this->addColumn('point_name', array( - 'header' => __('Pickup point address'), - 'sortable' => false, - 'index' => 'point_name', - 'filter_condition_callback' => array($this, 'filterPointName'), - 'renderer' => 'Packetery\Checkout\Block\Adminhtml\Order\Renderer\DeliveryDestination' - )); - - $this->addColumn('exported', array( - 'header' => __('Exported'), - 'sortable' => true, - 'index' => 'exported', - 'type' => 'options', - 'options' => self::getOptionArray(), - 'renderer' => 'Packetery\Checkout\Block\Adminhtml\Order\Renderer\ExportState', - 'filter_condition_callback' => array($this, 'filterOptionExport') - )); - - $this->addColumn('exported_at', array( - 'header' => __('Export date'), - 'sortable' => true, - 'is_system' => true, - 'index' => 'exported_at', - 'filter' => false, - 'renderer' => 'Packetery\Checkout\Block\Adminhtml\Order\Renderer\ExportTime' - )); - - $this->addColumn('actions', array( - 'header' => __('Actions'), - 'sortable' => false, - 'index' => 'actions', - 'filter' => false, - 'renderer' => 'Packetery\Checkout\Block\Adminhtml\Order\Renderer\Actions' - )); - - $this->addExportType($this->getUrl('*/*/exportPacketeryCsv'), __('CSV - only not exported')); - $this->addExportType($this->getUrl('*/*/exportPacketeryCsvAll'), __('CSV - all records')); - - return $this; - } - - - /** - * Option values Yes/No (Ano/Ne) - */ - public static function getOptionArray() - { - return array(__('No'), __('Yes')); - } - - public function getOrderStatues() { - return $collection = $this->statusCollectionFactory->toOptionHash(); - } - - /** - * Custom filtration for export status - * @param $collection - * @param $column - */ - public function filterOptionExport($collection, $column) - { - $filterValue = intval($column->getFilter()->getValue()); - - if($filterValue === 0) - { - $collection->getSelect()->where("exported = '' OR exported IS NULL"); - } - - if($filterValue === 1) - { - $collection->getSelect()->where("exported = 1"); - } - } - - /** - * Custom filtration for COD parameter in order - * (like Packetery rules) - * @param $collection - * @param $column - */ - public function filterOptionCod($collection, $column) - { - $filterValue = intval($column->getFilter()->getValue()); - - if($filterValue === 0) - { - $collection->getSelect()->where("cod = '0.00'"); - } - - if($filterValue === 1) - { - $collection->getSelect()->where("cod > 0"); - } - } - //TODO: Refactor - merge all filters into one method - public function filterOptionRecipientName($collection, $column) - { - $filterValue = $column->getFilter()->getValue(); - if (!$filterValue) - { - return; - } - - // remove spaces - $filterValue = $this->removeSpaces($filterValue); - - $collection->getSelect() - ->where('CONCAT(recipient_firstname, recipient_lastname) LIKE ?', "%{$filterValue}%"); - } - - public function filterPointName($collection, $column) - { - $filterValue = $column->getFilter()->getValue(); - if (!$filterValue) - { - return; - } - - // remove spaces - $filterValue = $this->removeSpaces($filterValue); - $collection->getSelect()->where('CONCAT(point_name, point_id) LIKE ? ', "%{$filterValue}%"); - - } - - public function filterRecipientAddress($collection, $column) - { - $filterValue = $column->getFilter()->getValue(); - if (!$filterValue) - { - return; - } - - // remove spaces - $filterValue = $this->removeSpaces($filterValue); - $collection->getSelect()->where('CONCAT_WS("",recipient_street, recipient_house_number, recipient_city, recipient_zip) LIKE ? ', "%{$filterValue}%"); - - } - - public function filterOrderStatus($collection, $column) - { - $filterValue = $column->getFilter()->getValue(); - if (!$filterValue) - { - return; - } - - $collection->getSelect()->join(array('so' => 'sales_order'), 'order_number = so.increment_id')->where('so.status = ?', $filterValue); - - } - - /** - * @param string $filterValue - * - * @return string - */ - private function removeSpaces($filterValue) { - return (preg_replace('/\s+/', '', $filterValue)); - } -} diff --git a/Packetery/Checkout/Block/Adminhtml/Order/GridExport.php b/Packetery/Checkout/Block/Adminhtml/Order/GridExport.php index 7948907..aca6c82 100755 --- a/Packetery/Checkout/Block/Adminhtml/Order/GridExport.php +++ b/Packetery/Checkout/Block/Adminhtml/Order/GridExport.php @@ -134,7 +134,7 @@ protected function getExportRow($row) $this->formatNumber($row->getData('cod')), $row->getData('currency'), $this->formatNumber($row->getData('value')), - '', + $this->formatNumber($row->getData('weight')), $row->getData('point_id'), $row->getData('sender_label'), '', diff --git a/Packetery/Checkout/Block/Adminhtml/Order/Renderer/Actions.php b/Packetery/Checkout/Block/Adminhtml/Order/Renderer/Actions.php deleted file mode 100644 index 5f76c41..0000000 --- a/Packetery/Checkout/Block/Adminhtml/Order/Renderer/Actions.php +++ /dev/null @@ -1,49 +0,0 @@ -orderFactory = $orderFactory; - parent::__construct($context, $data); - } - - /** - * @param \Magento\Framework\DataObject $row - * @return string - */ - public function render(DataObject $row): string - { - $orderNumber = $row->getData('order_number'); - $order = $this->orderFactory->create()->loadByIncrementId($orderNumber); - $shippingMethod = $order->getShippingMethod(true); - - $html = ''; - - if ($shippingMethod && ($shippingMethod->getData('method') === Methods::PICKUP_POINT_DELIVERY || $shippingMethod->getData('method') === 'packetery')) { - $html = '' . __('Edit') . ''; - } - - return $html; - } -} diff --git a/Packetery/Checkout/Block/Adminhtml/Order/Renderer/Address.php b/Packetery/Checkout/Block/Adminhtml/Order/Renderer/Address.php deleted file mode 100755 index 7cb0105..0000000 --- a/Packetery/Checkout/Block/Adminhtml/Order/Renderer/Address.php +++ /dev/null @@ -1,28 +0,0 @@ -getData('recipient_street'); - $city = $row->getData('recipient_city'); - $houseNumber = $row->getData('recipient_house_number'); - $zip = $row->getData('recipient_zip'); - - $value = <<< HTML -

$street $houseNumber

-

$city, $zip

-HTML; - - return $value; - } -} diff --git a/Packetery/Checkout/Block/Adminhtml/Order/Renderer/CodState.php b/Packetery/Checkout/Block/Adminhtml/Order/Renderer/CodState.php deleted file mode 100755 index 64e8189..0000000 --- a/Packetery/Checkout/Block/Adminhtml/Order/Renderer/CodState.php +++ /dev/null @@ -1,15 +0,0 @@ -getData('cod'); - - return ($cod > 0 ? __('Yes') : __('No')); - } -} diff --git a/Packetery/Checkout/Block/Adminhtml/Order/Renderer/CreatedDate.php b/Packetery/Checkout/Block/Adminhtml/Order/Renderer/CreatedDate.php deleted file mode 100755 index 17f1c78..0000000 --- a/Packetery/Checkout/Block/Adminhtml/Order/Renderer/CreatedDate.php +++ /dev/null @@ -1,31 +0,0 @@ -orderFactory = $orderFactory; - } - - public function render(DataObject $row) - { - $orderNumber = $row->getData('order_number'); - $order = $this->orderFactory->create()->loadByIncrementId($orderNumber); - $created_at = $order->getCreatedAt(); - - return $this->formatDate($created_at, \IntlDateFormatter::MEDIUM, TRUE); - } -} diff --git a/Packetery/Checkout/Block/Adminhtml/Order/Renderer/DeliveryDestination.php b/Packetery/Checkout/Block/Adminhtml/Order/Renderer/DeliveryDestination.php deleted file mode 100644 index 40bb885..0000000 --- a/Packetery/Checkout/Block/Adminhtml/Order/Renderer/DeliveryDestination.php +++ /dev/null @@ -1,76 +0,0 @@ -methodSelect = $methodSelect; - $this->orderCollectionFactory = $orderCollectionFactory; - $this->carrierFacade = $carrierFacade; - } - - /** - * render address - * - * @param DataObject $row - * @return string - */ - public function render(DataObject $row) { - $orderNumber = $row->getData('order_number'); - $collection = $this->orderCollectionFactory->create(); - /** @var \Magento\Sales\Model\Order $item */ - $item = $collection->getItemByColumnValue('increment_id', $orderNumber); - $shippingMethod = $item->getShippingMethod(true); - $shippingAddress = $item->getShippingAddress(); - $carrierCode = $shippingMethod->getData('carrier_code'); - $methodCode = MethodCode::fromString($shippingMethod->getData('method')); - $carrier = $this->carrierFacade->createHybridCarrier($carrierCode, $methodCode->getDynamicCarrierId(), $methodCode->getMethod(), $shippingAddress->getCountryId()); - - $branchName = (string)$row->getData('point_name'); - $branchId = $row->getData('point_id'); - $methodContent = $this->methodSelect->getLabelByValue($methodCode->getMethod()); - if ($branchId && $methodCode->getMethod() === Methods::PICKUP_POINT_DELIVERY) { - $methodContent = sprintf("%s (%s)", $branchName, $branchId); - } - - return new ComboPhrase( - [ - $carrier->getFinalCarrierName(), - ' - ', - $methodContent, - ] - ); - } -} diff --git a/Packetery/Checkout/Block/Adminhtml/Order/Renderer/ExportState.php b/Packetery/Checkout/Block/Adminhtml/Order/Renderer/ExportState.php deleted file mode 100755 index 1d6ac2a..0000000 --- a/Packetery/Checkout/Block/Adminhtml/Order/Renderer/ExportState.php +++ /dev/null @@ -1,15 +0,0 @@ -getData('exported'); - - return empty($exported) ? __('No') : __('Yes'); - } -} diff --git a/Packetery/Checkout/Block/Adminhtml/Order/Renderer/ExportTime.php b/Packetery/Checkout/Block/Adminhtml/Order/Renderer/ExportTime.php deleted file mode 100755 index 3279cdb..0000000 --- a/Packetery/Checkout/Block/Adminhtml/Order/Renderer/ExportTime.php +++ /dev/null @@ -1,26 +0,0 @@ -getData('exported_at'); - $isExported = $row->getData('exported'); - - return ($isExported && !is_null($exportedAt) ? $this->formatDate($exportedAt, \IntlDateFormatter::MEDIUM, TRUE) : ""); - } -} diff --git a/Packetery/Checkout/Block/Adminhtml/Order/Renderer/Name.php b/Packetery/Checkout/Block/Adminhtml/Order/Renderer/Name.php deleted file mode 100755 index 032685b..0000000 --- a/Packetery/Checkout/Block/Adminhtml/Order/Renderer/Name.php +++ /dev/null @@ -1,21 +0,0 @@ -getData('recipient_firstname'); - $lname = $row->getData('recipient_lastname'); - - return $fname." ".$lname; - } -} diff --git a/Packetery/Checkout/Block/Adminhtml/Order/Renderer/OrderReference.php b/Packetery/Checkout/Block/Adminhtml/Order/Renderer/OrderReference.php deleted file mode 100755 index 0d3fd0d..0000000 --- a/Packetery/Checkout/Block/Adminhtml/Order/Renderer/OrderReference.php +++ /dev/null @@ -1,31 +0,0 @@ -orderFactory = $orderFactory; - parent::__construct($context, $data); - } - - public function render(DataObject $row) - { - $orderNumber = $row->getData('order_number'); - $order = $this->orderFactory->create()->loadByIncrementId($orderNumber); - - $html ='' . $orderNumber . ''; - - return $html; - } -} diff --git a/Packetery/Checkout/Block/Adminhtml/Order/Renderer/OrderStatus.php b/Packetery/Checkout/Block/Adminhtml/Order/Renderer/OrderStatus.php deleted file mode 100755 index 5ffc2a7..0000000 --- a/Packetery/Checkout/Block/Adminhtml/Order/Renderer/OrderStatus.php +++ /dev/null @@ -1,40 +0,0 @@ -orderFactory = $orderFactory; - parent::__construct($context, $data); - } - - /** - * @param \Magento\Framework\DataObject $row - * - * @return string|null - */ - public function render(DataObject $row) - { - $orderNumber = $row->getData('order_number'); - $order = $this->orderFactory->create()->loadByIncrementId($orderNumber); - - try { - return $order->getStatusLabel(); - } - catch (LocalizedException $e) { - return null; - } - } -} diff --git a/Packetery/Checkout/Block/Adminhtml/Order/Renderer/Value.php b/Packetery/Checkout/Block/Adminhtml/Order/Renderer/Value.php deleted file mode 100644 index d538897..0000000 --- a/Packetery/Checkout/Block/Adminhtml/Order/Renderer/Value.php +++ /dev/null @@ -1,41 +0,0 @@ -currencyFactory = $currencyFactory; - } - - /** - * @param \Magento\Framework\DataObject $row - * @return string - */ - public function render(DataObject $row): string - { - $value = $row->getData('value'); - - $options = [ - 'display' => \Magento\Framework\Currency::NO_SYMBOL - ]; - - $currency = $this->currencyFactory->create()->load($row->getData('currency')); - return $currency->formatPrecision((float)$value, PriceCurrencyInterface::DEFAULT_PRECISION, $options, false); - } -} diff --git a/Packetery/Checkout/Controller/Adminhtml/Export/GridToCsvCustom.php b/Packetery/Checkout/Controller/Adminhtml/Export/GridToCsvCustom.php deleted file mode 100755 index adee9d4..0000000 --- a/Packetery/Checkout/Controller/Adminhtml/Export/GridToCsvCustom.php +++ /dev/null @@ -1,92 +0,0 @@ -converter = $converter; - $this->fileFactory = $fileFactory; - $this->filter = $filter ?: ObjectManager::getInstance()->get(Filter::class); - } - - /** - * Export data provider to CSV - * - * @throws \Magento\Framework\Exception\LocalizedException - * @return \Magento\Framework\App\ResponseInterface - */ - public function execute() - { - return $this->fileFactory->create('export.csv', $this->converter->getCsvFile(), 'var'); - } - - /** - * Checking if the user has access to requested component. - * - * @inheritDoc - */ - protected function _isAllowed() - { - if ($this->_request->getParam('namespace')) { - try { - $component = $this->filter->getComponent(); - $dataProviderConfig = $component->getContext() - ->getDataProvider() - ->getConfigData(); - if (isset($dataProviderConfig['aclResource'])) { - return $this->_authorization->isAllowed( - $dataProviderConfig['aclResource'] - ); - } - } catch (\Throwable $exception) { - - - return false; - } - } - - return true; - } -} diff --git a/Packetery/Checkout/Controller/Adminhtml/Order/ExportMass.php b/Packetery/Checkout/Controller/Adminhtml/Order/ExportMass.php index e01e45a..0427e92 100755 --- a/Packetery/Checkout/Controller/Adminhtml/Order/ExportMass.php +++ b/Packetery/Checkout/Controller/Adminhtml/Order/ExportMass.php @@ -1,59 +1,74 @@ resultPageFactory = $resultPageFactory; + $this->resultPageFactory = $resultPageFactory; $this->data = $data; - $this->context = $context; $this->orderCollectionFactory = $orderCollectionFactory; + $this->converter = $converter; } - public function execute() - { - $orderIds = $this->getRequest()->getParam('order_id'); - - if (empty($orderIds)) - { + /** + * @return \Magento\Framework\App\ResponseInterface|\Magento\Framework\Controller\ResultInterface|void + * @throws \Magento\Framework\Exception\LocalizedException + */ + public function execute() { + $selected = $this->getRequest()->getParam('selected'); + if ($selected === 'false') { $this->messageManager->addError(__('No orders to export.')); $this->_redirect($this->_redirect->getRefererUrl()); + return; + } + + $orderIds = $this->converter->getItemIds(); + if (empty($orderIds)) { + $this->messageManager->addError(__('No orders to export.')); + $this->_redirect($this->_redirect->getRefererUrl()); return; } $content = $this->resultPageFactory->create()->getLayout()->createBlock('Packetery\Checkout\Block\Adminhtml\Order\GridExport')->getCsvMassFileContents($orderIds); - if (!$content) - { + if (!$content) { $this->messageManager->addError(__('Error! No export data found.')); $this->_redirect($this->_redirect->getRefererUrl()); - return; } @@ -65,7 +80,7 @@ public function execute() $collection->setDataToAll( [ 'exported_at' => $now->format('Y-m-d H:i:s'), - 'exported' => 1 + 'exported' => 1, ] ); $collection->save(); @@ -73,8 +88,12 @@ public function execute() $this->_sendUploadResponse($this->data->getExportFileName(), $content); } - protected function _sendUploadResponse($fileName, $content, $contentType='application/octet-stream') - { + /** + * @param string $fileName + * @param string|null $content + * @param string $contentType + */ + protected function _sendUploadResponse(string $fileName, ?string $content, string $contentType = 'application/octet-stream') { $this->_response->setHttpResponseCode(200) ->setHeader('Pragma', 'public', true) ->setHeader('Cache-Control', 'must-revalidate, post-check=0, pre-check=0', true) diff --git a/Packetery/Checkout/Controller/Adminhtml/Order/Index.php b/Packetery/Checkout/Controller/Adminhtml/Order/Index.php index 5eb6876..f4916cc 100755 --- a/Packetery/Checkout/Controller/Adminhtml/Order/Index.php +++ b/Packetery/Checkout/Controller/Adminhtml/Order/Index.php @@ -21,10 +21,6 @@ public function execute() $resultPage->setActiveMenu('Packetery_Checkout::orders'); $resultPage->getConfig()->getTitle()->prepend(__('Orders')); - $resultPage->addContent( - $resultPage->getLayout()->createBlock('Packetery\Checkout\Block\Adminhtml\Order') - ); - return $resultPage; } } diff --git a/Packetery/Checkout/Controller/Adminhtml/Order/InlineEdit.php b/Packetery/Checkout/Controller/Adminhtml/Order/InlineEdit.php new file mode 100644 index 0000000..b1a72a7 --- /dev/null +++ b/Packetery/Checkout/Controller/Adminhtml/Order/InlineEdit.php @@ -0,0 +1,47 @@ +orderCollectionFactory = $orderCollectionFactory; + parent::__construct($context); + } + + /** + * @return \Magento\Framework\App\ResponseInterface + */ + public function execute() { + $postItems = $this->getRequest()->getParam('items', []); + foreach ($postItems as $modelId => $postItem) { + $orderCollection = $this->orderCollectionFactory->create(); + $orderCollection->addFilter($orderCollection->getIdFieldName(), $modelId); + $orderCollection->setDataToAll($postItem); + $orderCollection->save(); + } + + return $this->resultFactory->create(ResultFactory::TYPE_JSON)->setData([]); + } +} diff --git a/Packetery/Checkout/Model/Carrier/AbstractBrain.php b/Packetery/Checkout/Model/Carrier/AbstractBrain.php index 362648e..59aa341 100644 --- a/Packetery/Checkout/Model/Carrier/AbstractBrain.php +++ b/Packetery/Checkout/Model/Carrier/AbstractBrain.php @@ -27,21 +27,38 @@ abstract class AbstractBrain /** @var \Magento\Framework\App\Config\ScopeConfigInterface */ private $scopeConfig; + /** @var \Packetery\Checkout\Model\Weight\Calculator */ + private $weightCalculator; + /** * AbstractBrain constructor. * * @param \Magento\Framework\App\Request\Http $httpRequest * @param \Packetery\Checkout\Model\Pricing\Service $pricingService * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig + * @param \Packetery\Checkout\Model\Weight\Calculator $weightCalculator */ public function __construct( \Magento\Framework\App\Request\Http $httpRequest, \Packetery\Checkout\Model\Pricing\Service $pricingService, - \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig + \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, + \Packetery\Checkout\Model\Weight\Calculator $weightCalculator ) { $this->httpRequest = $httpRequest; $this->pricingService = $pricingService; $this->scopeConfig = $scopeConfig; + $this->weightCalculator = $weightCalculator; + } + + /** + * @param \Magento\Quote\Model\Quote\Address\RateRequest $request + * @return float + */ + public function getRateRequestWeight(RateRequest $request): float { + /** @var \Magento\Quote\Model\Quote\Item[] $allItems */ + $allItems = $request->getAllItems(); + $allItems = \Packetery\Checkout\Model\Weight\Item::transformItems($allItems); + return $this->weightCalculator->getItemsWeight($allItems); } /** @@ -196,6 +213,10 @@ public function collectRates(AbstractCarrier $carrier, RateRequest $request, ?Ab $methods[$selectedMethod] = $brain->getMethodSelect()->getLabelByValue($selectedMethod); } + $packeteryWeight = $this->getRateRequestWeight($request); + $request = clone $request; + $request->setPackageWeight($packeteryWeight); + return $this->pricingService->collectRates($request, $carrier->getCarrierCode(), $config, $methods, ($dynamicCarrier ? $dynamicCarrier->getCarrierId() : null)); } diff --git a/Packetery/Checkout/Model/Carrier/Imp/Packetery/Brain.php b/Packetery/Checkout/Model/Carrier/Imp/Packetery/Brain.php index f5daa77..a6d1c82 100644 --- a/Packetery/Checkout/Model/Carrier/Imp/Packetery/Brain.php +++ b/Packetery/Checkout/Model/Carrier/Imp/Packetery/Brain.php @@ -22,15 +22,17 @@ class Brain extends \Packetery\Checkout\Model\Carrier\AbstractBrain * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig * @param \Packetery\Checkout\Model\Carrier\Imp\Packetery\MethodSelect $methodSelect * @param \Packetery\Checkout\Model\ResourceModel\Carrier\CollectionFactory $carrierCollectionFactory + * @param \Packetery\Checkout\Model\Weight\Calculator $weightCalculator */ public function __construct( \Magento\Framework\App\Request\Http $httpRequest, \Packetery\Checkout\Model\Pricing\Service $pricingService, \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, \Packetery\Checkout\Model\Carrier\Imp\Packetery\MethodSelect $methodSelect, - \Packetery\Checkout\Model\ResourceModel\Carrier\CollectionFactory $carrierCollectionFactory + \Packetery\Checkout\Model\ResourceModel\Carrier\CollectionFactory $carrierCollectionFactory, + \Packetery\Checkout\Model\Weight\Calculator $weightCalculator ) { - parent::__construct($httpRequest, $pricingService, $scopeConfig); + parent::__construct($httpRequest, $pricingService, $scopeConfig, $weightCalculator); $this->methodSelect = $methodSelect; $this->carrierCollectionFactory = $carrierCollectionFactory; } diff --git a/Packetery/Checkout/Model/Carrier/Imp/PacketeryPacketaDynamic/Brain.php b/Packetery/Checkout/Model/Carrier/Imp/PacketeryPacketaDynamic/Brain.php index f9c28ee..facc3f6 100644 --- a/Packetery/Checkout/Model/Carrier/Imp/PacketeryPacketaDynamic/Brain.php +++ b/Packetery/Checkout/Model/Carrier/Imp/PacketeryPacketaDynamic/Brain.php @@ -26,6 +26,7 @@ class Brain extends \Packetery\Checkout\Model\Carrier\AbstractBrain * @param \Packetery\Checkout\Model\Carrier\Imp\PacketeryPacketaDynamic\MethodSelect $methodSelect * @param \Packetery\Checkout\Model\ResourceModel\Carrier\CollectionFactory $carrierCollectionFactory * @param \Magento\Shipping\Model\Rate\ResultFactory $rateResultFactory + * @param \Packetery\Checkout\Model\Weight\Calculator $weightCalculator */ public function __construct( \Magento\Framework\App\Request\Http $httpRequest, @@ -33,9 +34,10 @@ public function __construct( \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, \Packetery\Checkout\Model\Carrier\Imp\PacketeryPacketaDynamic\MethodSelect $methodSelect, \Packetery\Checkout\Model\ResourceModel\Carrier\CollectionFactory $carrierCollectionFactory, - \Magento\Shipping\Model\Rate\ResultFactory $rateResultFactory + \Magento\Shipping\Model\Rate\ResultFactory $rateResultFactory, + \Packetery\Checkout\Model\Weight\Calculator $weightCalculator ) { - parent::__construct($httpRequest, $pricingService, $scopeConfig); + parent::__construct($httpRequest, $pricingService, $scopeConfig, $weightCalculator); $this->methodSelect = $methodSelect; $this->carrierCollectionFactory = $carrierCollectionFactory; $this->rateResultFactory = $rateResultFactory; diff --git a/Packetery/Checkout/Model/Export/ConvertToCsvCustom.php b/Packetery/Checkout/Model/Export/ConvertToCsvCustom.php index 2efe1c1..eb54c03 100755 --- a/Packetery/Checkout/Model/Export/ConvertToCsvCustom.php +++ b/Packetery/Checkout/Model/Export/ConvertToCsvCustom.php @@ -1,36 +1,18 @@ filter = $filter; - $this->directory = $filesystem->getDirectoryWrite(DirectoryList::VAR_DIR); - $this->metadataProvider = $metadataProvider; $this->pageSize = $pageSize; } /** - * Returns CSV file + * Returns item IDs. * * @return array * @throws LocalizedException */ - public function getCsvFile() - { + public function getItemIds(): array { $component = $this->filter->getComponent(); - $name = md5(microtime()); - $file = 'export/' . $component->getName() . $name . '.csv'; - $this->filter->prepareComponent($component); $this->filter->applySelectionOnTargetProvider(); $dataProvider = $component->getContext()->getDataProvider(); - $fields = $this->metadataProvider->getFields($component); - $options = $this->metadataProvider->getOptions(); - $this->directory->create('export'); - $stream = $this->directory->openFile($file, 'w+'); - $stream->lock(); - $stream->writeCsv($this->metadataProvider->getHeaders($component)); $i = 1; $searchCriteria = $dataProvider->getSearchCriteria() ->setCurrentPage($i) ->setPageSize($this->pageSize); - $totalCount = (int) $dataProvider->getSearchResult()->getTotalCount(); + $totalCount = (int)$dataProvider->getSearchResult()->getTotalCount(); + + $orderIds = []; while ($totalCount > 0) { $items = $dataProvider->getSearchResult()->getItems(); foreach ($items as $item) { - $this->metadataProvider->convertDate($item, $component->getName()); - $stream->writeCsv($this->metadataProvider->getRowData($item, $fields, $options)); + $orderIds[] = $item->getId(); } $searchCriteria->setCurrentPage(++$i); $totalCount = $totalCount - $this->pageSize; } - $stream->unlock(); - $stream->close(); - return [ - 'type' => 'filename', - 'value' => $file, - 'rm' => true // can delete file after use - ]; + return $orderIds; } } diff --git a/Packetery/Checkout/Model/Weight/Calculator.php b/Packetery/Checkout/Model/Weight/Calculator.php new file mode 100644 index 0000000..19568dd --- /dev/null +++ b/Packetery/Checkout/Model/Weight/Calculator.php @@ -0,0 +1,80 @@ +getAllVisibleItems(); + $allVisibleItems = \Packetery\Checkout\Model\Weight\Item::transformItems($allVisibleItems); + return $this->getItemsWeight($allVisibleItems); + } + + /** + * @param Item[] $allVisibleItems + * @return float + */ + public function getItemsWeight(array $allVisibleItems): float { + $productWeights = []; + $totalWeight = 0.0; + + foreach ($allVisibleItems as $item) { + if ($item->getProductType() === 'configurable') { + /** @var \Magento\Catalog\Model\Product $configurableProduct */ + $configurableProduct = $item->getProduct(); + if ($configurableProduct->isVirtual()) { + $configurableWeight = 0.0; + } else { + $configurableWeight = $configurableProduct->getWeight(); + } + + /** @var Item[] $children */ + $children = ($item->getChildren() ?: []); // contains only ordered items + foreach ($children as $child) { + /** @var \Magento\Catalog\Model\Product $childProduct */ + $childProduct = $child->getProduct(); + if ($childProduct->isVirtual()) { + $productWeights[$childProduct->getId()] = 0.0; + continue; + } + + if (is_numeric($childProduct->getWeight())) { + $childWeight = $childProduct->getWeight(); + } else { + $childWeight = $configurableWeight; + } + + $productWeights[$childProduct->getId()] = $childWeight * $child->getQty(); + } + } + } + + foreach ($allVisibleItems as $item) { + /** @var \Magento\Catalog\Model\Product $product */ + $product = $item->getProduct(); + if ($item->getProductType() === 'simple' && !array_key_exists($product->getId(), $productWeights)) { + if ($product->isVirtual()) { + $productWeights[$product->getId()] = 0.0; + continue; + } + + $productWeights[$product->getId()] = $product->getWeight() * $item->getQty(); + } + } + + foreach ($productWeights as $itemWeight) { + $totalWeight += (float)$itemWeight; + } + + return $totalWeight; + } +} diff --git a/Packetery/Checkout/Model/Weight/Item.php b/Packetery/Checkout/Model/Weight/Item.php new file mode 100644 index 0000000..e8bb712 --- /dev/null +++ b/Packetery/Checkout/Model/Weight/Item.php @@ -0,0 +1,65 @@ + $item) { + if ($item instanceof \Magento\Quote\Model\Quote\Item) { + $instances[$key] = self::fromQuoteItem($item); + } + + if ($item instanceof \Magento\Sales\Model\Order\Item) { + $instances[$key] = self::fromOrderItem($item); + } + } + + return $instances; + } + + /** + * @param \Magento\Quote\Model\Quote\Item $item + * @return static + */ + public static function fromQuoteItem(\Magento\Quote\Model\Quote\Item $item): self { + $instance = new self($item->getData()); + $instance->setData('qty', $item->getTotalQty()); // only configurable items have correct quantity + $instance->setData('product', $item->getProduct()); + + $children = []; + foreach ($item->getChildren() as $child) { + $children[] = self::fromQuoteItem($child); + } + + $instance->setData('children', $children); + + return $instance; + } + + /** + * @param \Magento\Sales\Model\Order\Item $item + * @return static + */ + public static function fromOrderItem(\Magento\Sales\Model\Order\Item $item): self { + $instance = new self($item->getData()); + $instance->setData('qty', $item->getQtyOrdered()); + $instance->setData('product', $item->getProduct()); + + $children = []; + foreach ($item->getChildrenItems() as $child) { + $children[] = self::fromOrderItem($child); + } + + $instance->setData('children', $children); + return $instance; + } +} diff --git a/Packetery/Checkout/Observer/Sales/OrderPlaceAfter.php b/Packetery/Checkout/Observer/Sales/OrderPlaceAfter.php index ba1b997..81d7a6a 100755 --- a/Packetery/Checkout/Observer/Sales/OrderPlaceAfter.php +++ b/Packetery/Checkout/Observer/Sales/OrderPlaceAfter.php @@ -25,18 +25,33 @@ class OrderPlaceAfter implements \Magento\Framework\Event\ObserverInterface /** @var \Magento\Shipping\Model\CarrierFactory */ private $carrierFactory; + /** @var \Packetery\Checkout\Model\Weight\Calculator */ + private $weightCalculator; + + /** + * OrderPlaceAfter constructor. + * + * @param \Magento\Checkout\Model\Session $checkoutSession + * @param \Magento\Store\Model\StoreManagerInterface $storeManager + * @param \Packetery\Checkout\Model\Carrier\Imp\Packetery\Carrier $packetery + * @param \Packetery\Checkout\Model\ResourceModel\Order\CollectionFactory $orderCollectionFactory + * @param \Magento\Shipping\Model\CarrierFactory $carrierFactory + * @param \Packetery\Checkout\Model\Weight\Calculator $weightCalculator + */ public function __construct( CheckoutSession $checkoutSession, \Magento\Store\Model\StoreManagerInterface $storeManager, \Packetery\Checkout\Model\Carrier\Imp\Packetery\Carrier $packetery, \Packetery\Checkout\Model\ResourceModel\Order\CollectionFactory $orderCollectionFactory, - \Magento\Shipping\Model\CarrierFactory $carrierFactory + \Magento\Shipping\Model\CarrierFactory $carrierFactory, + \Packetery\Checkout\Model\Weight\Calculator $weightCalculator ) { $this->storeManager = $storeManager; $this->checkoutSession = $checkoutSession; $this->packeteryConfig = $packetery->getPacketeryConfig(); $this->orderCollectionFactory = $orderCollectionFactory; $this->carrierFactory = $carrierFactory; + $this->weightCalculator = $weightCalculator; } /** @@ -72,11 +87,7 @@ public function execute( $street = $streetMatches[1]; } - $weight = 0; - foreach ($order->getAllItems() as $item) - { - $weight += ($item->getWeight() * $item->getQtyOrdered()); - } + $weight = $this->weightCalculator->getOrderWeight($order); $postData = json_decode(file_get_contents("php://input")); $pointId = NULL; diff --git a/Packetery/Checkout/Ui/Component/ExportButton.php b/Packetery/Checkout/Ui/Component/ExportButton.php new file mode 100644 index 0000000..8933124 --- /dev/null +++ b/Packetery/Checkout/Ui/Component/ExportButton.php @@ -0,0 +1,24 @@ +getConfig(); + $options = $config['options']; + + unset($options['xml']); + unset($options['csv']); + $config['options'] = $options; + $this->setConfig($config); + + parent::prepare(); + } +} diff --git a/Packetery/Checkout/Ui/Component/Order/Listing/ByFieldColumnTrait.php b/Packetery/Checkout/Ui/Component/Order/Listing/ByFieldColumnTrait.php new file mode 100644 index 0000000..eba6405 --- /dev/null +++ b/Packetery/Checkout/Ui/Component/Order/Listing/ByFieldColumnTrait.php @@ -0,0 +1,17 @@ +getData('packetery/byField') ?? $this->getData('name'); + } +} diff --git a/Packetery/Checkout/Ui/Component/Order/Listing/Column/Actions.php b/Packetery/Checkout/Ui/Component/Order/Listing/Column/Actions.php new file mode 100644 index 0000000..1adeb56 --- /dev/null +++ b/Packetery/Checkout/Ui/Component/Order/Listing/Column/Actions.php @@ -0,0 +1,76 @@ +_urlBuilder = $urlBuilder; + $this->_viewUrl = $viewUrl; + $this->orderFactory = $orderFactory; + parent::__construct($context, $uiComponentFactory, $components, $data); + } + + /** + * Prepare Data Source + * + * @param array $dataSource + * @return array + */ + public function prepareDataSource(array $dataSource): array + { + if (isset($dataSource['data']['items'])) { + foreach ($dataSource['data']['items'] as &$item) { + $name = $this->getData('name'); + + $orderNumber = $item['order_number']; + $order = $this->orderFactory->create()->loadByIncrementId($orderNumber); + $shippingMethod = $order->getShippingMethod(true); + + if ($shippingMethod && ($shippingMethod->getData('method') === Methods::PICKUP_POINT_DELIVERY || $shippingMethod->getData('method') === 'packetery')) { + $item[$name]['view'] = [ + 'href' => $this->_urlBuilder->getUrl($this->_viewUrl, ['id' => $item['id']]), + 'label' => __('Edit') + ]; + } + } + } + + return $dataSource; + } +} diff --git a/Packetery/Checkout/Ui/Component/Order/Listing/Column/CreatedDate.php b/Packetery/Checkout/Ui/Component/Order/Listing/Column/CreatedDate.php new file mode 100644 index 0000000..e8fbc88 --- /dev/null +++ b/Packetery/Checkout/Ui/Component/Order/Listing/Column/CreatedDate.php @@ -0,0 +1,60 @@ +orderFactory = $orderFactory; + } + + /** + * @param array $dataSource + * @return array + */ + public function prepareDataSource(array $dataSource): array { + if (isset($dataSource['data']['items'])) { + foreach ($dataSource['data']['items'] as &$item) { + $orderNumber = $item['order_number']; + $order = $this->orderFactory->create()->loadByIncrementId($orderNumber); + + try { + $item[$this->getData('name')] = $order->getCreatedAtFormatted(\IntlDateFormatter::MEDIUM); + } catch (LocalizedException $e) { + } + } + } + + return $dataSource; + } + + protected function applySorting() { + // no DB select sorting + } +} diff --git a/Packetery/Checkout/Ui/Component/Order/Listing/Column/DateTime.php b/Packetery/Checkout/Ui/Component/Order/Listing/Column/DateTime.php new file mode 100644 index 0000000..4f795f3 --- /dev/null +++ b/Packetery/Checkout/Ui/Component/Order/Listing/Column/DateTime.php @@ -0,0 +1,87 @@ +localeDate = $localeDate; + $this->localeResolver = $localeResolver; + } + + /** + * @param array $dataSource + * @return array + */ + public function prepareDataSource(array $dataSource): array { + if (isset($dataSource['data']['items'])) { + foreach ($dataSource['data']['items'] as &$item) { + $value = $item[$this->getByField()]; + if ($value) { + $item[$this->getData('name')] = $this->formatDate($value, \IntlDateFormatter::MEDIUM, true); + } + } + } + + return $dataSource; + } + + /** + * Retrieve formatting date + * + * @param null|string|\DateTimeInterface $date + * @param int $format + * @param bool $showTime + * @param null|string $timezone + * @return string + */ + public function formatDate( + $date = null, + $format = \IntlDateFormatter::SHORT, + $showTime = false, + $timezone = null + ): string { + $date = ($date instanceof \DateTimeInterface ? $date : new \DateTime($date ?? 'now')); + return $this->localeDate->formatDateTime( + $date, + $format, + $showTime ? $format : \IntlDateFormatter::NONE, + $this->localeResolver->getDefaultLocale(), + $timezone + ); + } +} diff --git a/Packetery/Checkout/Ui/Component/Order/Listing/Column/DeliveryDestination.php b/Packetery/Checkout/Ui/Component/Order/Listing/Column/DeliveryDestination.php new file mode 100644 index 0000000..4b3c653 --- /dev/null +++ b/Packetery/Checkout/Ui/Component/Order/Listing/Column/DeliveryDestination.php @@ -0,0 +1,88 @@ +methodSelect = $methodSelect; + $this->orderCollectionFactory = $orderCollectionFactory; + $this->carrierFacade = $carrierFacade; + } + + /** + * @param array $dataSource + * @return array + */ + public function prepareDataSource(array $dataSource): array { + if (isset($dataSource['data']['items'])) { + foreach ($dataSource['data']['items'] as &$item) { + $orderNumber = $item['order_number']; + $collection = $this->orderCollectionFactory->create(); + /** @var \Magento\Sales\Model\Order $item */ + $order = $collection->getItemByColumnValue('increment_id', $orderNumber); + $shippingMethod = $order->getShippingMethod(true); + $shippingAddress = $order->getShippingAddress(); + $carrierCode = $shippingMethod->getData('carrier_code'); + $methodCode = MethodCode::fromString($shippingMethod->getData('method')); + $carrier = $this->carrierFacade->createHybridCarrier($carrierCode, $methodCode->getDynamicCarrierId(), $methodCode->getMethod(), $shippingAddress->getCountryId()); + + $branchName = (string)$item['point_name']; + $branchId = $item['point_id']; + $methodContent = $this->methodSelect->getLabelByValue($methodCode->getMethod()); + if ($branchId && $methodCode->getMethod() === Methods::PICKUP_POINT_DELIVERY) { + $methodContent = sprintf("%s (%s)", $branchName, $branchId); + } + + $item[$this->getData('name')] = new ComboPhrase( + [ + $carrier->getFinalCarrierName(), + ' - ', + $methodContent, + ] + ); + } + } + + return $dataSource; + } + + protected function applySorting() { + // no DB select sorting + } +} diff --git a/Packetery/Checkout/Ui/Component/Order/Listing/Column/FullName.php b/Packetery/Checkout/Ui/Component/Order/Listing/Column/FullName.php new file mode 100644 index 0000000..f3a95c0 --- /dev/null +++ b/Packetery/Checkout/Ui/Component/Order/Listing/Column/FullName.php @@ -0,0 +1,26 @@ +getData('name')] = implode(' ', array_filter([$firstname, $lastname])); + } + } + + return $dataSource; + } +} diff --git a/Packetery/Checkout/Ui/Component/Order/Listing/Column/OrderReference.php b/Packetery/Checkout/Ui/Component/Order/Listing/Column/OrderReference.php new file mode 100644 index 0000000..e82cefe --- /dev/null +++ b/Packetery/Checkout/Ui/Component/Order/Listing/Column/OrderReference.php @@ -0,0 +1,62 @@ +_urlBuilder = $urlBuilder; + $this->orderFactory = $orderFactory; + parent::__construct($context, $uiComponentFactory, $components, $data); + } + + /** + * Prepare Data Source + * + * @param array $dataSource + * @return array + */ + public function prepareDataSource(array $dataSource): array { + if (isset($dataSource['data']['items'])) { + foreach ($dataSource['data']['items'] as &$item) { + $name = $this->getData('name'); + $orderNumber = $item['order_number']; + $order = $this->orderFactory->create()->loadByIncrementId($orderNumber); + $url = $this->_urlBuilder->getUrl('sales/order/view', ['order_id' => $order->getId()]); + $item[$name] = '' . htmlentities($orderNumber) . ''; + } + } + + return $dataSource; + } +} diff --git a/Packetery/Checkout/Ui/Component/Order/Listing/Column/OrderStatus.php b/Packetery/Checkout/Ui/Component/Order/Listing/Column/OrderStatus.php new file mode 100644 index 0000000..ce724c0 --- /dev/null +++ b/Packetery/Checkout/Ui/Component/Order/Listing/Column/OrderStatus.php @@ -0,0 +1,60 @@ +orderFactory = $orderFactory; + } + + /** + * @param array $dataSource + * @return array + */ + public function prepareDataSource(array $dataSource): array { + if (isset($dataSource['data']['items'])) { + foreach ($dataSource['data']['items'] as &$item) { + $orderNumber = $item['order_number']; + $order = $this->orderFactory->create()->loadByIncrementId($orderNumber); + + try { + $item[$this->getData('name')] = $order->getStatusLabel(); + } catch (LocalizedException $e) { + } + } + } + + return $dataSource; + } + + protected function applySorting() { + // no DB select sorting + } +} diff --git a/Packetery/Checkout/Ui/Component/Order/Listing/Column/RecipientAddress.php b/Packetery/Checkout/Ui/Component/Order/Listing/Column/RecipientAddress.php new file mode 100644 index 0000000..47ee056 --- /dev/null +++ b/Packetery/Checkout/Ui/Component/Order/Listing/Column/RecipientAddress.php @@ -0,0 +1,41 @@ +getData('name')] = implode( + ', ', + array_filter( + [ + implode( + ' ', + array_filter( + [ + $item['recipient_street'], + $item['recipient_house_number'], + ] + ) + ), + $item['recipient_city'], + $item['recipient_zip'], + ] + ) + ); + } + } + + return $dataSource; + } +} diff --git a/Packetery/Checkout/Ui/Component/Order/Listing/Column/Value.php b/Packetery/Checkout/Ui/Component/Order/Listing/Column/Value.php new file mode 100644 index 0000000..1552eaa --- /dev/null +++ b/Packetery/Checkout/Ui/Component/Order/Listing/Column/Value.php @@ -0,0 +1,63 @@ +currencyFactory = $currencyFactory; + } + + /** + * @param array $dataSource + * @return array + */ + public function prepareDataSource(array $dataSource): array { + if (isset($dataSource['data']['items'])) { + foreach ($dataSource['data']['items'] as &$item) { + $value = $item[$this->getByField()]; + if (!$value) { + continue; + } + + $options = [ + 'display' => \Magento\Framework\Currency::NO_SYMBOL + ]; + + $currency = $this->currencyFactory->create()->load($item['currency']); + $item[$this->getData('name')] = $currency->formatPrecision((float)$value, PriceCurrencyInterface::DEFAULT_PRECISION, $options, false); + } + } + + return $dataSource; + } +} diff --git a/Packetery/Checkout/Ui/Component/Order/Listing/Column/YesNo.php b/Packetery/Checkout/Ui/Component/Order/Listing/Column/YesNo.php new file mode 100644 index 0000000..b78adba --- /dev/null +++ b/Packetery/Checkout/Ui/Component/Order/Listing/Column/YesNo.php @@ -0,0 +1,33 @@ +getByField()]; + + if (is_numeric($value)) { + $value = (float)$value; + } + + $item[$this->getData('name')] = (!empty($value) ? __('Yes') : __('No')); + } + } + + return $dataSource; + } +} diff --git a/Packetery/Checkout/Ui/Component/Order/Listing/Filter/OrderStatusSelect.php b/Packetery/Checkout/Ui/Component/Order/Listing/Filter/OrderStatusSelect.php new file mode 100644 index 0000000..f1177fd --- /dev/null +++ b/Packetery/Checkout/Ui/Component/Order/Listing/Filter/OrderStatusSelect.php @@ -0,0 +1,26 @@ +statusCollectionFactory = $statusCollectionFactory; + } + + public function toOptionArray() { + return $this->statusCollectionFactory->toOptionArray(); + } +} diff --git a/Packetery/Checkout/Ui/Component/Order/Listing/SearchResult.php b/Packetery/Checkout/Ui/Component/Order/Listing/SearchResult.php new file mode 100644 index 0000000..9efff01 --- /dev/null +++ b/Packetery/Checkout/Ui/Component/Order/Listing/SearchResult.php @@ -0,0 +1,40 @@ +getTable('packetery_order'); + $orderTable = $this->getTable('sales_order'); + + $this->getSelect() + ->from( + [ + 'main_table' => new Expression( + "( + SELECT + main_table.order_number AS order_number_reference, + CONCAT_WS('', main_table.recipient_firstname, ' ',main_table.recipient_lastname) AS recipient_fullname, + CONCAT_WS('', main_table.recipient_street, ' ', main_table.recipient_house_number, ' ', main_table.recipient_city, ' ', main_table.recipient_zip) AS recipient_address, + CONCAT_WS('', main_table.point_name, ' ', main_table.point_id) AS delivery_destination, + main_table.value AS value_transformed, + IF(main_table.cod > 0, 1, 0) AS cod_transformed, + main_table.exported AS exported_transformed, + main_table.exported_at AS exported_at_transformed, + sales_order.status AS order_status, + main_table.* + FROM {$packeteryOrderTable} AS main_table + LEFT JOIN {$orderTable} AS sales_order ON sales_order.increment_id = main_table.order_number + )" + ), + ] + ); + + return $this; + } +} diff --git a/Packetery/Checkout/Ui/Component/YesNoSelect.php b/Packetery/Checkout/Ui/Component/YesNoSelect.php new file mode 100644 index 0000000..6d11f40 --- /dev/null +++ b/Packetery/Checkout/Ui/Component/YesNoSelect.php @@ -0,0 +1,20 @@ + __('Yes'), 'value' => 1]; + $options[] = ['label' => __('No'), 'value' => 0]; + + return $options; + } +} diff --git a/Packetery/Checkout/etc/di.xml b/Packetery/Checkout/etc/di.xml index dd3af3f..47073e2 100755 --- a/Packetery/Checkout/etc/di.xml +++ b/Packetery/Checkout/etc/di.xml @@ -9,7 +9,7 @@ - + packetery_order Packetery\Checkout\Model\ResourceModel\Order diff --git a/Packetery/Checkout/etc/module.xml b/Packetery/Checkout/etc/module.xml index 8925577..71babf4 100755 --- a/Packetery/Checkout/etc/module.xml +++ b/Packetery/Checkout/etc/module.xml @@ -1,6 +1,6 @@ - + diff --git a/Packetery/Checkout/i18n/cs_CZ.csv b/Packetery/Checkout/i18n/cs_CZ.csv index 3aead54..2aaca02 100755 --- a/Packetery/Checkout/i18n/cs_CZ.csv +++ b/Packetery/Checkout/i18n/cs_CZ.csv @@ -29,6 +29,7 @@ "Exported","Exportováno" "Export date","Datum exportu" "CSV - only not exported","CSV - Pouze neexportované" +"CSV - selected only","CSV - Vybrané záznamy" "CSV - all records","CSV - Všechny záznamy" "Order status","Stav objednávky" "Yes","Ano" @@ -97,3 +98,4 @@ "Use carrier?","Použít přepravce?" "Carrier name","Název přepravce" "Packeta Carriers","Přepravci Zásilkovny" +"Weight","Váha" diff --git a/Packetery/Checkout/i18n/en_GB.csv b/Packetery/Checkout/i18n/en_GB.csv index 49cd657..c75dce7 100755 --- a/Packetery/Checkout/i18n/en_GB.csv +++ b/Packetery/Checkout/i18n/en_GB.csv @@ -29,6 +29,7 @@ "Exported","Exported" "Export date","Export date" "CSV - only not exported","CSV - only not exported" +"CSV - selected only","CSV - selected only" "CSV - all records","CSV - all records" "Order status","Order status" "Yes","Yes" @@ -97,3 +98,4 @@ "Use carrier?","Use carrier?" "Carrier name","Carrier name" "Packeta Carriers","Packeta Carriers" +"Weight","Weight" diff --git a/Packetery/Checkout/view/adminhtml/layout/packetery_order_index.xml b/Packetery/Checkout/view/adminhtml/layout/packetery_order_index.xml new file mode 100644 index 0000000..3d85ded --- /dev/null +++ b/Packetery/Checkout/view/adminhtml/layout/packetery_order_index.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/Packetery/Checkout/view/adminhtml/ui_component/packetery_checkout_order_listing.xml b/Packetery/Checkout/view/adminhtml/ui_component/packetery_checkout_order_listing.xml index 0525a82..67d2551 100755 --- a/Packetery/Checkout/view/adminhtml/ui_component/packetery_checkout_order_listing.xml +++ b/Packetery/Checkout/view/adminhtml/ui_component/packetery_checkout_order_listing.xml @@ -23,389 +23,239 @@ - - - - - false - 55 - id - - - - - - - textRange - asc - ID - - - - + + + + - text - - text - - true + packetery_checkout_order_listing.packetery_checkout_order_listing.spinner_columns.ids + + + csv_unexported + CSV - only not exported + packetery/order/exportPacketeryCsv - - Order number - - - - - - - text - - text - - true + + csv_selected + CSV - selected only + packetery/order/exportMass - - Firstname - - - - - - - text - - text - - true + + csv_all + CSV - all records + packetery/order/exportPacketeryCsvAll - Lastname - - - - - text - - text - - true - + + + + + + packetery_checkout_order_listing.packetery_checkout_order_listing.spinner_columns.ids + true + id + + + false + + + + + packetery_checkout_order_listing.packetery_checkout_order_listing.spinner_columns_editor + startEdit + + ${ $.$data.rowIndex } + true - Company - - - - + + + + - text - - text - - true - - - E-Mail + false + 55 + id - - + + + true text - - text - - true - - - Phone + text + Order number + ui/grid/cells/html - + - text - - text - - true - - - COD + false + date + Purchase Date - + + Packetery\Checkout\Ui\Component\Order\Listing\Filter\OrderStatusSelect - text - - text - - true - - - Currency + false + select + select + Order status - + + true text - - text - - true - - - Value + Full name - + + true text - - text - - true - - - Weight + Recipient company - + + true text - - text - - true - - - Point ID + Recipient Email - + + true text - - text - - true - - - Label + Recipient phone number - + + true text - - text - - true - - - Adult content + Recipient address - + + Packetery\Checkout\Ui\Component\YesNoSelect - text - - text - - true - - - Delay + false + select + select + Cash on delivery - - - - - - text - - text - - true - - - Street + + cod - + + true text - - text - - true - - - House number + Currency - + - text - - text - - true - - - City + true + textRange + Total price - - - - - - text - - text - - true - - - ZIP + + value - + - text + false text true + true + true - Carrier point + Weight - + + false text - - text - - true - - - Width + Pickup point address - + + Packetery\Checkout\Ui\Component\YesNoSelect - text - - text - - true - - - Height + true + exported + exported + select + select + Exported - - - - - - text - - text - - true - - - Depth + + exported - + - text - - text - - true - - - Exported + true + Export date - - - - - - text - - text - - true - - - Exported at + + exported_at - - - - + - - - csv - CSV - mui/export/gridToCsv - - - xml - Excel XML - mui/export/gridToXml - - - xls - Csv custom - packetery/export/gridToCsvCustom - - + false + 107 + id - - - + packetery/order/detail + + diff --git a/README.md b/README.md index a534cd7..4f1e607 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ### Download module -[Current version 2.1.0](https://github.com/Zasilkovna/magento2/archive/v2.1.0.zip) +[Current version 2.2.0](https://github.com/Zasilkovna/magento2/archive/v2.2.0.zip) ### Installation @@ -72,6 +72,7 @@ Price rules are created as unavailable, without set maximum weight. - delivery to an address via external carriers - setting different prices for each carrier - free shipping from the specified price +- possibility of bulk weight adjustment in the shipment list - export shipments to a CSV file that can be imported in [client section](https://client.packeta.com/) - possibility to change the pickup point for an existing order in the administration @@ -84,7 +85,7 @@ Price rules are created as unavailable, without set maximum weight. ### Stažení modulu -[Aktuální verze 2.1.0](https://github.com/Zasilkovna/magento2/archive/v2.1.0.zip) +[Aktuální verze 2.2.0](https://github.com/Zasilkovna/magento2/archive/v2.2.0.zip) ### Instalace @@ -152,6 +153,7 @@ Cenová pravidla jsou vytvořena jako nedostupná, bez nastavené maximální hm - doručení na adresu přes externí dopravce Zásilkovny - nastavení různé ceny pro jednotlivé dopravce - doprava zdarma od zadané ceny +- možnost hromadné úpravy hmotnosti v seznamu zásilek - export zásilek do csv souboru, který lze importovat v [klientské sekci](https://client.packeta.com/) - možnost změny výdejního místa u existující objednávky v administraci