# API propojení a integrace

# Načtení objednávky z externího API souboru

---

Aplikace KASA FIK nabízí možnost importu již přednastavených objednávek/faktur ze stávajícího informačního systému pomocí stáhnutí JSON dokumentu. Prodejce tak může načíst předpřipravenou objednávku s položkami, číslem účtenky i poznámkami. Používá se v mobilním a sanitárním prodeji, prodeji z eshopu a jiných situacích, kdy dochází jen k dokončení tržby na zařízení a objednávka byla připravena předem.

<p class="callout danger">Funkce bude ukončena na nahrazena Online API pro zasíláni a dotazy na objednávky pomocí API</p>

### Nastavení

1. V Nastavení – Expert nastavení – Importní URL pro objednávky zadejte URL adresu k Vašemu rozhraní na serveru
2. Daná URL adresa musí vrátit platný dokument JSON ve formátu popsaném níže
3. Adresa je například: https://www.mujserver.cz/hledat.php
4. Aplikace připojí parametr „search“ s volbou, kterou zadá uživatel. to znamená že bude voláno např. https://www.mujserver.cz/hledat.php?search=220001

### Používání

1. V aplikaci, v rozhraní KLASIK
2. Vlevo nahoře klepněte na šipku menu
3. Zvolte „Vyhledat položky z objednávky“
4. Zadejte číslo objednávky, které se použije k vyhledání dané objednáky na serveru
5. Pokud se objednávka nelezne, dojde k vyplnění položek

### Popis formátu 

- Pokud je invoice\_number null, aplikace čísluje dle svého číselného plánu. Jinak se použije invoice\_number
- Ceny, množství, DPH jsou desetinná čísla double
- PLU slouží k párování položek, to znamená, že pokud položka neexistuje v pokladně, pod daným PLU, bude automaticky vytvořena

### Formát JSON platné odpovědi

```JSON
{
  "invoice_number": 20130001, // optional, will be generated if not provided
  "note": "strestt", // optional
  "items": [
    {
      "plu": "203", // optional
      "note": "Item optional note" // optional
      "name": "Item number 203",
      "price_without_vat": 112.0,
      "quantity": 1.0,
      "vat_rate": 1.21
    }
  ]
}
```

### Formát JSON prázdné odpovědi pokud server nic nenalezl

Pokud uživatel zadá neplatný kód faktury, měl by server vrátit chybu 404 - Not found v hlavičce a odpověd v těle by měla obsahovat `null`

```JSON
null
```

# Propojení na informačním systémem (web integrace)

Aplikace KASA FIK umožňuje dynamicky integrovat webové aplikace zákazníka pomocí integrovaného tlačítka nebo funkční klávesy. Propojení je ideální pro přenos objednávek z eshopu nebo účetních systémů přímo do aplikace.

<p class="callout info">Funkce je dostupná pouze s licencí **PREMIUM**</p>

#### [![custom-button.gif](https://manual.kasafik.cz/uploads/images/gallery/2020-10/6LNszzae2TDCVGNz-custom-button.gif)](https://manual.kasafik.cz/uploads/images/gallery/2020-10/6LNszzae2TDCVGNz-custom-button.gif)

#### Princip funkce - workflow

