@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,70 @@
1
+ import Controller from '@ember/controller';
2
+ import { tracked } from '@glimmer/tracking';
3
+ import { inject as service } from '@ember/service';
4
+ import { action } from '@ember/object';
5
+ import { task } from 'ember-concurrency';
6
+
7
+ export default class ManagementFuelTransactionsIndexDetailsController extends Controller {
8
+ @service fetch;
9
+ @service notifications;
10
+ @service hostRouter;
11
+
12
+ @tracked vehicleId;
13
+ @tracked orderId;
14
+
15
+ get normalizedPayloadJson() {
16
+ return JSON.stringify(this.model?.normalized_payload ?? {}, null, 2);
17
+ }
18
+
19
+ get rawPayloadJson() {
20
+ return JSON.stringify(this.model?.raw_payload ?? {}, null, 2);
21
+ }
22
+
23
+ @action setVehicleId(event) {
24
+ this.vehicleId = event.target.value;
25
+ }
26
+
27
+ @action setOrderId(event) {
28
+ this.orderId = event.target.value;
29
+ }
30
+
31
+ @task *matchVehicle() {
32
+ try {
33
+ yield this.fetch.post(`fuel-provider-transactions/${this.model.id}/match-vehicle`, { vehicle: this.vehicleId });
34
+ this.notifications.success('Fuel transaction matched to vehicle.');
35
+ yield this.hostRouter.refresh();
36
+ } catch (error) {
37
+ this.notifications.serverError(error);
38
+ }
39
+ }
40
+
41
+ @task *matchOrder() {
42
+ try {
43
+ yield this.fetch.post(`fuel-provider-transactions/${this.model.id}/match-order`, { order: this.orderId });
44
+ this.notifications.success('Fuel transaction matched to order.');
45
+ yield this.hostRouter.refresh();
46
+ } catch (error) {
47
+ this.notifications.serverError(error);
48
+ }
49
+ }
50
+
51
+ @task *reprocess() {
52
+ try {
53
+ yield this.fetch.post(`fuel-provider-transactions/${this.model.id}/reprocess`);
54
+ this.notifications.success('Fuel transaction reprocessed.');
55
+ yield this.hostRouter.refresh();
56
+ } catch (error) {
57
+ this.notifications.serverError(error);
58
+ }
59
+ }
60
+
61
+ @task *review(status) {
62
+ try {
63
+ yield this.fetch.post(`fuel-provider-transactions/${this.model.id}/review`, { status });
64
+ this.notifications.success(status === 'ignored' ? 'Fuel transaction ignored.' : 'Fuel transaction reviewed.');
65
+ yield this.hostRouter.refresh();
66
+ } catch (error) {
67
+ this.notifications.serverError(error);
68
+ }
69
+ }
70
+ }
@@ -0,0 +1,240 @@
1
+ import Controller from '@ember/controller';
2
+ import { inject as service } from '@ember/service';
3
+ import { tracked } from '@glimmer/tracking';
4
+ import { action } from '@ember/object';
5
+ import { task } from 'ember-concurrency';
6
+
7
+ export default class ManagementFuelTransactionsIndexController extends Controller {
8
+ @service tableContext;
9
+ @service fetch;
10
+ @service notifications;
11
+ @service hostRouter;
12
+
13
+ @tracked queryParams = ['page', 'limit', 'sort', 'query', 'provider', 'sync_status', 'vehicle', 'connection', 'transaction_at'];
14
+ @tracked page = 1;
15
+ @tracked limit;
16
+ @tracked sort = '-transaction_at';
17
+ @tracked query;
18
+ @tracked provider;
19
+ @tracked sync_status;
20
+ @tracked vehicle;
21
+ @tracked connection;
22
+ @tracked transaction_at;
23
+ @tracked table;
24
+
25
+ get hasRecords() {
26
+ return Array.from(this.model ?? []).length > 0;
27
+ }
28
+
29
+ get emptyStateTitle() {
30
+ if (this.sync_status === 'unmatched') {
31
+ return 'No unmatched fuel transactions';
32
+ }
33
+
34
+ if (this.connection) {
35
+ return 'No transactions imported for this integration';
36
+ }
37
+
38
+ return 'No fuel transactions imported yet';
39
+ }
40
+
41
+ get emptyStateMessage() {
42
+ if (this.sync_status === 'unmatched') {
43
+ return 'FleetOps did not find imported provider bills that still need vehicle or trip matching.';
44
+ }
45
+
46
+ if (this.connection) {
47
+ return 'Run a sync from the fuel integration detail page to import provider bills into this ledger.';
48
+ }
49
+
50
+ return 'Connect PetroApp or another fuel integration, then run a transaction sync. Imported provider bills appear here before linked Fuel Reports are created.';
51
+ }
52
+
53
+ get actionButtons() {
54
+ return [
55
+ {
56
+ icon: 'refresh',
57
+ onClick: this.refresh,
58
+ helpText: 'Refresh',
59
+ },
60
+ {
61
+ icon: 'gas-pump',
62
+ text: 'Fuel Integrations',
63
+ onClick: () => this.hostRouter.transitionTo('console.fleet-ops.connectivity.fuel-providers.index'),
64
+ },
65
+ ];
66
+ }
67
+
68
+ @action refresh() {
69
+ this.target.send('refresh');
70
+ }
71
+
72
+ get bulkActions() {
73
+ const selected = this.tableContext.getSelectedRows();
74
+
75
+ return [
76
+ {
77
+ label: `Reprocess ${selected.length} selected`,
78
+ fn: () => selected.forEach((transaction) => this.reprocessTransaction.perform(transaction)),
79
+ },
80
+ ];
81
+ }
82
+
83
+ get columns() {
84
+ return [
85
+ {
86
+ sticky: true,
87
+ label: 'Transaction',
88
+ valuePath: 'provider_transaction_id',
89
+ cellComponent: 'click-to-copy',
90
+ resizable: true,
91
+ sortable: true,
92
+ filterable: true,
93
+ filterParam: 'query',
94
+ filterComponent: 'filter/string',
95
+ },
96
+ {
97
+ label: 'Provider',
98
+ valuePath: 'provider',
99
+ resizable: true,
100
+ sortable: true,
101
+ filterable: true,
102
+ filterComponent: 'filter/string',
103
+ },
104
+ {
105
+ label: 'Status',
106
+ valuePath: 'sync_status',
107
+ cellComponent: 'table/cell/status',
108
+ resizable: true,
109
+ sortable: true,
110
+ filterable: true,
111
+ filterComponent: 'filter/multi-option',
112
+ filterOptions: ['imported', 'matched', 'unmatched', 'reviewed', 'ignored', 'duplicate', 'error'],
113
+ },
114
+ {
115
+ label: 'Vehicle',
116
+ valuePath: 'vehicle_name',
117
+ resizable: true,
118
+ sortable: false,
119
+ filterable: true,
120
+ filterParam: 'vehicle',
121
+ filterComponent: 'filter/model',
122
+ model: 'vehicle',
123
+ modelNamePath: 'displayName',
124
+ },
125
+ {
126
+ label: 'Card / Internal',
127
+ valuePath: 'vehicle_card_id',
128
+ resizable: true,
129
+ },
130
+ {
131
+ label: 'Trip',
132
+ valuePath: 'trip_number',
133
+ resizable: true,
134
+ hidden: true,
135
+ },
136
+ {
137
+ label: 'Station',
138
+ valuePath: 'station_name',
139
+ resizable: true,
140
+ },
141
+ {
142
+ label: 'Liters',
143
+ valuePath: 'volume',
144
+ resizable: true,
145
+ sortable: true,
146
+ },
147
+ {
148
+ label: 'Amount',
149
+ valuePath: 'amount',
150
+ cellComponent: 'table/cell/currency',
151
+ resizable: true,
152
+ sortable: true,
153
+ },
154
+ {
155
+ label: 'Fuel Report',
156
+ valuePath: 'fuel_report_id',
157
+ cellComponent: 'table/cell/anchor',
158
+ action: this.openFuelReport,
159
+ resizable: true,
160
+ },
161
+ {
162
+ label: 'Date',
163
+ valuePath: 'transactionAt',
164
+ sortParam: 'transaction_at',
165
+ resizable: true,
166
+ sortable: true,
167
+ filterable: true,
168
+ filterParam: 'transaction_at',
169
+ filterComponent: 'filter/date',
170
+ },
171
+ {
172
+ label: '',
173
+ cellComponent: 'table/cell/dropdown',
174
+ ddButtonText: false,
175
+ ddButtonIcon: 'ellipsis-h',
176
+ ddButtonIconPrefix: 'fas',
177
+ ddMenuLabel: 'Fuel Transaction Actions',
178
+ cellClassNames: 'overflow-visible',
179
+ wrapperClass: 'flex items-center justify-end mx-2',
180
+ sticky: 'right',
181
+ width: 60,
182
+ actions: [
183
+ { label: 'Review Details', fn: this.openDetails },
184
+ { label: 'Open Fuel Report', fn: this.openFuelReport },
185
+ { separator: true },
186
+ { label: 'Match to Vehicle', fn: this.matchVehicle },
187
+ { label: 'Match to Order', fn: this.matchOrder },
188
+ { label: 'Reprocess / Rematch', fn: (transaction) => this.reprocessTransaction.perform(transaction) },
189
+ { label: 'Ignore Transaction', fn: (transaction) => this.markReviewed.perform(transaction, 'ignored') },
190
+ { label: 'Mark Reviewed', fn: (transaction) => this.markReviewed.perform(transaction, 'reviewed') },
191
+ ],
192
+ sortable: false,
193
+ filterable: false,
194
+ resizable: false,
195
+ searchable: false,
196
+ },
197
+ ];
198
+ }
199
+
200
+ @action openDetails(transaction) {
201
+ return this.hostRouter.transitionTo('console.fleet-ops.management.fuel-transactions.index.details', transaction);
202
+ }
203
+
204
+ @action openFuelReport(transaction) {
205
+ if (!transaction?.fuel_report_id) {
206
+ this.notifications.info('This transaction does not have a linked Fuel Report yet.');
207
+ return;
208
+ }
209
+
210
+ return this.hostRouter.transitionTo('console.fleet-ops.management.fuel-reports.index.details', transaction.fuel_report_id);
211
+ }
212
+
213
+ @action matchVehicle(transaction) {
214
+ return this.hostRouter.transitionTo('console.fleet-ops.management.fuel-transactions.index.details', transaction);
215
+ }
216
+
217
+ @action matchOrder(transaction) {
218
+ return this.hostRouter.transitionTo('console.fleet-ops.management.fuel-transactions.index.details', transaction);
219
+ }
220
+
221
+ @task *reprocessTransaction(transaction) {
222
+ try {
223
+ yield this.fetch.post(`fuel-provider-transactions/${transaction.id}/reprocess`);
224
+ this.notifications.success('Fuel transaction reprocessed.');
225
+ this.target.send('refresh');
226
+ } catch (error) {
227
+ this.notifications.serverError(error);
228
+ }
229
+ }
230
+
231
+ @task *markReviewed(transaction, status) {
232
+ try {
233
+ yield this.fetch.post(`fuel-provider-transactions/${transaction.id}/review`, { status });
234
+ this.notifications.success(status === 'ignored' ? 'Fuel transaction ignored.' : 'Fuel transaction marked reviewed.');
235
+ this.target.send('refresh');
236
+ } catch (error) {
237
+ this.notifications.serverError(error);
238
+ }
239
+ }
240
+ }
@@ -1,9 +1,11 @@
1
1
  import Controller from '@ember/controller';
