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:
- 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ń;
- ś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:
| Operacja | Data operacji | Kurs |
|---|---|---|
| Wystawienie faktury sprzedaży w EUR | Data wystawienia | NBP Tabela A z dnia poprzedzającego |
| Otrzymanie faktury zakupu w USD | Data wystawienia faktury | NBP Tabela A z dnia poprzedzającego |
| Powstanie obowiązku podatkowego VAT | Data obowiązku | NBP 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
getNbpRatew 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:
- 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 (...);
- 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:
| Data | Kurs | PLN | Strona księgi |
|---|---|---|---|
| 15 stycznia (wystawienie) | 4,3000 | 4 300,00 | Dt 201 / Ct 700 |
| 10 lutego (zapłata) | 4,3500 | 4 350,00 | Dt 130 4 350,00 / Ct 201 4 300,00 |
| 50,00 zysk | Ct 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:
- Dla PLN zwraca od razu kurs 1,0.
- Dla innych walut — szuka kursu dla dnia poprzedzającego
invoiceDate. - Jeśli ten dzień to weekend / święto — cofając się dzień po dniu do 7 dni wstecz, aż znajdzie opublikowaną tabelę.
- Odpowiada z pola
midz API NBP, cachuje wynik w tabeliexchange_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
- Phase 3a
Pierwsza wersja — oparta na aktualnym tekście art. 30 UoR (Dz.U. 2023 poz. 120) oraz implementacji
nbp-exchange-rates.tsipayment-journal.ts.
Art. 25 UoR — Ślad rewizyjny (storno, brak usuwania)
Audit trail ksiąg rachunkowych — poprawianie błędów wyłącznie przez storno (zapisy dodatnie lub ujemne) przy prowadzeniu ksiąg komputerem, zakaz usuwania i nadpisywania zapisów. Realizacja w Numify.
Art. 31–33 UoR — Środki trwałe
Wartość początkowa środka trwałego (art. 31 ust. 1), odpisy amortyzacyjne i umorzeniowe (art. 31 ust. 2), systematyczne rozłożenie na okres ekonomicznej użyteczności (art. 32 ust. 1–2), uproszczenia dla ŚT o niskiej wartości (art. 32 ust. 6), odpowiednie stosowanie do wartości niematerialnych i prawnych (art. 33). Reżim bilansowy vs podatkowy (CIT art. 16a–16m). Realizacja w Numify.