@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,21 @@
1
+ import Controller from '@ember/controller';
2
+ import { inject as service } from '@ember/service';
3
+
4
+ export default class OperationsSchedulerController extends Controller {
5
+ @service intl;
6
+
7
+ get tabs() {
8
+ return [
9
+ {
10
+ route: 'operations.scheduler.index',
11
+ label: this.intl.t('scheduler.orders-tab'),
12
+ icon: 'box',
13
+ },
14
+ {
15
+ route: 'operations.scheduler.fleet-schedule',
16
+ label: this.intl.t('scheduler.fleet-schedule-tab'),
17
+ icon: 'calendar-week',
18
+ },
19
+ ];
20
+ }
21
+ }
@@ -0,0 +1,70 @@
1
+ import Controller from '@ember/controller';
2
+ import { inject as service } from '@ember/service';
3
+ import { tracked } from '@glimmer/tracking';
4
+ import { action } from '@ember/object';
5
+ import { task } from 'ember-concurrency';
6
+
7
+ /**
8
+ * Settings::OrchestratorController
9
+ *
10
+ * Manages the Orchestrator settings page at /settings/orchestrator.
11
+ * Loads current settings, presents the engine selector dropdown (populated
12
+ * from the allocation-engine registry), and saves changes.
13
+ */
14
+ export default class SettingsOrchestratorController extends Controller {
15
+ @service fetch;
16
+ @service notifications;
17
+ @service intl;
18
+ @service('orchestration-engine') engineRegistry;
19
+
20
+ @tracked allocationEngine = 'vroom';
21
+ @tracked autoAllocateOnCreate = false;
22
+ @tracked autoReallocateOnComplete = false;
23
+ @tracked maxTravelTimeSeconds = 3600;
24
+ @tracked balanceWorkload = false;
25
+ @tracked isLoading = false;
26
+
27
+ /**
28
+ * Engine options for the selector dropdown.
29
+ * Populated from the allocation-engine registry so new engines appear
30
+ * automatically without modifying this controller.
31
+ */
32
+ get engineOptions() {
33
+ return this.engineRegistry.availableEngines;
34
+ }
35
+
36
+ @task *loadSettings() {
37
+ this.isLoading = true;
38
+ try {
39
+ const settings = yield this.fetch.get('fleet-ops/settings/orchestrator-settings');
40
+ this.allocationEngine = settings.allocation_engine ?? 'vroom';
41
+ this.autoAllocateOnCreate = settings.auto_allocate_on_create ?? false;
42
+ this.autoReallocateOnComplete = settings.auto_reallocate_on_complete ?? false;
43
+ this.maxTravelTimeSeconds = settings.max_travel_time_seconds ?? 3600;
44
+ this.balanceWorkload = settings.balance_workload ?? false;
45
+ } catch (error) {
46
+ this.notifications.serverError(error);
47
+ } finally {
48
+ this.isLoading = false;
49
+ }
50
+ }
51
+
52
+ @task *saveSettings() {
53
+ try {
54
+ yield this.fetch.post('fleet-ops/settings/orchestrator-settings', {
55
+ allocation_engine: this.allocationEngine,
56
+ auto_allocate_on_create: this.autoAllocateOnCreate,
57
+ auto_reallocate_on_complete: this.autoReallocateOnComplete,
58
+ max_travel_time_seconds: this.maxTravelTimeSeconds,
59
+ balance_workload: this.balanceWorkload,
60
+ });
61
+ this.notifications.success(this.intl.t('orchestrator.settings-saved'));
62
+ } catch (error) {
63
+ this.notifications.serverError(error);
64
+ }
65
+ }
66
+
67
+ @action selectEngine(engine) {
68
+ this.allocationEngine = engine.id;
69
+ }
70
+ }
@@ -0,0 +1,155 @@
1
+ import Controller from '@ember/controller';
2
+ import { tracked } from '@glimmer/tracking';
3
+ import { inject as service } from '@ember/service';
4
+ import { action } from '@ember/object';
5
+ import { task } from 'ember-concurrency';
6
+
7
+ /**
8
+ * Settings::SchedulingController
9
+ *
10
+ * Manages global scheduling settings for Fleet-Ops:
11
+ * - Default schedule horizon (how many days ahead to materialise shifts)
12
+ * - Default shift duration
13
+ * - HOS (Hours of Service) daily/weekly limits
14
+ * - Whether to auto-activate schedules on first shift creation
15
+ * - Whether to notify drivers of new/changed shifts
16
+ * - Reusable schedule templates library
17
+ */
18
+ export default class SettingsSchedulingController extends Controller {
19
+ @service fetch;
20
+ @service notifications;
21
+ @service intl;
22
+ @service store;
23
+ @service modalsManager;
24
+
25
+ /** How many days ahead to materialise schedule items (default 60) */
26
+ @tracked horizonDays = 60;
27
+
28
+ /** Default shift duration in hours (default 8) */
29
+ @tracked defaultShiftDuration = 8;
30
+
31
+ /** HOS daily driving limit in hours (default 11) */
32
+ @tracked hosDailyLimit = 11;
33
+
34
+ /** HOS weekly driving limit in hours (default 70) */
35
+ @tracked hosWeeklyLimit = 70;
36
+
37
+ /** Whether to auto-activate a draft schedule when the first shift is added */
38
+ @tracked autoActivateSchedule = true;
39
+
40
+ /** Whether to notify drivers when shifts are created or modified */
41
+ @tracked notifyDriversOnShiftChange = false;
42
+
43
+ /** Reusable (library) schedule templates */
44
+ @tracked scheduleTemplates = [];
45
+
46
+ get templateActionButtons() {
47
+ return [
48
+ {
49
+ type: 'primary',
50
+ icon: 'plus',
51
+ iconPrefix: 'fas',
52
+ text: this.intl.t('settings.scheduling.new-template'),
53
+ onClick: this.createTemplate,
54
+ },
55
+ ];
56
+ }
57
+
58
+ constructor() {
59
+ super(...arguments);
60
+ this.getSettings.perform();
61
+ this.loadTemplates.perform();
62
+ }
63
+
64
+ /**
65
+ * Load scheduling settings from the backend.
66
+ */
67
+ @task *getSettings() {
68
+ try {
69
+ const settings = yield this.fetch.get('fleet-ops/settings/scheduling-settings');
70
+ if (settings) {
71
+ this.horizonDays = settings.horizon_days ?? 60;
72
+ this.defaultShiftDuration = settings.default_shift_duration ?? 8;
73
+ this.hosDailyLimit = settings.hos_daily_limit ?? 11;
74
+ this.hosWeeklyLimit = settings.hos_weekly_limit ?? 70;
75
+ this.autoActivateSchedule = settings.auto_activate_schedule ?? true;
76
+ this.notifyDriversOnShiftChange = settings.notify_drivers_on_shift_change ?? false;
77
+ }
78
+ } catch {
79
+ // Settings may not exist yet — use defaults silently
80
+ }
81
+ }
82
+
83
+ /**
84
+ * Save scheduling settings to the backend.
85
+ */
86
+ @task *saveSettings() {
87
+ try {
88
+ yield this.fetch.post('fleet-ops/settings/scheduling-settings', {
89
+ horizon_days: this.horizonDays,
90
+ default_shift_duration: this.defaultShiftDuration,
91
+ hos_daily_limit: this.hosDailyLimit,
92
+ hos_weekly_limit: this.hosWeeklyLimit,
93
+ auto_activate_schedule: this.autoActivateSchedule,
94
+ notify_drivers_on_shift_change: this.notifyDriversOnShiftChange,
95
+ });
96
+ this.notifications.success(this.intl.t('settings.scheduling.settings-saved'));
97
+ } catch (error) {
98
+ this.notifications.serverError(error);
99
+ }
100
+ }
101
+
102
+ /**
103
+ * Load reusable (library) schedule templates — those without a subject_uuid.
104
+ */
105
+ @task *loadTemplates() {
106
+ try {
107
+ const templates = yield this.store.query('schedule-template', { is_library: true });
108
+ this.scheduleTemplates = templates.toArray();
109
+ } catch {
110
+ this.scheduleTemplates = [];
111
+ }
112
+ }
113
+
114
+ /**
115
+ * Open the create-template modal.
116
+ */
117
+ @action createTemplate() {
118
+ this.modalsManager.show('modals/add-driver-shift', {
119
+ title: this.intl.t('settings.scheduling.new-template'),
120
+ isLibraryTemplate: true,
121
+ onConfirm: () => this.loadTemplates.perform(),
122
+ });
123
+ }
124
+
125
+ /**
126
+ * Open the edit-template modal.
127
+ */
128
+ @action editTemplate(template) {
129
+ this.modalsManager.show('modals/add-driver-shift', {
130
+ title: this.intl.t('settings.scheduling.edit-template'),
131
+ isLibraryTemplate: true,
132
+ template,
133
+ onConfirm: () => this.loadTemplates.perform(),
134
+ });
135
+ }
136
+
137
+ /**
138
+ * Delete a schedule template after confirmation.
139
+ */
140
+ @action async deleteTemplate(template) {
141
+ await this.modalsManager.confirm({
142
+ title: this.intl.t('settings.scheduling.delete-template'),
143
+ body: this.intl.t('settings.scheduling.delete-template-confirm', { name: template.name }),
144
+ onConfirm: async () => {
145
+ try {
146
+ await template.destroyRecord();
147
+ this.scheduleTemplates = this.scheduleTemplates.filter((t) => t.id !== template.id);
148
+ this.notifications.success(this.intl.t('settings.scheduling.template-deleted'));
149
+ } catch (error) {
150
+ this.notifications.serverError(error);
151
+ }
152
+ },
153
+ });
154
+ }
155
+ }
@@ -60,6 +60,12 @@ export default {
60
60
  icon: 'chart-bar',
61
61
  route: 'console.fleet-ops.analytics.reports',
62
62
  },
