diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php index e88713a..fede48b 100644 --- a/app/Http/Controllers/AuthController.php +++ b/app/Http/Controllers/AuthController.php @@ -48,7 +48,7 @@ public function loginProcess(Request $request) Auth::guard('petani')->login($petani); $request->session()->regenerate(); - + return redirect()->intended('petani/dashboard'); } @@ -70,38 +70,49 @@ public function showRegisterForm() public function registerProcess(Request $request) { - $request->validate([ - 'role' => 'required|in:petani,pembeli', - 'nama_lengkap' => 'required', - 'email' => 'required|email', - 'username' => 'required|unique:petanis,username|unique:pembelis,username|alpha_dash', - 'password' => 'required|min:6', - 'no_hp' => 'required|numeric', - 'alamat' => 'required', + $rules = [ + 'role' => 'required|in:petani,pembeli', + 'nama_lengkap' => 'required', + 'email' => 'required|email', + 'username' => 'required|unique:petanis,username|unique:pembelis,username|alpha_dash', + 'password' => 'required|min:8', + 'no_hp' => 'required|numeric', + 'alamat' => 'required', + ]; + + if ($request->role == 'petani') { + $rules['nik'] = 'required|exists:gapoktans,nik|unique:petanis,nik'; + } + + $request->validate($rules, [ + 'nik.required' => 'NIK wajib diisi untuk pendaftaran Petani.', + 'nik.exists' => 'NIK tidak terdaftar di sistem Admin/Gapoktan.', + 'nik.unique' => 'NIK ini sudah terdaftar pada akun lain.' ]); if ($request->role == 'petani') { Petani::create([ + 'nik' => $request->nik, 'nama_lengkap' => $request->nama_lengkap, - 'email' => $request->email, - 'username' => $request->username, - 'password' => Hash::make($request->password), - 'no_hp' => $request->no_hp, - 'alamat' => $request->alamat, - 'nama_usaha' => $request->nama_usaha ?? 'Toko Tani ' . $request->nama_lengkap, - 'status_akun' => 'menunggu' + 'email' => $request->email, + 'username' => $request->username, + 'password' => Hash::make($request->password), + 'no_hp' => $request->no_hp, + 'alamat' => $request->alamat, + 'nama_usaha' => $request->nama_usaha ?? 'Toko Tani ' . $request->nama_lengkap, + 'status_akun' => 'menunggu' ]); - + return redirect('/login')->with('success', 'Registrasi Petani Berhasil! Mohon tunggu verifikasi Admin.'); } else { Pembeli::create([ 'nama_lengkap' => $request->nama_lengkap, - 'email' => $request->email, - 'username' => $request->username, - 'password' => Hash::make($request->password), - 'no_hp' => $request->no_hp, - 'alamat' => $request->alamat, + 'email' => $request->email, + 'username' => $request->username, + 'password' => Hash::make($request->password), + 'no_hp' => $request->no_hp, + 'alamat' => $request->alamat, ]); return redirect('/login')->with('success', 'Registrasi Berhasil! Silakan Login.'); @@ -111,9 +122,12 @@ 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/GapoktanController.php b/app/Http/Controllers/GapoktanController.php new file mode 100644 index 0000000..703d1ff --- /dev/null +++ b/app/Http/Controllers/GapoktanController.php @@ -0,0 +1,39 @@ +get(); + return view('admin.gapoktan.index', compact('gapoktan')); + } + + public function store(Request $request) + { + $request->validate([ + 'nik' => 'required|unique:gapoktans,nik|max:16', + 'nama' => 'required|string|max:255', + ], [ + 'nik.unique' => 'NIK ini sudah terdaftar di sistem.', + ]); + + Gapoktan::create([ + 'nik' => $request->nik, + 'nama' => $request->nama, + ]); + + return redirect()->back()->with('success', 'Data Gapoktan berhasil ditambahkan!'); + } + + // Menghapus data + public function destroy($id) + { + Gapoktan::findOrFail($id)->delete(); + return redirect()->back()->with('success', 'Data berhasil dihapus!'); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Petani/DashboardController.php b/app/Http/Controllers/Petani/DashboardController.php index 31486af..730f29b 100644 --- a/app/Http/Controllers/Petani/DashboardController.php +++ b/app/Http/Controllers/Petani/DashboardController.php @@ -5,39 +5,43 @@ use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Auth; use App\Models\Produk; -use App\Models\DetailTransaksi; +use App\Models\Transaksi; class DashboardController extends Controller { public function index() { $petaniId = Auth::guard('petani')->id(); - - // 1. Hitung Total Produk Aktif $totalProduk = Produk::where('petani_id', $petaniId)->count(); + $pesananBaru = Transaksi::where('petani_id', $petaniId) + ->where('status', 'dibayar') + ->count(); - // 2. Hitung Pesanan Baru (Yang statusnya 'dibayar' / perlu diproses) - $pesananBaru = DetailTransaksi::whereHas('produk', function($q) use ($petaniId) { - $q->where('petani_id', $petaniId); - })->whereHas('transaksi', function($q) { - $q->where('status', 'dibayar'); - })->count(); + $totalPemesanan = Transaksi::where('petani_id', $petaniId) + ->where('status', '!=', 'batal') + ->count(); - // 3. Hitung TOTAL SEMUA PEMESANAN (Valid) - // Menghitung semua transaksi masuk (Dibayar, Dikirim, Selesai) kecuali yang Batal - $totalPemesanan = DetailTransaksi::whereHas('produk', function($q) use ($petaniId) { - $q->where('petani_id', $petaniId); - })->whereHas('transaksi', function($q) { - $q->where('status', '!=', 'batal'); // Ambil semua kecuali yang batal - })->count(); + $totalPendapatan = Transaksi::where('petani_id', $petaniId) + ->where('status', 'selesai') + ->sum('total_harga'); - // 4. Hitung Total Pendapatan (Hanya yang status 'selesai') - $totalPendapatan = DetailTransaksi::whereHas('produk', function($q) use ($petaniId) { - $q->where('petani_id', $petaniId); - })->whereHas('transaksi', function($q) { - $q->where('status', 'selesai'); - })->sum('subtotal'); + $pendapatanPerBulan = Transaksi::where('petani_id', $petaniId) + ->where('status', 'selesai') + ->whereYear('tanggal_transaksi', date('Y')) + ->selectRaw('MONTH(tanggal_transaksi) as bulan, SUM(total_harga) as total') + ->groupBy('bulan') + ->pluck('total', 'bulan') + ->toArray(); - return view('petani.dashboard', compact('totalProduk', 'pesananBaru', 'totalPemesanan', 'totalPendapatan')); + $labels = ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Agt', 'Sep', 'Okt', 'Nov', 'Des']; + $dataGrafik = []; + + for ($i = 1; $i <= 12; $i++) { + $dataGrafik[] = $pendapatanPerBulan[$i] ?? 0; + } + + return view('petani.dashboard', compact( + 'totalProduk', 'pesananBaru', 'totalPemesanan', 'totalPendapatan', 'labels', 'dataGrafik' + )); } } \ No newline at end of file diff --git a/app/Models/Gapoktan.php b/app/Models/Gapoktan.php new file mode 100644 index 0000000..57ef1db --- /dev/null +++ b/app/Models/Gapoktan.php @@ -0,0 +1,23 @@ +hasOne(Petani::class, 'nik', 'nik'); + } +} \ No newline at end of file diff --git a/app/Models/Petani.php b/app/Models/Petani.php index 78c6e76..f4503df 100644 --- a/app/Models/Petani.php +++ b/app/Models/Petani.php @@ -14,6 +14,7 @@ class Petani extends Authenticatable implements CanResetPassword protected $table = 'petanis'; protected $fillable = [ + 'nik', 'nama_lengkap', 'username', 'email', diff --git a/database/migrations/2025_11_25_123427_create_petanis_table.php b/database/migrations/2025_11_25_123427_create_petanis_table.php index 4ae2fd1..d003962 100644 --- a/database/migrations/2025_11_25_123427_create_petanis_table.php +++ b/database/migrations/2025_11_25_123427_create_petanis_table.php @@ -13,6 +13,7 @@ public function up(): void { Schema::create('petanis', function (Blueprint $table) { $table->id(); + $table->string('nik', 16)->nullable()->unique(); $table->string('nama_lengkap'); $table->string('username')->unique(); $table->string('email')->unique(); diff --git a/database/migrations/2026_02_13_085218_create_gapoktans_table.php b/database/migrations/2026_02_13_085218_create_gapoktans_table.php new file mode 100644 index 0000000..fd55843 --- /dev/null +++ b/database/migrations/2026_02_13_085218_create_gapoktans_table.php @@ -0,0 +1,23 @@ +id(); + $table->string('nik', 16)->unique(); + $table->string('nama'); + $table->timestamps(); + }); + } + + public function down() + { + Schema::dropIfExists('gapoktans'); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 0bc7961..08cfc1c 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -19,9 +19,10 @@ public function run(): void // User::factory(10)->create(); $this->call([ + GapoktanSeeder::class, + PetaniSeeder::class, AdminSeeder::class, PembeliSeeder::class, - PetaniSeeder::class, ProdukSeeder::class, ]); } diff --git a/database/seeders/GapoktanSeeder.php b/database/seeders/GapoktanSeeder.php new file mode 100644 index 0000000..a5d9164 --- /dev/null +++ b/database/seeders/GapoktanSeeder.php @@ -0,0 +1,33 @@ +insert([ + [ + 'nik' => '3518012345678901', + 'nama' => 'Gapoktan Makmur Jaya', + 'created_at' => now(), + 'updated_at' => now(), + ], + [ + 'nik' => '3518012345678902', + 'nama' => 'Kelompok Tani Sumber Rejeki', + 'created_at' => now(), + 'updated_at' => now(), + ], + [ + 'nik' => '3518012345678903', + 'nama' => 'Gapoktan Suka Maju', + 'created_at' => now(), + 'updated_at' => now(), + ], + ]); + } +} \ No newline at end of file diff --git a/database/seeders/PetaniSeeder.php b/database/seeders/PetaniSeeder.php index a8d9092..03edea4 100644 --- a/database/seeders/PetaniSeeder.php +++ b/database/seeders/PetaniSeeder.php @@ -13,11 +13,12 @@ class PetaniSeeder extends Seeder */ public function run(): void { - // Petani SUDAH AKTIF -> Bisa login & jualan + // Petani SUDAH AKTIF DB::table('petanis')->insert([ + 'nik' => '3518012345678901', 'nama_lengkap' => 'Siti Aminah', 'username' => 'siti_sayur', - 'email' => 'siti@gmail.com', + 'email' => 'siti@gmail.com', 'password' => Hash::make('password123'), 'no_hp' => '085678901234', 'alamat' => 'Dusun Krajan RT 02 RW 01', @@ -26,11 +27,13 @@ public function run(): void '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', + 'email' => 'budisantoso@gmail.com', 'password' => Hash::make('password123'), 'no_hp' => '081234567890', 'alamat' => 'Jl. Raya Desa Sukamaju No. 12', @@ -40,12 +43,12 @@ public function run(): void 'updated_at' => now(), ]); - // Petani DITOLAK DB::table('petanis')->insert([ + 'nik' => '3518012345678903', 'nama_lengkap' => 'Joko Widodo', 'username' => 'joko_tani', - 'email' => 'wiwokdetok@gmail.com', + 'email' => 'wiwokdetok@gmail.com', 'password' => Hash::make('password123'), 'no_hp' => '089876543210', 'alamat' => 'Jl. Buntu No. 99', diff --git a/database/seeders/TransaksiSeeder.php b/database/seeders/TransaksiSeeder.php new file mode 100644 index 0000000..9ee9983 --- /dev/null +++ b/database/seeders/TransaksiSeeder.php @@ -0,0 +1,90 @@ +insertGetId([ + 'kode_invoice' => 'INV-' . $tahunIni . '01-001', + 'pembeli_id' => 1, + 'petani_id' => 1, + 'tanggal_transaksi' => Carbon::create($tahunIni, 1, 15, 10, 0, 0), + 'alamat_pengiriman' => 'Jl. Raya Nganjuk No. 123, Jawa Timur', + 'total_harga' => 250000, + 'status' => 'selesai', + 'created_at' => Carbon::create($tahunIni, 1, 15, 10, 0, 0), + 'updated_at' => Carbon::create($tahunIni, 1, 15, 10, 0, 0), + ]); + + DB::table('detail_transaksis')->insert([ + 'transaksi_id' => $trx1, + 'produk_id' => 1, + 'jumlah' => 5, + 'harga_satuan' => 50000, + 'subtotal' => 250000, + 'created_at' => Carbon::create($tahunIni, 1, 15, 10, 0, 0), + 'updated_at' => Carbon::create($tahunIni, 1, 15, 10, 0, 0), + ]); + + // ========================================== + // TRANSAKSI 2: BULAN FEBRUARI (Selesai) + // ========================================== + $trx2 = DB::table('transaksis')->insertGetId([ + 'kode_invoice' => 'INV-' . $tahunIni . '02-002', + 'pembeli_id' => 1, + 'petani_id' => 1, + 'tanggal_transaksi' => Carbon::create($tahunIni, 2, 10, 14, 30, 0), + 'alamat_pengiriman' => 'Jl. Sudirman No. 45, Jakarta', + 'total_harga' => 400000, + 'status' => 'selesai', + 'created_at' => Carbon::create($tahunIni, 2, 10, 14, 30, 0), + 'updated_at' => Carbon::create($tahunIni, 2, 10, 14, 30, 0), + ]); + + DB::table('detail_transaksis')->insert([ + 'transaksi_id' => $trx2, + 'produk_id' => 1, + 'jumlah' => 8, + 'harga_satuan' => 50000, + 'subtotal' => 400000, + 'created_at' => Carbon::create($tahunIni, 2, 10, 14, 30, 0), + 'updated_at' => Carbon::create($tahunIni, 2, 10, 14, 30, 0), + ]); + + // ========================================== + // TRANSAKSI 3: BULAN MARET (Selesai) + // ========================================== + $trx3 = DB::table('transaksis')->insertGetId([ + 'kode_invoice' => 'INV-' . $tahunIni . '03-003', + 'pembeli_id' => 1, + 'petani_id' => 1, + 'tanggal_transaksi' => Carbon::create($tahunIni, 3, 5, 9, 15, 0), + 'alamat_pengiriman' => 'Perumahan Indah Blok C2, Surabaya', + 'total_harga' => 150000, + 'status' => 'selesai', + 'created_at' => Carbon::create($tahunIni, 3, 5, 9, 15, 0), + 'updated_at' => Carbon::create($tahunIni, 3, 5, 9, 15, 0), + ]); + + DB::table('detail_transaksis')->insert([ + 'transaksi_id' => $trx3, + 'produk_id' => 1, + 'jumlah' => 3, + 'harga_satuan' => 50000, + 'subtotal' => 150000, + 'created_at' => Carbon::create($tahunIni, 3, 5, 9, 15, 0), + 'updated_at' => Carbon::create($tahunIni, 3, 5, 9, 15, 0), + ]); + } +} \ No newline at end of file diff --git a/resources/views/admin/gapoktan/index.blade.php b/resources/views/admin/gapoktan/index.blade.php new file mode 100644 index 0000000..a2cf2c4 --- /dev/null +++ b/resources/views/admin/gapoktan/index.blade.php @@ -0,0 +1,86 @@ +@extends('layouts.admin') +@section('content') +
| No | +Tanggal Dibuat | +NIK | +Nama Petani/Kelompok | +Status Akun | +Aksi | +
|---|---|---|---|---|---|
| {{ $key + 1 }} | +{{ \Carbon\Carbon::parse($item->created_at)->translatedFormat('d F Y') }} | +{{ $item->nik }} | +{{ $item->nama }} | ++ @if ($item->petanis) + Digunakan oleh + {{ $item->petanis->nama_lengkap }} + @else + Belum Digunakan + @endif + | ++ + | +
Gabung komunitas GriyaPadi.id
+ @@ -161,8 +169,9 @@ class="text-tani fw-bold text-decoration-none">Login +