@fleetbase/fleetops-engine 0.6.50 → 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 (494) hide show
  1. package/README.md +183 -67
  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/contact/panel-header.hbs +11 -48
  7. package/addon/components/customer/details.hbs +1 -2
  8. package/addon/components/customer/form.hbs +63 -51
  9. package/addon/components/customer/form.js +27 -1
  10. package/addon/components/customer/orders.hbs +48 -0
  11. package/addon/components/customer/orders.js +67 -5
  12. package/addon/components/device/manager.hbs +5 -6
  13. package/addon/components/device/manager.js +12 -15
  14. package/addon/components/driver/details.hbs +1 -1
  15. package/addon/components/driver/form.hbs +1 -1
  16. package/addon/components/fleet/vehicle-listing.js +1 -0
  17. package/addon/components/fuel-integration/form.hbs +200 -0
  18. package/addon/components/fuel-integration/form.js +242 -0
  19. package/addon/components/fuel-integration/hub.hbs +154 -0
  20. package/addon/components/fuel-integration/hub.js +165 -0
  21. package/addon/components/fuel-integration/matching-priority.hbs +76 -0
  22. package/addon/components/fuel-integration/matching-priority.js +145 -0
  23. package/addon/components/fuel-report/details.hbs +13 -1
  24. package/addon/components/home/getting-started-guidance.hbs +113 -0
  25. package/addon/components/home/getting-started-guidance.js +107 -0
  26. package/addon/components/issue/details/comments.hbs +3 -0
  27. package/addon/components/issue/details/comments.js +3 -0
  28. package/addon/components/issue/details/correspondence.hbs +9 -0
  29. package/addon/components/issue/details/correspondence.js +83 -0
  30. package/addon/components/issue/details/documents.hbs +69 -0
  31. package/addon/components/issue/details/documents.js +85 -0
  32. package/addon/components/issue/details.hbs +166 -59
  33. package/addon/components/issue/details.js +149 -0
  34. package/addon/components/issue/form.hbs +19 -1
  35. package/addon/components/issue/panel-header.hbs +43 -0
  36. package/addon/components/issue/panel-header.js +22 -0
  37. package/addon/components/issue/timeline.hbs +40 -0
  38. package/addon/components/issue/timeline.js +45 -0
  39. package/addon/components/layout/fleet-ops-sidebar.js +20 -2
  40. package/addon/components/leaflet-tracking-marker.js +3 -0
  41. package/addon/components/map/drawer/device-event-listing.hbs +12 -2
  42. package/addon/components/map/drawer/driver-listing.hbs +14 -1
  43. package/addon/components/map/drawer/place-listing.hbs +14 -1
  44. package/addon/components/map/drawer/position-listing.hbs +12 -2
  45. package/addon/components/map/drawer/position-listing.js +3 -0
  46. package/addon/components/map/drawer/vehicle-listing.hbs +14 -1
  47. package/addon/components/map/leaflet-live-map.hbs +2 -2
  48. package/addon/components/map/leaflet-live-map.js +17 -0
  49. package/addon/components/map/order-list-overlay.hbs +4 -4
  50. package/addon/components/modals/assigned-orders.hbs +40 -0
  51. package/addon/components/modals/attach-device.hbs +4 -3
  52. package/addon/components/modals/attach-telematic-device.hbs +25 -0
  53. package/addon/components/modals/attach-telematic-device.js +3 -0
  54. package/addon/components/modals/convert-customer-to-vendor.hbs +30 -0
  55. package/addon/components/modals/convert-customer-to-vendor.js +55 -0
  56. package/addon/components/modals/driver-assign-order.hbs +7 -58
  57. package/addon/components/modals/driver-assign-vehicle.hbs +10 -2
  58. package/addon/components/modals/fleet-assign-driver.hbs +18 -0
  59. package/addon/components/modals/fleet-assign-driver.js +3 -0
  60. package/addon/components/modals/fleet-assign-vehicle.hbs +18 -0
  61. package/addon/components/modals/fleet-assign-vehicle.js +3 -0
  62. package/addon/components/modals/issue-assign.hbs +20 -0
  63. package/addon/components/modals/issue-assign.js +49 -0
  64. package/addon/components/modals/issue-close.hbs +30 -0
  65. package/addon/components/modals/issue-close.js +73 -0
  66. package/addon/components/modals/issue-status.hbs +20 -0
  67. package/addon/components/modals/issue-status.js +43 -0
  68. package/addon/components/modals/reset-customer-credentials.js +12 -6
  69. package/addon/components/modals/telematic-connection-diagnostics.hbs +75 -0
  70. package/addon/components/modals/telematic-connection-diagnostics.js +287 -0
  71. package/addon/components/modals/update-order-activity.hbs +51 -17
  72. package/addon/components/modals/update-order-activity.js +59 -5
  73. package/addon/components/modals/vehicle-details.hbs +6 -1
  74. package/addon/components/modals/vehicle-form.hbs +8 -1
  75. package/addon/components/order/card.hbs +106 -0
  76. package/addon/components/order/card.js +257 -0
  77. package/addon/components/order/details/activity.js +2 -2
  78. package/addon/components/order/details/proof.hbs +40 -38
  79. package/addon/components/order/details/proof.js +31 -4
  80. package/addon/components/order/details.hbs +5 -5
  81. package/addon/components/order/details.js +19 -1
  82. package/addon/components/order/form/service-rate.hbs +2 -0
  83. package/addon/components/order/header.hbs +1 -1
  84. package/addon/components/route-list.hbs +0 -12
  85. package/addon/components/service-rate/details.hbs +1 -1
  86. package/addon/components/service-rate/form.hbs +4 -3
  87. package/addon/components/service-rate/form.js +4 -0
  88. package/addon/components/telematic/details.hbs +98 -87
  89. package/addon/components/telematic/details.js +230 -1
  90. package/addon/components/telematic/form.hbs +303 -72
  91. package/addon/components/telematic/form.js +519 -3
  92. package/addon/components/telematic/hub.hbs +149 -0
  93. package/addon/components/telematic/hub.js +142 -0
  94. package/addon/components/telematic/settings.hbs +152 -0
  95. package/addon/components/telematic/settings.js +45 -0
  96. package/addon/components/telematic/tab-empty-state.hbs +29 -0
  97. package/addon/components/telematic/tab-empty-state.js +33 -0
  98. package/addon/components/vehicle/details.hbs +6 -1
  99. package/addon/components/vehicle/form.hbs +2 -1
  100. package/addon/components/vendor/personnel-manager.hbs +166 -0
  101. package/addon/components/vendor/personnel-manager.js +143 -0
  102. package/addon/components/widget/fuel-providers.hbs +43 -0
  103. package/addon/components/widget/fuel-providers.js +27 -0
  104. package/addon/components/widget/live-fleet.hbs +1 -0
  105. package/addon/components/widget/live-fleet.js +2 -7
  106. package/addon/components/widget/revenue-trend.hbs +1 -1
  107. package/addon/components/widget/revenue-trend.js +75 -2
  108. package/addon/controllers/connectivity/devices/index/details.js +27 -1
  109. package/addon/controllers/connectivity/devices/index.js +14 -0
  110. package/addon/controllers/connectivity/fuel-providers/details/sync.js +18 -0
  111. package/addon/controllers/connectivity/fuel-providers/details/transactions.js +24 -0
  112. package/addon/controllers/connectivity/fuel-providers/details.js +69 -0
  113. package/addon/controllers/connectivity/fuel-providers/edit.js +24 -0
  114. package/addon/controllers/connectivity/fuel-providers/index.js +177 -0
  115. package/addon/controllers/connectivity/fuel-providers/new.js +37 -0
  116. package/addon/controllers/connectivity/telematics/details/attachments.js +247 -0
  117. package/addon/controllers/connectivity/telematics/details/devices.js +368 -0
  118. package/addon/controllers/connectivity/telematics/details/events.js +244 -0
  119. package/addon/controllers/connectivity/telematics/details/index.js +3 -0
  120. package/addon/controllers/connectivity/telematics/details/logs.js +43 -0
  121. package/addon/controllers/connectivity/telematics/details/sensors.js +270 -0
  122. package/addon/controllers/connectivity/telematics/details.js +149 -0
  123. package/addon/controllers/connectivity/telematics/{index/edit.js → edit.js} +15 -4
  124. package/addon/controllers/connectivity/telematics/index.js +25 -5
  125. package/addon/controllers/connectivity/telematics/{index/new.js → new.js} +8 -2
  126. package/addon/controllers/management/contacts/customers/details.js +31 -13
  127. package/addon/controllers/management/contacts/customers.js +16 -5
  128. package/addon/controllers/management/contacts/index/details.js +31 -13
  129. package/addon/controllers/management/contacts/index.js +7 -0
  130. package/addon/controllers/management/drivers/index/details.js +78 -1
  131. package/addon/controllers/management/drivers/index.js +39 -0
  132. package/addon/controllers/management/fleets/index/details.js +23 -1
  133. package/addon/controllers/management/fleets/index.js +6 -1
  134. package/addon/controllers/management/fuel-reports/index.js +37 -1
  135. package/addon/controllers/management/fuel-transactions/index/details.js +70 -0
  136. package/addon/controllers/management/fuel-transactions/index.js +240 -0
  137. package/addon/controllers/management/issues/index/details.js +52 -6
  138. package/addon/controllers/management/vehicles/index/details.js +32 -0
  139. package/addon/controllers/management/vehicles/index.js +26 -0
  140. package/addon/controllers/management/vendors/index/details.js +4 -0
  141. package/addon/controllers/operations/orders/index/details.js +11 -3
  142. package/addon/controllers/operations/orders/index.js +5 -1
  143. package/addon/controllers/settings/payments/index.js +5 -0
  144. package/addon/extension.js +29 -12
  145. package/addon/helpers/format-duration.js +1 -38
  146. package/addon/initializers/load-leaflet-assets.js +5 -6
  147. package/addon/initializers/patch-ember-leaflet-tooltip-layer.js +51 -0
  148. package/addon/routes/connectivity/fuel-providers/details/index.js +7 -0
  149. package/addon/routes/connectivity/fuel-providers/details/matching.js +7 -0
  150. package/addon/routes/connectivity/fuel-providers/details/settings.js +7 -0
  151. package/addon/routes/connectivity/fuel-providers/details/sync.js +18 -0
  152. package/addon/routes/connectivity/fuel-providers/details/transactions.js +14 -0
  153. package/addon/routes/connectivity/fuel-providers/details.js +18 -0
  154. package/addon/routes/connectivity/fuel-providers/edit.js +18 -0
  155. package/addon/routes/connectivity/fuel-providers/index.js +20 -0
  156. package/addon/routes/connectivity/fuel-providers/new.js +3 -0
  157. package/addon/routes/connectivity/fuel-providers.js +3 -0
  158. package/addon/routes/connectivity/telematics/details/attachments.js +28 -0
  159. package/addon/routes/connectivity/telematics/details/devices.js +30 -0
  160. package/addon/routes/connectivity/telematics/details/events.js +33 -0
  161. package/addon/routes/connectivity/telematics/details/index.js +3 -0
  162. package/addon/routes/connectivity/telematics/details/logs.js +17 -0
  163. package/addon/routes/connectivity/telematics/details/sensors.js +29 -0
  164. package/addon/routes/connectivity/telematics/{index/details.js → details.js} +1 -1
  165. package/addon/routes/connectivity/telematics/{index/edit.js → edit.js} +1 -1
  166. package/addon/routes/connectivity/telematics/new.js +3 -0
  167. package/addon/routes/management/drivers/index/details/activity.js +3 -0
  168. package/addon/routes/management/fuel-reports/index.js +2 -0
  169. package/addon/routes/management/fuel-transactions/index/details.js +18 -0
  170. package/addon/routes/management/fuel-transactions/index.js +21 -0
  171. package/addon/routes/management/fuel-transactions.js +3 -0
  172. package/addon/routes/management/issues/index/details.js +1 -1
  173. package/addon/routes.js +29 -9
  174. package/addon/services/contact-actions.js +231 -1
  175. package/addon/services/device-actions.js +64 -1
  176. package/addon/services/device-event-actions.js +12 -1
  177. package/addon/services/driver-actions.js +147 -11
  178. package/addon/services/fleet-actions.js +66 -1
  179. package/addon/services/fuel-integration-actions.js +31 -0
  180. package/addon/services/getting-started.js +44 -0
  181. package/addon/services/issue-actions.js +72 -1
  182. package/addon/services/leaflet-map-manager.js +2 -0
  183. package/addon/services/map-adapter/leaflet.js +19 -0
  184. package/addon/services/service-areas.js +3 -0
  185. package/addon/services/telematic-actions.js +9 -3
  186. package/addon/services/vehicle-actions.js +125 -0
  187. package/addon/styles/fleetops-engine.css +1313 -1
  188. package/addon/templates/analytics/reports/index.hbs +19 -1
  189. package/addon/templates/connectivity/devices/index.hbs +19 -1
  190. package/addon/templates/connectivity/events/index.hbs +16 -1
  191. package/addon/templates/connectivity/fuel-providers/details/index.hbs +38 -0
  192. package/addon/templates/connectivity/fuel-providers/details/matching.hbs +13 -0
  193. package/addon/templates/connectivity/fuel-providers/details/settings.hbs +11 -0
  194. package/addon/templates/connectivity/fuel-providers/details/sync.hbs +48 -0
  195. package/addon/templates/connectivity/fuel-providers/details/transactions.hbs +21 -0
  196. package/addon/templates/connectivity/fuel-providers/details.hbs +51 -0
  197. package/addon/templates/connectivity/fuel-providers/edit.hbs +24 -0
  198. package/addon/templates/connectivity/fuel-providers/index.hbs +12 -0
  199. package/addon/templates/connectivity/fuel-providers/new.hbs +22 -0
  200. package/addon/templates/connectivity/fuel-providers.hbs +1 -0
  201. package/addon/templates/connectivity/sensors/index.hbs +19 -1
  202. package/addon/templates/connectivity/telematics/details/attachments.hbs +163 -0
  203. package/addon/templates/connectivity/telematics/details/devices.hbs +88 -0
  204. package/addon/templates/connectivity/telematics/details/events.hbs +101 -0
  205. package/addon/templates/connectivity/telematics/{index/details → details}/index.hbs +0 -1
  206. package/addon/templates/connectivity/telematics/details/logs.hbs +69 -0
  207. package/addon/templates/connectivity/telematics/details/sensors.hbs +88 -0
  208. package/addon/templates/connectivity/telematics/details.hbs +53 -0
  209. package/addon/templates/connectivity/telematics/edit.hbs +27 -0
  210. package/addon/templates/connectivity/telematics/index.hbs +6 -8
  211. package/addon/templates/connectivity/telematics/new.hbs +24 -0
  212. package/addon/templates/maintenance/equipment/index.hbs +19 -1
  213. package/addon/templates/maintenance/maintenances/index.hbs +15 -1
  214. package/addon/templates/maintenance/parts/index.hbs +19 -1
  215. package/addon/templates/maintenance/schedules/index.hbs +19 -1
  216. package/addon/templates/maintenance/work-orders/index.hbs +19 -1
  217. package/addon/templates/management/contacts/customers/details.hbs +1 -1
  218. package/addon/templates/management/contacts/customers.hbs +15 -1
  219. package/addon/templates/management/contacts/index/details.hbs +1 -1
  220. package/addon/templates/management/contacts/index.hbs +19 -1
  221. package/addon/templates/management/contacts.hbs +2 -2
  222. package/addon/templates/management/drivers/index/details/activity.hbs +1 -0
  223. package/addon/templates/management/drivers/index.hbs +19 -1
  224. package/addon/templates/management/fleets/index.hbs +19 -1
  225. package/addon/templates/management/fuel-reports/index.hbs +19 -1
  226. package/addon/templates/management/fuel-transactions/index/details.hbs +73 -0
  227. package/addon/templates/management/fuel-transactions/index.hbs +58 -0
  228. package/addon/templates/management/fuel-transactions.hbs +1 -0
  229. package/addon/templates/management/issues/index/details/index.hbs +3 -1
  230. package/addon/templates/management/issues/index/details.hbs +3 -2
  231. package/addon/templates/management/issues/index.hbs +19 -1
  232. package/addon/templates/management/places/index.hbs +19 -1
  233. package/addon/templates/management/vehicles/index.hbs +19 -1
  234. package/addon/templates/management/vendors/index/details/personnel.hbs +1 -2
  235. package/addon/templates/management/vendors/index.hbs +19 -1
  236. package/addon/templates/management/vendors/integrated.hbs +13 -1
  237. package/addon/templates/operations/orders/index/details/index.hbs +2 -2
  238. package/addon/templates/operations/orders/index.hbs +20 -2
  239. package/addon/templates/operations/service-rates/index/edit.hbs +1 -0
  240. package/addon/templates/operations/service-rates/index/new.hbs +1 -0
  241. package/addon/templates/operations/service-rates/index.hbs +19 -1
  242. package/addon/templates/settings/payments/index.hbs +15 -1
  243. package/addon/templates/settings/payments/onboard.hbs +8 -8
  244. package/addon/utils/fleet-ops-options.js +3 -0
  245. package/addon/utils/leaflet-draw-namespace-guard.js +22 -0
  246. package/addon/utils/leaflet-plugin-loader.js +219 -0
  247. package/addon/utils/setup-customer-portal.js +4 -64
  248. package/app/components/cell/telematic-provider.js +1 -0
  249. package/app/components/cell/telematic-status.js +1 -0
  250. package/app/components/fuel-integration/form.js +1 -0
  251. package/app/components/fuel-integration/hub.js +1 -0
  252. package/app/components/fuel-integration/matching-priority.js +1 -0
  253. package/app/components/home/getting-started-guidance.js +1 -0
  254. package/app/components/issue/details/comments.js +1 -0
  255. package/app/components/issue/details/correspondence.js +1 -0
  256. package/app/components/issue/details/documents.js +1 -0
  257. package/app/components/issue/panel-header.js +1 -0
  258. package/app/components/modals/assigned-orders.js +1 -0
  259. package/app/components/modals/attach-telematic-device.js +1 -0
  260. package/app/components/modals/convert-customer-to-vendor.js +1 -0
  261. package/app/components/modals/fleet-assign-driver.js +1 -0
  262. package/app/components/modals/fleet-assign-vehicle.js +1 -0
  263. package/app/components/modals/issue-assign.js +1 -0
  264. package/app/components/modals/issue-close.js +1 -0
  265. package/app/components/modals/issue-status.js +1 -0
  266. package/app/components/modals/telematic-connection-diagnostics.js +1 -0
  267. package/app/components/order/card.js +1 -0
  268. package/app/components/telematic/hub.js +1 -0
  269. package/app/components/telematic/settings.js +1 -0
  270. package/app/components/telematic/tab-empty-state.js +1 -0
  271. package/app/components/vendor/personnel-manager.js +1 -0
  272. package/app/components/widget/fuel-providers.js +1 -0
  273. package/app/controllers/connectivity/fuel-providers/details/sync.js +1 -0
  274. package/app/controllers/connectivity/{telematics/index/details/devices.js → fuel-providers/details/transactions.js} +1 -1
  275. package/app/controllers/connectivity/{telematics/index → fuel-providers}/details.js +1 -1
  276. package/app/controllers/connectivity/{telematics/index → fuel-providers}/edit.js +1 -1
  277. package/app/controllers/connectivity/{telematics/index/details → fuel-providers}/index.js +1 -1
  278. package/app/controllers/connectivity/{telematics/index → fuel-providers}/new.js +1 -1
  279. package/app/controllers/connectivity/telematics/details/attachments.js +1 -0
  280. package/app/controllers/connectivity/telematics/details/devices.js +1 -0
  281. package/app/controllers/connectivity/telematics/details/events.js +1 -0
  282. package/app/controllers/connectivity/telematics/details/index.js +1 -0
  283. package/app/controllers/connectivity/telematics/details/logs.js +1 -0
  284. package/app/controllers/connectivity/telematics/details/sensors.js +1 -0
  285. package/app/controllers/connectivity/telematics/details.js +1 -0
  286. package/app/controllers/connectivity/telematics/edit.js +1 -0
  287. package/app/controllers/connectivity/telematics/new.js +1 -0
  288. package/app/controllers/management/fuel-transactions/index/details.js +1 -0
  289. package/app/controllers/management/fuel-transactions/index.js +1 -0
  290. package/app/helpers/format-duration.js +1 -1
  291. package/app/routes/connectivity/{telematics/index → fuel-providers}/details/index.js +1 -1
  292. package/app/routes/connectivity/{telematics/index/details/events.js → fuel-providers/details/matching.js} +1 -1
  293. package/app/routes/connectivity/fuel-providers/details/settings.js +1 -0
  294. package/app/routes/connectivity/fuel-providers/details/sync.js +1 -0
  295. package/app/routes/connectivity/{telematics/index/details/devices.js → fuel-providers/details/transactions.js} +1 -1
  296. package/app/routes/connectivity/{telematics/index → fuel-providers}/details.js +1 -1
  297. package/app/routes/connectivity/{telematics/index → fuel-providers}/edit.js +1 -1
  298. package/app/routes/connectivity/fuel-providers/index.js +1 -0
  299. package/app/routes/connectivity/{telematics/index → fuel-providers}/new.js +1 -1
  300. package/app/routes/connectivity/fuel-providers.js +1 -0
  301. package/app/routes/connectivity/telematics/details/attachments.js +1 -0
  302. package/app/routes/connectivity/telematics/details/devices.js +1 -0
  303. package/app/routes/connectivity/telematics/details/events.js +1 -0
  304. package/app/routes/connectivity/telematics/details/index.js +1 -0
  305. package/app/routes/connectivity/telematics/details/logs.js +1 -0
  306. package/app/routes/connectivity/telematics/details/sensors.js +1 -0
  307. package/app/routes/connectivity/telematics/details.js +1 -0
  308. package/app/routes/connectivity/telematics/edit.js +1 -0
  309. package/app/routes/connectivity/telematics/new.js +1 -0
  310. package/app/routes/management/drivers/index/details/activity.js +1 -0
  311. package/app/routes/management/fuel-transactions/index/details.js +1 -0
  312. package/app/routes/management/fuel-transactions/index.js +1 -0
  313. package/app/routes/management/fuel-transactions.js +1 -0
  314. package/app/services/fuel-integration-actions.js +1 -0
  315. package/app/services/getting-started.js +1 -0
  316. package/app/templates/connectivity/{telematics/index → fuel-providers}/details/index.js +1 -1
  317. package/app/templates/connectivity/{telematics/index/details/events.js → fuel-providers/details/matching.js} +1 -1
  318. package/app/templates/connectivity/fuel-providers/details/settings.js +1 -0
  319. package/app/templates/connectivity/fuel-providers/details/sync.js +1 -0
  320. package/app/templates/connectivity/{telematics/index/details/devices.js → fuel-providers/details/transactions.js} +1 -1
  321. package/app/templates/connectivity/{telematics/index → fuel-providers}/details.js +1 -1
  322. package/app/templates/connectivity/{telematics/index → fuel-providers}/edit.js +1 -1
  323. package/app/templates/connectivity/fuel-providers/index.js +1 -0
  324. package/app/templates/connectivity/{telematics/index → fuel-providers}/new.js +1 -1
  325. package/app/templates/connectivity/fuel-providers.js +1 -0
  326. package/app/templates/connectivity/telematics/details/attachments.js +1 -0
  327. package/app/templates/connectivity/telematics/details/devices.js +1 -0
  328. package/app/templates/connectivity/telematics/details/events.js +1 -0
  329. package/app/templates/connectivity/telematics/details/index.js +1 -0
  330. package/app/templates/connectivity/telematics/details/logs.js +1 -0
  331. package/app/templates/connectivity/telematics/details/sensors.js +1 -0
  332. package/app/templates/connectivity/telematics/details.js +1 -0
  333. package/app/templates/connectivity/telematics/edit.js +1 -0
  334. package/app/templates/connectivity/telematics/new.js +1 -0
  335. package/app/templates/management/drivers/index/details/activity.js +1 -0
  336. package/app/templates/management/fuel-transactions/index/details.js +1 -0
  337. package/app/templates/management/fuel-transactions/index.js +1 -0
  338. package/app/templates/management/fuel-transactions.js +1 -0
  339. package/app/utils/leaflet-draw-namespace-guard.js +1 -0
  340. package/app/utils/leaflet-plugin-loader.js +1 -0
  341. package/assets/images/telematics/providers/afaqy.webp +0 -0
  342. package/assets/images/telematics/providers/default.webp +0 -0
  343. package/assets/images/telematics/providers/flespi.webp +0 -0
  344. package/assets/images/telematics/providers/geotab.webp +0 -0
  345. package/assets/images/telematics/providers/safee.webp +0 -0
  346. package/assets/images/telematics/providers/samsara.webp +0 -0
  347. package/composer.json +1 -1
  348. package/extension.json +1 -1
  349. package/package.json +5 -5
  350. package/server/config/fuel-providers.php +42 -0
  351. package/server/config/telematics.php +139 -130
  352. package/server/migrations/2026_05_31_000001_add_portal_fields_to_vendor_personnels_table.php +30 -0
  353. package/server/migrations/2026_06_03_000000_ensure_tags_column_on_issues_table.php +31 -0
  354. package/server/migrations/2026_06_03_000001_add_order_uuid_to_issues_table.php +25 -0
  355. package/server/migrations/2026_06_04_000001_backfill_order_transaction_subjects.php +39 -0
  356. package/server/migrations/2026_06_04_000002_backfill_order_transaction_directions.php +24 -0
  357. package/server/migrations/2026_06_06_000001_harden_device_events_telematics_contract.php +59 -0
  358. package/server/migrations/2026_06_08_000001_create_fuel_provider_connections_table.php +37 -0
  359. package/server/migrations/2026_06_08_000002_create_fuel_provider_transactions_table.php +53 -0
  360. package/server/migrations/2026_06_08_000003_create_fuel_provider_sync_runs_table.php +40 -0
  361. package/server/migrations/2026_06_10_000001_add_fuel_card_number_to_vehicles_table.php +25 -0
  362. package/server/migrations/2026_06_10_000002_add_vehicle_identity_columns_to_fuel_provider_transactions_table.php +39 -0
  363. package/server/resources/views/mail/customer-credentials.blade.php +16 -13
  364. package/server/src/Contracts/FuelProvider.php +30 -0
  365. package/server/src/Contracts/TelematicProviderDescriptor.php +3 -1
  366. package/server/src/Events/FuelProviderTransactionImported.php +17 -0
  367. package/server/src/Events/FuelProviderTransactionMatched.php +17 -0
  368. package/server/src/Events/FuelProviderTransactionUnmatched.php +17 -0
  369. package/server/src/Events/FuelReportCreatedFromProvider.php +18 -0
  370. package/server/src/Expansions/UserFilterExpansion.php +28 -0
  371. package/server/src/Http/Controllers/Api/v1/IssueController.php +2 -0
  372. package/server/src/Http/Controllers/Api/v1/OrderController.php +26 -25
  373. package/server/src/Http/Controllers/Api/v1/PlaceController.php +10 -58
  374. package/server/src/Http/Controllers/Internal/v1/AnalyticsController.php +6 -0
  375. package/server/src/Http/Controllers/Internal/v1/ContactController.php +135 -0
  376. package/server/src/Http/Controllers/Internal/v1/CustomerController.php +116 -6
  377. package/server/src/Http/Controllers/Internal/v1/DeviceController.php +76 -2
  378. package/server/src/Http/Controllers/Internal/v1/DeviceEventController.php +44 -0
  379. package/server/src/Http/Controllers/Internal/v1/DriverController.php +158 -7
  380. package/server/src/Http/Controllers/Internal/v1/FuelProviderConnectionController.php +124 -0
  381. package/server/src/Http/Controllers/Internal/v1/FuelProviderSyncRunController.php +10 -0
  382. package/server/src/Http/Controllers/Internal/v1/FuelProviderTransactionController.php +76 -0
  383. package/server/src/Http/Controllers/Internal/v1/GettingStartedController.php +17 -0
  384. package/server/src/Http/Controllers/Internal/v1/IssueController.php +251 -0
  385. package/server/src/Http/Controllers/Internal/v1/OrderController.php +172 -97
  386. package/server/src/Http/Controllers/Internal/v1/PlaceController.php +10 -68
  387. package/server/src/Http/Controllers/Internal/v1/SensorController.php +1 -1
  388. package/server/src/Http/Controllers/Internal/v1/TelematicController.php +178 -15
  389. package/server/src/Http/Controllers/Internal/v1/VehicleController.php +165 -0
  390. package/server/src/Http/Controllers/Internal/v1/VendorController.php +89 -0
  391. package/server/src/Http/Controllers/TelematicWebhookController.php +103 -19
  392. package/server/src/Http/Filter/FuelProviderConnectionFilter.php +33 -0
  393. package/server/src/Http/Filter/FuelProviderSyncRunFilter.php +28 -0
  394. package/server/src/Http/Filter/FuelProviderTransactionFilter.php +59 -0
  395. package/server/src/Http/Filter/FuelReportFilter.php +10 -0
  396. package/server/src/Http/Requests/CreateIssueRequest.php +4 -0
  397. package/server/src/Http/Requests/UpdateIssueRequest.php +4 -0
  398. package/server/src/Http/Resources/v1/Driver.php +15 -0
  399. package/server/src/Http/Resources/v1/FuelProviderConnection.php +30 -0
  400. package/server/src/Http/Resources/v1/FuelProviderSyncRun.php +36 -0
  401. package/server/src/Http/Resources/v1/FuelProviderTransaction.php +54 -0
  402. package/server/src/Http/Resources/v1/FuelReport.php +28 -22
  403. package/server/src/Http/Resources/v1/Index/Driver.php +26 -20
  404. package/server/src/Http/Resources/v1/Index/Order.php +12 -9
  405. package/server/src/Http/Resources/v1/Index/Vehicle.php +29 -22
  406. package/server/src/Http/Resources/v1/Issue.php +25 -0
  407. package/server/src/Http/Resources/v1/Order.php +20 -18
  408. package/server/src/Http/Resources/v1/Vehicle.php +17 -0
  409. package/server/src/Http/Resources/v1/VehicleWithoutDriver.php +2 -0
  410. package/server/src/Jobs/SyncFuelProviderTransactionsJob.php +57 -0
  411. package/server/src/Jobs/SyncTelematicDevicesJob.php +36 -6
  412. package/server/src/Jobs/TestTelematicConnectionJob.php +9 -22
  413. package/server/src/Mail/CustomerCredentialsMail.php +5 -6
  414. package/server/src/Models/Asset.php +2 -1
  415. package/server/src/Models/Contact.php +32 -52
  416. package/server/src/Models/Device.php +27 -4
  417. package/server/src/Models/DeviceEvent.php +40 -3
  418. package/server/src/Models/Driver.php +2 -1
  419. package/server/src/Models/Equipment.php +2 -1
  420. package/server/src/Models/Fleet.php +2 -1
  421. package/server/src/Models/FuelProviderConnection.php +60 -0
  422. package/server/src/Models/FuelProviderSyncRun.php +58 -0
  423. package/server/src/Models/FuelProviderTransaction.php +119 -0
  424. package/server/src/Models/FuelReport.php +16 -1
  425. package/server/src/Models/Issue.php +47 -6
  426. package/server/src/Models/Order.php +33 -6
  427. package/server/src/Models/Part.php +2 -1
  428. package/server/src/Models/Sensor.php +21 -4
  429. package/server/src/Models/ServiceArea.php +1 -1
  430. package/server/src/Models/ServiceRate.php +39 -2
  431. package/server/src/Models/Vehicle.php +14 -2
  432. package/server/src/Models/Vendor.php +2 -1
  433. package/server/src/Models/VendorPersonnel.php +10 -1
  434. package/server/src/Models/Zone.php +1 -1
  435. package/server/src/Observers/PurchaseRateObserver.php +20 -0
  436. package/server/src/Observers/ZoneObserver.php +56 -0
  437. package/server/src/Providers/FleetOpsServiceProvider.php +11 -0
  438. package/server/src/Support/Analytics/FuelProviderSummary.php +42 -0
  439. package/server/src/Support/Analytics/TopDrivers.php +9 -1
  440. package/server/src/Support/FuelProviders/FuelProviderDescriptor.php +55 -0
  441. package/server/src/Support/FuelProviders/FuelProviderRegistry.php +75 -0
  442. package/server/src/Support/FuelProviders/FuelProviderService.php +447 -0
  443. package/server/src/Support/FuelProviders/Providers/AbstractFuelProvider.php +98 -0
  444. package/server/src/Support/FuelProviders/Providers/PetroAppFuelProvider.php +167 -0
  445. package/server/src/Support/GettingStarted.php +144 -0
  446. package/server/src/Support/PlaceSearch.php +282 -0
  447. package/server/src/Support/ResolvesOrderServiceStops.php +22 -12
  448. package/server/src/Support/Telematics/Providers/AbstractProvider.php +27 -6
  449. package/server/src/Support/Telematics/Providers/AfaqyProvider.php +55 -26
  450. package/server/src/Support/Telematics/Providers/FlespiProvider.php +1 -0
  451. package/server/src/Support/Telematics/Providers/GeotabProvider.php +1 -0
  452. package/server/src/Support/Telematics/Providers/SafeeProvider.php +32 -22
  453. package/server/src/Support/Telematics/Providers/SamsaraProvider.php +3 -1
  454. package/server/src/Support/Telematics/TelematicService.php +340 -21
  455. package/server/src/routes.php +74 -5
  456. package/server/tests/AnalyticsRoutesTest.php +8 -0
  457. package/server/tests/CustomerContactIdentitySafetyTest.php +41 -0
  458. package/server/tests/DriverVehicleStatusDefaultTest.php +2 -2
  459. package/server/tests/FuelProviderRegistryTest.php +416 -0
  460. package/server/tests/GettingStartedStatusTest.php +21 -0
  461. package/server/tests/OrderActivityFlowRegressionTest.php +116 -0
  462. package/server/tests/ServiceAreaZoneApiShapeTest.php +44 -0
  463. package/server/tests/ServiceRateAlgorithmWeightVariablesTest.php +44 -0
  464. package/server/tests/TelematicsHardeningTest.php +268 -0
  465. package/server/tests/VehicleDriverAssignmentTest.php +51 -0
  466. package/translations/ar-ae.yml +31 -0
  467. package/translations/bg-bg.yaml +81 -0
  468. package/translations/en-us.yaml +94 -0
  469. package/translations/es-pa.yaml +81 -0
  470. package/translations/fr-fr.yaml +81 -0
  471. package/translations/mn-mn.yaml +81 -0
  472. package/translations/pt-br.yaml +81 -0
  473. package/translations/ru-ru.yaml +81 -0
  474. package/translations/vi-vn.yaml +106 -0
  475. package/addon/controllers/connectivity/telematics/index/details/devices.js +0 -3
  476. package/addon/controllers/connectivity/telematics/index/details/events.js +0 -3
  477. package/addon/controllers/connectivity/telematics/index/details/index.js +0 -3
  478. package/addon/controllers/connectivity/telematics/index/details/sensors.js +0 -3
  479. package/addon/controllers/connectivity/telematics/index/details.js +0 -24
  480. package/addon/routes/connectivity/telematics/index/details/devices.js +0 -3
  481. package/addon/routes/connectivity/telematics/index/details/events.js +0 -3
  482. package/addon/routes/connectivity/telematics/index/details/index.js +0 -3
  483. package/addon/routes/connectivity/telematics/index/details/sensors.js +0 -3
  484. package/addon/routes/connectivity/telematics/index/new.js +0 -3
  485. package/addon/templates/connectivity/telematics/index/details/devices.hbs +0 -1
  486. package/addon/templates/connectivity/telematics/index/details/events.hbs +0 -1
  487. package/addon/templates/connectivity/telematics/index/details/sensors.hbs +0 -1
  488. package/addon/templates/connectivity/telematics/index/details.hbs +0 -14
  489. package/addon/templates/connectivity/telematics/index/edit.hbs +0 -12
  490. package/addon/templates/connectivity/telematics/index/new.hbs +0 -12
  491. package/app/controllers/connectivity/telematics/index/details/events.js +0 -1
  492. package/app/controllers/connectivity/telematics/index/details/sensors.js +0 -1
  493. package/app/routes/connectivity/telematics/index/details/sensors.js +0 -1
  494. package/app/templates/connectivity/telematics/index/details/sensors.js +0 -1