63
+ {
64
+ title: 'Orchestrator',
65
+ description: 'Intelligently allocate and dispatch orders to available drivers.',
66
+ icon: 'diagram-project',
67
+ route: 'console.fleet-ops.operations.orchestrator',
68
+ },
63
69
  ],
64
70
  });
65
71
 
@@ -153,6 +159,18 @@ export default {
153
159
  'fleet-ops:component:issue:form:details',
154
160
  'fleet-ops:component:fuel-report:form',
155
161
  'fleet-ops:component:fuel-report:form:details',
162
+ 'fleet-ops:component:maintenance:form',
163
+ 'fleet-ops:component:maintenance:form:details',
164
+ 'fleet-ops:component:maintenance:details',
165
+ 'fleet-ops:component:work-order:form',
166
+ 'fleet-ops:component:work-order:form:details',
167
+ 'fleet-ops:component:work-order:details',
168
+ 'fleet-ops:component:equipment:form',
169
+ 'fleet-ops:component:equipment:form:details',
170
+ 'fleet-ops:component:equipment:details',
171
+ 'fleet-ops:component:part:form',
172
+ 'fleet-ops:component:part:form:details',
173
+ 'fleet-ops:component:part:details',
156
174
  'fleet-ops:contextmenu:vehicle',
157
175
  'fleet-ops:contextmenu:driver',
158
176
  'fleet-ops:component:order:details',
@@ -160,6 +178,7 @@ export default {
160
178
  'fleet-ops:component:order:form:payload:entity',
161
179
  'fleet-ops:component:order:form:payload:entity:form',
162
180
  'fleet-ops:template:settings:routing',
181
+ 'fleet-ops:template:settings:orchestrator',
163
182
  ]);
