WORKSPACE / QUALITY ASSURANCE

Danh sách ứng dụng cần test

Tất cả app đang chờ, đang test, cần sửa, Pass và Public của nhiều Developer.

{{ strtoupper(substr(auth()->user()->name ?? 'T', 0, 1)) }} Đang xem với vai trò {{ auth()->user()->role ?? 'Tester' }} {{ auth()->user()->name ?? 'Tester' }}
{{-- 5 Box trạng thái: ĐÃ BỎ BOX TẤT CẢ, dùng số liệu thật từ DB --}}

Ứng dụng & bản build mới nhất

Mỗi app có thể đến từ Dev khác nhau. Test song song và theo dõi bản fix mới.

@if (($isAdmin ?? false) || (auth()->user()?->role === 'Admin')) @endif
@forelse ($releases as $rel) @php $app = $rel->appAndroid ?? $rel->appIos; $appName = $app?->app_name ?? ($rel->original_name ?? 'Ứng dụng'); $stApp = $app?->st_app ?? 'ST'; $package = $app?->package ?? ''; $platform = $rel->app_android_id ? 'Android' : ($rel->app_ios_id ? 'iOS' : ''); $initial = strtoupper(mb_substr($appName, 0, 1)); $colors = [ '#6366F1', '#3B82F6', '#10B981', '#F59E0B', '#EF4444', '#8B5CF6', '#EC4899', '#14B8A6', ]; $bgColor = $colors[$rel->id % count($colors)]; $latestBuild = $rel->latestBuild ?? $rel->builds->first(); $statusKey = $rel->isPublished() ? 'published' : $rel->test_status ?? 'waiting'; $statusLabels = [ 'waiting' => ['label' => 'Chờ test', 'class' => 'waiting'], 'testing' => ['label' => 'Đang test', 'class' => 'testing'], 'failed' => ['label' => 'Cần sửa', 'class' => 'failed'], 'passed' => ['label' => 'Pass', 'class' => 'passed'], 'published' => ['label' => 'Đã Public', 'class' => 'published'], ]; $stBadge = $statusLabels[$statusKey] ?? [ 'label' => $statusKey, 'class' => 'waiting', ]; $devName = $rel->uploader?->name ?? 'Developer'; $devId = $rel->uploader?->id ?? ''; // Lấy thông tin tester: Người đã test (từ reports) hoặc Tester được phân công phụ trách app $testedBy = $rel->reports->pluck('tester.name')->filter()->unique()->implode(', '); $assignedTesters = ''; if (empty($testedBy) && !empty($app?->tester_ids)) { if (isset($testerUsers)) { $assignedTesters = collect($app->tester_ids) ->map(fn($uid) => $testerUsers[$uid] ?? null) ->filter() ->unique() ->implode(', '); } elseif (method_exists($app, 'getTestersAttribute')) { $assignedTesters = $app->testers->pluck('name')->implode(', '); } } $testerDisplay = $testedBy ?: $assignedTesters; // Lấy danh sách ID Tester (đã test hoặc được phân công) để lọc theo tester $testedTesterIds = $rel->reports->pluck('tester_id')->filter()->map(fn($id) => (int)$id)->all(); $assignedTesterIds = !empty($app?->tester_ids) ? array_map('intval', (array)$app->tester_ids) : []; $rowTesterIds = array_values(array_unique(array_merge($testedTesterIds, $assignedTesterIds))); $rowTestersAttr = implode(',', $rowTesterIds); @endphp @empty @endforelse
Ứng dụng / Developer Version hiện tại Trạng thái QA Cập nhật Thao tác
@if (!empty($package))
{{ $appName }} {{ $initial }}
@else {{ $initial }} @endif
{{ $stApp }} - {{ $appName }} @if ($platform) {{ $platform }} @endif
{{ $package }}
Dev: {{ $devName }} @if ($testerDisplay) Tester: {{ $testerDisplay }} @endif
v{{ $rel->version_name }} Build #{{ $rel->current_revision ?? ($latestBuild?->revision ?? 1) }} @if ($rel->version_code)
Code {{ $rel->version_code }}
@endif
{{ $stBadge['label'] }} @if ($rel->isPublished() && ($rel->publisher || $rel->published_at))
Public: {{ $rel->publisher?->name ?? 'Admin' }}
@endif @if ($testerDisplay)
{{ $testerDisplay }}
@else
Chưa phân công
@endif
{{ $rel->updated_at ? $rel->updated_at->format('d/m H:i') : '—' }}
@if ($latestBuild) ↓ APK @else @endif {{-- Public (Tester hoặc Admin, khi đã Pass và chưa Public) --}} @if (!$rel->isPublished() && (($isTester ?? false) || ($isAdmin ?? false)) && $rel->test_status === 'passed')
@csrf
@endif
Chưa có bản phát hành APK nào cần kiểm thử.
Hiển thị {{ count($releases) }} bản phát hành
{{-- Panel Chi tiết bản đang kiểm thử & Gửi kết quả test --}}