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));
+ }
+ }
+ }
+ }
+ }
+ }
+}