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-freeTrait 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óda | Vracia | Vyhadzuje |
|---|---|---|
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 Credit | BucketNotDenominatedException, CurrencyMismatch, AmountOverflow, InsufficientCreditsException |
formatCreditsBalance(?string $bucket = null, ?string $locale = null) | Money::format($locale) zostatku | BucketNotDenominatedException |
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 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.