TJ
TJ BíloviceEvidence členů - příručka
1Instalace a nastavení 2Přihlášení a role 3Přehled (dashboard) 4Hráči 5Kontakty 6Úklid kontaktů 7Sezóny a zařazení 8Příspěvky 9GDPR 10Přestupy 11Trenéři a výbor 12Oblečení 13Import/Export 14Nastavení 15Bezpečnost a GDPR
Verze aplikace 0.9.0
Aktualizováno 14. 9. 2026
Adresa: Bílovice 4, 687 12 IČO 61704130   FAČR 7220021 klub@tjbilovice.cz www.tjbilovice.cz
Logo TJ Bílovice
Tělovýchovná jednota Bílovice z.s.Evidence členů — interní dokument

TJ Bílovice — Evidence členů

Uživatelská příručka
Interní dokument klubu
Určeno jen pro potřeby TJ Bílovice z.s. — nešířit mimo klub
Verze aplikace: 0.9.0
Datum aktualizace: 14. 9. 2026
Snímky obrazovek pořízeny nad anonymizovanou ukázkovou databází.

Obsah

1Instalace a nastavení
2Přihlášení a role
3Přehled (dashboard)
4Hráči
5Kontakty
6Úklid kontaktů
7Sezóny a zařazení
8Příspěvky
9GDPR
10Přestupy
11Trenéři a výbor
12Oblečení
13Import/Export
14Nastavení
15Bezpečnost a ochrana osobních údajů

Appka je interní nástroj TJ Bílovice z.s. pro správu členské základny a klubových agend — lokální desktopová aplikace (Python, NiceGUI, SQLite, pywebview), spuštěná nativně na počítači klubu, bez cloudu. Data zůstávají jen v databázovém souboru na disku. Příručka postupně vysvětluje nejen co appka umí, ale i proč se tak chová - hodně logiky totiž vychází z toho, jak funguje registrace hráčů u Fotbalové asociace ČR (FAČR) a jak reálně chodí administrativa amatérského fotbalového klubu, ne jen z appky samotné.

1. Instalace a nastavení

Appku lze provozovat dvěma způsoby — jako hotový Windows program (doporučeno pro běžné používání v klubu), nebo ze zdrojového kódu (pro vývoj a úpravy).

1.1 Windows .exe (doporučeno)

