@fleetbase/fleetops-engine 0.6.69 → 0.6.71

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 (324) hide show
  1. package/RELEASE.md +21 -14
  2. package/addon/components/admin/telematics-settings.hbs +143 -0
  3. package/addon/components/admin/telematics-settings.js +145 -0
  4. package/addon/components/fuel-integration/hub.hbs +1 -1
  5. package/addon/components/layout/fleet-ops-sidebar.js +37 -17
  6. package/addon/components/map/leaflet-live-map.hbs +4 -242
  7. package/addon/components/map/leaflet-live-map.js +2 -1
  8. package/addon/components/map/marker-card/driver.hbs +57 -0
  9. package/addon/components/map/marker-card/driver.js +3 -0
  10. package/addon/components/map/marker-card/vehicle.hbs +78 -0
  11. package/addon/components/map/marker-card/vehicle.js +3 -0
  12. package/addon/components/order/details/activity.hbs +8 -6
  13. package/addon/components/order/details/activity.js +9 -0
  14. package/addon/components/order/details.hbs +29 -0
  15. package/addon/components/order/details.js +26 -0
  16. package/addon/components/order/form/details.hbs +30 -4
  17. package/addon/components/order/form/details.js +46 -0
  18. package/addon/components/order/form/route.hbs +4 -2
  19. package/addon/components/order/form/route.js +11 -0
  20. package/addon/components/order/form.hbs +12 -0
  21. package/addon/components/order/form.js +21 -1
  22. package/addon/components/order/kanban.js +72 -0
  23. package/addon/components/order-config-manager/activity-flow.js +45 -10
  24. package/addon/components/order-config-manager/lifecycle.hbs +250 -0
  25. package/addon/components/order-config-manager/lifecycle.js +358 -0
  26. package/addon/components/order-config-manager.js +5 -1
  27. package/addon/components/telematic/hub.hbs +1 -1
  28. package/addon/components/widget/live-fleet.hbs +8 -40
  29. package/addon/controllers/analytics/reports/index.js +15 -1
  30. package/addon/controllers/connectivity/devices/index/details.js +1 -0
  31. package/addon/controllers/connectivity/devices/index.js +12 -2
  32. package/addon/controllers/connectivity/events/index.js +31 -1
  33. package/addon/controllers/connectivity/fuel-providers/index.js +6 -4
  34. package/addon/controllers/connectivity/sensors/index/details.js +1 -1
  35. package/addon/controllers/connectivity/sensors/index.js +41 -1
  36. package/addon/controllers/connectivity/telematics/index.js +4 -0
  37. package/addon/controllers/maintenance/equipment/index/details.js +2 -2
  38. package/addon/controllers/maintenance/equipment/index.js +36 -10
  39. package/addon/controllers/maintenance/inspection-forms/index.js +32 -12
  40. package/addon/controllers/maintenance/inspection-submissions/index/details.js +2 -1
  41. package/addon/controllers/maintenance/inspection-submissions/index.js +56 -10
  42. package/addon/controllers/maintenance/maintenances/index/details.js +2 -0
  43. package/addon/controllers/maintenance/maintenances/index.js +24 -1
  44. package/addon/controllers/maintenance/parts/index/details.js +2 -2
  45. package/addon/controllers/maintenance/parts/index.js +36 -9
  46. package/addon/controllers/maintenance/schedules/index.js +48 -6
  47. package/addon/controllers/maintenance/work-orders/index/details.js +3 -3
  48. package/addon/controllers/maintenance/work-orders/index.js +47 -9
  49. package/addon/controllers/management/contacts/customers.js +13 -0
  50. package/addon/controllers/management/contacts/index.js +47 -1
  51. package/addon/controllers/management/drivers/index/details.js +1 -0
  52. package/addon/controllers/management/drivers/index.js +36 -2
  53. package/addon/controllers/management/fleets/index/details.js +1 -0
  54. package/addon/controllers/management/fleets/index.js +43 -1
  55. package/addon/controllers/management/fuel-reports/index.js +26 -2
  56. package/addon/controllers/management/fuel-transactions/index.js +45 -7
  57. package/addon/controllers/management/issues/index/details.js +1 -0
  58. package/addon/controllers/management/issues/index.js +26 -2
  59. package/addon/controllers/management/places/index.js +40 -1
  60. package/addon/controllers/management/trailers/index/details.js +1 -0
  61. package/addon/controllers/management/trailers/index.js +50 -2
  62. package/addon/controllers/management/vehicles/index/details.js +1 -0
  63. package/addon/controllers/management/vehicles/index.js +37 -2
  64. package/addon/controllers/management/vendors/index.js +30 -2
  65. package/addon/controllers/operations/orders/index/details.js +61 -5
  66. package/addon/controllers/operations/orders/index.js +66 -4
  67. package/addon/controllers/operations/service-rates/index.js +18 -1
  68. package/addon/controllers/settings/index.js +13 -0
  69. package/addon/controllers/settings/telematics.js +113 -0
  70. package/addon/extension.js +70 -6
  71. package/addon/routes/analytics/index.js +14 -1
  72. package/addon/routes/analytics/reports/index/details.js +1 -1
  73. package/addon/routes/analytics/reports/index/edit.js +1 -1
  74. package/addon/routes/analytics/reports/index/new.js +14 -1
  75. package/addon/routes/analytics/reports.js +14 -1
  76. package/addon/routes/connectivity/devices/index/new.js +14 -1
  77. package/addon/routes/connectivity/devices.js +14 -1
  78. package/addon/routes/connectivity/events.js +14 -1
  79. package/addon/routes/connectivity/fuel-providers/details/transactions.js +12 -0
  80. package/addon/routes/connectivity/fuel-providers/details.js +9 -0
  81. package/addon/routes/connectivity/fuel-providers/edit.js +9 -0
  82. package/addon/routes/connectivity/fuel-providers/new.js +14 -1
  83. package/addon/routes/connectivity/fuel-providers.js +14 -1
  84. package/addon/routes/connectivity/sensors/index/new.js +14 -1
  85. package/addon/routes/connectivity/sensors.js +14 -1
  86. package/addon/routes/connectivity/telematics/new.js +14 -1
  87. package/addon/routes/connectivity/telematics.js +14 -1
  88. package/addon/routes/connectivity/tracking.js +14 -1
  89. package/addon/routes/maintenance/equipment/index/details.js +2 -2
  90. package/addon/routes/maintenance/equipment/index/edit.js +2 -2
  91. package/addon/routes/maintenance/equipment/index/new.js +14 -1
  92. package/addon/routes/maintenance/equipment.js +14 -1
  93. package/addon/routes/maintenance/index.js +14 -1
  94. package/addon/routes/maintenance/inspection-forms/index/details.js +10 -1
  95. package/addon/routes/maintenance/inspection-forms/index/edit.js +10 -1
  96. package/addon/routes/maintenance/inspection-forms/index/new.js +14 -1
  97. package/addon/routes/maintenance/inspection-forms.js +14 -1
  98. package/addon/routes/maintenance/inspection-submissions/index/details.js +10 -1
  99. package/addon/routes/maintenance/inspection-submissions/index/edit.js +10 -1
  100. package/addon/routes/maintenance/inspection-submissions/index/new.js +14 -1
  101. package/addon/routes/maintenance/inspection-submissions.js +14 -1
  102. package/addon/routes/maintenance/maintenances/index/details.js +2 -2
  103. package/addon/routes/maintenance/maintenances/index/edit.js +2 -2
  104. package/addon/routes/maintenance/maintenances/index/new.js +14 -1
  105. package/addon/routes/maintenance/maintenances.js +14 -1
  106. package/addon/routes/maintenance/parts/index/details.js +2 -2
  107. package/addon/routes/maintenance/parts/index/edit.js +2 -2
  108. package/addon/routes/maintenance/parts/index/new.js +14 -1
  109. package/addon/routes/maintenance/parts.js +14 -1
  110. package/addon/routes/maintenance/schedules/index/details.js +2 -2
  111. package/addon/routes/maintenance/schedules/index/edit.js +2 -2
  112. package/addon/routes/maintenance/schedules/index/new.js +15 -1
  113. package/addon/routes/maintenance/schedules.js +15 -1
  114. package/addon/routes/maintenance/work-orders/index/details.js +2 -2
  115. package/addon/routes/maintenance/work-orders/index/edit.js +2 -2
  116. package/addon/routes/maintenance/work-orders/index/new.js +14 -1
  117. package/addon/routes/maintenance/work-orders.js +14 -1
  118. package/addon/routes/management/fuel-transactions/index/details.js +9 -0
  119. package/addon/routes/management/fuel-transactions.js +14 -1
  120. package/addon/routes/management/index.js +13 -0
  121. package/addon/routes/management/trailers.js +16 -0
  122. package/addon/routes/management/vendors/integrated/details.js +14 -1
  123. package/addon/routes/management/vendors/integrated/edit.js +14 -1
  124. package/addon/routes/management/vendors/integrated/new.js +14 -1
  125. package/addon/routes/management/vendors/integrated.js +14 -1
  126. package/addon/routes/operations/orders/index/details.js +1 -0
  127. package/addon/routes/operations/orders.js +40 -1
  128. package/addon/routes/operations/routes/index/details.js +14 -1
  129. package/addon/routes/operations/routes/index/new.js +13 -0
  130. package/addon/routes/operations/routes.js +14 -1
  131. package/addon/routes/operations/service-rates/index/new.js +11 -0
  132. package/addon/routes/operations/service-rates.js +14 -1
  133. package/addon/routes/settings/avatars.js +14 -1
  134. package/addon/routes/settings/custom-fields.js +14 -1
  135. package/addon/routes/settings/map.js +14 -1
  136. package/addon/routes/settings/notifications.js +11 -0
  137. package/addon/routes/settings/orchestrator.js +1 -1
  138. package/addon/routes/settings/payments/index.js +1 -1
  139. package/addon/routes/settings/routing.js +14 -1
  140. package/addon/routes/settings/scheduling.js +14 -1
  141. package/addon/routes/settings/telematics.js +21 -0
  142. package/addon/routes/virtual.js +11 -0
  143. package/addon/routes.js +1 -0
  144. package/addon/services/contact-actions.js +1 -0
  145. package/addon/services/customer-actions.js +2 -1
  146. package/addon/services/device-actions.js +1 -0
  147. package/addon/services/device-event-actions.js +1 -0
  148. package/addon/services/driver-actions.js +4 -13
  149. package/addon/services/equipment-actions.js +1 -0
  150. package/addon/services/fleet-actions.js +1 -0
  151. package/addon/services/fuel-report-actions.js +1 -0
  152. package/addon/services/inspection-form-actions.js +1 -0
  153. package/addon/services/inspection-submission-actions.js +1 -0
  154. package/addon/services/integrated-vendor-actions.js +1 -0
  155. package/addon/services/issue-actions.js +1 -0
  156. package/addon/services/maintenance-actions.js +1 -0
  157. package/addon/services/maintenance-schedule-actions.js +2 -1
  158. package/addon/services/order-actions.js +7 -0
  159. package/addon/services/order-presentation.js +129 -0
  160. package/addon/services/part-actions.js +1 -0
  161. package/addon/services/place-actions.js +1 -0
  162. package/addon/services/sensor-actions.js +1 -0
  163. package/addon/services/service-area-actions.js +1 -0
  164. package/addon/services/service-rate-actions.js +1 -0
  165. package/addon/services/telematic-actions.js +1 -0
  166. package/addon/services/trailer-actions.js +4 -14
  167. package/addon/services/vehicle-actions.js +4 -13
  168. package/addon/services/vendor-actions.js +1 -0
  169. package/addon/services/work-order-actions.js +1 -0
  170. package/addon/services/zone-actions.js +1 -0
  171. package/addon/templates/analytics/reports/index/details.hbs +1 -0
  172. package/addon/templates/analytics/reports/index.hbs +1 -0
  173. package/addon/templates/connectivity/devices/index/details.hbs +1 -0
  174. package/addon/templates/connectivity/devices/index.hbs +1 -0
  175. package/addon/templates/connectivity/events/index.hbs +1 -0
  176. package/addon/templates/connectivity/sensors/index/details.hbs +1 -0
  177. package/addon/templates/connectivity/sensors/index.hbs +1 -0
  178. package/addon/templates/maintenance/equipment/index/details.hbs +1 -0
  179. package/addon/templates/maintenance/equipment/index.hbs +2 -0
  180. package/addon/templates/maintenance/inspection-forms/index/details.hbs +1 -0
  181. package/addon/templates/maintenance/inspection-forms/index.hbs +1 -0
  182. package/addon/templates/maintenance/inspection-submissions/index/details.hbs +1 -0
  183. package/addon/templates/maintenance/inspection-submissions/index.hbs +1 -0
  184. package/addon/templates/maintenance/maintenances/index/details.hbs +1 -0
  185. package/addon/templates/maintenance/maintenances/index.hbs +1 -0
  186. package/addon/templates/maintenance/parts/index/details.hbs +1 -0
  187. package/addon/templates/maintenance/parts/index.hbs +2 -0
  188. package/addon/templates/maintenance/schedules/index/details.hbs +1 -0
  189. package/addon/templates/maintenance/schedules/index.hbs +2 -0
  190. package/addon/templates/maintenance/work-orders/index/details.hbs +1 -0
  191. package/addon/templates/maintenance/work-orders/index.hbs +1 -0
  192. package/addon/templates/management/contacts/customers/details.hbs +1 -0
  193. package/addon/templates/management/contacts/customers.hbs +1 -0
  194. package/addon/templates/management/contacts/index/details.hbs +1 -0
  195. package/addon/templates/management/contacts/index.hbs +1 -0
  196. package/addon/templates/management/contacts.hbs +1 -0
  197. package/addon/templates/management/drivers/index/details.hbs +1 -0
  198. package/addon/templates/management/drivers/index.hbs +2 -0
  199. package/addon/templates/management/fleets/index/details.hbs +1 -0
  200. package/addon/templates/management/fleets/index.hbs +1 -0
  201. package/addon/templates/management/fuel-reports/index/details.hbs +1 -0
  202. package/addon/templates/management/fuel-reports/index.hbs +1 -0
  203. package/addon/templates/management/fuel-transactions/index.hbs +1 -0
  204. package/addon/templates/management/issues/index/details.hbs +1 -0
  205. package/addon/templates/management/issues/index.hbs +1 -0
  206. package/addon/templates/management/places/index/details.hbs +1 -0
  207. package/addon/templates/management/places/index.hbs +1 -0
  208. package/addon/templates/management/trailers/index/details.hbs +1 -0
  209. package/addon/templates/management/trailers/index.hbs +2 -0
  210. package/addon/templates/management/vehicles/index/details.hbs +1 -0
  211. package/addon/templates/management/vehicles/index.hbs +2 -0
  212. package/addon/templates/management/vendors/index/details.hbs +1 -0
  213. package/addon/templates/management/vendors/index.hbs +2 -0
  214. package/addon/templates/management/vendors/integrated.hbs +1 -0
  215. package/addon/templates/operations/orders/index/details.hbs +1 -0
  216. package/addon/templates/operations/orders/index.hbs +1 -0
  217. package/addon/templates/operations/service-rates/index/details.hbs +1 -0
  218. package/addon/templates/operations/service-rates/index.hbs +1 -0
  219. package/addon/templates/settings/telematics.hbs +70 -0
  220. package/addon/utils/normalize-order-config-flow.js +6 -1
  221. package/app/components/admin/telematics-settings.js +1 -0
  222. package/app/components/map/marker-card/driver.js +1 -0
  223. package/app/components/map/marker-card/vehicle.js +1 -0
  224. package/app/controllers/settings/telematics.js +1 -0
  225. package/app/routes/settings/telematics.js +1 -0
  226. package/app/services/order-presentation.js +1 -0
  227. package/app/templates/settings/telematics.js +1 -0
  228. package/composer.json +2 -2
  229. package/docs/AFAQY.md +1 -1
  230. package/docs/TELEMATICS_QUEUES.md +1 -1
  231. package/docs/TELEMETRY_ARCHITECTURE.md +72 -1
  232. package/extension.json +1 -1
  233. package/package.json +3 -3
  234. package/server/config/telemetry.php +12 -0
  235. package/server/migrations/2026_09_23_000001_add_retention_index_to_device_events.php +40 -0
  236. package/server/migrations/2026_09_23_000002_add_retention_index_to_positions.php +40 -0
  237. package/server/migrations/2026_09_23_000003_add_retention_index_to_telematic_sync_runs.php +40 -0
  238. package/server/src/Auth/Schemas/FleetOps.php +104 -5
  239. package/server/src/Console/Commands/DrainTelematicInbox.php +3 -13
  240. package/server/src/Console/Commands/ProcessOperationalAlerts.php +3 -3
  241. package/server/src/Console/Commands/PruneTelematicsData.php +318 -0
  242. package/server/src/Http/Controllers/Api/v1/OrchestrationController.php +9 -0
  243. package/server/src/Http/Controllers/FleetOpsController.php +21 -0
  244. package/server/src/Http/Controllers/Internal/v1/AnalyticsController.php +11 -0
  245. package/server/src/Http/Controllers/Internal/v1/ContactController.php +11 -0
  246. package/server/src/Http/Controllers/Internal/v1/CustomerController.php +14 -0
  247. package/server/src/Http/Controllers/Internal/v1/DeviceController.php +13 -0
  248. package/server/src/Http/Controllers/Internal/v1/DeviceEventController.php +11 -0
  249. package/server/src/Http/Controllers/Internal/v1/DriverController.php +22 -0
  250. package/server/src/Http/Controllers/Internal/v1/FuelProviderConnectionController.php +13 -0
  251. package/server/src/Http/Controllers/Internal/v1/FuelProviderTransactionController.php +15 -0
  252. package/server/src/Http/Controllers/Internal/v1/FuelReportController.php +9 -3
  253. package/server/src/Http/Controllers/Internal/v1/InspectionFormController.php +15 -0
  254. package/server/src/Http/Controllers/Internal/v1/LiveController.php +16 -0
  255. package/server/src/Http/Controllers/Internal/v1/MaintenanceController.php +15 -0
  256. package/server/src/Http/Controllers/Internal/v1/MaintenanceScheduleController.php +15 -0
  257. package/server/src/Http/Controllers/Internal/v1/ManifestController.php +15 -0
  258. package/server/src/Http/Controllers/Internal/v1/MetricsController.php +11 -0
  259. package/server/src/Http/Controllers/Internal/v1/NavigatorController.php +42 -1
  260. package/server/src/Http/Controllers/Internal/v1/OrchestrationController.php +12 -0
  261. package/server/src/Http/Controllers/Internal/v1/OrderController.php +56 -4
  262. package/server/src/Http/Controllers/Internal/v1/PaymentController.php +13 -0
  263. package/server/src/Http/Controllers/Internal/v1/RadarController.php +19 -0
  264. package/server/src/Http/Controllers/Internal/v1/ServiceAreaController.php +9 -3
  265. package/server/src/Http/Controllers/Internal/v1/SettingController.php +465 -14
  266. package/server/src/Http/Controllers/Internal/v1/TelematicController.php +21 -0
  267. package/server/src/Http/Controllers/Internal/v1/TrailerController.php +21 -0
  268. package/server/src/Http/Controllers/Internal/v1/VehicleController.php +21 -0
  269. package/server/src/Http/Controllers/Internal/v1/VendorController.php +17 -0
  270. package/server/src/Http/Controllers/Internal/v1/WorkOrderController.php +11 -0
  271. package/server/src/Jobs/DispatchTelematicsRetentionJobs.php +70 -0
  272. package/server/src/Jobs/PruneTelematicsDataJob.php +74 -0
  273. package/server/src/Listeners/NotifyDriverOnShiftChange.php +3 -3
  274. package/server/src/Mail/CustomerCredentialsMail.php +1 -1
  275. package/server/src/Models/Order.php +35 -3
  276. package/server/src/Models/OrderConfig.php +129 -0
  277. package/server/src/Models/TrackingNumber.php +8 -4
  278. package/server/src/Orchestration/Engines/VroomOrchestrationEngine.php +9 -1
  279. package/server/src/Providers/FleetOpsServiceProvider.php +3 -0
  280. package/server/src/Support/Analytics/LiveFleet.php +18 -2
  281. package/server/src/Support/Authorization.php +103 -0
  282. package/server/src/Support/Database/TableIndexes.php +66 -0
  283. package/server/src/Support/OrderTracker.php +2 -2
  284. package/server/src/Support/Reporting/FleetOpsReportSchema.php +476 -116
  285. package/server/src/Support/Telematics/Retention/RetentionPolicy.php +300 -0
  286. package/server/src/Support/Telematics/Retention/TelemetryActivity.php +40 -0
  287. package/server/src/Support/Telematics/TelematicService.php +12 -2
  288. package/server/src/Support/Telematics/Telemetry/Ingestor.php +4 -2
  289. package/server/src/Tracking/TrackingIntelligenceService.php +1 -1
  290. package/server/src/Tracking/TrackingOptions.php +2 -2
  291. package/server/src/Traits/AuthorizesMethods.php +37 -0
  292. package/server/src/routes.php +9 -1
  293. package/server/tests/AnalyticsRoutesTest.php +29 -2
  294. package/server/tests/Feature/Http/AfaqyRealtimeIngestionTest.php +16 -1
  295. package/server/tests/Feature/Http/Api/TelematicsRetentionIndexMigrationTest.php +115 -0
  296. package/server/tests/Feature/Http/Internal/OrderControllerActivityFlowsTest.php +72 -0
  297. package/server/tests/Feature/Http/Internal/OrderControllerCreateRecordTest.php +26 -0
  298. package/server/tests/Feature/Http/Internal/SettingControllerHelpersTest.php +71 -0
  299. package/server/tests/Feature/Http/Internal/TelematicsStorageDeadlinesTest.php +119 -0
  300. package/server/tests/InternalImportExportControllerContractsTest.php +5 -8
  301. package/server/tests/NavigatorControllerContractsTest.php +36 -4
  302. package/server/tests/NotificationAndMailContractsTest.php +31 -0
  303. package/server/tests/ObserverContractsTest.php +1 -1
  304. package/server/tests/OrchestratorConsumableApiTest.php +42 -0
  305. package/server/tests/OrderConfigLifecycleTest.php +120 -0
  306. package/server/tests/ProviderContractsTest.php +10 -0
  307. package/server/tests/ReportSchemaContractsTest.php +120 -6
  308. package/server/tests/SettingControllerContractsTest.php +429 -18
  309. package/server/tests/SmallControllerContractsTest.php +8 -5
  310. package/server/tests/Support/PruneTelematicsDataProbe.php +55 -0
  311. package/server/tests/Unit/Console/Commands/ProcessOperationalAlertsCommandTest.php +2 -2
  312. package/server/tests/Unit/Console/PruneTelematicsDataCommandTest.php +353 -0
  313. package/server/tests/Unit/Events/OrderDispatchFailedTest.php +2 -1
  314. package/server/tests/Unit/Jobs/DispatchTelematicsRetentionJobsTest.php +114 -0
  315. package/server/tests/Unit/Jobs/PruneTelematicsDataJobTest.php +60 -0
  316. package/server/tests/Unit/Orchestration/VroomEngineTransportAndSettingsTest.php +20 -0
  317. package/server/tests/Unit/Support/Analytics/LiveFleetTest.php +6 -0
  318. package/server/tests/Unit/Support/AuthorizationTest.php +142 -0
  319. package/server/tests/Unit/Support/MaintainableAndOperationalAlertsTest.php +12 -1
  320. package/server/tests/Unit/Support/MoreQuerySeamsTest.php +11 -2
  321. package/server/tests/Unit/Support/Telematics/Retention/RetentionPolicyTest.php +190 -0
  322. package/server/tests/Unit/Support/Telematics/Retention/TelemetryActivityTest.php +68 -0
  323. package/server/tests/Unit/Tracking/TrackingOptionsCompanySettingsTest.php +109 -0
  324. package/translations/en-us.yaml +108 -0
