@fleetbase/fleetops-engine 0.3.5 → 0.3.6

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 (122) hide show
  1. package/README.md +4 -4
  2. package/addon/components/admin/navigator-app.hbs +5 -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 +28 -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 +1 -1
  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/migrations/2023_11_28_074244_add_supplier_uuid_column_to_entities_table.php +33 -0
  86. package/server/migrations/2023_12_14_100209_add_meta_column_on_driver_table.php +30 -0
  87. package/server/src/Http/Controllers/Api/v1/DriverController.php +7 -4
  88. package/server/src/Http/Controllers/Api/v1/OrderController.php +118 -42
  89. package/server/src/Http/Controllers/Api/v1/PayloadController.php +41 -43
  90. package/server/src/Http/Controllers/Api/v1/TrackingStatusController.php +43 -2
  91. package/server/src/Http/Controllers/Internal/v1/MorphController.php +48 -16
  92. package/server/src/Http/Controllers/Internal/v1/NavigatorController.php +41 -0
  93. package/server/src/Http/Controllers/Internal/v1/OrderController.php +3 -2
  94. package/server/src/Http/Controllers/Internal/v1/PlaceController.php +2 -2
  95. package/server/src/Http/Requests/CreateDriverRequest.php +2 -0
  96. package/server/src/Http/Requests/CreateOrderRequest.php +18 -4
  97. package/server/src/Http/Requests/CreatePayloadRequest.php +23 -7
  98. package/server/src/Http/Requests/CreatePlaceRequest.php +9 -5
  99. package/server/src/Http/Requests/CreateTrackingStatusRequest.php +69 -12
  100. package/server/src/Http/Requests/CreateVehicleRequest.php +5 -3
  101. package/server/src/Http/Resources/v1/Entity.php +3 -0
  102. package/server/src/Http/Resources/v1/Order.php +3 -2
  103. package/server/src/Models/Driver.php +5 -2
  104. package/server/src/Models/Entity.php +1 -1
  105. package/server/src/Models/Order.php +2 -2
  106. package/server/src/Models/Payload.php +27 -9
  107. package/server/src/Models/Place.php +28 -5
  108. package/server/src/Models/TrackingStatus.php +9 -3
  109. package/server/src/Models/VehicleDevice.php +28 -0
  110. package/server/src/Models/Vendor.php +16 -0
  111. package/server/src/Observers/DriverObserver.php +1 -1
  112. package/server/src/routes.php +8 -0
  113. package/tsconfig.declarations.json +10 -0
  114. package/addon/components/file-icon.js +0 -1
  115. package/addon/controllers/operations/zones/index.js +0 -475
  116. package/addon/routes/operations/dispatch.js +0 -3
  117. package/addon/routes/operations/zones/index.js +0 -25
  118. package/addon/routes/operations/zones.js +0 -7
  119. package/addon/templates/operations/dispatch.hbs +0 -1
  120. package/addon/templates/operations/zones/index.hbs +0 -72
  121. package/addon/templates/operations/zones.hbs +0 -1
  122. package/app/components/file-icon.js +0 -1
@@ -48,12 +48,13 @@ class Order extends FleetbaseResource
48
48
  'type' => $this->type,
49
49
  'status' => $this->status,
50
50
  'pod_method' => $this->pod_method,
51
- 'pod_required' => $this->pod_required ?? false,
51
+ 'pod_required' => (bool) data_get($this, 'pod_required', false),
52
+ 'dispatched' => (bool) data_get($this, 'dispatched', false),
52
53
  'adhoc' => $this->adhoc,
53
54
  'adhoc_distance' => (int) $this->getAdhocDistance(),
54
55
  'distance' => (int) $this->distance,
55
56
  'time' => (int) $this->time,
56
- 'meta' => $this->meta ?? [],
57
+ 'meta' => data_get($this, 'meta', []),
57
58
  'dispatched_at' => $this->dispatched_at,
58
59
  'started_at' => $this->started_at,
59
60
  'scheduled_at' => $this->scheduled_at,
@@ -23,6 +23,7 @@ use Spatie\Activitylog\Traits\CausesActivity;
23
23
  use Spatie\Activitylog\Traits\LogsActivity;
24
24
  use Spatie\Sluggable\HasSlug;
25
25
  use Spatie\Sluggable\SlugOptions;
26
+ use WebSocket\Message\Ping;
26
27
 
27
28
  class Driver extends Model
28
29
  {
@@ -87,6 +88,7 @@ class Driver extends Model
87
88
  'online',
88
89
  'slug',
89
90
  'status',
91
+ 'meta,',
90
92
  ];
