Provera PIB-a: ručno na ePorezima vs. API automatika

Radni sto sa poreskim dokumentima i laptopom za proveru PIB-a preko ePoreza ili API-ja

Petak popodne, treba da izdaš fakturu novom klijentu, on ti šalje podatke preko WhatsApp-a — naziv firme, adresa, PIB, matični broj. Otkucaš sve u fakturu, pošalješ na SEF, i tek u ponedeljak vidiš da je PIB pogrešan za jednu cifru. Faktura odbijena, klijent nervozan, ti gubiš pola dana na ispravke i storno.

Provera PIB-a i statusa u sistemu PDV-a je jedna od onih stvari koje svi rade "na oko" dok ne progori. Ovaj tekst je konkretno o tome — kako se to radi ručno preko Poreske uprave i APR-a, gde su rupe, i kako izgleda automatska provera koja tera skriptu da uradi posao pre nego što faktura uopšte ode.

Zašto se PIB uopšte proverava pre izdavanja fakture

Kratak odgovor: zato što pogrešan ili neaktivan PIB na fakturi znači odbijenu fakturu na SEF-u, problem sa priznavanjem prethodnog PDV-a kod kupca, i potencijalno neispravnu poresku evidenciju kod tebe. Provera pre slanja košta 30 sekundi. Ispravka posle košta pola dana i loš utisak kod klijenta.

Konkretno, tri stvari treba da znaš pre nego što izdaš fakturu novom pravnom licu u Srbiji:

  1. Da li PIB postoji i pripada baš toj firmi koju ti je klijent naveo (matični broj + naziv se moraju poklopiti).
  2. Da li je firma aktivna u APR-u ili je u likvidaciji, stečaju, brisana.
  3. Da li je firma u sistemu PDV-a — ovo određuje da li na fakturi ideš sa PDV-om ili bez, i da li klijent može da odbije prethodni porez.

Za paušalca koji izdaje 10 faktura mesečno, ovo je manuelna rutina. Za DOO koji šalje 200 faktura mesečno preko računovodstvenog softvera, ovo mora biti automatsko — inače neko sedi i copy-paste-uje brojeve po ceo dan.

Ručna provera: gde tačno klikneš i šta gledaš

Postoje tri javna registra koja koristiš u praksi. Svaki daje deo slike i nijedan sam po sebi nije dovoljan.

Registar Šta proveravaš Gde
Poreska uprava — provera PIB-a Da li PIB postoji, kome pripada, status portal Poreske uprave (ePorezi / javni servis provere)
Registar obveznika PDV-a Da li je firma u sistemu PDV-a sajt Poreske uprave, sekcija za PDV registar
APR pretraga Pravni status, delatnost, ovlašćena lica, sedište pretraga.apr.gov.rs

Postupak koji ja lično radim za svakog novog klijenta pre prve fakture:

  1. APR prvo. Ukucaš matični broj ili naziv, dobiješ karticu firme — pravna forma, PIB, sedište, status ("aktivno privredno društvo"), delatnost. Ako piše "u stečaju" ili "u likvidaciji", odmah znaš da moraš da tražiš avansno plaćanje ili da odustaneš.
  2. Registar PDV obveznika. Uneseš PIB, sistem ti kaže da li je firma u PDV-u i od kog datuma. Ako izlaz kaže "nije u sistemu PDV-a", a klijent ti je poslao podatke sa "PDV br." — nešto ne štima, pozovi ga.
  3. Ukrštanje. Naziv iz APR-a mora se poklapati sa nazivom koji ti je klijent dao. Ako ti je poslao "Firma DOO", a u APR-u piše "Firma trgovina i usluge DOO Beograd" — na fakturu ide pun naziv iz APR-a, ne skraćenica.

Ova tri klika traju oko minut. Problem nije brzina — problem je što se u praksi preskoči. Kad ti klijent u petak u 16h traži hitno fakturu, ti ne otvaraš tri portala, samo otkucaš šta ti je poslao.

Gde ručna provera puca u praksi

Iz iskustva sa računovođama i preduzetnicima koji su prošli kroz ovo, evo najčešćih grešaka koje se pojavljuju:

Zamena cifara u PIB-u. PIB ima 9 cifara, klijent ti diktira preko telefona, ti čuješ 7 umesto 1. Formalno ispravno formatiran broj, prolazi validaciju "9 cifara", ali pripada drugoj firmi ili ne postoji.

