'boolean', 'in_country' => 'boolean', 'salary' => 'decimal:2', 'password' => 'hashed', ]; protected $appends = [ 'passport_status', 'visa_status', 'emirates_id_status', 'document_expiry_days', 'document_expiry_status', 'visa_expiry_date', ]; public function getPassportStatusAttribute() { $passport = $this->documents->where('type', 'passport')->first(); if (!$passport) { return 'Passport Pending'; } return $this->verified ? 'Passport Verified' : 'Passport Pending'; } public function getVisaStatusAttribute() { if ($this->attributes['visa_status'] ?? null) { return $this->attributes['visa_status']; } $visa = $this->documents->where('type', 'visa')->first(); if (!$visa) { return 'Visa Pending'; } if ($visa->expiry_date && \Carbon\Carbon::parse($visa->expiry_date)->isPast()) { return 'Cancelled Visa'; } return 'Residence Visa'; } public function getEmiratesIdStatusAttribute() { return $this->passport_status; } public function getVisaExpiryDateAttribute() { $visa = $this->documents->where('type', 'visa')->first(); return $visa ? $visa->expiry_date : null; } public function getDocumentExpiryDaysAttribute() { $visa = $this->documents->where('type', 'visa')->first(); $doc = $visa; if (!$doc || !$doc->expiry_date) { $passport = $this->documents->where('type', 'passport')->first(); $doc = $passport; } if ($doc && $doc->expiry_date) { $expiry = \Carbon\Carbon::parse($doc->expiry_date); return (int)now()->startOfDay()->diffInDays(\Carbon\Carbon::parse($expiry)->startOfDay(), false); } return null; } public function getDocumentExpiryStatusAttribute() { $visa = $this->documents->where('type', 'visa')->first(); $doc = $visa; $typeLabel = 'Visa'; if (!$doc || !$doc->expiry_date) { $passport = $this->documents->where('type', 'passport')->first(); $doc = $passport; $typeLabel = 'Passport'; } if ($doc && $doc->expiry_date) { $expiry = \Carbon\Carbon::parse($doc->expiry_date); $days = (int)now()->startOfDay()->diffInDays(\Carbon\Carbon::parse($expiry)->startOfDay(), false); if ($days < 0) { return "$typeLabel Expired"; } return "$typeLabel expires in $days days"; } return 'No Documents'; } public function skills() { return $this->belongsToMany(Skill::class, 'worker_skills'); } public function documents() { return $this->hasMany(WorkerDocument::class); } // Relationship for job offers received public function offers() { return $this->hasMany(JobOffer::class, 'worker_id'); } public function reviews() { return $this->hasMany(Review::class); } public function profileViews() { return $this->hasMany(ProfileView::class); } }