Przejdź do głównej zawartości

Import wyciągu bankowego

Moduł bank obsługuje import wyciągów bankowych z 5 formatów polskich banków. Automatycznie wykrywa format pliku, parsuje kwoty na grosze i wyciąga NIP-y z tytułów przelewów.

BankFormatSeparatorKodowanieRozszerzenie
mBankCSV;Windows-1250.csv
ING Bank ŚląskiCSV;UTF-8.csv
PKO BP (iPKO)CSV,UTF-8.csv
SantanderCSV;Windows-1250.csv
DowolnyMT940 (SWIFT)—ASCII.mt940, .sta
import { createKsefnik } from '@ksefnik/core';
const ksef = createKsefnik({
config: { nip: '5213456784' },
});
// Import z pliku na dysku
const transactions = await ksef.bank.importStatement('./wyciag-marzec.csv');
console.log(`Zaimportowano ${transactions.length} transakcji`);
for (const tx of transactions) {
console.log(
`${tx.date} | ${tx.amount > 0 ? 'IN' : 'OUT'} | ${tx.amount} gr | ${tx.title}`
);
}

Możesz też zaimportować z ciągu znaków (przydatne gdy dane przychodzą z API):

const csvContent = await fetch('https://example.com/wyciag.csv').then(r => r.text());
const transactions = await ksef.bank.importStatementFromString(csvContent);

Parser analizuje plik w trzech krokach:

  1. Rozszerzenie — pliki .mt940 i .sta trafiają od razu do parsera MT940.
  2. Nagłówki CSV — parser porównuje pierwszą linię z znanymi schematami nagłówków banków.
  3. Heurystyka — jeśli nagłówki nie pasują, parser analizuje separatory, kodowanie i strukturę kolumn.

Jeśli auto-detekcja zawiedzie, możesz wymusić format:

const transactions = await ksef.bank.importStatement('./wyciag.csv', {
parser: 'mbank',
});

Ksefnik stosuje 3 strategie ekstrakcji NIP z tytułu przelewu (w kolejności priorytetów):

StrategiaWzorzecPrzykład tytułu
MPP (split payment)/VAT/...NIP/1234563218/VAT/230,00/IDC/FV/2026/03/15/NIP/1234563218
Prefiks NIPNIP: 1234563218 lub NIP 1234563218Zapłata za FV/2026/03/15 NIP: 1234563218
Surowy checksum10-cyfrowy ciąg z poprawną sumą kontrolnąPrzelew za usługi 1234563218 marzec
const transactions = await ksef.bank.importStatement('./wyciag.csv');
// Sprawdź, ile transakcji ma wykryty NIP
const withNip = transactions.filter(tx => tx.extractedNip);
console.log(`NIP wykryty w ${withNip.length}/${transactions.length} transakcjach`);

Wszystkie kwoty są konwertowane na grosze (liczby całkowite):

Wartość w plikuWynik w tx.amountKierunek
1 234,56123456przychodzący
-1 234,56-123456wychodzący
0,011przychodzący
for (const tx of transactions) {
const zlote = (Math.abs(tx.amount) / 100).toFixed(2);
const kierunek = tx.amount > 0 ? 'przychodzący' : 'wychodzący';
console.log(`${zlote} PLN (${kierunek})`);
}
  1. Zaloguj się do mBanku i pobierz wyciąg za marzec 2026 w formacie CSV.
  2. Uruchom import:
    Okno terminala
    ksefnik bank import ./mbank-marzec-2026.csv --format table
  3. Przejrzyj wynik — każda transakcja ma datę, kwotę w groszach, tytuł i (opcjonalnie) wykryty NIP.
  4. Następny krok: uzgadnianie faktur z przelewami.