@fleetbase/fleetops-engine 0.3.7 → 0.3.9

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 (113) hide show
  1. package/addon/components/contact-form-panel.hbs +4 -1
  2. package/addon/components/contact-panel.hbs +1 -1
  3. package/addon/components/driver-form-panel.hbs +5 -12
  4. package/addon/components/driver-panel.hbs +4 -1
  5. package/addon/components/fleet-form-panel.hbs +4 -1
  6. package/addon/components/fleet-listing-panel.hbs +2 -2
  7. package/addon/components/fleet-panel.hbs +1 -1
  8. package/addon/components/fuel-report-form-panel.hbs +4 -1
  9. package/addon/components/fuel-report-panel.hbs +4 -1
  10. package/addon/components/issue-form-panel.hbs +4 -1
  11. package/addon/components/issue-panel.hbs +4 -1
  12. package/addon/components/layout/fleet-ops-sidebar/driver-listing.hbs +5 -0
  13. package/addon/components/layout/fleet-ops-sidebar/driver-listing.js +122 -0
  14. package/addon/components/layout/fleet-ops-sidebar/fleet-listing.hbs +5 -1
  15. package/addon/components/layout/fleet-ops-sidebar/fleet-listing.js +118 -1
  16. package/addon/components/layout/fleet-ops-sidebar.hbs +5 -1
  17. package/addon/components/layout/fleet-ops-sidebar.js +4 -2
  18. package/addon/components/live-map.hbs +90 -9
  19. package/addon/components/live-map.js +28 -11
  20. package/addon/components/map-container/toolbar/zones-panel.js +16 -13
  21. package/addon/components/place-form-panel.hbs +4 -1
  22. package/addon/components/place-panel.hbs +4 -1
  23. package/addon/components/settings-window.hbs +1 -1
  24. package/addon/components/vehicle-form-panel.hbs +4 -1
  25. package/addon/components/vehicle-panel.hbs +4 -1
  26. package/addon/components/vendor-form-panel.hbs +4 -1
  27. package/addon/components/vendor-panel.hbs +4 -1
  28. package/addon/controllers/management/drivers/index.js +10 -90
  29. package/addon/controllers/management/vehicles/index.js +11 -21
  30. package/addon/controllers/operations/orders/index/new.js +5 -5
  31. package/addon/controllers/operations/orders/index/view.js +9 -13
  32. package/addon/helpers/format-point.js +5 -2
  33. package/addon/helpers/point-to-coordinates.js +6 -2
  34. package/addon/services/context-panel.js +23 -18
  35. package/addon/services/driver-actions.js +107 -0
  36. package/addon/services/vehicle-actions.js +42 -0
  37. package/addon/styles/fleetops-engine.css +27 -0
  38. package/addon/templates/operations/orders/index/new.hbs +3 -3
  39. package/addon/templates/operations/service-rates/index/new.hbs +1 -1
  40. package/addon/utils/fly-to-leaflet-layer.js +7 -0
  41. package/app/components/layout/fleet-ops-sidebar/driver-listing.js +1 -0
  42. package/app/services/driver-actions.js +1 -0
  43. package/app/services/vehicle-actions.js +1 -0
  44. package/composer.json +2 -2
  45. package/extension.json +1 -1
  46. package/package.json +4 -4
  47. package/server/src/Casts/MultiPolygon.php +14 -3
  48. package/server/src/Casts/Point.php +12 -2
  49. package/server/src/Casts/Polygon.php +19 -4
  50. package/server/src/Exceptions/IntegratedVendorException.php +45 -1
  51. package/server/src/Http/Controllers/Api/v1/DriverController.php +29 -14
  52. package/server/src/Http/Controllers/Api/v1/EntityController.php +36 -1
  53. package/server/src/Http/Controllers/Api/v1/LabelController.php +2 -2
  54. package/server/src/Http/Controllers/Api/v1/OrderController.php +139 -59
  55. package/server/src/Http/Controllers/Api/v1/PayloadController.php +20 -12
  56. package/server/src/Http/Controllers/Api/v1/PlaceController.php +25 -3
  57. package/server/src/Http/Controllers/Api/v1/PurchaseRateController.php +1 -1
  58. package/server/src/Http/Controllers/Api/v1/ServiceAreaController.php +71 -3
  59. package/server/src/Http/Controllers/Api/v1/ServiceQuoteController.php +1 -1
  60. package/server/src/Http/Controllers/Api/v1/ServiceRateController.php +3 -2
  61. package/server/src/Http/Controllers/Api/v1/TrackingNumberController.php +2 -2
  62. package/server/src/Http/Controllers/Api/v1/TrackingStatusController.php +2 -2
  63. package/server/src/Http/Controllers/Api/v1/VehicleController.php +22 -2
  64. package/server/src/Http/Controllers/Api/v1/ZoneController.php +59 -3
  65. package/server/src/Http/Controllers/Internal/v1/DriverController.php +25 -4
  66. package/server/src/Http/Controllers/Internal/v1/LiveController.php +3 -10
  67. package/server/src/Http/Controllers/Internal/v1/NavigatorController.php +1 -1
  68. package/server/src/Http/Controllers/Internal/v1/OrderController.php +11 -1
  69. package/server/src/Http/Filter/TrackingStatusFilter.php +10 -0
  70. package/server/src/Http/Requests/CancelOrderRequest.php +1 -2
  71. package/server/src/Http/Requests/CreateContactRequest.php +5 -4
  72. package/server/src/Http/Requests/CreateDriverRequest.php +13 -11
  73. package/server/src/Http/Requests/CreateEntityRequest.php +7 -4
  74. package/server/src/Http/Requests/CreateOrderRequest.php +2 -2
  75. package/server/src/Http/Requests/CreatePayloadRequest.php +1 -1
  76. package/server/src/Http/Requests/CreatePlaceRequest.php +46 -4
  77. package/server/src/Http/Requests/CreatePurchaseRateRequest.php +3 -2
  78. package/server/src/Http/Requests/CreateServiceAreaRequest.php +24 -4
  79. package/server/src/Http/Requests/CreateServiceRateRequest.php +22 -21
  80. package/server/src/Http/Requests/CreateTrackingStatusRequest.php +9 -8
  81. package/server/src/Http/Requests/CreateVehicleRequest.php +6 -4
  82. package/server/src/Http/Requests/CreateZoneRequest.php +24 -5
  83. package/server/src/Http/Requests/QueryServiceQuotesRequest.php +11 -10
  84. package/server/src/Http/Requests/ScheduleOrderRequest.php +32 -0
  85. package/server/src/Http/Requests/UpdateContactRequest.php +0 -13
  86. package/server/src/Http/Requests/UpdateServiceAreaRequest.php +1 -23
  87. package/server/src/Http/Requests/UpdateServiceQuoteRequest.php +1 -23
  88. package/server/src/Http/Requests/UpdateServiceRateRequest.php +1 -23
  89. package/server/src/Http/Requests/UpdateTrackingStatusRequest.php +1 -26
  90. package/server/src/Http/Resources/v1/DeletedResource.php +2 -9
  91. package/server/src/Http/Resources/v1/Entity.php +47 -44
  92. package/server/src/Http/Resources/v1/Order.php +1 -1
  93. package/server/src/Http/Resources/v1/ServiceArea.php +2 -2
  94. package/server/src/Http/Resources/v1/Vehicle.php +1 -3
  95. package/server/src/Http/Resources/v1/Zone.php +2 -4
  96. package/server/src/Models/Entity.php +99 -3
  97. package/server/src/Models/Order.php +75 -7
  98. package/server/src/Models/Payload.php +104 -33
  99. package/server/src/Models/Place.php +56 -17
  100. package/server/src/Models/ServiceArea.php +285 -18
  101. package/server/src/Models/ServiceRate.php +10 -6
  102. package/server/src/Models/TrackingNumber.php +18 -24
  103. package/server/src/Models/TrackingStatus.php +2 -6
  104. package/server/src/Models/Vehicle.php +2 -2
  105. package/server/src/Models/Waypoint.php +0 -10
  106. package/server/src/Models/Zone.php +132 -5
  107. package/server/src/Support/Flow.php +17 -3
  108. package/server/src/Support/Utils.php +143 -9
  109. package/server/src/routes.php +4 -3
  110. package/addon/helpers/extract-coordinates.js +0 -6
  111. package/addon/utils/extract-coordinates.js +0 -1
  112. package/app/helpers/extract-coordinates.js +0 -1
  113. package/app/utils/extract-coordinates.js +0 -1
