@fleetbase/fleetops-engine 0.6.54 → 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 (220) hide show
  1. package/addon/components/admin/map-settings.hbs +1 -1
  2. package/addon/components/admin/routing-settings.hbs +2 -1
  3. package/addon/components/cell/attached-vehicle.hbs +10 -0
  4. package/addon/components/cell/attached-vehicle.js +58 -0
  5. package/addon/components/cell/device-identity.hbs +24 -0
  6. package/addon/components/cell/device-identity.js +129 -0
  7. package/addon/components/cell/driver-identity.hbs +33 -0
  8. package/addon/components/cell/driver-identity.js +143 -0
  9. package/addon/components/cell/equipment-identity.hbs +5 -0
  10. package/addon/components/cell/equipment-identity.js +48 -0
  11. package/addon/components/cell/part-identity.hbs +5 -0
  12. package/addon/components/cell/part-identity.js +63 -0
  13. package/addon/components/cell/telematic-device.hbs +38 -0
  14. package/addon/components/cell/telematic-device.js +44 -0
  15. package/addon/components/cell/telematic-provider.hbs +33 -16
  16. package/addon/components/cell/telematic-provider.js +50 -8
  17. package/addon/components/cell/vehicle-identity.hbs +33 -0
  18. package/addon/components/cell/vehicle-identity.js +138 -0
  19. package/addon/components/device/details.js +1 -1
  20. package/addon/components/device/form.hbs +2 -2
  21. package/addon/components/device/form.js +7 -0
  22. package/addon/components/device/panel-header.hbs +45 -20
  23. package/addon/components/device/panel-header.js +49 -1
  24. package/addon/components/device/panel-tabs/events.hbs +30 -0
  25. package/addon/components/device/panel-tabs/events.js +128 -0
  26. package/addon/components/device/panel-tabs/sensors.hbs +30 -0
  27. package/addon/components/device/panel-tabs/sensors.js +93 -0
  28. package/addon/components/device/panel-tabs/vehicle.hbs +68 -0
  29. package/addon/components/device/panel-tabs/vehicle.js +90 -0
  30. package/addon/components/device-event/details.hbs +192 -0
  31. package/addon/components/device-event/details.js +151 -0
  32. package/addon/components/driver/schedule.js +1 -1
  33. package/addon/components/equipment/form.js +8 -1
  34. package/addon/components/layout/fleet-ops-sidebar.hbs +1 -1
  35. package/addon/components/layout/fleet-ops-sidebar.js +20 -6
  36. package/addon/components/map/drawer/device-event-listing.js +2 -0
  37. package/addon/components/map/drawer/driver-listing.js +2 -0
  38. package/addon/components/map/drawer/place-listing.js +2 -0
  39. package/addon/components/map/drawer/position-listing.hbs +11 -6
  40. package/addon/components/map/drawer/position-listing.js +17 -4
  41. package/addon/components/map/drawer/vehicle-listing.js +2 -0
  42. package/addon/components/sensor/panel-header.hbs +47 -15
  43. package/addon/components/sensor/panel-header.js +59 -1
  44. package/addon/components/table/cell/dropdown/action-item.hbs +31 -0
  45. package/addon/components/table/cell/dropdown/action-item.js +62 -0
  46. package/addon/components/table/cell/dropdown.hbs +28 -0
  47. package/addon/components/table/cell/dropdown.js +91 -0
  48. package/addon/components/telematic/details.hbs +1 -1
  49. package/addon/components/telematic/form.hbs +2 -2
  50. package/addon/components/telematic/settings.hbs +1 -1
  51. package/addon/components/vendor/panel-header.hbs +82 -0
  52. package/addon/components/vendor/panel-header.js +48 -0
  53. package/addon/controllers/connectivity/devices/index/details/events.js +1 -1
  54. package/addon/controllers/connectivity/devices/index/details/vehicle.js +50 -2
  55. package/addon/controllers/connectivity/devices/index.js +144 -129
  56. package/addon/controllers/connectivity/events/details.js +70 -0
  57. package/addon/controllers/connectivity/events/index.js +187 -11
  58. package/addon/controllers/connectivity/sensors/index.js +160 -14
  59. package/addon/controllers/connectivity/telematics/details/devices.js +126 -134
  60. package/addon/controllers/connectivity/telematics/details/events.js +1 -1
  61. package/addon/controllers/connectivity/telematics/details/sensors.js +4 -0
  62. package/addon/controllers/maintenance/equipment/index.js +1 -2
  63. package/addon/controllers/maintenance/parts/index.js +1 -2
  64. package/addon/controllers/management/drivers/index.js +82 -42
  65. package/addon/controllers/management/fuel-reports/index.js +63 -4
  66. package/addon/controllers/management/issues/index.js +63 -4
  67. package/addon/controllers/management/vehicles/index.js +33 -6
  68. package/addon/controllers/settings/map.js +15 -0
  69. package/addon/instance-initializers/register-vroom-allocation.js +1 -1
  70. package/addon/routes/connectivity/devices/index/details/vehicle.js +24 -2
  71. package/addon/routes/connectivity/devices/index.js +7 -0
  72. package/addon/routes/connectivity/events/details.js +28 -0
  73. package/addon/routes/connectivity/events/index.js +6 -2
  74. package/addon/routes/connectivity/sensors/index.js +7 -2
  75. package/addon/routes/connectivity/telematics/details/devices.js +2 -0
  76. package/addon/routes/management/vehicles/index/details.js +3 -1
  77. package/addon/services/device-actions.js +30 -0
  78. package/addon/services/device-event-actions.js +1 -1
  79. package/addon/services/equipment-actions.js +1 -0
  80. package/addon/services/map-adapter/google.js +25 -0
  81. package/addon/services/map-adapter/leaflet.js +1 -1
  82. package/addon/services/map-adapter-interface.js +1 -1
  83. package/addon/services/map-manager.js +4 -1
  84. package/addon/services/map-settings.js +15 -0
  85. package/addon/services/sensor-actions.js +3 -0
  86. package/addon/services/service-rate-actions.js +39 -1
  87. package/addon/services/vehicle-actions.js +24 -12
  88. package/addon/services/vendor-actions.js +3 -0
  89. package/addon/styles/fleetops-engine.css +9 -1
  90. package/addon/templates/connectivity/devices/index/details/vehicle.hbs +66 -2
  91. package/addon/templates/connectivity/events/details.hbs +40 -0
  92. package/addon/templates/management/vendors/index/details.hbs +2 -2
  93. package/addon/templates/settings/map.hbs +38 -9
  94. package/addon/templates/settings/notifications.hbs +2 -1
  95. package/addon/templates/settings/routing.hbs +1 -0
  96. package/addon/utils/device-table-columns.js +288 -0
  97. package/addon/utils/identity-cell-resource.js +20 -0
  98. package/addon/utils/leaflet-plugin-loader.js +5 -5
  99. package/addon/utils/map-drawer-dropdown-position.js +47 -0
  100. package/addon/utils/route-colors.js +1 -1
  101. package/addon/utils/trackable-option.js +93 -0
  102. package/app/components/cell/attached-vehicle.js +1 -0
  103. package/app/components/cell/device-identity.js +1 -0
  104. package/app/components/cell/driver-identity.js +1 -0
  105. package/app/components/cell/equipment-identity.js +1 -0
  106. package/app/components/cell/part-identity.js +1 -0
  107. package/app/components/cell/telematic-device.js +1 -0
  108. package/app/components/cell/vehicle-identity.js +1 -0
  109. package/app/components/device/panel-tabs/events.hbs +30 -0
  110. package/app/components/device/panel-tabs/events.js +128 -0
  111. package/app/components/device/panel-tabs/sensors.hbs +30 -0
  112. package/app/components/device/panel-tabs/sensors.js +93 -0
  113. package/app/components/device/panel-tabs/vehicle.hbs +68 -0
  114. package/app/components/device/panel-tabs/vehicle.js +90 -0
  115. package/app/components/device-event/details.hbs +192 -0
  116. package/app/components/device-event/details.js +1 -0
  117. package/app/components/table/cell/dropdown/action-item.js +1 -0
  118. package/app/components/table/cell/dropdown.js +1 -0
  119. package/app/components/vendor/panel-header.js +1 -0
  120. package/app/controllers/connectivity/events/{index/details.js → details.js} +1 -1
  121. package/app/routes/connectivity/events/{index/details.js → details.js} +1 -1
  122. package/app/templates/connectivity/events/{index/details.js → details.js} +1 -1
  123. package/app/utils/map-drawer-dropdown-position.js +1 -0
  124. package/app/utils/trackable-option.js +1 -0
  125. package/composer.json +1 -1
  126. package/extension.json +1 -1
  127. package/package.json +4 -4
  128. package/server/migrations/2026_06_23_000001_delete_bad_afaqy_telematics_sensors.php +34 -0
  129. package/server/src/Console/Commands/SyncTelematics.php +4 -4
  130. package/server/src/Exports/ContactExport.php +12 -5
  131. package/server/src/Exports/DeviceExport.php +92 -0
  132. package/server/src/Exports/DriverExport.php +28 -3
  133. package/server/src/Exports/EquipmentExport.php +94 -0
  134. package/server/src/Exports/FleetExport.php +22 -7
  135. package/server/src/Exports/FuelReportExport.php +16 -1
  136. package/server/src/Exports/IssueExport.php +25 -3
  137. package/server/src/Exports/MaintenanceExport.php +106 -0
  138. package/server/src/Exports/MaintenanceScheduleExport.php +99 -0
  139. package/server/src/Exports/OrderExport.php +24 -5
  140. package/server/src/Exports/PartExport.php +99 -0
  141. package/server/src/Exports/PlaceExport.php +33 -7
  142. package/server/src/Exports/SensorExport.php +94 -0
  143. package/server/src/Exports/ServiceAreaExport.php +31 -7
  144. package/server/src/Exports/ServiceRateExport.php +41 -1
  145. package/server/src/Exports/TelematicExport.php +90 -0
  146. package/server/src/Exports/VehicleExport.php +274 -8
  147. package/server/src/Exports/VendorExport.php +15 -2
  148. package/server/src/Exports/WorkOrderExport.php +92 -0
  149. package/server/src/Http/Controllers/Api/v1/Concerns/ResolvesFleetOpsApiResources.php +176 -0
  150. package/server/src/Http/Controllers/Api/v1/DeviceController.php +225 -0
  151. package/server/src/Http/Controllers/Api/v1/EquipmentController.php +114 -0
  152. package/server/src/Http/Controllers/Api/v1/FuelTransactionController.php +185 -0
  153. package/server/src/Http/Controllers/Api/v1/PartController.php +120 -0
  154. package/server/src/Http/Controllers/Api/v1/SensorController.php +132 -0
  155. package/server/src/Http/Controllers/Api/v1/WorkOrderController.php +161 -0
  156. package/server/src/Http/Controllers/Internal/v1/DeviceController.php +36 -1
  157. package/server/src/Http/Controllers/Internal/v1/DeviceEventController.php +1 -1
  158. package/server/src/Http/Controllers/Internal/v1/EquipmentController.php +17 -0
  159. package/server/src/Http/Controllers/Internal/v1/LiveController.php +1 -1
  160. package/server/src/Http/Controllers/Internal/v1/MaintenanceController.php +17 -0
  161. package/server/src/Http/Controllers/Internal/v1/MaintenanceScheduleController.php +17 -0
  162. package/server/src/Http/Controllers/Internal/v1/PartController.php +17 -0
  163. package/server/src/Http/Controllers/Internal/v1/SensorController.php +18 -0
  164. package/server/src/Http/Controllers/Internal/v1/ServiceRateController.php +82 -13
  165. package/server/src/Http/Controllers/Internal/v1/SettingController.php +29 -5
  166. package/server/src/Http/Controllers/Internal/v1/TelematicController.php +18 -0
  167. package/server/src/Http/Controllers/Internal/v1/WorkOrderController.php +17 -0
  168. package/server/src/Http/Filter/DeviceEventFilter.php +21 -0
  169. package/server/src/Http/Filter/DeviceFilter.php +50 -4
  170. package/server/src/Http/Filter/EquipmentFilter.php +23 -0
  171. package/server/src/Http/Filter/FuelProviderTransactionFilter.php +57 -2
  172. package/server/src/Http/Filter/PartFilter.php +47 -0
  173. package/server/src/Http/Filter/SensorFilter.php +34 -6
  174. package/server/src/Http/Filter/WorkOrderFilter.php +23 -0
  175. package/server/src/Http/Requests/CreateDeviceRequest.php +51 -0
  176. package/server/src/Http/Requests/CreateEquipmentRequest.php +35 -0
  177. package/server/src/Http/Requests/CreateFuelTransactionRequest.php +50 -0
  178. package/server/src/Http/Requests/CreatePartRequest.php +40 -0
  179. package/server/src/Http/Requests/CreateSensorRequest.php +47 -0
  180. package/server/src/Http/Requests/CreateWorkOrderRequest.php +42 -0
  181. package/server/src/Http/Requests/UpdateDeviceRequest.php +7 -0
  182. package/server/src/Http/Requests/UpdateEquipmentRequest.php +7 -0
  183. package/server/src/Http/Requests/UpdateFuelTransactionRequest.php +7 -0
  184. package/server/src/Http/Requests/UpdatePartRequest.php +7 -0
  185. package/server/src/Http/Requests/UpdateSensorRequest.php +7 -0
  186. package/server/src/Http/Requests/UpdateWorkOrderRequest.php +7 -0
  187. package/server/src/Http/Resources/v1/Device.php +72 -0
  188. package/server/src/Http/Resources/v1/Equipment.php +57 -0
  189. package/server/src/Http/Resources/v1/FuelTransaction.php +69 -0
  190. package/server/src/Http/Resources/v1/Index/Vehicle.php +19 -0
  191. package/server/src/Http/Resources/v1/Part.php +64 -0
  192. package/server/src/Http/Resources/v1/Sensor.php +68 -0
  193. package/server/src/Jobs/SyncTelematicDevicesJob.php +194 -38
  194. package/server/src/Models/Device.php +2 -0
  195. package/server/src/Models/DeviceEvent.php +81 -0
  196. package/server/src/Models/Equipment.php +55 -0
  197. package/server/src/Models/Order.php +2 -1
  198. package/server/src/Observers/PurchaseRateObserver.php +2 -1
  199. package/server/src/Support/Analytics/RevenueTrend.php +3 -8
  200. package/server/src/Support/Metrics/ActiveRevenueQuery.php +121 -0
  201. package/server/src/Support/Metrics/AvgOrderValueMetric.php +1 -7
  202. package/server/src/Support/Metrics/EarningsMetric.php +1 -10
  203. package/server/src/Support/Telematics/Providers/AfaqyProvider.php +105 -5
  204. package/server/src/Support/Telematics/Providers/FlespiProvider.php +89 -15
  205. package/server/src/Support/Telematics/Providers/GeotabProvider.php +123 -35
  206. package/server/src/Support/Telematics/Providers/SafeeProvider.php +567 -47
  207. package/server/src/Support/Telematics/Providers/SamsaraProvider.php +122 -14
  208. package/server/src/Support/Telematics/TelematicService.php +28 -9
  209. package/server/src/routes.php +67 -15
  210. package/server/tests/DeviceFilterTest.php +9 -0
  211. package/server/tests/DriverVehicleStatusDefaultTest.php +19 -2
  212. package/server/tests/EquipmentAssignmentMorphTypeTest.php +35 -0
  213. package/server/tests/ExportCoverageTest.php +79 -0
  214. package/server/tests/MetricsRegistryTest.php +45 -5
  215. package/server/tests/PublicFleetOpsRestEndpointsTest.php +191 -0
  216. package/server/tests/ServiceRateRouteValidationTest.php +101 -0
  217. package/server/tests/TelematicsHardeningTest.php +873 -7
  218. package/addon/controllers/connectivity/events/index/details.js +0 -3
  219. package/addon/routes/connectivity/events/index/details.js +0 -3
  220. package/addon/templates/connectivity/events/index/details.hbs +0 -1
