@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.
Files changed (360) hide show
  1. package/README.md +0 -2
  2. package/addon/components/cell/telematic-provider.hbs +16 -0
  3. package/addon/components/cell/telematic-provider.js +36 -0
  4. package/addon/components/cell/telematic-status.hbs +1 -0
  5. package/addon/components/cell/telematic-status.js +39 -0
  6. package/addon/components/device/manager.hbs +5 -6
  7. package/addon/components/device/manager.js +12 -15
  8. package/addon/components/driver/details.hbs +1 -1
  9. package/addon/components/fleet/vehicle-listing.js +1 -0
  10. package/addon/components/fuel-integration/form.hbs +200 -0
  11. package/addon/components/fuel-integration/form.js +242 -0
  12. package/addon/components/fuel-integration/hub.hbs +154 -0
  13. package/addon/components/fuel-integration/hub.js +165 -0
  14. package/addon/components/fuel-integration/matching-priority.hbs +76 -0
  15. package/addon/components/fuel-integration/matching-priority.js +145 -0
  16. package/addon/components/fuel-report/details.hbs +13 -1
  17. package/addon/components/issue/details.hbs +3 -57
  18. package/addon/components/issue/details.js +0 -96
  19. package/addon/components/layout/fleet-ops-sidebar.js +20 -2
  20. package/addon/components/map/drawer/device-event-listing.hbs +12 -2
  21. package/addon/components/map/drawer/driver-listing.hbs +14 -1
  22. package/addon/components/map/drawer/place-listing.hbs +14 -1
  23. package/addon/components/map/drawer/position-listing.hbs +12 -2
  24. package/addon/components/map/drawer/vehicle-listing.hbs +14 -1
  25. package/addon/components/modals/assigned-orders.hbs +40 -0
  26. package/addon/components/modals/attach-device.hbs +4 -3
  27. package/addon/components/modals/attach-telematic-device.hbs +25 -0
  28. package/addon/components/modals/attach-telematic-device.js +3 -0
  29. package/addon/components/modals/driver-assign-order.hbs +7 -58
  30. package/addon/components/modals/driver-assign-vehicle.hbs +10 -2
  31. package/addon/components/modals/fleet-assign-driver.hbs +18 -0
  32. package/addon/components/modals/fleet-assign-driver.js +3 -0
  33. package/addon/components/modals/fleet-assign-vehicle.hbs +18 -0
  34. package/addon/components/modals/fleet-assign-vehicle.js +3 -0
  35. package/addon/components/modals/telematic-connection-diagnostics.hbs +75 -0
  36. package/addon/components/modals/telematic-connection-diagnostics.js +287 -0
  37. package/addon/components/modals/vehicle-details.hbs +6 -1
  38. package/addon/components/modals/vehicle-form.hbs +8 -1
  39. package/addon/components/order/card.hbs +106 -0
  40. package/addon/components/order/card.js +257 -0
  41. package/addon/components/order/form/service-rate.hbs +2 -0
  42. package/addon/components/service-rate/form.hbs +3 -2
  43. package/addon/components/telematic/details.hbs +98 -87
  44. package/addon/components/telematic/details.js +230 -1
  45. package/addon/components/telematic/form.hbs +303 -72
  46. package/addon/components/telematic/form.js +519 -3
  47. package/addon/components/telematic/hub.hbs +149 -0
  48. package/addon/components/telematic/hub.js +142 -0
  49. package/addon/components/telematic/settings.hbs +152 -0
  50. package/addon/components/telematic/settings.js +45 -0
  51. package/addon/components/telematic/tab-empty-state.hbs +29 -0
  52. package/addon/components/telematic/tab-empty-state.js +33 -0
  53. package/addon/components/vehicle/details.hbs +6 -1
  54. package/addon/components/vehicle/form.hbs +2 -1
  55. package/addon/components/widget/fuel-providers.hbs +43 -0
  56. package/addon/components/widget/fuel-providers.js +27 -0
  57. package/addon/controllers/connectivity/devices/index/details.js +27 -1
  58. package/addon/controllers/connectivity/devices/index.js +14 -0
  59. package/addon/controllers/connectivity/fuel-providers/details/sync.js +18 -0
  60. package/addon/controllers/connectivity/fuel-providers/details/transactions.js +24 -0
  61. package/addon/controllers/connectivity/fuel-providers/details.js +69 -0
  62. package/addon/controllers/connectivity/fuel-providers/edit.js +24 -0
  63. package/addon/controllers/connectivity/fuel-providers/index.js +177 -0
  64. package/addon/controllers/connectivity/fuel-providers/new.js +37 -0
  65. package/addon/controllers/connectivity/telematics/details/attachments.js +247 -0
  66. package/addon/controllers/connectivity/telematics/details/devices.js +368 -0
  67. package/addon/controllers/connectivity/telematics/details/events.js +244 -0
  68. package/addon/controllers/connectivity/telematics/details/index.js +3 -0
  69. package/addon/controllers/connectivity/telematics/details/logs.js +43 -0
  70. package/addon/controllers/connectivity/telematics/details/sensors.js +270 -0
  71. package/addon/controllers/connectivity/telematics/details.js +149 -0
  72. package/addon/controllers/connectivity/telematics/{index/edit.js → edit.js} +15 -4
  73. package/addon/controllers/connectivity/telematics/index.js +25 -5
  74. package/addon/controllers/connectivity/telematics/{index/new.js → new.js} +8 -2
  75. package/addon/controllers/management/drivers/index/details.js +78 -1
  76. package/addon/controllers/management/drivers/index.js +39 -0
  77. package/addon/controllers/management/fleets/index/details.js +23 -1
  78. package/addon/controllers/management/fleets/index.js +6 -1
  79. package/addon/controllers/management/fuel-reports/index.js +37 -1
  80. package/addon/controllers/management/fuel-transactions/index/details.js +70 -0
  81. package/addon/controllers/management/fuel-transactions/index.js +240 -0
  82. package/addon/controllers/management/vehicles/index/details.js +32 -0
  83. package/addon/controllers/management/vehicles/index.js +26 -0
  84. package/addon/controllers/operations/orders/index.js +4 -0
  85. package/addon/controllers/settings/payments/index.js +5 -0
  86. package/addon/extension.js +10 -0
  87. package/addon/routes/connectivity/fuel-providers/details/index.js +7 -0
  88. package/addon/routes/connectivity/fuel-providers/details/matching.js +7 -0
  89. package/addon/routes/connectivity/fuel-providers/details/settings.js +7 -0
  90. package/addon/routes/connectivity/fuel-providers/details/sync.js +18 -0
  91. package/addon/routes/connectivity/fuel-providers/details/transactions.js +14 -0
  92. package/addon/routes/connectivity/fuel-providers/details.js +18 -0
  93. package/addon/routes/connectivity/fuel-providers/edit.js +18 -0
  94. package/addon/routes/connectivity/fuel-providers/index.js +20 -0
  95. package/addon/routes/connectivity/fuel-providers/new.js +3 -0
  96. package/addon/routes/connectivity/fuel-providers.js +3 -0
  97. package/addon/routes/connectivity/telematics/details/attachments.js +28 -0
  98. package/addon/routes/connectivity/telematics/details/devices.js +30 -0
  99. package/addon/routes/connectivity/telematics/details/events.js +33 -0
  100. package/addon/routes/connectivity/telematics/details/index.js +3 -0
  101. package/addon/routes/connectivity/telematics/details/logs.js +17 -0
  102. package/addon/routes/connectivity/telematics/details/sensors.js +29 -0
  103. package/addon/routes/connectivity/telematics/{index/details.js → details.js} +1 -1
  104. package/addon/routes/connectivity/telematics/{index/edit.js → edit.js} +1 -1
  105. package/addon/routes/connectivity/telematics/new.js +3 -0
  106. package/addon/routes/management/drivers/index/details/activity.js +3 -0
  107. package/addon/routes/management/fuel-reports/index.js +2 -0
  108. package/addon/routes/management/fuel-transactions/index/details.js +18 -0
  109. package/addon/routes/management/fuel-transactions/index.js +21 -0
  110. package/addon/routes/management/fuel-transactions.js +3 -0
  111. package/addon/routes.js +28 -9
  112. package/addon/services/device-actions.js +64 -1
  113. package/addon/services/device-event-actions.js +12 -1
  114. package/addon/services/driver-actions.js +147 -11
  115. package/addon/services/fleet-actions.js +66 -1
  116. package/addon/services/fuel-integration-actions.js +31 -0
  117. package/addon/services/issue-actions.js +1 -1
  118. package/addon/services/telematic-actions.js +9 -3
  119. package/addon/services/vehicle-actions.js +125 -0
  120. package/addon/styles/fleetops-engine.css +310 -34
  121. package/addon/templates/analytics/reports/index.hbs +19 -1
  122. package/addon/templates/connectivity/devices/index.hbs +19 -1
  123. package/addon/templates/connectivity/events/index.hbs +16 -1
  124. package/addon/templates/connectivity/fuel-providers/details/index.hbs +38 -0
  125. package/addon/templates/connectivity/fuel-providers/details/matching.hbs +13 -0
  126. package/addon/templates/connectivity/fuel-providers/details/settings.hbs +11 -0
  127. package/addon/templates/connectivity/fuel-providers/details/sync.hbs +48 -0
  128. package/addon/templates/connectivity/fuel-providers/details/transactions.hbs +21 -0
  129. package/addon/templates/connectivity/fuel-providers/details.hbs +51 -0
  130. package/addon/templates/connectivity/fuel-providers/edit.hbs +24 -0
  131. package/addon/templates/connectivity/fuel-providers/index.hbs +12 -0
  132. package/addon/templates/connectivity/fuel-providers/new.hbs +22 -0
  133. package/addon/templates/connectivity/fuel-providers.hbs +1 -0
  134. package/addon/templates/connectivity/sensors/index.hbs +19 -1
  135. package/addon/templates/connectivity/telematics/details/attachments.hbs +163 -0
  136. package/addon/templates/connectivity/telematics/details/devices.hbs +88 -0
  137. package/addon/templates/connectivity/telematics/details/events.hbs +101 -0
  138. package/addon/templates/connectivity/telematics/{index/details → details}/index.hbs +0 -1
  139. package/addon/templates/connectivity/telematics/details/logs.hbs +69 -0
  140. package/addon/templates/connectivity/telematics/details/sensors.hbs +88 -0
  141. package/addon/templates/connectivity/telematics/details.hbs +53 -0
  142. package/addon/templates/connectivity/telematics/edit.hbs +27 -0
  143. package/addon/templates/connectivity/telematics/index.hbs +6 -8
  144. package/addon/templates/connectivity/telematics/new.hbs +24 -0
  145. package/addon/templates/maintenance/equipment/index.hbs +19 -1
  146. package/addon/templates/maintenance/maintenances/index.hbs +15 -1
  147. package/addon/templates/maintenance/parts/index.hbs +19 -1
  148. package/addon/templates/maintenance/schedules/index.hbs +19 -1
  149. package/addon/templates/maintenance/work-orders/index.hbs +19 -1
  150. package/addon/templates/management/contacts/customers.hbs +15 -1
  151. package/addon/templates/management/contacts/index.hbs +19 -1
  152. package/addon/templates/management/drivers/index/details/activity.hbs +1 -0
  153. package/addon/templates/management/drivers/index.hbs +19 -1
  154. package/addon/templates/management/fleets/index.hbs +19 -1
  155. package/addon/templates/management/fuel-reports/index.hbs +19 -1
  156. package/addon/templates/management/fuel-transactions/index/details.hbs +73 -0
  157. package/addon/templates/management/fuel-transactions/index.hbs +58 -0
  158. package/addon/templates/management/fuel-transactions.hbs +1 -0
  159. package/addon/templates/management/issues/index.hbs +19 -1
  160. package/addon/templates/management/places/index.hbs +19 -1
  161. package/addon/templates/management/vehicles/index.hbs +19 -1
  162. package/addon/templates/management/vendors/index.hbs +19 -1
  163. package/addon/templates/management/vendors/integrated.hbs +13 -1
  164. package/addon/templates/operations/orders/index.hbs +19 -1
  165. package/addon/templates/operations/service-rates/index.hbs +19 -1
  166. package/addon/templates/settings/payments/index.hbs +15 -1
  167. package/addon/utils/fleet-ops-options.js +3 -0
  168. package/app/components/cell/telematic-provider.js +1 -0
  169. package/app/components/cell/telematic-status.js +1 -0
  170. package/app/components/fuel-integration/form.js +1 -0
  171. package/app/components/fuel-integration/hub.js +1 -0
  172. package/app/components/fuel-integration/matching-priority.js +1 -0
  173. package/app/components/modals/assigned-orders.js +1 -0
  174. package/app/components/modals/attach-telematic-device.js +1 -0
  175. package/app/components/modals/fleet-assign-driver.js +1 -0
  176. package/app/components/modals/fleet-assign-vehicle.js +1 -0
  177. package/app/components/modals/telematic-connection-diagnostics.js +1 -0
  178. package/app/components/order/card.js +1 -0
  179. package/app/components/telematic/hub.js +1 -0
  180. package/app/components/telematic/settings.js +1 -0
  181. package/app/components/telematic/tab-empty-state.js +1 -0
  182. package/app/components/widget/fuel-providers.js +1 -0
  183. package/app/controllers/connectivity/fuel-providers/details/sync.js +1 -0
  184. package/app/controllers/connectivity/{telematics/index/details/devices.js → fuel-providers/details/transactions.js} +1 -1
  185. package/app/controllers/connectivity/{telematics/index → fuel-providers}/details.js +1 -1
  186. package/app/controllers/connectivity/{telematics/index → fuel-providers}/edit.js +1 -1
  187. package/app/controllers/connectivity/{telematics/index/details → fuel-providers}/index.js +1 -1
  188. package/app/controllers/connectivity/{telematics/index → fuel-providers}/new.js +1 -1
  189. package/app/controllers/connectivity/telematics/details/attachments.js +1 -0
  190. package/app/controllers/connectivity/telematics/details/devices.js +1 -0
  191. package/app/controllers/connectivity/telematics/details/events.js +1 -0
  192. package/app/controllers/connectivity/telematics/details/index.js +1 -0
  193. package/app/controllers/connectivity/telematics/details/logs.js +1 -0
  194. package/app/controllers/connectivity/telematics/details/sensors.js +1 -0
  195. package/app/controllers/connectivity/telematics/details.js +1 -0
  196. package/app/controllers/connectivity/telematics/edit.js +1 -0
  197. package/app/controllers/connectivity/telematics/new.js +1 -0
  198. package/app/controllers/management/fuel-transactions/index/details.js +1 -0
  199. package/app/controllers/management/fuel-transactions/index.js +1 -0
  200. package/app/routes/connectivity/{telematics/index → fuel-providers}/details/index.js +1 -1
  201. package/app/routes/connectivity/{telematics/index/details/events.js → fuel-providers/details/matching.js} +1 -1
  202. package/app/routes/connectivity/fuel-providers/details/settings.js +1 -0
  203. package/app/routes/connectivity/fuel-providers/details/sync.js +1 -0
  204. package/app/routes/connectivity/{telematics/index/details/devices.js → fuel-providers/details/transactions.js} +1 -1
  205. package/app/routes/connectivity/{telematics/index → fuel-providers}/details.js +1 -1
  206. package/app/routes/connectivity/{telematics/index → fuel-providers}/edit.js +1 -1
  207. package/app/routes/connectivity/fuel-providers/index.js +1 -0
  208. package/app/routes/connectivity/{telematics/index → fuel-providers}/new.js +1 -1
  209. package/app/routes/connectivity/fuel-providers.js +1 -0
  210. package/app/routes/connectivity/telematics/details/attachments.js +1 -0
  211. package/app/routes/connectivity/telematics/details/devices.js +1 -0
  212. package/app/routes/connectivity/telematics/details/events.js +1 -0
  213. package/app/routes/connectivity/telematics/details/index.js +1 -0
  214. package/app/routes/connectivity/telematics/details/logs.js +1 -0
  215. package/app/routes/connectivity/telematics/details/sensors.js +1 -0
  216. package/app/routes/connectivity/telematics/details.js +1 -0
  217. package/app/routes/connectivity/telematics/edit.js +1 -0
  218. package/app/routes/connectivity/telematics/new.js +1 -0
  219. package/app/routes/management/drivers/index/details/activity.js +1 -0
  220. package/app/routes/management/fuel-transactions/index/details.js +1 -0
  221. package/app/routes/management/fuel-transactions/index.js +1 -0
  222. package/app/routes/management/fuel-transactions.js +1 -0
  223. package/app/services/fuel-integration-actions.js +1 -0
  224. package/app/templates/connectivity/{telematics/index → fuel-providers}/details/index.js +1 -1
  225. package/app/templates/connectivity/{telematics/index/details/events.js → fuel-providers/details/matching.js} +1 -1
  226. package/app/templates/connectivity/fuel-providers/details/settings.js +1 -0
  227. package/app/templates/connectivity/fuel-providers/details/sync.js +1 -0
  228. package/app/templates/connectivity/{telematics/index/details/devices.js → fuel-providers/details/transactions.js} +1 -1
  229. package/app/templates/connectivity/{telematics/index → fuel-providers}/details.js +1 -1
  230. package/app/templates/connectivity/{telematics/index → fuel-providers}/edit.js +1 -1
  231. package/app/templates/connectivity/fuel-providers/index.js +1 -0
  232. package/app/templates/connectivity/{telematics/index → fuel-providers}/new.js +1 -1
  233. package/app/templates/connectivity/fuel-providers.js +1 -0
  234. package/app/templates/connectivity/telematics/details/attachments.js +1 -0
  235. package/app/templates/connectivity/telematics/details/devices.js +1 -0
  236. package/app/templates/connectivity/telematics/details/events.js +1 -0
  237. package/app/templates/connectivity/telematics/details/index.js +1 -0
  238. package/app/templates/connectivity/telematics/details/logs.js +1 -0
  239. package/app/templates/connectivity/telematics/details/sensors.js +1 -0
  240. package/app/templates/connectivity/telematics/details.js +1 -0
  241. package/app/templates/connectivity/telematics/edit.js +1 -0
  242. package/app/templates/connectivity/telematics/new.js +1 -0
  243. package/app/templates/management/drivers/index/details/activity.js +1 -0
  244. package/app/templates/management/fuel-transactions/index/details.js +1 -0
  245. package/app/templates/management/fuel-transactions/index.js +1 -0
  246. package/app/templates/management/fuel-transactions.js +1 -0
  247. package/assets/images/telematics/providers/afaqy.webp +0 -0
  248. package/assets/images/telematics/providers/default.webp +0 -0
  249. package/assets/images/telematics/providers/flespi.webp +0 -0
  250. package/assets/images/telematics/providers/geotab.webp +0 -0
  251. package/assets/images/telematics/providers/safee.webp +0 -0
  252. package/assets/images/telematics/providers/samsara.webp +0 -0
  253. package/composer.json +1 -1
  254. package/extension.json +1 -1
  255. package/package.json +4 -4
  256. package/server/config/fuel-providers.php +42 -0
  257. package/server/config/telematics.php +139 -130
  258. package/server/migrations/2026_06_06_000001_harden_device_events_telematics_contract.php +59 -0
  259. package/server/migrations/2026_06_08_000001_create_fuel_provider_connections_table.php +37 -0
  260. package/server/migrations/2026_06_08_000002_create_fuel_provider_transactions_table.php +53 -0
  261. package/server/migrations/2026_06_08_000003_create_fuel_provider_sync_runs_table.php +40 -0
  262. package/server/migrations/2026_06_10_000001_add_fuel_card_number_to_vehicles_table.php +25 -0
  263. package/server/migrations/2026_06_10_000002_add_vehicle_identity_columns_to_fuel_provider_transactions_table.php +39 -0
  264. package/server/src/Contracts/FuelProvider.php +30 -0
  265. package/server/src/Contracts/TelematicProviderDescriptor.php +3 -1
  266. package/server/src/Events/FuelProviderTransactionImported.php +17 -0
  267. package/server/src/Events/FuelProviderTransactionMatched.php +17 -0
  268. package/server/src/Events/FuelProviderTransactionUnmatched.php +17 -0
  269. package/server/src/Events/FuelReportCreatedFromProvider.php +18 -0
  270. package/server/src/Http/Controllers/Internal/v1/AnalyticsController.php +6 -0
  271. package/server/src/Http/Controllers/Internal/v1/DeviceController.php +76 -2
  272. package/server/src/Http/Controllers/Internal/v1/DeviceEventController.php +44 -0
  273. package/server/src/Http/Controllers/Internal/v1/DriverController.php +158 -7
  274. package/server/src/Http/Controllers/Internal/v1/FuelProviderConnectionController.php +124 -0
  275. package/server/src/Http/Controllers/Internal/v1/FuelProviderSyncRunController.php +10 -0
  276. package/server/src/Http/Controllers/Internal/v1/FuelProviderTransactionController.php +76 -0
  277. package/server/src/Http/Controllers/Internal/v1/SensorController.php +1 -1
  278. package/server/src/Http/Controllers/Internal/v1/TelematicController.php +178 -15
  279. package/server/src/Http/Controllers/Internal/v1/VehicleController.php +165 -0
  280. package/server/src/Http/Controllers/TelematicWebhookController.php +103 -19
  281. package/server/src/Http/Filter/FuelProviderConnectionFilter.php +33 -0
  282. package/server/src/Http/Filter/FuelProviderSyncRunFilter.php +28 -0
  283. package/server/src/Http/Filter/FuelProviderTransactionFilter.php +59 -0
  284. package/server/src/Http/Filter/FuelReportFilter.php +10 -0
  285. package/server/src/Http/Resources/v1/Driver.php +15 -0
  286. package/server/src/Http/Resources/v1/FuelProviderConnection.php +30 -0
  287. package/server/src/Http/Resources/v1/FuelProviderSyncRun.php +36 -0
  288. package/server/src/Http/Resources/v1/FuelProviderTransaction.php +54 -0
  289. package/server/src/Http/Resources/v1/FuelReport.php +28 -22
  290. package/server/src/Http/Resources/v1/Index/Driver.php +26 -20
  291. package/server/src/Http/Resources/v1/Index/Vehicle.php +29 -22
  292. package/server/src/Http/Resources/v1/Vehicle.php +17 -0
  293. package/server/src/Http/Resources/v1/VehicleWithoutDriver.php +2 -0
  294. package/server/src/Jobs/SyncFuelProviderTransactionsJob.php +57 -0
  295. package/server/src/Jobs/SyncTelematicDevicesJob.php +36 -6
  296. package/server/src/Jobs/TestTelematicConnectionJob.php +9 -22
  297. package/server/src/Models/Asset.php +2 -1
  298. package/server/src/Models/Contact.php +2 -1
  299. package/server/src/Models/Device.php +27 -4
  300. package/server/src/Models/DeviceEvent.php +40 -3
  301. package/server/src/Models/Driver.php +2 -1
  302. package/server/src/Models/Equipment.php +2 -1
  303. package/server/src/Models/Fleet.php +2 -1
  304. package/server/src/Models/FuelProviderConnection.php +60 -0
  305. package/server/src/Models/FuelProviderSyncRun.php +58 -0
  306. package/server/src/Models/FuelProviderTransaction.php +119 -0
  307. package/server/src/Models/FuelReport.php +16 -1
  308. package/server/src/Models/Part.php +2 -1
  309. package/server/src/Models/Sensor.php +21 -4
  310. package/server/src/Models/ServiceRate.php +39 -2
  311. package/server/src/Models/Vehicle.php +14 -2
  312. package/server/src/Models/Vendor.php +2 -1
  313. package/server/src/Providers/FleetOpsServiceProvider.php +10 -0
  314. package/server/src/Support/Analytics/FuelProviderSummary.php +42 -0
  315. package/server/src/Support/FuelProviders/FuelProviderDescriptor.php +55 -0
  316. package/server/src/Support/FuelProviders/FuelProviderRegistry.php +75 -0
  317. package/server/src/Support/FuelProviders/FuelProviderService.php +447 -0
  318. package/server/src/Support/FuelProviders/Providers/AbstractFuelProvider.php +98 -0
  319. package/server/src/Support/FuelProviders/Providers/PetroAppFuelProvider.php +167 -0
  320. package/server/src/Support/Telematics/Providers/AbstractProvider.php +27 -6
  321. package/server/src/Support/Telematics/Providers/AfaqyProvider.php +55 -26
  322. package/server/src/Support/Telematics/Providers/FlespiProvider.php +1 -0
  323. package/server/src/Support/Telematics/Providers/GeotabProvider.php +1 -0
  324. package/server/src/Support/Telematics/Providers/SafeeProvider.php +32 -22
  325. package/server/src/Support/Telematics/Providers/SamsaraProvider.php +3 -1
  326. package/server/src/Support/Telematics/TelematicService.php +340 -21
  327. package/server/src/routes.php +41 -4
  328. package/server/tests/FuelProviderRegistryTest.php +416 -0
  329. package/server/tests/ServiceRateAlgorithmWeightVariablesTest.php +44 -0
  330. package/server/tests/TelematicsHardeningTest.php +268 -0
  331. package/server/tests/VehicleDriverAssignmentTest.php +51 -0
  332. package/translations/ar-ae.yml +22 -0
  333. package/translations/bg-bg.yaml +72 -0
  334. package/translations/en-us.yaml +83 -0
  335. package/translations/es-pa.yaml +72 -0
  336. package/translations/fr-fr.yaml +72 -0
  337. package/translations/mn-mn.yaml +72 -0
  338. package/translations/pt-br.yaml +72 -0
  339. package/translations/ru-ru.yaml +72 -0
  340. package/translations/vi-vn.yaml +97 -0
  341. package/addon/controllers/connectivity/telematics/index/details/devices.js +0 -3
  342. package/addon/controllers/connectivity/telematics/index/details/events.js +0 -3
  343. package/addon/controllers/connectivity/telematics/index/details/index.js +0 -3
  344. package/addon/controllers/connectivity/telematics/index/details/sensors.js +0 -3
  345. package/addon/controllers/connectivity/telematics/index/details.js +0 -24
  346. package/addon/routes/connectivity/telematics/index/details/devices.js +0 -3
  347. package/addon/routes/connectivity/telematics/index/details/events.js +0 -3
  348. package/addon/routes/connectivity/telematics/index/details/index.js +0 -3
  349. package/addon/routes/connectivity/telematics/index/details/sensors.js +0 -3
  350. package/addon/routes/connectivity/telematics/index/new.js +0 -3
  351. package/addon/templates/connectivity/telematics/index/details/devices.hbs +0 -1
  352. package/addon/templates/connectivity/telematics/index/details/events.hbs +0 -1
  353. package/addon/templates/connectivity/telematics/index/details/sensors.hbs +0 -1
  354. package/addon/templates/connectivity/telematics/index/details.hbs +0 -14
  355. package/addon/templates/connectivity/telematics/index/edit.hbs +0 -12
  356. package/addon/templates/connectivity/telematics/index/new.hbs +0 -12
  357. package/app/controllers/connectivity/telematics/index/details/events.js +0 -1
  358. package/app/controllers/connectivity/telematics/index/details/sensors.js +0 -1
  359. package/app/routes/connectivity/telematics/index/details/sensors.js +0 -1
  360. package/app/templates/connectivity/telematics/index/details/sensors.js +0 -1
