TIF_NGANJUK_E41220737/app/Http/Controllers/TransaksiController.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;
}
}