@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,268 @@
1
+ <?php
2
+
3
+ use Fleetbase\FleetOps\Contracts\TelematicProviderDescriptor;
4
+
5
+ test('device event model and migration expose lifecycle fields used by telematics workflows', function () {
6
+ $model = file_get_contents(__DIR__ . '/../src/Models/DeviceEvent.php');
7
+ $migration = file_get_contents(__DIR__ . '/../migrations/2026_06_06_000001_harden_device_events_telematics_contract.php');
8
+
9
+ expect($migration)
10
+ ->toContain("'message'")
11
+ ->toContain("'occurred_at'")
12
+ ->toContain("'processed_at'")
13
+ ->toContain("'data'");
14
+
15
+ expect($model)
16
+ ->toContain("'message'")
17
+ ->toContain("'occurred_at'")
18
+ ->toContain("'processed_at'")
19
+ ->toContain("'data'")
20
+ ->toContain("'occurred_at' => 'datetime'")
21
+ ->toContain("'processed_at' => 'datetime'");
22
+ });
23
+
24
+ test('webhook controller resolves integrations explicitly and does not select the first provider record', function () {
25
+ $controller = file_get_contents(__DIR__ . '/../src/Http/Controllers/TelematicWebhookController.php');
26
+
27
+ expect($controller)
28
+ ->toContain('$this->service->resolveWebhookTelematic($providerKey')
29
+ ->toContain("'Unable to resolve telematic integration'")
30
+ ->toContain('$result[\'devices\'] ?? []')
31
+ ->toContain('$result[\'events\'] ?? []')
32
+ ->toContain('$result[\'sensors\'] ?? []')
33
+ ->toContain('Ambiguous telematic integration')
34
+ ->toContain('validateWebhookSignature($request->getContent(), $signature')
35
+ ->not->toContain("Telematic::where('provider', \$providerKey)\n ->when")
36
+ ->not->toContain("->first();\n\n if (!\$telematic)");
37
+ });
38
+
39
+ test('telematics service requires provider identity and stores idempotent event keys', function () {
40
+ $service = file_get_contents(__DIR__ . '/../src/Support/Telematics/TelematicService.php');
41
+
42
+ expect($service)
43
+ ->toContain('Provider device identity is required to link a telematics device.')
44
+ ->toContain('DeviceEvent::firstOrNew([\'_key\' => $eventKey])')
45
+ ->toContain('protected function makeEventKey')
46
+ ->toContain('$telematic->public_id ?? $telematic->uuid')
47
+ ->toContain('resolveWebhookTelematic')
48
+ ->toContain('whereHas(\'device\'')
49
+ ->toContain('meta->provider_account_id');
50
+ });
51
+
52
+ test('native providers normalize device payloads to canonical FleetOps keys', function () {
53
+ $afaqy = file_get_contents(__DIR__ . '/../src/Support/Telematics/Providers/AfaqyProvider.php');
54
+ $safee = file_get_contents(__DIR__ . '/../src/Support/Telematics/Providers/SafeeProvider.php');
55
+
56
+ foreach ([$afaqy, $safee] as $provider) {
57
+ expect($provider)
58
+ ->toContain("'device_id'")
59
+ ->toContain("'name'")
60
+ ->toContain("'provider'")
61
+ ->toContain("'model'")
62
+ ->toContain("'online'")
63
+ ->toContain("'last_seen_at'");
64
+ }
65
+ });
66
+
67
+ test('telematics details use public id for consumer webhook URLs and do not read ember uuid', function () {
68
+ $component = file_get_contents(__DIR__ . '/../../addon/components/telematic/details.js');
69
+ $template = file_get_contents(__DIR__ . '/../../addon/components/telematic/details.hbs');
70
+
71
+ expect($component)
72
+ ->toContain('const id = this.args.resource?.public_id;')
73
+ ->toContain('return null;')
74
+ ->not->toContain('this.args.resource?.uuid')
75
+ ->not->toContain('this.args.resource?.public_id ?? this.args.resource?.id');
76
+
77
+ expect($template)
78
+ ->toContain('this.hasWebhookUrl')
79
+ ->toContain('Webhook URL unavailable until this integration has a public ID.')
80
+ ->toContain('last_sync_job_id')
81
+ ->toContain('last_sync_error');
82
+ });
83
+
84
+ test('native telematics providers expose local provider icons with a descriptor fallback', function () {
85
+ $config = include __DIR__ . '/../config/telematics.php';
86
+ $iconPath = '/engines-dist/images/telematics/providers/';
87
+ $providers = array_filter($config['providers'], fn ($provider) => ($provider['type'] ?? 'native') === 'native');
88
+
89
+ foreach ($providers as $provider) {
90
+ $icon = $provider['icon'] ?? null;
91
+
92
+ expect($icon)
93
+ ->not->toBeNull()
94
+ ->not->toContain('http://')
95
+ ->not->toContain('https://');
96
+
97
+ expect(str_starts_with($icon, $iconPath))->toBeTrue();
98
+ expect(str_ends_with($icon, '.webp'))->toBeTrue();
99
+ expect(file_exists(__DIR__ . '/../../assets/images/telematics/providers/' . basename($icon)))->toBeTrue();
100
+ }
101
+
102
+ $safee = collect($providers)->firstWhere('key', 'safee');
103
+
104
+ expect($safee['icon'])->toBe($iconPath . 'safee.webp');
105
+
106
+ $descriptor = new TelematicProviderDescriptor([
107
+ 'key' => 'custom',
108
+ 'label' => 'Custom',
109
+ ]);
110
+
111
+ expect($descriptor->icon)->toBe(TelematicProviderDescriptor::DEFAULT_ICON);
112
+ expect(file_exists(__DIR__ . '/../../assets/images/telematics/providers/default.webp'))->toBeTrue();
113
+ });
114
+
115
+ test('device event mark processed action is routed and company scoped', function () {
116
+ $routes = file_get_contents(__DIR__ . '/../src/routes.php');
117
+ $controller = file_get_contents(__DIR__ . '/../src/Http/Controllers/Internal/v1/DeviceEventController.php');
118
+
119
+ expect($routes)
120
+ ->toContain("\$router->fleetbaseRoutes('device-events', function")
121
+ ->toContain("'{id}/mark-processed'")
122
+ ->toContain("\$controller('markProcessed')");
123
+
124
+ expect($controller)
125
+ ->toContain('public function markProcessed(string $id): JsonResponse')
126
+ ->toContain("where('company_uuid', session('company'))")
127
+ ->toContain("where('uuid', \$id)->orWhere('public_id', \$id)")
128
+ ->toContain('$deviceEvent->markAsProcessed()')
129
+ ->toContain("'Event was already processed.'");
130
+ });
131
+
132
+ test('afaqy sync stores compact device diagnostics and does not leak token URLs', function () {
133
+ $provider = file_get_contents(__DIR__ . '/../src/Support/Telematics/Providers/AfaqyProvider.php');
134
+
135
+ expect($provider)
136
+ ->toContain('compactLastUpdate')
137
+ ->toContain("'provider_unit_id'")
138
+ ->toContain("'plate_number'")
139
+ ->toContain("'capabilities'")
140
+ ->not->toContain("'raw' => \$payload")
141
+ ->not->toContain("'sensors',")
142
+ ->not->toContain("?token=' . urlencode")
143
+ ->toContain("'Authorization' => 'Bearer ' . \$token")
144
+ ->toContain("array_merge(['token' => \$this->credentials['token']], \$payload)");
145
+ });
146
+
147
+ test('native endpoint fields are advanced optional overrides with provider defaults', function () {
148
+ $config = include __DIR__ . '/../config/telematics.php';
149
+
150
+ $afaqy = collect($config['providers'])->firstWhere('key', 'afaqy');
151
+ $safee = collect($config['providers'])->firstWhere('key', 'safee');
152
+
153
+ $afaqyBaseUrl = collect($afaqy['required_fields'])->firstWhere('name', 'base_url');
154
+ $safeeServerUri = collect($safee['required_fields'])->firstWhere('name', 'server_uri');
155
+
156
+ foreach ([$afaqyBaseUrl, $safeeServerUri] as $field) {
157
+ expect($field['required'])->toBeFalse();
158
+ expect($field['advanced'])->toBeTrue();
159
+ expect($field['is_endpoint'])->toBeTrue();
160
+ expect($field['validation'])->toBe('nullable|url');
161
+ expect($field['default_value'])->not->toBeEmpty();
162
+ }
163
+ });
164
+
165
+ test('telematics activity logging excludes large json and spatial payloads', function () {
166
+ $device = telematics_activity_log_method(file_get_contents(__DIR__ . '/../src/Models/Device.php'));
167
+ $sensor = telematics_activity_log_method(file_get_contents(__DIR__ . '/../src/Models/Sensor.php'));
168
+ $deviceEvent = telematics_activity_log_method(file_get_contents(__DIR__ . '/../src/Models/DeviceEvent.php'));
169
+
170
+ foreach ([$device, $sensor, $deviceEvent] as $model) {
171
+ expect($model)
172
+ ->toContain('->logOnly([')
173
+ ->toContain('->logOnlyDirty()')
174
+ ->not->toContain('return LogOptions::defaults()->logAll();');
175
+ }
176
+
177
+ expect($device)
178
+ ->not->toContain("'meta'")
179
+ ->not->toContain("'data'")
180
+ ->not->toContain("'last_position',");
181
+
182
+ expect($sensor)
183
+ ->not->toContain("'meta',")
184
+ ->not->toContain("'last_position',");
185
+
186
+ expect($deviceEvent)
187
+ ->not->toContain("'payload',")
188
+ ->not->toContain("'data',")
189
+ ->not->toContain("'location',");
190
+ });
191
+
192
+ test('telematics setup renders endpoint overrides only in advanced settings', function () {
193
+ $formTemplate = file_get_contents(__DIR__ . '/../../addon/components/telematic/form.hbs');
194
+ $settingsTemplate = file_get_contents(__DIR__ . '/../../addon/components/telematic/settings.hbs');
195
+ $formComponent = file_get_contents(__DIR__ . '/../../addon/components/telematic/form.js');
196
+ $settingsComponent = file_get_contents(__DIR__ . '/../../addon/components/telematic/settings.js');
197
+
198
+ foreach ([$formComponent, $settingsComponent] as $component) {
199
+ expect($component)
200
+ ->toContain('advancedCredentialFields')
201
+ ->toContain('field.advanced || field.is_endpoint')
202
+ ->toContain('!field.advanced && !field.is_endpoint');
203
+ }
204
+
205
+ foreach ([$formTemplate, $settingsTemplate] as $template) {
206
+ expect($template)
207
+ ->toContain('Advanced connection settings')
208
+ ->toContain('this.advancedCredentialFields')
209
+ ->toContain('field.default_value');
210
+ }
211
+ });
212
+
213
+ test('telematics details logs are routed and use persisted safe data only', function () {
214
+ $routes = file_get_contents(__DIR__ . '/../src/routes.php');
215
+ $controller = file_get_contents(__DIR__ . '/../src/Http/Controllers/Internal/v1/TelematicController.php');
216
+
217
+ expect($routes)
218
+ ->toContain("'{id}/logs'")
219
+ ->toContain("\$controller('logs')");
220
+
221
+ expect($controller)
222
+ ->toContain('public function logs(Request $request, string $id): JsonResponse')
223
+ ->toContain('Activity::with([\'causer\'])')
224
+ ->toContain("where('subject_type', Telematic::class)")
225
+ ->toContain("where('subject_id', \$telematic->uuid)")
226
+ ->toContain("where('company_uuid', session('company'))")
227
+ ->toContain('Provider connection details were updated.')
228
+ ->toContain('makeTelematicMetadataLogs')
229
+ ->toContain('userFacingIssueMessage')
230
+ ->toContain('isSensitiveIssueMessage')
231
+ ->not->toContain('changed_fields')
232
+ ->not->toContain('Str::headline')
233
+ ->not->toContain('storage_path')
234
+ ->not->toContain('Log::');
235
+ });
236
+
237
+ test('telematics provider status display maps active and connected to connected', function () {
238
+ $indexController = file_get_contents(__DIR__ . '/../../addon/controllers/connectivity/telematics/index.js');
239
+ $detailsController = file_get_contents(__DIR__ . '/../../addon/controllers/connectivity/telematics/details.js');
240
+ $statusCell = file_get_contents(__DIR__ . '/../../addon/components/cell/telematic-status.js');
241
+
242
+ expect($indexController)
243
+ ->toContain("cellComponent: 'cell/telematic-status'");
244
+
245
+ expect($detailsController)
246
+ ->toContain("case 'active':\n return 'Connected';");
247
+
248
+ expect($statusCell)
249
+ ->toContain("case 'active':")
250
+ ->toContain("case 'connected':")
251
+ ->toContain("return 'Connected';");
252
+ });
253
+
254
+ test('telematics overview attention items render as full width stacked alerts', function () {
255
+ $template = file_get_contents(__DIR__ . '/../../addon/components/telematic/details.hbs');
256
+
257
+ expect($template)
258
+ ->toContain('<section class="flex flex-col gap-3">')
259
+ ->toContain('class="w-full rounded-md border border-yellow-200 bg-yellow-50 p-3')
260
+ ->not->toContain('lg:grid-cols-2');
261
+ });
262
+
263
+ function telematics_activity_log_method(string $model): string
264
+ {
265
+ preg_match('/public function getActivitylogOptions\(\): LogOptions\s+\{(?P<body>.*?)\n \}/s', $model, $matches);
266
+
267
+ return $matches['body'] ?? '';
268
+ }
@@ -16,3 +16,54 @@ test('vehicle updates preserve driver assignment unless driver input is explicit
16
16
  ->toContain('public function unassignDriver(): self')
17
17
  ->toContain("Driver::where('vehicle_uuid', \$this->uuid)->update(['vehicle_uuid' => null])");
18
18
  });
