Skip to content

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.


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.

OblastStarý layoutNový panel
LayoutJedna stránka, vše pohromadě, sekce pomocí class="hidden"Tab struktura (Kvíz / Rezervace / Týmy / Nastavení / Statistiky)
Záložka KvízSekce skryté JS-em, nejasná posloupnostStepper 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í
SidebarStatické menuUnified worklist s urgencemi (červená/oranžová/žlutá/modrá/šedá)
Krok ČekáníNeexistoval — moderátor jen čekal s prázdnou stránkouAktivní 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 groupedCreateLivewire results-entry přímo v kroku 3
VoucheryVlastní URL / dialogKrok 4, výběr týmu omezený jen na týmy s výsledkem
Pořadí při remízeManuální editace v tabulceDrag & drop řazení v kroku 4
Finanční přehledNikde — 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ízuModerátor si musel pamatovat VS a sám sestavit příkazQR 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ětPř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

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.

  1. Otevři event v panelu → ověř 5 záložek v hlavičce.
  2. Záložka Kvíz → krok 1 aktiven, tlačítko Stáhnout.
  3. Klikni Stáhnout → soubor se uloží, krok 1 se označí jako dokončený.
  4. Záložka Kvíz → krok 2 Výsledky aktivní.
  5. Přidej alespoň 2 týmy s výsledky a počtem hráčů.
  6. Klikni Pokračovat → krok 3 (Vouchery) aktivní.
  7. Klikni Přeskočit → krok 4 (Potvrzení) aktivní.
  8. Tabulka výsledků zobrazena, poznámka k dispozici.
  9. 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).

  1. Otevři event → červený banner nahoře.
  2. Krok 1 tlačítko Stáhnout je disabled nebo skryto.
  3. 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.

  1. Otevři aktuální event → oranžový banner s tlačítky na chybějící eventy.
  2. Krok 1 disabled.
  3. Klikni na tlačítko u chybějícího eventu → přesměruje na ten event.
  4. Zadej výsledky u starého eventu (SC-01 bez kroku Stažení).
  5. 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í

Příprava: Event naplánovaný na příští týden.

  1. Otevři event → modrý banner „Příliš brzy” s datem od kdy.
  2. Krok 1 disabled.
  3. 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).

  1. Otevři event → oranžový banner „Event pozastaven”.
  2. Banner obsahuje odkaz na detail ChangeRequestu (pokud admin).
  3. Krok 1 disabled.
  4. Admin vyřeší ChangeRequest → ověř, že event přešel zpět na status=active.
  5. Obnov stránku → banner zmizel, krok 1 aktivní.

Příprava: Nastavit status=canceled na eventu (admin panel nebo tinker).

  1. Otevři event → šedý banner „Event zrušen”.
  2. Krok 1 disabled, krok 2 disabled.
  3. 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.

  1. Otevři event → modrý banner s odpočtem do 12:00.
  2. 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í.

  1. Otevři event → oranžový banner varování.
  2. Tlačítko Stáhnout je aktivní (není blokováno).
  3. Celý průchod SC-01 funguje.

Příprava: Blueprint s frequency=none.

  1. Záložka Nastavení obsahuje sekci Plánování termínů s formulářem Nový termín.
  2. Přidej nový termín (datum + čas v budoucnosti).
  3. Event se vytvoří a objeví v menu.
  4. 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_SCHEDULING v sidebar menu

Příprava: Nepravidelný blueprint bez budoucího eventu.

  1. Levé menu → sekce Moderátor → blueprint zobrazen žlutě.
  2. Klik na řádek blueprintu → přesměruje přímo na formulář nového termínu.

Příprava: Event s special_id a type=Tournament.

  1. Záložka Nastavení chybí (nebo je prázdná) – speciály nemají plánování termínů.
  2. Záložka Statistiky nezdrazuje local league standings.
  3. Průchod kroků 1–5 funkční.
  4. Krok 5 – odměna počítána z special.moderator_reward × player_count, ne ze standardní formule.

Příprava: Event s special_id, type=Series, rodičovský speciál má více kol.

  1. V panelu viditelná navigace mezi koly seriálu.
  2. Výsledky se zadávají zvlášť za každé kolo.
  3. 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.

  1. Otevři URL eventu /moderator/quizz/{id}.
  2. Očekávání: 403 Forbidden nebo přesměrování, ne prázdný panel.

Příprava: Event s hlavním moderátorem a co-moderátorem přidaným přes moderators() pivot.

  1. Přihlásit jako co-moderátor.
  2. Panel přístupný.
  3. Stáhnout kvíz → funkční.
  4. Zadat výsledky → funkční.
  5. Potvrzení výsledků → odměna přiřazena správnému moderátorovi (ověřit v Platby).

