Kapitola 06 · Príklady dát

Ako to reálne vyzerá

Šesť konkrétnych scenárov s reálnymi dátovými príkladmi. Registrácia nového športovca, prestup medzi klubmi, osoba vo viacerých rolách súčasne, overenie pre hotel, úmrtie a registrácia športoviska. Názvy osôb a klubov sú fiktívne; štruktúra dát zodpovedá produkčnému modelu.

Scenár 01 · REG

Registrácia mládežníckeho športovca

Klub ŠK Tatran Spišská Nová Ves registruje 12-ročného Tomáša Hudáka ako hráča žiackej kategórie v basketbale. Keďže je maloletý, súhlasy udeľuje jeho zákonný zástupca — otec Peter.

1

Overenie/založenie osoby cez Identity Broker

Klubový portál pošle dáta dieťaťa do SportUp. Identity Broker pokusom o match s RFO zistí, že Tomáš existuje. Vráti stabilné interné person_id.

POST /v1/persons/match-or-create
{
  "given_name": "Tomáš",
  "family_name": "Hudák",
  "date_of_birth": "2013-05-12",
  "gender": "male",
  "nationality": "SK",
  "national_id": "130512/XXXX"
}

// → 200 OK
{
  "person_id": "prs_8f2a4c1e-...",
  "verification_status": "verified_by_rfo",
  "is_minor": true,
  "matched": true
}
2

Registrácia zákonného zástupcu a spojenie

Ak otec ešte v systéme nie je, založí sa. Potom sa vytvorí vzťah osoba-zák.zástupca.

POST /v1/guardian-relationships
{
  "minor_person_id": "prs_8f2a4c1e-...",
  "guardian_person_id": "prs_c91b7d33-...",
  "relationship_type": "legal_parent",
  "valid_from": "2013-05-12"
}
3

Udelenie súhlasov

Otec udeľuje tri súhlasy: základnú registráciu (contract, nedá sa odvolať), marketingové použitie fotografií (consent, odvolateľné), a anonymizovaný výskum (consent).

POST /v1/consents · batch
[
  {
    "person_id": "prs_8f2a4c1e-...",
    "purpose_code": "REG-ATHLETE-001",
    "legal_basis": "contract",
    "granted_to_id": "org_tatran_snv",
    "granted_by": "prs_c91b7d33-..."
  },
  {
    "person_id": "prs_8f2a4c1e-...",
    "purpose_code": "MKT-IMAGE-001-MINOR",
    "legal_basis": "consent",
    "granted_to_id": "org_tatran_snv",
    "granted_by": "prs_c91b7d33-..."
  },
  {
    "person_id": "prs_8f2a4c1e-...",
    "purpose_code": "VYS-DEMOGRAPHIC-001",
    "legal_basis": "public_task",
    "granted_to_id": "org_nsc"
  }
]
4

Vytvorenie afiliácie

Klubový portál zapisuje novú afiliáciu. Systém vyprodukuje dva eventy: AffiliationRegistered (stav pending) a po validácii AffiliationActivated.

POST /v1/affiliations
{
  "person_id": "prs_8f2a4c1e-...",
  "organization_id": "org_tatran_snv",
  "activity_code": "amatersky_sportovec",
  "legal_title": "bez_zmluvy",
  "sport_code": "SK-BAS",
  "discipline_code": "SK-BAS-5v5",
  "category_code": "SK-BAS-U13",
  "valid_from": "2026-09-01",
  "registration_number": "TAT-2026-0834"
}

// → 201 Created
{
  "affiliation_id": "aff_a4e7...",
  "status": "active",
  "events_generated": ["AffiliationRegistered", "AffiliationActivated"]
}
Scenár 02 · POD · Saga

Prestup hráča medzi klubmi

Profesionálny hokejista Juraj Kováč prestupuje z klubu HC 05 Banská Bystrica do klubu HK Nitra. Prestup sa realizuje k 1. júlu 2026 a modeluje sa ako saga s troma eventmi prepojenými cez correlation_id.

Čo je saga

Vzor z distribuovaných systémov. Jedna biznis operácia, ktorá sa dotýka viacerých nezávislých entít, sa rozloží na sekvenciu samostatných krokov prepojených spoločným correlation_id. Vďaka tomu zostáva zachované pravidlo "jeden event mení práve jeden agregát" — a zároveň sa dá celý proces spätne zrekonštruovať ako jeden príbeh. Podrobnosti sú v kapitole Doménový model.

1

Zahájenie prestupu

HK Nitra iniciuje prestup cez svoj klubový portál. Vytvorí sa nová (zatiaľ neaktívna) afiliácia v stave pending_transfer s referenciou na zdrojovú afiliáciu.

POST /v1/transfers
{
  "source_affiliation_id": "aff_bb_kovac_2023",
  "target_organization_id": "org_hk_nitra",
  "target_activity_code": "profesionalny_sportovec",
  "effective_date": "2026-07-01",
  "contract_type": "zmluva_profi",
  "contract_duration_years": 2,
  "compensation_amount": 85000
}

