TIF_NGANJUK_E41220737/app/Http/Controllers/TransaksiController.php

239 lines
8.4 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)
{
// Beli Langsung (Buy Now)
if ($request->has('produk_id')) {
$produk = Produk::with('petani')->findOrFail($request->produk_id);
$items = collect([
(object) [
'id' => $produk->id,
'produk' => $produk,
'nama_produk' => $produk->nama_produk,
'harga' => $produk->harga,
'jumlah' => $request->qty ?? 1,
'subtotal' => $produk->harga * ($request->qty ?? 1),
'foto' => $produk->foto_produk
]
]);
$total_belanja = $items->sum('subtotal');
return view('landing.checkout', compact('items', 'total_belanja'));
}
// Checkout dari Keranjang
$cart = session()->get('cart');
if ($cart && count($cart) > 0) {
$items = collect();
foreach ($cart as $id => $details) {
$produk = Produk::find($id);
if ($produk) {
$items->push((object) [
'id' => $id,
'produk' => $produk,
'nama_produk' => $details['name'],
'harga' => $details['price'],
'jumlah' => $details['quantity'],
'subtotal' => $details['price'] * $details['quantity'],
'foto' => $details['photo']
]);
}
}
$total_belanja = $items->sum('subtotal');
return view('landing.checkout', compact('items', 'total_belanja'));
}
return redirect()->route('shop')->with('error', 'Keranjang Anda kosong, silakan belanja dulu.');
}
// fungsi prosesCheckout
public function prosesCheckout(Request $request)
{
$request->validate([
'alamat_pengiriman' => 'required|string',
'metode_pembayaran' => 'required|in:cod',
]);
$pembeli_id = Auth::guard('pembeli')->id();
DB::transaction(function () use ($request, $pembeli_id) {
if ($request->has('produk_id')) {
// --- LOGIKA BELI LANGSUNG (Single Item) ---
$produk = Produk::findOrFail($request->produk_id);
$total_harga = $produk->harga * $request->jumlah;
$transaksi = Transaksi::create([
'pembeli_id' => $pembeli_id,
'petani_id' => $produk->petani_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,
]);
$produk->decrement('stok', $request->jumlah);
} else {
// --- LOGIKA KERANJANG (Cart) ---
$cart = session()->get('cart');
// Kelompokkan produk berdasarkan Petani ID
$cartItems = [];
foreach ($cart as $id => $details) {
$produk = Produk::find($id);
if ($produk) {
$cartItems[$produk->petani_id][] = [
'produk' => $produk,
'qty' => $details['quantity']
];
}
}
foreach ($cartItems as $petani_id => $items) {
$subtotal_transaksi = 0;
$kode_invoice = 'INV/' . date('Ymd') . '/' . rand(1000, 9999);
// Membuat Header Transaksi per Petani
$transaksi = Transaksi::create([
'pembeli_id' => $pembeli_id,
'petani_id' => $petani_id,
'tanggal_transaksi' => now(),
'alamat_pengiriman' => $request->alamat_pengiriman,
'total_harga' => 0,
'status' => 'menunggu konfirmasi',
'kode_invoice' => $kode_invoice,
]);
foreach ($items as $item) {
$produk = $item['produk'];
$qty = $item['qty'];
$total_per_item = $produk->harga * $qty;
$subtotal_transaksi += $total_per_item;
DetailTransaksi::create([
'transaksi_id' => $transaksi->id,
'produk_id' => $produk->id,
'jumlah' => $qty,
'harga_satuan' => $produk->harga,
'subtotal' => $total_per_item,
]);
$produk->decrement('stok', $qty);
}
// Update total harga transaksi
$transaksi->update(['total_harga' => $subtotal_transaksi]);
}
session()->forget('cart');
}
});
return redirect()->route('pesanan.saya')->with('success', 'Pesanan berhasil dibuat! Menunggu konfirmasi petani.');
}
// Riwayat Pesanan
public function pesananSaya()
{
$transaksis = Transaksi::with(['detailTransaksis.produk.petani'])
->where('pembeli_id', Auth::guard('pembeli')->id())
->latest()
->get();
return view('landing.pesanan_saya', compact('transaksis'));
}
// Konfirmasi Pesanan Diterima oleh Pembeli
public function konfirmasiSelesai($id)
{
$transaksi = Transaksi::where('pembeli_id', Auth::guard('pembeli')->id())
->findOrFail($id);
// Hanya bisa selesai jika status sebelumnya 'dikirim'
if ($transaksi->status == 'dikirim') {
$transaksi->status = 'selesai';
$transaksi->save();
return back()->with('success', 'Terima kasih! Pesanan telah diselesaikan.');
}
return back()->with('error', 'Pesanan belum dikirim atau sudah selesai.');
}
// --- FITUR PETANI ---
// Daftar Pesanan Masuk
public function pesananMasuk()
{
$petaniId = Auth::guard('petani')->id();
$pesanans = Transaksi::whereHas('detailTransaksis.produk', function ($q) use ($petaniId) {
$q->where('petani_id', $petaniId);
})
->with(['pembeli', 'detailTransaksis.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
$pesanan = Transaksi::whereHas('detailTransaksis.produk', function ($q) use ($petaniId) {
$q->where('petani_id', $petaniId);
})
->with(['pembeli', 'detailTransaksis.produk'])
->findOrFail($id);
return view('petani.pesanan.detail', compact('pesanan'));
}
}