@@ -66,6 +66,28 @@ class PlaceController extends Controller
66
66
  }
67
67
  }
68
68
 
69
+ // if we have only latitude/longitude or location BUT no street1 do a reverse lookup
70
+ $requestHasCoordinates = $request->filled(['latitude', 'longitude']);
71
+ $requestHasLocation = $request->filled(['location']);
72
+ $requestMissingStreet = $request->missing('street1');
73
+ if ($requestMissingStreet && ($requestHasCoordinates || $requestHasLocation)) {
74
+ if ($requestHasLocation) {
75
+ $point = Utils::getPointFromMixed($request->input('location'));
76
+ }
77
+
78
+ if ($requestHasCoordinates) {
79
+ $point = Utils::getPointFromMixed($request->only(['latitude', 'longitude']));
80
+ }
81
+
82
+ if ($point instanceof Point) {
83
+ $place = Place::createFromReverseGeocodingLookup($point);
84
+
85
+ if ($place instanceof Place) {
86
+ $input = $place->toArray();
87
+ }
88
+ }
89
+ }
90
+
69
91
  // latitude / longitude
70
92
  if ($request->has(['latitude', 'longitude'])) {
71
93
  $input['location'] = Utils::getPointFromCoordinates($request->only(['latitude', 'longitude']));
@@ -141,7 +163,7 @@ class PlaceController extends Controller
141
163
  try {
142
164
  $place = Place::findRecordOrFail($id);
143
165
  } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $exception) {
144
- return response()->error('Place resource not found.');
166
+ return response()->apiError('Place resource not found.');
145
167
  }
