Tehnički vodič
Integracija sa BokaLPFR-om (POS-to-SDC v3)
Kako da povežete kasu (ESIR) sa BokaLPFR-om preko standardnog POS-to-SDC v3 HTTP interfejsa. Bez SDK-a: dovoljan je HTTP klijent. Endpointi, šeme, šifarnik i preporuke, izvedeni iz same implementacije.
Ažurirano: 28. avgust 2026. · POS-to-SDC v3
Uvod i opseg
BokaLPFR povezuje kasu (ESIR) sa bezbednosnim elementom Poreske uprave (pametna kartica) i Sistemom za upravljanje fiskalizacijom (SUF). ESIR ne potpisuje račune sam i ne komunicira direktno sa karticom niti sa SUF-om: sve ide kroz lokalni HTTP API BokaLPFR-a.
Za integraciju nije potreban proizvođački SDK. Dovoljan je HTTP klijent koji ume da pošalje GET i POST zahteve sa JSON telom.
Van opsega su komunikacija BokaLPFR-a sa SUF-om, potpisivanje na kartici, iščitavanje i konfiguracija servisa. Ti procesi su transparentni za ESIR i opisani su u Korisničkom uputstvu i Uputstvu za instalaciju.
Osnovna adresa i transport
| Parametar | Podrazumevana vrednost |
|---|---|
| Osnovna adresa (base URL) | http://127.0.0.1:8443/api/v3/ |
| Transport | HTTP preko loopback interfejsa (isti računar) |
| Port | 8443 |
| Format poruka | JSON, kodiranje UTF-8 |
Content-Type (zahtev) | application/json |
- Ako ESIR radi na istom računaru kao BokaLPFR (preporučeno), koristi loopback adresu iznad, bez dodatne konfiguracije, odmah po instalaciji.
- Ako ESIR radi na drugom uređaju u lokalnoj mreži, pristup mora biti eksplicitno omogućen (vidi ispod) i ESIR koristi IP adresu računara na kome je BokaLPFR.
- Port je podesiv u konfiguraciji; u tom slučaju uskladite i ESIR i pravilo zaštitnog zida.
Mrežni pristup i bezbednost
Bezbednosna granica POS API-ja je loopback interfejs. Na samom API-ju nema tokena ni lozinke: pretpostavka je da je pristup 127.0.0.1 već ograničen na aplikacije na istom računaru.
| Pravilo | Ponašanje |
|---|---|
| Loopback (podrazumevano) | Prihvataju se samo zahtevi sa 127.0.0.1. Zahtev sa druge adrese dobija 403 Forbidden. |
| LAN izlaganje (opciono) | Aktivira se u konfiguraciji (AllowLan=true) uz obaveznu listu dozvoljenih IP adresa. Zahtev van liste dobija 403. |
| Ograničenje brzine | Po IP adresi, fiksni prozor od 1 minuta, podrazumevano 600 zahteva/min. Prekoračenje vraća 429 Too Many Requests. |
| Izuzetak | GET /api/v3/attention nije ograničen brzinom. |
Konvencije zahteva i odgovora
- Nazivi polja. Odgovori su u
camelCase. Nazivi polja u zahtevu su neosetljivi na velika i mala slova (prihvata se iInvoiceTypeiinvoiceType). Referentna tela iz Tehničkog vodiča PU koristePascalCase, pa su tako dati i primeri zahteva ovde. - Enumeracije. U zahtevu: naziv člana (
"Normal", case-insensitive) ili ceo broj (0). U odgovoru: uvek ceo broj. - Prazne vrednosti. Polja sa vrednošću
nullizostavljaju se iz JSON odgovora. - Brojevi. Decimalni razdvajač je tačka. Novčani iznosi najviše 4 decimale; količina najviše 3 decimale.
- Datum i vreme. ISO 8601 (
2026-07-05T01:05:02) ili oblik sa razmakom (2026-07-05 01:05:02). Bez pomeraja se tumači kao lokalno vreme. - Zaglavlje
RequestId(idempotencija). Opciono, najviše 32 karaktera. Ako je poslato, vraća se u istoimenom zaglavlju odgovora i koristi za idempotenciju i oporavak. Duže od 32 karaktera:400+2801.
Pregled endpointa
| Metoda | Putanja | Namena |
|---|---|---|
GET | /api/v3/attention | Brza provera dostupnosti servisa. |
GET | /api/v3/status | Status: identitet, verzije, poreske stope, statusni kodovi (GSC). |
GET | /api/v3/environment-parameters | Parametri okruženja (obveznik, lokacija, endpointi, NTP). |
POST | /api/v3/pin | Prosleđivanje PIN koda bezbednosnom elementu. |
POST | /api/v3/invoices | Fiskalizacija računa. Vraća fiskalizovane podatke, žurnal i verifikacioni URL. |
GET | /api/v3/invoices/{requestId} | Oporavak: dohvat ranije fiskalizovanog računa po RequestId. |
GET /api/v3/attention
/api/v3/attentionNajlakša provera da li servis radi. Ne dodiruje karticu, ne troši brojače i nije ograničena brzinom. Odgovor je 200 OK sa praznim telom; bilo koji drugi ishod znači da servis nije dostupan sa te adrese.
GET http://127.0.0.1:8443/api/v3/attention
-> 200 OKGET /api/v3/status
/api/v3/statusVraća trenutni status L-PFR-a. ESIR ga poziva pre izdavanja računa da proveri da li je uređaj spreman i da pročita aktuelne poreske stope.
Šema odgovora (LpfrStatus)
| Polje | Tip | Opis |
|---|---|---|
isPinRequired | bool | true osim kada je PIN na kartici verifikovan. |
auditRequired | bool | true kada je iščitavanje zahtevano pre daljeg potpisivanja. |
sdcDateTime | string | Trenutno vreme L-PFR-a (ISO 8601). |
lastInvoiceNumber | string | Broj poslednjeg izdatog računa. |
protocolVersion | string | Verzija protokola, 3.0. |
secureElementVersion | string | Verzija apleta bezbednosnog elementa. |
hardwareVersion | string | Verzija hardvera, 1.0. |
softwareVersion | string | Verzija BokaLPFR-a. |
deviceSerialNumber | string | Serijski broj uređaja (UID bezbednosnog elementa). |
make | string | BOKA GROUP DOO. |
model | string | Model izdanja: BokaLPFR Windows ili BokaLPFR macOS. |
mssc | string[] | Statusni kodovi proizvođača (za sada prazno). |
gsc | string[] | Opšti statusni kodovi (vidi tabelu ispod). |
supportedLanguages | string[] | Podržani jezici. |
uid | string | UID bezbednosnog elementa (null bez kartice). |
taxCoreApi | string | Bazna adresa SUF/TaxCore API-ja (sa sertifikata). |
currentTaxRates | objekat | Trenutno važeća grupa poreskih stopa. |
allTaxRates | objekat[] | Sve poznate grupe poreskih stopa. |
Opšti statusni kodovi (gsc)
| Kod | Pojavljuje se kada |
|---|---|
0100 | Kartica prisutna i PIN verifikovan. |
1300 | Nema kartice u čitaču. |
1500 | Kartica prisutna, potreban unos PIN-a. |
2110 | Kartica prisutna, ali zaključana. |
1400 | Zahtevano je iščitavanje. |
1100 | Interna memorija pri kraju. |
2400 | L-PFR nije konfigurisan (nema stopa ili adrese za verifikaciju). |
0210 / 0220 | Internet dostupan / nedostupan (izostaje dok je nepoznato). |
{
"isPinRequired": false,
"auditRequired": false,
"sdcDateTime": "2026-07-11T10:22:41.512+02:00",
"lastInvoiceNumber": "8ZBU67JM-8ZBU67JM-41",
"protocolVersion": "3.0",
"secureElementVersion": "1.0",
"hardwareVersion": "1.0",
"softwareVersion": "1.4.0",
"deviceSerialNumber": "8ZBU67JM",
"make": "BOKA GROUP DOO",
"model": "BokaLPFR Windows",
"mssc": [],
"gsc": ["0100", "0210"],
"supportedLanguages": ["sr-Cyrl-RS", "sr-Latn-RS", "en-US"],
"uid": "8ZBU67JM",
"taxCoreApi": "https://sandbox.suf.purs.gov.rs/api/v3",
"currentTaxRates": {
"groupId": 6,
"validFrom": "2022-05-01T00:00:00+02:00",
"taxCategories": [
{
"orderId": 0,
"name": "О-ПДВ",
"categoryType": 0,
"taxRates": [{ "label": "А", "name": "20%", "rate": 20.0 }]
}
]
},
"allTaxRates": []
}GET /api/v3/environment-parameters
/api/v3/environment-parametersVraća parametre okruženja (podaci obveznika i lokacije, adrese servisa, NTP server). Sva polja su opciona i izostaju kada nisu konfigurisana.
| Polje | Tip | Opis |
|---|---|---|
organizationName | string | Naziv obveznika. |
serverTimeZone | string | Vremenska zona servera. |
street | string | Ulica i broj lokacije. |
city | string | Mesto. |
country | string | Država. |
endpoints | objekat[] | Lista { name, address } adresa servisa. |
environmentName | string | Naziv okruženja (produkciono / sandbox). |
logo | string | Logo okruženja. |
ntpServer | string | Adresa NTP servera. |
supportedLanguages | string[] | Podržani jezici. |
POST /api/v3/pin
/api/v3/pinProsleđuje PIN kod bezbednosnom elementu. PIN je potreban posle svakog restarta servisa ili računara, kao i posle vađenja ili promene kartice (tada GET /status prijavljuje 1500).
- Telo: JSON string sa PIN-om, npr.
"1234"(prihvata se i goli oblik1234). - PIN mora imati tačno 4 cifre.
- PIN se nikada ne upisuje na disk ni u dnevnike.
Uspešan i neuspešan pokušaj vraćaju 200 OK, a telo je JSON string sa šifrom ishoda:
| Telo odgovora | Značenje |
|---|---|
"0100" | PIN je ispravan. |
"2100" | PIN nije ispravan. |
"2110" | Kartica je zaključana. |
"2220" | Greška u komunikaciji sa bezbednosnim elementom. |
"2400" | L-PFR nije konfigurisan / kartica nije spremna. |
"2806" | Neispravan format PIN-a (nije 4 cifre). |
Greške na nivou HTTP zahteva vraćaju 400: pogrešan Content-Type daje 2806, prazno telo 2800.
POST http://127.0.0.1:8443/api/v3/pin
Content-Type: application/json
"1234"
-> 200 OK
"0100"POST /api/v3/invoices
/api/v3/invoicesGlavni endpoint: fiskalizuje jedan račun. Zahtev opisuje stavke, plaćanja i tip računa; odgovor sadrži fiskalizovane podatke, žurnal i verifikacioni URL / QR kod.
Šema zahteva (InvoiceRequest)
| Polje | Tip | Obavezno | Opis |
|---|---|---|---|
invoiceType | enum | da | Normal, Proforma, Copy, Training, Advance. |
transactionType | enum | da | Sale, Refund. |
payment | Payment[] | da (≥1) | Načini plaćanja i iznosi. |
items | InvoiceItem[] | da (≥1) | Stavke računa. |
cashier | string | ne | Oznaka ili ime kasira. ≤ 50. |
buyerId | string | ne | Identifikacija kupca (npr. PIB). Kad postoji: 1..20. |
buyerCostCenterId | string | ne | Mesto troška. Kad postoji: 1..50; zahteva buyerId. |
invoiceNumber | string | ne | Interni broj računa ESIR-a. Kad postoji: 1..60. |
referentDocumentNumber | string | ne* | Obavezno za Refund i Copy. Format XXXXXXXX-XXXXXXXX-N. ≤ 50. |
referentDocumentDT | string | ne | Datum referentnog dokumenta. Ne u budućnosti; zahteva referentDocumentNumber. |
dateAndTimeOfIssue | string | ne | Traženi datum/vreme izdavanja. |
options | InvoiceOptions | ne | Opcije prikaza (QR, žurnal). |
InvoiceItem
| Polje | Tip | Obavezno | Opis |
|---|---|---|---|
name | string | da | Naziv artikla. ≤ 2048. |
quantity | number | da | Količina. > 0, ≤ 3 decimale. |
unitPrice | number | da | Jedinična cena (posle popusta). ≤ 4 decimale. |
totalAmount | number | da | Ukupan bruto iznos stavke. ≤ 4 decimale. |
labels | string[] | da (≥1) | Poreske oznake. Bez duplikata. |
gtin | string | ne | GTIN. Kad postoji: 8..14 karaktera. |
Payment i InvoiceOptions
| Polje | Tip | Opis |
|---|---|---|
payment[].amount | number | Iznos plaćanja. |
payment[].paymentType | enum | Other, Cash, Card, Check, WireTransfer, Voucher, MobileMoney. |
options.omitQRCodeGen | "0"/"1" | "1" izostavlja QR kod. Podrazumevano "0". |
options.omitTextualRepresentation | "0"/"1" | "1" izostavlja žurnal u odgovoru. Podrazumevano "0". |
Šema odgovora (InvoiceResult)
| Polje | Tip | Opis |
|---|---|---|
requestedBy | string | UID kartice koja je tražila potpis. |
signedBy | string | UID kartice koja je potpisala račun. |
sdcDateTime | string | Vreme potpisa (ISO 8601). |
invoiceCounter | string | Brojač računa u okviru tipa. |
invoiceCounterExtension | string | Ekstenzija brojača (oznaka tipa). |
invoiceNumber | string | Jedinstveni broj računa. |
verificationUrl | string | URL za verifikaciju računa. |
verificationQRCode | string | QR kod spreman za štampu. |
journal | string | Tekstualni žurnal računa. |
messages | string | "Success" ili poruka L-PFR-a. |
totalCounter | number | Ukupni redni broj računa. |
transactionTypeCounter | number | Redni broj u okviru tipa transakcije. |
totalAmount | number | Ukupan iznos računa. |
encryptedInternalData | string | Šifrovani interni podaci (base64). |
signature | string | Digitalni potpis (base64). |
taxItems | TaxItem[] | Obračunate poreske stavke. |
businessName / locationName / address / district / tin | string | Podaci obveznika i lokacije. |
taxGroupRevision | number | Revizija poreske grupe. |
mrc | string | Registracioni kod uređaja: 9A-0001-{UID} na Windows izdanju, 9B-0001-{UID} na macOS izdanju. |
TaxItem: categoryType (number), rateId (number), label (string), amount (number), rate (number), categoryName (string).
Primer: prodaja (Normal / Sale)
POST http://127.0.0.1:8443/api/v3/invoices
Content-Type: application/json
RequestId: 8f3c1a92e7b04f5c9a1d
{
"InvoiceType": "Normal",
"TransactionType": "Sale",
"Payment": [
{ "Amount": 121.00, "PaymentType": "Cash" }
],
"Items": [
{
"Name": "Test artikal",
"Quantity": 1,
"UnitPrice": 121.00,
"Labels": ["А"],
"TotalAmount": 121.00
}
]
}{
"requestedBy": "8ZBU67JM",
"signedBy": "8ZBU67JM",
"sdcDateTime": "2026-07-11T10:24:03+02:00",
"invoiceNumber": "8ZBU67JM-8ZBU67JM-42",
"verificationUrl": "https://sandbox.suf.purs.gov.rs/v/?vl=A0ha...HcQ",
"verificationQRCode": "iVBORw0KGgoAAAANSUhEUgAA...",
"messages": "Success",
"totalCounter": 43,
"transactionTypeCounter": 42,
"totalAmount": 121.00,
"taxItems": [
{ "categoryType": 0, "rateId": 0, "label": "А", "amount": 20.17, "rate": 20.0, "categoryName": "О-ПДВ" }
],
"tin": "100000000",
"mrc": "9A-0001-8ZBU67JM"
}Primer: refundacija (Normal / Refund)
Refundacija referiše broj računa originala kroz ReferentDocumentNumber (vrednost invoiceNumber iz odgovora na originalni račun).
{
"InvoiceType": "Normal",
"TransactionType": "Refund",
"Payment": [
{ "Amount": 121.00, "PaymentType": "Cash" }
],
"ReferentDocumentNumber": "8ZBU67JM-8ZBU67JM-42",
"Items": [
{
"Name": "Test artikal",
"Quantity": 1,
"UnitPrice": 121.00,
"Labels": ["А"],
"TotalAmount": 121.00
}
]
}Idempotencija
- Isti RequestId + isto telo vraća keširani prethodni odgovor (račun se ne potpisuje ponovo). Bezbedno za automatske ponovljene pokušaje.
- Isti RequestId + drugačije telo vraća grešku
2899(konflikt identifikatora). - Bez RequestId račun se potpisuje bez idempotencije. Za pouzdanu integraciju uvek šaljite
RequestId.
GET /api/v3/invoices/{requestId}
/api/v3/invoices/{requestId}Dohvata ranije fiskalizovan račun po njegovom RequestId. Namenjeno oporavku ESIR-a posle prekida veze: ako ESIR nije primio odgovor na POST /invoices, ponavlja isti RequestId ovde i dobija (već potpisan) rezultat, bez rizika od dvostruke fiskalizacije.
- Odgovor:
200 OKsaInvoiceResulttelom ako zapis postoji za datiRequestIdi aktivnu karticu. - Ako zapis ne postoji ili nema kartice, vraća se
200 OKsa telomnull.
GET http://127.0.0.1:8443/api/v3/invoices/8f3c1a92e7b04f5c9a1dTipovi računa, transakcija i plaćanja
Enumeracije se u zahtevu šalju nazivom člana (case-insensitive) ili celim brojem; u odgovoru se vraćaju kao celi brojevi.
Tip računa (invoiceType)
| Naziv | Broj | Značenje |
|---|---|---|
Normal | 0 | Promet (redovan račun). |
Proforma | 1 | Predračun. |
Copy | 2 | Kopija (referiše original). |
Training | 3 | Obuka. |
Advance | 4 | Avans. |
Tip transakcije (transactionType)
| Naziv | Broj | Značenje |
|---|---|---|
Sale | 0 | Prodaja. |
Refund | 1 | Refundacija (referiše original). |
Način plaćanja (paymentType)
| Naziv | Broj | Značenje |
|---|---|---|
Other | 0 | Drugo bezgotovinsko. |
Cash | 1 | Gotovina. |
Card | 2 | Platna kartica. |
Check | 3 | Ček. |
WireTransfer | 4 | Prenos na račun. |
Voucher | 5 | Vaučer. |
MobileMoney | 6 | Instant plaćanje / mobilni novac. |
Poreske oznake i obračun
Svaka stavka nosi jednu ili više poreskih oznaka (labels), npr. А. Skup važećih oznaka i stopa ne definiše ESIR nego dolazi sa kartice i iz komandi SUF-a; ESIR ih čita iz GET /status (currentTaxRates). Nepostojeća ili neaktivna oznaka odbija se greškom 2310.
Tip kategorije (categoryType)
| Broj | Značenje |
|---|---|
| 0 | Porez na neto osnovicu (npr. PDV uračunat u cenu: porez = ukupno × stopa / (100 + stopa)). |
| 1 | Porez na ukupno. |
| 2 | Iznos po jedinici (specifična akciza po količini). |
Obračun poreza po stavci radi L-PFR na osnovu oznaka i iznosa iz zahteva; rezultat je u taxItems odgovora. ESIR ne mora sam da računa porez: dovoljno je da pošalje ispravne oznake i totalAmount.
Model grešaka
Sve poslovne i validacione greške vraćaju HTTP 400 sa jedinstvenim telom greške. Izuzetak je POST /pin, koji ishod uvek vraća kao 200 sa golom šifrom.
{
"message": "Request validation failed.",
"modelState": [
{ "property": "items[0].quantity", "errors": ["2800"] }
]
}message: kratak opis (nije za prikaz kasiru).modelState: lista grešaka; svaki element imaproperty(camelCase putanja polja, prazno za greške na nivou zahteva) ierrors(niz šifara).- ESIR prikazuje poruku na osnovu šifre iz
errors, a ne teksta izmessage.
Mapiranje HTTP statusa
| Situacija | HTTP | Telo |
|---|---|---|
| Validaciona / poslovna greška | 400 | modelState sa šifrom (2800, 2310, 2400, 2210, 2899...). |
| POST /pin ishod | 200 | Gola šifra kao JSON string ("0100", "2100"...). |
| Prekoračen limit brzine | 429 | (bez tela) |
| Zahtev van dozvoljene adrese | 403 | (bez tela) |
| Neočekivana interna greška | 500 | modelState sa šifrom 1999. |
Šifarnik statusnih kodova i grešaka
BokaLPFR vraća isključivo kodove iz šifarnika Tehničkog vodiča PU, uz jedan dodatni kod definisan proizvodom (2410). Sve šifre su tačno četiri cifre.
Informativni i statusni kodovi (GSC)
| Kod | Značenje |
|---|---|
0000 | Sve je u redu. |
0100 | PIN je ispravan. |
0210 | Internet veza dostupna. |
0220 | Internet veza nedostupna. |
1100 | Interna memorija pri kraju. |
1300 | Pametna kartica nije prisutna. |
1400 | Iščitavanje je zahtevano. |
1500 | Potreban je unos PIN-a. |
1999 | Nedefinisano upozorenje / interna greška. |
Greške
| Kod | Značenje |
|---|---|
2100 | PIN nije ispravan. |
2110 | Kartica je zaključana (višestruki pogrešan PIN). |
2210 | Bezbednosni element zaključan: obavezno iščitavanje pre daljeg potpisivanja. |
2220 | Greška u komunikaciji sa bezbednosnim elementom. |
2230 | Verzija protokola nije podržana. |
2300 | Neispravan zahtev (struktura / format tela). |
2310 | Neispravna poreska oznaka (nepostojeća ili neaktivna stopa). |
2400 | L-PFR nije konfigurisan / nije spreman. |
2800 | Obavezno polje nedostaje. |
2801 | Polje je predugačko. |
2802 | Polje je prekratko. |
2803 | Polje ima neispravnu dužinu. |
2804 | Vrednost polja je van dozvoljenog opsega. |
2805 | Neispravna vrednost polja. |
2806 | Neispravan format polja. |
2807 | Lista ima premalo elemenata. |
2808 | Lista ima previše elemenata. |
2809 | Sertifikat bezbednosnog elementa je istekao. |
2820 | Isteklo vreme obrade zahteva (pokušajte ponovo). |
2899 | Konflikt identifikatora zahteva (RequestId sa drugačijim telom). |
Kod specifičan za proizvod
| Kod | Značenje |
|---|---|
2410 | Pretplatna licenca BokaLPFR-a nije aktivna za produkcionu karticu. Obustavlja se izdavanje novih računa dok se licenca ne aktivira; fiskalni podaci i iščitavanje ostaju dostupni. Sandbox kartice ne podležu ovoj proveri. |
Validaciona pravila po polju
Pravila koja POST /invoices primenjuje pre potpisivanja. Kada je obavezno numeričko polje odsutno vraća se 2800, a kada je prisutno ali neispravno 2805.
| Polje | Pravilo | Šifra |
|---|---|---|
invoiceType | Definisan tip (0..4). | 2805 |
transactionType | Definisan tip (0..1). | 2805 |
payment | Najmanje jedan element. | 2800 |
payment[].paymentType | Definisan način (0..6). | 2805 |
items | Najmanje jedan element. | 2807 |
items[].name | Obavezno; ≤ 2048. | 2800 / 2804 |
items[].quantity | Obavezno; > 0; ≤ 3 decimale. | 2800 / 2805 / 2804 |
items[].unitPrice | Obavezno; u opsegu; ≤ 4 decimale. | 2800 / 2805 / 2804 |
items[].totalAmount | Obavezno; u opsegu; ≤ 4 decimale. | 2800 / 2805 / 2804 |
items[].labels | Najmanje jedna; bez duplikata. | 2800 / 2805 |
items[].labels[] | Oznaka mora postojati u aktivnoj poreskoj grupi. | 2310 |
items[].gtin | Opciono; kad postoji 8..14. | 2803 / 2805 |
cashier | ≤ 50 karaktera. | 2804 |
buyerId | Kad postoji: neprazno, ≤ 20. | 2805 / 2804 |
buyerCostCenterId | Kad postoji: neprazno, ≤ 50; zahteva buyerId. | 2800 / 2801 / 2805 |
invoiceNumber | Kad postoji: neprazno, ≤ 60. | 2805 / 2804 |
dateAndTimeOfIssue | Kad postoji: ispravan datum/vreme. | 2805 |
referentDocumentNumber | Obavezno za Refund/Copy; format; ≤ 50. | 2800 / 2804 / 2806 |
referentDocumentDT | Kad postoji: ispravno, ne u budućnosti; zahteva broj. | 2805 / 2804 / 2800 |
options.omitQRCodeGen | "0" ili "1". | 2805 |
options.omitTextualRepresentation | "0" ili "1". | 2805 |
RequestId (zaglavlje) | ≤ 32 karaktera. | 2801 |
Verifikacioni URL i QR kod
Za svaki uspešno fiskalizovan račun odgovor sadrži verificationUrl i verificationQRCode. ESIR ih samo štampa na računu i ne gradi ih sam.
verificationUrlvodi na stranicu za proveru računa u sistemu Poreske uprave. Oblik je{adresa-za-verifikaciju}/v/?vl={podaci}, gde adresa dolazi sa kartice / iz komandi SUF-a, a podaci su base64url zapis potpisanih podataka računa sa kontrolnim zbirom.verificationQRCodeje isti sadržaj spreman za štampu kao QR kod.
Adrese za verifikaciju nikada nisu unapred upisane u proizvod niti ih korisnik menja.
Preporuke za integratore
- Provera pre prvog računa. Pozovite
GET /statusi proverite dagscne sadrži blokirajuće kodove (1300,1500,2110,2210,2400). - PIN. Posle restarta ili promene kartice bezbednosnom elementu je potreban PIN (
1500). Pošaljite ga prekoPOST /pinili ga korisnik unosi u BokaLPFR Monitor. - Idempotencija i oporavak. Uz svaki
POST /invoicesšaljite jedinstveniRequestId. Posle prekida veze ponovite isti zahtev ili pozoviteGET /invoices/{requestId}. Tako izbegavate dvostruku fiskalizaciju. - Vremensko ograničenje. Preporučeni HTTP timeout za
POST /invoicesje najmanje 30 sekundi. Prvi zahtev posle ubacivanja kartice može trajati duže. - Obrada grešaka. Prikažite kasiru poruku na osnovu šifre iz šifarnika, a ne na osnovu
message. - Bez zaobilaženja. Sva komunikacija ide kroz navedene endpointe; ESIR ne priča direktno sa karticom ni sa SUF-om.
- Poreske oznake iz statusa. Skup važećih oznaka i stopa čitajte iz
GET /status; ne upisujte ih fiksno u ESIR.
Verzija protokola i identitet uređaja
| Stavka | Vrednost |
|---|---|
| Verzija protokola (protocolVersion) | 3.0 |
| Proizvođač (make) | BOKA GROUP DOO |
| Model (model) | BokaLPFR Windows ili BokaLPFR macOS, zavisno od izdanja |
| Verzija hardvera (hardwareVersion) | 1.0 |
| Verzija softvera (softwareVersion) | 1.4.0 |
| Registracioni kod proizvođača | 9A-0001 (Windows), 9B-0001 (macOS) |
| IB broj prijave kod Poreske uprave | 1664 (Windows), 1663 (macOS) |
| Registracioni kod uređaja (mrc) | 9A-0001-{UID} ili 9B-0001-{UID} |
Windows i macOS izdanje dele isto fiskalno jezgro i isti API, ali se kod Poreske uprave vode kao dva odvojena elementa, pa svako ima svoj registracioni kod i IB broj. Identitet izdanja (make, model, hardwareVersion, registracioni kod) je fiksan i vezan za prijavu; softwareVersion se menja sa svakom verzijom proizvoda. ESIR ne treba da tumači mrc: prosleđuje ga u odgovoru onako kako ga dobije.