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

Rozdeľovanie súm

Rozdeľte sumu bez toho, aby sa stratila alebo pribudla najmenšia jednotka. allocate() prijíma pomery — inty, celočíselné reťazce alebo desatinné čísla. Každá časť sa od svojho presného podielu líši najviac o jednu najmenšiu jednotku a časti dokopy vždy dajú pôvodnú sumu:

$total = Money::ofMajor('100', 'EUR');

[$a, $b, $c] = $total->allocate(1, 1, 1);   // 33.34, 33.33, 33.33 — sums back to 100.00
$total->allocate(70, 30);                   // 70.00, 30.00
$total->allocate('0.5', '0.25', '0.25');    // 50.00, 25.00, 25.00 — decimal ratios work too
$total->split(3);                           // same as allocate(1, 1, 1)

Money::ofMajor('30', 'EUR')->ratioTo(Money::ofMajor('120', 'EUR')); // Ratio 1/4, exact

Ako to funguje

  • Každý podiel je ⌊|suma| × pomer / Σ pomerov⌋; zvyšné jednotky dostanú po jednej časti s najväčším presným zvyškom, pri zhode tá s nižším indexom.
  • Znamienko sa aplikuje až potom, takže záporné sumy sa delia symetricky.
  • Časti s nulovým pomerom dostanú nulu.
  • split($parts) je allocate() s rovnakými pomermi, pre 1 až 10 000 častí.
  • Žiadne pomery, záporný pomer alebo nulový súčet vyhodia InvalidAllocation.

Zľava objednávky na položky

DiscountAllocator rozpočíta zľavu celej objednávky na súčty položiek tou istou metódou najväčších zvyškov, váženou sumami položiek. Podiely dajú dokopy presne výšku zľavy a žiadny podiel nikdy neprekročí svoju položku:

use RoundlyConsulting\Money\Discounts\DiscountAllocator;

$shares = app(DiscountAllocator::class)->allocate(
    Money::ofMajor('10', 'EUR'),   // the order-level discount
    Money::ofMajor('30', 'EUR'),   // line totals…
    Money::ofMajor('20', 'EUR'),
    Money::ofMajor('50', 'EUR'),
);
// 3.00, 2.00, 5.00 EUR — the shares sum to the discount, and 0 ≤ share ≤ line

Zľava vyššia ako všetky položky spolu vyhodí InvalidDiscount; zmiešané meny vyhodia CurrencyMismatch. Alokátor je zaregistrovaný ako singleton.

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.