CLI tool for generating, managing, and downloading KSeF (Polish National e-Invoice System) invoices
Project description
KSeF CLI - Generator Faktur
Aplikacja CLI do generacji i zarządzania fakturami w formacie KSeF (Krajowy System e-Faktur) zgodnie ze schematem FA (3) wersja 1-0E. Obsługuje tworzenie faktur, pobieranie z API KSeF oraz wizualizację do PDF.
Instalacja
Z PyPI (rekomendowane)
pip install ksef-cli
Instalacja dla deweloperów
git clone https://github.com/krzysbaranski/ksef-cli.git
cd ksef-cli
poetry install
Spis komend
POBIERANIE Z API KSeF:
list-invoices— Pobierz listę faktur z filtramiget-invoice— Pobierz konkretną fakturę XML
GENEROWANIE FAKTUR:
interactive— Wygeneruj XML interaktywnie (pytania)
WALIDACJA I WIZUALIZACJA:
validate— Waliduj plik XML KSeFvisualize— Konwertuj XML na PDF
Użycie
Pobieranie listy faktur z KSeF
Pobierz faktury z API KSeF przy użyciu tokenu autoryzacyjnego:
ksef-cli list-invoices \
-n 1234567890 \
-t <token> \
--date-from "2026-01-01T00:00:00.000Z" \
--date-to "2026-12-31T23:59:59.999Z"
Opcje filtrowania
# Jako nabywca (zamiast sprzedawcy)
ksef-cli list-invoices -n 1234567890 -t <token> \
--date-from "2026-01-01T00:00:00.000Z" \
--date-to "2026-12-31T23:59:59.999Z" \
--subject-type Subject2
# Filtr po kwocie (brutto)
ksef-cli list-invoices -n 1234567890 -t <token> \
--date-from "2026-01-01T00:00:00.000Z" \
--date-to "2026-12-31T23:59:59.999Z" \
--amount-type Brutto --amount-from 100 --amount-to 1000
# Filtr po walucie (można podać wiele)
ksef-cli list-invoices -n 1234567890 -t <token> \
--date-from "2026-01-01T00:00:00.000Z" \
--date-to "2026-12-31T23:59:59.999Z" \
--currency PLN --currency EUR
# Filtr po typie faktury
ksef-cli list-invoices -n 1234567890 -t <token> \
--date-from "2026-01-01T00:00:00.000Z" \
--date-to "2026-12-31T23:59:59.999Z" \
--invoice-type Vat
# Tylko faktury z załącznikami
ksef-cli list-invoices -n 1234567890 -t <token> \
--date-from "2026-01-01T00:00:00.000Z" \
--date-to "2026-12-31T23:59:59.999Z" \
--has-attachment
# Zapis do pliku JSON
ksef-cli list-invoices -n 1234567890 -t <token> \
--date-from "2026-01-01T00:00:00.000Z" \
--date-to "2026-12-31T23:59:59.999Z" \
--output faktury.json
Token KSeF
Token autoryzacyjny generujesz w portalu KSeF:
- Produkcja: https://ap.ksef.mf.gov.pl/web/tokens/generate-token
- Test: https://api-test.ksef.mf.gov.pl (dla flagi
--test)
Debugowanie
Użyj flagi --debug aby zobaczyć szczegóły żądań i odpowiedzi:
ksef-cli list-invoices -n 1234567890 -t $TOKEN \
--date-from "2026-01-01T00:00:00.000Z" \
--date-to "2026-12-31T23:59:59.999Z" \
--debug
Pobieranie konkretnej faktury z KSeF
Pobierz pełny dokument XML faktury po numerze KSeF:
ksef-cli get-invoice \
-n 1234567890 \
-t <token> \
-k 123-456-789-10-2026-0000001
Zapisz do pliku:
ksef-cli get-invoice \
-n 1234567890 \
-t <token> \
-k 123-456-789-10-2026-0000001 \
-o faktura.xml
Generowanie faktury interaktywnie
Tryb interaktywny z obsługą szablonów:
ksef-cli interactive
Aplikacja zapyta się, czy chcesz użyć szablonu istniejącej faktury:
Czy masz plik szablonu faktury? [y/N]: y
Ścieżka do pliku szablonu (XML): moje_faktury/poprzednia.xml
✓ Szablon załadowany z: moje_faktury/poprzednia.xml
Workflow szablonu
Dla każdej sekcji (sprzedawca, nabywca, dane faktury, pozycje, stopka):
- Zachować — Użyj danych z szablonu (domyślnie)
- Edytować — Zmień wybrany fragment
- Pozycje — Keep/Edit/Delete (k/e/u) dla każdej pozycji, dodaj nowe
Wieloliniowa stopka faktury
Stopka faktury obsługuje wiele linii. Przy pytaniu o stopkę:
- Wpisz każdą linię oddzielnie (Enter między liniami)
- Aby zakończyć edycję: wciśnij Enter na pustej linii LUB Ctrl+D
- Aby anulować edycję: wciśnij Ctrl+C w dowolnym momencie
Przykład z Enter na pustej linii:
Stopka faktury (opcjonalnie)
: Dziękujemy za współpracę!
: Zapraszamy do ponownego kontaktu.
:
Przykład z Ctrl+D:
Stopka faktury (opcjonalnie)
: Dziękujemy za współpracę!
: Zapraszamy do ponownego kontaktu.
<Ctrl+D>
Aby całkowicie pominąć stopkę, wciśnij Ctrl+D bez wpisywania żadnej treści.
Automatyczne tworzenie katalogów
Jeśli plik wyjściowy zawiera ścieżkę (np. moje_faktury/2025/faktura.xml),
aplikacja automatycznie stworzy brakujące katalogi.
Wizualizacja PDF na koniec
Po wygenerowaniu faktury aplikacja zapyta, czy chcesz od razu wygenerować wizualizację PDF.
Walidacja faktury
ksef-cli validate -f faktura.xml
Wizualizacja faktury XML do PDF
Generowanie wizualizacji PDF z pliku XML faktury KSeF:
ksef-cli visualize -i faktura.xml -o faktura.pdf
Autentykacja KSeF
Komenda list-invoices korzysta z token-based authentication (API v2 KSeF):
- Token autoryzacyjny generujesz w portalu KSeF
- Aplikacja szyfruje token przy użyciu RSA-OAEP (klucz publiczny z API)
- Wykonuje 6-krokowy proces autentykacji
- Otrzymuje JWT access token do zapytań o faktury
Ograniczenia API:
- 20 żądań na godzinę per token
- Wsparcie dla FA-3 (formularza FA)
- Daty w formacie ISO-8601 z czasem UTC (np.
2026-01-01T00:00:00.000Z)
Dokumentacja KSeF:
Praktyczne workflow'i
1. Pobieranie faktury z KSeF
# Pobierz listę faktur z ostatniego miesiąca
ksef-cli list-invoices -n 1234567890 -t $TOKEN \
--date-from "2026-03-01T00:00:00.000Z" \
--date-to "2026-03-31T23:59:59.999Z" \
--output faktury_marzec.json
# Z otrzymanego JSON weź ksefReferenceNumber
# Pobierz konkretną fakturę XML
ksef-cli get-invoice -n 1234567890 -t $TOKEN \
-k "123-456-789-10-2026-0000001" \
-o pobrana_faktura.xml
# Wizualizuj pobraną fakturę
ksef-cli visualize -i pobrana_faktura.xml -o pobrana_faktura.pdf
2. Filtrowanie faktur przed poborem
# Pobierz tylko faktury VAT powyżej 1000 PLN
ksef-cli list-invoices -n 1234567890 -t $TOKEN \
--date-from "2026-01-01T00:00:00.000Z" \
--date-to "2026-12-31T23:59:59.999Z" \
--subject-type Subject1 \
--date-type Issue \
--invoice-type Vat \
--amount-type Brutto \
--amount-from 1000 \
--output high_value_invoices.json
3. Debugowanie problemów
# Włącz debug mode dla szczegółowych informacji
ksef-cli get-invoice -n 1234567890 -t $TOKEN \
-k "123-456-789-10-2026-0000001" \
--debug
# Debug info pojawia się na stderr (STDERR),
# dane na stdout (STDOUT), możesz je oddzielić:
ksef-cli get-invoice -n 1234567890 -t $TOKEN \
-k "123-456-789-10-2026-0000001" \
--debug \
-o faktura.xml 2> debug.log
Przykłady
Zobacz examples/example_invoice.json dla pełnego przykładu.
Rozwój
Uruchamianie testów
# Uruchom wszystkie testy
poetry run pytest
# Uruchom testy z pokryciem kodu
poetry run pytest --cov=ksef_cli --cov-report=term-missing
# Uruchom konkretny test
poetry run pytest tests/test_ksef_api.py -v
Sprawdzanie jakości kodu
# Formatowanie kodu
poetry run black ksef_cli/ tests/
# Sortowanie importów
poetry run isort ksef_cli/ tests/
# Linting
poetry run flake8 ksef_cli/ tests/
# Type checking
poetry run mypy ksef_cli/
# Security scanning
poetry run bandit -r ksef_cli/
Standardy kodu
- Python: 3.13+
- Formatowanie: Black (line length: 100)
- Linting: Flake8
- Type hints: Wymagane dla wszystkich funkcji publicznych
- Pokrycie testami: Minimum 80%
- Dokumentacja: Docstringi dla wszystkich klas i funkcji publicznych
Kontrybuowanie
Zapraszamy do współtworzenia projektu! Zobacz CONTRIBUTING.md dla szczegółowych informacji.
Licencja
MIT License - zobacz plik LICENSE dla szczegółów.
CI/CD i Publikacja
Projekt używa GitHub Actions do automatycznego:
- Testowania na Python 3.13+
- Sprawdzania jakości kodu (Black, Flake8, isort, mypy)
- Skanowania bezpieczeństwa (Bandit, Safety)
- Weryfikacji pokrycia kodu (minimum 80%)
- Publikacji do TestPyPI (każde push na main)
- Publikacji do PyPI (przy tworzeniu release'u)
Pakiet jest dostępny na PyPI.
Status pipeline'u można sprawdzić w zakładce Actions.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ksef_cli-1.0.0rc6.tar.gz.
File metadata
- Download URL: ksef_cli-1.0.0rc6.tar.gz
- Upload date:
- Size: 136.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a8649a564bc7c259ac484cf862c2baf79d370d0e1c8245320379d71dbe7468d1
|
|
| MD5 |
4533e5a69ab37747b253bc483f734bc1
|
|
| BLAKE2b-256 |
74ad40370d3dd957d962510230024f66dd04fb79b85cdf46dd94d8cce2ba2d0d
|
Provenance
The following attestation bundles were made for ksef_cli-1.0.0rc6.tar.gz:
Publisher:
python-publish.yml on krzysbaranski/ksef-cli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ksef_cli-1.0.0rc6.tar.gz -
Subject digest:
a8649a564bc7c259ac484cf862c2baf79d370d0e1c8245320379d71dbe7468d1 - Sigstore transparency entry: 1300566518
- Sigstore integration time:
-
Permalink:
krzysbaranski/ksef-cli@6656c5417d96503af0ce35a8966edb7ba9d6fb10 -
Branch / Tag:
refs/tags/1.0.0rc6 - Owner: https://github.com/krzysbaranski
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@6656c5417d96503af0ce35a8966edb7ba9d6fb10 -
Trigger Event:
release
-
Statement type:
File details
Details for the file ksef_cli-1.0.0rc6-py3-none-any.whl.
File metadata
- Download URL: ksef_cli-1.0.0rc6-py3-none-any.whl
- Upload date:
- Size: 36.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cf3ef3c2c87acb9fb5d649d963cb23629113361150a829824b93f553310dd5bc
|
|
| MD5 |
77d1619e01fdf93601a256c7add3a088
|
|
| BLAKE2b-256 |
1aa13095bfe2ac7024e03eb6815180ff443ced20f9c20ddcb731739e71473d26
|
Provenance
The following attestation bundles were made for ksef_cli-1.0.0rc6-py3-none-any.whl:
Publisher:
python-publish.yml on krzysbaranski/ksef-cli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ksef_cli-1.0.0rc6-py3-none-any.whl -
Subject digest:
cf3ef3c2c87acb9fb5d649d963cb23629113361150a829824b93f553310dd5bc - Sigstore transparency entry: 1300566678
- Sigstore integration time:
-
Permalink:
krzysbaranski/ksef-cli@6656c5417d96503af0ce35a8966edb7ba9d6fb10 -
Branch / Tag:
refs/tags/1.0.0rc6 - Owner: https://github.com/krzysbaranski
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@6656c5417d96503af0ce35a8966edb7ba9d6fb10 -
Trigger Event:
release
-
Statement type: