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}
-
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}
+
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 --}}
-
+
@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 @@
+
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 @@
+
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 @@
+
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')
+
+
+
+
+
 }})
+
+
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']);