@fleetbase/fleetops-engine 0.6.37 → 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 (434) 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/details.js +5 -0
  155. package/addon/controllers/operations/orders/index.js +6 -0
  156. package/addon/controllers/operations/scheduler/fleet-schedule.js +341 -0
  157. package/addon/controllers/operations/scheduler/index.js +799 -275
  158. package/addon/controllers/operations/scheduler.js +21 -0
  159. package/addon/controllers/settings/orchestrator.js +70 -0
  160. package/addon/controllers/settings/scheduling.js +155 -0
  161. package/addon/extension.js +74 -1
  162. package/addon/instance-initializers/register-vroom-allocation.js +27 -0
  163. package/addon/models/maintenance-schedule.js +61 -0
  164. package/addon/routes/maintenance/equipment/index/details.js +27 -1
  165. package/addon/routes/maintenance/equipment/index/edit.js +27 -1
  166. package/addon/routes/maintenance/maintenances/index/details/index.js +3 -0
  167. package/addon/routes/maintenance/maintenances/index/details.js +29 -0
  168. package/addon/routes/maintenance/maintenances/index/edit.js +29 -0
  169. package/addon/routes/maintenance/maintenances/index/new.js +3 -0
  170. package/addon/routes/maintenance/maintenances/index.js +23 -0
  171. package/addon/routes/maintenance/maintenances.js +3 -0
  172. package/addon/routes/maintenance/parts/index/details.js +27 -1
  173. package/addon/routes/maintenance/parts/index/edit.js +27 -1
  174. package/addon/routes/maintenance/schedules/index/details/index.js +2 -0
  175. package/addon/routes/maintenance/schedules/index/details/work-orders.js +11 -0
  176. package/addon/routes/maintenance/schedules/index/details.js +25 -0
  177. package/addon/routes/maintenance/schedules/index/edit.js +25 -0
  178. package/addon/routes/maintenance/schedules/index/new.js +2 -0
  179. package/addon/routes/maintenance/schedules/index.js +21 -0
  180. package/addon/routes/maintenance/schedules.js +2 -0
  181. package/addon/routes/maintenance/work-orders/index/details.js +27 -1
  182. package/addon/routes/maintenance/work-orders/index/edit.js +27 -1
  183. package/addon/routes/management/vehicles/index/details/maintenance-history.js +3 -0
  184. package/addon/routes/management/vehicles/index/details/schedules.js +3 -0
  185. package/addon/routes/management/vehicles/index/details/work-orders.js +3 -0
  186. package/addon/routes/operations/orchestrator.js +23 -0
  187. package/addon/routes/operations/orders/index/details/virtual.js +23 -0
  188. package/addon/routes/operations/scheduler/fleet-schedule.js +28 -0
  189. package/addon/routes/operations/scheduler/index.js +48 -26
  190. package/addon/routes/operations/scheduler.js +14 -1
  191. package/addon/routes/settings/orchestrator.js +27 -0
  192. package/addon/routes/settings/scheduling.js +3 -0
  193. package/addon/routes.js +33 -1
  194. package/addon/services/driver-actions.js +40 -7
  195. package/addon/services/driver-scheduling.js +4 -1
  196. package/addon/services/equipment-actions.js +15 -5
  197. package/addon/services/leaflet-map-manager.js +14 -6
  198. package/addon/services/maintenance-actions.js +17 -14
  199. package/addon/services/maintenance-schedule-actions.js +118 -0
  200. package/addon/services/orchestration-engine-interface.js +49 -0
  201. package/addon/services/orchestration-engine.js +74 -0
  202. package/addon/services/order-actions.js +15 -0
  203. package/addon/services/order-allocation.js +116 -0
  204. package/addon/services/part-actions.js +12 -2
  205. package/addon/services/scheduling.js +316 -0
  206. package/addon/services/vehicle-actions.js +70 -7
  207. package/addon/services/vroom-allocation-engine.js +45 -0
  208. package/addon/services/work-order-actions.js +80 -0
  209. package/addon/styles/fleetops-engine.css +1658 -0
  210. package/addon/templates/analytics/reports/index/edit.hbs +1 -1
  211. package/addon/templates/analytics/reports/index/new.hbs +1 -1
  212. package/addon/templates/application.hbs +6 -1
  213. package/addon/templates/connectivity/devices/index/details/events.hbs +0 -1
  214. package/addon/templates/connectivity/devices.hbs +0 -1
  215. package/addon/templates/connectivity/events/index/details.hbs +0 -1
  216. package/addon/templates/connectivity/events.hbs +0 -1
  217. package/addon/templates/connectivity/sensors.hbs +0 -1
  218. package/addon/templates/connectivity/telematics/index/details/devices.hbs +0 -1
  219. package/addon/templates/connectivity/telematics/index/details/events.hbs +0 -1
  220. package/addon/templates/connectivity/telematics/index/details/sensors.hbs +0 -1
  221. package/addon/templates/connectivity/telematics.hbs +0 -1
  222. package/addon/templates/connectivity/tracking.hbs +0 -1
  223. package/addon/templates/connectivity.hbs +0 -1
  224. package/addon/templates/maintenance/equipment/index/details/index.hbs +1 -2
  225. package/addon/templates/maintenance/equipment/index/details.hbs +15 -2
  226. package/addon/templates/maintenance/equipment/index/edit.hbs +12 -2
  227. package/addon/templates/maintenance/equipment/index/new.hbs +1 -2
  228. package/addon/templates/maintenance/equipment/index.hbs +48 -13
  229. package/addon/templates/maintenance/equipment.hbs +0 -1
  230. package/addon/templates/maintenance/maintenances/index/details/index.hbs +1 -0
  231. package/addon/templates/maintenance/maintenances/index/details.hbs +15 -0
  232. package/addon/templates/maintenance/maintenances/index/edit.hbs +12 -0
  233. package/addon/templates/maintenance/maintenances/index/new.hbs +11 -0
  234. package/addon/templates/maintenance/maintenances/index.hbs +14 -0
  235. package/addon/templates/maintenance/maintenances.hbs +1 -0
  236. package/addon/templates/maintenance/parts/index/details/index.hbs +1 -2
  237. package/addon/templates/maintenance/parts/index/details.hbs +15 -2
  238. package/addon/templates/maintenance/parts/index/edit.hbs +12 -2
  239. package/addon/templates/maintenance/parts/index/new.hbs +1 -2
  240. package/addon/templates/maintenance/parts/index.hbs +48 -13
  241. package/addon/templates/maintenance/parts.hbs +0 -1
  242. package/addon/templates/maintenance/schedules/index/details/index.hbs +1 -0
  243. package/addon/templates/maintenance/schedules/index/details/work-orders.hbs +39 -0
  244. package/addon/templates/maintenance/schedules/index/details.hbs +14 -0
  245. package/addon/templates/maintenance/schedules/index/edit.hbs +12 -0
  246. package/addon/templates/maintenance/schedules/index/new.hbs +11 -0
  247. package/addon/templates/maintenance/schedules/index.hbs +40 -0
  248. package/addon/templates/maintenance/schedules.hbs +1 -0
  249. package/addon/templates/maintenance/work-orders/index/details.hbs +2 -1
  250. package/addon/templates/maintenance/work-orders/index/edit.hbs +2 -4
  251. package/addon/templates/maintenance/work-orders/index/new.hbs +1 -2
  252. package/addon/templates/maintenance/work-orders.hbs +0 -1
  253. package/addon/templates/management/contacts/customers/edit.hbs +1 -2
  254. package/addon/templates/management/contacts/customers/new.hbs +1 -2
  255. package/addon/templates/management/contacts/customers.hbs +1 -1
  256. package/addon/templates/management/contacts/index/edit.hbs +1 -2
  257. package/addon/templates/management/contacts/index/new.hbs +1 -2
  258. package/addon/templates/management/drivers/index/details/orders.hbs +0 -1
  259. package/addon/templates/management/drivers/index/edit.hbs +1 -2
  260. package/addon/templates/management/drivers/index/new.hbs +1 -2
  261. package/addon/templates/management/fleets/index/edit.hbs +1 -2
  262. package/addon/templates/management/fleets/index/new.hbs +1 -2
  263. package/addon/templates/management/fleets/index.hbs +1 -2
  264. package/addon/templates/management/fuel-reports/index/edit.hbs +1 -2
  265. package/addon/templates/management/fuel-reports/index/new.hbs +1 -2
  266. package/addon/templates/management/fuel-reports/index.hbs +1 -2
  267. package/addon/templates/management/issues/index/edit.hbs +1 -2
  268. package/addon/templates/management/issues/index/new.hbs +1 -2
  269. package/addon/templates/management/issues/index.hbs +1 -2
  270. package/addon/templates/management/places/index/details/activity.hbs +0 -1
  271. package/addon/templates/management/places/index/details/comments.hbs +0 -1
  272. package/addon/templates/management/places/index/details/documents.hbs +0 -1
  273. package/addon/templates/management/places/index/details/map.hbs +0 -1
  274. package/addon/templates/management/places/index/details/operations.hbs +0 -1
  275. package/addon/templates/management/places/index/details/performance.hbs +0 -1
  276. package/addon/templates/management/places/index/details/rules.hbs +0 -1
  277. package/addon/templates/management/vehicles/index/details/equipment.hbs +0 -1
  278. package/addon/templates/management/vehicles/index/details/maintenance-history.hbs +2 -0
  279. package/addon/templates/management/vehicles/index/details/schedules.hbs +2 -0
  280. package/addon/templates/management/vehicles/index/details/work-orders.hbs +2 -0
  281. package/addon/templates/management/vehicles/index/details.hbs +1 -1
  282. package/addon/templates/management/vehicles/index/edit.hbs +1 -2
  283. package/addon/templates/management/vehicles/index/new.hbs +1 -2
  284. package/addon/templates/management/vendors/index/edit.hbs +1 -2
  285. package/addon/templates/management/vendors/index/new.hbs +1 -2
  286. package/addon/templates/management/vendors/index.hbs +1 -2
  287. package/addon/templates/management/vendors/integrated.hbs +1 -2
  288. package/addon/templates/operations/orchestrator.hbs +1 -0
  289. package/addon/templates/operations/orders/index/details/virtual.hbs +1 -0
  290. package/addon/templates/operations/orders/index.hbs +6 -1
  291. package/addon/templates/operations/scheduler/fleet-schedule.hbs +41 -0
  292. package/addon/templates/operations/scheduler/index.hbs +147 -88
  293. package/addon/templates/operations/scheduler.hbs +7 -1
  294. package/addon/templates/settings/avatars.hbs +1 -1
  295. package/addon/templates/settings/orchestrator.hbs +65 -0
  296. package/addon/templates/settings/payments/index.hbs +1 -5
  297. package/addon/templates/settings/scheduling.hbs +82 -0
  298. package/addon/utils/create-full-calendar-event-from-order.js +52 -14
  299. package/addon/utils/create-full-calendar-event-from-schedule-item.js +50 -0
  300. package/addon/utils/fleet-ops-options.js +254 -0
  301. package/addon/utils/route-colors.js +99 -0
  302. package/addon/utils/to-calendar-date.js +70 -0
  303. package/app/components/driver/schedule.js +1 -0
  304. package/app/components/maintenance/cost-panel.js +1 -0
  305. package/app/components/maintenance/panel-header.js +1 -0
  306. package/app/components/maintenance-schedule/details.js +1 -0
  307. package/app/components/maintenance-schedule/form.js +1 -0
  308. package/app/components/modals/add-driver-shift.js +1 -0
  309. package/app/components/modals/bulk-assign-orders.js +1 -0
  310. package/app/components/modals/driver-shift.js +1 -0
  311. package/app/components/modals/orchestrator-import.js +1 -0
  312. package/app/components/modals/scheduling-conflict.js +1 -0
  313. package/app/components/modals/send-work-order.js +1 -0
  314. package/app/components/modals/set-driver-availability.js +1 -0
  315. package/app/components/orchestrator/card-fields-settings.js +1 -0
  316. package/app/components/orchestrator/order-pool.js +1 -0
  317. package/app/components/orchestrator/phase-builder.js +1 -0
  318. package/app/components/orchestrator/plan-viewer.js +1 -0
  319. package/app/components/orchestrator/resource-panel.js +1 -0
  320. package/app/components/orchestrator-workbench.js +1 -0
  321. package/app/components/vehicle/details/maintenance-history.js +1 -0
  322. package/app/components/vehicle/details/schedules.js +1 -0
  323. package/app/components/vehicle/details/work-orders.js +1 -0
  324. package/app/controllers/operations/orchestrator.js +1 -0
  325. package/app/controllers/settings/orchestrator.js +1 -0
  326. package/app/controllers/settings/scheduling.js +1 -0
  327. package/app/routes/operations/orchestrator.js +1 -0
  328. package/app/routes/operations/orders/index/details/virtual.js +1 -0
  329. package/app/routes/settings/orchestrator.js +1 -0
  330. package/app/routes/settings/scheduling.js +1 -0
  331. package/app/services/maintenance-schedule-actions.js +1 -0
  332. package/app/services/orchestration-engine-interface.js +1 -0
  333. package/app/services/orchestration-engine.js +1 -0
  334. package/app/services/order-allocation.js +1 -0
  335. package/app/services/scheduling.js +1 -0
  336. package/app/services/vroom-allocation-engine.js +1 -0
  337. package/app/templates/operations/orders/index/details/virtual.js +1 -0
  338. package/app/templates/settings/scheduling.js +1 -0
  339. package/app/utils/create-full-calendar-event-from-schedule-item.js +1 -0
  340. package/app/utils/route-colors.js +1 -0
  341. package/composer.json +5 -3
  342. package/extension.json +1 -1
  343. package/package.json +6 -5
  344. package/server/config/fleetops.php +20 -1
  345. package/server/migrations/2025_08_28_054927_create_parts_table.php +2 -2
  346. package/server/migrations/2025_08_28_054932_add_public_id_to_maintenance_tables.php +45 -0
  347. package/server/migrations/2025_09_01_000001_create_maintenance_schedules_table.php +88 -0
  348. package/server/migrations/2026_04_01_000001_fix_monetary_columns_in_parts_table.php +48 -0
  349. package/server/migrations/2026_04_01_000003_add_photo_uuid_to_equipment_and_parts_tables.php +61 -0
  350. package/server/migrations/2026_04_01_000004_add_public_id_to_equipments_table.php +38 -0
  351. package/server/migrations/2026_04_01_000005_add_missing_columns_to_parts_table.php +67 -0
  352. package/server/migrations/2026_04_04_000001_add_reminder_offsets_to_maintenance_schedules.php +44 -0
  353. package/server/migrations/2026_04_08_000001_add_orchestrator_columns_to_vehicles_table.php +58 -0
  354. package/server/migrations/2026_04_08_000002_add_orchestrator_columns_to_drivers_table.php +41 -0
  355. package/server/migrations/2026_04_08_000003_add_orchestrator_columns_to_orders_table.php +38 -0
  356. package/server/migrations/2026_04_08_000004_add_orchestrator_columns_to_payloads_table.php +41 -0
  357. package/server/migrations/2026_04_08_000005_add_orchestrator_columns_to_waypoints_table.php +38 -0
  358. package/server/migrations/2026_04_09_000001_create_manifests_table.php +48 -0
  359. package/server/migrations/2026_04_09_000002_create_manifest_stops_table.php +48 -0
  360. package/server/migrations/2026_04_09_000003_add_manifest_uuid_to_orders_table.php +28 -0
  361. package/server/migrations/2026_04_13_000001_add_pod_notes_columns_to_waypoints_table.php +39 -0
  362. package/server/resources/views/mail/maintenance-schedule-reminder.blade.php +59 -0
  363. package/server/resources/views/mail/work-order-dispatched.blade.php +67 -0
  364. package/server/src/Auth/Schemas/FleetOps.php +44 -0
  365. package/server/src/Console/Commands/ProcessMaintenanceTriggers.php +150 -0
  366. package/server/src/Console/Commands/SendMaintenanceReminders.php +128 -0
  367. package/server/src/Http/Controllers/Internal/v1/DriverController.php +1 -0
  368. package/server/src/Http/Controllers/Internal/v1/EquipmentController.php +27 -0
  369. package/server/src/Http/Controllers/Internal/v1/LiveController.php +9 -2
  370. package/server/src/Http/Controllers/Internal/v1/MaintenanceController.php +165 -0
  371. package/server/src/Http/Controllers/Internal/v1/MaintenanceScheduleController.php +304 -0
  372. package/server/src/Http/Controllers/Internal/v1/ManifestController.php +138 -0
  373. package/server/src/Http/Controllers/Internal/v1/OrchestrationController.php +975 -0
  374. package/server/src/Http/Controllers/Internal/v1/OrderController.php +42 -0
  375. package/server/src/Http/Controllers/Internal/v1/PartController.php +27 -0
  376. package/server/src/Http/Controllers/Internal/v1/SettingController.php +118 -0
  377. package/server/src/Http/Controllers/Internal/v1/Traits/DriverSchedulingTrait.php +214 -0
  378. package/server/src/Http/Controllers/Internal/v1/WorkOrderController.php +68 -0
  379. package/server/src/Http/Resources/v1/Driver.php +1 -0
  380. package/server/src/Http/Resources/v1/Maintenance.php +138 -0
  381. package/server/src/Http/Resources/v1/MaintenanceSchedule.php +137 -0
  382. package/server/src/Http/Resources/v1/Orchestrator/Order.php +116 -0
  383. package/server/src/Http/Resources/v1/Order.php +7 -4
  384. package/server/src/Http/Resources/v1/Waypoint.php +7 -0
  385. package/server/src/Http/Resources/v1/WorkOrder.php +136 -0
  386. package/server/src/Imports/EquipmentImport.php +32 -0
  387. package/server/src/Imports/MaintenanceImport.php +32 -0
  388. package/server/src/Imports/MaintenanceScheduleImport.php +32 -0
  389. package/server/src/Imports/PartImport.php +32 -0
  390. package/server/src/Imports/WorkOrderImport.php +32 -0
  391. package/server/src/Jobs/ProcessAllocationJob.php +119 -0
  392. package/server/src/Listeners/HandleDeliveryCompletion.php +47 -0
  393. package/server/src/Listeners/NotifyDriverOnShiftChange.php +63 -0
  394. package/server/src/Mail/MaintenanceScheduleReminder.php +68 -0
  395. package/server/src/Mail/WorkOrderDispatched.php +58 -0
  396. package/server/src/Models/Asset.php +2 -2
  397. package/server/src/Models/Device.php +1 -1
  398. package/server/src/Models/Driver.php +82 -4
  399. package/server/src/Models/Equipment.php +62 -2
  400. package/server/src/Models/Maintenance.php +127 -9
  401. package/server/src/Models/MaintenanceSchedule.php +353 -0
  402. package/server/src/Models/Manifest.php +214 -0
  403. package/server/src/Models/ManifestStop.php +162 -0
  404. package/server/src/Models/Order.php +70 -0
  405. package/server/src/Models/OrderConfig.php +5 -2
  406. package/server/src/Models/Part.php +69 -3
  407. package/server/src/Models/Payload.php +7 -2
  408. package/server/src/Models/Place.php +1 -1
  409. package/server/src/Models/Sensor.php +1 -1
  410. package/server/src/Models/ServiceQuote.php +1 -1
  411. package/server/src/Models/Vehicle.php +20 -1
  412. package/server/src/Models/Warranty.php +1 -1
  413. package/server/src/Models/Waypoint.php +7 -1
  414. package/server/src/Models/WorkOrder.php +122 -12
  415. package/server/src/Notifications/DriverShiftChanged.php +110 -0
  416. package/server/src/Observers/WorkOrderObserver.php +107 -0
  417. package/server/src/Orchestration/Contracts/OrchestrationEngineInterface.php +63 -0
  418. package/server/src/Orchestration/Engines/DriverAssignmentEngine.php +265 -0
  419. package/server/src/Orchestration/Engines/GreedyOrchestrationEngine.php +155 -0
  420. package/server/src/Orchestration/Engines/RouteSequencingEngine.php +272 -0
  421. package/server/src/Orchestration/Engines/VroomOrchestrationEngine.php +192 -0
  422. package/server/src/Orchestration/OrchestrationEngineRegistry.php +83 -0
  423. package/server/src/Orchestration/Support/OrchestrationPayloadBuilder.php +290 -0
  424. package/server/src/Providers/EventServiceProvider.php +7 -1
  425. package/server/src/Providers/FleetOpsServiceProvider.php +42 -15
  426. package/server/src/routes.php +65 -4
  427. package/translations/ar-ae.yml +44 -12
  428. package/translations/bg-bg.yaml +51 -10
  429. package/translations/en-us.yaml +444 -1
  430. package/translations/fr-fr.yaml +51 -10
  431. package/translations/mn-mn.yaml +51 -10
  432. package/translations/pt-br.yaml +51 -10
  433. package/translations/ru-ru.yaml +51 -10
  434. package/translations/vi-vn.yaml +48 -12
