diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php index fede48b..cedd032 100644 --- a/app/Http/Controllers/AuthController.php +++ b/app/Http/Controllers/AuthController.php @@ -38,13 +38,6 @@ public function loginProcess(Request $request) $petani = Petani::where('username', $request->username)->first(); if ($petani && Hash::check($request->password, $petani->password)) { - // Validasi Status Akun Petani - if ($petani->status_akun == 'menunggu') { - return back()->withErrors(['login_error' => 'Akun Anda masih dalam proses verifikasi Admin.']); - } - if ($petani->status_akun == 'ditolak') { - return back()->withErrors(['login_error' => 'Pendaftaran Anda ditolak. Silakan hubungi Admin.']); - } Auth::guard('petani')->login($petani); $request->session()->regenerate(); @@ -100,10 +93,10 @@ public function registerProcess(Request $request) 'no_hp' => $request->no_hp, 'alamat' => $request->alamat, 'nama_usaha' => $request->nama_usaha ?? 'Toko Tani ' . $request->nama_lengkap, - 'status_akun' => 'menunggu' + 'status_akun' => 'aktif' ]); - return redirect('/login')->with('success', 'Registrasi Petani Berhasil! Mohon tunggu verifikasi Admin.'); + return redirect('/login')->with('success', 'Registrasi Petani Berhasil! Silakan langsung Login.'); } else { Pembeli::create([ @@ -121,13 +114,9 @@ public function registerProcess(Request $request) public function logout(Request $request) { - // Logout semua guard untuk keamanan - if (Auth::guard('admin')->check()) - Auth::guard('admin')->logout(); - if (Auth::guard('petani')->check()) - Auth::guard('petani')->logout(); - if (Auth::guard('pembeli')->check()) - Auth::guard('pembeli')->logout(); + if (Auth::guard('admin')->check()) Auth::guard('admin')->logout(); + if (Auth::guard('petani')->check()) Auth::guard('petani')->logout(); + if (Auth::guard('pembeli')->check()) Auth::guard('pembeli')->logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); diff --git a/app/Http/Controllers/Petani/ProdukController.php b/app/Http/Controllers/Petani/ProdukController.php index b3dc943..b5ed3ed 100644 --- a/app/Http/Controllers/Petani/ProdukController.php +++ b/app/Http/Controllers/Petani/ProdukController.php @@ -42,10 +42,6 @@ public function store(Request $request) 'harga' => 'required|numeric|min:0', 'stok' => 'required|integer|min:0', 'deskripsi' => 'required|string', - 'provinsi_code' => 'required', - 'kota_code' => 'required', - 'kecamatan_code' => 'required', - 'desa_code' => 'required', 'foto_produk' => 'required|image|mimes:jpeg,png,jpg|max:2048', 'foto_tambahan.*' => 'nullable|image|mimes:jpeg,png,jpg|max:2048' ]); @@ -62,10 +58,6 @@ public function store(Request $request) 'kategori_id' => $request->kategori_id, 'nama_produk' => $request->nama_produk, 'harga' => $request->harga, - 'provinsi_code' => $request->provinsi_code, - 'kota_code' => $request->kota_code, - 'kecamatan_code' => $request->kecamatan_code, - 'desa_code' => $request->desa_code, 'stok' => $request->stok, 'deskripsi' => $request->deskripsi, 'foto_produk' => $fotoPath, @@ -110,10 +102,6 @@ public function update(Request $request, $id) 'nama_produk' => 'required|string|max:255', 'kategori_id' => 'required|exists:kategoris,id', 'harga' => 'required|numeric|min:0', - 'provinsi_code' => 'required', - 'kota_code' => 'required', - 'kecamatan_code' => 'required', - 'desa_code' => 'required', 'stok' => 'required|integer|min:0', 'deskripsi' => 'required|string', 'foto_produk' => 'nullable|image|mimes:jpeg,png,jpg|max:2048', @@ -136,10 +124,6 @@ public function update(Request $request, $id) 'nama_produk' => $request->nama_produk, 'kategori_id' => $request->kategori_id, 'harga' => $request->harga, - 'provinsi_code' => $request->provinsi_code, - 'kota_code' => $request->kota_code, - 'kecamatan_code' => $request->kecamatan_code, - 'desa_code' => $request->desa_code, 'stok' => $request->stok, 'deskripsi' => $request->deskripsi, 'foto_produk' => $produk->foto_produk diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php index f3cf215..da655e1 100644 --- a/app/Http/Controllers/ProfileController.php +++ b/app/Http/Controllers/ProfileController.php @@ -6,6 +6,10 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Storage; +use Laravolt\Indonesia\Models\Province; +use Laravolt\Indonesia\Models\City; +use Laravolt\Indonesia\Models\District; +use Laravolt\Indonesia\Models\Village; class ProfileController extends Controller { @@ -13,7 +17,13 @@ class ProfileController extends Controller public function editPetani() { $user = Auth::guard('petani')->user(); - return view('petani.profile', compact('user')); + + $provinsis = Province::all(); + $kotas = $user->provinsi_code ? City::where('province_code', $user->provinsi_code)->get() : []; + $kecamatans = $user->kota_code ? District::where('city_code', $user->kota_code)->get() : []; + $desas = $user->kecamatan_code ? Village::where('district_code', $user->kecamatan_code)->get() : []; + + return view('petani.profile', compact('user', 'provinsis', 'kotas', 'kecamatans', 'desas')); } public function updatePetani(Request $request) @@ -23,12 +33,24 @@ public function updatePetani(Request $request) $request->validate([ 'nama_lengkap' => 'required|string|max:255', 'email' => 'required|email|unique:petanis,email,' . $user->id, - 'password' => 'nullable|min:6|confirmed', - 'foto' => 'nullable|image|max:2048' + 'password' => 'nullable|min:6|confirmed', + 'foto' => 'nullable|image|max:2048', + 'provinsi_code' => 'required', + 'alamat' => 'required|string', + 'kota_code' => 'required', + 'kecamatan_code' => 'required', + 'desa_code' => 'required', + 'link_maps' => 'nullable|url', ]); $user->nama_lengkap = $request->nama_lengkap; $user->email = $request->email; + $user->provinsi_code = $request->provinsi_code; + $user->alamat = $request->alamat; + $user->kota_code = $request->kota_code; + $user->kecamatan_code = $request->kecamatan_code; + $user->desa_code = $request->desa_code; + $user->link_maps = $request->link_maps; if ($request->filled('password')) { $user->password = Hash::make($request->password); @@ -38,12 +60,11 @@ public function updatePetani(Request $request) if ($user->foto && Storage::exists('public/' . $user->foto)) { Storage::delete('public/' . $user->foto); } - $path = $request->file('foto')->store('avatars', 'public'); - $user->foto = $path; + $user->foto = $request->file('foto')->store('avatars', 'public'); } $user->save(); - return back()->with('success', 'Profil berhasil diperbarui!'); + return back()->with('success', 'Profil dan Lokasi berhasil diperbarui!'); } // --- FITUR PEMBELI --- diff --git a/app/Models/Petani.php b/app/Models/Petani.php index f4503df..c9e25d6 100644 --- a/app/Models/Petani.php +++ b/app/Models/Petani.php @@ -21,6 +21,11 @@ class Petani extends Authenticatable implements CanResetPassword 'password', 'no_hp', 'alamat', + 'provinsi_code', + 'kota_code', + 'link_maps', + 'kecamatan_code', + 'desa_code', 'nama_usaha', 'status_akun' ]; @@ -43,4 +48,14 @@ public function pesanTerkirim() { return $this->morphMany(Pesan::class, 'pengirim'); } + + public function kota() + { + return $this->belongsTo(\Laravolt\Indonesia\Models\City::class, 'kota_code', 'code'); + } + + public function provinsi() + { + return $this->belongsTo(\Laravolt\Indonesia\Models\Province::class, 'provinsi_code', 'code'); + } } \ No newline at end of file diff --git a/app/Models/Produk.php b/app/Models/Produk.php index 70b9638..1d2ae12 100644 --- a/app/Models/Produk.php +++ b/app/Models/Produk.php @@ -18,10 +18,6 @@ class Produk extends Model 'stok', 'deskripsi', 'foto_produk', - 'provinsi_code', - 'kota_code', - 'kecamatan_code', - 'desa_code', ]; public function petani() diff --git a/database/migrations/2026_03_01_125919_add_lokasi_to_produks_table.php b/database/migrations/2026_03_01_125919_add_lokasi_to_produks_table.php index 1ad90c0..0b5cdf7 100644 --- a/database/migrations/2026_03_01_125919_add_lokasi_to_produks_table.php +++ b/database/migrations/2026_03_01_125919_add_lokasi_to_produks_table.php @@ -7,23 +7,19 @@ return new class extends Migration { public function up(): void { - Schema::table('produks', function (Blueprint $table) { - if (Schema::hasColumn('produks', 'lokasi')) { - $table->dropColumn('lokasi'); - } - - $table->char('provinsi_code', 2)->nullable()->after('deskripsi'); + Schema::table('petanis', function (Blueprint $table) { + $table->char('provinsi_code', 2)->nullable()->after('alamat'); $table->char('kota_code', 4)->nullable()->after('provinsi_code'); $table->char('kecamatan_code', 7)->nullable()->after('kota_code'); $table->char('desa_code', 10)->nullable()->after('kecamatan_code'); + $table->text('link_maps')->nullable()->after('desa_code'); }); } public function down(): void { - Schema::table('produks', function (Blueprint $table) { - $table->dropColumn(['provinsi_code', 'kota_code', 'kecamatan_code', 'desa_code']); - $table->string('lokasi')->nullable(); + Schema::table('petanis', function (Blueprint $table) { + $table->dropColumn(['provinsi_code', 'kota_code', 'kecamatan_code', 'desa_code', 'link_maps']); }); } }; \ No newline at end of file diff --git a/database/seeders/PetaniSeeder.php b/database/seeders/PetaniSeeder.php index 03edea4..2aaf40f 100644 --- a/database/seeders/PetaniSeeder.php +++ b/database/seeders/PetaniSeeder.php @@ -8,54 +8,63 @@ class PetaniSeeder extends Seeder { - /** - * Run the database seeds. - */ public function run(): void { - // Petani SUDAH AKTIF DB::table('petanis')->insert([ - 'nik' => '3518012345678901', - 'nama_lengkap' => 'Siti Aminah', - 'username' => 'siti_sayur', - 'email' => 'siti@gmail.com', - 'password' => Hash::make('password123'), - 'no_hp' => '085678901234', - 'alamat' => 'Dusun Krajan RT 02 RW 01', - 'nama_usaha' => 'Sayur Segar Bu Siti', - 'status_akun' => 'aktif', - 'created_at' => now(), - 'updated_at' => now(), - ]); - - // Petani BARU DAFTAR menunggu verifikasi - DB::table('petanis')->insert([ - 'nik' => '3518012345678902', - 'nama_lengkap' => 'Budi Santoso', - 'username' => 'budi_tani', - 'email' => 'budisantoso@gmail.com', - 'password' => Hash::make('password123'), - 'no_hp' => '081234567890', - 'alamat' => 'Jl. Raya Desa Sukamaju No. 12', - 'nama_usaha' => 'Budi Farm Organik', - 'status_akun' => 'menunggu', - 'created_at' => now(), - 'updated_at' => now(), - ]); - - // Petani DITOLAK - DB::table('petanis')->insert([ - 'nik' => '3518012345678903', - 'nama_lengkap' => 'Joko Widodo', - 'username' => 'joko_tani', - 'email' => 'wiwokdetok@gmail.com', - 'password' => Hash::make('password123'), - 'no_hp' => '089876543210', - 'alamat' => 'Jl. Buntu No. 99', - 'nama_usaha' => 'Joko Tani Jaya', - 'status_akun' => 'ditolak', - 'created_at' => now(), - 'updated_at' => now(), + [ + 'nik' => '3518012345678901', + 'nama_lengkap' => 'Siti Aminah', + 'username' => 'siti_sayur', + 'email' => 'siti@gmail.com', + 'password' => Hash::make('password123'), + 'no_hp' => '085678901234', + 'alamat' => 'Dusun Krajan RT 02 RW 01', + 'provinsi_code' => '35', + 'kota_code' => '3518', + 'kecamatan_code' => '3518100', + 'desa_code' => '3518100001', + 'link_maps' => 'https://maps.app.goo.gl/XXdummy123', + 'nama_usaha' => 'Sayur Segar Bu Siti', + 'status_akun' => 'aktif', + 'created_at' => now(), + 'updated_at' => now(), + ], + [ + 'nik' => '3518012345678902', + 'nama_lengkap' => 'Budi Santoso', + 'username' => 'budi_tani', + 'email' => 'budisantoso@gmail.com', + 'password' => Hash::make('password123'), + 'no_hp' => '081234567890', + 'alamat' => 'Jl. Raya Desa Sukamaju No. 12', + 'provinsi_code' => '35', + 'kota_code' => '3518', + 'kecamatan_code' => '3518100', + 'desa_code' => '3518100001', + 'link_maps' => 'https://maps.app.goo.gl/XXdummy123', + 'nama_usaha' => 'Budi Farm Organik', + 'status_akun' => 'aktif', + 'created_at' => now(), + 'updated_at' => now(), + ], + [ + 'nik' => '3518012345678903', + 'nama_lengkap' => 'Joko Widodo', + 'username' => 'joko_tani', + 'email' => 'joko@gmail.com', + 'password' => Hash::make('password123'), + 'no_hp' => '089876543210', + 'alamat' => 'Jl. Buntu No. 99', + 'provinsi_code' => '35', + 'kota_code' => '3518', + 'kecamatan_code' => '3518100', + 'desa_code' => '3518100001', + 'link_maps' => 'https://maps.app.goo.gl/XXdummy123', + 'nama_usaha' => 'Joko Tani Jaya', + 'status_akun' => 'aktif', + 'created_at' => now(), + 'updated_at' => now(), + ] ]); } } \ No newline at end of file diff --git a/database/seeders/ProdukSeeder.php b/database/seeders/ProdukSeeder.php index 7571ea4..592d77d 100644 --- a/database/seeders/ProdukSeeder.php +++ b/database/seeders/ProdukSeeder.php @@ -7,23 +7,18 @@ use App\Models\ProdukImage; use App\Models\Kategori; use App\Models\Petani; -use Illuminate\Support\Str; class ProdukSeeder extends Seeder { - /** - * Run the database seeds. - */ public function run(): void { - $petani = Petani::inRandomOrder()->first(); + $petani = Petani::first(); if (!$petani) { $this->command->error('Tabel petani kosong. Jalankan PetaniSeeder terlebih dahulu!'); return; } - // KATEGORI $kategoriGabah = [ ['nama' => 'Gabah Kering Panen (GKP)', 'slug' => 'gkp', 'ikon' => 'fas fa-seedling'], ['nama' => 'Gabah Kering Giling (GKG)', 'slug' => 'gkg', 'ikon' => 'fas fa-sun'], @@ -42,7 +37,6 @@ public function run(): void ); } - // DAFTAR PRODUK $daftarProduk = [ [ 'nama' => 'Gabah Ciherang (GKP) Baru Panen', @@ -68,45 +62,19 @@ public function run(): void 'kategori_slug' => 'benih-padi', 'gallery' => 1 ], - [ - 'nama' => 'Gabah Padi Ketan Putih Super', - 'harga' => 8000, - 'stok' => 300, - 'deskripsi' => 'Padi ketan putih murni, tidak tercampur padi biasa. Cocok untuk industri tape atau olahan ketan. Kualitas super.', - 'kategori_slug' => 'padi-ketan', - 'gallery' => 2 - ], - [ - 'nama' => 'Gabah Mentik Wangi Organik', - 'harga' => 9000, - 'stok' => 100, - 'deskripsi' => 'Gabah Mentik Wangi (Pandan Wangi Jawa) ditanam full organik tanpa pestisida kimia. Aroma sangat wangi, beras pulen.', - 'kategori_slug' => 'padi-organik', - 'gallery' => 2 - ], - [ - 'nama' => 'Gabah Kering Giling (GKG) Situbagendit', - 'harga' => 7200, - 'stok' => 1500, - 'deskripsi' => 'Gabah Situbagendit kering jemur 3 hari. Cocok untuk stok gudang penggilingan. Lokasi Nganjuk.', - 'kategori_slug' => 'gkg', - 'gallery' => 1 - ], ]; - // INSERT DATA foreach ($daftarProduk as $item) { $kategori = Kategori::where('slug', $item['kategori_slug'])->first(); - // Create Produk $produk = Produk::create([ - 'petani_id' => $petani->id, - 'kategori_id' => $kategori->id, - 'nama_produk' => $item['nama'], - 'harga' => $item['harga'], - 'stok' => $item['stok'], - 'deskripsi' => $item['deskripsi'], - 'foto_produk' => null, + 'petani_id' => $petani->id, + 'kategori_id' => $kategori->id, + 'nama_produk' => $item['nama'], + 'harga' => $item['harga'], + 'stok' => $item['stok'], + 'deskripsi' => $item['deskripsi'], + 'foto_produk' => null, ]); for ($i = 0; $i < $item['gallery']; $i++) { diff --git a/resources/views/landing/detail.blade.php b/resources/views/landing/detail.blade.php index 9617426..940762a 100644 --- a/resources/views/landing/detail.blade.php +++ b/resources/views/landing/detail.blade.php @@ -4,230 +4,243 @@ @section('content') - {{-- BREADCRUMB --}} -
-
- -
+{{-- BREADCRUMB --}} +
+
+
+
-
-
+
+
- {{-- GALERI PRODUK --}} -
-
- - {{-- GAMBAR UTAMA (BESAR) --}} -
-
- {{ $produk->nama_produk }} -
-
- - {{-- THUMBNAIL (GAMBAR KECIL) --}} -
- - @if($produk->foto_produk) -
- -
- @endif - - @if($produk->images && $produk->images->count() > 0) - @foreach($produk->images as $img) -
- -
- @endforeach - @endif + {{-- GALERI PRODUK --}} +
+
+ {{-- GAMBAR UTAMA (BESAR) --}} +
+
+ {{ $produk->nama_produk }}
-
+ {{-- THUMBNAIL (GAMBAR KECIL) --}} +
- {{-- INFO & AKSI --}} -
-
- - {{-- Kategori Badge --}} -
- - {{ $produk->kategori->nama_kategori ?? 'Sayur & Buah' }} - + @if($produk->foto_produk) +
+
+ @endif - {{-- Nama Produk --}} -

{{ $produk->nama_produk }}

- - {{-- Harga --}} -
-

- Rp {{ number_format($produk->harga, 0, ',', '.') }} -

- / kg + @if($produk->images && $produk->images->count() > 0) + @foreach($produk->images as $img) +
+
- - {{-- Deskripsi --}} -
-
Deskripsi Produk
-

- {{ $produk->deskripsi }} -

-
- - {{-- Info Penjual --}} -
-
- -
-
-

Dijual Oleh -

-
{{ $produk->petani->nama_lengkap ?? 'Petani Mitra' }}
-
- -
- - {{-- FORM PEMBELIAN --}} -
- @csrf - - -
- {{-- Input Jumlah --}} -
- -
-
- - - - -
-
- Stok: {{ $produk->stok }} Kg -
-
-
- - {{-- Tombol Aksi --}} -
- - - Beli Sekarang - -
-
- - {{-- Footer Info --}} -
-
- Pengiriman Cepat -
-
- Produk Segar -
-
-
+ @endforeach + @endif
- {{-- BAGIAN PRODUK TERKAIT --}} - @if (isset($produk_terkait) && $produk_terkait->count() > 0) -
-
-

Produk Sejenis

- - Lihat Lainnya - + {{-- INFO & AKSI --}} +
+
+ + {{-- Kategori Badge --}} +
+ + {{ $produk->kategori->nama_kategori ?? 'Sayur & Buah' }} +
-
- @include('landing.partials.product_list', ['produks' => $produk_terkait]) -
-
- @endif -
+ {{-- Nama Produk --}} +

{{ $produk->nama_produk }}

- {{-- MODAL CHAT --}} - {{-- UPLOAD GAMBAR --}} diff --git a/resources/views/petani/produk/edit.blade.php b/resources/views/petani/produk/edit.blade.php index ee9b873..23ba3e2 100644 --- a/resources/views/petani/produk/edit.blade.php +++ b/resources/views/petani/produk/edit.blade.php @@ -51,49 +51,6 @@
- -
-
- - -
-
- - -
-
- - -
-
- - -
-
{{-- KELOLA GAMBAR --}} diff --git a/resources/views/petani/profile.blade.php b/resources/views/petani/profile.blade.php index 2888aba..476e504 100644 --- a/resources/views/petani/profile.blade.php +++ b/resources/views/petani/profile.blade.php @@ -4,60 +4,154 @@ @section('page-title', 'Pengaturan Akun') @section('content') -
-
- @if (session('success')) -
{{ session('success') }}
- @endif +
+
+ @if (session('success')) +
{{ session('success') }}
+ @endif -
- @csrf - @method('PUT') + + @csrf + @method('PUT') -
-
- Avatar +
+
+ Avatar -
- -
-
- -
-
- - -
-
- - -
- -
-
Ganti Password (Opsional)
- -
-
- - -
-
- - -
-
- - +
+
- -
+ +
+
+ + +
+
+ + +
+ +
+
Ganti Password (Opsional)
+ +
+
+ + +
+
+ + +
+
+ +
+ + +
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ + +
+ + +
+
+
+
@endsection + +@section('js') + + +@endsection \ No newline at end of file