Przejdź do głównej zawartości

Namespace: validation

Namespace validation sprawdza faktury pod kątem poprawności za pomocą 20 wbudowanych reguł walidacji.

Waliduje listę faktur. Zwraca raport dla każdej faktury.

validate(invoices: Invoice[]): ValidationReport[]
PoleTypOpis
invoiceInvoiceWalidowana faktura
resultsValidationResult[]Wyniki poszczególnych reguł
validbooleantrue jeśli wszystkie reguły przeszły
PoleTypOpis
validbooleanCzy reguła przeszła
rulestringNazwa reguły
fieldstring?Pole, którego dotyczy błąd
messagestring?Opis błędu
valueunknown?Wartość, która nie przeszła walidacji
RegułaKategoriaOpis
required-fieldsPolaWymagane pola: invoiceNumber, sellerNIP, grossAmount, issueDate
nip-formatNIPSprzedawca: 10 cyfr z poprawną sumą kontrolną
buyer-nip-formatNIPNabywca (jeśli podany): 10 cyfr z poprawną sumą kontrolną
nip-not-zerosNIPNIP nie może składać się z samych zer
amount-positiveKwotygrossAmount musi być > 0
amount-maxKwotygrossAmount nie przekracza limitu (10 mld groszy)
date-validDatyissueDate w poprawnym formacie ISO
date-not-futureDatyissueDate nie jest z przyszłości
date-orderDatyChronologiczna kolejność dat (sprzedaż, wystawienie, termin)
date-rangeDatyDaty w rozsądnym zakresie (nie starsze niż 10 lat)
vat-rate-validVATStawka VAT: 0, 5, 8 lub 23
vat-calculationVATJeśli netAmount i vatAmount podane: netAmount + vatAmount = grossAmount
invoice-number-formatNumerNumer faktury nie jest pusty i ma rozsądny format
duplicate-checkDuplikatyBrak duplikatów w zestawie (ten sam numer + NIP sprzedawcy)
currency-validWalutaWaluta = PLN
line-items-sumPozycjeSuma netAmount pozycji = netAmount faktury
seller-buyer-differentNIPNIP sprzedawcy != NIP nabywcy
quantity-positivePozycjeIlość na pozycjach > 0
description-lengthTekstOpis pozycji nie przekracza 256 znaków
ksef-reference-formatKSeFReferencja KSeF (jeśli podana) ma poprawny format
const reports = ksefnik.validation.validate(invoices)
for (const report of reports) {
if (report.valid) {
console.log(`OK: ${report.invoice.invoiceNumber}`)
continue
}
console.log(`BŁĄD: ${report.invoice.invoiceNumber}`)
for (const result of report.results.filter((r) => !r.valid)) {
console.log(` [${result.rule}] ${result.field}: ${result.message}`)
}
}
const reports = ksefnik.validation.validate(invoices)
const valid = reports.filter((r) => r.valid)
const invalid = reports.filter((r) => !r.valid)
console.log(`Poprawne: ${valid.length} / ${reports.length}`)
console.log(`Błędne: ${invalid.length} / ${reports.length}`)
// Najczęstsze błędy
const errorCounts = new Map<string, number>()
for (const report of invalid) {
for (const result of report.results.filter((r) => !r.valid)) {
errorCounts.set(result.rule, (errorCounts.get(result.rule) ?? 0) + 1)
}
}
for (const [rule, count] of [...errorCounts].sort((a, b) => b[1] - a[1])) {
console.log(` ${rule}: ${count} wystąpień`)
}

Wewnętrznie silnik tworzy ValidationContext z dostępem do pełnej listy faktur (potrzebny np. dla reguły duplicate-check) i aktualnej daty (date-not-future).

interface ValidationContext {
allInvoices?: Invoice[] // Pełna lista — dla sprawdzania duplikatów
now?: Date // Bieżąca data — dla sprawdzania dat przyszłych
}