📡 HrFiskalizator – SUPER Plugin API Dokumentacija

📋 Pregled

SUPER plugin omogućava slanje i primanje elektroničkih računa (eRačuni) putem SUPER (DB Informatika) platforme, u skladu s hrvatskim zakonodavnim okvirom za B2B eRačune.

ℹ️ Baza URL-a: Svi pozivi prema pluginu idu na http://localhost:8449/super/...
Plugin automatski dohvaća i osvježava Bearer token prema SUPER API-ju (https://apitest.super.hr ili https://api.super.hr).
Svaki zahtjev prema SUPER API-ju automatski dobiva MessageId (UUID) i CompanyGuid iz konfiguracije.
⚠️ OIB parametar: Plugin podržava dva načina rada:
SINGLEUSER – jedan aktivni account, ?oib= je opcionalan
MULTIUSER – više accounta, ?oib=12345678901 je obavezan uz svaki poziv

⚠️ sve operacije su podržane i razmjenom datoteka !

🏥 1. Ping / Provjera dostupnosti

GET /super/ping

Provjerava je li plugin aktivan. Ne komunicira s SUPER API-jem. (i ujedno obnavlja token za aktivni oib)

📡 fetch primjer
const res = await fetch('/super/ping');
const txt = await res.text();
console.log(txt);
📥 Response

 {
  "message": "SUPER plugin OK",
  "version": 1,
  "mode": "PRODUKCIJSKI",
  "endpoint": "https://api.super.hr"
}
                
GET /super/version  ili  /super/verzija

Vraća verziju plugina kao plain text.

GET /super/getmode

Vraća koji SUPER server je u upotrebi (TEST ili PRODUCTION).

📡 fetch primjer
const res = await fetch('/super/getmode');
const txt = await res.text();
// npr. "TEST" ili "PRODUCTION"
📥 Response
TEST
GET /super/getusermode

Vraća trenutni user mode i informaciju o obaveznosti OIB parametra.

📥 Response
{
  "userMode": "SINGLEUSER",
  "isMultiUser": false,
  "description": "OIB parameter is optional, uses active OIB if not provided"
}

👤 2. Upravljanje accountima

GET /super/accounts  ili  /super/getaccounts

Vraća listu svih konfiguriranih accounta (OIB + naziv tvrtke).

📡 fetch primjer
const res = await fetch('/super/accounts');
const list = await res.json();
// [{oib, naziv}, ...]
📥 Response
[
  { "oib": "12345678901", "naziv": "Firma d.o.o." },
  { "oib": "98765432109", "naziv": "Druga d.o.o." }
]
GET /super/getactiveaccount

Vraća trenutno aktivni account.

📥 Response
{
  "userMode": "SINGLEUSER",
  "oib": "12345678901",
  "naziv": "Firma d.o.o.",
  "companyGuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
GET /super/setactiveoib?oib=12345678901

Postavlja aktivni account prema OIB-u. Primjenjuje se samo u SINGLEUSER modu.

ParametarStatusOpis
oibOBAVEZNOOIB tvrtke koja mora biti konfigurirana u pluginu
📡 fetch primjer
const res = await fetch('/super/setactiveoib?oib=12345678901');
const data = await res.json();
📥 Response
{
  "success": true,
  "oib": "12345678901",
  "naziv": "Firma d.o.o.",
  "message": "Active OIB set"
}
GET /super/account[?oib=...]

Vraća detalje o accountu: OIB, naziv, companyGuid, username.

{
  "oib": "12345678901",
  "naziv": "Firma d.o.o.",
  "companyGuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "username": "korisnik@firma.hr"
}

📤 3. Slanje XML eRačuna

POST /super/sendxmlinvoice[?oib=...&UblDocumentType=1&pdfname=racun.pdf]

Šalje UBL 2.1 XML račun prema SUPER platformi. Plugin automatski Base64 enkodira XML i poziva SendingInvoice/SendSendingInvoiceUbl endpoint SUPER API-ja.

ParametarTipStatusOpis
Body text/plain (XML) OBAVEZNO UBL 2.1 Invoice ili CreditNote XML kao plain text (URL-encoded POST body)
oib string OPCIONALNO* OIB pošiljatelja (* obavezno u MULTIUSER modu)
UblDocumentType integer OPCIONALNO 1 = Invoice (default), 2 = CreditNote
pdfname string OPCIONALNO Ako je zadano, automatski se generira PDF vizualizacija i umeće u XML kao cac:AdditionalDocumentReference prilog
pdfid string OPCIONALNO ID dokumenta referenci (default: DODATAK-1)
pdfdesc string OPCIONALNO Opis priloga (default: Vizualizacija računa)
ℹ️ Automatska obrada: Plugin automatski dodaje MessageId (UUID) i CompanyGuid u tijelo zahtjeva prema SUPER API-ju. Klijent ih ne treba slati.
📡 fetch primjer (bez PDF)
const xmlContent = '<?xml version="1.0"...>';
const res = await fetch('/super/sendxmlinvoice?oib=12345678901', {
    method: 'POST',
    headers: { 'Content-Type': 'text/plain; charset=UTF-8' },
    body: xmlContent
});
const data = await res.json();
console.log(data);
📡 fetch primjer (s PDF prilogom)
const res = await fetch(
    '/super/sendxmlinvoice?oib=12345678901&pdfname=racun-001.pdf',
    {
        method: 'POST',
        headers: { 'Content-Type': 'text/plain; charset=UTF-8' },
        body: xmlContent
    }
);
const data = await res.json();
📥 Response – uspješno
{
  "MessageId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "ErrorMessage": null,
  "Guid": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy"
}
📥 Response – greška
{
  "MessageId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "ErrorMessage": "Račun s tim brojem već postoji"
}

📄 4. Dohvat XML-a računa po GUID-u

GET /super/getxmlinvoice/{direction}/{guid}[?oib=...]

Dohvaća originalni UBL 2.1 XML računa s SUPER platforme. SUPER API vraća XML Base64 enkodiran unutar JSON odgovora – plugin automatski dekodira i vraća čisti XML klijentu.

ParametarStatusOpis
direction OBAVEZNO outgoing = izlazni račun (→ SendingInvoice/GetSendingInvoice)
incoming = ulazni račun (→ Invoice/GetInvoice)
guid OBAVEZNO GUID računa (iz liste računa)
oib OPCIONALNO* OIB (* obavezno u MULTIUSER modu)
📡 fetch primjer – preuzimanje XML-a
const guid = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx';
const res = await fetch(
    '/super/getxmlinvoice/outgoing/' + guid + '?oib=12345678901'
);
const xml = await res.text();
// Content-Type: application/xml; charset=UTF-8
📡 fetch primjer – download kao datoteka
const guid = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx';
const url = '/super/getxmlinvoice/incoming/' + guid + '?oib=12345678901';
const a = document.createElement('a');
a.href = url;
a.download = 'racun.xml';
a.click();
📥 Response
<?xml version="1.0" encoding="UTF-8"?>
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" ...>
  ...
</Invoice>
⚠️ Napomena: Ako XML ne sadrži traženo UBL polje (sendingInvoiceUBL / invoiceUBL), vraća se HTTP 404 s JSON greškom.

🖨️ 5. Dohvat PDF-a (embedded prilog iz XML-a)

GET /super/getinvoicepdf/{direction}/{guid}[?oib=...]

Dohvaća PDF računa koji je umetnut kao cac:AdditionalDocumentReference prilog u UBL XML-u (Base64 enkodiran, mimeCode="application/pdf"). Ako XML ne sadrži PDF prilog, endpoint ne vraća ništa korisno.

📡 fetch primjer
const guid = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx';
const res = await fetch(
    '/super/getinvoicepdf/outgoing/' + guid + '?oib=12345678901'
);
const blob = await res.blob();
// Content-Type: application/pdf
📡 fetch primjer – download
const url = '/super/getinvoicepdf/incoming/' + guid + '?oib=12345678901';
const a = document.createElement('a');
a.href = url;
a.download = 'racun.pdf';
a.click();

🖼️ 6. SUPER nativna PDF vizualizacija

GET /super/nativevizualizacija/{direction}/{guid}[?oib=...]

Dohvaća PDF vizualizaciju računa direktno od SUPER API-ja (GetSendingInvoiceDetailVisualization / GetInvoiceDetailVisualization). PDF je generiran na strani SUPER servera.

ParametarStatusOpis
direction OBAVEZNO outgoingsendingInvoiceDetailVisualization
incominginvoiceDetailVisualization
guid OBAVEZNO GUID računa
oib OPCIONALNO* OIB (* obavezno u MULTIUSER modu)
📡 fetch primjer – prikaz u browseru
const guid = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx';
const res = await fetch(
    '/super/nativevizualizacija/outgoing/' + guid + '?oib=12345678901'
);
const blob = await res.blob();
const url = URL.createObjectURL(blob);
window.open(url, '_blank');
// Content-Type: application/pdf
📡 fetch primjer – download
const url = '/super/nativevizualizacija/incoming/'
    + guid + '?oib=12345678901';
const a = document.createElement('a');
a.href = url;
a.download = 'vizualizacija.pdf';
a.click();
📥 Response – greška (vizualizacija nije dostupna)
{
  "error": "Vizualizacija nije dostupna. Polje sendingInvoiceDetailVisualization nije u odgovoru."
}

🌐 7. HTML vizualizacija (HrFiskalizator)

GET /super/getinvoicehtml/{direction}/{guid}[?oib=...]

Dohvaća XML računa s SUPER-a, a zatim generira HTML vizualizaciju putem HrFiskalizator internog generatora (invoice_creator.php?html=true). Korisno za prikaz računa u browseru.

📡 fetch primjer
const guid = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx';
const res = await fetch(
    '/super/getinvoicehtml/outgoing/' + guid + '?oib=12345678901'
);
const html = await res.text();
// Content-Type: text/html; charset=UTF-8
document.getElementById('preview').innerHTML = html;
📡 fetch primjer – prikaz u iframe-u
const url = '/super/getinvoicehtml/incoming/'
    + guid + '?oib=12345678901';
document.getElementById('iframe').src = url;

🖨️ 8. PDF vizualizacija (HrFiskalizator)

GET /super/getinvoicevisualization/{direction}/{guid}[?oib=...]

Dohvaća XML računa s SUPER-a, a zatim generira PDF vizualizaciju putem HrFiskalizator internog generatora (invoice_creator.php). PDF se generira lokalno na strani HrFiskalizatora.

📡 fetch primjer
const guid = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx';
const res = await fetch(
    '/super/getinvoicevisualization/outgoing/' + guid + '?oib=12345678901'
);
const blob = await res.blob();
// Content-Type: application/pdf
📡 razlika naspram /nativevizualizacija
/nativevizualizacija – PDF generira SUPER server

/getinvoicevisualization – PDF generira HrFiskalizator lokalno iz UBL XML-a

📋 9. Lista računa

Ovi endpointi se prosljeđuju direktno prema SUPER API-ju putem generičkog proxy mehanizma.

POST /super/Invoice/GetInvoiceList[?oib=...]

Dohvaća listu ulaznih (primljenih) računa.

POST /super/SendingInvoice/GetSendingInvoiceList[?oib=...]

Dohvaća listu izlaznih (poslanih) računa.

Request Body (JSON)

ParametarTipStatusOpis
DateFrom string (datum) OPCIONALNO Datum od (npr. 2026-01-01)
DateTo string (datum) OPCIONALNO Datum do (npr. 2026-01-31)
📡 fetch primjer – ulazni računi
const res = await fetch(
    '/super/Invoice/GetInvoiceList?oib=12345678901',
    {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
            DateFrom: '2026-01-01',
            DateTo:   '2026-01-31'
        })
    }
);
const data = await res.json();
const list = data.invoices || [];
📡 fetch primjer – izlazni računi
const res = await fetch(
    '/super/SendingInvoice/GetSendingInvoiceList?oib=12345678901',
    {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
            DateFrom: '2026-01-01',
            DateTo:   '2026-01-31'
        })
    }
);
const data = await res.json();
const list = data.sendingInvoices || [];
📥 Response – ulazni (invoices)
{
  "MessageId": "...",
  "invoices": [
    {
      "guid":           "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "uniqueId":       "HR-...",
      "number":         "1-1-1",
      "issueDate":      "2026-01-15T00:00:00",
      "supplier":       "Dobavljač d.o.o.",
      "supplierOib":    "11111111111",
      "payableAmount":  1234.56,
      "invoiceStatus":  10
    }
  ]
}
📥 Response – izlazni (sendingInvoices)
{
  "MessageId": "...",
  "sendingInvoices": [
    {
      "guid":                  "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy",
      "uniqueId":              "HR-...",
      "number":                "2026-1-1",
      "issueDate":             "2026-01-20T00:00:00",
      "customer":              "Kupac d.o.o.",
      "customerOib":           "22222222222",
      "payableAmount":         500.00,
      "sendingInvoiceStatus":  40
    }
  ]
}

