---
title: "Vlastní akční tlačítka"
description: "Vlastní tlačítko v aplikaci, které zavolá vaši službu — nastavení, tvar odesílaných dat, zpracování odpovědi a ověření podpisu."
url: /cs/api-reference/legacy/vlastni-akcni-tlacitka/
---

Vlastní akční tlačítko přidá do aplikace **vaše vlastní tlačítko**, které zavolá
externí službu. Uživatel tak nemusí opouštět mWork365 — klikne u zákazníka na
*Odeslat do ERP* nebo u zakázky na *Vystavit fakturu* a vaše služba dostane
požadavek s tím, o který záznam jde.

Zatímco [webhooky](/cs/api-reference/legacy/webhooky/) se ozvou samy, jakmile něco
nastane, tlačítko spouští **uživatel** — a na rozdíl od webhooku se výsledek
volání hned zobrazí v aplikaci.

## Jak to funguje

<div class="mw-flow">
	<span class="mw-flow__node"><svg viewBox="0 0 24 24"><path d="M5 3l14 8-6 2-2 6z"/></svg>Kliknutí v aplikaci</span>
	<span class="mw-flow__arrow" aria-hidden="true">→</span>
	<span class="mw-flow__node"><svg viewBox="0 0 24 24"><path d="M4 12h13"/><path d="M13 7l5 5-5 5"/><path d="M20 4v16"/></svg>Požadavek na vaši URL</span>
	<span class="mw-flow__arrow" aria-hidden="true">→</span>
	<span class="mw-flow__node"><svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="3"/><path d="M12 2v3M12 19v3M4.2 4.2l2.1 2.1M17.7 17.7l2.1 2.1M2 12h3M19 12h3M4.2 19.8l2.1-2.1M17.7 6.3l2.1-2.1"/></svg>Akce ve vaší službě</span>
	<span class="mw-flow__arrow" aria-hidden="true">→</span>
	<span class="mw-flow__node"><svg viewBox="0 0 24 24"><path d="M21 15a2 2 0 0 1-2 2H8l-4 4V5a2 2 0 0 1 2-2h13a2 2 0 0 1 2 2z"/><path d="M9 10l2 2 4-4"/></svg>Hláška uživateli</span>
</div>

Volání jde **ze serveru mWork365**, ne z prohlížeče uživatele — vaše služba tedy
musí být dostupná z internetu, ale nemusí řešit CORS.

## Jak tlačítko nastavit

Tlačítka přidáte v **Nastavení firmy → Integrace** v sekci *Tlačítka vlastních
akcí* (uživatel musí mít roli administrátor). Klikněte na *Přidat tlačítko*
a vyplňte:

