diff --git a/UnitTestFiles/Test/V5/OptimizationProfilesUnitTests.php b/UnitTestFiles/Test/V5/OptimizationProfilesUnitTests.php new file mode 100644 index 0000000..4d4d1ca --- /dev/null +++ b/UnitTestFiles/Test/V5/OptimizationProfilesUnitTests.php @@ -0,0 +1,151 @@ +assertInstanceOf(Part::class, new Part()); + } + + public function testPartCanBeCreateFromArray() : void + { + $this->assertInstanceOf(Part::class, new Part([ + 'guid' => '1', + 'Data' => '2', + 'Config' => '3' + ])); + } + + public function testResponseOptimizationProfilesCanBeCreateEmpty() : void + { + $this->assertInstanceOf(ResponseOptimizationProfiles::class, new ResponseOptimizationProfiles()); + } + + public function testResponseOptimizationProfilesCanBeCreateFromArray() : void + { + $this->assertInstanceOf(ResponseOptimizationProfiles::class, new ResponseOptimizationProfiles([ + 'items' => [ + [ + 'optimization_profile_id' => '1', + 'profile_name' => 'aaa', + 'is_default' => false + ], [ + 'optimization_profile_id' => '2', + 'profile_name' => 'bbb', + 'is_default' => true + ] + ] + ])); + } + + public function testResponseSaveOptimizationProfilesCanBeCreateEmpty() : void + { + $this->assertInstanceOf(ResponseSaveOptimizationProfiles::class, new ResponseSaveOptimizationProfiles()); + } + + public function testResponseSaveOptimizationProfilesCanBeCreateFromArray() : void + { + $this->assertInstanceOf(ResponseSaveOptimizationProfiles::class, new ResponseSaveOptimizationProfiles([ + 'items' => [ + [ + 'guid' => '1', + 'id' => 'aaa', + 'parts' => [[ + 'guid' => '11', + 'Data' => '22', + 'Config' => '33' + ], [ + 'guid' => '111', + 'Data' => '222', + 'Config' => '333' + ]] + ], [ + 'guid' => '2', + 'id' => 'bbb', + 'parts' => [[ + 'guid' => '111', + 'Data' => '222', + 'Config' => '333' + ]] + ] + ] + ])); + } + + public function testOptimizationProfilesCanBeCreateEmpty() : void + { + $this->assertInstanceOf(OptimizationProfiles::class, new OptimizationProfiles()); + } + + public function testGetAllMustReturnResponseOptimizationProfiles() : void + { + $op = new OptimizationProfiles(); + $profiles = $op->getAll(); + + $this->assertInstanceOf(ResponseOptimizationProfiles::class, $profiles); + $this->assertNotNull($profiles->items); + + foreach ($profiles->items as $key => $value) { + if ($value->is_default) { + self::$default_profile_id = $value->optimization_profile_id; + break; + } + } + $this->assertNotNull(self::$default_profile_id); + } + + public function testSaveMustReturnResponseSaveOptimizationProfiles() : void + { + $op = new OptimizationProfiles(); + + $params = [ + 'items' => [[ + 'guid' => 'eaa', + 'parts' => [[ + 'guid' => 'pav', + 'data' => [ 'append_date_to_route_name' => true ] + ]], + 'id' => self::$default_profile_id + ]] + ]; + + $result = $op->save($params); + + $this->assertInstanceOf(ResponseSaveOptimizationProfile::class, $result); + } + + public function testDeleteMustReturnResponseSaveOptimizationProfiles() : void + { + $op = new OptimizationProfiles(); + + $params = [ + 'items' => [[ + 'id' => self::$default_profile_id + ]] + ]; + + $result = $op->delete($params); + + $this->assertInstanceOf(ResponseSaveOptimizationProfile::class, $result); + } +} diff --git a/composer.json b/composer.json index 6aeed78..7c82354 100644 --- a/composer.json +++ b/composer.json @@ -2,7 +2,7 @@ "name": "route4me/route4me-php", "description": "Access Route4Me's logistics-as-a-service API using our PHP SDK", "minimum-stability": "stable", - "version": "1.3.1", + "version": "1.4.0", "authors": [ { "name": "Igor Route4Me", diff --git a/examples/OptimizationProfile/FullflowSample.php b/examples/OptimizationProfile/FullflowSample.php new file mode 100644 index 0000000..1ae4137 --- /dev/null +++ b/examples/OptimizationProfile/FullflowSample.php @@ -0,0 +1,67 @@ +getAll(); + $default_profile = null; + + foreach ($profiles->items as $key => $value) { + if ($value->is_default) { + $default_profile = $value; + break; + } + } + + if ($default_profile === null) { + echo 'Default profile is absent.' . PHP_EOL; + } else { + echo 'Found default optimization profile: ' . $default_profile->optimization_profile_id . PHP_EOL; + + // data to save + $params = [ + 'items' => [[ + 'guid' => 'eaa', + 'parts' => [[ + 'guid' => 'pav', + 'data' => [ 'append_date_to_route_name' => true ] + ]], + 'id' => $default_profile->optimization_profile_id + ]] + ]; + + $res = $op->save($params); + echo 'Data for optimization_profile_id: ' . $default_profile->optimization_profile_id + . ' was saved successful.' . PHP_EOL; + + // id to delete + $params = [ + 'items' => [[ + 'id' => $default_profile->optimization_profile_id + ]] + ]; + + $res = $op->delete($params); + echo 'Optimization profile with optimization_profile_id: ' . $default_profile->optimization_profile_id + . ' was deleted successful.' . PHP_EOL; + } +} catch (Exception | ApiError $e) { + echo 'Error, Code: ' . $e->getCode() . PHP_EOL . 'Message: ' . $e->getMessage() . PHP_EOL; +} diff --git a/phpunit.xml b/phpunit.xml index b74246d..c775f7e 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -33,6 +33,7 @@ UnitTestFiles/Test/UserTests.php UnitTestFiles/Test/VehicleTests.php UnitTestFiles/Test/V5/AddressBookUnitTests.php + UnitTestFiles/Test/V5/OptimizationProfilesUnitTests.php UnitTestFiles/Test/V5/OrderUnitTests.php UnitTestFiles/Test/V5/PodWorkflowUnitTests.php UnitTestFiles/Test/V5/RecurringRoutesUnitTests.php @@ -42,6 +43,7 @@ UnitTestFiles/Test/V5/AddressBookUnitTests.php + UnitTestFiles/Test/V5/OptimizationProfilesUnitTests.php UnitTestFiles/Test/V5/OrderUnitTests.php UnitTestFiles/Test/V5/PodWorkflowUnitTests.php UnitTestFiles/Test/V5/RecurringRoutesUnitTests.php diff --git a/src/Route4Me/OptimizationProblem.php b/src/Route4Me/OptimizationProblem.php index 313f3a2..0684dd8 100644 --- a/src/Route4Me/OptimizationProblem.php +++ b/src/Route4Me/OptimizationProblem.php @@ -93,6 +93,12 @@ class OptimizationProblem extends Common */ public $links = []; + /** + * Optimization profile ID + * @var string + */ + public $optimization_profile_id; + public function __construct() { Route4Me::setBaseUrl(Endpoint::BASE_URL); @@ -103,6 +109,7 @@ public static function fromArray(array $params) { $problem = new self(); $problem->optimization_problem_id = Common::getValue($params, 'optimization_problem_id'); + $problem->optimization_profile_id = Common::getValue($params, 'optimization_profile_id'); $problem->user_errors = Common::getValue($params, 'user_errors', []); $problem->state = Common::getValue($params, 'state', []); $problem->sent_to_background = Common::getValue($params, 'sent_to_background', []); @@ -144,9 +151,10 @@ public static function optimize(OptimizationProblemParams $params) 'method' => 'POST', 'query' => Route4Me::generateRequestParameters($allQueryFields, $params), 'body' => [ - 'addresses' => $params->getAddressesArray(), - 'depots' => $params->getDepotsArray(), - 'parameters' => $params->getParametersArray(), + 'addresses' => $params->getAddressesArray(), + 'depots' => $params->getDepotsArray(), + 'parameters' => $params->getParametersArray(), + 'optimization_profile_id' => $params->optimization_profile_id ], ]); diff --git a/src/Route4Me/OptimizationProblemParams.php b/src/Route4Me/OptimizationProblemParams.php index 031e950..dcf3c77 100644 --- a/src/Route4Me/OptimizationProblemParams.php +++ b/src/Route4Me/OptimizationProblemParams.php @@ -16,6 +16,7 @@ class OptimizationProblemParams extends Common public $route_path_output; public $optimized_callback_url; public $redirect = true; + public $optimization_profile_id; public static function fromArray($params) { @@ -42,7 +43,7 @@ public static function fromArray($params) $param->addAddress($address); } - if (isset($params['depots'] )) { + if (isset($params['depots'])) { foreach ($params['depots'] as $depot) { if (!($depot instanceof Address)) { $depot = Address::fromArray($depot); @@ -59,6 +60,7 @@ public static function fromArray($params) $param->optimization_problem_id = self::getValue($params, 'optimization_problem_id'); $param->reoptimize = self::getValue($params, 'reoptimize'); $param->redirect = filter_var(self::getValue($params, 'redirect', true), FILTER_VALIDATE_BOOLEAN); + $param->optimization_profile_id = self::getValue($params, 'optimization_profile_id'); return $param; } diff --git a/src/Route4Me/V5/Enum/Endpoint.php b/src/Route4Me/V5/Enum/Endpoint.php index e21ba2c..064438c 100644 --- a/src/Route4Me/V5/Enum/Endpoint.php +++ b/src/Route4Me/V5/Enum/Endpoint.php @@ -133,4 +133,8 @@ class Endpoint const ORDER_BATCH_UPDATE = self::ORDER . "/batch-update"; const ORDER_BATCH_UPDATE_FILTER = self::ORDER_BATCH_UPDATE . "/filter"; const ORDER_CUSTOM_FIELDS = self::ORDER . "/order-custom-user-fields"; + + const OPTIMIZATION_PROFILES_LIST = self::MAIN_HOST . "/optimization-profiles/data-list"; + const OPTIMIZATION_PROFILES_SAVE = self::MAIN_HOST . "/optimization-profiles/save-entities"; + const OPTIMIZATION_PROFILES_DELETE = self::MAIN_HOST . "/optimization-profiles/delete-entities"; } diff --git a/src/Route4Me/V5/OptimizationProblem.php b/src/Route4Me/V5/OptimizationProblem.php index 2cb75e4..544cd1c 100644 --- a/src/Route4Me/V5/OptimizationProblem.php +++ b/src/Route4Me/V5/OptimizationProblem.php @@ -74,6 +74,7 @@ public static function fromArray(array $params) $problem->optimization_problem_id = Common::getValue($params, 'optimization_problem_id'); + $problem->optimization_profile_id = Common::getValue($params, 'optimization_profile_id'); $problem->user_errors = Common::getValue($params, 'user_errors', []); $problem->state = Common::getValue($params, 'state', []); $problem->sent_to_background = Common::getValue($params, 'sent_to_background', []); @@ -115,9 +116,10 @@ public static function optimize(OptimizationProblemParams $params) 'method' => 'POST', 'query' => Route4Me::generateRequestParameters($allQueryFields, $params), 'body' => [ - 'addresses' => $params->getAddressesArray(), - 'depots' => $params->getDepotsArray(), - 'parameters' => $params->getParametersArray(), + 'addresses' => $params->getAddressesArray(), + 'depots' => $params->getDepotsArray(), + 'parameters' => $params->getParametersArray(), + 'optimization_profile_id' => $params->optimization_profile_id ], ]); @@ -162,5 +164,4 @@ public function removeOptimization($params) return $response; } - -} \ No newline at end of file +} diff --git a/src/Route4Me/V5/OptimizationProblemParams.php b/src/Route4Me/V5/OptimizationProblemParams.php index 0ff018c..e466a94 100644 --- a/src/Route4Me/V5/OptimizationProblemParams.php +++ b/src/Route4Me/V5/OptimizationProblemParams.php @@ -18,6 +18,7 @@ class OptimizationProblemParams extends \Route4Me\Common public $route_path_output; public $optimized_callback_url; public $redirect = true; + public $optimization_profile_id; public static function fromArray($params) { @@ -44,7 +45,7 @@ public static function fromArray($params) $param->addAddress($address); } - if (isset($params['depots'] )) { + if (isset($params['depots'])) { foreach ($params['depots'] as $depot) { if (!($depot instanceof AddressV5)) { $depot = AddressV5::fromArray($depot); @@ -61,6 +62,7 @@ public static function fromArray($params) $param->optimization_problem_id = self::getValue($params, 'optimization_problem_id'); $param->reoptimize = self::getValue($params, 'reoptimize'); $param->redirect = filter_var(self::getValue($params, 'redirect', true), FILTER_VALIDATE_BOOLEAN); + $param->optimization_profile_id = self::getValue($params, 'optimization_profile_id'); return $param; } diff --git a/src/Route4Me/V5/OptimizationProfiles/OptimizationProfiles.php b/src/Route4Me/V5/OptimizationProfiles/OptimizationProfiles.php new file mode 100644 index 0000000..858f2fa --- /dev/null +++ b/src/Route4Me/V5/OptimizationProfiles/OptimizationProfiles.php @@ -0,0 +1,104 @@ + Endpoint::OPTIMIZATION_PROFILES_LIST, + 'method' => 'GET' + ]); + + if (is_array($result) && isset($result['items'])) { + return new ResponseOptimizationProfiles($result); + } + throw new ApiError('Can not convert result to ResponseOptimizationProfiles object.'); + } + + /** + * Save a OptimizationProfiles. + * + * @since 1.4.0 + * + * @param array $params + * Items[] items - Array of items to save + * string guid - GUID + * string id - ID + * Part[] parts - aray of Parts + * @return ResponseSaveOptimizationProfile + * @throws Exception\ApiError + */ + public function save(array $params) : ResponseSaveOptimizationProfile + { + $allBodyFields = ['items']; + + $result = Route4Me::makeRequst([ + 'url' => Endpoint::OPTIMIZATION_PROFILES_SAVE, + 'method' => 'POST', + 'HTTPHEADER' => 'Content-Type: application/json', + 'body' => Route4Me::generateRequestParameters($allBodyFields, $params) + ]); + + if (is_array($result) && isset($result['items'])) { + return new ResponseSaveOptimizationProfile($result); + } + throw new ApiError('Can not convert result to ResponseSaveOptimizationProfile object.'); + } + + /** + * Delete a OptimizationProfiles. + * + * @since 1.4.0 + * + * @param array $params + * Items[] items - Array of items to delete + * string id - ID + * @return ResponseSaveOptimizationProfile + * @throws Exception\ApiError + */ + public function delete(array $params) : ResponseSaveOptimizationProfile + { + $allBodyFields = ['items']; + + $result = Route4Me::makeRequst([ + 'url' => Endpoint::OPTIMIZATION_PROFILES_DELETE, + 'method' => 'POST', + 'HTTPHEADER' => 'Content-Type: application/json', + 'body' => Route4Me::generateRequestParameters($allBodyFields, $params) + ]); + + if (is_array($result) && isset($result['items'])) { + return new ResponseSaveOptimizationProfile($result); + } + throw new ApiError('Can not convert result to ResponseSaveOptimizationProfile object.'); + } +} diff --git a/src/Route4Me/V5/OptimizationProfiles/Part.php b/src/Route4Me/V5/OptimizationProfiles/Part.php new file mode 100644 index 0000000..655f44c --- /dev/null +++ b/src/Route4Me/V5/OptimizationProfiles/Part.php @@ -0,0 +1,41 @@ + $value) { + if (isset($params[$key])) { + $this->{$key} = $params[$key]; + } + } + } + } +} diff --git a/src/Route4Me/V5/OptimizationProfiles/ResponseOptimizationProfile.php b/src/Route4Me/V5/OptimizationProfiles/ResponseOptimizationProfile.php new file mode 100644 index 0000000..884eca8 --- /dev/null +++ b/src/Route4Me/V5/OptimizationProfiles/ResponseOptimizationProfile.php @@ -0,0 +1,41 @@ + $value) { + if (isset($params[$key])) { + $this->{$key} = $params[$key]; + } + } + } + } +} diff --git a/src/Route4Me/V5/OptimizationProfiles/ResponseOptimizationProfiles.php b/src/Route4Me/V5/OptimizationProfiles/ResponseOptimizationProfiles.php new file mode 100644 index 0000000..37539e8 --- /dev/null +++ b/src/Route4Me/V5/OptimizationProfiles/ResponseOptimizationProfiles.php @@ -0,0 +1,37 @@ + $value) { + if (isset($params[$key])) { + if ($key === 'items') { + $this->{$key} = array(); + foreach ($params[$key] as $pod_wf => $value) { + array_push($this->{$key}, new ResponseOptimizationProfile($value)); + } + } + } + } + } + } +} diff --git a/src/Route4Me/V5/OptimizationProfiles/ResponseSaveOptimizationProfile.php b/src/Route4Me/V5/OptimizationProfiles/ResponseSaveOptimizationProfile.php new file mode 100644 index 0000000..e52bd55 --- /dev/null +++ b/src/Route4Me/V5/OptimizationProfiles/ResponseSaveOptimizationProfile.php @@ -0,0 +1,49 @@ + $value) { + if (isset($params[$key])) { + if ($key === 'parts') { + $this->{$key} = array(); + foreach ($params[$key] as $part => $value) { + array_push($this->{$key}, new Part($value)); + } + } else { + $this->{$key} = $params[$key]; + } + } + } + } + } +} diff --git a/src/Route4Me/V5/OptimizationProfiles/ResponseSaveOptimizationProfiles.php b/src/Route4Me/V5/OptimizationProfiles/ResponseSaveOptimizationProfiles.php new file mode 100644 index 0000000..8d2f7d5 --- /dev/null +++ b/src/Route4Me/V5/OptimizationProfiles/ResponseSaveOptimizationProfiles.php @@ -0,0 +1,37 @@ + $value) { + if (isset($params[$key])) { + if ($key === 'items') { + $this->{$key} = array(); + foreach ($params[$key] as $op => $value) { + array_push($this->{$key}, new ResponseSaveOptimizationProfile($value)); + } + } + } + } + } + } +}