HIGI

Logika silnika i źródło prawdy

Skąd plan pacjenta bierze treść, jak działają wersje (fabryczna Asi + własne kopie) i kto co może zmieniać (superadmin → gabinet → higienistka). Strona robocza dla zespołu.

Cel, który ustalamy: źródłem prawdy jest ankieta admina (Asia / superadmin) — to wersja „fabryczna": domyślna dla wszystkich i zawsze przywracalna. Każdy (gabinet, higienistka) może na jej bazie zapisać własne, nazwane wersje (kopie) i jedną z nich uczynić aktywną. Aktywna wersja karmi silnik, który generuje plan pacjenta. Gdy Asia coś poprawi — user z własną wersją dostaje powiadomienie i sam decyduje, czy wziąć jej zmiany (bierze tylko to, co Asia zmieniła, zachowując swoje). Excel ma zniknąć jako źródło treści. (decyzja D-35, 2026-06-29)
Jak to ma działać

Od fabrycznej ankiety Asi do planu pacjenta

Asia prowadzi jedną fabryczną wersję. Każdy może na jej bazie zapisać własne nazwane kopie i przełączać, która jest aktywna. To nie jest scalanie warstw — aktywna wersja to zawsze jedna kompletna ankieta. Plakietka po prawej = kto czym zarządza.

Fabryczna · źródło prawdy / defaultAnkieta globalna (Asia)
Pełna ankieta: pytania, bloki, warunki, zalecenia, produkty, rutyny. W bazie jeden wiersz scope=global. Żywa — każda publikacja Asi to nowa wersja fabryczna, dostępna dla wszystkich.
🔒 superadmin (Asia)
Edytuje tylko platforma-admin (lista 4 maili). /api/templates/global · draft → publish jest na DEV
każdy startuje od fabrycznej ↓
Wersje gabinetuNazwane kopie gabinetu
Gabinet zapisuje własne nazwane kopie fabrycznej = standard kliniki. Ustala, czy narzuca je zespołowi i czy higienistka może mieć własne. Kopia jest zamrożona w chwili zapisu.
🏢 manager gabinetu
scope=gabinet · allow_member_private_template cel (Etap 2)
członek bierze wersję gabinetu — lub własną, gdy wolno ↓
Wersje higienistkiNazwane kopie higienistki
Solo: własne kopie z fabrycznej. W gabinecie: używa wersji gabinetu, a własne kopie tylko gdy gabinet pozwoli. Każdy ma przycisk „przywróć fabryczne" — wraca na Asię, a własne kopie zostają na liście.
👩‍⚕️ higienistka
scope=user · /api/templates/mine · zapis solo jest na DEV
wybrana AKTYWNA wersja ↓
WynikAktywna wersja
Jedna wybrana wersja danej higienistki — fabryczna albo jej własna nazwana kopia. To ona karmi silnik. Bez scalania: aktywna wersja to kompletna, gotowa ankieta.
⚙️ system
Odczyt opublikowanej wersji (za logowaniem) do zrobienia (E2c)
+ odpowiedzi pacjenta z ankiety (zostają w przeglądarce — RODO)
GenerowanieSilnik → Plan pacjenta
Silnik łączy aktywną wersję ankiety z odpowiedziami pacjenta i tworzy spersonalizowany plan (HTML / PDF). Liczy się w przeglądarce — żadne dane pacjenta nie idą na serwer.
🦷 pacjent
Dostaje plan do domu

Gdy Asia wypuści nową fabryczną — powiadomienie i wybór (D-35)

Poprawka Asi nie nadpisuje po cichu cudzych wersji. Kto ma własną wersję, dostaje popup „Asia wypuściła nową wersję" + listę co się zmieniło (bloki zmienione / dodane / usunięte). Po kliknięciu „weź poprawki Asi" wchodzą tylko bloki, które Asia zmieniła — własne zmiany zostają; a gdy ten sam blok ruszyły obie strony, user wybiera przy tym jednym: „zostaw moje / weź Asi". Dzięki temu poprawka Asi może dotrzeć do każdego, ale świadomie.

