@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.
- package/addon/components/contact-form-panel.hbs +4 -1
- package/addon/components/contact-panel.hbs +1 -1
- package/addon/components/driver-form-panel.hbs +5 -12
- package/addon/components/driver-panel.hbs +4 -1
- package/addon/components/fleet-form-panel.hbs +4 -1
- package/addon/components/fleet-listing-panel.hbs +2 -2
- package/addon/components/fleet-panel.hbs +1 -1
- package/addon/components/fuel-report-form-panel.hbs +4 -1
- package/addon/components/fuel-report-panel.hbs +4 -1
- package/addon/components/issue-form-panel.hbs +4 -1
- package/addon/components/issue-panel.hbs +4 -1
- package/addon/components/layout/fleet-ops-sidebar/driver-listing.hbs +5 -0
- package/addon/components/layout/fleet-ops-sidebar/driver-listing.js +122 -0
- package/addon/components/layout/fleet-ops-sidebar/fleet-listing.hbs +5 -1
- package/addon/components/layout/fleet-ops-sidebar/fleet-listing.js +118 -1
- package/addon/components/layout/fleet-ops-sidebar.hbs +5 -1
- package/addon/components/layout/fleet-ops-sidebar.js +4 -2
- package/addon/components/live-map.hbs +90 -9
- package/addon/components/live-map.js +28 -11
- package/addon/components/map-container/toolbar/zones-panel.js +16 -13
- package/addon/components/place-form-panel.hbs +4 -1
- package/addon/components/place-panel.hbs +4 -1
- package/addon/components/settings-window.hbs +1 -1
- package/addon/components/vehicle-form-panel.hbs +4 -1
- package/addon/components/vehicle-panel.hbs +4 -1
- package/addon/components/vendor-form-panel.hbs +4 -1
- package/addon/components/vendor-panel.hbs +4 -1
- package/addon/controllers/management/drivers/index.js +10 -90
- package/addon/controllers/management/vehicles/index.js +11 -21
- package/addon/controllers/operations/orders/index/new.js +5 -5
- package/addon/controllers/operations/orders/index/view.js +9 -13
- package/addon/helpers/format-point.js +5 -2
- package/addon/helpers/point-to-coordinates.js +6 -2
- package/addon/services/context-panel.js +23 -18
- package/addon/services/driver-actions.js +107 -0
- package/addon/services/vehicle-actions.js +42 -0
- package/addon/styles/fleetops-engine.css +27 -0
- package/addon/templates/operations/orders/index/new.hbs +3 -3
- package/addon/templates/operations/service-rates/index/new.hbs +1 -1
- package/addon/utils/fly-to-leaflet-layer.js +7 -0
- package/app/components/layout/fleet-ops-sidebar/driver-listing.js +1 -0
- package/app/services/driver-actions.js +1 -0
- package/app/services/vehicle-actions.js +1 -0
- package/composer.json +2 -2
- package/extension.json +1 -1
- package/package.json +4 -4
- package/server/src/Casts/MultiPolygon.php +14 -3
- package/server/src/Casts/Point.php +12 -2
- package/server/src/Casts/Polygon.php +19 -4
- package/server/src/Exceptions/IntegratedVendorException.php +45 -1
- package/server/src/Http/Controllers/Api/v1/DriverController.php +29 -14
- package/server/src/Http/Controllers/Api/v1/EntityController.php +36 -1
- package/server/src/Http/Controllers/Api/v1/LabelController.php +2 -2
- package/server/src/Http/Controllers/Api/v1/OrderController.php +139 -59
- package/server/src/Http/Controllers/Api/v1/PayloadController.php +20 -12
- package/server/src/Http/Controllers/Api/v1/PlaceController.php +25 -3
- package/server/src/Http/Controllers/Api/v1/PurchaseRateController.php +1 -1
- package/server/src/Http/Controllers/Api/v1/ServiceAreaController.php +71 -3
- package/server/src/Http/Controllers/Api/v1/ServiceQuoteController.php +1 -1
- package/server/src/Http/Controllers/Api/v1/ServiceRateController.php +3 -2
- package/server/src/Http/Controllers/Api/v1/TrackingNumberController.php +2 -2
- package/server/src/Http/Controllers/Api/v1/TrackingStatusController.php +2 -2
- package/server/src/Http/Controllers/Api/v1/VehicleController.php +22 -2
- package/server/src/Http/Controllers/Api/v1/ZoneController.php +59 -3
- package/server/src/Http/Controllers/Internal/v1/DriverController.php +25 -4
- package/server/src/Http/Controllers/Internal/v1/LiveController.php +3 -10
- package/server/src/Http/Controllers/Internal/v1/NavigatorController.php +1 -1
- package/server/src/Http/Controllers/Internal/v1/OrderController.php +11 -1
- package/server/src/Http/Filter/TrackingStatusFilter.php +10 -0
- package/server/src/Http/Requests/CancelOrderRequest.php +1 -2
- package/server/src/Http/Requests/CreateContactRequest.php +5 -4
- package/server/src/Http/Requests/CreateDriverRequest.php +13 -11
- package/server/src/Http/Requests/CreateEntityRequest.php +7 -4
- package/server/src/Http/Requests/CreateOrderRequest.php +2 -2
- package/server/src/Http/Requests/CreatePayloadRequest.php +1 -1
- package/server/src/Http/Requests/CreatePlaceRequest.php +46 -4
- package/server/src/Http/Requests/CreatePurchaseRateRequest.php +3 -2
- package/server/src/Http/Requests/CreateServiceAreaRequest.php +24 -4
- package/server/src/Http/Requests/CreateServiceRateRequest.php +22 -21
- package/server/src/Http/Requests/CreateTrackingStatusRequest.php +9 -8
- package/server/src/Http/Requests/CreateVehicleRequest.php +6 -4
- package/server/src/Http/Requests/CreateZoneRequest.php +24 -5
- package/server/src/Http/Requests/QueryServiceQuotesRequest.php +11 -10
- package/server/src/Http/Requests/ScheduleOrderRequest.php +32 -0
- package/server/src/Http/Requests/UpdateContactRequest.php +0 -13
- package/server/src/Http/Requests/UpdateServiceAreaRequest.php +1 -23
- package/server/src/Http/Requests/UpdateServiceQuoteRequest.php +1 -23
- package/server/src/Http/Requests/UpdateServiceRateRequest.php +1 -23
- package/server/src/Http/Requests/UpdateTrackingStatusRequest.php +1 -26
- package/server/src/Http/Resources/v1/DeletedResource.php +2 -9
- package/server/src/Http/Resources/v1/Entity.php +47 -44
- package/server/src/Http/Resources/v1/Order.php +1 -1
- package/server/src/Http/Resources/v1/ServiceArea.php +2 -2
- package/server/src/Http/Resources/v1/Vehicle.php +1 -3
- package/server/src/Http/Resources/v1/Zone.php +2 -4
- package/server/src/Models/Entity.php +99 -3
- package/server/src/Models/Order.php +75 -7
- package/server/src/Models/Payload.php +104 -33
- package/server/src/Models/Place.php +56 -17
- package/server/src/Models/ServiceArea.php +285 -18
- package/server/src/Models/ServiceRate.php +10 -6
- package/server/src/Models/TrackingNumber.php +18 -24
- package/server/src/Models/TrackingStatus.php +2 -6
- package/server/src/Models/Vehicle.php +2 -2
- package/server/src/Models/Waypoint.php +0 -10
- package/server/src/Models/Zone.php +132 -5
- package/server/src/Support/Flow.php +17 -3
- package/server/src/Support/Utils.php +143 -9
- package/server/src/routes.php +4 -3
- package/addon/helpers/extract-coordinates.js +0 -6
- package/addon/utils/extract-coordinates.js +0 -1
- package/app/helpers/extract-coordinates.js +0 -1
- 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()->
|
|
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()->
|
|
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()->
|
|
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()->
|
|
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
|
-
//
|
|
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
|
-
|
|
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
|
-
//
|
|
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()
|
|
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
|
-
'
|
|
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']
|
|
43
|
-
$input['
|
|
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($
|
|
109
|
-
$input['code'] = TrackingStatus::prepareCode($input
|
|
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', '
|
|
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
|
|
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', '
|
|
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
|
|
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
|
-
|
|
142
|
-
|
|
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
|
|
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')
|
|
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
|
|
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->
|
|
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
|
|
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' => '
|
|
29
|
-
'email' => 'nullable
|
|
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'
|
|
32
|
-
'email'
|
|
33
|
-
'phone'
|
|
34
|
-
'password'
|
|
35
|
-
'country'
|
|
36
|
-
'city'
|
|
37
|
-
'vehicle'
|
|
38
|
-
'status'
|
|
39
|
-
'vendor'
|
|
40
|
-
'job'
|
|
41
|
-
'location'
|
|
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
|
-
'
|
|
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',
|