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.
@@ -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>