# Discounts
# Overview
// ...
# Discounts
Lunar\Models\Discount
Field | Description | Example |
---|---|---|
id | ||
name | The given name for the discount | |
handle | The unique handle for the discount | |
type | The type of discount | Lunar\DiscountTypes\Coupon |
data | JSON | Any data to be used by the type class |
starts_at | The datetime the discount starts (required) | |
ends_at | The datetime the discount expires, if NULL it won't expire | |
uses | How many uses the discount has had | |
max_uses | The maximum times this discount can be applied storewide | |
priority | The order of priority | |
stop | Whether this discount will stop others after propagating | |
created_at | ||
updated_at |
# Creating a discount
Lunar\Models\Discount::create([
'name' => '20% Coupon',
'handle' => '20_coupon',
'type' => 'Lunar\DiscountTypes\Coupon',
'data' => [
'coupon' => '20OFF',
'min_prices' => [
'USD' => 2000 // $20
],
],
'starts_at' => '2022-06-17 13:30:55',
'ends_at' => null,
'max_uses' => null,
])
# Discount Purchasable
You can relate a purchasable to a discount via this model. Each has a type for whether it's a condition
or reward
.
condition
- If your discount requires these purchasable models to be in the cart to activatereward
- Once the conditions are met, discount one of more of these purchasable models.
Lunar\Models\DiscountPurchasable
Field | Description | Example |
---|---|---|
id | ||
discount_id | ||
purchasable_type | Lunar\Models\ProductVariant | |
type | condition or reward | |
created_at | ||
updated_at |
# Relationships
- Purchasables
discount_purchasables
- Users -
customer_user
# Usage
Fetching applied discounts
use Lunar\Facades\Discounts;
$appliedDiscounts = Discounts::getApplied();
This will return a collection of discounts which are applied to the current cart.
foreach ($appliedDiscounts as $item) {
// Lunar\Base\DataTransferObjects\CartDiscount
$item->cartLine; // Lunar\Models\CartLine
$item->discount; // Lunar\Models\Discount
}
Each cart line will also have a discount
property populated with the model of the applied discount.
foreach ($cart->lines as $line) {
$line->discount; // Lunar\Models\Discount;
}
TIP
These aren't database relationships and will only persist for the lifecycle of the each request.
# Adding your own Discount type
namespace App\Discounts;
use Lunar\Base\DataTransferObjects\CartDiscount;
use Lunar\DataTypes\Price;
use Lunar\Facades\Discounts;
use Lunar\Models\CartLine;
use Lunar\Models\Discount;
class CustomDiscount
{
protected Discount $discount;
/**
* Set the data for the discount to user.
*
* @param array $data
* @return self
*/
public function with(Discount $discount): self
{
$this->discount = $discount;
return $this;
}
/**
* Return the name of the discount.
*
* @return string
*/
public function getName(): string
{
return 'Custom Discount';
}
/**
* Called just before cart totals are calculated.
*
* @return CartLine
*/
public function execute(CartLine $cartLine): CartLine
{
$data = $this->discount->data;
// Return the unaltered cart line back
if (! $conditionIsMet) {
return $cartLine;
}
$cartLine->discount = $this->discount;
$cartLine->discountTotal = new Price(
$cartLine->unitPrice->value * $discountQuantity,
$cartLine->cart->currency,
1
);
Discounts::addApplied(
new CartDiscount($cartLine, $this->discount)
);
return $cartLine;
}
}
Discounts::addType(
CustomDiscount::class
);