@@ -0,0 +1,94 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Exports;
4
+
5
+ use Fleetbase\FleetOps\Models\Sensor;
6
+ use Maatwebsite\Excel\Concerns\FromCollection;
7
+ use Maatwebsite\Excel\Concerns\ShouldAutoSize;
8
+ use Maatwebsite\Excel\Concerns\WithColumnFormatting;
9
+ use Maatwebsite\Excel\Concerns\WithHeadings;
10
+ use Maatwebsite\Excel\Concerns\WithMapping;
11
+ use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
12
+
13
+ class SensorExport implements FromCollection, WithHeadings, WithMapping, WithColumnFormatting, ShouldAutoSize
14
+ {
15
+ protected array $selections = [];
16
+
17
+ public function __construct(array $selections = [])
18
+ {
19
+ $this->selections = $selections;
20
+ }
21
+
22
+ public function map($sensor): array
23
+ {
24
+ return [
25
+ $sensor->public_id,
26
+ $sensor->name,
27
+ data_get($sensor, 'telematic.name') ?? $sensor->telematic_uuid,
28
+ $sensor->device_name,
29
+ $sensor->type,
30
+ $sensor->last_value,
31
+ $sensor->unit,
32
+ $sensor->status,
33
+ $sensor->threshold_status,
34
+ $sensor->min_threshold,
35
+ $sensor->max_threshold,
36
+ $sensor->serial_number,
37
+ $sensor->imei,
38
+ $sensor->last_reading_at,
39
+ $sensor->attached_to_name,
40
+ $this->yesNo($sensor->is_active),
41
+ $sensor->created_at,
42
+ $sensor->updated_at,
43
+ ];
44
+ }
45
+
46
+ public function headings(): array
47
+ {
48
+ return [
49
+ 'ID',
50
+ 'Name',
51
+ 'Telematic',
52
+ 'Device',
53
+ 'Type',
54
+ 'Last Value',
55
+ 'Unit',
56
+ 'Status',
57
+ 'Threshold Status',
58
+ 'Min Threshold',
59
+ 'Max Threshold',
60
+ 'Serial Number',
61
+ 'IMEI',
62
+ 'Last Reading',
63
+ 'Attached To',
64
+ 'Active',
65
+ 'Date Created',
66
+ 'Date Updated',
67
+ ];
68
+ }
69
+
70
+ public function columnFormats(): array
71
+ {
72
+ return [
73
+ 'N' => NumberFormat::FORMAT_DATE_DDMMYYYY,
74
+ 'Q' => NumberFormat::FORMAT_DATE_DDMMYYYY,
75
+ 'R' => NumberFormat::FORMAT_DATE_DDMMYYYY,
76
+ ];
77
+ }
78
+
79
+ public function collection()
80
+ {
81
+ $query = Sensor::where('company_uuid', session('company'))->with(['telematic', 'device', 'sensorable']);
82
+
83
+ if ($this->selections) {
84
+ $query->whereIn('uuid', $this->selections);
85
+ }
86
+
87
+ return $query->get();
88
+ }
89
+
90
+ protected function yesNo($value): string
91
+ {
92
+ return $value ? 'Yes' : 'No';
93
+ }
94
+ }
@@ -20,16 +20,25 @@ class ServiceAreaExport implements FromCollection, WithHeadings, WithMapping, Wi
20
20
  $this->selections = $selections;