91
93
 
92
94
  /**
@@ -109,8 +111,9 @@ class Driver extends Model
109
111
  * @var array
110
112
  */
111
113
  protected $casts = [
112
- 'location' => Point::class,
113
- 'online' => 'boolean',
114
+ 'location' => Point::class,
115
+ 'online' => 'boolean',
116
+ 'meta' => Json::class,
114
117
  ];
115
118
 
116
119
  /**
@@ -205,7 +205,7 @@ class Entity extends Model
205
205
  */
206
206
  public function supplier()
207
207
  {
208
- return $this->belongsTo(Vendor::class, 'supplier_uuid');
208
+ return $this->belongsTo(Vendor::class, 'supplier_uuid', 'uuid');
209
209
  }
210
210
 
211
211
  /**
@@ -975,7 +975,7 @@ class Order extends Model
975
975
  $this->load('driverAssigned');
976
976
 
977
977
  if ($this->driverAssigned instanceof Driver) {
978
- $this->payload->setPickup($this->driverAssigned->location, true);
978
+ $this->payload->setPickup($this->driverAssigned->location, ['save' => true]);
979
979
  }
980
980
  }
981
981
 
@@ -985,7 +985,7 @@ class Order extends Model
985
985
  $this->load('driverAssigned');
986
986
 
987
987
  if ($this->driverAssigned instanceof Driver) {
988
- $this->payload->setPickup($this->driverAssigned->location, true);
988
+ $this->payload->setPickup($this->driverAssigned->location, ['save' => true]);
989
989
  }
990
990
  }
991
991
  }
@@ -273,6 +273,17 @@ class Payload extends Model
273
273
  return $this;
274
274
  }
275
275
 
276
+ public function setCurrentWaypoint(Place $destination, bool $save = true): Payload
277
+ {
278
+ $this->current_waypoint_uuid = $destination->uuid;
279
+
280
+ if ($this->save) {
281
+ $this->save();
282
+ }
283
+
284
+ return $this;
285
+ }
286
+
276
287
  public function setWaypoints($waypoints = [])
277
288
  {
278
289
  if (!is_array($waypoints)) {
@@ -336,7 +347,7 @@ class Payload extends Model
336
347
  $placeUuid = Place::insertFromMixed($attributes);
337
348
 
338
349
  // if has a temporary uuid from search create meta attr for search_uuid
339
- if (Utils::isUuid($placeUuid) && isset($attributes['uuid']) && $placeUuid !== $attributes['uuid']) {
350
+ if (Str::isUuid($placeUuid) && isset($attributes['uuid']) && $placeUuid !== $attributes['uuid']) {
340
351
  $place = Place::where('uuid', $placeUuid)->first();
341
352
 
342
353
  if ($place instanceof Place) {
@@ -544,7 +555,7 @@ class Payload extends Model
544
555
  return $this->order;
545
556
  }
546
557
 
547
- public function setPlace($property, $place, $save = false)
558
+ public function setPlace($property, Place $place, array $options = [])
548
559
  {
549
560
  if (!$place) {
550
561
  return;
@@ -552,6 +563,8 @@ class Payload extends Model
552
563
 
553
564
  $attr = $property . '_uuid';
554
565
  $instance = Place::createFromMixed($place);
566
+ $save = data_get($options, 'save', false);
567
+ $callback = data_get($options, 'callback', false);
555
568
 
556
569
  if ($instance) {
557
570
  if (Str::isUuid($instance)) {
@@ -567,10 +580,14 @@ class Payload extends Model
567
580
  $this->save();
568
581
  }
569
582
 
583
+ if (is_callable($callback)) {
584
+ $callback($instance, $this);
585
+ }
586
+
570
587
  return $this;
571
588
  }
572
589
 
573
- public function setPickup($place, $save = false)
590
+ public function setPickup($place, array $options = [])
574
591
  {
575
592
  // if using the special [driver] value, set the meta `pickup_is_driver_location`
576
593
  if ($place === '[driver]') {
@@ -579,22 +596,23 @@ class Payload extends Model
579
596
  return;
580
597
  }
581
598
 
582
- return $this->setPlace('pickup', $place, $save);
599
+ return $this->setPlace('pickup', $place, $options);
583
600
  }
584
601
 
585
- public function setDropoff($place, $save = false)
602
+ public function setDropoff($place, array $options = [])
586
603
  {
587
- return $this->setPlace('dropoff', $place, $save);
604
+ return $this->setPlace('dropoff', $place, $options);
588
605
  }
589
606
 
590
- public function setReturn($place, $save = false)
607
+ public function setReturn($place, array $options = [])
591
608
  {
592
- return $this->setPlace('return', $place, $save);
609
+ return $this->setPlace('return', $place, $options);
593
610
  }
594
611
 
612
+ // when an order only has waypoints -- no pickup/dropoff
595
613
  public function getIsMultipleDropOrderAttribute()
596
614
  {
597
- return $this->waypoints && $this->waypoints->count() > 0;
615
+ return !$this->pickup && $this->waypoints && $this->waypoints->count() > 0;
598
616
  }
599
617
 
600
618
  /**
@@ -562,14 +562,30 @@ class Place extends Model
562
562
  'province' => ['alias' => ['state']],
563
563
  'postal_code' => ['alias' => ['postal', 'zip', 'zip_code']],
564
564
  'phone' => ['alias' => ['phone', 'mobile', 'phone_number', 'number', 'cell', 'cell_phone', 'mobile_number', 'contact_number']],
565
+ 'location' => ['alias' => ['position']],
566
+ 'latitude' => ['alias' => ['lat', 'x']],
567
+ 'longitude' => ['alias' => ['lon', 'lng', 'long', 'y']],
565
568
  ];
566
- $address = '';
569
+ $address = '';
570
+ $latitude = null;
571
+ $longitude = null;
567
572
 
568
573
  foreach ($addressFields as $field => $options) {
569
574
  if ($field === 'phone') {
570
575
  continue;
571
576
  }
572
- $value = Utils::or($row, $options['alias']);
577
+
578
+ if ($field === 'latitude') {
579
+ $latitude = Utils::or($row, array_merge([$field], $options['alias']));
580
+ continue;
581
+ }
582
+
583
+ if ($field === 'longitude') {
584
+ $longitude = Utils::or($row, array_merge([$field], $options['alias']));
585
+ continue;
586
+ }
587
+
588
+ $value = Utils::or($row, array_merge([$field], $options['alias']));
573
589
  if ($value) {
574
590
  $address .= $value . ' ';
575
591
  }
@@ -577,6 +593,12 @@ class Place extends Model
577
593
 
578
594
  $address = rtrim($address);
579
595
 
596
+ // if latitude and longitude provided
597
+ if ($latitude && $longitude) {
598
+ $address = $latitude . ', ' . $longitude;
599
+ }
600
+
601
+ // if no address
580
602
  if (!$address) {
581
603
  return null;
582
604
  }
@@ -584,8 +606,9 @@ class Place extends Model
584
606
  $place = Place::createFromGeocodingLookup($address, false);
585
607
 
586
608
  foreach ($addressFields as $field => $options) {
587
- if (empty($place->{$field})) {
588
- $value = Utils::or($row, $options['alias']);
609
+ if ($place->isFillable($field) && empty($place->{$field})) {
610
+ $value = Utils::or($row, array_merge([$field], $options['alias']));
611
+
589
612
  if ($value) {
590
613
  $place->{$field} = $value;
591
614
  }
@@ -601,7 +624,7 @@ class Place extends Model
601
624
 
602
625
  // set meta data
603
626
  $meta = collect($row)->except(['name', ...$addressFields['street_number']['alias'], ...$addressFields['street2']['alias'], ...$addressFields['city']['alias'], ...$addressFields['neighborhood']['alias'], ...$addressFields['province']['alias'], ...$addressFields['postal_code']['alias'], ...$addressFields['phone']['alias']])->toArray();
604
- $place->setMetas($meta);
627
+ $place->setMeta($meta);
605
628
 
606
629
  // set the import id
607
630
  $place->setAttribute('_import_id', $importId);
@@ -3,6 +3,7 @@
3
3
  namespace Fleetbase\FleetOps\Models;
4
4
 
5
5
  use Fleetbase\Casts\Json;
6
+ use Fleetbase\FleetOps\Casts\Point;
6
7
  use Fleetbase\Models\Model;
7
8
  use Fleetbase\Traits\HasApiModelBehavior;
8
9
  use Fleetbase\Traits\HasMetaAttributes;
@@ -80,8 +81,8 @@ class TrackingStatus extends Model
80
81
  * @var array
81
82
  */