146
168
 
147
169
  // get request input
@@ -307,7 +329,7 @@ class PlaceController extends Controller
307
329
  try {
308
330
  $place = Place::findRecordOrFail($id);
309
331
  } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $exception) {
310
- return response()->error('Place resource not found.');
332
+ return response()->apiError('Place resource not found.');
311
333
  }
312
334
 
313
335
  return new PlaceResource($place);
@@ -323,7 +345,7 @@ class PlaceController extends Controller
323
345
  try {
324
346
  $place = Place::findRecordOrFail($id);
325
347
  } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $exception) {
326
- return response()->error('Place resource not found.');
348
+ return response()->apiError('Place resource not found.');
327
349
  }
328
350
 
329
351
  $place->delete();
@@ -97,7 +97,7 @@ class PurchaseRateController extends Controller
97
97
  try {
98
98
  $integratedVendorOrder = $serviceQuote->integratedVendor->api()->createOrderFromServiceQuote($serviceQuote, $request);
99
99
  } catch (\Exception $e) {
100
- return response()->error($e->getMessage());
100
+ return response()->apiError($e->getMessage());
101
101
  }
102
102
  }
103
103
 
@@ -7,7 +7,9 @@ use Fleetbase\FleetOps\Http\Requests\UpdateServiceAreaRequest;
7
7
  use Fleetbase\FleetOps\Http\Resources\v1\DeletedResource;
8
8
  use Fleetbase\FleetOps\Http\Resources\v1\ServiceArea as ServiceAreaResource;
9
9
  use Fleetbase\FleetOps\Models\ServiceArea;
10
+ use Fleetbase\FleetOps\Support\Utils;
10
11
  use Fleetbase\Http\Controllers\Controller;
12
+ use Grimzy\LaravelMysqlSpatial\Types\Point;
11
13
  use Illuminate\Http\Request;
12
14
 
13
15
  class ServiceAreaController extends Controller
@@ -24,13 +26,48 @@ class ServiceAreaController extends Controller
24
26
  // get request input
25
27
  $input = $request->only(['name', 'type', 'status']);
26
28
 
29
+ // get radius for creating service area border - default to 500 meters
30
+ $radius = (int) $request->input('radius', 500);
31
+
27
32
  // make sure company is set
28
33
  $input['company_uuid'] = session('company');
29
34
 
30
- // @todo some geocoding here
35
+ // if parent service area set
36
+ if ($request->filled('parent')) {
37
+ $input['parent_uuid'] = Utils::getUuid('service_areas', [
38
+ 'public_id' => $request->input('parent'),
39
+ 'company_uuid' => session('company'),
40
+ ]);
41
+ }
42
+
43
+ // if latitude and longitude is provided
44
+ if ($request->has(['latitude', 'longitude'])) {
45
+ // create a polygon given the radius
46
+ $latitude = $request->input('latitude');
47
+ $longitude = $request->input('longitude');
48
+ $point = new Point($latitude, $longitude);
49
+
50
+ if ($point instanceof Point) {
51
+ $input['border'] = ServiceArea::createMultiPolygonFromPoint($point, $radius);
52
+ }
53
+ }
54
+
55
+ // if a location is provided
56
+ if ($request->has('location')) {
57
+ $location = $request->input('location');
58
+ $point = Utils::getPointFromMixed($location);
59
+
60
+ if ($point instanceof Point) {
61
+ $input['border'] = ServiceArea::createMultiPolygonFromPoint($point, $radius);
62
+ }
63
+ }
31
64
 
32
65
  // create the serviceArea
33
- $serviceArea = ServiceArea::create($input);
66
+ try {
67
+ $serviceArea = ServiceArea::create($input);
68
+ } catch (\Throwable $e) {
69
+ dd($e->getMessage());
70
+ }
34
71
 
35
72
  // response the driver resource
36
73
  return new ServiceAreaResource($serviceArea);
@@ -61,7 +98,38 @@ class ServiceAreaController extends Controller
61
98
  // get request input
62
99
  $input = $request->only(['name', 'type', 'status']);
