@fleetbase/fleetops-engine 0.6.38 → 0.6.39

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 (429) 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 +40 -36
  25. package/addon/components/layout/fleet-ops-sidebar.js +61 -10
  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 +1087 -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 +30 -0
  117. package/addon/components/vehicle/form.hbs +39 -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 +80 -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 +5 -3
  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 +58 -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 +41 -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/resources/views/mail/maintenance-schedule-reminder.blade.php +59 -0
  358. package/server/resources/views/mail/work-order-dispatched.blade.php +67 -0
  359. package/server/src/Auth/Schemas/FleetOps.php +44 -0
  360. package/server/src/Console/Commands/ProcessMaintenanceTriggers.php +150 -0
  361. package/server/src/Console/Commands/SendMaintenanceReminders.php +128 -0
  362. package/server/src/Http/Controllers/Internal/v1/DriverController.php +1 -0
  363. package/server/src/Http/Controllers/Internal/v1/EquipmentController.php +27 -0
  364. package/server/src/Http/Controllers/Internal/v1/LiveController.php +9 -2
  365. package/server/src/Http/Controllers/Internal/v1/MaintenanceController.php +165 -0
  366. package/server/src/Http/Controllers/Internal/v1/MaintenanceScheduleController.php +304 -0
  367. package/server/src/Http/Controllers/Internal/v1/ManifestController.php +138 -0
  368. package/server/src/Http/Controllers/Internal/v1/OrchestrationController.php +975 -0
  369. package/server/src/Http/Controllers/Internal/v1/OrderController.php +42 -0
  370. package/server/src/Http/Controllers/Internal/v1/PartController.php +27 -0
  371. package/server/src/Http/Controllers/Internal/v1/SettingController.php +118 -0
  372. package/server/src/Http/Controllers/Internal/v1/Traits/DriverSchedulingTrait.php +214 -0
  373. package/server/src/Http/Controllers/Internal/v1/WorkOrderController.php +68 -0
  374. package/server/src/Http/Resources/v1/Driver.php +1 -0
  375. package/server/src/Http/Resources/v1/Maintenance.php +138 -0
  376. package/server/src/Http/Resources/v1/MaintenanceSchedule.php +137 -0
  377. package/server/src/Http/Resources/v1/Orchestrator/Order.php +116 -0
  378. package/server/src/Http/Resources/v1/Order.php +7 -4
  379. package/server/src/Http/Resources/v1/Waypoint.php +7 -0
  380. package/server/src/Http/Resources/v1/WorkOrder.php +136 -0
  381. package/server/src/Imports/EquipmentImport.php +32 -0
  382. package/server/src/Imports/MaintenanceImport.php +32 -0
  383. package/server/src/Imports/MaintenanceScheduleImport.php +32 -0
  384. package/server/src/Imports/PartImport.php +32 -0
  385. package/server/src/Imports/WorkOrderImport.php +32 -0
  386. package/server/src/Jobs/ProcessAllocationJob.php +119 -0
  387. package/server/src/Listeners/HandleDeliveryCompletion.php +47 -0
  388. package/server/src/Listeners/NotifyDriverOnShiftChange.php +63 -0
  389. package/server/src/Mail/MaintenanceScheduleReminder.php +68 -0
  390. package/server/src/Mail/WorkOrderDispatched.php +58 -0
  391. package/server/src/Models/Asset.php +2 -2
  392. package/server/src/Models/Device.php +1 -1
  393. package/server/src/Models/Driver.php +82 -4
  394. package/server/src/Models/Equipment.php +62 -2
  395. package/server/src/Models/Maintenance.php +127 -9
  396. package/server/src/Models/MaintenanceSchedule.php +353 -0
  397. package/server/src/Models/Manifest.php +214 -0
  398. package/server/src/Models/ManifestStop.php +162 -0
  399. package/server/src/Models/Order.php +70 -0
  400. package/server/src/Models/OrderConfig.php +5 -2
  401. package/server/src/Models/Part.php +69 -3
  402. package/server/src/Models/Payload.php +7 -2
  403. package/server/src/Models/Place.php +1 -1
  404. package/server/src/Models/Sensor.php +1 -1
  405. package/server/src/Models/ServiceQuote.php +1 -1
  406. package/server/src/Models/Vehicle.php +20 -1
  407. package/server/src/Models/Warranty.php +1 -1
  408. package/server/src/Models/Waypoint.php +7 -1
  409. package/server/src/Models/WorkOrder.php +122 -12
  410. package/server/src/Notifications/DriverShiftChanged.php +110 -0
  411. package/server/src/Observers/WorkOrderObserver.php +107 -0
  412. package/server/src/Orchestration/Contracts/OrchestrationEngineInterface.php +63 -0
  413. package/server/src/Orchestration/Engines/DriverAssignmentEngine.php +265 -0
  414. package/server/src/Orchestration/Engines/GreedyOrchestrationEngine.php +155 -0
  415. package/server/src/Orchestration/Engines/RouteSequencingEngine.php +272 -0
  416. package/server/src/Orchestration/Engines/VroomOrchestrationEngine.php +192 -0
  417. package/server/src/Orchestration/OrchestrationEngineRegistry.php +83 -0
  418. package/server/src/Orchestration/Support/OrchestrationPayloadBuilder.php +290 -0
  419. package/server/src/Providers/EventServiceProvider.php +7 -1
  420. package/server/src/Providers/FleetOpsServiceProvider.php +42 -15
  421. package/server/src/routes.php +65 -4
  422. package/translations/ar-ae.yml +44 -12
  423. package/translations/bg-bg.yaml +51 -10
  424. package/translations/en-us.yaml +444 -1
  425. package/translations/fr-fr.yaml +51 -10
  426. package/translations/mn-mn.yaml +51 -10
  427. package/translations/pt-br.yaml +51 -10
  428. package/translations/ru-ru.yaml +51 -10
  429. package/translations/vi-vn.yaml +48 -12