21
21
  }
22
22
 
23
- public function map($servicArea): array
23
+ public function map($serviceArea): array
24
24
  {
25
25
  return [
26
- $servicArea->public_id,
27
- $servicArea->name,
28
- $servicArea->zones instanceof Collection ? $servicArea->zones->map(function ($zone) {
26
+ $serviceArea->public_id,
27
+ $serviceArea->name,
28
+ $serviceArea->type,
29
+ $serviceArea->zones instanceof Collection ? $serviceArea->zones->map(function ($zone) {
29
30
  return $zone->name;
30
31
  })->join(', ') : null,
31
- $servicArea->status,
32
- $servicArea->created_at,
32
+ $serviceArea->country,
33
+ $serviceArea->color,
34
+ $serviceArea->stroke_color,
35
+ $this->yesNo($serviceArea->trigger_on_entry),
36
+ $this->yesNo($serviceArea->trigger_on_exit),
37
+ $serviceArea->dwell_threshold_minutes,
38
+ $serviceArea->speed_limit_kmh,
39
+ $serviceArea->status,
40
+ $serviceArea->created_at,
41
+ $serviceArea->updated_at,
33
42
  ];
34
43
  }
35
44
 
@@ -38,19 +47,34 @@ class ServiceAreaExport implements FromCollection, WithHeadings, WithMapping, Wi
38
47
  return [
39
48
  'ID',
40
49
  'Name',
50
+ 'Type',
41
51
  'Zones',
52
+ 'Country',
53
+ 'Color',
54
+ 'Stroke Color',
55
+ 'Trigger On Entry',
56
+ 'Trigger On Exit',
57
+ 'Dwell Threshold Minutes',
58
+ 'Speed Limit KMH',
42
59
  'Status',
43
60
  'Date Created',
61
+ 'Date Updated',
44
62
  ];
45
63
  }
46
64
 
47
65
  public function columnFormats(): array
48
66
  {
49
67
  return [
50
- 'E' => NumberFormat::FORMAT_DATE_DDMMYYYY,
68
+ 'M' => NumberFormat::FORMAT_DATE_DDMMYYYY,
69
+ 'N' => NumberFormat::FORMAT_DATE_DDMMYYYY,
51
70
  ];
52
71
  }
53
72
 
73
+ protected function yesNo($value): string
74
+ {
75
+ return $value ? 'Yes' : 'No';
76
+ }
77
+
54
78
  /**
55
79
  * @return Collection
56
80
  */
@@ -31,8 +31,25 @@ class ServiceRateExport implements FromCollection, WithHeadings, WithMapping, Wi
31
31
  $serviceRate->rate_calculation_method,
32
32
  $serviceRate->service_area_name,
33
33
  $serviceRate->zone_name,
34
+ $serviceRate->per_meter_flat_rate_fee,
35
+ $serviceRate->per_meter_unit,
36
+ $serviceRate->max_distance,
37
+ $serviceRate->max_distance_unit,
38
+ $this->yesNo($serviceRate->has_cod_fee),
39
+ $serviceRate->cod_calculation_method,
40
+ $serviceRate->cod_flat_fee,
41
+ $serviceRate->cod_percent,
42
+ $this->yesNo($serviceRate->has_peak_hours_fee),
43
+ $serviceRate->peak_hours_calculation_method,
44
+ $serviceRate->peak_hours_flat_fee,
45
+ $serviceRate->peak_hours_percent,
46
+ $serviceRate->peak_hours_start,
47
+ $serviceRate->peak_hours_end,
34
48
  $serviceRate->currency,
49
+ $serviceRate->duration_terms,
50
+ $serviceRate->estimated_days,
35
51
  $serviceRate->created_at,
52
+ $serviceRate->updated_at,
36
53
  ];
