83 lines
2.6 KiB
PHP
83 lines
2.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use App\Models\Transaksi;
|
|
use App\Models\DetailTransaksi;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
|
class TransaksiController extends Controller
|
|
{
|
|
/**
|
|
* PROSES CHECKOUT / MENYIMPAN TRANSAKSI.
|
|
* Menggunakan DB Transaction agar data header dan detail tersimpan atomik (bersamaan).
|
|
*/
|
|
public function store(Request $request)
|
|
{
|
|
$cart = session()->get('cart');
|
|
|
|
// Validasi Keranjang (Backend validation)
|
|
if (!$cart) {
|
|
return redirect()->route('shop')->with('error', 'Keranjang kosong!');
|
|
}
|
|
|
|
// Validasi Input User
|
|
$request->validate([
|
|
'alamat_pengiriman' => 'required|string|max:500',
|
|
'no_hp' => 'required|numeric',
|
|
'nama_lengkap' => 'required|string|max:255',
|
|
]);
|
|
|
|
try {
|
|
DB::beginTransaction();
|
|
|
|
$subtotal = $this->hitungSubtotal($cart);
|
|
$ongkir = 10000;
|
|
$total_bayar = $subtotal + $ongkir;
|
|
|
|
$transaksi = Transaksi::create([
|
|
'pembeli_id' => Auth::guard('pembeli')->id(),
|
|
'tanggal_transaksi' => now(),
|
|
'alamat_pengiriman' => $request->alamat_pengiriman,
|
|
'total_harga' => $total_bayar,
|
|
'status' => 'pending',
|
|
'kode_invoice' => 'INV/' . date('Ymd') . '/' . mt_rand(1000, 9999),
|
|
'catatan' => $request->catatan,
|
|
]);
|
|
|
|
foreach ($cart as $id_produk => $details) {
|
|
DetailTransaksi::create([
|
|
'transaksi_id' => $transaksi->id,
|
|
'produk_id' => $id_produk,
|
|
'jumlah' => $details['quantity'],
|
|
'harga_satuan' => $details['price'],
|
|
'subtotal' => $details['price'] * $details['quantity'],
|
|
]);
|
|
}
|
|
|
|
DB::commit();
|
|
|
|
session()->forget('cart');
|
|
|
|
return redirect()->route('home')->with('success', 'Pesanan berhasil dibuat! Kode Invoice: ' . $transaksi->kode_invoice);
|
|
|
|
} catch (\Exception $e) {
|
|
DB::rollBack();
|
|
return redirect()->back()->with('error', 'Terjadi kesalahan saat memproses transaksi: ' . $e->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Helper untuk menghitung subtotal belanjaan dari session.
|
|
*/
|
|
private function hitungSubtotal($cart)
|
|
{
|
|
$total = 0;
|
|
foreach($cart as $id => $details) {
|
|
$total += $details['price'] * $details['quantity'];
|
|
}
|
|
return $total;
|
|
}
|
|
} |