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 --}} -
-
- {{ $produk->deskripsi }} -
-Dijual Oleh -
-