Parsowanie pliku z IND - Informatycznego nośnika danych POSNET

0

Witam.

Mam kłopot z wymyśleniem jak parsować plik zgrany z karty SD z drukarki fiskalnej POSNET.
Na pewno da się to zrobić bo producent udostępnia soft do odczytu/raportów jednak ja potrzebuje stworzyć zestawienie którego tam nie ma.
Miał ktoś może styczność z tymi plikami ?
Ew. może ktoś na coś wpadnie i podpowie patrząc na te pliki (jeden zwiera treści paragonów/raportów itp) a drugi to pojęcia nie mam :/....
Przykładowe pliki spakowane w załączniku.

Z góry dziękuję za pomoc.

0

z jakiej to jest kasy?

0

Drukarka fiskalna POSNET THERMAL HS EJ.

Pisałem już do PosNetu - może oni coś pomogą.

0

ale program posnetowski nie otwiera tych plików.

Co do samego parsowania to w zależności co chcesz wyciągnąć. Zebranie z tego numeru paragonu + netto + stawi + brutto nie jest czymś trudnym. Gorzej jeśli chcesz mieć rozbicie na poszczególne towary ale to jakby się wziąć to też by można wyciągnąć tylko trzeba dokładnie przeanalizować gdzie się tam kolejna pozycja zaczyna

0

Żeby to ich programem otworzyć trzeba chyba zawartość całej karty (a na pewno pliki z folderu głównego - mogę podesłać oczywiście)
Potrzebuje stworzyć raport na wzór:
nazwa towaru -> ilość -> cena sprzedaży

Nie bardzo mogę wypatrzeć jakąś zależność gdzie zaczyna się nazwa towaru, gdzie kończy (poza tym że, nazwa występuje dwa razy) i tak samo z ilością , ceną...

0

tu przykładowy paragon

           NIP 712-26-20-434