37
54
  }
38
55
 
@@ -46,18 +63,41 @@ class ServiceRateExport implements FromCollection, WithHeadings, WithMapping, Wi
46
63
  'Calculation Method',
47
64
  'Service Area',
48
65
  'Zone',
66
+ 'Per Meter Flat Rate Fee',
67
+ 'Per Meter Unit',
68
+ 'Max Distance',
69
+ 'Max Distance Unit',
70
+ 'Has COD Fee',
71
+ 'COD Calculation Method',
72
+ 'COD Flat Fee',
73
+ 'COD Percent',
74
+ 'Has Peak Hours Fee',
75
+ 'Peak Hours Calculation Method',
76
+ 'Peak Hours Flat Fee',
77
+ 'Peak Hours Percent',
78
+ 'Peak Hours Start',
79
+ 'Peak Hours End',
49
80
  'Currency',
81
+ 'Duration Terms',
82
+ 'Estimated Days',
50
83
  'Date Created',
84
+ 'Date Updated',
51
85
  ];
52
86
  }
53
87
 
54
88
  public function columnFormats(): array
55
89
  {
56
90
  return [
57
- 'I' => NumberFormat::FORMAT_DATE_DDMMYYYY,
91
+ 'Y' => NumberFormat::FORMAT_DATE_DDMMYYYY,
92
+ 'Z' => NumberFormat::FORMAT_DATE_DDMMYYYY,
58
93
  ];
59
94
  }