jest na DEV — działa, zweryfikowane do zrobienia — brakujące ogniwo
Uprawnienia

Kto co edytuje — i czym to jest egzekwowane

Tożsamość („kim jesteś") pochodzi z Clerk. Uprawnienie („co wolno") liczy serwer (Worker + baza D1) na podstawie roli — front tylko pokazuje/chowa.

RolaCo może edytowaćCzego nie możeSkąd autoryzacja
🔒 Superadmin
(Asia + 3 maile)
Wersję fabryczną (globalną) = domyślną ankietę-źródło dla wszystkich. Panel admina: treść, gabinety, „darmowe miesiące", maile. Tabela platform_admins (lista maili) + assertCanEditGlobal w Workerze.
🏢 Manager gabinetu Własne nazwane wersje gabinetu (kopie fabrycznej). Ustawia, czy narzuca je zespołowi i czy higienistka może mieć własne. Nie rusza fabrycznej (Asi) ani innych gabinetów. Rola owner w account_members (lustro Clerk Organizations).
👩‍⚕️ Higienistka Własne nazwane kopiesolo zawsze; członek gabinetu tylko gdy gabinet pozwoli. Każdy może „przywrócić fabryczne". Nie rusza fabrycznej ani cudzych. Członek z zablokowanym własnym szablonem korzysta z wersji gabinetu. Rola member + flaga allow_member_private_template gabinetu.
🦷 Pacjent Wypełnia ankietę u higienistki, dostaje plan. Nic nie edytuje. Jego dane nie trafiają na serwer. Brak konta — wszystko w przeglądarce.
Konta i role tworzą się same. Przy pierwszym zalogowaniu Worker zakłada userowi zapis na serwerze — konto + rola (owner dla solo/gabinetu, member dla zaproszonej higienistki) — bez ręcznej roboty. Własna wersja ankiety powstaje dopiero przy pierwszym zapisie; do tego czasu user jedzie na żywej fabrycznej. Nic się nie pre-kopiuje na zapas.
Dlaczego dziś Excel — i czego brakuje

Stan dziś vs cel

Edytor i baza już są (warstwa zapisu). Brakuje strony odczytu: żeby silnik czytał aktywną wersję z serwera zamiast z Excela.

● Dziś

📊 Excel (snapshot treści Asi)
↓ czyta
⚙️ Silnik → plan pacjenta
— — — brak połączenia — — —
✏️ Edytor (global / solo) → 💾 baza D1

Edytor zapisuje treść na serwer, ale silnik tego nie czyta — bierze plan ze starego snapshotu Excela. Dwa rozłączone światy: edycje nie zmieniają planu pacjenta.

● Cel

✏️ Fabryczna (Asia) + własne nazwane kopie
↓ wybór aktywnej
📋 Aktywna wersja (z serwera, opublikowana)
↓ czyta
⚙️ Silnik → plan pacjenta

Jedno źródło prawdy: fabryczna Asi. Każdy może mieć własne kopie; silnik czyta aktywną wersję z serwera (z Excelem jako zapasem na czas przejścia, potem wyłączamy Excel).

Brakujące ogniwo nr 1 — „E2b": model edytora = pełnia silnika dowód PASS

Edytor musi umieć wszystko, co silnik (statusy typu „pole do ręcznego wpisania" i „treść stała", bogate warunki, znak zamiast ->) + test parytetu, który pilnuje, że „edytor → silnik" daje identyczny plan co „Excel → silnik". Złoty test parytetu na realnej ankiecie (38 pytań) przeszedł bajt-w-bajt — to ryzyko zdjęte.

Brakujące ogniwo nr 2 — „E2c": silnik czyta z serwera

Odczyt opublikowanej aktywnej wersji za logowaniem (silnik chodzi w sesji higienistki; content_version_id dla global jest dziś pusty — „wypełniane od E2c") + przełączenie silnika na to źródło + zapas na Excel + wyłączenie Excela, gdy parytet się zgadza. Wszystko dev-first, na bramce review, prod dopiero na „promuj".