Workspace / Phase 4

Review & verification

Inspect submitted totals and evidence fingerprints, run consistency checks, record a review decision, and lock verified results.

{{ number_format($pendingCount) }}
Pending
{{ number_format($flaggedCount) }}
Flagged
@if(session('success'))
{{ session('success') }}
@endif

Result queue

Select a submission to inspect.

@foreach(['pending' => 'Pending', 'flagged' => 'Flagged', 'verified' => 'Verified', 'rejected' => 'Rejected', 'all' => 'All'] as $key => $label)@endforeach
@forelse($queue as $result) @empty
No results in this queue

Submitted station results will appear here.

@endforelse
{{ $queue->links() }}
@if(!$selected)
Select a result to inspect its numbers, evidence record and review history.
@else
{{ $selected->election->name }} · {{ $selected->position->name }}

{{ $selected->pollingStation->name }}

Station {{ $selected->pollingStation->code }}
{{ $selected->status }}
Registered
{{ number_format($selected->registered_voters) }}
Valid
{{ number_format($selected->valid_votes) }}
Cast
{{ number_format($selected->total_votes_cast) }}
Turnout
{{ $selected->registered_voters ? number_format($selected->total_votes_cast / $selected->registered_voters * 100, 1) : '0.0' }}%
@foreach($selected->votes as $vote)@endforeach
CandidatePartyVotes
{{ $vote->candidate->name }}{{ $vote->candidate->party?->abbreviation ?? ($vote->candidate->is_independent ? 'Independent' : '—') }}{{ number_format($vote->votes) }}
Candidate vote sum{{ number_format($selected->votes->sum('votes')) }}
Rejected: {{ number_format($selected->rejected_votes) }}
Spoilt: {{ number_format($selected->spoilt_votes) }}
Disputed: {{ number_format($selected->disputed_votes) }}
Rejection objected: {{ number_format($selected->rejection_objected_votes) }}

Evidence record & OCR assistance

@forelse($selected->evidence as $evidence)
ocr_status,['queued','processing'])) wire:poll.5s @endif class="mt-2 rounded-lg bg-slate-50 p-3">
{{ $evidence->original_filename }}
{{ strtoupper($evidence->mime_type) }} · {{ number_format($evidence->file_size / 1024, 1) }} KB · Uploaded {{ $evidence->uploaded_at->format('d M Y H:i') }}
OCR {{ str_replace('_',' ',$evidence->ocr_status) }}
SHA-256 {{ $evidence->sha256_hash }}
@if($canManageReviews && ($evidence->ocr_status === 'not_requested' || in_array($evidence->ocr_status,['failed','unavailable','unsupported'])))@endif @if($evidence->ocr_error)

{{ $evidence->ocr_error }}

@endif @if($evidence->ocr_suggestions)
Low-confidence text suggestions · verify against the form
@foreach($evidence->ocr_suggestions as $suggestion)
{{ $suggestion['candidate_name'] }}{{ number_format($suggestion['suggested_votes']) }} · low confidence
@endforeach
@endif @if($evidence->ocr_text)
View extracted text
{{ $evidence->ocr_text }}
@endif
@empty
No evidence is attached.
@endforelse

OCR output only proposes values for a human to compare with the original form. It never changes votes or approves results automatically. The image stays private.

@if($selected->locked_at)
Locked {{ $selected->locked_at->format('d M Y H:i') }} by {{ $selected->locker?->name ?? 'reviewer' }}. This record is read-only.
@endif

Automated discrepancy checks

Checks vote arithmetic, turnout bounds, contest membership and evidence fingerprint.

@if($canManageReviews)@endif
@if($selected->discrepancies->isEmpty())
No discrepancy has been recorded. Run checks to inspect this submission.
@else
@foreach($selected->discrepancies as $issue)
{{ $issue->description }}
{{ $issue->code }} · {{ $issue->severity }} · {{ $issue->status }}
@if($issue->expected_value || $issue->actual_value)
Expected {{ $issue->expected_value ?? '—' }} · Actual {{ $issue->actual_value ?? '—' }}
@endif
@if($canManageReviews && $issue->status === 'open')
@elseif($issue->resolver)
Resolved by {{ $issue->resolver->name }} {{ $issue->resolved_at?->format('d M H:i') }}
@endif
@endforeach
@endif @error('resolutionNotes')

{{ $message }}

@enderror @error('decisionNotes')

{{ $message }}

@enderror

Review decision

@if(!$canManageReviews)

You have read only access to this review record.

@elseif($selected->locked_at)

This result is locked. No further decisions can be recorded.

@else

Decision will be recorded under {{ auth()->user()->name }}.

@error('decisionNotes')

{{ $message }}

@enderror
@endif @if($selected->reviews->isNotEmpty())

Review history

@foreach($selected->reviews as $review)
{{ $review->decision }} · {{ $review->reviewer->name }}
{{ $review->reviewed_at->format('d M Y H:i') }}{{ $review->notes ? ' · '.$review->notes : '' }}
@endforeach
@endif
@endif

Reviews are recorded under the signed-in user's account.