@fleetbase/fleetops-engine 0.6.55 → 0.6.57

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 (161) hide show
  1. package/addon/components/admin/map-settings.hbs +1 -1
  2. package/addon/components/ai/create-order-preview.hbs +297 -0
  3. package/addon/components/ai/create-order-preview.js +362 -0
  4. package/addon/components/ai/route-preview-map.hbs +79 -0
  5. package/addon/components/ai/route-preview-map.js +527 -0
  6. package/addon/components/device/details.js +1 -1
  7. package/addon/components/device-event/details.hbs +192 -0
  8. package/addon/components/device-event/details.js +151 -0
  9. package/addon/components/driver/schedule.js +1 -1
  10. package/addon/components/fleet/details.hbs +21 -8
  11. package/addon/components/fleet/details.js +55 -1
  12. package/addon/components/fleet/hierarchy-tree.hbs +137 -0
  13. package/addon/components/fleet/hierarchy-tree.js +528 -0
  14. package/addon/components/layout/fleet-ops-sidebar.js +15 -9
  15. package/addon/components/map/drawer/device-event-listing.js +1 -0
  16. package/addon/components/map/drawer/driver-listing.js +1 -0
  17. package/addon/components/map/drawer/place-listing.js +1 -0
  18. package/addon/components/map/drawer/vehicle-listing.js +1 -0
  19. package/addon/components/order/details.hbs +34 -1
  20. package/addon/components/order/form/details.hbs +4 -0
  21. package/addon/components/order/form.hbs +9 -1
  22. package/addon/components/telematic/details.hbs +1 -1
  23. package/addon/components/telematic/form.hbs +2 -2
  24. package/addon/components/telematic/settings.hbs +1 -1
  25. package/addon/components/vehicle/card.hbs +14 -2
  26. package/addon/components/vehicle/form.hbs +13 -1
  27. package/addon/controllers/connectivity/devices/index/details/events.js +1 -1
  28. package/addon/controllers/connectivity/devices/index/details/vehicle.js +2 -2
  29. package/addon/controllers/connectivity/events/details.js +68 -1
  30. package/addon/controllers/connectivity/sensors/index.js +4 -0
  31. package/addon/controllers/connectivity/telematics/details/events.js +1 -1
  32. package/addon/controllers/connectivity/telematics/details/sensors.js +4 -0
  33. package/addon/controllers/settings/map.js +19 -0
  34. package/addon/extension.js +14 -0
  35. package/addon/instance-initializers/register-vroom-allocation.js +1 -1
  36. package/addon/routes/connectivity/events/details.js +26 -1
  37. package/addon/routes/management/fleets/index/details.js +1 -1
  38. package/addon/routes/management/vehicles/index/details.js +3 -1
  39. package/addon/services/map-adapter/google.js +66 -1
  40. package/addon/services/map-adapter/leaflet.js +1 -1
  41. package/addon/services/map-adapter-interface.js +1 -1
  42. package/addon/services/map-manager.js +16 -1
  43. package/addon/services/map-settings.js +15 -0
  44. package/addon/styles/fleetops-engine.css +487 -1
  45. package/addon/templates/connectivity/devices/index/details/vehicle.hbs +2 -1
  46. package/addon/templates/connectivity/events/details.hbs +40 -1
  47. package/addon/templates/settings/map.hbs +38 -9
  48. package/addon/utils/leaflet-plugin-loader.js +5 -5
  49. package/addon/utils/map-drawer-dropdown-position.js +11 -13
  50. package/addon/utils/route-colors.js +1 -1
  51. package/app/components/ai/create-order-preview.js +1 -0
  52. package/app/components/ai/route-preview-map.js +1 -0
  53. package/app/components/device-event/details.hbs +192 -0
  54. package/app/components/device-event/details.js +1 -0
  55. package/app/components/fleet/hierarchy-tree.js +1 -0
  56. package/app/services/route-engine.js +1 -0
  57. package/composer.json +1 -1
  58. package/extension.json +1 -1
  59. package/package.json +6 -4
  60. package/scripts/normalize-rgba-alpha.js +90 -0
  61. package/server/migrations/2026_06_23_000001_delete_bad_afaqy_telematics_sensors.php +34 -0
  62. package/server/src/Exports/ContactExport.php +12 -5
  63. package/server/src/Exports/DeviceExport.php +92 -0
  64. package/server/src/Exports/DriverExport.php +28 -3
  65. package/server/src/Exports/EquipmentExport.php +94 -0
  66. package/server/src/Exports/FleetExport.php +22 -7
  67. package/server/src/Exports/FuelReportExport.php +16 -1
  68. package/server/src/Exports/IssueExport.php +25 -3
  69. package/server/src/Exports/MaintenanceExport.php +106 -0
  70. package/server/src/Exports/MaintenanceScheduleExport.php +99 -0
  71. package/server/src/Exports/OrderExport.php +24 -5
  72. package/server/src/Exports/PartExport.php +99 -0
  73. package/server/src/Exports/PlaceExport.php +33 -7
  74. package/server/src/Exports/SensorExport.php +94 -0
  75. package/server/src/Exports/ServiceAreaExport.php +31 -7
  76. package/server/src/Exports/ServiceRateExport.php +41 -1
  77. package/server/src/Exports/TelematicExport.php +90 -0
  78. package/server/src/Exports/VehicleExport.php +274 -8
  79. package/server/src/Exports/VendorExport.php +15 -2
  80. package/server/src/Exports/WorkOrderExport.php +92 -0
  81. package/server/src/Http/Controllers/Api/v1/Concerns/ResolvesFleetOpsApiResources.php +176 -0
  82. package/server/src/Http/Controllers/Api/v1/DeviceController.php +225 -0
  83. package/server/src/Http/Controllers/Api/v1/EquipmentController.php +114 -0
  84. package/server/src/Http/Controllers/Api/v1/FuelTransactionController.php +185 -0
  85. package/server/src/Http/Controllers/Api/v1/PartController.php +120 -0
  86. package/server/src/Http/Controllers/Api/v1/SensorController.php +132 -0
  87. package/server/src/Http/Controllers/Api/v1/WorkOrderController.php +161 -0
  88. package/server/src/Http/Controllers/Internal/v1/DeviceController.php +18 -0
  89. package/server/src/Http/Controllers/Internal/v1/EquipmentController.php +17 -0
  90. package/server/src/Http/Controllers/Internal/v1/MaintenanceController.php +17 -0
  91. package/server/src/Http/Controllers/Internal/v1/MaintenanceScheduleController.php +17 -0
  92. package/server/src/Http/Controllers/Internal/v1/PartController.php +17 -0
  93. package/server/src/Http/Controllers/Internal/v1/SensorController.php +18 -0
  94. package/server/src/Http/Controllers/Internal/v1/SettingController.php +29 -5
  95. package/server/src/Http/Controllers/Internal/v1/TelematicController.php +18 -0
  96. package/server/src/Http/Controllers/Internal/v1/WorkOrderController.php +17 -0
  97. package/server/src/Http/Filter/DeviceFilter.php +33 -10
  98. package/server/src/Http/Filter/EquipmentFilter.php +23 -0
  99. package/server/src/Http/Filter/FuelProviderTransactionFilter.php +57 -2
  100. package/server/src/Http/Filter/PartFilter.php +47 -0
  101. package/server/src/Http/Filter/SensorFilter.php +34 -6
  102. package/server/src/Http/Filter/WorkOrderFilter.php +23 -0
  103. package/server/src/Http/Requests/CreateDeviceRequest.php +51 -0
  104. package/server/src/Http/Requests/CreateEquipmentRequest.php +35 -0
  105. package/server/src/Http/Requests/CreateFuelTransactionRequest.php +50 -0
  106. package/server/src/Http/Requests/CreatePartRequest.php +40 -0
  107. package/server/src/Http/Requests/CreateSensorRequest.php +47 -0
  108. package/server/src/Http/Requests/CreateWorkOrderRequest.php +42 -0
  109. package/server/src/Http/Requests/UpdateDeviceRequest.php +7 -0
  110. package/server/src/Http/Requests/UpdateEquipmentRequest.php +7 -0
  111. package/server/src/Http/Requests/UpdateFuelTransactionRequest.php +7 -0
  112. package/server/src/Http/Requests/UpdatePartRequest.php +7 -0
  113. package/server/src/Http/Requests/UpdateSensorRequest.php +7 -0
  114. package/server/src/Http/Requests/UpdateWorkOrderRequest.php +7 -0
  115. package/server/src/Http/Resources/v1/Device.php +72 -0
  116. package/server/src/Http/Resources/v1/Equipment.php +57 -0
  117. package/server/src/Http/Resources/v1/Fleet.php +8 -2
  118. package/server/src/Http/Resources/v1/FuelTransaction.php +69 -0
  119. package/server/src/Http/Resources/v1/Part.php +64 -0
  120. package/server/src/Http/Resources/v1/Sensor.php +68 -0
  121. package/server/src/Jobs/SyncTelematicDevicesJob.php +194 -38
  122. package/server/src/Models/Driver.php +6 -0
  123. package/server/src/Models/Order.php +20 -7
  124. package/server/src/Models/Place.php +11 -3
  125. package/server/src/Observers/PurchaseRateObserver.php +2 -1
  126. package/server/src/Providers/FleetOpsServiceProvider.php +26 -0
  127. package/server/src/Support/Ai/Capabilities/AbstractFleetOpsAICapability.php +88 -0
  128. package/server/src/Support/Ai/Capabilities/AssetStatusCapability.php +108 -0
  129. package/server/src/Support/Ai/Capabilities/ConsoleNavigationCapability.php +55 -0
  130. package/server/src/Support/Ai/Capabilities/CreateOrderPreviewCapability.php +508 -0
  131. package/server/src/Support/Ai/Capabilities/DocsHelpCapability.php +49 -0
  132. package/server/src/Support/Ai/Capabilities/ImportOrdersPreviewCapability.php +66 -0
  133. package/server/src/Support/Ai/Capabilities/OperationalQueryCapability.php +319 -0
  134. package/server/src/Support/Ai/Capabilities/OptimizeOrderRouteCapability.php +240 -0
  135. package/server/src/Support/Ai/Capabilities/OrderInsightsCapability.php +95 -0
  136. package/server/src/Support/Ai/Capabilities/SearchResourcesCapability.php +195 -0
  137. package/server/src/Support/Ai/FleetOpsAiQueryResources.php +150 -0
  138. package/server/src/Support/Analytics/RevenueTrend.php +3 -8
  139. package/server/src/Support/Metrics/ActiveRevenueQuery.php +121 -0
  140. package/server/src/Support/Metrics/AvgOrderValueMetric.php +1 -7
  141. package/server/src/Support/Metrics/EarningsMetric.php +1 -10
  142. package/server/src/Support/Telematics/Providers/AfaqyProvider.php +104 -5
  143. package/server/src/Support/Telematics/Providers/SafeeProvider.php +550 -54
  144. package/server/src/Support/Telematics/TelematicService.php +28 -9
  145. package/server/src/Support/Utils.php +52 -0
  146. package/server/src/routes.php +67 -14
  147. package/server/tests/AiCreateOrderPreviewCapabilityTest.php +131 -0
  148. package/server/tests/AiOperationalQueryCapabilityTest.php +75 -0
  149. package/server/tests/ExportCoverageTest.php +79 -0
  150. package/server/tests/FleetHierarchyResourceTest.php +12 -0
  151. package/server/tests/MetricsRegistryTest.php +45 -5
  152. package/server/tests/OrderPayloadPlaceResolutionTest.php +53 -0
  153. package/server/tests/PointResolutionTest.php +63 -0
  154. package/server/tests/PublicFleetOpsRestEndpointsTest.php +191 -0
  155. package/server/tests/TelematicsHardeningTest.php +636 -1
  156. package/addon/components/table/cell/dropdown/action-item.hbs +0 -31
  157. package/addon/components/table/cell/dropdown/action-item.js +0 -62
  158. package/addon/components/table/cell/dropdown.hbs +0 -28
  159. package/addon/components/table/cell/dropdown.js +0 -91
  160. package/app/components/table/cell/dropdown/action-item.js +0 -1
  161. package/app/components/table/cell/dropdown.js +0 -1