63
100
 
64
- // @todo some geocoding here
101
+ // get radius for creating service area border - default to 500 meters
102
+ $radius = $request->input('radius', 500);
103
+
104
+ // if parent service area set
105
+ if ($request->filled('parent')) {
106
+ $input['parent_uuid'] = Utils::getUuid('service_areas', [
107
+ 'public_id' => $request->input('parent'),
108
+ 'company_uuid' => session('company'),
109
+ ]);
110
+ }
111
+
112
+ // if latitude and longitude is provided
113
+ if ($request->has(['latitude', 'longitude'])) {
114
+ // create a polygon given the radius
115
+ $latitude = $request->input('latitude');
116
+ $longitude = $request->input('longitude');
117
+ $point = new Point($latitude, $longitude);
118
+
119
+ if ($point instanceof Point) {
120
+ $input['border'] = ServiceArea::createMultiPolygonFromPoint($point, $radius);
121
+ }
122
+ }
123
+
124
+ // if a location is provided
125
+ if ($request->has('location')) {
126
+ $location = $request->input('location');
127
+ $point = Utils::getPointFromMixed($location);
128
+
129
+ if ($point instanceof Point) {
130
+ $input['border'] = ServiceArea::createMultiPolygonFromPoint($point, $radius);
131
+ }
132
+ }
65
133
 
66
134
  // update the serviceArea
67
135
  $serviceArea->update($input);
@@ -72,7 +72,7 @@ class ServiceQuoteController extends Controller
72
72
  }
73
73
 
74
74
  // get all waypoints
75
- $waypoints = $payload->getAllStops()->mapInto(Place::class);
75
+ $waypoints = $payload->getAllStops();
76
76
 
77
77
  // if quote for single service
78
78
  if ($service && $service !== 'all') {
@@ -30,7 +30,8 @@ class ServiceRateController extends Controller
30
30
  'rate_calculation_method',
31
31
  'currency',
32
32
  'base_fee',
33
- 'per_km_flat_rate_fee',
33
+ 'per_meter_unit',
34
+ 'per_meter_flat_rate_fee',
34
35
  'meter_fees',
35
36
  'meter_fees.*.distance',
36
37
  'meter_fees.*.fee',
@@ -77,7 +78,7 @@ class ServiceRateController extends Controller
77
78
  ServiceRateFee::create([
78
79
  'service_rate_uuid' => $serviceRate->uuid,
79
80
  'distance' => Utils::get($meterFee, 'distance'),
80
- 'distance_unit' => 'm',
81
+ 'distance_unit' => $request->input('per_meter_unit', 'm'),
81
82
  'fee' => Utils::get($meterFee, 'fee'),
82
83
  'currency' => $serviceRate->currency,
83
84
  ]);
@@ -39,8 +39,8 @@ class TrackingNumberController extends Controller
39
39
  );
40
40
 
41
41
  if (is_array($owner)) {
42
- $input['owner_uuid'] = Utils::get($owner, 'uuid');
43
- $input['type'] = Utils::getModelClassName(Utils::get($owner, 'table'));
42
+ $input['owner_uuid'] = Utils::get($owner, 'uuid');
43
+ $input['owner_type'] = Utils::getModelClassName(Utils::get($owner, 'table'));
44
44
  }
45
45
  }
46
46
 
@@ -105,8 +105,8 @@ class TrackingStatusController extends Controller
105
105
  }
106
106
 
107
107
  // if no code set create a code from the status
