QA: Moderátorský panel
Checklist pro testery nového moderátorského panelu (větev feature/moderatorPanel). Cíl: ověřit, že nový panel kompletně nahrazuje starý layout (quizz.blade.php + groupedCreate.blade.php) bez regresí, před merge na master.
Referenční dokumentace: Moderátorský panel – přehled, Blokace, Průchod panelem.
Přechod starého layoutu na nový
Section titled “Přechod starého layoutu na nový”Nový panel je úplná náhrada předchozího rozhraní — nejedná se o iterativní vylepšení. Po nasazení větve feature/moderatorPanel uvidí všichni moderátoři pouze nový panel.
| Oblast | Starý layout | Nový panel |
|---|---|---|
| Layout | Jedna stránka, vše pohromadě, sekce pomocí class="hidden" | Tab struktura (Kvíz / Rezervace / Týmy / Nastavení / Statistiky) |
| Záložka Kvíz | Sekce skryté JS-em, nejasná posloupnost | Stepper 5 kroků (Stažení → Čekání → Výsledky → Potvrzení → Hotovo) |
| Blokace stažení | Prázdné/nedostupné tlačítko bez vysvětlení | Barevné bannery s důvodem a doporučenou akcí |
| Sidebar | Statické menu | Unified worklist s urgencemi (červená/oranžová/žlutá/modrá/šedá) |
| Krok Čekání | Neexistoval — moderátor jen čekal s prázdnou stránkou | Aktivní obsah: čas do startu, počasí pro open-air, stav rezervací, konfigurovatelná podpora (e-mail/telefon/WhatsApp) |
| Zadávání výsledků | Separátní stránka groupedCreate | Livewire results-entry přímo v kroku 3 |
| Vouchery | Vlastní URL / dialog | Krok 4, výběr týmu omezený jen na týmy s výsledkem |
| Pořadí při remíze | Manuální editace v tabulce | Drag & drop řazení v kroku 4 |
| Finanční přehled | Nikde — moderátor počítal odměnu a platbu ručně | Live souhrn v kroku 4 (preview) + definitivní v kroku 5 (Vybráno / Poslat / Moje odměna) |
| Platba Chytrému Kvízu | Moderátor si musel pamatovat VS a sám sestavit příkaz | QR kód v kroku 5 s předvyplněnou částkou, VS a zprávou pro příjemce |
| Po potvrzení výsledků | Stránka šla volně editovat zpět | Předchozí kroky uzamčené (read-only) |
| Krok Čekání (open-air) | Bez informace o počasí | Dlaždice „Počasí na termín” z Open-Meteo + amber varování při nepříznivých podmínkách |
Příprava testovacího prostředí
Section titled “Příprava testovacího prostředí”- Admin: https://admin.beta.chytrykviz.cz
- Mailhog: http://159.89.0.170:8025/
Reset DB a seed dat zajistí vývojář. Tester dostane přihlašovací údaje k moderátorskému účtu přiřazenému k seedovaným eventům.
SC-01 · Pravidelný blueprint, PLAY mód, bez blokace
Section titled “SC-01 · Pravidelný blueprint, PLAY mód, bez blokace”Příprava: Event s quizz_blueprint_id, mode=play, status=active, aktuální týden, přihlášený jako moderátor.
- Otevři event v panelu → ověř 5 záložek v hlavičce.
- Záložka Kvíz → krok 1 aktiven, tlačítko Stáhnout.
- Klikni Stáhnout → soubor se uloží, krok 1 se označí jako dokončený.
- Záložka Kvíz → krok 2 Výsledky aktivní.
- Přidej alespoň 2 týmy s výsledky a počtem hráčů.
- Klikni Pokračovat → krok 3 (Vouchery) aktivní.
- Klikni Přeskočit → krok 4 (Potvrzení) aktivní.
- Tabulka výsledků zobrazena, poznámka k dispozici.
- Klikni Potvrdit výsledky → krok 5 (Hotovo) zobrazí potvrzení.
Očekávání:
- Krok 5 zobrazil potvrzení s přehledem výsledků
- Výpočet odměny proběhl — ověř v Admin → Platby → přehled moderátora
- Žádná pokuta (PLAY mód, výsledky zadány ihned)
SC-02 · Pravidelný blueprint, ACTIVE mód
Section titled “SC-02 · Pravidelný blueprint, ACTIVE mód”Jako SC-01, ale blueprint má mode=active.
Očekávání:
- Pokud celková měsíční odměna překračuje strop, část se zaúčtuje jako tip (Payment typu
MODERATOR_TIP) - Ověř v Platby sekci po potvrzení výsledků
SC-03 · Pravidelný blueprint, PREMIUM mód
Section titled “SC-03 · Pravidelný blueprint, PREMIUM mód”Jako SC-01, ale blueprint má mode=premium.
Očekávání:
- V záhlaví panelu viditelná informace o payer kontaktu
- Odměna vypočtena dle PREMIUM logiky (ne standardní formula)
SC-04 · Finanční blokace (OutstandingBlocks)
Section titled “SC-04 · Finanční blokace (OutstandingBlocks)”Příprava: Snížit kredit moderátora pod blokovací hranici (tinker nebo admin panel Platby → přidat zápornou platbu).
- Otevři event → červený banner nahoře.
- Krok 1 tlačítko Stáhnout je disabled nebo skryto.
- Klik na tlačítko v banneru → přesměruje na Platby nebo zobrazí instrukce.
Očekávání:
- Panel (ostatní záložky) zůstává použitelný
- Výsledky nejde zadat (stažení neproběhlo)
- Po doplnění kreditu banner zmizí bez reloadu (nebo po refreshi)
SC-05 · Chybějící výsledky z minulých eventů (MissingPreviousResults)
Section titled “SC-05 · Chybějící výsledky z minulých eventů (MissingPreviousResults)”Příprava: Najdi nebo vytvoř blueprint event, kde předchozí event nemá results_entered_at.
- Otevři aktuální event → oranžový banner s tlačítky na chybějící eventy.
- Krok 1 disabled.
- Klikni na tlačítko u chybějícího eventu → přesměruje na ten event.
- Zadej výsledky u starého eventu (SC-01 bez kroku Stažení).
- Vrať se na aktuální event → banner zmizel, krok 1 aktivní.
Očekávání:
- Banner obsahuje správné eventy (ne budoucí, jen minulé bez výsledků)
- Po zadání všech chybějících výsledků se blokace sama odstraní
SC-06 · Příliš brzy (BadWeek)
Section titled “SC-06 · Příliš brzy (BadWeek)”Příprava: Event naplánovaný na příští týden.
- Otevři event → modrý banner „Příliš brzy” s datem od kdy.
- Krok 1 disabled.
- Ostatní záložky (Rezervace, Týmy) přístupné.
Očekávání:
- Banner zobrazí správné datum
- Žádné chybové hlášky v konzoli
SC-07 · Event pozastaven – ChangeRequest (EventOnHold)
Section titled “SC-07 · Event pozastaven – ChangeRequest (EventOnHold)”Příprava: Vytvořit nevyřešený ChangeRequest pro event (admin → CRM → žádosti o změnu).
- Otevři event → oranžový banner „Event pozastaven”.
- Banner obsahuje odkaz na detail ChangeRequestu (pokud admin).
- Krok 1 disabled.
- Admin vyřeší ChangeRequest → ověř, že event přešel zpět na
status=active. - Obnov stránku → banner zmizel, krok 1 aktivní.
SC-08 · Event zrušen (EventCancelled)
Section titled “SC-08 · Event zrušen (EventCancelled)”Příprava: Nastavit status=canceled na eventu (admin panel nebo tinker).
- Otevři event → šedý banner „Event zrušen”.
- Krok 1 disabled, krok 2 disabled.
- Záložka Rezervace dostupná (read-only).
Očekávání:
- Žádné akce pro zadání výsledků
SC-09 · Pondělí před 12:00 (UnavailableBeforeNoon)
Section titled “SC-09 · Pondělí před 12:00 (UnavailableBeforeNoon)”Příprava: Managed kvíz (konkrétní quizz_config klíče), test v pondělí dopoledne.
- Otevři event → modrý banner s odpočtem do 12:00.
- Po 12:00: obnov stránku → banner zmizel, tlačítko Stáhnout aktivní.
SC-10 · Finanční varování (non-blocking)
Section titled “SC-10 · Finanční varování (non-blocking)”Příprava: Kredit mezi warning a block hranicí.
- Otevři event → oranžový banner varování.
- Tlačítko Stáhnout je aktivní (není blokováno).
- Celý průchod SC-01 funguje.
SC-11 · Nepravidelný blueprint
Section titled “SC-11 · Nepravidelný blueprint”Příprava: Blueprint s frequency=none.
- Záložka Nastavení obsahuje sekci Plánování termínů s formulářem Nový termín.
- Přidej nový termín (datum + čas v budoucnosti).
- Event se vytvoří a objeví v menu.
- Standardní průchod SC-01.
Očekávání:
- Záložka Nastavení nepravidelného blueprintu má formulář nového termínu
- Po přidání termínu zmizí urgence
NEEDS_SCHEDULINGv sidebar menu
SC-12 · Sidebar urgence NEEDS_SCHEDULING
Section titled “SC-12 · Sidebar urgence NEEDS_SCHEDULING”Příprava: Nepravidelný blueprint bez budoucího eventu.
- Levé menu → sekce Moderátor → blueprint zobrazen žlutě.
- Klik na řádek blueprintu → přesměruje přímo na formulář nového termínu.
SC-13 · Speciál – Turnaj
Section titled “SC-13 · Speciál – Turnaj”Příprava: Event s special_id a type=Tournament.
- Záložka Nastavení chybí (nebo je prázdná) – speciály nemají plánování termínů.
- Záložka Statistiky nezdrazuje local league standings.
- Průchod kroků 1–5 funkční.
- Krok 5 – odměna počítána z
special.moderator_reward × player_count, ne ze standardní formule.
SC-14 · Speciál – Seriál
Section titled “SC-14 · Speciál – Seriál”Příprava: Event s special_id, type=Series, rodičovský speciál má více kol.
- V panelu viditelná navigace mezi koly seriálu.
- Výsledky se zadávají zvlášť za každé kolo.
- Krok 5 každého kola zobrazí správnou odměnu za dané kolo.
SC-15 · Přístup jako nesprávný uživatel (NotModerator)
Section titled “SC-15 · Přístup jako nesprávný uživatel (NotModerator)”Příprava: Přihlásit se jako uživatel, který není přiřazen k eventu.
- Otevři URL eventu
/moderator/quizz/{id}. - Očekávání: 403 Forbidden nebo přesměrování, ne prázdný panel.
SC-16 · Co-moderátor
Section titled “SC-16 · Co-moderátor”Příprava: Event s hlavním moderátorem a co-moderátorem přidaným přes moderators() pivot.
- Přihlásit jako co-moderátor.
- Panel přístupný.
- Stáhnout kvíz → funkční.
- Zadat výsledky → funkční.
- Potvrzení výsledků → odměna přiřazena správnému moderátorovi (ověřit v Platby).
SC-17 · Blueprint na letní přestávce
Section titled “SC-17 · Blueprint na letní přestávce”Příprava: Blueprint s is_summer_break = true → všechny budoucí eventy status=on_hold.
- Otevři budoucí event blueprintu → oranžový banner
EventOnHold. - Banner (nebo poznámka) zmiňuje letní přestávku.
- Krok 1 disabled.
SC-18 · Live souhrn financí v kroku Potvrzení (preview)
Section titled “SC-18 · Live souhrn financí v kroku Potvrzení (preview)”Příprava: Event PLAY, zadané výsledky pro min. 2 týmy, výsledky ještě nepotvrzeny.
- Otevři krok Potvrzení.
- Ověř, že je zobrazen blok Souhrn financí s badgem (předběžný).
- Tři dlaždice:
- Vybráno na startovném = počet hráčů × startovné z konfigurace
- Poslat Chytrému Kvízu = max(0, Vybráno − Vouchery − Moje odměna)
- Moje odměna = vypočítaná ze vzorce moderátora (
payment_fix + payment_per_player × hráči + adjustment)
- Pokud existuje uplatněný voucher: pod částkou Vybráno se zobrazí řádek Z toho uplatněné vouchery.
- Uplatni další voucher v kroku 4 → souhrn se musí přepočítat (do ~10 s nebo okamžitě via Livewire event).
- Bez ručního refreshe.
SC-19 · Definitivní souhrn financí + QR v kroku Hotovo
Section titled “SC-19 · Definitivní souhrn financí + QR v kroku Hotovo”Příprava: Event po potvrzení výsledků, moderátor má vyplněný variable_symbol a aktivní AAD s company_id, který má bankovní účet v config/fio-api.php.
- Po potvrzení se panel přepne na krok Hotovo.
- Souhrn financí zobrazuje stejné dlaždice, bez badge „(předběžný)”.
- Hodnoty čerpané z
GeneralPaymentřádků (Vybráno = abs(quizz_regular), Odměna = wage+tip+bonus+fine, Voucher = voucher_redemption). - Pokud
Poslat > 0a QR předpoklady splněné → ukáže se sekce „Pošli platbu hned teď” s QR kódem. - QR detaily: částka, variabilní symbol, číslo účtu (CZK) nebo IBAN+SWIFT (EUR), zpráva pro příjemce ve formátu
VS - jméno. - Skenuj QR mobilní bankou → částka, VS, účet odpovídají.
- Pokud
Poslat = 0anet_balance < 0→ blok „Chytrý Kvíz Ti pošle peníze” s částkou. - Pokud bilance je nulová → blok „Vyúčtováno”.
Edge cases
Section titled “Edge cases”- Moderátor bez
variable_symbol→ blok říká „Nemáte nastavený variabilní symbol.” - Moderátor bez aktivního AAD → „Chybí účetní detaily moderátora.”
- Bank config chybí pro currency+company → „Pro tuto kombinaci měny a společnosti není nastavený bankovní účet.”
SC-20 · Kontakty podpory v kroku Čekání
Section titled “SC-20 · Kontakty podpory v kroku Čekání”Příprava: Admin → Obecné nastavení → vyplnit Kontakty podpory (e-mail / telefon / WhatsApp).
- Otevři event PLAY ve kterém je moderátor ve fázi Čekání (po stažení, před výsledky).
- V dolní části panelu sekce Podpora s nadpisem.
- Tři tlačítka (pokud všechny vyplněny):
- E-mail →
mailto:link - Telefon →
tel:link (hrefmá whitespace odstraněný) - WhatsApp →
https://wa.me/<digits-only>v novém panelu
- E-mail →
- Vymaž e-mail v adminu → tlačítko zmizí, ostatní zůstanou.
- Vymaž všechny tři → celý blok Podpora se skryje.
SC-21 · Zámek navigace po potvrzení
Section titled “SC-21 · Zámek navigace po potvrzení”Příprava: Event po potvrzení výsledků (krok Hotovo).
- Progress indikátor zobrazuje všech 5 kroků.
- Klikni na předchozí krok (1, 2, 3, 4) → nereaguje. Cursor
not-allowed, lehce ztlumený opacity. - Klikni na krok 5 → reaguje (zůstane na 5).
- Po refreshi stránky panel iniciuje rovnou krok 5 (
$hasResults = true). - Žádné dlaždice / formuláře z kroků 1-4 nesmí být v DOM aktivní (jsou tam, ale
x-show="step === N"zaručí skrytí — ověř že nejsou viditelné).
SC-22 · Počasí v open-air podniku (krok Čekání)
Section titled “SC-22 · Počasí v open-air podniku (krok Čekání)”Příprava: Podnik s vyplněnými souřadnicemi (pubs.lat, pubs.lng). Event nebo jeho blueprint má příznak is_open_air = true. Event je dnes nebo v rozpětí konfigurovaného horizontu (config('weather.forecast_horizon_days'), výchozí 14 dní). Aktuální čas je před začátkem eventu (jinak panel přeskočí krok Čekání). Cache zarovnání: před testem případně php artisan cache:clear, jinak je odpověď cachovaná na weather.cache_ttl_minutes (výchozí 360 min) podle klíče weather:forecast:{pub_id}:{Y-m-d-H}.
SC-22a · Vykreslení dlaždice (happy path)
Section titled “SC-22a · Vykreslení dlaždice (happy path)”- Otevři panel moderátora pro open-air event v kroku Čekání.
- V hlavní mřížce dlaždic se zobrazí dlaždice Počasí na termín.
- Ikona odpovídá
iconKey(sunny/cloudy/fog/rain/snow/storm) podle weather code z Open-Meteo. - První řádek obsahuje teplotu (°C), pravděpodobnost srážek (%) a rychlost větru (km/h) zaokrouhlené na celé číslo.
- Druhý řádek obsahuje český popis (Jasno / Polojasno až oblačno / Mlha / Déšť / Sníh / Přeháňky / Bouřka).
Očekávání:
- Hodnoty odpovídají reálnému forecastu pro souřadnice podniku v hodině startu eventu.
- Ikona barevně neutrální (text-gray-400), rámeček dlaždice neutrální.
SC-22b · Skryté pro non-open-air podnik
Section titled “SC-22b · Skryté pro non-open-air podnik”Příprava: Stejný podnik, event s is_open_air = false (a blueprint také false).
- Otevři krok Čekání.
Očekávání:
- Dlaždice Počasí není v DOM vůbec — blok je gatován
@if($isOpenAir && $weather).
SC-22c · Skryté při chybějících souřadnicích
Section titled “SC-22c · Skryté při chybějících souřadnicích”Příprava: Open-air event v podniku, kde pubs.lat nebo pubs.lng je NULL.
- Otevři krok Čekání.
Očekávání:
- Dlaždice Počasí se nezobrazí (service vrátí
nullpřed voláním API). - V
storage/logs/laravel.lognení chybový záznam — service se zastaví před voláním Open-Meteo.
SC-22d · Skryté mimo horizont forecastu
Section titled “SC-22d · Skryté mimo horizont forecastu”Příprava: Open-air event naplánovaný více než weather.forecast_horizon_days dní dopředu (např. 20 dní).
- Otevři krok Čekání.
Očekávání:
- Dlaždice Počasí se nezobrazí.
- Žádná chyba v logu.
SC-22e · Skryté pro událost v minulosti
Section titled “SC-22e · Skryté pro událost v minulosti”Příprava: Open-air event z předchozího dne (např. start_time o den dříve).
- Otevři krok Čekání (pokud panel ještě tento krok ukazuje).
Očekávání:
- Dlaždice Počasí se nezobrazí (service vrátí
nullpokuddiffInDays > 0směrem do minulosti).
SC-22f · Nepříznivé počasí (adverse warning)
Section titled “SC-22f · Nepříznivé počasí (adverse warning)”Příprava: Open-air event a počasí splňující alespoň jednu podmínku WeatherSnapshot::isAdverse():
precipitation_probability > 60weatherCode∈ {95, 96, 99} (bouřka)wind_speed_10m > 50km/h
Postup pro nasimulování: spusť test scénář v lokálu s Http::fake([...]) (viz tests/Feature/Livewire/Moderator/WaitingRoomTest.php), nebo počkej na reálné nepříznivé počasí v podniku.
- Otevři krok Čekání.
Očekávání:
- Rámeček dlaždice v amber barvě (
border-amber-400 bg-amber-50). - Ikona v amber barvě.
- Pod hodnotami se přidá text: „Zvažte krytí nebo náhradní místo.”
SC-22g · Selhání API (síťová chyba / non-2xx odpověď)
Section titled “SC-22g · Selhání API (síťová chyba / non-2xx odpověď)”Příprava: Test scénář v dev prostředí — dočasně přesměrovat WEATHER_API_URL v .env na neexistující endpoint, nebo využít Http::fake ve vývojovém prostředí. Cache vyprázdnit (php artisan cache:clear) nebo počkat na expiraci.
- Otevři krok Čekání pro open-air event.
Očekávání:
- Dlaždice Počasí se nezobrazí (service vrátí
nullpřiConnectionExceptionneboRequestException). - V
storage/logs/laravel.logpřibude WARNINGweather fetch failedspub_id,when,error. - Žádná 500 chyba na panel — chyba je odchycena a uživatel vidí panel bez počasí.
SC-22h · Cache (TTL)
Section titled “SC-22h · Cache (TTL)”Příprava: Open-air event, předchozí načtení proběhlo úspěšně (klíč weather:forecast:{pub_id}:{Y-m-d-H} existuje v cache).
- Otevři krok Čekání podruhé (do 6 hodin od prvního načtení při výchozím
cache_ttl_minutes=360).
Očekávání:
- Dlaždice Počasí se zobrazí okamžitě (čte z cache, žádný HTTP request neproběhl).
- V
storage/logs/laravel.lognení nový záznam oweather fetch. - Test ověření: smaž manuálně klíč v Redisu (
redis-cli del weather:forecast:{pub_id}:{Y-m-d-H}) a opětovně načti — nyní proběhne nový request.
Regresní checklist
Section titled “Regresní checklist”Po testování výše ověřit, že tyto oblasti nespadly:
- Výsledky zadané na starém UI (separátní stránka) – existující záznamy v DB stále zobrazeny
- Sidebar moderátora: badge (součet urgencí) se aktualizuje po zadání výsledků
- Milníky v kroku 5 zobrazeny pro správný event / blueprint
- PDF export týmů (
/quizz/{event}/teams) stále funkční - PDF milníků (
/quizz/{event}/milestones/pdf) stále funkční - Záložka Rezervace – edit stolu u standing rezervace funguje
- Speciál s
special.bonus > 0→ bonus viditelný v kroku 5 (MODERATOR_TIPneboBONUSzahrnut v Moje odměna) - Voucher uplatněný v Potvrzení se objeví v Souhrnu financí jako „Z toho vouchery”
- QR kód funguje pro CZK i EUR moderátora (formát domestic vs international)
- Open-air event v podniku se souřadnicemi → dlaždice Počasí v kroku Čekání s aktuálním forecastem
- Non-open-air event → dlaždice Počasí se vůbec nezobrazí
- Selhání Open-Meteo API → panel se vyrenderuje bez dlaždice Počasí, žádné 500
Automatizované testy
Section titled “Automatizované testy”docker-compose exec fpm php artisan test tests/Feature/Moderator/ --compactdocker-compose exec fpm php artisan test --filter=ModeratorPanel --compact
# Nově přidané testy souvisejí s finančním souhrnem a vouchery:docker-compose exec fpm php artisan test tests/Feature/Services/Moderator/EventFinanceSummaryTest.php --compactdocker-compose exec fpm php artisan test tests/Feature/Moderator/QuizzStepperFinancialSummaryTest.php --compactdocker-compose exec fpm php artisan test tests/Feature/Livewire/Moderator/VoucherStepTest.php --compactdocker-compose exec fpm php artisan test tests/Feature/Notifications/OnboardAnonymousTest.php --compact