Appka se dá sestavit do samostatného .exe souboru přes PyInstaller — cílový počítač nepotřebuje mít nainstalovaný Python. Sestavení popisuje packaging/README.md v repozitáři; výsledkem je složka dist\TjB-AppTeam\ obsahující TjB-AppTeam.exe a složku _internal\ (Python, knihovny, zabalené ikony/šablony/DB schéma/příručka).

  • Na cílový počítač (klubový počítač) se zkopíruje celá složka dist\TjB-AppTeam\ — .exe bez _internal\ vedle sebe nejde spustit, protože v _internal je zabalený samotný Python interpret a všechny knihovny, na kterých appka běží.
  • Appka si při prvním spuštění vedle .exe vytvoří vlastní zapisovatelnou složku data\ (databáze, nahrané dokumenty, konfigurace) — tahle složka musí zůstat zapisovatelná, appku tedy nespouštět přímo z Program Files bez úpravy oprávnění (Windows tam běžně zapisování bez administrátorských práv nepovolí).
  • Do data\tjb_team.db3 appka při prvním spuštění nasadí anonymizovanou referenční databázi zabalenou v .exe — ne ostrá klubová data. Přenesení existující ostré databáze do nového balíčku řeší packaging/README.md (sekce „Přenesení ostré databáze do balíčku").

1.2 Ze zdrojového kódu (vývoj)

python -m pip install -r requirements.txt
python -m tjb_app.main

Appka se spustí jako nativní desktopové okno (přes pywebview) — technicky jde o malý webový server, ke kterému se pywebview připojí jako prohlížeč bez adresního řádku, takže appka vypadá a chová se jako běžný desktopový program.

1.3 Cesta k databázi

Výchozí cesta k databázi je data/tjb_team.db3 (mimo git, vedle appky). Doporučeno nastavit vlastní cestu mimo repozitář/instalaci přes proměnnou prostředí TJB_DB_PATH, případně později přímo v appce (Nastavení → Cesty a úložiště → Cesta k databázi — projeví se až po restartu). Pokud soubor na dané cestě neexistuje, appka tam nasadí anonymizovanou referenční databázi, aby appka i bez ostrých dat hned po nainstalování fungovala a šlo si ji vyzkoušet.

Databázový soubor tjb_team.db3 není šifrovaný a obsahuje citlivá osobní data (rodná čísla, kontakty). Appka řeší jen přihlašovací heslo proti náhodnému spuštění, ne šifrování dat na disku — o přiměřenou ochranu přístupu k souboru (umístění mimo sdílené složky, přístupová práva, šifrování zálohy) je potřeba se postarat na úrovni operačního systému.

1.4 První spuštění

Při úplně prvním spuštění appka požádá o nastavení hesla — to zároveň slouží jako heslo role předseda. Podrobně viz kapitola 2 (Přihlášení a role).

Obrazovka prvního spuštění
Obr. 1 — Obrazovka prvního spuštění: nastavení hesla appky

2. Přihlášení a role

Appka nemá pojmenované uživatelské účty — nepozná, který konkrétní kolega se přihlásil, jen podle zadaného hesla rozezná jednu ze dvou rolí. Obě role jsou sdílené mezi víc lidmi. Je to vědomý kompromis: menší klub typicky nemá kapacitu spravovat účty pro každého trenéra/člena výboru zvlášť, ale zároveň chce, aby citlivá data (rodná čísla) viděl jen užší okruh lidí (v appce role „předseda") a ostatní se dostali jen k tomu, co ke své práci potřebují.

RoleHesloCo vidí / smí
Předseda Heslo z prvního spuštění (app_heslo_hash) Vidí úplně vše, včetně rodných čísel. Jediný, kdo vidí a spravuje sekci Zabezpečení v Nastavení.
Editor Sdílené heslo nastavené předsedou v Nastavení → Zabezpečení (app_heslo_editor_hash) Přihlásí se do appky, ale nevidí rodná čísla: v detailu hráče zamaskované bez možnosti odhalit, ve formuláři úprav needitovatelné, z exportu (.xlsx) sloupec úplně chybí, ve FAČR náhledu importu se případná změna nezobrazí.

Proč zrovna rodná čísla jsou ta citlivá hranice? Rodné číslo je podle českého práva citlivý osobní identifikátor (nese v sobě datum narození i pohlaví a dá se s ním leccos zneužít), na rozdíl od jména nebo telefonu, které si stejně navzájem všichni v malém klubu běžně sdílí. Appka proto dělá dělicí čáru přesně tady, ne mezi jednotlivými moduly.

Sdílení databáze mezi počítači

Appka nemá centrální server — každý kolega ji spouští na svém počítači nad stejným (nebo synchronizovaným) databázovým souborem. Jak databázi i dokumenty sdílet mezi víc počítači bez rizika ztráty dat popisuje kapitola 14 (Nastavení).

3. Přehled (dashboard)

Úvodní obrazovka po přihlášení. Slouží jako rozcestník i jako „co bych měl(a) dnes dořešit" seznam — appka sama dopočítává, kde v datech něco chybí, aby se administrátor nemusel sám probírat všemi moduly a hádat, co je ještě nekompletní.

Vyžaduje pozornost

Dlaždice nahoře upozorňují na neúplnosti, které mají reálný dopad (chybějící klubová funkce = klub třeba nemá dohledatelného hospodáře, nezkontrolovaný trenér, chybějící GDPR souhlas = právní riziko, chybějící předpis příspěvků = klub nedostane peníze, na které má nárok, neúplné osobní údaje = problém při FAČR registraci). Kliknutím na dlaždici appka rovnou otevře příslušný modul s přednastaveným filtrem přesně na ty chybějící záznamy, takže se nemusí hledat ručně.

Statistiky

Souhrnné grafy členské základny: počty podle týmu/kategorie, věkové rozložení, stav příspěvků aktuální sezóny (kolik je předepsáno vs. kolik už přišlo) a poměr stavů členství (aktivní / neaktivní / odešel).

Obrazovka Přehled
Obr. 2 — Přehled: upozornění a statistiky

4. Hráči

Hlavní seznam členů klubu za vybranou sezónu (sezóna se volí nahoře ve filtrech - appka ukazuje vždy zařazení hráčů za jednu konkrétní sezónu, protože přes léto se týmy/kategorie přeskupují a stejný hráč tak může být v různých sezónách v jiném týmu, viz kapitola 7).

Sloupce a co znamenají

V hlavičce sloupců jsou vidět ikonky funkcí (trenér, hráč...) a barevné tečky pro stav FAČR/TJB členství:

  • zelená — ano, je veden jako člen (u FAČR členství: má u Fotbalové asociace ČR aktivní registraci; u TJB členství: je veden jako člen samotné tělovýchovné jednoty, což jsou u fotbalového oddílu obvykle stejní lidé, ale formálně dvě různé evidence).
  • červená — ne.
  • šedá — appka to neví/není vyplněno (typicky malé děti ve Školičce, které se u FAČR ještě neregistrují).

FAČR ID je registrační číslo hráče v celostátním informačním systému Fotbalové asociace ČR (IS FAČR) — centrální evidenci, kterou vede asociace pro všechny kluby v republice, ne appka sama. Appka jen tohle číslo (a pár dalších údajů) eviduje a umí je hromadně srovnat s aktuálním výpisem z IS FAČR (viz kapitola 13, Import/Export).

Seznam hráčů
Obr. 3 — Seznam hráčů s filtry

Přidání nového hráče

Tlačítko „Přidat hráče" otevře formulář se základními údaji. Klíčové rozhodnutí ve formuláři je zdroj klubového čísla:

  • GENEROVANE — appka navrhne klubové číslo sama, ve formátu RRMMDD+PP (datum narození + dvoumístné pořadové číslo pro případ, že by se ve stejný den narodilo víc evidovaných dětí). Používá se pro hráče, kteří ještě nemají FAČR registraci — typicky malé děti při náboru do Školičky, než se rozhodne, jestli budou závodně hrát.
  • FACR — klubové číslo i FAČR ID se zadávají ručně podle toho, co už hráč má přidělené v IS FAČR (obvykle při přestupu hráče, který už u FAČR registrovaný je).

Appka zároveň hlídá duplicity podle jména a data narození — pokud už podobný záznam existuje (např. hráč, který kdysi odešel a appka ho eviduje jako neaktivního), nabídne reaktivaci místo založení úplně nového záznamu, aby se historie (příspěvky, GDPR souhlasy, přestupy) nerozdvojila mezi dva různé záznamy téhož člověka.

Dialog Nový hráč
Obr. 4 — Dialog „Nový hráč"

Detail hráče

Kliknutím na řádek v seznamu se otevře detail hráče se záložkami Údaje, Tým, Příspěvky, GDPR, Přestupy, Funkce a Oblečení — je to jediné místo, kde appka drží kompletní historii jednoho člověka napříč všemi moduly, takže se dá zjistit „co všechno o tomhle hráči appka ví" bez přeskakování mezi stránkami. Rodné číslo je v roli editora zamaskované bez možnosti odhalit; v roli předsedy jde odkrýt ikonkou oka (viz kapitola 2, proč je zrovna tahle hranice tak přísná).

Detail hráče
Obr. 5 — Detail hráče, záložka Údaje
Tlačítko „Smazat kartu hráče" v pravém horním rohu detailu je nevratné tvrdé smazání - na rozdíl od hromadného „Hromadně smazat" v seznamu (viz níže) appka tady nenabízí měkké označení „odešel" jako alternativu. Smaže se úplně všechno navázané na hráče (kontakty, dokumenty, fotky, zařazení do týmů, příspěvky, GDPR souhlasy, přestupy, funkce), aby šlo v případě omylu (např. duplicitně založený hráč) založit kartu znovu úplně od začátku, ne aby se dala smazaná historie někam schovat.

Profilová fotka

V pravém horním rohu detailu hráče jde nahrát/změnit profilovou fotku. Na rozdíl od ostatních dokumentů appka drží jen jednu aktuální fotku na hráče (bez historie) v jedné ploché složce (výchozí data/fotky), pod názvem {rok narození}_{ID}_{příjmení}_{jméno} — cílem je, aby šla fotka snadno dohledat i mimo appku, například při ručním vkládání do IS FAČR, kde appka sama fotky nenahrává (IS FAČR je systém asociace, ne appky). Appka fotku nijak neupravuje ani neořezává, ukládá ji přesně tak, jak byla nahraná. Hromadné napojení fotek ze staršího archivu na hráče podle jména řeší modul Import/Export → záložka Fotky (kapitola 13).

Hromadné akce

Zaškrtnutím řádků v seznamu se zpřístupní hromadné akce: „Hromadně smazat" (appka nabídne buď měkké označení „odešel" - historie zůstane zachovaná -, nebo tvrdé smazání, a to jen u záznamů, které appka vyhodnotí jako bezpečné, tj. bez navázaných příspěvků/GDPR/přestupů, aby se nesmazala historie omylem) a „Hromadně upravit vlastnosti" (např. rychlá oprava stavu členství u víc hráčů najednou, třeba po skončení sezóny).

5. Kontakty

Kontakty na rodiče/zákonné zástupce (nebo dospělé hráče samotné) - odděleně od samotných hráčů, protože jeden kontakt (rodič) často patří k víc hráčům (sourozenci v klubu) a naopak jeden hráč může mít víc kontaktů (oba rodiče, případně prarodiče). Kdyby appka držela telefon a email přímo u hráče, muselo by se to samé číslo opisovat u každého sourozence zvlášť a při změně (rodič si pořídí nové číslo) by hrozilo, že se aktualizuje jen u jednoho z nich.

Přepínač Zobrazení vlevo mění pohled: „Podle hráčů" ukazuje jeden řádek pro každou kombinaci hráč × kontakt (vhodné pro doplňování telefonu/emailu k dítěti), „Podle kontaktů" ukazuje jeden řádek na osobu bez ohledu na to, ke kolika hráčům je připojená (vhodné pro práci se samotnými kontakty, např. rodiče s víc dětmi v klubu).

Seznam kontaktů podle hráčů
Obr. 6 — Kontakty, zobrazení „Podle hráčů"

V zobrazení „Podle kontaktů" přibývá tlačítko „Nový kontakt" pro založení kontaktu bez rovnou vybraného hráče (připojí se k hráči později - typicky když appka nejdřív potřebuje zpracovat seznam kontaktů z nějakého zdroje, viz kapitola 6, a teprve pak je párovat s konkrétními dětmi).

Dialog Nový kontakt
Obr. 7 — Dialog „Nový kontakt (zatím bez hráče)"

Změny v tabulce (telefon, email, vztah) se ukládají automaticky při opuštění pole - není potřeba nikde potvrzovat „Uložit".

6. Úklid kontaktů

Tenhle modul existuje kvůli konkrétnímu reálnému problému klubu: kontakty se roky nastřádaly z různých excelů (přihlášky na tábor, rozdělení do přípravek, ruční zápisy na rodičovských schůzkách...), a stejný člověk tak často skončil jako víc oddělených záznamů, protože telefon byl pokaždé zapsaný trochu jinak (s mezerami, bez předvolby, s pomlčkami...). Appka to sama od sebe nepozná - proto je úklid rozdělený do tří jasně oddělených, ručně spouštěných kroků, aby šlo v klidu zkontrolovat výsledek každého z nich. Nic se neděje automaticky na pozadí a všechny kroky jde spouštět opakovaně bez rizika, že by se něco rozbilo napodruhé.

Úklid kontaktů
Obr. 8 — Úklid kontaktů: sjednocení formátu, duplicity, import z WhatsApp

1) Sjednocení formátu telefonů

