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

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 rate

Vytvorené 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 line

Sú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();     // Money

Ako 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 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.