@@ -0,0 +1,118 @@
1
+ import ResourceActionService from '@fleetbase/ember-core/services/resource-action';
2
+ import { action } from '@ember/object';
3
+ import { inject as service } from '@ember/service';
4
+
5
+ export default class MaintenanceScheduleActionsService extends ResourceActionService {
6
+ @service fetch;
7
+ @service notifications;
8
+ @service intl;
9
+
10
+ constructor() {
11
+ super(...arguments);
12
+ this.initialize('maintenance-schedule');
13
+ }
14
+
15
+ transition = {
16
+ view: (schedule) => this.transitionTo('maintenance.schedules.index.details', schedule),
17
+ edit: (schedule) => this.transitionTo('maintenance.schedules.index.edit', schedule),
18
+ create: () => this.transitionTo('maintenance.schedules.index.new'),
19
+ };
20
+
21
+ panel = {
22
+ create: (attributes = {}) => {
23
+ const schedule = this.createNewInstance(attributes);
24
+ return this.resourceContextPanel.open({
25
+ content: 'maintenance-schedule/form',
26
+ title: this.intl.t('common.create-a-new-resource', { resource: this.intl.t('resource.maintenance-schedule')?.toLowerCase() }),
27
+ useDefaultSaveTask: true,
28
+ saveOptions: {
29
+ callback: this.refresh,
30
+ },
31
+ schedule,
32
+ });
33
+ },
34
+ edit: (schedule) => {
35
+ return this.resourceContextPanel.open({
36
+ content: 'maintenance-schedule/form',
37
+ title: this.intl.t('common.edit-resource-name', { resourceName: schedule.name }),
38
+ useDefaultSaveTask: true,
39
+ schedule,
40
+ });
41
+ },
42
+ view: (schedule) => {
43
+ return this.resourceContextPanel.open({
44
+ schedule,
45
+ tabs: [
46
+ {
47
+ label: this.intl.t('common.overview'),
48
+ component: 'maintenance-schedule/details',
49
+ },
50
+ ],
51
+ });
52
+ },
53
+ };
54
+
55
+ modal = {
56
+ create: (attributes = {}, options = {}, saveOptions = {}) => {
57
+ const schedule = this.createNewInstance(attributes);
58
+ return this.modalsManager.show('modals/resource', {
59
+ resource: schedule,
60
+ title: this.intl.t('common.create-a-new-resource', { resource: this.intl.t('resource.maintenance-schedule')?.toLowerCase() }),
61
+ acceptButtonText: this.intl.t('common.create-resource', { resource: this.intl.t('resource.maintenance-schedule') }),
62
+ component: 'maintenance-schedule/form',
63
+ confirm: (modal) => this.modalTask.perform(modal, 'saveTask', schedule, { refresh: true, ...saveOptions }),
64
+ ...options,
65
+ });
66
+ },
67
+ edit: (schedule, options = {}, saveOptions = {}) => {
68
+ return this.modalsManager.show('modals/resource', {
69
+ resource: schedule,
70
+ title: this.intl.t('common.edit-resource-name', { resourceName: schedule.name }),
71
+ acceptButtonText: this.intl.t('common.save-changes'),
72
+ saveButtonIcon: 'save',
73
+ component: 'maintenance-schedule/form',
74
+ confirm: (modal) => this.modalTask.perform(modal, 'saveTask', schedule, { refresh: true, ...saveOptions }),
75
+ ...options,
76
+ });
77
+ },
78
+ };
79
+
80
+ /**
81
+ * Pause a maintenance schedule.
82
+ */
83
+ @action async pause(schedule) {
84
+ try {
85
+ await this.fetch.post(`maintenance-schedules/${schedule.id}/pause`);
86
+ schedule.set('status', 'paused');
87
+ this.notifications.success('Schedule paused successfully.');
88
+ } catch (error) {
89
+ this.notifications.serverError(error);
90
+ }
91
+ }
92
+
93
+ /**
94
+ * Resume a paused maintenance schedule.
95
+ */
96
+ @action async resume(schedule) {
97
+ try {
98
+ await this.fetch.post(`maintenance-schedules/${schedule.id}/resume`);
99
+ schedule.set('status', 'active');
100
+ this.notifications.success('Schedule resumed successfully.');
101
+ } catch (error) {
102
+ this.notifications.serverError(error);
103
+ }
104
+ }
105
+
106
+ /**
107
+ * Manually trigger a work order from a schedule immediately.
108
+ */
109
+ @action async triggerNow(schedule) {
110
+ try {
111
+ const response = await this.fetch.post(`maintenance-schedules/${schedule.id}/trigger`);
112
+ this.notifications.success(`Work order ${response?.work_order?.public_id ?? ''} created from schedule.`);
113
+ this.refresh();
114
+ } catch (error) {
115
+ this.notifications.serverError(error);
116
+ }
117
+ }
118
+ }
@@ -0,0 +1,49 @@
1
+ import Service from '@ember/service';
2
+
3
+ /**
4
+ * OrchestrationEngineInterfaceService
5
+ *
6
+ * Base class that all allocation engine adapters must extend.
7
+ * The interface mirrors the backend OrchestrationEngineInterface contract.
8
+ *
9
+ * Third-party engines extend this class, implement allocate(), and register
10
+ * themselves via an instance initializer:
11
+ *
12
+ * // addon/instance-initializers/register-my-engine.js
13
+ * export function initialize(appInstance) {
14
+ * const registry = appInstance.lookup('service:orchestration-engine');
15
+ * const engine = appInstance.lookup('service:my-allocation-engine');
16
+ * registry.register('my-engine', engine);
17
+ * }
18
+ * export default { name: 'register-my-engine', initialize };
19
+ *
20
+ * @abstract
21
+ */
22
+ export default class OrchestrationEngineInterfaceService extends Service {
23
+ /**
24
+ * Human-readable display name shown in the settings dropdown.
25
+ * @type {string}
26
+ */
27
+ name = 'Unknown Engine';
28
+
29
+ /**
30
+ * Machine-readable identifier. Must be unique across all registered engines.
31
+ * @type {string}
32
+ */
33
+ identifier = 'unknown';
34
+
35
+ /**
36
+ * Run the allocation algorithm.
37
+ *
38
+ * @param {Array} orders Array of order records to allocate.
39
+ * @param {Array} vehicles Array of vehicle records (with loaded driver).
40
+ * @param {Object} options Engine-specific options.
41
+ * @returns {Promise<{assignments: Array, unassigned: Array, summary: Object}>}
42
+ *
43
+ * @abstract
44
+ */
45
+ // eslint-disable-next-line no-unused-vars
46
+ async allocate(orders, vehicles, options = {}) {
47
+ throw new Error(`OrchestrationEngineInterfaceService: allocate() must be implemented by ${this.constructor.name}`);
48
+ }
49
+ }
@@ -0,0 +1,74 @@
1
+ import Service from '@ember/service';
2
+ import { tracked } from '@glimmer/tracking';
3
+
4
+ /**
5
+ * AllocationEngineService
6
+ *
7
+ * Registry service for allocation engine adapters. Mirrors the backend
8
+ * OrchestrationEngineRegistry pattern. Engines register themselves from
9
+ * instance initializers and the settings UI reads availableEngines to
10
+ * populate the engine selector dropdown.
11
+ *
12
+ * This service is intentionally engine-agnostic — it has no knowledge of
13
+ * VROOM or any other specific solver.
14
+ */
15
+ export default class AllocationEngineService extends Service {
16
+ /**
17
+ * Map of registered engines keyed by identifier.
18
+ * @type {Map<string, OrchestrationEngineInterfaceService>}
19
+ */
20
+ @tracked _engines = new Map();
21
+
22
+ /**
23
+ * Register an allocation engine adapter.
24
+ *
25
+ * @param {string} identifier Unique engine key.
26
+ * @param {OrchestrationEngineInterfaceService} engine Engine service instance.
27
+ * @throws {Error} if an engine with the same identifier is already registered.
28
+ */
29
+ register(identifier, engine) {
30
+ if (this._engines.has(identifier)) {
31
+ throw new Error(`AllocationEngineService: engine '${identifier}' is already registered.`);
32
+ }
33
+ this._engines.set(identifier, engine);
34
+ }
35
+
36
+ /**
37
+ * Resolve an engine by identifier.
38
+ *
39
+ * @param {string} identifier
40
+ * @returns {OrchestrationEngineInterfaceService}
41
+ * @throws {Error} if no engine with the given identifier is registered.
42
+ */
43
+ resolve(identifier) {
44
+ const engine = this._engines.get(identifier);
45
+ if (!engine) {
46
+ const available = [...this._engines.keys()].join(', ');
47
+ throw new Error(`AllocationEngineService: no engine registered for '${identifier}'. Available: ${available}`);
48
+ }
49
+ return engine;
50
+ }
51
+
52
+ /**
53
+ * Return all registered engines as an array of {id, name} objects.
54
+ * Used by the settings UI to populate the engine selector dropdown.
55
+ *
56
+ * @returns {Array<{id: string, name: string}>}
57
+ */
58
+ get availableEngines() {
59
+ return [...this._engines.values()].map((engine) => ({
60
+ id: engine.identifier,
61
+ name: engine.name,
62
+ }));
63
+ }
64
+
65
+ /**
66
+ * Check whether an engine with the given identifier is registered.
67
+ *
68
+ * @param {string} identifier
69
+ * @returns {boolean}
70
+ */
71
+ has(identifier) {
72
+ return this._engines.has(identifier);
73
+ }
74
+ }
@@ -483,6 +483,21 @@ export default class OrderActionsService extends ResourceActionService {
483
483
  }
