@fleetbase/fleetops-engine 0.6.69 → 0.6.71

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 (324) hide show
  1. package/RELEASE.md +21 -14
  2. package/addon/components/admin/telematics-settings.hbs +143 -0
  3. package/addon/components/admin/telematics-settings.js +145 -0
  4. package/addon/components/fuel-integration/hub.hbs +1 -1
  5. package/addon/components/layout/fleet-ops-sidebar.js +37 -17
  6. package/addon/components/map/leaflet-live-map.hbs +4 -242
  7. package/addon/components/map/leaflet-live-map.js +2 -1
  8. package/addon/components/map/marker-card/driver.hbs +57 -0
  9. package/addon/components/map/marker-card/driver.js +3 -0
  10. package/addon/components/map/marker-card/vehicle.hbs +78 -0
  11. package/addon/components/map/marker-card/vehicle.js +3 -0
  12. package/addon/components/order/details/activity.hbs +8 -6
  13. package/addon/components/order/details/activity.js +9 -0
  14. package/addon/components/order/details.hbs +29 -0
  15. package/addon/components/order/details.js +26 -0
  16. package/addon/components/order/form/details.hbs +30 -4
  17. package/addon/components/order/form/details.js +46 -0
  18. package/addon/components/order/form/route.hbs +4 -2
  19. package/addon/components/order/form/route.js +11 -0
  20. package/addon/components/order/form.hbs +12 -0
  21. package/addon/components/order/form.js +21 -1
  22. package/addon/components/order/kanban.js +72 -0
  23. package/addon/components/order-config-manager/activity-flow.js +45 -10
  24. package/addon/components/order-config-manager/lifecycle.hbs +250 -0
  25. package/addon/components/order-config-manager/lifecycle.js +358 -0
  26. package/addon/components/order-config-manager.js +5 -1
  27. package/addon/components/telematic/hub.hbs +1 -1
  28. package/addon/components/widget/live-fleet.hbs +8 -40
  29. package/addon/controllers/analytics/reports/index.js +15 -1
  30. package/addon/controllers/connectivity/devices/index/details.js +1 -0
  31. package/addon/controllers/connectivity/devices/index.js +12 -2
  32. package/addon/controllers/connectivity/events/index.js +31 -1
  33. package/addon/controllers/connectivity/fuel-providers/index.js +6 -4
  34. package/addon/controllers/connectivity/sensors/index/details.js +1 -1
  35. package/addon/controllers/connectivity/sensors/index.js +41 -1
  36. package/addon/controllers/connectivity/telematics/index.js +4 -0
  37. package/addon/controllers/maintenance/equipment/index/details.js +2 -2
  38. package/addon/controllers/maintenance/equipment/index.js +36 -10
  39. package/addon/controllers/maintenance/inspection-forms/index.js +32 -12
  40. package/addon/controllers/maintenance/inspection-submissions/index/details.js +2 -1
  41. package/addon/controllers/maintenance/inspection-submissions/index.js +56 -10
  42. package/addon/controllers/maintenance/maintenances/index/details.js +2 -0
  43. package/addon/controllers/maintenance/maintenances/index.js +24 -1
  44. package/addon/controllers/maintenance/parts/index/details.js +2 -2
  45. package/addon/controllers/maintenance/parts/index.js +36 -9
  46. package/addon/controllers/maintenance/schedules/index.js +48 -6
  47. package/addon/controllers/maintenance/work-orders/index/details.js +3 -3
  48. package/addon/controllers/maintenance/work-orders/index.js +47 -9
  49. package/addon/controllers/management/contacts/customers.js +13 -0
  50. package/addon/controllers/management/contacts/index.js +47 -1
  51. package/addon/controllers/management/drivers/index/details.js +1 -0
  52. package/addon/controllers/management/drivers/index.js +36 -2
  53. package/addon/controllers/management/fleets/index/details.js +1 -0
  54. package/addon/controllers/management/fleets/index.js +43 -1
  55. package/addon/controllers/management/fuel-reports/index.js +26 -2
  56. package/addon/controllers/management/fuel-transactions/index.js +45 -7
  57. package/addon/controllers/management/issues/index/details.js +1 -0
  58. package/addon/controllers/management/issues/index.js +26 -2
  59. package/addon/controllers/management/places/index.js +40 -1
  60. package/addon/controllers/management/trailers/index/details.js +1 -0
  61. package/addon/controllers/management/trailers/index.js +50 -2
  62. package/addon/controllers/management/vehicles/index/details.js +1 -0
  63. package/addon/controllers/management/vehicles/index.js +37 -2
  64. package/addon/controllers/management/vendors/index.js +30 -2
  65. package/addon/controllers/operations/orders/index/details.js +61 -5
  66. package/addon/controllers/operations/orders/index.js +66 -4
  67. package/addon/controllers/operations/service-rates/index.js +18 -1
  68. package/addon/controllers/settings/index.js +13 -0
  69. package/addon/controllers/settings/telematics.js +113 -0
  70. package/addon/extension.js +70 -6
  71. package/addon/routes/analytics/index.js +14 -1
  72. package/addon/routes/analytics/reports/index/details.js +1 -1
  73. package/addon/routes/analytics/reports/index/edit.js +1 -1
  74. package/addon/routes/analytics/reports/index/new.js +14 -1
  75. package/addon/routes/analytics/reports.js +14 -1
  76. package/addon/routes/connectivity/devices/index/new.js +14 -1
  77. package/addon/routes/connectivity/devices.js +14 -1
  78. package/addon/routes/connectivity/events.js +14 -1
  79. package/addon/routes/connectivity/fuel-providers/details/transactions.js +12 -0
  80. package/addon/routes/connectivity/fuel-providers/details.js +9 -0
  81. package/addon/routes/connectivity/fuel-providers/edit.js +9 -0
  82. package/addon/routes/connectivity/fuel-providers/new.js +14 -1
  83. package/addon/routes/connectivity/fuel-providers.js +14 -1
  84. package/addon/routes/connectivity/sensors/index/new.js +14 -1
  85. package/addon/routes/connectivity/sensors.js +14 -1
  86. package/addon/routes/connectivity/telematics/new.js +14 -1
  87. package/addon/routes/connectivity/telematics.js +14 -1
  88. package/addon/routes/connectivity/tracking.js +14 -1
  89. package/addon/routes/maintenance/equipment/index/details.js +2 -2
  90. package/addon/routes/maintenance/equipment/index/edit.js +2 -2
  91. package/addon/routes/maintenance/equipment/index/new.js +14 -1
  92. package/addon/routes/maintenance/equipment.js +14 -1
  93. package/addon/routes/maintenance/index.js +14 -1
  94. package/addon/routes/maintenance/inspection-forms/index/details.js +10 -1
  95. package/addon/routes/maintenance/inspection-forms/index/edit.js +10 -1
  96. package/addon/routes/maintenance/inspection-forms/index/new.js +14 -1
  97. package/addon/routes/maintenance/inspection-forms.js +14 -1
  98. package/addon/routes/maintenance/inspection-submissions/index/details.js +10 -1
  99. package/addon/routes/maintenance/inspection-submissions/index/edit.js +10 -1
  100. package/addon/routes/maintenance/inspection-submissions/index/new.js +14 -1
  101. package/addon/routes/maintenance/inspection-submissions.js +14 -1
  102. package/addon/routes/maintenance/maintenances/index/details.js +2 -2
  103. package/addon/routes/maintenance/maintenances/index/edit.js +2 -2
  104. package/addon/routes/maintenance/maintenances/index/new.js +14 -1
  105. package/addon/routes/maintenance/maintenances.js +14 -1
  106. package/addon/routes/maintenance/parts/index/details.js +2 -2
  107. package/addon/routes/maintenance/parts/index/edit.js +2 -2
  108. package/addon/routes/maintenance/parts/index/new.js +14 -1
  109. package/addon/routes/maintenance/parts.js +14 -1
  110. package/addon/routes/maintenance/schedules/index/details.js +2 -2
  111. package/addon/routes/maintenance/schedules/index/edit.js +2 -2
  112. package/addon/routes/maintenance/schedules/index/new.js +15 -1
  113. package/addon/routes/maintenance/schedules.js +15 -1
  114. package/addon/routes/maintenance/work-orders/index/details.js +2 -2
  115. package/addon/routes/maintenance/work-orders/index/edit.js +2 -2
  116. package/addon/routes/maintenance/work-orders/index/new.js +14 -1
  117. package/addon/routes/maintenance/work-orders.js +14 -1
  118. package/addon/routes/management/fuel-transactions/index/details.js +9 -0
  119. package/addon/routes/management/fuel-transactions.js +14 -1
  120. package/addon/routes/management/index.js +13 -0
  121. package/addon/routes/management/trailers.js +16 -0
  122. package/addon/routes/management/vendors/integrated/details.js +14 -1
  123. package/addon/routes/management/vendors/integrated/edit.js +14 -1
  124. package/addon/routes/management/vendors/integrated/new.js +14 -1
  125. package/addon/routes/management/vendors/integrated.js +14 -1
  126. package/addon/routes/operations/orders/index/details.js +1 -0
  127. package/addon/routes/operations/orders.js +40 -1
  128. package/addon/routes/operations/routes/index/details.js +14 -1
  129. package/addon/routes/operations/routes/index/new.js +13 -0
  130. package/addon/routes/operations/routes.js +14 -1
  131. package/addon/routes/operations/service-rates/index/new.js +11 -0
  132. package/addon/routes/operations/service-rates.js +14 -1
  133. package/addon/routes/settings/avatars.js +14 -1
  134. package/addon/routes/settings/custom-fields.js +14 -1
  135. package/addon/routes/settings/map.js +14 -1
  136. package/addon/routes/settings/notifications.js +11 -0
  137. package/addon/routes/settings/orchestrator.js +1 -1
  138. package/addon/routes/settings/payments/index.js +1 -1
  139. package/addon/routes/settings/routing.js +14 -1
  140. package/addon/routes/settings/scheduling.js +14 -1
  141. package/addon/routes/settings/telematics.js +21 -0
  142. package/addon/routes/virtual.js +11 -0
  143. package/addon/routes.js +1 -0
  144. package/addon/services/contact-actions.js +1 -0
  145. package/addon/services/customer-actions.js +2 -1
  146. package/addon/services/device-actions.js +1 -0
  147. package/addon/services/device-event-actions.js +1 -0
  148. package/addon/services/driver-actions.js +4 -13
  149. package/addon/services/equipment-actions.js +1 -0
  150. package/addon/services/fleet-actions.js +1 -0
  151. package/addon/services/fuel-report-actions.js +1 -0
  152. package/addon/services/inspection-form-actions.js +1 -0
  153. package/addon/services/inspection-submission-actions.js +1 -0
  154. package/addon/services/integrated-vendor-actions.js +1 -0
  155. package/addon/services/issue-actions.js +1 -0
  156. package/addon/services/maintenance-actions.js +1 -0
  157. package/addon/services/maintenance-schedule-actions.js +2 -1
  158. package/addon/services/order-actions.js +7 -0
  159. package/addon/services/order-presentation.js +129 -0
  160. package/addon/services/part-actions.js +1 -0
  161. package/addon/services/place-actions.js +1 -0
  162. package/addon/services/sensor-actions.js +1 -0
  163. package/addon/services/service-area-actions.js +1 -0
  164. package/addon/services/service-rate-actions.js +1 -0
  165. package/addon/services/telematic-actions.js +1 -0
  166. package/addon/services/trailer-actions.js +4 -14
  167. package/addon/services/vehicle-actions.js +4 -13
  168. package/addon/services/vendor-actions.js +1 -0
  169. package/addon/services/work-order-actions.js +1 -0
  170. package/addon/services/zone-actions.js +1 -0
  171. package/addon/templates/analytics/reports/index/details.hbs +1 -0
  172. package/addon/templates/analytics/reports/index.hbs +1 -0
  173. package/addon/templates/connectivity/devices/index/details.hbs +1 -0
  174. package/addon/templates/connectivity/devices/index.hbs +1 -0
  175. package/addon/templates/connectivity/events/index.hbs +1 -0
  176. package/addon/templates/connectivity/sensors/index/details.hbs +1 -0
  177. package/addon/templates/connectivity/sensors/index.hbs +1 -0
  178. package/addon/templates/maintenance/equipment/index/details.hbs +1 -0
  179. package/addon/templates/maintenance/equipment/index.hbs +2 -0
  180. package/addon/templates/maintenance/inspection-forms/index/details.hbs +1 -0
  181. package/addon/templates/maintenance/inspection-forms/index.hbs +1 -0
  182. package/addon/templates/maintenance/inspection-submissions/index/details.hbs +1 -0
  183. package/addon/templates/maintenance/inspection-submissions/index.hbs +1 -0
  184. package/addon/templates/maintenance/maintenances/index/details.hbs +1 -0
  185. package/addon/templates/maintenance/maintenances/index.hbs +1 -0
  186. package/addon/templates/maintenance/parts/index/details.hbs +1 -0
  187. package/addon/templates/maintenance/parts/index.hbs +2 -0
  188. package/addon/templates/maintenance/schedules/index/details.hbs +1 -0
  189. package/addon/templates/maintenance/schedules/index.hbs +2 -0
  190. package/addon/templates/maintenance/work-orders/index/details.hbs +1 -0
  191. package/addon/templates/maintenance/work-orders/index.hbs +1 -0
  192. package/addon/templates/management/contacts/customers/details.hbs +1 -0
  193. package/addon/templates/management/contacts/customers.hbs +1 -0
  194. package/addon/templates/management/contacts/index/details.hbs +1 -0
  195. package/addon/templates/management/contacts/index.hbs +1 -0
  196. package/addon/templates/management/contacts.hbs +1 -0
  197. package/addon/templates/management/drivers/index/details.hbs +1 -0
  198. package/addon/templates/management/drivers/index.hbs +2 -0
  199. package/addon/templates/management/fleets/index/details.hbs +1 -0
  200. package/addon/templates/management/fleets/index.hbs +1 -0
  201. package/addon/templates/management/fuel-reports/index/details.hbs +1 -0
  202. package/addon/templates/management/fuel-reports/index.hbs +1 -0
  203. package/addon/templates/management/fuel-transactions/index.hbs +1 -0
  204. package/addon/templates/management/issues/index/details.hbs +1 -0
  205. package/addon/templates/management/issues/index.hbs +1 -0
  206. package/addon/templates/management/places/index/details.hbs +1 -0
  207. package/addon/templates/management/places/index.hbs +1 -0
  208. package/addon/templates/management/trailers/index/details.hbs +1 -0
  209. package/addon/templates/management/trailers/index.hbs +2 -0
  210. package/addon/templates/management/vehicles/index/details.hbs +1 -0
  211. package/addon/templates/management/vehicles/index.hbs +2 -0
  212. package/addon/templates/management/vendors/index/details.hbs +1 -0
  213. package/addon/templates/management/vendors/index.hbs +2 -0
  214. package/addon/templates/management/vendors/integrated.hbs +1 -0
  215. package/addon/templates/operations/orders/index/details.hbs +1 -0
  216. package/addon/templates/operations/orders/index.hbs +1 -0
  217. package/addon/templates/operations/service-rates/index/details.hbs +1 -0
  218. package/addon/templates/operations/service-rates/index.hbs +1 -0
  219. package/addon/templates/settings/telematics.hbs +70 -0
  220. package/addon/utils/normalize-order-config-flow.js +6 -1
  221. package/app/components/admin/telematics-settings.js +1 -0
  222. package/app/components/map/marker-card/driver.js +1 -0
  223. package/app/components/map/marker-card/vehicle.js +1 -0
  224. package/app/controllers/settings/telematics.js +1 -0
  225. package/app/routes/settings/telematics.js +1 -0
  226. package/app/services/order-presentation.js +1 -0
  227. package/app/templates/settings/telematics.js +1 -0
  228. package/composer.json +2 -2
  229. package/docs/AFAQY.md +1 -1
  230. package/docs/TELEMATICS_QUEUES.md +1 -1
  231. package/docs/TELEMETRY_ARCHITECTURE.md +72 -1
  232. package/extension.json +1 -1
  233. package/package.json +3 -3
  234. package/server/config/telemetry.php +12 -0
  235. package/server/migrations/2026_09_23_000001_add_retention_index_to_device_events.php +40 -0
  236. package/server/migrations/2026_09_23_000002_add_retention_index_to_positions.php +40 -0
  237. package/server/migrations/2026_09_23_000003_add_retention_index_to_telematic_sync_runs.php +40 -0
  238. package/server/src/Auth/Schemas/FleetOps.php +104 -5
  239. package/server/src/Console/Commands/DrainTelematicInbox.php +3 -13
  240. package/server/src/Console/Commands/ProcessOperationalAlerts.php +3 -3
  241. package/server/src/Console/Commands/PruneTelematicsData.php +318 -0
  242. package/server/src/Http/Controllers/Api/v1/OrchestrationController.php +9 -0
  243. package/server/src/Http/Controllers/FleetOpsController.php +21 -0
  244. package/server/src/Http/Controllers/Internal/v1/AnalyticsController.php +11 -0
  245. package/server/src/Http/Controllers/Internal/v1/ContactController.php +11 -0
  246. package/server/src/Http/Controllers/Internal/v1/CustomerController.php +14 -0
  247. package/server/src/Http/Controllers/Internal/v1/DeviceController.php +13 -0
  248. package/server/src/Http/Controllers/Internal/v1/DeviceEventController.php +11 -0
  249. package/server/src/Http/Controllers/Internal/v1/DriverController.php +22 -0
  250. package/server/src/Http/Controllers/Internal/v1/FuelProviderConnectionController.php +13 -0
  251. package/server/src/Http/Controllers/Internal/v1/FuelProviderTransactionController.php +15 -0
  252. package/server/src/Http/Controllers/Internal/v1/FuelReportController.php +9 -3
  253. package/server/src/Http/Controllers/Internal/v1/InspectionFormController.php +15 -0
  254. package/server/src/Http/Controllers/Internal/v1/LiveController.php +16 -0
  255. package/server/src/Http/Controllers/Internal/v1/MaintenanceController.php +15 -0
  256. package/server/src/Http/Controllers/Internal/v1/MaintenanceScheduleController.php +15 -0
  257. package/server/src/Http/Controllers/Internal/v1/ManifestController.php +15 -0
  258. package/server/src/Http/Controllers/Internal/v1/MetricsController.php +11 -0
  259. package/server/src/Http/Controllers/Internal/v1/NavigatorController.php +42 -1
  260. package/server/src/Http/Controllers/Internal/v1/OrchestrationController.php +12 -0
  261. package/server/src/Http/Controllers/Internal/v1/OrderController.php +56 -4
  262. package/server/src/Http/Controllers/Internal/v1/PaymentController.php +13 -0
  263. package/server/src/Http/Controllers/Internal/v1/RadarController.php +19 -0
  264. package/server/src/Http/Controllers/Internal/v1/ServiceAreaController.php +9 -3
  265. package/server/src/Http/Controllers/Internal/v1/SettingController.php +465 -14
  266. package/server/src/Http/Controllers/Internal/v1/TelematicController.php +21 -0
  267. package/server/src/Http/Controllers/Internal/v1/TrailerController.php +21 -0
  268. package/server/src/Http/Controllers/Internal/v1/VehicleController.php +21 -0
  269. package/server/src/Http/Controllers/Internal/v1/VendorController.php +17 -0
  270. package/server/src/Http/Controllers/Internal/v1/WorkOrderController.php +11 -0
  271. package/server/src/Jobs/DispatchTelematicsRetentionJobs.php +70 -0
  272. package/server/src/Jobs/PruneTelematicsDataJob.php +74 -0
  273. package/server/src/Listeners/NotifyDriverOnShiftChange.php +3 -3
  274. package/server/src/Mail/CustomerCredentialsMail.php +1 -1
  275. package/server/src/Models/Order.php +35 -3
  276. package/server/src/Models/OrderConfig.php +129 -0
  277. package/server/src/Models/TrackingNumber.php +8 -4
  278. package/server/src/Orchestration/Engines/VroomOrchestrationEngine.php +9 -1
  279. package/server/src/Providers/FleetOpsServiceProvider.php +3 -0
  280. package/server/src/Support/Analytics/LiveFleet.php +18 -2
  281. package/server/src/Support/Authorization.php +103 -0
  282. package/server/src/Support/Database/TableIndexes.php +66 -0
  283. package/server/src/Support/OrderTracker.php +2 -2
  284. package/server/src/Support/Reporting/FleetOpsReportSchema.php +476 -116
  285. package/server/src/Support/Telematics/Retention/RetentionPolicy.php +300 -0
  286. package/server/src/Support/Telematics/Retention/TelemetryActivity.php +40 -0
  287. package/server/src/Support/Telematics/TelematicService.php +12 -2
  288. package/server/src/Support/Telematics/Telemetry/Ingestor.php +4 -2
  289. package/server/src/Tracking/TrackingIntelligenceService.php +1 -1
  290. package/server/src/Tracking/TrackingOptions.php +2 -2
  291. package/server/src/Traits/AuthorizesMethods.php +37 -0
  292. package/server/src/routes.php +9 -1
  293. package/server/tests/AnalyticsRoutesTest.php +29 -2
  294. package/server/tests/Feature/Http/AfaqyRealtimeIngestionTest.php +16 -1
  295. package/server/tests/Feature/Http/Api/TelematicsRetentionIndexMigrationTest.php +115 -0
  296. package/server/tests/Feature/Http/Internal/OrderControllerActivityFlowsTest.php +72 -0
  297. package/server/tests/Feature/Http/Internal/OrderControllerCreateRecordTest.php +26 -0
  298. package/server/tests/Feature/Http/Internal/SettingControllerHelpersTest.php +71 -0
  299. package/server/tests/Feature/Http/Internal/TelematicsStorageDeadlinesTest.php +119 -0
  300. package/server/tests/InternalImportExportControllerContractsTest.php +5 -8
  301. package/server/tests/NavigatorControllerContractsTest.php +36 -4
  302. package/server/tests/NotificationAndMailContractsTest.php +31 -0
  303. package/server/tests/ObserverContractsTest.php +1 -1
  304. package/server/tests/OrchestratorConsumableApiTest.php +42 -0
  305. package/server/tests/OrderConfigLifecycleTest.php +120 -0
  306. package/server/tests/ProviderContractsTest.php +10 -0
  307. package/server/tests/ReportSchemaContractsTest.php +120 -6
  308. package/server/tests/SettingControllerContractsTest.php +429 -18
  309. package/server/tests/SmallControllerContractsTest.php +8 -5
  310. package/server/tests/Support/PruneTelematicsDataProbe.php +55 -0
  311. package/server/tests/Unit/Console/Commands/ProcessOperationalAlertsCommandTest.php +2 -2
  312. package/server/tests/Unit/Console/PruneTelematicsDataCommandTest.php +353 -0
  313. package/server/tests/Unit/Events/OrderDispatchFailedTest.php +2 -1
  314. package/server/tests/Unit/Jobs/DispatchTelematicsRetentionJobsTest.php +114 -0
  315. package/server/tests/Unit/Jobs/PruneTelematicsDataJobTest.php +60 -0
  316. package/server/tests/Unit/Orchestration/VroomEngineTransportAndSettingsTest.php +20 -0
  317. package/server/tests/Unit/Support/Analytics/LiveFleetTest.php +6 -0
  318. package/server/tests/Unit/Support/AuthorizationTest.php +142 -0
  319. package/server/tests/Unit/Support/MaintainableAndOperationalAlertsTest.php +12 -1
  320. package/server/tests/Unit/Support/MoreQuerySeamsTest.php +11 -2
  321. package/server/tests/Unit/Support/Telematics/Retention/RetentionPolicyTest.php +190 -0
  322. package/server/tests/Unit/Support/Telematics/Retention/TelemetryActivityTest.php +68 -0
  323. package/server/tests/Unit/Tracking/TrackingOptionsCompanySettingsTest.php +109 -0
  324. package/translations/en-us.yaml +108 -0
