111 lines
2.9 KiB
PHP
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 . '%');
|
|
}
|
|
});
|
|
}
|
|
}
|