@@ -0,0 +1,99 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Exports;
4
+
5
+ use Fleetbase\FleetOps\Models\Part;
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 PartExport 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($part): array
23
+ {
24
+ return [
25
+ $part->public_id,
26
+ $part->name,
27
+ $part->sku,
28
+ $part->type,
29
+ $part->status,
30
+ $part->quantity_on_hand,
31
+ $part->unit_cost,
32
+ $part->msrp,
33
+ $part->currency,
34
+ $part->manufacturer,
35
+ $part->model,
36
+ $part->serial_number,
37
+ $part->barcode,
38
+ $part->vendor_name,
39
+ $part->asset_name,
40
+ $part->warranty_name,
41
+ $part->total_value,
42
+ $this->yesNo($part->is_in_stock),
43
+ $this->yesNo($part->is_low_stock),
44
+ $part->created_at,
45
+ $part->updated_at,
46
+ ];
47
+ }
48
+
49
+ public function headings(): array
50
+ {
51
+ return [
52
+ 'ID',
53
+ 'Name',
54
+ 'Part Number',
55
+ 'Type',
56
+ 'Status',
57
+ 'Quantity On Hand',
58
+ 'Unit Cost',
59
+ 'MSRP',
60
+ 'Currency',
61
+ 'Manufacturer',
62
+ 'Model',
63
+ 'Serial Number',
64
+ 'Barcode',
65
+ 'Vendor',
66
+ 'Asset',
67
+ 'Warranty',
68
+ 'Total Value',
69
+ 'In Stock',
70
+ 'Low Stock',
71
+ 'Date Created',
72
+ 'Date Updated',
73
+ ];
74
+ }
75
+
76
+ public function columnFormats(): array
77
+ {
78
+ return [
79
+ 'T' => NumberFormat::FORMAT_DATE_DDMMYYYY,
80
+ 'U' => NumberFormat::FORMAT_DATE_DDMMYYYY,
81
+ ];
82
+ }
83
+
84
+ public function collection()
85
+ {
86
+ $query = Part::where('company_uuid', session('company'))->with(['vendor', 'warranty', 'asset']);
87
+
88
+ if ($this->selections) {
89
+ $query->whereIn('uuid', $this->selections);
90
+ }
91
+
92
+ return $query->get();
93
+ }
94
+
95
+ protected function yesNo($value): string
96
+ {
97
+ return $value ? 'Yes' : 'No';
98
+ }
99
+ }
@@ -25,11 +25,21 @@ class PlaceExport implements FromCollection, WithHeadings, WithMapping, WithColu
25
25
  $place->public_id,
