@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
@@ -0,0 +1,137 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Resources\v1;
4
+
5
+ use Fleetbase\FleetOps\Support\Utils;
6
+ use Fleetbase\Http\Resources\FleetbaseResource;
7
+ use Fleetbase\Support\Http;
8
+ use Illuminate\Support\Str;
9
+
10
+ class MaintenanceSchedule extends FleetbaseResource
11
+ {
12
+ /**
13
+ * Transform the resource into an array.
14
+ *
15
+ * @param \Illuminate\Http\Request $request
16
+ *
17
+ * @return array
18
+ */
19
+ public function toArray($request)
20
+ {
21
+ return $this->withCustomFields([
22
+ 'id' => $this->when(Http::isInternalRequest(), $this->id, $this->public_id),
23
+ 'uuid' => $this->when(Http::isInternalRequest(), $this->uuid),
24
+ 'public_id' => $this->when(Http::isInternalRequest(), $this->public_id),
25
+ 'company_uuid' => $this->when(Http::isInternalRequest(), $this->company_uuid),
26
+ 'created_by_uuid' => $this->when(Http::isInternalRequest(), $this->created_by_uuid),
27
+ 'updated_by_uuid' => $this->when(Http::isInternalRequest(), $this->updated_by_uuid),
28
+ // Polymorphic subject
29
+ 'subject_uuid' => $this->when(Http::isInternalRequest(), $this->subject_uuid),
30
+ 'subject_type' => $this->when(Http::isInternalRequest(), $this->subject_type ? Utils::toEmberResourceType($this->subject_type) : null),
31
+ 'subject' => $this->whenLoaded('subject', function () {
32
+ return $this->setSubjectType($this->transformMorphResource($this->subject));
33
+ }),
34
+ // Polymorphic default assignee
35
+ 'default_assignee_uuid' => $this->when(Http::isInternalRequest(), $this->default_assignee_uuid),
36
+ 'default_assignee_type' => $this->when(Http::isInternalRequest(), $this->default_assignee_type ? Utils::toEmberResourceType($this->default_assignee_type) : null),
37
+ 'default_assignee' => $this->whenLoaded('defaultAssignee', function () {
38
+ return $this->setAssigneeType($this->transformMorphResource($this->defaultAssignee));
39
+ }),
40
+ // Core attributes
41
+ 'name' => $this->name,
42
+ 'type' => $this->type,
43
+ 'status' => $this->status,
44
+ 'interval_method' => $this->interval_method,
45
+ 'interval_type' => $this->interval_type,
46
+ 'interval_value' => $this->interval_value,
47
+ 'interval_unit' => $this->interval_unit,
48
+ 'interval_distance' => $this->interval_distance,
49
+ 'interval_engine_hours' => $this->interval_engine_hours,
50
+ // Baseline readings
51
+ 'last_service_odometer' => $this->last_service_odometer,
52
+ 'last_service_engine_hours' => $this->last_service_engine_hours,
53
+ 'last_service_date' => $this->last_service_date,
54
+ // Next-due thresholds
55
+ 'next_due_date' => $this->next_due_date,
56
+ 'next_due_odometer' => $this->next_due_odometer,
57
+ 'next_due_engine_hours' => $this->next_due_engine_hours,
58
+ // Work-order defaults
59
+ 'default_priority' => $this->default_priority,
60
+ 'instructions' => $this->instructions,
61
+ 'reminder_offsets' => $this->reminder_offsets ?? [],
62
+ 'meta' => data_get($this, 'meta', (object) []),
63
+ 'slug' => $this->slug,
64
+ // Convenience name attrs
65
+ 'subject_name' => $this->subject_name,
66
+ 'default_assignee_name' => $this->default_assignee_name,
67
+ // Dates
68
+ 'last_triggered_at' => $this->last_triggered_at,
69
+ 'updated_at' => $this->updated_at,
70
+ 'created_at' => $this->created_at,
71
+ ]);
72
+ }
73
+
74
+ /**
75
+ * Inject the abstract 'maintenance-subject' type into the embedded subject object
76
+ * so Ember Data can resolve the correct polymorphic model.
77
+ *
78
+ * subject_type must be the Ember Data model name for the concrete subtype,
79
+ * e.g. 'maintenance-subject-vehicle' or 'maintenance-subject-equipment'.
80
+ * We use the bare PHP class basename so we get 'vehicle' / 'equipment' rather
81
+ * than the full 'fleet-ops:vehicle' string that toEmberResourceType() would return.
82
+ */
83
+ protected function setSubjectType(?array $resolved): ?array
84
+ {
85
+ if (empty($resolved)) {
86
+ return $resolved;
87
+ }
88
+
89
+ $bareSlug = Str::kebab(class_basename($this->subject_type ?? ''));
90
+
91
+ data_set($resolved, 'type', 'maintenance-subject-' . $bareSlug);
92
+ data_set($resolved, 'subject_type', 'maintenance-subject-' . $bareSlug);
93
+
94
+ return $resolved;
95
+ }
96
+
97
+ /**
98
+ * Inject the abstract 'facilitator' type into the embedded default_assignee object
99
+ * so Ember Data can resolve the correct polymorphic model.
100
+ *
101
+ * facilitator_type must be the Ember Data model name for the concrete subtype,
102
+ * e.g. 'facilitator-vendor' or 'facilitator-contact'.
103
+ * We use the bare PHP class basename so we get 'vendor' / 'contact' rather
104
+ * than the full 'fleet-ops:vendor' string that toEmberResourceType() would return.
105
+ */
106
+ protected function setAssigneeType(?array $resolved): ?array
107
+ {
108
+ if (empty($resolved)) {
109
+ return $resolved;
110
+ }
111
+
112
+ $bareSlug = Str::kebab(class_basename($this->default_assignee_type ?? ''));
113
+
114
+ data_set($resolved, 'type', 'facilitator-' . $bareSlug);
115
+ data_set($resolved, 'facilitator_type', 'facilitator-' . $bareSlug);
116
+
117
+ return $resolved;
118
+ }
119
+
120
+ /**
121
+ * Resolve the appropriate resource transformer for a polymorphic morph target
122
+ * and return its array representation.
123
+ */
124
+ protected function transformMorphResource($model): ?array
125
+ {
126
+ if (!$model) {
127
+ return null;
128
+ }
129
+
130
+ $resourceClass = \Fleetbase\Support\Find::httpResourceForModel($model);
131
+ if ($resourceClass) {
132
+ return (new $resourceClass($model))->resolve();
133
+ }
134
+
135
+ return (new \Illuminate\Http\Resources\Json\JsonResource($model))->resolve();
136
+ }
137
+ }
@@ -0,0 +1,116 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Resources\v1\Orchestrator;
4
+
5
+ use Fleetbase\FleetOps\Http\Resources\v1\Index\Driver;
6
+ use Fleetbase\FleetOps\Http\Resources\v1\Index\Payload;
7
+ use Fleetbase\FleetOps\Http\Resources\v1\Index\Vehicle;
8
+ use Fleetbase\Http\Resources\FleetbaseResource;
9
+
10
+ /**
11
+ * Orchestrator Order resource.
12
+ *
13
+ * A workbench-specific Order representation that extends the lightweight
14
+ * Index/Order shape with custom_field_values. This resource is intentionally
15
+ * separate from Index/Order so that the tabular orders view retains its
16
+ * optimised, minimal payload while the Orchestrator Workbench gets the richer
17
+ * data it needs to render configurable card fields.
18
+ *
19
+ * Used exclusively by OrchestrationController::orders().
20
+ */
21
+ class Order extends FleetbaseResource
22
+ {
23
+ /**
24
+ * Transform the resource into an array.
25
+ *
26
+ * @param \Illuminate\Http\Request $request
27
+ */
28
+ public function toArray($request): array
29
+ {
30
+ return [
31
+ 'id' => $this->id,
32
+ 'uuid' => $this->uuid,
33
+ 'public_id' => $this->public_id,
34
+ 'internal_id' => $this->internal_id,
35
+ 'company_uuid' => $this->company_uuid,
36
+ 'payload_uuid' => $this->payload_uuid,
37
+ 'order_config_uuid' => $this->order_config_uuid,
38
+ 'driver_assigned_uuid' => $this->driver_assigned_uuid,
39
+ 'vehicle_assigned_uuid' => $this->vehicle_assigned_uuid,
40
+ 'tracking' => $this->trackingNumber?->tracking_number,
41
+
42
+ // Minimal order config
43
+ 'order_config' => $this->whenLoaded('orderConfig', function () {
44
+ return [
45
+ 'id' => $this->orderConfig->public_id,
46
+ 'name' => $this->orderConfig->name,
47
+ 'key' => $this->orderConfig->key,
48
+ ];
49
+ }),
50
+
51
+ // Payload with pickup/dropoff/waypoints
52
+ 'payload' => $this->whenLoaded('payload', function () {
53
+ return new Payload($this->payload);
54
+ }),
55
+
56
+ // Lightweight driver
57
+ 'driver_assigned' => $this->whenLoaded('driverAssigned', function () {
58
+ return new Driver($this->driverAssigned);
59
+ }),
60
+
61
+ // Lightweight vehicle
62
+ 'vehicle_assigned' => $this->whenLoaded('vehicleAssigned', function () {
63
+ return new Vehicle($this->vehicleAssigned);
64
+ }),
65
+
66
+ // Custom field values — the primary addition over Index/Order.
67
+ // Each entry contains the raw value and the parent CustomField
68
+ // definition (name, label, type) so the card renderer can match
69
+ // by field name/label without a separate API call.
70
+ 'custom_field_values' => $this->whenLoaded('customFieldValues', function () {
71
+ return $this->customFieldValues->map(function ($cfv) {
72
+ return [
73
+ 'id' => $cfv->uuid,
74
+ 'uuid' => $cfv->uuid,
75
+ 'custom_field_uuid' => $cfv->custom_field_uuid,
76
+ 'value' => $cfv->value,
77
+ 'value_type' => $cfv->value_type,
78
+ 'custom_field' => $cfv->relationLoaded('customField') && $cfv->customField
79
+ ? [
80
+ 'id' => $cfv->customField->uuid,
81
+ 'uuid' => $cfv->customField->uuid,
82
+ 'name' => $cfv->customField->name,
83
+ 'label' => $cfv->customField->label,
84
+ 'type' => $cfv->customField->type,
85
+ 'required' => (bool) $cfv->customField->required,
86
+ ]
87
+ : null,
88
+ ];
89
+ })->values();
90
+ }),
91
+
92
+ // Scalar fields
93
+ 'type' => $this->type,
94
+ 'status' => $this->status,
95
+ 'notes' => $this->notes,
96
+ 'adhoc' => (bool) data_get($this, 'adhoc', false),
97
+ 'dispatched' => (bool) data_get($this, 'dispatched', false),
98
+ 'has_driver_assigned' => $this->has_driver_assigned,
99
+ 'is_scheduled' => $this->is_scheduled,
100
+ 'orchestrator_priority' => $this->orchestrator_priority ?? 0,
101
+ 'time_window_start' => $this->time_window_start,
102
+ 'time_window_end' => $this->time_window_end,
103
+ 'required_skills' => $this->required_skills ?? [],
104
+
105
+ // Timestamps
106
+ 'scheduled_at' => $this->scheduled_at,
107
+ 'dispatched_at' => $this->dispatched_at,
108
+ 'started_at' => $this->started_at,
109
+ 'created_at' => $this->created_at,
110
+ 'updated_at' => $this->updated_at,
111
+
112
+ // Meta
113
+ 'meta' => $this->meta ?? [],
114
+ ];
115
+ }
116
+ }
@@ -7,6 +7,7 @@ use Fleetbase\Http\Resources\Comment;
7
7
  use Fleetbase\Http\Resources\File;