2
+ import { action } from '@ember/object';
2
3
  import { inject as service } from '@ember/service';
3
4
  import { isArray } from '@ember/array';
4
5
 
5
6
  export default class ManagementVehiclesIndexDetailsController extends Controller {
6
7
  @service vehicleActions;
8
+ @service issueActions;
7
9
  @service('universe/menu-service') menuService;
8
10
  @service hostRouter;
9
11
  @service intl;
@@ -58,6 +60,22 @@ export default class ManagementVehiclesIndexDetailsController extends Controller
58
60
  fn: () => this.vehicleActions.locate(this.model),
59
61
  permission: 'fleet-ops view vehicle',
60
62
  },
63
+ {
64
+ text: this.intl.t('vehicle.actions.attach-device'),
65
+ icon: 'link',
66
+ fn: () => this.vehicleActions.attachDevice(this.model),
67
+ permission: 'fleet-ops update vehicle',
68
+ },
69
+ ...(Number(this.model.assigned_orders_count) > 0
70
+ ? [
71
+ {
72
+ text: this.intl.t('vehicle.actions.unassign-orders'),
73
+ icon: 'truck-ramp-box',
74
+ fn: () => this.vehicleActions.unassignOrders(this.model),
75
+ permission: 'fleet-ops update vehicle',
76
+ },
77
+ ]
78
+ : []),
61
79
  {
62
80
  separator: true,
63
81
  },
