diff --git a/app/Http/Controllers/Api/Ekosistem/TabelBasisDataController.php b/app/Http/Controllers/Api/Ekosistem/TabelBasisDataController.php index 4f6512d..f02ee4f 100644 --- a/app/Http/Controllers/Api/Ekosistem/TabelBasisDataController.php +++ b/app/Http/Controllers/Api/Ekosistem/TabelBasisDataController.php @@ -54,11 +54,10 @@ class TabelBasisDataController extends Controller abort(403); } - $tabel = TabelBasisData::with('kolom')->findOrFail($id); + $tabel = TabelBasisData::with('kolom', 'form', 'form.form', 'form.form.form', 'form.form.form.kolom')->findOrFail($id); return (new TabelBasisDataResource($tabel)) - ->response() - ->setStatusCode(201); + ->response(); } /** diff --git a/app/Http/Controllers/Api/TanamanController.php b/app/Http/Controllers/Api/TanamanController.php index 3f938cd..29c1a84 100644 --- a/app/Http/Controllers/Api/TanamanController.php +++ b/app/Http/Controllers/Api/TanamanController.php @@ -94,20 +94,24 @@ class TanamanController extends Controller if (!Gate::any(['petani', 'fasilitator','super_admin'])) { abort(403); } - $profile = Auth::user()->profile; + + $user = Auth::user(); + $profile = $user->profile; + $profileId = $user->role === 'petani' ? $profile->id : $request->profile_id; $request->merge([ 'komoditas_id' => $request->input('komoditas.id') ?? $request->input('komoditas_id'), 'lahan_id' => $request->input('lahan.id') ?? $request->input('lahan_id'), - 'profile_id' => $profile->id + 'profile_id' => $profileId, ]); + $validated = $request->validate([ 'nama' => ['required', 'string', 'max:255'], 'komoditas_id' => ['required', 'exists:master_komoditas,id'], 'lahan_id' => [ 'required', - Rule::exists('map_lahan', 'id')->where(function ($query) use ($profile) { - $query->where('profile_id', $profile->id) + Rule::exists('map_lahan', 'id')->where(function ($query) use ($profileId) { + $query->where('profile_id', $profileId) ->whereNull('deleted_at'); }), ], diff --git a/app/Http/Controllers/Web/Ekosistem/FormBasisDataController.php b/app/Http/Controllers/Web/Ekosistem/FormBasisDataController.php index 4d03593..c2982ec 100644 --- a/app/Http/Controllers/Web/Ekosistem/FormBasisDataController.php +++ b/app/Http/Controllers/Web/Ekosistem/FormBasisDataController.php @@ -10,6 +10,7 @@ use Illuminate\Http\JsonResponse; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Validator; use Illuminate\Validation\Rule; +use Illuminate\Http\RedirectResponse; use App\Models\Ekosistem\TabelBasisData; use App\Models\Ekosistem\FormBasisData; diff --git a/app/Http/Controllers/Web/Ekosistem/ValueBasisDataController.php b/app/Http/Controllers/Web/Ekosistem/ValueBasisDataController.php index 8279d3b..ce3e301 100644 --- a/app/Http/Controllers/Web/Ekosistem/ValueBasisDataController.php +++ b/app/Http/Controllers/Web/Ekosistem/ValueBasisDataController.php @@ -12,6 +12,7 @@ use Illuminate\Support\Facades\Validator; use Illuminate\Http\JsonResponse; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Str; +use Illuminate\Support\Arr; use App\Models\Ekosistem\TabelBasisData; use App\Models\Ekosistem\KolomBasisData; @@ -21,6 +22,13 @@ use App\Models\Core\Program; class ValueBasisDataController extends Controller { + private $tableModelClassMap = [ + 'master_provinsi' => \App\Models\Wilayah\Provinsi::class, + 'master_kabupaten_kota' => \App\Models\Wilayah\KabupatenKota::class, + 'master_kecamatan' => \App\Models\Wilayah\Kecamatan::class, + 'master_desa_kelurahan' => \App\Models\Wilayah\DesaKelurahan::class, + ]; + public function index(Request $request, string $tabelId): View { if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) { @@ -166,7 +174,7 @@ class ValueBasisDataController extends Controller if (!Gate::any(['super_admin', 'admin'])) { abort(403); } - + $tabel = TabelBasisData::with('kolom') ->whereHas('kolom', function ($query) { $query->where('is_active', true); @@ -198,7 +206,12 @@ class ValueBasisDataController extends Controller if ($k->tipe == 'foreign_key') { $relasi['kolom_id'] = $k->id; try { - $options_kolom = DB::table($k->relasi_tabel)->selectRaw($k->relasi_kolom_label . ' as label, ' . $k->relasi_kolom_id . ' as value')->whereNull('deleted_at'); + $modelClass = Arr::get($this->tableModelClassMap, 'master_desa_kelurahan'); + if ($modelClass) { + $options_kolom = $modelClass::select($k->relasi_kolom_label . ' as label', $k->relasi_kolom_id . ' as value')->limit(10000); + } else { + $options_kolom = DB::table($k->relasi_tabel)->selectRaw($k->relasi_kolom_label . ' as label, ' . $k->relasi_kolom_id . ' as value')->whereNull('deleted_at')->limit(10000); + } $relasi['options'] = $options_kolom->get(); $relasi['sql'] = $options_kolom->toSql(); } catch (\Throwable $th) { @@ -281,9 +294,6 @@ class ValueBasisDataController extends Controller return redirect()->route('tabel.data.index', [$tabelId, 'program_id' => $program->id])->with('success', 'Data berhasil ditambahkan.'); } - /** - * Display the specified resource. - */ public function show(Request $request, string $tabelId, string $id): View { if (!Gate::any(['super_admin', 'admin'])) { @@ -329,7 +339,9 @@ class ValueBasisDataController extends Controller foreach ($values as $v) { $k = $kolom->where('id', $v->kolom_id)->first(); if ($k->tipe == 'foreign_key') { - $v->value_relasi_label = DB::table($k->relasi_tabel)->where($k->relasi_kolom_id, $v->value_relasi)->value($k->relasi_kolom_label); + $v->value_relasi_label = DB::table($k->relasi_tabel) + ->where($k->relasi_kolom_id, $v->value_relasi) + ->value($k->relasi_kolom_label); } else if ($k->tipe == 'enum') { $opsi = collect($k->enum_opsi); $found = $opsi->first(function ($item) use ($v) { @@ -393,7 +405,12 @@ class ValueBasisDataController extends Controller if ($k->tipe == 'foreign_key') { $relasi['kolom_id'] = $k->id; try { - $options_kolom = DB::table($k->relasi_tabel)->selectRaw($k->relasi_kolom_label . ' as label, ' . $k->relasi_kolom_id . ' as value')->whereNull('deleted_at'); + $modelClass = Arr::get($this->tableModelClassMap, 'master_desa_kelurahan'); + if ($modelClass) { + $options_kolom = $modelClass::select($k->relasi_kolom_label . ' as label', $k->relasi_kolom_id . ' as value')->limit(10000); + } else { + $options_kolom = DB::table($k->relasi_tabel)->selectRaw($k->relasi_kolom_label . ' as label, ' . $k->relasi_kolom_id . ' as value')->whereNull('deleted_at')->limit(10000); + } $relasi['options'] = $options_kolom->get(); $relasi['sql'] = $options_kolom->toSql(); } catch (\Throwable $th) { diff --git a/app/Http/Controllers/Web/Master/JenisKomoditasController.php b/app/Http/Controllers/Web/Master/JenisKomoditasController.php new file mode 100644 index 0000000..ea6ce41 --- /dev/null +++ b/app/Http/Controllers/Web/Master/JenisKomoditasController.php @@ -0,0 +1,228 @@ +get('per_page', 10); + $search = $request->get('search'); + + $jenisKomoditas = JenisKomoditas::with('komoditas') + ->when($search, function ($query) use ($search) { + $query->where(function ($q) use ($search) { + $q->where('nama', 'ILIKE', "%{$search}%") + ->orWhere('path', 'ILIKE', "%{$search}%") + ->orWhereHas('komoditas', function ($komoditasQuery) use ($search) { + $komoditasQuery->where('nama', 'ILIKE', "%{$search}%"); + }); + }); + }) + ->latest() + ->paginate($perPage); + + $komoditas = Komoditas::orderBy('nama', 'asc')->get(); + + return view('master.jeniskomoditas.index', compact( + 'jenisKomoditas', + 'komoditas' + )); + } + + public function getByKomoditas($komoditas_id) + { + $jenisKomoditas = JenisKomoditas::where('komoditas_id', $komoditas_id) + ->orderBy('nama', 'asc') + ->get(['id', 'nama']); + + return response()->json([ + 'status' => 'success', + 'data' => $jenisKomoditas, + ]); + } + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request) + { + $validated = $request->validate([ + 'komoditas_id' => [ + 'required', + 'integer', + 'exists:master_komoditas,id', + ], + 'nama' => [ + 'required', + 'string', + 'max:255', + Rule::unique('jenis_komoditas', 'nama') + ->where('komoditas_id', $request->komoditas_id), + ], + ], [ + 'komoditas_id.required' => 'Komoditas wajib dipilih.', + 'komoditas_id.exists' => 'Komoditas yang dipilih tidak valid.', + 'nama.required' => 'Nama jenis komoditas wajib diisi.', + 'nama.unique' => 'Nama jenis komoditas sudah tersedia pada komoditas ini.', + ]); + + try { + DB::beginTransaction(); + + $jenisKomoditas = JenisKomoditas::create([ + 'komoditas_id' => $validated['komoditas_id'], + 'nama' => $validated['nama'], + 'created_by' => auth()->id(), + 'updated_by' => auth()->id(), + ]); + + DB::commit(); + + return response()->json([ + 'status' => 'success', + 'message' => 'Data jenis komoditas berhasil disimpan.', + 'data' => $jenisKomoditas, + ]); + } catch (\Throwable $e) { + DB::rollBack(); + + Log::error('Gagal menyimpan jenis komoditas', [ + 'error' => $e->getMessage(), + 'request' => $request->all(), + ]); + + return response()->json([ + 'status' => 'error', + 'message' => 'Gagal menyimpan data: ' . $e->getMessage(), + ], 500); + } + } + + /** + * Display the specified resource. + */ + public function show(string $id) + { + try { + $jenisKomoditas = JenisKomoditas::with('komoditas')->findOrFail($id); + + return response()->json([ + 'status' => 'success', + 'data' => $jenisKomoditas, + ]); + } catch (\Throwable $e) { + return response()->json([ + 'status' => 'error', + 'message' => 'Data jenis komoditas tidak ditemukan.', + ], 404); + } + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, string $id) + { + $jenisKomoditas = JenisKomoditas::findOrFail($id); + + $validated = $request->validate([ + 'komoditas_id' => [ + 'required', + 'integer', + 'exists:master_komoditas,id', + ], + 'nama' => [ + 'required', + 'string', + 'max:255', + Rule::unique('jenis_komoditas', 'nama') + ->where('komoditas_id', $request->komoditas_id) + ->ignore($jenisKomoditas->id), + ], + 'path' => [ + 'nullable', + 'string', + ], + ], [ + 'komoditas_id.required' => 'Komoditas wajib dipilih.', + 'komoditas_id.exists' => 'Komoditas yang dipilih tidak valid.', + 'nama.required' => 'Nama jenis komoditas wajib diisi.', + 'nama.unique' => 'Nama jenis komoditas sudah tersedia pada komoditas ini.', + ]); + + try { + DB::beginTransaction(); + + $jenisKomoditas->update([ + 'komoditas_id' => $validated['komoditas_id'], + 'nama' => $validated['nama'], + 'updated_by' => auth()->id(), + ]); + + DB::commit(); + + return response()->json([ + 'status' => 'success', + 'message' => 'Data jenis komoditas berhasil diperbarui.', + 'data' => $jenisKomoditas->fresh('komoditas'), + ]); + } catch (\Throwable $e) { + DB::rollBack(); + + Log::error('Gagal update jenis komoditas', [ + 'error' => $e->getMessage(), + 'id' => $id, + 'request' => $request->all(), + ]); + + return response()->json([ + 'status' => 'error', + 'message' => 'Gagal mengupdate data: ' . $e->getMessage(), + ], 500); + } + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(string $id) + { + try { + DB::beginTransaction(); + + $jenisKomoditas = JenisKomoditas::findOrFail($id); + $jenisKomoditas->update(['deleted_by' => auth()->id()]); + $jenisKomoditas->delete(); + + DB::commit(); + + return response()->json([ + 'status' => 'success', + 'message' => 'Data jenis komoditas berhasil dihapus.', + ]); + } catch (\Throwable $e) { + DB::rollBack(); + + Log::error('Gagal hapus jenis komoditas', [ + 'error' => $e->getMessage(), + 'id' => $id, + ]); + + return response()->json([ + 'status' => 'error', + 'message' => 'Gagal menghapus data: ' . $e->getMessage(), + ], 500); + } + } +} diff --git a/app/Http/Controllers/Web/Master/VarietasController.php b/app/Http/Controllers/Web/Master/VarietasController.php new file mode 100644 index 0000000..420380c --- /dev/null +++ b/app/Http/Controllers/Web/Master/VarietasController.php @@ -0,0 +1,226 @@ +get('per_page', 10); + $search = $request->get('search'); + + $varietas = Varietas::with(['komoditas', 'jenisKomoditas']) + ->when($search, function ($query) use ($search) { + $query->where(function ($q) use ($search) { + $q->where('nama', 'ILIKE', "%{$search}%") + ->orWhere('path', 'ILIKE', "%{$search}%") + ->orWhereHas('komoditas', function ($komoditasQuery) use ($search) { + $komoditasQuery->where('nama', 'ILIKE', "%{$search}%"); + }) + ->orWhereHas('jenisKomoditas', function ($jenisQuery) use ($search) { + $jenisQuery->where('nama', 'ILIKE', "%{$search}%"); + }); + }); + }) + ->latest() + ->paginate($perPage); + + $komoditas = Komoditas::orderBy('nama', 'asc')->get(); + + return view('master.varietas.index', compact( + 'varietas', + 'komoditas' + )); + } + + public function store(Request $request) + { + $komoditasTable = (new Komoditas)->getTable(); + $jenisKomoditasTable = (new JenisKomoditas)->getTable(); + $varietasTable = (new Varietas)->getTable(); + + $validated = $request->validate([ + 'komoditas_id' => [ + 'required', + 'integer', + Rule::exists($komoditasTable, 'id'), + ], + 'jenis_komoditas_id' => [ + 'required', + 'integer', + Rule::exists($jenisKomoditasTable, 'id') + ->where('komoditas_id', $request->komoditas_id), + ], + 'nama' => [ + 'required', + 'string', + 'max:255', + Rule::unique($varietasTable, 'nama') + ->where('komoditas_id', $request->komoditas_id) + ->where('jenis_komoditas_id', $request->jenis_komoditas_id), + ], + 'deskripsi' => [ + 'nullable', + 'string', + ], + ]); + + try { + DB::beginTransaction(); + + $varietas = Varietas::create([ + 'komoditas_id' => $validated['komoditas_id'], + 'jenis_komoditas_id' => $validated['jenis_komoditas_id'], + 'nama' => $validated['nama'], + 'deskripsi' => $validated['deskripsi'] ?? null, + 'created_by' => auth()->id(), + 'updated_by' => auth()->id(), + ]); + + DB::commit(); + + return response()->json([ + 'status' => 'success', + 'message' => 'Data varietas berhasil disimpan.', + 'data' => $varietas, + ]); + } catch (\Throwable $e) { + DB::rollBack(); + + Log::error('Gagal menyimpan varietas', [ + 'error' => $e->getMessage(), + 'request' => $request->all(), + ]); + + return response()->json([ + 'status' => 'error', + 'message' => 'Gagal menyimpan data: ' . $e->getMessage(), + ], 500); + } + } + + public function show(string $id) + { + try { + $varietas = Varietas::with(['komoditas', 'jenisKomoditas'])->findOrFail($id); + + return response()->json([ + 'status' => 'success', + 'data' => $varietas, + ]); + } catch (\Throwable $e) { + return response()->json([ + 'status' => 'error', + 'message' => 'Data varietas tidak ditemukan.', + ], 404); + } + } + + public function update(Request $request, string $id) + { + $komoditasTable = (new Komoditas)->getTable(); + $jenisKomoditasTable = (new JenisKomoditas)->getTable(); + $varietasTable = (new Varietas)->getTable(); + + $validated = $request->validate([ + 'komoditas_id' => [ + 'required', + 'integer', + Rule::exists($komoditasTable, 'id'), + ], + 'jenis_komoditas_id' => [ + 'required', + 'integer', + Rule::exists($jenisKomoditasTable, 'id') + ->where('komoditas_id', $request->komoditas_id), + ], + 'nama' => [ + 'required', + 'string', + 'max:255', + Rule::unique($varietasTable, 'nama') + ->where('komoditas_id', $request->komoditas_id) + ->where('jenis_komoditas_id', $request->jenis_komoditas_id), + ], + 'deskripsi' => [ + 'nullable', + 'string', + ], + ]); + + try { + DB::beginTransaction(); + + $varietas = Varietas::findOrFail($id); + $varietas->update([ + 'komoditas_id' => $validated['komoditas_id'], + 'jenis_komoditas_id' => $validated['jenis_komoditas_id'], + 'nama' => $validated['nama'], + 'deskripsi' => $validated['deskripsi'] ?? null, + 'updated_by' => auth()->id(), + ]); + + DB::commit(); + + return response()->json([ + 'status' => 'success', + 'message' => 'Data varietas berhasil diperbarui.', + 'data' => $varietas->fresh(['komoditas', 'jenisKomoditas']), + ]); + } catch (\Throwable $e) { + DB::rollBack(); + + Log::error('Gagal update varietas', [ + 'error' => $e->getMessage(), + 'id' => $id, + 'request' => $request->all(), + ]); + + return response()->json([ + 'status' => 'error', + 'message' => 'Gagal mengupdate data: ' . $e->getMessage(), + ], 500); + } + } + + public function destroy(string $id) + { + try { + DB::beginTransaction(); + + $varietas = Varietas::findOrFail($id); + $varietas->update(['deleted_by' => auth()->id()]); + $varietas->delete(); + + DB::commit(); + + return response()->json([ + 'status' => 'success', + 'message' => 'Data varietas berhasil dihapus.', + ]); + } catch (\Throwable $e) { + DB::rollBack(); + + Log::error('Gagal hapus varietas', [ + 'error' => $e->getMessage(), + 'id' => $id, + ]); + + return response()->json([ + 'status' => 'error', + 'message' => 'Gagal menghapus data: ' . $e->getMessage(), + ], 500); + } + } +} diff --git a/app/Http/Controllers/Web/Program/RealisasiController.php b/app/Http/Controllers/Web/Program/RealisasiController.php index 25eed7d..0e21a19 100644 --- a/app/Http/Controllers/Web/Program/RealisasiController.php +++ b/app/Http/Controllers/Web/Program/RealisasiController.php @@ -7,6 +7,7 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Gate; use Illuminate\View\View; use Illuminate\Http\JsonResponse; +use Illuminate\Support\Facades\DB; use App\Models\Program\Framework; use App\Models\Program\Realisasi; @@ -26,7 +27,89 @@ class RealisasiController extends Controller abort(404); } - return view('program.realisasi.index', compact('framework')); + $ringkasanIsiRealisasi = DB::select('select count(pt.id) count_target, sum(case when rl.id > 0 then 1 else 0 end) count_realisasi + from program_target pt + inner join program_aktivitas pa on pt.aktivitas_id = pa.id + inner join program_transformasi ptr on pa.transformasi_id = ptr.id + inner join program_framework pf on ptr.framework_id = pf.id + left join + (select target_id, max(id) id from program_realisasi pr + group by target_id) rl on pt.id = rl.target_id + where + pt.deleted_at is null + and pa.deleted_at is null + and ptr.deleted_at is null + and pf.id = ? + ', [$framework->id]); + $ringkasanIsiRealisasi = collect($ringkasanIsiRealisasi)->map(function ($item) { + $item->persentase = $item->count_target > 0 ? round(($item->count_realisasi / $item->count_target) * 100, 2) : 0; + return $item; + })->first(); + + $ringkasanCapaianRealisasi = DB::select("select round(avg(percent_realisasi)::numeric * 100, 2) persentase, + sum(case when percent_realisasi >= 0.8 then 1 else 0 end) capaian_80, + sum(case when percent_realisasi >= 0.5 and percent_realisasi < 0.8 then 1 else 0 end) capaian_50_80, + sum(case when percent_realisasi < 0.5 then 1 else 0 end) capaian_50 + from + (select pt.id target_id, pr.id realisasi_id, + pt.tipe, + case + when pt.tipe = 'integer' then pt.target_integer + when pt.tipe = 'float' then pt.target_float + when pt.tipe = 'boolean' then pt.target_boolean::integer + end target, + case + when pt.tipe = 'integer' then pr.realisasi_integer + when pt.tipe = 'float' then pr.realisasi_float + when pt.tipe = 'boolean' then pr.realisasi_boolean::integer + end realisasi, + case + when pt.tipe = 'integer' then pr.realisasi_integer::float / pt.target_integer::float + when pt.tipe = 'float' then pr.realisasi_float / pt.target_float + when pt.tipe = 'boolean' then pr.realisasi_boolean::integer / pt.target_boolean::integer + end percent_realisasi + from program_target pt + inner join program_aktivitas pa on pt.aktivitas_id = pa.id + inner join program_transformasi ptr on pa.transformasi_id = ptr.id + inner join program_framework pf on ptr.framework_id = pf.id + left join + (select target_id, max(id) id from program_realisasi pr + group by target_id) rl on pt.id = rl.target_id + left join program_realisasi pr on rl.id = pr.id and pr.target_id = pt.id + where + pt.deleted_at is null + and pa.deleted_at is null + and ptr.deleted_at is null + and pf.id = ?) v", + [$framework->id]); + $ringkasanCapaianRealisasi = collect($ringkasanCapaianRealisasi)->first(); + + $ringkasanVerifikasi = DB::select("select count(pt.id) count_target, + sum(case when count_verifikasi > 0 then 1 else 0 end) count_verifikasi, + sum(case when count_verifikasi = 0 or count_verifikasi is null then 1 else 0 end) count_unverifikasi + from program_target pt + inner join program_aktivitas pa on pt.aktivitas_id = pa.id + inner join program_transformasi ptr on pa.transformasi_id = ptr.id + inner join program_framework pf on ptr.framework_id = pf.id + left join + (select target_id, max(id) id from program_realisasi pr + group by target_id) rl on pt.id = rl.target_id + left join + (select realisasi_id, count(pv.id) count_verifikasi from program_verifikasi pv + group by realisasi_id) rv + on rv.realisasi_id = rl.id + where + pt.deleted_at is null + and pa.deleted_at is null + and ptr.deleted_at is null + and pf.id = ?", + [$framework->id]); + $ringkasanVerifikasi = collect($ringkasanVerifikasi)->map(function ($item) { + $item->persentase = $item->count_target > 0 ? round(($item->count_verifikasi / $item->count_target) * 100, 2) : 0; + return $item; + })->first(); + + return view('program.realisasi.index', compact('framework', 'ringkasanIsiRealisasi', 'ringkasanCapaianRealisasi', 'ringkasanVerifikasi')); } public function create() @@ -64,7 +147,7 @@ class RealisasiController extends Controller abort(403); } - $realisasi = Realisasi::with('target', 'target.aktivitas', 'target.aktivitas.transformasi') + $realisasi = Realisasi::with('target', 'target.aktivitas', 'target.aktivitas.transformasi', 'verifikasi') ->find($id); if (!$realisasi) { return response()->json([ diff --git a/app/Http/Controllers/Web/Program/VerifikasiController.php b/app/Http/Controllers/Web/Program/VerifikasiController.php index 0e52d7e..932da21 100644 --- a/app/Http/Controllers/Web/Program/VerifikasiController.php +++ b/app/Http/Controllers/Web/Program/VerifikasiController.php @@ -17,9 +17,9 @@ class VerifikasiController extends Controller /** * Display a listing of the resource. */ - public function index() + public function index(Request $request): JsonResponse { - // + } /** @@ -83,8 +83,25 @@ class VerifikasiController extends Controller /** * Remove the specified resource from storage. */ - public function destroy(string $id) + public function destroy(string $id): JsonResponse { - // + if (!Gate::any(['super_admin', 'admin'])) { + abort(403); + } + + $verifikasi = Verifikasi::find($id); + if (!$verifikasi) { + return response()->json([ + 'status' => 'error', + 'message' => 'Data verifikasi tidak ditemukan.' + ], 404); + } + + $verifikasi->update(['updated_by' => auth()->id()]); + $verifikasi->delete(); + return response()->json([ + 'status' => 'success', + 'message' => 'Dokumen bukti berhasil dihapus.' + ]); } } diff --git a/app/Http/Controllers/Web/ProgramController.php b/app/Http/Controllers/Web/ProgramController.php index e429e4e..5a08d80 100644 --- a/app/Http/Controllers/Web/ProgramController.php +++ b/app/Http/Controllers/Web/ProgramController.php @@ -49,6 +49,7 @@ class ProgramController extends Controller 'sub_domain' => ['required', Rule::unique(Program::class, 'sub_domain')], 'tahun' => ['required', 'integer'], 'instansi' => ['nullable', 'string'], + 'nama_singkat' => ['required', 'string'], ]); if ($validator->fails()) { @@ -94,6 +95,9 @@ class ProgramController extends Controller $validator = Validator::make($request->all(), [ 'nama' => ['required'], 'sub_domain' => ['required', Rule::unique(Program::class, 'sub_domain')->ignore($id)], + 'tahun' => ['required', 'integer'], + 'instansi' => ['nullable', 'string'], + 'nama_singkat' => ['required', 'string'], ]); if ($validator->fails()) { @@ -106,9 +110,7 @@ class ProgramController extends Controller return redirect()->route('program.index')->with('error', 'Data program tidak ditemukan!'); } - $program->update([ - 'nama' => $request->nama, - 'sub_domain' => $request->sub_domain, + $program->update([...$validator->validated(), 'updated_by' => auth()->id(), ]); diff --git a/app/Http/Resources/Core/ProgramResource.php b/app/Http/Resources/Core/ProgramResource.php index 3b6503f..2d4f05a 100644 --- a/app/Http/Resources/Core/ProgramResource.php +++ b/app/Http/Resources/Core/ProgramResource.php @@ -22,6 +22,7 @@ class ProgramResource extends JsonResource 'sub_domain' => $this->sub_domain, 'tahun' => $this->tahun, 'instansi' => $this->instansi, + 'nama_singkat' => $this->nama_singkat, 'komoditas' => $this->komoditas()->with('komoditas')->get()->map(function ($item) { return new ProgramKomoditasResource($item); }), diff --git a/app/Http/Resources/Ekosistem/FormBasisDataResource.php b/app/Http/Resources/Ekosistem/FormBasisDataResource.php new file mode 100644 index 0000000..9b64112 --- /dev/null +++ b/app/Http/Resources/Ekosistem/FormBasisDataResource.php @@ -0,0 +1,32 @@ + + */ + public function toArray(Request $request): array + { + return [ + 'id' => $this->id, + 'tabel_id' => $this->tabel_id, + 'parent_id' => $this->parent_id, + 'tipe' => $this->tipe, + 'column_width' => $this->column_width, + 'kolom_id' => $this->kolom_id, + 'section_label' => $this->section_label, + 'urutan' => $this->urutan, + 'kolom' => new KolomBasisDataResource($this->whenLoaded('kolom')), + 'form' => FormBasisDataResource::collection($this->whenLoaded('form')), + ]; + } +} diff --git a/app/Http/Resources/Ekosistem/TabelBasisDataResource.php b/app/Http/Resources/Ekosistem/TabelBasisDataResource.php index 2b2feb6..5b4de9e 100644 --- a/app/Http/Resources/Ekosistem/TabelBasisDataResource.php +++ b/app/Http/Resources/Ekosistem/TabelBasisDataResource.php @@ -29,6 +29,7 @@ class TabelBasisDataResource extends JsonResource // 'group' => new GroupBasisDataResource($this->whenLoaded('group')), 'kolom' => KolomBasisDataResource::collection($this->whenLoaded('kolom')), //'ringkasan' => RingkasanBasisDataResource::collection($this->whenLoaded('ringkasan')), + 'form' => FormBasisDataResource::collection($this->whenLoaded('form')), ]; } } diff --git a/app/Models/Core/Program.php b/app/Models/Core/Program.php index e4f7240..30f7c1a 100644 --- a/app/Models/Core/Program.php +++ b/app/Models/Core/Program.php @@ -20,6 +20,7 @@ class Program extends Model "sub_domain", "tahun", "instansi", + "nama_singkat", ]; public function komoditas(): HasMany diff --git a/app/Models/Master/JenisKomoditas.php b/app/Models/Master/JenisKomoditas.php new file mode 100644 index 0000000..cce5c46 --- /dev/null +++ b/app/Models/Master/JenisKomoditas.php @@ -0,0 +1,28 @@ +belongsTo(Komoditas::class, 'komoditas_id'); + } +} diff --git a/app/Models/Master/Varietas.php b/app/Models/Master/Varietas.php new file mode 100644 index 0000000..b8d867f --- /dev/null +++ b/app/Models/Master/Varietas.php @@ -0,0 +1,33 @@ +belongsTo(JenisKomoditas::class, 'jenis_komoditas_id'); + } + + public function komoditas() + { + return $this->belongsTo(Komoditas::class, 'komoditas_id'); + } +} diff --git a/app/Models/Wilayah/DesaKelurahan.php b/app/Models/Wilayah/DesaKelurahan.php index ac8beef..123a402 100644 --- a/app/Models/Wilayah/DesaKelurahan.php +++ b/app/Models/Wilayah/DesaKelurahan.php @@ -1,6 +1,6 @@ string('sub_domain'); $table->integer('tahun'); $table->string('instansi')->nullable(); + $table->string('nama_singkat', length: 50); $table->foreignId('created_by')->nullable()->constrained('users')->onDelete('set null'); $table->foreignId('updated_by')->nullable()->constrained('users')->onDelete('set null'); diff --git a/resources/views/core/program/add.blade.php b/resources/views/core/program/add.blade.php index 01b5099..03248ee 100644 --- a/resources/views/core/program/add.blade.php +++ b/resources/views/core/program/add.blade.php @@ -18,6 +18,12 @@ +
| No | +Nama Jenis Komoditas | +Komoditas | +Actions | +|
|---|---|---|---|---|
| {{ $jenisKomoditas->firstItem() + $index }} | + +
+
+
+
+
+
+
+
+ {{ $initials ?: 'JK' }}
+
+
+
+ {{ $jenis->nama }}
+ ID: {{ $jenis->id }}
+
+ |
+
+ + + {{ $komoditasNama }} + + | + +
+
+
+
+
+
+
+
+ |
+ |
|
+
+
+ Tidak ada data ditemukan.
+
+ |
+ ||||
| No | +Nama Varietas | +Komoditas | +Jenis Komoditas | +Actions | +|
|---|---|---|---|---|---|
| {{ $varietas->firstItem() + $index }} | + +
+
+
+
+
+
+
+
+ {{ $initials ?: 'VR' }}
+
+
+
+ {{ $item->nama }}
+ {{ $item->deskripsi }}
+
+ |
+
+ + + {{ $item->komoditas->nama ?? '-' }} + + | + ++ + {{ $item->jenisKomoditas->nama ?? '-' }} + + | + +
+
+
+
+
+
+
+
+ |
+ |
| + Tidak ada data ditemukan. + | +|||||