97 lines
4.5 KiB
PHP
97 lines
4.5 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Koperasi;
|
|
|
|
use App\Models\Koperasi\PengurusKoperasi;
|
|
use App\Models\Wilayah\DesaKelurahan;
|
|
use App\Models\Wilayah\KabupatenKota;
|
|
use App\Models\Wilayah\Kecamatan;
|
|
use App\Models\Wilayah\Provinsi;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use Illuminate\Support\Facades\Schema;
|
|
|
|
class WilayahKoperasiService
|
|
{
|
|
private ?bool $available = null;
|
|
|
|
public function available(): bool
|
|
{
|
|
return $this->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(),
|
|
];
|
|
}
|
|
}
|