@@ -164,7 +164,7 @@ class Warranty extends Model
164
164
 
165
165
  public function subject(): MorphTo
166
166
  {
167
- return $this->morphTo();
167
+ return $this->morphTo(__FUNCTION__, 'subject_type', 'subject_uuid');
168
168
  }
169
169
 
170
170
  /**
@@ -51,7 +51,7 @@ class Waypoint extends Model
51
51
  *
52
52
  * @var array
53
53
  */
54
- protected $fillable = ['_key', '_import_id', 'company_uuid', 'payload_uuid', 'place_uuid', 'tracking_number_uuid', 'customer_uuid', 'customer_type', 'type', 'order'];
54
+ protected $fillable = ['_key', '_import_id', 'company_uuid', 'payload_uuid', 'place_uuid', 'tracking_number_uuid', 'customer_uuid', 'customer_type', 'type', 'order', 'time_window_start', 'time_window_end', 'service_time', 'notes', 'pod_method', 'pod_required'];
55
55
 
56
56
  /**
57
57
  * Dynamic attributes that are appended to object.
@@ -81,6 +81,12 @@ class Waypoint extends Model
81
81
  */
82
82
  protected $casts = [
83
83
  'customer_type' => PolymorphicType::class,
84
+ // Orchestrator
85
+ 'time_window_start' => 'datetime',
86
+ 'time_window_end' => 'datetime',
87
+ 'service_time' => 'integer',
88
+ // Per-stop POD and notes (mirrors order-level fields)
89
+ 'pod_required' => 'boolean',
84
90
  ];
