MIF_E31211459/app/Http/Controllers/User/CartController.php

259 lines
10 KiB
PHP

<?php
namespace App\Http\Controllers\User;
use App\Models\Cart;
use App\Models\Product;
use App\Models\Transaksi;
use Illuminate\Http\Request;
use App\Models\DetailTransaksi;
use App\Http\Controllers\Controller;
class CartController extends Controller
{
public function index()
{
$cart = Cart::with('product')->where('id_user', auth()->user()->id)->get()->sortByDesc('id');
$sum_cart = Cart::where('id_user', auth()->user()->id)->sum('total_harga');
return view('user.pages.cart', [
'cart' => $cart,
'sum_cart' => $sum_cart
]);
}
public function store(Request $request)
{
$request->validate([
'id_product' => 'required|exists:product,id',
'jumlah' => 'required|integer|min:1',
], [
'id_product.required' => 'Produk tidak boleh kosong',
'id_product.exists' => 'Produk tidak ditemukan',
'jumlah.required' => 'Jumlah tidak boleh kosong',
'jumlah.integer' => 'Jumlah harus berupa angka',
'jumlah.min' => 'Jumlah minimal 1',
]);
$stok = Product::find($request->id_product)->stok;
$jumlah_transaksi_paid = DetailTransaksi::where('id_product', $request->id_product)->whereHas('transaksi', function ($query) {
$query->where('status_pembayaran', 'paid');
})->sum('jumlah');
$jumlah_transaksi_pending = DetailTransaksi::where('id_product', $request->id_product)->whereHas('transaksi', function ($query) {
$query->where('status_pembayaran', 'pending');
})->sum('jumlah');
$jumlah_transaksi = $jumlah_transaksi_paid + $jumlah_transaksi_pending;
if ($request->jumlah > $stok - $jumlah_transaksi) {
return redirect()->back()->with('stoktidakcukup', 'Stok produk ' . Product::find($request->id_product)->nama . ' tidak mencukupi');
}
$product = Product::find($request->id_product);
$cart = Cart::where('id_user', auth()->user()->id)->where('id_product', $request->id_product)->first();
if ($cart) {
$cart->update([
'jumlah' => $cart->jumlah + $request->jumlah,
'total_harga' => $cart->product->harga * ($cart->jumlah + $request->jumlah)
]);
} else {
Cart::create([
'id_user' => auth()->user()->id,
'id_product' => $request->id_product,
'jumlah' => $request->jumlah,
'total_harga' => $request->jumlah * $product->harga
]);
}
return redirect('/user/product/' . $request->id_product)->with('storecart', 'Produk berhasil ditambahkan ke keranjang');
}
public function update(Request $request)
{
// cek cart user
$cart = Cart::where('id_user', auth()->user()->id)->get();
if ($cart->count() == 0) {
return redirect('/user/cart')->with('kosongcart', 'Keranjang kosong');
}
// Validasi data yang diterima dari form
$request->validate([
'items.*.id' => 'required|exists:cart,id',
'items.*.jumlah' => 'required|integer|min:1',
], [
'items.*.id.required' => 'Produk tidak boleh kosong',
'items.*.id.exists' => 'Produk tidak ditemukan',
'items.*.jumlah.required' => 'Jumlah tidak boleh kosong',
'items.*.jumlah.integer' => 'Jumlah harus berupa angka',
'items.*.jumlah.min' => 'Jumlah minimal 1',
]);
// loop cek stok
foreach ($request->items as $item) {
$stok = Product::find(Cart::find($item['id'])->id_product)->stok;
$jumlah_transaksi_paid = DetailTransaksi::where('id_product', Cart::find($item['id'])->id_product)->whereHas('transaksi', function ($query) {
$query->where('status_pembayaran', 'paid');
})->sum('jumlah');
$jumlah_transaksi_pending = DetailTransaksi::where('id_product', Cart::find($item['id'])->id_product)->whereHas('transaksi', function ($query) {
$query->where('status_pembayaran', 'pending');
})->sum('jumlah');
$jumlah_transaksi = $jumlah_transaksi_paid + $jumlah_transaksi_pending;
if ($item['jumlah'] > $stok - $jumlah_transaksi) {
return redirect()->back()->with('stoktidakcukup', 'Stok produk ' . Cart::find($item['id'])->product->nama . ' tidak mencukupi');
}
}
// Loop melalui item yang diterima dari form
foreach ($request->items as $item) {
$cart = Cart::find($item['id']);
$cart->update([
'jumlah' => $item['jumlah'],
'total_harga' => $cart->product->harga * $item['jumlah'],
]);
}
return redirect('/user/cart')->with('updatecart', 'Keranjang berhasil diupdate');
}
public function destroy($id)
{
$cart = Cart::find($id);
$cart->delete();
return redirect('/user/cart')->with('deletecart', 'Produk berhasil dihapus dari keranjang');
}
public function checkout()
{
$cart = Cart::where('id_user', auth()->user()->id)->get();
if ($cart->count() == 0) {
return redirect('/user/cart')->with('kosongcart', 'Keranjang kosong');
}
// loop cek stok
foreach ($cart as $c) {
$stok = Product::find($c->id_product)->stok;
$jumlah_transaksi_paid = DetailTransaksi::where('id_product', $c->id_product)->whereHas('transaksi', function ($query) {
$query->where('status_pembayaran', 'paid');
})->sum('jumlah');
$jumlah_transaksi_pending = DetailTransaksi::where('id_product', $c->id_product)->whereHas('transaksi', function ($query) {
$query->where('status_pembayaran', 'pending');
})->sum('jumlah');
$jumlah_transaksi = $jumlah_transaksi_paid + $jumlah_transaksi_pending;
if ($c->jumlah > $stok - $jumlah_transaksi) {
return redirect()->back()->with('stoktidakcukup', 'Stok produk ' . $c->product->nama . ' tidak mencukupi');
}
}
$transaksi = new Transaksi();
$transaksi->no_transaksi = 'TRX' . date('YmdHis');
$transaksi->total_harga = $cart->sum('total_harga');
$transaksi->status_pembayaran = 'Belum Pilih Pembayaran';
$transaksi->status_pemesanan = 'Menunggu Pembayaran';
$transaksi->bank = '';
$transaksi->no_va = '';
$transaksi->expired_at = '';
$transaksi->id_user = auth()->user()->id;
$transaksi->save();
foreach ($cart as $c) {
$detail_transaksi = new DetailTransaksi();
$detail_transaksi->id_transaksi = $transaksi->id;
$detail_transaksi->id_product = $c->id_product;
$detail_transaksi->total_harga = $c->total_harga;
$detail_transaksi->jumlah = $c->jumlah;
$detail_transaksi->save();
}
$delete_cart = Cart::where('id_user', auth()->user()->id)->get();
if ($delete_cart) {
foreach ($delete_cart as $dc) {
$dc->delete();
}
}
\Midtrans\Config::$serverKey = 'SB-Mid-server-QmM6Wx6PNzqhOeVL9f4tnBM7';
// Set to Development/Sandbox Environment (default). Set to true for Production Environment (accept real transaction).
\Midtrans\Config::$isProduction = false;
// \Midtrans\Config::$isProduction = true;
// Set sanitization on (default)
\Midtrans\Config::$isSanitized = true;
// Set 3DS transaction for credit card to true
\Midtrans\Config::$is3ds = true;
$params = array(
'transaction_details' => array(
'order_id' => $transaksi->no_transaksi,
'gross_amount' => $transaksi->total_harga,
),
'customer_details' => array(
'first_name' => auth()->user()->name,
// 'phone' => auth()->user()->phone,
'email' => auth()->user()->email,
),
'item_details' => array(
array(
'id' => $transaksi->no_transaksi,
'price' => $transaksi->total_harga,
'quantity' => 1,
'name' => 'Pembayaran Produk',
),
),
);
$snapToken = \Midtrans\Snap::getSnapToken($params);
return view('user.pages.checkout', [
'transaksi' => $transaksi,
'snapToken' => $snapToken
]);
}
public function callback(Request $request)
{
$serverkey = 'SB-Mid-server-QmM6Wx6PNzqhOeVL9f4tnBM7';
$hashed = hash('sha512', $request->order_id . $request->status_code . $request->gross_amount . $serverkey);
if ($hashed == $request->signature_key) {
if ($request->transaction_status == 'settlement') {
$order = Transaksi::where('no_transaksi', $request->order_id)->first();
$order->bank = $request->va_numbers[0]['bank'];
$order->no_va = $request->va_numbers[0]['va_number'];
$order->expired_at = $request->expiry_time;
$order->status_pembayaran = 'paid';
$order->status_pemesanan = 'Pesanan Diproses';
// 10 menit setelah pembayaran sukses
$order->estimasi_pemesanan = date('Y-m-d H:i:s', strtotime('+10 minutes'));
$order->save();
} elseif ($request->transaction_status == 'pending') {
$order = Transaksi::where('no_transaksi', $request->order_id)->first();
$order->bank = $request->va_numbers[0]['bank'];
$order->no_va = $request->va_numbers[0]['va_number'];
$order->expired_at = $request->expiry_time;
$order->status_pembayaran = 'pending';
$order->status_pemesanan = 'Menunggu Pembayaran';
$order->save();
} else {
$order = Transaksi::where('no_transaksi', $request->order_id)->first();
$order->bank = $request->va_numbers[0]['bank'];
$order->no_va = $request->va_numbers[0]['va_number'];
$order->expired_at = $request->expiry_time;
$order->status_pembayaran = 'expire';
$order->status_pemesanan = 'Pesanan Dibatalkan';
$order->save();
}
}
}
}