This commit is contained in:
2026-02-08 21:43:11 +01:00
parent 45b32a5ee2
commit 58947ad589
33 changed files with 3262 additions and 1597 deletions

View File

@@ -0,0 +1,32 @@
<?php
namespace Empik\Marketplace\DataProvider;
use Db;
use DbQuery;
class OrderTrackingDataProvider
{
/**
* @var Db
*/
protected $db;
public function __construct()
{
$this->db = Db::getInstance();
}
public function getOrderTrackingData()
{
$sql = new DbQuery();
$sql->select('o.id_order, o.shipping_number, eo.empik_order_reference, eo.empik_order_carrier');
$sql->from('empik_orders', 'eo');
$sql->leftJoin('orders', 'o', 'eo.id_order = o.id_order');
$sql->where('o.shipping_number IS NOT NULL AND o.shipping_number != ""');
$sql->orderBy('o.date_add DESC');
$sql->limit(20);
return $this->db->executeS($sql);
}
}

View File

@@ -0,0 +1,7 @@
<?php
namespace Empik\Marketplace\Exception;
class ApiException extends \Exception
{
}

View File

@@ -4,23 +4,26 @@
namespace Empik\Marketplace\Handler;
use Context;
use EmpikMarketplace;
use Empik\Marketplace\Adapter\ToolsAdapter;
use Empik\Marketplace\Processor\OrderProcessor;
use Empik\Marketplace\Processor\ExportProductProcessor;
use Empik\Marketplace\Processor\ExportOfferProcessor;
use Empik\Marketplace\Exception\InvalidActionException;
use Empik\Marketplace\Processor\ExportOfferProcessor;
use Empik\Marketplace\Processor\ExportProductProcessor;
use Empik\Marketplace\Processor\OrderProcessor;
use Empik\Marketplace\Processor\TrackingNumberProcessor;
use EmpikMarketplace;
class CronJobsHandler
{
const ACTION_EXPORT_PRODUCTS = 'exportProducts';
const ACTION_EXPORT_OFFERS = 'exportOffers';
const ACTION_IMPORT_ORDERS = 'importOrders';
const ACTION_EXPORT_TRACKING_NUMBERS = 'exportTrackingNumbers';
const ACTIONS = [
self::ACTION_EXPORT_PRODUCTS,
self::ACTION_EXPORT_OFFERS,
self::ACTION_IMPORT_ORDERS,
self::ACTION_EXPORT_TRACKING_NUMBERS,
];
/** @var Context */
@@ -41,18 +44,23 @@ class CronJobsHandler
/** @var OrderProcessor */
protected $orderProcessor;
/** @var TrackingNumberProcessor */
protected $trackingNumberProcessor;
public function __construct(
EmpikMarketplace $module,
ToolsAdapter $tools,
ExportProductProcessor $exportProductProcessor,
ExportOfferProcessor $exportOfferProcessor,
OrderProcessor $orderProcessor
OrderProcessor $orderProcessor,
TrackingNumberProcessor $trackingNumberProcessor
) {
$this->module = $module;
$this->tools = $tools;
$this->exportProductProcessor = $exportProductProcessor;
$this->exportOfferProcessor = $exportOfferProcessor;
$this->orderProcessor = $orderProcessor;
$this->trackingNumberProcessor = $trackingNumberProcessor;
$this->context = Context::getContext();
}
@@ -71,6 +79,9 @@ class CronJobsHandler
case self::ACTION_IMPORT_ORDERS:
$this->orderProcessor->process();
break;
case self::ACTION_EXPORT_TRACKING_NUMBERS:
$this->trackingNumberProcessor->process();
break;
default:
throw new InvalidActionException();
}

View File

