@fleetbase/fleetops-engine 0.3.5 → 0.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/README.md +4 -4
  2. package/addon/components/admin/navigator-app.hbs +8 -0
  3. package/addon/components/admin/navigator-app.js +27 -0
  4. package/addon/components/driver-form-panel.js +13 -19
  5. package/addon/components/leaflet-draw-control.js +2 -3
  6. package/addon/components/live-map.js +7 -4
  7. package/addon/components/modals/driver-assign-order.hbs +2 -2
  8. package/addon/components/modals/order-import.hbs +5 -5
  9. package/addon/components/modals/order-new-activity.hbs +1 -1
  10. package/addon/components/order-config/entities-editor.js +3 -5
  11. package/addon/components/route-list.hbs +2 -2
  12. package/addon/components/vendor-form-panel.js +1 -1
  13. package/addon/controllers/application.js +2 -2
  14. package/addon/controllers/base-controller.js +31 -0
  15. package/addon/controllers/management/contacts/index/details.js +2 -2
  16. package/addon/controllers/management/contacts/index/edit.js +2 -2
  17. package/addon/controllers/management/contacts/index/new.js +2 -2
  18. package/addon/controllers/management/contacts/index.js +2 -2
  19. package/addon/controllers/management/drivers/index/details.js +2 -2
  20. package/addon/controllers/management/drivers/index/edit.js +2 -2
  21. package/addon/controllers/management/drivers/index/new.js +2 -2
  22. package/addon/controllers/management/drivers/index.js +11 -24
  23. package/addon/controllers/management/fleets/index/details.js +2 -2
  24. package/addon/controllers/management/fleets/index/edit.js +2 -2
  25. package/addon/controllers/management/fleets/index/new.js +2 -2
  26. package/addon/controllers/management/fleets/index.js +9 -9
  27. package/addon/controllers/management/fuel-reports/index/details.js +2 -2
  28. package/addon/controllers/management/fuel-reports/index/edit.js +2 -2
  29. package/addon/controllers/management/fuel-reports/index/new.js +2 -2
  30. package/addon/controllers/management/fuel-reports/index.js +2 -2
  31. package/addon/controllers/management/issues/index/details.js +2 -2
  32. package/addon/controllers/management/issues/index/edit.js +2 -2
  33. package/addon/controllers/management/issues/index/new.js +2 -2
  34. package/addon/controllers/management/issues/index.js +2 -9
  35. package/addon/controllers/management/places/index/details.js +2 -2
  36. package/addon/controllers/management/places/index/edit.js +2 -2
  37. package/addon/controllers/management/places/index/new.js +2 -2
  38. package/addon/controllers/management/places/index.js +2 -2
  39. package/addon/controllers/management/vehicles/index/details.js +2 -2
  40. package/addon/controllers/management/vehicles/index/edit.js +2 -2
  41. package/addon/controllers/management/vehicles/index/new.js +2 -2
  42. package/addon/controllers/management/vehicles/index.js +11 -12
  43. package/addon/controllers/management/vendors/index/details.js +2 -2
  44. package/addon/controllers/management/vendors/index/edit.js +2 -2
  45. package/addon/controllers/management/vendors/index/new.js +2 -2
  46. package/addon/controllers/management/vendors/index.js +2 -8
  47. package/addon/controllers/management.js +2 -2
  48. package/addon/controllers/operations/orders/index/config/types.js +2 -2
  49. package/addon/controllers/operations/orders/index/config.js +2 -2
  50. package/addon/controllers/operations/orders/index/new.js +64 -44
  51. package/addon/controllers/operations/orders/index/view.js +11 -4
  52. package/addon/controllers/operations/orders/index.js +2 -2
  53. package/addon/controllers/operations/scheduler/index.js +2 -2
  54. package/addon/controllers/operations/service-rates/index/edit.js +12 -18
  55. package/addon/controllers/operations/service-rates/index/new.js +16 -22
  56. package/addon/controllers/operations/service-rates/index.js +2 -2
  57. package/addon/engine.js +6 -0
  58. package/addon/helpers/waypoint-label.js +6 -1
  59. package/addon/routes/application.js +4 -15
  60. package/addon/routes/management/contacts/index.js +9 -5
  61. package/addon/routes/management/drivers/index.js +7 -3
  62. package/addon/routes/management/fleets/index.js +9 -5
  63. package/addon/routes/management/fuel-reports/index.js +9 -5
  64. package/addon/routes/management/issues/index.js +9 -5
  65. package/addon/routes/management/places/index.js +9 -5
  66. package/addon/routes/management/vehicles/index/details.js +2 -2
  67. package/addon/routes/management/vehicles/index.js +9 -0
  68. package/addon/routes/management/vendors/index.js +9 -6
  69. package/addon/routes/operations/orders/index/view.js +6 -2
  70. package/addon/routes/operations/orders/index.js +7 -1
  71. package/addon/routes/operations/orders.js +0 -1
  72. package/addon/routes/operations/service-rates/index.js +9 -27
  73. package/addon/routes/operations/service-rates.js +1 -8
  74. package/addon/styles/fleetops-engine.css +14 -7
  75. package/addon/templates/operations/orders/index/new.hbs +7 -7
  76. package/addon/templates/operations/orders/index/view.hbs +17 -16
  77. package/addon/utils/waypoint-label.js +3 -0
  78. package/app/controllers/{operations/zones/index.js → base-controller.js} +1 -1
  79. package/app/utils/waypoint-label.js +1 -0
  80. package/composer.json +2 -2
  81. package/config/environment.js +11 -1
  82. package/extension.json +1 -1
  83. package/index.js +1 -0
  84. package/package.json +47 -41
  85. package/server/config/fleetops.php +4 -1
  86. package/server/migrations/2023_11_28_074244_add_supplier_uuid_column_to_entities_table.php +33 -0
  87. package/server/migrations/2023_12_14_100209_add_meta_column_on_driver_table.php +30 -0
  88. package/server/src/Http/Controllers/Api/v1/DriverController.php +14 -10
  89. package/server/src/Http/Controllers/Api/v1/OrderController.php +118 -42
  90. package/server/src/Http/Controllers/Api/v1/PayloadController.php +41 -43
  91. package/server/src/Http/Controllers/Api/v1/TrackingStatusController.php +43 -2
  92. package/server/src/Http/Controllers/Internal/v1/DriverController.php +148 -0
  93. package/server/src/Http/Controllers/Internal/v1/MorphController.php +48 -16
  94. package/server/src/Http/Controllers/Internal/v1/NavigatorController.php +79 -0
  95. package/server/src/Http/Controllers/Internal/v1/OrderController.php +3 -2
  96. package/server/src/Http/Controllers/Internal/v1/PlaceController.php +2 -2
  97. package/server/src/Http/Requests/CreateDriverRequest.php +2 -0
  98. package/server/src/Http/Requests/CreateOrderRequest.php +18 -4
  99. package/server/src/Http/Requests/CreatePayloadRequest.php +23 -7
  100. package/server/src/Http/Requests/CreatePlaceRequest.php +9 -5
  101. package/server/src/Http/Requests/CreateTrackingStatusRequest.php +69 -12
  102. package/server/src/Http/Requests/CreateVehicleRequest.php +5 -3
  103. package/server/src/Http/Resources/v1/Entity.php +3 -0
  104. package/server/src/Http/Resources/v1/Order.php +3 -2
  105. package/server/src/Models/Driver.php +5 -2
  106. package/server/src/Models/Entity.php +1 -1
  107. package/server/src/Models/Order.php +2 -2
  108. package/server/src/Models/Payload.php +27 -9
  109. package/server/src/Models/Place.php +28 -5
  110. package/server/src/Models/TrackingStatus.php +9 -3
  111. package/server/src/Models/VehicleDevice.php +28 -0
  112. package/server/src/Models/Vendor.php +16 -0
  113. package/server/src/Observers/DriverObserver.php +1 -1
  114. package/server/src/routes.php +62 -0
  115. package/tsconfig.declarations.json +10 -0
  116. package/addon/components/file-icon.js +0 -1
  117. package/addon/controllers/operations/zones/index.js +0 -475
  118. package/addon/routes/operations/dispatch.js +0 -3
  119. package/addon/routes/operations/zones/index.js +0 -25
  120. package/addon/routes/operations/zones.js +0 -7
  121. package/addon/templates/operations/dispatch.hbs +0 -1
  122. package/addon/templates/operations/zones/index.hbs +0 -72
  123. package/addon/templates/operations/zones.hbs +0 -1
  124. package/app/components/file-icon.js +0 -1
