Log rekne co zpusobilo jakou zmenu, prevzeti ticketu a pozvanky

Nalezeno na bezicim serveru: TK-4946 mel 177 udalosti a 620 radku logu,
pritom se skoro nic nestalo. Zmereno proti fronte: ve stejnem okne vzniklo
presne tolik behu, kolik prislo udalosti (22 a 22), kazdy s jednim pokusem.
Fronta nenasobi nic, odesilatel poslal 177 POSTu. Nase vina byla, ze to
z historie neslo poznat.

- Data udalosti se ukladaji. Kdyz krok nema vlastni, ulozi se to, cim beh
  zacal - u webhooku prijate telo. Prazdna udalost je horsi nez zadna.
- Shodna udalost se pocita (repeats, lastAt), nezaklada dalsi radek. Ticket
  se pritom nemeni, takze duplikat nerozblika dashboard ani nespusti
  automatizaci na zmenu ticketu. Zahodit ji nejde, jinak by nikdo nezjistil,
  ze proti nam neco tluce.
- Zmeny se radi pod udalost, ktera je zpusobila, a u udalosti stoji jmeno
  automatizace. Log se cte jako "prislo tohle -> zmenilo to tohle".
- Poznamka o stavu jen kdyz se stav zmenil. "z in-progress na in-progress"
  u kazde zpravy byl zdroj tech 620 radku.
- runsToday konecne znamena dnes: behy po dnech, k tomu vcera a celkem.
  Dosud to byl citac od zalozeni automatizace, jen se jmenoval "dnes".

Vedle toho prace, o kterou slo predtim:
- Prevzeti ticketu ze skupiny (POST /tickets/:id/claim) a krok Predat skupine
  s prepinacem automatickeho prideleni nejvolnejsimu.
- Pozvanky do firmy: odkaz s nahodnym kodem, heslo si nastavi pozvany.
- Resitele, skupiny a pozvanky presunuty z Nastaveni do zalozky Lide, cleny
  skupiny se vybiraji klikanim.