@@ -0,0 +1,65 @@
<?php
declare(strict_types=1);
namespace Empik\Marketplace\Helper;
class VersionHelper
{
public static function getVersionsToApply($version, $module): array
{
$dir = _PS_MODULE_DIR_ . 'empikmarketplace/upgrade';
if (file_exists($dir) === false) {
return [];
}
$updateFiles = array_diff(scandir($dir), ['..', '.']);
if (empty($updateFiles)) {
return [];
}
$upgradeFiles = array_filter($updateFiles, function ($file) {
return strpos($file, 'install-') === 0;
});
if (empty($upgradeFiles)) {
return [];
}
$versionNumbers = array_map(function ($item) {
return str_replace('install-', '', str_replace('.php', '', str_replace('_', '.', $item)));
}, $upgradeFiles);
$versionsToApply = self::findVersionsToApply($versionNumbers, (string)$version, (string)$module->version);
if (empty($versionsToApply)) {
return [];
}
return $versionsToApply;
}
private static function findVersionsToApply(array $numbers, string $lowerLimit, string $upperLimit): array
{
return array_filter($numbers, function ($number) use ($lowerLimit, $upperLimit) {
return version_compare($number, $lowerLimit, '>') && version_compare($number, $upperLimit, '<=') ;
});
}
public static function getInstalledVersion($module): string
{
$ver = \Db::getInstance()->getValue(
'SELECT `version`
FROM `' . _DB_PREFIX_ . 'module`
WHERE `name` = "' . pSQL($module->name) . '"'
);
if (!$ver) {
$ver = 0;
}
return (string)$ver;
}
}

View File

@@ -16,7 +16,6 @@ use Empik\Marketplace\Adapter\LoggerAdapter;
use Empik\Marketplace\Adapter\ConfigurationAdapter;
use Empik\Marketplace\Factory\EmpikClientFactory;
use Empik\Marketplace\Handler\UpdateDeleteOfferHandler;
use Empik\Marketplace\Manager\CarrierMapManager;
use PrestaShop\PrestaShop\Core\Grid\Column\Type\DataColumn;
use PrestaShop\PrestaShop\Core\Grid\Definition\GridDefinitionInterface;
use PrestaShop\PrestaShop\Core\Grid\Filter\Filter;
@@ -33,13 +32,8 @@ class HookAction
/** @var Context */
protected $context;
/** @var CarrierMapManager */
protected $carrierMapManager;
public function __construct(CarrierMapManager $carrierMapManager)
public function __construct()
{
$this->carrierMapManager = $carrierMapManager;
$this->module = Module::getInstanceByName('empikmarketplace');
$this->context = Context::getContext();
}
@@ -180,53 +174,7 @@ class HookAction
public function hookActionAdminOrdersTrackingNumberUpdate(array $params)
{
/** @var Order $order */
$order = $params['order'];
/** @var Carrier $carrier */
$carrier = $params['carrier'];
$trackingNumber = isset($_POST['update_order_shipping']['tracking_number'])
? $_POST['update_order_shipping']['tracking_number']
: $order->shipping_number
;
if ($trackingNumber) {
$empikOrder = EmpikOrder::getEmpikOrderByOrderId($order->id);
if (!$empikOrder) {
return;
}
/** @var EmpikClientFactory $empikClientFactory */
$empikClientFactory = $this->module->getService('empik.marketplace.factory.empikClientFactory');
$empikClient = $empikClientFactory->createClient();
/** @var LoggerAdapter $logger */
$logger = $this->module->getService('empik.marketplace.adapter.loggerAdapter');
$carrierName = null;
$carrierUrl = null;
$carrierCode = $this->carrierMapManager->getTypeByCode($empikOrder['empik_order_carrier']);
if (!$carrierCode) {
$carrierName = $carrier->name;
$carrierUrl = str_replace('@', $trackingNumber, $carrier->url);
}
try {
$empikClient->putOrderTracking(
$empikOrder['empik_order_reference'],
$carrierCode,
$carrierName,
$carrierUrl,
$trackingNumber
);
} catch (Exception $e) {
$logger->logError($e->getMessage());
}
}
// Handled by a cron job
}
public function hookActionObjectProductDeleteBefore($params)

View File

@@ -85,6 +85,7 @@ class Installer
$hooksCommon = $module::HOOK_LIST_COMMON;
$hooks17 = $module::HOOK_LIST_17;
$hooks16 = $module::HOOK_LIST_16;
$hooks8 = $module::HOOK_LIST_8;
if ($this->prestaShopContext->is177()) {
$hooks = array_merge($hooksCommon, $hooks17);
@@ -92,6 +93,10 @@ class Installer
$hooks = array_merge($hooksCommon, $hooks16);
}
if ($this->prestaShopContext->is8()) {
$hooks = array_merge($hooks, $hooks8);
}
return $this->module->registerHook(
$hooks
);

