Fiskalizacija za DOS kase

Skinite program ovdje, source ovdje.

1. Uvod

Bazira se na Raverusevom open-source projektu. FISKA.EXE je besplatan. Radio sam ga za svoje korisnike POS blagajni i nema razloga da ga ne podjelim s drugima.
Program koristite na vlastitu odgovornost. Ne odgovaramo za štetu uzrokovanu korištenjem ovog programa.

2. Upute za korištenje

Preduvjet: Cerifikat mora biti instaliran ili snimljen na disk.
Nema instalacije programa. Samo kopirajte fileove u neki folder i startajte exe.
Pojavi se systray ikona. Prvi put nakon startanja treba ići na systray ikonu desni klik -> namještanja. Obavezno popunite i “System” tab.
Request file je file koji će POS program puniti, a response file će POS program čitati.
Log folder nije obavezno upisati. Ako ga upišete, u taj folder će se logirati svi računi i odgovori iz CISa da ostane trag na disku. Korisno da se može rekonstruirati uzrok u slučaju eventualnih problema.
Timeout je maksimalno vrijeme čekanje na CIS odgovor. Ako su vaši korisnici nestrpljivi stavite 2-3 sekunde. Ako nisu, stavite 9-10. Što je manja vrijednost to je veći rizik da će dobiti timeout error ako je CIS server preopterećen. S druge strane, ako je CIS server potpuno blokiran bolje je dobiti grešku odmah.
Polling period određuje koliko često će FISKA.EXE provjeravati ima li novi request file na disku. Ako se napiše 0 sekundi, onda se ne radi polling, nego .NET watcher vidi da se file na disku pojavio i trenutačno ga pročita. Ponekad watcher ne radi dobro. Npr na mrežnim folderima. U tim slučajevima stavite neku drugu vrijednost osim 0. Onda će program provjeravati request u intervalima. Preporuka je da u polje polling period stavite 0. Ako ima ikakvih problema u čitanju request filea, onda stavite 1,5 sekundi.
Dozvoli Offline mode je namjenjeno naprednim korisnicima. Kad se uključi, pojavi se novi menu item na context meniju "Offline mode". Korisnik može Offline mode ručno aktivirati kad internet radi sporo ili nikako, a na kasi je gužva. U Offline modu program uopće ne šalje na CIS i ne dobiva JIR. Sve što radi je da vrati samo ZKI. Dakle vrlo brzo. Kasnije će korisnik (kad se internet veza popravi) isključiti offline mode i naknadno poslati račune na CIS.
Program treba startati skupa s widowsima (u startupu), a može i neposredno prije startanja POS programa. Najbolje je oboje, za imati duplu sigurnost da je program sigurno startan. Postoji zaštita protiv startanja višestrukih instanci programa. Takva zaštita je nužna. Ne bi bilo u redu da se startaju dvije FISKE pa isti račun pošalje dva puta.

2.1 Slanje računa u poreznu - jednostavni način

Neposredno prije štampanja računa Vaš POS program treba popuniti request file sa tekstom ovako:
P  
15/11/2012 23:55:01   
123
10.00; 02000.00;  200.00;     25.00; 100.00 ; 25.00          
2325.00
G   
12945678931 
3.00; 1.00; 0.03
naknada ambalaže;  0.50
00070543
 7.00
