131 lines
4.7 KiB
PHP
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();
|
|
}
|
|
}
|