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
Obsah
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
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 1.3 Cesta k databázi
Výchozí cesta k databázi je
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).
Obr. 1 — Obrazovka prvního spuštění: nastavení hesla appky
2. Přihlášení a roleAppka 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í.
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čiAppka 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 pozornostDlaž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ě. StatistikySouhrnné 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).
Obr. 2 — Přehled: upozornění a statistiky
4. HráčiHlavní 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í:
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).
Obr. 3 — Seznam hráčů s filtry
Přidání nového hráčeTlačítko „Přidat hráče" otevře formulář se základními údaji. Klíčové rozhodnutí ve formuláři je zdroj klubového čísla:
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.
Obr. 4 — Dialog „Nový hráč"
Detail hráčeKliknutí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á).
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í Hromadné akceZaš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. KontaktyKontakty 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).
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).
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é.
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 ( 2) Duplicitní kontakty podle telefonuNajde 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 WhatsAppNahrá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ónyNová 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.
Obr. 9 — Sezóny, založení nové sezóny, přehled zařazení
Mazání sezónIkonka 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ěvkyJde 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.
Obr. 10 — Seznam příspěvků za sezónu
Vygenerování předpisu pro sezónuTlačí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ášť.
Obr. 11 — Dialog „Vygenerovat předpis pro sezónu"
Zaznamenání platbyTlačí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.
Obr. 12 — Dialog „Zaznamenat platbu"
Ke každé platbě jde vytisknout potvrzení o platbě z Word šablony klubu
( 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. GDPRKlub 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).
Obr. 13 — GDPR: přehled souhlasů se stavem u každého člena
10. PřestupyVe 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).
Obr. 14 — Přestupy: příchody, odchody, hostování
11. Trenéři a výborDvě 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).
Obr. 15 — Trenérské funkce a klubové funkce (výbor)
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).
Obr. 17 — Oblečení: „Připravujeme"
13. Import/ExportSouhrnné 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:
Obr. 18 — Import/Export, záložka Hráči
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.
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
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.
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é).
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:
|