@fleetbase/fleetops-engine 0.6.58 → 0.6.59

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 (685) hide show
  1. package/README.md +3 -0
  2. package/addon/components/customer/form.hbs +0 -49
  3. package/addon/components/entity/card.hbs +1 -0
  4. package/addon/components/modals/order-label.hbs +1 -1
  5. package/addon/components/place/form.hbs +1 -1
  6. package/addon/services/entity-actions.js +32 -0
  7. package/addon/styles/fleetops-engine.css +0 -1
  8. package/composer.json +8 -3
  9. package/extension.json +1 -1
  10. package/index.js +7 -1
  11. package/package.json +2 -1
  12. package/scripts/coverage-file-runner.php +240 -0
  13. package/scripts/coverage-runner.php +2 -1
  14. package/scripts/coverage-summary.php +41 -2
  15. package/scripts/pest-bootstrap.php +237 -3
  16. package/scripts/pest-file-runner.php +13 -1
  17. package/scripts/pest-runner.php +57 -2
  18. package/server/resources/views/labels/entity-label.php +4 -4
  19. package/server/src/Casts/MultiPolygon.php +8 -3
  20. package/server/src/Casts/OrderConfigEntities.php +10 -3
  21. package/server/src/Casts/Point.php +10 -6
  22. package/server/src/Casts/Polygon.php +5 -2
  23. package/server/src/Console/Commands/AssignCustomerRoles.php +28 -6
  24. package/server/src/Console/Commands/AssignDriverRoles.php +36 -6
  25. package/server/src/Console/Commands/AuditCustomerUserConflicts.php +6 -1
  26. package/server/src/Console/Commands/DispatchAdhocOrders.php +12 -2
  27. package/server/src/Console/Commands/FixCustomerCompanies.php +46 -11
  28. package/server/src/Console/Commands/FixDriverCompanies.php +18 -3
  29. package/server/src/Console/Commands/FixLegacyOrderConfigs.php +31 -6
  30. package/server/src/Console/Commands/ProcessMaintenanceTriggers.php +94 -42
  31. package/server/src/Console/Commands/PurgeUnpurchasedServiceQuotes.php +42 -12
  32. package/server/src/Console/Commands/ReplayVehicleLocations.php +120 -55
  33. package/server/src/Console/Commands/SendDriverNotification.php +25 -4
  34. package/server/src/Console/Commands/SendMaintenanceReminders.php +43 -23
  35. package/server/src/Console/Commands/SimulateOrderRouteNavigation.php +36 -6
  36. package/server/src/Console/Commands/TrackOrderDistanceAndTime.php +6 -1
  37. package/server/src/Events/DriverLocationChanged.php +1 -1
  38. package/server/src/Events/DriverSimulatedLocationChanged.php +1 -1
  39. package/server/src/Events/EntityActivityChanged.php +1 -1
  40. package/server/src/Events/EntityCompleted.php +1 -1
  41. package/server/src/Events/EntityDriverAssigned.php +1 -1
  42. package/server/src/Events/FuelProviderTransactionImported.php +1 -1
  43. package/server/src/Events/FuelProviderTransactionMatched.php +1 -1
  44. package/server/src/Events/FuelProviderTransactionUnmatched.php +1 -1
  45. package/server/src/Events/FuelReportCreatedFromProvider.php +1 -1
  46. package/server/src/Events/GeofenceDwelled.php +1 -1
  47. package/server/src/Events/GeofenceEntered.php +1 -1
  48. package/server/src/Events/GeofenceExited.php +1 -1
  49. package/server/src/Events/VehicleLocationChanged.php +1 -1
  50. package/server/src/Events/WaypointActivityChanged.php +1 -1
  51. package/server/src/Events/WaypointCompleted.php +1 -1
  52. package/server/src/Exceptions/IntegratedVendorException.php +2 -2
  53. package/server/src/Exceptions/TelematicRateLimitExceededException.php +1 -1
  54. package/server/src/Http/Controllers/Api/v1/ContactController.php +89 -22
  55. package/server/src/Http/Controllers/Api/v1/CustomerController.php +296 -97
  56. package/server/src/Http/Controllers/Api/v1/DeviceController.php +48 -14
  57. package/server/src/Http/Controllers/Api/v1/DriverController.php +168 -63
  58. package/server/src/Http/Controllers/Api/v1/EntityController.php +112 -66
  59. package/server/src/Http/Controllers/Api/v1/EquipmentController.php +40 -10
  60. package/server/src/Http/Controllers/Api/v1/FleetController.php +54 -14
  61. package/server/src/Http/Controllers/Api/v1/FuelReportController.php +54 -14
  62. package/server/src/Http/Controllers/Api/v1/FuelTransactionController.php +36 -11
  63. package/server/src/Http/Controllers/Api/v1/GeofenceController.php +39 -21
  64. package/server/src/Http/Controllers/Api/v1/IssueController.php +54 -14
  65. package/server/src/Http/Controllers/Api/v1/LabelController.php +61 -22
  66. package/server/src/Http/Controllers/Api/v1/NavigatorController.php +21 -5
  67. package/server/src/Http/Controllers/Api/v1/OrderConfigController.php +35 -5
  68. package/server/src/Http/Controllers/Api/v1/OrderController.php +388 -203
  69. package/server/src/Http/Controllers/Api/v1/PartController.php +40 -10
  70. package/server/src/Http/Controllers/Api/v1/PayloadController.php +90 -30
  71. package/server/src/Http/Controllers/Api/v1/PlaceController.php +188 -91
  72. package/server/src/Http/Controllers/Api/v1/PurchaseRateController.php +100 -36
  73. package/server/src/Http/Controllers/Api/v1/ServiceAreaController.php +96 -26
  74. package/server/src/Http/Controllers/Api/v1/ServiceQuoteController.php +169 -81
  75. package/server/src/Http/Controllers/Api/v1/ServiceRateController.php +104 -75
  76. package/server/src/Http/Controllers/Api/v1/TrackingNumberController.php +83 -14
  77. package/server/src/Http/Controllers/Api/v1/TrackingStatusController.php +66 -16
  78. package/server/src/Http/Controllers/Api/v1/VehicleController.php +121 -67
  79. package/server/src/Http/Controllers/Api/v1/VendorController.php +54 -14
  80. package/server/src/Http/Controllers/Api/v1/WorkOrderController.php +47 -12
  81. package/server/src/Http/Controllers/Api/v1/ZoneController.php +84 -24
  82. package/server/src/Http/Controllers/Internal/v1/AnalyticsController.php +15 -5
  83. package/server/src/Http/Controllers/Internal/v1/ContactController.php +113 -28
  84. package/server/src/Http/Controllers/Internal/v1/CustomerController.php +36 -11
  85. package/server/src/Http/Controllers/Internal/v1/DeviceController.php +9 -4
  86. package/server/src/Http/Controllers/Internal/v1/DriverController.php +167 -69
  87. package/server/src/Http/Controllers/Internal/v1/EquipmentController.php +18 -3
  88. package/server/src/Http/Controllers/Internal/v1/FleetController.php +137 -60
  89. package/server/src/Http/Controllers/Internal/v1/FleetOpsLookupController.php +24 -9
  90. package/server/src/Http/Controllers/Internal/v1/FuelReportController.php +18 -3
  91. package/server/src/Http/Controllers/Internal/v1/GeocoderController.php +26 -8
  92. package/server/src/Http/Controllers/Internal/v1/GettingStartedController.php +12 -2
  93. package/server/src/Http/Controllers/Internal/v1/IntegratedVendorController.php +27 -6
  94. package/server/src/Http/Controllers/Internal/v1/IssueController.php +82 -29
  95. package/server/src/Http/Controllers/Internal/v1/MaintenanceController.php +34 -26
  96. package/server/src/Http/Controllers/Internal/v1/MaintenanceScheduleController.php +141 -97
  97. package/server/src/Http/Controllers/Internal/v1/ManifestController.php +28 -8
  98. package/server/src/Http/Controllers/Internal/v1/MetricsController.php +21 -12
  99. package/server/src/Http/Controllers/Internal/v1/MorphController.php +90 -18
  100. package/server/src/Http/Controllers/Internal/v1/NavigatorController.php +88 -35
  101. package/server/src/Http/Controllers/Internal/v1/OrchestrationController.php +149 -39
  102. package/server/src/Http/Controllers/Internal/v1/OrderConfigController.php +54 -18
  103. package/server/src/Http/Controllers/Internal/v1/OrderController.php +298 -86
  104. package/server/src/Http/Controllers/Internal/v1/PartController.php +18 -3
  105. package/server/src/Http/Controllers/Internal/v1/PaymentController.php +46 -14
  106. package/server/src/Http/Controllers/Internal/v1/PlaceController.php +31 -5
  107. package/server/src/Http/Controllers/Internal/v1/ProofController.php +88 -48
  108. package/server/src/Http/Controllers/Internal/v1/SearchController.php +1 -1
  109. package/server/src/Http/Controllers/Internal/v1/SensorController.php +6 -1
  110. package/server/src/Http/Controllers/Internal/v1/ServiceAreaController.php +6 -1
  111. package/server/src/Http/Controllers/Internal/v1/ServiceQuoteController.php +255 -105
  112. package/server/src/Http/Controllers/Internal/v1/SettingController.php +88 -35
  113. package/server/src/Http/Controllers/Internal/v1/TelematicController.php +1 -4
  114. package/server/src/Http/Controllers/Internal/v1/Traits/DriverSchedulingTrait.php +42 -14
  115. package/server/src/Http/Controllers/Internal/v1/VendorController.php +103 -33
  116. package/server/src/Http/Controllers/Internal/v1/WorkOrderController.php +42 -12
  117. package/server/src/Http/Filter/DriverFilter.php +2 -2
  118. package/server/src/Http/Filter/OrderFilter.php +1 -1
  119. package/server/src/Http/Filter/VehicleFilter.php +21 -7
  120. package/server/src/Http/Middleware/AuthenticateCustomerToken.php +12 -2
  121. package/server/src/Http/Requests/BulkDispatchRequest.php +3 -9
  122. package/server/src/Http/Requests/CancelOrderRequest.php +2 -6
  123. package/server/src/Http/Requests/CreateContactRequest.php +2 -6
  124. package/server/src/Http/Requests/CreateDeviceRequest.php +2 -2
  125. package/server/src/Http/Requests/CreateDriverRequest.php +3 -9
  126. package/server/src/Http/Requests/CreateEntityRequest.php +2 -6
  127. package/server/src/Http/Requests/CreateEquipmentRequest.php +2 -2
  128. package/server/src/Http/Requests/CreateFleetRequest.php +2 -6
  129. package/server/src/Http/Requests/CreateFuelReportRequest.php +2 -6
  130. package/server/src/Http/Requests/CreateFuelTransactionRequest.php +2 -2
  131. package/server/src/Http/Requests/CreateIssueRequest.php +2 -6
  132. package/server/src/Http/Requests/CreateOrderRequest.php +7 -8
  133. package/server/src/Http/Requests/CreatePartRequest.php +2 -2
  134. package/server/src/Http/Requests/CreatePayloadRequest.php +7 -9
  135. package/server/src/Http/Requests/CreatePlaceRequest.php +2 -6
  136. package/server/src/Http/Requests/CreatePurchaseRateRequest.php +2 -6
  137. package/server/src/Http/Requests/CreateSensorRequest.php +2 -2
  138. package/server/src/Http/Requests/CreateServiceAreaRequest.php +2 -6
  139. package/server/src/Http/Requests/CreateServiceQuoteRequest.php +2 -6
  140. package/server/src/Http/Requests/CreateServiceRateRequest.php +2 -6
  141. package/server/src/Http/Requests/CreateTrackingNumberRequest.php +2 -6
  142. package/server/src/Http/Requests/CreateTrackingStatusRequest.php +2 -6
  143. package/server/src/Http/Requests/CreateVehicleRequest.php +2 -6
  144. package/server/src/Http/Requests/CreateVendorRequest.php +2 -6
  145. package/server/src/Http/Requests/CreateWorkOrderRequest.php +2 -2
  146. package/server/src/Http/Requests/CreateZoneRequest.php +2 -6
  147. package/server/src/Http/Requests/DecodeTrackingNumberQR.php +2 -6
  148. package/server/src/Http/Requests/DriverSimulationRequest.php +2 -6
  149. package/server/src/Http/Requests/Internal/AssignOrderRequest.php +3 -7
  150. package/server/src/Http/Requests/Internal/CreateDriverRequest.php +4 -12
  151. package/server/src/Http/Requests/Internal/CreateOrderConfigRequest.php +2 -6
  152. package/server/src/Http/Requests/Internal/CreateOrderRequest.php +7 -8
  153. package/server/src/Http/Requests/Internal/FleetActionRequest.php +18 -12
  154. package/server/src/Http/Requests/Internal/UpdateDriverRequest.php +6 -3
  155. package/server/src/Http/Requests/QueryServiceQuotesRequest.php +2 -6
  156. package/server/src/Http/Requests/ScheduleOrderRequest.php +2 -6
  157. package/server/src/Http/Requests/UpdateIssueRequest.php +1 -3
  158. package/server/src/Http/Resources/v1/Customer.php +2 -2
  159. package/server/src/Http/Resources/v1/Maintenance.php +3 -4
  160. package/server/src/Http/Resources/v1/MaintenanceSchedule.php +3 -4
  161. package/server/src/Http/Resources/v1/Order.php +3 -7
  162. package/server/src/Http/Resources/v1/PurchaseRate.php +4 -6
  163. package/server/src/Http/Resources/v1/TrackingStatus.php +4 -6
  164. package/server/src/Http/Resources/v1/WorkOrder.php +3 -4
  165. package/server/src/Imports/ContactImport.php +10 -1
  166. package/server/src/Imports/DriverImport.php +10 -1
  167. package/server/src/Imports/EquipmentImport.php +6 -1
  168. package/server/src/Imports/FleetImport.php +10 -1
  169. package/server/src/Imports/FuelReportImport.php +10 -1
  170. package/server/src/Imports/IssueImport.php +10 -1
  171. package/server/src/Imports/MaintenanceImport.php +6 -1
  172. package/server/src/Imports/MaintenanceScheduleImport.php +6 -1
  173. package/server/src/Imports/PartImport.php +6 -1
  174. package/server/src/Imports/PlaceImport.php +10 -1
  175. package/server/src/Imports/VehicleImport.php +10 -1
  176. package/server/src/Imports/VendorImport.php +10 -1
  177. package/server/src/Imports/WorkOrderImport.php +6 -1
  178. package/server/src/Integrations/Lalamove/Lalamove.php +3 -7
  179. package/server/src/Integrations/Lalamove/LalamoveServiceType.php +5 -8
  180. package/server/src/Jobs/CheckGeofenceDwell.php +41 -16
  181. package/server/src/Jobs/FinalizeApiOrderCreation.php +17 -2
  182. package/server/src/Jobs/FinalizeInternalOrderCreation.php +11 -1
  183. package/server/src/Jobs/NotifyBulkAssignedDriver.php +29 -16
  184. package/server/src/Jobs/ProcessAllocationJob.php +59 -25
  185. package/server/src/Jobs/ReplayPositions.php +17 -10
  186. package/server/src/Jobs/SendPositionReplay.php +18 -7
  187. package/server/src/Jobs/SimulateDrivingRoute.php +14 -3
  188. package/server/src/Jobs/SyncFuelProviderTransactionsJob.php +12 -2
  189. package/server/src/Listeners/HandleDeliveryCompletion.php +11 -1
  190. package/server/src/Listeners/HandleGeofenceDwelled.php +6 -1
  191. package/server/src/Listeners/HandleGeofenceEntered.php +4 -2
  192. package/server/src/Listeners/HandleGeofenceExited.php +6 -1
  193. package/server/src/Listeners/HandleOrderCanceled.php +18 -3
  194. package/server/src/Listeners/HandleOrderDispatchFailed.php +12 -2
  195. package/server/src/Listeners/HandleOrderDispatched.php +61 -26
  196. package/server/src/Listeners/HandleOrderDriverAssigned.php +12 -2
  197. package/server/src/Listeners/HandleUserRemovedFromCompany.php +19 -6
  198. package/server/src/Listeners/NotifyDriverOnShiftChange.php +24 -4
  199. package/server/src/Listeners/NotifyOrderEvent.php +11 -6
  200. package/server/src/Models/Contact.php +6 -7
  201. package/server/src/Models/Device.php +26 -3
  202. package/server/src/Models/Driver.php +0 -6
  203. package/server/src/Models/Entity.php +4 -4
  204. package/server/src/Models/Equipment.php +1 -1
  205. package/server/src/Models/FuelReport.php +5 -1
  206. package/server/src/Models/IntegratedVendor.php +2 -2
  207. package/server/src/Models/Issue.php +5 -1
  208. package/server/src/Models/MaintenanceSchedule.php +25 -10
  209. package/server/src/Models/Order.php +18 -15
  210. package/server/src/Models/OrderConfig.php +1 -1
  211. package/server/src/Models/Payload.php +9 -16
  212. package/server/src/Models/Place.php +20 -13
  213. package/server/src/Models/ServiceArea.php +3 -6
  214. package/server/src/Models/ServiceQuote.php +5 -0
  215. package/server/src/Models/ServiceRate.php +13 -6
  216. package/server/src/Models/Telematic.php +2 -2
  217. package/server/src/Models/TrackingNumber.php +55 -10
  218. package/server/src/Models/TrackingStatus.php +24 -4
  219. package/server/src/Models/Waypoint.php +44 -10
  220. package/server/src/Models/Zone.php +3 -6
  221. package/server/src/Notifications/DriverArrivedAtGeofence.php +1 -1
  222. package/server/src/Notifications/OrderDispatched.php +3 -9
  223. package/server/src/Notifications/OrderPing.php +3 -9
  224. package/server/src/Observers/CategoryObserver.php +6 -1
  225. package/server/src/Observers/CompanyObserver.php +5 -0
  226. package/server/src/Observers/CompanyUserObserver.php +12 -2
  227. package/server/src/Observers/DriverObserver.php +19 -4
  228. package/server/src/Observers/FleetObserver.php +6 -1
  229. package/server/src/Observers/PurchaseRateObserver.php +66 -11
  230. package/server/src/Observers/ServiceAreaObserver.php +12 -2
  231. package/server/src/Observers/ServiceRateObserver.php +21 -6
  232. package/server/src/Observers/TrackingNumberObserver.php +19 -4
  233. package/server/src/Observers/UserObserver.php +6 -1
  234. package/server/src/Observers/VehicleObserver.php +27 -7
  235. package/server/src/Observers/WorkOrderObserver.php +27 -7
  236. package/server/src/Orchestration/Engines/DriverAssignmentEngine.php +8 -3
  237. package/server/src/Orchestration/Support/OrchestrationPayloadBuilder.php +2 -2
  238. package/server/src/Providers/FleetOpsServiceProvider.php +12 -0
  239. package/server/src/Providers/NotificationServiceProvider.php +6 -0
  240. package/server/src/Support/Ai/Capabilities/AssetStatusCapability.php +36 -26
  241. package/server/src/Support/Ai/Capabilities/CreateOrderPreviewCapability.php +18 -5
  242. package/server/src/Support/Ai/Capabilities/OrderInsightsCapability.php +6 -1
  243. package/server/src/Support/Ai/Capabilities/SearchResourcesCapability.php +26 -6
  244. package/server/src/Support/Analytics/FuelEfficiency.php +9 -3
  245. package/server/src/Support/Analytics/FuelProviderSummary.php +14 -5
  246. package/server/src/Support/Analytics/GeofenceViolations.php +40 -20
  247. package/server/src/Support/Analytics/IssuesInsights.php +38 -18
  248. package/server/src/Support/Analytics/MaintenanceOverview.php +51 -21
  249. package/server/src/Support/Analytics/OnTimeDelivery.php +3 -2
  250. package/server/src/Support/Analytics/OperationsPulse.php +59 -35
  251. package/server/src/Support/Analytics/OrdersByStatus.php +12 -7
  252. package/server/src/Support/Analytics/RevenueTrend.php +16 -6
  253. package/server/src/Support/Analytics/TopDrivers.php +3 -2
  254. package/server/src/Support/FleetOps.php +109 -104
  255. package/server/src/Support/Geocoding.php +52 -14
  256. package/server/src/Support/GeofenceIntersectionService.php +47 -27
  257. package/server/src/Support/LiveOrderQuery.php +6 -1
  258. package/server/src/Support/Metrics/ActiveRevenueQuery.php +3 -2
  259. package/server/src/Support/Metrics/FuelCostsMetric.php +6 -1
  260. package/server/src/Support/ResolvesOrderServiceStops.php +10 -0
  261. package/server/src/Support/Telematics/Providers/GeotabProvider.php +9 -4
  262. package/server/src/Support/Utils.php +122 -16
  263. package/server/src/Tracking/Providers/GoogleRoutesTrackingProvider.php +6 -1
  264. package/server/src/Tracking/Providers/OsrmTrackingProvider.php +11 -6
  265. package/server/src/Tracking/TrackingProviderManager.php +2 -3
  266. package/server/src/Tracking/TrackingProviderRegistry.php +8 -4
  267. package/server/src/Traits/PayloadAccessors.php +6 -1
  268. package/server/src/routes.php +23 -16
  269. package/server/tests/AiOperationalQueryCapabilityTest.php +457 -1
  270. package/server/tests/AiPreviewCapabilityContractsTest.php +180 -0
  271. package/server/tests/AnalyticsRoutesTest.php +380 -1
  272. package/server/tests/AnalyticsWidgetContractsTest.php +740 -0
  273. package/server/tests/ApiContactControllerContractsTest.php +284 -0
  274. package/server/tests/ApiCustomerControllerContractsTest.php +962 -0
  275. package/server/tests/ApiDriverControllerContractsTest.php +571 -0
  276. package/server/tests/ApiEntityControllerContractsTest.php +329 -0
  277. package/server/tests/ApiEquipmentControllerContractsTest.php +239 -0
  278. package/server/tests/ApiFleetControllerContractsTest.php +176 -0
  279. package/server/tests/ApiFuelReportControllerContractsTest.php +217 -0
  280. package/server/tests/ApiIssueControllerContractsTest.php +217 -0
  281. package/server/tests/ApiOrderControllerContractsTest.php +1030 -0
  282. package/server/tests/ApiPartControllerContractsTest.php +251 -0
  283. package/server/tests/ApiPayloadControllerContractsTest.php +314 -0
  284. package/server/tests/ApiPlaceControllerContractsTest.php +541 -0
  285. package/server/tests/ApiPurchaseRateControllerContractsTest.php +283 -0
  286. package/server/tests/ApiServiceAreaZoneControllerContractsTest.php +442 -0
  287. package/server/tests/ApiServiceQuoteControllerContractsTest.php +322 -0
  288. package/server/tests/ApiTrackingNumberControllerContractsTest.php +225 -0
  289. package/server/tests/ApiTrackingStatusControllerContractsTest.php +254 -0
  290. package/server/tests/ApiVehicleControllerContractsTest.php +368 -0
  291. package/server/tests/ApiVendorControllerContractsTest.php +199 -0
  292. package/server/tests/AssetAndPlaceSearchContractsTest.php +220 -0
  293. package/server/tests/BackendSmallModelContractsTest.php +354 -0
  294. package/server/tests/CapacityAllocationEngineTest.php +56 -0
  295. package/server/tests/CommandContractsTest.php +2695 -0
  296. package/server/tests/CompactResourceSerializationTest.php +2745 -0
  297. package/server/tests/ControllerFilterContractsTest.php +1273 -0
  298. package/server/tests/ControllerHelperContractsTest.php +1740 -0
  299. package/server/tests/ControllerSerializationContractsTest.php +141 -0
  300. package/server/tests/CoverageSummaryScriptTest.php +93 -0
  301. package/server/tests/CustomerContactIdentitySafetyTest.php +1 -6
  302. package/server/tests/CustomerEndpointTest.php +165 -1
  303. package/server/tests/DriverFilterExecutionTest.php +263 -0
  304. package/server/tests/DriverGeofenceProcessingTest.php +153 -0
  305. package/server/tests/DriverResourceSerializationTest.php +245 -0
  306. package/server/tests/DriverSchedulingTraitContractsTest.php +259 -0
  307. package/server/tests/EventContractsTest.php +1259 -0
  308. package/server/tests/ExceptionContractsTest.php +81 -0
  309. package/server/tests/ExpansionContractsTest.php +242 -0
  310. package/server/tests/ExportCoverageTest.php +116 -0
  311. package/server/tests/Feature/Http/Api/ContactControllerPhotoAndDeleteTest.php +199 -0
  312. package/server/tests/Feature/Http/Api/CustomerControllerHelperSeamsTest.php +831 -0
  313. package/server/tests/Feature/Http/Api/DeviceControllerContractsTest.php +347 -0
  314. package/server/tests/Feature/Http/Api/DeviceControllerCrudTest.php +176 -0
  315. package/server/tests/Feature/Http/Api/DriverControllerAuthFlowsTest.php +451 -0
  316. package/server/tests/Feature/Http/Api/DriverControllerHelpersTest.php +240 -0
  317. package/server/tests/Feature/Http/Api/DriverControllerLookupTest.php +186 -0
  318. package/server/tests/Feature/Http/Api/DriverControllerOrganizationsTest.php +112 -0
  319. package/server/tests/Feature/Http/Api/DriverControllerSessionHelpersTest.php +207 -0
  320. package/server/tests/Feature/Http/Api/DriverControllerSwitchOrgAndGeofenceTest.php +329 -0
  321. package/server/tests/Feature/Http/Api/DriverControllerTrackTest.php +383 -0
  322. package/server/tests/Feature/Http/Api/EntityControllerHelpersTest.php +150 -0
  323. package/server/tests/Feature/Http/Api/FuelTransactionControllerContractsTest.php +352 -0
  324. package/server/tests/Feature/Http/Api/GeofenceControllerContractsTest.php +364 -0
  325. package/server/tests/Feature/Http/Api/LabelControllerSubjectsTest.php +148 -0
  326. package/server/tests/Feature/Http/Api/OrderConfigControllerTest.php +112 -0
  327. package/server/tests/Feature/Http/Api/OrderControllerCreateTest.php +279 -0
  328. package/server/tests/Feature/Http/Api/OrderControllerIntegratedVendorTest.php +295 -0
  329. package/server/tests/Feature/Http/Api/OrderControllerLifecycleActionsTest.php +279 -0
  330. package/server/tests/Feature/Http/Api/OrderControllerLookupHelpersTest.php +207 -0
  331. package/server/tests/Feature/Http/Api/OrderControllerNearbyFiltersTest.php +282 -0
  332. package/server/tests/Feature/Http/Api/OrderControllerPersistenceHelpersTest.php +216 -0
  333. package/server/tests/Feature/Http/Api/OrderControllerQueryFiltersTest.php +184 -0
  334. package/server/tests/Feature/Http/Api/OrderControllerStartActivityTest.php +663 -0
  335. package/server/tests/Feature/Http/Api/PayloadControllerHelpersTest.php +134 -0
  336. package/server/tests/Feature/Http/Api/PlaceAndServiceQuoteSeamsTest.php +479 -0
  337. package/server/tests/Feature/Http/Api/PurchaseRateControllerHelpersTest.php +176 -0
  338. package/server/tests/Feature/Http/Api/PurchaseRateControllerOrderCreationTest.php +268 -0
  339. package/server/tests/Feature/Http/Api/SensorControllerCrudTest.php +239 -0
  340. package/server/tests/Feature/Http/Api/ServiceAreaControllerBorderAndSeamsTest.php +187 -0
  341. package/server/tests/Feature/Http/Api/ServiceQuoteControllerQueryTest.php +405 -0
  342. package/server/tests/Feature/Http/Api/ServiceQuoteControllerVendorBridgeTest.php +212 -0
  343. package/server/tests/Feature/Http/Api/ServiceRateControllerContractsTest.php +263 -0
  344. package/server/tests/Feature/Http/Api/SmallApiControllerHelpersTest.php +272 -0
  345. package/server/tests/Feature/Http/Api/TrackingNumberControllerHelpersTest.php +154 -0
  346. package/server/tests/Feature/Http/Api/TrackingStatusControllerHelpersTest.php +165 -0
  347. package/server/tests/Feature/Http/Api/VehicleControllerTrackingTest.php +483 -0
  348. package/server/tests/Feature/Http/Api/WorkOrderControllerContractsTest.php +326 -0
  349. package/server/tests/Feature/Http/Api/WorkOrderControllerHelpersTest.php +130 -0
  350. package/server/tests/Feature/Http/Api/ZoneControllerBordersAndSeamsTest.php +294 -0
  351. package/server/tests/Feature/Http/FleetOpsRouteRegistrationTest.php +189 -0
  352. package/server/tests/Feature/Http/Internal/AnalyticsControllerSeamsTest.php +53 -0
  353. package/server/tests/Feature/Http/Internal/ContactControllerContractsTest.php +240 -0
  354. package/server/tests/Feature/Http/Internal/ContactControllerCustomerGuardsTest.php +128 -0
  355. package/server/tests/Feature/Http/Internal/ContactControllerEndpointsTest.php +294 -0
  356. package/server/tests/Feature/Http/Internal/CustomerControllerCredentialsTest.php +196 -0
  357. package/server/tests/Feature/Http/Internal/DeviceControllerContractsTest.php +370 -0
  358. package/server/tests/Feature/Http/Internal/DeviceControllerExportAndFiltersTest.php +151 -0
  359. package/server/tests/Feature/Http/Internal/DriverControllerContractsTest.php +1109 -0
  360. package/server/tests/Feature/Http/Internal/DriverControllerCreateRecordTest.php +233 -0
  361. package/server/tests/Feature/Http/Internal/DriverControllerExistingUserAdoptionTest.php +710 -0
  362. package/server/tests/Feature/Http/Internal/DriverControllerHelpersTest.php +218 -0
  363. package/server/tests/Feature/Http/Internal/FleetAssignmentsAndTriggersTest.php +198 -0
  364. package/server/tests/Feature/Http/Internal/FleetOpsLookupControllerDbTest.php +90 -0
  365. package/server/tests/Feature/Http/Internal/HubControllerTest.php +206 -0
  366. package/server/tests/Feature/Http/Internal/IssueControllerContractsTest.php +404 -0
  367. package/server/tests/Feature/Http/Internal/IssueControllerExportImportTest.php +118 -0
  368. package/server/tests/Feature/Http/Internal/LiveControllerEndpointsTest.php +246 -0
  369. package/server/tests/Feature/Http/Internal/LiveControllerTest.php +778 -0
  370. package/server/tests/Feature/Http/Internal/MaintenanceScheduleControllerContractsTest.php +263 -0
  371. package/server/tests/Feature/Http/Internal/MaintenanceScheduleControllerSurfacesTest.php +214 -0
  372. package/server/tests/Feature/Http/Internal/MetricsControllerContractsTest.php +249 -0
  373. package/server/tests/Feature/Http/Internal/MetricsControllerHelpersTest.php +66 -0
  374. package/server/tests/Feature/Http/Internal/MorphControllerHelpersTest.php +125 -0
  375. package/server/tests/Feature/Http/Internal/NavigatorControllerHelpersTest.php +201 -0
  376. package/server/tests/Feature/Http/Internal/OrchestrationControllerContractsTest.php +928 -0
  377. package/server/tests/Feature/Http/Internal/OrchestrationControllerHelpersTest.php +214 -0
  378. package/server/tests/Feature/Http/Internal/OrchestrationControllerImportOrdersTest.php +340 -0
  379. package/server/tests/Feature/Http/Internal/OrderConfigControllerContractsTest.php +314 -0
  380. package/server/tests/Feature/Http/Internal/OrderControllerActivityFlowsTest.php +663 -0
  381. package/server/tests/Feature/Http/Internal/OrderControllerCapturePhotoTest.php +507 -0
  382. package/server/tests/Feature/Http/Internal/OrderControllerContractsTest.php +1742 -0
  383. package/server/tests/Feature/Http/Internal/OrderControllerCreateRecordTest.php +488 -0
  384. package/server/tests/Feature/Http/Internal/OrderControllerHelperSeamsTest.php +298 -0
  385. package/server/tests/Feature/Http/Internal/OrderControllerHelpersTest.php +267 -0
  386. package/server/tests/Feature/Http/Internal/OrderControllerImportFromFilesTest.php +179 -0
  387. package/server/tests/Feature/Http/Internal/OrderControllerUpstreamNotFoundTest.php +80 -0
  388. package/server/tests/Feature/Http/Internal/PaymentControllerPaymentsTest.php +154 -0
  389. package/server/tests/Feature/Http/Internal/PlaceControllerTest.php +252 -0
  390. package/server/tests/Feature/Http/Internal/PositionControllerReplayMetricsTest.php +163 -0
  391. package/server/tests/Feature/Http/Internal/ProofControllerContractsTest.php +219 -0
  392. package/server/tests/Feature/Http/Internal/SearchControllerEndpointTest.php +151 -0
  393. package/server/tests/Feature/Http/Internal/ServiceQuoteControllerHelpersTest.php +208 -0
  394. package/server/tests/Feature/Http/Internal/ServiceQuoteControllerQueryRecordTest.php +217 -0
  395. package/server/tests/Feature/Http/Internal/ServiceQuoteControllerVendorBridgeTest.php +239 -0
  396. package/server/tests/Feature/Http/Internal/ServiceQuotePreliminaryQueryTest.php +271 -0
  397. package/server/tests/Feature/Http/Internal/SettingControllerHelpersTest.php +133 -0
  398. package/server/tests/Feature/Http/Internal/SmallInternalControllersTest.php +180 -0
  399. package/server/tests/Feature/Http/Internal/TelematicControllerEndpointsTest.php +417 -0
  400. package/server/tests/Feature/Http/Internal/VehicleControllerEndpointsTest.php +361 -0
  401. package/server/tests/Feature/Http/Internal/VendorControllerEndpointsTest.php +203 -0
  402. package/server/tests/Feature/Http/Internal/WorkOrderAndConfigSurfacesTest.php +289 -0
  403. package/server/tests/Feature/Http/Internal/WorkOrderControllerContractsTest.php +199 -0
  404. package/server/tests/Feature/Http/TelematicWebhookIngestTest.php +343 -0
  405. package/server/tests/Feature/Http/Telematics/TelematicWebhookControllerProcessingTest.php +254 -0
  406. package/server/tests/FleetOpsSupportContractsTest.php +187 -0
  407. package/server/tests/FlespiProviderContractsTest.php +244 -0
  408. package/server/tests/FlowResourceTest.php +295 -0
  409. package/server/tests/FuelProviderConnectionControllerContractsTest.php +303 -0
  410. package/server/tests/FuelProviderImplementationTest.php +753 -0
  411. package/server/tests/FuelProviderResourceContractsTest.php +171 -0
  412. package/server/tests/FuelProviderTransactionControllerContractsTest.php +181 -0
  413. package/server/tests/GeofenceIntersectionServiceContractsTest.php +164 -0
  414. package/server/tests/HOSConstraintContractsTest.php +128 -0
  415. package/server/tests/HubAndGettingStartedContractsTest.php +158 -0
  416. package/server/tests/ImportContractsTest.php +191 -0
  417. package/server/tests/InternalCustomerControllerContractsTest.php +238 -0
  418. package/server/tests/InternalFleetControllerContractsTest.php +389 -0
  419. package/server/tests/InternalImportExportControllerContractsTest.php +289 -0
  420. package/server/tests/InternalMetricsControllerContractsTest.php +69 -0
  421. package/server/tests/InternalPlaceWorkOrderControllerContractsTest.php +207 -0
  422. package/server/tests/InternalServiceQuoteCheckoutControllerContractsTest.php +470 -0
  423. package/server/tests/InternalVendorControllerContractsTest.php +331 -0
  424. package/server/tests/InventoryTelemetryModelContractsTest.php +516 -0
  425. package/server/tests/IssueTimelineContractsTest.php +191 -0
  426. package/server/tests/LabelPdfRenderingTest.php +57 -0
  427. package/server/tests/LalamoveIntegrationContractsTest.php +167 -0
  428. package/server/tests/LiveOrderQueryTest.php +145 -18
  429. package/server/tests/LookupAndGeocoderControllerContractsTest.php +357 -0
  430. package/server/tests/MaintainableTraitContractsTest.php +245 -0
  431. package/server/tests/MaintenanceScheduleControllerContractsTest.php +101 -0
  432. package/server/tests/MaintenanceWarrantyContractsTest.php +237 -0
  433. package/server/tests/ManifestControllerContractsTest.php +310 -0
  434. package/server/tests/MetricsRegistryTest.php +596 -10
  435. package/server/tests/MiddlewareContractsTest.php +150 -0
  436. package/server/tests/ModelAccessorContractsTest.php +3201 -0
  437. package/server/tests/MorphControllerContractsTest.php +410 -0
  438. package/server/tests/NavigatorControllerContractsTest.php +206 -0
  439. package/server/tests/NotificationAndMailContractsTest.php +677 -0
  440. package/server/tests/ObserverContractsTest.php +1414 -0
  441. package/server/tests/OperationalAlgorithmContractsTest.php +852 -0
  442. package/server/tests/OperationsMonitorEndpointTest.php +2 -1
  443. package/server/tests/OrchestrationPayloadBuilderTest.php +87 -0
  444. package/server/tests/OrderActivityFlowRegressionTest.php +354 -7
  445. package/server/tests/OrderDispatchListenerContractsTest.php +577 -0
  446. package/server/tests/OrderFilterExecutionTest.php +244 -0
  447. package/server/tests/OrderQueuedClosureRegressionTest.php +2 -1
  448. package/server/tests/PaymentControllerContractsTest.php +199 -0
  449. package/server/tests/PointResolutionTest.php +54 -0
  450. package/server/tests/ProcessAllocationJobContractsTest.php +224 -0
  451. package/server/tests/ProofAndSensorControllerContractsTest.php +44 -0
  452. package/server/tests/ProviderContractsTest.php +409 -0
  453. package/server/tests/PublicApiControllerInputContractsTest.php +294 -0
  454. package/server/tests/QueueJobContractsTest.php +764 -0
  455. package/server/tests/ReportSchemaContractsTest.php +271 -0
  456. package/server/tests/RequestContractsTest.php +966 -0
  457. package/server/tests/RouteRegistrationExecutionTest.php +178 -0
  458. package/server/tests/RouteSequencingEngineTest.php +179 -0
  459. package/server/tests/RulesAndCastsTest.php +246 -0
  460. package/server/tests/SamsaraProviderContractsTest.php +272 -0
  461. package/server/tests/SearchControllerContractsTest.php +311 -0
  462. package/server/tests/ServiceRateRouteValidationTest.php +76 -0
  463. package/server/tests/SettingControllerContractsTest.php +410 -0
  464. package/server/tests/SmallControllerContractsTest.php +456 -0
  465. package/server/tests/SupportAnalyticsCustomerAuthContractsTest.php +221 -0
  466. package/server/tests/SupportJobAndAiCoverageTest.php +812 -0
  467. package/server/tests/SupportServiceContractsTest.php +287 -0
  468. package/server/tests/SupportValueObjectsTest.php +155 -0
  469. package/server/tests/TelematicControllerContractsTest.php +185 -0
  470. package/server/tests/TelematicProviderRegistryTest.php +167 -0
  471. package/server/tests/TelematicServiceHelperContractsTest.php +315 -0
  472. package/server/tests/TelematicWebhookControllerContractsTest.php +253 -0
  473. package/server/tests/TelematicsHardeningTest.php +642 -86
  474. package/server/tests/TrackingIntelligenceTest.php +644 -1
  475. package/server/tests/TrackingNumberTraitContractsTest.php +106 -0
  476. package/server/tests/Unit/Casts/SpatialCastBranchesTest.php +75 -0
  477. package/server/tests/Unit/Console/AssignCustomerRolesCommandTest.php +102 -0
  478. package/server/tests/Unit/Console/AssignDriverRolesCommandTest.php +113 -0
  479. package/server/tests/Unit/Console/Commands/FixLegacyOrderConfigsHelpersTest.php +108 -0
  480. package/server/tests/Unit/Console/Commands/ProcessOperationalAlertsCommandTest.php +265 -0
  481. package/server/tests/Unit/Console/Commands/ReplayVehicleLocationsCommandTest.php +320 -0
  482. package/server/tests/Unit/Console/Commands/SimulateGeofenceEventsCommandTest.php +207 -0
  483. package/server/tests/Unit/Console/FixCommandsAndMaintenanceControllerTest.php +256 -0
  484. package/server/tests/Unit/Console/FleetOpsCommandsTest.php +198 -0
  485. package/server/tests/Unit/Console/ReplayVehicleLocationsCommandTest.php +252 -0
  486. package/server/tests/Unit/Console/SendMaintenanceRemindersTest.php +212 -0
  487. package/server/tests/Unit/Console/SimulateGeofenceEventsCommandTest.php +232 -0
  488. package/server/tests/Unit/Console/SyncTelematicsCommandTest.php +136 -0
  489. package/server/tests/Unit/Constraints/HOSConstraintTest.php +158 -0
  490. package/server/tests/Unit/Events/EventModelRecordTest.php +93 -0
  491. package/server/tests/Unit/Events/OrderDispatchFailedTest.php +34 -0
  492. package/server/tests/Unit/Exports/ExportCollectionsTest.php +142 -0
  493. package/server/tests/Unit/Exports/OperationalExportMappingTest.php +651 -0
  494. package/server/tests/Unit/Exports/VehicleExportTest.php +284 -0
  495. package/server/tests/Unit/Flow/EventFiringTest.php +95 -0
  496. package/server/tests/Unit/Http/Api/QueryWithRequestSeamsTest.php +198 -0
  497. package/server/tests/Unit/Http/Api/SensorInputTest.php +95 -0
  498. package/server/tests/Unit/Http/Filter/DeviceFilterTest.php +199 -0
  499. package/server/tests/Unit/Http/Filter/EmptyValueGuardsTest.php +66 -0
  500. package/server/tests/Unit/Http/Filter/FilterDateRangesTest.php +72 -0
  501. package/server/tests/Unit/Http/Filter/FuelProviderTransactionFilterTest.php +172 -0
  502. package/server/tests/Unit/Http/Filter/InternalRelationUuidLookupTest.php +135 -0
  503. package/server/tests/Unit/Http/Filter/IssueFilterTest.php +129 -0
  504. package/server/tests/Unit/Http/Filter/PartFilterTest.php +173 -0
  505. package/server/tests/Unit/Http/Internal/ControllerDelegationSeamsTest.php +136 -0
  506. package/server/tests/Unit/Http/Internal/ControllerExcelSeamsTest.php +89 -0
  507. package/server/tests/Unit/Http/Middleware/SetupDriverSessionTest.php +32 -0
  508. package/server/tests/Unit/Http/Requests/CreateFuelReportRequestTest.php +47 -0
  509. package/server/tests/Unit/Http/Requests/FleetActionRequestTest.php +80 -0
  510. package/server/tests/Unit/Http/Requests/RequestAuthorizationTest.php +50 -0
  511. package/server/tests/Unit/Http/Resources/CustomerResourceTest.php +108 -0
  512. package/server/tests/Unit/Http/Resources/EntityCustomerTypeTest.php +35 -0
  513. package/server/tests/Unit/Http/Resources/FleetResourceTest.php +102 -0
  514. package/server/tests/Unit/Http/Resources/IndexOrderResourceTest.php +210 -0
  515. package/server/tests/Unit/Http/Resources/IndexVehicleResourceTest.php +194 -0
  516. package/server/tests/Unit/Http/Resources/MaintenanceResourcesTest.php +182 -0
  517. package/server/tests/Unit/Http/Resources/OrderAndDriverResourceTest.php +121 -0
  518. package/server/tests/Unit/Http/Resources/OrderConfigResourceTest.php +47 -0
  519. package/server/tests/Unit/Http/Resources/PayloadResourceTest.php +111 -0
  520. package/server/tests/Unit/Http/Resources/RelationResourceFallbacksTest.php +32 -0
  521. package/server/tests/Unit/Http/Resources/ResourceRelationResolutionTest.php +55 -0
  522. package/server/tests/Unit/Http/Resources/TrackingNumberResourceTest.php +174 -0
  523. package/server/tests/Unit/Http/Resources/WaypointResourceTest.php +295 -0
  524. package/server/tests/Unit/Http/Resources/WorkOrderResourceTest.php +164 -0
  525. package/server/tests/Unit/Imports/ImportDelegationTest.php +151 -0
  526. package/server/tests/Unit/Integrations/Lalamove/LalamoveDeliveryStopTest.php +79 -0
  527. package/server/tests/Unit/Integrations/Lalamove/LalamoveLifecycleTest.php +211 -0
  528. package/server/tests/Unit/Integrations/Lalamove/LalamoveQuoteAndServiceOrderTest.php +381 -0
  529. package/server/tests/Unit/Integrations/Lalamove/LalamoveServiceTypeTest.php +51 -0
  530. package/server/tests/Unit/Integrations/LalamoveQuotationTest.php +194 -0
  531. package/server/tests/Unit/Integrations/LalamoveResponseHandlingTest.php +58 -0
  532. package/server/tests/Unit/Jobs/GeofenceDwellAndBulkNotifyTest.php +183 -0
  533. package/server/tests/Unit/Jobs/ReplayPositionsTest.php +57 -0
  534. package/server/tests/Unit/Jobs/SimulateWaypointReachedTest.php +92 -0
  535. package/server/tests/Unit/Listeners/HandleGeofenceEnteredTest.php +256 -0
  536. package/server/tests/Unit/Listeners/HandleOrderDispatchFailedListenerTest.php +101 -0
  537. package/server/tests/Unit/Listeners/HandleOrderDispatchedConcreteTest.php +203 -0
  538. package/server/tests/Unit/Listeners/HandleOrderDispatchedHelpersTest.php +186 -0
  539. package/server/tests/Unit/Listeners/HandleUserRemovedFromCompanyTest.php +65 -0
  540. package/server/tests/Unit/Listeners/ListenerDelegationSeamsTest.php +83 -0
  541. package/server/tests/Unit/Models/AssetTest.php +469 -0
  542. package/server/tests/Unit/Models/ContactCustomerUserTest.php +370 -0
  543. package/server/tests/Unit/Models/ContactTest.php +577 -0
  544. package/server/tests/Unit/Models/DeviceEventTest.php +481 -0
  545. package/server/tests/Unit/Models/DeviceLastPositionDefaultTest.php +128 -0
  546. package/server/tests/Unit/Models/DriverModelHelpersTest.php +268 -0
  547. package/server/tests/Unit/Models/DriverTest.php +401 -0
  548. package/server/tests/Unit/Models/EntityTest.php +171 -0
  549. package/server/tests/Unit/Models/EquipmentTest.php +434 -0
  550. package/server/tests/Unit/Models/FleetTest.php +153 -0
  551. package/server/tests/Unit/Models/FuelProviderTransactionTest.php +82 -0
  552. package/server/tests/Unit/Models/FuelReportImportAndLabelsTest.php +193 -0
  553. package/server/tests/Unit/Models/ImportRowFallbackSeamsTest.php +100 -0
  554. package/server/tests/Unit/Models/IntegratedVendorLifecycleTest.php +203 -0
  555. package/server/tests/Unit/Models/IntegratedVendorTest.php +135 -0
  556. package/server/tests/Unit/Models/IssueTest.php +160 -0
  557. package/server/tests/Unit/Models/MaintenanceScheduleTest.php +319 -0
  558. package/server/tests/Unit/Models/MaintenanceTest.php +277 -0
  559. package/server/tests/Unit/Models/MaintenanceWorkOrderImportTest.php +161 -0
  560. package/server/tests/Unit/Models/ManifestStopTest.php +121 -0
  561. package/server/tests/Unit/Models/ManifestTest.php +163 -0
  562. package/server/tests/Unit/Models/ModelLookupFallbackSeamsTest.php +149 -0
  563. package/server/tests/Unit/Models/OrderConfigTest.php +341 -0
  564. package/server/tests/Unit/Models/OrderDynamicContractsTest.php +190 -0
  565. package/server/tests/Unit/Models/OrderPayloadConfigAndDistanceTest.php +426 -0
  566. package/server/tests/Unit/Models/OrderPayloadRouteTest.php +227 -0
  567. package/server/tests/Unit/Models/OrderPurchaseAndDriversTest.php +188 -0
  568. package/server/tests/Unit/Models/OrderTest.php +917 -0
  569. package/server/tests/Unit/Models/PartTest.php +399 -0
  570. package/server/tests/Unit/Models/PayloadTest.php +710 -0
  571. package/server/tests/Unit/Models/PayloadWaypointsAndEntitiesTest.php +317 -0
  572. package/server/tests/Unit/Models/PlaceCreationAndImportTest.php +384 -0
  573. package/server/tests/Unit/Models/PlaceGeocodingResultsTest.php +253 -0
  574. package/server/tests/Unit/Models/PlaceSharedAndGeocodingTest.php +271 -0
  575. package/server/tests/Unit/Models/PlaceTest.php +589 -0
  576. package/server/tests/Unit/Models/PositionTest.php +49 -0
  577. package/server/tests/Unit/Models/RouteTest.php +55 -0
  578. package/server/tests/Unit/Models/SensorReadingsTest.php +168 -0
  579. package/server/tests/Unit/Models/SensorTest.php +284 -0
  580. package/server/tests/Unit/Models/ServiceAreaGeometryTest.php +129 -0
  581. package/server/tests/Unit/Models/ServiceAreaTest.php +125 -0
  582. package/server/tests/Unit/Models/ServiceQuoteTest.php +617 -0
  583. package/server/tests/Unit/Models/ServiceRateFeeTest.php +73 -0
  584. package/server/tests/Unit/Models/ServiceRatePersistenceAndServicabilityTest.php +428 -0
  585. package/server/tests/Unit/Models/ServiceRateTest.php +533 -0
  586. package/server/tests/Unit/Models/SmallModelSurfacesTest.php +294 -0
  587. package/server/tests/Unit/Models/TrackingNumberTest.php +199 -0
  588. package/server/tests/Unit/Models/TrackingStatusTest.php +131 -0
  589. package/server/tests/Unit/Models/VehicleDeviceTest.php +115 -0
  590. package/server/tests/Unit/Models/VehiclePositionsAndImportTest.php +220 -0
  591. package/server/tests/Unit/Models/VehicleTest.php +266 -0
  592. package/server/tests/Unit/Models/VendorRelationsAndImportTest.php +107 -0
  593. package/server/tests/Unit/Models/WarrantyTest.php +187 -0
  594. package/server/tests/Unit/Models/WaypointTest.php +366 -0
  595. package/server/tests/Unit/Models/WorkOrderTest.php +272 -0
  596. package/server/tests/Unit/Models/ZoneTest.php +83 -0
  597. package/server/tests/Unit/Notifications/MonitoringNotificationsTest.php +136 -0
  598. package/server/tests/Unit/Notifications/OrderAssignedChannelsTest.php +53 -0
  599. package/server/tests/Unit/Notifications/OrderDispatchedChannelsTest.php +81 -0
  600. package/server/tests/Unit/Notifications/OrderFailedChannelsTest.php +73 -0
  601. package/server/tests/Unit/Notifications/OrderPingChannelsTest.php +69 -0
  602. package/server/tests/Unit/Notifications/TerminalOrderNotificationsTest.php +185 -0
  603. package/server/tests/Unit/Observers/FleetOpsCompanyUserAndServiceAreaObserversTest.php +133 -0
  604. package/server/tests/Unit/Observers/ObserverHelperExecutionTest.php +135 -0
  605. package/server/tests/Unit/Observers/ObserverListenerSeamsTest.php +267 -0
  606. package/server/tests/Unit/Observers/PurchaseRateObserverAndOrderJobsTest.php +169 -0
  607. package/server/tests/Unit/Orchestration/Engines/DriverAssignmentEngineTest.php +393 -0
  608. package/server/tests/Unit/Orchestration/Engines/VroomOrchestrationEngineLifecycleTest.php +397 -0
  609. package/server/tests/Unit/Orchestration/OrchestrationEngineRegistryTest.php +45 -0
  610. package/server/tests/Unit/Orchestration/VroomEngineTransportAndSettingsTest.php +253 -0
  611. package/server/tests/Unit/Providers/FleetOpsAiRegistrationTest.php +59 -0
  612. package/server/tests/Unit/Rules/ResolvableVehicleTest.php +85 -0
  613. package/server/tests/Unit/Support/Ai/AssetStatusCapabilityQueriesTest.php +120 -0
  614. package/server/tests/Unit/Support/Ai/Capabilities/CreateOrderPreviewCapabilityTest.php +385 -0
  615. package/server/tests/Unit/Support/Ai/Capabilities/OrderInsightsCapabilityTest.php +226 -0
  616. package/server/tests/Unit/Support/Ai/Capabilities/SearchResourcesCapabilityTest.php +237 -0
  617. package/server/tests/Unit/Support/AiCapabilityPermissionsTest.php +124 -0
  618. package/server/tests/Unit/Support/AlgoEdgeBranchesTest.php +24 -0
  619. package/server/tests/Unit/Support/Analytics/GeofenceViolationsTest.php +109 -0
  620. package/server/tests/Unit/Support/Analytics/LiveFleetTest.php +205 -0
  621. package/server/tests/Unit/Support/Analytics/MaintenanceOverviewTest.php +236 -0
  622. package/server/tests/Unit/Support/Analytics/OnTimeDeliveryAndTopDriversTest.php +250 -0
  623. package/server/tests/Unit/Support/CreateOrderPreviewDraftingTest.php +235 -0
  624. package/server/tests/Unit/Support/CustomerAuthTest.php +132 -0
  625. package/server/tests/Unit/Support/FuelEfficiencyAndCanceledHandlersTest.php +164 -0
  626. package/server/tests/Unit/Support/FuelProviderRegistryResolutionTest.php +51 -0
  627. package/server/tests/Unit/Support/FuelProviderServiceMatchingTest.php +280 -0
  628. package/server/tests/Unit/Support/GeocodingInjectedClientTest.php +268 -0
  629. package/server/tests/Unit/Support/GeocodingLocateTest.php +32 -0
  630. package/server/tests/Unit/Support/GeofenceIntersectionServiceTest.php +188 -0
  631. package/server/tests/Unit/Support/GettingStartedTest.php +164 -0
  632. package/server/tests/Unit/Support/GuardReturnSeamsTest.php +172 -0
  633. package/server/tests/Unit/Support/IntegratedVendorsResolverTest.php +250 -0
  634. package/server/tests/Unit/Support/IssuesInsightsAndAllocationJobTest.php +156 -0
  635. package/server/tests/Unit/Support/MagicAccessorSeamsTest.php +54 -0
  636. package/server/tests/Unit/Support/MaintainableAndOperationalAlertsTest.php +215 -0
  637. package/server/tests/Unit/Support/Metrics/AvgOrderValueMetricTest.php +308 -0
  638. package/server/tests/Unit/Support/Metrics/CountMetricsTest.php +280 -0
  639. package/server/tests/Unit/Support/Metrics/FuelCostsMetricTest.php +102 -0
  640. package/server/tests/Unit/Support/Metrics/MetricQuerySeamsTest.php +129 -0
  641. package/server/tests/Unit/Support/Metrics/OrdersScheduledMetricTest.php +146 -0
  642. package/server/tests/Unit/Support/MoreQuerySeamsTest.php +410 -0
  643. package/server/tests/Unit/Support/OperationalQueryDistributionTest.php +152 -0
  644. package/server/tests/Unit/Support/OperationsPulseTest.php +130 -0
  645. package/server/tests/Unit/Support/OptimizeOrderRouteCapabilityTest.php +147 -0
  646. package/server/tests/Unit/Support/OrchestrationPayloadBuilderTest.php +135 -0
  647. package/server/tests/Unit/Support/OrchestrationRouteAndVehicleTasksTest.php +254 -0
  648. package/server/tests/Unit/Support/OsrmProofAndIssueFilterTest.php +247 -0
  649. package/server/tests/Unit/Support/PetroAppFuelProviderTest.php +165 -0
  650. package/server/tests/Unit/Support/PlaceSearchRankingTest.php +191 -0
  651. package/server/tests/Unit/Support/QuerySeamsTest.php +309 -0
  652. package/server/tests/Unit/Support/ResolvesOrderServiceStopsDbTest.php +303 -0
  653. package/server/tests/Unit/Support/ResolvesOrderServiceStopsTest.php +382 -0
  654. package/server/tests/Unit/Support/SkipAndFallbackGuardsTest.php +70 -0
  655. package/server/tests/Unit/Support/TelematicCredentialResolutionTest.php +31 -0
  656. package/server/tests/Unit/Support/TelematicServiceTest.php +256 -0
  657. package/server/tests/Unit/Support/Telematics/Providers/AbstractProviderTest.php +154 -0
  658. package/server/tests/Unit/Support/Telematics/Providers/AfaqyProviderTest.php +191 -0
  659. package/server/tests/Unit/Support/Telematics/Providers/AfaqyProviderTransportTest.php +138 -0
  660. package/server/tests/Unit/Support/Telematics/Providers/GeotabProviderTest.php +329 -0
  661. package/server/tests/Unit/Support/Telematics/Providers/ProviderTransportSeamsTest.php +133 -0
  662. package/server/tests/Unit/Support/Telematics/Providers/SafeeProviderTest.php +487 -0
  663. package/server/tests/Unit/Support/Telematics/TelematicProviderRegistryTest.php +39 -0
  664. package/server/tests/Unit/Support/Telematics/TelematicServiceLifecycleTest.php +711 -0
  665. package/server/tests/Unit/Support/Telematics/TelematicServiceTelemetryTest.php +364 -0
  666. package/server/tests/Unit/Support/UtilsAdditionalTest.php +256 -0
  667. package/server/tests/Unit/Support/UtilsGeoMatrixAndVendorTest.php +382 -0
  668. package/server/tests/Unit/Tracking/TrackingContextTest.php +114 -0
  669. package/server/tests/Unit/Tracking/TrackingIntelligenceAndContextTest.php +477 -0
  670. package/server/tests/Unit/Tracking/TrackingProviderManagerFallbacksTest.php +208 -0
  671. package/server/tests/Unit/Traits/HasTrackingNumberTest.php +303 -0
  672. package/server/tests/Unit/Traits/PayloadAccessorsTest.php +150 -0
  673. package/server/tests/UtilsContractsTest.php +244 -0
  674. package/server/tests/VehicleControllerHelperContractsTest.php +488 -0
  675. package/server/tests/VehicleDataParsingTest.php +45 -0
  676. package/server/tests/VehicleResourceContractsTest.php +313 -0
  677. package/translations/bg-bg.yaml +2 -0
  678. package/translations/en-us.yaml +2 -0
  679. package/translations/es-pa.yaml +2 -0
  680. package/translations/fr-fr.yaml +2 -0
  681. package/translations/mn-mn.yaml +2 -0
  682. package/translations/pt-br.yaml +2 -0
  683. package/translations/ru-ru.yaml +2 -0
  684. package/server/tests/DeviceFilterTest.php +0 -44
  685. package/server/tests/LiveControllerViewportTest.php +0 -52
