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_DAYSwlib/utils.ts,case 'agenda'wcalculateDateRangeliczydata … data + AGENDA_LENGTH_DAYS,UserActivities.tsxprzekazujelength={AGENDA_LENGTH_DAYS}doBigCalendar, ż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_logzactor_type = 'customer', albo - zdarzenie
joined/skill_assessment_enrolled/consent_acceptedwgame.event_logzapisane 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;defaultnadal miesiąc.__tests__/lib/actions/players.test.ts—created_typez roli aktora (klient →online, pracownik →created_by_employee) i pierwszeństwo wartości podanej jawnie.