ksefik 0.2.0__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.
Files changed (40) hide show
  1. ksefik-0.2.0/LICENSE +21 -0
  2. ksefik-0.2.0/PKG-INFO +306 -0
  3. ksefik-0.2.0/README.md +271 -0
  4. ksefik-0.2.0/pyproject.toml +97 -0
  5. ksefik-0.2.0/pyproject.toml.orig +76 -0
  6. ksefik-0.2.0/src/ksefik/__init__.py +36 -0
  7. ksefik-0.2.0/src/ksefik/client.py +1361 -0
  8. ksefik-0.2.0/src/ksefik/codes.py +291 -0
  9. ksefik-0.2.0/src/ksefik/config.py +68 -0
  10. ksefik-0.2.0/src/ksefik/crypto.py +55 -0
  11. ksefik-0.2.0/src/ksefik/drafts.py +58 -0
  12. ksefik-0.2.0/src/ksefik/fa_parser.py +492 -0
  13. ksefik-0.2.0/src/ksefik/invoice.py +755 -0
  14. ksefik-0.2.0/src/ksefik/money.py +92 -0
  15. ksefik-0.2.0/src/ksefik/profile.py +692 -0
  16. ksefik-0.2.0/src/ksefik/py.typed +0 -0
  17. ksefik-0.2.0/src/ksefik/registry.py +108 -0
  18. ksefik-0.2.0/src/ksefik/schemas/ElementarneTypyDanych_v10-0E.xsd +1 -0
  19. ksefik-0.2.0/src/ksefik/schemas/KodyKrajow_v10-0E.xsd +1283 -0
  20. ksefik-0.2.0/src/ksefik/schemas/StrukturyDanych_v10-0E.xsd +1 -0
  21. ksefik-0.2.0/src/ksefik/schemas/schemat_FA3_v1-0E.xsd +3950 -0
  22. ksefik-0.2.0/src/ksefik/store.py +576 -0
  23. ksefik-0.2.0/src/ksefik/submissions.py +254 -0
  24. ksefik-0.2.0/src/ksefik/sync.py +139 -0
  25. ksefik-0.2.0/src/ksefik/tokenstore.py +82 -0
  26. ksefik-0.2.0/src/ksefik/ui/__init__.py +0 -0
  27. ksefik-0.2.0/src/ksefik/ui/account.py +1119 -0
  28. ksefik-0.2.0/src/ksefik/ui/app.py +969 -0
  29. ksefik-0.2.0/src/ksefik/ui/app.tcss +716 -0
  30. ksefik-0.2.0/src/ksefik/ui/certificates.py +344 -0
  31. ksefik-0.2.0/src/ksefik/ui/common.py +1030 -0
  32. ksefik-0.2.0/src/ksefik/ui/editor.py +1165 -0
  33. ksefik-0.2.0/src/ksefik/ui/import_screen.py +724 -0
  34. ksefik-0.2.0/src/ksefik/ui/invoice_screens.py +997 -0
  35. ksefik-0.2.0/src/ksefik/ui/main_screen.py +900 -0
  36. ksefik-0.2.0/src/ksefik/ui/permissions.py +762 -0
  37. ksefik-0.2.0/src/ksefik/ui/sent_screen.py +249 -0
  38. ksefik-0.2.0/src/ksefik/ui/setup_screen.py +319 -0
  39. ksefik-0.2.0/src/ksefik/ui/widgets.py +213 -0
  40. ksefik-0.2.0/src/ksefik/xades.py +246 -0
