@fleetbase/fleetops-engine 0.6.38 → 0.6.40

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 (432) hide show
  1. package/addon/components/activity/form.hbs +2 -12
  2. package/addon/components/activity/logic-builder.hbs +1 -1
  3. package/addon/components/custom-entity/form.hbs +4 -20
  4. package/addon/components/device/form.hbs +3 -15
  5. package/addon/components/device/panel-header.hbs +13 -2
  6. package/addon/components/driver/details.hbs +33 -2
  7. package/addon/components/driver/form.hbs +42 -0
  8. package/addon/components/driver/panel-header.hbs +8 -1
  9. package/addon/components/driver/schedule.hbs +115 -76
  10. package/addon/components/driver/schedule.js +349 -157
  11. package/addon/components/driver-onboard-settings.hbs +2 -8
  12. package/addon/components/entity-field-editing-settings.hbs +2 -5
  13. package/addon/components/equipment/card.hbs +49 -0
  14. package/addon/components/equipment/card.js +6 -0
  15. package/addon/components/equipment/details.hbs +83 -44
  16. package/addon/components/equipment/form.hbs +111 -41
  17. package/addon/components/equipment/form.js +78 -10
  18. package/addon/components/equipment/panel-header.hbs +36 -0
  19. package/addon/components/equipment/panel-header.js +2 -0
  20. package/addon/components/fleet/driver-listing.hbs +3 -1
  21. package/addon/components/fleet/vehicle-listing.hbs +4 -7
  22. package/addon/components/fleet-panel/vehicle-listing.hbs +1 -6
  23. package/addon/components/fuel-report/form.hbs +1 -5
  24. package/addon/components/layout/fleet-ops-sidebar.hbs +43 -38
  25. package/addon/components/layout/fleet-ops-sidebar.js +103 -24
  26. package/addon/components/maintenance/cost-panel.hbs +176 -0
  27. package/addon/components/maintenance/cost-panel.js +241 -0
  28. package/addon/components/maintenance/details.hbs +123 -60
  29. package/addon/components/maintenance/form.hbs +138 -78
  30. package/addon/components/maintenance/form.js +131 -6
  31. package/addon/components/maintenance/panel-header.hbs +31 -0
  32. package/addon/components/maintenance/panel-header.js +2 -0
  33. package/addon/components/maintenance-schedule/details.hbs +260 -0
  34. package/addon/components/maintenance-schedule/details.js +158 -0
  35. package/addon/components/maintenance-schedule/form.hbs +287 -0
  36. package/addon/components/maintenance-schedule/form.js +199 -0
  37. package/addon/components/map/container.hbs +1 -1
  38. package/addon/components/map/drawer/device-event-listing.hbs +1 -1
  39. package/addon/components/map/drawer/driver-listing.hbs +1 -6
  40. package/addon/components/map/drawer/place-listing.hbs +1 -6
  41. package/addon/components/map/drawer/vehicle-listing.hbs +1 -6
  42. package/addon/components/map/drawer.hbs +8 -1
  43. package/addon/components/map/leaflet-live-map.hbs +2 -1
  44. package/addon/components/map/toolbar/visibility-control-panel.hbs +1 -1
  45. package/addon/components/map/toolbar.hbs +4 -29
  46. package/addon/components/modals/add-driver-shift.hbs +155 -0
  47. package/addon/components/modals/add-driver-shift.js +210 -0
  48. package/addon/components/modals/bulk-assign-orders.hbs +67 -0
  49. package/addon/components/modals/driver-shift.hbs +43 -0
  50. package/addon/components/modals/driver-shift.js +56 -0
  51. package/addon/components/modals/entity-form.hbs +5 -28
  52. package/addon/components/modals/orchestrator-import.hbs +351 -0
  53. package/addon/components/modals/orchestrator-import.js +807 -0
  54. package/addon/components/modals/order-config-new-status.hbs +1 -5
  55. package/addon/components/modals/scheduling-conflict.hbs +47 -0
  56. package/addon/components/modals/scheduling-conflict.js +53 -0
  57. package/addon/components/modals/send-work-order.hbs +91 -0
  58. package/addon/components/modals/send-work-order.js +3 -0
  59. package/addon/components/modals/service-area-form.hbs +1 -6
  60. package/addon/components/modals/set-driver-availability.hbs +50 -0
  61. package/addon/components/modals/set-driver-availability.js +57 -0
  62. package/addon/components/modals/update-order-activity.hbs +13 -9
  63. package/addon/components/modals/user-form.hbs +1 -5
  64. package/addon/components/modals/vehicle-form.hbs +17 -102
  65. package/addon/components/modals/vendor-form.hbs +15 -82
  66. package/addon/components/orchestrator/card-fields-settings.hbs +76 -0
  67. package/addon/components/orchestrator/card-fields-settings.js +134 -0
  68. package/addon/components/orchestrator/order-pool.hbs +264 -0
  69. package/addon/components/orchestrator/order-pool.js +394 -0
  70. package/addon/components/orchestrator/phase-builder.hbs +162 -0
  71. package/addon/components/orchestrator/phase-builder.js +162 -0
  72. package/addon/components/orchestrator/plan-viewer.hbs +278 -0
  73. package/addon/components/orchestrator/plan-viewer.js +342 -0
  74. package/addon/components/orchestrator/resource-panel.hbs +301 -0
  75. package/addon/components/orchestrator/resource-panel.js +106 -0
  76. package/addon/components/orchestrator-workbench.hbs +318 -0
  77. package/addon/components/orchestrator-workbench.js +1088 -0
  78. package/addon/components/order/details/custom-fields.hbs +10 -1
  79. package/addon/components/order/details/detail.hbs +37 -2
  80. package/addon/components/order/details/detail.js +0 -1
  81. package/addon/components/order/details/integrated-vendor-details.hbs +4 -4
  82. package/addon/components/order/details/notes.hbs +1 -7
  83. package/addon/components/order/details/route.hbs +1 -5
  84. package/addon/components/order/form/details.hbs +44 -10
  85. package/addon/components/order/form/details.js +57 -0
  86. package/addon/components/order/form/notes.hbs +1 -7
  87. package/addon/components/order/form/payload.hbs +1 -7
  88. package/addon/components/order/form/route.hbs +3 -15
  89. package/addon/components/order/header.hbs +1 -7
  90. package/addon/components/order/route-editor.hbs +4 -25
  91. package/addon/components/order/schedule-card.hbs +102 -95
  92. package/addon/components/order/schedule-card.js +8 -3
  93. package/addon/components/order-config-manager/details.hbs +2 -10
  94. package/addon/components/order-config-manager/entities.hbs +1 -7
  95. package/addon/components/order-config-manager.hbs +1 -6
  96. package/addon/components/part/card.hbs +49 -0
  97. package/addon/components/part/card.js +6 -0
  98. package/addon/components/part/details.hbs +102 -56
  99. package/addon/components/part/form.hbs +131 -56
  100. package/addon/components/part/form.js +78 -11
  101. package/addon/components/part/panel-header.hbs +36 -0
  102. package/addon/components/part/panel-header.js +2 -0
  103. package/addon/components/place/form.hbs +1 -7
  104. package/addon/components/sensor/details.hbs +1 -1
  105. package/addon/components/sensor/form.hbs +5 -3
  106. package/addon/components/sensor/panel-header.hbs +8 -1
  107. package/addon/components/service-area/form.hbs +1 -6
  108. package/addon/components/service-rate/form.hbs +12 -60
  109. package/addon/components/telematic/form.hbs +6 -2
  110. package/addon/components/vehicle/details/maintenance-history.hbs +42 -0
  111. package/addon/components/vehicle/details/maintenance-history.js +32 -0
  112. package/addon/components/vehicle/details/schedules.hbs +40 -0
  113. package/addon/components/vehicle/details/schedules.js +32 -0
  114. package/addon/components/vehicle/details/work-orders.hbs +42 -0
  115. package/addon/components/vehicle/details/work-orders.js +32 -0
  116. package/addon/components/vehicle/details.hbs +52 -0
  117. package/addon/components/vehicle/form.hbs +51 -0
  118. package/addon/components/vehicle/panel-header.hbs +19 -49
  119. package/addon/components/warranty/details.hbs +3 -2
  120. package/addon/components/warranty/form.hbs +3 -17
  121. package/addon/components/work-order/details.hbs +135 -40
  122. package/addon/components/work-order/form.hbs +178 -45
  123. package/addon/components/work-order/form.js +197 -4
  124. package/addon/components/work-order/panel-header.hbs +31 -0
  125. package/addon/components/work-order/panel-header.js +2 -0
  126. package/addon/controllers/connectivity/devices/index/details.js +1 -1
  127. package/addon/controllers/maintenance/equipment/index/details/index.js +0 -1
  128. package/addon/controllers/maintenance/equipment/index/details.js +36 -1
  129. package/addon/controllers/maintenance/equipment/index/edit.js +56 -1
  130. package/addon/controllers/maintenance/equipment/index/new.js +32 -1
  131. package/addon/controllers/maintenance/equipment/index.js +127 -113
  132. package/addon/controllers/maintenance/maintenances/index/details/index.js +3 -0
  133. package/addon/controllers/maintenance/maintenances/index/details.js +54 -0
  134. package/addon/controllers/maintenance/maintenances/index/edit.js +68 -0
  135. package/addon/controllers/maintenance/maintenances/index/new.js +34 -0
  136. package/addon/controllers/maintenance/maintenances/index.js +191 -0
  137. package/addon/controllers/maintenance/parts/index/details/index.js +0 -1
  138. package/addon/controllers/maintenance/parts/index/details.js +36 -1
  139. package/addon/controllers/maintenance/parts/index/edit.js +56 -1
  140. package/addon/controllers/maintenance/parts/index/new.js +32 -1
  141. package/addon/controllers/maintenance/parts/index.js +135 -113
  142. package/addon/controllers/maintenance/schedules/index/details.js +115 -0
  143. package/addon/controllers/maintenance/schedules/index/edit.js +41 -0
  144. package/addon/controllers/maintenance/schedules/index/new.js +33 -0
  145. package/addon/controllers/maintenance/schedules/index.js +280 -0
  146. package/addon/controllers/maintenance/work-orders/index/details.js +41 -1
  147. package/addon/controllers/maintenance/work-orders/index/edit.js +67 -1
  148. package/addon/controllers/maintenance/work-orders/index/new.js +43 -1
  149. package/addon/controllers/maintenance/work-orders/index.js +105 -113
  150. package/addon/controllers/management/drivers/index/details.js +6 -1
  151. package/addon/controllers/management/vehicles/index/details.js +65 -0
  152. package/addon/controllers/management/vehicles/index.js +18 -0
  153. package/addon/controllers/operations/orchestrator.js +10 -0
  154. package/addon/controllers/operations/orders/index.js +6 -0
  155. package/addon/controllers/operations/scheduler/fleet-schedule.js +341 -0
  156. package/addon/controllers/operations/scheduler/index.js +799 -275
  157. package/addon/controllers/operations/scheduler.js +21 -0
  158. package/addon/controllers/settings/orchestrator.js +70 -0
  159. package/addon/controllers/settings/scheduling.js +155 -0
  160. package/addon/extension.js +19 -0
  161. package/addon/instance-initializers/register-vroom-allocation.js +27 -0
  162. package/addon/models/maintenance-schedule.js +61 -0
  163. package/addon/routes/maintenance/equipment/index/details.js +27 -1
  164. package/addon/routes/maintenance/equipment/index/edit.js +27 -1
  165. package/addon/routes/maintenance/maintenances/index/details/index.js +3 -0
  166. package/addon/routes/maintenance/maintenances/index/details.js +29 -0
  167. package/addon/routes/maintenance/maintenances/index/edit.js +29 -0
  168. package/addon/routes/maintenance/maintenances/index/new.js +3 -0
  169. package/addon/routes/maintenance/maintenances/index.js +23 -0
  170. package/addon/routes/maintenance/maintenances.js +3 -0
  171. package/addon/routes/maintenance/parts/index/details.js +27 -1
  172. package/addon/routes/maintenance/parts/index/edit.js +27 -1
  173. package/addon/routes/maintenance/schedules/index/details/index.js +2 -0
  174. package/addon/routes/maintenance/schedules/index/details/work-orders.js +11 -0
  175. package/addon/routes/maintenance/schedules/index/details.js +25 -0
  176. package/addon/routes/maintenance/schedules/index/edit.js +25 -0
  177. package/addon/routes/maintenance/schedules/index/new.js +2 -0
  178. package/addon/routes/maintenance/schedules/index.js +21 -0
  179. package/addon/routes/maintenance/schedules.js +2 -0
  180. package/addon/routes/maintenance/work-orders/index/details.js +27 -1
  181. package/addon/routes/maintenance/work-orders/index/edit.js +27 -1
  182. package/addon/routes/management/vehicles/index/details/maintenance-history.js +3 -0
  183. package/addon/routes/management/vehicles/index/details/schedules.js +3 -0
  184. package/addon/routes/management/vehicles/index/details/work-orders.js +3 -0
  185. package/addon/routes/operations/orchestrator.js +23 -0
  186. package/addon/routes/operations/scheduler/fleet-schedule.js +28 -0
  187. package/addon/routes/operations/scheduler/index.js +48 -26
  188. package/addon/routes/operations/scheduler.js +14 -1
  189. package/addon/routes/settings/orchestrator.js +27 -0
  190. package/addon/routes/settings/scheduling.js +3 -0
  191. package/addon/routes.js +31 -1
  192. package/addon/services/driver-actions.js +40 -7
  193. package/addon/services/driver-scheduling.js +4 -1
  194. package/addon/services/equipment-actions.js +15 -5
  195. package/addon/services/leaflet-map-manager.js +14 -6
  196. package/addon/services/maintenance-actions.js +17 -14
  197. package/addon/services/maintenance-schedule-actions.js +118 -0
  198. package/addon/services/orchestration-engine-interface.js +49 -0
  199. package/addon/services/orchestration-engine.js +74 -0
  200. package/addon/services/order-actions.js +15 -0
  201. package/addon/services/order-allocation.js +116 -0
  202. package/addon/services/part-actions.js +12 -2
  203. package/addon/services/scheduling.js +316 -0
  204. package/addon/services/vehicle-actions.js +70 -7
  205. package/addon/services/vroom-allocation-engine.js +45 -0
  206. package/addon/services/work-order-actions.js +79 -0
  207. package/addon/styles/fleetops-engine.css +1658 -0
  208. package/addon/templates/analytics/reports/index/edit.hbs +1 -1
  209. package/addon/templates/analytics/reports/index/new.hbs +1 -1
  210. package/addon/templates/application.hbs +6 -1
  211. package/addon/templates/connectivity/devices/index/details/events.hbs +0 -1
  212. package/addon/templates/connectivity/devices.hbs +0 -1
  213. package/addon/templates/connectivity/events/index/details.hbs +0 -1
  214. package/addon/templates/connectivity/events.hbs +0 -1
  215. package/addon/templates/connectivity/sensors.hbs +0 -1
  216. package/addon/templates/connectivity/telematics/index/details/devices.hbs +0 -1
  217. package/addon/templates/connectivity/telematics/index/details/events.hbs +0 -1
  218. package/addon/templates/connectivity/telematics/index/details/sensors.hbs +0 -1
  219. package/addon/templates/connectivity/telematics.hbs +0 -1
  220. package/addon/templates/connectivity/tracking.hbs +0 -1
  221. package/addon/templates/connectivity.hbs +0 -1
  222. package/addon/templates/maintenance/equipment/index/details/index.hbs +1 -2
  223. package/addon/templates/maintenance/equipment/index/details.hbs +15 -2
  224. package/addon/templates/maintenance/equipment/index/edit.hbs +12 -2
  225. package/addon/templates/maintenance/equipment/index/new.hbs +1 -2
  226. package/addon/templates/maintenance/equipment/index.hbs +48 -13
  227. package/addon/templates/maintenance/equipment.hbs +0 -1
  228. package/addon/templates/maintenance/maintenances/index/details/index.hbs +1 -0
  229. package/addon/templates/maintenance/maintenances/index/details.hbs +15 -0
  230. package/addon/templates/maintenance/maintenances/index/edit.hbs +12 -0
  231. package/addon/templates/maintenance/maintenances/index/new.hbs +11 -0
  232. package/addon/templates/maintenance/maintenances/index.hbs +14 -0
  233. package/addon/templates/maintenance/maintenances.hbs +1 -0
  234. package/addon/templates/maintenance/parts/index/details/index.hbs +1 -2
  235. package/addon/templates/maintenance/parts/index/details.hbs +15 -2
  236. package/addon/templates/maintenance/parts/index/edit.hbs +12 -2
  237. package/addon/templates/maintenance/parts/index/new.hbs +1 -2
  238. package/addon/templates/maintenance/parts/index.hbs +48 -13
  239. package/addon/templates/maintenance/parts.hbs +0 -1
  240. package/addon/templates/maintenance/schedules/index/details/index.hbs +1 -0
  241. package/addon/templates/maintenance/schedules/index/details/work-orders.hbs +39 -0
  242. package/addon/templates/maintenance/schedules/index/details.hbs +14 -0
  243. package/addon/templates/maintenance/schedules/index/edit.hbs +12 -0
  244. package/addon/templates/maintenance/schedules/index/new.hbs +11 -0
  245. package/addon/templates/maintenance/schedules/index.hbs +40 -0
  246. package/addon/templates/maintenance/schedules.hbs +1 -0
  247. package/addon/templates/maintenance/work-orders/index/details.hbs +2 -1
  248. package/addon/templates/maintenance/work-orders/index/edit.hbs +2 -4
  249. package/addon/templates/maintenance/work-orders/index/new.hbs +1 -2
  250. package/addon/templates/maintenance/work-orders.hbs +0 -1
  251. package/addon/templates/management/contacts/customers/edit.hbs +1 -2
  252. package/addon/templates/management/contacts/customers/new.hbs +1 -2
  253. package/addon/templates/management/contacts/customers.hbs +1 -1
  254. package/addon/templates/management/contacts/index/edit.hbs +1 -2
  255. package/addon/templates/management/contacts/index/new.hbs +1 -2
  256. package/addon/templates/management/drivers/index/details/orders.hbs +0 -1
  257. package/addon/templates/management/drivers/index/edit.hbs +1 -2
  258. package/addon/templates/management/drivers/index/new.hbs +1 -2
  259. package/addon/templates/management/fleets/index/edit.hbs +1 -2
  260. package/addon/templates/management/fleets/index/new.hbs +1 -2
  261. package/addon/templates/management/fleets/index.hbs +1 -2
  262. package/addon/templates/management/fuel-reports/index/edit.hbs +1 -2
  263. package/addon/templates/management/fuel-reports/index/new.hbs +1 -2
  264. package/addon/templates/management/fuel-reports/index.hbs +1 -2
  265. package/addon/templates/management/issues/index/edit.hbs +1 -2
  266. package/addon/templates/management/issues/index/new.hbs +1 -2
  267. package/addon/templates/management/issues/index.hbs +1 -2
  268. package/addon/templates/management/places/index/details/activity.hbs +0 -1
  269. package/addon/templates/management/places/index/details/comments.hbs +0 -1
  270. package/addon/templates/management/places/index/details/documents.hbs +0 -1
  271. package/addon/templates/management/places/index/details/map.hbs +0 -1
  272. package/addon/templates/management/places/index/details/operations.hbs +0 -1
  273. package/addon/templates/management/places/index/details/performance.hbs +0 -1
  274. package/addon/templates/management/places/index/details/rules.hbs +0 -1
  275. package/addon/templates/management/vehicles/index/details/equipment.hbs +0 -1
  276. package/addon/templates/management/vehicles/index/details/maintenance-history.hbs +2 -0
  277. package/addon/templates/management/vehicles/index/details/schedules.hbs +2 -0
  278. package/addon/templates/management/vehicles/index/details/work-orders.hbs +2 -0
  279. package/addon/templates/management/vehicles/index/details.hbs +1 -1
  280. package/addon/templates/management/vehicles/index/edit.hbs +1 -2
  281. package/addon/templates/management/vehicles/index/new.hbs +1 -2
  282. package/addon/templates/management/vendors/index/edit.hbs +1 -2
  283. package/addon/templates/management/vendors/index/new.hbs +1 -2
  284. package/addon/templates/management/vendors/index.hbs +1 -2
  285. package/addon/templates/management/vendors/integrated.hbs +1 -2
  286. package/addon/templates/operations/orchestrator.hbs +1 -0
  287. package/addon/templates/operations/orders/index.hbs +6 -1
  288. package/addon/templates/operations/scheduler/fleet-schedule.hbs +41 -0
  289. package/addon/templates/operations/scheduler/index.hbs +147 -88
  290. package/addon/templates/operations/scheduler.hbs +7 -1
  291. package/addon/templates/settings/avatars.hbs +1 -1
  292. package/addon/templates/settings/orchestrator.hbs +65 -0
  293. package/addon/templates/settings/payments/index.hbs +1 -5
  294. package/addon/templates/settings/scheduling.hbs +82 -0
  295. package/addon/utils/create-full-calendar-event-from-order.js +52 -14
  296. package/addon/utils/create-full-calendar-event-from-schedule-item.js +50 -0
  297. package/addon/utils/fleet-ops-options.js +254 -0
  298. package/addon/utils/route-colors.js +99 -0
  299. package/addon/utils/to-calendar-date.js +70 -0
  300. package/app/components/driver/schedule.js +1 -0
  301. package/app/components/maintenance/cost-panel.js +1 -0
  302. package/app/components/maintenance/panel-header.js +1 -0
  303. package/app/components/maintenance-schedule/details.js +1 -0
  304. package/app/components/maintenance-schedule/form.js +1 -0
  305. package/app/components/modals/add-driver-shift.js +1 -0
  306. package/app/components/modals/bulk-assign-orders.js +1 -0
  307. package/app/components/modals/driver-shift.js +1 -0
  308. package/app/components/modals/orchestrator-import.js +1 -0
  309. package/app/components/modals/scheduling-conflict.js +1 -0
  310. package/app/components/modals/send-work-order.js +1 -0
  311. package/app/components/modals/set-driver-availability.js +1 -0
  312. package/app/components/orchestrator/card-fields-settings.js +1 -0
  313. package/app/components/orchestrator/order-pool.js +1 -0
  314. package/app/components/orchestrator/phase-builder.js +1 -0
  315. package/app/components/orchestrator/plan-viewer.js +1 -0
  316. package/app/components/orchestrator/resource-panel.js +1 -0
  317. package/app/components/orchestrator-workbench.js +1 -0
  318. package/app/components/vehicle/details/maintenance-history.js +1 -0
  319. package/app/components/vehicle/details/schedules.js +1 -0
  320. package/app/components/vehicle/details/work-orders.js +1 -0
  321. package/app/controllers/operations/orchestrator.js +1 -0
  322. package/app/controllers/settings/orchestrator.js +1 -0
  323. package/app/controllers/settings/scheduling.js +1 -0
  324. package/app/routes/operations/orchestrator.js +1 -0
  325. package/app/routes/settings/orchestrator.js +1 -0
  326. package/app/routes/settings/scheduling.js +1 -0
  327. package/app/services/maintenance-schedule-actions.js +1 -0
  328. package/app/services/orchestration-engine-interface.js +1 -0
  329. package/app/services/orchestration-engine.js +1 -0
  330. package/app/services/order-allocation.js +1 -0
  331. package/app/services/scheduling.js +1 -0
  332. package/app/services/vroom-allocation-engine.js +1 -0
  333. package/app/templates/settings/scheduling.js +1 -0
  334. package/app/utils/create-full-calendar-event-from-schedule-item.js +1 -0
  335. package/app/utils/route-colors.js +1 -0
  336. package/composer.json +4 -2
  337. package/extension.json +1 -1
  338. package/package.json +6 -5
  339. package/server/config/fleetops.php +20 -1
  340. package/server/migrations/2025_08_28_054927_create_parts_table.php +2 -2
  341. package/server/migrations/2025_08_28_054932_add_public_id_to_maintenance_tables.php +45 -0
  342. package/server/migrations/2025_09_01_000001_create_maintenance_schedules_table.php +88 -0
  343. package/server/migrations/2026_04_01_000001_fix_monetary_columns_in_parts_table.php +48 -0
  344. package/server/migrations/2026_04_01_000003_add_photo_uuid_to_equipment_and_parts_tables.php +61 -0
  345. package/server/migrations/2026_04_01_000004_add_public_id_to_equipments_table.php +38 -0
  346. package/server/migrations/2026_04_01_000005_add_missing_columns_to_parts_table.php +67 -0
  347. package/server/migrations/2026_04_04_000001_add_reminder_offsets_to_maintenance_schedules.php +44 -0
  348. package/server/migrations/2026_04_08_000001_add_orchestrator_columns_to_vehicles_table.php +53 -0
  349. package/server/migrations/2026_04_08_000002_add_orchestrator_columns_to_drivers_table.php +41 -0
  350. package/server/migrations/2026_04_08_000003_add_orchestrator_columns_to_orders_table.php +38 -0
  351. package/server/migrations/2026_04_08_000004_add_orchestrator_columns_to_payloads_table.php +38 -0
  352. package/server/migrations/2026_04_08_000005_add_orchestrator_columns_to_waypoints_table.php +38 -0
  353. package/server/migrations/2026_04_09_000001_create_manifests_table.php +48 -0
  354. package/server/migrations/2026_04_09_000002_create_manifest_stops_table.php +48 -0
  355. package/server/migrations/2026_04_09_000003_add_manifest_uuid_to_orders_table.php +28 -0
  356. package/server/migrations/2026_04_13_000001_add_pod_notes_columns_to_waypoints_table.php +39 -0
  357. package/server/migrations/2026_04_14_000001_drop_redundant_capacity_columns_from_payloads_table.php +42 -0
  358. package/server/migrations/2026_04_14_000002_rename_capacity_columns_on_vehicles_table.php +48 -0
  359. package/server/resources/views/mail/maintenance-schedule-reminder.blade.php +59 -0
  360. package/server/resources/views/mail/work-order-dispatched.blade.php +67 -0
  361. package/server/src/Auth/Schemas/FleetOps.php +44 -0
  362. package/server/src/Console/Commands/ProcessMaintenanceTriggers.php +150 -0
  363. package/server/src/Console/Commands/SendMaintenanceReminders.php +128 -0
  364. package/server/src/Http/Controllers/Api/v1/OrderController.php +15 -2
  365. package/server/src/Http/Controllers/Api/v1/VehicleController.php +18 -2
  366. package/server/src/Http/Controllers/Internal/v1/DriverController.php +1 -0
  367. package/server/src/Http/Controllers/Internal/v1/EquipmentController.php +27 -0
  368. package/server/src/Http/Controllers/Internal/v1/LiveController.php +9 -2
  369. package/server/src/Http/Controllers/Internal/v1/MaintenanceController.php +165 -0
  370. package/server/src/Http/Controllers/Internal/v1/MaintenanceScheduleController.php +304 -0
  371. package/server/src/Http/Controllers/Internal/v1/ManifestController.php +138 -0
  372. package/server/src/Http/Controllers/Internal/v1/OrchestrationController.php +975 -0
  373. package/server/src/Http/Controllers/Internal/v1/OrderController.php +42 -0
  374. package/server/src/Http/Controllers/Internal/v1/PartController.php +27 -0
  375. package/server/src/Http/Controllers/Internal/v1/SettingController.php +118 -0
  376. package/server/src/Http/Controllers/Internal/v1/Traits/DriverSchedulingTrait.php +214 -0
  377. package/server/src/Http/Controllers/Internal/v1/WorkOrderController.php +68 -0
  378. package/server/src/Http/Resources/v1/Driver.php +1 -0
  379. package/server/src/Http/Resources/v1/Maintenance.php +138 -0
  380. package/server/src/Http/Resources/v1/MaintenanceSchedule.php +137 -0
  381. package/server/src/Http/Resources/v1/Orchestrator/Order.php +116 -0
  382. package/server/src/Http/Resources/v1/Order.php +7 -4
  383. package/server/src/Http/Resources/v1/Waypoint.php +7 -0
  384. package/server/src/Http/Resources/v1/WorkOrder.php +136 -0
  385. package/server/src/Imports/EquipmentImport.php +32 -0
  386. package/server/src/Imports/MaintenanceImport.php +32 -0
  387. package/server/src/Imports/MaintenanceScheduleImport.php +32 -0
  388. package/server/src/Imports/PartImport.php +32 -0
  389. package/server/src/Imports/WorkOrderImport.php +32 -0
  390. package/server/src/Jobs/ProcessAllocationJob.php +119 -0
  391. package/server/src/Listeners/HandleDeliveryCompletion.php +47 -0
  392. package/server/src/Listeners/NotifyDriverOnShiftChange.php +63 -0
  393. package/server/src/Mail/MaintenanceScheduleReminder.php +68 -0
  394. package/server/src/Mail/WorkOrderDispatched.php +58 -0
  395. package/server/src/Models/Asset.php +2 -2
  396. package/server/src/Models/Device.php +1 -1
  397. package/server/src/Models/Driver.php +82 -4
  398. package/server/src/Models/Equipment.php +62 -2
  399. package/server/src/Models/Maintenance.php +127 -9
  400. package/server/src/Models/MaintenanceSchedule.php +353 -0
  401. package/server/src/Models/Manifest.php +214 -0
  402. package/server/src/Models/ManifestStop.php +162 -0
  403. package/server/src/Models/Order.php +70 -0
  404. package/server/src/Models/OrderConfig.php +5 -2
  405. package/server/src/Models/Part.php +69 -3
  406. package/server/src/Models/Place.php +1 -1
  407. package/server/src/Models/Sensor.php +1 -1
  408. package/server/src/Models/ServiceQuote.php +1 -1
  409. package/server/src/Models/Vehicle.php +18 -1
  410. package/server/src/Models/Warranty.php +1 -1
  411. package/server/src/Models/Waypoint.php +7 -1
  412. package/server/src/Models/WorkOrder.php +122 -12
  413. package/server/src/Notifications/DriverShiftChanged.php +110 -0
  414. package/server/src/Observers/WorkOrderObserver.php +107 -0
  415. package/server/src/Orchestration/Contracts/OrchestrationEngineInterface.php +63 -0
  416. package/server/src/Orchestration/Engines/DriverAssignmentEngine.php +265 -0
  417. package/server/src/Orchestration/Engines/GreedyOrchestrationEngine.php +155 -0
  418. package/server/src/Orchestration/Engines/RouteSequencingEngine.php +272 -0
  419. package/server/src/Orchestration/Engines/VroomOrchestrationEngine.php +192 -0
  420. package/server/src/Orchestration/OrchestrationEngineRegistry.php +83 -0
  421. package/server/src/Orchestration/Support/OrchestrationPayloadBuilder.php +380 -0
  422. package/server/src/Providers/EventServiceProvider.php +7 -1
  423. package/server/src/Providers/FleetOpsServiceProvider.php +42 -15
  424. package/server/src/routes.php +65 -4
  425. package/translations/ar-ae.yml +44 -12
  426. package/translations/bg-bg.yaml +51 -10
  427. package/translations/en-us.yaml +444 -1
  428. package/translations/fr-fr.yaml +51 -10
  429. package/translations/mn-mn.yaml +51 -10
  430. package/translations/pt-br.yaml +51 -10
  431. package/translations/ru-ru.yaml +51 -10
  432. package/translations/vi-vn.yaml +48 -12
