@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
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;
|
|
4
4
|
|
|
5
|
+
use Fleetbase\Attributes\SkipAuthorizationCheck;
|
|
5
6
|
use Fleetbase\FleetOps\Exceptions\DeviceAlreadyAttachedException;
|
|
6
7
|
use Fleetbase\FleetOps\Exports\VehicleExport;
|
|
7
8
|
use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
|
|
@@ -25,6 +26,20 @@ use Maatwebsite\Excel\Facades\Excel;
|
|
|
25
26
|
|
|
26
27
|
class VehicleController extends FleetOpsController
|
|
27
28
|
{
|
|
29
|
+
/**
|
|
30
|
+
* Permissions for methods AuthorizationGuard cannot map to a schema action (see FleetOpsController).
|
|
31
|
+
*
|
|
32
|
+
* @var array<string, string|string[]>
|
|
33
|
+
*/
|
|
34
|
+
protected array $methodPermissions = [
|
|
35
|
+
'unassignDriver' => 'assign-driver-for vehicle',
|
|
36
|
+
'unassignOrders' => 'update vehicle',
|
|
37
|
+
'attachDevice' => 'update vehicle',
|
|
38
|
+
'detachDevice' => 'update vehicle',
|
|
39
|
+
'attachEquipment' => 'update vehicle',
|
|
40
|
+
'detachEquipment' => 'update vehicle',
|
|
41
|
+
];
|
|
42
|
+
|
|
28
43
|
/**
|
|
29
44
|
* The resource to query.
|
|
30
45
|
*
|
|
@@ -111,6 +126,7 @@ class VehicleController extends FleetOpsController
|
|
|
111
126
|
]);
|
|
112
127
|
}
|
|
113
128
|
|
|
129
|
+
#[SkipAuthorizationCheck]
|
|
114
130
|
public function unassignDriver(string $id): JsonResponse
|
|
115
131
|
{
|
|
116
132
|
$vehicle = $this->findVehicle($id);
|
|
@@ -143,6 +159,7 @@ class VehicleController extends FleetOpsController
|
|
|
143
159
|
]);
|
|
144
160
|
}
|
|
145
161
|
|
|
162
|
+
#[SkipAuthorizationCheck]
|
|
146
163
|
public function unassignOrders(Request $request, string $id): JsonResponse
|
|
147
164
|
{
|
|
148
165
|
$request->validate([
|
|
@@ -179,6 +196,7 @@ class VehicleController extends FleetOpsController
|
|
|
179
196
|
]);
|
|
180
197
|
}
|
|
181
198
|
|
|
199
|
+
#[SkipAuthorizationCheck]
|
|
182
200
|
public function attachDevice(Request $request, string $id): JsonResponse
|
|
183
201
|
{
|
|
184
202
|
$request->validate(['device' => 'required|string']);
|
|
@@ -219,6 +237,7 @@ class VehicleController extends FleetOpsController
|
|
|
219
237
|
]);
|
|
220
238
|
}
|
|
221
239
|
|
|
240
|
+
#[SkipAuthorizationCheck]
|
|
222
241
|
public function detachDevice(Request $request, string $id): JsonResponse
|
|
223
242
|
{
|
|
224
243
|
$request->validate(['device' => 'required|string']);
|
|
@@ -265,6 +284,7 @@ class VehicleController extends FleetOpsController
|
|
|
265
284
|
* Attach equipment to the vehicle. Equipment can only be equipped to one asset at a
|
|
266
285
|
* time, so attaching moves it from any previous vehicle or trailer.
|
|
267
286
|
*/
|
|
287
|
+
#[SkipAuthorizationCheck]
|
|
268
288
|
public function attachEquipment(Request $request, string $id): JsonResponse
|
|
269
289
|
{
|
|
270
290
|
$request->validate(['equipment' => 'required|string']);
|
|
@@ -292,6 +312,7 @@ class VehicleController extends FleetOpsController
|
|
|
292
312
|
]);
|
|
293
313
|
}
|
|
294
314
|
|
|
315
|
+
#[SkipAuthorizationCheck]
|
|
295
316
|
public function detachEquipment(Request $request, string $id): JsonResponse
|
|
296
317
|
{
|
|
297
318
|
$request->validate(['equipment' => 'required|string']);
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;
|
|
4
4
|
|
|
5
|
+
use Fleetbase\Attributes\SkipAuthorizationCheck;
|
|
5
6
|
use Fleetbase\FleetOps\Exports\VendorExport;
|
|
6
7
|
use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
|
|
7
8
|
use Fleetbase\FleetOps\Http\Resources\v1\Contact as ContactResource;
|
|
@@ -19,6 +20,18 @@ use Maatwebsite\Excel\Facades\Excel;
|
|
|
19
20
|
|
|
20
21
|
class VendorController extends FleetOpsController
|
|
21
22
|
{
|
|
23
|
+
/**
|
|
24
|
+
* Permissions for methods AuthorizationGuard cannot map to a schema action (see FleetOpsController).
|
|
25
|
+
*
|
|
26
|
+
* @var array<string, string|string[]>
|
|
27
|
+
*/
|
|
28
|
+
protected array $methodPermissions = [
|
|
29
|
+
'assignDriver' => 'update vendor',
|
|
30
|
+
'removeDriver' => 'update vendor',
|
|
31
|
+
'addVendorPersonnel' => 'update vendor',
|
|
32
|
+
'removeVendorPersonnel' => 'update vendor',
|
|
33
|
+
];
|
|
34
|
+
|
|
22
35
|
/**
|
|
23
36
|
* The resource to query.
|
|
24
37
|
*
|
|
@@ -128,6 +141,7 @@ class VendorController extends FleetOpsController
|
|
|
128
141
|
*
|
|
129
142
|
* @return \Illuminate\Http\Response
|
|
130
143
|
*/
|
|
144
|
+
#[SkipAuthorizationCheck]
|
|
131
145
|
public function assignDriver(string $id, Request $request)
|
|
132
146
|
{
|
|
133
147
|
// Validate only param
|
|
@@ -160,6 +174,7 @@ class VendorController extends FleetOpsController
|
|
|
160
174
|
*
|
|
161
175
|
* @return \Illuminate\Http\Response
|
|
162
176
|
*/
|
|
177
|
+
#[SkipAuthorizationCheck]
|
|
163
178
|
public function removeDriver(string $id, Request $request)
|
|
164
179
|
{
|
|
165
180
|
// Validate only param
|
|
@@ -197,6 +212,7 @@ class VendorController extends FleetOpsController
|
|
|
197
212
|
return response()->json(['personnels' => $personnels->values()]);
|
|
198
213
|
}
|
|
199
214
|
|
|
215
|
+
#[SkipAuthorizationCheck]
|
|
200
216
|
public function addVendorPersonnel(Request $request, string $vendorId)
|
|
201
217
|
{
|
|
202
218
|
$vendor = $this->findVendorByIdOrFail($vendorId);
|
|
@@ -220,6 +236,7 @@ class VendorController extends FleetOpsController
|
|
|
220
236
|
]);
|
|
221
237
|
}
|
|
222
238
|
|
|
239
|
+
#[SkipAuthorizationCheck]
|
|
223
240
|
public function removeVendorPersonnel(string $vendorId, string $contactId)
|
|
224
241
|
{
|
|
225
242
|
$vendor = $this->findVendorByIdOrFail($vendorId);
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
namespace Fleetbase\FleetOps\Http\Controllers\Internal\v1;
|
|
4
4
|
|
|
5
|
+
use Fleetbase\Attributes\SkipAuthorizationCheck;
|
|
5
6
|
use Fleetbase\FleetOps\Exports\WorkOrderExport;
|
|
6
7
|
use Fleetbase\FleetOps\Http\Controllers\FleetOpsController;
|
|
7
8
|
use Fleetbase\FleetOps\Imports\WorkOrderImport;
|
|
@@ -16,6 +17,15 @@ use Maatwebsite\Excel\Facades\Excel;
|
|
|
16
17
|
|
|
17
18
|
class WorkOrderController extends FleetOpsController
|
|
18
19
|
{
|
|
20
|
+
/**
|
|
21
|
+
* Permissions for methods AuthorizationGuard cannot map to a schema action (see FleetOpsController).
|
|
22
|
+
*
|
|
23
|
+
* @var array<string, string|string[]>
|
|
24
|
+
*/
|
|
25
|
+
protected array $methodPermissions = [
|
|
26
|
+
'sendEmail' => 'update work-order',
|
|
27
|
+
];
|
|
28
|
+
|
|
19
29
|
/**
|
|
20
30
|
* The resource to query.
|
|
21
31
|
*
|
|
@@ -80,6 +90,7 @@ class WorkOrderController extends FleetOpsController
|
|
|
80
90
|
* Send a work order email to the assigned vendor.
|
|
81
91
|
* POST /work-orders/{id}/send.
|
|
82
92
|
*/
|
|
93
|
+
#[SkipAuthorizationCheck]
|
|
83
94
|
public function sendEmail(string $id): JsonResponse
|
|
84
95
|
{
|
|
85
96
|
$workOrder = $this->workOrderForEmail($id);
|
|
@@ -41,9 +41,13 @@ class CreateDriverRequest extends FleetbaseRequest
|
|
|
41
41
|
* value later. Both are still validated and still unique when they
|
|
42
42
|
* are supplied; a driver created without them simply cannot sign in
|
|
43
43
|
* to Navigator until credentials are added.
|
|
44
|
+
*
|
|
45
|
+
* On create, availability is decided by ProfileAccountManager: a team
|
|
46
|
+
* member of the company with the email or phone is linked to the new
|
|
47
|
+
* driver instead of being rejected as a duplicate.
|
|
44
48
|
*/
|
|
45
|
-
'email' => ['nullable', Rule::when($this->filled('email'), ['email']), $this->uniqueAmongUsers()],
|
|
46
|
-
'phone' => ['nullable', 'string', $this->uniqueAmongUsers()],
|
|
49
|
+
'email' => ['nullable', Rule::when($this->filled('email'), ['email']), Rule::when(!$isCreating, [$this->uniqueAmongUsers()])],
|
|
50
|
+
'phone' => ['nullable', 'string', Rule::when(!$isCreating, [$this->uniqueAmongUsers()])],
|
|
47
51
|
'password' => 'nullable|string',
|
|
48
52
|
'timezone' => 'nullable|string|max:64',
|
|
49
53
|
|
|
@@ -23,22 +23,17 @@ class CreateDriverRequest extends CreateDriverApiRequest
|
|
|
23
23
|
*/
|
|
24
24
|
public function rules(): array
|
|
25
25
|
{
|
|
26
|
-
$isCreating
|
|
27
|
-
$isCreatingWithUser = $this->filled('driver.user_uuid');
|
|
28
|
-
$shouldValidateUserAttributes = $isCreating && !$isCreatingWithUser;
|
|
26
|
+
$isCreating = $this->isMethod('POST');
|
|
29
27
|
|
|
30
28
|
return [
|
|
31
|
-
//
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
],
|
|
38
|
-
'phone' => [
|
|
39
|
-
Rule::requiredIf($shouldValidateUserAttributes),
|
|
40
|
-
Rule::when($shouldValidateUserAttributes, [Rule::unique('users')->whereNull('deleted_at')]),
|
|
41
|
-
],
|
|
29
|
+
// The driver profile manages its login account: name, email and phone
|
|
30
|
+
// are proxied to it. Email/phone availability is checked against the
|
|
31
|
+
// account the profile resolves to (see ProfileAccountManager), because a
|
|
32
|
+
// team member of the organization with the same email or phone is linked
|
|
33
|
+
// rather than rejected as a duplicate.
|
|
34
|
+
'name' => [Rule::requiredIf($isCreating), 'nullable', 'string', 'max:255'],
|
|
35
|
+
'email' => ['nullable', Rule::when($this->filled('email'), ['email'])],
|
|
36
|
+
'phone' => ['nullable', 'string'],
|
|
42
37
|
|
|
43
38
|
// Optional fields
|
|
44
39
|
'password' => 'nullable|string|min:8',
|
|
@@ -84,11 +79,7 @@ class CreateDriverRequest extends CreateDriverApiRequest
|
|
|
84
79
|
{
|
|
85
80
|
return [
|
|
86
81
|
'name.required' => 'Driver name is required.',
|
|
87
|
-
'email.required' => 'Email address is required.',
|
|
88
82
|
'email.email' => 'Please provide a valid email address.',
|
|
89
|
-
'email.unique' => 'This email address is already registered.',
|
|
90
|
-
'phone.required' => 'Phone number is required.',
|
|
91
|
-
'phone.unique' => 'This phone number is already registered.',
|
|
92
83
|
'password.min' => 'Password must be at least 8 characters.',
|
|
93
84
|
];
|
|
94
85
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
namespace Fleetbase\FleetOps\Http\Resources\v1;
|
|
4
4
|
|
|
5
|
+
use Fleetbase\FleetOps\Support\ProfileAccountManager;
|
|
5
6
|
use Fleetbase\FleetOps\Support\Utils;
|
|
6
7
|
use Fleetbase\Http\Resources\FleetbaseResource;
|
|
7
8
|
use Fleetbase\Http\Resources\User;
|
|
@@ -40,6 +41,8 @@ class Contact extends FleetbaseResource
|
|
|
40
41
|
'places' => $this->whenLoaded('places', fn () => Place::collection($this->places)->without('owner')),
|
|
41
42
|
'user' => $this->when(Http::isInternalRequest(), fn () => new User($this->user), fn () => $this->user ? $this->user->public_id : null),
|
|
42
43
|
'address' => $this->when(Http::isInternalRequest(), data_get($this, 'place.address')),
|
|
44
|
+
'is_staff_linked' => $this->when(Http::isInternalRequest(), fn () => ProfileAccountManager::isStaffAccount($this->user)),
|
|
45
|
+
'login_status' => $this->when(Http::isInternalRequest(), fn () => data_get($this, 'user.status')),
|
|
43
46
|
'address_street' => $this->when(Http::isInternalRequest(), data_get($this, 'place.street1')),
|
|
44
47
|
'type' => $this->type ?? null,
|
|
45
48
|
'customer_type' => $this->when(isset($this->customer_type), Utils::toEmberResourceType($this->customer_type)),
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
namespace Fleetbase\FleetOps\Http\Resources\v1;
|
|
4
4
|
|
|
5
|
+
use Fleetbase\FleetOps\Support\ProfileAccountManager;
|
|
5
6
|
use Fleetbase\FleetOps\Support\Utils;
|
|
6
7
|
use Fleetbase\Http\Resources\FleetbaseResource;
|
|
7
8
|
use Fleetbase\Http\Resources\FleetbaseResourceCollection;
|
|
@@ -32,6 +33,8 @@ class Driver extends FleetbaseResource
|
|
|
32
33
|
'public_id' => $this->when(Http::isInternalRequest(), $this->public_id),
|
|
33
34
|
'user' => $this->when(Http::isPublicRequest(), fn () => $this->user ? $this->user->public_id : null, new User($this->user)),
|
|
34
35
|
'internal_id' => $this->internal_id,
|
|
36
|
+
'is_staff_linked' => $this->when(Http::isInternalRequest(), fn () => ProfileAccountManager::isStaffAccount($this->user)),
|
|
37
|
+
'login_status' => $this->when(Http::isInternalRequest(), fn () => data_get($this, 'user.status')),
|
|
35
38
|
'company' => $this->when(Http::isPublicRequest(), fn () => $this->company ? $this->company->public_id : null),
|
|
36
39
|
'company_name' => $this->when(Http::isPublicRequest(), fn () => $this->company ? $this->company->name : null),
|
|
37
40
|
'name' => $this->name,
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
namespace Fleetbase\FleetOps\Jobs;
|
|
4
|
+
|
|
5
|
+
use Fleetbase\FleetOps\Support\Telematics\Telemetry\Queue;
|
|
6
|
+
use Illuminate\Bus\Queueable;
|
|
7
|
+
use Illuminate\Contracts\Queue\ShouldBeUnique;
|
|
8
|
+
use Illuminate\Contracts\Queue\ShouldQueue;
|
|
9
|
+
use Illuminate\Foundation\Bus\Dispatchable;
|
|
10
|
+
use Illuminate\Queue\InteractsWithQueue;
|
|
11
|
+
use Illuminate\Support\Collection;
|
|
12
|
+
use Illuminate\Support\Facades\DB;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Fan out system-wide cleanup in small pages, without a session or membership scope.
|
|
16
|
+
* Each company has its own bounded prune job so one large backlog cannot prevent
|
|
17
|
+
* other organizations from being processed within a shared worker timeout.
|
|
18
|
+
*/
|
|
19
|
+
class DispatchTelematicsRetentionJobs implements ShouldQueue, ShouldBeUnique
|
|
20
|
+
{
|
|
21
|
+
use Dispatchable;
|
|
22
|
+
use InteractsWithQueue;
|
|
23
|
+
use Queueable;
|
|
24
|
+
|
|
25
|
+
public const PAGE_SIZE = 100;
|
|
26
|
+
|
|
27
|
+
public int $uniqueFor = 900;
|
|
28
|
+
public int $tries = 3;
|
|
29
|
+
public int $timeout = 60;
|
|
30
|
+
|
|
31
|
+
public function __construct(public int $afterCompanyId = 0, public int $maxBatches = 200)
|
|
32
|
+
{
|
|
33
|
+
$this->onQueue(config('telematics.telemetry.ingestion_queue', 'default'));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
public function uniqueId(): string
|
|
37
|
+
{
|
|
38
|
+
return 'after-company:' . $this->afterCompanyId;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
public function handle(): void
|
|
42
|
+
{
|
|
43
|
+
$companies = $this->companies();
|
|
44
|
+
foreach ($companies as $company) {
|
|
45
|
+
$this->queueJob(new PruneTelematicsDataJob($company->uuid, $this->maxBatches));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if ($companies->count() === self::PAGE_SIZE) {
|
|
49
|
+
$this->queueJob(new self((int) $companies->last()->id, $this->maxBatches));
|
|
50
|
+
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
$this->queueJob(new PruneTelematicsDataJob(null, $this->maxBatches, true));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
protected function companies(): Collection
|
|
58
|
+
{
|
|
59
|
+
return DB::table('companies')
|
|
60
|
+
->where('id', '>', $this->afterCompanyId)
|
|
61
|
+
->orderBy('id')
|
|
62
|
+
->limit(self::PAGE_SIZE)
|
|
63
|
+
->get(['id', 'uuid']);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
protected function queueJob(ShouldBeUnique $job): void
|
|
67
|
+
{
|
|
68
|
+
Queue::dispatch($job);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
namespace Fleetbase\FleetOps\Jobs;
|
|
4
|
+
|
|
5
|
+
use Fleetbase\FleetOps\Console\Commands\PruneTelematicsData;
|
|
6
|
+
use Illuminate\Bus\Queueable;
|
|
7
|
+
use Illuminate\Contracts\Queue\ShouldBeUnique;
|
|
8
|
+
use Illuminate\Contracts\Queue\ShouldQueue;
|
|
9
|
+
use Illuminate\Foundation\Bus\Dispatchable;
|
|
10
|
+
use Illuminate\Queue\InteractsWithQueue;
|
|
11
|
+
use Symfony\Component\Console\Input\ArrayInput;
|
|
12
|
+
use Symfony\Component\Console\Output\BufferedOutput;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Runs a bounded telematics prune for one company or orphaned data.
|
|
16
|
+
*
|
|
17
|
+
* The command is executed directly rather than through the console kernel so a
|
|
18
|
+
* worker started before this package version can still run it.
|
|
19
|
+
*/
|
|
20
|
+
class PruneTelematicsDataJob implements ShouldQueue, ShouldBeUnique
|
|
21
|
+
{
|
|
22
|
+
use Dispatchable;
|
|
23
|
+
use InteractsWithQueue;
|
|
24
|
+
use Queueable;
|
|
25
|
+
|
|
26
|
+
public int $uniqueFor = 900;
|
|
27
|
+
public int $tries = 1;
|
|
28
|
+
// Finish or fail before Laravel's baseline Redis retry_after of 90 seconds.
|
|
29
|
+
public int $timeout = 80;
|
|
30
|
+
public bool $failOnTimeout = true;
|
|
31
|
+
public bool $orphansOnly = false;
|
|
32
|
+
|
|
33
|
+
public function __construct(public ?string $companyUuid = null, public int $maxBatches = 200, bool $orphansOnly = false)
|
|
34
|
+
{
|
|
35
|
+
$this->orphansOnly = $orphansOnly;
|
|
36
|
+
$this->onQueue(config('telematics.telemetry.ingestion_queue', 'default'));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
public function uniqueId(): string
|
|
40
|
+
{
|
|
41
|
+
return $this->orphansOnly ? 'orphans' : ($this->companyUuid ?? 'all');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @return array<string, mixed>
|
|
46
|
+
*/
|
|
47
|
+
public function parameters(): array
|
|
48
|
+
{
|
|
49
|
+
$parameters = ['--no-lock' => true, '--max-batches' => $this->maxBatches];
|
|
50
|
+
if ($this->companyUuid) {
|
|
51
|
+
$parameters['--company'] = $this->companyUuid;
|
|
52
|
+
}
|
|
53
|
+
if ($this->orphansOnly) {
|
|
54
|
+
$parameters['--orphans-only'] = true;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return $parameters;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
public function handle(): void
|
|
61
|
+
{
|
|
62
|
+
$command = $this->command();
|
|
63
|
+
$command->setLaravel(app());
|
|
64
|
+
$exitCode = $command->run(new ArrayInput($this->parameters()), new BufferedOutput());
|
|
65
|
+
if ($exitCode !== PruneTelematicsData::SUCCESS) {
|
|
66
|
+
throw new \RuntimeException('Telematics cleanup failed with exit code ' . $exitCode . '.');
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
protected function command(): PruneTelematicsData
|
|
71
|
+
{
|
|
72
|
+
return app(PruneTelematicsData::class);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -48,7 +48,7 @@ class NotifyDriverOnShiftChange implements ShouldQueue
|
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
// Check the company-level scheduling setting
|
|
51
|
-
$settings = $this->getSchedulingSettings();
|
|
51
|
+
$settings = $this->getSchedulingSettings($schedule->company_uuid);
|
|
52
52
|
$shouldNotify = (bool) data_get($settings, 'notify_drivers_on_shift_change', false);
|
|
53
53
|
if (!$shouldNotify) {
|
|
54
54
|
return;
|
|
@@ -66,9 +66,9 @@ class NotifyDriverOnShiftChange implements ShouldQueue
|
|
|
66
66
|
return $scheduleItem->schedule()->with('subject')->first();
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
-
protected function getSchedulingSettings(): array
|
|
69
|
+
protected function getSchedulingSettings(?string $companyUuid): array
|
|
70
70
|
{
|
|
71
|
-
return Setting::
|
|
71
|
+
return Setting::lookupForCompany($companyUuid, 'fleet-ops.scheduling-settings', []);
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
protected function isCreatedEvent(object $event): bool
|
|
@@ -72,7 +72,7 @@ class CustomerCredentialsMail extends Mailable
|
|
|
72
72
|
*/
|
|
73
73
|
private function getCustomerPortalAccessUrl(): string
|
|
74
74
|
{
|
|
75
|
-
$customerPortalConfig = Setting::
|
|
75
|
+
$customerPortalConfig = Setting::lookupForCompany($this->customer->company_uuid, 'customer-portal-config');
|
|
76
76
|
$accessUrlSlug = data_get($customerPortalConfig, 'accessUrlSlug', 'customer-portal');
|
|
77
77
|
|
|
78
78
|
return Utils::consoleUrl($accessUrlSlug ?: 'customer-portal');
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
namespace Fleetbase\FleetOps\Mail;
|
|
4
|
+
|
|
5
|
+
use Fleetbase\FleetOps\Models\Driver;
|
|
6
|
+
use Fleetbase\Models\User;
|
|
7
|
+
use Illuminate\Bus\Queueable;
|
|
8
|
+
use Illuminate\Mail\Mailable;
|
|
9
|
+
use Illuminate\Mail\Mailables\Content;
|
|
10
|
+
use Illuminate\Mail\Mailables\Envelope;
|
|
11
|
+
use Illuminate\Queue\SerializesModels;
|
|
12
|
+
|
|
13
|
+
class DriverCredentialsMail extends Mailable
|
|
14
|
+
{
|
|
15
|
+
use Queueable;
|
|
16
|
+
use SerializesModels;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Create a new message instance.
|
|
20
|
+
*/
|
|
21
|
+
public function __construct(private string $plaintextPassword, private Driver $driver, private User $user)
|
|
22
|
+
{
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Get the message envelope.
|
|
27
|
+
*/
|
|
28
|
+
public function envelope(): Envelope
|
|
29
|
+
{
|
|
30
|
+
$this->driver->loadMissing('company');
|
|
31
|
+
|
|
32
|
+
return new Envelope(
|
|
33
|
+
subject: 'Your ' . ($this->driver->company?->name ?? config('app.name')) . ' driver sign-in details',
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Get the message content definition.
|
|
39
|
+
*/
|
|
40
|
+
public function content(): Content
|
|
41
|
+
{
|
|
42
|
+
$this->driver->loadMissing('company');
|
|
43
|
+
|
|
44
|
+
return new Content(
|
|
45
|
+
markdown: 'fleetops::mail.driver-credentials',
|
|
46
|
+
with: [
|
|
47
|
+
'driver' => $this->driver,
|
|
48
|
+
'user' => $this->user,
|
|
49
|
+
'companyName' => $this->driver->company?->name ?? config('app.name'),
|
|
50
|
+
'identity' => $this->user->email ?? $this->user->phone,
|
|
51
|
+
'plaintextPassword' => $this->plaintextPassword,
|
|
52
|
+
]
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
}
|