26
26
  $place->name,
27
27
  $place->phone,
28
- strtoupper($place->address),
29
- strtoupper($place->city),
28
+ $this->upper($place->address),
29
+ $place->street1,
30
+ $place->street2,
31
+ $this->upper($place->city),
32
+ $this->upper($place->province),
30
33
  $place->postal_code,
31
- strtoupper($place->country_name),
34
+ $place->neighborhood,
35
+ $place->district,
36
+ $place->building,
37
+ $place->security_access_code,
38
+ $this->upper($place->country_name),
39
+ data_get($place, 'owner.name') ?? data_get($place, 'owner.public_id'),
40
+ $place->type,
32
41
  $place->created_at,
42
+ $place->updated_at,
33
43
  ];
34
44
  }
35
45
 
@@ -40,10 +50,20 @@ class PlaceExport implements FromCollection, WithHeadings, WithMapping, WithColu
40
50
  'Name',
41
51
  'Phone',
42
52
  'Address',
53
+ 'Street 1',
54
+ 'Street 2',
43
55
  'City',
56
+ 'Province',
44
57
  'Postal Code',
58
+ 'Neighborhood',
59
+ 'District',
60
+ 'Building',
61
+ 'Security Access Code',
45
62
  'Country',
63
+ 'Owner',
64
+ 'Type',
46
65
  'Date Created',
