@fleetbase/fleetops-engine 0.6.55 → 0.6.56

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 (109) hide show
  1. package/addon/components/admin/map-settings.hbs +1 -1
  2. package/addon/components/device/details.js +1 -1
  3. package/addon/components/device-event/details.hbs +192 -0
  4. package/addon/components/device-event/details.js +151 -0
  5. package/addon/components/driver/schedule.js +1 -1
  6. package/addon/components/layout/fleet-ops-sidebar.js +15 -9
  7. package/addon/components/telematic/details.hbs +1 -1
  8. package/addon/components/telematic/form.hbs +2 -2
  9. package/addon/components/telematic/settings.hbs +1 -1
  10. package/addon/controllers/connectivity/devices/index/details/events.js +1 -1
  11. package/addon/controllers/connectivity/devices/index/details/vehicle.js +2 -2
  12. package/addon/controllers/connectivity/events/details.js +68 -1
  13. package/addon/controllers/connectivity/sensors/index.js +4 -0
  14. package/addon/controllers/connectivity/telematics/details/events.js +1 -1
  15. package/addon/controllers/connectivity/telematics/details/sensors.js +4 -0
  16. package/addon/controllers/settings/map.js +15 -0
  17. package/addon/instance-initializers/register-vroom-allocation.js +1 -1
  18. package/addon/routes/connectivity/events/details.js +26 -1
  19. package/addon/routes/management/vehicles/index/details.js +3 -1
  20. package/addon/services/map-adapter/google.js +25 -0
  21. package/addon/services/map-adapter/leaflet.js +1 -1
  22. package/addon/services/map-adapter-interface.js +1 -1
  23. package/addon/services/map-manager.js +4 -1
  24. package/addon/services/map-settings.js +15 -0
  25. package/addon/styles/fleetops-engine.css +1 -1
  26. package/addon/templates/connectivity/devices/index/details/vehicle.hbs +2 -1
  27. package/addon/templates/connectivity/events/details.hbs +40 -1
  28. package/addon/templates/settings/map.hbs +38 -9
  29. package/addon/utils/leaflet-plugin-loader.js +5 -5
  30. package/addon/utils/route-colors.js +1 -1
  31. package/app/components/device-event/details.hbs +192 -0
  32. package/app/components/device-event/details.js +1 -0
  33. package/composer.json +1 -1
  34. package/extension.json +1 -1
  35. package/package.json +2 -2
  36. package/server/migrations/2026_06_23_000001_delete_bad_afaqy_telematics_sensors.php +34 -0
  37. package/server/src/Exports/ContactExport.php +12 -5
  38. package/server/src/Exports/DeviceExport.php +92 -0
  39. package/server/src/Exports/DriverExport.php +28 -3
  40. package/server/src/Exports/EquipmentExport.php +94 -0
  41. package/server/src/Exports/FleetExport.php +22 -7
  42. package/server/src/Exports/FuelReportExport.php +16 -1
  43. package/server/src/Exports/IssueExport.php +25 -3
  44. package/server/src/Exports/MaintenanceExport.php +106 -0
  45. package/server/src/Exports/MaintenanceScheduleExport.php +99 -0
  46. package/server/src/Exports/OrderExport.php +24 -5
  47. package/server/src/Exports/PartExport.php +99 -0
  48. package/server/src/Exports/PlaceExport.php +33 -7
  49. package/server/src/Exports/SensorExport.php +94 -0
  50. package/server/src/Exports/ServiceAreaExport.php +31 -7
  51. package/server/src/Exports/ServiceRateExport.php +41 -1
  52. package/server/src/Exports/TelematicExport.php +90 -0
  53. package/server/src/Exports/VehicleExport.php +274 -8
  54. package/server/src/Exports/VendorExport.php +15 -2
  55. package/server/src/Exports/WorkOrderExport.php +92 -0
  56. package/server/src/Http/Controllers/Api/v1/Concerns/ResolvesFleetOpsApiResources.php +176 -0
  57. package/server/src/Http/Controllers/Api/v1/DeviceController.php +225 -0
  58. package/server/src/Http/Controllers/Api/v1/EquipmentController.php +114 -0
  59. package/server/src/Http/Controllers/Api/v1/FuelTransactionController.php +185 -0
  60. package/server/src/Http/Controllers/Api/v1/PartController.php +120 -0
  61. package/server/src/Http/Controllers/Api/v1/SensorController.php +132 -0
  62. package/server/src/Http/Controllers/Api/v1/WorkOrderController.php +161 -0
  63. package/server/src/Http/Controllers/Internal/v1/DeviceController.php +18 -0
  64. package/server/src/Http/Controllers/Internal/v1/EquipmentController.php +17 -0
  65. package/server/src/Http/Controllers/Internal/v1/MaintenanceController.php +17 -0
  66. package/server/src/Http/Controllers/Internal/v1/MaintenanceScheduleController.php +17 -0
  67. package/server/src/Http/Controllers/Internal/v1/PartController.php +17 -0
  68. package/server/src/Http/Controllers/Internal/v1/SensorController.php +18 -0
  69. package/server/src/Http/Controllers/Internal/v1/SettingController.php +29 -5
  70. package/server/src/Http/Controllers/Internal/v1/TelematicController.php +18 -0
  71. package/server/src/Http/Controllers/Internal/v1/WorkOrderController.php +17 -0
  72. package/server/src/Http/Filter/DeviceFilter.php +33 -10
  73. package/server/src/Http/Filter/EquipmentFilter.php +23 -0
  74. package/server/src/Http/Filter/FuelProviderTransactionFilter.php +57 -2
  75. package/server/src/Http/Filter/PartFilter.php +47 -0
  76. package/server/src/Http/Filter/SensorFilter.php +34 -6
  77. package/server/src/Http/Filter/WorkOrderFilter.php +23 -0
  78. package/server/src/Http/Requests/CreateDeviceRequest.php +51 -0
  79. package/server/src/Http/Requests/CreateEquipmentRequest.php +35 -0
  80. package/server/src/Http/Requests/CreateFuelTransactionRequest.php +50 -0
  81. package/server/src/Http/Requests/CreatePartRequest.php +40 -0
  82. package/server/src/Http/Requests/CreateSensorRequest.php +47 -0
  83. package/server/src/Http/Requests/CreateWorkOrderRequest.php +42 -0
  84. package/server/src/Http/Requests/UpdateDeviceRequest.php +7 -0
  85. package/server/src/Http/Requests/UpdateEquipmentRequest.php +7 -0
  86. package/server/src/Http/Requests/UpdateFuelTransactionRequest.php +7 -0
  87. package/server/src/Http/Requests/UpdatePartRequest.php +7 -0
  88. package/server/src/Http/Requests/UpdateSensorRequest.php +7 -0
  89. package/server/src/Http/Requests/UpdateWorkOrderRequest.php +7 -0
  90. package/server/src/Http/Resources/v1/Device.php +72 -0
  91. package/server/src/Http/Resources/v1/Equipment.php +57 -0
  92. package/server/src/Http/Resources/v1/FuelTransaction.php +69 -0
  93. package/server/src/Http/Resources/v1/Part.php +64 -0
  94. package/server/src/Http/Resources/v1/Sensor.php +68 -0
  95. package/server/src/Jobs/SyncTelematicDevicesJob.php +194 -38
  96. package/server/src/Models/Order.php +2 -1
  97. package/server/src/Observers/PurchaseRateObserver.php +2 -1
  98. package/server/src/Support/Analytics/RevenueTrend.php +3 -8
  99. package/server/src/Support/Metrics/ActiveRevenueQuery.php +121 -0
  100. package/server/src/Support/Metrics/AvgOrderValueMetric.php +1 -7
  101. package/server/src/Support/Metrics/EarningsMetric.php +1 -10
  102. package/server/src/Support/Telematics/Providers/AfaqyProvider.php +104 -5
  103. package/server/src/Support/Telematics/Providers/SafeeProvider.php +550 -54
  104. package/server/src/Support/Telematics/TelematicService.php +28 -9
  105. package/server/src/routes.php +67 -14
  106. package/server/tests/ExportCoverageTest.php +79 -0
  107. package/server/tests/MetricsRegistryTest.php +45 -5
  108. package/server/tests/PublicFleetOpsRestEndpointsTest.php +191 -0
  109. package/server/tests/TelematicsHardeningTest.php +636 -1
