@fleetbase/fleetops-engine 0.6.51 → 0.6.52

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (360) hide show
  1. package/README.md +0 -2
  2. package/addon/components/cell/telematic-provider.hbs +16 -0
  3. package/addon/components/cell/telematic-provider.js +36 -0
  4. package/addon/components/cell/telematic-status.hbs +1 -0
  5. package/addon/components/cell/telematic-status.js +39 -0
  6. package/addon/components/device/manager.hbs +5 -6
  7. package/addon/components/device/manager.js +12 -15
  8. package/addon/components/driver/details.hbs +1 -1
  9. package/addon/components/fleet/vehicle-listing.js +1 -0
  10. package/addon/components/fuel-integration/form.hbs +200 -0
  11. package/addon/components/fuel-integration/form.js +242 -0
  12. package/addon/components/fuel-integration/hub.hbs +154 -0
  13. package/addon/components/fuel-integration/hub.js +165 -0
  14. package/addon/components/fuel-integration/matching-priority.hbs +76 -0
  15. package/addon/components/fuel-integration/matching-priority.js +145 -0
  16. package/addon/components/fuel-report/details.hbs +13 -1
  17. package/addon/components/issue/details.hbs +3 -57
  18. package/addon/components/issue/details.js +0 -96
  19. package/addon/components/layout/fleet-ops-sidebar.js +20 -2
  20. package/addon/components/map/drawer/device-event-listing.hbs +12 -2
  21. package/addon/components/map/drawer/driver-listing.hbs +14 -1
  22. package/addon/components/map/drawer/place-listing.hbs +14 -1
  23. package/addon/components/map/drawer/position-listing.hbs +12 -2
  24. package/addon/components/map/drawer/vehicle-listing.hbs +14 -1
  25. package/addon/components/modals/assigned-orders.hbs +40 -0
  26. package/addon/components/modals/attach-device.hbs +4 -3
  27. package/addon/components/modals/attach-telematic-device.hbs +25 -0
  28. package/addon/components/modals/attach-telematic-device.js +3 -0
  29. package/addon/components/modals/driver-assign-order.hbs +7 -58
  30. package/addon/components/modals/driver-assign-vehicle.hbs +10 -2
  31. package/addon/components/modals/fleet-assign-driver.hbs +18 -0
  32. package/addon/components/modals/fleet-assign-driver.js +3 -0
  33. package/addon/components/modals/fleet-assign-vehicle.hbs +18 -0
  34. package/addon/components/modals/fleet-assign-vehicle.js +3 -0
  35. package/addon/components/modals/telematic-connection-diagnostics.hbs +75 -0
  36. package/addon/components/modals/telematic-connection-diagnostics.js +287 -0
  37. package/addon/components/modals/vehicle-details.hbs +6 -1
  38. package/addon/components/modals/vehicle-form.hbs +8 -1
  39. package/addon/components/order/card.hbs +106 -0
  40. package/addon/components/order/card.js +257 -0
  41. package/addon/components/order/form/service-rate.hbs +2 -0
  42. package/addon/components/service-rate/form.hbs +3 -2
  43. package/addon/components/telematic/details.hbs +98 -87
  44. package/addon/components/telematic/details.js +230 -1
  45. package/addon/components/telematic/form.hbs +303 -72
  46. package/addon/components/telematic/form.js +519 -3
  47. package/addon/components/telematic/hub.hbs +149 -0
  48. package/addon/components/telematic/hub.js +142 -0
  49. package/addon/components/telematic/settings.hbs +152 -0
  50. package/addon/components/telematic/settings.js +45 -0
  51. package/addon/components/telematic/tab-empty-state.hbs +29 -0
  52. package/addon/components/telematic/tab-empty-state.js +33 -0
  53. package/addon/components/vehicle/details.hbs +6 -1
  54. package/addon/components/vehicle/form.hbs +2 -1
  55. package/addon/components/widget/fuel-providers.hbs +43 -0
  56. package/addon/components/widget/fuel-providers.js +27 -0
  57. package/addon/controllers/connectivity/devices/index/details.js +27 -1
  58. package/addon/controllers/connectivity/devices/index.js +14 -0
  59. package/addon/controllers/connectivity/fuel-providers/details/sync.js +18 -0
  60. package/addon/controllers/connectivity/fuel-providers/details/transactions.js +24 -0
  61. package/addon/controllers/connectivity/fuel-providers/details.js +69 -0
  62. package/addon/controllers/connectivity/fuel-providers/edit.js +24 -0
  63. package/addon/controllers/connectivity/fuel-providers/index.js +177 -0
  64. package/addon/controllers/connectivity/fuel-providers/new.js +37 -0
  65. package/addon/controllers/connectivity/telematics/details/attachments.js +247 -0
  66. package/addon/controllers/connectivity/telematics/details/devices.js +368 -0
  67. package/addon/controllers/connectivity/telematics/details/events.js +244 -0
  68. package/addon/controllers/connectivity/telematics/details/index.js +3 -0
  69. package/addon/controllers/connectivity/telematics/details/logs.js +43 -0
  70. package/addon/controllers/connectivity/telematics/details/sensors.js +270 -0
  71. package/addon/controllers/connectivity/telematics/details.js +149 -0
  72. package/addon/controllers/connectivity/telematics/{index/edit.js → edit.js} +15 -4
  73. package/addon/controllers/connectivity/telematics/index.js +25 -5
  74. package/addon/controllers/connectivity/telematics/{index/new.js → new.js} +8 -2
  75. package/addon/controllers/management/drivers/index/details.js +78 -1
  76. package/addon/controllers/management/drivers/index.js +39 -0
  77. package/addon/controllers/management/fleets/index/details.js +23 -1
  78. package/addon/controllers/management/fleets/index.js +6 -1
  79. package/addon/controllers/management/fuel-reports/index.js +37 -1
  80. package/addon/controllers/management/fuel-transactions/index/details.js +70 -0
  81. package/addon/controllers/management/fuel-transactions/index.js +240 -0
  82. package/addon/controllers/management/vehicles/index/details.js +32 -0
  83. package/addon/controllers/management/vehicles/index.js +26 -0
  84. package/addon/controllers/operations/orders/index.js +4 -0
  85. package/addon/controllers/settings/payments/index.js +5 -0
  86. package/addon/extension.js +10 -0
  87. package/addon/routes/connectivity/fuel-providers/details/index.js +7 -0
  88. package/addon/routes/connectivity/fuel-providers/details/matching.js +7 -0
  89. package/addon/routes/connectivity/fuel-providers/details/settings.js +7 -0
  90. package/addon/routes/connectivity/fuel-providers/details/sync.js +18 -0
  91. package/addon/routes/connectivity/fuel-providers/details/transactions.js +14 -0
  92. package/addon/routes/connectivity/fuel-providers/details.js +18 -0
  93. package/addon/routes/connectivity/fuel-providers/edit.js +18 -0
  94. package/addon/routes/connectivity/fuel-providers/index.js +20 -0
  95. package/addon/routes/connectivity/fuel-providers/new.js +3 -0
  96. package/addon/routes/connectivity/fuel-providers.js +3 -0
  97. package/addon/routes/connectivity/telematics/details/attachments.js +28 -0
  98. package/addon/routes/connectivity/telematics/details/devices.js +30 -0
  99. package/addon/routes/connectivity/telematics/details/events.js +33 -0
  100. package/addon/routes/connectivity/telematics/details/index.js +3 -0
  101. package/addon/routes/connectivity/telematics/details/logs.js +17 -0
  102. package/addon/routes/connectivity/telematics/details/sensors.js +29 -0
  103. package/addon/routes/connectivity/telematics/{index/details.js → details.js} +1 -1
  104. package/addon/routes/connectivity/telematics/{index/edit.js → edit.js} +1 -1
  105. package/addon/routes/connectivity/telematics/new.js +3 -0
  106. package/addon/routes/management/drivers/index/details/activity.js +3 -0
  107. package/addon/routes/management/fuel-reports/index.js +2 -0
  108. package/addon/routes/management/fuel-transactions/index/details.js +18 -0
  109. package/addon/routes/management/fuel-transactions/index.js +21 -0
  110. package/addon/routes/management/fuel-transactions.js +3 -0
  111. package/addon/routes.js +28 -9
  112. package/addon/services/device-actions.js +64 -1
  113. package/addon/services/device-event-actions.js +12 -1
  114. package/addon/services/driver-actions.js +147 -11
  115. package/addon/services/fleet-actions.js +66 -1
  116. package/addon/services/fuel-integration-actions.js +31 -0
  117. package/addon/services/issue-actions.js +1 -1
  118. package/addon/services/telematic-actions.js +9 -3
  119. package/addon/services/vehicle-actions.js +125 -0
  120. package/addon/styles/fleetops-engine.css +310 -34
  121. package/addon/templates/analytics/reports/index.hbs +19 -1
  122. package/addon/templates/connectivity/devices/index.hbs +19 -1
  123. package/addon/templates/connectivity/events/index.hbs +16 -1
  124. package/addon/templates/connectivity/fuel-providers/details/index.hbs +38 -0
  125. package/addon/templates/connectivity/fuel-providers/details/matching.hbs +13 -0
  126. package/addon/templates/connectivity/fuel-providers/details/settings.hbs +11 -0
  127. package/addon/templates/connectivity/fuel-providers/details/sync.hbs +48 -0
  128. package/addon/templates/connectivity/fuel-providers/details/transactions.hbs +21 -0
  129. package/addon/templates/connectivity/fuel-providers/details.hbs +51 -0
  130. package/addon/templates/connectivity/fuel-providers/edit.hbs +24 -0
  131. package/addon/templates/connectivity/fuel-providers/index.hbs +12 -0
  132. package/addon/templates/connectivity/fuel-providers/new.hbs +22 -0
  133. package/addon/templates/connectivity/fuel-providers.hbs +1 -0
  134. package/addon/templates/connectivity/sensors/index.hbs +19 -1
  135. package/addon/templates/connectivity/telematics/details/attachments.hbs +163 -0
  136. package/addon/templates/connectivity/telematics/details/devices.hbs +88 -0
  137. package/addon/templates/connectivity/telematics/details/events.hbs +101 -0
  138. package/addon/templates/connectivity/telematics/{index/details → details}/index.hbs +0 -1
  139. package/addon/templates/connectivity/telematics/details/logs.hbs +69 -0
  140. package/addon/templates/connectivity/telematics/details/sensors.hbs +88 -0
  141. package/addon/templates/connectivity/telematics/details.hbs +53 -0
  142. package/addon/templates/connectivity/telematics/edit.hbs +27 -0
  143. package/addon/templates/connectivity/telematics/index.hbs +6 -8
  144. package/addon/templates/connectivity/telematics/new.hbs +24 -0
  145. package/addon/templates/maintenance/equipment/index.hbs +19 -1
  146. package/addon/templates/maintenance/maintenances/index.hbs +15 -1
  147. package/addon/templates/maintenance/parts/index.hbs +19 -1
  148. package/addon/templates/maintenance/schedules/index.hbs +19 -1
  149. package/addon/templates/maintenance/work-orders/index.hbs +19 -1
  150. package/addon/templates/management/contacts/customers.hbs +15 -1
  151. package/addon/templates/management/contacts/index.hbs +19 -1
  152. package/addon/templates/management/drivers/index/details/activity.hbs +1 -0
  153. package/addon/templates/management/drivers/index.hbs +19 -1
  154. package/addon/templates/management/fleets/index.hbs +19 -1
  155. package/addon/templates/management/fuel-reports/index.hbs +19 -1
  156. package/addon/templates/management/fuel-transactions/index/details.hbs +73 -0
  157. package/addon/templates/management/fuel-transactions/index.hbs +58 -0
  158. package/addon/templates/management/fuel-transactions.hbs +1 -0
  159. package/addon/templates/management/issues/index.hbs +19 -1
  160. package/addon/templates/management/places/index.hbs +19 -1
  161. package/addon/templates/management/vehicles/index.hbs +19 -1
  162. package/addon/templates/management/vendors/index.hbs +19 -1
  163. package/addon/templates/management/vendors/integrated.hbs +13 -1
  164. package/addon/templates/operations/orders/index.hbs +19 -1
  165. package/addon/templates/operations/service-rates/index.hbs +19 -1
  166. package/addon/templates/settings/payments/index.hbs +15 -1
  167. package/addon/utils/fleet-ops-options.js +3 -0
  168. package/app/components/cell/telematic-provider.js +1 -0
  169. package/app/components/cell/telematic-status.js +1 -0
  170. package/app/components/fuel-integration/form.js +1 -0
  171. package/app/components/fuel-integration/hub.js +1 -0
  172. package/app/components/fuel-integration/matching-priority.js +1 -0
  173. package/app/components/modals/assigned-orders.js +1 -0
  174. package/app/components/modals/attach-telematic-device.js +1 -0
  175. package/app/components/modals/fleet-assign-driver.js +1 -0
  176. package/app/components/modals/fleet-assign-vehicle.js +1 -0
  177. package/app/components/modals/telematic-connection-diagnostics.js +1 -0
  178. package/app/components/order/card.js +1 -0
  179. package/app/components/telematic/hub.js +1 -0
  180. package/app/components/telematic/settings.js +1 -0
  181. package/app/components/telematic/tab-empty-state.js +1 -0
  182. package/app/components/widget/fuel-providers.js +1 -0
  183. package/app/controllers/connectivity/fuel-providers/details/sync.js +1 -0
  184. package/app/controllers/connectivity/{telematics/index/details/devices.js → fuel-providers/details/transactions.js} +1 -1
  185. package/app/controllers/connectivity/{telematics/index → fuel-providers}/details.js +1 -1
  186. package/app/controllers/connectivity/{telematics/index → fuel-providers}/edit.js +1 -1
  187. package/app/controllers/connectivity/{telematics/index/details → fuel-providers}/index.js +1 -1
  188. package/app/controllers/connectivity/{telematics/index → fuel-providers}/new.js +1 -1
  189. package/app/controllers/connectivity/telematics/details/attachments.js +1 -0
  190. package/app/controllers/connectivity/telematics/details/devices.js +1 -0
  191. package/app/controllers/connectivity/telematics/details/events.js +1 -0
  192. package/app/controllers/connectivity/telematics/details/index.js +1 -0
  193. package/app/controllers/connectivity/telematics/details/logs.js +1 -0
  194. package/app/controllers/connectivity/telematics/details/sensors.js +1 -0
  195. package/app/controllers/connectivity/telematics/details.js +1 -0
  196. package/app/controllers/connectivity/telematics/edit.js +1 -0
  197. package/app/controllers/connectivity/telematics/new.js +1 -0
  198. package/app/controllers/management/fuel-transactions/index/details.js +1 -0
  199. package/app/controllers/management/fuel-transactions/index.js +1 -0
  200. package/app/routes/connectivity/{telematics/index → fuel-providers}/details/index.js +1 -1
  201. package/app/routes/connectivity/{telematics/index/details/events.js → fuel-providers/details/matching.js} +1 -1
  202. package/app/routes/connectivity/fuel-providers/details/settings.js +1 -0
  203. package/app/routes/connectivity/fuel-providers/details/sync.js +1 -0
  204. package/app/routes/connectivity/{telematics/index/details/devices.js → fuel-providers/details/transactions.js} +1 -1
  205. package/app/routes/connectivity/{telematics/index → fuel-providers}/details.js +1 -1
  206. package/app/routes/connectivity/{telematics/index → fuel-providers}/edit.js +1 -1
  207. package/app/routes/connectivity/fuel-providers/index.js +1 -0
  208. package/app/routes/connectivity/{telematics/index → fuel-providers}/new.js +1 -1
  209. package/app/routes/connectivity/fuel-providers.js +1 -0
  210. package/app/routes/connectivity/telematics/details/attachments.js +1 -0
  211. package/app/routes/connectivity/telematics/details/devices.js +1 -0
  212. package/app/routes/connectivity/telematics/details/events.js +1 -0
  213. package/app/routes/connectivity/telematics/details/index.js +1 -0
  214. package/app/routes/connectivity/telematics/details/logs.js +1 -0
  215. package/app/routes/connectivity/telematics/details/sensors.js +1 -0
  216. package/app/routes/connectivity/telematics/details.js +1 -0
  217. package/app/routes/connectivity/telematics/edit.js +1 -0
  218. package/app/routes/connectivity/telematics/new.js +1 -0
  219. package/app/routes/management/drivers/index/details/activity.js +1 -0
  220. package/app/routes/management/fuel-transactions/index/details.js +1 -0
  221. package/app/routes/management/fuel-transactions/index.js +1 -0
  222. package/app/routes/management/fuel-transactions.js +1 -0
  223. package/app/services/fuel-integration-actions.js +1 -0
  224. package/app/templates/connectivity/{telematics/index → fuel-providers}/details/index.js +1 -1
  225. package/app/templates/connectivity/{telematics/index/details/events.js → fuel-providers/details/matching.js} +1 -1
  226. package/app/templates/connectivity/fuel-providers/details/settings.js +1 -0
  227. package/app/templates/connectivity/fuel-providers/details/sync.js +1 -0
  228. package/app/templates/connectivity/{telematics/index/details/devices.js → fuel-providers/details/transactions.js} +1 -1
  229. package/app/templates/connectivity/{telematics/index → fuel-providers}/details.js +1 -1
  230. package/app/templates/connectivity/{telematics/index → fuel-providers}/edit.js +1 -1
  231. package/app/templates/connectivity/fuel-providers/index.js +1 -0
  232. package/app/templates/connectivity/{telematics/index → fuel-providers}/new.js +1 -1
  233. package/app/templates/connectivity/fuel-providers.js +1 -0
  234. package/app/templates/connectivity/telematics/details/attachments.js +1 -0
  235. package/app/templates/connectivity/telematics/details/devices.js +1 -0
  236. package/app/templates/connectivity/telematics/details/events.js +1 -0
  237. package/app/templates/connectivity/telematics/details/index.js +1 -0
  238. package/app/templates/connectivity/telematics/details/logs.js +1 -0
  239. package/app/templates/connectivity/telematics/details/sensors.js +1 -0
  240. package/app/templates/connectivity/telematics/details.js +1 -0
  241. package/app/templates/connectivity/telematics/edit.js +1 -0
  242. package/app/templates/connectivity/telematics/new.js +1 -0
  243. package/app/templates/management/drivers/index/details/activity.js +1 -0
  244. package/app/templates/management/fuel-transactions/index/details.js +1 -0
  245. package/app/templates/management/fuel-transactions/index.js +1 -0
  246. package/app/templates/management/fuel-transactions.js +1 -0
  247. package/assets/images/telematics/providers/afaqy.webp +0 -0
  248. package/assets/images/telematics/providers/default.webp +0 -0
  249. package/assets/images/telematics/providers/flespi.webp +0 -0
  250. package/assets/images/telematics/providers/geotab.webp +0 -0
  251. package/assets/images/telematics/providers/safee.webp +0 -0
  252. package/assets/images/telematics/providers/samsara.webp +0 -0
  253. package/composer.json +1 -1
  254. package/extension.json +1 -1
  255. package/package.json +4 -4
  256. package/server/config/fuel-providers.php +42 -0
  257. package/server/config/telematics.php +139 -130
  258. package/server/migrations/2026_06_06_000001_harden_device_events_telematics_contract.php +59 -0
  259. package/server/migrations/2026_06_08_000001_create_fuel_provider_connections_table.php +37 -0
  260. package/server/migrations/2026_06_08_000002_create_fuel_provider_transactions_table.php +53 -0
  261. package/server/migrations/2026_06_08_000003_create_fuel_provider_sync_runs_table.php +40 -0
  262. package/server/migrations/2026_06_10_000001_add_fuel_card_number_to_vehicles_table.php +25 -0
  263. package/server/migrations/2026_06_10_000002_add_vehicle_identity_columns_to_fuel_provider_transactions_table.php +39 -0
  264. package/server/src/Contracts/FuelProvider.php +30 -0
  265. package/server/src/Contracts/TelematicProviderDescriptor.php +3 -1
  266. package/server/src/Events/FuelProviderTransactionImported.php +17 -0
  267. package/server/src/Events/FuelProviderTransactionMatched.php +17 -0
  268. package/server/src/Events/FuelProviderTransactionUnmatched.php +17 -0
  269. package/server/src/Events/FuelReportCreatedFromProvider.php +18 -0
  270. package/server/src/Http/Controllers/Internal/v1/AnalyticsController.php +6 -0
  271. package/server/src/Http/Controllers/Internal/v1/DeviceController.php +76 -2
  272. package/server/src/Http/Controllers/Internal/v1/DeviceEventController.php +44 -0
  273. package/server/src/Http/Controllers/Internal/v1/DriverController.php +158 -7
  274. package/server/src/Http/Controllers/Internal/v1/FuelProviderConnectionController.php +124 -0
  275. package/server/src/Http/Controllers/Internal/v1/FuelProviderSyncRunController.php +10 -0
  276. package/server/src/Http/Controllers/Internal/v1/FuelProviderTransactionController.php +76 -0
  277. package/server/src/Http/Controllers/Internal/v1/SensorController.php +1 -1
  278. package/server/src/Http/Controllers/Internal/v1/TelematicController.php +178 -15
  279. package/server/src/Http/Controllers/Internal/v1/VehicleController.php +165 -0
  280. package/server/src/Http/Controllers/TelematicWebhookController.php +103 -19
  281. package/server/src/Http/Filter/FuelProviderConnectionFilter.php +33 -0
  282. package/server/src/Http/Filter/FuelProviderSyncRunFilter.php +28 -0
  283. package/server/src/Http/Filter/FuelProviderTransactionFilter.php +59 -0
  284. package/server/src/Http/Filter/FuelReportFilter.php +10 -0
  285. package/server/src/Http/Resources/v1/Driver.php +15 -0
  286. package/server/src/Http/Resources/v1/FuelProviderConnection.php +30 -0
  287. package/server/src/Http/Resources/v1/FuelProviderSyncRun.php +36 -0
  288. package/server/src/Http/Resources/v1/FuelProviderTransaction.php +54 -0
  289. package/server/src/Http/Resources/v1/FuelReport.php +28 -22
  290. package/server/src/Http/Resources/v1/Index/Driver.php +26 -20
  291. package/server/src/Http/Resources/v1/Index/Vehicle.php +29 -22
  292. package/server/src/Http/Resources/v1/Vehicle.php +17 -0
  293. package/server/src/Http/Resources/v1/VehicleWithoutDriver.php +2 -0
  294. package/server/src/Jobs/SyncFuelProviderTransactionsJob.php +57 -0
  295. package/server/src/Jobs/SyncTelematicDevicesJob.php +36 -6
  296. package/server/src/Jobs/TestTelematicConnectionJob.php +9 -22
  297. package/server/src/Models/Asset.php +2 -1
  298. package/server/src/Models/Contact.php +2 -1
  299. package/server/src/Models/Device.php +27 -4
  300. package/server/src/Models/DeviceEvent.php +40 -3
  301. package/server/src/Models/Driver.php +2 -1
  302. package/server/src/Models/Equipment.php +2 -1
  303. package/server/src/Models/Fleet.php +2 -1
  304. package/server/src/Models/FuelProviderConnection.php +60 -0
  305. package/server/src/Models/FuelProviderSyncRun.php +58 -0
  306. package/server/src/Models/FuelProviderTransaction.php +119 -0
  307. package/server/src/Models/FuelReport.php +16 -1
  308. package/server/src/Models/Part.php +2 -1
  309. package/server/src/Models/Sensor.php +21 -4
  310. package/server/src/Models/ServiceRate.php +39 -2
  311. package/server/src/Models/Vehicle.php +14 -2
  312. package/server/src/Models/Vendor.php +2 -1
  313. package/server/src/Providers/FleetOpsServiceProvider.php +10 -0
  314. package/server/src/Support/Analytics/FuelProviderSummary.php +42 -0
  315. package/server/src/Support/FuelProviders/FuelProviderDescriptor.php +55 -0
  316. package/server/src/Support/FuelProviders/FuelProviderRegistry.php +75 -0
  317. package/server/src/Support/FuelProviders/FuelProviderService.php +447 -0
  318. package/server/src/Support/FuelProviders/Providers/AbstractFuelProvider.php +98 -0
  319. package/server/src/Support/FuelProviders/Providers/PetroAppFuelProvider.php +167 -0
  320. package/server/src/Support/Telematics/Providers/AbstractProvider.php +27 -6
  321. package/server/src/Support/Telematics/Providers/AfaqyProvider.php +55 -26
  322. package/server/src/Support/Telematics/Providers/FlespiProvider.php +1 -0
  323. package/server/src/Support/Telematics/Providers/GeotabProvider.php +1 -0
  324. package/server/src/Support/Telematics/Providers/SafeeProvider.php +32 -22
  325. package/server/src/Support/Telematics/Providers/SamsaraProvider.php +3 -1
  326. package/server/src/Support/Telematics/TelematicService.php +340 -21
  327. package/server/src/routes.php +41 -4
  328. package/server/tests/FuelProviderRegistryTest.php +416 -0
  329. package/server/tests/ServiceRateAlgorithmWeightVariablesTest.php +44 -0
  330. package/server/tests/TelematicsHardeningTest.php +268 -0
  331. package/server/tests/VehicleDriverAssignmentTest.php +51 -0
  332. package/translations/ar-ae.yml +22 -0
  333. package/translations/bg-bg.yaml +72 -0
  334. package/translations/en-us.yaml +83 -0
  335. package/translations/es-pa.yaml +72 -0
  336. package/translations/fr-fr.yaml +72 -0
  337. package/translations/mn-mn.yaml +72 -0
  338. package/translations/pt-br.yaml +72 -0
  339. package/translations/ru-ru.yaml +72 -0
  340. package/translations/vi-vn.yaml +97 -0
  341. package/addon/controllers/connectivity/telematics/index/details/devices.js +0 -3
  342. package/addon/controllers/connectivity/telematics/index/details/events.js +0 -3
  343. package/addon/controllers/connectivity/telematics/index/details/index.js +0 -3
  344. package/addon/controllers/connectivity/telematics/index/details/sensors.js +0 -3
  345. package/addon/controllers/connectivity/telematics/index/details.js +0 -24
  346. package/addon/routes/connectivity/telematics/index/details/devices.js +0 -3
  347. package/addon/routes/connectivity/telematics/index/details/events.js +0 -3
  348. package/addon/routes/connectivity/telematics/index/details/index.js +0 -3
  349. package/addon/routes/connectivity/telematics/index/details/sensors.js +0 -3
  350. package/addon/routes/connectivity/telematics/index/new.js +0 -3
  351. package/addon/templates/connectivity/telematics/index/details/devices.hbs +0 -1
  352. package/addon/templates/connectivity/telematics/index/details/events.hbs +0 -1
  353. package/addon/templates/connectivity/telematics/index/details/sensors.hbs +0 -1
  354. package/addon/templates/connectivity/telematics/index/details.hbs +0 -14
  355. package/addon/templates/connectivity/telematics/index/edit.hbs +0 -12
  356. package/addon/templates/connectivity/telematics/index/new.hbs +0 -12
  357. package/app/controllers/connectivity/telematics/index/details/events.js +0 -1
  358. package/app/controllers/connectivity/telematics/index/details/sensors.js +0 -1
  359. package/app/routes/connectivity/telematics/index/details/sensors.js +0 -1
  360. package/app/templates/connectivity/telematics/index/details/sensors.js +0 -1