484
484
  }
485
485
 
486
+ // ── Import orders ─────────────────────────────────────────────────────
487
+ // Opens the three-step orchestrator import modal. Accepts an optional
488
+ // onImportComplete callback that is called after a successful import.
489
+ @action importOrders(options = {}) {
490
+ return this.modalsManager.show('modals/orchestrator-import', {
491
+ title: this.intl.t('orchestrator.import-orders'),
492
+ modalClass: 'modal-xl fleetops-order-import',
493
+ modalHeaderClass: 'import-modal-header',
494
+ hideAcceptButton: true,
495
+ onImportComplete: options.onImportComplete ?? this.refresh,
496
+ onImportTemplate: options.onImportTemplate,
497
+ ...options,
498
+ });
499
+ }
500
+
486
501
  #serializeWaypoints(waypoints = []) {
487
502
  if (!waypoints) return [];
488
503
 
@@ -0,0 +1,116 @@
1
+ import Service, { inject as service } from '@ember/service';
2
+ import { tracked } from '@glimmer/tracking';
3
+ import { task } from 'ember-concurrency';
4
+
5
+ /**
6
+ * OrderAllocationService
7
+ *
8
+ * Orchestrates the full allocation workflow:
9
+ * 1. Fetch unassigned orders and available vehicles
10
+ * 2. Run the active orchestration engine (via the orchestration-engine registry)
11
+ * 3. Present the proposed plan to the dispatcher
12
+ * 4. Commit confirmed assignments to the backend
13
+ *
14
+ * This service is injected into the Dispatcher Workbench component and the
15
+ * orchestrator settings controller.
16
+ */
17
+ export default class OrderAllocationService extends Service {
18
+ @service fetch;
19
+ @service store;
20
+ @service notifications;
21
+ @service intl;
22
+
23
+ /** The proposed allocation plan returned by the last run. */
24
+ @tracked currentPlan = null;
25
+
26
+ /** Whether an allocation run is in progress. */
27
+ @tracked isRunning = false;
28
+
29
+ /** The identifier of the currently active engine (from settings). */
30
+ @tracked activeEngineId = 'greedy';
31
+
32
+ /**
33
+ * Load orchestrator settings from the backend.
34
+ */
35
+ @task *loadSettings() {
36
+ try {
37
+ const settings = yield this.fetch.get('fleet-ops/settings/orchestrator-settings');
38
+ this.activeEngineId = settings.orchestrator_engine ?? 'greedy';
39
+ return settings;
40
+ } catch (error) {
41
+ this.notifications.serverError(error);
42
+ }
43
+ }
44
+
45
+ /**
46
+ * Save orchestrator settings to the backend.
47
+ *
48
+ * @param {Object} settings
49
+ */
50
+ @task *saveSettings(settings) {
51
+ try {
52
+ yield this.fetch.post('fleet-ops/settings/orchestrator-settings', settings);
53
+ this.notifications.success(this.intl.t('orchestrator.settings-saved'));
54
+ } catch (error) {
55
+ this.notifications.serverError(error);
56
+ throw error;
57
+ }
58
+ }
59
+
60
+ /**
61
+ * Run the orchestration engine and store the proposed plan.
62
+ *
63
+ * @param {Array} orderIds Optional list of order public_ids to allocate.
64
+ * @param {Array} vehicleIds Optional list of vehicle public_ids to use.
65
+ * @param {Object} options Engine-specific options.
66
+ */
67
+ @task *run(orderIds = [], vehicleIds = [], options = {}) {
68
+ this.isRunning = true;
69
+ try {
70
+ const result = yield this.fetch.post('fleet-ops/orchestrator/run', {
71
+ order_ids: orderIds,
72
+ vehicle_ids: vehicleIds,
73
+ options,
74
+ });
75
+ this.currentPlan = result;
76
+ return result;
77
+ } catch (error) {
78
+ this.notifications.serverError(error);
79
+ throw error;
80
+ } finally {
81
+ this.isRunning = false;
82
+ }
83
+ }
84
+
85
+ /**
86
+ * Commit a (possibly modified) orchestration plan.
87
+ * The dispatcher may have adjusted assignments via drag-and-drop before
88
+ * calling commit.
89
+ *
90
+ * @param {Array} assignments Array of {order_id, vehicle_id, driver_id, sequence}
91
+ */
92
+ @task *commit(assignments) {
93
+ try {
94
+ const result = yield this.fetch.post('fleet-ops/orchestrator/commit', { assignments });
95
+ this.notifications.success(this.intl.t('orchestrator.committed', { count: result.committed?.length ?? 0 }));
96
+ this.currentPlan = null;
97
+ return result;
98
+ } catch (error) {
99
+ this.notifications.serverError(error);
100
+ throw error;
101
+ }
102
+ }
103
+
104
+ /**
105
+ * Fetch the list of available orchestration engines from the backend.
106
+ * Used to cross-validate that the backend and frontend registries are in sync.
107
+ */
108
+ @task *fetchAvailableEngines() {
109
+ try {
110
+ const response = yield this.fetch.get('fleet-ops/orchestrator/engines');
111
+ return response.engines ?? [];
112
+ } catch (error) {
113
+ return [];
114
+ }
115
+ }
116
+ }
@@ -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 PartActionsService extends ResourceActionService {
4
+ @service currentUser;
5
+
4
6
  constructor() {
5
7
  super(...arguments);
6
- this.initialize('part');
8
+ this.initialize('part', {
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 = {