{
  "asyncapi": "3.0.0",
  "info": {
    "title": "IDM",
    "version": "v1",
    "description": "**[AsyncAPI standard ](https://www.asyncapi.com/en)**\n\rAsyncAPI json definice ke stažení **[zde](./asyncapi.json)**<details>\r\n<summary>\r\n<b><font size=\"5\">Základní popis rozhraní</font></b>\r\n</summary>\r\n Identity management (dále IDM) využívá k příjmu a zasílání zpráv message brokera RabbitMQ implementujícího protokol <b>AMQP</b> pro exchange a queue a protokol <b>Binary</b> pro superstreamy. IDM slouží ke kompletní správě identit, který zahrnuje tyto entity: osoby, uživatele, mandáty a číselník mandátů.\r\n\r Klienti zasílají zprávy na definovaný vstupní exchange IDM_Request, který je společný pro všechny klienty.\r\n\r\n1. K autentizaci a autorizaci klientského volání slouží klientský certifikát použitý k navázání spojení s message brokerem. Požadavky na klientský certifikát jsou stanoveny níže. Různé implementace klientského systému budou ověřeny svým klientským certifikátem.\r\n2. K validaci těla požadavku dle JSON schématu dojde až při předání a zpracování importní dávky aplikační logikou IDM.\n\r\n\r Klienti mají dále možnost vyčítat jednotlivé entity pomocí definované Queue IDM_Events_$KodExtSys.\r\n\r\n1. K autentizaci a autorizaci klientského volání slouží klientský certifikát použitý k navázání spojení s message brokerem. Požadavky na klientský certifikát jsou stanoveny níže. Různé implementace klientského systému budou ověřeny svým klientským certifikátem.\n\r\n\r Klienti mají dále možnost jednorázové synchronizace dat pomocí definované Queue IDM_Synchro_$KodExtSys.\r\n\r\n1. K autentizaci a autorizaci klientského volání slouží klientský certifikát použitý k navázání spojení s message brokerem. Požadavky na klientský certifikát jsou stanoveny níže. Různé implementace klientského systému budou ověřeny svým klientským certifikátem.\n\r\n\r Klienti mají dále možnost vyčítat jednotlivé entity pomocí definovaného Superstreamu IDM_Events_Superstram.\r\n\r\n1. K autentizaci a autorizaci klientského volání slouží klientský certifikát použitý k navázání spojení s message brokerem. Požadavky na klientský certifikát jsou stanoveny níže. Různé implementace klientského systému budou ověřeny svým klientským certifikátem.\n\r\n\r Klienti mají dále možnost jednorázové synchronizace dat pomocí definovaného Superstreamu  IDM_Synchro_Superstram.\r\n\r\n1. K autentizaci a autorizaci klientského volání slouží klientský certifikát použitý k navázání spojení s message brokerem. Požadavky na klientský certifikát jsou stanoveny níže. Různé implementace klientského systému budou ověřeny svým klientským certifikátem.\n\r\n\r\n\r\n\r\r\n\r\n\r\n</details>\r\n\r\n<details>\r\n<summary>\r\n<b><font size=\"5\">Technická specifikace message brokera</font></b>\r\n</summary>\r\n\r\n<details>\r\n<summary>\r\n<b><font size=\"4\">Postup vytvoření certifikátu</font></b>\r\n</summary>\r\n \r\n\r\n1. Správce externího systému vygeneruje privátní klíč s RSA 4096</br>  **[Návod k vygenerování](https://docs.openssl.org/master/man1/openssl-genrsa/)**\r\n\r\n2. Správce externího systém vygeneruje CSR soubor (certificate singing request) podepsaný privátním klíčem viz bod 1</br>  **[Návod k vygenerování](https://docs.openssl.org/master/man1/openssl-req/)**\r\n\r\n3. Správce externího systému předá vygenerovaný CSR soubor provozovateli NIPEZ prostřednictvím ServiceDesku NIPEZ. Provozovatel NIPEZ podepíše CSR soubor interní certifikační autoritou NIPEZ a předá zpět správci externího systému. Pro aktualizaci certifikátu je nutné postupovat dle **[Aktualizace certifikátu](https://podpora.nipez.cz/cs/pravidla-pouziti-registru-verejnych-zakazek/latest/aktualizace-certifikatu)**\r\n\r\n4. Správce externího systému si spáruje předaný certifikát se svým privátním klíčem. Takto vzniklý certifikát je připraven pro komunikaci s rozhraním message brokera.</br> **[Návod ke spárování](https://docs.openssl.org/master/man1/openssl-pkcs12/)**</details><details>\r\n<summary>\r\n<b><font size=\"4\">Pravidla pro potvrzení přečtení zpráv z fronty 🚩</font></b>\r\n</summary>\r\n\r\nPravidla pro potvrzení zpracování zpráv vychází ze standardu samotného protokolu AMQP viz **[odkaz](https://www.rabbitmq.com/docs/confirms)** . Níže jsou popsány spravné možnosti jak potvrdit přijetí zprávy.\r\n \r\n\r\n1. Úspěšné přijetí a zpracování zprávy potvrdí externí systém <b>ACK</b> \r\n\r\n2. Pokud zprávu nelze zpracovat ani při opětovném stažení zprávy např. z důvodu její nevalidity, zpráva se odmítne <b>NACK</b> s parametrem <b>requeue = false</b> \r\n\r\n3. Na neúspěšné zpracování zprávy z důvodu dočasného problému na straně externího systému lze reagovat dvěma způsoby: <p>\r\n3.1. <u>Žádná odpověd:</u> Externí systém má 30 minut na potvrzení zpracování zprávy. Pokud do tohoto limitu nedojde k potvrzení nebo zamítnutí zpracování zprávy, dojde k odpojení externího systému a nepotvrzená zpráva se vrací do původní fronty, odkud ji lze po opětovném připojení znovu vyčíst. (tento časový limit je nakonfigurován na straně message brokera - jako tzv. consumer timeout). <p>\r\n3.2. <u>Dočasné odmítnutí:</u> Externí systém může zpracování zprávy odmítnout <b>NACK</b> s parametrem <b>requeue = true</b>. Je vhodné na straně externího systému zpracování zprávy pozdržet a odmítnout až po určité časové prodlevě. V případě, že dojde k takovému odmítnutí, zpráva je ihned opětovně zařazena do původní fronty. Limit na počet opakovaní čtení zprávy je nastaven na straně message brokera pomocí delivery limit na hodnotu 20 pokusů. \r\n</details><details>\r\n<summary>\r\n<b><font size=\"4\">Pravidla pro připojení k jednotlivým superstreamům 🚩</font></b>\r\n</summary>\r\n\r\n Jednotlivé [streamy](https://www.rabbitmq.com/docs/streams) jsou implementovány až v N instancích a vždy jsou indexovány od 0. Superstreamy využívají Binary protokol, pro který je potřeba implementovat dll viz [odkaz.](https://github.com/rabbitmq/rabbitmq-server/blob/main/deps/rabbitmq_stream/docs/PROTOCOL.adoc) \r\n\r\n Instance IDM_Events_Superstream\r\n - IDM_Events_Superstream-0\r\n - IDM_Events_Superstream-1\r\n - IDM_Events_Superstream-2\r\n\r\nInstance IDM_Synchro_Superstream\r\n- IDM_Synchro_Superstream-0\r\n- IDM_Synchro_Superstream-1\r\n- IDM_Synchro_Superstream-2\r\n\r\nKompletní kód pro správně nakonfigurovaného klienta v roli consumera superstreamů je ke stažení **[zde.](./Consumer.txt)**  Pro správnou funknčnost je potřeba validní konfigurace těchto parametrů:\r\n - Povolení SuperStream konzumace - automaticky napojí 1 consumera na každý dílčí stream</br> <u>IsSuperStream = true</u> \r\n - Povolení Single Active Consumer (SAC) - pouze jeden consumer na dílčí stream je aktivní. Tento parametr zajišťuje zaručené pořadí doručení jednotlivých zpráv.</br> <u>IsSingleActiveConsumer = true</u>\r\n - SAC skupina = $KodExtSys - Jedná se o skupinu klientů (nodes), kteří zajišťují komunikaci pro jednoho klienta/mikroslužbu. Zajišťuje vysokou prostupnost.</br>  <u>Reference = $KodExtSys</u>\r\n - V rámci každé single active consumer skupiny je pro každý dílčí stream na straně serveru uložen Offset, který indikuje poslední staženou zprávu z dílčího streamu. Pokud klient navazuje spojení poprvé, připojí se na začátek streamu (new OffsetTypeFirst()). Pokud už byl někdy ke streamu připojen, získá aktuální hodnotu Offsetu pro svou SAC skupinu a pokračuje od aktuálního Offsetu (new OffsetTypeOffset()). Klient musí Offset pravidelně aktualizovat, doporučujeme interval 1 minuty (není možné Offset aktualizovat po každé přijaté zprávě, jelikož by došlo k zahlcení jednotlivých streamů). \r\n\r Pro podrobnější informace jak vytvořit consumera pro čtení jednotlivých streamů příkládáme RabbitMQ [dokumentaci.](https://rabbitmq.github.io/rabbitmq-stream-dotnet-client/stable/htmlsingle/index.html#creating-a-consumer)\r\n</details>\r\n<details>\r\n<summary>\r\n<b><font size=\"4\">Verzování 🚧</font></b>\r\n</summary>\r\n\r\nVerze budou postupně inkrementovány a budou k dispozici současně vždy maximálně 2 verze:\r\n - Aktuální verze\r\n - Předchozí verze, pokud prozatím neuplynula doba stanovená pro adaptaci aktuální verze.\r\n\r\nČíslování verzí odpovídá specifikaci [SemVer](https://semver.org/lang/cs/), tedy:\r\n- první číslo(major) se mění pokud jsou do api přidány nekompatibilní změny. *(Se změnou se vydává nová verze a aktuální se označí jako předchozí, avšak stále bude k dispozici)*\r\n- druhé číslo(minor) se mění pokud jsou do api předány změny, které jsou plně kompatibilní *(Není třeba vytvářet novou verzi, jelikož jsou změn kompatibilní)*\r\n- třetí číslo(patch) obsahuje opravy chyb *(Opravy chyb jsou vždy přidány jak do aktuální tak předchozí verze)*\r\n</details>\r\n</details>\r\n\r\n---\r\n\r\n<b><font size=\"5\">Seznam změn 🚀 </font></b>\r\n### Aktuální verze\r\n\r\n<details>\r\n<summary>\r\n1.4.4\r\n</summary>\r\n\r\n#### ✨ Přidáno\r\n- Rozšíření zprávy IDM_Mandaty o zdrojMandatu - pouze při vyčítání dané zprávy \r\n\r\n####\r\n\r\n\r\n\r\n#### 🔧 Změněno\r\n- Formát datumVzniku a datumZaniku u zprávy IDM_Mandaty \r\n\r\n####\r\n\r\n</details>\r\n\r\n### Předchozí verze\r\n<details>\r\n<summary>\r\nseznam verzí\r\n</summary>\r\n\r\n<details>\r\n<summary>\r\n1.4.3\r\n</summary>\r\n\r\n#### ✨ Přidáno\r\n- Rozšíření zprávy IDM_CiselnikMandatu o typ - Obecne \n- Rozšíření zprávy IDM_Osoby o typ osoby \n-  Rozšíření zprávy IDM_Uzivatele o typ uživatele \r\n\r\n####\r\n\r\n</details>\r\n\r\n<details>\r\n<summary>\r\n1.4.2\r\n</summary>\r\n\r\n#### ✨ Přidáno\r\n- Rozšíření zprávy IDM_Osoby o cisloPopisne a cisloOrientacni \n-  Minimální délka pro hodnotu ico u zprávy IDM_Osoby\r\n\r\n#### 🔧 Změněno\r\n- Formát pravniForma a ulice u zprávy IDM_Osoby \r\n\r\n####\r\n\r\n####\r\n\r\n</details>\r\n\r\n<details>\r\n<summary>\r\n1.4.1\r\n</summary>\r\n\r\n#### 🔧 Změněno\n-  Aktualizovaný seznam Headers zasílaných u zpráv pro jednotlivé typy fronty - Quorum a Superstream\r\n\r\n####\r\n\r\n\r\n\r\n#### ✨ Přidáno\r\n- Detailnější popis vytvoření klienta v roli consumera pro čtení jednotlivých Superstreamů\r\n\r\n####\r\n\r\n####\r\n\r\n</details>\r\n\r\n<details>\r\n<summary>\r\n1.4.0\r\n</summary>\r\n\r\n#### 🔧 Změněno\n-  Formát statniObcanstvi u zprávy IDM_Uzivatele\n-  Formát zeme u zprávy IDM_Osoby\r\n\r\n####\r\n\r\n\r\n\r\n#### ✨ Přidáno\r\n- Napojení na jednotlivé Superstreamy\r\n\r\n####\r\n\r\n####\r\n\r\n</details>\r\n\r\n<details>\r\n<summary>\r\n1.3.0\r\n</summary>\r\n\r\n#### 🔧 Změněno\r\n- Opravena malá písmena u vhostu\r\n\r\n####\r\n\r\n</details>\r\n\r\n<details>\r\n<summary>\r\n1.2.0\r\n</summary>\r\n\r\n#### 🔧 Změněno\r\n- Doplnění pravidel párování osoby o strukturu <b>typOsoby</b> při použití jiného identifikátoru než <b>nipezIdOsoby</b>\r\n\r\n####\r\n\r\n\r\n\r\n#### ✨ Přidáno\r\n- Zpráva IDM_Mandaty - Rozšířena o strukturu nipezIdObjektuRVZ\r\n\r\n####\r\n\r\n\r\n\r\n#### 🗑️ Odebráno\r\n- Zpráva IDM_Mandaty - Odebrána struktura evidencniCisloVZ\r\n\r\n####\r\n\r\n</details>\r\n\r\n<details>\r\n<summary>\r\n1.1.1\r\n</summary>\r\n\r\n#### 🔧 Změněno\r\n- Zjednodušení struktury dokumentace - změna popisu operací\r\n\r\n####\r\n\r\n</details>\r\n\r\n<details>\r\n<summary>\r\n1.1.0\r\n</summary>\r\n\r\n#### ✨ Přidáno\r\n- Zprávy IDM_Osoby a IDM_Mandaty - Rozšířeny o identifikaceOsoby, která nově obsahuje:\r\n\t- typOsoby \r\n\t- ico \r\n\t- dalsiRozliseni\r\n\t- nipezIdOsoby\r\n\r\n#### 🔧 Změněno\r\n- Zprávy IDM_Osoby a IDM_Mandaty - Nově obsahují údaj ico zanořený v identifikaceOsoby\r\n- Zpráva IDM_Mandaty - Odstraněna povinnost údaje nipezIdUzivatele\r\n\r\n\r\n\r\n</details>\r\n\r\n<details>\r\n<summary>\r\n1.0.0\r\n</summary>\r\n\rPrvní publikovaná verze API.<br /> \r\n\r\n\r\n\r\n</details>\r\n\r\n\r\n\r\n\r\n",
    "license": {
      "name": "RabbitMQ",
      "url": "https://www.rabbitmq.com/"
    }
  },
  "defaultContentType": "application/json",
  "servers": {
    "RabbitMQ_Cluster_Quorum": {
      "host": "esb.nipez.cz:5671/IDM",
      "protocol": "amqps",
      "protocolVersion": "0.9.1 a 1.0 (TLS)",
      "description": "RabbitMQ_Cluster_Quorum server",
      "security": [
        {
          "$ref": "#/components/securitySchemes/certs"
        }
      ]
    },
    "RabbitMQ_Cluster_Superstream": {
      "host": "esb.nipez.cz:5551/IDM",
      "protocol": "binary",
      "description": "RabbitMQ_Cluster_Superstream server",
      "security": [
        {
          "$ref": "#/components/securitySchemes/certs"
        }
      ]
    }
  },
  "channels": {
    "Exchange IDM_Request": {
      "address": "IDM_Request",
      "servers": [
        {
          "$ref": "#/servers/RabbitMQ_Cluster_Quorum"
        }
      ],
      "messages": {
        "IDM_Osoby": {
          "$ref": "#/components/messages/IDM_Osoby"
        },
        "IDM_Mandaty": {
          "$ref": "#/components/messages/IDM_Mandaty"
        }
      },
      "bindings": {
        "amqp": {
          "exchange": {
            "name": "IDM_Request",
            "type": "direct",
            "durable": true,
            "autoDelete": false,
            "vhost": "IDM"
          }
        }
      }
    },
    "Queue IDM_Events_$KodExtSys": {
      "address": "IDM_Events_$KodExtSys",
      "description": "$KodExtSys - Kód externího systému",
      "servers": [
        {
          "$ref": "#/servers/RabbitMQ_Cluster_Quorum"
        }
      ],
      "messages": {
        "IDM_Osoby": {
          "$ref": "#/components/messages/IDM_Osoby"
        },
        "IDM_Uzivatele": {
          "$ref": "#/components/messages/IDM_Uzivatele"
        },
        "IDM_Mandaty": {
          "$ref": "#/components/messages/IDM_Mandaty"
        },
        "IDM_CiselnikMandatu": {
          "$ref": "#/components/messages/IDM_CiselnikMandatu"
        }
      },
      "bindings": {
        "amqp": {
          "is": "queue",
          "queue": {
            "name": "IDM_Events_$KodExtSys",
            "type": "quoruma",
            "durable": true,
            "exclusive": false,
            "autoDelete": false,
            "vhost": "IDM"
          }
        }
      }
    },
    "Queue IDM_Synchro_$KodExtSys": {
      "address": "IDM_Synchro_$KodExtSys",
      "description": "$KodExtSys - Kód externího systému",
      "servers": [
        {
          "$ref": "#/servers/RabbitMQ_Cluster_Quorum"
        }
      ],
      "messages": {
        "IDM_Osoby": {
          "$ref": "#/components/messages/IDM_Osoby"
        },
        "IDM_Uzivatele": {
          "$ref": "#/components/messages/IDM_Uzivatele"
        },
        "IDM_Mandaty": {
          "$ref": "#/components/messages/IDM_Mandaty"
        },
        "IDM_CiselnikMandatu": {
          "$ref": "#/components/messages/IDM_CiselnikMandatu"
        }
      },
      "bindings": {
        "amqp": {
          "is": "queue",
          "queue": {
            "name": "IDM_Synchro_$KodExtSys",
            "type": "quorum",
            "durable": true,
            "exclusive": false,
            "autoDelete": false,
            "vhost": "IDM"
          }
        }
      }
    },
    "Superstream IDM_Events_Superstream": {
      "address": "IDM_Events_Superstream",
      "servers": [
        {
          "$ref": "#/servers/RabbitMQ_Cluster_Superstream"
        }
      ],
      "messages": {
        "IDM_Osoby": {
          "$ref": "#/components/messages/IDM_Osoby"
        },
        "IDM_Uzivatele": {
          "$ref": "#/components/messages/IDM_Uzivatele"
        },
        "IDM_Mandaty": {
          "$ref": "#/components/messages/IDM_Mandaty"
        },
        "IDM_CiselnikMandatu": {
          "$ref": "#/components/messages/IDM_CiselnikMandatu"
        }
      },
      "bindings": {
        "x-binary": {
          "is": "superstream",
          "superstream": {
            "name": "IDM_Events_Superstream",
            "vhost": "IDM",
            "max-age": "7D",
            "max-length-bytes": "3 000 000 000"
          }
        }
      }
    },
    "Superstream IDM_Synchro_Superstream": {
      "address": "IDM_Synchro_Superstream",
      "servers": [
        {
          "$ref": "#/servers/RabbitMQ_Cluster_Superstream"
        }
      ],
      "messages": {
        "IDM_Osoby": {
          "$ref": "#/components/messages/IDM_Osoby"
        },
        "IDM_Uzivatele": {
          "$ref": "#/components/messages/IDM_Uzivatele"
        },
        "IDM_Mandaty": {
          "$ref": "#/components/messages/IDM_Mandaty"
        },
        "IDM_CiselnikMandatu": {
          "$ref": "#/components/messages/IDM_CiselnikMandatu"
        }
      },
      "bindings": {
        "x-binary": {
          "is": "superstream",
          "superstream": {
            "name": "IDM_Synchro_Superstream",
            "vhost": "IDM",
            "max-age": "1H",
            "max-length-bytes": "3 000 000 000"
          }
        }
      }
    }
  },
  "operations": {
    "IDM_Request": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/Exchange IDM_Request"
      },
      "messages": [
        {
          "$ref": "#/channels/Exchange IDM_Request/messages/IDM_Osoby"
        },
        {
          "$ref": "#/channels/Exchange IDM_Request/messages/IDM_Mandaty"
        }
      ]
    },
    "IDM_Events": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/Queue IDM_Events_$KodExtSys"
      },
      "messages": [
        {
          "$ref": "#/channels/Queue IDM_Events_$KodExtSys/messages/IDM_Osoby"
        },
        {
          "$ref": "#/channels/Queue IDM_Events_$KodExtSys/messages/IDM_Uzivatele"
        },
        {
          "$ref": "#/channels/Queue IDM_Events_$KodExtSys/messages/IDM_Mandaty"
        },
        {
          "$ref": "#/channels/Queue IDM_Events_$KodExtSys/messages/IDM_CiselnikMandatu"
        }
      ]
    },
    "IDM_Synchro": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/Queue IDM_Synchro_$KodExtSys"
      },
      "messages": [
        {
          "$ref": "#/channels/Queue IDM_Synchro_$KodExtSys/messages/IDM_Osoby"
        },
        {
          "$ref": "#/channels/Queue IDM_Synchro_$KodExtSys/messages/IDM_Uzivatele"
        },
        {
          "$ref": "#/channels/Queue IDM_Synchro_$KodExtSys/messages/IDM_Mandaty"
        },
        {
          "$ref": "#/channels/Queue IDM_Synchro_$KodExtSys/messages/IDM_CiselnikMandatu"
        }
      ]
    },
    "IDM_Events_Superstream": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/Superstream IDM_Events_Superstream"
      },
      "messages": [
        {
          "$ref": "#/channels/Queue IDM_Synchro_$KodExtSys/messages/IDM_Osoby"
        },
        {
          "$ref": "#/channels/Queue IDM_Synchro_$KodExtSys/messages/IDM_Uzivatele"
        },
        {
          "$ref": "#/channels/Queue IDM_Synchro_$KodExtSys/messages/IDM_Mandaty"
        },
        {
          "$ref": "#/channels/Queue IDM_Synchro_$KodExtSys/messages/IDM_CiselnikMandatu"
        }
      ]
    },
    "IDM_Synchro_Superstream": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/Superstream IDM_Synchro_Superstream"
      },
      "messages": [
        {
          "$ref": "#/channels/Queue IDM_Synchro_$KodExtSys/messages/IDM_Osoby"
        },
        {
          "$ref": "#/channels/Queue IDM_Synchro_$KodExtSys/messages/IDM_Uzivatele"
        },
        {
          "$ref": "#/channels/Queue IDM_Synchro_$KodExtSys/messages/IDM_Mandaty"
        },
        {
          "$ref": "#/channels/Queue IDM_Synchro_$KodExtSys/messages/IDM_CiselnikMandatu"
        }
      ]
    }
  },
  "components": {
    "messages": {
      "IDM_Osoby": {
        "traits": [
          {
            "$ref": "#/components/messageTraits/commonRabbitMQHeaders"
          }
        ],
        "payload": {
          "$ref": "#/components/schemas/IDM_Osoby"
        }
      },
      "IDM_Uzivatele": {
        "traits": [
          {
            "$ref": "#/components/messageTraits/commonRabbitMQHeaders"
          }
        ],
        "payload": {
          "$ref": "#/components/schemas/IDM_Uzivatele"
        }
      },
      "IDM_Mandaty": {
        "traits": [
          {
            "$ref": "#/components/messageTraits/commonRabbitMQHeaders"
          }
        ],
        "payload": {
          "$ref": "#/components/schemas/IDM_Mandaty"
        }
      },
      "IDM_CiselnikMandatu": {
        "traits": [
          {
            "$ref": "#/components/messageTraits/commonRabbitMQHeaders"
          }
        ],
        "payload": {
          "$ref": "#/components/schemas/IDM_CiselnikMandatu"
        }
      }
    },
    "messageTraits": {
      "commonRabbitMQHeaders": {
        "headers": {
          "type": "object",
          "properties": {
            "Delivery mode": {
              "description": "<b>Pouze u Exchange a Queue</b><br>2 = \"persistent\", 1 = \"transient\". ",
              "type": "string",
              "format": "byte",
              "enum": [
                2
              ],
              "default": 2
            },
            "Message ID": {
              "description": "Jednoznačný identifikátor zprávy, podle kterého klientský systém páruje odpověď z IDM.",
              "type": "string"
            },
            "User ID": {
              "description": "Identifikace zdrojového systému - $KodExtSys_$Prostredi. $KodExtSys_$Prostredi musí odpovídat hodnotě CN - Common name klientského certifikátu pro daný zdrojový systém. Pro produkční prostředí se _$Prostredi neuvádí.",
              "type": "string"
            },
            "Type": {
              "description": "<b>Pouze u Exchange a Queue</b><br>Název message",
              "type": "string",
              "enum": [
                "IDM_Osoby",
                "IDM_Uzivatele",
                "IDM_Mandaty",
                "IDM_CiselnikMandatu"
              ]
            },
            "Content type": {
              "type": "string",
              "enum": [
                "text/json"
              ],
              "default": "text/json"
            },
            "Subject": {
              "description": "<b>Pouze u Superstreamů</b><br>Identifikace zprávy",
              "type": "string",
              "enum": [
                "IDM.IDM_Osoby.#IDObjektu",
                "IDM.IDM_Uzivatele.#IDObjektu",
                "IDM.IDM_Mandaty.#IDObjektu",
                "IDM.IDM_CiselnikMandatu.#IDObjektu"
              ]
            },
            "Headers": {
              "type": "object",
              "properties": {
                "Version": {
                  "description": "Číslo verze IDM, kterou se má zpráva zpracovat",
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "schemas": {
      "IDM_Osoby": {
        "type": "object",
        "description": "Primární identifikátor osoby <b>nipezIdOsoby</b>, jinak kombinace údajů dle typu osoby:\r\n-  PO - Právnická osoba: <b>typOsoby, ico</b>\r\n- POPS - Právnická osoba podřízený subjekt: <b>typOsoby, ico, dalsiRozliseni</b>\r\n- FOP - Fyzická osoba podnikající: <b>typOsoby, ico</b>\r\n- OBI - Osoba bez IČO: <b>typOsoby, dalsiRozliseni</b>\r\n- ZO - Zahraniční osoba: <b>typOsoby, dalsiRozliseni</b>",
        "properties": {
          "osoby": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "identifikaceOsoby": {
                  "type": "object",
                  "properties": {
                    "typOsoby": {
                      "type": "string",
                      "example": "POPS",
                      "description": " \r\n-  PO - Právnická osoba\r\n- POPS - Právnická osoba podřízený subjekt\r\n- FOP - Fyzická osoba podnikající\r\n- OBI - Osoba bez IČO\r\n- ZO - Zahraniční osoba",
                      "enum": [
                        "PO",
                        "POPS",
                        "FOP",
                        "OBI",
                        "ZO"
                      ]
                    },
                    "ico": {
                      "type": "string",
                      "minLength": 8,
                      "maxLength": 8,
                      "example": 44992785,
                      "description": "IČO právnické osoby"
                    },
                    "dalsiRozliseni": {
                      "type": "string",
                      "maxLength": 256,
                      "example": "Městská část Brno-sever",
                      "description": "Všeobecný identifikátor, který se používá u těchto osob:\n  1. Právnická osoba - podřízený subjekt např.: Městská část Brno-sever\n  2. Osoba bez IČO ve formátu: Jmeno|Prijmeni|Datum narození - Mračena|Mrakomorová|1901-01-23\n  3. Zahraniční osoba: zahraniční IČO nebo jiný jednoznačný identifikátor"
                    },
                    "nipezIdOsoby": {
                      "type": "string",
                      "description": "Unikátní identifikátor osoby z CEO"
                    }
                  }
                },
                "uredniNazev": {
                  "type": "string",
                  "description": "Úřední název právnické osoby"
                },
                "pravniForma": {
                  "type": "string",
                  "minLength": 3,
                  "maxLength": 3,
                  "description": "Kódové označení právní formy dle číselníku 149 Českého statistického úřadu",
                  "example": 100
                },
                "adresaSidla": {
                  "type": "object",
                  "description": "Adresa sídla právnické osoby",
                  "properties": {
                    "obec": {
                      "type": "string",
                      "description": "Obec"
                    },
                    "ulice": {
                      "type": "string",
                      "description": "Název ulice"
                    },
                    "cisloPopisne": {
                      "type": "string",
                      "description": "Číslo popisné"
                    },
                    "cisloOrientacni": {
                      "type": "string",
                      "description": "Číslo orientační"
                    },
                    "psc": {
                      "type": "string",
                      "maxLength": 6,
                      "description": "PSČ"
                    },
                    "zeme": {
                      "type": "string",
                      "minLength": 2,
                      "maxLength": 2,
                      "description": "Kódové označení země dle ISO-3166, kód A-2",
                      "example": "CZ"
                    }
                  }
                },
                "telefon": {
                  "type": "string",
                  "description": "Telefonní kontakt"
                },
                "email": {
                  "type": "string",
                  "format": "email",
                  "description": "E-mailová adresa"
                },
                "typ": {
                  "type": "string",
                  "description": "Typ osoby",
                  "enum": [
                    "Dodavatel",
                    "Zadavatel",
                    "Dodavatel/Zadavatel"
                  ]
                }
              }
            }
          }
        },
        "required": [
          "osoby"
        ]
      },
      "IDM_Uzivatele": {
        "type": "object",
        "properties": {
          "uzivatele": {
            "type": "array",
            "items": [
              {
                "type": "object",
                "properties": {
                  "jmeno": {
                    "type": "string",
                    "description": "Jméno uživatele"
                  },
                  "prijmeni": {
                    "type": "string",
                    "description": "Příjmení uživatele"
                  },
                  "datumNarozeni": {
                    "type": "string",
                    "format": "date",
                    "example": "1901-01-23",
                    "description": "Datum narození uživatele - ISO 8601"
                  },
                  "statniObcanstvi": {
                    "type": "string",
                    "minLength": 2,
                    "maxLength": 2,
                    "description": "Kódové označení státního občanství uživatele dle ISO-3166, kód A-2",
                    "example": "CZ"
                  },
                  "nipezIdUzivatele": {
                    "type": "string",
                    "description": "Unikátní identifikátor uživatele z CEU"
                  },
                  "titul": {
                    "type": "string",
                    "description": "Titul před jménem"
                  },
                  "titulZa": {
                    "type": "string",
                    "description": "Titul za jménem"
                  },
                  "telefon": {
                    "type": "string",
                    "description": "Telefonní kontakt"
                  },
                  "email": {
                    "type": "string",
                    "format": "email",
                    "description": "E-mailová adresa"
                  },
                  "typ": {
                    "type": "string",
                    "description": "Typ uživatele",
                    "enum": [
                      "Dodavatel",
                      "Zadavatel",
                      "Dodavatel/Zadavatel"
                    ]
                  }
                },
                "required": [
                  "jmeno",
                  "prijmeni",
                  "nipezIdUzivatele"
                ]
              }
            ]
          }
        },
        "required": [
          "uzivatele"
        ]
      },
      "IDM_Mandaty": {
        "type": "object",
        "description": "Primární identifikátor osoby <b>nipezIdOsoby</b>, jinak kombinace údajů dle typu osoby:\r\n-  PO - Právnická osoba: <b>typOsoby, ico</b>\r\n- POPS - Právnická osoba podřízený subjekt: <b>typOsoby, ico, dalsiRozliseni</b>\r\n- FOP - Fyzická osoba podnikající: <b>typOsoby, ico</b>\r\n- OBI - Osoba bez IČO: <b>typOsoby, dalsiRozliseni</b>\r\n- ZO - Zahraniční osoba: <b>typOsoby, dalsiRozliseni</b>",
        "properties": {
          "mandaty": {
            "type": "array",
            "items": [
              {
                "type": "object",
                "properties": {
                  "kodMandatu": {
                    "type": "string",
                    "description": "Kód mandátu z číselníku mandátů"
                  },
                  "datumVzniku": {
                    "type": "string",
                    "format": "dateTime",
                    "example": "1901-01-23T14:30:00",
                    "description": "Datum vzniku oprávnění - ISO 8601"
                  },
                  "datumZaniku": {
                    "type": "string",
                    "format": "dateTime",
                    "example": "1901-01-23T14:30:00",
                    "description": "Datum zániku oprávnění - ISO 8601"
                  },
                  "identifikaceOsoby": {
                    "type": "object",
                    "properties": {
                      "typOsoby": {
                        "type": "string",
                        "example": "POPS",
                        "description": " \r\n-  PO - Právnická osoba\r\n- POPS - Právnická osoba podřízený subjekt\r\n- FOP - Fyzická osoba podnikající\r\n- OBI - Osoba bez IČO\r\n- ZO - Zahraniční osoba",
                        "enum": [
                          "PO",
                          "POPS",
                          "FOP",
                          "OBI",
                          "ZO"
                        ]
                      },
                      "ico": {
                        "type": "string",
                        "minLength": 8,
                        "maxLength": 8,
                        "example": 44992785,
                        "description": "IČO právnické osoby"
                      },
                      "dalsiRozliseni": {
                        "type": "string",
                        "maxLength": 256,
                        "example": "Městská část Brno-sever",
                        "description": "",
                        "Všeobecný identifikátor, který se používá u těchto osob": {
                          "1. Právnická osoba - podřízený subjekt např.": "Městská část Brno-sever",
                          "2. Osoba bez IČO ve formátu": "Jmeno|Prijmeni|Datum narození - Mračena|Mrakomorová|1901-01-23",
                          "3. Zahraniční osoba": "zahraniční IČO nebo jiný jednoznačný identifikátor"
                        }
                      },
                      "nipezIdOsoby": {
                        "type": "string",
                        "description": "Unikátní identifikátor osoby z CEO"
                      }
                    }
                  },
                  "nipezIdUzivatele": {
                    "type": "string",
                    "description": "Unikátní identifikátor uživatele z CEU"
                  },
                  "nipezIdObjektuRVZ": {
                    "type": "string",
                    "description": "Unikátní identifikátor objektu RVZ"
                  },
                  "platny": {
                    "type": "boolean",
                    "description": "Příznak platnosti oprávnění"
                  },
                  "zdrojMandatu": {
                    "type": "string",
                    "description": "$KodExtSys - Zdrojový systém oprávnění"
                  }
                },
                "required": [
                  "kodMandatu",
                  "datumVzniku",
                  "platny"
                ]
              }
            ]
          }
        },
        "required": [
          "mandaty"
        ]
      },
      "IDM_CiselnikMandatu": {
        "type": "object",
        "properties": {
          "ciselnikMandatu": {
            "type": "array",
            "items": [
              {
                "type": "object",
                "properties": {
                  "kod": {
                    "type": "string",
                    "description": "Kód mandátu"
                  },
                  "nazev": {
                    "type": "string",
                    "description": "Název mandátu"
                  },
                  "platny": {
                    "type": "boolean",
                    "description": "Příznak platnosti mandátu"
                  },
                  "typ": {
                    "type": "string",
                    "description": "Typ mandátu",
                    "enum": [
                      "Dodavatel",
                      "Zadavatel",
                      "Obecne"
                    ]
                  }
                },
                "required": [
                  "kod",
                  "nazev",
                  "platny",
                  "typ"
                ]
              }
            ]
          }
        },
        "required": [
          "ciselnikMandatu"
        ]
      }
    },
    "securitySchemes": {
      "certs": {
        "type": "X509",
        "description": "Certifikát pro autentizaci k message brokeru.</br>Hodnota CN - Common name musí odpovídat $KodExtSys_$Prostredi. Pro produkční prostředí se _$Prostredi neuvádí.</br>Certifikát musí být vystaven interní certifikační autoritou NIPEZ."
      }
    }
  }
}