@fleetbase/fleetops-engine 0.6.51 → 0.6.52
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.js +20 -2
- 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/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 +14 -0
- 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/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/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/payments/index.js +5 -0
- package/addon/extension.js +10 -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/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.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 +310 -34
- 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/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/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/payments/index.hbs +15 -1
- 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/management/fuel-transactions/index/details.js +1 -0
- package/app/controllers/management/fuel-transactions/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/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/services/fuel-integration-actions.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/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/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/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 +76 -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/SensorController.php +1 -1
- package/server/src/Http/Controllers/Internal/v1/TelematicController.php +178 -15
- package/server/src/Http/Controllers/Internal/v1/VehicleController.php +165 -0
- package/server/src/Http/Controllers/TelematicWebhookController.php +103 -19
- 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/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 +36 -6
- 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 +2 -1
- 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 +10 -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 +55 -26
- 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 +41 -4
- package/server/tests/FuelProviderRegistryTest.php +416 -0
- package/server/tests/ServiceRateAlgorithmWeightVariablesTest.php +44 -0
- package/server/tests/TelematicsHardeningTest.php +268 -0
- package/server/tests/VehicleDriverAssignmentTest.php +51 -0
- package/translations/ar-ae.yml +22 -0
- 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 +97 -0
- 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
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
use Fleetbase\FleetOps\Contracts\TelematicProviderDescriptor;
|
|
4
|
+
|
|
5
|
+
test('device event model and migration expose lifecycle fields used by telematics workflows', function () {
|
|
6
|
+
$model = file_get_contents(__DIR__ . '/../src/Models/DeviceEvent.php');
|
|
7
|
+
$migration = file_get_contents(__DIR__ . '/../migrations/2026_06_06_000001_harden_device_events_telematics_contract.php');
|
|
8
|
+
|
|
9
|
+
expect($migration)
|
|
10
|
+
->toContain("'message'")
|
|
11
|
+
->toContain("'occurred_at'")
|
|
12
|
+
->toContain("'processed_at'")
|
|
13
|
+
->toContain("'data'");
|
|
14
|
+
|
|
15
|
+
expect($model)
|
|
16
|
+
->toContain("'message'")
|
|
17
|
+
->toContain("'occurred_at'")
|
|
18
|
+
->toContain("'processed_at'")
|
|
19
|
+
->toContain("'data'")
|
|
20
|
+
->toContain("'occurred_at' => 'datetime'")
|
|
21
|
+
->toContain("'processed_at' => 'datetime'");
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test('webhook controller resolves integrations explicitly and does not select the first provider record', function () {
|
|
25
|
+
$controller = file_get_contents(__DIR__ . '/../src/Http/Controllers/TelematicWebhookController.php');
|
|
26
|
+
|
|
27
|
+
expect($controller)
|
|
28
|
+
->toContain('$this->service->resolveWebhookTelematic($providerKey')
|
|
29
|
+
->toContain("'Unable to resolve telematic integration'")
|
|
30
|
+
->toContain('$result[\'devices\'] ?? []')
|
|
31
|
+
->toContain('$result[\'events\'] ?? []')
|
|
32
|
+
->toContain('$result[\'sensors\'] ?? []')
|
|
33
|
+
->toContain('Ambiguous telematic integration')
|
|
34
|
+
->toContain('validateWebhookSignature($request->getContent(), $signature')
|
|
35
|
+
->not->toContain("Telematic::where('provider', \$providerKey)\n ->when")
|
|
36
|
+
->not->toContain("->first();\n\n if (!\$telematic)");
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test('telematics service requires provider identity and stores idempotent event keys', function () {
|
|
40
|
+
$service = file_get_contents(__DIR__ . '/../src/Support/Telematics/TelematicService.php');
|
|
41
|
+
|
|
42
|
+
expect($service)
|
|
43
|
+
->toContain('Provider device identity is required to link a telematics device.')
|
|
44
|
+
->toContain('DeviceEvent::firstOrNew([\'_key\' => $eventKey])')
|
|
45
|
+
->toContain('protected function makeEventKey')
|
|
46
|
+
->toContain('$telematic->public_id ?? $telematic->uuid')
|
|
47
|
+
->toContain('resolveWebhookTelematic')
|
|
48
|
+
->toContain('whereHas(\'device\'')
|
|
49
|
+
->toContain('meta->provider_account_id');
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test('native providers normalize device payloads to canonical FleetOps keys', function () {
|
|
53
|
+
$afaqy = file_get_contents(__DIR__ . '/../src/Support/Telematics/Providers/AfaqyProvider.php');
|
|
54
|
+
$safee = file_get_contents(__DIR__ . '/../src/Support/Telematics/Providers/SafeeProvider.php');
|
|
55
|
+
|
|
56
|
+
foreach ([$afaqy, $safee] as $provider) {
|
|
57
|
+
expect($provider)
|
|
58
|
+
->toContain("'device_id'")
|
|
59
|
+
->toContain("'name'")
|
|
60
|
+
->toContain("'provider'")
|
|
61
|
+
->toContain("'model'")
|
|
62
|
+
->toContain("'online'")
|
|
63
|
+
->toContain("'last_seen_at'");
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test('telematics details use public id for consumer webhook URLs and do not read ember uuid', function () {
|
|
68
|
+
$component = file_get_contents(__DIR__ . '/../../addon/components/telematic/details.js');
|
|
69
|
+
$template = file_get_contents(__DIR__ . '/../../addon/components/telematic/details.hbs');
|
|
70
|
+
|
|
71
|
+
expect($component)
|
|
72
|
+
->toContain('const id = this.args.resource?.public_id;')
|
|
73
|
+
->toContain('return null;')
|
|
74
|
+
->not->toContain('this.args.resource?.uuid')
|
|
75
|
+
->not->toContain('this.args.resource?.public_id ?? this.args.resource?.id');
|
|
76
|
+
|
|
77
|
+
expect($template)
|
|
78
|
+
->toContain('this.hasWebhookUrl')
|
|
79
|
+
->toContain('Webhook URL unavailable until this integration has a public ID.')
|
|
80
|
+
->toContain('last_sync_job_id')
|
|
81
|
+
->toContain('last_sync_error');
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
test('native telematics providers expose local provider icons with a descriptor fallback', function () {
|
|
85
|
+
$config = include __DIR__ . '/../config/telematics.php';
|
|
86
|
+
$iconPath = '/engines-dist/images/telematics/providers/';
|
|
87
|
+
$providers = array_filter($config['providers'], fn ($provider) => ($provider['type'] ?? 'native') === 'native');
|
|
88
|
+
|
|
89
|
+
foreach ($providers as $provider) {
|
|
90
|
+
$icon = $provider['icon'] ?? null;
|
|
91
|
+
|
|
92
|
+
expect($icon)
|
|
93
|
+
->not->toBeNull()
|
|
94
|
+
->not->toContain('http://')
|
|
95
|
+
->not->toContain('https://');
|
|
96
|
+
|
|
97
|
+
expect(str_starts_with($icon, $iconPath))->toBeTrue();
|
|
98
|
+
expect(str_ends_with($icon, '.webp'))->toBeTrue();
|
|
99
|
+
expect(file_exists(__DIR__ . '/../../assets/images/telematics/providers/' . basename($icon)))->toBeTrue();
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
$safee = collect($providers)->firstWhere('key', 'safee');
|
|
103
|
+
|
|
104
|
+
expect($safee['icon'])->toBe($iconPath . 'safee.webp');
|
|
105
|
+
|
|
106
|
+
$descriptor = new TelematicProviderDescriptor([
|
|
107
|
+
'key' => 'custom',
|
|
108
|
+
'label' => 'Custom',
|
|
109
|
+
]);
|
|
110
|
+
|
|
111
|
+
expect($descriptor->icon)->toBe(TelematicProviderDescriptor::DEFAULT_ICON);
|
|
112
|
+
expect(file_exists(__DIR__ . '/../../assets/images/telematics/providers/default.webp'))->toBeTrue();
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
test('device event mark processed action is routed and company scoped', function () {
|
|
116
|
+
$routes = file_get_contents(__DIR__ . '/../src/routes.php');
|
|
117
|
+
$controller = file_get_contents(__DIR__ . '/../src/Http/Controllers/Internal/v1/DeviceEventController.php');
|
|
118
|
+
|
|
119
|
+
expect($routes)
|
|
120
|
+
->toContain("\$router->fleetbaseRoutes('device-events', function")
|
|
121
|
+
->toContain("'{id}/mark-processed'")
|
|
122
|
+
->toContain("\$controller('markProcessed')");
|
|
123
|
+
|
|
124
|
+
expect($controller)
|
|
125
|
+
->toContain('public function markProcessed(string $id): JsonResponse')
|
|
126
|
+
->toContain("where('company_uuid', session('company'))")
|
|
127
|
+
->toContain("where('uuid', \$id)->orWhere('public_id', \$id)")
|
|
128
|
+
->toContain('$deviceEvent->markAsProcessed()')
|
|
129
|
+
->toContain("'Event was already processed.'");
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
test('afaqy sync stores compact device diagnostics and does not leak token URLs', function () {
|
|
133
|
+
$provider = file_get_contents(__DIR__ . '/../src/Support/Telematics/Providers/AfaqyProvider.php');
|
|
134
|
+
|
|
135
|
+
expect($provider)
|
|
136
|
+
->toContain('compactLastUpdate')
|
|
137
|
+
->toContain("'provider_unit_id'")
|
|
138
|
+
->toContain("'plate_number'")
|
|
139
|
+
->toContain("'capabilities'")
|
|
140
|
+
->not->toContain("'raw' => \$payload")
|
|
141
|
+
->not->toContain("'sensors',")
|
|
142
|
+
->not->toContain("?token=' . urlencode")
|
|
143
|
+
->toContain("'Authorization' => 'Bearer ' . \$token")
|
|
144
|
+
->toContain("array_merge(['token' => \$this->credentials['token']], \$payload)");
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
test('native endpoint fields are advanced optional overrides with provider defaults', function () {
|
|
148
|
+
$config = include __DIR__ . '/../config/telematics.php';
|
|
149
|
+
|
|
150
|
+
$afaqy = collect($config['providers'])->firstWhere('key', 'afaqy');
|
|
151
|
+
$safee = collect($config['providers'])->firstWhere('key', 'safee');
|
|
152
|
+
|
|
153
|
+
$afaqyBaseUrl = collect($afaqy['required_fields'])->firstWhere('name', 'base_url');
|
|
154
|
+
$safeeServerUri = collect($safee['required_fields'])->firstWhere('name', 'server_uri');
|
|
155
|
+
|
|
156
|
+
foreach ([$afaqyBaseUrl, $safeeServerUri] as $field) {
|
|
157
|
+
expect($field['required'])->toBeFalse();
|
|
158
|
+
expect($field['advanced'])->toBeTrue();
|
|
159
|
+
expect($field['is_endpoint'])->toBeTrue();
|
|
160
|
+
expect($field['validation'])->toBe('nullable|url');
|
|
161
|
+
expect($field['default_value'])->not->toBeEmpty();
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
test('telematics activity logging excludes large json and spatial payloads', function () {
|
|
166
|
+
$device = telematics_activity_log_method(file_get_contents(__DIR__ . '/../src/Models/Device.php'));
|
|
167
|
+
$sensor = telematics_activity_log_method(file_get_contents(__DIR__ . '/../src/Models/Sensor.php'));
|
|
168
|
+
$deviceEvent = telematics_activity_log_method(file_get_contents(__DIR__ . '/../src/Models/DeviceEvent.php'));
|
|
169
|
+
|
|
170
|
+
foreach ([$device, $sensor, $deviceEvent] as $model) {
|
|
171
|
+
expect($model)
|
|
172
|
+
->toContain('->logOnly([')
|
|
173
|
+
->toContain('->logOnlyDirty()')
|
|
174
|
+
->not->toContain('return LogOptions::defaults()->logAll();');
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
expect($device)
|
|
178
|
+
->not->toContain("'meta'")
|
|
179
|
+
->not->toContain("'data'")
|
|
180
|
+
->not->toContain("'last_position',");
|
|
181
|
+
|
|
182
|
+
expect($sensor)
|
|
183
|
+
->not->toContain("'meta',")
|
|
184
|
+
->not->toContain("'last_position',");
|
|
185
|
+
|
|
186
|
+
expect($deviceEvent)
|
|
187
|
+
->not->toContain("'payload',")
|
|
188
|
+
->not->toContain("'data',")
|
|
189
|
+
->not->toContain("'location',");
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
test('telematics setup renders endpoint overrides only in advanced settings', function () {
|
|
193
|
+
$formTemplate = file_get_contents(__DIR__ . '/../../addon/components/telematic/form.hbs');
|
|
194
|
+
$settingsTemplate = file_get_contents(__DIR__ . '/../../addon/components/telematic/settings.hbs');
|
|
195
|
+
$formComponent = file_get_contents(__DIR__ . '/../../addon/components/telematic/form.js');
|
|
196
|
+
$settingsComponent = file_get_contents(__DIR__ . '/../../addon/components/telematic/settings.js');
|
|
197
|
+
|
|
198
|
+
foreach ([$formComponent, $settingsComponent] as $component) {
|
|
199
|
+
expect($component)
|
|
200
|
+
->toContain('advancedCredentialFields')
|
|
201
|
+
->toContain('field.advanced || field.is_endpoint')
|
|
202
|
+
->toContain('!field.advanced && !field.is_endpoint');
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
foreach ([$formTemplate, $settingsTemplate] as $template) {
|
|
206
|
+
expect($template)
|
|
207
|
+
->toContain('Advanced connection settings')
|
|
208
|
+
->toContain('this.advancedCredentialFields')
|
|
209
|
+
->toContain('field.default_value');
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
test('telematics details logs are routed and use persisted safe data only', function () {
|
|
214
|
+
$routes = file_get_contents(__DIR__ . '/../src/routes.php');
|
|
215
|
+
$controller = file_get_contents(__DIR__ . '/../src/Http/Controllers/Internal/v1/TelematicController.php');
|
|
216
|
+
|
|
217
|
+
expect($routes)
|
|
218
|
+
->toContain("'{id}/logs'")
|
|
219
|
+
->toContain("\$controller('logs')");
|
|
220
|
+
|
|
221
|
+
expect($controller)
|
|
222
|
+
->toContain('public function logs(Request $request, string $id): JsonResponse')
|
|
223
|
+
->toContain('Activity::with([\'causer\'])')
|
|
224
|
+
->toContain("where('subject_type', Telematic::class)")
|
|
225
|
+
->toContain("where('subject_id', \$telematic->uuid)")
|
|
226
|
+
->toContain("where('company_uuid', session('company'))")
|
|
227
|
+
->toContain('Provider connection details were updated.')
|
|
228
|
+
->toContain('makeTelematicMetadataLogs')
|
|
229
|
+
->toContain('userFacingIssueMessage')
|
|
230
|
+
->toContain('isSensitiveIssueMessage')
|
|
231
|
+
->not->toContain('changed_fields')
|
|
232
|
+
->not->toContain('Str::headline')
|
|
233
|
+
->not->toContain('storage_path')
|
|
234
|
+
->not->toContain('Log::');
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
test('telematics provider status display maps active and connected to connected', function () {
|
|
238
|
+
$indexController = file_get_contents(__DIR__ . '/../../addon/controllers/connectivity/telematics/index.js');
|
|
239
|
+
$detailsController = file_get_contents(__DIR__ . '/../../addon/controllers/connectivity/telematics/details.js');
|
|
240
|
+
$statusCell = file_get_contents(__DIR__ . '/../../addon/components/cell/telematic-status.js');
|
|
241
|
+
|
|
242
|
+
expect($indexController)
|
|
243
|
+
->toContain("cellComponent: 'cell/telematic-status'");
|
|
244
|
+
|
|
245
|
+
expect($detailsController)
|
|
246
|
+
->toContain("case 'active':\n return 'Connected';");
|
|
247
|
+
|
|
248
|
+
expect($statusCell)
|
|
249
|
+
->toContain("case 'active':")
|
|
250
|
+
->toContain("case 'connected':")
|
|
251
|
+
->toContain("return 'Connected';");
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
test('telematics overview attention items render as full width stacked alerts', function () {
|
|
255
|
+
$template = file_get_contents(__DIR__ . '/../../addon/components/telematic/details.hbs');
|
|
256
|
+
|
|
257
|
+
expect($template)
|
|
258
|
+
->toContain('<section class="flex flex-col gap-3">')
|
|
259
|
+
->toContain('class="w-full rounded-md border border-yellow-200 bg-yellow-50 p-3')
|
|
260
|
+
->not->toContain('lg:grid-cols-2');
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
function telematics_activity_log_method(string $model): string
|
|
264
|
+
{
|
|
265
|
+
preg_match('/public function getActivitylogOptions\(\): LogOptions\s+\{(?P<body>.*?)\n \}/s', $model, $matches);
|
|
266
|
+
|
|
267
|
+
return $matches['body'] ?? '';
|
|
268
|
+
}
|
|
@@ -16,3 +16,54 @@ test('vehicle updates preserve driver assignment unless driver input is explicit
|
|
|
16
16
|
->toContain('public function unassignDriver(): self')
|
|
17
17
|
->toContain("Driver::where('vehicle_uuid', \$this->uuid)->update(['vehicle_uuid' => null])");
|
|
18
18
|
});
|
|
19
|
+
|
|
20
|
+
test('driver assigned-order workflows expose list and multi-unassign endpoints', function () {
|
|
21
|
+
$routes = file_get_contents(dirname(__DIR__) . '/src/routes.php');
|
|
22
|
+
$controller = file_get_contents(dirname(__DIR__) . '/src/Http/Controllers/Internal/v1/DriverController.php');
|
|
23
|
+
$resource = file_get_contents(dirname(__DIR__) . '/src/Http/Resources/v1/Driver.php');
|
|
24
|
+
$index = file_get_contents(dirname(__DIR__) . '/src/Http/Resources/v1/Index/Driver.php');
|
|
25
|
+
|
|
26
|
+
expect($routes)
|
|
27
|
+
->toContain("\$router->get('{id}/assigned-orders', \$controller('assignedOrders'))")
|
|
28
|
+
->toContain("\$router->post('{id}/unassign-orders', \$controller('unassignOrders'))")
|
|
29
|
+
->and($controller)
|
|
30
|
+
->toContain('public function assignedOrders(string $id): JsonResponse')
|
|
31
|
+
->toContain('public function unassignOrders(Request $request, string $id): JsonResponse')
|
|
32
|
+
->toContain("->where('driver_assigned_uuid', \$driver->uuid)")
|
|
33
|
+
->toContain("->orderByRaw('uuid = ? desc', [\$driver->current_job_uuid])")
|
|
34
|
+
->toContain("\$request->validate(['orders' => ['required', 'array', 'min:1']])")
|
|
35
|
+
->toContain("->where('driver_assigned_uuid', \$driver->uuid)")
|
|
36
|
+
->toContain("->whereIn('uuid', \$selectedOrderUuids)")
|
|
37
|
+
->toContain("->update(['driver_assigned_uuid' => null])")
|
|
38
|
+
->toContain("if (\$driver->current_job_uuid && \$orders->contains('uuid', \$driver->current_job_uuid))")
|
|
39
|
+
->toContain("\$driver->update(['current_job_uuid' => null])")
|
|
40
|
+
->and($resource)
|
|
41
|
+
->toContain("'assigned_orders_count'")
|
|
42
|
+
->toContain("'current_order_reference'")
|
|
43
|
+
->and($index)
|
|
44
|
+
->toContain("'assigned_orders_count'");
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test('vehicle assigned-order workflows expose list and multi-unassign endpoints without clearing driver vehicle assignment', function () {
|
|
48
|
+
$routes = file_get_contents(dirname(__DIR__) . '/src/routes.php');
|
|
49
|
+
$controller = file_get_contents(dirname(__DIR__) . '/src/Http/Controllers/Internal/v1/VehicleController.php');
|
|
50
|
+
$resource = file_get_contents(dirname(__DIR__) . '/src/Http/Resources/v1/Vehicle.php');
|
|
51
|
+
$index = file_get_contents(dirname(__DIR__) . '/src/Http/Resources/v1/Index/Vehicle.php');
|
|
52
|
+
|
|
53
|
+
expect($routes)
|
|
54
|
+
->toContain("\$router->get('{id}/assigned-orders', \$controller('assignedOrders'))")
|
|
55
|
+
->toContain("\$router->post('{id}/unassign-orders', \$controller('unassignOrders'))")
|
|
56
|
+
->and($controller)
|
|
57
|
+
->toContain('public function assignedOrders(string $id): JsonResponse')
|
|
58
|
+
->toContain('public function unassignOrders(Request $request, string $id): JsonResponse')
|
|
59
|
+
->toContain("->where('vehicle_assigned_uuid', \$vehicle->uuid)")
|
|
60
|
+
->toContain("\$request->validate(['orders' => ['required', 'array', 'min:1']])")
|
|
61
|
+
->toContain("->whereIn('uuid', \$selectedOrderUuids)")
|
|
62
|
+
->toContain("->update(['vehicle_assigned_uuid' => null])")
|
|
63
|
+
->not->toContain("->update(['vehicle_uuid' => null])")
|
|
64
|
+
->and($resource)
|
|
65
|
+
->toContain("'assigned_orders_count'")
|
|
66
|
+
->toContain("'current_order_reference'")
|
|
67
|
+
->and($index)
|
|
68
|
+
->toContain("'assigned_orders_count'");
|
|
69
|
+
});
|
package/translations/ar-ae.yml
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
menu:
|
|
2
|
+
fuel-providers: تكاملات الوقود
|
|
3
|
+
fuel-transactions: معاملات الوقود
|
|
4
|
+
|
|
1
5
|
fleet-ops:
|
|
2
6
|
extension-name: Fleet-Ops
|
|
3
7
|
common:
|
|
@@ -309,10 +313,12 @@ fleet-ops:
|
|
|
309
313
|
contacts: جهات الاتصال
|
|
310
314
|
places: الأماكن
|
|
311
315
|
fuel-reports: تقارير الوقود
|
|
316
|
+
fuel-transactions: معاملات الوقود
|
|
312
317
|
issues: القضايا
|
|
313
318
|
title: إنشاء طلب جديد
|
|
314
319
|
settings: الإعدادات
|
|
315
320
|
order-config: تكوين الطلب
|
|
321
|
+
fuel-providers: تكاملات الوقود
|
|
316
322
|
live-map-drawer:
|
|
317
323
|
driver-listing:
|
|
318
324
|
location: الموقع
|
|
@@ -1612,3 +1618,19 @@ scheduler:
|
|
|
1612
1618
|
reason: Reason
|
|
1613
1619
|
reason-placeholder: e.g. Personal appointment
|
|
1614
1620
|
notes-placeholder: Optional additional notes
|
|
1621
|
+
|
|
1622
|
+
order:
|
|
1623
|
+
card:
|
|
1624
|
+
linked-order: Linked Order
|
|
1625
|
+
unknown-order: Unknown order
|
|
1626
|
+
no-type: No type
|
|
1627
|
+
pickup: Pickup
|
|
1628
|
+
dropoff: Dropoff
|
|
1629
|
+
return: Return
|
|
1630
|
+
waypoints: Waypoints
|
|
1631
|
+
additional-stop: additional stop
|
|
1632
|
+
additional-stops: additional stops
|
|
1633
|
+
no-pickup-address: No pickup address
|
|
1634
|
+
no-dropoff-address: No dropoff address
|
|
1635
|
+
no-route-details: No route details available.
|
|
1636
|
+
no-order-linked: No order is linked to this issue.
|
package/translations/bg-bg.yaml
CHANGED
|
@@ -46,6 +46,7 @@ common:
|
|
|
46
46
|
overview: Overview
|
|
47
47
|
notes: Notes
|
|
48
48
|
schedule: Schedule
|
|
49
|
+
current-job: Current Job
|
|
49
50
|
menu:
|
|
50
51
|
operations: Операции
|
|
51
52
|
dashboard: Табло
|
|
@@ -61,6 +62,7 @@ menu:
|
|
|
61
62
|
contacts: Контакти
|
|
62
63
|
places: Места
|
|
63
64
|
fuel-reports: Доклади за гориво
|
|
65
|
+
fuel-transactions: Транзакции за гориво
|
|
64
66
|
issues: Проблеми
|
|
65
67
|
maintenance: Поддръжка
|
|
66
68
|
work-orders: Работни поръчки
|
|
@@ -68,6 +70,7 @@ menu:
|
|
|
68
70
|
parts: Части
|
|
69
71
|
connectivity: Свързаност
|
|
70
72
|
telematics: Телематика
|
|
73
|
+
fuel-providers: Интеграции за гориво
|
|
71
74
|
devices: Устройства
|
|
72
75
|
sensors: Сензори
|
|
73
76
|
events: Събития
|
|
@@ -410,9 +413,30 @@ driver:
|
|
|
410
413
|
driver-license: Шофьорска книжка
|
|
411
414
|
no-vehicle-assigned: Няма зададено превозно средство
|
|
412
415
|
actions:
|
|
416
|
+
unassign-orders: Unassign Orders
|
|
417
|
+
unassign-vehicle: Unassign Vehicle
|
|
418
|
+
create-issue: Create Issue
|
|
413
419
|
assign-order: Присвояване на поръчка на шофьор
|
|
414
420
|
assign-vehicle: Присвояване на превозно средство на шофьор
|
|
415
421
|
locate-driver: Намери шофьора на картата
|
|
422
|
+
prompts:
|
|
423
|
+
assign-order-success: Order assigned to {driverName}.
|
|
424
|
+
assign-order-title: "Assign order to {driverName}"
|
|
425
|
+
select-order-warning: "Select an order to assign."
|
|
426
|
+
assign-vehicle-title: "Assign vehicle to {driverName}"
|
|
427
|
+
assign-vehicle-success: "Vehicle assigned to {driverName}."
|
|
428
|
+
select-vehicle-warning: Select a vehicle to assign.
|
|
429
|
+
no-assigned-orders-warning: No assigned orders found for {driverName}.
|
|
430
|
+
select-orders-warning: Select at least one order to unassign.
|
|
431
|
+
unassign-orders-title: Unassign orders from {driverName}
|
|
432
|
+
confirm-unassign-orders-title: Unassign {count} order(s) from {driverName}?
|
|
433
|
+
confirm-unassign-orders-body: "This will remove {driverName} from these orders: {orders}."
|
|
434
|
+
unassign-orders-success: Unassigned {driverName} from {count} order(s).
|
|
435
|
+
no-vehicle-assigned-warning: No vehicle is assigned to {driverName}.
|
|
436
|
+
unassign-vehicle-title: Unassign {vehicleName} from {driverName}?
|
|
437
|
+
unassign-vehicle-body: This removes {driverName} from {vehicleName}. Order assignments are not changed.
|
|
438
|
+
unassign-vehicle-success: Unassigned {vehicleName} from {driverName}.
|
|
439
|
+
issue-title: Issue reported for {driverName}
|
|
416
440
|
device:
|
|
417
441
|
fields:
|
|
418
442
|
title: Детайли за устройството
|
|
@@ -445,6 +469,18 @@ device:
|
|
|
445
469
|
warranty: Гаранция
|
|
446
470
|
warranty-placeholder: Изберете гаранция
|
|
447
471
|
notes: Бележки
|
|
472
|
+
actions:
|
|
473
|
+
attach-to-vehicle: Attach to Vehicle
|
|
474
|
+
detach-from-vehicle: Detach from Vehicle
|
|
475
|
+
prompts:
|
|
476
|
+
attach-to-vehicle-title: Attach device to vehicle
|
|
477
|
+
attach-device-to-vehicle-title: "Attach {deviceName} to vehicle"
|
|
478
|
+
select-vehicle-warning: Select a vehicle to attach this device to.
|
|
479
|
+
attach-to-vehicle-success: Device attached to vehicle.
|
|
480
|
+
not-attached-warning: "{deviceName} is not attached to a vehicle."
|
|
481
|
+
detach-from-vehicle-title: "Detach {deviceName} from vehicle?"
|
|
482
|
+
detach-from-vehicle-body: "This detaches {deviceName} from {vehicleName} and stops vehicle telemetry updates until it is attached again."
|
|
483
|
+
detach-from-vehicle-success: Device detached from vehicle.
|
|
448
484
|
entity:
|
|
449
485
|
fields:
|
|
450
486
|
declare: Декларирай
|
|
@@ -495,7 +531,15 @@ fleet:
|
|
|
495
531
|
add-vehicle: Добавяне на превозно средство към флота
|
|
496
532
|
loading-message: Зареждане на превозни средства във флота...
|
|
497
533
|
actions:
|
|
534
|
+
assign-vehicle: Assign Vehicle to Fleet
|
|
498
535
|
assign-driver: Присвояване на шофьор към флота
|
|
536
|
+
prompts:
|
|
537
|
+
assign-driver-title: Assign driver to {fleetName}
|
|
538
|
+
assign-vehicle-title: Assign vehicle to {fleetName}
|
|
539
|
+
select-driver-warning: Select a driver to assign.
|
|
540
|
+
select-vehicle-warning: Select a vehicle to assign.
|
|
541
|
+
assign-driver-success: Driver assigned to {fleetName}.
|
|
542
|
+
assign-vehicle-success: Vehicle assigned to {fleetName}.
|
|
499
543
|
fuel-report:
|
|
500
544
|
fields:
|
|
501
545
|
details: Детайли за доклада за гориво
|
|
@@ -524,6 +568,20 @@ issue:
|
|
|
524
568
|
tags: Етикети на проблема
|
|
525
569
|
type: Тип на проблема
|
|
526
570
|
order:
|
|
571
|
+
card:
|
|
572
|
+
linked-order: Linked Order
|
|
573
|
+
unknown-order: Unknown order
|
|
574
|
+
no-type: No type
|
|
575
|
+
pickup: Pickup
|
|
576
|
+
dropoff: Dropoff
|
|
577
|
+
return: Return
|
|
578
|
+
waypoints: Waypoints
|
|
579
|
+
additional-stop: additional stop
|
|
580
|
+
additional-stops: additional stops
|
|
581
|
+
no-pickup-address: No pickup address
|
|
582
|
+
no-dropoff-address: No dropoff address
|
|
583
|
+
no-route-details: No route details available.
|
|
584
|
+
no-order-linked: No order is linked to this issue.
|
|
527
585
|
fields:
|
|
528
586
|
ad-hoc: Спонтанен
|
|
529
587
|
ad-hoc-help-text: Активирането на Ad-Hoc ще позволи на поръчката интелигентно
|
|
@@ -958,7 +1016,21 @@ vehicle:
|
|
|
958
1016
|
vin-number: VIN номер
|
|
959
1017
|
year: Година
|
|
960
1018
|
actions:
|
|
1019
|
+
attach-device: Attach Device
|
|
1020
|
+
unassign-orders: Unassign Orders
|
|
1021
|
+
create-issue: Create Issue
|
|
961
1022
|
locate-vehicle: Намери превозното средство на картата
|
|
1023
|
+
prompts:
|
|
1024
|
+
attach-device-title: Attach device to {vehicleName}
|
|
1025
|
+
select-device-warning: Select a device to attach.
|
|
1026
|
+
attach-device-success: Device attached to {vehicleName}.
|
|
1027
|
+
no-assigned-orders-warning: No assigned orders found for {vehicleName}.
|
|
1028
|
+
select-orders-warning: Select at least one order to unassign.
|
|
1029
|
+
unassign-orders-title: Unassign orders from {vehicleName}
|
|
1030
|
+
confirm-unassign-orders-title: Unassign {count} order(s) from {vehicleName}?
|
|
1031
|
+
confirm-unassign-orders-body: "This will remove {vehicleName} from these orders: {orders}."
|
|
1032
|
+
unassign-orders-success: Unassigned {vehicleName} from {count} order(s).
|
|
1033
|
+
issue-title: Issue reported for {vehicleName}
|
|
962
1034
|
vendor:
|
|
963
1035
|
fields:
|
|
964
1036
|
setup-vendor: Настройка на доставчик
|
package/translations/en-us.yaml
CHANGED
|
@@ -40,6 +40,7 @@ common:
|
|
|
40
40
|
activity: Activity
|
|
41
41
|
eta: ETA
|
|
42
42
|
position: Position
|
|
43
|
+
positions: Positions
|
|
43
44
|
pos: POS
|
|
44
45
|
edit-address: Edit Address
|
|
45
46
|
new-address: New Address
|
|
@@ -74,6 +75,7 @@ menu:
|
|
|
74
75
|
contacts: Contacts
|
|
75
76
|
places: Places
|
|
76
77
|
fuel-reports: Fuel Reports
|
|
78
|
+
fuel-transactions: Fuel Transactions
|
|
77
79
|
issues: Issues
|
|
78
80
|
maintenance: Maintenance
|
|
79
81
|
schedules: Schedules
|
|
@@ -83,6 +85,7 @@ menu:
|
|
|
83
85
|
maintenance-history: Maintenance History
|
|
84
86
|
connectivity: Connectivity
|
|
85
87
|
telematics: Telematics
|
|
88
|
+
fuel-providers: Fuel Integrations
|
|
86
89
|
devices: Devices
|
|
87
90
|
sensors: Sensors
|
|
88
91
|
events: Events
|
|
@@ -441,10 +444,31 @@ driver:
|
|
|
441
444
|
license-expiry: License Expiry
|
|
442
445
|
no-vehicle-assigned: No Vehicle Assigned
|
|
443
446
|
actions:
|
|
447
|
+
unassign-orders: Unassign Orders
|
|
448
|
+
unassign-vehicle: Unassign Vehicle
|
|
449
|
+
create-issue: Create Issue
|
|
444
450
|
assign-order: Assign Order to Driver
|
|
445
451
|
assign-vehicle: Assign Vehicle to Driver
|
|
446
452
|
locate-driver: Locate Driver on Map
|
|
447
453
|
|
|
454
|
+
prompts:
|
|
455
|
+
assign-order-title: "Assign order to {driverName}"
|
|
456
|
+
assign-order-success: Order assigned to {driverName}.
|
|
457
|
+
select-order-warning: "Select an order to assign."
|
|
458
|
+
assign-vehicle-title: "Assign vehicle to {driverName}"
|
|
459
|
+
assign-vehicle-success: "Vehicle assigned to {driverName}."
|
|
460
|
+
select-vehicle-warning: Select a vehicle to assign.
|
|
461
|
+
no-assigned-orders-warning: No assigned orders found for {driverName}.
|
|
462
|
+
select-orders-warning: Select at least one order to unassign.
|
|
463
|
+
unassign-orders-title: Unassign orders from {driverName}
|
|
464
|
+
confirm-unassign-orders-title: Unassign {count} order(s) from {driverName}?
|
|
465
|
+
confirm-unassign-orders-body: "This will remove {driverName} from these orders: {orders}."
|
|
466
|
+
unassign-orders-success: Unassigned {driverName} from {count} order(s).
|
|
467
|
+
no-vehicle-assigned-warning: No vehicle is assigned to {driverName}.
|
|
468
|
+
unassign-vehicle-title: Unassign {vehicleName} from {driverName}?
|
|
469
|
+
unassign-vehicle-body: This removes {driverName} from {vehicleName}. Order assignments are not changed.
|
|
470
|
+
unassign-vehicle-success: Unassigned {vehicleName} from {driverName}.
|
|
471
|
+
issue-title: Issue reported for {driverName}
|
|
448
472
|
device:
|
|
449
473
|
fields:
|
|
450
474
|
title: Device Details
|
|
@@ -479,6 +503,29 @@ device:
|
|
|
479
503
|
notes: Notes
|
|
480
504
|
notes-placeholder: Notes
|
|
481
505
|
|
|
506
|
+
actions:
|
|
507
|
+
attach-device: Attach Device
|
|
508
|
+
attach-to-vehicle: Attach to Vehicle
|
|
509
|
+
detach-from-vehicle: Detach from Vehicle
|
|
510
|
+
prompts:
|
|
511
|
+
attach-to-vehicle-title: Attach device to vehicle
|
|
512
|
+
attach-device-to-vehicle-title: "Attach {deviceName} to vehicle"
|
|
513
|
+
select-vehicle-warning: Select a vehicle to attach this device to.
|
|
514
|
+
attach-to-vehicle-success: Device attached to vehicle.
|
|
515
|
+
not-attached-warning: "{deviceName} is not attached to a vehicle."
|
|
516
|
+
detach-from-vehicle-title: "Detach {deviceName} from vehicle?"
|
|
517
|
+
detach-from-vehicle-body: "This detaches {deviceName} from {vehicleName} and stops vehicle telemetry updates until it is attached again."
|
|
518
|
+
detach-from-vehicle-success: Device detached from vehicle.
|
|
519
|
+
select-device-to-attach-title: "Select device to attach to {resourceName}"
|
|
520
|
+
confirm-attach-device: "Confirm & Attach Device"
|
|
521
|
+
attach-device-success: Device attached successfully.
|
|
522
|
+
detach-from-resource-title: "Detach {deviceName} from {resourceName}?"
|
|
523
|
+
detach-from-resource-body: "This detaches {deviceName} from {resourceName} and stops telemetry updates and events for this {resourceType}."
|
|
524
|
+
detach-from-resource-success: "Detached {deviceName} from {resourceName}."
|
|
525
|
+
detach-telematic-device-title: "Detach {deviceName} from vehicle?"
|
|
526
|
+
detach-telematic-device-body: "{deviceName} will remain synced from the provider but will no longer be mapped to a vehicle."
|
|
527
|
+
no-devices-attached-title: No Devices Attached
|
|
528
|
+
no-devices-attached-body: "Click Attach Device above to start receiving telematic data for this {resourceType}."
|
|
482
529
|
entity:
|
|
483
530
|
fields:
|
|
484
531
|
declare: Declare
|
|
@@ -530,8 +577,16 @@ fleet:
|
|
|
530
577
|
add-vehicle: Add vehicle to fleet
|
|
531
578
|
loading-message: Loading fleet vehicle...
|
|
532
579
|
actions:
|
|
580
|
+
assign-vehicle: Assign Vehicle to Fleet
|
|
533
581
|
assign-driver: Assign Driver to Fleet
|
|
534
582
|
|
|
583
|
+
prompts:
|
|
584
|
+
assign-driver-title: Assign driver to {fleetName}
|
|
585
|
+
assign-vehicle-title: Assign vehicle to {fleetName}
|
|
586
|
+
select-driver-warning: Select a driver to assign.
|
|
587
|
+
select-vehicle-warning: Select a vehicle to assign.
|
|
588
|
+
assign-driver-success: Driver assigned to {fleetName}.
|
|
589
|
+
assign-vehicle-success: Vehicle assigned to {fleetName}.
|
|
535
590
|
fuel-report:
|
|
536
591
|
fields:
|
|
537
592
|
details: Fuel Report Details
|
|
@@ -562,6 +617,20 @@ issue:
|
|
|
562
617
|
type: Issue Type
|
|
563
618
|
|
|
564
619
|
order:
|
|
620
|
+
card:
|
|
621
|
+
linked-order: Linked Order
|
|
622
|
+
unknown-order: Unknown order
|
|
623
|
+
no-type: No type
|
|
624
|
+
pickup: Pickup
|
|
625
|
+
dropoff: Dropoff
|
|
626
|
+
return: Return
|
|
627
|
+
waypoints: Waypoints
|
|
628
|
+
additional-stop: additional stop
|
|
629
|
+
additional-stops: additional stops
|
|
630
|
+
no-pickup-address: No pickup address
|
|
631
|
+
no-dropoff-address: No dropoff address
|
|
632
|
+
no-route-details: No route details available.
|
|
633
|
+
no-order-linked: No order is linked to this issue.
|
|
565
634
|
fields:
|
|
566
635
|
ad-hoc: Ad-Hoc
|
|
567
636
|
ad-hoc-help-text: Toggling Ad-Hoc will enable the order to intelligently ping drivers within the order pickup vicinity about the order allowing the first available driver to accept the order. This is an alternative to manually assigning the driver for real-time orders.
|
|
@@ -949,11 +1018,25 @@ vehicle:
|
|
|
949
1018
|
vin-number: VIN Number
|
|
950
1019
|
year: Year
|
|
951
1020
|
actions:
|
|
1021
|
+
attach-device: Attach Device
|
|
1022
|
+
unassign-orders: Unassign Orders
|
|
1023
|
+
create-issue: Create Issue
|
|
952
1024
|
locate-vehicle: Locate Vehicle on Map
|
|
953
1025
|
schedule-maintenance: Schedule Maintenance
|
|
954
1026
|
create-work-order: Create Work Order
|
|
955
1027
|
log-maintenance: Log Maintenance
|
|
956
1028
|
|
|
1029
|
+
prompts:
|
|
1030
|
+
attach-device-title: Attach device to {vehicleName}
|
|
1031
|
+
select-device-warning: Select a device to attach.
|
|
1032
|
+
attach-device-success: Device attached to {vehicleName}.
|
|
1033
|
+
no-assigned-orders-warning: No assigned orders found for {vehicleName}.
|
|
1034
|
+
select-orders-warning: Select at least one order to unassign.
|
|
1035
|
+
unassign-orders-title: Unassign orders from {vehicleName}
|
|
1036
|
+
confirm-unassign-orders-title: Unassign {count} order(s) from {vehicleName}?
|
|
1037
|
+
confirm-unassign-orders-body: "This will remove {vehicleName} from these orders: {orders}."
|
|
1038
|
+
unassign-orders-success: Unassigned {vehicleName} from {count} order(s).
|
|
1039
|
+
issue-title: Issue reported for {vehicleName}
|
|
957
1040
|
vendor:
|
|
958
1041
|
fields:
|
|
959
1042
|
setup-vendor: Setup Vendor
|