108
- if (empty($input['code'])) {
109
- $input['code'] = TrackingStatus::prepareCode($input['status']);
108
+ if (empty($trackingStatus->code)) {
109
+ $input['code'] = TrackingStatus::prepareCode(data_get($input, 'status', $trackingStatus->status));
110
110
  }
111
111
 
112
112
  // update the trackingStatus
@@ -24,13 +24,18 @@ class VehicleController extends Controller
24
24
  public function create(CreateVehicleRequest $request)
25
25
  {
26
26
  // get request input
27
- $input = $request->only(['status', 'make', 'model', 'year', 'trim', 'type', 'plate_number', 'vin', 'meta', 'location', 'altitude', 'heading', 'speed']);
27
+ $input = $request->only(['status', 'make', 'model', 'year', 'trim', 'type', 'plate_number', 'vin', 'meta', 'online', 'location', 'altitude', 'heading', 'speed']);
28
28
  // make sure company is set
29
29
  $input['company_uuid'] = session('company');
30
30
 
31
31
  // create instance of vehicle model
32
32
  $vehicle = new Vehicle();
33
33
 
34
+ // set default online
35
+ if (!isset($input['online'])) {
36
+ $input['online'] = 0;
37
+ }
38
+
34
39
  // vendor assignment
35
40
  if ($request->has('vendor')) {
36
41
  $input['vendor_uuid'] = Utils::getUuid('vendors', [
@@ -39,6 +44,11 @@ class VehicleController extends Controller
39
44
  ]);
40
45
  }
41
46
 
47
+ // latitude / longitude
48
+ if ($request->has(['latitude', 'longitude'])) {
49
+ $input['location'] = Utils::getPointFromCoordinates($request->only(['latitude', 'longitude']));
50
+ }
51
+
42
52
  // apply user input to vehicle
43
53
  $vehicle = $vehicle->fill($input);
44
54
 
@@ -90,7 +100,7 @@ class VehicleController extends Controller
90
100
  }
91
101
 
92
102
  // get request input
93
- $input = $request->only(['status', 'make', 'model', 'year', 'trim', 'type', 'plate_number', 'vin', 'meta', 'location', 'altitude', 'heading', 'speed']);
103
+ $input = $request->only(['status', 'make', 'model', 'year', 'trim', 'type', 'plate_number', 'vin', 'meta', 'location', 'online', 'altitude', 'heading', 'speed']);
94
104
 
95
105
  // vendor assignment
96
106
  if ($request->has('vendor')) {
@@ -100,6 +110,16 @@ class VehicleController extends Controller
100
110
  ]);
101
111
  }
102
112
 
113
+ // set default online
114
+ if (!isset($input['online'])) {
115
+ $input['online'] = 0;
116
+ }
117
+
118
+ // latitude / longitude
119
+ if ($request->has(['latitude', 'longitude'])) {
120
+ $input['location'] = Utils::getPointFromCoordinates($request->only(['latitude', 'longitude']));
121
+ }
122
+
103
123
  // update the vehicle w/ user input
104
124
  $vehicle->fill($input);
105
125
 
@@ -9,6 +9,7 @@ use Fleetbase\FleetOps\Http\Resources\v1\Zone as ZoneResource;
9
9
  use Fleetbase\FleetOps\Models\Zone;
10
10
  use Fleetbase\FleetOps\Support\Utils;
11
11
  use Fleetbase\Http\Controllers\Controller;
12
+ use Grimzy\LaravelMysqlSpatial\Types\Point;
12
13
  use Illuminate\Http\Request;
13
14
 
14
15
  class ZoneController extends Controller
@@ -23,7 +24,10 @@ class ZoneController extends Controller
23
24
  public function create(CreateZoneRequest $request)
24
25
  {
25
26
  // get request input
26
- $input = $request->only(['name', 'boundary', 'status', 'description', 'color', 'stroke_color']);
27
+ $input = $request->only(['name', 'border', 'status', 'description', 'color', 'stroke_color']);
28
+
29
+ // get radius for creating zone border - default to 500 meters
30
+ $radius = $request->input('radius', 500);
27
31
 
28
32
  // make sure company is set
29
33
  $input['company_uuid'] = session('company');
@@ -36,10 +40,37 @@ class ZoneController extends Controller
36
40
  ]);
37
41
  }
38
42
 
43
+ // if latitude and longitude is provided
44
+ if ($request->has(['latitude', 'longitude'])) {
45
+ // create a polygon given the radius
46
+ $latitude = $request->input('latitude');
47
+ $longitude = $request->input('longitude');
48
+ $point = new Point($latitude, $longitude);
49
+
50
+ if ($point instanceof Point) {
51
+ $input['border'] = Zone::createPolygonFromPoint($point, $radius);
52
+ }
53
+ }
54
+
55
+ // if a location is provided
56
+ if ($request->has('location')) {
57
+ $location = $request->input('location');
58
+ $point = Utils::getPointFromMixed($location);
59
+
60
+ if ($point instanceof Point) {
61
+ $input['border'] = Zone::createPolygonFromPoint($point, $radius);
62
+ }
63
+ }
64
+
65
+ /**
66
+ * @todo if missing location, latitude, longitude and border
67
+ * then create a zone from the center of the service area provided
68
+ */
69
+
39
70
  // create the zone
40
71
  $zone = Zone::create($input);
41
72
 
42
- // response the driver resource
73
+ // response the zone resource
43
74
  return new ZoneResource($zone);
44
75
  }
45
76
 
@@ -66,7 +97,10 @@ class ZoneController extends Controller
66
97
  }
67
98
 
68
99
  // get request input
69
- $input = $request->only(['name', 'boundary', 'status', 'description', 'color', 'stroke_color']);
100
+ $input = $request->only(['name', 'border', 'status', 'description', 'color', 'stroke_color']);
101
+
102
+ // get radius for creating zone border - default to 500 meters
103
+ $radius = $request->input('radius', 500);
70
104
 
71
105
  // service area assignment
