Update Koperasi

This commit is contained in:
2026-11-06 22:38:45 +07:00
parent 6232b28e11
commit cb36682d9e
79 changed files with 4639 additions and 1378 deletions
@@ -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(),
];
}
}