💾 10. Masovno preuzimanje XML-ova u folder na serveru

POST /super/downloadperiodtoserverfolder?targetfolder=...&smjer=...&odDatuma=...&doDatuma=...[&oib=...]

Dohvaća listu računa za zadani vremenski period i automatski sprema svaki UBL XML na disk na strani servera (tamo gdje radi HrFiskalizator). Korisno kada su server i klijent isto računalo, ili za automatiziranu arhivaciju bez ručnog ZIP-preuzimanja.

ℹ️ Napomena: Ovo je serverska operacija – datoteke se ne preuzimaju u browser, već se zapisuju na disk na računalu gdje radi HrFiskalizator. Za udaljeni download na klijentsko računalo koristite ZIP button u sučelju.

Query parametri

ParametarTipStatusOpis
targetfolder string OBAVEZNO Apsolutni path foldera na serveru (npr. C:\Racuni\2026 ili /var/racuni). Folder će se automatski kreirati ako ne postoji.
smjer string OPCIONALNO incoming (ulazni, default) ili outgoing (izlazni)
odDatuma string (datum) OPCIONALNO Datum od (format: YYYY-MM-DD), npr. 2026-01-01
doDatuma string (datum) OPCIONALNO Datum do (format: YYYY-MM-DD), npr. 2026-01-31
oib string OPCIONALNO* OIB accounta – obavezan u MULTIUSER modu

