Storno i korektivni

Storno i korektivni račun

Fiskalizovani račun se ne briše i ne mijenja. Ispravka ili storno ide kao novi dokument tipa Corrective, koji se referencira na original preko IIC-a.

Isti mehanizam važi za bezgotovinske i gotovinske račune.

Šta želiteŠta šaljete
Storno (poništavanje cijelog računa)type: "Corrective" + iste stavke kao original, negativna količina i negativna cijena
Korekcija (dio količine, pogrešna cijena, zamjena artikla)type: "Corrective" + delta stavke (minus vraćeno, plus ispravljeno)
Korekcija (dio količine, pogrešna cijena, zamjena artikla)type: "Corrective" + delta stavke (minus vraćeno, plus ispravljeno)

Nema DELETE /invoices/{id} za fiskalizovani račun. Original ostaje u evidenciji; korektivni ga koriguje kod Poreske.

Obavezna polja

Pored uobičajenog payload-a (Payload):

PoljeOpis
typeCorrective (prihvaća i CORRECTIVE)
original.idIIC originalnog računa (32 hex znaka)
original.issuedAtDatum/vrijeme izdavanja originala (ISO-8601) — uzmite fiscalizedAt sa GET
itemsMin. 1 stavka; količina ne smije biti 0
typeOfInvoice / paymentMethodIsti kao na originalu (Cash+CARD, NonCash+ACCOUNT, …)

orderNumber: 0 — sistem dodjeljuje novi redni broj (korektivni nije isti broj kao original).

Stavke

  • Storno / povrat: quantity i unitPrice su negativni (ista apsolutna vrijednost kao na originalu).
  • Nova / ispravljena stavka: oba polja pozitivna, kao na običnom računu.
  • quantity ne smije biti 0.
  • PDV stopa (vat.rate) mora biti ista kao na originalnoj stavci.

1. Uzmi original

Bezgotovinski / draft tok:

curl -s "https://api.fiskalmn.me/api/invoices/{id}" \
  -H "Authorization: Bearer fk_live_YOUR_KEY"

Gotovinski:

curl -s "https://api.fiskalmn.me/api/invoices/cash/{id}" \
  -H "Authorization: Bearer fk_live_YOUR_KEY"

Sa odgovora trebate:

  • iic → original.id
  • fiscalizedAt → original.issuedAt
  • invoiceData.items (naziv, šifra, jedinica, cijena, količina, PDV)
  • typeOfInvoice, paymentMethod, buyer

Račun mora biti status: "Fiscalized" i imati IIC. Draft se ne stornira korektivnim — obrišite / ne fiskalizujte draft.

2. Storno (cijeli račun)

Iste stavke kao original, količina i jedinična cijena sa minusom.

Original: 4× guma @ 75.00, 2× burger @ 5.00.

{
  "type": "Corrective",
  "orderNumber": 0,
  "typeOfInvoice": "NonCash",
  "paymentMethod": "ACCOUNT",
  "paymentDeadline": "2026-09-23T12:00:00Z",
  "buyer": {
    "idType": "TIN",
    "idNumber": "12345678",
    "name": "TOP BUYER DOO",
    "address": "4 JULA BB",
    "city": "PODGORICA",
    "country": "MNE"
  },
  "items": [
    {
      "code": "#guma",
      "name": "Guma za automobil",
      "unit": "komad",
      "unitPrice": -75.00,
      "quantity": -4,
      "vat": { "rate": 21 }
    },
    {
      "code": "#burger",
      "name": "Burger",
      "unit": "komad",
      "unitPrice": -5.00,
      "quantity": -2,
      "vat": { "rate": 7 }
    }
  ],
  "note": "Kupac je odustao od kupovine.",
  "original": {
    "id": "0AE36859887129D6363C40F662FF9AE4",
    "issuedAt": "2026-03-09T17:43:33Z"
  }
}

