Przejdź do głównej zawartości

Walidacja faktur

Moduł validation sprawdza faktury pod kątem 20 najczęstszych reguł walidacyjnych KSeF. Wykrywa błędy, zanim wyślesz dokumenty do systemu — oszczędzasz czas i unikasz odrzuceń.

Reguły podzielone na 4 grupy:

RegułaOpisPolePrzykład błędu
nip-seller-requiredNIP sprzedawcy jest wymaganysellerNipBrak NIP sprzedawcy
nip-seller-checksumNIP sprzedawcy ma poprawną sumę kontrolnąsellerNipNIP 1234567890 — niepoprawna suma kontrolna
nip-buyer-requiredNIP nabywcy jest wymagany (dla faktur krajowych)buyerNipBrak NIP nabywcy
nip-buyer-checksumNIP nabywcy ma poprawną sumę kontrolnąbuyerNipNIP 9999999999 — niepoprawna suma kontrolna
nip-seller-buyer-differentNIP sprzedawcy i nabywcy są różnesellerNip, buyerNipSprzedawca i nabywca mają ten sam NIP
RegułaOpisPolePrzykład błędu
amount-gross-positiveKwota brutto jest dodatniagrossAmountKwota brutto: 0 gr
amount-net-positiveKwota netto jest dodatnianetAmountKwota netto: -10000 gr
amount-vat-consistentVAT = brutto - nettovatAmountVAT 2300 gr nie zgadza się z brutto 12300 - netto 9000 = 3300
amount-gross-gte-netKwota brutto >= nettogrossAmount, netAmountBrutto 10000 gr < netto 12000 gr
RegułaOpisPolePrzykład błędu
date-issue-requiredData wystawienia jest wymaganaissueDateBrak daty wystawienia
date-issue-not-futureData wystawienia nie jest z przyszłościissueDateData wystawienia 2027-01-01 jest w przyszłości
date-sale-not-after-issueData sprzedaży nie jest po dacie wystawieniasaleDate, issueDateData sprzedaży 2026-04-01 jest po dacie wystawienia 2026-03-15
date-sale-reasonable-rangeData sprzedaży w rozsądnym zakresie (max 60 dni przed wystawieniem)saleDateData sprzedaży 2025-12-01 — ponad 60 dni przed wystawieniem
RegułaOpisPolePrzykład błędu
number-requiredNumer faktury jest wymaganynumberBrak numeru faktury
number-formatNumer faktury nie jest pusty i ma max 256 znakównumberNumer faktury przekracza 256 znaków
currency-validKod waluty jest poprawny (ISO 4217)currencyNieznana waluta: XYZ
currency-pln-defaultFaktury krajowe powinny być w PLNcurrencyFaktura krajowa w walucie EUR
vat-rate-validStawka VAT jest poprawna (23%, 8%, 5%, 0%, zw, np, oo)vatRateNieznana stawka VAT: 10%
seller-name-requiredNazwa sprzedawcy jest wymaganasellerNameBrak nazwy sprzedawcy
buyer-name-requiredNazwa nabywcy jest wymaganabuyerNameBrak nazwy nabywcy
import { createKsefnik } from '@ksefnik/core';
const ksef = createKsefnik({
config: { nip: '5213456784' },
});
const invoices = await ksef.invoices.fetch({
from: '2026-03-01',
to: '2026-03-31',
});
const report = await ksef.validation.validate(invoices);
console.log(`Poprawne: ${report.valid.length}`);
console.log(`Z błędami: ${report.invalid.length}`);
// Wyświetl błędy
for (const result of report.invalid) {
console.log(`\nFaktura ${result.invoice.number}:`);
for (const error of result.errors) {
console.log(` [${error.rule}] ${error.message} (pole: ${error.field})`);
}
}
interface ValidationReport {
valid: ValidationResult[];
invalid: ValidationResult[];
totalChecked: number;
errorCount: number;
}
interface ValidationResult {
invoice: Invoice;
errors: ValidationError[];
isValid: boolean;
}
interface ValidationError {
rule: string; // np. 'nip-seller-checksum'
field: string; // np. 'sellerNip'
message: string; // czytelny opis błędu
severity: 'error' | 'warning';
}
const report = await ksef.validation.validate(invoices);
// Znajdź wszystkie faktury z błędnym NIP
const nipErrors = report.invalid.filter(r =>
r.errors.some(e => e.rule.startsWith('nip-'))
);
console.log(`Faktury z błędnym NIP: ${nipErrors.length}`);
// Znajdź faktury z niespójnymi kwotami
const amountErrors = report.invalid.filter(r =>
r.errors.some(e => e.rule.startsWith('amount-'))
);
console.log(`Faktury z błędnymi kwotami: ${amountErrors.length}`);
const result = await ksef.validation.validateOne({
number: 'FV/2026/03/001',
sellerNip: '5213456784',
sellerName: 'CodeFormers sp. z o.o.',
buyerNip: '7740001454',
buyerName: 'Klient ABC sp. z o.o.',
issueDate: '2026-03-15',
saleDate: '2026-03-15',
grossAmount: 12300, // 123,00 PLN
netAmount: 10000, // 100,00 PLN
vatAmount: 2300, // 23,00 PLN
vatRate: '23%',
currency: 'PLN',
});
if (result.isValid) {
console.log('Faktura poprawna');
} else {
console.log('Błędy:', result.errors);
}

Przykład: walidacja batch’u 100 faktur przed wysłaniem do KSeF

Dział zatytułowany „Przykład: walidacja batch’u 100 faktur przed wysłaniem do KSeF”
  1. Przygotuj plik faktury-do-wyslania.json z listą 100 faktur.
  2. Uruchom walidację:
    Okno terminala
    ksefnik validate ./faktury-do-wyslania.json --format table
  3. Przejrzyj raport — popraw faktury z błędami.
  4. Po poprawkach uruchom walidację ponownie, aż wszystkie faktury będą poprawne.
  5. Wyślij faktury do KSeF z pewnością, że nie zostaną odrzucone.