Files
2026-06-24 18:30:00 +08:00

92 lines
2.4 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
class Prize extends Model
{
use HasFactory;
public const STATUS_BELUM = 'belum_dicabut';
public const STATUS_SEDANG = 'sedang_dicabut';
public const STATUS_DISAHKAN = 'disahkan';
public const STATUS_REDRAW = 'redraw_required';
public const STATUS_LABELS = [
self::STATUS_BELUM => 'Belum Dicabut',
self::STATUS_SEDANG => 'Sedang Dicabut',
self::STATUS_DISAHKAN => 'Disahkan',
self::STATUS_REDRAW => 'Perlu Cabut Semula',
];
protected $attributes = [
'status' => self::STATUS_BELUM,
'item_index' => 1,
'draw_order' => 0,
'redraw_count' => 0,
];
protected $fillable = [
'kod_hadiah',
'nama_hadiah',
'kategori',
'nilai_anggaran',
'draw_order',
'item_index',
'batch_kod',
'status',
'redraw_count',
];
protected function casts(): array
{
return [
'nilai_anggaran' => 'decimal:2',
'draw_order' => 'integer',
'item_index' => 'integer',
'redraw_count' => 'integer',
];
}
public function drawResults(): HasMany
{
return $this->hasMany(DrawResult::class);
}
public function confirmedResult(): HasMany
{
return $this->hasMany(DrawResult::class)->where('status', DrawResult::STATUS_CONFIRMED);
}
public function statusLabel(): string
{
return self::STATUS_LABELS[$this->status] ?? $this->status;
}
/** Nama paparan termasuk nombor item bila kuantiti > 1 cth "Hamper #3" */
public function displayName(): string
{
return $this->nama_hadiah;
}
/** Hadiah yang masih boleh dicabut (belum ada pemenang disahkan) */
public function isAvailable(): bool
{
return in_array($this->status, [self::STATUS_BELUM, self::STATUS_REDRAW], true);
}
public function scopeAvailable(Builder $query): Builder
{
return $query->whereIn('status', [self::STATUS_BELUM, self::STATUS_REDRAW]);
}
public function scopeOrdered(Builder $query): Builder
{
return $query->orderBy('draw_order')->orderBy('item_index')->orderBy('id');
}
}