60
95
 
96
+ protected function yesNo($value): string
97
+ {
98
+ return $value ? 'Yes' : 'No';
99
+ }
100
+
61
101
  /**
62
102
  * @return \Illuminate\Support\Collection
63
103
  */
@@ -0,0 +1,90 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Exports;
4
+
5
+ use Fleetbase\FleetOps\Models\Telematic;
6
+ use Maatwebsite\Excel\Concerns\FromCollection;
7
+ use Maatwebsite\Excel\Concerns\ShouldAutoSize;
8
+ use Maatwebsite\Excel\Concerns\WithColumnFormatting;
9
+ use Maatwebsite\Excel\Concerns\WithHeadings;
10
+ use Maatwebsite\Excel\Concerns\WithMapping;
11
+ use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
12
+
13
+ class TelematicExport implements FromCollection, WithHeadings, WithMapping, WithColumnFormatting, ShouldAutoSize
14
+ {
15
+ protected array $selections = [];
16
+
17
+ public function __construct(array $selections = [])
18
+ {
19
+ $this->selections = $selections;
20
+ }
21
+
22
+ public function map($telematic): array
23
+ {
24
+ return [
25
+ $telematic->public_id,
26
+ $telematic->name,
27
+ $telematic->provider,
28
+ $telematic->status,
29
+ $telematic->model,
30
+ $telematic->serial_number,
31
+ $telematic->imei,
32
+ $telematic->iccid,
33
+ $telematic->imsi,
34
+ $telematic->msisdn,
35
+ $telematic->last_seen_at,
36
+ $telematic->warranty_name,
37
+ $this->yesNo($telematic->is_online),
38
+ $telematic->signal_strength,
39
+ $telematic->created_at,
40
+ $telematic->updated_at,
41
+ ];
42
+ }
43
+
44
+ public function headings(): array
45
+ {
46
+ return [
47
+ 'ID',
48
+ 'Name',
49
+ 'Provider',
50
+ 'Status',
51
+ 'Model',
52
+ 'Serial Number',
53
+ 'IMEI',
54
+ 'ICCID',
55
+ 'IMSI',
56
+ 'MSISDN',
57
+ 'Last Seen',
58
+ 'Warranty',
59
+ 'Online',
60
+ 'Signal Strength',
61
+ 'Date Created',
62
+ 'Date Updated',
63
+ ];
64
+ }
65
+
66
+ public function columnFormats(): array
67
+ {
68
+ return [
69
+ 'K' => NumberFormat::FORMAT_DATE_DDMMYYYY,
70
+ 'O' => NumberFormat::FORMAT_DATE_DDMMYYYY,
71
+ 'P' => NumberFormat::FORMAT_DATE_DDMMYYYY,
72
+ ];
73
+ }
74
+
75
+ public function collection()
76
+ {
77
+ $query = Telematic::where('company_uuid', session('company'))->with(['warranty']);
78
+
79
+ if ($this->selections) {
80
+ $query->whereIn('uuid', $this->selections);
81
+ }
82
+
83
+ return $query->get();
84
+ }
85
+
86
+ protected function yesNo($value): string
87
+ {
88
+ return $value ? 'Yes' : 'No';
89
+ }
90
+ }
@@ -2,7 +2,9 @@
2
2
 