@@ -0,0 +1,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: الموقع
@@ -1612,3 +1618,19 @@ scheduler:
1612
1618
  reason: Reason
1613
1619
  reason-placeholder: e.g. Personal appointment
1614
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: Настройка на доставчик
@@ -40,6 +40,7 @@ common:
40
40
  activity: Activity
41
41
  eta: ETA
42
42
  position: Position
43
+ positions: Positions
43
44
  pos: POS
44
45
  edit-address: Edit Address
45
46
  new-address: New Address
@@ -74,6 +75,7 @@ menu:
74
75
  contacts: Contacts
75
76
  places: Places
76
77
  fuel-reports: Fuel Reports
78
+ fuel-transactions: Fuel Transactions
77
79
  issues: Issues
78
80
  maintenance: Maintenance
79
81
  schedules: Schedules
@@ -83,6 +85,7 @@ menu:
83
85
  maintenance-history: Maintenance History
84
86
  connectivity: Connectivity
85
87
  telematics: Telematics
88
+ fuel-providers: Fuel Integrations
86
89
  devices: Devices
87
90
  sensors: Sensors
88
91
  events: Events
@@ -441,10 +444,31 @@ driver:
441
444
  license-expiry: License Expiry
442
445
  no-vehicle-assigned: No Vehicle Assigned