Kopiranje sa memoranduma stare fakture. Firma je u međuvremenu izašla iz sistema PDV-a (pređe na paušal, ili se prekvalifikuje). Ti i dalje na fakturu stavljaš PDV od 20%, klijent te vraća.

Naziv "kako se vodi u narodu" vs. zvanični naziv. Fakture na SEF-u traže tačan zvaničan naziv. "Delta" nije naziv — pun naziv može biti "Delta Holding DOO Beograd" ili nešto sasvim treće.

Promena adrese sedišta. Firma se preselila, ti i dalje šalješ na staru adresu. Na SEF-u ovo ne blokira, ali papirna faktura kupcu izgleda neprofesionalno.

Storno-avansne fakture na pogrešan PIB. Ovo je najgore — proknjižio si prihod na pogrešnog kupca, pa sad radiš knjižno odobrenje i novu fakturu, a PDV prijava je već poslata.

Za paušalca sa 5-10 stalnih klijenata ovo se rešava tako što jednom proveriš i pamtiš. Za bilo koga ko ima priliv novih klijenata svake nedelje — automatika nije luksuz, nego higijena.

Kako izgleda automatska provera: arhitektura

Ideja je jednostavna: kad se u tvom sistemu (softver za fakturisanje, CRM, ERP) unese novi klijent ili se pravi nova faktura, pre nego što ta faktura ode na SEF, skripta u pozadini:

  1. Poziva javni servis Poreske uprave / APR-a sa PIB-om.
  2. Vraća naziv, status, PDV status.
  3. Poredi sa onim što je uneto u fakturu.
  4. Ako se ne poklapa — blokira slanje ili barem baci obaveštenje u Slack/Telegram odgovornoj osobi.

Ovako to izgleda kao pseudo-kod u Node.js-u koji možeš prilagoditi. Napomena: tačna adresa endpoint-a Poreske uprave se menja i za produkciju uvek proveri aktuelnu dokumentaciju na sajtu Poreske uprave i APR-a — ovo je logika, ne production URL:

// vat-check.js
const axios = require('axios');

async function proveriPIB(pib) {
  // 1. Osnovna validacija formata
  if (!/^\d{9}$/.test(pib)) {
    return { ok: false, razlog: 'PIB nema 9 cifara' };
  }

  try {
    // 2. Poziv ka registru (primer - koristi zvanicni endpoint)
    const res = await axios.get(
      `https://api.example-registar.rs/pib/${pib}`,
      { timeout: 5000 }
    );

    const { naziv, status, uPdv, sediste } = res.data;

    return {
      ok: true,
      naziv,
      status,          // 'aktivan' | 'likvidacija' | 'brisan'
      uPdv,            // true | false
      sediste
    };
  } catch (err) {
    return { ok: false, razlog: 'Registar ne odgovara' };
  }
}

async function validirajFakturuPreSlanja(faktura) {
  const check = await proveriPIB(faktura.kupac.pib);

  if (!check.ok) {
    await posaljiSlackAlert(
      `❌ Faktura ${faktura.broj}: ${check.razlog}`
    );
    throw new Error('Blokirano slanje');
  }

  const problemi = [];

  if (check.status !== 'aktivan') {
    problemi.push(`Kupac je u statusu: ${check.status}`);
  }

  if (check.naziv.toLowerCase() !== faktura.kupac.naziv.toLowerCase()) {
    problemi.push(
      `Naziv ne odgovara. Registar: "${check.naziv}", faktura: "${faktura.kupac.naziv}"`
    );
  }

  if (faktura.imaPdv && !check.uPdv) {
    problemi.push('Faktura ima PDV, ali kupac nije u sistemu PDV-a');
  }

  if (problemi.length > 0) {
    await posaljiSlackAlert(
      `⚠️ Faktura ${faktura.broj}:\n- ${problemi.join('\n- ')}`
    );
    // Zavisno od politike: baci gresku ili samo upozori
  }

  return { check, problemi };
}

async function posaljiSlackAlert(poruka) {
  await axios.post(process.env.SLACK_WEBHOOK, {
    text: poruka,
    channel: '#racunovodstvo'
  });
}

