snapshot of https://github.com/twentyhq/twenty.git (main, 2026-09-17; blobs > 131072B omitted)
Some checks failed
App Prod-Parity E2E Dispatch / dispatch (push) Failing after 10s
CD Storybook UI / build (push) Failing after 3m25s
CD Storybook UI / dispatch (push) Has been skipped
CD deploy main / website-changed-files (push) Successful in 18m8s
CI Agent Skills / changed-files-check (push) Successful in 18m9s
CI Create App E2E minimal / changed-files-check (push) Successful in 24s
CI Create App / changed-files-check (push) Successful in 26s
CI Docs / changed-files-check (push) Successful in 26s
CI Emails / changed-files-check (push) Successful in 28s
CI Example App Hello World / changed-files-check (push) Successful in 23s
CI Front / changed-files-check (push) Has been skipped
CI Example App Postcard / changed-files-check (push) Successful in 27s
CI UI / changed-files-check (push) Has been skipped
CI Utils Test / changed-files-check (push) Successful in 45s
CI Twenty Apps / discover (push) Successful in 1m3s
CD deploy main / deploy-main (push) Failing after 3s
CI Agent Skills / agent-skills-validate (push) Has been skipped
CI Create App / create-app-test (lint) (push) Has been skipped
CI Emails / emails-test (push) Has been skipped
CI Front / front-task (lingui:compile) (push) Has been skipped
CI Front / front-task (lint) (push) Has been skipped
CI Example App Postcard / example-app-postcard (push) Has been skipped
CI UI / ui-task (lint) (push) Has been skipped
CI UI / ui-task (pack-size) (push) Has been skipped
CI UI / ui-task (size) (push) Has been skipped
CI UI / ui-task (test) (push) Has been skipped
CI UI / ui-task (typecheck) (push) Has been skipped
CI Utils Test / utils-test (push) Has been skipped
CI Twenty Apps / ${{ matrix.app.name }} (push) Has been skipped
CI Emails / ci-emails-status-check (push) Successful in 2s
CI Example App Hello World / ci-example-app-hello-world-status-check (push) Successful in 2s
CI Example App Postcard / ci-example-app-postcard-status-check (push) Successful in 3s
CI UI / ui-sb-test (push) Has been skipped
CI Utils Test / ci-utils-test-status-check (push) Successful in 2s
CI Twenty Apps / ci-twenty-apps-status-check (push) Successful in 2s
CI UI / ci-ui-status-check (push) Successful in 2s
CI Desktop / desktop (push) Failing after 1m8s
Push docs to Crowdin / Push documentation to Crowdin (push) Failing after 55s
Push translations to Crowdin / Extract and upload translations (push) Failing after 5s
Push website translations to Crowdin / Extract and upload website translations (push) Failing after 5s
CI Create App / create-app-test (test) (push) Has been skipped
CI Create App / create-app-test (typecheck) (push) Has been skipped
CI Docs / docs-lint (push) Has been skipped
CI Example App Hello World / example-app-hello-world (push) Has been skipped
CI Front / front-task (lingui:extract) (push) Has been skipped
CI Front / front-task (test) (push) Has been skipped
CI Front / front-task (typecheck) (push) Has been skipped
CI UI / ui-sb-build (push) Failing after 1m32s
CI Twenty Apps / ${{ matrix.app.name }} (${{ matrix.server-source }}) (push) Has been skipped
CI Agent Skills / agent-skills-publish (push) Has been skipped
CI Create App / ci-create-app-status-check (push) Successful in 2s
CI Agent Skills / agent-skills-remote-source (push) Has been skipped
CI Create App E2E minimal / create-app-e2e-minimal (push) Has been cancelled
CI E2E Main / e2e-test (push) Has been cancelled
CI Front / front-sb-build (push) Has been cancelled
CI Front / front-build (push) Has been cancelled
CI Create App E2E minimal / ci-create-app-e2e-minimal-status-check (push) Has been cancelled
CI E2E Main / ci-e2e-main-status-check (push) Has been cancelled
CI E2E Main / notify-main-ci-failure (push) Has been cancelled
CI E2E Main / qa-scout-comment (push) Has been cancelled
CI Front / front-sb-test (push) Has been cancelled
CI Front / front-sb-screenshots (push) Has been cancelled
CI Front / ci-front-status-check (push) Has been cancelled
DPA Sub-Processor Sync / sync-subprocessors (push) Failing after 3s
AI Catalog Sync / sync-catalog (push) Failing after 2s

This commit is contained in:
upstream-mirror
2026-09-17 23:28:13 +05:00
commit e7da97194a
32688 changed files with 4208681 additions and 0 deletions

View File

@@ -0,0 +1,167 @@
---
title: Odesílání e-mailů z pracovních postupů
description: Posílejte personalizované e-maily automaticky pomocí akcí pracovních postupů.
---
Automaticky odesílejte e-maily, když ve vašem CRM nastanou konkrétní události—přivítejte nové kontakty, navazujte na příležitosti nebo upozorněte členy týmu.
## Předpoklady
Než budete moci odesílat e-maily z pracovních postupů:
1. Připojte e-mailový účet v **Nastavení → Účty**
2. Ujistěte se, že má účet povolená oprávnění k odesílání
## Základní e-mailový pracovní postup
### Příklad: Vítací e-mail pro nové kontakty
**Cíl**: Odeslat vítací e-mail, když je do CRM přidána nová osoba.
**Nastavení**:
1. **Vytvořit pracovní postup**: Přejděte do **Nastavení → Pracovní postupy** a klikněte na **+ Nový pracovní postup**
2. **Přidat spouštěč**: Vyberte **Záznam je vytvořen** → **Lidé**
3. **Přidat akci Odeslat e-mail**:
* Klikněte na **+** pro přidání akce
* Vyberte **Odeslat e-mail**
* Nastavte e-mail:
| Pole | Hodnota |
| --------------- | -------------------------------------- |
| **Komu** | `{{trigger.object.email}}` |
| **Předmět** | `Vítejte ve {{Your Company Name}}` |
| **Text zprávy** | `Hi {{trigger.object.firstName}}, ...` |
4. **Otestujte a aktivujte**: Otestujte s ukázkovým záznamem, poté aktivujte
## Používání proměnných v e-mailech
Odkazujte na data z předchozích kroků pomocí syntaxe `{{variable}}`:
```text
Hi {{trigger.object.firstName}},
Thank you for connecting with us!
Your company, {{trigger.object.company.name}}, is now in our system.
Best regards,
The Team
```
### Dostupné proměnné ze spouštěčů
| Typ spouštěče | Běžné proměnné |
| -------------------------------- | -------------------------------------- |
| **Záznam vytvořen/aktualizován** | `{{trigger.object.fieldName}}` |
| **Ruční** | `{{trigger.selectedRecord.fieldName}}` |
| **Webhook** | `{{trigger.body.fieldName}}` |
## Pokročilé: Podmíněné e-maily
### Příklad: Různé e-maily podle zdroje zájemce
**Cíl**: Posílat různé vítací e-maily podle toho, odkud zájemce přišel.
**Nastavení**:
1. **Spouštěč**: Záznam je vytvořen (Lidé)
2. **Přidat akci Filtr**:
* Podmínka: `{{trigger.object.source}}` se rovná `"Website"`
* Pokud ano → pokračujte k vítacímu e-mailu pro web
3. **Větev pro jiné zdroje**:
* Vytvořte paralelní větve pro různé zdroje
* Každá větev má svou vlastní akci Odeslat e-mail
## Odesílání e-mailů více příjemcům
### Příklad: Upozornit tým při uzavření obchodu
**Cíl**: Poslat e-mail obchodníkovi a jeho manažerovi, když je příležitost vyhrána.
**Nastavení**:
1. **Spouštěč**: Záznam je aktualizován (Příležitosti, Stádium = "Uzavřeno/Vyhráno")
2. **Vyhledat záznamy**: Najděte manažera vlastníka příležitosti
3. **Odeslat e-mail č. 1**: Vlastníkovi příležitosti
* Komu: `{{trigger.object.owner.email}}`
* Předmět: `Gratulujeme k uzavření {{trigger.object.name}}!`
4. **Odeslat e-mail č. 2**: Manažerovi
* Komu: `{{searchRecords.manager.email}}`
* Předmět: `Vyhraný obchod: {{trigger.object.name}}`
## Naplánované navazující e-maily
### Příklad: Následný kontakt 3 dny po schůzce
**Cíl**: Odeslat následný e-mail 3 dny poté, co je zaznamenána schůzka.
**Nastavení**:
1. **Spouštěč**: Záznam je vytvořen (Aktivity, Typ = "Schůzka")
2. **Zpoždění**: Počkejte 3 dny
3. **Odeslat e-mail**:
* Komu: Účastník schůzky
* Předmět: Navazuji na náš rozhovor
* Text zprávy: Odkaz na podrobnosti schůzky ze spouštěče
## E-mailové přílohy
K e-mailům odesílaným z pracovních postupů můžete přikládat soubory. Příloha je statický soubor, který nahrajete při konfiguraci pracovního postupu.
### Jak přidat přílohu
1. V akci **Odeslat e-mail** klikněte na tlačítko **Přílohy**
2. Klikněte a nahrajte soubor ze svého počítače
3. Soubor bude přiložen ke všem e-mailům odesílaným touto akcí
### Běžné scénáře použití
| Případ použití | Ukázkový soubor |
| -------------------------- | ----------------------------------- |
| **Uvítací e-maily** | Firemní brožura (PDF) |
| **Úvodní sekvence** | Průvodce Začínáme |
| **Návazné akce u prodeje** | Katalog produktů nebo ceník |
| **Potvrzení událostí** | Podrobnosti o události nebo program |
<Note>
Přílohy jsou statické—všem příjemcům se posílá stejný soubor. U dynamických dokumentů (například personalizovaných nabídek) soubory vygenerujte a přiložte pomocí [Logic funkce](/l/cs/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty).
</Note>
## Osvědčené postupy
### Obsah e-mailu
* Udržujte předměty stručné a věcné
* Personalizujte pomocí jména příjemce
* Zahrňte jasnou výzvu k akci
* Před aktivací e-maily otestujte
### Doručitelnost
* Neodesílejte příliš mnoho e-mailů příliš rychle
* Používejte profesionální e-mailové podpisy
* Vyhýbejte se slovům, která spouštějí spam
* Zajistěte možnost odhlášení u marketingových e-mailů
### Řešení potíží
* Ověřte, že je e-mailový účet připojen a aktivní
* Zkontrolujte, zda je e-mailová adresa příjemce platná
* Projděte běhy pracovních postupů kvůli chybovým zprávám
* Nejprve otestujte s vlastní e-mailovou adresou
## Související
* [Spouštěče pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-triggers)
* [Akce pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-actions)

View File

@@ -0,0 +1,88 @@
---
title: Používání větví v pracovních postupech
description: Pochopte, jak větve fungují a jak řídit, která cesta se provede.
---
## Jak větve fungují
V editoru pracovních postupů můžete vytvářet více cest (větví) vycházejících z jediného uzlu. To vám umožní vytvářet složité automatizace s různými výsledky.
**Důležité**: Když se pracovní postup spustí, **všechny větve se ve výchozím nastavení spouštějí paralelně**. Neexistuje žádná vestavěná "if/else" logika pro výběr jedné větve před jinou—každá cesta poběží současně.
## Řízení, která větev se spustí
Chcete-li provést pouze jednu větev na základě konkrétních podmínek, **přidejte na začátek každé větve uzel Filter**.
### Ukázkové nastavení
1. Vytvořte pracovní postup s více větvemi z jednoho uzlu
2. Přidejte uzel **Filter** jako první krok v každé větvi
3. Na každém uzlu Filter nastavte podmínky, které určují, kdy má daná větev pokračovat
4. Pokračovat bude pouze větev (případně větve), u níž jsou splněny podmínky uzlu Filter
### Jak fungují filtry
* Pokud je podmínka Filter **splněna**: Větev pokračuje v provádění
* Pokud podmínka Filter **není splněna**: Větev se zastaví na uzlu Filter
Tím efektivně vytvoříte podmíněnou logiku, v níž se na základě vašich dat spustí pouze příslušná větev.
## Příklad: Směrování podle výše obchodu
**Scénář**: Když je obchod uzavřen, odešlete různé oznámení podle výše obchodu.
1. **Spouštěč**: Příležitost aktualizována (Fáze = Uzavřeno/Vyhráno)
2. **Větev 1**: Filter pro částku > 10 000 $ → Odeslat zprávu na Slack do #big-deals
3. **Větev 2**: Filter pro částku ≤ 10 000 $ → Odeslat e-mail obchodnímu manažerovi
Obě větve se spustí, ale za svým uzlem Filter bude pokračovat pouze ta, která odpovídá částce obchodu.
## Vytváření větví
<Note>
Chcete-li vytvořit novou větev z existujícího kroku, klikněte na tlačítko **+** u kroku a přidejte svou akci. Více větví můžete přidat opakovaným kliknutím na **+**.
</Note>
1. V editoru pracovních postupů vyberte krok, ze kterého chcete větvit
2. Klikněte na **+** pro přidání akce
3. Tím vytvoříte jednu větev
4. Pro vytvoření dalších větví klikněte znovu na **+** u stejného kroku
5. Každá větev může mít vlastní posloupnost akcí
## Sloučení větví zpět do jedné
Po dokončení práce paralelních větví je můžete sloučit zpět do jedné cesty:
1. Dokončete akce ve větvích
2. Přidejte nový krok, který se má spustit po všech větvích
3. Přetáhněte spojení z posledního kroku každé větve do tohoto nového kroku
4. Sloučený krok před spuštěním počká na dokončení všech připojených větví
### Příklad: Zpracovat a poté upozornit
```
Trigger
│
├── Branch A: Update Customer Record
│
└── Branch B: Create Support Ticket
↘ ↙
Merged Step: Send Confirmation Email
```
Potvrzovací e-mail je odeslán až po dokončení aktualizace zákazníka a vytvoření tiketu.
## Osvědčené postupy
* Na začátku větví vždy používejte **uzly Filter**, když chcete podmíněné spouštění
* Podmínky větví udržujte **vzájemně se vylučující**, abyste předešli duplicitním akcím
* Testujte své pracovní postupy s různými daty, abyste měli jistotu, že se spouštějí správné větve
* **Přejmenujte kroky ve větvích** popisně, aby bylo jasné, co která cesta dělá
* **Sloučte větve**, když po paralelním zpracování potřebujete závěrečnou akci
## Související
* [Často kladené dotazy k pracovním postupům](/l/cs/user-guide/workflows/how-tos/need-more-help/workflows-faq) — odpovědi týkající se paralelního provádění
* [Akce pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-actions) — dostupné akce pro větve

View File

@@ -0,0 +1,183 @@
---
title: Použijte iterátor
description: Procházejte pole záznamů a provádějte akce s každou položkou.
---
Iterátor vám umožní procházet pole záznamů a provádět akce na každém z nich. Je zásadní pro pracovní postupy, které potřebují zpracovat více záznamů vrácených akcí Search Records nebo přijatých přes webhooky.
## Kdy použít iterátor
| Scénář | Příklad |
| ------------------------------ | -------------------------------------------------- |
| **Zpracujte výsledky hledání** | Odešlete e-mail každé nalezené osobě |
| **Zpracujte pole webhooků** | Vytvořte záznamy pro každou položku v daném pořadí |
| **Hromadné aktualizace** | Aktualizujte více záznamů vypočtenými hodnotami |
| **Upozornění** | Upozorněte více osob na událost |
## Porozumění iterátoru
Iterátor jako vstup očekává **pole**. Poté:
1. Vezme první položku z pole
2. Spustí všechny akce uvnitř Iterátoru s touto položkou
3. Přejde na další položku
4. Opakuje, dokud nejsou zpracovány všechny položky
### Výběr pole, přes které se bude iterovat
Většinu zdrojů polí (Search Records, vícehodnotové pole ve webhooku, hromadný ruční spouštěč) lze vybrat přímo v nástroji pro výběr proměnných.
Když krok **Code** nebo **Logic Function** vrátí *pole nejvyšší úrovně*, jeho výstup se v nástroji pro výběr proměnných zobrazí jako indexované položky (`0`, `1`, `2`, …). Chcete-li iterovat přes celé pole, vyberte u daného kroku možnost **Whole list** — Iterator pak automaticky odvodí strukturu každé položky ze seznamu.
## Základní nastavení
### Příklad: Odeslání e-mailu všem ve výsledcích hledání
**Cíl**: Najděte všechny kontakty v konkrétní společnosti a každému pošlete personalizovaný e-mail.
### Krok 1: Vyhledejte záznamy
1. Přidejte akci **Vyhledat záznamy**
2. Objekt: **People**
3. Filtr: Company se rovná "Acme Inc"
4. To vrátí pole osob
### Krok 2: Zkontrolujte, že existují výsledky
1. Přidejte akci **Filtr**
2. Podmínka: `{{searchRecords.length}}` je větší než 0
3. Tím se zabrání chybám iterátoru při prázdných výsledcích
### Krok 3: Přidejte iterátor
1. Přidejte akci **Iterator**
2. Vstup pole: Vyberte `{{searchRecords}}`
3. Tím vytvoříte smyčku
### Krok 4: Přidejte akce uvnitř iterátoru
Akce umístěné za iterátorem se spustí pro každou položku:
1. Přidat **Odeslat Email** akci (uvnitř Iteratoru)
2. Komu: `{{iterator.currentItem.email}}`
3. Předmět: Dobrý den, `{{iterator.currentItem.firstName}}`!
4. Tělo: Personalizovaná zpráva využívající pole aktuální položky
### Výsledek
Pokud Search Records vrátí 5 osob, iterátor:
* Odešle e-mail osobě 1
* Odešle e-mail osobě 2
* ... pokračuje pro všech 5
## Přístup k datům aktuální položky
Uvnitř iterátoru použijte `{{iterator.currentItem}}` pro přístup k aktuálnímu záznamu:
| Proměnná | Popis |
| --------------------------------------- | ------------------------------ |
| `{{iterator.currentItem}}` | Celý objekt aktuálního záznamu |
| `{{iterator.currentItem.id}}` | ID záznamu |
| `{{iterator.currentItem.email}}` | Pole e-mailu |
| `{{iterator.currentItem.company.name}}` | Název související společnosti |
| `{{iterator.index}}` | Aktuální pozice v poli (od 0) |
V nástroji pro výběr proměnných můžete buď přejít do konkrétního pole aktuální položky, nebo zvolit **Use the whole item** pro odkaz na celou aktuální položku (`{{iterator.currentItem}}`). Výběr celé položky je užitečný, když chcete předat celý záznam přímo do následujícího kroku, místo abyste ho znovu sestavovali pole po poli.
## Běžné vzory
### Aktualizace více záznamů
**Cíl**: Označit všechny zpožděné úkoly jako "Late"
```
1. Search Records (Tasks, Due Date < Today, Status ≠ Completed)
2. Filter (length > 0)
3. Iterator (searchRecords)
└── Update Record
- Object: Tasks
- Record: {{iterator.currentItem.id}}
- Status: Late
```
### Vytváření záznamů z pole
**Cíl**: Webhook přijme objednávku s více položkami, vytvořte záznam pro každou z nich
```
1. Webhook Trigger (receives items array)
2. Filter (items.length > 0)
3. Iterator (trigger.body.items)
└── Create Record
- Object: Order Items
- Name: {{iterator.currentItem.name}}
- Quantity: {{iterator.currentItem.qty}}
- Related Order: {{trigger.body.orderId}}
```
### Podmíněné zpracování uvnitř smyčky
**Cíl**: Posílat e-mail pouze kontaktům s platnými e-mailovými adresami
```
1. Search Records (People)
2. Iterator (searchRecords)
└── Filter (currentItem.email is not empty)
└── Send Email
- To: {{iterator.currentItem.email}}
```
## Řešení potíží
### "Iterátor očekává pole"
**Příčina**: Předali jste jeden záznam místo pole.
**Řešení**: Ujistěte se, že předáváte výsledek akce Search Records nebo pole, nikoli jeden záznam.
```
✅ Correct: {{searchRecords}}
❌ Wrong: {{searchRecords[0]}}
```
### Iterátor se nespouští
**Příčina**: Pole je prázdné.
**Řešení**: Před iterátor přidejte filtr pro kontrolu délky pole:
```
Filter: {{searchRecords.length}} > 0
```
### Akce se spouštějí příliš mnohokrát
**Příčina**: Search Records vrátil více záznamů, než se očekávalo.
**Řešení**:
* Přidejte konkrétnější filtry do akce Search Records
* Nastavte limit v akci Search Records (max. 200)
* Přidejte filtr uvnitř iterátoru pro doplňující podmínky
## Aspekty výkonu
* **Spotřeba kreditů**: Každá iterace spotřebuje kredity za své akce
* **Čas**: Zpracování velkých polí trvá déle
* **Limity**: Zvažte dávkové zpracování velmi velkých operací
* **Omezení rychlosti**: Volání externích API mohou při mnoha iteracích narazit na limity rychlosti
## Osvědčené postupy
1. **Před iterátorem vždy zkontrolujte délku pole**, abyste předešli chybám
2. **Přidávejte filtry uvnitř smyček**, pokud není potřeba zpracovat všechny položky
3. **Přejmenujte krok iterátoru**, aby popisoval, co prochází
4. **Testujte s malými poli** před zpracováním velkých datových sad
5. **Sledujte spuštění pracovních postupů**, abyste zajistili, že iterace proběhnou podle očekávání
## Související
* [Akce pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-actions)
* [Jak používat větve](/l/cs/user-guide/workflows/capabilities/use-branches-in-workflows)
* [Často kladené dotazy k pracovním postupům](/l/cs/user-guide/workflows/how-tos/need-more-help/workflows-faq)

