Co je tato mapa?
Toto je živý přehled toho, jak celý systém TýmDejvid funguje — kdo co smí dělat, jak probíhají platby kredity, kam vedou jednotlivé stránky a co se stane při registraci nového člena. Slouží jako referenční dokument pro tebe jako admina — abys vždy věděl proč se něco chová tak jak se chová.
Prakticky: Když někdo napíše „nemohu se přihlásit na trénink" nebo „nevidím záložku Kredity" — tato mapa ti přesně ukáže proč, jakou má roli a co mu chybí.
1
Role a jejich pravomoce
Co je to „role" a proč existuje?
Každý uživatel v systému má přiřazenou roli — jednoduché označení, které říká co smí a co nesmí dělat. Role je uložena přímo na jeho účtu v databázi (Firestore) jako textové pole. Systém ji čte při každém přihlášení a podle ní zobrazuje nebo skrývá funkce, stránky a tlačítka.
Bez správné role se uživatel nikam nedostane — to je záměr. Bezpečnost je řízena rolí, ne heslem. I kdyby někdo znal URL stránky /admin.html, bez role admin nebo coach neuvidí nic nebo bude přesměrován pryč.
Bez správné role se uživatel nikam nedostane — to je záměr. Bezpečnost je řízena rolí, ne heslem. I kdyby někdo znal URL stránky /admin.html, bez role admin nebo coach neuvidí nic nebo bude přesměrován pryč.
Příklad: Jana Konturová má roli organizer (Administrativní tým). Vidí plný detail členů, členství a recenze — ale nemá přístup ke kontaktní databázi, financím, dotazníkům ani tréninkovému panelu. Přesně jak bylo zamýšleno.
Admin
∞ kredit
David
role = "admin"
- 🔓Plný přístup ke všemu v systému
- 🏋Spravuje všechny tréninky (dospělí + děti)
- 👤Správa členů, rolí, schvalování účtů
- 💰Finance, faktury, sklad, kemp
- 📋Dotazníky, závody, koučink plány
- ✏️Editace kreditů, docházky, manuální korekce
- 🗑Trvale maže účty (zamítnutí)
- ⚙️Nastavuje role a příznaky dalším uživatelům
- ∞Neomezené kredity — neplatí za tréninky
Jediná role s absolutně neomezeným přístupem. Jen ty (David) bys měl mít tuto roli. Nikdy ji nedávej nikomu jinému — dává plnou kontrolu nad celým systémem včetně mazání dat a správy peněz.
Coach
∞ kredit
Hlavní trenér
role = "coach"
- 🏋Vytváří/edituje tréninky (dospělí + děti)
- 📊Admin panel — statistiky, přehled
- 👥Plná správa docházky a prezenčky
- 💳Označuje platby na prezenčce
- 💬Trenérské poznámky ke každému členu
- 🖨Tisk + sdílení prezenčky (PNG, WhatsApp…)
- 🏆Závody admin, race plan, koučink plány
- ∞Neomezené kredity — neplatí za tréninky
- ❌Finance, faktury, dotazníky, kemp admin
Hlavní trenér (např. Vašek Pilát). Může dělat prakticky vše co ty v rámci tréninků — ale do financí, dotazníků nebo kempu nemá přístup. Vhodné pro trenéry kteří vedou tréninky a koučink.
Trenér obojí
platí kredit
Trenér (oba typy)
role = "trainer_both"
- 🏋Spravuje dospělé + dětské tréninky
- 📊Vidí admin panel
- 👥Správa docházky, prezenčky
- 🏆Závody admin
- 💳Platí 1 kredit za každý navštívený trénink
- ❌Finance, faktury, dotazníky, kemp
Trenér který vede jak dospělé tak dětské skupiny. Platí kredit jako běžný člen — pokud to nechceš, nastav mu příznak isAdminTeam nebo mu přiřaď roli coach.
Trenér dospělí
platí kredit
Trenér dospělých
role = "trainer_adults"
- 🏋Spravuje POUZE dospělé tréninky
- 📊Vidí admin panel
- 👥Správa docházky dospělí
- 💳Platí 1 kredit za každý navštívený trénink
- ❌Žádný přístup k dětským tréninkům
- ❌Finance, dotazníky, kemp
Trenér specializovaný jen na dospělé skupiny. Záměrně nevidí ani spravuje nic z dětské přípravky — to je případ kdy chceš aby trenér měl jen svůj prostor.
Trenér děti
platí kredit
Trenér přípravky
role = "trainer_children"
- 🏋Spravuje POUZE dětské tréninky
- 📊Vidí admin panel — jen přípravka
- 👥Správa docházky dětí + kreditů rodičů
- 💰Finance jen pro přípravku (oddělené od dospělých)
- 💳Platí 1 kredit za každý navštívený trénink
- ❌Žádný přístup k dospělým tréninkům ani jejich datům
- ❌Finance dospělých, dotazníky, kemp
Trenér přípravky — vidí a spravuje jen svět dětí. Typicky kouč dětských skupin jako Beruška, Stonožka apod. Dospělé tréninky se mu vůbec nezobrazují. Kredity přípravky jsou oddělený systém — rodič má zvlášť kredit pro dospělé a zvlášť dětský kredit.
Administrativní tým
∞ kredit
Organizátor / Adm. tým
role = "organizer"
- 👤Vidí PLNÝ detail všech běžců (docházka, kredity)
- 🏃Organizuje vlastní skupinové výběhy
- 📇Přístup ke členství a recenzím
- ❌Kontakty / CRM — pouze admin
- ∞Neomezené kredity — neplatí za tréninky
- ❌Admin panel tréninků, netvoří tréninky
- ❌Finance, faktury, dotazníky, kemp
Tato role je pro administrativní tým — lidi jako Jan Mügl, kteří pomáhají s organizací, komunikací nebo závodit. Vidí vše o členech (docházka, kredity), schvalují členství a recenze, ale tréninky neřídí a do kontaktní databáze nemají přístup. Mají neomezené kredity protože platit by nedávalo smysl.
Člen
platí kredit
Běžec / Člen klubu
role = "user"
- 📅Přihlašuje se na tréninky
- 💳Platí 1 kredit za každý navštívený trénink
- 📊Vidí vlastní profil, docházku, PR, závody
- 📰Čte novinky, feed, reaguje na příspěvky
- 🖼Sdílí prezenčku jako PNG obrázek
- 🏆Race plan (závodní plány)
- ❌Nevidí detaily jiných členů
- ❌Žádný admin panel, žádná správa
Klasický člen klubu — běžec který přichází na tréninky. Vidí jen co se týká jeho samotného. Nevidí ostatní, nespravuje nic. Platí kredit za každý trénink který navštíví.
Koučink
∞ kredit
Klient koučinku
role = "user" + hasTrainingPlan
- 🎯Aktivní individuální tréninkový plán
- ∞Neomezené kredity (flag hasTrainingPlan = true)
- 📋Plán nastavuje trenér v /koucink.html
- 📅Přihlašuje se na tréninky normálně
- 🏆Race plány, PR tracking, profil
- ⚠️Jinak stejná práva jako běžný člen
- ⚠️Po ukončení plánu → hasTrainingPlan = false
Člen s individuálním plánem — platí paušál za koučink, takže tréninky jsou v ceně. Nemá speciální roli, jen mu je zapnut příznak „hasTrainingPlan" a systém pak automaticky přestane strhávat kredity. Nastavuješ to ty v sekci Koučink.
Čekající
— kredit
Nový zájemce
role = "pending"
- ⏳Vyplnil registraci, čeká na schválení adminem
- 🔒Velmi omezený přístup do appky
- ❌Žádné tréninky, žádné kredity
- ✅Admin schválí → automaticky role = "user"
- 🗑Admin může zamítnout → role = "rejected"
Přechodný stav po registraci. Systém automaticky pošle notifikaci tobě. V sekci Členství vidíš seznam čekajících — schválíš nebo zamítneš jedním kliknutím. Čekající vidí aplikaci, ale nemohou se přihlásit na tréninky.
Rodič
— kredit
Rodič dítěte
role = "parent"
- 🧒Vidí docházku svého dítěte
- 📋Nástěnka přípravky (parentBoard) — čte + komentáře
- 📅Vidí termíny tréninků dětí
- 💬Komunikace s trenérem přípravky
- ❌Žádné tréninky dospělých
- ❌Žádné kredity, žádné platby
- 🔗Kombinuje se: member_parent = rodič + běhá sám
Rodič dítěte v přípravce — vidí jen agendu Kids. Pokud sám taky běhá s týmem dospělých, dostane combo roli member_parent a má pak práva obojí. V databázi se rozpoznává podle pole
role nebo skupina = "pripravka" (zpětná kompatibilita).
Kurz
— kredit
Účastník kurzu
role = "course_student"
- 🎓Plný přístup do členské sekce kurzu
- ▶️Sleduje video lekce, označuje hotové
- 📊Zápis vlastního pokroku (courseProgress)
- ⏱Přístup po dobu kurzu + 6 měsíců
- ❌Není členem klubu (žádné tréninky)
- 🔗Combo: course_student_member, _parent, _external_coaching
Klient placeného kurzu — má přístup k týdnům, cvikům, video lekcím a tipům. Po expiraci (kurz + 6 měsíců) automaticky převést na course_student_readonly. 8 combo variant pro kombinace s členstvím/rodičovstvím.
Kurz RO
— kredit
Bývalý účastník kurzu
role = "course_student_readonly"
- 👁Čtení obsahu kurzu (pasivní přístup)
- ❌Žádný zápis pokroku
- ❌Žádné označování hotových cvičení
- 🔗Combo: course_student_readonly_member, _parent
Konečný stav po vypršení kurzu. Klient si může obsah pořád prohlížet (videa, cvičení, materiály), ale systém už nepřijímá žádný zápis — aby data o pokroku zůstala zachycena ve stavu při ukončení.
Zamítnutý
— kredit
Zamítnutý žadatel
role = "rejected"
- 🚫Zablokovaný — žádný přístup do systému
- 🗑Admin může trvale smazat z databáze
- ❌Žádná práva, žádná komunikace
Konečný stav zamítnutého žadatele. Nemá přístup nikam. V sekci Členové je tlačítko pro hromadné smazání všech zamítnutých — pro čistotu databáze.
Zkratka canManageAudience():
Admin / Coach / trainer_both → spravuje dospělé i děti ·
trainer_adults → pouze dospělí ·
trainer_children → pouze děti ·
Organizátor / Člen → žádné spravování tréninků
2
Speciální příznaky (flags) na uživateli
Co jsou „příznaky" a jak se liší od rolí?
Zatímco role určuje co uživatel dělá (trenér, člen, admin…), příznaky jsou jako extra štítky které upravují chování nad rámec role. Uloženy jsou přímo na uživatelském dokumentu v databázi jako pole
Příznak si představ jako přepínač — zapneš ho a systém se začne chovat jinak. Nová role není potřeba. Díky tomu lze mít např. běžného člena (role = "user") který má tréninkový plán a platit nemusí — stačí přepnout jeden příznak.
true/false.Příznak si představ jako přepínač — zapneš ho a systém se začne chovat jinak. Nová role není potřeba. Díky tomu lze mít např. běžného člena (role = "user") který má tréninkový plán a platit nemusí — stačí přepnout jeden příznak.
Příklad: Josef Brejcha, role = "user" (běžný člen). Koupí si kemp a v ceně jsou tréninky zdarma. Zapneš mu hasTrainingPlan na dobu kempu → vidí ∞ kredity → při docházce se nic nestrhává. Po kempu přepínač vypneš.
isAdminTeam = true
Administrativní tým — zobrazí se badge v profilu.
∞ Administrativní tým
Efekt: neomezené kredity, žádné odečítání za tréninky.
Efekt: vidí plný detail všech běžců (docházka, kredity).
Nastavuje: Admin v profilu člena — toggle tlačítko
∞ Administrativní tým
Efekt: neomezené kredity, žádné odečítání za tréninky.
Efekt: vidí plný detail všech běžců (docházka, kredity).
Nastavuje: Admin v profilu člena — toggle tlačítko
hasTrainingPlan = true
Aktivní tréninkový plán — badge "Tréninkový plán".
∞ Tréninkový plán
Efekt: neomezené kredity, žádné odečítání za tréninky.
Synchronizuje se automaticky z /koucink.html.
Aktivace/deaktivace: trenér při nastavení/ukončení plánu
∞ Tréninkový plán
Efekt: neomezené kredity, žádné odečítání za tréninky.
Synchronizuje se automaticky z /koucink.html.
Aktivace/deaktivace: trenér při nastavení/ukončení plánu
profileVisibility = {…}
Soukromí profilu — člen si sám nastavuje viditelnost.
Pole:
Admin a coach vidí vždy vše bez ohledu na toto nastavení.
Nastavuje: sám člen v záložce Profil → Soukromí
Pole:
records, races, feedPosts, stats (true/false).Admin a coach vidí vždy vše bez ohledu na toto nastavení.
Nastavuje: sám člen v záložce Profil → Soukromí
skupina = "pripravka"
Zpětná kompatibilita pro rodiče — staré účty rodičů neměly roli „parent", jen pole
Nové účty: nastav rovnou
Nastavuje: legacy field, ručně neměnit
skupina = "pripravka". Rules to stále akceptují.Nové účty: nastav rovnou
role = "parent".Nastavuje: legacy field, ručně neměnit
childIds = ["..."]
Vazba rodič → dítě — pole obsahuje IDčka dětí které rodič spravuje.
Rules helper
Nastavuje: admin při schvalování registrace rodiče
Rules helper
isParentOf(childId) kontroluje členství v tomto poli.Nastavuje: admin při schvalování registrace rodiče
notifGate = {…}
Filtr push notifikací — uživatel si vypíná jednotlivé kategorie (závody, novinky, kemp…).
Server před odesláním kontroluje funkcí
Vypnuté kategorie se zalogují do
Nastavuje: každý uživatel v Profil → Notifikace
Server před odesláním kontroluje funkcí
checkNotifGate().Vypnuté kategorie se zalogují do
notificationLog s důvodem „gated".Nastavuje: každý uživatel v Profil → Notifikace
Logika ∞ kreditů
Neomezené kredity =
Zobrazuje ∞ místo čísla v UI.
Žádná automatická dedukce při docházce/platbě.
Manuální přidání kreditů stále možné pro evidenci.
isAdminTeam === true NEBO hasTrainingPlan === true.Zobrazuje ∞ místo čísla v UI.
Žádná automatická dedukce při docházce/platbě.
Manuální přidání kreditů stále možné pro evidenci.
3
Matice pravomocí
Jak číst tuto tabulku?
Každý řádek = jedna funkce nebo akce v systému. Každý sloupec = jedna role. ✓ zelená = plný přístup. ✗ šedá = žádný přístup. Žlutá = podmíněný přístup (záleží na audienci tréninku, nastavení soukromí apod.).
Tabulka ti pomůže rychle odpovědět na otázky jako: „Může Vašek tisknout prezenčku?" → Coach → Tisk → ✓ Ano. Nebo: „Vidí Jana finance?" → Organizer → Finance → ✗ Ne.
Tabulka ti pomůže rychle odpovědět na otázky jako: „Může Vašek tisknout prezenčku?" → Coach → Tisk → ✓ Ano. Nebo: „Vidí Jana finance?" → Organizer → Finance → ✗ Ne.
| Funkce / Akce | Admin | Coach | Trenér P. | Organiz. | Člen | Koučink (+ plan) |
Čekající |
|---|---|---|---|---|---|---|---|
| Dashboard & Feed | |||||||
| 📰 Dashboard / novinky | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | omez. |
| 💬 Reagovat na příspěvky (like, komentář) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ |
| 📢 Vytvořit příspěvek / anketu | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ |
| Tréninky | |||||||
| 📅 Přihlásit se na trénink | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ |
| ➕ Vytvořit trénink (dospělí) | ✓ | ✓ | trainer_adults trainer_both | ✗ | ✗ | ✗ | ✗ |
| ➕ Vytvořit trénink (děti) | ✓ | ✓ | trainer_children trainer_both | ✗ | ✗ | ✗ | ✗ |
| 🏃 Organizovat skupinový výběh | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ |
| 📊 Admin panel tréninků | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ |
| Prezenčka & Docházka | |||||||
| 👥 Zobrazit prezenční listinu | ✓ | ✓ | jen svoji skupinu | ✗ | pouze sdílet | pouze sdílet | ✗ |
| ✅ Označit přítomnost / docházku | ✓ | ✓ | jen svoji skupinu | ✗ | ✗ | ✗ | ✗ |
| 💳 Označit platbu na prezenčce | ✓ | ✓ | jen svoji skupinu | ✗ | ✗ | ✗ | ✗ |
| 🖨 Tisknout / sdílet prezenčku (PNG) | ✓ | ✓ | ✓ | ✗ | ✓ | ✓ | ✗ |
| 💬 Trenérské poznámky ke členu | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ |
| Členové & Profily | |||||||
| 🏃 Plný detail běžce (kredity, docházka, správa) | ✓ | ✓ | jen svoji skupinu | ✓ | ✗ | ✗ | ✗ |
| 👤 Veřejný profil jiného člena (PR, závody) | ✓ | ✓ | ✓ | ✓ | dle soukromí | dle soukromí | ✗ |
| ⚙️ Nastavit roli / flag jinému uživateli | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| 🗑 Schválit / zamítnout / smazat účet | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| Kreditový systém | |||||||
| 💳 Zaplatit kredit za trénink | ∞ (zdarma) | ∞ (zdarma) | ✓ platí | ∞ (zdarma) | ✓ platí | ∞ (zdarma) | ✗ |
| ➕ Přidat kredity jinému uživateli | ✓ | ✓ | jen svoji skupinu | ✗ | ✗ | ✗ | ✗ |
| ✏️ Editovat / mazat záznam kreditů | ✓ | ✓ | jen svoji skupinu | ✗ | ✗ | ✗ | ✗ |
| ➖ Manuální odečtení kreditu | ✓ | ✓ | jen svoji skupinu | ✗ | ✗ | ✗ | ✗ |
| Správa & Admin sekce | |||||||
| 💰 Finance / fakturace | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| 📋 Dotazník admin (Kurz/Koučink/Členové) | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| 🏕 Kemp admin | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| 📦 Sklad | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| 🏆 Závody admin | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ |
| 🎯 Koučink plány (správa) | ✓ | ✓ | ✗ | ✗ | ✗ | jen svůj plán | ✗ |
✓ = plný přístup
✗ = žádný přístup
žlutě = částečný / podmíněný přístup
⚠ Sloupec „Trenér P." zahrnuje sub-role
⚠ Sloupec „Trenér P." zahrnuje sub-role
trainer_children, trainer_adults a trainer_both.
Kde je uvedeno „jen svoji skupinu": trainer_children vidí jen děti z přípravky a jejich rodiče,
trainer_adults vidí jen dospělé běžce. trainer_both vidí obě skupiny — stejně jako Coach.
4
Kreditový systém — kompletní tok
Jak funguje kreditový systém?
Kredity jsou předplacené vstupy na tréninky — člen si koupí balíček (permanentku) a za každý navštívený trénink se mu 1 kredit odečte. Systém si pamatuje celou historii pohybů — kdy co přibylo, kdy co ubylo, za který konkrétní trénink.
Kredit se neodečítá automaticky při přihlášení — jen při skutečné platbě nebo označení přítomnosti. Člen se tedy může přihlásit i bez kreditů (třeba zaplatí hotově u tréninku). Trenér pak na prezenčce označí jakým způsobem zaplatil.
Někteří členové mají neomezené kredity (∞) — to platí pro admina, coache, administrativní tým a klienty s individuálním tréninkovým plánem. Systém u nich žádné odečítání vůbec neprovádí.
Kredit se neodečítá automaticky při přihlášení — jen při skutečné platbě nebo označení přítomnosti. Člen se tedy může přihlásit i bez kreditů (třeba zaplatí hotově u tréninku). Trenér pak na prezenčce označí jakým způsobem zaplatil.
Někteří členové mají neomezené kredity (∞) — to platí pro admina, coache, administrativní tým a klienty s individuálním tréninkovým plánem. Systém u nich žádné odečítání vůbec neprovádí.
Příklad — jak to vypadá v praxi: Alena si koupí permanentku 10 tréninků za 1 500 Kč. Ty jí v profilu přidáš 10 kreditů. Každé úterý přijde na trénink, zaplatí kreditem → odečte se 1. Po 10 trénincích má 0 a potřebuje dobít. Celá historie je viditelná v detailu jejího profilu.
5
Kredity (člen)
Klesá o 1 za každý navštívený trénink
∞
Neomezené
isAdminTeam = true nebo hasTrainingPlan = true
0
Bez kreditů
Nutno dobít u admina nebo zaplatit hotově / QR
💳 💵 📱
Způsoby platby
Kredit · Hotovost · QR převod
📋 Admin přidá kredity
Admin otevře profil člena → "+ kredit" → zadá počet tréninků, Kč, způsob platby (hotovost / převod / faktura). Může zadat libovolný datum.
creditHistory.push({type:"added", sessions:N, amount:Kč, date, paymentMethod})
💰 Sync do financí
Při přidání kreditů s Kč → automatický zápis do admin_finance. Příjem je viditelný ve finančním přehledu.
collection: admin_finance · type: "income"
category: "Skupinové tréninky"
category: "Skupinové tréninky"
📅 Člen se přihlásí na trénink
Kredit se zatím NEODEČÍTÁ. Přihlásit se může i člen bez kreditu. Registrace = vyjádření zájmu.
💳 Člen zaplatí kredit
Člen klikne "Zaplatit kreditem" → odečte se 1 kredit → uloží se platební metoda (credits) k danému tréninku.
payments[trainingId] = {method:"credits", date}
credits -= 1
credits -= 1
✅ Admin označí docházku
Trenér zaznamená přítomnost v tréninku. Pokud nezaplaceno, může rovnou označit na prezenčce: 💳 Kredit nebo 💵 Hotově — odečtení proběhne automaticky.
📜 Záznam do historie
Každý pohyb kreditů (přidání i odečtení) se uloží do creditHistory s datem, typem a poznámkou. Zpětně viditelné v detailu člena.
type: "used" | "added"
trainingId, trainingType, date, note
trainingId, trainingType, date, note
↩️ Odhlášení = vrácení kreditu
Pokud se člen odhlásí z tréninku kde již zaplatil kreditem → 1 kredit se automaticky vrátí a platební záznam se smaže.
✏️ Manuální korekce (admin)
Admin může kdykoli: ✏️ upravit existující záznam (počet, datum), ➖ ručně odečíst kredit, 🗑 smazat záznam — zůstatek se automaticky přepočítá.
Tok při platbě kreditem (člen)
Trénink proběhne
Člen byl přihlášen a účastnil se
↓
credits -= 1
Automaticky při označení platby kreditem
↓
Záznam v historii
type: "used", datum, trainingId
Tok pro neomezené kredity (∞)
isAdminTeam nebo hasTrainingPlan
Flag nastaven na user dokumentu
↓
Žádné odečítání
Systém přeskočí veškerou dedukci kreditů
↓
Zobrazuje ∞
V profilu i prezenčce místo čísla
5
Mapa stránek a přístupu
Jak je aplikace rozdělena na stránky?
TýmDejvid není jedna stránka — je to více samostatných HTML souborů, každý pro jinou část systému. Při přístupu na každou stránku se kontroluje role přihlášeného uživatele. Pokud nemá oprávnění, je přesměrován na hlavní stránku nebo vidí prázdnou obrazovku.
Veřejné stránky (bez přihlášení) jsou: dotazník, kalkulačka, recenze, race-plan, kemp. Všechno ostatní vyžaduje přihlášení.
Admin-only stránky jsou chráněny dvojitě — i na straně Firebase (security rules) nestačí jen znát URL.
Veřejné stránky (bez přihlášení) jsou: dotazník, kalkulačka, recenze, race-plan, kemp. Všechno ostatní vyžaduje přihlášení.
Admin-only stránky jsou chráněny dvojitě — i na straně Firebase (security rules) nestačí jen znát URL.
Tip: Odkaz na tuto mapu (/audit-mapa.html) není nikde v navigaci — je jen pro tebe. Přístup k ní nemá žádná jiná role.
/ (index.html)
🏠 Dashboard, Feed, Profil, Tréninky
Všichni přihlášení
/admin.html
🖥 Admin dashboard — statistiky, správa
Admin
Coach
Trenéři
/clenove.html
👥 Členové — profily, skupiny, správa
Admin
Coach
Trenéři
Org.
/dotaznik-admin.html
📋 Dotazníky — Kurz / Koučink / Členové
Admin only
/finance.html
💰 Finanční přehledy a statistiky
Admin only
/faktury.html
🧾 Fakturace, platební notifikace
Admin only
/kemp.html
🏕 Běžecký kemp — registrace (veřejná)
Veřejná stránka
/kemp-admin.html
🏕 Admin správa kempu, invoicing
Admin only
/zavody-admin.html
🏆 Závody — výsledky, analýzy, grafy
Admin
Coach
Trenéři
/race-plan.html
📋 Závodní plány atletů
Veřejná (přímý odkaz)
/koucink.html
🎯 Správa koučinkových plánů
Admin
Coach
/kontakty.html
📇 Kontaktní databáze / CRM
Admin
/membership.html
💳 Schvalování členství, registrace
Admin
Org.
/recenze-admin.html
⭐ Správa recenzí
Admin
Org.
/sklad.html
📦 Sklad vybavení a materiálu
Admin only
/dotaznik.html
📝 Dotazník pro nové zájemce (veřejný)
Veřejná stránka
/kalkulacka.html
🧮 Běžecká kalkulačka temp
Veřejná stránka
/trasy-rano.html
🗺 Ranní trasy a tréninkové okruhy
Přihlášení uživatelé
/recenze.html
⭐ Recenze klubu (veřejné)
Veřejná stránka
/audit-mapa.html
🗺 Tato stránka — systémová mapa
Interní / Admin
/deti-admin.html
🧒 Správa dětí v přípravce
Admin
Coach
trainer_children
/pripravka.html
🏃♂️ Přípravka — agenda pro rodiče
Admin
Rodič
trainer_children
/rana-pece.html
🌅 Ranní péče — speciální skupina
Admin only
/kemp-admin.html
🏕 Admin správa kempu (registrace, kapacita)
Admin only
/dotaznik-koucink.html
📝 Dotazník pro nové klienty koučinku
Veřejná stránka
/dotaznik-kurz.html
📝 Dotazník pro účastníky kurzu
Veřejná stránka
/dotaznik-zavod.html
📝 Dotazník po závodě (zpětná vazba)
Přihlášení uživatelé
/orders.html
🛒 Objednávky z eshopu
Admin only
/objednavka.html
🧾 Detail objednávky (zákazník)
Veřejná (přímý odkaz)
/platba-trenink.html
💳 Platba za jednorázový trénink
Veřejná stránka
/prihlaska.html
📋 Přihláška na akci
Veřejná stránka
/firemni.html
🏢 RunFlow — firemní agenda (ČSOB, Budvar)
Admin only
/runners.html
🏃 Public žebříček běžců (externí)
Veřejná stránka
/projekty.html
📁 Projekty / agenda Davida
Admin only
/inbox.html
📥 Inbox — admin tasks, zprávy
Admin only
/cms.html
📝 CMS — editor obsahu
Admin only
/stranky.html
📄 Správa stránek (statické pages)
Admin only
/page.html
📃 Render veřejné stránky z CMS
Veřejná stránka
/vitame.html
👋 Vítací stránka pro nové externisty
Veřejná (pozvánkový link)
/welcome.html
🎉 Onboarding welcome screen
Přihlášení uživatelé
/reset-password.html
🔑 Obnovení hesla
Veřejná stránka
/analytics.html
📊 Analytics — interní statistiky
Admin only
/app-info.html
ℹ️ Info o aplikaci (verze, build)
Admin only
/app-map.html
🗺 Mapa aplikace (modulová struktura)
Admin only
/changelog.html
📜 Changelog — historie změn
Admin only
/notifikace-log.html
🔔 Log push notifikací (audit trail)
Admin only
/migrate.html
⚙️ Migrace dat (jednorázové operace)
Admin only
/import-trainings.html
📥 Import tréninků z Excelu
Admin only
/import-races.html
📥 Import závodů a edicí
Admin only
/import-race-results.html
📥 Import výsledků ze závodů
Admin only
/import-kemp.html
📥 Import dat z kempu
Admin only
/import-kemp-finance.html
📥 Import financí kempu
Admin only
/import-bank-spolek.html
📥 Import transakcí z banky spolku
Admin only
/import-stock.html
📥 Import skladu
Admin only
/marathon-day.html
🏃♀️ Maratónský den (live tracking)
Veřejná stránka
/plakat-tipovacka-2026.html
🎯 Plakát: tipovací soutěž 2026
Veřejná stránka
/ig-story-pulmaraton.html
📱 Instagram story generátor (půlmaraton)
Admin only
/add-pecky.html
🥇 Přidání medailí/pecek
Admin only
/i.html · /m.html
🔗 Krátké redirect linky (instagram, mobile)
Veřejné redirecty
/tsx-preview.html
🧪 Vývojový preview (interní testování)
Admin only
Celkem: 60 HTML stránek v
app/ ·
Pro úplný seznam: ls app/*.html ·
Tato mapa je aktuální k 18. 5. 2026.
6
Flow registrace nového člena
Jak se dostane nový člen do systému?
Nový zájemce má dvě cesty: vyplní dotazník na dotaznik.html (přijde přes kurz nebo koučink), nebo se přímo zaregistruje přes membership.html (klasické členství v klubu). V obou případech vznikne účet s rolí pending — systém čeká na tvé rozhodnutí.
Ty dostaneš push notifikaci na telefon. V sekci Členství vidíš žádost, přečteš si ji a schválíš nebo zamítneš. Po schválení má člen okamžitě plný přístup. Kredity jsou na začátku 0 — musíš mu je ručně přidat, až si koupí permanentku.
Pokud chceš někomu dát speciální roli (trenér, organizátor) nebo neomezené kredity — uděláš to v jeho profilu kdykoli po schválení.
Ty dostaneš push notifikaci na telefon. V sekci Členství vidíš žádost, přečteš si ji a schválíš nebo zamítneš. Po schválení má člen okamžitě plný přístup. Kredity jsou na začátku 0 — musíš mu je ručně přidat, až si koupí permanentku.
Pokud chceš někomu dát speciální roli (trenér, organizátor) nebo neomezené kredity — uděláš to v jeho profilu kdykoli po schválení.
Start
Zájemce
Vyplní dotazník na /dotaznik.html nebo registraci na /membership.html
→
Čekání
Pending
role = "pending"
Účet vytvořen. Omezený přístup. Admin dostane notifikaci.
Účet vytvořen. Omezený přístup. Admin dostane notifikaci.
→
Admin rozhodne
Schválit?
Admin v /membership.html přezkoumá žádost a rozhodne.
→
Schválen
Člen (user)
role = "user" · Plný přístup · Kredity: 0 · Admin dobije kredity dle tarifu
🚫
Zamítnut
role = "rejected"
Admin může trvale smazat z databáze
→
Volitelně
Upgrade role
Admin přiřadí:
Trenér → trainer_adults / trainer_children / trainer_both
Org. → organizer
Koučink → hasTrainingPlan = true
Adm. tým → isAdminTeam = true
Trenér → trainer_adults / trainer_children / trainer_both
Org. → organizer
Koučink → hasTrainingPlan = true
Adm. tým → isAdminTeam = true
Výkonnostní skupiny běžců (pro tisk prezenčky)
😊
Lipánek
Začátečníci a rekreační běžci
🚀
Rakeťák
Pokročilí, výkonnostní běžci
🙉
JElita
Závodní a elitní skupina
Skupina se zobrazuje v PNG obrázku prezenčky při sdílení — seřazeni JElita → Rakeťák → Lipánek (od nejrychlejších).
Nastavuje se v profilu běžce → "Výkonnostní úroveň".
7
Vývoj appky — statistiky & architektura
Kolik toho vlastně appka umí?
Tahle sekce je velký pohled shora na celou aplikaci — co bylo postaveno, kde to drží a kde to skřípe. Generuje se z reálných dat repa (git log, počet řádků, počet Cloud Functions, Firestore kolekcí). Můžeš ji poslat externímu programátorovi, aby měl orientaci dřív než otevře kód.
Stav k 18. 5. 2026: 70 dní vývoje, 641 commitů, 96 Cloud Functions, 166 Firestore kolekcí, 230 000+ řádků kódu. Tempo akceleruje (březen 50 → květen 329 commitů), hlavní riziko jsou monolity.
70
dní vývoje
641
commitů (~9.2/den)
86
deploy commitů
270
nových featur
176
bug fixů
230k+
řádků kódu
96
Cloud Functions
166
Firestore kolekcí
60
HTML stránek (app/)
71
maintenance skriptů
📅 Aktivita v čase
Březen 2026 ████░░░░░░░░░░░░░░░░░░░░░░░░░░ 50 commitů (start, 22 dní) Duben 2026 █████████████████████░░░░░░░░░ 262 commitů (~8.7/den) Květen 2026 ██████████████████████████████ 329 commitů (~18.3/den do 18.5.) 🚀
Nejaktivnější den v týdnu: středa (121) a pátek (108). Nejklidnější: čtvrtek (63).
| Typ commitu | Počet | Co to znamená |
|---|---|---|
feat: | 270 | Nová funkčnost — největší díl |
fix: | 176 | Bug fixy (poměr feat/fix ≈ 1.5 → zdravé tempo) |
chore: | 39 | Údržba, závislosti |
refactor: | 28 | Čištění bez změny chování |
security: | 7 | Auditní změny rules / auth |
perf: / docs: | 4 / 5 | Optimalizace a dokumentace |
🔥 Top 5 nejčastěji upravovaných souborů
app/index.html ██████████████████████████ 291× functions/index.js ██████████░░░░░░░░░░░░░░░░ 111× app/koucink.html █████████░░░░░░░░░░░░░░░░░ 94× app/admin.html ███████░░░░░░░░░░░░░░░░░░░ 72× app/sw.js ██████░░░░░░░░░░░░░░░░░░░░ 65×
📏 Velikost frontendu (app/ — 60 HTML stránek)
app/index.html ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ 47 789 řádků ⚠️ monolit
app/koucink.html ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ 28 600 řádků ⚠️ velký
app/admin.html ▓▓▓▓▓▓▓▓▓▓ 17 890 řádků ✅ primární workspace
app/finance.html ▓▓▓▓▓▓ 10 679
app/faktury.html ▓▓▓ 5 688
app/clenove.html ▓▓ 4 866
app/kontakty.html ▓▓ 3 976
app/zavody-admin ▓▓ 3 959
app/orders.html ▓▓ 3 941
... + 51 dalších HTML stránek
────────────────────
app/ celkem: 181 279 řádků
web/ celkem: 9 671 řádků (marketing)
⚙️ Backend & pravidla
functions/index.js ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ 16 060 řádků
96 exportovaných funkcí
Node 22 · firebase-functions v4
firestore.rules 1 687 řádků
firestore.indexes.json 663 řádků
storage.rules 166 řádků
──────────────────────────────────────────────────────────
🎨 Frontend (app + web): ~190 950 řádků
⚙️ Backend (functions): ~16 180 řádků
🛡️ Rules + indexy: ~2 500 řádků
🔧 Skripty + maintenance: ~20 880 řádků
──────────────
~230 510 řádků kódu
🏗️ Architektonická mapa
┌──────────────────────────────────┐
│ 👤 UŽIVATELÉ (~80 členů + 32 svěřenců)
│ member · parent · trainer · admin · organizer
└────────────────┬─────────────────┘
│
┌──────────────────────────┼──────────────────────────┐
│ │ │
┌────────▼─────────┐ ┌──────────▼──────────┐ ┌──────────▼──────────┐
│ 🌐 web/ │ │ 📱 PWA app/ │ │ 🖥️ Electron │
│ marketing │ │ installable │ │ desktop wrapper │
│ davidvas.cz │ │ + iOS push (APNS) │ │ │
└────────┬─────────┘ └──────────┬──────────┘ └──────────┬──────────┘
│ │ │
└─────────────────────────┴──────────────────────────┘
│
▼ Firebase SDK v9 (CDN, žádný build)
┌───────────────────────────────────────────────────────────────────────┐
│ 🔥 FIREBASE PROJECT │
│ tymdejvid-app.web.app │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 🔐 AUTH │ │ 📦 FIRESTORE │ │ 📂 STORAGE │ │
│ │ email+pwd │ │ 166 kolekcí │ │ fotky, doc. │ │
│ │ + claims │ │ 1 687 ř.rules│ │ 166 ř. rules │ │
│ └──────────────┘ └──────┬───────┘ └──────────────┘ │
│ │ │
│ │ 47 onCreate/onWrite/onUpdate triggerů │
│ ▼ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ ⚙️ CLOUD FUNCTIONS — functions/index.js (monolit) │ │
│ │ • 13 HTTPS callable (web → CF) │ │
│ │ • 5 HTTPS onRequest (webhooky: Strava, Fio) │ │
│ │ • 5 Pub/Sub schedule (cron: recurring, overdue) │ │
│ │ • 47 Firestore document triggerů (queue/log/notif) │ │
│ │ Runtime: Node 22 · firebase-functions v4 │ │
│ └──┬───────────────────────┬────────────────────┬───────┘ │
└─────┼───────────────────────┼────────────────────┼─────────────────────┘
▼ ▼ ▼
┌─────────────────┐ ┌──────────────────┐ ┌───────────────────┐
│ 📧 NODEMAILER │ │ 📲 FCM PUSH │ │ 🔗 EXTERNÍ API │
│ 40 míst │ │ iOS APNS │ │ Strava OAuth │
│ email queue │ │ + Web push │ │ intervals.icu │
│ invite/reset │ │ notifLog audit │ │ Fio Banka │
│ faktury │ │ │ │ Google Calendar │
└─────────────────┘ └──────────────────┘ │ Notion (read) │
└───────────────────┘
🧭 Interní mapa — jak je appka propojená uvnitř
═══════════════════════════════════════════════════════════════════════════════
📱 USER SIDE · index.html (47k řádků) · to co vidí běžec
═══════════════════════════════════════════════════════════════════════════════
┌──────────────────────────────┐
│ 🏠 DASHBOARD │
│ feed · novinky · 🔔 zvonek │
└──┬──────┬──────┬──────┬──────┘
│ │ │ │
┌─────────────────┘ │ │ └─────────────────┐
▼ ▼ ▼ ▼
┌───────────────┐ ┌────────────┐ ┌───────────┐ ┌───────────────┐
│ 📅 KALENDÁŘ │ │ 💰 KREDITY │ │ 👤 PROFIL │ │ 🏆 ZÁVODY │
│ tréninky │ │ saldo │ │ PR · bio │ │ race-plan │
│ přihl/odhl │─────►│ historie │ │ fotky │ │ výsledky │
│ audience flt │ │ dobít QR │ │ privacy │ │ AI insights │
└──────┬────────┘ └────────────┘ └─────┬─────┘ └──────┬────────┘
│ │ │
▼ ▼ ▼
┌───────────────┐ ┌────────────┐ ┌───────────────┐
│ 🏃 DETAIL │ │ ⚙️ NASTAV │ │ 🏃 OSTATNÍ │
│ tréninku │ │ notifs │ │ PROFILY │
│ mapa · čas │ │ jazyky │ │ žebříček │
│ účastníci │ │ integrace │ │ PR srovnání │
└──────┬────────┘ └────────────┘ └───────────────┘
│
▼ (po tréninku)
┌───────────────┐
│ 💬 FEEDBACK │ ← komentář od trenéra, vlastní zpětná vazba
│ activity │
└───────────────┘
Vedlejší stránky pro uživatele:
🛒 /membership · 🏕 /kemp · 🎯 /koucink (klient view) ·
📋 /dotaznik* · 🍎 wellness · 📥 /inbox · 🏃 /runners
═══════════════════════════════════════════════════════════════════════════════
🖥 ADMIN SIDE · admin.html (18k) + 50+ stránek · co dělá David
═══════════════════════════════════════════════════════════════════════════════
┌──────────────────────────────┐
│ 📊 ADMIN DASHBOARD │
│ KPI · stats · tasks · todo │
└──┬──┬──┬──┬──┬──┬──┬─────────┘
│ │ │ │ │ │ │
┌──────────────────┘ │ │ │ │ │ └──────────────────┐
│ ┌───────────────┘ │ │ │ └──────────┐ │
▼ ▼ ▼ ▼ ▼ ▼ ▼
┌────────┐┌─────────┐ ┌────────┐┌───────┐┌──────────┐ ┌─────────┐┌─────────┐
│👥 ČLEN.││📅 TRÉNIN│ │👥 PREZ. ││💰 KRED ││📇 KONTAKT│ │🎯 KOUČIN ││💰 FINAN.│
│ správa ││ vytvořit│ │docházka ││ dobít ││ CRM │ │ svěřenci││ faktury │
│ role ││drag&drop│ │ platba ││ ručně ││ aktivita │ │ plány ││recurring│
│ pozn. ││ audience│ │ tisk PNG││ trans. ││ tagy │ │ buildr ││ FIO bank│
└───┬────┘└─────────┘ └─────────┘└───────┘└────┬─────┘ └────┬────┘└────┬────┘
│ │ │ │
▼ ▼ ▼ ▼
┌────────┐ ┌──────────┐ ┌──────────┐ ┌───────────┐
│💳 ČLENST│ │ 📋 DOTAZ │ │ 🏆 RACE │ │ 🧾 NOTION │
│ pending │ │ kurz │ │ PLÁNY │ │ faktury │
│ schválit│ │ koučink │ │ AI insig │ │ sync │
└────────┘ │ závod │ └──────────┘ └───────────┘
└──────────┘
Vedlejší admin stránky:
📦 /sklad · 🛒 /orders · 🏕 /kemp-admin · 🏆 /zavody-admin · 📊 /analytics
📜 /changelog · 🔔 /notifikace-log · 🛠 /import-* (×7) · 📁 /projekty
📝 /cms · 📄 /stranky · 🏢 /firemni (RunFlow) · 🧒 /deti-admin · 🌅 /rana-pece
═══════════════════════════════════════════════════════════════════════════════
🔗 PROPOJENÍ MEZI STRANAMA (co se promítá kam)
═══════════════════════════════════════════════════════════════════════════════
USER ADMIN
───── ──────
📅 Přihlášení na trénink ─────────────────────► 👥 Prezenčka (auto)
🏃 Aktivita ze Stravy ─────────────────────► 📊 Stats / leaderboard
💬 Feedback po tréninku ─────────────────────► 🎯 Koučink (komentáře)
📋 Vyplněný dotazník ─────────────────────► 📋 Dotaz admin (queue)
🛒 Objednávka v eshopu ─────────────────────► 🛒 Orders (admin)
🏕 Registrace na kemp ─────────────────────► 🏕 Kemp admin (capacity)
📝 Komentář v feedu ─────────────────────► 🔔 Notif Davidovi
💰 Kredit ručně dobitý ◄───────────────────── 💰 Admin kredity
🏃 Plán workoutu (koučink) ◄───────────────────── 🎯 Workout builder
🏆 Race plán přidělen ◄───────────────────── 🏆 Race plány (admin)
💳 Schválení členství ◄───────────────────── 💳 Členství pending
🧾 Faktura vystavena ◄───────────────────── 💰 Finance (Notion sync)
📲 Push notifikace ◄───────────────────── 🔔 Manuální notif
═══════════════════════════════════════════════════════════════════════════════
💰 TOK KREDITŮ (klíčová logika)
═══════════════════════════════════════════════════════════════════════════════
┌────────────────────────────────────────────────────────────┐
│ ČLEN si dobíjí kredity: │
│ 1) přes QR platbu (Fio Banka, auto-spárování) │
│ 2) bankovním převodem (ručně dohledáno adminem) │
│ 3) admin manuálně přidá kredit v profilu │
└────────────────────────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────────┐
│ KREDIT SE ODEČÍTÁ při docházce na trénink: │
│ • 1 kredit = 1 trénink │
│ • Admin / Coach / isAdminTeam / hasTrainingPlan = ∞ │
│ • Označení docházky v prezenčce → auto-deduct │
│ • Odhlášení < 24h před tréninkem = kredit nevrácen │
└────────────────────────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────────┐
│ AUDIT TRAIL: │
│ creditTransactions/ — každá změna kreditu (audit log) │
│ Admin vidí historii v profilu člena │
└────────────────────────────────────────────────────────────┘
ASCII mapa neukazuje všechny stránky (60 HTML celkem) — jen klíčové uzly a jejich propojení.
Plný seznam stránek je v sekci ⑤ Mapa stránek (mimo focus mode).
| Rodina Firestore kolekcí (z 166 unikátních) | Příklady |
|---|---|
| 👥 users / coaching | profily, training_data, wellness, intervals_icu, coachNotes |
| 🛠️ admin_* (16 kolekcí) | invoices, finance, orders, inventory, settings, recurring |
| 🏃 workouts / feedback | workouts, activityFeedback, trainings, training_library |
| 🧒 kids_ / parent_ | přípravka, attendance, parent_board, invitations |
| 📤 *Queue / *Log | emailQueue, notificationQueue, inviteQueue, audit_logs |
| 🏁 races / events | races, races_library, events, camps, communityEvents |
| 🌐 community / feed | feed, news, comments, bazaar, birthdays, challenges |
| 🔌 integrations | stravaRequests, intervalsRequests, fcmTokens |
| 🌱 rituals (Davidovo) | dailyRituals, ritualTemplates, ritualBuffer |
| 📋 questionnaires | questionnaires, reviews, runner_questionnaire |
✅ Přednosti
- End-to-end pokrytí klubu — od přihlášky přes členství, tréninky, platby, faktury, eshop, kemp, závody, dotazníky až po archivaci. Nic neutíká do Excelu.
- PWA + iOS push — pravý native-feel, instalovatelná appka, APNS payload funguje.
- RBAC s view-mode přepínačem — admin si přepne pohled jakékoli role v reálném čase.
- Robustní queue systém — emailQueue, notificationQueue, inviteQueue → idempotentní, recoverable.
- 3 vrstvy gcal sync — pending flag + auto-backfill při connect + při page-load.
- Reálné integrace — Strava, intervals.icu, Fio Banka, Google Calendar, Notion, nodemailer.
- Recovery infrastruktura —
?fix=scroll,?debug=scroll, watchdog → samoléčebné stránky. - Hutný CHANGELOG.md — každý deploy popsaný (co dělá / jak testovat).
- Tempo — 270 featur za 70 dní bez týmu.
⚠️ Rezervy
- Monolity rostou — index.html 47k, koucink.html 28k, functions/index.js 16k. Refactoring se zhoršuje.
- Žádný staging — vše na produkci. Firebase Preview Channels nepoužívány.
- Žádný build / typy — vanilla JS bez lintů a typecheck. 17 TODO/FIXME.
- firebase-functions v4 (deprecated) — dlouhodobý dluh, je v6.
- Duplicita kolekcí —
parentBoardvsparent_board, obě v kódu. - Bus factor 1 — 99 % commitů od jednoho člověka.
- Tests — minimální, CI běží jen i18n / file-size / rules-syntax.
- Žádné git tagy — verzování přes timestamp v
version.json.
| Priorita | Akce | Proč |
|---|---|---|
| HIGH | Rozdělit koucink.html (28k) podle modulů (calendar / workouts / feedback / library) | Než překročí 35k a stane se to bolestivé |
| HIGH | functions/index.js rozpad podle oblastí (credits / payments / notifications / integrations) | Cold start + bus factor |
| MED | Firebase Preview Channels pro rizikové změny (rules, CF) | Nulové náklady, eliminuje class of production bugů |
| MED | Integration testy proti Firestore emulátoru pro rules | 1 687 řádků rules bez testů = časovaná bomba |
| MED | firebase-functions v4 → v6 | Dlouhodobý dluh |
| LOW | Audit parentBoard vs parent_board přes /audit-collections | Pravděpodobně jedna kolekce je mrtvá |
| LOW | Git tagy pro release-y (v2026.05.18) | Trasovatelnost incidentů → konkrétní commit |
Závěr: Za 70 dní postavil jeden člověk plnohodnotný klubový ekosystém o 230 000+ řádků se 96 cloud funkcemi, 166 Firestore kolekcemi, PWA push a 9.2 commity denně. Tempo a šíře je výjimečná. Nejbližší riziko nejsou nové featury — je to velikost dvou tří monolitů, které čekají na rozdělení.
#TYMDEJVID
Běžecký klub České Budějovice · David Vaš, certifikovaný trenér · tymdejvid-app.web.app
Tato mapa je interní dokument pro administrátora. Aktualizuj ji při každé změně systému.
Tato mapa je interní dokument pro administrátora. Aktualizuj ji při každé změně systému.
Firebase · Firestore · Auth
Vanilla JS / PWA
Vanilla JS / PWA