385 lines
11 KiB
PHP
385 lines
11 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use App\Builders\MemberBuilder;
|
|
use App\Traits\Blameable;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Database\Eloquent\Casts\Attribute;
|
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
|
use Altek\Accountant\Contracts\Recordable;
|
|
|
|
class Member extends Model
|
|
{
|
|
use HasFactory, SoftDeletes, Blameable;
|
|
|
|
protected $fillable = [
|
|
"id",
|
|
"person_id",
|
|
"member_id",
|
|
"record_type",
|
|
"record_mode",
|
|
"payor_id",
|
|
"plan_id",
|
|
"user_id",
|
|
"name_prefix",
|
|
"name",
|
|
"name_suffix",
|
|
"birth_date",
|
|
"gender",
|
|
"language",
|
|
"race",
|
|
"marital_status",
|
|
"principal_id",
|
|
"relation_with_principal",
|
|
"bpjs_class",
|
|
"active",
|
|
"created_by",
|
|
"updated_by",
|
|
"deleted_by",
|
|
|
|
"nric",
|
|
"email",
|
|
"bank_info",
|
|
"agent_code",
|
|
"address1",
|
|
"address2",
|
|
"address3",
|
|
"address4",
|
|
"city",
|
|
"state",
|
|
"postal_code",
|
|
"passport_no",
|
|
"passport_country",
|
|
"identification_code",
|
|
"pre_existing",
|
|
"bpjs_id",
|
|
"endorsement_date",
|
|
"members_effective_date",
|
|
"members_expire_date",
|
|
"employee_status",
|
|
"activation_date",
|
|
"terminated_date",
|
|
"remarks",
|
|
"policy_in_force",
|
|
"start_no_claim",
|
|
"end_no_claim",
|
|
"suspended"
|
|
];
|
|
|
|
protected $appends = [
|
|
'full_name',
|
|
'age',
|
|
'gender_code',
|
|
'relations',
|
|
'status_marital'
|
|
// 'relation_with_principal'
|
|
];
|
|
|
|
protected $hidden = [
|
|
'created_at',
|
|
'updated_at',
|
|
'deleted_at',
|
|
'created_by',
|
|
'updated_by',
|
|
'deleted_by',
|
|
];
|
|
|
|
public static function query(): MemberBuilder
|
|
{
|
|
return parent::query();
|
|
}
|
|
|
|
public function newEloquentBuilder($query): MemberBuilder
|
|
{
|
|
return new MemberBuilder($query);
|
|
}
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
/* relationship */
|
|
/* -------------------------------------------------------------------------- */
|
|
public function claims()
|
|
{
|
|
return $this->hasMany(Claim::class, 'member_id', 'id');
|
|
}
|
|
|
|
public function claimRequest()
|
|
{
|
|
return $this->hasMany(ClaimRequest::class, 'member_id', 'id')->where('claim_id', '!=', null);
|
|
}
|
|
|
|
|
|
public function postponedClaims()
|
|
{
|
|
return $this->hasMany(Claim::class, 'member_id', 'id')->where('status', 'postpone');
|
|
}
|
|
|
|
public function person()
|
|
{
|
|
return $this->belongsTo(Person::class, 'person_id', 'id');
|
|
}
|
|
|
|
public function employeds()
|
|
{
|
|
return $this->hasMany(CorporateEmployee::class, 'member_id');
|
|
}
|
|
|
|
public function corporates()
|
|
{
|
|
return $this
|
|
->belongsToMany(Corporate::class, 'corporate_employees', 'corporate_id', 'member_id')
|
|
->withPivot([
|
|
'branch_code',
|
|
'division_id',
|
|
'nik',
|
|
'status',
|
|
'start',
|
|
'end'
|
|
]);
|
|
}
|
|
|
|
public function currentCorporate()
|
|
{
|
|
return $this->hasOneThrough(Corporate::class, CorporateEmployee::class, 'member_id', 'id', 'id', 'corporate_id');
|
|
}
|
|
|
|
public function memberPlans()
|
|
{
|
|
return $this->hasMany(MemberPlan::class, 'member_id');
|
|
}
|
|
|
|
public function plans()
|
|
{
|
|
return $this->hasManyThrough(Plan::class, MemberPlan::class, 'member_id', 'id', 'id', 'plan_id');
|
|
}
|
|
|
|
public function currentPlans()
|
|
{
|
|
return $this->hasManyThrough(Plan::class, MemberPlan::class, 'member_id', 'id', 'id', 'plan_id');
|
|
// ->latest(); // TODO Fix This
|
|
}
|
|
|
|
public function currentPlan()
|
|
{
|
|
return $this->hasOneThrough(Plan::class, MemberPlan::class, 'member_id', 'id', 'id', 'plan_id', )
|
|
->latest();
|
|
// ->where('plans.service_code', $this->claimRequest->service_code); // TODO Fix This
|
|
}
|
|
|
|
// public function currentPlan()
|
|
// {
|
|
// return $this->hasOneThrough(
|
|
// Plan::class,
|
|
// MemberPlan::class,
|
|
// 'member_id',
|
|
// 'id',
|
|
// 'id',
|
|
// 'plan_id'
|
|
// )
|
|
// ->join('claim_requests', 'claim_requests.service_code', '=', 'plans.service_code')
|
|
// ->latest('claim_requests.created_at') // Atau sesuaikan dengan kolom timestamp yang sesuai
|
|
// ->select('plans.*');
|
|
// }
|
|
|
|
|
|
public function currentEmployeds()
|
|
{
|
|
return $this->hasOneThrough(CorporateEmployee::class, Person::class, 'nik', 'id', 'id', 'nik')
|
|
->latest(); // TODO Fix This
|
|
}
|
|
|
|
public function policies()
|
|
{
|
|
return $this->hasMany(MemberPolicy::class, 'member_id', 'member_id');
|
|
}
|
|
|
|
public function currentPolicy()
|
|
{
|
|
return $this->hasOneThrough(CorporatePolicy::class, MemberPolicy::class, 'member_id', 'code', 'member_id', 'policy_id')
|
|
->where('status', 'active')
|
|
->orderBy('end', 'DESC');
|
|
// return $this->hasOne(MemberPolicy::class, 'member_id', 'member_id')->where('status', 'active')->latestOfMany();
|
|
}
|
|
|
|
public function currentActivePolicy()
|
|
{
|
|
return $this->hasOneThrough(CorporatePolicy::class, MemberPolicy::class, 'member_id', 'code', 'member_id', 'policy_id')
|
|
->where('corporate_policies.start', '<', now())
|
|
->where('corporate_policies.end', '>', now())
|
|
->where('member_policies.start', '<', now())
|
|
->where('member_policies.end', '>', now());
|
|
}
|
|
|
|
public function division()
|
|
{
|
|
return $this->hasOneThrough(CorporateDivision::class, CorporateEmployee::class, 'member_id', 'id', 'id', 'division_id');
|
|
}
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
/* Accessors & Mutators */
|
|
/* -------------------------------------------------------------------------- */
|
|
protected function age(): Attribute
|
|
{
|
|
return Attribute::make(
|
|
get: fn () => Carbon::parse($this->birth_date)->diffInYears(now())
|
|
);
|
|
}
|
|
|
|
protected function fullName(): Attribute
|
|
{
|
|
$arr = [];
|
|
|
|
if (!empty($this->person->name_prefix)) {
|
|
$arr[] = $this->person->name_prefix;
|
|
}
|
|
|
|
$arr[] = $this->person->name;
|
|
|
|
if (!empty($this->person->name_suffix)) {
|
|
$arr[] = $this->person->name_suffix;
|
|
}
|
|
|
|
return Attribute::make(
|
|
get: fn () => !$this->person ? null : implode(' ', $arr)
|
|
);
|
|
}
|
|
|
|
protected function genderCode(): Attribute
|
|
{
|
|
return Attribute::make(
|
|
get: fn () => $this->gender ? ($this->gender == 'Female' ? 'F' : 'M') : $this->gender
|
|
);
|
|
}
|
|
|
|
protected function name(): Attribute
|
|
{
|
|
return Attribute::make(
|
|
get: fn () => $this->person->name ?? ($this->name ?? null)
|
|
);
|
|
}
|
|
|
|
|
|
protected function relations(): Attribute
|
|
{
|
|
$relation = '-';
|
|
if ($this->relation_with_principal == 'H'){
|
|
$relation = 'Husbund';
|
|
} else if ($this->relation_with_principal == 'W'){
|
|
$relation = 'Wife';
|
|
} else if ($this->relation_with_principal == 'S'){
|
|
$relation = 'Son';
|
|
} else if ($this->relation_with_principal == 'D'){
|
|
$relation = 'Daughter';
|
|
}
|
|
return Attribute::make(
|
|
get: fn () => $relation
|
|
);
|
|
}
|
|
|
|
protected function statusMarital(): Attribute
|
|
{
|
|
$maritalStatus = '-';
|
|
if ($this->marital_status == 'M'){
|
|
$maritalStatus = 'Married';
|
|
} else if ($this->relation_with_principal == 'D'){
|
|
$maritalStatus = 'Divorced';
|
|
} else if ($this->relation_with_principal == 'S'){
|
|
$maritalStatus = 'Sungle';
|
|
}
|
|
return Attribute::make(
|
|
get: fn () => $maritalStatus
|
|
);
|
|
}
|
|
|
|
// protected function birthDate(): Attribute
|
|
// {
|
|
// // $date = $this->person->birth_date ?? ($this->birth_date ?? null);
|
|
// $date = $this->birth_date ?? ($this->person->birth_date ?? null);
|
|
// return Attribute::make(
|
|
// get: fn () => !empty($date) ? Carbon::parse($date)->format('Y-m-d') : null
|
|
// );
|
|
// }
|
|
|
|
protected function birthDateeCard(): Attribute
|
|
{
|
|
// $date = $this->person->birth_date ?? ($this->birth_date ?? null);
|
|
if ($this->birth_date){
|
|
$date = $this->birth_date;
|
|
return Attribute::make(
|
|
get: fn () => !empty($date) ? Carbon::parse($date)->format('d / M / Y') : null
|
|
);
|
|
} else if ($this->person->birth_date){
|
|
return Attribute::make(
|
|
get: fn () => !empty($date) ? Carbon::parse($date)->format('d / M / Y') : null
|
|
);
|
|
} else {
|
|
return Attribute::make(
|
|
get: fn () => '-'
|
|
);
|
|
}
|
|
}
|
|
|
|
protected function startDate(): Attribute
|
|
{
|
|
// $date = $this->person->birth_date ?? ($this->birth_date ?? null);
|
|
$date = $this->members_effective_date;
|
|
return Attribute::make(
|
|
get: fn () => !empty($date) ? Carbon::parse($date)->format('d / M / Y') : null
|
|
);
|
|
}
|
|
|
|
protected function endDate(): Attribute
|
|
{
|
|
// $date = $this->person->birth_date ?? ($this->birth_date ?? null);
|
|
$date = $this->members_expire_date;
|
|
return Attribute::make(
|
|
get: fn () => !empty($date) ? Carbon::parse($date)->format('d / M / Y') : null
|
|
);
|
|
}
|
|
|
|
// protected function relationWithPrincipal(): Attribute
|
|
// {
|
|
// $relation = null;
|
|
|
|
// if ($this->relation_with_principal === 'S') {
|
|
// $relation = 'Son';
|
|
// } elseif ($this->relation_with_principal === 'H') {
|
|
// $relation = 'Husband';
|
|
// } elseif ($this->relation_with_principal === 'D') {
|
|
// $relation = 'Daughter';
|
|
// } elseif ($this->relation_with_principal === 'Wife') {
|
|
// $relation = 'Wife';
|
|
// }
|
|
|
|
// return Attribute::make(
|
|
// get: fn () => $relation
|
|
// );
|
|
// }
|
|
|
|
// protected function gender(): Attribute
|
|
// {
|
|
// return Attribute::make(
|
|
// get: fn () => ucfirst($this->person->gender) ?? null
|
|
// );
|
|
// }
|
|
|
|
protected function corporateLogo(): Attribute
|
|
{
|
|
$avatar = File::where(['type' => 'avatar', 'fileable_id' => $this->currentPolicy->corporate->id])->orderBy('id', 'desc')->get()->first();
|
|
if ($avatar){
|
|
$path = $_ENV['LMS_APP_STORAGE'] . $avatar->path ? $avatar->path :'';
|
|
return Attribute::make(
|
|
get: fn () => $avatar ? $path : null
|
|
);
|
|
} else {
|
|
return Attribute::make(
|
|
get: fn () => null
|
|
);
|
|
}
|
|
}
|
|
/* -------------------------------------------------------------------------- */
|
|
}
|