443
446
  actions:
447
+ unassign-orders: Unassign Orders
448
+ unassign-vehicle: Unassign Vehicle
449
+ create-issue: Create Issue
444
450
  assign-order: Assign Order to Driver
445
451
  assign-vehicle: Assign Vehicle to Driver
446
452
  locate-driver: Locate Driver on Map
447
453
 
454
+ prompts:
455
+ assign-order-title: "Assign order to {driverName}"
456
+ assign-order-success: Order assigned to {driverName}.
457
+ select-order-warning: "Select an order to assign."
458
+ assign-vehicle-title: "Assign vehicle to {driverName}"
459
+ assign-vehicle-success: "Vehicle assigned to {driverName}."
460
+ select-vehicle-warning: Select a vehicle to assign.
461
+ no-assigned-orders-warning: No assigned orders found for {driverName}.
462
+ select-orders-warning: Select at least one order to unassign.
463
+ unassign-orders-title: Unassign orders from {driverName}
464
+ confirm-unassign-orders-title: Unassign {count} order(s) from {driverName}?
465
+ confirm-unassign-orders-body: "This will remove {driverName} from these orders: {orders}."
466
+ unassign-orders-success: Unassigned {driverName} from {count} order(s).
467
+ no-vehicle-assigned-warning: No vehicle is assigned to {driverName}.
468
+ unassign-vehicle-title: Unassign {vehicleName} from {driverName}?
469
+ unassign-vehicle-body: This removes {driverName} from {vehicleName}. Order assignments are not changed.
470
+ unassign-vehicle-success: Unassigned {vehicleName} from {driverName}.
471
+ issue-title: Issue reported for {driverName}
448
472
  device:
