@fleetbase/fleetops-engine 0.6.51 → 0.6.53
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/README.md +0 -2
- package/addon/components/cell/telematic-provider.hbs +16 -0
- package/addon/components/cell/telematic-provider.js +36 -0
- package/addon/components/cell/telematic-status.hbs +1 -0
- package/addon/components/cell/telematic-status.js +39 -0
- package/addon/components/device/manager.hbs +5 -6
- package/addon/components/device/manager.js +12 -15
- package/addon/components/driver/details.hbs +1 -1
- package/addon/components/fleet/vehicle-listing.js +1 -0
- package/addon/components/fuel-integration/form.hbs +200 -0
- package/addon/components/fuel-integration/form.js +242 -0
- package/addon/components/fuel-integration/hub.hbs +154 -0
- package/addon/components/fuel-integration/hub.js +165 -0
- package/addon/components/fuel-integration/matching-priority.hbs +76 -0
- package/addon/components/fuel-integration/matching-priority.js +145 -0
- package/addon/components/fuel-report/details.hbs +13 -1
- package/addon/components/issue/details.hbs +3 -57
- package/addon/components/issue/details.js +0 -96
- package/addon/components/layout/fleet-ops-sidebar/operations-monitor.hbs +201 -0
- package/addon/components/layout/fleet-ops-sidebar/operations-monitor.js +589 -0
- package/addon/components/layout/fleet-ops-sidebar.hbs +19 -233
- package/addon/components/layout/fleet-ops-sidebar.js +287 -376
- package/addon/components/maintenance-schedule/form.js +1 -0
- package/addon/components/map/drawer/device-event-listing.hbs +12 -2
- package/addon/components/map/drawer/driver-listing.hbs +14 -1
- package/addon/components/map/drawer/place-listing.hbs +14 -1
- package/addon/components/map/drawer/position-listing.hbs +12 -2
- package/addon/components/map/drawer/vehicle-listing.hbs +14 -1
- package/addon/components/modals/assigned-orders.hbs +40 -0
- package/addon/components/modals/attach-device.hbs +4 -3
- package/addon/components/modals/attach-telematic-device.hbs +25 -0
- package/addon/components/modals/attach-telematic-device.js +3 -0
- package/addon/components/modals/driver-assign-order.hbs +7 -58
- package/addon/components/modals/driver-assign-vehicle.hbs +10 -2
- package/addon/components/modals/fleet-assign-driver.hbs +18 -0
- package/addon/components/modals/fleet-assign-driver.js +3 -0
- package/addon/components/modals/fleet-assign-vehicle.hbs +18 -0
- package/addon/components/modals/fleet-assign-vehicle.js +3 -0
- package/addon/components/modals/telematic-connection-diagnostics.hbs +75 -0
- package/addon/components/modals/telematic-connection-diagnostics.js +287 -0
- package/addon/components/modals/vehicle-details.hbs +6 -1
- package/addon/components/modals/vehicle-form.hbs +8 -1
- package/addon/components/order/card.hbs +106 -0
- package/addon/components/order/card.js +257 -0
- package/addon/components/order/form/payload.js +3 -1
- package/addon/components/order/form/service-rate.hbs +2 -0
- package/addon/components/service-rate/form.hbs +3 -2
- package/addon/components/telematic/details.hbs +98 -87
- package/addon/components/telematic/details.js +230 -1
- package/addon/components/telematic/form.hbs +303 -72
- package/addon/components/telematic/form.js +519 -3
- package/addon/components/telematic/hub.hbs +149 -0
- package/addon/components/telematic/hub.js +142 -0
- package/addon/components/telematic/settings.hbs +152 -0
- package/addon/components/telematic/settings.js +45 -0
- package/addon/components/telematic/tab-empty-state.hbs +29 -0
- package/addon/components/telematic/tab-empty-state.js +33 -0
- package/addon/components/vehicle/details.hbs +6 -1
- package/addon/components/vehicle/form.hbs +2 -1
- package/addon/components/widget/fuel-providers.hbs +43 -0
- package/addon/components/widget/fuel-providers.js +27 -0
- package/addon/controllers/connectivity/devices/index/details.js +27 -1
- package/addon/controllers/connectivity/devices/index.js +18 -1
- package/addon/controllers/connectivity/fuel-providers/details/sync.js +18 -0
- package/addon/controllers/connectivity/fuel-providers/details/transactions.js +24 -0
- package/addon/controllers/connectivity/fuel-providers/details.js +69 -0
- package/addon/controllers/connectivity/fuel-providers/edit.js +24 -0
- package/addon/controllers/connectivity/fuel-providers/index.js +177 -0
- package/addon/controllers/connectivity/fuel-providers/new.js +37 -0
- package/addon/controllers/connectivity/telematics/details/attachments.js +247 -0
- package/addon/controllers/connectivity/telematics/details/devices.js +368 -0
- package/addon/controllers/connectivity/telematics/details/events.js +244 -0
- package/addon/controllers/connectivity/telematics/details/index.js +3 -0
- package/addon/controllers/connectivity/telematics/details/logs.js +43 -0
- package/addon/controllers/connectivity/telematics/details/sensors.js +270 -0
- package/addon/controllers/connectivity/telematics/details.js +149 -0
- package/addon/controllers/connectivity/telematics/{index/edit.js → edit.js} +15 -4
- package/addon/controllers/connectivity/telematics/index.js +25 -5
- package/addon/controllers/connectivity/telematics/{index/new.js → new.js} +8 -2
- package/addon/controllers/maintenance/index.js +100 -0
- package/addon/controllers/management/drivers/index/details.js +78 -1
- package/addon/controllers/management/drivers/index.js +39 -0
- package/addon/controllers/management/fleets/index/details.js +23 -1
- package/addon/controllers/management/fleets/index.js +6 -1
- package/addon/controllers/management/fuel-reports/index.js +37 -1
- package/addon/controllers/management/fuel-transactions/index/details.js +70 -0
- package/addon/controllers/management/fuel-transactions/index.js +240 -0
- package/addon/controllers/management/index.js +88 -0
- package/addon/controllers/management/vehicles/index/details.js +32 -0
- package/addon/controllers/management/vehicles/index.js +26 -0
- package/addon/controllers/operations/orders/index.js +4 -0
- package/addon/controllers/settings/index.js +142 -0
- package/addon/controllers/settings/payments/index.js +5 -0
- package/addon/extension.js +31 -0
- package/addon/routes/analytics/index.js +3 -0
- package/addon/routes/connectivity/devices/index.js +3 -0
- package/addon/routes/connectivity/fuel-providers/details/index.js +7 -0
- package/addon/routes/connectivity/fuel-providers/details/matching.js +7 -0
- package/addon/routes/connectivity/fuel-providers/details/settings.js +7 -0
- package/addon/routes/connectivity/fuel-providers/details/sync.js +18 -0
- package/addon/routes/connectivity/fuel-providers/details/transactions.js +14 -0
- package/addon/routes/connectivity/fuel-providers/details.js +18 -0
- package/addon/routes/connectivity/fuel-providers/edit.js +18 -0
- package/addon/routes/connectivity/fuel-providers/index.js +20 -0
- package/addon/routes/connectivity/fuel-providers/new.js +3 -0
- package/addon/routes/connectivity/fuel-providers.js +3 -0
- package/addon/routes/connectivity/telematics/details/attachments.js +28 -0
- package/addon/routes/connectivity/telematics/details/devices.js +30 -0
- package/addon/routes/connectivity/telematics/details/events.js +33 -0
- package/addon/routes/connectivity/telematics/details/index.js +3 -0
- package/addon/routes/connectivity/telematics/details/logs.js +17 -0
- package/addon/routes/connectivity/telematics/details/sensors.js +29 -0
- package/addon/routes/connectivity/telematics/{index/details.js → details.js} +1 -1
- package/addon/routes/connectivity/telematics/{index/edit.js → edit.js} +1 -1
- package/addon/routes/connectivity/telematics/new.js +3 -0
- package/addon/routes/maintenance/index.js +3 -0
- package/addon/routes/maintenance/work-orders/index.js +2 -0
- package/addon/routes/management/drivers/index/details/activity.js +3 -0
- package/addon/routes/management/fuel-reports/index.js +2 -0
- package/addon/routes/management/fuel-transactions/index/details.js +18 -0
- package/addon/routes/management/fuel-transactions/index.js +21 -0
- package/addon/routes/management/fuel-transactions.js +3 -0
- package/addon/routes/settings/index.js +3 -0
- package/addon/routes.js +28 -9
- package/addon/services/device-actions.js +64 -1
- package/addon/services/device-event-actions.js +12 -1
- package/addon/services/driver-actions.js +147 -11
- package/addon/services/fleet-actions.js +66 -1
- package/addon/services/fuel-integration-actions.js +31 -0
- package/addon/services/issue-actions.js +1 -1
- package/addon/services/telematic-actions.js +9 -3
- package/addon/services/vehicle-actions.js +125 -0
- package/addon/styles/fleetops-engine.css +2237 -162
- package/addon/templates/analytics/index.hbs +14 -0
- package/addon/templates/analytics/reports/index.hbs +19 -1
- package/addon/templates/connectivity/devices/index.hbs +19 -1
- package/addon/templates/connectivity/events/index.hbs +16 -1
- package/addon/templates/connectivity/fuel-providers/details/index.hbs +38 -0
- package/addon/templates/connectivity/fuel-providers/details/matching.hbs +13 -0
- package/addon/templates/connectivity/fuel-providers/details/settings.hbs +11 -0
- package/addon/templates/connectivity/fuel-providers/details/sync.hbs +48 -0
- package/addon/templates/connectivity/fuel-providers/details/transactions.hbs +21 -0
- package/addon/templates/connectivity/fuel-providers/details.hbs +51 -0
- package/addon/templates/connectivity/fuel-providers/edit.hbs +24 -0
- package/addon/templates/connectivity/fuel-providers/index.hbs +12 -0
- package/addon/templates/connectivity/fuel-providers/new.hbs +22 -0
- package/addon/templates/connectivity/fuel-providers.hbs +1 -0
- package/addon/templates/connectivity/sensors/index.hbs +19 -1
- package/addon/templates/connectivity/telematics/details/attachments.hbs +163 -0
- package/addon/templates/connectivity/telematics/details/devices.hbs +88 -0
- package/addon/templates/connectivity/telematics/details/events.hbs +101 -0
- package/addon/templates/connectivity/telematics/{index/details → details}/index.hbs +0 -1
- package/addon/templates/connectivity/telematics/details/logs.hbs +69 -0
- package/addon/templates/connectivity/telematics/details/sensors.hbs +88 -0
- package/addon/templates/connectivity/telematics/details.hbs +53 -0
- package/addon/templates/connectivity/telematics/edit.hbs +27 -0
- package/addon/templates/connectivity/telematics/index.hbs +6 -8
- package/addon/templates/connectivity/telematics/new.hbs +24 -0
- package/addon/templates/maintenance/equipment/index.hbs +19 -1
- package/addon/templates/maintenance/index.hbs +113 -0
- package/addon/templates/maintenance/maintenances/index.hbs +15 -1
- package/addon/templates/maintenance/parts/index.hbs +19 -1
- package/addon/templates/maintenance/schedules/index.hbs +19 -1
- package/addon/templates/maintenance/work-orders/index.hbs +19 -1
- package/addon/templates/management/contacts/customers.hbs +15 -1
- package/addon/templates/management/contacts/index.hbs +19 -1
- package/addon/templates/management/drivers/index/details/activity.hbs +1 -0
- package/addon/templates/management/drivers/index.hbs +19 -1
- package/addon/templates/management/fleets/index.hbs +19 -1
- package/addon/templates/management/fuel-reports/index.hbs +19 -1
- package/addon/templates/management/fuel-transactions/index/details.hbs +73 -0
- package/addon/templates/management/fuel-transactions/index.hbs +58 -0
- package/addon/templates/management/fuel-transactions.hbs +1 -0
- package/addon/templates/management/index.hbs +109 -73
- package/addon/templates/management/issues/index.hbs +19 -1
- package/addon/templates/management/places/index.hbs +19 -1
- package/addon/templates/management/vehicles/index.hbs +19 -1
- package/addon/templates/management/vendors/index.hbs +19 -1
- package/addon/templates/management/vendors/integrated.hbs +13 -1
- package/addon/templates/operations/orders/index.hbs +19 -1
- package/addon/templates/operations/service-rates/index.hbs +19 -1
- package/addon/templates/settings/index.hbs +83 -0
- package/addon/templates/settings/payments/index.hbs +15 -1
- package/addon/templates/settings/routing.hbs +2 -2
- package/addon/utils/fleet-ops-options.js +3 -0
- package/app/components/cell/telematic-provider.js +1 -0
- package/app/components/cell/telematic-status.js +1 -0
- package/app/components/fuel-integration/form.js +1 -0
- package/app/components/fuel-integration/hub.js +1 -0
- package/app/components/fuel-integration/matching-priority.js +1 -0
- package/app/components/modals/assigned-orders.js +1 -0
- package/app/components/modals/attach-telematic-device.js +1 -0
- package/app/components/modals/fleet-assign-driver.js +1 -0
- package/app/components/modals/fleet-assign-vehicle.js +1 -0
- package/app/components/modals/telematic-connection-diagnostics.js +1 -0
- package/app/components/order/card.js +1 -0
- package/app/components/telematic/hub.js +1 -0
- package/app/components/telematic/settings.js +1 -0
- package/app/components/telematic/tab-empty-state.js +1 -0
- package/app/components/widget/fuel-providers.js +1 -0
- package/app/controllers/connectivity/fuel-providers/details/sync.js +1 -0
- package/app/controllers/connectivity/{telematics/index/details/devices.js → fuel-providers/details/transactions.js} +1 -1
- package/app/controllers/connectivity/{telematics/index → fuel-providers}/details.js +1 -1
- package/app/controllers/connectivity/{telematics/index → fuel-providers}/edit.js +1 -1
- package/app/controllers/connectivity/{telematics/index/details → fuel-providers}/index.js +1 -1
- package/app/controllers/connectivity/{telematics/index → fuel-providers}/new.js +1 -1
- package/app/controllers/connectivity/telematics/details/attachments.js +1 -0
- package/app/controllers/connectivity/telematics/details/devices.js +1 -0
- package/app/controllers/connectivity/telematics/details/events.js +1 -0
- package/app/controllers/connectivity/telematics/details/index.js +1 -0
- package/app/controllers/connectivity/telematics/details/logs.js +1 -0
- package/app/controllers/connectivity/telematics/details/sensors.js +1 -0
- package/app/controllers/connectivity/telematics/details.js +1 -0
- package/app/controllers/connectivity/telematics/edit.js +1 -0
- package/app/controllers/connectivity/telematics/new.js +1 -0
- package/app/controllers/maintenance/index.js +1 -0
- package/app/controllers/management/fuel-transactions/index/details.js +1 -0
- package/app/controllers/management/fuel-transactions/index.js +1 -0
- package/app/controllers/management/index.js +1 -0
- package/app/controllers/settings/index.js +1 -0
- package/app/routes/analytics/index.js +1 -0
- package/app/routes/connectivity/{telematics/index → fuel-providers}/details/index.js +1 -1
- package/app/routes/connectivity/{telematics/index/details/events.js → fuel-providers/details/matching.js} +1 -1
- package/app/routes/connectivity/fuel-providers/details/settings.js +1 -0
- package/app/routes/connectivity/fuel-providers/details/sync.js +1 -0
- package/app/routes/connectivity/{telematics/index/details/devices.js → fuel-providers/details/transactions.js} +1 -1
- package/app/routes/connectivity/{telematics/index → fuel-providers}/details.js +1 -1
- package/app/routes/connectivity/{telematics/index → fuel-providers}/edit.js +1 -1
- package/app/routes/connectivity/fuel-providers/index.js +1 -0
- package/app/routes/connectivity/{telematics/index → fuel-providers}/new.js +1 -1
- package/app/routes/connectivity/fuel-providers.js +1 -0
- package/app/routes/connectivity/telematics/details/attachments.js +1 -0
- package/app/routes/connectivity/telematics/details/devices.js +1 -0
- package/app/routes/connectivity/telematics/details/events.js +1 -0
- package/app/routes/connectivity/telematics/details/index.js +1 -0
- package/app/routes/connectivity/telematics/details/logs.js +1 -0
- package/app/routes/connectivity/telematics/details/sensors.js +1 -0
- package/app/routes/connectivity/telematics/details.js +1 -0
- package/app/routes/connectivity/telematics/edit.js +1 -0
- package/app/routes/connectivity/telematics/new.js +1 -0
- package/app/routes/maintenance/index.js +1 -0
- package/app/routes/management/drivers/index/details/activity.js +1 -0
- package/app/routes/management/fuel-transactions/index/details.js +1 -0
- package/app/routes/management/fuel-transactions/index.js +1 -0
- package/app/routes/management/fuel-transactions.js +1 -0
- package/app/routes/settings/index.js +1 -0
- package/app/services/fuel-integration-actions.js +1 -0
- package/app/templates/analytics/index.js +1 -0
- package/app/templates/connectivity/{telematics/index → fuel-providers}/details/index.js +1 -1
- package/app/templates/connectivity/{telematics/index/details/events.js → fuel-providers/details/matching.js} +1 -1
- package/app/templates/connectivity/fuel-providers/details/settings.js +1 -0
- package/app/templates/connectivity/fuel-providers/details/sync.js +1 -0
- package/app/templates/connectivity/{telematics/index/details/devices.js → fuel-providers/details/transactions.js} +1 -1
- package/app/templates/connectivity/{telematics/index → fuel-providers}/details.js +1 -1
- package/app/templates/connectivity/{telematics/index → fuel-providers}/edit.js +1 -1
- package/app/templates/connectivity/fuel-providers/index.js +1 -0
- package/app/templates/connectivity/{telematics/index → fuel-providers}/new.js +1 -1
- package/app/templates/connectivity/fuel-providers.js +1 -0
- package/app/templates/connectivity/telematics/details/attachments.js +1 -0
- package/app/templates/connectivity/telematics/details/devices.js +1 -0
- package/app/templates/connectivity/telematics/details/events.js +1 -0
- package/app/templates/connectivity/telematics/details/index.js +1 -0
- package/app/templates/connectivity/telematics/details/logs.js +1 -0
- package/app/templates/connectivity/telematics/details/sensors.js +1 -0
- package/app/templates/connectivity/telematics/details.js +1 -0
- package/app/templates/connectivity/telematics/edit.js +1 -0
- package/app/templates/connectivity/telematics/new.js +1 -0
- package/app/templates/maintenance/index.js +1 -0
- package/app/templates/management/drivers/index/details/activity.js +1 -0
- package/app/templates/management/fuel-transactions/index/details.js +1 -0
- package/app/templates/management/fuel-transactions/index.js +1 -0
- package/app/templates/management/fuel-transactions.js +1 -0
- package/app/templates/management/index.js +1 -0
- package/app/templates/settings/index.js +1 -0
- package/assets/images/telematics/providers/afaqy.webp +0 -0
- package/assets/images/telematics/providers/default.webp +0 -0
- package/assets/images/telematics/providers/flespi.webp +0 -0
- package/assets/images/telematics/providers/geotab.webp +0 -0
- package/assets/images/telematics/providers/safee.webp +0 -0
- package/assets/images/telematics/providers/samsara.webp +0 -0
- package/composer.json +1 -1
- package/extension.json +1 -1
- package/package.json +4 -4
- package/server/config/fuel-providers.php +42 -0
- package/server/config/telematics.php +139 -130
- package/server/migrations/2026_06_06_000001_harden_device_events_telematics_contract.php +59 -0
- package/server/migrations/2026_06_08_000001_create_fuel_provider_connections_table.php +37 -0
- package/server/migrations/2026_06_08_000002_create_fuel_provider_transactions_table.php +53 -0
- package/server/migrations/2026_06_08_000003_create_fuel_provider_sync_runs_table.php +40 -0
- package/server/migrations/2026_06_10_000001_add_fuel_card_number_to_vehicles_table.php +25 -0
- package/server/migrations/2026_06_10_000002_add_vehicle_identity_columns_to_fuel_provider_transactions_table.php +39 -0
- package/server/migrations/2026_06_15_000001_normalize_device_attachable_vehicle_morph_types.php +30 -0
- package/server/src/Console/Commands/FixInvalidPolymorphicRelationTypeNamespaces.php +1 -0
- package/server/src/Contracts/FuelProvider.php +30 -0
- package/server/src/Contracts/TelematicProviderDescriptor.php +3 -1
- package/server/src/Events/FuelProviderTransactionImported.php +17 -0
- package/server/src/Events/FuelProviderTransactionMatched.php +17 -0
- package/server/src/Events/FuelProviderTransactionUnmatched.php +17 -0
- package/server/src/Events/FuelReportCreatedFromProvider.php +18 -0
- package/server/src/Http/Controllers/Internal/v1/AnalyticsController.php +6 -0
- package/server/src/Http/Controllers/Internal/v1/DeviceController.php +140 -2
- package/server/src/Http/Controllers/Internal/v1/DeviceEventController.php +44 -0
- package/server/src/Http/Controllers/Internal/v1/DriverController.php +158 -7
- package/server/src/Http/Controllers/Internal/v1/FuelProviderConnectionController.php +124 -0
- package/server/src/Http/Controllers/Internal/v1/FuelProviderSyncRunController.php +10 -0
- package/server/src/Http/Controllers/Internal/v1/FuelProviderTransactionController.php +76 -0
- package/server/src/Http/Controllers/Internal/v1/HubController.php +300 -0
- package/server/src/Http/Controllers/Internal/v1/SearchController.php +506 -0
- package/server/src/Http/Controllers/Internal/v1/SensorController.php +1 -1
- package/server/src/Http/Controllers/Internal/v1/TelematicController.php +179 -16
- package/server/src/Http/Controllers/Internal/v1/VehicleController.php +249 -0
- package/server/src/Http/Controllers/TelematicWebhookController.php +103 -19
- package/server/src/Http/Filter/DeviceFilter.php +74 -0
- package/server/src/Http/Filter/DriverFilter.php +6 -0
- package/server/src/Http/Filter/FuelProviderConnectionFilter.php +33 -0
- package/server/src/Http/Filter/FuelProviderSyncRunFilter.php +28 -0
- package/server/src/Http/Filter/FuelProviderTransactionFilter.php +59 -0
- package/server/src/Http/Filter/FuelReportFilter.php +10 -0
- package/server/src/Http/Filter/VehicleFilter.php +6 -0
- package/server/src/Http/Resources/v1/Driver.php +15 -0
- package/server/src/Http/Resources/v1/FuelProviderConnection.php +30 -0
- package/server/src/Http/Resources/v1/FuelProviderSyncRun.php +36 -0
- package/server/src/Http/Resources/v1/FuelProviderTransaction.php +54 -0
- package/server/src/Http/Resources/v1/FuelReport.php +28 -22
- package/server/src/Http/Resources/v1/Index/Driver.php +26 -20
- package/server/src/Http/Resources/v1/Index/Vehicle.php +29 -22
- package/server/src/Http/Resources/v1/Vehicle.php +17 -0
- package/server/src/Http/Resources/v1/VehicleWithoutDriver.php +2 -0
- package/server/src/Jobs/SyncFuelProviderTransactionsJob.php +57 -0
- package/server/src/Jobs/SyncTelematicDevicesJob.php +105 -17
- package/server/src/Jobs/TestTelematicConnectionJob.php +9 -22
- package/server/src/Models/Asset.php +2 -1
- package/server/src/Models/Contact.php +2 -1
- package/server/src/Models/Device.php +27 -4
- package/server/src/Models/DeviceEvent.php +40 -3
- package/server/src/Models/Driver.php +3 -2
- package/server/src/Models/Equipment.php +2 -1
- package/server/src/Models/Fleet.php +2 -1
- package/server/src/Models/FuelProviderConnection.php +60 -0
- package/server/src/Models/FuelProviderSyncRun.php +58 -0
- package/server/src/Models/FuelProviderTransaction.php +119 -0
- package/server/src/Models/FuelReport.php +16 -1
- package/server/src/Models/Part.php +2 -1
- package/server/src/Models/Sensor.php +21 -4
- package/server/src/Models/ServiceRate.php +39 -2
- package/server/src/Models/Vehicle.php +14 -2
- package/server/src/Models/Vendor.php +2 -1
- package/server/src/Providers/FleetOpsServiceProvider.php +20 -0
- package/server/src/Support/Analytics/FuelProviderSummary.php +42 -0
- package/server/src/Support/FuelProviders/FuelProviderDescriptor.php +55 -0
- package/server/src/Support/FuelProviders/FuelProviderRegistry.php +75 -0
- package/server/src/Support/FuelProviders/FuelProviderService.php +447 -0
- package/server/src/Support/FuelProviders/Providers/AbstractFuelProvider.php +98 -0
- package/server/src/Support/FuelProviders/Providers/PetroAppFuelProvider.php +167 -0
- package/server/src/Support/Telematics/Providers/AbstractProvider.php +27 -6
- package/server/src/Support/Telematics/Providers/AfaqyProvider.php +105 -38
- package/server/src/Support/Telematics/Providers/FlespiProvider.php +1 -0
- package/server/src/Support/Telematics/Providers/GeotabProvider.php +1 -0
- package/server/src/Support/Telematics/Providers/SafeeProvider.php +32 -22
- package/server/src/Support/Telematics/Providers/SamsaraProvider.php +3 -1
- package/server/src/Support/Telematics/TelematicService.php +340 -21
- package/server/src/routes.php +50 -4
- package/server/tests/FuelProviderRegistryTest.php +416 -0
- package/server/tests/HubRoutesTest.php +62 -0
- package/server/tests/ServiceRateAlgorithmWeightVariablesTest.php +44 -0
- package/server/tests/TelematicsHardeningTest.php +359 -0
- package/server/tests/VehicleDriverAssignmentTest.php +51 -0
- package/translations/ar-ae.yml +23 -1
- package/translations/bg-bg.yaml +72 -0
- package/translations/en-us.yaml +83 -0
- package/translations/es-pa.yaml +72 -0
- package/translations/fr-fr.yaml +72 -0
- package/translations/mn-mn.yaml +72 -0
- package/translations/pt-br.yaml +72 -0
- package/translations/ru-ru.yaml +72 -0
- package/translations/vi-vn.yaml +98 -1
- package/addon/controllers/connectivity/telematics/index/details/devices.js +0 -3
- package/addon/controllers/connectivity/telematics/index/details/events.js +0 -3
- package/addon/controllers/connectivity/telematics/index/details/index.js +0 -3
- package/addon/controllers/connectivity/telematics/index/details/sensors.js +0 -3
- package/addon/controllers/connectivity/telematics/index/details.js +0 -24
- package/addon/routes/connectivity/telematics/index/details/devices.js +0 -3
- package/addon/routes/connectivity/telematics/index/details/events.js +0 -3
- package/addon/routes/connectivity/telematics/index/details/index.js +0 -3
- package/addon/routes/connectivity/telematics/index/details/sensors.js +0 -3
- package/addon/routes/connectivity/telematics/index/new.js +0 -3
- package/addon/templates/connectivity/telematics/index/details/devices.hbs +0 -1
- package/addon/templates/connectivity/telematics/index/details/events.hbs +0 -1
- package/addon/templates/connectivity/telematics/index/details/sensors.hbs +0 -1
- package/addon/templates/connectivity/telematics/index/details.hbs +0 -14
- package/addon/templates/connectivity/telematics/index/edit.hbs +0 -12
- package/addon/templates/connectivity/telematics/index/new.hbs +0 -12
- package/app/controllers/connectivity/telematics/index/details/events.js +0 -1
- package/app/controllers/connectivity/telematics/index/details/sensors.js +0 -1
- package/app/routes/connectivity/telematics/index/details/sensors.js +0 -1
- package/app/templates/connectivity/telematics/index/details/sensors.js +0 -1
|
@@ -8,7 +8,24 @@ export default class ManagementFuelReportsIndexController extends Controller {
|
|
|
8
8
|
@service intl;
|
|
9
9
|
|
|
10
10
|
/** query params */
|
|
11
|
-
@tracked queryParams = [
|
|
11
|
+
@tracked queryParams = [
|
|
12
|
+
'page',
|
|
13
|
+
'limit',
|
|
14
|
+
'sort',
|
|
15
|
+
'query',
|
|
16
|
+
'public_id',
|
|
17
|
+
'internal_id',
|
|
18
|
+
'vehicle',
|
|
19
|
+
'driver',
|
|
20
|
+
'created_by',
|
|
21
|
+
'updated_by',
|
|
22
|
+
'status',
|
|
23
|
+
'source',
|
|
24
|
+
'provider',
|
|
25
|
+
'country',
|
|
26
|
+
'volume',
|
|
27
|
+
'odometer',
|
|
28
|
+
];
|
|
12
29
|
@tracked page = 1;
|
|
13
30
|
@tracked limit;
|
|
14
31
|
@tracked sort = '-created_at';
|
|
@@ -20,6 +37,8 @@ export default class ManagementFuelReportsIndexController extends Controller {
|
|
|
20
37
|
@tracked volume;
|
|
21
38
|
@tracked odometer;
|
|
22
39
|
@tracked status;
|
|
40
|
+
@tracked source;
|
|
41
|
+
@tracked provider;
|
|
23
42
|
@tracked table;
|
|
24
43
|
|
|
25
44
|
/** action buttons */
|
|
@@ -130,6 +149,23 @@ export default class ManagementFuelReportsIndexController extends Controller {
|
|
|
130
149
|
filterComponent: 'filter/multi-option',
|
|
131
150
|
filterOptions: ['draft', 'pending-approval', 'approved', 'rejected', 'revised', 'submitted', 'in-review', 'confirmed', 'processed', 'archived', 'cancelled'],
|
|
132
151
|
},
|
|
152
|
+
{
|
|
153
|
+
label: 'Source',
|
|
154
|
+
valuePath: 'source',
|
|
155
|
+
resizable: true,
|
|
156
|
+
sortable: false,
|
|
157
|
+
filterable: true,
|
|
158
|
+
filterComponent: 'filter/multi-option',
|
|
159
|
+
filterOptions: ['manual', 'import', 'fuel_provider'],
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
label: 'Provider',
|
|
163
|
+
valuePath: 'provider',
|
|
164
|
+
resizable: true,
|
|
165
|
+
sortable: false,
|
|
166
|
+
filterable: true,
|
|
167
|
+
filterComponent: 'filter/string',
|
|
168
|
+
},
|
|
133
169
|
{
|
|
134
170
|
label: this.intl.t('column.volume'),
|
|
135
171
|
valuePath: 'volume',
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import Controller from '@ember/controller';
|
|
2
|
+
import { tracked } from '@glimmer/tracking';
|
|
3
|
+
import { inject as service } from '@ember/service';
|
|
4
|
+
import { action } from '@ember/object';
|
|
5
|
+
import { task } from 'ember-concurrency';
|
|
6
|
+
|
|
7
|
+
export default class ManagementFuelTransactionsIndexDetailsController extends Controller {
|
|
8
|
+
@service fetch;
|
|
9
|
+
@service notifications;
|
|
10
|
+
@service hostRouter;
|
|
11
|
+
|
|
12
|
+
@tracked vehicleId;
|
|
13
|
+
@tracked orderId;
|
|
14
|
+
|
|
15
|
+
get normalizedPayloadJson() {
|
|
16
|
+
return JSON.stringify(this.model?.normalized_payload ?? {}, null, 2);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
get rawPayloadJson() {
|
|
20
|
+
return JSON.stringify(this.model?.raw_payload ?? {}, null, 2);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@action setVehicleId(event) {
|
|
24
|
+
this.vehicleId = event.target.value;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
@action setOrderId(event) {
|
|
28
|
+
this.orderId = event.target.value;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
@task *matchVehicle() {
|
|
32
|
+
try {
|
|
33
|
+
yield this.fetch.post(`fuel-provider-transactions/${this.model.id}/match-vehicle`, { vehicle: this.vehicleId });
|
|
34
|
+
this.notifications.success('Fuel transaction matched to vehicle.');
|
|
35
|
+
yield this.hostRouter.refresh();
|
|
36
|
+
} catch (error) {
|
|
37
|
+
this.notifications.serverError(error);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@task *matchOrder() {
|
|
42
|
+
try {
|
|
43
|
+
yield this.fetch.post(`fuel-provider-transactions/${this.model.id}/match-order`, { order: this.orderId });
|
|
44
|
+
this.notifications.success('Fuel transaction matched to order.');
|
|
45
|
+
yield this.hostRouter.refresh();
|
|
46
|
+
} catch (error) {
|
|
47
|
+
this.notifications.serverError(error);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@task *reprocess() {
|
|
52
|
+
try {
|
|
53
|
+
yield this.fetch.post(`fuel-provider-transactions/${this.model.id}/reprocess`);
|
|
54
|
+
this.notifications.success('Fuel transaction reprocessed.');
|
|
55
|
+
yield this.hostRouter.refresh();
|
|
56
|
+
} catch (error) {
|
|
57
|
+
this.notifications.serverError(error);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
@task *review(status) {
|
|
62
|
+
try {
|
|
63
|
+
yield this.fetch.post(`fuel-provider-transactions/${this.model.id}/review`, { status });
|
|
64
|
+
this.notifications.success(status === 'ignored' ? 'Fuel transaction ignored.' : 'Fuel transaction reviewed.');
|
|
65
|
+
yield this.hostRouter.refresh();
|
|
66
|
+
} catch (error) {
|
|
67
|
+
this.notifications.serverError(error);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import Controller from '@ember/controller';
|
|
2
|
+
import { inject as service } from '@ember/service';
|
|
3
|
+
import { tracked } from '@glimmer/tracking';
|
|
4
|
+
import { action } from '@ember/object';
|
|
5
|
+
import { task } from 'ember-concurrency';
|
|
6
|
+
|
|
7
|
+
export default class ManagementFuelTransactionsIndexController extends Controller {
|
|
8
|
+
@service tableContext;
|
|
9
|
+
@service fetch;
|
|
10
|
+
@service notifications;
|
|
11
|
+
@service hostRouter;
|
|
12
|
+
|
|
13
|
+
@tracked queryParams = ['page', 'limit', 'sort', 'query', 'provider', 'sync_status', 'vehicle', 'connection', 'transaction_at'];
|
|
14
|
+
@tracked page = 1;
|
|
15
|
+
@tracked limit;
|
|
16
|
+
@tracked sort = '-transaction_at';
|
|
17
|
+
@tracked query;
|
|
18
|
+
@tracked provider;
|
|
19
|
+
@tracked sync_status;
|
|
20
|
+
@tracked vehicle;
|
|
21
|
+
@tracked connection;
|
|
22
|
+
@tracked transaction_at;
|
|
23
|
+
@tracked table;
|
|
24
|
+
|
|
25
|
+
get hasRecords() {
|
|
26
|
+
return Array.from(this.model ?? []).length > 0;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
get emptyStateTitle() {
|
|
30
|
+
if (this.sync_status === 'unmatched') {
|
|
31
|
+
return 'No unmatched fuel transactions';
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (this.connection) {
|
|
35
|
+
return 'No transactions imported for this integration';
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return 'No fuel transactions imported yet';
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
get emptyStateMessage() {
|
|
42
|
+
if (this.sync_status === 'unmatched') {
|
|
43
|
+
return 'Fleet-Ops did not find imported provider bills that still need vehicle or trip matching.';
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (this.connection) {
|
|
47
|
+
return 'Run a sync from the fuel integration detail page to import provider bills into this ledger.';
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return 'Connect PetroApp or another fuel integration, then run a transaction sync. Imported provider bills appear here before linked Fuel Reports are created.';
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
get actionButtons() {
|
|
54
|
+
return [
|
|
55
|
+
{
|
|
56
|
+
icon: 'refresh',
|
|
57
|
+
onClick: this.refresh,
|
|
58
|
+
helpText: 'Refresh',
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
icon: 'gas-pump',
|
|
62
|
+
text: 'Fuel Integrations',
|
|
63
|
+
onClick: () => this.hostRouter.transitionTo('console.fleet-ops.connectivity.fuel-providers.index'),
|
|
64
|
+
},
|
|
65
|
+
];
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
@action refresh() {
|
|
69
|
+
this.target.send('refresh');
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
get bulkActions() {
|
|
73
|
+
const selected = this.tableContext.getSelectedRows();
|
|
74
|
+
|
|
75
|
+
return [
|
|
76
|
+
{
|
|
77
|
+
label: `Reprocess ${selected.length} selected`,
|
|
78
|
+
fn: () => selected.forEach((transaction) => this.reprocessTransaction.perform(transaction)),
|
|
79
|
+
},
|
|
80
|
+
];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
get columns() {
|
|
84
|
+
return [
|
|
85
|
+
{
|
|
86
|
+
sticky: true,
|
|
87
|
+
label: 'Transaction',
|
|
88
|
+
valuePath: 'provider_transaction_id',
|
|
89
|
+
cellComponent: 'click-to-copy',
|
|
90
|
+
resizable: true,
|
|
91
|
+
sortable: true,
|
|
92
|
+
filterable: true,
|
|
93
|
+
filterParam: 'query',
|
|
94
|
+
filterComponent: 'filter/string',
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
label: 'Provider',
|
|
98
|
+
valuePath: 'provider',
|
|
99
|
+
resizable: true,
|
|
100
|
+
sortable: true,
|
|
101
|
+
filterable: true,
|
|
102
|
+
filterComponent: 'filter/string',
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
label: 'Status',
|
|
106
|
+
valuePath: 'sync_status',
|
|
107
|
+
cellComponent: 'table/cell/status',
|
|
108
|
+
resizable: true,
|
|
109
|
+
sortable: true,
|
|
110
|
+
filterable: true,
|
|
111
|
+
filterComponent: 'filter/multi-option',
|
|
112
|
+
filterOptions: ['imported', 'matched', 'unmatched', 'reviewed', 'ignored', 'duplicate', 'error'],
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
label: 'Vehicle',
|
|
116
|
+
valuePath: 'vehicle_name',
|
|
117
|
+
resizable: true,
|
|
118
|
+
sortable: false,
|
|
119
|
+
filterable: true,
|
|
120
|
+
filterParam: 'vehicle',
|
|
121
|
+
filterComponent: 'filter/model',
|
|
122
|
+
model: 'vehicle',
|
|
123
|
+
modelNamePath: 'displayName',
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
label: 'Card / Internal',
|
|
127
|
+
valuePath: 'vehicle_card_id',
|
|
128
|
+
resizable: true,
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
label: 'Trip',
|
|
132
|
+
valuePath: 'trip_number',
|
|
133
|
+
resizable: true,
|
|
134
|
+
hidden: true,
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
label: 'Station',
|
|
138
|
+
valuePath: 'station_name',
|
|
139
|
+
resizable: true,
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
label: 'Liters',
|
|
143
|
+
valuePath: 'volume',
|
|
144
|
+
resizable: true,
|
|
145
|
+
sortable: true,
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
label: 'Amount',
|
|
149
|
+
valuePath: 'amount',
|
|
150
|
+
cellComponent: 'table/cell/currency',
|
|
151
|
+
resizable: true,
|
|
152
|
+
sortable: true,
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
label: 'Fuel Report',
|
|
156
|
+
valuePath: 'fuel_report_id',
|
|
157
|
+
cellComponent: 'table/cell/anchor',
|
|
158
|
+
action: this.openFuelReport,
|
|
159
|
+
resizable: true,
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
label: 'Date',
|
|
163
|
+
valuePath: 'transactionAt',
|
|
164
|
+
sortParam: 'transaction_at',
|
|
165
|
+
resizable: true,
|
|
166
|
+
sortable: true,
|
|
167
|
+
filterable: true,
|
|
168
|
+
filterParam: 'transaction_at',
|
|
169
|
+
filterComponent: 'filter/date',
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
label: '',
|
|
173
|
+
cellComponent: 'table/cell/dropdown',
|
|
174
|
+
ddButtonText: false,
|
|
175
|
+
ddButtonIcon: 'ellipsis-h',
|
|
176
|
+
ddButtonIconPrefix: 'fas',
|
|
177
|
+
ddMenuLabel: 'Fuel Transaction Actions',
|
|
178
|
+
cellClassNames: 'overflow-visible',
|
|
179
|
+
wrapperClass: 'flex items-center justify-end mx-2',
|
|
180
|
+
sticky: 'right',
|
|
181
|
+
width: 60,
|
|
182
|
+
actions: [
|
|
183
|
+
{ label: 'Review Details', fn: this.openDetails },
|
|
184
|
+
{ label: 'Open Fuel Report', fn: this.openFuelReport },
|
|
185
|
+
{ separator: true },
|
|
186
|
+
{ label: 'Match to Vehicle', fn: this.matchVehicle },
|
|
187
|
+
{ label: 'Match to Order', fn: this.matchOrder },
|
|
188
|
+
{ label: 'Reprocess / Rematch', fn: (transaction) => this.reprocessTransaction.perform(transaction) },
|
|
189
|
+
{ label: 'Ignore Transaction', fn: (transaction) => this.markReviewed.perform(transaction, 'ignored') },
|
|
190
|
+
{ label: 'Mark Reviewed', fn: (transaction) => this.markReviewed.perform(transaction, 'reviewed') },
|
|
191
|
+
],
|
|
192
|
+
sortable: false,
|
|
193
|
+
filterable: false,
|
|
194
|
+
resizable: false,
|
|
195
|
+
searchable: false,
|
|
196
|
+
},
|
|
197
|
+
];
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
@action openDetails(transaction) {
|
|
201
|
+
return this.hostRouter.transitionTo('console.fleet-ops.management.fuel-transactions.index.details', transaction);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
@action openFuelReport(transaction) {
|
|
205
|
+
if (!transaction?.fuel_report_id) {
|
|
206
|
+
this.notifications.info('This transaction does not have a linked Fuel Report yet.');
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
return this.hostRouter.transitionTo('console.fleet-ops.management.fuel-reports.index.details', transaction.fuel_report_id);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
@action matchVehicle(transaction) {
|
|
214
|
+
return this.hostRouter.transitionTo('console.fleet-ops.management.fuel-transactions.index.details', transaction);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
@action matchOrder(transaction) {
|
|
218
|
+
return this.hostRouter.transitionTo('console.fleet-ops.management.fuel-transactions.index.details', transaction);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
@task *reprocessTransaction(transaction) {
|
|
222
|
+
try {
|
|
223
|
+
yield this.fetch.post(`fuel-provider-transactions/${transaction.id}/reprocess`);
|
|
224
|
+
this.notifications.success('Fuel transaction reprocessed.');
|
|
225
|
+
this.target.send('refresh');
|
|
226
|
+
} catch (error) {
|
|
227
|
+
this.notifications.serverError(error);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
@task *markReviewed(transaction, status) {
|
|
232
|
+
try {
|
|
233
|
+
yield this.fetch.post(`fuel-provider-transactions/${transaction.id}/review`, { status });
|
|
234
|
+
this.notifications.success(status === 'ignored' ? 'Fuel transaction ignored.' : 'Fuel transaction marked reviewed.');
|
|
235
|
+
this.target.send('refresh');
|
|
236
|
+
} catch (error) {
|
|
237
|
+
this.notifications.serverError(error);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import Controller from '@ember/controller';
|
|
2
|
+
import { tracked } from '@glimmer/tracking';
|
|
3
|
+
import { inject as service } from '@ember/service';
|
|
4
|
+
import { action } from '@ember/object';
|
|
5
|
+
import { task } from 'ember-concurrency';
|
|
6
|
+
|
|
7
|
+
export default class ManagementIndexController extends Controller {
|
|
8
|
+
@service fetch;
|
|
9
|
+
@service docsPanel;
|
|
10
|
+
|
|
11
|
+
@tracked hub = null;
|
|
12
|
+
|
|
13
|
+
constructor() {
|
|
14
|
+
super(...arguments);
|
|
15
|
+
this.loadHub.perform();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
get kpis() {
|
|
19
|
+
return (this.hub?.kpis ?? this.loadingKpis).map((kpi) => ({
|
|
20
|
+
...kpi,
|
|
21
|
+
actionLabel: kpi.actionLabel ?? this.kpiActionLabels[kpi.key] ?? `Open ${kpi.label}`,
|
|
22
|
+
}));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
get actions() {
|
|
26
|
+
return (this.hub?.actions ?? []).map((action) => this.normalizeAction(action));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
get sections() {
|
|
30
|
+
return this.hub?.sections ?? [];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
get docs() {
|
|
34
|
+
return (this.hub?.docs ?? []).map((doc) => ({
|
|
35
|
+
...doc,
|
|
36
|
+
description: doc.description ?? this.docDescriptions[doc.slug] ?? '',
|
|
37
|
+
}));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
docDescriptions = {
|
|
41
|
+
'fleet-ops/resources/drivers/overview': 'Create driver profiles, app access, assignment context, and operating status.',
|
|
42
|
+
'fleet-ops/resources/vehicles/overview': 'Track fleet assets, assignment readiness, and vehicle operating details.',
|
|
43
|
+
'fleet-ops/resources/fleets/overview': 'Group drivers and vehicles by team, region, or service coverage.',
|
|
44
|
+
'fleet-ops/resources/contacts/overview': 'Manage people and organizations used across orders and operational records.',
|
|
45
|
+
'fleet-ops/resources/places/overview': 'Manage reusable pickup, dropoff, hub, and facility locations.',
|
|
46
|
+
'fleet-ops/resources/issues/overview': 'Track incidents, service exceptions, and operational follow-up.',
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
kpiActionLabels = {
|
|
50
|
+
drivers: 'Manage Drivers',
|
|
51
|
+
vehicles: 'Track Vehicles',
|
|
52
|
+
issues: 'Review Issues',
|
|
53
|
+
fuel_records: 'Review Fuel Records',
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
normalizeAction(action = {}) {
|
|
57
|
+
const query = action.query && typeof action.query === 'object' && !Array.isArray(action.query) ? action.query : {};
|
|
58
|
+
|
|
59
|
+
return {
|
|
60
|
+
...action,
|
|
61
|
+
query,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
get loadingKpis() {
|
|
66
|
+
return [
|
|
67
|
+
{ key: 'drivers', label: 'Drivers', value: '...', caption: 'Loading resource readiness.', tone: 'blue', icon: 'id-card', route: 'management.drivers' },
|
|
68
|
+
{ key: 'vehicles', label: 'Vehicles', value: '...', caption: 'Loading fleet asset coverage.', tone: 'green', icon: 'truck', route: 'management.vehicles' },
|
|
69
|
+
{ key: 'issues', label: 'Open Issues', value: '...', caption: 'Loading exception health.', tone: 'rose', icon: 'triangle-exclamation', route: 'management.issues' },
|
|
70
|
+
{ key: 'fuel_records', label: 'Fuel Records', value: '...', caption: 'Loading fuel activity.', tone: 'amber', icon: 'gas-pump', route: 'management.fuel-reports' },
|
|
71
|
+
];
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
@action openDocs(link) {
|
|
75
|
+
if (!link?.slug) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return this.docsPanel.open(link.slug, {
|
|
80
|
+
title: link.title ?? link.label,
|
|
81
|
+
source: 'fleet-ops-resources-hub',
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
@task *loadHub() {
|
|
86
|
+
this.hub = yield this.fetch.get('fleet-ops/hubs/resources');
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import Controller from '@ember/controller';
|
|
2
|
+
import { action } from '@ember/object';
|
|
2
3
|
import { inject as service } from '@ember/service';
|
|
3
4
|
import { isArray } from '@ember/array';
|
|
4
5
|
|
|
5
6
|
export default class ManagementVehiclesIndexDetailsController extends Controller {
|
|
6
7
|
@service vehicleActions;
|
|
8
|
+
@service issueActions;
|
|
7
9
|
@service('universe/menu-service') menuService;
|
|
8
10
|
@service hostRouter;
|
|
9
11
|
@service intl;
|
|
@@ -58,6 +60,22 @@ export default class ManagementVehiclesIndexDetailsController extends Controller
|
|
|
58
60
|
fn: () => this.vehicleActions.locate(this.model),
|
|
59
61
|
permission: 'fleet-ops view vehicle',
|
|
60
62
|
},
|
|
63
|
+
{
|
|
64
|
+
text: this.intl.t('vehicle.actions.attach-device'),
|
|
65
|
+
icon: 'link',
|
|
66
|
+
fn: () => this.vehicleActions.attachDevice(this.model),
|
|
67
|
+
permission: 'fleet-ops update vehicle',
|
|
68
|
+
},
|
|
69
|
+
...(Number(this.model.assigned_orders_count) > 0
|
|
70
|
+
? [
|
|
71
|
+
{
|
|
72
|
+
text: this.intl.t('vehicle.actions.unassign-orders'),
|
|
73
|
+
icon: 'truck-ramp-box',
|
|
74
|
+
fn: () => this.vehicleActions.unassignOrders(this.model),
|
|
75
|
+
permission: 'fleet-ops update vehicle',
|
|
76
|
+
},
|
|
77
|
+
]
|
|
78
|
+
: []),
|
|
61
79
|
{
|
|
62
80
|
separator: true,
|
|
63
81
|
},
|
|
@@ -79,6 +97,12 @@ export default class ManagementVehiclesIndexDetailsController extends Controller
|
|
|
79
97
|
fn: () => this.vehicleActions.logMaintenance(this.model),
|
|
80
98
|
permission: 'fleet-ops create maintenance',
|
|
81
99
|
},
|
|
100
|
+
{
|
|
101
|
+
text: this.intl.t('vehicle.actions.create-issue'),
|
|
102
|
+
icon: 'triangle-exclamation',
|
|
103
|
+
fn: () => this.createIssue(this.model),
|
|
104
|
+
permission: 'fleet-ops create issue',
|
|
105
|
+
},
|
|
82
106
|
{
|
|
83
107
|
separator: true,
|
|
84
108
|
},
|
|
@@ -98,4 +122,12 @@ export default class ManagementVehiclesIndexDetailsController extends Controller
|
|
|
98
122
|
},
|
|
99
123
|
];
|
|
100
124
|
}
|
|
125
|
+
|
|
126
|
+
@action createIssue(vehicle) {
|
|
127
|
+
this.issueActions.modal.create({
|
|
128
|
+
vehicle,
|
|
129
|
+
vehicle_uuid: vehicle.id,
|
|
130
|
+
title: this.intl.t('vehicle.prompts.issue-title', { vehicleName: vehicle.displayName ?? vehicle.name }),
|
|
131
|
+
});
|
|
132
|
+
}
|
|
101
133
|
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import Controller from '@ember/controller';
|
|
2
|
+
import { action } from '@ember/object';
|
|
2
3
|
import { inject as service } from '@ember/service';
|
|
3
4
|
import { tracked } from '@glimmer/tracking';
|
|
4
5
|
|
|
5
6
|
export default class ManagementVehiclesIndexController extends Controller {
|
|
6
7
|
@service vehicleActions;
|
|
8
|
+
@service issueActions;
|
|
7
9
|
@service driverActions;
|
|
8
10
|
@service tableContext;
|
|
9
11
|
@service intl;
|
|
@@ -292,6 +294,17 @@ export default class ManagementVehiclesIndexController extends Controller {
|
|
|
292
294
|
fn: this.vehicleActions.locate,
|
|
293
295
|
permission: 'fleet-ops view vehicle',
|
|
294
296
|
},
|
|
297
|
+
{
|
|
298
|
+
label: this.intl.t('vehicle.actions.attach-device'),
|
|
299
|
+
fn: this.vehicleActions.attachDevice,
|
|
300
|
+
permission: 'fleet-ops update vehicle',
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
label: this.intl.t('vehicle.actions.unassign-orders'),
|
|
304
|
+
fn: this.vehicleActions.unassignOrders,
|
|
305
|
+
permission: 'fleet-ops update vehicle',
|
|
306
|
+
isVisible: (vehicle) => Number(vehicle.assigned_orders_count) > 0,
|
|
307
|
+
},
|
|
295
308
|
{
|
|
296
309
|
separator: true,
|
|
297
310
|
},
|
|
@@ -310,6 +323,11 @@ export default class ManagementVehiclesIndexController extends Controller {
|
|
|
310
323
|
fn: this.vehicleActions.logMaintenance,
|
|
311
324
|
permission: 'fleet-ops create maintenance',
|
|
312
325
|
},
|
|
326
|
+
{
|
|
327
|
+
label: this.intl.t('vehicle.actions.create-issue'),
|
|
328
|
+
fn: this.createIssue,
|
|
329
|
+
permission: 'fleet-ops create issue',
|
|
330
|
+
},
|
|
313
331
|
{
|
|
314
332
|
separator: true,
|
|
315
333
|
},
|
|
@@ -326,4 +344,12 @@ export default class ManagementVehiclesIndexController extends Controller {
|
|
|
326
344
|
},
|
|
327
345
|
];
|
|
328
346
|
}
|
|
347
|
+
|
|
348
|
+
@action createIssue(vehicle) {
|
|
349
|
+
this.issueActions.modal.create({
|
|
350
|
+
vehicle,
|
|
351
|
+
vehicle_uuid: vehicle.id,
|
|
352
|
+
title: this.intl.t('vehicle.prompts.issue-title', { vehicleName: vehicle.displayName ?? vehicle.name }),
|
|
353
|
+
});
|
|
354
|
+
}
|
|
329
355
|
}
|
|
@@ -435,4 +435,8 @@ export default class OperationsOrdersIndexController extends Controller {
|
|
|
435
435
|
this.isSearchVisible = false;
|
|
436
436
|
}
|
|
437
437
|
}
|
|
438
|
+
|
|
439
|
+
@action importOrders() {
|
|
440
|
+
return this.orderActions.importOrders({ onImportComplete: this.orderActions.refresh });
|
|
441
|
+
}
|
|
438
442
|
}
|