19
+
20
+ test('driver assigned-order workflows expose list and multi-unassign endpoints', function () {
21
+ $routes = file_get_contents(dirname(__DIR__) . '/src/routes.php');
22
+ $controller = file_get_contents(dirname(__DIR__) . '/src/Http/Controllers/Internal/v1/DriverController.php');
23
+ $resource = file_get_contents(dirname(__DIR__) . '/src/Http/Resources/v1/Driver.php');
24
+ $index = file_get_contents(dirname(__DIR__) . '/src/Http/Resources/v1/Index/Driver.php');
25
+
26
+ expect($routes)
27
+ ->toContain("\$router->get('{id}/assigned-orders', \$controller('assignedOrders'))")
28
+ ->toContain("\$router->post('{id}/unassign-orders', \$controller('unassignOrders'))")
29
+ ->and($controller)
30
+ ->toContain('public function assignedOrders(string $id): JsonResponse')
31
+ ->toContain('public function unassignOrders(Request $request, string $id): JsonResponse')
32
+ ->toContain("->where('driver_assigned_uuid', \$driver->uuid)")
33
+ ->toContain("->orderByRaw('uuid = ? desc', [\$driver->current_job_uuid])")
34
+ ->toContain("\$request->validate(['orders' => ['required', 'array', 'min:1']])")
35
+ ->toContain("->where('driver_assigned_uuid', \$driver->uuid)")
36
+ ->toContain("->whereIn('uuid', \$selectedOrderUuids)")
37
+ ->toContain("->update(['driver_assigned_uuid' => null])")
38
+ ->toContain("if (\$driver->current_job_uuid && \$orders->contains('uuid', \$driver->current_job_uuid))")
39
+ ->toContain("\$driver->update(['current_job_uuid' => null])")
40
+ ->and($resource)
41
+ ->toContain("'assigned_orders_count'")
42
+ ->toContain("'current_order_reference'")
43
+ ->and($index)
44
+ ->toContain("'assigned_orders_count'");
45
+ });
46
+
47
+ test('vehicle assigned-order workflows expose list and multi-unassign endpoints without clearing driver vehicle assignment', function () {
48
+ $routes = file_get_contents(dirname(__DIR__) . '/src/routes.php');
49
+ $controller = file_get_contents(dirname(__DIR__) . '/src/Http/Controllers/Internal/v1/VehicleController.php');
50
+ $resource = file_get_contents(dirname(__DIR__) . '/src/Http/Resources/v1/Vehicle.php');
51
+ $index = file_get_contents(dirname(__DIR__) . '/src/Http/Resources/v1/Index/Vehicle.php');
52
+
53
+ expect($routes)
54
+ ->toContain("\$router->get('{id}/assigned-orders', \$controller('assignedOrders'))")
55
+ ->toContain("\$router->post('{id}/unassign-orders', \$controller('unassignOrders'))")
56
+ ->and($controller)
57
+ ->toContain('public function assignedOrders(string $id): JsonResponse')
58
+ ->toContain('public function unassignOrders(Request $request, string $id): JsonResponse')
59
+ ->toContain("->where('vehicle_assigned_uuid', \$vehicle->uuid)")
60
+ ->toContain("\$request->validate(['orders' => ['required', 'array', 'min:1']])")
61
+ ->toContain("->whereIn('uuid', \$selectedOrderUuids)")
62
+ ->toContain("->update(['vehicle_assigned_uuid' => null])")
63
+ ->not->toContain("->update(['vehicle_uuid' => null])")
64
+ ->and($resource)
65
+ ->toContain("'assigned_orders_count'")
66
+ ->toContain("'current_order_reference'")
67
+ ->and($index)
68
+ ->toContain("'assigned_orders_count'");
69
+ });
@@ -1,3 +1,7 @@
1
+ menu:
2
+ fuel-providers: تكاملات الوقود
3
+ fuel-transactions: معاملات الوقود
4
+
1
5
  fleet-ops:
