From bffab98d0eb1478313d27b468d41ef7b49c4125e Mon Sep 17 00:00:00 2001 From: "igor.pesic" Date: Fri, 22 May 2020 09:29:02 +0200 Subject: [PATCH 001/214] Add controllers, services and repositories Issue: PLCR1801-6 --- src/DemoUI/composer.json | 21 ++ src/DemoUI/composer.lock | 22 +++ src/DemoUI/src/Bootstrap.php | 183 ++++++++++++++++++ .../Controllers/AutoConfigureController.php | 25 +++ .../src/Controllers/DashboardController.php | 22 +++ .../src/Controllers/DebugController.php | 36 ++++ .../Controllers/DefaultParcelController.php | 28 +++ .../DefaultWarehouseController.php | 44 +++++ src/DemoUI/src/Controllers/Index.php | 7 + .../src/Controllers/LoginController.php | 24 +++ src/DemoUI/src/Controllers/Models/Request.php | 75 +++++++ .../OrderStateMappingController.php | 36 ++++ .../src/Controllers/ResolverController.php | 49 +++++ .../ShippingCountriesController.php | 20 ++ .../Controllers/ShippingMethodsController.php | 52 +++++ .../assets/images/carriers/carrier.jpg | Bin 0 -> 5088 bytes .../Controllers/assets/images/dashboard.png | Bin 0 -> 13096 bytes .../Controllers/assets/images/flags/AT.svg | 11 ++ .../Controllers/assets/images/flags/BE.svg | 9 + .../Controllers/assets/images/flags/DE.svg | 11 ++ .../Controllers/assets/images/flags/ES.svg | 14 ++ .../Controllers/assets/images/flags/FR.svg | 11 ++ .../Controllers/assets/images/flags/GB.svg | 31 +++ .../Controllers/assets/images/flags/IE.svg | 8 + .../Controllers/assets/images/flags/IT.svg | 11 ++ .../Controllers/assets/images/flags/NL.svg | 8 + .../Controllers/assets/images/flags/PT.svg | 14 ++ .../Controllers/assets/images/flags/TR.svg | 13 ++ .../src/Controllers/assets/images/logo-pl.svg | 97 ++++++++++ .../src/Controllers/assets/images/logo.png | Bin 0 -> 2738 bytes .../src/Controllers/assets/images/logo.svg | 17 ++ .../src/Repository/AssetsRepository.php | 20 ++ .../src/Repository/SessionRepository.php | 17 ++ .../Services/BusinessLogic/CarrierService.php | 84 ++++++++ .../BusinessLogic/ConfigurationService.php | 136 +++++++++++++ .../BusinessLogic/ShopOrderService.php | 46 +++++ .../Services/Infrastructure/LoggerService.php | 24 +++ src/DemoUI/src/Views/index.php | 87 +++++++++ 38 files changed, 1313 insertions(+) create mode 100755 src/DemoUI/composer.json create mode 100644 src/DemoUI/composer.lock create mode 100644 src/DemoUI/src/Bootstrap.php create mode 100644 src/DemoUI/src/Controllers/AutoConfigureController.php create mode 100644 src/DemoUI/src/Controllers/DashboardController.php create mode 100644 src/DemoUI/src/Controllers/DebugController.php create mode 100644 src/DemoUI/src/Controllers/DefaultParcelController.php create mode 100644 src/DemoUI/src/Controllers/DefaultWarehouseController.php create mode 100644 src/DemoUI/src/Controllers/Index.php create mode 100644 src/DemoUI/src/Controllers/LoginController.php create mode 100644 src/DemoUI/src/Controllers/Models/Request.php create mode 100644 src/DemoUI/src/Controllers/OrderStateMappingController.php create mode 100644 src/DemoUI/src/Controllers/ResolverController.php create mode 100644 src/DemoUI/src/Controllers/ShippingCountriesController.php create mode 100644 src/DemoUI/src/Controllers/ShippingMethodsController.php create mode 100644 src/DemoUI/src/Controllers/assets/images/carriers/carrier.jpg create mode 100644 src/DemoUI/src/Controllers/assets/images/dashboard.png create mode 100644 src/DemoUI/src/Controllers/assets/images/flags/AT.svg create mode 100644 src/DemoUI/src/Controllers/assets/images/flags/BE.svg create mode 100644 src/DemoUI/src/Controllers/assets/images/flags/DE.svg create mode 100644 src/DemoUI/src/Controllers/assets/images/flags/ES.svg create mode 100644 src/DemoUI/src/Controllers/assets/images/flags/FR.svg create mode 100644 src/DemoUI/src/Controllers/assets/images/flags/GB.svg create mode 100644 src/DemoUI/src/Controllers/assets/images/flags/IE.svg create mode 100644 src/DemoUI/src/Controllers/assets/images/flags/IT.svg create mode 100644 src/DemoUI/src/Controllers/assets/images/flags/NL.svg create mode 100644 src/DemoUI/src/Controllers/assets/images/flags/PT.svg create mode 100644 src/DemoUI/src/Controllers/assets/images/flags/TR.svg create mode 100644 src/DemoUI/src/Controllers/assets/images/logo-pl.svg create mode 100644 src/DemoUI/src/Controllers/assets/images/logo.png create mode 100644 src/DemoUI/src/Controllers/assets/images/logo.svg create mode 100644 src/DemoUI/src/Repository/AssetsRepository.php create mode 100644 src/DemoUI/src/Repository/SessionRepository.php create mode 100644 src/DemoUI/src/Services/BusinessLogic/CarrierService.php create mode 100644 src/DemoUI/src/Services/BusinessLogic/ConfigurationService.php create mode 100644 src/DemoUI/src/Services/BusinessLogic/ShopOrderService.php create mode 100644 src/DemoUI/src/Services/Infrastructure/LoggerService.php create mode 100644 src/DemoUI/src/Views/index.php diff --git a/src/DemoUI/composer.json b/src/DemoUI/composer.json new file mode 100755 index 00000000..4dadf9bd --- /dev/null +++ b/src/DemoUI/composer.json @@ -0,0 +1,21 @@ +{ + "name": "packlink/demo-ui", + "description": "Packlink Demo UI core library", + "type": "library", + "license": "proprietary", + "require": { + "php": ">=5.3.29" + }, + "autoload": { + "psr-4": { + "Logeecom\\Infrastructure\\": "../Infrastructure", + "Packlink\\BusinessLogic\\": "../BusinessLogic", + "Packlink\\DemoUI\\": "src" + } + }, + "config": { + "platform": { + "php": "5.3.29" + } + } +} diff --git a/src/DemoUI/composer.lock b/src/DemoUI/composer.lock new file mode 100644 index 00000000..4e0b565f --- /dev/null +++ b/src/DemoUI/composer.lock @@ -0,0 +1,22 @@ +{ + "_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", + "This file is @generated automatically" + ], + "content-hash": "2157e45d141336963654f2cb2627846c", + "packages": [], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=5.3.29" + }, + "platform-dev": [], + "platform-overrides": { + "php": "5.3.29" + } +} diff --git a/src/DemoUI/src/Bootstrap.php b/src/DemoUI/src/Bootstrap.php new file mode 100644 index 00000000..630001f2 --- /dev/null +++ b/src/DemoUI/src/Bootstrap.php @@ -0,0 +1,183 @@ +jsonSerializer = new JsonSerializer(); + $this->httpClientService = new CurlHttpClient(); + $this->loggerService = new LoggerService(); + $this->configService = ConfigurationService::getInstance(); + $this->shopOrderService = new ShopOrderService(); + $this->carrierService = new CarrierService(); + $this->userAccountService = UserAccountService::getInstance(); + + static::$instance = $this; + } + + /** + * Initializes infrastructure services and utilities. + */ + protected static function initServices() + { + parent::initServices(); + + static::$instance->initInstanceServices(); + } + + /** + * Initializes repositories. + * + * @throws RepositoryClassException + */ + protected static function initRepositories() + { + parent::initRepositories(); + + RepositoryRegistry::registerRepository(Process::CLASS_NAME, SessionRepository::getClassName()); + RepositoryRegistry::registerRepository(ConfigEntity::CLASS_NAME, SessionRepository::getClassName()); + RepositoryRegistry::registerRepository(QueueItem::CLASS_NAME, MemoryQueueItemRepository::getClassName()); + RepositoryRegistry::registerRepository(Schedule::CLASS_NAME, SessionRepository::getClassName()); + RepositoryRegistry::registerRepository(OrderShipmentDetails::CLASS_NAME, SessionRepository::getClassName()); + RepositoryRegistry::registerRepository(ShippingMethod::CLASS_NAME, SessionRepository::getClassName()); + RepositoryRegistry::registerRepository(Entity::CLASS_NAME, SessionRepository::getClassName()); + RepositoryRegistry::registerRepository(LogData::CLASS_NAME, SessionRepository::getClassName()); + RepositoryRegistry::registerRepository(OrderSendDraftTaskMap::CLASS_NAME, SessionRepository::getClassName()); + } + + /** + * Initializes instance services. + */ + protected function initInstanceServices() + { + $instance = static::$instance; + + ServiceRegister::registerService( + Serializer::CLASS_NAME, + function () use ($instance) { + return $instance->jsonSerializer; + } + ); + + ServiceRegister::registerService( + ShopLoggerAdapter::CLASS_NAME, + function () use ($instance) { + return $instance->loggerService; + } + ); + + ServiceRegister::registerService( + Configuration::CLASS_NAME, + function () use ($instance) { + return $instance->configService; + } + ); + + ServiceRegister::registerService( + HttpClient::CLASS_NAME, + function () use ($instance) { + return $instance->httpClientService; + } + ); + + ServiceRegister::registerService( + ShopOrderServiceInterface::CLASS_NAME, + function () use ($instance) { + return $instance->shopOrderService; + } + ); + + ServiceRegister::registerService( + ShopShippingMethodService::CLASS_NAME, + function () use ($instance) { + return $instance->carrierService; + } + ); + + ServiceRegister::registerService( + UserAccountService::CLASS_NAME, + function () use ($instance) { + return $instance->userAccountService; + } + ); + } +} \ No newline at end of file diff --git a/src/DemoUI/src/Controllers/AutoConfigureController.php b/src/DemoUI/src/Controllers/AutoConfigureController.php new file mode 100644 index 00000000..106e0cb7 --- /dev/null +++ b/src/DemoUI/src/Controllers/AutoConfigureController.php @@ -0,0 +1,25 @@ + $controller->start(true))); + } +} \ No newline at end of file diff --git a/src/DemoUI/src/Controllers/DashboardController.php b/src/DemoUI/src/Controllers/DashboardController.php new file mode 100644 index 00000000..83b9443e --- /dev/null +++ b/src/DemoUI/src/Controllers/DashboardController.php @@ -0,0 +1,22 @@ +handleAction(); \ No newline at end of file diff --git a/src/DemoUI/src/Controllers/LoginController.php b/src/DemoUI/src/Controllers/LoginController.php new file mode 100644 index 00000000..85be4213 --- /dev/null +++ b/src/DemoUI/src/Controllers/LoginController.php @@ -0,0 +1,24 @@ +getQuery('api_key'); + + return !empty($apiKey); + } +} \ No newline at end of file diff --git a/src/DemoUI/src/Controllers/Models/Request.php b/src/DemoUI/src/Controllers/Models/Request.php new file mode 100644 index 00000000..3d8675ac --- /dev/null +++ b/src/DemoUI/src/Controllers/Models/Request.php @@ -0,0 +1,75 @@ +query = $query; + $this->payload = $payload; + $this->headers = $headers; + } + + /** + * @param string|null $key + * + * @return array + */ + public function getQuery($key = null) + { + if ($key != null && isset($this->query[$key])) { + return $this->query[$key]; + } + + return $this->query; + } + + /** + * @return array + */ + public function getPayload() + { + return $this->payload; + } + + /** + * @param string|null $key + * + * @return array + */ + public function getHeaders($key = null) + { + if ($key != null && isset($this->headers[$key])) { + return $this->headers[$key]; + } + + return $this->headers; + } +} \ No newline at end of file diff --git a/src/DemoUI/src/Controllers/OrderStateMappingController.php b/src/DemoUI/src/Controllers/OrderStateMappingController.php new file mode 100644 index 00000000..cf3467e6 --- /dev/null +++ b/src/DemoUI/src/Controllers/OrderStateMappingController.php @@ -0,0 +1,36 @@ +getQueryParams(); + $payload = json_decode(file_get_contents('php://input'), true); + $payload = $payload != null ? $payload : array(); + $headers = getallheaders(); + + $controllerClass = __NAMESPACE__ . '\\' . $controllerName; + $controller = new $controllerClass; + + header('Content-Type: application/json'); + + $controller->$action(new Request($query, $payload, $headers)); + } + + /** + * @return array + */ + private function getQueryParams() + { + $result = array(); + + foreach (array_keys($_GET) as $arrayKey) { + if ($arrayKey !== 'controller' && $arrayKey !== 'action') { + $result[$arrayKey] = $_GET[$arrayKey]; + } + } + + return $result; + } +} \ No newline at end of file diff --git a/src/DemoUI/src/Controllers/ShippingCountriesController.php b/src/DemoUI/src/Controllers/ShippingCountriesController.php new file mode 100644 index 00000000..1a0885ba --- /dev/null +++ b/src/DemoUI/src/Controllers/ShippingCountriesController.php @@ -0,0 +1,20 @@ +Ve(^jx*|7>HtPt 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 + + + + + + + + diff --git a/src/DemoUI/src/Controllers/assets/images/flags/BE.svg b/src/DemoUI/src/Controllers/assets/images/flags/BE.svg new file mode 100644 index 00000000..3120d549 --- /dev/null +++ b/src/DemoUI/src/Controllers/assets/images/flags/BE.svg @@ -0,0 +1,9 @@ + + + + + + + diff --git a/src/DemoUI/src/Controllers/assets/images/flags/DE.svg b/src/DemoUI/src/Controllers/assets/images/flags/DE.svg new file mode 100644 index 00000000..a6f4e17b --- /dev/null +++ b/src/DemoUI/src/Controllers/assets/images/flags/DE.svg @@ -0,0 +1,11 @@ + + + + + + + diff --git a/src/DemoUI/src/Controllers/assets/images/flags/ES.svg b/src/DemoUI/src/Controllers/assets/images/flags/ES.svg new file mode 100644 index 00000000..79d28965 --- /dev/null +++ b/src/DemoUI/src/Controllers/assets/images/flags/ES.svg @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/src/DemoUI/src/Controllers/assets/images/flags/FR.svg b/src/DemoUI/src/Controllers/assets/images/flags/FR.svg new file mode 100644 index 00000000..70954eef --- /dev/null +++ b/src/DemoUI/src/Controllers/assets/images/flags/FR.svg @@ -0,0 +1,11 @@ + + + + + + + diff --git a/src/DemoUI/src/Controllers/assets/images/flags/GB.svg b/src/DemoUI/src/Controllers/assets/images/flags/GB.svg new file mode 100644 index 00000000..0a5347d1 --- /dev/null +++ b/src/DemoUI/src/Controllers/assets/images/flags/GB.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/DemoUI/src/Controllers/assets/images/flags/IE.svg b/src/DemoUI/src/Controllers/assets/images/flags/IE.svg new file mode 100644 index 00000000..fa3ddc10 --- /dev/null +++ b/src/DemoUI/src/Controllers/assets/images/flags/IE.svg @@ -0,0 +1,8 @@ + + + + + + + diff --git a/src/DemoUI/src/Controllers/assets/images/flags/IT.svg b/src/DemoUI/src/Controllers/assets/images/flags/IT.svg new file mode 100644 index 00000000..25e2964b --- /dev/null +++ b/src/DemoUI/src/Controllers/assets/images/flags/IT.svg @@ -0,0 +1,11 @@ + + + + + + + diff --git a/src/DemoUI/src/Controllers/assets/images/flags/NL.svg b/src/DemoUI/src/Controllers/assets/images/flags/NL.svg new file mode 100644 index 00000000..48eb91cd --- /dev/null +++ b/src/DemoUI/src/Controllers/assets/images/flags/NL.svg @@ -0,0 +1,8 @@ + + + + + + + diff --git a/src/DemoUI/src/Controllers/assets/images/flags/PT.svg b/src/DemoUI/src/Controllers/assets/images/flags/PT.svg new file mode 100644 index 00000000..d0c0e366 --- /dev/null +++ b/src/DemoUI/src/Controllers/assets/images/flags/PT.svg @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/src/DemoUI/src/Controllers/assets/images/flags/TR.svg b/src/DemoUI/src/Controllers/assets/images/flags/TR.svg new file mode 100644 index 00000000..06532aec --- /dev/null +++ b/src/DemoUI/src/Controllers/assets/images/flags/TR.svg @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/src/DemoUI/src/Controllers/assets/images/logo-pl.svg b/src/DemoUI/src/Controllers/assets/images/logo-pl.svg new file mode 100644 index 00000000..29f5b586 --- /dev/null +++ b/src/DemoUI/src/Controllers/assets/images/logo-pl.svg @@ -0,0 +1,97 @@ + +image/svg+xml + + + + + + + + + \ No newline at end of file diff --git a/src/DemoUI/src/Controllers/assets/images/logo.png b/src/DemoUI/src/Controllers/assets/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8bc79007659acf2eb12460bda8e4641e4dfe63cc GIT binary patch literal 2738 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 GG~-{m5w%7D literal 0 HcmV?d00001 diff --git a/src/DemoUI/src/Controllers/assets/images/logo.svg b/src/DemoUI/src/Controllers/assets/images/logo.svg new file mode 100644 index 00000000..4e9642e1 --- /dev/null +++ b/src/DemoUI/src/Controllers/assets/images/logo.svg @@ -0,0 +1,17 @@ + + + + + Created by potrace 1.15, written by Peter Selinger 2001-2017 + + + + + diff --git a/src/DemoUI/src/Repository/AssetsRepository.php b/src/DemoUI/src/Repository/AssetsRepository.php new file mode 100644 index 00000000..48532241 --- /dev/null +++ b/src/DemoUI/src/Repository/AssetsRepository.php @@ -0,0 +1,20 @@ +getUrl('images/carriers/carrier.jpg'); + } + + /** + * Adds / Activates shipping method in shop integration. + * + * @param ShippingMethod $shippingMethod Shipping method. + * + * @return bool TRUE if activation succeeded; otherwise, FALSE. + */ + public function add(ShippingMethod $shippingMethod) + { + return true; + } + + /** + * Updates shipping method in shop integration. + * + * @param ShippingMethod $shippingMethod Shipping method. + */ + public function update(ShippingMethod $shippingMethod) + { + } + + /** + * Deletes shipping method in shop integration. + * + * @param ShippingMethod $shippingMethod Shipping method. + * + * @return bool TRUE if deletion succeeded; otherwise, FALSE. + */ + public function delete(ShippingMethod $shippingMethod) + { + return true; + } + + /** + * Adds backup shipping method based on provided shipping method. + * + * @param ShippingMethod $shippingMethod + * + * @return bool TRUE if backup shipping method is added; otherwise, FALSE. + */ + public function addBackupShippingMethod(ShippingMethod $shippingMethod) + { + return true; + } + + /** + * Deletes backup shipping method. + * + * @return bool TRUE if backup shipping method is deleted; otherwise, FALSE. + */ + public function deleteBackupShippingMethod() + { + return true; + } +} diff --git a/src/DemoUI/src/Services/BusinessLogic/ConfigurationService.php b/src/DemoUI/src/Services/BusinessLogic/ConfigurationService.php new file mode 100644 index 00000000..1c889621 --- /dev/null +++ b/src/DemoUI/src/Services/BusinessLogic/ConfigurationService.php @@ -0,0 +1,136 @@ +trackingCodes)) { + return; + } + } + + /** + * @inheritDoc + */ + public function updateShipmentStatus($orderId, $shippingStatus) + { + + } +} diff --git a/src/DemoUI/src/Services/Infrastructure/LoggerService.php b/src/DemoUI/src/Services/Infrastructure/LoggerService.php new file mode 100644 index 00000000..af362df5 --- /dev/null +++ b/src/DemoUI/src/Services/Infrastructure/LoggerService.php @@ -0,0 +1,24 @@ + + + + +
Main page
+ + + \ No newline at end of file From c431f4aa87c2c96fa5cb866080742cb7bb91d9f3 Mon Sep 17 00:00:00 2001 From: "igor.pesic" Date: Mon, 25 May 2020 13:38:17 +0200 Subject: [PATCH 002/214] Add controllers, services and repositories Issue: PLCR1801-6 --- src/DemoUI/src/Views/index.php | 87 ---------------------------------- 1 file changed, 87 deletions(-) delete mode 100644 src/DemoUI/src/Views/index.php diff --git a/src/DemoUI/src/Views/index.php b/src/DemoUI/src/Views/index.php deleted file mode 100644 index 376e7931..00000000 --- a/src/DemoUI/src/Views/index.php +++ /dev/null @@ -1,87 +0,0 @@ - - - - -
Main page
- - - \ No newline at end of file From 0e95f421bc4d09cb028e37227cfd10891025c29d Mon Sep 17 00:00:00 2001 From: "igor.pesic" Date: Fri, 22 May 2020 09:29:02 +0200 Subject: [PATCH 003/214] Add controllers, services and repositories Issue: PLCR1801-6 --- src/DemoUI/composer.json | 21 ++ src/DemoUI/composer.lock | 22 +++ src/DemoUI/src/Bootstrap.php | 183 ++++++++++++++++++ .../Controllers/AutoConfigureController.php | 25 +++ .../src/Controllers/DashboardController.php | 22 +++ .../src/Controllers/DebugController.php | 36 ++++ .../Controllers/DefaultParcelController.php | 28 +++ .../DefaultWarehouseController.php | 44 +++++ src/DemoUI/src/Controllers/Index.php | 7 + .../src/Controllers/LoginController.php | 24 +++ src/DemoUI/src/Controllers/Models/Request.php | 75 +++++++ .../OrderStateMappingController.php | 36 ++++ .../src/Controllers/ResolverController.php | 49 +++++ .../ShippingCountriesController.php | 20 ++ .../Controllers/ShippingMethodsController.php | 52 +++++ .../assets/images/carriers/carrier.jpg | Bin 0 -> 5088 bytes .../Controllers/assets/images/dashboard.png | Bin 0 -> 13096 bytes .../Controllers/assets/images/flags/AT.svg | 11 ++ .../Controllers/assets/images/flags/BE.svg | 9 + .../Controllers/assets/images/flags/DE.svg | 11 ++ .../Controllers/assets/images/flags/ES.svg | 14 ++ .../Controllers/assets/images/flags/FR.svg | 11 ++ .../Controllers/assets/images/flags/GB.svg | 31 +++ .../Controllers/assets/images/flags/IE.svg | 8 + .../Controllers/assets/images/flags/IT.svg | 11 ++ .../Controllers/assets/images/flags/NL.svg | 8 + .../Controllers/assets/images/flags/PT.svg | 14 ++ .../Controllers/assets/images/flags/TR.svg | 13 ++ .../src/Controllers/assets/images/logo-pl.svg | 97 ++++++++++ .../src/Controllers/assets/images/logo.png | Bin 0 -> 2738 bytes .../src/Controllers/assets/images/logo.svg | 17 ++ .../src/Repository/AssetsRepository.php | 20 ++ .../src/Repository/SessionRepository.php | 17 ++ .../Services/BusinessLogic/CarrierService.php | 84 ++++++++ .../BusinessLogic/ConfigurationService.php | 136 +++++++++++++ .../BusinessLogic/ShopOrderService.php | 46 +++++ .../Services/Infrastructure/LoggerService.php | 24 +++ src/DemoUI/src/Views/index.php | 87 +++++++++ 38 files changed, 1313 insertions(+) create mode 100755 src/DemoUI/composer.json create mode 100644 src/DemoUI/composer.lock create mode 100644 src/DemoUI/src/Bootstrap.php create mode 100644 src/DemoUI/src/Controllers/AutoConfigureController.php create mode 100644 src/DemoUI/src/Controllers/DashboardController.php create mode 100644 src/DemoUI/src/Controllers/DebugController.php create mode 100644 src/DemoUI/src/Controllers/DefaultParcelController.php create mode 100644 src/DemoUI/src/Controllers/DefaultWarehouseController.php create mode 100644 src/DemoUI/src/Controllers/Index.php create mode 100644 src/DemoUI/src/Controllers/LoginController.php create mode 100644 src/DemoUI/src/Controllers/Models/Request.php create mode 100644 src/DemoUI/src/Controllers/OrderStateMappingController.php create mode 100644 src/DemoUI/src/Controllers/ResolverController.php create mode 100644 src/DemoUI/src/Controllers/ShippingCountriesController.php create mode 100644 src/DemoUI/src/Controllers/ShippingMethodsController.php create mode 100644 src/DemoUI/src/Controllers/assets/images/carriers/carrier.jpg create mode 100644 src/DemoUI/src/Controllers/assets/images/dashboard.png create mode 100644 src/DemoUI/src/Controllers/assets/images/flags/AT.svg create mode 100644 src/DemoUI/src/Controllers/assets/images/flags/BE.svg create mode 100644 src/DemoUI/src/Controllers/assets/images/flags/DE.svg create mode 100644 src/DemoUI/src/Controllers/assets/images/flags/ES.svg create mode 100644 src/DemoUI/src/Controllers/assets/images/flags/FR.svg create mode 100644 src/DemoUI/src/Controllers/assets/images/flags/GB.svg create mode 100644 src/DemoUI/src/Controllers/assets/images/flags/IE.svg create mode 100644 src/DemoUI/src/Controllers/assets/images/flags/IT.svg create mode 100644 src/DemoUI/src/Controllers/assets/images/flags/NL.svg create mode 100644 src/DemoUI/src/Controllers/assets/images/flags/PT.svg create mode 100644 src/DemoUI/src/Controllers/assets/images/flags/TR.svg create mode 100644 src/DemoUI/src/Controllers/assets/images/logo-pl.svg create mode 100644 src/DemoUI/src/Controllers/assets/images/logo.png create mode 100644 src/DemoUI/src/Controllers/assets/images/logo.svg create mode 100644 src/DemoUI/src/Repository/AssetsRepository.php create mode 100644 src/DemoUI/src/Repository/SessionRepository.php create mode 100644 src/DemoUI/src/Services/BusinessLogic/CarrierService.php create mode 100644 src/DemoUI/src/Services/BusinessLogic/ConfigurationService.php create mode 100644 src/DemoUI/src/Services/BusinessLogic/ShopOrderService.php create mode 100644 src/DemoUI/src/Services/Infrastructure/LoggerService.php create mode 100644 src/DemoUI/src/Views/index.php diff --git a/src/DemoUI/composer.json b/src/DemoUI/composer.json new file mode 100755 index 00000000..4dadf9bd --- /dev/null +++ b/src/DemoUI/composer.json @@ -0,0 +1,21 @@ +{ + "name": "packlink/demo-ui", + "description": "Packlink Demo UI core library", + "type": "library", + "license": "proprietary", + "require": { + "php": ">=5.3.29" + }, + "autoload": { + "psr-4": { + "Logeecom\\Infrastructure\\": "../Infrastructure", + "Packlink\\BusinessLogic\\": "../BusinessLogic", + "Packlink\\DemoUI\\": "src" + } + }, + "config": { + "platform": { + "php": "5.3.29" + } + } +} diff --git a/src/DemoUI/composer.lock b/src/DemoUI/composer.lock new file mode 100644 index 00000000..4e0b565f --- /dev/null +++ b/src/DemoUI/composer.lock @@ -0,0 +1,22 @@ +{ + "_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", + "This file is @generated automatically" + ], + "content-hash": "2157e45d141336963654f2cb2627846c", + "packages": [], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=5.3.29" + }, + "platform-dev": [], + "platform-overrides": { + "php": "5.3.29" + } +} diff --git a/src/DemoUI/src/Bootstrap.php b/src/DemoUI/src/Bootstrap.php new file mode 100644 index 00000000..630001f2 --- /dev/null +++ b/src/DemoUI/src/Bootstrap.php @@ -0,0 +1,183 @@ +jsonSerializer = new JsonSerializer(); + $this->httpClientService = new CurlHttpClient(); + $this->loggerService = new LoggerService(); + $this->configService = ConfigurationService::getInstance(); + $this->shopOrderService = new ShopOrderService(); + $this->carrierService = new CarrierService(); + $this->userAccountService = UserAccountService::getInstance(); + + static::$instance = $this; + } + + /** + * Initializes infrastructure services and utilities. + */ + protected static function initServices() + { + parent::initServices(); + + static::$instance->initInstanceServices(); + } + + /** + * Initializes repositories. + * + * @throws RepositoryClassException + */ + protected static function initRepositories() + { + parent::initRepositories(); + + RepositoryRegistry::registerRepository(Process::CLASS_NAME, SessionRepository::getClassName()); + RepositoryRegistry::registerRepository(ConfigEntity::CLASS_NAME, SessionRepository::getClassName()); + RepositoryRegistry::registerRepository(QueueItem::CLASS_NAME, MemoryQueueItemRepository::getClassName()); + RepositoryRegistry::registerRepository(Schedule::CLASS_NAME, SessionRepository::getClassName()); + RepositoryRegistry::registerRepository(OrderShipmentDetails::CLASS_NAME, SessionRepository::getClassName()); + RepositoryRegistry::registerRepository(ShippingMethod::CLASS_NAME, SessionRepository::getClassName()); + RepositoryRegistry::registerRepository(Entity::CLASS_NAME, SessionRepository::getClassName()); + RepositoryRegistry::registerRepository(LogData::CLASS_NAME, SessionRepository::getClassName()); + RepositoryRegistry::registerRepository(OrderSendDraftTaskMap::CLASS_NAME, SessionRepository::getClassName()); + } + + /** + * Initializes instance services. + */ + protected function initInstanceServices() + { + $instance = static::$instance; + + ServiceRegister::registerService( + Serializer::CLASS_NAME, + function () use ($instance) { + return $instance->jsonSerializer; + } + ); + + ServiceRegister::registerService( + ShopLoggerAdapter::CLASS_NAME, + function () use ($instance) { + return $instance->loggerService; + } + ); + + ServiceRegister::registerService( + Configuration::CLASS_NAME, + function () use ($instance) { + return $instance->configService; + } + ); + + ServiceRegister::registerService( + HttpClient::CLASS_NAME, + function () use ($instance) { + return $instance->httpClientService; + } + ); + + ServiceRegister::registerService( + ShopOrderServiceInterface::CLASS_NAME, + function () use ($instance) { + return $instance->shopOrderService; + } + ); + + ServiceRegister::registerService( + ShopShippingMethodService::CLASS_NAME, + function () use ($instance) { + return $instance->carrierService; + } + ); + + ServiceRegister::registerService( + UserAccountService::CLASS_NAME, + function () use ($instance) { + return $instance->userAccountService; + } + ); + } +} \ No newline at end of file diff --git a/src/DemoUI/src/Controllers/AutoConfigureController.php b/src/DemoUI/src/Controllers/AutoConfigureController.php new file mode 100644 index 00000000..106e0cb7 --- /dev/null +++ b/src/DemoUI/src/Controllers/AutoConfigureController.php @@ -0,0 +1,25 @@ + $controller->start(true))); + } +} \ No newline at end of file diff --git a/src/DemoUI/src/Controllers/DashboardController.php b/src/DemoUI/src/Controllers/DashboardController.php new file mode 100644 index 00000000..83b9443e --- /dev/null +++ b/src/DemoUI/src/Controllers/DashboardController.php @@ -0,0 +1,22 @@ +handleAction(); \ No newline at end of file diff --git a/src/DemoUI/src/Controllers/LoginController.php b/src/DemoUI/src/Controllers/LoginController.php new file mode 100644 index 00000000..85be4213 --- /dev/null +++ b/src/DemoUI/src/Controllers/LoginController.php @@ -0,0 +1,24 @@ +getQuery('api_key'); + + return !empty($apiKey); + } +} \ No newline at end of file diff --git a/src/DemoUI/src/Controllers/Models/Request.php b/src/DemoUI/src/Controllers/Models/Request.php new file mode 100644 index 00000000..3d8675ac --- /dev/null +++ b/src/DemoUI/src/Controllers/Models/Request.php @@ -0,0 +1,75 @@ +query = $query; + $this->payload = $payload; + $this->headers = $headers; + } + + /** + * @param string|null $key + * + * @return array + */ + public function getQuery($key = null) + { + if ($key != null && isset($this->query[$key])) { + return $this->query[$key]; + } + + return $this->query; + } + + /** + * @return array + */ + public function getPayload() + { + return $this->payload; + } + + /** + * @param string|null $key + * + * @return array + */ + public function getHeaders($key = null) + { + if ($key != null && isset($this->headers[$key])) { + return $this->headers[$key]; + } + + return $this->headers; + } +} \ No newline at end of file diff --git a/src/DemoUI/src/Controllers/OrderStateMappingController.php b/src/DemoUI/src/Controllers/OrderStateMappingController.php new file mode 100644 index 00000000..cf3467e6 --- /dev/null +++ b/src/DemoUI/src/Controllers/OrderStateMappingController.php @@ -0,0 +1,36 @@ +getQueryParams(); + $payload = json_decode(file_get_contents('php://input'), true); + $payload = $payload != null ? $payload : array(); + $headers = getallheaders(); + + $controllerClass = __NAMESPACE__ . '\\' . $controllerName; + $controller = new $controllerClass; + + header('Content-Type: application/json'); + + $controller->$action(new Request($query, $payload, $headers)); + } + + /** + * @return array + */ + private function getQueryParams() + { + $result = array(); + + foreach (array_keys($_GET) as $arrayKey) { + if ($arrayKey !== 'controller' && $arrayKey !== 'action') { + $result[$arrayKey] = $_GET[$arrayKey]; + } + } + + return $result; + } +} \ No newline at end of file diff --git a/src/DemoUI/src/Controllers/ShippingCountriesController.php b/src/DemoUI/src/Controllers/ShippingCountriesController.php new file mode 100644 index 00000000..1a0885ba --- /dev/null +++ b/src/DemoUI/src/Controllers/ShippingCountriesController.php @@ -0,0 +1,20 @@ +Ve(^jx*|7>HtPt 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 + + + + + + + + diff --git a/src/DemoUI/src/Controllers/assets/images/flags/BE.svg b/src/DemoUI/src/Controllers/assets/images/flags/BE.svg new file mode 100644 index 00000000..3120d549 --- /dev/null +++ b/src/DemoUI/src/Controllers/assets/images/flags/BE.svg @@ -0,0 +1,9 @@ + + + + + + + diff --git a/src/DemoUI/src/Controllers/assets/images/flags/DE.svg b/src/DemoUI/src/Controllers/assets/images/flags/DE.svg new file mode 100644 index 00000000..a6f4e17b --- /dev/null +++ b/src/DemoUI/src/Controllers/assets/images/flags/DE.svg @@ -0,0 +1,11 @@ + + + + + + + diff --git a/src/DemoUI/src/Controllers/assets/images/flags/ES.svg b/src/DemoUI/src/Controllers/assets/images/flags/ES.svg new file mode 100644 index 00000000..79d28965 --- /dev/null +++ b/src/DemoUI/src/Controllers/assets/images/flags/ES.svg @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/src/DemoUI/src/Controllers/assets/images/flags/FR.svg b/src/DemoUI/src/Controllers/assets/images/flags/FR.svg new file mode 100644 index 00000000..70954eef --- /dev/null +++ b/src/DemoUI/src/Controllers/assets/images/flags/FR.svg @@ -0,0 +1,11 @@ + + + + + + + diff --git a/src/DemoUI/src/Controllers/assets/images/flags/GB.svg b/src/DemoUI/src/Controllers/assets/images/flags/GB.svg new file mode 100644 index 00000000..0a5347d1 --- /dev/null +++ b/src/DemoUI/src/Controllers/assets/images/flags/GB.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/DemoUI/src/Controllers/assets/images/flags/IE.svg b/src/DemoUI/src/Controllers/assets/images/flags/IE.svg new file mode 100644 index 00000000..fa3ddc10 --- /dev/null +++ b/src/DemoUI/src/Controllers/assets/images/flags/IE.svg @@ -0,0 +1,8 @@ + + + + + + + diff --git a/src/DemoUI/src/Controllers/assets/images/flags/IT.svg b/src/DemoUI/src/Controllers/assets/images/flags/IT.svg new file mode 100644 index 00000000..25e2964b --- /dev/null +++ b/src/DemoUI/src/Controllers/assets/images/flags/IT.svg @@ -0,0 +1,11 @@ + + + + + + + diff --git a/src/DemoUI/src/Controllers/assets/images/flags/NL.svg b/src/DemoUI/src/Controllers/assets/images/flags/NL.svg new file mode 100644 index 00000000..48eb91cd --- /dev/null +++ b/src/DemoUI/src/Controllers/assets/images/flags/NL.svg @@ -0,0 +1,8 @@ + + + + + + + diff --git a/src/DemoUI/src/Controllers/assets/images/flags/PT.svg b/src/DemoUI/src/Controllers/assets/images/flags/PT.svg new file mode 100644 index 00000000..d0c0e366 --- /dev/null +++ b/src/DemoUI/src/Controllers/assets/images/flags/PT.svg @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/src/DemoUI/src/Controllers/assets/images/flags/TR.svg b/src/DemoUI/src/Controllers/assets/images/flags/TR.svg new file mode 100644 index 00000000..06532aec --- /dev/null +++ b/src/DemoUI/src/Controllers/assets/images/flags/TR.svg @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/src/DemoUI/src/Controllers/assets/images/logo-pl.svg b/src/DemoUI/src/Controllers/assets/images/logo-pl.svg new file mode 100644 index 00000000..29f5b586 --- /dev/null +++ b/src/DemoUI/src/Controllers/assets/images/logo-pl.svg @@ -0,0 +1,97 @@ + +image/svg+xml + + + + + + + + + \ No newline at end of file diff --git a/src/DemoUI/src/Controllers/assets/images/logo.png b/src/DemoUI/src/Controllers/assets/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8bc79007659acf2eb12460bda8e4641e4dfe63cc GIT binary patch literal 2738 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 GG~-{m5w%7D literal 0 HcmV?d00001 diff --git a/src/DemoUI/src/Controllers/assets/images/logo.svg b/src/DemoUI/src/Controllers/assets/images/logo.svg new file mode 100644 index 00000000..4e9642e1 --- /dev/null +++ b/src/DemoUI/src/Controllers/assets/images/logo.svg @@ -0,0 +1,17 @@ + + + + + Created by potrace 1.15, written by Peter Selinger 2001-2017 + + + + + diff --git a/src/DemoUI/src/Repository/AssetsRepository.php b/src/DemoUI/src/Repository/AssetsRepository.php new file mode 100644 index 00000000..48532241 --- /dev/null +++ b/src/DemoUI/src/Repository/AssetsRepository.php @@ -0,0 +1,20 @@ +getUrl('images/carriers/carrier.jpg'); + } + + /** + * Adds / Activates shipping method in shop integration. + * + * @param ShippingMethod $shippingMethod Shipping method. + * + * @return bool TRUE if activation succeeded; otherwise, FALSE. + */ + public function add(ShippingMethod $shippingMethod) + { + return true; + } + + /** + * Updates shipping method in shop integration. + * + * @param ShippingMethod $shippingMethod Shipping method. + */ + public function update(ShippingMethod $shippingMethod) + { + } + + /** + * Deletes shipping method in shop integration. + * + * @param ShippingMethod $shippingMethod Shipping method. + * + * @return bool TRUE if deletion succeeded; otherwise, FALSE. + */ + public function delete(ShippingMethod $shippingMethod) + { + return true; + } + + /** + * Adds backup shipping method based on provided shipping method. + * + * @param ShippingMethod $shippingMethod + * + * @return bool TRUE if backup shipping method is added; otherwise, FALSE. + */ + public function addBackupShippingMethod(ShippingMethod $shippingMethod) + { + return true; + } + + /** + * Deletes backup shipping method. + * + * @return bool TRUE if backup shipping method is deleted; otherwise, FALSE. + */ + public function deleteBackupShippingMethod() + { + return true; + } +} diff --git a/src/DemoUI/src/Services/BusinessLogic/ConfigurationService.php b/src/DemoUI/src/Services/BusinessLogic/ConfigurationService.php new file mode 100644 index 00000000..1c889621 --- /dev/null +++ b/src/DemoUI/src/Services/BusinessLogic/ConfigurationService.php @@ -0,0 +1,136 @@ +trackingCodes)) { + return; + } + } + + /** + * @inheritDoc + */ + public function updateShipmentStatus($orderId, $shippingStatus) + { + + } +} diff --git a/src/DemoUI/src/Services/Infrastructure/LoggerService.php b/src/DemoUI/src/Services/Infrastructure/LoggerService.php new file mode 100644 index 00000000..af362df5 --- /dev/null +++ b/src/DemoUI/src/Services/Infrastructure/LoggerService.php @@ -0,0 +1,24 @@ + + + + +
Main page
+ + + \ No newline at end of file From a11bafb4e390ae6e97c3f4a42c920da4a4e7d78e Mon Sep 17 00:00:00 2001 From: "igor.pesic" Date: Mon, 25 May 2020 13:38:17 +0200 Subject: [PATCH 004/214] Add controllers, services and repositories Issue: PLCR1801-6 --- src/DemoUI/src/Views/index.php | 87 ---------------------------------- 1 file changed, 87 deletions(-) delete mode 100644 src/DemoUI/src/Views/index.php diff --git a/src/DemoUI/src/Views/index.php b/src/DemoUI/src/Views/index.php deleted file mode 100644 index 376e7931..00000000 --- a/src/DemoUI/src/Views/index.php +++ /dev/null @@ -1,87 +0,0 @@ - - - - -
Main page
- - - \ No newline at end of file From 80a5beadccfe30981fb946eaa28008f051b824d2 Mon Sep 17 00:00:00 2001 From: "igor.pesic" Date: Tue, 26 May 2020 16:42:08 +0200 Subject: [PATCH 005/214] Implement base start page Issue: PLCR1801-7 --- .gitignore | 5 +- src/DemoUI/Lib/Composer.php | 64 + src/DemoUI/composer.json | 5 + .../src/Controllers/ResolverController.php | 2 +- .../Controllers/ShippingMethodsController.php | 4 +- .../src/Repository/AssetsRepository.php | 20 - .../Services/BusinessLogic/CarrierService.php | 6 +- .../src/Services/Integration/UrlService.php | 42 + src/DemoUI/src/Views/index.php | 1218 +++++++++++ src/DemoUI/src/Views/resources/css/index.css | 1865 +++++++++++++++++ 10 files changed, 3204 insertions(+), 27 deletions(-) create mode 100644 src/DemoUI/Lib/Composer.php delete mode 100644 src/DemoUI/src/Repository/AssetsRepository.php create mode 100644 src/DemoUI/src/Services/Integration/UrlService.php create mode 100644 src/DemoUI/src/Views/index.php create mode 100644 src/DemoUI/src/Views/resources/css/index.css diff --git a/.gitignore b/.gitignore index 0cfb716b..176bb1bd 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,7 @@ !.idea/inspectionProfiles # Custom content -vendor \ No newline at end of file +vendor +/src/DemoUI/src/Views/resources/js/ +/src/DemoUI/src/Views/resources/images/ +/src/DemoUI/src/Views/resources/css/location/ diff --git a/src/DemoUI/Lib/Composer.php b/src/DemoUI/Lib/Composer.php new file mode 100644 index 00000000..389ba432 --- /dev/null +++ b/src/DemoUI/Lib/Composer.php @@ -0,0 +1,64 @@ + $toBase . 'js', + $fromBase . 'LocationPicker/js' => $toBase . 'js/location', + $fromBase . 'LocationPicker/css' => $toBase . 'css/location', + $fromBase . 'img' => $toBase . 'images', + $fromBase . 'img/carriers' => $toBase . 'images/carriers', + ); + + foreach ($map as $from => $to) { + self::copyDirectory($from, $to); + } + } + + /** + * Copies directory. + * + * @param string $src + * @param string $dst + */ + private static function copyDirectory($src, $dst) + { + $dir = opendir($src); + self::mkdir($dst); + + while (false !== ($file = readdir($dir))) { + if (($file !== '.') && ($file !== '..')) { + if (is_dir($src . '/' . $file)) { + self::mkdir($dst . '/' . $file); + + self::copyDirectory($src . '/' . $file, $dst . '/' . $file); + } else { + copy($src . '/' . $file, $dst . '/' . $file); + } + } + } + + closedir($dir); + } + + /** + * Creates directory. + * + * @param string $destination + */ + private static function mkdir($destination) + { + if (!file_exists($destination) && !mkdir($destination) && !is_dir($destination)) { + throw new RuntimeException(sprintf('Directory "%s" was not created', $destination)); + } + } +} \ No newline at end of file diff --git a/src/DemoUI/composer.json b/src/DemoUI/composer.json index 4dadf9bd..b4360399 100755 --- a/src/DemoUI/composer.json +++ b/src/DemoUI/composer.json @@ -10,9 +10,14 @@ "psr-4": { "Logeecom\\Infrastructure\\": "../Infrastructure", "Packlink\\BusinessLogic\\": "../BusinessLogic", + "Packlink\\DemoUI\\Lib\\": "Lib", "Packlink\\DemoUI\\": "src" } }, + "scripts": { + "post-update-cmd": "Packlink\\DemoUI\\Lib\\Composer::postUpdate", + "post-install-cmd": "Packlink\\DemoUI\\Lib\\Composer::postUpdate" + }, "config": { "platform": { "php": "5.3.29" diff --git a/src/DemoUI/src/Controllers/ResolverController.php b/src/DemoUI/src/Controllers/ResolverController.php index 6647c40f..5009b771 100644 --- a/src/DemoUI/src/Controllers/ResolverController.php +++ b/src/DemoUI/src/Controllers/ResolverController.php @@ -23,7 +23,7 @@ public function handleAction() $payload = $payload != null ? $payload : array(); $headers = getallheaders(); - $controllerClass = __NAMESPACE__ . '\\' . $controllerName; + $controllerClass = __NAMESPACE__ . '\\' . $controllerName . 'Controller'; $controller = new $controllerClass; header('Content-Type: application/json'); diff --git a/src/DemoUI/src/Controllers/ShippingMethodsController.php b/src/DemoUI/src/Controllers/ShippingMethodsController.php index 4d9767e5..3e66b2e7 100644 --- a/src/DemoUI/src/Controllers/ShippingMethodsController.php +++ b/src/DemoUI/src/Controllers/ShippingMethodsController.php @@ -15,7 +15,7 @@ class ShippingMethodsController */ public function getAll(Request $request) { - + echo json_encode(array()); } /** @@ -23,7 +23,7 @@ public function getAll(Request $request) */ public function getTaskStatus(Request $request) { - + echo json_encode(array('status' => 'completed')); } /** diff --git a/src/DemoUI/src/Repository/AssetsRepository.php b/src/DemoUI/src/Repository/AssetsRepository.php deleted file mode 100644 index 48532241..00000000 --- a/src/DemoUI/src/Repository/AssetsRepository.php +++ /dev/null @@ -1,20 +0,0 @@ -getUrl('images/carriers/carrier.jpg'); + return $assetsRepo->getAssetsUrl('images/carriers/carrier.jpg'); } /** diff --git a/src/DemoUI/src/Services/Integration/UrlService.php b/src/DemoUI/src/Services/Integration/UrlService.php new file mode 100644 index 00000000..3ea67848 --- /dev/null +++ b/src/DemoUI/src/Services/Integration/UrlService.php @@ -0,0 +1,42 @@ +schema = empty($_SERVER['HTTPS']) ? 'http' : 'https'; + } + + /** + * @param $controllerName + * @param $action + * + * @return string + */ + public function getEndpointUrl($controllerName, $action) + { + + return "{$this->schema}://{$_SERVER['HTTP_HOST']}/Controllers/Index.php?controller={$controllerName}&action={$action}"; + } + + /** + * @param $filePath + * + * @return string + */ + public function getAssetsUrl($filePath) + { + return "{$this->schema}}://{$_SERVER['HTTP_HOST']}/Controllers/assets/{$filePath}"; + } +} \ No newline at end of file diff --git a/src/DemoUI/src/Views/index.php b/src/DemoUI/src/Views/index.php new file mode 100644 index 00000000..3bbb1c6e --- /dev/null +++ b/src/DemoUI/src/Views/index.php @@ -0,0 +1,1218 @@ + + + + + Demo UI + + + + +
+
+ +
+
+
+ +
+
+
+ +
+ + + +
+ + +
+
+
+
+
+
+
+
+ + +
+ +
+
+
+
+ Map order statuses +
+
+
+
+ Default warehouse +
+
+
+
+ Default parcel +
+
+
+ +
+
+
+
+
+ Set default parcel +
+
+
+
+ We will use the default parcel in case any item has not defined dimensions and weight. + You can edit anytime. +
+
+
+
+
+
+
+ + + Weight (kg) + +
+
+
+
+
+
+ + + Length (cm) + +
+
+ + + Width (cm) + +
+
+ + + Height (cm) + +
+
+
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+ Set default warehouse +
+
+
+
+ We will use the default Warehouse address as your sender address. You can edit anytime. +
+
+
+
+
+
+
+ + + Warehouse name + +
+
+
+
+
+
+ + + Contact person name + +
+
+
+
+
+
+ + + Contact person surname + +
+
+
+
+
+
+ + + Company name + +
+
+
+
+
+
+ + + Country + +
+
+
+
+
+
+ + + City or postal code + + + + + + + + + + +
+
+
+
+
+
+ + + Address + +
+
+
+
+
+
+ + + Phone number + +
+
+
+
+
+
+ + + Email + +
+
+
+
+
+ +
+
+
+
+
+
+
+ +
+ + + +
+ + + + + + + + + + + +
+
+
+
+ + + + + + + +
+
+ x +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+
+
+ +
+
+
+ Filter services +
+
+
+
+ Type +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ Delivery type +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ Parcel origin +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ + Parcel destination +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+ + + + + + + +
+
+
+
+
+
+
+
+ Add service title +
+
+
+
+
+
+
+
+ This title will be visible to your customers +
+
+
+
+
+ + + Service title + +
+
+ +
+
+ +
+
+
+
+ Service availability per destination country +
+
+
+
+
+
+
+ +
+ + See countries list + +
+
+
+
+
+
+
+
+
+ Select pricing policy +
+
+
+
+
+
+
+
+ Choose the pricing policy to show your customers +
+
+
+
+
+ +
+
+
+ +
+ +
+
+
+
+
+
+ + +
+
+
+ + + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+
+
+