8
8
  use Fleetbase\Http\Resources\FleetbaseResource;
9
9
  use Fleetbase\Support\Http;
10
+ use Illuminate\Support\Str;
10
11
 
11
12
  class Order extends FleetbaseResource
12
13
  {
@@ -117,8 +118,9 @@ class Order extends FleetbaseResource
117
118
  return $resolved;
118
119
  }
119
120
 
120
- data_set($resolved, 'type', 'customer');
121
- data_set($resolved, 'customer_type', 'customer-' . Utils::toEmberResourceType($this->customer_type));
121
+ $bareSlug = Str::kebab(class_basename($this->customer_type ?? ''));
122
+ data_set($resolved, 'type', 'customer-' . $bareSlug);
123
+ data_set($resolved, 'customer_type', 'customer-' . $bareSlug);
122
124
 
123
125
  return $resolved;
124
126
  }
@@ -136,8 +138,9 @@ class Order extends FleetbaseResource
136
138
  return $resolved;
137
139
  }
138
140
 
139
- data_set($resolved, 'type', 'facilitator');
140
- data_set($resolved, 'facilitator_type', 'facilitator-' . Utils::toEmberResourceType($this->facilitator_type));
141
+ $bareSlug = Str::kebab(class_basename($this->facilitator_type ?? ''));
142
+ data_set($resolved, 'type', 'facilitator-' . $bareSlug);
143
+ data_set($resolved, 'facilitator_type', 'facilitator-' . $bareSlug);
141
144
 
