{{ __('Date') }} {{ __('Username') }} {{ __('Action Type') }} {{ __('Activity Type') }} {{ __('Detail') }} @forelse(($auditTrails ?? collect()) as $audit) @php $oldValues = is_array($audit->old_values) ? $audit->old_values : []; $newValues = is_array($audit->new_values) ? $audit->new_values : []; $metadata = is_array($audit->metadata) ? $audit->metadata : []; $action = (string) $audit->action; $actorName = $audit->actor_name ?: optional($audit->actor)->name ?: __('System'); $targetType = trim((string) ($audit->target_type ?? '')); $targetUser = $targetType === 'User' ? ($auditTargetUsers[$audit->target_id] ?? null) : null; $localizedTargetNames = $locale === 'kh' ? [ $newValues['name_kh'] ?? null, $oldValues['name_kh'] ?? null, $newValues['name_en'] ?? null, $oldValues['name_en'] ?? null, $newValues['name'] ?? null, $oldValues['name'] ?? null, ] : [ $newValues['name_en'] ?? null, $oldValues['name_en'] ?? null, $newValues['name'] ?? null, $oldValues['name'] ?? null, $newValues['name_kh'] ?? null, $oldValues['name_kh'] ?? null, ]; $targetName = trim((string) collect($localizedTargetNames) ->first(fn ($value) => trim((string) $value) !== '', ( $newValues['email'] ?? $oldValues['email'] ?? $newValues['role'] ?? $oldValues['role'] ?? optional($targetUser)->name ?? optional($targetUser)->email ?? optional($targetUser)->role ?? $metadata['document_name'] ?? $metadata['document_code'] ?? '' ))); $targetLabel = $targetName !== '' ? $targetName : ($targetType !== '' ? __($targetType) : __('N/A')); $actionLabel = __(ucwords(str_replace('_', ' ', $action))); $formatAuditField = function ($field) { return match ((string) $field) { 'name_en' => __('English Name'), 'name_kh' => __('Khmer Name'), default => __(ucwords(str_replace(['_', '-'], ' ', (string) $field))), }; }; $formatAuditValue = function ($value) { if (is_bool($value)) { return __($value ? 'Yes' : 'No'); } if ($value === null || $value === '') { return __('Empty'); } if (is_array($value)) { return implode(', ', array_map(fn ($item) => is_scalar($item) ? (string) $item : json_encode($item, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), $value)); } return (string) $value; }; $changedFieldKey = collect($newValues) ->keys() ->first(function ($key) use ($oldValues, $newValues) { return !in_array((string) $key, ['created_at', 'updated_at'], true) && array_key_exists($key, $oldValues) && $oldValues[$key] !== $newValues[$key]; }); $changeText = $changedFieldKey !== null ? __(':field changed from :old to :new.', [ 'field' => $formatAuditField($changedFieldKey), 'old' => $formatAuditValue($oldValues[$changedFieldKey] ?? null), 'new' => $formatAuditValue($newValues[$changedFieldKey] ?? null), ]) : ''; $workflowAction = strtolower((string) ($newValues['action'] ?? $metadata['action'] ?? '')); if ((bool) ($metadata['returned_back'] ?? false)) { $workflowAction = 'return_back'; } $workflowVerb = match ($workflowAction) { 'forward', 'forward_to_rector' => __('forwarded'), 'send_back', 'request_revision' => __('sent back'), 'return_back' => __('returned back'), 'approve', 'approve_document' => __('approved'), 'reject', 'reject_document' => __('rejected'), 'complete', 'complete_post_approval_processing', 'mark_requirements_done' => __('completed'), 'request_more_information' => __('requested more information for'), default => __('updated'), }; $formatWorkflowState = function ($state) { $state = trim((string) $state); if ($state === '') { return __('Unknown Step'); } return __(ucwords(str_replace(['_', '-'], ' ', $state))); }; $fromStateLabel = $formatWorkflowState($metadata['from_state'] ?? ''); $toStateLabel = $formatWorkflowState($metadata['to_state'] ?? ''); $workflowText = match ($workflowAction) { 'forward', 'forward_to_rector', 'send_back', 'request_revision', 'return_back', 'approve', 'approve_document', 'reject', 'reject_document', 'complete', 'complete_post_approval_processing', 'mark_requirements_done', 'request_more_information' => __(':action document :document from :from to :to.', [ 'action' => $workflowVerb, 'document' => $targetLabel, 'from' => $fromStateLabel, 'to' => $toStateLabel, ]), default => __('Updated workflow for document :document.', ['document' => $targetLabel]), }; $workflowText = trim($workflowText); $actionType = match ($action) { 'user_created', 'role_created', 'organization_created', 'document_type_created', 'workflow_template_created', 'document_request_created' => __('Create'), 'user_updated', 'role_updated', 'role_permissions_updated', 'role_permissions_bulk_updated', 'register_document_number', 'organization_updated', 'document_type_updated', 'workflow_template_updated' => __('Update'), 'user_status_toggled', 'role_status_toggled', 'organization_status_toggled', 'document_type_status_toggled', 'workflow_template_status_toggled' => __('Status Change'), 'user_password_reset' => __('Reset Password'), 'user_deleted', 'role_deleted', 'organization_deleted', 'document_type_deleted', 'workflow_template_deleted' => __('Delete'), 'workflow_transition' => match ($workflowAction) { 'forward', 'forward_to_rector' => __('Forwarded'), 'send_back', 'request_revision' => __('Sent Back'), 'return_back' => __('Returned Back'), 'approve', 'approve_document' => __('Approved'), 'reject', 'reject_document' => __('Rejected'), 'complete', 'complete_post_approval_processing', 'mark_requirements_done' => __('Completed'), 'request_more_information' => __('Requested More Information'), default => __('Update'), }, default => $actionLabel, }; $activityType = match ($action) { 'user_created', 'user_updated', 'user_status_toggled', 'user_password_reset', 'user_deleted' => __('User'), 'role_created', 'role_updated', 'role_status_toggled', 'role_deleted', 'role_permissions_updated', 'role_permissions_bulk_updated' => __('Role'), 'organization_created', 'organization_updated', 'organization_status_toggled', 'organization_deleted' => __('Organization'), 'document_type_created', 'document_type_updated', 'document_type_status_toggled', 'document_type_deleted' => __('Document Type'), 'workflow_template_created', 'workflow_template_updated', 'workflow_template_status_toggled', 'workflow_template_deleted' => __('Workflow Template'), 'workflow_transition', 'document_request_created', 'register_document_number' => __('Document'), default => $targetType !== '' ? __($targetType) : __('System'), }; $actionBadgeKey = match ($action) { 'user_created', 'role_created', 'organization_created', 'document_type_created', 'workflow_template_created', 'document_request_created' => 'create', 'user_updated', 'role_updated', 'role_permissions_updated', 'role_permissions_bulk_updated', 'register_document_number', 'organization_updated', 'document_type_updated', 'workflow_template_updated' => 'update', 'user_status_toggled', 'role_status_toggled', 'organization_status_toggled', 'document_type_status_toggled', 'workflow_template_status_toggled' => 'status_change', 'user_password_reset' => 'reset_password', 'user_deleted', 'role_deleted', 'organization_deleted', 'document_type_deleted', 'workflow_template_deleted' => 'delete', 'workflow_transition' => match ($workflowAction) { 'forward', 'forward_to_rector' => 'forwarded', 'send_back', 'request_revision' => 'send_back', 'return_back' => 'returned_back', 'approve', 'approve_document' => 'approved', 'reject', 'reject_document' => 'rejected', 'complete', 'complete_post_approval_processing', 'mark_requirements_done' => 'completed', 'request_more_information' => 'commented', default => 'update', }, default => $action, }; $activityBadgeKey = match ($action) { 'user_created', 'user_updated', 'user_status_toggled', 'user_password_reset', 'user_deleted' => 'user', 'role_created', 'role_updated', 'role_status_toggled', 'role_deleted', 'role_permissions_updated', 'role_permissions_bulk_updated' => 'role', 'organization_created', 'organization_updated', 'organization_status_toggled', 'organization_deleted' => 'organization', 'document_type_created', 'document_type_updated', 'document_type_status_toggled', 'document_type_deleted' => 'document_type', 'workflow_template_created', 'workflow_template_updated', 'workflow_template_status_toggled', 'workflow_template_deleted' => 'workflow_template', 'workflow_transition', 'document_request_created', 'register_document_number' => 'document', default => $targetType !== '' ? $targetType : 'audit', }; $changedFieldLabel = $changedFieldKey !== null ? $formatAuditField($changedFieldKey) : ''; $detailText = match ($action) { 'user_created' => __('Created user [:target]', ['target' => $targetLabel]), 'user_updated' => $changedFieldLabel !== '' ? __('Updated user :field [:target]', ['field' => strtolower($changedFieldLabel), 'target' => $targetLabel]) : __('Updated user [:target]', ['target' => $targetLabel]), 'user_status_toggled' => __('Changed user status [:target]', ['target' => $targetLabel]), 'user_password_reset' => __('Reset password for user [:target]', ['target' => $targetLabel]), 'user_deleted' => __('Deleted user [:target]', ['target' => $targetLabel]), 'role_created' => __('Created role [:target]', ['target' => $targetLabel]), 'role_updated' => $changedFieldLabel !== '' ? __('Updated role :field [:target]', ['field' => strtolower($changedFieldLabel), 'target' => $targetLabel]) : __('Updated role [:target]', ['target' => $targetLabel]), 'role_status_toggled' => __('Changed role status [:target]', ['target' => $targetLabel]), 'role_deleted' => __('Deleted role [:target]', ['target' => $targetLabel]), 'role_permissions_updated', 'role_permissions_bulk_updated' => __('Updated role permissions'), 'organization_created' => __('Created organization [:target]', ['target' => $targetLabel]), 'organization_updated' => $changedFieldLabel !== '' ? __('Updated organization :field [:target]', ['field' => strtolower($changedFieldLabel), 'target' => $targetLabel]) : __('Updated organization [:target]', ['target' => $targetLabel]), 'organization_status_toggled' => __('Changed organization status [:target]', ['target' => $targetLabel]), 'organization_deleted' => __('Deleted organization [:target]', ['target' => $targetLabel]), 'document_type_created' => __('Created document type [:target]', ['target' => $targetLabel]), 'document_type_updated' => $changedFieldLabel !== '' ? __('Updated document type :field [:target]', ['field' => strtolower($changedFieldLabel), 'target' => $targetLabel]) : __('Updated document type [:target]', ['target' => $targetLabel]), 'document_type_status_toggled' => __('Changed document type status [:target]', ['target' => $targetLabel]), 'document_type_deleted' => __('Deleted document type [:target]', ['target' => $targetLabel]), 'workflow_template_created' => __('Created workflow template [:target]', ['target' => $targetLabel]), 'workflow_template_updated' => $changedFieldLabel !== '' ? __('Updated workflow template :field [:target]', ['field' => strtolower($changedFieldLabel), 'target' => $targetLabel]) : __('Updated workflow template [:target]', ['target' => $targetLabel]), 'workflow_template_status_toggled' => __('Changed workflow template status [:target]', ['target' => $targetLabel]), 'workflow_template_deleted' => __('Deleted workflow template [:target]', ['target' => $targetLabel]), 'workflow_transition' => __(':action document [:document] from :from to :to', [ 'action' => ucfirst((string) $workflowVerb), 'document' => $targetLabel, 'from' => $fromStateLabel, 'to' => $toStateLabel, ]), 'document_request_created' => __('Created document request [:target]', ['target' => $targetLabel]), 'register_document_number' => __('Registered document number [:number] for document [:target]', [ 'number' => (string) data_get($newValues, 'registry_document_number', ''), 'target' => $targetLabel, ]), default => __('Performed :action [:target]', [ 'action' => strtolower($actionLabel), 'target' => $targetLabel, ]), }; @endphp {{ \App\Support\DateFormatter::localized($audit->created_at, 'd F, Y h:i A') }}
{{ $actorName }}
{{ $detailText }}
@empty {{ __('No audit trail records yet.') }} @endforelse