@@ -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
+ }
@@ -4,16 +4,62 @@ import { inject as service } from '@ember/service';
4
4
 
5
5
  export default class ManagementIssuesIndexDetailsController extends Controller {
6
6
  @service hostRouter;
7
+ @service issueActions;
8
+
7
9
  @tracked tabs = [
8
10
  {
9
11
  route: 'management.issues.index.details.index',
10
12
  label: 'Overview',
11
13
  },
12
14
  ];
13
- @tracked actionButtons = [
14
- {
15
- icon: 'pencil',
16
- fn: () => this.hostRouter.transitionTo('console.fleet-ops.management.issues.index.edit', this.model),
17
- },
18
- ];
15
+
16
+ get isClosed() {
17
+ return ['closed', 'resolved', 'completed'].includes(this.model?.status);
18
+ }
19
+
20
+ get actionButtons() {
21
+ const workflowItems = [
22
+ {
23
+ label: 'Change Status',
24
+ icon: 'arrows-rotate',
25
+ fn: () => this.issueActions.openStatusModal(this.model, { onSaved: () => this.refreshIssue() }),
26
+ },
27
+ {
28
+ label: 'Assign Issue',
29
+ icon: 'user-check',
30
+ fn: () => this.issueActions.openAssignModal(this.model, { onSaved: () => this.refreshIssue() }),
31
+ },
32
+ ];
33
+
34
+ if (this.isClosed) {
35
+ workflowItems.push({
36
+ label: 'Re-open Issue',
37
+ icon: 'rotate-left',
38
+ fn: () => this.issueActions.confirmReopenIssue(this.model, { onSaved: () => this.refreshIssue() }),
39
+ });
40
+ } else {
41
+ workflowItems.push({
42
+ label: 'Close Issue',
43
+ icon: 'circle-check',
44
+ class: 'text-green-600 dark:text-green-400',
45
+ fn: () => this.issueActions.openCloseIssueModal(this.model, { onSaved: () => this.refreshIssue() }),
46
+ });
47
+ }
48
+
49
+ return [
50
+ {
51
+ icon: 'pencil',
52
+ fn: () => this.hostRouter.transitionTo('console.fleet-ops.management.issues.index.edit', this.model),
53
+ },
54
+ {
55
+ icon: 'ellipsis',
56
+ type: 'default',
57
+ items: workflowItems,
58
+ },
59
+ ];
60
+ }
61
+
62
+ refreshIssue() {
63
+ return this.model?.reload?.();
64
+ }
19
65
  }
