Prace nad celym modelem: cesty, ukazka tela a smycka nad seznamem

Odesilatel posila cely model. Objednavka ze Shoptetu ma zanoreni, ceny
v podobjektech a seznam polozek - a dosud sel napojit jen plochy seznam
skalarnich poli, takze items[] neslo pouzit vubec.

- Odkaz v sablone muze byt cesta: {{data.order.billingAddress.city}},
  {{data.order.items[0].name}}, {{st_faktura.invoiceId}}. Overuje se prvni
  cast odkazu, takze ploche odkazy funguji dal presne jako driv.
- Cele telo je v kontextu i v puvodnim tvaru. Deklarovane parametry maji
  pri shode jmen prednost.
- Spoustec si pamatuje ukazku skutecneho tela. Server z ni odvodi model,
  tedy seznam cest i s typy, a ten se v krocich klika misto opisovani.
  Tlacitko doplni z hodnot v ukazce parametry pro podminky.
- Novy krok Pro kazdou polozku: projde seznam a za kazdou polozku vykona
  vnoreny podstrom. Uvnitr je item a index, po skonceni krok.results se
  seznamem vysledku. Kazdy vysledek nese i puvodni polozku - radek
  objednavky potrebuje jak ID z CRM, tak mnozstvi z puvodnich dat.
  Strop 200 polozek, mimo seznam krok selze s tim, co tam misto nej je.
- Prevod Za kazdou polozku seznamu v klikacim editoru mapovani. Engine ho
  umel, sel ale napsat jen rucnim JSONem.
- Typograficke uvozovky a sipka z kodu pryc.