@@ -2,6 +2,7 @@
2
2
 
3
3
  namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;
4
4
 
5
+ use Fleetbase\Attributes\SkipAuthorizationCheck;
5
6
  use Fleetbase\Exceptions\FleetbaseRequestValidationException;
6
7
  use Fleetbase\FleetOps\Events\EntityActivityChanged;
7
8
  use Fleetbase\FleetOps\Events\EntityCompleted;
@@ -53,6 +54,20 @@ use Maatwebsite\Excel\Facades\Excel;
53
54
  class OrderController extends FleetOpsController
54
55
  {
55
56
  use ResolvesOrderServiceStops;
57
+ /**
58
+ * Permissions for methods AuthorizationGuard cannot map to a schema action (see FleetOpsController).
59
+ *
60
+ * @var array<string, string|string[]>
61
+ */
62
+ protected array $methodPermissions = [
63
+ 'editOrderRoute' => 'update-route-for order',
64
+ 'importFromFiles' => 'import order',
65
+ 'bulkCancel' => 'cancel order',
66
+ 'bulkDispatch' => 'dispatch order',
67
+ 'bulkAssignDriver' => 'assign-driver-for order',
68
+ 'dispatchOrder' => 'dispatch order',
69
+ 'scheduleOrder' => 'schedule order',
70
+ ];
56
71
 
57
72
  /**
58
73
  * The resource to query.
@@ -148,8 +163,15 @@ class OrderController extends FleetOpsController
148
163
  $input['type'] = 'transport';
149
164
  }
150
165
 
166
+ // a configured lifecycle always starts at its initial activity; otherwise
151
167
  // if no status is set its default to `created`
152
- if (!isset($input['status'])) {
168
+ if ($resolvedOrderConfig && $resolvedOrderConfig->hasConfiguredLifecycle()) {
169
+ $input['status'] = $resolvedOrderConfig->getInitialStatusCode();
170
+ if (!$resolvedOrderConfig->allowsDispatch()) {
171
+ $input['dispatched'] = false;
172
+ $input['adhoc'] = false;
173
+ }
174
+ } elseif (!isset($input['status'])) {
153
175
  $input['status'] = 'created';
154
176
  }
155
177
 
@@ -170,11 +192,13 @@ class OrderController extends FleetOpsController
170
192
  $entities = Utils::get($input, 'payload.entities');
171
193
  $uploads = Utils::get($input, 'files', []);
172
194
  $customFieldValues = Utils::get($input, 'custom_field_values', []);
195
+ $orderConfig = $order->config();
196
+ $hasLifecycle = $orderConfig && $orderConfig->hasConfiguredLifecycle();
173
197
 
174
198
  // save order route & payload with request input
175
199
  $order
176
200
  ->setRoute($route)
177
- ->setStatus('created', false)
201
+ ->setStatus($hasLifecycle ? $orderConfig->getInitialStatusCode() : 'created', false)
178
202
  ->insertPayload($payload)
179
203
  ->insertWaypoints($waypoints)
180
204
  ->insertEntities($entities);
@@ -197,8 +221,12 @@ class OrderController extends FleetOpsController
197
221
  );
198
222
  }
199
223
 
200
- // Check dispatch flag with backward compatibility (default true)
224
+ // Check dispatch flag with backward compatibility (default true).
225
+ // Configs with a lifecycle that disables dispatch are never dispatched.
201
226
  $shouldDispatch = isset($input['dispatched']) ? (bool) $input['dispatched'] : true;
227
+ if ($hasLifecycle && !$orderConfig->allowsDispatch()) {
228
+ $shouldDispatch = false;
229
+ }
202
230
 
203
231
  // dispatch if flagged true, otherwise ensure order stays in created state
204
232
  if ($shouldDispatch) {
@@ -267,6 +295,7 @@ class OrderController extends FleetOpsController
267
295
  *
268
296
  * @return Response
269
297
  */
298
+ #[SkipAuthorizationCheck]
270
299
  public function editOrderRoute(string $id, Request $request)
271
300
  {
272
301
  $pickup = $request->input('pickup');
@@ -337,6 +366,7 @@ class OrderController extends FleetOpsController
337
366
  *
338
367
  * @return \Illuminate\Http\Response
339
368
  */
369
+ #[SkipAuthorizationCheck]
340
370
  public function importFromFiles(Request $request)
341
371
  {
342
372
  $info = Utils::lookupIp();
@@ -409,6 +439,7 @@ class OrderController extends FleetOpsController
409
439
  *
410
440
  * @return \Illuminate\Http\Response
411
441
  */
442
+ #[SkipAuthorizationCheck]
412
443
  public function bulkCancel(Request $request)
413
444
  {
414
445
  $request->validate([
@@ -454,6 +485,7 @@ class OrderController extends FleetOpsController
454
485
  *
455
486
  * @return \Illuminate\Http\Response
456
487
  */
488
+ #[SkipAuthorizationCheck]
457
489
  public function bulkDispatch(BulkDispatchRequest $request)
458
490
  {
459
491
  /** @var Order */
@@ -464,7 +496,7 @@ class OrderController extends FleetOpsController
464
496
  $successful = [];
465
497
 
466
498
  foreach ($orders as $order) {
467
- if ($order->status !== 'created') {
499
+ if ($order->status !== 'created' || $order->config()?->allowsDispatch() === false) {
468
500
  $failed[] = $order->uuid;
469
501
  continue;
470
502
  }
@@ -502,6 +534,7 @@ class OrderController extends FleetOpsController
502
534
  *
503
535
  * @return \Illuminate\Http\Response
504
536
  */
537
+ #[SkipAuthorizationCheck]
505
538
  public function bulkAssignDriver(Request $request)
506
539
  {
507
540
  // Validate Inputs
@@ -578,6 +611,7 @@ class OrderController extends FleetOpsController
578
611
  *
579
612
  * @return \Illuminate\Http\Response
580
613
  */
614
+ #[SkipAuthorizationCheck]
581
615
  public function dispatchOrder(Request $request)
582
616
  {
583
617
  /**
@@ -594,6 +628,10 @@ class OrderController extends FleetOpsController
594
628
  return $this->errorResponse('No order config found for dispatch.');
595
629
  }
596
630
 
631
+ if (!$order->config()->allowsDispatch()) {
632
+ return $this->errorResponse('Orders of this type are not dispatched.');
633
+ }
634
+
597
635
  if (!$order->hasDriverAssigned && !$order->adhoc) {
598
636
  return $this->errorResponse('No driver assigned to dispatch!');
599
637
  }
@@ -879,6 +917,19 @@ class OrderController extends FleetOpsController
879
917
  $activity = $request->array('activity');
880
918
  $activity = new Activity($activity, $order->getConfigFlow());
881
919
 
920
+ // Configs with strict transitions only accept a configured child of the current
921
+ // activity, and the server-side activity definition replaces the client payload.
922
+ $orderConfig = $order->config();
923
+ if ($orderConfig && $orderConfig->hasStrictTransitions()) {
924
+ $targetCode = $activity->get('code');
925
+ $configured = $targetCode ? $orderConfig->getActivityByCode($targetCode) : null;
926
+ if (!$configured || !$orderConfig->canTransition($order->status, $targetCode)) {
927
+ return response()->error('This activity is not a permitted next step for the order.', 422);
928
+ }
929
+
930
+ $activity = $configured;
931
+ }
932
+
882
933
  $requiresProof = Utils::isActivity($activity)
883
934
  && ($activity->get('require_pod') || ($activity->completesOrder() && $order->pod_required));
884
935
  if ($requiresProof && !$proof && !$bypassProof) {
@@ -1906,6 +1957,7 @@ class OrderController extends FleetOpsController
1906
1957
  *
1907
1958
  * @return \Illuminate\Http\Response
1908
1959
  */
1960
+ #[SkipAuthorizationCheck]
1909
1961
  public function scheduleOrder(Request $request)
1910
1962
  {
1911
1963
  $orderId = $request->input('order');
@@ -4,6 +4,7 @@ namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;
4
4
 
5
5
  use Fleetbase\FleetOps\Models\PurchaseRate;
6
6
  use Fleetbase\FleetOps\Support\Payment;
7
+ use Fleetbase\FleetOps\Traits\AuthorizesMethods;
7
8
  use Fleetbase\Http\Controllers\Controller;
8
9
  use Fleetbase\Http\Resources\FleetbaseResource;
9
10
  use Fleetbase\Support\Auth;
@@ -12,6 +13,18 @@ use Illuminate\Support\Str;
12
13
 
13
14
  class PaymentController extends Controller
14
15
  {
16
+ use AuthorizesMethods;
17
+
18
+ public function __construct()
19
+ {
20
+ $this->authorizeMethods([
21
+ 'hasStripeConnectAccount' => 'view payments',
22
+ 'getStripeAccount' => 'onboard payments',
23
+ 'getStripeAccountSession' => 'onboard payments',
24
+ 'getCompanyReceivedPayments' => 'view payments',
25
+ ]);
26
+ }
27
+
15
28
  /**
16
29
  * Checks if the currently authenticated company has an associated Stripe Connect account.
17
30
  *
@@ -19,6 +19,7 @@ use Fleetbase\FleetOps\Support\Radar\RadarAgenda;
19
19
  use Fleetbase\FleetOps\Support\Radar\RadarBriefing;
20
20
  use Fleetbase\FleetOps\Support\Radar\RadarItemState;
21
21
  use Fleetbase\FleetOps\Support\Radar\RadarRules;
22
+ use Fleetbase\FleetOps\Traits\AuthorizesMethods;
22
23
  use Fleetbase\Http\Controllers\Controller;
23
24
  use Fleetbase\Models\Alert;
24
25
  use Fleetbase\Models\CompanyUser;
@@ -42,6 +43,24 @@ use Illuminate\Support\Carbon;
42
43
  */
43
44
  class RadarController extends Controller
44
45
  {
46
+ use AuthorizesMethods;
47
+
48
+ public function __construct()
49
+ {
50
+ $this->authorizeMethods([
51
+ 'extendShift' => ['update driver', 'update vehicle'],
52
+ 'acknowledge' => ['update driver', 'update vehicle'],
53
+ 'snooze' => ['update driver', 'update vehicle'],
54
+ 'wake' => ['update driver', 'update vehicle'],
55
+ 'assign' => ['update driver', 'update vehicle'],
56
+ 'plan' => ['update driver', 'update vehicle'],
57
+ 'resolve' => ['update driver', 'update vehicle'],
58
+ 'bulk' => ['update driver', 'update vehicle'],
59
+ 'storeNotice' => ['update driver', 'update vehicle'],
60
+ 'destroyNotice' => ['update driver', 'update vehicle'],
61
+ ]);
62
+ }
63
+
45
64
  public const RESOLVED_WINDOW_DAYS = 7;
46
65
  public const SNOOZE_MAX_DAYS = 90;
47
66
 
@@ -7,6 +7,7 @@ use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
7
7
  use Fleetbase\FleetOps\Models\ServiceArea;
8
8
  use Fleetbase\Http\Requests\ExportRequest;
9
9
  use Illuminate\Http\Request;
10
+ use Illuminate\Support\Arr;
10
11
  use Illuminate\Support\Str;
11
12
  use Maatwebsite\Excel\Facades\Excel;
12
13
 
@@ -21,11 +22,16 @@ class ServiceAreaController extends FleetOpsController
21
22
 
22
23
  /**
23
24
  * Handle post save transactions.
25
+ *
26
+ * Reads the custom field values from the payload the base controller already extracted
27
+ * rather than from the raw request: Ember Data sends the resource under a camelCase root
28
+ * (`serviceArea`), so `$request->array('service_area.custom_field_values')` was always empty and no
29
+ * custom field value was ever persisted for this resource.
24
30
  */
25
- public function afterSave(Request $request, ServiceArea $serviceArea)
31
+ public function afterSave(Request $request, ServiceArea $serviceArea, array $input = [])
26
32
  {
27
- $customFieldValues = $request->array('service_area.custom_field_values');
28
- if ($customFieldValues) {
33
+ $customFieldValues = Arr::get($input, 'custom_field_values');
34
+ if (is_array($customFieldValues) && $customFieldValues) {
29
35
  $serviceArea->syncCustomFieldValues($customFieldValues);
30
36
  }
31
37
  }