@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.
- package/README.md +3 -0
- package/addon/components/customer/form.hbs +0 -49
- package/addon/components/entity/card.hbs +1 -0
- package/addon/components/modals/order-label.hbs +1 -1
- package/addon/components/place/form.hbs +1 -1
- package/addon/services/entity-actions.js +32 -0
- package/addon/styles/fleetops-engine.css +0 -1
- package/composer.json +8 -3
- package/extension.json +1 -1
- package/index.js +7 -1
- package/package.json +2 -1
- package/scripts/coverage-file-runner.php +240 -0
- package/scripts/coverage-runner.php +2 -1
- package/scripts/coverage-summary.php +41 -2
- package/scripts/pest-bootstrap.php +237 -3
- package/scripts/pest-file-runner.php +13 -1
- package/scripts/pest-runner.php +57 -2
- package/server/resources/views/labels/entity-label.php +4 -4
- package/server/src/Casts/MultiPolygon.php +8 -3
- package/server/src/Casts/OrderConfigEntities.php +10 -3
- package/server/src/Casts/Point.php +10 -6
- package/server/src/Casts/Polygon.php +5 -2
- package/server/src/Console/Commands/AssignCustomerRoles.php +28 -6
- package/server/src/Console/Commands/AssignDriverRoles.php +36 -6
- package/server/src/Console/Commands/AuditCustomerUserConflicts.php +6 -1
- package/server/src/Console/Commands/DispatchAdhocOrders.php +12 -2
- package/server/src/Console/Commands/FixCustomerCompanies.php +46 -11
- package/server/src/Console/Commands/FixDriverCompanies.php +18 -3
- package/server/src/Console/Commands/FixLegacyOrderConfigs.php +31 -6
- package/server/src/Console/Commands/ProcessMaintenanceTriggers.php +94 -42
- package/server/src/Console/Commands/PurgeUnpurchasedServiceQuotes.php +42 -12
- package/server/src/Console/Commands/ReplayVehicleLocations.php +120 -55
- package/server/src/Console/Commands/SendDriverNotification.php +25 -4
- package/server/src/Console/Commands/SendMaintenanceReminders.php +43 -23
- package/server/src/Console/Commands/SimulateOrderRouteNavigation.php +36 -6
- package/server/src/Console/Commands/TrackOrderDistanceAndTime.php +6 -1
- package/server/src/Events/DriverLocationChanged.php +1 -1
- package/server/src/Events/DriverSimulatedLocationChanged.php +1 -1
- package/server/src/Events/EntityActivityChanged.php +1 -1
- package/server/src/Events/EntityCompleted.php +1 -1
- package/server/src/Events/EntityDriverAssigned.php +1 -1
- package/server/src/Events/FuelProviderTransactionImported.php +1 -1
- package/server/src/Events/FuelProviderTransactionMatched.php +1 -1
- package/server/src/Events/FuelProviderTransactionUnmatched.php +1 -1
- package/server/src/Events/FuelReportCreatedFromProvider.php +1 -1
- package/server/src/Events/GeofenceDwelled.php +1 -1
- package/server/src/Events/GeofenceEntered.php +1 -1
- package/server/src/Events/GeofenceExited.php +1 -1
- package/server/src/Events/VehicleLocationChanged.php +1 -1
- package/server/src/Events/WaypointActivityChanged.php +1 -1
- package/server/src/Events/WaypointCompleted.php +1 -1
- package/server/src/Exceptions/IntegratedVendorException.php +2 -2
- package/server/src/Exceptions/TelematicRateLimitExceededException.php +1 -1
- package/server/src/Http/Controllers/Api/v1/ContactController.php +89 -22
- package/server/src/Http/Controllers/Api/v1/CustomerController.php +296 -97
- package/server/src/Http/Controllers/Api/v1/DeviceController.php +48 -14
- package/server/src/Http/Controllers/Api/v1/DriverController.php +168 -63
- package/server/src/Http/Controllers/Api/v1/EntityController.php +112 -66
- package/server/src/Http/Controllers/Api/v1/EquipmentController.php +40 -10
- package/server/src/Http/Controllers/Api/v1/FleetController.php +54 -14
- package/server/src/Http/Controllers/Api/v1/FuelReportController.php +54 -14
- package/server/src/Http/Controllers/Api/v1/FuelTransactionController.php +36 -11
- package/server/src/Http/Controllers/Api/v1/GeofenceController.php +39 -21
- package/server/src/Http/Controllers/Api/v1/IssueController.php +54 -14
- package/server/src/Http/Controllers/Api/v1/LabelController.php +61 -22
- package/server/src/Http/Controllers/Api/v1/NavigatorController.php +21 -5
- package/server/src/Http/Controllers/Api/v1/OrderConfigController.php +35 -5
- package/server/src/Http/Controllers/Api/v1/OrderController.php +388 -203
- package/server/src/Http/Controllers/Api/v1/PartController.php +40 -10
- package/server/src/Http/Controllers/Api/v1/PayloadController.php +90 -30
- package/server/src/Http/Controllers/Api/v1/PlaceController.php +188 -91
- package/server/src/Http/Controllers/Api/v1/PurchaseRateController.php +100 -36
- package/server/src/Http/Controllers/Api/v1/ServiceAreaController.php +96 -26
- package/server/src/Http/Controllers/Api/v1/ServiceQuoteController.php +169 -81
- package/server/src/Http/Controllers/Api/v1/ServiceRateController.php +104 -75
- package/server/src/Http/Controllers/Api/v1/TrackingNumberController.php +83 -14
- package/server/src/Http/Controllers/Api/v1/TrackingStatusController.php +66 -16
- package/server/src/Http/Controllers/Api/v1/VehicleController.php +121 -67
- package/server/src/Http/Controllers/Api/v1/VendorController.php +54 -14
- package/server/src/Http/Controllers/Api/v1/WorkOrderController.php +47 -12
- package/server/src/Http/Controllers/Api/v1/ZoneController.php +84 -24
- package/server/src/Http/Controllers/Internal/v1/AnalyticsController.php +15 -5
- package/server/src/Http/Controllers/Internal/v1/ContactController.php +113 -28
- package/server/src/Http/Controllers/Internal/v1/CustomerController.php +36 -11
- package/server/src/Http/Controllers/Internal/v1/DeviceController.php +9 -4
- package/server/src/Http/Controllers/Internal/v1/DriverController.php +167 -69
- package/server/src/Http/Controllers/Internal/v1/EquipmentController.php +18 -3
- package/server/src/Http/Controllers/Internal/v1/FleetController.php +137 -60
- package/server/src/Http/Controllers/Internal/v1/FleetOpsLookupController.php +24 -9
- package/server/src/Http/Controllers/Internal/v1/FuelReportController.php +18 -3
- package/server/src/Http/Controllers/Internal/v1/GeocoderController.php +26 -8
- package/server/src/Http/Controllers/Internal/v1/GettingStartedController.php +12 -2
- package/server/src/Http/Controllers/Internal/v1/IntegratedVendorController.php +27 -6
- package/server/src/Http/Controllers/Internal/v1/IssueController.php +82 -29
- package/server/src/Http/Controllers/Internal/v1/MaintenanceController.php +34 -26
- package/server/src/Http/Controllers/Internal/v1/MaintenanceScheduleController.php +141 -97
- package/server/src/Http/Controllers/Internal/v1/ManifestController.php +28 -8
- package/server/src/Http/Controllers/Internal/v1/MetricsController.php +21 -12
- package/server/src/Http/Controllers/Internal/v1/MorphController.php +90 -18
- package/server/src/Http/Controllers/Internal/v1/NavigatorController.php +88 -35
- package/server/src/Http/Controllers/Internal/v1/OrchestrationController.php +149 -39
- package/server/src/Http/Controllers/Internal/v1/OrderConfigController.php +54 -18
- package/server/src/Http/Controllers/Internal/v1/OrderController.php +298 -86
- package/server/src/Http/Controllers/Internal/v1/PartController.php +18 -3
- package/server/src/Http/Controllers/Internal/v1/PaymentController.php +46 -14
- package/server/src/Http/Controllers/Internal/v1/PlaceController.php +31 -5
- package/server/src/Http/Controllers/Internal/v1/ProofController.php +88 -48
- package/server/src/Http/Controllers/Internal/v1/SearchController.php +1 -1
- package/server/src/Http/Controllers/Internal/v1/SensorController.php +6 -1
- package/server/src/Http/Controllers/Internal/v1/ServiceAreaController.php +6 -1
- package/server/src/Http/Controllers/Internal/v1/ServiceQuoteController.php +255 -105
- package/server/src/Http/Controllers/Internal/v1/SettingController.php +88 -35
- package/server/src/Http/Controllers/Internal/v1/TelematicController.php +1 -4
- package/server/src/Http/Controllers/Internal/v1/Traits/DriverSchedulingTrait.php +42 -14
- package/server/src/Http/Controllers/Internal/v1/VendorController.php +103 -33
- package/server/src/Http/Controllers/Internal/v1/WorkOrderController.php +42 -12
- package/server/src/Http/Filter/DriverFilter.php +2 -2
- package/server/src/Http/Filter/OrderFilter.php +1 -1
- package/server/src/Http/Filter/VehicleFilter.php +21 -7
- package/server/src/Http/Middleware/AuthenticateCustomerToken.php +12 -2
- package/server/src/Http/Requests/BulkDispatchRequest.php +3 -9
- package/server/src/Http/Requests/CancelOrderRequest.php +2 -6
- package/server/src/Http/Requests/CreateContactRequest.php +2 -6
- package/server/src/Http/Requests/CreateDeviceRequest.php +2 -2
- package/server/src/Http/Requests/CreateDriverRequest.php +3 -9
- package/server/src/Http/Requests/CreateEntityRequest.php +2 -6
- package/server/src/Http/Requests/CreateEquipmentRequest.php +2 -2
- package/server/src/Http/Requests/CreateFleetRequest.php +2 -6
- package/server/src/Http/Requests/CreateFuelReportRequest.php +2 -6
- package/server/src/Http/Requests/CreateFuelTransactionRequest.php +2 -2
- package/server/src/Http/Requests/CreateIssueRequest.php +2 -6
- package/server/src/Http/Requests/CreateOrderRequest.php +7 -8
- package/server/src/Http/Requests/CreatePartRequest.php +2 -2
- package/server/src/Http/Requests/CreatePayloadRequest.php +7 -9
- package/server/src/Http/Requests/CreatePlaceRequest.php +2 -6
- package/server/src/Http/Requests/CreatePurchaseRateRequest.php +2 -6
- package/server/src/Http/Requests/CreateSensorRequest.php +2 -2
- package/server/src/Http/Requests/CreateServiceAreaRequest.php +2 -6
- package/server/src/Http/Requests/CreateServiceQuoteRequest.php +2 -6
- package/server/src/Http/Requests/CreateServiceRateRequest.php +2 -6
- package/server/src/Http/Requests/CreateTrackingNumberRequest.php +2 -6
- package/server/src/Http/Requests/CreateTrackingStatusRequest.php +2 -6
- package/server/src/Http/Requests/CreateVehicleRequest.php +2 -6
- package/server/src/Http/Requests/CreateVendorRequest.php +2 -6
- package/server/src/Http/Requests/CreateWorkOrderRequest.php +2 -2
- package/server/src/Http/Requests/CreateZoneRequest.php +2 -6
- package/server/src/Http/Requests/DecodeTrackingNumberQR.php +2 -6
- package/server/src/Http/Requests/DriverSimulationRequest.php +2 -6
- package/server/src/Http/Requests/Internal/AssignOrderRequest.php +3 -7
- package/server/src/Http/Requests/Internal/CreateDriverRequest.php +4 -12
- package/server/src/Http/Requests/Internal/CreateOrderConfigRequest.php +2 -6
- package/server/src/Http/Requests/Internal/CreateOrderRequest.php +7 -8
- package/server/src/Http/Requests/Internal/FleetActionRequest.php +18 -12
- package/server/src/Http/Requests/Internal/UpdateDriverRequest.php +6 -3
- package/server/src/Http/Requests/QueryServiceQuotesRequest.php +2 -6
- package/server/src/Http/Requests/ScheduleOrderRequest.php +2 -6
- package/server/src/Http/Requests/UpdateIssueRequest.php +1 -3
- package/server/src/Http/Resources/v1/Customer.php +2 -2
- package/server/src/Http/Resources/v1/Maintenance.php +3 -4
- package/server/src/Http/Resources/v1/MaintenanceSchedule.php +3 -4
- package/server/src/Http/Resources/v1/Order.php +3 -7
- package/server/src/Http/Resources/v1/PurchaseRate.php +4 -6
- package/server/src/Http/Resources/v1/TrackingStatus.php +4 -6
- package/server/src/Http/Resources/v1/WorkOrder.php +3 -4
- package/server/src/Imports/ContactImport.php +10 -1
- package/server/src/Imports/DriverImport.php +10 -1
- package/server/src/Imports/EquipmentImport.php +6 -1
- package/server/src/Imports/FleetImport.php +10 -1
- package/server/src/Imports/FuelReportImport.php +10 -1
- package/server/src/Imports/IssueImport.php +10 -1
- package/server/src/Imports/MaintenanceImport.php +6 -1
- package/server/src/Imports/MaintenanceScheduleImport.php +6 -1
- package/server/src/Imports/PartImport.php +6 -1
- package/server/src/Imports/PlaceImport.php +10 -1
- package/server/src/Imports/VehicleImport.php +10 -1
- package/server/src/Imports/VendorImport.php +10 -1
- package/server/src/Imports/WorkOrderImport.php +6 -1
- package/server/src/Integrations/Lalamove/Lalamove.php +3 -7
- package/server/src/Integrations/Lalamove/LalamoveServiceType.php +5 -8
- package/server/src/Jobs/CheckGeofenceDwell.php +41 -16
- package/server/src/Jobs/FinalizeApiOrderCreation.php +17 -2
- package/server/src/Jobs/FinalizeInternalOrderCreation.php +11 -1
- package/server/src/Jobs/NotifyBulkAssignedDriver.php +29 -16
- package/server/src/Jobs/ProcessAllocationJob.php +59 -25
- package/server/src/Jobs/ReplayPositions.php +17 -10
- package/server/src/Jobs/SendPositionReplay.php +18 -7
- package/server/src/Jobs/SimulateDrivingRoute.php +14 -3
- package/server/src/Jobs/SyncFuelProviderTransactionsJob.php +12 -2
- package/server/src/Listeners/HandleDeliveryCompletion.php +11 -1
- package/server/src/Listeners/HandleGeofenceDwelled.php +6 -1
- package/server/src/Listeners/HandleGeofenceEntered.php +4 -2
- package/server/src/Listeners/HandleGeofenceExited.php +6 -1
- package/server/src/Listeners/HandleOrderCanceled.php +18 -3
- package/server/src/Listeners/HandleOrderDispatchFailed.php +12 -2
- package/server/src/Listeners/HandleOrderDispatched.php +61 -26
- package/server/src/Listeners/HandleOrderDriverAssigned.php +12 -2
- package/server/src/Listeners/HandleUserRemovedFromCompany.php +19 -6
- package/server/src/Listeners/NotifyDriverOnShiftChange.php +24 -4
- package/server/src/Listeners/NotifyOrderEvent.php +11 -6
- package/server/src/Models/Contact.php +6 -7
- package/server/src/Models/Device.php +26 -3
- package/server/src/Models/Driver.php +0 -6
- package/server/src/Models/Entity.php +4 -4
- package/server/src/Models/Equipment.php +1 -1
- package/server/src/Models/FuelReport.php +5 -1
- package/server/src/Models/IntegratedVendor.php +2 -2
- package/server/src/Models/Issue.php +5 -1
- package/server/src/Models/MaintenanceSchedule.php +25 -10
- package/server/src/Models/Order.php +18 -15
- package/server/src/Models/OrderConfig.php +1 -1
- package/server/src/Models/Payload.php +9 -16
- package/server/src/Models/Place.php +20 -13
- package/server/src/Models/ServiceArea.php +3 -6
- package/server/src/Models/ServiceQuote.php +5 -0
- package/server/src/Models/ServiceRate.php +13 -6
- package/server/src/Models/Telematic.php +2 -2
- package/server/src/Models/TrackingNumber.php +55 -10
- package/server/src/Models/TrackingStatus.php +24 -4
- package/server/src/Models/Waypoint.php +44 -10
- package/server/src/Models/Zone.php +3 -6
- package/server/src/Notifications/DriverArrivedAtGeofence.php +1 -1
- package/server/src/Notifications/OrderDispatched.php +3 -9
- package/server/src/Notifications/OrderPing.php +3 -9
- package/server/src/Observers/CategoryObserver.php +6 -1
- package/server/src/Observers/CompanyObserver.php +5 -0
- package/server/src/Observers/CompanyUserObserver.php +12 -2
- package/server/src/Observers/DriverObserver.php +19 -4
- package/server/src/Observers/FleetObserver.php +6 -1
- package/server/src/Observers/PurchaseRateObserver.php +66 -11
- package/server/src/Observers/ServiceAreaObserver.php +12 -2
- package/server/src/Observers/ServiceRateObserver.php +21 -6
- package/server/src/Observers/TrackingNumberObserver.php +19 -4
- package/server/src/Observers/UserObserver.php +6 -1
- package/server/src/Observers/VehicleObserver.php +27 -7
- package/server/src/Observers/WorkOrderObserver.php +27 -7
- package/server/src/Orchestration/Engines/DriverAssignmentEngine.php +8 -3
- package/server/src/Orchestration/Support/OrchestrationPayloadBuilder.php +2 -2
- package/server/src/Providers/FleetOpsServiceProvider.php +12 -0
- package/server/src/Providers/NotificationServiceProvider.php +6 -0
- package/server/src/Support/Ai/Capabilities/AssetStatusCapability.php +36 -26
- package/server/src/Support/Ai/Capabilities/CreateOrderPreviewCapability.php +18 -5
- package/server/src/Support/Ai/Capabilities/OrderInsightsCapability.php +6 -1
- package/server/src/Support/Ai/Capabilities/SearchResourcesCapability.php +26 -6
- package/server/src/Support/Analytics/FuelEfficiency.php +9 -3
- package/server/src/Support/Analytics/FuelProviderSummary.php +14 -5
- package/server/src/Support/Analytics/GeofenceViolations.php +40 -20
- package/server/src/Support/Analytics/IssuesInsights.php +38 -18
- package/server/src/Support/Analytics/MaintenanceOverview.php +51 -21
- package/server/src/Support/Analytics/OnTimeDelivery.php +3 -2
- package/server/src/Support/Analytics/OperationsPulse.php +59 -35
- package/server/src/Support/Analytics/OrdersByStatus.php +12 -7
- package/server/src/Support/Analytics/RevenueTrend.php +16 -6
- package/server/src/Support/Analytics/TopDrivers.php +3 -2
- package/server/src/Support/FleetOps.php +109 -104
- package/server/src/Support/Geocoding.php +52 -14
- package/server/src/Support/GeofenceIntersectionService.php +47 -27
- package/server/src/Support/LiveOrderQuery.php +6 -1
- package/server/src/Support/Metrics/ActiveRevenueQuery.php +3 -2
- package/server/src/Support/Metrics/FuelCostsMetric.php +6 -1
- package/server/src/Support/ResolvesOrderServiceStops.php +10 -0
- package/server/src/Support/Telematics/Providers/GeotabProvider.php +9 -4
- package/server/src/Support/Utils.php +122 -16
- package/server/src/Tracking/Providers/GoogleRoutesTrackingProvider.php +6 -1
- package/server/src/Tracking/Providers/OsrmTrackingProvider.php +11 -6
- package/server/src/Tracking/TrackingProviderManager.php +2 -3
- package/server/src/Tracking/TrackingProviderRegistry.php +8 -4
- package/server/src/Traits/PayloadAccessors.php +6 -1
- package/server/src/routes.php +23 -16
- package/server/tests/AiOperationalQueryCapabilityTest.php +457 -1
- package/server/tests/AiPreviewCapabilityContractsTest.php +180 -0
- package/server/tests/AnalyticsRoutesTest.php +380 -1
- package/server/tests/AnalyticsWidgetContractsTest.php +740 -0
- package/server/tests/ApiContactControllerContractsTest.php +284 -0
- package/server/tests/ApiCustomerControllerContractsTest.php +962 -0
- package/server/tests/ApiDriverControllerContractsTest.php +571 -0
- package/server/tests/ApiEntityControllerContractsTest.php +329 -0
- package/server/tests/ApiEquipmentControllerContractsTest.php +239 -0
- package/server/tests/ApiFleetControllerContractsTest.php +176 -0
- package/server/tests/ApiFuelReportControllerContractsTest.php +217 -0
- package/server/tests/ApiIssueControllerContractsTest.php +217 -0
- package/server/tests/ApiOrderControllerContractsTest.php +1030 -0
- package/server/tests/ApiPartControllerContractsTest.php +251 -0
- package/server/tests/ApiPayloadControllerContractsTest.php +314 -0
- package/server/tests/ApiPlaceControllerContractsTest.php +541 -0
- package/server/tests/ApiPurchaseRateControllerContractsTest.php +283 -0
- package/server/tests/ApiServiceAreaZoneControllerContractsTest.php +442 -0
- package/server/tests/ApiServiceQuoteControllerContractsTest.php +322 -0
- package/server/tests/ApiTrackingNumberControllerContractsTest.php +225 -0
- package/server/tests/ApiTrackingStatusControllerContractsTest.php +254 -0
- package/server/tests/ApiVehicleControllerContractsTest.php +368 -0
- package/server/tests/ApiVendorControllerContractsTest.php +199 -0
- package/server/tests/AssetAndPlaceSearchContractsTest.php +220 -0
- package/server/tests/BackendSmallModelContractsTest.php +354 -0
- package/server/tests/CapacityAllocationEngineTest.php +56 -0
- package/server/tests/CommandContractsTest.php +2695 -0
- package/server/tests/CompactResourceSerializationTest.php +2745 -0
- package/server/tests/ControllerFilterContractsTest.php +1273 -0
- package/server/tests/ControllerHelperContractsTest.php +1740 -0
- package/server/tests/ControllerSerializationContractsTest.php +141 -0
- package/server/tests/CoverageSummaryScriptTest.php +93 -0
- package/server/tests/CustomerContactIdentitySafetyTest.php +1 -6
- package/server/tests/CustomerEndpointTest.php +165 -1
- package/server/tests/DriverFilterExecutionTest.php +263 -0
- package/server/tests/DriverGeofenceProcessingTest.php +153 -0
- package/server/tests/DriverResourceSerializationTest.php +245 -0
- package/server/tests/DriverSchedulingTraitContractsTest.php +259 -0
- package/server/tests/EventContractsTest.php +1259 -0
- package/server/tests/ExceptionContractsTest.php +81 -0
- package/server/tests/ExpansionContractsTest.php +242 -0
- package/server/tests/ExportCoverageTest.php +116 -0
- package/server/tests/Feature/Http/Api/ContactControllerPhotoAndDeleteTest.php +199 -0
- package/server/tests/Feature/Http/Api/CustomerControllerHelperSeamsTest.php +831 -0
- package/server/tests/Feature/Http/Api/DeviceControllerContractsTest.php +347 -0
- package/server/tests/Feature/Http/Api/DeviceControllerCrudTest.php +176 -0
- package/server/tests/Feature/Http/Api/DriverControllerAuthFlowsTest.php +451 -0
- package/server/tests/Feature/Http/Api/DriverControllerHelpersTest.php +240 -0
- package/server/tests/Feature/Http/Api/DriverControllerLookupTest.php +186 -0
- package/server/tests/Feature/Http/Api/DriverControllerOrganizationsTest.php +112 -0
- package/server/tests/Feature/Http/Api/DriverControllerSessionHelpersTest.php +207 -0
- package/server/tests/Feature/Http/Api/DriverControllerSwitchOrgAndGeofenceTest.php +329 -0
- package/server/tests/Feature/Http/Api/DriverControllerTrackTest.php +383 -0
- package/server/tests/Feature/Http/Api/EntityControllerHelpersTest.php +150 -0
- package/server/tests/Feature/Http/Api/FuelTransactionControllerContractsTest.php +352 -0
- package/server/tests/Feature/Http/Api/GeofenceControllerContractsTest.php +364 -0
- package/server/tests/Feature/Http/Api/LabelControllerSubjectsTest.php +148 -0
- package/server/tests/Feature/Http/Api/OrderConfigControllerTest.php +112 -0
- package/server/tests/Feature/Http/Api/OrderControllerCreateTest.php +279 -0
- package/server/tests/Feature/Http/Api/OrderControllerIntegratedVendorTest.php +295 -0
- package/server/tests/Feature/Http/Api/OrderControllerLifecycleActionsTest.php +279 -0
- package/server/tests/Feature/Http/Api/OrderControllerLookupHelpersTest.php +207 -0
- package/server/tests/Feature/Http/Api/OrderControllerNearbyFiltersTest.php +282 -0
- package/server/tests/Feature/Http/Api/OrderControllerPersistenceHelpersTest.php +216 -0
- package/server/tests/Feature/Http/Api/OrderControllerQueryFiltersTest.php +184 -0
- package/server/tests/Feature/Http/Api/OrderControllerStartActivityTest.php +663 -0
- package/server/tests/Feature/Http/Api/PayloadControllerHelpersTest.php +134 -0
- package/server/tests/Feature/Http/Api/PlaceAndServiceQuoteSeamsTest.php +479 -0
- package/server/tests/Feature/Http/Api/PurchaseRateControllerHelpersTest.php +176 -0
- package/server/tests/Feature/Http/Api/PurchaseRateControllerOrderCreationTest.php +268 -0
- package/server/tests/Feature/Http/Api/SensorControllerCrudTest.php +239 -0
- package/server/tests/Feature/Http/Api/ServiceAreaControllerBorderAndSeamsTest.php +187 -0
- package/server/tests/Feature/Http/Api/ServiceQuoteControllerQueryTest.php +405 -0
- package/server/tests/Feature/Http/Api/ServiceQuoteControllerVendorBridgeTest.php +212 -0
- package/server/tests/Feature/Http/Api/ServiceRateControllerContractsTest.php +263 -0
- package/server/tests/Feature/Http/Api/SmallApiControllerHelpersTest.php +272 -0
- package/server/tests/Feature/Http/Api/TrackingNumberControllerHelpersTest.php +154 -0
- package/server/tests/Feature/Http/Api/TrackingStatusControllerHelpersTest.php +165 -0
- package/server/tests/Feature/Http/Api/VehicleControllerTrackingTest.php +483 -0
- package/server/tests/Feature/Http/Api/WorkOrderControllerContractsTest.php +326 -0
- package/server/tests/Feature/Http/Api/WorkOrderControllerHelpersTest.php +130 -0
- package/server/tests/Feature/Http/Api/ZoneControllerBordersAndSeamsTest.php +294 -0
- package/server/tests/Feature/Http/FleetOpsRouteRegistrationTest.php +189 -0
- package/server/tests/Feature/Http/Internal/AnalyticsControllerSeamsTest.php +53 -0
- package/server/tests/Feature/Http/Internal/ContactControllerContractsTest.php +240 -0
- package/server/tests/Feature/Http/Internal/ContactControllerCustomerGuardsTest.php +128 -0
- package/server/tests/Feature/Http/Internal/ContactControllerEndpointsTest.php +294 -0
- package/server/tests/Feature/Http/Internal/CustomerControllerCredentialsTest.php +196 -0
- package/server/tests/Feature/Http/Internal/DeviceControllerContractsTest.php +370 -0
- package/server/tests/Feature/Http/Internal/DeviceControllerExportAndFiltersTest.php +151 -0
- package/server/tests/Feature/Http/Internal/DriverControllerContractsTest.php +1109 -0
- package/server/tests/Feature/Http/Internal/DriverControllerCreateRecordTest.php +233 -0
- package/server/tests/Feature/Http/Internal/DriverControllerExistingUserAdoptionTest.php +710 -0
- package/server/tests/Feature/Http/Internal/DriverControllerHelpersTest.php +218 -0
- package/server/tests/Feature/Http/Internal/FleetAssignmentsAndTriggersTest.php +198 -0
- package/server/tests/Feature/Http/Internal/FleetOpsLookupControllerDbTest.php +90 -0
- package/server/tests/Feature/Http/Internal/HubControllerTest.php +206 -0
- package/server/tests/Feature/Http/Internal/IssueControllerContractsTest.php +404 -0
- package/server/tests/Feature/Http/Internal/IssueControllerExportImportTest.php +118 -0
- package/server/tests/Feature/Http/Internal/LiveControllerEndpointsTest.php +246 -0
- package/server/tests/Feature/Http/Internal/LiveControllerTest.php +778 -0
- package/server/tests/Feature/Http/Internal/MaintenanceScheduleControllerContractsTest.php +263 -0
- package/server/tests/Feature/Http/Internal/MaintenanceScheduleControllerSurfacesTest.php +214 -0
- package/server/tests/Feature/Http/Internal/MetricsControllerContractsTest.php +249 -0
- package/server/tests/Feature/Http/Internal/MetricsControllerHelpersTest.php +66 -0
- package/server/tests/Feature/Http/Internal/MorphControllerHelpersTest.php +125 -0
- package/server/tests/Feature/Http/Internal/NavigatorControllerHelpersTest.php +201 -0
- package/server/tests/Feature/Http/Internal/OrchestrationControllerContractsTest.php +928 -0
- package/server/tests/Feature/Http/Internal/OrchestrationControllerHelpersTest.php +214 -0
- package/server/tests/Feature/Http/Internal/OrchestrationControllerImportOrdersTest.php +340 -0
- package/server/tests/Feature/Http/Internal/OrderConfigControllerContractsTest.php +314 -0
- package/server/tests/Feature/Http/Internal/OrderControllerActivityFlowsTest.php +663 -0
- package/server/tests/Feature/Http/Internal/OrderControllerCapturePhotoTest.php +507 -0
- package/server/tests/Feature/Http/Internal/OrderControllerContractsTest.php +1742 -0
- package/server/tests/Feature/Http/Internal/OrderControllerCreateRecordTest.php +488 -0
- package/server/tests/Feature/Http/Internal/OrderControllerHelperSeamsTest.php +298 -0
- package/server/tests/Feature/Http/Internal/OrderControllerHelpersTest.php +267 -0
- package/server/tests/Feature/Http/Internal/OrderControllerImportFromFilesTest.php +179 -0
- package/server/tests/Feature/Http/Internal/OrderControllerUpstreamNotFoundTest.php +80 -0
- package/server/tests/Feature/Http/Internal/PaymentControllerPaymentsTest.php +154 -0
- package/server/tests/Feature/Http/Internal/PlaceControllerTest.php +252 -0
- package/server/tests/Feature/Http/Internal/PositionControllerReplayMetricsTest.php +163 -0
- package/server/tests/Feature/Http/Internal/ProofControllerContractsTest.php +219 -0
- package/server/tests/Feature/Http/Internal/SearchControllerEndpointTest.php +151 -0
- package/server/tests/Feature/Http/Internal/ServiceQuoteControllerHelpersTest.php +208 -0
- package/server/tests/Feature/Http/Internal/ServiceQuoteControllerQueryRecordTest.php +217 -0
- package/server/tests/Feature/Http/Internal/ServiceQuoteControllerVendorBridgeTest.php +239 -0
- package/server/tests/Feature/Http/Internal/ServiceQuotePreliminaryQueryTest.php +271 -0
- package/server/tests/Feature/Http/Internal/SettingControllerHelpersTest.php +133 -0
- package/server/tests/Feature/Http/Internal/SmallInternalControllersTest.php +180 -0
- package/server/tests/Feature/Http/Internal/TelematicControllerEndpointsTest.php +417 -0
- package/server/tests/Feature/Http/Internal/VehicleControllerEndpointsTest.php +361 -0
- package/server/tests/Feature/Http/Internal/VendorControllerEndpointsTest.php +203 -0
- package/server/tests/Feature/Http/Internal/WorkOrderAndConfigSurfacesTest.php +289 -0
- package/server/tests/Feature/Http/Internal/WorkOrderControllerContractsTest.php +199 -0
- package/server/tests/Feature/Http/TelematicWebhookIngestTest.php +343 -0
- package/server/tests/Feature/Http/Telematics/TelematicWebhookControllerProcessingTest.php +254 -0
- package/server/tests/FleetOpsSupportContractsTest.php +187 -0
- package/server/tests/FlespiProviderContractsTest.php +244 -0
- package/server/tests/FlowResourceTest.php +295 -0
- package/server/tests/FuelProviderConnectionControllerContractsTest.php +303 -0
- package/server/tests/FuelProviderImplementationTest.php +753 -0
- package/server/tests/FuelProviderResourceContractsTest.php +171 -0
- package/server/tests/FuelProviderTransactionControllerContractsTest.php +181 -0
- package/server/tests/GeofenceIntersectionServiceContractsTest.php +164 -0
- package/server/tests/HOSConstraintContractsTest.php +128 -0
- package/server/tests/HubAndGettingStartedContractsTest.php +158 -0
- package/server/tests/ImportContractsTest.php +191 -0
- package/server/tests/InternalCustomerControllerContractsTest.php +238 -0
- package/server/tests/InternalFleetControllerContractsTest.php +389 -0
- package/server/tests/InternalImportExportControllerContractsTest.php +289 -0
- package/server/tests/InternalMetricsControllerContractsTest.php +69 -0
- package/server/tests/InternalPlaceWorkOrderControllerContractsTest.php +207 -0
- package/server/tests/InternalServiceQuoteCheckoutControllerContractsTest.php +470 -0
- package/server/tests/InternalVendorControllerContractsTest.php +331 -0
- package/server/tests/InventoryTelemetryModelContractsTest.php +516 -0
- package/server/tests/IssueTimelineContractsTest.php +191 -0
- package/server/tests/LabelPdfRenderingTest.php +57 -0
- package/server/tests/LalamoveIntegrationContractsTest.php +167 -0
- package/server/tests/LiveOrderQueryTest.php +145 -18
- package/server/tests/LookupAndGeocoderControllerContractsTest.php +357 -0
- package/server/tests/MaintainableTraitContractsTest.php +245 -0
- package/server/tests/MaintenanceScheduleControllerContractsTest.php +101 -0
- package/server/tests/MaintenanceWarrantyContractsTest.php +237 -0
- package/server/tests/ManifestControllerContractsTest.php +310 -0
- package/server/tests/MetricsRegistryTest.php +596 -10
- package/server/tests/MiddlewareContractsTest.php +150 -0
- package/server/tests/ModelAccessorContractsTest.php +3201 -0
- package/server/tests/MorphControllerContractsTest.php +410 -0
- package/server/tests/NavigatorControllerContractsTest.php +206 -0
- package/server/tests/NotificationAndMailContractsTest.php +677 -0
- package/server/tests/ObserverContractsTest.php +1414 -0
- package/server/tests/OperationalAlgorithmContractsTest.php +852 -0
- package/server/tests/OperationsMonitorEndpointTest.php +2 -1
- package/server/tests/OrchestrationPayloadBuilderTest.php +87 -0
- package/server/tests/OrderActivityFlowRegressionTest.php +354 -7
- package/server/tests/OrderDispatchListenerContractsTest.php +577 -0
- package/server/tests/OrderFilterExecutionTest.php +244 -0
- package/server/tests/OrderQueuedClosureRegressionTest.php +2 -1
- package/server/tests/PaymentControllerContractsTest.php +199 -0
- package/server/tests/PointResolutionTest.php +54 -0
- package/server/tests/ProcessAllocationJobContractsTest.php +224 -0
- package/server/tests/ProofAndSensorControllerContractsTest.php +44 -0
- package/server/tests/ProviderContractsTest.php +409 -0
- package/server/tests/PublicApiControllerInputContractsTest.php +294 -0
- package/server/tests/QueueJobContractsTest.php +764 -0
- package/server/tests/ReportSchemaContractsTest.php +271 -0
- package/server/tests/RequestContractsTest.php +966 -0
- package/server/tests/RouteRegistrationExecutionTest.php +178 -0
- package/server/tests/RouteSequencingEngineTest.php +179 -0
- package/server/tests/RulesAndCastsTest.php +246 -0
- package/server/tests/SamsaraProviderContractsTest.php +272 -0
- package/server/tests/SearchControllerContractsTest.php +311 -0
- package/server/tests/ServiceRateRouteValidationTest.php +76 -0
- package/server/tests/SettingControllerContractsTest.php +410 -0
- package/server/tests/SmallControllerContractsTest.php +456 -0
- package/server/tests/SupportAnalyticsCustomerAuthContractsTest.php +221 -0
- package/server/tests/SupportJobAndAiCoverageTest.php +812 -0
- package/server/tests/SupportServiceContractsTest.php +287 -0
- package/server/tests/SupportValueObjectsTest.php +155 -0
- package/server/tests/TelematicControllerContractsTest.php +185 -0
- package/server/tests/TelematicProviderRegistryTest.php +167 -0
- package/server/tests/TelematicServiceHelperContractsTest.php +315 -0
- package/server/tests/TelematicWebhookControllerContractsTest.php +253 -0
- package/server/tests/TelematicsHardeningTest.php +642 -86
- package/server/tests/TrackingIntelligenceTest.php +644 -1
- package/server/tests/TrackingNumberTraitContractsTest.php +106 -0
- package/server/tests/Unit/Casts/SpatialCastBranchesTest.php +75 -0
- package/server/tests/Unit/Console/AssignCustomerRolesCommandTest.php +102 -0
- package/server/tests/Unit/Console/AssignDriverRolesCommandTest.php +113 -0
- package/server/tests/Unit/Console/Commands/FixLegacyOrderConfigsHelpersTest.php +108 -0
- package/server/tests/Unit/Console/Commands/ProcessOperationalAlertsCommandTest.php +265 -0
- package/server/tests/Unit/Console/Commands/ReplayVehicleLocationsCommandTest.php +320 -0
- package/server/tests/Unit/Console/Commands/SimulateGeofenceEventsCommandTest.php +207 -0
- package/server/tests/Unit/Console/FixCommandsAndMaintenanceControllerTest.php +256 -0
- package/server/tests/Unit/Console/FleetOpsCommandsTest.php +198 -0
- package/server/tests/Unit/Console/ReplayVehicleLocationsCommandTest.php +252 -0
- package/server/tests/Unit/Console/SendMaintenanceRemindersTest.php +212 -0
- package/server/tests/Unit/Console/SimulateGeofenceEventsCommandTest.php +232 -0
- package/server/tests/Unit/Console/SyncTelematicsCommandTest.php +136 -0
- package/server/tests/Unit/Constraints/HOSConstraintTest.php +158 -0
- package/server/tests/Unit/Events/EventModelRecordTest.php +93 -0
- package/server/tests/Unit/Events/OrderDispatchFailedTest.php +34 -0
- package/server/tests/Unit/Exports/ExportCollectionsTest.php +142 -0
- package/server/tests/Unit/Exports/OperationalExportMappingTest.php +651 -0
- package/server/tests/Unit/Exports/VehicleExportTest.php +284 -0
- package/server/tests/Unit/Flow/EventFiringTest.php +95 -0
- package/server/tests/Unit/Http/Api/QueryWithRequestSeamsTest.php +198 -0
- package/server/tests/Unit/Http/Api/SensorInputTest.php +95 -0
- package/server/tests/Unit/Http/Filter/DeviceFilterTest.php +199 -0
- package/server/tests/Unit/Http/Filter/EmptyValueGuardsTest.php +66 -0
- package/server/tests/Unit/Http/Filter/FilterDateRangesTest.php +72 -0
- package/server/tests/Unit/Http/Filter/FuelProviderTransactionFilterTest.php +172 -0
- package/server/tests/Unit/Http/Filter/InternalRelationUuidLookupTest.php +135 -0
- package/server/tests/Unit/Http/Filter/IssueFilterTest.php +129 -0
- package/server/tests/Unit/Http/Filter/PartFilterTest.php +173 -0
- package/server/tests/Unit/Http/Internal/ControllerDelegationSeamsTest.php +136 -0
- package/server/tests/Unit/Http/Internal/ControllerExcelSeamsTest.php +89 -0
- package/server/tests/Unit/Http/Middleware/SetupDriverSessionTest.php +32 -0
- package/server/tests/Unit/Http/Requests/CreateFuelReportRequestTest.php +47 -0
- package/server/tests/Unit/Http/Requests/FleetActionRequestTest.php +80 -0
- package/server/tests/Unit/Http/Requests/RequestAuthorizationTest.php +50 -0
- package/server/tests/Unit/Http/Resources/CustomerResourceTest.php +108 -0
- package/server/tests/Unit/Http/Resources/EntityCustomerTypeTest.php +35 -0
- package/server/tests/Unit/Http/Resources/FleetResourceTest.php +102 -0
- package/server/tests/Unit/Http/Resources/IndexOrderResourceTest.php +210 -0
- package/server/tests/Unit/Http/Resources/IndexVehicleResourceTest.php +194 -0
- package/server/tests/Unit/Http/Resources/MaintenanceResourcesTest.php +182 -0
- package/server/tests/Unit/Http/Resources/OrderAndDriverResourceTest.php +121 -0
- package/server/tests/Unit/Http/Resources/OrderConfigResourceTest.php +47 -0
- package/server/tests/Unit/Http/Resources/PayloadResourceTest.php +111 -0
- package/server/tests/Unit/Http/Resources/RelationResourceFallbacksTest.php +32 -0
- package/server/tests/Unit/Http/Resources/ResourceRelationResolutionTest.php +55 -0
- package/server/tests/Unit/Http/Resources/TrackingNumberResourceTest.php +174 -0
- package/server/tests/Unit/Http/Resources/WaypointResourceTest.php +295 -0
- package/server/tests/Unit/Http/Resources/WorkOrderResourceTest.php +164 -0
- package/server/tests/Unit/Imports/ImportDelegationTest.php +151 -0
- package/server/tests/Unit/Integrations/Lalamove/LalamoveDeliveryStopTest.php +79 -0
- package/server/tests/Unit/Integrations/Lalamove/LalamoveLifecycleTest.php +211 -0
- package/server/tests/Unit/Integrations/Lalamove/LalamoveQuoteAndServiceOrderTest.php +381 -0
- package/server/tests/Unit/Integrations/Lalamove/LalamoveServiceTypeTest.php +51 -0
- package/server/tests/Unit/Integrations/LalamoveQuotationTest.php +194 -0
- package/server/tests/Unit/Integrations/LalamoveResponseHandlingTest.php +58 -0
- package/server/tests/Unit/Jobs/GeofenceDwellAndBulkNotifyTest.php +183 -0
- package/server/tests/Unit/Jobs/ReplayPositionsTest.php +57 -0
- package/server/tests/Unit/Jobs/SimulateWaypointReachedTest.php +92 -0
- package/server/tests/Unit/Listeners/HandleGeofenceEnteredTest.php +256 -0
- package/server/tests/Unit/Listeners/HandleOrderDispatchFailedListenerTest.php +101 -0
- package/server/tests/Unit/Listeners/HandleOrderDispatchedConcreteTest.php +203 -0
- package/server/tests/Unit/Listeners/HandleOrderDispatchedHelpersTest.php +186 -0
- package/server/tests/Unit/Listeners/HandleUserRemovedFromCompanyTest.php +65 -0
- package/server/tests/Unit/Listeners/ListenerDelegationSeamsTest.php +83 -0
- package/server/tests/Unit/Models/AssetTest.php +469 -0
- package/server/tests/Unit/Models/ContactCustomerUserTest.php +370 -0
- package/server/tests/Unit/Models/ContactTest.php +577 -0
- package/server/tests/Unit/Models/DeviceEventTest.php +481 -0
- package/server/tests/Unit/Models/DeviceLastPositionDefaultTest.php +128 -0
- package/server/tests/Unit/Models/DriverModelHelpersTest.php +268 -0
- package/server/tests/Unit/Models/DriverTest.php +401 -0
- package/server/tests/Unit/Models/EntityTest.php +171 -0
- package/server/tests/Unit/Models/EquipmentTest.php +434 -0
- package/server/tests/Unit/Models/FleetTest.php +153 -0
- package/server/tests/Unit/Models/FuelProviderTransactionTest.php +82 -0
- package/server/tests/Unit/Models/FuelReportImportAndLabelsTest.php +193 -0
- package/server/tests/Unit/Models/ImportRowFallbackSeamsTest.php +100 -0
- package/server/tests/Unit/Models/IntegratedVendorLifecycleTest.php +203 -0
- package/server/tests/Unit/Models/IntegratedVendorTest.php +135 -0
- package/server/tests/Unit/Models/IssueTest.php +160 -0
- package/server/tests/Unit/Models/MaintenanceScheduleTest.php +319 -0
- package/server/tests/Unit/Models/MaintenanceTest.php +277 -0
- package/server/tests/Unit/Models/MaintenanceWorkOrderImportTest.php +161 -0
- package/server/tests/Unit/Models/ManifestStopTest.php +121 -0
- package/server/tests/Unit/Models/ManifestTest.php +163 -0
- package/server/tests/Unit/Models/ModelLookupFallbackSeamsTest.php +149 -0
- package/server/tests/Unit/Models/OrderConfigTest.php +341 -0
- package/server/tests/Unit/Models/OrderDynamicContractsTest.php +190 -0
- package/server/tests/Unit/Models/OrderPayloadConfigAndDistanceTest.php +426 -0
- package/server/tests/Unit/Models/OrderPayloadRouteTest.php +227 -0
- package/server/tests/Unit/Models/OrderPurchaseAndDriversTest.php +188 -0
- package/server/tests/Unit/Models/OrderTest.php +917 -0
- package/server/tests/Unit/Models/PartTest.php +399 -0
- package/server/tests/Unit/Models/PayloadTest.php +710 -0
- package/server/tests/Unit/Models/PayloadWaypointsAndEntitiesTest.php +317 -0
- package/server/tests/Unit/Models/PlaceCreationAndImportTest.php +384 -0
- package/server/tests/Unit/Models/PlaceGeocodingResultsTest.php +253 -0
- package/server/tests/Unit/Models/PlaceSharedAndGeocodingTest.php +271 -0
- package/server/tests/Unit/Models/PlaceTest.php +589 -0
- package/server/tests/Unit/Models/PositionTest.php +49 -0
- package/server/tests/Unit/Models/RouteTest.php +55 -0
- package/server/tests/Unit/Models/SensorReadingsTest.php +168 -0
- package/server/tests/Unit/Models/SensorTest.php +284 -0
- package/server/tests/Unit/Models/ServiceAreaGeometryTest.php +129 -0
- package/server/tests/Unit/Models/ServiceAreaTest.php +125 -0
- package/server/tests/Unit/Models/ServiceQuoteTest.php +617 -0
- package/server/tests/Unit/Models/ServiceRateFeeTest.php +73 -0
- package/server/tests/Unit/Models/ServiceRatePersistenceAndServicabilityTest.php +428 -0
- package/server/tests/Unit/Models/ServiceRateTest.php +533 -0
- package/server/tests/Unit/Models/SmallModelSurfacesTest.php +294 -0
- package/server/tests/Unit/Models/TrackingNumberTest.php +199 -0
- package/server/tests/Unit/Models/TrackingStatusTest.php +131 -0
- package/server/tests/Unit/Models/VehicleDeviceTest.php +115 -0
- package/server/tests/Unit/Models/VehiclePositionsAndImportTest.php +220 -0
- package/server/tests/Unit/Models/VehicleTest.php +266 -0
- package/server/tests/Unit/Models/VendorRelationsAndImportTest.php +107 -0
- package/server/tests/Unit/Models/WarrantyTest.php +187 -0
- package/server/tests/Unit/Models/WaypointTest.php +366 -0
- package/server/tests/Unit/Models/WorkOrderTest.php +272 -0
- package/server/tests/Unit/Models/ZoneTest.php +83 -0
- package/server/tests/Unit/Notifications/MonitoringNotificationsTest.php +136 -0
- package/server/tests/Unit/Notifications/OrderAssignedChannelsTest.php +53 -0
- package/server/tests/Unit/Notifications/OrderDispatchedChannelsTest.php +81 -0
- package/server/tests/Unit/Notifications/OrderFailedChannelsTest.php +73 -0
- package/server/tests/Unit/Notifications/OrderPingChannelsTest.php +69 -0
- package/server/tests/Unit/Notifications/TerminalOrderNotificationsTest.php +185 -0
- package/server/tests/Unit/Observers/FleetOpsCompanyUserAndServiceAreaObserversTest.php +133 -0
- package/server/tests/Unit/Observers/ObserverHelperExecutionTest.php +135 -0
- package/server/tests/Unit/Observers/ObserverListenerSeamsTest.php +267 -0
- package/server/tests/Unit/Observers/PurchaseRateObserverAndOrderJobsTest.php +169 -0
- package/server/tests/Unit/Orchestration/Engines/DriverAssignmentEngineTest.php +393 -0
- package/server/tests/Unit/Orchestration/Engines/VroomOrchestrationEngineLifecycleTest.php +397 -0
- package/server/tests/Unit/Orchestration/OrchestrationEngineRegistryTest.php +45 -0
- package/server/tests/Unit/Orchestration/VroomEngineTransportAndSettingsTest.php +253 -0
- package/server/tests/Unit/Providers/FleetOpsAiRegistrationTest.php +59 -0
- package/server/tests/Unit/Rules/ResolvableVehicleTest.php +85 -0
- package/server/tests/Unit/Support/Ai/AssetStatusCapabilityQueriesTest.php +120 -0
- package/server/tests/Unit/Support/Ai/Capabilities/CreateOrderPreviewCapabilityTest.php +385 -0
- package/server/tests/Unit/Support/Ai/Capabilities/OrderInsightsCapabilityTest.php +226 -0
- package/server/tests/Unit/Support/Ai/Capabilities/SearchResourcesCapabilityTest.php +237 -0
- package/server/tests/Unit/Support/AiCapabilityPermissionsTest.php +124 -0
- package/server/tests/Unit/Support/AlgoEdgeBranchesTest.php +24 -0
- package/server/tests/Unit/Support/Analytics/GeofenceViolationsTest.php +109 -0
- package/server/tests/Unit/Support/Analytics/LiveFleetTest.php +205 -0
- package/server/tests/Unit/Support/Analytics/MaintenanceOverviewTest.php +236 -0
- package/server/tests/Unit/Support/Analytics/OnTimeDeliveryAndTopDriversTest.php +250 -0
- package/server/tests/Unit/Support/CreateOrderPreviewDraftingTest.php +235 -0
- package/server/tests/Unit/Support/CustomerAuthTest.php +132 -0
- package/server/tests/Unit/Support/FuelEfficiencyAndCanceledHandlersTest.php +164 -0
- package/server/tests/Unit/Support/FuelProviderRegistryResolutionTest.php +51 -0
- package/server/tests/Unit/Support/FuelProviderServiceMatchingTest.php +280 -0
- package/server/tests/Unit/Support/GeocodingInjectedClientTest.php +268 -0
- package/server/tests/Unit/Support/GeocodingLocateTest.php +32 -0
- package/server/tests/Unit/Support/GeofenceIntersectionServiceTest.php +188 -0
- package/server/tests/Unit/Support/GettingStartedTest.php +164 -0
- package/server/tests/Unit/Support/GuardReturnSeamsTest.php +172 -0
- package/server/tests/Unit/Support/IntegratedVendorsResolverTest.php +250 -0
- package/server/tests/Unit/Support/IssuesInsightsAndAllocationJobTest.php +156 -0
- package/server/tests/Unit/Support/MagicAccessorSeamsTest.php +54 -0
- package/server/tests/Unit/Support/MaintainableAndOperationalAlertsTest.php +215 -0
- package/server/tests/Unit/Support/Metrics/AvgOrderValueMetricTest.php +308 -0
- package/server/tests/Unit/Support/Metrics/CountMetricsTest.php +280 -0
- package/server/tests/Unit/Support/Metrics/FuelCostsMetricTest.php +102 -0
- package/server/tests/Unit/Support/Metrics/MetricQuerySeamsTest.php +129 -0
- package/server/tests/Unit/Support/Metrics/OrdersScheduledMetricTest.php +146 -0
- package/server/tests/Unit/Support/MoreQuerySeamsTest.php +410 -0
- package/server/tests/Unit/Support/OperationalQueryDistributionTest.php +152 -0
- package/server/tests/Unit/Support/OperationsPulseTest.php +130 -0
- package/server/tests/Unit/Support/OptimizeOrderRouteCapabilityTest.php +147 -0
- package/server/tests/Unit/Support/OrchestrationPayloadBuilderTest.php +135 -0
- package/server/tests/Unit/Support/OrchestrationRouteAndVehicleTasksTest.php +254 -0
- package/server/tests/Unit/Support/OsrmProofAndIssueFilterTest.php +247 -0
- package/server/tests/Unit/Support/PetroAppFuelProviderTest.php +165 -0
- package/server/tests/Unit/Support/PlaceSearchRankingTest.php +191 -0
- package/server/tests/Unit/Support/QuerySeamsTest.php +309 -0
- package/server/tests/Unit/Support/ResolvesOrderServiceStopsDbTest.php +303 -0
- package/server/tests/Unit/Support/ResolvesOrderServiceStopsTest.php +382 -0
- package/server/tests/Unit/Support/SkipAndFallbackGuardsTest.php +70 -0
- package/server/tests/Unit/Support/TelematicCredentialResolutionTest.php +31 -0
- package/server/tests/Unit/Support/TelematicServiceTest.php +256 -0
- package/server/tests/Unit/Support/Telematics/Providers/AbstractProviderTest.php +154 -0
- package/server/tests/Unit/Support/Telematics/Providers/AfaqyProviderTest.php +191 -0
- package/server/tests/Unit/Support/Telematics/Providers/AfaqyProviderTransportTest.php +138 -0
- package/server/tests/Unit/Support/Telematics/Providers/GeotabProviderTest.php +329 -0
- package/server/tests/Unit/Support/Telematics/Providers/ProviderTransportSeamsTest.php +133 -0
- package/server/tests/Unit/Support/Telematics/Providers/SafeeProviderTest.php +487 -0
- package/server/tests/Unit/Support/Telematics/TelematicProviderRegistryTest.php +39 -0
- package/server/tests/Unit/Support/Telematics/TelematicServiceLifecycleTest.php +711 -0
- package/server/tests/Unit/Support/Telematics/TelematicServiceTelemetryTest.php +364 -0
- package/server/tests/Unit/Support/UtilsAdditionalTest.php +256 -0
- package/server/tests/Unit/Support/UtilsGeoMatrixAndVendorTest.php +382 -0
- package/server/tests/Unit/Tracking/TrackingContextTest.php +114 -0
- package/server/tests/Unit/Tracking/TrackingIntelligenceAndContextTest.php +477 -0
- package/server/tests/Unit/Tracking/TrackingProviderManagerFallbacksTest.php +208 -0
- package/server/tests/Unit/Traits/HasTrackingNumberTest.php +303 -0
- package/server/tests/Unit/Traits/PayloadAccessorsTest.php +150 -0
- package/server/tests/UtilsContractsTest.php +244 -0
- package/server/tests/VehicleControllerHelperContractsTest.php +488 -0
- package/server/tests/VehicleDataParsingTest.php +45 -0
- package/server/tests/VehicleResourceContractsTest.php +313 -0
- package/translations/bg-bg.yaml +2 -0
- package/translations/en-us.yaml +2 -0
- package/translations/es-pa.yaml +2 -0
- package/translations/fr-fr.yaml +2 -0
- package/translations/mn-mn.yaml +2 -0
- package/translations/pt-br.yaml +2 -0
- package/translations/ru-ru.yaml +2 -0
- package/server/tests/DeviceFilterTest.php +0 -44
- package/server/tests/LiveControllerViewportTest.php +0 -52
|
@@ -36,9 +36,7 @@ class Geocoding
|
|
|
36
36
|
*/
|
|
37
37
|
public static function geocode(string $searchQuery, $latitude = null, $longitude = null): Collection
|
|
38
38
|
{
|
|
39
|
-
$
|
|
40
|
-
$provider = new GoogleMaps($httpClient, null, config('services.google_maps.api_key', env('GOOGLE_MAPS_API_KEY')));
|
|
41
|
-
$geocoder = new StatefulGeocoder($provider, 'en');
|
|
39
|
+
$geocoder = static::makeGeocoder();
|
|
42
40
|
|
|
43
41
|
try {
|
|
44
42
|
if ($latitude && $longitude) {
|
|
@@ -57,7 +55,7 @@ class Geocoding
|
|
|
57
55
|
|
|
58
56
|
return collect($geoResults->all())->map(
|
|
59
57
|
function ($googleAddress) {
|
|
60
|
-
return
|
|
58
|
+
return static::makePlaceFromGoogleAddress($googleAddress);
|
|
61
59
|
}
|
|
62
60
|
)->values();
|
|
63
61
|
} catch (\Exception $e) {
|
|
@@ -81,10 +79,6 @@ class Geocoding
|
|
|
81
79
|
*/
|
|
82
80
|
public static function reverseFromQuery(string $searchQuery, $latitude, $longitude): Collection
|
|
83
81
|
{
|
|
84
|
-
$httpClient = new Client();
|
|
85
|
-
$provider = new GoogleMaps($httpClient, null, config('services.google_maps.api_key', env('GOOGLE_MAPS_API_KEY')));
|
|
86
|
-
$geocoder = new StatefulGeocoder($provider, 'en');
|
|
87
|
-
|
|
88
82
|
if (empty($searchQuery)) {
|
|
89
83
|
return collect();
|
|
90
84
|
}
|
|
@@ -93,6 +87,8 @@ class Geocoding
|
|
|
93
87
|
return collect();
|
|
94
88
|
}
|
|
95
89
|
|
|
90
|
+
$geocoder = static::makeGeocoder();
|
|
91
|
+
|
|
96
92
|
try {
|
|
97
93
|
$geoResults = $geocoder->reverseQuery(
|
|
98
94
|
ReverseQuery::fromCoordinates($latitude, $longitude)
|
|
@@ -103,7 +99,7 @@ class Geocoding
|
|
|
103
99
|
|
|
104
100
|
return collect($geoResults->all())->map(
|
|
105
101
|
function ($googleAddress) {
|
|
106
|
-
return
|
|
102
|
+
return static::makePlaceFromGoogleAddress($googleAddress);
|
|
107
103
|
}
|
|
108
104
|
)->values();
|
|
109
105
|
} catch (\Exception $e) {
|
|
@@ -127,14 +123,12 @@ class Geocoding
|
|
|
127
123
|
*/
|
|
128
124
|
public static function reverseFromCoordinates($latitude, $longitude, ?string $searchQuery = null): Collection
|
|
129
125
|
{
|
|
130
|
-
$httpClient = new Client();
|
|
131
|
-
$provider = new GoogleMaps($httpClient, null, config('services.google_maps.api_key', env('GOOGLE_MAPS_API_KEY')));
|
|
132
|
-
$geocoder = new StatefulGeocoder($provider, 'en');
|
|
133
|
-
|
|
134
126
|
if (empty($latitude) && empty($longitude)) {
|
|
135
127
|
return collect();
|
|
136
128
|
}
|
|
137
129
|
|
|
130
|
+
$geocoder = static::makeGeocoder();
|
|
131
|
+
|
|
138
132
|
try {
|
|
139
133
|
if ($searchQuery) {
|
|
140
134
|
$geoResults = $geocoder->reverseQuery(
|
|
@@ -153,7 +147,7 @@ class Geocoding
|
|
|
153
147
|
|
|
154
148
|
return collect($geoResults->all())->map(
|
|
155
149
|
function ($googleAddress) {
|
|
156
|
-
return
|
|
150
|
+
return static::makePlaceFromGoogleAddress($googleAddress);
|
|
157
151
|
}
|
|
158
152
|
)->values();
|
|
159
153
|
} catch (\Exception $e) {
|
|
@@ -216,4 +210,48 @@ class Geocoding
|
|
|
216
210
|
{
|
|
217
211
|
return Utils::notEmpty(config('services.google_maps.api_key'));
|
|
218
212
|
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* The language geocoding results are returned in — Google's `language`
|
|
216
|
+
* parameter, e.g. `en`, `ru`, `es`.
|
|
217
|
+
*/
|
|
218
|
+
public static function getLocale(): string
|
|
219
|
+
{
|
|
220
|
+
// `?:` rather than a config() default: the settings table stores this
|
|
221
|
+
// key, so it exists-but-empty on installs that never filled it in, and
|
|
222
|
+
// config()'s default only applies when the key is absent entirely.
|
|
223
|
+
return config('services.google_maps.locale') ?: env('GOOGLE_MAPS_LOCALE', 'en');
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* The region requests are biased towards — Google's `region` parameter.
|
|
228
|
+
* This is a ccTLD (`us`, `ru`, `sg`), not a language code, and is a
|
|
229
|
+
* separate concern from the locale above.
|
|
230
|
+
*/
|
|
231
|
+
public static function getRegion(): ?string
|
|
232
|
+
{
|
|
233
|
+
return config('services.google_maps.region') ?: env('GOOGLE_MAPS_REGION', 'us');
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
protected static function makeGeocoder(): object
|
|
237
|
+
{
|
|
238
|
+
// Allow an alternative geocoder (or test double) to be injected
|
|
239
|
+
// through the container without constructing a live HTTP client.
|
|
240
|
+
if (app()->bound('fleetops.geocoder')) {
|
|
241
|
+
return app('fleetops.geocoder');
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Region biases which results rank highest; locale controls the
|
|
245
|
+
// language they come back in. Applying both here covers every caller
|
|
246
|
+
// rather than each construction site repeating them.
|
|
247
|
+
$httpClient = new Client();
|
|
248
|
+
$provider = new GoogleMaps($httpClient, static::getRegion(), config('services.google_maps.api_key', env('GOOGLE_MAPS_API_KEY')));
|
|
249
|
+
|
|
250
|
+
return new StatefulGeocoder($provider, static::getLocale());
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
protected static function makePlaceFromGoogleAddress($googleAddress): Place
|
|
254
|
+
{
|
|
255
|
+
return Place::createFromGoogleAddress($googleAddress);
|
|
256
|
+
}
|
|
219
257
|
}
|
|
@@ -70,16 +70,7 @@ class GeofenceIntersectionService
|
|
|
70
70
|
// - ST_Contains performs the precise polygon containment check
|
|
71
71
|
// on the reduced candidate set (accurate, no index needed).
|
|
72
72
|
// ----------------------------------------------------------------
|
|
73
|
-
$insideZones =
|
|
74
|
-
->whereNotNull('border')
|
|
75
|
-
->where(function ($q) {
|
|
76
|
-
$q->where('trigger_on_entry', true)
|
|
77
|
-
->orWhere('trigger_on_exit', true)
|
|
78
|
-
->orWhereNotNull('dwell_threshold_minutes');
|
|
79
|
-
})
|
|
80
|
-
->whereRaw('MBRContains(`border`, ST_GeomFromText(?))', [$wkt])
|
|
81
|
-
->whereRaw('ST_Contains(`border`, ST_GeomFromText(?))', [$wkt])
|
|
82
|
-
->get();
|
|
73
|
+
$insideZones = $this->insideZones($companyUuid, $wkt);
|
|
83
74
|
|
|
84
75
|
// ----------------------------------------------------------------
|
|
85
76
|
// 2. Find all Service Areas the driver is currently inside.
|
|
@@ -87,16 +78,7 @@ class GeofenceIntersectionService
|
|
|
87
78
|
// Service areas use MultiPolygon borders, so we use
|
|
88
79
|
// ST_Contains which handles both Polygon and MultiPolygon.
|
|
89
80
|
// ----------------------------------------------------------------
|
|
90
|
-
$insideServiceAreas =
|
|
91
|
-
->whereNotNull('border')
|
|
92
|
-
->where(function ($q) {
|
|
93
|
-
$q->where('trigger_on_entry', true)
|
|
94
|
-
->orWhere('trigger_on_exit', true)
|
|
95
|
-
->orWhereNotNull('dwell_threshold_minutes');
|
|
96
|
-
})
|
|
97
|
-
->whereRaw('MBRContains(`border`, ST_GeomFromText(?))', [$wkt])
|
|
98
|
-
->whereRaw('ST_Contains(`border`, ST_GeomFromText(?))', [$wkt])
|
|
99
|
-
->get();
|
|
81
|
+
$insideServiceAreas = $this->insideServiceAreas($companyUuid, $wkt);
|
|
100
82
|
|
|
101
83
|
// Merge into a unified collection with a type discriminator
|
|
102
84
|
$currentlyInside = collect()
|
|
@@ -108,10 +90,7 @@ class GeofenceIntersectionService
|
|
|
108
90
|
// ----------------------------------------------------------------
|
|
109
91
|
// 3. Load the driver's current geofence state records.
|
|
110
92
|
// ----------------------------------------------------------------
|
|
111
|
-
$currentStates =
|
|
112
|
-
->where($subjectColumn, $subjectUuid)
|
|
113
|
-
->get()
|
|
114
|
-
->keyBy('geofence_uuid');
|
|
93
|
+
$currentStates = $this->currentSubjectStates($stateTable, $subjectColumn, $subjectUuid);
|
|
115
94
|
|
|
116
95
|
// ----------------------------------------------------------------
|
|
117
96
|
// 4. Detect ENTRIES: geofences the driver is now inside but
|
|
@@ -136,9 +115,7 @@ class GeofenceIntersectionService
|
|
|
136
115
|
// ----------------------------------------------------------------
|
|
137
116
|
foreach ($currentStates as $geofenceUuid => $state) {
|
|
138
117
|
if ($state->is_inside && !in_array($geofenceUuid, $currentlyInsideUuids)) {
|
|
139
|
-
$geofence = $state->geofence_type
|
|
140
|
-
? ServiceArea::where('uuid', $geofenceUuid)->first()
|
|
141
|
-
: Zone::where('uuid', $geofenceUuid)->first();
|
|
118
|
+
$geofence = $this->findGeofence($state->geofence_type, $geofenceUuid);
|
|
142
119
|
|
|
143
120
|
if ($geofence) {
|
|
144
121
|
$crossings[] = [
|
|
@@ -153,6 +130,49 @@ class GeofenceIntersectionService
|
|
|
153
130
|
return $crossings;
|
|
154
131
|
}
|
|
155
132
|
|
|
133
|
+
protected function insideZones(string $companyUuid, string $wkt)
|
|
134
|
+
{
|
|
135
|
+
return Zone::where('company_uuid', $companyUuid)
|
|
136
|
+
->whereNotNull('border')
|
|
137
|
+
->where(function ($q) {
|
|
138
|
+
$q->where('trigger_on_entry', true)
|
|
139
|
+
->orWhere('trigger_on_exit', true)
|
|
140
|
+
->orWhereNotNull('dwell_threshold_minutes');
|
|
141
|
+
})
|
|
142
|
+
->whereRaw('MBRContains(`border`, ST_GeomFromText(?))', [$wkt])
|
|
143
|
+
->whereRaw('ST_Contains(`border`, ST_GeomFromText(?))', [$wkt])
|
|
144
|
+
->get();
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
protected function insideServiceAreas(string $companyUuid, string $wkt)
|
|
148
|
+
{
|
|
149
|
+
return ServiceArea::where('company_uuid', $companyUuid)
|
|
150
|
+
->whereNotNull('border')
|
|
151
|
+
->where(function ($q) {
|
|
152
|
+
$q->where('trigger_on_entry', true)
|
|
153
|
+
->orWhere('trigger_on_exit', true)
|
|
154
|
+
->orWhereNotNull('dwell_threshold_minutes');
|
|
155
|
+
})
|
|
156
|
+
->whereRaw('MBRContains(`border`, ST_GeomFromText(?))', [$wkt])
|
|
157
|
+
->whereRaw('ST_Contains(`border`, ST_GeomFromText(?))', [$wkt])
|
|
158
|
+
->get();
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
protected function currentSubjectStates(string $stateTable, string $subjectColumn, string $subjectUuid)
|
|
162
|
+
{
|
|
163
|
+
return DB::table($stateTable)
|
|
164
|
+
->where($subjectColumn, $subjectUuid)
|
|
165
|
+
->get()
|
|
166
|
+
->keyBy('geofence_uuid');
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
protected function findGeofence(string $geofenceType, string $geofenceUuid)
|
|
170
|
+
{
|
|
171
|
+
return $geofenceType === 'service_area'
|
|
172
|
+
? ServiceArea::where('uuid', $geofenceUuid)->first()
|
|
173
|
+
: Zone::where('uuid', $geofenceUuid)->first();
|
|
174
|
+
}
|
|
175
|
+
|
|
156
176
|
/**
|
|
157
177
|
* Check if a driver is currently recorded as inside a specific geofence.
|
|
158
178
|
*
|
|
@@ -19,7 +19,7 @@ class LiveOrderQuery
|
|
|
19
19
|
$withRelations = $options['with_relations'] ?? false;
|
|
20
20
|
$applyPermissions = $options['apply_permissions'] ?? true;
|
|
21
21
|
|
|
22
|
-
$query =
|
|
22
|
+
$query = static::newOrderQuery($companyUuid)
|
|
23
23
|
->whereHas('payload', function ($query) {
|
|
24
24
|
$query->where(function ($q) {
|
|
25
25
|
$q->whereHas('waypoints');
|
|
@@ -72,4 +72,9 @@ class LiveOrderQuery
|
|
|
72
72
|
|
|
73
73
|
return $query;
|
|
74
74
|
}
|
|
75
|
+
|
|
76
|
+
protected static function newOrderQuery(string $companyUuid): Builder
|
|
77
|
+
{
|
|
78
|
+
return Order::where('company_uuid', $companyUuid);
|
|
79
|
+
}
|
|
75
80
|
}
|
|
@@ -10,7 +10,8 @@ use Illuminate\Support\Facades\Schema;
|
|
|
10
10
|
|
|
11
11
|
class ActiveRevenueQuery
|
|
12
12
|
{
|
|
13
|
-
public const ACTIVE_STATUSES = [
|
|
13
|
+
public const ACTIVE_STATUSES = ['success'];
|
|
14
|
+
public const CREDIT_DIRECTION = 'credit';
|
|
14
15
|
public const INACTIVE_TRANSACTION_STATUSES = ['pending', 'failed', 'cancelled', 'canceled', 'void', 'voided', 'expired', 'reversed', 'refunded', 'ignored'];
|
|
15
16
|
public const INACTIVE_ORDER_STATUSES = ['canceled', 'cancelled', 'order_canceled'];
|
|
16
17
|
public const INACTIVE_INVOICE_STATUSES = ['void', 'voided', 'cancelled', 'canceled'];
|
|
@@ -20,7 +21,7 @@ class ActiveRevenueQuery
|
|
|
20
21
|
$query = Transaction::query()
|
|
21
22
|
->where('company_uuid', $company->uuid)
|
|
22
23
|
->where('currency', $currency)
|
|
23
|
-
->where('direction',
|
|
24
|
+
->where('direction', self::CREDIT_DIRECTION)
|
|
24
25
|
->whereIn('status', self::ACTIVE_STATUSES)
|
|
25
26
|
->whereNotIn('status', self::INACTIVE_TRANSACTION_STATUSES)
|
|
26
27
|
->whereNull('deleted_at')
|
|
@@ -13,7 +13,7 @@ class FuelCostsMetric extends MoneyMetric
|
|
|
13
13
|
|
|
14
14
|
protected function query(?\DateTimeInterface $start, ?\DateTimeInterface $end)
|
|
15
15
|
{
|
|
16
|
-
$query =
|
|
16
|
+
$query = $this->fuelReportQuery($this->company->uuid)
|
|
17
17
|
->where('currency', $this->currency());
|
|
18
18
|
|
|
19
19
|
if ($start && $end) {
|
|
@@ -27,4 +27,9 @@ class FuelCostsMetric extends MoneyMetric
|
|
|
27
27
|
{
|
|
28
28
|
return (float) $query->sum('amount');
|
|
29
29
|
}
|
|
30
|
+
|
|
31
|
+
protected function fuelReportQuery(string $companyUuid)
|
|
32
|
+
{
|
|
33
|
+
return FuelReport::where('company_uuid', $companyUuid);
|
|
34
|
+
}
|
|
30
35
|
}
|
|
@@ -381,9 +381,14 @@ trait ResolvesOrderServiceStops
|
|
|
381
381
|
'location' => Utils::parsePointToWkt($this->serviceStopLocationPoint($place)),
|
|
382
382
|
], $place);
|
|
383
383
|
|
|
384
|
+
// Unreachable: insertGetUuid() only returns false when the underlying
|
|
385
|
+
// insert returns false, which Laravel's forced PDO::ERRMODE_EXCEPTION
|
|
386
|
+
// never does — the insert either succeeds or throws.
|
|
387
|
+
// @codeCoverageIgnoreStart
|
|
384
388
|
if (!$trackingNumberUuid) {
|
|
385
389
|
return null;
|
|
386
390
|
}
|
|
391
|
+
// @codeCoverageIgnoreEnd
|
|
387
392
|
|
|
388
393
|
DB::table($payload->getTable())->where('uuid', $payload->uuid)->update([$column => $trackingNumberUuid]);
|
|
389
394
|
$payload->{$column} = $trackingNumberUuid;
|
|
@@ -415,9 +420,14 @@ trait ResolvesOrderServiceStops
|
|
|
415
420
|
$trackingNumber->status_uuid = $activityId;
|
|
416
421
|
}
|
|
417
422
|
|
|
423
|
+
// Unreachable: endpointServiceStopTrackingNumber() always hands back a
|
|
424
|
+
// freshly queried TrackingNumber, and TrackingNumber declares no $with,
|
|
425
|
+
// so the status relation is never already loaded here.
|
|
426
|
+
// @codeCoverageIgnoreStart
|
|
418
427
|
if ($trackingNumber->relationLoaded('status')) {
|
|
419
428
|
$trackingNumber->unsetRelation('status');
|
|
420
429
|
}
|
|
430
|
+
// @codeCoverageIgnoreEnd
|
|
421
431
|
|
|
422
432
|
return $activityId ?: null;
|
|
423
433
|
}
|
|
@@ -34,14 +34,14 @@ class GeotabProvider extends AbstractProvider
|
|
|
34
34
|
*/
|
|
35
35
|
protected function authenticate(): void
|
|
36
36
|
{
|
|
37
|
-
$response =
|
|
37
|
+
$response = $this->postGeotab([
|
|
38
38
|
'method' => 'Authenticate',
|
|
39
39
|
'params' => [
|
|
40
40
|
'database' => $this->credentials['database'],
|
|
41
41
|
'userName' => $this->credentials['username'],
|
|
42
42
|
'password' => $this->credentials['password'],
|
|
43
43
|
],
|
|
44
|
-
])
|
|
44
|
+
]);
|
|
45
45
|
|
|
46
46
|
if (isset($response['result']['credentials']['sessionId'])) {
|
|
47
47
|
$this->sessionId = $response['result']['credentials']['sessionId'];
|
|
@@ -223,10 +223,15 @@ class GeotabProvider extends AbstractProvider
|
|
|
223
223
|
'sessionId' => $this->sessionId,
|
|
224
224
|
];
|
|
225
225
|
|
|
226
|
-
return
|
|
226
|
+
return $this->postGeotab([
|
|
227
227
|
'method' => $method,
|
|
228
228
|
'params' => $params,
|
|
229
|
-
])
|
|
229
|
+
]) ?? [];
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
protected function postGeotab(array $payload): ?array
|
|
233
|
+
{
|
|
234
|
+
return Http::post($this->baseUrl, $payload)->json();
|
|
230
235
|
}
|
|
231
236
|
|
|
232
237
|
protected function fetchLatestLogRecords(array $devices, array $options = []): array
|
|
@@ -271,12 +271,20 @@ class Utils extends FleetbaseUtils
|
|
|
271
271
|
try {
|
|
272
272
|
$coordinates = Point::fromJson($coordinatesJson);
|
|
273
273
|
} catch (\Throwable $e) {
|
|
274
|
+
// Both fallbacks carry a GeoJSON coordinate value, so they are
|
|
275
|
+
// read as GeoJSON first: pointFromGeoJson() maps [lng, lat],
|
|
276
|
+
// whereas recursing hands the pair to the positional array
|
|
277
|
+
// reader below, which takes index 0 as the latitude. Nested
|
|
278
|
+
// values (a Polygon or LineString ring rather than a single
|
|
279
|
+
// pair) yield null there and still fall through to it.
|
|
274
280
|
if ($coordinatesInGeoJson) {
|
|
275
|
-
return static::
|
|
281
|
+
return static::pointFromGeoJsonCoordinates($coordinatesInGeoJson)
|
|
282
|
+
?? static::getPointFromMixed($coordinatesInGeoJson);
|
|
276
283
|
}
|
|
277
284
|
|
|
278
285
|
if ($coordinatesInGeoJsonFeature) {
|
|
279
|
-
return static::
|
|
286
|
+
return static::pointFromGeoJsonCoordinates($coordinatesInGeoJsonFeature)
|
|
287
|
+
?? static::getPointFromMixed($coordinatesInGeoJsonFeature);
|
|
280
288
|
}
|
|
281
289
|
}
|
|
282
290
|
}
|
|
@@ -492,7 +500,7 @@ class Utils extends FleetbaseUtils
|
|
|
492
500
|
$coordinates = null;
|
|
493
501
|
}
|
|
494
502
|
|
|
495
|
-
if (preg_match('/LatLng\(([^,]+),\s*([^)]+)\)/', $coordinates, $matches)) {
|
|
503
|
+
if (is_string($coordinates) && preg_match('/LatLng\(([^,]+),\s*([^)]+)\)/', $coordinates, $matches)) {
|
|
496
504
|
$coords = [
|
|
497
505
|
floatval($matches[1]),
|
|
498
506
|
floatval($matches[2]),
|
|
@@ -501,20 +509,20 @@ class Utils extends FleetbaseUtils
|
|
|
501
509
|
$coordinates = null;
|
|
502
510
|
}
|
|
503
511
|
|
|
504
|
-
if (Str::contains($coordinates, ',')) {
|
|
512
|
+
if (is_string($coordinates) && Str::contains($coordinates, ',')) {
|
|
505
513
|
$coords = explode(',', $coordinates);
|
|
506
514
|
}
|
|
507
515
|
|
|
508
|
-
if (Str::contains($coordinates, '|')) {
|
|
516
|
+
if (is_string($coordinates) && Str::contains($coordinates, '|')) {
|
|
509
517
|
$coords = explode('|', $coordinates);
|
|
510
518
|
}
|
|
511
519
|
|
|
512
|
-
if (Str::contains($coordinates, ' ')) {
|
|
520
|
+
if (is_string($coordinates) && Str::contains($coordinates, ' ')) {
|
|
513
521
|
$coords = explode(' ', $coordinates);
|
|
514
522
|
}
|
|
515
523
|
|
|
516
|
-
$latitude = $coords[0];
|
|
517
|
-
$longitude = $coords[1];
|
|
524
|
+
$latitude = $coords[0] ?? null;
|
|
525
|
+
$longitude = $coords[1] ?? null;
|
|
518
526
|
|
|
519
527
|
if (is_numeric($latitude) && is_numeric($longitude)) {
|
|
520
528
|
$coordinates = new Point((float) $latitude, (float) $longitude);
|
|
@@ -701,6 +709,19 @@ class Utils extends FleetbaseUtils
|
|
|
701
709
|
return new Point((float) $latitude, (float) $longitude);
|
|
702
710
|
}
|
|
703
711
|
|
|
712
|
+
/**
|
|
713
|
+
* Resolve a bare GeoJSON `coordinates` value — an `[longitude, latitude]`
|
|
714
|
+
* pair — into a Point, without the surrounding envelope.
|
|
715
|
+
*
|
|
716
|
+
* Returns null for anything that is not a usable pair, including the nested
|
|
717
|
+
* rings a Polygon or LineString carries, so callers can fall through to
|
|
718
|
+
* their own handling.
|
|
719
|
+
*/
|
|
720
|
+
protected static function pointFromGeoJsonCoordinates($coordinates): ?Point
|
|
721
|
+
{
|
|
722
|
+
return static::pointFromGeoJson(['type' => 'Point', 'coordinates' => $coordinates]);
|
|
723
|
+
}
|
|
724
|
+
|
|
704
725
|
/**
|
|
705
726
|
* Converts a point to a WKT (Well-Known Text) representation for SQL insert.
|
|
706
727
|
*
|
|
@@ -1162,9 +1183,13 @@ class Utils extends FleetbaseUtils
|
|
|
1162
1183
|
|
|
1163
1184
|
$feature = collect($globe->features)->first(
|
|
1164
1185
|
function ($feature) use ($country) {
|
|
1186
|
+
// Every feature in the bundled resources/data/globe.json carries
|
|
1187
|
+
// both codes, so this only guards against future data changes.
|
|
1188
|
+
// @codeCoverageIgnoreStart
|
|
1165
1189
|
if (!isset($feature->properties->ISO_A3) || !isset($feature->properties->ISO_A2)) {
|
|
1166
1190
|
return false;
|
|
1167
1191
|
}
|
|
1192
|
+
// @codeCoverageIgnoreEnd
|
|
1168
1193
|
|
|
1169
1194
|
return strtolower($feature->properties->ISO_A3) === $country || strtolower($feature->properties->ISO_A2) === $country;
|
|
1170
1195
|
}
|
|
@@ -1199,8 +1224,10 @@ class Utils extends FleetbaseUtils
|
|
|
1199
1224
|
$radius = ($meters * 1000) / 6378137;
|
|
1200
1225
|
// create circle coordinates
|
|
1201
1226
|
$coords = collect();
|
|
1202
|
-
// loop through the array and write path linestrings
|
|
1203
|
-
|
|
1227
|
+
// loop through the array and write path linestrings — stop short of 360
|
|
1228
|
+
// so the ring is closed explicitly below rather than by re-computing the
|
|
1229
|
+
// 0 degree vertex, which produced a duplicated point
|
|
1230
|
+
for ($i = 0; $i < 360; $i += 3) {
|
|
1204
1231
|
$radial = deg2rad($i);
|
|
1205
1232
|
$lat_rad = asin(sin($latitude) * cos($radius) + cos($latitude) * sin($radius) * cos($radial));
|
|
1206
1233
|
$dlon_rad = atan2(sin($radial) * sin($radius) * cos($latitude), cos($radius) - sin($latitude) * sin($lat_rad));
|
|
@@ -1261,9 +1288,80 @@ class Utils extends FleetbaseUtils
|
|
|
1261
1288
|
*/
|
|
1262
1289
|
public static function getCentroidFromGeosPolygon(\Brick\Geo\Polygon $polygon): \Brick\Geo\Point
|
|
1263
1290
|
{
|
|
1264
|
-
|
|
1291
|
+
return static::resolveGeometryEngine()->centroid($polygon);
|
|
1292
|
+
}
|
|
1293
|
+
|
|
1294
|
+
/**
|
|
1295
|
+
* Resolve the configured geometry engine, preferring the registry so
|
|
1296
|
+
* alternative engines (or test doubles) can be injected without the
|
|
1297
|
+
* GEOS extension.
|
|
1298
|
+
*/
|
|
1299
|
+
/**
|
|
1300
|
+
* Determine whether the active database connection speaks SQLite.
|
|
1301
|
+
*/
|
|
1302
|
+
protected static function isSqliteConnection(): bool
|
|
1303
|
+
{
|
|
1304
|
+
try {
|
|
1305
|
+
$connection = DB::connection();
|
|
1306
|
+
} catch (\Throwable $e) {
|
|
1307
|
+
return false;
|
|
1308
|
+
}
|
|
1309
|
+
|
|
1310
|
+
return $connection instanceof \Illuminate\Database\SQLiteConnection
|
|
1311
|
+
|| ($connection && $connection->getDriverName() === 'sqlite');
|
|
1312
|
+
}
|
|
1313
|
+
|
|
1314
|
+
/**
|
|
1315
|
+
* Build a driver-aware SQL expression for whole-second differences
|
|
1316
|
+
* between two datetime expressions.
|
|
1317
|
+
*/
|
|
1318
|
+
public static function sqlSecondsDiff(string $start, string $end): string
|
|
1319
|
+
{
|
|
1320
|
+
if (static::isSqliteConnection()) {
|
|
1321
|
+
return "CAST(ROUND((julianday($end) - julianday($start)) * 86400) AS INTEGER)";
|
|
1322
|
+
}
|
|
1265
1323
|
|
|
1266
|
-
return
|
|
1324
|
+
return "TIMESTAMPDIFF(SECOND, $start, $end)";
|
|
1325
|
+
}
|
|
1326
|
+
|
|
1327
|
+
/**
|
|
1328
|
+
* Build a driver-aware SQL expression for whole-minute differences
|
|
1329
|
+
* between two datetime expressions.
|
|
1330
|
+
*/
|
|
1331
|
+
public static function sqlMinutesDiff(string $start, string $end): string
|
|
1332
|
+
{
|
|
1333
|
+
if (static::isSqliteConnection()) {
|
|
1334
|
+
return "CAST(ROUND((julianday($end) - julianday($start)) * 1440) AS INTEGER)";
|
|
1335
|
+
}
|
|
1336
|
+
|
|
1337
|
+
return "TIMESTAMPDIFF(MINUTE, $start, $end)";
|
|
1338
|
+
}
|
|
1339
|
+
|
|
1340
|
+
/**
|
|
1341
|
+
* Driver-aware SQL expression for the current timestamp.
|
|
1342
|
+
*/
|
|
1343
|
+
public static function sqlNow(): string
|
|
1344
|
+
{
|
|
1345
|
+
return static::isSqliteConnection() ? "datetime('now')" : 'NOW()';
|
|
1346
|
+
}
|
|
1347
|
+
|
|
1348
|
+
/**
|
|
1349
|
+
* Driver-aware SQL scalar minimum of two expressions.
|
|
1350
|
+
*/
|
|
1351
|
+
public static function sqlLeast(string $first, string $second): string
|
|
1352
|
+
{
|
|
1353
|
+
$function = static::isSqliteConnection() ? 'MIN' : 'LEAST';
|
|
1354
|
+
|
|
1355
|
+
return "$function($first, $second)";
|
|
1356
|
+
}
|
|
1357
|
+
|
|
1358
|
+
public static function resolveGeometryEngine(): \Brick\Geo\Engine\GeometryEngine
|
|
1359
|
+
{
|
|
1360
|
+
if (\Brick\Geo\Engine\GeometryEngineRegistry::has()) {
|
|
1361
|
+
return \Brick\Geo\Engine\GeometryEngineRegistry::get();
|
|
1362
|
+
}
|
|
1363
|
+
|
|
1364
|
+
return new \Brick\Geo\Engine\GEOSEngine();
|
|
1267
1365
|
}
|
|
1268
1366
|
|
|
1269
1367
|
/**
|
|
@@ -1275,9 +1373,7 @@ class Utils extends FleetbaseUtils
|
|
|
1275
1373
|
*/
|
|
1276
1374
|
public static function getCentroidFromGeosMultiPolygon(\Brick\Geo\MultiPolygon $multiPolygon): \Brick\Geo\Point
|
|
1277
1375
|
{
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
return $geometryEngine->centroid($multiPolygon);
|
|
1376
|
+
return static::resolveGeometryEngine()->centroid($multiPolygon);
|
|
1281
1377
|
}
|
|
1282
1378
|
|
|
1283
1379
|
/**
|
|
@@ -1489,8 +1585,18 @@ class Utils extends FleetbaseUtils
|
|
|
1489
1585
|
return $activity && $activity instanceof Activity && !empty($activity->code);
|
|
1490
1586
|
}
|
|
1491
1587
|
|
|
1492
|
-
|
|
1588
|
+
/**
|
|
1589
|
+
* Normalize a phone number to E.164-ish form by ensuring a leading `+`.
|
|
1590
|
+
*
|
|
1591
|
+
* Import rows frequently omit a phone column entirely, so a missing
|
|
1592
|
+
* number is passed through untouched rather than becoming a bare `+`.
|
|
1593
|
+
*/
|
|
1594
|
+
public static function fixPhone(?string $phone): ?string
|
|
1493
1595
|
{
|
|
1596
|
+
if ($phone === null || $phone === '') {
|
|
1597
|
+
return $phone;
|
|
1598
|
+
}
|
|
1599
|
+
|
|
1494
1600
|
if (!Str::startsWith($phone, '+')) {
|
|
1495
1601
|
$phone = '+' . $phone;
|
|
1496
1602
|
}
|
|
@@ -113,6 +113,11 @@ class GoogleRoutesTrackingProvider implements TrackingProviderInterface
|
|
|
113
113
|
|
|
114
114
|
protected function apiKey(): ?string
|
|
115
115
|
{
|
|
116
|
-
|
|
116
|
+
$configuredKey = config('services.google_maps.api_key');
|
|
117
|
+
if ($configuredKey) {
|
|
118
|
+
return $configuredKey;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return class_exists(\PhpOption\Option::class) ? env('GOOGLE_MAPS_API_KEY') : null;
|
|
117
122
|
}
|
|
118
123
|
}
|
|
@@ -29,12 +29,7 @@ class OsrmTrackingProvider implements TrackingProviderInterface
|
|
|
29
29
|
|
|
30
30
|
public function track(TrackingContext $context, TrackingOptions $options): TrackingProviderResult
|
|
31
31
|
{
|
|
32
|
-
$response =
|
|
33
|
-
'overview' => 'full',
|
|
34
|
-
'geometries' => 'polyline',
|
|
35
|
-
'steps' => 'false',
|
|
36
|
-
'annotations' => 'false',
|
|
37
|
-
]);
|
|
32
|
+
$response = $this->routeResponse($context);
|
|
38
33
|
|
|
39
34
|
if (data_get($response, 'code') !== 'Ok') {
|
|
40
35
|
throw new \RuntimeException('OSRM did not return a routable response.');
|
|
@@ -68,4 +63,14 @@ class OsrmTrackingProvider implements TrackingProviderInterface
|
|
|
68
63
|
raw: $route
|
|
69
64
|
);
|
|
70
65
|
}
|
|
66
|
+
|
|
67
|
+
protected function routeResponse(TrackingContext $context): array
|
|
68
|
+
{
|
|
69
|
+
return OSRM::getRouteFromPoints($context->routePoints(), [
|
|
70
|
+
'overview' => 'full',
|
|
71
|
+
'geometries' => 'polyline',
|
|
72
|
+
'steps' => 'false',
|
|
73
|
+
'annotations' => 'false',
|
|
74
|
+
]);
|
|
75
|
+
}
|
|
71
76
|
}
|
|
@@ -6,7 +6,6 @@ use Fleetbase\FleetOps\Tracking\Contracts\TrackingProviderInterface;
|
|
|
6
6
|
use Illuminate\Support\Arr;
|
|
7
7
|
use Illuminate\Support\Facades\Cache;
|
|
8
8
|
use Illuminate\Support\Facades\Log;
|
|
9
|
-
use Illuminate\Support\Str;
|
|
10
9
|
|
|
11
10
|
class TrackingProviderManager
|
|
12
11
|
{
|
|
@@ -33,7 +32,7 @@ class TrackingProviderManager
|
|
|
33
32
|
$result = $this->trackWithProviderCache($provider, $context, $options);
|
|
34
33
|
$result->warnings = array_values(array_unique([...$warnings, ...$result->warnings]));
|
|
35
34
|
|
|
36
|
-
if (
|
|
35
|
+
if (TrackingProviderRegistry::normalizeKey($result->provider) !== TrackingProviderRegistry::normalizeKey($options->provider)) {
|
|
37
36
|
$result->warnings[] = 'fallback_used';
|
|
38
37
|
}
|
|
39
38
|
|
|
@@ -62,7 +61,7 @@ class TrackingProviderManager
|
|
|
62
61
|
|
|
63
62
|
return collect([$provider, ...$fallbacks])
|
|
64
63
|
->filter()
|
|
65
|
-
->map(fn ($key) =>
|
|
64
|
+
->map(fn ($key) => TrackingProviderRegistry::normalizeKey($key))
|
|
66
65
|
->unique()
|
|
67
66
|
->values()
|
|
68
67
|
->all();
|