2
6
  extension-name: Fleet-Ops
3
7
  common:
@@ -309,10 +313,12 @@ fleet-ops:
309
313
  contacts: جهات الاتصال
310
314
  places: الأماكن
311
315
  fuel-reports: تقارير الوقود
316
+ fuel-transactions: معاملات الوقود
312
317
  issues: القضايا
313
318
  title: إنشاء طلب جديد
314
319
  settings: الإعدادات
315
320
  order-config: تكوين الطلب
321
+ fuel-providers: تكاملات الوقود
316
322
  live-map-drawer:
317
323
  driver-listing:
318
324
  location: الموقع
@@ -721,6 +727,15 @@ fleet-ops:
721
727
  fleet-ops-quickstart:
722
728
  message: لنرى ما يمكنك فعله لبدء العمليات...
723
729
  start-task: بدء المهمة
730
+ get-started:
731
+ title: Get Started with Fleet-Ops
732
+ subtitle: Set up the essentials and complete your first dispatch flow.
733
+ completed: completed
734
+ preview-title: First order workflow
735
+ recommended-features:
736
+ title: Recommended features for you
737
+ subtitle: Explore tools that help new operations teams get productive faster.
738
+ learn-more: Learn more
724
739
  key-metrics:
725
740
  title: مقاييس Fleet-Ops
