'boolean', 'tanggal_lahir' => 'date', 'pendidikan_terakhir' => Pendidikan::class, 'tanggal_mulai_menjabat' => 'date', 'jabatan' => JabatanBumdes::class, ]; } protected static function booted(): void { static::deleting(function (self $pengurus) { if (! $pengurus->isForceDeleting()) { $pengurus->kelembagaanAktor()->each(fn ($data) => $data->delete()); } }); } public function profilLengkap(): bool { return $this->exists && collect([ 'nama', 'tempat_lahir', 'tanggal_lahir', 'pendidikan_terakhir', 'alamat', 'desa_kelurahan_id', 'jabatan', 'lama_menjabat_tahun', ])->every(fn ($field) => filled($this->{$field})) && $this->jenis_kelamin !== null; } public function getUsiaAttribute(): ?int { if (! $this->tanggal_lahir) { return null; } return Carbon::parse($this->tanggal_lahir)->age; } public function getLamaMenjabatAttribute(): string { if (! is_null($this->lama_menjabat_tahun)) { return $this->lama_menjabat_tahun.' tahun'; } if (! $this->tanggal_mulai_menjabat) { return '-'; } $tanggalMulai = Carbon::parse($this->tanggal_mulai_menjabat)->startOfDay(); if ($tanggalMulai->isFuture()) { return 'Belum mulai'; } $selisih = $tanggalMulai->diff(Carbon::now()); $bagian = []; if ($selisih->y > 0) { $bagian[] = $selisih->y.' tahun'; } if ($selisih->m > 0) { $bagian[] = $selisih->m.' bulan'; } if (empty($bagian)) { return $selisih->d.' hari'; } return implode(' ', $bagian); } public function getNamaJabatanAttribute(): string { if ($this->jabatan === JabatanBumdes::LAINNYA && $this->jabatan_lainnya) { return $this->jabatan_lainnya; } return $this->jabatan?->label() ?? '-'; } public function desaKelurahan(): BelongsTo { return $this->belongsTo(DesaKelurahan::class, 'desa_kelurahan_id'); } public function creator(): BelongsTo { return $this->belongsTo(User::class, 'created_by'); } public function kelembagaanAktor(): HasOne { return $this->hasOne(KelembagaanAktorBumdes::class, 'pengurus_bumdes_id'); } }