Portal nemel zadnou tenanci. Kterykoliv prihlaseny uzivatel videl vsechny tickety vsech firem i cely seznam resitelu, requireRole se nikde nevolal. Tenant je hranice viditelnosti, tenantId na ticketu, resiteli i automatizaci. Uzivatel muze patrit do vic firem, v kazde s jinou roli. Pristup napric firmami je zvlast jako platformAdmin. Tri pohledy na tickety: all, tenant, mine. Admin mezi nimi prepina vcetne vyberu firmy. O pravech rozhoduje jedine data/access.ts, klient si nic nedovozuje a bere je z GET /api/dashboard/access. Filtr na firmu je v ulozistich povinny argument, takze zapomenuty filtr neznamena vse, ale nezkompiluje se. Cizi firma vraci 403 nebo 404, nikdy tise zuzeny vysledek. Prirazeni jen v ramci firmy. Prehazovat praci mezi lidmi smi jen admin, agent si smi vzit ticket na sebe. Zmena prihlasovani: ucet klient@firma.cz zanikl, demo ucty jsou nove. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
7.9 KiB
99 - Zaznam zmen
Nejnovejsi nahore.
2026-08-03
Tickety predelane na plnohodnotny konektor. Prestavaji byt polozkou v seznamu a stavaji se prichozim pozadavkem, ktery ma sveho cloveka a dohledatelny prubeh. Popis modelu je v 06-tickety.md.
Pridano
- Kanaly do ticketu: WhatsApp jako novy konektor, e-mail a hlasova linka jako plnohodnotne spoustece.
- Konektor Tickety presunut do nove kategorie
servicedesk, rozsiren o spoustececreated,unknown-customer,assigned,status-changeda akceassign,set-status,link-customer. - Resitele (
src/data/people.ts) oddelene od uzivatelu portalu, spojka e-mailem. - Log ticketu ve strome vcetne toho, co ktera volana sluzba vratila.
- Prehled vytizeni tymu, kdo co ma u sebe, zaroven jako filtr seznamu.
- Detail ticketu
/dashboard/tickety/:id: prubeh a log, prirazeni, stav, zakaznik, komentare. - Filtry seznamu ticketu na serveru: resitel (vcetne
meaunassigned), stav, kanal. providedFieldsv katalogu konektoru: parametry, ktere spoustec predava sam.- Udalost
ticket.assignedna sbernici i v portalu. - Endpointy
/api/dashboard/people,/tickets/workload,/tickets/:ida POST varianty pro assign, status a comment. Vse ve Swaggeru.
Zmeneno
Ticketma misto volnehorequesterstrukturovanehocustomers nullableidfirmy v CRM, k tomuchannel,assigneejako odkaz na cloveka aautomationId.customer.id === nullje nosna informace, ne chybejici udaj. Prave na ni se pta podminka "mame zakaznika?" ve strome automatizace.- Simulace ticketu bere kanal a prepinac, jestli se zakaznik dohleda. Zakladany ticket dostane cely realisticky log.
- Builder ukazuje parametry od sluzby jen ke cteni. Server je pri ulozeni vzdy dosadi z katalogu, a to jeste pred validaci stromu.
Vedome neudelano
Bugs a wishes zustavaji mimo. Vyvojarska agenda ma jiny zivotni cyklus a slucovat ji s tickety by znamenalo, ze ani jedna evidence nefunguje poradne.
Doplneno pote
Puvodni verze mela diru: ticket nemel zadny obsah a krok "Zalozit ticket" nesel nastavit. Slo tedy rict "z WhatsApp udelej ticket", ale ne uz co se ma kam ulozit.
Ticket.bodyaTicket.sourceRef. Predmet je shrnuti, telo je cely text pozadavku.bodyvystaveno i ve spoustecichcreatedaunknown-customer, takze na obsah ticketu jde udelat podminka v navazne automatizaci.- Nastavitelna pole akci (
OperationFieldaFlowStep.inputs). Ticket, e-mail a WhatsApp maji skutecna pole misto pouhe napovedy. - Sablony
{{parametr}}v hodnotach poli (src/data/templates.ts) vcetne nabidky parametru, ktera je vklada na pozici kurzoru. - Vyber resitele u akci se plni ze seznamu lidi, ne z rucne psaneho ID.
- Nevyplnene povinne pole a odkaz na neexistujici parametr se hlasi jako nedodelek. Nastaveni pole, ktere akce nema, je chyba 400.
- Akce bez
inputsto v builderu napisou primo na karte kroku.
Vystupy kroku a predvalidace
Druha dira: kroky slo vkladat kamkoliv, ale podminka videla jen parametry spoustece. Slo tedy pridat krok "zeptej se CRM", ale ne se vetvit podle toho, co vratil. Bez toho byla predvalidace k nicemu.
outputFieldsv katalogu: co akce vrati dalsim krokum. Ma je "Dohledat firmu" (customerKnown,companyId,companyName), "Zaradit do kategorie", "Zalozit obchodni pripad" i "Zalozit ticket".- Nova akce RAYNET "Dohledat firmu". Nic nezaklada, jen odpovi, jestli odesilatele zname. Presne pro predvalidaci.
src/data/flowScope.tspocita, co je videt v kterem miste stromu. Krok vidi spoustec plus vystupy kroku pred nim. Vetev nepridava nic do sekvence za podminkou, protoze nemusela probehnout.- Builder nabizi v podmince i v polich akce presne ty parametry, ktere v danem miste doopravdy jsou.
- Odkaz na parametr, ktery ve strome neni, je chyba 400. Odkaz na parametr, ktery vznika az pozdeji, je nedodelek s radou posunout podminku niz.
- Duplicitni jmeno parametru ve scope je nedodelek. V sablone by nesl poznat, ktery se dosadi.
Kanaly a vzorove automatizace
- Konektory Facebook Messenger a Instagram, kanaly
facebookainstagramu ticketu. - Ctyri nove vzorove automatizace v rozdeleni, ktere odpovida zameru: jedna
na kanal pro prijem, jedna spolecna pro smerovani na resitele.
Prijmove zamerne neprirazuji, smerovani si ticket prevezme a podminkou
assigned neni splnenoneprepise rucni rozhodnuti.
Firmy a prava
Treti a nejvazneji dira: portal nemel zadnou tenanci. Kterykoliv prihlaseny
uzivatel videl vsechny tickety vsech firem a cely seznam resitelu, requireRole
se nikde nevolal. Popis v 07-firmy-a-prava.md.
- Tenant jako hranice viditelnosti.
tenantIdna ticketu, resiteli i automatizaci. - Uzivatel muze patrit do vic firem, v kazde s jinou roli (
memberships). Pristup napric firmami je zvlast jakoplatformAdmin. - Tri pohledy na tickety:
all,tenant,mine. Admin mezi nimi prepina, vcetne vyberu firmy. src/data/access.tsjako jedine misto, kde se rozhoduje o pravech.GET /api/dashboard/accessrekne klientovi, co smi kreslit.- Filtr na firmu je v ulozistich povinny argument. Zapomenuty filtr neznamena "vse", ale nezkompiluje se.
- Nikdy tise nezuzujeme. Cizi firma vraci 403 nebo 404.
- Prirazeni jen v ramci firmy. Prehazovat praci mezi lidmi smi jen admin, agent si smi vzit ticket na sebe.
requireRolenahrazenrequirePlatformAdmin. Prava uvnitr firmy resiaccess.ts, protoze zavisi na tom, ktera firma pozadavek zajima.- Demo ucty pokryvaji vsechny tri situace vcetne cloveka ve dvou firmach.
Zapsano jako otevrene rozhodnuti
Vsechny automatizace se stejnym spoustecem se spusti. Doporucene rozdeleni na to nenarazi, ale az se bude psat runtime, musi se to rozhodnout vedome. Varianty a doporuceni v 06-tickety.md.
2026-07-31
Prvni nasazeni aplikace do repozitare csbot-prototype.
Puvodni sablona byla holy Express s endpointy / a /health. Nahradil ji
kompletni web a klientsky portal.
Pridano
- Verejny web: homepage se sekcemi, sluzby, o nas, kontakt s formularem, 404.
- Prihlaseni pres JWT s demo ucty.
- Klientsky portal: prehled s grafem, tickety, incidenty, automatizace, konektory, nastaveni.
- Builder automatizaci: strom akci, spoustec, vetveni podminkou.
- Katalog 25 konektoru v 8 kategoriich.
- Webhook s registrovanou adresou, token generuje server.
- Zivy dashboard pres SSE, vcetne indikatoru spojeni a bublin s udalostmi.
- Simulace provozu pod tlacitkem v postrannim menu portalu.
- Swagger UI na
/docsa OpenAPI definice na/openapi.json. - Dokumentace ve slozce
documentation/. .gitignore, ktery drzinode_modulesadistmimo repozitar.
Zmeneno oproti sablone
- Aplikace prepnuta na ESM (
"type": "module") amodule: NodeNext. - Jeden container obsluhuje API i zbuildovanou React aplikaci z
dist/public. - Dockerfile buildu je server i web, vysledny image dostava jen
dist. - Port zustava 3000, naslouchani na
0.0.0.0beze zmeny.
Reseni reverse proxy
ROOT_PATHse cte z prostredi, nikde neni hardcoded.- Aplikace se mountuje na koren i na prefix, funguje tedy at Caddy prefix odstrani nebo ne.
- Server vklada do
index.htmlznacku<base>awindow.__BASE_PATH__, aby SPA nasla soubory i na vnorenych cestach. - OpenAPI
serversobsahuje prefix, takze Swagger Try it out vola spravnou adresu. - Router ma
strict: true, jinak by se presmerovani/docsna/docs/zacyklilo.
Overeno lokalne
S ROOT_PATH=/apps/csbot-prototype:
/apps/csbot-prototype/healthi/healthvraci 200,/apps/csbot-prototype/docspresmeruje na/docs/, ta vraci Swagger UI,swagger-ui.cssse nacte pres prefix,- OpenAPI
serversobsahuje/apps/csbot-prototype, index.htmlna vnorene ceste obsahuje spravny<base>,- prihlaseni pres prefix vraci token,
- neexistujici cesta pod
/apivraci JSON, ne HTML aplikace.
Znama omezeni
Data jsou v pameti, restart je vrati do vychoziho stavu. Obsah webu je ukazkovy. Ulozeny strom automatizace se nevykonava.