@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,67 @@
1
+ <?php
2
+
3
+ use Illuminate\Database\Migrations\Migration;
4
+ use Illuminate\Database\Schema\Blueprint;
5
+ use Illuminate\Support\Facades\Schema;
6
+
7
+ /**
8
+ * Adds columns that are present in the Part model's $fillable / $appends but
9
+ * were omitted from the original create_parts_table migration:
10
+ *
11
+ * - public_id : human-readable unique identifier (e.g. part_xxxxx)
12
+ * - status : stock / lifecycle status string (e.g. 'in_stock', 'out_of_stock')
13
+ * - currency : ISO 4217 currency code for monetary columns
14
+ */
15
+ return new class extends Migration {
16
+ /**
17
+ * Run the migrations.
18
+ */
19
+ public function up(): void
20
+ {
21
+ if (!Schema::hasTable('parts')) {
22
+ return;
23
+ }
24
+
25
+ Schema::table('parts', function (Blueprint $table) {
26
+ if (!Schema::hasColumn('parts', 'public_id')) {
27
+ $table->string('public_id')->nullable()->unique()->after('uuid');
28
+ }
29
+
30
+ if (!Schema::hasColumn('parts', 'status')) {
31
+ $table->string('status')->nullable()->default('in_stock')->index()->after('type');
32
+ }
33
+
34
+ if (!Schema::hasColumn('parts', 'currency')) {
35
+ $table->string('currency', 3)->nullable()->after('msrp');
36
+ }
37
+ });
38
+ }
39
+
40
+ /**
41
+ * Reverse the migrations.
42
+ */
43
+ public function down(): void
44
+ {
45
+ if (!Schema::hasTable('parts')) {
46
+ return;
47
+ }
48
+
49
+ Schema::table('parts', function (Blueprint $table) {
50
+ $columns = [];
51
+
52
+ if (Schema::hasColumn('parts', 'public_id')) {
53
+ $columns[] = 'public_id';
54
+ }
55
+ if (Schema::hasColumn('parts', 'status')) {
56
+ $columns[] = 'status';
57
+ }
58
+ if (Schema::hasColumn('parts', 'currency')) {
59
+ $columns[] = 'currency';
60
+ }
61
+
62
+ if (!empty($columns)) {
63
+ $table->dropColumn($columns);
64
+ }
65
+ });
66
+ }
67
+ };
@@ -0,0 +1,44 @@
1
+ <?php
2
+
3
+ use Illuminate\Database\Migrations\Migration;
4
+ use Illuminate\Database\Schema\Blueprint;
5
+ use Illuminate\Support\Facades\Schema;
6
+
7
+ return new class extends Migration {
8
+ public function up(): void
9
+ {
10
+ // Add reminder_offsets JSON column to maintenance_schedules
11
+ if (Schema::hasTable('maintenance_schedules') && !Schema::hasColumn('maintenance_schedules', 'reminder_offsets')) {
12
+ Schema::table('maintenance_schedules', function (Blueprint $table) {
13
+ $table->json('reminder_offsets')->nullable()->after('instructions')
14
+ ->comment('Array of integers: days before next_due_date to send reminder emails, e.g. [15, 7, 3]');
15
+ });
16
+ }
17
+
18
+ // Create the reminder tracking table
19
+ if (!Schema::hasTable('maintenance_schedule_reminders')) {
20
+ Schema::create('maintenance_schedule_reminders', function (Blueprint $table) {
21
+ $table->id();
22
+ $table->string('schedule_uuid', 191)->index();
23
+ $table->unsignedTinyInteger('offset_days')
24
+ ->comment('Which offset fired, e.g. 15 or 3');
25
+ $table->date('due_date_snapshot')
26
+ ->comment('The next_due_date at time of sending; advances each cycle so reminders re-fire');
27
+ $table->timestamp('sent_at')->useCurrent();
28
+
29
+ $table->unique(['schedule_uuid', 'offset_days', 'due_date_snapshot'], 'unique_schedule_reminder');
30
+ });
31
+ }
32
+ }
33
+
34
+ public function down(): void
35
+ {
36
+ Schema::dropIfExists('maintenance_schedule_reminders');
37
+
38
+ if (Schema::hasTable('maintenance_schedules') && Schema::hasColumn('maintenance_schedules', 'reminder_offsets')) {
39
+ Schema::table('maintenance_schedules', function (Blueprint $table) {
40
+ $table->dropColumn('reminder_offsets');
41
+ });
42
+ }
43
+ }
44
+ };
@@ -0,0 +1,58 @@
1
+ <?php
2
+
3
+ use Illuminate\Database\Migrations\Migration;
4
+ use Illuminate\Database\Schema\Blueprint;
5
+ use Illuminate\Support\Facades\Schema;
6
+
7
+ /**
8
+ * Add Orchestrator constraint columns to the vehicles table.
9
+ *
10
+ * New columns:
11
+ * - skills JSON array of vehicle capability flags (e.g. ["tail_lift","refrigerated"])
12
+ * - capacity_weight_kg Maximum payload weight in kilograms
13
+ * - capacity_volume_m3 Maximum cargo volume in cubic metres
14
+ * - capacity_pallets Maximum pallet count
15
+ * - capacity_parcels Maximum parcel/package count
16
+ * - max_tasks Maximum number of stops per route
17
+ * - time_window_start Default shift start time (HH:MM)
18
+ * - time_window_end Default shift end time (HH:MM)
19
+ * - return_to_depot Whether the vehicle must return to its start depot
20
+ */
21
+ return new class extends Migration {
22
+ public function up(): void
23
+ {
24
+ Schema::table('vehicles', function (Blueprint $table) {
25
+ // Skills / capabilities
26
+ $table->json('skills')->nullable()->after('status');
27
+
28
+ // Multi-dimensional capacity
29
+ $table->unsignedDecimal('capacity_weight_kg', 10, 2)->nullable()->after('skills');
30
+ $table->unsignedDecimal('capacity_volume_m3', 10, 3)->nullable()->after('capacity_weight_kg');
31
+ $table->unsignedInteger('capacity_pallets')->nullable()->after('capacity_volume_m3');
32
+ $table->unsignedInteger('capacity_parcels')->nullable()->after('capacity_pallets');
33
+
34
+ // Route constraints
35
+ $table->unsignedInteger('max_tasks')->nullable()->after('capacity_parcels');
36
+ $table->time('time_window_start')->nullable()->after('max_tasks');
37
+ $table->time('time_window_end')->nullable()->after('time_window_start');
38
+ $table->boolean('return_to_depot')->default(true)->after('time_window_end');
39
+ });
40
+ }
41
+
42
+ public function down(): void
43
+ {
44
+ Schema::table('vehicles', function (Blueprint $table) {
45
+ $table->dropColumn([
46
+ 'skills',
47
+ 'capacity_weight_kg',
48
+ 'capacity_volume_m3',
49
+ 'capacity_pallets',
50
+ 'capacity_parcels',
51
+ 'max_tasks',
52
+ 'time_window_start',
53
+ 'time_window_end',
54
+ 'return_to_depot',
55
+ ]);
56
+ });
57
+ }
58
+ };
@@ -0,0 +1,41 @@
1
+ <?php
2
+
3
+ use Illuminate\Database\Migrations\Migration;
4
+ use Illuminate\Database\Schema\Blueprint;
5
+ use Illuminate\Support\Facades\Schema;
6
+
7
+ /**
8
+ * Add Orchestrator constraint columns to the drivers table.
9
+ *
10
+ * New columns:
11
+ * - skills JSON array of driver qualifications/certifications
12
+ * - max_travel_time Maximum driving time per route in seconds
13
+ * - max_distance Maximum driving distance per route in metres
14
+ * - time_window_start Default shift start time (HH:MM)
15
+ * - time_window_end Default shift end time (HH:MM)
16
+ */
17
+ return new class extends Migration {
18
+ public function up(): void
19
+ {
20
+ Schema::table('drivers', function (Blueprint $table) {
21
+ $table->json('skills')->nullable()->after('status');
22
+ $table->unsignedInteger('max_travel_time')->nullable()->comment('Seconds')->after('skills');
23
+ $table->unsignedInteger('max_distance')->nullable()->comment('Metres')->after('max_travel_time');
24
+ $table->time('time_window_start')->nullable()->after('max_distance');
25
+ $table->time('time_window_end')->nullable()->after('time_window_start');
26
+ });
27
+ }
28
+
29
+ public function down(): void
30
+ {
31
+ Schema::table('drivers', function (Blueprint $table) {
32
+ $table->dropColumn([
33
+ 'skills',
34
+ 'max_travel_time',
35
+ 'max_distance',
36
+ 'time_window_start',
37
+ 'time_window_end',
38
+ ]);
39
+ });
40
+ }
41
+ };
@@ -0,0 +1,38 @@
1
+ <?php
2
+
3
+ use Illuminate\Database\Migrations\Migration;
4
+ use Illuminate\Database\Schema\Blueprint;
5
+ use Illuminate\Support\Facades\Schema;
6
+
7
+ /**
8
+ * Add Orchestrator constraint columns to the orders table.
9
+ *
10
+ * New columns:
11
+ * - orchestrator_priority Integer priority score (10–100) for routing engine
12
+ * - required_skills JSON array of skills required to service this order
13
+ * - time_window_start Earliest acceptable completion datetime
14
+ * - time_window_end Latest acceptable completion datetime
15
+ */
16
+ return new class extends Migration {
17
+ public function up(): void
18
+ {
19
+ Schema::table('orders', function (Blueprint $table) {
20
+ $table->unsignedTinyInteger('orchestrator_priority')->default(50)->after('status');
21
+ $table->json('required_skills')->nullable()->after('orchestrator_priority');
22
+ $table->dateTime('time_window_start')->nullable()->after('required_skills');
23
+ $table->dateTime('time_window_end')->nullable()->after('time_window_start');
24
+ });
25
+ }
26
+
27
+ public function down(): void
28
+ {
29
+ Schema::table('orders', function (Blueprint $table) {
30
+ $table->dropColumn([
31
+ 'orchestrator_priority',
32
+ 'required_skills',
33
+ 'time_window_start',
34
+ 'time_window_end',
35
+ ]);
36
+ });
37
+ }
38
+ };
@@ -0,0 +1,41 @@
1
+ <?php
2
+
3
+ use Illuminate\Database\Migrations\Migration;
4
+ use Illuminate\Database\Schema\Blueprint;
5
+ use Illuminate\Support\Facades\Schema;
6
+
7
+ /**
8
+ * Add Orchestrator capacity columns to the payloads table.
9
+ *
10
+ * New columns:
11
+ * - capacity_weight_kg Total payload weight in kilograms (aggregated from entities)
12
+ * - capacity_volume_m3 Total payload volume in cubic metres
13
+ * - capacity_pallets Total pallet count
14
+ * - capacity_parcels Total parcel/package count
15
+ *
16
+ * These columns allow the Orchestrator to quickly compare payload requirements
17
+ * against vehicle capacity without re-aggregating entity dimensions on every run.
18
+ */
19
+ return new class extends Migration {
20
+ public function up(): void
21
+ {
22
+ Schema::table('payloads', function (Blueprint $table) {
23
+ $table->unsignedDecimal('capacity_weight_kg', 10, 2)->nullable()->after('cod_currency');
24
+ $table->unsignedDecimal('capacity_volume_m3', 10, 3)->nullable()->after('capacity_weight_kg');
25
+ $table->unsignedInteger('capacity_pallets')->nullable()->after('capacity_volume_m3');
26
+ $table->unsignedInteger('capacity_parcels')->nullable()->after('capacity_pallets');
27
+ });
28
+ }
29
+
30
+ public function down(): void
31
+ {
32
+ Schema::table('payloads', function (Blueprint $table) {
33
+ $table->dropColumn([
34
+ 'capacity_weight_kg',
35
+ 'capacity_volume_m3',
36
+ 'capacity_pallets',
37
+ 'capacity_parcels',
38
+ ]);
39
+ });
40
+ }
41
+ };
@@ -0,0 +1,38 @@
1
+ <?php
2
+
3
+ use Illuminate\Database\Migrations\Migration;
4
+ use Illuminate\Database\Schema\Blueprint;
5
+ use Illuminate\Support\Facades\Schema;
6
+
7
+ /**
8
+ * Add Orchestrator constraint columns to the waypoints table.
9
+ *
10
+ * New columns:
11
+ * - time_window_start Earliest acceptable arrival datetime at this stop
12
+ * - time_window_end Latest acceptable arrival datetime at this stop
13
+ * - service_time Expected dwell time in seconds (loading/unloading/POD)
14
+ *
15
+ * These per-stop constraints are passed directly to the VROOM engine as
16
+ * shipment/job time_windows and service fields.
17
+ */
18
+ return new class extends Migration {
19
+ public function up(): void
20
+ {
21
+ Schema::table('waypoints', function (Blueprint $table) {
22
+ $table->dateTime('time_window_start')->nullable()->after('type');
23
+ $table->dateTime('time_window_end')->nullable()->after('time_window_start');
24
+ $table->unsignedInteger('service_time')->nullable()->comment('Seconds')->after('time_window_end');
25
+ });
26
+ }
27
+
28
+ public function down(): void
29
+ {
30
+ Schema::table('waypoints', function (Blueprint $table) {
31
+ $table->dropColumn([
32
+ 'time_window_start',
33
+ 'time_window_end',
34
+ 'service_time',
35
+ ]);
36
+ });
37
+ }
38
+ };
@@ -0,0 +1,48 @@
1
+ <?php
2
+
3
+ use Illuminate\Database\Migrations\Migration;
4
+ use Illuminate\Database\Schema\Blueprint;
5
+ use Illuminate\Support\Facades\Schema;
6
+
7
+ /**
8
+ * Create the manifests table.
9
+ *
10
+ * A Manifest represents a committed delivery plan for a specific vehicle
11
+ * and (optionally) driver over a given time period. It is the output of
12
+ * an Orchestrator commit and replaces the previous approach of loosely
13
+ * grouping orders by driver_assigned_uuid.
14
+ */
15
+ return new class extends Migration {
16
+ public function up(): void
17
+ {
18
+ Schema::create('manifests', function (Blueprint $table) {
19
+ $table->uuid('uuid')->primary();
20
+ $table->string('public_id', 23)->unique()->nullable();
21
+ $table->string('internal_id', 100)->nullable()->index();
22
+ $table->char('company_uuid', 36)->nullable()->index();
23
+ $table->char('driver_uuid', 36)->nullable()->index();
24
+ $table->char('vehicle_uuid', 36)->nullable()->index();
25
+ $table->string('status', 50)->default('draft')->index();
26
+ // 'draft' — generated by orchestrator, not yet accepted
27
+ // 'active' — driver accepted in Navigator
28
+ // 'in_progress' — driver departed for first stop
29
+ // 'completed' — all stops completed
30
+ // 'cancelled' — cancelled before completion
31
+ $table->date('scheduled_date')->nullable()->index();
32
+ $table->timestamp('started_at')->nullable();
33
+ $table->timestamp('completed_at')->nullable();
34
+ $table->unsignedInteger('total_distance_m')->default(0);
35
+ $table->unsignedInteger('total_duration_s')->default(0);
36
+ $table->unsignedInteger('stop_count')->default(0);
37
+ $table->text('notes')->nullable();
38
+ $table->json('meta')->nullable();
39
+ $table->timestamps();
40
+ $table->softDeletes();
41
+ });
42
+ }
43
+
44
+ public function down(): void
45
+ {
46
+ Schema::dropIfExists('manifests');
47
+ }
48
+ };
@@ -0,0 +1,48 @@
1
+ <?php
2
+
3
+ use Illuminate\Database\Migrations\Migration;
4
+ use Illuminate\Database\Schema\Blueprint;
5
+ use Illuminate\Support\Facades\Schema;
6
+
7
+ /**
8
+ * Create the manifest_stops table.
9
+ *
10
+ * A ManifestStop is the ordered join between a Manifest and an Order.
11
+ * Each stop represents a single physical location the driver must visit,
12
+ * with its VROOM-optimised sequence, ETA, and progress status.
13
+ */
14
+ return new class extends Migration {
15
+ public function up(): void
16
+ {
17
+ Schema::create('manifest_stops', function (Blueprint $table) {
18
+ $table->uuid('uuid')->primary();
19
+ $table->string('public_id', 23)->unique()->nullable();
20
+ $table->char('manifest_uuid', 36)->index();
21
+ $table->char('order_uuid', 36)->index();
22
+ $table->char('place_uuid', 36)->nullable()->index();
23
+ // FK to waypoints if the stop corresponds to a specific payload waypoint
24
+ // (nullable for simple single-dropoff orders where no explicit Waypoint row exists)
25
+ $table->char('waypoint_uuid', 36)->nullable()->index();
26
+ $table->string('status', 50)->default('pending')->index();
27
+ // 'pending' — not yet visited
28
+ // 'arrived' — driver entered geofence / tapped "Arrived"
29
+ // 'completed' — delivery confirmed
30
+ // 'skipped' — dispatcher or driver skipped this stop
31
+ $table->unsignedSmallInteger('sequence')->default(0);
32
+ $table->timestamp('estimated_arrival')->nullable();
33
+ $table->timestamp('actual_arrival')->nullable();
34
+ $table->unsignedInteger('distance_from_prev_m')->default(0);
35
+ $table->unsignedInteger('duration_from_prev_s')->default(0);
36
+ $table->json('meta')->nullable();
37
+ $table->timestamps();
38
+ $table->softDeletes();
39
+
40
+ $table->foreign('manifest_uuid')->references('uuid')->on('manifests')->onDelete('cascade');
41
+ });
42
+ }
43
+
44
+ public function down(): void
45
+ {
46
+ Schema::dropIfExists('manifest_stops');
47
+ }
48
+ };
@@ -0,0 +1,28 @@
1
+ <?php
2
+
3
+ use Illuminate\Database\Migrations\Migration;
4
+ use Illuminate\Database\Schema\Blueprint;
5
+ use Illuminate\Support\Facades\Schema;
6
+
7
+ /**
8
+ * Add manifest_uuid to the orders table.
9
+ *
10
+ * Links each order to the Manifest it belongs to after an orchestration
11
+ * commit. Nullable — orders that have not been through the orchestrator
12
+ * (or were assigned manually) will have no manifest.
13
+ */
14
+ return new class extends Migration {
15
+ public function up(): void
16
+ {
17
+ Schema::table('orders', function (Blueprint $table) {
18
+ $table->char('manifest_uuid', 36)->nullable()->after('vehicle_assigned_uuid')->index();
19
+ });
20
+ }
21
+
22
+ public function down(): void
23
+ {
24
+ Schema::table('orders', function (Blueprint $table) {
25
+ $table->dropColumn('manifest_uuid');
26
+ });
27
+ }
28
+ };
@@ -0,0 +1,39 @@
1
+ <?php
2
+
3
+ use Illuminate\Database\Migrations\Migration;
4
+ use Illuminate\Database\Schema\Blueprint;
5
+ use Illuminate\Support\Facades\Schema;
6
+
7
+ /**
8
+ * Add per-stop POD and notes columns to the waypoints table.
9
+ *
10
+ * New columns mirror the equivalent fields on the orders table so that
11
+ * individual stops can carry their own proof-of-delivery requirements and
12
+ * driver-facing notes independently of the parent order.
13
+ *
14
+ * Until per-waypoint POD is fully implemented in the driver app, the
15
+ * order-level pod_method / pod_required values are used as a fallback.
16
+ *
17
+ * New columns:
18
+ * - notes Free-text driver instructions for this specific stop.
19
+ * - pod_method Proof-of-delivery method (e.g. 'signature', 'photo', 'scan').
20
+ * Mirrors the allowed values from config('fleetops.pod_methods').
21
+ * - pod_required Whether POD must be collected at this stop.
22
+ */
23
+ return new class extends Migration {
24
+ public function up(): void
25
+ {
26
+ Schema::table('waypoints', function (Blueprint $table) {
27
+ $table->text('notes')->nullable()->after('service_time');
28
+ $table->string('pod_method')->nullable()->after('notes');
29
+ $table->boolean('pod_required')->default(false)->after('pod_method');
30
+ });
31
+ }
32
+
33
+ public function down(): void
34
+ {
35
+ Schema::table('waypoints', function (Blueprint $table) {
36
+ $table->dropColumn(['notes', 'pod_method', 'pod_required']);
37
+ });
38
+ }
39
+ };
@@ -0,0 +1,59 @@
1
+ <x-mail-layout>
2
+ <h2 style="font-size: 18px; font-weight: 600;">
3
+ Maintenance Due Reminder: {{ $schedule->name }}
4
+ </h2>
5
+ @if($assignee && $assignee->name)
6
+ <p>Dear {{ $assignee->name }},</p>
7
+ @endif
8
+ <p>
9
+ This is a reminder that the following maintenance is due
10
+ @if($offsetDays === 1)
11
+ <strong>tomorrow</strong>.
12
+ @else
13
+ in <strong>{{ $offsetDays }} days</strong>.
14
+ @endif
15
+ </p>
16
+ <table style="width: 100%; border-collapse: collapse; margin-top: 16px; margin-bottom: 16px;">
17
+ <tr>
18
+ <td style="padding: 8px 0; font-weight: 600; width: 40%; vertical-align: top;">Schedule</td>
19
+ <td style="padding: 8px 0;">{{ $schedule->name }}</td>
20
+ </tr>
21
+ @if($subject)
22
+ <tr>
23
+ <td style="padding: 8px 0; font-weight: 600; vertical-align: top;">Asset</td>
24
+ <td style="padding: 8px 0;">{{ $subject->name ?? $subject->display_name ?? $subject->public_id }}</td>
25
+ </tr>
26
+ @endif
27
+ <tr>
28
+ <td style="padding: 8px 0; font-weight: 600; vertical-align: top;">Type</td>
29
+ <td style="padding: 8px 0;">{{ ucfirst(str_replace('_', ' ', $schedule->type)) }}</td>
30
+ </tr>
31
+ <tr>
32
+ <td style="padding: 8px 0; font-weight: 600; vertical-align: top;">Due Date</td>
33
+ <td style="padding: 8px 0;">{{ $schedule->next_due_date?->format('d M Y') }}</td>
34
+ </tr>
35
+ <tr>
36
+ <td style="padding: 8px 0; font-weight: 600; vertical-align: top;">Interval</td>
37
+ <td style="padding: 8px 0;">
38
+ @if($schedule->interval_method === 'time')
39
+ Every {{ $schedule->interval_value }} {{ $schedule->interval_unit }}
40
+ @elseif($schedule->interval_method === 'odometer')
41
+ Every {{ number_format($schedule->interval_distance) }} km / miles
42
+ @elseif($schedule->interval_method === 'engine_hours')
43
+ Every {{ number_format($schedule->interval_engine_hours) }} engine hours
44
+ @endif
45
+ </td>
46
+ </tr>
47
+ <tr>
48
+ <td style="padding: 8px 0; font-weight: 600; vertical-align: top;">Priority</td>
49
+ <td style="padding: 8px 0;">{{ ucfirst($schedule->default_priority ?? 'normal') }}</td>
50
+ </tr>
51
+ </table>
52
+ @if($schedule->instructions)
53
+ <p style="font-weight: 600; margin-bottom: 4px;">Instructions:</p>
54
+ <p style="white-space: pre-line;">{{ $schedule->instructions }}</p>
55
+ @endif
56
+ <p style="margin-top: 24px; color: #6b7280; font-size: 13px;">
57
+ Please do not reply directly to this email. Contact the fleet manager if you have any questions.
58
+ </p>
59
+ </x-mail-layout>
@@ -0,0 +1,67 @@
1
+ <x-mail-layout>
2
+ <h2 style="font-size: 18px; font-weight: 600;">
3
+ Work Order Dispatched: #{{ $workOrder->public_id }}
4
+ </h2>
5
+
6
+ @if($assignee && $assignee->name)
7
+ <p>Dear {{ $assignee->name }},</p>
8
+ @endif
9
+
10
+ <p>
11
+ A work order has been assigned to you. Please review the details below and take the necessary action.
12
+ </p>
13
+
14
+ <table style="width: 100%; border-collapse: collapse; margin-top: 16px; margin-bottom: 16px;">
15
+ <tr>
16
+ <td style="padding: 8px 0; font-weight: 600; width: 40%; vertical-align: top;">Work Order #</td>
17
+ <td style="padding: 8px 0;">{{ $workOrder->public_id }}</td>
18
+ </tr>
19
+ @if($workOrder->subject)
20
+ <tr>
21
+ <td style="padding: 8px 0; font-weight: 600; vertical-align: top;">Subject</td>
22
+ <td style="padding: 8px 0;">{{ $workOrder->subject }}</td>
23
+ </tr>
24
+ @endif
25
+ <tr>
26
+ <td style="padding: 8px 0; font-weight: 600; vertical-align: top;">Status</td>
27
+ <td style="padding: 8px 0;">{{ ucfirst(str_replace('_', ' ', $workOrder->status)) }}</td>
28
+ </tr>
29
+ <tr>
30
+ <td style="padding: 8px 0; font-weight: 600; vertical-align: top;">Priority</td>
31
+ <td style="padding: 8px 0;">{{ ucfirst($workOrder->priority) }}</td>
32
+ </tr>
33
+ @if($target)
34
+ <tr>
35
+ <td style="padding: 8px 0; font-weight: 600; vertical-align: top;">Asset / Vehicle</td>
36
+ <td style="padding: 8px 0;">{{ $target->name ?? $target->display_name ?? $target->public_id }}</td>
37
+ </tr>
38
+ @endif
39
+ @if($workOrder->due_at)
40
+ <tr>
41
+ <td style="padding: 8px 0; font-weight: 600; vertical-align: top;">Due Date</td>
42
+ <td style="padding: 8px 0;">{{ $workOrder->due_at->format('d M Y') }}</td>
43
+ </tr>
44
+ @endif
45
+ @if($workOrder->estimated_cost)
46
+ <tr>
47
+ <td style="padding: 8px 0; font-weight: 600; vertical-align: top;">Estimated Cost</td>
48
+ <td style="padding: 8px 0;">{{ number_format($workOrder->estimated_cost / 100, 2) }} {{ strtoupper($workOrder->currency ?? 'USD') }}</td>
49
+ </tr>
50
+ @endif
51
+ @if($workOrder->approved_budget)
52
+ <tr>
53
+ <td style="padding: 8px 0; font-weight: 600; vertical-align: top;">Approved Budget</td>
54
+ <td style="padding: 8px 0;">{{ number_format($workOrder->approved_budget / 100, 2) }} {{ strtoupper($workOrder->currency ?? 'USD') }}</td>
55
+ </tr>
56
+ @endif
57
+ </table>
58
+
59
+ @if($workOrder->instructions)
60
+ <p style="font-weight: 600; margin-bottom: 4px;">Instructions:</p>
61
+ <p style="white-space: pre-line;">{{ $workOrder->instructions }}</p>
62
+ @endif
63
+
64
+ <p style="margin-top: 24px; color: #6b7280; font-size: 13px;">
65
+ Please do not reply directly to this email. Contact the fleet manager if you have any questions.
66
+ </p>
67
+ </x-mail-layout>