@@ -0,0 +1,149 @@
1
+ import Controller from '@ember/controller';
2
+ import { inject as service } from '@ember/service';
3
+ import { action } from '@ember/object';
4
+ import { task } from 'ember-concurrency';
5
+
6
+ export default class ConnectivityTelematicsDetailsController extends Controller {
7
+ @service hostRouter;
8
+ @service fetch;
9
+ @service modalsManager;
10
+ @service notifications;
11
+
12
+ get tabs() {
13
+ return [
14
+ {
15
+ route: 'connectivity.telematics.details.index',
16
+ label: 'Overview',
17
+ },
18
+ {
19
+ route: 'connectivity.telematics.details.devices',
20
+ label: 'Devices',
21
+ },
22
+ {
23
+ route: 'connectivity.telematics.details.attachments',
24
+ label: 'Vehicle Attachments',
25
+ },
26
+ {
27
+ route: 'connectivity.telematics.details.sensors',
28
+ label: 'Sensors',
29
+ },
30
+ {
31
+ route: 'connectivity.telematics.details.events',
32
+ label: 'Events',
33
+ },
34
+ {
35
+ route: 'connectivity.telematics.details.logs',
36
+ label: 'Logs',
37
+ },
38
+ ].map((tab) => ({
39
+ ...tab,
40
+ active: this.isTabActive(tab.route),
41
+ }));
42
+ }
43
+
44
+ get actionButtons() {
45
+ return [
46
+ {
47
+ icon: 'plug',
48
+ text: 'Test',
49
+ onClick: () => this.openConnectionTestDialog(),
50
+ },
51
+ {
52
+ icon: 'satellite-dish',
53
+ text: 'Discover',
54
+ onClick: () => this.discoverDevices.perform(),
55
+ isLoading: this.discoverDevices.isRunning,
56
+ },
57
+ {
58
+ icon: 'cog',
59
+ fn: () => this.hostRouter.transitionTo('console.fleet-ops.connectivity.telematics.edit', this.model),
60
+ },
61
+ ];
62
+ }
63
+
64
+ get telematicId() {
65
+ return this.model?.id;
66
+ }
67
+
68
+ isTabActive(routeName) {
69
+ return this.hostRouter.currentRouteName?.endsWith(routeName);
70
+ }
71
+
72
+ get healthStatus() {
73
+ switch (this.model?.status) {
74
+ case 'active':
75
+ case 'connected':
76
+ return 'success';
77
+ case 'synchronizing':
78
+ return 'info';
79
+ case 'error':
80
+ case 'degraded':
81
+ case 'disconnected':
82
+ return 'warning';
83
+ case 'initialized':
84
+ return 'default';
85
+ default:
86
+ return 'default';
87
+ }
88
+ }
89
+
90
+ get statusLabel() {
91
+ switch (this.model?.status) {
92
+ case 'initialized':
93
+ return 'Not tested';
94
+ case 'connected':
95
+ return 'Connected';
96
+ case 'synchronizing':
97
+ return 'Syncing';
98
+ case 'active':
99
+ return 'Connected';
100
+ case 'error':
101
+ return 'Needs attention';
102
+ case null:
103
+ case undefined:
104
+ return 'Unknown';
105
+ default:
106
+ return 'Unknown';
107
+ }
108
+ }
109
+
110
+ get connectionTestLabel() {
111
+ switch (this.model?.meta?.last_test_result) {
112
+ case 'success':
113
+ return 'Verified';
114
+ case 'failed':
115
+ return 'Failed';
116
+ default:
117
+ return 'Not tested';
118
+ }
119
+ }
120
+
121
+ get lastSyncAt() {
122
+ if (this.model?.status === 'synchronizing') {
123
+ return this.model?.meta?.last_sync_started_at;
124
+ }
125
+
126
+ return this.model?.meta?.last_sync_completed_at;
127
+ }
128
+
129
+ @action openConnectionTestDialog() {
130
+ this.modalsManager.show('modals/telematic-connection-diagnostics', {
131
+ title: 'Test Connection',
132
+ acceptButtonText: 'Run Test',
133
+ acceptButtonIcon: 'plug',
134
+ declineButtonText: 'Close',
135
+ telematic: this.model,
136
+ onTested: () => this.hostRouter.refresh(),
137
+ });
138
+ }
139
+
140
+ @task *discoverDevices() {
141
+ try {
142
+ const result = yield this.fetch.post(`telematics/${this.telematicId}/discover`);
143
+ this.notifications.success(result.message ?? 'Device discovery initiated.');
144
+ yield this.hostRouter.refresh();
145
+ } catch (error) {
146
+ this.notifications.serverError(error);
147
+ }
148
+ }
149
+ }
@@ -4,7 +4,7 @@ import { inject as service } from '@ember/service';
4
4
  import { action } from '@ember/object';
