diff --git a/app/Http/Controllers/Web/Master/JenisKomoditasController.php b/app/Http/Controllers/Web/Master/JenisKomoditasController.php index d4728b2..ea6ce41 100644 --- a/app/Http/Controllers/Web/Master/JenisKomoditasController.php +++ b/app/Http/Controllers/Web/Master/JenisKomoditasController.php @@ -40,6 +40,18 @@ class JenisKomoditasController extends Controller )); } + 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. */ 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/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/resources/views/master/varietas/add.blade.php b/resources/views/master/varietas/add.blade.php new file mode 100644 index 0000000..25717c2 --- /dev/null +++ b/resources/views/master/varietas/add.blade.php @@ -0,0 +1,61 @@ +
+
+
Tambah Varietas
+ +
+ +
+
+ @csrf + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+
\ No newline at end of file diff --git a/resources/views/master/varietas/edit.blade.php b/resources/views/master/varietas/edit.blade.php new file mode 100644 index 0000000..42a5300 --- /dev/null +++ b/resources/views/master/varietas/edit.blade.php @@ -0,0 +1,64 @@ +
+
+
Edit Varietas
+ +
+ +
+
+ @csrf + @method('PUT') + + + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+
\ No newline at end of file diff --git a/resources/views/master/varietas/index.blade.php b/resources/views/master/varietas/index.blade.php new file mode 100644 index 0000000..ffd26ca --- /dev/null +++ b/resources/views/master/varietas/index.blade.php @@ -0,0 +1,547 @@ +@extends('layout.main') + +@section('content') +
+
+
+
+
+
+ + + +
+
+ +
+
+ + + @if(request('search')) + + + + @endif + + +
+ + +
+
+
+ +
+ + + + + + + + + + + + + @forelse($varietas as $index => $item) + @php + $namaVarietas = $item->nama ?? '-'; + $words = preg_split('/\s+/', trim($namaVarietas)); + $initials = collect($words) + ->filter() + ->map(fn($word) => strtoupper(substr($word, 0, 1))) + ->take(2) + ->implode(''); + + $states = ['success', 'danger', 'warning', 'info', 'primary', 'secondary']; + $state = $states[$item->id % count($states)]; + @endphp + + + + + + + + + + + + + @empty + + + + @endforelse + +
NoNama VarietasKomoditasJenis KomoditasActions
{{ $varietas->firstItem() + $index }} +
+
+
+ + {{ $initials ?: 'VR' }} + +
+
+ +
+ {{ $item->nama }} + {{ $item->deskripsi }} +
+
+
+ + {{ $item->komoditas->nama ?? '-' }} + + + + {{ $item->jenisKomoditas->nama ?? '-' }} + + +
+ + + + + +
+
+ Tidak ada data ditemukan. +
+
+ + @if($varietas->hasPages()) + + @endif +
+
+ +@include('master.varietas.add') +@include('master.varietas.edit') +@include('master.varietas.view') +@endsection + +@push('scripts') + +@endpush \ No newline at end of file diff --git a/resources/views/master/varietas/view.blade.php b/resources/views/master/varietas/view.blade.php new file mode 100644 index 0000000..fabb816 --- /dev/null +++ b/resources/views/master/varietas/view.blade.php @@ -0,0 +1,34 @@ +
+
+
Detail Varietas
+ +
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+
\ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 64fb4e6..ea137e3 100644 --- a/routes/web.php +++ b/routes/web.php @@ -86,6 +86,8 @@ Route::middleware('auth') Route::delete('/komoditas/{id}', [App\Http\Controllers\Web\Master\KomoditasController::class, 'destroy'])->name('komoditas.destroy'); Route::resource('jenis-komoditas', App\Http\Controllers\Web\Master\JenisKomoditasController::class); + Route::get('/jenis-komoditas-by-komoditas/{komoditas_id}', [App\Http\Controllers\Web\Master\JenisKomoditasController::class, 'getByKomoditas'])->name('jenis-komoditas.by-komoditas'); + Route::resource('varietas', App\Http\Controllers\Web\Master\VarietasController::class); Route::get('/keluarga', [App\Http\Controllers\Web\Master\KeluargaController::class, 'index'])->name('keluarga.index'); Route::get('/keluarga/add', [App\Http\Controllers\Web\Master\KeluargaController::class, 'create'])->name('keluarga.create');