85
91
 
86
92
  /**
@@ -3,7 +3,9 @@
3
3
  namespace Fleetbase\FleetOps\Models;
4
4
 
5
5
  use Fleetbase\Casts\Json;
6
+ use Fleetbase\Casts\Money;
6
7
  use Fleetbase\Casts\PolymorphicType;
8
+ use Fleetbase\FleetOps\Support\Utils;
7
9
  use Fleetbase\Models\File;
8
10
  use Fleetbase\Models\Model;
9
11
  use Fleetbase\Models\User;
@@ -17,6 +19,7 @@ use Fleetbase\Traits\TracksApiCredential;
17
19
  use Illuminate\Database\Eloquent\Relations\BelongsTo;
18
20
  use Illuminate\Database\Eloquent\Relations\HasMany;
19
21
  use Illuminate\Database\Eloquent\Relations\MorphTo;
22
+ use Illuminate\Support\Str;
20
23
  use Spatie\Activitylog\LogOptions;
21
24
  use Spatie\Activitylog\Traits\LogsActivity;
22
25
 
@@ -85,10 +88,30 @@ class WorkOrder extends Model
85
88
  'closed_at',
86
89
  'instructions',
87
90
  'checklist',
91
+ 'estimated_cost',
92
+ 'approved_budget',
93
+ 'actual_cost',
94
+ 'currency',
95
+ 'cost_breakdown',
96
+ 'cost_center',
97
+ 'budget_code',
88
98
  'meta',
89
- 'slug',
90
99
  ];
91
100
 
101
+ /**
102
+ * Boot the model.
103
+ */
104
+ public static function boot(): void
105
+ {
106
+ parent::boot();
107
+
108
+ static::creating(function ($model) {
109
+ if (empty($model->code)) {
110
+ $model->code = 'WO-' . strtoupper(Str::random(8));
111
+ }
112
+ });
113
+ }
114
+
92
115
  /**
93
116
  * Dynamic attributes that are appended to object.
94
117
  *
@@ -104,11 +127,11 @@ class WorkOrder extends Model
104
127
  ];
105
128
 
106
129
  /**
107
- * The attributes excluded from the model's JSON form.
130
+ * Relationships to always eager load.
108
131
  *
109
132
  * @var array
110
133
  */
