Vlastné meny a výmena
Vlastné meny poskytuje money-for-laravel. Deklarujte ich v jeho konfigurácii:
// config/money.php — inside 'currencies'
'custom' => [
'PTS' => ['exponent' => 0, 'name' => 'Loyalty points', 'symbol' => 'pts'],
],Alebo ich zaregistrujte v kóde, v boot() vášho providera:
use RoundlyConsulting\Money\Currency;
use RoundlyConsulting\Money\Facades\Currencies;
// In your AppServiceProvider::boot()
Currencies::register(Currency::custom('PTS', 0, 'Loyalty points'));Balík vyhodnocuje credits.currencies lenivo, pri prvom použití, takže registrácia v provideri, ktorý sa spustí až po providerovi kreditov, bude prijatá. Potom skupine priraďte kód a používajte ju:
// config/credits.php
'currencies' => ['points' => 'PTS'],
// anywhere
$points = Credits::for($user)->bucket('points');
$points->addMoney(Money::ofMinor(1250, 'PTS'), 'order reward');
$points->money()->minor(); // "1250"
$points->format(); // "1250" — PTS has exponent 0Limit presnosti
Stĺpec knihy pohybov je 64-bitové celé číslo so znamienkom, takže skupina v mene pojme najviac 9223372036854775807 najmenších jednotiek. Pri bežných menách a bodoch je to nepodstatné, no mena s 18 desatinnými miestami, ako ETH, končí približne pri 9,22 jednotky — veľké kryptozostatky veďte v hrubšej vlastnej jednotke (s nižším exponentom). Suma mimo rozsahu vyhodí AmountOverflow z money a nič nezapíše.
Recept: výmena bodov za peniaze
Balík medzi skupinami neprevádza, no s výmennou vrstvou money je pevný kurz výmeny otázkou dvoch riadkov — tu 100 bodov = 1 EUR:
use RoundlyConsulting\Money\Exchange\Converter;
use RoundlyConsulting\Money\Exchange\Providers\ArrayExchangeRateProvider;
$redemption = new Converter(new ArrayExchangeRateProvider(['PTS/EUR' => '0.01'], pivot: null));
$eur = $redemption->convert(Credits::for($user)->bucket('points')->money(), 'EUR', rounding: \RoundingMode::TowardsZero);
// 1250 PTS -> Money EUR 12.50Na presun hodnoty odpíšte jednu skupinu a pripíšte druhú v jednej transakcii — každý zápis stále prechádza ochranou pred prečerpaním:
use Illuminate\Support\Facades\DB;
DB::transaction(function () use ($user, $redemption): void {
$points = Credits::for($user)->bucket('points');
$balance = $points->money();
$eur = $redemption->convert($balance, 'EUR', rounding: \RoundingMode::TowardsZero);
$points->deductMoney($balance, 'redeemed for store credit');
Credits::for($user)->bucket('store_credit')->addMoney($eur, 'redeemed from points');
});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 kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
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.