3
3
  namespace Fleetbase\FleetOps\Exports;
4
4
 
5
+ use Fleetbase\FleetOps\Models\Order;
5
6
  use Fleetbase\FleetOps\Models\Vehicle;
7
+ use Fleetbase\FleetOps\Support\Utils;
6
8
  use Maatwebsite\Excel\Concerns\FromCollection;
7
9
  use Maatwebsite\Excel\Concerns\ShouldAutoSize;
8
10
  use Maatwebsite\Excel\Concerns\WithColumnFormatting;
@@ -14,6 +16,14 @@ class VehicleExport implements FromCollection, WithHeadings, WithMapping, WithCo
14
16
  {
15
17
  protected array $selections = [];
16
18
 
19
+ protected array $dateHeadings = [
20
+ 'Purchased At',
21
+ 'Lease Expires At',
22
+ 'Loan First Payment',
23
+ 'Created At',
24
+ 'Updated At',
25
+ ];
26
+
17
27
  public function __construct(array $selections = [])
18
28
  {
19
29
  $this->selections = $selections;
@@ -21,15 +31,103 @@ class VehicleExport implements FromCollection, WithHeadings, WithMapping, WithCo
21
31
 
22
32
  public function map($vehicle): array
23
33
  {
34
+ $currency = $vehicle->currency ?: 'USD';
35
+
24
36
  return [
25
37
  $vehicle->public_id,
26
38
  $vehicle->internal_id,
27
39
  $vehicle->display_name,
28
- $vehicle->driver_name,
40
+ $vehicle->description,
41
+ $vehicle->plate_number,
42
+ $vehicle->vin,
29
43
  $vehicle->make,
30
44
  $vehicle->model,
31
45
  $vehicle->year,
46
+ $vehicle->trim,
47
+ $vehicle->color,
48
+ $vehicle->serial_number,
49
+ $vehicle->fuel_card_number,
50
+ $vehicle->class,
51
+ $vehicle->type,
52
+ $vehicle->driver_name,
53
+ $vehicle->vendor_name,
54
+ $vehicle->status,
55
+ $this->yesNo($vehicle->online),
56
+ $vehicle->call_sign,
57
+ $this->locationPart($vehicle->location, 'lat'),
58
+ $this->locationPart($vehicle->location, 'lng'),
59
+ $vehicle->heading,
60
+ $vehicle->altitude,
61
+ $vehicle->speed,
62
+ $vehicle->measurement_system,
63
+ $vehicle->fuel_volume_unit,
64
+ $vehicle->odometer,
65
+ $vehicle->odometer_unit,
66
+ $vehicle->odometer_at_purchase,
67
+ $vehicle->body_type,
68
+ $vehicle->body_sub_type,
69
+ $vehicle->usage_type,
70
+ $vehicle->ownership_type,
71
+ $vehicle->fuel_type,
72
+ $vehicle->transmission,
73
+ $vehicle->engine_number,
74
+ $vehicle->engine_make,
75
+ $vehicle->engine_model,
76
+ $vehicle->engine_family,
77
+ $vehicle->engine_configuration,
78
+ $vehicle->cylinder_arrangement,
79
+ $vehicle->number_of_cylinders,
80
+ $vehicle->engine_size,
81
+ $vehicle->engine_displacement,
82
+ $vehicle->horsepower,
83
+ $vehicle->horsepower_rpm,
84
+ $vehicle->torque,
85
+ $vehicle->torque_rpm,
86
+ $vehicle->fuel_capacity,
87
+ $vehicle->payload_capacity,
88
+ $vehicle->towing_capacity,
89
+ $vehicle->seating_capacity,
90
+ $vehicle->weight,
91
+ $vehicle->length,
92
+ $vehicle->width,
93
+ $vehicle->height,
94
+ $vehicle->cargo_volume,
95
+ $vehicle->payload_capacity_volume,
96
+ $vehicle->payload_capacity_pallets,
97
+ $vehicle->payload_capacity_parcels,
98
+ $vehicle->passenger_volume,
99
+ $vehicle->interior_volume,
100
+ $vehicle->ground_clearance,
101
+ $vehicle->bed_length,
102
+ $vehicle->emission_standard,
103
+ $this->yesNo($vehicle->dpf_equipped),
104
+ $this->yesNo($vehicle->scr_equipped),
105
+ $vehicle->gvwr,
106
+ $vehicle->gcwr,
107
+ $vehicle->currency,
108
+ $this->money($vehicle->acquisition_cost, $currency),
109
+ $this->money($vehicle->current_value, $currency),
110
+ $this->money($vehicle->insurance_value, $currency),
111
+ $vehicle->depreciation_rate,
112
+ $vehicle->estimated_service_life_distance,
113
+ $vehicle->estimated_service_life_distance_unit,
114
+ $vehicle->estimated_service_life_months,
115
+ $vehicle->purchased_at,
116
+ $vehicle->lease_expires_at,
117
+ $vehicle->financing_status,
118
+ $this->money($vehicle->loan_amount, $currency),
119
+ $vehicle->loan_number_of_payments,
120
+ $vehicle->loan_first_payment,
121
+ $this->joinSkills($vehicle->skills),
122
+ $vehicle->time_window_start,
123
+ $vehicle->time_window_end,
124
+ $vehicle->max_tasks,
125
+ $this->yesNo($vehicle->return_to_depot),
126
+ $this->assignedOrdersCount($vehicle),
127
+ $this->currentOrderReference($vehicle),
128
+ $vehicle->notes,
32
129
  $vehicle->created_at,
130
+ $vehicle->updated_at,
33
131
  ];
34
132
  }
35
133
 
@@ -39,19 +137,111 @@ class VehicleExport implements FromCollection, WithHeadings, WithMapping, WithCo
39
137
  'ID',
40
138
  'Internal ID',
41
139
  'Name',
42
- 'Driver Assigned',
140
+ 'Description',
141
+ 'Plate Number',
142
+ 'VIN',
43
143
  'Make',
44
144
  'Model',
45
145
  'Year',
46
- 'Date Created',
146
+ 'Trim',
147
+ 'Color',
148
+ 'Serial Number',
149
+ 'Fuel Card Number',
150
+ 'Class',
151
+ 'Type',
152
+ 'Driver',
153
+ 'Vendor',
154
+ 'Status',
155
+ 'Online',
156
+ 'Call Sign',
157
+ 'Latitude',
158
+ 'Longitude',
159
+ 'Heading',
160
+ 'Altitude',
161
+ 'Speed',
162
+ 'Measurement System',
163
+ 'Fuel Volume Unit',
164
+ 'Odometer',
165
+ 'Odometer Unit',
166
+ 'Odometer At Purchase',
167
+ 'Body Type',
168
+ 'Body Sub Type',
169
+ 'Usage Type',
170
+ 'Ownership Type',
171
+ 'Fuel Type',
172
+ 'Transmission',
173
+ 'Engine Number',
174
+ 'Engine Make',
175
+ 'Engine Model',
176
+ 'Engine Family',
177
+ 'Engine Configuration',
178
+ 'Cylinder Arrangement',
179
+ 'Number Of Cylinders',
180
+ 'Engine Size (L)',
181
+ 'Engine Displacement (cc)',
182
+ 'Horsepower (hp)',
183
+ 'Horsepower RPM',
184
+ 'Torque (Nm)',
185
+ 'Torque RPM',
186
+ 'Fuel Capacity (L)',
187
+ 'Payload Capacity (kg)',
188
+ 'Towing Capacity (kg)',
189
+ 'Seating Capacity',
190
+ 'Weight (kg)',
191
+ 'Length (cm)',
192
+ 'Width (cm)',
193
+ 'Height (cm)',
194
+ 'Cargo Volume (L)',
195
+ 'Payload Volume (m3)',
196
+ 'Payload Pallets',
197
+ 'Payload Parcels',
198
+ 'Passenger Volume (L)',
199
+ 'Interior Volume (L)',
200
+ 'Ground Clearance (cm)',
201
+ 'Bed Length (cm)',
202
+ 'Emission Standard',
203
+ 'DPF Equipped',
204
+ 'SCR Equipped',
205
+ 'GVWR (kg)',
206
+ 'GCWR (kg)',
207
+ 'Currency',
208
+ 'Acquisition Cost',
209
+ 'Current Value',
210
+ 'Insurance Value',
211
+ 'Depreciation Rate',
212
+ 'Estimated Service Life Distance',
213
+ 'Estimated Service Life Distance Unit',
214
+ 'Estimated Service Life Months',
215
+ 'Purchased At',
216
+ 'Lease Expires At',
217
+ 'Financing Status',
218
+ 'Loan Amount',
219
+ 'Loan Number Of Payments',
220
+ 'Loan First Payment',
221
+ 'Vehicle Skills',
222
+ 'Time Window Start',
223
+ 'Time Window End',
224
+ 'Max Tasks',
225
+ 'Return To Depot',
226
+ 'Assigned Order Count',
227
+ 'Current Order Reference',
228
+ 'Notes',
229
+ 'Created At',
230
+ 'Updated At',
47
231
  ];
48
232
  }
