_select .= ' , IF( a.sending_method = "' . SendingMethod::DISPATCH_ORDER . '", a.id_dispatch_order IS NOT NULL, NULL ) as dispatch_order'; $this->_where .= ' AND a.status LIKE "' . Status::STATUS_CONFIRMED . '"'; } protected function getFieldsList() { return array_merge(parent::getFieldsList(), [ 'label_printed' => [ 'type' => 'bool', 'title' => $this->module->l('Label printed', self::TRANSLATION_SOURCE), 'class' => 'fixed-width-xs', 'align' => 'center', 'callback' => 'displayBoolean', ], 'dispatch_order' => [ 'type' => 'bool', 'title' => $this->module->l('Dispatch order', self::TRANSLATION_SOURCE), 'tmpTableFilter' => true, 'class' => 'fixed-width-xs', 'align' => 'center', 'callback' => 'displayBoolean', ], ]); } protected function addListActions() { parent::addListActions(); $this->addRowAction('createDispatchOrder'); $this->addRowActionSkipList( 'createDispatchOrder', InPostShipmentModel::getSkipCreateDispatchOrderList($this->organizationId, $this->sandbox) ); $this->bulk_actions = array_merge( array_slice($this->bulk_actions, 0, 2), [ 'createDispatchOrders' => [ 'text' => $this->module->l('Create dispatch orders', self::TRANSLATION_SOURCE), 'icon' => 'icon-truck', ], ], array_slice($this->bulk_actions, 2) ); } protected function getModalServices() { return array_merge(parent::getModalServices(), [ 'inpost.shipping.views.modal.dispatch_order', ]); } public function initBreadcrumbs($tab_id = null, $tabs = null) { parent::initBreadcrumbs($tab_id, $tabs); if (!$this->shopContext->is17()) { $this->breadcrumbs[] = $this->module->l('Confirmed shipments', Tabs::TRANSLATION_SOURCE); } } public function ajaxProcessCreateShipment() { /** @var CreateShipmentHandler $handler */ $handler = $this->module->getService('inpost.shipping.handler.shipment.create'); if ($shipment = $handler->handle(Tools::getAllValues())) { $this->response['shipmentId'] = $shipment->id; } $this->errors = $handler->getErrors(); } public function ajaxProcessBulkCreateShipment() { /** @var BulkCreateShipmentHandler $handler */ $handler = $this->module->getService('inpost.shipping.handler.shipment.bulk_create'); if ($shipments = $handler->handle(Tools::getAllValues())) { $this->response['shipmentIds'] = array_map(function (InPostShipmentModel $shipment) { return $shipment->id; }, $shipments); } if ($handler->hasErrors()) { $this->errors = $handler->getErrors(); } else { $this->response['redirect'] = $this->link->getAdminLink($this->controller_name); } } public function ajaxProcessViewShipment() { /** @var InPostShipmentModel $shipment */ if ($shipment = $this->loadObject()) { /** @var ShipmentDetailsModal $modal */ $modal = $this->module->getService('inpost.shipping.views.modal.shipment_details'); $template = $this->shopContext->is177() ? 'views/templates/hook/177/modal/shipment-details.tpl' : 'views/templates/hook/modal/shipment-details.tpl'; $this->response['content'] = $modal->setShipment($shipment) ->setTemplate($template) ->renderContent(); } } public function ajaxProcessCreateDispatchOrder() { /** @var InPostShipmentModel $shipment */ if ($shipment = $this->loadObject()) { if ($shipment->id_dispatch_order) { $this->errors[] = $this->module->l('A dispatch order for this shipment already exists', self::TRANSLATION_SOURCE); } else { /** @var CreateDispatchOrderHandler $handler */ $handler = $this->module->getService('inpost.shipping.handler.dispatch_order.create'); if ($result = $handler->handle([$shipment->shipx_shipment_id], Tools::getValue('id_dispatch_point'))) { $shipment->id_dispatch_order = $result->id; $shipment->update(); $this->dispatchOrderRedirect(); } else { $this->errors = $handler->getErrors(); } } } } public function ajaxProcessBulkCreateDispatchOrders() { if (Tools::isSubmit('orderIds')) { if (!$this->boxes = $this->getOrderShipments()) { return; } } else { $this->boxes = Tools::getValue($this->table . 'Box'); } $this->processBulkCreateDispatchOrders(); } public function processBulkCreateDispatchOrders() { if (is_array($this->boxes) && !empty($this->boxes)) { $skipList = $this->list_skip_actions['createdispatchorder']; $boxes = array_filter($this->boxes, function ($id) use ($skipList) { return !isset($skipList[$id]); }); if (!empty($boxes)) { /** @var CreateDispatchOrderHandler $handler */ $handler = $this->module->getService('inpost.shipping.handler.dispatch_order.create'); $collection = (new PrestaShopCollection(InPostShipmentModel::class)) ->where('id_shipment', '=', $boxes) ->where('sending_method', '=', SendingMethod::DISPATCH_ORDER); $shipmentIndex = []; $idIndex = []; /** @var InPostShipmentModel $shipment */ foreach ($collection as $shipment) { $key = in_array($shipment->service, Service::LOCKER_SERVICES) ? 'locker' : 'courier'; $shipmentIndex[$key][] = $shipment; $idIndex[$key][] = $shipment->shipx_shipment_id; } foreach ($idIndex as $key => $ids) { if ($result = $handler->handle($ids, Tools::getValue('id_dispatch_point'))) { foreach ($shipmentIndex[$key] as $shipment) { $shipment->id_dispatch_order = $result->id; $shipment->update(); } } else { $this->errors = $handler->getErrors(); } } $this->dispatchOrderRedirect(); } else { $this->errors[] = $this->module->l('All of the selected shipments already have dispatch orders or have a different sending method', self::TRANSLATION_SOURCE); } } else { $this->errors[] = $this->module->l('You must select at least one item', self::TRANSLATION_SOURCE); } } protected function dispatchOrderRedirect() { $url = $this->link->getAdminLink(Tabs::DISPATCH_ORDERS_CONTROLLER_NAME, true, [], [ 'conf' => 4, ]); if ($this->ajax) { $this->response['redirect'] = $url; } else { $this->redirect_after = $url; } } public function displayBoolean($value) { if ($value !== null) { return $value ? $this->module->l('Yes', self::TRANSLATION_SOURCE) : $this->module->l('No', self::TRANSLATION_SOURCE); } return null; } }