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

Skupiny v mene

Skupina môže byť vedená v mene z money-for-laravel. Jej celé čísla sú potom najmenšie jednotky tejto meny — centy pre EUR, celé body pre vlastnú PTS — a skupina získa pomocníky pracujúce s Money, ktoré inú menu odmietnu. Priraďte názvom skupín kódy mien:

// config/credits.php
'currencies' => [
    'store_credit' => 'EUR',
    'points' => 'PTS',   // a custom currency — see Custom currencies
],

Potom skupinu čítajte a zapisujte ako Money cez jej scope:

use RoundlyConsulting\Credits\Facades\Credits;
use RoundlyConsulting\Money\Money;

$store = Credits::for($user)->bucket('store_credit');

$store->addMoney(Money::ofMajor('25.00', 'EUR'), 'Gift card');
$store->deductMoney(Money::ofMinor(1050, 'EUR'), 'Order #42');
$store->modifyMoney(Money::ofMinor(-100, 'EUR'), 'Fee');   // a signed change

$store->money();                  // Money EUR 13.50
$store->currency();               // Currency EUR — null for a plain bucket
$store->format();                 // "13.50" — read at the EUR exponent
$store->formatMoney('en');        // money's locale formatter
$store->balance();                // 1350 — the int API is unchanged

Credits::currency('store_credit');   // Currency EUR — owner-free

Trait má tie isté pomocníky priamo na modeli:

use RoundlyConsulting\Money\Money;

$user->creditsCurrency('store_credit');   // Currency EUR   (null for a plain bucket)

$user->modifyCreditsMoney(Money::ofMajor('25.00', 'EUR'), 'gift card', bucket: 'store_credit');
$user->modifyCreditsMoney(Money::ofMinor(-1050, 'EUR'), 'order #42', bucket: 'store_credit');

$user->creditsBalanceMoney('store_credit');              // Money EUR 14.50
$user->creditsBalanceMoney('store_credit')->minor();     // "1450" — money amounts are strings
$user->creditsBalanceMoney('store_credit')->toDecimal(); // "14.50"
$user->creditsBalance(bucket: 'store_credit');           // 1450 — the int API is unchanged
$user->displayCreditsBalance('store_credit');            // "14.50" (read at the EUR exponent)
$user->formatCreditsBalance('store_credit', 'en');       // money's locale formatter (symbol + amount)

Pomocníky traitu pre Money

MetódaVraciaVyhadzuje
creditsCurrency(?string $bucket = null)?Currency — null, ak skupina nie je v zozname (alebo má priradený prázdny kód)UnknownCurrency (kód nie je zaregistrovaný), InvalidMoneyConfiguration (chybná mapa)
creditsBalanceMoney(?string $bucket = null, ?CarbonInterface $at = null)Money v mene skupiny — Money::ofMinor(creditsBalance($at, $bucket), $currency)BucketNotDenominatedException
modifyCreditsMoney(Money $amount, ?string $description = null, ?array $meta = null, bool $allowOverdraft = false, ?string $bucket = null)Nový záznam CreditBucketNotDenominatedException, CurrencyMismatch, AmountOverflow, InsufficientCreditsException
formatCreditsBalance(?string $bucket = null, ?string $locale = null)Money::format($locale) zostatkuBucketNotDenominatedException

Ako sa správajú

  • Jedna cesta zápisu. addMoney(), deductMoney(), modifyMoney() aj modifyCreditsMoney() overia menu, prevedú sumu cez Money::minorInt() a zapíšu ju celočíselnou cestou — tá istá ochrana pred prečerpaním, minimálny zostatok, zámok riadku aj udalosť CreditsModified. Každé odmietnutie nastane skôr, než sa čokoľvek zapíše.
  • Identitu meny tvorí kód + exponent (Currency::equals() z money): suma v USD do skupiny v EUR vyhodí CurrencyMismatch.
  • displayCreditsBalance() číta skupinu v mene v exponente meny a v ňom ju aj zobrazí, pokiaľ scale neurčí inak. displayCredits() skupinu neprijíma, takže vždy použije credits.scale.
  • Aj predvolená skupina môže byť v mene, ak ju credits.currencies uvádza — pomocníky potom fungujú bez argumentu bucket.
  • Bežné skupiny fungujú ďalej vedľa nich; celočíselné API (creditsBalance(), modifyCredits()) sa pre skupiny v mene nemení.
use RoundlyConsulting\Money\Exceptions\CurrencyMismatch;

try {
    $user->modifyCreditsMoney(Money::ofMajor('5.00', 'USD'), 'refund', bucket: 'store_credit');
} catch (CurrencyMismatch $e) {
    // a USD amount into an EUR bucket — nothing was written
}

$user->creditsBalanceMoney('promotional'); // throws BucketNotDenominatedException (a plain bucket)

Historické zostatky a škála zobrazenia

creditsBalanceMoney() aj displayCreditsBalance() prijímajú okamih a prepísanie škály či zaokrúhľovania vychádza z exponentu meny:

$user->creditsBalanceMoney('store_credit', now()->subMonth());          // Money at a past moment
$user->displayCreditsBalance('store_credit', scale: 0);                  // "15" — rounded at the display scale
$user->displayCreditsBalance('store_credit', scale: 4);                  // "14.5000"

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.