@fleetbase/fleetops-engine 0.6.68 → 0.6.70
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/RELEASE.md +44 -9
- package/addon/components/admin/telematics-settings.hbs +143 -0
- package/addon/components/admin/telematics-settings.js +145 -0
- package/addon/components/contact/form.hbs +13 -2
- package/addon/components/customer/details.hbs +17 -17
- package/addon/components/customer/form.hbs +13 -2
- package/addon/components/customer/form.js +0 -56
- package/addon/components/driver/details.hbs +13 -19
- package/addon/components/driver/form.hbs +20 -35
- package/addon/components/driver/form.js +0 -58
- package/addon/components/fuel-integration/hub.hbs +1 -1
- package/addon/components/layout/fleet-ops-sidebar.js +37 -17
- package/addon/components/map/leaflet-live-map.hbs +4 -242
- package/addon/components/map/leaflet-live-map.js +2 -1
- package/addon/components/map/marker-card/driver.hbs +57 -0
- package/addon/components/map/marker-card/driver.js +3 -0
- package/addon/components/map/marker-card/vehicle.hbs +78 -0
- package/addon/components/map/marker-card/vehicle.js +3 -0
- package/addon/components/modals/driver-form.hbs +2 -2
- package/addon/components/modals/reset-profile-credentials.hbs +23 -0
- package/addon/components/modals/reset-profile-credentials.js +70 -0
- package/addon/components/profile-identity-hint.hbs +13 -0
- package/addon/components/profile-identity-hint.js +49 -0
- package/addon/components/telematic/hub.hbs +1 -1
- package/addon/components/widget/live-fleet.hbs +8 -40
- package/addon/controllers/analytics/reports/index.js +5 -0
- package/addon/controllers/connectivity/devices/index.js +4 -0
- package/addon/controllers/connectivity/fuel-providers/index.js +6 -4
- package/addon/controllers/connectivity/sensors/index.js +4 -0
- package/addon/controllers/connectivity/telematics/index.js +4 -0
- package/addon/controllers/maintenance/equipment/index.js +11 -4
- package/addon/controllers/maintenance/inspection-forms/index.js +2 -2
- package/addon/controllers/maintenance/inspection-submissions/index.js +8 -2
- package/addon/controllers/maintenance/maintenances/index.js +4 -0
- package/addon/controllers/maintenance/parts/index.js +11 -4
- package/addon/controllers/maintenance/schedules/index.js +17 -4
- package/addon/controllers/maintenance/work-orders/index.js +11 -4
- package/addon/controllers/management/contacts/index.js +4 -0
- package/addon/controllers/management/drivers/index.js +8 -0
- package/addon/controllers/management/fleets/index.js +4 -0
- package/addon/controllers/management/fuel-reports/index.js +4 -0
- package/addon/controllers/management/fuel-transactions/index.js +9 -7
- package/addon/controllers/management/issues/index.js +4 -0
- package/addon/controllers/management/places/index.js +4 -0
- package/addon/controllers/management/vehicles/index.js +4 -0
- package/addon/controllers/management/vendors/index.js +4 -0
- package/addon/controllers/operations/orders/index/details.js +30 -1
- package/addon/controllers/operations/orders/index.js +7 -0
- package/addon/controllers/operations/service-rates/index.js +3 -0
- package/addon/controllers/settings/index.js +13 -0
- package/addon/controllers/settings/telematics.js +113 -0
- package/addon/extension.js +42 -8
- package/addon/routes/analytics/index.js +14 -1
- package/addon/routes/analytics/reports/index/details.js +1 -1
- package/addon/routes/analytics/reports/index/edit.js +1 -1
- package/addon/routes/analytics/reports/index/new.js +14 -1
- package/addon/routes/analytics/reports.js +14 -1
- package/addon/routes/connectivity/devices/index/new.js +14 -1
- package/addon/routes/connectivity/devices.js +14 -1
- package/addon/routes/connectivity/events.js +14 -1
- package/addon/routes/connectivity/fuel-providers/details/transactions.js +12 -0
- package/addon/routes/connectivity/fuel-providers/details.js +9 -0
- package/addon/routes/connectivity/fuel-providers/edit.js +9 -0
- package/addon/routes/connectivity/fuel-providers/new.js +14 -1
- package/addon/routes/connectivity/fuel-providers.js +14 -1
- package/addon/routes/connectivity/sensors/index/new.js +14 -1
- package/addon/routes/connectivity/sensors.js +14 -1
- package/addon/routes/connectivity/telematics/new.js +14 -1
- package/addon/routes/connectivity/telematics.js +14 -1
- package/addon/routes/connectivity/tracking.js +14 -1
- package/addon/routes/maintenance/equipment/index/details.js +2 -2
- package/addon/routes/maintenance/equipment/index/edit.js +2 -2
- package/addon/routes/maintenance/equipment/index/new.js +14 -1
- package/addon/routes/maintenance/equipment.js +14 -1
- package/addon/routes/maintenance/index.js +14 -1
- package/addon/routes/maintenance/inspection-forms/index/details.js +10 -1
- package/addon/routes/maintenance/inspection-forms/index/edit.js +10 -1
- package/addon/routes/maintenance/inspection-forms/index/new.js +14 -1
- package/addon/routes/maintenance/inspection-forms.js +14 -1
- package/addon/routes/maintenance/inspection-submissions/index/details.js +10 -1
- package/addon/routes/maintenance/inspection-submissions/index/edit.js +10 -1
- package/addon/routes/maintenance/inspection-submissions/index/new.js +14 -1
- package/addon/routes/maintenance/inspection-submissions.js +14 -1
- package/addon/routes/maintenance/maintenances/index/details.js +2 -2
- package/addon/routes/maintenance/maintenances/index/edit.js +2 -2
- package/addon/routes/maintenance/maintenances/index/new.js +14 -1
- package/addon/routes/maintenance/maintenances.js +14 -1
- package/addon/routes/maintenance/parts/index/details.js +2 -2
- package/addon/routes/maintenance/parts/index/edit.js +2 -2
- package/addon/routes/maintenance/parts/index/new.js +14 -1
- package/addon/routes/maintenance/parts.js +14 -1
- package/addon/routes/maintenance/schedules/index/details.js +2 -2
- package/addon/routes/maintenance/schedules/index/edit.js +2 -2
- package/addon/routes/maintenance/schedules/index/new.js +15 -1
- package/addon/routes/maintenance/schedules.js +15 -1
- package/addon/routes/maintenance/work-orders/index/details.js +2 -2
- package/addon/routes/maintenance/work-orders/index/edit.js +2 -2
- package/addon/routes/maintenance/work-orders/index/new.js +14 -1
- package/addon/routes/maintenance/work-orders.js +14 -1
- package/addon/routes/management/fuel-transactions/index/details.js +9 -0
- package/addon/routes/management/fuel-transactions.js +14 -1
- package/addon/routes/management/index.js +13 -0
- package/addon/routes/management/trailers.js +16 -0
- package/addon/routes/management/vendors/integrated/details.js +14 -1
- package/addon/routes/management/vendors/integrated/edit.js +14 -1
- package/addon/routes/management/vendors/integrated/new.js +14 -1
- package/addon/routes/management/vendors/integrated.js +14 -1
- package/addon/routes/operations/orders.js +40 -1
- package/addon/routes/operations/routes/index/details.js +14 -1
- package/addon/routes/operations/routes/index/new.js +13 -0
- package/addon/routes/operations/routes.js +14 -1
- package/addon/routes/operations/service-rates/index/new.js +11 -0
- package/addon/routes/operations/service-rates.js +14 -1
- package/addon/routes/settings/avatars.js +14 -1
- package/addon/routes/settings/custom-fields.js +14 -1
- package/addon/routes/settings/map.js +14 -1
- package/addon/routes/settings/notifications.js +11 -0
- package/addon/routes/settings/orchestrator.js +1 -1
- package/addon/routes/settings/payments/index.js +1 -1
- package/addon/routes/settings/routing.js +14 -1
- package/addon/routes/settings/scheduling.js +14 -1
- package/addon/routes/settings/telematics.js +21 -0
- package/addon/routes/virtual.js +11 -0
- package/addon/routes.js +1 -0
- package/addon/services/contact-actions.js +50 -89
- package/addon/services/driver-actions.js +98 -0
- package/addon/templates/settings/telematics.hbs +70 -0
- package/addon/utils/profile-login-actions.js +172 -0
- package/app/components/admin/telematics-settings.js +1 -0
- package/app/components/{modals/reset-customer-credentials.js → map/marker-card/driver.js} +1 -1
- package/app/components/map/marker-card/vehicle.js +1 -0
- package/app/components/modals/reset-profile-credentials.js +1 -0
- package/app/components/profile-identity-hint.js +1 -0
- package/app/controllers/settings/telematics.js +1 -0
- package/app/routes/settings/telematics.js +1 -0
- package/app/templates/settings/telematics.js +1 -0
- package/composer.json +2 -2
- package/docs/AFAQY.md +1 -1
- package/docs/TELEMATICS_QUEUES.md +1 -1
- package/docs/TELEMETRY_ARCHITECTURE.md +72 -1
- package/extension.json +1 -1
- package/package.json +3 -3
- package/scripts/pest-bootstrap.php +12 -0
- package/server/config/telemetry.php +12 -0
- package/server/migrations/2026_09_21_000001_convert_profile_only_users_to_managed_accounts.php +132 -0
- package/server/migrations/2026_09_23_000001_add_retention_index_to_device_events.php +40 -0
- package/server/migrations/2026_09_23_000002_add_retention_index_to_positions.php +40 -0
- package/server/migrations/2026_09_23_000003_add_retention_index_to_telematic_sync_runs.php +40 -0
- package/server/resources/views/mail/driver-credentials.blade.php +21 -0
- package/server/src/Auth/Schemas/FleetOps.php +104 -5
- package/server/src/Console/Commands/DrainTelematicInbox.php +3 -13
- package/server/src/Console/Commands/FixCustomerCompanies.php +1 -1
- package/server/src/Console/Commands/FixDriverCompanies.php +1 -1
- package/server/src/Console/Commands/ProcessOperationalAlerts.php +3 -3
- package/server/src/Console/Commands/PruneTelematicsData.php +318 -0
- package/server/src/Exceptions/ProfileIdentityConflictException.php +34 -0
- package/server/src/Http/Controllers/Api/v1/CustomerController.php +14 -0
- package/server/src/Http/Controllers/Api/v1/DriverController.php +56 -39
- package/server/src/Http/Controllers/Api/v1/OrchestrationController.php +9 -0
- package/server/src/Http/Controllers/FleetOpsController.php +21 -0
- package/server/src/Http/Controllers/Internal/v1/AnalyticsController.php +11 -0
- package/server/src/Http/Controllers/Internal/v1/ContactController.php +16 -17
- package/server/src/Http/Controllers/Internal/v1/CustomerController.php +54 -4
- package/server/src/Http/Controllers/Internal/v1/DeviceController.php +13 -0
- package/server/src/Http/Controllers/Internal/v1/DeviceEventController.php +11 -0
- package/server/src/Http/Controllers/Internal/v1/DriverController.php +204 -162
- package/server/src/Http/Controllers/Internal/v1/FleetOpsLookupController.php +47 -0
- package/server/src/Http/Controllers/Internal/v1/FuelProviderConnectionController.php +13 -0
- package/server/src/Http/Controllers/Internal/v1/FuelProviderTransactionController.php +15 -0
- package/server/src/Http/Controllers/Internal/v1/FuelReportController.php +9 -3
- package/server/src/Http/Controllers/Internal/v1/InspectionFormController.php +15 -0
- package/server/src/Http/Controllers/Internal/v1/LiveController.php +16 -0
- package/server/src/Http/Controllers/Internal/v1/MaintenanceController.php +15 -0
- package/server/src/Http/Controllers/Internal/v1/MaintenanceScheduleController.php +15 -0
- package/server/src/Http/Controllers/Internal/v1/ManifestController.php +15 -0
- package/server/src/Http/Controllers/Internal/v1/MetricsController.php +11 -0
- package/server/src/Http/Controllers/Internal/v1/NavigatorController.php +42 -1
- package/server/src/Http/Controllers/Internal/v1/OrchestrationController.php +12 -0
- package/server/src/Http/Controllers/Internal/v1/OrderController.php +178 -27
- package/server/src/Http/Controllers/Internal/v1/PaymentController.php +13 -0
- package/server/src/Http/Controllers/Internal/v1/RadarController.php +19 -0
- package/server/src/Http/Controllers/Internal/v1/ServiceAreaController.php +9 -3
- package/server/src/Http/Controllers/Internal/v1/SettingController.php +465 -14
- package/server/src/Http/Controllers/Internal/v1/TelematicController.php +21 -0
- package/server/src/Http/Controllers/Internal/v1/TrailerController.php +21 -0
- package/server/src/Http/Controllers/Internal/v1/VehicleController.php +21 -0
- package/server/src/Http/Controllers/Internal/v1/VendorController.php +17 -0
- package/server/src/Http/Controllers/Internal/v1/WorkOrderController.php +11 -0
- package/server/src/Http/Requests/CreateDriverRequest.php +6 -2
- package/server/src/Http/Requests/Internal/CreateDriverRequest.php +9 -18
- package/server/src/Http/Resources/v1/Contact.php +3 -0
- package/server/src/Http/Resources/v1/Driver.php +3 -0
- package/server/src/Jobs/DispatchTelematicsRetentionJobs.php +70 -0
- package/server/src/Jobs/PruneTelematicsDataJob.php +74 -0
- package/server/src/Listeners/NotifyDriverOnShiftChange.php +3 -3
- package/server/src/Mail/CustomerCredentialsMail.php +1 -1
- package/server/src/Mail/DriverCredentialsMail.php +55 -0
- package/server/src/Models/Contact.php +55 -90
- package/server/src/Models/Sensor.php +3 -5
- package/server/src/Observers/ContactObserver.php +2 -22
- package/server/src/Observers/DriverObserver.php +5 -6
- package/server/src/Orchestration/Engines/VroomOrchestrationEngine.php +9 -1
- package/server/src/Providers/FleetOpsServiceProvider.php +18 -0
- package/server/src/Support/Ai/Capabilities/AbstractFleetOpsAICapability.php +62 -5
- package/server/src/Support/Ai/Capabilities/AssetStatusCapability.php +24 -5
- package/server/src/Support/Ai/Capabilities/CreateOrderPreviewCapability.php +6 -2
- package/server/src/Support/Ai/Capabilities/OrderInsightsCapability.php +40 -7
- package/server/src/Support/Ai/Capabilities/SearchResourcesCapability.php +86 -24
- package/server/src/Support/Ai/FleetOpsAiConsoleCommands.php +122 -0
- package/server/src/Support/Ai/Tools/CreateOrderTool.php +86 -0
- package/server/src/Support/Ai/Tools/ImportOrdersTool.php +53 -0
- package/server/src/Support/Ai/Tools/OptimizeOrderRouteTool.php +70 -0
- package/server/src/Support/Ai/Tools/SearchResourcesTool.php +73 -0
- package/server/src/Support/Analytics/LiveFleet.php +18 -2
- package/server/src/Support/Authorization.php +103 -0
- package/server/src/Support/Database/TableIndexes.php +66 -0
- package/server/src/Support/OrderTracker.php +2 -2
- package/server/src/Support/ProfileAccountManager.php +405 -0
- package/server/src/Support/Reporting/FleetOpsReportSchema.php +476 -116
- package/server/src/Support/Telematics/Retention/RetentionPolicy.php +300 -0
- package/server/src/Support/Telematics/Retention/TelemetryActivity.php +40 -0
- package/server/src/Support/Telematics/TelematicService.php +12 -2
- package/server/src/Support/Telematics/Telemetry/Ingestor.php +4 -2
- package/server/src/Tracking/TrackingIntelligenceService.php +1 -1
- package/server/src/Tracking/TrackingOptions.php +2 -2
- package/server/src/Traits/AuthorizesMethods.php +37 -0
- package/server/src/routes.php +14 -1
- package/server/tests/AiOperationalQueryCapabilityTest.php +1 -0
- package/server/tests/AnalyticsRoutesTest.php +29 -2
- package/server/tests/ApiCustomerControllerContractsTest.php +21 -0
- package/server/tests/ApiDriverControllerContractsTest.php +102 -20
- package/server/tests/CommandContractsTest.php +4 -4
- package/server/tests/ControllerHelperContractsTest.php +3 -11
- package/server/tests/Feature/Http/AfaqyRealtimeIngestionTest.php +21 -1
- package/server/tests/Feature/Http/Api/DriverControllerAuthFlowsTest.php +36 -0
- package/server/tests/Feature/Http/Api/DriverControllerSessionHelpersTest.php +19 -6
- package/server/tests/Feature/Http/Api/ProfileOnlyUserConversionMigrationTest.php +201 -0
- package/server/tests/Feature/Http/Api/TelematicsRetentionIndexMigrationTest.php +115 -0
- package/server/tests/Feature/Http/Internal/ContactControllerEndpointsTest.php +6 -4
- package/server/tests/Feature/Http/Internal/CustomerControllerCredentialsTest.php +6 -2
- package/server/tests/Feature/Http/Internal/DriverControllerContractsTest.php +23 -0
- package/server/tests/Feature/Http/Internal/DriverControllerCreateRecordTest.php +42 -17
- package/server/tests/Feature/Http/Internal/DriverControllerExistingUserAdoptionTest.php +168 -277
- package/server/tests/Feature/Http/Internal/DriverControllerLoginManagementTest.php +716 -0
- package/server/tests/Feature/Http/Internal/OrderControllerContractsTest.php +10 -3
- package/server/tests/Feature/Http/Internal/OrderControllerImportFromFilesTest.php +18 -0
- package/server/tests/Feature/Http/Internal/OrderControllerTenantScopingTest.php +411 -0
- package/server/tests/Feature/Http/Internal/OrderControllerUpstreamNotFoundTest.php +8 -20
- package/server/tests/Feature/Http/Internal/SettingControllerHelpersTest.php +71 -0
- package/server/tests/Feature/Http/Internal/TelematicsStorageDeadlinesTest.php +119 -0
- package/server/tests/InternalCustomerControllerContractsTest.php +32 -1
- package/server/tests/InternalImportExportControllerContractsTest.php +5 -8
- package/server/tests/ModelAccessorContractsTest.php +82 -20
- package/server/tests/NavigatorControllerContractsTest.php +36 -4
- package/server/tests/NotificationAndMailContractsTest.php +31 -0
- package/server/tests/ObserverContractsTest.php +28 -3
- package/server/tests/OrchestratorConsumableApiTest.php +42 -0
- package/server/tests/ProviderContractsTest.php +10 -0
- package/server/tests/ReportSchemaContractsTest.php +120 -6
- package/server/tests/RequestContractsTest.php +19 -11
- package/server/tests/SettingControllerContractsTest.php +429 -18
- package/server/tests/SmallControllerContractsTest.php +8 -5
- package/server/tests/Support/PruneTelematicsDataProbe.php +55 -0
- package/server/tests/SupportJobAndAiCoverageTest.php +3 -3
- package/server/tests/TelematicControllerContractsTest.php +22 -4
- package/server/tests/Unit/Console/Commands/ProcessOperationalAlertsCommandTest.php +2 -2
- package/server/tests/Unit/Console/PruneTelematicsDataCommandTest.php +353 -0
- package/server/tests/Unit/Jobs/DispatchTelematicsRetentionJobsTest.php +114 -0
- package/server/tests/Unit/Jobs/PruneTelematicsDataJobTest.php +60 -0
- package/server/tests/Unit/Models/ContactCustomerUserTest.php +90 -14
- package/server/tests/Unit/Models/ContactTest.php +48 -5
- package/server/tests/Unit/Models/SensorTest.php +2 -2
- package/server/tests/Unit/Models/SmallModelSurfacesTest.php +31 -32
- package/server/tests/Unit/Observers/ObserverListenerSeamsTest.php +7 -2
- package/server/tests/Unit/Orchestration/VroomEngineTransportAndSettingsTest.php +20 -0
- package/server/tests/Unit/Providers/FleetOpsAiRegistrationTest.php +15 -2
- package/server/tests/Unit/Support/Ai/AssetStatusCapabilityQueriesTest.php +42 -0
- package/server/tests/Unit/Support/Ai/Capabilities/OrderInsightsCapabilityTest.php +19 -1
- package/server/tests/Unit/Support/Ai/Capabilities/SearchResourcesCapabilityTest.php +85 -1
- package/server/tests/Unit/Support/Ai/FleetOpsAiConsoleCommandsTest.php +31 -0
- package/server/tests/Unit/Support/Ai/Tools/FleetOpsAiToolsTest.php +246 -0
- package/server/tests/Unit/Support/AiCapabilityPermissionsTest.php +3 -3
- package/server/tests/Unit/Support/Analytics/LiveFleetTest.php +6 -0
- package/server/tests/Unit/Support/AuthorizationTest.php +142 -0
- package/server/tests/Unit/Support/MaintainableAndOperationalAlertsTest.php +12 -1
- package/server/tests/Unit/Support/MoreQuerySeamsTest.php +11 -2
- package/server/tests/Unit/Support/ProfileAccountManagerTest.php +643 -0
- package/server/tests/Unit/Support/Telematics/Retention/RetentionPolicyTest.php +190 -0
- package/server/tests/Unit/Support/Telematics/Retention/TelemetryActivityTest.php +68 -0
- package/server/tests/Unit/Tracking/TrackingOptionsCompanySettingsTest.php +109 -0
- package/translations/en-us.yaml +85 -2
- package/translations/uk-ua.yaml +3475 -0
- package/addon/components/modals/reset-customer-credentials.hbs +0 -18
- package/addon/components/modals/reset-customer-credentials.js +0 -55
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
namespace Fleetbase\FleetOps\Support\Ai\Tools;
|
|
4
|
+
|
|
5
|
+
use Fleetbase\Ai\Contracts\AIToolCapabilityInterface;
|
|
6
|
+
use Fleetbase\Ai\Models\AiTask;
|
|
7
|
+
use Fleetbase\Ai\Support\AiToolContext;
|
|
8
|
+
use Fleetbase\FleetOps\Support\Ai\Capabilities\SearchResourcesCapability;
|
|
9
|
+
use Illuminate\Support\Str;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Lets the model look up specific Fleet-Ops records by id, name, plate, email, or tracking number.
|
|
13
|
+
*/
|
|
14
|
+
class SearchResourcesTool extends SearchResourcesCapability implements AIToolCapabilityInterface
|
|
15
|
+
{
|
|
16
|
+
public const TYPES = ['orders', 'vehicles', 'drivers', 'work_orders', 'maintenances', 'devices', 'sensors', 'telematics'];
|
|
17
|
+
|
|
18
|
+
public function toolName(): string
|
|
19
|
+
{
|
|
20
|
+
return 'fleetops_search';
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public function toolDescription(): string
|
|
24
|
+
{
|
|
25
|
+
return 'Find specific Fleet-Ops records (orders, vehicles, drivers, work orders, maintenances, devices, sensors, telematics) by public id, internal id, tracking number, name, plate number, VIN, email, or phone. '
|
|
26
|
+
. 'Use it when the user refers to a particular record. For counts or status breakdowns use the counting tools instead. Returns at most 5 matches per type.';
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public function toolParameters(): array
|
|
30
|
+
{
|
|
31
|
+
return [
|
|
32
|
+
'type' => 'object',
|
|
33
|
+
'properties' => [
|
|
34
|
+
'query' => ['type' => 'string', 'description' => 'The identifier or name to look for, e.g. "order_yhkejdnzgz", "SBA1234Z", or "Jane Doe".'],
|
|
35
|
+
'types' => ['type' => 'array', 'items' => ['type' => 'string', 'enum' => static::TYPES], 'description' => 'Optional record types to search. Searches all types when omitted.'],
|
|
36
|
+
],
|
|
37
|
+
'required' => ['query'],
|
|
38
|
+
'additionalProperties' => false,
|
|
39
|
+
];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
public function availableFor(AiToolContext $context): bool
|
|
43
|
+
{
|
|
44
|
+
foreach ($this->permissions() as $permission) {
|
|
45
|
+
if ($context->audience->can($permission)) {
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
public function invoke(AiTask $task, array $arguments, AiToolContext $context): array
|
|
54
|
+
{
|
|
55
|
+
$query = trim((string) ($arguments['query'] ?? ''));
|
|
56
|
+
|
|
57
|
+
if (mb_strlen($query) < 2) {
|
|
58
|
+
return ['error' => 'Provide an identifier or name to search for.'];
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// The model sends an intentional query, so the whole phrase is searched along with any ids in it.
|
|
62
|
+
$terms = collect([Str::limit($query, 100, '')])
|
|
63
|
+
->merge($this->searchTerms($query))
|
|
64
|
+
->unique(fn ($term) => Str::lower($term))
|
|
65
|
+
->take(4)
|
|
66
|
+
->values()
|
|
67
|
+
->all();
|
|
68
|
+
|
|
69
|
+
$types = array_values(array_intersect((array) ($arguments['types'] ?? []), static::TYPES));
|
|
70
|
+
|
|
71
|
+
return $this->searchAll($terms, $types ?: null);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -2,10 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
namespace Fleetbase\FleetOps\Support\Analytics;
|
|
4
4
|
|
|
5
|
+
use Fleetbase\FleetOps\Http\Resources\v1\Index\Driver as DriverIndexResource;
|
|
6
|
+
use Fleetbase\FleetOps\Http\Resources\v1\Index\Vehicle as VehicleIndexResource;
|
|
5
7
|
use Fleetbase\FleetOps\Models\Driver;
|
|
6
8
|
use Fleetbase\FleetOps\Models\Order;
|
|
7
9
|
use Fleetbase\FleetOps\Models\Vehicle;
|
|
8
10
|
use Fleetbase\FleetOps\Support\Metrics\OrdersInProgressMetric;
|
|
11
|
+
use Illuminate\Http\Resources\Json\JsonResource;
|
|
9
12
|
|
|
10
13
|
/**
|
|
11
14
|
* Real-time fleet snapshot used as the initial-state payload for Live Fleet Map.
|
|
@@ -23,7 +26,8 @@ class LiveFleet extends AbstractAnalytics
|
|
|
23
26
|
|
|
24
27
|
// Driver.name is a virtual attribute backed by users.name — eager-load the
|
|
25
28
|
// user so the accessor resolves cleanly without a per-record query.
|
|
26
|
-
|
|
29
|
+
// The user and vehicle also feed each marker's card (see card()).
|
|
30
|
+
$drivers = Driver::with(['user', 'vehicle'])
|
|
27
31
|
->where('drivers.company_uuid', $companyUuid)
|
|
28
32
|
->whereNotNull('drivers.location')
|
|
29
33
|
->where(function ($q) {
|
|
@@ -33,7 +37,8 @@ class LiveFleet extends AbstractAnalytics
|
|
|
33
37
|
|
|
34
38
|
// Vehicles tracked independently of drivers (telematics-connected rigs may
|
|
35
39
|
// report position without an active driver session).
|
|
36
|
-
$vehicles = Vehicle::
|
|
40
|
+
$vehicles = Vehicle::with(['devices', 'driver', 'currentTrailers'])
|
|
41
|
+
->where('company_uuid', $companyUuid)
|
|
37
42
|
->whereNotNull('location')
|
|
38
43
|
->get();
|
|
39
44
|
|
|
@@ -79,6 +84,7 @@ class LiveFleet extends AbstractAnalytics
|
|
|
79
84
|
'lat' => $lat,
|
|
80
85
|
'lng' => $lng,
|
|
81
86
|
'updated_at' => $d->last_location_update_at,
|
|
87
|
+
'card' => $this->card(new DriverIndexResource($d)),
|
|
82
88
|
];
|
|
83
89
|
}
|
|
84
90
|
|
|
@@ -98,9 +104,19 @@ class LiveFleet extends AbstractAnalytics
|
|
|
98
104
|
'heading' => (float) ($v->heading ?? 0),
|
|
99
105
|
'lat' => $lat,
|
|
100
106
|
'lng' => $lng,
|
|
107
|
+
'card' => $this->card(new VehicleIndexResource($v)),
|
|
101
108
|
];
|
|
102
109
|
}
|
|
103
110
|
|
|
111
|
+
/**
|
|
112
|
+
* What the operational live map shows in a marker's popup and tooltip: the same index
|
|
113
|
+
* resource its live endpoints return, so the dashboard widget renders identical cards.
|
|
114
|
+
*/
|
|
115
|
+
private function card(JsonResource $resource): array
|
|
116
|
+
{
|
|
117
|
+
return $resource->resolve(request());
|
|
118
|
+
}
|
|
119
|
+
|
|
104
120
|
/**
|
|
105
121
|
* Pull [lat, lng] out of whatever shape the spatial accessor handed us.
|
|
106
122
|
* Supports Point objects, [lat, lng] arrays, and {lat, lng} hashes.
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
namespace Fleetbase\FleetOps\Support;
|
|
4
|
+
|
|
5
|
+
use Fleetbase\Models\Permission;
|
|
6
|
+
use Fleetbase\Support\Auth;
|
|
7
|
+
use Illuminate\Http\Exceptions\HttpResponseException;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Explicit Fleet-Ops permission checks for endpoints that AuthorizationGuard
|
|
11
|
+
* cannot resolve correctly on its own: controllers that are not resource
|
|
12
|
+
* controllers, and custom actions whose method name does not match a schema
|
|
13
|
+
* action (for example `bulkDispatch`, which the guard maps to `create order`).
|
|
14
|
+
*
|
|
15
|
+
* Mirrors the guard's semantics:
|
|
16
|
+
* - platform admins always pass;
|
|
17
|
+
* - a permission is granted by its exact name, `fleet-ops * {resource}` or `fleet-ops *`;
|
|
18
|
+
* - while the resource has no permission rows at all (the schema has not been
|
|
19
|
+
* seeded yet) the check passes, exactly like an unguarded resource.
|
|
20
|
+
*
|
|
21
|
+
* Methods that call this must carry `#[SkipAuthorizationCheck]` so the guard
|
|
22
|
+
* does not also demand its own (wrong) permission.
|
|
23
|
+
*/
|
|
24
|
+
class Authorization
|
|
25
|
+
{
|
|
26
|
+
public const SERVICE = 'fleet-ops';
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Abort with a 401 JSON response unless the user holds at least one of the permissions.
|
|
30
|
+
*
|
|
31
|
+
* @param string ...$permissions Short form `{action} {resource}`, e.g. `dispatch order`
|
|
32
|
+
*
|
|
33
|
+
* @throws HttpResponseException
|
|
34
|
+
*/
|
|
35
|
+
public static function authorize(string ...$permissions): void
|
|
36
|
+
{
|
|
37
|
+
if (static::canAny(...$permissions)) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
throw new HttpResponseException(response()->json(['errors' => ['User is not authorized to ' . $permissions[0]]], 401));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Abort with a 401 JSON response unless the current user is a platform administrator.
|
|
46
|
+
*
|
|
47
|
+
* @throws HttpResponseException
|
|
48
|
+
*/
|
|
49
|
+
public static function authorizeAdmin(): void
|
|
50
|
+
{
|
|
51
|
+
$user = static::user();
|
|
52
|
+
if ($user && $user->isAdmin()) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
throw new HttpResponseException(response()->json(['errors' => ['This action requires a system administrator']], 401));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
public static function canAny(string ...$permissions): bool
|
|
60
|
+
{
|
|
61
|
+
$user = static::user();
|
|
62
|
+
if (!$user) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if ($user->isAdmin()) {
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
foreach ($permissions as $permission) {
|
|
71
|
+
if (static::can($permission)) {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
public static function can(string $permission): bool
|
|
80
|
+
{
|
|
81
|
+
[$action, $resource] = explode(' ', $permission, 2);
|
|
82
|
+
|
|
83
|
+
// Same test as Auth::isResourceGuarded(): no permission rows for the resource yet.
|
|
84
|
+
if (!Permission::where('name', 'like', static::SERVICE . ' % ' . $resource)->exists()) {
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
try {
|
|
89
|
+
return Auth::can(static::SERVICE . " {$action} {$resource}");
|
|
90
|
+
} catch (\Throwable $e) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
protected static function user()
|
|
96
|
+
{
|
|
97
|
+
try {
|
|
98
|
+
return Auth::getUserFromSession();
|
|
99
|
+
} catch (\Throwable $e) {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
namespace Fleetbase\FleetOps\Support\Database;
|
|
4
|
+
|
|
5
|
+
use Illuminate\Support\Facades\Schema;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Inspect table indexes without Schema::getIndexes, which is absent in the
|
|
9
|
+
* Laravel versions this package supports. Fleet-Ops deploys on MySQL and runs
|
|
10
|
+
* its migration tests on SQLite.
|
|
11
|
+
*/
|
|
12
|
+
final class TableIndexes
|
|
13
|
+
{
|
|
14
|
+
/**
|
|
15
|
+
* @return array<string, string[]> index name => ordered column names
|
|
16
|
+
*/
|
|
17
|
+
public static function for(string $table): array
|
|
18
|
+
{
|
|
19
|
+
$connection = Schema::getConnection();
|
|
20
|
+
$prefixed = $connection->getTablePrefix() . $table;
|
|
21
|
+
$indexes = [];
|
|
22
|
+
|
|
23
|
+
if ($connection instanceof \Illuminate\Database\SQLiteConnection || $connection->getDriverName() === 'sqlite') {
|
|
24
|
+
$quoted = str_replace('"', '""', $prefixed);
|
|
25
|
+
foreach ($connection->select('PRAGMA index_list("' . $quoted . '")') as $index) {
|
|
26
|
+
$name = str_replace('"', '""', $index->name);
|
|
27
|
+
$columns = $connection->select('PRAGMA index_info("' . $name . '")');
|
|
28
|
+
usort($columns, fn ($a, $b) => $a->seqno <=> $b->seqno);
|
|
29
|
+
$indexes[$index->name] = array_column($columns, 'name');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return $indexes;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// @codeCoverageIgnoreStart
|
|
36
|
+
if ($connection->getDriverName() !== 'mysql') {
|
|
37
|
+
throw new \RuntimeException('Index inspection requires MySQL or SQLite.');
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
$quoted = str_replace('`', '``', $prefixed);
|
|
41
|
+
foreach ($connection->select('SHOW INDEX FROM `' . $quoted . '`') as $index) {
|
|
42
|
+
$indexes[$index->Key_name][(int) $index->Seq_in_index - 1] = $index->Column_name;
|
|
43
|
+
}
|
|
44
|
+
foreach ($indexes as &$columns) {
|
|
45
|
+
ksort($columns);
|
|
46
|
+
$columns = array_values($columns);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return $indexes;
|
|
50
|
+
// @codeCoverageIgnoreEnd
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Whether any index already leads with exactly these columns, in order.
|
|
55
|
+
*/
|
|
56
|
+
public static function covers(string $table, array $columns): bool
|
|
57
|
+
{
|
|
58
|
+
foreach (self::for($table) as $indexed) {
|
|
59
|
+
if (array_slice($indexed, 0, count($columns)) === $columns) {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -14,11 +14,11 @@ class OrderTracker
|
|
|
14
14
|
|
|
15
15
|
public function eta(array $options = []): array
|
|
16
16
|
{
|
|
17
|
-
return app(TrackingIntelligenceService::class)->eta($this->order, TrackingOptions::fromArray($options));
|
|
17
|
+
return app(TrackingIntelligenceService::class)->eta($this->order, TrackingOptions::fromArray($options, $this->order->company_uuid));
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
public function toArray(array $options = []): array
|
|
21
21
|
{
|
|
22
|
-
return app(TrackingIntelligenceService::class)->track($this->order, TrackingOptions::fromArray($options));
|
|
22
|
+
return app(TrackingIntelligenceService::class)->track($this->order, TrackingOptions::fromArray($options, $this->order->company_uuid));
|
|
23
23
|
}
|
|
24
24
|
}
|