Skąd plan pacjenta bierze treść i jak warstwy uprawnień (superadmin → gabinet → higienistka) na siebie nachodzą. Strona robocza dla zespołu.
Treść spływa z góry na dół. Każda warstwa może coś zmienić tylko w granicach uprawnień. Plakietka po prawej = kto edytuje daną warstwę.
scope=global./api/templates/global · draft → publish jest na DEVscope=gabinet, template_mode, allow_member_private_template model jestscope=user · /api/templates/mine · draft → publish jest na DEV (solo)Tożsamość („kim jesteś") pochodzi z Clerk. Uprawnienie („co wolno") liczy serwer (Worker + baza D1) na podstawie roli — front tylko pokazuje/chowa.
| Rola | Co może edytować | Czego nie może | Skąd autoryzacja |
|---|---|---|---|
| 🔒 Superadmin (Asia + 3 maile) |
Warstwę globalną = ankietę-źródło dla wszystkich. Panel admina: treść, gabinety, „darmowe miesiące", maile. | — | Tabela platform_admins (lista maili) + assertCanEditGlobal w Workerze. |
| 🏢 Manager gabinetu | Szablon swojego gabinetu (na bazie globalnej). Ustawia, czy narzuca go zespołowi i czy higienistka może mieć własny. | Nie rusza warstwy globalnej ani innych gabinetów. | Rola owner w account_members (lustro Clerk Organizations). |
| 👩⚕️ Higienistka | Swój własny szablon — solo zawsze; członek gabinetu tylko gdy gabinet na to pozwoli. | Nie rusza globalnej ani cudzych. Członek z zablokowanym własnym szablonem korzysta z gabinetowego. | 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. |
Edytor i baza już są (warstwa zapisu). Brakuje strony odczytu: żeby silnik czytał efektywną ankietę z serwera zamiast z Excela.
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.
Jedno źródło prawdy: ankieta admina. Silnik czyta efektywną ankietę z serwera (z Excelem jako zapasem na czas przejścia, potem wyłączamy Excel).
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". Dla warstwy globalnej taki złoty test już istnieje (PR #42/#43) — trzeba domknąć resztę.
Publiczny odczyt opublikowanej efektywnej ankiety (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".