Fakturowanie — Faktury wystawione i zakupu, KSeF, tryby pre-fill

Kompletny przewodnik po module fakturowania w SerwisRun. Dokument opisuje wystawianie faktur w 4 trybach (konserwacja / interwencja / harmonogram umowy / recznie), import faktur zakupu z KSeF, automatyczne tworzenie PZ oraz oznaczanie zrodlowych dokumentow jako zafakturowanych.

Wersja 1.1·Opublikowano: 2026-05-08
Zmiana 2026-03-20: Faktury w menu bocznym to teraz grupa z dwoma pozycjami: Faktury wystawione (/invoices/issued) i Faktury zakupu (/invoices/purchase). Importer KSeF dla faktur zakupu + auto-PZ (wykrywanie nr zamowienia PO z opisu).

Spis tresci

  1. Architektura modulu fakturowania
  2. Faktury wystawione (outgoing)
  3. Kreator faktury — 3 fazy, 4 tryby
  4. Mechanizm pre-fill (auto-wypelnianie)
  5. Oznaczanie zrodlowych dokumentow
  6. Faktury zakupu (incoming)
  7. Import z KSeF (XML FA_VAT)
  8. Auto-tworzenie PZ z faktury zakupu
  9. Statusy faktur i platnosci
  10. Termin platnosci — hierarchia
  11. Wysylka do KSeF (e-faktury)
  12. Raporty i eksport

1 Architektura modulu fakturowania

Kluczowe tabele

TabelaOpis
invoicesNaglowek faktury — numer, data wystawienia, data sprzedazy, termin, kwoty, status, direction (outgoing/incoming)
invoice_itemsPozycje faktury — nazwa, ilosc, JM, cena netto, VAT, kwota brutto
contract_invoice_schedulesHarmonogram faktur umowy — stale platnosci wg cyklu (miesiac, kwartal, rok)
suppliersDostawcy — NIP, REGON, adres, termin platnosci, kategorie materialow
warehouse_documentsDokumenty PZ powiazane z invoice_id (faktury zakupu)

Kluczowy podzial: direction

Wartosc directionOpisWidok
outgoingFaktury wystawione (sprzedazy) — to, co wysylamy klientowi/invoices/issued (IssuedInvoicesPage)
incomingFaktury zakupu — to, co otrzymujemy od dostawcy/invoices/purchase (PurchaseInvoicesPage)

2 Faktury wystawione (outgoing)

Lista faktur wystawionych
Lista faktur wystawionych dane zanonimizowane.

U Uprawnienie: invoices / VIEW + EDIT (wystawianie)

Przycisk „Nowa faktura"

W module /invoices/issued przycisk otwiera kreator faktury (/invoices/issued/wizard) — 3-fazowy wizard z pionowym sidebarem.

Faza 1 (Zrodlo) → Faza 2 (Dane + Pozycje) → Faza 3 (Podsumowanie)

3 Kreator faktury — 3 fazy, 4 tryby

Faza 1 — Wybor zrodla (tryb)

TrybZrodloEndpointKiedy stosowac
A. Konserwacja Niefakturowane konserwacje (status: wykonana/zweryfikowana) POST /invoices/from-maintenance/:id Najczestszy — faktura po kazdej konserwacji
B. Interwencja Niefakturowane protokoly naprawy (repair_protocols.invoiced = false) POST /invoices/from-repair-protocol/:id Naprawy (nie gwarancyjne — is_warranty = false)
C. Harmonogram umowy Niezafakturowane pozycje contract_invoice_schedules POST /invoices/from-schedule/:contractId Ryczalt / rata kwartalna / miesieczna
D. Recznie Wybor klienta + pusty formularz POST /invoices Korekty, niestandardowe rozliczenia

Faza 2 — Dane i pozycje