Příprava: Blueprint s is_summer_break = true → všechny budoucí eventy status=on_hold.

  1. Otevři budoucí event blueprintu → oranžový banner EventOnHold.
  2. Banner (nebo poznámka) zmiňuje letní přestávku.
  3. 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.

  1. Otevři krok Potvrzení.
  2. Ověř, že je zobrazen blok Souhrn financí s badgem (předběžný).
  3. 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)
  4. Pokud existuje uplatněný voucher: pod částkou Vybráno se zobrazí řádek Z toho uplatněné vouchery.
  5. Uplatni další voucher v kroku 4 → souhrn se musí přepočítat (do ~10 s nebo okamžitě via Livewire event).
  6. 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.

  1. Po potvrzení se panel přepne na krok Hotovo.
  2. Souhrn financí zobrazuje stejné dlaždice, bez badge „(předběžný)”.
  3. Hodnoty čerpané z GeneralPayment řádků (Vybráno = abs(quizz_regular), Odměna = wage+tip+bonus+fine, Voucher = voucher_redemption).
  4. Pokud Poslat > 0 a QR předpoklady splněné → ukáže se sekce „Pošli platbu hned teď” s QR kódem.
  5. QR detaily: částka, variabilní symbol, číslo účtu (CZK) nebo IBAN+SWIFT (EUR), zpráva pro příjemce ve formátu VS - jméno.
  6. Skenuj QR mobilní bankou → částka, VS, účet odpovídají.
  7. Pokud Poslat = 0 a net_balance < 0 → blok „Chytrý Kvíz Ti pošle peníze” s částkou.
  8. Pokud bilance je nulová → blok „Vyúčtováno”.
  • 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).

  1. Otevři event PLAY ve kterém je moderátor ve fázi Čekání (po stažení, před výsledky).
  2. V dolní části panelu sekce Podpora s nadpisem.
  3. Tři tlačítka (pokud všechny vyplněny):
    • E-mailmailto: link
    • Telefontel: link (href má whitespace odstraněný)
    • WhatsApphttps://wa.me/<digits-only> v novém panelu
  4. Vymaž e-mail v adminu → tlačítko zmizí, ostatní zůstanou.
  5. Vymaž všechny tři → celý blok Podpora se skryje.

Příprava: Event po potvrzení výsledků (krok Hotovo).

  1. Progress indikátor zobrazuje všech 5 kroků.
  2. Klikni na předchozí krok (1, 2, 3, 4) → nereaguje. Cursor not-allowed, lehce ztlumený opacity.
  3. Klikni na krok 5 → reaguje (zůstane na 5).
  4. Po refreshi stránky panel iniciuje rovnou krok 5 ($hasResults = true).
  5. Žá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)”
  1. Otevři panel moderátora pro open-air event v kroku Čekání.
  2. V hlavní mřížce dlaždic se zobrazí dlaždice Počasí na termín.
  3. Ikona odpovídá iconKey (sunny/cloudy/fog/rain/snow/storm) podle weather code z Open-Meteo.
  4. První řádek obsahuje teplotu (°C), pravděpodobnost srážek (%) a rychlost větru (km/h) zaokrouhlené na celé číslo.
  5. 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í.

Příprava: Stejný podnik, event s is_open_air = false (a blueprint také false).

  1. 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.

  1. Otevři krok Čekání.

Očekávání:

  • Dlaždice Počasí se nezobrazí (service vrátí null před voláním API).
  • V storage/logs/laravel.log není chybový záznam — service se zastaví před voláním Open-Meteo.

Příprava: Open-air event naplánovaný více než weather.forecast_horizon_days dní dopředu (např. 20 dní).

  1. 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).

  1. 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í null pokud diffInDays > 0 smě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 > 60
  • weatherCode ∈ {95, 96, 99} (bouřka)
  • wind_speed_10m > 50 km/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.

  1. 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.

  1. Otevři krok Čekání pro open-air event.

Očekávání:

  • Dlaždice Počasí se nezobrazí (service vrátí null při ConnectionException nebo RequestException).
  • V storage/logs/laravel.log přibude WARNING weather fetch failed s pub_id, when, error.
  • Žádná 500 chyba na panel — chyba je odchycena a uživatel vidí panel bez počasí.

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).

  1. 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.log není nový záznam o weather 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.

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_TIP nebo BONUS zahrnut 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

Terminal window
docker-compose exec fpm php artisan test tests/Feature/Moderator/ --compact
docker-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 --compact
docker-compose exec fpm php artisan test tests/Feature/Moderator/QuizzStepperFinancialSummaryTest.php --compact
docker-compose exec fpm php artisan test tests/Feature/Livewire/Moderator/VoucherStepTest.php --compact
docker-compose exec fpm php artisan test tests/Feature/Notifications/OnboardAnonymousTest.php --compact