diff --git a/app/Http/Controllers/CustomerController.php b/app/Http/Controllers/CustomerController.php index b836b8c..a188877 100644 --- a/app/Http/Controllers/CustomerController.php +++ b/app/Http/Controllers/CustomerController.php @@ -2,6 +2,9 @@ namespace App\Http\Controllers; +use App\Models\Order; +use App\Models\OrderDetail; +use Carbon\Carbon; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; @@ -172,7 +175,112 @@ class CustomerController extends Controller } public function submitCheckout(){ - $dataCart = json_decode(request('cart_data'), true); - dd(request()->all()); + + $dataCart = request()->input('cartResult'); + $biodataResult = request()->input('biodataResult'); + $totalHarga = request()->input('totalHarga'); + DB::beginTransaction(); + try { + $jenisCustomer = $biodataResult['jenis_customer']; + $today = now()->toDateString(); + $jumlahHariIni = Order::whereDate('entry_at', $today)->count(); + $urutan = $jumlahHariIni + 1; + $noOrder = 'TX/CT/GIZI/' . now()->year .'/'. now()->month .'/' . str_pad($urutan, 4, '0', STR_PAD_LEFT); + $payloadOrder = [ + 'no_order' => $noOrder, + 'jenis_customer' => $jenisCustomer, + 'nama_pemesan' => $biodataResult['nama_pemesan'], + 'jenis_kelamin' => $biodataResult['jenis_kelamin'], + 'tanggal_lahir' => $biodataResult['tanggal_lahir'], + 'no_wa' => $biodataResult['no_whatsapp'], + 'tinggi_badan' => $biodataResult['tinggi_badan'], + 'berat_badan' => $biodataResult['berat_badan'], + 'nama_pasien' => $biodataResult['nama_pasien'], + 'ruang_perawatan' => $biodataResult['ruang_perawatan'], + 'no_kamar_perawatan' => $biodataResult['no_kamar'], + 'kelas_perawatan' => $biodataResult['kelas_perawatan'], + 'bagian_instalasi' => $biodataResult['bagian_instalasi'], + 'no_ekstensien' => $biodataResult['no_ekstensien'], + 'total_harga' => $totalHarga, + 'status_order' => "Pending" + ]; + $order = Order::create($payloadOrder); + foreach ($dataCart as $cart) { + $payloadOrderDetail = [ + 'order_id' => $order->order_id, + 'harga_satuan' => $jenisCustomer === "Karyawan RSAB Harapan Kita" ? $cart['harga_karyawan'] : $cart['harga_kp'], + ]; + foreach ($cart['pesanan'] as $value) { + $payloadOrderDetail['jumlah'] = $value['jumlah']; + $payloadOrderDetail['tgl_antar'] = $value['tgl']; + $payloadOrderDetail['type'] = $value['kategoriPemesanan']; + } + if($cart['jenis_menu'] === "paket"){ + $payloadOrderDetail['master_paket_menu_id'] = $cart['id_menu']; + }else{ + $payloadOrderDetail['master_menu_id'] = $cart['id_menu']; + } + + OrderDetail::create($payloadOrderDetail); + } + //code... + DB::commit(); + return response()->json([ + 'status' => true, + 'data' => $order, + 'message' => 'Data berhasil disimpan' + ]); + } catch (\Throwable $th) { + DB::rollBack(); + return response()->json([ + 'status' => false, + 'message' => 'Data gagal disimpan ' . $th->getMessage() + ]); + } + } + + public function finishCheckout(){ + DB::beginTransaction(); + try { + $noOrder = request('no_order_result'); + $evidence = request()->file('bukti_pembayaran'); + + + $order = Order::where('no_order', $noOrder)->first(); + // Simpan file ke storage + $path = $evidence->store('bukti_pembayaran', 'public'); + // Update data order + $order->update([ + 'bukti_pembayaran' => $path, + 'cara_pembayaran' => 'Transfer', + 'tgl_pembayaran' => Carbon::now() + ]); + + DB::commit(); + session()->flash('payment_success', true); + session()->flash('no_order', $noOrder); + return response([ + 'status' => true, + 'message' => 'Terima kasih atas pesanan Anda. Mohon tunggu, kami sedang memprosesnya' + ], 200); + return back()->with('success', 'Bukti pembayaran berhasil diunggah.'); + } catch (\Throwable $th) { + DB::rollBack(); + return response([ + 'status' => false, + 'message' => 'Gagal melakukan pesanan!' + ], 500); + } + } + + public function success(){ + if(!session()->has('payment_success')){ + return redirect('/'); + } + $payload = [ + 'title' => 'Berhasil Melakukan Pembayaran ', + 'no_order' => session('no_order') + ]; + return view('guest.success_page', $payload); } } diff --git a/app/Models/Order.php b/app/Models/Order.php index 3a1b875..3e2ae75 100644 --- a/app/Models/Order.php +++ b/app/Models/Order.php @@ -13,15 +13,26 @@ class Order extends Model protected $fillable =[ 'entry_at', 'modified_at', - 'no_order', 'statusenabled', + 'no_order', 'kode_order', - 'nama_menu', - 'foto', - 'jenis_menu', - 'harga_public', - 'harga_karyawan', - 'deskripsi', - 'status' + 'jenis_customer', + 'nama_pasien', + 'nama_pemesan', + 'no_wa', + 'kelas_perawatan', + 'no_kamar_perawatan', + 'no_ekstensien', + 'tgl_pembayaran', + 'cara_pembayaran', + 'bukti_pembayaran', + 'status_order', + 'total_harga', + 'jenis_kelamin', + 'tanggal_lahir', + 'tinggi_badan', + 'berat_badan', + 'ruang_perawatan', + 'bagian_instalasi' ]; } diff --git a/app/Models/OrderDetail.php b/app/Models/OrderDetail.php index d153724..f2e50fc 100644 --- a/app/Models/OrderDetail.php +++ b/app/Models/OrderDetail.php @@ -6,5 +6,20 @@ use Illuminate\Database\Eloquent\Model; class OrderDetail extends Model { - // + protected $connection = 'dbOrderGizi'; + protected $table = 'public.order_detail'; + public $timestamps = false; + protected $primaryKey = "order_detail_id"; + protected $fillable =[ + 'entry_at', + 'modified_at', + 'statusenabled', + 'master_menu_id', + 'master_paket_menu_id', + 'harga_satuan', + 'jumlah', + 'tgl_antar', + 'type', + 'order_id' + ]; } diff --git a/public/asset_guests/css/main.css b/public/asset_guests/css/main.css index b51efa3..587edb7 100644 --- a/public/asset_guests/css/main.css +++ b/public/asset_guests/css/main.css @@ -65,7 +65,7 @@ body { color: var(--default-color); background-color: var(--background-color); font-family: var(--default-font); - + } html, body { @@ -1756,3 +1756,33 @@ section, border-radius: 12px 12px 0 0; box-shadow: 0 -2px 8px rgba(0,0,0,0.1); } + +.step-circle { + width: 40px; + height: 40px; + line-height: 40px; + border-radius: 50%; + background-color: #e9ecef; + color: #6c757d; + display: inline-block; + font-weight: bold; + transition: all 0.3s ease; +} + +.step-circle.active { + background-color: #198754; /* Bootstrap success */ + color: #fff; +} + + +.border-dashed { + border: 2px dashed #ccc; + border-radius: 0.5rem; + padding: 1rem; + cursor: pointer; + transition: border-color 0.3s ease; + } + + .border-dashed:hover { + border-color: #198754; + } diff --git a/public/gambar/images.jpg b/public/gambar/images.jpg new file mode 100644 index 0000000..e97604f Binary files /dev/null and b/public/gambar/images.jpg differ diff --git a/public/gambar/success.svg b/public/gambar/success.svg new file mode 100644 index 0000000..1010cfc --- /dev/null +++ b/public/gambar/success.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/public/js/checkout/action.js b/public/js/checkout/action.js new file mode 100644 index 0000000..f6d9124 --- /dev/null +++ b/public/js/checkout/action.js @@ -0,0 +1,105 @@ +async function submitOrderToServer(){ + const totalHarga = hitungTotalHarga(); + + if (sessionStorage.getItem('order_id')) { + currentStep = 2; + showStep(currentStep); + return; + } + const biodataResult = JSON.parse(sessionStorage.getItem('checkout_biodata') || '{}'); + const cartResult = JSON.parse(sessionStorage.getItem('cart') || '[]'); + try { + const response = await fetch('/submit-checkout', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content'), + }, + body: JSON.stringify({ cartResult, biodataResult, totalHarga }), + }) + + const result = await response.json(); + if (response.ok && result.status) { + // Hapus sessionStorage + sessionStorage.setItem('order_id', result.data.no_order); + currentStep = 2; + showStep(currentStep) + document.getElementById('no_order_display').textContent = result.data.no_order + document.getElementById('no_order_price').textContent = result.data.total_harga ? 'Rp ' + parseInt(result.data.total_harga).toLocaleString('id-ID') : '' + $("#no_order_result").val(result.data.no_order) + } + } catch (error) { + console.error('message '+error); + alert('Terdapat kesalahan coba lagi nanti!') + } +} + + function previewBuktiPembayaran() { + const input = document.getElementById('bukti_pembayaran'); + const preview = document.getElementById('bukti_preview'); + const previewText = document.getElementById('preview_text'); + + if (input.files && input.files[0]) { + const file = input.files[0]; + const reader = new FileReader(); + + reader.onload = function (e) { + preview.src = e.target.result; + preview.classList.remove('d-none'); + previewText.classList.add('d-none'); + } + + if (file.size <= 2 * 1024 * 1024) { // 2MB limit + reader.readAsDataURL(file); + } else { + alert("Ukuran file maksimal 2MB."); + input.value = ''; + preview.classList.add('d-none'); + previewText.classList.remove('d-none'); + } + } + } + + $("#checkoutFormFinal").on('submit', async function(e){ + e.preventDefault() + + const form = this; + + const formData = new FormData(form); + + try { + const response = await fetch('/finish-checkout', { + method: 'POST', + body: formData, + headers: { + 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content') + } + }); + + const result = await response.json(); + + if (result.status) { + // ✅ Hapus sessionStorage di client + sessionStorage.removeItem('cart'); + sessionStorage.removeItem('checkout_biodata'); + sessionStorage.removeItem('order_id'); + + Swal.fire({ + title: 'Pesanan Berhasil!', + text: 'Terima kasih, pesanan Anda sedang kami siapkan.', + icon: 'success', + confirmButtonText: 'Berhasil!', + confirmButtonColor: '#28a745' + }).then(() => { + window.location.href = "/success-page"; // ganti dengan rute sukses milikmu + }); + + ; // redirect atau reset step + } else { + alert(result.message || "Terjadi kesalahan."); + } + } catch (err) { + console.error(err); + alert("Terjadi kesalahan saat mengirim data."); + } + }) diff --git a/public/js/checkout/index.js b/public/js/checkout/index.js index 7260422..d73d23e 100644 --- a/public/js/checkout/index.js +++ b/public/js/checkout/index.js @@ -1,195 +1,43 @@ +// ======================= +// DATA SETUP +// ======================= +let checkout_biodata = JSON.parse(sessionStorage.getItem('checkout_biodata') || '{}'); +let order_id = sessionStorage.getItem('order_id') || '[]'; + +// ======================= +// EVENT ON LOAD +// ======================= document.addEventListener('DOMContentLoaded', () => { $("#cartButton").addClass('d-none'); - - const steps = document.querySelectorAll('.form-step'); - const progressBar = document.getElementById('stepProgressBar'); + $("#no_order_result").val(order_id) let currentStep = 0; - let cart = JSON.parse(sessionStorage.getItem('cart') || '[]'); - let checkout_biodata = JSON.parse(sessionStorage.getItem('checkout_biodata') || '{}'); - + // Redirect jika cart kosong if (cart.length === 0) { window.location.href = "/"; return; } - function toggleCustomerFields() { - const selected = $('input[name="jenis_customer"]:checked').val(); - if (selected === 'Karyawan RSAB Harapan Kita') { - $('.karyawan').show(); - $('.pasien').hide(); - } else if (selected === 'Keluarga Pasien / Penunggu Pasien') { - $('.pasien').show(); - $('.karyawan').hide(); - } else { - $('.karyawan, .pasien').hide(); - } - } - - $('input[name="jenis_customer"]').on('change', toggleCustomerFields); - toggleCustomerFields(); - - if (typeof checkout_biodata === 'object') { - if (checkout_biodata.jenis_customer) { - $(`input[name="jenis_customer"][value="${checkout_biodata.jenis_customer}"]`).prop('checked', true); - } - $('#nama_pemesan').val(checkout_biodata.nama_pemesan); - $('#jenis_kelamin').val(checkout_biodata.jenis_kelamin); - $('#tanggal_lahir').val(checkout_biodata.tanggal_lahir); - $('#tinggi_badan').val(checkout_biodata.tinggi_badan); - $('#berat_badan').val(checkout_biodata.berat_badan); - $('#no_whatsapp').val(checkout_biodata.no_whatsapp); - $('#nama_pasien').val(checkout_biodata.nama_pasien); - $('#ruang_perawatan').val(checkout_biodata.ruang_perawatan); - $('#no_kamar').val(checkout_biodata.no_kamar); - $('#kelas_perawatan').val(checkout_biodata.kelas_perawatan); - $('#bagian_instalasi').val(checkout_biodata.bagian_instalasi); - $('#no_ekstensien').val(checkout_biodata.no_ekstensien); - } - - function showStep(index) { - steps.forEach((step, i) => { - step.classList.toggle('active', i === index); - step.classList.toggle('d-none', i !== index); - }); - const total = steps.length; - const progress = ((index + 1) / total) * 100; - progressBar.style.width = progress + '%'; - progressBar.innerText = `Langkah ${index + 1} dari ${total}`; - } - - function isiKonfirmasi() { - const biodata = { - jenis_customer: $('input[name="jenis_customer"]:checked').val(), - nama_pemesan: $('#nama_pemesan').val(), - jenis_kelamin: $('#jenis_kelamin').val(), - tanggal_lahir: $('#tanggal_lahir').val(), - tinggi_badan: $('#tinggi_badan').val(), - berat_badan: $('#berat_badan').val(), - no_whatsapp: $('#no_whatsapp').val(), - nama_pasien: $('#nama_pasien').val(), - ruang_perawatan: $('#ruang_perawatan').val(), - no_kamar: $('#no_kamar').val(), - kelas_perawatan: $('#kelas_perawatan').val(), - bagian_instalasi: $('#bagian_instalasi').val(), - no_ekstensien: $('#no_ekstensien').val(), - }; - - sessionStorage.setItem('checkout_biodata', JSON.stringify(biodata)); - checkout_biodata = biodata; // Update global var - renderCartSummary(); - } - - function renderCartSummary() { - const container = document.getElementById('checkout_cart_summary'); - container.innerHTML = ''; - - cart.forEach((item) => { - const pesananList = Array.isArray(item.pesanan) ? item.pesanan : []; - - let pesananHTML = ''; - pesananList.forEach((p, i) => { - pesananHTML += ` -
-
- -
-
- -
-
- -
-
- -
-
`; - }); - - const harga = checkout_biodata.jenis_customer === 'Karyawan RSAB Harapan Kita' ? item.harga_karyawan || 0 : item.harga_kp || 0; - const itemTotal = pesananList.reduce((sum, p) => sum + (p.jumlah * harga), 0); - - const itemHTML = ` -
-
-
- ${item.nama_menu} -
-
-
-
${item.nama_menu}
-
Rp ${parseInt(harga).toLocaleString('id-ID')}
-

${item.deskripsi || ''}

- ${pesananHTML} -
- -
Total: Rp ${itemTotal.toLocaleString('id-ID')}
- -
-
-
-
-
`; - container.insertAdjacentHTML('beforeend', itemHTML); - }); - } - - window.onTanggalChange = function (itemId, index) { - const tanggalInput = document.querySelector(`div[data-item-id='${itemId}'][data-index='${index}'] .tanggal-input`).value; - cart.forEach(item => { - if (item.id === itemId) item.pesanan[index].tgl = tanggalInput; - }); - sessionStorage.setItem('cart', JSON.stringify(cart)); - }; - - window.onKategoriChange = function (itemId, index) { - const kategori = $(`[data-item-id='${itemId}'][data-index='${index}'] .kategori-pemesanan-input`).val(); - cart.find(item => item.id === itemId).pesanan[index].kategoriPemesanan = kategori; - sessionStorage.setItem('cart', JSON.stringify(cart)); - }; - - window.onJumlahChange = function (itemId, index) { - const jumlahInput = document.querySelector(`div[data-item-id='${itemId}'][data-index='${index}'] .jumlah-input`).value; - if (!isNaN(jumlahInput)) { - cart.find(item => item.id === itemId).pesanan[index].jumlah = parseInt(jumlahInput); - sessionStorage.setItem('cart', JSON.stringify(cart)); - isiKonfirmasi(); - } - }; - window.addOrderDate = function(itemId) { - const item = cart.find(i => i.id === itemId); - - if (item && Array.isArray(item.pesanan)) { - item.pesanan.push({ tgl: '', jumlah: 1, kategoriPemesanan: '' }); - sessionStorage.setItem('cart', JSON.stringify(cart)); - renderCartSummary(); - } - } - - window.removeOrderDate = function(itemId, index) { - const item = cart.find(i => i.id === itemId); - - if (item && Array.isArray(item.pesanan) && item.pesanan.length > index) { - item.pesanan.splice(index, 1); - sessionStorage.setItem('cart', JSON.stringify(cart)); - renderCartSummary(); - } - } - - - + // Setup button step document.querySelectorAll('.next-step').forEach(btn => { - btn.addEventListener('click', () => { - if (currentStep === 0) isiKonfirmasi(); - if (currentStep < steps.length - 1) { + btn.addEventListener('click', async () => { + if (currentStep === 0){ + if(!validateStepOne()) return + isiKonfirmasi(); + currentStep++; showStep(currentStep); + }else if(currentStep === 1){ + const {isValid, errorMessage} =validateCartBeforeSubmit(); + if (!isValid) { + alert(errorMessage); + return + } + if (!sessionStorage.getItem('order_id')) { + await submitOrderToServer(); // async function simpan ke server + } currentStep++; - showStep(currentStep); + showStep(currentStep) + }else if(currentStep === 2){ + renderCartSummary() } }); }); @@ -203,6 +51,360 @@ document.addEventListener('DOMContentLoaded', () => { }); }); + // Inisialisasi tampilan dan data + renderCartSummary(); showStep(currentStep); isiKonfirmasi(); -}); \ No newline at end of file + document.getElementById('no_order_display').textContent = order_id + +}); + +// ======================= +// FUNGSI STEP +// ======================= +const steps = document.querySelectorAll('.form-step'); +const progressBar = document.getElementById('stepProgressBar'); + +function showStep(index) { + steps.forEach((step, i) => { + step.classList.toggle('active', i === index); + step.classList.toggle('d-none', i !== index); + }); + const total = steps.length; + const progress = ((index + 1) / total) * 100; + progressBar.style.width = progress + '%'; + progressBar.innerText = `Langkah ${index + 1} dari ${total}`; + for(let i = 1; i <= total; i++){ + const circle = document.getElementById(`step-circle-${i}`) + if(circle){ + circle.classList.toggle('active', i === index + 1) + } + } +} + +// ======================= +// FUNGSI BIODATA +// ======================= +function toggleCustomerFields() { + const selected = $('input[name="jenis_customer"]:checked').val(); + if (selected === 'Karyawan RSAB Harapan Kita') { + $('.karyawan').show(); + $('.pasien').hide(); + } else if (selected === 'Keluarga Pasien / Penunggu Pasien') { + $('.pasien').show(); + $('.karyawan').hide(); + } else { + $('.karyawan, .pasien').hide(); + } +} + +$('input[name="jenis_customer"]').on('change', toggleCustomerFields); +toggleCustomerFields(); + +if (typeof checkout_biodata === 'object') { + if (checkout_biodata.jenis_customer) { + $(`input[name="jenis_customer"][value="${checkout_biodata.jenis_customer}"]`).prop('checked', true); + } + $('#nama_pemesan').val(checkout_biodata.nama_pemesan); + $('#jenis_kelamin').val(checkout_biodata.jenis_kelamin); + $('#tanggal_lahir').val(checkout_biodata.tanggal_lahir); + $('#tinggi_badan').val(checkout_biodata.tinggi_badan); + $('#berat_badan').val(checkout_biodata.berat_badan); + $('#no_whatsapp').val(checkout_biodata.no_whatsapp); + $('#nama_pasien').val(checkout_biodata.nama_pasien); + $('#ruang_perawatan').val(checkout_biodata.ruang_perawatan); + $('#no_kamar').val(checkout_biodata.no_kamar); + $('#kelas_perawatan').val(checkout_biodata.kelas_perawatan); + $('#bagian_instalasi').val(checkout_biodata.bagian_instalasi); + $('#no_ekstensien').val(checkout_biodata.no_ekstensien); +} + +function isiKonfirmasi() { + const biodata = { + jenis_customer: $('input[name="jenis_customer"]:checked').val(), + nama_pemesan: $('#nama_pemesan').val(), + jenis_kelamin: $('#jenis_kelamin').val(), + tanggal_lahir: $('#tanggal_lahir').val(), + tinggi_badan: $('#tinggi_badan').val(), + berat_badan: $('#berat_badan').val(), + no_whatsapp: $('#no_whatsapp').val(), + nama_pasien: $('#nama_pasien').val(), + ruang_perawatan: $('#ruang_perawatan').val(), + no_kamar: $('#no_kamar').val(), + kelas_perawatan: $('#kelas_perawatan').val(), + bagian_instalasi: $('#bagian_instalasi').val(), + no_ekstensien: $('#no_ekstensien').val(), + }; + + sessionStorage.setItem('checkout_biodata', JSON.stringify(biodata)); + checkout_biodata = biodata; + renderCartSummary(); +} + +// ======================= +// FUNGSI CART / PESANAN +// ======================= +function renderCartSummary() { + const container = document.getElementById('checkout_cart_summary'); + let now = new Date(); + let today = now.toISOString().split('T')[0]; + let isAfter12 = now.getHours() >= 12; + container.innerHTML = ''; + let totalKeseluruhan = 0; + let carts = JSON.parse(sessionStorage.getItem('cart') || '[]'); + + carts.forEach((item) => { + const pesananList = Array.isArray(item.pesanan) ? item.pesanan : []; + let pesananHTML = ''; + let countDate = pesananList.length; + + pesananList.forEach((p, i) => { + let isTodayAndLate = p.tgl === today && isAfter12 + + pesananHTML += ` +
+
+ +
+
+ +
+
+ +
+
+ +
+
`; + }); + + const harga = checkout_biodata.jenis_customer === 'Karyawan RSAB Harapan Kita' ? item.harga_karyawan || 0 : + item.harga_kp || 0; + const itemTotal = pesananList.reduce((sum, p) => sum + (p.jumlah * harga), 0); + totalKeseluruhan += itemTotal + const itemHTML = ` +
+
+
+ ${item.nama_menu} +
+
+
+
${item.nama_menu}
+
Rp ${parseInt(harga).toLocaleString('id-ID')}
+

${item.deskripsi || ''}

+ ${pesananHTML} +
+ +
Total: Rp + ${itemTotal.toLocaleString('id-ID')}
+ +
+
+
+
+
`; + container.insertAdjacentHTML('beforeend', itemHTML); + }); + container.insertAdjacentHTML('beforeend', ` +
+
Total Keseluruhan: Rp ${totalKeseluruhan.toLocaleString('id-ID')}
+
+ `); + + document.getElementById('no_order_price').textContent = 'Rp ' + totalKeseluruhan.toLocaleString('id-ID') +} + +// ======================= +// EVENT HANDLER FIELD +// ======================= +function onJumlahChange(itemId, index) { + let cart = JSON.parse(sessionStorage.getItem('cart') || '[]'); + const input = document.querySelector(`div[data-item-id='${itemId}'][data-index='${index}'] .jumlah-input`); + if (!isNaN(input.value)) { + cart.find(item => item.id === itemId).pesanan[index].jumlah = parseInt(input.value); + sessionStorage.setItem('cart', JSON.stringify(cart)); + isiKonfirmasi(); + } +} + +function onTanggalChange(itemId, index) { + let cart = JSON.parse(sessionStorage.getItem('cart') || '[]'); + const input = document.querySelector(`div[data-item-id='${itemId}'][data-index='${index}'] .tanggal-input`); + cart.find(item => item.id === itemId).pesanan[index].tgl = input.value; + sessionStorage.setItem('cart', JSON.stringify(cart)); + renderCartSummary(); +} + +function onKategoriChange(itemId, index) { + let cart = JSON.parse(sessionStorage.getItem('cart') || '[]'); + const kategori = $(`[data-item-id='${itemId}'][data-index='${index}'] .kategori-pemesanan-input`).val(); + cart.find(item => item.id === itemId).pesanan[index].kategoriPemesanan = kategori; + sessionStorage.setItem('cart', JSON.stringify(cart)); + renderCartSummary(); +} + +// ======================= +// TAMBAH / HAPUS PESANAN +// ======================= +function addOrderDate(itemId) { + let cart = JSON.parse(sessionStorage.getItem('cart') || '[]'); + const item = cart.find(i => i.id === itemId); + if (item && Array.isArray(item.pesanan)) { + item.pesanan.push({ tgl: '', jumlah: 1, kategoriPemesanan: '' }); + sessionStorage.setItem('cart', JSON.stringify(cart)); + renderCartSummary(); + } +} + +function removeOrderDate(itemId, index, count) { + let cart = JSON.parse(sessionStorage.getItem('cart') || '[]'); + const item = cart.find(i => i.id === itemId); + + if(count == 1){ + cart = cart.filter(i => i.id !== itemId); + sessionStorage.setItem('cart', JSON.stringify(cart)); + }else if(item && Array.isArray(item.pesanan) && item.pesanan.length > index) { + item.pesanan.splice(index, 1); + sessionStorage.setItem('cart', JSON.stringify(cart)); + } + renderCartSummary(); +} + + +function removeCartItem(itemId){ + let cart = JSON.parse(sessionStorage.getItem('cart') || '[]'); + cart = cart.filter(i => i.id !== itemId); + sessionStorage.setItem('cart', JSON.stringify(cart)); + renderCartSummary() + } + +// validasi step one dan sebelum submit +function validateStepOne() { + const jenisCustomer = document.querySelector('input[name="jenis_customer"]:checked'); + const namaPemesan = document.getElementById('nama_pemesan').value.trim(); + const jenisKelamin = document.getElementById('jenis_kelamin').value; + const noWA = document.getElementById('no_whatsapp').value.trim(); + + if (!jenisCustomer) { + alert('Silakan pilih jenis customer.'); + return false; + } + + if (!namaPemesan) { + alert('Silakan isi nama pemesan.'); + return false; + } + + if (!jenisKelamin) { + alert('Silakan pilih jenis kelamin.'); + return false; + } + + if (!noWA) { + alert('Silakan isi nomor WhatsApp.'); + return false; + } + + // Validasi tambahan sesuai jenis customer + const selected = jenisCustomer.value; + if (selected === 'Karyawan RSAB Harapan Kita') { + const bagian = document.getElementById('bagian_instalasi').value.trim(); + const ekstension = document.getElementById('no_ekstensien').value.trim(); + if (!bagian) { + alert('Silakan lengkapi data karyawan.'); + return false; + } + } else if (selected === 'Keluarga Pasien / Penunggu Pasien') { + const namaPasien = document.getElementById('nama_pasien').value.trim(); + const ruang = document.getElementById('ruang_perawatan').value; + const noKamar = document.getElementById('no_kamar').value.trim(); + const kelas = document.getElementById('kelas_perawatan').value; + if (!namaPasien || !ruang || !noKamar || !kelas) { + alert('Silakan lengkapi data pasien.'); + return false; + } + } + + return true; +} + + +function validateCartBeforeSubmit() { + const cart = JSON.parse(sessionStorage.getItem('cart') || '[]'); + let isValid = true; + let errorMessage = ""; + + cart.forEach((item, index) => { + const pesananList = item.pesanan || []; + pesananList.forEach((pesanan, i) => { + if (!pesanan.tgl) { + isValid = false; + errorMessage = `Tanggal belum diisi pada item "${item.nama_menu}" (baris ${i + 1})`; + } else if (!pesanan.kategoriPemesanan) { + isValid = false; + errorMessage = `Kategori pemesanan belum dipilih pada item "${item.nama_menu}" (baris ${i + 1})`; + } else if (!pesanan.jumlah || pesanan.jumlah <= 0) { + isValid = false; + errorMessage = `Jumlah harus lebih dari 0 pada item "${item.nama_menu}" (baris ${i + 1})`; + } + }); + }); + + return { isValid, errorMessage }; +} + + +function hitungTotalHarga(){ + const biodata = JSON.parse(sessionStorage.getItem('checkout_biodata') || '{}'); + const cart = JSON.parse(sessionStorage.getItem('cart') || '[]'); + let total =0; + + cart.forEach(item => { + const harga = biodata.jenis_customer === "Karyawan RSAB Harapan Kita" ? item.harga_karyawan || 0 : item.harga_kp || 0 + const itemTotal = item.pesanan?.reduce((sum, p) => sum + (p.jumlah * harga), 0); + total += itemTotal + + }) + + return total; +} + + +function copyNoRek() { + const text = document.getElementById('noRekText').innerText; + navigator.clipboard.writeText(text).then(() => { + alert("Nomor rekening berhasil disalin: " + text); + }).catch(err => { + console.error('Gagal menyalin: ', err); + alert("Gagal menyalin teks."); + }); +} + +function copyNoOrder() { + const text = document.getElementById('no_order_display').innerText; + navigator.clipboard.writeText(text).then(() => { + alert("Nomor order berhasil disalin: " + text); + }).catch(err => { + console.error('Gagal menyalin: ', err); + alert("Gagal menyalin teks."); + }); + } + + diff --git a/public/js/order_guest/checkout.js b/public/js/order_guest/checkout.js index 49f5d80..e29a163 100644 --- a/public/js/order_guest/checkout.js +++ b/public/js/order_guest/checkout.js @@ -94,21 +94,15 @@ let orderIndex = 0; } - - function removeCartItem(itemId){ - let cart = JSON.parse(sessionStorage.getItem('cart') || '[]'); - cart = cart.filter(i => i.id !== itemId); - sessionStorage.setItem('cart', JSON.stringify(cart)); - updateCartCount(cart.length); - renderCartList() - } - - - + + + + + function renderCartTotalOnly() { diff --git a/public/js/order_guest/index.js b/public/js/order_guest/index.js index dec3083..61ee6fb 100644 --- a/public/js/order_guest/index.js +++ b/public/js/order_guest/index.js @@ -174,7 +174,7 @@ $('#floatingCartButton').removeClass('d-none'); $('#floatingCartCount').text(cart.length); $('#floatingCartDesc').text(menuNames); - + $("#scroll-top").addClass('d-none'); } else { $cartCount.hide(); $('#floatingCartButton').addClass('d-none'); diff --git a/resources/views/guest/checkout/checkout_payment.blade.php b/resources/views/guest/checkout/checkout_payment.blade.php index 24db248..ae1019f 100644 --- a/resources/views/guest/checkout/checkout_payment.blade.php +++ b/resources/views/guest/checkout/checkout_payment.blade.php @@ -11,143 +11,42 @@ {{-- Form Identitas --}} -
+ @csrf + +
+
+
1
+ Data +
+
+
2
+ Konfirmasi +
+
+
3
+ Pembayaran +
+
+
Langkah 1 dari 2
{{-- STEP ONE --}} -
-
- -
- -
- - -
-
- - -
-
- - -
-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
- - {{-- Pasien --}} -
- - -
-
- - -
- -
- - -
- -
- - -
- {{-- End Pasien --}} - - {{-- Karyawan --}} -
- - -
-
- - -
- {{-- End Karyawan --}} -
- -
- - + @include('guest.checkout.step.step1') {{-- STEP TWO --}} -
-
Langkah 2: Konfirmasi Pemesanan
- - {{-- Ringkasan Pesanan --}} -
Pesanan Gizi
- -
- {{-- Akan diisi oleh JavaScript --}} -
- - {{-- Tombol Navigasi --}} -
- - -
-
+ @include('guest.checkout.step.step2') + {{-- STEP THREE --}} + @include('guest.checkout.step.step3')
+ @endsection diff --git a/resources/views/guest/checkout/step/step1.blade.php b/resources/views/guest/checkout/step/step1.blade.php new file mode 100644 index 0000000..3239cef --- /dev/null +++ b/resources/views/guest/checkout/step/step1.blade.php @@ -0,0 +1,104 @@ +
+
+ +
+ +
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ + {{-- Pasien --}} +
+ + +
+
+ + +
+ +
+ + +
+ +
+ + +
+ {{-- End Pasien --}} + + {{-- Karyawan --}} +
+ + +
+
+ + +
+ {{-- End Karyawan --}} +
+ +
diff --git a/resources/views/guest/checkout/step/step2.blade.php b/resources/views/guest/checkout/step/step2.blade.php new file mode 100644 index 0000000..85eeedf --- /dev/null +++ b/resources/views/guest/checkout/step/step2.blade.php @@ -0,0 +1,20 @@ +
+
Langkah 2: Konfirmasi Pemesanan
+ + {{-- Ringkasan Pesanan --}} +
Pesanan Gizi
+ +
+ {{-- Akan diisi oleh JavaScript --}} +
+ + {{-- Tombol Navigasi --}} +
+ + +
+
diff --git a/resources/views/guest/checkout/step/step3.blade.php b/resources/views/guest/checkout/step/step3.blade.php new file mode 100644 index 0000000..9d0794f --- /dev/null +++ b/resources/views/guest/checkout/step/step3.blade.php @@ -0,0 +1,80 @@ +
+
Langkah 3: Lakukan Pembayaran
+ +
+
+
+ Pembayaran +
+
+ + +
+
+
Detail Pembayaran
+
    +
  • + No Order +
    + + +
    +
  • +
  • + Bank + Bank BCA +
  • +
  • + Nama Rekening + RSAB Harapan Kita +
  • +
  • + No Rekening: +
    + + 1234-5678-9101 +
    +
  • + +
  • + Nominal yang harus dibayar + +
  • +
  • + Batas Waktu Pembayaran + 12/07/2025 15:30 +
  • +
+

Mohon untuk melakukan pembayaran sebelum batas waktu yang tertera, lalu unggah bukti pembayaran sebagai konfirmasi

+
+
+ +
+
+ + + +
+ +
+ Klik atau drag file ke sini untuk upload
+ Format: JPG, PNG | Max: 2MB +
+ +
+
+ +
+
+ +
+ +
+
diff --git a/resources/views/guest/konfirmasi_pembayaran.blade.php b/resources/views/guest/konfirmasi_pembayaran.blade.php deleted file mode 100644 index e69de29..0000000 diff --git a/resources/views/guest/layout/main.blade.php b/resources/views/guest/layout/main.blade.php index b22c129..a1b47ae 100644 --- a/resources/views/guest/layout/main.blade.php +++ b/resources/views/guest/layout/main.blade.php @@ -4,6 +4,7 @@ + {{ $title }} | Order Gizi RSAB HK @@ -30,6 +31,7 @@ {{-- Jquery --}} + diff --git a/resources/views/guest/layout/partials/header.blade.php b/resources/views/guest/layout/partials/header.blade.php index 2067e81..7bef4dc 100644 --- a/resources/views/guest/layout/partials/header.blade.php +++ b/resources/views/guest/layout/partials/header.blade.php @@ -12,12 +12,20 @@ diff --git a/resources/views/guest/success_page.blade.php b/resources/views/guest/success_page.blade.php new file mode 100644 index 0000000..9128238 --- /dev/null +++ b/resources/views/guest/success_page.blade.php @@ -0,0 +1,36 @@ +@extends('guest.layout.main') +@section('body_main_guests') +
+
+
+
+ Success +
+

Pesanan Anda Berhasil!

+

Terima kasih atas pesanan Anda. Kami akan segera menyiapkannya dan menghubungi Anda jika diperlukan.

+
+

Silakan cek status pesanan secara berkala atau hubungi kami jika ada pertanyaan.

+

No Order : {{ $no_order }} + +

+ Kembali ke Beranda +
+
+
+@endsection + diff --git a/routes/web.php b/routes/web.php index 7466df1..561533a 100644 --- a/routes/web.php +++ b/routes/web.php @@ -22,3 +22,5 @@ Route::get('/', [CustomerController::class, 'index']); Route::get('/checkout', [CustomerController::class, 'checkout']); Route::get('/datamenu', [CustomerController::class, 'dataOrder']); Route::post('/submit-checkout', [CustomerController::class, 'submitCheckout']); +Route::post('/finish-checkout', [CustomerController::class, 'finishCheckout']); +Route::get('/success-page', [CustomerController::class, 'success']);