@@ -0,0 +1,3 @@
1
+ export default function waypointLabel(index) {
2
+ return (parseInt(index) + 9).toString(36).toUpperCase();
3
+ }
@@ -1 +1 @@
1
- export { default } from '@fleetbase/fleetops-engine/controllers/operations/zones/index';
1
+ export { default } from '@fleetbase/fleetops-engine/controllers/base-controller';
@@ -0,0 +1 @@
1
+ export { default } from '@fleetbase/fleetops-engine/utils/waypoint-label';
package/composer.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fleetbase/fleetops-api",
3
- "version": "0.3.5",
3
+ "version": "0.3.7",
4
4
  "description": "Fleet & Transport Management Extension for Fleetbase",
5
5
  "keywords": [
6
6
  "fleetbase-extension",
@@ -22,7 +22,7 @@
22
22
  ],
23
23
  "require": {
24
24
  "php": "^7.4|^8.0",
25
- "fleetbase/core-api": "^1.3.2",
25
+ "fleetbase/core-api": "^1.3.4",
26
26
  "barryvdh/laravel-dompdf": "^2.0",
27
27
  "brick/geo": "0.7.2",
28
28
  "cknow/laravel-money": "^7.1",
@@ -1,11 +1,12 @@
1
1
  /* eslint-env node */
2
2
  'use strict';
3
- const { name } = require('../package');
3
+ const { name, fleetbase } = require('../package');
4
4
 
5
5
  module.exports = function (environment) {
6
6
  let ENV = {
7
7
  modulePrefix: name,
8
8
  environment,
9
+ mountedEngineRoutePrefix: getMountedEngineRoutePrefix(),
9
10
 
10
11
  defaultValues: {
11
12
  driverImage: getenv('DEFAULT_DRIVER_IMAGE', 'https://s3.ap-southeast-1.amazonaws.com/flb-assets/static/no-avatar.png'),
@@ -20,6 +21,15 @@ module.exports = function (environment) {
20
21
  return ENV;
21
22
  };
22
23
 
24
+ function getMountedEngineRoutePrefix() {
25
+ let mountedEngineRoutePrefix = 'fleet-ops';
26
+ if (fleetbase && typeof fleetbase.route === 'string') {
27
+ mountedEngineRoutePrefix = fleetbase.route;
28
+ }
29
+
30
+ return `console.${mountedEngineRoutePrefix}.`;
31
+ }
32
+
23
33
  function getenv(variable, defaultValue = null) {
24
34
  return process.env[variable] !== undefined ? process.env[variable] : defaultValue;
25
35
  }
package/extension.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "Fleet-Ops",
3
- "version": "0.3.5",
3
+ "version": "0.3.7",
4
4
  "description": "Fleet & Transport Management Extension for Fleetbase",
5
5
  "repository": "https://github.com/fleetbase/fleetops",
6
6
  "license": "MIT",
package/index.js CHANGED
@@ -69,6 +69,7 @@ module.exports = buildEngine({
69
69
  new Funnel(leafletImagesPath, {
70
70
  srcDir: '/',
71
71
  destDir: '/leaflet-images',
72
+ allowEmpty: true,
72
73
  })
73
74
  );
74
75
  trees.push(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fleetbase/fleetops-engine",
3
- "version": "0.3.5",
3
+ "version": "0.3.7",
4
4
  "description": "Fleet & Transport Management Extension for Fleetbase",
5
5
  "fleetbase": {
6
6
  "route": "fleet-ops",
@@ -25,23 +25,26 @@
25
25
  },
26
26
  "scripts": {
27
27
  "build": "ember build --environment=production",
28
- "lint": "npm-run-all --aggregate-output --continue-on-error --parallel \"lint:!(fix)\"",
29
- "lint:fix": "npm-run-all --aggregate-output --continue-on-error --parallel lint:*:fix",
28
+ "lint": "concurrently \"npm:lint:*(!fix)\" --names \"lint:\"",
29
+ "lint:css": "stylelint \"**/*.css\"",
30
+ "lint:css:fix": "concurrently \"npm:lint:css -- --fix\"",
31
+ "lint:fix": "concurrently \"npm:lint:*:fix\" --names \"fix:\"",
30
32
  "lint:hbs": "ember-template-lint .",
31
33
  "lint:hbs:fix": "ember-template-lint . --fix",
32
34
  "lint:js": "eslint . --cache",
33
35
  "lint:js:fix": "eslint . --fix",
34
36
  "start": "ember serve",
35
- "test": "npm-run-all lint test:*",
37
+ "test": "concurrently \"npm:lint\" \"npm:test:*\" --names \"lint,test:\"",
36
38
  "test:ember": "ember test",
37
39
  "test:ember-compatibility": "ember try:each",
38
40
  "publish:npm": "npm config set registry https://registry.npmjs.org/ && npm publish",
39
41
  "publish:github": "npm config set '@fleetbase:registry' https://npm.pkg.github.com/ && npm publish"
40
42
  },
41
43
  "dependencies": {
42
- "@fleetbase/ember-core": "^0.1.8",
43
- "@fleetbase/ember-ui": "^0.2.6",
44
- "@fleetbase/fleetops-data": "^0.1.5",
44
+ "@babel/core": "^7.23.2",
45
+ "@fleetbase/ember-core": "^0.1.9",
46
+ "@fleetbase/ember-ui": "^0.2.8",
47
+ "@fleetbase/fleetops-data": "^0.1.6",
45
48
  "@fleetbase/leaflet-routing-machine": "^3.2.16",
46
49
  "@fortawesome/ember-fontawesome": "^0.4.1",
47
50
  "@fortawesome/fontawesome-svg-core": "^6.4.0",
@@ -50,14 +53,14 @@
50
53
  "@zestia/ember-dragula": "^12.0.0",
51
54
  "broccoli-funnel": "^3.0.8",
52
55
  "broccoli-merge-trees": "^4.2.0",
53
- "ember-cli-babel": "^7.26.11",
54
- "ember-cli-es6-transform": "^1.0.0",
55
- "ember-cli-htmlbars": "^6.1.0",
56
- "ember-intl": "^6.0.0-beta.6",
56
+ "ember-cli-babel": "^8.2.0",
57
+ "ember-cli-htmlbars": "^6.3.0",
58
+ "ember-intl": "6.3.2",
57
59
  "ember-leaflet": "^5.1.1",
58
60
  "ember-radio-button": "^3.0.0-beta.1",
59
61
  "ember-tag-input": "^3.1.0",
60
62
  "ember-wormhole": "^0.6.0",
63
+ "ember-drag-sort": "^3.0.1",
61
64
  "leaflet": "^1.9.4",
62
65
  "leaflet-contextmenu": "^1.4.0",
63
66
  "leaflet-draw": "^1.0.4",
@@ -65,56 +68,59 @@
65
68
  "leaflet-rotatedmarker": "^0.2.0"
66
69
  },
67
70
  "devDependencies": {
71
+ "@babel/eslint-parser": "^7.22.15",
72
+ "@babel/plugin-proposal-decorators": "^7.23.2",
68
73
  "@ember/optional-features": "^2.0.0",
69
- "@ember/test-helpers": "^2.8.1",
70
- "@embroider/test-setup": "^1.8.3",
74
+ "@ember/test-helpers": "^3.2.0",
75
+ "@embroider/test-setup": "^3.0.2",
71
76
  "@glimmer/component": "^1.1.2",
72
77
  "@glimmer/tracking": "^1.1.2",
73
- "babel-eslint": "^10.1.0",
74
78
  "broccoli-asset-rev": "^3.0.0",
79
+ "concurrently": "^8.2.2",
75
80
  "dragula": "^3.7.3",
76
- "ember-auto-import": "^2.4.2",
77
- "ember-cli": "~4.6.0",
78
- "ember-cli-dependency-checker": "^3.3.1",
81
+ "ember-auto-import": "^2.6.3",
82
+ "ember-cli": "~5.4.1",
83
+ "ember-cli-clean-css": "^3.0.0",
84
+ "ember-cli-dependency-checker": "^3.3.2",
79
85
  "ember-cli-inject-live-reload": "^2.1.0",
80
86
  "ember-cli-sri": "^2.1.1",
81
87
  "ember-cli-terser": "^4.0.2",
82
88
  "ember-composable-helpers": "^5.0.0",
83
- "ember-concurrency": "^2.3.7",
89
+ "ember-concurrency": "^3.1.1",
84
90
  "ember-concurrency-decorators": "^2.0.3",
85
- "ember-data": "~4.6.0",
86
- "ember-disable-prototype-extensions": "^1.1.3",
87
- "ember-drag-sort": "^3.0.1",
88
- "ember-engines": "^0.8.23",
91
+ "ember-data": "^4.12.5",
92
+ "ember-engines": "^0.9.0",
89
93
  "ember-load-initializers": "^2.1.2",
90
- "ember-math-helpers": "^2.18.2",
91
- "ember-page-title": "^7.0.0",
92
- "ember-qunit": "^5.1.5",
93
- "ember-resolver": "^8.0.3",
94
+ "ember-math-helpers": "^4.0.0",
95
+ "ember-page-title": "^8.0.0",
96
+ "ember-qunit": "^8.0.1",
97
+ "ember-resolver": "^11.0.1",
94
98
  "ember-responsive": "^5.0.0",
95
- "ember-source": "~4.6.0",
99
+ "ember-source": "~5.4.0",
96
100
  "ember-source-channel-url": "^3.0.0",
97
- "ember-template-lint": "^4.10.1",
98
- "ember-try": "^2.0.0",
99
- "eslint": "^7.32.0",
100
- "eslint-config-prettier": "^8.5.0",
101
- "eslint-plugin-ember": "^11.0.2",
102
- "eslint-plugin-node": "^11.1.0",
103
- "eslint-plugin-prettier": "^4.2.1",
104
- "eslint-plugin-qunit": "^7.3.1",
101
+ "ember-template-lint": "^5.11.2",
102
+ "ember-try": "^3.0.0",
103
+ "eslint": "^8.52.0",
104
+ "eslint-config-prettier": "^9.0.0",
105
+ "eslint-plugin-ember": "^11.11.1",
106
+ "eslint-plugin-n": "^16.2.0",
107
+ "eslint-plugin-prettier": "^5.0.1",
108
+ "eslint-plugin-qunit": "^8.0.1",
105
109
  "loader.js": "^4.7.0",
106
- "npm-run-all": "^4.1.5",
107
- "prettier": "^2.7.1",
108
- "qunit": "^2.19.1",
110
+ "prettier": "^3.0.3",
111
+ "qunit": "^2.20.0",
109
112
  "qunit-dom": "^2.0.0",
110
113
  "resolve": "^1.22.2",
111
- "webpack": "^5.74.0"
114
+ "stylelint": "^15.11.0",
115
+ "stylelint-config-standard": "^34.0.0",
116
+ "stylelint-prettier": "^4.0.2",
117
+ "webpack": "^5.89.0"
112
118
  },
113
119
  "peerDependencies": {
114
- "ember-engines": "^0.8.23"
120
+ "ember-engines": "^0.9.0"
115
121
  },
116
122
  "engines": {
117
- "node": "14.* || >= 16"
123
+ "node": ">= 18"
118
124
  },
119
125
  "ember": {
120
126
  "edition": "octane"
@@ -12,7 +12,10 @@ return [
12
12
  'prefix' => null,
13
13
  'internal_prefix' => 'int'
14
14
  ]
15
- ],
15
+ ],
16
+ 'navigator' => [
17
+ 'bypass_verification_code' => env('NAVIGATOR_BYPASS_VERIFICATION_CODE', '999000')
18
+ ],
16
19
  'connection' => [
17
20
  'db' => env('DB_CONNECTION', 'mysql')
18
21
  ]
@@ -0,0 +1,33 @@
1
+ <?php
2
+
3
+ use Illuminate\Database\Migrations\Migration;
4
+ use Illuminate\Database\Schema\Blueprint;
5
+ use Illuminate\Support\Facades\Schema;
6
+
7
+ class AddSupplierUuidColumnToEntitiesTable extends Migration
8
+ {
9
+ /**
10
+ * Run the migrations.
11
+ *
12
+ * @return void
13
+ */
14
+ public function up()
15
+ {
16
+ Schema::table('entities', function (Blueprint $table) {
17
+ $table->foreignUuid('supplier_uuid')->nullable()->after('driver_assigned_uuid')->references('uuid')->on('vendors');
18
+ });
19
+ }
20
+
21
+ /**
22
+ * Reverse the migrations.
23
+ *
24
+ * @return void
25
+ */
26
+ public function down()
27
+ {
28
+ Schema::table('entities', function (Blueprint $table) {
29
+ $table->dropForeign(['supplier_uuid']);
30
+ $table->dropColumn(['supplier_uuid']);
31
+ });
32
+ }
33
+ }
@@ -0,0 +1,30 @@
1
+ <?php
2
+
3
+ use Illuminate\Database\Migrations\Migration;
4
+ use Illuminate\Database\Schema\Blueprint;
5
+ use Illuminate\Support\Facades\Schema;
6
+
7
+ class AddMetaColumnOnDriverTable extends Migration
8
+ {
9
+ /**
10
+ * Run the migrations.
11
+ *
12
+ * @return void
13
+ */
14
+ public function up()
15
+ {
16
+ Schema::table('drivers', function (Blueprint $table) {
17
+ $table->json('meta')->nullable()->after('slug');
18
+ });
19
+ }
20
+
21
+ /**
22
+ * Reverse the migrations.
23
+ *
24
+ * @return void
25
+ */
26
+ public function down()
27
+ {
28
+ //
29
+ }
30
+ }
@@ -353,10 +353,10 @@ class DriverController extends Controller
353
353
  return response()->error('Authentication failed using password provided.', 401);
354
354
  }
355
355
 
356
- // get the current company session
356
+ // Get the company session for the user
357
357
  $company = Flow::getCompanySessionForUser($user);
358
358
 
359
- // get driver record
359
+ // Get driver record
360
360
  $driver = Driver::firstOrCreate(
361
361
  [
362
362
  'user_uuid' => $user->uuid,
@@ -365,9 +365,10 @@ class DriverController extends Controller
365
365
  [
366
366
  'user_uuid' => $user->uuid,
367
367
  'company_uuid' => $company->uuid,
368
- 'name' => $attrs['name'] ?? $user->name,
369
- 'phone' => $attrs['phone'] ?? $user->phone,
370
- 'email' => $attrs['email'] ?? $user->email,
368
+ 'name' => data_get($attrs, 'name', $user->name),
369
+ 'phone' => data_get($attrs, 'phone', $user->phone),
370
+ 'email' => data_get($attrs, 'email', $user->email),
371
+ 'location' => new Point(0, 0),
371
372
  ]
372
373
  );
373
374
 
@@ -431,7 +432,10 @@ class DriverController extends Controller
431
432
  }
432
433
 
433
434
  // check if user exists
434
- $user = User::where('phone', $identity)->orWhere('email', $identity)->first();
435
+ $user = User::where('type', 'driver')->where(function ($query) use ($identity) {
436
+ $query->where('phone', $identity);
437
+ $query->orWhere('phone', $identity);
438
+ })->first();
435
439
 
436
440
  if (!$user) {
437
441
  return response()->error('Unable to verify code.');
@@ -440,7 +444,7 @@ class DriverController extends Controller
440
444
  // find and verify code
441
445
  $verificationCode = VerificationCode::where(['subject_uuid' => $user->uuid, 'code' => $code, 'for' => $for])->exists();
442
446
 
443
- if (!$verificationCode && $code !== '999000') {
447
+ if (!$verificationCode && $code !== config('fleetops.navigator.bypass_verification_code')) {
444
448
  return response()->error('Invalid verification code!');
445
449
  }
446
450
 
@@ -456,9 +460,9 @@ class DriverController extends Controller
456
460
  [
457
461
  'user_uuid' => $user->uuid,
458
462
  'company_uuid' => $company->uuid,
459
- 'name' => $attrs['name'] ?? $user->name,
460
- 'phone' => $attrs['phone'] ?? $user->phone,
461
- 'email' => $attrs['email'] ?? $user->email,
463
+ 'name' => data_get($attrs, 'name', $user->name),
464
+ 'phone' => data_get($attrs, 'phone', $user->phone),
465
+ 'email' => data_get($attrs, 'email', $user->email),
462
466
  'location' => new Point(0, 0),
463
467
  ]
464
468
  );
@@ -33,7 +33,7 @@ class OrderController extends Controller
33
33
  /**
34
34
  * Creates a new Fleetbase Order resource.
35
35
  *
36
- * @param \Fleetbase\Http\Requests\CreateOrderRequest $request
36
+ * @param \Illuminate\Http\Request|\Fleetbase\Http\Requests\CreateOrderRequest $request
37
37
  *
38
38
  * @return \Fleetbase\Http\Resources\Order
39
39
  */
@@ -61,18 +61,36 @@ class OrderController extends Controller
61
61
 
62
62
  // create payload
63
63
  if ($request->has('payload') && $request->isArray('payload')) {
64
- $payloadInput = $request->input('payload');
65
64
  $payload = new Payload();
65
+ $payloadInput = $request->input('payload');
66
+ $entities = data_get($payloadInput, 'entities', []);
67
+ $waypoints = data_get($payloadInput, 'waypoints', []);
68
+ $pickup = data_get($payloadInput, 'pickup');
69
+ $dropoff = data_get($payloadInput, 'dropoff');
70
+ $return = data_get($payloadInput, 'return');
71
+
72
+ // if no pickup and dropoff extract from waypoints
73
+ if (empty($pickup) && empty($dropoff) && count($waypoints)) {
74
+ $pickup = array_shift($waypoints);
75
+ $dropoff = array_pop($waypoints);
76
+ }
66
77
 
67
- $payload->setPickup($payloadInput['pickup']);
68
- $payload->setDropoff($payloadInput['dropoff']);
69
- if ($request->has('payload.return')) {
70
- $payload->setReturn($payloadInput['return']);
78
+ $payload->setPickup($pickup, [
79
+ 'callback' => function ($pickup, $payload) {
80
+ $payload->setCurrentWaypoint($pickup);
81
+ },
82
+ ]);
83
+ $payload->setDropoff($dropoff);
84
+ if ($return) {
85
+ $payload->setReturn($return);
71
86
  }
72
- $payload->setWaypoints($payloadInput['waypoints'] ?? []);
73
- $payload->setEntities($payloadInput['entities'] ?? []);
87
+
74
88
  $payload->save();
75
89
 
90
+ // set waypoints and entities after payload is saved
91
+ $payload->setWaypoints($waypoints);
92
+ $payload->setEntities($entities);
93
+
76
94
  $input['payload_uuid'] = $payload->uuid;
77
95
  } elseif ($request->isString('payload')) {
78
96
  $input['payload_uuid'] = Utils::getUuid('payloads', [
@@ -84,19 +102,40 @@ class OrderController extends Controller
84
102
 
85
103
  // create a payload if missing payload[] but has pickup/dropoff/etc
86
104
  if ($request->missing('payload')) {
87
- $payloadInput = $request->only(['pickup', 'dropoff', 'return', 'waypoints', 'entities']);
88
105
  $payload = new Payload();
106
+ $payloadInput = $request->only(['pickup', 'dropoff', 'return', 'waypoints', 'entities']);
107
+ $entities = data_get($payloadInput, 'entities', []);
108
+ $waypoints = data_get($payloadInput, 'waypoints', []);
109
+ $pickup = data_get($payloadInput, 'pickup');
110
+ $dropoff = data_get($payloadInput, 'dropoff');
111
+ $return = data_get($payloadInput, 'return');
112
+
113
+ // if no pickup and dropoff extract from waypoints
114
+ if (empty($pickup) && empty($dropoff) && count($waypoints)) {
115
+ $pickup = array_shift($waypoints);
116
+ $dropoff = array_pop($waypoints);
117
+ }
89
118
 
90
- $payload->setPickup($payloadInput['pickup']);
91
- $payload->setDropoff($payloadInput['dropoff']);
92
- if ($request->has('return')) {
93
- $payload->setReturn($payloadInput['return']);
119
+ $payload->setPickup($pickup, [
120
+ 'callback' => function ($pickup, $payload) {
121
+ $payload->setCurrentWaypoint($pickup);
122
+ },
123
+ ]);
124
+ $payload->setDropoff($dropoff);
125
+ if ($return) {
126
+ $payload->setReturn($return);
94
127
  }
95
- $payload->setWaypoints($payloadInput['waypoints'] ?? []);
96
- $payload->setEntities($payloadInput['entities'] ?? []);
128
+
97
129
  $payload->save();
98
130
 
131
+ // set waypoints and entities after payload is saved
132
+ $payload->setWaypoints($waypoints);
133
+ $payload->setEntities($entities);
134
+
99
135
  $input['payload_uuid'] = $payload->uuid;
136
+
137
+ // set the first / current waypoint
138
+ $payload->setCurrentWaypoint($payload->pickup);
100
139
  }
101
140
 
102
141
  // driver assignment
@@ -218,18 +257,43 @@ class OrderController extends Controller
218
257
 
219
258
  // update payload if new input or change payload by id
220
259
  if ($request->isArray('payload')) {
260
+ $payload = data_get($order, 'payload', new Payload());
221
261
  $payloadInput = $request->input('payload');
222
- $payload = new Payload();
262
+ $entities = data_get($payloadInput, 'entities', []);
263
+ $waypoints = data_get($payloadInput, 'waypoints', []);
264
+ $pickup = data_get($payloadInput, 'pickup');
265
+ $dropoff = data_get($payloadInput, 'dropoff');
266
+ $return = data_get($payloadInput, 'return');
267
+
268
+ // if no pickup and dropoff extract from waypoints
269
+ if (empty($pickup) && empty($dropoff) && count($waypoints)) {
270
+ $pickup = array_shift($waypoints);
271
+ $dropoff = array_pop($waypoints);
272
+ }
273
+
274
+ if ($pickup) {
275
+ $payload->setPickup($pickup);
276
+ }
277
+
278
+ if ($dropoff) {
279
+ $payload->setDropoff($dropoff);
280
+ }
223
281
 
224
- $payload->setPickup($payloadInput['pickup']);
225
- $payload->setDropoff($payloadInput['dropoff']);
226
- if ($request->has('payload.return')) {
227
- $payload->setReturn($payloadInput['return']);
282
+ if ($return) {
283
+ $payload->setReturn($return);
228
284
  }
229
- $payload->setWaypoints($payloadInput['waypoints'] ?? []);
230
- $payload->setEntities($payloadInput['entities'] ?? []);
285
+
231
286
  $payload->save();
232
287
 
288
+ // set waypoints and entities after payload is saved
289
+ if ($waypoints) {
290
+ $payload->setWaypoints($waypoints);
291
+ }
292
+
293
+ if ($entities) {
294
+ $payload->setEntities($entities);
295
+ }
296
+
233
297
  $input['payload_uuid'] = $payload->uuid;
234
298
  } elseif ($request->has('payload')) {
235
299
  $input['payload_uuid'] = Utils::getUuid('payloads', [
@@ -239,34 +303,46 @@ class OrderController extends Controller
239
303
  unset($input['payload']);
240
304
  }
241
305
 
242
- // update payload properties if applicable
243
- if ($request->has('pickup')) {
244
- if ($order->payload) {
245
- $order->payload->setPickup($request->input('pickup'));
306
+ // create a payload if missing payload[] but has pickup/dropoff/etc
307
+ if ($request->missing('payload')) {
308
+ $payload = data_get($order, 'payload', new Payload());
309
+ $payloadInput = $request->only(['pickup', 'dropoff', 'return', 'waypoints', 'entities']);
310
+ $entities = data_get($payloadInput, 'entities', []);
311
+ $waypoints = data_get($payloadInput, 'waypoints', []);
312
+ $pickup = data_get($payloadInput, 'pickup');
313
+ $dropoff = data_get($payloadInput, 'dropoff');
314
+ $return = data_get($payloadInput, 'return');
315
+
316
+ // if no pickup and dropoff extract from waypoints
317
+ if (empty($pickup) && empty($dropoff) && count($waypoints)) {
318
+ $pickup = array_shift($waypoints);
319
+ $dropoff = array_pop($waypoints);
246
320
  }
247
- }
248
- if ($request->has('dropoff')) {
249
- if ($order->payload) {
250
- $order->payload->setDropoff($request->input('dropoff'));
321
+
322
+ if ($pickup) {
323
+ $payload->setPickup($pickup);
251
324
  }
252
- }
253
325
 
254
- if ($request->has('return')) {
255
- if ($order->payload) {
256
- $order->payload->setReturn($request->input('return'));
326
+ if ($dropoff) {
327
+ $payload->setDropoff($dropoff);
257
328
  }
258
- }
259
329
 
260
- if ($request->has('waypoints')) {
261
- if ($order->payload) {
262
- $order->payload->setWaypoints($request->input('waypoints'));
330
+ if ($return) {
331
+ $payload->setReturn($return);
263
332
  }
264
- }
265
333
 
266
- if ($request->has('entities')) {
267
- if ($order->payload) {
268
- $order->payload->setEntities($request->input('entities'));
334
+ $payload->save();
335
+
336
+ // set waypoints and entities after payload is saved
337
+ if ($waypoints) {
338
+ $payload->setWaypoints($waypoints);
269
339
  }
340
+
341
+ if ($entities) {
342
+ $payload->setEntities($entities);
343
+ }
344
+
345
+ $input['payload_uuid'] = $payload->uuid;
270
346
  }
271
347
 
272
348
  // driver assignment