---
title: "Výmenné kurzy — Money for Laravel | Roundly"
description: "Explicitný prevod cez drivery config, database, ECB či chain, presné krížové kurzy, manuálne kurzy, vlastné drivery a nastavenie pre produkciu."
url: https://roundly-consulting.com/sk/open-source/navody/money-for-laravel/vymenne-kurzy
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Money for Laravel](https://roundly-consulting.com/sk/open-source/navody/money-for-laravel.md)

# Výmenné kurzy

Aritmetika nikdy neprevádza meny implicitne. Prevod je explicitné volanie, ktoré si vyžiada kurz od nastaveného drivera a zaokrúhli raz (money.exchange.rounding, predvolene half\_even):

```php
use RoundlyConsulting\Money\Currency;
use RoundlyConsulting\Money\Facades\Exchange;

$money = Money::ofMajor('10', 'EUR');

$money->convertTo('USD');                                      // default driver (ecb), latest rate
$money->convertTo('USD', now()->subDay());                     // historical
$money->convertTo('USD', rounding: RoundingMode::HalfAwayFromZero);

$conversion = Exchange::convertWithRate($money, 'CZK');
$conversion->original;    // 10.00 EUR
$conversion->converted;   // the CZK amount
$conversion->rate;        // ExchangeRate: from, to, rate (a Ratio), date, source

Exchange::rate(Currency::of('EUR'), Currency::of('USD'));      // default driver
Exchange::driver('database')->rate(Currency::of('EUR'), Currency::of('USD'));
```

## Drivery

| Driver | Trieda | Správanie |
| --- | --- | --- |
| `config` | `ArrayExchangeRateProvider` | Statické kurzy z exchange.providers.config.rates — priamy, inverzný, potom triangulácia cez pivot. Dátum ignoruje: odpovie pre akýkoľvek dátum a nikdy nezastará. |
| `database` | `DatabaseExchangeRateProvider` | Najnovší riadok k dátumu alebo pred ním, priamy alebo inverzný; cez pivot, ak chýba alebo je zastaraný. Vyžaduje publikovanú migráciu. |
| `ecb` | `EcbExchangeRateProvider` | Referenčné kurzy ECB voči euru — denný feed pre najnovší kurz, 90-dňový pre nedávne dátumy. Cachované, bez nastavovania a zároveň zdroj aktualizácie. |
| `chain` | `ChainExchangeRateProvider` | Skúša exchange.chain v poradí; na ďalší driver prejde len pri „žiadny kurz“ a „zlyhalo načítanie“. |

```php
// config/money.php
'exchange' => [
    'default' => env('MONEY_EXCHANGE_DRIVER', 'ecb'),
    'chain' => ['database', 'ecb'],   // what the chain driver tries, in order
    'pivot' => 'EUR',                 // triangulation currency for config + database
    'providers' => [
        'config' => [
            'rates' => [
                'EUR' => ['USD' => '1.0854', 'CZK' => '25.10'],   // decimal strings
            ],
        ],
    ],
],
```

Zadaný dátum sa číta ako jeho vlastný kalendárny deň — Y-m-d dátumu v jeho vlastnom časovom pásme, presne tak, ako sa kurz zapisuje — a money.exchange.timezone určuje, čo je „dnes“ pri vyhľadávaní bez dátumu. Drivery database a ecb použijú najnovší kurz k tomuto dňu alebo pred ním — víkendy, sviatky aj požiadavky pred zverejnením ECB okolo 16:00 SEČ teda použijú posledný zverejnený deň —, odmietnu deň, ktorý ešte nezačal, a najnovší kurz starší ako max\_age\_days považujú za zastaraný, namiesto toho, aby ho používali donekonečna. Driver config dátum ignoruje: odpovie pre akýkoľvek dátum a nikdy nezastará.

## Presné kurzy

```php
use RoundlyConsulting\Money\Exchange\ExchangeRate;

$eurUsd = ExchangeRate::fromDecimal('EUR', 'USD', '1.0854', now(), source: 'manual');
$usdJpy = ExchangeRate::fromDecimal('USD', 'JPY', '147.25', now());

$eurUsd->rate;                                 // Ratio 5427/5000 — exact, never a float
$eurUsd->invert();                             // USD → EUR, exact
$eurUsd->through($usdJpy);                     // exact cross rate EUR → USD → JPY
$eurUsd->convert(Money::ofMajor('10', 'EUR')); // 10.85 USD — one rounding (HalfEven)
$eurUsd->decimal(4);                           // "1.0854"
```

Kurzy sú typu Ratio — nikdy nie floaty ani vopred zaokrúhlené desatinné čísla — takže krížové kurzy ECB aj inverzie zostávajú presné a zaokrúhli sa až výsledná prevedená suma.

## Nastavenie pre produkciu

Predvolený driver je ecb, pretože tabuľka kurzov sa len publikuje. V produkcii ukladajte kurzy lokálne a ECB nechajte ako zálohu:

```bash
php artisan vendor:publish --tag="money-migrations"
php artisan migrate

# .env
MONEY_EXCHANGE_DRIVER=chain      # database first, ECB as the fallback
MONEY_EXCHANGE_SCHEDULE=true     # refresh from the ECB at 16:30 Berlin time on weekdays
```

## Manuálne kurzy

```php
use RoundlyConsulting\Money\Facades\Exchange;

Exchange::rates()->manual('EUR', 'CZK', '25.10');          // effective today in money.exchange.timezone
Exchange::rates()->manual('EUR', 'CZK', '25.10', $date);   // or on a given date
```

Každý zápis — manuálne kurzy aj aktualizácie — ide jedinou cestou, cez StoreExchangeRatesAction za metódami Exchange::rates()->store() a manual(). Robí upsert podľa (základná mena, kótovaná mena, dátum platnosti); manuálny riadok aktualizácia nikdy neprepíše a kurz bez presného desatinného zápisu do 40 znakov sa odmietne, nie zaokrúhli. Dvojité spustenie aktualizácie ponechá jeden riadok na pár a dátum. Celé API rates() nájdete v sekcii Fasády Exchange a Currencies.

## Vlastné drivery

```php
use Carbon\CarbonInterface;
use RoundlyConsulting\Money\Contracts\ExchangeRateProvider;
use RoundlyConsulting\Money\Contracts\ExchangeRateSource;
use RoundlyConsulting\Money\Currency;
use RoundlyConsulting\Money\Exchange\ExchangeRate;
use RoundlyConsulting\Money\Facades\Exchange;

final class FixerProvider implements ExchangeRateProvider, ExchangeRateSource
{
    public function __construct(private FixerClient $client) {}   // your own API client

    public function rate(Currency $from, Currency $to, ?CarbonInterface $on = null): ExchangeRate
    {
        $decimal = $this->client->rate($from->code, $to->code, $on);   // e.g. "1.0854"

        return ExchangeRate::fromDecimal($from, $to, $decimal, $on ?? now(), source: 'fixer');
    }

    public function name(): string
    {
        return 'fixer';
    }

    public function fetch(CarbonInterface $from, CarbonInterface $to): iterable
    {
        foreach ($this->client->timeseries($from, $to) as $row) {
            yield ExchangeRate::fromDecimal($row['base'], $row['quote'], $row['rate'], $row['date'], source: 'fixer');
        }
    }
}

// In a service provider's boot()
Exchange::extend('fixer', fn ($app) => new FixerProvider($app->make(FixerClient::class)));
```

Drivery aplikácie sa cachujú automaticky. Ak implementujú aj ExchangeRateSource, príkaz money:rates:refresh fixer ich dokáže stiahnuť do tabuľky kurzov.

## Cache a tabuľka kurzov

Drivery database, ecb a vlastné sa pri zapnutom exchange.cache.enabled obalia cache — cachujú sa len úspešné vyhľadávania, uložené ako skaláry. Každý zápis do tabuľky kurzov — store(), manual(), aktualizácia aj prune — cachované vyhľadávania zneplatní, takže ďalší prevod načíta nové riadky. Feed ECB sa cachuje na providers.ecb.cache\_ttl, aktualizácia ho však vždy stiahne nanovo. Tabuľka money\_exchange\_rates ukladá kurzy ako presné desatinné reťazce; jej model CurrencyRate je vymeniteľný cez exchange.providers.database.model a ponúka scopes pair() a effectiveOnOrBefore().

## Prejavte lásku k open source

Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.

[Ďalšie spôsoby podpory vrátane kryptomien](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## Chcete to zabudovať do svojho produktu?

Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/money-for-laravel.md)
