@fleetbase/fleetops-engine 0.6.68 → 0.6.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (294) hide show
  1. package/RELEASE.md +44 -9
  2. package/addon/components/admin/telematics-settings.hbs +143 -0
  3. package/addon/components/admin/telematics-settings.js +145 -0
  4. package/addon/components/contact/form.hbs +13 -2
  5. package/addon/components/customer/details.hbs +17 -17
  6. package/addon/components/customer/form.hbs +13 -2
  7. package/addon/components/customer/form.js +0 -56
  8. package/addon/components/driver/details.hbs +13 -19
  9. package/addon/components/driver/form.hbs +20 -35
  10. package/addon/components/driver/form.js +0 -58
  11. package/addon/components/fuel-integration/hub.hbs +1 -1
  12. package/addon/components/layout/fleet-ops-sidebar.js +37 -17
  13. package/addon/components/map/leaflet-live-map.hbs +4 -242
  14. package/addon/components/map/leaflet-live-map.js +2 -1
  15. package/addon/components/map/marker-card/driver.hbs +57 -0
  16. package/addon/components/map/marker-card/driver.js +3 -0
  17. package/addon/components/map/marker-card/vehicle.hbs +78 -0
  18. package/addon/components/map/marker-card/vehicle.js +3 -0
  19. package/addon/components/modals/driver-form.hbs +2 -2
  20. package/addon/components/modals/reset-profile-credentials.hbs +23 -0
  21. package/addon/components/modals/reset-profile-credentials.js +70 -0
  22. package/addon/components/profile-identity-hint.hbs +13 -0
  23. package/addon/components/profile-identity-hint.js +49 -0
  24. package/addon/components/telematic/hub.hbs +1 -1
  25. package/addon/components/widget/live-fleet.hbs +8 -40
  26. package/addon/controllers/analytics/reports/index.js +5 -0
  27. package/addon/controllers/connectivity/devices/index.js +4 -0
  28. package/addon/controllers/connectivity/fuel-providers/index.js +6 -4
  29. package/addon/controllers/connectivity/sensors/index.js +4 -0
  30. package/addon/controllers/connectivity/telematics/index.js +4 -0
  31. package/addon/controllers/maintenance/equipment/index.js +11 -4
  32. package/addon/controllers/maintenance/inspection-forms/index.js +2 -2
  33. package/addon/controllers/maintenance/inspection-submissions/index.js +8 -2
  34. package/addon/controllers/maintenance/maintenances/index.js +4 -0
  35. package/addon/controllers/maintenance/parts/index.js +11 -4
  36. package/addon/controllers/maintenance/schedules/index.js +17 -4
  37. package/addon/controllers/maintenance/work-orders/index.js +11 -4
  38. package/addon/controllers/management/contacts/index.js +4 -0
  39. package/addon/controllers/management/drivers/index.js +8 -0
  40. package/addon/controllers/management/fleets/index.js +4 -0
  41. package/addon/controllers/management/fuel-reports/index.js +4 -0
  42. package/addon/controllers/management/fuel-transactions/index.js +9 -7
  43. package/addon/controllers/management/issues/index.js +4 -0
  44. package/addon/controllers/management/places/index.js +4 -0
  45. package/addon/controllers/management/vehicles/index.js +4 -0
  46. package/addon/controllers/management/vendors/index.js +4 -0
  47. package/addon/controllers/operations/orders/index/details.js +30 -1
  48. package/addon/controllers/operations/orders/index.js +7 -0
  49. package/addon/controllers/operations/service-rates/index.js +3 -0
  50. package/addon/controllers/settings/index.js +13 -0
  51. package/addon/controllers/settings/telematics.js +113 -0
  52. package/addon/extension.js +42 -8
  53. package/addon/routes/analytics/index.js +14 -1
  54. package/addon/routes/analytics/reports/index/details.js +1 -1
  55. package/addon/routes/analytics/reports/index/edit.js +1 -1
  56. package/addon/routes/analytics/reports/index/new.js +14 -1
  57. package/addon/routes/analytics/reports.js +14 -1
  58. package/addon/routes/connectivity/devices/index/new.js +14 -1
  59. package/addon/routes/connectivity/devices.js +14 -1
  60. package/addon/routes/connectivity/events.js +14 -1
  61. package/addon/routes/connectivity/fuel-providers/details/transactions.js +12 -0
  62. package/addon/routes/connectivity/fuel-providers/details.js +9 -0
  63. package/addon/routes/connectivity/fuel-providers/edit.js +9 -0
  64. package/addon/routes/connectivity/fuel-providers/new.js +14 -1
  65. package/addon/routes/connectivity/fuel-providers.js +14 -1
  66. package/addon/routes/connectivity/sensors/index/new.js +14 -1
  67. package/addon/routes/connectivity/sensors.js +14 -1
  68. package/addon/routes/connectivity/telematics/new.js +14 -1
  69. package/addon/routes/connectivity/telematics.js +14 -1
  70. package/addon/routes/connectivity/tracking.js +14 -1
  71. package/addon/routes/maintenance/equipment/index/details.js +2 -2
  72. package/addon/routes/maintenance/equipment/index/edit.js +2 -2
  73. package/addon/routes/maintenance/equipment/index/new.js +14 -1
  74. package/addon/routes/maintenance/equipment.js +14 -1
  75. package/addon/routes/maintenance/index.js +14 -1
  76. package/addon/routes/maintenance/inspection-forms/index/details.js +10 -1
  77. package/addon/routes/maintenance/inspection-forms/index/edit.js +10 -1
  78. package/addon/routes/maintenance/inspection-forms/index/new.js +14 -1
  79. package/addon/routes/maintenance/inspection-forms.js +14 -1
  80. package/addon/routes/maintenance/inspection-submissions/index/details.js +10 -1
  81. package/addon/routes/maintenance/inspection-submissions/index/edit.js +10 -1
  82. package/addon/routes/maintenance/inspection-submissions/index/new.js +14 -1
  83. package/addon/routes/maintenance/inspection-submissions.js +14 -1
  84. package/addon/routes/maintenance/maintenances/index/details.js +2 -2
  85. package/addon/routes/maintenance/maintenances/index/edit.js +2 -2
  86. package/addon/routes/maintenance/maintenances/index/new.js +14 -1
  87. package/addon/routes/maintenance/maintenances.js +14 -1
  88. package/addon/routes/maintenance/parts/index/details.js +2 -2
  89. package/addon/routes/maintenance/parts/index/edit.js +2 -2
  90. package/addon/routes/maintenance/parts/index/new.js +14 -1
  91. package/addon/routes/maintenance/parts.js +14 -1
  92. package/addon/routes/maintenance/schedules/index/details.js +2 -2
  93. package/addon/routes/maintenance/schedules/index/edit.js +2 -2
  94. package/addon/routes/maintenance/schedules/index/new.js +15 -1
  95. package/addon/routes/maintenance/schedules.js +15 -1
  96. package/addon/routes/maintenance/work-orders/index/details.js +2 -2
  97. package/addon/routes/maintenance/work-orders/index/edit.js +2 -2
  98. package/addon/routes/maintenance/work-orders/index/new.js +14 -1
  99. package/addon/routes/maintenance/work-orders.js +14 -1
  100. package/addon/routes/management/fuel-transactions/index/details.js +9 -0
  101. package/addon/routes/management/fuel-transactions.js +14 -1
  102. package/addon/routes/management/index.js +13 -0
  103. package/addon/routes/management/trailers.js +16 -0
  104. package/addon/routes/management/vendors/integrated/details.js +14 -1
  105. package/addon/routes/management/vendors/integrated/edit.js +14 -1
  106. package/addon/routes/management/vendors/integrated/new.js +14 -1
  107. package/addon/routes/management/vendors/integrated.js +14 -1
  108. package/addon/routes/operations/orders.js +40 -1
  109. package/addon/routes/operations/routes/index/details.js +14 -1
  110. package/addon/routes/operations/routes/index/new.js +13 -0
  111. package/addon/routes/operations/routes.js +14 -1
  112. package/addon/routes/operations/service-rates/index/new.js +11 -0
  113. package/addon/routes/operations/service-rates.js +14 -1
  114. package/addon/routes/settings/avatars.js +14 -1
  115. package/addon/routes/settings/custom-fields.js +14 -1
  116. package/addon/routes/settings/map.js +14 -1
  117. package/addon/routes/settings/notifications.js +11 -0
  118. package/addon/routes/settings/orchestrator.js +1 -1
  119. package/addon/routes/settings/payments/index.js +1 -1
  120. package/addon/routes/settings/routing.js +14 -1
  121. package/addon/routes/settings/scheduling.js +14 -1
  122. package/addon/routes/settings/telematics.js +21 -0
  123. package/addon/routes/virtual.js +11 -0
  124. package/addon/routes.js +1 -0
  125. package/addon/services/contact-actions.js +50 -89
  126. package/addon/services/driver-actions.js +98 -0
  127. package/addon/templates/settings/telematics.hbs +70 -0
  128. package/addon/utils/profile-login-actions.js +172 -0
  129. package/app/components/admin/telematics-settings.js +1 -0
  130. package/app/components/{modals/reset-customer-credentials.js → map/marker-card/driver.js} +1 -1
  131. package/app/components/map/marker-card/vehicle.js +1 -0
  132. package/app/components/modals/reset-profile-credentials.js +1 -0
  133. package/app/components/profile-identity-hint.js +1 -0
  134. package/app/controllers/settings/telematics.js +1 -0
  135. package/app/routes/settings/telematics.js +1 -0
  136. package/app/templates/settings/telematics.js +1 -0
  137. package/composer.json +2 -2
  138. package/docs/AFAQY.md +1 -1
  139. package/docs/TELEMATICS_QUEUES.md +1 -1
  140. package/docs/TELEMETRY_ARCHITECTURE.md +72 -1
  141. package/extension.json +1 -1
  142. package/package.json +3 -3
  143. package/scripts/pest-bootstrap.php +12 -0
  144. package/server/config/telemetry.php +12 -0
  145. package/server/migrations/2026_09_21_000001_convert_profile_only_users_to_managed_accounts.php +132 -0
  146. package/server/migrations/2026_09_23_000001_add_retention_index_to_device_events.php +40 -0
  147. package/server/migrations/2026_09_23_000002_add_retention_index_to_positions.php +40 -0
  148. package/server/migrations/2026_09_23_000003_add_retention_index_to_telematic_sync_runs.php +40 -0
  149. package/server/resources/views/mail/driver-credentials.blade.php +21 -0
  150. package/server/src/Auth/Schemas/FleetOps.php +104 -5
  151. package/server/src/Console/Commands/DrainTelematicInbox.php +3 -13
  152. package/server/src/Console/Commands/FixCustomerCompanies.php +1 -1
  153. package/server/src/Console/Commands/FixDriverCompanies.php +1 -1
  154. package/server/src/Console/Commands/ProcessOperationalAlerts.php +3 -3
  155. package/server/src/Console/Commands/PruneTelematicsData.php +318 -0
  156. package/server/src/Exceptions/ProfileIdentityConflictException.php +34 -0
  157. package/server/src/Http/Controllers/Api/v1/CustomerController.php +14 -0
  158. package/server/src/Http/Controllers/Api/v1/DriverController.php +56 -39
  159. package/server/src/Http/Controllers/Api/v1/OrchestrationController.php +9 -0
  160. package/server/src/Http/Controllers/FleetOpsController.php +21 -0
  161. package/server/src/Http/Controllers/Internal/v1/AnalyticsController.php +11 -0
  162. package/server/src/Http/Controllers/Internal/v1/ContactController.php +16 -17
  163. package/server/src/Http/Controllers/Internal/v1/CustomerController.php +54 -4
  164. package/server/src/Http/Controllers/Internal/v1/DeviceController.php +13 -0
  165. package/server/src/Http/Controllers/Internal/v1/DeviceEventController.php +11 -0
  166. package/server/src/Http/Controllers/Internal/v1/DriverController.php +204 -162
  167. package/server/src/Http/Controllers/Internal/v1/FleetOpsLookupController.php +47 -0
  168. package/server/src/Http/Controllers/Internal/v1/FuelProviderConnectionController.php +13 -0
  169. package/server/src/Http/Controllers/Internal/v1/FuelProviderTransactionController.php +15 -0
  170. package/server/src/Http/Controllers/Internal/v1/FuelReportController.php +9 -3
  171. package/server/src/Http/Controllers/Internal/v1/InspectionFormController.php +15 -0
  172. package/server/src/Http/Controllers/Internal/v1/LiveController.php +16 -0
  173. package/server/src/Http/Controllers/Internal/v1/MaintenanceController.php +15 -0
  174. package/server/src/Http/Controllers/Internal/v1/MaintenanceScheduleController.php +15 -0
  175. package/server/src/Http/Controllers/Internal/v1/ManifestController.php +15 -0
  176. package/server/src/Http/Controllers/Internal/v1/MetricsController.php +11 -0
  177. package/server/src/Http/Controllers/Internal/v1/NavigatorController.php +42 -1
  178. package/server/src/Http/Controllers/Internal/v1/OrchestrationController.php +12 -0
  179. package/server/src/Http/Controllers/Internal/v1/OrderController.php +178 -27
  180. package/server/src/Http/Controllers/Internal/v1/PaymentController.php +13 -0
  181. package/server/src/Http/Controllers/Internal/v1/RadarController.php +19 -0
  182. package/server/src/Http/Controllers/Internal/v1/ServiceAreaController.php +9 -3
  183. package/server/src/Http/Controllers/Internal/v1/SettingController.php +465 -14
  184. package/server/src/Http/Controllers/Internal/v1/TelematicController.php +21 -0
  185. package/server/src/Http/Controllers/Internal/v1/TrailerController.php +21 -0
  186. package/server/src/Http/Controllers/Internal/v1/VehicleController.php +21 -0
  187. package/server/src/Http/Controllers/Internal/v1/VendorController.php +17 -0
  188. package/server/src/Http/Controllers/Internal/v1/WorkOrderController.php +11 -0
  189. package/server/src/Http/Requests/CreateDriverRequest.php +6 -2
  190. package/server/src/Http/Requests/Internal/CreateDriverRequest.php +9 -18
  191. package/server/src/Http/Resources/v1/Contact.php +3 -0
  192. package/server/src/Http/Resources/v1/Driver.php +3 -0
  193. package/server/src/Jobs/DispatchTelematicsRetentionJobs.php +70 -0
  194. package/server/src/Jobs/PruneTelematicsDataJob.php +74 -0
  195. package/server/src/Listeners/NotifyDriverOnShiftChange.php +3 -3
  196. package/server/src/Mail/CustomerCredentialsMail.php +1 -1
  197. package/server/src/Mail/DriverCredentialsMail.php +55 -0
  198. package/server/src/Models/Contact.php +55 -90
  199. package/server/src/Models/Sensor.php +3 -5
  200. package/server/src/Observers/ContactObserver.php +2 -22
  201. package/server/src/Observers/DriverObserver.php +5 -6
  202. package/server/src/Orchestration/Engines/VroomOrchestrationEngine.php +9 -1
  203. package/server/src/Providers/FleetOpsServiceProvider.php +18 -0
  204. package/server/src/Support/Ai/Capabilities/AbstractFleetOpsAICapability.php +62 -5
  205. package/server/src/Support/Ai/Capabilities/AssetStatusCapability.php +24 -5
  206. package/server/src/Support/Ai/Capabilities/CreateOrderPreviewCapability.php +6 -2
  207. package/server/src/Support/Ai/Capabilities/OrderInsightsCapability.php +40 -7
  208. package/server/src/Support/Ai/Capabilities/SearchResourcesCapability.php +86 -24
  209. package/server/src/Support/Ai/FleetOpsAiConsoleCommands.php +122 -0
  210. package/server/src/Support/Ai/Tools/CreateOrderTool.php +86 -0
  211. package/server/src/Support/Ai/Tools/ImportOrdersTool.php +53 -0
  212. package/server/src/Support/Ai/Tools/OptimizeOrderRouteTool.php +70 -0
  213. package/server/src/Support/Ai/Tools/SearchResourcesTool.php +73 -0
  214. package/server/src/Support/Analytics/LiveFleet.php +18 -2
  215. package/server/src/Support/Authorization.php +103 -0
  216. package/server/src/Support/Database/TableIndexes.php +66 -0
  217. package/server/src/Support/OrderTracker.php +2 -2
  218. package/server/src/Support/ProfileAccountManager.php +405 -0
  219. package/server/src/Support/Reporting/FleetOpsReportSchema.php +476 -116
  220. package/server/src/Support/Telematics/Retention/RetentionPolicy.php +300 -0
  221. package/server/src/Support/Telematics/Retention/TelemetryActivity.php +40 -0
  222. package/server/src/Support/Telematics/TelematicService.php +12 -2
  223. package/server/src/Support/Telematics/Telemetry/Ingestor.php +4 -2
  224. package/server/src/Tracking/TrackingIntelligenceService.php +1 -1
  225. package/server/src/Tracking/TrackingOptions.php +2 -2
  226. package/server/src/Traits/AuthorizesMethods.php +37 -0
  227. package/server/src/routes.php +14 -1
  228. package/server/tests/AiOperationalQueryCapabilityTest.php +1 -0
  229. package/server/tests/AnalyticsRoutesTest.php +29 -2
  230. package/server/tests/ApiCustomerControllerContractsTest.php +21 -0
  231. package/server/tests/ApiDriverControllerContractsTest.php +102 -20
  232. package/server/tests/CommandContractsTest.php +4 -4
  233. package/server/tests/ControllerHelperContractsTest.php +3 -11
  234. package/server/tests/Feature/Http/AfaqyRealtimeIngestionTest.php +21 -1
  235. package/server/tests/Feature/Http/Api/DriverControllerAuthFlowsTest.php +36 -0
  236. package/server/tests/Feature/Http/Api/DriverControllerSessionHelpersTest.php +19 -6
  237. package/server/tests/Feature/Http/Api/ProfileOnlyUserConversionMigrationTest.php +201 -0
  238. package/server/tests/Feature/Http/Api/TelematicsRetentionIndexMigrationTest.php +115 -0
  239. package/server/tests/Feature/Http/Internal/ContactControllerEndpointsTest.php +6 -4
  240. package/server/tests/Feature/Http/Internal/CustomerControllerCredentialsTest.php +6 -2
  241. package/server/tests/Feature/Http/Internal/DriverControllerContractsTest.php +23 -0
  242. package/server/tests/Feature/Http/Internal/DriverControllerCreateRecordTest.php +42 -17
  243. package/server/tests/Feature/Http/Internal/DriverControllerExistingUserAdoptionTest.php +168 -277
  244. package/server/tests/Feature/Http/Internal/DriverControllerLoginManagementTest.php +716 -0
  245. package/server/tests/Feature/Http/Internal/OrderControllerContractsTest.php +10 -3
  246. package/server/tests/Feature/Http/Internal/OrderControllerImportFromFilesTest.php +18 -0
  247. package/server/tests/Feature/Http/Internal/OrderControllerTenantScopingTest.php +411 -0
  248. package/server/tests/Feature/Http/Internal/OrderControllerUpstreamNotFoundTest.php +8 -20
  249. package/server/tests/Feature/Http/Internal/SettingControllerHelpersTest.php +71 -0
  250. package/server/tests/Feature/Http/Internal/TelematicsStorageDeadlinesTest.php +119 -0
  251. package/server/tests/InternalCustomerControllerContractsTest.php +32 -1
  252. package/server/tests/InternalImportExportControllerContractsTest.php +5 -8
  253. package/server/tests/ModelAccessorContractsTest.php +82 -20
  254. package/server/tests/NavigatorControllerContractsTest.php +36 -4
  255. package/server/tests/NotificationAndMailContractsTest.php +31 -0
  256. package/server/tests/ObserverContractsTest.php +28 -3
  257. package/server/tests/OrchestratorConsumableApiTest.php +42 -0
  258. package/server/tests/ProviderContractsTest.php +10 -0
  259. package/server/tests/ReportSchemaContractsTest.php +120 -6
  260. package/server/tests/RequestContractsTest.php +19 -11
  261. package/server/tests/SettingControllerContractsTest.php +429 -18
  262. package/server/tests/SmallControllerContractsTest.php +8 -5
  263. package/server/tests/Support/PruneTelematicsDataProbe.php +55 -0
  264. package/server/tests/SupportJobAndAiCoverageTest.php +3 -3
  265. package/server/tests/TelematicControllerContractsTest.php +22 -4
  266. package/server/tests/Unit/Console/Commands/ProcessOperationalAlertsCommandTest.php +2 -2
  267. package/server/tests/Unit/Console/PruneTelematicsDataCommandTest.php +353 -0
  268. package/server/tests/Unit/Jobs/DispatchTelematicsRetentionJobsTest.php +114 -0
  269. package/server/tests/Unit/Jobs/PruneTelematicsDataJobTest.php +60 -0
  270. package/server/tests/Unit/Models/ContactCustomerUserTest.php +90 -14
  271. package/server/tests/Unit/Models/ContactTest.php +48 -5
  272. package/server/tests/Unit/Models/SensorTest.php +2 -2
  273. package/server/tests/Unit/Models/SmallModelSurfacesTest.php +31 -32
  274. package/server/tests/Unit/Observers/ObserverListenerSeamsTest.php +7 -2
  275. package/server/tests/Unit/Orchestration/VroomEngineTransportAndSettingsTest.php +20 -0
  276. package/server/tests/Unit/Providers/FleetOpsAiRegistrationTest.php +15 -2
  277. package/server/tests/Unit/Support/Ai/AssetStatusCapabilityQueriesTest.php +42 -0
  278. package/server/tests/Unit/Support/Ai/Capabilities/OrderInsightsCapabilityTest.php +19 -1
  279. package/server/tests/Unit/Support/Ai/Capabilities/SearchResourcesCapabilityTest.php +85 -1
  280. package/server/tests/Unit/Support/Ai/FleetOpsAiConsoleCommandsTest.php +31 -0
  281. package/server/tests/Unit/Support/Ai/Tools/FleetOpsAiToolsTest.php +246 -0
  282. package/server/tests/Unit/Support/AiCapabilityPermissionsTest.php +3 -3
  283. package/server/tests/Unit/Support/Analytics/LiveFleetTest.php +6 -0
  284. package/server/tests/Unit/Support/AuthorizationTest.php +142 -0
  285. package/server/tests/Unit/Support/MaintainableAndOperationalAlertsTest.php +12 -1
  286. package/server/tests/Unit/Support/MoreQuerySeamsTest.php +11 -2
  287. package/server/tests/Unit/Support/ProfileAccountManagerTest.php +643 -0
  288. package/server/tests/Unit/Support/Telematics/Retention/RetentionPolicyTest.php +190 -0
  289. package/server/tests/Unit/Support/Telematics/Retention/TelemetryActivityTest.php +68 -0
  290. package/server/tests/Unit/Tracking/TrackingOptionsCompanySettingsTest.php +109 -0
  291. package/translations/en-us.yaml +85 -2
  292. package/translations/uk-ua.yaml +3475 -0
  293. package/addon/components/modals/reset-customer-credentials.hbs +0 -18
  294. package/addon/components/modals/reset-customer-credentials.js +0 -55
