agentsclimarketplace

Expense

Skill dithiothreitol/jdg-ksiegowy/.claude/skills/expense

AI Asystent Księgowy dla JDG (Polska) — faktury, KSeF 2.0, JPK_V7M/EWP, ZUS, ryczałt. OpenClaw + Ollama + Claude.

Install
npx -y skills add dithiothreitol/jdg-ksiegowy --skill expense

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 5 stars5 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Dodaje fakturę zakupu (koszt) do rejestru SQLite — zapisuje sprzedawcę, NIP, kwoty, kategorię, datę wpływu. Obsługuje wprowadzanie ręczne ORAZ OCR z pliku (PDF/JPG/PNG) przez lokalny Pixtral 12B z fallbackiem na Claude Haiku 4.5. Na ryczałcie koszty NIE pomniejszają podatku, ale VAT naliczony idzie do JPK_V7M jako odliczalny. Użyj gdy user mówi "dodaj fakturę zakupu", "zarejestruj koszt", "wprowadź wydatek", "kupiłem laptopa za...", "fakturę za hosting/SaaS/internet/paliwo", "dorzuć fakturę kosztową", "zeskanuj fakturę", "wczytaj PDF-a z fakturą", lub gdy user przesyła plik faktury.

SKILL.md

5.5 KB, as published. Nobody here has run it

Dodawanie faktury zakupu (koszt)

Zapisuje koszt do tabeli expenses w SQLite. Używane potem przez skill jpk do wyliczenia VAT naliczonego do odliczenia.

Wymagane dane od usera

  • seller-name — nazwa sprzedawcy
  • seller-nip — NIP sprzedawcy (10 cyfr; dla zagranicznego: też string, ustaw --seller-country)
  • document-number — numer faktury (z faktury sprzedawcy)
  • issue-date — data wystawienia (YYYY-MM-DD)
  • netto — kwota netto
  • vat — kwota VAT (jeśli sprzedawca zwolniony — wpisz 0)

Opcjonalnie:

  • receive-date — data wpływu (domyślnie = issue-date). To ona decyduje o miesiącu w JPK_V7M.
  • description — co kupiłeś
  • categoryuslugi_obce | materialy | media | paliwo | samochod | biuro | sprzet | szkolenia | inne
  • vat-rate — stawka (domyślnie 23)
  • --vat-deduction-pct — procent VAT odliczalnego (0-100, domyślnie 100):
    • 100 — pełne odliczenie (typowe usługi/towary firmowe)
    • 50 — auto osobowe użytkowanie mieszane lub auto prywatne służbowo (paliwo, serwis)
    • 0 — brak odliczenia (reprezentacja, prywatny zakup)
  • file-path — ścieżka do PDF/JPG zachowanego skanu

Dopytaj usera jeśli czegoś brakuje, zwłaszcza NIP i kwot. Nie wymyślaj.

Wywołanie

python3 skills/expense/scripts/add.py \
  --seller-name "Hetzner Online GmbH" \
  --seller-nip "DE812871812" \
  --seller-country DE \
  --document-number "R0012345" \
  --issue-date "2026-04-15" \
  --description "Hosting VPS kwiecien 2026" \
  --category uslugi_obce \
  --netto 100 \
  --vat 23

Zwraca JSON z id rekordu, datami i statusem saved.

OCR z pliku (PDF/JPG/PNG)

Zamiast przepisywać dane, user może podać plik faktury:

# Podglad (preview, bez zapisu):
python3 skills/expense/scripts/scan.py --file faktura.pdf

# Zapis od razu:
python3 skills/expense/scripts/scan.py --file faktura.pdf --save

Flow:

  1. Bez --save skrypt zwraca JSON z wyciągniętymi polami + source (ollama | claude).
  2. Pokaż userowi preview i spytaj o akceptację/poprawki.
  3. Po akceptacji odpal ten sam skrypt z --save lub skills/expense/scripts/add.py z poprawionymi polami.

Backend domyślny: Pixtral 12B przez Ollama (http://localhost:11434). Przy błędzie/timeout → fallback na Claude Haiku 4.5 (wymaga ANTHROPIC_API_KEY). Konfiguracja przez OCR_PROVIDER (auto | ollama | claude) w .env.

Źródło z KSeF (faktury zakupowe B2B)

Dla faktur, które kontrahent wystawił w KSeF (większość polskich dostawców B2B — paliwo, SaaS, usługi), autorytatywnym źródłem jest inbox KSeF, nie OCR. Jeśli user ma paragon / „potwierdzenie transakcji" (np. Shell) z adnotacją, że faktura trafia do KSeF — użyj skilla ksef (skills/ksef/scripts/inbox.py), który pobierze dokładne kwoty, NIP i numer oraz zapisze koszt bez przepisywania. OCR (scan.py) zostaw dla faktur spoza KSeF (papierowe, zagraniczne, PDF mailem).

Listowanie

python3 skills/expense/scripts/list.py --month 4 --year 2026

Po zapisaniu

Pokaż userowi: sprzedawca, numer dokumentu, kwoty, procent odliczenia VAT. Jeśli vat_deduction_pct > 0 — przypomnij że ten koszt zwiększy VAT do odliczenia w JPK_V7M za dany miesiąc o vat × pct / 100.

Auto osobowe — heurystyka 50%

Jeśli kategoria to paliwo lub samochod, zapytaj usera czy auto jest:

  • prywatne używane służbowo / firmowe „mieszane" → --vat-deduction-pct 50 (domyślny scenariusz JDG)
  • firmowe wyłącznie do działalności (VAT-26 + ewidencja przebiegu) → --vat-deduction-pct 100
  • prywatne bez związku z firmą → wpis w ogóle nie powinien być rejestrowany

Uwagi

  • Ryczałt: koszty nie zmniejszają podatku dochodowego. Jedyny powód rejestracji to (a) wymóg przechowywania dowodów (art. 15 ustawy o ryczałcie), (b) odliczenie VAT.
  • Zagraniczny sprzedawca / import usług (SaaS, API, hosting): jeśli dostawca wystawił fakturę bez VAT (poprawne B2B), użyj --reverse-charge. Sam naliczasz VAT należny i odliczasz go (efekt netto 0). Ustaw --seller-country (UE → K_29/K_30 art. 28b; spoza UE, np. US → K_27/K_28). VAT liczony jest automatycznie z --netto × --vat-rate, więc --vat możesz pominąć.
    python3 skills/expense/scripts/add.py --seller-name "Hetzner Online GmbH" \
      --seller-nip "DE812871812" --seller-country DE --document-number "R123" \
      --issue-date 2026-05-10 --category uslugi_obce --netto 100 --vat-rate 23 --reverse-charge
    
    Pułapka OSS: jeśli zagraniczny dostawca naliczył już polski VAT przez OSS (traktując Cię jak konsumenta — brak Twojego nr VAT-UE), NIE rób reverse charge (podwójny VAT). Wtedy --vat-deduction-pct 0 i poproś dostawcę o fakturę B2B bez VAT. Wymóg: rejestracja VAT-UE (VAT-R) przed pierwszym importem usług.
  • Rabat / korekta: dodaj jako osobny wpis z ujemnymi kwotami i tym samym document_number z prefiksem KOR-.

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.