Šta ovo praktično radi u firmi:

  • Referent unese kupca, klikne "Sačuvaj" — sistem sekundu razmišlja, javlja "OK" ili baca upozorenje.
  • Kad se izdaje serija od 50 mesečnih faktura, skripta prolazi kroz sve i u Slack kanalu #racunovodstvo pošalje samo one koje imaju problem.
  • Šef računovodstva ujutru u kanalu vidi listu: "3 fakture imaju neusklađenost, treba ih ručno proveriti pre slanja na SEF."

Ključna finesa: cache. Ne pozivaš registar za svaku fakturu ako je isti kupac. Kešuj rezultat na 24-48 sati, jer status firme se ne menja svakog sata, a batch od 200 faktura ka istim klijentima ne treba da uradi 200 API poziva.

Poređenje: ručno vs. automatski

Kriterijum Ručna provera Automatski workflow
Vreme po klijentu 60-90 sekundi <1 sekunda
Skalira sa brojem klijenata Ne Da
Rizik od greške pri kucanju Visok Nula (radi sa API rezultatom)
Trošak postavke 0 Nekoliko sati razvoja
Reaguje na promenu statusa kupca Samo ako ručno proveriš ponovo Da, na svaku fakturu
Zvučno upozorenje kada nešto ne štima Nema Slack/Telegram poruka
Dobar za 5-15 faktura mesečno Sasvim OK Overkill
Dobar za 100+ faktura mesečno Neizvodljivo Nužno

Nema jednog tačnog odgovora. Paušalac koji piše 8 faktura mesečno stalnim klijentima može mirno da radi ručno — postavi kaznu samom sebi da prvi put uvek proveriš i zabeležiš. DOO koji izdaje 50-500 faktura mesečno mora automatski, inače će za tri meseca imati serijski problem sa storno fakturama.

Šta konkretno pratiti u Slack alertima

Iz prakse, ne šalji sve u Slack — zatrpaš kanal i ljudi prestanu da čitaju. Šalji samo tri tipa alerta:

  1. Blokirajući (crveno): PIB ne postoji, ili firma brisana iz APR-a. Faktura se ne šalje dok neko ručno ne odobri.
  2. Upozorenje (žuto): naziv se ne poklapa, ili je firma promenila PDV status od poslednje fakture. Faktura ide, ali se traži potvrda posle.
  3. Info (plavo, ide jednom nedeljno): sumarni izveštaj — "provereno 340 faktura, 12 imalo upozorenje, 2 blokirana."

Alert treba da bude actionable — ako kaže samo "problem sa PIB-om 123456789", niko ne zna šta dalje. Napiši: "PIB 123456789 (Firma DOO) — u registru se vodi kao 'Firma trgovina DOO Novi Sad'. Ispravi naziv na fakturi F-2026-0451 pre slanja na SEF."

Praktičan checklist pre nego što uvedeš automatiku

Pre nego što potrošiš pola dana na skriptu, proveri:

  • Da li tvoj postojeći softver za fakturisanje već ima integraciju sa registrom (mnogi imaju, samo je ugašena po defaultu).
  • Da li imaš pristup zvaničnom API-ju (nekad je potreban ugovor, nekad je otvoren).
  • Ko je vlasnik alerta — mora postojati jedna osoba koja reaguje, inače kanal postaje šum.
  • Kako se ponaša sistem kad registar ne odgovara (održavanje, timeout) — mora imati fallback, ne sme da blokira ceo proces fakturisanja.
  • Kako logujete istoriju provera (za slučaj poreske kontrole, dobro je imati trag da je provera obavljena).

Ako ovo sve staviš na papir pre nego što napišeš prvu liniju koda, ceo posao je 3-4 sata razvoja. Ako kreneš da kucaš odmah, potrošićeš dva dana i i dalje ćeš imati rupe.

Kako ovo izgleda u praksi kroz Fakturko

Fakturko rešava ovo tako što se provera dešava sama, u trenutku kada dodaješ novog klijenta ili kreiraš fakturu. Ne moraš da otvaraš APR ni portal Poreske uprave — uneseš PIB, sistem povuče naziv, sedište i PDV status. Ako želiš da testiraš logiku pre nego što vežeš na svoj račun, možeš početi tako što ćeš skinuti besplatan obrazac fakture i uporediti šta ti sve podatke o kupcu traži.

Za nove klijente, Faktor (AI asistent) preko Telegrama ili WhatsApp-a može da uradi proveru dok ti diktiraš: "Napravi fakturu za novog klijenta, PIB 123456789, iznos 45.000" — on prvo proverava PIB, javlja ti "Kupac je 'Firma DOO Beograd', u sistemu PDV-a, potvrđuješ?", i tek onda pravi fakturu. Nema copy-paste-a u portale, nema pola sata u ponedeljak ujutru na ispravke.