Ponašanje

📡 fetch primjer – ulazni računi
const qs = new URLSearchParams({
    oib:          '12345678901',
    targetfolder: 'C:\\Racuni\\2026-01',
    smjer:        'incoming',
    odDatuma:     '2026-01-01',
    doDatuma:     '2026-01-31'
});
const res = await fetch(
    '/super/downloadperiodtoserverfolder?' + qs,
    { method: 'POST' }
);
const data = await res.json();
📥 Response – uspješno
{
  "success": true,
  "smjer": "incoming",
  "folder": "C:\\Racuni\\2026-01",
  "downloaded": 42,
  "failed": 0
}
📥 Response – s greškama
{
  "success": true,
  "smjer": "outgoing",
  "folder": "C:\\Racuni\\2026-01",
  "downloaded": 39,
  "failed": 3,
  "failedList": [
    "2026-1-7",
    "2026-1-15",
    "2026-1-28"
  ]
}
✅ Sučelje (UI): U pregledu računa (Računi tab SUPER plugina) dostupan je gumb 💾 Folder koji otvara dijalog za unos patha foldera. Koriste se trenutno odabrani filteri (smjer, datum od/do). Zadnji korišteni folderi pamte se u localStorage i dostupni su kao autocomplete lista.

📊 11. EReporting – Odbijanje i Uplata