726
741
  earnings: الأرباح
@@ -1603,3 +1618,19 @@ scheduler:
1603
1618
  reason: Reason
1604
1619
  reason-placeholder: e.g. Personal appointment
1605
1620
  notes-placeholder: Optional additional notes
1621
+
1622
+ order:
1623
+ card:
1624
+ linked-order: Linked Order
1625
+ unknown-order: Unknown order
1626
+ no-type: No type
1627
+ pickup: Pickup
1628
+ dropoff: Dropoff
1629
+ return: Return
1630
+ waypoints: Waypoints
1631
+ additional-stop: additional stop
1632
+ additional-stops: additional stops
1633
+ no-pickup-address: No pickup address
1634
+ no-dropoff-address: No dropoff address
1635
+ no-route-details: No route details available.
1636
+ no-order-linked: No order is linked to this issue.
@@ -46,6 +46,7 @@ common:
46
46
  overview: Overview
47
47
  notes: Notes
48
48
  schedule: Schedule
49
+ current-job: Current Job
49
50
  menu:
50
51
  operations: Операции
51
52
  dashboard: Табло
@@ -61,6 +62,7 @@ menu:
61
62
  contacts: Контакти
62
63
  places: Места
63
64
  fuel-reports: Доклади за гориво
65
+ fuel-transactions: Транзакции за гориво
64
66
  issues: Проблеми
