NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Credits for Laravel

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 0

Limit 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.50

Na 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 kryptomien

Odoslaní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.