164
183
  },
165
184
  };
@@ -0,0 +1,27 @@
1
+ /**
2
+ * register-vroom-allocation
3
+ *
4
+ * Instance initializer that registers the VROOM orchestration engine adapter
5
+ * into the orchestration-engine registry service.
6
+ *
7
+ * This pattern is identical to how register-osrm.js registers the OSRM
8
+ * routing engine into the route-optimization registry.
9
+ *
10
+ * Third-party orchestration engines follow the same pattern:
11
+ * 1. Create a service extending OrchestrationEngineInterfaceService
12
+ * 2. Create an instance initializer that calls orchestrationEngine.register()
13
+ * 3. The engine will appear in the FleetOps orchestrator settings dropdown
14
+ */
15
+ export function initialize(appInstance) {
16
+ const orchestrationEngine = appInstance.lookup('service:orchestration-engine');
17
+ const vroomEngine = appInstance.lookup('service:vroom-allocation-engine');
18
+
19
+ if (orchestrationEngine && vroomEngine && !orchestrationEngine.has('vroom')) {
20
+ orchestrationEngine.register('vroom', vroomEngine);
21
+ }
22
+ }
23
+
24
+ export default {
25
+ name: 'register-vroom-allocation',
26
+ initialize,
27
+ };
@@ -0,0 +1,61 @@
1
+ import Model, { attr, belongsTo } from '@ember-data/model';
2
+
3
+ /**
4
+ * Local maintenance-schedule model used by the fleetops engine.
5
+ * The canonical model with full computed properties lives in fleetops-data.
6
+ * This local copy adds the polymorphic @belongsTo relationships so the
7
+ * engine's form and details components can use relationship accessors
8
+ * directly instead of raw _type / _uuid attrs.
9
+ */
10
+ export default class MaintenanceScheduleModel extends Model {
11
+ // Identification
12
+ @attr('string') public_id;
13
+ @attr('string') name;
14
+ @attr('string') type;
15
+ @attr('string') status;
16
+
17
+ // Polymorphic subject (the asset this schedule applies to)
18
+ @belongsTo('maintenance-subject', { polymorphic: true, async: false }) subject;
19
+
20
+ // Polymorphic default_assignee (who should be assigned to generated work orders)
21
+ @belongsTo('facilitator', { polymorphic: true, async: false }) default_assignee;
22
+
23
+ // Interval definition
24
+ @attr('string') interval_method;
25
+ @attr('string') interval_type;
26
+ @attr('number') interval_value;
27
+ @attr('string') interval_unit;
28
+ @attr('number') interval_distance;
29
+ @attr('number') interval_engine_hours;
30
+
31
+ // Baseline readings
32
+ @attr('number') last_service_odometer;
33
+ @attr('number') last_service_engine_hours;
34
+ @attr('date') last_service_date;
35
+
36
+ // Next-due thresholds
37
+ @attr('date') next_due_date;
38
+ @attr('number') next_due_odometer;
39
+ @attr('number') next_due_engine_hours;
40
+
41
+ // Work order defaults
42
+ @attr('string') default_priority;
43
+ @attr('string') instructions;
44
+ @attr() meta;
45
+
46
+ @attr('date') created_at;
47
+ @attr('date') updated_at;
48
+
49
+ // Computed display helpers
50
+ get nextDueDate() {
51
+ return this.next_due_date;
52
+ }
53
+
54
+ get isActive() {
55
+ return this.status === 'active';
56
+ }
57
+
58
+ get isPaused() {
59
+ return this.status === 'paused';
60
+ }
61
+ }
@@ -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 MaintenanceEquipmentIndexDetailsRoute extends Route {}
5
+ export default class MaintenanceEquipmentIndexDetailsRoute 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.equipment.index');
16
+ }
17
+ }
18
+
19
+ beforeModel() {
20
+ if (this.abilities.cannot('fleet-ops view equipment')) {
21
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
22
+ return this.hostRouter.transitionTo('maintenance.equipment.index');
23
+ }
24
+ }
25
+
26
+ model({ public_id }) {
27
+ return this.store.findRecord('equipment', 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 MaintenanceEquipmentIndexEditRoute extends Route {}
5
+ export default class MaintenanceEquipmentIndexEditRoute 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.equipment.index');
16
+ }
17
+ }
18
+
19
+ beforeModel() {
20
+ if (this.abilities.cannot('fleet-ops update equipment')) {
21
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
22
+ return this.hostRouter.transitionTo('maintenance.equipment.index');
23
+ }
24
+ }
25
+
26
+ model({ public_id }) {
27
+ return this.store.findRecord('equipment', public_id);
28
+ }
29
+ }
@@ -0,0 +1,3 @@
1
+ import Route from '@ember/routing/route';
2
+
3
+ export default class MaintenanceMaintenancesIndexDetailsIndexRoute extends Route {}
@@ -0,0 +1,29 @@
1
+ import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
3
+ import { action } from '@ember/object';
4
+
5
+ export default class MaintenanceMaintenancesIndexDetailsRoute 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.maintenances.index');
16
+ }
17
+ }
18
+
19
+ beforeModel() {
20
+ if (this.abilities.cannot('fleet-ops view maintenance')) {
21
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
22
+ return this.hostRouter.transitionTo('maintenance.maintenances.index');
23
+ }
24
+ }
25
+
26
+ model({ public_id }) {
27
+ return this.store.findRecord('maintenance', public_id);
28
+ }
29
+ }
@@ -0,0 +1,29 @@
1
+ import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
3
+ import { action } from '@ember/object';
4
+
5
+ export default class MaintenanceMaintenancesIndexEditRoute 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.maintenances.index');
16
+ }
17
+ }
18
+
19
+ beforeModel() {
20
+ if (this.abilities.cannot('fleet-ops update maintenance')) {
21
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
22
+ return this.hostRouter.transitionTo('maintenance.maintenances.index');
23
+ }
24
+ }
25
+
26
+ model({ public_id }) {
27
+ return this.store.findRecord('maintenance', public_id);
28
+ }
29
+ }
@@ -0,0 +1,3 @@
1
+ import Route from '@ember/routing/route';
2
+
3
+ export default class MaintenanceMaintenancesIndexNewRoute extends Route {}
@@ -0,0 +1,23 @@
1
+ import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
3
+
4
+ export default class MaintenanceMaintenancesIndexRoute 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
+ type: { refreshModel: true },
13
+ status: { refreshModel: true },
14
+ priority: { refreshModel: true },
15
+ public_id: { refreshModel: true },
16
+ created_at: { refreshModel: true },
17
+ updated_at: { refreshModel: true },
18
+ };
19
+
20
+ model(params) {
21
+ return this.store.query('maintenance', { ...params });
22
+ }
23
+ }
@@ -0,0 +1,3 @@
1
+ import Route from '@ember/routing/route';
2
+
3
+ export default class MaintenanceMaintenancesRoute 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 MaintenancePartsIndexDetailsRoute extends Route {}
5
+ export default class MaintenancePartsIndexDetailsRoute 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.parts.index');
16
+ }
17
+ }
18
+
19
+ beforeModel() {
20
+ if (this.abilities.cannot('fleet-ops view part')) {
21
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
22
+ return this.hostRouter.transitionTo('maintenance.parts.index');
23
+ }
24
+ }
25
+
26
+ model({ public_id }) {
27
+ return this.store.findRecord('part', 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 MaintenancePartsIndexEditRoute extends Route {}
5
+ export default class MaintenancePartsIndexEditRoute 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.parts.index');
16
+ }
17
+ }
18
+
19
+ beforeModel() {
20
+ if (this.abilities.cannot('fleet-ops update part')) {
21
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
22
+ return this.hostRouter.transitionTo('maintenance.parts.index');
23
+ }
24
+ }
25
+
26
+ model({ public_id }) {
27
+ return this.store.findRecord('part', public_id);
28
+ }
29
+ }
@@ -0,0 +1,2 @@
1
+ import Route from '@ember/routing/route';
2
+ export default class MaintenanceSchedulesIndexDetailsIndexRoute extends Route {}
@@ -0,0 +1,11 @@
1
+ import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
3
+
4
+ export default class MaintenanceSchedulesIndexDetailsWorkOrdersRoute extends Route {
5
+ @service store;
6
+
7
+ model() {
8
+ const schedule = this.modelFor('maintenance.schedules.index.details');
9
+ return this.store.query('work-order', { schedule_uuid: schedule.id });
10
+ }
11
+ }
@@ -0,0 +1,25 @@
1
+ import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
3
+ import { action } from '@ember/object';
4
+ export default class MaintenanceSchedulesIndexDetailsRoute extends Route {
5
+ @service store;
6
+ @service notifications;
7
+ @service hostRouter;
8
+ @service abilities;
9
+ @service intl;
10
+ @action error(error) {
11
+ this.notifications.serverError(error);
12
+ if (typeof error.message === 'string' && error.message.endsWith('not found')) {
13
+ return this.hostRouter.transitionTo('maintenance.schedules.index');
14
+ }
15
+ }
16
+ beforeModel() {
17
+ if (this.abilities.cannot('fleet-ops view maintenance-schedule')) {
18
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
19
+ return this.hostRouter.transitionTo('maintenance.schedules.index');
20
+ }
21
+ }
22
+ model({ public_id }) {
23
+ return this.store.findRecord('maintenance-schedule', public_id);
24
+ }
25
+ }
@@ -0,0 +1,25 @@
1
+ import Route from '@ember/routing/route';
2
+ import { inject as service } from '@ember/service';
3
+ import { action } from '@ember/object';
4
+ export default class MaintenanceSchedulesIndexEditRoute extends Route {
5
+ @service store;
6
+ @service notifications;
7
+ @service hostRouter;
8
+ @service abilities;
9
+ @service intl;
10
+ @action error(error) {
11
+ this.notifications.serverError(error);
12
+ if (typeof error.message === 'string' && error.message.endsWith('not found')) {
13
+ return this.hostRouter.transitionTo('maintenance.schedules.index');
14
+ }
15
+ }
16
+ beforeModel() {
17
+ if (this.abilities.cannot('fleet-ops update maintenance-schedule')) {
18
+ this.notifications.warning(this.intl.t('common.unauthorized-access'));
19
+ return this.hostRouter.transitionTo('maintenance.schedules.index');
20
+ }
21
+ }
22
+ model({ public_id }) {
23
+ return this.store.findRecord('maintenance-schedule', public_id);
24
+ }
25
+ }
@@ -0,0 +1,2 @@
1
+ import Route from '@ember/routing/route';
2
+ export default class MaintenanceSchedulesIndexNewRoute extends Route {}