49
233
 
50
234
  public function columnFormats(): array
51
235
  {
52
- return [
53
- 'H' => NumberFormat::FORMAT_DATE_DDMMYYYY,
54
- ];
236
+ return collect($this->headings())
237
+ ->mapWithKeys(function ($heading, $index) {
238
+ if (!in_array($heading, $this->dateHeadings, true)) {
239
+ return [];
240
+ }
241
+
242
+ return [$this->columnLetter($index + 1) => NumberFormat::FORMAT_DATE_DDMMYYYY];
243
+ })
244
+ ->all();
55
245
  }
56
246
 
57
247
  /**
@@ -59,10 +249,86 @@ class VehicleExport implements FromCollection, WithHeadings, WithMapping, WithCo
59
249
  */
60
250
  public function collection()
61
251
  {
252
+ $query = Vehicle::where('company_uuid', session('company'))->with(['driver.currentOrder', 'vendor']);
253
+
62
254
  if ($this->selections) {
63
- return Vehicle::where('company_uuid', session('company'))->whereIn('uuid', $this->selections)->with(['driver'])->get();
255
+ $query->whereIn('uuid', $this->selections);
256
+ }
257
+
258
+ return $query->get();
259
+ }
260
+
261
+ protected function yesNo($value): ?string
262
+ {
263
+ if ($value === null) {
264
+ return null;
265
+ }
266
+
267
+ return filter_var($value, FILTER_VALIDATE_BOOLEAN) ? 'Yes' : 'No';
268
+ }
269
+
270
+ protected function joinSkills($skills): ?string
271
+ {
272
+ if (empty($skills)) {
273
+ return null;
274
+ }
275
+
276
+ if (is_string($skills)) {
277
+ return $skills;
278
+ }
279
+
280
+ return collect($skills)->filter()->values()->join(', ');
281
+ }
282
+
283
+ protected function locationPart($location, string $part)
284
+ {
285
+ $location = Utils::castPoint($location);
286
+
287
+ if (!$location) {
288
+ return null;
289
+ }
290
+
291
+ if ($part === 'lat') {
292
+ return method_exists($location, 'getLat') ? $location->getLat() : data_get($location, 'latitude', data_get($location, 'lat'));
293
+ }
294
+
295
+ return method_exists($location, 'getLng') ? $location->getLng() : data_get($location, 'longitude', data_get($location, 'lng'));
296
+ }
297
+
298
+ protected function money($amount, ?string $currency = 'USD'): ?string
299
+ {
300
+ if ($amount === null || $amount === '') {
301
+ return null;
302
+ }
303
+
304
+ return Utils::moneyFormat($amount, $currency ?: 'USD');
305
+ }
306
+
307
+ protected function assignedOrdersCount(Vehicle $vehicle): int
308
+ {
309
+ return Order::where('vehicle_assigned_uuid', $vehicle->uuid)->count();
310
+ }
311
+
312
+ protected function currentOrderReference(Vehicle $vehicle): ?string
313
+ {
314
+ $order = data_get($vehicle, 'driver.currentOrder') ?? Order::where('vehicle_assigned_uuid', $vehicle->uuid)
315
+ ->whereNotIn('status', ['completed', 'canceled', 'cancelled'])
316
+ ->latest()
317
+ ->first();
318
+
319
+ return data_get($order, 'tracking') ?? data_get($order, 'public_id');
320
+ }
321
+
322
+ protected function columnLetter(int $index): string
323
+ {
324
+ $letter = '';
325
+
326
+ while ($index > 0) {
327
+ $index--;
328
+ $letter = chr(65 + ($index % 26)) . $letter;
329
+ $index = intdiv($index, 26);
64
330
  }
65
331
 
66
- return Vehicle::where('company_uuid', session('company'))->with(['driver'])->get();
332
+ return $letter;
67
333
  }