65
67
  maintenance: Поддръжка
66
68
  work-orders: Работни поръчки
@@ -68,6 +70,7 @@ menu:
68
70
  parts: Части
69
71
  connectivity: Свързаност
70
72
  telematics: Телематика
73
+ fuel-providers: Интеграции за гориво
71
74
  devices: Устройства
72
75
  sensors: Сензори
73
76
  events: Събития
@@ -410,9 +413,30 @@ driver:
410
413
  driver-license: Шофьорска книжка
411
414
  no-vehicle-assigned: Няма зададено превозно средство
412
415
  actions:
416
+ unassign-orders: Unassign Orders
417
+ unassign-vehicle: Unassign Vehicle
418
+ create-issue: Create Issue
413
419
  assign-order: Присвояване на поръчка на шофьор
414
420
  assign-vehicle: Присвояване на превозно средство на шофьор
415
421
  locate-driver: Намери шофьора на картата
422
+ prompts:
423
+ assign-order-success: Order assigned to {driverName}.
424
+ assign-order-title: "Assign order to {driverName}"
425
+ select-order-warning: "Select an order to assign."
426
+ assign-vehicle-title: "Assign vehicle to {driverName}"
427
+ assign-vehicle-success: "Vehicle assigned to {driverName}."
428
+ select-vehicle-warning: Select a vehicle to assign.
429
+ no-assigned-orders-warning: No assigned orders found for {driverName}.
430
+ select-orders-warning: Select at least one order to unassign.
431
+ unassign-orders-title: Unassign orders from {driverName}
432
+ confirm-unassign-orders-title: Unassign {count} order(s) from {driverName}?
433
+ confirm-unassign-orders-body: "This will remove {driverName} from these orders: {orders}."
434
+ unassign-orders-success: Unassigned {driverName} from {count} order(s).
435
+ no-vehicle-assigned-warning: No vehicle is assigned to {driverName}.
436
+ unassign-vehicle-title: Unassign {vehicleName} from {driverName}?
437
+ unassign-vehicle-body: This removes {driverName} from {vehicleName}. Order assignments are not changed.
438
+ unassign-vehicle-success: Unassigned {vehicleName} from {driverName}.
439
+ issue-title: Issue reported for {driverName}
416
440
  device:
