ksef2.0-cli 1.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ksef2_0_cli-1.1.1/LICENSE +21 -0
- ksef2_0_cli-1.1.1/PKG-INFO +286 -0
- ksef2_0_cli-1.1.1/README.md +275 -0
- ksef2_0_cli-1.1.1/ksef2.0_cli.egg-info/PKG-INFO +286 -0
- ksef2_0_cli-1.1.1/ksef2.0_cli.egg-info/SOURCES.txt +19 -0
- ksef2_0_cli-1.1.1/ksef2.0_cli.egg-info/dependency_links.txt +1 -0
- ksef2_0_cli-1.1.1/ksef2.0_cli.egg-info/requires.txt +2 -0
- ksef2_0_cli-1.1.1/ksef2.0_cli.egg-info/top_level.txt +1 -0
- ksef2_0_cli-1.1.1/ksef_cli/__init__.py +5 -0
- ksef2_0_cli-1.1.1/ksef_cli/__main__.py +4 -0
- ksef2_0_cli-1.1.1/ksef_cli/help.txt +92 -0
- ksef2_0_cli-1.1.1/ksef_cli/ksef_cli.py +269 -0
- ksef2_0_cli-1.1.1/ksef_cli/ksef_conf.py +81 -0
- ksef2_0_cli-1.1.1/ksef_cli/ksef_log.py +116 -0
- ksef2_0_cli-1.1.1/ksef_cli/ksef_tokens.py +53 -0
- ksef2_0_cli-1.1.1/ksef_cli/main.py +64 -0
- ksef2_0_cli-1.1.1/ksef_cli/readp12.py +16 -0
- ksef2_0_cli-1.1.1/pyproject.toml +22 -0
- ksef2_0_cli-1.1.1/setup.cfg +4 -0
- ksef2_0_cli-1.1.1/tests/test0.py +28 -0
- ksef2_0_cli-1.1.1/tests/test1.py +762 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 stanislawbartkowski
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ksef2.0_cli
|
|
3
|
+
Version: 1.1.1
|
|
4
|
+
Author-email: Stanisław Bartkowski <stanislawbartkowski@gmail.com>
|
|
5
|
+
Requires-Python: >=3.10
|
|
6
|
+
Description-Content-Type: text/markdown
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
Requires-Dist: ksef2.0-python
|
|
9
|
+
Requires-Dist: pyyaml
|
|
10
|
+
Dynamic: license-file
|
|
11
|
+
|
|
12
|
+
## Opis
|
|
13
|
+
|
|
14
|
+
Jest to "command line" rozszerzenie rozwiązania: https://github.com/stanislawbartkowski/ksef_pyth. Umożliwia komunikację z systemem KSeF z poprzez wywołanie python3. Daje to możliwość integracji z systemami, które nie są oparte w Python.
|
|
15
|
+
|
|
16
|
+
Dodatkowe cechy rozwiązania:
|
|
17
|
+
|
|
18
|
+
* Konfiguracje metody autentykacji: token lub certyfikat na podstawie pliku konfiguracyjnego
|
|
19
|
+
* Tworzenie dziennika i logów, historii wykonywanych operacji.
|
|
20
|
+
* Możliwość wywołania funkcjonalności z poziomu bash lub bezpośrednio jako komenda python3
|
|
21
|
+
|
|
22
|
+
## Python
|
|
23
|
+
|
|
24
|
+
Testowane dla wersji: 3.10, 3.11 i 3.12
|
|
25
|
+
|
|
26
|
+
Testowane tylko w testowym środowisku KSeF 2.0. Nie było weryfikowane w pozostałych środowiskach.
|
|
27
|
+
|
|
28
|
+
## Konfiguracja
|
|
29
|
+
|
|
30
|
+
Zmienne środowiskowe
|
|
31
|
+
|
|
32
|
+
* KSEFCONF - plik zawierający listę dopuszczalnych NIPów oraz tokenów związanych z NIPami. Zawiera także definicje obsługiwanego środowiska KSeF 2.0 - deweloperskie/testowe, przedprodukcyjne oraz produkcyjne.
|
|
33
|
+
* KSEFDIR - katalog na logi operacji
|
|
34
|
+
|
|
35
|
+
## Instalacja
|
|
36
|
+
> pip install git+https://github.com/stanislawbartkowski/ksef_cli.git<br>
|
|
37
|
+
> python<br>
|
|
38
|
+
> import ksef_cli<br>
|
|
39
|
+
|
|
40
|
+
## Konfiguracja NIP oraz metody autentykacji
|
|
41
|
+
|
|
42
|
+
Plik jest wskazywany przez zmienną środowiskową *KSEFCONF*. Jest to plik w formacie YAML.
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
tokens:
|
|
46
|
+
NIP{nip}:
|
|
47
|
+
token: {token dla NIP}
|
|
48
|
+
env: prod|demo|test (produkcyjne, demo, testowe)
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Token
|
|
52
|
+
|
|
53
|
+
Przykład: <br>
|
|
54
|
+
NIP - 7497725064 <br>
|
|
55
|
+
Wartość tokena dostępowego dla NIP <br>
|
|
56
|
+
Środowisko testowe <br>
|
|
57
|
+
|
|
58
|
+
```YAML
|
|
59
|
+
NIP7497725064:
|
|
60
|
+
token: 20251116-EC-0317C65000-2CA83C40D9-73|nip-7497725064|80be6cfced7f44eb860aeeb644e8cffdd59bbad9e218415296db90a39e6e5370
|
|
61
|
+
env: test
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Certyfikat
|
|
65
|
+
|
|
66
|
+
Przykład: <br>
|
|
67
|
+
NIP - 7497725064 <br>
|
|
68
|
+
Środowisko testowe <br>
|
|
69
|
+
Plik p12 z certyfikatami: keyStore.p12<br>
|
|
70
|
+
Hasło odczytu: 1234
|
|
71
|
+
|
|
72
|
+
```YAML
|
|
73
|
+
NIP7497725064:
|
|
74
|
+
env: test
|
|
75
|
+
password: "1234"
|
|
76
|
+
p12: keyStore.p12
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Dodatkowa informacja dotycząca certyfikatów.
|
|
80
|
+
|
|
81
|
+
Testy były przeprowadzane tylko dla tylko dla testowych certyfikatów generowanych poprzez testowe środowisko KSeF 2.0
|
|
82
|
+
|
|
83
|
+
Parametr p12 wskazuje na plik w formacie P12 zawierający wygenerowany klucz i certyfikat.
|
|
84
|
+
|
|
85
|
+
Przykładowa komenda tworząca plik P12. Pliki CertyfikatKSEF zawierają pliki utworzone przez KSeF 2.0
|
|
86
|
+
|
|
87
|
+
> openssl pkcs12 -export -out keyStore.p12 -inkey CertyfikatKSEF.key -in CertyfikatKSEF.crt
|
|
88
|
+
|
|
89
|
+
## NIP
|
|
90
|
+
NIP przekazywany jako parametr do wszystkich wywołań może przybierać dwie postacie:
|
|
91
|
+
|
|
92
|
+
* NIP
|
|
93
|
+
* NIP$podkatalog
|
|
94
|
+
|
|
95
|
+
W drugim przypadku po symbolu NIP są dodane separator $ oraz nazwa podkatalogu. Podkatalog ma znaczenie dla tworzenia struktury logów oraz miejsca składowania faktur/UPO. Bez podkatalogu miejscem jest zawsze symbol NIP. Z podkatalogiem do NIP jest dodawany podkatalog.
|
|
96
|
+
Ten sam symbol NIP może być wywoływany z różnymi podkatalogami. Przykład:
|
|
97
|
+
* 7497725064, miejscem składowania jest NIP 7497725064
|
|
98
|
+
* 7497725064$ROK2025, miejscem składowania jest 7497725064/ROK2025
|
|
99
|
+
|
|
100
|
+
## Struktura kodu w Python
|
|
101
|
+
|
|
102
|
+
* ksef_cli
|
|
103
|
+
* ksef_cli.py Dostępna funkcjonalność
|
|
104
|
+
* ksef_conf.py Wykorzystywany wewnętrznie, konfiguracja
|
|
105
|
+
* ksef_log.py Wykorzystywany wewnętrznie, tworzenie dziennika
|
|
106
|
+
* ksef_tokens.py Wykorzystywany wewnętrznie, tokeny i środowiska
|
|
107
|
+
* tests Unit test suite
|
|
108
|
+
|
|
109
|
+
## Struktura katalogu z logami i dziennikiem
|
|
110
|
+
|
|
111
|
+
Katalog jest wskazywany przez zmienną środowiskową *KSEFDIR*. Dane są logowane na poziomie wspólnym i na poziomie NIP. Dodatkowo każda wysłana faktura tworzy podkatalog z numerem KSeF nadanym po wysłaniu, gdzie zawarty jest odczytany plik UPO oraz wysłana faktura. Zapamietywane są tylko faktury zaakceptowane w KSeF 2.0 i mające nadany numer KSeF.
|
|
112
|
+
|
|
113
|
+
* KSEFDIR
|
|
114
|
+
* events.csv Plik w formacie tekstowym CSV z historią operacji. Pamiętane są operacje zakończone sukcesem oraz operacje, które nie zostały wykonane z opisem błędu.
|
|
115
|
+
* ksef.log Zawiera dane logging z wykonywania
|
|
116
|
+
* {nip}
|
|
117
|
+
* events.csv Plik w formacie tekstowym CSV z historią operacji. Zawiera te same dane co plik event.csv w katalogu KSEFDIR, ale tylko dla danego NIP
|
|
118
|
+
* ksef.log Zawiera dane logging z wykonywania, Zawiera te same dane co plik ksef.log w katalog KSEFDIR, ale tylko dla operacji związanych z danym NIP
|
|
119
|
+
* {ksef_number} Dla każdej wysłanej i zaakceptowanej faktury z danego NIP
|
|
120
|
+
* upo.xml Plik UPO
|
|
121
|
+
* faktura.xml Wysłana faktura
|
|
122
|
+
|
|
123
|
+
Przykładowy fragment pliku events.csv
|
|
124
|
+
```csv
|
|
125
|
+
2025-12-16T20:49:42.166316,2025-12-16T20:49:42.917164,0.75,1,Czytanie faktur zakupowych,FAIL,KSEFCLI._czytaj_faktury_zakupe_action() got an unexpected keyword argument 'run_func',7497725064,
|
|
126
|
+
2025-12-16T20:50:30.552768,2025-12-16T20:50:31.310412,0.76,1,Czytanie faktur zakupowych,FAIL,KSEFCLI._czytaj_faktury_zakupe_action() got an unexpected keyword argument 'run_func',7497725064,
|
|
127
|
+
2025-12-16T20:53:06.316936,2025-12-16T20:53:07.139957,0.82,1,Czytanie faktur zakupowych,FAIL,KSEFCLI._czytaj_faktury_zakupe_action() missing 1 required positional argument: 'K',7497725064,
|
|
128
|
+
2025-12-16T20:54:07.355882,2025-12-16T20:54:08.150260,0.79,1,Czytanie faktur zakupowych,FAIL,KSEFCLI._czytaj_faktury_zakupe_action() missing 1 required positional argument: 'K',7497725064,
|
|
129
|
+
2025-12-16T20:54:08.754346,2025-12-16T20:54:09.493529,0.74,1,Czytanie faktur zakupowych,FAIL,KSEFCLI._czytaj_faktury_zakupe_action() missing 1 required positional argument: 'K',7497725064,
|
|
130
|
+
2025-12-16T20:54:54.710717,2025-12-16T20:54:55.807550,1.10,1,Czytanie faktur zakupowych,OK,,7497725064,2025-12-11 - 2025-12-18
|
|
131
|
+
2025-12-16T20:54:55.809410,2025-12-16T20:54:56.915264,1.11,4,Weź fakturę z KSeF,OK,,7497725064,
|
|
132
|
+
2025-12-16T20:58:32.052180,2025-12-16T20:58:35.711541,3.66,2,Wyślij fakture do KSeF,FAIL,Nieprawidłowy zakres uprawnień Kontekst 7497725064 nie jest uprawniony do wystawienia faktury w imieniu sprzedawcy (NIP: 7952809480),7497725064,
|
|
133
|
+
2025-12-16T20:58:36.123971,2025-12-16T20:58:38.096498,1.97,1,Czytanie faktur zakupowych,OK,,7497725064,2025-12-11 - 2025-12-18
|
|
134
|
+
```
|
|
135
|
+
## Operacje
|
|
136
|
+
|
|
137
|
+
Wywołanie:
|
|
138
|
+
|
|
139
|
+
> python -m ksef_cli <akcja> \<nip\> <plik_na_wynik> <dodatkowe_parametry>
|
|
140
|
+
|
|
141
|
+
akcja, dopuszczalne wartości:
|
|
142
|
+
* wyslij_fakture Wysłanie faktury do system KSeF 2.0
|
|
143
|
+
* odczytaj_upo Odczytaj plik UPO do wysłanej i zaakceptowanej faktury
|
|
144
|
+
* pobierz_zakupowe Odczytaj nagłówki (metadata) faktur zakupowych
|
|
145
|
+
* odczytaj_fakture Odczytaj fakturę na podstawie nadanego numeru KSeF
|
|
146
|
+
* wyslij_wsadowo Wysyła paczkę faktur w sesji wsadowej
|
|
147
|
+
|
|
148
|
+
nip:
|
|
149
|
+
* Numer NIP użytkownika KSeF 2.0. Numer NIP musi być zawarty w pliku *KSEFCONF*. Z pliku konfiguracyjnego jest odczytywany odpowiedni token służący do autentykacji.
|
|
150
|
+
|
|
151
|
+
plik_na_wynik:
|
|
152
|
+
* Nazwa pliku, gdzie będzie zapisany wynik akcji. Wynik jest zapisany w formacie JSON.
|
|
153
|
+
|
|
154
|
+
Plik zawiera zawsze dwa pola oraz dodatkowe pola zależne od akcji
|
|
155
|
+
* OK: true/false Akcja zakończona sukcesem lub niepowodzeniem
|
|
156
|
+
* errmess: Jeśli akcja zakończona niepowodzeniem, to informacja o błędzie
|
|
157
|
+
|
|
158
|
+
Działanie:
|
|
159
|
+
* Odczytuje NIP oraz wyszukuje metodę autentykacji (token lub certyfikat) w pliku *KSEFCONF*
|
|
160
|
+
* Autentykacja z użyciem NIP oraz poprzez token lub certyfikat
|
|
161
|
+
* Wykonuje akcję na podstawie podanych paeametrów
|
|
162
|
+
* Uzupełnia dziennik oraz logging w katalogu *KSEFDIR*
|
|
163
|
+
* Zapisuje plik *plik_na_wynik* w formacie JSON z wynikiem akcji
|
|
164
|
+
|
|
165
|
+
Dodatkowa uwaga:
|
|
166
|
+
|
|
167
|
+
Wywołanie nie zwraca znaczącego *exit code*. Wynik akcji, także niepowodzenie, trzeba odczytać z pliku *plik_na_wynik*
|
|
168
|
+
|
|
169
|
+
## wyslij_fakture
|
|
170
|
+
|
|
171
|
+
[link](https://github.com/stanislawbartkowski/ksef_pyth?tab=readme-ov-file#wys%C5%82anie-faktury)
|
|
172
|
+
|
|
173
|
+
> python -m ksef_cli wyslij_fakture \<nip\> <plik_na_wynik> <plik XML z fakturą do wysłania>
|
|
174
|
+
|
|
175
|
+
Zwracana wartość w pliku *plik_na_wynik*
|
|
176
|
+
* OK
|
|
177
|
+
* errmess
|
|
178
|
+
* numer_ksef Jeśli faktura jest zaakceptowana w systemie KSeF 2.0, to nadany przez KSeF 2.0 numer
|
|
179
|
+
|
|
180
|
+
## wyslij_wsadowo
|
|
181
|
+
[link](https://github.com/stanislawbartkowski/ksef_pyth/tree/main?tab=readme-ov-file#wys%C5%82anie-paczki-faktur-w-trybie-wsadowym)
|
|
182
|
+
|
|
183
|
+
> python -m ksef_cli wyslij_wsadowo <nip> <plik_na_wynik> <katalog z paczką faktur>
|
|
184
|
+
|
|
185
|
+
* \<katalog z paczką faktur\>. Katalog w którym znajdują się faktury XML gotowe do wysłania do systemu KSeF. Wysyłane są tylko pliki z rozszerzeniem \.xml, inne pliki są ignorowane. UWAGA: w środowisku testowym akceptowanych jest tylko pierwsze 10 faktur, pozostałe są ignorowane bez sygnalizowania żadnego błędu.
|
|
186
|
+
|
|
187
|
+
Działanie:
|
|
188
|
+
* Faktury z katalogu są pakowane w formacie ZIP i wysyłane do systemu KSeF zgodnie ze specyfikacją API. Jeśli rozmiar po spakowaniu przekracza 100MB, to dane są odpowiednio dzielone na poszczególne paczki.
|
|
189
|
+
|
|
190
|
+
Zwracana wartość w pliku *plik_na_wynik*
|
|
191
|
+
* OK
|
|
192
|
+
* errmess
|
|
193
|
+
* invoices Lista wysłanych faktur z nadanym numerem KSeF. Jeden element listy zawiera następujące informacje:
|
|
194
|
+
* ok True/False True jeśli faktura została zaakceptowana w KSeF 2.0 i ma nadany numer KSeF
|
|
195
|
+
* msg Jeśli ok=False, to komunikat o błędzie
|
|
196
|
+
* ordinalNumber Numer kolejny faktury w paczce faktur (od 1)
|
|
197
|
+
* invoiceNumber Numer faktury pobrany ze źródłowego pliku XML
|
|
198
|
+
* ksefNumber Jeśli faktura jest zaakceptowana, to nadany numer KSeF
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
## odczytaj_upo
|
|
202
|
+
|
|
203
|
+
[link](https://github.com/stanislawbartkowski/ksef_pyth?tab=readme-ov-file#odczytanie-upo)
|
|
204
|
+
|
|
205
|
+
> python -m ksef_cli odczytaj_upo \<nip\> <plik_na_wynik> <numer_ksef>
|
|
206
|
+
|
|
207
|
+
Zwracana wartość w pliku *plik_na_wynik*
|
|
208
|
+
* OK
|
|
209
|
+
* errmess
|
|
210
|
+
* upo Nazwa pliku zawierającego UPO w formacie XML
|
|
211
|
+
|
|
212
|
+
UWAGA: UPO jest odczytywane bezpośrednio po wysłaniu faktury *wyslij_fakture* i zapamiętane w katalogu *KSEFDIR*/nip/numer_ksef. Wywołanie *odczytaj_upo* zwraca link do tego pliku, nie jest uruchamiana komunikacja z KSeF.
|
|
213
|
+
|
|
214
|
+
## odczytaj_fakture
|
|
215
|
+
|
|
216
|
+
[link](https://github.com/stanislawbartkowski/ksef_pyth?tab=readme-ov-file#odczytanie-faktury-wed%C5%82ug-numeru-ksef)
|
|
217
|
+
|
|
218
|
+
> python -m ksef_cli odczytaj_fakture \<nip\> <plik_na_wynik> <numer_ksef>
|
|
219
|
+
|
|
220
|
+
Zwracana wartość w pliku *plik_na_wynik*
|
|
221
|
+
* OK
|
|
222
|
+
* errmess
|
|
223
|
+
* invoice Nazwa plik z odczytaną fakturą w formacie XML
|
|
224
|
+
|
|
225
|
+
## pobierz_zakupowe
|
|
226
|
+
|
|
227
|
+
[link](https://github.com/stanislawbartkowski/ksef_pyth?tab=readme-ov-file#odczytanie-nag%C5%82%C3%B3wk%C3%B3w-faktur-zakupowych-na-podstawie-dat)
|
|
228
|
+
|
|
229
|
+
> python -m ksef_cli pobierz_zakupowe \<nip\> <plik_na_wynik> <data_od> <data_do>
|
|
230
|
+
|
|
231
|
+
Odczytuje faktury zakupowe w przedziale dat. Daty muszą być w formacie YYYY-MM-DD
|
|
232
|
+
|
|
233
|
+
Zwracana wartość w pliku *plik_na_wynik*
|
|
234
|
+
* OK
|
|
235
|
+
* errmess
|
|
236
|
+
* faktury Lista zawierająca odczytane nagłówki faktur zakupowych z podanego zakresu dat.
|
|
237
|
+
|
|
238
|
+
## pobierz_sprzedazowe
|
|
239
|
+
|
|
240
|
+
[link](https://github.com/stanislawbartkowski/ksef_pyth/tree/main?tab=readme-ov-file#odczytanie-nag%C5%82%C3%B3wk%C3%B3w-faktur-na-podstawie-dat)
|
|
241
|
+
|
|
242
|
+
> python -m ksef_cli pobierz_sprzedazowe \<nip\> <plik_na_wynik> <data_od> <data_do>
|
|
243
|
+
|
|
244
|
+
Odczytuje faktury sprzedażowe w przedziale dat. Daty muszą być w formacie YYYY-MM-DD
|
|
245
|
+
|
|
246
|
+
Zwracana wartość w pliku *plik_na_wynik*
|
|
247
|
+
* OK
|
|
248
|
+
* errmess
|
|
249
|
+
* faktury Lista zawierająca odczytane nagłówki faktur sprzedażowych z podanego zakresu dat.
|
|
250
|
+
|
|
251
|
+
## pobierz_zbiorczo
|
|
252
|
+
|
|
253
|
+
[link](https://github.com/stanislawbartkowski/ksef_pyth?tab=readme-ov-file#odczytanie-paczki-faktur)
|
|
254
|
+
|
|
255
|
+
> python -m ksef_cli pobierz_zbiorczo \<nip\> <plik_na_wynik> <data_od> <data_do> \<subject\>
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
Zwraca w plik_na_wynik
|
|
259
|
+
* OK: true/false
|
|
260
|
+
* errmess
|
|
261
|
+
* katalog: Katalog tymczasowy, gdzie znajdują się odczytane faktury lub None, jeśli nic nie odczytano
|
|
262
|
+
* liczba_faktur: Liczba odczytanych faktur. Liczba może być 0, wówczas katalog jest None
|
|
263
|
+
|
|
264
|
+
## daj_konfiguracje
|
|
265
|
+
|
|
266
|
+
Pozwala sprawdzić, czy NIP jest skonfigurowany do komunikacji z systemem KSeF 2.0
|
|
267
|
+
|
|
268
|
+
> python -m ksef_cli daj_konfiguracje \<nip\> <plik_na_wynik>
|
|
269
|
+
|
|
270
|
+
Zwraca w plik_na_wynik
|
|
271
|
+
* OK: true/false
|
|
272
|
+
* errmess
|
|
273
|
+
* mess, Dodatkowy komunikat
|
|
274
|
+
* auth: Dwa wartości, token lub certyfikat
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
## Przykładowe wywołanie
|
|
278
|
+
> export KSEFCONF=/ścieżka/ <br>
|
|
279
|
+
> export KSEFDIR=/ścieżka/ <br>
|
|
280
|
+
> python -m ksef_cli /parametry/ <br>
|
|
281
|
+
|
|
282
|
+
## Dev environment, happy coding
|
|
283
|
+
> source .venv/bin/activate<br>
|
|
284
|
+
> git clone https://github.com/stanislawbartkowski/ksef_cli.git<br>
|
|
285
|
+
> pip install -r requirements.txt<br>
|
|
286
|
+
> code .<br>
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
## Opis
|
|
2
|
+
|
|
3
|
+
Jest to "command line" rozszerzenie rozwiązania: https://github.com/stanislawbartkowski/ksef_pyth. Umożliwia komunikację z systemem KSeF z poprzez wywołanie python3. Daje to możliwość integracji z systemami, które nie są oparte w Python.
|
|
4
|
+
|
|
5
|
+
Dodatkowe cechy rozwiązania:
|
|
6
|
+
|
|
7
|
+
* Konfiguracje metody autentykacji: token lub certyfikat na podstawie pliku konfiguracyjnego
|
|
8
|
+
* Tworzenie dziennika i logów, historii wykonywanych operacji.
|
|
9
|
+
* Możliwość wywołania funkcjonalności z poziomu bash lub bezpośrednio jako komenda python3
|
|
10
|
+
|
|
11
|
+
## Python
|
|
12
|
+
|
|
13
|
+
Testowane dla wersji: 3.10, 3.11 i 3.12
|
|
14
|
+
|
|
15
|
+
Testowane tylko w testowym środowisku KSeF 2.0. Nie było weryfikowane w pozostałych środowiskach.
|
|
16
|
+
|
|
17
|
+
## Konfiguracja
|
|
18
|
+
|
|
19
|
+
Zmienne środowiskowe
|
|
20
|
+
|
|
21
|
+
* KSEFCONF - plik zawierający listę dopuszczalnych NIPów oraz tokenów związanych z NIPami. Zawiera także definicje obsługiwanego środowiska KSeF 2.0 - deweloperskie/testowe, przedprodukcyjne oraz produkcyjne.
|
|
22
|
+
* KSEFDIR - katalog na logi operacji
|
|
23
|
+
|
|
24
|
+
## Instalacja
|
|
25
|
+
> pip install git+https://github.com/stanislawbartkowski/ksef_cli.git<br>
|
|
26
|
+
> python<br>
|
|
27
|
+
> import ksef_cli<br>
|
|
28
|
+
|
|
29
|
+
## Konfiguracja NIP oraz metody autentykacji
|
|
30
|
+
|
|
31
|
+
Plik jest wskazywany przez zmienną środowiskową *KSEFCONF*. Jest to plik w formacie YAML.
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
tokens:
|
|
35
|
+
NIP{nip}:
|
|
36
|
+
token: {token dla NIP}
|
|
37
|
+
env: prod|demo|test (produkcyjne, demo, testowe)
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Token
|
|
41
|
+
|
|
42
|
+
Przykład: <br>
|
|
43
|
+
NIP - 7497725064 <br>
|
|
44
|
+
Wartość tokena dostępowego dla NIP <br>
|
|
45
|
+
Środowisko testowe <br>
|
|
46
|
+
|
|
47
|
+
```YAML
|
|
48
|
+
NIP7497725064:
|
|
49
|
+
token: 20251116-EC-0317C65000-2CA83C40D9-73|nip-7497725064|80be6cfced7f44eb860aeeb644e8cffdd59bbad9e218415296db90a39e6e5370
|
|
50
|
+
env: test
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Certyfikat
|
|
54
|
+
|
|
55
|
+
Przykład: <br>
|
|
56
|
+
NIP - 7497725064 <br>
|
|
57
|
+
Środowisko testowe <br>
|
|
58
|
+
Plik p12 z certyfikatami: keyStore.p12<br>
|
|
59
|
+
Hasło odczytu: 1234
|
|
60
|
+
|
|
61
|
+
```YAML
|
|
62
|
+
NIP7497725064:
|
|
63
|
+
env: test
|
|
64
|
+
password: "1234"
|
|
65
|
+
p12: keyStore.p12
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Dodatkowa informacja dotycząca certyfikatów.
|
|
69
|
+
|
|
70
|
+
Testy były przeprowadzane tylko dla tylko dla testowych certyfikatów generowanych poprzez testowe środowisko KSeF 2.0
|
|
71
|
+
|
|
72
|
+
Parametr p12 wskazuje na plik w formacie P12 zawierający wygenerowany klucz i certyfikat.
|
|
73
|
+
|
|
74
|
+
Przykładowa komenda tworząca plik P12. Pliki CertyfikatKSEF zawierają pliki utworzone przez KSeF 2.0
|
|
75
|
+
|
|
76
|
+
> openssl pkcs12 -export -out keyStore.p12 -inkey CertyfikatKSEF.key -in CertyfikatKSEF.crt
|
|
77
|
+
|
|
78
|
+
## NIP
|
|
79
|
+
NIP przekazywany jako parametr do wszystkich wywołań może przybierać dwie postacie:
|
|
80
|
+
|
|
81
|
+
* NIP
|
|
82
|
+
* NIP$podkatalog
|
|
83
|
+
|
|
84
|
+
W drugim przypadku po symbolu NIP są dodane separator $ oraz nazwa podkatalogu. Podkatalog ma znaczenie dla tworzenia struktury logów oraz miejsca składowania faktur/UPO. Bez podkatalogu miejscem jest zawsze symbol NIP. Z podkatalogiem do NIP jest dodawany podkatalog.
|
|
85
|
+
Ten sam symbol NIP może być wywoływany z różnymi podkatalogami. Przykład:
|
|
86
|
+
* 7497725064, miejscem składowania jest NIP 7497725064
|
|
87
|
+
* 7497725064$ROK2025, miejscem składowania jest 7497725064/ROK2025
|
|
88
|
+
|
|
89
|
+
## Struktura kodu w Python
|
|
90
|
+
|
|
91
|
+
* ksef_cli
|
|
92
|
+
* ksef_cli.py Dostępna funkcjonalność
|
|
93
|
+
* ksef_conf.py Wykorzystywany wewnętrznie, konfiguracja
|
|
94
|
+
* ksef_log.py Wykorzystywany wewnętrznie, tworzenie dziennika
|
|
95
|
+
* ksef_tokens.py Wykorzystywany wewnętrznie, tokeny i środowiska
|
|
96
|
+
* tests Unit test suite
|
|
97
|
+
|
|
98
|
+
## Struktura katalogu z logami i dziennikiem
|
|
99
|
+
|
|
100
|
+
Katalog jest wskazywany przez zmienną środowiskową *KSEFDIR*. Dane są logowane na poziomie wspólnym i na poziomie NIP. Dodatkowo każda wysłana faktura tworzy podkatalog z numerem KSeF nadanym po wysłaniu, gdzie zawarty jest odczytany plik UPO oraz wysłana faktura. Zapamietywane są tylko faktury zaakceptowane w KSeF 2.0 i mające nadany numer KSeF.
|
|
101
|
+
|
|
102
|
+
* KSEFDIR
|
|
103
|
+
* events.csv Plik w formacie tekstowym CSV z historią operacji. Pamiętane są operacje zakończone sukcesem oraz operacje, które nie zostały wykonane z opisem błędu.
|
|
104
|
+
* ksef.log Zawiera dane logging z wykonywania
|
|
105
|
+
* {nip}
|
|
106
|
+
* events.csv Plik w formacie tekstowym CSV z historią operacji. Zawiera te same dane co plik event.csv w katalogu KSEFDIR, ale tylko dla danego NIP
|
|
107
|
+
* ksef.log Zawiera dane logging z wykonywania, Zawiera te same dane co plik ksef.log w katalog KSEFDIR, ale tylko dla operacji związanych z danym NIP
|
|
108
|
+
* {ksef_number} Dla każdej wysłanej i zaakceptowanej faktury z danego NIP
|
|
109
|
+
* upo.xml Plik UPO
|
|
110
|
+
* faktura.xml Wysłana faktura
|
|
111
|
+
|
|
112
|
+
Przykładowy fragment pliku events.csv
|
|
113
|
+
```csv
|
|
114
|
+
2025-12-16T20:49:42.166316,2025-12-16T20:49:42.917164,0.75,1,Czytanie faktur zakupowych,FAIL,KSEFCLI._czytaj_faktury_zakupe_action() got an unexpected keyword argument 'run_func',7497725064,
|
|
115
|
+
2025-12-16T20:50:30.552768,2025-12-16T20:50:31.310412,0.76,1,Czytanie faktur zakupowych,FAIL,KSEFCLI._czytaj_faktury_zakupe_action() got an unexpected keyword argument 'run_func',7497725064,
|
|
116
|
+
2025-12-16T20:53:06.316936,2025-12-16T20:53:07.139957,0.82,1,Czytanie faktur zakupowych,FAIL,KSEFCLI._czytaj_faktury_zakupe_action() missing 1 required positional argument: 'K',7497725064,
|
|
117
|
+
2025-12-16T20:54:07.355882,2025-12-16T20:54:08.150260,0.79,1,Czytanie faktur zakupowych,FAIL,KSEFCLI._czytaj_faktury_zakupe_action() missing 1 required positional argument: 'K',7497725064,
|
|
118
|
+
2025-12-16T20:54:08.754346,2025-12-16T20:54:09.493529,0.74,1,Czytanie faktur zakupowych,FAIL,KSEFCLI._czytaj_faktury_zakupe_action() missing 1 required positional argument: 'K',7497725064,
|
|
119
|
+
2025-12-16T20:54:54.710717,2025-12-16T20:54:55.807550,1.10,1,Czytanie faktur zakupowych,OK,,7497725064,2025-12-11 - 2025-12-18
|
|
120
|
+
2025-12-16T20:54:55.809410,2025-12-16T20:54:56.915264,1.11,4,Weź fakturę z KSeF,OK,,7497725064,
|
|
121
|
+
2025-12-16T20:58:32.052180,2025-12-16T20:58:35.711541,3.66,2,Wyślij fakture do KSeF,FAIL,Nieprawidłowy zakres uprawnień Kontekst 7497725064 nie jest uprawniony do wystawienia faktury w imieniu sprzedawcy (NIP: 7952809480),7497725064,
|
|
122
|
+
2025-12-16T20:58:36.123971,2025-12-16T20:58:38.096498,1.97,1,Czytanie faktur zakupowych,OK,,7497725064,2025-12-11 - 2025-12-18
|
|
123
|
+
```
|
|
124
|
+
## Operacje
|
|
125
|
+
|
|
126
|
+
Wywołanie:
|
|
127
|
+
|
|
128
|
+
> python -m ksef_cli <akcja> \<nip\> <plik_na_wynik> <dodatkowe_parametry>
|
|
129
|
+
|
|
130
|
+
akcja, dopuszczalne wartości:
|
|
131
|
+
* wyslij_fakture Wysłanie faktury do system KSeF 2.0
|
|
132
|
+
* odczytaj_upo Odczytaj plik UPO do wysłanej i zaakceptowanej faktury
|
|
133
|
+
* pobierz_zakupowe Odczytaj nagłówki (metadata) faktur zakupowych
|
|
134
|
+
* odczytaj_fakture Odczytaj fakturę na podstawie nadanego numeru KSeF
|
|
135
|
+
* wyslij_wsadowo Wysyła paczkę faktur w sesji wsadowej
|
|
136
|
+
|
|
137
|
+
nip:
|
|
138
|
+
* Numer NIP użytkownika KSeF 2.0. Numer NIP musi być zawarty w pliku *KSEFCONF*. Z pliku konfiguracyjnego jest odczytywany odpowiedni token służący do autentykacji.
|
|
139
|
+
|
|
140
|
+
plik_na_wynik:
|
|
141
|
+
* Nazwa pliku, gdzie będzie zapisany wynik akcji. Wynik jest zapisany w formacie JSON.
|
|
142
|
+
|
|
143
|
+
Plik zawiera zawsze dwa pola oraz dodatkowe pola zależne od akcji
|
|
144
|
+
* OK: true/false Akcja zakończona sukcesem lub niepowodzeniem
|
|
145
|
+
* errmess: Jeśli akcja zakończona niepowodzeniem, to informacja o błędzie
|
|
146
|
+
|
|
147
|
+
Działanie:
|
|
148
|
+
* Odczytuje NIP oraz wyszukuje metodę autentykacji (token lub certyfikat) w pliku *KSEFCONF*
|
|
149
|
+
* Autentykacja z użyciem NIP oraz poprzez token lub certyfikat
|
|
150
|
+
* Wykonuje akcję na podstawie podanych paeametrów
|
|
151
|
+
* Uzupełnia dziennik oraz logging w katalogu *KSEFDIR*
|
|
152
|
+
* Zapisuje plik *plik_na_wynik* w formacie JSON z wynikiem akcji
|
|
153
|
+
|
|
154
|
+
Dodatkowa uwaga:
|
|
155
|
+
|
|
156
|
+
Wywołanie nie zwraca znaczącego *exit code*. Wynik akcji, także niepowodzenie, trzeba odczytać z pliku *plik_na_wynik*
|
|
157
|
+
|
|
158
|
+
## wyslij_fakture
|
|
159
|
+
|
|
160
|
+
[link](https://github.com/stanislawbartkowski/ksef_pyth?tab=readme-ov-file#wys%C5%82anie-faktury)
|
|
161
|
+
|
|
162
|
+
> python -m ksef_cli wyslij_fakture \<nip\> <plik_na_wynik> <plik XML z fakturą do wysłania>
|
|
163
|
+
|
|
164
|
+
Zwracana wartość w pliku *plik_na_wynik*
|
|
165
|
+
* OK
|
|
166
|
+
* errmess
|
|
167
|
+
* numer_ksef Jeśli faktura jest zaakceptowana w systemie KSeF 2.0, to nadany przez KSeF 2.0 numer
|
|
168
|
+
|
|
169
|
+
## wyslij_wsadowo
|
|
170
|
+
[link](https://github.com/stanislawbartkowski/ksef_pyth/tree/main?tab=readme-ov-file#wys%C5%82anie-paczki-faktur-w-trybie-wsadowym)
|
|
171
|
+
|
|
172
|
+
> python -m ksef_cli wyslij_wsadowo <nip> <plik_na_wynik> <katalog z paczką faktur>
|
|
173
|
+
|
|
174
|
+
* \<katalog z paczką faktur\>. Katalog w którym znajdują się faktury XML gotowe do wysłania do systemu KSeF. Wysyłane są tylko pliki z rozszerzeniem \.xml, inne pliki są ignorowane. UWAGA: w środowisku testowym akceptowanych jest tylko pierwsze 10 faktur, pozostałe są ignorowane bez sygnalizowania żadnego błędu.
|
|
175
|
+
|
|
176
|
+
Działanie:
|
|
177
|
+
* Faktury z katalogu są pakowane w formacie ZIP i wysyłane do systemu KSeF zgodnie ze specyfikacją API. Jeśli rozmiar po spakowaniu przekracza 100MB, to dane są odpowiednio dzielone na poszczególne paczki.
|
|
178
|
+
|
|
179
|
+
Zwracana wartość w pliku *plik_na_wynik*
|
|
180
|
+
* OK
|
|
181
|
+
* errmess
|
|
182
|
+
* invoices Lista wysłanych faktur z nadanym numerem KSeF. Jeden element listy zawiera następujące informacje:
|
|
183
|
+
* ok True/False True jeśli faktura została zaakceptowana w KSeF 2.0 i ma nadany numer KSeF
|
|
184
|
+
* msg Jeśli ok=False, to komunikat o błędzie
|
|
185
|
+
* ordinalNumber Numer kolejny faktury w paczce faktur (od 1)
|
|
186
|
+
* invoiceNumber Numer faktury pobrany ze źródłowego pliku XML
|
|
187
|
+
* ksefNumber Jeśli faktura jest zaakceptowana, to nadany numer KSeF
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
## odczytaj_upo
|
|
191
|
+
|
|
192
|
+
[link](https://github.com/stanislawbartkowski/ksef_pyth?tab=readme-ov-file#odczytanie-upo)
|
|
193
|
+
|
|
194
|
+
> python -m ksef_cli odczytaj_upo \<nip\> <plik_na_wynik> <numer_ksef>
|
|
195
|
+
|
|
196
|
+
Zwracana wartość w pliku *plik_na_wynik*
|
|
197
|
+
* OK
|
|
198
|
+
* errmess
|
|
199
|
+
* upo Nazwa pliku zawierającego UPO w formacie XML
|
|
200
|
+
|
|
201
|
+
UWAGA: UPO jest odczytywane bezpośrednio po wysłaniu faktury *wyslij_fakture* i zapamiętane w katalogu *KSEFDIR*/nip/numer_ksef. Wywołanie *odczytaj_upo* zwraca link do tego pliku, nie jest uruchamiana komunikacja z KSeF.
|
|
202
|
+
|
|
203
|
+
## odczytaj_fakture
|
|
204
|
+
|
|
205
|
+
[link](https://github.com/stanislawbartkowski/ksef_pyth?tab=readme-ov-file#odczytanie-faktury-wed%C5%82ug-numeru-ksef)
|
|
206
|
+
|
|
207
|
+
> python -m ksef_cli odczytaj_fakture \<nip\> <plik_na_wynik> <numer_ksef>
|
|
208
|
+
|
|
209
|
+
Zwracana wartość w pliku *plik_na_wynik*
|
|
210
|
+
* OK
|
|
211
|
+
* errmess
|
|
212
|
+
* invoice Nazwa plik z odczytaną fakturą w formacie XML
|
|
213
|
+
|
|
214
|
+
## pobierz_zakupowe
|
|
215
|
+
|
|
216
|
+
[link](https://github.com/stanislawbartkowski/ksef_pyth?tab=readme-ov-file#odczytanie-nag%C5%82%C3%B3wk%C3%B3w-faktur-zakupowych-na-podstawie-dat)
|
|
217
|
+
|
|
218
|
+
> python -m ksef_cli pobierz_zakupowe \<nip\> <plik_na_wynik> <data_od> <data_do>
|
|
219
|
+
|
|
220
|
+
Odczytuje faktury zakupowe w przedziale dat. Daty muszą być w formacie YYYY-MM-DD
|
|
221
|
+
|
|
222
|
+
Zwracana wartość w pliku *plik_na_wynik*
|
|
223
|
+
* OK
|
|
224
|
+
* errmess
|
|
225
|
+
* faktury Lista zawierająca odczytane nagłówki faktur zakupowych z podanego zakresu dat.
|
|
226
|
+
|
|
227
|
+
## pobierz_sprzedazowe
|
|
228
|
+
|
|
229
|
+
[link](https://github.com/stanislawbartkowski/ksef_pyth/tree/main?tab=readme-ov-file#odczytanie-nag%C5%82%C3%B3wk%C3%B3w-faktur-na-podstawie-dat)
|
|
230
|
+
|
|
231
|
+
> python -m ksef_cli pobierz_sprzedazowe \<nip\> <plik_na_wynik> <data_od> <data_do>
|
|
232
|
+
|
|
233
|
+
Odczytuje faktury sprzedażowe w przedziale dat. Daty muszą być w formacie YYYY-MM-DD
|
|
234
|
+
|
|
235
|
+
Zwracana wartość w pliku *plik_na_wynik*
|
|
236
|
+
* OK
|
|
237
|
+
* errmess
|
|
238
|
+
* faktury Lista zawierająca odczytane nagłówki faktur sprzedażowych z podanego zakresu dat.
|
|
239
|
+
|
|
240
|
+
## pobierz_zbiorczo
|
|
241
|
+
|
|
242
|
+
[link](https://github.com/stanislawbartkowski/ksef_pyth?tab=readme-ov-file#odczytanie-paczki-faktur)
|
|
243
|
+
|
|
244
|
+
> python -m ksef_cli pobierz_zbiorczo \<nip\> <plik_na_wynik> <data_od> <data_do> \<subject\>
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
Zwraca w plik_na_wynik
|
|
248
|
+
* OK: true/false
|
|
249
|
+
* errmess
|
|
250
|
+
* katalog: Katalog tymczasowy, gdzie znajdują się odczytane faktury lub None, jeśli nic nie odczytano
|
|
251
|
+
* liczba_faktur: Liczba odczytanych faktur. Liczba może być 0, wówczas katalog jest None
|
|
252
|
+
|
|
253
|
+
## daj_konfiguracje
|
|
254
|
+
|
|
255
|
+
Pozwala sprawdzić, czy NIP jest skonfigurowany do komunikacji z systemem KSeF 2.0
|
|
256
|
+
|
|
257
|
+
> python -m ksef_cli daj_konfiguracje \<nip\> <plik_na_wynik>
|
|
258
|
+
|
|
259
|
+
Zwraca w plik_na_wynik
|
|
260
|
+
* OK: true/false
|
|
261
|
+
* errmess
|
|
262
|
+
* mess, Dodatkowy komunikat
|
|
263
|
+
* auth: Dwa wartości, token lub certyfikat
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
## Przykładowe wywołanie
|
|
267
|
+
> export KSEFCONF=/ścieżka/ <br>
|
|
268
|
+
> export KSEFDIR=/ścieżka/ <br>
|
|
269
|
+
> python -m ksef_cli /parametry/ <br>
|
|
270
|
+
|
|
271
|
+
## Dev environment, happy coding
|
|
272
|
+
> source .venv/bin/activate<br>
|
|
273
|
+
> git clone https://github.com/stanislawbartkowski/ksef_cli.git<br>
|
|
274
|
+
> pip install -r requirements.txt<br>
|
|
275
|
+
> code .<br>
|