NumifyAI
Zgodność z prawemUstawa o rachunkowości
Zweryfikowane wewnętrznie

Art. 30 UoR — Kursy walut obcych

Wycena aktywów, pasywów i operacji wyrażonych w walutach obcych — średni kurs NBP z dnia poprzedzającego operację, wycena na dzień bilansowy, różnice kursowe jako przychody/koszty finansowe.

Księgi rachunkowe prowadzi się w złotych polskich (UoR, art. 9) — każda operacja w walucie obcej musi być przeliczona na PLN po odpowiednim kursie. Art. 30 UoR określa który kurs i z jakiego dnia należy stosować. Błąd polega najczęściej na zastosowaniu kursu z dnia operacji zamiast z dnia poprzedzającego.

Informacje mają charakter edukacyjny

Dokumentacja nie zastępuje porady doradcy podatkowego ani biegłego rewidenta. W sprawach szczegółowych skontaktuj się ze specjalistą. Jak weryfikujemy dokumentację ↗

Zasada ogólna — art. 30 ust. 2

Wyrażone w walutach obcych operacje gospodarcze ujmuje się w księgach rachunkowych na dzień ich przeprowadzenia — o ile odrębne przepisy dotyczące środków pochodzących z budżetu Unii Europejskiej (...) nie stanowią inaczej — odpowiednio po kursie:

  1. faktycznie zastosowanym w tym dniu, wynikającym z charakteru operacji — w przypadku sprzedaży lub kupna walut oraz zapłaty należności lub zobowiązań;
  2. średnim ogłoszonym dla danej waluty przez Narodowy Bank Polski z dnia poprzedzającego ten dzień — w przypadku zapłaty należności lub zobowiązań, jeżeli nie jest zasadne zastosowanie kursu, o którym mowa w pkt 1, a także w przypadku pozostałych operacji.

Kiedy kurs faktyczny

„Kurs faktycznie zastosowany" — np. kurs, po którym bank rzeczywiście przeliczył walutę przy sprzedaży/kupnie. Stosowany przy:

  • Kupnie waluty w kantorze lub banku.
  • Przelewie walutowym, gdy bank przewalutował kwotę po swoim kursie.

Kiedy średni NBP z dnia poprzedzającego

W pozostałych przypadkach — w tym dla zdecydowanej większości operacji w sp. z o.o. — stosuje się średni kurs NBP z Tabeli A z dnia poprzedzającego datę operacji. Typowe sytuacje:

OperacjaData operacjiKurs
Wystawienie faktury sprzedaży w EURData wystawieniaNBP Tabela A z dnia poprzedzającego
Otrzymanie faktury zakupu w USDData wystawienia fakturyNBP Tabela A z dnia poprzedzającego
Powstanie obowiązku podatkowego VATData obowiązkuNBP Tabela A z dnia poprzedzającego

Weekendy i święta: jeśli dzień poprzedzający to sobota, niedziela lub święto, NBP nie ogłasza tabeli. Stosuje się kurs z ostatniego dnia roboczego poprzedzającego operację (tabela A z np. piątku przed poniedziałkową operacją). Numify przeszukuje wstecz do 7 dni, aż znajdzie opublikowaną tabelę — implementacja w getNbpRate w nbp-exchange-rates.ts.

Wycena na dzień bilansowy — art. 30 ust. 1

Nie rzadziej niż na dzień bilansowy wycenia się wyrażone w walutach obcych:

  1. składniki aktywów (...) i pasywów — po obowiązującym na ten dzień średnim kursie ogłoszonym dla danej waluty przez Narodowy Bank Polski (...);
  2. gotówkę znajdującą się w jednostkach prowadzących kupno i sprzedaż walut obcych — po kursie, po którym nastąpił jej zakup, jednak w wysokości nie wyższej od średniego kursu ogłoszonego na dzień wyceny (...).

Różnice:

  • Dzień bilansowy (zwykle 31 grudnia) wymaga wyceny wszystkich pozycji walutowych (aktywów i pasywów) po kursie z dnia bilansowego — a nie z dnia poprzedzającego, jak przy normalnych operacjach.
  • Wyjątek — kasa walutowa w firmach prowadzących kantor wymienia na kurs zakupu, ograniczony do góry przez średni NBP.

Różnice kursowe — art. 30 ust. 4

Różnice kursowe (...) dotyczące pozostałych aktywów i pasywów wyrażonych w walutach obcych, powstałe na dzień ich wyceny oraz przy zapłacie należności i zobowiązań w walutach obcych, jak również sprzedaży walut, zalicza się odpowiednio do przychodów lub kosztów finansowych (...).

