Obchod doplnkov
Obchod doplnkov je zoznam doplnkov ponúkaných priamo v KROS aplikácii, odkiaľ si ich zákazník jedným klikom nainštaluje. Zaradenie doplnku do tohto zoznamu nie je samoobslužné — vyžaduje dohodu s KROSom a manifest, ktorý opisuje váš doplnok strojovo čitateľným spôsobom.
Vyžaduje dohodu s KROSom
Táto stránka opisuje kontrakt manifest.json a pravidlá nahrávania doplnku, ktoré potrebuje partner so schváleným prístupom do obchodu doplnkov. Registrácia doplnku a jeho zverejnenie samoobslužné nie sú — vybavujú sa cez integracie@kros.sk. Príprava a testovanie balíka medzi tým už áno (pozri nižšie).
Ako sa doplnok dostane do obchodu
KROS potrebujete na dvoch miestach — na začiatku, aby vám doplnok zaregistroval, a na konci, aby ho zverejnil. Všetko medzi tým, teda príprava balíka aj jeho testovanie, je vo vašich rukách a nikoho sa na to nemusíte pýtať.
1. Registrácia doplnku
Napíšte na integracie@kros.sk a uveďte:
- názov doplnku,
- čo doplnok robí,
- na ktorý KROS produkt sa napája (napr. KROS Fakturácia, KROS Sklad),
- spôsob autentifikácie (
token-brokeralebomanual— pozri nižšie), - HTTPS base URL doplnku.
Na základe toho KROS pridelí plugin.id a partnerId, dohodne technické detaily zvoleného spôsobu autentifikácie a sprístupní vám v module Doplnky tlačidlo na nahranie balíka. Až potom má zmysel pripravovať manifest.json a balík.
2. Príprava a testovanie
Balík si zložíte podľa pravidiel na tejto stránke a nahráte ho sami tým tlačidlom v module Doplnky. Hneď uvidíte, či prešel validáciou, aj to, ako sa doplnok zákazníkovi zobrazí. Nahrávať môžete opakovane, kým nebudete s výsledkom spokojní — nahraný doplnok nie je verejný, kým ho KROS nezverejní.
Chyby v manifeste teda odhalíte sami a v priebehu sekúnd; nič neposielate e-mailom a na nikoho nečakáte. Aj tak sa vyplatí prejsť si kontrolu pred nahratím na konci tejto stránky — ušetrí vám to kolá.
3. Schválenie a zverejnenie
Keď je doplnok hotový, napíšte KROSu, aby ho schválil. Schválením sa doplnok zaradí do obchodu doplnkov a stane sa verejne dostupným pre zákazníkov.
manifest.json
manifest.json je jediný zdroj pravdy o tom, ako sa doplnok volá, čo robí, kto je jeho partner a ako sa doň prihlasuje. Okrem povinného poľa manifestVersion (vždy "1.0.0" — je to verzia schémy, nie verzia vášho doplnku) má štyri povinné najvyššie objekty:
| Objekt | Čo obsahuje |
|---|---|
plugin |
identita a verzia doplnku — id, partnerId, name, version, changelog, requiresReconfiguration |
display |
čo o doplnku uvidí zákazník v obchode — shortDescription, detail.description, categories, tags |
partner |
kto doplnok dodáva — name, website, privacyPolicyUrl, contact, license |
authentication |
ako sa zákazník do doplnku prihlási — jeden z dvoch spôsobov |
Ako sa manifest číta
Názvy polí sa párujú bez ohľadu na veľkosť písmen, takže shortDescription aj shortdescription prejdú rovnako. Neznáme polia sa ticho ignorujú — preklep v názve nepovinného poľa teda nespôsobí chybu, len sa to pole nikam nedostane. Limity nižšie sa naopak vynucujú presne a nesplnené pravidlo znamená odmietnutý balík.
Referencia polí
Toto je úplný zoznam polí a ich limitov. Dĺžky sa merajú po odstrihnutí okrajových medzier a takto odstrihnutá hodnota sa aj ukladá. Všetky URL musia byť https — jediná výnimka je manual.redirectUrl, ktoré pripúšťa aj http.
plugin
| Pole | Povinné | Formát a limity |
|---|---|---|
id |
áno | max 50 znakov, tvar ^sk\.[a-z0-9-]+\.[a-z0-9-]+$ — teda len malé písmená, číslice a spojovník. Stredný segment sa musí presne zhodovať s partnerId. Napr. sk.partner-id.doplnok-id. |
partnerId |
áno | max 50 znakov, tvar ^[a-z0-9-]+$. Prideľuje KROS. |
name |
áno | 3 – 50 znakov, bez riadiacich znakov. Toto je názov, ktorý zákazník vidí v obchode. |
version |
áno | max 20 znakov, platný SemVer 2.0 (napr. 1.0.0, 2.1.0-beta.1). |
changelog |
podmienene | Pri prvej verzii doplnku v obchode musí byť null. Pri každej ďalšej verzii je povinný a má 20 – 5000 znakov; z riadiacich znakov sú povolené len \n, \r a \t. |
requiresReconfiguration |
nie | boolean, default false. Na true ho dajte, len ak nová verzia vyžaduje, aby zákazník doplnok znova nastavil. |
display
| Pole | Povinné | Formát a limity |
|---|---|---|
shortDescription |
áno | 10 – 150 znakov. Jedna veta do zoznamu doplnkov. |
detail.description |
áno | 50 – 20 000 znakov, markdown. Plný popis na detaile doplnku. |
categories |
áno | 1 – 3 rôzne hodnoty zo zoznamu povolených kategórií. Duplicita v poli je chyba. |
tags |
nie | max 10 položiek, navzájom rôznych (porovnáva sa bez ohľadu na veľkosť písmen). Každý tag 2 – 30 znakov v tvare ^[a-z0-9-]+$ — bez medzier a bez veľkých písmen, takže nie "Cash Flow" ale "cash-flow". |
partner
| Pole | Povinné | Formát a limity |
|---|---|---|
name |
áno | 3 – 50 znakov, bez riadiacich znakov. Obchodné meno partnera. |
website |
nie | max 500 znakov, https. |
privacyPolicyUrl |
nie | max 500 znakov, https. |
contact |
áno | objekt, pozri nižšie. |
license |
áno | objekt, pozri nižšie. |
partner.contact
Objekt contact je povinný, ale všetky jeho zoznamy sú jednotlivo nepovinné — platí len jedno spoločné pravidlo: musí byť vyplnený aspoň jeden kontaktný kanál, čiže aspoň jeden emails, alebo aspoň jeden supportUrls, alebo neprázdne partner.website. Každý zoznam, ktorý uvediete, má 1 – 3 položky bez duplicít.
| Pole | Formát a limity |
|---|---|
emails |
platná e-mailová adresa, max 200 znakov. |
phones |
tvar ^\+?[0-9 ()-]+$ — teda číslice, medzery, okrúhle zátvorky, spojovník a nepovinné + na začiatku. Celá hodnota 6 – 50 znakov a musí obsahovať aspoň 6 číslic. |
supportUrls |
max 500 znakov, https. |
documentationUrls |
max 500 znakov, https. |
partner.license
| Pole | Povinné | Formát a limity |
|---|---|---|
type |
áno | jedna hodnota zo zoznamu povolených licencií. |
url |
podmienene | max 500 znakov, https. Povinné, ak je type rovné proprietary alebo other — pri vlastnej licencii musí byť jej text niekde dostupný. Pri ostatných typoch nepovinné. |
Dva spôsoby autentifikácie
Pole authentication.method je presne jedno z dvoch:
token-broker— doplnok sa otvára vnútri KROS aplikácie a používateľ je doň automaticky prihlásený. Celý protokol je popísaný na stránke Token Broker partner.manual— používateľa presmerujete do externého okna mimo KROS aplikácie. Nejde o inštaláciu v zmysle Token Brokera a nenesie žiadny token.
Objekty tokenBroker a manual sa navzájom vylučujú: ten, ktorý zvolenému method nepatrí, musí byť null alebo úplne chýbať. Vyplniť oba je chyba.
| Pole | Kedy | Formát a limity |
|---|---|---|
method |
vždy | token-broker alebo manual. |
tokenBroker.baseUrl |
token-broker |
max 500 znakov, https. Koreň vášho doplnku, pod ktorým KROS volá tri endpointy Token Brokera. |
tokenBroker.apiKeySecretRef |
token-broker |
max 200 znakov. Konvencia je Plugins:<plugin.id>:ApiKey — teda pre sk.partner-id.doplnok-id hodnota Plugins:sk.partner-id.doplnok-id:ApiKey. Nie je to samotný kľúč, len názov miesta, kde ho KROS má uložený. |
tokenBroker.apiKey |
token-broker |
Zdieľané tajomstvo — pozri upozornenie nižšie. V manifeste, ktorý nahrávate, tu nechajte placeholder, nikdy nie reálnu hodnotu. Niektoré nasadenia vyžadujú, aby pole bolo prítomné a neprázdne, takže ho nevynechávajte. |
manual.redirectUrl |
manual |
max 2048 znakov, http alebo https. Jediná URL v celom manifeste, ktorá smie byť aj http. |
Povolené hodnoty
Tri polia v manifeste prijímajú len presne vymenované hodnoty. Zapisujú sa malými písmenami so spojovníkmi a iná podoba tej istej hodnoty prejsť nemusí.
display.categories
| Hodnota | Pre aké doplnky |
|---|---|
accounting | účtovníctvo, spracovanie dokladov |
warehouse | sklad, skladové karty a zásoby |
crm | evidencia zákazníkov a obchodných príležitostí |
e-commerce | e-shopy a marketplace |
payments | platby, platobné brány, pokladne |
banking | bankové konektory a výpisy |
reporting | reporty, analytika, dashboardy |
other | čokoľvek, čo nesedí do predošlých |
partner.license.type
| Hodnota | Licencia |
|---|---|
proprietary | vlastná licencia partnera — url je povinné |
mit | MIT |
apache-20 | Apache License 2.0 |
gpl-30 | GNU GPL v3 |
bsd-3-clause | BSD 3-Clause |
lgpl-30 | GNU LGPL v3 |
other | iná licencia — url je povinné |
Verzie licencií sa píšu bez bodky
Hodnoty nie sú identifikátory SPDX. Číslo verzie sa oddeľuje spojovníkom a bodka v ňom nie je: apache-20 (nie apache-2.0), gpl-30 (nie gpl-3.0), lgpl-30. Naopak bsd-3-clause spojovníky medzi slovami má. Toto je najčastejší dôvod, prečo manifest neprejde na prvý raz.
categories je špecifické pre nasadenie
Zoznam kategórií vyššie platí pre referenčné nasadenie KROS platformy. Konkrétne nasadenie môže mať inú podmnožinu (alebo inú sadu) kategórií — jeden prototyp mal napríklad jedinú hodnotu invoicing. Nespoliehajte sa na to, že hodnota, ktorá fungovala inde, bude prijatá aj tu — nahranie balíka vám to povie hneď a je to najrýchlejší spôsob, ako si zoznam overiť. Ak by hodnota, ktorú potrebujete, chýbala, napíšte na integracie@kros.sk. Zoznamy licencií a spôsobov autentifikácie sú stabilné.
Príklady manifestu
Prvý príklad používa token-broker, druhý manual. Oba sú kompletné a platné — nepovinné polia sú v nich vyplnené, aby bolo vidieť ich tvar.
{
"manifestVersion": "1.0.0",
"plugin": {
"id": "sk.partner-id.doplnok-id",
"partnerId": "partner-id",
"name": "Názov doplnku",
"version": "1.0.0",
"changelog": null,
"requiresReconfiguration": false
},
"display": {
"shortDescription": "Krátky popis doplnku (10 – 150 znakov).",
"categories": ["accounting", "reporting"],
"tags": ["priklad", "doplnok"],
"detail": { "description": "## Názov doplnku\n\nMarkdown popis, 50 – 20000 znakov." }
},
"partner": {
"name": "Partner s.r.o.",
"website": "https://partner.example.com",
"privacyPolicyUrl": "https://partner.example.com/privacy",
"contact": {
"emails": ["support@partner.example.com"],
"phones": ["+421 900 000 000"],
"supportUrls": ["https://partner.example.com/support"],
"documentationUrls": ["https://partner.example.com/docs"]
},
"license": { "type": "proprietary", "url": "https://partner.example.com/eula" }
},
"authentication": {
"method": "token-broker",
"tokenBroker": {
"baseUrl": "https://doplnok.partner.example.com",
"apiKeySecretRef": "Plugins:sk.partner-id.doplnok-id:ApiKey",
"apiKey": "VLOZ_SEM_API_KEY"
}
}
}
{
"manifestVersion": "1.0.0",
"plugin": {
"id": "sk.partner-id.portal",
"partnerId": "partner-id",
"name": "Partner Portál",
"version": "2.1.0",
"changelog": "Pridali sme prehľad transakcií a export do CSV.",
"requiresReconfiguration": false
},
"display": {
"shortDescription": "Externý portál pre obchodníkov akceptujúcich kartové platby.",
"categories": ["payments"],
"tags": ["platby", "portal"],
"detail": { "description": "## Partner Portál\n\nMarkdown popis, 50 – 20000 znakov." }
},
"partner": {
"name": "Partner s.r.o.",
"website": "https://partner.example.com",
"contact": { "emails": ["support@partner.example.com"] },
"license": { "type": "apache-20" }
},
"authentication": {
"method": "manual",
"manual": { "redirectUrl": "https://portal.partner.example.com/login?ref=kros" }
}
}
Všimnite si rozdiely: druhý manifest má changelog vyplnený (je to verzia 2.1.0, teda nie prvá), licenciu apache-20 bez url (nepovinné pri známych licenciách) a objekt tokenBroker vôbec neobsahuje.
API kľúč je zdieľané tajomstvo
Hodnota authentication.tokenBroker.apiKey je zdieľaný secret medzi KROSom a vaším doplnkom. Musí k vám prísť bezpečným kanálom (nikdy e-mailom v čistom texte) a nesmie sa nikdy commitnúť do repozitára — ani do príkladov, ani do konfigurácie, ktorá sa verzuje spolu s kódom. V manifeste, ktorý nahrávate, drží miesto placeholder ako vyššie; skutočnú hodnotu vkladajte až v mieste, kde beží doplnok (secret store, premenné prostredia).
Balík .zip
Doplnok sa nahráva ako .zip archív. Samotný manifest.json bez zabalenia do .zip sa nahrať nedá.
Štruktúra archívu
V koreni archívu musí byť manifest.json a presne jedna ikona. Priečinok media/ je nepovinný a musí byť plochý — podpriečinky v ňom nie sú dovolené. Nič iné archív obsahovať nesmie.
doplnok.zip
├── manifest.json povinné, v koreni
├── icon.png povinné, presne jedna ikona
└── media/ nepovinné, bez podpriečinkov
├── screenshot-1.png
└── screenshot-2.jpg
Limity archívu
| Limit | Hodnota |
|---|---|
| Počet položiek | najviac 25 v celom archíve |
| Veľkosť jednej položky | najviac 5 MB v rozbalenom stave |
| Veľkosť celého archívu | najviac 15 MB v rozbalenom stave |
| Kompresný pomer | najviac 100 — chráni pred zip bombou |
| Cesty v archíve | žiadne .. a žiadne absolútne cesty |
Súbory v media/ | najviac 10 |
Ikona
Presne jeden súbor icon.<prípona> v koreni archívu. Prípona smie byť png, jpg, jpeg, webp alebo svg.
- Rozmery: obe strany 64 – 1024 px a obrázok musí byť štvorcový. Bannery a iné neštvorcové obrázky sa odmietajú. Pri
svgsa rozmery nekontrolujú. - Obsah musí súhlasiť s príponou: skutočný typ súboru sa zisťuje z jeho hlavičky, nie z názvu. Premenovať
.jpgna.pngteda nepomôže — balík sa odmietne.
Priečinok media/
Nepovinné náhľadové obrázky doplnku, najviac 10, bez podpriečinkov.
- Prípony:
png,jpg,jpeg,webp.svgtu povolené nie je — na rozdiel od ikony. - Rozmery: najmenej 320 × 180 px, najviac 1920 × 1080 px. Štvorcovosť sa nevyžaduje.
- Obsah musí súhlasiť s príponou, rovnako ako pri ikone.
Prípony a typy obsahu
| Prípona | Typ obsahu | Kde sa smie použiť |
|---|---|---|
.png | image/png | ikona aj media/ |
.jpg, .jpeg | image/jpeg | ikona aj media/ |
.webp | image/webp | ikona aj media/ |
.svg | image/svg+xml | len ikona |
Kontrola pred nahratím
Validáciu si spustíte sami tým, že balík nahráte, takže chybu vidíte hneď. Toto je zoznam vecí, na ktorých balíky padajú najčastejšie — keď si ho prejdete dopredu, ušetríte si niekoľko kôl.
plugin.idje celé malými písmenami a jeho stredný segment sa presne zhoduje splugin.partnerId.partner.license.typeje zapísaný bez bodky —apache-20, nieapache-2.0. Ak jeproprietaryaleboother, je vyplnené ajlicense.url.- Každá hodnota v
display.categoriesje zo zoznamu povolených kategórií a v poli nie sú duplicity. tagsneobsahujú medzery ani veľké písmená a každý má aspoň 2 znaky.changelogjenullpri prvej verzii; pri každej ďalšej má aspoň 20 znakov.detail.descriptionmá aspoň 50 znakov ashortDescriptionaspoň 10.- Je vyplnený aspoň jeden kontaktný kanál —
emails,supportUrlsalebopartner.website. - Všetky URL sú
https. Jediná výnimka jemanual.redirectUrl. - Vyplnený je len ten objekt, ktorý patrí zvolenému
method— druhý chýba alebo jenull. - V
tokenBroker.apiKeyje placeholder, nie reálny kľúč. - Ikona je štvorcová, 64 – 1024 px, a v koreni archívu je len jedna.
- V
media/nie je žiadnesvgani podpriečinok. - Archív má najviac 25 položiek a rozbalený nemá viac ako 15 MB.