Files
Virtnet.bond/extensions/Others/ComplianceTools/ComplianceTools.php
2025-11-30 11:57:22 +01:00

131 lines
4.7 KiB
PHP

<?php
namespace Paymenter\Extensions\Others\ComplianceTools;
use App\Classes\Extension\Extension;
use App\Helpers\ExtensionHelper;
use App\Models\User;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Lang;
use Illuminate\Support\Facades\View;
use Livewire\Livewire;
use Paymenter\Extensions\Others\ComplianceTools\Livewire\Client\PrivacyCenter;
use Paymenter\Extensions\Others\ComplianceTools\Models\AccountDeletionRequest;
use Paymenter\Extensions\Others\ComplianceTools\Models\AuditLog;
use Paymenter\Extensions\Others\ComplianceTools\Models\SupportPin;
use Paymenter\Extensions\Others\ComplianceTools\Policies\AccountDeletionRequestPolicy;
use Paymenter\Extensions\Others\ComplianceTools\Policies\SupportPinPolicy;
class ComplianceTools extends Extension
{
public function getConfig($values = [])
{
return [
[
'name' => '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();
}
}