134 lines
4.2 KiB
PHP
134 lines
4.2 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use App\Models\Produk;
|
|
use App\Models\Transaksi;
|
|
use App\Models\DetailTransaksi;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class TransaksiController extends Controller
|
|
{
|
|
// --- FITUR PEMBELI ---
|
|
|
|
// Tampilkan Halaman Checkout
|
|
public function checkoutPage(Request $request)
|
|
{
|
|
if ($request->has('produk_id')) {
|
|
$produk = Produk::with('petani')->findOrFail($request->produk_id);
|
|
return view('landing.checkout', compact('produk'));
|
|
}
|
|
|
|
return redirect()->route('shop')->with('error', 'Silakan pilih produk yang ingin dibeli terlebih dahulu.');
|
|
}
|
|
|
|
// Proses Simpan Transaksi
|
|
public function prosesCheckout(Request $request)
|
|
{
|
|
$request->validate([
|
|
'produk_id' => 'required|exists:produks,id',
|
|
'jumlah' => 'required|integer|min:1',
|
|
'alamat_pengiriman' => 'required|string',
|
|
'metode_pembayaran' => 'required|in:cod',
|
|
]);
|
|
|
|
$produk = Produk::findOrFail($request->produk_id);
|
|
|
|
if ($produk->stok < $request->jumlah) {
|
|
return back()->with('error', 'Stok produk tidak mencukupi!');
|
|
}
|
|
|
|
$total_harga = $produk->harga * $request->jumlah;
|
|
|
|
DB::transaction(function () use ($request, $produk, $total_harga) {
|
|
$transaksi = Transaksi::create([
|
|
'pembeli_id' => Auth::guard('pembeli')->id(),
|
|
'tanggal_transaksi' => now(),
|
|
'alamat_pengiriman' => $request->alamat_pengiriman,
|
|
'total_harga' => $total_harga,
|
|
'status' => 'menunggu_konfirmasi',
|
|
'kode_invoice' => 'INV/' . date('Ymd') . '/' . rand(1000, 9999),
|
|
]);
|
|
|
|
DetailTransaksi::create([
|
|
'transaksi_id' => $transaksi->id,
|
|
'produk_id' => $produk->id,
|
|
'jumlah' => $request->jumlah,
|
|
'harga_satuan' => $produk->harga,
|
|
'subtotal' => $total_harga,
|
|
]);
|
|
|
|
// C. Kurangi Stok
|
|
$produk->decrement('stok', $request->jumlah);
|
|
});
|
|
|
|
return redirect()->route('pesanan.saya')->with('success', 'Pesanan berhasil dibuat! Menunggu konfirmasi petani.');
|
|
}
|
|
|
|
// Riwayat Pesanan
|
|
public function pesananSaya()
|
|
{
|
|
$transaksis = Transaksi::with(['details.produk.petani'])
|
|
->where('pembeli_id', Auth::guard('pembeli')->id())
|
|
->latest()
|
|
->get();
|
|
|
|
return view('landing.pesanan_saya', compact('transaksis'));
|
|
}
|
|
|
|
|
|
// --- FITUR PETANI ---
|
|
|
|
// Daftar Pesanan Masuk
|
|
public function pesananMasuk()
|
|
{
|
|
$petaniId = Auth::guard('petani')->id();
|
|
|
|
$pesanans = Transaksi::whereHas('details.produk', function ($q) use ($petaniId) {
|
|
$q->where('petani_id', $petaniId);
|
|
})
|
|
->with(['pembeli', 'details.produk'])
|
|
->latest()
|
|
->get();
|
|
|
|
return view('petani.pesanan.index', compact('pesanans'));
|
|
}
|
|
|
|
// Update Status (Terima/Tolak/Kirim)
|
|
public function updateStatus(Request $request, $id)
|
|
{
|
|
$transaksi = Transaksi::findOrFail($id);
|
|
|
|
$request->validate([
|
|
'status' => 'required|in:diproses,dikirim,selesai,batal'
|
|
]);
|
|
|
|
$transaksi->status = $request->status;
|
|
$transaksi->save();
|
|
|
|
if ($request->status == 'batal') {
|
|
foreach ($transaksi->details as $detail) {
|
|
$detail->produk->increment('stok', $detail->jumlah);
|
|
}
|
|
}
|
|
|
|
return back()->with('success', 'Status pesanan berhasil diperbarui.');
|
|
}
|
|
|
|
// Detail Pesanan (Petani)
|
|
public function pesananDetail($id)
|
|
{
|
|
$petaniId = Auth::guard('petani')->id();
|
|
|
|
// Ambil transaksi berdasarkan ID, pastikan transaksi tersebut memiliki produk milik petani ini
|
|
$pesanan = Transaksi::whereHas('details.produk', function ($q) use ($petaniId) {
|
|
$q->where('petani_id', $petaniId);
|
|
})
|
|
->with(['pembeli', 'details.produk'])
|
|
->findOrFail($id);
|
|
|
|
return view('petani.pesanan.detail', compact('pesanan'));
|
|
}
|
|
} |