---
title: "Art. 30 UoR — Kursy walut obcych"
description: "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."
url: https://numifyai.com/docs/zgodnosc-z-prawem/ustawa-o-rachunkowosci/art-30-kursy-walut
review_status: internal
updated: 2026-04-16
---


Księgi rachunkowe prowadzi się w złotych polskich
(<LegalRef act="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.

<ComplianceDisclaimer />

## Zasada ogólna — art. 30 ust. 2 [#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 [#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 [#kiedy-średni-nbp-z-dnia-poprzedzającego]

W pozostałych przypadkach — w tym &#x2A;*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 `getNbpRate` w
> <ServiceRef path="src/lib/services/nbp-exchange-rates.ts">nbp-exchange-rates.ts</ServiceRef>.

## Wycena na dzień bilansowy — art. 30 ust. 1 [#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--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 <AccountRef code="750" name="Przychody finansowe" />
(dodatnia) lub <AccountRef code="755" name="Koszty finansowe" />
(ujemna). Numify auto-rozlicza różnice kursowe przy księgowaniu
płatności w module bankowym.

## Jak Numify realizuje art. 30 [#jak-numify-realizuje-art-30]

### Pobieranie kursów NBP [#pobieranie-kursów-nbp]

Funkcja `getNbpRate(currencyCode, invoiceDate)` w
<ServiceRef path="src/lib/services/nbp-exchange-rates.ts">nbp-exchange-rates.ts</ServiceRef>:

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 [#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 [#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 [#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 [#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 [#częste-błędy]

* **Zastosowanie kursu z dnia operacji, nie z dnia poprzedzającego** —
  klasyczny błąd, skutkuje niewielkimi różnicami, ale narusza
  <LegalRef act="UoR" art="30" paragraph="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
  (<LegalRef act="UoR" art="30" paragraph="3" />). Numify obsługuje
  wyłącznie waluty z Tabeli A.

## Zaokrąglenia i przechowywanie w groszach [#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.

<ChangeHistory>
  <ChangeEntry date="2026-04-16" act="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`.
  </ChangeEntry>
</ChangeHistory>
