table = 'inpost_shipment';
$this->identifier = 'id_shipment';
$this->bootstrap = true;
$this->list_no_link = true;
parent::__construct();
$this->className = InPostShipmentModel::class;
/** @var ShipXConfiguration $configuration */
$configuration = $this->module->getService('inpost.shipping.configuration.shipx');
$this->sandbox = $configuration->isSandboxModeEnabled();
$this->organizationId = $configuration->getOrganizationId();
if ($this->sandbox) {
$this->warnings[] = $this->module->l('Sandbox mode is enabled', self::TRANSLATION_SOURCE);
}
$this->_select = 'o.reference as order_reference, o.id_currency';
$this->_join = 'INNER JOIN `' . _DB_PREFIX_ . 'orders` o ON o.id_order = a.id_order';
$this->_where = '
AND a.sandbox = ' . ($this->sandbox ? 1 : 0) . '
AND a.organization_id = ' . $this->organizationId;
$this->_orderWay = 'desc';
$this->fields_list = $this->getFieldsList();
if ($configuration->hasConfiguration()) {
$this->addListActions();
}
}
protected function getFieldsList()
{
return [
'tracking_number' => [
'title' => $this->module->l('Shipment number', self::TRANSLATION_SOURCE),
'callback' => 'displayTrackingUrl',
],
'order_reference' => [
'title' => $this->module->l('Order reference', self::TRANSLATION_SOURCE),
'callback' => 'displayOrderReference',
'filter_key' => 'o!reference',
],
'price' => [
'type' => 'price',
'currency' => true,
'title' => $this->module->l('Price', self::TRANSLATION_SOURCE),
'search' => false,
'class' => 'fixed-width-xs',
],
'service' => [
'title' => $this->module->l('Service', self::TRANSLATION_SOURCE),
'type' => 'select',
'list' => $this->getShippingServiceList(),
'filter_key' => 'a!service',
'callback' => 'displayShippingServiceName',
],
'sending_method' => [
'title' => $this->module->l('Sending method', self::TRANSLATION_SOURCE),
'type' => 'select',
'list' => $this->getSendingMethodList(),
'filter_key' => 'a!sending_method',
'callback' => 'displaySendingMethodName',
],
'phone' => [
'title' => $this->module->l('Receiver phone', self::TRANSLATION_SOURCE),
],
'email' => [
'title' => $this->module->l('Receiver email', self::TRANSLATION_SOURCE),
],
'reference' => [
'title' => $this->module->l('Reference', self::TRANSLATION_SOURCE),
'filter_key' => 'a!reference',
],
'date_add' => [
'title' => $this->module->l('Created at', self::TRANSLATION_SOURCE),
'type' => 'datetime',
'filter_key' => 'a!date_add',
],
];
}
protected function addListActions()
{
$this->addRowAction('printLabel');
$this->addRowAction('printReturnLabel');
$this->addRowAction('printDispatchOrder');
$this->addRowActionSkipList(
'printDispatchOrder',
InPostShipmentModel::getSkipPrintDispatchOrderList($this->organizationId, $this->sandbox)
);
$this->bulk_actions = [
'printLabels' => [
'text' => $this->module->l('Print labels', self::TRANSLATION_SOURCE),
'icon' => 'icon-print',
],
'printReturnLabels' => [
'text' => $this->module->l('Print return labels', self::TRANSLATION_SOURCE),
'icon' => 'icon-print',
],
'printDispatchOrders' => [
'text' => $this->module->l('Print dispatch orders', self::TRANSLATION_SOURCE),
'icon' => 'icon-print',
],
];
}
public function setMedia($isNewTheme = false)
{
parent::setMedia($isNewTheme);
$this->module->getAssetsManager()
->registerJavaScripts([
'admin/tools.js',
'admin/common.js',
'admin/shipments.js',
])
->registerStyleSheets([
'admin/table-fix.css',
]);
Media::addJsDef([
'controllerUrl' => $this->link->getAdminLink($this->controller_name),
]);
if (!$this->shopContext->is17()) {
$this->module->getAssetsManager()
->registerStyleSheets([
'admin/nav-tabs.css',
]);
}
}
public function initToolbar()
{
parent::initToolbar();
unset($this->toolbar_btn['new']);
$this->toolbar_btn['status_refresh'] = [
'href' => $this->link->getAdminLink($this->controller_name, true, [], [
'action' => 'refreshStatuses',
]),
'desc' => $this->module->l('Refresh shipment statuses', self::TRANSLATION_SOURCE),
'imgclass' => 'refresh',
];
}
public function initModal()
{
parent::initModal();
foreach ($this->getModalServices() as $service) {
/** @var AbstractModal $modal */
$modal = $this->module->getService($service);
$this->modals[] = $modal->getModalData();
}
}
protected function getModalServices()
{
return [
'inpost.shipping.views.modal.print_label',
];
}
public function ajaxProcessBulkRefreshStatuses()
{
if ($shipmentsIds = $this->getOrderShipments()) {
$this->processRefreshStatuses($shipmentsIds);
}
}
public function processRefreshStatuses(array $shipmentIds = [])
{
/** @var UpdateShipmentStatusHandler $handler */
$handler = $this->module->getService('inpost.shipping.handler.shipment.update_status');
$handler->handle($shipmentIds);
if ($this->ajax) {
$this->response['message'] = $this->module->l('Shipment statuses have been updated', self::TRANSLATION_SOURCE);
} else {
$this->redirect_after = $this->link->getAdminLink($this->controller_name, true, [], [
'conf' => 4,
]);
}
}
public function ajaxProcessPrintLabel()
{
$this->processPrintLabel();
}
public function processPrintLabel()
{
/** @var InPostShipmentModel $shipmentModel */
if ($shipmentModel = $this->loadObject()) {
/** @var PrintShipmentLabelHandler $handler */
$handler = $this->module->getService('inpost.shipping.handler.shipment.print_label');
$label = $handler->handle(
$shipmentModel,
$this->resolvePrintOptions(true)
);
$this->offerDownload($label, $shipmentModel->service);
}
}
public function ajaxProcessBulkPrintLabels()
{
$this->boxes = Tools::getValue($this->table . 'Box');
$this->processBulkPrintLabels();
}
public function processBulkPrintLabels()
{
if (is_array($this->boxes) && !empty($this->boxes)) {
/** @var PrintShipmentLabelHandler $handler */
$handler = $this->module->getService('inpost.shipping.handler.shipment.print_label');
$shipmentModels = InPostShipmentModel::getByIds(
$this->boxes,
$this->sandbox,
$this->organizationId
);
$labels = $handler->handleMultiple(
$shipmentModels,
$this->resolvePrintOptions(true)
);
$this->offerDownload($labels);
} else {
$this->errors[] = $this->module->l('You must select at least one item', self::TRANSLATION_SOURCE);
}
}
public function ajaxProcessPrintReturnLabel()
{
$this->processPrintReturnLabel();
}
public function processPrintReturnLabel()
{
/** @var InPostShipmentModel $shipmentModel */
if ($shipmentModel = $this->loadObject()) {
if (in_array($shipmentModel->service, Service::LOCKER_SERVICES)) {
$url = $this->getSzybkieZwrotyUrl();
if ($this->ajax) {
$this->response['redirect'] = $url;
} else {
Tools::redirect($url);
}
} else {
$this->offerDownload(Shipment::getReturnLabel(
$shipmentModel->shipx_shipment_id,
$this->resolvePrintOptions()
));
}
}
}
public function ajaxProcessBulkPrintReturnLabels()
{
$this->boxes = Tools::getValue($this->table . 'Box');
$this->processBulkPrintReturnLabels();
}
public function processBulkPrintReturnLabels()
{
if (is_array($this->boxes) && !empty($this->boxes)) {
$shipmentIds = InPostShipmentModel::getShipXShipmentIds($this->boxes, $this->sandbox, true);
$this->offerDownload(Shipment::getMultipleReturnLabels(
$shipmentIds,
$this->resolvePrintOptions()
));
} else {
$this->errors[] = $this->module->l('You must select at least one item', self::TRANSLATION_SOURCE);
}
}
protected function resolvePrintOptions($withType = false)
{
$query = [];
if ($withType) {
$query['type'] = in_array($type = Tools::getValue('label_type'), Shipment::LABEL_TYPES)
? $type
: Shipment::TYPE_A6;
}
$query['format'] = in_array($format = Tools::getValue('label_format'), Shipment::LABEL_FORMATS)
? $format
: Shipment::FORMAT_PDF;
return [
'query' => $query,
];
}
public function ajaxProcessPrintDispatchOrder()
{
$this->processPrintDispatchOrder();
}
public function processPrintDispatchOrder()
{
/** @var InPostShipmentModel $shipmentModel */
if ($shipmentModel = $this->loadObject()) {
if ($shipmentModel->id_dispatch_order) {
$this->offerDownload(
DispatchOrder::getPrintoutsByShipmentIds([$shipmentModel->shipx_shipment_id]),
'dispatch_order'
);
} else {
$this->errors[] = $this->module->l('No dispatch order for the selected shipment', self::TRANSLATION_SOURCE);
}
}
}
public function ajaxProcessBulkPrintDispatchOrders()
{
if (Tools::isSubmit('orderIds')) {
if (!$this->boxes = $this->getOrderShipments()) {
return;
}
} else {
$this->boxes = Tools::getValue($this->table . 'Box');
}
$this->processBulkPrintDispatchOrders();
}
public function processBulkPrintDispatchOrders()
{
if (is_array($this->boxes) && !empty($this->boxes)) {
$skipList = $this->list_skip_actions['printdispatchorder'];
$boxes = array_filter($this->boxes, function ($id) use ($skipList) {
return !isset($skipList[$id]);
});
if (!empty($boxes)) {
$ids = InPostShipmentModel::getShipXShipmentIds($this->boxes, $this->sandbox, false, true);
$this->offerDownload(DispatchOrder::getPrintoutsByShipmentIds($ids));
} else {
$this->errors[] = $this->module->l('None of the selected shipments has dispatch orders', self::TRANSLATION_SOURCE);
}
} else {
$this->errors[] = $this->module->l('You must select at least one item', self::TRANSLATION_SOURCE);
}
}
protected function getOrderShipments()
{
if ($orderIds = Tools::getValue('orderIds', [])) {
$shipmentIds = InPostShipmentModel::getShipmentIdsByOrderIds(
$orderIds,
$this->sandbox,
$this->organizationId
);
if (empty($shipmentIds)) {
$this->errors[] = $this->module->l('There exist no InPost shipments for selected orders', self::TRANSLATION_SOURCE);
}
return $shipmentIds;
} else {
$this->errors[] = $this->module->l('You must select at least one item', self::TRANSLATION_SOURCE);
}
return [];
}
protected function getSendingMethodList()
{
if (!isset($this->sendingMethodList)) {
$this->sendingMethodList = [];
/** @var SendingMethodTranslator $translator */
$translator = $this->module->getService('inpost.shipping.translations.sending_method');
foreach (SendingMethod::SENDING_METHODS as $method) {
$this->sendingMethodList[$method] = $translator->translate($method);
}
}
return $this->sendingMethodList;
}
protected function getShippingServiceList()
{
if (!isset($this->shippingServiceList)) {
$this->shippingServiceList = [];
/** @var ShippingServiceTranslator $translator */
$translator = $this->module->getService('inpost.shipping.translations.shipping_service');
foreach (Service::SERVICES as $service) {
$this->shippingServiceList[$service] = $translator->translate($service);
}
}
return $this->shippingServiceList;
}
protected function getSzybkieZwrotyUrl()
{
if (!isset($this->szybkieZwrotyUrl)) {
/** @var SzybkieZwrotyConfiguration $configuration */
$configuration = $this->module->getService('inpost.shipping.configuration.szybkie_zwroty');
$this->szybkieZwrotyUrl = $configuration->getOrderReturnFormUrl(true);
}
return $this->szybkieZwrotyUrl;
}
public function displayShippingServiceName($service)
{
$list = $this->getShippingServiceList();
return isset($list[$service]) ? $list[$service] : $service;
}
public function displaySendingMethodName($method)
{
$list = $this->getSendingMethodList();
return isset($list[$method]) ? $list[$method] : $method;
}
public function displayTrackingUrl($trackingNumber)
{
return sprintf(
'%s',
str_replace('@', $trackingNumber, CarrierUpdater::TRACKING_URL),
$trackingNumber
);
}
public function displayOrderReference($reference, $row)
{
return sprintf(
'%s',
$this->link->getAdminLink('AdminOrders', true, [], [
'vieworder' => true,
'id_order' => $row['id_order'],
]),
$reference
);
}
public function displayCreateDispatchOrderLink($token, $id)
{
if (!array_key_exists('createDispatchOrder', self::$cache_lang)) {
self::$cache_lang['createDispatchOrder'] = $this->module->l('Create dispatch order', self::TRANSLATION_SOURCE);
}
return $this->displayLink($token, $id, 'createDispatchOrder', 'truck');
}
public function displayPrintLabelLink($token, $id)
{
if (!array_key_exists('printLabel', self::$cache_lang)) {
self::$cache_lang['printLabel'] = $this->module->l('Print label', self::TRANSLATION_SOURCE);
}
return $this->displayLink($token, $id, 'printLabel');
}
public function displayPrintReturnLabelLink($token, $id)
{
if (!array_key_exists('printReturnLabel', self::$cache_lang)) {
self::$cache_lang['printReturnLabel'] = $this->module->l('Print return label', self::TRANSLATION_SOURCE);
}
if (!isset($this->parcelLockerShipmentIndex)) {
$this->parcelLockerShipmentIndex = [];
foreach ($this->_list as $item) {
if (in_array($item['service'], Service::LOCKER_SERVICES)) {
$this->parcelLockerShipmentIndex[$item['id_shipment']] = true;
}
}
}
return $this->displayLink(
$token,
$id,
'printReturnLabel',
'print',
isset($this->parcelLockerShipmentIndex[$id]) ? $this->getSzybkieZwrotyUrl() : null
);
}
public function displayPrintDispatchOrderLink($token, $id)
{
if (!array_key_exists('printDispatchOrder', self::$cache_lang)) {
self::$cache_lang['printDispatchOrder'] = $this->module->l('Print dispatch order', self::TRANSLATION_SOURCE);
}
return $this->displayLink($token, $id, 'printDispatchOrder');
}
protected function renderNavTabs()
{
/** @var ShipmentNavTabs $view */
$view = $this->module->getService('inpost.shipping.views.shipment_nav_tabs');
return $view->render();
}
}