Ukupan iznos korektivnog je negativan i po apsolutnoj vrijednosti jednak originalu.

3. Korekcija (nije pun storno)

Šaljete samo razliku u odnosu na original.

Povrat 1 od 4 gume:

"items": [
  {
    "code": "#guma",
    "name": "Guma za automobil",
    "unit": "komad",
    "unitPrice": -75.00,
    "quantity": -1,
    "vat": { "rate": 21 }
  }
]

Pogrešna cijena (storno stare linije + ispravna):

"items": [
  {
    "code": "#guma",
    "name": "Guma za automobil",
    "unit": "komad",
    "unitPrice": -75.00,
    "quantity": -4,
    "vat": { "rate": 21 }
  },
  {
    "code": "#guma",
    "name": "Guma za automobil",
    "unit": "komad",
    "unitPrice": 70.00,
    "quantity": 4,
    "vat": { "rate": 21 }
  }
]

Neto efekat: stornirate staru cijenu, pa dodate ispravnu.

4. Slanje

Bezgotovinski (i B2C kartica preko draft toka)

Isti flow kao običan račun: Brzi start.

# 1. Draft
curl -s -X POST "https://api.fiskalmn.me/api/invoices/draft" \
  -H "Authorization: Bearer fk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{ ... payload iznad ... }'
 
# 2. Fiskalizacija
curl -s -X POST "https://api.fiskalmn.me/api/invoices/{id}/fiscalize" \
  -H "Authorization: Bearer fk_live_YOUR_KEY"
 
# 3. Poll dok status nije Fiscalized
curl -s "https://api.fiskalmn.me/api/invoices/{id}" \
  -H "Authorization: Bearer fk_live_YOUR_KEY"

Gotovinski (POS, jedan korak)

curl -s -X POST "https://api.fiskalmn.me/api/invoices/cash/create-and-print" \
  -H "Authorization: Bearer fk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "Corrective",
    "orderNumber": 0,
    "typeOfInvoice": "Cash",
    "paymentMethod": "CARD",
    "paymentDeadline": "2026-09-23T12:00:00Z",
    "items": [
      {
        "name": "Usluga",
        "code": "SVC-001",
        "unit": "kom",
        "unitPrice": -25.00,
        "quantity": -1,
        "vat": { "rate": 21 }
      }
    ],
    "original": {
      "id": "IIC_ORIGINALNOG_GOTOVINSKOG",
      "issuedAt": "2026-09-22T10:15:00Z"
    }
  }'

Bez original.id / original.issuedAt ovaj endpoint vraća 400.

Pravila

  1. Original mora biti fiskalizovan (ima IIC). Jedan original može imati više korektivnih.
  2. typeOfInvoice i paymentMethod uskladite sa originalom — inače 400 na validaciji plaćanja.
  3. Ne šaljite quantity: 0.
  4. Na storno stavci unitPrice ide u minus zajedno sa quantity.
  5. IIC u original.id kopirajte 1:1 (velika slova, bez razmaka).
  6. issuedAt mora odgovarati vremenu originala (milisekunde API skida sam).
  7. Test: fk_test_ ključ; produkcija: fk_live_. Test i live računi se ne miješaju.
  8. Sačuvajte id korektivnog uz originalnu narudžbu (originalInvoiceId / correctiveInvoiceId).

Greške

SituacijaHTTPPoruka
Nema original na gotovinskom korektivnom400Obavezni su IIC i datum izdavanja originala
quantity = 0400Količina na korektivnom računu ne smije biti 0
Pogrešan paymentMethod za typeOfInvoice400Način plaćanja nije dozvoljen
Original nije fiskalizovan / nema IIC—Ne šaljite korektivni; prvo GET i provjerite status

Nakon uspjeha: novi iic, fic, invoiceNumber, PDF na GET /api/invoices/{id}/pdf (gotovinski: /api/invoices/cash/{id}/pdf).