Přepíše telefonní čísla do jednotného tvaru (+420xxxxxxxxx, bez mezer/pomlček) — stejný tvar appka od teď ukládá i u nově zadaných čísel ze všech formulářů v appce, takže se problém do budoucna sám neobjevuje znovu. Je to nutný první krok před hledáním duplicit níže - dokud jsou čísla zapsaná různě, appka je nedokáže spárovat jako „stejný telefon".

2) Duplicitní kontakty podle telefonu

Najde skupiny kontaktů se stejným (už sjednoceným) telefonem a nabídne sloučení: vybraný záznam zůstane, ostatní se do něj sloučí - napojení na hráče, platby i GDPR záznamy se přepojí na ten zůstávající záznam, duplicitní řádky se smažou. Tím se dřívější „rozštěpená" historie jednoho člověka zase spojí na jedno místo.

3) Import kontaktů z exportu WhatsApp

Nahrání CSV z tzv. WaContactsExtractoru (nástroj na export kontaktů z WhatsAppu). Appka ke každému řádku nabídne shody podle telefonu (existující kontakt) a podle příjmení (hráč se stejným příjmením) — nic se nezapisuje automaticky, u každého řádku se vybírá akce (Přeskočit / Aktualizovat existující kontakt / Přiřadit k hráči), protože shoda podle jména nikdy není stoprocentně jistá (může jít o úplně jinou rodinu se stejným příjmením).