@@ -18,66 +18,77 @@ export default {
18
18
  description: 'Everything across resources, maintenance and staffing that needs a decision today.',
19
19
  icon: 'satellite-dish',
20
20
  route: 'console.fleet-ops.management.index',
21
+ permission: 'fleet-ops list driver',
21
22
  },
22
23
  {
23
24
  title: 'Orders',
24
25
  description: 'Create, dispatch, and track delivery orders in real time.',
25
26
  icon: 'boxes-stacked',
26
27
  route: 'console.fleet-ops.operations.orders',
28
+ permission: 'fleet-ops list order',
27
29
  },
28
30
  {
29
31
  title: 'Places',
30
32
  description: 'Manage saved locations, addresses, and points of interest.',
31
33
  icon: 'location-dot',
32
34
  route: 'console.fleet-ops.management.places',
35
+ permission: 'fleet-ops list place',
33
36
  },
34
37
  {
35
38
  title: 'Drivers',
36
39
  description: 'Manage driver profiles, assignments, and live locations.',
37
40
  icon: 'id-card',
38
41
  route: 'console.fleet-ops.management.drivers',
42
+ permission: 'fleet-ops list driver',
39
43
  },
40
44
  {
41
45
  title: 'Vehicles',
42
46
  description: 'View and manage your vehicle fleet and telematics.',
43
47
  icon: 'truck',
44
48
  route: 'console.fleet-ops.management.vehicles',
49
+ permission: 'fleet-ops list vehicle',
45
50
  },