Różnica kursowa powstaje, kiedy ten sam walutowy składnik aktywów / pasywów ma inną wartość PLN w dwóch momentach:

  • Przy ujęciu — kurs NBP z dnia poprzedzającego wystawienie faktury.
  • Przy zapłacie — kurs faktyczny (bankowy) albo NBP z dnia poprzedzającego zapłatę.

Przykład — faktura sprzedaży na 1 000 EUR:

DataKursPLNStrona księgi
15 stycznia (wystawienie)4,30004 300,00Dt 201 / Ct 700
10 lutego (zapłata)4,35004 350,00Dt 130 4 350,00 / Ct 201 4 300,00
50,00 zyskCt 750 — różnica kursowa dodatnia

Różnica trafia na konto 750 — Przychody finansowe (dodatnia) lub 755 — Koszty finansowe (ujemna). Numify auto-rozlicza różnice kursowe przy księgowaniu płatności w module bankowym.

Jak Numify realizuje art. 30

Pobieranie kursów NBP

Funkcja getNbpRate(currencyCode, invoiceDate) w nbp-exchange-rates.ts:

  1. Dla PLN zwraca od razu kurs 1,0.
  2. Dla innych walut — szuka kursu dla dnia poprzedzającego invoiceDate.
  3. Jeśli ten dzień to weekend / święto — cofając się dzień po dniu do 7 dni wstecz, aż znajdzie opublikowaną tabelę.
  4. Odpowiada z pola mid z API NBP, cachuje wynik w tabeli exchange_rates.

Endpoint API NBP: https://api.nbp.pl/api/exchangerates/rates/a/{code}/{date}/ (wyłącznie HTTPS od sierpnia 2025 r.).

Konwersja kwoty faktury do PLN

Funkcja convertToPln(amountGrosze, rate) mnoży kwotę w groszach waluty obcej przez kurs — wynikiem jest kwota w groszach PLN. Zaokrąglanie jest matematyczne (Math.round).

Batch-fetch kursów dla importu

Funkcja prefetchNbpRateRange(currencyCode, startDate, endDate) pobiera tabelę kursów dla zakresu dat (max 93 dni per wywołanie — ograniczenie NBP). Służy do importu wyciągów bankowych z okresu dłuższego niż pojedyncza data — zamiast wielu sekwencyjnych zapytań wykonywany jest jeden masowy fetch i cache w exchange_rates.

Domyślne stawki na faktury

Kwoty walutowe przy wystawianiu faktury są automatycznie przeliczane na PLN w momencie zapisu — pola amountNetPln, amountVatPln, amountGrossPln w tabeli transactions. Przy zmianie daty wystawienia kurs jest pobierany ponownie.

Różnice kursowe przy zapłacie

Moduł płatności (payment-journal.ts) porównuje kurs przy wystawieniu z kursem przy zapłacie i księguje różnicę na kontach 750 / 755. Pokrycie testowe w payment-journal.test.ts.

Częste błędy

  • Zastosowanie kursu z dnia operacji, nie z dnia poprzedzającego — klasyczny błąd, skutkuje niewielkimi różnicami, ale narusza UoR, art. 30 ust. 2. Cały dziennik wówczas trzeba korygować przez storno.
  • Brak wyceny na dzień bilansowy — salda walutowe muszą być przewartościowane na 31 grudnia. Jeśli tego nie zrobiono, bilans jest nieprawidłowy.
  • Kurs NBP dla walut nie notowanych w Tabeli A — niektóre waluty są tylko w Tabeli B (np. GEL, MMK). W takim przypadku stosuje się kurs krzyżowy przez USD / EUR (UoR, art. 30 ust. 3). Numify obsługuje wyłącznie waluty z Tabeli A.

Zaokrąglenia i przechowywanie w groszach

Numify przechowuje wszystkie kwoty jako liczby całkowite w groszach — zarówno w walucie oryginalnej, jak i w PLN po przeliczeniu. Eliminuje to błędy zaokrągleń typowe dla typów decimal/float i gwarantuje, że dwa zapisy o tych samych kwotach są bitowo identyczne.

Kurs NBP jest przechowywany w typie decimal z 4 miejscami dziesiętnymi (zgodnie z publikacją NBP). Mnożenie grosze * rate i Math.round daje deterministyczny wynik.

Historia zmian podstawy prawnej
  1. Phase 3a

    Pierwsza wersja — oparta na aktualnym tekście art. 30 UoR (Dz.U. 2023 poz. 120) oraz implementacji nbp-exchange-rates.ts i payment-journal.ts.

Na tej stronie