View File

@@ -0,0 +1,332 @@
---
title: Akce pracovních postupů
description: Zjistěte, jaké akce jsou k dispozici v pracovních postupech Twenty.
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
## O akcích
Akce definují, co se stane po spuštění. Můžete řetězit více akcí dohromady a vytvářet tak složité automatizace.
<Tip>
* Použijte nástroj pro výběr proměnných (klikněte na ikonu `(x+)`) k procházení dostupných dat z předchozích kroků
* Najetím myší na libovolné vstupní pole zjistíte, ze kterého kroku proměnná pochází — užitečné, když stejné pole (např. ID) existuje ve více předchozích krocích
* Každé akci dejte výstižný název pro snazší údržbu
</Tip>
## Akce se záznamy
<img src="/images/user-guide/workflows/workflow_actions.png" style={{width:'100%'}} />
### Vytvořit záznam
Přidává nový záznam do vybraného objektu.
**Konfigurace**:
* Vyberte cílový objekt
* Vyplňte povinná a volitelná pole
* Použijte data z předchozích kroků nebo hodnoty zadané ručně k vyplnění polí
**Výstup**: Data nově vytvořeného záznamu jsou k dispozici pro použití v následujících krocích.
### Aktualizovat záznam
Mění existující záznam ve vybraném objektu.
<img src="/images/user-guide/workflows/update_record.png" style={{width:'100%'}} />
**Konfigurace**:
* Vyberte cílový objekt
* Vyberte specifický záznam pro aktualizaci.
* Můžete buď vybrat pevně daný záznam pomocí rozevírací nabídky zobrazující všechny dostupné záznamy.
* Nebo můžete nechat záznam vybrat dynamicky tím, že určíte záznam nalezený v předchozím kroku pomocí `(x+)`. V této fázi nemůžete vyhledávat záznam podle různých kritérií. Pokud jste zatím neurčili záznam, přidejte krok `Search Record` před tento krok `Update Record`.
* Vyberte pole k úpravě a zadejte nové hodnoty
**Výstup**: Data aktualizovaného záznamu jsou k dispozici pro použití v následujících krocích.
### Smazat záznam
Odstraní záznam z vybraného objektu.
**Konfigurace**:
* Vyberte cílový objekt
* Vyberte specifický záznam pro smazání
**Výstup**: Data smazaného záznamu zůstávají k dispozici pro použití v následujících krocích.
### Hledání záznamů
Najde záznamy ve vybraném objektu pomocí filtračních podmínek.
**Konfigurace**:
* Vyberte objekt pro hledání
* Nastavte kritéria filtru k zúžení výsledků
* Nakonfigurujte řazení a limity
**Výstup**: Vrací odpovídající záznamy, které lze použít v následujících krocích.
<Note>
**Omezení**: Search Records vrací maximálně **200 záznamů**. Pokud potřebujete zpracovat více, přidejte konkrétní filtry k omezení výsledků nebo použijte naplánované pracovní postupy ke zpracování v dávkách.
</Note>
**Doporučená praxe**: Použijte [větve](/l/cs/user-guide/workflows/capabilities/workflow-branches) po kroku Search Records pro zpracování scénářů "nalezeno" vs "nenalezeno".
### Vložit nebo aktualizovat záznam
Vytvoří nový záznam nebo aktualizuje existující na základě kritérií shody. Hodí se, když si nejste jisti, zda záznam již existuje.
<img src="/images/user-guide/workflows/upsert_double_identifier.png" style={{width:'100%'}} />
**Konfigurace**:
* Vyberte cílový objekt
* Všimněte si, která pole lze použít pro shodu: e-mail u osob, doména u společností, ID u libovolného objektu nebo jakékoli pole označené jako jedinečné. Níže budete muset vyplnit alespoň jedno z nich.
* Vyplňte hodnoty polí. Nezapomeňte vyplnit alespoň jeden z jedinečných identifikátorů.
<Note>
**Shoda obvykle funguje ještě lépe, když přidáte pouze jeden jedinečný identifikátor.** Například snímek obrazovky níže bude párovat společnosti podle jejich domény. ID není nutně potřeba.
</Note>
<img src="/images/user-guide/workflows/upsert_simple_identifier.png" style={{width:'100%'}} />
* Použijte data z předchozích kroků k vyplnění polí
**Jak to funguje**:
1. Vyhledá záznam odpovídající vašim kritériím
2. Pokud nalezeno → aktualizuje existující záznam
3. Pokud nenalezeno → vytvoří nový záznam
**Výstup**: Data vytvořeného nebo aktualizovaného záznamu jsou k dispozici pro použití v následujících krocích.
## Akce toku
### Iterátor
**Prochází polem záznamů** vrácených z předchozího kroku, což umožňuje provádět akce na každém záznamu jednotlivě.
**Konfigurace**:
* Vyberte pole záznamů z předchozího kroku (např. výsledky vyhledávacích záznamů, z manuálního spouštěče s hromadnou dostupností z kódu uzlu). Když krok Code nebo Logic Function vrátí pole na nejvyšší úrovni, vyberte možnost **Whole list**, abyste procházeli celý výstup.
* Definujte akce, které budou provedeny na každém záznamu v cyklu.
<Note>
- V Iterátoru můžete přidat několik akcí.
- Pokud používáte větve uvnitř Iteratoru, ujistěte se, že poslední krok každé větve se připojí zpět k Iteratoru pro zavření smyčky.
</Note>
* Přístup k polím `Current Item`: chcete-li použít pole ze záznamu, který se právě zpracovává, klikněte na krok **Iterator** a vyberte **Current item**. Zobrazí se seznam dostupných polí z daného záznamu a můžete je vybrat k použití v následujících akcích. Můžete také vybrat **Use the whole item**, abyste předali celou aktuální položku do následujícího kroku.
<VimeoEmbed videoId="1146577247" title="Ukázka videa" />
### Filtr
Filtruje záznamy na základě zadaných podmínek a propustí pouze záznamy, které splňují kritéria.
**Konfigurace**:
* Vyberte záznam k filtrování
* Definujte filtrační podmínky a kritéria
* Nakonfigurujte, které záznamy by měly projít do následujících kroků
<Note>
1. **Výstup**: Uzly filtru nevracejí data — fungují jako brány. Pokud jsou podmínky splněny, pracovní postup pokračuje. Pokud ne, pracovní postup se v dané větvi zastaví.
2. Operátor `IS` lze použít s číselnými poli. Chová se jako `EQUAL`.
</Note>
### Zpoždění
Pozastaví provádění pracovního postupu na zadanou dobu nebo do konkrétního data/času.
**Typy zpoždění**:
| Typ | Popis |
| --------------------- | ------------------------------------------------------ |
| **Doba trvání** | Čekat po konkrétní dobu (dny, hodiny, minuty, sekundy) |
| **Naplánované datum** | Čekat do konkrétního data a času |
**Konfigurace pro dobu trvání**:
* Nastavte dny, hodiny, minuty a/nebo sekundy
* Kombinujte více jednotek (např. 2 dny a 4 hodiny)
**Konfigurace pro naplánované datum**:
* Vyberte datum a čas
* Může odkazovat na datumové pole z předchozího kroku (např. navázání kontaktu 3 dny po schůzce)
**Případy použití**:
* Počkejte 24 hodin před odesláním navazujícího e-mailu
* Pozastavte až do data uzavření příležitosti
* Naplánujte akce na pracovní hodiny
<Note>
Naplánované datum nesmí být v minulosti. Pokud je použito datumové pole z předchozího kroku a datum již uplynulo, pracovní postup selže.
</Note>
**Limity a kredity**:
* **Žádný maximální limit délky** — můžete nastavit zpoždění v minutách, dnech, týdnech nebo i delší období
* **Spotřebován 1 kredit** při spuštění uzlu Zpoždění, bez ohledu na délku
* **Žádné kredity se nespotřebovávají** během čekání — 5minutové zpoždění stojí stejně jako 5denní zpoždění
## Komunikační akce
### Odeslat e-mail
Odesílá e-mail z vašeho pracovního postupu. Skvělé pro šablonované hromadné e-maily. E-maily budou vypadat jako ty, které posíláte ze své schránky.
Není vhodné pro newslettery (které vyžadují bohatší formátování) nebo automatické e-mailové sekvence.
**Předpoklady**: Přidejte e-mailový účet v Nastavení → Účty
**Konfigurace**:
* Vyberte e-mailový účet odesílatele
<Note>
E-maily můžete odesílat pouze z poštovních schránek synchronizovaných s vaším vlastním účtem Twenty. Odesílání z poštovních schránek ostatních členů týmu (např. e-mail vlastníka účtu) je v plánu.
</Note>
Ve všech následujících krocích můžete pro personalizaci odkazovat na proměnné z předchozích kroků.
* Zadejte e-mailovou adresu příjemce.
<Note>
V tuto chvíli je možný pouze jeden příjemce.
</Note>
* Nastavte předmět.
* Sestavte tělo zprávy. Můžete formátovat odkazy, vytvářet číslované seznamy, seznamy odrážek a přidávat přílohy.
<Note>
Přidávání HTML podpisů momentálně není možné.
</Note>
### Formulář
Vyvolá formulář během provádění pracovního postupu pro sběr uživatelských vstupů. Odpovědi lze poté použít v následujících krocích k vytváření záznamů, odesílání e-mailů nebo provádění jiných akcí na základě zadaných údajů.
<Warning>
**Formuláře jsou navrženy pouze pro ruční spuštění**. U workflow s jinými spouštěči (vytvoření záznamu, aktualizace atd.) jsou formuláře přístupné pouze přes rozhraní běžů workflow, což neodpovídá očekávané uživatelské zkušenosti. Oznamovací středisko bude uvolněno v roce 2026 za účelem řádné podpory formulářů v automatizovaných pracovních postupech.
</Warning>
**Konfigurace**:
* Nakonfigurujte pole, která budou uživatelé vyplňovat. Pro každé pole zvolte
* typ z možností: text, číslo, datum, daný záznam, výběrové pole. Pole všech objektů jsou k dispozici pro výběr.
* štítek
* výchozí hodnotu pod `Placeholder` (volitelné)
* Upravte název formuláře
**Výstup**: Odpovědi z formuláře jsou k dispozici pro použití v následujících krocích.
**Příklad**: Pracovní postup "Rychlé vedení" je ve výchozím nastavení dostupný ve všech pracovních prostorách, dostupný kdekoli v příkazové nabídce `Cmd+K`.
**Jak vyplnit formulář**:
* Spusťte manuální pracovní tok z menu příkazu `Cmd+K`
* Vyplňte formulář zobrazený v postranním panelu a klikněte na `Submit`.
<Note>
Pole nelze nastavit jako povinná.
</Note>
<VimeoEmbed videoId="1147277989" title="Ukázka videa" />
## Integrační akce
### Kód
Spouští vlastní JavaScript ve vašem pracovním postupu.
Na pozadí je každá akce Code podpořena vlastní **logickou funkcí** — serverovou funkcí v TypeScriptu, která běží na platformě Twenty. Když přidáte akci Code, Twenty vytvoří pro tento krok vyhrazenou logickou funkci a zobrazí její editor přímo inline, takže kód, který napíšete, zůstává u pracovního postupu.
**Konfigurace**:
* Přístup k proměnným z předchozích kroků. Názvy proměnných můžete dynamicky upravovat.
<VimeoEmbed videoId="1147281795" title="Ukázka videa" />
* Zapište JavaScriptový kód v editoru
* Vrátit proměnné pro použití v následujících krocích
* Testovat kód přímo ve kroku
<Note>
Pokud potřebujete ve svém kódu použít externí klíče API, musíte je zadat přímo do těla funkce. Nelze nakonfigurovat API klíče jinde a odkazovat na ně v logické funkci.
</Note>
<Tip>
**Pracujete s poli?** Pole z externích systémů nebo předchozích kroků mohou přijít jako řetězce. Řešení viz [Jak pracovat s poli v akcích Code](/l/cs/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions).
</Tip>
<Tip>
Klikněte na čtvercovou ikonu vpravo nahoře v editoru kódu a zobrazte jej na celou obrazovku — hodí se to, protože výchozí šířka editoru je omezená.
</Tip>
#### Znovupoužití logické funkce napříč pracovními postupy
Inline akce Code je skvělá pro jednorázovou logiku, ale kód, který obsahuje, patří pouze tomuto jedinému kroku. Když chcete sdílet stejnou logiku napříč několika pracovními postupy — nebo ji udržovat jako verzovaný zdrojový kód v aplikaci — definujte **znovupoužitelnou logickou funkci** místo kopírování a vkládání kódu do každé akce Code.
Logická funkce je definována jednou v aplikaci (pomocí SDK `defineLogicFunction`) a zpřístupněna v nástroji pro tvorbu pracovních postupů přidáním `workflowActionTriggerSettings`. Jakmile je vaše aplikace nainstalována, tato funkce se objeví jako samostatná akce v nástroji pro tvorbu pracovních postupů vedle vestavěných akcí. Její výběr vykreslí vstupní pole, která jste deklarovali (s výběry proměnných, stejně jako u jiných akcí), a spustí váš sdílený kód — není potřeba žádný inline JavaScript.
| | Akce Code | Znovupoužitelná logická funkce |
| ---------------- | ------------------------------------------------------ | ----------------------------------------------------------------- |
| **Kde kód žije** | Inline editor, vázaný na jeden krok pracovního postupu | Definována v aplikaci, verzovaná v systému správy zdrojového kódu |
| **Znovupoužití** | Kopírováno a vkládáno pro každý krok | Přidána jako akce v libovolném pracovním postupu |
| **Vstupy** | Proměnné zapojené v editoru | Pole vykreslená z vámi deklarovaného vstupního schématu |
| **Vhodné pro** | Rychlá logika specifická pro daný pracovní postup | Sdílená logika používaná napříč více pracovními postupy |
Obě běží ve stejném běhovém prostředí logických funkcí, takže akci Code, kterou jste prototypovali inline, lze později povýšit na znovupoužitelnou logickou funkci s minimálními změnami.
<Tip>
Referenční dokumentaci pro vývojáře k definování logických funkcí a jejich zpřístupnění v nástroji pro tvorbu pracovních postupů najdete v [Logic Functions](/l/cs/developers/extend/apps/logic/logic-functions) — zejména v sekci **Exposing a function as an AI tool or workflow action** a `workflowActionTriggerSettings`.
</Tip>
### HTTP požadavek
Odešle požadavek na externí API v rámci vašeho pracovního postupu.
<img src="/images/user-guide/workflows/http_action.png" style={{width:'100%'}} />
**Konfigurace**:
* Zadejte URL endpointu API. Je možné použít parametry z předchozích kroků.
* Vyberte metodu HTTP (GET, POST, PUT, PATCH, DELETE)
* Přidejte potřebné hlavičky a hodnoty
* Poskytněte ukázku odpovědi pro zobrazení struktury
## Akce AI
### Agent AI – již brzy
Spouští agenta AI ve vašem pracovním postupu k provádění inteligentních úloh.
**Konfigurace**:
* **Agent**: Vyberte existujícího agenta AI nebo použijte výchozího agenta
* **Prompt**: Napište instrukci pro agenta AI
* Odkazujte v promptu na proměnné z předchozích kroků
**Co agenti AI dokážou**:
* Analyzovat a shrnovat data
* Klasifikovat nebo kategorizovat záznamy
* Generovat textový obsah
* Rozhodovat se na základě dat
* Pracovat s vašimi daty CRM pomocí nástrojů
**Výstup**: Odpověď agenta AI je k dispozici pro použití v následujících krocích. Pokud má agent strukturované schéma výstupu, bude odpověď tento formát dodržovat.
<Note>
Akce agenta AI spotřebovávají kredity pracovního postupu podle použitého modelu AI. Podrobnosti viz [Kredity pracovního postupu](/l/cs/user-guide/workflows/capabilities/workflow-credits).
</Note>
<Note>
Agenti AI respektují oprávnění založená na rolích. V části **Nastavení → Členové → Role** můžete agentům přiřadit konkrétní role, abyste řídili, k jakým datům mají přístup. Podrobnosti viz [Oprávnění](/l/cs/user-guide/permissions-access/capabilities/permissions).
</Note>

View File

