The go-to PHP IDE with extensive out-of-the-box support for Laravel and its ecosystem.

Discountify

safemood/discountify image

Discountify stats

Downloads
3
Stars
18
Open Issues
0
Forks
0

View on GitHub →

Laravel package for dynamic discounts with custom conditions.

Laravel Discountify for dynamic discounts with custom conditions.

Discountify is a Laravel package designed for managing dynamic discounts with custom conditions. It allows you to create flexible and powerful discounting strategies, easily defining conditions and applying percentage-based discounts to enhance your e-commerce application.

Installation

You can install the package via composer:

composer require safemood/discountify

You can publish the config file with:

php artisan vendor:publish --tag="discountify-config"

This is the contents of the published config file:

// config/discountify.php
return [
'condition_namespace' => 'App\\Conditions',
'condition_path' => app_path('Conditions'),
'fields' => [
'price' => 'price',
'quantity' => 'quantity',
],
'global_discount' => 0,
'global_tax_rate' => 0,
];

Usage

Define Conditions

use Illuminate\Support\ServiceProvider;
use Safemood\Discountify\Facades\Condition;
use Carbon\Carbon;
 
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
// If items are more than 2, apply a 10% discount.
Condition::define('more_than_2_products_10', fn (array $items) => count($items) > 2, 10)
// If the date is within a 7-day interval starting March 1, 2024, apply a 15% discount.
->add([
[
'slug' => 'more_than_3_products_15',
'condition' => fn ($items) => now()->between(
Carbon::createFromDate(2024, 3, 1),
Carbon::createFromDate(2024, 3, 15)->addDays(7)
),
'discount' => 15,
],
// If 'special' items are in the cart, apply a 10% discount.
[
'slug' => 'special_type_product_10',
'condition' => fn ($items) => in_array('special', array_column($items, 'type')),
'discount' => 10,
],
])
// If the user has a renewal, apply a 10% discount.
->defineIf('client_has_renewal_10', auth()->user()->hasRenewal(), 10);
}
}

Set Items, Global Discount, and Tax Rate

 
$items = [
['id' => '1', 'quantity' => 2, 'price' => 50],
['id' => '2', 'quantity' => 1, 'price' => 100, 'type' => 'special'],
];
 
// Set the items in the cart
Discountify::setItems($items)
 
// Set a global discount for all items in the cart
->setGlobalDiscount(15)
 
// Set a global tax rate for all items in the cart
->setGlobalTaxRate(19);

Calculate Total Amounts

// Calculate the total amount considering the set conditions and discounts
 
$total = Discountify::total();
 
// Calculate the total amount with the applied global discount
 
$totalWithDiscount = Discountify::totalWithDiscount();
 
// Calculate the total amount with taxes applied based on the set global tax rate
 
$totalWithTaxes = Discountify::tax();
 
// Calculate the total tax amount based on the given tax rate (19 in this case)
 
$taxAmount = Discountify::taxAmount(19);

Dynamic Field Names

// Set custom field names through configuration
return [
'global_discount' => 0,
'global_tax_rate' => 0,
'fields' => [
'quantity' => 'qty',
'price' => 'amount',
],
];
 
// Alternatively, set dynamic field names on the fly
$items = [
['id' => 'item1', 'qty' => 2, 'amount' => 20],
['id' => 'item2', 'qty' => 1, 'amount' => 20],
];
 
$discountify->setFields([
'price' => 'amount',
'quantity' => 'qty',
])->setItems($items);
 
$totalWithDiscount = $discountify->totalWithDiscount(50);

Class-Based Discounts

The classes in App\Conditions will be auto-discovered by Discountify for seamless integration—no configuration is needed.

// app/Conditions
<?php
 
namespace App\Conditions;
 
use Safemood\Discountify\Contracts\ConditionInterface;
 
class MoreThan1ProductsCondition implements ConditionInterface
{
public string $slug = 'more_than_1_products_10';
 
public int $discount = 10;
 
public function __invoke(array $items): bool
{
return count($items) > 1;
}
}

Skip Discounts Conditions

This will allows you to exclude specific conditions based on the "skip" field.

Using Condition::define:

Condition::define('condition2', fn ($items) => false, 20, true); // Will be skipped
  • Using Condition::add:
Condition::add([
['slug' => 'condition1', 'condition' => fn ($items) => true, 'discount' => 10, 'skip' => false], // Won't be skipped
['slug' => 'condition2', 'condition' => fn ($items) => false, 'discount' => 20, 'skip' => true], // Will be skipped
['slug' => 'condition3', 'condition' => fn ($items) => true, 'discount' => 30], // Will not be skipped (default skip is false)
]);
  • Using Class-Based Conditions:
namespace App\Conditions;
 
use Safemood\Discountify\Contracts\ConditionInterface;
 
class ExampleCondition implements ConditionInterface
{
public bool $skip = true; // Set to true to skip the condition
 
public string $slug = 'skipped_condition';
 
public function __invoke(array $items): bool
{
return count($items) > 5;
}
}

Event Tracking

Know when a discount is applied with customizable events. (working on it)

Testing

composer test

Changelog

Please see CHANGELOG for more information on what has changed recently.

Contributing

Please see CONTRIBUTING for details.

Security Vulnerabilities

Please review our security policy on how to report security vulnerabilities.

Credits

License

The MIT License (MIT). Please see License File for more information.

Safemood photo

Lover of anything technology-related.

Cube

Laravel Newsletter

Join 40k+ other developers and never miss out on new tips, tutorials, and more.


Safemood Discountify Related Articles

Create Dynamic Discounts with Custom Conditions on Laravel With the Discountify Package image

Create Dynamic Discounts with Custom Conditions on Laravel With the Discountify Package

Read article
Tighten logo

Tighten

We help companies turn great ideas into amazing apps, products, and services.

Tighten
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit: Laravel SaaS Starter Kit

SaaSykit is a Multi-tenant Laravel SaaS Starter Kit that comes with all features required to run a modern SaaS. Payments, Beautiful Checkout, Admin Panel, User dashboard, Auth, Ready Components, Stats, Blog, Docs and more.

SaaSykit: Laravel SaaS Starter Kit
Acquaint Softtech logo

Acquaint Softtech

Acquaint Softtech offers AI-ready Laravel developers who onboard in 48 hours at $3000/Month with no lengthy sales process and a 100 percent money-back guarantee.

Acquaint Softtech
Honeybadger logo

Honeybadger

Simple developer-focused application monitoring for Laravel. Error tracking, log management, uptime monitoring, status pages, and more!

Honeybadger
Kirschbaum logo

Kirschbaum

Providing innovation and stability to ensure your web application succeeds.

Kirschbaum
Curotec logo

Curotec

World class Laravel experts with GenAI dev skills. LATAM-based, embedded engineers that ship fast, communicate clearly, and elevate your product. No bloat, no BS.

Curotec