Drukarka fiskalna ewidencjuje sprzedaż zawsze w jednej walucie, stąd w naszym kraju zazwyczaj jest to polski złoty (PLN). Zmiana waluty ewidencyjnej np. na euro lub dolary, jest rejestrowana w pamięci fiskalnej i wymaga udziału wyspecjalizowanego serwisanta, więc w jaki sposób ewidencjonować np sporadyczną sprzedaż w EUR czy USD? Na szczęście drukarki Posnet posiadają mechanizm przeliczania sprzedaży z waluty obcej do…
PosnetServer może wykonywać wydruki niefiskalne na drukarce fiskalnej. Dzięki temu możliwe jest drukowanie nie tylko paragonów, ale również na przykład potwierdzeń płatności z terminala płatniczego. W tym tutorialu opiszemy jak wykorzystać drukarkę fiskalną do wydruku potwierdzeń z eService. Cały proces prezentujący włąsciwe przeprowadzenie płatności na terminalu eService dostępny jest w formie skryptów bash w katalogu docs produktu IngenicoServer. Znajdujący się…
PosnetServer od wersji 5.1 został rozbudowany o autentykację i autoryzację requestów. Mechanizm pozwala na uwierzytelnianie (autentykację) każdego requestu loginem i hasłem oraz następnie autoryzację (upoważnenie) do wybranego RESTpointu. Przykładowo, jeśli chcemy aby aplikacja monitorująca serwisy w naszej infrastrukturze nie miała uprawnień do wystawiania paragonów, wystarczy że przypiszemy jej uprawnienia do GET /status oraz GET /devicestatus. Aktywacja Moduł autentykacji i autoryzacji…
PosnetServer od wersji 5.0 został rozbudowany o symulator drukarki fiskalnej. Dzięki nowej funkcjonalności testowanie dowolnego oprogramowania z drukarką fiskalną nie wymaga posiadania drukarki fiskalnej. Dopiero po zakończeniu pisania kodu i przed gotowością wdrożenia, można wygodnie przejść z trybu symulacji do trybu pracy z fizycznym urządzeniem. Warto wspomnieć że nawet jeśli PosnetServer jest podłączony do drukarki, to w trybie symulacji urządzenie…
JSON reprezentujący rekordy w pamięci fiskalnej jest dość rozbudowany, stąd jego parsowanie może być na początku kłopotliwe. Dla przykładu przeanalizujemy rekordy zwracane przez API /raporty/events/dobowy.
1 2 3 4 5 6 |
curl -s -XPOST "http://localhost:3050/raporty/events/dobowy?fulldebug=true" -H 'Content-type: application/json' -d ' { "dateFrom":"2023-07-31T23:20:00+02:00", "dateTo":"2023-08-29T23:49:59+02:00", "mergeSections": true }' |
W odpowiedzi otrzymujemy identyfikator tasku, a następnie jego status sprawdzamy za pomocą RESTpoint: GET /tasks/get/<identyfikator taska> GET/tasks/list W momencie gdy “inprogress” zmieni wartość na “false”, wówczas metoda zwraca pełen wynik, przykładowo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
{"hits":{"task":{"ts":1701639330320,"task":"45c53051-cf9b-4089-8864-6b1caf38bee0","inprogress":false,"progress":0,"success":true,"message":null,"result":{"ok":true,"code":0,"error":"", "results":[ {"sections":[ {"type":"raport_dobowy","date":"2023-10-02T19:01:50Z","date_ts":749588510,"nb":1730,"fisk":1,"taxid":"5554442211","prefix":"","compress":0,"sw":0,"number":83, "date_112":"2023-10-02T19:01:50Z","date_ts_112":749588510,"currency":"PLN","ptu.0":2300,"ptu.1":800,"ptu.2":500,"ptu.3":0,"ptu.4":-1,"ptu.5":-2,"ptu.6":-2, "ptuChange":0,"malfunctionCount":0,"programmingLCount":0,"programmingOCount":0, "waPa.0":221021,"waPa.1":0,"waPa.2":0,"waPa.3":0,"waPa.4":0,"waPa.5":0,"waPa.6":0,"paragonCount":14,"paragonCancelledCount":0,"paragonCancelledAmount":0, "waFv.0":0,"waFv.1":0,"waFv.2":0,"waFv.3":0,"waFv.4":0,"waFv.5":0,"waFv.6":0,"invoiceCount":0,"invoiceCancelledCount":0,"invoiceCancelledAmount":0, "ticketsCount":0,"foreignTicketsCount":0,"dbChangesCount":7,"nonfiscalPrintoutsCount":0, "dateReportStart":"2023-10-02T07:45:16Z","dateReportEnd":"2023-10-02T18:40:21Z","dateReportStart_ts":749547916,"dateReportEnd_ts":749587221, "unsuccessfulTransfersCount":0,"type_65":"raport_dobowy","fisk_65":1,"cancelled":0,"nb_65":0, "date_65":"2023-10-02T19:01:50Z","date_ts_65":749588510, "uniq":"UNIQ_2221114422","cashNumber":"001","cashier":"KIEROWNIK", "taxid_65":"","taxidPrefix":"","taxidStyle":0,"compress_65":0,"sw_65":0} ] }, {"sections":[ {"type":"raport_dobowy","date":"2023-10-03T18:59:44Z","date_ts":749674784,"nb":1746,"fisk":1,"taxid":"5554442211","prefix":"","compress":0,"sw":0,"number":84, "date_112":"2023-10-03T18:59:44Z","date_ts_112":749674784,"currency":"PLN","ptu.0":2300,"ptu.1":800,"ptu.2":500,"ptu.3":0,"ptu.4":-1,"ptu.5":-2,"ptu.6":-2," ptuChange":0,"malfunctionCount":0,"programmingLCount":0,"programmingOCount":0, "waPa.0":178581,"waPa.1":0,"waPa.2":0,"waPa.3":0,"waPa.4":0,"waPa.5":0,"waPa.6":0,"paragonCount":15,"paragonCancelledCount":0,"paragonCancelledAmount":0, "waFv.0":0,"waFv.1":0,"waFv.2":0,"waFv.3":0,"waFv.4":0,"waFv.5":0,"waFv.6":0,"invoiceCount":0,"invoiceCancelledCount":0,"invoiceCancelledAmount":0, "ticketsCount":0,"foreignTicketsCount":0,"dbChangesCount":6,"nonfiscalPrintoutsCount":0, "dateReportStart":"2023-10-03T07:18:20Z","dateReportEnd":"2023-10-03T16:07:37Z","dateReportStart_ts":749632700,"dateReportEnd_ts":749664457, "unsuccessfulTransfersCount":0,"type_65":"raport_dobowy","fisk_65":1,"cancelled":0,"nb_65":0, "date_65":"2023-10-03T18:59:44Z","date_ts_65":749674784, "uniq":"UNIQ_2221114422","cashNumber":"001","cashier":"KIEROWNIK", "taxid_65":"","taxidPrefix":"","taxidStyle":0,"compress_65":0,"sw_65":0} ] } ]}}},"ok":true} |
W powyższej…
Z racji tego, że PosnetServer do wersji 4.3 włącznie nie przechowuje żadnych danych, aktualizacje wykonujemy jak ponowną instalację serwisu w osobnym katalogu. Przykładowo aby wykonać upgrade do wersji 4.4: Przygotowanie NOWEGO serwisu Torzymy nowy katalog (C:/PosnetServer4.4, lub /opt/posnetserver4.4) Pobieramy paczkę instalacyjną i rozpakowywujemy jej zawartość w nowym katalogu Kopiujemy plik config.json z poprzedniego katalogu do nowego nadpisując tym samym domyślny…
pierwsza transakcja Niestety każdy provider (eSerice czy Polacrd) posiada własny standard przeprowadzania transakcji, stad w aplikacji IngenicoServer nie jesteśmy w stanie przygotować uniwersalnego procesu, jednak dołożyliśmy wszelkich starań aby proces był najbardziej jak to możliwe uniwersalny. Transakcję przeprowadza się w 3 krokach: Sprawdzenie czy terminal nie jest w trakcie przeprowadzania innej transakcji Rozpoczęcie transakcji Pobranie wyniku Za każdy z 3…
Unix Jest wiele sposobów aby uruchomić IngenicoServer w tle czy jako daemon’a. Można użyć podsystemu PM2 (/posnet-server-autostart/), ale równie wygodnym sposobem jest systemd. Zakładając że IngenicoServer został rozpakowany w /opt/ingenicoserver, należy stworzyć plik ingenico.service Zawartość pliku powinna być następująca:
1 2 3 4 5 6 7 8 9 |
[Unit] Description=Ingenico Server service [Service] WorkingDirectory=/opt/ingenicoserver/ ExecStart=/opt/ingenicoserver/serverstart.sh [Install] WantedBy=multi-user.target |
Następnie wykonujemy 2 polecenia: Po czym wynik polecenia: powinien być podobny do tego:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
● ingenico.service - example systemd service unit file. Loaded: loaded (/etc/systemd/system/ingenico.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2023-10-23 18:57:58 CEST; 1s ago Main PID: 637504 (serverstart.sh) Tasks: 26 (limit: 18974) Memory: 55.9M CPU: 1.128s CGroup: /system.slice/ingenico.service ├─637504 /bin/bash /opt/ingenicoserver/serverstart.sh ├─637575 npm "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ├─637593 sh -c "node server.js" └─637594 node server.js paź 23 18:57:59 lab-host34 serverstart.sh[637594]: {"message":"Pinger is disabled in configuration. To enable it set ingenico.ping.active=true","level":"info","timestamp":"2023-10-23T19:57:59.246Z"} paź 23 18:57:59 lab-host34 serverstart.sh[637594]: {"message":"Checking license file /opt/ingenicoserver/c801c4f1-e232-436c-v5a1-9b0d2dd8f99a.lic .....","level":"info","timestamp":"2023-10-23T19:57:59.246Z"} paź 23 18:57:59 lab-host34 serverstart.sh[637594]: {"message":"license file: /opt/ingenicoserver/c801c4f1-e232-436c-v5a1-9b0d2dd8f99a.lic","level":"info","timestamp":"2023-10-23T19:57:59.247Z"} paź 23 18:57:59 lab-host34 serverstart.sh[637594]: NATIVE:2023-10-23 21:57:59 INFO: Native logger initialized paź 23 18:57:59 lab-host34 serverstart.sh[637594]: NATIVE:2023-10-23 21:57:59 INFO: Printer logger initialized paź 23 18:57:59 lab-host34 serverstart.sh[637594]: NATIVE:2023-10-23 21:57:59 INFO: Checking file: /opt/ingenicoserver/c801c4f1-e232-436c-v5a1-9b0d2dd8f99a.lic paź 23 18:57:59 lab-host34 serverstart.sh[637594]: {"message":"executed ok","level":"info","timestamp":"2023-10-23T19:57:59.456Z"} |
Komunikując się z drukarką fiskalną, należy co pewien czas sprawdzać jej status, czyli czy drukarka jest online, czy jest gotowa do przyjęcia do wydruku kolejnego paragonu/faktury, czy nie kończy (lub skończył) się papier lub czy drukarka jest podłączona do zasilania Status Online Sprawdzenie statusu online można wykonać wysalając polecenie /status lub /devicestatus, przykładowo: Dodatkowo, PosnetServer posiada funkcjonalność automatycznego monitorowania drukarki…