449
473
  fields:
450
474
  title: Device Details
@@ -479,6 +503,29 @@ device:
479
503
  notes: Notes
480
504
  notes-placeholder: Notes
481
505
 
506
+ actions:
507
+ attach-device: Attach Device
508
+ attach-to-vehicle: Attach to Vehicle
509
+ detach-from-vehicle: Detach from Vehicle
510
+ prompts:
511
+ attach-to-vehicle-title: Attach device to vehicle
512
+ attach-device-to-vehicle-title: "Attach {deviceName} to vehicle"
513
+ select-vehicle-warning: Select a vehicle to attach this device to.
514
+ attach-to-vehicle-success: Device attached to vehicle.
515
+ not-attached-warning: "{deviceName} is not attached to a vehicle."
516
+ detach-from-vehicle-title: "Detach {deviceName} from vehicle?"
517
+ detach-from-vehicle-body: "This detaches {deviceName} from {vehicleName} and stops vehicle telemetry updates until it is attached again."
518
+ detach-from-vehicle-success: Device detached from vehicle.
519
+ select-device-to-attach-title: "Select device to attach to {resourceName}"
520
+ confirm-attach-device: "Confirm & Attach Device"
521
+ attach-device-success: Device attached successfully.
522
+ detach-from-resource-title: "Detach {deviceName} from {resourceName}?"
523
+ detach-from-resource-body: "This detaches {deviceName} from {resourceName} and stops telemetry updates and events for this {resourceType}."
524
+ detach-from-resource-success: "Detached {deviceName} from {resourceName}."
525
+ detach-telematic-device-title: "Detach {deviceName} from vehicle?"
526
+ detach-telematic-device-body: "{deviceName} will remain synced from the provider but will no longer be mapped to a vehicle."
527
+ no-devices-attached-title: No Devices Attached
528
+ no-devices-attached-body: "Click Attach Device above to start receiving telematic data for this {resourceType}."
482
529
  entity:
