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

111 lines
2.9 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;
use Illuminate\Database\Eloquent\Relations\HasOne;
class Member extends Model
{
use HasFactory;
protected $fillable = [
'no_anggota',
'no_pekerja',
'no_kp',
'nama',
'jabatan',
'bahagian',
'telefon',
'status_aktif',
];
protected function casts(): array
{
return [
'status_aktif' => 'boolean',
];
}
public function attendance(): HasOne
{
return $this->hasOne(AttendanceRecord::class);
}
public function drawResults(): HasMany
{
return $this->hasMany(DrawResult::class);
}
public function hasAttended(): bool
{
return $this->attendance()->exists();
}
/** Adakah anggota ini sudah menang & disahkan? */
public function hasConfirmedWin(): bool
{
return $this->drawResults()->where('status', DrawResult::STATUS_CONFIRMED)->exists();
}
/** No KP bertopeng untuk paparan biasa: 850101-01-**** */
public function maskedKp(): ?string
{
if (! $this->no_kp) {
return null;
}
$kp = $this->no_kp;
// Format standard 12 digit (boleh ada sempang)
$digits = preg_replace('/\D/', '', $kp);
if (strlen($digits) === 12) {
return substr($digits, 0, 6) . '-' . substr($digits, 6, 2) . '-****';
}
// Fallback: tunjukkan 4 aksara pertama, topeng selebihnya
$visible = substr($kp, 0, max(strlen($kp) - 4, 0));
return $visible . str_repeat('*', min(4, strlen($kp)));
}
public function scopeAktif(Builder $query): Builder
{
return $query->where('status_aktif', true);
}
public function scopeHadir(Builder $query): Builder
{
return $query->whereHas('attendance');
}
public function scopeBelumHadir(Builder $query): Builder
{
return $query->whereDoesntHave('attendance');
}
public function scopeSearch(Builder $query, ?string $term): Builder
{
$term = trim((string) $term);
if ($term === '') {
return $query;
}
$like = '%' . $term . '%';
$digits = preg_replace('/\D/', '', $term);
return $query->where(function (Builder $q) use ($like, $term, $digits) {
$q->where('nama', 'like', $like)
->orWhere('no_pekerja', 'like', $like)
->orWhere('no_anggota', 'like', $like)
->orWhere('no_kp', 'like', $like);
if ($digits !== '') {
$q->orWhere('no_kp', 'like', '%' . $digits . '%')
->orWhere('no_pekerja', 'like', '%' . $digits . '%');
}
});
}
}