Po wyborze zrodla system automatycznie wypelnia (zobacz sekcja „Pre-fill" ponizej):

Uzytkownik moze skorygowac dowolne pole przed zapisem. System weryfikuje VAT, sumy netto/brutto.

Faza 3 — Podsumowanie


Kreator faktury
Kreator faktury dane zanonimizowane — pionowy sidebar z 3 fazami.

4 Mechanizm pre-fill (auto-wypelnianie)

Tryb A — Z konserwacji

Backend endpoint POST /invoices/from-maintenance/:id robi:

  1. Pobiera konserwacje z JOIN contracts ON maintenances.contract_id = contracts.id
  2. Pobiera klienta (nabywce) z JOIN clients
  3. Jesli konserwacja ma kosztorys powykonawczy (status=approved) — uzywa pozycji z kosztorysu
  4. Jesli brak kosztorysu — generuje pozycje z czasu pracy (godziny × stawka umowna) + materialy z protokolu
  5. Oblicza VAT per pozycja (domyslnie 23%)
  6. Ustawia termin platnosci: issueDate + contract.paymentTermDays

Tryb B — Z interwencji (naprawy)

Analogicznie, ale zrodlem jest repair_protocols. Dodatkowo sprawdza is_warranty — jesli true, faktura NIE jest tworzona (gwarancja nie fakturowana).

Tryb C — Harmonogram umowy

Dla umow z platnosciami ryczaltowymi (np. 1000 PLN/miesiac). Pozycja harmonogramu: {period: 'month', amount: 1000, dueDate: '2026-04-10', isIssued: false}. Po wystawieniu faktury → isIssued=true, issuedAt.

Tryb D — Recznie

Brak pre-fill. Uzytkownik wypelnia wszystko od zera — kreator pokazuje tylko walidacje i podpowiedzi (NIP lookup z MF, obliczanie sum).


5 Oznaczanie zrodlowych dokumentow

Po wystawieniu faktury system automatycznie oznacza zrodlo jako zafakturowane, aby zapobiec podwojnemu fakturowaniu:

ZrodloPole oznaczajace
Konserwacjamaintenances.invoice_id (FK), status = 'invoiced'
Protokol naprawyrepair_protocols.invoiced = true, invoice_id, invoiced_at
Harmonogram umowycontract_invoice_schedules.is_issued = true, issued_at
Kosztoryscost_estimates.status = 'invoiced'
Pozycje WZwarehouse_document_items.invoice_id, invoiced_quantity
Interwencja materialyintervention_materials.consumption_status = 'invoiced'
Gwarancja: Jesli is_warranty = true w interwencji, status zmienia sie na warranty (bez faktury). System nie pozwala utworzyc faktury z interwencji gwarancyjnej.

6 Faktury zakupu (incoming)

Faktury zakupu
Lista faktur zakupu dane zanonimizowane — import z KSeF.
Szczegoly faktury zakupu
Szczegoly faktury zakupu dane zanonimizowane — dostawca, pozycje, VAT, link do PZ.

U Uprawnienie: invoices / EDIT

Moduł /invoices/purchase (PurchaseInvoicesPage) wyswietla faktury z direction = 'incoming'. Dwa zrodla dodawania:

  1. Recznie — przycisk „Nowa faktura zakupu" otwiera formularz (wybor dostawcy, numer, daty, pozycje)
  2. Import z KSeF — przycisk „Pobierz z KSeF" (patrz sekcja ponizej)

Powiazanie z dostawca

invoices.supplier_id → FK do suppliers. System weryfikuje NIP przez API MF (Biala Lista):


7 Import z KSeF (XML FA_VAT)

Wymagania

Przebieg importu

Fetch faktur z KSeF → Preview listy → Wybor → Download XML → Parse FA_VAT → Insert invoices
  1. Klik „Pobierz z KSeF"POST /invoices/purchase/fetch-ksef (zapytanie do API KSeF z filtrem po dacie)
  2. System wyswietla liste niezaimportowanych faktur (porownanie z invoices.ksef_uid)
  3. Uzytkownik zaznacza faktury do importu → klik „Importuj"
  4. Backend: POST /invoices/purchase/import-ksef → dla kazdej faktury:
  5. Toast: „Zaimportowano N faktur"
Wykrywanie duplikatow: ksef_uid (UNIQUE INDEX) zapobiega ponownemu importowi tej samej faktury. Jesli uzytkownik kliknie „Importuj" dwa razy, system pomija juz zaimportowane.

8 Auto-tworzenie PZ z faktury zakupu

Po zaimportowaniu faktury zakupu system moze automatycznie wygenerowac dokument PZ (przyjecie zewnetrzne) — dzieki temu material od razu trafia na stan magazynu.

Endpoint

POST /invoices/purchase/:id/create-pz — tworzy PZ z nastepujacymi krokami:

  1. Matchowanie materialow — dla kazdej pozycji faktury system szuka w materials:
  2. Wykrywanie oddzialu — z opisu faktury (np. „Dostawa do POZ-01") lub z supplier.branch_id
  3. Wykrywanie nr zamowienia — regex PO-YYYY-NNNNNN w opisie (powiazanie z parts_orders)
  4. Utworzenie PZ:
  5. Status: draft — magazynier musi potwierdzic przed aktualizacja stanu

Co sie dzieje przy potwierdzeniu PZ?

  1. Dla kazdej pozycji PZ tworzona jest nowa partia materialu (material_batches) z:
  2. warehouse_stock.quantity += qty w magazynie docelowym
  3. Walidacja: porownanie ceny z ostatnia partia tego materialu (alert gdy odchylenie > 10%)
  4. Status PZ: draft → confirmed

9 Statusy faktur i platnosci

StatusOpisKto zmienia
draftRobocza — mozna edytowac, brak finalnego numeruUzytkownik
issuedWystawiona — finalny numer, zapisana do ewidencjiUzytkownik (Wystaw)
sentWyslana do klienta (email) lub do KSeFSystem
paidZaplacona — odebrana platnoscUzytkownik (manual) lub import z banku
overduePrzeterminowana — due_date < now() AND status != paidSystem (derywowany)
cancelledAnulowana (korekta) — z powiazana faktura korygujacaUzytkownik

10 Termin platnosci — hierarchia

Priorytet (najwyzszy → najnizszy):
umowa (contracts.payment_term_days) → klient (clients.payment_days_due) → firma (company_settings.default_payment_term_days) → 14 dni (hardcoded fallback)

Wyliczanie terminu: dueDate = issueDate + termDays.

Gdzie ustawiac?

PoziomGdzie
UmowaSzczegoly umowy → zakladka „Dane podstawowe" → pole „Termin platnosci (dni)"
KlientSzczegoly klienta → zakladka „Rozliczenia"
Firma (domyslny)Panel Administracyjny → Dane firmy → „Domyslny termin platnosci"
AI pre-fill z umowy: Przy uploadzie skanu umowy AI wyciaga termin platnosci z tekstu (np. „14 dni", „30 dni") i wypelnia pole automatycznie w kreatorze umowy.

11 Wysylka do KSeF (e-faktury)

Od 2026-07 KSeF jest obowiazkowy dla duzych podatnikow. System wspiera:

Konfiguracja KSeF

  1. Panel Administracyjny → Integracje → KSeF
  2. Wybor srodowiska: „Test" (dev) / „Produkcja"
  3. Upload certyfikatu lub wklejenie tokenu autoryzacyjnego
  4. Klik „Testuj polaczenie" — weryfikacja tokenem
  5. Zaznacz „Automatyczna wysylka po wystawieniu" (opcjonalne)

12 Raporty i eksport

Raporty w module Raporty

Eksport do Excela

W module /invoices/issued lista faktur moze byc eksportowana do Excel z kolumnami: numer, data, klient, NIP, kwota netto, VAT, brutto, termin, status. Export respektuje filtry tabeli.

Eksport do ksiegowosci

Format JPK_FA (XML) — eksport zgodny z wymaganiami MF dla kontroli skarbowych. Dostepny w Raporty → JPK.