EReporting endpointi se prosljeđuju direktno prema SUPER API-ju putem generičkog proxy mehanizma.

POST /super/EReporting/RejectInvoice[?oib=...]

Odbija ulazni račun s razlogom. Koristi se samo za ulazne (incoming) račune.

Request Body

ParametarTipStatusOpis
Guid string OBAVEZNO GUID računa koji se odbija
RejectReasonType integer OBAVEZNO 1 = Pogrešan račun, 2 = Dupliciran račun, 11 = Ostalo
RejectionReasonDescription string OPCIONALNO Tekstualni opis razloga odbijanja
📡 fetch primjer
const res = await fetch(
    '/super/EReporting/RejectInvoice?oib=12345678901',
    {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
            Guid: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
            RejectReasonType: 1,
            RejectionReasonDescription: 'Pogrešan iznos'
        })
    }
);
const data = await res.json();
📥 Response – uspješno
{
  "MessageId": "...",
  "ErrorMessage": null
}
POST /super/EReporting/AddPaymentForSendingInvoice[?oib=...]

Evidentira uplatu za izlazni račun. Koristi se samo za izlazne (outgoing) račune.

Request Body

ParametarTipStatusOpis
Guid string OBAVEZNO GUID računa
PaymentDate string (datum) OBAVEZNO Datum uplate (npr. 2026-01-20)
PaymentAmount decimal OBAVEZNO Iznos uplate u EUR
PaymentMethod integer OBAVEZNO 1 = Transakcijski račun, 2 = Obračunsko plaćanje, 11 = Ostalo
MarkAsPaidInFull boolean OPCIONALNO Označi kao u potpunosti plaćeno
📡 fetch primjer
const res = await fetch(
    '/super/EReporting/AddPaymentForSendingInvoice?oib=12345678901',
    {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
            Guid:             'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
            PaymentDate:      '2026-01-20',
            PaymentAmount:    1234.56,
            PaymentMethod:    1,
            MarkAsPaidInFull: true
        })
    }
);
const data = await res.json();
📥 Response – uspješno
{
  "MessageId": "...",
  "ErrorMessage": null
}