72
106
  if ($request->has('service_area')) {
@@ -76,6 +110,28 @@ class ZoneController extends Controller
76
110
  ]);
77
111
  }
78
112
 
113
+ // if latitude and longitude is provided
114
+ if ($request->has(['latitude', 'longitude'])) {
115
+ // create a polygon given the radius
116
+ $latitude = $request->input('latitude');
117
+ $longitude = $request->input('longitude');
118
+ $point = new Point($latitude, $longitude);
119
+
120
+ if ($point instanceof Point) {
121
+ $input['border'] = Zone::createPolygonFromPoint($point, $radius);
122
+ }
123
+ }
124
+
125
+ // if a location is provided
126
+ if ($request->has('location')) {
127
+ $location = $request->input('location');
128
+ $point = Utils::getPointFromMixed($location);
129
+
130
+ if ($point instanceof Point) {
131
+ $input['border'] = Zone::createPolygonFromPoint($point, $radius);
132
+ }
133
+ }
134
+
79
135
  // update the zone
80
136
  $zone->update($input);
81
137
 
@@ -17,6 +17,7 @@ use Fleetbase\Models\Invite;
17
17
  use Fleetbase\Models\User;
18
18
  use Fleetbase\Models\VerificationCode;
19
19
  use Fleetbase\Notifications\UserInvited;
20
+ use Grimzy\LaravelMysqlSpatial\Types\Point;
20
21
  use Illuminate\Http\Request;
21
22
  use Illuminate\Support\Facades\DB;
22
23
  use Illuminate\Support\Facades\Validator;
@@ -79,6 +80,12 @@ class DriverController extends FleetOpsController
79
80
  // if exists in organization create driver profile for user
80
81
  $isOrganizationMember = $existingUser->companies()->where('company_uuid', session('company'))->exists();
81
82
 
83
+ // Check if driver profile also already exists
84
+ $existingDriverProfile = Driver::where(['company_uuid' => session('company'), 'user_uuid' => $existingUser->uuid])->first();
85
+ if ($existingDriverProfile) {
86
+ return ['driver' => new $this->resource($existingDriverProfile)];
87
+ }
88
+
82
89
  // create driver profile for user
83
90
  $input = collect($input)
84
91
  ->except(['name', 'password', 'email', 'phone', 'meta', 'avatar_uuid', 'photo_uuid'])
@@ -90,6 +97,11 @@ class DriverController extends FleetOpsController
90
97
  $input['user_uuid'] = $existingUser->uuid;
91
98
  $input['slug'] = $existingUser->slug;
92
99
 
100
+ // If no location provided set
101
+ if (empty($input['location'])) {
102
+ $input['location'] = new Point(0, 0);
103
+ }
104
+
93
105
  // create the profile
94
106
  $driverProfile = Driver::create($input);
95
107
 
@@ -109,7 +121,7 @@ class DriverController extends FleetOpsController
109
121
  $existingUser->notify(new UserInvited($invitation));
110
122
  }
111
123
 
112
- return response()->json(['driver' => $driverProfile]);
124
+ return ['driver' => new $this->resource($driverProfile)];
113
125
  }
114
126
  }
115
127
 
@@ -138,15 +150,19 @@ class DriverController extends FleetOpsController
138
150
  ->filter()
139
151
  ->toArray();
140
152
 
141
- if (!isset($input['password'])) {
142
- $input['password'] = data_get($userInput, 'phone', Str::random(14));
153
+ // Make sure password is set
154
+ if (empty($userInput['password'])) {
155
+ $userInput['password'] = Str::random(14);
143
156
  }
144
157
 
145
158
  $userInput['company_uuid'] = session('company');
146
- $userInput['type'] = 'driver';
147
159
 
160
+ // Create user account
148
161
  $user = User::create($userInput);
149
162
 
163
+ // Set user type as driver
164
+ $user->setUserType('driver');
165
+
150
166
  // send invitation to user
151
167
  $invitation = Invite::create([
152
168
  'company_uuid' => session('company'),
@@ -163,6 +179,11 @@ class DriverController extends FleetOpsController
163
179
 
164
180
  $input['user_uuid'] = $user->uuid;
165
181
  $input['slug'] = $user->slug;
182
+
183
+ // If no location provided set
184
+ if (empty($input['location'])) {
185
+ $input['location'] = new Point(0, 0);
186
+ }
166
187
  },
167
188
  function ($request, &$driver) {
168
189
  $driver->load(['user']);
@@ -82,26 +82,19 @@ class LiveController extends Controller
82
82
  }
83
83
 
84
84
  /**
85
- * Get online drivers with active jobs for the current company.
85
+ * Get drivers for the current company.
86
86
  *
87
87
  * @return \Illuminate\Http\JsonResponse
88
88
  */
89
89
  public function drivers()
90
90
  {
91
- $drivers = Driver::where(['company_uuid' => session('company'), 'online' => 1])
92
- ->whereHas(
93
- 'currentJob',
94
- function ($q) {
95
- $q->whereNotIn('status', ['canceled', 'completed']);
96
- }
97
- )
98
- ->get();
91
+ $drivers = Driver::where(['company_uuid' => session('company')])->get();
99
92
 
100
93
  return DriverResource::collection($drivers);
101
94
  }
102
95
 
103
96
  /**
104
- * Get online vehicles for the current company.
97
+ * Get vehicles for the current company.
105
98
  *
106
99
  * @return \Illuminate\Http\JsonResponse
107
100
  */
@@ -30,7 +30,7 @@ class NavigatorController extends Controller
30
30
  ]
31
31
  );