@@ -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',
@@ -146,6 +162,38 @@ export default {
146
162
 
147
163
  // Create registries
148
164
  this.createRegistries(registryService);
165
+
166
+ // Declare the registries extensions can add table columns, actions and
167
+ // buttons to, e.g. `fleet-ops:driver:table:columns` or `fleet-ops:order:details:menu`.
168
+ universe
169
+ .getService('universe/resource-view-service')
170
+ ?.declare('fleet-ops', [
171
+ 'contact',
172
+ 'customer',
173
+ 'device',
174
+ 'device-event',
175
+ 'driver',
176
+ 'equipment',
177
+ 'fleet',
178
+ 'fuel-report',
179
+ 'fuel-transaction',
180
+ 'inspection-form',
181
+ 'inspection-submission',
182
+ 'integrated-vendor',
183
+ 'issue',
184
+ 'maintenance',
185
+ 'order',
186
+ 'part',
187
+ 'place',
188
+ 'report',
189
+ 'schedule',
190
+ 'sensor',
191
+ 'service-rate',
192
+ 'trailer',
193
+ 'vehicle',
194
+ 'vendor',
195
+ 'work-order',
196
+ ]);
149
197
  registryService.registerRenderableComponent('ai:action-preview:fleet-ops.create_order', new ExtensionComponent('@fleetbase/fleetops-engine', 'ai/create-order-preview'));
150
198
 
151
199
  // // Register console home guidance
@@ -161,6 +209,14 @@ export default {
161
209
  },
162
210
 
163
211
  registerWidgets(widgetService) {
212
+ // `order` places a default widget on the default dashboard, which mixes widgets from
213
+ // every extension; the grid fills rows first-fit, lowest order first (widgets without
214
+ // one follow). The default layout is:
215
+ // 10-40 KPI row: Radar, Revenue (ledger, 20), Active Orders, Drivers Online
216
+ // 41-44 Ledger KPI row: Expenses, Net Income, Outstanding AR, Overdue AR
217
+ // 50 Live Fleet Map, full width
218
+ // 60-80 Revenue Trend, Top Drivers, Maintenance Overview, a third of the width each
219
+ // 150-170 Ledger Recent Financial Activity + Cash Flow Summary | console Blog + GitHub
164
220
  const widgets = [
165
221
  // Legacy monolithic 13-tile widget — kept registered for one release as
166
222
  // users have it pinned to existing dashboards. The new KPI tile widgets
@@ -186,7 +242,7 @@ export default {
186
242
  component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/kpi-earnings'),
187
243
  grid_options: { w: 3, h: 4, minW: 3, minH: 4 },
188
244
  category: 'KPI Tiles',
189
- default: true,
245
+ default: false,
190
246
  }),
191
247
  new Widget({
192
248
  id: 'fleet-ops-kpi-aov-widget',
@@ -196,7 +252,7 @@ export default {
196
252
  component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/kpi-aov'),
197
253
  grid_options: { w: 3, h: 4, minW: 3, minH: 4 },
198
254
  category: 'KPI Tiles',
199
- default: true,
255
+ default: false,
200
256
  }),
201
257
  new Widget({
202
258
  id: 'fleet-ops-kpi-distance-widget',
@@ -216,6 +272,7 @@ export default {
216
272
  component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/kpi-active-orders'),
217
273
  grid_options: { w: 3, h: 4, minW: 3, minH: 4 },
218
274
  category: 'KPI Tiles',
275
+ order: 30,
219
276
  default: true,
220
277
  }),
221
278
  new Widget({
@@ -226,6 +283,7 @@ export default {
226
283
  component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/kpi-drivers-online'),
227
284
  grid_options: { w: 3, h: 4, minW: 3, minH: 4 },
228
285
  category: 'KPI Tiles',
286
+ order: 40,
229
287
  default: true,
230
288
  }),
231
289
  new Widget({
@@ -236,6 +294,7 @@ export default {
236
294
  component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/radar'),
237
295
  grid_options: { w: 3, h: 4, minW: 3, minH: 4 },
238
296
  category: 'KPI Tiles',
297
+ order: 10,
239
298
  default: true,
240
299
  }),
241
300
  new Widget({
@@ -266,8 +325,9 @@ export default {
266
325
  description: 'Real-time driver positions and active routes.',
267
326
  icon: 'map-location-dot',
268
327
  component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/live-fleet'),
269
- grid_options: { w: 8, h: 11, minW: 8, minH: 8 },
328
+ grid_options: { w: 12, h: 12, minW: 8, minH: 8 },
270
329
  category: 'Maps',
330
+ order: 50,
271
331
  default: true,
272
332
  }),
273
333
  new Widget({
@@ -276,8 +336,9 @@ export default {
276
336
  description: 'Revenue over time with period comparison.',
277
337
  icon: 'chart-line',
278
338
  component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/revenue-trend'),
279
- grid_options: { w: 4, h: 11, minW: 4, minH: 8 },
339
+ grid_options: { w: 4, h: 9, minW: 4, minH: 7 },
280
340
  category: 'Analytics',
341
+ order: 60,
281
342
  default: true,
282
343
  }),
283
344
  new Widget({
@@ -306,8 +367,9 @@ export default {
306
367
  description: 'Driver leaderboard sortable by orders, on-time %, or distance.',
307
368
  icon: 'medal',
308
369
  component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/top-drivers'),
309
- grid_options: { w: 6, h: 6, minW: 5, minH: 5 },
370
+ grid_options: { w: 4, h: 9, minW: 4, minH: 6 },
310
371
  category: 'Analytics',
372
+ order: 70,
311
373
  default: true,
312
374
  }),
313
375
  new Widget({
@@ -346,8 +408,9 @@ export default {
346
408
  description: 'Overdue, scheduled, and YTD maintenance spend.',
347
409
  icon: 'wrench',
348
410
  component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/maintenance-overview'),
349
- grid_options: { w: 6, h: 6, minW: 5, minH: 5 },
411
+ grid_options: { w: 4, h: 9, minW: 4, minH: 6 },
350
412
  category: 'Analytics',
413
+ order: 80,
351
414
  default: true,
352
415
  }),
353
416
  new Widget({
@@ -456,6 +519,7 @@ export default {
456
519
  'fleet-ops:template:settings:routing',
457
520
  'fleet-ops:template:settings:orchestrator',
458
521
  'fleet-ops:component:admin:routing-settings',
522
+ 'fleet-ops:component:admin:telematics-settings',
459
523
  ]);
460
524
  },
461
525
  };
@@ -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
+ }