Skip to main content

Kalendarz „Moje zajęcia" i znacznik dodania uczestnika

Dwie poprawki w widoku klienta, które wyglądały na jeden problem, a nie miały ze sobą nic wspólnego.

👤 Instrukcja dla użytkownika

Widok „Lista" pokazuje 30 dni naprzód

Zakładka Zajęcia ma cztery widoki: Miesiąc, Tydzień, Dzień i Lista. Lista pokazuje kolejne 30 dni licząc od dzisiaj — czyli pod koniec sierpnia sięga do końca września, a nie urywa się na ostatnim dniu miesiąca.

Wcześniej urywała się: aplikacja wyświetlała nagłówek „31.08 – 30.09", ale pobierała dane tylko za sierpień. Klient zapisany na 1 września widział „Brak wydarzeń w tym zakresie", mimo że zapis był poprawny. Im bliżej końca miesiąca, tym mniej dni faktycznie działało — ostatniego dnia miesiąca widać było jeden.

Jeśli ktoś zgłasza, że „nie widzi swoich zajęć", a w panelu widać, że jest zapisany, to najpewniej właśnie to. Objazd przed wdrożeniem poprawki: przełączyć na Miesiąc i kliknąć Następny.

Znacznik „Dodany przez pracownika"

Na liście uczestników każdy ma znacznik mówiący, skąd się wziął — dodany przez klienta czy przez recepcję. Do tej pory każde dziecko dodane samodzielnie przez klienta dostawało „Dodany przez pracownika", więc znacznik nie znaczył nic.

Od teraz decyduje o tym rola osoby, która faktycznie dodaje uczestnika. Dla uczestników dodanych wcześniej znacznik został poprawiony tam, gdzie historia jednoznacznie pokazuje, kto działał; tam, gdzie nie ma po tym śladu, został bez zmian — zgadywanie byłoby gorsze od uczciwego „nie wiadomo".

W razie wątpliwości rozstrzyga historia zajęć, nie znacznik: tam widać konkretny adres e-mail i godzinę zapisu.

🔧 Dokumentacja techniczna

Zakres kalendarza

Widok Agenda w react-big-calendar renderuje [data, data + length dni], gdzie domyślny length to DEFAULT_LENGTH = 30. Serwer liczył zakres przez calculateDateRange, które nie miało case'u dla 'agenda' i wpadało w default — czyli bieżący miesiąc kalendarzowy.

Oba zakresy pochodzą teraz z jednej stałej:

  • AGENDA_LENGTH_DAYS w lib/utils.ts,
  • case 'agenda' w calculateDateRange liczy data … data + AGENDA_LENGTH_DAYS,
  • UserActivities.tsx przekazuje length={AGENDA_LENGTH_DAYS} do BigCalendar, żeby biblioteka nie mogła wrócić do własnej domyślnej wartości.

default nadal daje miesiąc — dla widoków spoza listy month/week/day/agenda.

Znacznik pochodzenia uczestnika

player.created_type był ustawiany tak:

data.created_type ?? (clientIdToInsert ? 'online' : 'created_by_employee');

client_id wskazuje własny rekord właściciela konta — dla każdego innego uczestnika jest celowo pusty, inaczej getPlayerByClientId zwracałoby dziecko zamiast rodzica. Brak client_id był więc stanem normalnym, a nie sygnałem o pracowniku.

Teraz decyduje rola aktora (resolveCreatedType w lib/actions/players.ts): rola inna niż CLIENT daje created_by_employee, wszystko pozostałe online. Brak sesji — rejestracja z linku kampanijnego, rezerwacja publiczna — to również online, bo to ścieżki samoobsługowe. Jawnie podany created_type (np. synced_from_local_user) nadal wygrywa.

Migracja 0252

Naprawia rekordy już zapisane, ale tylko tam, gdzie ślad mówi, kto działał:

  • zgoda w consent_log z actor_type = 'customer', albo
  • zdarzenie joined / skill_assessment_enrolled / consent_accepted w game.event_log zapisane pod adresem właściciela uczestnika.

Uczestnicy ze zgodą zapisaną przez pracownika są pomijani. Uczestnicy bez żadnego śladu zostają bez zmian.

Na produkcji kwalifikowało się 41 ze 176 kandydatów. Ani jeden kandydat nie miał śladu wskazującego wyłącznie na pracownika — co samo w sobie mówi, jak bardzo ten znacznik był oderwany od rzeczywistości.

Zapytanie jest napisane tak, żeby szło od kandydatów do zdarzeń, a nie odwrotnie: ten sam warunek w formie skorelowanego EXISTS przechodzi log zdarzeń wszystkich gier i czyta ~9,7 mln wierszy zamiast ~78 tys.

Testy

  • lib/utils.test.ts — zakres agendy: 30 dni naprzód, także z ostatniego dnia miesiąca; default nadal miesiąc.
  • __tests__/lib/actions/players.test.tscreated_type z roli aktora (klient → online, pracownik → created_by_employee) i pierwszeństwo wartości podanej jawnie.