update
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
7
modules/empikmarketplace/src/Exception/ApiException.php
Normal file
7
modules/empikmarketplace/src/Exception/ApiException.php
Normal file
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
|
||||
namespace Empik\Marketplace\Exception;
|
||||
|
||||
class ApiException extends \Exception
|
||||
{
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
65
modules/empikmarketplace/src/Helper/VersionHelper.php
Normal file
65
modules/empikmarketplace/src/Helper/VersionHelper.php
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
);
|
||||
|
||||
@@ -13,4 +13,9 @@ class PrestaShopContext
|
||||
{
|
||||
return version_compare(_PS_VERSION_, '1.7.7', '>=');
|
||||
}
|
||||
|
||||
public function is8()
|
||||
{
|
||||
return version_compare(_PS_VERSION_, '8.0', '>=');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
48
modules/empikmarketplace/src/Update/UpdateRunner.php
Normal file
48
modules/empikmarketplace/src/Update/UpdateRunner.php
Normal 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);
|
||||
}
|
||||
}
|
||||
11
modules/empikmarketplace/src/Update/index.php
Normal file
11
modules/empikmarketplace/src/Update/index.php
Normal 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;
|
||||
34
modules/empikmarketplace/src/Utils/DbUtils.php
Normal file
34
modules/empikmarketplace/src/Utils/DbUtils.php
Normal 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user