'auto_approve_deletions', 'label' => 'Auto-Approve Account Deletion Requests', 'type' => 'checkbox', 'default' => false, 'description' => 'Automatically anonymize accounts when the client submits a deletion request.', 'database_type' => 'boolean', ], [ 'name' => 'pin_length', 'label' => 'Support PIN Length', 'type' => 'number', 'default' => 6, 'validation' => 'integer|min:4|max:12', 'description' => 'Number of characters generated for support PIN codes.', ], [ 'name' => 'pin_expiry_minutes', 'label' => 'Support PIN Expiry (minutes)', 'type' => 'number', 'default' => 15, 'validation' => 'integer|min:5|max:120', 'description' => 'How long a generated support PIN remains valid.', ], [ 'name' => 'log_retention_days', 'label' => 'Audit Log Retention (days)', 'type' => 'number', 'default' => 365, 'validation' => 'integer|min:30|max:1825', 'description' => 'Audit records older than this will be pruned when the extension enables.', ], ]; } public function enabled() { Artisan::call('migrate', [ '--path' => 'extensions/Others/ComplianceTools/database/migrations', '--force' => true, ]); } public function boot() { require __DIR__ . '/routes/web.php'; View::addNamespace('compliance-tools', __DIR__ . '/resources/views'); Lang::addNamespace('compliance-tools', __DIR__ . '/resources/lang'); Livewire::component('compliance.privacy-center', PrivacyCenter::class); Gate::policy(AccountDeletionRequest::class, AccountDeletionRequestPolicy::class); Gate::policy(SupportPin::class, SupportPinPolicy::class); User::resolveRelationUsing('complianceDeletionRequests', function (User $user) { return $user->hasMany(AccountDeletionRequest::class); }); User::resolveRelationUsing('supportPins', function (User $user) { return $user->hasMany(SupportPin::class); }); Event::listen('navigation.account', function () { return [ 'name' => __('compliance-tools::client.navigation_privacy'), 'route' => 'compliance.privacy-center', ]; }); Event::listen('permissions', function () { return [ 'admin.compliance.view' => 'View compliance records', 'admin.compliance.process' => 'Process account deletion requests', 'admin.compliance.validate_pin' => 'Validate support PINs', ]; }); Event::listen('api.permissions', function () { return [ 'admin.compliance.view' => 'View compliance records', 'admin.compliance.process' => 'Process account deletion requests', 'admin.compliance.validate_pin' => 'Validate support PINs', ]; }); Event::listen('extension.schedules', function () { return [ fn () => ExtensionHelper::getExtension('other', 'ComplianceTools')?->pruneAuditLogs(), ]; }); } public function pruneAuditLogs(): void { $retentionDays = (int) ($this->config('log_retention_days') ?? 365); if ($retentionDays <= 0) { return; } AuditLog::query() ->where('created_at', '<', now()->subDays($retentionDays)) ->delete(); } }