From 3c0afdbb582aa2881501639e9d4b3e46d7031ca1 Mon Sep 17 00:00:00 2001 From: Kostandin Dimitrijevic Date: Wed, 18 Dec 2019 18:10:36 +0100 Subject: [PATCH 01/44] Add queue item cleanup Updated to latest Core. Issue: PLCORE20-8 --- .../Migrations/Scripts/migration.v.0.9.0.php | 36 ++++++++++++++++++ .../backend/_resources/js/AjaxService.js | 4 ++ .../js/ShippingMethodsController.js | 7 +++- Packlink/composer.json | 4 +- Packlink/composer.lock | 12 +++--- Packlink/plugin.xml | 2 +- PluginInstallation/0.1.0/Packlink.zip | Bin 1669060 -> 1668598 bytes 7 files changed, 55 insertions(+), 10 deletions(-) create mode 100644 Packlink/Migrations/Scripts/migration.v.0.9.0.php diff --git a/Packlink/Migrations/Scripts/migration.v.0.9.0.php b/Packlink/Migrations/Scripts/migration.v.0.9.0.php new file mode 100644 index 0000000..eaa81f0 --- /dev/null +++ b/Packlink/Migrations/Scripts/migration.v.0.9.0.php @@ -0,0 +1,36 @@ +getMessage()}"); + + return false; +} + +$schedule = new HourlySchedule( + new TaskCleanupTask(ScheduleCheckTask::getClassName(), array(QueueItem::COMPLETED), 3600), + $configuration->getDefaultQueueName() +); + +$schedule->setMinute(10); +$schedule->setNextSchedule(); +$repository->save($schedule); + +Logger::logInfo('Update script V0.9.0 has been successfully completed.'); + +return true; diff --git a/Packlink/Resources/views/backend/_resources/js/AjaxService.js b/Packlink/Resources/views/backend/_resources/js/AjaxService.js index c61ff78..3f1682d 100644 --- a/Packlink/Resources/views/backend/_resources/js/AjaxService.js +++ b/Packlink/Resources/views/backend/_resources/js/AjaxService.js @@ -44,6 +44,10 @@ var Packlink = window.Packlink || {}; */ this.call = function (method, url, data, onSuccess, onError) { let request = getRequest(); + + url = url.replace('https:', ''); + url = url.replace('http:', ''); + request.open(method, url, true); request.onreadystatechange = function () { diff --git a/Packlink/Resources/views/backend/_resources/js/ShippingMethodsController.js b/Packlink/Resources/views/backend/_resources/js/ShippingMethodsController.js index b1f6402..764b923 100644 --- a/Packlink/Resources/views/backend/_resources/js/ShippingMethodsController.js +++ b/Packlink/Resources/views/backend/_resources/js/ShippingMethodsController.js @@ -898,7 +898,12 @@ var Packlink = window.Packlink || {}; if (configuration.hasCountryConfiguration) { methodModel.isShipToAllCountries = countrySelector.isShipToAllCountries; - methodModel.shippingCountries = countrySelector.shippingCountries; + + if (!methodModel.isShipToAllCountries) { + methodModel.shippingCountries = countrySelector.shippingCountries; + } else { + methodModel.shippingCountries = []; + } countrySelector = {}; } diff --git a/Packlink/composer.json b/Packlink/composer.json index c4426b8..d8ed659 100755 --- a/Packlink/composer.json +++ b/Packlink/composer.json @@ -2,7 +2,7 @@ "name": "packlink/shopware", "description": "Packlink Shipping Shopware plugin", "type": "library", - "version": "0.1.0", + "version": "0.9.0", "repositories": [ { "type": "vcs", @@ -13,7 +13,7 @@ "minimum-stability": "dev", "require": { "php": ">=5.6", - "packlink/integration-core": "dev-release/v1.5.0", + "packlink/integration-core": "dev-release/v2.0.0", "ext-json": "*", "ext-curl": "*", "ext-zip": "*", diff --git a/Packlink/composer.lock b/Packlink/composer.lock index 1f0abd2..faca239 100644 --- a/Packlink/composer.lock +++ b/Packlink/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "06ae4f4352fe613ecc32ea5933480ccf", + "content-hash": "58dd3e0326ab3108c1f21b54591a8655", "packages": [ { "name": "iio/libmergepdf", @@ -58,16 +58,16 @@ }, { "name": "packlink/integration-core", - "version": "dev-release/v1.5.0", + "version": "dev-release/v2.0.0", "source": { "type": "git", "url": "git@github.com:logeecom/pl_module_core.git", - "reference": "d85c4077d0dc91f1545bf7aee9f088c8de1f2824" + "reference": "c7377797419c70b5478c993c7cf491594c480e70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/logeecom/pl_module_core/zipball/d85c4077d0dc91f1545bf7aee9f088c8de1f2824", - "reference": "d85c4077d0dc91f1545bf7aee9f088c8de1f2824", + "url": "https://api.github.com/repos/logeecom/pl_module_core/zipball/c7377797419c70b5478c993c7cf491594c480e70", + "reference": "c7377797419c70b5478c993c7cf491594c480e70", "shasum": "" }, "require": { @@ -94,7 +94,7 @@ "proprietary" ], "description": "Packlink integrations core library", - "time": "2019-11-05T12:57:26+00:00" + "time": "2019-12-18T16:27:57+00:00" }, { "name": "setasign/fpdf", diff --git a/Packlink/plugin.xml b/Packlink/plugin.xml index fbf3d05..a100728 100644 --- a/Packlink/plugin.xml +++ b/Packlink/plugin.xml @@ -5,7 +5,7 @@ - 0.1.0 + 0.9.0 (c) by Packlink Shipping S.L. proprietary https://pro.packlink.de/ diff --git a/PluginInstallation/0.1.0/Packlink.zip b/PluginInstallation/0.1.0/Packlink.zip index 4f4432a457895704f9a5651cbb29dbf362254649..b161545754b722a11aa8c59fffb8de56bfbd3661 100644 GIT binary patch delta 76769 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 PX7A;inhdg$;D7%E>B`i= delta 77316 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 From 1070118c2223c5e5cc58a99430a90150164fac17 Mon Sep 17 00:00:00 2001 From: Kostandin Dimitrijevic Date: Thu, 19 Dec 2019 16:56:03 +0100 Subject: [PATCH 02/44] Add all base repository unit tests Issue: PLCORE20-9 --- Packlink/Repositories/BaseRepository.php | 36 +++++++- Packlink/Tests/BaseRepositoryWrapperTest.php | 89 ++++++++++++++++++- Packlink/Tests/PluginTest.php | 2 +- .../Tests/QueueItemRepositoryWrapperTest.php | 5 +- .../BaseQueueItemRepositoryTestAdapter.php | 5 +- ...tper.php => BaseRepositoryTestAdapter.php} | 5 +- 6 files changed, 128 insertions(+), 14 deletions(-) rename Packlink/Tests/TestComponents/{BaseRepositoryTestAddatper.php => BaseRepositoryTestAdapter.php} (90%) diff --git a/Packlink/Repositories/BaseRepository.php b/Packlink/Repositories/BaseRepository.php index 910cec7..811267f 100644 --- a/Packlink/Repositories/BaseRepository.php +++ b/Packlink/Repositories/BaseRepository.php @@ -107,6 +107,7 @@ public function selectOne(QueryFilter $filter = null) * * @return int Identifier of saved entity. * @throws \Doctrine\ORM\OptimisticLockException + * @throws \Doctrine\ORM\ORMException */ public function save(Entity $entity) { @@ -174,7 +175,6 @@ public function delete(Entity $entity) * * @return int Number of records that match filter criteria. * - * @throws \Doctrine\ORM\NoResultException * @throws \Doctrine\ORM\NonUniqueResultException * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException */ @@ -273,8 +273,8 @@ protected function getQueryParts(array $conditionGroups, array $indexMap, $alias foreach ($conditionGroups as $group) { $subPart = []; - foreach ($group as $condtion) { - $subPart[] = $this->getQueryPart($condtion, $indexMap, $alias); + foreach ($group as $condition) { + $subPart[] = $this->getQueryPart($condition, $indexMap, $alias); } if (!empty($subPart)) { @@ -304,12 +304,39 @@ protected function getQueryPart(QueryCondition $condition, array $indexMap, $ali $part = "$alias.index_" . $indexMap[$column] . ' ' . $condition->getOperator(); if (!in_array($condition->getOperator(), array(Operators::NULL, Operators::NOT_NULL), true)) { - $part .= " '" . IndexHelper::castFieldValue($condition->getValue(), $condition->getValueType()) . "'"; + if (in_array($condition->getOperator(), array(Operators::NOT_IN, Operators::IN), true)) { + $part .= $this->getInOperatorValues($condition); + } else { + $part .= " '" . IndexHelper::castFieldValue($condition->getValue(), $condition->getValueType()) . "'"; + } } return $part; } + /** + * Handles values for the IN and NOT IN operators, + * + * @param QueryCondition $condition + * + * @return string + */ + protected function getInOperatorValues(QueryCondition $condition) + { + $values = array_map( + function ($item) { + if (is_string($item)) { + return "'$item'"; + } + + return "'" . IndexHelper::castFieldValue($item, is_int($item) ? 'integer' : 'double') . "'"; + }, + $condition->getValue() + ); + + return '(' . implode(',', $values) . ')'; + } + /** * Retrieves query result. * @@ -366,6 +393,7 @@ protected function unserializeEntity($data) * @return int * * @throws \Doctrine\ORM\OptimisticLockException + * @throws \Doctrine\ORM\ORMException */ protected function persistEntity(Entity $entity, BaseEntity $persistedEntity) { diff --git a/Packlink/Tests/BaseRepositoryWrapperTest.php b/Packlink/Tests/BaseRepositoryWrapperTest.php index 9e96389..62c4b66 100644 --- a/Packlink/Tests/BaseRepositoryWrapperTest.php +++ b/Packlink/Tests/BaseRepositoryWrapperTest.php @@ -4,8 +4,8 @@ require_once __DIR__ . '/../vendor/autoload.php'; -use Packlink\Tests\TestComponents\BaseRepositoryTestAddatper; -use Shopware\Components\Test\Plugin\TestCase; +use Packlink\Tests\TestComponents\BaseRepositoryTestAdapter; +use PHPUnit\Framework\TestCase; class BaseRepositoryWrapperTest extends TestCase { @@ -13,7 +13,7 @@ class BaseRepositoryWrapperTest extends TestCase 'Packlink' => [], ]; /** - * @var \Packlink\Tests\TestComponents\BaseRepositoryTestAddatper + * @var \Packlink\Tests\TestComponents\BaseRepositoryTestAdapter */ protected $baseTest; @@ -25,7 +25,7 @@ class BaseRepositoryWrapperTest extends TestCase public function __construct() { parent::__construct(...func_get_args()); - $this->baseTest = new BaseRepositoryTestAddatper(...func_get_args()); + $this->baseTest = new BaseRepositoryTestAdapter(...func_get_args()); $entityManager = Shopware()->Container()->get('models'); $this->baseTest->setEntityManager($entityManager); } @@ -112,6 +112,87 @@ public function testQueryWithAndAndOr() $this->baseTest->testQueryWithAndAndOr(); } + /** + * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException + * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException + */ + public function testQueryWithNotEquals() + { + $this->baseTest->testQueryWithNotEquals(); + } + + /** + * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException + * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException + */ + public function testQueryWithGreaterThan() + { + $this->baseTest->testQueryWithGreaterThan(); + } + + /** + * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException + * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException + */ + public function testQueryWithLessThan() + { + $this->baseTest->testQueryWithLessThan(); + } + + /** + * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException + * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException + */ + public function testQueryWithGreaterEqualThan() + { + $this->baseTest->testQueryWithGreaterEqualThan(); + } + + /** + * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException + * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException + */ + public function testQueryWithLessOrEqualThan() + { + $this->baseTest->testQueryWithLessOrEqualThan(); + } + + /** + * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException + * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException + */ + public function testQueryWithCombinedComparisonOperators() + { + $this->baseTest->testQueryWithCombinedComparisonOperators(); + } + + /** + * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException + * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException + */ + public function testQueryWithInOperator() + { + $this->baseTest->testQueryWithInOperator(); + } + + /** + * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException + * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException + */ + public function testQueryWithNotInOperator() + { + $this->baseTest->testQueryWithNotInOperator(); + } + + /** + * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException + * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException + */ + public function testQueryWithLikeOperator() + { + $this->baseTest->testQueryWithLikeOperator(); + } + /** * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException diff --git a/Packlink/Tests/PluginTest.php b/Packlink/Tests/PluginTest.php index 103c55f..00f2aa1 100644 --- a/Packlink/Tests/PluginTest.php +++ b/Packlink/Tests/PluginTest.php @@ -3,7 +3,7 @@ namespace Packlink; use Packlink\Packlink as Plugin; -use Shopware\Components\Test\Plugin\TestCase; +use PHPUnit\Framework\TestCase; class PluginTest extends TestCase { diff --git a/Packlink/Tests/QueueItemRepositoryWrapperTest.php b/Packlink/Tests/QueueItemRepositoryWrapperTest.php index 450eec3..fa85159 100644 --- a/Packlink/Tests/QueueItemRepositoryWrapperTest.php +++ b/Packlink/Tests/QueueItemRepositoryWrapperTest.php @@ -5,7 +5,7 @@ require_once __DIR__ . '/../vendor/autoload.php'; use Packlink\Tests\TestComponents\BaseQueueItemRepositoryTestAdapter; -use Shopware\Components\Test\Plugin\TestCase; +use PHPUnit\Framework\TestCase; class QueueItemRepositoryWrapperTest extends TestCase { @@ -38,7 +38,7 @@ public function __construct() */ public function __call($name, $arguments) { - if (method_exists($this->baseTest, $name) && is_callable([$this->baseTest, $name])) { + if (is_callable([$this->baseTest, $name])) { $this->baseTest->$name(...$arguments); } } @@ -191,6 +191,7 @@ public function testInvalidQueryFilter() * @inheritDoc * * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryClassException + * @throws \Logeecom\Infrastructure\TaskExecution\Exceptions\TaskRunnerStatusStorageUnavailableException */ protected function setUp() { diff --git a/Packlink/Tests/TestComponents/BaseQueueItemRepositoryTestAdapter.php b/Packlink/Tests/TestComponents/BaseQueueItemRepositoryTestAdapter.php index c3e63ff..154e2d0 100644 --- a/Packlink/Tests/TestComponents/BaseQueueItemRepositoryTestAdapter.php +++ b/Packlink/Tests/TestComponents/BaseQueueItemRepositoryTestAdapter.php @@ -3,8 +3,8 @@ namespace Packlink\Tests\TestComponents; use Doctrine\ORM\EntityManager; -use Logeecom\Infrastructure\BootstrapComponent; use Logeecom\Tests\Infrastructure\ORM\AbstractGenericQueueItemRepositoryTest; +use Packlink\Bootstrap\Bootstrap; use Packlink\Tests\TestComponents\Components\TestDatabase; use Packlink\Tests\TestComponents\Components\TestQueueItemRepository; @@ -34,7 +34,7 @@ public function setUp() $database = new TestDatabase($this->entityManager); $database->install(); - BootstrapComponent::init(); + Bootstrap::init(); parent::setUp(); } @@ -58,6 +58,7 @@ public function getQueueItemEntityRepositoryClass() /** * Cleans up all storage services used by repositories * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException + * @throws \Doctrine\Common\Persistence\Mapping\MappingException */ public function cleanUpStorage() { diff --git a/Packlink/Tests/TestComponents/BaseRepositoryTestAddatper.php b/Packlink/Tests/TestComponents/BaseRepositoryTestAdapter.php similarity index 90% rename from Packlink/Tests/TestComponents/BaseRepositoryTestAddatper.php rename to Packlink/Tests/TestComponents/BaseRepositoryTestAdapter.php index 5780d1d..c999ba6 100644 --- a/Packlink/Tests/TestComponents/BaseRepositoryTestAddatper.php +++ b/Packlink/Tests/TestComponents/BaseRepositoryTestAdapter.php @@ -4,10 +4,11 @@ use Doctrine\ORM\EntityManager; use Logeecom\Tests\Infrastructure\ORM\AbstractGenericStudentRepositoryTest; +use Packlink\Bootstrap\Bootstrap; use Packlink\Tests\TestComponents\Components\TestBaseRepository; use Packlink\Tests\TestComponents\Components\TestDatabase; -class BaseRepositoryTestAddatper extends AbstractGenericStudentRepositoryTest +class BaseRepositoryTestAdapter extends AbstractGenericStudentRepositoryTest { /** * @var \Doctrine\ORM\EntityManager @@ -32,6 +33,8 @@ public function setUp() $database = new TestDatabase($this->entityManager); $database->install(); + Bootstrap::init(); + parent::setUp(); } From e7021425d32454d4b75690b4380b21ce446b6266 Mon Sep 17 00:00:00 2001 From: Risto Kekovic Date: Fri, 24 Jan 2020 16:31:15 +0100 Subject: [PATCH 03/44] Refactor order repository ISSUE: PLCORE20-15 --- Packlink/Bootstrap/Bootstrap.php | 12 +- .../PacklinkDraftDetailsController.php | 2 +- .../PacklinkDraftTaskCreateController.php | 23 +- .../PacklinkDraftTaskStatusController.php | 42 +- .../PacklinkOrderDetailsController.php | 27 +- .../Backend/PacklinkPrintLabelsController.php | 2 +- .../Backend/PacklinkShippingMethod.php | 4 - .../Common/CanInstantiateServices.php | 2 +- .../Migrations/Scripts/migration.v.0.9.0.php | 57 +- Packlink/Repositories/OrderRepository.php | 641 ------------------ .../_resources/js/location/LocationPicker.js | 2 +- .../packlink_order_details_controller.js | 10 +- .../BusinessLogic/ShopOrderService.php | 353 ++++++++++ .../ShopShippingMethodService.php | 17 +- Packlink/Subscribers/OrderListHandler.php | 52 +- .../Subscribers/OrderModelEventHandler.php | 56 +- Packlink/composer.lock | 8 +- 17 files changed, 511 insertions(+), 799 deletions(-) delete mode 100644 Packlink/Repositories/OrderRepository.php create mode 100644 Packlink/Services/BusinessLogic/ShopOrderService.php diff --git a/Packlink/Bootstrap/Bootstrap.php b/Packlink/Bootstrap/Bootstrap.php index 7f03205..da83b7c 100644 --- a/Packlink/Bootstrap/Bootstrap.php +++ b/Packlink/Bootstrap/Bootstrap.php @@ -15,8 +15,10 @@ use Logeecom\Infrastructure\TaskExecution\Process; use Logeecom\Infrastructure\TaskExecution\QueueItem; use Packlink\BusinessLogic\BootstrapComponent; -use Packlink\BusinessLogic\Order\Interfaces\OrderRepository as OrderRepositoryInterface; -use Packlink\BusinessLogic\Order\Models\OrderShipmentDetails; +use Packlink\BusinessLogic\Order\Interfaces\ShopOrderService as ShopOrderServiceInterface; +use Packlink\BusinessLogic\ShipmentDraft\Models\OrderSendDraftTaskMap; +use Packlink\Services\BusinessLogic\ShopOrderService; +use Packlink\BusinessLogic\OrderShipmentDetails\Models\OrderShipmentDetails; use Packlink\BusinessLogic\Scheduler\Models\Schedule; use Packlink\BusinessLogic\ShippingMethod\Interfaces\ShopShippingMethodService; use Packlink\BusinessLogic\ShippingMethod\Models\ShippingMethod; @@ -24,7 +26,6 @@ use Packlink\Entities\OrderDropoffMap; use Packlink\Entities\ShippingMethodMap; use Packlink\Repositories\BaseRepository; -use Packlink\Repositories\OrderRepository; use Packlink\Repositories\QueueItemRepository; use Packlink\Services\BusinessLogic\ConfigurationService; use Packlink\Services\Infrastructure\LoggerService; @@ -68,9 +69,9 @@ function () { ); ServiceRegister::registerService( - OrderRepositoryInterface::CLASS_NAME, + ShopOrderServiceInterface::CLASS_NAME, function () { - return new OrderRepository(); + return new ShopOrderService(); } ); @@ -107,5 +108,6 @@ protected static function initRepositories() RepositoryRegistry::registerRepository(ShippingMethod::getClassName(), BaseRepository::getClassName()); RepositoryRegistry::registerRepository(OrderDropoffMap::getClassName(), BaseRepository::getClassName()); RepositoryRegistry::registerRepository(LogData::CLASS_NAME, BaseRepository::getClassName()); + RepositoryRegistry::registerRepository(OrderSendDraftTaskMap::getClassName(), BaseRepository::getClassName()); } } \ No newline at end of file diff --git a/Packlink/Controllers/Backend/PacklinkDraftDetailsController.php b/Packlink/Controllers/Backend/PacklinkDraftDetailsController.php index de42de1..aa4a948 100644 --- a/Packlink/Controllers/Backend/PacklinkDraftDetailsController.php +++ b/Packlink/Controllers/Backend/PacklinkDraftDetailsController.php @@ -24,7 +24,7 @@ public function indexAction() /** @var \Shopware\Models\Order\Order $order | null */ if (empty($orderId) || - ($orderDetails = $this->getOrderDetails((int)$orderId)) === null || + ($orderDetails = $this->getOrderShipmentDetailsService()->getDetailsByOrderId($orderId)) === null || ($order = $this->getShopwareOrderRepository()->find((int)$orderId)) === null ) { Response::json([], 400); diff --git a/Packlink/Controllers/Backend/PacklinkDraftTaskCreateController.php b/Packlink/Controllers/Backend/PacklinkDraftTaskCreateController.php index 8fcc857..98d4a52 100644 --- a/Packlink/Controllers/Backend/PacklinkDraftTaskCreateController.php +++ b/Packlink/Controllers/Backend/PacklinkDraftTaskCreateController.php @@ -1,7 +1,7 @@ getOrderDetails((int)$payload['orderId'])) === null) { - DraftController::createDraft((int)$payload['orderId']); - } else { - if ($orderDetails->getTaskId() === null || ($task = $this->getTask($orderDetails->getTaskId())) === null) { - $draftTask = new SendDraftTask((int)$payload['orderId']); - $this->getQueueService()->enqueue($this->getConfigService()->getDefaultQueueName(), $draftTask); - if ($draftTask->getExecutionId() && $orderDetails = $this->getOrderDetails($payload['orderId'])) { - $orderDetails->setTaskId($draftTask->getExecutionId()); - $this->getOrderDetailsRepository()->update($orderDetails); - } - } - } + /** @var ShipmentDraftService $shipmentDraftService */ + $shipmentDraftService = ServiceRegister::getService(ShipmentDraftService::CLASS_NAME); + $shipmentDraftService->enqueueCreateShipmentDraftTask((string)$payload['orderId']); Response::json(['success' => true]); } diff --git a/Packlink/Controllers/Backend/PacklinkDraftTaskStatusController.php b/Packlink/Controllers/Backend/PacklinkDraftTaskStatusController.php index 43090ba..bd8f76e 100644 --- a/Packlink/Controllers/Backend/PacklinkDraftTaskStatusController.php +++ b/Packlink/Controllers/Backend/PacklinkDraftTaskStatusController.php @@ -1,22 +1,23 @@ isLoggedIn()) { - Response::json(['status' => 'not_logged_in']); + Response::json(['status' => static::NOT_LOGGED_IN_STATUS]); } $orderId = $this->Request()->get('orderId'); @@ -24,28 +25,20 @@ public function indexAction() Response::json([], 400); } - if (($orderDetails = $this->getOrderDetails((int)$orderId)) === null || - $orderDetails->getTaskId() === null || - ($task = $this->getTask($orderDetails->getTaskId())) === null - ) { - Response::json(['status' => 'not_created']); - } + /** @var ShipmentDraftService $shipmentDraftService */ + $shipmentDraftService = ServiceRegister::getService(ShipmentDraftService::CLASS_NAME); + $draftStatus = $shipmentDraftService->getDraftStatus($orderId); - /** @noinspection PhpUndefinedVariableInspection */ - switch ($task->getStatus()) { - case QueueItem::CREATED: - case QueueItem::QUEUED: - case QueueItem::IN_PROGRESS: - $status = 'in_progress'; - break; + switch ($draftStatus->status) { + case ShipmentDraftStatus::NOT_QUEUED: + Response::json(['status' => ShipmentDraftStatus::NOT_QUEUED]); + case QueueItem::FAILED: + Response::json(['status' => QueueItem::FAILED]); case QueueItem::COMPLETED: - $status = 'completed'; - break; + Response::json(['status' => QueueItem::COMPLETED]); default: - $status = 'failed'; + Response::json(['status' => QueueItem::IN_PROGRESS]); } - - Response::json(['status' => $status]); } /** @@ -59,5 +52,4 @@ protected function isLoggedIn() return !empty($authToken); } - -} \ No newline at end of file +} diff --git a/Packlink/Controllers/Backend/PacklinkOrderDetailsController.php b/Packlink/Controllers/Backend/PacklinkOrderDetailsController.php index 39f9168..725ae1f 100644 --- a/Packlink/Controllers/Backend/PacklinkOrderDetailsController.php +++ b/Packlink/Controllers/Backend/PacklinkOrderDetailsController.php @@ -4,6 +4,8 @@ use Logeecom\Infrastructure\ORM\QueryFilter\Operators; use Logeecom\Infrastructure\ORM\QueryFilter\QueryFilter; +use Logeecom\Infrastructure\ServiceRegister; +use Packlink\BusinessLogic\OrderShipmentDetails\OrderShipmentDetailsService; use Packlink\Controllers\Common\CanInstantiateServices; class PacklinkOrderDetailsController extends \Enlight_Controller_Action @@ -11,23 +13,22 @@ class PacklinkOrderDetailsController extends \Enlight_Controller_Action use CanInstantiateServices; /** - * Retrieves order details. - * - * @param int $orderId - * - * @return \Packlink\BusinessLogic\Order\Models\OrderShipmentDetails | null + * @var OrderShipmentDetailsService + */ + private $orderShipmentDetailsService; + + /** + * Returns an instance of order shipment details service. * - * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException - * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException + * @return OrderShipmentDetailsService */ - protected function getOrderDetails($orderId) + protected function getOrderShipmentDetailsService() { - $filter = new QueryFilter(); - $filter->where('orderId', Operators::EQUALS, $orderId); - /** @var \Packlink\BusinessLogic\Order\Models\OrderShipmentDetails $details */ - $details = $this->getOrderDetailsRepository()->selectOne($filter); + if ($this->orderShipmentDetailsService === null) { + $this->orderShipmentDetailsService = ServiceRegister::getService(OrderShipmentDetailsService::CLASS_NAME); + } - return $details; + return $this->orderShipmentDetailsService; } /** diff --git a/Packlink/Controllers/Backend/PacklinkPrintLabelsController.php b/Packlink/Controllers/Backend/PacklinkPrintLabelsController.php index ece8db9..bbaee78 100644 --- a/Packlink/Controllers/Backend/PacklinkPrintLabelsController.php +++ b/Packlink/Controllers/Backend/PacklinkPrintLabelsController.php @@ -22,7 +22,7 @@ public function printAction() $orderService = $this->getOrderService(); foreach ($orderIds as $id) { - if (($dts = $this->getOrderDetails((int)$id)) !== null + if (($dts = $this->getOrderShipmentDetailsService()->getDetailsByOrderId((int)$id)) !== null && $orderService->isReadyToFetchShipmentLabels($dts->getStatus()) ) { $labels = $dts->getShipmentLabels(); diff --git a/Packlink/Controllers/Backend/PacklinkShippingMethod.php b/Packlink/Controllers/Backend/PacklinkShippingMethod.php index 10c0b9d..fefb447 100644 --- a/Packlink/Controllers/Backend/PacklinkShippingMethod.php +++ b/Packlink/Controllers/Backend/PacklinkShippingMethod.php @@ -48,9 +48,7 @@ public function listAction() $data = $this->controller->getAll(); $result = []; - $country = $this->getUserCountry(); foreach ($data as $item) { - $item->logoUrl = CarrierLogo::getLogo($country, $item->carrierName); $result[] = $this->formatResponse($item); } @@ -103,8 +101,6 @@ public function updateAction() $model->selected = $this->controller->activate($model->id); } - $model->logoUrl = CarrierLogo::getLogo($this->getUserCountry(), $model->carrierName); - Response::json($this->formatResponse($model)); } diff --git a/Packlink/Controllers/Common/CanInstantiateServices.php b/Packlink/Controllers/Common/CanInstantiateServices.php index f689275..3b2e112 100644 --- a/Packlink/Controllers/Common/CanInstantiateServices.php +++ b/Packlink/Controllers/Common/CanInstantiateServices.php @@ -8,7 +8,7 @@ use Logeecom\Infrastructure\TaskExecution\QueueService; use Packlink\BusinessLogic\Http\Proxy; use Packlink\BusinessLogic\Location\LocationService; -use Packlink\BusinessLogic\Order\Models\OrderShipmentDetails; +use Packlink\BusinessLogic\OrderShipmentDetails\Models\OrderShipmentDetails; use Packlink\BusinessLogic\Order\OrderService; use Packlink\BusinessLogic\ShippingMethod\Models\ShippingMethod; use Packlink\BusinessLogic\User\UserAccountService; diff --git a/Packlink/Migrations/Scripts/migration.v.0.9.0.php b/Packlink/Migrations/Scripts/migration.v.0.9.0.php index eaa81f0..f9d0a9b 100644 --- a/Packlink/Migrations/Scripts/migration.v.0.9.0.php +++ b/Packlink/Migrations/Scripts/migration.v.0.9.0.php @@ -6,31 +6,70 @@ use Logeecom\Infrastructure\ORM\RepositoryRegistry; use Logeecom\Infrastructure\ServiceRegister; use Logeecom\Infrastructure\TaskExecution\QueueItem; +use Packlink\BusinessLogic\OrderShipmentDetails\Models\OrderShipmentDetails; use Packlink\BusinessLogic\Scheduler\Models\HourlySchedule; use Packlink\BusinessLogic\Scheduler\Models\Schedule; use Packlink\BusinessLogic\Scheduler\ScheduleCheckTask; +use Packlink\BusinessLogic\ShipmentDraft\Models\OrderSendDraftTaskMap; use Packlink\BusinessLogic\Tasks\TaskCleanupTask; +use Packlink\Models\BaseEntity; +use Packlink\Models\PacklinkEntity; Logger::logInfo('Started executing V0.9.0 update script.'); +Logger::logInfo('Cleaning up completed schedulers.'); + $configuration = ServiceRegister::getService(Configuration::CLASS_NAME); try { $repository = RepositoryRegistry::getRepository(Schedule::getClassName()); + + $schedule = new HourlySchedule( + new TaskCleanupTask(ScheduleCheckTask::getClassName(), array(QueueItem::COMPLETED), 3600), + $configuration->getDefaultQueueName() + ); + + $schedule->setMinute(10); + $schedule->setNextSchedule(); + $repository->save($schedule); + + Logger::logInfo('Scheduler cleanup successful.'); + Logger::logInfo('Migrating old order shipment detail entities.'); + + $entityManager = Shopware()->Container()->get('models'); + $query = $entityManager->createQueryBuilder(); + $alias = 'p'; + $query->select($alias) + ->from(PacklinkEntity::class, $alias) + ->where("$alias.type = 'OrderShipmentDetails'"); + $entities = $query->getQuery()->getResult(); + + if (!empty($entities)) { + $orderShipmentDetailsRepository = RepositoryRegistry::getRepository(OrderShipmentDetails::getClassName()); + $orderSendDraftRepository = RepositoryRegistry::getRepository(OrderSendDraftTaskMap::getClassName()); + + /** @var BaseEntity $entity */ + foreach ($entities as $entity) { + $orderShipmentData = json_decode($entity->getData(), true); + + $orderSendDraftTaskMap = new OrderSendDraftTaskMap(); + $orderSendDraftTaskMap->setOrderId((string)$orderShipmentData['orderId']); + $orderSendDraftTaskMap->setExecutionId($orderShipmentData['taskId']); + $orderSendDraftRepository->save($orderSendDraftTaskMap); + + unset($orderShipmentData['taskId']); + $orderShipmentDetails = OrderShipmentDetails::fromArray($orderShipmentData); + $orderShipmentDetails->setOrderId((string)$orderShipmentData['orderId']); + $orderShipmentDetailsRepository->update($orderShipmentDetails); + } + } + + Logger::logInfo('Migration successful'); } catch (RepositoryNotRegisteredException $e) { Logger::logError("V0.9.0 update script failed because: {$e->getMessage()}"); return false; } -$schedule = new HourlySchedule( - new TaskCleanupTask(ScheduleCheckTask::getClassName(), array(QueueItem::COMPLETED), 3600), - $configuration->getDefaultQueueName() -); - -$schedule->setMinute(10); -$schedule->setNextSchedule(); -$repository->save($schedule); - Logger::logInfo('Update script V0.9.0 has been successfully completed.'); return true; diff --git a/Packlink/Repositories/OrderRepository.php b/Packlink/Repositories/OrderRepository.php deleted file mode 100644 index 9d3b329..0000000 --- a/Packlink/Repositories/OrderRepository.php +++ /dev/null @@ -1,641 +0,0 @@ -where('status', Operators::NOT_EQUALS, ShipmentStatus::STATUS_DELIVERED); - $orders = $this->getOrderDetailsRepository()->select($filter); - - $result = []; - - /** @var OrderShipmentDetails $order */ - foreach ($orders as $order) { - if ($order->getReference() !== null) { - $result[] = $order->getReference(); - } - } - - return $result; - } - - /** - * Retrieves list of order references where order is in one of the provided statuses. - * - * @param array $statuses List of order statuses. - * - * @return string[] Array of shipment references. - * - * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException - * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException - */ - public function getOrderReferencesWithStatus(array $statuses) - { - $filter = new QueryFilter(); - - foreach ($statuses as $status) { - $filter->orWhere('status', Operators::EQUALS, $status); - } - - $orders = $this->getOrderDetailsRepository()->select($filter); - - $result = []; - /** @var OrderShipmentDetails $order */ - foreach ($orders as $order) { - $result[] =$order->getReference(); - } - - return $result; - } - - /** - * Fetches and returns system order by its unique identifier. - * - * @param string $orderId $orderId Unique order id. - * - * @return Order Order object. - * - * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException - * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException - * @throws \Packlink\BusinessLogic\Order\Exceptions\OrderNotFound When order with provided id is not found. - */ - public function getOrderAndShippingData($orderId) - { - /** @var \Shopware\Models\Order\Order $sourceOrder */ - $sourceOrder = $this->getShopwareOrderRepository()->find($orderId); - - if ($sourceOrder === null) { - throw new OrderNotFound("Order with id [$orderId] not found."); - } - - $order = new Order(); - - $order->setId($sourceOrder->getId()); - $order->setOrderNumber($sourceOrder->getNumber()); - $order->setCustomerId($sourceOrder->getCustomer()->getId()); - $order->setCurrency($sourceOrder->getCurrency()); - $order->setTotalPrice($sourceOrder->getInvoiceAmount()); - $order->setBasePrice($sourceOrder->getInvoiceAmountNet()); - - $this->setDropoffId($order, $orderId); - $dispatch = $sourceOrder->getDispatch(); - if ($dispatch) { - $this->setShippingMethodId($order, $dispatch->getId()); - } - $order->setShippingAddress($this->getOrderAddress($sourceOrder)); - - $order->setItems($this->getOrderItems($sourceOrder)); - - return $order; - } - - /** - * Sets order packlink reference number. - * - * @param string $orderId Unique order id. - * @param string $shipmentReference Packlink shipment reference. - * - * @throws \Doctrine\ORM\ORMException - * @throws \Doctrine\ORM\OptimisticLockException - * @throws \Doctrine\ORM\TransactionRequiredException - * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException - * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException - * @throws \Packlink\BusinessLogic\Order\Exceptions\OrderNotFound - */ - public function setReference($orderId, $shipmentReference) - { - $sourceOrder = $this->getShopwareOrderRepository()->find($orderId); - - if ($sourceOrder === null) { - throw new OrderNotFound("Source order with id [$orderId] not found."); - } - - $orderDetails = $this->getOrderDetailsById($orderId); - - if ($orderDetails === null) { - $orderDetails = new OrderShipmentDetails(); - $orderDetails->setOrderId($orderId); - $orderDetails->setReference($shipmentReference); - $this->getOrderDetailsRepository()->save($orderDetails); - } else { - $orderDetails->setReference($shipmentReference); - $this->getOrderDetailsRepository()->update($orderDetails); - } - - $this->setShippingStatusByReference($shipmentReference, ShipmentStatus::STATUS_PENDING); - } - - /** - * Sets order packlink shipment tracking history to an order for given shipment. - * - * @param Shipment $shipment Packlink shipment details. - * @param Tracking[] $trackingHistory Shipment tracking history. - * - * @throws \Doctrine\ORM\OptimisticLockException - * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException - * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException - * @throws \Packlink\BusinessLogic\Order\Exceptions\OrderNotFound When order with provided reference is not found. - * @throws \Doctrine\ORM\ORMException - */ - public function updateTrackingInfo(Shipment $shipment, array $trackingHistory) - { - $orderDetails = $this->getOrderDetailsByReference($shipment->reference); - - if ($orderDetails === null) { - throw new OrderNotFound("Order details for reference [$shipment->reference] not found."); - } - - /** @var \Shopware\Models\Order\Order $sourceOrder */ - $sourceOrder = $this->getShopwareOrderRepository()->find($orderDetails->getOrderId()); - if ($sourceOrder === null) { - throw new OrderNotFound("Source order with id [{$orderDetails->getOrderId()}] not found."); - } - - $orderDetails->setShippingCost($shipment->price); - $orderDetails->setCarrierTrackingUrl($shipment->carrierTrackingUrl); - $orderDetails->setCarrierTrackingNumbers($shipment->trackingCodes); - - if (!empty($trackingHistory)) { - $history = $this->sortTrackingRecords($trackingHistory); - $latestTrackingRecord = $history[0]; - $orderDetails->setShippingStatus($latestTrackingRecord->description, $latestTrackingRecord->timestamp); - } - - if (isset($shipment->trackingCodes[0])) { - $sourceOrder->setTrackingCode($shipment->trackingCodes[0]); - Shopware()->Models()->flush($sourceOrder); - } - - $this->getOrderDetailsRepository()->update($orderDetails); - } - - /** - * Sets order packlink shipping status to an order by shipment reference. - * - * @param string $shipmentReference Packlink shipment reference. - * @param string $shippingStatus Packlink shipping status. - * - * @throws \Doctrine\ORM\ORMException - * @throws \Doctrine\ORM\OptimisticLockException - * @throws \Doctrine\ORM\TransactionRequiredException - * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException - * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException - * @throws \Packlink\BusinessLogic\Order\Exceptions\OrderNotFound When order with provided reference is not found. - */ - public function setShippingStatusByReference($shipmentReference, $shippingStatus) - { - $orderDetails = $this->getOrderDetailsByReference($shipmentReference); - - if ($orderDetails === null) { - throw new OrderNotFound("Order details for reference [$shipmentReference] not found."); - } - - /** @var \Shopware\Models\Order\Order $sourceOrder */ - $sourceOrder = $this->getShopwareOrderRepository()->find($orderDetails->getOrderId()); - if ($sourceOrder === null) { - throw new OrderNotFound("Source order with id [{$orderDetails->getOrderId()}] not found."); - } - - $orderDetails->setStatus($shippingStatus); - $this->getOrderDetailsRepository()->update($orderDetails); - - $statusMap = $this->getConfigService()->getOrderStatusMappings(); - - if (isset($statusMap[$shippingStatus]) && $statusMap[$shippingStatus] !== '') { - $status = Shopware()->Models()->find('Shopware\Models\Order\Status', $statusMap[$shippingStatus]); - - if ($status) { - $sourceOrder->setOrderStatus($status); - Shopware()->Models()->flush($sourceOrder); - } - } - } - - /** - * Sets shipping price to an order by shipment reference. - * - * @param string $shipmentReference Packlink shipment reference. - * @param float $price Shipment price. - * - * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException - * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException - * @throws \Packlink\BusinessLogic\Order\Exceptions\OrderNotFound When order with provided reference is not found. - */ - public function setShippingPriceByReference($shipmentReference, $price) - { - $details = $this->getOrderDetailsByReference($shipmentReference); - - if ($details === null) { - throw new OrderNotFound("Order details for reference [$shipmentReference] not found."); - } - - $details->setShippingCost($price); - - $this->getOrderDetailsRepository()->update($details); - } - - /** - * Marks shipment identified by provided reference as deleted on Packlink. - * - * @param string $shipmentReference Packlink shipment reference. - * - * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException - * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException - * @throws \Packlink\BusinessLogic\Order\Exceptions\OrderNotFound When order with provided reference is not found. - */ - public function markShipmentDeleted($shipmentReference) - { - $details = $this->getOrderDetailsByReference($shipmentReference); - - if ($details === null) { - throw new OrderNotFound("Order details for reference [$shipmentReference] not found."); - } - - $details->setDeleted(true); - - $this->getOrderDetailsRepository()->update($details); - } - - /** - * Returns whether shipment identified by provided reference is deleted on Packlink or not. - * - * @param string $shipmentReference Packlink shipment reference. - * - * @return bool Returns TRUE if shipment has been deleted; otherwise returns FALSE. - * - * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException - * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException - * @throws \Packlink\BusinessLogic\Order\Exceptions\OrderNotFound When order with provided reference is not found. - */ - public function isShipmentDeleted($shipmentReference) - { - $details = $this->getOrderDetailsByReference($shipmentReference); - - if ($details === null) { - throw new OrderNotFound("Order details for reference [$shipmentReference] not found."); - } - - return $details->isDeleted(); - } - - /** - * Maps Shopware address to Packlink address. - * - * @param \Shopware\Models\Order\Order $sourceOrder - * - * @return \Packlink\BusinessLogic\Order\Objects\Address - */ - protected function getOrderAddress(\Shopware\Models\Order\Order $sourceOrder) - { - $address = new Address(); - - $shippingAddress = $sourceOrder->getShipping(); - $billingAddress = $sourceOrder->getBilling(); - $address->setName($shippingAddress->getFirstName()); - $address->setSurname($shippingAddress->getLastName()); - $address->setEmail($sourceOrder->getCustomer()->getEmail()); - $address->setCompany($shippingAddress->getCompany()); - $street1 = $shippingAddress->getStreet() . $shippingAddress->getAdditionalAddressLine1(); - $address->setStreet1($street1); - $address->setStreet2($shippingAddress->getAdditionalAddressLine2()); - $address->setZipCode($shippingAddress->getZipCode()); - $address->setCity($shippingAddress->getCity()); - - if (method_exists($shippingAddress, 'getPhone')) { - $address->setPhone($shippingAddress->getPhone()); - } else if (method_exists($billingAddress, 'getPhone')) { - $address->setPhone($billingAddress->getPhone()); - } - - if (!$address->getPhone() && ($phone = $this->getConfigService()->getDefaultWarehouse()->phone)) { - $address->setPhone($phone); - } - - $address->setCountry($shippingAddress->getCountry()->getIso()); - - return $address; - } - - /** - * Retrieves order items from source order. - * - * @param \Shopware\Models\Order\Order $sourceOrder - * - * @return Item[] - */ - protected function getOrderItems(\Shopware\Models\Order\Order $sourceOrder) - { - $result = []; - - $defaultParcel = $this->getConfigService()->getDefaultParcel(); - if ($defaultParcel === null) { - $defaultParcel = ParcelInfo::defaultParcel(); - } - - /** @var \Shopware\Models\Order\Detail $detail */ - foreach ($sourceOrder->getDetails() as $detail) { - if (!$detail->getArticleId()) { - /** Item should not be shipped. */ - continue; - } - - $orderItem = new Item(); - - $totalPrice = $detail->getPrice() / (1 - $detail->getTaxRate() / 100); - $orderItem->setTotalPrice($totalPrice); - $orderItem->setPrice($detail->getPrice()); - $orderItem->setQuantity($detail->getQuantity()); - $orderItem->setPictureUrl($this->getImageSource($detail->getArticleId())); - - /** @var Article $article */ - $article = $this->getShopwareArticleRepository()->find($detail->getArticleId()); - - $orderItem->setCategoryName($this->getCategoryName($article)); - - $productDetails = $article->getMainDetail(); - $weight = $productDetails->getWeight(); - /** @noinspection TypeUnsafeComparisonInspection */ - $orderItem->setWeight(round($weight != 0 ? $weight : $defaultParcel->weight, 2)); - $orderItem->setHeight(round($productDetails->getHeight() ?: $defaultParcel->height, 2)); - $orderItem->setLength(round($productDetails->getLen() ?: $defaultParcel->length, 2)); - $orderItem->setWidth(round($productDetails->getWidth() ?: $defaultParcel->width, 2)); - - $result[] = $orderItem; - } - - return $result; - } - - /** - * Retrieves order details by reference. - * - * @param $reference - * - * @return OrderShipmentDetails | null - * - * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException - * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException - */ - protected function getOrderDetailsByReference($reference) - { - $filter = new QueryFilter(); - $filter->where('reference', Operators::EQUALS, $reference); - - /** @var OrderShipmentDetails $entity */ - $entity = $this->getOrderDetailsRepository()->selectOne($filter); - - return $entity; - } - - /** - * Retrieves order details by order id. - * - * @param $orderId - * - * @return \Packlink\BusinessLogic\Order\Models\OrderShipmentDetails - * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException - * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException - */ - protected function getOrderDetailsById($orderId) - { - $filter = new QueryFilter(); - $filter->where('orderId', Operators::EQUALS, $orderId); - - /** @var OrderShipmentDetails $entity */ - $entity = $this->getOrderDetailsRepository()->selectOne($filter); - - return $entity; - } - - /** - * Retrieves order details repository. - * - * @return \Logeecom\Infrastructure\ORM\Interfaces\RepositoryInterface - * - * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException - */ - protected function getOrderDetailsRepository() - { - if ($this->orderDetailsRepository === null) { - $this->orderDetailsRepository = RepositoryRegistry::getRepository(OrderShipmentDetails::getClassName()); - } - - return $this->orderDetailsRepository; - } - - /** - * Retrieves category name. - * - * @param \Shopware\Models\Article\Article | null $article - * - * @return string - */ - private function getCategoryName(Article $article = null) - { - if (!$article) { - return ''; - } - - /** @var \Shopware\Models\Category\Category $category */ - $category = $article->getCategories()->first(); - - return $category !== null ? $category->getPath() : ''; - } - - /** - * Retrieves Shopware order repository. - * - * @return \Shopware\Models\Order\Repository - */ - protected function getShopwareOrderRepository() - { - return Shopware()->Models()->getRepository(\Shopware\Models\Order\Order::class); - } - - /** - * Retrieves article repository. - * - * @return \Shopware\Models\Article\Repository - */ - protected function getShopwareArticleRepository() - { - return Shopware()->Models()->getRepository(Article::class); - } - - /** - * Retrieves img source. - * - * @param $articleId - * - * @return string - */ - protected function getImageSource($articleId) - { - $product = Shopware()->Modules()->Articles()->sGetArticleById($articleId); - - if (empty($product)) { - return ''; - } - - $imgData = Shopware()->Modules()->Articles()->sGetConfiguratorImage($product); - - return !empty($imgData['image']['source']) ? $imgData['image']['source'] : ''; - } - - /** - * Retrieves config service. - * - * @return \Packlink\BusinessLogic\Configuration - */ - protected function getConfigService() - { - if ($this->configService === null) { - $this->configService = ServiceRegister::getService(Configuration::CLASS_NAME); - } - - return $this->configService; - } - - /** - * Sort tracking history records by timestamps in descending order. - * - * @param Tracking[] $trackingRecords Array of tracking history records. - * - * @return array Sorted array of tracking history records. - */ - protected function sortTrackingRecords(array $trackingRecords) - { - usort( - $trackingRecords, - function ($first, $second) { - if ($first->timestamp === $second->timestamp) { - return 0; - } - - return ($first->timestamp < $second->timestamp) ? 1 : -1; - } - ); - - return $trackingRecords; - } - - /** - * Sets dropoff id if dropoff has been used for order. - * - * @param \Packlink\BusinessLogic\Order\Objects\Order $order - * @param int $orderId - * - * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException - * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException - */ - protected function setDropoffId(Order $order, $orderId) - { - $filter = new QueryFilter(); - $filter->where('orderId', Operators::EQUALS, $orderId); - /** @var OrderDropoffMap $map | null */ - $map = $this->getOrderDropoffRepository()->selectOne($filter); - if ($map !== null) { - $order->setShippingDropOffId((string)$map->dropoff['id']); - } - } - - /** - * Retrieves order dropoff map repository. - * - * @return \Logeecom\Infrastructure\ORM\Interfaces\RepositoryInterface - * - * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException - */ - protected function getOrderDropoffRepository() - { - if ($this->orderDropoffRepository === null) { - $this->orderDropoffRepository = RepositoryRegistry::getRepository(OrderDropoffMap::getClassName()); - } - - return $this->orderDropoffRepository; - } - - /** - * Sets shipping method id if shipping method is packlink carrier. - * - * @param \Packlink\BusinessLogic\Order\Objects\Order $order - * @param int $carrierId - * - * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException - * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException - */ - protected function setShippingMethodId(Order $order, $carrierId) - { - $filter = new QueryFilter(); - $filter->where('shopwareCarrierId', Operators::EQUALS, $carrierId); - - /** @var ShippingMethodMap $map | null */ - $map = $this->getShippingMethodMapRepository()->selectOne($filter); - - if ($map) { - $order->setShippingMethodId($map->shippingMethodId); - } - } - - /** - * Retrieves shipping method map repository. - * - * @return \Logeecom\Infrastructure\ORM\Interfaces\RepositoryInterface - * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException - */ - protected function getShippingMethodMapRepository() - { - if ($this->shippingMethodMapRepository === null) { - $this->shippingMethodMapRepository = RepositoryRegistry::getRepository(ShippingMethodMap::getClassName()); - } - - return $this->shippingMethodMapRepository; - } -} \ No newline at end of file diff --git a/Packlink/Resources/views/backend/_resources/js/location/LocationPicker.js b/Packlink/Resources/views/backend/_resources/js/location/LocationPicker.js index 3213f3b..0ed8b46 100644 --- a/Packlink/Resources/views/backend/_resources/js/location/LocationPicker.js +++ b/Packlink/Resources/views/backend/_resources/js/location/LocationPicker.js @@ -257,7 +257,7 @@ var Packlink = window.Packlink || {}; */ function workingHoursButtonClickHandler(event) { let id = event.target.getAttribute('data-id'); - let workingHoursNode = null; + let workingHoursNode; if (event.target.hasAttribute('data-lp-composite')) { workingHoursNode = getElement(dropOffs[id], 'composite-working-hours'); diff --git a/Packlink/Resources/views/backend/packlink_controllers/packlink_order_details_controller.js b/Packlink/Resources/views/backend/packlink_controllers/packlink_order_details_controller.js index 05dc0a6..89f409b 100644 --- a/Packlink/Resources/views/backend/packlink_controllers/packlink_order_details_controller.js +++ b/Packlink/Resources/views/backend/packlink_controllers/packlink_order_details_controller.js @@ -59,8 +59,8 @@ Ext.define('Shopware.apps.Packlink.controller.OrderDetailsController', { case 'not_logged_in': start(notLoggedInStateHandler(), 'not_logged_in'); break; - case 'not_created': - start(notCreatedStateHandler(), 'not_created'); + case 'not_queued': + start(notQueuedStateHandler(), 'not_queued'); break; case 'in_progress': start(inProgressStateHandler(), 'in_progress'); @@ -69,7 +69,7 @@ Ext.define('Shopware.apps.Packlink.controller.OrderDetailsController', { start(completedStateHandler(), 'completed'); break; default: - start(notCreatedStateHandler(), 'not_created'); + start(notQueuedStateHandler(), 'not_queued'); break; } } @@ -109,11 +109,11 @@ Ext.define('Shopware.apps.Packlink.controller.OrderDetailsController', { } /** - * Handles not created state. + * Handles not queued state. * * @return { object } */ - function notCreatedStateHandler() { + function notQueuedStateHandler() { let task = null; this.handle = function () { render(); diff --git a/Packlink/Services/BusinessLogic/ShopOrderService.php b/Packlink/Services/BusinessLogic/ShopOrderService.php new file mode 100644 index 0000000..152a4a4 --- /dev/null +++ b/Packlink/Services/BusinessLogic/ShopOrderService.php @@ -0,0 +1,353 @@ +getShopwareOrderRepository()->find($orderId); + + if ($sourceOrder === null) { + throw new OrderNotFound("Order with id [$orderId] not found."); + } + + $order = new Order(); + + $order->setId($sourceOrder->getId()); + $order->setOrderNumber($sourceOrder->getNumber()); + $order->setCustomerId($sourceOrder->getCustomer()->getId()); + $order->setCurrency($sourceOrder->getCurrency()); + $order->setTotalPrice($sourceOrder->getInvoiceAmount()); + $order->setBasePrice($sourceOrder->getInvoiceAmountNet()); + + $this->setDropoffId($order, $orderId); + $dispatch = $sourceOrder->getDispatch(); + if ($dispatch) { + $this->setShippingMethodId($order, $dispatch->getId()); + } + $order->setShippingAddress($this->getOrderAddress($sourceOrder)); + + $order->setItems($this->getOrderItems($sourceOrder)); + + return $order; + } + + /** + * @inheritDoc + */ + public function handleUpdatedTrackingInfo($orderId, array $trackings) + { + /** @var \Shopware\Models\Order\Order $sourceOrder */ + $sourceOrder = $this->getShopwareOrderRepository()->find($orderId); + if ($sourceOrder === null) { + throw new OrderNotFound("Source order with id [{$orderId}] not found."); + } + + if (isset($trackings[0])) { + $sourceOrder->setTrackingCode($trackings[0]); + Shopware()->Models()->flush($sourceOrder); + } + } + + /** + * @inheritDoc + */ + public function updateShipmentStatus($orderId, $shippingStatus) + { + /** @var \Shopware\Models\Order\Order $sourceOrder */ + $sourceOrder = $this->getShopwareOrderRepository()->find($orderId); + if ($sourceOrder === null) { + throw new OrderNotFound("Source order with id [{$orderId}] not found."); + } + + $statusMap = $this->getConfigService()->getOrderStatusMappings(); + + if (isset($statusMap[$shippingStatus]) && $statusMap[$shippingStatus] !== '') { + $status = Shopware()->Models()->find('Shopware\Models\Order\Status', $statusMap[$shippingStatus]); + + if ($status) { + $sourceOrder->setOrderStatus($status); + Shopware()->Models()->flush($sourceOrder); + } + } + } + + /** + * Maps Shopware address to Packlink address. + * + * @param \Shopware\Models\Order\Order $sourceOrder + * + * @return \Packlink\BusinessLogic\Order\Objects\Address + */ + protected function getOrderAddress(\Shopware\Models\Order\Order $sourceOrder) + { + $address = new Address(); + + $shippingAddress = $sourceOrder->getShipping(); + $billingAddress = $sourceOrder->getBilling(); + $address->setName($shippingAddress->getFirstName()); + $address->setSurname($shippingAddress->getLastName()); + $address->setEmail($sourceOrder->getCustomer()->getEmail()); + $address->setCompany($shippingAddress->getCompany()); + $street1 = $shippingAddress->getStreet() . $shippingAddress->getAdditionalAddressLine1(); + $address->setStreet1($street1); + $address->setStreet2($shippingAddress->getAdditionalAddressLine2()); + $address->setZipCode($shippingAddress->getZipCode()); + $address->setCity($shippingAddress->getCity()); + + if (method_exists($shippingAddress, 'getPhone')) { + $address->setPhone($shippingAddress->getPhone()); + } else if (method_exists($billingAddress, 'getPhone')) { + $address->setPhone($billingAddress->getPhone()); + } + + if (!$address->getPhone() && ($phone = $this->getConfigService()->getDefaultWarehouse()->phone)) { + $address->setPhone($phone); + } + + $address->setCountry($shippingAddress->getCountry()->getIso()); + + return $address; + } + + /** + * Retrieves order items from source order. + * + * @param \Shopware\Models\Order\Order $sourceOrder + * + * @return Item[] + */ + protected function getOrderItems(\Shopware\Models\Order\Order $sourceOrder) + { + $result = []; + + $defaultParcel = $this->getConfigService()->getDefaultParcel(); + if ($defaultParcel === null) { + $defaultParcel = ParcelInfo::defaultParcel(); + } + + /** @var \Shopware\Models\Order\Detail $detail */ + foreach ($sourceOrder->getDetails() as $detail) { + if (!$detail->getArticleId()) { + /** Item should not be shipped. */ + continue; + } + + $orderItem = new Item(); + + $totalPrice = $detail->getPrice() / (1 - $detail->getTaxRate() / 100); + $orderItem->setTotalPrice($totalPrice); + $orderItem->setPrice($detail->getPrice()); + $orderItem->setQuantity($detail->getQuantity()); + $orderItem->setPictureUrl($this->getImageSource($detail->getArticleId())); + + /** @var Article $article */ + $article = $this->getShopwareArticleRepository()->find($detail->getArticleId()); + + $orderItem->setCategoryName($this->getCategoryName($article)); + + $productDetails = $article->getMainDetail(); + $weight = $productDetails->getWeight(); + /** @noinspection TypeUnsafeComparisonInspection */ + $orderItem->setWeight(round($weight != 0 ? $weight : $defaultParcel->weight, 2)); + $orderItem->setHeight(round($productDetails->getHeight() ?: $defaultParcel->height, 2)); + $orderItem->setLength(round($productDetails->getLen() ?: $defaultParcel->length, 2)); + $orderItem->setWidth(round($productDetails->getWidth() ?: $defaultParcel->width, 2)); + + $result[] = $orderItem; + } + + return $result; + } + + /** + * Retrieves img source. + * + * @param $articleId + * + * @return string + */ + protected function getImageSource($articleId) + { + $product = Shopware()->Modules()->Articles()->sGetArticleById($articleId); + + if (empty($product)) { + return ''; + } + + $imgData = Shopware()->Modules()->Articles()->sGetConfiguratorImage($product); + + return !empty($imgData['image']['source']) ? $imgData['image']['source'] : ''; + } + + /** + * Retrieves category name. + * + * @param \Shopware\Models\Article\Article | null $article + * + * @return string + */ + private function getCategoryName(Article $article = null) + { + if (!$article) { + return ''; + } + + /** @var \Shopware\Models\Category\Category $category */ + $category = $article->getCategories()->first(); + + return $category !== null ? $category->getPath() : ''; + } + + /** + * Sets dropoff id if dropoff has been used for order. + * + * @param \Packlink\BusinessLogic\Order\Objects\Order $order + * @param int $orderId + * + * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException + * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException + */ + protected function setDropoffId(Order $order, $orderId) + { + $filter = new QueryFilter(); + $filter->where('orderId', Operators::EQUALS, $orderId); + /** @var OrderDropoffMap $map | null */ + $map = $this->getOrderDropoffRepository()->selectOne($filter); + if ($map !== null) { + $order->setShippingDropOffId((string)$map->dropoff['id']); + } + } + + /** + * Sets shipping method id if shipping method is packlink carrier. + * + * @param \Packlink\BusinessLogic\Order\Objects\Order $order + * @param int $carrierId + * + * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException + * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException + */ + protected function setShippingMethodId(Order $order, $carrierId) + { + $filter = new QueryFilter(); + $filter->where('shopwareCarrierId', Operators::EQUALS, $carrierId); + + /** @var ShippingMethodMap $map | null */ + $map = $this->getShippingMethodMapRepository()->selectOne($filter); + + if ($map) { + $order->setShippingMethodId($map->shippingMethodId); + } + } + + /** + * Retrieves shipping method map repository. + * + * @return \Logeecom\Infrastructure\ORM\Interfaces\RepositoryInterface + * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException + */ + private function getShippingMethodMapRepository() + { + if ($this->shippingMethodMapRepository === null) { + $this->shippingMethodMapRepository = RepositoryRegistry::getRepository(ShippingMethodMap::getClassName()); + } + + return $this->shippingMethodMapRepository; + } + + /** + * Retrieves order dropoff map repository. + * + * @return \Logeecom\Infrastructure\ORM\Interfaces\RepositoryInterface + * + * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException + */ + private function getOrderDropoffRepository() + { + if ($this->orderDropoffRepository === null) { + $this->orderDropoffRepository = RepositoryRegistry::getRepository(OrderDropoffMap::getClassName()); + } + + return $this->orderDropoffRepository; + } + + /** + * Retrieves Shopware order repository. + * + * @return \Shopware\Models\Order\Repository + */ + private function getShopwareOrderRepository() + { + return Shopware()->Models()->getRepository(\Shopware\Models\Order\Order::class); + } + + /** + * Retrieves article repository. + * + * @return \Shopware\Models\Article\Repository + */ + private function getShopwareArticleRepository() + { + return Shopware()->Models()->getRepository(Article::class); + } + + /** + * Retrieves config service. + * + * @return \Packlink\BusinessLogic\Configuration + */ + private function getConfigService() + { + if ($this->configService === null) { + $this->configService = ServiceRegister::getService(Configuration::CLASS_NAME); + } + + return $this->configService; + } +} diff --git a/Packlink/Services/BusinessLogic/ShopShippingMethodService.php b/Packlink/Services/BusinessLogic/ShopShippingMethodService.php index 72d1154..de93f8c 100644 --- a/Packlink/Services/BusinessLogic/ShopShippingMethodService.php +++ b/Packlink/Services/BusinessLogic/ShopShippingMethodService.php @@ -11,6 +11,7 @@ use Packlink\BusinessLogic\ShippingMethod\Interfaces\ShopShippingMethodService as BaseService; use Packlink\BusinessLogic\ShippingMethod\Models\ShippingMethod; use Packlink\Entities\ShippingMethodMap; +use Packlink\Utilities\CarrierLogo; use Packlink\Utilities\Translation; use Shopware\Components\Model\ModelEntity; use Shopware\Models\Dispatch\Dispatch; @@ -117,6 +118,20 @@ public function addBackupShippingMethod(ShippingMethod $shippingMethod) return true; } + /** + * @inheritDoc + * @throws \Exception + */ + public function getCarrierLogoFilePath($carrierName) + { + /** @var \Packlink\Services\BusinessLogic\ConfigurationService $configService */ + $configService = ServiceRegister::getService(Configuration::CLASS_NAME); + $userInfo = $configService->getUserInfo(); + $country = $userInfo ? $userInfo->country : ''; + + return CarrierLogo::getLogo(strtolower($country), $carrierName); + } + /** * Deletes backup shipping method. * @@ -420,4 +435,4 @@ protected function getConfigService() return $this->configService; } -} \ No newline at end of file +} diff --git a/Packlink/Subscribers/OrderListHandler.php b/Packlink/Subscribers/OrderListHandler.php index 74485a3..fb98092 100644 --- a/Packlink/Subscribers/OrderListHandler.php +++ b/Packlink/Subscribers/OrderListHandler.php @@ -5,12 +5,9 @@ use Enlight\Event\SubscriberInterface; use Enlight_Hook_HookArgs; use Logeecom\Infrastructure\Configuration\Configuration; -use Logeecom\Infrastructure\ORM\QueryFilter\Operators; -use Logeecom\Infrastructure\ORM\QueryFilter\QueryFilter; -use Logeecom\Infrastructure\ORM\RepositoryRegistry; use Logeecom\Infrastructure\ServiceRegister; -use Packlink\BusinessLogic\Order\Models\OrderShipmentDetails; use Packlink\BusinessLogic\Order\OrderService; +use Packlink\BusinessLogic\OrderShipmentDetails\OrderShipmentDetailsService; use Packlink\Utilities\Reference; class OrderListHandler implements SubscriberInterface @@ -19,10 +16,6 @@ class OrderListHandler implements SubscriberInterface * @var \Packlink\Services\BusinessLogic\ConfigurationService */ protected $configService; - /** - * @var \Logeecom\Infrastructure\ORM\Interfaces\RepositoryInterface - */ - protected $orderDetailsRepository; /** * @var \Packlink\BusinessLogic\Order\OrderService */ @@ -55,8 +48,13 @@ public function extendOrderList(Enlight_Hook_HookArgs $args) $userCountry = $this->getUserCountry(); $return = $args->getReturn(); + /** @var \Packlink\BusinessLogic\OrderShipmentDetails\OrderShipmentDetailsService $orderShipmentDetailsService */ + $orderShipmentDetailsService = ServiceRegister::getService(OrderShipmentDetailsService::CLASS_NAME); + foreach ($return['data'] as $index => $order) { - if (($orderDetails = $this->getOrderDetails($order['id'])) !== null && $orderDetails->getReference()) { + if (($orderDetails = $orderShipmentDetailsService->getDetailsByOrderId((string)$order['id'])) !== null + && $orderDetails->getReference() + ) { $return['data'][$index]['plReferenceUrl'] = Reference::getUrl( $userCountry, $orderDetails->getReference() @@ -117,42 +115,6 @@ protected function getConfigService() return $this->configService; } - /** - * Retrieves order details. - * - * @param $orderId - * - * @return \Packlink\BusinessLogic\Order\Models\OrderShipmentDetails - * - * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException - * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException - */ - protected function getOrderDetails($orderId) - { - $query = new QueryFilter(); - $query->where('orderId', Operators::EQUALS, $orderId); - /** @var \Packlink\BusinessLogic\Order\Models\OrderShipmentDetails $details | null */ - $details = $this->getOrderDetailsRepository()->selectOne($query); - - return $details; - } - - /** - * Retrieves order details repository. - * - * @return \Logeecom\Infrastructure\ORM\Interfaces\RepositoryInterface - * - * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException - */ - protected function getOrderDetailsRepository() - { - if ($this->orderDetailsRepository === null) { - $this->orderDetailsRepository = RepositoryRegistry::getRepository(OrderShipmentDetails::getClassName()); - } - - return $this->orderDetailsRepository; - } - /** * Retrieves order service. * diff --git a/Packlink/Subscribers/OrderModelEventHandler.php b/Packlink/Subscribers/OrderModelEventHandler.php index ec23f7c..b0fa41f 100644 --- a/Packlink/Subscribers/OrderModelEventHandler.php +++ b/Packlink/Subscribers/OrderModelEventHandler.php @@ -5,13 +5,10 @@ use Doctrine\Common\EventSubscriber; use Doctrine\ORM\Event\LifecycleEventArgs; use Doctrine\ORM\Events; -use Logeecom\Infrastructure\ORM\QueryFilter\Operators; -use Logeecom\Infrastructure\ORM\QueryFilter\QueryFilter; -use Logeecom\Infrastructure\ORM\RepositoryRegistry; use Logeecom\Infrastructure\ServiceRegister; use Packlink\BusinessLogic\Configuration; -use Packlink\BusinessLogic\Controllers\DraftController; -use Packlink\BusinessLogic\Order\Models\OrderShipmentDetails; +use Packlink\BusinessLogic\OrderShipmentDetails\Models\OrderShipmentDetails; +use Packlink\BusinessLogic\ShipmentDraft\ShipmentDraftService; use Shopware\Models\Order\Order; use Shopware\Models\Order\Status; @@ -21,6 +18,10 @@ class OrderModelEventHandler implements EventSubscriber * @var \Packlink\Services\BusinessLogic\ConfigurationService */ protected $configService; + /** + * @var \Packlink\BusinessLogic\ShipmentDraft\ShipmentDraftService + */ + protected $shipmentDraftService; /** * @var \Logeecom\Infrastructure\ORM\Interfaces\RepositoryInterface */ @@ -47,6 +48,8 @@ public function getSubscribedEvents() * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException * @throws \Logeecom\Infrastructure\TaskExecution\Exceptions\QueueStorageUnavailableException + * @throws \Packlink\BusinessLogic\ShipmentDraft\Exceptions\DraftTaskMapExists + * @throws \Packlink\BusinessLogic\ShipmentDraft\Exceptions\DraftTaskMapNotFound */ public function postPersist(LifecycleEventArgs $args) { @@ -55,7 +58,7 @@ public function postPersist(LifecycleEventArgs $args) return; } - DraftController::createDraft($model->getId()); + $this->shipmentDraftService->enqueueCreateShipmentDraftTask($model->getId()); } /** @@ -66,6 +69,8 @@ public function postPersist(LifecycleEventArgs $args) * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException * @throws \Logeecom\Infrastructure\TaskExecution\Exceptions\QueueStorageUnavailableException + * @throws \Packlink\BusinessLogic\ShipmentDraft\Exceptions\DraftTaskMapExists + * @throws \Packlink\BusinessLogic\ShipmentDraft\Exceptions\DraftTaskMapNotFound */ public function postUpdate(LifecycleEventArgs $args) { @@ -74,7 +79,7 @@ public function postUpdate(LifecycleEventArgs $args) return; } - DraftController::createDraft($model->getId()); + $this->shipmentDraftService->enqueueCreateShipmentDraftTask($model->getId()); } /** @@ -122,38 +127,35 @@ protected function getConfigService() } /** - * Checks whether order draft has been created. + * Retrieves shipment draft service. * - * @param $id - * - * @return bool - * - * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException - * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException + * @return \Packlink\BusinessLogic\ShipmentDraft\ShipmentDraftService */ - protected function isOrderDetailsCreated($id) + protected function getShipmentDraftService() { - $filter = new QueryFilter(); - $filter->where('orderId', Operators::EQUALS, $id); - $details = $this->getOrderDetailsRepository()->selectOne($filter); + if ($this->shipmentDraftService === null) { + $this->shipmentDraftService = ServiceRegister::getService(ShipmentDraftService::CLASS_NAME); + } - return $details !== null; + return $this->shipmentDraftService; } /** - * Retrieves order details repository. + * Checks whether order draft has been created. * - * @return \Logeecom\Infrastructure\ORM\Interfaces\RepositoryInterface + * @param $id + * + * @return bool * + * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException */ - protected function getOrderDetailsRepository() + protected function isOrderDetailsCreated($id) { - if ($this->orderDetailsRepository === null) { - $this->orderDetailsRepository = RepositoryRegistry::getRepository(OrderShipmentDetails::getClassName()); - } + /** @var \Packlink\BusinessLogic\OrderShipmentDetails\OrderShipmentDetailsService $orderShipmentDetailsService */ + $orderShipmentDetailsService = ServiceRegister::getService(OrderShipmentDetails::CLASS_NAME); + $details = $orderShipmentDetailsService->getDetailsByOrderId($id); - return $this->orderDetailsRepository; + return $details !== null; } - } \ No newline at end of file diff --git a/Packlink/composer.lock b/Packlink/composer.lock index faca239..7a91623 100644 --- a/Packlink/composer.lock +++ b/Packlink/composer.lock @@ -62,12 +62,12 @@ "source": { "type": "git", "url": "git@github.com:logeecom/pl_module_core.git", - "reference": "c7377797419c70b5478c993c7cf491594c480e70" + "reference": "a9706afa99a520cdb5ad42d105464d50e1301517" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/logeecom/pl_module_core/zipball/c7377797419c70b5478c993c7cf491594c480e70", - "reference": "c7377797419c70b5478c993c7cf491594c480e70", + "url": "https://api.github.com/repos/logeecom/pl_module_core/zipball/a9706afa99a520cdb5ad42d105464d50e1301517", + "reference": "a9706afa99a520cdb5ad42d105464d50e1301517", "shasum": "" }, "require": { @@ -94,7 +94,7 @@ "proprietary" ], "description": "Packlink integrations core library", - "time": "2019-12-18T16:27:57+00:00" + "time": "2020-01-24T12:43:53+00:00" }, { "name": "setasign/fpdf", From edb4cb75c8c79ec69b543d52737e758019a69079 Mon Sep 17 00:00:00 2001 From: Risto Kekovic Date: Tue, 28 Jan 2020 21:54:20 +0100 Subject: [PATCH 04/44] Update to Core mechanisms regarding front DTOs ISSUE: PLCORE20-24 --- .../Controllers/Backend/PacklinkDashboard.php | 9 +- .../Backend/PacklinkDefaultParcel.php | 52 +++-------- .../Backend/PacklinkDefaultWarehouse.php | 92 ++++--------------- .../Backend/PacklinkShippingMethod.php | 17 +--- Packlink/Controllers/Backend/PacklinkTax.php | 35 ++++--- .../Controllers/Common/CanFormatResponse.php | 29 ------ .../js/ShippingMethodsController.js | 18 ++-- .../BusinessLogic/CheckoutService.php | 4 +- Packlink/Utilities/Cache.php | 8 +- Packlink/Utilities/Response.php | 32 +++++++ Packlink/composer.lock | 10 +- 11 files changed, 117 insertions(+), 189 deletions(-) delete mode 100644 Packlink/Controllers/Common/CanFormatResponse.php diff --git a/Packlink/Controllers/Backend/PacklinkDashboard.php b/Packlink/Controllers/Backend/PacklinkDashboard.php index 814b7bc..5a20eb8 100644 --- a/Packlink/Controllers/Backend/PacklinkDashboard.php +++ b/Packlink/Controllers/Backend/PacklinkDashboard.php @@ -7,11 +7,18 @@ class Shopware_Controllers_Backend_PacklinkDashboard extends Enlight_Controller_ { /** * Retrieves setup status. + * + * @throws \Packlink\BusinessLogic\DTO\Exceptions\FrontDtoNotRegisteredException */ public function indexAction() { $controller = new DashboardController(); - Response::json($controller->getStatus()->toArray()); + try { + $status = $controller->getStatus(); + Response::json($status->toArray()); + } catch (\Packlink\BusinessLogic\DTO\Exceptions\FrontDtoValidationException $e) { + Response::validationErrorsResponse($e->getValidationErrors()); + } } } \ No newline at end of file diff --git a/Packlink/Controllers/Backend/PacklinkDefaultParcel.php b/Packlink/Controllers/Backend/PacklinkDefaultParcel.php index 13015d8..7bb67e6 100644 --- a/Packlink/Controllers/Backend/PacklinkDefaultParcel.php +++ b/Packlink/Controllers/Backend/PacklinkDefaultParcel.php @@ -4,18 +4,10 @@ use Packlink\Controllers\Common\CanInstantiateServices; use Packlink\Utilities\Request; use Packlink\Utilities\Response; -use Packlink\Utilities\Translation; class Shopware_Controllers_Backend_PacklinkDefaultParcel extends Enlight_Controller_Action { use CanInstantiateServices; - /** @var array */ - protected static $fields = [ - 'weight', - 'width', - 'height', - 'length', - ]; /** * Retrieves default parcel. @@ -23,9 +15,12 @@ class Shopware_Controllers_Backend_PacklinkDefaultParcel extends Enlight_Control public function indexAction() { $parcel = $this->getConfigService()->getDefaultParcel(); - $data = $parcel ? $parcel->toArray() : []; - Response::json($data); + if (!$parcel) { + Response::json(); + } + + Response::json($parcel->toArray()); } /** @@ -34,37 +29,14 @@ public function indexAction() public function updateAction() { $data = Request::getPostData(); - $validationResult = $this->validate($data); - - if (!empty($validationResult)) { - Response::json($validationResult, 400); - } - $data['default'] = true; - $this->getConfigService()->setDefaultParcel(ParcelInfo::fromArray($data)); - - Response::json($data); - } - - /** - * Validates default parcel. - * - * @param array $data - * - * @return array - */ - protected function validate(array $data) - { - $result = []; - foreach (self::$fields as $field) { - if (empty($data[$field])) { - $result[$field] = Translation::get('error/required'); - } else if (!is_numeric($data[$field]) || $data[$field] <= 0) { - $result[$field] = Translation::get('error/number'); - } + try { + $parcelInfo = ParcelInfo::fromArray($data); + $this->getConfigService()->setDefaultParcel($parcelInfo); + Response::json($parcelInfo->toArray()); + } catch (\Packlink\BusinessLogic\DTO\Exceptions\FrontDtoValidationException $e) { + Response::validationErrorsResponse($e->getValidationErrors()); } - - return $result; } -} \ No newline at end of file +} diff --git a/Packlink/Controllers/Backend/PacklinkDefaultWarehouse.php b/Packlink/Controllers/Backend/PacklinkDefaultWarehouse.php index b24cd81..00eacea 100644 --- a/Packlink/Controllers/Backend/PacklinkDefaultWarehouse.php +++ b/Packlink/Controllers/Backend/PacklinkDefaultWarehouse.php @@ -1,55 +1,47 @@ getConfigService()->getDefaultWarehouse(); - if (!$warehouse) { - $userInfo = $this->configService->getUserInfo(); - /** @noinspection NullPointerExceptionInspection */ - $warehouse = Warehouse::fromArray(array('country' => $userInfo->country)); - } + /** @var WarehouseService $warehouseService */ + $warehouseService = ServiceRegister::getService(WarehouseService::CLASS_NAME); + + $warehouse = $warehouseService->getWarehouse(); Response::json($warehouse->toArray()); } /** * Updates default warehouse. + * + * @throws \Packlink\BusinessLogic\DTO\Exceptions\FrontDtoNotRegisteredException */ public function updateAction() { $data = Request::getPostData(); - $validationResult = $this->validate($data); - if (!empty($validationResult)) { - Response::json($validationResult, 400); - } - $data['default'] = true; - $this->getConfigService()->setDefaultWarehouse(Warehouse::fromArray($data)); + + /** @var WarehouseService $warehouseService */ + $warehouseService = ServiceRegister::getService(WarehouseService::CLASS_NAME); + + try { + $warehouseService->setWarehouse($data); + } catch (\Packlink\BusinessLogic\DTO\Exceptions\FrontDtoValidationException $e) { + Response::validationErrorsResponse($e->getValidationErrors()); + } Response::json($data); } @@ -81,52 +73,4 @@ public function searchAction() Response::json($arrayResult); } - - /** - * Validates default warehouse. - * - * @param array $data - * - * @return array - */ - protected function validate(array $data) - { - $result = []; - - foreach (self::$fields as $field) { - if (empty($data[$field])) { - $result[$field] = Translation::get('error/required'); - } - } - - if (!empty($data['country']) && !empty($data['postal_code'])) { - try { - $postalCodes = $this->getProxy()->getPostalCodes($data['country'], $data['postal_code']); - if (empty($postalCodes)) { - $result['postal_code'] = Translation::get('error/postalcode'); - } - } catch (Exception $e) { - $result['postal_code'] = Translation::get('error/postalcode'); - } - } - - if (!empty($data['email']) && !filter_var($data['email'], FILTER_VALIDATE_EMAIL)) { - $result['email'] = Translation::get('error/email'); - } - - if (!empty($data['phone'])) { - $regex = '/^(\+|\/|\.|-|\(|\)|\d)+$/m'; - $phoneError = !preg_match($regex, $data['phone']); - - $digits = '/\d/m'; - $match = preg_match_all($digits, $data['phone']); - $phoneError |= $match === false || $match < 3; - - if ($phoneError) { - $result['phone'] = Translation::get('error/phone'); - } - } - - return $result; - } -} \ No newline at end of file +} diff --git a/Packlink/Controllers/Backend/PacklinkShippingMethod.php b/Packlink/Controllers/Backend/PacklinkShippingMethod.php index fefb447..07c777d 100644 --- a/Packlink/Controllers/Backend/PacklinkShippingMethod.php +++ b/Packlink/Controllers/Backend/PacklinkShippingMethod.php @@ -5,16 +5,14 @@ use Packlink\BusinessLogic\Controllers\DTO\ShippingMethodConfiguration; use Packlink\BusinessLogic\Controllers\ShippingMethodController; use Packlink\BusinessLogic\Controllers\UpdateShippingServicesTaskStatusController; -use Packlink\Controllers\Common\CanFormatResponse; use Packlink\Controllers\Common\CanInstantiateServices; -use Packlink\Utilities\CarrierLogo; use Packlink\Utilities\Request; use Packlink\Utilities\Response; use Packlink\Utilities\Translation; class Shopware_Controllers_Backend_PacklinkShippingMethod extends Enlight_Controller_Action { - use CanInstantiateServices, CanFormatResponse; + use CanInstantiateServices; /** @var \Packlink\BusinessLogic\Controllers\ShippingMethodController */ protected $controller; @@ -45,14 +43,9 @@ public function __construct( */ public function listAction() { - $data = $this->controller->getAll(); + $shippingMethods = $this->controller->getAll(); - $result = []; - foreach ($data as $item) { - $result[] = $this->formatResponse($item); - } - - Response::json($result); + Response::dtoEntitiesResponse($shippingMethods); } /** @@ -101,7 +94,7 @@ public function updateAction() $model->selected = $this->controller->activate($model->id); } - Response::json($this->formatResponse($model)); + Response::json($model->toArray()); } /** @@ -169,4 +162,4 @@ protected function getUserCountry() return strtolower($userAccount ? $userAccount->country : 'de'); } -} \ No newline at end of file +} diff --git a/Packlink/Controllers/Backend/PacklinkTax.php b/Packlink/Controllers/Backend/PacklinkTax.php index 63b28fd..134fbba 100644 --- a/Packlink/Controllers/Backend/PacklinkTax.php +++ b/Packlink/Controllers/Backend/PacklinkTax.php @@ -1,5 +1,6 @@ 0, - 'label' => Translation::get('configuration/defaulttax'), - ]; + $result = []; - $availableTaxes = $this->getTaxRepository()->queryAll()->execute(); + try { + $result[] = TaxClass::fromArray( + [ + 'value' => 0, + 'label' => Translation::get('configuration/defaulttax'), + ] + ); - /** @var Tax $tax */ - foreach ($availableTaxes as $tax) { - $result[] = [ - 'value' => $tax->getId(), - 'label' => $tax->getName(), - ]; + $availableTaxes = $this->getTaxRepository()->queryAll()->execute(); + + /** @var Tax $tax */ + foreach ($availableTaxes as $tax) { + $result[] = TaxClass::fromArray([ + 'value' => $tax->getId(), + 'label' => $tax->getName(), + ]); + } + } catch (\Packlink\BusinessLogic\DTO\Exceptions\FrontDtoValidationException $e) { + Response::validationErrorsResponse($e->getValidationErrors()); } - Response::json($result); + Response::dtoEntitiesResponse($result); } /** @@ -39,4 +48,4 @@ protected function getTaxRepository() /** @noinspection PhpIncompatibleReturnTypeInspection */ return Shopware()->Models()->getRepository(Tax::class); } -} \ No newline at end of file +} diff --git a/Packlink/Controllers/Common/CanFormatResponse.php b/Packlink/Controllers/Common/CanFormatResponse.php deleted file mode 100644 index 155fd2b..0000000 --- a/Packlink/Controllers/Common/CanFormatResponse.php +++ /dev/null @@ -1,29 +0,0 @@ -toArray(); - } - } else { - $result = $data->toArray(); - } - - return $result; - } -} \ No newline at end of file diff --git a/Packlink/Resources/views/backend/_resources/js/ShippingMethodsController.js b/Packlink/Resources/views/backend/_resources/js/ShippingMethodsController.js index 764b923..9bf7edc 100644 --- a/Packlink/Resources/views/backend/_resources/js/ShippingMethodsController.js +++ b/Packlink/Resources/views/backend/_resources/js/ShippingMethodsController.js @@ -27,7 +27,7 @@ var Packlink = window.Packlink || {}; let spinnerBarrierCount = 0; let spinnerBarrier = getSpinnerBarrier(); - /** @var {{parcelSet, warehouseSet, shippingMethodSet}} dashboardData */ + /** @var {{isParcelSet, isWarehouseSet, isShippingMethodSet}} dashboardData */ let dashboardData = {}; /** @@ -278,7 +278,7 @@ var Packlink = window.Packlink || {}; initSteps(); - if (!dashboardData.parcelSet || !dashboardData.warehouseSet || !dashboardData.shippingMethodSet) { + if (!dashboardData.isParcelSet || !dashboardData.isWarehouseSet || !dashboardData.isShippingMethodSet) { showDashboardModal(); } else { hideDashboardModal(); @@ -1684,7 +1684,7 @@ var Packlink = window.Packlink || {}; * Initializes default parcel step. */ function initParcelStep() { - let status = dashboardData.parcelSet ? 'completed' : 'in-progress'; + let status = dashboardData.isParcelSet ? 'completed' : 'in-progress'; let step = templateService.getComponent('pl-parcel-step'); if (status !== 'disabled') { step.addEventListener('click', handleParcelStepClicked, true); @@ -1700,7 +1700,7 @@ var Packlink = window.Packlink || {}; * Initializes step subtitle. */ function initStepSubtitle() { - if (!dashboardData.parcelSet || !dashboardData.warehouseSet) { + if (!dashboardData.isParcelSet || !dashboardData.isWarehouseSet) { templateService.getComponent('pl-step-subtitle').remove(); } } @@ -1711,8 +1711,8 @@ var Packlink = window.Packlink || {}; function initWarehouseStep() { let status = 'completed'; - if (!dashboardData.warehouseSet) { - if (dashboardData.parcelSet) { + if (!dashboardData.isWarehouseSet) { + if (dashboardData.isParcelSet) { status = 'in-progress'; } else { status = 'disabled'; @@ -1736,8 +1736,8 @@ var Packlink = window.Packlink || {}; function initMethodsStep() { let status = 'completed'; - if (!dashboardData.shippingMethodSet) { - if (dashboardData.parcelSet && dashboardData.warehouseSet) { + if (!dashboardData.isShippingMethodSet) { + if (dashboardData.isParcelSet && dashboardData.isWarehouseSet) { status = 'in-progress'; } else { status = 'disabled'; @@ -1802,7 +1802,7 @@ var Packlink = window.Packlink || {}; isAutoconfigure = false; } - if (!isAutoconfigure && (!dashboardData.parcelSet || !dashboardData.warehouseSet)) { + if (!isAutoconfigure && (!dashboardData.isParcelSet || !dashboardData.isWarehouseSet)) { return; } diff --git a/Packlink/Services/BusinessLogic/CheckoutService.php b/Packlink/Services/BusinessLogic/CheckoutService.php index 93404b3..ee17f1f 100644 --- a/Packlink/Services/BusinessLogic/CheckoutService.php +++ b/Packlink/Services/BusinessLogic/CheckoutService.php @@ -113,7 +113,7 @@ protected function calculateShippingCosts($userId, $sessionId, $shippingAddressI /** * Retrieves default warehouse. * - * @return \Packlink\BusinessLogic\Http\DTO\Warehouse + * @return \Packlink\BusinessLogic\Warehouse\Warehouse */ protected function getDefaultWarehouse() { @@ -332,4 +332,4 @@ protected function getShippingMethodRepository() return $this->shippingMethodRepository; } -} \ No newline at end of file +} diff --git a/Packlink/Utilities/Cache.php b/Packlink/Utilities/Cache.php index 66f2a23..f28318c 100644 --- a/Packlink/Utilities/Cache.php +++ b/Packlink/Utilities/Cache.php @@ -6,7 +6,7 @@ use Logeecom\Infrastructure\ORM\QueryFilter\QueryFilter; use Logeecom\Infrastructure\ORM\RepositoryRegistry; use Packlink\BusinessLogic\Http\DTO\ParcelInfo; -use Packlink\BusinessLogic\Http\DTO\Warehouse; +use Packlink\BusinessLogic\Warehouse\Warehouse; use Packlink\BusinessLogic\ShippingMethod\Models\ShippingMethod; use Packlink\Entities\ShippingMethodMap; @@ -98,7 +98,7 @@ public static function setShippingCosts(array $costs) /** * Retrieves default warehouse. * - * @return \Packlink\BusinessLogic\Http\DTO\Warehouse | null + * @return \Packlink\BusinessLogic\Warehouse\Warehouse | null */ public static function getDefaultWarehouse() { @@ -108,7 +108,7 @@ public static function getDefaultWarehouse() /** * Sets default warehouse. * - * @param \Packlink\BusinessLogic\Http\DTO\Warehouse $warehouse + * @param \Packlink\BusinessLogic\Warehouse\Warehouse $warehouse */ public static function setDefaultWarehouse(Warehouse $warehouse) { @@ -226,4 +226,4 @@ protected static function getShippingServicesRepository() return static::$shippingServicesRepository; } -} \ No newline at end of file +} diff --git a/Packlink/Utilities/Response.php b/Packlink/Utilities/Response.php index 9908288..0527caa 100644 --- a/Packlink/Utilities/Response.php +++ b/Packlink/Utilities/Response.php @@ -4,6 +4,38 @@ class Response { + /** + * Converts DTOs to array and returns a JSON response. + * + * @param \Packlink\BusinessLogic\DTO\BaseDto[] $entities + */ + public static function dtoEntitiesResponse(array $entities) + { + $response = array(); + + foreach ($entities as $entity) { + $response[] = $entity->toArray(); + } + + self::json($response); + } + + /** + * Returns 400 response with validation errors. + * + * @param \Packlink\BusinessLogic\DTO\ValidationError[] $errors + */ + public static function validationErrorsResponse(array $errors) + { + $result = array(); + + foreach ($errors as $error) { + $result[$error->field] = $error->message; + } + + self::json($result, 400); + } + /** * Returns json response. * diff --git a/Packlink/composer.lock b/Packlink/composer.lock index 7a91623..554540e 100644 --- a/Packlink/composer.lock +++ b/Packlink/composer.lock @@ -1,7 +1,7 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], "content-hash": "58dd3e0326ab3108c1f21b54591a8655", @@ -62,12 +62,12 @@ "source": { "type": "git", "url": "git@github.com:logeecom/pl_module_core.git", - "reference": "a9706afa99a520cdb5ad42d105464d50e1301517" + "reference": "2f6f766a7a71efca6a9e0a083f465dbfdaabdc18" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/logeecom/pl_module_core/zipball/a9706afa99a520cdb5ad42d105464d50e1301517", - "reference": "a9706afa99a520cdb5ad42d105464d50e1301517", + "url": "https://api.github.com/repos/logeecom/pl_module_core/zipball/2f6f766a7a71efca6a9e0a083f465dbfdaabdc18", + "reference": "2f6f766a7a71efca6a9e0a083f465dbfdaabdc18", "shasum": "" }, "require": { @@ -94,7 +94,7 @@ "proprietary" ], "description": "Packlink integrations core library", - "time": "2020-01-24T12:43:53+00:00" + "time": "2020-01-28T13:33:06+00:00" }, { "name": "setasign/fpdf", From 02850abb59025a031ba68cec1e51dcfd378bb53f Mon Sep 17 00:00:00 2001 From: Risto Kekovic Date: Thu, 30 Jan 2020 12:41:56 +0100 Subject: [PATCH 05/44] Fix code review issues regarding order shipment handling ISSUE: PLCORE20-15 --- .../PacklinkDraftDetailsController.php | 9 ++++---- .../PacklinkDraftTaskStatusController.php | 18 +++++++-------- .../PacklinkOrderDetailsController.php | 23 +------------------ .../Backend/PacklinkPrintLabelsController.php | 13 +++++------ .../Common/CanInstantiateServices.php | 19 ++++++++++++++- Packlink/Subscribers/OrderListHandler.php | 5 ++-- 6 files changed, 39 insertions(+), 48 deletions(-) diff --git a/Packlink/Controllers/Backend/PacklinkDraftDetailsController.php b/Packlink/Controllers/Backend/PacklinkDraftDetailsController.php index aa4a948..323c940 100644 --- a/Packlink/Controllers/Backend/PacklinkDraftDetailsController.php +++ b/Packlink/Controllers/Backend/PacklinkDraftDetailsController.php @@ -22,11 +22,10 @@ public function indexAction() { $orderId = $this->Request()->get('orderId'); - /** @var \Shopware\Models\Order\Order $order | null */ - if (empty($orderId) || - ($orderDetails = $this->getOrderShipmentDetailsService()->getDetailsByOrderId($orderId)) === null || - ($order = $this->getShopwareOrderRepository()->find((int)$orderId)) === null - ) { + /** @var \Shopware\Models\Order\Order $order */ + $order = $this->getShopwareOrderRepository()->find((int)$orderId); + $orderDetails = $this->getOrderShipmentDetailsService()->getDetailsByOrderId($orderId); + if (empty($orderId) || $order === null || $orderDetails === null) { Response::json([], 400); } diff --git a/Packlink/Controllers/Backend/PacklinkDraftTaskStatusController.php b/Packlink/Controllers/Backend/PacklinkDraftTaskStatusController.php index bd8f76e..ce0f19b 100644 --- a/Packlink/Controllers/Backend/PacklinkDraftTaskStatusController.php +++ b/Packlink/Controllers/Backend/PacklinkDraftTaskStatusController.php @@ -2,7 +2,6 @@ use Logeecom\Infrastructure\ServiceRegister; use Logeecom\Infrastructure\TaskExecution\QueueItem; -use Packlink\BusinessLogic\ShipmentDraft\Objects\ShipmentDraftStatus; use Packlink\BusinessLogic\ShipmentDraft\ShipmentDraftService; use Packlink\Controllers\Backend\PacklinkOrderDetailsController; use Packlink\Utilities\Response; @@ -10,6 +9,10 @@ class Shopware_Controllers_Backend_PacklinkDraftTaskStatusController extends PacklinkOrderDetailsController { const NOT_LOGGED_IN_STATUS = 'not_logged_in'; + const DRAFT_CREATION_IN_PROGRESS_STATUSES = [ + QueueItem::QUEUED, + QueueItem::IN_PROGRESS, + ]; /** * Retrieves send draft task status for particular order. @@ -29,16 +32,11 @@ public function indexAction() $shipmentDraftService = ServiceRegister::getService(ShipmentDraftService::CLASS_NAME); $draftStatus = $shipmentDraftService->getDraftStatus($orderId); - switch ($draftStatus->status) { - case ShipmentDraftStatus::NOT_QUEUED: - Response::json(['status' => ShipmentDraftStatus::NOT_QUEUED]); - case QueueItem::FAILED: - Response::json(['status' => QueueItem::FAILED]); - case QueueItem::COMPLETED: - Response::json(['status' => QueueItem::COMPLETED]); - default: - Response::json(['status' => QueueItem::IN_PROGRESS]); + if (in_array($draftStatus->status, self::DRAFT_CREATION_IN_PROGRESS_STATUSES)) { + Response::json(['status' => QueueItem::IN_PROGRESS]); } + + Response::json(['status' => $draftStatus->status]); } /** diff --git a/Packlink/Controllers/Backend/PacklinkOrderDetailsController.php b/Packlink/Controllers/Backend/PacklinkOrderDetailsController.php index 725ae1f..787039e 100644 --- a/Packlink/Controllers/Backend/PacklinkOrderDetailsController.php +++ b/Packlink/Controllers/Backend/PacklinkOrderDetailsController.php @@ -4,33 +4,12 @@ use Logeecom\Infrastructure\ORM\QueryFilter\Operators; use Logeecom\Infrastructure\ORM\QueryFilter\QueryFilter; -use Logeecom\Infrastructure\ServiceRegister; -use Packlink\BusinessLogic\OrderShipmentDetails\OrderShipmentDetailsService; use Packlink\Controllers\Common\CanInstantiateServices; class PacklinkOrderDetailsController extends \Enlight_Controller_Action { use CanInstantiateServices; - /** - * @var OrderShipmentDetailsService - */ - private $orderShipmentDetailsService; - - /** - * Returns an instance of order shipment details service. - * - * @return OrderShipmentDetailsService - */ - protected function getOrderShipmentDetailsService() - { - if ($this->orderShipmentDetailsService === null) { - $this->orderShipmentDetailsService = ServiceRegister::getService(OrderShipmentDetailsService::CLASS_NAME); - } - - return $this->orderShipmentDetailsService; - } - /** * Retrieves task. * @@ -51,4 +30,4 @@ protected function getTask($taskId) return $item; } -} \ No newline at end of file +} diff --git a/Packlink/Controllers/Backend/PacklinkPrintLabelsController.php b/Packlink/Controllers/Backend/PacklinkPrintLabelsController.php index bbaee78..a9b7193 100644 --- a/Packlink/Controllers/Backend/PacklinkPrintLabelsController.php +++ b/Packlink/Controllers/Backend/PacklinkPrintLabelsController.php @@ -22,14 +22,13 @@ public function printAction() $orderService = $this->getOrderService(); foreach ($orderIds as $id) { - if (($dts = $this->getOrderShipmentDetailsService()->getDetailsByOrderId((int)$id)) !== null - && $orderService->isReadyToFetchShipmentLabels($dts->getStatus()) - ) { - $labels = $dts->getShipmentLabels(); + $orderDetails = $this->getOrderShipmentDetailsService()->getDetailsByOrderId((int)$id); + if ($orderDetails !== null && $orderService->isReadyToFetchShipmentLabels($orderDetails->getStatus())) { + $labels = $orderDetails->getShipmentLabels(); if (empty($labels)) { - $labels = $orderService->getShipmentLabels($dts->getReference()); - $dts->setShipmentLabels($labels); + $labels = $orderService->getShipmentLabels($orderDetails->getReference()); + $orderDetails->setShipmentLabels($labels); } /** @var \Packlink\BusinessLogic\Http\DTO\ShipmentLabel $label */ @@ -40,7 +39,7 @@ public function printAction() } } - $this->getOrderDetailsRepository()->update($dts); + $this->getOrderDetailsRepository()->update($orderDetails); } } diff --git a/Packlink/Controllers/Common/CanInstantiateServices.php b/Packlink/Controllers/Common/CanInstantiateServices.php index 3b2e112..fd422c9 100644 --- a/Packlink/Controllers/Common/CanInstantiateServices.php +++ b/Packlink/Controllers/Common/CanInstantiateServices.php @@ -10,6 +10,7 @@ use Packlink\BusinessLogic\Location\LocationService; use Packlink\BusinessLogic\OrderShipmentDetails\Models\OrderShipmentDetails; use Packlink\BusinessLogic\Order\OrderService; +use Packlink\BusinessLogic\OrderShipmentDetails\OrderShipmentDetailsService; use Packlink\BusinessLogic\ShippingMethod\Models\ShippingMethod; use Packlink\BusinessLogic\User\UserAccountService; use Packlink\Contracts\Services\BusinessLogic\DebugService; @@ -43,6 +44,8 @@ trait CanInstantiateServices protected $shippingMethodRepository; /** @var \Packlink\BusinessLogic\Order\OrderService */ protected $orderService; + /** @var \Packlink\BusinessLogic\OrderShipmentDetails\OrderShipmentDetailsService */ + protected $orderShipmentDetailsService; /** * Retrieves configuration service. @@ -229,4 +232,18 @@ protected function getOrderService() return $this->orderService; } -} \ No newline at end of file + + /** + * Returns order shipment details service. + * + * @return \Packlink\BusinessLogic\OrderShipmentDetails\OrderShipmentDetailsService + */ + protected function getOrderShipmentDetailsService() + { + if ($this->orderShipmentDetailsService === null) { + $this->orderShipmentDetailsService = ServiceRegister::getService(OrderShipmentDetailsService::CLASS_NAME); + } + + return $this->orderShipmentDetailsService; + } +} diff --git a/Packlink/Subscribers/OrderListHandler.php b/Packlink/Subscribers/OrderListHandler.php index fb98092..d86392d 100644 --- a/Packlink/Subscribers/OrderListHandler.php +++ b/Packlink/Subscribers/OrderListHandler.php @@ -52,9 +52,8 @@ public function extendOrderList(Enlight_Hook_HookArgs $args) $orderShipmentDetailsService = ServiceRegister::getService(OrderShipmentDetailsService::CLASS_NAME); foreach ($return['data'] as $index => $order) { - if (($orderDetails = $orderShipmentDetailsService->getDetailsByOrderId((string)$order['id'])) !== null - && $orderDetails->getReference() - ) { + $orderDetails = $orderShipmentDetailsService->getDetailsByOrderId((string)$order['id']); + if ($orderDetails !== null && $orderDetails->getReference()) { $return['data'][$index]['plReferenceUrl'] = Reference::getUrl( $userCountry, $orderDetails->getReference() From 05fb6ded4580ff8de0bebcd2eb778214b7e3c55c Mon Sep 17 00:00:00 2001 From: Risto Kekovic Date: Thu, 30 Jan 2020 14:35:34 +0100 Subject: [PATCH 06/44] Fix code review issues regarding front DTO controllers ISSUE: PLCORE20-24 --- .../Controllers/Backend/PacklinkDashboard.php | 12 ++------ Packlink/Controllers/Backend/PacklinkTax.php | 30 ++++++++----------- .../backend/packlink/configuration.ini | 3 +- .../backend/packlink_configuration/index.tpl | 2 +- Packlink/Utilities/Response.php | 2 +- Packlink/Utilities/Translation.php | 25 +++++++++++++++- 6 files changed, 44 insertions(+), 30 deletions(-) diff --git a/Packlink/Controllers/Backend/PacklinkDashboard.php b/Packlink/Controllers/Backend/PacklinkDashboard.php index 5a20eb8..57e85a0 100644 --- a/Packlink/Controllers/Backend/PacklinkDashboard.php +++ b/Packlink/Controllers/Backend/PacklinkDashboard.php @@ -7,18 +7,12 @@ class Shopware_Controllers_Backend_PacklinkDashboard extends Enlight_Controller_ { /** * Retrieves setup status. - * - * @throws \Packlink\BusinessLogic\DTO\Exceptions\FrontDtoNotRegisteredException */ public function indexAction() { $controller = new DashboardController(); - try { - $status = $controller->getStatus(); - Response::json($status->toArray()); - } catch (\Packlink\BusinessLogic\DTO\Exceptions\FrontDtoValidationException $e) { - Response::validationErrorsResponse($e->getValidationErrors()); - } + $status = $controller->getStatus(); + Response::json($status->toArray()); } -} \ No newline at end of file +} diff --git a/Packlink/Controllers/Backend/PacklinkTax.php b/Packlink/Controllers/Backend/PacklinkTax.php index 134fbba..a2e7462 100644 --- a/Packlink/Controllers/Backend/PacklinkTax.php +++ b/Packlink/Controllers/Backend/PacklinkTax.php @@ -14,25 +14,21 @@ public function listAction() { $result = []; - try { - $result[] = TaxClass::fromArray( - [ - 'value' => 0, - 'label' => Translation::get('configuration/defaulttax'), - ] - ); + $result[] = TaxClass::fromArray( + [ + 'value' => 0, + 'label' => Translation::get('configuration/defaulttax'), + ] + ); - $availableTaxes = $this->getTaxRepository()->queryAll()->execute(); + $availableTaxes = $this->getTaxRepository()->queryAll()->execute(); - /** @var Tax $tax */ - foreach ($availableTaxes as $tax) { - $result[] = TaxClass::fromArray([ - 'value' => $tax->getId(), - 'label' => $tax->getName(), - ]); - } - } catch (\Packlink\BusinessLogic\DTO\Exceptions\FrontDtoValidationException $e) { - Response::validationErrorsResponse($e->getValidationErrors()); + /** @var Tax $tax */ + foreach ($availableTaxes as $tax) { + $result[] = TaxClass::fromArray([ + 'value' => $tax->getId(), + 'label' => $tax->getName(), + ]); } Response::dtoEntitiesResponse($result); diff --git a/Packlink/Resources/snippets/backend/packlink/configuration.ini b/Packlink/Resources/snippets/backend/packlink/configuration.ini index 353084c..7795657 100644 --- a/Packlink/Resources/snippets/backend/packlink/configuration.ini +++ b/Packlink/Resources/snippets/backend/packlink/configuration.ini @@ -154,7 +154,8 @@ error/shippingmethodsave="Failed to save shipping method." error/feildnotvalid="This field is not valid." error/greaterthanzero="Value must be greater than 0." error/twodecimalplaces="Field must have 2 decimal places." -error/integer="Field must be an integer." +error/weight="Weight must be a positive decimal number." +error/integer="Field must be a positive integer." success/shippingmethodactivate="Shipping method successfully selected." success/shippingmethoddeactivate="Shipping method successfully deselected." success/disableshopshippingmethod="Successfully disabled shipping methods." diff --git a/Packlink/Resources/views/backend/packlink_configuration/index.tpl b/Packlink/Resources/views/backend/packlink_configuration/index.tpl index 992f759..78b3555 100644 --- a/Packlink/Resources/views/backend/packlink_configuration/index.tpl +++ b/Packlink/Resources/views/backend/packlink_configuration/index.tpl @@ -1164,7 +1164,7 @@ phone: "{s name="error/phone"}Field must be valid phone number.{/s}", greaterThanZero: "{s name="error/greaterthanzero"}Value must be greater than 0.{/s}", numberOfDecimalPlaces: "{s name="error/twodecimalplaces"}Field must have 2 decimal places.{/s}", - integer: "{s name="error/integer"}Field must be an integer.{/s}" + integer: "{s name="error/integer"}Field must be a positive integer.{/s}" }; Packlink.successMsgs = { diff --git a/Packlink/Utilities/Response.php b/Packlink/Utilities/Response.php index 0527caa..be18961 100644 --- a/Packlink/Utilities/Response.php +++ b/Packlink/Utilities/Response.php @@ -30,7 +30,7 @@ public static function validationErrorsResponse(array $errors) $result = array(); foreach ($errors as $error) { - $result[$error->field] = $error->message; + $result[$error->field] = Translation::getValidationErrorTranslation($error->code, $error->field); } self::json($result, 400); diff --git a/Packlink/Utilities/Translation.php b/Packlink/Utilities/Translation.php index d5f727e..0f24f04 100644 --- a/Packlink/Utilities/Translation.php +++ b/Packlink/Utilities/Translation.php @@ -2,8 +2,31 @@ namespace Packlink\Utilities; +use Packlink\BusinessLogic\DTO\ValidationError; + class Translation { + /** + * Returns translation for validation error message. + * + * @param string $code + * @param string $field + * + * @return string + */ + public static function getValidationErrorTranslation($code, $field) + { + if ($code === ValidationError::ERROR_REQUIRED_FIELD) { + return self::get('error/required'); + } + + if (in_array($field, array('width', 'length', 'height'))) { + return self::get('error/integer'); + } + + return self::get('error/' . $field); + } + /** * @param $key * @@ -13,4 +36,4 @@ public static function get($key) { return Shopware()->Snippets()->getNamespace('backend/packlink/configuration')->get($key, $key); } -} \ No newline at end of file +} From 669b6f2e13aa72c8cd38135da1983f96ca5da7bc Mon Sep 17 00:00:00 2001 From: Risto Kekovic Date: Thu, 30 Jan 2020 15:44:35 +0100 Subject: [PATCH 07/44] Fix code review issues regarding order shipment handling ISSUE: PLCORE20-15 --- .../PacklinkDraftDetailsController.php | 8 ++++++-- .../PacklinkDraftTaskStatusController.php | 6 +----- .../PacklinkOrderDetailsController.php | 20 +++++++++++++++++++ .../Backend/PacklinkPrintLabelsController.php | 2 +- .../Common/CanInstantiateServices.php | 17 ---------------- 5 files changed, 28 insertions(+), 25 deletions(-) diff --git a/Packlink/Controllers/Backend/PacklinkDraftDetailsController.php b/Packlink/Controllers/Backend/PacklinkDraftDetailsController.php index 323c940..bbcbcbe 100644 --- a/Packlink/Controllers/Backend/PacklinkDraftDetailsController.php +++ b/Packlink/Controllers/Backend/PacklinkDraftDetailsController.php @@ -22,10 +22,14 @@ public function indexAction() { $orderId = $this->Request()->get('orderId'); + if (empty($orderId)) { + Response::json([], 400); + } + /** @var \Shopware\Models\Order\Order $order */ $order = $this->getShopwareOrderRepository()->find((int)$orderId); - $orderDetails = $this->getOrderShipmentDetailsService()->getDetailsByOrderId($orderId); - if (empty($orderId) || $order === null || $orderDetails === null) { + $orderDetails = $this->getOrderDetails($orderId); + if ($order === null || $orderDetails === null) { Response::json([], 400); } diff --git a/Packlink/Controllers/Backend/PacklinkDraftTaskStatusController.php b/Packlink/Controllers/Backend/PacklinkDraftTaskStatusController.php index ce0f19b..637baae 100644 --- a/Packlink/Controllers/Backend/PacklinkDraftTaskStatusController.php +++ b/Packlink/Controllers/Backend/PacklinkDraftTaskStatusController.php @@ -9,10 +9,6 @@ class Shopware_Controllers_Backend_PacklinkDraftTaskStatusController extends PacklinkOrderDetailsController { const NOT_LOGGED_IN_STATUS = 'not_logged_in'; - const DRAFT_CREATION_IN_PROGRESS_STATUSES = [ - QueueItem::QUEUED, - QueueItem::IN_PROGRESS, - ]; /** * Retrieves send draft task status for particular order. @@ -32,7 +28,7 @@ public function indexAction() $shipmentDraftService = ServiceRegister::getService(ShipmentDraftService::CLASS_NAME); $draftStatus = $shipmentDraftService->getDraftStatus($orderId); - if (in_array($draftStatus->status, self::DRAFT_CREATION_IN_PROGRESS_STATUSES)) { + if ($draftStatus->status === QueueItem::QUEUED) { Response::json(['status' => QueueItem::IN_PROGRESS]); } diff --git a/Packlink/Controllers/Backend/PacklinkOrderDetailsController.php b/Packlink/Controllers/Backend/PacklinkOrderDetailsController.php index 787039e..e022ddc 100644 --- a/Packlink/Controllers/Backend/PacklinkOrderDetailsController.php +++ b/Packlink/Controllers/Backend/PacklinkOrderDetailsController.php @@ -10,6 +10,26 @@ class PacklinkOrderDetailsController extends \Enlight_Controller_Action { use CanInstantiateServices; + /** + * Retrieves order details. + * + * @param string $orderId + * + * @return \Packlink\BusinessLogic\OrderShipmentDetails\Models\OrderShipmentDetails | null + * + * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException + * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException + */ + protected function getOrderDetails($orderId) + { + $filter = new QueryFilter(); + $filter->where('orderId', Operators::EQUALS, $orderId); + /** @var \Packlink\BusinessLogic\OrderShipmentDetails\Models\OrderShipmentDetails $details */ + $details = $this->getOrderDetailsRepository()->selectOne($filter); + + return $details; + } + /** * Retrieves task. * diff --git a/Packlink/Controllers/Backend/PacklinkPrintLabelsController.php b/Packlink/Controllers/Backend/PacklinkPrintLabelsController.php index a9b7193..c98bf15 100644 --- a/Packlink/Controllers/Backend/PacklinkPrintLabelsController.php +++ b/Packlink/Controllers/Backend/PacklinkPrintLabelsController.php @@ -22,7 +22,7 @@ public function printAction() $orderService = $this->getOrderService(); foreach ($orderIds as $id) { - $orderDetails = $this->getOrderShipmentDetailsService()->getDetailsByOrderId((int)$id); + $orderDetails = $this->getOrderDetails((string)$id); if ($orderDetails !== null && $orderService->isReadyToFetchShipmentLabels($orderDetails->getStatus())) { $labels = $orderDetails->getShipmentLabels(); diff --git a/Packlink/Controllers/Common/CanInstantiateServices.php b/Packlink/Controllers/Common/CanInstantiateServices.php index fd422c9..1eb631d 100644 --- a/Packlink/Controllers/Common/CanInstantiateServices.php +++ b/Packlink/Controllers/Common/CanInstantiateServices.php @@ -10,7 +10,6 @@ use Packlink\BusinessLogic\Location\LocationService; use Packlink\BusinessLogic\OrderShipmentDetails\Models\OrderShipmentDetails; use Packlink\BusinessLogic\Order\OrderService; -use Packlink\BusinessLogic\OrderShipmentDetails\OrderShipmentDetailsService; use Packlink\BusinessLogic\ShippingMethod\Models\ShippingMethod; use Packlink\BusinessLogic\User\UserAccountService; use Packlink\Contracts\Services\BusinessLogic\DebugService; @@ -44,8 +43,6 @@ trait CanInstantiateServices protected $shippingMethodRepository; /** @var \Packlink\BusinessLogic\Order\OrderService */ protected $orderService; - /** @var \Packlink\BusinessLogic\OrderShipmentDetails\OrderShipmentDetailsService */ - protected $orderShipmentDetailsService; /** * Retrieves configuration service. @@ -232,18 +229,4 @@ protected function getOrderService() return $this->orderService; } - - /** - * Returns order shipment details service. - * - * @return \Packlink\BusinessLogic\OrderShipmentDetails\OrderShipmentDetailsService - */ - protected function getOrderShipmentDetailsService() - { - if ($this->orderShipmentDetailsService === null) { - $this->orderShipmentDetailsService = ServiceRegister::getService(OrderShipmentDetailsService::CLASS_NAME); - } - - return $this->orderShipmentDetailsService; - } } From a3f79b5cab620a2385af374d90bc1556a64e711e Mon Sep 17 00:00:00 2001 From: Risto Kekovic Date: Mon, 3 Feb 2020 09:37:10 +0100 Subject: [PATCH 08/44] Refactor getting carrier logo URL ISSUE: PLCORE20-15 --- .../PacklinkDraftDetailsController.php | 17 +++-- .../ShopShippingMethodService.php | 23 ++++-- Packlink/Subscribers/CarrierLogoHandler.php | 29 +++----- Packlink/Utilities/CarrierLogo.php | 71 ------------------- Packlink/composer.lock | 8 +-- 5 files changed, 42 insertions(+), 106 deletions(-) delete mode 100644 Packlink/Utilities/CarrierLogo.php diff --git a/Packlink/Controllers/Backend/PacklinkDraftDetailsController.php b/Packlink/Controllers/Backend/PacklinkDraftDetailsController.php index bbcbcbe..5f51d6b 100644 --- a/Packlink/Controllers/Backend/PacklinkDraftDetailsController.php +++ b/Packlink/Controllers/Backend/PacklinkDraftDetailsController.php @@ -4,7 +4,6 @@ use Logeecom\Infrastructure\ORM\QueryFilter\Operators; use Logeecom\Infrastructure\ORM\QueryFilter\QueryFilter; use Packlink\Controllers\Backend\PacklinkOrderDetailsController; -use Packlink\Utilities\CarrierLogo; use Packlink\Utilities\Reference; use Packlink\Utilities\Response; use Packlink\Utilities\Translation; @@ -62,14 +61,14 @@ public function indexAction() try { $dispatch = $order->getDispatch(); - $shippingMethodName = $this->getShippingMethodName($dispatch->getId()); + $shippingMethod = $this->getShippingMethod($dispatch->getId()); $details = array_merge( $details, [ - 'shippingMethod' => $shippingMethodName, + 'shippingMethod' => $shippingMethod->getTitle(), 'carrier' => $dispatch->getName(), - 'logo' => CarrierLogo::getLogo($country, $shippingMethodName), + 'logo' => $shippingMethod->getLogoUrl(), ] ); } catch (Exception $e) { @@ -81,16 +80,16 @@ public function indexAction() } /** - * Retrieves carrier name. + * Retrieves shipping method by provided ID. * * @param $shopwareCarrierId * - * @return string + * @return \Packlink\BusinessLogic\ShippingMethod\Models\ShippingMethod * * @throws \Logeecom\Infrastructure\ORM\Exceptions\QueryFilterInvalidParamException * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException */ - protected function getShippingMethodName($shopwareCarrierId) + protected function getShippingMethod($shopwareCarrierId) { $filter = new QueryFilter(); $filter->where('shopwareCarrierId', Operators::EQUALS, $shopwareCarrierId); @@ -98,7 +97,7 @@ protected function getShippingMethodName($shopwareCarrierId) $map = $this->getShippingMethodMapRepository()->selectOne($filter); if ($map === null) { - return ''; + return null; } $filter = new QueryFilter(); @@ -107,7 +106,7 @@ protected function getShippingMethodName($shopwareCarrierId) /** @var \Packlink\BusinessLogic\ShippingMethod\Models\ShippingMethod $method */ $method = $this->getShippingMethodRepository()->selectOne($filter); - return $method !== null ? $method->getCarrierName() : ''; + return $method; } /** diff --git a/Packlink/Services/BusinessLogic/ShopShippingMethodService.php b/Packlink/Services/BusinessLogic/ShopShippingMethodService.php index de93f8c..c563c9f 100644 --- a/Packlink/Services/BusinessLogic/ShopShippingMethodService.php +++ b/Packlink/Services/BusinessLogic/ShopShippingMethodService.php @@ -11,7 +11,7 @@ use Packlink\BusinessLogic\ShippingMethod\Interfaces\ShopShippingMethodService as BaseService; use Packlink\BusinessLogic\ShippingMethod\Models\ShippingMethod; use Packlink\Entities\ShippingMethodMap; -use Packlink\Utilities\CarrierLogo; +use Packlink\Utilities\Shop; use Packlink\Utilities\Translation; use Shopware\Components\Model\ModelEntity; use Shopware\Models\Dispatch\Dispatch; @@ -23,11 +23,15 @@ class ShopShippingMethodService implements BaseService const WEIGHT = 0; const STANDARD_SHIPPING = 0; const ALLWAYS_CHARGE = 0; + const DEFAULT_CARRIER = 'carrier.jpg'; + const IMG_DIR = '/Resources/views/backend/_resources/images/carriers/'; /** * @var \Packlink\Repositories\BaseRepository */ protected $baseRepository; - /** @var \Packlink\Services\BusinessLogic\ConfigurationService */ + /** + * @var \Packlink\Services\BusinessLogic\ConfigurationService + */ protected $configService; /** @@ -127,9 +131,20 @@ public function getCarrierLogoFilePath($carrierName) /** @var \Packlink\Services\BusinessLogic\ConfigurationService $configService */ $configService = ServiceRegister::getService(Configuration::CLASS_NAME); $userInfo = $configService->getUserInfo(); - $country = $userInfo ? $userInfo->country : ''; + $country = $userInfo ? strtolower($userInfo->country) : ''; + + $pluginDir = Shopware()->Container()->getParameter('packlink.plugin_dir'); + + $baseDir = $pluginDir . self::IMG_DIR; + $image = $baseDir . $country . '/' . strtolower(str_replace(' ', '-', $carrierName)) . '.png'; + + if (!file_exists($image)) { + $image = $baseDir . self::DEFAULT_CARRIER; + } + + $pathResolver = Shopware()->Container()->get('theme_path_resolver'); - return CarrierLogo::getLogo(strtolower($country), $carrierName); + return $pathResolver->formatPathToUrl($image, Shop::getDefaultShop()); } /** diff --git a/Packlink/Subscribers/CarrierLogoHandler.php b/Packlink/Subscribers/CarrierLogoHandler.php index 24e1f6f..732b9be 100644 --- a/Packlink/Subscribers/CarrierLogoHandler.php +++ b/Packlink/Subscribers/CarrierLogoHandler.php @@ -6,8 +6,8 @@ use Enlight_Hook_HookArgs; use Logeecom\Infrastructure\ServiceRegister; use Packlink\BusinessLogic\Configuration; +use Packlink\BusinessLogic\ShippingMethod\Interfaces\ShopShippingMethodService; use Packlink\Utilities\Cache; -use Packlink\Utilities\CarrierLogo; class CarrierLogoHandler implements SubscriberInterface { @@ -41,34 +41,27 @@ public function onAfterSGetPremiumDispatches(Enlight_Hook_HookArgs $args) $carriers = $args->getReturn(); $map = Cache::getCarrierMaps(); - $country = $this->getUserCountry(); + /** @var \Packlink\Services\BusinessLogic\ShopShippingMethodService $shopShippingMethodService */ + $shopShippingMethodService = ServiceRegister::getService(ShopShippingMethodService::CLASS_NAME); foreach ($carriers as $index => $carrier) { $id = (int) $carrier['id']; $isBackup = $this->isBackupCarrier((int) $carrier['id']); if ($isBackup) { $carriers[$index]['isPlLogoEnabled'] = true; - $carriers[$index]['plLogo'] = CarrierLogo::getLogo($country, 'backup'); - } else if (isset($map[$id]) && ($service = Cache::getService($map[$id])) && $service->isDisplayLogo()) { - $carriers[$index]['isPlLogoEnabled'] = true; - $carriers[$index]['plLogo'] = CarrierLogo::getLogo($country, $service->getCarrierName()); + $carriers[$index]['plLogo'] = $shopShippingMethodService->getCarrierLogoFilePath('backup'); + } else if (isset($map[$id])) { + $service = Cache::getService($map[$id]); + + if ($service && $service->isDisplayLogo()) { + $carriers[$index]['isPlLogoEnabled'] = true; + $carriers[$index]['plLogo'] = $service->getLogoUrl(); + } } } $args->setReturn($carriers); } - /** - * Retrieves user country. Fallback is de. - * - * @return string - */ - protected function getUserCountry() - { - $userAccount = $this->getConfigService()->getUserInfo(); - - return strtolower($userAccount ? $userAccount->country : 'de'); - } - /** * Retrieves config service. * diff --git a/Packlink/Utilities/CarrierLogo.php b/Packlink/Utilities/CarrierLogo.php deleted file mode 100644 index 8ec03c1..0000000 --- a/Packlink/Utilities/CarrierLogo.php +++ /dev/null @@ -1,71 +0,0 @@ -Container()->getParameter('packlink.plugin_dir'); - - $baseDir = $pluginDir . static::$imgDir; - $image = $baseDir . $country . '/' . strtolower(str_replace(' ', '-', $name)) . '.png'; - - if (!file_exists($image)) { - $image = $baseDir . self::DEFAULT_CARRIER; - } - - return static::getPathResolver()->formatPathToUrl($image, static::getDefaultShop()); - } - - /** - * Retrieves path resolver. - * - * @return \Shopware\Components\Theme\PathResolver - * - * @throws \Exception - */ - protected static function getPathResolver() - { - if (static::$pathResolver === null) { - static::$pathResolver = Shopware()->Container()->get('theme_path_resolver'); - } - - return static::$pathResolver; - } - - /** - * Retrieves default shop. - * - * @return \Shopware\Models\Shop\Shop - */ - protected static function getDefaultShop() - { - if (static::$defaultShop === null) { - static::$defaultShop = Shop::getDefaultShop(); - } - - return static::$defaultShop; - } -} \ No newline at end of file diff --git a/Packlink/composer.lock b/Packlink/composer.lock index 554540e..44b48f4 100644 --- a/Packlink/composer.lock +++ b/Packlink/composer.lock @@ -62,12 +62,12 @@ "source": { "type": "git", "url": "git@github.com:logeecom/pl_module_core.git", - "reference": "2f6f766a7a71efca6a9e0a083f465dbfdaabdc18" + "reference": "c58865b4bbdae94c276b4f11be371d6121e1c9ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/logeecom/pl_module_core/zipball/2f6f766a7a71efca6a9e0a083f465dbfdaabdc18", - "reference": "2f6f766a7a71efca6a9e0a083f465dbfdaabdc18", + "url": "https://api.github.com/repos/logeecom/pl_module_core/zipball/c58865b4bbdae94c276b4f11be371d6121e1c9ab", + "reference": "c58865b4bbdae94c276b4f11be371d6121e1c9ab", "shasum": "" }, "require": { @@ -94,7 +94,7 @@ "proprietary" ], "description": "Packlink integrations core library", - "time": "2020-01-28T13:33:06+00:00" + "time": "2020-01-31T08:56:58+00:00" }, { "name": "setasign/fpdf", From e6824ce93d690269d020afd2b746954d61d24286 Mon Sep 17 00:00:00 2001 From: Petar Rankovic Date: Tue, 4 Feb 2020 10:14:41 +0100 Subject: [PATCH 09/44] Fix packlink columns sorting error ISSUE CS-730 --- .../views/backend/packlink_list/packlink_order_list.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Packlink/Resources/views/backend/packlink_list/packlink_order_list.js b/Packlink/Resources/views/backend/packlink_list/packlink_order_list.js index 695a60e..46079d1 100644 --- a/Packlink/Resources/views/backend/packlink_list/packlink_order_list.js +++ b/Packlink/Resources/views/backend/packlink_list/packlink_order_list.js @@ -58,6 +58,7 @@ Ext.define('Shopware.apps.Packlink.view.Order.List', { header: '{s name="order/packlink/pro"}Packlink PRO{/s}', dataIndex: 'plReferenceUrl', flex:2, + sortable:false, renderer: renderPacklinkProColumn }); @@ -65,6 +66,7 @@ Ext.define('Shopware.apps.Packlink.view.Order.List', { header: '{s name="order/print/labels"}Labels{/s}', dataIndex: 'plHasLabel', flex:1, + sortable:false, renderer: renderPrintLabelsColumn }); From 2690ac25e71f7137e2ef9595dc8c2c629e5cb0f2 Mon Sep 17 00:00:00 2001 From: Risto Kekovic Date: Mon, 10 Feb 2020 10:46:09 +0100 Subject: [PATCH 10/44] Change the list of countries on the login form ISSUE: PLCR16-21 --- .../Controllers/Backend/PacklinkLogin.php | 13 +++ .../backend/packlink/configuration.ini | 55 +++++++++--- .../views/backend/_resources/css/packlink.css | 24 +++-- .../backend/_resources/images/flags/AT.svg | 11 +++ .../backend/_resources/images/flags/BE.svg | 9 ++ .../images/flags/{germany.svg => DE.svg} | 30 ------- .../images/flags/{spain.svg => ES.svg} | 30 ------- .../images/flags/{france.svg => FR.svg} | 30 ------- .../backend/_resources/images/flags/GB.svg | 31 +++++++ .../backend/_resources/images/flags/IE.svg | 8 ++ .../images/flags/{italy.svg => IT.svg} | 30 ------- .../backend/_resources/images/flags/NL.svg | 8 ++ .../backend/_resources/images/flags/PT.svg | 14 +++ .../backend/_resources/images/flags/TR.svg | 13 +++ .../js/DefaultWarehouseController.js | 88 ++++++++++++++----- .../backend/_resources/js/StateController.js | 2 + .../backend/_resources/js/UtilityService.js | 8 +- .../views/backend/packlink_login/index.tpl | 36 +++----- Packlink/composer.json | 2 +- Packlink/composer.lock | 12 +-- 20 files changed, 264 insertions(+), 190 deletions(-) create mode 100644 Packlink/Resources/views/backend/_resources/images/flags/AT.svg create mode 100644 Packlink/Resources/views/backend/_resources/images/flags/BE.svg rename Packlink/Resources/views/backend/_resources/images/flags/{germany.svg => DE.svg} (80%) rename Packlink/Resources/views/backend/_resources/images/flags/{spain.svg => ES.svg} (81%) rename Packlink/Resources/views/backend/_resources/images/flags/{france.svg => FR.svg} (77%) create mode 100644 Packlink/Resources/views/backend/_resources/images/flags/GB.svg create mode 100644 Packlink/Resources/views/backend/_resources/images/flags/IE.svg rename Packlink/Resources/views/backend/_resources/images/flags/{italy.svg => IT.svg} (77%) create mode 100644 Packlink/Resources/views/backend/_resources/images/flags/NL.svg create mode 100644 Packlink/Resources/views/backend/_resources/images/flags/PT.svg create mode 100644 Packlink/Resources/views/backend/_resources/images/flags/TR.svg diff --git a/Packlink/Controllers/Backend/PacklinkLogin.php b/Packlink/Controllers/Backend/PacklinkLogin.php index 29eca40..4dfd187 100644 --- a/Packlink/Controllers/Backend/PacklinkLogin.php +++ b/Packlink/Controllers/Backend/PacklinkLogin.php @@ -1,7 +1,10 @@ View()->assign(['isLoginFailure' => true]); } + } else { + /** @var \Packlink\BusinessLogic\Country\CountryService $countryService */ + $countryService = ServiceRegister::getService(CountryService::CLASS_NAME); + $supportedCountries = $countryService->getSupportedCountries(); + + foreach ($supportedCountries as $country) { + $country->name = Translation::get("configuration/country/{$country->code}"); + } + + $this->View()->assign(['countries' => $supportedCountries]); } } diff --git a/Packlink/Resources/snippets/backend/packlink/configuration.ini b/Packlink/Resources/snippets/backend/packlink/configuration.ini index 7795657..cb52594 100644 --- a/Packlink/Resources/snippets/backend/packlink/configuration.ini +++ b/Packlink/Resources/snippets/backend/packlink/configuration.ini @@ -111,10 +111,17 @@ configuration/systeminfo="system info" configuration/generalcondition="General conditions" configuration/develpedandmanaged="Developed and managed by Packlink" configuration/tax="Tax" -configuration/country/DE="Germany" -configuration/country/IT="Italy" configuration/country/ES="Spain" +configuration/country/DE="Germany" configuration/country/FR="France" +configuration/country/IT="Italy" +configuration/country/AT="Austria" +configuration/country/NL="Netherlands" +configuration/country/BE="Belgium" +configuration/country/PT="Portugal" +configuration/country/TR="Turkey" +configuration/country/IE="Ireland" +configuration/country/GB="United Kingdom" configuration/importingservices="We are importing the best shipping services for your shipments." configuration/takefewseconds="This process could take a few seconds." configuration/troublereceivingservices="We are having troubles getting shipping services." @@ -282,10 +289,17 @@ configuration/systeminfo="Systeminformationen" configuration/generalcondition="Allgemeine Bedingungen" configuration/develpedandmanaged="Entwickelt und verwaltet von Packlink" configuration/tax="Steuer" -configuration/country/DE="Deutschland" -configuration/country/IT="Italien" configuration/country/ES="Spanien" +configuration/country/DE="Deutschland" configuration/country/FR="Frankreich" +configuration/country/IT="Italien" +configuration/country/AT="Österreich" +configuration/country/NL="Niederlande" +configuration/country/BE="Belgien" +configuration/country/PT="Portugal" +configuration/country/TR="Türkei" +configuration/country/IE="Irland" +configuration/country/GB="Vereinigtes Königreich" configuration/importingservices="Die besten Versanddienste für Ihre Sendungen werden jetzt importiert." configuration/takefewseconds="Dieser Vorgang könnte einige Sekunden dauern." configuration/troublereceivingservices="Beim Abrufen der Versanddienste ist ein Problem aufgetreten." @@ -452,10 +466,17 @@ configuration/systeminfo="Informations du système" configuration/generalcondition="Conditions générales" configuration/develpedandmanaged="Développé et géré par Packlink" configuration/tax="Taxe" -configuration/country/DE="Allemagne" -configuration/country/IT="Italie" configuration/country/ES="Espagne" +configuration/country/DE="Allemagne" configuration/country/FR="France" +configuration/country/IT="Italie" +configuration/country/AT="Autriche" +configuration/country/NL="Pays-Bas" +configuration/country/BE="Belgique" +configuration/country/PT="Portugal" +configuration/country/TR="Turquie" +configuration/country/IE="Irlande" +configuration/country/GB="Royaume-Uni" configuration/importingservices="Nous importons les meilleurs services de livraison pour vos envois." configuration/takefewseconds="Ce processus peut prendre quelques secondes." configuration/troublereceivingservices="Nous rencontrons des problèmes dans l’importation des services de livraison." @@ -622,10 +643,17 @@ configuration/systeminfo="Informazioni del sistema" configuration/generalcondition="Condizioni generali" configuration/develpedandmanaged="Sviluppato e gestito da Packlink" configuration/tax="Tassa" -configuration/country/DE="Germania" -configuration/country/IT="Italia" configuration/country/ES="Spagna" +configuration/country/DE="Germania" configuration/country/FR="Francia" +configuration/country/IT="Italia" +configuration/country/AT="Austria" +configuration/country/NL="Paesi Bassi" +configuration/country/BE="Belgio" +configuration/country/PT="Portogallo" +configuration/country/TR="Turchia" +configuration/country/IE="Irlanda" +configuration/country/GB="Regno Unito" configuration/importingservices="Stiamo importando i migliori servizi di spedizione per le tue spedizioni." configuration/takefewseconds="Questo processo potrebbe richiedere qualche istante." configuration/troublereceivingservices="Si è verificato un problema durante l’acquisizione dei servizi di spedizione." @@ -792,10 +820,17 @@ configuration/systeminfo="Información del sistema" configuration/generalcondition="Condiciones generales" configuration/develpedandmanaged="Desarrollado y gestionado por Packlink" configuration/tax="Impuestos" -configuration/country/DE="Alemania" -configuration/country/IT="Italia" configuration/country/ES="España" +configuration/country/DE="Alemania" configuration/country/FR="Francia" +configuration/country/IT="Italia" +configuration/country/AT="Austria" +configuration/country/NL="Países Bajos" +configuration/country/BE="Bélgica" +configuration/country/PT="Portugal" +configuration/country/TR="Turquía" +configuration/country/IE="Irlanda" +configuration/country/GB="Reino Unido" configuration/importingservices="Estamos importando los mejores servicios de mensajería para tus envíos." configuration/takefewseconds="Este proceso puede tardar unos segundos." configuration/troublereceivingservices="We are having troubles getting shipping services." diff --git a/Packlink/Resources/views/backend/_resources/css/packlink.css b/Packlink/Resources/views/backend/_resources/css/packlink.css index 0a9bccd..3e44677 100644 --- a/Packlink/Resources/views/backend/_resources/css/packlink.css +++ b/Packlink/Resources/views/backend/_resources/css/packlink.css @@ -1,7 +1,7 @@ /** * @package Packlink_PacklinkPro * @author Packlink Shipping S.L. - * @copyright 2019 Packlink + * @copyright 2020 Packlink */ @font-face { @@ -1188,7 +1188,7 @@ input[type="checkbox"] { border-radius: 3px; position: relative; display: none; - width: 300px; + width: 250px; float: right; animation: pl-fade-in .5s ease; } @@ -1200,8 +1200,9 @@ input[type="checkbox"] { .pl-register-country-list-wrapper { margin-top: 15px; - display: flex; - justify-content: space-evenly; + max-height: 205px; + overflow-x: auto; + text-align: justify; } .pl-register-country-list-wrapper a { @@ -1209,13 +1210,26 @@ input[type="checkbox"] { } .pl-country { + display: flex; + height: 40px; width: 30px; - line-height: 30px; + line-height: 40px; border-radius: 50%; text-align: center; color: #2095f2; font-size: 14px; text-transform: uppercase; + margin-left: 20px; + margin-bottom: 15px; +} + +.pl-country-logo { + width: 60px; +} + +.pl-country-name { + white-space: nowrap; + margin-left: 15px; } .pl-register-form-close-btn { diff --git a/Packlink/Resources/views/backend/_resources/images/flags/AT.svg b/Packlink/Resources/views/backend/_resources/images/flags/AT.svg new file mode 100644 index 0000000..10c9a9d --- /dev/null +++ b/Packlink/Resources/views/backend/_resources/images/flags/AT.svg @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/Packlink/Resources/views/backend/_resources/images/flags/BE.svg b/Packlink/Resources/views/backend/_resources/images/flags/BE.svg new file mode 100644 index 0000000..89603b8 --- /dev/null +++ b/Packlink/Resources/views/backend/_resources/images/flags/BE.svg @@ -0,0 +1,9 @@ + + + + + + + diff --git a/Packlink/Resources/views/backend/_resources/images/flags/germany.svg b/Packlink/Resources/views/backend/_resources/images/flags/DE.svg similarity index 80% rename from Packlink/Resources/views/backend/_resources/images/flags/germany.svg rename to Packlink/Resources/views/backend/_resources/images/flags/DE.svg index 79e8cc4..a6f4e17 100644 --- a/Packlink/Resources/views/backend/_resources/images/flags/germany.svg +++ b/Packlink/Resources/views/backend/_resources/images/flags/DE.svg @@ -8,34 +8,4 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Packlink/Resources/views/backend/_resources/images/flags/spain.svg b/Packlink/Resources/views/backend/_resources/images/flags/ES.svg similarity index 81% rename from Packlink/Resources/views/backend/_resources/images/flags/spain.svg rename to Packlink/Resources/views/backend/_resources/images/flags/ES.svg index c6afd2e..79d2896 100644 --- a/Packlink/Resources/views/backend/_resources/images/flags/spain.svg +++ b/Packlink/Resources/views/backend/_resources/images/flags/ES.svg @@ -10,35 +10,5 @@ d="M496.077,166.957C459.906,69.473,366.071,0,256,0S52.094,69.473,15.923,166.957H496.077z"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Packlink/Resources/views/backend/_resources/images/flags/france.svg b/Packlink/Resources/views/backend/_resources/images/flags/FR.svg similarity index 77% rename from Packlink/Resources/views/backend/_resources/images/flags/france.svg rename to Packlink/Resources/views/backend/_resources/images/flags/FR.svg index 7d248b8..70954ee 100644 --- a/Packlink/Resources/views/backend/_resources/images/flags/france.svg +++ b/Packlink/Resources/views/backend/_resources/images/flags/FR.svg @@ -8,34 +8,4 @@ d="M512,256c0-110.071-69.472-203.906-166.957-240.077v480.155C442.528,459.906,512,366.071,512,256z"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Packlink/Resources/views/backend/_resources/images/flags/GB.svg b/Packlink/Resources/views/backend/_resources/images/flags/GB.svg new file mode 100644 index 0000000..973c8ed --- /dev/null +++ b/Packlink/Resources/views/backend/_resources/images/flags/GB.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/Packlink/Resources/views/backend/_resources/images/flags/IE.svg b/Packlink/Resources/views/backend/_resources/images/flags/IE.svg new file mode 100644 index 0000000..d508661 --- /dev/null +++ b/Packlink/Resources/views/backend/_resources/images/flags/IE.svg @@ -0,0 +1,8 @@ + + + + + + + diff --git a/Packlink/Resources/views/backend/_resources/images/flags/italy.svg b/Packlink/Resources/views/backend/_resources/images/flags/IT.svg similarity index 77% rename from Packlink/Resources/views/backend/_resources/images/flags/italy.svg rename to Packlink/Resources/views/backend/_resources/images/flags/IT.svg index 99d959d..25e2964 100644 --- a/Packlink/Resources/views/backend/_resources/images/flags/italy.svg +++ b/Packlink/Resources/views/backend/_resources/images/flags/IT.svg @@ -8,34 +8,4 @@ d="M512,256c0-110.071-69.472-203.906-166.957-240.077v480.155C442.528,459.906,512,366.071,512,256z"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Packlink/Resources/views/backend/_resources/images/flags/NL.svg b/Packlink/Resources/views/backend/_resources/images/flags/NL.svg new file mode 100644 index 0000000..b988fd1 --- /dev/null +++ b/Packlink/Resources/views/backend/_resources/images/flags/NL.svg @@ -0,0 +1,8 @@ + + + + + + + diff --git a/Packlink/Resources/views/backend/_resources/images/flags/PT.svg b/Packlink/Resources/views/backend/_resources/images/flags/PT.svg new file mode 100644 index 0000000..af8e853 --- /dev/null +++ b/Packlink/Resources/views/backend/_resources/images/flags/PT.svg @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/Packlink/Resources/views/backend/_resources/images/flags/TR.svg b/Packlink/Resources/views/backend/_resources/images/flags/TR.svg new file mode 100644 index 0000000..1a85f6e --- /dev/null +++ b/Packlink/Resources/views/backend/_resources/images/flags/TR.svg @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/Packlink/Resources/views/backend/_resources/js/DefaultWarehouseController.js b/Packlink/Resources/views/backend/_resources/js/DefaultWarehouseController.js index 352f400..db996c0 100644 --- a/Packlink/Resources/views/backend/_resources/js/DefaultWarehouseController.js +++ b/Packlink/Resources/views/backend/_resources/js/DefaultWarehouseController.js @@ -27,13 +27,13 @@ var Packlink = window.Packlink || {}; let state = Packlink.state; let page; - let country; - + let currentCountry; let currentPostalCode = ''; let currentCity = ''; let searchTerm = ''; + let countryInput = null; let postalCodeInput = null; /** @@ -52,21 +52,43 @@ var Packlink = window.Packlink || {}; * @param response */ function constructPage(response) { - country = response['country']; + currentCountry = response['country']; for (let field of warehouseFields) { let input = templateService.getComponent('pl-default-warehouse-' + field, page); input.addEventListener('blur', onBlurHandler, true); input.addEventListener('focus', onPostalCodeBlur); + if (response[field]) { input.value = response[field]; } } + constructPostalCodeInput(response['postal_code'], response['city']); + + let submitButton = templateService.getComponent( + 'pl-default-warehouse-submit-btn', + page + ); + + submitButton.addEventListener('click', handleSubmitButtonClicked, true); + utilityService.configureInputElements(); + utilityService.hideSpinner(); + + ajaxService.get(configuration.getSupportedCountriesUrl, constructCountryDropdown); + } + + /** + * Constructs postal code input and attaches event handlers to it. + * + * @param {string} postalCode + * @param {string} city + */ + function constructPostalCodeInput(postalCode, city) { postalCodeInput = templateService.getComponent('pl-default-warehouse-postal_code', page); - if (response['postal_code'] && response['city']) { - currentPostalCode = response['postal_code']; - currentCity = response['city']; + if (postalCode && city) { + currentPostalCode = postalCode; + currentCity = city; postalCodeInput.value = currentPostalCode + ' - ' + currentCity; } @@ -80,6 +102,12 @@ var Packlink = window.Packlink || {}; document.addEventListener('click', onPostalCodeBlur); postalCodeInput.addEventListener('keyup', utilityService.debounce(250, onPostalCodeSearch)); postalCodeInput.addEventListener('keyup', autocompleteNavigate); + postalCodeInput.addEventListener( + 'focusout', + function () { + postalCodeInput.value = ' '; + }, + true); templateService.getComponent('data-pl-id', page, 'search-icon').addEventListener( 'click', @@ -88,22 +116,37 @@ var Packlink = window.Packlink || {}; postalCodeInput.focus(); } ); + } - let submitButton = templateService.getComponent( - 'pl-default-warehouse-submit-btn', - page - ); + /** + * Builds a warehouse country dropdown and populates it with all supported countries. + * + * @param response + */ + function constructCountryDropdown(response) { + countryInput = templateService.getComponent('pl-default-warehouse-country', page); - submitButton.addEventListener('click', handleSubmitButtonClicked, true); - utilityService.configureInputElements(); - utilityService.hideSpinner(); + for (let code in response) { + let supportedCountry = response[code], + optionElement = document.createElement('option'); - postalCodeInput.addEventListener( - 'focusout', - function () { - postalCodeInput.value = ' '; - }, - true); + optionElement.value = supportedCountry.code; + optionElement.innerText = supportedCountry.name; + + if (supportedCountry.code === currentCountry) { + optionElement.selected = true; + } + + countryInput.appendChild(optionElement); + } + + countryInput.addEventListener('change', onCountryChange); + } + + function onCountryChange() { + currentCountry = countryInput.value; + currentPostalCode = ''; + currentCity = ''; } function onPostalCodeFocus() { @@ -134,7 +177,10 @@ var Packlink = window.Packlink || {}; return; } - ajaxService.post(configuration.searchPostalCodesUrl, {query: searchTerm}, renderPostalCodesAutocomplete); + ajaxService.post(configuration.searchPostalCodesUrl, { + query: searchTerm, + country: countryInput.value + }, renderPostalCodesAutocomplete); } function renderPostalCodesAutocomplete(response) { @@ -316,7 +362,7 @@ var Packlink = window.Packlink || {}; if (isValid) { utilityService.showSpinner(); - model['country'] = country; + model['country'] = currentCountry; model['postal_code'] = currentPostalCode; model['city'] = currentCity; diff --git a/Packlink/Resources/views/backend/_resources/js/StateController.js b/Packlink/Resources/views/backend/_resources/js/StateController.js index 17c4461..6366056 100644 --- a/Packlink/Resources/views/backend/_resources/js/StateController.js +++ b/Packlink/Resources/views/backend/_resources/js/StateController.js @@ -18,6 +18,7 @@ var Packlink = window.Packlink || {}; * defaultParcelGetUrl: string, * defaultParcelSubmitUrl: string, * defaultWarehouseGetUrl: string, + * getSupportedCountriesUrl: string, * defaultWarehouseSubmitUrl: string, * defaultWarehouseSearchPostalCodesUrl: string, * debugGetStatusUrl: string, @@ -71,6 +72,7 @@ var Packlink = window.Packlink || {}; }, 'default-warehouse': { getUrl: configuration.defaultWarehouseGetUrl, + getSupportedCountriesUrl: configuration.getSupportedCountriesUrl, submitUrl: configuration.defaultWarehouseSubmitUrl, searchPostalCodesUrl: configuration.defaultWarehouseSearchPostalCodesUrl }, diff --git a/Packlink/Resources/views/backend/_resources/js/UtilityService.js b/Packlink/Resources/views/backend/_resources/js/UtilityService.js index 5747bb9..d32f8b0 100644 --- a/Packlink/Resources/views/backend/_resources/js/UtilityService.js +++ b/Packlink/Resources/views/backend/_resources/js/UtilityService.js @@ -10,9 +10,11 @@ var Packlink = window.Packlink || {}; for (let container of inputContainers) { let input = container.getElementsByTagName('input')[0]; - textInputTransformLabel(input); - input.addEventListener('focus', textInputFocusHandler, true); - input.addEventListener('focusout', textInputFocusHandler, true); + if (typeof input !== 'undefined') { + textInputTransformLabel(input); + input.addEventListener('focus', textInputFocusHandler, true); + input.addEventListener('focusout', textInputFocusHandler, true); + } } }; diff --git a/Packlink/Resources/views/backend/packlink_login/index.tpl b/Packlink/Resources/views/backend/packlink_login/index.tpl index 0850ab8..af7a449 100644 --- a/Packlink/Resources/views/backend/packlink_login/index.tpl +++ b/Packlink/Resources/views/backend/packlink_login/index.tpl @@ -35,30 +35,18 @@ {s name="login/country"}Select country to start{/s}