@@ -0,0 +1,132 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Controllers\Api\v1;
4
+
5
+ use Fleetbase\FleetOps\Http\Controllers\Api\v1\Concerns\ResolvesFleetOpsApiResources;
6
+ use Fleetbase\FleetOps\Http\Requests\CreateSensorRequest;
7
+ use Fleetbase\FleetOps\Http\Requests\UpdateSensorRequest;
8
+ use Fleetbase\FleetOps\Http\Resources\v1\DeletedResource;
9
+ use Fleetbase\FleetOps\Http\Resources\v1\Sensor as SensorResource;
10
+ use Fleetbase\FleetOps\Models\Device;
11
+ use Fleetbase\FleetOps\Models\Sensor;
12
+ use Fleetbase\FleetOps\Models\Telematic;
13
+ use Fleetbase\FleetOps\Models\Warranty;
14
+ use Fleetbase\FleetOps\Support\Utils;
15
+ use Fleetbase\Http\Controllers\Controller;
16
+ use Fleetbase\LaravelMysqlSpatial\Types\Point;
17
+ use Fleetbase\Models\File;
18
+ use Illuminate\Http\Request;
19
+
20
+ class SensorController extends Controller
21
+ {
22
+ use ResolvesFleetOpsApiResources;
23
+
24
+ public function create(CreateSensorRequest $request)
25
+ {
26
+ $this->rejectUuidIdentifiers($request);
27
+
28
+ $input = $this->input($request);
29
+ $input['company_uuid'] = session('company');
30
+
31
+ $sensor = Sensor::create($input)->load(['telematic', 'device', 'warranty', 'photo', 'sensorable']);
32
+
33
+ return new SensorResource($sensor);
34
+ }
35
+
36
+ public function update(string $id, UpdateSensorRequest $request)
37
+ {
38
+ $this->rejectUuidIdentifiers($request);
39
+
40
+ try {
41
+ $sensor = $this->resolveModel(Sensor::class, $id);
42
+ } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $exception) {
43
+ return response()->json(['error' => 'Sensor resource not found.'], 404);
44
+ }
45
+
46
+ $sensor->update($this->input($request));
47
+
48
+ return new SensorResource($sensor->refresh()->load(['telematic', 'device', 'warranty', 'photo', 'sensorable']));
49
+ }
50
+
51
+ public function query(Request $request)
52
+ {
53
+ $this->rejectUuidIdentifiers($request);
54
+
55
+ $results = Sensor::queryWithRequest($request, function (&$query) {
56
+ $query->with(['telematic', 'device', 'warranty', 'photo', 'sensorable']);
57
+ });
58
+
59
+ return SensorResource::collection($results);
60
+ }
61
+
62
+ public function find(string $id)
63
+ {
64
+ try {
65
+ $sensor = $this->resolveModel(Sensor::class, $id)->load(['telematic', 'device', 'warranty', 'photo', 'sensorable']);
66
+ } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $exception) {
67
+ return response()->json(['error' => 'Sensor resource not found.'], 404);
68
+ }
69
+
70
+ return new SensorResource($sensor);
71
+ }
72
+
73
+ public function delete(string $id)
74
+ {
75
+ try {
76
+ $sensor = $this->resolveModel(Sensor::class, $id);
77
+ } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $exception) {
78
+ return response()->json(['error' => 'Sensor resource not found.'], 404);
79
+ }
80
+
81
+ $sensor->delete();
82
+
83
+ return new DeletedResource($sensor);
84
+ }
85
+
86
+ protected function input(Request $request): array
87
+ {
88
+ $input = $request->only([
89
+ 'name',
90
+ 'type',
91
+ 'internal_id',
92
+ 'imei',
93
+ 'imsi',
94
+ 'firmware_version',
95
+ 'serial_number',
96
+ 'unit',
97
+ 'min_threshold',
98
+ 'max_threshold',
99
+ 'threshold_inclusive',
100
+ 'last_reading_at',
101
+ 'last_value',
102
+ 'calibration',
103
+ 'report_frequency_sec',
104
+ 'status',
105
+ 'meta',
106
+ ]);
107
+
108
+ if ($request->filled(['latitude', 'longitude'])) {
109
+ $input['last_position'] = new Point($request->input('latitude'), $request->input('longitude'));
110
+ } elseif ($request->filled('last_position')) {
111
+ $input['last_position'] = Utils::getPointFromCoordinates($request->input('last_position'));
112
+ }
113
+
114
+ $this->applyPublicIdRelation($input, 'device', 'device_uuid', Device::class, $request);
115
+ $this->applyPublicIdRelation($input, 'telematic', 'telematic_uuid', Telematic::class, $request);
116
+ $this->applyPublicIdRelation($input, 'warranty', 'warranty_uuid', Warranty::class, $request);
117
+ $this->applyPublicIdRelation($input, 'photo', 'photo_uuid', File::class, $request);
118
+
119
+ if ($request->exists('sensorable')) {
120
+ if (blank($request->input('sensorable'))) {
121
+ $input['sensorable_type'] = null;
122
+ $input['sensorable_uuid'] = null;
123
+ } else {
124
+ [$type, $uuid] = $this->resolveMorph($request->input('sensorable_type'), $request->input('sensorable'));
125
+ $input['sensorable_type'] = $type;
126
+ $input['sensorable_uuid'] = $uuid;
127
+ }
128
+ }
129
+
130
+ return $input;
131
+ }
132
+ }
@@ -0,0 +1,161 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Controllers\Api\v1;
4
+
5
+ use Fleetbase\FleetOps\Http\Controllers\Api\v1\Concerns\ResolvesFleetOpsApiResources;
6
+ use Fleetbase\FleetOps\Http\Requests\CreateWorkOrderRequest;
7
+ use Fleetbase\FleetOps\Http\Requests\UpdateWorkOrderRequest;
8
+ use Fleetbase\FleetOps\Http\Resources\v1\DeletedResource;
9
+ use Fleetbase\FleetOps\Http\Resources\v1\WorkOrder as WorkOrderResource;
10
+ use Fleetbase\FleetOps\Mail\WorkOrderDispatched;
11
+ use Fleetbase\FleetOps\Models\WorkOrder;
12
+ use Fleetbase\Http\Controllers\Controller;
13
+ use Illuminate\Http\JsonResponse;
14
+ use Illuminate\Http\Request;
15
+ use Illuminate\Support\Facades\Mail;
16
+
17
+ class WorkOrderController extends Controller
18
+ {
19
+ use ResolvesFleetOpsApiResources;
20
+
21
+ public function create(CreateWorkOrderRequest $request)
22
+ {
23
+ $this->rejectUuidIdentifiers($request);
24
+
25
+ $input = $this->input($request);
26
+ $input['company_uuid'] = session('company');
27
+
28
+ $workOrder = WorkOrder::create($input)->load(['target', 'assignee']);
29
+
30
+ return new WorkOrderResource($workOrder);
31
+ }
32
+
33
+ public function update(string $id, UpdateWorkOrderRequest $request)
34
+ {
35
+ $this->rejectUuidIdentifiers($request);
36
+
37
+ try {
38
+ $workOrder = $this->resolveModel(WorkOrder::class, $id);
39
+ } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $exception) {
40
+ return response()->json(['error' => 'WorkOrder resource not found.'], 404);
41
+ }
42
+
43
+ $workOrder->update($this->input($request));
44
+
45
+ return new WorkOrderResource($workOrder->refresh()->load(['target', 'assignee']));
46
+ }
47
+
48
+ public function query(Request $request)
49
+ {
50
+ $this->rejectUuidIdentifiers($request);
51
+
52
+ $results = WorkOrder::queryWithRequest($request, function (&$query) {
53
+ $query->with(['target', 'assignee']);
54
+ });
55
+
56
+ return WorkOrderResource::collection($results);
57
+ }
58
+
59
+ public function find(string $id)
60
+ {
61
+ try {
62
+ $workOrder = $this->resolveModel(WorkOrder::class, $id)->load(['target', 'assignee']);
63
+ } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $exception) {
64
+ return response()->json(['error' => 'WorkOrder resource not found.'], 404);
65
+ }
66
+
67
+ return new WorkOrderResource($workOrder);
68
+ }
69
+
70
+ public function delete(string $id)
71
+ {
72
+ try {
73
+ $workOrder = $this->resolveModel(WorkOrder::class, $id);
74
+ } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $exception) {
75
+ return response()->json(['error' => 'WorkOrder resource not found.'], 404);
76
+ }
77
+
78
+ $workOrder->delete();
79
+
80
+ return new DeletedResource($workOrder);
81
+ }
82
+
83
+ public function send(string $id): JsonResponse
84
+ {
85
+ try {
86
+ $workOrder = $this->resolveModel(WorkOrder::class, $id)->load(['target', 'assignee']);
87
+ } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $exception) {
88
+ return response()->json(['error' => 'WorkOrder resource not found.'], 404);
89
+ }
90
+
91
+ $assignee = $workOrder->assignee;
92
+ if (!$assignee) {
93
+ return response()->json(['error' => 'This work order has no assigned vendor.'], 422);
94
+ }
95
+
96
+ $email = $assignee->email ?? null;
97
+ if (!$email) {
98
+ return response()->json(['error' => 'The assigned vendor has no email address on file.'], 422);
99
+ }
100
+
101
+ Mail::to($email)->send(new WorkOrderDispatched($workOrder));
102
+
103
+ activity('work_order_sent')
104
+ ->performedOn($workOrder)
105
+ ->withProperties(['sent_to' => $email])
106
+ ->log('Work order emailed to vendor');
107
+
108
+ return response()->json([
109
+ 'status' => 'ok',
110
+ 'message' => 'Work order successfully sent to ' . $email,
111
+ ]);
112
+ }
113
+
114
+ protected function input(Request $request): array
115
+ {
116
+ $input = $request->only([
117
+ 'code',
118
+ 'subject',
119
+ 'category',
120
+ 'status',
121
+ 'priority',
122
+ 'opened_at',
123
+ 'due_at',
124
+ 'closed_at',
125
+ 'instructions',
126
+ 'checklist',
127
+ 'estimated_cost',
128
+ 'approved_budget',
129
+ 'actual_cost',
130
+ 'currency',
131
+ 'cost_breakdown',
132
+ 'cost_center',
133
+ 'budget_code',
134
+ 'meta',
135
+ ]);
136
+
137
+ if ($request->exists('target')) {
138
+ if (blank($request->input('target'))) {
139
+ $input['target_type'] = null;
140
+ $input['target_uuid'] = null;
141
+ } else {
142
+ [$type, $uuid] = $this->resolveMorph($request->input('target_type'), $request->input('target'));
143
+ $input['target_type'] = $type;
144
+ $input['target_uuid'] = $uuid;
145
+ }
146
+ }
147
+
148
+ if ($request->exists('assignee')) {
149
+ if (blank($request->input('assignee'))) {
150
+ $input['assignee_type'] = null;
151
+ $input['assignee_uuid'] = null;
152
+ } else {
153
+ [$type, $uuid] = $this->resolveMorph($request->input('assignee_type'), $request->input('assignee'));
154
+ $input['assignee_type'] = $type;
155
+ $input['assignee_uuid'] = $uuid;
156
+ }
157
+ }
158
+
159
+ return $input;
160
+ }
161
+ }
@@ -2,13 +2,17 @@
2
2
 