@@ -0,0 +1,1030 @@
1
+ <?php
2
+
3
+ use Fleetbase\FleetOps\Http\Controllers\Api\v1\OrderController;
4
+ use Fleetbase\FleetOps\Http\Requests\CreateOrderRequest;
5
+ use Fleetbase\FleetOps\Http\Requests\ScheduleOrderRequest;
6
+ use Fleetbase\FleetOps\Http\Requests\UpdateOrderRequest;
7
+ use Fleetbase\FleetOps\Models\Contact;
8
+ use Fleetbase\FleetOps\Models\Order;
9
+ use Fleetbase\FleetOps\Models\OrderConfig;
10
+ use Fleetbase\FleetOps\Models\Payload;
11
+ use Fleetbase\FleetOps\Models\Place;
12
+ use Fleetbase\FleetOps\Models\Proof;
13
+ use Fleetbase\FleetOps\Models\ServiceQuote;
14
+ use Fleetbase\FleetOps\Models\Waypoint;
15
+ use Fleetbase\FleetOps\Support\OrderTracker;
16
+ use Fleetbase\Models\File;
17
+ use Illuminate\Database\Eloquent\ModelNotFoundException;
18
+ use Illuminate\Http\Request;
19
+ use Illuminate\Support\Collection;
20
+
21
+ class FleetOpsApiOrderCrudControllerProbe extends OrderController
22
+ {
23
+ public ?FleetOpsApiOrderCrudFake $order = null;
24
+ public mixed $matrix = null;
25
+ public array $createdProofs = [];
26
+ public array $createdFiles = [];
27
+ public array $storedFiles = [];
28
+ public array $proofCollections = [];
29
+ public array $commentCollections = [];
30
+ public array $createdOrders = [];
31
+ public array $finalizedOrders = [];
32
+ public array $uuidLookups = [];
33
+ public array $createdContacts = [];
34
+ public mixed $entityEditingSettings = null;
35
+ public ?OrderConfig $orderConfig = null;
36
+ public ?ServiceQuote $serviceQuote = null;
37
+ public ?FleetOpsApiOrderPayloadFake $payload = null;
38
+ public ?Contact $customerContact = null;
39
+ public ?FleetOpsApiOrderDriverFake $driver = null;
40
+ public bool $orderNotFound = false;
41
+ public bool $missingOrderConfig = false;
42
+ public mixed $resolvedSubject = null;
43
+ public ?string $companyUuid = 'company-uuid';
44
+
45
+ protected function findOrder(string $id, array $with = [], array $withCount = []): Order
46
+ {
47
+ if ($this->orderNotFound) {
48
+ throw new ModelNotFoundException();
49
+ }
50
+
51
+ $this->order ??= new FleetOpsApiOrderCrudFake();
52
+ $this->order->lookups[] = [$id, $with, $withCount];
53
+
54
+ return $this->order;
55
+ }
56
+
57
+ protected function drivingDistanceAndTime(mixed $origin, mixed $destination): mixed
58
+ {
59
+ return $this->matrix ?? (object) ['distance' => 1200, 'time' => 360];
60
+ }
61
+
62
+ protected function resolveOrderConfig(array $input): ?OrderConfig
63
+ {
64
+ if ($this->missingOrderConfig) {
65
+ return null;
66
+ }
67
+
68
+ return $this->orderConfig ?? tap(new OrderConfig(), function (OrderConfig $config) {
69
+ $config->setRawAttributes(['uuid' => 'order-config-uuid', 'key' => 'transport'], true);
70
+ });
71
+ }
72
+
73
+ protected function resolveServiceQuote(Request $request): ?ServiceQuote
74
+ {
75
+ return $this->serviceQuote;
76
+ }
77
+
78
+ protected function newPayload(): Payload
79
+ {
80
+ return $this->payload = new FleetOpsApiOrderPayloadFake();
81
+ }
82
+
83
+ protected function findDriverByPublicId(string $publicId): ?Fleetbase\FleetOps\Models\Driver
84
+ {
85
+ $this->driver ??= new FleetOpsApiOrderDriverFake();
86
+ $this->driver->setRawAttributes([
87
+ 'uuid' => 'driver-uuid',
88
+ 'public_id' => $publicId,
89
+ 'vehicle_uuid' => 'driver-vehicle-uuid',
90
+ ], true);
91
+
92
+ return $this->driver;
93
+ }
94
+
95
+ protected function sessionCompany(): ?string
96
+ {
97
+ return $this->companyUuid;
98
+ }
99
+
100
+ protected function getUuid(array|string $table, array $where, array $options = []): mixed
101
+ {
102
+ $this->uuidLookups[] = [$table, $where, $options];
103
+
104
+ if (is_array($table)) {
105
+ return ['uuid' => implode('-', $table) . '-uuid', 'table' => $table[0]];
106
+ }
107
+
108
+ return $table . '-uuid';
109
+ }
110
+
111
+ protected function getModelClassName(mixed $tableOrModel): ?string
112
+ {
113
+ if ($tableOrModel instanceof Contact) {
114
+ return Contact::class;
115
+ }
116
+
117
+ return match ($tableOrModel) {
118
+ 'contacts' => Contact::class,
119
+ 'vendors' => 'Fleetbase\\FleetOps\\Models\\Vendor',
120
+ 'integrated_vendors' => 'Fleetbase\\FleetOps\\Models\\IntegratedVendor',
121
+ default => is_string($tableOrModel) ? $tableOrModel : null,
122
+ };
123
+ }
124
+
125
+ protected function newCustomerContact(array $attributes): Contact
126
+ {
127
+ $contact = new FleetOpsApiOrderContactFake();
128
+ $contact->setRawAttributes(array_merge(['uuid' => 'candidate-contact-uuid'], $attributes), true);
129
+
130
+ return $contact;
131
+ }
132
+
133
+ protected function firstOrCreateCustomerContact(array $attributes, array $values): Contact
134
+ {
135
+ $this->createdContacts[] = [$attributes, $values];
136
+ $this->customerContact ??= new FleetOpsApiOrderContactFake();
137
+ $this->customerContact->setRawAttributes(array_merge(['uuid' => 'customer-contact-uuid'], $values), true);
138
+
139
+ return $this->customerContact;
140
+ }
141
+
142
+ protected function createOrder(array $input): Order
143
+ {
144
+ $this->createdOrders[] = $input;
145
+ $this->order ??= new FleetOpsApiOrderCrudFake();
146
+ $this->order->setRawAttributes(array_merge(['uuid' => 'created-order-uuid'], $input), true);
147
+
148
+ return $this->order;
149
+ }
150
+
151
+ protected function dispatchFinalizeApiOrderCreation(string $orderUuid, ?string $serviceQuoteUuid, bool $shouldDispatch): void
152
+ {
153
+ $this->finalizedOrders[] = [$orderUuid, $serviceQuoteUuid, $shouldDispatch];
154
+ }
155
+
156
+ protected function resolveSubject(Order $order, ?string $type, ?string $subjectId = null): mixed
157
+ {
158
+ return $this->resolvedSubject;
159
+ }
160
+
161
+ protected function createProof(array $input): Proof
162
+ {
163
+ $this->createdProofs[] = $input;
164
+
165
+ $proof = new FleetOpsApiOrderProofFake();
166
+ $proof->setRawAttributes(array_merge(['uuid' => 'proof-uuid', 'public_id' => 'proof_public'], $input));
167
+
168
+ return $proof;
169
+ }
170
+
171
+ protected function createFile(array $input): File
172
+ {
173
+ $this->createdFiles[] = $input;
174
+
175
+ $file = new FleetOpsApiOrderFileFake();
176
+ $file->setRawAttributes(array_merge(['uuid' => 'file-uuid'], $input));
177
+
178
+ return $file;
179
+ }
180
+
181
+ protected function putStorage(string $disk, string $path, string $contents): void
182
+ {
183
+ $this->storedFiles[] = compact('disk', 'path', 'contents');
184
+ }
185
+
186
+ protected function entityEditingSettings(): mixed
187
+ {
188
+ return $this->entityEditingSettings;
189
+ }
190
+
191
+ protected function defaultCompanyTimezone(): string
192
+ {
193
+ return 'UTC';
194
+ }
195
+
196
+ protected function orderResource(Order $order)
197
+ {
198
+ return ['resource' => 'order', 'order' => $order];
199
+ }
200
+
201
+ protected function deletedOrderResource(Order $order)
202
+ {
203
+ return ['resource' => 'deleted-order', 'order' => $order];
204
+ }
205
+
206
+ protected function proofResource(Proof $proof)
207
+ {
208
+ return ['resource' => 'proof', 'proof' => $proof];
209
+ }
210
+
211
+ protected function proofsForSubject(Order $order, mixed $subject): Collection
212
+ {
213
+ return collect([
214
+ (new FleetOpsApiOrderProofFake())->setRawAttributes([
215
+ 'uuid' => 'proof-one',
216
+ 'order_uuid' => $order->uuid,
217
+ 'subject_uuid' => $subject->uuid,
218
+ ]),
219
+ ]);
220
+ }
221
+
222
+ protected function proofResourceCollection($proofs)
223
+ {
224
+ $this->proofCollections[] = $proofs;
225
+
226
+ return ['resource' => 'proofs', 'proofs' => $proofs->values()->all()];
227
+ }
228
+
229
+ protected function commentResourceCollection($comments)
230
+ {
231
+ $this->commentCollections[] = $comments;
232
+
233
+ return ['resource' => 'comments', 'comments' => $comments->values()->all()];
234
+ }
235
+
236
+ protected function jsonResponse(mixed $payload, int $status = 200)
237
+ {
238
+ return ['json' => $payload, 'status' => $status];
239
+ }
240
+
241
+ protected function apiError(string $message, int $status = 400)
242
+ {
243
+ return ['apiError' => $message, 'status' => $status];
244
+ }
245
+ }
246
+
247
+ class FleetOpsApiOrderCrudFake extends Order
248
+ {
249
+ public array $lookups = [];
250
+ public array $loaded = [];
251
+ public array $updates = [];
252
+ public bool $deletedForTest = false;
253
+ public bool $dispatchedForTest = false;
254
+ public bool $dispatchActivityInserted = false;
255
+ public bool $cancelledForTest = false;
256
+ public bool $hasDriverAssignedForTest = true;
257
+ public bool $adhocForTest = false;
258
+ public bool $dispatchedFlagForTest = false;
259
+ public bool $savedForTest = false;
260
+ public bool $refreshedForTest = false;
261
+ public bool $flushedForTest = false;
262
+ public array $metaUpdates = [];
263
+ public array $purchasedQuotes = [];
264
+ public FleetOpsApiOrderTrackerFake $trackerFake;
265
+
266
+ public function __construct(array $attributes = [])
267
+ {
268
+ parent::__construct($attributes);
269
+
270
+ $this->trackerFake = new FleetOpsApiOrderTrackerFake($this);
271
+ $this->uuid = $attributes['uuid'] ?? 'order-uuid';
272
+ $this->status = $attributes['status'] ?? 'created';
273
+ $this->payload = (object) [
274
+ 'pickup' => (object) ['public_id' => 'pickup-public'],
275
+ 'dropoff' => (object) ['public_id' => 'dropoff-public'],
276
+ 'waypoints' => collect([(object) ['public_id' => 'waypoint-public']]),
277
+ ];
278
+ $this->comments = collect([(object) ['body' => 'Looks good']]);
279
+ }
280
+
281
+ public function getHasDriverAssignedAttribute(): bool
282
+ {
283
+ return $this->hasDriverAssignedForTest;
284
+ }
285
+
286
+ public function getAdhocAttribute(): bool
287
+ {
288
+ return $this->adhocForTest;
289
+ }
290
+
291
+ public function getDispatchedAttribute(): bool
292
+ {
293
+ return $this->dispatchedFlagForTest;
294
+ }
295
+
296
+ public function load($relations)
297
+ {
298
+ $this->loaded[] = $relations;
299
+
300
+ return $this;
301
+ }
302
+
303
+ public function setAttribute($key, $value)
304
+ {
305
+ $this->attributes[$key] = $value;
306
+
307
+ return $this;
308
+ }
309
+
310
+ public function loadMissing($relations)
311
+ {
312
+ $this->loaded[] = $relations;
313
+
314
+ return $this;
315
+ }
316
+
317
+ public function save(array $options = []): bool
318
+ {
319
+ $this->savedForTest = true;
320
+
321
+ return true;
322
+ }
323
+
324
+ public function refresh()
325
+ {
326
+ $this->refreshedForTest = true;
327
+
328
+ return $this;
329
+ }
330
+
331
+ public function update(array $attributes = [], array $options = []): bool
332
+ {
333
+ $this->updates[] = $attributes;
334
+ $this->setRawAttributes(array_merge($this->getAttributes(), $attributes));
335
+
336
+ return true;
337
+ }
338
+
339
+ public function flushAttributesCache(): bool
340
+ {
341
+ $this->flushedForTest = true;
342
+
343
+ return true;
344
+ }
345
+
346
+ public function updateMeta($key, $value = null)
347
+ {
348
+ $this->metaUpdates[] = [$key, $value];
349
+
350
+ return true;
351
+ }
352
+
353
+ public function purchaseServiceQuote($serviceQuote, $meta = [])
354
+ {
355
+ $this->purchasedQuotes[] = $serviceQuote;
356
+ }
357
+
358
+ public function delete()
359
+ {
360
+ $this->deletedForTest = true;
361
+
362
+ return true;
363
+ }
364
+
365
+ public function dispatch(bool $save = true): Order
366
+ {
367
+ $this->dispatchedForTest = true;
368
+
369
+ return $this;
370
+ }
371
+
372
+ public function insertDispatchActivity(): Order
373
+ {
374
+ $this->dispatchActivityInserted = true;
375
+
376
+ return $this;
377
+ }
378
+
379
+ public function cancel()
380
+ {
381
+ $this->cancelledForTest = true;
382
+
383
+ return $this;
384
+ }
385
+
386
+ public function tracker(): OrderTracker
387
+ {
388
+ return $this->trackerFake;
389
+ }
390
+ }
391
+
392
+ class FleetOpsApiOrderPayloadFake extends Payload
393
+ {
394
+ public array $calls = [];
395
+ public bool $savedForTest = false;
396
+ public bool $removedWaypoints = false;
397
+
398
+ public function __construct(array $attributes = [])
399
+ {
400
+ parent::__construct($attributes);
401
+
402
+ $this->uuid = 'payload-built-uuid';
403
+ }
404
+
405
+ public function setPickup($place, array $options = [])
406
+ {
407
+ $this->calls[] = ['pickup', $place];
408
+ if (isset($options['callback'])) {
409
+ $options['callback'](new Place(), $this);
410
+ }
411
+
412
+ return $this;
413
+ }
414
+
415
+ public function setDropoff($place, array $options = [])
416
+ {
417
+ $this->calls[] = ['dropoff', $place];
418
+
419
+ return $this;
420
+ }
421
+
422
+ public function setReturn($place, array $options = [])
423
+ {
424
+ $this->calls[] = ['return', $place];
425
+
426
+ return $this;
427
+ }
428
+
429
+ public function setWaypoints($waypoints = [])
430
+ {
431
+ $this->calls[] = ['waypoints', $waypoints];
432
+
433
+ return $this;
434
+ }
435
+
436
+ public function removeWaypoints()
437
+ {
438
+ $this->removedWaypoints = true;
439
+
440
+ return $this;
441
+ }
442
+
443
+ public function setEntities($entities = [])
444
+ {
445
+ $this->calls[] = ['entities', $entities];
446
+
447
+ return $this;
448
+ }
449
+
450
+ public function setCurrentWaypoint(Place|Waypoint $destination, bool $save = true): Payload
451
+ {
452
+ $this->calls[] = ['current', $destination instanceof Place, $save];
453
+
454
+ return $this;
455
+ }
456
+
457
+ public function getPickupOrFirstWaypoint(): ?Place
458
+ {
459
+ return new Place();
460
+ }
461
+
462
+ public function save(array $options = []): bool
463
+ {
464
+ $this->savedForTest = true;
465
+
466
+ return true;
467
+ }
468
+ }
469
+
470
+ class FleetOpsApiOrderContactFake extends Contact
471
+ {
472
+ public function assertCustomerIdentityIsAvailable(): void
473
+ {
474
+ }
475
+ }
476
+
477
+ class FleetOpsApiOrderDriverFake extends Fleetbase\FleetOps\Models\Driver
478
+ {
479
+ }
480
+
481
+ class FleetOpsApiOrderProofFake extends Proof
482
+ {
483
+ public array $updates = [];
484
+ public bool $saved = false;
485
+
486
+ public function save(array $options = []): bool
487
+ {
488
+ $this->saved = true;
489
+
490
+ return true;
491
+ }
492
+
493
+ public function update(array $attributes = [], array $options = []): bool
494
+ {
495
+ $this->updates[] = $attributes;
496
+ $this->setRawAttributes(array_merge($this->getAttributes(), $attributes));
497
+
498
+ return true;
499
+ }
500
+ }
501
+
502
+ class FleetOpsApiOrderFileFake extends File
503
+ {
504
+ public mixed $keyedTo = null;
505
+
506
+ public function setKey($model, $type = null): File
507
+ {
508
+ $this->keyedTo = $model;
509
+
510
+ return $this;
511
+ }
512
+ }
513
+
514
+ class FleetOpsApiOrderTrackerFake extends OrderTracker
515
+ {
516
+ public array $toArrayOptions = [];
517
+ public array $etaOptions = [];
518
+ public bool $throwOnTrack = false;
519
+
520
+ public function toArray(array $options = []): array
521
+ {
522
+ if ($this->throwOnTrack) {
523
+ throw new RuntimeException('tracking failed');
524
+ }
525
+
526
+ $this->toArrayOptions = $options;
527
+
528
+ return ['tracking' => 'ok', 'options' => $options];
529
+ }
530
+
531
+ public function eta(array $options = []): array
532
+ {
533
+ if ($this->throwOnTrack) {
534
+ throw new RuntimeException('eta failed');
535
+ }
536
+
537
+ $this->etaOptions = $options;
538
+
539
+ return ['eta' => 600, 'options' => $options];
540
+ }
541
+ }
542
+
543
+ class FleetOpsApiOrderScheduleRequestFake extends ScheduleOrderRequest
544
+ {
545
+ public function __construct(private readonly array $inputForTest)
546
+ {
547
+ parent::__construct();
548
+ }
549
+
550
+ public function input($key = null, $default = null)
551
+ {
552
+ if ($key === null) {
553
+ return $this->inputForTest;
554
+ }
555
+
556
+ return data_get($this->inputForTest, $key, $default);
557
+ }
558
+ }
559
+
560
+ class FleetOpsApiOrderCreateRequestFake extends CreateOrderRequest
561
+ {
562
+ public function isArray(string $key): bool
563
+ {
564
+ return is_array($this->input($key));
565
+ }
566
+
567
+ public function isString(string $key): bool
568
+ {
569
+ return is_string($this->input($key));
570
+ }
571
+ }
572
+
573
+ class FleetOpsApiOrderUpdateRequestFake extends UpdateOrderRequest
574
+ {
575
+ public function isArray(string $key): bool
576
+ {
577
+ return is_array($this->input($key));
578
+ }
579
+
580
+ public function isString(string $key): bool
581
+ {
582
+ return is_string($this->input($key));
583
+ }
584
+ }
585
+
586
+ test('api order controller creates orders with payloads assignments customers and finalize dispatch', function () {
587
+ $controller = new FleetOpsApiOrderCrudControllerProbe();
588
+ $quote = new ServiceQuote();
589
+ $quote->setRawAttributes(['uuid' => 'service-quote-uuid'], true);
590
+ $controller->serviceQuote = $quote;
591
+
592
+ $response = $controller->create(new FleetOpsApiOrderCreateRequestFake([
593
+ 'type' => 'transport',
594
+ 'payload' => [
595
+ 'pickup' => ['name' => 'Pickup'],
596
+ 'dropoff' => ['name' => 'Dropoff'],
597
+ 'return' => ['name' => 'Return'],
598
+ 'waypoints' => [['name' => 'Stop']],
599
+ 'entities' => [['name' => 'Box']],
600
+ ],
601
+ 'driver' => 'driver_public',
602
+ 'vehicle' => 'vehicle_public',
603
+ 'facilitator' => 'facilitator_public',
604
+ 'customer' => [
605
+ 'name' => 'Jane Customer',
606
+ 'email' => 'jane@example.test',
607
+ 'phone' => '+15551234567',
608
+ 'meta' => ['tier' => 'gold'],
609
+ ],
610
+ 'adhoc' => 'true',
611
+ 'orchestrator_priority' => null,
612
+ 'dispatch' => true,
613
+ ]));
614
+
615
+ expect($response)->toBe(['resource' => 'order', 'order' => $controller->order])
616
+ ->and($controller->payload->savedForTest)->toBeTrue()
617
+ ->and($controller->payload->calls)->toContain(
618
+ ['pickup', ['name' => 'Pickup']],
619
+ ['dropoff', ['name' => 'Dropoff']],
620
+ ['return', ['name' => 'Return']],
621
+ ['waypoints', [['name' => 'Stop']]],
622
+ ['entities', [['name' => 'Box']]]
623
+ )
624
+ ->and($controller->createdContacts[0][0])->toBe([
625
+ 'company_uuid' => 'company-uuid',
626
+ 'email' => 'jane@example.test',
627
+ 'type' => 'customer',
628
+ ])
629
+ ->and($controller->createdOrders[0])->toMatchArray([
630
+ 'company_uuid' => 'company-uuid',
631
+ 'order_config_uuid' => 'order-config-uuid',
632
+ 'type' => 'transport',
633
+ 'payload_uuid' => 'payload-built-uuid',
634
+ 'driver_assigned_uuid' => 'driver-uuid',
635
+ 'vehicle_assigned_uuid' => 'vehicles-uuid',
636
+ 'facilitator_uuid' => 'contacts-vendors-integrated_vendors-uuid',
637
+ 'facilitator_type' => Contact::class,
638
+ 'customer_uuid' => 'customer-contact-uuid',
639
+ 'customer_type' => Contact::class,
640
+ 'status' => 'created',
641
+ 'adhoc' => 1,
642
+ 'orchestrator_priority' => 50,
643
+ ])
644
+ ->and($controller->finalizedOrders)->toBe([
645
+ ['created-order-uuid', 'service-quote-uuid', true],
646
+ ])
647
+ ->and($controller->order->loaded)->toContain(['trackingNumber', 'trackingStatuses', 'driverAssigned', 'vehicleAssigned', 'purchaseRate.serviceQuote.items', 'customer', 'facilitator']);
648
+ });
649
+
650
+ test('api order controller creates orders from top-level route details and reports invalid create inputs', function () {
651
+ $controller = new FleetOpsApiOrderCrudControllerProbe();
652
+
653
+ $created = $controller->create(new FleetOpsApiOrderCreateRequestFake([
654
+ 'pickup' => ['name' => 'Pickup'],
655
+ 'dropoff' => ['name' => 'Dropoff'],
656
+ 'waypoints' => [['name' => 'Stop']],
657
+ 'entities' => [['name' => 'Box']],
658
+ 'customer' => 'customer_public',
659
+ ]));
660
+
661
+ $badConfig = new FleetOpsApiOrderCrudControllerProbe();
662
+ $badConfig->missingOrderConfig = true;
663
+
664
+ expect($created)->toBe(['resource' => 'order', 'order' => $controller->order])
665
+ ->and($controller->createdOrders[0])->toMatchArray([
666
+ 'payload_uuid' => 'payload-built-uuid',
667
+ 'customer_uuid' => 'contacts-vendors-uuid',
668
+ 'customer_type' => Contact::class,
669
+ ])
670
+ ->and($badConfig->create(new FleetOpsApiOrderCreateRequestFake([
671
+ 'type' => 'missing',
672
+ ])))->toBe(['apiError' => 'Invalid order `type` or `order_config` provided.', 'status' => 400]);
673
+ });
674
+
675
+ test('api order controller updates payloads assignments service quotes and dispatch flags', function () {
676
+ $order = new FleetOpsApiOrderCrudFake();
677
+ $payload = new FleetOpsApiOrderPayloadFake();
678
+ $order->payload = $payload;
679
+
680
+ $quote = new ServiceQuote();
681
+ $quote->setRawAttributes(['uuid' => 'service-quote-uuid'], true);
682
+
683
+ $controller = new FleetOpsApiOrderCrudControllerProbe();
684
+ $controller->order = $order;
685
+ $controller->serviceQuote = $quote;
686
+
687
+ $response = $controller->update('order-public', new FleetOpsApiOrderUpdateRequestFake([
688
+ 'payload' => [
689
+ 'waypoints' => [
690
+ ['name' => 'Pickup From Waypoints'],
691
+ ['name' => 'Middle'],
692
+ ['name' => 'Dropoff From Waypoints'],
693
+ ],
694
+ 'entities' => [['name' => 'Crate']],
695
+ ],
696
+ 'driver' => 'driver_public',
697
+ 'vehicle' => 'vehicle_public',
698
+ 'facilitator' => 'facilitator_public',
699
+ 'customer' => 'customer_public',
700
+ 'service_quote' => 'quote_public',
701
+ 'dispatch' => true,
702
+ 'orchestrator_priority' => '',
703
+ 'status' => 'ready',
704
+ ]));
705
+
706
+ expect($response)->toBe(['resource' => 'order', 'order' => $order])
707
+ ->and($payload->calls)->toContain(
708
+ ['pickup', ['name' => 'Pickup From Waypoints']],
709
+ ['dropoff', ['name' => 'Dropoff From Waypoints']],
710
+ ['waypoints', [['name' => 'Middle']]],
711
+ ['entities', [['name' => 'Crate']]]
712
+ )
713
+ ->and($order->purchasedQuotes)->toBe([$quote])
714
+ ->and($order->dispatchedForTest)->toBeTrue()
715
+ ->and($order->updates[0])->toMatchArray([
716
+ 'payload_uuid' => 'payload-built-uuid',
717
+ 'driver_assigned_uuid' => 'drivers-uuid',
718
+ 'vehicle_assigned_uuid' => 'vehicles-uuid',
719
+ 'facilitator_uuid' => 'contacts-vendors-uuid',
720
+ 'facilitator_type' => Contact::class,
721
+ 'customer_uuid' => 'contacts-vendors-uuid',
722
+ 'customer_type' => Contact::class,
723
+ 'orchestrator_priority' => 50,
724
+ 'status' => 'ready',
725
+ ])
726
+ ->and($order->flushedForTest)->toBeTrue()
727
+ ->and($order->loaded)->toContain(['trackingNumber', 'trackingStatuses', 'driverAssigned', 'vehicleAssigned', 'purchaseRate.serviceQuote.items', 'customer', 'facilitator']);
728
+ });
729
+
730
+ test('api order controller updates by payload id and clears route waypoints', function () {
731
+ $order = new FleetOpsApiOrderCrudFake();
732
+ $payload = new FleetOpsApiOrderPayloadFake();
733
+ $order->payload = $payload;
734
+
735
+ $controller = new FleetOpsApiOrderCrudControllerProbe();
736
+ $controller->order = $order;
737
+
738
+ $byId = $controller->update('order-public', new FleetOpsApiOrderUpdateRequestFake([
739
+ 'payload' => 'payload_public',
740
+ ]));
741
+
742
+ $cleared = $controller->update('order-public', new FleetOpsApiOrderUpdateRequestFake([
743
+ 'payload' => [
744
+ 'pickup' => null,
745
+ 'dropoff' => null,
746
+ 'waypoints' => [],
747
+ ],
748
+ ]));
749
+
750
+ expect($byId)->toBe(['resource' => 'order', 'order' => $order])
751
+ ->and($order->updates[0])->toMatchArray(['payload_uuid' => 'payloads-uuid'])
752
+ ->and($cleared)->toBe(['resource' => 'order', 'order' => $order])
753
+ ->and($payload->removedWaypoints)->toBeTrue();
754
+ });
755
+
756
+ test('api order controller finds deletes and updates distance matrices without database records', function () {
757
+ $order = new FleetOpsApiOrderCrudFake();
758
+ $controller = new FleetOpsApiOrderCrudControllerProbe();
759
+ $controller->order = $order;
760
+ $controller->matrix = (object) ['distance' => 2400, 'time' => 720];
761
+
762
+ $found = $controller->find('order-public', new Request());
763
+ $matrix = $controller->getDistanceMatrix('order-public');
764
+ $deleted = $controller->delete('order-public', new Request());
765
+
766
+ expect($found)->toBe(['resource' => 'order', 'order' => $order])
767
+ ->and($matrix)->toBe(['json' => $controller->matrix, 'status' => 200])
768
+ ->and($order->updates[0])->toBe(['distance' => 2400, 'time' => 720])
769
+ ->and($deleted)->toBe(['resource' => 'deleted-order', 'order' => $order])
770
+ ->and($order->deletedForTest)->toBeTrue()
771
+ ->and($order->lookups[0][0])->toBe('order-public')
772
+ ->and($order->loaded)->toContain(['payload', 'payload.waypoints', 'payload.pickup', 'payload.dropoff']);
773
+ });
774
+
775
+ test('api order controller schedules orders with timezone normalized dates', function () {
776
+ $order = new FleetOpsApiOrderCrudFake();
777
+ $controller = new FleetOpsApiOrderCrudControllerProbe();
778
+ $controller->order = $order;
779
+
780
+ $request = new FleetOpsApiOrderScheduleRequestFake([
781
+ 'date' => '2026-08-15',
782
+ 'time' => '09:30:15',
783
+ 'timezone' => 'Asia/Singapore',
784
+ ]);
785
+
786
+ $response = $controller->scheduleOrder('order-public', $request);
787
+
788
+ expect($response)->toBe(['resource' => 'order', 'order' => $order])
789
+ ->and($order->savedForTest)->toBeTrue()
790
+ ->and($order->scheduled_at->timezoneName)->toBe('Asia/Singapore')
791
+ ->and($order->scheduled_at->format('Y-m-d H:i:s'))->toBe('2026-08-15 09:30:15');
792
+ });
793
+
794
+ test('api order controller captures signature proof and stores file metadata', function () {
795
+ session(['company' => 'company-uuid', 'user' => 'user-uuid']);
796
+
797
+ $subject = (object) ['uuid' => 'subject-uuid'];
798
+
799
+ $controller = new FleetOpsApiOrderCrudControllerProbe();
800
+ $controller->order = new FleetOpsApiOrderCrudFake();
801
+ $controller->resolvedSubject = $subject;
802
+
803
+ $response = $controller->captureSignature(new Request([
804
+ 'signature' => 'data:image/png;base64,' . base64_encode('signature-bytes'),
805
+ 'remarks' => 'Signed by receiver',
806
+ 'data' => ['receiver' => 'Ada'],
807
+ 'disk' => 'local',
808
+ 'bucket' => 'local-bucket',
809
+ ]), 'order-public', 'waypoint_subject');
810
+
811
+ expect($response['resource'])->toBe('proof')
812
+ ->and($controller->createdProofs[0])->toMatchArray([
813
+ 'company_uuid' => 'company-uuid',
814
+ 'order_uuid' => 'order-uuid',
815
+ 'subject_uuid' => 'subject-uuid',
816
+ 'remarks' => 'Signed by receiver',
817
+ 'data' => ['receiver' => 'Ada'],
818
+ ])
819
+ ->and($controller->createdFiles[0])->toMatchArray([
820
+ 'company_uuid' => 'company-uuid',
821
+ 'uploader_uuid' => 'user-uuid',
822
+ 'bucket' => 'local-bucket',
823
+ 'type' => 'signature',
824
+ ])
825
+ ->and($response['proof']->file_uuid)->toBe('file-uuid')
826
+ ->and($response['proof']->saved)->toBeTrue()
827
+ ->and($controller->storedFiles[0])->toBe([
828
+ 'disk' => 'local',
829
+ 'path' => 'uploads/company-uuid/signatures/proof_public.png',
830
+ 'contents' => 'signature-bytes',
831
+ ]);
832
+ });
833
+
834
+ test('api order controller captures base64 photo proofs and links stored files', function () {
835
+ session(['company' => 'company-uuid', 'user' => 'user-uuid']);
836
+
837
+ $subject = (object) ['uuid' => 'subject-uuid'];
838
+
839
+ $controller = new FleetOpsApiOrderCrudControllerProbe();
840
+ $controller->order = new FleetOpsApiOrderCrudFake();
841
+ $controller->resolvedSubject = $subject;
842
+
843
+ $response = $controller->capturePhoto(new Request([
844
+ 'photos' => [base64_encode('photo-bytes')],
845
+ 'remarks' => 'Photo received',
846
+ 'data' => ['angle' => 'front'],
847
+ 'disk' => 'local',
848
+ 'filesystems' => ['disks' => ['local' => ['bucket' => 'local-bucket']]],
849
+ ]), 'order-public', 'waypoint_subject');
850
+
851
+ expect($response['resource'])->toBe('proof')
852
+ ->and($controller->createdProofs[0])->toMatchArray([
853
+ 'company_uuid' => 'company-uuid',
854
+ 'order_uuid' => 'order-uuid',
855
+ 'subject_uuid' => 'subject-uuid',
856
+ 'remarks' => 'Photo received',
857
+ 'raw_data' => base64_encode('photo-bytes'),
858
+ 'data' => ['angle' => 'front'],
859
+ ])
860
+ ->and($controller->createdFiles[0])->toMatchArray([
861
+ 'company_uuid' => 'company-uuid',
862
+ 'uploader_uuid' => 'user-uuid',
863
+ 'bucket' => 'local-bucket',
864
+ 'type' => 'photo',
865
+ 'size' => strlen('photo-bytes'),
866
+ ])
867
+ ->and($response['proof']->updates[0])->toBe(['file_uuid' => 'file-uuid'])
868
+ ->and($controller->storedFiles[0])->toBe([
869
+ 'disk' => 'local',
870
+ 'path' => 'uploads/company-uuid/photos/proof_public.png',
871
+ 'contents' => 'photo-bytes',
872
+ ]);
873
+ });
874
+
875
+ test('api order controller returns proof comment and editable field resources through seams', function () {
876
+ session(['company' => 'company-uuid']);
877
+
878
+ $subject = (object) ['uuid' => 'subject-uuid'];
879
+
880
+ $controller = new FleetOpsApiOrderCrudControllerProbe();
881
+ $controller->order = new FleetOpsApiOrderCrudFake(['order_config_uuid' => 'config-uuid']);
882
+ $controller->resolvedSubject = $subject;
883
+ $controller->entityEditingSettings = ['config-uuid' => ['recipient_name' => true]];
884
+
885
+ $proofs = $controller->proofs(new Request(), 'order-public', 'waypoint_subject');
886
+ $settings = $controller->getEditableEntityFields('order-public', new Request());
887
+ $comments = $controller->orderComments('order-public');
888
+
889
+ expect($proofs['resource'])->toBe('proofs')
890
+ ->and($proofs['proofs'][0]->subject_uuid)->toBe('subject-uuid')
891
+ ->and($settings)->toBe(['json' => ['recipient_name' => true], 'status' => 200])
892
+ ->and($comments)->toBe(['resource' => 'comments', 'comments' => $controller->order->comments->values()->all()])
893
+ ->and($controller->order->loaded)->toContain('comments');
894
+ });
895
+
896
+ test('api order controller reports proof signature photo and comments error branches', function () {
897
+ $controller = new FleetOpsApiOrderCrudControllerProbe();
898
+
899
+ expect($controller->captureSignature(new Request(), 'order-public'))->toBe(['apiError' => 'No signature data to capture.', 'status' => 400]);
900
+
901
+ $controller = new FleetOpsApiOrderCrudControllerProbe();
902
+ $controller->orderNotFound = true;
903
+
904
+ expect($controller->captureSignature(new Request(['signature' => base64_encode('signature')]), 'missing-order'))->toBe(['apiError' => 'Order resource not found.', 'status' => 404])
905
+ ->and($controller->capturePhoto(new Request(['photos' => [base64_encode('photo')]]), 'missing-order'))->toBe(['apiError' => 'Order resource not found.', 'status' => 404])
906
+ ->and($controller->proofs(new Request(), 'missing-order'))->toBe(['apiError' => 'Order resource not found.', 'status' => 404])
907
+ ->and($controller->getEditableEntityFields('missing-order', new Request()))->toBe(['apiError' => 'Order resource not found.', 'status' => 404])
908
+ ->and($controller->orderComments('missing-order'))->toBe(['apiError' => 'Order resource not found.', 'status' => 404]);
909
+
910
+ $controller = new FleetOpsApiOrderCrudControllerProbe();
911
+ $controller->order = new FleetOpsApiOrderCrudFake();
912
+
913
+ expect($controller->captureSignature(new Request(['signature' => base64_encode('signature')]), 'order-public', 'waypoint_missing'))->toBe(['apiError' => 'Unable to capture signature data.', 'status' => 400])
914
+ ->and($controller->capturePhoto(new Request(['photos' => [base64_encode('photo')]]), 'order-public', 'waypoint_missing'))->toBe(['apiError' => 'Unable to capture photo as proof.', 'status' => 400])
915
+ ->and($controller->proofs(new Request(), 'order-public', 'waypoint_missing'))->toBe(['apiError' => 'Unable to retrieve proof of delivery for subject.', 'status' => 400]);
916
+ });
917
+
918
+ test('api order controller dispatches cancels optimizes tracks and estimates orders', function () {
919
+ $order = new FleetOpsApiOrderCrudFake();
920
+ $controller = new FleetOpsApiOrderCrudControllerProbe();
921
+ $controller->order = $order;
922
+
923
+ $dispatched = $controller->dispatchOrder('order-public');
924
+ $cancelled = $controller->cancelOrder('order-public');
925
+ $optimized = $controller->optimize('order-public');
926
+ $tracked = $controller->trackerData(new Request(['provider' => 'test', 'fallbacks' => true]), 'order-public');
927
+ $eta = $controller->etaData(new Request(['traffic_enabled' => true]), 'order-public');
928
+
929
+ expect($dispatched)->toBe(['resource' => 'order', 'order' => $order])
930
+ ->and($order->dispatchedForTest)->toBeTrue()
931
+ ->and($order->dispatchActivityInserted)->toBeTrue()
932
+ ->and($cancelled)->toBe(['resource' => 'order', 'order' => $order])
933
+ ->and($order->cancelledForTest)->toBeTrue()
934
+ ->and($optimized)->toBe(['resource' => 'order', 'order' => $order])
935
+ ->and($tracked)->toBe(['json' => ['tracking' => 'ok', 'options' => ['provider' => 'test', 'fallbacks' => true]], 'status' => 200])
936
+ ->and($eta)->toBe(['json' => ['eta' => 600, 'options' => ['traffic_enabled' => true]], 'status' => 200]);
937
+ });
938
+
939
+ test('api order controller reports missing and invalid dispatch tracking branches', function () {
940
+ $controller = new FleetOpsApiOrderCrudControllerProbe();
941
+ $controller->orderNotFound = true;
942
+
943
+ $expectedJson = ['json' => ['error' => 'Order resource not found.'], 'status' => 404];
944
+
945
+ expect($controller->find('missing-order', new Request()))->toBe($expectedJson)
946
+ ->and($controller->delete('missing-order', new Request()))->toBe($expectedJson)
947
+ ->and($controller->getDistanceMatrix('missing-order'))->toBe($expectedJson)
948
+ ->and($controller->dispatchOrder('missing-order'))->toBe($expectedJson)
949
+ ->and($controller->cancelOrder('missing-order'))->toBe($expectedJson)
950
+ ->and($controller->optimize('missing-order'))->toBe(['apiError' => 'Order resource not found.', 'status' => 404])
951
+ ->and($controller->trackerData(new Request(), 'missing-order'))->toBe(['apiError' => 'Order resource not found.', 'status' => 404])
952
+ ->and($controller->etaData(new Request(), 'missing-order'))->toBe(['apiError' => 'Order resource not found.', 'status' => 404]);
953
+
954
+ $order = new FleetOpsApiOrderCrudFake();
955
+ $order->hasDriverAssignedForTest = false;
956
+
957
+ $controller = new FleetOpsApiOrderCrudControllerProbe();
958
+ $controller->order = $order;
959
+
960
+ expect($controller->dispatchOrder('order-public'))->toBe(['apiError' => 'No driver assigned to dispatch!', 'status' => 400]);
961
+
962
+ $order = new FleetOpsApiOrderCrudFake();
963
+ $order->dispatchedFlagForTest = true;
964
+
965
+ $controller = new FleetOpsApiOrderCrudControllerProbe();
966
+ $controller->order = $order;
967
+
968
+ expect($controller->dispatchOrder('order-public'))->toBe(['apiError' => 'Order has already been dispatched!', 'status' => 400]);
969
+
970
+ $order = new FleetOpsApiOrderCrudFake();
971
+ $order->trackerFake->throwOnTrack = true;
972
+
973
+ $controller = new FleetOpsApiOrderCrudControllerProbe();
974
+ $controller->order = $order;
975
+
976
+ expect($controller->trackerData(new Request(), 'order-public'))->toBe(['apiError' => 'An error occured trying to track order.', 'status' => 404])
977
+ ->and($controller->etaData(new Request(), 'order-public'))->toBe(['apiError' => 'An error occured trying to track order.', 'status' => 404]);
978
+ });
979
+
980
+ test('api order controller captures QR proof payloads and validates error branches', function () {
981
+ session(['company' => 'company-uuid']);
982
+
983
+ $subject = (object) ['uuid' => 'subject-uuid'];
984
+
985
+ $controller = new FleetOpsApiOrderCrudControllerProbe();
986
+ $controller->order = new FleetOpsApiOrderCrudFake();
987
+ $controller->resolvedSubject = $subject;
988
+
989
+ $proof = $controller->captureQrScan(new Request([
990
+ 'code' => 'subject-uuid',
991
+ 'raw_data' => 'raw-qr-data',
992
+ 'data' => ['scan' => true],
993
+ ]), 'order-public', 'waypoint_subject');
994
+
995
+ expect($proof['resource'])->toBe('proof')
996
+ ->and($controller->createdProofs[0])->toMatchArray([
997
+ 'company_uuid' => 'company-uuid',
998
+ 'order_uuid' => 'order-uuid',
999
+ 'subject_uuid' => 'subject-uuid',
1000
+ 'remarks' => 'Verified by QR Code Scan',
1001
+ 'raw_data' => 'raw-qr-data',
1002
+ 'data' => ['scan' => true],
1003
+ ])
1004
+ ->and($controller->captureQrScan(new Request(), 'order-public'))->toBe(['apiError' => 'No QR code data to capture.', 'status' => 400]);
1005
+
1006
+ $controller = new FleetOpsApiOrderCrudControllerProbe();
1007
+ $controller->orderNotFound = true;
1008
+
1009
+ expect($controller->captureQrScan(new Request(['code' => 'subject-uuid']), 'missing-order'))->toBe([
1010
+ 'apiError' => 'Order resource not found.',
1011
+ 'status' => 404,
1012
+ ]);
1013
+
1014
+ $controller = new FleetOpsApiOrderCrudControllerProbe();
1015
+ $controller->order = new FleetOpsApiOrderCrudFake();
1016
+
1017
+ expect($controller->captureQrScan(new Request(['code' => 'subject-uuid']), 'order-public', 'waypoint_missing'))->toBe([
1018
+ 'apiError' => 'Unable to capture QR code data.',
1019
+ 'status' => 400,
1020
+ ]);
1021
+
1022
+ $controller = new FleetOpsApiOrderCrudControllerProbe();
1023
+ $controller->order = new FleetOpsApiOrderCrudFake();
1024
+ $controller->resolvedSubject = $subject;
1025
+
1026
+ expect($controller->captureQrScan(new Request(['code' => 'wrong-code']), 'order-public', 'waypoint_subject'))->toBe([
1027
+ 'apiError' => 'Unable to validate QR code data.',
1028
+ 'status' => 400,
1029
+ ]);
1030
+ });