68
334
  }
@@ -25,10 +25,16 @@ class VendorExport implements FromCollection, WithHeadings, WithMapping, WithCol
25
25
  $vendor->public_id,
26
26
  $vendor->internal_id,
27
27
  $vendor->name,
28
+ $vendor->business_id,
28
29
  $vendor->address,
29
30
  $vendor->email,
31
+ $vendor->website_url,
30
32
  $vendor->phone,
33
+ $vendor->type,
34
+ $vendor->country,
35
+ $vendor->status,
31
36
  $vendor->created_at,
37
+ $vendor->updated_at,
32
38
  ];
33
39
  }
34
40
 
@@ -38,18 +44,25 @@ class VendorExport implements FromCollection, WithHeadings, WithMapping, WithCol
38
44
  'ID',
39
45
  'Internal ID',
40
46
  'Name',
47
+ 'Business ID',
41
48
  'Address',
42
49
  'Email',
50
+ 'Website URL',
43
51
  'Phone',
52
+ 'Type',
53
+ 'Country',
54
+ 'Status',
44
55
  'Date Created',
56
+ 'Date Updated',
45
57
  ];
46
58
  }
47
59
 
48
60
  public function columnFormats(): array
49
61
  {
50
62
  return [
51
- 'F' => '+#',
52
- 'G' => NumberFormat::FORMAT_DATE_DDMMYYYY,
63
+ 'H' => '+#',
64
+ 'L' => NumberFormat::FORMAT_DATE_DDMMYYYY,
65
+ 'M' => NumberFormat::FORMAT_DATE_DDMMYYYY,
53
66
  ];
54
67
  }
55
68