@extends('layouts.app') @section('mobile-title', 'Compliance') @section('mobile-subtitle', 'Document governance') @section('mobile-back', route('documents.index')) @section('mobile-action-url', route('documents.compliance.retention-rules.index')) @section('mobile-action-icon', 'rule') @section('mobile-action-label', 'Retention rules') @section('content') @php $statusBadge = function ($document) { if ($document->legal_hold_at) { return ['Legal Hold', 'bg-violet-50 text-violet-700']; } if ($document->isExpired()) { return ['Expired', 'bg-red-50 text-red-700']; } if ($document->expiresSoon()) { return ['Expiring', 'bg-amber-50 text-amber-700']; } return match ($document->status) { \App\Models\Document::STATUS_APPROVED => ['Approved', 'bg-emerald-50 text-emerald-700'], \App\Models\Document::STATUS_REJECTED => ['Rejected', 'bg-red-50 text-red-700'], default => ['Pending', 'bg-blue-50 text-blue-700'], }; }; @endphp
Document Centre chevron_right Compliance

Document Compliance

Overview of compliance status across company records, expiry controls, legal holds, and retention rules.

download Export Audit
@csrf
Overall Compliance
{{ $complianceMetrics['overall'] }}% {{ $complianceMetrics['legal_holds'] }} holds
Expiring Soon (30d)
schedule
{{ $complianceMetrics['expiring_soon'] }}
Expired Documents
warning
{{ $complianceMetrics['expired'] }} View All
Pending Verification
assignment_late
{{ $complianceMetrics['pending_verification'] }} In Queue

Urgent Actions

See All
@forelse ($urgentActions as $document) @php($badge = $statusBadge($document)) @empty @endforelse
Document / Project Type Status Action
{{ $document->title }}
{{ $document->project?->name ?? 'Company Records' }}
{{ $document->folder->categoryLabel() }} {{ $badge[0] }} Open
No urgent compliance actions right now.

Compliance by Category

@forelse ($categoryCompliance as $row)
{{ $categories[$row->category] ?? ucfirst($row->category) }} {{ $row->score }}%
@empty
No category data yet.
@endforelse

Upcoming Expirations

@foreach ([['This Week', $expirationBuckets['this_week']], ['Next 30 Days', $expirationBuckets['next_30_days']], ['Next 90 Days', $expirationBuckets['next_90_days']]] as [$label, $count]) @endforeach

Retention Rules

Set the archive window for each company document category.

{{ $rules->where('is_enabled', true)->count() }} active tune Open Settings
@csrf
@foreach ($categories as $category => $label) @php($rule = $rules->get($category)) @endforeach
Category Retain Months Enabled
{{ $label }} retain_months ?? 84) }}" class="w-28 rounded border border-[var(--construct-border)] px-3 py-2 text-sm">

Recent Verifications

refresh
@forelse ($recentVerifications as $document) @php($approved = $document->status === \App\Models\Document::STATUS_APPROVED) {{ $approved ? 'check_circle' : 'cancel' }} {{ $document->title }} {{ $document->folder->categoryLabel() }} · {{ $approved ? 'Approved' : 'Rejected' }} by {{ $document->reviewer?->name ?? 'System' }} {{ $document->reviewed_at->diffForHumans() }} @empty
No verification activity yet.
@endforelse

Site Status

@forelse ($siteStatus as $site)
{{ $site->project_name }} {{ $site->score }}%
@empty
No site data yet.
@endforelse

Retention Candidates

@forelse ($retentionCandidates as $document) {{ $document->title }} {{ $document->folder->categoryLabel() }} · {{ $document->created_at->format('M j, Y') }} @empty
No documents currently match enabled retention rules.
@endforelse

Legal Holds

Storage by Category

@forelse ($storageByCategory as $row)
{{ $categories[$row->category] ?? ucfirst($row->category) }} {{ $row->documents_count }} docs · {{ number_format(($row->bytes ?? 0) / 1048576, 2) }} MB
@empty
No documents yet.
@endforelse

Storage by Owner

@forelse ($storageByOwner as $row)
{{ $row->name ?: 'No owner' }} {{ $row->documents_count }} docs · {{ number_format(($row->bytes ?? 0) / 1048576, 2) }} MB
@empty
No owner data yet.
@endforelse
@endsection