@@ -0,0 +1,21 @@
1
+ import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
3
+
4
+ export default class MaintenanceSchedulesIndexRoute extends Route {
5
+ @service store;
6
+
7
+ queryParams = {
8
+ page: { refreshModel: true },
9
+ limit: { refreshModel: true },
10
+ sort: { refreshModel: true },
11
+ query: { refreshModel: true },
12
+ status: { refreshModel: true },
13
+ public_id: { refreshModel: true },
14
+ created_at: { refreshModel: true },
15
+ updated_at: { refreshModel: true },
16
+ };
17
+
18
+ model(params) {
19
+ return this.store.query('maintenance-schedule', { ...params });
20
+ }
21
+ }
@@ -0,0 +1,2 @@
1
+ import Route from '@ember/routing/route';
2
+ export default class MaintenanceSchedulesRoute extends Route {}
@@ -1,3 +1,29 @@
1
1
  import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
3
+ import { action } from '@ember/object';
2
4
 
3
- export default class MaintenanceWorkOrdersIndexDetailsRoute extends Route {}
5
+ export default class MaintenanceWorkOrdersIndexDetailsRoute extends Route {
6
+ @service store;
7
+ @service notifications;
8
+ @service hostRouter;
9
+ @service abilities;
10
+ @service intl;
11
+
12
+ @action error(error) {
13
+ this.notifications.serverError(error);
14
+ if (typeof error.message === 'string' && error.message.endsWith('not found')) {
15
+ return this.hostRouter.transitionTo('maintenance.work-orders.index');
16
+ }
17
+ }
18
+
19
+ beforeModel() {
20
+ if (this.abilities.cannot('fleet-ops view work-order')) {
21
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
22
+ return this.hostRouter.transitionTo('maintenance.work-orders.index');
23
+ }
24
+ }
25
+
26
+ model({ public_id }) {
27
+ return this.store.findRecord('work-order', public_id);
28
+ }
29
+ }
@@ -1,3 +1,29 @@
1
1
  import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