| Pole | Význam |
| --- | --- |
| **Název** | Text na tlačítku. |
| **Popis** | Interní poznámka pro přehled v nastavení. |
| **Metoda** | `GET`, `POST`, `PUT` nebo `DELETE`. Určuje i to, jak se předají data — viz [Co mWork365 odešle](#co-mwork365-odešle). |
| **URL** | Adresa vaší služby. Může obsahovat zástupné značky `{id}` a `{externalId}`. |
| **Entita** | Agenda, ke které tlačítko patří. |
| **Umístění** | *Tabulka* (přehled) nebo *Detail* (konkrétní záznam). |
| **Viditelné pro techniky** / **Viditelné pro dispečery** | Komu se tlačítko zobrazí. Administrátor vidí vždy všechna. |
| **Signature secret** | Klíč pro [podpis odchozích požadavků](/cs/api-reference/legacy/obecne-informace/podpis-pozadavku/). Necháte-li pole prázdné, vygeneruje se automaticky. |
| **Vyžadovat potvrzení po kliknutí** | Před odesláním se uživatele zeptáme „Opravdu chcete provést tuto akci?“. Vhodné u nevratných operací. |
| **Obnovit data po dokončení** | Po úspěšném volání aplikace načte data znovu — použijte, když vaše služba v mWork365 něco změní. |
| **Ikona tlačítka** | Volitelná ikona z nabídky. |

![Formulář přidání vlastního akčního tlačítka s vyplněnými poli.](/images/api-reference/custom-action-buttons.png)

## Kde se tlačítka objeví

U tlačítka určujete **entitu** a **umístění**:

- **Umístění „Tabulka“** — tlačítko je v záhlaví přehledu a pracuje s agendou
  jako celkem (například „Spustit synchronizaci“). Neváže se na konkrétní
  záznam.
- **Umístění „Detail“** — tlačítko je mezi akcemi na detailu záznamu a mWork365
  spolu s ním pošle, o který záznam jde.

Tlačítka lze přidat k těmto entitám: **zákazník**, **zařízení**, **zakázka**,
**výjezd**, **externí požadavek**, **požadavek zákaznického portálu**,
**materiál** a **sklad**. U skladu je k dispozici pouze umístění *Detail*.

Když se na jednu obrazovku hodí víc tlačítek, aplikace je sloučí do rozbalovací
nabídky **Vlastní akce**. Tlačítka fungují ve webové i v mobilní aplikaci.

## Co mWork365 odešle

U tlačítka v **detailu** se odesílají údaje o záznamu:

| Pole | Obsah |
| --- | --- |
| `id` | Identifikátor záznamu v mWork365. |
| `externalId` | [Externí ID](/cs/api-reference/legacy/obecne-informace/id-externalid-a-slug/) záznamu, pokud je vyplněné. |
| `name` | Název záznamu — jen u entit, které název mají (zákazník, zařízení, zakázka, materiál, sklad). |
| `userId` | Identifikátor uživatele, který na tlačítko klikl. |
| `isTest` | `true`, pokud jde o [testovací spuštění](#otestování-tlačítka) z nastavení. |

U tlačítka v **tabulce** se odesílá jen `userId` a `isTest` — tlačítko se neváže
na žádný konkrétní záznam.

**Jak se data předají, závisí na metodě:**

- `POST` a `PUT` — data jdou v těle požadavku jako JSON:

  ```json
  {
    "id": "3f2b8c14-0a7e-4f39-9a1e-2d5b7c9e0f11",
    "externalId": "ERP-1042",
    "name": "Novák s.r.o.",
    "userId": "8c1a54d2-77b0-4c63-9e2f-1a4d6b8e3c05",
    "isTest": false
  }
  ```

- `GET` a `DELETE` — data se připojí jako parametry dotazu:

  ```
  https://vase-sluzba.cz/mwork/export?id=3f2b8c14-…&externalId=ERP-1042&name=Nov%C3%A1k%20s.r.o.&userId=8c1a54d2-…&isTest=false
  ```

Kromě toho můžete identifikátory dostat rovnou do cesty URL — značky `{id}`
a `{externalId}` mWork365 před odesláním nahradí hodnotami záznamu. Z URL

```
https://vase-sluzba.cz/zakaznik/{externalId}/sync
```

se tak stane `https://vase-sluzba.cz/zakaznik/ERP-1042/sync`. Zástupné značky
fungují jen u tlačítek v *detailu*.

## Jak zpracovat odpověď

Aplikace vyhodnotí **HTTP status** odpovědi a dá uživateli vědět:

- **2xx** — akce se povedla. Vrátíte-li JSON s polem `message`, zobrazí se jeho
  text; jinak se ukáže obecná hláška *Akce proběhla úspěšně*.
- **Cokoli jiného** — uživateli se ukáže chybové hlášení se stavovým kódem
  a začátkem odpovědi (prvních 500 znaků). Pole `message` se použije jako titulek
  chyby, takže i chybovou hlášku můžete formulovat sami.

```json
{ "message": "Zákazník byl odeslán do ERP pod číslem 1042." }
```

:::caution
Na rozdíl od [webhooků](/cs/api-reference/legacy/webhooky/#opakované-doručení)
mWork365 čeká na odpověď vaší služby a **volání neopakuje**. Dlouhé operace
proto raději jen nastartujte a odpovězte hned — uživatel jinak čeká na odpověď
u otevřené obrazovky.
:::

## Ověření podpisu

Vaše URL je veřejně dostupná, takže by na ni mohl zavolat kdokoli. Aby vaše
služba poznala, že požadavek opravdu poslal mWork365, je **každé volání
podepsané** — z dat požadavku spočítáme HMAC SHA-256 pomocí *Signature secretu*
daného tlačítka a výsledek pošleme v hlavičce `X-Provider-Signature`.

U tlačítek se podepisuje **něco jiného podle metody**: u `POST` a `PUT` tělo
požadavku, u `GET` a `DELETE` zřetězení metody, URL a časového razítka
z hlavičky `X-Timestamp`. Výpočet i postup ověření popisuje
[Podpis odchozích požadavků](/cs/api-reference/legacy/obecne-informace/podpis-pozadavku/)
— stejný mechanismus platí i pro
[webhooky](/cs/api-reference/legacy/webhooky/).

## Otestování tlačítka

V seznamu tlačítek v nastavení má každý řádek **ikonu přehrání** — tou tlačítko
zkusíte rovnou z nastavení, bez hledání vhodného záznamu v aplikaci. mWork365
u tlačítek v *detailu* vybere náhodný záznam dané entity z vaší firmy a do dat
přidá `isTest: true`, takže vaše služba pozná testovací volání a může u něj akci
přeskočit.

Výsledek se ukáže stejně jako při běžném kliknutí — včetně chybového hlášení
i s odpovědí vaší služby, takže se dá podle něj ladit.