View File

@@ -13,4 +13,9 @@ class PrestaShopContext
{
return version_compare(_PS_VERSION_, '1.7.7', '>=');
}
public function is8()
{
return version_compare(_PS_VERSION_, '8.0', '>=');
}
}

View File

@@ -18,7 +18,7 @@ class OrderProcessor
{
const CODE_WAITING_ACCEPTANCE = 'WAITING_ACCEPTANCE';
const CODE_SHIPPING = 'SHIPPING';
/** @var EmpikClientFactory */
protected $empikClientFactory;
@@ -59,7 +59,7 @@ class OrderProcessor
if (!$this->allowAccept && !$this->allowImport) {
return;
}
$response = $this->empikClient->getOrders([
'order_state_codes' => implode(',', $this->getOrderCodesForProcess()),
]);
@@ -111,19 +111,19 @@ class OrderProcessor
$this->logger->logError(sprintf('Error accepting order [%s]', $e->getMessage()));
}
}
protected function getOrderCodesForProcess()
{
$codes = [];
if ($this->allowAccept) {
$codes[] = self::CODE_WAITING_ACCEPTANCE;
}
if ($this->allowImport) {
$codes[] = self::CODE_SHIPPING;
}
return $codes;
}
}

View File

@@ -0,0 +1,87 @@
<?php
namespace Empik\Marketplace\Processor;
use Empik\Marketplace\Adapter\ConfigurationAdapter;
use Empik\Marketplace\DataProvider\OrderTrackingDataProvider;
use Empik\Marketplace\Manager\CarrierMapManager;
use Empik\Marketplace\Service\Api\TrackingNumberUpdater;
use Empik\Marketplace\Service\Api\ShipOrderUpdater;
use Empik\Marketplace\Adapter\LoggerAdapter;
class TrackingNumberProcessor
{
/** @var OrderTrackingDataProvider */
private $orderTrackingDataProvider;
/** @var TrackingNumberUpdater */
private $trackingNumberUpdater;
/** @var ShipOrderUpdater */
private $shipOrderUpdater;
/** @var CarrierMapManager */
protected $carrierMapManager;
/** @var ConfigurationAdapter */
private $configurationAdapter;
/** @var LoggerAdapter */
private $logger;
public function __construct(
OrderTrackingDataProvider $orderTrackingDataProvider,
TrackingNumberUpdater $trackingNumberUpdater,
ShipOrderUpdater $shipOrderUpdater,
CarrierMapManager $carrierMapManager,
ConfigurationAdapter $configurationAdapter,
LoggerAdapter $loggerAdapter
) {
$this->orderTrackingDataProvider = $orderTrackingDataProvider;
$this->trackingNumberUpdater = $trackingNumberUpdater;
$this->shipOrderUpdater = $shipOrderUpdater;
$this->carrierMapManager = $carrierMapManager;
$this->configurationAdapter = $configurationAdapter;
$this->logger = $loggerAdapter;
}
public function process()
{
$shippedOrderStateId = (int)$this->configurationAdapter->get(ConfigurationAdapter::CONF_SHIPPED_ORDER_STATE);
$orders = $this->orderTrackingDataProvider->getOrderTrackingData();
foreach ($orders as $orderData) {
$order = new \Order($orderData['id_order']);
$carrier = new \Carrier($order->id_carrier);
$trackingNumber = $order->shipping_number;
$empikOrderReference = $orderData['empik_order_reference'];
$carrierCode = null;
$carrierName = null;
$carrierUrl = null;
$carrierCode = $this->carrierMapManager->getTypeByCode($orderData['empik_order_carrier']);
if (!$carrierCode) {
$carrierName = $carrier->name;
$carrierUrl = str_replace('@', $trackingNumber, $carrier->url);
}
try {
$this->trackingNumberUpdater->updateTrackingNumber(
$empikOrderReference,
$carrierCode,
$trackingNumber,
$carrierName,
$carrierUrl
);
if ($shippedOrderStateId && $shippedOrderStateId == $order->current_state) {
$this->shipOrderUpdater->updateOrderShipStatus($empikOrderReference);
}
} catch (\Exception $e) {
$this->logger->logError($e->getMessage());
}
}
}
}

