diff --git a/app/Http/Controllers/Web/Produktivitas/AsetKelompokTaniController.php b/app/Http/Controllers/Web/Produktivitas/AsetKelompokTaniController.php new file mode 100644 index 0000000..003a92d --- /dev/null +++ b/app/Http/Controllers/Web/Produktivitas/AsetKelompokTaniController.php @@ -0,0 +1,153 @@ +with([ + 'success' => $message, + 'success_section' => $section, + ]); + } + + public function index(KelompokTani $kelompokTani) + { + $this->authorizeAccess(); + + $kelompokTani->load('aset'); + + return view('produktivitas.survey-kelompok-tani.aset-keuangan', compact('kelompokTani')); + } + + public function update(Request $request, KelompokTani $kelompokTani) + { + $this->authorizeAccess(); + + $validated = $request->validate([ + 'aset' => ['required', 'array'], + 'aset.*.jenis_aset' => ['required', Rule::in(self::JENIS_ASET_BAKU)], + 'aset.*.status_aset' => ['nullable', 'boolean'], + 'aset.*.status_pengelolaan_aset' => ['nullable', 'string', 'max:100'], + 'aset.*.kondisi_aset' => ['nullable', 'string', 'max:100'], + ]); + + foreach ($validated['aset'] as $item) { + $jenisAset = $item['jenis_aset']; + $ada = (bool) ($item['status_aset'] ?? false); + + $existing = $kelompokTani->aset()->where('jenis_aset', $jenisAset)->first() + ?? $kelompokTani->aset()->onlyTrashed()->where('jenis_aset', $jenisAset)->latest('id')->first(); + + if (!$ada) { + if ($existing && !$existing->trashed()) { + $existing->update(['deleted_by' => auth()->id()]); + $existing->delete(); + } + continue; + } + + if ($existing) { + if ($existing->trashed()) { + $existing->restore(); + } + + $existing->update([ + 'status_aset' => true, + 'status_pengelolaan_aset' => $item['status_pengelolaan_aset'] ?? $existing->status_pengelolaan_aset, + 'kondisi_aset' => $item['kondisi_aset'] ?? $existing->kondisi_aset, + 'deleted_by' => null, + 'updated_by' => auth()->id(), + ]); + continue; + } + + $kelompokTani->aset()->create([ + 'uid' => 'AKT-' . strtoupper(Str::random(10)), + 'jenis_aset' => $jenisAset, + 'status_aset' => true, + 'status_pengelolaan_aset' => $item['status_pengelolaan_aset'] ?? '-', + 'kondisi_aset' => $item['kondisi_aset'] ?? '-', + 'created_by' => auth()->id(), + 'updated_by' => auth()->id(), + ]); + } + + return $this->redirectToSection(route('kelompok-tani.aset-keuangan.index', $kelompokTani->id), 'aset-baku', 'Data aset produktif berhasil disimpan.'); + } + + public function store(Request $request, KelompokTani $kelompokTani) + { + $this->authorizeAccess(); + + $validated = $request->validate([ + 'aset_lainnya' => ['nullable', 'array'], + 'aset_lainnya.*.jenis_aset' => ['nullable', 'string', 'max:255', Rule::notIn(self::JENIS_ASET_BAKU)], + 'aset_lainnya.*.status_pengelolaan_aset' => ['nullable', 'string', 'max:100'], + 'aset_lainnya.*.kondisi_aset' => ['nullable', 'string', 'max:100'], + ], [ + 'aset_lainnya.*.jenis_aset.not_in' => 'Jenis aset ini sudah ada di daftar baku di atas.', + ]); + + foreach ($validated['aset_lainnya'] ?? [] as $item) { + $jenisAset = trim($item['jenis_aset'] ?? ''); + + if ($jenisAset === '') { + continue; + } + + $kelompokTani->aset()->create([ + 'uid' => 'AKT-' . strtoupper(Str::random(10)), + 'jenis_aset' => $jenisAset, + 'status_aset' => true, + 'status_pengelolaan_aset' => $item['status_pengelolaan_aset'] ?? '-', + 'kondisi_aset' => $item['kondisi_aset'] ?? '-', + 'created_by' => auth()->id(), + 'updated_by' => auth()->id(), + ]); + } + + return $this->redirectToSection(route('kelompok-tani.aset-keuangan.index', $kelompokTani->id), 'aset-lainnya', 'Aset lainnya berhasil ditambahkan.'); + } + + public function destroy(KelompokTani $kelompokTani, AsetKelompokTani $aset) + { + $this->authorizeAccess(); + + abort_unless($aset->survey_kelompok_tani_id === $kelompokTani->id, 404); + abort_if(in_array($aset->jenis_aset, self::JENIS_ASET_BAKU), 422, 'Aset baku diatur lewat checklist, bukan dihapus langsung.'); + + $aset->update(['deleted_by' => auth()->id()]); + $aset->delete(); + + return $this->redirectToSection(route('kelompok-tani.aset-keuangan.index', $kelompokTani->id), 'aset-lainnya', 'Aset lainnya berhasil dihapus.'); + } +} diff --git a/app/Http/Controllers/Web/Produktivitas/BantuanKelompokTaniController.php b/app/Http/Controllers/Web/Produktivitas/BantuanKelompokTaniController.php new file mode 100644 index 0000000..929c680 --- /dev/null +++ b/app/Http/Controllers/Web/Produktivitas/BantuanKelompokTaniController.php @@ -0,0 +1,97 @@ +with([ + 'success' => $message, + 'success_section' => $section, + ]); + } + + private function redirectToSectionWithError(string $url, string $section, string $message) + { + return redirect($url . '#section-' . $section)->with([ + 'error' => $message, + 'error_section' => $section, + ]); + } + + public function index(KelompokTani $kelompokTani) + { + $this->authorizeAccess(); + + $kelompokTani->load('bantuan'); + + return view('produktivitas.survey-kelompok-tani.bantuan-penilaian', compact('kelompokTani')); + } + + public function store(Request $request, KelompokTani $kelompokTani) + { + $this->authorizeAccess(); + + if (!$kelompokTani->pernah_mendapatkan_bantuan) { + return $this->redirectToSectionWithError( + route('kelompok-tani.bantuan-penilaian.index', $kelompokTani->id), + 'status-bantuan', + 'Set status jadi "Pernah" dulu sebelum menambahkan daftar bantuan/program.' + ); + } + + $validated = $request->validate([ + 'bantuan' => ['nullable', 'array'], + 'bantuan.*.nama_program' => ['nullable', 'string', 'max:255'], + 'bantuan.*.penyelenggara' => ['nullable', 'string', 'max:255'], + 'bantuan.*.bentuk_bantuan' => ['nullable', 'string', 'max:255'], + 'bantuan.*.tahun' => ['nullable', 'integer', 'min:1900', 'max:' . date('Y')], + ]); + + foreach ($validated['bantuan'] ?? [] as $item) { + if (empty($item['nama_program']) && empty($item['penyelenggara']) && empty($item['bentuk_bantuan'])) { + continue; + } + + $kelompokTani->bantuan()->create([ + 'uid' => 'BKT-' . strtoupper(Str::random(10)), + 'nama_program' => $item['nama_program'] ?? null, + 'penyelenggara' => $item['penyelenggara'] ?? null, + 'bentuk_bantuan' => $item['bentuk_bantuan'] ?? null, + 'tahun' => $item['tahun'] ?? null, + 'created_by' => auth()->id(), + 'updated_by' => auth()->id(), + ]); + } + + return $this->redirectToSection(route('kelompok-tani.bantuan-penilaian.index', $kelompokTani->id), 'bantuan', 'Data bantuan berhasil ditambahkan.'); + } + + public function destroy(KelompokTani $kelompokTani, BantuanKelompokTani $bantuan) + { + $this->authorizeAccess(); + + abort_unless($bantuan->survey_kelompok_tani_id === $kelompokTani->id, 404); + + $bantuan->update(['deleted_by' => auth()->id()]); + $bantuan->delete(); + + return $this->redirectToSection(route('kelompok-tani.bantuan-penilaian.index', $kelompokTani->id), 'bantuan', 'Data bantuan berhasil dihapus.'); + } +} diff --git a/app/Http/Controllers/Web/Produktivitas/PengurusKelompokTaniController.php b/app/Http/Controllers/Web/Produktivitas/PengurusKelompokTaniController.php new file mode 100644 index 0000000..00655e1 --- /dev/null +++ b/app/Http/Controllers/Web/Produktivitas/PengurusKelompokTaniController.php @@ -0,0 +1,81 @@ +with([ + 'success' => $message, + 'success_section' => $section, + ]); + } + + public function index(KelompokTani $kelompokTani) + { + $this->authorizeAccess(); + + $kelompokTani->load('pengurus'); + + return view('produktivitas.survey-kelompok-tani.pengurus-anggota', compact('kelompokTani')); + } + + public function store(Request $request, KelompokTani $kelompokTani) + { + $this->authorizeAccess(); + + $validated = $request->validate([ + 'pengurus' => ['nullable', 'array'], + 'pengurus.*.nama_pengurus' => ['nullable', 'string', 'max:255'], + 'pengurus.*.jabatan' => ['nullable', 'string', 'max:255'], + 'pengurus.*.kontak' => ['nullable', 'string', 'max:50'], + 'pengurus.*.status' => ['nullable', 'boolean'], + ]); + + foreach ($validated['pengurus'] ?? [] as $item) { + if (empty($item['nama_pengurus']) && empty($item['jabatan']) && empty($item['kontak'])) { + continue; + } + + $kelompokTani->pengurus()->create([ + 'uid' => 'PKT-' . strtoupper(Str::random(10)), + 'nama_pengurus' => $item['nama_pengurus'] ?? null, + 'jabatan' => $item['jabatan'] ?? null, + 'kontak' => $item['kontak'] ?? null, + 'status' => $item['status'] ?? false, + 'created_by' => auth()->id(), + 'updated_by' => auth()->id(), + ]); + } + + return $this->redirectToSection(route('kelompok-tani.pengurus-anggota.index', $kelompokTani->id), 'pengurus', 'Data pengurus berhasil ditambahkan.'); + } + + public function destroy(KelompokTani $kelompokTani, PengurusKelompokTani $pengurus) + { + $this->authorizeAccess(); + + abort_unless($pengurus->survey_kelompok_tani_id === $kelompokTani->id, 404); + + $pengurus->update(['deleted_by' => auth()->id()]); + $pengurus->delete(); + + return $this->redirectToSection(route('kelompok-tani.pengurus-anggota.index', $kelompokTani->id), 'pengurus', 'Data pengurus berhasil dihapus.'); + } +} diff --git a/app/Http/Controllers/Web/Produktivitas/SurveyKelompokTaniController.php b/app/Http/Controllers/Web/Produktivitas/SurveyKelompokTaniController.php new file mode 100644 index 0000000..b6461e1 --- /dev/null +++ b/app/Http/Controllers/Web/Produktivitas/SurveyKelompokTaniController.php @@ -0,0 +1,346 @@ +with([ + 'success' => $message, + 'success_section' => $section, + ]); + } + + public function index(Request $request) + { + $kelompokTani = KelompokTani::query() + ->when($request->search, fn ($query, $search) => $query->where('nama_kelompok', 'like', "%{$search}%")) + ->latest() + ->paginate($request->per_page ?? 10) + ->appends($request->query()); + + return view('produktivitas.survey-kelompok-tani.index', compact('kelompokTani')); + } + + public function create() + { + $this->authorizeAccess(); + + $provinsi = Provinsi::orderBy('kode', 'asc')->get(); + $komoditas = Komoditas::where('is_utama', true)->get(); + + return view('produktivitas.survey-kelompok-tani.add', compact('provinsi', 'komoditas')); + } + + public function store(Request $request) + { + $this->authorizeAccess(); + + $validated = $this->validateIdentitas($request); + + if (($validated['jenis_kelompok'] ?? null) === 'Lainnya') { + $validated['jenis_kelompok'] = $validated['jenis_kelompok_lainnya']; + } + unset($validated['jenis_kelompok_lainnya']); + + $kelompokTani = KelompokTani::create([ + ...$validated, + 'uid' => 'KLP-' . strtoupper(Str::random(10)), + 'created_by' => auth()->id(), + 'updated_by' => auth()->id(), + ]); + + return $this->redirectToSection(route('kelompok-tani.edit', $kelompokTani->id), 'identitas', 'Data kelompok tani berhasil ditambahkan.'); + } + + private function editUrl(KelompokTani $kelompokTani, string $section = 'identitas'): string + { + $url = route('kelompok-tani.edit', $kelompokTani->id); + + return $section === 'identitas' ? $url : $url . '?section=' . $section; + } + + public function edit(Request $request, KelompokTani $kelompokTani) + { + $this->authorizeAccess(); + + return match ($request->query('section', 'identitas')) { + 'kelembagaan' => view('produktivitas.survey-kelompok-tani.kelembagaan', compact('kelompokTani')), + 'aktivitas-fungsi' => view('produktivitas.survey-kelompok-tani.aktivitas-fungsi', compact('kelompokTani')), + 'sosial-konflik' => view('produktivitas.survey-kelompok-tani.sosial-konflik', compact('kelompokTani')), + default => view('produktivitas.survey-kelompok-tani.edit', [ + 'kelompokTani' => $kelompokTani, + 'provinsi' => Provinsi::orderBy('kode', 'asc')->get(), + 'komoditas' => Komoditas::where('is_utama', true)->get(), + ]), + }; + } + + public function update(Request $request, KelompokTani $kelompokTani) + { + $this->authorizeAccess(); + + return match ($request->input('section', 'identitas')) { + 'ringkasan-pengurus' => $this->updateRingkasanPengurus($request, $kelompokTani), + 'kelembagaan' => $this->updateKelembagaan($request, $kelompokTani), + 'aktivitas-fungsi' => $this->updateAktivitasFungsi($request, $kelompokTani), + 'kas' => $this->updateKasSimpanPinjam($request, $kelompokTani), + 'sosial-konflik' => $this->updateSosialKonflik($request, $kelompokTani), + 'status-bantuan' => $this->updateStatusBantuan($request, $kelompokTani), + 'penilaian' => $this->updatePenilaian($request, $kelompokTani), + default => $this->updateIdentitas($request, $kelompokTani), + }; + } + + public function destroy(string $id) + { + $this->authorizeAccess(); + + $kelompokTani = KelompokTani::findOrFail($id); + $kelompokTani->update(['deleted_by' => auth()->id()]); + $kelompokTani->delete(); + + return response()->json(['message' => 'Data kelompok tani berhasil dihapus.']); + } + + private function validateIdentitas(Request $request) + { + return $request->validate([ + // Data Responden + 'nama_responden' => ['required', 'string', 'max:255'], + 'jabatan_responden' => ['nullable', 'string', 'max:255'], + 'kontak_responden' => ['nullable', 'string', 'max:20'], + + // Identitas Kelompok Tani + 'nama_kelompok' => ['required', 'string', 'max:255'], + 'desa_kelurahan_id' => ['required', 'exists:master_desa_kelurahan,id'], + 'dusun' => ['nullable', 'string', 'max:255'], + 'tahun_berdiri' => ['nullable', 'digits:4', 'integer', 'min:1900', 'max:' . date('Y')], + 'jenis_kelompok' => ['required', 'string', 'max:50'], + 'jenis_kelompok_lainnya' => ['required_if:jenis_kelompok,Lainnya', 'nullable', 'string', 'max:255'], + 'nama_gapoktan' => ['nullable', 'string', 'max:255'], + 'komoditas_id' => ['nullable', 'array'], + 'komoditas_id.*' => ['exists:master_komoditas,id'], + ], [ + 'nama_responden.required' => 'Nama responden wajib diisi.', + 'nama_kelompok.required' => 'Nama kelompok wajib diisi.', + 'desa_kelurahan_id.required' => 'Desa/Kelurahan wajib dipilih.', + 'desa_kelurahan_id.exists' => 'Desa/Kelurahan tidak ditemukan.', + 'jenis_kelompok.required' => 'Jenis kelompok wajib dipilih.', + 'jenis_kelompok_lainnya.required_if' => 'Sebutkan jenis kelompok lainnya.', + 'tahun_berdiri.digits' => 'Tahun berdiri harus 4 digit.', + ]); + } + + private function updateIdentitas(Request $request, KelompokTani $kelompokTani) + { + $validated = $this->validateIdentitas($request); + + if (($validated['jenis_kelompok'] ?? null) === 'Lainnya') { + $validated['jenis_kelompok'] = $validated['jenis_kelompok_lainnya']; + } + unset($validated['jenis_kelompok_lainnya']); + + $kelompokTani->update([ + ...$validated, + 'updated_by' => auth()->id(), + ]); + + return $this->redirectToSection(route('kelompok-tani.edit', $kelompokTani->id), 'identitas', 'Data kelompok tani berhasil diperbarui.'); + } + + private function updateRingkasanPengurus(Request $request, KelompokTani $kelompokTani) + { + $validated = $request->validate([ + 'jumlah_pengurus' => ['nullable', 'integer', 'min:0'], + 'jumlah_pengurus_aktif' => ['nullable', 'integer', 'min:0'], + 'jumlah_anggota_terdaftar' => ['nullable', 'integer', 'min:0'], + 'jumlah_anggota_aktif' => ['nullable', 'integer', 'min:0'], + 'jumlah_pengurus_laki_laki' => ['nullable', 'integer', 'min:0'], + 'jumlah_pengurus_perempuan' => ['nullable', 'integer', 'min:0'], + 'jumlah_anggota_laki_laki' => ['nullable', 'integer', 'min:0'], + 'jumlah_anggota_perempuan' => ['nullable', 'integer', 'min:0'], + 'jumlah_anggota_pemuda_laki_laki' => ['nullable', 'integer', 'min:0'], + 'jumlah_anggota_pemuda_perempuan' => ['nullable', 'integer', 'min:0'], + ]); + + $kelompokTani->update([ + ...$validated, + 'updated_by' => auth()->id(), + ]); + + return $this->redirectToSection(route('kelompok-tani.pengurus-anggota.index', $kelompokTani->id), 'ringkasan', 'Ringkasan pengurus & anggota berhasil disimpan.'); + } + + private function updateKelembagaan(Request $request, KelompokTani $kelompokTani) + { + $validated = $request->validate([ + // Cakupan Wilayah Kelompok + 'cakupan_wilayah' => ['nullable', 'string', 'max:50'], + 'nama_wilayah_cakupan' => ['nullable', 'string'], + + // Status Legalitas Kelompok + 'status_legalitas' => ['nullable', 'string', 'max:50'], + 'nomor_sk' => ['nullable', 'string', 'max:100'], + 'tanggal_tahun_penerbitan_sk' => ['nullable', 'string', 'max:30'], + + // Kualitas Kepemimpinan + 'tingkat_keaktifan_ketua' => ['nullable', 'string', 'max:30'], + 'status_pembagian_peran' => ['nullable', 'string', 'max:30'], + 'status_dokumentasi_rapat' => ['nullable', 'string', 'max:30'], + + // Frekuensi Pertemuan Rutin + 'frekuensi_pertemuan' => ['nullable', 'string', 'max:50'], + 'tanggal_pertemuan_terakhir' => ['nullable', 'date'], + ]); + + $kelompokTani->update([ + ...$validated, + 'updated_by' => auth()->id(), + ]); + + return $this->redirectToSection($this->editUrl($kelompokTani, 'kelembagaan'), 'kelembagaan', 'Data kelembagaan berhasil disimpan.'); + } + + private function resolveLainnya(?array $selected, ?string $lainnyaText): ?array + { + if (empty($selected)) { + return $selected; + } + + return array_values(array_map(function ($item) use ($lainnyaText) { + return $item === 'Lainnya' && filled($lainnyaText) ? $lainnyaText : $item; + }, $selected)); + } + + private function updateAktivitasFungsi(Request $request, KelompokTani $kelompokTani) + { + $validated = $request->validate([ + // Kegiatan Konkret yang Sudah Berjalan + 'kegiatan_terlaksana' => ['nullable', 'array'], + 'kegiatan_terlaksana.*' => ['string', 'max:255'], + 'kegiatan_terlaksana_lainnya' => ['nullable', 'string', 'max:255'], + + 'estimasi_panen_minimal' => ['nullable', 'numeric', 'min:0'], + 'estimasi_panen_maksimal' => ['nullable', 'numeric', 'min:0', 'gte:estimasi_panen_minimal'], + 'satuan_hasil_panen' => ['nullable', 'string', 'max:20'], + + 'tindakan_hasil_panen' => ['nullable', 'array'], + 'tindakan_hasil_panen.*' => ['string', 'max:255'], + + // Peran dan Fungsi Kelompok + 'fungsi_kelompok_bagi_anggota' => ['nullable', 'array'], + 'fungsi_kelompok_bagi_anggota.*' => ['string', 'max:255'], + 'fungsi_kelompok_lainnya' => ['nullable', 'string', 'max:255'], + ], [ + 'estimasi_panen_maksimal.gte' => 'Estimasi panen maksimal tidak boleh kurang dari estimasi minimal.', + ]); + + $validated['kegiatan_terlaksana'] = $this->resolveLainnya( + $validated['kegiatan_terlaksana'] ?? null, + $validated['kegiatan_terlaksana_lainnya'] ?? null + ); + unset($validated['kegiatan_terlaksana_lainnya']); + + $validated['fungsi_kelompok_bagi_anggota'] = $this->resolveLainnya( + $validated['fungsi_kelompok_bagi_anggota'] ?? null, + $validated['fungsi_kelompok_lainnya'] ?? null + ); + unset($validated['fungsi_kelompok_lainnya']); + + $kelompokTani->update([ + ...$validated, + 'updated_by' => auth()->id(), + ]); + + return $this->redirectToSection($this->editUrl($kelompokTani, 'aktivitas-fungsi'), 'aktivitas-fungsi', 'Data aktivitas & fungsi kelompok berhasil disimpan.'); + } + + private function updateKasSimpanPinjam(Request $request, KelompokTani $kelompokTani) + { + $validated = $request->validate([ + 'pembukuan_kas' => ['nullable', 'string', 'max:50'], + 'pengelola_kas' => ['nullable', 'string', 'max:255'], + 'masalah_pengelolaan_kas_simpan_pinjam' => ['nullable', 'string', 'max:255'], + 'deskripsi_masalah_pengelolaan_kas_simpan_pinjam' => ['nullable', 'string'], + ]); + + $kelompokTani->update([ + ...$validated, + 'updated_by' => auth()->id(), + ]); + + return $this->redirectToSection(route('kelompok-tani.aset-keuangan.index', $kelompokTani->id), 'kas', 'Data kas/simpan-pinjam berhasil disimpan.'); + } + + private function updateSosialKonflik(Request $request, KelompokTani $kelompokTani) + { + $validated = $request->validate([ + // Keterlibatan Perempuan + 'partisipasi_perempuan' => ['nullable', 'string', 'max:255'], + + // Riwayat Konflik Internal Kelompok + 'konflik_kelompok' => ['nullable', 'string', 'max:255'], + 'topik_konflik' => ['nullable', 'string', 'max:255'], + 'penyelesaian_konflik' => ['nullable', 'string'], + ]); + + if (!in_array($validated['konflik_kelompok'] ?? null, ['Pernah, sudah selesai', 'Pernah, masih berlanjut/belum selesai'])) { + $validated['topik_konflik'] = null; + $validated['penyelesaian_konflik'] = null; + } + + $kelompokTani->update([ + ...$validated, + 'updated_by' => auth()->id(), + ]); + + return $this->redirectToSection($this->editUrl($kelompokTani, 'sosial-konflik'), 'sosial-konflik', 'Data sosial & konflik berhasil disimpan.'); + } + + private function updateStatusBantuan(Request $request, KelompokTani $kelompokTani) + { + $validated = $request->validate([ + 'pernah_mendapatkan_bantuan' => ['required', 'boolean'], + ]); + + $kelompokTani->update([ + ...$validated, + 'updated_by' => auth()->id(), + ]); + + return $this->redirectToSection(route('kelompok-tani.bantuan-penilaian.index', $kelompokTani->id), 'status-bantuan', 'Status akses bantuan berhasil disimpan.'); + } + + private function updatePenilaian(Request $request, KelompokTani $kelompokTani) + { + $validated = $request->validate([ + 'potensi_kelompok' => ['nullable', 'string', 'max:50'], + 'alasan_penilaian_potensi' => ['nullable', 'string'], + ]); + + $kelompokTani->update([ + ...$validated, + 'updated_by' => auth()->id(), + ]); + + return $this->redirectToSection(route('kelompok-tani.bantuan-penilaian.index', $kelompokTani->id), 'penilaian', 'Penilaian potensi kelompok berhasil disimpan.'); + } +} diff --git a/app/Models/Pertanian/AsetKelompokTani.php b/app/Models/Pertanian/AsetKelompokTani.php new file mode 100644 index 0000000..727da65 --- /dev/null +++ b/app/Models/Pertanian/AsetKelompokTani.php @@ -0,0 +1,37 @@ + 'boolean', + ]; + + public function kelompokTani(): BelongsTo + { + return $this->belongsTo(KelompokTani::class, 'survey_kelompok_tani_id'); + } +} diff --git a/app/Models/Pertanian/BantuanKelompokTani.php b/app/Models/Pertanian/BantuanKelompokTani.php new file mode 100644 index 0000000..97d7d93 --- /dev/null +++ b/app/Models/Pertanian/BantuanKelompokTani.php @@ -0,0 +1,33 @@ +belongsTo(KelompokTani::class, 'survey_kelompok_tani_id'); + } +} diff --git a/app/Models/Pertanian/KelompokTani.php b/app/Models/Pertanian/KelompokTani.php new file mode 100644 index 0000000..3d813ab --- /dev/null +++ b/app/Models/Pertanian/KelompokTani.php @@ -0,0 +1,136 @@ + 'array', + 'tindakan_hasil_panen' => 'array', + 'fungsi_kelompok_bagi_anggota' => 'array', + 'kegiatan_terlaksana' => 'array', + + 'pernah_mendapatkan_bantuan' => 'boolean', + + 'tanggal_pertemuan_terakhir' => 'date', + + 'estimasi_panen_minimal' => 'decimal:2', + 'estimasi_panen_maksimal' => 'decimal:2', + ]; + + public function desaKelurahan() + { + return $this->belongsTo(DesaKelurahan::class, 'desa_kelurahan_id'); + } + + public function pengurus() + { + return $this->hasMany(PengurusKelompokTani::class, 'survey_kelompok_tani_id'); + } + + public function aset() + { + return $this->hasMany(AsetKelompokTani::class, 'survey_kelompok_tani_id'); + } + + public function bantuan() + { + return $this->hasMany(BantuanKelompokTani::class, 'survey_kelompok_tani_id'); + } +} diff --git a/app/Models/Pertanian/PengurusKelompokTani.php b/app/Models/Pertanian/PengurusKelompokTani.php new file mode 100644 index 0000000..6599563 --- /dev/null +++ b/app/Models/Pertanian/PengurusKelompokTani.php @@ -0,0 +1,37 @@ + 'boolean', + ]; + + public function kelompokTani(): BelongsTo + { + return $this->belongsTo(KelompokTani::class, 'survey_kelompok_tani_id'); + } +} diff --git a/database/migrations/2026_07_22_132642_create_kelompok_tani_table.php b/database/migrations/2026_07_22_132642_create_kelompok_tani_table.php new file mode 100644 index 0000000..b0a6187 --- /dev/null +++ b/database/migrations/2026_07_22_132642_create_kelompok_tani_table.php @@ -0,0 +1,142 @@ +id(); + $table->string('uid')->unique(); + // Data Responden + $table->string('nama_responden')->nullable(); + $table->string('jabatan_responden')->nullable(); + $table->string('kontak_responden')->nullable(); + // Identitas Kelompok Tani + $table->string('nama_kelompok')->nullable(); + $table->foreignId('desa_kelurahan_id')->nullable()->constrained('master_desa_kelurahan'); + $table->string('dusun')->nullable(); + $table->year('tahun_berdiri')->nullable(); + $table->string('jenis_kelompok', 50)->nullable(); + $table->string('nama_gapoktan')->nullable(); + $table->jsonb('komoditas_id')->nullable(); + // Pengurus & Anggota Kelompok + $table->unsignedInteger('jumlah_pengurus')->nullable(); + $table->unsignedInteger('jumlah_pengurus_aktif')->nullable(); + $table->unsignedInteger('jumlah_anggota_terdaftar')->nullable(); + $table->unsignedInteger('jumlah_anggota_aktif')->nullable(); + $table->unsignedInteger('jumlah_pengurus_laki_laki')->nullable(); + $table->unsignedInteger('jumlah_pengurus_perempuan')->nullable(); + $table->unsignedInteger('jumlah_anggota_laki_laki')->nullable(); + $table->unsignedInteger('jumlah_anggota_perempuan')->nullable(); + $table->unsignedInteger('jumlah_anggota_pemuda_laki_laki')->nullable(); + $table->unsignedInteger('jumlah_anggota_pemuda_perempuan')->nullable(); + // Cakupan Wilayah Kelompok + $table->string('cakupan_wilayah')->nullable(); + $table->text('nama_wilayah_cakupan')->nullable(); + // Status Legalitas Kelompok + $table->string('status_legalitas', 50)->nullable(); + $table->string('nomor_sk', 100)->nullable(); + $table->string('tanggal_tahun_penerbitan_sk', 30)->nullable(); + // Kualitas Kepemimpinan + $table->string('tingkat_keaktifan_ketua', 30)->nullable(); + $table->string('status_pembagian_peran', 30)->nullable(); + $table->string('status_dokumentasi_rapat', 30)->nullable(); + // Frekuensi Pertemuan Rutin + $table->string('frekuensi_pertemuan', 50)->nullable(); + $table->date('tanggal_pertemuan_terakhir')->nullable(); + // Kegiatan Kongkret yang Sudah Berjalan + $table->jsonb('kegiatan_terlaksana')->nullable(); + $table->decimal('estimasi_panen_minimal', 10, 2)->nullable(); + $table->decimal('estimasi_panen_maksimal', 10, 2)->nullable(); + $table->string('satuan_hasil_panen')->nullable(); + $table->jsonb('tindakan_hasil_panen')->nullable(); + // Peran & Fungsi Kelompok + $table->jsonb('fungsi_kelompok_bagi_anggota')->nullable(); + // Kapasitas Pengelolaan Kas/Simpan-Pinjam Kelompok + $table->string('pembukuan_kas', 50)->nullable(); + $table->string('pengelola_kas')->nullable(); + $table->string('masalah_pengelolaan_kas_simpan_pinjam')->nullable(); + $table->text('deskripsi_masalah_pengelolaan_kas_simpan_pinjam')->nullable(); + // Keterlibatan Perempuan + $table->string('partisipasi_perempuan')->nullable(); + // Riwayat konflik Internal Kelompok + $table->string('konflik_kelompok')->nullable(); + $table->string('topik_konflik')->nullable(); + $table->text('penyelesaian_konflik')->nullable(); + // Pengalaman Akses Bantuan + $table->boolean('pernah_mendapatkan_bantuan')->nullable(); + // Postensi Sebagai Mitra Agregasi/Pengolahan Kolektif + $table->string('potensi_kelompok')->nullable(); + $table->text('alasan_penilaian_potensi')->nullable(); + + $table->foreignId('created_by')->nullable()->constrained('users')->onDelete('set null'); + $table->foreignId('updated_by')->nullable()->constrained('users')->onDelete('set null'); + $table->foreignId('deleted_by')->nullable()->constrained('users')->onDelete('set null'); + $table->timestamps(); + $table->softDeletes(); + }); + + Schema::create('survey_pengurus_kelompok_tani', function (Blueprint $table) { + $table->id(); + $table->string('uid')->unique(); + $table->foreignId('survey_kelompok_tani_id')->nullable()->constrained('survey_kelompok_tani')->cascadeOnUpdate()->cascadeOnDelete(); + $table->string('nama_pengurus'); + $table->string('jabatan'); + $table->string('kontak'); + $table->boolean('status'); + $table->foreignId('created_by')->nullable()->constrained('users')->onDelete('set null'); + $table->foreignId('updated_by')->nullable()->constrained('users')->onDelete('set null'); + $table->foreignId('deleted_by')->nullable()->constrained('users')->onDelete('set null'); + $table->timestamps(); + $table->softDeletes(); + }); + + Schema::create('survey_aset_kelompok_tani', function (Blueprint $table) { + $table->id(); + $table->string('uid')->unique(); + $table->foreignId('survey_kelompok_tani_id')->nullable()->constrained('survey_kelompok_tani')->cascadeOnUpdate()->cascadeOnDelete(); + $table->string('jenis_aset'); + $table->boolean('status_aset'); + $table->string('status_pengelolaan_aset'); + $table->string('kondisi_aset'); + $table->foreignId('created_by')->nullable()->constrained('users')->onDelete('set null'); + $table->foreignId('updated_by')->nullable()->constrained('users')->onDelete('set null'); + $table->foreignId('deleted_by')->nullable()->constrained('users')->onDelete('set null'); + $table->timestamps(); + $table->softDeletes(); + }); + + Schema::create('survey_bantuan_kelompok_tani', function (Blueprint $table) { + $table->id(); + $table->string('uid')->unique(); + $table->foreignId('survey_kelompok_tani_id')->nullable()->constrained('survey_kelompok_tani')->cascadeOnUpdate()->cascadeOnDelete(); + $table->string('nama_program'); + $table->string('penyelenggara'); + $table->string('bentuk_bantuan'); + $table->year('tahun'); + $table->foreignId('created_by')->nullable()->constrained('users')->onDelete('set null'); + $table->foreignId('updated_by')->nullable()->constrained('users')->onDelete('set null'); + $table->foreignId('deleted_by')->nullable()->constrained('users')->onDelete('set null'); + $table->timestamps(); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('survey_bantuan_kelompok_tani'); + Schema::dropIfExists('survey_aset_kelompok_tani'); + Schema::dropIfExists('survey_pengurus_kelompok_tani'); + Schema::dropIfExists('survey_kelompok_tani'); + } +}; diff --git a/public/assets/img/logo/agera_buttom.svg b/public/assets/img/logo/agera_buttom.svg new file mode 100644 index 0000000..d0210ee --- /dev/null +++ b/public/assets/img/logo/agera_buttom.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/img/logo/agera_icon.svg b/public/assets/img/logo/agera_icon.svg new file mode 100644 index 0000000..1430fcc --- /dev/null +++ b/public/assets/img/logo/agera_icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/img/logo/agera_side.svg b/public/assets/img/logo/agera_side.svg new file mode 100644 index 0000000..f5f0317 --- /dev/null +++ b/public/assets/img/logo/agera_side.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/js/config.js b/public/assets/js/config.js index 2e07578..47b3dd9 100644 --- a/public/assets/js/config.js +++ b/public/assets/js/config.js @@ -71,13 +71,13 @@ window.templateName = document.documentElement.getAttribute('data-template'); if (typeof TemplateCustomizer !== 'undefined') { window.templateCustomizer = new TemplateCustomizer({ - displayCustomizer: true, + displayCustomizer: false, lang: localStorage.getItem('templateCustomizer-' + templateName + '--Lang') || 'en', // Set default language here - // defaultPrimaryColor: '#D11BB4', + defaultPrimaryColor: '#2a7233', // defaultSkin: 1, // defaultTheme: 'system', // defaultSemiDark: true, - // defaultContentLayout: 'wide', + defaultContentLayout: 'wide', // defaultHeaderType: 'static', // defaultMenuCollapsed: true, // defaultNavbarType: 'static', diff --git a/resources/views/auth/layout.blade.php b/resources/views/auth/layout.blade.php index 5cd55ff..7c2046d 100644 --- a/resources/views/auth/layout.blade.php +++ b/resources/views/auth/layout.blade.php @@ -14,7 +14,7 @@ name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" /> - Agomonev | {{ $title ?? 'Auth' }} + AGERA | {{ $title ?? 'Auth' }} @@ -26,7 +26,7 @@ - + @@ -72,6 +72,21 @@ + + diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index 27468cb..8bb4835 100644 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -6,24 +6,12 @@
- AgroMonev
-

Selamat datang di AgroMonev!

+

Selamat datang di AGERA!

Silakan masuk ke akun Anda

@if ($errors->any())
diff --git a/resources/views/auth/register.blade.php b/resources/views/auth/register.blade.php index e46bb62..027b72a 100644 --- a/resources/views/auth/register.blade.php +++ b/resources/views/auth/register.blade.php @@ -6,40 +6,12 @@
- - - AgroMonev +
-

Buat akun AgroMonev

+

Buat akun AGERA

Lengkapi data berikut untuk membuat akun baru.

diff --git a/resources/views/layout/header.blade.php b/resources/views/layout/header.blade.php index b0f3656..738ef76 100644 --- a/resources/views/layout/header.blade.php +++ b/resources/views/layout/header.blade.php @@ -15,7 +15,7 @@ name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" /> - AgroMonev | {{ $title ?? 'Database Petani' }} + AGERA | {{ $title ?? 'Database Petani' }} @@ -26,7 +26,7 @@ - + @@ -64,6 +64,26 @@ + @stack('style') diff --git a/resources/views/layout/sidebar.blade.php b/resources/views/layout/sidebar.blade.php index e8d7679..42d55b5 100644 --- a/resources/views/layout/sidebar.blade.php +++ b/resources/views/layout/sidebar.blade.php @@ -2,38 +2,11 @@
- - - AgroMonev + @@ -121,42 +94,37 @@ @endif @if(in_array($userRole, ['fasilitator', 'super_admin', 'admin']) && env('APP_NAME') == 'AgroMonev') - - + + + @if(in_array($userRole, ['super_admin', 'admin']) && env('APP_NAME') == 'AgroMonev') + + + + @endif @endif - @if(in_array($userRole, ['super_admin', 'admin']) && env('APP_NAME') == 'AgroMonev') - - - @endif - - @if(in_array($userRole, ['super_admin', 'admin']) && env('APP_NAME') == 'AgroMonev') - - - @endif - - - + @if(in_array($userRole, ['super_admin', 'admin']) && env('APP_NAME') == 'AgroPro')