Generiranje šifri za model i poziva na broj na uplatnici?

Trebao bih osmisliti nekakav algoritam za izradu poziva na broj za uplatnice.
Pronašao sam dokument (
http://www.fina.hr/lgs.axd?t=16&id=13796
, pdf) u kojem je opisano koji modeli se mogu koristiti i kako poziv na broj funkcionira sa kontrolnim brojevima i provjerom.
I ništa mi nije jasno.
Mislim, jasno mi je kako funkcionira, ali mi nije jasno to sa kontrolnim brojevima niti koliko znamenaka minimalno mora imati poziv na broj.
Također, nije mi niti jasno koji model bi bilo ispravno koristiti za što manji broj znamenaka i po mogućnosti da nema provjere od strane FINE (ili druge ustanove koja radi transakciju) tog poziva na broj (to vjerujem da se određuje ispravnim brojem modela plaćanja).

E sad me zanima:
1.) ima li netko iskustva sa tim pa da ima nekakvo rješenje (php) za izradu tih poziva na broj?
2.) postoji li varijanta poziva na broj da u poziv za broj unesem broj od 3-11 znamenaka, te koji bi bio model plaćanja u tom slučaju?

Svaki komentar, ideja ili savjet je dobro došao.

Možeš koristiti model 00 ili bez modela - to prolazi bez kontrole. Sve ovisi o tome kako plaćaš - ako je virmanom, onda ne upišeš model, ako je preko online-bankarstva onda ono što su programeri konkretne aplikacije zamislili.

Ukoliko koristiš bez modela, onda je format poziva na broj identičan kao u modelu HR01 opisanom dolje, ali bez kontrolne znamenke (s time da broj tada može imati jednu znamenku više nego je niže rečeno).

Ako nemaš neku određenu namjenu, koristi model HR01. U slučaju da koristiš taj model i ako zamislimo da u donjim primjerima “n” stoji umjesto kontrolne znamenke, sve ovo su valjani oblici poziva na broj:

  • 1234n
  • 1234-n
  • 123456-123456n
  • 123456-123456-n
  • 123-456-123456n

Prvo utvrđuješ koliko će ti dugačak biti broj bez kontrolne znamenke - može biti od 1 do najviše 21 znamenki. Zatim izračunavaš kontrolnu znamenku tako da najdesniju množiš s 2, slijedeću hodajući prema lijevo s 3, iduću s 4 itd. sve do zadnje. Zatim sve te umnoške zbrojiš i uzmeš ostatak cijelobrojnog dijeljenja sume s 11. Ako je ostatak 0 ili 1, kontrolna znamenka je “0”; u ostalim slučajevima (2 do 10) se od broja 11 oduzme ostatak i to daje kontrolnu znamenku (ukupno ostataka može biti 0-10, što je 11 vrijednosti, pa zato dva moguća ostatka moraju biti “kodirana” istom znamenkom).

Kontrolnu znamenku dodaješ na kraj početnog broja dobivajući tako niz od 2 do 22 znamenke.

Sada dijeliš taj niz u proizvoljne grupe, držeći se ograničenja da može biti najviše tri grupe i da svaka grupa smije imati najviše 12 znakova, grupe se odvajaju znakom minusa “-”. Ne smije postojati prazna grupa, tj. ne smije biti poziv na broj oblika “a-” ili “a-b-” ili “a–b” ili “-a-b” i sl.

Uoči da pri dnu dokumenta imaš objašnjenje i primjere izračuna kontrolne znamenke, a tamo imaš dane i lijepe primjere kontrolnih brojeva baš u modelu 01. Algoritam je objašnjen na str. 23.

Uoči da je gornji opis sastavljen preciznim tumačenjem dane specifikacije. Da bi ipak provjerio da je specifikacija točna, a i da je implementacija algoritma kontrl. znamenke dobra, generiraj nekoliko desetaka brojeva različitih duljina i rasporeda da pokriješ što širi opseg gornje specifikacije i pokušaj kroz neko online-bankarstvo koje vrši kontrolu upisa prilikom pripreme naloga provjeriti sve bez stvarnog slanja naloga.

Ostale modele poziva na broj si slobodan koristiti ukoliko ti njihove specifičnosti dobro dođu. Recimo, ako želiš zbog sigurnosti (bolje kontrole) imati više kontrolnih znamenki, koristi modele 02 ili 03. Ako šalješ neke podatke koji imaju vlastite kontrolne znamenke, a podržani su nekim modelom, koristi taj model - poput modela 12 (JMBG) ili 17 (OIB). Izbjegavaj (pretpostavljam) korištenje modela s koji imaju istaknutu namjenu, poput državnih poreza i sl. (možda bi se neki programi za knjigovodstvo “zaglupili” jer bi tumačili da se radi o porezu i sl.)