@@ -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
  }
@@ -9,6 +9,10 @@ export default class ManagementVendorsIndexDetailsController extends Controller
9
9
  route: 'management.vendors.index.details.index',
10
10
  label: 'Overview',
11
11
  },
12
+ {
13
+ route: 'management.vendors.index.details.personnel',
14
+ label: 'Personnel',
15
+ },
12
16
  ];
13
17
  @tracked actionButtons = [
14
18
  {
@@ -1,5 +1,6 @@
1
1
  import Controller, { inject as controller } from '@ember/controller';
2
2
  import { tracked } from '@glimmer/tracking';
3
+ import { action } from '@ember/object';
3
4
  import { inject as service } from '@ember/service';
4
5
  import { isArray } from '@ember/array';
5
6
  import { task } from 'ember-concurrency';
@@ -19,6 +20,7 @@ export default class OperationsOrdersIndexDetailsController extends Controller {
19
20
  @tracked routingControl;
20
21
  @tracked routingCompleted = false;
21
22
  @tracked realtimeOrderPublicId = null;
23
+ @tracked proofReloadToken = 0;
22
24
 
23
25
  get routePoints() {
24
26
  return buildRoutePointsFromPayload(this.model?.payload);
@@ -97,9 +99,7 @@ export default class OperationsOrdersIndexDetailsController extends Controller {
97
99
  disabled: this.model.status === 'canceled',
98
100
  fn: () =>
99
101
  this.orderActions.updateActivity(this.model, {
100
- onFinish: () => {
101
- this.refresh.perform();
102
- },
102
+ onFinish: this.handleActivityModalFinish,
103
103
  }),
104
104
  },
105
105
  {
@@ -154,6 +154,14 @@ export default class OperationsOrdersIndexDetailsController extends Controller {
154
154
  ];
155
155
  }
156
156
 
157
+ @action handleActivityModalFinish(options) {
158
+ this.refresh.perform();
159
+
160
+ if (options?.proofCreated) {
161
+ this.proofReloadToken++;
162
+ }
163
+ }
164
+
157
165
  @task *refresh() {
158
166
  try {
159
167
  yield this.hostRouter.refresh();
@@ -271,7 +271,7 @@ export default class OperationsOrdersIndexController extends Controller {
271
271
  },
272
272
  {
273
273
  label: this.intl.t('column.transaction'),
274
- cellComponent: 'table/cell/base',
274
+ cellComponent: 'table/cell/currency',
275
275
  valuePath: 'transaction_amount',
276
276
  resizable: true,
277
277
  hidden: true,
@@ -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
  }
@@ -117,6 +117,9 @@ export default {
117
117
  // Create registries
118
118
  this.createRegistries(registryService);
119
119
 
120
+ // // Register console home guidance
121
+ // this.registerHomeComponents(registryService);
122
+
120
123
  // Setup customer portal
121
124
  const isCustomerPortalInstalled = universe.extensionManager.isInstalled('@fleetbase/customer-portal-engine');
122
125
  if (isCustomerPortalInstalled) {
@@ -216,13 +219,23 @@ export default {
216
219
  category: 'Analytics',
217
220
  default: false,
218
221
  }),
222
+ new Widget({
223
+ id: 'fleet-ops-live-fleet-widget',
224
+ name: 'Live Fleet Map',
225
+ description: 'Real-time driver positions and active routes.',
226
+ icon: 'map-location-dot',
227
+ component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/live-fleet'),
228
+ grid_options: { w: 8, h: 11, minW: 8, minH: 8 },
229
+ category: 'Maps',
230
+ default: true,
231
+ }),
219
232
  new Widget({
220
233
  id: 'fleet-ops-revenue-trend-widget',
221
234
  name: 'Revenue Trend',
222
235
  description: 'Revenue over time with period comparison.',
223
236
  icon: 'chart-line',
224
237
  component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/revenue-trend'),
225
- grid_options: { w: 6, h: 6, minW: 5, minH: 5 },
238
+ grid_options: { w: 4, h: 11, minW: 4, minH: 8 },
226
239
  category: 'Analytics',
227
240
  default: true,
228
241
  }),
@@ -254,7 +267,7 @@ export default {
254
267
  component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/top-drivers'),
255
268
  grid_options: { w: 6, h: 6, minW: 5, minH: 5 },
256
269
  category: 'Analytics',
257
- default: false,
270
+ default: true,
258
271
  }),
259
272
  new Widget({
260
273
  id: 'fleet-ops-fuel-efficiency-widget',
@@ -266,6 +279,16 @@ export default {
266
279
  category: 'Analytics',
267
280
  default: false,
268
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
+ }),
269
292
  new Widget({
270
293
  id: 'fleet-ops-issues-insights-widget',
271
294
  name: 'Issues Insights',
@@ -296,21 +319,15 @@ export default {
296
319
  category: 'Analytics',
297
320
  default: false,
298
321
  }),
299
- new Widget({
300
- id: 'fleet-ops-live-fleet-widget',
301
- name: 'Live Fleet Map',
302
- description: 'Real-time driver positions and active routes.',
303
- icon: 'map-location-dot',
304
- component: new ExtensionComponent('@fleetbase/fleetops-engine', 'widget/live-fleet'),
305
- grid_options: { w: 12, h: 10, minW: 8, minH: 8 },
306
- category: 'Maps',
307
- default: true,
308
- }),
309
322
  ];
310
323
 
311
324
  widgetService.registerWidgets('dashboard', widgets);
312
325
  },
313
326
 
327
+ registerHomeComponents(registryService) {
328
+ registryService.registerRenderableComponent('console:home:before-dashboard', new ExtensionComponent('@fleetbase/fleetops-engine', 'home/getting-started-guidance'));
329
+ },
330
+
314
331
  createRegistries(registryService) {
315
332
  registryService.createRegistries([
316
333
  'engine:fleet-ops',
@@ -1,38 +1 @@
1
- import { helper } from '@ember/component/helper';
2
-
3
- export function formatDurationValue(seconds) {
4
- const value = Number(seconds);
5
-
6
- if (!Number.isFinite(value)) {
7
- return '0s';
8
- }
9
-
10
- const totalSeconds = Math.max(0, Math.ceil(value));
11
- const days = Math.floor(totalSeconds / 86400);
12
- const hours = Math.floor((totalSeconds % 86400) / 3600);
13
- const minutes = Math.floor((totalSeconds % 3600) / 60);
14
- const remainingSeconds = totalSeconds % 60;
15
- const parts = [];
16
-
17
- if (days) {
18
- parts.push(`${days}d`);
19
- }
20
-
21
- if (hours) {
22
- parts.push(`${hours}h`);
23
- }
24
-
25
- if (!days && minutes) {
26
- parts.push(`${minutes}m`);
27
- }
28
-
29
- if (!days && !hours && parts.length < 2 && remainingSeconds) {
30
- parts.push(`${remainingSeconds}s`);
31
- }
32
-
33
- return parts.length ? parts.join(' ') : '0s';
34
- }
35
-
36
- export default helper(function formatDuration([seconds]) {
37
- return formatDurationValue(seconds);
38
- });
1
+ export { default, formatDurationValue } from '@fleetbase/ember-ui/helpers/format-duration';
@@ -1,15 +1,14 @@
1
- import loadLeafletPlugins from '@fleetbase/ember-ui/utils/load-leaflet-plugins';
1
+ import { debug } from '@ember/debug';
2
+ import ensureLeafletPluginsReady from '../utils/leaflet-plugin-loader';
2
3
 
3
4
  export function initialize() {
4
5
  let waitForLeaflet = setInterval(() => {
5
6
  let leafletLoaded = window.L !== undefined;
6
7
  if (leafletLoaded) {
7
- loadLeafletPlugins({
8
- scripts: ['leaflet.contextmenu.js', 'leaflet.draw-src.js'],
9
- stylesheets: ['leaflet.contextmenu.css', 'leaflet.draw.css'],
10
- globalIndicatorKey: 'fleetopsLeafletPluginsLoaded',
11
- });
12
8
  clearInterval(waitForLeaflet);
9
+ ensureLeafletPluginsReady().catch((error) => {
10
+ debug(error.message);
11
+ });
13
12
  }
14
13
  }, 100);
15
14
  }