@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.
- package/addon/components/admin/map-settings.hbs +1 -1
- package/addon/components/admin/routing-settings.hbs +2 -1
- package/addon/components/cell/attached-vehicle.hbs +10 -0
- package/addon/components/cell/attached-vehicle.js +58 -0
- package/addon/components/cell/device-identity.hbs +24 -0
- package/addon/components/cell/device-identity.js +129 -0
- package/addon/components/cell/driver-identity.hbs +33 -0
- package/addon/components/cell/driver-identity.js +143 -0
- package/addon/components/cell/equipment-identity.hbs +5 -0
- package/addon/components/cell/equipment-identity.js +48 -0
- package/addon/components/cell/part-identity.hbs +5 -0
- package/addon/components/cell/part-identity.js +63 -0
- package/addon/components/cell/telematic-device.hbs +38 -0
- package/addon/components/cell/telematic-device.js +44 -0
- package/addon/components/cell/telematic-provider.hbs +33 -16
- package/addon/components/cell/telematic-provider.js +50 -8
- package/addon/components/cell/vehicle-identity.hbs +33 -0
- package/addon/components/cell/vehicle-identity.js +138 -0
- package/addon/components/device/details.js +1 -1
- package/addon/components/device/form.hbs +2 -2
- package/addon/components/device/form.js +7 -0
- package/addon/components/device/panel-header.hbs +45 -20
- package/addon/components/device/panel-header.js +49 -1
- package/addon/components/device/panel-tabs/events.hbs +30 -0
- package/addon/components/device/panel-tabs/events.js +128 -0
- package/addon/components/device/panel-tabs/sensors.hbs +30 -0
- package/addon/components/device/panel-tabs/sensors.js +93 -0
- package/addon/components/device/panel-tabs/vehicle.hbs +68 -0
- package/addon/components/device/panel-tabs/vehicle.js +90 -0
- package/addon/components/device-event/details.hbs +192 -0
- package/addon/components/device-event/details.js +151 -0
- package/addon/components/driver/schedule.js +1 -1
- package/addon/components/equipment/form.js +8 -1
- package/addon/components/layout/fleet-ops-sidebar.hbs +1 -1
- package/addon/components/layout/fleet-ops-sidebar.js +20 -6
- package/addon/components/map/drawer/device-event-listing.js +2 -0
- package/addon/components/map/drawer/driver-listing.js +2 -0
- package/addon/components/map/drawer/place-listing.js +2 -0
- package/addon/components/map/drawer/position-listing.hbs +11 -6
- package/addon/components/map/drawer/position-listing.js +17 -4
- package/addon/components/map/drawer/vehicle-listing.js +2 -0
- package/addon/components/sensor/panel-header.hbs +47 -15
- package/addon/components/sensor/panel-header.js +59 -1
- package/addon/components/table/cell/dropdown/action-item.hbs +31 -0
- package/addon/components/table/cell/dropdown/action-item.js +62 -0
- package/addon/components/table/cell/dropdown.hbs +28 -0
- package/addon/components/table/cell/dropdown.js +91 -0
- package/addon/components/telematic/details.hbs +1 -1
- package/addon/components/telematic/form.hbs +2 -2
- package/addon/components/telematic/settings.hbs +1 -1
- package/addon/components/vendor/panel-header.hbs +82 -0
- package/addon/components/vendor/panel-header.js +48 -0
- package/addon/controllers/connectivity/devices/index/details/events.js +1 -1
- package/addon/controllers/connectivity/devices/index/details/vehicle.js +50 -2
- package/addon/controllers/connectivity/devices/index.js +144 -129
- package/addon/controllers/connectivity/events/details.js +70 -0
- package/addon/controllers/connectivity/events/index.js +187 -11
- package/addon/controllers/connectivity/sensors/index.js +160 -14
- package/addon/controllers/connectivity/telematics/details/devices.js +126 -134
- package/addon/controllers/connectivity/telematics/details/events.js +1 -1
- package/addon/controllers/connectivity/telematics/details/sensors.js +4 -0
- package/addon/controllers/maintenance/equipment/index.js +1 -2
- package/addon/controllers/maintenance/parts/index.js +1 -2
- package/addon/controllers/management/drivers/index.js +82 -42
- package/addon/controllers/management/fuel-reports/index.js +63 -4
- package/addon/controllers/management/issues/index.js +63 -4
- package/addon/controllers/management/vehicles/index.js +33 -6
- package/addon/controllers/settings/map.js +15 -0
- package/addon/instance-initializers/register-vroom-allocation.js +1 -1
- package/addon/routes/connectivity/devices/index/details/vehicle.js +24 -2
- package/addon/routes/connectivity/devices/index.js +7 -0
- package/addon/routes/connectivity/events/details.js +28 -0
- package/addon/routes/connectivity/events/index.js +6 -2
- package/addon/routes/connectivity/sensors/index.js +7 -2
- package/addon/routes/connectivity/telematics/details/devices.js +2 -0
- package/addon/routes/management/vehicles/index/details.js +3 -1
- package/addon/services/device-actions.js +30 -0
- package/addon/services/device-event-actions.js +1 -1
- package/addon/services/equipment-actions.js +1 -0
- package/addon/services/map-adapter/google.js +25 -0
- package/addon/services/map-adapter/leaflet.js +1 -1
- package/addon/services/map-adapter-interface.js +1 -1
- package/addon/services/map-manager.js +4 -1
- package/addon/services/map-settings.js +15 -0
- package/addon/services/sensor-actions.js +3 -0
- package/addon/services/service-rate-actions.js +39 -1
- package/addon/services/vehicle-actions.js +24 -12
- package/addon/services/vendor-actions.js +3 -0
- package/addon/styles/fleetops-engine.css +9 -1
- package/addon/templates/connectivity/devices/index/details/vehicle.hbs +66 -2
- package/addon/templates/connectivity/events/details.hbs +40 -0
- package/addon/templates/management/vendors/index/details.hbs +2 -2
- package/addon/templates/settings/map.hbs +38 -9
- package/addon/templates/settings/notifications.hbs +2 -1
- package/addon/templates/settings/routing.hbs +1 -0
- package/addon/utils/device-table-columns.js +288 -0
- package/addon/utils/identity-cell-resource.js +20 -0
- package/addon/utils/leaflet-plugin-loader.js +5 -5
- package/addon/utils/map-drawer-dropdown-position.js +47 -0
- package/addon/utils/route-colors.js +1 -1
- package/addon/utils/trackable-option.js +93 -0
- package/app/components/cell/attached-vehicle.js +1 -0
- package/app/components/cell/device-identity.js +1 -0
- package/app/components/cell/driver-identity.js +1 -0
- package/app/components/cell/equipment-identity.js +1 -0
- package/app/components/cell/part-identity.js +1 -0
- package/app/components/cell/telematic-device.js +1 -0
- package/app/components/cell/vehicle-identity.js +1 -0
- package/app/components/device/panel-tabs/events.hbs +30 -0
- package/app/components/device/panel-tabs/events.js +128 -0
- package/app/components/device/panel-tabs/sensors.hbs +30 -0
- package/app/components/device/panel-tabs/sensors.js +93 -0
- package/app/components/device/panel-tabs/vehicle.hbs +68 -0
- package/app/components/device/panel-tabs/vehicle.js +90 -0
- package/app/components/device-event/details.hbs +192 -0
- package/app/components/device-event/details.js +1 -0
- package/app/components/table/cell/dropdown/action-item.js +1 -0
- package/app/components/table/cell/dropdown.js +1 -0
- package/app/components/vendor/panel-header.js +1 -0
- package/app/controllers/connectivity/events/{index/details.js → details.js} +1 -1
- package/app/routes/connectivity/events/{index/details.js → details.js} +1 -1
- package/app/templates/connectivity/events/{index/details.js → details.js} +1 -1
- package/app/utils/map-drawer-dropdown-position.js +1 -0
- package/app/utils/trackable-option.js +1 -0
- package/composer.json +1 -1
- package/extension.json +1 -1
- package/package.json +4 -4
- package/server/migrations/2026_06_23_000001_delete_bad_afaqy_telematics_sensors.php +34 -0
- package/server/src/Console/Commands/SyncTelematics.php +4 -4
- package/server/src/Exports/ContactExport.php +12 -5
- package/server/src/Exports/DeviceExport.php +92 -0
- package/server/src/Exports/DriverExport.php +28 -3
- package/server/src/Exports/EquipmentExport.php +94 -0
- package/server/src/Exports/FleetExport.php +22 -7
- package/server/src/Exports/FuelReportExport.php +16 -1
- package/server/src/Exports/IssueExport.php +25 -3
- package/server/src/Exports/MaintenanceExport.php +106 -0
- package/server/src/Exports/MaintenanceScheduleExport.php +99 -0
- package/server/src/Exports/OrderExport.php +24 -5
- package/server/src/Exports/PartExport.php +99 -0
- package/server/src/Exports/PlaceExport.php +33 -7
- package/server/src/Exports/SensorExport.php +94 -0
- package/server/src/Exports/ServiceAreaExport.php +31 -7
- package/server/src/Exports/ServiceRateExport.php +41 -1
- package/server/src/Exports/TelematicExport.php +90 -0
- package/server/src/Exports/VehicleExport.php +274 -8
- package/server/src/Exports/VendorExport.php +15 -2
- package/server/src/Exports/WorkOrderExport.php +92 -0
- package/server/src/Http/Controllers/Api/v1/Concerns/ResolvesFleetOpsApiResources.php +176 -0
- package/server/src/Http/Controllers/Api/v1/DeviceController.php +225 -0
- package/server/src/Http/Controllers/Api/v1/EquipmentController.php +114 -0
- package/server/src/Http/Controllers/Api/v1/FuelTransactionController.php +185 -0
- package/server/src/Http/Controllers/Api/v1/PartController.php +120 -0
- package/server/src/Http/Controllers/Api/v1/SensorController.php +132 -0
- package/server/src/Http/Controllers/Api/v1/WorkOrderController.php +161 -0
- package/server/src/Http/Controllers/Internal/v1/DeviceController.php +36 -1
- package/server/src/Http/Controllers/Internal/v1/DeviceEventController.php +1 -1
- package/server/src/Http/Controllers/Internal/v1/EquipmentController.php +17 -0
- package/server/src/Http/Controllers/Internal/v1/LiveController.php +1 -1
- package/server/src/Http/Controllers/Internal/v1/MaintenanceController.php +17 -0
- package/server/src/Http/Controllers/Internal/v1/MaintenanceScheduleController.php +17 -0
- package/server/src/Http/Controllers/Internal/v1/PartController.php +17 -0
- package/server/src/Http/Controllers/Internal/v1/SensorController.php +18 -0
- package/server/src/Http/Controllers/Internal/v1/ServiceRateController.php +82 -13
- package/server/src/Http/Controllers/Internal/v1/SettingController.php +29 -5
- package/server/src/Http/Controllers/Internal/v1/TelematicController.php +18 -0
- package/server/src/Http/Controllers/Internal/v1/WorkOrderController.php +17 -0
- package/server/src/Http/Filter/DeviceEventFilter.php +21 -0
- package/server/src/Http/Filter/DeviceFilter.php +50 -4
- package/server/src/Http/Filter/EquipmentFilter.php +23 -0
- package/server/src/Http/Filter/FuelProviderTransactionFilter.php +57 -2
- package/server/src/Http/Filter/PartFilter.php +47 -0
- package/server/src/Http/Filter/SensorFilter.php +34 -6
- package/server/src/Http/Filter/WorkOrderFilter.php +23 -0
- package/server/src/Http/Requests/CreateDeviceRequest.php +51 -0
- package/server/src/Http/Requests/CreateEquipmentRequest.php +35 -0
- package/server/src/Http/Requests/CreateFuelTransactionRequest.php +50 -0
- package/server/src/Http/Requests/CreatePartRequest.php +40 -0
- package/server/src/Http/Requests/CreateSensorRequest.php +47 -0
- package/server/src/Http/Requests/CreateWorkOrderRequest.php +42 -0
- package/server/src/Http/Requests/UpdateDeviceRequest.php +7 -0
- package/server/src/Http/Requests/UpdateEquipmentRequest.php +7 -0
- package/server/src/Http/Requests/UpdateFuelTransactionRequest.php +7 -0
- package/server/src/Http/Requests/UpdatePartRequest.php +7 -0
- package/server/src/Http/Requests/UpdateSensorRequest.php +7 -0
- package/server/src/Http/Requests/UpdateWorkOrderRequest.php +7 -0
- package/server/src/Http/Resources/v1/Device.php +72 -0
- package/server/src/Http/Resources/v1/Equipment.php +57 -0
- package/server/src/Http/Resources/v1/FuelTransaction.php +69 -0
- package/server/src/Http/Resources/v1/Index/Vehicle.php +19 -0
- package/server/src/Http/Resources/v1/Part.php +64 -0
- package/server/src/Http/Resources/v1/Sensor.php +68 -0
- package/server/src/Jobs/SyncTelematicDevicesJob.php +194 -38
- package/server/src/Models/Device.php +2 -0
- package/server/src/Models/DeviceEvent.php +81 -0
- package/server/src/Models/Equipment.php +55 -0
- package/server/src/Models/Order.php +2 -1
- package/server/src/Observers/PurchaseRateObserver.php +2 -1
- package/server/src/Support/Analytics/RevenueTrend.php +3 -8
- package/server/src/Support/Metrics/ActiveRevenueQuery.php +121 -0
- package/server/src/Support/Metrics/AvgOrderValueMetric.php +1 -7
- package/server/src/Support/Metrics/EarningsMetric.php +1 -10
- package/server/src/Support/Telematics/Providers/AfaqyProvider.php +105 -5
- package/server/src/Support/Telematics/Providers/FlespiProvider.php +89 -15
- package/server/src/Support/Telematics/Providers/GeotabProvider.php +123 -35
- package/server/src/Support/Telematics/Providers/SafeeProvider.php +567 -47
- package/server/src/Support/Telematics/Providers/SamsaraProvider.php +122 -14
- package/server/src/Support/Telematics/TelematicService.php +28 -9
- package/server/src/routes.php +67 -15
- package/server/tests/DeviceFilterTest.php +9 -0
- package/server/tests/DriverVehicleStatusDefaultTest.php +19 -2
- package/server/tests/EquipmentAssignmentMorphTypeTest.php +35 -0
- package/server/tests/ExportCoverageTest.php +79 -0
- package/server/tests/MetricsRegistryTest.php +45 -5
- package/server/tests/PublicFleetOpsRestEndpointsTest.php +191 -0
- package/server/tests/ServiceRateRouteValidationTest.php +101 -0
- package/server/tests/TelematicsHardeningTest.php +873 -7
- package/addon/controllers/connectivity/events/index/details.js +0 -3
- package/addon/routes/connectivity/events/index/details.js +0 -3
- 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($
|
|
23
|
+
public function map($serviceArea): array
|
|
24
24
|
{
|
|
25
25
|
return [
|
|
26
|
-
$
|
|
27
|
-
$
|
|
28
|
-
$
|
|
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
|
-
$
|
|
32
|
-
$
|
|
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
|
-
'
|
|
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
|
-
'
|
|
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->
|
|
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
|
-
'
|
|
140
|
+
'Description',
|
|
141
|
+
'Plate Number',
|
|
142
|
+
'VIN',
|
|
43
143
|
'Make',
|
|
44
144
|
'Model',
|
|
45
145
|
'Year',
|
|
46
|
-
'
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
'
|
|
52
|
-
'
|
|
63
|
+
'H' => '+#',
|
|
64
|
+
'L' => NumberFormat::FORMAT_DATE_DDMMYYYY,
|
|
65
|
+
'M' => NumberFormat::FORMAT_DATE_DDMMYYYY,
|
|
53
66
|
];
|
|
54
67
|
}
|
|
55
68
|
|