ldc-boutique-cnc-sable/app/Models/Discount.php
Jérémy Munsch cfac370e2e
feat(discount): implement published discounts filtering logic
Added logic to filter published discounts, including those with null start or end dates.
2026-10-29 19:19:22 +01:00

70 lines
2.1 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Models;
use App\Casts\DiscountValueCast;
use Domain\Enums\DiscountType;
use Illuminate\Database\Eloquent\Attributes\Fillable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Support\Facades\Date;
/**
* @property int $id
* @property DiscountType $type
* @property \Domain\Models\ValueObjects\DiscountValue $value
* @property bool $is_old_price_displayed Should the old price be displayed ?
* @property \Illuminate\Support\Carbon|null $date_start
* @property \Illuminate\Support\Carbon|null $date_end
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Product> $products
*
* @method static Builder<static>|Discount published()
*
* @mixin \Eloquent
*/
#[Fillable([
'type',
'is_old_price_displayed',
'date_start',
'date_end',
])]
class Discount extends Model
{
#[\Override]
protected function casts(): array
{
return [
'type' => DiscountType::class,
'value' => DiscountValueCast::class,
'is_old_price_displayed' => 'bool',
'date_start' => 'datetime',
'date_end' => 'datetime',
];
}
/**
* @param \Illuminate\Database\Eloquent\Builder<static> $query
* @return \Illuminate\Database\Eloquent\Builder<static>
*/
protected function scopePublished(Builder $query): Builder
{
return $query
->where(function (Builder $q): void {
$q->whereNull('date_start')->orWhere('date_start', '<=', Date::now());
})
->where(function (Builder $q): void {
$q->whereNull('date_end')->orWhere('date_end', '>=', Date::now());
});
}
/** @return \Illuminate\Database\Eloquent\Relations\HasMany<\App\Models\Product,$this> */
public function products(): HasMany
{
return $this->hasMany(Product::class);
}
}