111
- protected $hidden = ['target', 'assignee'];
134
+ protected $with = ['target', 'assignee'];
112
135
 
113
136
  /**
114
137
  * The attributes that should be cast to native types.
@@ -116,13 +139,18 @@ class WorkOrder extends Model
116
139
  * @var array
117
140
  */
118
141
  protected $casts = [
119
- 'opened_at' => 'datetime',
120
- 'due_at' => 'datetime',
121
- 'closed_at' => 'datetime',
122
- 'checklist' => Json::class,
123
- 'meta' => Json::class,
124
- 'target_type' => PolymorphicType::class,
125
- 'assignee_type' => PolymorphicType::class,
142
+ 'opened_at' => 'datetime',
143
+ 'due_at' => 'datetime',
144
+ 'closed_at' => 'datetime',
145
+ 'checklist' => Json::class,
146
+ 'cost_breakdown' => Json::class,
147
+ 'meta' => Json::class,
148
+ 'target_type' => PolymorphicType::class,
149
+ 'assignee_type' => PolymorphicType::class,
150
+ // Money values
151
+ 'estimated_cost' => Money::class,
152
+ 'approved_budget' => Money::class,
153
+ 'actual_cost' => Money::class,
126
154
  ];
127
155
 
128
156
  /**
@@ -166,12 +194,12 @@ class WorkOrder extends Model
166
194
 
167
195
  public function target(): MorphTo
168
196
  {
169
- return $this->morphTo();
197
+ return $this->morphTo(__FUNCTION__, 'target_type', 'target_uuid');
170
198
  }
171
199
 
172
200
  public function assignee(): MorphTo
173
201
  {
174
- return $this->morphTo();
202
+ return $this->morphTo(__FUNCTION__, 'assignee_type', 'assignee_uuid');
175
203
  }
176
204
 
177
205
  public function maintenances(): HasMany
@@ -532,4 +560,86 @@ class WorkOrder extends Model
532
560
  return 1;
533
561
  }
534
562
  }
563
+
564
+ /**
565
+ * Create a WorkOrder instance from an import row.
566
+ *
567
+ * Monetary values (estimated_cost, approved_budget, actual_cost) must be supplied in cents.
568
+ * The Money cast will strip non-numeric characters before storage.
569
+ *
570
+ * @param array $row Associative array from the import spreadsheet
571
+ * @param bool $saveInstance Whether to persist the record immediately
572
+ */
573
+ public static function createFromImport(array $row, bool $saveInstance = false): WorkOrder
574
+ {
575
+ $row = array_filter($row);
576
+
577
+ $subject = Utils::or($row, ['subject', 'title', 'name']);
578
+ $status = Utils::or($row, ['status'], 'open');
579
+ $priority = Utils::or($row, ['priority'], 'normal');
580
+ $instructions = Utils::or($row, ['instructions', 'description', 'notes']);
581
+ $openedAt = Utils::or($row, ['opened_at', 'open_date']);
582
+ $dueAt = Utils::or($row, ['due_at', 'due_date']);
583
+ $estimatedCost = Utils::or($row, ['estimated_cost']);
584
+ $approvedBudget = Utils::or($row, ['approved_budget', 'budget']);
585
+ $actualCost = Utils::or($row, ['actual_cost']);
586
+ $currency = Utils::or($row, ['currency'], 'USD');
587
+ $costCenter = Utils::or($row, ['cost_center']);
588
+ $budgetCode = Utils::or($row, ['budget_code']);
589
+ $vehicleName = Utils::or($row, ['vehicle', 'vehicle_name', 'asset', 'target']);
590
+ $vendorName = Utils::or($row, ['vendor', 'vendor_name', 'assignee']);
591
+
592
+ $workOrder = new static([
593
+ 'company_uuid' => session('company'),
594
+ 'subject' => $subject,
595
+ 'status' => $status,
596
+ 'priority' => $priority,
597
+ 'instructions' => $instructions,
598
+ 'opened_at' => $openedAt ? \Carbon\Carbon::parse($openedAt) : now(),
599
+ 'due_at' => $dueAt ? \Carbon\Carbon::parse($dueAt) : null,
600
+ 'estimated_cost' => $estimatedCost,
601
+ 'approved_budget' => $approvedBudget,
602
+ 'actual_cost' => $actualCost,
603
+ 'currency' => strtoupper($currency ?? 'USD'),
604
+ 'cost_center' => $costCenter,
605
+ 'budget_code' => $budgetCode,
606
+ ]);
607
+
608
+ // Attempt to resolve the target (vehicle or equipment) by identifier
609
+ if ($vehicleName) {
610
+ $vehicle = Vehicle::findByName($vehicleName);
611
+ if ($vehicle) {
612
+ $workOrder->target_type = Vehicle::class;
613
+ $workOrder->target_uuid = $vehicle->uuid;
614
+ } else {
615
+ $equipment = Equipment::where('company_uuid', session('company'))
616
+ ->where(function ($q) use ($vehicleName) {
617
+ $q->where('name', 'like', '%' . $vehicleName . '%')
618
+ ->orWhere('public_id', $vehicleName)
619
+ ->orWhere('serial_number', $vehicleName);
620
+ })->first();
621
+ if ($equipment) {
622
+ $workOrder->target_type = Equipment::class;
623
+ $workOrder->target_uuid = $equipment->uuid;
624
+ }
625
+ }
626
+ }
627
+
628
+ // Attempt to resolve assignee (vendor) by name
629
+ if ($vendorName) {
630
+ $vendor = Vendor::where('company_uuid', session('company'))
631
+ ->where('name', 'like', '%' . $vendorName . '%')
632
+ ->first();
633
+ if ($vendor) {
634
+ $workOrder->assignee_type = Vendor::class;
635
+ $workOrder->assignee_uuid = $vendor->uuid;
636
+ }
637
+ }
638
+
639
+ if ($saveInstance === true) {
640
+ $workOrder->save();
641
+ }
642
+
643
+ return $workOrder;
644
+ }
535
645
  }