@@ -79,6 +97,12 @@ export default class ManagementVehiclesIndexDetailsController extends Controller
79
97
  fn: () => this.vehicleActions.logMaintenance(this.model),
80
98
  permission: 'fleet-ops create maintenance',
81
99
  },
100
+ {
101
+ text: this.intl.t('vehicle.actions.create-issue'),
102
+ icon: 'triangle-exclamation',
103
+ fn: () => this.createIssue(this.model),
104
+ permission: 'fleet-ops create issue',
105
+ },
82
106
  {
83
107
  separator: true,
84
108
  },
@@ -98,4 +122,12 @@ export default class ManagementVehiclesIndexDetailsController extends Controller
98
122
  },
99
123
  ];
100
124
  }
125
+
126
+ @action createIssue(vehicle) {
127
+ this.issueActions.modal.create({
128
+ vehicle,
129
+ vehicle_uuid: vehicle.id,
130
+ title: this.intl.t('vehicle.prompts.issue-title', { vehicleName: vehicle.displayName ?? vehicle.name }),
131
+ });
132
+ }
101
133
  }
@@ -1,9 +1,11 @@
1
1
  import Controller from '@ember/controller';
2
+ import { action } from '@ember/object';
2
3
  import { inject as service } from '@ember/service';
3
4
  import { tracked } from '@glimmer/tracking';
