256 lines
9.5 KiB
PHP
256 lines
9.5 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use App\Models\Produk;
|
|
use App\Models\Transaksi;
|
|
use App\Models\DetailTransaksi;
|
|
use App\Models\Cart;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class TransaksiController extends Controller
|
|
{
|
|
// --- FITUR PEMBELI ---
|
|
|
|
/**
|
|
* Tampilkan Halaman Checkout
|
|
* Mendukung Beli Langsung dan Checkout dari Keranjang (Database)
|
|
*/
|
|
public function checkoutPage(Request $request)
|
|
{
|
|
// Mendefinisikan ID Pembeli agar tidak error 'Undefined Variable'
|
|
$pembeli_id = Auth::guard('pembeli')->id();
|
|
|
|
// LOGIKA 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'));
|
|
}
|
|
|
|
// LOGIKA CHECKOUT DARI KERANJANG (Database)
|
|
$cartIds = $request->query('cart_ids');//MENGAMBIL PARAMETER CARD_IDS DARI URL
|
|
|
|
if (!$cartIds) {//mengecek apakah produk pada keranjang ada yg dipilih
|
|
return redirect()->route('cart')->with('error', 'Pilih minimal satu produk di keranjang untuk dicheckout.');
|
|
}
|
|
|
|
$selectedIds = explode(',', $cartIds);
|
|
|
|
$cartItems = Cart::with('produk.petani')
|
|
->where('pembeli_id', $pembeli_id)
|
|
->whereIn('id', $selectedIds)
|
|
->get();
|
|
|
|
if ($cartItems->isEmpty()) {
|
|
return redirect()->route('cart')->with('error', 'Barang di keranjang tidak ditemukan atau sudah dihapus.');
|
|
}
|
|
|
|
// Transformasi data agar sesuai dengan format yang dibaca di View Checkout
|
|
$items = $cartItems->map(function ($item) {
|
|
return (object) [
|
|
'cart_id' => $item->id,
|
|
'id' => $item->produk->id,
|
|
'produk' => $item->produk,
|
|
'nama_produk' => $item->produk->nama_produk,
|
|
'harga' => $item->produk->harga,
|
|
'jumlah' => $item->quantity,
|
|
'subtotal' => $item->produk->harga * $item->quantity,
|
|
'foto' => $item->produk->foto_produk
|
|
];
|
|
});
|
|
|
|
$total_belanja = $items->sum('subtotal');
|
|
|
|
return view('landing.checkout', compact('items', 'total_belanja'));
|
|
}
|
|
|
|
/**
|
|
* Proses Pembuatan Transaksi
|
|
* Mengelompokkan pesanan berdasarkan Petani dan membersihkan keranjang
|
|
*/
|
|
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 ---
|
|
$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);//mengurangi stok
|
|
|
|
} else {
|
|
// --- LOGIKA KERANJANG (DATABASE) ---
|
|
if (!$request->cart_ids) {
|
|
throw new \Exception("ID keranjang tidak ditemukan.");
|
|
}
|
|
|
|
$cartIds = explode(',', $request->cart_ids);//ubah teks menjadi array
|
|
|
|
$cartItems = Cart::with('produk')
|
|
->whereIn('id', $cartIds)//ambil data cart dengan id
|
|
->where('pembeli_id', $pembeli_id)//hanya ambil cart milik user yg sedang login
|
|
->get();
|
|
|
|
$groupedByPetani = [];//membuat array kosong untuk menyimpan data
|
|
foreach ($cartItems as $item) {//melakukan perulangan dengan memproses item satu persatu
|
|
$groupedByPetani[$item->produk->petani_id][] = $item;//mengambil id petani dari produk kemudian dikelompokkan (itek dikelompokkan)
|
|
}
|
|
|
|
foreach ($groupedByPetani as $petani_id => $items) {//memproses data per petani satu persatu berdasarkan id 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' => 'INV/' . date('Ymd') . '/' . rand(1000, 9999),
|
|
]);
|
|
|
|
$subtotal_transaksi = 0;
|
|
foreach ($items as $item) {
|
|
$total_per_item = $item->produk->harga * $item->quantity;
|
|
$subtotal_transaksi += $total_per_item;
|
|
|
|
DetailTransaksi::create([
|
|
'transaksi_id' => $transaksi->id,
|
|
'produk_id' => $item->produk->id,
|
|
'jumlah' => $item->quantity,
|
|
'harga_satuan' => $item->produk->harga,
|
|
'subtotal' => $total_per_item,
|
|
]);
|
|
|
|
$item->produk->decrement('stok', $item->quantity);//mengurangi stok
|
|
}
|
|
|
|
// Update total harga transaksi per petani
|
|
$transaksi->update(['total_harga' => $subtotal_transaksi]);
|
|
}
|
|
|
|
Cart::whereIn('id', $cartIds)->delete();
|
|
}
|
|
});
|
|
|
|
return redirect()->route('pesanan.saya')->with('success', 'Pesanan berhasil dibuat! Silakan pantau status pesanan Anda.');
|
|
}
|
|
|
|
// Riwayat Pesanan Pembeli
|
|
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);
|
|
|
|
if ($transaksi->status == 'dikirim') {
|
|
$transaksi->status = 'selesai';
|
|
$transaksi->save();
|
|
return back()->with('success', 'Terima kasih! Pesanan telah selesai.');
|
|
}
|
|
|
|
return back()->with('error', 'Pesanan belum dikirim atau sudah selesai.');
|
|
}
|
|
|
|
|
|
// --- FITUR PETANI ---
|
|
|
|
// Daftar Pesanan Masuk untuk Dashboard Petani
|
|
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 Pesanan oleh Petani
|
|
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();
|
|
|
|
// Jika dibatalkan, kembalikan stok produk
|
|
if ($request->status == 'batal') {
|
|
foreach ($transaksi->detailTransaksis as $detail) {
|
|
$detail->produk->increment('stok', $detail->jumlah);//menambah atau mengembalikan stok
|
|
}
|
|
}
|
|
|
|
return back()->with('success', 'Status pesanan berhasil diperbarui.');
|
|
}
|
|
|
|
// Detail Pesanan untuk Sisi Petani
|
|
public function pesananDetail($id)
|
|
{
|
|
$petaniId = Auth::guard('petani')->id();
|
|
|
|
$pesanan = Transaksi::whereHas('detailTransaksis.produk', function ($q) use ($petaniId) {//ambil data transaksi yang hanya dimiliki petani yg sedang login
|
|
$q->where('petani_id', $petaniId);
|
|
})
|
|
->with(['pembeli', 'detailTransaksis.produk'])
|
|
->findOrFail($id);
|
|
|
|
return view('petani.pesanan.detail', compact('pesanan'));
|
|
}
|
|
} |