123
9c23efbd9f9b63bc29228ad32eeb27ff
5df3d0b4-701b-478e-bd97-e7fcc376aea2
1
3.00
K
1. Prvi red može biti R (obični račun) ili P (ponovljeni račun, odnosno naknadna dostava) ili Z (izračun ZKI) ili qr (kreiraj QR.PRN) ili qrbmp (kreiraj QR.BMP) ili N (napojnica) ili NP (ponovljena napojnica).
2. Drugi red je datum i vrijeme izdavanja računa. To nije trenutno vrijeme (npr ako se šalje ponovljeni račun), nego ono vrijeme koje se štampa na računu. Format mora biti kako je prikazan, uključujući i separatore "/" i ":".
3. Treći red je broj računa.
4. Četvrti red je stopa PDV, osnovica te iznos PDVa. Tim redosljedom. Odvojeni znakom ; Decimalni znak mora biti točka. Decimalni dio mora imati dvije znamenke. Zadnji znak na desnoj strani ne smije biti ;.
5. Peti red je ukupni iznos računa.
6. Šesti red je način plaćanja. G = gotovina, K = kartice, T = transakcijski račun, O = ostalo.
7. Sedmi red je OIB radnika koji izdaje račun.
8. Osmi red je porez na potrošnju. Stopa, Osnovica i iznos. Ako nema poreza na potrošnju ostavite taj red prazan. Iznosi su odvojeni znakom ; a decimalni znak je točka.
9. Deveti red je naknada. Prvi dio je opis, zatim znak ; i nakon toga iznos naknade. Ako nema naknade ostavite taj red prazan. Prazan red znači da on postoji, ali nema nikakvih slova, samo CRLF.
10. Deseti red je redni broj paragon bloka kad se prepisuje u blagajnu npr nakon nestanka struje. Za normalne račune ostavite prazni red.
11. Jedanaesti red je iznos koji ne podliježe oporezivanju. Naprimjer boravišna pristojba. Ako nema, ostavite prazni red.
12. Dvanaesti red je vlastiti kontrolni broj. Ne morate ga popuniti. Ako ga napunite taj broj će se vratiti u response fileu. To služi za kontrolu dali response odgovara requestu. Npr, ako je HTTP timeout veći od timeouta u vašoj blagajni može se desiti da se pomješaju responsevi. Preporučam da u taj red stavite broj računa i onda kontrolirate vraćenu vrijednost u vašem POS programu.
13. Trinaesti red je ZKI ako je poznat. Poznat je npr kod naknadne dostave. Ne morate ga popuniti. Ako ga ne popunite, sam će se izračunati iz ostalih podataka.
14. Četrnaesti red je postojeći JIR za generiranje filea QR.PRN kod printanja kopije računa. Ima smisla jedino sa komandom "qr". Preporučam da uvijek bude prazno. Umjesto jira bolje da zki ide u QR jer je kraći.
15. Petnaesti red može biti 1 ili 0. Ako je 1 onda će se kreirati QR code datoteka, ako je 0 neće se kreirati. Tako se kontrolira kreiranje QRa, npr za izbjeći kreiranje novog QR codea kod ponovljenog slanja. Default je 1.
16. Iznos napojnice kad je prvi red N ili NP.
17. Način plaćanja napojnice kad je prvi red N ili NP. Popunjava se slično kao šesti red.
18. OIB kupca ako je poznat. Inače ostavite prazan red.
19. Ostali redovi će se popunjavati u budućnosti kad se pokaže potreba.

Prije slanja računa treba izbrisati response file (ako već nije). Onda se popuni request file kako je gore opisano. Odmah nakon toga počnite čitati response file. Treba pokušavati čitati nekoliko puta. Dok ne istekne recimo 10 sekunda. Ako se u 10 sekunda nije napunio response file, onda vjerojatno ni neće.
Ispravni response file izgleda ovako:
72680710-8f9a-4a72-b850-622d0d5dbb66;57aa5e54-7ad3-4f43-ae7e-bd9ad17509a6;9c23efbd9f9b63bc29228ad32eeb27ff;123
Prvih 36 slova je JIR. Drugih 36 slova je UUID. Trećih 32 slova je zaštitni kod (ZKI). Slijedećih 20 znakova je vaš kontrolni broj (redak 12 iz request filea). Odvojeni su znakom ;
U slučaju greške JIR i UUID će biti prazni, ali ZKI će biti u responseu (iako ni to nije 100% sigurno). U tom slučaju na račun se isprinta samo ZKI. Dok se ne taj račun ponovno pošalje na poreznu nakon uklonjenog kvara. Onda će dobiti JIR. Ovako greška izgleda u response file:
                                    ;                                    ;9c23efbd9f9b63bc29228ad32eeb27ff;123