483
530
  fields:
484
531
  declare: Declare
@@ -530,8 +577,16 @@ fleet:
530
577
  add-vehicle: Add vehicle to fleet
531
578
  loading-message: Loading fleet vehicle...
532
579
  actions:
580
+ assign-vehicle: Assign Vehicle to Fleet
533
581
  assign-driver: Assign Driver to Fleet
534
582
 
583
+ prompts:
584
+ assign-driver-title: Assign driver to {fleetName}
585
+ assign-vehicle-title: Assign vehicle to {fleetName}
586
+ select-driver-warning: Select a driver to assign.
587
+ select-vehicle-warning: Select a vehicle to assign.
588
+ assign-driver-success: Driver assigned to {fleetName}.
589
+ assign-vehicle-success: Vehicle assigned to {fleetName}.
535
590
  fuel-report:
536
591
  fields:
537
592
  details: Fuel Report Details
@@ -562,6 +617,20 @@ issue:
562
617
  type: Issue Type
563
618
 
564
619
  order:
620
+ card:
621
+ linked-order: Linked Order
622
+ unknown-order: Unknown order
623
+ no-type: No type
624
+ pickup: Pickup
625
+ dropoff: Dropoff
626
+ return: Return
627
+ waypoints: Waypoints
628
+ additional-stop: additional stop
629
+ additional-stops: additional stops
630
+ no-pickup-address: No pickup address
631
+ no-dropoff-address: No dropoff address
632
+ no-route-details: No route details available.
633
+ no-order-linked: No order is linked to this issue.
565
634
  fields:
566
635
  ad-hoc: Ad-Hoc
567
636
  ad-hoc-help-text: Toggling Ad-Hoc will enable the order to intelligently ping drivers within the order pickup vicinity about the order allowing the first available driver to accept the order. This is an alternative to manually assigning the driver for real-time orders.
@@ -949,11 +1018,25 @@ vehicle:
949
1018
  vin-number: VIN Number
950
1019
  year: Year
951
1020
  actions:
1021
+ attach-device: Attach Device
1022
+ unassign-orders: Unassign Orders
1023
+ create-issue: Create Issue
952
1024
  locate-vehicle: Locate Vehicle on Map
953
1025
  schedule-maintenance: Schedule Maintenance
954
1026
  create-work-order: Create Work Order
955
1027
  log-maintenance: Log Maintenance
956
1028
 
1029
+ prompts:
1030
+ attach-device-title: Attach device to {vehicleName}
1031
+ select-device-warning: Select a device to attach.
1032
+ attach-device-success: Device attached to {vehicleName}.
1033
+ no-assigned-orders-warning: No assigned orders found for {vehicleName}.
1034
+ select-orders-warning: Select at least one order to unassign.
1035
+ unassign-orders-title: Unassign orders from {vehicleName}
1036
+ confirm-unassign-orders-title: Unassign {count} order(s) from {vehicleName}?
1037
+ confirm-unassign-orders-body: "This will remove {vehicleName} from these orders: {orders}."
1038
+ unassign-orders-success: Unassigned {vehicleName} from {count} order(s).
1039
+ issue-title: Issue reported for {vehicleName}
957
1040
  vendor:
958
1041
  fields:
959
1042
  setup-vendor: Setup Vendor