- Uživateli se zobrazí nové nastavitelné tlačítko na hlavní obrazovce
- Po klepnutí na tlačítko se načte webová aplikace, která je plně pod kontrolou zákazníka
- Ve webové aplikace může být umístěno tlačítko, které po kliknutí přenese uživatele zpět do aplikace a vyplní automaticky účtenku
- KASA FIK provede zaúčtování EET případně platbu kartou
- Integraci lze nastavit i na [funkční klávesu](https://manual.kasafik.cz/books/kasa-fik-etr%C5%BEby/page/funk%C4%8Dn%C3%AD-kl%C3%A1vesy "Funkční klávesy") při prodeji
- Informace o vystavení účtenek lze získat přes [Webhook API](https://manual.kasafik.cz/books/kasa-fik-etr%C5%BEby/page/webhook-integrace-api "Webhook Integrace API")

#### Ukázková stránka

Vytvořili jsme ukázkovou stránku, ve které můžete vidět funkce, které lze využít při práci v aplikaci a návrtatu hodnot.

- [https://www.kasafik.cz/test-custom-button.php](https://www.kasafik.cz/test-custom-button.php?test_qs=value1)

Příklad poskytnutých parametrů v URL:

```
partner_code=XXXXX&utm_source=app-com.eetterminal.pos&utm_medium=app&utm_campaign=fik-integration&app_flavor=fik&app_version=1.181-beta12-debug&app_version_code=181&app_lang=cs&shop_id=848428671200000&cash_register_id=2044577243700000&shift_id=5132358187320000
```

##### Query String poskytnutý při volání URL

- partner\_code - *Partnerský kód, pokud je nastaven*
- utm\_source - *Google UTM měřící kód. Hodnota "app-com.eetterminal.pos"*
- utm\_medium - *Google UTM měřící kód. Hodnota "app"*
- utm\_campaign- *Google UTM měřící kód. Hodnota "fik-integration"*
- app\_flavor - *Typ aplikace- Hodnota "fik"*
- app\_version - *Textový popis verze aplikace. Např. 1.180-beta1*
- app\_version\_code - *Kód verze aplikace např. 180*
- app\_lang - *Jazyk, ve kterém je nastavena aplikace (cs pro češtinu)*
- global\_customer\_id - *Globální ID zákazníka*
- shop\_id - *ID pobočky*
- cash\_register\_id - *ID pokladny*
- shift\_id - *ID současné směny - Hodnota 0 pro uzavřenou směnu*
- employee\_id - *ID aktuálně přihlášeného zaměstnance. Hodnota 0 pokud není nikdo přihlášen*
- user\_email - *Email pod kterým je evidována pokladna*

#### Specifikace integrace

Aplikace načte uživatetem přednastavené URL, které obohatí o Query String s dalšími parametry. Rozšíří Javascript funkce o interface `window.FikApiInterface` který obsahuje metody použitelné k propojení nativní Android aplikace s webovou.

```JavaScript
if (window.FikApiInterface){
    window.FikApiInterface.logError('heyho'); // log error message to android console
    window.FikApiInterface.logInfo('heyho'); // log info message to android console
    window.FikApiInterface.setTitle(document.title); // sets title of the window
    window.FikApiInterface.showToast('heyho'); // shows small toast notification
    // window.FikApiInterface.finish(); // Will close the window without any result
    // window.FikApiInterface.finishWithReceipt(JSON.stringify(obj)); // return back to the app with receipt data
} else {
  // Not loaded within Fik Webapp container
}
```

#### Návrat účtenky do aplikace

Zavolejte metodu `window.FikApiInterface.finishWithReceipt(JSON.stringify(obj))` s následujícim JSON objektem:

```JSON
{
  "invoice_number": 20130001, // optional, will be generated if not provided
  "note": "strestt", // optional
  "items": [
    {
      "plu": "203", // optional
      "note": "Item optional note" // optional
      "name": "Item number 203",
      "price_without_vat": 112.0,
      "quantity": 1.0,
      "vat_rate": 1.21
    }
  ]
}
```

Poznámky k poskytovanému objektu:

- Hodnota musí být `JSON.stringify()`, protože Web integrace neumožňuje přenášet objekty.
- Pokud je vše v pořádku, aplikace uzavře integraci a přenese uživatele do režimu vystavení účtenky
- Pokud nebude vyplněná hodnota `invoice_number` aplikace vygeneruje standarně podle číselné řady (doporučené)
- DPH je v desetinném formátu, tedy 1.21, 1.10, 1.00 - nevyplňujte, pokud se jedná o neplátce

#### Nastavení expirace a vliv na cache (expire)

Webová integrace respektuje správné nastavení cache hlavičky pro ukládání do paměti prohlížeče. Nastavíte-li správné Expire v HTTP hlavičce, bude se respektovat.

Aplikace má také podporu pro ukládání databází a Webstorage.

# Webhook Integrace API

Webhooky umožňují zasílání dat z pokladny/backoffice pomocí HTTP volání informovat o každé události (např. vystavení účtenky, založení zákazníka). Zpracováním webhooků si můžete měnit chování stránky nebo aplikace a rozšiřovat je o nové funkce.

Webhooky lze nastavit v **Backoffice** v **Nastavení** - **Systém** - **Webhooky**. Zadejte https:// adresu kam systém má zasílat data. Nastavení uložte tlačítkem Uložit. Pak následně může trvat nějaký čas, než systém začne automaticky data zasílat. Nové nastavení může trvat až 1-2 hodiny, než se projeví nastavení skrz systémy.

[![Screenshot-from-2020-10-19-12-50-48.png](https://manual.kasafik.cz/uploads/images/gallery/2020-10/scaled-1680-/Lcc8KASlf8ul7iW9-Screenshot-from-2020-10-19-12-50-48.png)](https://manual.kasafik.cz/uploads/images/gallery/2020-10/Lcc8KASlf8ul7iW9-Screenshot-from-2020-10-19-12-50-48.png)

#### Formát zasílaných dat

- Data jsou zasílána ve formátu JSON objektu a metodou POST. 
    - Server musí odpovědět na požadavek návratovým HTTP kódem 200
- Přijímací server **musí** odpovědět návratovým kódem 200
- Jednotlivé záznamy (objekty) jsou zasílány zvlášť a není garantované pořadi doručení
- Každý záznam má následující povinné pole 
    - **\_t** - Jedná se o název tabulky/typu záznamu, jako je "orders, order\_details, products, ..."
    - **\_v** - Verze v Unix timestamp kdy byl záznam změněn
    - **id** - unikatní ID záznamu
- Pokud záznam obsahuje **monetární data** (ceny, hodnoty prodeje atd) tak jsou vyjádřeny jako celé číslo (int) **vynásobené 1000.** Např. cena 3 331,000 Kč je vyjádřena jako 3331000``

#### Příklad zaslaného objektu `orders`

```JSON
{
  "_t": "orders",
  "_v": 1541274974010,
  "conversion_rate": 1,
  "currency": "CZK",
  "dine_in": false,
  "id": 3317888960569993,
  "id_c": 100000,
  "id_cash_register": 3173505578999348,
  "id_employee": 1,
  "id_employee_served": 1,
  "id_park_location": 3227505427363220,
  "id_shift": 3317259000928416,
  "id_shop": 3173505578310000,
  "order_serial_number": 103,
  "total_credits": 0,
  "total_discounts_tax_excl": 0,
  "total_discounts_tax_incl": 0,
  "total_paid_real": 3331000,
  "total_paid_tax_excl": 3331000,
  "total_paid_tax_incl": 3331000,
  "total_points": 0,
  "total_products": 32,
  "total_profit_tax_excl": 0,
  "total_profit_tax_incl": 0,
  "total_shipping_tax_excl": 0,
  "total_shipping_tax_incl": 0,
  "total_tax_eco": 0,
  "total_tax_gst": 0,
  "total_tax_luxury": 0,
  "total_tax_pst": 0,
  "total_tax_service": 0,
  "total_tip": 0,
  "total_wrapping_tax_excl": 0,
  "total_wrapping_tax_incl": 0
}
```

# REST API

Data z pokladen jsou pravidelně synchronizována do cloudu a zpřístupněna přes REST API.

<p class="callout info">API je v současné době poskytováno v omezeném režimu. Do budoucna plánujeme expiraci autorizačního tokenu. Pokud chcete získávat kontinuáně data a synchronizovat systémy **doporučujeme používat [Webhooky](https://manual.kasafik.cz/books/kasa-fik-pokladna/page/webhook-integrace-api "Webhook Integrace API")**. Jedná se o efektivnější způsob.</p>

### Autorizace požadavku

Autorizace probíhá pomocí API Tokenu, který naleznete v **Backoffice - Nastavení - Systém.**

Autorizační klíč je v HTTP hlavičce `Authorization: A|xxxxx`

```shell
curl -XGET 'https://m6vadtaz1h.execute-api.eu-west-1.amazonaws.com/prod/data/products' \
 -H 'Authorization: A|kLgT.........' \
 -H 'Content-Type: application/json'
```

POST přííklad:

```bash
curl -XPOST 'https://m6vadtaz1h.execute-api.eu-west-1.amazonaws.com/prod/data/reports/generic/order_history' \
 -H 'Authorization: A|kLgT.........' \
 -H 'Content-Type: application/json' \
 --data-raw '{"date_start":1639436400000,"date_end":1642028399999,"timezone":"Europe/Prague","id_cash_register":953221254382092,"id_shop":492696696397774}' \
```

### Konvence

- Časy jsou reprezentovány v unix timestamp v millisekundách. Např. 1639436400000
- Monetární hodnoty (tržba, cena, atd) jsou vždy celé číslo, vynásobené 1000. Např. cena 23.50 je v JSON dokumentu jako 23500.
- Autorizační token nemá expiraci, ale do budoucna plánujeme že token bude muset být vyměněn za nový
- Do User Agent prosím vložte svoji identifikaci případně kontakt, abychom měli kontakt na vývojáře
- Pokud navrácený objekt obsahuje položku, která začíná na `__` tak se jedná o tzv. hydrataci - objekt je automaticky obohacen o child objekty, aby vývojář nemusel provádět další dotazy na API.
- Převod id na čas lze provést pomocí funkce: `new Date((id / 32768) + 1440000000000);`

**Společné pole**

- `id_c` - globální ID zákazníka
- `_v` - verze objektu
- `_d` - indikuje jestli byl záznam označen jako smazaný
- `_t` - název tabulky
- `pgx` - složený interní primární klíč - ignorujte, pokud se vyskytuje
- pole s prefixem `date_` jsou Unix UTC čas v millisekundách
- pole s prefixem `id_` jsou relace a odkaz na záznam v jiné tabulce. Např `id_shop` odkazuje na id obchodu v tabulce shops.

#### Funkce pro práci s id

Id je číslo složené z času, id tabulky a náhodného suffixu. Příklad výpočtu:

```javascript
// Javascript
const EPOCH = 1440000000000;

// Vrati objekt s datem a id tabulky
function getDateFromId(id) {
  return {
    dt: new Date((id / 32768) + EPOCH),
    tableId: (id / 512) & 0x3f
  }
}

// Generuje id pro konkretni tabulku - pouzijte 0 pro referenci
exports.getRandomRowId = function (tableId) {
    let ts = new Date().getTime() - EPOCH;
    let randid = Math.floor(Math.random() * 511);
    ts = (ts * 64);
    ts = ts + tableId;
    let t = (ts * 512) + (randid % 512);
    while (t % 10 !== 0) {
        t = t + 2; // Resi chybu s 53bit number v Javascriptu
    }
    return t;
}
```

```c#
// C# 
const long EPOCH = 1440000000000; // Matches the JavaScript EPOCH value

public static long GetRandomRowId(int tableId) {
   long ts = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() - EPOCH;
   int randid = new Random().Next(512); // Generates a random number between 0 and 511
   ts = (ts * 64);
   ts = ts + tableId;
   long t = (ts * 512) + (randid % 512);

   t = t - (t % 10);
   return t;
 }
```

### Seznam endpointů

Následující endpointy podporují metody **GET** (získání seznamů dat json array) i **POST** (vytvoření nebo aktualizace jednoho objektu). Metoda POST podporuje i zaslání více objektů v JSON Array. Lze využít pro dávkové aktualizace více objektů.

Base URL: `https://m6vadtaz1h.execute-api.eu-west-1.amazonaws.com/prod/data/`

- products
- customers
- product\_price\_matrix
- shops
- cash\_registers
- employees
- park\_locations
- shifts
- stock\_history
- stockup
- transactions
- warehouses
- *order\_details a orders - podporuje GET i POST - nedoporučujeme vytvářet nové objekty pomocí POST, proč?*

## Základní princip stránkování

API vrací výsledky v stránkách (pages). Každá odpověď obsahuje maximálně `limit` záznamů. Pro získání dalších záznamů použijte parametr `id_start`.

Stránkování je založeno na **ID záznamu** (BigInt), nikoliv na čase. ID je Unix timestamp v milisekundách jako BigInt, takže vyšší ID = novější záznam.

## Parametry stránkování

<table id="bkmrk-parametr-typ-popis-v" style="width: 100%;"><thead><tr><th style="width: 16.2123%;">Parametr</th><th style="width: 11.9208%;">Typ</th><th style="width: 40.8791%;">Popis</th><th style="width: 31.0031%;">Výchozí hodnota</th></tr></thead><tbody><tr><td style="width: 16.2123%;">`limit`</td><td style="width: 11.9208%;">integer</td><td style="width: 40.8791%;">Maximální počet záznamů na stránku (1-400)</td><td style="width: 31.0031%;">100</td></tr><tr><td style="width: 16.2123%;">`id_start`</td><td style="width: 11.9208%;">string</td><td style="width: 40.8791%;">ID posledního zobrazeného záznamu pro další stránku</td><td style="width: 31.0031%;">`0`</td></tr><tr><td style="width: 16.2123%;">`direction`</td><td style="width: 11.9208%;">string</td><td style="width: 40.8791%;">`forward` (vzestupně) nebo `backward` (sestupně)</td><td style="width: 31.0031%;">`backward` pro tabulky orders, transactions, shifts</td></tr><tr><td style="width: 16.2123%;">`version_start`</td><td style="width: 11.9208%;">integer</td><td style="width: 40.8791%;">Filtruje záznamy s verzí `_v` &gt;= hodnota</td><td style="width: 31.0031%;">`0` (bez filtru)</td></tr></tbody></table>

## Směry stránkování

### Backward (výchozí pro orders, transactions, shifts)

Vrací **nejnovější záznamy první** (sestupně podle data vytvoření).

```
GET /data/orders?limit=100
→ vrací 100 nejnovějších objednávek

```

### Forward

Vrací **nejstarší záznamy první** (vzestupně podle data vvoření).

```
GET /data/orders?limit=100&direction=forward
→ vrací 100 nejstarších objednávek

```

## Jak na stránkování v praxi

### cURL

```bash
# První stránka
curl "/data/orders?limit=400&direction=forward" \
  -H "Authorization: Bearer $TOKEN"

# Další stránka (použijte ID posledního záznamu z předchozí odpovědi)
curl "/data/orders?limit=400&id_start=11154058202189370&direction=forward" \
  -H "Authorization: Bearer $TOKEN"

```

## Filtrování podle verze

Parametr `version_start` umožňuje získat pouze záznamy aktualizované po určitém čase:

```
GET /data/orders?version_start=1780600680635
→ vrací pouze objednávky s _v >= 1780600680635 (timestamp v ms)

```

## Příklad kompletního cyklu

Máte 1500 objednávek, limit = 400:

<table id="bkmrk-str%C3%A1nka-id_start-vr%C3%A1"><thead><tr><th>Stránka</th><th>id\_start</th><th>Vrácených</th><th>Kód</th></tr></thead><tbody><tr><td>1</td><td>`0`</td><td>400</td><td>`last_id = 11154058202189370`</td></tr><tr><td>2</td><td>`11154058202189370`</td><td>400</td><td>`last_id = 11139738857705400`</td></tr><tr><td>3</td><td>`11139738857705400`</td><td>400</td><td>`last_id = 11131523820818290`</td></tr><tr><td>4</td><td>`11131523820818290`</td><td>300</td><td>← poslední stránka (300 &lt; 400)</td></tr></tbody></table>

## Důležitá upozornění

1. **ID jako string**: `id` v odpovědi je BigInt, může být velmi velké číslo. Při předávání jako `id_start` ho převeďte na string, aby nedošlo ke ztrátě přesnosti.
2. **Nikdy neměňte pořadí**: Pokud stránkujete `forward`, pokračujte vždy `forward`. Míchání směrů může vést k přeskočeným nebo duplicitním záznamům.
3. **Timestamp-based ID**: ID objednávek je založeno na timestampu. Novější objednávky mají vyšší ID. To znamená, že:
    
    
    - `direction=backward`: první objednávka = nejnovější
    - `direction=forward`: první objednávka = nejstarší
4. **Limit 2000**: Přestože můžete nastavit `limit` až do 400, DynamoDB dotaz má interně limit 2000 záznamů na jedno volání. Pro větší datasety použijte stránkování.
5. **Nikdy neskipujte stránky**: Vždy iterujte sekvenčně. Přeskočení na "další stránku" bez procházení předchozích může vést ke ztrátě dat.

## Chybové stavy

<table id="bkmrk-k%C3%B3d-popis-%C5%98e%C5%A1en%C3%AD-400"><thead><tr><th>Kód</th><th>Popis</th><th>Řešení</th></tr></thead><tbody><tr><td>400</td><td>Neplatný `id_start`</td><td>Ověřte, že `id_start` je platné ID nebo `0`</td></tr><tr><td>429</td><td>Rate limit</td><td>Snižte frekvenci požadavků</td></tr><tr><td>500</td><td>Interní chyba</td><td>Opakujte požadavek</td></tr></tbody></table>


### GET products

Vrací JSON Array se seznamem produktů. Položky které jsou smazané, mají nastaveno `_visible = false`

**CURL příklad**

```shell
curl 'https://m6vadtaz1h.execute-api.eu-west-1.amazonaws.com/prod/data/products' \
-H 'Authorization: A|......'
```

##### Odpověď

```JSON
[
  {
    "unit": 0,
    "date_updated": 1641499263724,
    "attributes_bitmask": 8208,
    "__price_matrix_model": {
      "date_starts": 1640070857424,
      "unit_price_base_tax_incl": 550,
      "unit_price_regular_tax_excl": 454546,
      "unit_price_c_tax_excl": 0,
      "credits_deduct": 0,
      "hour_bitmask": 0,
      "points_deduct": 0,
      "reduction_amount_a_tax_excl": 0,
      "id_exec_rule": 0,
      "id_product": 6555921856010421,
      "unit_price_b_tax_excl": 0,
      "dow_bitmask": 0,
      "price_bitmask": 0,
      "unit_price_base_tax_excl": 454.5455,
      "id_shop": 0,
      "currency": "CZK",
      "unit_price_a_tax_excl": 454546,
      "id": 6555922259744395,
      "id_warehouse": 953221254427235,
      "_t": "product_price_matrix",
      "_v": 1641499263728
    },
    "condition_type": 0,
    "name": "Cesta",
    "id_category": 5723345161520367,
    "node_sort": -6680027574804497000,
    "inventory_management": false,
    "id": 6555921856010421,
    "id_shop": 0,
    "color": 0,
    "visible": true,
    "tax_pst_rate": 1.21,
    "item_type": 0,
    "icon_code": 0,
    "quantity_minimal": 1,
    "quantity_multiple": 1,
    "id_c": 111111,
    "_t": "products",
    "_v": 1641499263746
  }
]
```

### GET product/{id}

Vrací jednotlivý produkt podle ID objektu. Pro ceny volejte get-price-by-product-id/

```
https://m6vadtaz1h.execute-api.eu-west-1.amazonaws.com/prod/data/products/{id}
```

##### Odpověď

```json
{
  "unit": 0,
  "pgx": "111:products",
  "description_short": "Vydařená kombinace rumu a griotky",
  "date_updated": 1647012279153,
  "attributes_bitmask": 8240,
  "sale_group_type": 0,
  "condition_type": 1,
  "name": "Čert",
  "id_tax_rules_group": 0,
  "id_category": 6783340285035904,
  "node_sort": 3752073357922477000,
  "accounting_group": 600000,
  "warranty_length": 0,
  "inventory_management": true,
  "inventory_type": 0,
  "id": 6783372795320333,
  "id_shop": 0,
  "tax_eco": 1,
  "color": 0,
  "visible": true,
  "_d": 0,
  "tax_luxury": 1,
  "tax_pst_rate": 1.21,
  "item_type": 0,
  "additional_shipping_cost": 0,
  "icon_code": 0,
  "warranty_type": 0,
  "_t": "products",
  "quantity_minimal": 1,
  "_v": 1681918519463,
  "quantity_multiple": 1,
  "id_c": 111111,
  "id_exec_rule": 0
}
```

### POST product

Vytvoří nový produkt. Použijte id produktu `0` pro nový objekt, nebo id existujícího produktu pro aktualizaci objektu. Pro informace o formátu objektu se podívejte do definice zod, viz níže.

**Poznámky:**

- id\_shop=0 indikuje ze položka není omezena na žádnou pobočku
- attributes\_bitmask= je bitmaska s atributy. Používají se bitové operace, hodnota se ukládá jako int

```bash
curl 'https://m6vadtaz1h.execute-api.eu-west-1.amazonaws.com/prod/data/products' \
  -H 'Accept: application/json' \
  -H 'Authorization: A|....' \
  -H 'Content-Type: application/json' \
  -d '{
    "deleted": 0,
    "id": 0, // Zero or omit to create new record
    "_t": "products",
    "image_dimension": null,
    "notes_quick": "Sample quick notes",
    "quantity_multiple": 1,
    "quantity_minimal": 1,
    "additional_shipping_cost": 0,
    "date_updated": 1678886400000,  // Example timestamp (replace as needed)
    "inventory_management": false,
    "color": 0,
    "item_type": 0,
    "id_category": 0,
    "tax_luxury": 1.000,
    "ean13": "1234567890123",
    "id_tax_rules_group": 0,
    "name_alternative": "Alt Product Name",
    "sku": "PROD-SKU-001",
    "tax_eco": 1.000000,
    "barcode": "9876543210987",
    "height": 10.5,
    "visible": true,
    "image_url": "https://example.com/image.jpg",
    "warranty_length": 12,
    "condition_type": 0,
    "tax_pst_rate": 1.000,
    "upc": "012345678901",
    "weight": 1.2,
    "icon_code": 0,
    "details_url": "https://example.com/details",
    "warranty_type": 0,
    "tags": "sample,product",
    "description_short": "Short product description",
    "unit": 0,
    "id_exec_rule": 0,
    "depth": 5.0,
    "sale_group_type": 0,
    "id_global_product_code": null,
    "accounting_group": 600000,
    "name": "Sample Product Name",
    "width": 7.8,
    "node_sort": 0,
    "attributes_bitmask": 0,
    "inventory_type": 0,
    "internal_extra": "Internal notes",
    "id_shop": 0
  }'

```

### GET get-price-by-product-id/{id\_product}

Vrací ceny pro konkrétní produkt v ceníku podle id produktu.

```
https://m6vadtaz1h.execute-api.eu-west-1.amazonaws.com/prod/data/products/get-price-by-product-id/{id_product}
```

### GET product\_price\_matrix

Ceny k produktům. Je nutné napárovat pomocí id\_product

```
https://m6vadtaz1h.execute-api.eu-west-1.amazonaws.com/prod/data/product_price_matrix
```

##### Odpověď

```JSON
[
  {
    "currency": "CZK",
    "unit_price_base_tax_excl": 30,
    "id_warehouse": 4438373662962620,
    "_d": 1,
    "dow_bitmask": 0,
    "credits_deduct": 0,
    "hour_bitmask": 0,
    "unit_price_base_tax_incl": 30,
    "id_product": 4438453021022482,
    "unit_price_regular_tax_excl": 30000,
    "points_deduct": 0,
    "date_starts": 1575450836824,
    "price_bitmask": 0,
    "_t": "product_price_matrix",
    "unit_price_a_tax_excl": 30000,
    "_v": 1633950008092,
    "id": 4438454091814580,
    "reduction_amount_a_tax_excl": 0,
    "id_shop": 0,
    "id_c": 1141932
   }
  ]
```

### GET categories

Seznam kategorií v hiearchické struktuře

```
https://m6vadtaz1h.execute-api.eu-west-1.amazonaws.com/prod/data/categories
```

##### Odpověď

```JSON
[
  {
    "visible": true,
    "_d": 0,
    "name": "Cakes >",
    "category_bitmask": 0,
    "icon_code": 5,
    "node_sort": 5000000,
    "id_category_sort_after": 0,
    "_t": "categories",
    "_v": 1672597351272,
    "id_category_parent": 0,
    "id": 1,
    "id_shop": 0,
    "color": 17,
    "id_c": 111111,
    "children": [
      {
        "visible": false,
        "name": "test",
        "category_bitmask": 0,
        "margin_minimal_rate": null,
        "icon_code": 4,
        "node_sort": 5000000,
        "id_category_sort_after": 0,
        "_t": "categories",
        "_v": 1640029337604,
        "id_category_parent": 1,
        "id": 1067887041152062,
        "id_shop": 0,
        "margin": null,
        "color": 5,
        "tags": null,
        "id_c": 111111,
        "children": []
      }
    ]
  }
]
```

### GET shops

Seznam poboček (shops)

```
https://m6vadtaz1h.execute-api.eu-west-1.amazonaws.com/prod/data/shops
```

##### Odpověď

```JSON
[
  {
    "visible": true,
    "currency": "CZK",
    "_d": 0,
    "name": "Shop 83",
    "location_name": "City 44",
    "_t": "shops",
    "_v": 1677240349376,
    "id": 492696696391111,
    "bitmask": 0,
    "id_c": 111111
  }
]
```

### GET cash\_registers

Seznam poboček. Více o struktuře a [závislosti na obchodech v manuálu zde](https://manual.kasafik.cz/books/kasa-fik-backoffice/page/nastaven%C3%AD-a-provoz-v%C3%ADce-pobo%C4%8Dek "Nastavení a provoz více poboček").

```
https://m6vadtaz1h.execute-api.eu-west-1.amazonaws.com/prod/data/cash_registers
```

##### Odpověď

```JSON
[
  {
    "visible": true,
    "name": "Point of Sale 233",
    "location_name": "Brno",
    "_t": "cash_registers",
    "_v": 1640802641284,
    "cash_register_type": 11,
    "id": 49269669639111,
    "id_shop": 492696696397774,
    "bitmask": 0,
    "id_c": 11111
  }
]
```

### GET customers

Seznam zákazníků

```bash
curl 'https://m6vadtaz1h.execute-api.eu-west-1.amazonaws.com/prod/data/customers' \
 -H 'Authorization: A|ADq
```

##### Odpověď

```json
[
  {
    "customer_type": 0,
    "credit_account": null,
    "internal_extra": null,
    "price_group": "A",
    "zip_code": "40801",
    "date_updated": null,
    "email": null,
    "city": "RUMBURK",
    "bank_account": null,
    "date_birthday": null,
    "company": "Test s.r.o.",
    "geohash": null,
    "firstname": null,
    "company_ico": "3332650",
    "id": 3665795354036044,
    "color": 0,
    "bitmask": 0,
    "tags": "csv-import-91",
    "barcode": null,
    "visible": true,
    "id_discount_group": null,
    "lastname": null,
    "company_dic": "CZ33333",
    "internal_json": null,
    "_t": "customers",
    "_v": 1551875000154,
    "date_expires": null,
    "phone_number": null,
    "note_internal": null,
    "country_code": "CZ",
    "note_external": null,
    "id_c": "11111",
    "street": "17.8"
  }
]
```

### GET customer/{id}

Jednotlivý záznam pro zákazníka podle ID.

```
https://m6vadtaz1h.execute-api.eu-west-1.amazonaws.com/prod/data/customers/{id}
```

```
curl 'https://m6vadtaz1h.execute-api.eu-west-1.amazonaws.com/prod/data/customers/12344566' \
 -H 'Authorization: A|ADqsEX...
```

### GET orders

Vrací seznam účtenek (JSON Array), seřazené od nejnovějších po nejstarší.

Poznámky:

- Pokud je doklad zrušený nebo stornovaný, pole `date_canceled` obsahuje čas zrušení (not-null)
- `reduction_percent` indikuje slevu v procentech poskytnutou zakaznikovi vynasobene 1000, uvedené jako celé číslo (integer). Tzn. hodnota 500 znamená, že byla poskytnuta sleva 0.5%

Parametry

- id\_start - id záznamu od kterého se má stránkovat. výchozí hodnota 0 stránkuje od nejnovejší účtenky
- version\_start - unix epoch timestamp (ms) filtr. Hodnota 0 znamená že se hodnoty nebudou filtrovat.
- limit - omezit počet záznamů, výchozí 250, maximum 2000. Velková velikost navráceného JSON nemůže přesáhnout 6MB

```
https://m6vadtaz1h.execute-api.eu-west-1.amazonaws.com/prod/data/orders?version_start=0&id_start={id_order}
```

### GET orders/latest/{id\_cash\_register}

Posledních 40 orders z konkrétní pokladny podle id\_cash\_register. Metoda nepodporuje stránkování. Doporučujeme na získávání aktuálních objednávek v pravidelných intervalech pro systémy, které chtějí získávat online přehled o uskutečnených pohybech.

Query string parametry:

- id\_payment (optional) - ID forma platby. Např 221: hotovost, 222: kreditní parta, 238: sumup

```
https://m6vadtaz1h.execute-api.eu-west-1.amazonaws.com/prod/data/orders/latest/{id_cash_register}?id_payment={id_payment}
```

##### Odpověď

```JSON
[
  {
    "total_discounts_tax_excl": 0,
    "currency": "CZK",
    "pgx": "1141932:orders:4438373662917304",
    "total_points": 0,
    "id_employee": 0,
    "date_closed": 1642005467495,
    "total_credits": 0,
    "id_payment": 222,
    "total_paid_tax_excl": 50000,
    "total_shipping_tax_excl": 0,
    "total_tax_service": 0,
    "total_paid_real": 50000,
    "conversion_rate": 1,
    "_u_dyn": 1642005490213,
    "total_discounts_tax_incl": 0,
    "geohash": "u2ugrgc",
    "date_collected": 1642005467495,
    "total_tip": 0,
    "id_cash_register": 4438373662917304,
    "id": 6619285123010267,
    "dine_in": true,
    "id_shop": 4438373662924485,
    "total_products": 1,
    "total_tax_gst": 0,
    "total_profit_tax_excl": 0,
    "order_serial_number": 130,
    "summary": "1x Pure bar",
    "id_park_location": 0,
    "total_wrapping_tax_incl": 0,
    "_d": 0,
    "total_tax_eco": 0,
    "total_tax_pst": 0,
    "total_shipping_tax_incl": 0,
    "id_employee_served": 0,
    "date_paid": 1642005467185,
    "id_shift": 6618245790277082,
    "total_profit_tax_incl": 0,
    "date_tax_reported": 1642005467495,
    "_t": "orders",
    "total_paid_tax_incl": 50000,
    "_v": 1642005467521,
    "total_wrapping_tax_excl": 0,
    "total_tax_luxury": 0,
    "invoice_number": 202012274,
    "id_c": 1141932
   }
  ]
```

### GET order/{id\_cash\_register}/{id\_order}

Umožní získat účtenku/doklad včetně položek v poli **\_\_order\_details**

```
https://m6vadtaz1h.execute-api.eu-west-1.amazonaws.com/prod/data/orders_details/{id_cash_register}/{id_order}
```

```json
{
  "total_discounts_tax_excl": 0,
  "currency": "CZK",
  "pgx": "1173665:orders:7694791899251239",
  "total_points": 0,
  "id_employee": 1,
  "date_closed": 1684414596504,
  "total_credits": 0,
  "id_payment": 222,
  "total_paid_tax_excl": 56522,
  "total_shipping_tax_excl": 0,
  "total_tax_service": 0,
  "date_fiscalized": 0,
  "total_paid_real": 65000,
  "conversion_rate": 1,
  "total_discounts_tax_incl": 0,
  "date_collected": 1684414596504,
  "total_tip": 0,
  "id_cash_register": 7694791899251000,
  "id": 8008974168592088,
  "dine_in": true,
  "id_shop": 7694791899258554,
  "total_products": 2,
  "total_tax_gst": 0,
  "total_profit_tax_excl": 0,
  "order_serial_number": 320,
  "id_park_location": 0,
  "total_wrapping_tax_incl": 0,
  "_d": 0,
  "total_tax_eco": 0,
  "total_tax_pst": 8478,
  "total_shipping_tax_incl": 0,
  "id_employee_served": 1,
  "date_paid": 1684414596504,
  "id_shift": 7962837799869694,
  "total_profit_tax_incl": 0,
  "date_tax_reported": 1684414596504,
  "_t": "orders",
  "total_paid_tax_incl": 65000,
  "_v": 1684414596517,
  "total_wrapping_tax_excl": 0,
  "total_tax_luxury": 0,
  "invoice_number": 202305288,
  "id_c": 11111,
  "date_canceled": null,
  "__order_details": [
    {
      "product_item_type": 0,
      "currency": "CZK",
      "pgx": "1173665:order_details:7694791899251239",
      "total_points": 0,
      "id_warehouse": 0,
      "id_employee": 1,
      "date_updated": 1684414596517,
      "total_credits": 0,
      "id_payment": 222,
      "id_product": 7833117185743150,
      "_u_dyn": 1684414622686,
      "reduction_amount_tax_incl": 0,
      "id_category": 7694792007615808,
      "id_order": 8008974168592088,
      "product_name_alternative": ":;en:Cappuccino",
      "product_price_billed_tax_incl": 35000,
      "id_order_details_parent": 1,
      "id_cash_register": 7694791899251000,
      "id": 8008976796814560,
      "id_shop": 7694791899258554,
      "product_quantity": 1,
      "product_bitmask": 0,
      "product_name": "Cappuccino",
      "_d": 0,
      "total_tax_eco": 0,
      "total_tax_pst": 4565,
      "reduction_amount_tax_excl": 0,
      "product_price_billed_tax_excl": 30435,
      "product_unit": 0,
      "product_price_original_tax_excl": 30435,
      "tax_pst_rate": 1.15,
      "date_paid": 1684414596517,
      "id_shift": 7962837799869694,
      "_t": "order_details",
      "_v": 1684414596517,
      "order_number": 320,
      "total_tax_luxury": 0,
      "reduction_percent": 0,
      "id_c": 11111,
      "date_voided": null,
      "date_canceled": null
    }
  ]
}
```

### GET order\_details

Vrací položky účtenek. Jedná se o child kolekci objektu orders.

```
https://m6vadtaz1h.execute-api.eu-west-1.amazonaws.com/prod/data/order_details?version_start=0&id_start={id_order_details}
```

### POST warehouse\_status

Aktuální stav skladu. Je nutné zaslat JSON request s id\_warehouse který určuje ID skladu, pro který chcete report.

```shell
curl 'https://m6vadtaz1h.execute-api.eu-west-1.amazonaws.com/prod/data/reports/generic/warehouse_status' \
  -H 'Accept: application/json' \
  -H 'Authorization: A|....' \
  -H 'Content-Type: application/json' \
  --data-raw '{"id_warehouse":953221250000000}'
```

##### Odpověď

```JSON
{
  "data": [
    {
      "id_c": 111111,
      "id_warehouse": 953221254427235,
      "wname": "WAREHOUSE MAIN 21",
      "id_product": 5128991459121170,
      "pname": "Aperol",
      "cname": null,
      "id_category": 4933809643652539,
      "barcode": null,
      "ean13": null,
      "unit": 0,
      "qty_cnt": 1,
      "qty_sum": 3,
      "qty_avg": 3,
      "date_updated": 1641489385000,
      "pp_avg": 10000,
      "pp_unit": 10000
    },
    {
      "id_c": 111111,
      "id_warehouse": 953221254427235,
      "wname": "WAREHOUSE MAIN 21",
      "id_product": 4305305643161675,
      "pname": "01.Vstup 8225",
      "cname": "ACesty",
      "id_category": 5723345161520367,
      "barcode": null,
      "ean13": null,
      "unit": 0,
      "qty_cnt": 1,
      "qty_sum": 6,
      "qty_avg": 6,
      "date_updated": 1642004221000,
      "pp_avg": 100000,
      "pp_unit": 100000
    }
  ],
  "source": "query"
}
```

### POST customers

Slouží k vytvoření nebo aktualizaci objektu zákazníka podle primárního klíče - pokud vytváříte objekt. neposkytujte ID objektu, bude automaticky vytvořeno. Schéma entity je popsána v zod níže.

```bash
curl 'https://m6vadtaz1h.execute-api.eu-west-1.amazonaws.com/prod/data/customers' \
  -H 'Accept: application/json' \
  -H 'Authorization: A|....' \
  -H 'Content-Type: application/json' \
  --data-raw '{...}'
```

### Zasílání objednávek do pokladny

Připravujeme propojení pro zasílání externích objednávek do pokladního systému přes API. Kontaktujre prosím <podpora@kasafik.cz> pro více informací.

### Vazby - Mermaid

Schema vazeb ve formátu Mermaid

[![mermaid-diagram-2025-04-16-152933.png](https://manual.kasafik.cz/uploads/images/gallery/2025-04/scaled-1680-/H9hYyo7clOlHWQEn-mermaid-diagram-2025-04-16-152933.png)](https://manual.kasafik.cz/uploads/images/gallery/2025-04/H9hYyo7clOlHWQEn-mermaid-diagram-2025-04-16-152933.png)

```
erDiagram
    Customer {
        bigint id PK
    }

    Orders {
        bigint id PK
        bigint id_customer FK
        bigint id_address_invoice FK
        bigint id_address_delivery FK
        bigint id_cash_register FK
        bigint id_shift FK
        bigint id_employee FK
        bigint id_employee_served FK
        bigint id_shop FK
        bigint id_park_location FK
        bigint id_shipping FK
        bigint id_superseded FK
    }

    OrderDetails {
        bigint id PK
        bigint id_order FK
        bigint id_customer FK
        bigint id_product FK
        bigint id_shift FK
        bigint id_employee FK
        bigint id_shop FK
        bigint id_warehouse FK
        bigint id_cash_register FK
        bigint id_category FK
    }

    Employees {
        bigint id PK
    }

    StockHistory {
        bigint id PK
        bigint id_employee FK
        bigint id_shop FK
        bigint id_stockup FK
        bigint id_warehouse FK
        bigint id_cash_register FK
        bigint id_order FK
        bigint id_record FK
    }

    Transactions {
        bigint id PK
        bigint id_customer FK
        bigint id_order FK
        bigint id_shift FK
        bigint id_employee FK
        bigint id_shop FK
    }

    Stockup {
        bigint id PK
        bigint id_cash_register FK
        bigint id_employee FK
        bigint id_shop FK
        bigint id_warehouse FK
    }

    Warehouses {
        bigint id PK
    }

    Products {
        bigint id PK
        bigint id_category FK
        bigint id_shop FK
        bigint id_exec_rule FK
        bigint id_tax_rules_group FK
        bigint id_global_product_code FK
    }

    ProductPriceMatrix {
        bigint id PK
        bigint id_product FK
        bigint id_exec_rule FK
        bigint id_shop FK
        bigint id_warehouse FK
    }

    Customer ||--o{ Orders : places
    Orders ||--o{ OrderDetails : contains
    Customer ||--o{ OrderDetails : "is associated with"
    Employees ||--o{ Orders : "manages"
    Employees ||--o{ OrderDetails : "fulfills"
    Warehouses ||--o{ OrderDetails : "stores"
    Products ||--o{ OrderDetails : "includes"
    StockHistory ||--o{ Employees : "managed by"
    StockHistory ||--o{ Warehouses : "stored in"
    StockHistory ||--o{ Products : "deducts"
    Transactions ||--o{ Customer : "initiated by"
    Transactions ||--o{ Orders : "related to"
    Transactions ||--o{ Employees : "processed by"
    Stockup ||--o{ Employees : "performed by"
    ProductPriceMatrix ||--o{ Products : "defines price for"
    Orders ||--o{ Warehouses : "related to"
    Products ||--o{ Warehouses : "related to"
    Products ||--o{ ProductPriceMatrix : "related to"
    Products ||--o{ Transactions : "bought with"
    Orders ||--o{ Transactions : "related to"
    StockHistory }o--|| Orders : "concerns"
    Warehouses ||--o{ Stockup : "associated with"
    Stockup ||--o{ StockHistory : "tracks"
    Employees ||--o{ StockHistory : "managed by"
    Orders ||--o{ StockHistory : "related to"
    Warehouses ||--o{ StockHistory : "related to"
    Employees ||--o{ Transactions : "related to"
    Employees ||--o{ Orders : "related to"


```

###  Definice objektu - zod schema

```javascript
const NOT_DELETED = 0;

const bigintOrNumber = z.union([
    z.number().refine(value => !isNaN(value), {
        message: 'Expected a valid number',
    }),
    z.bigint(),
]);

const BaseSchema = z.object({
    id: z.number(),
    _v: z.number().min(0).default(() => new Date().getTime()),
    _d: z.number().min(0).default(NOT_DELETED),
    date_created: z.number().default(() => new Date().getTime())
});

const CustomerSchema = BaseSchema.extend({
    id: z.bigint().default(BigInt(dbhelpers.getRandomRowId(2))),
    _t: z.literal("customers"),
    firstname: z.string().nullable().optional(),
    customer_type: z.number().int().min(0).default(0), // Assuming customerType should be non-negative integer
    date_updated: z.number().default(() => new Date().getTime()), // Defaults to current date
    color: z.number().int().min(0).default(0), // Assuming color should be non-negative integer
    id_discount_group: bigintOrNumber.optional(),
    zip_code: z.string().nullable().optional(),
    date_birthday: z.number().nullable().optional(),
    geohash: z.string().nullable().optional(),
    company: z.string().nullable(), // Can be null
    company_ico: z.string().nullable().optional(),
    company_dic: z.string().nullable().optional(),
    street: z.string().nullable().optional(),
    city: z.string().nullable().optional(),
    bank_account: z.string().nullable().optional(),
    credit_account: z.string().nullable().optional(),
    internal_json: z.string().nullable().optional(),
    bitmask: z.number().int().min(0).default(0), // Assuming bitmask should be non-negative integer
    barcode: z.string().nullable().optional(),
    email: z.string().email().nullable().optional(), // Assuming email should be a valid email format
    visible: z.boolean().default(true), // Assuming default visibility is true
    lastname: z.string().nullable().optional(),
    tags: z.string().nullable().optional(),
    country_code: z.string().min(2).max(2).default('CZ'), // Assuming country code is always 2 characters
    price_group: z.enum(['A', 'B', 'C']).default('A'),
    note_external: z.string().nullable().optional(),
    note_internal: z.string().nullable().optional(),
    phone_number: z.string().nullable().optional(),
    date_expires: z.number().nullable().optional(),
    internal_extra: z.string().nullable().optional(),
    price_discount: z.number().int().default(0) // Assuming price discount is an integer
});

const OrdersSchema = BaseSchema.extend({
    id: z.bigint().default(BigInt(dbhelpers.getRandomRowId(7))),
    _t: z.literal("orders"),
    id_address_invoice: bigintOrNumber.optional(),
    id_canceled_order: bigintOrNumber.optional(),
    id_customer: bigintOrNumber.optional(),
    total_points: z.number().default(0),
    total_credits: z.number().default(0),
    total_profit_tax_incl: z.number().default(0),
    total_tax_gst: z.number().default(0),
    dine_in: z.boolean().default(false), // boolean, default to false
    id_tax_report: bigintOrNumber.optional(),
    short_code: z.string().nullable().optional(), // string or null
    date_closed: z.number().nullable().optional(), // number (Date) or null
    date_paid: z.number().nullable().optional(), // number (Date) or null
    total_shipping_tax_incl: z.number().default(0),
    geohash: z.string().nullable().optional(), // string or null
    id_shop: bigintOrNumber,
    total_profit_tax_excl: z.number().default(0),
    total_tax_service: z.number().default(0),
    invoice_number: z.number().nullable().optional(),
    total_discounts_tax_incl: z.number().default(0),
    order_serial_number: z.number().nullable().optional(),
    id_address_delivery: bigintOrNumber.optional(),
    total_shipping_tax_excl: z.number().default(0),
    total_tax_pst: z.number().default(0),
    total_tax_luxury: z.number().default(0),
    date_canceled: z.number().nullable().optional(), // number (Date) or null
    id_cash_register: bigintOrNumber,
    total_paid_real: z.number().default(0),
    id_shift: bigintOrNumber,
    total_paid_tax_incl: z.number().default(0),
    total_people_seated: z.number().nullable().optional(), // short
    total_tip: z.number().default(0),
    total_discounts_tax_excl: z.number().default(0),
    date_fiscalized: z.number().nullable().optional(), // number (Date) or null
    note: z.string().nullable().optional(), // string or null
    total_paid_tax_excl: z.number().default(0),
    total_wrapping_tax_incl: z.number().default(0),
    id_shipping: bigintOrNumber.optional(),
    id_superseded: bigintOrNumber.optional(),
    total_wrapping_tax_excl: z.number().default(0),
    id_employee: bigintOrNumber,
    currency: z.string().nullable(), // string or null
    conversion_rate: z.number().default(1.0), // number, default to 1.0
    coupon_code: z.string().nullable().optional(), // string or null
    coupon_source: z.string().nullable().optional(), // string or null
    id_payment: z.number().default(0),
    date_tax_reported: z.number().nullable().optional(), // number (Date) or null
    total_tax_eco: z.number().default(0),
    shipping_number: z.string().nullable().optional(), // string or null
    customer_zip: z.string().nullable().optional(), // string or null
    date_loc_acq: z.number().nullable().optional(), // number (Date) or null
    id_employee_served: bigintOrNumber,
    total_products: z.number().default(0),
    id_park_location: bigintOrNumber,
    date_collected: z.number().nullable().optional(), // number (Date) or null
    date_due_pay: z.number().nullable().optional(), // number (Date) or null
    date_emailed: z.number().nullable().optional(), // number (Date) or null
    summary: z.string().nullable().optional(), // string or null
    tags: z.string().nullable().optional(), // string or null
});

// Create a Zod schema for OrderDetails
const OrderDetailsSchema = BaseSchema.extend({
    id: z.bigint().default(BigInt(dbhelpers.getRandomRowId(6))),
    _t: z.literal("order_details"),
    id_payment: z.number().int().default(0), // Default value from TransactionsModel
    id_customer: bigintOrNumber.optional(),
    total_points: z.number().min(0).default(0), // Always whole number, no fractional
    total_credits: z.number().default(0), // We have an issue, in Orders this is int and here double
    id_order: bigintOrNumber,
    date_paid: z.number().nullable().optional(),
    id_shop: bigintOrNumber,
    product_barcode: z.string().nullable().optional(),
    total_tax_pst: z.number().int().default(0), // TODO pro prodej poukazu -100Kc je negativni dan
    total_tax_luxury: z.number().int().min(0).default(0),
    date_canceled: z.number().nullable().optional(),
    id_cash_register: bigintOrNumber,
    product_name: z.string().default("Unknown"),
    product_unit: z.number().int().min(0).default(0),
    tags: z.string().nullable().optional(),
    id_shift: bigintOrNumber,
    product_price_original_tax_excl: z.number().int().default(0),
    id_product: bigintOrNumber,
    product_purchase_price_tax_excl: z.number().nullable().optional(), // Integer or null
    product_attribute_id: z.number().nullable().optional(),
    date_timing_started: z.number().nullable().optional(),
    note: z.string().nullable().optional(),
    date_updated: z.number().nullable().optional(),
    product_upc: z.string().nullable().optional(),
    date_item_printed: z.number().nullable().optional(),
    id_category: bigintOrNumber,
    order_number: z.number().int().min(0).default(0),
    reduction_amount_tax_incl: z.number().int().default(0),
    product_quantity: z.number().default(0), // Assuming whole number as per the comment
    total_weight: z.number().nullable().optional(), // Double or null
    id_employee: bigintOrNumber,
    reference_code: z.string().nullable().optional(),
    currency: z.string().min(3).max(3), // Assuming currency is a 3-character code
    product_price_billed_tax_excl: z.number().int().default(0),
    product_name_alternative: z.string().default(""),
    tax_pst_rate: z.number().default(1.000),
    product_price_billed_tax_incl: z.number().int().default(0),
    reduction_percent: z.number().int().min(0).default(0),
    product_ean13: z.string().nullable().optional(),
    total_tax_eco: z.number().int().default(0),
    product_bitmask: z.number().int().min(0).default(0),
    id_order_details_parent: bigintOrNumber.optional(),
    id_warehouse: bigintOrNumber,
    date_collected: z.number().nullable().optional(),
    date_voided: z.number().nullable().optional(),
    reduction_amount_tax_excl: z.number().int().default(0),
    product_item_type: z.number().int().min(0).default(0),
});

const EmployeesSchema = BaseSchema.extend({
    id: z.bigint().default(BigInt(dbhelpers.getRandomRowId(4))),
    _t: z.literal("employees"),
    salt: z.string().nullable().optional(),
    visible: z.boolean().default(true),
    pin_require: z.boolean().default(false),
    perm_inventory_bitmask: z.number().int().default(0),
    pin_hash: z.string().nullable().optional(),
    pass_hash: z.string().nullable().optional(),
    perm_cloud_bitmask: z.number().int().default(0),
    tags: z.string().nullable().optional(),
    perm_bitmask: z.number().int().default(0),
    name: z.string(),
    phone_number: z.string().nullable().optional(),
    date_expires: z.number().nullable().optional(), // Stored as milliseconds since epoch (UNIX timestamp)
    barcode: z.string().nullable().optional(),
    visible_cash_register: z.boolean().default(true),
    otp_hash: z.string().nullable().optional(),
    email: z.string().nullable().optional(),
});

const StockHistorySchema = BaseSchema.extend({
    id: z.bigint().default(BigInt(dbhelpers.getRandomRowId(16))),
    _t: z.literal("stock_history"),
    id_employee: bigintOrNumber,
    id_shop: bigintOrNumber,
    id_stockup: bigintOrNumber.optional().nullable(),
    id_warehouse: bigintOrNumber,
    note: z.string().nullable().optional(),
    id_record: bigintOrNumber,
    date_stocked: z.number().nullable().optional(), // Date as timestamp
    quanity: z.number().default(0.0),
    id_cash_register: bigintOrNumber,
    id_supplier: bigintOrNumber.optional().nullable(),
    stock_type: z.number().int(),
    id_order: bigintOrNumber.optional().nullable(),
    stock_history_type: z.number().int(),
    supplier_sku: z.string().nullable().optional(),
    product_purchase_unit_price_tax_excl: z.number().int().nullable().optional(),

});

const TransactionsSchema = BaseSchema.extend({
    id: z.bigint().default(BigInt(dbhelpers.getRandomRowId(22))),
    _t: z.literal("transactions"),
    note: z.string().nullable().optional(),
    transaction_code: z.string().nullable().optional(),
    id_customer: bigintOrNumber.optional(),
    transaction_type: z.number().int(),
    id_cash_register: bigintOrNumber.default(BigInt(0)),
    id_order: bigintOrNumber.optional(),
    id_shift: bigintOrNumber.default(BigInt(0)),
    payment_type: z.number().int().min(0),
    total_amount: z.number().int().default(0),
    id_employee: bigintOrNumber,
    id_shop: bigintOrNumber,
    reference_code: z.string().nullable().optional(),
});

const StockupSchema = BaseSchema.extend({
    id: z.bigint().default(BigInt(dbhelpers.getRandomRowId(18))),
    _t: z.literal("stockup"),
    note: z.string().nullable().optional(),
    total_product_purchase_unit_price_tax_excl: z.number().int().nullable().optional(),
    date_stocked: z.number().nullable().optional(), // Assuming timestamp as milliseconds
    id_cash_register: z.number().int(),
    id_supplier: z.number().int().nullable().optional(),
    stock_history_type: z.number().int(),
    id_employee: z.number().int(),
    id_shop: z.number().int(),
    id_warehouse: z.number().int(),
    invoice_number: z.string().nullable().optional(),
});

const WarehousesSchema = BaseSchema.extend({
    id: z.bigint().default(BigInt(dbhelpers.getRandomRowId(25))),
    _t: z.literal("warehouses"),
    shared: z.boolean().default(false),
    visible: z.boolean().default(true),
    warehouse_bitmask: z.number().int().default(0),
    name: z.string(),
});

const ProductsSchema = BaseSchema.extend({
    id: z.bigint().default(BigInt(dbhelpers.getRandomRowId(11))),
    _t: z.literal("products"),
    image_dimension: z.number().int().nullable().optional(),
    notes_quick: z.string().nullable().optional(),
    quantity_multiple: z.number().default(1),
    quantity_minimal: z.number().default(1),
    additional_shipping_cost: z.number().default(0),
    date_updated: z.number(), // Date as timestamp (milliseconds)
    inventory_management: z.boolean().default(false),
    color: z.number().int().default(0),
    item_type: z.number().int().default(0),
    id_category: bigintOrNumber.default(BigInt(0)),
    tax_luxury: z.number().default(1.000),
    ean13: z.string().nullable().optional(),
    id_tax_rules_group: bigintOrNumber.nullable().default(BigInt(0)),
    name_alternative: z.string().nullable().optional(),
    sku: z.string().nullable().optional(),
    tax_eco: z.number().default(1.000000),
    barcode: z.string().nullable().optional(),
    height: z.number().nullable().optional(),
    visible: z.boolean().default(true),
    image_url: z.string().nullable().optional(),
    warranty_length: z.number().int().default(0),
    condition_type: z.number().int().default(0),
    tax_pst_rate: z.number().default(1.000),
    upc: z.string().nullable().optional(),
    weight: z.number().nullable().optional(), // Stored as alcoholTax in Java
    icon_code: z.number().int().default(0),
    details_url: z.string().nullable().optional(),
    warranty_type: z.number().int().default(0),
    tags: z.string().nullable().optional(),
    description_short: z.string().nullable().optional(),
    unit: z.number().int().default(0),
    id_exec_rule: bigintOrNumber.default(BigInt(0)),
    depth: z.number().nullable().optional(),
    sale_group_type: z.number().int().default(0),
    id_global_product_code: bigintOrNumber.nullable().optional(),
    accounting_group: z.number().int().default(600000),
    name: z.string(),
    width: z.number().nullable().optional(),
    node_sort: bigintOrNumber.default(BigInt(0)),
    attributes_bitmask: z.number().int().default(0),
    inventory_type: z.number().int().default(0),
    internal_extra: z.string().nullable().optional(),
    id_shop: bigintOrNumber.default(BigInt(0))
});

const ProductPriceMatrixSchema = BaseSchema.extend({
    id: z.bigint().default(BigInt(dbhelpers.getRandomRowId(12))),
    _t: z.literal("product_price_matrix"),
    unit_price_base_tax_excl: z.number().nullable().optional(), // decimal value 19.95
    unit_price_base_tax_incl: z.number().nullable().optional(), // decimal value 22.99
    date_starts: z.number(), // Date as timestamp (milliseconds)
    unit_price_regular_tax_excl: z.number().int().default(0),
    unit_price_c_tax_excl: z.number().int().nullable().optional(),
    points_deduct: z.number().default(0.0),
    credits_deduct: z.number().default(0.0),
    hour_bitmask: z.number().int().default(0),
    reduction_amount_a_tax_excl: z.number().int().default(0),
    id_product: bigintOrNumber,
    id_exec_rule: bigintOrNumber.default(BigInt(0)),
    unit_price_b_tax_excl: z.number().int().nullable().optional(),
    price_bitmask: z.number().int().default(0),
    dow_bitmask: z.number().int().default(0),
    id_shop: bigintOrNumber.default(BigInt(0)),
    currency: z.string(),
    date_expires: z.number().nullable().optional(), // Date as timestamp (milliseconds)
    unit_price_a_tax_excl: z.number().int().nullable().optional(),
    id_warehouse: bigintOrNumber.default(BigInt(0)),
});

```

# Propojení Foodora **



# Propojení WhatsApp

#### Vyvolávání připravených objednávek pro vytížené provozy

[![IMG_20240509_155305_291.jpg](https://manual.kasafik.cz/uploads/images/gallery/2024-05/scaled-1680-/9DRPKwSV9Daos7N7-img-20240509-155305-291.jpg)](https://manual.kasafik.cz/uploads/images/gallery/2024-05/9DRPKwSV9Daos7N7-img-20240509-155305-291.jpg)

Naše samoobslužné kiosky a pokladny jsou vybaveny funkcí, která zákazníkům umožňuje zaregistrovat své mobilní číslo pro příjem oznámení o stavu objednávky prostřednictvím aplikace WhatsApp. Tato funkce poskytuje rychlé a efektivní upozornění, jakmile je objednávka připravena k vyzvednutí, a zároveň otevírá další komunikační kanál pro marketingové aktivity.

V dnešním rychlém a neustále se měnícím světě je důležité, aby se podniky v oblasti pohostinství a maloobchodu přizpůsobily očekáváním moderních zákazníků, kteří hledají pohodlí, rychlost a efektivitu. Vyvolávání připravených objednávek prostřednictvím automatizovaných systémů je v tomto ohledu revolučním krokem, který posouvá zákaznický servis na novou úroveň.

Pro vytížené provozy, jako jsou restaurace s rychlým občerstvením, kavárny a maloobchody, je klíčové zvládnout špičky návštěvnosti bez zbytečných prodlev a s maximální efektivitou. Vyvolávání objednávek přes moderní komunikační kanály jako WhatsApp umožňuje zákazníkům přijímat real-time aktualizace o stavu jejich objednávky přímo na jejich telefon, což znamená, že mohou svůj čas plánovat efektivněji a bez zbytečného čekání.

Tato služba nejenže zvyšuje spokojenost zákazníků, ale také **snižuje fronty a zatížení personálu** během rušných období, což vede k hladšímu chodu provozu a umožňuje zaměstnancům soustředit se na další klíčové úkoly. Automatizace tohoto procesu prostřednictvím pokladního systému je intuitivní, snadno integrovatelná a představuje značnou úsporu času a zdrojů.

#### Předtím, než začnete, ujistěte se, že máte

Účet WhatsApp Business (WABA) potřebuje platné, věnované telefonní číslo podniku.

**Požadavky**

- Aby bylo telefonní číslo podniku způsobilé pro registraci, musí být: vlastněno vámi
- Mít zeměpisné a oblastní kódy (zkrácené kódy nejsou podporovány)
- Schopné přijímat hlasové hovory nebo SMS (zasíláme vám zprávu k ověření vlastnictví)
- Portfolio podniku, které vlastní účet WhatsApp Business spojený s podnikovým telefonním číslem, dokončilo ověření podniku.
- Stav jména podnikového telefonního čísla je SCHVÁLEN.
- Pokladní systém **KASA FIK PREMIUM** s podporou integrace pro odesílání zpráv

Registrovaná čísla je možné stále používat pro běžné účely, jako jsou telefonáty a textové zprávy.

#### Registrace telefonních čísel

<p class="callout info">Postup také naleznete v origiálním [manuálu WhatsApp](https://developers.facebook.com/docs/whatsapp/cloud-api/phone-numbers) na stránkách Facebook/Meta.</p>

Pokud jste při dokončování kroků v dokumentu Začínáme nezaregistrovali číslo, vraťte se na nástěnku aplikace, přejděte na panel **WhatsApp &gt; API Setup**. Posuňte se dolů k Kroku 5: Přidání telefonního čísla, klikněte na tlačítko **Add phone number** a dokončete proces.

Jako součást procesu registrace vám Meta pošlem hlasovou nebo SMS zprávu obsahující ověřovací kód na vaše telefonní číslo, abychom ověřili, že jste jeho majitelem.

Všimněte si, že můžete také zaregistrovat číslo pomocí správce WhatsApp. Podívejte se na článek v centru nápovědy [Jak připojit vaše telefonní číslo k vašemu účtu WhatsApp Business](https://www.facebook.com/business/help/456220311516626?id=2129163877102343), kde se dozvíte, jak na to.

[![Screenshot from 2024-05-10 07-41-46.png](https://manual.kasafik.cz/uploads/images/gallery/2024-05/scaled-1680-/jQXK9Gm8F29Bs0io-screenshot-from-2024-05-10-07-41-46.png)](https://manual.kasafik.cz/uploads/images/gallery/2024-05/jQXK9Gm8F29Bs0io-screenshot-from-2024-05-10-07-41-46.png)

#### Integrace WhatsApp API s pokladním systémem

- Použijte poskytnuté API klíče a koncové body od WhatsAppu a zadejte je do odpovídajících polí ve vašem pokladním systému pro nastavení integrace.

#### Nastavení pravidel pro odesílání zpráv

- V pokladním systému nastavte pravidla pro automatické odesílání zpráv. To může zahrnovat: 
    - Vyvolání objednávky, když je připravena k vyzvednutí.
    - Upozornění na speciální nabídky nebo slevy.
    - Připomenutí rezervací nebo objednávek.
- Nastavte šablony zpráv, které budou odesílány zákazníkům. WhatsApp vyžaduje schválení šablon zpráv pro masové rozesílání.

#### Testování  


- Proveďte testovací transakci a ujistěte se, že zpráva je správně odeslána na testovací číslo WhatsApp.
- Zkontrolujte, zda je zpráva dostatečně informativní a zda obsahuje všechny potřebné informace.

#### Nastaven tisku QR kódu na účtence

V QR tiskové patiččce vložte : `https://wa.me/420530335060?text=Ahoj+Moje+objednavka+je+{order_number}`

[![66cab328988fbe6b267a6ccf269b59c7.png](https://manual.kasafik.cz/uploads/images/gallery/2025-05/scaled-1680-/gmfCC2DoAakCbaaa-66cab328988fbe6b267a6ccf269b59c7.png)](https://manual.kasafik.cz/uploads/images/gallery/2025-05/gmfCC2DoAakCbaaa-66cab328988fbe6b267a6ccf269b59c7.png "Příklad k otestování")

#### Odkazy

- [Whatsapp Business Manager](https://business.facebook.com/wa/manage/home/)

# Propojení Wolt + Wolt Retail

### Úprava nabídky po aktivaci synchronizace s Wolt

#### Synchronizace s Vzdálenou Správou

Po zapnutí funkce synchronizace ve Vzdálené správě dojde k následujícím změnám:

- **Omezení úprav nabídky**: Možnost úpravy nabídky v administrativním rozhraní Woltu bude zablokována. Jakékoli menu, které bylo vytvořeno v Woltu před aktivací synchronizace, zůstane dostupné pro zákazníky, ale nebude již možné ho upravovat.
- **Vytváření nabídky**: Pro další úpravy a správu nabídky je nutné používat Vzdálenou správu systému KASA FIK.

#### Po Aktivaci Synchronizace

- **Nahrazení Mmenu**: Stávající menu Woltu bude smazáno a nahradí jej menu vytvořené v systému KASA FIK, které bude následně synchronizováno, včetně všech položek nabídky.
- **Objednávky přes KASA FIK**: Všechny následné objednávky budou přijímány a zpracovávány v systému KASA FIK.

#### Pokyny pro Odblokování iPadu

- **Požádání o odblokování**: V případě potřeby můžete kontaktovat Wolt s žádostí o odblokování vašeho iPadu, který byl dříve používán pro správu objednávek.
- **Další využití tabletů**: Po odblokování můžete tablet využívat pro jiné účely, které nejsou svázány s přijímáním objednávek na Woltu.

Toto jsou kroky a důležité informace týkající se změn ve správě vaší nabídky po aktivaci synchronizace s Backoffice KASA FIK. Pro hladký přechod a efektivní správu vaší nabídky doporučujeme důkladně se seznámit s novým postupem a zajistit, že všechny relevantní osoby ve vašem týmu jsou řádně informovány a vyškoleny.

# Propojení Better Hotel

Tento dokument poskytuje podrobný přehled o integraci pokladního systému KASA FIK a samoobslužných kiosků s rezervačním systémem [Better Hotel](https://better-hotel.com/cs/). Tato integrace umožňuje hotelům zefektivnit procesy odbavení hostů, správy rezervací a účtování výdajů, čímž se zvyšuje efektivita provozu a zlepšuje zákaznická zkušenost.

## Přehled Integrace

Integrace mezi KASA FIK a Better Hotel přináší následující klíčové funkce:

1. **Vyhledání rezervace:**
    
    
    - Hosté mohou snadno vyhledat své rezervace pomocí samoobslužných kiosků nebo pokladny zadáním čísla rezervace nebo jiného identifikátoru (např. jméno hosta, email).
2. **Správa karty hostů:**
    
    
    - Personál a hosté mohou přistupovat k informacím o hostech, jako je číslo pokoje, jméno hosta, email nebo telefon, což umožňuje rychlé a přesné poskytování služeb.
3. **Účtování konzumace:**
    
    
    - Útraty z restaurace nebo baru mohou být přímo připsány na hotelový účet hosta prostřednictvím pokladního systému KASA FIK, což zjednodušuje proces placení a závěrečné vyúčtování.
4. **Self-Checkout:**
    
    
    - Hosté mají možnost provést self-checkout prostřednictvím kiosků, kde mohou zkontrolovat svůj účet, provést platbu a dokončit proces odhlášení bez nutnosti čekání na recepci.

## Výhody Integrace

- **Zvýšená efektivita:** Automatizace procesů sníží zátěž na personál a zrychlí odbavení hostů.
- **Zlepšená zákaznická zkušenost:** Hosté mají více možností, jak spravovat svůj pobyt, což zvyšuje jejich pohodlí a spokojenost.
- **Přesnost a přehlednost:** Konzumace a další výdaje jsou automaticky zaznamenány a propojeny s rezervačním systémem, což minimalizuje chyby a zajišťuje přesné účtování.
- **Flexibilita:** Hosté mohou kdykoliv přistupovat k informacím o svém pobytu a provádět potřebné změny bez nutnosti asistence personálu.

## Implementace

- Nakonfigurujte API klíče a přístupové body pro komunikaci mezi KASA FIK a Better Hotel v aplikaci KASA FIK Pokladna - **Nastavení - Expertní nastavení - Better Hotel**
- Ujistěte se, že jsou správně nastaveny všechny parametry pro vyhledávání rezervací, správy účtů a účtování výdajů

# Propojení Aktion.eu - stravovací systém

Tento dokument poskytuje podrobné informace o integraci pokladního systému KASA FIK se stravovacím systémem [Aktion](https://www.aktion.cz/stravovaci-system/). Tato integrace přináší efektivní řešení pro řízení stravování ve firmách, šetří náklady na provoz jídelen a zrychluje proces odbavení strávníků.

[![image.png](https://manual.kasafik.cz/uploads/images/gallery/2024-11/scaled-1680-/PciWbccu6nMbCr4x-image.png)](https://manual.kasafik.cz/uploads/images/gallery/2024-11/PciWbccu6nMbCr4x-image.png)

## Přehled stravovacího systému Aktion

Systém [Aktion](https://www.aktion.cz/stravovaci-system/) nabízí komplexní řešení pro objednávání a vyúčtování stravy ve firemních jídelnách. Mezi hlavní funkce patří:

- Rychlé objednání jídel z mobilu, kiosku nebo webové aplikace.
- Platby pomocí RFID karty, mobilu nebo biometrie.
- Export jídelníčku přímo dodavatelům.
- Automatické strhávání částek za odebranou stravu ze mzdy.
- Možnost objednat a převzít jídlo v různých jídelnách v rámci podniku.
- Propojení s nápojovými a jídelními automaty.

## Výhody Integrace KASA FIK s Aktion

- **Efektivita Provozu:** Integrace automatizuje procesy objednávání a vyúčtování, což snižuje administrativní zátěž a zvyšuje efektivitu.
- **Zrychlení Odbavení:** Díky automatizovanému odbavení a platbám se zrychluje proces výdeje jídel.
- **Flexibilita:** Uživatelé mohou snadno spravovat objednávky z různých zařízení a místa odběru.
- **Přesnost a Transparentnost:** Přesné sledování odebrané stravy a její účtování zajišťuje transparentní procesy.

[![image.png](https://manual.kasafik.cz/uploads/images/gallery/2024-11/scaled-1680-/OsruiG1dEdcp6flO-image.png)](https://manual.kasafik.cz/uploads/images/gallery/2024-11/OsruiG1dEdcp6flO-image.png)

## Implementační Kroky

1. **Analýza Potřeb:**
    
    
    - Vyhodnocení stávajících procesů a určení požadovaných funkcí integrace.
2. **Příprava a Testování:**
    
    
    - Instalace a konfigurace potřebného softwaru a hardwaru.
    - Provádění testů propojení a ověření správnosti datové výměny.
3. **Konfigurace API:**
    
    
    - Nastavení API klíčů a přístupových bodů pro bezpečnou komunikaci mezi KASA FIK a Aktion.
    - Zajištění správného nastavení parametrů pro objednávání a vyúčtování.
4. **Školení Personálu:**
    
    
    - Poskytnutí školení pro personál o používání integrovaného systému, včetně nových funkcí a postupů.
5. **Zahájení Provozu:**
    
    
    - Po úspěšném testování a školení uvedení systému do ostrého provozu.
    - Monitorování činnosti a řešení případných problémů.

### Objednávání a Platby

- **Objednávání Jídel:** Strávníci mohou objednávat jídla z mobilní aplikace, kiosku nebo webové aplikace.
- **Platby:** Platby jsou možné pomocí RFID karty, mobilu nebo biometrie, což zajišťuje rychlé a bezpečné transakce.

### Export a Vyúčtování

- **Export Dodavatelům:** Objednávky se automaticky exportují dodavatelům, což zjednodušuje logistiku.
- **Strhávání ze Mzdy:** Odebraná jídla jsou automaticky účtována do mzdového systému, což zajišťuje efektivní vyúčtování.

### Propojení s Automaty

- **Identifikace a Výdej:** Strávníci mohou použít svou přístupovou kartu pro identifikaci a výdej z automatů.
- **Úhrada:** Úhrady za odebrané položky jsou automaticky odečteny ze mzdy.

#### Nastavení přístupů v aplikaci KASA FIK Pokladna

V **Nastavení - Expert nastavení - Aktion** zadejte přístupové údaje pro lokální server Aktion.

[![Screenshot_20250611_213151.png](https://manual.kasafik.cz/uploads/images/gallery/2025-06/scaled-1680-/YmrblMLcjF0ueWqH-screenshot-20250611-213151.png)](https://manual.kasafik.cz/uploads/images/gallery/2025-06/YmrblMLcjF0ueWqH-screenshot-20250611-213151.png)

[![Screenshot_20250611_213319.png](https://manual.kasafik.cz/uploads/images/gallery/2025-06/scaled-1680-/sSuWyBEsC2wXfECe-screenshot-20250611-213319.png)](https://manual.kasafik.cz/uploads/images/gallery/2025-06/sSuWyBEsC2wXfECe-screenshot-20250611-213319.png)

#### Doplnění kreditu (Deposit)

Založte si novou položku, která bude mít typ a zvolte "Vyžádat zadáníá ceny" nebo pokud chcete fixní cenu zadejte cenu v ceníku.

Při prodeji přidejte tuto položku na účet, systém Vás vyzve na zadání hodnoty. Při platbě kartou nebo hotově se následně přičte deposit na účet zákazníka.

# Propojení Shoptet

KASA FIK pokladna a vyzvedávací kiosky jsou schopny spolupracovat se systémem Shoptet. Při každé operaci Shoptet odešle e-mail na centrální adresu, kde jej zpracujeme v systému KASA FIK.

#### Nastavení informačních emailů v Shoptet

Návod Shoptet na webu [https://podpora.shoptet.cz/informacni-e-maily/](https://podpora.shoptet.cz/informacni-e-maily/)

Nastavení informačních e-mailů naleznete v administraci v **Nastavení → Emaily → Automatické zasílání**. Nastavte nového příjemce pro šablonu: **Oznámení o objednávce e-shopu**

Do příjemce, kopie uveďte email `<a href="mailto:shoptet.e@kasafik.cz">shoptet@e.kasafik.cz</a>`

<p class="callout info">email je shoptet (zavináč) **e.**kasafik (tečka) cz - v emailu je písmeno **e!**</p>

**[![Screenshot from 2025-01-17 09-45-00.png](https://manual.kasafik.cz/uploads/images/gallery/2025-01/scaled-1680-/Lib8POzP8EICwPuj-screenshot-from-2025-01-17-09-45-00.png)](https://manual.kasafik.cz/uploads/images/gallery/2025-01/Lib8POzP8EICwPuj-screenshot-from-2025-01-17-09-45-00.png)**

[![image.png](https://manual.kasafik.cz/uploads/images/gallery/2025-01/scaled-1680-/Hk5nGgpaDNHuctFX-image.png)](https://manual.kasafik.cz/uploads/images/gallery/2025-01/Hk5nGgpaDNHuctFX-image.png)

#### Povolení exportů stavu objednávek

V **Nastavení → Administrace** - Zabezpečení exportů zadejte nového partnera **KASA FIK s.r.o.**

[![image.png](https://manual.kasafik.cz/uploads/images/gallery/2025-06/scaled-1680-/uaqKpXGDAtb3jZQW-image.png)](https://manual.kasafik.cz/uploads/images/gallery/2025-06/uaqKpXGDAtb3jZQW-image.png)

Následně v administraci Shoptet **- Objednávky → Exporty** zvolte typ exportu CSV a přiřaďte partnera KASA FIK s.r.o. Zašlete nám odkaz k exportu a propojení. Více o nastavení exportů pomocí permanentního odkazu naleznete v [manuálu Shoptet objednávky](https://podpora.shoptet.cz/export-objednavek/).

[![image.png](https://manual.kasafik.cz/uploads/images/gallery/2025-06/scaled-1680-/TFsiCBdSLrzGy8SZ-image.png)](https://manual.kasafik.cz/uploads/images/gallery/2025-06/TFsiCBdSLrzGy8SZ-image.png)

#### Povolení exportů stavu skladů

Backoffice lze propojit se sklady v Shoptet systému. Je nutné povolit export data poskytnout odkaz pro export dat. V **Produkty → Sklad → Export** vygenerujte odkaz pro stahování stavu skladů.

[![Screenshot from 2025-08-01 09-34-00.png](https://manual.kasafik.cz/uploads/images/gallery/2025-08/scaled-1680-/7j2KvsrLdvS8Azez-screenshot-from-2025-08-01-09-34-00.png)](https://manual.kasafik.cz/uploads/images/gallery/2025-08/7j2KvsrLdvS8Azez-screenshot-from-2025-08-01-09-34-00.png)

#### Převod ze skladů v Shoptet na KASA FIK

V Adminsitraci Shoptet v **Nastavení → Produkty → Sklady → Přidat** si přidejte nový sklad (*například Prodejna Brno*), To vám umožní v administraci Shoptetu převádět produkty na sklad v pokladně.

[![Screenshot from 2025-08-01 09-40-21.png](https://manual.kasafik.cz/uploads/images/gallery/2025-08/scaled-1680-/mIo26FW9kEUwrYHH-screenshot-from-2025-08-01-09-40-21.png)](https://manual.kasafik.cz/uploads/images/gallery/2025-08/mIo26FW9kEUwrYHH-screenshot-from-2025-08-01-09-40-21.png)

# Propojení Qerko**



# MultiSport - partnerská zóna

MultiSport je benefitní program, který umožňuje držitelům karet (zaměstnancům firem) vstup do široké sítě sportovních a relaxačních zařízení. Pro vás jako partnera MultiSport znamená zapojení do programu možnost oslovit nové zákazníky a zvýšit návštěvnost. Integrace s KASA FIK celý proces odbavení těchto zákazníků výrazně zjednodušuje.

#### Jak propojení KASA FIK a MultiSport funguje?

Integrace umožňuje vaší pokladně KASA FIK komunikovat se systémem MultiSport za účelem:

1. **Načtení identifikátoru:** Rychlé načtení čísla MultiSport karty nebo ID z pokladní aplikace (obvykle pomocí čtečky čárových/QR kódů).
2. **Validace vstupu:** Ověření platnosti karty pro daný den a zařízení přímo v systému MultiSport.
3. **Zaznamenání vstupu:** Automatické zaúčtování a zaznamenání vstupu v pokladně KASA FIK a odeslání informace o využití vstupu do systému MultiSport.
4. **Řešení doplatků:** V případě, že je k MultiSport vstupu vyžadován doplatek (dle typu karty nebo aktivity), systém vás na něj upozorní a umožní jeho zaúčtování.

#### Nastavení propojení MultiSport

V **Nastavení - Expert nastavení - zvolte Multisport** a zadejte své přihlašovácí údaje do Multisport Partnerského portálu ve formátu uživatelksé\_jmeno:heslo (odděleno dvojtečkou)

# Slevomat - aktivace voucherů

Tento návod vám ukáže, jak nastavit vaši pokladnu KASA FIK, abyste mohli rychle a pohodlně ověřovat a uplatňovat Slevomat vouchery přímo při prodeji, bez nutnosti chodit do Slevomat Partnerského rozhraní na počítači.

#### Co budete potřebovat:

1. **Být partnerem Slevomatu:** Musíte mít se Slevomatem uzavřenou smlouvu.
2. **Váš unikátní Slevomat API Token:** Toto je speciální kód, který slouží k propojení vaší pokladny se Slevomatem. **Tento token získáte přímo od Slevomatu.** Kontaktujte svého obchodního zástupce Slevomatu nebo jejich zákaznickou podporu a požádejte o "API token pro Partner API". Bez tohoto tokenu propojení nebude fungovat.
3. **Internetové připojení:** Pokladna potřebuje být připojená k internetu, aby mohla komunikovat se Slevomatem.

#### Kroky k nastavení v KASA FIK:

**Krok 1: Získejte svůj Slevomat API Token**

- **Nejdůležitější krok mimo KASA FIK:** Kontaktujte Slevomat a vyžádejte si váš unikátní API token. Řekněte jim, že ho potřebujete pro propojení s pokladním systémem (KASA FIK).
- Jakmile token dostanete, mějte ho připravený (např. zkopírovaný nebo napsaný na papíře).

**Krok 2: Vložte Token do nastavení KASA FIK**

- Otevřete aplikaci **KASA FIK Pokladna**.
- Přejděte do **Nastavení** aplikace.
- Najděte a klepněte na **Expertní nastavení**.
- V Expertním nastavení najděte a vyberte položku **Slevomat**.
- Zde uvidíte pole pro vložení tokenu. **Vložte (nebo opište) sem váš Slevomat API token**, který jste získali v Kroku 1.
- **Uložte provedené změny**

[![Screenshot from 2025-06-06 22-00-08.png](https://manual.kasafik.cz/uploads/images/gallery/2025-06/scaled-1680-/DIGYZ4Jx56BWmO4o-screenshot-from-2025-06-06-22-00-08.png)](https://manual.kasafik.cz/uploads/images/gallery/2025-06/DIGYZ4Jx56BWmO4o-screenshot-from-2025-06-06-22-00-08.png)

**Krok 3: Nastavte si tlačítko pro rychlé použití (Doporučeno)**

- Abyste mohli vouchery odbavovat co nejrychleji, je dobré si na pokladně nastavit speciální tlačítko.
- V prodejním režimu si nastavte **[funkční klávesy](https://manual.kasafik.cz/books/kasa-fik-pokladna/page/funk%C4%8Dn%C3%AD-kl%C3%A1vesy "Funkční klávesy")**
- Vyberte si tlačítko (např. na dotykové obrazovce nebo klávesu na klávesnici), které chcete pro Slevomat použít.
- Přiřaďte tomuto tlačítku funkci související se Slevomatem (např. "Slevomat Voucher", "Odbavit Slevomat" apod.). Tato možnost by se měla objevit poté, co jste vložili token v Kroku 2.
- **Uložte nastavení tlačítek.**

#### Jak používat Slevomat vouchery při prodeji:

1. Zákazník vám předá Slevomat voucher.
2. Na pokladně KASA FIK stiskněte **tlačítko**, které jste si pro Slevomat nastavili (nebo najděte funkci v menu).
3. KASA FIK vás vyzve k **zadání kódu voucheru**. Opište kód přesně z voucheru zákazníka.
4. KASA FIK se přes internet spojí se Slevomatem a **ověří platnost voucheru**.
5. Na obrazovce pokladny se **zobrazí informace o voucheru** (např. název akce) a hlavně, zda je **platný k použití**.
6. Pokud je voucher platný, KASA FIK ho po vašem potvrzení **uplatní** v systému Slevomatu. Klepněte na tlačítko **Použít voucher**
7. Pokladna potvrdí, že voucher byl úspěšně uplatněn.
8. Nyní můžete dokončit prodej v KASA FIK, případně odečíst hodnotu voucheru od celkové částky účtenky (záleží na tom, jak máte nastavené produkty v KASA FIK a jak KASA FIK zpracovává informace ze Slevomatu).

<p class="callout warning">**Pozor**, uplatnění voucheru je nutné provést ve 2 krocích. Napřed dojde k **ověření** a následně **uplatnění** pomocí tlačítka **Použít voucher**. Pokud obsluha provede pouze ověření, **nedojde** k deaktivaci voucheru v systému Slevomat.</p>

[![image.png](https://manual.kasafik.cz/uploads/images/gallery/2025-06/scaled-1680-/mpFCDNyHoVVyVwba-image.png)](https://manual.kasafik.cz/uploads/images/gallery/2025-06/mpFCDNyHoVVyVwba-image.png)

[![image.png](https://manual.kasafik.cz/uploads/images/gallery/2025-06/scaled-1680-/nfU5lFaLwJWkuC0v-image.png)](https://manual.kasafik.cz/uploads/images/gallery/2025-06/nfU5lFaLwJWkuC0v-image.png)

#### Formátování kódu voucheru

Systém akceptuje vouchery v jakémkoliv formátu. Nerozlišuje velká a malá písmena a podporuje zadávání s číslicemi i s pomlčkami nebo bez nich.

#### Zasílání emailů

Pokud je vyplněn email na zasílání přehledů pro účetní, systém automaticky odešle každž požadavek na ověření voucheru na email.

#### Co když se objeví chyba?

Pokud KASA FIK hlásí, že voucher nelze použít, může to být z různých důvodů, které vám pokladna obvykle ukáže (např. voucher už byl použitý, nebyl zaplacený, propadla mu platnost, neexistuje atd.).

**Základní řešení problémů:**

- Zkontrolujte, zda jste kód voucheru zadali správně.
- Ujistěte se, že máte na pokladně funkční internetové připojení.
- Zkontrolujte, zda máte správně vložený Slevomat token v nastavení KASA FIK (Krok 2).
- Pokud problém přetrvává a nejste si jisti, proč voucher nejde použít, kontaktujte podporu KASA FIK nebo Slevomatu.

**Důležité upozornění:**

- Tato funkce obvykle **nefunguje pro Slevomat vouchery z kategorie cestování**.
- Bez internetového připojení na pokladně nelze vouchery ověřovat ani uplatňovat.

# Ticketstream - validace vstupů na kiosku a pokladně

KASA FIK Pokladna vám umožní rychle a spolehlivě ověřovat platnost vstupenek prodaných přes Ticketstream. Tuto funkci využijete především při kontrole vstupu na akce, sportoviště, koncerty nebo v kioskovém režimu.

**Co potřebujete k propojení:**

1. **Partnerství s Ticketstreamem:** Musíte mít s Ticketstreamem smlouvu a prodávat přes ně vstupenky.
2. **Váš Ticketstream Autorizační Token:** Toto je speciální kód, který propojí vaši KASA FIK pokladnu se systémem Ticketstream. **Token získáte přímo od společnosti Ticketstream.** Kontaktujte je a vyžádejte si ho. Bez něj propojení nebude fungovat.
3. **Aplikaci KASA FIK Pokladna:** Ujistěte se, že ji máte nainstalovanou a funkční.
4. **Stabilní internetové připojení:** KASA FIK potřebuje internet pro online ověření a stahování dat o vstupenkách.
5. **Čtečka čárových/QR kódů:** Zařízení pro skenování kódů ze vstupenek, připojené k pokladně nebo kiosku.

**Nastavení propojení v KASA FIK (jednorázové):**

1. **Získejte Token od Ticketstreamu:** Než začnete v KASA FIK, ujistěte se, že máte od Ticketstreamu připravený váš Autorizační Token.
2. **Otevřete KASA FIK Pokladna.**
3. Přejděte do **Nastavení**.
4. Vyberte **Expertní nastavení**.
5. Klepněte na položku **Ticketstream**.
6. Do zobrazeného pole **zadejte Autorizační Token**, který jste získali od Ticketstreamu.

[![Screenshot from 2025-06-07 06-30-22.png](https://manual.kasafik.cz/uploads/images/gallery/2025-06/scaled-1680-/bwLN8POQJjeAr0Jr-screenshot-from-2025-06-07-06-30-22.png)](https://manual.kasafik.cz/uploads/images/gallery/2025-06/bwLN8POQJjeAr0Jr-screenshot-from-2025-06-07-06-30-22.png)

**Nastavení způsobu validace (Pokladna / Kiosek):**

Po vložení tokenu je propojení aktivní. Nyní si nastavte, jak budete validaci spouštět:

- **Na běžné pokladně:** Doporučujeme nastavit [**funkční klávesu**](https://manual.kasafik.cz/books/kasa-fik-pokladna/page/funk%C4%8Dn%C3%AD-kl%C3%A1vesy "Funkční klávesy") (tlačítko na obrazovce nebo klávesnici), která spustí režim skenování vstupenky. Nastavení funkčních kláves najdete v Nastavení KASA FIK (přesné umístění se může lišit, hledejte sekci "Pokladna" nebo "Funkční klávesy"). Přiřaďte jedné z kláves akci související s validací Ticketstream.
- **V Kioskovém režimu:** Validace může probíhat **automaticky** po naskenování vstupenky. Nastavení kioskového režimu a automatické validace často vyžaduje pomoc specialisty podpory KASA FIK.

**Jak používat validaci vstupenek při vstupu:**

1. Návštěvník vám předloží vstupenku (vytištěnou nebo v telefonu).
2. **Pokud používáte běžnou pokladnu:** Stiskněte **nastavenou funkční klávesu** pro validaci Ticketstream.
3. **Pokud používáte Kiosek:** Kiosek je připraven a čeká na skenování.
4. Pomocí čtečky **naskenujte čárový kód nebo QR kód** ze vstupenky.
5. KASA FIK se přes internet spojí se systémem Ticketstream a **ověří platnost vstupenky**.
6. Na obrazovce KASA FIK se **okamžitě zobrazí výsledek**: 
    - **Vstupenka je platná:** Zobrazí se potvrzení (případně detaily jako typ vstupenky, zóna). Návštěvníka můžete pustit.
    - **Vstupenka je neplatná:** Zobrazí se důvod (např. již použitá, neexistuje, neplatná pro daný den atd.). Návštěvníka byste neměli pustit.
7. KASA FIK zároveň **uplatní vstupenku** v systému Ticketstream, aby ji nebylo možné použít znovu.

**Důležité funkce a poznámky:**

- **Offline validace:** KASA FIK si průběžně **stahuje seznamy vstupenek** z Ticketstreamu. To umožňuje ověřit některé vstupenky i při krátkodobém výpadku internetu. Pro plnou spolehlivost a hlavně pro **uplatnění** vstupenky v systému Ticketstream je však **online připojení nezbytné**.
- **Řízení vstupu:** Systém vám pomůže kontrolovat vstup na různé typy akcí nebo do různých zón (VIP, standard atd.) na základě informací ze vstupenky.

**Co když se objeví chyba?**

Pokud KASA FIK hlásí problém s validací, zkontrolujte:

- Zda máte funkční internetové připojení. (Aplikace sice pracuje s offline daty, ale pro online ověření a uplatnění je internet nutný).
- Zda jste správně naskenovali kód.
- Zda máte správně vložený Autorizační Token v nastavení KASA FIK.
- Přečtěte si důvod chyby zobrazený na obrazovce KASA FIK (např. "Vstupenka již použita").

**Potřebujete pomoct?**

- V případě problémů s nastavením v aplikaci KASA FIK nebo s kioskovým režimem kontaktujte **podporu KASA FIK**.
- V případě problémů s vaším Autorizačním Tokenem nebo s daty o vstupenkách v systému Ticketstream kontaktujte **podporu Ticketstrea**

# Propojení Helios

Pokladna nabízí možnost propojit s ERP systémem Helios pomocí SQL napojení na databázi. Vzhledem ke specifickým požadavkům je nutné specifikovat:

- adresu SQL server, port
- název databáze
- přístupové údaje
- tabulka s daty pro objednávky nebo/a produkty

KASA FIK využívá pomocný KASA FIK Helios Connector, který se napojít na SQL Server a provádí výměnu pomocí tabulek nebo uložených procedůr.

# Propojení QR Ticket - validace vstupů na kiosku a pokladně

[![qrticket_logo.png](https://manual.kasafik.cz/uploads/images/gallery/2026-03/scaled-1680-/rj7P6djQGDKJimHN-qrticket-logo.png)](https://qrticket.cz/)

KASA FIK Pokladna vám umožní rychle a spolehlivě ověřovat platnost vstupenek prodaných přes [QR Ticket](https://qrticket.cz/). Tuto funkci využijete především při kontrole vstupu na akce, sportoviště, koncerty nebo v kioskovém režimu.

## Co potřebujete k propojení

- **Partnerství s QR Ticket**: Musíte mít s QR Ticket smlouvu a prodávat přes ně vstupenky.
- **Váš QR Ticket autorizační token**: Speciální kód, který propojí vaši KASA FIK pokladnu se systémem QR Ticket. Token získáte přímo od společnosti [QR Ticket](https://qrticket.cz/). Kontaktujte je a vyžádejte si ho. Bez něj propojení nebude fungovat.
- **Aplikaci KASA FIK Pokladna**: Ujistěte se, že ji máte nainstalovanou a funkční.
- **Stabilní internetové připojení**: KASA FIK potřebuje internet pro online ověření a stahování dat o vstupenkách.
- **Čtečka čárových/QR kódů**: Zařízení pro skenování kódů ze vstupenek, připojené k pokladně nebo kiosku.

## Nastavení propojení

1. **Získejte token od QR Ticket**: Než začnete v KASA FIK, ujistěte se, že máte od QR Ticket připravený váš autorizační token.
2. Otevřete **KASA FIK Pokladna**.
3. Přejděte do **Nastavení**.
4. Vyberte **Expertní nastavení**.
5. Klepněte na položku **QR Ticket**.
6. Do zobrazeného pole zadejte váš **autorizační token a kód akce** - odděleno dvojtečkou. Napříkad:

`qrk7x0IMALhRrw7s3VlVY6xKXtyxxxxxxx:QFIFXXX`

[![Screenshot from 2026-03-06 12-03-04.png](https://manual.kasafik.cz/uploads/images/gallery/2026-03/scaled-1680-/klIEUhZTxoJ1p83i-screenshot-from-2026-03-06-12-03-04.png)](https://manual.kasafik.cz/uploads/images/gallery/2026-03/klIEUhZTxoJ1p83i-screenshot-from-2026-03-06-12-03-04.png)

[![image.png](https://manual.kasafik.cz/uploads/images/gallery/2026-03/scaled-1680-/FC5CATG9GinQp3nS-image.png)](https://manual.kasafik.cz/uploads/images/gallery/2026-03/FC5CATG9GinQp3nS-image.png)

## Nastavení způsobu validace (pokladna / kiosek)

Po vložení tokenu je propojení aktivní. Nyní si nastavte, jak budete validaci spouštět:

- **Na běžné pokladně**: Doporučujeme nastavit funkční klávesu (tlačítko na obrazovce nebo klávesnici), která spustí režim skenování vstupenky. Nastavení funkčních kláves najdete v Nastavení KASA FIK (přesné umístění se může lišit, hledejte sekci "Pokladna" nebo "[Funkční klávesy](https://manual.kasafik.cz/books/kasa-fik-pokladna/page/funk%C4%8Dn%C3%AD-kl%C3%A1vesy "Funkční klávesy")"). Přiřaďte jedné z kláves akci pro validaci QR Ticket.
- **V kioskovém režimu**: Validace může probíhat automaticky po naskenování vstupenky. Nastavení kioskového režimu a automatické validace často vyžaduje pomoc specialisty podpory KASA FIK.

[![Screenshot from 2026-03-06 12-05-58.png](https://manual.kasafik.cz/uploads/images/gallery/2026-03/scaled-1680-/rYa0NpzomDyium8o-screenshot-from-2026-03-06-12-05-58.png)](https://manual.kasafik.cz/uploads/images/gallery/2026-03/rYa0NpzomDyium8o-screenshot-from-2026-03-06-12-05-58.png)

## Jak používat validaci vstupenek při vstupu

1. Návštěvník vám předloží vstupenku (vytištěnou nebo v telefonu).
2. **Pokud používáte běžnou pokladnu**: Stiskněte nastavenou **funkční klávesu** pro validaci QR Ticket.  
    **Pokud používáte kiosek**: Kiosek je připraven a čeká na skenování.
3. Pomocí čtečky naskenujte čárový kód nebo QR kód ze vstupenky.
4. KASA FIK se přes internet spojí se systémem QR Ticket a ověří platnost vstupenky.
5. Na obrazovce KASA FIK se okamžitě zobrazí výsledek:
    
    
    - **Vstupenka je platná**: Zobrazí se potvrzení (případně detaily jako typ vstupenky, zóna). Návštěvníka můžete pustit.
    - **Vstupenka je neplatná**: Zobrazí se důvod (např. již použitá, neexistuje, neplatná pro daný den). Návštěvníka byste neměli pustit.
6. KASA FIK zároveň **uplatní vstupenku** v systému QR Ticket, aby ji nebylo možné použít znovu.

## Co když se objeví chyba?

Pokud KASA FIK hlásí problém s validací, zkontrolujte:

- Zda máte **funkční internetové připojení** (aplikace sice pracuje s offline daty, ale pro online ověření a uplatnění je internet nutný).
- Zda jste **správně naskenovali kód**.
- Zda máte **správně vložený autorizační token** v nastavení KASA FIK.
- **Přečtěte si důvod chyby** zobrazený na obrazovce (např. "Vstupenka již použita").

## Potřebujete pomoct?

- V případě problémů s nastavením v aplikaci KASA FIK nebo s kioskovým režimem kontaktujte **podporu KASA FIK**.
- V případě problémů s vaším autorizačním tokenem nebo s daty o vstupenkách v systému QR Ticket kontaktujte **podporu [QR Ticket](https://qrticket.cz/)**.

# KASA FIK MCP Server

## Co je to MCP server pro Pokladnu?

MCP (Model Context Protocol) je otevřený protokol, který umožňuje AI nástrojům (jako je Claude Desktop, ChatGPT nebo OpenAI Codex) komunikovat přímo s vašimi daty v KASA FIK.

Díky MCP serveru nemusíte otevírat dashboard, exportovat CSV ani ručně kopírovat čísla. Stačí se zeptat přirozeným jazykem a AI odpoví na základě živých dat z vaší provozovny.

---

## K čemu se MCP server hodí?

Tržby a vše kolem prodeje teď vyřídíte přímo v AI chatu. Místo ručního proklikávání prostě napište třeba "Ukaž mi, jaké byly mé tržby za včerejšek a které produkty se prodávaly nejvíce" – a AI vám výsledek přehledně zobrazí.

Díky MCP serveru můžete:

- zjistit denní, týdenní nebo měsíční tržby
- vyhledat nejlépe a nejhůře prodávané produkty
- zkontrolovat aktuální stav zásob
- získat přehled o průměrné hodnotě transakce
- zjistit počet unikátních zákazníků za dané období

V beta verzi je k dispozici pouze čtení dat. Zápisové operace (tvorba slev, úprava zásob, refundace) zatím nejsou podporovány.

---

## Kolik za propojení s AI zaplatíte?

Samotné napojení AI na KASA FIK je v beta verzi zdarma. MCP volání nejsou aktuálně omezena ani počítána do žádných limitů.

Po ukončení beta verze a ostrém release bude toto propojení zpoplatněno jako prémiový add-on. O přesných podmínkách vás budeme včas informovat.

---

## Jak propojím KASA FIK s AI?

Oproti jiným integracím zde nemusíte složitě generovat API klíče ručně. Stačí si vygenerovat token v Backoffice KASA FIK, zadat adresu MCP serveru do vašeho AI nástroje a propojení je hotové.

Níže najdete konkrétní postup pro váš AI nástroj.

---

### Krok 1: Získání přístupového tokenu

1. Přihlaste se do Backoffice KASA FIK
2. Přejděte do sekce Nastavení → MCP servery (nebo použijte přímý odkaz z vašeho uvítacího emailu)
3. Klikněte na Vytvořit nový token
4. Token si pojmenujte (např. "Claude pro provozovnu Hlavní")
5. Zkopírujte vygenerovaný token – po opuštění stránky už ho nebude možné znovu zobrazit

Podrobný návod krok za krokem najdete v samostatné příručce Správa MCP tokenů v Backoffice.

---

### Krok 2: Propojení s vaším AI nástrojem

Vyberte níže váš AI nástroj.

---

#### Jak propojím KASA FIK s ChatGPT (OpenAI)

1. Otevřete ChatGPT a vlevo dole klikněte na své jméno, poté na Nastavení
2. V levém seznamu klikněte na Aplikace → Rozšířené nastavení
3. Aktivujte Režim vývojáře kliknutím na posuvník – nechte ho zapnutý i po dokončení nastavení
4. Klikněte na tlačítko Vytvořit aplikaci
5. Do pole Název zadejte například "KASA FIK"
6. Do pole URL serveru MCP vložte adresu: `https://api.kasafik.cz/mcp/v1/`
7. Klikněte na Vytvořit
8. Zobrazí se formulář pro autorizaci – vložte svůj token z Backoffice a potvrďte

Poznámka: Režim vývojáře musí zůstat zapnutý, jinak propojení přestane fungovat. Pokud vám to nevyhovuje, doporučujeme použít Claude Desktop.

---

#### Jak propojím KASA FIK s Claude Desktop (Anthropic)

1. Otevřete Claude Desktop
2. V levém postranním panelu klikněte na Customize
3. Vlevo vyberte Connectors a kliknutím na tlačítko plus přidejte Add custom connector
4. Do pole Name zadejte například "KASA FIK"
5. Do pole Remote MCP server URL vložte adresu: `https://api.kasafik.cz/mcp/v1/`
6. Potvrďte kliknutím na Add
7. Zobrazí se formulář pro autorizaci – vložte svůj token z Backoffice a potvrďte
8. Vrátíte se zpět do Claude, kde můžete případně upravit jednotlivá oprávnění

---

#### Jak propojím KASA FIK s OpenAI Codex

1. Otevřete Codex
2. Vlevo dole klikněte na Nastavení → Nastavení
3. V levém postranním panelu klikněte na MCP servery a pak na Přidat server
4. Do pole Název napište například "KASA FIK"
5. Klikněte na Streamovatelné HTTP
6. Do pole URL vložte adresu: `https://api.kasafik.cz/mcp/v1/`
7. Klikněte na Uložit
8. V seznamu připojených serverů klikněte na Ověřit se
9. Zobrazí se formulář pro autorizaci – vložte svůj token z Backoffice a potvrďte

---

### Krok 3: První dotaz

Po úspěšném propojení můžete začít pokládat dotazy. Zkuste například:

- "Jaké byly mé celkové tržby za dnešek?"
- "Ukaž mi 5 nejprodávanějších produktů tento týden."
- "Kolik transakcí jsem měl včera?"
- "Mám nějaký produkt pod minimální zásobou?"
- "Který den v minulém týdnu byl nejsilnější?"

AI odpovídá česky (pokud se zeptáte česky) a data zobrazuje přehledně jako tabulku nebo seznam.

---

## Jak zruším propojení s AI v KASA FIK?

Propojení zrušíte ve dvou krocích:

**V KASA FIK Backoffice:**
1. Přejděte do Nastavení → MCP servery
2. U příslušného tokenu klikněte na Zrušit přístup nebo token smažte

**Ve vašem AI nástroji:**
- ChatGPT: Nastavení → Aplikace → KASA FIK → tři tečky → Odstranit
- Claude: Customize → Connectors → KASA FIK → Disconnect
- Codex: Nastavení → MCP servery → ozubené kolečko → Odinstalovat

---

## Jak bezpečně pracovat s AI?

**Zkontrolujte výsledek.** Jako každý nástroj, i AI se občas splete. Vždy si ověřte důležité údaje.

**Sdílejte jen to, co je potřeba.** Do chatu zadávejte pouze dotazy, které AI potřebuje k danému úkolu. Citlivá data (hesla, čísla karet, osobní údaje zákazníků) tam nepatří. Počítejte s tím, že data procházejí přes poskytovatele AI.

**Používejte oficiální zdroje.** Claude Desktop stahujte z webu Anthropic, ChatGPT z webu OpenAI. Připojujte jen služby, kterým důvěřujete.

**Ponechte si poslední slovo.** U důležitých akcí (byť je v beta verzi nemůžete provádět) si nejdřív nechte od AI navrhnout, co chce udělat – a potvrďte to, až si ověříte, že je vše v pořádku.

**Co AI v účtu smí (a co ne):**
- V beta verzi: pouze čtení tržeb, produktů, zásob a základních statistik
- Nemá přístup k úpravám, mazání, refundacím ani ke správě uživatelů
- Každý dotaz je omezen na vašeho tenanta – AI nevidí data jiných provozoven

**Autorizace přes token.** Žádná hesla, AI dostane jen omezený přístupový token, který v Backoffice můžete kdykoliv zneplatnit.

---

## Omezení beta verze

- Není podporován hromadný export (např. "dej mi všechny transakce za rok") – maximálně 1000 řádků na dotaz
- Nelze provádět srovnání s předchozími roky (pouze aktuální a předchozí měsíc)
- Zákaznická data jsou anonymizovaná (místo jmen vidíte jen identifikátory)
- Nefunguje offline – vyžaduje internetové připojení
- Maximálně 60 dotazů za minutu na jeden token

---

## Časté dotazy

**Musím mít v ChatGPT trvale zapnutý režim vývojáře?**
Ano, režim vývojáře musí zůstat zapnutý, jinak propojení s KASA FIK přestane fungovat. Pokud vám to nevyhovuje, vyzkoušejte Codex (také od OpenAI a funguje se stejným předplatným) nebo Claude Desktop – tam toto omezení není.

**Mohu použít jiné AI než Claude, OpenCode, ChatGPT nebo Codex?**
Teoreticky ano, pokud podporují MCP protokol.

**Může MCP server používat více zaměstnanců?**
Ano, ale každý potřebuje vlastní token. Tokeny nesdílejte – v logu vidíme, kdo co dotazoval.

**Co když zapomenu token?**
Token nelze znovu zobrazit. Pokud ho ztratíte, vytvořte v Backoffice nový a starý zrušte.

---

## Podpora a zpětná vazba

Jste mezi prvními uživateli MCP v České republice. Vaše zkušenosti jsou pro nás klíčové.

Technické problémy: podpora@kasafik.cz