Navrh pristupneho portalu a srovnani vzorove automatizace s instanci

Dve veci, obe bez zmeny chovani aplikace.

Navrh (documentation/25-navrh-pristupny-portal.md):

Vzniklo z otazky, jak portal priblizit cloveku, ktery ho nikdy nevidel.
Odpoved se rozpadla na pet veci, ktere spolu souvisi vic, nez to vypada:

- prehled ukazuje jen cisla, zadna slovesa. Vsech sest widgetu ve vychozi sade
  jsou statistiky a seznamy. Navrh pridava "Moje tickety", "Fronta bez
  resitele", "Co potrebujete udelat" a "Zaciname". Prvni dva jsou skoro zadarmo,
  builtinSources uz ten mechanismus maji
- formulare nemaji spolecnou vrstvu. inputClass je nadefinovany na 13 mistech
  a rozesel se do peti ruznych vzhledu, Field je napsany trikrat. V ui/ neni
  zadny formularovy prvek. Blokuje to widget akci, protoze NewTicketDialog je
  ten modal a formular z nej vytahnout nejde
- hledani neumi to jedine, k cemu je. Klientsky filtr nehleda v obsahu, ve
  vlastnich polich ani v externim ID, takze hovor podle callSid se dohledat
  neda. Navrh je modal s kriterii, protoze ticket nema pevnou sadu poli
- viditelnost ticketu se neda omezit. Pohled tenant dostane kazdy, kdo do firmy
  patri, mine je dobrovolny filtr a ne strop. Navrh vede viditelnost pres
  clenstvi (priznak na firme, priznak u kazde skupiny), ne pres role - role jsou
  na celou firmu a neumi rict "v jedne sekci vidim vse, v druhe svoje"
- uloziste neprezije nasazeni, coz podpira bod o hledani

Dve veci, ktere stoji za zapamatovani, i kdyby se navrh nikdy nedodelal:
strop viditelnosti nepatri do hledani, ale do cteni ticketu (cesty k ticketum
jsou tri a dve z nich filtruji tickets primo), a pohled a strop nejsou totez.

Ctyri otevrene otazky jsou v zaveru navrhu.

Vzorova automatizace (src/data/automationStore.ts):

seedRealAutomations drzelo starsi podobu stromu nez ta, ktera na instanci
opravdu bezi. Protoze data neprezivaji redeploy, je tenhle seed jedine misto,
kde nastaveni prezije nasazeni - kdyz se rozejde, znamena to po kazdem nasazeni
stavet strom rucne znovu.

Opsano z bezici instance: spoustec ma sest parametru misto tri (pribylo result,
rating a data), krok upsert pise do obsahu {{voicebotId}}, {{data}} a stav bere
z {{result}}, a za nim je podminka nad vysledkem - cokoliv krome "Chybějící
informace" ticket zavre, jinak jde na servicedesk s vysokou prioritou.

Overeno lokalnim startem s vlastnim DATA_DIR: automatizace se nasype, ma ctyri
kroky stejne jako instance, je zapnuta a nema zadny nedodelek.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
JiriUhlir
2026-09-02 09:37:46 +02:00
co-authored by Claude Opus 5
parent 1134852bff
commit 72da07debe
5 changed files with 644 additions and 2 deletions
+43 -2
View File
@@ -978,6 +978,10 @@ function seedDemoAutomations(): void {
*
* Token webhooku se bere z `WEBHOOK_TOKEN_TEST`, aby se adresa po nasazeni
* nemenila a odesilatel ji nemusel prepisovat.
*
* **Opsano z bezici instance, ne vymysleno.** Kdyz se strom na instanci zmeni,
* patri ta zmena sem, jinak ji dalsi nasazeni zahodi. Naposledy srovnano
* 2026-09-02.
*/
function seedRealAutomations(): void {
seed({
@@ -995,6 +999,9 @@ function seedRealAutomations(): void {
{ id: 'f_callsid', name: 'callSid', type: 'string', required: true },
{ id: 'f_status', name: 'status', type: 'string', required: true },
{ id: 'f_voicebot', name: 'voicebotId', type: 'string', required: true },
{ id: 'f_mtjqv4qj_1', name: 'result', type: 'string', required: false, path: 'data.result' },
{ id: 'f_mtjqv4zn_2', name: 'rating', type: 'string', required: false, path: 'data.rating' },
{ id: 'f_mtjqvws7_3', name: 'data', type: 'string', required: true, path: 'data' },
],
webhookToken: config.seedWebhookToken || generateWebhookToken(),
},
@@ -1006,12 +1013,46 @@ function seedRealAutomations(): void {
operationId: 'upsert',
inputs: {
externalId: '{{callSid}}',
body: '{{voicebotId}}',
status: '{{status}}',
body: '{{voicebotId}}, {{data}}',
status: '{{result}}',
tags: '{{voicebotId}}',
priority: 'low',
},
},
{
id: 'st_mtjqwey5_4',
kind: 'condition',
fieldId: 'f_mtjqv4qj_1',
operator: 'neq',
value: 'Chybějící informace',
// Vyresene hovory se rovnou zaviraji.
yes: [
{
id: 'st_mtjqx6t1_5',
kind: 'action',
serviceId: 'ticket',
operationId: 'upsert',
inputs: {
externalId: '{{callSid}}',
closed: 'true',
},
},
],
// Chybejici informace jde na servicedesk a s vyssi prioritou.
no: [
{
id: 'st_mtjqxs41_6',
kind: 'action',
serviceId: 'ticket',
operationId: 'upsert',
inputs: {
externalId: '{{callSid}}',
priority: 'high',
groupId: 'grp_servicedesk',
},
},
],
},
],
},
});