4
5
 
5
6
  export default class ManagementVehiclesIndexController extends Controller {
6
7
  @service vehicleActions;
8
+ @service issueActions;
7
9
  @service driverActions;
8
10
  @service tableContext;
9
11
  @service intl;
@@ -292,6 +294,17 @@ export default class ManagementVehiclesIndexController extends Controller {
292
294
  fn: this.vehicleActions.locate,
293
295
  permission: 'fleet-ops view vehicle',
294
296
  },
297
+ {
298
+ label: this.intl.t('vehicle.actions.attach-device'),
299
+ fn: this.vehicleActions.attachDevice,
300
+ permission: 'fleet-ops update vehicle',
301
+ },
302
+ {
303
+ label: this.intl.t('vehicle.actions.unassign-orders'),
304
+ fn: this.vehicleActions.unassignOrders,
305
+ permission: 'fleet-ops update vehicle',
306
+ isVisible: (vehicle) => Number(vehicle.assigned_orders_count) > 0,
307
+ },
295
308
  {
296
309
  separator: true,
297
310
  },
@@ -310,6 +323,11 @@ export default class ManagementVehiclesIndexController extends Controller {
310
323
  fn: this.vehicleActions.logMaintenance,
311
324
  permission: 'fleet-ops create maintenance',
312
325
  },
326
+ {
327
+ label: this.intl.t('vehicle.actions.create-issue'),
328
+ fn: this.createIssue,
329
+ permission: 'fleet-ops create issue',
330
+ },
313
331
  {
314
332
  separator: true,
315
333
  },
@@ -326,4 +344,12 @@ export default class ManagementVehiclesIndexController extends Controller {
326
344
  },
327
345
  ];
328
346
  }
