available ??= Schema::hasColumn('pengurus_koperasi', 'desa_kelurahan_id') && Schema::hasColumn('pengurus_koperasi', 'created_by'); } public function applyFilters(Builder $query, array $filters): void { if (! $this->available()) { if (filled($filters['kabupaten_kota_id']) || filled($filters['kecamatan_id']) || filled($filters['desa_kelurahan_id'])) { $query->whereRaw('1 = 0'); } return; } // Seperti BUMDes, lokasi koperasi memakai seluruh master wilayah, termasuk di luar program aktif. // Profil yang belum memiliki desa tetap dapat ditemukan dan dilengkapi pada daftar kabupaten. $query->when($filters['kabupaten_kota_id'], fn ($query, $id) => $query->where(fn ($wilayah) => $wilayah ->whereHas('desaKelurahan', fn ($desa) => $desa ->withoutGlobalScope('program')->whereHas('kecamatan', fn ($kecamatan) => $kecamatan ->withoutGlobalScope('program')->where('kabupaten_kota_id', $id))) ->orWhereNull('desa_kelurahan_id'))) ->when($filters['kecamatan_id'], fn ($query, $id) => $query->whereHas('desaKelurahan', fn ($desa) => $desa ->withoutGlobalScope('program')->where('kecamatan_id', $id))) ->when($filters['desa_kelurahan_id'], fn ($query, $id) => $query->where('desa_kelurahan_id', $id)); } public function filterOptions(array $filters): array { $ready = $this->available(); return [ 'wilayahTersedia' => $ready, 'selectedKabupaten' => filled($filters['kabupaten_kota_id']) ? KabupatenKota::withoutGlobalScope('program')->find($filters['kabupaten_kota_id'], ['id', 'nama']) : $this->defaultKabupaten(), 'kecamatanOptions' => $ready && filled($filters['kabupaten_kota_id']) ? Kecamatan::withoutGlobalScope('program')->where('kabupaten_kota_id', $filters['kabupaten_kota_id'])->orderBy('nama')->get(['id', 'nama']) : collect(), 'desaOptions' => $ready && filled($filters['kecamatan_id']) ? DesaKelurahan::withoutGlobalScope('program')->where('kecamatan_id', $filters['kecamatan_id'])->orderBy('nama')->get(['id', 'nama']) : collect(), ]; } public function defaultKabupaten(): ?KabupatenKota { return KabupatenKota::withoutGlobalScope('program')->whereLike('nama', '%ngada%')->orderBy('nama')->first(['id', 'nama']); } public function profileOptions(?PengurusKoperasi $model, array $old): array { if (! $this->available()) { return ['wilayahTersedia' => false]; } $model?->loadMissing([ 'desaKelurahan' => fn ($query) => $query->withoutGlobalScope('program'), 'desaKelurahan.kecamatan' => fn ($query) => $query->withoutGlobalScope('program'), 'desaKelurahan.kecamatan.kabupatenKota' => fn ($query) => $query->withoutGlobalScope('program'), ]); $desa = $model?->desaKelurahan; $value = function ($key, $fallback) use ($old) { $selected = array_key_exists($key, $old) ? $old[$key] : $fallback; return is_int($selected) || (is_string($selected) && ctype_digit($selected)) ? $selected : null; }; $selected = [ 'provinsi_id' => $value('provinsi_id', $desa?->kecamatan?->kabupatenKota?->provinsi_id), 'kabupaten_kota_id' => $value('kabupaten_kota_id', $desa?->kecamatan?->kabupaten_kota_id), 'kecamatan_id' => $value('kecamatan_id', $desa?->kecamatan_id), 'desa_kelurahan_id' => $value('desa_kelurahan_id', $model?->desa_kelurahan_id), ]; return [ ...$this->filterOptions($selected), 'selectedWilayah' => $selected, 'provinsiOptions' => Provinsi::withoutGlobalScope('program')->orderBy('nama')->get(['id', 'nama']), 'kabupatenOptions' => filled($selected['provinsi_id']) ? KabupatenKota::withoutGlobalScope('program')->where('provinsi_id', $selected['provinsi_id'])->orderBy('nama')->get(['id', 'nama']) : collect(), ]; } }