> ## Documentation Index
> Fetch the complete documentation index at: https://docs.lunarphp.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Discounts

```php theme={null}
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\BuyXGetY` |
| `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

```php theme={null}
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,
])
```

### Fetching a discount

The following scopes are available:

```php theme={null}
/**
* Query for discounts using the `start_at` and `end_at` dates.
 */
Discount::active()->get();

/**
* Query for discounts where the `uses` column is less than the `max_uses` column or `max_uses` is null.
 */
Discount::usable()->get();

/**
* Query for discounts where the associated products are of a certain type, based on given product ids.
 */
Discount::products($productIds, $type = 'condition');
```

### Resetting the discount cache

For performance reasons the applicable discounts are cached per request. If you need to reset this cache (for example after adding a discount code) you should call `resetDiscounts()`:

```php theme={null}
Discount::resetDiscounts();
```

## 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 activate
* `reward` - Once the conditions are met, discount one of more of these purchasable models.

```php theme={null}
Lunar\Models\DiscountPurchasable
```

| Field | Description | Example |
| :- | :- | :- |
| `id` | | |
| `discount_id` | | |
| `purchasable_type` | | `product_variant` |
| `type` | `condition` or `reward` | |
| `created_at` | | |
| `updated_at` | | |

### Relationships

* Purchasables `discount_purchasables`
* Users - `customer_user`

### Adding your own Discount type

```php theme={null}
<?php

namespace App\DiscountTypes;

use Lunar\Models\Cart;
use Lunar\DiscountTypes\AbstractDiscountType;

class MyCustomDiscountType extends AbstractDiscountType
{
    /**
     * Return the name of the discount.
     *
     * @return string
     */
    public function getName(): string
    {
        return 'Custom Discount Type';
    }

    /**
     * Called just before cart totals are calculated.
     *
     * @return Cart
     */
    public function apply(Cart $cart): Cart
    {
        // ...
        return $cart;
    }
}
```

```php theme={null}
use Lunar\Facades\Discounts;

Discounts::addType(MyCustomDiscountType::class);
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.