U slučaju još veće greške, čak niti zaštitni kod se neće napuniti u response file. Tada se ne smije isprintati račun. Onda se kupcu ručno piše paragon plahtu.
Kad se pročita response file POS program ga treba izbrisati. Tako se izbjegnu problemi u budućnosti kad bi se mogao pročitati stari sadržaj filea ako se greškom FISKA.EXE nije startao.


2.2 Slanje računa u poreznu – XML format

Možda nekome neće pasati gornja metoda. Za imati potpunu slobodu, možete sami kreirati XML direktno u POS programu i to snimiti u request file. FISKA će prepoznati da se radi o XML formatu i neće ga parsati, nego ga samo potpisati i poslati na poreznu u orginalnom obliku. Response file je formata:
72680710-8f9a-4a72-b850-622d0d5dbb66;57aa5e54-7ad3-4f43-ae7e-bd9ad17509a6;                                ;
Prvih 36 slova je JIR. Drugih 36 slova je UUID.
Problem je zaštitni kod kojeg bi trebao izračunati Vaš POS program. To nije baš jednostavno napraviti u DOS programu. Rješenje problema izračuna zaštitnog koda (ZKI) je da ovu metodu treba izvršiti u dva koraka. Prvi korak je zahtjev za izračun zaštitnog koda, a drugi korak je slanje XMLa. Izračun zaštitnog koda (ZKI) se napravi tako da se popuni request file prema uputama iz poglavlja 2.1 tu iznad. Jedina važna stvar je da prvi red u fileu mora biti slovo Z. U tom slučaju ne šalje se račun na poreznu, nego se samo generira ZKI u response fileu. Taj ZKI onda možete popuniti u XML.


2.3 Točan datum i vrijeme

Vaš POS program (opcionalno) treba pri startanju napuniti request file sa običnim stringom:
DATUM
i malo nakon toga pročitati response file. Prvi red teksta biti će datum, drugi red vrijeme. U ovom formatu:
20121231
23:56:12
Gornji primjer je datum 31.12.2012 u formatu yyyymmdd. U slučaju greške sadržaj filea je string GRESKA.
Ovo služi da Vaš POS program kontrolira ispravni datum. Baterijice na starom PCju se znaju potrošiti pa se datum PCja resetira. Ovo je kontrola za te slučajeve. Kad već imamo vezu na internet treba je iskoristiti.
Čim se response file pročita, Vaš POS program ga treba izbrisati. Bar sadržaj, ako ne cijeli file. Tako se izbjegnu problem u budućnosti kad bi se mogao pročitati stari sadržaj filea ako se greškom FISKA.EXE nije startao. Nije neka važna opcija, ali ako vam se sviđa koristite je.

2.4 Provjera statusa fiske

Za provjeru statusa fiske napunite request file sa običnim stringom:
ECHO
i malo nakon toga pročitajte response file. Mogu biti tri rezultata: OK, GRESKA ili prazno u slučaju da timeout istekne.

2.5 Više blagajni na istom PCju

Može se koristiti više fiskalnih blagajni na istom PCju tako da se FISKA.EXE kopira u više foldera. Svaki treba imati svoja vlastita namještanja.
Svaka POS blagajna treba imati svoju instancu startanog programa FISKA.EXE. U tom slučaju je dozvoljeno imati više instanci. Program automatski prepoznaje da se radi o zasebnim instancama. Ono što identificira zasebne instance je različiti path do "request file". On mora biti različit za različite instance.
Na primjer obična blagajna i web prodaja. Oboje se može vrtiti na istom PCju u isto vrijeme.


3 QR code