32
32
 
33
- return redirect()->away('flbnavigator://configure?key=' . $apiCredential->key . '&host=' . url()->secure('/'));
33
+ return redirect()->away('flbnavigator://configure?key=' . $apiCredential->key . '&host=' . url()->secure('/') . '&socketcluster_host=' . env('SOCKETCLUSTER_HOST', 'socket') . '&socketcluster_port=' . env('SOCKETCLUSTER_PORT', 8000));
34
34
  }
35
35
 
36
36
  return response()->error('Organization for linking not found.');
@@ -62,6 +62,16 @@ class OrderController extends FleetOpsController
62
62
 
63
63
  $input['integrated_vendor_order'] = $integratedVendorOrder;
64
64
  }
65
+
66
+ // if no type is set its default to default
67
+ if (!isset($input['type'])) {
68
+ $input['type'] = 'default';
69
+ }
70
+
71
+ // if no status is set its default to `created`
72
+ if (!isset($input['status'])) {
73
+ $input['status'] = 'created';
74
+ }
65
75
  },
66
76
  function (&$request, Order &$order, &$requestInput) {
67
77
  $input = $request->input('order');
@@ -101,7 +111,7 @@ class OrderController extends FleetOpsController
101
111
  $order->purchaseServiceQuote($serviceQuote);
102
112
 
103
113
  // dispatch if flagged true
104
- $order->firstDispatch();
114
+ $order->firstDispatchWithActivity();
105
115
 
106
116
  // load tracking number
107
117
  $order->load(['trackingNumber']);
@@ -11,6 +11,16 @@ class TrackingStatusFilter extends Filter
11
11
  $this->builder->where('company_uuid', $this->session->get('company'));
12
12
  }
13
13
 
14
+ public function trackingNumber(string $trackingNumber)
15
+ {
16
+ $this->builder->whereHas('trackingNumber', function ($query) use ($trackingNumber) {
17
+ $query->where(function ($query) use ($trackingNumber) {
18
+ $query->where('public_id', $trackingNumber);
19
+ $query->orWhere('uuid', $trackingNumber);
20
+ });
21
+ });
22
+ }
23
+
14
24
  public function order(string $order)