ksefik-0.2.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Paweł Borkowski
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.
ksefik-0.2.0/PKG-INFO ADDED
@@ -0,0 +1,306 @@
1
+ Metadata-Version: 2.4
2
+ Name: ksefik
3
+ Version: 0.2.0
4
+ Summary: KSeF 2.0 w terminalu: faktury wystawione i otrzymane, wystawianie FA(3), korekty, tokeny, uprawnienia, certyfikaty
5
+ Keywords: ksef,e-faktura,faktura,fa3,tui,textual,vat,invoice,poland
6
+ Author: Paweł Borkowski
7
+ Author-email: Paweł Borkowski <gacopys@gmail.com>
8
+ License-Expression: MIT
9
+ License-File: LICENSE
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Environment :: Console :: Curses
12
+ Classifier: Intended Audience :: End Users/Desktop
13
+ Classifier: Intended Audience :: Financial and Insurance Industry
14
+ Classifier: Natural Language :: Polish
15
+ Classifier: Operating System :: POSIX :: Linux
16
+ Classifier: Operating System :: MacOS
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3 :: Only
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Programming Language :: Python :: 3.14
22
+ Classifier: Topic :: Office/Business :: Financial :: Accounting
23
+ Classifier: Typing :: Typed
24
+ Requires-Dist: cryptography>=50.0.2
25
+ Requires-Dist: httpx>=0.28.1
26
+ Requires-Dist: keyring>=25.7.0
27
+ Requires-Dist: lxml>=6.1.3
28
+ Requires-Dist: textual>=8.2.8
29
+ Requires-Python: >=3.12
30
+ Project-URL: Homepage, https://github.com/gacopys/ksefik
31
+ Project-URL: Repository, https://github.com/gacopys/ksefik
32
+ Project-URL: Issues, https://github.com/gacopys/ksefik/issues
33
+ Project-URL: Changelog, https://github.com/gacopys/ksefik/blob/main/CHANGELOG.md
34
+ Description-Content-Type: text/markdown
35
+
36
+ <div align="center">
37
+
38
+ # ksefik
39
+
40
+ **Krajowy System e-Faktur w terminalu.**<br>
41
+ Przeglądaj, wystawiaj i wysyłaj faktury FA(3) do KSeF 2.0 - szybko, z klawiatury, bez przeglądarki.
42
+
43
+ [![CI](https://github.com/gacopys/ksefik/actions/workflows/ci.yml/badge.svg)](https://github.com/gacopys/ksefik/actions/workflows/ci.yml)
44
+ [![Testy z KSeF](https://github.com/gacopys/ksefik/actions/workflows/e2e.yml/badge.svg)](https://github.com/gacopys/ksefik/actions/workflows/e2e.yml)
45
+ [![Pokrycie kodu](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/gacopys/ksefik/python-coverage-comment-action-data/endpoint.json)](https://htmlpreview.github.io/?https://github.com/gacopys/ksefik/blob/python-coverage-comment-action-data/htmlcov/index.html)
46
+ [![CodeQL](https://github.com/gacopys/ksefik/actions/workflows/codeql.yml/badge.svg)](https://github.com/gacopys/ksefik/actions/workflows/codeql.yml)
47
+ <br>
48
+ [![PyPI](https://img.shields.io/pypi/v/ksefik?color=blue)](https://pypi.org/project/ksefik/)
49
+ [![Python](https://img.shields.io/badge/python-3.12%20%7C%203.13%20%7C%203.14-blue?logo=python&logoColor=white)](https://www.python.org/)
50
+ [![KSeF 2.0](https://img.shields.io/badge/KSeF-2.0%20%C2%B7%20FA(3)-d4213d)](https://ksef.podatki.gov.pl/)
51
+ [![Licencja MIT](https://img.shields.io/badge/licencja-MIT-green)](LICENSE)
52
+ [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
53
+ [![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)
54
+ [![Textual](https://img.shields.io/badge/UI-Textual-8a2be2)](https://textual.textualize.io/)
55
+
56
+ <img src="https://raw.githubusercontent.com/gacopys/ksefik/main/docs/screenshots/lista.png" alt="Lista faktur w ksefik" width="820">
57
+
58
+ </div>
59
+
60
+ ---
61
+
62
+ ## Dlaczego ksefik?
63
+
64
+ - ⚡ **Szybko.** Faktury są w lokalnej bazie SQLite z wyszukiwaniem pełnotekstowym - lista i szukanie działają
65
+ natychmiast, także offline. Nowa faktura dla stałego kontrahenta to kilka klawiszy.
66
+ - ✅ **Bezpiecznie.** Każda faktura przed wysyłką jest sprawdzana oficjalnym schematem XSD FA(3) i regułami
67
+ biznesowymi (NIP, daty, kurs waluty, MPP, zwolnienia, duplikaty numerów). Widzisz ją dokładnie w takiej
68
+ postaci, w jakiej trafi do KSeF.
69
+ - 🧾 **Kompletnie.** Faktury krajowe, UE i eksport, waluty obce, wiele stawek VAT, korekty, MPP, metoda kasowa,
70
+ JST i podmioty trzecie, wysyłka gotowych plików XML (także wsadowa i offline), UPO.
71
+ - 🔐 **Całe konto KSeF.** Tokeny, uprawnienia, certyfikaty KSeF, sesje, limity, identyfikatory zbiorcze, Peppol -
72
+ wszystko, co zwykle wymaga Aplikacji Podatnika.
73
+ - 🏠 **Twoje dane zostają u Ciebie.** Brak serwera pośredniczącego i telemetrii. Aplikacja łączy się tylko z API KSeF
74
+ Ministerstwa Finansów (i na Twoje żądanie z Białą listą VAT). Token trafia do systemowego pęku kluczy.
75
+ - 🏢 **Wiele firm.** Osobny profil, baza i token dla każdej firmy i środowiska (produkcja, demo, test).
76
+
77
+ <table>
78
+ <tr>
79
+ <td width="50%"><img src="https://raw.githubusercontent.com/gacopys/ksefik/main/docs/screenshots/podsumowanie.png" alt="Podsumowanie faktury przed wysyłką"><br><sub><b>Podsumowanie przed wysyłką</b> - faktura sprawdzona schematem FA(3)</sub></td>
80
+ <td width="50%"><img src="https://raw.githubusercontent.com/gacopys/ksefik/main/docs/screenshots/faktura.png" alt="Podgląd faktury"><br><sub><b>Podgląd faktury</b> - UPO, XML, korekta, wystaw podobną</sub></td>
81
+ </tr>
82
+ <tr>
83
+ <td><img src="https://raw.githubusercontent.com/gacopys/ksefik/main/docs/screenshots/kreator-nip.png" alt="Kreator profilu z pobieraniem danych po NIP"><br><sub><b>Kreator</b> - dane firmy pobrane po NIP z Białej listy VAT</sub></td>
84
+ <td><img src="https://raw.githubusercontent.com/gacopys/ksefik/main/docs/screenshots/konto.png" alt="Konto KSeF"><br><sub><b>Konto KSeF</b> - tokeny, uprawnienia, certyfikaty, limity</sub></td>
85
+ </tr>
86
+ </table>
87
+
88
+ ## Instalacja
89
+
90
+ Potrzebujesz Pythona 3.12+. ksefik jest rozwijany i testowany na Linuksie; macOS powinien działać, Windows
91
+ na razie nie jest wspierany. Najprościej przez [uv](https://docs.astral.sh/uv/):
92
+
93
+ ```bash
94
+ uv tool install ksefik # albo: pipx install ksefik
95
+ ksefik
96
+ ```
97
+
98
+ Bez instalacji: `uvx ksefik`. Wersja rozwojowa prosto z repozytorium:
99
+
100
+ ```bash
101
+ git clone https://github.com/gacopys/ksefik.git && cd ksefik
102
+ make run # to samo co: uv run ksefik
103
+ ```
104
+
105
+ ## Pierwsze uruchomienie
106
+
107
+ 1. **Kreator** zapyta o dane firmy (NIP, nazwa, adres, rachunek, numeracja) i zapisze je w profilu
108
+ `~/.config/ksefik/profile.toml`. Przycisk „Pobierz dane” obok NIP-u uzupełni nazwę i adres z wykazu podatników
109
+ VAT (Biała lista MF; bez klucza, limit ok. 100 zapytań dziennie).
110
+ 2. **Token KSeF** wygenerujesz w [Aplikacji Podatnika KSeF](https://ksef.podatki.gov.pl/). Token trafia do
111
+ systemowego pęku kluczy, a gdy go nie ma - do pliku `~/.config/ksefik/token-…` z prawami `0600`.
112
+ Zamiast tokena możesz [logować się certyfikatem](#logowanie-certyfikatem).
113
+ 3. Gotowe - faktury zsynchronizują się same.
114
+
115
+ > [!TIP]
116
+ > Chcesz najpierw spróbować bez prawdziwych danych? `ksefik --env test` łączy się ze środowiskiem testowym KSeF,
117
+ > a `make run-test-env` w repozytorium sam przygotuje fikcyjną firmę i token ([więcej](#piaskownica-testowa)).
118
+
119
+ ## Jak to działa
120
+
121
+ **Lista faktur.** Zakładki *Wystawione* / *Otrzymane* (oraz *Jako podmiot 3* / *Jako upoważniony*, jeśli
122
+ włączysz je w profilu) i *Wszystkie* (`←` `→` albo `1`…`5`), wybór faktury `↑` `↓` (także podczas pisania
123
+ w wyszukiwarce), wyszukiwanie pełnotekstowe (`/`) po numerze, kontrahencie, NIP-ie, numerze KSeF i treści
124
+ faktury (polskie znaki nie są wymagane: „uslugi” znajdzie „Usługi”), filtr okresu i kontrahenta.
125
+
126
+ **Podgląd faktury** (`Enter`): `c` kopiuje numer KSeF, `x` zapisuje XML do *Pobrane*, `o` otwiera stronę
127
+ weryfikacji w KSeF, `u` pobiera UPO, `d` wystawia podobną fakturę, `k` tworzy **korektę**, `g` pobiera
128
+ treść faktury, której jeszcze nie ma w bazie.
129
+
130
+ **Synchronizacja.** Faktury są pobierane z KSeF do lokalnej bazy. Synchronizacja rusza sama przy starcie, jeśli
131
+ ostatnia była ponad 15 minut temu, i na żądanie klawiszem `r`. Pobierany jest tylko przyrost od ostatniej
132
+ synchronizacji (KSeF ogranicza liczbę eksportów). Dowolną fakturę ściągniesz też po numerze KSeF (`g` na liście).
133
+
134
+ **Nowa faktura** (`n`):
135
+ 1. Wybierasz kontrahenta i pozycję (z profilu albo z historii wystawionych faktur) i wpisujesz kwotę.
136
+ 2. Podsumowanie pokazuje fakturę dokładnie w takiej postaci, w jakiej trafi do KSeF - po sprawdzeniu
137
+ oficjalnym schematem XSD FA(3) i regułami.
138
+ 3. `e` przenosi do edycji: wiele pozycji z różnymi stawkami (23, 8, 5, 0% kraj/WDT/eksport, zw, np,
139
+ odwrotne obciążenie, marża…), data sprzedaży albo okres, waluta i kurs, nabywca z UE/spoza UE/bez NIP,
140
+ forma płatności, termin albo „zapłacono”, rachunek, adnotacje (MPP, metoda kasowa, samofakturowanie,
141
+ TP), uwagi, numer zamówienia i umowy. Zmiany zapisują się same jako szkic.
142
+ 4. `Ctrl+S` w podsumowaniu wysyła fakturę. Widać kolejne kroki, a na końcu numer KSeF.
143
+ XML i UPO zapisują się w `~/.local/share/ksefik/<środowisko>/<NIP>/wystawione/`.
144
+
145
+ **Korekta** (`k` w podglądzie faktury wystawionej): pozycje startują od stanu sprzed korekty - zmieniasz
146
+ ilości i ceny, aplikacja wysyła wiersze „przed” i „po” oraz różnice kwot (metoda zgodna z FA(3)).
147
+
148
+ **Wysyłka plików XML** (`i`): faktury FA(3) z innego programu - plik, katalog albo wzorzec (`~/faktury/*.xml`).
149
+ Każdy plik jest najpierw sprawdzany schematem XSD; wysyłka w jednej sesji interaktywnej albo jako paczka
150
+ wsadowa (ZIP szyfrowany AES-256, dzielony na części), z opcją trybu offline.
151
+
152
+ **Konto KSeF** (`k` na liście albo `Ctrl+P`):
153
+
154
+ | Sekcja | Co można zrobić |
155
+ | --- | --- |
156
+ | Sesje i UPO | historia sesji interaktywnych i wsadowych, statusy faktur, UPO faktur i UPO zbiorcze sesji |
157
+ | Tokeny KSeF | lista, wygenerowanie tokena z wybranymi uprawnieniami (i użycie go w aplikacji), unieważnienie |
158
+ | Uprawnienia | nadane i obowiązujące, własne, podmiotowe, otrzymane, role, jednostki podrzędne, podmioty unijne; nadawanie (osobie, firmie, podmiotowe, pośrednie, administrator jednostki/podmiotu UE) i odbieranie |
159
+ | Certyfikaty KSeF | limity, lista, wniosek o certyfikat (logowanie albo offline), zapis do pliku, unieważnienie |
160
+ | Sesje logowania | aktywne logowania i ich unieważnianie |
161
+ | Limity | limity sesji, certyfikatów i zapytań API |
162
+ | Identyfikatory zbiorcze | jedna płatność za wiele faktur - lista, faktury, generowanie |
163
+ | Dostawcy Peppol | lista dostawców zarejestrowanych w KSeF |
164
+ | Dane testowe | tylko środowisko testowe: fikcyjne podmioty, osoby, uprawnienia, limity, blokada kontekstu |
165
+
166
+ > [!NOTE]
167
+ > KSeF odrzuca faktury z datą wystawienia w przyszłości. Podsumowanie zablokuje taką wysyłkę i podpowie,
168
+ > by zmienić datę w edycji.
169
+
170
+ Środowisko KSeF podasz w profilu albo przy starcie: `ksefik --env test` (`prod` | `demo` | `test`).
171
+ Paletę poleceń otwiera `Ctrl+P` - są w niej wszystkie funkcje, także zmiana motywu i wylogowanie.
172
+
173
+ ## Profil firmy - `profile.toml`
174
+
175
+ Wszystko, co dotyczy Twojej firmy i Twoich faktur, jest w profilu, a nie w kodzie:
176
+
177
+ - **dane sprzedawcy** (z KRS/REGON/BDO do stopki) i **rachunki bankowe** (także walutowe),
178
+ - **kontrahenci** - z NIP-em, numerem VAT UE, innym identyfikatorem albo bez identyfikatora (osoba prywatna);
179
+ z własnym terminem płatności, walutą, domyślną pozycją i podmiotami trzecimi (np. odbiorca dla JST),
180
+ - **katalog pozycji** - nazwa, jednostka, stawka VAT, cena, GTU, PKWiU, CN, załącznik nr 15,
181
+ - **numeracja** według wzoru (`FV/{nr}/{mm}/{rrrr}`, `{nr}/{m}/{rrrr}`, `FV/{rrrr}/{nr:4}`…) - licznik
182
+ miesięczny, roczny albo ciągły, osobna seria dla korekt,
183
+ - **daty** nowej faktury (dzisiaj / koniec miesiąca / dzisiaj za poprzedni miesiąc), termin i forma płatności,
184
+ waluta, MPP, metoda kasowa, podstawa zwolnienia, procedura marży, stopka,
185
+ - **logowanie** - token albo certyfikat, kontekst (NIP, identyfikator wewnętrzny, NIP-VAT UE, Peppol),
186
+ dozwolone adresy IP,
187
+ - **synchronizacja** - od kiedy i które faktury: wystawione, otrzymane, jako podmiot 3, jako upoważniony.
188
+
189
+ Opis wszystkich pól z przykładami: [`profile.example.toml`](profile.example.toml). Profil edytujesz
190
+ w dowolnym edytorze (`make profile`, w aplikacji `Ctrl+P` → „Edytuj profil”). Błędy - np. literówkę
191
+ w nazwie pola albo zły NIP - aplikacja opisze wprost i podpowie poprawną nazwę. Nowych kontrahentów
192
+ i pozycje możesz też zapisywać do profilu prosto z edycji faktury.
193
+
194
+ **Kilka firm:** każda ma własny profil - `ksefik --profile ~/firmy/druga.toml` (albo zmienna
195
+ `KSEFIK_PROFILE`). Baza faktur i tokeny są osobne dla każdej firmy i środowiska
196
+ (`~/.local/share/ksefik/<środowisko>/<NIP>/`).
197
+
198
+ ### Logowanie certyfikatem
199
+
200
+ Zamiast tokena możesz logować się podpisem XAdES: certyfikatem KSeF, kwalifikowaną pieczęcią firmy albo
201
+ podpisem kwalifikowanym w plikach PEM/DER lub `.p12`:
202
+
203
+ ```toml
204
+ [logowanie]
205
+ metoda = "certyfikat"
206
+ certyfikat = "~/.config/ksefik/certyfikaty/laptop.pem"
207
+ klucz = "~/.config/ksefik/certyfikaty/laptop.klucz.pem"
208
+ ```
209
+
210
+ Obsługiwane są klucze RSA i EC (P-256). Hasło do klucza nie jest zapisywane - aplikacja zapyta o nie
211
+ (albo ustaw `KSEF_KEY_PASSWORD`). Certyfikat KSeF możesz wygenerować w samej aplikacji: Konto KSeF →
212
+ Certyfikaty KSeF → `n` (wymaga zalogowania podpisem; klucz powstaje lokalnie).
213
+
214
+ ### Zmienne środowiskowe
215
+
216
+ | Zmienna | Znaczenie |
217
+ | --- | --- |
218
+ | `KSEFIK_PROFILE` | ścieżka profilu (zamiast `~/.config/ksefik/profile.toml`) |
219
+ | `KSEF_TOKEN` | token KSeF - ma pierwszeństwo przed zapisanym |
220
+ | `KSEF_KEY_PASSWORD` | hasło do klucza prywatnego przy logowaniu certyfikatem |
221
+ | `VISUAL`, `EDITOR` | edytor profilu (domyślnie `nano`) |
222
+ | `XDG_CONFIG_HOME`, `XDG_DATA_HOME` | położenie konfiguracji i danych |
223
+
224
+ ## Bezpieczeństwo i prywatność
225
+
226
+ - ksefik nie ma żadnego serwera ani telemetrii. Łączy się wyłącznie z API KSeF (`api*.ksef.mf.gov.pl`) i - gdy
227
+ naciśniesz „Pobierz dane” - z Białą listą VAT (`wl-api.mf.gov.pl`).
228
+ - Token KSeF jest w systemowym pęku kluczy (Secret Service / Keychain). Hasła do kluczy prywatnych nie są zapisywane.
229
+ - Faktury, XML i UPO leżą lokalnie w `~/.local/share/ksefik/`.
230
+ - Lukę bezpieczeństwa zgłoś prywatnie - zobacz [SECURITY.md](SECURITY.md).
231
+
232
+ ## Rozwój
233
+
234
+ ```bash
235
+ make install # zależności (uv)
236
+ make test # testy jednostkowe i interfejsu, bez sieci (~30 s, równolegle)
237
+ make check # lint (ruff) + testy z kontrolą pokrycia (minimum 90%)
238
+ make format # formatowanie kodu
239
+ make # wszystkie komendy
240
+ ```
241
+
242
+ Około 700 testów działa bez sieci: logika faktur i XML, klient API na udawanym transporcie oraz **testy interfejsu**,
243
+ które sterują prawdziwą aplikacją Textual (klawisze, formularze, układ w 80×24). Pokrycie linii i gałęzi
244
+ musi wynosić co najmniej 90% - inaczej CI nie przejdzie.
245
+
246
+ ### Testy end-to-end z testowym KSeF
247
+
248
+ ```bash
249
+ make run-integration-test # cały zestaw, ok. 4 minut
250
+ make run-integration-test ARGS="-k test_06" # wybrane testy (argumenty pytest)
251
+ ```
252
+
253
+ Testy sterują prawdziwą aplikacją, a backendem jest publiczne środowisko testowe KSeF. Każde uruchomienie tworzy
254
+ nowe, fikcyjne firmy (losowe NIP-y z samopodpisaną pieczęcią - KSeF akceptuje takie certyfikaty tylko na
255
+ środowisku testowym). Testy działają w osobnym katalogu tymczasowym z wyłączonym pękiem kluczy - nie dotykają
256
+ Twojego profilu, bazy ani tokenów. Każdy wynik jest sprawdzany także po stronie KSeF. W GitHub Actions te testy
257
+ działają co noc i na żądanie (odznaka „Testy z KSeF”).
258
+
259
+ Zakres: kreator i logowanie (token, certyfikat z hasłem, wylogowanie), wystawianie (szybka faktura, edytor
260
+ z wieloma stawkami, UE/spoza UE/konsument/JST, waluty z kursem, korekta, kopia, UPO, XML), synchronizacja
261
+ (wystawione, otrzymane, podmiot 3) z wyszukiwaniem i filtrami, pobieranie po numerze KSeF, wysyłka plików XML
262
+ (interaktywna i wsadowa, offline), sesje i UPO, tokeny, sesje logowania, limity, Peppol, identyfikatory
263
+ zbiorcze, wszystkie rodzaje uprawnień, certyfikaty KSeF, dane testowe, edycja profilu i dokończenie wysyłki
264
+ po ponownym uruchomieniu.
265
+
266
+ ### Piaskownica testowa
267
+
268
+ Na środowisko testowe KSeF nie wysyła się prawdziwych danych, dlatego służy do tego osobna piaskownica
269
+ (domyślnie `~/.ksef-test`, zmienisz to przez `TEST_HOME=…`):
270
+
271
+ ```bash
272
+ make run-test-env # za pierwszym razem: fikcyjny NIP, token i profil, potem start aplikacji
273
+ make test-env-clean # usunięcie piaskownicy (np. żeby zacząć od nowego NIP-u)
274
+ ```
275
+
276
+ ### Architektura
277
+
278
+ | Moduł | Odpowiedzialność |
279
+ | --- | --- |
280
+ | `client.py` | asynchroniczny klient całego API KSeF 2.0 (`httpx`) |
281
+ | `xades.py`, `crypto.py` | podpis XAdES, wnioski CSR, szyfrowanie AES/RSA-OAEP |
282
+ | `invoice.py`, `money.py`, `codes.py` | model faktury, kwoty i stawki, budowa XML FA(3) |
283
+ | `fa_parser.py` | odczyt faktur FA(2)/FA(3) |
284
+ | `profile.py` | profil użytkownika (TOML) z walidacją i podpowiedziami |
285
+ | `store.py`, `sync.py` | lokalna baza SQLite z wyszukiwaniem FTS5, przyrostowa synchronizacja |
286
+ | `submissions.py`, `drafts.py` | wysyłka z odzyskiwaniem po przerwaniu, szkice |
287
+ | `registry.py` | Biała lista VAT (dane firmy po NIP) |
288
+ | `ui/` | ekrany [Textual](https://textual.textualize.io/) |
289
+
290
+ Zrzuty ekranów w tym README generuje `make docs-screens` - z fikcyjnymi danymi i udawanym KSeF.
291
+
292
+ ## Współtworzenie
293
+
294
+ Zgłoszenia błędów, pomysły i pull requesty są mile widziane! Zacznij od [CONTRIBUTING.md](CONTRIBUTING.md).
295
+ Jeśli ksefik Ci się przydaje, zostaw ⭐ - to pomaga innym go znaleźć.
296
+
297
+ ## Zastrzeżenia
298
+
299
+ ksefik jest niezależnym projektem open source i nie jest powiązany z Ministerstwem Finansów ani Krajową
300
+ Administracją Skarbową. Oprogramowanie jest dostarczane „tak jak jest”, bez gwarancji (zob. [licencja](LICENSE)).
301
+ Za treść i wysyłkę faktur odpowiada podatnik - przed pierwszym użyciem na produkcji wypróbuj aplikację
302
+ na środowisku testowym KSeF.
303
+
304
+ ## Licencja
305
+
306
+ [MIT](LICENSE) © Paweł Borkowski
ksefik-0.2.0/README.md ADDED
@@ -0,0 +1,271 @@
1
+ <div align="center">
2
+
3
+ # ksefik
4
+
5
+ **Krajowy System e-Faktur w terminalu.**<br>
6
+ Przeglądaj, wystawiaj i wysyłaj faktury FA(3) do KSeF 2.0 - szybko, z klawiatury, bez przeglądarki.
7
+
8
+ [![CI](https://github.com/gacopys/ksefik/actions/workflows/ci.yml/badge.svg)](https://github.com/gacopys/ksefik/actions/workflows/ci.yml)
9
+ [![Testy z KSeF](https://github.com/gacopys/ksefik/actions/workflows/e2e.yml/badge.svg)](https://github.com/gacopys/ksefik/actions/workflows/e2e.yml)
10
+ [![Pokrycie kodu](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/gacopys/ksefik/python-coverage-comment-action-data/endpoint.json)](https://htmlpreview.github.io/?https://github.com/gacopys/ksefik/blob/python-coverage-comment-action-data/htmlcov/index.html)
11
+ [![CodeQL](https://github.com/gacopys/ksefik/actions/workflows/codeql.yml/badge.svg)](https://github.com/gacopys/ksefik/actions/workflows/codeql.yml)
12
+ <br>
13
+ [![PyPI](https://img.shields.io/pypi/v/ksefik?color=blue)](https://pypi.org/project/ksefik/)
14
+ [![Python](https://img.shields.io/badge/python-3.12%20%7C%203.13%20%7C%203.14-blue?logo=python&logoColor=white)](https://www.python.org/)
15
+ [![KSeF 2.0](https://img.shields.io/badge/KSeF-2.0%20%C2%B7%20FA(3)-d4213d)](https://ksef.podatki.gov.pl/)
16
+ [![Licencja MIT](https://img.shields.io/badge/licencja-MIT-green)](LICENSE)
17
+ [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
18
+ [![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)
19
+ [![Textual](https://img.shields.io/badge/UI-Textual-8a2be2)](https://textual.textualize.io/)
20
+
21
+ <img src="https://raw.githubusercontent.com/gacopys/ksefik/main/docs/screenshots/lista.png" alt="Lista faktur w ksefik" width="820">
22
+
23
+ </div>
24
+
25
+ ---
26
+
27
+ ## Dlaczego ksefik?
28
+
29
+ - ⚡ **Szybko.** Faktury są w lokalnej bazie SQLite z wyszukiwaniem pełnotekstowym - lista i szukanie działają
30
+ natychmiast, także offline. Nowa faktura dla stałego kontrahenta to kilka klawiszy.
31
+ - ✅ **Bezpiecznie.** Każda faktura przed wysyłką jest sprawdzana oficjalnym schematem XSD FA(3) i regułami
32
+ biznesowymi (NIP, daty, kurs waluty, MPP, zwolnienia, duplikaty numerów). Widzisz ją dokładnie w takiej
33
+ postaci, w jakiej trafi do KSeF.
34
+ - 🧾 **Kompletnie.** Faktury krajowe, UE i eksport, waluty obce, wiele stawek VAT, korekty, MPP, metoda kasowa,
35
+ JST i podmioty trzecie, wysyłka gotowych plików XML (także wsadowa i offline), UPO.
36
+ - 🔐 **Całe konto KSeF.** Tokeny, uprawnienia, certyfikaty KSeF, sesje, limity, identyfikatory zbiorcze, Peppol -
37
+ wszystko, co zwykle wymaga Aplikacji Podatnika.
38
+ - 🏠 **Twoje dane zostają u Ciebie.** Brak serwera pośredniczącego i telemetrii. Aplikacja łączy się tylko z API KSeF
39
+ Ministerstwa Finansów (i na Twoje żądanie z Białą listą VAT). Token trafia do systemowego pęku kluczy.
40
+ - 🏢 **Wiele firm.** Osobny profil, baza i token dla każdej firmy i środowiska (produkcja, demo, test).
41
+
42
+ <table>
43
+ <tr>
44
+ <td width="50%"><img src="https://raw.githubusercontent.com/gacopys/ksefik/main/docs/screenshots/podsumowanie.png" alt="Podsumowanie faktury przed wysyłką"><br><sub><b>Podsumowanie przed wysyłką</b> - faktura sprawdzona schematem FA(3)</sub></td>
45
+ <td width="50%"><img src="https://raw.githubusercontent.com/gacopys/ksefik/main/docs/screenshots/faktura.png" alt="Podgląd faktury"><br><sub><b>Podgląd faktury</b> - UPO, XML, korekta, wystaw podobną</sub></td>
46
+ </tr>
47
+ <tr>
48
+ <td><img src="https://raw.githubusercontent.com/gacopys/ksefik/main/docs/screenshots/kreator-nip.png" alt="Kreator profilu z pobieraniem danych po NIP"><br><sub><b>Kreator</b> - dane firmy pobrane po NIP z Białej listy VAT</sub></td>
49
+ <td><img src="https://raw.githubusercontent.com/gacopys/ksefik/main/docs/screenshots/konto.png" alt="Konto KSeF"><br><sub><b>Konto KSeF</b> - tokeny, uprawnienia, certyfikaty, limity</sub></td>
50
+ </tr>
51
+ </table>
52
+
53
+ ## Instalacja
54
+
55
+ Potrzebujesz Pythona 3.12+. ksefik jest rozwijany i testowany na Linuksie; macOS powinien działać, Windows
56
+ na razie nie jest wspierany. Najprościej przez [uv](https://docs.astral.sh/uv/):
57
+
58
+ ```bash
59
+ uv tool install ksefik # albo: pipx install ksefik
60
+ ksefik
61
+ ```
62
+
63
+ Bez instalacji: `uvx ksefik`. Wersja rozwojowa prosto z repozytorium:
64
+
65
+ ```bash
66
+ git clone https://github.com/gacopys/ksefik.git && cd ksefik
67
+ make run # to samo co: uv run ksefik
68
+ ```
69
+
70
+ ## Pierwsze uruchomienie
71
+
72
+ 1. **Kreator** zapyta o dane firmy (NIP, nazwa, adres, rachunek, numeracja) i zapisze je w profilu
73
+ `~/.config/ksefik/profile.toml`. Przycisk „Pobierz dane” obok NIP-u uzupełni nazwę i adres z wykazu podatników
74
+ VAT (Biała lista MF; bez klucza, limit ok. 100 zapytań dziennie).
75
+ 2. **Token KSeF** wygenerujesz w [Aplikacji Podatnika KSeF](https://ksef.podatki.gov.pl/). Token trafia do
76
+ systemowego pęku kluczy, a gdy go nie ma - do pliku `~/.config/ksefik/token-…` z prawami `0600`.
77
+ Zamiast tokena możesz [logować się certyfikatem](#logowanie-certyfikatem).
78
+ 3. Gotowe - faktury zsynchronizują się same.
79
+
80
+ > [!TIP]
81
+ > Chcesz najpierw spróbować bez prawdziwych danych? `ksefik --env test` łączy się ze środowiskiem testowym KSeF,
82
+ > a `make run-test-env` w repozytorium sam przygotuje fikcyjną firmę i token ([więcej](#piaskownica-testowa)).
83
+
84
+ ## Jak to działa
85
+
86
+ **Lista faktur.** Zakładki *Wystawione* / *Otrzymane* (oraz *Jako podmiot 3* / *Jako upoważniony*, jeśli
87
+ włączysz je w profilu) i *Wszystkie* (`←` `→` albo `1`…`5`), wybór faktury `↑` `↓` (także podczas pisania
88
+ w wyszukiwarce), wyszukiwanie pełnotekstowe (`/`) po numerze, kontrahencie, NIP-ie, numerze KSeF i treści
89
+ faktury (polskie znaki nie są wymagane: „uslugi” znajdzie „Usługi”), filtr okresu i kontrahenta.
90
+
91
+ **Podgląd faktury** (`Enter`): `c` kopiuje numer KSeF, `x` zapisuje XML do *Pobrane*, `o` otwiera stronę
92
+ weryfikacji w KSeF, `u` pobiera UPO, `d` wystawia podobną fakturę, `k` tworzy **korektę**, `g` pobiera
93
+ treść faktury, której jeszcze nie ma w bazie.
94
+
95
+ **Synchronizacja.** Faktury są pobierane z KSeF do lokalnej bazy. Synchronizacja rusza sama przy starcie, jeśli
96
+ ostatnia była ponad 15 minut temu, i na żądanie klawiszem `r`. Pobierany jest tylko przyrost od ostatniej
97
+ synchronizacji (KSeF ogranicza liczbę eksportów). Dowolną fakturę ściągniesz też po numerze KSeF (`g` na liście).
98
+
99
+ **Nowa faktura** (`n`):
100
+ 1. Wybierasz kontrahenta i pozycję (z profilu albo z historii wystawionych faktur) i wpisujesz kwotę.
101
+ 2. Podsumowanie pokazuje fakturę dokładnie w takiej postaci, w jakiej trafi do KSeF - po sprawdzeniu
102
+ oficjalnym schematem XSD FA(3) i regułami.
103
+ 3. `e` przenosi do edycji: wiele pozycji z różnymi stawkami (23, 8, 5, 0% kraj/WDT/eksport, zw, np,
104
+ odwrotne obciążenie, marża…), data sprzedaży albo okres, waluta i kurs, nabywca z UE/spoza UE/bez NIP,
105
+ forma płatności, termin albo „zapłacono”, rachunek, adnotacje (MPP, metoda kasowa, samofakturowanie,
106
+ TP), uwagi, numer zamówienia i umowy. Zmiany zapisują się same jako szkic.
107
+ 4. `Ctrl+S` w podsumowaniu wysyła fakturę. Widać kolejne kroki, a na końcu numer KSeF.
108
+ XML i UPO zapisują się w `~/.local/share/ksefik/<środowisko>/<NIP>/wystawione/`.
109
+
110
+ **Korekta** (`k` w podglądzie faktury wystawionej): pozycje startują od stanu sprzed korekty - zmieniasz
111
+ ilości i ceny, aplikacja wysyła wiersze „przed” i „po” oraz różnice kwot (metoda zgodna z FA(3)).
112
+
113
+ **Wysyłka plików XML** (`i`): faktury FA(3) z innego programu - plik, katalog albo wzorzec (`~/faktury/*.xml`).
114
+ Każdy plik jest najpierw sprawdzany schematem XSD; wysyłka w jednej sesji interaktywnej albo jako paczka
115
+ wsadowa (ZIP szyfrowany AES-256, dzielony na części), z opcją trybu offline.
116
+
117
+ **Konto KSeF** (`k` na liście albo `Ctrl+P`):
118
+
119
+ | Sekcja | Co można zrobić |
120
+ | --- | --- |
121
+ | Sesje i UPO | historia sesji interaktywnych i wsadowych, statusy faktur, UPO faktur i UPO zbiorcze sesji |
122
+ | Tokeny KSeF | lista, wygenerowanie tokena z wybranymi uprawnieniami (i użycie go w aplikacji), unieważnienie |
123
+ | Uprawnienia | nadane i obowiązujące, własne, podmiotowe, otrzymane, role, jednostki podrzędne, podmioty unijne; nadawanie (osobie, firmie, podmiotowe, pośrednie, administrator jednostki/podmiotu UE) i odbieranie |
124
+ | Certyfikaty KSeF | limity, lista, wniosek o certyfikat (logowanie albo offline), zapis do pliku, unieważnienie |
125
+ | Sesje logowania | aktywne logowania i ich unieważnianie |
126
+ | Limity | limity sesji, certyfikatów i zapytań API |
127
+ | Identyfikatory zbiorcze | jedna płatność za wiele faktur - lista, faktury, generowanie |
128
+ | Dostawcy Peppol | lista dostawców zarejestrowanych w KSeF |
129
+ | Dane testowe | tylko środowisko testowe: fikcyjne podmioty, osoby, uprawnienia, limity, blokada kontekstu |
130
+
131
+ > [!NOTE]
132
+ > KSeF odrzuca faktury z datą wystawienia w przyszłości. Podsumowanie zablokuje taką wysyłkę i podpowie,
133
+ > by zmienić datę w edycji.
134
+
135
+ Środowisko KSeF podasz w profilu albo przy starcie: `ksefik --env test` (`prod` | `demo` | `test`).
136
+ Paletę poleceń otwiera `Ctrl+P` - są w niej wszystkie funkcje, także zmiana motywu i wylogowanie.
137
+
138
+ ## Profil firmy - `profile.toml`
139
+
140
+ Wszystko, co dotyczy Twojej firmy i Twoich faktur, jest w profilu, a nie w kodzie:
141
+
142
+ - **dane sprzedawcy** (z KRS/REGON/BDO do stopki) i **rachunki bankowe** (także walutowe),
143
+ - **kontrahenci** - z NIP-em, numerem VAT UE, innym identyfikatorem albo bez identyfikatora (osoba prywatna);
144
+ z własnym terminem płatności, walutą, domyślną pozycją i podmiotami trzecimi (np. odbiorca dla JST),
145
+ - **katalog pozycji** - nazwa, jednostka, stawka VAT, cena, GTU, PKWiU, CN, załącznik nr 15,
146
+ - **numeracja** według wzoru (`FV/{nr}/{mm}/{rrrr}`, `{nr}/{m}/{rrrr}`, `FV/{rrrr}/{nr:4}`…) - licznik
147
+ miesięczny, roczny albo ciągły, osobna seria dla korekt,
148
+ - **daty** nowej faktury (dzisiaj / koniec miesiąca / dzisiaj za poprzedni miesiąc), termin i forma płatności,
149
+ waluta, MPP, metoda kasowa, podstawa zwolnienia, procedura marży, stopka,
150
+ - **logowanie** - token albo certyfikat, kontekst (NIP, identyfikator wewnętrzny, NIP-VAT UE, Peppol),
151
+ dozwolone adresy IP,
152
+ - **synchronizacja** - od kiedy i które faktury: wystawione, otrzymane, jako podmiot 3, jako upoważniony.
153
+
154
+ Opis wszystkich pól z przykładami: [`profile.example.toml`](profile.example.toml). Profil edytujesz
155
+ w dowolnym edytorze (`make profile`, w aplikacji `Ctrl+P` → „Edytuj profil”). Błędy - np. literówkę
156
+ w nazwie pola albo zły NIP - aplikacja opisze wprost i podpowie poprawną nazwę. Nowych kontrahentów
157
+ i pozycje możesz też zapisywać do profilu prosto z edycji faktury.
158
+
159
+ **Kilka firm:** każda ma własny profil - `ksefik --profile ~/firmy/druga.toml` (albo zmienna
160
+ `KSEFIK_PROFILE`). Baza faktur i tokeny są osobne dla każdej firmy i środowiska
161
+ (`~/.local/share/ksefik/<środowisko>/<NIP>/`).
162
+
163
+ ### Logowanie certyfikatem
164
+
165
+ Zamiast tokena możesz logować się podpisem XAdES: certyfikatem KSeF, kwalifikowaną pieczęcią firmy albo
166
+ podpisem kwalifikowanym w plikach PEM/DER lub `.p12`:
167
+
168
+ ```toml
169
+ [logowanie]
170
+ metoda = "certyfikat"
171
+ certyfikat = "~/.config/ksefik/certyfikaty/laptop.pem"
172
+ klucz = "~/.config/ksefik/certyfikaty/laptop.klucz.pem"
173
+ ```
174
+
175
+ Obsługiwane są klucze RSA i EC (P-256). Hasło do klucza nie jest zapisywane - aplikacja zapyta o nie
176
+ (albo ustaw `KSEF_KEY_PASSWORD`). Certyfikat KSeF możesz wygenerować w samej aplikacji: Konto KSeF →
177
+ Certyfikaty KSeF → `n` (wymaga zalogowania podpisem; klucz powstaje lokalnie).
178
+
179
+ ### Zmienne środowiskowe
180
+
181
+ | Zmienna | Znaczenie |
182
+ | --- | --- |
183
+ | `KSEFIK_PROFILE` | ścieżka profilu (zamiast `~/.config/ksefik/profile.toml`) |
184
+ | `KSEF_TOKEN` | token KSeF - ma pierwszeństwo przed zapisanym |
185
+ | `KSEF_KEY_PASSWORD` | hasło do klucza prywatnego przy logowaniu certyfikatem |
186
+ | `VISUAL`, `EDITOR` | edytor profilu (domyślnie `nano`) |
187
+ | `XDG_CONFIG_HOME`, `XDG_DATA_HOME` | położenie konfiguracji i danych |
188
+
189
+ ## Bezpieczeństwo i prywatność
190
+
191
+ - ksefik nie ma żadnego serwera ani telemetrii. Łączy się wyłącznie z API KSeF (`api*.ksef.mf.gov.pl`) i - gdy
192
+ naciśniesz „Pobierz dane” - z Białą listą VAT (`wl-api.mf.gov.pl`).
193
+ - Token KSeF jest w systemowym pęku kluczy (Secret Service / Keychain). Hasła do kluczy prywatnych nie są zapisywane.
194
+ - Faktury, XML i UPO leżą lokalnie w `~/.local/share/ksefik/`.
195
+ - Lukę bezpieczeństwa zgłoś prywatnie - zobacz [SECURITY.md](SECURITY.md).
196
+
197
+ ## Rozwój
198
+
199
+ ```bash
200
+ make install # zależności (uv)
201
+ make test # testy jednostkowe i interfejsu, bez sieci (~30 s, równolegle)
202
+ make check # lint (ruff) + testy z kontrolą pokrycia (minimum 90%)
203
+ make format # formatowanie kodu
204
+ make # wszystkie komendy
205
+ ```
206
+
207
+ Około 700 testów działa bez sieci: logika faktur i XML, klient API na udawanym transporcie oraz **testy interfejsu**,
208
+ które sterują prawdziwą aplikacją Textual (klawisze, formularze, układ w 80×24). Pokrycie linii i gałęzi
209
+ musi wynosić co najmniej 90% - inaczej CI nie przejdzie.
210
+
211
+ ### Testy end-to-end z testowym KSeF
212
+
213
+ ```bash
214
+ make run-integration-test # cały zestaw, ok. 4 minut
215
+ make run-integration-test ARGS="-k test_06" # wybrane testy (argumenty pytest)
216
+ ```
217
+
218
+ Testy sterują prawdziwą aplikacją, a backendem jest publiczne środowisko testowe KSeF. Każde uruchomienie tworzy
219
+ nowe, fikcyjne firmy (losowe NIP-y z samopodpisaną pieczęcią - KSeF akceptuje takie certyfikaty tylko na
220
+ środowisku testowym). Testy działają w osobnym katalogu tymczasowym z wyłączonym pękiem kluczy - nie dotykają
221
+ Twojego profilu, bazy ani tokenów. Każdy wynik jest sprawdzany także po stronie KSeF. W GitHub Actions te testy
222
+ działają co noc i na żądanie (odznaka „Testy z KSeF”).
223
+
224
+ Zakres: kreator i logowanie (token, certyfikat z hasłem, wylogowanie), wystawianie (szybka faktura, edytor
225
+ z wieloma stawkami, UE/spoza UE/konsument/JST, waluty z kursem, korekta, kopia, UPO, XML), synchronizacja
226
+ (wystawione, otrzymane, podmiot 3) z wyszukiwaniem i filtrami, pobieranie po numerze KSeF, wysyłka plików XML
227
+ (interaktywna i wsadowa, offline), sesje i UPO, tokeny, sesje logowania, limity, Peppol, identyfikatory
228
+ zbiorcze, wszystkie rodzaje uprawnień, certyfikaty KSeF, dane testowe, edycja profilu i dokończenie wysyłki
229
+ po ponownym uruchomieniu.
230
+
231
+ ### Piaskownica testowa
232
+
233
+ Na środowisko testowe KSeF nie wysyła się prawdziwych danych, dlatego służy do tego osobna piaskownica
234
+ (domyślnie `~/.ksef-test`, zmienisz to przez `TEST_HOME=…`):
235
+
236
+ ```bash
237
+ make run-test-env # za pierwszym razem: fikcyjny NIP, token i profil, potem start aplikacji
238
+ make test-env-clean # usunięcie piaskownicy (np. żeby zacząć od nowego NIP-u)
239
+ ```
240
+
241
+ ### Architektura
242
+
243
+ | Moduł | Odpowiedzialność |
244
+ | --- | --- |
245
+ | `client.py` | asynchroniczny klient całego API KSeF 2.0 (`httpx`) |
246
+ | `xades.py`, `crypto.py` | podpis XAdES, wnioski CSR, szyfrowanie AES/RSA-OAEP |
247
+ | `invoice.py`, `money.py`, `codes.py` | model faktury, kwoty i stawki, budowa XML FA(3) |
248
+ | `fa_parser.py` | odczyt faktur FA(2)/FA(3) |
249
+ | `profile.py` | profil użytkownika (TOML) z walidacją i podpowiedziami |
250
+ | `store.py`, `sync.py` | lokalna baza SQLite z wyszukiwaniem FTS5, przyrostowa synchronizacja |
251
+ | `submissions.py`, `drafts.py` | wysyłka z odzyskiwaniem po przerwaniu, szkice |
252
+ | `registry.py` | Biała lista VAT (dane firmy po NIP) |
253
+ | `ui/` | ekrany [Textual](https://textual.textualize.io/) |
254
+
255
+ Zrzuty ekranów w tym README generuje `make docs-screens` - z fikcyjnymi danymi i udawanym KSeF.
256
+
257
+ ## Współtworzenie
258
+
259
+ Zgłoszenia błędów, pomysły i pull requesty są mile widziane! Zacznij od [CONTRIBUTING.md](CONTRIBUTING.md).
260
+ Jeśli ksefik Ci się przydaje, zostaw ⭐ - to pomaga innym go znaleźć.
261
+
262
+ ## Zastrzeżenia
263
+
264
+ ksefik jest niezależnym projektem open source i nie jest powiązany z Ministerstwem Finansów ani Krajową
265
+ Administracją Skarbową. Oprogramowanie jest dostarczane „tak jak jest”, bez gwarancji (zob. [licencja](LICENSE)).
266
+ Za treść i wysyłkę faktur odpowiada podatnik - przed pierwszym użyciem na produkcji wypróbuj aplikację
267
+ na środowisku testowym KSeF.
268
+
269
+ ## Licencja
270
+
271
+ [MIT](LICENSE) © Paweł Borkowski