Resitel je clenstvi uctu, firma z ARES, prepinani jazyku schovane

Resitel uz neni vlastni zaznam spojeny s uctem pres e-mail: je to
clenstvi uctu ve firme a jeho ID je ID uctu. Popisek, kapacita, externi
ID a zapnuti visi na clenstvi, takze clovek ve dvou firmach je v kazde
jinak a spravce firmy ho vypne jen u sebe. Odebrani z firmy odebere jen
clenstvi. Stara data se pri startu jednou prevedou (migratePeople.ts),
vcetne odkazu v ticketech, skupinach, automatizacich, akcich a widgetech.
Sprava lidi v zalozce Lide zaklada ucty, pozvanka uz nema volbu resitele.

Zalozeni firmy z registru ARES: hledani podle IC nebo nazvu, dotazeni
IC, DIC, sidla a pravni formy, vyber soucasnych statutarnich zastupcu
a prokury, ucty spravce firmy s nahradnim e-mailem IC-poradi@placeholder.cz.
Vychozi rozlozeni dashboardu bez resitele neobsahuje list.myTickets.

Prepinani jazyku je docasne schovane (MULTILANG_ENABLED), web je cesky.
Dokumentace aktualizovana.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
JiriUhlir
2026-09-09 13:09:35 +02:00
co-authored by Claude Fable 5.1
parent 6eed909a0d
commit bc6508e1f3
41 changed files with 1415 additions and 328 deletions
+86
View File
@@ -2,6 +2,92 @@
Nejnovejsi nahore.
## 2026-09-09 - Prepinani jazyku docasne schovane
Do rozhodnuti o nove znacce je web jen cesky. `MULTILANG_ENABLED = false`
v `web/src/i18n/index.ts` schova prepinac v hlavicce i v mobilnim menu a
`detect()` vraci vzdy `cs`; ulozena volba `en` se ignoruje, jinak by nekdo
zustal v anglictine bez cesty zpet. Slovniky a `LanguageSwitch` zustavaji,
zapnuti je jedna konstanta. Navrh znacky je zatim jen artefakt "Navrh znacky",
do projektu se neaplikoval.
## 2026-09-09 - Resitel je clenstvi uctu, ne vlastni zaznam
Prvni priznak: osoby zalozene pres ARES dostaly ucet, ale v Lidech nebyl
nikdo, ani ten, za koho se spravce prepnul. Puvodni oprava chtela k uctu
dozakladat zaznam resitele. Pri ni se ukazalo, ze chyba je hloubeji: resitel
byl vlastni zaznam (`ppl_...`) spojeny s uctem **pres e-mail**, a e-mail je
prihlasovaci jmeno, ktere spravce muze zmenit. Zmena adresy vazbu tise
rozbila - clovek prestal videt "moje tickety" a nikdo nevedel proc. Kazde
misto, ktere zaklada ucet (pozvanka, ARES, Nastaveni), navic muselo pamatovat
na druhy zaznam a jedno vzdycky zapomnelo.
Rozhodnuti: spojovat pres ID misto e-mailu by znamenalo dal drzet dva zaznamy
o jednom cloveku. Oba se proto slily: **resitel je clenstvi uctu ve firme**,
kazdy clen muze mit tickety u sebe, ID resitele je ID uctu.
### Model
`Membership` (`src/shared/users.ts`) ma navic `role` (popisek), `capacity`
(vychozi 8) a `externalIds`. `Person` (`src/shared/people.ts`) je jen pohled
na jedno clenstvi: `id` = ID uctu, `tenantId` = firma clenstvi, jmeno
a e-mail z uctu, `enabled` = stav uctu, `roleIds` = role clenstvi. Tentyz
clovek ve dvou firmach je dvakrat se stejnym `id`.
`src/data/people.ts` uz nic neuklada: zmizely `personStore`, `seedPeople`,
`refreshPeople` a `findPersonByEmail`. Pohled sklada jedine misto,
`personView`; k tomu `listPeople(tenantIds)`, `listAllPeople`,
`findPerson(id, tenantId)` (neclen je `undefined`), `personName(id)`,
`findPersonByExternalId(value, tenantIds)` a `personIdFor(user, tenantId)`.
Skupiny (`personGroup`) zustavaji, clenove odkazuji na ID uctu.
### Migrace starych dat
`src/data/migratePeople.ts` bezi pri startu z `bootstrapData`, az po nacteni
ticketu a automatizaci, a jen kdyz ma stara kolekce `person` zaznamy. Ke
kazdemu najde ucet podle e-mailu, nebo ho zalozi (nahodne heslo, `enabled`
podle resitele, clenstvi `role_agent`), prenese popisek, kapacitu a externi
ID na clenstvi a prepise `ppl_x -> usr_y` v ticketech (`assigneeId`,
`resolvedById`), stromech automatizaci (nahrada v JSON), skupinach, telech
akci a zdrojich vlastnich widgetu. Prevedene zaznamy smaze a zaloguje
`[migrace] resitele -> ucty: ...`. Chyba jen loguje, zaznam se zkusi znovu
pri dalsim startu. Historicke udalosti v logu ticketu si stara ID nechavaji.
### API a web
`/api/dashboard/settings/people` ma stejne cesty a pravo `people.manage`,
ale pod nim jsou ucty: `POST` zalozi ucet (heslo nahodne, kdyz chybi, role
`role_agent`) s clenstvim, nebo prida clenstvi uctu s tim e-mailem; `PATCH`
meni jmeno, e-mail (unikatni) a `enabled` na uctu a popisek, kapacitu,
externi ID a role na clenstvi; `DELETE` odebere jen clenstvi a ucet bez
clenstvi bez `platformAdmin` vypne. Udalosti `person.*` nesou `{ id, person }`.
`/users` bere u clenstvi i `seesAllTenant`, `role`, `capacity`, `externalIds`
a pri uprave je zachova. Pozvanka prisla o `asPerson` (prijme se a ignoruje).
ARES zaklada ucet `role_admin` s popiskem clenstvi z funkci v rejstriku.
V portalu spravce v Lidech upravuje cleny (pole vyse, role jako vyber vice
hodnot), `InvitePanel` ztratil prepinac "zalozit i jako resitele" a texty
o "resiteli bez uctu" a "spojce pres e-mail" jsou pryc. `hasPerson` pro
katalog widgetu a vychozi rozlozeni znamena "je clenem firmy".
### Ukazkova data
Ukazkovi resitele jsou ukazkove ucty (heslo `demo1234`): `usr_1`
admin@automia.cz (Vedouci tymu, 5), `usr_2` karel.vomacka@automia.cz
(Automia Servicedesk 8, Nordis Spravce servicedesku 8), `usr_3`
martin.kriz@automia.cz (Integrace a API, 6), `usr_novakova`, `usr_bartos`,
`usr_horakova`, `usr_kadlec`. Ukazkove tickety, automatizace a skupina
`grp_servicedesk` odkazuji na ne.
### Ucet ve vic firmach
Ucet muze byt ve vic firmach, proto se v Lidech odebira jen clenstvi
(`DELETE /settings/people/:id`), ne ucet. Ze stejneho duvodu je i `enabled`
na clenstvi: spravce firmy vypne cloveka u sebe, ne v jine firme, kde
pracuje dal. Cely ucet vypina jen sprava uzivatelu. `Person.enabled` je
`ucet.enabled && clenstvi.enabled !== false`; vypnute clenstvi se nenabizi
k prirazeni ani nehleda podle externiho ID.
## 2026-09-09 - Novy ucet videl na dashboardu chybejici widget
Kdo se prihlasil do nove firmy (nebo jako nove zalozeny ucet), videl jako