Od 2021 na računu treba biti QR code. Specifikacije je tu (str. 48).
Ideja je da FISKA generira file kojeg blagajna treba pročitati i isprintati na dnu računa. Taj file može biti ESC sekvenca ili jpg/png/bmp datoteka. Šta god paše aplikaciji blagajne, zavisno dali je račun u text modu ili grafičkom modu.
Teško je odabrati pravi tip filea za pravi model printera. Ovako napravite: otvorite ekran Namještanja/QR code. Probajte svaku kombinaciju u comboboxu "Tip datoteke" i pritisnite "Test". Novi POS printeri imaju ugrađenu podršku za QR code tako da će QR izaći odmah kod prvog izbora.
Problem su stari modeli printera koji trebaju "iscrtati" QR pixel po pixel. Ako nijedna postojeća opcija "Tip datoteke" ne isprinta QR (nego izlazi smeće), to ne znači da taj printer treba baciti. Odšarafite prozorčić s donje strane i pomaknite DIP switcheve. Obično treba uključiti prva dva switcha ili zadnja dva switcha (možete i napamet ako nemate manual) pa probati ispočetka, sve dok ne izađe QR. Switch postavlja Epson emulaciju, tj mjenja ESC komande, npr za rezač, pa uzmite to u obzir.

Kod fiskalizacije računa (R,P) ili izračuna ZKI-ja (Z) automatski se kreira file QR.PRN. Kod printanja kopije računa ne treba koristiti R,P,Z, nego u prvi red request.txt stavite string qr ili qrbmp.
"qr" će kreirati file QR.PRN kako je u namještanjima.
"qrbmp" će kreirati file QR.BMP (bez obzira na namještanja) koji je prikladan za ispis na A4 račun preko DOSPrintera i komande ESC"QR.BMP".

Ako su svi vaši POS printeri noviji modeli, možda je bolje da uopće ne koristite FISKU za generiranje QRa. Umjesto toga sami kreirajte ESC sekvencu za QR direktno u programu blagajne. Specifikacija ESC sekvence je tu (str. 144).

4 Napojnica

U prvom koraku se pošalje običan račun, kao inače. U drugom koraku se šalje napojnica ako je ima. Napojnica se šalje tako da se popune svi podaci kao za račun, plus redak 16. i 17. U prvi red treba biti "N" (prvo slanje napojnice) ili "NP" (ponovljeno slanje napojnice).
Response file (odgovor) izgleda ovako:
                                    ;57aa5e54-7ad3-4f43-ae7e-bd9ad17509a6;9c23efbd9f9b63bc29228ad32eeb27ff;123
Prvih 36 slova je šifra greške. Drugih 36 slova je UUID. Trećih 32 slova je zaštitni kod (ZKI). Slijedećih 20 znakova je vaš kontrolni broj (redak 12 iz request filea). Odvojeni su znakom ;
Ako nema greške prvo polje je prazno. U slučaju greške prvo polje će biti "s001" ili slična šifra koja počinje sa "s". Moguće šifre su tu (str. 55).

5 Ostalo

Ovo je 32-bitni program tako da može raditi na bilo kojim windowsima (32 ili 64-bitnim).
Ovaj program radi na .NET 4.5. Skinite ga i nosite na USB sticku. Cilj je da se potroši minimalno vrijeme pri instalaciji kod korisnika. Kod starijih windowsa treba ga instalirati. Kod novijih je već instaliran. Eventualno ga treba aktivirati.

U registry HKCU\Software\Fiska se upisuje datum i broj zadnjeg računa za kontrolu slijedećeg računa. Uvijek slijedeći račun mora imati veći datum i broj računa inače se neće fiskalizirati. U slučaju lažne uzbune ručno treba izbrisati taj registry key i tek onda se može nastaviti raditi. To ne kontrolira rupe u brojevima računa. Kontrolira samo ako je slijedeći račun manji od prethodnog. Takvi problemi su se i pokazali u praksi - da se indexi pokvare i račun počne od broja 1 ili se datum resetira na početni BIOS datum. Kod naknadne dostave računa ta se kontrola ne radi. Ta se opcija uključi/isključi checkboxom "Kontrola RB računa".

6 Povijest





comments powered by Disqus