🔑 11. Upravljanje tokenom

GET /super/token[?oib=...]

Prisilno osvježava Bearer token za aktivni account i vraća novi token. Token se inače osvježava automatski pri svakom proxy pozivu.

📡 fetch primjer
const res = await fetch('/super/token?oib=12345678901');
const data = await res.json();
📥 Response
{
  "oib":     "12345678901",
  "token":   "eyJhbGciOiJSUzI1NiIsInR5cCI6...",
  "message": "Token refreshed"
}

🔀 12. Generički API proxy

POST /super/{api-path}[?oib=...&response=INI|SIMPLE|RAW]

Svi pozivi koji ne odgovaraju specifičnim endpointima (gore navedenim) prosljeđuju se direktno prema SUPER API-ju. Plugin automatski dodaje:

ℹ️ Response format: Parametar ?response= u query stringu override-a format odgovora:
RAW – originalni JSON (default)
INI – key=value flat format
SIMPLE – samo ključna polja (MessageId, ErrorMessage, Guid, UniqueId + primitivi)
📡 fetch primjer – direktan API poziv
// Npr. dohvat detalja računa direktno
const res = await fetch(
    '/super/SendingInvoice/GetSendingInvoice?oib=12345678901',
    {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ Guid: 'xxxxxxxx-...' })
    }
);
const data = await res.json();
📡 fetch primjer – INI format
const res = await fetch(
    '/super/SendingInvoice/GetSendingInvoice?oib=12345678901&response=INI',
    {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ Guid: 'xxxxxxxx-...' })
    }
);
const ini = await res.text();
// MessageId=xxxxxxxx-...
// Guid=yyyyyyyy-...
⚠️ Napomena: Parametar ?response= se uklanja iz query stringa prije prosljeđivanja prema SUPER API-ju – ne propagira se dalje.

📊 13. Statusi, načini plaćanja, razlozi odbijanja

GET /super/getinvoicestatuses

Vraća sve enum vrijednosti kao JSON objekt – statusi ulaznih/izlaznih računa, načini plaćanja i razlozi odbijanja.

📡 fetch primjer
const res = await fetch('/super/getinvoicestatuses');
const data = await res.json();
📥 Response
{
  "outgoing": {
    "10":  "Račun u stanju nacrta",
    "40":  "Poslano",
    "50":  "Greška kod slanja",
    "55":  "Nemogućnost dostave",
    "60":  "Dostavljeno",
    "90":  "Odbijeno",
    "100": "Djelomično plaćeno",
    "110": "Plaćeno"
  },
  "incoming": {
    "10": "Zaprimljeno",
    "40": "Odbijeno"
  },
  "paymentMethods": {
    "1":  "Transakcijski račun",
    "2":  "Obračunsko plaćanje",
    "11": "Ostalo"
  },
  "rejectReasons": {
    "1":  "Neusklađenost koja ne utječe na obračun poreza",
    "2":  "Neusklađenost koja utječe na obračun poreza",
    "11": "Ostalo"
  }
}

Statusi izlaznih računa (outgoing)

KodOpis
10Račun u stanju nacrta
40Poslano
50Greška kod slanja
55Nemogućnost dostave
60Dostavljeno
90Odbijeno
100Djelomično plaćeno
110Plaćeno

Statusi ulaznih računa (incoming)

KodOpis
10Zaprimljeno
40Odbijeno
HrFiskalizator SUPER Plugin API Dokumentacija — generirana automatski