@@ -0,0 +1,66 @@
---
title: Větve pracovního postupu
description: Vytvářejte paralelní cesty a podmíněnou logiku ve svých pracovních postupech.
---
Větve vám umožní rozdělit pracovní postup do více cest, které mohou běžet současně nebo podmíněně na základě vašich dat.
<img src="/images/user-guide/workflows/branches.png" style={{width:'100%'}} />
## Jak větve fungují
Když z jednoho uzlu vytvoříte více propojení, každá cesta se stane větví. Ve výchozím nastavení se **všechny větve provádějí paralelně** — nečekají na sebe navzájem.
## Vytváření větví
### Přidat novou větev
1. **Klikněte pravým tlačítkem na hlavní plátno** pracovního postupu (ne na existující uzel)
2. Klikněte na **Přidat uzel**
3. Vyberte typ uzlu pro svou novou větev
4. Přetáhněte šipku ze spodní části předchozího kroku na horní část této nové akce
5. Opakujte pro přidání dalších větví ze stejného uzlu
<Note>
Každá větev je nezávislá. Přidání větve neovlivní jiné existující cesty z tohoto uzlu.
</Note>
### Vizuální rozložení
Větve se v editoru pracovního postupu zobrazují jako paralelní cesty. Můžete přetahovat uzly a upravovat tak vizuální rozložení, aniž by to ovlivnilo běh.
## Podmíněné větve
Protože se všechny větve ve výchozím nastavení spouštějí, použijte uzly **Filtr** ke kontrole, které cesty se skutečně provedou:
| Větev | Podmínka filtru | Akce |
| ----- | -------------------- | ------------------------------ |
| A | Fáze = "Vyhráno" | Odeslat gratulační e‑mail |
| B | Fáze = "Prohráno" | Vytvořit úkol následného kroku |
| C | Fáze = "Vyjednávání" | Upozornit manažera |
1. Vytvářejte větve ze svého spouštěče nebo akce
2. Přidejte uzel **Filtr** jako první krok každé větve
3. Nakonfigurujte každý filtr s navzájem se vylučujícími podmínkami
4. Za každý filtr přidejte své akce
V provádění bude pokračovat pouze větev (větve), kde je splněna podmínka filtru.
## Slučování větví
**Větve se automaticky neslučují.** Každá větev běží nezávisle, dokud neskončí. Máte plnou volnost v tom, jak to řešit:
* **Možnost 1: Nechávejte větve oddělené**
Každá větev samostatně zpracovává své následné akce. Toto je nejjednodušší přístup, když není potřeba, aby se větve sbíhaly.
* **Možnost 2: Sloučit větve ručně**
Při vytváření pracovního postupu můžete ručně připojit více větví ke stejné následné akci. Jednoduše přetáhněte šipky z konce každé větve do společného uzlu.
<Note>
Ačkoli můžete k pozastavení běhu použít uzel [Delay](/l/cs/user-guide/workflows/capabilities/workflow-actions#delay), momentálně jej nelze nastavit tak, aby čekal "dokud neskončí jiná větev".
</Note>
## Související
* [Jak používat větve v pracovních postupech](/l/cs/user-guide/workflows/capabilities/use-branches-in-workflows) - Průvodce krok za krokem
* [Akce pracovního postupu](/l/cs/user-guide/workflows/capabilities/workflow-actions) - Dostupné akce včetně Filtru

View File

@@ -0,0 +1,75 @@
---
title: Kredity pracovních postupů
description: Pochopte spotřebu a správu kreditů pracovních postupů.
---
Kredity pracovních postupů pohánějí vaše automatizace v Twenty. Pochopení, jak fungují, vám pomůže optimalizovat náklady a efektivně spravovat svůj rozpočet na automatizaci.
## Přidělení kreditů
Kredity pracovních postupů jsou přidělovány podle vašeho fakturačního cyklu, nikoli podle úrovně plánu:
| Fakturační cyklus | Kredity |
| ---------------------- | ------------------ |
| **Měsíční předplatné** | 5 kreditů za měsíc |
| **Roční předplatné** | 50 kreditů za rok |
<Note>
5 měsíčních kreditů je štědrý limit pro standardní automatizace. Většina týmů tento limit při typickém používání pracovních postupů nepřekročí. Dodatečné kredity jsou potřeba především pro pokročilé akce Code a pracovní postupy s využitím AI.
</Note>
## Jak funguje spotřeba kreditů
Kredity se spotřebovávají při provádění pracovních postupů, nikoli při jejich vytváření. Každá akce v pracovním postupu spotřebovává kredity podle své složitosti:
### Spotřeba kreditů podle typu akce
* **Základní interní operace**: Velmi nízká spotřeba kreditů
* Hledání záznamů
* Vytvořit záznam
* Aktualizovat záznam
* Smazat záznam
* Akce formuláře
* **Složitější operace**: Vyšší spotřeba kreditů
* Akce kódování (provádění JavaScriptu)
* HTTP požadavky na externí služby
* **Funkce AI**: Vyšší spotřeba kreditů
* Akce agenta AI spotřebovávají kredity podle použitého modelu AI
* Složitější prompty a delší výstupy spotřebují více kreditů
* **Akce Delay**: Minimální spotřeba kreditů
* Uzel Delay při provedení spotřebuje **1 kredit**
* **Žádné kredity se nespotřebovávají** během doby čekání
* Pětiminutové zpoždění stojí stejně jako pětidenní zpoždění
### Okamžité stržení
Kredity jsou strhávány v reálném čase při provádění pracovních postupů. Toto znamená:
* Návrhy pracovních postupů nespotřebovávají kredity
* Pouze aktivní, běžící pracovní postupy používají vaše přidělené kredity
* Nezdařené pracovní postupy stále vyčerpávají kredity za dokončené kroky
## Správa kreditů
### Zkontrolujte využití kreditů
1. Přejděte na **Nastavení → Fakturace**
2. Zobrazte svoji aktuální spotřebu kreditů a zbývající zůstatek
3. Sledujte vzory používání pro optimalizaci svých pracovních postupů
### Nákup dalších kreditů
Pokud potřebujete více kreditů než přidělení vašeho plánu:
1. Přejděte na **Nastavení → Fakturace**
2. Klikněte na možnost koupit další kredity. Balíčky různých velikostí jsou k dispozici.
3. Kredity jsou přidány k vašemu aktuálnímu zůstatku
## Osvedčené postupy
* **Dávkové zpracování**: Pro snížení individuálních akčních hovorů použijte hromadné operace a akce Iterátor
* **Optimalizace manuálních spouštěčů**: U manuálních spouštěčů zvolte dostupnost `Bulk` pro zpracování více záznamů v rámci jednoho spuštění pracovního postupu
* Optimalizujte akce kódu pro efektivitu

View File

@@ -0,0 +1,93 @@
---
title: Běhy průběhu práce
description: Sledujte a spravujte běhy pracovních postupů.
---
## O bězích
**Běh** je záznam provedení pracovního postupu. Při každém spuštění pracovního postupu—ať už událostí záznamu, plánem, ruční akcí nebo webhookem—se vytvoří nový běh.
## Zobrazení běhů
### Z editoru pracovních postupů
1. Otevřete pracovní postup, který chcete sledovat
2. Klikněte na panel **Běhů** na pravé straně
3. Zobrazte seznam nedávných běhů s jejich stavem
### Ze zobrazení běhů pracovních postupů
1. V postranním panelu přejděte na **Běhy pracovních postupů**
2. Zobrazte běhy napříč všemi pracovními postupy
3. Filtrujte podle stavu, pracovního postupu nebo data
## Stavy běhů
| Stav | Popis |
| ------------- | ----------------------------------------------------------------------------------- |
| **Běží** | Pracovní postup se právě provádí |
| **Dokončeno** | Pracovní postup byl úspěšně dokončen |
| **Selhalo** | Pracovní postup narazil na chybu a zastavil se |
| **Čekání** | Pracovní postup je pozastaven (např. čeká na akci Zpoždění nebo odeslání formuláře) |
## Podrobnosti běhu
Kliknutím na libovolný běh zobrazíte:
* **Stav**: Aktuální stav běhu
* **Zahájeno**: Kdy běh začal
* **Doba trvání**: Jak dlouho běh trval
* **Data spouštěče**: Vstup, který spustil pracovní postup
* **Výstupy kroků**: Data vrácená jednotlivými kroky
* **Chybové zprávy**: Pokud běh selhal, co se pokazilo
## Provádění krok za krokem
Každý běh ukazuje průchod vaším pracovním postupem:
1. Zjistěte, které kroky byly úspěšně dokončeny
2. Zjistěte, kde došlo k selhání
3. Zobrazte data předávaná mezi kroky
4. Laděte problémy zkoumáním vstupů a výstupů kroků
## Zpracování chyb
Když běh selže:
1. Otevřete neúspěšný běh
2. Najděte krok, který selhání způsobil
3. Zkontrolujte podrobnosti v chybové zprávě
Běžné problémy:
* Chybějící povinná pole
* Neplatný formát dat
* Chyby externího API
* Problémy s oprávněními
## Opětovné spuštění pracovních postupů
Pokud spuštění selže, můžete:
* Opravit základní problém a počkat na další aktivaci spouštěče
* U manuálních pracovních postupů spustit znovu se stejnými nebo aktualizovanými daty
* Zkontrolovat logiku pracovního postupu, abyste předešli budoucím selháním
## Tipy pro výkon
### Správa historie spouštění
* Runy se uchovávají pro historickou referenci
* Velmi staré běhy mohou být archivovány automaticky
* Exportovat běh dat, pokud potřebujete uchovávat záznamy
### Monitorování osvědčených postupů
* Po aktivaci nových pracovních postupů pravidelně kontrolovat běh
* Recenze selhala pro identifikaci vzorů
## Související
* [Spouštěče pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-triggers)
* [Akce pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-actions)
* [Řešení problémů pracovního postupu](/l/cs/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting)

View File

@@ -0,0 +1,137 @@
---
title: Spouštěče pracovních postupů
description: Seznamte se s různými spouštěči, které zahajují vaše pracovní postupy.
---
## O spouštěčích
Pracovní postupy vždy začínají jedním spouštěčem, který určuje, kdy by měla být automatizace spuštěna.
<img src="/images/user-guide/workflows/workflow_triggers.png" style={{width:'100%'}} />
<Tip>
**Pokročilé objekty jsou podporovány!** Kromě standardních CRM objektů (Lidé, Společnosti, Příležitosti) můžete také spouštět pracovní postupy a provádět akce nad:
* Členové pracovního prostoru
* Události v kalendáři
* Zprávy (e-maily)
* Úkoly, poznámky a mnoho dalších systémových objektů
To umožňuje výkonné automatizace, například upozorňovat členy týmu, když jsou v kalendáři vytvořeny události, nebo automaticky zpracovávat příchozí e-maily.
</Tip>
## Záznam je vytvořen
Spouští pracovní postup, když je vytvořen nový záznam ve vybraném objektu (Lidé, Společnosti, Příležitosti nebo jakýkoli vlastní objekt).
**Konfigurace**: Vyberte typ objektu, který chcete sledovat ohledně nových záznamů.
<Note>
* Tento spouštěč je skvělý pro záznamy vytvořené CSV, poštovní schránkou a synchronizací kalendáře nebo API.
* **Nedoporučuje se pro záznamy vytvářené ručně**: s tímto spouštěčem se pracovní postupy spouštějí okamžitě po vytvoření záznamu. Vzhledem k tomu, že dvacet UI nabízí automatické ukládání na létání (neexistuje žádný režim úprav a pak ověření pro uložení záznamů), pracovní postup bude spuštěn před zadáním všech polí uživatele.
Chcete-li tento pracovní postup spouštět u záznamů vytvořených ručně, doporučujeme místo toho použít spouštěč `Record is created or updated`.
</Note>
## Záznam je aktualizován
Spouští pracovní postup, když jsou v existujícím záznamu provedeny změny.
**Konfigurace**:
* Vyberte typ objektu
* Volitelně specifikujte, které pole chcete sledovat pro změny
## Záznam je aktualizován nebo vytvořen
Spouští pracovní postup, když je záznam buď vytvořen, nebo aktualizován ve vybraném objektu.
**Proč to je důležité**: Tento spouštěč je obzvláště užitečný, protože záznamy vytvořené různými metodami se chovají odlišně:
* **API/CSV importy**: Záznamy jsou vytvořeny s okamžitě vyplněnými všemi poli
* **Manuální tvorba**: Záznamy jsou nejprve vytvořeny, poté jsou pole přidávány v následných aktualizacích
**Konfigurace**:
* Vyberte typ objektu, který chcete sledovat
* Volitelně specifikujte, které pole chcete sledovat pro změny
* Pracovní postup se spustí jak při počátečním vytvoření, tak při jakýchkoliv následných aktualizacích
## Záznam je odstraněn
Spouští pracovní postup, když je záznam odstraněn z objektu.
**Konfigurace**: Vyberte typ objektu, který chcete sledovat ohledně odstranění.
## Ruční spouštěč
Spustí pracovní postup, když jej vyvolá uživatelská akce. K tomuto spouštěči je možné přistupovat prostřednictvím nabídky `Cmd+K` nebo pomocí vlastního tlačítka, které se zobrazí v horní navigační liště po výběru záznamu nebo záznamů.
<img src="/images/user-guide/workflows/add_to_newsletter_button.png" style={{width:'100%'}} />
**Konfigurace dostupnosti**:
Vyberte, jak má pracovní postup zpracovávat výběr záznamů:
* **Globální**: K aktivaci tohoto pracovního postupu není vyžadován žádný záznam. Pracovní postup je spuštěn z menu příkazu `Cmd+K` kdekoli (z libovolného objektu) a jako vstup nepoužívá záznam(y).
Pro **single** a **Bulk** dostupnost budou vybrané záznamy předány vašemu pracovnímu postupu. Toto je konfigurováno pro daný objekt a před spuštěním pracovního postupu lze vybrat několik záznamů.
* **Jedno**: Pracovní postup běží od začátku do konce tolikrát, kolikrát jsou vybrány záznamy.
<Note>
**Měkký limit: 100 běhů za minutu**. Po překročení tohoto limitu zůstanou pracovní postupy ve stavu "Not Started" a budou zpracovávány postupně—buď úlohou na pozadí, nebo když do fronty vstoupí další pracovní postup. To znamená, že se spouštěčem Jednotlivé můžete vybrat více než 100 záznamů; provádění bude jen pomalejší.
</Note>
* **Hromadné**: Pracovní postup bude spuštěn jednou, poskytne celý seznam záznamů jako vstup. To znamená, že pracovní postup musí obsahovat [akci Iterator](/l/cs/user-guide/workflows/capabilities/workflow-actions#iterator).
<Note>
Toto je pokročilejší a hodí se pro uživatele, kteří chtějí optimalizovat počet běhů pracovního postupu.
</Note>
<img src="/images/user-guide/workflows/manual_trigger.png" style={{width:'100%'}} />
**Dodatečné nastavení**:
* Vyberte cílový objekt (pro dostupnost v režimu Jednotlivé a Hromadné)
* Vyberte ikonu příkazu pro spuštění pracovního postupu
* Nakonfigurujte umístění v navigaci (připnuté nebo nepřipnuté)
**Způsoby přístupu**:
* Nabídka `Cmd+K` pro vyhledání a spuštění ručních pracovních postupů
* Vlastní tlačítko v horní navigaci (pokud je nastaveno)
## Časový spouštěč: Podle plánu
Spouští pracovní postup v opakovaných intervalech, které definujete.
**Konfigurace**:
* Vyberte časovou jednotku (minuty, hodiny, dny)
* Zadejte hodnotu nebo použijte vlastní cron výrazy pro rozšířené plánování
<Note>
**Časové pásmo**: Plánované pracovní postupy běží v **UTC**. Při nastavování hodin pro denní plány převeďte svůj místní čas na UTC.
</Note>
## Externí spouštěč: Webhook
Spustí pracovní postup, když je z externí služby přijat požadavek typu GET nebo POST.
<img src="/images/user-guide/workflows/webhook_trigger.png" style={{width:'100%'}} />
**Konfigurace**:
* Pracovní postup poskytne jedinečnou URL adresu webhooku—zkopírujte ji a přidejte do svého externího systému jako koncový bod, který se má volat.
* Pro požadavky POST definujte očekávanou strukturu těla, aby Twenty vědělo, jaká data očekávat. Zde přidejte pole, která obdržíte a která budou dále ve vašem pracovním postupu potřeba.
* Nakonfigurujte ověřování (již brzy).
## Výběr správného spouštěče
| Případ použití | Doporučený spouštěč |
| ---------------------------------------------- | ------------------------------------ |
| Nové potenciální kontakty je potřeba zpracovat | Záznam je vytvořen |
| Změny dat je potřeba synchronizovat | Záznam je aktualizován |
| Import/ruční zpracování dat | Záznam je aktualizován nebo vytvořen |
| Čištění po smazání | Záznam je odstraněn |
| Akce spuštěná uživatelem | Spustit manuálně |
| Pravidelné reporty | Podle plánu |
| Externí integrace | Webhook nebo Podle plánu |

View File

@@ -0,0 +1,84 @@
---
title: Verze pracovního postupu
description: Spravujte verze a koncepty pracovních postupů.
---
## O verzích
Pokaždé, když aktivujete pracovní postup, se vytvoří nová verze. To vám umožní sledovat změny v čase a v případě potřeby se vrátit k předchozím konfiguracím.
## Stavy verzí
| Stav | Popis |
| ---------------- | ------------------------------------ |
| **Koncept** | Upravováno, dosud nezveřejněno |
| **Aktivní** | Živá verze reagující na spouštěče |
| **Deaktivováno** | Dříve aktivní, ale ručně zastaveno |
| **Archivováno** | Minulé verze uchovávané pro historii |
## Práce s koncepty
Když upravíte aktivní pracovní postup, vaše změny se uloží jako **koncept**. Aktivní verze běží dál, zatímco pracujete na aktualizacích.
Až dokončíte úpravy, můžete:
* **Aktivovat**: Publikovat koncept jako novou aktivní verzi (předchozí verze bude archivována)
* **Zahodit**: Smazat koncept a ponechat aktuální aktivní verzi
## Historie Verzí
### Zobrazení minulých verzí
1. Otevřete pracovní postup
2. Klikněte na kartu **Verze**
3. Zobrazí se všechny předchozí verze s časovými razítky
### Obnovení verze
1. Najděte verzi, kterou chcete obnovit
2. Klikněte na **Použít jako koncept**
3. Verze se zkopíruje do nového konceptu
4. Proveďte všechny potřebné aktualizace
5. Aktivujte, až budete připraveni.
## Osvědčené postupy
### Správa verzí
* Aktivujte teprve, až bude připraveno pro produkční prostředí.
* Mezi verzemi udržujte smysluplné změny.
* Zdokumentujte zásadní změny v názvech nebo popisech pracovních postupů
* Testujte v režimu konceptu před aktivací
### Vrácení změn
* Pokud nová verze způsobuje problémy, obnovte předchozí verzi
* Použijte historii verzí ke sledování toho, co se změnilo
* Obnovené verze vždy otestujte před aktivací
## Běžné pracovní postupy
### Rychlá úprava
1. Proveďte drobné změny v aktivním pracovním postupu
2. Testujte v režimu konceptu
3. Aktivujte novou verzi
### Zásadní revize
1. Použijte předchozí verzi jako výchozí bod
2. Proveďte významné změny v konceptu
3. Důkladně otestujte všechny scénáře
4. Aktivujte, až budete mít jistotu
### Vrácení zpět
1. Identifikujte problém s aktuální verzí
2. Najděte v historii poslední funkční verzi
3. Klikněte na **Použít jako koncept**
4. Aktivujte, abyste obnovili původní chování
## Související
* [Začínáme s pracovními postupy](/l/cs/user-guide/workflows/overview)
* [Běhy pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-runs)

View File

@@ -0,0 +1,82 @@
---
title: Zpracování polí v akcích Code
description: Naučte se správně pracovat se vstupy typu pole v akcích Code v pracovních postupech.
---
Při práci s poli v akcích Code se můžete setkat se dvěma běžnými problémy:
1. **Pole předaná jako řetězce** — data z externích systémů nebo předchozích kroků dorazí jako řetězec místo skutečného pole
2. **Nelze vybírat jednotlivé položky** — můžete vybrat pouze celé pole, nikoli konkrétní pole objektů v něm
Obojí lze vyřešit pomocí uzlu Code.
## Parsování polí z řetězců
Pole se mezi kroky pracovního postupu často předávají jako řetězce nebo JSON, nikoli jako nativní pole. K tomu dochází, když:
* Příjem dat z externích API pomocí HTTP Request
* Zpracování dat webhooků
* Předávání dat mezi kroky pracovního postupu
**Řešení**: Přidejte tento vzor na začátek své akce Code:
```javascript
export const main = async (params: {
users: any;
}): Promise<object> => {
const { users } = params;
// Handle input that may come as a string or an array
const usersFormatted = typeof users === "string" ? JSON.parse(users) : users;
// Now you can safely work with usersFormatted as an array
return {
users: usersFormatted.map((user) => ({
...user,
activityStatus: String(user.activityStatus).toUpperCase(),
})),
};
};
```
Klíčový řádek `typeof users === "string" ? JSON.parse(users) : users` ověřuje, zda je vstup řetězec, v případě potřeby jej rozparsuje, nebo jej použije přímo, pokud už jde o pole.
## Extrahování jednotlivých atributů z polí
Webhook může vrátit pole jako `answers: [...]`, ale v následujících krocích pracovního postupu lze vybrat pouze celé pole — nikoli jednotlivé položky v něm.
**Řešení**: Přidejte uzel Code, který extrahuje konkrétní pole a vrátí je jako strukturovaný objekt:
```javascript
export const main = async (params: {
answers: any;
}): Promise<object> => {
const { answers } = params;
// Handle input that may come as a string or an array
const answersFormatted = typeof answers === "string"
? JSON.parse(answers)
: answers;
// Extract specific fields from the array
const firstname = answersFormatted[0]?.text || "";
const name = answersFormatted[1]?.text || "";
return {
answer: {
firstname,
name
}
};
};
```
Uzel Code vrátí místo pole strukturovaný objekt. V následujících krocích nyní můžete ve výběru proměnných vybrat jednotlivá pole, jako `answer.firstname` a `answer.name`.
<Tip>
**Chcete místo rozbalování polí iterovat přímo přes pole?** Když krok Code nebo Logic Function vrátí pole na nejvyšší úrovni, můžete ho předat přímo do [Iteratoru](/l/cs/user-guide/workflows/capabilities/use-iterator): jako vstup Iteratoru vyberte možnost kroku **Whole list** a uvnitř smyčky pak na každou položku odkazujte pomocí `{{iterator.currentItem}}`. V takovém případě nemusíte pole převádět na objekt.
</Tip>
<Tip>
Klikněte na čtvercovou ikonu vpravo nahoře v editoru kódu a zobrazte jej na celou obrazovku — hodí se to, protože výchozí šířka editoru je omezená.
</Tip>

View File

@@ -0,0 +1,182 @@
---
title: Přeneste produktová data do Twenty
description: Synchronizujte data produktového katalogu z datového skladu do svého CRM podle plánu.
---
Použijte tento vzor k udržení synchronizace Twenty s produktovými daty z vašeho datového skladu (např. Snowflake, BigQuery, PostgreSQL).
## Struktura pracovního postupu
1. **Spouštěč**: Podle plánu
2. **Code**: Spusťte dotaz na svůj datový sklad
3. **Code** (volitelné): Naformátujte data jako pole
4. **Iterator**: Procházejte jednotlivé produkty
5. **Upsert Record**: Vytvořte nebo aktualizujte záznam v Twenty
<img src="/images/user-guide/workflows/create_users_workflow.png" style={{width:'100%'}} />
## Krok 1: Naplánujte spouštěč
Nastavte pracovní postup tak, aby běžel s frekvencí odpovídající vašim požadavkům na aktuálnost dat:
* Každých 5 minut pro synchronizaci téměř v reálném čase
* Každou hodinu pro méně kritická data
* Denně pro dávkové aktualizace
## Krok 2: Proveďte dotaz na svůj datový sklad
Přidejte akci **Code** pro načtení nejnovějších dat:
```javascript
export const main = async () => {
const intervalMinutes = 10; // Match your schedule frequency
const cutoffTime = new Date(Date.now() - intervalMinutes * 60 * 1000).toISOString();
// Replace with your actual data warehouse connection
const response = await fetch("https://your-warehouse-api.com/query", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
query: `
SELECT id, name, sku, price, stock_quantity, updated_at
FROM products
WHERE updated_at >= '${cutoffTime}'
`
})
});
const data = await response.json();
return { products: data.results };
};
```
<Tip>
Filtrováním podle `updated_at >= last X minutes` získáte pouze nedávno změněné záznamy. Díky tomu zůstane synchronizace efektivní.
</Tip>
## Krok 3: Formátování dat (volitelné)
Pokud váš datový sklad vrací data ve formátu, který vyžaduje transformaci, přidejte další akci **Code**. Mezi běžné transformace patří převody typů, přejmenování polí a čištění dat.
### Příklad: Uživatelská data s logickými a stavovými poli
```javascript
export const main = async (params: {
users: any;
}): Promise<object> => {
const { users } = params;
const usersFormatted = typeof users === "string" ? JSON.parse(users) : users;
// Convert string "true"/"false" to actual booleans
const toBool = (v: any) => v === true || v === "true";
return {
users: usersFormatted.map((user) => ({
...user,
activityStatus: String(user.activityStatus).toUpperCase(),
isActiveLast30d: toBool(user.isActiveLast30d),
isActiveLast7d: toBool(user.isActiveLast7d),
isActiveLast24h: toBool(user.isActiveLast24h),
isTwenty: toBool(user.isTwenty),
})),
};
};
```
### Příklad: Produktová data s převody typů
```javascript
export const main = async (params: { products: any }) => {
const products = typeof params.products === "string"
? JSON.parse(params.products)
: params.products;
return {
products: products.map(product => ({
externalId: product.id,
name: product.name,
sku: product.sku,
price: parseFloat(product.price), // String → Number
stockQuantity: parseInt(product.stock_quantity),
isActive: product.status === "active" // String → Boolean
}))
};
};
```
### Příklad: Formátování dat a měn
```javascript
export const main = async (params: { deals: any }) => {
const deals = typeof params.deals === "string"
? JSON.parse(params.deals)
: params.deals;
return {
deals: deals.map(deal => ({
...deal,
// Convert Unix timestamp to ISO date
closedAt: deal.closed_timestamp
? new Date(deal.closed_timestamp * 1000).toISOString()
: null,
// Ensure amount is a number (remove currency symbols)
amount: parseFloat(String(deal.amount).replace(/[^0-9.-]/g, "")),
// Normalize stage names
stage: deal.stage?.toLowerCase().replace(/_/g, " ")
}))
};
};
```
### Běžné transformace
| Zdrojový formát | Cílový formát | Kód |
| -------------------- | -------------------- | ---------------------------------------- |
| `"true"` / `"false"` | `true` / `false` | `v === true \|\| v === "true"` |
| `"123.45"` | `123.45` | `parseFloat(value)` |
| `"active"` | `"ACTIVE"` | `value.toUpperCase()` |
| `1704067200` (Unix) | Datum ve formátu ISO | `new Date(v * 1000).toISOString()` |
| `"$1,234.56"` | `1234.56` | `parseFloat(v.replace(/[^0-9.-]/g, ""))` |
| `null` / `undefined` | `""` | `value \|\| ""` |
## Krok 4: Projděte produkty
Přidejte akci **Iterator**:
* Vstup: `{{code.products}}`
Tímto projdete každý produkt v poli.
## Krok 5: Proveďte upsert pro každý záznam
Uvnitř iterátoru přidejte akci **Upsert Record**:
| Nastavení | Hodnota |
| --------------- | --------------------------------------------- |
| **Objekt** | Váš vlastní objekt Product |
| **Shoda podle** | Externí ID nebo SKU (jedinečný identifikátor) |
| **Název** | `{{iterator.item.name}}` |
| **SKU** | `{{iterator.item.sku}}` |
| **Cena** | `{{iterator.item.price}}` |
<Tip>
Použijte **Upsert** (aktualizace nebo vytvoření) místo vytváření samostatných větví pro vytvoření vs. aktualizaci. Je to rychlejší na vytvoření a snazší na ladění.
</Tip>
## Příklady použití
| Zdroj | Data |
| ------------------------ | ------------------------------------------- |
| **ERP systém** | Katalog produktů, ceny, skladové zásoby |
| **E-commerce platforma** | Objednávky, zákazníci, aktualizace produktů |
| **Datový sklad** | Agregované metriky, obohacená data |
| **Skladový systém** | Stavy zásob, upozornění na doobjednání |
## Související
* [Spouštěče pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-triggers)
* [Akce pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-actions)
* [Práce s poli v akcích Code](/l/cs/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions)

View File

@@ -0,0 +1,130 @@
---
title: Přeneste odeslané odpovědi z Typeformu do Twenty
description: Zpracujte payload webhooku Typeformu a vytvářejte leady z odeslaných formulářů.
---
Pro standardní nastavení webhooku viz [Nastavení spouštěče webhooku](/l/cs/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger). Tento článek se věnuje specifickému zpracování požadovanému pro vlastní strukturu payloadu Typeformu.
### Krok 1: Vytvořte pracovní postup pro webhook
1. Přejděte na **Nastavení → Pracovní postupy**
2. Klikněte na **+ Nový pracovní postup**
3. Vyberte **Webhook** jako spouštěč
4. Zkopírujte URL webhooku
### Krok 2: Nakonfigurujte Typeform
1. V Typeformu otevřete svůj formulář
2. Přejděte na **Connect → Webhooks**
3. Vložte svou URL webhooku Twenty
4. Uložit
### Krok 3: Porozumějte payloadu Typeformu
Typeform posílá vnořenou strukturu JSON. Zde je zjednodušený příklad:
```json
{
"event_type": "form_response",
"form_response": {
"form_id": "abc123",
"submitted_at": "2025-01-15T10:30:00Z",
"answers": [
{
"text": "Jane",
"type": "text",
"field": { "id": "field1", "type": "short_text", "title": "First Name" }
},
{
"text": "Smith",
"type": "text",
"field": { "id": "field2", "type": "short_text", "title": "Last Name" }
},
{
"text": "Acme Corp",
"type": "text",
"field": { "id": "field3", "type": "short_text", "title": "Company" }
},
{
"email": "jane@acme.com",
"type": "email",
"field": { "id": "field4", "type": "email", "title": "Email" }
},
{
"type": "choice",
"field": { "id": "field5", "type": "dropdown", "title": "Team Size" },
"choice": { "label": "10-50" }
}
]
}
}
```
Důležité body:
* Data formuláře jsou vnořena pod `form_response`
* **Odpovědi jsou vráceny jako pole**, nikoli jako pojmenovaná pole
* Každá odpověď obsahuje pro referenci typ a název pole
### Krok 4: Extrahujte pole z pole odpovědí
Protože `answers` je pole, v následujících krocích můžete vybrat pouze celé pole — nikoli jednotlivá pole. Přidejte akci **Code** k extrakci potřebných polí:
```javascript
export const main = async (params: {
answers: any;
}): Promise<object> => {
const { answers } = params;
// Handle input that may come as a string or an array
const answersFormatted = typeof answers === "string"
? JSON.parse(answers)
: answers;
// Extract fields by position or by finding the field type
const firstName = answersFormatted[0]?.text || "";
const lastName = answersFormatted[1]?.text || "";
const company = answersFormatted[2]?.text || "";
const email = answersFormatted.find(a => a.type === "email")?.email || "";
const teamSize = answersFormatted.find(a => a.type === "choice")?.choice?.label || "";
return {
contact: {
firstName,
lastName,
company,
email,
teamSize
}
};
};
```
Nyní v následujících krocích můžete z výběru proměnných vybrat `contact.firstName`, `contact.email` apod.
<Tip>
Další podrobnosti o práci s poli v akcích Code viz [Práce s poli v akcích Code](/l/cs/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions).
</Tip>
### Krok 5: Vytvořte záznam
Přidejte akci **Vytvořit záznam**:
| Pole | Hodnota |
| -------------- | -------------------------------------------------------------- |
| **Objekt** | Osoby |
| **Jméno** | `{{code.contact.firstName}}` |
| **Příjmení** | `{{code.contact.lastName}}` |
| **Email** | `{{code.contact.email}}` |
| **Společnost** | Vyhledejte nebo vytvořte na základě `{{code.contact.company}}` |
### Krok 6: Otestujte a aktivujte
1. Odešlete testovou odpověď v Typeformu
2. Zkontrolujte běh pracovního postupu, abyste ověřili, že data byla zachycena
3. Aktivujte pracovní postup
## Související
* [Nastavení spouštěče webhooku](/l/cs/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger)
* [Práce s poli v akcích Code](/l/cs/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions)

View File

@@ -0,0 +1,263 @@
---
title: Vygenerovat PDF z Twenty
description: Vytvořte pracovní postup pro generování a připojení PDF (například nabídky) k záznamu.
---
Automaticky vygenerujte nebo získejte PDF a připojte ho k záznamu v Twenty. To se běžně používá k vytváření nabídek, faktur nebo reportů, které jsou propojené se společnostmi, příležitostmi nebo jinými objekty.
## Přehled
Tento pracovní postup používá **Ruční spouštěč**, takže uživatelé mohou na požádání vygenerovat PDF pro libovolný vybraný záznam. O zpracování se stará **logická funkce**:
1. Stažení PDF z adresy URL (ze služby pro generování PDF)
2. Nahrání souboru do Twenty
3. Vytvoření přílohy propojené se záznamem
## Předpoklady
Než nastavíte pracovní postup:
1. **Vytvořte klíč API**: Přejděte do **Nastavení → API** a vytvořte nový klíč API. Tento token budeš potřebovat pro logickou funkci.
2. **Nastavte službu pro generování PDF** (volitelné): Pokud chcete dynamicky generovat PDF (např. nabídky), použijte službu jako Carbone, PDFMonkey nebo DocuSeal k vytvoření PDF a získání adresy URL pro stažení.
## Nastavení krok za krokem
### Krok 1: Nakonfigurujte spouštěč
1. Přejděte na **Pracovní postupy** a vytvořte nový pracovní postup
2. Vyberte **Ruční spouštěč**
3. Zvolte objekt, ke kterému chcete připojovat PDF (např. **Společnost** nebo **Příležitost**)
<Tip>
s manuálním spouštěčem, uživatelé mohou spustit tento pracovní postup pomocí tlačítka, které se zobrazí vpravo nahoře, jakmile je vybrán záznam - toto běží pracovní postup pro generování a připojení PDF.
</Tip>
### Krok 2: Přidejte logickou funkci
1. Přidat akci **Code** (funkce Logike)
2. Vytvořte novou funkci pomocí kódu níže
3. Nakonfigurujte vstupní parametry
#### Vstupní parametry
| Parametr | Hodnota |
| ----------- | ----------------------- |
| `companyId` | `{{trigger.object.id}}` |
<Note>
Pokud připojujete k jinému objektu (Osoba, Příležitost apod.), přejmenujte parametr podle toho (např. `personId`, `opportunityId`) a aktualizujte logickou funkci.
</Note>
#### Kód logické funkce
```typescript
export const main = async (
params: { companyId: string },
) => {
const { companyId } = params;
// Replace with your Twenty GraphQL endpoints (/metadata for metadata and files or /graphql for your records)
// Cloud: https://api.twenty.com/graphql
// Self-hosted: https://your-domain.com/graphql
const metadataGraphqlEndpoint = 'https://api.twenty.com/metadata';
const dataGraphqlEndpoint = 'https://api.twenty.com/graphql';
// Replace with your API key from Settings → APIs
const authToken = 'YOUR_API_KEY';
// Replace with your PDF URL
// This could be from a PDF generation service or a static URL
const pdfUrl = 'https://your-pdf-service.com/generated-quote.pdf';
const filename = 'quote.pdf';
// Step 1: Download the PDF file
const pdfResponse = await fetch(pdfUrl);
if (!pdfResponse.ok) {
throw new Error(`Failed to download PDF: ${pdfResponse.status}`);
}
const pdfBlob = await pdfResponse.blob();
const pdfFile = new File([pdfBlob], filename, { type: 'application/pdf' });
const fieldMetadataIdQuery = `
query FindUploadFileFieldMetadataId {
objects {
edges {
node {
nameSingular
fieldsList {
id
name
}
}
}
}
}
`;
// Step 2: Find a fieldMetadataId of "Attachment file" field in Attachments object with GraphQL API
const response = await fetch(metadataGraphqlEndpoint, {
method: 'POST',
headers: {
Authorization: `Bearer ${authToken}`
},
body: {
query: fieldMetadataIdQuery,
}
});
const result = await response.json();
const uploadFileFieldMetadataId = result.data.objects.edges.find(object => object.node.nameSingular === 'attachment').node.fieldsList.find(field => field.name === 'file').id;
// Step 3: Upload the file via GraphQL multipart upload
const uploadMutation = `
mutation UploadFilesFieldFile($file: Upload!, $fieldMetadataId: String!) {
uploadFilesFieldFile(file: $file, fieldMetadataId: $fieldMetadataId) {
id
}
}
`;
const uploadForm = new FormData();
uploadForm.append('operations', JSON.stringify({
query: uploadMutation,
variables: { file: null, fieldMetadataId: uploadFileFieldMetadataId },
}));
uploadForm.append('map', JSON.stringify({ '0': ['variables.file'] }));
uploadForm.append('0', pdfFile);
const uploadResponse = await fetch(metadataGraphqlEndpoint, {
method: 'POST',
headers: { Authorization: `Bearer ${authToken}` },
body: uploadForm,
});
const uploadResult = await uploadResponse.json();
if (uploadResult.errors?.length) {
throw new Error(`Upload failed: ${uploadResult.errors[0].message}`);
}
const fileId = uploadResult.data?.uploadFilesFieldFile?.id;
if (!fileId) {
throw new Error('No file id returned from upload');
}
// Step 4: Create the attachment linked to the company
const attachmentMutation = `
mutation CreateOneAttachment($data: AttachmentCreateInput!) {
createAttachment(data: $data) {
id
name
}
}
`;
const attachmentResponse = await fetch(dataGraphqlEndpoint, {
method: 'POST',
headers: {
Authorization: `Bearer ${authToken}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
query: attachmentMutation,
variables: {
data: {
name: filename,
targetCompanyId: companyId,
file: [
{
fileId: fileId,
label: filename
}
]
},
},
}),
});
const attachmentResult = await attachmentResponse.json();
if (attachmentResult.errors?.length) {
throw new Error(`Attachment creation failed: ${attachmentResult.errors[0].message}`);
}
return attachmentResult.data?.createAttachment;
};
```
### Krok 3: Přizpůsobte pro svůj případ použití
#### Chcete-li připojit k jinému objektu
Nahraďte `targetCompanyId` příslušným polem:
| Objekt | Název pole |
| -------------- | -------------------------- |
| Společnost | `targetCompanyId` |
| Osoba | `targetPersonId` |
| Příležitost | `targetOpportunityId` |
| Vlastní objekt | `targetYourCustomObjectId` |
Aktualizujte jak parametr funkce, tak objekt `variables.data` v mutaci přílohy.
#### Chcete-li použít dynamickou adresu URL PDF
Pokud používáte službu pro generování PDF, můžete:
1. Nejprve proveďte akci HTTP Request pro vygenerování PDF
2. Předejte vrácenou adresu URL PDF logické funkci jako parametr
```typescript
export const main = async (
params: { companyId: string; pdfUrl: string; filename: string },
) => {
const { companyId, pdfUrl, filename } = params;
// ... rest of the function
};
```
### Krok 4: Otestujte a aktivujte
1. Uložte pracovní postup
2. Přejděte na záznam společnosti
3. Klikněte na nabídku **⋮** a vyberte svůj pracovní postup
4. Zkontrolujte v části **Přílohy** u záznamu, že bylo PDF připojeno
5. Aktivujte pracovní postup
## Kombinace se službami pro generování PDF
Pro vytváření dynamických nabídek nebo faktur:
### Příklad: Vygenerovat nabídku → Připojit PDF
| Krok | Akce | Účel |
| ---- | --------------------------- | ------------------------------------------------------ |
| 1 | Ruční spouštěč (Společnost) | Uživatel spustí na záznamu |
| 2 | Vyhledat záznam | Získat podrobnosti o příležitosti nebo řádkové položce |
| 3 | HTTP požadavek | Zavolat API pro generování PDF s daty záznamu |
| 4 | Logická funkce | Stáhnout a připojit vygenerované PDF |
### Oblíbené služby pro generování PDF
* **Carbone** - Generování dokumentů založené na šablonách
* **PDFMonkey** - Dynamické vytváření PDF ze šablon
* **DocuSeal** - Platforma pro automatizaci dokumentů
* **Documint** - Generování dokumentů primárně přes API
Každá služba poskytuje API, které vrátí PDF adresu URL, kterou můžete předat funkci Logika.
## Řešení potíží
| Problém | Řešení |
| -------------------------------- | --------------------------------------------------------------- |
| "Nepodařilo se stáhnout PDF" | Zkontrolujte, že adresa URL PDF je dostupná a vrací platné PDF |
| "Nepodařilo se nahrát" | Ověřte, že váš klíč API je platný a má oprávnění k zápisu |
| "Vytvoření přílohy se nezdařilo" | Ujistěte se, že název pole ID objektu odpovídá cílovému objektu |
## Související
* [Spouštěče pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-triggers)
* [Logické funkce](/l/cs/user-guide/workflows/capabilities/workflow-actions#code)
* [Vygenerujte nabídku nebo fakturu z Twenty](/l/cs/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty)

View File

@@ -0,0 +1,144 @@
---
title: Vytvořte nabídku nebo fakturu z Twenty
description: Automaticky vytvářejte faktury v externích nástrojích, když se obchodní případy uzavřou.
---
Automaticky odesílejte data o obchodních případech do vašeho fakturačního systému (Stripe, QuickBooks, Xero atd.). když je příležitost vyhrána.
## Struktura pracovního postupu
1. **Spouštěč**: Záznam je aktualizován (Příležitost)
2. **Filtr**: Stav = Uzavřeno – vyhráno
3. **Vyhledat záznam**: Získat podrobnosti o společnosti
4. **Kód** (volitelné): Formátovat payload
5. **Požadavek HTTP**: Odeslat do fakturačního systému
## Krok 1: Nastavení spouštěče
1. Vytvořte nový pracovní postup
2. Vyberte spouštěč **Záznam je aktualizován**
3. Vyberte jako objekt **Příležitost**
## Krok 2: Filtrování na Uzavřeno – vyhráno
Přidejte akci **Filtr**, aby se pokračovalo pouze tehdy, když je obchodní případ vyhraný:
| Nastavení | Hodnota |
| ------------ | -------------------------------------- |
| **Pole** | Fáze |
| **Podmínka** | Rovná se |
| **Hodnota** | `CLOSED_WON` (nebo název vašeho stavu) |
<Tip>
Spouštěč se vyvolá při jakékoli aktualizaci Příležitosti. Filtr zajistí, že pracovní postup bude pokračovat pouze tehdy, když se stav změní na Uzavřeno – vyhráno.
</Tip>
## Krok 3: Získat podrobnosti o společnosti
Záznam Příležitosti nemusí obsahovat všechna pole Společnosti, která potřebujete pro fakturu. Přidejte akci **Vyhledat záznam**:
| Nastavení | Hodnota |
| --------------- | ------------------------------------------ |
| **Objekt** | Společnost |
| **Shoda podle** | ID se rovná `{{trigger.object.companyId}}` |
Tímto získáte úplný záznam Společnosti s fakturační adresou, daňovým ID atd.
## Krok 4: Formátování payloadu (volitelné)
Pokud váš fakturační systém očekává specifický formát, přidejte akci **Kód**:
```javascript
export const main = async (params: {
opportunity: any;
company: any;
}): Promise<object> => {
const { opportunity, company } = params;
return {
invoice: {
// Customer info from Company
customer_name: company.name,
customer_email: company.email || "",
billing_address: {
line1: company.address?.street || "",
city: company.address?.city || "",
postal_code: company.address?.postalCode || "",
country: company.address?.country || ""
},
tax_id: company.taxId || null,
// Invoice details from Opportunity
amount: opportunity.amount,
currency: opportunity.currency || "USD",
description: `Invoice for ${opportunity.name}`,
due_days: 30,
// Reference back to Twenty
metadata: {
opportunity_id: opportunity.id,
company_id: company.id
}
}
};
};
```
## Krok 5: Odeslání do fakturačního systému
Přidejte akci **Požadavek HTTP**:
| Nastavení | Hodnota |
| ----------- | -------------------------------------------- |
| **Metoda** | POST |
| **URL** | Koncový bod API vašeho fakturačního systému |
| **Záhlaví** | `Authorization: Bearer YOUR_API_KEY` |
| **Tělo** | `{{code.invoice}}` nebo namapujte pole přímo |
### Příklad: Faktura ve Stripe
```
POST https://api.stripe.com/v1/invoices
Headers:
Authorization: Bearer sk_live_xxx
Content-Type: application/x-www-form-urlencoded
Body:
customer: {{company.stripeCustomerId}}
collection_method: send_invoice
days_until_due: 30
```
### Příklad: Faktura v QuickBooks
```
POST https://quickbooks.api.intuit.com/v3/company/{realmId}/invoice
Headers:
Authorization: Bearer YOUR_ACCESS_TOKEN
Content-Type: application/json
Body: {{code.invoice}}
```
## Shrnutí kompletního pracovního postupu
| Krok | Akce | Účel |
| ---- | ----------------------------- | ------------------------------------------------------ |
| 1 | Spouštěč: Záznam aktualizován | Spustí se při jakékoli změně Příležitosti |
| 2 | Filtr | Pokračujte pouze pokud Stav = Uzavřeno – vyhráno |
| 3 | Vyhledat záznam | Získejte úplné podrobnosti o Společnosti pro fakturaci |
| 4 | Kód | Naformátujte data pro fakturační API |
| 5 | HTTP požadavek | Vytvořte fakturu v externím systému |
## Tipy
* **Ukládejte externí ID**: Uložte ID faktury vrácené API zpět do Příležitosti pomocí akce **Aktualizovat záznam**
* **Zpracování chyb**: Přidejte větev pro odeslání upozornění, pokud požadavek HTTP selže
* **Nejprve testujte**: Použijte sandbox/test režim vašeho fakturačního systému před ostrým spuštěním
## Související
* [Vygenerovat PDF z Twenty](/l/cs/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty) — připojte vygenerované soubory PDF k záznamům
* [Spouštěče pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-triggers)
* [Akce pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-actions)
* [Automatizace pro Uzavřeno – vyhráno](/l/cs/user-guide/workflows/how-tos/crm-automations/closed-won-automations)

View File

@@ -0,0 +1,170 @@
---
title: Nastavení spouštěče webhooku
description: Přijímejte data z externích služeb pro spouštění pracovních postupů.
---
Spouštěče webhooků umožňují externím službám spustit vaše pracovní postupy zasláním dat na jedinečnou adresu URL. Použijte je k propojení formulářů, aplikací třetích stran a vlastních integrací.
## Kdy použít webhooky
| Případ použití | Příklad |
| -------------------------- | -------------------------------------------- |
| **Webové formuláře** | Odeslání kontaktního formuláře vytváří leady |
| **Aplikace třetích stran** | Platba ve Stripe → vytvořit záznam zákazníka |
| **Vlastní integrace** | Vaše aplikace → automatizace v Twenty |
| **Nástroje bez kódu** | Připojení Zapier, Make, n8n |
## Nastavení krok za krokem
### Krok 1: Vytvořte pracovní postup
1. Přejděte na **Nastavení → Pracovní postupy**
2. Klikněte na **+ Nový pracovní postup**
3. Pojmenujte jej (např. "Odeslání webového formuláře")
### Krok 2: Nakonfigurujte spouštěč webhooku
1. Klikněte na blok spouštěče
2. Vyberte **Webhook**
3. Obdržíte jedinečnou adresu URL webhooku, například:
```
https://api.twenty.com/webhooks/workflow/abc123...
```
4. Zkopírujte tuto adresu URL — budete ji potřebovat pro svou externí službu
### Krok 3: Definujte očekávanou datovou strukturu
Pro požadavky **POST** definujte očekávanou strukturu těla:
1. Klikněte na **Definovat očekávané tělo**
2. Zadejte ukázkový JSON, který odpovídá tomu, co vaše služba pošle:
```json
{
"firstName": "John",
"lastName": "Doe",
"email": "john@example.com",
"company": "Acme Inc",
"message": "Interested in your product"
}
```
3. Klikněte na **Uložit** — tím se vytvoří proměnné, které můžete použít v dalších krocích
### Krok 4: Přidejte akce
Nyní přidejte akce, které využívají data z webhooku:
**Příklad: Vytvořit záznam osoby**
1. Přidejte akci **Vytvořit záznam**
2. Vyberte objekt **People**
3. Namapujte pole:
| Pole | Hodnota |
| ---------- | -------------------------------------------------------------- |
| Jméno | `{{trigger.body.firstName}}` |
| Příjmení | `{{trigger.body.lastName}}` |
| Email | `{{trigger.body.email}}` |
| Společnost | Vyhledejte nebo vytvořte na základě `{{trigger.body.company}}` |
### Krok 5: Otestujte webhook
Před aktivací otestujte svůj webhook:
**Pomocí cURL**:
```bash
curl -X POST https://api.twenty.com/webhooks/workflow/abc123... \
-H "Content-Type: application/json" \
-d '{"firstName":"Test","lastName":"User","email":"test@example.com"}'
```
**Pomocí Postmanu nebo podobného nástroje**:
1. Vytvořte požadavek POST na adresu URL vašeho webhooku
2. Nastavte hlavičku Content-Type na `application/json`
3. Přidejte své testovací tělo JSON
4. Odešlete a zkontrolujte spuštění pracovního postupu
### Krok 6: Aktivujte
Po otestování klikněte na **Aktivovat**, aby byl pracovní postup aktivní.
## Zpracování různých datových struktur
### Vnořená data
Pokud váš webhook posílá vnořená data:
```json
{
"contact": {
"name": "John Doe",
"email": "john@example.com"
},
"source": "website"
}
```
Odkazujte pomocí: `{{trigger.body.contact.email}}`
### Pole
Pokud data obsahují pole:
```json
{
"items": [
{"name": "Product A", "qty": 2},
{"name": "Product B", "qty": 1}
]
}
```
Jak pole zpracujete, závisí na vašem případě použití:
**Neznámý počet položek → Použijte Iterator**
Pokud potřebujete zpracovat každou položku v poli (např. pro každou vytvořit záznam), přidejte akci **Code** pro rozparsování pole a poté použijte **Iterator**:
```javascript
export const main = async (params: { items: any }) => {
const items = typeof params.items === "string"
? JSON.parse(params.items)
: params.items;
return { items };
};
```
Poté použijte Iterator k procházení: `{{code.items}}`
**Známá/konkrétní pole → Extrahujte do pojmenovaných polí**
Pokud pole obsahuje konkrétní položky, ke kterým chcete přistupovat jednotlivě (např. odpovědi formuláře, kde pozice 0 je vždy "křestní jméno", pozice 1 je vždy "příjmení"), přidejte akci **Code** k jejich extrakci:
```javascript
export const main = async (params: { items: any }) => {
const items = typeof params.items === "string"
? JSON.parse(params.items)
: params.items;
return {
product: {
name: items[0]?.name || "",
qty: items[0]?.qty || 0
}
};
};
```
Nyní můžete v následujících krocích vybírat `product.name` a `product.qty` jednotlivě.
<Tip>
Další podrobnosti o práci s poli viz [Zpracování polí v akcích Code](/l/cs/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions).
</Tip>
## Související
* [Spouštěče pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-triggers)
* [Akce pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-actions)

View File

@@ -0,0 +1,121 @@
---
title: Automatická odpověď na příchozí e-maily
description: Vytvořte pracovní postup, který pomocí AI třídí příchozí e-maily a automaticky odesílá odpovědi ve vláknu.
---
Odpovídejte na příchozí e-maily během několika sekund — ne hodin. Tento pracovní postup používá AI agenta k odfiltrování šumu (newslettery, spam, automatické odpovědi) a k vypracování individualizované odpovědi na skutečné zprávy. Pak ji AI zašle jako odpověď v závitu v původní konverzaci.
## Jak funguje vláknování e-mailů
Každý e-mail obsahuje skrytou hlavičku `Message-ID` — jedinečný identifikátor přiřazený poštovním serverem odesílatele. Když odpovíte na e-mail, váš poštovní klient nastaví hlavičku `In-Reply-To`, která odkazuje na tento otisk. Takto Gmail, Outlook a další klienti seskupují zprávy do vláken.
V Twenty je tento otisk uložen jako `headerMessageId` na objektu Message. Váš pracovní postup jej vezme a předá do pole In-Reply-To akce Odeslat e-mail.
## Sestavení pracovního postupu
### Krok 1: Vytvořte nový pracovní postup
Přejděte do **Nastavení -> Pracovní postupy** a klikněte na **+ Nový pracovní postup**.
### Krok 2: Spouštění při příchozích zprávách
Vyberte **Když je vytvořen záznam** a zvolte **Zprávy**.
Pokaždé, když do Twenty dorazí e-mail, toto se spustí.
<img src="/images/user-guide/workflows/auto-reply/workflow-overview.png" style={{width:'100%'}} />
### Krok 3: Vyhledejte, kdo to poslal
Přidejte akci **Vyhledat záznamy**.
Adresa odesílatele není přímo v samotné zprávě — je v souvisejícím záznamu Message Participant.
| Pole | Hodnota |
| ---------- | ------------------------------ |
| **Objekt** | Účastníci zprávy |
| **Filtr** | Zpráva **je** `{{trigger.id}}` |
| **Filtr** | Role **je** From |
| **Limit** | 1 |
To vám poskytne e-mail odesílatele v `handle` a jeho jméno v `displayName`.
<img src="/images/user-guide/workflows/auto-reply/find-sender.png" style={{width:'100%'}} />
### Krok 4: Triage a návrh odpovědi s UI
Přidejte akci **AI Agent**. Tento jediný krok dělá dvě věci: rozhodne, zda si e-mail zaslouží odpověď, a pokud ano, napíše ji.
Použijte prompt například takto:
```
You are an email triage assistant for a sales team. Read the following
inbound email and decide if it deserves a reply.
Subject: {{trigger.subject}}
Body: {{trigger.text}}
From: {{Find Sender.first.displayName}} ({{Find Sender.first.handle}})
If this email is spam, a newsletter, an automated notification, or
otherwise does not need a human reply, respond with exactly: SKIP
Otherwise, write a short, professional reply (3-4 sentences max) that:
- Acknowledges their specific message
- Lets them know someone from the team will follow up shortly
- Is warm but not overly casual
Respond with only the reply text, no subject line or greeting prefix.
```
AI Agent vypíše svou odpověď do pole `response`, na které mohou navazující kroky odkazovat.
<img src="/images/user-guide/workflows/auto-reply/ai-triage.png" style={{width:'100%'}} />
### Krok 5: Rozvětvěte podle rozhodnutí AI
Přidejte akci **If/Else** k ověření, zda se AI rozhodla odpovědět, nebo přeskočit.
| Pole | Hodnota |
| ------------ | ----------------------------------------- |
| **Podmínka** | AI Agent `response` **neobsahuje** `SKIP` |
| **If true** | Pokračovat na Odeslat e-mail |
| **Else** | Nedělat nic (pracovní postup končí) |
Spam, newslettery a automaticky generované zprávy se zahodí. Vše ostatní přejde do dalšího kroku.
<img src="/images/user-guide/workflows/auto-reply/should-reply.png" style={{width:'100%'}} />
### Krok 6: Odeslat odpověď ve vlákně
Přidejte akci **Odeslat e-mail** ve větvi "if true". Klikněte na **Pokročilé možnosti** a poté na **Přidat In-Reply-To**.
| Pole | Hodnota |
| --------------- | -------------------------------------- |
| **Komu** | `{{Find Sender.first.handle}}` |
| **Předmět** | `Re: {{trigger.subject}}` |
| **Text zprávy** | `{{AI Triage & Draft Reply.response}}` |
| **In-Reply-To** | `{{trigger.headerMessageId}}` |
Pole In-Reply-To je to, co z toho dělá odpověď místo nové konverzace. Příjemce ji uvidí zařazenou pod původní e-mail ve službě Gmail, v Outlooku nebo v jiném klientovi.
<img src="/images/user-guide/workflows/auto-reply/send-email.png" style={{width:'100%'}} />
<Tip>
**In-Reply-To** očekává ze spouštěče `message.headerMessageId` — jde o jedinečný otisk e-mailu, nikoli adresu příjemce. Pokud jej necháte prázdné, e-mail se i tak odešle, jen jako samostatná zpráva.
</Tip>
<Warning>
Gmail používá předmět k seskupování zpráv do vláken. Předmět **musí** začínat `Re:` (včetně dvojtečky a mezery), aby Gmail zobrazil odpověď v rámci původního vlákna. Bez toho se odpověď zobrazí jako samostatná konverzace — i když je hlavička In-Reply-To nastavena správně.
</Warning>
### Krok 7: Otestujte a aktivujte
Klikněte na **Test**, poté zkontrolujte svého e-mailového klienta. Odpověď by se měla zobrazit vnořená pod původní zprávou.
Aktivujte, až s tím budete spokojeni.
## Nápady k rozšíření
* **Odpovídat pouze VIP** — přidejte větev, která zkontroluje doménu odesílatele nebo zda existuje jako Kontakt v Twenty
* **Směrovat podle záměru** — použijte samostatné prompty pro AI Agenta k odlišnému zpracování obchodních dotazů oproti požadavkům na podporu
* **Obohaťte před odpovědí** — přidejte krok Vyhledat záznamy, který do promptu AI načte společnost odesílatele nebo historii obchodů pro osobnější odpovědi

View File

@@ -0,0 +1,179 @@
---
title: Automatizace pro Uzavřeno - Vyhráno
description: Automatizujte činnosti po výhře, když se příležitosti uzavřou.
---
Když se obchod uzavře, je potřeba provést několik věcí: aktualizovat stav společnosti, upozornit členy týmu, vytvořit onboardingové úkoly. Automatizujte to vše jediným pracovním postupem.
## Problém
Když se příležitost přesune do stavu "Uzavřeno - Vyhráno":
* Typ společnosti je třeba změnit z "Zájemce" na "Zákazník"
* Je třeba vytvořit onboardingové úkoly
* Je třeba upozornit tým Customer Success
* Obchodní zástupce potřebuje potvrzení
Dělat to ručně je časově náročné a náchylné k chybám.
## Řešení
Vytvořte pracovní postup, který automaticky zajistí všechny činnosti po výhře.
## Kompletní nastavení pracovního postupu
### Krok 1: Vytvořte pracovní postup
1. Přejděte na **Nastavení → Pracovní postupy**
2. Klikněte na **+ Nový pracovní postup**
3. Pojmenujte jej "Vyhraný obchod - Automatizace po výhře"
### Krok 2: Nakonfigurujte spouštěč
1. Vyberte **Záznam je aktualizován**
2. Vyberte **Příležitosti**
3. V části "Pole ke sledování" vyberte **Stádium**
### Krok 3: Přidejte filtr podle stádia
1. Přidejte akci **Filtr**
2. Podmínka: `{{trigger.object.stage}}` se rovná "Uzavřeno - Vyhráno"
### Krok 4: Aktualizujte typ společnosti
1. Přidejte akci **Aktualizovat záznam**
2. Nakonfigurujte:
| Pole | Hodnota |
| ------------------------- | ------------------------------- |
| **Objekt** | Společnosti |
| **Záznam** | `{{trigger.object.company.id}}` |
| **Typ** | Zákazník |
| **Datum prvního obchodu** | `{{trigger.object.closedAt}}` |
| **Vlastník účtu** | `{{trigger.object.owner.id}}` |
### Krok 5: Vytvořte onboardingový úkol
1. Přidejte akci **Vytvořit záznam**
2. Nakonfigurujte:
| Pole | Hodnota |
| --------------------------- | ------------------------------------------------------------------------------------------------------------- |
| **Objekt** | Úkoly |
| **Název** | `Onboarding: {{trigger.object.name}}` |
| **Přiřazený** | Člen týmu Customer Success |
| **Datum splatnosti** | Za 3 dny |
| **Priorita** | Vysoká |
| **Související společnost** | `{{trigger.object.company.id}}` |
| **Související příležitost** | `{{trigger.object.id}}` |
| **Popis** | `Onboarding nového zákazníka pro {{trigger.object.company.name}}. Hodnota obchodu: {{trigger.object.amount}}` |
### Krok 6: Upozorněte Customer Success
1. Přidejte akci **Odeslat e-mail**
2. Nakonfigurujte:
| Pole | Hodnota |
| --------------- | --------------------------------------------------- |
| **Komu** | customer-success@yourcompany.com |
| **Předmět** | `🎉 Nový zákazník: {{trigger.object.company.name}}` |
| **Text zprávy** | Viz příklad níže |
**Příklad textu e-mailu**:
```
Hi CS Team,
We have a new customer!
Company: {{trigger.object.company.name}}
Deal: {{trigger.object.name}}
Value: {{trigger.object.amount}}
Sales Rep: {{trigger.object.owner.name}}
Close Date: {{trigger.object.closedAt}}
An onboarding task has been created automatically.
Let's give them a great start!
```
### Krok 7: Potvrďte obchodnímu zástupci
1. Přidejte další akci **Odeslat e-mail**
2. Nakonfigurujte:
| Pole | Hodnota |
| --------------- | --------------------------------------------------------------------------------------------------- |
| **Komu** | `{{trigger.object.owner.email}}` |
| **Předmět** | `✅ Obchod uzavřen: {{trigger.object.name}}` |
| **Text zprávy** | Gratulujeme! Váš obchod byl zpracován. Tým Customer Success byl upozorněn a onboarding byl zahájen. |
### Krok 8: Otestujte a aktivujte
1. Otestujte přesunutím testovací příležitosti do stavu "Uzavřeno - Vyhráno"
2. Ověřit:
* Typ společnosti změněn na "Zákazník"
* Onboardingový úkol vytvořen
* Tým Customer Success obdržel e-mail
* Obchodní zástupce obdržel potvrzení
3. Až budete připraveni, aktivujte
## Zpracování Uzavřeno - Prohráno
Vytvořte podobný pracovní postup pro prohrané obchody:
### Spouštěč
* Záznam je aktualizován (Příležitosti, Stádium = "Uzavřeno - Prohráno")
### Akce
1. **Vytvořit záznam**: Úkol pro "Analýzu prohraného obchodu"
2. **Aktualizovat záznam**: Přidat důvod prohry do záznamu společnosti
3. **Odeslat e-mail**: Upozornit manažera na prohraný obchod
## Pokročilé: Vícefázový onboarding
Pro složitější onboarding vytvořte více úkolů:
```javascript
export const main = async (params) => {
const tasks = [
{ title: "Welcome call", daysFromNow: 1, assignee: "CS" },
{ title: "Send onboarding materials", daysFromNow: 2, assignee: "CS" },
{ title: "Technical setup", daysFromNow: 5, assignee: "Support" },
{ title: "30-day check-in", daysFromNow: 30, assignee: "CS" }
];
return { tasks };
};
```
Použijte **Iterator** k vytvoření každého úkolu z pole.
## Nápady na přizpůsobení
### Udržujte své další nástroje aktuální
* Vytvořte zákazníka ve fakturačním systému pomocí **HTTP Request**
### Podmíněná opatření
Použijte akce **Filtr** k:
* Odlišný onboarding pro enterprise vs SMB
* Různé přiřazené osoby podle regionu
* Přeskočit upozornění u malých obchodů
### Zahrnout detaily Deal
Použijte akci **Code** k formátování:
* Dokumenty se souhrnem obchodu
* Poznámky k předání pro tým Customer Success
* Vlastní onboardingové kontrolní seznamy
## Související
* [Akce pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-actions)
* [Odesílání e-mailů z pracovních postupů](/l/cs/user-guide/workflows/capabilities/send-emails-from-workflows)

View File

@@ -0,0 +1,136 @@
---
title: Odhalte zastaralé příležitosti
description: Automaticky upozorňujte manažery, když příležitosti nebyly aktualizovány.
---
Udržujte svou obchodní pipeline zdravou tím, že budete upozorňovat manažery, když příležitosti zastarávají. Tento pracovní postup kontroluje příležitosti, které nebyly aktualizovány po zadaný počet dní.
## Problém
Příležitosti bez aktualizací vedou k:
* Obchody chladnou
* Nespolehlivé prognózy
* Ztracené tržby
## Řešení
Vytvořte plánovaný pracovní postup, který najde zastaralé příležitosti a odešle e-mail jejich manažerům.
## Nastavení krok za krokem
### Krok 1: Vytvořte pracovní postup
1. Přejděte na **Nastavení → Pracovní postupy**
2. Klikněte na **+ Nový pracovní postup**
3. Pojmenujte jej "Upozornění na zastaralé příležitosti"
### Krok 2: Nakonfigurujte spouštěč
1. Vyberte **Podle plánu**
2. Nastavte spouštění denně (např. každý den v 8:00)
### Krok 3: Vyhledejte zastaralé příležitosti
1. Přidejte akci **Vyhledat záznamy**
2. Nakonfigurujte:
| Pole | Hodnota |
| ---------- | --------------------------------------------- |
| **Objekt** | Příležitosti |
| **Filtr** | Datum aktualizace je dříve než (dnes - 7 dní) |
| **Filtr** | Fáze není "Closed Won" a není "Closed Lost" |
| **Limit** | 100 |
### Krok 4: Zkontrolujte, zda se něco našlo
1. Přidejte akci **Filtr**
2. Podmínka: `{{searchRecords.length}}` je větší než 0
3. Pokud nejsou žádné zastaralé příležitosti, pracovní postup se zde zastaví
### Krok 5: Naformátujte upozornění (akce Code)
Přidejte akci **Code** pro formátování e-mailu:
```javascript
export const main = async (params) => {
const opportunities = params.opportunities;
// Group opportunities by owner
const byOwner = {};
opportunities.forEach(opp => {
const ownerEmail = opp.owner?.email || 'unassigned';
if (!byOwner[ownerEmail]) {
byOwner[ownerEmail] = [];
}
byOwner[ownerEmail].push({
name: opp.name,
amount: opp.amount,
lastUpdated: opp.updatedAt,
stage: opp.stage
});
});
// Format summary for manager
let summary = "Stale Opportunities Report\n\n";
Object.entries(byOwner).forEach(([owner, opps]) => {
summary += `${owner}: ${opps.length} stale opportunities\n`;
opps.forEach(opp => {
summary += ` - ${opp.name} (${opp.stage})\n`;
});
summary += "\n";
});
return {
summary,
totalCount: opportunities.length
};
};
```
### Krok 6: Odešlete upozornění e-mailem
Přidejte akci **Odeslat e-mail**:
| Pole | Hodnota |
| --------------- | -------------------------------------------------------------------- |
| **Komu** | sales-manager@yourcompany.com |
| **Předmět** | `🚨 {{code.totalCount}} zastaralých příležitostí vyžaduje pozornost` |
| **Text zprávy** | `{{code.summary}}` |
### Krok 7: Otestujte a aktivujte
1. Klikněte na **Test** a spusťte pracovní postup
2. Zkontrolujte, že e-mail obsahuje správné údaje
3. Až budete připraveni, aktivujte
## Možnosti přizpůsobení
### Změňte hranici zastarání
Upravte filtr akce Vyhledat záznamy a změňte ze 7 dnů na vámi preferované období:
* 3 dny pro rychlé prodeje
* 14 dní pro podnikové obchody
* 30 dní pro dlouhé prodejní cykly
### Upozorněte jednotlivé obchodní zástupce
Místo jednoho e-mailu manažerovi použijte **Iterator** k odeslání personalizovaných e-mailů každému zástupci o jeho vlastních zastaralých obchodech.
### Přidejte eskalaci
Vytvořte více pracovních postupů se zvyšující se závažností:
1. Den 7: E-mail zástupci
2. Den 14: E-mail zástupci + manažerovi
3. Den 21: Vytvořte úkol pro manažera k zásahu
### Zahrňte do Slacku
Použijte **HTTP Request** k odeslání na webhook ve Slacku místo e-mailu nebo navíc k e-mailu.
## Související
* [Akce pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-actions)
* [Odesílání e-mailů z pracovních postupů](/l/cs/user-guide/workflows/capabilities/send-emails-from-workflows)

View File

@@ -0,0 +1,69 @@
---
title: Zobrazení počtu přijatých e-mailů
description: Vytvořte pracovní postup, který automaticky spočítá a zobrazí počet e-mailů přijatých od každého kontaktu.
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
<img src="/images/user-guide/workflows/workflow-number-of-emails-received.png" style={{width:'100%'}} />
## Přehled
Tento pracovní postup se spustí pokaždé, když je přijat nový e-mail, a aktualizuje vlastní pole u záznamu osoby celkovým počtem e-mailů od tohoto odesílatele.
## Předpoklady
Než tento pracovní postup nastavíte, vytvořte v objektu **Lidé** vlastní pole:
1. Přejděte do **Nastavení → Datový model → Lidé**
2. Přidejte nové pole **Number**
3. Pojmenujte ho například "Počet e-mailů přijatých od této osoby"
## Nastavení krok za krokem
<VimeoEmbed videoId="1148700336" title="Ukázka videa" />
### Krok 1: Nakonfigurujte spouštěč
1. Přejděte na **Pracovní postupy** a vytvořte nový pracovní postup
2. Vyberte jako spouštěč **Záznam je vytvořen**
3. Zvolte **Účastníci zpráv** (k dispozici v části Pokročilé objekty)
<Note>
Účastník zprávy je kombinace ID zprávy a ID osoby, čímž vzniká jeden jedinečný záznam na zprávu. To je snazší sledovat než přímo Zprávy, protože můžeme přistupovat k poli `handle`, které obsahuje e-mailovou adresu odesílatele (nebo příjemce).
</Note>
### Krok 2: Filtrování podle role
1. Přidejte akci **Filtr**
2. Nastavte podmínku: **Role** se rovná **FROM**
Tím zajistíte, že budete počítat pouze zprávy odeslané touto osobou, nikoli zprávy jí zaslané.
### Krok 3: Vyhledejte všechny účastníky zpráv se stejnou hodnotou handle
1. Přidejte akci **Vyhledat záznamy**
2. Vyberte jako objekt **Účastníci zpráv**
3. Přidejte filtry: **Handle** se rovná hodnotě handle ze spouštěče (e-mailová adresa odesílatele) a **Role** se rovná **FROM**
4. Zvyšte **Limit** z 1 na **200** (maximum)
Tímto najdete všechny zprávy z této e-mailové adresy a získáte celkový počet.
<Note>
Akce Vyhledat záznamy je omezena na vrácení maximálně 200 záznamů. Protože však používáte pouze hodnotu `totalCount` (nikoli jednotlivé záznamy), tento krok vrátí celkový počet e-mailů odeslaných touto osobou.
</Note>
### Krok 4: Aktualizujte záznam osoby pomocí akce Vytvořit nebo aktualizovat záznam
1. Přidejte akci **Vytvořit nebo aktualizovat záznam**
2. Vyberte jako objekt **Lidé**
3. Najděte osobu podle shody jejího e-mailu s hodnotou `handle` z účastníka zprávy
4. Nastavte své vlastní pole "Počet přijatých e-mailů" na hodnotu `{{searchRecords.totalCount}}`
Hodnota `totalCount` z akce Vyhledat záznamy představuje celkový počet e-mailů přijatých od této osoby.
## Související
* [Akce pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-actions)
* [Vytvořit vlastní pole](/l/cs/user-guide/data-model/how-tos/customize-your-data-model)
* [Akce Vyhledat záznamy](/l/cs/user-guide/workflows/capabilities/workflow-actions#search-records)

View File

@@ -0,0 +1,170 @@
---
title: Zobrazení dat souvisejících záznamů
description: Zobrazujte data ze souvisejících záznamů (např. informace o společnosti na příležitostech) pomocí pracovních postupů.
---
Zobrazujte data ze souvisejících záznamů přímo na svých záznamech — například zobrazte počet zaměstnanců ze společnosti na jejích příležitostech. Toto řešení pomocí pracovních postupů je užitečné do doby, než budou vnořená pole nativně dostupná.
## Běžné scénáře použití
| Zdroj | Cíl | Pole ke kopírování |
| ----------- | ----------- | ------------------------------------------------------------- |
| Společnost | Příležitost | Odvětví, velikost společnosti, ARR |
| Osoba | Příležitost | E-mail, telefon, pozice |
| Příležitost | Společnost | Částka posledního obchodu, datum posledního vyhraného obchodu |
## Základní kopírování polí
### Příklad: Zkopírovat e-mail kontaktu do příležitosti
**Cíl**: Při nastavení kontaktní osoby u příležitosti zkopírujte její e-mail do příležitosti pro snadný přístup.
### Předpoklad
Vytvořte cílová pole v **Nastavení → Datový model → Příležitosti** před vytvořením pracovního postupu:
* E-mail kontaktu (typ: E-mail)
* Telefon kontaktu (typ: Telefon)
### Nastavení
1. **Spouštěč**: Záznam je aktualizován (Příležitosti, pole Kontaktní osoba)
2. **Filtr**: Zkontrolujte, že pole Kontaktní osoba není prázdné
3. **Vyhledat záznamy**: Najděte propojenou osobu
* Objekt: Lidé
* Filtr: ID se rovná `{{trigger.object.pointOfContact.id}}`
4. **Aktualizovat záznam**:
* Objekt: Příležitosti
* Záznam: `{{trigger.object.id}}`
* E-mail kontaktu: `{{searchRecords[0].email}}`
* Telefon kontaktu: `{{searchRecords[0].phone}}`
## Kopírování více polí
### Příklad: Synchronizace informací o společnosti do všech souvisejících příležitostí
**Cíl**: Když se změní údaje společnosti, aktualizujte všechny související příležitosti.
### Nastavení
1. **Spouštěč**: Záznam je aktualizován (Společnosti)
* Pole: Odvětví, velikost společnosti, roční tržby
2. **Vyhledat záznamy**: Najděte všechny příležitosti pro tuto společnost
* Objekt: Příležitosti
* Filtr: ID společnosti se rovná `{{trigger.object.id}}`
3. **Iterátor**: Procházejte každou příležitost
4. **Aktualizovat záznam** (uvnitř iterátoru):
* Objekt: Příležitosti
* Záznam: `{{iterator.currentItem.id}}`
* Odvětví společnosti: `{{trigger.object.industry}}`
* Velikost společnosti: `{{trigger.object.companySize}}`
* ARR společnosti: `{{trigger.object.annualRevenue}}`
## Kopírování při vytvoření záznamu
### Příklad: Předvyplnit příležitost údaji společnosti
**Cíl**: Při vytváření příležitosti propojené se společností automaticky zkopírujte klíčové informace o společnosti.
### Předpoklad
Vytvořte cílová pole v **Nastavení → Datový model → Příležitosti**:
* Odvětví společnosti (typ: Text)
* Velikost společnosti (typ: Číslo)
### Nastavení
1. **Spouštěč**: Záznam je vytvořen (Příležitosti)
* Filtr: Společnost není prázdná
2. **Vyhledat záznamy**: Získejte podrobnosti propojené společnosti
* Objekt: Společnosti
* Filtr: ID se rovná `{{trigger.object.company.id}}`
3. **Aktualizovat záznam**:
* Objekt: Příležitosti
* Záznam: `{{trigger.object.id}}`
* Odvětví společnosti: `{{searchRecords[0].industry}}`
* Velikost společnosti: `{{searchRecords[0].employees}}`
<Note>
**Omezení pro Úkoly a Poznámky**: Relace u Úkolů a Poznámek jsou napevno nastaveny jako mnoho k mnoha a zatím nejsou k dispozici ve spouštěčích ani akcích pracovních postupů. Pro přístup k těmto relacím použijte místo toho [API](/l/cs/developers/extend/api).
</Note>
## Oboustranná synchronizace
### Příklad: Udržujte primární kontakt v synchronizaci
**Cíl**: Když se změní primární kontakt společnosti, aktualizujte kontakt. Když se osoba stane primárním kontaktem, aktualizujte společnost.
### Pracovní postup 1: Společnost → Osoba
1. **Spouštěč**: Záznam je aktualizován (Společnosti, pole Primární kontakt)
2. **Aktualizovat záznam**: Nastavte u osoby "Is Primary Contact" na hodnotu true
3. **Vyhledat záznamy**: Najděte předchozí primární kontakt
4. **Aktualizovat záznam**: Nastavte u předchozího kontaktu "Is Primary Contact" na hodnotu false
### Pracovní postup 2: Osoba → Společnost
1. **Spouštěč**: Záznam je aktualizován (Lidé, Is Primary Contact = true)
2. **Aktualizovat záznam**: Nastavte u společnosti Primární kontakt na tuto osobu
<Note>
Dávejte pozor u oboustranných synchronizací, abyste se vyhnuli nekonečným smyčkám. Před aktualizací použijte filtry ke kontrole, zda se hodnota skutečně změnila.
</Note>
## Použití kódu pro složité mapování
### Příklad: Transformace dat během kopírování
**Cíl**: Zkopírovat a naformátovat telefonní číslo z osoby do příležitosti.
```javascript
export const main = async (params) => {
const { phone } = params;
if (!phone) return { formattedPhone: null };
// Remove non-numeric characters
const digits = phone.replace(/\D/g, '');
// Format as (XXX) XXX-XXXX
const formatted = digits.length === 10
? `(${digits.slice(0,3)}) ${digits.slice(3,6)}-${digits.slice(6)}`
: phone;
return { formattedPhone: formatted };
};
```
## Osvědčené postupy
### Vyhněte se smyčkám
* Nevytvářejte pracovní postupy, které se navzájem spouštějí donekonečna
* Používejte konkrétní podmínky polí
* Přidejte kontroly, zda se hodnota skutečně změnila
### Zpracování chybějících dat
* Před kopírováním vždy zkontrolujte, zda zdrojový záznam existuje
* Poskytněte výchozí hodnoty pro volitelná pole
* Použijte filtry k vynechání, pokud je zdrojové pole prázdné
### Výkon
* Pro mnoho záznamů používejte dávkové aktualizace při kopírování
* Pro hromadné synchronizační operace použijte plánované pracovní postupy
* Zvažte použití iterátoru pro aktualizace více záznamů
## Související
* [Akce pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-actions)
* [Spouštěče pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-triggers)

View File

@@ -0,0 +1,202 @@
---
title: Vzorcová pole
description: Vytvářejte vzorcová pole pomocí pracovních postupů, dokud nebude k dispozici nativní podpora.
---
Dvacet ještě nepodporuje pole s rodilými vzorci (přicházející v roce 2026), ale můžete dosáhnout stejného výsledku pomocí pracovních postupů. Toto dočasné řešení vám umožní automaticky počítat a vyplňovat hodnoty polí — od jednoduchých zřetězení až po složitou obchodní logiku.
## Běžné scénáře použití
| Případ použití | Příklad vzorce |
| ------------------------ | ------------------------------ |
| **Celé jméno** | Křestní jméno + " " + Příjmení |
| **Očekávaná částka** | Částka × Pravděpodobnost |
| **Počet dní do termínu** | Termín splnění - Dnes |
| **Počet dní ve fázi** | Dnes - Datum vstupu do fáze |
| **Skóre leadu** | Body podle více kritérií |
<Tip>
Kompletní příklad sledování času ve fázích kanálu najdete v článku [Jak dlouho zůstávají příležitosti v jednotlivých fázích](/l/cs/user-guide/views-pipelines/how-tos/track-time-in-stage).
</Tip>
## Základní vzorec: Zřetězení
### Příklad: Automatické vyplnění celého jména
**Cíl**: Automaticky spojit křestní jméno a příjmení do pole pro celé jméno.
### Nastavení
1. **Spouštěč**: Záznam je aktualizován nebo vytvořen (Lidé)
2. **Filtr**: Ověřte, že se změnilo křestní jméno nebo příjmení
3. **Akce kódu**:
```javascript
export const main = async (params) => {
const { firstName, lastName } = params;
const fullName = [firstName, lastName]
.filter(Boolean)
.join(' ');
return { fullName };
};
```
4. **Aktualizovat záznam**: Nastavte Celé jméno na `{{code.fullName}}`
## Číselný vzorec: Očekávaná částka
### Příklad: Výpočet očekávaných tržeb
**Cíl**: Vynásobit částku příležitosti pravděpodobností a získat očekávanou částku.
Viz [Jak zobrazit očekávanou částku v kanálu](/l/cs/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline) pro kompletní pracovní postup.
### Nastavení
1. **Spouštěč**: Záznam je aktualizován (Příležitosti, pole Částka NEBO Pravděpodobnost)
2. **Akce kódu**:
```javascript
export const main = async (params) => {
const { amount, probability } = params;
const expectedAmount = (amount || 0) * (probability || 0) / 100;
return { expectedAmount };
};
```
3. **Aktualizovat záznam**: Nastavte Očekávanou částku na `{{code.expectedAmount}}`
## Datumový vzorec: Výpočet počtu dní
### Příklad: Počet dní do termínu úkolu
**Cíl**: Spočítat, kolik dní zbývá do termínu úkolu.
### Nastavení
1. **Spouštěč**: Záznam je aktualizován nebo vytvořen (Úkoly, pole Termín)
2. **Akce kódu**:
```javascript
export const main = async (params) => {
const { dueDate } = params;
if (!dueDate) {
return { daysUntilDue: null };
}
const due = new Date(dueDate);
const today = new Date();
const diffTime = due - today;
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
return { daysUntilDue: diffDays };
};
```
3. **Aktualizovat záznam**: Nastavte Počet dní do termínu na `{{code.daysUntilDue}}`
<Note>
Záporné hodnoty označují úkoly po termínu. Toto pole můžete použít k filtrování nebo řazení úkolů podle naléhavosti.
</Note>
## Podmíněný vzorec: Skóre leadu
### Příklad: Výpočet skóre leadu na základě kritérií
**Cíl**: Ohodnotit leady podle velikosti společnosti, odvětví a zapojení.
### Nastavení
1. **Spouštěč**: Záznam je aktualizován (Lidé nebo Společnosti)
2. **Akce kódu**:
```javascript
export const main = async (params) => {
const { companySize, industry, hasEmail, hasPhone, source } = params;
let score = 0;
// Company size scoring
if (companySize === 'Enterprise') score += 30;
else if (companySize === 'Mid-Market') score += 20;
else if (companySize === 'SMB') score += 10;
// Industry scoring
const targetIndustries = ['Technology', 'Finance', 'Healthcare'];
if (targetIndustries.includes(industry)) score += 25;
// Contact info scoring
if (hasEmail) score += 10;
if (hasPhone) score += 15;
// Source scoring
if (source === 'Referral') score += 20;
else if (source === 'Website') score += 10;
return { leadScore: score };
};
```
3. **Aktualizovat záznam**: Nastavte Skóre leadu na `{{code.leadScore}}`
## Textový vzorec: Extrakce domény
### Příklad: Získání domény z e-mailu
**Cíl**: Automaticky získat a uložit doménu e-mailu.
### Nastavení
1. **Spouštěč**: Záznam je aktualizován (Lidé, pole E-mail)
2. **Akce kódu**:
```javascript
export const main = async (params) => {
const { email } = params;
if (!email) return { domain: null };
const domain = email.split('@')[1]?.toLowerCase();
return { domain };
};
```
3. **Aktualizovat záznam**: Nastavte pole Doména na `{{code.domain}}`
## Osvědčené postupy
### Výkon
* Spouštějte pouze při relevantních změnách polí
* Pomocí filtrů přeskočte záznamy, které nevyžadují výpočet
* Vyhněte se složitým výpočtům v pracovních postupech s vysokým objemem
### Zpracování chyb
* Před výpočty kontrolujte hodnoty null/undefined
* Používejte výchozí hodnoty, když data chybí
* Vracejte jasné chybové zprávy, když výpočty selžou
### Testování
* Testujte okrajové případy (prázdná pole, nulové hodnoty)
* Před aktivací ručně ověřte výpočty
* Sledujte běhy pracovních postupů kvůli neočekávaným výsledkům
## Související
* [Jak zobrazit očekávanou částku v kanálu](/l/cs/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline)
* [Jak sledovat čas ve fázi](/l/cs/user-guide/views-pipelines/how-tos/track-time-in-stage)
* [Akce pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-actions)

View File

@@ -0,0 +1,127 @@
---
title: Upozorněte kolegy na poznámku ke kontrole
description: Odesílejte automatická e-mailová upozornění při přiřazení kolegy ke kontrole poznámky.
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
<Note>
**Přímé označování členů týmu v poznámkách zatím není podporováno.** Tato funkce je plánována na druhou polovinu roku 2026. Mezitím tento pracovní postup poskytuje praktické náhradní řešení.
</Note>
## Problém
Chcete v poznámce označit kolegu, aby obdržel upozornění na její kontrolu. V současnosti Twenty nepodporuje @zmínky v poznámkách ani úkolech.
## Náhradní řešení
Místo označování v textu poznámky můžete:
1. Vytvořte relační pole **Reviewer** u objektu Poznámky
2. Při vytváření nebo úpravě poznámky přiřaďte recenzenta
3. Mít pracovní postup automaticky poslat recenzentovi e-mail s odkazem na poznámku
<Warning>
**Omezení**: Tento přístup umožňuje přiřadit na jedno pole pouze jednoho recenzenta. Pokud potřebujete upozornit více osob, vytvořte další relační pole (např. Reviewer 1, Reviewer 2). Toto nebude dobře škálovat, pokud potřebujete najednou označit mnoho spolupracovníků.
</Warning>
## Nastavení krok za krokem
### Krok 1: Vytvořte pole Reviewer
<img src="/images/user-guide/workflows/reviewer-field-for-note.png" style={{width:'100%'}} />
1. Přejděte do **Nastavení → Datový model → Poznámky**
2. Klikněte na **Add Field**
3. Nakonfigurujte:
| Nastavení | Hodnota |
| ---------------------- | ----------------------------------------------- |
| **Name** | Reviewer |
| **Typ** | Vztah |
| **Související objekt** | Člen pracovního prostoru |
| **Typ vztahu** | Mnoho poznámek → Jeden člen pracovního prostoru |
4. Uložte pole
### Krok 2: Vytvořte pracovní postup
<VimeoEmbed videoId="1151897168" title="Ukázka videa" />
#### Vytvořte spouštěč pracovního postupu
1. Přejděte do hlavního zobrazení a vytvořte nový pracovní postup
2. Vyberte jako spouštěč **Record Updated**
3. Jako objekt vyberte **Note** a určete pole Reviewer.
4. Spouštěč se aktivuje kdykoli je u poznámky aktualizován recenzent.
#### Přidejte filtr, který ověří, že byl recenzent právě přiřazen
Přidejte akci **Filtr**, aby pracovní postup pokračoval pouze tehdy, když je přiřazen recenzent:
| Podmínka | Hodnota |
| ------------ | ------------ |
| **Reviewer** | není prázdné |
#### Vyhledejte člena pracovního prostoru
1. Přidejte akci **Vyhledat záznamy**
2. Vyberte **Člen pracovního prostoru** (v části pokročilé objekty)
3. Přidejte filtr:
| Podmínka | Hodnota |
| -------- | ------------------------------ |
| **ID** | se rovná `{{note.reviewerId}}` |
Tím získáte celý záznam člena pracovního prostoru včetně jeho e-mailové adresy a jména.
#### Odešlete upozorňovací e-mail
1. Přidejte akci **Odeslat e-mail**
2. Nakonfigurujte:
| Pole | Hodnota |
| --------------- | --------------------------------------------------- |
| **Komu** | Search Record → First Workspace Member → User Email |
| **Předmět** | Poznámka vyžaduje vaši kontrolu |
| **Text zprávy** | Viz příklad níže |
**Příklad textu e-mailu:**
```text
Hi {{searchRecord.firstWorkspaceMember.name.firstName}},
You've been assigned to review a note.
View the note here:
https://yourSubDomain.twenty.com/object/note/{{recordIsUpdated.id}}
Best,
Twenty
```
<Note>
Nahraďte `yourSubDomain` skutečnou subdoménou vašeho pracovního prostoru Twenty.
</Note>
#### Otestujte a aktivujte
1. Klikněte na **Test** a spusťte pracovní postup ručně
2. Vytvořte nebo upravte poznámku a přiřaďte recenzenta
3. Zkontrolujte doručenou poštu recenzenta, zda dorazil upozorňovací e-mail
4. Aktivujte pracovní postup
## Použití
Po nastavení může váš tým tento pracovní postup používat takto:
1. Vytvořením nové poznámky (nebo úpravou existující)
2. Výběrem kolegy v poli **Reviewer**
3. Kolega automaticky obdrží e-mail s přímým odkazem na poznámku
## Související
* [Spouštěče pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-triggers)
* [Odesílání e-mailů z pracovních postupů](/l/cs/user-guide/workflows/capabilities/send-emails-from-workflows)
* [Vytvořit vlastní pole](/l/cs/user-guide/data-model/how-tos/create-custom-fields)
* [Vytvořit relační pole](/l/cs/user-guide/data-model/how-tos/create-relation-fields)

View File

@@ -0,0 +1,106 @@
---
title: Odesílejte e-mailová upozornění na úkoly s blížícím se termínem
description: Automaticky upozorňujte členy týmu na jejich blížící se nebo zpožděné úkoly.
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
<img src="/images/user-guide/workflows/email_tasks_due.png" style={{width:'100%'}} />
Posílejte každému členovi týmu denní e-mailová připomenutí na úkoly, které mají termín dnes.
## Přehled
Tento pracovní postup běží podle plánu a:
1. Načte všechny členy pracovního prostoru
2. Projde každého člena
3. Najde jejich úkoly, které mají termín dnes
4. Naformátuje a odešle personalizovaný e-mail
## Nastavení krok za krokem
<VimeoEmbed videoId="1147463514" title="Ukázka videa" />
### Krok 1: Nakonfigurujte spouštěč
1. Přejděte do **Nastavení → Pracovní postupy** a vytvořte nový pracovní postup
2. Vyberte **Podle plánu** jako spouštěč
3. Použijte výraz cron pro denní spuštění v 8:00: `0 8 * * *`
### Krok 2: Vyhledejte všechny členy pracovního prostoru
1. Přidejte akci **Vyhledat záznamy**
2. Vyberte **Členové pracovního prostoru** (v části pokročilé objekty)
3. Filtry nejsou potřeba — toto vrátí všechny členy
### Krok 3: Přidejte iterátor
1. Přidejte akci **Iterator**
2. Nastavte vstupní pole na členy pracovního prostoru z předchozího kroku
3. Všechny akce uvnitř iterátoru se spustí jednou pro každého člena
### Krok 4: Vyhledejte úkoly s termínem dnes (uvnitř iterátoru)
1. Uvnitř iterátoru přidejte akci **Vyhledat záznamy**
2. Vyberte jako objekt **Úkoly**
3. Přidejte filtry:
* **Přiřazený** = aktuální člen pracovního prostoru (z iterátoru)
* **Termín splnění** = dnes
### Krok 5: Naformátujte úkoly do těla e-mailu (uvnitř iterátoru)
Přidejte akci **Code** pro naformátování úkolů do čitelného seznamu s odkazy:
```javascript
export const main = async (params: {
tasksDue?: Array<{ id: string; title: string }> | null | string;
}) => {
const tasksDue =
typeof params.tasksDue === "string"
? JSON.parse(params.tasksDue)
: params.tasksDue;
if (!Array.isArray(tasksDue) || tasksDue.length === 0) {
return {
formattedTasks: "No tasks due today."
};
}
const formattedTasks = tasksDue
.map(
t =>
`${t.title}\nhttps://yourSubDomain.twenty.com/object/task/${t.id}`
)
.join("\n\n");
return { formattedTasks };
};
```
<Note>
Nahraďte `yourSubDomain` skutečnou subdoménou vašeho pracovního prostoru Twenty.
</Note>
### Krok 6: Odešlete e-mail (uvnitř iterátoru)
1. Přidejte akci **Odeslat e-mail** (stále uvnitř iterátoru)
2. Nakonfigurujte:
| Pole | Hodnota |
| --------------- | ----------------------------------------------------------------------- |
| **Komu** | `{{iterator.currentItem.userEmail}}` (e-mail člena pracovního prostoru) |
| **Předmět** | Vaše úkoly s termínem dnes |
| **Text zprávy** | `{{code.formattedTasks}}` |
### Krok 7: Otestujte a aktivujte
1. Klikněte na **Test** a spusťte pracovní postup ručně
2. Zkontrolujte doručenou poštu, zda e-maily dorazily
3. Aktivujte pracovní postup
## Související
* [Akce pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-actions)
* [Odesílání e-mailů z pracovních postupů](/l/cs/user-guide/workflows/capabilities/send-emails-from-workflows)
* [Práce s poli v akcích Code](/l/cs/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions)

View File

@@ -0,0 +1,21 @@
---
title: Profesionální služby
description: Získejte profesionální pomoc s vytvářením složitých pracovních toků a automatizací od týmu Twenty a certifikovaných partnerů.
---
## Kdy potřebujete profesionální pomoc?
Zvažte profesionální služby pro:
* Složitá více-systémová integrace
* Pokročilá obchodní logika a pravidla automatizace
* Velkoplošné pracovní postupy pro zpracování dat
* Vývoj vlastních API
* Školení týmu a optimalizace pracovního toku
* Když nemáte interní zdroje
## Možnosti služeb
### Implementační partneři
Spolupracujte s certifikovanými partnery na pokročilých úpravách. Kontaktujte nás na [contact@twenty.com](mailto:contact@twenty.com), abyste se spojili s našimi [implementačními partnery](https://twenty.com/partners).

View File

@@ -0,0 +1,170 @@
---
title: Řešení problémů s workflow
description: Běžné problémy s pracovními postupy a jak je vyřešit.
---
## Běžné problémy a řešení
### Workflow se nespouští
**Příznaky**: Váš pracovní postup se nespustí, když to očekáváte.
**Možné příčiny**:
1. **Pracovní postup není aktivován**: Ujistěte se, že je pracovní postup nastaven na "Active", ne na "Draft"
2. **Podmínky spouštěče nesplněny**: Ověřte, že spouštěč odpovídá očekávané události
3. **Pole není sledováno**: U spouštěčů "Record is Updated" se ujistěte, že je dané pole sledováno
4. **Oprávnění**: Zkontrolujte, že máte oprávnění spouštět pracovní postupy
**Řešení**:
* Ověřte stav pracovního postupu v seznamu pracovních postupů
* Otestujte to konkrétní akcí, u které očekáváte, že jej spustí
* Zkontrolujte konfiguraci spouštěče
* Kontaktujte svého administrátora ohledně oprávnění
### Spouštění pracovního postupu příliš brzy (prázdná pole)
**Příznaky**: Při ručním vytváření záznamu v UI se váš pracovní postup spustí dříve, než máte čas vyplnit všechna pole. Pracovní postup běží převážně s prázdnými hodnotami polí.
**Proč k tomu dochází**: Twenty ukládá vše v reálném čase — neexistuje oddělený režim "edit" vs "read". Když vytvoříte záznam, ihned se uloží, což vyvolá událost "Record is created" dříve, než stihnete vyplnit další pole.
**Kdy se "Record is created" hodí**:
* Záznamy vytvořené přes volání API (pole jsou vyplněna v jednom požadavku)
* Záznamy vytvořené pomocí importu
* Automatické vytváření záznamů z jiných pracovních postupů
**Řešení**: Pro záznamy vytvořené ručně v UI použijte jako spouštěč místo toho **"Record is created or updated"**. Tímto způsobem:
* Pracovní postup se spustí poté, co uživatel dokončí vyplňování polí a jejich uložení
* Získáte kompletní data namísto prázdných hodnot
<Tip>
Pokud chcete, aby se pracovní postup spustil jen jednou na záznam, přidejte akci Filter, která zkontroluje pole jako `createdAt equals updatedAt` (první uložení), nebo použijte vlastní zaškrtávací pole ke sledování, zda už pracovní postup běžel.
</Tip>
### Selhávající akce
**Příznaky**: Pracovní postup běží, ale některé akce selhávají.
**Možné příčiny**:
1. **Chybějící data**: Povinná pole jsou prázdná
2. **Neplatné odkazy**: Proměnné z předchozích kroků neexistují
3. **Chyby API**: Externí služby vracejí chyby
4. **Problémy s oprávněními**: Akce vyžaduje oprávnění, která nemáte
**Řešení**:
* Zkontrolujte podrobnosti běhu pracovního postupu kvůli chybovým zprávám
* Ověřte, že všechna povinná pole mají hodnoty
* Otestujte připojení k API samostatně
* Projděte oprávnění rolí
### Chyby požadavků HTTP
**Příznaky**: Akce HTTP Request selhávají nebo vracejí neočekávané výsledky.
**Běžné chybové kódy**:
* **400**: Neplatný požadavek - zkontrolujte formát těla požadavku
* **401**: Neautorizováno - ověřte klíč API
* **403**: Zakázáno - zkontrolujte oprávnění API
* **404**: Nenalezeno - ověřte URL endpointu
* **429**: Příliš mnoho požadavků - zaveďte omezení četnosti požadavků
* **500**: Chyba serveru - problém v externí službě
**Řešení**:
* Ověřte URL endpointu API
* Zkontrolujte autentizační hlavičky
* Nejprve otestujte volání API mimo Twenty
* Přidejte zpracování chyb v akcích Code
### Chyby akcí Code
**Příznaky**: Kód JavaScriptu se nedaří spustit.
**Běžné problémy**:
1. **Syntaktické chyby**: Překlepy nebo neplatný JavaScript
2. **Nedefinované proměnné**: Odkazování na proměnné, které neexistují
3. **Chyby typů**: Operace na nesprávných datových typech
4. **Vypršení časového limitu**: Kód se spouští příliš dlouho
**Řešení**:
* Použijte vestavěnou validaci editoru kódu
* Nejprve otestujte logiku kódu v konzoli JavaScriptu
* Přidejte výpisy console.log pro ladění
* Zjednodušte složité operace
### E-mail se neodesílá
**Příznaky**: Akce Send Email nedoručuje e-maily.
**Možné příčiny**:
1. **Není připojen e-mailový účet**: Zkontrolujte Nastavení → Účty
2. **Neplatná e-mailová adresa**: E-mail příjemce má neplatný formát
3. **Limity odesílání**: Byly dosaženy limity poskytovatele e-mailu
4. **Spamové filtry**: E-maily jsou blokovány
**Řešení**:
* Ověřte připojení e-mailového účtu
* Ověřte e-mailové adresy příjemců
* Zkontrolujte limity poskytovatele e-mailu
* Zkontrolujte obsah e-mailu kvůli spouštěčům spamu
## Ladění pracovních postupů
### Používání běhů pracovního postupu
1. Přejděte do editoru pracovního postupu
2. Otevřete panel **Runs**
3. Najděte neúspěšný běh
4. Klikněte pro zobrazení podrobných informací krok za krokem
5. Projděte chybové zprávy a výstupní data
### Testování jednotlivých kroků
1. U akcí Code použijte tlačítko **Test**
2. U požadavků HTTP otestujte endpoint samostatně
3. Vytvářejte testovací záznamy pro spuštění pracovních postupů
4. Pro řízené testování použijte manuální spouštěče
### Běžné vzory ladění
**Přidejte logování**:
Použijte akce Code k zaznamenávání mezilehlých hodnot pro ladění.
**Izolujte kroky**:
Testujte každý krok samostatně, abyste identifikovali selhání.
**Zkontrolujte tok dat**:
Ověřte, že každý krok dostává očekávaná vstupní data.
## Osvědčené postupy k předcházení problémům
### Před aktivací
* Důkladně testujte v režimu konceptu
* Ověřte všechna připojení k API
* Pečlivě zkontrolujte podmínky spouštěče
* Zdokumentujte očekávané chování
### Během vývoje
* Používejte výstižné názvy kroků
* Přidejte komentáře v akcích Code
* Testujte s realistickými daty
* Plánujte i okrajové případy
### Po aktivaci
* Pečlivě sledujte počáteční běhy
* Nastavte upozornění na selhání
* Pravidelně procházejte historii běhů
* Udržujte pracovní postupy co nejjednodušší

View File

@@ -0,0 +1,236 @@
---
title: Často kladené otázky k pracovním postupům.
description: Často kladené otázky k pracovním postupům v Twenty.
---
<AccordionGroup>
<Accordion title="Proč nemohu aktivovat pracovní postup?">
Pravděpodobně jde o problém s oprávněními. K vytváření a aktivaci potřebujete přístup k pracovním postupům.
**Řešení**: Kontaktujte správce pracovního prostoru, aby vám v **Settings → Members → Roles** udělil přístup k pracovním postupům.
Pokud v postranním panelu vůbec nevidíte sekci Pracovní postupy, potvrzuje to, že jde o problém s oprávněními.
</Accordion>
<Accordion title="Proč nevidím tlačítko ručního pracovního postupu v horní navigační liště?">
Ruční pracovní postupy se v navigační liště zobrazují jen při správné konfiguraci:
1. Pracovní postup musí být **aktivní** (ne v režimu konceptu)
2. Umístění v navigační liště musí být nastaveno na **Pinned**
3. Pro spouštěče Single/Bulk musíte být na správné stránce objektu
**Jak ověřit**: Otevřete pracovní postup → klikněte na spouštěč → ověřte, že "Navbar placement" je nastaveno na "Pinned".
K ručním pracovním postupům se vždy dostanete přes **Cmd + K** (nebo **Ctrl + K**) bez ohledu na nastavení navigační lišty.
</Accordion>
<Accordion title="Jaký je rozdíl mezi ručními spouštěči Single, Global a Bulk?">
| Typ | Požadované záznamy | Běhy průběhu práce |
| --- | ------------------ | ------------------ |
\| **Global** | Žádné | Jednou, bez vstupu záznamu |
\| **Single** | Jeden nebo více vybraných | Jednou na každý vybraný záznam |
\| **Bulk** | Jeden nebo více vybraných | Jednou, se všemi záznamy jako pole |
* **Global**: Použijte, když pracovní postup nepotřebuje kontext žádného záznamu (např. vygenerování reportu)
* **Single**: Použijte, když chcete zpracovat každý vybraný záznam samostatně (např. poslat jednotlivé e-maily)
* **Bulk**: Použijte, když potřebujete zpracovávat záznamy společně nebo optimalizovat využití kreditů (vyžaduje akci Iterator)
Podrobnosti viz [Spouštěče pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-triggers).
</Accordion>
<Accordion title="Nevidím uzel If/Else. Co mám dělat?">
Explicitní uzel If/Else zatím není dostupný, ale je na naší roadmapě.
**Aktuální řešení**: Vytvořte z kroku více větví, každou začněte akcí **Filter**:
```
Step 1
│
├── Branch A: Filter (condition = true) → Actions...
│
└── Branch B: Filter (condition = false) → Actions...
```
Pouze větev, ve které podmínka filtru projde, provede své následné akce.
Viz [Jak používat větve](/l/cs/user-guide/workflows/capabilities/workflow-branches) pro podrobný návod.
</Accordion>
<Accordion title="Běží větve pracovního postupu paralelně?">
**Ano**, větve ve výchozím nastavení běží paralelně.
Pokud chcete spustit pouze jednu větev:
* Na začátek každé větve přidejte akci **Filter**
* Nastavte opačné podmínky (např. Větev A: status = "Open", Větev B: status ≠ "Open")
Větve, které nesplní podmínku filtru, se zastaví, ostatní pokračují.
</Accordion>
<Accordion title="Mohu větve znovu sloučit dohromady?">
**Ano**. Po dokončení paralelních větví můžete přidat krok, na který se obě větve napojí.
V editoru pracovního postupu:
1. Dokončete akce ve větvích
2. Přidejte nový krok za větve
3. Přetáhněte spojení z konce každé větve do tohoto nového kroku
Sloučený krok se provede po dokončení všech připojených větví.
</Accordion>
<Accordion title="Jaký je limit výsledků akce Search Records?">
**Search Records vrací maximálně 200 záznamů.**
Pokud potřebujete zpracovat více:
* Přidejte konkrétnější filtry pro zmenšení výsledků
* Použijte plánované pracovní postupy ke zpracování po dávkách
* Zvažte použití API pro hromadné operace
Pro většinu pracovních postupů je 200 záznamů dostačující. Pokud na tento limit narážíte pravidelně, zvažte přepracování své automatizace.
</Accordion>
<Accordion title="Mohu přidávat adresáty do kopie (CC) v e-mailech z pracovních postupů?">
**Zatím ne.** Pole CC a BCC pro akci Send Email jsou na naší roadmapě.
**Aktuální řešení**: Přidejte více akcí Send Email pro odeslání dalším příjemcům nebo použijte HTTP Request k odeslání přes externí e-mailovou službu, která podporuje CC.
</Accordion>
<Accordion title="Jak použiji výstupy z předchozích kroků?">
Každá akce vytváří výstupní data, která lze použít v následujících krocích.
**Jak odkazovat na data z předchozích kroků**:
* Při konfiguraci pole použijte výběr proměnné
* Nebo napište přímo `{{stepName.fieldName}}`
**Příklady**:
* Data spouštěče: `{{trigger.object.email}}`
* Výsledky hledání: `{{searchRecords[0].name}}`
* Výstup kódu: `{{code.calculatedValue}}`
Najetím myší na libovolné pole v konfiguraci akce uvidíte dostupné proměnné z předchozích kroků.
</Accordion>
<Accordion title="Proč můj Iterator selhává?">
**Iterator vyžaduje vstup typu pole (array).** Časté problémy:
1. **Vstup není pole (array)**: Ujistěte se, že předáváte výsledky z akce Search Records nebo jiné akce, která vrací pole
2. **Pole je prázdné**: Před Iterator přidejte filtr pro kontrolu `{{searchRecords.length}} > 0`
3. **Zvolená špatná proměnná**: Ujistěte se, že vybíráte samotné pole, ne jeden záznam
**Správné nastavení**:
1. Search Records (vrací pole)
2. Filtr: length > 0
3. Iterator: vyberte `{{searchRecords}}`
4. Akce uvnitř iteratoru používají `{{iterator.currentItem.fieldName}}`
</Accordion>
<Accordion title="Jaký je maximální čas spuštění pro akce Code?">
Akce Code (logické funkce) mají **výchozí časový limit 5 minut** (300 sekund).
Maximální nastavitelný časový limit je **15 minut** (900 sekund).
Pokud váš kód tento limit překročí, akce selže s chybou vypršení časového limitu.
**Tipy, jak se vyhnout vypršení časových limitů**:
* Rozdělte velké operace na menší části pomocí Iteratoru
* Vyhněte se náročným výpočtům; pro intenzivní zpracování použijte externí služby přes HTTP Request
* Optimalizujte svůj kód pro zkrácení doby běhu
* Pokud potřebujete delší zpracování, zvažte použití plánovaných pracovních postupů, které zpracovávají data po dávkách
</Accordion>
<Accordion title="Jak číst spuštění pracovních postupů?">
Spuštění pracovních postupů zobrazují historii provádění a pomáhají s laděním problémů.
**Přístup ke spuštěním**:
* V editoru pracovního postupu → panel **Runs** vpravo
* Nebo přejděte v postranním panelu do **Workflow Runs**
**Porozumění spuštění**:
* **Stav**: Running, Completed, Failed, Waiting
* **Kroky**: Zobrazte, které kroky se provedly, a jejich výstup
* **Chyby**: Klikněte na neúspěšné kroky a zobrazíte chybové zprávy
* **Data**: Zobrazte vstupní/výstupní data v jednotlivých krocích
Podrobnosti viz [Spuštění pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-runs).
</Accordion>
<Accordion title="Proč nevidím svá spuštění pracovních postupů?">
Spuštění pracovních postupů mohou selhávat okamžitě kvůli limitům rychlosti. Twenty uplatňuje pevný limit 5 000 spuštění za hodinu na pracovní prostor.
Pokud tento limit překročíte, pracovní postupy jsou okamžitě označeny jako neúspěšné a v seznamu spuštění se nezobrazí.
**Běžné scénáře, které tento limit překročí**:
* Výběr více než 5 000 záznamů pomocí ručního spouštěče Single
* Současné spuštění více pracovních postupů napříč vaším pracovním prostorem
* Časté automatické spouštěče (např. Record Updated na vytíženém objektu)
**Řešení**:
* Použijte spouštěče **Bulk** místo Single pro zpracování mnoha záznamů v jednom spuštění
* Rozložte velké dávkové operace v čase
* Používejte filtry ke snížení frekvence spouštění
* Náročné pracovní postupy plánujte mimo špičku
</Accordion>
<Accordion title="Jaké jsou limity rychlosti pro pracovní postupy?">
Twenty má dva limity rychlosti pro zajištění stability systému:
| Limit | Hodnota | Chování |
| ----- | ------- | ------- |
\| **Soft limit** | 100 spuštění/minuta | Spuštění se zařadí do fronty se stavem "Not Started" a jsou zpracovávána postupně |
\| **Hard limit** | 5 000 spuštění/hodina | Spuštění okamžitě selžou |
**Soft limit (100/min)**: Vaše pracovní postupy neselžou—pouze čekají ve frontě a jsou postupně zpracovávány. Můžete spustit více než 100 záznamů; provádění bude pomalejší.
**Hard limit (5 000/hod)**: Týká se celého vašeho pracovního prostoru. Pokud všechny vaše pracovní postupy dohromady překročí 5 000 spuštění za hodinu, další spuštění okamžitě selžou.
**Tipy, jak zůstat v rámci limitů**:
* Pro velké dávky použijte spouštěče Bulk s Iterator místo spouštěčů Single
* Kombinujte související automatizace do menšího počtu pracovních postupů
* Používejte plánované pracovní postupy k rozložení zátěže v čase
</Accordion>
<Accordion title="Mohu znovu spustit neúspěšné spuštění pracovního postupu?">
**Ne, v tuto chvíli není k dispozici automatická funkce opakování.**
Pokud spuštění pracovního postupu selže, je potřeba:
1. Zkontrolujte chybu v **Settings → Workflows → [Your Workflow] → Runs**
2. Opravte problém (data, konfigurace nebo externí služba)
3. Ručně znovu spusťte pracovní postup u dotčených záznamů
**Tipy, jak snížit počet selhání**:
* Přidejte uzly **Filter** pro ověření dat před akcemi
* Použijte **Search Records** ke kontrole, zda existují související záznamy
* Před hromadnými operacemi důkladně otestujte s několika záznamy
Funkce automatického opakování je v našem plánu pro budoucí vydání.
</Accordion>
<Accordion title="Mám před importy CSV deaktivovat pracovní postupy?">
**Ano, pokud se vaše pracovní postupy spouštějí vytvořením nebo aktualizací záznamu.**
Při importu dat pomocí CSV může každý vytvořený nebo aktualizovaný záznam spustit pracovní postupy. Velký import (tisíce záznamů) může:
* Dosáhnout limitu 5 000 spuštění/hodinu
* Spotřebovat značné množství kreditů pracovních postupů
* Odeslat neočekávané e-maily nebo oznámení
* Vytvořit duplicitní úkoly nebo záznamy
**Před hromadným importem**:
1. Přejděte na **Nastavení → Pracovní postupy**
2. Identifikujte pracovní postupy spouštěné objektem, který importujete
3. **Deaktivujte** je dočasně
4. Spusťte import CSV
5. **Znovu aktivujte** pracovní postupy po dokončení
**Alternativa**: Pokud potřebujete, aby se pracovní postupy spouštěly na importovaných datech, importujte v menších dávkách, abyste zůstali v rámci limitů.
</Accordion>
<Accordion title="Jak vyčistit rozvržení pracovního postupu?">
Pokud vaše plátno pracovního postupu vypadá nepořádně a uzly jsou rozházené, můžete jej automaticky uspořádat:
1. Klikněte pravým tlačítkem kamkoli na plátno pracovního postupu
2. Klikněte na **Tidy up workflow**
Tím se všechny uzly automaticky přeuspořádají do čistého, uspořádaného rozvržení.
</Accordion>
</AccordionGroup>

View File

@@ -0,0 +1,81 @@
---
title: Pracovní postupy
description: Naučte se vytvářet automatizace v Twenty.
---
## Proč na Workflows záleží
Twenty bylo vytvořeno, aby svým uživatelům přineslo maximální flexibilitu. Namísto toho, abyste byli nuceni přizpůsobovat vaše obchodní procesy rigidním, předem připraveným funkcím, vám Workflows umožňují vytvářet automatizace, které vytvářejí CRM, které nejlépe podporuje vaše jedinečné obchodní potřeby.
Workflows jsou funkce v aplikaci Twenty pro vytváření těchto automatizací. Poskytují vám stavební bloky potřebné k vytvoření přesně toho, co váš obchod potřebuje, kdy to potřebuje.
## Co mohu s Workflows dělat?
Doporučujeme vytvářet automatizace pro dva hlavní účely:
1. **Interní automatizace k usnadnění každodenní činnosti vašeho týmu**: Snižte množství manuálních vstupů a opakujících se úkolů, které zpomalují váš tým.
2. **Přenášení dat do a z Twenty**: Připojte Twenty přes API volání a webhooks k vaší databázi a dalším nástrojům.
## Vytvoření prvního pracovního postupu
### Krok 1: Vytvořte nový pracovní postup
1. Přejděte na **Pracovní postupy**, které jsou dostupné pod ostatními objekty
2. Klikněte na **+ New Record**
3. Pojmenujte svůj pracovní postup
### Krok 2: Přidejte spouštěč
Každý pracovní postup začíná spouštěčem. Vyberte z následujících možností:
* **Události záznamů**: Když je záznam vytvořen, aktualizován nebo smazán
* **Plán**: Spouští se v konkrétních časech (denně, týdně apod.)
* **Ruční**: Spouštěno akcí uživatele
* **Webhook**: Spouštěno pomocí webhooku
<img src="/images/user-guide/workflows/workflow_triggers.png" style={{width:'100%'}} />
### Krok 3: Přidejte akce
Po spouštěči přidejte jednu nebo více akcí:
* **Vytvořit záznam**: Přidejte nové záznamy do libovolného objektu
* **Aktualizovat záznam**: Upravte data existujícího záznamu
* **Smazat záznam**: Odstraňte záznamy z objektů
* **Vyhledat záznamy**: Najděte záznamy odpovídající kritériím
* **Vložit nebo aktualizovat záznam**: Vytvořte nebo aktualizujte na základě odpovídajících kritérií
* **Iterátor**: Procházejte pole záznamů
* **Filtr**: Určete, které záznamy postoupí
* **Prodleva**: Počkejte před pokračováním (doba trvání nebo naplánované datum)
* **Odeslat e-mail**: Odesílejte e-maily prostřednictvím svého propojeného účtu
* **Kód**: Spouštějte vlastní JavaScript
* **HTTP požadavek**: Volejte externí API
* **Formulář**: Získejte vstupy od uživatelů v rámci Twenty UI v době spuštění
* **AI Agent** (Již brzy): Spouštějte inteligentní úlohy s AI
<img src="/images/user-guide/workflows/workflow_actions.png" style={{width:'100%'}} />
### Krok 4: Otestujte a aktivujte
1. Pomocí tlačítka **Test** spusťte svůj pracovní postup se vzorovými daty
2. Zkontrolujte výsledky, abyste se ujistili, že vše funguje podle očekávání
3. Až budete připraveni, přepněte pracovní postup na **Active**
## Osvědčené postupy pro pracovní postupy
* **Upravte názvy kroků**: Přejmenujte kroky vašeho workflowu a jasně popište, co každý z nich dělá. To pomáhá s údržbou a usnadňuje předání spolupracovníkům
* **Využijte data z předchozích kroků**: Můžete použít pole záznamů vrácených z jakéhokoli předchozího kroku ve vašem workflowu
* **Začněte jednoduše**: Začněte s jednoduchými workflowy a postupně přidávejte složitost, jakmile se s systémem více seznámíte
* **Naplánujte před stavbou**: Zmapujte si logiku workflowu před tím, než začnete stavět, abyste se vyhnuli zaseknutí v polovině
## Další kroky
* [Spouštěče pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-triggers)
* [Akce pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-actions)
* [Automatizace CRM](/l/cs/user-guide/workflows/how-tos/crm-automations/closed-won-automations)
## Potřebujete pomoc?
<Tip>
Chcete pomoct s automatizací vašich pracovních postupů? [Najděte certifikovaného dvaceti partnerů](https://twenty.com/partners/list?categories=SOLUTIONING\&ref=docs-workflows) pro navrhování a vybudování automatizace end-to-end.
</Tip>