15
25
  {
16
26
  $this->builder->whereHas(
@@ -2,7 +2,6 @@
2
2
 
3
3
  namespace Fleetbase\FleetOps\Http\Requests;
4
4
 
5
- use Fleetbase\FleetOps\Support\Utils;
6
5
  use Fleetbase\Http\Requests\FleetbaseRequest;
7
6
 
8
7
  class CancelOrderRequest extends FleetbaseRequest
@@ -14,7 +13,7 @@ class CancelOrderRequest extends FleetbaseRequest
14
13
  */
15
14
  public function authorize()
16
15
  {
17
- return Utils::notEmpty(session('user'));
16
+ return request()->session()->has('api_credential');
18
17
  }
19
18
 
20
19
  /**
@@ -3,6 +3,7 @@
3
3
  namespace Fleetbase\FleetOps\Http\Requests;
4
4
 
5
5
  use Fleetbase\Http\Requests\FleetbaseRequest;
6
+ use Illuminate\Validation\Rules\RequiredIf;
6
7
 
7
8
  class CreateContactRequest extends FleetbaseRequest
8
9
  {
@@ -24,10 +25,10 @@ class CreateContactRequest extends FleetbaseRequest
24
25
  public function rules()
25
26
  {
26
27
  return [
27
- 'name' => 'required',
28
- 'type' => 'required',
29
- 'email' => 'nullable|email',
30
- 'phone' => 'nullable',
28
+ 'name' => ['required'],
29
+ 'type' => [new RequiredIf($this->isMethod('POST'))],
30
+ 'email' => ['nullable', 'email'],
31
+ 'phone' => ['nullable'],
31
32
  ];
32
33
  }
33
34
  }
@@ -28,17 +28,19 @@ class CreateDriverRequest extends FleetbaseRequest
28
28
  $isCreating = $this->isMethod('POST');
29
29
 
30
30
  return [
31
- 'name' => [Rule::requiredIf($isCreating)],
32
- 'email' => [Rule::requiredIf($isCreating), Rule::when($this->filled('email'), ['email']), Rule::when($isCreating, [Rule::unique('users')->whereNull('deleted_at')])],
33
- 'phone' => [Rule::requiredIf($isCreating), Rule::when($isCreating, [Rule::unique('users')->whereNull('deleted_at')])],
34
- 'password' => 'nullable|string',
35
- 'country' => 'nullable|size:2',
36
- 'city' => 'nullable|string',
37
- 'vehicle' => 'nullable|string|starts_with:vehicle_|exists:drivers,public_id',
38
- 'status' => 'nullable|string|in:active,inactive',
39
- 'vendor' => 'nullable|exists:vendors,public_id',
40
- 'job' => 'nullable|exists:orders,public_id',
41
- 'location' => ['nullable', new ResolvablePoint()],
31
+ 'name' => [Rule::requiredIf($isCreating)],
32
+ 'email' => [Rule::requiredIf($isCreating), Rule::when($this->filled('email'), ['email']), Rule::when($isCreating, [Rule::unique('users')->whereNull('deleted_at')])],
33
+ 'phone' => [Rule::requiredIf($isCreating), Rule::when($isCreating, [Rule::unique('users')->whereNull('deleted_at')])],
34
+ 'password' => 'nullable|string',
35
+ 'country' => 'nullable|size:2',
36
+ 'city' => 'nullable|string',
37
+ 'vehicle' => 'nullable|string|starts_with:vehicle_|exists:drivers,public_id',
38
+ 'status' => 'nullable|string|in:active,inactive',
39
+ 'vendor' => 'nullable|exists:vendors,public_id',
40
+ 'job' => 'nullable|exists:orders,public_id',
41
+ 'location' => ['nullable', new ResolvablePoint()],
42
+ 'latitude' => ['nullable', 'required_with:longitude'],
43
+ 'longitude' => ['nullable', 'required_with:latitude'],
42
44
  ];
43
45
  }
44
46
 
@@ -27,16 +27,19 @@ class CreateEntityRequest extends FleetbaseRequest
27
27
  return [
28
28
  'name' => [Rule::requiredIf($this->isMethod('POST'))],
29
29
  'type' => [Rule::requiredIf($this->isMethod('POST'))],
30
- 'email' => 'nullable|email',
30
+ 'destination' => ['nullable', Rule::exists('places', 'public_id')->whereNull('deleted_at')],
31
+ 'waypoint' => ['nullable', Rule::exists('places', 'public_id')->whereNull('deleted_at')],
32
+ 'payload' => ['nullable', Rule::exists('payloads', 'public_id')->whereNull('deleted_at'), 'required_with:destination,waypoint'],
33
+ 'email' => ['nullable', 'email'],
31
34
  'weight' => 'nullable',
32
35
  'weight_unit' => [Rule::requiredIf($this->has('weight')), 'in:g,oz,lb,kg'],
33
36
  'length' => 'nullable',
34
37
  'width' => 'nullable',
35
38
  'height' => 'nullable',
36
39
  'dimensions_unit' => [Rule::requiredIf($this->has(['length', 'width', 'height'])), 'in:cm,in,ft,mm,m,yd'],
37
- 'declared_value' => 'nullable',
38
- 'price' => 'nullable',
39
- 'sales_price' => 'nullable',
40
+ 'declared_value' => ['nullable', 'numeric'],
41
+ 'price' => ['nullable', 'numeric'],
42
+ 'sales_price' => ['nullable', 'numeric'],
40
43
  'currency' => [Rule::requiredIf($this->has(['declared_value', 'price', 'sales_price'])), 'size:3'],
41
44
  ];
42
45
  }
@@ -26,11 +26,11 @@ class CreateOrderRequest extends FleetbaseRequest
26
26
  {
27
27
  $validations = [
28
28
  'adhoc' => 'in:true,false,1,0',
29
- 'dispatch' => 'boolean',
29
+ 'dispatch' => ['nullable', 'boolean'],
30
30
  'adhoc_distance' => 'numeric',
31
31
  'pod_required' => 'in:true,false,1,0',
32
32
  'pod_method' => 'in:' . config('api.pod_methods'),
33
- 'scheduled_at' => 'date',
33
+ 'scheduled_at' => ['nullable', 'date'],
34
34
  'driver' => 'nullable|exists:drivers,public_id',
35
35
  'service_quote' => 'nullable|exists:service_quotes,public_id',
36
36
  'purchase_rate' => 'nullable|exists:purchase_rates,public_id',