diff --git a/Packlink/composer.json b/Packlink/composer.json index d8ed659..fac0e15 100755 --- a/Packlink/composer.json +++ b/Packlink/composer.json @@ -13,7 +13,7 @@ "minimum-stability": "dev", "require": { "php": ">=5.6", - "packlink/integration-core": "dev-release/v2.0.0", + "packlink/integration-core": "dev-feature/cr-16", "ext-json": "*", "ext-curl": "*", "ext-zip": "*", diff --git a/Packlink/composer.lock b/Packlink/composer.lock index 44b48f4..228af10 100644 --- a/Packlink/composer.lock +++ b/Packlink/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "58dd3e0326ab3108c1f21b54591a8655", + "content-hash": "4cfca4bf0e5158abffa61c995dfb007f", "packages": [ { "name": "iio/libmergepdf", @@ -58,16 +58,16 @@ }, { "name": "packlink/integration-core", - "version": "dev-release/v2.0.0", + "version": "dev-feature/cr-16", "source": { "type": "git", "url": "git@github.com:logeecom/pl_module_core.git", - "reference": "c58865b4bbdae94c276b4f11be371d6121e1c9ab" + "reference": "7c3f0215c12891c3e52ab9ba59510bf14668c0fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/logeecom/pl_module_core/zipball/c58865b4bbdae94c276b4f11be371d6121e1c9ab", - "reference": "c58865b4bbdae94c276b4f11be371d6121e1c9ab", + "url": "https://api.github.com/repos/logeecom/pl_module_core/zipball/7c3f0215c12891c3e52ab9ba59510bf14668c0fd", + "reference": "7c3f0215c12891c3e52ab9ba59510bf14668c0fd", "shasum": "" }, "require": { @@ -94,7 +94,7 @@ "proprietary" ], "description": "Packlink integrations core library", - "time": "2020-01-31T08:56:58+00:00" + "time": "2020-02-07T10:32:21+00:00" }, { "name": "setasign/fpdf", From bb01a413359b71d2ff123cd9136587dda83f67ee Mon Sep 17 00:00:00 2001 From: Risto Kekovic Date: Mon, 10 Feb 2020 11:57:24 +0100 Subject: [PATCH 11/44] Update setting warehouse data ISSUE: PLCR16-22 --- .../Backend/PacklinkConfiguration.php | 23 ++------------- .../Backend/PacklinkDefaultWarehouse.php | 28 +++++++++++++------ .../views/backend/_resources/css/packlink.css | 11 +++++--- .../backend/packlink_configuration/index.tpl | 11 ++++---- 4 files changed, 35 insertions(+), 38 deletions(-) diff --git a/Packlink/Controllers/Backend/PacklinkConfiguration.php b/Packlink/Controllers/Backend/PacklinkConfiguration.php index fcfda62..99bd95a 100644 --- a/Packlink/Controllers/Backend/PacklinkConfiguration.php +++ b/Packlink/Controllers/Backend/PacklinkConfiguration.php @@ -1,22 +1,11 @@ getConfigService()->getUserInfo(); $urlKey = 'ES'; - if ($userInfo && $userInfo->country && in_array($userInfo->country, static::$supportedCountries)) { - $this->View()->assign( - [ - 'defaultWarehouse' => Translation::get("configuration/country/{$userInfo->country}"), - ] - ); - + if ($userInfo) { $urlKey = $userInfo->country; } @@ -69,4 +52,4 @@ public function indexAction() ] ); } -} \ No newline at end of file +} diff --git a/Packlink/Controllers/Backend/PacklinkDefaultWarehouse.php b/Packlink/Controllers/Backend/PacklinkDefaultWarehouse.php index 00eacea..29c0043 100644 --- a/Packlink/Controllers/Backend/PacklinkDefaultWarehouse.php +++ b/Packlink/Controllers/Backend/PacklinkDefaultWarehouse.php @@ -2,10 +2,12 @@ use Logeecom\Infrastructure\Logger\Logger; use Logeecom\Infrastructure\ServiceRegister; +use Packlink\BusinessLogic\Country\CountryService; use Packlink\BusinessLogic\Warehouse\WarehouseService; use Packlink\Controllers\Common\CanInstantiateServices; use Packlink\Utilities\Request; use Packlink\Utilities\Response; +use Packlink\Utilities\Translation; class Shopware_Controllers_Backend_PacklinkDefaultWarehouse extends Enlight_Controller_Action { @@ -28,6 +30,7 @@ public function indexAction() * Updates default warehouse. * * @throws \Packlink\BusinessLogic\DTO\Exceptions\FrontDtoNotRegisteredException + * @throws \Logeecom\Infrastructure\TaskExecution\Exceptions\QueueStorageUnavailableException */ public function updateAction() { @@ -52,25 +55,34 @@ public function updateAction() public function searchAction() { $input = Request::getPostData(); - if (empty($input['query'])) { + if (empty($input['query']) || empty($input['country'])) { Response::json(); } - $country = $this->getConfigService()->getUserInfo()->country; - try { - $result = $this->getLocationService()->searchLocations($country, $input['query']); + $result = $this->getLocationService()->searchLocations($input['country'], $input['query']); } catch (Exception $e) { $result = []; Logger::logError("Location search failed because: [{$e->getMessage()}]"); } - $arrayResult = []; - foreach ($result as $item) { - $arrayResult[] = $item->toArray(); + Response::dtoEntitiesResponse($result); + } + + /** + * Returns countries supported by Packlink. + */ + public function getCountriesAction() + { + /** @var \Packlink\BusinessLogic\Country\CountryService $countryService */ + $countryService = ServiceRegister::getService(CountryService::CLASS_NAME); + $supportedCountries = $countryService->getSupportedCountries(); + + foreach ($supportedCountries as $country) { + $country->name = Translation::get("configuration/country/{$country->code}"); } - Response::json($arrayResult); + Response::dtoEntitiesResponse($supportedCountries); } } diff --git a/Packlink/Resources/views/backend/_resources/css/packlink.css b/Packlink/Resources/views/backend/_resources/css/packlink.css index 3e44677..df26ddb 100644 --- a/Packlink/Resources/views/backend/_resources/css/packlink.css +++ b/Packlink/Resources/views/backend/_resources/css/packlink.css @@ -236,10 +236,6 @@ input[type="checkbox"] { color: #2095F2; } -#pl-default-warehouse-country { - background-color: #dcdcdc !important; -} - .pl-filter-wrapper { -webkit-box-flex: 0; -ms-flex: 0 0 16.66667%; @@ -823,6 +819,13 @@ input[type="checkbox"] { width: 100%; } +.pl-form-section-input #pl-default-warehouse-country { + padding: 17px 0 0 10px; + font-size: 14px; + border: 1px solid #dcdcdc; + margin-bottom: 0; +} + .pl-form-section-input-checkbox-label { font-size: 14px; font-weight: normal !important; diff --git a/Packlink/Resources/views/backend/packlink_configuration/index.tpl b/Packlink/Resources/views/backend/packlink_configuration/index.tpl index 78b3555..5f2f8da 100644 --- a/Packlink/Resources/views/backend/packlink_configuration/index.tpl +++ b/Packlink/Resources/views/backend/packlink_configuration/index.tpl @@ -236,15 +236,13 @@
- - + > + + {s name="configuration/country"}Country{/s}
@@ -1183,6 +1181,7 @@ defaultParcelGetUrl: "{url controller=PacklinkDefaultParcel action="index" __csrf_token=$csrfToken}", defaultParcelSubmitUrl: "{url controller=PacklinkDefaultParcel action="update" __csrf_token=$csrfToken}", defaultWarehouseGetUrl: "{url controller=PacklinkDefaultWarehouse action="index" __csrf_token=$csrfToken}", + getSupportedCountriesUrl: "{url controller=PacklinkDefaultWarehouse action="getCountries" __csrf_token=$csrfToken}", defaultWarehouseSubmitUrl: "{url controller=PacklinkDefaultWarehouse action="update" __csrf_token=$csrfToken}", defaultWarehouseSearchPostalCodesUrl: "{url controller=PacklinkDefaultWarehouse action="search" __csrf_token=$csrfToken}", shippingMethodsGetAllUrl: "{url controller=PacklinkShippingMethod action="list" __csrf_token=$csrfToken}", From ecfff5c4e37a6a9c3521d4531f4f278d18095f4a Mon Sep 17 00:00:00 2001 From: Risto Kekovic Date: Mon, 10 Feb 2020 12:31:12 +0100 Subject: [PATCH 12/44] Unify carrier logos for all countries ISSUE: PLCR16-44 --- Packlink/Lib/Composer.php | 13 +++++-------- .../views/backend/_resources/css/packlink.css | 1 - .../images/carriers/{it => }/artoni.png | Bin .../images/carriers/{es => }/bartolini.png | Bin .../images/carriers/{es => }/cacesa.png | Bin .../images/carriers/{es => }/chronopost.png | Bin .../images/carriers/{fr => }/colissimo.png | Bin .../images/carriers/{es => }/correos-express.png | Bin .../images/carriers/{es => }/correos.png | Bin .../_resources/images/carriers/de/keavo.png | Bin 2454 -> 0 bytes .../images/carriers/de/poste-italiane.png | Bin 1625 -> 0 bytes .../_resources/images/carriers/de/tnt.png | Bin 2732 -> 0 bytes .../_resources/images/carriers/de/ups.png | Bin 6675 -> 0 bytes .../images/carriers/{de => }/dhl-express.png | Bin .../_resources/images/carriers/{es => }/dhl.png | Bin .../_resources/images/carriers/{it => }/dmm.png | Bin .../_resources/images/carriers/{de => }/dpd.png | Bin .../_resources/images/carriers/es/dpd.png | Bin 2201 -> 0 bytes .../_resources/images/carriers/es/gls.png | Bin 2537 -> 0 bytes .../images/carriers/es/mondial-relay.png | Bin 2339 -> 0 bytes .../images/carriers/es/poste-italiane.png | Bin 1625 -> 0 bytes .../_resources/images/carriers/es/seur.png | Bin 5119 -> 0 bytes .../_resources/images/carriers/es/spring.png | Bin 6832 -> 0 bytes .../_resources/images/carriers/es/starpack.png | Bin 2275 -> 0 bytes .../_resources/images/carriers/es/tnt.png | Bin 2716 -> 0 bytes .../_resources/images/carriers/es/ups.png | Bin 3307 -> 0 bytes .../_resources/images/carriers/fr/bartolini.png | Bin 1350 -> 0 bytes .../_resources/images/carriers/fr/chronopost.png | Bin 2550 -> 0 bytes .../_resources/images/carriers/fr/dhl.png | Bin 3282 -> 0 bytes .../_resources/images/carriers/fr/dpd.png | Bin 2201 -> 0 bytes .../_resources/images/carriers/fr/gls.png | Bin 2128 -> 0 bytes .../_resources/images/carriers/fr/keavo.png | Bin 1615 -> 0 bytes .../images/carriers/fr/mondial-relay.png | Bin 2339 -> 0 bytes .../images/carriers/fr/poste-italiane.png | Bin 1625 -> 0 bytes .../_resources/images/carriers/fr/seur.png | Bin 5119 -> 0 bytes .../_resources/images/carriers/fr/spring.png | Bin 6832 -> 0 bytes .../_resources/images/carriers/fr/tnt.png | Bin 2279 -> 0 bytes .../_resources/images/carriers/fr/ups.png | Bin 6253 -> 0 bytes .../_resources/images/carriers/{de => }/gel.png | Bin .../_resources/images/carriers/{de => }/gls.png | Bin .../images/carriers/{fr => }/happy-post.png | Bin .../_resources/images/carriers/it/bartolini.png | Bin 1350 -> 0 bytes .../_resources/images/carriers/it/chronopost.png | Bin 2550 -> 0 bytes .../_resources/images/carriers/it/dpd.png | Bin 2201 -> 0 bytes .../_resources/images/carriers/it/gls.png | Bin 2128 -> 0 bytes .../images/carriers/it/mondial-relay.png | Bin 2339 -> 0 bytes .../_resources/images/carriers/it/nexive.png | Bin 4563 -> 0 bytes .../_resources/images/carriers/it/spring.png | Bin 6832 -> 0 bytes .../_resources/images/carriers/it/tnt.png | Bin 2732 -> 0 bytes .../_resources/images/carriers/it/ups.png | Bin 2221 -> 0 bytes .../images/carriers/{es => }/keavo.png | Bin .../images/carriers/{de => }/mondial-relay.png | Bin .../images/carriers/{es => }/nexive.png | Bin .../carriers/{es => }/packlink-selection.png | Bin .../images/carriers/{it => }/poste-italiane.png | Bin ...poste-italiane_crono-express_door-door_it.png | Bin .../_resources/images/carriers/{it => }/sda.png | Bin .../_resources/images/carriers/{de => }/seur.png | Bin .../images/carriers/{de => }/spring.png | Bin .../images/carriers/{it => }/starpack.png | Bin .../backend/_resources/images/carriers/tnt.png | Bin 0 -> 1619 bytes .../backend/_resources/images/carriers/ups.png | Bin 0 -> 1984 bytes .../images/carriers/{es => }/zeleris.png | Bin .../BusinessLogic/ShopShippingMethodService.php | 7 +------ 64 files changed, 6 insertions(+), 15 deletions(-) rename Packlink/Resources/views/backend/_resources/images/carriers/{it => }/artoni.png (100%) rename Packlink/Resources/views/backend/_resources/images/carriers/{es => }/bartolini.png (100%) rename Packlink/Resources/views/backend/_resources/images/carriers/{es => }/cacesa.png (100%) rename Packlink/Resources/views/backend/_resources/images/carriers/{es => }/chronopost.png (100%) rename Packlink/Resources/views/backend/_resources/images/carriers/{fr => }/colissimo.png (100%) rename Packlink/Resources/views/backend/_resources/images/carriers/{es => }/correos-express.png (100%) rename Packlink/Resources/views/backend/_resources/images/carriers/{es => }/correos.png (100%) delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/de/keavo.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/de/poste-italiane.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/de/tnt.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/de/ups.png rename Packlink/Resources/views/backend/_resources/images/carriers/{de => }/dhl-express.png (100%) rename Packlink/Resources/views/backend/_resources/images/carriers/{es => }/dhl.png (100%) rename Packlink/Resources/views/backend/_resources/images/carriers/{it => }/dmm.png (100%) rename Packlink/Resources/views/backend/_resources/images/carriers/{de => }/dpd.png (100%) delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/es/dpd.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/es/gls.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/es/mondial-relay.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/es/poste-italiane.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/es/seur.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/es/spring.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/es/starpack.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/es/tnt.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/es/ups.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/fr/bartolini.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/fr/chronopost.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/fr/dhl.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/fr/dpd.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/fr/gls.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/fr/keavo.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/fr/mondial-relay.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/fr/poste-italiane.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/fr/seur.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/fr/spring.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/fr/tnt.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/fr/ups.png rename Packlink/Resources/views/backend/_resources/images/carriers/{de => }/gel.png (100%) rename Packlink/Resources/views/backend/_resources/images/carriers/{de => }/gls.png (100%) rename Packlink/Resources/views/backend/_resources/images/carriers/{fr => }/happy-post.png (100%) delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/it/bartolini.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/it/chronopost.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/it/dpd.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/it/gls.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/it/mondial-relay.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/it/nexive.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/it/spring.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/it/tnt.png delete mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/it/ups.png rename Packlink/Resources/views/backend/_resources/images/carriers/{es => }/keavo.png (100%) rename Packlink/Resources/views/backend/_resources/images/carriers/{de => }/mondial-relay.png (100%) rename Packlink/Resources/views/backend/_resources/images/carriers/{es => }/nexive.png (100%) rename Packlink/Resources/views/backend/_resources/images/carriers/{es => }/packlink-selection.png (100%) rename Packlink/Resources/views/backend/_resources/images/carriers/{it => }/poste-italiane.png (100%) rename Packlink/Resources/views/backend/_resources/images/carriers/{it => }/poste-italiane_crono-express_door-door_it.png (100%) rename Packlink/Resources/views/backend/_resources/images/carriers/{it => }/sda.png (100%) rename Packlink/Resources/views/backend/_resources/images/carriers/{de => }/seur.png (100%) rename Packlink/Resources/views/backend/_resources/images/carriers/{de => }/spring.png (100%) rename Packlink/Resources/views/backend/_resources/images/carriers/{it => }/starpack.png (100%) create mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/tnt.png create mode 100644 Packlink/Resources/views/backend/_resources/images/carriers/ups.png rename Packlink/Resources/views/backend/_resources/images/carriers/{es => }/zeleris.png (100%) diff --git a/Packlink/Lib/Composer.php b/Packlink/Lib/Composer.php index cf97818..190d94e 100644 --- a/Packlink/Lib/Composer.php +++ b/Packlink/Lib/Composer.php @@ -6,20 +6,17 @@ class Composer { - protected static $formBase = __DIR__ . '/../vendor/packlink/integration-core/src/BusinessLogic/Resources/'; + protected static $fromBase = __DIR__ . '/../vendor/packlink/integration-core/src/BusinessLogic/Resources/'; protected static $toBase = __DIR__ . '/../Resources/views/backend/_resources/'; public static function postUpdate() { $map = [ - static::$formBase . 'js' => static::$toBase . 'js', - static::$formBase . 'LocationPicker/js' => static::$toBase . 'js/location', - static::$formBase . 'LocationPicker/css' => static::$toBase . 'css/location', - static::$formBase . 'img/carriers/de' => static::$toBase . 'images/carriers/de', - static::$formBase . 'img/carriers/fr' => static::$toBase . 'images/carriers/fr', - static::$formBase . 'img/carriers/it' => static::$toBase . 'images/carriers/it', - static::$formBase . 'img/carriers/es' => static::$toBase . 'images/carriers/es', + static::$fromBase . 'js' => static::$toBase . 'js', + static::$fromBase . 'LocationPicker/js' => static::$toBase . 'js/location', + static::$fromBase . 'LocationPicker/css' => static::$toBase . 'css/location', + static::$fromBase . 'img/carriers' => static::$toBase . 'images/carriers', ]; foreach ($map as $from => $to) { diff --git a/Packlink/Resources/views/backend/_resources/css/packlink.css b/Packlink/Resources/views/backend/_resources/css/packlink.css index df26ddb..41e60d7 100644 --- a/Packlink/Resources/views/backend/_resources/css/packlink.css +++ b/Packlink/Resources/views/backend/_resources/css/packlink.css @@ -804,7 +804,6 @@ input[type="checkbox"] { width: 100%; } - .pl-form-section-input input:focus { border: 1px solid #2095F2 !important; } diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/it/artoni.png b/Packlink/Resources/views/backend/_resources/images/carriers/artoni.png similarity index 100% rename from Packlink/Resources/views/backend/_resources/images/carriers/it/artoni.png rename to Packlink/Resources/views/backend/_resources/images/carriers/artoni.png diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/es/bartolini.png b/Packlink/Resources/views/backend/_resources/images/carriers/bartolini.png similarity index 100% rename from Packlink/Resources/views/backend/_resources/images/carriers/es/bartolini.png rename to Packlink/Resources/views/backend/_resources/images/carriers/bartolini.png diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/es/cacesa.png b/Packlink/Resources/views/backend/_resources/images/carriers/cacesa.png similarity index 100% rename from Packlink/Resources/views/backend/_resources/images/carriers/es/cacesa.png rename to Packlink/Resources/views/backend/_resources/images/carriers/cacesa.png diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/es/chronopost.png b/Packlink/Resources/views/backend/_resources/images/carriers/chronopost.png similarity index 100% rename from Packlink/Resources/views/backend/_resources/images/carriers/es/chronopost.png rename to Packlink/Resources/views/backend/_resources/images/carriers/chronopost.png diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/fr/colissimo.png b/Packlink/Resources/views/backend/_resources/images/carriers/colissimo.png similarity index 100% rename from Packlink/Resources/views/backend/_resources/images/carriers/fr/colissimo.png rename to Packlink/Resources/views/backend/_resources/images/carriers/colissimo.png diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/es/correos-express.png b/Packlink/Resources/views/backend/_resources/images/carriers/correos-express.png similarity index 100% rename from Packlink/Resources/views/backend/_resources/images/carriers/es/correos-express.png rename to Packlink/Resources/views/backend/_resources/images/carriers/correos-express.png diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/es/correos.png b/Packlink/Resources/views/backend/_resources/images/carriers/correos.png similarity index 100% rename from Packlink/Resources/views/backend/_resources/images/carriers/es/correos.png rename to Packlink/Resources/views/backend/_resources/images/carriers/correos.png diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/de/keavo.png b/Packlink/Resources/views/backend/_resources/images/carriers/de/keavo.png deleted file mode 100644 index fa5b464b16c88cd6da08b9275ac8bca7f055b3fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2454 zcmaJ@dpOhkA77{z=|?3LHKPl%o0+!E8XKvU+d(d8X8U4km$uc$$;eVE*P`hnk!vJ$ zQgX@RCrK)lgC49^sN~XRZo`>QI_HmHzwh&Wzn{zVdcEGS_vih7KF>GSWv`>A`dW1m z2&Cz>ljNoxe^I_Du!{1V6$Bbl4*GnuH{YEd#1~Mx0EkFu2Lcc$CN&sv1E}<{Lrs7U z2&4*OczE-@o%i5qY$l94kAVr993>kBvLOgLR9Yy&hXew_3>F?bQh6T=VbJkVFDqw+ zGshkXVeAa&0`B2^J!s*fG%OuTu!YzNaY_Luz^6il%!4c*PKbwo)5R(0^V@JJ|-0tH8+ERfbXOB4=)fP8V4NNzfTiqpuCl3b$Do&iKueZ8k%%6` z?xFq6J?_D)iyvl*eUNT+M6E1pIj4(WVqtl7l2&@v_xz~qEo_tw;KMl*^^$sv4T?a7@E7yxo=iuoIlt}-69OVK0wPdV$0#Kl4bI^(ix#1v=PK!#bp$C8M^neAfj8*oDwEfTug@}KU6dH=O~h6 z1F;2{jB^WPOV`$4k2>y{Af7(Lg+ zMbJCZV^78s;P5$8RpZHku+_dT0VO~5*ebku8L=Z{qUf!H-1~W0x7=fOf0ClxyrC569U#;uZMNRLvG!*9 z?-!#Y<*k~aNa+mbV~rqeRPHg0J4fj%$;*wc?(FSZ8W5i`K57&w4Qz15_q#22D_(*4 zCH6~lWAdQJOkaZy#piQVnA6iVZPRtUXYJ{;`meU`*sVs=QmM);;Cg*+G%-E9>d!k@ zbZjGMX7o_9J%{3Zu1y@jw#k$tLS-cULA>*3XG~W8$RAw_nw4?xH!@ zhrKH^o44(e<(oG(o;fah!kc(3 zW#_DA>DfCXGoSWMChn+HrI(4}OhVPT&KjL&aAwP3S$o&}n59KF*9Gw?5HgmTQ-yGx zi1WRQk9AtLJ_~{SxGOrsHy9qekR@Qbf-iO`c#5QtH@u{)9pRcmBw3NFI_F6XV&zz?KJ~4HtH`5 zIFwfldI!GdFWZ0&t4)+?KeR`mojwMAp1Wzol+@(nEs4A{A6kD|ZkE0LsF6!(-xewM z(yPvrhOy7_``fbpWFyD~;Wq!H-3_{lTBYU}z6dWnNK%6atv^X)@>~YeB#Y&K+^muj zt?BObE80#ZZ#o4F%ne*)5NB+9?qK1p9dV_5lZ9bwq8X%R8KSeh-*NAL!wTqo{l_oU zO50-OrFETjag9*)=@n)uQs;p;=U3gpL&DMM zG#=%I_tB32mO6thp2^Zct&}rpkyoRwp&)9}AEPTMTeQZRe$O>JlX}uB-tQ}TlI~|P zB-7aV%=7lk2z4#9)yd5n(GxrvKW5NyDy76eUw%TIbFb)2P{g?I1MPB$q<85r+dkjP zjV(NWz_DID3*>->mF9%zXTfyx_}UjUF)<0pO)7v)yQs}zpSFpLO$M{!Cmp&>lTxZ4 z=V_S~g4axrWXw??&doK=-?9I`awTmOzEO)ndeeQw|J{`zGykXLMBYm(whM^<3teD3 AYybcN diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/de/poste-italiane.png b/Packlink/Resources/views/backend/_resources/images/carriers/de/poste-italiane.png deleted file mode 100644 index a7159726f9625f23c1c68141e951defb88f517d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1625 zcma*o`9Bkk0|)TwF`LOFkNdvIm^~4mWmkyC7&i<6(3m5)_XiLFkU55P#NeZ)#D%gR@4dA7FP_UqSfr@GEd6hu zVUq}M2R1P@ybnxsE%Gd|tz0^lPOu}zAilrq3q23L5<|opYUXB_>YFE|bHHXPF%hhc z&(~HZWLX6n8{d-fNlL&0fA!$z@Z$cYq#c+fdnAFbuMYq#&IAu9|gYUzKLG zHBCURIj+uYxyl@$3*DzHUTw!!i3@hn-)$slM!f;8FSfIS(0xBii7Fh?GnD?)cfW+s z2Gi~iU(yeoUbp5o=dvr_DQn(%;p3lpcf1R%bK{9{`$N9(jOd1HmXJxT483MmSC0DB zyw`kLc9rk_0%?|d^kp|)XAilB2j~IX?-D*3*0idbFT=NOCgurVY9;L}$$1g>E7c(g z%-kIh>A2^bJ%uUk>Mn1!bS;TEyy`trULmu!zxKj+0Xr)x3{RuH2!{qZ)w?&{GsN$; z#Zp>kH;TPDv`~LaIFnb;xZMkjn7_^LF)r_@*1bOat>jN+t9#UsZHuWJw}8Q3P`hEP zsZ9Z12Y>dG70fO858o?7Ekl|=Q`_n(cKYSLZ@Df{a+~zv!}ZY6t~^#C@#886&WxS1 zQe+CN8&M>PMBKaPH2LUS>H%45a;#08L_WS%;IF+=&~Q&(9H*IB7|Lr*4Kwyr;0py8 z*CrbEYh$B~+6XU+4UrZh?uq{EgLh6*bnT5$C3~MZM0Ks|?WE|s4@X#&jLHkhyLq=~ zSiXC^R1dp(Ue~TJtCo%7H$;2G2+&(}xxXl#!Wp}T&&4^dmonCig^vopJ(aN4@Ci;W zs2GT~G3e~yHZAd1`U;;&1Ktdbti(&nfBvWl!ZehfDT`Kp$I0@n zC~tWuZJ`MAAcXYfqGC5Hj$YwGi6?u=w2twN-jht8>l|FXBt%g>vbWPj*wR>H`)nwFU(-i z+f8rQ+)4{jkvKYb-l%me5%|`+h8$0fH#mKsx%v;Hm7jj--u_w$LIL+*n>{uc z&F}53XC#@-#rG+u?!u+BVPipmeKIbm!c2JC8z)kKfy6VNG;%_AO%1ps;|rzuj?x}5 zFp9|@5**{kXh>`jG3o=zr&OvKbzoX)Gy*-{%V}N$+$$K1uvt=Jw0mh3|BZk#8dQ8j zSBL>*=^^d=0>tdG-Ah@;@og!ZTCMpZB;((I5b8K!`W@1Z#hKNXIUEDmk@E?bp z6*u|5QOSC$Vg*n<+emS#Bz|KG!$4&91@gIxi&IGtNbsig*mwaeFzOi&S&w~K#f`gs zVjs=3Mwmxdyvp!|16&ruxinS0 zWzq5gyydcBj~1`tlVyG`z-44&OyE$)okm!?y@)3&7C+BfeXBNt>v|}$RW59Y_fRy(J~R!v1N91MBE`eRgrK z8R*$9bw#2kTP8OXMhPa}2WC?3Z>n-sRVbl~$2`Uizi7uvZQ4$!mHi*%+mD^5V4gX8 Uj?vLa55EF{b2{%>cZQhoFXtN!#sB~S diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/de/tnt.png b/Packlink/Resources/views/backend/_resources/images/carriers/de/tnt.png deleted file mode 100644 index f3638c7534add05bf1c5566b103a3b320de6eb41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2732 zcmaJ@c{r4N8y;KaSXzkUWQ?3BX0c5(8DbU<23ayGHO#!sV3uaaF_Nv6B}KLrk*FvN zjY;6Nal!NNc$>KY+n1`Px8wI;zy z94tU*>^{N;ypFheQ;&pFQ8b9X9oSZYmI*KcegIg&3}f-o0u1DfE?PEU*@i*DUm*NY z4CL>m$RrOimdypg)=;=P6>b9u+aRC_ODiN2X$H1{Bj7N&1q@+fjzFRZd%#myX^s%%%=9k8QnOsvul$sqerYl za&~>86zJ(!R#uZ6(gXL=QA+k$t23Bx0|^7?6e^{vn~lx?)fqL>usFV`N5DSL*X6y< zTjVuNM|7dmeB2A|u4uci7FL^{v0u4^Rz3_XD=S-DQDx;okhHx$b>YvUp%S>@*BM8( zdHKJJilXrNe#FRxL2FxEkY{UqdjihW%d79f@U(-gWOdqIwx*U=ShFsBYHA96COJ8| zwss*kRn1IaPp`0`U~chqZX9xra#W-1tmb$;%GA`2h*dGM zguuW+PtU=@K}fI9h%&YwHY;5|K?O_hm26x^wv#gZG7^y-Ws{0~l5o0i zuGjg1k`gmB69`46&o9W#?$D-3%1uRs?oCGfPdK?Ip`<=t&}D@W3kwT~KGgzE6lB*@ z;ir~~9-5P%6r8_lROSO^si(ljM>J<75mUw2B@vTYDz)KVLgI6hW zSC7q%Otd}=Z_8@P=DL(|?12peEG0-&7^z&*QS=&FM!AKF>YapHxx{aH&+0*DucJ-+ z{ahdYbf2mbvh0H{W`viUlT9*iVf>b;@j^GMzGG&`5PbU8e3>Y@2Pt@HAW6CZ-gL-s zb-E+|r)>SIp_=-X@dMMBd`v!dBXjP6E=KG{84Z_}pV5fsbxACE6}Z zSCYX%SD4Pe_|I8K&Gsn8DP0(KOO(swoZM)8pnj>m$^5XDP&{2R0=6cs6~=C zC=R1*SYd{7%O_mZG^WU@lCB1z(sN|Gd*Al1=V_zm*5$`G+tnM(u_uf~%)1{g;rNoL>H)>UL zLswMGWa=e3a_l`@t`n8NCB0|CM$6elhHVpKF8&3UX;$lpk)35%f`20cp#%Nmsv19q{>5!SH0nsAyMX-cnJR3-$@S=A`C56lh zE1rBxy5ZKk*0$=}>$(f_Xz#^X4k^OCz<>As({(?G?j;@&hspnrJGK9WvVLx8tZ(h< zuu@9nySa7a3wzVXOyzwPc)KU-5?W2<1;J|0*E^zSCdKL+nTDn%c{WXt2P{RUrqM=) zqAg_U2J8CPzW!&>quSyTMpTS8?9sdF8_P^b#=eUViq9@DBWB^N_Dgq$mPRu5^&T!Q zyg2@$SJJ|69t7RoAPIiS`ejN<(IsjSmQ>ZCTiNnqM>O`B;Z5+S6G7*MJ9DQ0q<)G} zp4eqUjZIWybMi8$qepi?ES#;gJZ674%jJ*$bHcjH14Lz}Qp)xX_#%HG{I%qF(Uv*F zJqYBeyKxdqv-6Z#F{>c!tbe{X{qWPSG!sUK&vS?nvBvZop}6I3c&f`4jZ(?kX*x7+ z+5_(7M5d45=Oaf6r^JK{IYoor^6@rtRy%KOxyJ7$gys#;Zc|`{->bOX8w*c;(VXM2 z!-FG(eH}kP3y!aTl4&{Fp<9|bagX?nw|k+j+&Ie7lAzQ&Yo9Ql;;jfhwOq|{x@SnT z@4BIq;Q8;NOY2mMSzRgvH5%D+jkOEDe_gI(zM!lNQ=Poii8ddO#P4}9>+G?o;}`}fYNd{pS0*St-vGt>)494dxf`MsZOKL#WxLoi~zx-F#=_T=TM&3V7+q>MuKA bT~^cuRSWona23F9<^Pe0cf;Luq#XMX0!Fc2 diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/de/ups.png b/Packlink/Resources/views/backend/_resources/images/carriers/de/ups.png deleted file mode 100644 index 6c0a0775f64929879d5be496e5637da7c053407d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6675 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 diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/de/dhl-express.png b/Packlink/Resources/views/backend/_resources/images/carriers/dhl-express.png similarity index 100% rename from Packlink/Resources/views/backend/_resources/images/carriers/de/dhl-express.png rename to Packlink/Resources/views/backend/_resources/images/carriers/dhl-express.png diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/es/dhl.png b/Packlink/Resources/views/backend/_resources/images/carriers/dhl.png similarity index 100% rename from Packlink/Resources/views/backend/_resources/images/carriers/es/dhl.png rename to Packlink/Resources/views/backend/_resources/images/carriers/dhl.png diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/it/dmm.png b/Packlink/Resources/views/backend/_resources/images/carriers/dmm.png similarity index 100% rename from Packlink/Resources/views/backend/_resources/images/carriers/it/dmm.png rename to Packlink/Resources/views/backend/_resources/images/carriers/dmm.png diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/de/dpd.png b/Packlink/Resources/views/backend/_resources/images/carriers/dpd.png similarity index 100% rename from Packlink/Resources/views/backend/_resources/images/carriers/de/dpd.png rename to Packlink/Resources/views/backend/_resources/images/carriers/dpd.png diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/es/dpd.png b/Packlink/Resources/views/backend/_resources/images/carriers/es/dpd.png deleted file mode 100644 index 8ab6aa70a89bbc448f32edf0854351b6021b21b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2201 zcmaJ@dpy&7A745}sabg*>FQ_B;Rw6gtSxifOe@2gl}kx$`(fCAv;DN8D3?caGMA_$ zA|6gog^JK}>D7foq>JiAsdJ-GD6FR%Ce{ds>r-_Ps&`lb1J zc`RPIVj%*7Sj^hM;ONH9x|d*}r~8(KAVzh=a@gG;_Ju-VIZp~ATm{fh5MYUTp&$q3 z31XtIgN_KqTtLY6hyB@}R6Zoa@MbU=g-D`fBM^?x3JH%N0m8seFjOd}p+{BCXh0~S zq5Vi~99u#M!-N}RrJ!%D7ndI!!KVn&&Q5@%f~pe`fiMqHh$6)@s)C08q)XM!XST6u z;1dLnprJpT@@M-1bVv#UBn-}uk8{8Q4tNaSo=7H>Z2zsa0K_vMqE0%pJldfP`1y6#-V{kJm%>vo%{|^<3 zzM^F?2mIUb{}h&SV>CBviT-OgTPy5fmMvOAN6$Gel(k?ctf9GSEZ zPjO({J1}Os42T~s0>$twSMWEN^iA$eBZwrr$P7>_+yx4lQb+`RN|-AAwim)T^}cWg z-}YkvO)gev20L@C|8>l>Te{wvnSO0r-QsK8gJNB;OLa|+32ur+Am$md7_MB!!`Fd9 zk-ng5yoV=|_roU7NI%c-4|OD?0?h~9m?}dnWOsvUe5noQX^Uw%d0$wE!><{pk2W^= zpmufZJP`|A7HNLhHckA8jjr{f$zX?iwXWcm|^`=l&eXh`|^Lp>Q z0`i`w_uA>eOixSU0{(J4(U3Y?Lro}bz8P$-@ye`Ix;bN!8lwt9|EAWi?q=kA8lv@JUmhRe#yQV{vkZ0r`<$|RoY z?_hKJ^3;;Xl}6o#bMR+E=Ui#dX&vfHuedPe=D(=y;geC7OZo6l14J=7%!rz7WRt4O zPj*>5sr1e+&08A;dvtqEE8BYCTA$wSw7H+2YD_C}I)1ldU!dZ(ZEb`5n|({}#URZ`+}8-ylBy*~F_-wegF5{`<j7N$%W2AS=? z6M4qJz9m*p3+uA;iP9R%U3^@^zRSE$ABOvF{w23Qf2SwigOT$SYt06WqIo4}hPGnJ zi;^4J7DYKaV?$y2N;}fi^)ZcNLY0aJC{JVyge|F`K_MKCT=8WiTk6$wP+P)U$4L+@sYLc2- zem`1ue?2vS1)8#Imvu~vi~8jKE#?&~EVfM{KboZInf;+wRv`WP0Xc==T^@I1{n*&v z%PbZ44<@|XThYeNTd$B?`sRBwSxx^SwwPVAC50|X;WY--q$SNwdNgp5S=w;FV5zAl zBQ!asy}735P*v9DOr%TN5*6f}el$4YbY2{4)tcS|2cFl5HUvd)+aaEU`u8F-_IDotjkpy<;qz|2Up&{M>PQ7B?m9*1uys zvLm0i_vNW=j@?(3~3X3re1x%f3%z{33`hVPij}{cjTfv QXMPq~?p};aw;hT90r&x}5C8xG diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/es/gls.png b/Packlink/Resources/views/backend/_resources/images/carriers/es/gls.png deleted file mode 100644 index d319806d77c971e52bb4aa54bfc2b0f74d9e8cd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2537 zcmaJ@dpMMN8y-t`kV8di9bS_`X^t4oXOc0K215xUr7`b|!OT0&j8i%EF(QY}nJ7}U zrP!2OQVF#sN*f|Mci0Y$jO?P+jyCQ0$M(I~^}fHub>H`MKfmX>e%E_wtDBRm@)~6X z0-?&-Li3P~Ub2^nRFr)&3WfEuL03fg5p9QqL{TgOgm3`iKnP%PS;3G8!~$dXwn26X zggn6U^bz?mUCC^ii)Afhu+dz;jEz9p*+=tP>@Y|K1VX_a9tAbo*n|Q&AO*F;;M!Wf>26^-Eu*Dfj0 zAR$}8;fpvh4_H)W1;P;`3QFem?-aQFud+Phmt&G07%rN{#}Tmj#gvwSOy>WGa=Bm8 zLXijbkKcb47JA0;A)E&!gd+rOS>b}#E{5Wh9R(0e1PeT2IDF|8w}!wXSQrBH0mtoD zzzz-%grkI?(M%?p!4ryDJT}CjQBX2Imcs$bBuC55jzlXPE24!3fk3yiB~fi`NRHM7 zTRN4rnP$1frNQh7F2oZpalwDMw%_C~HUgI~i%f$AoJa`VEP%Pd=Y+|eZ+jtqQ|}8G z{I(bCZ*p-mGq}aF{!f{gwq(7tIQ`nRvc=c7hj_AH7s#4A%rUtDflv%!&>TFY`^Wt_ z;dykO(g_31t}Dp8%1Vz7DW3hPJt~KgCrqTR7CJzMiLpWRO+$mJ6rD?Z^6Y=5VU(OR zf^Vj29!6iGMP!hki0oc!Tu;C?a3!d zZIiawkLNCCVAegpdGM-IM<~Ih{Q`BUDL;#T8f~e8U= znKaSr@HVr|_=9VoLy?QkL4uqut=?rS)^yaUMX@E&EKAFOs&)OPBgnz@UZ(g^^a2{m zo6@M^4j%n3>OZwox?JP)1{@KZ4Z}X~EO21M=pibS;HH z(<`ns%n&BjkQ+zG&=_z!Za`ADE};Di)~0XyPu7OY+ccW(dLGo+-J)FNOU+r5<_hel z*FmR6MjarkWek@C-SUOc z#5mps2PgoYr=nh*%CBam1=O2Qi2&T zS#`$FhMV$<)Se>N)?5**$ij@8j_)sh^|9>1MqviOxMthqW@mBd2OwUl!gJ@1ee8@a zafNRy#|#qO){pAb@k(eOIqi}3HT98o_%SPCRn%Fq<0tX^q>kp3pX9DKW#W58pVZr; zz_4S<-P2aSrN!yFQ#Vt)R~>M^d%`%cBwj_=5BAzlb`i~zfSh!JVu5ze2Gy}J`YUe* zP(td}Fi3e)?^>m`j!yCpa&Ob3LP5@G#@X3o~qt z8zK!y>0Orsv;2Um-0B?Lc_nvL(OF_CQK5NAVH7kp9?<)q8uM(xP_7)~(9u*r7jE){ z9&^jdVtcQg{-fUD+MuR*&Fhvf((#SAy3|MTZswAJB>8t?A-Y(p<;ztq69i+C3W*OZ zNJe);Xo#h+Pg&P7#_n>3Dz_9hxM$g8`!Z+LUNB)ne^(*VlwPnb zdVp;UY{}Q0y*HVq1SZd2>qNRYi@}EsgU$(w`?K`x#%JdBUY@h ztFn*n>Ki`%Fi*WAa_utRl^=#r^6zW$RnmWZm3>HmW3n~ioEcx|2=L^eAPPF!#DOMRGqcnzA zyA`-cnvT%#@)fHs4nNp*=K$#xt-NQzo}!W&gw(^{>SO!=9L^q$v%cfYU1RaRwLz!RlrWx|6L0j81L~ZDB+@?P4i>S1# zQ^Un&}zIZ)#d4{8=?luH-qYGf&OQrl^v2xq&o;9 zHFv6Xhg2I^@G4tH0X@)~cVWuaK|P6XLBGuBa{{t7ozU`TuB)4e6?09>2eqB+589iC z9(PsyE}4J#O%~0mYwh!e&Zpu|B}13gE4$|HKhiY`oG-c1<2=ya*Bw# W>@@nGqFV38pDza8jaEb5llT|1^e->~ diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/es/mondial-relay.png b/Packlink/Resources/views/backend/_resources/images/carriers/es/mondial-relay.png deleted file mode 100644 index 7613418a45b9eed2f3d374599d8d832dbb3fde3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2339 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 Uj?vLa55EF{b2{%>cZQhoFXtN!#sB~S diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/es/seur.png b/Packlink/Resources/views/backend/_resources/images/carriers/es/seur.png deleted file mode 100644 index 70e3299e9251745d796741c2f44403709f12c47d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5119 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 diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/es/spring.png b/Packlink/Resources/views/backend/_resources/images/carriers/es/spring.png deleted file mode 100644 index ec32f8f7bdcc74a8329741e97f23b45cd6deeaf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6832 zcmV;h8c*ekP)StO&>uS)ve< z0AYj>5AR{$W90N^4L=L-RlQUJ&DC0@ZjPh;=*jPLSYvv5M~MFBAl0-BNIsH15C~g000{K(ZT*W zKal6<?_01!^k@7iDG<<3=fuAC~28EsPoqkpK{9 zG%|Vj005J}`Hw&=0RYXHq~ibpyyzHQsFW8>#s~laM4*8xut5h5!4#~(4xGUqyucR% zVFpA%3?#rj5JCpzfE)^;7?wd9RKPme1hudO8lVxH;SjXJF*pt9;1XPc>u?taU>Kgl z7`%oF1VP9M6Ja4bh!J9r*dopd7nzO(B4J20l7OTj>4+3jBE`sZqynizYLQ(?Bl0bB z6giDtK>Co|$RIL`{EECsF_eL_Q3KQhbwIhO9~z3rpmWi5G!I>XmZEFX8nhlgfVQHi z(M#xcbO3#dj$?q)F%D*o*1Pf{>6$SWH+$s3q(pv=X`qR|$iJF~TPzlc-O$C3+J1#CT#lv5;6stS0Uu z9wDA3UMCI{Uz12A4#|?_P6{CkNG+sOq(0IRX`DyT~9-sA|ffUF>w zk++Z!kWZ5P$;0Hg6gtI-;!FvmBvPc55=u2?Kjj3apE5$3psG>Lsh-pbs)#zDT1jo7 zc2F-(3)vyY4>O^>2$gY-Gd%Qm(Z8eYv>2*=jns=cMJ`N z4THx>VkjAF8G9M07`GWOnM|ey)0dgZR4~^v8<}UA514ONSSt1^d=-((5|uiYR+WC0 z=c-gyb5%dpd8!Lkt5pxHURHgkMpd&=fR^vEcAI*_=wwAG2sV%zY%w@v@XU~7=xdm1xY6*0;iwVIXu6TaXrs|dqbIl~?uTdNHFy_3W~^@< zVyraYW!!5#VPa`A+oZ&##pJ#z&6I1JX1dX|({#+t$SmBf*sRIyjyctwYo1}g*}U8Q zjfJH}oW)9uHjBrW+LnCF1(r>g_pF#!K2~{F^;XxcN!DEJEbDF7S8PxlSDOr*I-AS3 zsI8l=#CDr)-xT5$k15hA^;2%zG3@;83hbKf2JJcaVfH2VZT8O{%p4LO);n}Nd~$Sk z%yw*Wyz8XlG{dRHsl(}4XB%gsbDi@w7p6;)%MzD%mlsoQr;4X;pL)xc%+^yMd)ZNTI#eJ*$O)i@o$z8)e??LqN_gLa_%;TM>o2SC_kmoO6c3xRt`@J4d zvz#WL)-Y|z+r(Soy~}%GIzByR`p)SCKE^%*pL(B%zNWq+-#xw~e%5}Oeh2)X`#bu} z{g3#+;d$~F@lFL`0l@*~0lk45fwKc^10MvL1f>Tx1&sx}1}_Xg6+#RN4Ot&@lW)Km z@*DYMGu&q^n$Z=?2%QyL8~QNJCQKgI5srq>2;UHXZ>IT7>CCnWh~P(Th`1kV8JQRP zeH1AwGO8}>QM6NZadh`A)~w`N`)9q5@sFvDxjWlxwsLl7tZHmhY-8-3xPZ8-xPf?w z_(k!T5_A(J3GIpG#Ms0=iQ{tu=WLoYoaCBRmULsT<=mpV7v|~C%bs^USv6UZd^m-e z5|^?+<%1wXP%juy<)>~<9TW0|n}ttBzM_qyQL(qUN<5P0omQ3hINdvaL;7fjPeygd zGYL;pD|wL_lDQ-EO;$wK-mK5raoH_7l$?~Dqf!lNmb5F^Ft;eTPi8AClMUo~=55Lw zlZVRpxOiFd;3B_8yA~shQx|tGF!j;$toK>JuS&gYLDkTP@C~gS@r~shUu{a>bfJ1`^^VQ7&C1OKHDNXF zTgC{M|V%fo{xK_dk6MK@9S!GZ*1JJzrV5xZBjOk9!NTH<(q(S+MDf~ zceQX@Dh|Ry<-sT4rhI$jQ0Sq~!`#Eo-%($2E^vo}is5J@NVEf|KK?WT&2;PCq@=ncR8zO#GQ^T~S@VXG71P zKNocFOt)Y6$@AXlk6rM*aP%VgV%sIRORYVwJx6|U{ozQjTW{-S_si{9Jg#)~P3t?+ z@6&(!YQWWV*Z9{iU7vZq@5byKw{9lg9JnRA_4s!7?H6|n?o8ZWdXIRo{Jz@#>IeD{ z>VLHUv1Pz*;P_y`V9&!@5AO~Mho1hF|I>%z(nrik)gwkDjgOrl9~%uCz4Bzvli{bb zrxVZ0epdf^>vOB;-~HnIOV3#R*zgPai_gEVd8zYq@2jb=I>#f&AH2?aJ@Kaet zy{D4^000SaNLh0L01FcU01FcV0GgZ_000m7Nklz>*B(rR_? zN?IX=B!sjp$w(ZMc4vWLj9r8zuHeL^3Wt;{PMoqy?21inY*!oy+lfyg1{E$JDT6P- zAso_PlC3}l2qTFIi9Z5U)ct>^I`ZTU%4v z^H5LS@=H|tju#HK&KiA^*+Y*|lI_7LIDx>FkxtYzQPjv-@d`$ZmlOEaI8%c2O1o72 zAFG(H#sz(~GirvKnw#`@8fs@}SA})*SAi z87_SngXJ5@BtJs@KK9S!&R#=gcw{} zyrV`_6>x&8A`VO#fgUMZ%wXjv2Fu??HZhAJQTL3R#QlP6_sJeFVMoq^iX(OKp2 z{-rp3_?D%;pQkD~i1X#QK-B`U1%NGxRg8rYkAaGf^jEerUUC81VeIzbH$(y&JBa9jzC;St zoTdWe?T^c;ff%mSDX95Z0jo#=YGI^w1%1_5Gg7&hbjhN@TIT$W)rmyB| zhAS^6Q(XU;(d>OmGLLRbU7dNmpqev(MZd~uW^;LPkR%~^pdN?;V|JS7{)NuYuEuu+)XvT> zqv}=~mrhh=cjIE1r|419-P7!Z#!e=u#-iH zzrwtp@69frc>V7JlJ{-v*naIf57jxBK)J$bhRW=Vr|3@+0i$oOaFS(s%RYsvZpuq? z4y-YXNCY+l9Z4;of(POW8pACP-eB(WAF}AxuTnMmbV}9TwY77{ZNKX7NS?#nUwm+D zeI2939?Ki`{FcvuE&dP!7I10w#3PXI0jtq*EeI3@1O*eRjGXj~kw|ilfCnVN7)$lY zf7AHtmzjP1p+*x5L^bUJ#M!v&LS9#K7?c^@ZZhG3sBxmxkBwuJE%1f1Y*b z2c4bW_2(Q^KjD{&hI2~7!>70xs;3clAeF0-s%BIYNX5mNnJq}&Ch*Ikcs6FvyMM!} zRSJAvQ=nF2X^td2Ru{hDyK!cnc!b9NUoy$`$?HO=Kk4i``v&ZcLEXN6yQp&u1xs;o zH18pyc`=@PFQ6kYBE|D@M}LSOe;BnHbo?;E?vEgqE6{;m$Z3lqr@xU?A&V5~T+ztD zVW}S2$>P0tkW8OgZ>|2UySsbAIRP~YLUGP5615bCZ%hHz0x8Q|Ezt2d(9wNJq81G& zAsB?oqe$^w$PD5J{wtF3LjP6eH}VF=Ux}4M0r-e`?srs-?B#-Ae}+W5zbOdp!(Cn5 zYtDu3Z$Rt8QWW;R3DA75KYH(heeG_TcpY!v4cM2zj#MngRIMV|cRL!4=k@X_0-FnE zPxI1L-z1b##mriPscAq3%0>>b`1#M`*~unrg9pzAr~=Fub@+BL4&^1E+Ea~mtGYOu z8iJ{8##`|@yfydYU;G99)!)W%z8kOM1BiNYbQPcL;v7Ki-cDo_5lpl|q9fp<5}jnh zR5wy~b32K}SAh}A2luhyg|DDUTYG!Q7taP%{|sNR78E}igT$17?-dBD%NZ^M;gJUk zdmh4wA}FGQb%I(8VV2m7!YHUHR$(&hbN@5%;_(B^c=DF}nHZ14Rjfvf7ZQcD8oO&M zNZBm>##X{tccMDMjH8{5%vdY^3$MGatE=-zEiJ7tOjoEPP-)a+LU1w3{k?Vk@^B+b z-%^|ixMcouE}GLD85I|j4IEqdFXe@vc~qB7@cS$GF}r*M6b2_s_}QLII5|>IL)8$e z3l0*7hEH$3j`qy@%i^Wj%OS< zfBz;Pe{or?7==$hd_Dhp>wR2M+s~z6|0pNN%JD=IQU0{)S?)+ZK{}h@mA*P|edG`M z|7HI`%?nCuv}FF(r36@Ps7jvYJZY}~l< z#I%%Dph&QJJsJlDkj!xFhNror@eububt(6DZ{)H?hv*$EXWL5`^4^vExZ|3wY&&ov zpLyaMZh!1rZeH^&y<_EkVD10cu!Re~3rkzXcow!Fm!vu=^g; z+ioLy`KKw`^f}CorRd~v-bK(bRuR^Kg^Huk@W#bAnIH%^01r*qELCK%<2-0?dcI}# z+~fS&mCy6Z)-GzR2iSXT4!?SJA>n8RAKvg3O>9XF!$k_;a`+i;kX*i(tt(i4ZTcjkZ3PD23?q zZiF{ot-k_k#fv3XVgS+BOJ{u;gA*eaOaw_1#!{9Hz;m1&En_lmI5Av8=nTb)fF(73 zwBK?Mx3_GgX-*Fh?Onx94}K6I3!*qH5I`8`333rYVRRPI5NyZX7Fr9zSpq))_W5yiU{HV{{x`!augR(LY{B z_bZF(8!zKeRzJtHJ@xE7w1_qHj&j-j!|dvbf}k)kRF#Z#c%+6O>{-c$RVP`Ob7-AR zm1lBstCKiaXwXm~h=4jNV_@mE2<&cY+5F0Mwf?Fws(8_^axrFAupYaPEa1gAW>Z@_ z!9S$7ky?C^V&Agw_#A%td^2}!y_zE5a>c^e_+07<_MDi@ea~LX$j(iu3iHZGxTWc7 zW|xd`>#C>N^1^yP-u^!Rdi5_^pXtL59zrKaBT1bY#tj_8jgO#{5%i8}TTW?j??@=}+R#APF-`7LR*&U(Vledk>%3)WNOmo@Q40 z7?s7A$uK&v#D@dD)g0`bNmWsrOY4uKHu6nhAFANxfjYuaSW?r+(wbq$(~+Kj?sz?! zz+-vUNop!f(Be6`p<}qwA*7@RDV>8GH~~S3l+Q;;N3etakO>)`yN=i1^9Aty@3*z3 zZl2E0zXH9AAu!eWb`oP86^S&-M994I5th^rGns{n^we682g<_AAr@B-fkHNj%G0Pa zzigC-(osYqurN9q85vPnUw0HN1R;bYlh8j9M;3w`9z^>FW8-9S1N*^xNLHDwy@(^J zkE5QyE8+Veo$e8p3UW*_WWAXbXO5FdDp$;Zjhj~Nrrgha( zh9%Ug5_VKojY3a#kg-!0R`P{Griz0a86^z`oQGsWCTo}Sdg?ZU@>%;mBe!hcylH4! zL-jo4tjZz8BkRwC5JCgXYWnzU>R|>lrKGb{S*4uf(L78ocptkyg)nozZ`=!@P9vZ; zuD%ukRVxq*8X5=%lMWc0eF;6A{)%+nlKq1IMQdxz-f5puX=!Ou5pzhzBV9BP!U#+@ z3&kd+zH9^=M1NdeJZ<63l~!^RCy}!r#^sgxdM=Dh)wyF~^u1_CMu@DKU&l!;qx20NloXvdd8BM6DGJyDFlO+qwC5&BaFJ@(?wmk(+YWbF*g4gJT zTv8-D$>okYjifNQ?ZX1;v=T*2p+Gu_+@|GioLqMk+3LC5jOwRSt($k9?acp~%~HA0 zViJ4OB@LIkoa7bwTaiz$xk}zt5>(@KU@nE{PJ@|q-s4DUO0p%t{WXl7dP0ziESbuB z`YySFfs22Su(bNSM%@?NQY{DHiW=1!g(^bmFwX^vs>?FT8WQ2)RQE|?d0Gmy*P3tj zDQx}8r|lwW0Dzeq{e}yq$P1@{#YaWh(B zKUJY*x&oLv(AGp--h#=5IG13!@e2A^zL$wP%hI-_>Tcu0@3ggU-p|`G{4;(<-P*k^ewE7Y%2lk)|In{ZS!fN1Ds_@h{$^w{9^1dj6 zB3VnOasekd+{nnH^@L?JPPk;*oyG+}nc`a|N2YQCy{m3yxbbqr;>vL?D*Kk8_nR<# zsP(F=GE9TvpOuwTcSQZ-hsJ7G-7r?!K*{J4)IW6zH5b^%hAP*Vjw=9bfxsexGG4cm zzLoD|bm2N|qBNt)lDkCYJH`fwQ*EhtetUW>tyhW7Y^{CuF%~}kuefB~N}_KPqUI#i zMQ|llB(PXh%FyD?3@p2riJ2FmUUCFK`Asoqi`w8=TU%R(X*m3|wp!|TtC!p|RKM{< zC4Dbb_tGy;1)EC%oKjx4K!TBZYZzL*nUO^su!$1z68psSzGaN}BNt}JQ!Opi`ia1^ z`fyr%N9S@y9`q*%SJu7wQ|kWb=a}q7)bJF8b@*f|8yKH;F{AU>FgC9Vmn=cWjEXT2 z7-P0rr@M@xsZ^`u92jT)G0KjP&L&meqOitfCny@}!A}pPCP7#_gG~7>)GvzKD@Be0 zPm0J-lgZ?hS6+F=Irj+VTLKlJyL)?uwf06;y#bL6fl^=+K~z|U?U;LT71bTbKYMS`kOB&|@|Z&Il1Q~OygQ(~+8YWw z$~e=GlLHD!#Rrs@#y-YDk;z7#@%_M91?3?~2sxRmRZ*0X+}2%*3L33UT1?ppN@pCw z3JN$O_wqPBmCCqV0+K)EnMGa9w0d~wPV`OzDu~>{J*HuZ{pL&x7fQ%0uYPESX;I3SaNJ&dl#tCPp1g=OnaLVQ*8!n)(M(dfM|bHJk#EI zg8S%#<_|tN)ZE;B(foJeZ!&Xim^t~*> zGUqntJ4EnX_`{*iimS0k>Pe zyQLd@7!{W9I-Y4i3528fk=W7n!t?gLn)XcFp<|hs0FMCsfx4jH^4)BDiTIBJ?gB0j zaaXpr_9{!N2BrPa2d)Et9`d=&^4;g7IW?T(6vp+o|H|V4vEqce7?{7VdOf4Zi~(S1 z+0~4!u0*vRW$>KKDHt)FA=l2}u)l{NJbWwXRxQQI%Of6-v$kp-i9{k-DoE)v3DkL} z{i$c#&Z`NlUk)*&h^B)D>AaYe!><82CtB$Zx3Bk1`^Jc%DPR)Eq(6$cvMqR+V_IAdDp z)w}JDH)w5bg-j01!t&h`UAJFX^#jV4VKjKdZBs|nc5SP$eAfsq+pF}qK}T-BCOR=P zLfwL*vQw>MIhlwI1pNf~4e$NypW^sJApHSl;yjZ zgbjHu@B2G1nmYA?`YrYM{Br&;_`|YCv&LX^>NjB&A3eQ^BfIx*a0JMF)pFSf;F!seY3@w|>xcX{Nn>3bvFQ$MFK^NV8GyMk)C=o(jA0|#2CE2`Y z`R*3WcNYR5M+XpvXW9#a+x5V&0e;+5n?2*beP3juzsj1$;lEsT@|LhQ>pIb%2*+l>t@i-%^D;ZigH!J9>C!WB*@PdHi z^DuF*L|fW3?FT&5o}wp|q-(T&q|4y|+b2vgfcte_h2^`0$%p_D|B4gOg&@KzEZ-eS zN6PB0%liU9&$Pz@ygcaQxM$icB0PVlW2Kerxn&WPQl@|s$8k7x_%JVTsiV4TJ$I~F zo^w=TLC+jC5XW%9CAfh`6Q7WT*&U+~hFI;z&K zqkPGdPDFvAD?@^&)9HJ<5%jmfdy%>nU|YVs6QHfNS9o9myYq~rmjkcr?;&`lu}AHZr!Si3KOcKzFsvqH>>H>r>oM^(!2lLml!AG)8#@%2$2LD9LM3* zQ%>RHDO0(0+B9C+xRI4ltY*;Q!8ndXdwctRQp(>SZ^)cz2q7FYCyXxuq?8kd5baXR zxVBdUe*$daa-c8p8E~y`cNv-JeMd@})O^{UT`6_7VHi!oqrd_wWiKH_1DWI6FyMJ9 zr2}*oRSzJE7WUwQ1I(Op1uIssV(^e5fuQ$GDSvmOh50(rBCL^8`k}fca0~h_KuS4T z2;mrpQB_k@^PUjG2BrW7Qpy`cJZUofjT7cqNjXqovh9 zsRa$8ObFpr=DKq*br}N?LKtL@aL?;+C&ZUB3}dwrVs5DYWFf?DLWpz2 zq}|^9hlPFWsi*!I1Vt&eO)2FnrFMs^2LSI1A9uh*_8SrYHFS7i9 z4Xic{<7uVTYrxssudJq~CVVo9NhuwjBOfGlQA2HQZC$hvDP@I@=;?qXrK|($gb-<9 z5pwjy=AYguGIt3p$!vbFNGU4-{tfR+TZXYHMlApU002ovPDHLkV1hSqN*DkD diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/es/tnt.png b/Packlink/Resources/views/backend/_resources/images/carriers/es/tnt.png deleted file mode 100644 index e6005b2978f9dfa284c09d0f63695e3930f5f0bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2716 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 diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/fr/bartolini.png b/Packlink/Resources/views/backend/_resources/images/carriers/fr/bartolini.png deleted file mode 100644 index 15dc5952573c51a3f2fa9050ef2482a051849f78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1350 zcmV-M1-bf(P)(85A1#X`YC3#|kru@j88BBrrX)Yd;>rx-ySEwm661g*4C&_Y2FA_+<);o=3w zpy2zxyIEh7yIe3Px4Zd1IQH)C+{>}w&b;|%=Vehe4|vtsxy~JqMna6O-#?t4i+LB# z6QR4@;i+hxKJafte`_lPGAk}BDa^xcd4kDd1Kr?WG>UbaCYw-$h$)~*9p?OMAI zM$P+oE99mDE&KOGU$5S*YS-w<{VrOA?YMAcwuaVpL;_)GOQ+zyhJh5dyWw{RH{ezM%Nd_U3jJIj$wh10r$*wI} zUw>wh+|;k3BsaVatb64`WN62lInsCEXS(vx1jFk~m%wnG)-GR&3MtW*3z|?01Uxfc z+0#9Jn08t0`a9Pu7AHh#0mb=iAxxxY&?r;X>Naj71B&Qr8)2cz^p9W&P!n2nZ$3jqSu)1zF`IAJXW;>yE z+a;yzZ??Zf+X)2`DnbPjDu_@)vZYi+IDD|?1$8P@VON6){YRiL%jw2i04*y*XL}Ky z;Lm#dh}KXc-D@a)wCz1dqoJ!e;ucHR)b^fk-+@3|3FW$Q59iR8n`Ou9TAJK?nDgPY zEhz3&0ixKywA9L(cYlW-rErYUpVUtJ)DQ}BBqX$2(ve`jvyjQdZ5pg|m(KV$O>D7a ztmFCxf8NF*ru{^>Cxu6Dg=c?>G(a%6bU>`Xd(FSMF?r~JLh<4klOk)PhS=d!#)%iz zcjV$s6p!Tixm1X^v4+i?{1{|~H_PhYVqxAI$IPQcPqeY{0e}eoNBqiv^I_5mAXJWj z8uUa>%|Zv`(7AlaHcz&V5w`K}u)_h;CKucJj9uRM*_(KA-oWLy2PR zrX^Y5T^OIq&NdNR1zg}zHdsv;Qfy6wOl%;MJ)*3y5CXvvY1%cM2cnpR1jufNCYMMd zf0&0Gh9em;bCFr|x09+vQx$T#_})|8#rHC0ZLtGB?ET?1bM4!qQAw7*9SehgdY=4Oibin@7|+%lS~N>L~q@Ei+~WVmA`jfz$^oydhBcG)rH zV?(Gk`4WP{12;*>^^4wnsYLO8^F}07@g^!trzG!MOBJEE{y`9=K$7jQHZLs~3OQ%z z8@6nW=dn;5uFU}L$-ERHMoKpXRVdTF+(?owk}Z-gf(VrkO`{I2HB1MK&{^tG3hhZi zlK-oiLast??ZTXz#4<#vn#2@xMW`S`1raKUP(g$)RQwTO0Hl0=&aDA08~^|S07*qo IM6N<$f{`bP>Hq)$ diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/fr/chronopost.png b/Packlink/Resources/views/backend/_resources/images/carriers/fr/chronopost.png deleted file mode 100644 index 003c409afc83ed88b1b4d6e312ff5caf1c98113e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2550 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 JpdRLy@E=`~-=hEk diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/fr/dhl.png b/Packlink/Resources/views/backend/_resources/images/carriers/fr/dhl.png deleted file mode 100644 index 30151275ba0b97ba942daec6193530773d04ac1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3282 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 diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/fr/dpd.png b/Packlink/Resources/views/backend/_resources/images/carriers/fr/dpd.png deleted file mode 100644 index 8ab6aa70a89bbc448f32edf0854351b6021b21b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2201 zcmaJ@dpy&7A745}sabg*>FQ_B;Rw6gtSxifOe@2gl}kx$`(fCAv;DN8D3?caGMA_$ zA|6gog^JK}>D7foq>JiAsdJ-GD6FR%Ce{ds>r-_Ps&`lb1J zc`RPIVj%*7Sj^hM;ONH9x|d*}r~8(KAVzh=a@gG;_Ju-VIZp~ATm{fh5MYUTp&$q3 z31XtIgN_KqTtLY6hyB@}R6Zoa@MbU=g-D`fBM^?x3JH%N0m8seFjOd}p+{BCXh0~S zq5Vi~99u#M!-N}RrJ!%D7ndI!!KVn&&Q5@%f~pe`fiMqHh$6)@s)C08q)XM!XST6u z;1dLnprJpT@@M-1bVv#UBn-}uk8{8Q4tNaSo=7H>Z2zsa0K_vMqE0%pJldfP`1y6#-V{kJm%>vo%{|^<3 zzM^F?2mIUb{}h&SV>CBviT-OgTPy5fmMvOAN6$Gel(k?ctf9GSEZ zPjO({J1}Os42T~s0>$twSMWEN^iA$eBZwrr$P7>_+yx4lQb+`RN|-AAwim)T^}cWg z-}YkvO)gev20L@C|8>l>Te{wvnSO0r-QsK8gJNB;OLa|+32ur+Am$md7_MB!!`Fd9 zk-ng5yoV=|_roU7NI%c-4|OD?0?h~9m?}dnWOsvUe5noQX^Uw%d0$wE!><{pk2W^= zpmufZJP`|A7HNLhHckA8jjr{f$zX?iwXWcm|^`=l&eXh`|^Lp>Q z0`i`w_uA>eOixSU0{(J4(U3Y?Lro}bz8P$-@ye`Ix;bN!8lwt9|EAWi?q=kA8lv@JUmhRe#yQV{vkZ0r`<$|RoY z?_hKJ^3;;Xl}6o#bMR+E=Ui#dX&vfHuedPe=D(=y;geC7OZo6l14J=7%!rz7WRt4O zPj*>5sr1e+&08A;dvtqEE8BYCTA$wSw7H+2YD_C}I)1ldU!dZ(ZEb`5n|({}#URZ`+}8-ylBy*~F_-wegF5{`<j7N$%W2AS=? z6M4qJz9m*p3+uA;iP9R%U3^@^zRSE$ABOvF{w23Qf2SwigOT$SYt06WqIo4}hPGnJ zi;^4J7DYKaV?$y2N;}fi^)ZcNLY0aJC{JVyge|F`K_MKCT=8WiTk6$wP+P)U$4L+@sYLc2- zem`1ue?2vS1)8#Imvu~vi~8jKE#?&~EVfM{KboZInf;+wRv`WP0Xc==T^@I1{n*&v z%PbZ44<@|XThYeNTd$B?`sRBwSxx^SwwPVAC50|X;WY--q$SNwdNgp5S=w;FV5zAl zBQ!asy}735P*v9DOr%TN5*6f}el$4YbY2{4)tcS|2cFl5HUvd)+aaEU`u8F-_IDotjkpy<;qz|2Up&{M>PQ7B?m9*1uys zvLm0i_vNW=j@?(3~3X3re1x%f3%z{33`hVPij}{cjTfv QXMPq~?p};aw;hT90r&x}5C8xG diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/fr/gls.png b/Packlink/Resources/views/backend/_resources/images/carriers/fr/gls.png deleted file mode 100644 index 4300a2fcce026e5e0e681d7880d7ec6485b5cd32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2128 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 N002ovPDHLkV1f!r0YLx& diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/fr/mondial-relay.png b/Packlink/Resources/views/backend/_resources/images/carriers/fr/mondial-relay.png deleted file mode 100644 index 7613418a45b9eed2f3d374599d8d832dbb3fde3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2339 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 Uj?vLa55EF{b2{%>cZQhoFXtN!#sB~S diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/fr/seur.png b/Packlink/Resources/views/backend/_resources/images/carriers/fr/seur.png deleted file mode 100644 index 70e3299e9251745d796741c2f44403709f12c47d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5119 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 diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/fr/spring.png b/Packlink/Resources/views/backend/_resources/images/carriers/fr/spring.png deleted file mode 100644 index ec32f8f7bdcc74a8329741e97f23b45cd6deeaf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6832 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 KNU!sa-1i?(=4D_uXoxyaX5u*} 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 IM6N<$f{`bP>Hq)$ diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/it/chronopost.png b/Packlink/Resources/views/backend/_resources/images/carriers/it/chronopost.png deleted file mode 100644 index 003c409afc83ed88b1b4d6e312ff5caf1c98113e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2550 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 JpdRLy@E=`~-=hEk diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/it/dpd.png b/Packlink/Resources/views/backend/_resources/images/carriers/it/dpd.png deleted file mode 100644 index 8ab6aa70a89bbc448f32edf0854351b6021b21b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2201 zcmaJ@dpy&7A745}sabg*>FQ_B;Rw6gtSxifOe@2gl}kx$`(fCAv;DN8D3?caGMA_$ zA|6gog^JK}>D7foq>JiAsdJ-GD6FR%Ce{ds>r-_Ps&`lb1J zc`RPIVj%*7Sj^hM;ONH9x|d*}r~8(KAVzh=a@gG;_Ju-VIZp~ATm{fh5MYUTp&$q3 z31XtIgN_KqTtLY6hyB@}R6Zoa@MbU=g-D`fBM^?x3JH%N0m8seFjOd}p+{BCXh0~S zq5Vi~99u#M!-N}RrJ!%D7ndI!!KVn&&Q5@%f~pe`fiMqHh$6)@s)C08q)XM!XST6u z;1dLnprJpT@@M-1bVv#UBn-}uk8{8Q4tNaSo=7H>Z2zsa0K_vMqE0%pJldfP`1y6#-V{kJm%>vo%{|^<3 zzM^F?2mIUb{}h&SV>CBviT-OgTPy5fmMvOAN6$Gel(k?ctf9GSEZ zPjO({J1}Os42T~s0>$twSMWEN^iA$eBZwrr$P7>_+yx4lQb+`RN|-AAwim)T^}cWg z-}YkvO)gev20L@C|8>l>Te{wvnSO0r-QsK8gJNB;OLa|+32ur+Am$md7_MB!!`Fd9 zk-ng5yoV=|_roU7NI%c-4|OD?0?h~9m?}dnWOsvUe5noQX^Uw%d0$wE!><{pk2W^= zpmufZJP`|A7HNLhHckA8jjr{f$zX?iwXWcm|^`=l&eXh`|^Lp>Q z0`i`w_uA>eOixSU0{(J4(U3Y?Lro}bz8P$-@ye`Ix;bN!8lwt9|EAWi?q=kA8lv@JUmhRe#yQV{vkZ0r`<$|RoY z?_hKJ^3;;Xl}6o#bMR+E=Ui#dX&vfHuedPe=D(=y;geC7OZo6l14J=7%!rz7WRt4O zPj*>5sr1e+&08A;dvtqEE8BYCTA$wSw7H+2YD_C}I)1ldU!dZ(ZEb`5n|({}#URZ`+}8-ylBy*~F_-wegF5{`<j7N$%W2AS=? z6M4qJz9m*p3+uA;iP9R%U3^@^zRSE$ABOvF{w23Qf2SwigOT$SYt06WqIo4}hPGnJ zi;^4J7DYKaV?$y2N;}fi^)ZcNLY0aJC{JVyge|F`K_MKCT=8WiTk6$wP+P)U$4L+@sYLc2- zem`1ue?2vS1)8#Imvu~vi~8jKE#?&~EVfM{KboZInf;+wRv`WP0Xc==T^@I1{n*&v z%PbZ44<@|XThYeNTd$B?`sRBwSxx^SwwPVAC50|X;WY--q$SNwdNgp5S=w;FV5zAl zBQ!asy}735P*v9DOr%TN5*6f}el$4YbY2{4)tcS|2cFl5HUvd)+aaEU`u8F-_IDotjkpy<;qz|2Up&{M>PQ7B?m9*1uys zvLm0i_vNW=j@?(3~3X3re1x%f3%z{33`hVPij}{cjTfv QXMPq~?p};aw;hT90r&x}5C8xG diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/it/gls.png b/Packlink/Resources/views/backend/_resources/images/carriers/it/gls.png deleted file mode 100644 index 4300a2fcce026e5e0e681d7880d7ec6485b5cd32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2128 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 x*StO&>uS)ve< z0AYj>5AR{$W90N^4L=L-RlQUJ&DC0@ZjPh;=*jPLSYvv5M~MFBAl0-BNIsH15C~g000{K(ZT*W zKal6<?_01!^k@7iDG<<3=fuAC~28EsPoqkpK{9 zG%|Vj005J}`Hw&=0RYXHq~ibpyyzHQsFW8>#s~laM4*8xut5h5!4#~(4xGUqyucR% zVFpA%3?#rj5JCpzfE)^;7?wd9RKPme1hudO8lVxH;SjXJF*pt9;1XPc>u?taU>Kgl z7`%oF1VP9M6Ja4bh!J9r*dopd7nzO(B4J20l7OTj>4+3jBE`sZqynizYLQ(?Bl0bB z6giDtK>Co|$RIL`{EECsF_eL_Q3KQhbwIhO9~z3rpmWi5G!I>XmZEFX8nhlgfVQHi z(M#xcbO3#dj$?q)F%D*o*1Pf{>6$SWH+$s3q(pv=X`qR|$iJF~TPzlc-O$C3+J1#CT#lv5;6stS0Uu z9wDA3UMCI{Uz12A4#|?_P6{CkNG+sOq(0IRX`DyT~9-sA|ffUF>w zk++Z!kWZ5P$;0Hg6gtI-;!FvmBvPc55=u2?Kjj3apE5$3psG>Lsh-pbs)#zDT1jo7 zc2F-(3)vyY4>O^>2$gY-Gd%Qm(Z8eYv>2*=jns=cMJ`N z4THx>VkjAF8G9M07`GWOnM|ey)0dgZR4~^v8<}UA514ONSSt1^d=-((5|uiYR+WC0 z=c-gyb5%dpd8!Lkt5pxHURHgkMpd&=fR^vEcAI*_=wwAG2sV%zY%w@v@XU~7=xdm1xY6*0;iwVIXu6TaXrs|dqbIl~?uTdNHFy_3W~^@< zVyraYW!!5#VPa`A+oZ&##pJ#z&6I1JX1dX|({#+t$SmBf*sRIyjyctwYo1}g*}U8Q zjfJH}oW)9uHjBrW+LnCF1(r>g_pF#!K2~{F^;XxcN!DEJEbDF7S8PxlSDOr*I-AS3 zsI8l=#CDr)-xT5$k15hA^;2%zG3@;83hbKf2JJcaVfH2VZT8O{%p4LO);n}Nd~$Sk z%yw*Wyz8XlG{dRHsl(}4XB%gsbDi@w7p6;)%MzD%mlsoQr;4X;pL)xc%+^yMd)ZNTI#eJ*$O)i@o$z8)e??LqN_gLa_%;TM>o2SC_kmoO6c3xRt`@J4d zvz#WL)-Y|z+r(Soy~}%GIzByR`p)SCKE^%*pL(B%zNWq+-#xw~e%5}Oeh2)X`#bu} z{g3#+;d$~F@lFL`0l@*~0lk45fwKc^10MvL1f>Tx1&sx}1}_Xg6+#RN4Ot&@lW)Km z@*DYMGu&q^n$Z=?2%QyL8~QNJCQKgI5srq>2;UHXZ>IT7>CCnWh~P(Th`1kV8JQRP zeH1AwGO8}>QM6NZadh`A)~w`N`)9q5@sFvDxjWlxwsLl7tZHmhY-8-3xPZ8-xPf?w z_(k!T5_A(J3GIpG#Ms0=iQ{tu=WLoYoaCBRmULsT<=mpV7v|~C%bs^USv6UZd^m-e z5|^?+<%1wXP%juy<)>~<9TW0|n}ttBzM_qyQL(qUN<5P0omQ3hINdvaL;7fjPeygd zGYL;pD|wL_lDQ-EO;$wK-mK5raoH_7l$?~Dqf!lNmb5F^Ft;eTPi8AClMUo~=55Lw zlZVRpxOiFd;3B_8yA~shQx|tGF!j;$toK>JuS&gYLDkTP@C~gS@r~shUu{a>bfJ1`^^VQ7&C1OKHDNXF zTgC{M|V%fo{xK_dk6MK@9S!GZ*1JJzrV5xZBjOk9!NTH<(q(S+MDf~ zceQX@Dh|Ry<-sT4rhI$jQ0Sq~!`#Eo-%($2E^vo}is5J@NVEf|KK?WT&2;PCq@=ncR8zO#GQ^T~S@VXG71P zKNocFOt)Y6$@AXlk6rM*aP%VgV%sIRORYVwJx6|U{ozQjTW{-S_si{9Jg#)~P3t?+ z@6&(!YQWWV*Z9{iU7vZq@5byKw{9lg9JnRA_4s!7?H6|n?o8ZWdXIRo{Jz@#>IeD{ z>VLHUv1Pz*;P_y`V9&!@5AO~Mho1hF|I>%z(nrik)gwkDjgOrl9~%uCz4Bzvli{bb zrxVZ0epdf^>vOB;-~HnIOV3#R*zgPai_gEVd8zYq@2jb=I>#f&AH2?aJ@Kaet zy{D4^000SaNLh0L01FcU01FcV0GgZ_000m7Nklz>*B(rR_? zN?IX=B!sjp$w(ZMc4vWLj9r8zuHeL^3Wt;{PMoqy?21inY*!oy+lfyg1{E$JDT6P- zAso_PlC3}l2qTFIi9Z5U)ct>^I`ZTU%4v z^H5LS@=H|tju#HK&KiA^*+Y*|lI_7LIDx>FkxtYzQPjv-@d`$ZmlOEaI8%c2O1o72 zAFG(H#sz(~GirvKnw#`@8fs@}SA})*SAi z87_SngXJ5@BtJs@KK9S!&R#=gcw{} zyrV`_6>x&8A`VO#fgUMZ%wXjv2Fu??HZhAJQTL3R#QlP6_sJeFVMoq^iX(OKp2 z{-rp3_?D%;pQkD~i1X#QK-B`U1%NGxRg8rYkAaGf^jEerUUC81VeIzbH$(y&JBa9jzC;St zoTdWe?T^c;ff%mSDX95Z0jo#=YGI^w1%1_5Gg7&hbjhN@TIT$W)rmyB| zhAS^6Q(XU;(d>OmGLLRbU7dNmpqev(MZd~uW^;LPkR%~^pdN?;V|JS7{)NuYuEuu+)XvT> zqv}=~mrhh=cjIE1r|419-P7!Z#!e=u#-iH zzrwtp@69frc>V7JlJ{-v*naIf57jxBK)J$bhRW=Vr|3@+0i$oOaFS(s%RYsvZpuq? z4y-YXNCY+l9Z4;of(POW8pACP-eB(WAF}AxuTnMmbV}9TwY77{ZNKX7NS?#nUwm+D zeI2939?Ki`{FcvuE&dP!7I10w#3PXI0jtq*EeI3@1O*eRjGXj~kw|ilfCnVN7)$lY zf7AHtmzjP1p+*x5L^bUJ#M!v&LS9#K7?c^@ZZhG3sBxmxkBwuJE%1f1Y*b z2c4bW_2(Q^KjD{&hI2~7!>70xs;3clAeF0-s%BIYNX5mNnJq}&Ch*Ikcs6FvyMM!} zRSJAvQ=nF2X^td2Ru{hDyK!cnc!b9NUoy$`$?HO=Kk4i``v&ZcLEXN6yQp&u1xs;o zH18pyc`=@PFQ6kYBE|D@M}LSOe;BnHbo?;E?vEgqE6{;m$Z3lqr@xU?A&V5~T+ztD zVW}S2$>P0tkW8OgZ>|2UySsbAIRP~YLUGP5615bCZ%hHz0x8Q|Ezt2d(9wNJq81G& zAsB?oqe$^w$PD5J{wtF3LjP6eH}VF=Ux}4M0r-e`?srs-?B#-Ae}+W5zbOdp!(Cn5 zYtDu3Z$Rt8QWW;R3DA75KYH(heeG_TcpY!v4cM2zj#MngRIMV|cRL!4=k@X_0-FnE zPxI1L-z1b##mriPscAq3%0>>b`1#M`*~unrg9pzAr~=Fub@+BL4&^1E+Ea~mtGYOu z8iJ{8##`|@yfydYU;G99)!)W%z8kOM1BiNYbQPcL;v7Ki-cDo_5lpl|q9fp<5}jnh zR5wy~b32K}SAh}A2luhyg|DDUTYG!Q7taP%{|sNR78E}igT$17?-dBD%NZ^M;gJUk zdmh4wA}FGQb%I(8VV2m7!YHUHR$(&hbN@5%;_(B^c=DF}nHZ14Rjfvf7ZQcD8oO&M zNZBm>##X{tccMDMjH8{5%vdY^3$MGatE=-zEiJ7tOjoEPP-)a+LU1w3{k?Vk@^B+b z-%^|ixMcouE}GLD85I|j4IEqdFXe@vc~qB7@cS$GF}r*M6b2_s_}QLII5|>IL)8$e z3l0*7hEH$3j`qy@%i^Wj%OS< zfBz;Pe{or?7==$hd_Dhp>wR2M+s~z6|0pNN%JD=IQU0{)S?)+ZK{}h@mA*P|edG`M z|7HI`%?nCuv}FF(r36@Ps7jvYJZY}~l< z#I%%Dph&QJJsJlDkj!xFhNror@eububt(6DZ{)H?hv*$EXWL5`^4^vExZ|3wY&&ov zpLyaMZh!1rZeH^&y<_EkVD10cu!Re~3rkzXcow!Fm!vu=^g; z+ioLy`KKw`^f}CorRd~v-bK(bRuR^Kg^Huk@W#bAnIH%^01r*qELCK%<2-0?dcI}# z+~fS&mCy6Z)-GzR2iSXT4!?SJA>n8RAKvg3O>9XF!$k_;a`+i;kX*i(tt(i4ZTcjkZ3PD23?q zZiF{ot-k_k#fv3XVgS+BOJ{u;gA*eaOaw_1#!{9Hz;m1&En_lmI5Av8=nTb)fF(73 zwBK?Mx3_GgX-*Fh?Onx94}K6I3!*qH5I`8`333rYVRRPI5NyZX7Fr9zSpq))_W5yiU{HV{{x`!augR(LY{B z_bZF(8!zKeRzJtHJ@xE7w1_qHj&j-j!|dvbf}k)kRF#Z#c%+6O>{-c$RVP`Ob7-AR zm1lBstCKiaXwXm~h=4jNV_@mE2<&cY+5F0Mwf?Fws(8_^axrFAupYaPEa1gAW>Z@_ z!9S$7ky?C^V&Agw_#A%td^2}!y_zE5a>c^e_+07<_MDi@ea~LX$j(iu3iHZGxTWc7 zW|xd`>#C>N^1^yP-u^!Rdi5_^pXtL59zrKaBT1bY#tj_8jgO#{5%i8}TTW?j??@=}+R#APF-`7LR*&U(Vledk>%3)WNOmo@Q40 z7?s7A$uK&v#D@dD)g0`bNmWsrOY4uKHu6nhAFANxfjYuaSW?r+(wbq$(~+Kj?sz?! zz+-vUNop!f(Be6`p<}qwA*7@RDV>8GH~~S3l+Q;;N3etakO>)`yN=i1^9Aty@3*z3 zZl2E0zXH9AAu!eWb`oP86^S&-M994I5th^rGns{n^we682g<_AAr@B-fkHNj%G0Pa zzigC-(osYqurN9q85vPnUw0HN1R;bYlh8j9M;3w`9z^>FW8-9S1N*^xNLHDwy@(^J zkE5QyE8+Veo$e8p3UW*_WWAXbXO5FdDp$;Zjhj~Nrrgha( zh9%Ug5_VKojY3a#kg-!0R`P{Griz0a86^z`oQGsWCTo}Sdg?ZU@>%;mBe!hcylH4! zL-jo4tjZz8BkRwC5JCgXYWnzU>R|>lrKGb{S*4uf(L78ocptkyg)nozZ`=!@P9vZ; zuD%ukRVxq*8X5=%lMWc0eF;6A{)%+nlKq1IMQdxz-f5puX=!Ou5pzhzBV9BP!U#+@ z3&kd+zH9^=M1NdeJZ<63l~!^RCy}!r#^sgxdM=Dh)wyF~^u1_CMu@DKU&l!;qx20NloXvdd8BM6DGJyDFlO+qwC5&BaFJ@(?wmk(+YWbF*g4gJT zTv8-D$>okYjifNQ?ZX1;v=T*2p+Gu_+@|GioLqMk+3LC5jOwRSt($k9?acp~%~HA0 zViJ4OB@LIkoa7bwTaiz$xk}zt5>(@KU@nE{PJ@|q-s4DUO0p%t{WXl7dP0ziESbuB z`YySFfs22Su(bNSM%@?NQY{DHiW=1!g(^bmFwX^vs>?FT8WQ2)RQE|?d0Gmy*P3tj zDQx}8r|lwW0Dzeq{e}yq$P1@{#YaWh(B zKUJY*x&oLv(AGp--h#=5IG13!@e2A^zL$wP%hI-_>Tcu0@3ggU-p|`G{4;(<-P*k^ewE7Y%2lk)|In{ZS!fN1Ds_@h{$^w{9^1dj6 zB3VnOasekd+{nnH^@L?JPPk;*oyG+}nc`a|N2YQCy{m3yxbbqr;>vL?D*Kk8_nR<# zsP(F=GE9TvpOuwTcSQZ-hsJ7G-7r?!K*{J4)IW6zH5b^%hAP*Vjw=9bfxsexGG4cm zzLoD|bm2N|qBNt)lDkCYJH`fwQ*EhtetUW>tyhW7Y^{CuF%~}kuefB~N}_KPqUI#i zMQ|llB(PXh%FyD?3@p2riJ2FmUUCFK`Asoqi`w8=TU%R(X*m3|wp!|TtC!p|RKM{< zC4Dbb_tGy;1)EC%oKjx4K!TBZYZzL*nUO^su!$1z68psSzGaN}BNt}JQ!Opi`ia1^ z`fyr%N9S@y9`q*%SJu7wQ|kWb=a}q7)bJF8b@*f|8yKH;F{AU>FgC9Vmn=cWjEXT2 z7-P0rr@M@xsZ^`u92jT)G0KjP&L&meqOitfCny@}!A}pPCP7#_gG~7>)GvzKD@Be0 zPm0J-lgZ?hS6+F=Irj+VTLKlJyL)?uwf06;y#bL6fl^=+;6Nal!NNc$>KY+n1`Px8wI;zy z94tU*>^{N;ypFheQ;&pFQ8b9X9oSZYmI*KcegIg&3}f-o0u1DfE?PEU*@i*DUm*NY z4CL>m$RrOimdypg)=;=P6>b9u+aRC_ODiN2X$H1{Bj7N&1q@+fjzFRZd%#myX^s%%%=9k8QnOsvul$sqerYl za&~>86zJ(!R#uZ6(gXL=QA+k$t23Bx0|^7?6e^{vn~lx?)fqL>usFV`N5DSL*X6y< zTjVuNM|7dmeB2A|u4uci7FL^{v0u4^Rz3_XD=S-DQDx;okhHx$b>YvUp%S>@*BM8( zdHKJJilXrNe#FRxL2FxEkY{UqdjihW%d79f@U(-gWOdqIwx*U=ShFsBYHA96COJ8| zwss*kRn1IaPp`0`U~chqZX9xra#W-1tmb$;%GA`2h*dGM zguuW+PtU=@K}fI9h%&YwHY;5|K?O_hm26x^wv#gZG7^y-Ws{0~l5o0i zuGjg1k`gmB69`46&o9W#?$D-3%1uRs?oCGfPdK?Ip`<=t&}D@W3kwT~KGgzE6lB*@ z;ir~~9-5P%6r8_lROSO^si(ljM>J<75mUw2B@vTYDz)KVLgI6hW zSC7q%Otd}=Z_8@P=DL(|?12peEG0-&7^z&*QS=&FM!AKF>YapHxx{aH&+0*DucJ-+ z{ahdYbf2mbvh0H{W`viUlT9*iVf>b;@j^GMzGG&`5PbU8e3>Y@2Pt@HAW6CZ-gL-s zb-E+|r)>SIp_=-X@dMMBd`v!dBXjP6E=KG{84Z_}pV5fsbxACE6}Z zSCYX%SD4Pe_|I8K&Gsn8DP0(KOO(swoZM)8pnj>m$^5XDP&{2R0=6cs6~=C zC=R1*SYd{7%O_mZG^WU@lCB1z(sN|Gd*Al1=V_zm*5$`G+tnM(u_uf~%)1{g;rNoL>H)>UL zLswMGWa=e3a_l`@t`n8NCB0|CM$6elhHVpKF8&3UX;$lpk)35%f`20cp#%Nmsv19q{>5!SH0nsAyMX-cnJR3-$@S=A`C56lh zE1rBxy5ZKk*0$=}>$(f_Xz#^X4k^OCz<>As({(?G?j;@&hspnrJGK9WvVLx8tZ(h< zuu@9nySa7a3wzVXOyzwPc)KU-5?W2<1;J|0*E^zSCdKL+nTDn%c{WXt2P{RUrqM=) zqAg_U2J8CPzW!&>quSyTMpTS8?9sdF8_P^b#=eUViq9@DBWB^N_Dgq$mPRu5^&T!Q zyg2@$SJJ|69t7RoAPIiS`ejN<(IsjSmQ>ZCTiNnqM>O`B;Z5+S6G7*MJ9DQ0q<)G} zp4eqUjZIWybMi8$qepi?ES#;gJZ674%jJ*$bHcjH14Lz}Qp)xX_#%HG{I%qF(Uv*F zJqYBeyKxdqv-6Z#F{>c!tbe{X{qWPSG!sUK&vS?nvBvZop}6I3c&f`4jZ(?kX*x7+ z+5_(7M5d45=Oaf6r^JK{IYoor^6@rtRy%KOxyJ7$gys#;Zc|`{->bOX8w*c;(VXM2 z!-FG(eH}kP3y!aTl4&{Fp<9|bagX?nw|k+j+&Ie7lAzQ&Yo9Ql;;jfhwOq|{x@SnT z@4BIq;Q8;NOY2mMSzRgvH5%D+jkOEDe_gI(zM!lNQ=Poii8ddO#P4}9>+G?o;}`}fYNd{pS0*St-vGt>)494dxf`MsZOKL#WxLoi~zx-F#=_T=TM&3V7+q>MuKA bT~^cuRSWona23F9<^Pe0cf;Luq#XMX0!Fc2 diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/it/ups.png b/Packlink/Resources/views/backend/_resources/images/carriers/it/ups.png deleted file mode 100644 index d2528ef0d6b25358f3c98b8e2d136d3ea4871fbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2221 zcmV;e2vYZnP)4b&3_NJvNW z1R12sh zN!P>x^$nPv%=%BV>d&N*E8}yjjsz?qhz5>;TAQEPKSspNh7hv}%!`81GxR1>x}^}G z!i`t#wq8d-Z7NJVP8|&h6&Y0p$|`|>PV*&j#s$>V>RLxveWO6rIUqVpzoMcf;-Z1% z-asl{DRgCBCXvxc%Gey25~?m;wWn?!p`iL{aRa{|27dZoXxE`q;9QHpcF>XU*#}f) zjHQ*^W(sPscIwpB3~c#XV9PH8ztC#f&}2IXmJg@LfO_gI@bM;rjXwy~Hk^MzdOn%3 zgUajT%Jl+;#R4tv^BYV9*sy_0t`72x1m0XLPaEO<*nRqcNhPzKgfP&fS~$U;Q`Zjtfq&#${?k z0j^r0skv(zpj^ir-0y$0$Dm;QukFDakts3%9u=1kWKNw< zQv|l;69q+kIl<)&*&42OHiVSk5<@Nq23<(uBUzq7y(vF6pr3yAP1T1#Z>EYn#+!gL zFXav}axk#?F%>f>QQX=}Y@JKzwg;4}`lSI=uGjhafjB{qS!!p4>28po_3X#)*e`J9 zFp0aeDWgi@K6;15w%rmZ$^~Xjl1NI>d)a>k_ zz`SYCL0~I|u6#8%tGI8nL=?@ld+Gk_M*<@T8PEZ*uTfBPR2NcM3=AKr*O?sN(yjgO z`1JQwKUmB8YKMvXGBXf{F3(Y9XQrn+rHSNg|#2U3u=&KIeLmiTD@^x4A6%T zT=pC?VSQqT#H=Z_87l2jZ2v9D&i!Z>UQoLkWmlG5*I zR9~RAf$D=Hm3&>E;s%wqPJ90Dru5+lUnyAlt~oTe*uE*+*|yQd*1OrWt=*WyYwFF< ze1_B+Dc#Kfu~(RAbJ$v0(^1NIdkA0;1ML+@(O5?|TS^=PRW|W1&2+NDL@aBBq=UMS zLp3b5GZZ)?d*C*+%@^OYJV6_iioqFX`RHNL{8;Xj*I(YmVkk7GIF}A=>?I$zVr{47 zMwXG=lgUyKmjY+2f%If(;p(b|s#bR8P_xfAP|YITbF0L-(QYswpNul`y17;Z6&OvC z)~qQKM^Dj-D*?!$8dS7bKQK&7R_UD$L1(e{k|Ur}lISE)zg}@tJIGr>8_84m>Y-*P z( zh`E$J`;MX|U#=Q1(LY_6xBsxfs*M8mbRruYEwzV7kCHM2_L3u@(vnt4%h?m-Moa7} z(ShLmt`c74e3M~)%<;~bf|4Y@w*dB2-zzjh_Lh3h~JHcRKIj_s&J7%%%7X1bS3cbpzm;{qw@WK~@sibCnD#amJ;Lcb z_F371@9f0$+RJ5I>TVz9OaD6QpSqltdip+94*;b6wzS+edGIWdGv*BWr=|6}h{nRy zIW$dPA$L5k0Rx0{gxa)9D13{8EnmmlB}QI0-209xhNd+#2(fhYCe` zgMJW^!v#D40NyQ7=$+KS)Jlk#npZJ{Jc~sAR|DJ6sqVRn)2erB9Xb3jFzszpt|31) zJ4zAH(<8o-yWkgnS8Y`Az4j9b-zu_Y-kDAB2HYgId;ob1B@pVuxSXobY*N)PvA#9- ztGTsIjRh&UC_;Ijq+ZLCIr*}h-dWwev;Aw97hj+Q$(xXt(v$KaC1GA%SMU0WePV01 z3S3%`0@YBTEmu**0s`t*F5`Dt*K8IzRwi)!I2B_@0tzk2WSPHF^~?DUm1}wen1=p6 z5>!LEru?)~P~<#Payp$u#~S4X=XbOVEs4)@6;N3Sj+ZIX%1=ESRAZnuYkT*LjfsAQ v(92X*ERW4~?KbKn_Xq+J1R@CZAO!vevKzoiAz;<700000NkvXXu0mjf6r(Bg diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/es/keavo.png b/Packlink/Resources/views/backend/_resources/images/carriers/keavo.png similarity index 100% rename from Packlink/Resources/views/backend/_resources/images/carriers/es/keavo.png rename to Packlink/Resources/views/backend/_resources/images/carriers/keavo.png diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/de/mondial-relay.png b/Packlink/Resources/views/backend/_resources/images/carriers/mondial-relay.png similarity index 100% rename from Packlink/Resources/views/backend/_resources/images/carriers/de/mondial-relay.png rename to Packlink/Resources/views/backend/_resources/images/carriers/mondial-relay.png diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/es/nexive.png b/Packlink/Resources/views/backend/_resources/images/carriers/nexive.png similarity index 100% rename from Packlink/Resources/views/backend/_resources/images/carriers/es/nexive.png rename to Packlink/Resources/views/backend/_resources/images/carriers/nexive.png diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/es/packlink-selection.png b/Packlink/Resources/views/backend/_resources/images/carriers/packlink-selection.png similarity index 100% rename from Packlink/Resources/views/backend/_resources/images/carriers/es/packlink-selection.png rename to Packlink/Resources/views/backend/_resources/images/carriers/packlink-selection.png diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/it/poste-italiane.png b/Packlink/Resources/views/backend/_resources/images/carriers/poste-italiane.png similarity index 100% rename from Packlink/Resources/views/backend/_resources/images/carriers/it/poste-italiane.png rename to Packlink/Resources/views/backend/_resources/images/carriers/poste-italiane.png diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/it/poste-italiane_crono-express_door-door_it.png b/Packlink/Resources/views/backend/_resources/images/carriers/poste-italiane_crono-express_door-door_it.png similarity index 100% rename from Packlink/Resources/views/backend/_resources/images/carriers/it/poste-italiane_crono-express_door-door_it.png rename to Packlink/Resources/views/backend/_resources/images/carriers/poste-italiane_crono-express_door-door_it.png diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/it/sda.png b/Packlink/Resources/views/backend/_resources/images/carriers/sda.png similarity index 100% rename from Packlink/Resources/views/backend/_resources/images/carriers/it/sda.png rename to Packlink/Resources/views/backend/_resources/images/carriers/sda.png diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/de/seur.png b/Packlink/Resources/views/backend/_resources/images/carriers/seur.png similarity index 100% rename from Packlink/Resources/views/backend/_resources/images/carriers/de/seur.png rename to Packlink/Resources/views/backend/_resources/images/carriers/seur.png diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/de/spring.png b/Packlink/Resources/views/backend/_resources/images/carriers/spring.png similarity index 100% rename from Packlink/Resources/views/backend/_resources/images/carriers/de/spring.png rename to Packlink/Resources/views/backend/_resources/images/carriers/spring.png diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/it/starpack.png b/Packlink/Resources/views/backend/_resources/images/carriers/starpack.png similarity index 100% rename from Packlink/Resources/views/backend/_resources/images/carriers/it/starpack.png rename to Packlink/Resources/views/backend/_resources/images/carriers/starpack.png diff --git a/Packlink/Resources/views/backend/_resources/images/carriers/tnt.png b/Packlink/Resources/views/backend/_resources/images/carriers/tnt.png new file mode 100644 index 0000000000000000000000000000000000000000..293268486ba2259b89c2f204ac25a5fd37de81f7 GIT binary patch literal 1619 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 - $country = $userInfo ? strtolower($userInfo->country) : ''; - $pluginDir = Shopware()->Container()->getParameter('packlink.plugin_dir'); $baseDir = $pluginDir . self::IMG_DIR; - $image = $baseDir . $country . '/' . strtolower(str_replace(' ', '-', $carrierName)) . '.png'; + $image = $baseDir . strtolower(str_replace(' ', '-', $carrierName)) . '.png'; if (!file_exists($image)) { $image = $baseDir . self::DEFAULT_CARRIER; From 72944603ef6d7e11a63e6f6685b95e9771e9fa06 Mon Sep 17 00:00:00 2001 From: Risto Kekovic Date: Mon, 10 Feb 2020 12:39:05 +0100 Subject: [PATCH 13/44] Rename postal code validation message translation ISSUE: PLCORE20-24 --- .../snippets/backend/packlink/configuration.ini | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Packlink/Resources/snippets/backend/packlink/configuration.ini b/Packlink/Resources/snippets/backend/packlink/configuration.ini index 7795657..414e552 100644 --- a/Packlink/Resources/snippets/backend/packlink/configuration.ini +++ b/Packlink/Resources/snippets/backend/packlink/configuration.ini @@ -145,7 +145,7 @@ order/print/labels="Labels" order/print/labels/btn="Print Packlink PRO shipping labels" error/required="Field is required." error/number="Value must be valid number." -error/postalcode="Postal code is not correct." +error/postal_code="Postal code is not correct." error/email="Field must be valid email." error/phone="Field must be valid phone number." error/shippingmethodactivate="Failed to activate shipping method." @@ -316,7 +316,7 @@ order/print/labels="Labels" order/print/labels/btn="Versandetiketten drucken" error/required="Dies ist ein Pflichtfeld." error/number="Bitte geben Sie einen numerischen Wert ein." -error/postalcode="Die Postleitzahl ist nicht korrekt." +error/postal_code="Die Postleitzahl ist nicht korrekt." error/email="Das Feld muss eine gültige E-Mail-Adresse sein." error/phone="Bitte geben Sie eine gültige Telefonnummer ein." error/shippingmethodactivate="Versanddienst konnte nicht abgewählt werden." @@ -486,7 +486,7 @@ order/print/labels="Labels" order/print/labels/btn="Print Packlink PRO shipping labels" error/required="Ce champs est obligatoire." error/number="Cette valeur doit être numérique." -error/postalcode="Code postal invalide." +error/postal_code="Code postal invalide." error/email="Le champs doit être une adresse email valide." error/phone="Ce champs doit contenir un numéro de téléphone valide." error/shippingmethodactivate="Échec de l'activation du service d'envoi." @@ -656,7 +656,7 @@ order/print/labels="Labels" order/print/labels/btn="Stampa etichette di spedizione Packlink PRO" error/required="Questo campo è obbligatorio." error/number="Questo valore deve essere numerico." -error/postalcode="Il codice postale non è corretto." +error/postal_code="Il codice postale non è corretto." error/email="Il campo deve essere un email valido." error/phone="Questo campo deve contenere un numero di telefono valido." error/shippingmethodactivate="Impossibile attivare il servizio di spedizione." @@ -826,7 +826,7 @@ order/print/labels="Labels" order/print/labels/btn="Imprimir etiquetas de envío" error/required="Esta campo es obligatorio." error/number="Debe ser un valor numérico." -error/postalcode="El código postal no es correcto." +error/postal_code="El código postal no es correcto." error/email="El campo debe ser un correo electrónico válido." error/phone="Este campo deber ser un número de teléfono válido." error/shippingmethodactivate="Error al activar el servicio de envío." From ba932158f9e3c739336c39a2f08783eef9665c1d Mon Sep 17 00:00:00 2001 From: Kostandin Dimitrijevic Date: Mon, 10 Feb 2020 13:52:41 +0100 Subject: [PATCH 14/44] Update to the latest core changes --- Packlink/Services/BusinessLogic/ShopOrderService.php | 6 +++++- Packlink/composer.lock | 10 +++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Packlink/Services/BusinessLogic/ShopOrderService.php b/Packlink/Services/BusinessLogic/ShopOrderService.php index 152a4a4..821754e 100644 --- a/Packlink/Services/BusinessLogic/ShopOrderService.php +++ b/Packlink/Services/BusinessLogic/ShopOrderService.php @@ -80,7 +80,7 @@ public function getOrderAndShippingData($orderId) /** * @inheritDoc */ - public function handleUpdatedTrackingInfo($orderId, array $trackings) + public function updateTrackingInfo($orderId, array $trackings) { /** @var \Shopware\Models\Order\Order $sourceOrder */ $sourceOrder = $this->getShopwareOrderRepository()->find($orderId); @@ -96,6 +96,7 @@ public function handleUpdatedTrackingInfo($orderId, array $trackings) /** * @inheritDoc + * @noinspection PhpUnhandledExceptionInspection */ public function updateShipmentStatus($orderId, $shippingStatus) { @@ -108,6 +109,7 @@ public function updateShipmentStatus($orderId, $shippingStatus) $statusMap = $this->getConfigService()->getOrderStatusMappings(); if (isset($statusMap[$shippingStatus]) && $statusMap[$shippingStatus] !== '') { + /** @var \Shopware\Models\Order\Status $status */ $status = Shopware()->Models()->find('Shopware\Models\Order\Status', $statusMap[$shippingStatus]); if ($status) { @@ -321,6 +323,7 @@ private function getOrderDropoffRepository() * Retrieves Shopware order repository. * * @return \Shopware\Models\Order\Repository + * @noinspection PhpIncompatibleReturnTypeInspection */ private function getShopwareOrderRepository() { @@ -331,6 +334,7 @@ private function getShopwareOrderRepository() * Retrieves article repository. * * @return \Shopware\Models\Article\Repository + * @noinspection PhpIncompatibleReturnTypeInspection */ private function getShopwareArticleRepository() { diff --git a/Packlink/composer.lock b/Packlink/composer.lock index 228af10..dc4013b 100644 --- a/Packlink/composer.lock +++ b/Packlink/composer.lock @@ -1,7 +1,7 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], "content-hash": "4cfca4bf0e5158abffa61c995dfb007f", @@ -62,12 +62,12 @@ "source": { "type": "git", "url": "git@github.com:logeecom/pl_module_core.git", - "reference": "7c3f0215c12891c3e52ab9ba59510bf14668c0fd" + "reference": "d503a5f52211b4187d2c50ce33f0bfec76eab2b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/logeecom/pl_module_core/zipball/7c3f0215c12891c3e52ab9ba59510bf14668c0fd", - "reference": "7c3f0215c12891c3e52ab9ba59510bf14668c0fd", + "url": "https://api.github.com/repos/logeecom/pl_module_core/zipball/d503a5f52211b4187d2c50ce33f0bfec76eab2b8", + "reference": "d503a5f52211b4187d2c50ce33f0bfec76eab2b8", "shasum": "" }, "require": { @@ -94,7 +94,7 @@ "proprietary" ], "description": "Packlink integrations core library", - "time": "2020-02-07T10:32:21+00:00" + "time": "2020-02-10T12:40:30+00:00" }, { "name": "setasign/fpdf", From 9dd17176e74280d4bfd7edbe4b2db28bdfef68a3 Mon Sep 17 00:00:00 2001 From: Risto Kekovic Date: Tue, 11 Feb 2020 12:02:00 +0100 Subject: [PATCH 15/44] Resize country list on login page, load registration countries dynamically ISSUE: PLCORE20-21 --- .../Controllers/Backend/PacklinkLogin.php | 13 +-- .../views/backend/_resources/css/packlink.css | 13 +-- .../js/DefaultWarehouseController.js | 5 +- .../views/backend/packlink_login/index.tpl | 86 +++++++++++++------ Packlink/composer.lock | 10 +-- 5 files changed, 77 insertions(+), 50 deletions(-) diff --git a/Packlink/Controllers/Backend/PacklinkLogin.php b/Packlink/Controllers/Backend/PacklinkLogin.php index 4dfd187..591e7a4 100644 --- a/Packlink/Controllers/Backend/PacklinkLogin.php +++ b/Packlink/Controllers/Backend/PacklinkLogin.php @@ -1,10 +1,7 @@ View()->assign(['isLoginFailure' => true]); } } else { - /** @var \Packlink\BusinessLogic\Country\CountryService $countryService */ - $countryService = ServiceRegister::getService(CountryService::CLASS_NAME); - $supportedCountries = $countryService->getSupportedCountries(); - - foreach ($supportedCountries as $country) { - $country->name = Translation::get("configuration/country/{$country->code}"); - } - - $this->View()->assign(['countries' => $supportedCountries]); + $this->View()->assign(['csrfToken' => $this->container->get('BackendSession')->offsetGet('X-CSRF-Token')]); } } diff --git a/Packlink/Resources/views/backend/_resources/css/packlink.css b/Packlink/Resources/views/backend/_resources/css/packlink.css index 41e60d7..9732e3a 100644 --- a/Packlink/Resources/views/backend/_resources/css/packlink.css +++ b/Packlink/Resources/views/backend/_resources/css/packlink.css @@ -1193,6 +1193,11 @@ input[type="checkbox"] { width: 250px; float: right; animation: pl-fade-in .5s ease; + max-height: calc(100vh - 200px); + overflow-x: auto; + text-align: justify; + z-index: 1; + background-color: #f9fafa; } .pl-register-country-title-wrapper { @@ -1202,9 +1207,7 @@ input[type="checkbox"] { .pl-register-country-list-wrapper { margin-top: 15px; - max-height: 205px; - overflow-x: auto; - text-align: justify; + height: 97%; } .pl-register-country-list-wrapper a { @@ -1213,9 +1216,9 @@ input[type="checkbox"] { .pl-country { display: flex; - height: 40px; + height: 35px; width: 30px; - line-height: 40px; + line-height: 35px; border-radius: 50%; text-align: center; color: #2095f2; diff --git a/Packlink/Resources/views/backend/_resources/js/DefaultWarehouseController.js b/Packlink/Resources/views/backend/_resources/js/DefaultWarehouseController.js index db996c0..1c641ae 100644 --- a/Packlink/Resources/views/backend/_resources/js/DefaultWarehouseController.js +++ b/Packlink/Resources/views/backend/_resources/js/DefaultWarehouseController.js @@ -167,7 +167,10 @@ var Packlink = window.Packlink || {}; } postalCodeInput.value = currentPostalCode + ' - ' + currentCity; - templateService.removeError(postalCodeInput); + if (currentPostalCode !== '' && currentCity !== '') { + templateService.removeError(postalCodeInput); + } + utilityService.configureInputElements(); } diff --git a/Packlink/Resources/views/backend/packlink_login/index.tpl b/Packlink/Resources/views/backend/packlink_login/index.tpl index af7a449..c7ab739 100644 --- a/Packlink/Resources/views/backend/packlink_login/index.tpl +++ b/Packlink/Resources/views/backend/packlink_login/index.tpl @@ -3,6 +3,7 @@ {block name="scripts"} + {/block} {block name="content/main"} @@ -34,19 +35,9 @@
{s name="login/country"}Select country to start{/s}
+ +
@@ -92,22 +83,63 @@ {block name="content/javascript"}