@extends('layouts.app') @section('title', 'Overview · QA Dashboard') @section('content')

Overview · {{ $tq }}

@if (!empty($projectSummaries))

Project Status · quarter targets & linked issues

@unless ($hasImportDashboard ?? true)

No dashboard imported for {{ $tq }} yet — cards show 0%. Import one in Settings → Import Dashboard to populate quarter targets.

@endunless
@foreach ($projectSummaries as $ps)
{{ $ps['project'] }} {{ $ps['tq'] }}
{{ $ps['summary']['percent_complete'] }}% {{ $ps['summary']['done'] }}/{{ $ps['summary']['total'] }}
@endforeach
@endif {{-- Bugs filed by QA during the selected RYG week, one tile per project. Each tile shows a compact list (title · reporter · status); clicking it opens the full table (with story + severity) in a modal. --}} @php $fbProjects = ['ERP', 'CRM', 'SMPP']; $fbByProject = collect($filedBugs)->groupBy(fn ($b) => in_array($b['project'], $fbProjects, true) ? $b['project'] : 'Other'); @endphp

Filed Bugs by QA · {{ $weeklyQuarter }} · {{ count($filedBugs) }} bug{{ count($filedBugs) === 1 ? '' : 's' }}

@if (! ($hasImportDashboard ?? true))

No dashboard imported for {{ $weeklyQuarter }} — import one in Settings → Import Dashboard to track filed bugs.

@else
@foreach ($fbProjects as $proj) @php $bugs = $fbByProject->get($proj, collect()); @endphp
count()) role="button" tabindex="0" @click="open=@js($proj)" @keydown.enter="open=@js($proj)" @endif>
{{ $proj }} {{ $bugs->count() }} bug{{ $bugs->count() === 1 ? '' : 's' }}
@forelse ($bugs as $b)
{{ $b['title'] }} {{ $b['qa'] }} @if ($b['status'])@endif
@empty

No bugs filed this quarter.

@endforelse
@endforeach
{{-- One detail modal per project with data --}} @foreach ($fbProjects as $proj) @php $bugs = $fbByProject->get($proj, collect()); @endphp @if ($bugs->count())
Filed Bugs by QA · {{ $proj }} · {{ $bugs->count() }} bug{{ $bugs->count() === 1 ? '' : 's' }}
@foreach ($bugs as $b) $b['critical']])> @endforeach
BugStoryFiled by (QA)SeverityStatus
{{ $b['title'] }} {{ $b['key'] }} {{ $b['story_title'] }} {{ $b['story_key'] }} {{ $b['qa'] }} @if ($b['priority']){{ $b['priority'] }}@else @endif @if ($b['status'])@else @endif
@endif @endforeach @endif
@if (!empty($weeklyRyg))

Weekly Tasks · Target vs Actual · {{ $weeklyQuarter }} · whole team

@php $rygLabel = collect($rygWeeks)->firstWhere('start', $rygWeek)['label'] ?? null; @endphp

Weekly completion (RYG) · {{ $weeklyQuarter }} · {{ $rygLabel ?? 'week' }}

@if (!empty($rygWeeks))
@endif
@foreach ($weeklyRyg as $m) @php $byModule = collect($m['tasks'])->groupBy('module'); @endphp
{{ $m['name'] }}
{{ $m['percent'] }}%
{{ $m['green'] }} on track {{ $m['yellow'] }} at risk {{ $m['red'] }} overdue
@forelse ($m['tasks'] as $t) @empty @endforelse
TitleJira StatusWeekly Status
{{ $t['title'] }}@if ($t['jira_key']) {{ $t['jira_key'] }}@endif @if ($t['jira_status'])@else @endif
No weekly tasks.
{{-- Read-only weekly-tasks modal, grouped by module (all categories expanded). Teleported to so ancestor transforms don't trap the fixed overlay. --}}
@endforeach
@else

Weekly Tasks · {{ $weeklyQuarter }}

No weekly tasks for {{ $weeklyQuarter }} yet. Add some in Weekly Tasks.

@endif {{-- Real-time Jira movements (this week, ALL statuses) for the quarter's target stories — see what the devs are moving so QA knows what to prepare for. --}}

Jira Movements · {{ $weeklyQuarter }} · this week · all statuses

Real-time story/task movements (all issues, not just quarter targets) — what the devs are working on, so you know what to prepare for next.

@php $jmOrder = collect(['ERP','SMPP','CRM'])->merge(collect(array_keys($jiraMovements))->reject(fn ($p) => in_array($p, ['ERP','SMPP','CRM'], true)))->unique()->values(); @endphp @foreach ($jmOrder as $proj) @php $rows = $jiraMovements[$proj] ?? []; @endphp
{{ $proj }} {{ count($rows) }}
@forelse ($rows as $r)
@if ($r['status_to']) @endif{{ $r['summary'] ?: $r['key'] }} @foreach ($r['sources'] ?? [] as $src){{ $src }}@endforeach {{ $r['key'] }}@if ($r['issue_type']) · {{ $r['issue_type'] }}@endif@if ($r['status_from']) · from {{ $r['status_from'] }}@endif@if ($r['assignee']) · {{ $r['assignee'] }}@endif@if ($r['moved_at']) · {{ $r['moved_at']->diffForHumans() }}@endif
@empty

No movements this week.

@endforelse
@endforeach
@endsection @push('scripts') @endpush