ctrlpanel/app/Models/Coupon.php

120 lines
2.6 KiB
PHP
Raw Normal View History

2023-05-17 16:17:51 +00:00
<?php
namespace App\Models;
use App\Settings\CouponSettings;
2023-05-17 16:17:51 +00:00
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Spatie\Activitylog\LogOptions;
use Spatie\Activitylog\Traits\LogsActivity;
2023-05-17 16:17:51 +00:00
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
2023-05-17 16:17:51 +00:00
class Coupon extends Model
{
use HasFactory, LogsActivity;
public function getActivitylogOptions(): LogOptions
{
return LogOptions::defaults()
->logOnlyDirty()
->logOnly(['*'])
->dontSubmitEmptyLogs();
}
2023-05-17 16:17:51 +00:00
2023-05-18 14:33:42 +00:00
/**
* @var string[]
*/
2023-05-17 16:17:51 +00:00
protected $fillable = [
'code',
'type',
'value',
'uses',
'max_uses',
'expires_at'
];
2023-05-18 14:33:42 +00:00
/**
* @var string[]
*/
protected $casts = [
'value' => 'float',
'uses' => 'integer',
'max_uses' => 'integer',
'expires_at' => 'timestamp'
];
2023-05-17 16:17:51 +00:00
/**
* Returns the date format used by the coupons.
*
* @return string
*/
public static function formatDate(): string
{
return 'Y-MM-DD HH:mm:ss';
}
/**
* Returns the current state of the coupon.
*
* @return string
*/
public function getStatus()
{
if ($this->uses >= $this->max_uses) {
return 'USES_LIMIT_REACHED';
}
if (!is_null($this->expires_at)) {
if ($this->expires_at <= Carbon::now(config('app.timezone'))->timestamp) {
2023-05-17 16:17:51 +00:00
return __('EXPIRED');
}
}
return __('VALID');
}
/**
* Check if a user has already exceeded the uses of a coupon.
*
* @param User $user The request being made.
2023-05-17 16:17:51 +00:00
*
* @return bool
*/
public function isMaxUsesReached($user): bool
2023-05-17 16:17:51 +00:00
{
$coupon_settings = new CouponSettings;
$coupon_uses = $user->coupons()->where('id', $this->id)->count();
2023-05-17 16:17:51 +00:00
return $coupon_uses >= $coupon_settings->max_uses_per_user;
2023-05-17 16:17:51 +00:00
}
/**
* Generate a specified quantity of coupon codes.
*
* @param int $amount Amount of coupons to be generated.
*
* @return array
*/
public static function generateRandomCoupon(int $amount = 10): array
{
$coupons = [];
for ($i = 0; $i < $amount; $i++) {
$random_coupon = strtoupper(bin2hex(random_bytes(3)));
$coupons[] = $random_coupon;
}
return $coupons;
}
/**
* @return BelongsToMany
*/
public function users()
{
return $this->belongsToMany(User::class, 'user_coupons');
}
}