7. Sezóny a zařazení

Fotbalová sezóna běží typicky od července do června (ne od ledna do prosince), a přes léto se navíc mění věkové kategorie (děti "postupují" o kategorii výš). Appka proto zařazení hráčů do týmů neváže napevno k hráči, ale vždy k dvojici (hráč, sezóna) — stejný hráč tak může být v sezóně 2024/2025 v „Přípravce mladší" a v 2025/2026 už v „Přípravce starší", a appka drží obě varianty vedle sebe jako historii, ne jako přepis jednoho záznamu.

Založení nové sezóny

Nová sezóna se zakládá zkopírováním zařazení z vybrané předchozí sezóny, což ušetří ruční přeřazování týmu za týmem. Přepínač „Automaticky přeřadit hráče s FAČR ID podle věku" navíc rovnou spočítá správnou kategorii: aktivní hráči s vyplněným FAČR ID se přeřadí do týmu odpovídajícího jejich věku v kalendářním roce zahájení nové sezóny (kategorie U6 až U35 - „U" jako "under", tedy do kolika let, což je standardní značení mládežnických kategorií ve fotbale podle kódu kategorie týmu v databázi). Hráči bez FAČR ID (typicky nejmenší děti ve Školičce, které se ještě neregistrují) se jen zkopírují do stejného týmu jako v předchozí sezóně, protože appka bez FAČR údajů nemá jistotu, kam přesně by měli podle věku patřit.

