Przejdź do głównej zawartości

Pozostałe reguły

Poza regułami NIP, kwot i dat, ksefnik zawiera 7 dodatkowych reguł walidacji.

Sprawdza obecność wymaganych pól na fakturze.

import { requiredFieldsRule } from '@ksefnik/core'

Wymagane pola: invoiceNumber, sellerNIP, grossAmount, issueDate.

Każde pole jest sprawdzane osobno — reguła zwraca osobny ValidationResult dla każdego brakującego pola:

// Faktura bez numeru i NIP:
// results: [
// { valid: false, rule: 'required-fields', field: 'invoiceNumber', message: 'Missing required field: invoiceNumber' },
// { valid: false, rule: 'required-fields', field: 'sellerNIP', message: 'Missing required field: sellerNIP' },
// { valid: true, rule: 'required-fields', field: 'grossAmount' },
// { valid: true, rule: 'required-fields', field: 'issueDate' },
// ]

Sprawdza długość numeru faktury.

import { invoiceNumberFormatRule } from '@ksefnik/core'
PoleWarunek
invoiceNumber1-256 znaków
NumerWynik
FV/2026/03/001valid
1valid
(pusty string)invalid
(257+ znaków)invalid

Sprawdza, czy w zbiorze faktur nie ma duplikatów (ta sama para invoiceNumber + sellerNIP).

import { duplicateCheckRule } from '@ksefnik/core'
PoleWarunek
invoiceNumber + sellerNIPunikalna kombinacja w context.allInvoices
import { validateInvoices, duplicateCheckRule } from '@ksefnik/core'
const invoices = [
{ invoiceNumber: 'FV/001', sellerNIP: '5213456789', /* ... */ },
{ invoiceNumber: 'FV/001', sellerNIP: '5213456789', /* ... */ }, // duplikat!
]
const reports = validateInvoices(invoices, [duplicateCheckRule])
// reports[1].results[0].message: "Duplicate invoice: FV/001 from 5213456789"

Sprawdza, czy waluta faktury to PLN.

import { currencyValidRule } from '@ksefnik/core'
PoleWarunek
currency=== 'PLN'
WalutaWynik
PLNvalid
EURinvalid
USDinvalid

Sprawdza, czy ilość w pozycjach faktury jest dodatnia.

import { quantityPositiveRule } from '@ksefnik/core'
PoleWarunek
lineItems[].quantity> 0 (jeśli podane)

Reguła sprawdza każdą pozycję osobno i zwraca osobny wynik dla każdej:

// lineItems: [{ quantity: 5, ... }, { quantity: 0, ... }]
// results: [
// { valid: true, rule: 'quantity-positive', field: 'lineItems[1].quantity' },
// { valid: false, rule: 'quantity-positive', field: 'lineItems[2].quantity',
// message: 'Quantity must be positive: 0' },
// ]

Sprawdza, czy opisy pozycji nie przekraczają 256 znaków.

import { descriptionLengthRule } from '@ksefnik/core'
PoleWarunek
lineItems[].description<= 256 znaków

Sprawdza format referencji KSeF, jeśli jest podana.

import { ksefReferenceFormatRule } from '@ksefnik/core'
PoleWarunek
ksefReferencepasuje do /^\d+-\d{8}-[A-Z0-9]+$/ (jeśli podane)
ReferencjaWynik
1234567890-20260301-ABCDEF123456valid
123-20260301-ABCvalid
ABC-20260301-123invalid (cyfry na początku)
(brak)valid (pomijane)
import { validateInvoices, allRules } from '@ksefnik/core'
const reports = validateInvoices(invoices, allRules)
for (const report of reports) {
const errors = report.results.filter(r => !r.valid)
if (errors.length > 0) {
console.log(`${report.invoice.invoiceNumber}: ${errors.map(e => e.rule).join(', ')}`)
}
}