Update Koperasi
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
<?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(),
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user