Sezóny a zařazení
Obr. 9 — Sezóny, založení nové sezóny, přehled zařazení

Mazání sezón

Ikonka koše u konkrétní sezóny v seznamu smaže jen tuhle sezónu, tlačítko „Smazat všechny sezóny" smaže rovnou celý seznam. Appka v obou případech nejdřív ukáže potvrzovací dialog s tím, co všechno se smaže: zařazení hráčů do týmů a předpisy/platby příspěvků dané sezóny zmizí, objednávky oblečení (modul Oblečení) zůstanou zachované a jen se od smazané sezóny odpojí (nejsou to totiž záznamy vázané na sezónní evidenci, ale skutečné objednávky zboží). Smazání nelze vrátit zpět.

Týmy/kategorie samotné (jejich názvy a kódy kategorie U6-U35) se spravují přímo v databázi (tabulka tymy) - appka jejich seznam v UI needituje, protože se v klubu mění jen zřídka (typicky jednou za několik sezón). Hromadné založení nově příchozích dětí po náborové akci řeší modul Import/Export → záložka Nábor (kapitola 13), ne stránka Sezóny.

8. Příspěvky

Jde o klubové členské příspěvky (peníze, které platí rodiče klubu za členství dítěte) - ne o poplatky FAČR, ty appka nijak neřeší. Appka rozlišuje dvě oddělené věci, které se snadno pletou: předpis (kolik má kdo za sezónu zaplatit, podle kategorie) a platbu (kolik už skutečně přišlo). Rozdíl mezi nimi je „Zbývá" - a právě podle něj appka pozná nedoplatky.

Seznam příspěvků
Obr. 10 — Seznam příspěvků za sezónu

Vygenerování předpisu pro sezónu

Tlačítko „Vygenerovat předpis pro sezónu" hromadně založí předpis podle kategorie (Školička, MiniPřípravka, Přípravka mladší/starší, Žáci, Dorost...) s výchozími částkami, které jde před spuštěním ještě upravit - řeší se tak najednou celá sezóna místo ručního zadávání částky u každého hráče zvlášť.

Dialog Vygenerovat předpis pro sezónu
Obr. 11 — Dialog „Vygenerovat předpis pro sezónu"

Zaznamenání platby

Tlačítko „Zaznamenat platbu" otevře dialog, kde se vybere kontakt (plátce), datum a forma platby a rozdělí částka mezi jeho děti/hráče (rovnoměrně, nebo podle předpisu) - protože v praxi rodič často pošle jednu platbu za víc sourozenců najednou a appka to potřebuje umět rozúčtovat na jednotlivé hráče, ne jen zapsat jako jednu nerozdělenou položku.

Dialog Zaznamenat platbu
Obr. 12 — Dialog „Zaznamenat platbu"

Ke každé platbě jde vytisknout potvrzení o platbě z Word šablony klubu (tjb_app/templates/potvrzeni_sablona.docx, vyplňovaná přes docxtpl) — appka vždy nabídne stažení DOCX a navíc se pokusí i o export do PDF přes docx2pdf, což ale vyžaduje nainstalovaný MS Word (typicky jen na Windows); jinde appka nabídne alespoň DOCX. Šablonu jde nahradit vlastním klubovým dokumentem (hlavička, logo, podpis, razítko) při zachování stejných názvů placeholderů. Potvrzení appka ukládá do podsložek podle roku a kódu kategorie týmu ({rok}/{kód kategorie}/), aby šla celá výstupní složka rovnou předat rodičům (např. nahráním na sdílený disk) a každá rodina si našla svůj tým a rok.