+

+

+ Packlink prices +

+

+ Packlink percent +

+

+ Fixed prices based on total weight +

+

+ Fixed prices based on total price +

+
+ + +
+ National +
+
+ International +
+
+
+
+ + + + + + + + + + Collection +
+
+ + + + + + + + + + Drop off +
+
+
+
+ + + + +
+
+
+
+ + + + + + + + + + Delivery +
+
+ + + + + + + + + + Pick up +
+
+
+ + Configure + +
+ +
+
+
+
+ All shipping services +
+
+ Selected shipping services +
+
+
+
+ +
+ + + + + + + + + + + + + + + + +
+ SELECT + + SHIPPING SERVICES + + CARRIER + + TRANSIT TIME + + TYPE + + ORIGIN + + DESTINATION +
+
+ +
+
+ Showing + results +
+
+ + + +
+
+
+ Please add price for each weight criteria +
+
+ +
+
+
+
+
+
+ + Add price +
+
+
+
+ +
+
+
+
+
+ + + FROM (kg) +
+
+ + + TO (kg) +
+
+ + + PRICE (€) +
+
+ + + + + + +
+
+
+
+
+ +
+
+
+ Please add price for each price criteria +
+
+ +
+
+
+
+
+
+ + Add price +
+
+
+
+ +
+
+
+
+
+ + + FROM (€) +
+
+ + + TO (€) +
+
+ + + PRICE (€) +
+
+ + + + + + +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+ Map order statuses +
+
+
+
+ Packlink offers you the possibility to update your Magento order status with the shipping info. You can edit anytime. +
+
+
+
+ Packlink PRO Shipping Status +
+
+
+
+ Magento Order Status +
+
+ 'Pending', + 'processing' => 'Processing', + 'readyForShipping' => 'Ready for shipping', + 'inTransit' => 'In transit', + 'delivered' => 'Delivered', + ); + foreach ($statuses as $key => $label) { ?> +
+
+ +
+
+ = +
+
+ +
+
+ +
+ +
+
+
+ + + +
+
+
+
+ + + +
+
+ Select allowed destination countries for this service +
+
+ +
+
+ + +
+
+
+
+ +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/DemoUI/src/Views/resources/css/index.css b/src/DemoUI/src/Views/resources/css/index.css new file mode 100644 index 00000000..61f186d1 --- /dev/null +++ b/src/DemoUI/src/Views/resources/css/index.css @@ -0,0 +1,1865 @@ +.pl-main-wrapper { + position: relative; + clear: both; + padding: 0 !important; + margin: -20px 0 0; + min-height: 500px; + border: 1px solid #dfdfdf; +} + +.pl-header-wrapper { + height: 80px; + background-color: white; + padding: 0 !important; + border-bottom: 1px solid #dcdcdc; +} + +.pl-header-row { + margin: 0 !important; +} + +.pl-logo-wrapper { + width: 100%; + padding: 20px; + box-sizing: border-box; +} + +.pl-dashboard-logo { + width: 100%; +} + +.pl-page-wrapper { + display: flex; + height: 100%; +} + +.pl-sidebar-wrapper { + position: relative; + background-color: #f5f5f5; + border-right: 1px solid #dcdcdc; + max-width: 250px; + width: 18%; + height: 100%; +} + +.pl-content-wrapper { + height: 100%; + background-color: white; + padding-top: 20px; + flex-grow: 1; + position: relative; + box-sizing: border-box; +} + +.pl-content-wrapper .row { + margin: 0 !important; +} + +.pl-content-wrapper > .row { + height: 100% !important; + box-sizing: border-box; +} + +.pl-content-wrapper-panel { + padding: 0 10px 0 20px; + height: 100%; + position: relative; + box-sizing: border-box; +} + +.pl-content-wrapper-panel > .row { + height: 100%; +} + +.pl-sidebar-link-wrapper { + text-align: center; + min-height: 50px; + padding: 0 !important; + cursor: pointer; + color: #5d5d5d; + display: flex; + position: relative; +} + +.pl-sidebar-link-wrapper * { + pointer-events: none !important; +} + +.pl-sidebar-link-wrapper-line { + height: 29px; + margin-bottom: 25px; + border-bottom: 1px solid; + display: flex; + position: absolute; + width: 100%; +} + +.pl-sidebar-link-wrapper-inner { + padding: 5px; + background: whitesmoke; + vertical-align: middle; + margin: auto; + position: relative; + text-align: center; +} + +.pl-sidebar-link-wrapper-inner * { + display: inline; +} + +.pl-sidebar-link-wrapper:hover, .pl-sidebar-link-wrapper.selected { + color: #2095F2; +} + +.pl-sidebar-link-wrapper-inner svg { + position: relative; + fill: #5d5d5d; + margin-right: 5px; + transform: translateY(20%); +} + +.pl-sidebar-link.selected .pl-icon, .pl-sidebar-link-wrapper.selected .pl-icon, +.pl-sidebar-link-wrapper:hover .pl-icon { + fill: #2095F2; +} + +.pl-sidebar-link-wrapper .pl-icon { + fill: #5d5d5d; +} + +.pl-sidebar-line { + margin: 0 !important; +} + +.pl-sidebar-text-wrapper { + font-size: 15px; + text-transform: uppercase; +} + +.pl-sidebar-text-wrapper svg { + margin-right: 5px; + transform: translateY(20%); +} + +.pl-sidebar-subitem-wrapper { + margin-bottom: 20px; + color: #5d5d5d; + line-height: 25px; + padding: 0 20px 0 25px; + cursor: pointer; + font-size: 14px +} + +.pl-sidebar-subitem-wrapper:hover { + color: #2095F2; +} + +.pl-sidebar-subitem-wrapper * { + pointer-events: none; +} + +.pl-sidebar-subitem-wrapper.selected { + background-color: #dcdcdc; + color: #2095F2; +} + +.pl-filter-wrapper { + -webkit-box-flex: 0; + -ms-flex: 0 0 16.66667%; + flex: 0 0 16.66667%; + width: 16.66667%; + height: 100%; + padding-top: 5px; + padding-right: 10px; + float: left; + box-sizing: border-box; +} + +.pl-filter-method-tile { + padding: 0 !important; + font-size: 14px; + color: #5d5d5d; +} + +.pl-filter-method { + padding: 10px 0 5px; + font-size: 14px; + color: #5d5d5d; +} + +.pl-filter-method-item { + padding: 0 !important; + margin-bottom: 10px; +} + +.pl-filter-method-item label { + color: #5d5d5d; + font-weight: normal; +} + +.pl-methods-tab-wrapper { + -webkit-box-flex: 0; + -ms-flex: 0 0 83.33333%; + flex: 0 0 83.33333%; + width: 83.33333%; + margin: 0 !important; + padding: 0 !important; + height: 100%; + float: left; +} + +.pl-nav-wrapper { + padding: 0 !important; + display: flex; +} + +.pl-nav-item { + height: 30px; + line-height: 30px; + padding: 0 !important; + margin-right: 30px; + font-size: 16px; + font-weight: normal; + color: #5d5d5d; + cursor: pointer; + border-bottom: 3px solid transparent; +} + +.pl-nav-item * { + pointer-events: none; +} + +.pl-nav-item:hover { + color: #2095F2; +} + +.pl-nav-item.selected { + color: #2095F2; + font-weight: bold; + border-bottom: 3px solid #2095F2; +} + +.pl-num-shipping-method-results-wrapper { + padding: 0 !important; + height: 60px; + line-height: 60px; + color: #5d5d5d; + font-size: 12px; +} + +.pl-shipping-services-message { + text-align: center; + z-index: 1000 !important; + margin-top: 30px; + font-size: 1.3rem; + color: black; + position: relative; +} + +.pl-shipping-services-message div { + margin-bottom: 20px; +} + +.pl-shipping-services-message .title { + font-size: 3rem; +} + +.pl-shipping-services-message .subtitle { + font-size: 2rem; +} + +.pl-shipping-services-message .pl-spinner { + position: relative; + display: flex; +} + +.hidden { + display: none !important; +} + +.pl-table-wrapper { + padding: 0 !important; + height: calc(100% - 100px); + overflow-x: hidden; + overflow-y: auto; +} + +.pl-table { + width: 100%; + border-collapse: separate; +} + +.pl-table-header-wrapper { + height: 60px; + padding: 0 !important; + border-bottom: 1px solid #3595f2; + border-right: 2px solid #dcdcdc; +} + +.pl-table-header-wrapper th { + height: 60px; + padding: 0 5px !important; + color: #5d5d5d !important; + font-weight: bold !important; + background-color: white; + position: sticky; + position: -webkit-sticky; /* Safari fallback */ + top: 0; + z-index: 400; + vertical-align: middle !important; + font-size: 12px; + word-break: break-word; + text-transform: uppercase; + text-align: left; +} + +.pl-table-row-wrapper { + height: 75px; + box-sizing: border-box; +} + +.pl-table-row-wrapper td, .pl-table-header-wrapper th { + border-top: 1px solid #dcdcdc !important; +} + +.pl-table-header-wrapper > th:first-child, .pl-table-row-wrapper > td:first-child { + border-left: 1px solid #dcdcdc !important; +} + +.pl-table-header-wrapper > th:last-child, .pl-table-row-wrapper > td:last-child { + color: #2095F2 !important; + border-right: 1px solid #dcdcdc !important; +} + +.pl-table-header-wrapper th { + border-bottom: 1px solid #dcdcdc; +} + +.pl-table-row-method-title h2 { + margin: 0 0 10px 0 !important; + padding: 0 !important; + color: #5d5d5d !important; + font-size: 14px; + font-weight: bold; +} + +.pl-table-row-method-title p { + margin: 0 !important; + padding: 0 !important; + color: #5d5d5d !important; + font-size: 10px; +} + +.pl-table-row-method-select, .pl-table-row-method-select *, .pl-table-row-method-logo, +.pl-table-row-method-delivery-type, .pl-table-row-method-type, +.pl-table-header-select, .pl-table-header-transit, .pl-table-header-carrier, +.pl-table-header-type, .pl-table-header-origin, .pl-table-header-destination { + text-align: center !important; +} + +.pl-tbody tr.pl-table-row-wrapper:last-child td { + border-bottom: 1px solid #dcdcdc !important; +} + +.pl-tbody tr:first-child td { + border-top: none !important; +} + +.pl-tbody tr, +.pl-tbody td { + border-collapse: separate; +} + +.pl-price-indicator { + display: none; +} + +.pl-price-indicator.selected { + display: block; +} + +.pl-method-logo { + max-height: 40px; + max-width: 100px; +} + +.pl-method-pudo-icon-wrapper { + text-align: center !important; + color: #5d5d5d !important; + font-size: 10px !important; + max-width: 100px; + line-height: 15px; + margin: auto; +} + +.pl-method-pudo-icon-wrapper .pl-pudo-pickup { + display: none; +} + +.pl-method-pudo-icon-wrapper.pl-pickup .pl-pudo-dropoff { + display: none; +} + +.pl-method-pudo-icon-wrapper.pl-pickup .pl-pudo-pickup { + display: block; +} + +.pl-pudo-pickup svg { + display: block; + margin: auto; +} + +.pl-pudo-dropoff svg { + display: block; + margin: auto; +} + +.pl-table-row-arrow-wrapper { + width: 40px !important; +} + +.pl-table-row-arrow svg { + fill: #2095F2 !important; + padding-left: 20px; +} + +.pl-dashboard-modal-wrapper { + position: absolute; + top: -20px; + bottom: 0; + left: 0; + right: 0; + padding: 20px; + background-color: rgba(0, 0, 0, 0.4); + z-index: 450; + display: flex; + align-items: center; + justify-content: center; +} + +.pl-dashboard-modal-wrapper.hidden { + display: none !important; +} + +.pl-dashboard-modal { + background: white; + color: #d5d5d5; + display: flex; + flex-flow: column; + align-items: center; + padding: 20px 70px; + border-radius: 5px; + position: relative; + margin: 0 auto; + height: 100%; +} + +.pl-increased-padding { + padding-top: 60px; +} + +.pl-modal-button-wrapper { + padding: 0 70px 10px 70px; + position: absolute; + bottom: 0; + width: 100%; + border-top: 1px solid; +} + +.pl-modal-button-wrapper > button { + float: right; +} + +.pl-button-separator { + margin-right: 10px !important; +} + +.pl-close-modal-btn { + position: absolute; + top: 20px; + right: 20px; + cursor: pointer; + color: #5d5d5d; +} + +.pl-close-modal-btn:hover { + color: #2095f2; +} +.pl-disable-methods-modal { + position: absolute; + max-width: 550px; + height: 230px; + border-radius: 5px; + border: 1px #d5d5d5 solid; + box-sizing: border-box; + padding: 20px 70px; +} + +.pl-configure-shipping-method-wrapper { + padding: 0 !important; + box-sizing: content-box; +} + +.pl-configure-shipping-method-wrapper td { + padding: 0 !important; + box-sizing: border-box; + background-color: #f5f5f5 !important; + position: relative; + z-index: 200; + animation: pl-fade-in 0.5s ease; + border: 1px solid #2095F2 !important; +} + +.pl-configure-shipping-method-form-wrapper { + padding: 20px 20px 0 20px !important; + border-bottom: 1px solid #dcdcdc; +} + +.pl-configure-shipping-method-form-wrapper:after, +.pl-configure-shipping-method-form-wrapper:before { + content: ''; + display: block; + position: absolute; + left: 100%; + width: 0; + height: 0; + border-style: solid; + z-index: 1 !important; +} + +.pl-configure-shipping-method-form-wrapper:after { + top: -19px; + left: 15%; + border-color: transparent transparent #f5f5f5 transparent; + border-width: 10px; +} + +.pl-configure-shipping-method-form-wrapper:before { + top: -22px; + left: calc(15% - 1px); + border-color: transparent transparent #2095F2 transparent; + border-width: 11px; +} + +.pl-shipping-method-form { + padding: 0 !important; +} + +.pl-form-section-wrapper { + padding: 0 0 30px 0 !important; + box-sizing: border-box; + width: 49%; + display: inline-table; +} + +.pl-shipping-method-form > div:nth-child(1) { + padding-right: 10px !important; +} + +.pl-shipping-method-form > div:nth-child(2) { + padding-left: 10px !important; +} + +.pl-form-section-title-wrapper { + padding: 0 !important; + height: 20px !important; + line-height: 20px !important; + margin-bottom: 20px; +} + +.pl-configure-shipping-method-button-wrapper { + text-align: right; + padding: 10px 20px !important; +} + +.pl-configure-shipping-method-button-wrapper button { + margin: 0 0 0 15px !important; +} + +.pl-form-section-title-wrapper { + display: flex; +} + +.pl-form-section-title { + height: 20px; + line-height: 20px; + font-size: 16px; + color: #5d5d5d; +} + +.pl-form-section-title-line { + height: 20px; + padding-top: 10px; + padding-left: 10px; + flex-grow: 1; +} + +.pl-form-section-title-line hr { + border: 1px solid #dcdcdc; + margin: 0 !important; + padding: 0 !important; +} + +.pl-form-selection-help-button-wrapper { + margin: 0 !important; + padding: 0 !important; + height: 20px; + width: 20px; + text-align: center; + line-height: 20px; + color: #2095F2; + border: 1px solid #2095F2; + border-radius: 50%; + cursor: pointer !important; +} + +.pl-tooltip { + position: relative; + display: inline-block; +} + +.pl-tooltip:hover .pl-tooltip-concrete { + visibility: visible !important; + opacity: 1 !important; +} + +.pl-tooltip-concrete { + box-sizing: border-box; + width: 140px; + padding: 15px; + position: absolute; + background-color: white; + color: #5d5d5d; + font-size: 12px !important; + line-height: 14px !important; + font-weight: normal; + text-align: left !important; + border-radius: 3px; + border: 1px solid #dcdcdc; + z-index: 1; + visibility: hidden; + opacity: 0; + transition: visibility 0.3s linear, opacity 0.3s linear; +} + +.pl-tooltip-left { + top: 50%; + transform: translateY(-50%); + bottom: auto; + left: -155px; +} + +.pl-tooltip-left:before, +.pl-tooltip-left:after { + content: ''; + display: block; + position: absolute; + left: 100%; + width: 0; + height: 0; + border-style: solid; +} + +.pl-tooltip-left:after { + top: calc(50% - 5px); + border-color: transparent transparent transparent white; + border-width: 6px; +} + +.pl-tooltip-left:before { + top: calc(50% - 6px); + border-color: transparent transparent transparent #dcdcdc; + border-width: 7px; +} + +.pl-form-section-subtitle-wrapper { + margin: 0 !important; + padding: 0 !important; + height: 20px; + line-height: 12px; + color: #5d5d5d; + font-size: 12px; +} + +.pl-title-carrier-logo { + margin-top: 10px !important; +} + +.pl-shipping-countries { + margin-top: 20px !important; +} + +.pl-destination-countries-selector { + width: 100%; + border: 2px solid #dcdcdc; + padding: 10px; +} + +.pl-destination-countries-selector > option{ + font-size: 16px; + color: #5d5d5d; +} + +.pl-form-tax { + margin-top: 10px !important; +} + +.pl-form-section-input-wrapper { + margin: 0; + padding: 0; + color: #5d5d5d; +} + +.pl-text-input-label { + height: 16px; + line-height: 7px; + position: absolute; + top: 22px; + left: 0; + margin-left: 15px; + text-transform: uppercase; + font-size: 17px; + font-weight: bold; + color: #9b9b9b; + pointer-events: none; +} + +#pl-login-api-key-label { + line-height: 17px !important; + margin-left: 25px !important; +} + +.pl-text-input-label.selected { + height: 12px; + line-height: 12px; + position: absolute; + top: 12px; + left: 0; + text-transform: uppercase; + font-size: 12px; + font-weight: bold; + color: #5d5d5d; + pointer-events: none; + transition: all .25s; +} + +.pl-input-search-icon { + position: absolute; + top: 2px; + right: 0; + width: 50px; + height: 48px; + padding: 10px; + box-sizing: border-box; + border-left: 1px solid #dcdcdc; + cursor: pointer; +} + +.pl-input-search-icon * { + pointer-events: none; + -webkit-touch-callout: none; /* iOS Safari */ + -webkit-user-select: none; /* Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* Internet Explorer/Edge */ + user-select: none; +} + +.pl-form-section-input { + position: relative; + border: none; +} + +.pl-form-section-input input { + height: 50px !important; + background-color: white !important; + border-radius: 0 !important; + border: 1px solid #dcdcdc; + padding: 20px 0 0 15px !important; + font-size: 14px; + color: #5d5d5d !important; + width: 100%; + margin: 0; + box-shadow: unset; +} + +.pl-form-section-input input:focus { + border: 1px solid #2095F2 !important; +} + +.pl-form-section-input select { + height: 50px; + line-height: 50px; + padding: 0 0 0 15px; + background-color: white; + color: #5d5d5d; + font-size: 12px; + 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; + color: #5d5d5d; +} + +.pl-checkbox-sub-action { + display: inherit; + color: #2095f2; + margin-left: 25px; + margin-top: 5px; + font-size: 11px; +} + +.pl-checkbox-sub-action > span { + cursor: pointer; +} + +.pl-price-increase-wrapper { + display: flex; +} + +.pl-price-increase-wrapper > .pl-form-section-input { + flex-grow: 1; +} + +.pl-input-price-switch { + padding: 0 !important; + margin: 0 !important; + border: 1px solid #dcdcdc; + height: 50px; + width: 30%; + background-color: white; + text-align: center; + line-height: 50px; + cursor: pointer; +} + +.pl-input-price-switch.selected { + background-color: #2095F2; + border: 1px solid #2095F2; + color: white; +} + +.pl-fixed-price-criteria.first .pl-remove-fixed-price-criteria-btn { + display: none !important; +} + +.pl-fixed-price-add-criteria-button { + cursor: pointer; + min-width: 65px; + display: inline-block; + margin-top: 10px; + color: #2095f2; +} + +.pl-fixed-price-wrapper { + display: flex; +} + +.pl-fixed-price-wrapper .pl-text-input { + width: 33.3%; +} + +.pl-remove-fixed-price-criteria-btn { + margin: auto; +} + +.pl-remove-fixed-price-criteria-btn svg { + cursor: pointer; + padding-left: 8px; +} + +.pl-footer-row { + margin: 1px -1px 0; + padding: 0 10px; + background-color: #f5f5f5; + position: relative; + border: 1px solid #dfdfdf; + border-top: none; +} + +.pl-footer-wrapper { + display: flex; + height: 35px; + line-height: 35px; + justify-content: space-between; + color: #5d5d5d; + font-size: 10px !important; +} + +.pl-footer-copyright-wrapper { + display: flex; + justify-content: space-between; +} + +.pl-footer-copyright-wrapper a, .pl-system-info-open-btn { + color: #2095F2 !important; + margin-right: 10px; +} + +.pl-footer-copyright-wrapper p { + font-size: inherit; +} + + +/* BASIC SETTINGS PAGES */ +.pl-basic-settings-page-wrapper { + padding: 10px 0 0 0 !important; + margin: 0 !important; + height: 100%; + overflow-x: hidden; + overflow-y: auto; +} + +.pl-basic-settings-page-title-wrapper { + padding: 0 !important; + margin: 0 0 20px 0 !important; + height: 20px; + line-height: 20px; + color: #2095F2; + text-transform: uppercase; + font-weight: bold; + font-size: 20px; +} + +.pl-basic-settings-page-description-wrapper { + padding: 0 !important; + margin: 0 0 20px 0 !important; + color: #5d5d5d; + height: 12px; + line-height: 12px; + font-size: 12px; +} + +.pl-basic-settings-page-form-wrapper { + padding: 0 !important; + margin: 0 0 30px 0 !important; +} + +.pl-basic-settings-form-title-wrapper { + padding: 0 !important; + margin: 0 !important; + width: 500px; + display: flex; +} + +.pl-basic-settings-page-form-title { + padding: 0 10px 0 0 !important; + margin: 0 !important; + height: 60px; + line-height: 60px; +} + +.pl-basic-settings-page-form-line { + padding: 30px 0 0 0 !important; + margin: 0 !important; + height: 60px; + flex-grow: 1; +} + +.pl-basic-settings-page-form-line hr { + padding: 0 !important; + margin: 0 !important; + border-color: #dcdcdc; +} + +.pl-basic-settings-page-form-input-item { + padding: 0 !important; + margin: 0 !important; + width: 500px; + position: relative; +} + +.pl-parcel-input { + padding: 0 !important; + margin: 0 !important; +} + +.pl-inline-input { + display: flex; +} + +.pl-parcel-button { + margin: 20px 0 0 0 !important; + padding: 0 !important; +} + +.pl-warehouse-input { + margin-bottom: 15px !important; + width: 500px; +} + +/* DASHBOARD PAGE */ + +.pl-dashboard-page-title-wrapper { + margin: 0; + padding: 0; + font-size: 32px; + color: #5d5d5d; + height: 60px; + line-height: 60px; + +} + +.pl-dashboard-page-subtitle-wrapper { + margin: 0; + padding: 0; + font-size: 14px; + color: #5d5d5d; + height: 30px; + line-height: 30px; +} + +.pl-dashboard-page-step-wrapper { + width: 335px; + margin: 5px 0 !important; + display: flex; + text-align: left; + cursor: pointer; + font-size: 12px; + font-weight: bold; +} + +.pl-dashboard-page-step-wrapper * { + pointer-events: none; +} + +.pl-dashboard-page-step.disabled { + color: #dcdcdc; +} + +.pl-dashboard-page-step.disabled .pl-checked-checkmark { + display: none; +} + +.pl-dashboard-page-step.in-progress .pl-checked-checkmark { + display: none; +} + +.pl-dashboard-page-step.in-progress .pl-step-title { + color: #2095F2; +} + +.pl-dashboard-page-step.completed { + color: #2095F2; +} + +.pl-dashboard-page-step.completed .pl-empty-checkmark { + display: none; +} + +.pl-checkmark { + width: 20px; + margin: 0 10px 0 0; + padding: 4px 0; +} + +.pl-content-wrapper input[type="checkbox"], +.pl-content-wrapper input[type="checkbox"]:before { + -webkit-appearance: none; + vertical-align: middle; + border: 1px solid #b4b9be; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + display: inline-flex; + border-radius: 2px; + height: 21px; + width: 21px; +} + +.pl-content-wrapper input[type="checkbox"]:before { + background-color: #2095F2; + border-color: #2095F2; + color: #fff; +} + +.pl-content-wrapper input[type=checkbox]:checked:before { + content: "\2714"; + font-size: 20px; + line-height: 18px; + display: inline-block; + width: 20px; + height: 19px; + border-radius: 0; +} + +.pl-step-title { + height: 24px; + line-height: 28px; +} + +.pl-login-page { + padding: 0; + margin: 0; + width: 100%; + height: 100%; + display: flex; +} + +.pl-login-image { + width: 100%; +} + +.pl-login-icon { + position: absolute; + width: 14%; +} + +.pl-login-page-side-img-wrapper { + height: 100%; + color: white; +} + +.pl-login-page-content-wrapper { + flex-grow: 1; + display: flex; + justify-content: center; + align-items: center; + position: relative; +} + +.pl-login-form-wrapper { + margin: 0; + padding: 0; + position: relative; + width: 540px; + color: #5d5d5d; +} + +.pl-login-form-header { + margin: 0 0 40px 11px; + color: #545454; +} + +.pl-login-form-title-wrapper { + margin-bottom: 25px; + padding: 0; + font-size: 20px; + font-weight: bold; + line-height: 30px; +} + +.pl-login-form-label-wrapper { + margin-left: 11px; + margin-bottom: 15px; + padding: 0; + font-size: 13px; + text-transform: uppercase; + color: #545454; +} + +.pl-register-form-wrapper { + position: absolute; + top: 0; + right: 0; +} + +.pl-register-btn-section-wrapper { + align-items: center; + text-align: right; + color: #5d5d5d; + font-size: 14px; +} + +.pl-register-country-section-wrapper { + padding: 15px 0; + border: 1px solid #2095f2; + border-radius: 3px; + position: relative; + display: none; + width: 250px; + float: right; + animation: pl-fade-in .5s ease; + max-height: calc(100vh - 240px); + overflow-x: auto; + text-align: justify; + z-index: 1; + background-color: #fff; +} + +.pl-register-country-title-wrapper { + text-align: center; + color: #5d5d5d; +} + +.pl-register-country-list-wrapper { + margin-top: 15px; + height: 97%; +} + +.pl-register-country-list-wrapper a { + text-decoration: none !important; +} + +.pl-country { + display: flex; + height: 35px; + width: 30px; + line-height: 35px; + border-radius: 50%; + text-align: center; + color: #2095f2; + font-size: 14px; + text-transform: uppercase; + margin-bottom: 5px +} + +.pl-country-logo { + width: 60px; + margin-left: 15px; +} + +.pl-country-name { + white-space: nowrap; + margin-left: 15px; +} + +.pl-register-form-close-btn { + height: 20px; + width: 20px; + position: absolute; + top: 5px; + right: 10px; + text-align: center; + line-height: 20px; + cursor: pointer; +} + +/* MAPPING PAGE */ + +.pl-mapping-page-wrapper { + color: #5d5d5d; +} + +.pl-mapping-page-wrapper > div { + display: flex; +} + +.pl-mapping-status-count-label { + width: 100px; + line-height: 50px; +} + +.pl-mapping-page-select-section { + display: inline; + width: 350px; + line-height: 50px; + align-items: center; + text-align: center; + font-size: 14px; +} + +.pl-mapping-page-select-section input { + width: inherit; + padding: 5px +} + +.pl-mapping-page-select-section select { + width: inherit; + padding: 5px; + height: unset; + border: 1px solid #dcdcdc; +} + +.pl-mapping-page-wrapper-equals { + width: 50px; + line-height: 50px; + text-align: center; +} + +/* UTILITY */ + +.pl-full-width { + width: 100%; +} + +.pl-template-section { + display: none; +} + +.pl-autocomplete-list { + position: absolute; + top: 50px; + z-index: 10; + width: 100%; + max-height: 250px; + min-height: 35px; + padding: 0; + background: white; + border: 1px solid #dcdcdc; + overflow-x: hidden; + overflow-y: auto; +} + +.pl-autocomplete-element { + line-height: 35px; + height: 35px; + padding: 0 10px; + font-size: 16px; + color: #5d5d5d; + list-style-type: none; + cursor: pointer; +} + +.pl-autocomplete-element * { + pointer-events: none; +} + +.pl-autocomplete-element.focus { + background-color: #1a77c2; + color: white; +} + +.pl-input-mask { + display: none; + background-color: rgba(255, 255, 255, 0.5); + z-index: 100; + top: 0; + left: 0; + right: 15px; + bottom: 0; + position: absolute; +} + +.pl-spinner { + position: fixed; + z-index: 500; + background-color: rgba(255, 255, 255, 0.7); + display: none; + justify-content: center; + align-items: center; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.pl-spinner div { + width: 100px; + height: 100px; + border: 3px solid transparent; + border-right-color: #2095F2; + border-left-color: #2095F2; + border-radius: 50%; + animation: pl-rotate 1s linear 0s infinite; +} + +.pl-spinner.enabled { + display: flex; +} + +.pl-input-mask.enabled { + display: block; +} + +.pl-table-row-method-type .pl-national { + display: none; +} + +.pl-table-row-method-type.pl-national .pl-national { + display: block; +} + +.pl-table-row-method-type.pl-national .pl-international { + display: none; +} + +.pl-error { + border: 1px solid #C95C6B !important; +} + +.pl-error:hover ~ .pl-error-msg { + display: flex; +} + +.pl-error-msg #pl-error-text { + display: flex; + margin-left: 10px; +} + +.pl-error-msg #pl-error-text::before { + content: " "; + margin-right: 5px; + width: 16px; + height: 16px; + background-image: url("data:image/svg+xml,%3Csvg width='15' height='15' viewBox='0 0 15 15' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cdefs%3E%3Cpath id='b' d='M0 0h372v51H0z'/%3E%3Cfilter x='-.8%25' y='-5.9%25' width='101.6%25' height='111.8%25' filterUnits='objectBoundingBox' id='a'%3E%3CfeOffset in='SourceAlpha' result='shadowOffsetOuter1'/%3E%3CfeGaussianBlur stdDeviation='1' in='shadowOffsetOuter1' result='shadowBlurOuter1'/%3E%3CfeColorMatrix values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0' in='shadowBlurOuter1'/%3E%3C/filter%3E%3C/defs%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg transform='translate(-10 -9)'%3E%3Cuse fill='%23000' filter='url(%23a)' xlink:href='%23b'/%3E%3Cuse fill='%23ED3E3E' xlink:href='%23b'/%3E%3C/g%3E%3Cpath d='M-10-7.003C-10-8.106-9.107-9-7.999-9H360c1.105 0 2.001.892 2.001 1.997V40H-10V-7.003z' fill='%23FFF'/%3E%3Cg fill='%23ED3E3E' fill-rule='nonzero'%3E%3Cpath d='M7.5.085C3.363.085 0 3.448 0 7.585c0 4.136 3.363 7.5 7.5 7.5 4.137 0 7.5-3.364 7.5-7.5 0-4.137-3.363-7.5-7.5-7.5zm0 .937a6.555 6.555 0 0 1 6.563 6.563A6.555 6.555 0 0 1 7.5 14.147 6.555 6.555 0 0 1 .937 7.585 6.555 6.555 0 0 1 7.5 1.022zM4.687 4.07a1.172 1.172 0 1 0 0 2.344 1.172 1.172 0 0 0 0-2.344zm5.625 0a1.172 1.172 0 1 0 0 2.344 1.172 1.172 0 0 0 0-2.344zM7.5 8.522a4.52 4.52 0 0 0-3.662 1.831.47.47 0 0 0 .762.55c.634-.87 1.69-1.443 2.9-1.443s2.266.572 2.9 1.443a.47.47 0 1 0 .762-.55A4.52 4.52 0 0 0 7.5 8.523z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-size: contain; +} + +.pl-help { + color: #2095F2; + padding-left: 20px; + position: absolute; + font-size: 15px; + bottom: 10px; +} + +.pl-contact { + color: #222; + padding: 10px 0 0; +} + +.pl-link { + color: #2095F2 !important; + text-decoration: unset; +} + +.pl-error-msg { + display: none; + position: absolute; + bottom: 120%; + left: 50%; + transform: translateX(-50%); + z-index: 1; + width: calc(100% - 2px); + padding: 5px 0; + border-radius: 3px; + border: 1px solid #e63f3f; + border-bottom: 3px solid #e63f3f; + color: #5d5d5d; + background-color: white; + text-align: left; + font-size: 12px; + animation: pl-fade-in 0.5s ease; +} + +.pl-error-msg:after { + content: ''; + display: block; + position: absolute; + left: 50%; + top: calc(100% + 3px); + transform: translateX(-50%); + width: 0; + height: 0; + border-style: solid; + border-color: #e63f3f transparent transparent transparent; + border-width: 6px; +} + +.pl-error-msg i { + color: #e63f3f; + font-size: 22px; + margin-right: 10px; +} + +.pl-flash-msg-wrapper { + position: absolute; + background-color: #ffffff; + width: 100%; + bottom: -37px; + z-index: 100000; + right: 1px; +} + +.pl-flash-msg { + height: 50px; + width: 100%; + display: none; +} + +.pl-flash-msg.success { + border: 1px solid #56b652; + border-top: 3px solid #56b652; + background-color: #ddf0de; + margin-left: 1px; +} + +.pl-flash-msg.danger { + border: 1px solid #e63f3f; + border-top: 3px solid #e63f3f; + background-color: #ffe0e0; +} + +.pl-flash-msg.warning { + border: 1px solid #ffe100; + border-top: 3px solid #ffe100; + background-color: #f5e9d3; +} + +.pl-flash-msg-text-section, +.pl-flash-msg-close-btn { + height: 50px; + line-height: 44px; +} + +.pl-flash-msg-close-btn span { + border: 1px solid; + padding: 0 6px 2px; + border-radius: 50%; + font-family: sans-serif; + cursor: pointer; +} + +.pl-flash-msg.success .pl-flash-msg-close-btn span { + border-color: #56b652; + color: #56b652; +} + +.pl-flash-msg.danger .pl-flash-msg-close-btn span { + border-color: #e63f3f; + color: #e63f3f; +} + +.pl-flash-msg.warning .pl-flash-msg-close-btn span { + border-color: #ffe100; + color: #ffe100; +} + +.pl-flash-msg-text-section { + display: flex; + flex-grow: 1; + padding-left: 15px; +} + +.pl-flash-msg-text-section span { + color: #5d5d5d; +} + +.pl-flash-msg-text-section i { + display: none; + font-size: 20px; + margin-right: 10px; + height: 60px; + line-height: 55px; +} + +.pl-flash-msg i.success { + color: #56b652; +} + +.pl-flash-msg i.danger { + color: #e63f3f; +} + +.pl-flash-msg i.warning { + color: #ffe100; +} + +.pl-flash-msg-close-btn { + width: 35px; + margin: auto; +} + +.pl-flash-msg-close-btn svg { + cursor: pointer; + vertical-align: middle; +} + +.pl-clear-padding { + padding: 0 !important; +} + +.pl-switch { + cursor: pointer; +} + +.pl-switch * { + pointer-events: none !important; + height: 21px; +} + +.pl-switch .pl-checked-checkbox { + display: none; +} + +.pl-switch.selected .pl-checked-checkbox { + display: inline-flex; +} + +.pl-switch.selected .pl-checked-checkbox i { + color: #2095F2; +} + +.pl-switch.selected .pl-empty-checkbox { + display: none; +} + +.pl-order-draft-icon { + width: 50px; +} + +.pl-print-label-button { + height: 40px; + margin-top: 5px; + font-size: 15px !important; +} + +.pl-shipping { + margin-top: 30px; +} + +.pl-order-page-item { + margin: 8px 0 0 0 !important; +} + +.admin__field .pl-print-label-button { + margin-top: 15px; +} + +.admin__field .pl-shipment-details { + margin-top: 10px; +} + +.md-checkbox input[type=checkbox]:checked + i.md-checkbox-control:before { + background-color: #2095F2 !important; +} + +html, +body { + height: 100%; +} + +#main { + height: 100%; + padding-bottom: 0 !important; +} + +#content.bootstrap { + height: 100%; +} + +#anchor-content { + padding-bottom: 5rem; +} + +/* ANIMATIONS */ + +@keyframes pl-fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@keyframes pl-rotate { + 100% { + transform: rotate(360deg); + } +} + +#pl-main-page-holder .button::before { + width: 22px; + height: 22px; + margin: 0 15px 0 0; + background-size: contain; + background-repeat: no-repeat; + background-position: 50%; +} + +#pl-main-page-holder .button { + font-family: inherit; + overflow: visible; + display: inline-flex; + padding: 10px 15px; + vertical-align: middle; + -webkit-appearance: none; + -moz-appearance: none; + cursor: pointer; + color: #2095f2; + font-size: 13px; + font-weight: 400; + line-height: 15px; + font-style: normal; + letter-spacing: inherit; + text-align: left; + text-decoration: none; + text-shadow: none; + text-transform: uppercase; + border: 1px solid #2095f2; + border-radius: 4px; + background: #fff; + box-shadow: none; + transition: background .4s, border-color .4s, color .4s; + justify-content: flex-start; + align-items: center; + margin: 10px 0 0; + height: auto; +} + +#pl-main-page-holder .button.button-primary { + background: #2095f2; + color: #fff; +} + +#pl-main-page-holder .button:hover { + color: #fff; + border-color: rgba(32, 149, 242, .7); + background: rgba(32, 149, 242, .7); + box-shadow: none; +} + +#pl-main-page-holder .button.button-login { + margin-left: 12px; +} + +#pl-main-page-holder .button.button-login::before { + background-image: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg width='20px' height='21px' viewBox='0 0 20 21' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cg id='Artboard' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd' transform='translate(-189.000000, -251.000000)'%3E%3Cg id='print-label-copy' transform='translate(27.000000, 241.000000)'%3E%3Cg id='Group-3' transform='translate(15.000000, 9.000000)'%3E%3Cg id='signin-white' transform='translate(146.000000, 0.000000)'%3E%3Cpolygon id='Stroke-1' stroke-opacity='0.00784313771' stroke='%23000000' stroke-width='1.33333335e-11' points='0 0 22.0000009 0 22.0000009 22.0000009 0 22.0000009'%3E%3C/polygon%3E%3Cpath d='M10.8473749,13.6010413 C9.08233329,13.6010413 8.00983324,11.5188333 7.74124968,10.8038326 C7.62941662,10.7332496 7.53316616,10.6722907 7.46762463,10.554499 C7.0564995,9.81383274 6.95474986,9.21112418 7.16558278,8.7624158 C7.24487463,8.59374908 7.36083306,8.46633251 7.48412431,8.37604061 C7.48824968,8.05887417 7.51758265,7.53866575 7.64683246,7.02854034 C7.70045769,6.67699858 8.11479075,4.81295719 10.8469159,4.81295719 C13.5886661,4.81295719 13.9947493,6.67379029 14.0469994,7.02991547 C14.1757912,7.53958191 14.2055831,8.05933228 14.2092495,8.37649867 C14.3329997,8.46724867 14.4484992,8.59420719 14.527791,8.76287385 C14.7386239,9.21158223 14.6368747,9.8142908 14.2257491,10.5549571 C14.1602076,10.6727488 14.0639572,10.7341658 13.9525822,10.8042907 C13.6830833,11.5206665 12.6101252,13.6010413 10.8473749,13.6010413 Z M8.22250023,10.0242084 C8.22570856,10.0260417 8.22845879,10.0278749 8.23120815,10.0297081 C8.37695852,10.1218331 8.51491625,10.2089167 8.56945856,10.3963744 C8.70741712,10.8835826 9.62408379,12.6843746 10.8473749,12.6843746 C12.0692917,12.6843746 12.9873335,10.8835826 13.1243751,10.3995827 C13.1770833,10.210291 13.3228337,10.1186239 13.4630836,10.0292491 C13.4662919,10.0274159 13.4690421,10.0260407 13.4717915,10.0242076 C13.7830002,9.43249908 13.7192919,9.20195728 13.7027913,9.15979107 C13.6872078,9.12129121 13.65925,9.10708283 13.6436665,9.1024994 C13.4181662,9.06033315 13.2788334,8.86141648 13.2902915,8.63224982 C13.2907496,8.62491612 13.3265001,7.89754116 13.1537081,7.23479158 C13.1463744,7.20729139 13.1422499,7.17887505 13.1399577,7.15045824 C13.1271244,7.00929176 12.9488328,5.72916667 10.8473749,5.72916667 C8.68587509,5.72916667 8.55845847,7.09545829 8.55387505,7.15366657 C8.5520418,7.18116676 8.54700032,7.20820842 8.54058365,7.23479158 C8.36687546,7.90258356 8.40354208,8.62445806 8.40354208,8.63179171 C8.41591731,8.86141648 8.25687555,9.06491657 8.03045916,9.1070837 C8.03550064,9.1070837 8.00754281,9.12129208 7.9919593,9.15979194 C7.97499982,9.20195815 7.91174959,9.43295801 8.22250023,10.0242084 Z' id='Fill-2' fill='%23FFFFFF'%3E%3C/path%3E%3Cpath d='M4.65483338,17.9611665 C4.40137485,17.9611665 4.19650006,17.7558323 4.19650006,17.5028332 C4.19650006,15.4059578 5.36754185,13.9214169 7.583125,13.2100826 C8.56899959,12.8933744 9.10158324,12.374541 9.10662472,12.3694995 C9.28629148,12.1921249 9.57550005,12.192583 9.75424977,12.3708746 C9.93254144,12.5491663 9.93391653,12.8374578 9.75608297,13.0166665 C9.72858324,13.0441662 9.07545769,13.6936245 7.86316584,14.083208 C6.01287385,14.6772078 5.11316584,15.7960003 5.11316584,17.5032913 C5.11316671,17.7558341 4.90829148,17.9611665 4.65483338,17.9611665 Z' id='Fill-3' fill='%23FFFFFF'%3E%3C/path%3E%3Cpath d='M13.2219998,13.7985837 C13.15325,13.7985837 13.0826661,13.7830002 13.0166665,13.75 C12.3268752,13.4034997 11.9542495,13.03225 11.9382078,13.0162084 C11.7599162,12.8365416 11.7608332,12.5464169 11.9409581,12.3676672 C12.1197078,12.1902926 12.4089164,12.1912087 12.587208,12.3685842 C12.5904163,12.3713344 12.8819162,12.6559596 13.4282501,12.9305008 C13.6542085,13.0441671 13.7454165,13.3196262 13.6317502,13.5455837 C13.5510833,13.7064586 13.3897503,13.7985837 13.2219998,13.7985837 Z' id='Fill-4' fill='%23FFFFFF'%3E%3C/path%3E%3Cpath d='M18.7916667,21.5416667 L15.125,21.5416667 C14.3669169,21.5416667 13.75,20.9247497 13.75,20.1666667 L13.75,17.4166667 C13.75,17.1636675 13.9548752,16.9583333 14.2083333,16.9583333 L19.7083333,16.9583333 C19.9617923,16.9583333 20.1666667,17.1636675 20.1666667,17.4166667 L20.1666667,20.1666667 C20.1666667,20.9247497 19.5497497,21.5416667 18.7916667,21.5416667 Z M14.6666667,17.875 L14.6666667,20.1666667 C14.6666667,20.4192077 14.8720008,20.625 15.125,20.625 L18.7916667,20.625 C19.0446658,20.625 19.25,20.4192077 19.25,20.1666667 L19.25,17.875 L14.6666667,17.875 Z' id='Fill-5' fill='%23FFFFFF'%3E%3C/path%3E%3Cpath d='M19.7083333,17.4166667 L18.7916667,17.4166667 L18.7916667,16.84375 C18.7916667,15.7066255 17.8662912,14.78125 16.7291667,14.78125 C15.5920421,14.78125 14.6666667,15.7066255 14.6666667,16.84375 L14.6666667,17.4166667 L13.75,17.4166667 L13.75,16.84375 C13.75,15.2010835 15.0865001,13.8645833 16.7291667,13.8645833 C18.3718332,13.8645833 19.7083333,15.2010835 19.7083333,16.84375 L19.7083333,17.4166667 Z' id='Fill-6' fill='%23FFFFFF'%3E%3C/path%3E%3Cpath d='M11,20.625 C5.6929581,20.625 1.375,16.3075008 1.375,11 C1.375,5.69249913 5.6929581,1.375 11,1.375 C16.3070427,1.375 20.625,5.6925 20.625,11 C20.625,11.6242498 20.5645,12.2484995 20.4457922,12.8562496 C20.3972093,13.1046662 20.1579596,13.2669163 19.9077089,13.2183334 C19.6592924,13.1697496 19.4975004,12.9291248 19.5460833,12.6807082 C19.6537919,12.1302498 19.7083333,11.5651249 19.7083333,11 C19.7083333,6.19804153 15.8019588,2.29166667 11,2.29166667 C6.19804112,2.29166667 2.29166667,6.19804153 2.29166667,11 C2.29166667,15.8019588 6.19804153,19.7083333 11,19.7083333 C11.2534581,19.7083333 11.4583333,19.9136675 11.4583333,20.1666667 C11.4583333,20.4196658 11.2534581,20.625 11,20.625 Z' id='Fill-7' fill='%23FFFFFF'%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); + content: " "; +} + +#pl-main-page-holder .button.button-register::before { + background-image: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg width='21px' height='21px' viewBox='0 0 21 21' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cg id='Artboard' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd' transform='translate(-43.000000, -102.000000)'%3E%3Cg id='print-label' transform='translate(27.000000, 91.666667)'%3E%3Cg id='Group-3' transform='translate(14.837838, 9.000000)'%3E%3Cg id='register-white'%3E%3Cpolygon id='Stroke-1' stroke-opacity='0.00784313771' stroke='%23000000' stroke-width='1.33333335e-11' points='0 0 21.762163 0 21.762163 22.0000009 0 22.0000009'%3E%3C/polygon%3E%3Cpath d='M16.3216216,21.5416667 C13.5718815,21.5416667 11.3344595,19.279791 11.3344595,16.5 C11.3344595,13.7202089 13.5718815,11.4583333 16.3216216,11.4583333 C19.0713626,11.4583333 21.3087838,13.7202081 21.3087838,16.5 C21.3087838,19.2797928 19.0713609,21.5416667 16.3216216,21.5416667 Z M16.3216216,12.375 C14.0719582,12.375 12.2412162,14.22575 12.2412162,16.5 C12.2412162,18.774249 14.0719582,20.625 16.3216216,20.625 C18.5712842,20.625 20.402027,18.774249 20.402027,16.5 C20.402027,14.2257509 18.571286,12.375 16.3216216,12.375 Z' id='Fill-2' fill='%23FFFFFF'%3E%3C/path%3E%3Cpath d='M15.4148649,18.7916667 C15.2987997,18.7916667 15.1827346,18.7467502 15.094326,18.6573753 L13.7341909,17.2823753 C13.5569196,17.1031675 13.5569196,16.8135009 13.7341909,16.6342913 C13.9114622,16.4550818 14.1979973,16.4550835 14.3752677,16.6342913 L15.4148649,17.6852493 L18.2679746,14.800958 C18.4452451,14.6217493 18.7317802,14.6217493 18.9090523,14.800958 C19.0863245,14.9801658 19.0863227,15.2698324 18.9090523,15.449042 L15.7354037,18.6573753 C15.646995,18.7467502 15.53093,18.7916667 15.4148649,18.7916667 Z' id='Fill-3' fill='%23FFFFFF'%3E%3C/path%3E%3Cpath d='M10.730106,13.6010413 C8.98459905,13.6010413 7.92324045,11.5183744 7.65710739,10.8038326 C7.54738955,10.7337077 7.45263365,10.6732077 7.38780068,10.5563322 C6.98021347,9.81383187 6.87956338,9.21112418 7.08811748,8.7624158 C7.16655207,8.59374908 7.28125648,8.46633251 7.40321572,8.37604061 C7.40729649,8.05887417 7.43631234,7.53866575 7.56416486,7.02854034 C7.61721036,6.67699858 8.02706414,4.81295719 10.7296528,4.81295719 C13.4422156,4.81295719 13.8434555,6.67379029 13.895594,7.02991547 C14.0234465,7.53958191 14.0524632,8.05933228 14.0565431,8.37649867 C14.1785015,8.46724867 14.2932063,8.59420719 14.3716409,8.76287385 C14.5797423,9.21112418 14.4795454,9.81383187 14.0728644,10.5549571 C14.0080314,10.6727488 13.9128215,10.7341658 13.8026506,10.8042907 C13.5356113,11.5206665 12.4742527,13.6010413 10.730106,13.6010413 Z M8.13360833,10.0242084 C8.13632883,10.0260417 8.13904847,10.0278749 8.14176896,10.0297081 C8.28684991,10.1222912 8.42422333,10.2098329 8.47726887,10.3991246 C8.61282892,10.8835826 9.52003878,12.6843746 10.7296528,12.6843746 C11.9392669,12.6843746 12.8464768,10.8835826 12.9820368,10.4000408 C13.0341752,10.210749 13.1783499,10.1186239 13.3175367,10.0297072 C13.3202572,10.027874 13.3229768,10.0260407 13.3256973,10.0246657 C13.6335417,9.43295714 13.5709752,9.20195728 13.5542,9.16024913 C13.5387849,9.12174931 13.5111293,9.10754089 13.4961674,9.10295746 C13.273105,9.06079121 13.1352784,8.86187454 13.1470658,8.63270787 C13.147519,8.62537422 13.182429,7.89799927 13.0115058,7.23524963 C13.0042514,7.20774945 12.9997184,7.1793331 12.9979041,7.1509163 C12.9852096,7.00974982 12.8088454,5.72962472 10.729652,5.72962472 C8.59197288,5.72962472 8.46548058,7.09591635 8.46139981,7.15412463 C8.45958644,7.18162482 8.45505256,7.20866648 8.44825216,7.23479112 C8.27642189,7.9030408 8.31269211,8.62491612 8.31314527,8.63224982 C8.32538666,8.86187454 8.16761117,9.06491657 7.94409563,9.10754176 C7.94908265,9.10754176 7.92097306,9.12175018 7.90601203,9.16025 C7.8887836,9.20195815 7.82576401,9.43295801 8.13360833,10.0242084 Z' id='Fill-4' fill='%23FFFFFF'%3E%3C/path%3E%3Cpath d='M4.60451086,17.9611665 C4.35424599,17.9611665 4.15113249,17.7558323 4.15113249,17.5028332 C4.15113249,15.4059578 5.30951437,13.9214169 7.50114527,13.2100826 C8.47636175,12.8933744 9.00318775,12.374541 9.00862874,12.3694995 C9.18635316,12.1916659 9.47288829,12.192583 9.64925244,12.3708746 C9.82561658,12.5491663 9.82697685,12.8374578 9.65106581,13.0166665 C9.62431649,13.0441662 8.97779865,13.6936245 7.77861347,14.083208 C5.94787154,14.6772078 5.0583432,15.7960003 5.0583432,17.5032913 C5.05788923,17.7558341 4.85477572,17.9611665 4.60451086,17.9611665 Z' id='Fill-5' fill='%23FFFFFF'%3E%3C/path%3E%3Cpath d='M12.8491964,13.6743745 C12.7730292,13.6743745 12.6959548,13.6551246 12.6247737,13.6143326 C12.1120026,13.3182494 11.838616,13.0464575 11.8091461,13.0162075 C11.632782,12.8365408 11.6341422,12.546416 11.8118666,12.3681244 C11.9891379,12.1902908 12.2747659,12.1907498 12.4515832,12.3694995 C12.460197,12.3777494 12.6746456,12.5876661 13.0745254,12.8182079 C13.2921468,12.9437913 13.3674077,13.223833 13.2436351,13.4433747 C13.1597604,13.5914163 13.0065188,13.6743745 12.8491964,13.6743745 Z' id='Fill-6' fill='%23FFFFFF'%3E%3C/path%3E%3Cpath d='M10.8810811,20.625 C5.63095946,20.625 1.36013514,16.3075008 1.36013514,11 C1.36013514,5.69249913 5.63095946,1.375 10.8810811,1.375 C16.1312035,1.375 20.402027,5.6925 20.402027,11 C20.402027,11.8126253 20.3013769,12.6206663 20.1032505,13.4007495 C20.0406841,13.6454997 19.7944999,13.7935413 19.5510363,13.7307492 C19.3084789,13.6674989 19.1624917,13.4177073 19.2246033,13.172499 C19.4041411,12.4671251 19.4952703,11.7360837 19.4952703,11 C19.4952703,6.19804153 15.6311269,2.29166667 10.8810811,2.29166667 C6.13103527,2.29166667 2.26689189,6.19804153 2.26689189,11 C2.26689189,15.8019588 6.13103567,19.7083333 10.8810811,19.7083333 C11.6001394,19.7083333 12.3146638,19.6185004 13.0051585,19.441583 C13.2490761,19.3792489 13.4948071,19.5277495 13.5560133,19.7734158 C13.6176726,20.0186241 13.4707783,20.2679569 13.2277669,20.3302909 C12.4647318,20.5260001 11.6754004,20.625 10.8810811,20.625 Z' id='Fill-7' fill='%23FFFFFF'%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); + content: " "; +} + +#pl-register-btn.button-register { + margin-top: 0; + margin-left: 10px; +} + +#pl-pricing-extension-point { + margin-top: 10px !important; +} + +#pl-create-draft-error { + margin-top: 10px; + margin-bottom: 10px; +} + +.pl-login-error-msg { + display: flex; + font-size: 16px; + line-height: 19px; + padding: 10px !important; + border-radius: 2px; + border-width: 1px 1px 2px; + border-style: solid; + border-color: #cdd9eb #cdd9eb #ed3e3e; + margin: 0 0 10px; + color: #5d5d5d; + background-color: #fff; +} + +.pl-login-error-msg:before { + content: " "; + margin-right: 5px; + width: 18px; + height: 18px; + background-image: url("data:image/svg+xml,%3Csvg width='15' height='15' viewBox='0 0 15 15' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cdefs%3E%3Cpath id='b' d='M0 0h372v51H0z'/%3E%3Cfilter x='-.8%25' y='-5.9%25' width='101.6%25' height='111.8%25' filterUnits='objectBoundingBox' id='a'%3E%3CfeOffset in='SourceAlpha' result='shadowOffsetOuter1'/%3E%3CfeGaussianBlur stdDeviation='1' in='shadowOffsetOuter1' result='shadowBlurOuter1'/%3E%3CfeColorMatrix values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0' in='shadowBlurOuter1'/%3E%3C/filter%3E%3C/defs%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg transform='translate(-10 -9)'%3E%3Cuse fill='%23000' filter='url(%23a)' xlink:href='%23b'/%3E%3Cuse fill='%23ED3E3E' xlink:href='%23b'/%3E%3C/g%3E%3Cpath d='M-10-7.003C-10-8.106-9.107-9-7.999-9H360c1.105 0 2.001.892 2.001 1.997V40H-10V-7.003z' fill='%23FFF'/%3E%3Cg fill='%23ED3E3E' fill-rule='nonzero'%3E%3Cpath d='M7.5.085C3.363.085 0 3.448 0 7.585c0 4.136 3.363 7.5 7.5 7.5 4.137 0 7.5-3.364 7.5-7.5 0-4.137-3.363-7.5-7.5-7.5zm0 .937a6.555 6.555 0 0 1 6.563 6.563A6.555 6.555 0 0 1 7.5 14.147 6.555 6.555 0 0 1 .937 7.585 6.555 6.555 0 0 1 7.5 1.022zM4.687 4.07a1.172 1.172 0 1 0 0 2.344 1.172 1.172 0 0 0 0-2.344zm5.625 0a1.172 1.172 0 1 0 0 2.344 1.172 1.172 0 0 0 0-2.344zM7.5 8.522a4.52 4.52 0 0 0-3.662 1.831.47.47 0 0 0 .762.55c.634-.87 1.69-1.443 2.9-1.443s2.266.572 2.9 1.443a.47.47 0 1 0 .762-.55A4.52 4.52 0 0 0 7.5 8.523z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-size: contain; +} + +.pl-system-info-panel { + position: absolute; + bottom: 25px; + left: 30px; + padding: 10px; + z-index: 100001; + background-color: white; + border: 1px solid #2095f2; + color: #5d5d5d; +} + +.pl-system-info-panel .md-checkbox { + margin: 10px 0; +} + +.pl-system-info-open-btn { + cursor: pointer; +} + +.pl-system-info-open-btn * { + pointer-events: none; +} + +.pl-system-info-panel.hidden { + display: none; + transition: all .25s ease; +} + +.pl-system-info-panel-close { + position: absolute; + right: 0; + top: 6px; + cursor: pointer; + height: 20px; + width: 20px; + font-size: 15px; +} + +.pl-system-info-panel-close svg { + height: 18px; + width: 18px; + pointer-events: none; +} + +.pl-system-info-panel-loader { + display: none; + width: 251px; + height: 92px; +} + +.pl-system-info-panel.loading .pl-system-info-panel-content { + display: none; +} + +#pl-system-info-panel a { + text-decoration: none; +} + +.pl-system-info-panel.loading .pl-system-info-panel-loader { + display: flex; + justify-content: center; + align-items: center; +} + +.pl-shipping-modal-title { + font-size: 22px; + color: #5d5d5d; + line-height: 28px; + margin-bottom: 22px; + text-align: center; +} + +.pl-shipping-modal-body { + font-size: 0.96em; + line-height: 18px; + color: #5d5d5d; +} + +.pl-shipping-modal-row { + position: absolute; + bottom: 20px; +} + +#pl-main-page-holder .button.pl-shipping-modal-btn { + margin-right: 15px; +} + +.pl-configure-shipping-method-wrapper { + padding: 0 !important; + box-sizing: content-box; +} + +@media screen and (max-width: 950px) { + .pl-collapse { + display: none !important; + } +} + +@media screen and (max-width: 1366px) { + .pl-table-header-wrapper th { + font-size: 11px; + } + + .pl-table-row-arrow-wrapper, .pl-table-header-arrow { + display: none; + } + + .pl-help { + font-size: 13px; + padding-left: 10px; + } +} \ No newline at end of file From 0976bebe2410f0a0440a804604566cf9739e15d6 Mon Sep 17 00:00:00 2001 From: "igor.pesic" Date: Tue, 26 May 2020 16:46:50 +0200 Subject: [PATCH 006/214] Implement base start page Issue: PLCR1801-7 --- src/DemoUI/src/Services/Integration/UrlService.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/DemoUI/src/Services/Integration/UrlService.php b/src/DemoUI/src/Services/Integration/UrlService.php index 3ea67848..5e18a973 100644 --- a/src/DemoUI/src/Services/Integration/UrlService.php +++ b/src/DemoUI/src/Services/Integration/UrlService.php @@ -26,7 +26,6 @@ public function __construct() */ public function getEndpointUrl($controllerName, $action) { - return "{$this->schema}://{$_SERVER['HTTP_HOST']}/Controllers/Index.php?controller={$controllerName}&action={$action}"; } From bdfc7a58b00121e74210f7cc56931fddd0de71f2 Mon Sep 17 00:00:00 2001 From: "igor.pesic" Date: Thu, 28 May 2020 12:52:14 +0200 Subject: [PATCH 007/214] Add generic mechanism for translations Issue: PLCR1801-12 --- composer.json | 3 +- .../Interfaces/TranslationService.php | 28 ++++ .../Language/TranslationService.php | 145 ++++++++++++++++++ .../Configuration/Configuration.php | 23 +++ .../Language/TranslationServiceTest.php | 120 +++++++++++++++ .../Language/Translations/de_DE.json | 6 + .../Language/Translations/en_EN.json | 4 + 7 files changed, 328 insertions(+), 1 deletion(-) create mode 100644 src/BusinessLogic/Language/Interfaces/TranslationService.php create mode 100644 src/BusinessLogic/Language/TranslationService.php create mode 100644 tests/BusinessLogic/Language/TranslationServiceTest.php create mode 100644 tests/BusinessLogic/Language/Translations/de_DE.json create mode 100644 tests/BusinessLogic/Language/Translations/en_EN.json diff --git a/composer.json b/composer.json index bf84f479..8b5cd393 100755 --- a/composer.json +++ b/composer.json @@ -4,7 +4,8 @@ "type": "library", "license": "proprietary", "require": { - "php": ">=5.3.29" + "php": ">=5.3.29", + "ext-json": "*" }, "autoload": { "psr-4": { diff --git a/src/BusinessLogic/Language/Interfaces/TranslationService.php b/src/BusinessLogic/Language/Interfaces/TranslationService.php new file mode 100644 index 00000000..623db2b8 --- /dev/null +++ b/src/BusinessLogic/Language/Interfaces/TranslationService.php @@ -0,0 +1,28 @@ + ['translationKey' => 'translation']] + * @var array + */ + protected $translations = array(); + + /** + * @var string $translationsFileBasePath + */ + protected $translationsFileBasePath; + + private $currentLanguage; + + /** + * TranslationService constructor. + * + * @param string|null $translationsFileBasePath + */ + public function __construct($translationsFileBasePath = null) + { + $this->translationsFileBasePath = $translationsFileBasePath; + + if (empty($this->translationsFileBasePath)) { + $currentDir = __DIR__; + $this->translationsFileBasePath = "{$currentDir}/Translations"; + } + } + + /** + * Translates a key to a value defined for that key for a current language. If the key can not be found for current + * language translation fallback value will be returned (translation in English). If the key is not found in fallback + * passed key will be returned. + * + * @param string $key String to be translated. If the key is nested it should be sent separated by '_'. For example: + * Translation file has next definition: {"parent": {"child": "childTranslation"}}. Key for parent is: "parent", key + * for child is: "parent_child" + * @param array $arguments + * + * @return string + */ + public function translate($key, array $arguments = array()) + { + $this->currentLanguage = Configuration::getCurrentLanguage(); + + if (empty($this->translations[$this->currentLanguage][$key])) { + $this->initializeTranslations(); + } + + $result = $this->getTranslation($key, $this->currentLanguage); + + if ($result === null) { + $result = $this->getTranslation($key, 'en'); + } + + if ($result === null) { + $result = $key; + } + + return vsprintf($result, $arguments); + } + + /** + * Initializes the translations from a file to in-memory map. + */ + protected function initializeTranslations() + { + $languageLowerCase = strtolower($this->currentLanguage); + $languageUpperCase = strtoupper($this->currentLanguage); + + $this->translationsFileBasePath = rtrim($this->translationsFileBasePath, '/') . '/'; + $translationFilePath = "{$this->translationsFileBasePath}{$languageLowerCase}_{$languageUpperCase}.json"; + $this->initializeLanguage($translationFilePath, $this->currentLanguage); + $this->initializeFallbackLanguage(); + } + + private function initializeLanguage($translationFilePath, $language) + { + try { + $serializedJson = file_get_contents($translationFilePath); + } catch (Exception $ex) { + $serializedJson = false; + Logger::logWarning($ex->getMessage()); + } + + if ($serializedJson !== false) { + $this->translations[$language] = json_decode($serializedJson, true); + } + } + + private function initializeFallbackLanguage() + { + if (strtolower($this->currentLanguage) != 'en') { + $translationFilePath = "{$this->translationsFileBasePath}en_EN.json"; + $this->initializeLanguage($translationFilePath, 'en'); + } + } + + private function getTranslation($key, $currentLanguage) + { + $keys = explode('_', $key); + + if (count($keys) > 0 && isset($this->translations[$currentLanguage])) { + $result = $this->translations[$currentLanguage]; + } else { + $result = null; + } + + for ($i = 0; $i < count($keys); $i++) { + if (!isset($result[$keys[$i]])) { + $result = null; + break; + } + + if ($this->isNonIterableElement($result, $keys, $i)) { + $result = null; + break; + } + + $result = $result[$keys[$i]]; + } + + return $result; + } + + private function isNonIterableElement($currentNamespace, $keys, $i) + { + return !is_array($currentNamespace[$keys[$i]]) && $i < count($keys) - 1; + } +} \ No newline at end of file diff --git a/src/Infrastructure/Configuration/Configuration.php b/src/Infrastructure/Configuration/Configuration.php index 1a836a88..a32f266b 100644 --- a/src/Infrastructure/Configuration/Configuration.php +++ b/src/Infrastructure/Configuration/Configuration.php @@ -18,6 +18,13 @@ */ abstract class Configuration extends Singleton { + /** + * Current language. + * + * @var string + */ + private static $currentLanguage; + /** * Fully qualified name of this interface. */ @@ -51,6 +58,22 @@ abstract class Configuration extends Singleton */ protected $repository; + /** + * @return string + */ + public static function getCurrentLanguage() + { + return self::$currentLanguage; + } + + /** + * @param string $currentLanguage + */ + public static function setCurrentLanguage($currentLanguage) + { + self::$currentLanguage = $currentLanguage; + } + /** * Retrieves integration name. * diff --git a/tests/BusinessLogic/Language/TranslationServiceTest.php b/tests/BusinessLogic/Language/TranslationServiceTest.php new file mode 100644 index 00000000..5b2e8606 --- /dev/null +++ b/tests/BusinessLogic/Language/TranslationServiceTest.php @@ -0,0 +1,120 @@ +translationService = new TranslationService($baseFilePath); + + $configuration = new TestShopConfiguration(); + Configuration::setCurrentLanguage('de'); + + new TestServiceRegister( + array( + Configuration::CLASS_NAME => function () use ($configuration) { + return $configuration; + } + ) + ); + } + + /** + * Tests translation function when non existing key is tried to be translated for not supported language. + */ + public function testTranslateNotSupportedLanguage() + { + $configuration = new TestShopConfiguration(); + Configuration::setCurrentLanguage('rs'); + $logger = new TestShopLogger(); + $timeProvider = new TestTimeProvider(); + + new TestServiceRegister( + array( + Configuration::CLASS_NAME => function () use ($configuration) { + return $configuration; + }, + TimeProvider::CLASS_NAME => function () use ($timeProvider) { + return $timeProvider; + }, + ShopLoggerAdapter::CLASS_NAME => function () use ($logger) { + return $logger; + } + ) + ); + + $translation = $this->translationService->translate('testKey'); + + $this->assertStringStartsWith('testValueEn', $translation); + } + + /** + * Tests translation function when non existing key is tried to be translated. + */ + public function testTranslateNonExistingKey() + { + $nonExistingKey = 'noKey'; + $translation = $this->translationService->translate($nonExistingKey); + + $this->assertEquals($nonExistingKey, $translation); + } + + /** + * Tests translation function when non existing key in current language is tried to be translated. Key exists in the + * fallback language. + */ + public function testTranslateFallbackToEnglish() + { + $key = 'testKey1'; + $translation = $this->translationService->translate($key); + + $this->assertEquals('testValueEn1', $translation); + } + + /** + * Tests translation function when non existing key is tried to be translated. + */ + public function testTranslateToGerman() + { + $key = 'testKey'; + $translation = $this->translationService->translate($key); + + $this->assertEquals('testValueDe', $translation); + } + + /** + * Tests translation function with existing nested key with placeholders. + */ + public function testTranslateToGermanNestedKeyWithPlaceholders() + { + $key = 'namespace_nestedKeyWithPlaceholder'; + $translation = $this->translationService->translate($key, array(1, 2)); + + $this->assertEquals('Test1 1, test2 2.', $translation); + } +} \ No newline at end of file diff --git a/tests/BusinessLogic/Language/Translations/de_DE.json b/tests/BusinessLogic/Language/Translations/de_DE.json new file mode 100644 index 00000000..718750dc --- /dev/null +++ b/tests/BusinessLogic/Language/Translations/de_DE.json @@ -0,0 +1,6 @@ +{ + "testKey": "testValueDe", + "namespace": { + "nestedKeyWithPlaceholder": "Test1 %s, test2 %s." + } +} \ No newline at end of file diff --git a/tests/BusinessLogic/Language/Translations/en_EN.json b/tests/BusinessLogic/Language/Translations/en_EN.json new file mode 100644 index 00000000..2fa71671 --- /dev/null +++ b/tests/BusinessLogic/Language/Translations/en_EN.json @@ -0,0 +1,4 @@ +{ + "testKey": "testValueEn", + "testKey1": "testValueEn1" +} \ No newline at end of file From 33e18cbff5ed471f192c2ebb5e695d6c343603d0 Mon Sep 17 00:00:00 2001 From: "igor.pesic" Date: Thu, 28 May 2020 12:52:50 +0200 Subject: [PATCH 008/214] Add current translations files Issue: PLCR1801-13 --- .../Language/Translations/de_DE.json | 336 ++++++++++++++++++ .../Language/Translations/en_EN.json | 336 ++++++++++++++++++ .../Language/Translations/es_ES.json | 336 ++++++++++++++++++ .../Language/Translations/fr_FR.json | 336 ++++++++++++++++++ .../Language/Translations/it_IT.json | 336 ++++++++++++++++++ 5 files changed, 1680 insertions(+) create mode 100644 src/BusinessLogic/Language/Translations/de_DE.json create mode 100644 src/BusinessLogic/Language/Translations/en_EN.json create mode 100644 src/BusinessLogic/Language/Translations/es_ES.json create mode 100644 src/BusinessLogic/Language/Translations/fr_FR.json create mode 100644 src/BusinessLogic/Language/Translations/it_IT.json diff --git a/src/BusinessLogic/Language/Translations/de_DE.json b/src/BusinessLogic/Language/Translations/de_DE.json new file mode 100644 index 00000000..b81580aa --- /dev/null +++ b/src/BusinessLogic/Language/Translations/de_DE.json @@ -0,0 +1,336 @@ +{ + "general": { + "packlinkPro": "Packlink PRO Shipping", + "saveUp": "Sparen Sie bis zu 70% bei Ihren Versandkosten. Keine festen Gebühren, kein Mindestvolumen beim Versand. Verwalten Sie alle Ihre Sendungen auf einer einzigen Plattform.", + "packlinkShipping": "Packlink Shipping S.L.", + "noContract": "Ohne Vertragsbindung – Sofortiger Zugriff auf über 300 Versanddienste in einer einzigen Plattform. Verbinden Sie Ihren Onlineshop und steuern Sie alle Sendungen über Packlink PRO.", + "developedAndManaged": "Entwickelt und verwaltet von Packlink", + "generalConditions": "Allgemeine Bedingungen", + "basicSettings": "Einstellungen", + "contactUs": "Kontaktieren Sie uns", + "systemInfo": "Systeminformationen", + "debugMode": "Debug mode", + "help": "Hilfe", + "downloadSystemInfoFile": "Systeminfodatei herunterladen", + "curlIsNotInstalled": "cURL ist in Ihrer PHP-Installation nicht installiert oder aktiviert. Dies ist jedoch erforderlich, damit die Hintergrundaufgabe funktioniert. Bitte installieren Sie es und aktualisieren Sie diese Seite.", + "loading": "Lädt..." + }, + "login": { + "dontHaveAccount?": "Sie haben noch kein Benutzerkonto?", + "register": "Registrieren", + "selectCountry": "Wählen Sie ein Land aus", + "yourAPIKey": "Ihren API-Schlüssel finden Sie unter", + "connectYourAccount": "Benutzerkonto verbinden", + "apiKey": "API-Schlüssel", + "logIn": "Login", + "apiKeyIncorrect": "Falscher API-Schlüssel" + }, + "dashboard": { + "almostThere": "Fast geschafft!", + "detailsSynced": "Daten, die mit Ihrem Packlink PRO-Konto verknüpft sind", + "setDefaultParcel": "Standardpaket einrichten", + "setDefaultWarehouse": "Voreingestellte Adresse einrichten", + "justFewMoreSteps": "Nur noch wenige Schritte, um die Einrichtung abzuschließen", + "selectShippingServices": "Versanddienste auswählen" + }, + "warehouseSettings": { + "defaultWarehouse": "Voreingestellte Adresse", + "setDefaultWarehouse": "Voreingestellte Adresse einrichten", + "defaultWarehouseAddress": "Wir verwenden die voreingestellte Adresse als Absenderadresse. Sie können Ihre Eingaben jederzeit ändern.", + "warehouseName": "Name der voreingestellten Adresse", + "contactPersonName": "Name der Kontaktperson", + "contactPersonSurname": "Nachname der Kontaktperson", + "companyName": "Unternehmen", + "cityOrPostal": "Stadt oder Postleitzahl", + "address": "Straße und Hausnummer", + "phone": "Telefonnummer", + "email": "E-Mail-Adresse", + "saveChanges": "Speichern", + "fieldRequired": "Dies ist ein Pflichtfeld.", + "fieldValidNumber": "Bitte geben Sie einen numerischen Wert ein.", + "fieldInvalid": "Ihre Eingabe ist ungültig.", + "fieldTwoDecimals": "Das Feld muss 2 Dezimalstellen haben.", + "fieldInteger": "Das Feld muss eine ganze Zahl sein.", + "fieldValidEmail": "Das Feld muss eine gültige E-Mail-Adresse sein.", + "postalCodeNotCorrect.": "Die Postleitzahl ist nicht korrekt.", + "fieldValidPhone": "Bitte geben Sie eine gültige Telefonnummer ein." + }, + "parcelSettings": { + "defaultParcel": "Standardpaket", + "setDefaultParcel": "Standardpaket einrichten", + "defaultParcelInfo": "Wir verwenden das Daten des Standardpakets, wenn für ein Produkt keine Abmaße und kein Gewicht definiert wurden. Sie können Ihre Eingaben jederzeit ändern.", + "weight": "Gewicht", + "width": "Breite", + "length": "Länge", + "height": "Höhe", + "valuePositive": "Der Wert muss größer als 0 sein.", + "saveChanges": "Speichern", + "weightMustBePositive": "Das Gewicht muss eine positive Dezimalzahl sein.", + "fieldMustBePositive": "Das Feld muss eine positive ganze Zahl sein." + }, + "mapOrderStatuses": { + "mapStatuses": "Bestellstatus synchronisieren", + "packlinkProShippingStatus": "Versandstatus von Packlink PRO", + "status": "Status", + "none": "Leer", + "pending": "Ausstehend", + "processing": "In Bearbeitung", + "ready": "Versandfertig", + "inTransit": "Unterwegs", + "delivered": "Zugestellt", + "statusSetByPacklink": "Status wurde von Packlink PRO festgelegt." + }, + "shippingServicesSettings": { + "filterServices": "Versanddienste filtern", + "type": "Typ", + "national": "National", + "international": "International", + "deliveryType": "Versandart", + "economic": "Standard", + "express": "Express", + "parcelOrigin": "Absendeort des Pakets", + "collection": "Abholung an Adresse", + "dropOff": "Abgabe im Paketshop", + "parcelDestination": "Zielort des Pakets", + "pickUp": "Abholung im Paketshop", + "delivery": "Zustellung an Adresse", + "addServiceTitle": "Name des Versanddienstes festlegen", + "titleWillBeVisible": "Dieser Name wird Ihren Kunden angezeigt", + "serviceTitle": "Name des Versanddienstes", + "carrierLogo": "Logo des Versandunternehmens", + "showCarrierLogo": "Meinen Kunden das Logo anzeigen", + "selectPricingPolicy": "Preispolitik wählen", + "choosePricingPolicy": "Wählen Sie die Preispolitik, die Sie Ihren Kunden anzeigen möchten", + "packlinkPrices": "Packlink-Preise", + "percentagePacklinkPrices": "%-Satz der Packlink-Preise", + "fixedPrices": "Feste Preise", + "save": "Speichern", + "cancel": "Abbrechen", + "packlinkPercent": "Packlink-Prozentsatz", + "configure": "Einstellen", + "allShippingServices": "Alle Versanddienste", + "selectedShippingServices": "Ausgewählte Versanddienste", + "select": "Auswählen", + "shippingServices": "Versanddienste", + "carrier": "Versandpartner", + "transitTime": "Versandlaufzeit", + "origin": "Absender", + "destination": "Empfänger", + "showingPercentsResults": "Es werden %s Ergebnisse angezeigt", + "setPricingRule": "Bitte legen Sie eine Preisregel fest", + "increase": "Erhöhen", + "reduce": "Reduzieren", + "by": "um", + "addPriceForWeightCriteria": "Bitte fügen Sie für jede Gewichtskategorie einen Preis hinzu", + "addPriceForPriceCriteria": "Bitte geben Sie den Preis für jedes Preiskriterium an", + "fixedPricesTotalWeight": "Festpreise basierend auf dem Gesamtgewicht", + "fixedPricesTotalPrice": "Festpreise basierend auf dem Gesamtpreis", + "from": "Von", + "to": "Bis", + "price": "Preis", + "addPrice": "Preis hinzufügen", + "tax": "Steuer", + "gettingAvailableShippingService": "Wir suchen verfügbare Versanddienste von Packlink PRO, bitte haben Sie einen Moment Geduld.", + "shippingServiceSuccessfullySaved": "Versanddienst erfolgreich gespeichert.", + "congrats": "Glückwunsch! Ihr erster Versanddienst wurde erfolgreich erstellt.", + "disablePreviousCarriers": "Um Ihnen den bestmöglichen Service zu bieten, ist es wichtig, dass Sie Ihre bisherigen Versanddienstleister deaktivieren. Möchten Sie, dass wir diese deaktivieren? (empfohlen)", + "accept": "Akzeptieren", + "shippingMethodSuccessfullySelected.": "Versanddienst erfolgreich ausgewählt.", + "failedToDeselectShippingMethod": "Versanddienst konnte nicht abgewählt werden.", + "shippingMethodSuccessfullyDeselected": "Versanddienst erfolgreich abgewählt.", + "failedToSaveShippingMethod": "Versanddienst konnte nicht gespeichert werden.", + "failedToActivateShippingMethod": "Versanddienst konnte nicht aktiviert werden.", + "failedToDisableShippingMethods": "Versanddienste konnten nicht deaktiviert werden.", + "successfullyDisabledShippingMethods": "Versanddienste erfolgreich deaktiviert.", + "successfullyDeletedShippingMethods": "Versanddienste erfolgreich gelöscht.", + "shippingMethodsDeleteFailed": "Versanddienste konnten nicht gelöscht werden." + }, + "orderListAndDetails": { + "packlinkOrderDraft": "Packlink Auftragsentwurf", + "printed": "Ausgedruckt", + "ready": "Bereit", + "printLabel": "Versandetikett drucken", + "shipmentLabels": "Versandetiketten", + "printShipmentLabels": "Packlink PRO Versandetiketten drucken", + "shipmentDetails": "Versanddetails", + "disablePopUpBlocker": "Bitte deaktivieren Sie den Popup-Blocker auf dieser Seite, um alle Versandetiketten auf einmal zu öffnen.", + "date": "Datum", + "number": "Nummer", + "status": "Status", + "print": "Drucken", + "carrierTrackingNumbers": "Trackingnummer des Versandunternehmens", + "trackIt": "Versand verfolgen", + "packlinkReferenceNumber": "Packlink Referenznummer", + "packlinkShippingPrice": "Packlink Versandpreis", + "viewOnPacklink": "Auf Packlink PRO ansehen", + "createDraft": "Entwurf erstellen", + "draftIsBeingCreated": "Der Entwurf wird gerade in Packlink PRO erstellt", + "createOrderDraft": "Entwurf der Bestellung in Packlink PRO erstellen", + "draftCreateFailed": "Der Versuch der Entwurfserstellung ist fehlgeschlagen. Fehler: %s", + "packlinkShipping": "Packlink Shipping", + "shipmentOrderNotExist": "Die Bestellung mit der Versandreferenznummer %s existiert nicht im Shop", + "orderDetailsNotFound": "Bestelldetails nicht gefunden", + "orderNotExist": "Die Bestellung mit der ID %s existiert nicht im Shop", + "bulkFailCreateFail": "Die Datei der Versandetiketten konnte nicht erstellt werden", + "draftOrderDelayed": "Die Erstellung des Entwurfs verzögert sich", + "completeServicesSetup": "You need to complete the services setup to create order draft.", + "sendWithPacklink": "Send with Packlink" + }, + "checkoutProcess": { + "choseDropOffLocation": "Dieser Versanddienst unterstützt die Zustellung an vordefinierte Abgabestellen. Bitte wählen Sie den für Sie günstigsten Ort aus, indem Sie auf \"Abgabestelle auswählen\" klicken.", + "selectDropOffLocation": "Abgabestelle auswählen", + "changeDropOffLocation": "Abgabestelle ändern", + "packageDeliveredTo": "Das Paket wird geliefert an:", + "dropOffDeliveryAddress": "Zustelladresse", + "changeAddress": "Für Ihre Zustelladresse sind keine Zustellorte verfügbar. Bitte ändern Sie Ihre Adresse.", + "shippingServiceNotFound": "Versanddienst nicht gefunden" + }, + "locationPicker": { + "monday": "Montag", + "tuesday": "Dienstag", + "wednesday": "Mittwoch", + "thursday": "Donnerstag", + "friday": "Freitag", + "saturday": "Samstag", + "sunday": "Sonntag", + "zipCode": "Postleitzahl", + "idCode": "ID Code", + "selectThisLocation": "Diesen Ort auswählen", + "showWorkingHours": "Öffnungszeiten anzeigen", + "hideWorkingHours": "Öffnungszeiten ausblenden", + "showOnMap": "Auf der Karte anzeigen", + "searchBy": "Suche nach Standortname, ID oder Adresse" + }, + "migrationLogMessages": { + "removeControllersHooksFailed": "Alte Controller und Hooks konnten nicht entfernt werden auf Grund von: %s", + "deleteObsoleteFilesFailed": "Alte Dateien konnten nicht gelöscht werden auf Grund von: %s", + "oldAPIKeyDetected.": "Alter API-Schlüssel erkannt.", + "successfullyLoggedIn": "Erfolgreich mit bestehendem API-Schlüssel angemeldet.", + "removingObsoleteFiles.": "Veraltete Dateien werden entfernt.", + "cannotEnqueueUpgradeShopDetailsTask": "UpgradeShopDetailsTask kann aus folgenden Gründen nicht in die Warteschlange gestellt werden: %s", + "deletingOldPluginDta.": "Alte Plugin-Daten werden gelöscht.", + "cannotRetrieveOrderReferences": "Bestellreferenzen können nicht abgerufen werden auf Grund von: %s", + "createOrderReferenceFailed": "Referenz für Auftrag %s konnte nicht erstellt werden.", + "setLabelsFailed": "Versandetiketten für Bestellung mit Referenz %s konnten nicht erstellt werden.", + "setTrackingInfoFailed": "Fehler beim Festlegen der Tracking-Informationen für die Bestellung mit Referenz %s", + "orderNotFound": "Auftrag mit Referenz %s nicht gefunden." + }, + "systemLogMessages": { + "errorCreatingDefaultTask": "Fehler beim Erstellen der Standardkonfiguration des Task-Runner-Status.", + "webhookReceived": "Webhook von Packlink erhalten", + "couldNotDelete": "Element %s mit ID %s konnte nicht gelöscht werden", + "entityCannotBeSaved": "Element %s mit ID %s kann nicht gespeichert werden.", + "entityCannotBeUpdated": "Element %s mit ID %s kann nicht aktualisiert werden.", + "fieldIsNotIndexed": "Feld %s ist nicht indiziert!", + "unknownOrNotIndexed": "Unbekannte oder nicht indizierte OrderBy-Spalte %s", + "dirNotCreated": "Das Verzeichnis \"%s\" wurde nicht erstellt", + "failedCreatingBackup": "Fehler beim Erstellen des Backup-Versanddienstes.", + "backupServiceNotFound": "Backup-Versanddienst konnte nicht gefunden werden." + }, + "autoTest": { + "dbNotAccessible.": "Zugriff auf Datenbank nicht möglich.", + "taskCouldNotBeStarted.": "Die Aufgabe konnte nicht gestartet werden.", + "moduleAutoTest": "Automatischer Test PacklinkPRO-Modul", + "useThisPageTestConfiguration": "Auf dieser Seite können Sie die Systemkonfiguration und die Dienste des PacklinkPRO-Moduls testen.", + "start": "Start", + "downloadTestLog": "Testprotokoll herunterladen", + "openModule": "PacklinkPRO-Modul öffnen", + "autotestPassedSuccessfully": "Der automatische Test wurde erfolgreich abgeschlossen!", + "testNotSuccessful": "Der Test wurde nicht erfolgreich abgeschlossen!" + }, + "wooCommerce": { + "pleaseInstall": "Bitte installieren und aktivieren Sie WooCommerce.", + "withThisVersion": "Mit dieser Version haben Sie Zugriff auf alle von Ihren Kunden gewünschten Versanddienste", + "labelNotAvailable": "Label is not yet available.", + "chooseDropOff": "Bitte wählen Sie einen Ort für die Abgabe.", + "noCostsSet": "Wenn für die Versandklassen keine Preise festgelegt wurden, werden die in der Konfiguration von Packlink PRO festgelegten Preise verwendet." + }, + "shopify": { + "success": "Erfolgreich", + "open": "Offen", + "canceled": "Storniert", + "failure": "Abgebrochen", + "installPacklinkApplication": "Packlink PRO Shopify Anwendung installieren", + "fullDomain": "Vollständige Domain Ihres Shopify-Shops", + "installApplication": "Anwendung installieren", + "enterFullURL": "Vollständige URL eingeben, zum Beispiel: https://my-great-store.myshopify.com", + "privacy": "Datenschutz", + "privacyIssueContact": "Bitte wenden Sie sich bei Datenschutzangelegenheiten an privacy@packlink.com", + "pricingPlan": "With your Shopify pricing plan you can generate shipments from orders tab, but cannot display our shipping prices to your customers. If you have any doubt ask our support team or Shopify support team.", + "chooseDeliveryLocation": "This is a drop-off service. Please choose a delivery location after completing the order.", + "dropOffDeliverySelection": "Drop-off delivery point selection" + }, + "prestaShop": { + "allowPrestaShop": "Erlauben Sie PrestaShop, sich mit dem PacklinkPRO-Konto zu verbinden", + "orderStatus": "Bestellstatus von PrestaShop", + "packlinkOffers": "Packlink bietet Ihnen die Möglichkeit, den Status Ihren PrestaShop-Bestellungen mit den Versandinformationen zu aktualisieren. Sie können dies jederzeit bearbeiten.", + + "titleCharacters": "Der Titel darf max. 64 Zeichen lang sein.", + "carrierServiceMapNotFound": "Zuordnung des Versanddienstes nicht gefunden", + "carrierNotFound": "Versandunternehmen nicht gefunden", + "carrierAlreadyDeleted": "Versandunternehmen bereits gelöscht", + "upgradeStarted": "Upgrade to plugin v2.0.0 has started." + }, + "shopware": { + "highestTax": "Höchste Steuer", + "createShipmentDraft": "Versandentwurf auf Packlink PRO erstellen", + "totalShippingCharges": "Gesamtversandkosten (EUR):", + "printShipmentLabels": "Versandetiketten drucken", + "loginToSee": "Bitte melden Sie sich an, um die Versandinformationen zu sehen", + "deliveryAddress": "Lieferadresse", + "labels": "Versandetiketten", + "shipmentStatus": "Shipment status", + "shipmentCost": "Shipment Cost" + }, + "magento": { + "enabled": "Aktiviert", + "title": "Titel", + "calculateHandlingFee": "Bearbeitungsgebühr kalkulieren", + "handlingApplied": "Bearbeitung durchgeführt", + "allowedMethods": "Zugelassene Methoden", + "sortOrder": "Sortierreihenfolge", + "carrierTrackingUrlNotProvided": "Der Spediteur hat keine Tracking-URL angegeben.", + "carrierTrackingUrlError": "Fehler beim Abrufen der Tracking-URL des Spediteurs.", + "orderDraftError": "Beim Erstellen des Auftragsentwurfs ist ein Fehler aufgetreten. Fehler: %s.", + "noShipmentLabelsAvailable": "Keine Packlink-Versandetiketten verfügbar.", + "orderIdLinkMissing": "Auftragsnummer bzw. Link fehlt.", + "selectDestCountries": "Bitte wählen Sie die Zielländer aus.", + "serviceAvailableDestCountries": "Service für alle Zielländer verfügbar", + "seeCountriesList": "Länderliste anzeigen", + "selectAllowedDestination": "Wählen Sie die für diesen Service zulässigen Zielländer aus", + "chooseDropOffLocation": "Bitte wählen Sie eine Abgabestelle für die ausgewählte Versandart." + }, + "middleware": { + "orders": "Aufträge", + "orderNumber": "Auftragsnummer", + "customer": "Kunde", + "paymentStatus": "Zahlungsstand", + "packlinkShipment": "Versand mit Packlink", + "shippingLabel": "Versandetikett", + "total": "Gesamt", + "allOrders": "Alle Aufträge", + "pendingOrders": "Ausstehende Aufträge", + "gettingOrdersFrom": "Aufträge von %s werden abgerufen. Bitte warten Sie einen Augenblick.", + "expand": "Mehr anzeigen", + "collapse": "Weniger anzeigen", + "paid": "Bezahlt", + "changePaymentStatusInfo": "Um den Zahlungsstatus eines Auftrags zu ändern, rufen Sie das Menü Aufträge in Ihrem :system Shop auf und öffnen Sie den jeweiligen Auftrag.", + "noOrderSelected": "Kein Auftrag gewählt", + "noShipmentLabels": "Für die gewählten Aufträge sind keine Versandetiketten verfügbar", + "errorPrintShipmentLabels": "Beim Versuch des Massendrucks von Versandetiketten ist ein Fehler aufgetreten", + "directoryNotCreated": "Verzeichnis %s wurde nicht angelegt", + "orderDetailsNotFound": "Auftragsdetails nicht gefunden", + "unableCreateBulkLabels": "Massenetikettendatei kann nicht angelegt werden", + "invalidPayload": "Ungültige Nutzlast", + "startEnjoying": "Start enjoying Packlink PRO!", + "registerYourAccount": "Register your account", + "individualOffer": "We would like to get to know you better in order to adapt to you and to send you an individual offer", + "monthlyShipmentVolume": "What is your monthly shipment volume?", + "mainOnlineStoreOn": "Your main online store is on the platform...", + "marketplaceOutletsStatement": "I do not have any marketplace outlets", + "termsAndPrivacy": "I accept the Terms of Service and the Privacy Policy of Packlink", + "authorizeMailSending": "I authorise Packlink Shipping S.L. to send me commercial communications by e-mail", + "passwordLength": "The password must be at least 6 characters long.", + "password": "Password" + } +} \ No newline at end of file diff --git a/src/BusinessLogic/Language/Translations/en_EN.json b/src/BusinessLogic/Language/Translations/en_EN.json new file mode 100644 index 00000000..33583ab3 --- /dev/null +++ b/src/BusinessLogic/Language/Translations/en_EN.json @@ -0,0 +1,336 @@ +{ + "general": { + "packlinkPro": "Packlink PRO Shipping", + "saveUp": "Save up to 70% on your shipping costs. No fixed fees, no minimum shipping volume required. Manage all your shipments in a single platform.", + "packlinkShipping": "Packlink Shipping S.L.", + "noContract": "No contract needed! More than 300 transport services into a single platform. You can connect all your ecommerce and manage all your shipments in Packlink PRO.", + "developedAndManaged": "Developed and managed by Packlink", + "generalConditions": "General conditions", + "basicSettings": "Basic settings", + "contactUs": "Contact us", + "systemInfo": "System info", + "debugMode": "Debug mode", + "help": "Help", + "downloadSystemInfoFile": "Download system info file", + "curlIsNotInstalled": "cURL is not installed or enabled in your PHP installation. This is required for background task to work. Please install it and then refresh this page.", + "loading": "Loading..." + }, + "login": { + "dontHaveAccount?": "Don't have an account?", + "register": "Register", + "selectCountry": "Select country to start", + "yourAPIKey": "Your API key can be found under", + "connectYourAccount": "Connect your account", + "apiKey": "Api key", + "logIn": "Log in", + "apiKeyIncorrect": "API key was incorrect." + }, + "dashboard": { + "almostThere": "You're almost there!", + "detailsSynced": "Details synced with your existing account", + "setDefaultParcel": "Set default parcel details", + "setDefaultWarehouse": "Set default warehouse details", + "justFewMoreSteps": "Just a few more steps to complete the setup", + "selectShippingServices": "Select shipping services" + }, + "warehouseSettings": { + "defaultWarehouse": "Default warehouse", + "setDefaultWarehouse": "Set default warehouse", + "defaultWarehouseAddress": "We will use the default Warehouse address as your sender address. You can edit anytime.", + "warehouseName": "Warehouse name", + "contactPersonName": "Contact person name", + "contactPersonSurname": "Contact person surname", + "companyName": "Company name", + "cityOrPostal": "City or postal code", + "address": "Address", + "phone": "Phone number", + "email": "Email", + "saveChanges": "Save changes", + "fieldRequired": "This field is required.", + "fieldValidNumber": "Value must be valid number.", + "fieldInvalid": "This field is not valid.", + "fieldTwoDecimals": "Field must have 2 decimal places.", + "fieldInteger": "Field must be an integer.", + "fieldValidEmail": "Field must be valid email.", + "postalCodeNotCorrect.": "Postal code is not correct.", + "fieldValidPhone": "This field must be valid phone number." + }, + "parcelSettings": { + "defaultParcel": "Default parcel", + "setDefaultParcel": "Set default parcel", + "defaultParcelInfo": "We will use the default parcel in case any item has not defined dimensions and weight. You can edit anytime.", + "weight": "Weight", + "width": "Width", + "length": "Length", + "height": "Height", + "valuePositive": "Value must be greater than 0.", + "saveChanges": "Save changes", + "weightMustBePositive": "Weight must be a positive decimal number.", + "fieldMustBePositive": "Field must be a positive integer." + }, + "mapOrderStatuses": { + "mapStatuses": "Map order statuses", + "packlinkProShippingStatus": "Packlink PRO Shipping Status", + "status": "Status", + "none": "None", + "pending": "Pending", + "processing": "Processing", + "ready": "Ready for shipping", + "inTransit": "In transit", + "delivered": "Delivered", + "statusSetByPacklink": "Status set by Packlink PRO." + }, + "shippingServicesSettings": { + "filterServices": "Filter services", + "type": "Type", + "national": "National", + "international": "International", + "deliveryType": "Delivery type", + "economic": "Economic", + "express": "Express", + "parcelOrigin": "Parcel origin", + "collection": "Collection", + "dropOff": "Drop off", + "parcelDestination": "Parcel destination", + "pickUp": "Pick up", + "delivery": "Delivery", + "addServiceTitle": "Add service title", + "titleWillBeVisible": "This title will be visible to your customers", + "serviceTitle": "Service title", + "carrierLogo": "Carrier logo", + "showCarrierLogo": "Show carrier logo to my customers", + "selectPricingPolicy": "Select pricing policy", + "choosePricingPolicy": "Choose the pricing policy to show your customers", + "packlinkPrices": "Packlink prices", + "percentagePacklinkPrices": "% of Packlink prices", + "fixedPrices": "Fixed prices", + "save": "Save", + "cancel": "Cancel", + "packlinkPercent": "Packlink percent", + "configure": "Configure", + "allShippingServices": "All shipping services", + "selectedShippingServices": "Selected shipping services", + "select": "Select", + "shippingServices": "Shipping Services", + "carrier": "Carrier", + "transitTime": "Transit Time", + "origin": "Origin", + "destination": "Destination", + "showingPercentsResults": "Showing %s results", + "setPricingRule": "Please set pricing rule", + "increase": "Increase", + "reduce": "Reduce", + "by": "By", + "addPriceForWeightCriteria": "Please add price for each weight criteria", + "addPriceForPriceCriteria": "Please add price for each price criteria", + "fixedPricesTotalWeight": "Fixed prices based on total weight", + "fixedPricesTotalPrice": "Fixed prices based on total price", + "from": "From", + "to": "To", + "price": "Price", + "addPrice": "Add price", + "tax": "Tax", + "gettingAvailableShippingService": "Getting available shipping services from Packlink PRO. Please wait a moment.", + "shippingServiceSuccessfullySaved": "Shipping service successfully saved.", + "congrats": "Congrats! Your first Shipping Method has been successfully created.", + "disablePreviousCarriers": "In order to offer you the best possible service, its important to disable your previous carriers. Do you want us to disable them? (recommended)", + "accept": "Accept", + "shippingMethodSuccessfullySelected.": "Shipping method successfully selected.", + "failedToDeselectShippingMethod": "Failed to deselect shipping method.", + "shippingMethodSuccessfullyDeselected": "Shipping method successfully deselected.", + "failedToSaveShippingMethod": "Failed to save shipping method.", + "failedToActivateShippingMethod": "Failed to activate shipping method.", + "failedToDisableShippingMethods": "Failed to disable shipping methods.", + "successfullyDisabledShippingMethods": "Successfully disabled shipping methods.", + "successfullyDeletedShippingMethods": "Successfully deleted shipping methods.", + "shippingMethodsDeleteFailed": "Failed to delete shipping methods." + }, + "orderListAndDetails": { + "packlinkOrderDraft": "Packlink order draft", + "printed": "Printed", + "ready": "Ready", + "printLabel": "Print label", + "shipmentLabels": "Shipment Labels", + "printShipmentLabels": "Print Packlink PRO Shipment Labels", + "shipmentDetails": "Shipment details", + "disablePopUpBlocker": "Please disable pop-up blocker on this page in order to bulk open shipment labels", + "date": "Date", + "number": "Number", + "status": "Status", + "print": "Print", + "carrierTrackingNumbers": "Carrier tracking numbers", + "trackIt": "Track it!", + "packlinkReferenceNumber": "Packlink reference number", + "packlinkShippingPrice": "Packlink shipping price", + "viewOnPacklink": "View on Packlink PRO", + "createDraft": "Create Draft", + "draftIsBeingCreated": "Draft is currently being created in Packlink PRO", + "createOrderDraft": "Create order draft in Packlink PRO", + "draftCreateFailed": "Previous attempt to create a draft failed. Error: %s", + "packlinkShipping": "Packlink Shipping", + "shipmentOrderNotExist": "Order with shipment reference %s doesn't exist in the shop", + "orderDetailsNotFound": "Order details not found", + "orderNotExist": "Order with ID %s doesn't exist in the shop", + "bulkFailCreateFail": "Unable to create bulk labels file", + "draftOrderDelayed": "Creation of the draft is delayed", + "completeServicesSetup": "You need to complete the services setup to create order draft.", + "sendWithPacklink": "Send with Packlink" + }, + "checkoutProcess": { + "choseDropOffLocation": "This shipping service supports delivery to pre-defined drop-off locations. Please choose location that suits you the most by clicking on the \"Select drop-off location\" button.", + "selectDropOffLocation": "Select drop-off location", + "changeDropOffLocation": "Change drop-off location", + "packageDeliveredTo": "Package will be delivered to:", + "dropOffDeliveryAddress": "Drop-Off delivery address", + "changeAddress": "There are no delivery locations available for your delivery address. Please change your address.", + "shippingServiceNotFound": "Shipping service not found" + }, + "locationPicker": { + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "zipCode": "Zip code", + "idCode": "ID code", + "selectThisLocation": "Select this location", + "showWorkingHours": "Show working hours", + "hideWorkingHours": "Hide working hours", + "showOnMap": "Show on map", + "searchBy": "Search by location name, id or address" + }, + "migrationLogMessages": { + "removeControllersHooksFailed": "Failed to remove old controllers and hooks because: %s", + "deleteObsoleteFilesFailed": "Could not delete obsolete files because: %s", + "oldAPIKeyDetected.": "Old API key detected.", + "successfullyLoggedIn": "Successfully logged in with existing api key.", + "removingObsoleteFiles.": "Removing obsolete files.", + "cannotEnqueueUpgradeShopDetailsTask": "Cannot enqueue UpgradeShopDetailsTask because: %s", + "deletingOldPluginDta.": "Deleting old plugin data.", + "cannotRetrieveOrderReferences": "Cannot retrieve order references because: %s", + "createOrderReferenceFailed": "Failed to create reference for order %s", + "setLabelsFailed": "Failed to set labels for order with reference %s", + "setTrackingInfoFailed": "Failed to set tracking info for order with reference %s", + "orderNotFound": "Order with reference %s not found." + }, + "systemLogMessages": { + "errorCreatingDefaultTask": "Error creating default task runner status configuration.", + "webhookReceived": "Webhook from Packlink received.", + "couldNotDelete": "Could not delete entity %s with ID %s", + "entityCannotBeSaved": "Entity %s with ID %s cannot be saved.", + "entityCannotBeUpdated": "Entity %s with ID %s cannot be updated.", + "fieldIsNotIndexed": "Field %s is not indexed!", + "unknownOrNotIndexed": "Unknown or not indexed OrderBy column %s", + "dirNotCreated": "Directory \"%s\" was not created", + "failedCreatingBackup": "Failed creating backup service.", + "backupServiceNotFound": "Backup service not found." + }, + "autoTest": { + "dbNotAccessible.": "Database not accessible.", + "taskCouldNotBeStarted.": "Task could not be started.", + "moduleAutoTest": "PacklinkPRO module auto-test", + "useThisPageTestConfiguration": "Use this page to test the system configuration and PacklinkPRO module services.", + "start": "Start", + "downloadTestLog": "Download test log", + "openModule": "Open PacklinkPRO module", + "autotestPassedSuccessfully": "Auto-test passed successfully!", + "testNotSuccessful": "The test did not complete successfully." + }, + "wooCommerce": { + "pleaseInstall": "Please install and activate WooCommerce.", + "withThisVersion": "With this version you will have access to any shipping service that your clients demand. Go to the configuration and select which shipping services should be offered to your customers!", + "labelNotAvailable": "Label is not yet available.", + "chooseDropOff": "Please choose a drop-off location.", + "noCostsSet": "If no costs are set for shipping classes, costs defined in Packlink PRO configuration will be used." + }, + "shopify": { + "success": "Success", + "open": "Open", + "canceled": "Canceled", + "failure": "Failure", + "installPacklinkApplication": "Install Packlink PRO Shopify application", + "fullDomain": "Full domain of your Shopify store", + "installApplication": "Install application", + "enterFullURL": "Enter full URL, for example: https://my-great-store.myshopify.com", + "privacy": "Privacy", + "privacyIssueContact": "Please, for any privacy issue contact privacy@packlink.com", + "pricingPlan": "With your Shopify pricing plan you can generate shipments from orders tab, but cannot display our shipping prices to your customers. If you have any doubt ask our support team or Shopify support team.", + "chooseDeliveryLocation": "This is a drop-off service. Please choose a delivery location after completing the order.", + "dropOffDeliverySelection": "Drop-off delivery point selection" + }, + "prestaShop": { + "allowPrestaShop": "Allow PrestaShop to connect to PacklinkPRO", + "orderStatus": "PrestaShop Order Status", + "packlinkOffers": "Packlink offers you the possibility to update your PrestaShop order status with the shipping info. You can edit anytime.", + + "titleCharacters": "Title can have at most 64 characters.", + "carrierServiceMapNotFound": "Carrier service mapping not found", + "carrierNotFound": "Carrier not found", + "carrierAlreadyDeleted": "Carrier already deleted", + "upgradeStarted": "Upgrade to plugin v2.0.0 has started." + }, + "shopware": { + "highestTax": "Highest tax", + "createShipmentDraft": "Create shipment draft on Packlink PRO", + "totalShippingCharges": "Total shipping charges (EUR):", + "printShipmentLabels": "Print shipment labels", + "loginToSee": "Please login to see shipment information", + "deliveryAddress": "Delivery address", + "labels": "Labels", + "shipmentStatus": "Shipment status", + "shipmentCost": "Shipment Cost" + }, + "magento": { + "enabled": "Enabled", + "title": "Title", + "calculateHandlingFee": "Calculate Handling Fee", + "handlingApplied": "Handling Applied", + "allowedMethods": "Allowed Methods", + "sortOrder": "Sort Order", + "carrierTrackingUrlNotProvided": "Carrier did not provide tracking URL.", + "carrierTrackingUrlError": "Error getting carrier tracking URL.", + "orderDraftError": "There has been an error creating order draft. Error: %s.", + "noShipmentLabelsAvailable": "No Packlink shipment labels available.", + "orderIdLinkMissing": "Order ID and/or link missing.", + "selectDestCountries": "You must select destination countries.", + "serviceAvailableDestCountries": "Service available for all destination countries", + "seeCountriesList": "See countries list", + "selectAllowedDestination": "Select allowed destination countries for this service", + "chooseDropOffLocation": "Please choose a drop-off location for selected shipping method." + }, + "middleware": { + "orders": "Orders", + "orderNumber": "Order number", + "customer": "Customer", + "paymentStatus": "Payment status", + "packlinkShipment": "Packlink Shipment", + "shippingLabel": "Shipping label", + "total": "Total", + "allOrders": "All orders", + "pendingOrders": "Pending orders", + "gettingOrdersFrom": "Getting orders from %s. Please wait a moment.", + "expand": "Expand", + "collapse": "Collapse", + "paid": "Paid", + "changePaymentStatusInfo": "To change the payment status of an order, go to the orders menu in your :system store and open the specific order.", + "noOrderSelected": "No order selected.", + "noShipmentLabels": "No shipment labels available for the selected orders", + "errorPrintShipmentLabels": "There has been an error while trying to bulk print shipment labels", + "directoryNotCreated": "Directory %s was not created", + "orderDetailsNotFound": "Order details not found", + "unableCreateBulkLabels": "Unable to create bulk labels file", + "invalidPayload": "Invalid payload", + "startEnjoying": "Start enjoying Packlink PRO!", + "registerYourAccount": "Register your account", + "individualOffer": "We would like to get to know you better in order to adapt to you and to send you an individual offer", + "monthlyShipmentVolume": "What is your monthly shipment volume?", + "mainOnlineStoreOn": "Your main online store is on the platform...", + "marketplaceOutletsStatement": "I do not have any marketplace outlets", + "termsAndPrivacy": "I accept the Terms of Service and the Privacy Policy of Packlink", + "authorizeMailSending": "I authorise Packlink Shipping S.L. to send me commercial communications by e-mail", + "passwordLength": "The password must be at least 6 characters long.", + "password": "Password" + } +} \ No newline at end of file diff --git a/src/BusinessLogic/Language/Translations/es_ES.json b/src/BusinessLogic/Language/Translations/es_ES.json new file mode 100644 index 00000000..3b351e1e --- /dev/null +++ b/src/BusinessLogic/Language/Translations/es_ES.json @@ -0,0 +1,336 @@ +{ + "general": { + "packlinkPro": "Packlink PRO Shipping", + "saveUp": "Ahorra hasta un 70% en tus gastos de envío. Sin tarifas fijas, sin volumen de envíos mínimo. Gestiona todos tus envíos en una sola plataforma.", + "packlinkShipping": "Packlink Shipping S.L.", + "noContract": "Sin contratos, accede inmediatamente a más de 300 servicios de transporte en una única plataforma. No importa cuantos puntos de venta tengas, todo lo podrás gestionar desde Packlink PRO.", + "developedAndManaged": "Desarrollado y gestionado por Packlink", + "generalConditions": "Condiciones generales", + "basicSettings": "Configuración", + "contactUs": "Contacta con nosotros", + "systemInfo": "Información del sistema", + "debugMode": "Debug mode", + "help": "Ayuda", + "downloadSystemInfoFile": "Descargar el archivo de información del sistema", + "curlIsNotInstalled": "cURL no está instalado ni habilitado en tu instalación de PHP. Es necesario para que funcione la tarea en segundo plano. Por favor, instálalo y luego actualiza esta página.", + "loading": "Cargando..." + }, + "login": { + "dontHaveAccount?": "¿No tienes una cuenta?", + "register": "Registro", + "selectCountry": "Selecciona el país para comenzar", + "yourAPIKey": "Puedes encontrar tu clave de API en ", + "connectYourAccount": "Conecta tu cuenta", + "apiKey": "Clave de API", + "logIn": "Iniciar sesión", + "apiKeyIncorrect": "Clave de API incorrecta" + }, + "dashboard": { + "almostThere": "¡Ya casi está!", + "detailsSynced": "Datos sincronizados con tu cuenta Packlink PRO", + "setDefaultParcel": "Establece el paquete que más usas", + "setDefaultWarehouse": "Establece la dirección predefinida", + "justFewMoreSteps": "Te queda muy poco para completar la configuración", + "selectShippingServices": "Selecciona los servicios de envío" + }, + "warehouseSettings": { + "defaultWarehouse": "Dirección predefinida", + "setDefaultWarehouse": "Establece la dirección predefinida", + "defaultWarehouseAddress": "Usaremos la dirección predefinida como la dirección del remitente. Puedes editarla en cualquier momento.", + "warehouseName": "Dirección predefinida", + "contactPersonName": "Nombre de la persona de contacto", + "contactPersonSurname": "Apellido de la persona de contacto", + "companyName": "Nombre de la empresa", + "cityOrPostal": "Ciudad o código postal", + "address": "Dirección", + "phone": "Teléfono", + "email": "Email", + "saveChanges": "Guardar cambios", + "fieldRequired": "Esta campo es obligatorio.", + "fieldValidNumber": "Debe ser un valor numérico.", + "fieldInvalid": "Este campo no es válido.", + "fieldTwoDecimals": "El campo debe tener 2 decimales.", + "fieldInteger": "El campo debe ser un número entero.", + "fieldValidEmail": "El campo debe ser un correo electrónico válido.", + "postalCodeNotCorrect.": "El código postal no es correcto.", + "fieldValidPhone": "Este campo deber ser un número de teléfono válido." + }, + "parcelSettings": { + "defaultParcel": "Paquete predefinido", + "setDefaultParcel": "Establece el paquete que más usas", + "defaultParcelInfo": "Usaremos el paquete que has definido como el más usado en el caso de que algún artículo no tenga las dimensiones y el peso definidas. Puedes editar esta información en cualquier momento.", + "weight": "Peso", + "width": "Anchura", + "length": "Longitud", + "height": "Altura", + "valuePositive": "El valor debe ser mayor que 0.", + "saveChanges": "Guardar cambios", + "weightMustBePositive": "El peso debe ser un número decimal positivo.", + "fieldMustBePositive": "Este campo debe ser un número entero positivo." + }, + "mapOrderStatuses": { + "mapStatuses": "Sincronización de estados", + "packlinkProShippingStatus": "Estado del envío de Packlink PRO", + "status": "Estado", + "none": "Ninguno", + "pending": "Pendiente", + "processing": "Procesando", + "ready": "Listo para enviar", + "inTransit": "En tránsito", + "delivered": "Entregado", + "statusSetByPacklink": "Estado establecido por Packlink PRO." + }, + "shippingServicesSettings": { + "filterServices": "Filtrar servicios", + "type": "Tipo", + "national": "Nacional", + "international": "Internacional", + "deliveryType": "Servicio", + "economic": "Económico", + "express": "Express", + "parcelOrigin": "Origen", + "collection": "Recogida", + "dropOff": "Drop off", + "parcelDestination": "Destino", + "pickUp": "Pick up", + "delivery": "Entrega", + "addServiceTitle": "Añadir nombre de servicio", + "titleWillBeVisible": "Este nombre será visible para tus clientes.", + "serviceTitle": "Nombre del servicio", + "carrierLogo": "Logo del transportista", + "showCarrierLogo": "Mostrar logo del transportista a mis clientes.", + "selectPricingPolicy": "Seleccionar política de precios", + "choosePricingPolicy": "Elige la política de precios para mostrar a tus clientes.", + "packlinkPrices": "Precios de Packlink", + "percentagePacklinkPrices": "% sobre los precios de Packlink", + "fixedPrices": "Precios fijos", + "save": "Guardar", + "cancel": "Cancelar", + "packlinkPercent": "Porcentaje de Packlink", + "configure": "Configurar", + "allShippingServices": "Todos los servicios de envío", + "selectedShippingServices": "Servicios de envío seleccionados", + "select": "Seleccionar", + "shippingServices": "Servicios de envío", + "carrier": "Transportista", + "transitTime": "Tiempo de tránsito", + "origin": "Origen", + "destination": "Destino", + "showingPercentsResults": "Mostrando %s resultados", + "setPricingRule": "Establece como fijar el precio", + "increase": "Incrementar", + "reduce": "Reducir", + "by": "Por", + "addPriceForWeightCriteria": "Añade el precio para cada peso", + "addPriceForPriceCriteria": "Por favor, añade precio para cada criterio", + "fixedPricesTotalWeight": "Precios fijos en función del peso total", + "fixedPricesTotalPrice": "Precios fijos en función del precio total", + "from": "Desde", + "to": "Hasta", + "price": "Precio", + "addPrice": "Añadir precio", + "tax": "Impuestos", + "gettingAvailableShippingService": "Buscando los servicios de envío disponibles en Packlink PRO. Por favor, espera un momento.", + "shippingServiceSuccessfullySaved": "Servicio de envío guardado.", + "congrats": "¡Enhorabuena! Ya tienes tu primer servicio de envío.", + "disablePreviousCarriers": "Para poder ofrecerte el mejor servicio, es importante que deshabilites a tus transportistas anteriores. ¿Quieres que los desactivemos? (recomendado)", + "accept": "Aceptar", + "shippingMethodSuccessfullySelected.": "Servicio de envío seleccionado correctamente.", + "failedToDeselectShippingMethod": "Error al anular la selección de servicio de envío.", + "shippingMethodSuccessfullyDeselected": "Servicio de envío correctamente deseleccionado.", + "failedToSaveShippingMethod": "Error al guardar el servicio de envío.", + "failedToActivateShippingMethod": "Error al activar el servicio de envío.", + "failedToDisableShippingMethods": "Error al deshabilitar los servicios de envío.", + "successfullyDisabledShippingMethods": "Servicios de envío correctamente deseleccionados.", + "successfullyDeletedShippingMethods": "Servicios de envío correctamente eliminados.", + "shippingMethodsDeleteFailed": "Error al eliminar los servicios de envío." + }, + "orderListAndDetails": { + "packlinkOrderDraft": "Borrador del pedido de Packlink", + "printed": "Impreso", + "ready": "Listo", + "printLabel": "Imprimir etiquetas", + "shipmentLabels": "Etiquetas de los envíos", + "printShipmentLabels": "Imprimir Packlink PRO etiquetas de los envíos", + "shipmentDetails": "Detalles del envío", + "disablePopUpBlocker": "Deshabilita el bloqueador de elementos emergentes en esta página para abrir de forma masiva las etiquetas de envío", + "date": "Fecha", + "number": "Número", + "status": "Estado", + "print": "Imprimir", + "carrierTrackingNumbers": "Número de tracking del transportista", + "trackIt": "Seguimiento", + "packlinkReferenceNumber": "Número de referencia Packlink", + "packlinkShippingPrice": "Precio de envío de Packlink", + "viewOnPacklink": "Ver en Packlink PRO", + "createDraft": "Crear borrador", + "draftIsBeingCreated": "El borrador se está creando actualmente en Packlink PRO", + "createOrderDraft": "Crear borrador en Packlink PRO", + "draftCreateFailed": "El intento anterior de crear un borrador ha fallado. Error: %s", + "packlinkShipping": "Packlink Shipping", + "shipmentOrderNotExist": "El pedido con referencia de envío %s no existe en la tienda", + "orderDetailsNotFound": "Detalles del pedido no encontrados", + "orderNotExist": "El pedido con ID %s no existe en la tienda", + "bulkFailCreateFail": "No se puede crear el archivo de etiquetas masivas", + "draftOrderDelayed": "La creación del borrador se ha retrasado", + "completeServicesSetup": "You need to complete the services setup to create order draft.", + "sendWithPacklink": "Send with Packlink" + }, + "checkoutProcess": { + "choseDropOffLocation": "Este servicio de envío admite la entrega a ubicaciones de entrega predefinidas. Elige la ubicación que más te convenga haciendo clic en el botón \"Seleccionar ubicación de entrega\"..", + "selectDropOffLocation": "Seleccionar lugar de entrega", + "changeDropOffLocation": "Cambiar el lugar de entrega", + "packageDeliveredTo": "El paquete será entregado a:", + "dropOffDeliveryAddress": "Dirección de entrega", + "changeAddress": "No hay servicio disponible para la dirección de entrega. Por favor cambia tu direccion.", + "shippingServiceNotFound": "Servicio de envío no encontrado" + }, + "locationPicker": { + "monday": "Lunes", + "tuesday": "Martes", + "wednesday": "Miércoles", + "thursday": "Jueves", + "friday": "Viernes", + "saturday": "Sábado", + "sunday": "Domingo", + "zipCode": "Código postal", + "idCode": "Código ID", + "selectThisLocation": "Selecciona esta ubicación", + "showWorkingHours": "Mostrar horas de apertura", + "hideWorkingHours": "Ocultar horario de apertura", + "showOnMap": "Mostrar en el mapa", + "searchBy": "Buscar por nombre de ubicación, ID o dirección" + }, + "migrationLogMessages": { + "removeControllersHooksFailed": "Error al eliminar los controladores y enlaces antiguos porque: %s", + "deleteObsoleteFilesFailed": "No se pudieron eliminar los archivos antiguos porque: %s", + "oldAPIKeyDetected.": "Se ha detectado una clave de API antigua.", + "successfullyLoggedIn": "Has iniciado correctamente la sesión con la clave de API existente.", + "removingObsoleteFiles.": "Eliminando archivo antiguos.", + "cannotEnqueueUpgradeShopDetailsTask": "No se pueden poner en espera los detalles de la actualización de la tienda porque: %s", + "deletingOldPluginDta.": "Eliminando datos antiguos del plugin.", + "cannotRetrieveOrderReferences": "No se pueden recuperar referencias de pedidos porque: %s", + "createOrderReferenceFailed": "Error al crear la referencia para el pedido %s", + "setLabelsFailed": "Error al generar las etiquetas para el pedido con referencia %s", + "setTrackingInfoFailed": "Error al generar la información de seguimiento para el pedido con la referencia %s", + "orderNotFound": "Pedido con referencia %s no encontrado." + }, + "systemLogMessages": { + "errorCreatingDefaultTask": "Error creating default task runner status configuration.", + "webhookReceived": "Webhook de Packlink recibido", + "couldNotDelete": "No se pudo eliminar la entidad %s con ID %s", + "entityCannotBeSaved": "La entidad %s con ID %s no se puede guardar.", + "entityCannotBeUpdated": "La entidad %s con ID %s no se puede actualizar.", + "fieldIsNotIndexed": "¡El campo %s no está indexado!", + "unknownOrNotIndexed": "Desconocido o no indexado OrderBy column %s", + "dirNotCreated": "El directorio \"%s\" no fue creado", + "failedCreatingBackup": "Error al crear el servicio flexible", + "backupServiceNotFound": "Servicio flexible no encontrado" + }, + "autoTest": { + "dbNotAccessible.": "DNo se puede acceder a la base de datos.", + "taskCouldNotBeStarted.": "No se ha podido iniciar la tarea.", + "moduleAutoTest": "Prueba automática del módulo PacklinkPRO", + "useThisPageTestConfiguration": "Utiliza esta página para probar la configuración del sistema y los servicios del módulo PacklinkPRO.", + "start": "Inicio", + "downloadTestLog": "Descargar el registro de pruebas", + "openModule": "Abrir el módulo PacklinkPRO", + "autotestPassedSuccessfully": "Prueba automática superada con éxito.", + "testNotSuccessful": "La prueba no se ha completado correctamente." + }, + "wooCommerce": { + "pleaseInstall": "Por favor, instala y activa WooCommerce.", + "withThisVersion": "Con esta versión tendrás acceso a cualquier servicio de envío que tus clientes te demanden. Ve a configuración y selecciona los métodos de envío que elijas para tus clientes.", + "labelNotAvailable": "La etiqueta todavía no está disponible.", + "chooseDropOff": "Por favor, elige un lugar de entrega.", + "noCostsSet": "Si no se establecen costes para las clases de envío, se utilizarán los costes definidos en la configuración de Packlink PRO." + }, + "shopify": { + "success": "Completado", + "open": "Abrir", + "canceled": "Cancelado", + "failure": "Error", + "installPacklinkApplication": "Instalar la aplicación Packlink PRO para Shopify", + "fullDomain": "Dominio completo de tu tienda Shopify", + "installApplication": "Instalar aplicación", + "enterFullURL": "Introduce la URL completa, por ejemplo: https://my-great-store.myshopify.com", + "privacy": "Privacidad", + "privacyIssueContact": "Para cualquier asunto relacionado con la privacidad, escribe un correo electrónico a privacy@packlink.com", + "pricingPlan": "With your Shopify pricing plan you can generate shipments from orders tab, but cannot display our shipping prices to your customers. If you have any doubt ask our support team or Shopify support team.", + "chooseDeliveryLocation": "This is a drop-off service. Please choose a delivery location after completing the order.", + "dropOffDeliverySelection": "Drop-off delivery point selection" + }, + "prestaShop": { + "allowPrestaShop": "Permitir que PrestaShop se conecte a la cuenta Packlink PRO", + "orderStatus": "Estado del pedido de PrestaShop", + "packlinkOffers": "Con Packlink puedes actualizar el estado de tu pedido de PrestaShop con la información de envío. Puedes editarla en cualquier momento.", + + "titleCharacters": "El nombre puede tener como máximo 64 caracteres.", + "carrierServiceMapNotFound": "Servicio de transporte no encontrado", + "carrierNotFound": "Transportista no encontrado", + "carrierAlreadyDeleted": "Transportista ya eliminado", + "upgradeStarted": "Se ha iniciado la actualización a plugin v2.0.0." + }, + "shopware": { + "highestTax": "Impuesto más alto", + "createShipmentDraft": "Crear un borrador de envío en Packlink PRO", + "totalShippingCharges": "Gastos de envío totales (EUR):", + "printShipmentLabels": "Imprimir etiquetas de envío", + "loginToSee": "Inicia sesión para consultar la información del envío", + "deliveryAddress": "Dirección de entrega", + "labels": "Etiquetas", + "shipmentStatus": "Shipment status", + "shipmentCost": "Shipment Cost" + }, + "magento": { + "enabled": "Activado", + "title": "Título", + "calculateHandlingFee": "Calcular la tarifa de manipulación", + "handlingApplied": "Manipulación efectuada", + "allowedMethods": "Métodos permitidos", + "sortOrder": "Clasificación", + "carrierTrackingUrlNotProvided": "El transportista no ha proporcionado la URL de seguimiento.", + "carrierTrackingUrlError": "Error al obtener la URL de seguimiento del transportista.", + "orderDraftError": "Se ha producido un error al crear el borrador del pedido. Error: %s.", + "noShipmentLabelsAvailable": "No hay etiquetas de envío Packlink disponibles.", + "orderIdLinkMissing": "Falta el enlace o el número de pedido.", + "selectDestCountries": "Debes seleccionar los países de destino.", + "serviceAvailableDestCountries": "Servicio disponible para todos los países de destino", + "seeCountriesList": "Consultar el listado de países", + "selectAllowedDestination": "Seleccionar países de destino permitidos para este servicio", + "chooseDropOffLocation": "Elige un punto de entrega para el método de envío seleccionado." + }, + "middleware": { + "orders": "Pedidos", + "orderNumber": "Número de pedido", + "customer": "Cliente", + "paymentStatus": "Estado del pago", + "packlinkShipment": "Envío Packlink", + "shippingLabel": "Etiqueta de envío", + "total": "Total", + "allOrders": "Todos los pedidos", + "pendingOrders": "Pedidos pendientes", + "gettingOrdersFrom": "Recibiendo pedidos de %s. Espera un momento.", + "expand": "Ver el detalle", + "collapse": "Ocultar", + "paid": "Pagado", + "changePaymentStatusInfo": "Para cambiar el estado del pago de un pedido, ve al menú de pedidos de tu tienda :system y abre el pedido correspondiente.", + "noOrderSelected": "Ningún pedido seleccionado.", + "noShipmentLabels": "No hay etiquetas de envío disponibles para los pedidos seleccionados", + "errorPrintShipmentLabels": "Ha ocurrido un error al intentar imprimir etiquetas de envío en grandes cantidades", + "directoryNotCreated": "El directorio %s no se ha creado", + "orderDetailsNotFound": "No se han encontrado los detalles del pedido", + "unableCreateBulkLabels": "No se pudo crear el archivo de etiquetas en grandes cantidades", + "invalidPayload": "Carga inválida", + "startEnjoying": "Start enjoying Packlink PRO!", + "registerYourAccount": "Register your account", + "individualOffer": "We would like to get to know you better in order to adapt to you and to send you an individual offer", + "monthlyShipmentVolume": "What is your monthly shipment volume?", + "mainOnlineStoreOn": "Your main online store is on the platform...", + "marketplaceOutletsStatement": "I do not have any marketplace outlets", + "termsAndPrivacy": "I accept the Terms of Service and the Privacy Policy of Packlink", + "authorizeMailSending": "I authorise Packlink Shipping S.L. to send me commercial communications by e-mail", + "passwordLength": "The password must be at least 6 characters long.", + "password": "Password" + } +} \ No newline at end of file diff --git a/src/BusinessLogic/Language/Translations/fr_FR.json b/src/BusinessLogic/Language/Translations/fr_FR.json new file mode 100644 index 00000000..8ff6b482 --- /dev/null +++ b/src/BusinessLogic/Language/Translations/fr_FR.json @@ -0,0 +1,336 @@ +{ + "general": { + "packlinkPro": "Packlink PRO Shipping", + "saveUp": "Économisez jusqu'à 70% sur vos coûts de livraison. Sans frais fixes, sans volume minimum requis. Gérez tous vos envois depuis une seule plateforme.", + "packlinkShipping": "Packlink Shipping S.L.", + "noContract": "Sans engagement, accédez immédiatement à plus de 300 services de transport sur une seule et unique plateforme. Quelque soit le nombre de points de ventes que vous avez, vous pourrez tout gérer depuis Packlink PRO.", + "developedAndManaged": "Développé et géré par Packlink", + "generalConditions": "Conditions générales", + "basicSettings": "Paramètres", + "contactUs": "Contactez-nous", + "systemInfo": "Informations du système", + "debugMode": "Debug mode", + "help": "Aide", + "downloadSystemInfoFile": "Téléchargez le document d'information système", + "curlIsNotInstalled": "cURL non installé ou non activé dans votre installation PHP. Cette démarche est nécessaire pour que la tâche de fond fonctionne. Veuillez l’installer et rafraîchir cette page.", + "loading": "Chargement en cours..." + }, + "login": { + "dontHaveAccount?": "Vous n'avez pas de compte?", + "register": "S'inscrire", + "selectCountry": "Sélectionnez le pays pour commencer", + "yourAPIKey": "Vous pouvez trouver votre clé API sous", + "connectYourAccount": "Connectez votre compte", + "apiKey": "Clé API", + "logIn": "Se connecter", + "apiKeyIncorrect": "Clé API incorrecte" + }, + "dashboard": { + "almostThere": "Vous y êtes presque!", + "detailsSynced": "Données synchonisées avec votre compte Packlink PRO", + "setDefaultParcel": "Définir les paramètres par défaut de vos colis", + "setDefaultWarehouse": "Définir l'adresse par défaut", + "justFewMoreSteps": "Il ne reste que quelques étapes pour compléter votre configuration", + "selectShippingServices": "Sélectionnez les services d'envoi" + }, + "warehouseSettings": { + "defaultWarehouse": "Adresse par défaut", + "setDefaultWarehouse": "Définir l'adresse par défaut", + "defaultWarehouseAddress": "Nous allons utiliser l'adresse de l'entrepôt par défaut comme adresse d'expéditeur. Vous pouvez la modifier à n'importe quel moment", + "warehouseName": "Nom de l'adresse par défaut", + "contactPersonName": "Prénom de la personne à contacter", + "contactPersonSurname": "Nom de la personne à contacter", + "companyName": "Nom de l'entreprise", + "cityOrPostal": "Ville ou code postal", + "address": "Adresse", + "phone": "Numéro de téléphone", + "email": "Email", + "saveChanges": "Enregistrer les modifications", + "fieldRequired": "Ce champs est obligatoire", + "fieldValidNumber": "Cette valeur doit être numérique", + "fieldInvalid": "Ce champs n'est pas valide", + "fieldTwoDecimals": "Le champs doit contenir deux décimales", + "fieldInteger": "Le champs doit être un nombre entier", + "fieldValidEmail": "Le champs doit être une adresse email valide", + "postalCodeNotCorrect.": "Code postal invalide", + "fieldValidPhone": "Ce champs doit contenir un numéro de téléphone valide" + }, + "parcelSettings": { + "defaultParcel": "Colis par défaut", + "setDefaultParcel": "Définir les paramètres de colis par défaut", + "defaultParcelInfo": "Nous allons utiliser les paramètres de colis par défaut pour chaque article dont les dimensions et le poids n'ont pas été définis. Vous pouvez modifier à n'importe quel moment.", + "weight": "Poids", + "width": "Largeur", + "length": "Longueur", + "height": "Hauteur", + "valuePositive": "La valeur doit être spérieure à 0", + "saveChanges": "Enregistrer les modifications", + "weightMustBePositive": "Le poids doit être un nombre décimal positif.", + "fieldMustBePositive": "Le champ doit être un nombre entier positif." + }, + "mapOrderStatuses": { + "mapStatuses": "Synchroniser l'état de la commande", + "packlinkProShippingStatus": "Statut de livraison Packlink PRO", + "status": "Statut", + "none": "Aucun", + "pending": "En attente", + "processing": "En cours de traitement", + "ready": "Prêt pour la livraison", + "inTransit": "En transit", + "delivered": "Délivré", + "statusSetByPacklink": "Statut défini par Packlink PRO." + }, + "shippingServicesSettings": { + "filterServices": "Filtrer les services", + "type": "Type", + "national": "National", + "international": "International", + "deliveryType": "Livraison", + "economic": "Économique", + "express": "Express", + "parcelOrigin": "Origine du colis", + "collection": "Collecte à domicile", + "dropOff": "Dépôt en point relais", + "parcelDestination": "Destination du colis", + "pickUp": "Point de retrait", + "delivery": "Livraison à domicile", + "addServiceTitle": "Ajouter un titre de service", + "titleWillBeVisible": "Ce titre sera visible par vos clients", + "serviceTitle": "Titre du service", + "carrierLogo": "Logo du transporteur", + "showCarrierLogo": "Montrer le logo du transporteur à mes clients", + "selectPricingPolicy": "Sélectionner une politique de prix", + "choosePricingPolicy": "Choisir la politique de prix à montrer à vos clients", + "packlinkPrices": "Prix Packlink", + "percentagePacklinkPrices": "% des prix Packlink", + "fixedPrices": "Prix fixes", + "save": "Enregistrer", + "cancel": "Annuler", + "packlinkPercent": "Pourcentage Packlink", + "configure": "Configurer", + "allShippingServices": "Tous les services de livraison", + "selectedShippingServices": "Services de livraison sélectionnés", + "select": "Sélectionner", + "shippingServices": "Services de livraison", + "carrier": "Transporteur", + "transitTime": "Temps de transit", + "origin": "Origine", + "destination": "Destination", + "showingPercentsResults": "Montrer %s les résultats", + "setPricingRule": "Veuillez définir une règle de prix", + "increase": "Augmenter", + "reduce": "Réduire", + "by": "Par", + "addPriceForWeightCriteria": "Veuillez ajouter un prix pour chaque critère de poids", + "addPriceForPriceCriteria": "Veuillez ajouter un prix pour chaque critère de prix", + "fixedPricesTotalWeight": "Prix fixes basés sur le poids total", + "fixedPricesTotalPrice": "Prix fixes basés sur le prix total", + "from": "De", + "to": "À", + "price": "Prix", + "addPrice": "Ajouter un prix", + "tax": "Taxe", + "gettingAvailableShippingService": "En cours d'obtention de services de livraison de Packlink PRO. Veuillez patienter un moment. ", + "shippingServiceSuccessfullySaved": "Service de livraison enregistré avec succès.", + "congrats": "Félicitations! Votre premier service d'envoi a été créé avec succès.", + "disablePreviousCarriers": "Afin de vous offrir le meilleur service possible, il est important que vous désactiviez vos transporteurs antérieurs. Voulez vous les désactiver? (Recommandé)", + "accept": "Accepter", + "shippingMethodSuccessfullySelected.": "Mode d'envoi sélectionné avec succès.", + "failedToDeselectShippingMethod": "Échec de l'annulation du service d'envoi.", + "shippingMethodSuccessfullyDeselected": "Service d'envoi annulé avec succès.", + "failedToSaveShippingMethod": "Échec de l'enregistrement du service d'envoi.", + "failedToActivateShippingMethod": "Échec de l'activation du service d'envoi. ", + "failedToDisableShippingMethods": "Échec de la désactivation du service d'envoi.", + "successfullyDisabledShippingMethods": "Service d'envoi désactivé avec succès. ", + "successfullyDeletedShippingMethods": "Service d'envoi supprimé avec succès.", + "shippingMethodsDeleteFailed": "Échec de la suppression du service d'envoi." + }, + "orderListAndDetails": { + "packlinkOrderDraft": "Brouillon de commande Packlink", + "printed": "Imprimé", + "ready": "Prêt", + "printLabel": "Imprimer étiquette", + "shipmentLabels": "Étiquettes de livraison", + "printShipmentLabels": "Imprimer les étiquettes de livraison Packlink PRO", + "shipmentDetails": "Détails de l'envoi", + "disablePopUpBlocker": "Veuillez désactiver l'outil de blocage des fenêtres pop-up sur cette page afin d'ouvrir massivement les étiquettes d'envoi.", + "date": "Date", + "number": "Numéro", + "status": "Statut", + "print": "Imprimer", + "carrierTrackingNumbers": "Numéro de tracking du transporteur", + "trackIt": "Suivez le!", + "packlinkReferenceNumber": "Numéro de référence Packlink", + "packlinkShippingPrice": "Prix de livraison Packlink", + "viewOnPacklink": "Voir sur Packlink PRO", + "createDraft": "Créer un brouillon", + "draftIsBeingCreated": "Le brouillon est en cours de création sur Packlink PRO", + "createOrderDraft": "Créer un brouillon de commande sur Packlink PRO", + "draftCreateFailed": "La tentative précédente de création d'un brouillon a échoué. Erreur: %s", + "packlinkShipping": "Packlink Shipping", + "shipmentOrderNotExist": "La commande de livraison sous le référence %s n'existe pas sur le shop.", + "orderDetailsNotFound": "Détails de commande introuvables", + "orderNotExist": "La commande sous l'ID %s n'existe pas sur le shop.", + "bulkFailCreateFail": "Création d'un dossier d'étiquettes en masse impossible.", + "draftOrderDelayed": "La création du brouillon a été retardée", + "completeServicesSetup": "You need to complete the services setup to create order draft.", + "sendWithPacklink": "Send with Packlink" + }, + "checkoutProcess": { + "choseDropOffLocation": "Ce service de transport soutient la livraison vers des lieux de dépôts prédéfinis. Veuillez choisir la localisation qui vous convient le mieux en cliquant sur le bouton \"Sélectionner le lieu de dépôt\"", + "selectDropOffLocation": "Sélectionner le lieu de dépôt.", + "changeDropOffLocation": "Changer le lieu de depôt. ", + "packageDeliveredTo": "Le colis sera délivré à:", + "dropOffDeliveryAddress": "Adresse de livraison.", + "changeAddress": "Il n'y a pas de lieux de livraison disponibles pour votre adresse de livraison. Veuillez changer votre adresse.", + "shippingServiceNotFound": "Service de livraison introuvable." + }, + "locationPicker": { + "monday": "Lundi", + "tuesday": "Mardi", + "wednesday": "Mercredi", + "thursday": "Jeudi", + "friday": "Vendredi", + "saturday": "Samedi", + "sunday": "Dimanche", + "zipCode": "Code postal", + "idCode": "Code ID", + "selectThisLocation": "Sélectionner ce lieu", + "showWorkingHours": "Montrer les heures de travail", + "hideWorkingHours": "Cacher les heures d'ouverture", + "showOnMap": "Montrer sur la carte", + "searchBy": "Chercher par lieu, nom, id ou adresse" + }, + "migrationLogMessages": { + "removeControllersHooksFailed": "Echec du retrait des anciens régulateurs et crochets parce que. %s", + "deleteObsoleteFilesFailed": "La suppression des dossiers obsolètes n'a pas pu être effectuée car: %s", + "oldAPIKeyDetected.": "Ancienne clé API détectée.", + "successfullyLoggedIn": "Connecté avec succès avec la clé API existante.", + "removingObsoleteFiles.": "Retrait des dossiers osolètes.", + "cannotEnqueueUpgradeShopDetailsTask": "Mise en attente de la tâche \"Mise à jour des détails du Shop\" impossible car: %s", + "deletingOldPluginDta.": "Suppression des informations relatives à l'ancien plugin.", + "cannotRetrieveOrderReferences": "Récupération des références de commande impossible car: %s", + "createOrderReferenceFailed": "Échec de création de référence pour la commande %s", + "setLabelsFailed": "Échec de la mise en place d'étiquettes pour la commande sous la référence %s", + "setTrackingInfoFailed": "Échec de la mise en place des informations de suivi pour la commande sous la référence %s", + "orderNotFound": "La commande sous la référence %s introuvable." + }, + "systemLogMessages": { + "errorCreatingDefaultTask": "Erreur lors de la création de la configuration du gestionnaire de tâches par défaut.", + "webhookReceived": "Webhook de Packlink reçu", + "couldNotDelete": "L'entité %s dont l'ID est %s n'a pas pu être supprimée. ", + "entityCannotBeSaved": "L'entité %s dont l'ID est %s n'a pas pu être enregistrée.", + "entityCannotBeUpdated": "L'entité %s dont l'ID est %s n'a pas pu être mise à jour.", + "fieldIsNotIndexed": "Le champs %s n'est pas indexé!", + "unknownOrNotIndexed": "Inconnu ou non-indexé OrderBy column %s", + "dirNotCreated": "Annuaire \"%s\" n'a pas été créé", + "failedCreatingBackup": "Impossible de créer le service de flexibilité.", + "backupServiceNotFound": "Service de flexibilité introuvable" + }, + "autoTest": { + "dbNotAccessible.": "Base de données inaccessible.", + "taskCouldNotBeStarted.": "La tâche n’a pu être lancée.", + "moduleAutoTest": "Test automatique du module PacklinkPRO", + "useThisPageTestConfiguration": "Utilisez cette page pour tester la configuration du système et les services du module PacklinkPRO.", + "start": "Démarrer", + "downloadTestLog": "Télécharger le registre de tests", + "openModule": "Ouvrir le module PacklinkPRO", + "autotestPassedSuccessfully": "Test automatique réussi avec succès !", + "testNotSuccessful": "Le test a échoué." + }, + "wooCommerce": { + "pleaseInstall": "Veuillez installer et activer WooCommerce", + "withThisVersion": "Avec cette version, vous aurez accès à tous les services de livraison demandés par vos clients.", + "labelNotAvailable": "L'étiquette n'est pas encore disponible", + "chooseDropOff": "Veuillez choisir un point de collecte", + "noCostsSet": "En cas d’absence de détermination des frais des catégories d’expédition, les frais définis dans la configuration Packlink PRO s’appliqueront." + }, + "shopify": { + "success": "Réussite", + "open": "Ouvrir", + "canceled": "Annulé", + "failure": "Échec", + "installPacklinkApplication": "Installez l’application Packlink PRO pour Shopify", + "fullDomain": "Domaine complet sur votre boutique Shopify", + "installApplication": "Installez l’application", + "enterFullURL": "Saisissez l’URL complète, par exemple : https://my-great-store.myshopify.com", + "privacy": "Confidentialité", + "privacyIssueContact": "En cas de problème de confidentialité, veuillez contacter privacy@packlink.com", + "pricingPlan": "With your Shopify pricing plan you can generate shipments from orders tab, but cannot display our shipping prices to your customers. If you have any doubt ask our support team or Shopify support team.", + "chooseDeliveryLocation": "This is a drop-off service. Please choose a delivery location after completing the order.", + "dropOffDeliverySelection": "Drop-off delivery point selection" + }, + "prestaShop": { + "allowPrestaShop": "Permettre à PrestaShop de connecter votre compte Packlink", + "orderStatus": "Statut de la commande PrestaShop", + "packlinkOffers": "Packlink vous offre la possibilité de mettre à jour le statut de votre commande PrestaShop à travers les informations relatives à la livraison. Vous pouvez modifier à n'importe quel moment.", + + "titleCharacters": "Le titre doit contenir au maximum 64 caractères.", + "carrierServiceMapNotFound": "Service de transport introuvable", + "carrierNotFound": "Transporteur introuvable.", + "carrierAlreadyDeleted": "Transporteur déjà supprimé.", + "upgradeStarted": "Upgrade to plugin v2.0.0 has started." + }, + "shopware": { + "highestTax": "Taxe maximale", + "createShipmentDraft": "Créer un projet d’expédition sur Packlink PRO", + "totalShippingCharges": "Total des frais d’envoi (EUR) :", + "printShipmentLabels": "Imprimer les étiquettes d’envoi", + "loginToSee": "Veuillez vous connecter pour consulter les informations d’envoi", + "deliveryAddress": "Adresse de livraison", + "labels": "Bordereaux", + "shipmentStatus": "Shipment status", + "shipmentCost": "Shipment Cost" + }, + "magento": { + "enabled": "Activé", + "title": "Titre", + "calculateHandlingFee": "Calculer le coût de gestion", + "handlingApplied": "Gestion appliquée", + "allowedMethods": "Méthodes disponibles", + "sortOrder": "Trier", + "carrierTrackingUrlNotProvided": "Le transporteur n’a fourni aucun URL de suivi.", + "carrierTrackingUrlError": "Erreur dans l’obtention de l’URL de suivi du transporteur.", + "orderDraftError": "Une erreur s’est produite lors de la création du projet de commande. Erreur : %s.", + "noShipmentLabelsAvailable": "Étiquettes d’envoi Packlink indisponibles.", + "orderIdLinkMissing": "Numéro et/ou lien de commande absent.", + "selectDestCountries": "Veuillez sélectionner les pays de destination.", + "serviceAvailableDestCountries": "Service disponible pour tous les pays de destination", + "seeCountriesList": "Voir liste des pays", + "selectAllowedDestination": "Sélectionnez les pays de destination autorisés pour ce service", + "chooseDropOffLocation": "Veuillez choisir un point relais pour la méthode de livraison sélectionnée." + }, + "middleware": { + "orders": "Commandes", + "orderNumber": "Numéro de commande", + "customer": "Client", + "paymentStatus": "Statut du paiement", + "packlinkShipment": "Envoi Packlink", + "shippingLabel": "Étiquette d’envoi", + "total": "Total", + "allOrders": "Toutes les commandes", + "pendingOrders": "Commandes en attente", + "gettingOrdersFrom": "Obtention des commandes de %s Veuillez patienter.", + "expand": "Voir le détail", + "collapse": "Cacher", + "paid": "Payé", + "changePaymentStatusInfo": "Pour modifier le statut de paiement d’une commande, rendez-vous au menu des commandes dans votre boutique :system et ouvrez la commande correspondante.", + "noOrderSelected": "Aucune commande sélectionnée.", + "noShipmentLabels": "Aucun bordereau d’envoi disponible pour les commandes sélectionnées", + "errorPrintShipmentLabels": "Une erreur s’est produite au moment de l’impression des bordereaux d’envoi en vrac", + "directoryNotCreated": "Le répertoire :directory n’a pas été créé", + "orderDetailsNotFound": "Informations de la commande non trouvées", + "unableCreateBulkLabels": "Le fichier des bordereaux en vrac n’a pas pu être créé", + "invalidPayload": "Charge utile invalide", + "startEnjoying": "Start enjoying Packlink PRO!", + "registerYourAccount": "Register your account", + "individualOffer": "We would like to get to know you better in order to adapt to you and to send you an individual offer", + "monthlyShipmentVolume": "What is your monthly shipment volume?", + "mainOnlineStoreOn": "Your main online store is on the platform...", + "marketplaceOutletsStatement": "I do not have any marketplace outlets", + "termsAndPrivacy": "I accept the Terms of Service and the Privacy Policy of Packlink", + "authorizeMailSending": "I authorise Packlink Shipping S.L. to send me commercial communications by e-mail", + "passwordLength": "The password must be at least 6 characters long.", + "password": "Password" + } +} \ No newline at end of file diff --git a/src/BusinessLogic/Language/Translations/it_IT.json b/src/BusinessLogic/Language/Translations/it_IT.json new file mode 100644 index 00000000..1a4f51ca --- /dev/null +++ b/src/BusinessLogic/Language/Translations/it_IT.json @@ -0,0 +1,336 @@ +{ + "general": { + "packlinkPro": "Packlink PRO Shipping", + "saveUp": "Risparmia fino a un 70% sui costi di spedizione. Senza costi fissi né volumi minimi di spedizione richiesti. Gestisci tutte le tue spedizioni da un'unica piattaforma.", + "packlinkShipping": "Packlink Shipping S.L.", + "noContract": "Senza contratti, accedi suvito a più di 300 servizi di trasporto da un'unica piattaforma. Indipendentemente da quanti punti vendita hai, puoi gestirli tutto da Packlink PRO.", + "developedAndManaged": "Sviluppato e gestito da Packlink", + "generalConditions": "Condizioni generali", + "basicSettings": "Configurazione", + "contactUs": "Contattaci", + "systemInfo": "Informazioni del sistema", + "debugMode": "Debug mode", + "help": "Aiuto", + "downloadSystemInfoFile": "Scarica il file di informazioni del sistema", + "curlIsNotInstalled": "cURL non installato o abilitato nella tua installazione PHP. È necessario per il corretto funzionamento dell’attività in background. Installalo e aggiorna la pagina.", + "loading": "Caricamento in corso..." + }, + "login": { + "dontHaveAccount?": "Non hai un account?", + "register": "Registrati", + "selectCountry": "Seleziona il paese per iniziare", + "yourAPIKey": "Puoi trovare la tua API Key su", + "connectYourAccount": "Connetti il tuo account", + "apiKey": "API Key", + "logIn": "Accedi", + "apiKeyIncorrect": "API Key non corretta" + }, + "dashboard": { + "almostThere": "Ci sei quasi!", + "detailsSynced": "Dati sincronizzati con il tuo account di Packlink PRO", + "setDefaultParcel": "Imposta i dettagli del pacco predefinito", + "setDefaultWarehouse": "Imposta i dettagli dell'indirizzo di ritiro predefinito", + "justFewMoreSteps": "Mancano pochi passaggi per completare la configurazione", + "selectShippingServices": "Seleziona i servizi di spedizione" + }, + "warehouseSettings": { + "defaultWarehouse": "Indirizzo di ritiro predefinito", + "setDefaultWarehouse": "Imposta l'indirizzo di ritiro predefinito", + "defaultWarehouseAddress": "Utilizzeremo l'indirizzo di ritiro predefinito come indirizzo del mittente. Potrai modificarlo in qualsiasi momento.", + "warehouseName": "Nome dell'indirizzo", + "contactPersonName": "Nome della persona di contatto", + "contactPersonSurname": "Cognome della persona di contatto", + "companyName": "Nome dell'azienda", + "cityOrPostal": "Città o codice postale", + "address": "Indirizzo", + "phone": "Numero di telefono", + "email": "Email", + "saveChanges": "Salva le modifiche", + "fieldRequired": "Questo campo è obbligatorio", + "fieldValidNumber": "Questo valore deve essere numerico", + "fieldInvalid": "Questo campo non è valido", + "fieldTwoDecimals": "Il campo deve contenere due decimali.", + "fieldInteger": "Il campo deve essere un numero intero.", + "fieldValidEmail": "Il campo deve essere un email valido.", + "postalCodeNotCorrect.": "Il codice postale non è corretto.", + "fieldValidPhone": "Questo campo deve contenere un numero di telefono valido." + }, + "parcelSettings": { + "defaultParcel": "Pacco predefinito", + "setDefaultParcel": "Imposta pacco predefinito", + "defaultParcelInfo": "Utilizzeremo il pacco predefinito nel caso in cui un prodotto non abbia dimensioni e peso definiti. Potrai modificarlo in qualsiasi momento.", + "weight": "Peso", + "width": "Largezza", + "length": "Lunghezza", + "height": "Altezza", + "valuePositive": "Il valore deve essere maggiore di 0", + "saveChanges": "Salva le modifiche", + "weightMustBePositive": "Il peso deve essere un numero decimale positivo.", + "fieldMustBePositive": "Il campo deve essere un numero intero positivo." + }, + "mapOrderStatuses": { + "mapStatuses": "Sincronizzazione stato ordini", + "packlinkProShippingStatus": "Stato della spedizione di Packlink PRO", + "status": "Stato", + "none": "Nessuno", + "pending": "In attesa", + "processing": "Processando", + "ready": "Pronto per la spedizione", + "inTransit": "In transito", + "delivered": "Consegnato", + "statusSetByPacklink": "Stato impostato da Packlink PRO." + }, + "shippingServicesSettings": { + "filterServices": "Filtra i servizi", + "type": "Tipo", + "national": "Nazionale", + "international": "Internazionale", + "deliveryType": "Servizio", + "economic": "Economico", + "express": "Espresso", + "parcelOrigin": "Origine del pacco", + "collection": "Ritiro a domicilio", + "dropOff": "Ritiro in punto corriere", + "parcelDestination": "Destinazione pacco", + "pickUp": "Consegna al domicilio", + "delivery": "Consegna in punto corriere", + "addServiceTitle": "Aggiungi il titolo del servizio", + "titleWillBeVisible": "Questo titolo sarà visibile ai tuoi clienti", + "serviceTitle": "Titolo del servizio", + "carrierLogo": "Logo del corriere", + "showCarrierLogo": "Mostra logo del corriere ai miei clienti", + "selectPricingPolicy": "Seleziona la politica dei prezzi", + "choosePricingPolicy": "Scegli la politica dei prezzi da mostrare ai tuoi clienti", + "packlinkPrices": "Prezzi di Packlink", + "percentagePacklinkPrices": "% dei prezzi di Packlink", + "fixedPrices": "Prezzo fisso", + "save": "Salva", + "cancel": "Annulla", + "packlinkPercent": "Percentuale di Packlink", + "configure": "Configura", + "allShippingServices": "Tutti i servizi di spedizione", + "selectedShippingServices": "Servizi di spedizione selezionati", + "select": "Seleziona", + "shippingServices": "Servizi di spedizione", + "carrier": "Corriere", + "transitTime": "Tempi di transito", + "origin": "Origine", + "destination": "Destinazione", + "showingPercentsResults": "Mostrando %s risultati", + "setPricingRule": "Si prega di impostare la regola dei prezzi", + "increase": "Aumenta", + "reduce": "Diminuisci", + "by": "del", + "addPriceForWeightCriteria": "Si prega di aggiungere il prezzo per ciascun criterio di peso", + "addPriceForPriceCriteria": "Si prega di aggiungere il costo per ogni criterio di prezzo", + "fixedPricesTotalWeight": "Prezzi fissi basati sul peso totale", + "fixedPricesTotalPrice": "Prezzi fissi basati sul prezzo totale", + "from": "Da", + "to": "A", + "price": "Prezzo", + "addPrice": "Aggiungi prezzo", + "tax": "Tassa", + "gettingAvailableShippingService": "Stiamo cercando i servizi di spedizione disponibili su Packlink PRO. Per favore aspetta un istante.", + "shippingServiceSuccessfullySaved": "Servizio di spedizione salvato con successo.", + "congrats": "Congratulazioni! Il tuo primo servizio di spedizione è stato creato correttamente. ", + "disablePreviousCarriers": "Per offrirti il miglior servizio è importante disabilitare i tuoi corrieri precedenti. Vuoi che li disabilitiamo? (opzione consigliata)", + "accept": "Accetto", + "shippingMethodSuccessfullySelected.": "Servizio di spedizione selezionato con successo.", + "failedToDeselectShippingMethod": "Impossibile deselezionare il servizio di spedizione.", + "shippingMethodSuccessfullyDeselected": "Servizio di spedizione deselezionato correttamente.", + "failedToSaveShippingMethod": "Impossibile salvare il metodo di servizio.", + "failedToActivateShippingMethod": "Impossibile attivare il servizio di spedizione.", + "failedToDisableShippingMethods": "Impossibile disattivare i servizi di spedizione.", + "successfullyDisabledShippingMethods": "Servizi di spedizione disattivati correttamente.", + "successfullyDeletedShippingMethods": "Servizio di spedizione eliminato correttamente.", + "shippingMethodsDeleteFailed": "Errore nella cancellazione del servizio di spedizione." + }, + "orderListAndDetails": { + "packlinkOrderDraft": "Bozza dell'ordine Packlink", + "printed": "Stampato", + "ready": "Pronto per la spedizione", + "printLabel": "Stampa etichette", + "shipmentLabels": "Etichette di spedizione", + "printShipmentLabels": "Stampa etichette di spedizione Packlink PRO", + "shipmentDetails": "Dettagli della spedizione", + "disablePopUpBlocker": "Disabilita il blocco pop-up su questa pagina per poter aprire le etichette di spedizione insieme", + "date": "Data", + "number": "Numero", + "status": "Stato", + "print": "Stampa", + "carrierTrackingNumbers": "Numero di tracking del corriere", + "trackIt": "Traccialo!", + "packlinkReferenceNumber": "Numero di ordine Packlink", + "packlinkShippingPrice": "PPrezzo di spedizione Packlink", + "viewOnPacklink": "Vedi su Packlink PRO", + "createDraft": "Crea bozza", + "draftIsBeingCreated": "La bozza è attualmente in fase di creazione su Packlink PRO", + "createOrderDraft": "Crea una bozza di ordine su Packlink PRO", + "draftCreateFailed": "Il precedente tentativo di creare una bozza è fallito. Errore: %s", + "packlinkShipping": "Packlink Shipping", + "shipmentOrderNotExist": "L'ordine con il numero di spedizione %s non esiste nel negozio", + "orderDetailsNotFound": "Dettagli dell'ordine non trovati", + "orderNotExist": "L'ordine con ID %s non esiste nel negozio", + "bulkFailCreateFail": "Impossibile creare il file di etichette in blocco", + "draftOrderDelayed": "La creazione della bozza è stata ritardata", + "completeServicesSetup": "You need to complete the services setup to create order draft.", + "sendWithPacklink": "Send with Packlink" + }, + "checkoutProcess": { + "choseDropOffLocation": "Questo servizio di spedizione supporta la consegna a punti corriere predefiniti. Scegli la località più adatta a te, facendo clic sul pulsante \"Seleziona punto corriere\".", + "selectDropOffLocation": "Seleziona la località del punto corriere", + "changeDropOffLocation": "Cambia località del punto corriere", + "packageDeliveredTo": "La spedizione verrà consegnata a:", + "dropOffDeliveryAddress": "Indirizzo di consegna del punto corriere", + "changeAddress": "Non ci sono località di consegna disponibili per il tuo indirizzo di consegna. Per favore cambia l'indirizzo.", + "shippingServiceNotFound": "Servizio di spedizione non trovato" + }, + "locationPicker": { + "monday": "Lunedì", + "tuesday": "Martedì", + "wednesday": "Mercoledì", + "thursday": "Giovedì", + "friday": "Venerdì", + "saturday": "Sabato", + "sunday": "Domenica", + "zipCode": "Codice postale", + "idCode": "Codice ID", + "selectThisLocation": "Seleziona la località", + "showWorkingHours": "Mostra orari di apertura", + "hideWorkingHours": "Nascondi orari di apertura", + "showOnMap": "Mostra sulla mappa", + "searchBy": "Cerca nome della località per nome, id o indirizzo" + }, + "migrationLogMessages": { + "removeControllersHooksFailed": "Impossibile rimuovere vecchi controller e hook perché: %s", + "deleteObsoleteFilesFailed": "Impossibile eliminare i file obsoleti perché: %s", + "oldAPIKeyDetected.": "Rilevata vecchia API Key.", + "successfullyLoggedIn": "Accesso eseguito correttamente con la API Key esistente.", + "removingObsoleteFiles.": "Rimozione di file obsoleti.", + "cannotEnqueueUpgradeShopDetailsTask": "Impossibile richiamare UpgradeShopDetailsTask perché: %s", + "deletingOldPluginDta.": "Eliminando i vecchi dati del plug-in", + "cannotRetrieveOrderReferences": "Impossibile recuperare i riferimenti degli ordini perché: %s", + "createOrderReferenceFailed": "Impossibile creare il riferimento per l'ordine %s", + "setLabelsFailed": "Impossibile impostare le etichette per l'ordine con riferimento %s", + "setTrackingInfoFailed": "Impossibile impostare le informazioni di tracciamento per l'ordine con riferimento %s", + "orderNotFound": "Ordine con riferimento %s non trovato" + }, + "systemLogMessages": { + "errorCreatingDefaultTask": "Error creating default task runner status configuration.", + "webhookReceived": "Webhook di Packlink ricevuto", + "couldNotDelete": "Impossibile eliminare l'entità %s con ID %s", + "entityCannotBeSaved": "L'entità %s con ID %s non può essere salvata.", + "entityCannotBeUpdated": "L'entità %s con ID %s non può essere aggiornata.", + "fieldIsNotIndexed": "Il campo %s non è indicizzato!", + "unknownOrNotIndexed": "Colonna OrderBy %s sconosciuta o non indicizzata", + "dirNotCreated": "La directory \"%s\" non è stata creata", + "failedCreatingBackup": "Impossibile creare il servizio jolly.", + "backupServiceNotFound": "Servizio jolly non trovato." + }, + "autoTest": { + "dbNotAccessible.": "Database non accessibile.", + "taskCouldNotBeStarted.": "Non è stato possibile avviare l’attività.", + "moduleAutoTest": "Auto-test per il modulo di PacklinkPRO", + "useThisPageTestConfiguration": "Usa questa pagina per testare la configurazione del sistema e i servizi del modulo di PacklinkPRO.", + "start": "Avvia", + "downloadTestLog": "Scarica il registro test", + "openModule": "Apri il modulo di PacklinkPRO", + "autotestPassedSuccessfully": "L’auto-test è stato superato con successo!", + "testNotSuccessful": "Il test non è stato completato correttamente." + }, + "wooCommerce": { + "pleaseInstall": "Si prega di installare e attivare WooCommerce", + "withThisVersion": "Con questa versione avrai accesso a qualsiasi servizio di spedizione richiesto dai tuoi clienti.", + "labelNotAvailable": "L'etichetta non è disponibile", + "chooseDropOff": "Per favore scegli un punto corriere", + "noCostsSet": "Se non sono impostate le spese per le classi di spedizione, saranno usate le spese definite nella configurazione di Packlink PRO." + }, + "shopify": { + "success": "Operazione riuscita", + "open": "Apri", + "canceled": "Annullato", + "failure": "Errore", + "installPacklinkApplication": "Installa l’applicazione di Packlink PRO per Shopify", + "fullDomain": "Dominio completo del tuo negozio Shopify", + "installApplication": "Installa l’applicazione", + "enterFullURL": "Inserisci l’URL completo, ad esempio: https://il-mio-store.myshopify.com", + "privacy": "Privacy", + "privacyIssueContact": "Per eventuali problemi relativi alla privacy, contattaci all’indirizzo privacy@packlink.com", + "pricingPlan": "With your Shopify pricing plan you can generate shipments from orders tab, but cannot display our shipping prices to your customers. If you have any doubt ask our support team or Shopify support team.", + "chooseDeliveryLocation": "This is a drop-off service. Please choose a delivery location after completing the order.", + "dropOffDeliverySelection": "Drop-off delivery point selection" + }, + "prestaShop": { + "allowPrestaShop": "Permetti a PrestaShop di connettersi all'account Packlink PRO", + "orderStatus": "Stato della spedizione di PrestaShop", + "packlinkOffers": "Packlink ti offre la possibilità di aggiornare lo stato dell'ordine di PrestaShop con le informazioni di spedizione. Puoi modificare in qualsiasi momento.", + + "titleCharacters": "Il titolo può avere un massimo di 64 caratteri", + "carrierServiceMapNotFound": "Servizio di spedizione non trovato", + "carrierNotFound": "Corriere non trovato", + "carrierAlreadyDeleted": "Corriere già eliminato", + "upgradeStarted": "È stato avviato l'aggiornamento al plug-in v2.0.0." + }, + "shopware": { + "highestTax": "Tassa più alta", + "createShipmentDraft": "Crea una bozza di spedizione su Packlink PRO", + "totalShippingCharges": "Spese di spedizione totali (EUR):", + "printShipmentLabels": "Stampa le etichette di spedizione", + "loginToSee": "Per vedere i dati della spedizione, effettua il login", + "deliveryAddress": "Indirizzo di consegna", + "labels": "Etichette", + "shipmentStatus": "Shipment status", + "shipmentCost": "Shipment Cost" + }, + "magento": { + "enabled": "Abilitato", + "title": "Titolo", + "calculateHandlingFee": "Calcola tasse di gestione", + "handlingApplied": "Gestione applicata", + "allowedMethods": "Metodi disponibili", + "sortOrder": "Ordina", + "carrierTrackingUrlNotProvided": "Il corriere non ha fornito un URL di tracking.", + "carrierTrackingUrlError": "Errore durante l’acquisizione dell’URL di tracking del corriere.", + "orderDraftError": "Si è verificato un errore durante la creazione della bozza dell’ordine. Errore: %s.", + "noShipmentLabelsAvailable": "Nessuna etichetta di spedizione di Packlink disponibile.", + "orderIdLinkMissing": "ID ordine e/o link assenti.", + "selectDestCountries": "Devi selezionare i paesi di destinazione.", + "serviceAvailableDestCountries": "Servizio disponibile per tutti i paesi di destinazione", + "seeCountriesList": "Vedi l’elenco dei paesi", + "selectAllowedDestination": "Seleziona i paesi di destinazione consentiti per questo servizio", + "chooseDropOffLocation": "Scegli un punto di accettazione per il metodo di spedizione selezionato." + }, + "middleware": { + "orders": "Ordini", + "orderNumber": "Numero ordine", + "customer": "Cliente", + "paymentStatus": "Stato del pagamento", + "packlinkShipment": "Spedizione Packlink", + "shippingLabel": "Etichetta di spedizione", + "total": "Totale", + "allOrders": "Tutti gli ordini", + "pendingOrders": "Ordini in attesa", + "gettingOrdersFrom": "Acquisizione ordini di %s in corso. Attendi qualche istante.", + "expand": "Espandi", + "collapse": "Comprimi", + "paid": "Pagato", + "changePaymentStatusInfo": "Per modificare lo stato del pagamento di un ordine, vai al menu degli ordini nel tuo negozio :system e apri l’ordine specifico.", + "noOrderSelected": "Nessun ordine selezionato.", + "noShipmentLabels": "Nessuna etichetta di spedizione disponibile per gli ordini selezionati", + "errorPrintShipmentLabels": "Si è verificato un errore durante il tentativo di stampa di etichette in blocco", + "directoryNotCreated": "La directory %s non è stata creata", + "orderDetailsNotFound": "Non sono stati trovati i dettagli dell’ordine", + "unableCreateBulkLabels": "Impossibile creare il file di etichette in blocco", + "invalidPayload": "Payload non valido", + "startEnjoying": "Start enjoying Packlink PRO!", + "registerYourAccount": "Register your account", + "individualOffer": "We would like to get to know you better in order to adapt to you and to send you an individual offer", + "monthlyShipmentVolume": "What is your monthly shipment volume?", + "mainOnlineStoreOn": "Your main online store is on the platform...", + "marketplaceOutletsStatement": "I do not have any marketplace outlets", + "termsAndPrivacy": "I accept the Terms of Service and the Privacy Policy of Packlink", + "authorizeMailSending": "I authorise Packlink Shipping S.L. to send me commercial communications by e-mail", + "passwordLength": "The password must be at least 6 characters long.", + "password": "Password" + } +} \ No newline at end of file From 84d3aa7879ec493f521ef335842c587bfbfff444 Mon Sep 17 00:00:00 2001 From: "igor.pesic" Date: Thu, 28 May 2020 13:22:37 +0200 Subject: [PATCH 009/214] Fix review issues Issue: PLCR1801-7 --- .gitignore | 3 --- src/DemoUI/.gitignore | 5 +++++ src/DemoUI/Lib/Composer.php | 1 - .../src/Services/Integration/UrlService.php | 22 +++++++------------ 4 files changed, 13 insertions(+), 18 deletions(-) create mode 100644 src/DemoUI/.gitignore diff --git a/.gitignore b/.gitignore index 9322686f..14d70a79 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,3 @@ # Custom content vendor -/src/DemoUI/src/Views/resources/js/ -/src/DemoUI/src/Views/resources/images/ -/src/DemoUI/src/Views/resources/css/location/ diff --git a/src/DemoUI/.gitignore b/src/DemoUI/.gitignore new file mode 100644 index 00000000..a8328c20 --- /dev/null +++ b/src/DemoUI/.gitignore @@ -0,0 +1,5 @@ +# Custom content +vendor +src/Views/resources/js/ +src/Views/resources/images/ +src/Views/resources/css/location/ diff --git a/src/DemoUI/Lib/Composer.php b/src/DemoUI/Lib/Composer.php index 389ba432..4b3b674a 100644 --- a/src/DemoUI/Lib/Composer.php +++ b/src/DemoUI/Lib/Composer.php @@ -16,7 +16,6 @@ public static function postUpdate() $fromBase . 'LocationPicker/js' => $toBase . 'js/location', $fromBase . 'LocationPicker/css' => $toBase . 'css/location', $fromBase . 'img' => $toBase . 'images', - $fromBase . 'img/carriers' => $toBase . 'images/carriers', ); foreach ($map as $from => $to) { diff --git a/src/DemoUI/src/Services/Integration/UrlService.php b/src/DemoUI/src/Services/Integration/UrlService.php index 5e18a973..7bb6e3e8 100644 --- a/src/DemoUI/src/Services/Integration/UrlService.php +++ b/src/DemoUI/src/Services/Integration/UrlService.php @@ -8,25 +8,17 @@ */ class UrlService { - /** - * @var string (http/https) - */ - private $schema; - - public function __construct() - { - $this->schema = empty($_SERVER['HTTPS']) ? 'http' : 'https'; - } - /** * @param $controllerName * @param $action * * @return string */ - public function getEndpointUrl($controllerName, $action) + public static function getEndpointUrl($controllerName, $action) { - return "{$this->schema}://{$_SERVER['HTTP_HOST']}/Controllers/Index.php?controller={$controllerName}&action={$action}"; + $schema = empty($_SERVER['HTTPS']) ? 'http' : 'https'; + + return "{$schema}://{$_SERVER['HTTP_HOST']}/Controllers/Index.php?controller={$controllerName}&action={$action}"; } /** @@ -34,8 +26,10 @@ public function getEndpointUrl($controllerName, $action) * * @return string */ - public function getAssetsUrl($filePath) + public static function getAssetsUrl($filePath) { - return "{$this->schema}}://{$_SERVER['HTTP_HOST']}/Controllers/assets/{$filePath}"; + $schema = empty($_SERVER['HTTPS']) ? 'http' : 'https'; + + return "{$schema}}://{$_SERVER['HTTP_HOST']}/Controllers/assets/{$filePath}"; } } \ No newline at end of file From 792312f53d8e3c039f870daaf6da9ae7b72374f4 Mon Sep 17 00:00:00 2001 From: "igor.pesic" Date: Thu, 28 May 2020 13:49:28 +0200 Subject: [PATCH 010/214] Fix review issues Issue: PLCR1801-6 --- .../Resources/img}/dashboard.png | Bin .../Resources/img}/flags/AT.svg | 0 .../Resources/img}/flags/BE.svg | 0 .../Resources/img}/flags/DE.svg | 0 .../Resources/img}/flags/ES.svg | 0 .../Resources/img}/flags/FR.svg | 0 .../Resources/img}/flags/GB.svg | 0 .../Resources/img}/flags/IE.svg | 0 .../Resources/img}/flags/IT.svg | 0 .../Resources/img}/flags/NL.svg | 0 .../Resources/img}/flags/PT.svg | 0 .../Resources/img}/flags/TR.svg | 0 .../Resources/img}/logo-pl.svg | 0 .../Resources/img}/logo.png | Bin .../Resources/img}/logo.svg | 0 .../assets/images/carriers/carrier.jpg | Bin 5088 -> 0 bytes .../Services/BusinessLogic/CarrierService.php | 2 +- .../src/Services/Integration/UrlService.php | 6 +++--- 18 files changed, 4 insertions(+), 4 deletions(-) rename src/{DemoUI/src/Controllers/assets/images => BusinessLogic/Resources/img}/dashboard.png (100%) rename src/{DemoUI/src/Controllers/assets/images => BusinessLogic/Resources/img}/flags/AT.svg (100%) rename src/{DemoUI/src/Controllers/assets/images => BusinessLogic/Resources/img}/flags/BE.svg (100%) rename src/{DemoUI/src/Controllers/assets/images => BusinessLogic/Resources/img}/flags/DE.svg (100%) rename src/{DemoUI/src/Controllers/assets/images => BusinessLogic/Resources/img}/flags/ES.svg (100%) rename src/{DemoUI/src/Controllers/assets/images => BusinessLogic/Resources/img}/flags/FR.svg (100%) rename src/{DemoUI/src/Controllers/assets/images => BusinessLogic/Resources/img}/flags/GB.svg (100%) rename src/{DemoUI/src/Controllers/assets/images => BusinessLogic/Resources/img}/flags/IE.svg (100%) rename src/{DemoUI/src/Controllers/assets/images => BusinessLogic/Resources/img}/flags/IT.svg (100%) rename src/{DemoUI/src/Controllers/assets/images => BusinessLogic/Resources/img}/flags/NL.svg (100%) rename src/{DemoUI/src/Controllers/assets/images => BusinessLogic/Resources/img}/flags/PT.svg (100%) rename src/{DemoUI/src/Controllers/assets/images => BusinessLogic/Resources/img}/flags/TR.svg (100%) rename src/{DemoUI/src/Controllers/assets/images => BusinessLogic/Resources/img}/logo-pl.svg (100%) rename src/{DemoUI/src/Controllers/assets/images => BusinessLogic/Resources/img}/logo.png (100%) rename src/{DemoUI/src/Controllers/assets/images => BusinessLogic/Resources/img}/logo.svg (100%) delete mode 100644 src/DemoUI/src/Controllers/assets/images/carriers/carrier.jpg diff --git a/src/DemoUI/src/Controllers/assets/images/dashboard.png b/src/BusinessLogic/Resources/img/dashboard.png similarity index 100% rename from src/DemoUI/src/Controllers/assets/images/dashboard.png rename to src/BusinessLogic/Resources/img/dashboard.png diff --git a/src/DemoUI/src/Controllers/assets/images/flags/AT.svg b/src/BusinessLogic/Resources/img/flags/AT.svg similarity index 100% rename from src/DemoUI/src/Controllers/assets/images/flags/AT.svg rename to src/BusinessLogic/Resources/img/flags/AT.svg diff --git a/src/DemoUI/src/Controllers/assets/images/flags/BE.svg b/src/BusinessLogic/Resources/img/flags/BE.svg similarity index 100% rename from src/DemoUI/src/Controllers/assets/images/flags/BE.svg rename to src/BusinessLogic/Resources/img/flags/BE.svg diff --git a/src/DemoUI/src/Controllers/assets/images/flags/DE.svg b/src/BusinessLogic/Resources/img/flags/DE.svg similarity index 100% rename from src/DemoUI/src/Controllers/assets/images/flags/DE.svg rename to src/BusinessLogic/Resources/img/flags/DE.svg diff --git a/src/DemoUI/src/Controllers/assets/images/flags/ES.svg b/src/BusinessLogic/Resources/img/flags/ES.svg similarity index 100% rename from src/DemoUI/src/Controllers/assets/images/flags/ES.svg rename to src/BusinessLogic/Resources/img/flags/ES.svg diff --git a/src/DemoUI/src/Controllers/assets/images/flags/FR.svg b/src/BusinessLogic/Resources/img/flags/FR.svg similarity index 100% rename from src/DemoUI/src/Controllers/assets/images/flags/FR.svg rename to src/BusinessLogic/Resources/img/flags/FR.svg diff --git a/src/DemoUI/src/Controllers/assets/images/flags/GB.svg b/src/BusinessLogic/Resources/img/flags/GB.svg similarity index 100% rename from src/DemoUI/src/Controllers/assets/images/flags/GB.svg rename to src/BusinessLogic/Resources/img/flags/GB.svg diff --git a/src/DemoUI/src/Controllers/assets/images/flags/IE.svg b/src/BusinessLogic/Resources/img/flags/IE.svg similarity index 100% rename from src/DemoUI/src/Controllers/assets/images/flags/IE.svg rename to src/BusinessLogic/Resources/img/flags/IE.svg diff --git a/src/DemoUI/src/Controllers/assets/images/flags/IT.svg b/src/BusinessLogic/Resources/img/flags/IT.svg similarity index 100% rename from src/DemoUI/src/Controllers/assets/images/flags/IT.svg rename to src/BusinessLogic/Resources/img/flags/IT.svg diff --git a/src/DemoUI/src/Controllers/assets/images/flags/NL.svg b/src/BusinessLogic/Resources/img/flags/NL.svg similarity index 100% rename from src/DemoUI/src/Controllers/assets/images/flags/NL.svg rename to src/BusinessLogic/Resources/img/flags/NL.svg diff --git a/src/DemoUI/src/Controllers/assets/images/flags/PT.svg b/src/BusinessLogic/Resources/img/flags/PT.svg similarity index 100% rename from src/DemoUI/src/Controllers/assets/images/flags/PT.svg rename to src/BusinessLogic/Resources/img/flags/PT.svg diff --git a/src/DemoUI/src/Controllers/assets/images/flags/TR.svg b/src/BusinessLogic/Resources/img/flags/TR.svg similarity index 100% rename from src/DemoUI/src/Controllers/assets/images/flags/TR.svg rename to src/BusinessLogic/Resources/img/flags/TR.svg diff --git a/src/DemoUI/src/Controllers/assets/images/logo-pl.svg b/src/BusinessLogic/Resources/img/logo-pl.svg similarity index 100% rename from src/DemoUI/src/Controllers/assets/images/logo-pl.svg rename to src/BusinessLogic/Resources/img/logo-pl.svg diff --git a/src/DemoUI/src/Controllers/assets/images/logo.png b/src/BusinessLogic/Resources/img/logo.png similarity index 100% rename from src/DemoUI/src/Controllers/assets/images/logo.png rename to src/BusinessLogic/Resources/img/logo.png diff --git a/src/DemoUI/src/Controllers/assets/images/logo.svg b/src/BusinessLogic/Resources/img/logo.svg similarity index 100% rename from src/DemoUI/src/Controllers/assets/images/logo.svg rename to src/BusinessLogic/Resources/img/logo.svg diff --git a/src/DemoUI/src/Controllers/assets/images/carriers/carrier.jpg b/src/DemoUI/src/Controllers/assets/images/carriers/carrier.jpg deleted file mode 100644 index ca396d3587a371b932a67c7dff13c6877bc2ac4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5088 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'images/carriers/carrier.jpg'); + return $assetsRepo->getResourceUrl("images/carriers/{$carrierName}.jpg"); } /** diff --git a/src/DemoUI/src/Services/Integration/UrlService.php b/src/DemoUI/src/Services/Integration/UrlService.php index 7bb6e3e8..4d46bb7e 100644 --- a/src/DemoUI/src/Services/Integration/UrlService.php +++ b/src/DemoUI/src/Services/Integration/UrlService.php @@ -26,10 +26,10 @@ public static function getEndpointUrl($controllerName, $action) * * @return string */ - public static function getAssetsUrl($filePath) + public static function getResourceUrl($filePath) { $schema = empty($_SERVER['HTTPS']) ? 'http' : 'https'; - return "{$schema}}://{$_SERVER['HTTP_HOST']}/Controllers/assets/{$filePath}"; + return "{$schema}}://{$_SERVER['HTTP_HOST']}/Views/resources/{$filePath}"; } -} \ No newline at end of file +} From c6fe95ca6e9000ea0a1d1a5809d0b0cb079f4b56 Mon Sep 17 00:00:00 2001 From: "igor.pesic" Date: Thu, 28 May 2020 15:33:02 +0200 Subject: [PATCH 011/214] Remove non-core translations Issue: PLCR1801-13 --- .../Language/Translations/de_DE.json | 95 ------------------- .../Language/Translations/en_EN.json | 95 ------------------- .../Language/Translations/es_ES.json | 95 ------------------- .../Language/Translations/fr_FR.json | 95 ------------------- .../Language/Translations/it_IT.json | 95 ------------------- 5 files changed, 475 deletions(-) diff --git a/src/BusinessLogic/Language/Translations/de_DE.json b/src/BusinessLogic/Language/Translations/de_DE.json index b81580aa..7de87a1d 100644 --- a/src/BusinessLogic/Language/Translations/de_DE.json +++ b/src/BusinessLogic/Language/Translations/de_DE.json @@ -237,100 +237,5 @@ "openModule": "PacklinkPRO-Modul öffnen", "autotestPassedSuccessfully": "Der automatische Test wurde erfolgreich abgeschlossen!", "testNotSuccessful": "Der Test wurde nicht erfolgreich abgeschlossen!" - }, - "wooCommerce": { - "pleaseInstall": "Bitte installieren und aktivieren Sie WooCommerce.", - "withThisVersion": "Mit dieser Version haben Sie Zugriff auf alle von Ihren Kunden gewünschten Versanddienste", - "labelNotAvailable": "Label is not yet available.", - "chooseDropOff": "Bitte wählen Sie einen Ort für die Abgabe.", - "noCostsSet": "Wenn für die Versandklassen keine Preise festgelegt wurden, werden die in der Konfiguration von Packlink PRO festgelegten Preise verwendet." - }, - "shopify": { - "success": "Erfolgreich", - "open": "Offen", - "canceled": "Storniert", - "failure": "Abgebrochen", - "installPacklinkApplication": "Packlink PRO Shopify Anwendung installieren", - "fullDomain": "Vollständige Domain Ihres Shopify-Shops", - "installApplication": "Anwendung installieren", - "enterFullURL": "Vollständige URL eingeben, zum Beispiel: https://my-great-store.myshopify.com", - "privacy": "Datenschutz", - "privacyIssueContact": "Bitte wenden Sie sich bei Datenschutzangelegenheiten an privacy@packlink.com", - "pricingPlan": "With your Shopify pricing plan you can generate shipments from orders tab, but cannot display our shipping prices to your customers. If you have any doubt ask our support team or Shopify support team.", - "chooseDeliveryLocation": "This is a drop-off service. Please choose a delivery location after completing the order.", - "dropOffDeliverySelection": "Drop-off delivery point selection" - }, - "prestaShop": { - "allowPrestaShop": "Erlauben Sie PrestaShop, sich mit dem PacklinkPRO-Konto zu verbinden", - "orderStatus": "Bestellstatus von PrestaShop", - "packlinkOffers": "Packlink bietet Ihnen die Möglichkeit, den Status Ihren PrestaShop-Bestellungen mit den Versandinformationen zu aktualisieren. Sie können dies jederzeit bearbeiten.", - - "titleCharacters": "Der Titel darf max. 64 Zeichen lang sein.", - "carrierServiceMapNotFound": "Zuordnung des Versanddienstes nicht gefunden", - "carrierNotFound": "Versandunternehmen nicht gefunden", - "carrierAlreadyDeleted": "Versandunternehmen bereits gelöscht", - "upgradeStarted": "Upgrade to plugin v2.0.0 has started." - }, - "shopware": { - "highestTax": "Höchste Steuer", - "createShipmentDraft": "Versandentwurf auf Packlink PRO erstellen", - "totalShippingCharges": "Gesamtversandkosten (EUR):", - "printShipmentLabels": "Versandetiketten drucken", - "loginToSee": "Bitte melden Sie sich an, um die Versandinformationen zu sehen", - "deliveryAddress": "Lieferadresse", - "labels": "Versandetiketten", - "shipmentStatus": "Shipment status", - "shipmentCost": "Shipment Cost" - }, - "magento": { - "enabled": "Aktiviert", - "title": "Titel", - "calculateHandlingFee": "Bearbeitungsgebühr kalkulieren", - "handlingApplied": "Bearbeitung durchgeführt", - "allowedMethods": "Zugelassene Methoden", - "sortOrder": "Sortierreihenfolge", - "carrierTrackingUrlNotProvided": "Der Spediteur hat keine Tracking-URL angegeben.", - "carrierTrackingUrlError": "Fehler beim Abrufen der Tracking-URL des Spediteurs.", - "orderDraftError": "Beim Erstellen des Auftragsentwurfs ist ein Fehler aufgetreten. Fehler: %s.", - "noShipmentLabelsAvailable": "Keine Packlink-Versandetiketten verfügbar.", - "orderIdLinkMissing": "Auftragsnummer bzw. Link fehlt.", - "selectDestCountries": "Bitte wählen Sie die Zielländer aus.", - "serviceAvailableDestCountries": "Service für alle Zielländer verfügbar", - "seeCountriesList": "Länderliste anzeigen", - "selectAllowedDestination": "Wählen Sie die für diesen Service zulässigen Zielländer aus", - "chooseDropOffLocation": "Bitte wählen Sie eine Abgabestelle für die ausgewählte Versandart." - }, - "middleware": { - "orders": "Aufträge", - "orderNumber": "Auftragsnummer", - "customer": "Kunde", - "paymentStatus": "Zahlungsstand", - "packlinkShipment": "Versand mit Packlink", - "shippingLabel": "Versandetikett", - "total": "Gesamt", - "allOrders": "Alle Aufträge", - "pendingOrders": "Ausstehende Aufträge", - "gettingOrdersFrom": "Aufträge von %s werden abgerufen. Bitte warten Sie einen Augenblick.", - "expand": "Mehr anzeigen", - "collapse": "Weniger anzeigen", - "paid": "Bezahlt", - "changePaymentStatusInfo": "Um den Zahlungsstatus eines Auftrags zu ändern, rufen Sie das Menü Aufträge in Ihrem :system Shop auf und öffnen Sie den jeweiligen Auftrag.", - "noOrderSelected": "Kein Auftrag gewählt", - "noShipmentLabels": "Für die gewählten Aufträge sind keine Versandetiketten verfügbar", - "errorPrintShipmentLabels": "Beim Versuch des Massendrucks von Versandetiketten ist ein Fehler aufgetreten", - "directoryNotCreated": "Verzeichnis %s wurde nicht angelegt", - "orderDetailsNotFound": "Auftragsdetails nicht gefunden", - "unableCreateBulkLabels": "Massenetikettendatei kann nicht angelegt werden", - "invalidPayload": "Ungültige Nutzlast", - "startEnjoying": "Start enjoying Packlink PRO!", - "registerYourAccount": "Register your account", - "individualOffer": "We would like to get to know you better in order to adapt to you and to send you an individual offer", - "monthlyShipmentVolume": "What is your monthly shipment volume?", - "mainOnlineStoreOn": "Your main online store is on the platform...", - "marketplaceOutletsStatement": "I do not have any marketplace outlets", - "termsAndPrivacy": "I accept the Terms of Service and the Privacy Policy of Packlink", - "authorizeMailSending": "I authorise Packlink Shipping S.L. to send me commercial communications by e-mail", - "passwordLength": "The password must be at least 6 characters long.", - "password": "Password" } } \ No newline at end of file diff --git a/src/BusinessLogic/Language/Translations/en_EN.json b/src/BusinessLogic/Language/Translations/en_EN.json index 33583ab3..994344d8 100644 --- a/src/BusinessLogic/Language/Translations/en_EN.json +++ b/src/BusinessLogic/Language/Translations/en_EN.json @@ -237,100 +237,5 @@ "openModule": "Open PacklinkPRO module", "autotestPassedSuccessfully": "Auto-test passed successfully!", "testNotSuccessful": "The test did not complete successfully." - }, - "wooCommerce": { - "pleaseInstall": "Please install and activate WooCommerce.", - "withThisVersion": "With this version you will have access to any shipping service that your clients demand. Go to the configuration and select which shipping services should be offered to your customers!", - "labelNotAvailable": "Label is not yet available.", - "chooseDropOff": "Please choose a drop-off location.", - "noCostsSet": "If no costs are set for shipping classes, costs defined in Packlink PRO configuration will be used." - }, - "shopify": { - "success": "Success", - "open": "Open", - "canceled": "Canceled", - "failure": "Failure", - "installPacklinkApplication": "Install Packlink PRO Shopify application", - "fullDomain": "Full domain of your Shopify store", - "installApplication": "Install application", - "enterFullURL": "Enter full URL, for example: https://my-great-store.myshopify.com", - "privacy": "Privacy", - "privacyIssueContact": "Please, for any privacy issue contact privacy@packlink.com", - "pricingPlan": "With your Shopify pricing plan you can generate shipments from orders tab, but cannot display our shipping prices to your customers. If you have any doubt ask our support team or Shopify support team.", - "chooseDeliveryLocation": "This is a drop-off service. Please choose a delivery location after completing the order.", - "dropOffDeliverySelection": "Drop-off delivery point selection" - }, - "prestaShop": { - "allowPrestaShop": "Allow PrestaShop to connect to PacklinkPRO", - "orderStatus": "PrestaShop Order Status", - "packlinkOffers": "Packlink offers you the possibility to update your PrestaShop order status with the shipping info. You can edit anytime.", - - "titleCharacters": "Title can have at most 64 characters.", - "carrierServiceMapNotFound": "Carrier service mapping not found", - "carrierNotFound": "Carrier not found", - "carrierAlreadyDeleted": "Carrier already deleted", - "upgradeStarted": "Upgrade to plugin v2.0.0 has started." - }, - "shopware": { - "highestTax": "Highest tax", - "createShipmentDraft": "Create shipment draft on Packlink PRO", - "totalShippingCharges": "Total shipping charges (EUR):", - "printShipmentLabels": "Print shipment labels", - "loginToSee": "Please login to see shipment information", - "deliveryAddress": "Delivery address", - "labels": "Labels", - "shipmentStatus": "Shipment status", - "shipmentCost": "Shipment Cost" - }, - "magento": { - "enabled": "Enabled", - "title": "Title", - "calculateHandlingFee": "Calculate Handling Fee", - "handlingApplied": "Handling Applied", - "allowedMethods": "Allowed Methods", - "sortOrder": "Sort Order", - "carrierTrackingUrlNotProvided": "Carrier did not provide tracking URL.", - "carrierTrackingUrlError": "Error getting carrier tracking URL.", - "orderDraftError": "There has been an error creating order draft. Error: %s.", - "noShipmentLabelsAvailable": "No Packlink shipment labels available.", - "orderIdLinkMissing": "Order ID and/or link missing.", - "selectDestCountries": "You must select destination countries.", - "serviceAvailableDestCountries": "Service available for all destination countries", - "seeCountriesList": "See countries list", - "selectAllowedDestination": "Select allowed destination countries for this service", - "chooseDropOffLocation": "Please choose a drop-off location for selected shipping method." - }, - "middleware": { - "orders": "Orders", - "orderNumber": "Order number", - "customer": "Customer", - "paymentStatus": "Payment status", - "packlinkShipment": "Packlink Shipment", - "shippingLabel": "Shipping label", - "total": "Total", - "allOrders": "All orders", - "pendingOrders": "Pending orders", - "gettingOrdersFrom": "Getting orders from %s. Please wait a moment.", - "expand": "Expand", - "collapse": "Collapse", - "paid": "Paid", - "changePaymentStatusInfo": "To change the payment status of an order, go to the orders menu in your :system store and open the specific order.", - "noOrderSelected": "No order selected.", - "noShipmentLabels": "No shipment labels available for the selected orders", - "errorPrintShipmentLabels": "There has been an error while trying to bulk print shipment labels", - "directoryNotCreated": "Directory %s was not created", - "orderDetailsNotFound": "Order details not found", - "unableCreateBulkLabels": "Unable to create bulk labels file", - "invalidPayload": "Invalid payload", - "startEnjoying": "Start enjoying Packlink PRO!", - "registerYourAccount": "Register your account", - "individualOffer": "We would like to get to know you better in order to adapt to you and to send you an individual offer", - "monthlyShipmentVolume": "What is your monthly shipment volume?", - "mainOnlineStoreOn": "Your main online store is on the platform...", - "marketplaceOutletsStatement": "I do not have any marketplace outlets", - "termsAndPrivacy": "I accept the Terms of Service and the Privacy Policy of Packlink", - "authorizeMailSending": "I authorise Packlink Shipping S.L. to send me commercial communications by e-mail", - "passwordLength": "The password must be at least 6 characters long.", - "password": "Password" } } \ No newline at end of file diff --git a/src/BusinessLogic/Language/Translations/es_ES.json b/src/BusinessLogic/Language/Translations/es_ES.json index 3b351e1e..73681a09 100644 --- a/src/BusinessLogic/Language/Translations/es_ES.json +++ b/src/BusinessLogic/Language/Translations/es_ES.json @@ -237,100 +237,5 @@ "openModule": "Abrir el módulo PacklinkPRO", "autotestPassedSuccessfully": "Prueba automática superada con éxito.", "testNotSuccessful": "La prueba no se ha completado correctamente." - }, - "wooCommerce": { - "pleaseInstall": "Por favor, instala y activa WooCommerce.", - "withThisVersion": "Con esta versión tendrás acceso a cualquier servicio de envío que tus clientes te demanden. Ve a configuración y selecciona los métodos de envío que elijas para tus clientes.", - "labelNotAvailable": "La etiqueta todavía no está disponible.", - "chooseDropOff": "Por favor, elige un lugar de entrega.", - "noCostsSet": "Si no se establecen costes para las clases de envío, se utilizarán los costes definidos en la configuración de Packlink PRO." - }, - "shopify": { - "success": "Completado", - "open": "Abrir", - "canceled": "Cancelado", - "failure": "Error", - "installPacklinkApplication": "Instalar la aplicación Packlink PRO para Shopify", - "fullDomain": "Dominio completo de tu tienda Shopify", - "installApplication": "Instalar aplicación", - "enterFullURL": "Introduce la URL completa, por ejemplo: https://my-great-store.myshopify.com", - "privacy": "Privacidad", - "privacyIssueContact": "Para cualquier asunto relacionado con la privacidad, escribe un correo electrónico a privacy@packlink.com", - "pricingPlan": "With your Shopify pricing plan you can generate shipments from orders tab, but cannot display our shipping prices to your customers. If you have any doubt ask our support team or Shopify support team.", - "chooseDeliveryLocation": "This is a drop-off service. Please choose a delivery location after completing the order.", - "dropOffDeliverySelection": "Drop-off delivery point selection" - }, - "prestaShop": { - "allowPrestaShop": "Permitir que PrestaShop se conecte a la cuenta Packlink PRO", - "orderStatus": "Estado del pedido de PrestaShop", - "packlinkOffers": "Con Packlink puedes actualizar el estado de tu pedido de PrestaShop con la información de envío. Puedes editarla en cualquier momento.", - - "titleCharacters": "El nombre puede tener como máximo 64 caracteres.", - "carrierServiceMapNotFound": "Servicio de transporte no encontrado", - "carrierNotFound": "Transportista no encontrado", - "carrierAlreadyDeleted": "Transportista ya eliminado", - "upgradeStarted": "Se ha iniciado la actualización a plugin v2.0.0." - }, - "shopware": { - "highestTax": "Impuesto más alto", - "createShipmentDraft": "Crear un borrador de envío en Packlink PRO", - "totalShippingCharges": "Gastos de envío totales (EUR):", - "printShipmentLabels": "Imprimir etiquetas de envío", - "loginToSee": "Inicia sesión para consultar la información del envío", - "deliveryAddress": "Dirección de entrega", - "labels": "Etiquetas", - "shipmentStatus": "Shipment status", - "shipmentCost": "Shipment Cost" - }, - "magento": { - "enabled": "Activado", - "title": "Título", - "calculateHandlingFee": "Calcular la tarifa de manipulación", - "handlingApplied": "Manipulación efectuada", - "allowedMethods": "Métodos permitidos", - "sortOrder": "Clasificación", - "carrierTrackingUrlNotProvided": "El transportista no ha proporcionado la URL de seguimiento.", - "carrierTrackingUrlError": "Error al obtener la URL de seguimiento del transportista.", - "orderDraftError": "Se ha producido un error al crear el borrador del pedido. Error: %s.", - "noShipmentLabelsAvailable": "No hay etiquetas de envío Packlink disponibles.", - "orderIdLinkMissing": "Falta el enlace o el número de pedido.", - "selectDestCountries": "Debes seleccionar los países de destino.", - "serviceAvailableDestCountries": "Servicio disponible para todos los países de destino", - "seeCountriesList": "Consultar el listado de países", - "selectAllowedDestination": "Seleccionar países de destino permitidos para este servicio", - "chooseDropOffLocation": "Elige un punto de entrega para el método de envío seleccionado." - }, - "middleware": { - "orders": "Pedidos", - "orderNumber": "Número de pedido", - "customer": "Cliente", - "paymentStatus": "Estado del pago", - "packlinkShipment": "Envío Packlink", - "shippingLabel": "Etiqueta de envío", - "total": "Total", - "allOrders": "Todos los pedidos", - "pendingOrders": "Pedidos pendientes", - "gettingOrdersFrom": "Recibiendo pedidos de %s. Espera un momento.", - "expand": "Ver el detalle", - "collapse": "Ocultar", - "paid": "Pagado", - "changePaymentStatusInfo": "Para cambiar el estado del pago de un pedido, ve al menú de pedidos de tu tienda :system y abre el pedido correspondiente.", - "noOrderSelected": "Ningún pedido seleccionado.", - "noShipmentLabels": "No hay etiquetas de envío disponibles para los pedidos seleccionados", - "errorPrintShipmentLabels": "Ha ocurrido un error al intentar imprimir etiquetas de envío en grandes cantidades", - "directoryNotCreated": "El directorio %s no se ha creado", - "orderDetailsNotFound": "No se han encontrado los detalles del pedido", - "unableCreateBulkLabels": "No se pudo crear el archivo de etiquetas en grandes cantidades", - "invalidPayload": "Carga inválida", - "startEnjoying": "Start enjoying Packlink PRO!", - "registerYourAccount": "Register your account", - "individualOffer": "We would like to get to know you better in order to adapt to you and to send you an individual offer", - "monthlyShipmentVolume": "What is your monthly shipment volume?", - "mainOnlineStoreOn": "Your main online store is on the platform...", - "marketplaceOutletsStatement": "I do not have any marketplace outlets", - "termsAndPrivacy": "I accept the Terms of Service and the Privacy Policy of Packlink", - "authorizeMailSending": "I authorise Packlink Shipping S.L. to send me commercial communications by e-mail", - "passwordLength": "The password must be at least 6 characters long.", - "password": "Password" } } \ No newline at end of file diff --git a/src/BusinessLogic/Language/Translations/fr_FR.json b/src/BusinessLogic/Language/Translations/fr_FR.json index 8ff6b482..7747e3fe 100644 --- a/src/BusinessLogic/Language/Translations/fr_FR.json +++ b/src/BusinessLogic/Language/Translations/fr_FR.json @@ -237,100 +237,5 @@ "openModule": "Ouvrir le module PacklinkPRO", "autotestPassedSuccessfully": "Test automatique réussi avec succès !", "testNotSuccessful": "Le test a échoué." - }, - "wooCommerce": { - "pleaseInstall": "Veuillez installer et activer WooCommerce", - "withThisVersion": "Avec cette version, vous aurez accès à tous les services de livraison demandés par vos clients.", - "labelNotAvailable": "L'étiquette n'est pas encore disponible", - "chooseDropOff": "Veuillez choisir un point de collecte", - "noCostsSet": "En cas d’absence de détermination des frais des catégories d’expédition, les frais définis dans la configuration Packlink PRO s’appliqueront." - }, - "shopify": { - "success": "Réussite", - "open": "Ouvrir", - "canceled": "Annulé", - "failure": "Échec", - "installPacklinkApplication": "Installez l’application Packlink PRO pour Shopify", - "fullDomain": "Domaine complet sur votre boutique Shopify", - "installApplication": "Installez l’application", - "enterFullURL": "Saisissez l’URL complète, par exemple : https://my-great-store.myshopify.com", - "privacy": "Confidentialité", - "privacyIssueContact": "En cas de problème de confidentialité, veuillez contacter privacy@packlink.com", - "pricingPlan": "With your Shopify pricing plan you can generate shipments from orders tab, but cannot display our shipping prices to your customers. If you have any doubt ask our support team or Shopify support team.", - "chooseDeliveryLocation": "This is a drop-off service. Please choose a delivery location after completing the order.", - "dropOffDeliverySelection": "Drop-off delivery point selection" - }, - "prestaShop": { - "allowPrestaShop": "Permettre à PrestaShop de connecter votre compte Packlink", - "orderStatus": "Statut de la commande PrestaShop", - "packlinkOffers": "Packlink vous offre la possibilité de mettre à jour le statut de votre commande PrestaShop à travers les informations relatives à la livraison. Vous pouvez modifier à n'importe quel moment.", - - "titleCharacters": "Le titre doit contenir au maximum 64 caractères.", - "carrierServiceMapNotFound": "Service de transport introuvable", - "carrierNotFound": "Transporteur introuvable.", - "carrierAlreadyDeleted": "Transporteur déjà supprimé.", - "upgradeStarted": "Upgrade to plugin v2.0.0 has started." - }, - "shopware": { - "highestTax": "Taxe maximale", - "createShipmentDraft": "Créer un projet d’expédition sur Packlink PRO", - "totalShippingCharges": "Total des frais d’envoi (EUR) :", - "printShipmentLabels": "Imprimer les étiquettes d’envoi", - "loginToSee": "Veuillez vous connecter pour consulter les informations d’envoi", - "deliveryAddress": "Adresse de livraison", - "labels": "Bordereaux", - "shipmentStatus": "Shipment status", - "shipmentCost": "Shipment Cost" - }, - "magento": { - "enabled": "Activé", - "title": "Titre", - "calculateHandlingFee": "Calculer le coût de gestion", - "handlingApplied": "Gestion appliquée", - "allowedMethods": "Méthodes disponibles", - "sortOrder": "Trier", - "carrierTrackingUrlNotProvided": "Le transporteur n’a fourni aucun URL de suivi.", - "carrierTrackingUrlError": "Erreur dans l’obtention de l’URL de suivi du transporteur.", - "orderDraftError": "Une erreur s’est produite lors de la création du projet de commande. Erreur : %s.", - "noShipmentLabelsAvailable": "Étiquettes d’envoi Packlink indisponibles.", - "orderIdLinkMissing": "Numéro et/ou lien de commande absent.", - "selectDestCountries": "Veuillez sélectionner les pays de destination.", - "serviceAvailableDestCountries": "Service disponible pour tous les pays de destination", - "seeCountriesList": "Voir liste des pays", - "selectAllowedDestination": "Sélectionnez les pays de destination autorisés pour ce service", - "chooseDropOffLocation": "Veuillez choisir un point relais pour la méthode de livraison sélectionnée." - }, - "middleware": { - "orders": "Commandes", - "orderNumber": "Numéro de commande", - "customer": "Client", - "paymentStatus": "Statut du paiement", - "packlinkShipment": "Envoi Packlink", - "shippingLabel": "Étiquette d’envoi", - "total": "Total", - "allOrders": "Toutes les commandes", - "pendingOrders": "Commandes en attente", - "gettingOrdersFrom": "Obtention des commandes de %s Veuillez patienter.", - "expand": "Voir le détail", - "collapse": "Cacher", - "paid": "Payé", - "changePaymentStatusInfo": "Pour modifier le statut de paiement d’une commande, rendez-vous au menu des commandes dans votre boutique :system et ouvrez la commande correspondante.", - "noOrderSelected": "Aucune commande sélectionnée.", - "noShipmentLabels": "Aucun bordereau d’envoi disponible pour les commandes sélectionnées", - "errorPrintShipmentLabels": "Une erreur s’est produite au moment de l’impression des bordereaux d’envoi en vrac", - "directoryNotCreated": "Le répertoire :directory n’a pas été créé", - "orderDetailsNotFound": "Informations de la commande non trouvées", - "unableCreateBulkLabels": "Le fichier des bordereaux en vrac n’a pas pu être créé", - "invalidPayload": "Charge utile invalide", - "startEnjoying": "Start enjoying Packlink PRO!", - "registerYourAccount": "Register your account", - "individualOffer": "We would like to get to know you better in order to adapt to you and to send you an individual offer", - "monthlyShipmentVolume": "What is your monthly shipment volume?", - "mainOnlineStoreOn": "Your main online store is on the platform...", - "marketplaceOutletsStatement": "I do not have any marketplace outlets", - "termsAndPrivacy": "I accept the Terms of Service and the Privacy Policy of Packlink", - "authorizeMailSending": "I authorise Packlink Shipping S.L. to send me commercial communications by e-mail", - "passwordLength": "The password must be at least 6 characters long.", - "password": "Password" } } \ No newline at end of file diff --git a/src/BusinessLogic/Language/Translations/it_IT.json b/src/BusinessLogic/Language/Translations/it_IT.json index 1a4f51ca..5f4f8c76 100644 --- a/src/BusinessLogic/Language/Translations/it_IT.json +++ b/src/BusinessLogic/Language/Translations/it_IT.json @@ -237,100 +237,5 @@ "openModule": "Apri il modulo di PacklinkPRO", "autotestPassedSuccessfully": "L’auto-test è stato superato con successo!", "testNotSuccessful": "Il test non è stato completato correttamente." - }, - "wooCommerce": { - "pleaseInstall": "Si prega di installare e attivare WooCommerce", - "withThisVersion": "Con questa versione avrai accesso a qualsiasi servizio di spedizione richiesto dai tuoi clienti.", - "labelNotAvailable": "L'etichetta non è disponibile", - "chooseDropOff": "Per favore scegli un punto corriere", - "noCostsSet": "Se non sono impostate le spese per le classi di spedizione, saranno usate le spese definite nella configurazione di Packlink PRO." - }, - "shopify": { - "success": "Operazione riuscita", - "open": "Apri", - "canceled": "Annullato", - "failure": "Errore", - "installPacklinkApplication": "Installa l’applicazione di Packlink PRO per Shopify", - "fullDomain": "Dominio completo del tuo negozio Shopify", - "installApplication": "Installa l’applicazione", - "enterFullURL": "Inserisci l’URL completo, ad esempio: https://il-mio-store.myshopify.com", - "privacy": "Privacy", - "privacyIssueContact": "Per eventuali problemi relativi alla privacy, contattaci all’indirizzo privacy@packlink.com", - "pricingPlan": "With your Shopify pricing plan you can generate shipments from orders tab, but cannot display our shipping prices to your customers. If you have any doubt ask our support team or Shopify support team.", - "chooseDeliveryLocation": "This is a drop-off service. Please choose a delivery location after completing the order.", - "dropOffDeliverySelection": "Drop-off delivery point selection" - }, - "prestaShop": { - "allowPrestaShop": "Permetti a PrestaShop di connettersi all'account Packlink PRO", - "orderStatus": "Stato della spedizione di PrestaShop", - "packlinkOffers": "Packlink ti offre la possibilità di aggiornare lo stato dell'ordine di PrestaShop con le informazioni di spedizione. Puoi modificare in qualsiasi momento.", - - "titleCharacters": "Il titolo può avere un massimo di 64 caratteri", - "carrierServiceMapNotFound": "Servizio di spedizione non trovato", - "carrierNotFound": "Corriere non trovato", - "carrierAlreadyDeleted": "Corriere già eliminato", - "upgradeStarted": "È stato avviato l'aggiornamento al plug-in v2.0.0." - }, - "shopware": { - "highestTax": "Tassa più alta", - "createShipmentDraft": "Crea una bozza di spedizione su Packlink PRO", - "totalShippingCharges": "Spese di spedizione totali (EUR):", - "printShipmentLabels": "Stampa le etichette di spedizione", - "loginToSee": "Per vedere i dati della spedizione, effettua il login", - "deliveryAddress": "Indirizzo di consegna", - "labels": "Etichette", - "shipmentStatus": "Shipment status", - "shipmentCost": "Shipment Cost" - }, - "magento": { - "enabled": "Abilitato", - "title": "Titolo", - "calculateHandlingFee": "Calcola tasse di gestione", - "handlingApplied": "Gestione applicata", - "allowedMethods": "Metodi disponibili", - "sortOrder": "Ordina", - "carrierTrackingUrlNotProvided": "Il corriere non ha fornito un URL di tracking.", - "carrierTrackingUrlError": "Errore durante l’acquisizione dell’URL di tracking del corriere.", - "orderDraftError": "Si è verificato un errore durante la creazione della bozza dell’ordine. Errore: %s.", - "noShipmentLabelsAvailable": "Nessuna etichetta di spedizione di Packlink disponibile.", - "orderIdLinkMissing": "ID ordine e/o link assenti.", - "selectDestCountries": "Devi selezionare i paesi di destinazione.", - "serviceAvailableDestCountries": "Servizio disponibile per tutti i paesi di destinazione", - "seeCountriesList": "Vedi l’elenco dei paesi", - "selectAllowedDestination": "Seleziona i paesi di destinazione consentiti per questo servizio", - "chooseDropOffLocation": "Scegli un punto di accettazione per il metodo di spedizione selezionato." - }, - "middleware": { - "orders": "Ordini", - "orderNumber": "Numero ordine", - "customer": "Cliente", - "paymentStatus": "Stato del pagamento", - "packlinkShipment": "Spedizione Packlink", - "shippingLabel": "Etichetta di spedizione", - "total": "Totale", - "allOrders": "Tutti gli ordini", - "pendingOrders": "Ordini in attesa", - "gettingOrdersFrom": "Acquisizione ordini di %s in corso. Attendi qualche istante.", - "expand": "Espandi", - "collapse": "Comprimi", - "paid": "Pagato", - "changePaymentStatusInfo": "Per modificare lo stato del pagamento di un ordine, vai al menu degli ordini nel tuo negozio :system e apri l’ordine specifico.", - "noOrderSelected": "Nessun ordine selezionato.", - "noShipmentLabels": "Nessuna etichetta di spedizione disponibile per gli ordini selezionati", - "errorPrintShipmentLabels": "Si è verificato un errore durante il tentativo di stampa di etichette in blocco", - "directoryNotCreated": "La directory %s non è stata creata", - "orderDetailsNotFound": "Non sono stati trovati i dettagli dell’ordine", - "unableCreateBulkLabels": "Impossibile creare il file di etichette in blocco", - "invalidPayload": "Payload non valido", - "startEnjoying": "Start enjoying Packlink PRO!", - "registerYourAccount": "Register your account", - "individualOffer": "We would like to get to know you better in order to adapt to you and to send you an individual offer", - "monthlyShipmentVolume": "What is your monthly shipment volume?", - "mainOnlineStoreOn": "Your main online store is on the platform...", - "marketplaceOutletsStatement": "I do not have any marketplace outlets", - "termsAndPrivacy": "I accept the Terms of Service and the Privacy Policy of Packlink", - "authorizeMailSending": "I authorise Packlink Shipping S.L. to send me commercial communications by e-mail", - "passwordLength": "The password must be at least 6 characters long.", - "password": "Password" } } \ No newline at end of file From 67cae5f4ffc9733b3ca91d4a26798d0de398b96f Mon Sep 17 00:00:00 2001 From: "igor.pesic" Date: Fri, 29 May 2020 14:15:18 +0200 Subject: [PATCH 012/214] Create module state controller Issue: PLCR1801-16 --- .../Controllers/DTO/ModuleState.php | 33 ++++ .../Controllers/ModuleStateController.php | 51 +++++++ .../Controllers/ModuleStateControllerTest.php | 144 ++++++++++++++++++ 3 files changed, 228 insertions(+) create mode 100644 src/BusinessLogic/Controllers/DTO/ModuleState.php create mode 100644 src/BusinessLogic/Controllers/ModuleStateController.php create mode 100644 tests/BusinessLogic/Controllers/ModuleStateControllerTest.php diff --git a/src/BusinessLogic/Controllers/DTO/ModuleState.php b/src/BusinessLogic/Controllers/DTO/ModuleState.php new file mode 100644 index 00000000..3e5e5b3a --- /dev/null +++ b/src/BusinessLogic/Controllers/DTO/ModuleState.php @@ -0,0 +1,33 @@ +getAuthorizationToken(); + + /** @var ParcelInfo|null $defaultParcel */ + $defaultParcel = $configService->getDefaultParcel(); + + /** @var Warehouse|null $defaultWarehouse */ + $defaultWarehouse = $configService->getDefaultWarehouse(); + + $result = new ModuleState(); + + if (empty($apiToken)) { + $result->state = ModuleState::LOGIN_STATE; + + } else if (empty($defaultParcel) || empty($defaultWarehouse)) { + $result->state = ModuleState::ONBOARDING_STATE; + + } else { + $result->state = ModuleState::SERVICES_STATE; + } + + return $result; + } +} diff --git a/tests/BusinessLogic/Controllers/ModuleStateControllerTest.php b/tests/BusinessLogic/Controllers/ModuleStateControllerTest.php new file mode 100644 index 00000000..283911b4 --- /dev/null +++ b/tests/BusinessLogic/Controllers/ModuleStateControllerTest.php @@ -0,0 +1,144 @@ +moduleStateController = new ModuleStateController(); + } + + /** + * Tests the case when auth key is not set. + */ + public function testStateNoAuthKey() + { + $configuration = new TestShopConfiguration(); + + new TestServiceRegister( + array( + Configuration::CLASS_NAME => function () use ($configuration) { + return $configuration; + } + ) + ); + + $result = $this->moduleStateController->getCurrentState(); + + $this->assertEquals(ModuleState::LOGIN_STATE, $result->state); + } + + /** + * Tests the case when auth key is set and default warehouse is not set. + */ + public function testStateAuthKeySet_DefaultWarehouseNotSet() + { + $configuration = new TestShopConfiguration(); + + $configuration->setAuthorizationToken('validToken'); + + new TestServiceRegister( + array( + Configuration::CLASS_NAME => function () use ($configuration) { + return $configuration; + } + ) + ); + + $result = $this->moduleStateController->getCurrentState(); + + $this->assertEquals(ModuleState::ONBOARDING_STATE, $result->state); + } + + /** + * Tests the case when auth key, default warehouse and parcel are set. + */ + public function testStateAuthKeySet_DefaultWarehouseAndParcelSet() + { + $configuration = new TestShopConfiguration(); + + $configuration->setAuthorizationToken('validToken'); + $this->createDefaultParcel($configuration); + $this->createDefaultWarehouse($configuration); + + new TestServiceRegister( + array( + Configuration::CLASS_NAME => function () use ($configuration) { + return $configuration; + } + ) + ); + + $result = $this->moduleStateController->getCurrentState(); + + $this->assertEquals(ModuleState::SERVICES_STATE, $result->state); + } + + /** + * @param TestShopConfiguration $configuration + */ + protected function createDefaultParcel(TestShopConfiguration $configuration) + { + $parcel = new ParcelInfo(); + $parcel->default = true; + $parcel->weight = 20; + $parcel->height = 20; + $parcel->length = 20; + $parcel->width = 20; + $configuration->setDefaultParcel($parcel); + } + + /** + * @param TestShopConfiguration $configuration + */ + protected function createDefaultWarehouse(TestShopConfiguration $configuration) + { + $warehouse = new Warehouse(); + $warehouse->default = true; + $warehouse->address = 'test 12'; + $warehouse->city = 'Test'; + $warehouse->alias = 'Test'; + $warehouse->company = 'Test'; + $warehouse->country = 'Test'; + $warehouse->email = 'test@test.com'; + $warehouse->id = '1'; + $warehouse->phone = '011/1111111'; + $warehouse->name = 'test'; + $warehouse->postalCode = '11111'; + $warehouse->surname = 'test'; + $configuration->setDefaultWarehouse($warehouse); + } +} From 86c40b82222f7ee7ba699a3f02a47d211b5de003 Mon Sep 17 00:00:00 2001 From: "igor.pesic" Date: Fri, 29 May 2020 16:03:18 +0200 Subject: [PATCH 013/214] Fix review issues Issue: PLCR1801-12 --- .../Interfaces/TranslationService.php | 2 +- .../Language/TranslationService.php | 74 +++++++++++-------- .../Translations/{de_DE.json => de.json} | 0 .../Translations/{en_EN.json => en.json} | 0 .../Translations/{es_ES.json => es.json} | 0 .../Translations/{fr_FR.json => fr.json} | 0 .../Translations/{it_IT.json => it.json} | 0 src/BusinessLogic/Language/Translator.php | 53 +++++++++++++ .../Configuration/Configuration.php | 4 + .../Language/TranslationServiceTest.php | 31 +++++++- .../Translations/{de_DE.json => de.json} | 0 .../Translations/{en_EN.json => en.json} | 0 12 files changed, 132 insertions(+), 32 deletions(-) rename src/BusinessLogic/Language/Translations/{de_DE.json => de.json} (100%) rename src/BusinessLogic/Language/Translations/{en_EN.json => en.json} (100%) rename src/BusinessLogic/Language/Translations/{es_ES.json => es.json} (100%) rename src/BusinessLogic/Language/Translations/{fr_FR.json => fr.json} (100%) rename src/BusinessLogic/Language/Translations/{it_IT.json => it.json} (100%) create mode 100644 src/BusinessLogic/Language/Translator.php rename tests/BusinessLogic/Language/Translations/{de_DE.json => de.json} (100%) rename tests/BusinessLogic/Language/Translations/{en_EN.json => en.json} (100%) diff --git a/src/BusinessLogic/Language/Interfaces/TranslationService.php b/src/BusinessLogic/Language/Interfaces/TranslationService.php index 623db2b8..b57a713f 100644 --- a/src/BusinessLogic/Language/Interfaces/TranslationService.php +++ b/src/BusinessLogic/Language/Interfaces/TranslationService.php @@ -25,4 +25,4 @@ interface TranslationService * @return string Translated string. */ public function translate($key, array $arguments = array()); -} \ No newline at end of file +} diff --git a/src/BusinessLogic/Language/TranslationService.php b/src/BusinessLogic/Language/TranslationService.php index ae4d89a9..14eb61d2 100644 --- a/src/BusinessLogic/Language/TranslationService.php +++ b/src/BusinessLogic/Language/TranslationService.php @@ -13,18 +13,26 @@ */ class TranslationService implements BaseService { + /** + * Default language. + */ + const DEFAULT_LANG = 'en'; + /** * Associative array in format: * ['currentLang' => ['translationKey' => 'translation']] * @var array */ - protected $translations = array(); + protected static $translations = array(); /** * @var string $translationsFileBasePath */ protected $translationsFileBasePath; + /** + * @var string + */ private $currentLanguage; /** @@ -58,14 +66,14 @@ public function translate($key, array $arguments = array()) { $this->currentLanguage = Configuration::getCurrentLanguage(); - if (empty($this->translations[$this->currentLanguage][$key])) { + if (empty(self::$translations[$this->currentLanguage])) { $this->initializeTranslations(); } $result = $this->getTranslation($key, $this->currentLanguage); if ($result === null) { - $result = $this->getTranslation($key, 'en'); + $result = $this->getTranslation($key, self::DEFAULT_LANG); } if ($result === null) { @@ -81,15 +89,19 @@ public function translate($key, array $arguments = array()) protected function initializeTranslations() { $languageLowerCase = strtolower($this->currentLanguage); - $languageUpperCase = strtoupper($this->currentLanguage); - $this->translationsFileBasePath = rtrim($this->translationsFileBasePath, '/') . '/'; - $translationFilePath = "{$this->translationsFileBasePath}{$languageLowerCase}_{$languageUpperCase}.json"; + $translationFilePath = "{$this->translationsFileBasePath}{$languageLowerCase}.json"; $this->initializeLanguage($translationFilePath, $this->currentLanguage); $this->initializeFallbackLanguage(); } - private function initializeLanguage($translationFilePath, $language) + /** + * Initializes the language to translations dictionary. + * + * @param $translationFilePath + * @param $language + */ + protected function initializeLanguage($translationFilePath, $language) { try { $serializedJson = file_get_contents($translationFilePath); @@ -99,47 +111,49 @@ private function initializeLanguage($translationFilePath, $language) } if ($serializedJson !== false) { - $this->translations[$language] = json_decode($serializedJson, true); + self::$translations[$language] = json_decode($serializedJson, true); } } - private function initializeFallbackLanguage() + /** + * Initializes the fallback language. + */ + protected function initializeFallbackLanguage() { - if (strtolower($this->currentLanguage) != 'en') { - $translationFilePath = "{$this->translationsFileBasePath}en_EN.json"; - $this->initializeLanguage($translationFilePath, 'en'); + if (strtolower($this->currentLanguage) !== self::DEFAULT_LANG) { + $defaultLang = self::DEFAULT_LANG; + $translationFilePath = "{$this->translationsFileBasePath}{$defaultLang}.json"; + $this->initializeLanguage($translationFilePath, self::DEFAULT_LANG); } } - private function getTranslation($key, $currentLanguage) + /** + * Gets the translation for given key and language. + * @param string $key + * @param string $currentLanguage + * + * @return string|null + */ + protected function getTranslation($key, $currentLanguage) { $keys = explode('_', $key); + $keysCount = count($keys); - if (count($keys) > 0 && isset($this->translations[$currentLanguage])) { - $result = $this->translations[$currentLanguage]; + if ($keysCount > 0 && isset(self::$translations[$currentLanguage])) { + $result = self::$translations[$currentLanguage]; } else { $result = null; } - for ($i = 0; $i < count($keys); $i++) { - if (!isset($result[$keys[$i]])) { - $result = null; - break; - } - - if ($this->isNonIterableElement($result, $keys, $i)) { + foreach ($keys as $i => $value) { + if (!isset($result[$value]) || (!is_array($result[$value]) && $i < $keysCount - 1)) { $result = null; break; } - $result = $result[$keys[$i]]; + $result = $result[$value]; } - return $result; - } - - private function isNonIterableElement($currentNamespace, $keys, $i) - { - return !is_array($currentNamespace[$keys[$i]]) && $i < count($keys) - 1; + return is_string($result) ? $result : null; } -} \ No newline at end of file +} diff --git a/src/BusinessLogic/Language/Translations/de_DE.json b/src/BusinessLogic/Language/Translations/de.json similarity index 100% rename from src/BusinessLogic/Language/Translations/de_DE.json rename to src/BusinessLogic/Language/Translations/de.json diff --git a/src/BusinessLogic/Language/Translations/en_EN.json b/src/BusinessLogic/Language/Translations/en.json similarity index 100% rename from src/BusinessLogic/Language/Translations/en_EN.json rename to src/BusinessLogic/Language/Translations/en.json diff --git a/src/BusinessLogic/Language/Translations/es_ES.json b/src/BusinessLogic/Language/Translations/es.json similarity index 100% rename from src/BusinessLogic/Language/Translations/es_ES.json rename to src/BusinessLogic/Language/Translations/es.json diff --git a/src/BusinessLogic/Language/Translations/fr_FR.json b/src/BusinessLogic/Language/Translations/fr.json similarity index 100% rename from src/BusinessLogic/Language/Translations/fr_FR.json rename to src/BusinessLogic/Language/Translations/fr.json diff --git a/src/BusinessLogic/Language/Translations/it_IT.json b/src/BusinessLogic/Language/Translations/it.json similarity index 100% rename from src/BusinessLogic/Language/Translations/it_IT.json rename to src/BusinessLogic/Language/Translations/it.json diff --git a/src/BusinessLogic/Language/Translator.php b/src/BusinessLogic/Language/Translator.php new file mode 100644 index 00000000..6e4e812a --- /dev/null +++ b/src/BusinessLogic/Language/Translator.php @@ -0,0 +1,53 @@ +translate($key, $arguments); + } + + /** + * Retrieves translation service. + * + * @return TranslationServiceInterface + */ + protected static function getTranslationService() + { + if (self::$translationService === null) { + self::$translationService = ServiceRegister::getService(TranslationServiceInterface::CLASS_NAME); + } + + return self::$translationService; + } + + /** + * Resets translation service instance. + */ + public static function resetInstance() + { + static::$translationService = null; + } +} diff --git a/src/Infrastructure/Configuration/Configuration.php b/src/Infrastructure/Configuration/Configuration.php index a32f266b..9001ffeb 100644 --- a/src/Infrastructure/Configuration/Configuration.php +++ b/src/Infrastructure/Configuration/Configuration.php @@ -59,6 +59,8 @@ abstract class Configuration extends Singleton protected $repository; /** + * Retrieves current language. + * * @return string */ public static function getCurrentLanguage() @@ -67,6 +69,8 @@ public static function getCurrentLanguage() } /** + * Sets current language. + * * @param string $currentLanguage */ public static function setCurrentLanguage($currentLanguage) diff --git a/tests/BusinessLogic/Language/TranslationServiceTest.php b/tests/BusinessLogic/Language/TranslationServiceTest.php index 5b2e8606..c9300ddf 100644 --- a/tests/BusinessLogic/Language/TranslationServiceTest.php +++ b/tests/BusinessLogic/Language/TranslationServiceTest.php @@ -44,6 +44,35 @@ public function setUp() ); } + /** + * Tests translation function when current language is not set in config service. + */ + public function testTranslateCurrentLanguageNotSet() + { + $configuration = new TestShopConfiguration(); + Configuration::setCurrentLanguage(null); + $logger = new TestShopLogger(); + $timeProvider = new TestTimeProvider(); + + new TestServiceRegister( + array( + Configuration::CLASS_NAME => function () use ($configuration) { + return $configuration; + }, + TimeProvider::CLASS_NAME => function () use ($timeProvider) { + return $timeProvider; + }, + ShopLoggerAdapter::CLASS_NAME => function () use ($logger) { + return $logger; + } + ) + ); + + $translation = $this->translationService->translate('testKey'); + + $this->assertStringStartsWith('testValueEn', $translation); + } + /** * Tests translation function when non existing key is tried to be translated for not supported language. */ @@ -117,4 +146,4 @@ public function testTranslateToGermanNestedKeyWithPlaceholders() $this->assertEquals('Test1 1, test2 2.', $translation); } -} \ No newline at end of file +} diff --git a/tests/BusinessLogic/Language/Translations/de_DE.json b/tests/BusinessLogic/Language/Translations/de.json similarity index 100% rename from tests/BusinessLogic/Language/Translations/de_DE.json rename to tests/BusinessLogic/Language/Translations/de.json diff --git a/tests/BusinessLogic/Language/Translations/en_EN.json b/tests/BusinessLogic/Language/Translations/en.json similarity index 100% rename from tests/BusinessLogic/Language/Translations/en_EN.json rename to tests/BusinessLogic/Language/Translations/en.json From 3bcf49af5fc51477a900dd11d7680f0761af693f Mon Sep 17 00:00:00 2001 From: "igor.pesic" Date: Fri, 29 May 2020 17:11:34 +0200 Subject: [PATCH 014/214] Create page state controller Issue: PLCR1801-17 --- .../Controllers/DTO/ModuleState.php | 2 +- .../Controllers/ModuleStateController.php | 2 +- .../Resources/js/LoginController.js | 14 +++++++++ .../Resources/js/OnboardingController.js | 14 +++++++++ .../Resources/js/StateController.js | 29 +++++++++++++++---- 5 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 src/BusinessLogic/Resources/js/LoginController.js create mode 100644 src/BusinessLogic/Resources/js/OnboardingController.js diff --git a/src/BusinessLogic/Controllers/DTO/ModuleState.php b/src/BusinessLogic/Controllers/DTO/ModuleState.php index 3e5e5b3a..0d98438b 100644 --- a/src/BusinessLogic/Controllers/DTO/ModuleState.php +++ b/src/BusinessLogic/Controllers/DTO/ModuleState.php @@ -14,7 +14,7 @@ class ModuleState extends FrontDto /** * Login state key. */ - const LOGIN_STATE = 'login/register'; + const LOGIN_STATE = 'login'; /** * On-boarding state key. diff --git a/src/BusinessLogic/Controllers/ModuleStateController.php b/src/BusinessLogic/Controllers/ModuleStateController.php index 25d99b15..4042670c 100644 --- a/src/BusinessLogic/Controllers/ModuleStateController.php +++ b/src/BusinessLogic/Controllers/ModuleStateController.php @@ -39,7 +39,7 @@ public function getCurrentState() if (empty($apiToken)) { $result->state = ModuleState::LOGIN_STATE; - } else if (empty($defaultParcel) || empty($defaultWarehouse)) { + } else if ($defaultParcel === null || $defaultWarehouse === null) { $result->state = ModuleState::ONBOARDING_STATE; } else { diff --git a/src/BusinessLogic/Resources/js/LoginController.js b/src/BusinessLogic/Resources/js/LoginController.js new file mode 100644 index 00000000..90fa1275 --- /dev/null +++ b/src/BusinessLogic/Resources/js/LoginController.js @@ -0,0 +1,14 @@ +var Packlink = window.Packlink || {}; + +(function () { + function LoginController(configuration) { + /** + * Displays page content. + */ + this.display = function () { + + }; + } + + Packlink.LoginController = LoginController; +})(); diff --git a/src/BusinessLogic/Resources/js/OnboardingController.js b/src/BusinessLogic/Resources/js/OnboardingController.js new file mode 100644 index 00000000..c043181b --- /dev/null +++ b/src/BusinessLogic/Resources/js/OnboardingController.js @@ -0,0 +1,14 @@ +var Packlink = window.Packlink || {}; + +(function () { + function OnboardingController(configuration) { + /** + * Displays page content. + */ + this.display = function () { + + }; + } + + Packlink.OnboardingController = OnboardingController; +})(); diff --git a/src/BusinessLogic/Resources/js/StateController.js b/src/BusinessLogic/Resources/js/StateController.js index 63660563..b92c6b48 100644 --- a/src/BusinessLogic/Resources/js/StateController.js +++ b/src/BusinessLogic/Resources/js/StateController.js @@ -13,6 +13,7 @@ var Packlink = window.Packlink || {}; * hasCountryConfiguration: boolean, * canDisplayCarrierLogos: boolean, * shippingServiceMaxTitleLength: number, + * stateUrl: string, * autoConfigureStartUrl: string, * dashboardGetStatusUrl: string, * defaultParcelGetUrl: string, @@ -41,6 +42,7 @@ var Packlink = window.Packlink || {}; */ function StateController(configuration) { let pageControllerFactory = Packlink.pageControllerFactory; + let ajaxService = Packlink.ajaxService; let sidebarButtons = [ 'shipping-methods', @@ -113,11 +115,7 @@ var Packlink = window.Packlink || {}; this.display = function () { pageControllerFactory.getInstance('footer', getControllerConfiguration('footer')).display(); - let dp = pageControllerFactory.getInstance( - 'shipping-methods', - getControllerConfiguration('shipping-methods') - ); - dp.display(); + ajaxService.get(configuration.stateUrl, displayPageBasedOnState); }; /** @@ -147,6 +145,27 @@ var Packlink = window.Packlink || {}; return context; }; + function displayPageBasedOnState(response) { + let dp = pageControllerFactory.getInstance( + 'shipping-methods', + getControllerConfiguration('shipping-methods') + ); + + if (response.state === 'login') { + dp = pageControllerFactory.getInstance( + 'login', + getControllerConfiguration('onboarding') + ); + } else if (response.state === 'onBoarding') { + dp = pageControllerFactory.getInstance( + 'onboarding', + getControllerConfiguration('onboarding') + ); + } + + dp.display(); + } + /** * Navigation callback. * Handles navigation menu button clicked event. From 742c93a4af021901d17f9994fa68b5e264197f12 Mon Sep 17 00:00:00 2001 From: "igor.pesic" Date: Wed, 3 Jun 2020 09:13:57 +0200 Subject: [PATCH 015/214] Add UI mechanism and login page without styles Issue: PLCR1801-19, PLCR1801-21 --- .../Controllers/DTO/ModuleState.php | 14 +++++ .../Controllers/LoginController.php | 44 +++++++++++++++ .../Language/Translations/en.json | 17 +++--- .../Language/Translations/es.json | 17 +++--- .../Resources/js/LoginController.js | 47 ++++++++++++++++ .../Resources/js/StateController.js | 54 +++++++++++++------ .../Resources/js/TemplateService.js | 41 ++++++++++++++ .../Resources/templates/login.html | 48 +++++++++++++++++ src/DemoUI/Lib/Composer.php | 1 + src/DemoUI/composer.json | 1 + src/DemoUI/src/Bootstrap.php | 2 +- src/DemoUI/src/Controllers/Index.php | 4 ++ .../src/Controllers/LoginController.php | 11 ++-- .../src/Controllers/ModuleStateController.php | 21 ++++++++ src/DemoUI/src/Views/index.php | 13 +++++ 15 files changed, 302 insertions(+), 33 deletions(-) create mode 100644 src/BusinessLogic/Controllers/LoginController.php create mode 100644 src/BusinessLogic/Resources/templates/login.html create mode 100644 src/DemoUI/src/Controllers/ModuleStateController.php diff --git a/src/BusinessLogic/Controllers/DTO/ModuleState.php b/src/BusinessLogic/Controllers/DTO/ModuleState.php index 0d98438b..32c3f0c6 100644 --- a/src/BusinessLogic/Controllers/DTO/ModuleState.php +++ b/src/BusinessLogic/Controllers/DTO/ModuleState.php @@ -11,6 +11,11 @@ */ class ModuleState extends FrontDto { + /** + * Fully qualified name of this class. + */ + const CLASS_NAME = __CLASS__; + /** * Login state key. */ @@ -30,4 +35,13 @@ class ModuleState extends FrontDto * @var string Current state. */ public $state; + + /** + * Fields for this DTO. Needed for validation and transformation from/to array. + * + * @var array + */ + protected static $fields = array( + 'state', + ); } diff --git a/src/BusinessLogic/Controllers/LoginController.php b/src/BusinessLogic/Controllers/LoginController.php new file mode 100644 index 00000000..a91445bb --- /dev/null +++ b/src/BusinessLogic/Controllers/LoginController.php @@ -0,0 +1,44 @@ +login($apiKey); + } catch (RuntimeException $e) { + /** @var ConfigurationService $configService */ + $configService = ServiceRegister::getService(Configuration::CLASS_NAME); + if ($configService->getAuthorizationToken() !== null) { + $configService->setAuthorizationToken(null); + } + } + + return $result; + } +} \ No newline at end of file diff --git a/src/BusinessLogic/Language/Translations/en.json b/src/BusinessLogic/Language/Translations/en.json index 994344d8..d23d2395 100644 --- a/src/BusinessLogic/Language/Translations/en.json +++ b/src/BusinessLogic/Language/Translations/en.json @@ -16,14 +16,17 @@ "loading": "Loading..." }, "login": { - "dontHaveAccount?": "Don't have an account?", - "register": "Register", - "selectCountry": "Select country to start", - "yourAPIKey": "Your API key can be found under", - "connectYourAccount": "Connect your account", "apiKey": "Api key", - "logIn": "Log in", - "apiKeyIncorrect": "API key was incorrect." + "apiKeyIncorrect": "API key was incorrect.", + "dontHaveAccount?": "Don't have an account?", + "welcome": "Welcome to Packlink PRO", + "connectYourService": "Connect your service using your key. You'll find it in the", + "settings": "\"Settings\"", + "section": "section of", + "proApiKey": "\"Packlink Pro API Key\"", + "validateApiKey": "Validate API key", + "chooseYourCountry": "Choose your country to start the registration process", + "registerMe": "Register me" }, "dashboard": { "almostThere": "You're almost there!", diff --git a/src/BusinessLogic/Language/Translations/es.json b/src/BusinessLogic/Language/Translations/es.json index 73681a09..5420f845 100644 --- a/src/BusinessLogic/Language/Translations/es.json +++ b/src/BusinessLogic/Language/Translations/es.json @@ -16,14 +16,17 @@ "loading": "Cargando..." }, "login": { + "apiKey": "Api key", + "apiKeyIncorrect": "Clave de API incorrecta", "dontHaveAccount?": "¿No tienes una cuenta?", - "register": "Registro", - "selectCountry": "Selecciona el país para comenzar", - "yourAPIKey": "Puedes encontrar tu clave de API en ", - "connectYourAccount": "Conecta tu cuenta", - "apiKey": "Clave de API", - "logIn": "Iniciar sesión", - "apiKeyIncorrect": "Clave de API incorrecta" + "welcome": "Te damos la bienvenida a Packlink PRO", + "connectYourService": "Conecta tu servicio mediante tu clave. La encontrarás en la sección", + "settings": "\"Configuración\"", + "section": "apartado", + "proApiKey": "\"Packlink Pro API Key\"", + "validateApiKey": "Validar API key", + "chooseYourCountry": "Elige tu país para comenzar el registro", + "registerMe": "Registrarme" }, "dashboard": { "almostThere": "¡Ya casi está!", diff --git a/src/BusinessLogic/Resources/js/LoginController.js b/src/BusinessLogic/Resources/js/LoginController.js index 90fa1275..026fec00 100644 --- a/src/BusinessLogic/Resources/js/LoginController.js +++ b/src/BusinessLogic/Resources/js/LoginController.js @@ -1,13 +1,60 @@ var Packlink = window.Packlink || {}; (function () { + /** + * Handles login page logic. + * + * @param configuration + * @constructor + */ function LoginController(configuration) { + + let templateService = Packlink.templateService, + ajaxService = Packlink.ajaxService, + state = Packlink.state, + templateId = 'pl-login-page'; + /** * Displays page content. */ this.display = function () { + templateService.setCurrentTemplate(templateId); + + let loginPage = templateService.getComponent('pl-login-page'); + templateService.getComponent('pl-login-form', loginPage).addEventListener( + 'submit', + login + ); }; + + /** + * Handles form submit. + * @param event + * @returns {boolean} + */ + function login(event) { + event.preventDefault(); + + ajaxService.post(configuration.submit, {apiKey: event.target['apiKey'].value}, successfulLogin, failedLogin); + + return false; + } + + function successfulLogin(response) { + let errorMsg = templateService.getComponent('pl-login-error-msg'); + + if (response.success) { + errorMsg.classList.remove('visible'); + state.goToState('onboarding'); + } else { + errorMsg.classList.add('visible'); + } + } + + function failedLogin() { + console.log('Unhandled error!'); + } } Packlink.LoginController = LoginController; diff --git a/src/BusinessLogic/Resources/js/StateController.js b/src/BusinessLogic/Resources/js/StateController.js index b92c6b48..8fcd3531 100644 --- a/src/BusinessLogic/Resources/js/StateController.js +++ b/src/BusinessLogic/Resources/js/StateController.js @@ -14,6 +14,7 @@ var Packlink = window.Packlink || {}; * canDisplayCarrierLogos: boolean, * shippingServiceMaxTitleLength: number, * stateUrl: string, + * loginUrl: string, * autoConfigureStartUrl: string, * dashboardGetStatusUrl: string, * defaultParcelGetUrl: string, @@ -35,7 +36,16 @@ var Packlink = window.Packlink || {}; * getSystemOrderStatusesUrl: string, * orderStatusMappingsSaveUrl: string, * orderStatusMappingsGetUrl: string, - * getShippingCountriesUrl: string + * getShippingCountriesUrl: string, + * templates: { + * 'required': { + * 'pl-login-page': InnerHTML, + * 'pl-register-page': InnerHTML + * }, + * 'extensionPoints': { + * 'extensionPointId': InnerHTML + * } + * } * }} configuration * * @constructor @@ -65,6 +75,7 @@ var Packlink = window.Packlink || {}; let sidebarController = new Packlink.SidebarController(navigate, sidebarButtons, submenuItems); let utilityService = Packlink.utilityService; + let templateService = Packlink.templateService; let context = ''; let pageConfiguration = { @@ -105,6 +116,9 @@ var Packlink = window.Packlink || {}; 'footer': { getDebugStatusUrl: configuration.debugGetStatusUrl, setDebugStatusUrl: configuration.debugSetStatusUrl + }, + 'login': { + submit: configuration.loginUrl } }; @@ -113,6 +127,12 @@ var Packlink = window.Packlink || {}; } this.display = function () { + Object.values(configuration.templates).forEach((value) => { + for (let [templateId, innerHtml] of Object.entries(value)) { + templateService.populateTemplate(templateId, innerHtml); + } + }); + pageControllerFactory.getInstance('footer', getControllerConfiguration('footer')).display(); ajaxService.get(configuration.stateUrl, displayPageBasedOnState); @@ -145,25 +165,29 @@ var Packlink = window.Packlink || {}; return context; }; - function displayPageBasedOnState(response) { - let dp = pageControllerFactory.getInstance( - 'shipping-methods', - getControllerConfiguration('shipping-methods') - ); + this.goToState = goToState; + function displayPageBasedOnState(response) { if (response.state === 'login') { - dp = pageControllerFactory.getInstance( - 'login', - getControllerConfiguration('onboarding') - ); + goToState('login'); + } else if (response.state === 'onBoarding') { - dp = pageControllerFactory.getInstance( - 'onboarding', - getControllerConfiguration('onboarding') - ); + goToState('onboarding'); + + } else { + goToState('shipping-methods'); } + } - dp.display(); + function goToState(controller) { + let dp = pageControllerFactory.getInstance( + controller, + getControllerConfiguration(controller) + ); + + if (dp) { + dp.display(); + } } /** diff --git a/src/BusinessLogic/Resources/js/TemplateService.js b/src/BusinessLogic/Resources/js/TemplateService.js index 12c9bc56..d9b1fddf 100644 --- a/src/BusinessLogic/Resources/js/TemplateService.js +++ b/src/BusinessLogic/Resources/js/TemplateService.js @@ -91,6 +91,47 @@ var Packlink = window.Packlink || {}; return extensionPoint; }; + /** + * Populates the template with the provided inner HTML. + * + * @param templateId + * @param innerHTML + * + * @returns {string} + */ + this.populateTemplate = function (templateId, innerHTML) { + let temp = document.getElementById(templateId); + + if (!temp) { + return ''; + } + + temp.innerHTML = innerHTML; + }; + + /** + * Sets current template visible. + * + * @param templateId + * + * @returns {string} + */ + this.setCurrentTemplate = function (templateId) { + let temp = document.getElementById(templateId); + + if (!temp) { + return ''; + } + + let visiblePages = document.querySelectorAll('.pl-page-visible'); + + visiblePages.forEach(function (page) { + page.classList.remove('pl-page-visible'); + }); + + temp.classList.add('pl-page-visible'); + }; + /** * Removes component's children. * diff --git a/src/BusinessLogic/Resources/templates/login.html b/src/BusinessLogic/Resources/templates/login.html new file mode 100644 index 00000000..83527a4c --- /dev/null +++ b/src/BusinessLogic/Resources/templates/login.html @@ -0,0 +1,48 @@ + diff --git a/src/DemoUI/Lib/Composer.php b/src/DemoUI/Lib/Composer.php index 4b3b674a..e6a6760e 100644 --- a/src/DemoUI/Lib/Composer.php +++ b/src/DemoUI/Lib/Composer.php @@ -13,6 +13,7 @@ public static function postUpdate() $map = array( $fromBase . 'js' => $toBase . 'js', + $fromBase . 'templates' => $toBase . 'templates', $fromBase . 'LocationPicker/js' => $toBase . 'js/location', $fromBase . 'LocationPicker/css' => $toBase . 'css/location', $fromBase . 'img' => $toBase . 'images', diff --git a/src/DemoUI/composer.json b/src/DemoUI/composer.json index b4360399..cbfaddbc 100755 --- a/src/DemoUI/composer.json +++ b/src/DemoUI/composer.json @@ -9,6 +9,7 @@ "autoload": { "psr-4": { "Logeecom\\Infrastructure\\": "../Infrastructure", + "Logeecom\\Tests\\": "../../tests", "Packlink\\BusinessLogic\\": "../BusinessLogic", "Packlink\\DemoUI\\Lib\\": "Lib", "Packlink\\DemoUI\\": "src" diff --git a/src/DemoUI/src/Bootstrap.php b/src/DemoUI/src/Bootstrap.php index 630001f2..ba46e113 100644 --- a/src/DemoUI/src/Bootstrap.php +++ b/src/DemoUI/src/Bootstrap.php @@ -2,7 +2,6 @@ namespace Packlink\DemoUI; -use Logeecom\Infrastructure\BootstrapComponent; use Logeecom\Infrastructure\Configuration\ConfigEntity; use Logeecom\Infrastructure\Http\CurlHttpClient; use Logeecom\Infrastructure\Http\HttpClient; @@ -17,6 +16,7 @@ use Logeecom\Infrastructure\TaskExecution\Process; use Logeecom\Infrastructure\TaskExecution\QueueItem; use Logeecom\Tests\Infrastructure\Common\TestComponents\ORM\MemoryQueueItemRepository; +use Packlink\BusinessLogic\BootstrapComponent; use Packlink\BusinessLogic\Configuration; use Packlink\BusinessLogic\OrderShipmentDetails\Models\OrderShipmentDetails; use Packlink\BusinessLogic\Scheduler\Models\Schedule; diff --git a/src/DemoUI/src/Controllers/Index.php b/src/DemoUI/src/Controllers/Index.php index c94b8f88..ae4a6623 100644 --- a/src/DemoUI/src/Controllers/Index.php +++ b/src/DemoUI/src/Controllers/Index.php @@ -1,7 +1,11 @@ handleAction(); \ No newline at end of file diff --git a/src/DemoUI/src/Controllers/LoginController.php b/src/DemoUI/src/Controllers/LoginController.php index 85be4213..27609dfb 100644 --- a/src/DemoUI/src/Controllers/LoginController.php +++ b/src/DemoUI/src/Controllers/LoginController.php @@ -11,14 +11,19 @@ class LoginController { /** + * Handles login POST request. + * * @param \Packlink\DemoUI\Controllers\Models\Request $request * - * @return bool + * @throws \Logeecom\Infrastructure\ORM\Exceptions\RepositoryNotRegisteredException + * @throws \Logeecom\Infrastructure\TaskExecution\Exceptions\QueueStorageUnavailableException */ public function login(Request $request) { - $apiKey = $request->getQuery('api_key'); + $payload = $request->getPayload(); + $apiKey = !empty($payload['apiKey']) ? $payload['apiKey'] : null; + $controller = new \Packlink\BusinessLogic\Controllers\LoginController(); - return !empty($apiKey); + echo json_encode(array('success' => $controller->login($apiKey))); } } \ No newline at end of file diff --git a/src/DemoUI/src/Controllers/ModuleStateController.php b/src/DemoUI/src/Controllers/ModuleStateController.php new file mode 100644 index 00000000..53c1a9e0 --- /dev/null +++ b/src/DemoUI/src/Controllers/ModuleStateController.php @@ -0,0 +1,21 @@ +getCurrentState()->toArray()); + } +} \ No newline at end of file diff --git a/src/DemoUI/src/Views/index.php b/src/DemoUI/src/Views/index.php index 3bbb1c6e..85cedeec 100644 --- a/src/DemoUI/src/Views/index.php +++ b/src/DemoUI/src/Views/index.php @@ -22,6 +22,9 @@
+ +
+