
Drukarka fiskalna ewidencjuje sprzedaż nadając każdemu dokumentowi unikalny numer, zwiększając go o 1 po każdym wydruku. Czyli pierwszy paragon ma numer 1, kolejny numer 2 itd. Z racji że na drukarce możliwe jest drukowanie nie tylko paragonów, ale też wydruków niefiskalnych, faktur i raportów, drukarka globalnie ewidencjonuje niezależnie numery nagłówków jak i samego dokumentu. Dzięki temu zawsze można określić jaki wydruk nastąpił po którym, nawet jeśli data i czas na drukarce zostały zmienione. Przykładowo, na poniższym paragonie nagłówek ma numer 48, a sam paragon ma numer 5.

Po wydrukowaniu powyższego paragonu (w odpowiedzi na request /paragon), numer 48 (z nagłówka) zwracany jest w polu “hn“, a numer 5 (ze stopki, wydrukowany w formacie 00005) w polu “bn“.
Może się zdarzyć, że na skutek niepotrzebnego ponowienia requestu do PosnetServer (np w skutek niekontrolowanego odświeżenia strony WWW lub błędów sieci) wydrukowany zostanie kolejny paragon z takimi samymi danymi jak poprzedni, przez co do pamięci fiskalnej trafią duplikaty. Dlatego w wersji 4.3 wprowadzony został mechanizm tzw. “Optimistic locking” dla wydruku paragonów. Mechanizm działa w ten sposób że PosnetServer przed rozpoczęciem wydruku sprawdza poprzedni numer paragonu i jeśli jest on różny od oczekiwanego, zwrócony zostanie błąd.
PRZYKŁADOWE UŻYCIE
Aby wykorzystać tę funkcjonalność, należy w pierwszym kroku sprawdzić wartości totalizatorów i odczytać aktualny numer paragonu.
1 |
curl -XGET 'http://localhost:3050/counters?fulldebug=true' -H 'Content-type: application/json' |
Przykładowa odpowiedź może wyglądać nastepujaco:
1 2 3 4 5 6 7 8 9 10 11 12 |
{ "ok": true, "message": "", "code": 0, "counters": { "rd": "2", "hn": "48", "bn": "5", "fn": "21", "nu": "3" } } |
Wartości “hn” i “bn” określają odpowiednio ostatni numer nagłówka i ostatni numer paragonu. Teraz aby wydrukować paragon, wystarczy przekazać w request parametr “previousHn” lub “previousBn” (jeden z nich, w zależności od preferencji), w następujący sposób:
1 2 3 4 5 6 7 8 9 10 |
curl -XPOST 'http://localhost:3050/paragon?fulldebug=true&previousHn=48' -H 'Content-type: application/json' -d ' { "lines" : [ { "na": "Towar 1", "il": 1.0, "vt": 0,"pr": 12356}, { "na": "Towar 2", "il": 1.0, "vt": 0,"pr": 34567} ], "summary" : { "to": 46923 } }' |
Po wydrukowaniu paragonu, numeracja dokumentów w drukarce fiskalnej zwiększy się o 1 i wartości te zostaną zwrócone w response:
1 2 3 4 5 6 7 8 9 10 |
{ "ok": true, "message": "", "code": 0, "bn": "6", "hn": "49", "took": 872, "ts": 1627376834869, "tsend": 1627376834969 } |
Czyli ostatni nagłówek ma teraz numer 49 a ostatni paragon ma numer 6, stad ponowne wykonanie powyższego requestu zwróciło błąd do aplikacji. Aby teraz drukować kolejne paragony, nie ma konieczności ponownego wołania metody /counters, wystarczy że odczytamy wartość pola “hn” lub “bn” z response po wydruku paragonu, przechowamy w aplikacji i wykorzystamy do wydruku kolejnego paragonu:
1 2 3 4 5 6 7 8 9 10 |
curl -XPOST 'http://localhost:3050/paragon?fulldebug=true&previousHn=49' -H 'Content-type: application/json' -d ' { "lines" : [ { "na": "Towar 1", "il": 1.0, "vt": 0,"pr": 12356}, { "na": "Towar 2", "il": 1.0, "vt": 0,"pr": 34567} ], "summary" : { "to": 46923 } }' |