5
5
  import { task } from 'ember-concurrency';
6
6
 
7
- export default class ConnectivityTelematicsIndexEditController extends Controller {
7
+ export default class ConnectivityTelematicsEditController extends Controller {
8
8
  @service hostRouter;
9
9
  @service intl;
10
10
  @service notifications;
@@ -27,7 +27,7 @@ export default class ConnectivityTelematicsIndexEditController extends Controlle
27
27
  this.events.trackResourceUpdated(telematic);
28
28
  this.overlay?.close();
29
29
 
30
- yield this.hostRouter.transitionTo('console.fleet-ops.connectivity.telematics.index.details', telematic);
30
+ yield this.hostRouter.transitionTo('console.fleet-ops.connectivity.telematics.details', telematic);
31
31
  this.notifications.success(
32
32
  this.intl.t('common.resource-updated-success', {
33
33
  resource: this.intl.t('resource.telematic'),
@@ -52,7 +52,18 @@ export default class ConnectivityTelematicsIndexEditController extends Controlle
52
52
  return this.#confirmContinueWithUnsavedChanges(this.model);
53
53
  }
54
54
 
55
- return this.hostRouter.transitionTo('console.fleet-ops.connectivity.telematics.index.details', this.model);
55
+ return this.hostRouter.transitionTo('console.fleet-ops.connectivity.telematics.details', this.model);
56
+ }
57
+
58
+ @action openConnectionTestDialog() {
59
+ this.modalsManager.show('modals/telematic-connection-diagnostics', {
60
+ title: 'Test Connection',
61
+ acceptButtonText: 'Run Test',
62
+ acceptButtonIcon: 'plug',
63
+ declineButtonText: 'Close',
64
+ telematic: this.model,
65
+ onTested: () => this.hostRouter.refresh(),
66
+ });
56
67
  }
57
68
 
58
69
  #confirmContinueWithUnsavedChanges(telematic, options = {}) {
@@ -62,7 +73,7 @@ export default class ConnectivityTelematicsIndexEditController extends Controlle
62
73
  acceptButtonText: this.intl.t('common.continue'),
63
74
  confirm: async () => {
64
75
  telematic.rollbackAttributes();
65
- await this.hostRouter.transitionTo('console.fleet-ops.connectivity.telematics.index.details', telematic);
76
+ await this.hostRouter.transitionTo('console.fleet-ops.connectivity.telematics.details', telematic);
66
77
  },
67
78
  ...options,
68
79
  });
@@ -1,11 +1,15 @@
1
1
  import Controller from '@ember/controller';
2
2
  import { inject as service } from '@ember/service';
3
3
  import { tracked } from '@glimmer/tracking';
4
+ import { task } from 'ember-concurrency';
4
5
  import fleetOpsOptions from '../../../utils/fleet-ops-options';
5
6
 
6
7
  export default class ConnectivityTelematicsIndexController extends Controller {
7
8
  @service telematicActions;
9
+ @service fetch;
8
10
  @service intl;
11
+ @service notifications;
12
+ @tracked providers = [];
9
13
 
10
14
  /** query params */
11
15
  @tracked queryParams = ['name', 'provider', 'status', 'page', 'limit', 'sort', 'query', 'public_id', 'created_at', 'updated_at'];
@@ -17,6 +21,11 @@ export default class ConnectivityTelematicsIndexController extends Controller {
17
21
  @tracked provider;
18
22
  @tracked status;
19
23
 
24
+ constructor() {
25
+ super(...arguments);
26
+ this.loadProviders.perform();
27
+ }
28
+
20
29
  /** action buttons */
21
30
  @tracked actionButtons = [
22
31
  {
@@ -59,11 +68,11 @@ export default class ConnectivityTelematicsIndexController extends Controller {
59
68
  {
60
69
  sticky: true,
61
70
  label: 'Provider',
62
- valuePath: 'provider',
63
- cellComponent: 'table/cell/anchor',
64
- cellClassNames: 'uppercase',
71
+ valuePath: 'name',
72
+ cellComponent: 'cell/telematic-provider',
65
73
  action: this.telematicActions.transition.view,
66
74
  permission: 'fleet-ops view telematic',
75
+ width: 460,
67
76
  resizable: true,
68
77
  sortable: true,
69
78
  filterable: true,
@@ -73,7 +82,8 @@ export default class ConnectivityTelematicsIndexController extends Controller {
73
82
  {
74
83
  label: this.intl.t('column.status'),
75
84
  valuePath: 'status',
76
- cellComponent: 'table/cell/status',
85
+ cellComponent: 'cell/telematic-status',
86
+ cellClassNames: 'fleetops-provider-connections-cell-middle',
77
87
  resizable: true,
78
88
  sortable: true,
79
89
  filterable: true,
@@ -84,6 +94,7 @@ export default class ConnectivityTelematicsIndexController extends Controller {
84
94
  label: this.intl.t('column.created-at'),
85
95
  valuePath: 'createdAt',
86
96
  sortParam: 'created_at',
97
+ cellClassNames: 'fleetops-provider-connections-cell-middle',
87
98
  resizable: true,
88
99
  sortable: true,
89
100
  filterable: true,
@@ -93,6 +104,7 @@ export default class ConnectivityTelematicsIndexController extends Controller {
93
104
  label: this.intl.t('column.updated-at'),
94
105
  valuePath: 'updatedAt',
95
106
  sortParam: 'updated_at',
107
+ cellClassNames: 'fleetops-provider-connections-cell-middle',
96
108
  resizable: true,
97
109
  sortable: true,
98
110
  hidden: true,
@@ -107,7 +119,7 @@ export default class ConnectivityTelematicsIndexController extends Controller {
107
119
  ddButtonIcon: 'ellipsis-h',
108
120
  ddButtonIconPrefix: 'fas',
109
121
  ddMenuLabel: this.intl.t('common.resource-actions', { resource: this.intl.t('resource.telematic') }),
110
- cellClassNames: 'overflow-visible',
122
+ cellClassNames: 'fleetops-provider-connections-cell-middle overflow-visible',
111
123
  wrapperClass: 'flex items-center justify-end mx-2',
112
124
  sticky: 'right',
113
125
  width: 60,
@@ -137,4 +149,12 @@ export default class ConnectivityTelematicsIndexController extends Controller {
137
149
  searchable: false,
138
150
  },
139
151
  ];
152
+
153
+ @task *loadProviders() {
154
+ try {
155
+ this.providers = yield this.fetch.get('telematics/providers');
156
+ } catch (error) {
157
+ this.notifications.serverError(error);
158
+ }
159
+ }
140
160
  }
@@ -4,7 +4,7 @@ import { inject as service } from '@ember/service';
4
4
  import { action } from '@ember/object';
5
5
  import { task } from 'ember-concurrency';
6
6
 
7
- export default class ConnectivityTelematicsIndexNewController extends Controller {
7
+ export default class ConnectivityTelematicsNewController extends Controller {
8
8
  @service telematicActions;
9
9
  @service hostRouter;
10
10
  @service intl;
@@ -12,6 +12,8 @@ export default class ConnectivityTelematicsIndexNewController extends Controller
12
12
  @service events;
13
13
  @tracked overlay;
14
14
  @tracked telematic = this.telematicActions.createNewInstance();
15
+ queryParams = ['setupProvider'];
16
+ @tracked setupProvider;
15
17
 
16
18
  @task *save(telematic) {
17
19
  try {
@@ -20,7 +22,7 @@ export default class ConnectivityTelematicsIndexNewController extends Controller
20
22
  this.overlay?.close();
21
23
 
22
24
  yield this.hostRouter.refresh();
23
- yield this.hostRouter.transitionTo('console.fleet-ops.connectivity.telematics.index.details', telematic);
25
+ yield this.hostRouter.transitionTo('console.fleet-ops.connectivity.telematics.details', telematic);
24
26
  this.notifications.success('Telematic created successfully.');
25
27
  this.resetForm();
26
28
  } catch (err) {
@@ -31,4 +33,8 @@ export default class ConnectivityTelematicsIndexNewController extends Controller
31
33
  @action resetForm() {
32
34
  this.telematic = this.telematicActions.createNewInstance();
33
35
  }
36
+
37
+ @action cancel() {
38
+ return this.hostRouter.transitionTo('console.fleet-ops.connectivity.telematics.index');
39
+ }
34
40
  }
@@ -1,9 +1,12 @@
1
1
  import Controller from '@ember/controller';
2
+ import { action } from '@ember/object';
2
3
  import { inject as service } from '@ember/service';
3
4
  import { isArray } from '@ember/array';
4
5
 
5
6
  export default class ManagementDriverIndexDetailsController extends Controller {
6
7
  @service('universe/menu-service') menuService;
8
+ @service driverActions;
9
+ @service issueActions;
7
10
  @service hostRouter;
8
11
  @service intl;
9
12
 
@@ -16,22 +19,96 @@ export default class ManagementDriverIndexDetailsController extends Controller {
16
19
  },
17
20
  {
18
21
  route: 'management.drivers.index.details.positions',
19
- label: 'Positions',
22
+ label: this.intl.t('common.positions'),
20
23
  },
21
24
  {
22
25
  route: 'management.drivers.index.details.schedule',
23
26
  label: this.intl.t('common.schedule'),
24
27
  },
28
+ {
29
+ route: 'management.drivers.index.details.activity',
30
+ label: this.intl.t('common.activity'),
31
+ },
25
32
  ...(isArray(registeredTabs) ? registeredTabs : []),
26
33
  ];
27
34
  }
28
35
 
36
+ hasAssignedVehicle(driver) {
37
+ return Boolean(driver?.vehicle_uuid || driver?.vehicle?.id || driver?.vehicle?.uuid || driver?.vehicle_name);
38
+ }
39
+
29
40
  get actionButtons() {
30
41
  return [
31
42
  {
32
43
  icon: 'pencil',
33
44
  fn: () => this.hostRouter.transitionTo('console.fleet-ops.management.drivers.index.edit', this.model),
45
+ permission: 'fleet-ops update driver',
46
+ },
47
+ {
48
+ icon: 'ellipsis-h',
49
+ iconPrefix: 'fas',
50
+ renderInPlace: true,
51
+ items: [
52
+ {
53
+ text: this.intl.t('driver.actions.assign-order'),
54
+ icon: 'clipboard-list',
55
+ fn: () => this.driverActions.assignOrder(this.model),
56
+ permission: 'fleet-ops assign-order-for driver',
57
+ },
58
+ ...(Number(this.model.assigned_orders_count) > 0
59
+ ? [
60
+ {
61
+ text: this.intl.t('driver.actions.unassign-orders'),
62
+ icon: 'user-minus',
63
+ fn: () => this.driverActions.unassignOrders(this.model),
64
+ permission: 'fleet-ops assign-order-for driver',
65
+ },
66
+ ]
67
+ : []),
68
+ {
69
+ separator: true,
70
+ },
71
+ {
72
+ text: this.intl.t('driver.actions.assign-vehicle'),
73
+ icon: 'car',
74
+ fn: () => this.driverActions.assignVehicle(this.model),
75
+ permission: 'fleet-ops assign-vehicle-for driver',
76
+ },
77
+ ...(this.hasAssignedVehicle(this.model)
78
+ ? [
79
+ {
80
+ text: this.intl.t('driver.actions.unassign-vehicle'),
81
+ icon: 'link-slash',
82
+ fn: () => this.driverActions.unassignVehicle(this.model),
83
+ permission: 'fleet-ops assign-vehicle-for driver',
84
+ },
85
+ ]
86
+ : []),
87
+ {
88
+ separator: true,
89
+ },
90
+ {
91
+ text: this.intl.t('driver.actions.locate-driver'),
92
+ icon: 'location-dot',
93
+ fn: () => this.driverActions.locate(this.model),
94
+ permission: 'fleet-ops view driver',
95
+ },
96
+ {
97
+ text: this.intl.t('driver.actions.create-issue'),
98
+ icon: 'triangle-exclamation',
99
+ fn: () => this.createIssue(this.model),
100
+ permission: 'fleet-ops create issue',
101
+ },
102
+ ],
34
103
  },
35
104
  ];
36
105
  }
106
+
107
+ @action createIssue(driver) {
108
+ this.issueActions.modal.create({
109
+ driver,
110
+ driver_uuid: driver.id,
111
+ title: this.intl.t('driver.prompts.issue-title', { driverName: driver.name }),
112
+ });
113
+ }
37
114
  }
@@ -5,6 +5,7 @@ import { action } from '@ember/object';
5
5
 
6
6
  export default class ManagementDriversIndexController extends Controller {
7
7
  @service driverActions;
8
+ @service issueActions;
8
9
  @service fleetActions;
9
10
  @service vendorActions;
10
11
  @service vehicleActions;
@@ -47,6 +48,10 @@ export default class ManagementDriversIndexController extends Controller {
47
48
  @tracked layout = 'table';
48
49
  @tracked table;
49
50
 
51
+ hasAssignedVehicle(driver) {
52
+ return Boolean(driver?.vehicle_uuid || driver?.vehicle?.id || driver?.vehicle?.uuid || driver?.vehicle_name);
53
+ }
54
+
50
55
  /** action buttons */
51
56
  get actionButtons() {
52
57
  return [
@@ -261,11 +266,13 @@ export default class ManagementDriversIndexController extends Controller {
261
266
  actions: [
262
267
  {
263
268
  label: this.intl.t('common.view-resource', { resource: this.intl.t('resource.driver') }),
269
+ icon: 'eye',
264
270
  fn: this.driverActions.transition.view,
265
271
  permission: 'fleet-ops view driver',
266
272
  },
267
273
  {
268
274
  label: this.intl.t('common.edit-resource', { resource: this.intl.t('resource.driver') }),
275
+ icon: 'pencil',
269
276
  fn: this.driverActions.transition.edit,
270
277
  permission: 'fleet-ops update driver',
271
278
  },
@@ -274,24 +281,48 @@ export default class ManagementDriversIndexController extends Controller {
274
281
  },
275
282
  {
276
283
  label: this.intl.t('driver.actions.assign-order'),
284
+ icon: 'clipboard-list',
277
285
  fn: this.driverActions.assignOrder,
278
286
  permission: 'fleet-ops assign-order-for driver',
279
287
  },
280
288
  {
281
289
  label: this.intl.t('driver.actions.assign-vehicle'),
290
+ icon: 'car',
282
291
  fn: this.driverActions.assignVehicle,
283
292
  permission: 'fleet-ops assign-vehicle-for driver',
284
293
  },
294
+ {
295
+ label: this.intl.t('driver.actions.unassign-orders'),
296
+ icon: 'user-minus',
297
+ fn: this.driverActions.unassignOrders,
298
+ permission: 'fleet-ops assign-order-for driver',
299
+ isVisible: (driver) => Number(driver.assigned_orders_count) > 0,
300
+ },
301
+ {
302
+ label: this.intl.t('driver.actions.unassign-vehicle'),
303
+ icon: 'link-slash',
304
+ fn: this.driverActions.unassignVehicle,
305
+ permission: 'fleet-ops assign-vehicle-for driver',
306
+ isVisible: (driver) => this.hasAssignedVehicle(driver),
307
+ },
285
308
  {
286
309
  label: this.intl.t('driver.actions.locate-driver'),
310
+ icon: 'location-dot',
287
311
  fn: this.driverActions.locate,
288
312
  permission: 'fleet-ops view driver',
289
313
  },
314
+ {
315
+ label: this.intl.t('driver.actions.create-issue'),
316
+ icon: 'triangle-exclamation',
317
+ fn: this.createIssue,
318
+ permission: 'fleet-ops create issue',
319
+ },
290
320
  {
291
321
  separator: true,
292
322
  },
293
323
  {
294
324
  label: this.intl.t('common.delete-resource', { resource: this.intl.t('resource.driver') }),
325
+ icon: 'trash',
295
326
  fn: this.driverActions.delete,
296
327
  permission: 'fleet-ops delete driver',
297
328
  },
@@ -307,4 +338,12 @@ export default class ManagementDriversIndexController extends Controller {
307
338
  @action changeLayout(layout) {
308
339
  this.layout = layout;
309
340
  }
341
+
342
+ @action createIssue(driver) {
343
+ this.issueActions.modal.create({
344
+ driver,
345
+ driver_uuid: driver.id,
346
+ title: `Issue reported for ${driver.name}`,
347
+ });
348
+ }
310
349
  }
@@ -4,7 +4,9 @@ import { isArray } from '@ember/array';
4
4
 
5
5
  export default class ManagementFleetsIndexDetailsController extends Controller {
6
6
  @service('universe/menu-service') menuService;
7
+ @service fleetActions;
7
8
  @service hostRouter;
9
+ @service intl;
8
10
 
9
11
  get tabs() {
10
12
  const registeredTabs = this.menuService.getMenuItems('fleet-ops:component:place:details');
@@ -19,7 +21,7 @@ export default class ManagementFleetsIndexDetailsController extends Controller {
19
21
  },
20
22
  {
21
23
  route: 'management.fleets.index.details.drivers',
22
- label: 'Drivers',
24
+ label: this.intl.t('menu.drivers'),
23
25
  },
24
26
  ...(isArray(registeredTabs) ? registeredTabs : []),
25
27
  ];
@@ -30,6 +32,26 @@ export default class ManagementFleetsIndexDetailsController extends Controller {
30
32
  {
31
33
  icon: 'pencil',
32
34
  fn: () => this.hostRouter.transitionTo('console.fleet-ops.management.fleets.index.edit', this.model),
35
+ permission: 'fleet-ops update fleet',
36
+ },
37
+ {
38
+ icon: 'ellipsis-h',
39
+ iconPrefix: 'fas',
40
+ renderInPlace: true,
41
+ items: [
42
+ {
43
+ text: this.intl.t('fleet.actions.assign-driver'),
44
+ icon: 'user-plus',
45
+ fn: () => this.fleetActions.assignDriver(this.model),
46
+ permission: 'fleet-ops assign-driver-for fleet',
47
+ },
48
+ {
49
+ text: this.intl.t('fleet.actions.assign-vehicle'),
50
+ icon: 'car',
51
+ fn: () => this.fleetActions.assignVehicle(this.model),
52
+ permission: 'fleet-ops assign-vehicle-for fleet',
53
+ },
54
+ ],
33
55
  },
34
56
  ];
35
57
  }
@@ -241,7 +241,12 @@ export default class ManagementFleetsIndexController extends Controller {
241
241
  {
242
242
  label: this.intl.t('fleet.actions.assign-driver'),
243
243
  permission: 'fleet-ops assign-driver-for fleet',
244
- fn: () => {},
244
+ fn: this.fleetActions.assignDriver,
245
+ },
246
+ {
247
+ label: this.intl.t('fleet.actions.assign-vehicle'),
248
+ permission: 'fleet-ops assign-vehicle-for fleet',
249
+ fn: this.fleetActions.assignVehicle,
245
250
  },
246
251
  {
247
252
  separator: true,
@@ -8,7 +8,24 @@ export default class ManagementFuelReportsIndexController extends Controller {
8
8
  @service intl;
9
9
 
10
10
  /** query params */
11
- @tracked queryParams = ['page', 'limit', 'sort', 'query', 'public_id', 'internal_id', 'vehicle', 'driver', 'created_by', 'updated_by', 'status', 'country', 'volume', 'odometer'];
11
+ @tracked queryParams = [
12
+ 'page',
13
+ 'limit',
14
+ 'sort',
15
+ 'query',
16
+ 'public_id',
17
+ 'internal_id',
18
+ 'vehicle',
19
+ 'driver',
20
+ 'created_by',
21
+ 'updated_by',
22
+ 'status',
23
+ 'source',
24
+ 'provider',
25
+ 'country',
26
+ 'volume',
27
+ 'odometer',
28
+ ];
12
29
  @tracked page = 1;
13
30
  @tracked limit;
14
31
  @tracked sort = '-created_at';
@@ -20,6 +37,8 @@ export default class ManagementFuelReportsIndexController extends Controller {
20
37
  @tracked volume;
21
38
  @tracked odometer;
22
39
  @tracked status;
40
+ @tracked source;
41
+ @tracked provider;
23
42
  @tracked table;
24
43
 
25
44
  /** action buttons */
@@ -130,6 +149,23 @@ export default class ManagementFuelReportsIndexController extends Controller {
130
149
  filterComponent: 'filter/multi-option',
131
150
  filterOptions: ['draft', 'pending-approval', 'approved', 'rejected', 'revised', 'submitted', 'in-review', 'confirmed', 'processed', 'archived', 'cancelled'],
132
151
  },
152
+ {
153
+ label: 'Source',
154
+ valuePath: 'source',
155
+ resizable: true,
156
+ sortable: false,
157
+ filterable: true,
158
+ filterComponent: 'filter/multi-option',
159
+ filterOptions: ['manual', 'import', 'fuel_provider'],
160
+ },
161
+ {
162
+ label: 'Provider',
163
+ valuePath: 'provider',
164
+ resizable: true,
165
+ sortable: false,
166
+ filterable: true,
167
+ filterComponent: 'filter/string',
168
+ },
133
169
  {
134
170
  label: this.intl.t('column.volume'),
135
171
  valuePath: 'volume',