// → generovaný event:
{
  "event_type": "TransferRequested",
  "aggregate_id": "aff_nit_kovac_2026",
  "correlation_id": "txn_transfer_c4f8...",
  "occurred_at": "2026-06-15T14:22:00Z"
}
2

Ukončenie pôvodnej afiliácie

K účinnému dátumu sa zdrojová afiliácia ukončí. Event nesie to isté correlation_id, aby bolo možné spätne rekonštruovať celú sagu.

Event · generovaný automaticky k účinnému dátumu
{
  "event_type": "AffiliationTerminated",
  "aggregate_id": "aff_bb_kovac_2023",
  "correlation_id": "txn_transfer_c4f8...",
  "occurred_at": "2026-07-01T00:00:00Z",
  "data": {
    "reason": "transfer",
    "destination_organization_id": "org_hk_nitra"
  }
}
3

Aktivácia novej afiliácie

Nová afiliácia sa aktivuje k účinnému dátumu. Tretí event s rovnakým correlation_id uzatvára sagu.

Event · aktivácia
{
  "event_type": "AffiliationActivated",
  "aggregate_id": "aff_nit_kovac_2026",
  "correlation_id": "txn_transfer_c4f8...",
  "occurred_at": "2026-07-01T00:00:00Z"
}

Spätný dotaz

Dotaz "ukáž mi všetky eventy prestupu txn_transfer_c4f8" vráti všetky tri eventy v časovej postupnosti, nezávisle od toho, v ktorom agregáte sú uložené. Týmto sa rekonštruuje príbeh prestupu pre audit alebo disciplinárne účely.

Scenár 03 · Multi-role

Jedna osoba, štyri aktívne role

Martina Kučerová, 34 rokov, je v systéme jediný záznam — jedno person_id. Má však štyri súbežné afiliácie naprieč tromi rôznymi športmi a rôznymi organizáciami.

GET /v1/persons/{person_id}/affiliations?status=active
{
  "person_id": "prs_martina_...",
  "affiliations": [
    {
      "affiliation_id": "aff_1",
      "organization": "AC Košice (atletický klub)",
      "activity_code": "profesionalny_sportovec",
      "sport_code": "SK-ATH",
      "discipline_code": "SK-ATH-TRAIL",
      "valid_from": "2018-01-01"
    },
    {
      "affiliation_id": "aff_2",
      "organization": "ŠK Detva (bežecký klub)",
      "activity_code": "trener",
      "sport_code": "SK-ATH",
      "discipline_code": "SK-ATH-YOUTH",
      "valid_from": "2022-09-01"
    },
    {
      "affiliation_id": "aff_3",
      "organization": "OV Tatry Ultra 2026 (organizátor)",
      "activity_code": "dobrovolnik",
      "sport_code": "SK-ATH",
      "valid_from": "2026-08-15",
      "valid_to": "2026-09-05"
    },
    {
      "affiliation_id": "aff_4",
      "organization": "ŠK Rapid (šachový klub)",
      "activity_code": "sportovy_rozhodca",
      "sport_code": "SK-SCH",
      "discipline_code": "SK-SCH-RAPID",
      "valid_from": "2020-03-10"
    }
  ]
}

Čo systém vie

  • Martina je jedna osoba, nie štyri — všetky afiliácie zdieľajú ten istý person_id.
  • Keď zomrie alebo zmení meno, aktualizuje sa jeden záznam a všetky štyri afiliácie automaticky "vidia" novú informáciu.
  • Pri delegácii na zápas detvianskeho klubu, kde je aj tréner, systém upozorní na potenciálny konflikt záujmov (rozhodca so súčasnou afiliáciou k zúčastnenému klubu).
  • Na štatistické účely sa vie opýtať: "koľko osôb má v športe viac ako jednu aktívnu rolu?" — dotaz nad projekciou current_affiliations.
Scenár 04 · KOM

Komerčné overenie pre hotel

Hotel Grand Jasná ponúka zľavu 20 % pre registrovaných športovcov. Pri rezervácii chce overiť, či osoba má platnú športovú registráciu — ale nepotrebuje vedieť kto to je, v akom športe ani v akom klube. Stačí mu odpoveď áno/nie.

1

Osoba vyvolá overenie zo svojej aplikácie

V SportUp mobilnej aplikácii si osoba vygeneruje krátkodobý verifikačný token. Token obsahuje len referenciu na osobu a platnosť, žiadne osobné údaje.

GET /v1/my/verification-token
{
  "token": "vft_2bc4e7f8a9...",
  "valid_until": "2026-04-20T10:30:00Z",
  "qr_url": "https://verify.sportup.sk/vft_2bc4e7f8a9..."
}
2

Hotel overí token v certifikovanej aplikácii

Recepcia naskenuje QR kód zo zariadenia hosťa. Komerčný subjekt je certifikovaný pre scope verification:athlete_discount.

POST /v1/verify/athlete-status
{
  "token": "vft_2bc4e7f8a9...",
  "purpose": "KOM-BENEFIT-001",
  "requested_attributes": ["has_active_athlete_affiliation"]
}

