Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\Bumdes;
|
||||
|
||||
enum JabatanBumdes: string
|
||||
{
|
||||
case DIREKTUR = 'direktur';
|
||||
case DIREKTUR_KETUA = 'direktur_ketua';
|
||||
case SEKRETARIS = 'sekretaris';
|
||||
case BENDAHARA = 'bendahara';
|
||||
case KEPALA_UNIT_USAHA = 'kepala_unit_usaha';
|
||||
case PENGAWAS = 'pengawas';
|
||||
case PENASIHAT = 'penasihat';
|
||||
case ANGGOTA = 'anggota';
|
||||
case STAF_OPERASIONAL = 'staf_operasional';
|
||||
case LAINNYA = 'lainnya';
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::DIREKTUR => 'Direktur/Ketua',
|
||||
self::DIREKTUR_KETUA => 'Direktur/Ketua',
|
||||
self::SEKRETARIS => 'Sekretaris',
|
||||
self::BENDAHARA => 'Bendahara',
|
||||
self::KEPALA_UNIT_USAHA => 'Kepala Unit Usaha',
|
||||
self::PENGAWAS => 'Pengawas',
|
||||
self::PENASIHAT => 'Penasihat',
|
||||
self::ANGGOTA => 'Anggota',
|
||||
self::STAF_OPERASIONAL => 'Staf Operasional',
|
||||
self::LAINNYA => 'Lainnya',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect([
|
||||
self::DIREKTUR_KETUA,
|
||||
self::SEKRETARIS,
|
||||
self::BENDAHARA,
|
||||
self::LAINNYA,
|
||||
])->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,218 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Web\Bumdes;
|
||||
|
||||
use App\Enums\Bumdes\JabatanBumdes;
|
||||
use App\Enums\Pendidikan;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Bumdes\PengurusBumdes;
|
||||
use App\Models\Wilayah\Provinsi;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Validation\Rule;
|
||||
|
||||
class PengurusBumdesController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||
abort(403);
|
||||
}
|
||||
|
||||
$query = PengurusBumdes::with([
|
||||
'desaKelurahan:id,nama,kecamatan_id',
|
||||
'desaKelurahan.kecamatan:id,nama,kabupaten_kota_id',
|
||||
'desaKelurahan.kecamatan.kabupatenKota:id,nama,provinsi_id',
|
||||
'desaKelurahan.kecamatan.kabupatenKota.provinsi:id,nama',
|
||||
'creator:id,name',
|
||||
])
|
||||
->orderBy('created_at', 'desc');
|
||||
|
||||
if ($request->search) {
|
||||
$query->where(function ($query) use ($request) {
|
||||
$query->where('nama', 'like', '%' . $request->search . '%')
|
||||
->orWhere('jabatan', 'like', '%' . $request->search . '%')
|
||||
->orWhere('jabatan_lainnya', 'like', '%' . $request->search . '%');
|
||||
});
|
||||
}
|
||||
|
||||
if (auth()->user()->role->value === 'fasilitator') {
|
||||
$query->where('created_by', auth()->id());
|
||||
}
|
||||
|
||||
$summaryQuery = clone $query;
|
||||
$totalPengurus = (clone $summaryQuery)->count();
|
||||
$totalLakiLaki = (clone $summaryQuery)->where('jenis_kelamin', true)->count();
|
||||
$totalPerempuan = (clone $summaryQuery)->where('jenis_kelamin', false)->count();
|
||||
$totalDesaKelurahan = (clone $summaryQuery)->distinct('desa_kelurahan_id')->count('desa_kelurahan_id');
|
||||
$totalJabatan = (clone $summaryQuery)->distinct('jabatan')->count('jabatan');
|
||||
|
||||
$pengurus = $query->paginate($request->per_page ?? 10);
|
||||
$userRole = auth()->user()->role->value;
|
||||
$showEnumerator = in_array($userRole, ['super_admin', 'admin']);
|
||||
|
||||
return view('bumdes.profil.index', compact(
|
||||
'pengurus',
|
||||
'totalPengurus',
|
||||
'totalLakiLaki',
|
||||
'totalPerempuan',
|
||||
'totalDesaKelurahan',
|
||||
'totalJabatan',
|
||||
'showEnumerator'
|
||||
));
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||
abort(403);
|
||||
}
|
||||
|
||||
$provinsi = Provinsi::select('id', 'kode', 'nama')->orderBy('kode', 'asc')->get();
|
||||
$jabatan = JabatanBumdes::options();
|
||||
$pendidikan = Pendidikan::options();
|
||||
|
||||
return view('bumdes.profil.add', compact('provinsi', 'jabatan', 'pendidikan'));
|
||||
}
|
||||
|
||||
public function store(Request $request)
|
||||
{
|
||||
if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||
abort(403);
|
||||
}
|
||||
|
||||
$validatedData = $this->validatedData($request);
|
||||
|
||||
$pengurus = PengurusBumdes::create([
|
||||
...$this->formatData($validatedData),
|
||||
'uid' => 'BMD-' . strtoupper(Str::random(10)),
|
||||
'created_by' => auth()->id(),
|
||||
'updated_by' => auth()->id(),
|
||||
]);
|
||||
|
||||
return redirect()->route('bumdes.edit', $pengurus->id)->with('success', 'Data pengurus BUMDes berhasil ditambahkan.');
|
||||
}
|
||||
|
||||
public function show(string $id)
|
||||
{
|
||||
return redirect()->route('bumdes.edit', $id);
|
||||
}
|
||||
|
||||
public function edit(string $id)
|
||||
{
|
||||
if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||
abort(403);
|
||||
}
|
||||
|
||||
$pengurus = $this->pengurusQuery()->with([
|
||||
'desaKelurahan.kecamatan.kabupatenKota.provinsi',
|
||||
])->findOrFail($id);
|
||||
$provinsi = Provinsi::select('id', 'kode', 'nama')->orderBy('kode', 'asc')->get();
|
||||
$jabatan = JabatanBumdes::options();
|
||||
$pendidikan = Pendidikan::options();
|
||||
|
||||
return view('bumdes.profil.edit', compact('pengurus', 'provinsi', 'jabatan', 'pendidikan'));
|
||||
}
|
||||
|
||||
public function update(Request $request, string $id)
|
||||
{
|
||||
if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||
abort(403);
|
||||
}
|
||||
|
||||
$pengurus = $this->pengurusQuery()->findOrFail($id);
|
||||
$validatedData = $this->validatedData($request);
|
||||
|
||||
$pengurus->update([
|
||||
...$this->formatData($validatedData),
|
||||
'updated_by' => auth()->id(),
|
||||
]);
|
||||
|
||||
return redirect()->route('bumdes.edit', $pengurus->id)->with('success', 'Data pengurus BUMDes berhasil diupdate.');
|
||||
}
|
||||
|
||||
public function destroy(string $id)
|
||||
{
|
||||
if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||
abort(403);
|
||||
}
|
||||
|
||||
$pengurus = $this->pengurusQuery()->findOrFail($id);
|
||||
$pengurus->update(['deleted_by' => auth()->id()]);
|
||||
$pengurus->delete();
|
||||
|
||||
return response()->json(['message' => 'Data pengurus BUMDes berhasil dihapus.']);
|
||||
}
|
||||
|
||||
public function kelembagaanAktor(string $id)
|
||||
{
|
||||
if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||
abort(403);
|
||||
}
|
||||
|
||||
$pengurus = $this->pengurusQuery()->with([
|
||||
'desaKelurahan.kecamatan.kabupatenKota.provinsi',
|
||||
])->findOrFail($id);
|
||||
|
||||
return view('bumdes.kelembagaan-aktor.index', compact('pengurus'));
|
||||
}
|
||||
|
||||
private function pengurusQuery()
|
||||
{
|
||||
$query = PengurusBumdes::query();
|
||||
|
||||
if (auth()->user()->role->value === 'fasilitator') {
|
||||
$query->where('created_by', auth()->id());
|
||||
}
|
||||
|
||||
return $query;
|
||||
}
|
||||
|
||||
private function validatedData(Request $request): array
|
||||
{
|
||||
return $request->validate([
|
||||
'nama' => ['required', 'string', 'max:255'],
|
||||
'jenis_kelamin' => ['required', 'boolean'],
|
||||
'tempat_lahir' => ['required', 'string', 'max:255'],
|
||||
'tanggal_lahir' => ['required', 'date_format:d-m-Y'],
|
||||
'pendidikan_terakhir' => ['required', Rule::enum(Pendidikan::class)],
|
||||
'alamat' => ['required', 'string', 'max:500'],
|
||||
'desa_kelurahan_id' => ['required', 'exists:master_desa_kelurahan,id'],
|
||||
'nomor_telepon' => ['nullable', 'digits_between:11,13'],
|
||||
'jabatan' => ['required', Rule::enum(JabatanBumdes::class)],
|
||||
'jabatan_lainnya' => ['nullable', 'required_if:jabatan,' . JabatanBumdes::LAINNYA->value, 'string', 'max:255'],
|
||||
'lama_menjabat_tahun' => ['required', 'integer', 'min:0', 'max:80'],
|
||||
], [
|
||||
'nama.required' => 'Nama harus diisi.',
|
||||
'jenis_kelamin.required' => 'Jenis kelamin harus dipilih.',
|
||||
'tempat_lahir.required' => 'Tempat lahir harus diisi.',
|
||||
'tanggal_lahir.required' => 'Tanggal lahir harus diisi.',
|
||||
'tanggal_lahir.date_format' => 'Tanggal lahir harus menggunakan format tanggal yang valid.',
|
||||
'pendidikan_terakhir.required' => 'Pendidikan terakhir harus dipilih.',
|
||||
'alamat.required' => 'Alamat harus diisi.',
|
||||
'desa_kelurahan_id.required' => 'Desa kelurahan harus dipilih.',
|
||||
'desa_kelurahan_id.exists' => 'Desa kelurahan tidak ditemukan.',
|
||||
'nomor_telepon.digits_between' => 'Nomor telepon harus berupa angka 11 sampai 13 digit.',
|
||||
'jabatan.required' => 'Jabatan/peran harus dipilih.',
|
||||
'jabatan_lainnya.required_if' => 'Jabatan lainnya harus diisi.',
|
||||
'lama_menjabat_tahun.required' => 'Lama menjabat harus diisi.',
|
||||
'lama_menjabat_tahun.integer' => 'Lama menjabat harus berupa angka tahun.',
|
||||
]);
|
||||
}
|
||||
|
||||
private function formatData(array $data): array
|
||||
{
|
||||
$data['tanggal_lahir'] = Carbon::createFromFormat('d-m-Y', $data['tanggal_lahir'])->format('Y-m-d');
|
||||
$data['tanggal_mulai_menjabat'] = Carbon::now()
|
||||
->subYears((int) $data['lama_menjabat_tahun'])
|
||||
->format('Y-m-d');
|
||||
|
||||
if (($data['jabatan'] ?? null) !== JabatanBumdes::LAINNYA->value) {
|
||||
$data['jabatan_lainnya'] = null;
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
@@ -75,7 +75,6 @@ class ProfilPetaniController extends Controller
|
||||
->groupByRaw($case)
|
||||
->get();
|
||||
|
||||
|
||||
$skorAverage = SkorPetani::query()
|
||||
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
||||
->whereIn('petani_id', $petani)
|
||||
@@ -127,6 +126,21 @@ class ProfilPetaniController extends Controller
|
||||
->groupByRaw($case)
|
||||
->get();
|
||||
|
||||
$skorMultiKomponen = SkorPetani::query()
|
||||
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
||||
->whereIn('petani_id', $petani)
|
||||
->whereIn('petani.komoditas_id', $komoditas->pluck('id'))
|
||||
->selectRaw("$case AS segmen,
|
||||
avg(skor_kesiapan_adopsi) as skor_kesiapan_adopsi,
|
||||
avg(skor_komp_1_d4_k3_motivasi_kapasitas_adopsi) as skor_komp_1_d4_k3_motivasi_kapasitas_adopsi,
|
||||
avg(skor_komp_2_d4_k2_ekonomi_rumah_tangga) as skor_komp_2_d4_k2_ekonomi_rumah_tangga,
|
||||
avg(skor_komp_3_d2_praktik_budidaya_gap) as skor_komp_3_d2_praktik_budidaya_gap,
|
||||
avg(skor_komp_4_d4_k4_keterlibatan_kelembagaan) as skor_komp_4_d4_k4_keterlibatan_kelembagaan,
|
||||
avg(skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan) as skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan,
|
||||
avg(skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar) as skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar")
|
||||
->groupByRaw($case)
|
||||
->get();
|
||||
|
||||
$petani = Petani::with(['skor'])
|
||||
->whereIn('id', $petani)
|
||||
->whereIn('komoditas_id', $komoditas->pluck('id'))
|
||||
@@ -144,6 +158,7 @@ class ProfilPetaniController extends Controller
|
||||
'skorDimensi',
|
||||
'skorKomponen',
|
||||
'skorMultiDimensi',
|
||||
'skorMultiKomponen',
|
||||
'petani',
|
||||
));
|
||||
}
|
||||
|
||||
@@ -0,0 +1,108 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models\Bumdes;
|
||||
|
||||
use App\Enums\Bumdes\JabatanBumdes;
|
||||
use App\Enums\Pendidikan;
|
||||
use App\Models\User;
|
||||
use App\Models\Wilayah\DesaKelurahan;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
|
||||
class PengurusBumdes extends Model
|
||||
{
|
||||
use SoftDeletes;
|
||||
|
||||
protected $table = 'bumdes_pengurus';
|
||||
|
||||
protected $fillable = [
|
||||
'uid',
|
||||
'nama',
|
||||
'jenis_kelamin',
|
||||
'tempat_lahir',
|
||||
'tanggal_lahir',
|
||||
'pendidikan_terakhir',
|
||||
'alamat',
|
||||
'desa_kelurahan_id',
|
||||
'nomor_telepon',
|
||||
'jabatan',
|
||||
'jabatan_lainnya',
|
||||
'lama_menjabat_tahun',
|
||||
'tanggal_mulai_menjabat',
|
||||
'created_by',
|
||||
'updated_by',
|
||||
'deleted_by',
|
||||
];
|
||||
|
||||
protected $casts = [
|
||||
'jenis_kelamin' => 'boolean',
|
||||
'tanggal_lahir' => 'date',
|
||||
'pendidikan_terakhir' => Pendidikan::class,
|
||||
'tanggal_mulai_menjabat' => 'date',
|
||||
'jabatan' => JabatanBumdes::class,
|
||||
];
|
||||
|
||||
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');
|
||||
}
|
||||
}
|
||||
@@ -94,15 +94,15 @@ class Petani extends Model
|
||||
protected static function booted(): void
|
||||
{
|
||||
static::saved(function (Petani $petani) {
|
||||
|
||||
$skor = SkorPetani::where('petani_id')->orderBy('id')->first();
|
||||
if (! $skor) {
|
||||
$skor = SkorPetani::where('petani_id', $petani->id)->orderBy('id')->first();
|
||||
if (!$skor) {
|
||||
$petaniUid = $petani->uid;
|
||||
$part = explode('-', $petaniUid);
|
||||
$skor = SkorPetani::create([
|
||||
'uid' => 'SKR-'.$part[1].'-'.strtoupper(Str::random(10)),
|
||||
'petani_id' => $petani->id,
|
||||
'uid' => 'SKR-' . $part[1] . '-' . strtoupper(Str::random(10)),
|
||||
'created_by' => $petani->created_by,
|
||||
'updated_by' => $petani->updated_by,
|
||||
'updated_by' => $petani->updated_by
|
||||
]);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -102,7 +102,7 @@ class SkorPetani extends Model
|
||||
$skorPetani->skor_d4_k5_1_kepemilikan_rekening +
|
||||
$skorPetani->skor_d4_k5_2_pengalaman_kredit_formal +
|
||||
$skorPetani->skor_d4_k5_3_kepemilikan_aset_produktif +
|
||||
$skorPetani->skor_d4_k5_4_5_akses_program_bantuan
|
||||
$skorPetani->skor_d4_k5_4_akses_program_bantuan
|
||||
) / 4 +
|
||||
(
|
||||
$skorPetani->skor_d4_k6_3_keberadaan_hutang_terkait_panen +
|
||||
@@ -119,23 +119,23 @@ class SkorPetani extends Model
|
||||
$skorPetani->skor_d2_sistem_praktik_budidaya = (
|
||||
$skorPetani->skor_komp_3_d2_praktik_budidaya_gap
|
||||
);
|
||||
$skorPetani->skor_d4_sosial_ekonomi = (
|
||||
$skorPetani->skor_komp_1_d4_k3_motivasi_kapasitas_adopsi
|
||||
);
|
||||
$skorPetani->skor_d6_rantai_nilai_akses_pasar = (
|
||||
$skorPetani->skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar * 0.25 +
|
||||
$skorPetani->skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar
|
||||
);
|
||||
$skorPetani->skor_d4_sosial_ekonomi = (
|
||||
$skorPetani->skor_komp_1_d4_k3_motivasi_kapasitas_adopsi * 0.25 +
|
||||
$skorPetani->skor_komp_2_d4_k2_ekonomi_rumah_tangga * 0.20 +
|
||||
$skorPetani->skor_komp_4_d4_k4_keterlibatan_kelembagaan * 0.15 +
|
||||
$skorPetani->skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan * 0.10
|
||||
) / 0.70;
|
||||
|
||||
$skorPetani->skor_kesiapan_adopsi = (
|
||||
$skorPetani->skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar * 0.25 +
|
||||
$skorPetani->skor_komp_2_d4_k2_ekonomi_rumah_tangga * 0.20 +
|
||||
$skorPetani->skor_komp_3_d2_praktik_budidaya_gap * 0.20 +
|
||||
$skorPetani->skor_komp_4_d4_k4_keterlibatan_kelembagaan * 0.15 +
|
||||
$skorPetani->skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan * 0.10 +
|
||||
$skorPetani->skor_komp_1_d4_k3_motivasi_kapasitas_adopsi * 0.10
|
||||
$skorPetani->skor_komp_1_d4_k3_motivasi_kapasitas_adopsi * 0.25 + // D4
|
||||
$skorPetani->skor_komp_2_d4_k2_ekonomi_rumah_tangga * 0.20 + // D4
|
||||
$skorPetani->skor_komp_3_d2_praktik_budidaya_gap * 0.20 + // D2
|
||||
$skorPetani->skor_komp_4_d4_k4_keterlibatan_kelembagaan * 0.15 + // D4
|
||||
$skorPetani->skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan * 0.10 + // D4
|
||||
$skorPetani->skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar * 0.10 // D6
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user