82
83
  protected $casts = [
83
- 'meta' => Json::class,
84
- // 'location' => Point::class,
84
+ 'meta' => Json::class,
85
+ 'location' => Point::class,
85
86
  ];
86
87
 
87
88
  /**
@@ -133,10 +134,15 @@ class TrackingStatus extends Model
133
134
  $this->attributes['code'] = static::prepareCode($code);
134
135
  }
135
136
 
137
+ public function setStatusAttribute($status)
138
+ {
139
+ $this->attributes['status'] = Str::title($status);
140
+ }
141
+
136
142
  public static function prepareCode($string)
137
143
  {
138
144
  $string = str_replace(' ', '_', $string);
139
- $string = preg_replace('/[^A-Za-z0-9\-]/', '', $string);
145
+ $string = preg_replace('/[^A-Za-z0-9\-_]/', '', $string);
140
146
  $string = strtoupper($string);
141
147
 
142
148
  return $string;
@@ -92,4 +92,32 @@ class VehicleDevice extends Model
92
92
  {
93
93
  return $this->hasMany(VehicleDeviceEvent::class);
94
94
  }
95
+
96
+ /**
97
+ * Retrieve the associated Vehicle model for the current instance.
98
+ *
99
+ * @param \Closure|null $callback a callback function to be executed if a Vehicle model is found
100
+ *
101
+ * @return \App\Models\Vehicle|null the associated Vehicle model, or null if not found
102
+ */
103
+ public function getVehicle(?\Closure $callback): ?Vehicle
104
+ {
105
+ $this->load(['vehicle']);
106
+ $vehicle = null;
107
+
108
+ if ($this->vehicle instanceof Vehicle) {
109
+ $vehicle = $this->vehicle;
110
+ }
111
+
112
+ // check if id is set
113
+ if (!$vehicle && $this->vehicle_uuid) {
114
+ $vehicle = Vehicle::where('uuid', $this->vehicle_uuid)->first();
115
+ }
116
+
117
+ if ($vehicle && is_callable($callback)) {
118
+ $callback($vehicle);
119
+ }
120
+
121
+ return $vehicle;
122
+ }
95
123
  }