(2014-07-23                        372316
         PARAGON FISKALNY - KOPIA
(PP BAGIETKA CZOSNKOWA 70GD 1 x1,09 1,09DAPP BAGIETKA CZOSNKOWA 70GD
(CIASTKA SOLIDARNOŚĆ 125G B/CUK MAŚLANEA 
(                           1 x3,99 3,99AA 'CIASTKA SOLIDARNOŚĆ 125G B/CUK MAŚLANEA
)NC SEREK WIEJSKI ŁACIATY 200G NATURALNYD 
(                           1 x1,79 1,79DA(NC SEREK WIEJSKI ŁACIATY 200G NATURALNYD
(PP BUŁKA KORNSPITZ 70GD    1 x0,89 0,89DAPP BUŁKA KORNSPITZ 70GD
%ZSIADŁE MLEKO KRASNYSTAW 400G MISKAD 
(                           1 x1,89 1,89DA$ZSIADŁE MLEKO KRASNYSTAW 400G MISKAD
$JOG BIELUCH 400G NATURALNY BIOMLEKD 
(                           1 x2,19 2,19DA#JOG BIELUCH 400G NATURALNY BIOMLEKD
&NC DŻEM ŁOWICZ 280G MALINOWY NISKOSŁB 
(                           1 x2,99 2,99BA%NC DŻEM ŁOWICZ 280G MALINOWY NISKOSŁB
(- - - - - - - - - - - - - - - - - - - - 
(SPRZEDAŻ OPODATK. A                 3,99
(PTU A 23,00 %                       0,75
(SPRZEDAŻ OPODATK. B                 2,99
(PTU B 8,00 %                        0,22
(SPRZEDAŻ OPODATK. D                 7,85
(PTU D 5,00 %                        0,37
(SUMA PTU                            1,34
WHSUMA PLN       14,83BbhH   
(00015 #1        3-Błotny Mirosław  06:53
(E9D8748B34B1C5566AE8FCE16A041A4EA5273823
              BAM 10417647
 
(Karta                          14,83 PLNDbë ®]
  1. zaczynasz od znalezienia linii PARAGON FISKALNY - KOPIA

  2. bierzesz następną linię
    (PP BAGIETKA CZOSNKOWA 70GD 1 x1,09 1,09DAPP BAGIETKA CZOSNKOWA 70GD

  3. obcinasz pierwszy znak
    PP BAGIETKA CZOSNKOWA 70GD 1 x1,09 1,09DAPP BAGIETKA CZOSNKOWA 70GD

  4. dzielisz linię na pół
    PP BUŁKA KORNSPITZ 70GD 2 x0,8
    9 1,78DAPP BUŁKA KORNSPITZ 70GD

  5. i sprawdzasz czy początek pierwszej linii (np. 5 znaków) zawiera się w drugiej linii
    PP BU
    9 1,78DAPP BUŁKA KORNSPITZ 70GD
    ^

  6. jeśli tak to bierzesz teraz koniec drugiej linii i szukasz miejsca, gdzie jest on w pierwszej linii (ale od końca)
    70GD
    PP BUŁKA KORNSPITZ 70GD 2 x0,8
    ^

Jeśli 5 i 6 true to masz najprostszy przypadek - jedna linia w pliku to jedna pozycja. Masz początek i koniec nazwy (ostatnią literę wywalasz bo to CHYBA stawka jest) czyli PP BUŁKA KORNSPITZ 70G.
Dla pewności możesz sprawdzić czy teoretyczna nazwa występuje dwa razy w linii i jest rozdzielna.

Następnie z całej linii wywalasz obie nazwy i zostaje Ci 1 x1,09 1,09DA. Usuwasz spacje z przodu i tyłu, i wszystkie znaki, które są < 32 i > 127 co daje 1 x1,09 1,09DA. Teraz od początku do x masz ilość, potem do masz cenę, potem do litery masz wartość i na końcu stawkę (ostatnie A ignorujesz).
Jeśli tutaj coś jest nie tak to trzeba sprawdzić konkretny przypadek i zmienić algorytm. UWAGA ilość może być w postaci np. 0,104*kg_

Jeśli pkt 5 jest false to bierzesz następną linię, doklejasz do poprzedniej i powtarzasz procedurę. To ten przypadek
( JOG MLEKOVITA 150G TRUSKAWKOWY POLSKID
( 1 x0,89 0,89DA' JOG MLEKOVITA 150G TRUSKAWKOWY POLSKID
po sklejeniu (obcinasz pierwsze znaki z OBU linii i robisz trim na nich)
JOG MLEKOVITA 150G TRUSKAWKOWY POLSKID1 x0,89 0,89DA' JOG MLEKOVITA 150G TRUSKAWKOWY POLSKID
na pół
JOG MLEKOVITA 150G TRUSKAWKOWY POLSKID1 x0,89
0,89DA' JOG MLEKOVITA 150G TRUSKAWKOWY POLSKID
czy początek się zawiera
JOG ML
0,89DA' JOG MLEKOVITA 150G TRUSKAWKOWY POLSKID
^
i czy koniec się zawiera
LSKID
JOG MLEKOVITA 150G TRUSKAWKOWY POLSKID1 x0,89
^
wyciągasz nazwę
JOG MLEKOVITA 150G TRUSKAWKOWY POLSKI
linia paragonu bez nazwy i znaków specjalnych
1 x0,89 0,89DA
rozbicie na poszczególne dane
ilość 1
cena 0,89
wartość 0,89
stawka D

Jeśli po sklejeniu trzech kolejnych linii nie możesz ich poprawnie sparsować to znaczy błąd w algorytmie :p

A i jeszcze musisz obsłużyć wyjątki, tj. np. anulowanie pozycji #STORNO#

0

Korzystając ze zdobytej dokumentacji próbuje odczytać te pliki.
Plik powinien zaczynać się od danych nagłówka dokumentu:

Offset Typ Nazwa Opis
00h byte id 'D'
01h docType docType rodzaj drukowanego dokumentu
02h dword rtc czas rozpoczecia wydruku
06h dword no numer wyrduku

docType - enum {
DOC_COMMON, // zwykły dokument
DOC_BILL, // paragon
DOC_FV, // FV VAT
DOC_DAY_REP, // raport dobowy
}

nie jestem pewny ale czy przy tego typie zapisu nie powinno być wartości liczbowych ?

Pierwsze znaki w załączonym w pierwszym poście pliku to:
44 00 1b 62 09 a5 00 05 ae 4c 0a 1c 20 20 20

próbując to odczytać otrzymuje
44 - D - id = D - zgadza się
00 - tu powinien być typ dokumentu
1b 62 09 a5 - godzina? w jakim formacie?
00 05 ae 4c - tu powinien być numer tylko też nie mam pojęcia w jakim formacie.

Z dokumentacji wynika że plik xxx.sig to podpis cyfrowy.

Algorytm podpisywania plików:
1. Odczytujemy zawartość podpisywanego pliku;
2. Dodajemy dodatkowe informacje (w dla plików raportów dobowych: -byte[12] - nazwa katalogu unikatorego w formacie 8.3, - dword - numer podpisywanego pliku)
3. Z tak otrzymanego strumienia wyliczamy skrót algorytmem SHA-1
4. Obliczony skrót podpisujemy algorytmem RSA używając klucza prywatnego

Mam rozumieć, że przed "dekodowaniem" zawartości pliku trzeba go odszyfrować (nie miałem w ogóle styczności z RSA...)?

1 użytkowników online, w tym zalogowanych: 0, gości: 1