Overeno nad skutecnym modelem objednavky: 23 cest vcetne
data.order.items[].unitPrice.withoutVat, sablony s cestou i s indexem,
smycka nad dvema polozkami s posbiranymi vysledky.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
JiriUhlir
2026-08-20 06:53:10 +02:00
co-authored by Claude Opus 5
parent fc0c2ff6c7
commit 9b18531d3e
25 changed files with 1299 additions and 124 deletions
+1
View File
@@ -37,6 +37,7 @@ React aplikaci ze slozky `dist/public`.
| Skripty konektoru | hotovo | manifest, kontrola parametru, hot reload, iDoklad |
| Konektory za firmu | hotovo | pristupove udaje v konektoru, overeni napojeni |
| Transformace dat | hotovo | pravidla i sablona JSON, kroky si predavaji struktury |
| Prace nad celym modelem | hotovo | ukazka tela, cesty v sablonach, smycka nad seznamem |
| Sprava clenstvi z portalu | hotovo | firmy a role v Nastaveni, lide a pozvanky v Lidech |
| Role a prava jako data | hotovo | 26 prav v katalogu, vlastni role za firmu |
| Zalozky a limity za firmu | hotovo | navigace chodi ze serveru, ne z kodu klienta |
+59
View File
@@ -178,3 +178,62 @@ Builder i katalog ji vezmou automaticky.
| Beh automatizaci | ulozeny strom se nevykonava |
| Historie behu a logy | prazdne, chybi runtime |
| Drag and drop | presouvani je zatim tlacitky nahoru a dolu |
## Prace nad celym modelem
Odesilatel neposila ploche telo. Objednavka ze Shoptetu ma zanoreni, ceny
v podobjektech a seznam polozek - a to je bezny pripad, ne vyjimka.
### Ukazka tela
U spoustece s vlastnimi daty (webhook, formular) se vlepi **telo z realneho
volani**. Server z nej odvodi model, tedy seznam cest i s typy
(`src/data/model.ts`), a ten se v krocich nabizi ke kliknuti.
Neni to kontrakt: telo se nezahodi, kdyz se od ukazky lisi. Je to napoveda pro
cloveka - prave ta u modelu o padesati cestach chybela.
Tlacitko **Doplnit parametry pro podminky** z hodnot v ukazce udela deklarovane
parametry. Podminka se totiz pta na parametr, ne na cestu.
### Odkaz muze byt cesta
| Odkaz | Co vrati |
| --- | --- |
| `{{callSid}}` | deklarovany parametr, jako driv |
| `{{data.order.code}}` | hodnotu z prijateho tela |
| `{{data.order.items[0].name}}` | prvni polozku seznamu |
| `{{st_faktura.invoiceId}}` | vystup kroku `st_faktura` |
| `{{item.amount}}` | polozku uvnitr smycky |
Overuje se jen **prvni cast** odkazu. Zbytek je cesta a tu predem overit nejde -
co presne prijde v tele, vime az pri behu. Diky tomu ploche odkazy funguji dal
presne jako driv.
### Pro kazdou polozku
Krok `foreach` projde seznam a za kazdou polozku vykona vnoreny podstrom.
```
Pro kazdou polozku: data.order.items
+- CRM: upsert produktu kod {{item.code}}, nazev {{item.name}}
```
Uvnitr je `{{item}}` a `{{index}}`. Po skonceni je
`{{st_loop.results}}` seznam vysledku, kde kazdy zaznam nese `index`,
**celou puvodni polozku** a vystupy kroku:
```json
[{ "index": 0, "item": { "code": "PROD-001", "amount": 2 }, "crmItemId": "42" }]
```
Proc i puvodni polozka: radek objednavky potrebuje jak ID z CRM, tak mnozstvi
z puvodnich dat. Kdyby se neslo obe, muselo by se to znovu parovat podle kodu.
Na tenhle seznam pak jde poslat krok Transformace s prevodem **Za kazdou
polozku seznamu** a poskladat z nej radky objednavky jednim volanim.
**Strop 200 polozek.** Vic uz neni automatizace, ale zatez, kterou nikdo
necekal. Beh se zastavi a rekne to, misto aby seznam tise usekl.
Kdyz na ceste neni seznam, krok selze a v hlasce stoji, co tam misto nej je.
+15 -9
View File
@@ -24,9 +24,14 @@ Dosud si kroky predavaly jen jednotlive hodnoty. Pribyly dva typy parametru:
| `object` | cely objekt | ne | je / neni prazdny |
| `list` | seznam | ne | je / neni prazdny |
**Do sablony se nedosazuji.** `{{order}}` v textu by znamenalo vlozit do vety
kus JSONu, coz nikdo nechce. Struktura se predava **jako celek** dalsimu kroku,
proto je u ni v builderu vyber a ne textove pole.
**Do sablony se nedosazuji jako celek.** `{{order}}` v textu by znamenalo
vlozit do vety kus JSONu, coz nikdo nechce. Struktura se predava **jako celek**
dalsimu kroku, proto je u ni v builderu vyber a ne textove pole.
Na **hodnotu uvnitr** struktury ale sablona sahnout umi:
`{{data.order.billingAddress.city}}` i `{{data.order.items[0].name}}`. Bez toho
by slo pracovat jen s tim, co nekdo predem vypsal jako ploche parametry - a model
objednavky ze Shoptetu ma pres dvacet cest a seznam polozek.
Nad strukturou ma z podminek smysl jen "prisla / neprisla". Porovnavat dva
objekty by znamenalo urcit, co je "stejny", a to zavisi na pripadu.
@@ -195,9 +200,10 @@ z transformace ho prepise jen tam, kde neco rika.
## Co chybi
| Chybi | Poznamka |
| --------------------------- | ------------------------------------------------------- |
| Nahled transformace | pravidla jde zkusit jen pres test skriptu |
| Vnorena pravidla klikanim | prevod `map` se upravuje v rezimu JSON |
| Napoveda cest ze skutecnych dat | nabizeji se jmena parametru, ne cesty uvnitr objektu |
| Vykonavani ze stromu | runner je hotovy, runtime automatizaci ne |
| Chybi | Poznamka |
| -------------------- | ------------------------------------------- |
| Nahled transformace | pravidla jde zkusit jen pres test skriptu |
Hotovo od 2026-08-20: vnorena pravidla se klikaji (prevod **Za kazdou polozku
seznamu**), cesty se nabizeji z ukazky skutecneho tela a strom se vykonava pres
frontu.
+46
View File
@@ -2,6 +2,52 @@
Nejnovejsi nahore.
## 2026-08-20 - prace nad celym modelem, ne nad plochym seznamem poli
Odesilatel posle cely model - objednavka ze Shoptetu ma zanoreni, ceny
v podobjektech a seznam polozek. Dosud se dal napojit jen plochy seznam
skalarnich poli, takze `items[]` neslo pouzit vubec.
### Pridano
- **Cesty v sablonach.** `{{data.order.billingAddress.city}}`,
`{{data.order.items[0].name}}`, `{{st_faktura.invoiceId}}`. Hleda se nejdriv
presny klic, teprve pak cesta - vystupy kroku se ukladaji i pod klic s teckou
a presna shoda musi mit prednost.
- **Cele telo v kontextu.** Krome pojmenovanych hodnot je k dispozici i telo
v puvodnim tvaru, takze cesta funguje, aniz by to nekdo predem vypsal jako
parametr. Deklarovane parametry maji prednost pri shode jmen.
- **Ukazka tela u spoustece** (`trigger.sample`). Vlepi se telo z realneho
volani a odvodi se z nej model, tedy seznam cest i s typy (`src/data/model.ts`).
V krocich se cesty **klikaji**, misto aby se opisovaly, a kontrola vi, ze
`data.order.code` neni preklep.
- Tlacitko **Doplnit parametry pro podminky** z hodnot v ukazce udela
deklarovane parametry. Podminka se pta na parametr, ne na cestu.
- **Krok Pro kazdou polozku** (`foreach`). Projde seznam v datech a za kazdou
polozku vykona vnoreny podstrom. Uvnitr je `{{item}}` a `{{index}}`, po
skonceni `{{krok.results}}` se seznamem vysledku.
- Kazdy vysledek nese `index`, **celou puvodni polozku** a vystupy kroku.
Radek objednavky potrebuje jak ID z CRM, tak mnozstvi z puvodnich dat -
kdyby se nesly obe, muselo by se to znovu parovat.
- Strop je 200 polozek. Vic uz neni automatizace, ale zatez, kterou nikdo
necekal, takze se beh zastavi a rekne to.
- Kdyz na ceste neni seznam, krok selze s tim, co tam misto nej je.
- **Prevod Za kazdou polozku seznamu** v klikacim editoru mapovani. Engine ho
umel (`op: 'map'`), ale sel napsat jen rucnim JSONem.
### Overeno
Nad skutecnym modelem objednavky ze Shoptetu: 23 cest vcetne
`data.order.items[].unitPrice.withoutVat`, sablony s cestou i s indexem,
struktura predana jako JSON, neexistujici cesta jako prazdno s hlaskou v logu,
smycka nad dvema polozkami s posbiranymi vysledky.
### Co to nemeni
Ploche odkazy `{{callSid}}` funguji dal presne jako driv - overuje se **prvni
cast** odkazu, takze u nich se nic nezmenilo. Existujici automatizace se nemusi
nijak upravovat.
## 2026-08-17 - log rekne, co zpusobilo jakou zmenu
Nalezeno na bezicim serveru: ticket TK-4946 mel 177 prichozich udalosti