Partnerių API (#19245)¶
Softera API galinių taškų, įdiegtų/išplėstų per užduotį #19245, dokumentacija: partnerių organizacijos kūrimas, organizacijų paieška, LOCCAT katalogo vietų CRUD, organizacijos GLN keitimas.
Bendra informacija¶
- Bazinė URL:
https://api-test.docura.net/ap1/partner/api/ - Autentifikavimas: antraštė
X-Authorization: <api_key>(vartotojo prieigos raktas, laukasapi_keylentelėjeusers). - Antraštės
X-App-Keyklientai nenaudoja — šiuo metu užpakalinėje sistemoje šis patikrinimas neprijungtas prie jokios filtrų grandinės (mirusi kodas nuo 2023 m.), todėl jį galima praleisti. - Formatas – JSON (išskyrus atvejus, kai aiškiai nurodyta kitaip).
- Rolės (teisės):
SYSTEM_ADMIN,SYSTEM_SUPPORT,CLIENT_ADMIN,CLIENT_EDITOR,PROVIDER_ADMIN– konkrečias leistinas roles žr. kiekvieno galinio taško aprašyme.
1. Partnerių organizacijos sukūrimas¶
POST /user/organization¶
Sukuria naują organizaciją ir prideda skambinantį vartotoją prie jos kaip CLIENT_ADMIN (per atskirą, ankstesnį žingsnį kūrimo procese).
Teisės: jokių vaidmenų apribojimų – prieinama bet kuriam autentifikuotam vartotojui. Teisės išreiškiamos ne per skambinančiojo vaidmenį, o per tai, kuriai organizacijai priklauso pats skambinantysis (žr. operatorId logiką žemiau).
Užklausos kūnas:
| Laukas | Tipas | Būtinas | Apribojimai |
|---|---|---|---|
| taxId | string | taip | 2–20 simbolių |
| registrationNumber | string | taip | 2–50 simbolių |
| name | string | taip | 2–50 simbolių |
| countryCode | string | taip | 2 simboliai |
| locale | string | taip | 2 simboliai, turi būti lokalės nuorodų sąraše |
| errorEmail | string | ne | iki 250 simbolių, el. pašto formatas |
| notes | string | ne | iki 255 simbolių |
| phones | string | ne | iki 50 simbolių |
| string | ne | iki 150 simbolių, el. pašto formatas |
Laukas integrationProfileType, kuris atsirado ankstesnėse šios funkcijos iteracijose tame pačiame biliete, buvo pašalintas iš galutinės versijos – klientas negali pasirinkti profilio/connectionType aiškiai (žr. žemiau).
Atsakymas (200): tas pats laukų rinkinys + id (Long), iln (generuotas organizacijos GLN).
Klaidos:
-
409 Conflict(organization.create.conflict.tax_id) – organizacija su šiuotaxIdjau egzistuoja. -
400– neteisingi užklausos kūno laukai (bean validavimas), arba lokalė nerasta (not.exists.specified.organization.locale).
Logika, pagal kurią nustatomas naujos organizacijos operatorius (operatorId)¶
Jis apskaičiuojamas iš KVIEČIANČIOJO vartotojo (callerIln – esamos sesijos organizacijos ILN) organizacijos, be jokių aiškių parametrų užklausoje:
- Jei kviečiančiojo organizacija yra pati softera (
profile.softeraOrganizationIln) → naujos organizacijos operatorius = pati softera. Be to, šiuo atveju numatytasis softera vartotojas (profile.softeraDefaultUserId, jei nustatyta) pridedamas prie naujos organizacijos kaipCLIENT_ADMIN. - Jei kviečiančiojo organizacija yra tiekėjas (
role='P', bet ne softera) → operatorius = paties kviečiančiojo organizacija. - Kitais atvejais (nei softera, nei tiekėjas) → operatorius = organizacija iš
profile.defaultOperatorOrganizationIln(grįžtama prie „numatytojo operatoriaus“). - Jei nei kviečiančiojo organizacija, nei atsarginė organizacija nerandama pagal ILN –
500(IllegalStateException, paprastai neturėtų nutikti).
connectionType logika naujai organizacijai¶
- Skambintojas yra softera → visada
Payment(fiksuota, nepriklausomai nuo nieko). - Priešingu atveju →
connectionType= paties operatoriaus organizacijosconnectionType(apskaičiuota aukščiau – tiekėjo arba atsarginės organizacijos). Klientas negali aiškiai nurodyticonnectionType/integracijos profilio.
2. Organizacijų paieška¶
GET /organizations/search?query=<string>¶
Teisės: SYSTEM_ADMIN, SYSTEM_SUPPORT, PROVIDER_ADMIN. Nėra apribojimų pagal operatorId – teikėjas mato rezultatus visoje organizacijų duomenų bazėje, o ne tik savo klientų (apgalvotas sprendimas, priimtas šiame biliete).
Parametrai:
| Parametras | Tipas | Būtinas | Aprašymas |
|---|---|---|---|
| query | string | taip | Paieškos eilutė. Tuščia/trūkstama eilutė → tuščias sąrašas be klaidos. |
Paieškos logika DB — vienas OR per organizaciją:
- tikslus atitikimas
id(kaip tekstas); - tikslus atitikimas
iln(GLN); - tikslus atitikimas
regNr(nepaisant didžiųjų/mažųjų raidžių); - tikslus atitikimas
vatNr(nepaisant didžiųjų/mažųjų raidžių); - subeilutė (
ILIKE) organizacijosname; - subeilutė (
ILIKE) bet kurios jos LOCCAT vietosname.
Atsakymas (200): masyvas, kiekvienas elementas apvyniotas organization objekte:
[
{
"organization": {
"id": 100099815,
"name": "New brand sof",
"iln": "2000005810008",
"taxId": "...",
"registrationNumber": "...",
"countryCode": "EE",
"locations": [ { "id": ..., "iln": "...", "name": "...", "formattedAddress": "...", ... } ]
}
}
]
Svarbus niuansas: locations[] yra tik tos vietos, kurių pavadinimas atitiko paieškos eilutę – ne visos rastos organizacijos vietos. Jei organizacija buvo rasta pagal id/iln/regNr/vatNr/pavadinimą, o ne pagal vietovės pavadinimą, locations bus tuščias masyvas. Tai yra apgalvotas elgesys, o ne klaida.
3. Organizacijos LOCCAT katalogo vietos¶
Pagrindinis kelias: /organization/{gln}/locations, kur {gln} yra organizacijos GLN (ne skaitmeninis ID).
Teisės (bendros visiems trims žemiau nurodytiems metodams):
-
SYSTEM_ADMIN/SYSTEM_SUPPORT— jokių apribojimų. -
PROVIDER_ADMIN— tik tuo atveju, jei skambinančiojo organizacija = tikslinės organizacijosoperatorId(teikėjas valdo tų organizacijų vietas, kurias pats administruoja). - Kiti vaidmenys —
403(not.have.access). - Organizacija nerasta pagal GLN →
400(organization.not.exists).
3.1 POST /organization/{gln}/locations – sukurti / atnaujinti vietovę¶
Įterpimo/atnaujinimo logika:
- Jei
idperduodamas užklausos turinyje – aiškus esamos vietovės atnaujinimas pagal jos vidinį ID (ji turi priklausyti nurodytai organizacijai, kitaip grąžinamas404). - Jei
idneperduodamas, bet perduodamasiln– ieškoma esamos organizacijos vietovės su tokiuiln; jei randama, ji atnaujinama, jei ne – sukuriama nauja. - Jei
ilntaip pat neperduodamas (arba yra „tuščias“ pagalIlnHelper.isEmpty) – vietovės GLN sugeneruojamas automatiškai (žr. toliau).
Užklausos turinys (LoccatLocationWithIdData – LoccatLocationData + pasirenkamas id):
| Laukas | Tipas | Būtina | Apribojimai |
|---|---|---|---|
| id | Long | ne | aiškiam atnaujinimui |
| iln | string | ne | iki 13 simbolių; kai nėra – sugeneruojama automatiškai |
| codeBySender | string | taip | iki 70 simbolių |
| codeByReceiver | string | ne | iki 70 simbolių |
| name | string | taip | iki 175 simbolių |
| legal | boolean | ne | „teisės adreso“ vėliavėlė |
| formattedAddress | string | ne | iki 300 simbolių |
| streetAndNumber | string | ne | iki 140 simbolių |
| streetAndNumber2 | string | ne | iki 140 simbolių |
| city | string | ne | iki 175 simbolių |
| state | string | ne | iki 175 simbolių |
| postalCode | string | ne | iki 9 simbolių |
| countryCode | string | ne | iki 2 simbolių |
| latitude / longitude | double | ne | |
| remarks | string | ne | iki 350 simbolių |
| phoneNumber | string | ne | iki 175 simbolių |
| string | ne | iki 350 simbolių, el. pašto formatas | |
| web | string | ne | iki 175 simbolių |
Atsakymas (200): tas pats turinys + sukurtos / atnaujintos vietovės id.
Vietovės GLN automatinis generavimas (kai iln neperduodamas)¶
Pakartotinai naudojamas senas algoritmas UserWebController.getNextLocalizationCatalogGln (šerdis):
- Jei organizacija jau turi vietovių (
maxIlnrasta) → kitas GLN = paskutinio sugeneruoto GLN pagrindas + 1. - Jei nėra vietovių ir organizacija yra bandomoji (
isTest) → GLN sudaromas iš organizacijosglnPrefix, papildyto nuliais. - Jei nėra vietovių, organizacija nėra bandomoji ir nėra „teisėtos“ vietovės → grąžinamas pačios organizacijos GLN.
- Jei yra teisėta vietovė, bet nėra kitų (kraštutinis atvejis) → GLN sudaromas iš
glnPrefix.
Be to (šio bilieto pakeitimas): jei tokiu būdu sugeneruotas GLN sutampa su pačios organizacijos GLN (2 ir 3 punktai aukščiau) – jis padidinamas 1, kad niekada nedubliuotų organizacijos GLN.
Žinomos ribos (priimtos tokios, kokios yra, be papildomos apsaugos):
- Nėra transakcinio užrakto tarp „gauti kitą GLN“ ir „sukurti vietovę su juo“ – esant lygiagrečioms užklausoms be
ilnįmanomas konfliktas ir400 duplicate.line.iln. - Viršijimo atveju padidinimas (GLN pagrindas =
999999999999) teoriškai gali sukurti GLN, kuris yra vienu simboliu ilgesnis nei įprastai – itin mažai tikėtinas kraštutinis atvejis, pataisymo neprašyta. -
legalvėliavėlė NĖRA automatiškai nustatoma pirmai vietovei, sukurtai beiln– jei organizacija neturi teisinės vietovės, pakartotinisPOSTbeilnbandys vėl sugeneruoti tą patį organizacijos GLN ir nepavyks su400 duplicate.line.iln. Klientas turi arba aiškiai perduotiilnantroje ir vėlesnėse užklausose, arba pats tvarkytilegal.
3.2 GET /organization/{gln}/locations – gauti vietas¶
Ypatumai: filtras perduodamas GET užklausos turinyje (JSON); tai nėra užklausos parametrai. Jei turinys tuščias (Content-Length <= 0) – grąžinamos visos organizacijos vietos.
Užklausos turinys (pasirinktinai):
| Laukas | Tipas | Aprašymas |
|---|---|---|
| id | Long | tikslus paieška pagal vietos ID (plius papildomas patikrinimas pagal iln, jei perduota) |
| iln | string | filtravimas pagal GLN |
| name | string | filtravimas pagal pavadinimą (poeilis) |
| address | string | filtravimas pagal adresą (poeilis) |
Prioritetas: jei perduodamas id – grąžinama (daugiausiai) viena vieta pagal ID; priešingu atveju, jei nustatytas bent vienas iš iln/name/address – filtruota paieška; priešingu atveju – visos organizacijos vietos.
Atsakymas (200): vietų masyvas (tas pats formatas kaip POST atsakyme).
3.3 DELETE /organization/{gln}/locations¶
Užklausos turinys (privalomas):
| Laukas | Tipas | Privalomas |
|---|---|---|
| id | Long | taip |
Ištrynimas galimas tik pagal vidinį vietos ID; ištrynimas pagal iln nėra įdiegtas (tai buvo apsvarstyta ir atšaukta šiame tikete).
Atsakymas: 200 sėkmės atveju, 404 jei vieta su tokiu ID nerasta organizacijoje, 400 location.id.should.be.specified jei id nenurodytas.
4. Organizacijos GLN keitimas¶
PATCH /organization/{organizationId}/gln?gln=<naujas GLN>¶
Pastaba: čia {organizationId} yra skaitmeninis vidinis organizacijos ID (kitaip nei aukščiau esantys lokacijos galiniai taškai, kurie kelyje naudoja GLN).
Teisės:
-
SYSTEM_ADMIN/SYSTEM_SUPPORT— jokių apribojimų. -
PROVIDER_ADMIN— tik tuo atveju, jei skambinančiojo organizacija = tikslinės organizacijosoperatorId. - Kiti —
403 neturi.prieigos. - Organizacija nerasta pagal ID →
404(tuščias atsakymas).
Parametrai:
| Parametras | Tipas | Būtinas |
|---|---|---|
| gln | eilutė | taip, užklausos parametras |
Kas vyksta viduje (pakartotinai naudojamas standartinis organizacijos atnaujinimo konvejeris, OrganizationUpdateEvent → OrganizationCommonUpdateHandler):
- GLN formato ir kontrolinio skaitmens patvirtinimas →
400klaidos atveju. - Dublikatų patikra – GLN neturi priklausyti kitai organizacijai →
400 Dubliuotas ILN. - Senoji reikšmė išsaugoma
previousIln. - Jei organizacija turi „teisinę“ LOCCAT lokaciją – jos
ilnautomatiškai sinchronizuojamas su nauju organizacijos GLN (loccatReconciliation). Jei teisinės lokacijos nėra – žingsnis praleidžiamas tyliai. - Standartiniai organizacijos atnaujinimo suderinimo veiksmai (partneris/sąlyga/pranešimai ir t. t., nespecifiniai šiai funkcijai).
Atsakymas (200): organizacijos turinys (OrganizationWithIdData) su jau pritaikytu nauju GLN.
5. Santraukos lentelė apie prieigos taškus¶
| Metodas | Kelias | Kelio identifikatorius | Rolės |
|---|---|---|---|
| POST | /user/organization | — | bet kuris autentifikuotas |
| GET | /organizations/search | — | SYSTEM_ADMIN, SYSTEM_SUPPORT, PROVIDER_ADMIN |
| POST | /organization/{gln}/locations | GLN | SYSTEM_ADMIN, SYSTEM_SUPPORT, PROVIDER_ADMIN (operatorId atitikimas) |
| GET | /organization/{gln}/locations | GLN | SYSTEM_ADMIN, SYSTEM_SUPPORT, PROVIDER_ADMIN (operatorId atitikimas) |
| DELETE | /organization/{gln}/locations | GLN | SYSTEM_ADMIN, SYSTEM_SUPPORT, PROVIDER_ADMIN (operatorId atitikimas) |
| PATCH | /organization/{organizationId}/gln | skaitmeninis ID | SYSTEM_ADMIN, SYSTEM_SUPPORT, PROVIDER_ADMIN (operatorId atitikimas) |
6. Pavyzdžiai¶
# Create an organisation
curl --location --request POST 'https://api-test.docura.net/ap1/partner/api/user/organization' \
--header 'X-Authorization: <token>' \
--header 'Content-Type: application/json' \
--data '{
"taxId": "EE100000001",
"registrationNumber": "12345678",
"name": "Example OU",
"countryCode": "EE",
"locale": "en"
}'
# Search organisations
curl --location 'https://api-test.docura.net/ap1/partner/api/organizations/search?query=Example' \
--header 'X-Authorization: <token>'
# Create a location without an explicit GLN (auto-generation)
curl --location --request POST 'https://api-test.docura.net/ap1/partner/api/organization/<org_gln>/locations' \
--header 'X-Authorization: <token>' \
--header 'Content-Type: application/json' \
--data '{
"name": "Warehouse 1",
"codeBySender": "WH1",
"countryCode": "EE"
}'
# Get all locations of an organisation
curl --location 'https://api-test.docura.net/ap1/partner/api/organization/<org_gln>/locations' \
--header 'X-Authorization: <token>'
# Delete a location by id
curl --location --request DELETE 'https://api-test.docura.net/ap1/partner/api/organization/<org_gln>/locations' \
--header 'X-Authorization: <token>' \
--header 'Content-Type: application/json' \
--data '{"id": 682021}'
# Change an organisation's GLN
curl --location --request PATCH 'https://api-test.docura.net/ap1/partner/api/organization/<numeric_id>/gln?gln=2000005819995' \
--header 'X-Authorization: <token>'
Source version: 3 · Status: fresh · Roman Startsev