- Ctyri AI znaky, ktere zbyvaly v kodu, pryc.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
JiriUhlir
2026-08-17 15:54:34 +02:00
co-authored by Claude Opus 5
parent fbe5b8ff6f
commit f1e8253169
30 changed files with 1839 additions and 107 deletions
+95
View File
@@ -2,6 +2,101 @@
Nejnovejsi nahore.
## 2026-08-17 - log rekne, co zpusobilo jakou zmenu
Nalezeno na bezicim serveru: ticket TK-4946 mel 177 prichozich udalosti
a 620 radku v logu, pritom se nestalo skoro nic. Zmereno proti behum ve fronte:
ve stejnem okne vzniklo **presne tolik behu, kolik prislo udalosti** (22 a 22),
kazdy s jednim pokusem. Fronta ani worker nic nenasobi - odesilatel poslal
177 POSTu. Nasi vinou bylo, ze to z historie neslo poznat.
### Opraveno
- **Data udalosti se konecne ukladaji.** `payload` byl u kazde udalosti prazdny,
protoze krok `ticket/upsert` ukladal jen to, co si clovek vyplni v poli Data.
Kdyz je prazdne, ulozi se **to, cim beh zacal** - u webhooku cele prijate telo.
Prazdna udalost je horsi nez zadna: tvari se, ze se neco stalo, a nerekne co.
- **Shodna udalost se pocita, nezaklada dalsi radek.** Kdyz prijde presne totez
co posledne, pricte se k pocitadlu (`repeats`, `lastAt`) a v portalu se u radku
ukaze "22x beze zmeny, naposledy ...". Ticket se pritom **nemeni**: neprepise
se `updatedAt` ani se nerozesle zmena, takze duplikat nerozbliká dashboard
a nespusti automatizaci navazanou na zmenu ticketu.
- Zahodit duplikat nejde. Bez pocitadla by nikdo nezjistil, ze proti nam neco
tluce ve smycce.
- Porovnava se **jen s posledni** udalosti. "Objednavka pripravena" muze
legitimne prijit znovu za hodinu - to je novy fakt.
- **Zmeny se radi pod udalost, ktera je zpusobila.** Log uz mel strom
(`parentId`), ale nikdo ho nepouzival. Zapisy behu se ted radi pod jeho radek
udalosti, takze log se cte jako "prislo tohle -> zmenilo to tohle".
- **U udalosti stoji, kdo ji prinesl**: `Prijata udalost: stav completed
(automatizace TEST)`. Prvni otazka nad zmenenym ticketem je "kdo mi do toho
sahl" a `webhook` na ni neodpovida.
- **Poznamka o stavu jen kdyz se stav zmenil.** Predtim se u kazde udalosti
zapsalo `Stav zmenen z in-progress na in-progress`, tedy tri radky logu na
jednu zpravu, ktera nic nezmenila. Odtud 620 radku.
- **Popisek udalosti uz neni porad "Udalost".** Bere se popisek, predmet, stav,
externi ID - v tomhle poradi. Casova osa, kde je na kazdem radku totez, nerika
nic.
- Typograficke uvozovky z popisku v logu pryc, plus ctyri AI znaky, ktere
zbyvaly v kodu (`web/src/data/products.ts`, `References.tsx`,
`automationStore.ts`).
### `runsToday` konecne znamena dnes
Bylo to pocitadlo od zalozeni automatizace, jen se jmenovalo "dnes" - na serveru
ukazovalo 373 za automatizaci, ktera bezi tri mesice.
- Automatizace si drzi **behy po dnech** (`days`, poslednich 14 dni). Po pulnoci
je "dnes" nula, dokud opravdu neco nebezi.
- Vedle toho `runsYesterday` a `runsTotal`. Puvodni cislo se neztratilo, jen se
spravne jmenuje.
- Uspesnost se pocita z dnesnich behu. Kdyz dnes zadny nebyl, bere se posledni
den, kdy byly - nula procent u automatizace, ktera dnes nemela co delat, by
vypadala jako porucha.
- V seznamu je pod dnesnim cislem vcerejsek, na detailu dnes, vcera i celkem.
## 2026-08-17 - prevzeti ticketu ze skupiny a pozvanky do firmy
### Pridano
- **Prevzeti ticketu.** `POST /tickets/:id/claim`. Kdo je ve skupine, ktera ma
ticket u sebe, si ho vezme sam. Prace se nerozdava shora, lidi si ji beru
podle toho, kdo ma cas.
- Vzit ticket, ktery uz nekdo resi, je neco jineho: to je prehozeni a chce
to pravo `ticket.assign.others`.
- Ticket bez resitele si vezme kdokoli, kdo je vedeny jako resitel.
- **Krok `ticket/assign-group`** (Predat skupine) s prepinacem
**Priradit rovnou nejvolnejsimu**. Prazdne nebo Ne = ticket zustane ve fronte
skupiny. Prepinac je na kroku automatizace, ne na skupine: tataz skupina
potrebuje u havarie okamzite prideleni a u bezneho dotazu ne.
- **Pozvanky do firmy.** Spravce vytvori odkaz s nahodnym kodem
(`/pozvanka/:kod`), posle ho, jak chce. Kdo ho otevre, vyplni jmeno a heslo
a je uvnitr.
- **Heslo se nikdy neposila.** Nastavuje si ho sam clovek az za odkazem.
- Kdyz uz ucet ma, zada k nemu svoje heslo a jen se pripoji k dalsi firme.
Bez overeni hesla by kdokoliv s odkazem pripojil cizi adresu ke sve firme
a videl by jeji data.
- Pozvanka plati tyden, da se zrusit a po pouziti prestane platit sama.
- Volitelne z cloveka rovnou udela resitele. Ucetni muze mit pristup do
portalu, aniz by kdy resila ticket, proto se to pta.
### Zmeneno
- **Resitele, skupiny a pozvanky jsou na strance Lide**, ne v nastaveni.
Pozvat kolegu je bezna denni prace, ne nastaveni portalu - dokud to bylo
schovane v nastaveni, nikdo to nenasel.
- **Cleny skupiny se vybiraji klikanim** ze seznamu lidi. Predtim se opisovala
ID `ppl_xxx` oddelena carkou, coz je preklep cekajici na sve misto.
### Nove soubory
| Soubor | Co dela |
| --- | --- |
| `src/data/invites.ts` | Entita pozvanky, kod, platnost. |
| `src/routes/invites.ts` | Verejne cesty (prohlednuti a prijeti) a sprava. |
| `web/src/pages/Invite.tsx` | Stranka za odkazem: jmeno, e-mail, heslo. |
| `web/src/components/dashboard/InvitePanel.tsx` | Sprava pozvanek v zalozce Lide. |
## 2026-08-13 - vyrizeno je vyslovny priznak, ne hadani ze stavu
### Zmeneno