347
+
348
+ @action createIssue(vehicle) {
349
+ this.issueActions.modal.create({
350
+ vehicle,
351
+ vehicle_uuid: vehicle.id,
352
+ title: this.intl.t('vehicle.prompts.issue-title', { vehicleName: vehicle.displayName ?? vehicle.name }),
353
+ });
354
+ }
329
355
  }
@@ -435,4 +435,8 @@ export default class OperationsOrdersIndexController extends Controller {
435
435
  this.isSearchVisible = false;
436
436
  }
437
437
  }
438
+
439
+ @action importOrders() {
440
+ return this.orderActions.importOrders({ onImportComplete: this.orderActions.refresh });
441
+ }
438
442
  }
@@ -4,6 +4,7 @@ import { inject as service } from '@ember/service';
4
4
  import { isEmpty } from '@ember/utils';
5
5
  import { task } from 'ember-concurrency';
6
6
  import config from 'ember-get-config';
7
+ import { action } from '@ember/object';
7
8
 
8
9
  export default class SettingsPaymentsIndexController extends Controller {
9
10
  @service fetch;
@@ -57,4 +58,8 @@ export default class SettingsPaymentsIndexController extends Controller {
57
58
  this.hasStripeConnectAccount = false;
58
59
  }
59
60
  }
61
+
62
+ @action refreshPayments() {
63
+ return this.lookupStripeConnectAccount.perform();
64
+ }
60
65
  }
@@ -279,6 +279,16 @@ export default {
279
279
  category: 'Analytics',
280
280
  default: false,
281
281
  }),