3
+ import { action } from '@ember/object';
2
4
 
3
- export default class MaintenanceWorkOrdersIndexEditRoute extends Route {}
5
+ export default class MaintenanceWorkOrdersIndexEditRoute extends Route {
6
+ @service store;
7
+ @service notifications;
8
+ @service hostRouter;
9
+ @service abilities;
10
+ @service intl;
11
+
12
+ @action error(error) {
13
+ this.notifications.serverError(error);
14
+ if (typeof error.message === 'string' && error.message.endsWith('not found')) {
15
+ return this.hostRouter.transitionTo('maintenance.work-orders.index');
16
+ }
17
+ }
18
+
19
+ beforeModel() {
20
+ if (this.abilities.cannot('fleet-ops update work-order')) {
21
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
22
+ return this.hostRouter.transitionTo('maintenance.work-orders.index');
23
+ }
24
+ }
25
+
26
+ model({ public_id }) {
27
+ return this.store.findRecord('work-order', public_id);
28
+ }
29
+ }
@@ -0,0 +1,3 @@
1
+ import Route from '@ember/routing/route';
2
+
3
+ export default class ManagementVehiclesIndexDetailsMaintenanceHistoryRoute extends Route {}
@@ -0,0 +1,3 @@
1
+ import Route from '@ember/routing/route';
2
+
3
+ export default class ManagementVehiclesIndexDetailsSchedulesRoute extends Route {}
@@ -0,0 +1,3 @@
1
+ import Route from '@ember/routing/route';
2
+
3
+ export default class ManagementVehiclesIndexDetailsWorkOrdersRoute extends Route {}
@@ -0,0 +1,23 @@
1
+ import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
3
+
4
+ /**
5
+ * Operations::AllocationRoute
6
+ *
7
+ * Entry point for the Dispatcher Workbench at /operations/allocation.
8
+ * The route performs an ability check and then hands off to the
9
+ * OrchestratorWorkbench component via the controller.
10
+ */
11
+ export default class OperationsAllocationRoute extends Route {
12
+ @service notifications;
13
+ @service hostRouter;
14
+ @service abilities;
15
+ @service intl;
16
+
17
+ beforeModel() {
18
+ if (this.abilities.cannot('fleet-ops list order')) {
19
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
20
+ return this.hostRouter.transitionTo('console.fleet-ops');
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,28 @@
1
+ import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
3
+
4
+ export default class OperationsSchedulerFleetScheduleRoute extends Route {
5
+ @service store;
6
+ @service notifications;
7
+ @service abilities;
8
+ @service intl;
9
+ @service hostRouter;
10
+
11
+ beforeModel() {
12
+ if (this.abilities.cannot('fleet-ops list driver')) {
13
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
14
+ return this.hostRouter.transitionTo('console.fleet-ops.operations.scheduler.index');
15
+ }
16
+ }
17
+
18
+ async model() {
19
+ return this.store.query('driver', { limit: 200 });
20
+ }
21
+
22
+ setupController(controller, model) {
23
+ super.setupController(controller, model);
24
+ controller.drivers = model.toArray();
25
+ controller.loadScheduleItems.perform();
26
+ controller.loadScheduleExceptions.perform();
27
+ }
28
+ }
@@ -1,46 +1,68 @@
1
1
  import Route from '@ember/routing/route';
2
2
  import { inject as service } from '@ember/service';
3
- import { isValid as isValidDate } from 'date-fns';
4
- import { isNone } from '@ember/utils';
5
- // import createFullCalendarEventFromOrder from '../../../utils/create-full-calendar-event-from-order';
6
-
7
- const getUnscheduledOrder = (order) => {
8
- return isNone(order.scheduled_at);
9
- };
10
-
11
- const getScheduledOrder = (order) => {
12
- return isValidDate(order.scheduled_at);
13
- };
14
3
 
4
+ /**
5
+ * OperationsSchedulerIndexRoute
6
+ *
7
+ * Responsibilities:
8
+ * 1. Access control — redirect if the user cannot list orders.
9
+ * 2. Initial data loading — fetch active orders and drivers in parallel.
10
+ * 3. Socket subscription lifecycle — delegate to the controller.
11
+ *
12
+ * All post-load logic (filtering, event mapping, conflict detection) lives
13
+ * in the controller and the SchedulingService.
14
+ */
15
15
  export default class OperationsSchedulerIndexRoute extends Route {
16
16
  @service store;
17
- @service notifications;
18
- @service hostRouter;
19
17
  @service abilities;
20
- @service intl;
18
+ @service hostRouter;
21
19
 
22
20
  beforeModel() {
23
21
  if (this.abilities.cannot('fleet-ops list order')) {
24
- this.notifications.warning(this.intl.t('common.unauthorized-access'));
25
- return this.hostRouter.transitionTo('console.fleet-ops');
22
+ return this.hostRouter.transitionTo('console.fleet-ops.index');
26
23
  }
27
24
  }
28
25
 
29
- model() {
30
- return this.store.query('order', { status: 'created', with: ['payload', 'driverAssigned.vehicle'] });
26
+ async model() {
27
+ // Load active orders (created, dispatched, active) alongside drivers.
28
+ // The broader status scope ensures dispatchers see each driver's full
29
+ // day — not just pre-dispatch orders — enabling accurate conflict
30
+ // detection and capacity visualisation.
31
+ const [orders, drivers] = await Promise.all([
32
+ this.store.query('order', {
33
+ status: ['created', 'dispatched', 'active'],
34
+ with: ['payload', 'driverAssigned.vehicle'],
35
+ limit: 500,
36
+ }),
37
+ this.store.query('driver', {
38
+ with: ['currentShift'],
39
+ limit: 200,
40
+ }),
41
+ ]);
42
+
43
+ return { orders, drivers };
31
44
  }
32
45
 
33
46
  setupController(controller, model) {
34
- // get orders
35
- const orders = model.toArray();
47
+ super.setupController(controller, model);
48
+
49
+ // Set drivers on the controller so the resource timeline can render them.
50
+ // Orders are read reactively from the Ember Data store via computed getters,
51
+ // so we do not need to set them explicitly here.
52
+ controller.set('drivers', model.drivers.toArray());
36
53
 
37
- // set unscheduled orders
38
- controller.unscheduledOrders = orders.filter(getUnscheduledOrder);
54
+ // Initialise viewDate to the current UTC instant.
55
+ // @event-calendar/core applies timezoneOffsetMins internally so the
56
+ // calendar opens on the correct company-local day automatically.
57
+ controller.set('viewDate', new Date());
39
58
 
40
- // set scheduled orders
41
- controller.scheduledOrders = orders.filter(getScheduledOrder);
59
+ // Open SocketCluster subscriptions for real-time calendar updates.
60
+ controller.subscribeToRealTimeUpdates();
61
+ }
42
62
 
43
- // // create events from scheduledOrders
44
- // controller.events = controller.scheduledOrders.map(createFullCalendarEventFromOrder);
63
+ resetController(controller) {
64
+ // Close all socket channels when the dispatcher navigates away
65
+ // to prevent memory leaks and stale event handlers.
66
+ controller.unsubscribeFromRealTimeUpdates();
45
67
  }
46
68
  }
@@ -1,3 +1,16 @@
1
1
  import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
2
3
 
3
- export default class OperationsSchedulerRoute extends Route {}
4
+ export default class OperationsSchedulerRoute extends Route {
5
+ @service notifications;
6
+ @service hostRouter;
7
+ @service abilities;
8
+ @service intl;
9
+
10
+ beforeModel() {
11
+ if (this.abilities.cannot('fleet-ops list order')) {
12
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
13
+ return this.hostRouter.transitionTo('console.fleet-ops');
14
+ }
15
+ }
16
+ }
@@ -0,0 +1,27 @@
1
+ import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
3
+
4
+ /**
5
+ * Settings::OrchestratorRoute
6
+ *
7
+ * Entry point for the allocation settings page at /settings/order-allocation.
8
+ * Loads current settings into the controller on entry.
9
+ */
10
+ export default class SettingsOrchestratorRoute extends Route {
11
+ @service notifications;
12
+ @service abilities;
13
+ @service intl;
14
+ @service hostRouter;
15
+
16
+ beforeModel() {
17
+ if (this.abilities.cannot('fleet-ops list order')) {
18
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
19
+ return this.hostRouter.transitionTo('console.fleet-ops');
20
+ }
21
+ }
22
+
23
+ setupController(controller) {
24
+ super.setupController(...arguments);
25
+ controller.loadSettings.perform();
26
+ }
27
+ }
@@ -0,0 +1,3 @@
1
+ import Route from '@ember/routing/route';
2
+
3
+ export default class SettingsSchedulingRoute extends Route {}
package/addon/routes.js CHANGED
@@ -14,7 +14,11 @@ export default buildRoutes(function () {
14
14
  this.route('edit', { path: '/edit/:public_id' });
15
15
  });
16
16
  });
17
- this.route('scheduler', function () {});
17
+ this.route('orchestrator', function () {});
18
+ this.route('scheduler', function () {
19
+ this.route('index', { path: '/' });
20
+ this.route('fleet-schedule');
21
+ });
18
22
  this.route('orders', { path: '/' }, function () {
19
23
  this.route('index', { path: '/' }, function () {
20
24
  this.route('new');
@@ -80,6 +84,9 @@ export default buildRoutes(function () {
80
84
  this.route('positions');
81
85
  this.route('devices');
82
86
  this.route('equipment');
87
+ this.route('schedules');
88
+ this.route('work-orders');
89
+ this.route('maintenance-history');
83
90
  this.route('virtual', { path: '/:slug' });
84
91
  });
85
92
  this.route('edit', { path: '/edit/:public_id' });
@@ -181,6 +188,27 @@ export default buildRoutes(function () {
181
188
  this.route('tracking');
182
189
  });
183
190
  this.route('maintenance', function () {
191
+ this.route('schedules', function () {
192
+ this.route('index', { path: '/' }, function () {
193
+ this.route('new');
194
+ this.route('edit', { path: '/edit/:public_id' });
195
+ this.route('details', { path: '/:public_id' }, function () {
196
+ this.route('index', { path: '/' });
197
+ this.route('work-orders');
198
+ });
199
+ });
200
+ });
201
+
202
+ this.route('maintenances', function () {
203
+ this.route('index', { path: '/' }, function () {
204
+ this.route('new');
205
+ this.route('edit', { path: '/edit/:public_id' });
206
+ this.route('details', { path: '/:public_id' }, function () {
207
+ this.route('index', { path: '/' });
208
+ });
209
+ });
210
+ });
211
+
184
212
  this.route('work-orders', function () {
185
213
  this.route('index', { path: '/' }, function () {
186
214
  this.route('new');
@@ -229,6 +257,8 @@ export default buildRoutes(function () {
229
257
  this.route('custom-fields');
230
258
  this.route('avatars');
231
259
  this.route('routing');
260
+ this.route('orchestrator');
261
+ this.route('scheduling');
232
262
  this.route('payments', function () {
233
263
  this.route('index', { path: '/' });
234
264
  this.route('onboard');
@@ -1,9 +1,47 @@
1
- import ResourceActionService from '@fleetbase/ember-core/services/resource-action';
1
+ import ResourceActionService, { inject as service } from '@fleetbase/ember-core/services/resource-action';
2
2
  import leafletIcon from '@fleetbase/ember-core/utils/leaflet-icon';
3
3
  import config from 'ember-get-config';
4
4
  import { action } from '@ember/object';
5
+ import { isArray } from '@ember/array';
6
+ import { dasherize } from '@ember/string';
5
7
 
6
8
  export default class DriverActionsService extends ResourceActionService {
9
+ @service('universe/menu-service') menuService;
10
+
11
+ get registeredTabs() {
12
+ const registeredTabs = this.menuService.getMenuItems('fleet-ops:component:driver:details');
13
+ return (isArray(registeredTabs) ? registeredTabs : [])
14
+ .map((tab) => {
15
+ delete tab.route;
16
+ if (!tab.key) {
17
+ tab.key = tab.id ?? dasherize(tab.label ?? tab.title);
18
+ }
19
+ return tab;
20
+ })
21
+ .filter((tab) => !tab.component);
22
+ }
23
+
24
+ get panelTabs() {
25
+ return [
26
+ {
27
+ key: 'overview',
28
+ label: this.intl.t('common.overview'),
29
+ component: 'driver/details',
30
+ },
31
+ {
32
+ key: 'positions',
33
+ label: 'Positions',
34
+ component: 'positions-replay',
35
+ },
36
+ {
37
+ key: 'schedule',
38
+ label: this.intl.t('common.schedule'),
39
+ component: 'driver/schedule',
40
+ },
41
+ ...this.registeredTabs,
42
+ ];
43
+ }
44
+
7
45
  constructor() {
8
46
  super(...arguments);
9
47
  this.initialize('driver');
@@ -68,12 +106,7 @@ export default class DriverActionsService extends ResourceActionService {
68
106
  },
69
107
  },
70
108
  ],
71
- tabs: [
72
- {
73
- label: this.intl.t('common.overview'),
74
- component: 'driver/details',
75
- },
76
- ],
109
+ tabs: this.panelTabs,
77
110
  ...options,
78
111
  });
79
112
  },
@@ -32,7 +32,10 @@ export default class DriverSchedulingService extends Service {
32
32
  */
33
33
  @task *createSchedule(data) {
34
34
  try {
35
- const schedule = this.store.createRecord('schedule', data);
35
+ const schedule = this.store.createRecord('schedule', {
36
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
37
+ ...data,
38
+ });
36
39
  yield schedule.save();
37
40
  this.notifications.success('Schedule created successfully');
38
41
  return schedule;
@@ -1,15 +1,25 @@
1
- import ResourceActionService from '@fleetbase/ember-core/services/resource-action';
1
+ import ResourceActionService, { inject as service } from '@fleetbase/ember-core/services/resource-action';
2
2
 
3
3
  export default class EquipmentActionsService extends ResourceActionService {
4
+ @service currentUser;
5
+
4
6
  constructor() {
5
7
  super(...arguments);
6
- this.initialize('equipment');
8
+ this.initialize('equipment', {
9
+ defaultAttributes: {
10
+ currency: this.defaultCurrency,
11
+ },
12
+ });
13
+ }
14
+
15
+ get defaultCurrency() {
16
+ return this.currentUser?.company?.currency || 'USD';
7
17
  }
8
18
 
9
19
  transition = {
10
- view: (equipment) => this.transitionTo('maintenance.equipments.index.details', equipment),
11
- edit: (equipment) => this.transitionTo('maintenance.equipments.index.edit', equipment),
12
- create: () => this.transitionTo('maintenance.equipments.index.new'),
20
+ view: (equipment) => this.transitionTo('maintenance.equipment.index.details', equipment),
21
+ edit: (equipment) => this.transitionTo('maintenance.equipment.index.edit', equipment),
22
+ create: () => this.transitionTo('maintenance.equipment.index.new'),
13
23
  };
14
24
 
15
25
  panel = {
@@ -233,11 +233,20 @@ export default class LeafletMapManagerService extends Service {
233
233
  const { router, formatter } = this.leafletRoutingControl.get(routingService);
234
234
  const tag = `routing:${Date.now().toString(36)}:${Math.random().toString(36).slice(2, 8)}`;
235
235
 
236
- const routingControl = new RoutingControl({
236
+ // Allow callers to suppress the routing control's default waypoint markers
237
+ // by passing createMarker: () => null in options. This is used by the
238
+ // orchestrator which renders its own custom div-icon markers via ember-leaflet.
239
+ const routingControlOptions = {
237
240
  router,
238
241
  formatter,
239
242
  waypoints,
240
- markerOptions: {
243
+ alternativeClassName: 'hidden',
244
+ addWaypoints: false,
245
+ };
246
+ if (typeof options.createMarker === 'function') {
247
+ routingControlOptions.createMarker = options.createMarker;
248
+ } else {
249
+ routingControlOptions.markerOptions = {
241
250
  icon: L.icon({
242
251
  iconUrl: '/assets/images/marker-icon.png',
243
252
  iconRetinaUrl: '/assets/images/marker-icon-2x.png',
@@ -245,10 +254,9 @@ export default class LeafletMapManagerService extends Service {
245
254
  iconSize: [25, 41],
246
255
  iconAnchor: [12, 41],
247
256
  }),
248
- },
249
- alternativeClassName: 'hidden',
250
- addWaypoints: false,
251
- }).addTo(map);
257
+ };
258
+ }
259
+ const routingControl = new RoutingControl(routingControlOptions).addTo(map);
252
260
 
253
261
  // Track routing control
254
262
  this.routingControl = routingControl;
@@ -1,9 +1,19 @@
1
- import ResourceActionService from '@fleetbase/ember-core/services/resource-action';
1
+ import ResourceActionService, { inject as service } from '@fleetbase/ember-core/services/resource-action';
2
2
 
3
3
  export default class MaintenanceActionsService extends ResourceActionService {
4
+ @service currentUser;
5
+
4
6
  constructor() {
5
7
  super(...arguments);
6
- this.initialize('maintenance');
8
+ this.initialize('maintenance', {
9
+ defaultAttributes: {
10
+ currency: this.defaultCurrency,
11
+ },
12
+ });
13
+ }
14
+
15
+ get defaultCurrency() {
16
+ return this.currentUser?.company?.currency || 'USD';
7
17
  }
8
18
 
9
19
  transition = {
@@ -19,16 +29,14 @@ export default class MaintenanceActionsService extends ResourceActionService {
19
29
  content: 'maintenance/form',
20
30
  title: this.intl.t('common.create-a-new-resource', { resource: this.intl.t('resource.maintenance')?.toLowerCase() }),
21
31
  useDefaultSaveTask: true,
22
- saveOptions: {
23
- callback: this.refresh,
24
- },
32
+ saveOptions: { callback: this.refresh },
25
33
  maintenance,
26
34
  });
27
35
  },
28
36
  edit: (maintenance) => {
29
37
  return this.resourceContextPanel.open({
30
38
  content: 'maintenance/form',
31
- title: this.intl.t('common.edit-resource-name', { resourceName: maintenance.name }),
39
+ title: this.intl.t('common.edit-resource-name', { resourceName: maintenance.summary }),
32
40
  useDefaultSaveTask: true,
33
41
  maintenance,
34
42
  });
@@ -36,12 +44,7 @@ export default class MaintenanceActionsService extends ResourceActionService {
36
44
  view: (maintenance) => {
37
45
  return this.resourceContextPanel.open({
38
46
  maintenance,
39
- tabs: [
40
- {
41
- label: this.intl.t('common.overview'),
42
- component: 'maintenance/details',
43
- },
44
- ],
47
+ tabs: [{ label: this.intl.t('common.overview'), component: 'maintenance/details' }],
45
48
  });
46
49
  },
47
50
  };
@@ -61,7 +64,7 @@ export default class MaintenanceActionsService extends ResourceActionService {
61
64
  edit: (maintenance, options = {}, saveOptions = {}) => {
62
65
  return this.modalsManager.show('modals/resource', {
63
66
  resource: maintenance,
64
- title: this.intl.t('common.edit-resource-name', { resourceName: maintenance.name }),
67
+ title: this.intl.t('common.edit-resource-name', { resourceName: maintenance.summary }),
65
68
  acceptButtonText: this.intl.t('common.save-changes'),
66
69
  saveButtonIcon: 'save',
67
70
  component: 'maintenance/form',
@@ -72,7 +75,7 @@ export default class MaintenanceActionsService extends ResourceActionService {
72
75
  view: (maintenance, options = {}) => {
73
76
  return this.modalsManager.show('modals/resource', {
74
77
  resource: maintenance,
75
- title: maintenance.name,
78
+ title: maintenance.summary,
76
79
  component: 'maintenance/details',
77
80
  ...options,
78
81
  });