Dane przykładowe. Klub, kadra i zgłoszenia poniżej są fikcyjne i pokazują, jak działa moduł. Wprowadź własne dane albo wyczyść przykład jednym kliknięciem.
Panel Klubu · Moduł 06 · Pilotaż
Bezpieczeństwo dzieci
Standardy ochrony małoletnich: wdrożenie, kadra, zgłoszenia i dokumenty dla rodziców
łączę…
Wdrożenie standardów — pięć kroków
Kontrola nie pyta, czy klub ma dokument — pyta, czy trener wie, co zrobić w konkretnej sytuacji. Krok jest zaliczony, gdy wszystkie jego zadania mają potwierdzenie: datę, dokument albo wpis w kadrze.
Wymaga uwagi
Podstawa prawna, na której stoi ten moduł
Obowiązek wprowadzenia standardów ochrony małoletnich ciąży na każdym organizatorze działalności sportowej z udziałem dzieci — art. 22b pkt 2 ustawy z 13 maja 2016 r. o przeciwdziałaniu zagrożeniom przestępczością na tle seksualnym i ochronie małoletnich (tzw. ustawa Kamilka). Treść standardów określa art. 22c, weryfikację kadry w rejestrach — art. 21, a wersję skróconą dla dzieci — art. 22c ust. 7. Przegląd co najmniej raz na dwa lata wynika z art. 22c ust. 6. Niewykonanie obowiązku jest wykroczeniem (art. 23b), a dopuszczenie do dzieci osoby figurującej w Rejestrze — wykroczeniem odrębnym (art. 23a). Zaświadczenie z Krajowego Rejestru Karnego zachowuje przydatność 180 dni; orzeczenie lekarskie zawodnika we współzawodnictwie wynika z art. 37 ust. 1 ustawy o sporcie. Moduł nie jest poradą prawną — wygenerowane dokumenty powinien przed uchwałą przejrzeć prawnik klubu.
Wdrożenie standardów w klubie
Pięć kroków w kolejności, w jakiej klub je przechodzi. Część zadań moduł zalicza sam na podstawie kadry i ustawień (kółko przerywane), część potwierdza człowiek datą albo kliknięciem. Uchwała zarządu jest bramą: bez niej standardy są projektem, a klub nie może twierdzić, że je wdrożył.
Kadra i weryfikacja przed dopuszczeniem do dzieci
Każda osoba dopuszczona do pracy z małoletnimi — trener, koordynator, wolontariusz, kierownik wyjazdu, osoba pomagająca jednorazowo — przechodzi te same sprawdzenia, niezależnie od formy współpracy. Rejestr z dostępem ograniczonym (RSPTS) sprawdza klub sam, jako organizator; zaświadczenie z KRK przedkłada kandydat. Wynik „figuruje” oznacza bezwzględny zakaz dopuszczenia i nie podlega dyskusji.
Legenda kolumn: R RSPTS z dostępem ograniczonym · K zaświadczenie z KRK (ważne 180 dni) · P oświadczenie o państwach zamieszkania · Z rejestr karny państwa obywatelstwa (gdy obywatelstwo inne niż polskie) · L licencja lub uprawnienia (gdy stanowisko ich wymaga) · O oświadczenie o zapoznaniu ze Standardami · S szkolenie ze Standardów (ważne 12 miesięcy) · 1 pierwsza pomoc. Wydruk z identyfikatorem odpowiedzi rejestru jest jedynym dowodem sprawdzenia — sam wpis w module nim nie jest.
Szkolenie ze Standardów — obowiązkowy e-learning
Każda osoba z kontaktem z dziećmi czyta lekcje i zalicza test wewnątrz modułu. Zaliczenie zapisuje się samo przy osobie w zakładce Kadra i jest ważne 12 miesięcy — bez niego nie ma dopuszczenia do pracy z dziećmi. Treść jest standardem modułu; klub może ją dostosować, dopisać własne zasady albo pytania.
Rejestr zgłoszeń i interwencji
Rejestr prowadzi koordynator. Służy ocenie okresowej: pokazuje, czy zgłoszenia w ogóle wpływają i jak są zamykane. Nie wpisuj tu danych dziecka ani osoby, której dotyczy podejrzenie — te trafiają wyłącznie do papierowej Karty interwencji, przechowywanej w zamykanej szafie. Tu zostaje sygnatura, kategoria, ścieżka kroków i data zamknięcia.
Zagrożenie życia lub zdrowia → 112
Jeśli dziecku dzieje się krzywda teraz, nie szukasz procedury i nie czekasz na czyjąś zgodę. Dzwonisz pod 112, zapewniasz dziecku bezpieczeństwo, a klub informujesz zaraz potem. Żaden zapis standardów nie wymaga odkładania wezwania służb.
Dokumenty klubu
Każdy dokument składa się z ustawień modułu: nazwy klubu, koordynatora, decyzji zarządu, danych o składkach i ubezpieczeniu. Pola, których klub jeszcze nie uzupełnił, są w dokumencie oznaczone na czerwono — nic nie jest wypełnione domysłem. Pobrany plik otwiera się w przeglądarce, a Ctrl+P zapisuje go jako PDF.
Wybierz dokument
Standardy w wersji zupełnej i skróconej to dwa dokumenty wymagane ustawą (art. 22c ust. 7). Przewodnik dla rodzica nie jest wymagany prawem — jest tym, co odróżnia klub, który ma dokument, od klubu, w którym rodzic wie, do kogo zadzwonić.
Podgląd
Ustawienia klubu
To jedyne miejsce, w którym wpisuje się dane klubu — dokumenty, kroki wdrożenia i alerty czytają je stąd. Zmiana koordynatora to zmiana tutaj, nie w treści dokumentów.
Klub
Koordynator do spraw bezpieczeństwa dzieci
Druga ścieżka — gdy zgłoszenie dotyczy koordynatora
Bez drugiej, niezależnej ścieżki procedura ma dziurę: nikt nie może przyjąć zgłoszenia dotyczącego osoby, która przyjmuje zgłoszenia. Ustawa wymaga wskazania osób odpowiedzialnych (art. 22c ust. 1 pkt 4).
Decyzje zarządu, których dokument nie może zgadnąć
Uchwała wprowadzająca standardy
Przegląd
Szkolenie kadry nie ma tu pola daty: jest e-learningiem w zakładce Szkolenie, a zaliczenia zapisują się same przy osobach.
Dane do Przewodnika dla rodzica
Ubezpieczenie NNW zawodników
Dane i kopia
Tryb pracy:
= 0 || w.indexOf("som") >= 0 || st.pion === "sport";
}
/* czysta funkcja: wpisuje matrycę do podanego stanu; zwraca podsumowanie */
function wczytajMatryceDoStanu(s, m, plik){
var stanowiska = {}; (m.stanowiska || []).forEach(function(st){ if (st && st.id) stanowiska[st.id] = st; });
var teraz = new Date().toISOString(), dzisiaj = teraz.slice(0,10);
var nowe = 0, zmienione = 0, widziane = {};
(m.osoby || []).forEach(function(mo){
if (!mo || !mo.id) return;
widziane[mo.id] = true;
var st = stanowiska[mo.stanowiskoId] || null;
var o = osobaZe(s, mo.id);
if (!o) { o = pustaOsoba(); o.id = mo.id; o.dotyczy = stanowiskoDotyczy(st); s.kadra.push(o); nowe++; }
else zmienione++;
o.zMatrycy = true; o.pozaMatryca = false;
o.imie = String(mo.imie || ""); o.nazwisko = String(mo.nazwisko || "");
o.rola = st ? String(st.nazwa || "") : "bez stanowiska"; o.grupa = st ? String(st.obszar || "") : ""; o.pion = st ? String(st.pion || "") : "";
o.forma = FORMA_Z_MATRYCY[mo.forma] || o.forma || "cywilna"; o.od = String(mo.od || "");
if (!o.notatka && mo.notatka) o.notatka = String(mo.notatka);
o.wymagaLicencji = st ? (st.wymagane || []).indexOf("licencja") >= 0 : o.wymagaLicencji;
/* jedyne dane sprawdzeń, które matryca niesie w zgodnej postaci: ważność szkolenia SOM (12 miesięcy) */
var kw = mo.kwalifikacje || {};
if (!o.szkolenie && kw.som && kw.som.wazneDo) { o.szkolenie = plusMies(kw.som.wazneDo, -SZKOLENIE_MIES); o.szkolenieZrodlo = "matryca"; }
});
s.kadra.forEach(function(o){ if (o.zMatrycy && !widziane[o.id]) { o.pozaMatryca = true; o.aktywny = false; } });
if (!s.klub.nazwa && m.klub && m.klub.nazwa) s.klub.nazwa = String(m.klub.nazwa);
/* podpowiedź koordynatora: osoba na stanowisku od ochrony małoletnich, jeśli nikt nie jest wskazany */
if (!s.koord.imie) {
var kand = (m.osoby || []).filter(function(mo){ var st = stanowiska[mo.stanowiskoId]; return st && /ma[łl]oletn|ochron|bezpiecze/i.test(st.nazwa || ""); })[0];
if (kand) { s.koord.imie = ((kand.imie || "") + " " + (kand.nazwisko || "")).trim(); s.koord.rodzaj = /a$/i.test(kand.imie || "") ? "f" : "m"; }
}
s.matryca = { klub:String((m.klub && m.klub.nazwa) || ""), sezon:String((m.klub && m.klub.sezon) || ""), zapisano:String(m.zapisano || ""), wczytano:teraz, osob:(m.osoby || []).length, plik:String(plik || "") };
return { nowe:nowe, zmienione:zmienione, znikly:s.kadra.filter(function(o){ return o.pozaMatryca; }).length, wZakresie:s.kadra.filter(function(o){ return o.dotyczy !== false && o.aktywny !== false; }).length, data:dzisiaj };
}
function wczytajPlikDoModulu(f){
var r = new FileReader();
r.onload = function(){
var w = rozpoznajPlik(r.result);
if (w.rodzaj === "blad") { toast("Nie wczytano: " + w.opis + "."); return; }
if (w.rodzaj === "modul") {
potwierdz("Wczytać kopię modułu z pliku „" + f.name + "”? Zastąpi bieżące dane: " + w.obj.kadra.length + " osób w kadrze i " + (w.obj.zgloszenia || []).length + " zgłoszeń.", "Wczytaj", function(){ stan = normalizuj(w.obj); zapiszStan(); render(); toast("Kopia modułu wczytana."); });
return;
}
var m = w.obj, ile = (m.osoby || []).length, znane = (m.osoby || []).filter(function(mo){ return mo && osobaZe(stan, mo.id); }).length;
potwierdz("Wczytać kadrę z Struktury klubu" + (m.klub && m.klub.nazwa ? " klubu „" + m.klub.nazwa + "”" : "") + " (" + ile + " osób, w tym " + znane + " już w module)? Dane osobowe i stanowiska zostaną zaktualizowane, sprawdzenia wpisane w module zostają.", "Wczytaj kadrę", function(){
if (stan.przyklad) { var p = pustyStan(); stan = p; }
var pod = wczytajMatryceDoStanu(stan, m, f.name);
stan.przyklad = false;
zapiszStan(); render(); pokazWidok("kadra");
toast("Kadra wczytana: " + pod.nowe + " nowych, " + pod.zmienione + " zaktualizowanych" + (pod.znikly ? ", " + pod.znikly + " brak w matrycy" : "") + ". W zakresie weryfikacji: " + pod.wZakresie + ".");
});
};
r.readAsText(f);
}
/* przykład matrycy — ten sam klub, te same osoby, co w danych przykładowych modułu 03 */
function przykladMatrycy(){
var d = function(n){ var x = new Date(); x.setDate(x.getDate() + n); return x.toISOString().slice(0,10); };
var s = function(id, nazwa, pion, obszar, kwal){ return { id:id, nazwa:nazwa, pion:pion, obszar:obszar, wymagane:kwal || [] }; };
var o = function(id, imie, nazwisko, st, forma, od, kw, nota){ return { id:id, imie:imie, nazwisko:nazwisko, stanowiskoId:st, forma:forma, od:od, kwalifikacje:kw || {}, notatka:nota || "" }; };
return { wersja:1, zapisano:new Date(Date.now() - 3 * 86400000).toISOString(), klub:{ nazwa:"Klub Sportowy Przykład", sezon:"2026/2027" },
stanowiska:[
s("st-prezes","Prezes zarządu","zarzad","Zarząd i reprezentacja",["som"]),
s("st-wice","Członek zarządu ds. finansów","zarzad","Strategia i nadzór",[]),
s("st-dyrsport","Dyrektor sportowy","sport","Pierwszy zespół i sztab",["licencja","som","rspts"]),
s("st-trener1","Trener pierwszego zespołu","sport","Pierwszy zespół i sztab",["licencja","pierwsza-pomoc","rspts"]),
s("st-koord","Koordynator akademii","sport","Akademia i grupy młodzieżowe",["licencja","som","rspts","pierwsza-pomoc"]),
s("st-trenerU","Trener grupy młodzieżowej","sport","Akademia i grupy młodzieżowe",["som","rspts","pierwsza-pomoc"]),
s("st-kier","Kierownik drużyny","organizacja","Organizacja meczowa i bezpieczeństwo",["rspts"]),
s("st-gospodarz","Gospodarz obiektu","organizacja","Obiekt i sprzęt",["impreza-masowa"]),
s("st-marketing","Specjalista ds. komunikacji i sponsoringu","biznes","Sponsoring i partnerzy",[]),
s("st-biuro","Kierownik biura klubu","administracja","Kadry i umowy",["som"]),
s("st-ksieg","Biuro rachunkowe (zewnętrzne)","administracja","Księgowość i płace",[]),
s("st-som","Koordynator ochrony małoletnich","administracja","Prawo, zgodność i ochrona małoletnich",["som"])
],
osoby:[
o("os-1","Marek","Zieliński","st-prezes","spolecznie","2019-06-01",{ som:{ wazneDo:d(380) } }),
o("os-2","Anna","Kowalczyk","st-wice","spolecznie","2021-03-15",{}),
o("os-3","Tomasz","Wróbel","st-dyrsport","cywilna","2022-08-01",{ licencja:{ wazneDo:d(210) }, rspts:{ wazneDo:d(300) } }),
o("os-4","Piotr","Nowicki","st-trener1","cywilna","2024-07-01",{ licencja:{ wazneDo:d(30) }, "pierwsza-pomoc":{ wazneDo:d(500) }, rspts:{ wazneDo:d(140) } }),
o("os-5","Karolina","Mazur","st-koord","cywilna","2023-01-10",{ licencja:{ wazneDo:d(600) }, rspts:{ wazneDo:d(90) } }),
o("os-6","Bartosz","Lis","st-trenerU","wolontariat","2025-09-01",{ rspts:{ wazneDo:d(300) } }),
o("os-7","Jan","Sikora","st-kier","spolecznie","2016-08-01",{ rspts:{ wazneDo:d(200) } }),
o("os-8","Ewa","Dudek","st-marketing","cywilna","2024-02-01",{}),
o("os-9","Halina","Górska","st-biuro","etat","2018-04-01",{}),
o("os-10","Kancelaria","Bilans Sp. z o.o.","st-ksieg","zewnetrzne","2020-01-01",{}),
o("os-11","Stanisław","Bąk","st-gospodarz","etat","2015-05-01",{ "impreza-masowa":{ wazneDo:d(-200) } }),
o("os-12","Magdalena","Pawlak","st-som","spolecznie","2025-01-15",{},"Nauczycielka, pełni funkcję społecznie.")
] };
}
/* ═══════════════════════════════════════════════════════════════════
SZKOLENIE — obowiązkowy e-learning
Osoba wybiera siebie z kadry, czyta lekcje, zalicza test z losowanych
pytań. Zaliczenie zapisuje datę szkolenia przy osobie (źródło „elearning")
i wynik do rejestru prób. Klub może zmienić treść kursu (edytor niżej).
═══════════════════════════════════════════════════════════════════ */
function losujPytania(kurs){
var p = kurs.pytania.slice(), w = [];
while (p.length && w.length < KURS_LOSUJ) w.push(p.splice(Math.floor(Math.random() * p.length), 1)[0]);
return w;
}
function progDla(pytan){ return pytan.length >= KURS_LOSUJ ? KURS_PROG : Math.ceil(pytan.length * KURS_PROG / KURS_LOSUJ); }
function renderSzkolenie(){
var k = kontekst(), kurs = kursAktualny(), kad = kadraAktywna(), uk = ui.kurs;
/* 1. status kadry */
var st = el("szkStatus");
if (!kad.length) st.innerHTML = '
Brak osób w zakresie weryfikacji. Wczytaj kadrę z Struktury klubu w zakładce Kadra.
';
else {
var w = wierszeListySzkolen();
var zal = w.filter(function(x){ return x.stan === "ważne" || /wygasa/.test(x.stan); }).length;
st.innerHTML = '
'
+ '
' + zal + ' / ' + w.length + 'osób z ważnym zaliczeniem
Wybierz osobę z listy powyżej. Szkolenie to ' + kurs.lekcje.length + ' lekcji do przeczytania i test: ' + KURS_LOSUJ + ' pytań losowanych z banku, próg zaliczenia ' + KURS_PROG + '. Nieudany test można powtórzyć od razu — losowanie jest nowe.
';
kb.className = "karta";
} else if (uk.etap === "lekcje") {
var l = kurs.lekcje[uk.lekcja] || kurs.lekcje[0];
kb.className = "karta";
kb.innerHTML = '
';
if (el("wynZasw")) el("wynZasw").addEventListener("click", function(){ ui.dok = "zasw"; ui.dokOsoba = os.id; pokazWidok("dokumenty"); });
if (el("wynKoniec")) el("wynKoniec").addEventListener("click", function(){ uk.etap = "start"; uk.osoba = ""; renderSzkolenie(); });
if (el("wynPowtorz")) el("wynPowtorz").addEventListener("click", function(){ uk.pytania = losujPytania(kurs); uk.odp = {}; uk.etap = "test"; renderSzkolenie(); kb.scrollIntoView({ block:"start" }); });
if (el("wynLekcje")) el("wynLekcje").addEventListener("click", function(){ uk.etap = "lekcje"; uk.lekcja = 0; renderSzkolenie(); kb.scrollIntoView({ block:"start" }); });
}
renderEdytorKursu();
}
/* ——— edytor treści kursu: standard modułu z możliwością modyfikacji pod klub ——— */
function renderEdytorKursu(){
var e = el("szkEdytor"), kurs = kursAktualny();
if (!ui.kurs.edycja) {
e.innerHTML = '
Treść szkolenia
' + (stan.kurs ? "Klub korzysta z własnej wersji kursu (" + kurs.lekcje.length + " lekcji, " + kurs.pytania.length + " pytań). Standard modułu jest do przywrócenia jednym kliknięciem." : "Klub korzysta ze standardu modułu (" + kurs.lekcje.length + " lekcji, " + kurs.pytania.length + " pytań w banku). Możesz zmienić brzmienie lekcji, dopisać własne zasady klubu albo pytania — wersja klubu zastąpi standard dla wszystkich kolejnych szkoleń.") + '
'
+ '
' + (stan.kurs ? '' : '') + '
';
el("kursEdytuj").addEventListener("click", function(){ ui.kurs.edycja = true; ui.kurs.robocza = JSON.parse(JSON.stringify(stan.kurs || KURS_STANDARD)); renderEdytorKursu(); e.scrollIntoView({ block:"start" }); });
if (el("kursStandard")) el("kursStandard").addEventListener("click", function(){ potwierdz("Przywrócić standardową treść kursu? Wersja klubu zostanie usunięta; dotychczasowe zaliczenia zostają.", "Przywróć standard", function(){ stan.kurs = null; zapiszStan(); render(); toast("Przywrócono standard modułu."); }); });
el("kursPodglad").addEventListener("click", function(){ ui.dok = "kurs"; pokazWidok("dokumenty"); });
return;
}
var r = ui.kurs.robocza;
e.innerHTML = '
'; }).join("")
+ ''
+ '';
var zbierz = function(){
r.tytul = el("keTytul").value.trim() || KURS_STANDARD.tytul;
r.lekcje.forEach(function(l, i){ l.tytul = e.querySelector('[data-lt="' + i + '"]').value.trim(); l.tresc = e.querySelector('[data-ltr="' + i + '"]').value; });
r.pytania.forEach(function(p, i){ p.tresc = e.querySelector('[data-pt="' + i + '"]').value.trim(); p.warianty = [0,1,2].map(function(j){ return e.querySelector('[data-pw="' + i + '-' + j + '"]').value.trim(); }); var ch = e.querySelector('input[name="pp' + i + '"]:checked'); p.poprawna = ch ? +ch.value : 0; p.wyjasnienie = e.querySelector('[data-pwy="' + i + '"]').value.trim(); });
};
var odswiez = function(){ zbierz(); renderEdytorKursu(); };
e.querySelectorAll("[data-lgora]").forEach(function(b){ b.addEventListener("click", function(){ zbierz(); var i = +b.dataset.lgora; if (i > 0) { var t = r.lekcje[i]; r.lekcje[i] = r.lekcje[i - 1]; r.lekcje[i - 1] = t; } renderEdytorKursu(); }); });
e.querySelectorAll("[data-ldol]").forEach(function(b){ b.addEventListener("click", function(){ zbierz(); var i = +b.dataset.ldol; if (i < r.lekcje.length - 1) { var t = r.lekcje[i]; r.lekcje[i] = r.lekcje[i + 1]; r.lekcje[i + 1] = t; } renderEdytorKursu(); }); });
e.querySelectorAll("[data-lusun]").forEach(function(b){ b.addEventListener("click", function(){ zbierz(); r.lekcje.splice(+b.dataset.lusun, 1); renderEdytorKursu(); }); });
e.querySelectorAll("[data-pusun]").forEach(function(b){ b.addEventListener("click", function(){ zbierz(); r.pytania.splice(+b.dataset.pusun, 1); renderEdytorKursu(); }); });
el("keLekcjaDodaj").addEventListener("click", function(){ zbierz(); r.lekcje.push({ tytul:"Zasady naszego klubu", tresc:"" }); renderEdytorKursu(); });
el("kePytanieDodaj").addEventListener("click", function(){ zbierz(); r.pytania.push({ tresc:"", warianty:["","",""], poprawna:0, wyjasnienie:"" }); renderEdytorKursu(); });
el("keAnuluj").addEventListener("click", function(){ ui.kurs.edycja = false; renderEdytorKursu(); });
el("keZapisz").addEventListener("click", function(){
zbierz();
var lekcje = r.lekcje.filter(function(l){ return l.tytul && l.tresc.trim(); });
var pytania = r.pytania.filter(function(p){ return p.tresc && p.warianty.every(Boolean); });
if (lekcje.length < 1) { toast("Kurs musi mieć co najmniej jedną lekcję z treścią."); return; }
if (pytania.length < KURS_LOSUJ) { toast("Bank pytań musi mieć co najmniej " + KURS_LOSUJ + " kompletnych pytań (jest " + pytania.length + ")."); return; }
stan.kurs = { tytul:r.tytul, zmieniono:new Date().toISOString(), lekcje:lekcje, pytania:pytania };
ui.kurs.edycja = false; zapiszStan(); render(); toast("Zapisano wersję klubu: " + lekcje.length + " lekcji, " + pytania.length + " pytań.");
});
void odswiez;
}
/* podgląd całego kursu jako dokument (do wydruku i do przeglądu przez organ) */
function dokKurs(k, kurs){
var t = "
Treść szkolenia ze Standardów Ochrony Małoletnich prowadzonego w klubie w formie e-learningu. Każda osoba dopuszczana do pracy z dziećmi czyta poniższe lekcje i zalicza test (" + KURS_LOSUJ + " pytań losowanych z banku " + kurs.pytania.length + ", próg " + KURS_PROG + "). Zaliczenie jest ważne 12 miesięcy.