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.
- ksefik-0.2.0/LICENSE +21 -0
- ksefik-0.2.0/PKG-INFO +306 -0
- ksefik-0.2.0/README.md +271 -0
- ksefik-0.2.0/pyproject.toml +97 -0
- ksefik-0.2.0/pyproject.toml.orig +76 -0
- ksefik-0.2.0/src/ksefik/__init__.py +36 -0
- ksefik-0.2.0/src/ksefik/client.py +1361 -0
- ksefik-0.2.0/src/ksefik/codes.py +291 -0
- ksefik-0.2.0/src/ksefik/config.py +68 -0
- ksefik-0.2.0/src/ksefik/crypto.py +55 -0
- ksefik-0.2.0/src/ksefik/drafts.py +58 -0
- ksefik-0.2.0/src/ksefik/fa_parser.py +492 -0
- ksefik-0.2.0/src/ksefik/invoice.py +755 -0
- ksefik-0.2.0/src/ksefik/money.py +92 -0
- ksefik-0.2.0/src/ksefik/profile.py +692 -0
- ksefik-0.2.0/src/ksefik/py.typed +0 -0
- ksefik-0.2.0/src/ksefik/registry.py +108 -0
- ksefik-0.2.0/src/ksefik/schemas/ElementarneTypyDanych_v10-0E.xsd +1 -0
- ksefik-0.2.0/src/ksefik/schemas/KodyKrajow_v10-0E.xsd +1283 -0
- ksefik-0.2.0/src/ksefik/schemas/StrukturyDanych_v10-0E.xsd +1 -0
- ksefik-0.2.0/src/ksefik/schemas/schemat_FA3_v1-0E.xsd +3950 -0
- ksefik-0.2.0/src/ksefik/store.py +576 -0
- ksefik-0.2.0/src/ksefik/submissions.py +254 -0
- ksefik-0.2.0/src/ksefik/sync.py +139 -0
- ksefik-0.2.0/src/ksefik/tokenstore.py +82 -0
- ksefik-0.2.0/src/ksefik/ui/__init__.py +0 -0
- ksefik-0.2.0/src/ksefik/ui/account.py +1119 -0
- ksefik-0.2.0/src/ksefik/ui/app.py +969 -0
- ksefik-0.2.0/src/ksefik/ui/app.tcss +716 -0
- ksefik-0.2.0/src/ksefik/ui/certificates.py +344 -0
- ksefik-0.2.0/src/ksefik/ui/common.py +1030 -0
- ksefik-0.2.0/src/ksefik/ui/editor.py +1165 -0
- ksefik-0.2.0/src/ksefik/ui/import_screen.py +724 -0
- ksefik-0.2.0/src/ksefik/ui/invoice_screens.py +997 -0
- ksefik-0.2.0/src/ksefik/ui/main_screen.py +900 -0
- ksefik-0.2.0/src/ksefik/ui/permissions.py +762 -0
- ksefik-0.2.0/src/ksefik/ui/sent_screen.py +249 -0
- ksefik-0.2.0/src/ksefik/ui/setup_screen.py +319 -0
- ksefik-0.2.0/src/ksefik/ui/widgets.py +213 -0
- 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
|
+
[](https://github.com/gacopys/ksefik/actions/workflows/ci.yml)
|
|
44
|
+
[](https://github.com/gacopys/ksefik/actions/workflows/e2e.yml)
|
|
45
|
+
[](https://htmlpreview.github.io/?https://github.com/gacopys/ksefik/blob/python-coverage-comment-action-data/htmlcov/index.html)
|
|
46
|
+
[](https://github.com/gacopys/ksefik/actions/workflows/codeql.yml)
|
|
47
|
+
<br>
|
|
48
|
+
[](https://pypi.org/project/ksefik/)
|
|
49
|
+
[](https://www.python.org/)
|
|
50
|
+
[-d4213d)](https://ksef.podatki.gov.pl/)
|
|
51
|
+
[](LICENSE)
|
|
52
|
+
[](https://github.com/astral-sh/ruff)
|
|
53
|
+
[](https://github.com/astral-sh/uv)
|
|
54
|
+
[](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
|
+
[](https://github.com/gacopys/ksefik/actions/workflows/ci.yml)
|
|
9
|
+
[](https://github.com/gacopys/ksefik/actions/workflows/e2e.yml)
|
|
10
|
+
[](https://htmlpreview.github.io/?https://github.com/gacopys/ksefik/blob/python-coverage-comment-action-data/htmlcov/index.html)
|
|
11
|
+
[](https://github.com/gacopys/ksefik/actions/workflows/codeql.yml)
|
|
12
|
+
<br>
|
|
13
|
+
[](https://pypi.org/project/ksefik/)
|
|
14
|
+
[](https://www.python.org/)
|
|
15
|
+
[-d4213d)](https://ksef.podatki.gov.pl/)
|
|
16
|
+
[](LICENSE)
|
|
17
|
+
[](https://github.com/astral-sh/ruff)
|
|
18
|
+
[](https://github.com/astral-sh/uv)
|
|
19
|
+
[](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
|