46
51
  {
47
52
  title: intlService.t('menu.trailers'),
48
53
  description: intlService.t('trailer.navigation-description'),
49
54
  icon: 'trailer',
50
55
  route: 'console.fleet-ops.management.trailers',
56
+ permission: 'fleet-ops list trailer',
51
57
  },
52
58
  {
53
59
  title: 'Fleets',
54
60
  description: 'Organise drivers and vehicles into operational fleets.',
55
61
  icon: 'layer-group',
56
62
  route: 'console.fleet-ops.management.fleets',
63
+ permission: 'fleet-ops list fleet',
57
64
  },
58
65
  {
59
66
  title: 'Service Rates',
60
67
  description: 'Configure pricing rules and service rate cards.',
61
68
  icon: 'tags',
62
69
  route: 'console.fleet-ops.operations.service-rates',
70
+ permission: 'fleet-ops list service-rate',
63
71
  },
64
72
  {
65
73
  title: 'Devices',
66
74
  description: 'Manage connected telematics devices and their sensor data.',
67
75
  icon: 'microchip',
68
76
  route: 'console.fleet-ops.connectivity.devices',
77
+ permission: 'fleet-ops list device',
69
78
  },
70
79
  {
71
80
  title: 'Reports',
72
81
  description: 'Generate and review operational analytics reports.',
73
82
  icon: 'chart-bar',
74
83
  route: 'console.fleet-ops.analytics.reports',
84
+ permission: 'iam list report',
75
85
  },