66
+ 'Date Updated',
47
67
  ];
48
68
  }
49
69
 
@@ -51,20 +71,26 @@ class PlaceExport implements FromCollection, WithHeadings, WithMapping, WithColu
51
71
  {
52
72
  return [
53
73
  'C' => '+#',
54
- 'F' => NumberFormat::FORMAT_GENERAL,
55
- 'H' => NumberFormat::FORMAT_DATE_DDMMYYYY,
74
+ 'I' => NumberFormat::FORMAT_GENERAL,
75
+ 'P' => NumberFormat::FORMAT_DATE_DDMMYYYY,
76
+ 'Q' => NumberFormat::FORMAT_DATE_DDMMYYYY,
56
77
  ];
57
78
  }
58
79
 
80
+ protected function upper($value): ?string
81
+ {
82
+ return $value ? strtoupper($value) : null;
83
+ }
84
+
59
85
  /**
60
86
  * @return \Illuminate\Support\Collection
61
87
  */
62
88
  public function collection()
63
89
  {
64
90
  if ($this->selections) {
65
- return Place::where('company_uuid', session('company'))->whereIn('uuid', $this->selections)->get();
91
+ return Place::where('company_uuid', session('company'))->whereIn('uuid', $this->selections)->with(['owner'])->get();
66
92
  }
67
93
 
68
- return Place::where('company_uuid', session('company'))->get();
94
+ return Place::where('company_uuid', session('company'))->with(['owner'])->get();
69
95
  }
70
96
  }
@@ -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
+ }