417
441
  fields:
418
442
  title: Детайли за устройството
@@ -445,6 +469,18 @@ device:
445
469
  warranty: Гаранция
446
470
  warranty-placeholder: Изберете гаранция
447
471
  notes: Бележки
472
+ actions:
473
+ attach-to-vehicle: Attach to Vehicle
474
+ detach-from-vehicle: Detach from Vehicle
475
+ prompts:
476
+ attach-to-vehicle-title: Attach device to vehicle
477
+ attach-device-to-vehicle-title: "Attach {deviceName} to vehicle"
478
+ select-vehicle-warning: Select a vehicle to attach this device to.
479
+ attach-to-vehicle-success: Device attached to vehicle.
480
+ not-attached-warning: "{deviceName} is not attached to a vehicle."
481
+ detach-from-vehicle-title: "Detach {deviceName} from vehicle?"
482
+ detach-from-vehicle-body: "This detaches {deviceName} from {vehicleName} and stops vehicle telemetry updates until it is attached again."
483
+ detach-from-vehicle-success: Device detached from vehicle.
448
484
  entity:
449
485
  fields:
450
486
  declare: Декларирай
@@ -495,7 +531,15 @@ fleet:
495
531
  add-vehicle: Добавяне на превозно средство към флота
496
532
  loading-message: Зареждане на превозни средства във флота...