142
145
  return $resolved;
143
146
  }
@@ -61,6 +61,13 @@ class Waypoint extends FleetbaseResource
61
61
  'type' => $waypoint->type ?? $this->type,
62
62
  'meta' => data_get($this, 'meta', Utils::createObject()),
63
63
  'eta' => $this->eta,
64
+ // Per-stop POD and notes
65
+ 'notes' => $waypoint->notes ?? null,
66
+ 'pod_method' => $waypoint->pod_method ?? null,
67
+ 'pod_required' => $waypoint->pod_required ?? false,
68
+ 'time_window_start' => $waypoint->time_window_start,
69
+ 'time_window_end' => $waypoint->time_window_end,
70
+ 'service_time' => $waypoint->service_time,
64
71
  'updated_at' => $this->updated_at,
65
72
  'created_at' => $this->created_at,
66
73
  ];
@@ -0,0 +1,136 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Http\Resources\v1;
4
+
5
+ use Fleetbase\FleetOps\Support\Utils;
6
+ use Fleetbase\Http\Resources\FleetbaseResource;
7
+ use Fleetbase\Support\Http;
8
+ use Illuminate\Support\Str;
9
+
10
+ class WorkOrder extends FleetbaseResource
11
+ {
12
+ /**
13
+ * Transform the resource into an array.
14
+ *
15
+ * @param \Illuminate\Http\Request $request
16
+ *
17
+ * @return array
18
+ */
19
+ public function toArray($request)
20
+ {
21
+ return $this->withCustomFields([
22
+ 'id' => $this->when(Http::isInternalRequest(), $this->id, $this->public_id),
23
+ 'uuid' => $this->when(Http::isInternalRequest(), $this->uuid),
24
+ 'public_id' => $this->when(Http::isInternalRequest(), $this->public_id),
25
+ 'company_uuid' => $this->when(Http::isInternalRequest(), $this->company_uuid),
26
+ 'schedule_uuid' => $this->when(Http::isInternalRequest(), $this->schedule_uuid),
27
+ 'created_by_uuid' => $this->when(Http::isInternalRequest(), $this->created_by_uuid),
28
+ 'updated_by_uuid' => $this->when(Http::isInternalRequest(), $this->updated_by_uuid),
29
+ // Polymorphic target
30
+ 'target_uuid' => $this->when(Http::isInternalRequest(), $this->target_uuid),
31
+ 'target_type' => $this->when(Http::isInternalRequest(), $this->target_type ? Utils::toEmberResourceType($this->target_type) : null),
32
+ 'target' => $this->whenLoaded('target', function () {
33
+ return $this->setTargetType($this->transformMorphResource($this->target));
34
+ }),
35
+ // Polymorphic assignee
36
+ 'assignee_uuid' => $this->when(Http::isInternalRequest(), $this->assignee_uuid),
37
+ 'assignee_type' => $this->when(Http::isInternalRequest(), $this->assignee_type ? Utils::toEmberResourceType($this->assignee_type) : null),
38
+ 'assignee' => $this->whenLoaded('assignee', function () {
39
+ return $this->setAssigneeType($this->transformMorphResource($this->assignee));
40
+ }),
41
+ // Core attributes
42
+ 'code' => $this->code,
43
+ 'subject' => $this->subject,
44
+ 'status' => $this->status,
45
+ 'priority' => $this->priority,
46
+ 'instructions' => $this->instructions,
47
+ 'checklist' => data_get($this, 'checklist', []),
48
+ 'meta' => data_get($this, 'meta', (object) []),
49
+ 'slug' => $this->slug,
50
+ // Computed
51
+ 'target_name' => $this->target_name,
52
+ 'assignee_name' => $this->assignee_name,
53
+ 'is_overdue' => $this->is_overdue,
54
+ 'days_until_due' => $this->days_until_due,
55
+ 'completion_percentage' => $this->completion_percentage,
56
+ // Dates
57
+ 'opened_at' => $this->opened_at,
58
+ 'due_at' => $this->due_at,
59
+ 'closed_at' => $this->closed_at,
60
+ 'updated_at' => $this->updated_at,
61
+ 'created_at' => $this->created_at,
62
+ ]);
63
+ }
64
+
65
+ /**
66
+ * Inject the abstract 'maintenance-subject' type into the embedded target object
67
+ * so Ember Data can resolve the correct polymorphic model.
68
+ *
69
+ * The subject_type must be the Ember Data model name for the concrete subtype,
70
+ * e.g. 'maintenance-subject-vehicle' or 'maintenance-subject-equipment'.
71
+ *
72
+ * We derive it from the bare PHP class basename (e.g. 'Vehicle' -> 'vehicle')
73
+ * rather than using toEmberResourceType() which produces 'fleet-ops:vehicle' —
74
+ * a string that would make the injected type 'maintenance-subject-fleet-ops:vehicle'.
75
+ */
76
+ protected function setTargetType(?array $resolved): ?array
77
+ {
78
+ if (empty($resolved)) {
79
+ return $resolved;
80
+ }
81
+
82
+ // class_basename('Fleetbase\FleetOps\Models\Vehicle') -> 'Vehicle'
83
+ // Str::kebab('Vehicle') -> 'vehicle'
84
+ $bareSlug = Str::kebab(class_basename($this->target_type ?? ''));
85
+
86
+ data_set($resolved, 'type', 'maintenance-subject-' . $bareSlug);
87
+ data_set($resolved, 'subject_type', 'maintenance-subject-' . $bareSlug);
88
+
89
+ return $resolved;
90
+ }
91
+
92
+ /**
93
+ * Inject the abstract 'facilitator' type into the embedded assignee object
94
+ * so Ember Data can resolve the correct polymorphic model.
95
+ *
96
+ * The facilitator_type must be the Ember Data model name for the concrete subtype,
97
+ * e.g. 'facilitator-vendor' or 'facilitator-contact'.
98
+ *
99
+ * We derive it from the bare PHP class basename (e.g. 'Vendor' -> 'vendor')
100
+ * rather than using toEmberResourceType() which produces 'fleet-ops:vendor' —
101
+ * a string that would make the injected type 'facilitator-fleet-ops:vendor'.
102
+ */
103
+ protected function setAssigneeType(?array $resolved): ?array
104
+ {
105
+ if (empty($resolved)) {
106
+ return $resolved;
107
+ }
108
+
109
+ // class_basename('Fleetbase\FleetOps\Models\Vendor') -> 'Vendor'
110
+ // Str::kebab('Vendor') -> 'vendor'
111
+ $bareSlug = Str::kebab(class_basename($this->assignee_type ?? ''));
112
+
113
+ data_set($resolved, 'type', 'facilitator-' . $bareSlug);
114
+ data_set($resolved, 'facilitator_type', 'facilitator-' . $bareSlug);
115
+
116
+ return $resolved;
117
+ }
118
+
119
+ /**
120
+ * Resolve the appropriate resource transformer for a polymorphic morph target
121
+ * and return its array representation.
122
+ */
123
+ protected function transformMorphResource($model): ?array
124
+ {
125
+ if (!$model) {
126
+ return null;
127
+ }
128
+
129
+ $resourceClass = \Fleetbase\Support\Find::httpResourceForModel($model);
130
+ if ($resourceClass) {
131
+ return (new $resourceClass($model))->resolve();
132
+ }
133
+
134
+ return (new \Illuminate\Http\Resources\Json\JsonResource($model))->resolve();
135
+ }
136
+ }
@@ -0,0 +1,32 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Imports;
4
+
5
+ use Fleetbase\FleetOps\Models\Equipment;
6
+ use Illuminate\Support\Collection;
7
+ use Maatwebsite\Excel\Concerns\ToCollection;
8
+ use Maatwebsite\Excel\Concerns\WithHeadingRow;
9
+
10
+ class EquipmentImport implements ToCollection, WithHeadingRow
11
+ {
12
+ /**
13
+ * Counter for successfully imported rows.
14
+ */
15
+ public int $imported = 0;
16
+
17
+ public function collection(Collection $rows)
18
+ {
19
+ foreach ($rows as $row) {
20
+ if ($row instanceof Collection) {
21
+ $row = array_filter($row->toArray());
22
+ }
23
+
24
+ if (empty($row)) {
25
+ continue;
26
+ }
27
+
28
+ Equipment::createFromImport($row, true);
29
+ $this->imported++;
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,32 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Imports;
4
+
5
+ use Fleetbase\FleetOps\Models\Maintenance;
6
+ use Illuminate\Support\Collection;
7
+ use Maatwebsite\Excel\Concerns\ToCollection;
8
+ use Maatwebsite\Excel\Concerns\WithHeadingRow;
9
+
10
+ class MaintenanceImport implements ToCollection, WithHeadingRow
11
+ {
12
+ /**
13
+ * Counter for successfully imported rows.
14
+ */
15
+ public int $imported = 0;
16
+
17
+ public function collection(Collection $rows)
18
+ {
19
+ foreach ($rows as $row) {
20
+ if ($row instanceof Collection) {
21
+ $row = array_filter($row->toArray());
22
+ }
23
+
24
+ if (empty($row)) {
25
+ continue;
26
+ }
27
+
28
+ Maintenance::createFromImport($row, true);
29
+ $this->imported++;
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,32 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Imports;
4
+
5
+ use Fleetbase\FleetOps\Models\MaintenanceSchedule;
6
+ use Illuminate\Support\Collection;
7
+ use Maatwebsite\Excel\Concerns\ToCollection;
8
+ use Maatwebsite\Excel\Concerns\WithHeadingRow;
9
+
10
+ class MaintenanceScheduleImport implements ToCollection, WithHeadingRow
11
+ {
12
+ /**
13
+ * Counter for successfully imported rows.
14
+ */
15
+ public int $imported = 0;
16
+
17
+ public function collection(Collection $rows)
18
+ {
19
+ foreach ($rows as $row) {
20
+ if ($row instanceof Collection) {
21
+ $row = array_filter($row->toArray());
22
+ }
23
+
24
+ if (empty($row)) {
25
+ continue;
26
+ }
27
+
28
+ MaintenanceSchedule::createFromImport($row, true);
29
+ $this->imported++;
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,32 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Imports;
4
+
5
+ use Fleetbase\FleetOps\Models\Part;
6
+ use Illuminate\Support\Collection;
7
+ use Maatwebsite\Excel\Concerns\ToCollection;
8
+ use Maatwebsite\Excel\Concerns\WithHeadingRow;
9
+
10
+ class PartImport implements ToCollection, WithHeadingRow
11
+ {
12
+ /**
13
+ * Counter for successfully imported rows.
14
+ */
15
+ public int $imported = 0;
16
+
17
+ public function collection(Collection $rows)
18
+ {
19
+ foreach ($rows as $row) {
20
+ if ($row instanceof Collection) {
21
+ $row = array_filter($row->toArray());
22
+ }
23
+
24
+ if (empty($row)) {
25
+ continue;
26
+ }
27
+
28
+ Part::createFromImport($row, true);
29
+ $this->imported++;
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,32 @@
1
+ <?php
2
+
3
+ namespace Fleetbase\FleetOps\Imports;
4
+
5
+ use Fleetbase\FleetOps\Models\WorkOrder;
6
+ use Illuminate\Support\Collection;
7
+ use Maatwebsite\Excel\Concerns\ToCollection;
8
+ use Maatwebsite\Excel\Concerns\WithHeadingRow;
9
+
10
+ class WorkOrderImport implements ToCollection, WithHeadingRow
11
+ {
12
+ /**
13
+ * Counter for successfully imported rows.
14
+ */
15
+ public int $imported = 0;
16
+
17
+ public function collection(Collection $rows)
18
+ {
19
+ foreach ($rows as $row) {
20
+ if ($row instanceof Collection) {
21
+ $row = array_filter($row->toArray());
22
+ }
23
+
24
+ if (empty($row)) {
25
+ continue;
26
+ }
27
+
28
+ WorkOrder::createFromImport($row, true);
29
+ $this->imported++;
30
+ }
31
+ }
32
+ }