Zaključak

Provera PIB-a nije glamurozna tema, ali je jedna od onih stvari koje razlikuju firmu koja radi profesionalno od firme koja svaki mesec ima "iznenađenje" iz računovodstva. Ručna provera je sasvim OK dok si mali. Čim počneš da izdaješ više od dvadesetak faktura mesečno, ili čim imaš više osoba koje unose kupce, automatika sa Slack alertima ti vraća uloženo vreme za nedelju dana.

Ako želiš da vidiš kako ti to izgleda bez da sam pišeš skriptu — napravi nalog za 2 minuta i uvezi jednu staru fakturu, pa vidiš gde bi te sistem uhvatio na potencijalnoj grešci.

Česta pitanja

Kako da proverim PIB firme u Srbiji pre izdavanja fakture?

U Srbiji PIB proveravaš kroz tri javna registra: portal Poreske uprave (ePorezi) za postojanje i status PIB-a, Registar obveznika PDV-a za PDV status firme, i APR pretragu (pretraga.apr.gov.rs) za pravni status, sedište i tačan naziv. Preporučeni redosled je APR prvo (dobiješ karticu firme i status poput 'aktivno privredno društvo'), pa PDV registar, pa ukrštanje sa podacima koje ti je klijent poslao. Naziv i matični broj se moraju poklapati sa APR-om, jer na fakturu ide pun zvaničan naziv, ne skraćenica. Cela provera traje oko minut i sprečava odbijanje fakture na SEF-u.

Šta se dešava ako pošaljem fakturu na SEF sa pogrešnim ili neaktivnim PIB-om?

Faktura biva odbijena na SEF-u, kupac ne može da odbije prethodni PDV, a ti dobijaš neispravnu poresku evidenciju. Ispravka podrazumeva storno, knjižno odobrenje i novu fakturu, što je posebno komplikovano ako je PDV prijava već poslata. Praktično to znači pola dana gubitka vremena, loš utisak kod klijenta i potencijalne probleme sa poreskom evidencijom. Zato je provera od 30 sekundi pre slanja mnogo jeftinija od ispravke posle.

Koje su najčešće greške pri ručnoj proveri PIB-a?

Najčešće greške su: zamena cifara u PIB-u (broj ima 9 cifara i prolazi formalnu validaciju ali pripada drugoj firmi), kopiranje podataka sa stare fakture kad je firma u međuvremenu izašla iz PDV sistema, korišćenje kolokvijalnog naziva umesto zvaničnog iz APR-a, i propuštanje promene adrese sedišta. Najozbiljnija greška je izdavanje avansne fakture na pogrešan PIB, jer zahteva knjižno odobrenje i ispravku PDV prijave. Ove greške se dešavaju najčešće kad se faktura izdaje pod pritiskom vremena, npr. petkom popodne.

Da li mala firma ili paušalac treba da automatizuje proveru PIB-a?

Za paušalca sa 5-10 stalnih klijenata dovoljno je da jednom proveriš PIB i zapamtiš podatke — automatika nije neophodna. Za DOO ili preduzetnika koji šalje 50+ faktura mesečno ili stalno dobija nove klijente, automatska provera nije luksuz nego higijena, jer inače neko provodi sate na copy-paste poslu. Kritična tačka je učestalost novih klijenata, ne veličina firme. Ako imaš stalan priliv novih kupaca svake nedelje, automatika se isplati.

Kako izgleda automatska provera PIB-a preko API-ja?

Kad se u sistemu (softver za fakturisanje, CRM, ERP) unese novi klijent ili priprema faktura, skripta u pozadini poziva javni servis Poreske uprave ili APR-a sa PIB-om i vraća naziv, status i PDV status firme. Zatim poredi ove podatke sa onim što je uneto u fakturu i, ako se ne poklapa, blokira slanje na SEF ili šalje obaveštenje odgovornoj osobi u Slack ili Telegram. Implementacija u Node.js zahteva osnovnu validaciju formata (9 cifara), HTTP poziv ka registru sa timeout-om, i logiku poređenja. Važno je da uvek koristiš aktuelan zvaničan endpoint iz dokumentacije Poreske uprave i APR-a jer se adrese menjaju.