Zaškrtnutím řádků v seznamu se navíc zpřístupní tlačítko „Generovat potvrzení hromadně" — appka projde vybrané hráče, pro každého potvrzení vygeneruje stejným postupem jako výše a na konci ukáže souhrn (kolik se povedlo, kolik se přeskočilo a proč, typicky chybějící platba v dané sezóně) i tlačítko pro otevření výstupní složky.

9. GDPR

Klub zpracovává osobní údaje nezletilých dětí (jméno, datum narození, někdy i rodné číslo, fotku), a to podle GDPR vyžaduje doložitelný souhlas zákonného zástupce - ne jen to, že appka data má, ale i kdy a kým byl souhlas udělený (a případně odvolaný). Tenhle modul je proto v podstatě evidence souhlasů, ne technické nastavení appky.

Přehled souhlasů se zpracováním osobních údajů za všechny evidované členy, s filtry podle týmu, stavu souhlasu a stavu členství. Označením řádků (checkboxy) se zpřístupní hromadné akce „Zapsat udělení souhlasu" a „Odvolat souhlas" — u udělení jde volitelně rovnou nahrát sken podepsaného souhlasu (společný pro všechny vybrané, např. z rodičovské schůzky, kde se souhlasy sbíraly hromadně na papíře).

Přehled GDPR souhlasů
Obr. 13 — GDPR: přehled souhlasů se stavem u každého člena

10. Přestupy

Ve fotbale platí, že hráč je vždy registrovaný u jednoho „mateřského" klubu, ale může hostovat v jiném (typicky když v mateřském klubu není tým pro jeho věk/úroveň), nebo mezi kluby přestoupit natrvalo. Appka eviduje tyhle pohyby jako záznamy s typem (příchod / odchod / prodloužení hostování), protistranou (druhý klub) a datem, do kdy dohoda platí.

Appka barevně odlišuje, jestli dohoda trvá, vypršela (datum platnosti je v minulosti - typicky signál, že je čas dohodu obnovit nebo řešit návrat hráče), nebo k ní chybí datum. Cena (Kč) u přestupu odpovídá tomu, co se v klubovém prostředí běžně říká výchovné/odstupné - finanční vyrovnání mezi kluby za hráče, může být i záporné (klub platí za příchozího hráče) nebo nulové. Lze filtrovat podle typu a trvání dohody a k vybraným přestupům hromadně připojit sken dohody (podobně jako u GDPR souhlasů výše).

Seznam přestupů
Obr. 14 — Přestupy: příchody, odchody, hostování

11. Trenéři a výbor

Dvě samostatné evidence funkcí, protože jde o dvě různé role, které se v malém klubu často (ale ne vždy) potkávají v jedné osobě: Trenérské funkce (kdo trénuje který tým, včetně licence a čísla licence — FAČR vyžaduje, aby trenéři mládeže měli platnou trenérskou licenci, appka proto licenci eviduje u konkrétního přiřazení k týmu) a Klubové funkce (výbor) (předseda, místopředseda, hospodář/finance, členové výboru — administrativní/statutární role klubu jako spolku, nezávislé na tom, jestli daný člověk zrovna i trénuje). U obou jde funkci založit i ukončit (zadáním data ukončení, záznam zůstává v historii, nesmaže se).

Trenéři a výbor
Obr. 15 — Trenérské funkce a klubové funkce (výbor)
Dialog Přidat trenérskou funkci
Obr. 16 — Dialog „Přidat trenérskou funkci"

12. Oblečení

Modul pro evidenci klubového oblečení (velikosti dresů, číslování, případně vydávání konkrétních kusů) zatím není implementovaný — v menu je jen jako připravené místo pro budoucí verzi appky, ať je vidět, že se s tím počítá. Velikost dresu a preferované číslo dresu se prozatím vyplňují přímo u hráče (záložka Údaje v detailu hráče).

Modul Oblečení – připravujeme
Obr. 17 — Oblečení: „Připravujeme"

13. Import/Export

