'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) { $val = $this->attributes['visa_status']; $normalized = strtolower(trim($val)); if (str_contains($normalized, 'residence')) { return 'Residence Visa'; } elseif (str_contains($normalized, 'employment')) { return 'Employment Visa'; } else { return 'Tourist Visa'; } } $visa = $this->documents->where('type', 'visa')->first(); if (!$visa) { return 'Residence Visa'; } $ocrData = $visa->ocr_data; $vType = $ocrData['visa_type'] ?? null; if ($vType) { $normalized = strtolower(trim($vType)); if (str_contains($normalized, 'residence')) { return 'Residence Visa'; } elseif (str_contains($normalized, 'employment')) { return 'Employment Visa'; } } return 'Tourist Visa'; } public function setVisaStatusAttribute($value) { if (empty($value)) { $this->attributes['visa_status'] = null; return; } $normalized = strtolower(trim($value)); if (str_contains($normalized, 'residence')) { $this->attributes['visa_status'] = 'Residence Visa'; } elseif (str_contains($normalized, 'employment')) { $this->attributes['visa_status'] = 'Employment Visa'; } else { $this->attributes['visa_status'] = 'Tourist 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); } }