Objednávky a ceny
Objednávka má položky, voliteľný kupón, vygenerované číslo a vlastnú menu. Jej accessor price vracia DTO Price, ktoré vypočíta zľavu, dopravu, daň a konečnú sumu z položiek, zafixovanej dopravy (shipping_cost) a zafixovanej zľavy:
$price = $order->price; // RoundlyConsulting\Shops\Orders\DataTransferObjects\Price
$price->getSubtotal(); // sum of line totals (quantity-aware), before discount
$price->getDiscountValue(); // amount saved by the placed discount
$price->getPriceAfterDiscount(); // subtotal minus the discount
$price->getNetPrice(); // tax-exclusive value of the goods
$price->getTaxPrice(); // tax across the goods (after discount)
$price->shippingCost(); // the shipping charged: shipping_cost, or zero with free shipping
$price->getFinalPrice(); // what the customer pays (goods + shipping, tax-correct)
$price->taxSummary(); // money TaxSummary: net / tax / gross per rateVytvorené objednávky sa neprepočítavajú
- Zľava — cena číta zľavu zafixovanú pri vytvorení (discount, free_shipping, coupon_code). Kupón, ktorý neskôr vyprší, je zrušený alebo vyčerpaný, vytvorenú objednávku nikdy nezmení.
- Daň — každý riadok si ponechá sadzbu, s ktorou bol pridaný (order_items.tax_rate a tax_label), a objednávka si ponechá price_type, pod ktorým vznikla. Úprava sadzieb obchodu, zmena doručovacej adresy ani prepnutie shops.pricing.price_type nezmení cenu vytvorenej objednávky.
- Položka zapísaná bez zafixovanej sadzby (tax_rate null) sa zdaní aktuálnou sadzbou svojho obchodu a krajiny doručenia.
- Doprava — cena zahŕňa cenu dopravy zafixovanú pri vytvorení objednávky (shipping_cost); kupón na dopravu zdarma ju odpočíta. Neskorší výpočet pre inú adresu vytvorenú objednávku nikdy nezmení.
Cachovanie ceny
$order->price sa vypočíta raz na inštanciu modelu a cachuje sa spolu s načítanými položkami. Po zmene objednávky v pamäti (pridanie položiek, uplatnenie zľavy) zavolajte $order->refresh() pred ďalším čítaním ceny — a aj predtým, než ju odovzdáte StoreCreditTender, ktorý strhne cenu, ktorú prečíta. Shops::order($order)->charge() pred platbou znova načíta uloženú objednávku pod zámkom jej riadku. checkout() už vracia obnovenú objednávku:
use RoundlyConsulting\Money\Money;
use RoundlyConsulting\Shops\Orders\Item;
$order->price->getFinalPrice(); // computed and cached on this instance
Item::create([
'order_id' => $order->id,
'name' => 'Gift wrap',
'quantity' => 1,
'price' => Money::ofMinor(300, 'EUR'), // must match the order's currency
]);
$order->refresh(); // drop the cached price and items
$order->price->getFinalPrice(); // now includes the new lineSúhrn dane
$summary = $order->price->taxSummary();
$summary->perRate(); // net / tax / gross grouped per rate — an invoice VAT table
$summary->net(); // Money
$summary->tax(); // Money
$summary->gross(); // MoneyAko sa počíta daň
- Zľava na celú objednávku sa najprv rozloží na riadky pomerne k ich súčtom cez DiscountAllocator z balíka money — podiely dajú presne celú zľavu.
- Každý riadok sa potom zdaní raz zo sumy po zľave cez TaxRate z balíka money — gross: základ − round(základ × 100 / (100 + sadzba)); net: round(základ × sadzba).
- Zaokrúhľuje sa polovica smerom od nuly cez bcmath — bez floatov. Katalóg s cenami s daňou vždy spĺňa cena bez dane + daň = cena po zľave.
- gross (predvolené) daň z ceny vyčlení; net ju pripočíta. Dopravu tento výpočet nikdy nezdaňuje.
Cena ľubovoľných riadkov
Price môžete vytvoriť aj priamo a oceniť tak ľubovoľné riadky alebo pridať dopravu:
use RoundlyConsulting\Money\Money;
use RoundlyConsulting\Shops\Orders\DataTransferObjects\Price;
use RoundlyConsulting\Shops\Orders\DataTransferObjects\PriceLine;
use RoundlyConsulting\Shops\Orders\Enums\PriceType;
$price = new Price(
lines: [new PriceLine(unitPrice: Money::ofMinor(1000, 'EUR'), quantity: 2, taxClass: 'standard')],
shipping: Money::ofMinor(490, 'EUR'),
priceType: PriceType::Gross, // or PriceType::Net
taxResolver: null, // defaults to app(TaxResolver::class)
discount: Money::ofMinor(300, 'EUR'),
freeShipping: false,
currency: 'EUR', // the currency of an empty price
shop: null,
country: null,
);
$price->getFinalPrice(); // 21.90 EUR — 20.00 - 3.00 discount + 4.90 shipping (gross)Doprava v celkovej sume
Cena vytvorenej objednávky už dopravu zahŕňa: pri vytvorení objednávky sa vypočíta cena dopravy na doručovaciu adresu (alebo sa použije zvolené shippingCost) a zafixuje sa ako shipping_cost — pozrite Vytváranie objednávok. $order->price->shippingCost() je účtovaná doprava: shipping_cost, alebo nula, ak platí kupón na dopravu zdarma. Shops::order($order)->quoteShipping() ocení inú adresu bez zmeny objednávky.
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.