3
3
  namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;
4
4
 
5
+ use Fleetbase\FleetOps\Exports\DeviceExport;
5
6
  use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
6
7
  use Fleetbase\FleetOps\Models\Device;
7
8
  use Fleetbase\FleetOps\Models\Vehicle;
8
9
  use Fleetbase\FleetOps\Support\Utils;
10
+ use Fleetbase\Http\Requests\ExportRequest;
9
11
  use Illuminate\Http\JsonResponse;
10
12
  use Illuminate\Http\Request;
11
13
  use Illuminate\Support\Facades\Log;
14
+ use Illuminate\Support\Str;
15
+ use Maatwebsite\Excel\Facades\Excel;
12
16
 
13
17
  class DeviceController extends FleetOpsController
14
18
  {
@@ -19,6 +23,20 @@ class DeviceController extends FleetOpsController
19
23
  */
20
24
  public $resource = 'device';
21
25
 
26
+ /**
27
+ * Export devices to excel or csv.
28
+ *
29
+ * @return \Illuminate\Http\Response
30
+ */
31
+ public function export(ExportRequest $request)
32
+ {
33
+ $format = $request->input('format', 'xlsx');
34
+ $selections = $request->array('selections');
35
+ $fileName = trim(Str::slug('devices-' . date('Y-m-d-H:i')) . '.' . $format);
36
+
37
+ return Excel::download(new DeviceExport($selections), $fileName);
38
+ }
39
+
22
40
  /**
23
41
  * Query callback when querying record.
24
42
  *
@@ -2,9 +2,12 @@
2
2
 
3
3
  namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;
4
4
 
5
+ use Fleetbase\FleetOps\Exports\EquipmentExport;
5
6
  use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
6
7
  use Fleetbase\FleetOps\Imports\EquipmentImport;
8
+ use Fleetbase\Http\Requests\ExportRequest;
7
9
  use Fleetbase\Http\Requests\ImportRequest;
10
+ use Illuminate\Support\Str;
8
11
  use Maatwebsite\Excel\Facades\Excel;
9
12
 
10
13
  class EquipmentController extends FleetOpsController
@@ -16,6 +19,20 @@ class EquipmentController extends FleetOpsController
16
19
  */
17
20
  public $resource = 'equipment';
18
21
 
22
+ /**
23
+ * Export equipment to excel or csv.
24
+ *
25
+ * @return \Illuminate\Http\Response
26
+ */
27
+ public function export(ExportRequest $request)
28
+ {
29
+ $format = $request->input('format', 'xlsx');
30
+ $selections = $request->array('selections');
31
+ $fileName = trim(Str::slug('equipment-' . date('Y-m-d-H:i')) . '.' . $format);
32
+
33
+ return Excel::download(new EquipmentExport($selections), $fileName);
34
+ }
35
+
19
36
  /**
20
37
  * Process import files (excel, csv) into Equipment records.
21
38
  *
@@ -2,12 +2,15 @@
2
2
 
3
3
  namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;
4
4
 
5
+ use Fleetbase\FleetOps\Exports\MaintenanceExport;
5
6
  use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
6
7
  use Fleetbase\FleetOps\Imports\MaintenanceImport;
7
8
  use Fleetbase\FleetOps\Models\Maintenance;
9
+ use Fleetbase\Http\Requests\ExportRequest;
8
10
  use Fleetbase\Http\Requests\ImportRequest;
9
11
  use Illuminate\Http\JsonResponse;
10
12
  use Illuminate\Http\Request;
13
+ use Illuminate\Support\Str;
11
14
  use Maatwebsite\Excel\Facades\Excel;
12
15
 
13
16
  class MaintenanceController extends FleetOpsController
@@ -19,6 +22,20 @@ class MaintenanceController extends FleetOpsController
19
22
  */
20
23
  public $resource = 'maintenance';
21
24
 
25
+ /**
26
+ * Export maintenances to excel or csv.
27
+ *
28
+ * @return \Illuminate\Http\Response
29
+ */
30
+ public function export(ExportRequest $request)
31
+ {
32
+ $format = $request->input('format', 'xlsx');
33
+ $selections = $request->array('selections');
34
+ $fileName = trim(Str::slug('maintenances-' . date('Y-m-d-H:i')) . '.' . $format);
35
+
36
+ return Excel::download(new MaintenanceExport($selections), $fileName);
37
+ }
38
+
22
39
  /**
23
40
  * Eager-load polymorphic relationships after create so they appear in the API response.
24
41
  * Called automatically by HasApiControllerBehavior::createRecord() via getControllerCallback.
@@ -2,15 +2,18 @@
2
2
 
3
3
  namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;
4
4
 
5
+ use Fleetbase\FleetOps\Exports\MaintenanceScheduleExport;
5
6
  use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
6
7
  use Fleetbase\FleetOps\Imports\MaintenanceScheduleImport;
7
8
  use Fleetbase\FleetOps\Models\MaintenanceSchedule;
8
9
  use Fleetbase\FleetOps\Models\WorkOrder;
10
+ use Fleetbase\Http\Requests\ExportRequest;
9
11
  use Fleetbase\Http\Requests\ImportRequest;
10
12
  use Illuminate\Http\JsonResponse;
11
13
  use Illuminate\Http\Request;
12
14
  use Illuminate\Http\Response;
13
15
  use Illuminate\Support\Carbon;
16
+ use Illuminate\Support\Str;
14
17
  use Maatwebsite\Excel\Facades\Excel;
15
18
  use Spatie\IcalendarGenerator\Components\Calendar;
16
19
  use Spatie\IcalendarGenerator\Components\Event;
@@ -26,6 +29,20 @@ class MaintenanceScheduleController extends FleetOpsController
26
29
  */
27
30
  public $resource = 'maintenance-schedule';
28
31
 
32
+ /**
33
+ * Export maintenance schedules to excel or csv.
34
+ *
35
+ * @return Response
36
+ */
37
+ public function export(ExportRequest $request)
38
+ {
39
+ $format = $request->input('format', 'xlsx');
40
+ $selections = $request->array('selections');
41
+ $fileName = trim(Str::slug('maintenance-schedules-' . date('Y-m-d-H:i')) . '.' . $format);
42
+
43
+ return Excel::download(new MaintenanceScheduleExport($selections), $fileName);
44
+ }
45
+
29
46
  /**
30
47
  * Process import files (excel, csv) into MaintenanceSchedule records.
31
48
  *
@@ -2,9 +2,12 @@
2
2
 
3
3
  namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;
4
4
 
5
+ use Fleetbase\FleetOps\Exports\PartExport;
5
6
  use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
6
7
  use Fleetbase\FleetOps\Imports\PartImport;
8
+ use Fleetbase\Http\Requests\ExportRequest;
7
9
  use Fleetbase\Http\Requests\ImportRequest;
10
+ use Illuminate\Support\Str;
8
11
  use Maatwebsite\Excel\Facades\Excel;
9
12
 
10
13
  class PartController extends FleetOpsController
@@ -16,6 +19,20 @@ class PartController extends FleetOpsController
16
19
  */
17
20
  public $resource = 'part';
18
21
 
22
+ /**
23
+ * Export parts to excel or csv.
24
+ *
25
+ * @return \Illuminate\Http\Response
26
+ */
27
+ public function export(ExportRequest $request)
28
+ {
29
+ $format = $request->input('format', 'xlsx');
30
+ $selections = $request->array('selections');
31
+ $fileName = trim(Str::slug('parts-' . date('Y-m-d-H:i')) . '.' . $format);
32
+
33
+ return Excel::download(new PartExport($selections), $fileName);
34
+ }
35
+
19
36
  /**
20
37
  * Process import files (excel, csv) into Part records.
21
38
  *
@@ -2,7 +2,11 @@
2
2
 
3
3
  namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;
4
4
 
5
+ use Fleetbase\FleetOps\Exports\SensorExport;
5
6
  use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
7
+ use Fleetbase\Http\Requests\ExportRequest;
8
+ use Illuminate\Support\Str;
9
+ use Maatwebsite\Excel\Facades\Excel;
6
10
 
7
11
  class SensorController extends FleetOpsController
8
12
  {
@@ -13,6 +17,20 @@ class SensorController extends FleetOpsController
13
17
  */
14
18
  public $resource = 'sensor';
15
19
 
20
+ /**
21
+ * Export sensors to excel or csv.
22
+ *
23
+ * @return \Illuminate\Http\Response
24
+ */
25
+ public function export(ExportRequest $request)
26
+ {
27
+ $format = $request->input('format', 'xlsx');
28
+ $selections = $request->array('selections');
29
+ $fileName = trim(Str::slug('sensors-' . date('Y-m-d-H:i')) . '.' . $format);
30
+
31
+ return Excel::download(new SensorExport($selections), $fileName);
32
+ }
33
+
16
34
  /**
17
35
  * Query callback when querying record.
18
36
  *
@@ -327,12 +327,16 @@ class SettingController extends Controller
327
327
  public function getMapSettings()
328
328
  {
329
329
  $defaults = [
330
- 'mapProvider' => 'leaflet',
330
+ 'mapProvider' => 'leaflet',
331
+ 'googleMapsMapType' => 'roadmap',
332
+ 'showGoogleMapsTrafficLayer' => false,
333
+ 'showGoogleMapsTransitLayer' => false,
331
334
  ];
332
335
 
333
336
  $systemMapSettings = Setting::lookup('fleet-ops.map-settings', []);
334
337
  $mapSettings = Setting::lookupFromCompany('fleet-ops.map-settings', $defaults);
335
338
  $mapSettings['mapProvider'] = data_get($mapSettings, 'mapProvider') ?: data_get($systemMapSettings, 'mapProvider', 'leaflet');
339
+ $mapSettings = $this->normalizeCompanyMapSettings($mapSettings);
336
340
 
337
341
  // Source the Google Maps API key from the system-level services config
338
342
  // that is managed by the core-api admin settings panel. This ensures a
@@ -362,10 +366,7 @@ class SettingController extends Controller
362
366
  unset($settings['googleMapsApiKey']);
363
367
 
364
368
  // Validate provider value
365
- $allowedProviders = ['leaflet', 'google'];
366
- if (isset($settings['mapProvider']) && !in_array($settings['mapProvider'], $allowedProviders)) {
367
- $settings['mapProvider'] = 'leaflet';
368
- }
369
+ $settings = $this->normalizeCompanyMapSettings($settings);
369
370
 
370
371
  Setting::configureCompany('fleet-ops.map-settings', $settings);
371
372
 
@@ -400,6 +401,29 @@ class SettingController extends Controller
400
401
  return response()->json($this->getAdminMapSettings()->getData(true));
401
402
  }
402
403
 
404
+ protected function normalizeCompanyMapSettings(array $settings): array
405
+ {
406
+ $allowedProviders = ['leaflet', 'google'];
407
+ $mapProvider = data_get($settings, 'mapProvider', 'leaflet');
408
+ if (!in_array($mapProvider, $allowedProviders)) {
409
+ $mapProvider = 'leaflet';
410
+ }
411
+
412
+ $allowedGoogleMapTypes = ['roadmap', 'satellite', 'hybrid', 'terrain'];
413
+ $googleMapsMapType = data_get($settings, 'googleMapsMapType', 'roadmap');
414
+ if (!in_array($googleMapsMapType, $allowedGoogleMapTypes)) {
415
+ $googleMapsMapType = 'roadmap';
416
+ }
417
+
418
+ return [
419
+ ...$settings,
420
+ 'mapProvider' => $mapProvider,
421
+ 'googleMapsMapType' => $googleMapsMapType,
422
+ 'showGoogleMapsTrafficLayer' => filter_var(data_get($settings, 'showGoogleMapsTrafficLayer', false), FILTER_VALIDATE_BOOLEAN),
423
+ 'showGoogleMapsTransitLayer' => filter_var(data_get($settings, 'showGoogleMapsTransitLayer', false), FILTER_VALIDATE_BOOLEAN),
424
+ ];
425
+ }
426
+
403
427
  /**
404
428
  * Retrieve driver scheduling settings for the current company.
405
429
  *
@@ -2,13 +2,17 @@
2
2
 
3
3
  namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;
4
4
 
5
+ use Fleetbase\FleetOps\Exports\TelematicExport;
5
6
  use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
6
7
  use Fleetbase\FleetOps\Models\Telematic;
7
8
  use Fleetbase\FleetOps\Support\Telematics\TelematicProviderRegistry;
8
9
  use Fleetbase\FleetOps\Support\Telematics\TelematicService;
10
+ use Fleetbase\Http\Requests\ExportRequest;
9
11
  use Fleetbase\Models\Activity;
10
12
  use Illuminate\Http\JsonResponse;
11
13
  use Illuminate\Http\Request;
14
+ use Illuminate\Support\Str;
15
+ use Maatwebsite\Excel\Facades\Excel;
12
16
 
13
17
  class TelematicController extends FleetOpsController
14
18
  {
@@ -29,6 +33,20 @@ class TelematicController extends FleetOpsController
29
33
  $this->registry = $registry;
30
34
  }
31
35
 
36
+ /**
37
+ * Export telematics to excel or csv.
38
+ *
39
+ * @return \Illuminate\Http\Response
40
+ */
41
+ public function export(ExportRequest $request)
42
+ {
43
+ $format = $request->input('format', 'xlsx');
44
+ $selections = $request->array('selections');
45
+ $fileName = trim(Str::slug('telematics-' . date('Y-m-d-H:i')) . '.' . $format);
46
+
47
+ return Excel::download(new TelematicExport($selections), $fileName);
48
+ }
49
+
32
50
  /**
33
51
  * Query callback when querying record.
34
52
  *
@@ -2,13 +2,16 @@
2
2
 
3
3
  namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;
4
4
 
5
+ use Fleetbase\FleetOps\Exports\WorkOrderExport;
5
6
  use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
6
7
  use Fleetbase\FleetOps\Imports\WorkOrderImport;
7
8
  use Fleetbase\FleetOps\Mail\WorkOrderDispatched;
8
9
  use Fleetbase\FleetOps\Models\WorkOrder;
10
+ use Fleetbase\Http\Requests\ExportRequest;
9
11
  use Fleetbase\Http\Requests\ImportRequest;
10
12
  use Illuminate\Http\JsonResponse;
11
13
  use Illuminate\Support\Facades\Mail;
14
+ use Illuminate\Support\Str;
12
15
  use Maatwebsite\Excel\Facades\Excel;
13
16
 
14
17
  class WorkOrderController extends FleetOpsController
@@ -20,6 +23,20 @@ class WorkOrderController extends FleetOpsController
20
23
  */
21
24
  public $resource = 'work-order';
22
25
 
26
+ /**
27
+ * Export work orders to excel or csv.
28
+ *
29
+ * @return \Illuminate\Http\Response
30
+ */
31
+ public function export(ExportRequest $request)
32
+ {
33
+ $format = $request->input('format', 'xlsx');
34
+ $selections = $request->array('selections');
35
+ $fileName = trim(Str::slug('work-orders-' . date('Y-m-d-H:i')) . '.' . $format);
36
+
37
+ return Excel::download(new WorkOrderExport($selections), $fileName);
38
+ }
39
+
23
40
  /**
24
41
  * Process import files (excel, csv) into WorkOrder records.
25
42
  *