@@ -182,6 +182,22 @@ class Vendor extends Model
182
182
  return $this->belongsTo(\Fleetbase\Models\File::class);
183
183
  }
184
184
 
185
+ /**
186
+ * @return \Illuminate\Database\Eloquent\Relations\HasMany
187
+ */
188
+ public function facilitatorOrders()
189
+ {
190
+ return $this->hasMany(Order::class, 'facilitator_uuid', 'uuid');
191
+ }
192
+
193
+ /**
194
+ * @return \Illuminate\Database\Eloquent\Relations\HasMany
195
+ */
196
+ public function customerOrders()
197
+ {
198
+ return $this->hasMany(Order::class, 'customer_uuid')->whereNull('deleted_at')->withoutGlobalScopes();
199
+ }
200
+
185
201
  /**
186
202
  * Get the vendor logo url.
187
203
  *
@@ -44,6 +44,6 @@ class DriverObserver
44
44
  User::where(['uuid' => $driver->user_uuid, 'type' => 'driver'])->delete();
45
45
 
46
46
  // also unassign them from any order they are assigned to
47
- Order::where(['driver_assigned_uui' => $driver->uuid])->update(['driver_assigned_uui' => null]);
47
+ Order::where(['driver_assigned_uuid' => $driver->uuid])->update(['driver_assigned_uuid' => null]);
48
48
  }
49
49
  }
@@ -184,6 +184,14 @@ Route::prefix(config('fleetops.api.routing.prefix', null))->namespace('Fleetbase
184
184
  */
185
185
  $router->prefix(config('fleetops.api.routing.internal_prefix', 'int'))->namespace('Internal')->group(
186
186
  function ($router) {
187
+ $router->group(
188
+ ['prefix' => 'v1/fleet-ops/navigator', 'namespace' => 'v1'],
189
+ function ($router) {
190
+ $router->get('get-link-app', 'NavigatorController@getLinkAppUrl');
191
+ $router->get('link-app', 'NavigatorController@linkApp');
192
+ }
193
+ );
194
+
187
195
  $router->group(
188
196
  ['prefix' => 'v1', 'namespace' => 'v1', 'middleware' => ['fleetbase.protected', \Fleetbase\FleetOps\Http\Middleware\TransformLocationMiddleware::class]],
189
197
  function ($router) {
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "declarationDir": "declarations",
5
+ "emitDeclarationOnly": true,
6
+ "noEmit": false,
7
+ "rootDir": "."
8
+ },
9
+ "include": ["addon", "addon-test-support"]
10
+ }
@@ -1 +0,0 @@
1
- export { default } from '@fleetbase/console/components/file-icon';