View File

@@ -0,0 +1,33 @@
<?php
namespace Empik\Marketplace\Service\Api;
use Empik\Marketplace\API\EmpikClient;
use Empik\Marketplace\Exception\ApiException;
use Empik\Marketplace\Factory\EmpikClientFactory;
class ShipOrderUpdater
{
/** @var EmpikClientFactory */
protected $empikClientFactory;
/** @var EmpikClient */
protected $empikClient;
public function __construct(EmpikClientFactory $empikClientFactory)
{
$this->empikClientFactory = $empikClientFactory;
$this->empikClient = $this->empikClientFactory->createClient();
}
/**
* @throws ApiException
*/
public function updateOrderShipStatus($empikOrderReference) {
try {
$this->empikClient->putOrderShip($empikOrderReference);
} catch (\Exception $e) {
throw new ApiException(sprintf('Error updating ship status [%s]: %s', $empikOrderReference, $e->getMessage()));
}
}
}

View File

@@ -0,0 +1,45 @@
<?php
namespace Empik\Marketplace\Service\Api;
use Empik\Marketplace\API\EmpikClient;
use Empik\Marketplace\Exception\ApiException;
use Empik\Marketplace\Factory\EmpikClientFactory;
class TrackingNumberUpdater
{
/** @var EmpikClientFactory */
protected $empikClientFactory;
/** @var EmpikClient */
protected $empikClient;
public function __construct(EmpikClientFactory $empikClientFactory)
{
$this->empikClientFactory = $empikClientFactory;
$this->empikClient = $this->empikClientFactory->createClient();
}
/**
* @throws ApiException
*/
public function updateTrackingNumber(
$empikOrderReference,
$carrierCode = null,
$trackingNumber = null,
$carrierName = null,
$carrierUrl = null
) {
try {
$this->empikClient->putOrderTracking(
$empikOrderReference,
$carrierCode,
$carrierName,
$carrierUrl,
$trackingNumber
);
} catch (\Exception $e) {
throw new ApiException(sprintf('Error updating tracking number [%s]: %s', $empikOrderReference, $e->getMessage()));
}
}
}

View File

@@ -0,0 +1,48 @@
<?php
namespace Empik\Marketplace\Update;
use Empik\Marketplace\Helper\VersionHelper;
class UpdateRunner
{
private $versions = [];
private $module;
public function __construct($version, $module)
{
$this->versions = VersionHelper::getVersionsToApply($version, $module);
$this->module = $module;
}
public function run()
{
// No code to use in update, skip
if (empty($this->versions)) {
return true;
}
$result = true;
foreach ($this->versions as $version) {
$result &= $this->runVersion($version);
}
return $result;
}
private function runVersion($version)
{
$versionFile = _PS_MODULE_DIR_ . 'empikmarketplace/upgrade/install-' . $version . '.php';
if (!file_exists($versionFile)) {
throw new \Exception('Upgrade file for version ' . $version . ' does not exist');
}
require_once $versionFile;
$functionName = 'upgrade_module_' . str_replace('.', '_', $version);
return call_user_func($functionName, $this->module);
}
}

View File

@@ -0,0 +1,11 @@
<?php
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Location: ../');
exit;

View File

@@ -0,0 +1,34 @@
<?php
namespace Empik\Marketplace\Utils;
class DbUtils
{
public static function safeAddColumn($table, $column, $def)
{
if (!self::columnExists($table, $column))
return \Db::getInstance()->execute('ALTER TABLE `' . _DB_PREFIX_ . $table . '` ADD `' . $column . '` ' . $def);
return true;
}
public static function columnExists($table, $column)
{
$query = 'SELECT COUNT(*)
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND COLUMN_NAME = \'' . pSQL($column) . '\'
AND TABLE_NAME = \'' . _DB_PREFIX_ . pSQL($table) . '\'';
return (bool)\Db::getInstance()->getValue($query);
}
public static function safeDropColumn($table, $column)
{
if (self::columnExists($table, $column)) {
\Db::getInstance()->execute('ALTER TABLE `' . _DB_PREFIX_ . $table . '` DROP `' . $column . '` ');
}
return true;
}
}