497
533
  actions:
534
+ assign-vehicle: Assign Vehicle to Fleet
498
535
  assign-driver: Присвояване на шофьор към флота
536
+ prompts:
537
+ assign-driver-title: Assign driver to {fleetName}
538
+ assign-vehicle-title: Assign vehicle to {fleetName}
539
+ select-driver-warning: Select a driver to assign.
540
+ select-vehicle-warning: Select a vehicle to assign.
541
+ assign-driver-success: Driver assigned to {fleetName}.
542
+ assign-vehicle-success: Vehicle assigned to {fleetName}.
499
543
  fuel-report:
500
544
  fields:
501
545
  details: Детайли за доклада за гориво
@@ -524,6 +568,20 @@ issue:
524
568
  tags: Етикети на проблема
525
569
  type: Тип на проблема
526
570
  order:
571
+ card:
572
+ linked-order: Linked Order
573
+ unknown-order: Unknown order
574
+ no-type: No type
575
+ pickup: Pickup
576
+ dropoff: Dropoff
577
+ return: Return
578
+ waypoints: Waypoints
579
+ additional-stop: additional stop
580
+ additional-stops: additional stops
581
+ no-pickup-address: No pickup address
582
+ no-dropoff-address: No dropoff address
583
+ no-route-details: No route details available.
584
+ no-order-linked: No order is linked to this issue.
527
585
  fields:
528
586
  ad-hoc: Спонтанен
529
587
  ad-hoc-help-text: Активирането на Ad-Hoc ще позволи на поръчката интелигентно
@@ -958,7 +1016,21 @@ vehicle:
958
1016
  vin-number: VIN номер
959
1017
  year: Година
960
1018
  actions:
1019
+ attach-device: Attach Device
1020
+ unassign-orders: Unassign Orders
1021
+ create-issue: Create Issue
961
1022
  locate-vehicle: Намери превозното средство на картата
1023
+ prompts:
1024
+ attach-device-title: Attach device to {vehicleName}
1025
+ select-device-warning: Select a device to attach.
1026
+ attach-device-success: Device attached to {vehicleName}.
1027
+ no-assigned-orders-warning: No assigned orders found for {vehicleName}.
1028
+ select-orders-warning: Select at least one order to unassign.
1029
+ unassign-orders-title: Unassign orders from {vehicleName}
1030
+ confirm-unassign-orders-title: Unassign {count} order(s) from {vehicleName}?
1031
+ confirm-unassign-orders-body: "This will remove {vehicleName} from these orders: {orders}."
1032
+ unassign-orders-success: Unassigned {vehicleName} from {count} order(s).
1033
+ issue-title: Issue reported for {vehicleName}
962
1034
  vendor:
963
1035
  fields:
964
1036
  setup-vendor: Настройка на доставчик
@@ -1594,6 +1666,15 @@ widget:
1594
1666
  fleet-ops-quickstart:
1595
1667
  message: Нека видим какво можете да направите, за да стартирате операциите...
1596
1668
  start-task: Започнете задача
1669
+ get-started:
1670
+ title: Get Started with Fleet-Ops
1671
+ subtitle: Set up the essentials and complete your first dispatch flow.
1672
+ completed: completed
1673
+ preview-title: First order workflow
1674
+ recommended-features:
1675
+ title: Recommended features for you
1676
+ subtitle: Explore tools that help new operations teams get productive faster.
1677
+ learn-more: Learn more
1597
1678
  key-metrics:
1598
1679
  title: Метрики на Fleet-Ops
1599
1680
  earnings: Печалби