// → 200 OK
{
  "valid": true,
  "has_active_athlete_affiliation": true,
  "category_tier": "registered"
}

Čo hotel nevie

Hotel nevidí meno, dátum narodenia, klub, šport, úroveň — nič. Dostal iba "áno, toto je registrovaný športovec". To je dôsledok princípu minimalizácie dát. Každé takéto overenie je zapísané v audite, aby si osoba mohla pozrieť, kto sa jej dát dotýkal.

Scenár 05 · RFO notifikácia

Úmrtie a automatické ukončenie afiliácií

Dlhoročný funkcionár a rozhodca Pavol Zámečník zomiera. Informácia prichádza automaticky z RFO cez CSRÚ notifikáciu.

1

Notifikácia z CSRÚ do Identity Brokera

Štátny register notifikuje systém o úmrtí osoby. Broker aktualizuje lokálny cache a vyprodukuje interný event.

Interný event
{
  "event_type": "PersonDeathRecorded",
  "aggregate_id": "prs_zamecnik_...",
  "occurred_at": "2026-03-18T00:00:00Z",
  "data": {
    "date_of_death": "2026-03-18",
    "source": "csru_notification"
  }
}
2

Automatická terminácia afiliácií

Systém vyhľadá všetky aktívne afiliácie osoby a pre každú vyprodukuje AffiliationTerminated event s dôvodom death.

Vygenerované eventy · batch
[
  {
    "event_type": "AffiliationTerminated",
    "aggregate_id": "aff_sfz_rozhodca_...",
    "data": { "reason": "death", "effective_date": "2026-03-18" }
  },
  {
    "event_type": "AffiliationTerminated",
    "aggregate_id": "aff_fk_funkcionar_...",
    "data": { "reason": "death", "effective_date": "2026-03-18" }
  }
]
3

Ochrana citlivých údajov

GDPR sa po úmrtí neuplatňuje v plnom rozsahu, ale systém automaticky obmedzí prístup k citlivým údajom. Základné údaje sa zachovávajú pre historickú a štatistickú hodnotu — inak by sa rozbili dlhé časové rady (napr. zoznam majstrov SR za posledných 50 rokov).

Scenár 06 · Športoviská

Registrácia nového športoviska

Mesto Žilina dokončilo výstavbu novej multifunkčnej športovej haly a zapisuje ju do centrálneho katalógu. Zápis súčasne vytvára hodnotu pre šport (rezervačný systém, súťaže) aj pre cestovný ruch (verejná mapa, ubytovanie v okolí).

1

Registrácia vlastníka a prevádzkovateľa

Vlastník je mesto Žilina (organizácia typu mesto, RPO previazané). Prevádzkovateľ je mestská príspevková organizácia.

2

Registrácia športoviska

POST /v1/facilities
{
  "name_sk": "Mestská športová hala Žilina-Vlčince",
  "facility_type": "ruznopouzitelna_hala",
  "supported_sports": ["SK-VLB", "SK-BAS", "SK-HDB", "SK-FLB"],
  "owner_organization_id": "org_mesto_zilina",
  "operator_organization_id": "org_msh_zilina_po",
  "address": {
    "street": "Obežná 16",
    "municipality_code": "SK-ZA-514301",
    "region_code": "SK-ZA",
    "postal_code": "01008",
    "gps": { "lat": 49.2175, "lng": 18.7492 }
  },
  "capacity_spectators": 1800,
  "surfaces": [
    { "type": "sport_parquet", "indoor": true, "dimensions_m": "44 × 25" }
  ],
  "accessibility": {
    "wheelchair": true,
    "hearing_loop": true,
    "parking_disabled": true
  },
  "public_access": "reservation",
  "certifications": ["STN-EN-14904", "hygienicky_posudok_2026"],
  "amenities": ["parking", "changing_rooms", "showers", "cafeteria", "medical", "wifi"],
  "tourism": {
    "nearby_accommodation": true,
    "public_transport_stop_m": 120,
    "parking_spaces": 95,
    "ev_charging": true,
    "bike_parking": true
  },
  "valid_from": "2026-04-15"
}

// → 201 Created
{
  "facility_id": "fac_za_vlcince_...",
  "status": "operational",
  "public_data_url": "https://data.sportup.sk/facilities/fac_za_vlcince_..."
}
3

Následné okamžité použitie

Len čo je športovisko zapísané a má stav operational, automaticky:

  • Je viditeľné na verejnej mape SportUp a je dostupné cez otvorené API.
  • Turistické platformy (visitslovakia.com, GoZilina) ho môžu zobraziť.
  • Rezervačné systémy môžu na ňom ponúkať termíny.
  • Zväzy (SBA, SHF, SZH) ho môžu priraďovať k ligovým zápasom.
  • Obec má základný podklad pre výročné hlásenie o športovej infraštruktúre.
  • Mestský magistrát môže vypisovať verejné obstarávanie na údržbu s presným popisom objektu.
§

Nasledujúca kapitola — Integrácie — popisuje, ako systém komunikuje: REST API, MCP servery, webhooks a napojenie na štátne registre.