76
86
  {
77
87
  title: 'Orchestrator',
78
88
  description: 'Intelligently allocate and dispatch orders to available drivers.',
79
89
  icon: 'diagram-project',
80
90
  route: 'console.fleet-ops.operations.orchestrator',
91
+ permission: 'fleet-ops list order',
81
92
  },
82
93
  ],
83
94
  });
@@ -101,6 +112,11 @@ export default {
101
112
  icon: 'location-arrow',
102
113
  component: new ExtensionComponent('@fleetbase/fleetops-engine', 'admin/navigator-app'),
103
114
  }),
115
+ new MenuItem({
116
+ title: 'Telematics',
117
+ icon: 'satellite-dish',
118
+ component: new ExtensionComponent('@fleetbase/fleetops-engine', 'admin/telematics-settings'),
119
+ }),
104
120
  ],
105
121
  {
106
122
  slug: 'fleet-ops',
@@ -115,8 +131,10 @@ export default {
115
131
  route: 'virtual',
116
132
  slug: 'track-order',
117
133
  icon: 'barcode',
118
- type: 'link',
119
- wrapperClass: 'btn-block py-1 border dark:border-gray-700 border-gray-200 hover:opacity-50',
134
+ type: 'default',
135
+ // btn-auth (ember-ui): the sign-in page's neutral button, matching the
136
+ // console's "Continue with ..." provider buttons, hover included.
137
+ wrapperClass: 'btn-block btn-auth',
120
138
  component: new ExtensionComponent('@fleetbase/fleetops-engine', 'order-tracking-lookup'),
121
139
  onClick: (menuItem) => {
122
140
  universe.transitionMenuItem('virtual', menuItem);
@@ -159,6 +177,14 @@ export default {
159
177
  },
160
178
 
161
179
  registerWidgets(widgetService) {
180
+ // `order` places a default widget on the default dashboard, which mixes widgets from
181
+ // every extension; the grid fills rows first-fit, lowest order first (widgets without
182
+ // one follow). The default layout is:
183
+ // 10-40 KPI row: Radar, Revenue (ledger, 20), Active Orders, Drivers Online
184
+ // 41-44 Ledger KPI row: Expenses, Net Income, Outstanding AR, Overdue AR
185
+ // 50 Live Fleet Map, full width
186
+ // 60-80 Revenue Trend, Top Drivers, Maintenance Overview, a third of the width each
187
+ // 150-170 Ledger Recent Financial Activity + Cash Flow Summary | console Blog + GitHub
162
188
  const widgets = [
163
189
  // Legacy monolithic 13-tile widget — kept registered for one release as
164
190
  // users have it pinned to existing dashboards. The new KPI tile widgets
@@ -184,7 +210,7 @@ export default {
184
210
  component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/kpi-earnings'),
185
211
  grid_options: { w: 3, h: 4, minW: 3, minH: 4 },
186
212
  category: 'KPI Tiles',
187
- default: true,
213
+ default: false,
188
214
  }),
189
215
  new Widget({
190
216
  id: 'fleet-ops-kpi-aov-widget',
@@ -194,7 +220,7 @@ export default {
194
220
  component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/kpi-aov'),
195
221
  grid_options: { w: 3, h: 4, minW: 3, minH: 4 },
196
222
  category: 'KPI Tiles',
197
- default: true,
223
+ default: false,
198
224
  }),
199
225
  new Widget({
200
226
  id: 'fleet-ops-kpi-distance-widget',
@@ -214,6 +240,7 @@ export default {
214
240
  component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/kpi-active-orders'),
215
241
  grid_options: { w: 3, h: 4, minW: 3, minH: 4 },
216
242
  category: 'KPI Tiles',
243
+ order: 30,
217
244
  default: true,
218
245
  }),
219
246
  new Widget({
@@ -224,6 +251,7 @@ export default {
224
251
  component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/kpi-drivers-online'),
225
252
  grid_options: { w: 3, h: 4, minW: 3, minH: 4 },
226
253
  category: 'KPI Tiles',
254
+ order: 40,
227
255
  default: true,
228
256
  }),
229
257
  new Widget({
@@ -234,6 +262,7 @@ export default {
234
262
  component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/radar'),
235
263
  grid_options: { w: 3, h: 4, minW: 3, minH: 4 },
236
264
  category: 'KPI Tiles',
265
+ order: 10,
237
266
  default: true,
238
267
  }),
239
268
  new Widget({
@@ -264,8 +293,9 @@ export default {
264
293
  description: 'Real-time driver positions and active routes.',
265
294
  icon: 'map-location-dot',
266
295
  component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/live-fleet'),
267
- grid_options: { w: 8, h: 11, minW: 8, minH: 8 },
296
+ grid_options: { w: 12, h: 12, minW: 8, minH: 8 },
268
297
  category: 'Maps',
298
+ order: 50,
269
299
  default: true,
270
300
  }),
271
301
  new Widget({
@@ -274,8 +304,9 @@ export default {
274
304
  description: 'Revenue over time with period comparison.',
275
305
  icon: 'chart-line',
276
306
  component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/revenue-trend'),
277
- grid_options: { w: 4, h: 11, minW: 4, minH: 8 },
307
+ grid_options: { w: 4, h: 9, minW: 4, minH: 7 },
278
308
  category: 'Analytics',
309
+ order: 60,
279
310
  default: true,
280
311
  }),
281
312
  new Widget({
@@ -304,8 +335,9 @@ export default {
304
335
  description: 'Driver leaderboard sortable by orders, on-time %, or distance.',
305
336
  icon: 'medal',
306
337
  component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/top-drivers'),
307
- grid_options: { w: 6, h: 6, minW: 5, minH: 5 },
338
+ grid_options: { w: 4, h: 9, minW: 4, minH: 6 },
308
339
  category: 'Analytics',
340
+ order: 70,
309
341
  default: true,
310
342
  }),
311
343
  new Widget({
@@ -344,8 +376,9 @@ export default {
344
376
  description: 'Overdue, scheduled, and YTD maintenance spend.',
345
377
  icon: 'wrench',
346
378
  component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/maintenance-overview'),
347
- grid_options: { w: 6, h: 6, minW: 5, minH: 5 },
379
+ grid_options: { w: 4, h: 9, minW: 4, minH: 6 },
348
380
  category: 'Analytics',
381
+ order: 80,
349
382
  default: true,
350
383
  }),
351
384
  new Widget({
@@ -454,6 +487,7 @@ export default {
454
487
  'fleet-ops:template:settings:routing',
455
488
  'fleet-ops:template:settings:orchestrator',
456
489
  'fleet-ops:component:admin:routing-settings',
490
+ 'fleet-ops:component:admin:telematics-settings',
457
491
  ]);
458
492
  },
459
493
  };
@@ -1,3 +1,16 @@
1
1
  import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
2
3
 
3
- export default class AnalyticsIndexRoute extends Route {}
4
+ export default class AnalyticsIndexRoute extends Route {
5
+ @service notifications;
6
+ @service hostRouter;
7
+ @service abilities;
8
+ @service intl;
9
+
10
+ beforeModel() {
11
+ if (this.abilities.cannot('fleet-ops view analytics')) {
12
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
13
+ return this.hostRouter.transitionTo('console.fleet-ops');
14
+ }
15
+ }
16
+ }
@@ -17,7 +17,7 @@ export default class AnalyticsReportsIndexDetailsRoute extends Route {
17
17
  }
18
18
 
19
19
  beforeModel() {
20
- if (this.abilities.cannot('fleet-ops view report')) {
20
+ if (this.abilities.cannot('iam view report')) {
21
21
  this.notifications.warning(this.intl.t('common.unauthorized-access'));
22
22
  return this.hostRouter.transitionTo('console.fleet-ops.analytics.reports.index');
23
23
  }
@@ -17,7 +17,7 @@ export default class AnalyticsReportsIndexEditRoute extends Route {
17
17
  }
18
18
 
19
19
  beforeModel() {
20
- if (this.abilities.cannot('fleet-ops update report')) {
20
+ if (this.abilities.cannot('iam update report')) {
21
21
  this.notifications.warning(this.intl.t('common.unauthorized-access'));
22
22
  return this.hostRouter.transitionTo('console.fleet-ops.analytics.reports.index');
23
23
  }
@@ -1,3 +1,16 @@
1
1
  import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
2
3
 
3
- export default class AnalyticsReportsIndexNewRoute extends Route {}
4
+ export default class AnalyticsReportsIndexNewRoute extends Route {
5
+ @service notifications;
6
+ @service hostRouter;
7
+ @service abilities;
8
+ @service intl;
9
+
10
+ beforeModel() {
11
+ if (this.abilities.cannot('iam create report')) {
12
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
13
+ return this.hostRouter.transitionTo('console.fleet-ops.analytics.reports.index');
14
+ }
15
+ }
16
+ }
@@ -1,3 +1,16 @@
1
1
  import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
2
3
 
3
- export default class AnalyticsReportsRoute extends Route {}
4
+ export default class AnalyticsReportsRoute extends Route {
5
+ @service notifications;
6
+ @service hostRouter;
7
+ @service abilities;
8
+ @service intl;
9
+
10
+ beforeModel() {
11
+ if (this.abilities.cannot('iam list report')) {
12
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
13
+ return this.hostRouter.transitionTo('console.fleet-ops');
14
+ }
15
+ }
16
+ }
@@ -1,3 +1,16 @@
1
1
  import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
2
3
 
3
- export default class ConnectivityDevicesIndexNewRoute extends Route {}
4
+ export default class ConnectivityDevicesIndexNewRoute extends Route {
5
+ @service notifications;
6
+ @service hostRouter;
7
+ @service abilities;
8
+ @service intl;
9
+
10
+ beforeModel() {
11
+ if (this.abilities.cannot('fleet-ops create device')) {
12
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
13
+ return this.hostRouter.transitionTo('console.fleet-ops.connectivity.devices.index');
14
+ }
15
+ }
16
+ }
@@ -1,3 +1,16 @@
1
1
  import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
2
3
 
3
- export default class ConnectivityDevicesRoute extends Route {}
4
+ export default class ConnectivityDevicesRoute extends Route {
5
+ @service notifications;
6
+ @service hostRouter;
7
+ @service abilities;
8
+ @service intl;
9
+
10
+ beforeModel() {
11
+ if (this.abilities.cannot('fleet-ops list device')) {
12
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
13
+ return this.hostRouter.transitionTo('console.fleet-ops');
14
+ }
15
+ }
16
+ }
@@ -1,3 +1,16 @@
1
1
  import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
2
3
 
3
- export default class ConnectivityEventsRoute extends Route {}
4
+ export default class ConnectivityEventsRoute extends Route {
5
+ @service notifications;
6
+ @service hostRouter;
7
+ @service abilities;
8
+ @service intl;
9
+
10
+ beforeModel() {
11
+ if (this.abilities.cannot('fleet-ops list device-event')) {
12
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
13
+ return this.hostRouter.transitionTo('console.fleet-ops');
14
+ }
15
+ }
16
+ }
@@ -4,6 +4,18 @@ import { action } from '@ember/object';
4
4
 
5
5
  export default class FuelIntegrationTransactionsRoute extends Route {
6
6
  @service store;
7
+ @service notifications;
8
+ @service hostRouter;
9
+ @service abilities;
10
+ @service intl;
11
+
12
+ beforeModel() {
13
+ if (this.abilities.cannot('fleet-ops list fuel-provider-transaction')) {
14
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
15
+ return this.hostRouter.transitionTo('console.fleet-ops.connectivity.fuel-providers.index');
16
+ }
17
+ }
18
+
7
19
  queryParams = Object.fromEntries(['page', 'limit', 'sort', 'query', 'sync_status', 'vehicle', 'transaction_at'].map((key) => [key, { refreshModel: true }]));
8
20
  model(params) {
9
21
  const connection = this.modelFor('connectivity.fuel-providers.details');
@@ -6,6 +6,15 @@ export default class ConnectivityFuelProvidersIndexDetailsRoute extends Route {
6
6
  @service store;
7
7
  @service notifications;
8
8
  @service hostRouter;
9
+ @service abilities;
10
+ @service intl;
11
+
12
+ beforeModel() {
13
+ if (this.abilities.cannot('fleet-ops view fuel-provider-connection')) {
14
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
15
+ return this.hostRouter.transitionTo('console.fleet-ops.connectivity.fuel-providers.index');
16
+ }
17
+ }
9
18
 
10
19
  setupController(controller, model) {
11
20
  super.setupController(controller, model);
@@ -6,6 +6,15 @@ export default class ConnectivityFuelProvidersIndexEditRoute extends Route {
6
6
  @service store;
7
7
  @service notifications;
8
8
  @service hostRouter;
9
+ @service abilities;
10
+ @service intl;
11
+
12
+ beforeModel() {
13
+ if (this.abilities.cannot('fleet-ops update fuel-provider-connection')) {
14
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
15
+ return this.hostRouter.transitionTo('console.fleet-ops.connectivity.fuel-providers.index');
16
+ }
17
+ }
9
18
 
10
19
  @action error(error) {
11
20
  this.notifications.serverError(error);
@@ -1,3 +1,16 @@
1
1
  import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
2
3
 
3
- export default class ConnectivityFuelProvidersIndexNewRoute extends Route {}
4
+ export default class ConnectivityFuelProvidersIndexNewRoute extends Route {
5
+ @service notifications;
6
+ @service hostRouter;
7
+ @service abilities;
8
+ @service intl;
9
+
10
+ beforeModel() {
11
+ if (this.abilities.cannot('fleet-ops create fuel-provider-connection')) {
12
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
13
+ return this.hostRouter.transitionTo('console.fleet-ops.connectivity.fuel-providers.index');
14
+ }
15
+ }
16
+ }
@@ -1,3 +1,16 @@
1
1
  import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
2
3
 
3
- export default class ConnectivityFuelProvidersRoute extends Route {}
4
+ export default class ConnectivityFuelProvidersRoute extends Route {
5
+ @service notifications;
6
+ @service hostRouter;
7
+ @service abilities;
8
+ @service intl;
9
+
10
+ beforeModel() {
11
+ if (this.abilities.cannot('fleet-ops list fuel-provider-connection')) {
12
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
13
+ return this.hostRouter.transitionTo('console.fleet-ops');
14
+ }
15
+ }
16
+ }
@@ -1,3 +1,16 @@
1
1
  import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
2
3
 
3
- export default class ConnectivitySensorsIndexNewRoute extends Route {}
4
+ export default class ConnectivitySensorsIndexNewRoute extends Route {
5
+ @service notifications;
6
+ @service hostRouter;
7
+ @service abilities;
8
+ @service intl;
9
+
10
+ beforeModel() {
11
+ if (this.abilities.cannot('fleet-ops create sensor')) {
12
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
13
+ return this.hostRouter.transitionTo('console.fleet-ops.connectivity.sensors.index');
14
+ }
15
+ }
16
+ }
@@ -1,3 +1,16 @@
1
1
  import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
2
3
 
3
- export default class ConnectivitySensorsRoute extends Route {}
4
+ export default class ConnectivitySensorsRoute extends Route {
5
+ @service notifications;
6
+ @service hostRouter;
7
+ @service abilities;
8
+ @service intl;
9
+
10
+ beforeModel() {
11
+ if (this.abilities.cannot('fleet-ops list sensor')) {
12
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
13
+ return this.hostRouter.transitionTo('console.fleet-ops');
14
+ }
15
+ }
16
+ }
@@ -1,3 +1,16 @@
1
1
  import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
2
3
 
3
- export default class ConnectivityTelematicsNewRoute extends Route {}
4
+ export default class ConnectivityTelematicsNewRoute extends Route {
5
+ @service notifications;
6
+ @service hostRouter;
7
+ @service abilities;
8
+ @service intl;
9
+
10
+ beforeModel() {
11
+ if (this.abilities.cannot('fleet-ops create telematic')) {
12
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
13
+ return this.hostRouter.transitionTo('console.fleet-ops.connectivity.telematics.index');
14
+ }
15
+ }
16
+ }
@@ -1,3 +1,16 @@
1
1
  import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
2
3
 
3
- export default class ConnectivityTelematicsRoute extends Route {}
4
+ export default class ConnectivityTelematicsRoute extends Route {
5
+ @service notifications;
6
+ @service hostRouter;
7
+ @service abilities;
8
+ @service intl;
9
+
10
+ beforeModel() {
11
+ if (this.abilities.cannot('fleet-ops list telematic')) {
12
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
13
+ return this.hostRouter.transitionTo('console.fleet-ops');
14
+ }
15
+ }
16
+ }
@@ -1,3 +1,16 @@
1
1
  import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
2
3
 
3
- export default class ConnectivityTrackingRoute extends Route {}
4
+ export default class ConnectivityTrackingRoute extends Route {
5
+ @service notifications;
6
+ @service hostRouter;
7
+ @service abilities;
8
+ @service intl;
9
+
10
+ beforeModel() {
11
+ if (this.abilities.cannot('fleet-ops list vehicle')) {
12
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
13
+ return this.hostRouter.transitionTo('console.fleet-ops');
14
+ }
15
+ }
16
+ }
@@ -12,14 +12,14 @@ export default class MaintenanceEquipmentIndexDetailsRoute extends Route {
12
12
  @action error(error) {
13
13
  this.notifications.serverError(error);
14
14
  if (typeof error.message === 'string' && error.message.endsWith('not found')) {
15
- return this.hostRouter.transitionTo('maintenance.equipment.index');
15
+ return this.hostRouter.transitionTo('console.fleet-ops.maintenance.equipment.index');
16
16
  }
17
17
  }
18
18
 
19
19
  beforeModel() {
20
20
  if (this.abilities.cannot('fleet-ops view equipment')) {
21
21
  this.notifications.warning(this.intl.t('common.unauthorized-access'));
22
- return this.hostRouter.transitionTo('maintenance.equipment.index');
22
+ return this.hostRouter.transitionTo('console.fleet-ops.maintenance.equipment.index');
23
23
  }
24
24
  }
25
25
 
@@ -12,14 +12,14 @@ export default class MaintenanceEquipmentIndexEditRoute extends Route {
12
12
  @action error(error) {
13
13
  this.notifications.serverError(error);
14
14
  if (typeof error.message === 'string' && error.message.endsWith('not found')) {
15
- return this.hostRouter.transitionTo('maintenance.equipment.index');
15
+ return this.hostRouter.transitionTo('console.fleet-ops.maintenance.equipment.index');
16
16
  }
17
17
  }
18
18
 
19
19
  beforeModel() {
20
20
  if (this.abilities.cannot('fleet-ops update equipment')) {
21
21
  this.notifications.warning(this.intl.t('common.unauthorized-access'));
22
- return this.hostRouter.transitionTo('maintenance.equipment.index');
22
+ return this.hostRouter.transitionTo('console.fleet-ops.maintenance.equipment.index');
23
23
  }
24
24
  }
25
25
 
@@ -1,3 +1,16 @@
1
1
  import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
2
3
 
3
- export default class MaintenanceEquipmentIndexNewRoute extends Route {}
4
+ export default class MaintenanceEquipmentIndexNewRoute extends Route {
5
+ @service notifications;
6
+ @service hostRouter;
7
+ @service abilities;
8
+ @service intl;
9
+
10
+ beforeModel() {
11
+ if (this.abilities.cannot('fleet-ops create equipment')) {
12
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
13
+ return this.hostRouter.transitionTo('console.fleet-ops.maintenance.equipment.index');
14
+ }
15
+ }
16
+ }
@@ -1,3 +1,16 @@
1
1
  import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
2
3
 
3
- export default class MaintenanceEquipmentRoute extends Route {}
4
+ export default class MaintenanceEquipmentRoute extends Route {
5
+ @service notifications;
6
+ @service hostRouter;
7
+ @service abilities;
8
+ @service intl;
9
+
10
+ beforeModel() {
11
+ if (this.abilities.cannot('fleet-ops list equipment')) {
12
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
13
+ return this.hostRouter.transitionTo('console.fleet-ops');
14
+ }
15
+ }
16
+ }
@@ -1,3 +1,16 @@
1
1
  import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
2
3
 
3
- export default class MaintenanceIndexRoute extends Route {}
4
+ export default class MaintenanceIndexRoute extends Route {
5
+ @service notifications;
6
+ @service hostRouter;
7
+ @service abilities;
8
+ @service intl;
9
+
10
+ beforeModel() {
11
+ if (this.abilities.cannot('fleet-ops list work-order')) {
12
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
13
+ return this.hostRouter.transitionTo('console.fleet-ops');
14
+ }
15
+ }
16
+ }
@@ -6,6 +6,15 @@ export default class MaintenanceInspectionFormsIndexDetailsRoute extends Route {
6
6
  @service store;
7
7
  @service hostRouter;
8
8
  @service notifications;
9
+ @service abilities;
10
+ @service intl;
11
+
12
+ beforeModel() {
13
+ if (this.abilities.cannot('fleet-ops view inspection-form')) {
14
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
15
+ return this.hostRouter.transitionTo('console.fleet-ops.maintenance.inspection-forms.index');
16
+ }
17
+ }
9
18
 
10
19
  model({ public_id }) {
11
20
  return this.store.findRecord('inspection-form', public_id);
@@ -13,6 +22,6 @@ export default class MaintenanceInspectionFormsIndexDetailsRoute extends Route {
13
22
 
14
23
  @action error(error) {
15
24
  this.notifications.serverError(error);
16
- return this.hostRouter.transitionTo('maintenance.inspection-forms.index');
25
+ return this.hostRouter.transitionTo('console.fleet-ops.maintenance.inspection-forms.index');
17
26
  }
18
27
  }