@@ -0,0 +1,110 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Notifications;
4
+
5
+ use Fleetbase\Models\ScheduleItem;
6
+ use Fleetbase\Support\Utils;
7
+ use Illuminate\Bus\Queueable;
8
+ use Illuminate\Contracts\Queue\ShouldQueue;
9
+ use Illuminate\Notifications\Messages\MailMessage;
10
+ use Illuminate\Notifications\Notification;
11
+
12
+ class DriverShiftChanged extends Notification implements ShouldQueue
13
+ {
14
+ use Queueable;
15
+
16
+ /**
17
+ * The schedule item that was created or updated.
18
+ */
19
+ public ScheduleItem $scheduleItem;
20
+
21
+ /**
22
+ * Whether this is a new shift (created) or an update to an existing one.
23
+ */
24
+ public bool $isNew;
25
+
26
+ /**
27
+ * Notification name.
28
+ */
29
+ public static string $name = 'Driver Shift Changed';
30
+
31
+ /**
32
+ * Notification description.
33
+ */
34
+ public static string $description = 'Notify a driver when their shift schedule is created or updated.';
35
+
36
+ /**
37
+ * Notification package.
38
+ */
39
+ public static string $package = 'fleet-ops';
40
+
41
+ /**
42
+ * The notification title.
43
+ */
44
+ public string $title;
45
+
46
+ /**
47
+ * The notification body.
48
+ */
49
+ public string $message;
50
+
51
+ /**
52
+ * Create a new notification instance.
53
+ */
54
+ public function __construct(ScheduleItem $scheduleItem, bool $isNew = true)
55
+ {
56
+ $this->scheduleItem = $scheduleItem;
57
+ $this->isNew = $isNew;
58
+
59
+ $start = $scheduleItem->start_at ? $scheduleItem->start_at->format('D, M j g:ia') : '—';
60
+ $end = $scheduleItem->end_at ? $scheduleItem->end_at->format('g:ia') : '—';
61
+
62
+ if ($isNew) {
63
+ $this->title = 'New shift scheduled';
64
+ $this->message = "A new shift has been added to your schedule: {$start} – {$end}.";
65
+ } else {
66
+ $this->title = 'Your shift has been updated';
67
+ $this->message = "Your shift has been updated: {$start} – {$end}.";
68
+ }
69
+ }
70
+
71
+ /**
72
+ * Get the notification's delivery channels.
73
+ */
74
+ public function via($notifiable): array
75
+ {
76
+ return ['mail'];
77
+ }
78
+
79
+ /**
80
+ * Build the mail representation of the notification.
81
+ */
82
+ public function toMail($notifiable): MailMessage
83
+ {
84
+ $message = (new MailMessage())
85
+ ->subject($this->title)
86
+ ->line($this->message);
87
+
88
+ if ($this->scheduleItem->notes) {
89
+ $message->line('Notes: ' . $this->scheduleItem->notes);
90
+ }
91
+
92
+ $message->action('View Schedule', Utils::consoleUrl('fleet-ops/operations/scheduler'));
93
+
94
+ return $message;
95
+ }
96
+
97
+ /**
98
+ * Get the array representation of the notification.
99
+ */
100
+ public function toArray($notifiable): array
101
+ {
102
+ return [
103
+ 'id' => $this->scheduleItem->public_id,
104
+ 'type' => 'driver_shift_changed',
105
+ 'is_new' => $this->isNew,
106
+ 'start_at' => $this->scheduleItem->start_at,
107
+ 'end_at' => $this->scheduleItem->end_at,
108
+ ];
109
+ }
110
+ }
@@ -0,0 +1,107 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Observers;
4
+
5
+ use Fleetbase\FleetOps\Models\Maintenance;
6
+ use Fleetbase\FleetOps\Models\MaintenanceSchedule;
7
+ use Fleetbase\FleetOps\Models\WorkOrder;
8
+
9
+ /**
10
+ * WorkOrderObserver.
11
+ *
12
+ * Listens for status transitions on WorkOrder records. When a work order is
13
+ * closed (completed), this observer:
14
+ *
15
+ * 1. Automatically creates a Maintenance (history) record from the work order's
16
+ * data and any completion metadata captured in the work order's meta field.
17
+ * 2. Resets the linked MaintenanceSchedule's next-due thresholds so the cycle
18
+ * restarts from the completion point.
19
+ * 3. Dispatches a `work_order.completed` event for downstream integrations.
20
+ */
21
+ class WorkOrderObserver
22
+ {
23
+ /**
24
+ * Handle the WorkOrder "updated" event.
25
+ * We intercept the status transition to "closed" here rather than in a
26
+ * dedicated "closed" event because Eloquent does not have a per-value event.
27
+ */
28
+ public function updated(WorkOrder $workOrder): void
29
+ {
30
+ // Only act when the status has just changed to "closed"
31
+ if (!$workOrder->wasChanged('status') || $workOrder->status !== 'closed') {
32
+ return;
33
+ }
34
+
35
+ $this->createMaintenanceRecord($workOrder);
36
+ $this->resetSchedule($workOrder);
37
+
38
+ event('work_order.completed', $workOrder);
39
+ }
40
+
41
+ // -------------------------------------------------------------------------
42
+ // Private helpers
43
+ // -------------------------------------------------------------------------
44
+
45
+ /**
46
+ * Create a Maintenance history record from the completed work order.
47
+ */
48
+ private function createMaintenanceRecord(WorkOrder $workOrder): void
49
+ {
50
+ // Avoid duplicate records if one was already manually created for this WO
51
+ if (Maintenance::where('work_order_uuid', $workOrder->uuid)->exists()) {
52
+ return;
53
+ }
54
+
55
+ $meta = $workOrder->meta ?? [];
56
+ $completionData = $meta['completion_data'] ?? [];
57
+
58
+ Maintenance::create([
59
+ 'company_uuid' => $workOrder->company_uuid,
60
+ 'work_order_uuid' => $workOrder->uuid,
61
+ 'maintainable_type' => $workOrder->target_type,
62
+ 'maintainable_uuid' => $workOrder->target_uuid,
63
+ 'type' => 'scheduled',
64
+ 'status' => 'done',
65
+ 'priority' => $workOrder->priority,
66
+ 'scheduled_at' => $workOrder->opened_at,
67
+ 'completed_at' => $workOrder->closed_at ?? now(),
68
+ 'performed_by_type' => $workOrder->assignee_type,
69
+ 'performed_by_uuid' => $workOrder->assignee_uuid,
70
+ 'summary' => $workOrder->subject,
71
+ 'notes' => $completionData['notes'] ?? null,
72
+ 'odometer' => $completionData['odometer'] ?? null,
73
+ 'engine_hours' => $completionData['engine_hours'] ?? null,
74
+ 'labor_cost' => $completionData['labor_cost'] ?? null,
75
+ 'parts_cost' => $completionData['parts_cost'] ?? null,
76
+ 'tax' => $completionData['tax'] ?? null,
77
+ 'total_cost' => $completionData['total_cost'] ?? null,
78
+ 'currency' => $completionData['currency'] ?? null,
79
+ 'line_items' => $completionData['line_items'] ?? null,
80
+ 'created_by_uuid' => $workOrder->created_by_uuid,
81
+ ]);
82
+ }
83
+
84
+ /**
85
+ * Reset the linked schedule's next-due thresholds after completion.
86
+ */
87
+ private function resetSchedule(WorkOrder $workOrder): void
88
+ {
89
+ if (!$workOrder->schedule_uuid) {
90
+ return;
91
+ }
92
+
93
+ $schedule = MaintenanceSchedule::where('uuid', $workOrder->schedule_uuid)->first();
94
+ if (!$schedule) {
95
+ return;
96
+ }
97
+
98
+ $meta = $workOrder->meta ?? [];
99
+ $completionData = $meta['completion_data'] ?? [];
100
+
101
+ $schedule->resetAfterCompletion(
102
+ odometer: isset($completionData['odometer']) ? (int) $completionData['odometer'] : null,
103
+ completedEngineHours: isset($completionData['engine_hours']) ? (int) $completionData['engine_hours'] : null,
104
+ completedAt: $workOrder->closed_at ?? now()
105
+ );
106
+ }
107
+ }
@@ -0,0 +1,63 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Orchestration\Contracts;
4
+
5
+ use Illuminate\Support\Collection;
6
+
7
+ /**
8
+ * OrchestrationEngineInterface.
9
+ *
10
+ * Defines the single contract that every orchestration/optimization engine must
11
+ * implement. The interface is intentionally minimal — engines receive a
12
+ * normalized set of jobs and vehicles and return a normalized result array.
13
+ * All engine-specific payload construction and response parsing is handled
14
+ * inside the concrete engine implementation, not by the caller.
15
+ *
16
+ * Third-party engines can be registered into the OrchestrationEngineRegistry
17
+ * from any Laravel service provider:
18
+ *
19
+ * app(OrchestrationEngineRegistry::class)->register(new MyEngine());
20
+ *
21
+ * The registered engine will then appear in the FleetOps orchestrator settings
22
+ * dropdown automatically.
23
+ */
24
+ interface OrchestrationEngineInterface
25
+ {
26
+ /**
27
+ * Run the allocation/optimization algorithm.
28
+ *
29
+ * @param Collection $orders collection of Order models to allocate
30
+ * @param Collection $vehicles collection of Vehicle models (with loaded driver)
31
+ * @param array $options Engine-specific options (e.g. max_travel_time,
32
+ * balance_workload, geometry). Keys are defined
33
+ * per-engine; unknown keys MUST be silently ignored.
34
+ *
35
+ * @return array{
36
+ * assignments: array<array{order_id: string, vehicle_id: string, driver_id: string, sequence: int}>,
37
+ * unassigned: array<string>,
38
+ * summary: array<string, mixed>
39
+ * }
40
+ *
41
+ * The returned array MUST contain:
42
+ * - assignments: ordered list of {order_id, vehicle_id, driver_id, sequence}
43
+ * - unassigned: list of order public_ids that could not be assigned
44
+ * - summary: engine-specific metadata (duration, distance, cost, etc.)
45
+ */
46
+ public function allocate(Collection $orders, Collection $vehicles, array $options = []): array;
47
+
48
+ /**
49
+ * Return the human-readable display name for this engine.
50
+ * Used in the settings UI dropdown.
51
+ *
52
+ * @return string e.g. "VROOM", "Google OR-Tools", "Custom Solver"
53
+ */
54
+ public function getName(): string;
55
+
56
+ /**
57
+ * Return the machine-readable identifier for this engine.
58
+ * Must be unique across all registered engines.
59
+ *
60
+ * @return string e.g. "vroom", "or-tools", "custom"
61
+ */
62
+ public function getIdentifier(): string;
63
+ }