Souhrnné místo pro hromadnou práci s daty přes soubory - tam, kde by ruční klikání po appce u desítek/stovek hráčů najednou bylo nepraktické, nebo kde appka potřebuje srovnat svá data s vnějším zdrojem (IS FAČR). Rozdělené do čtyř záložek:

  • Hráči — export seznamu hráčů do .xlsx; import aktuálního exportu z IS FAČR (seznam_hráčů.xlsx) se srovnáním a náhledem změn; import stavu členství z CSV výstupu skriptu facr_lookup.py (externí nástroj, který se dívá do IS FAČR za appku - appka sama se s IS FAČR nijak nepropojuje, žádné takové API neexistuje, proto se pracuje přes soubory).
  • Nábor — hromadné založení nově příchozích dětí ze staženého vzoru, užitečné typicky po náborové akci, kdy se přihlásí víc dětí najednou. Appka ke každému řádku zkusí najít odpovídající kartu podle rodného čísla, nebo podle shody jméno+příjmení+datum narození — a to jak mezi odešlými/neaktivními (nabídne „Reaktivovat existující"), tak mezi už aktivními hráči (typicky dítě ve Školičce z minulého náboru, teď se doplňuje o rodné číslo, FAČR ID, adresu nebo kontakt na rodiče — appka nabídne „Aktualizovat existující kartu"). Vzorová tabulka má i nepovinný sloupec Adresa, který se zapíše přímo do adresy na kartě hráče. U shody appka doplní jen nově vyplněná pole (prázdný sloupec v tabulce existující údaj nepřepíše prázdnem) a kontakt na rodiče podle jména aktualizuje (telefon/email/vztah), místo aby založila duplicitní kontakt. Když se jméno kontaktu nenajde (dítě je nové, nebo se kontakt u tohoto hráče ještě nevede), appka zkusí dohledat kontakt podle telefonního čísla kdekoliv v databázi (typicky rodič, který je v appce už u sourozence, nebo kontakt založený dřív bez jména/emailu) - takový kontakt se s hráčem jen propojí a chybějící jméno/příjmení/ email se doplní, existující údaje se nepřepisují. Bez shody se založí úplně nová karta - lze i vynutit tímhle způsobem, kdyby appka spárovala špatně.
  • Příspěvky — export/import plateb, pro sesouhlasení s bankovním výpisem nebo účetnictvím klubu.
  • Fotky — poloautomatické napojení fotek z hromadné složky (poolu) na hráče podle názvu souboru (očekává se „příjmení_jméno", ale na diakritice, velikosti písmen ani pořadí nezáleží). Appka sama předvyplní hráče, jen když je shoda jednoznačná - u dvou hráčů se stejným jménem (typicky otec a syn v klubu) nebo bez jasné shody nechá výběr na uživateli, i s náhledem fotky. Přiřazené fotky se uloží podle stejné konvence jako profilová fotka v kapitole 4, originál se z poolu přesune do podsložky zpracovano/ (nemaže se), aby se příště nenabízel znovu.
Import/Export – záložka Hráči
Obr. 18 — Import/Export, záložka Hráči
Import/Export – záložka Fotky
Obr. 18b — Import/Export, záložka Fotky (jednoznačná shoda, více hráčů stejného jména, žádná shoda)
U všech importů appka nejdřív ukáže náhled změn — nic se nezapíše do databáze, dokud náhled výslovně nepotvrdíte tlačítkem. Je to záměrně jednosměrná pojistka proti tomu, že by hromadný import omylem přepsal správná data podle špatně namapovaného sloupce v Excelu.

14. Nastavení

Nastavení appky je rozdělené do tří záložek podle toho, jak často se k nim člověk vrací a kdo k nim má mít přístup.

Cesty a úložiště

Cesta k databázi (projeví se až po restartu appky, protože appka databázové připojení otevírá jen jednou při startu), složka pro zálohy, sdílená databáze (odkud appka při přihlašování kontroluje novější zálohu od kolegy), cesty ke složkám s dokumenty (fotky, GDPR skeny, smlouvy, vygenerovaná potvrzení, ostatní dokumenty, exporty) a složka poolu fotek pro poloautomatický import (kapitola 13) — tyhle se projeví ihned, bez restartu, protože appka je čte znovu při každém použití, ne jen jednou při startu.

Nastavení - Cesty a úložiště
Obr. 19 — Nastavení, záložka „Cesty a úložiště" (ukázkové cesty v obrázku jsou z vývojového prostředí)

Záloha a obnova

Tlačítko „Zálohovat" vytvoří konzistentní kopii databáze (přes SQLite backup() API, ne prosté kopírování souboru - to je důležité, protože SQLite soubor může být zrovna v půlce zápisu a prosté zkopírování by mohlo zachytit poškozený mezistav) s názvem {RRMMDD_HHMM}-tjb_team.db3 do složky pro zálohy a volitelně i zálohu dokumentů do {stejný časový údaj}-dokumenty.zip.

Nastavením složky pro zálohy na sdílený disk (Google Disk, síťový disk) se zálohy dostanou i ke kolegům. Appka nemá žádnou přímou integraci s Google Drive ani jinou cloudovou službou - stačí, aby cesta byla na disku běžně dostupná (typicky přes Google Drive for Desktop namapovaný jako lokální složka). Živá databáze by přesto měla zůstat lokálně, jen zálohy patří na sdílený disk — SQLite na síťovém disku je riziko zamykání a poškození při souběžném přístupu víc lidí najednou, kdežto zálohovací .zip/.db3 soubor už se jen kopíruje, nezamyká.

Appka při každém přihlášení sama zkontroluje sdílenou složku: u dokumentů tichým upozorněním (obnova zůstává ruční krok níže), u databáze dialogem s explicitním potvrzením („Stáhnout a nahradit" / „Ponechat lokální") — jde o destruktivnější akci (přepíše celou živou databázi a vynutí nové přihlášení), appka nic nepřepisuje sama bez potvrzení. Appka totiž nemá skutečné sdílení/slučování změn víc lidí najednou (na to by potřebovala opravdový server) — jde jen o výměnu souborů podle principu „poslední záloha vyhrává", a tahle hláška je pojistka, aby někdo omylem nepřepsal novější data staršími.

Nastavení - Záloha a obnova
Obr. 19b — Nastavení, záložka „Záloha a obnova"

V sekci Obnova ze zálohy appka nabídne k výběru zálohy nalezené ve složce pro zálohy. Obnova databáze appku odhlásí (nutné přihlásit se znovu, aby appka otevřela úplně nové DB spojení) a před přepsáním automaticky vytvoří bezpečnostní zálohu dosavadního lokálního souboru, takže i omylem vybraná záloha jde vzít zpět. Obnova dokumentů přepíše soubory stejného jména v aktuálně nastavených složkách.

Zabezpečení

Vidí a spravuje jen role předseda: změna hesla předsedy (vyžaduje zadání současného hesla, aby si heslo nemohl změnit někdo, kdo se jen na chvíli dostal k odemčené appce) a nastavení/změna sdíleného hesla editorů. Obě hesla jsou sdílená mezi víc lidmi — appka nerozlišuje jednotlivé osoby v rámci role (viz kapitola 2, proč je to takhle zjednodušené).

Nastavení - Zabezpečení
Obr. 19c — Nastavení, záložka „Zabezpečení"

15. Bezpečnost a ochrana osobních údajů

Databáze appky není šifrovaná a obsahuje citlivá osobní data (rodná čísla, kontakty, případně skeny dokumentů dětí). Appkové heslo chrání jen před náhodným spuštěním appky, ne data na disku — za přiměřenou ochranu přístupu k souboru (umístění mimo veřejně sdílené složky, přístupová práva operačního systému, šifrování zálohy) odpovídá provozovatel appky, ne appka samotná.

Shrnutí, kde appka reálně nabízí ochranu a kde je odpovědnost na klubu/provozovateli:

  • Role editor nevidí rodná čísla nikde v appce (detail hráče, formulář úprav, export, náhled FAČR importu) — appka to hlídá důsledně na úrovni každého jednoho místa, kde by se rodné číslo mohlo zobrazit.
  • GDPR souhlasy jsou evidované s datem a volitelně skenem, včetně možnosti souhlas odvolat (kapitola 9) — appka ale sama nekontroluje, jestli souhlas vůbec existuje dřív, než se dítě začne evidovat; je to na lidech, appka jen usnadňuje evidenci.
  • Appka nemá pojmenované účty jednotlivých kolegů — obě role (předseda i editor) sdílí jedno heslo mezi víc lidmi, takže appka nedokáže zpětně říct, kdo konkrétně danou změnu udělal (žádný "audit log" podle osoby).
  • Zálohy databáze i dokumentů jdou směrovat na sdílený disk odděleně od živé databáze (kapitola 14) — samotné sdílení je čistě kopírování souborů, appka nemá přímou integraci s žádnou cloudovou službou, takže bezpečnost sdíleného disku (kdo k němu má přístup) je plně na tom, jak si ho klub nastaví (např. oprávnění ve sdílené Google Disk složce).
TJ Bílovice — Evidence členů · interní příručka · nepředávat mimo klub