282
+ new Widget({
283
+ id: 'fleet-ops-fuel-providers-widget',
284
+ name: 'Fuel Integrations',
285
+ description: 'Provider spend, unmatched transactions, and sync health.',
286
+ icon: 'gas-pump',
287
+ component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/fuel-providers'),
288
+ grid_options: { w: 4, h: 5, minW: 4, minH: 5 },
289
+ category: 'Analytics',
290
+ default: false,
291
+ }),
282
292
  new Widget({
283
293
  id: 'fleet-ops-issues-insights-widget',
284
294
  name: 'Issues Insights',
@@ -0,0 +1,7 @@
1
+ import Route from '@ember/routing/route';
2
+
3
+ export default class ConnectivityFuelProvidersIndexDetailsIndexRoute extends Route {
4
+ model() {
5
+ return this.modelFor('connectivity.fuel-providers.details');
6
+ }
7
+ }
@@ -0,0 +1,7 @@
1
+ import Route from '@ember/routing/route';
2
+
3
+ export default class ConnectivityFuelProvidersIndexDetailsMatchingRoute extends Route {
4
+ model() {
5
+ return this.modelFor('connectivity.fuel-providers.details');
6
+ }
7
+ }
@@ -0,0 +1,7 @@
1
+ import Route from '@ember/routing/route';
2
+
3
+ export default class ConnectivityFuelProvidersIndexDetailsSettingsRoute extends Route {
4
+ model() {
5
+ return this.modelFor('connectivity.fuel-providers.details');
6
+ }
7
+ }
@@ -0,0 +1,18 @@
1
+ import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
3
+
4
+ export default class ConnectivityFuelProvidersIndexDetailsSyncRoute extends Route {
5
+ @service store;
6
+
7
+ model() {
8
+ const connection = this.modelFor('connectivity.fuel-providers.details');
9
+
10
+ return {
11
+ connection,
12
+ syncRuns: this.store.query('fuel-provider-sync-run', {
13
+ connection: connection.uuid,
14
+ sort: '-created_at',
15
+ }),
16
+ };
17
+ }
18
+ }
@@ -0,0 +1,14 @@
1
+ import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
3
+
4
+ export default class ConnectivityFuelProvidersIndexDetailsTransactionsRoute extends Route {
5
+ @service store;
6
+
7
+ model() {
8
+ const connection = this.modelFor('connectivity.fuel-providers.details');
9
+ return this.store.query('fuel-provider-transaction', {
10
+ connection: connection.uuid,
11
+ sort: '-transaction_at',
12
+ });
13
+ }
14
+ }
@@ -0,0 +1,18 @@
1
+ import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
3
+ import { action } from '@ember/object';
4
+
5
+ export default class ConnectivityFuelProvidersIndexDetailsRoute extends Route {
6
+ @service store;
7
+ @service notifications;
8
+ @service hostRouter;
9
+
10
+ @action error(error) {
11
+ this.notifications.serverError(error);
12
+ return this.hostRouter.transitionTo('console.fleet-ops.connectivity.fuel-providers.index');
13
+ }
14
+
15
+ model({ public_id }) {
16
+ return this.store.findRecord('fuel-provider-connection', public_id);
17
+ }
18
+ }
@@ -0,0 +1,18 @@
1
+ import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
3
+ import { action } from '@ember/object';
4
+
5
+ export default class ConnectivityFuelProvidersIndexEditRoute extends Route {
6
+ @service store;
7
+ @service notifications;
8
+ @service hostRouter;
9
+
10
+ @action error(error) {
11
+ this.notifications.serverError(error);
12
+ return this.hostRouter.transitionTo('console.fleet-ops.connectivity.fuel-providers.index');
13
+ }
14
+
15
+ model({ public_id }) {
16
+ return this.store.findRecord('fuel-provider-connection', public_id);
17
+ }
18
+ }
@@ -0,0 +1,20 @@
1
+ import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
3
+
4
+ export default class ConnectivityFuelProvidersIndexRoute extends Route {
5
+ @service store;
6
+
7
+ queryParams = {
8
+ page: { refreshModel: true },
9
+ limit: { refreshModel: true },
10
+ sort: { refreshModel: true },
11
+ query: { refreshModel: true },
12
+ provider: { refreshModel: true },
13
+ status: { refreshModel: true },
14
+ environment: { refreshModel: true },
15
+ };
16
+
17
+ model(params) {
18
+ return this.store.query('fuel-provider-connection', { sort: '-updated_at', ...params });
19
+ }
20
+ }
@@ -0,0 +1,3 @@
1
+ import Route from '@ember/routing/route';
2
+
3
+ export default class ConnectivityFuelProvidersIndexNewRoute extends Route {}
@@ -0,0 +1,3 @@
1
+ import Route from '@ember/routing/route';
2
+
3
+ export default class ConnectivityFuelProvidersRoute extends Route {}
@@ -0,0 +1,28 @@
1
+ import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
3
+
4
+ export default class ConnectivityTelematicsDetailsAttachmentsRoute extends Route {
5
+ @service store;
6
+
7
+ queryParams = {
8
+ query: { refreshModel: true },
9
+ status: { refreshModel: true },
10
+ attachment_state: { refreshModel: true },
11
+ vehicle: { refreshModel: true },
12
+ sort: { refreshModel: true },
13
+ };
14
+
15
+ model(params) {
16
+ const telematic = this.modelFor('connectivity.telematics.details');
17
+
18
+ return this.store.query('device', {
19
+ telematic_uuid: telematic.id,
20
+ sort: params.sort,
21
+ });
22
+ }
23
+
24
+ setupController(controller, model) {
25
+ super.setupController(controller, model);
26
+ controller.telematic = this.modelFor('connectivity.telematics.details');
27
+ }
28
+ }
@@ -0,0 +1,30 @@
1
+ import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
3
+
4
+ export default class ConnectivityTelematicsDetailsDevicesRoute extends Route {
5
+ @service store;
6
+
7
+ queryParams = {
8
+ page: { refreshModel: true },
9
+ limit: { refreshModel: true },
10
+ sort: { refreshModel: true },
11
+ query: { refreshModel: true },
12
+ status: { refreshModel: true },
13
+ provider: { refreshModel: true },
14
+ attachment_state: { refreshModel: true },
15
+ device_id: { refreshModel: true },
16
+ };
17
+
18
+ model(params) {
19
+ const telematic = this.modelFor('connectivity.telematics.details');
20
+ return this.store.query('device', {
21
+ ...params,
22
+ telematic_uuid: telematic.id,
23
+ });
24
+ }
25
+
26
+ setupController(controller, model) {
27
+ super.setupController(controller, model);
28
+ controller.telematic = this.modelFor('connectivity.telematics.details');
29
+ }
30
+ }