progress order gizi

This commit is contained in:
JokoPrasetio 2025-07-22 16:17:50 +07:00
parent 911d4fe68e
commit 28639db59a
19 changed files with 958 additions and 335 deletions

View File

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

View File

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

View File

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

View File

@ -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;
}

BIN
public/gambar/images.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,7 @@
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Transformed by: SVG Repo Mixer Tools -->
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 50 50" xml:space="preserve" width="800px" height="800px" fill="#000000">
<g id="SVGRepo_bgCarrier" stroke-width="0"/>
<g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"/>
<g id="SVGRepo_iconCarrier"> <circle style="fill:#25AE88;" cx="25" cy="25" r="25"/> <polyline style="fill:none;stroke:#FFFFFF;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" points=" 38,15 22,33 12,25 "/> </g>
</svg>

After

Width:  |  Height:  |  Size: 758 B

View File

@ -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.");
}
})

View File

@ -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 += `
<div class="row g-2 align-items-center mb-2" data-item-id="${item.id}" data-index="${i}">
<div class="col-12 col-md-5">
<input type="date" class="form-control form-control-sm tanggal-input" value="${p.tgl}" oninput="onTanggalChange(${item.id}, ${i})">
</div>
<div class="col-12 col-md-3">
<select class="form-select form-select-sm kategori-pemesanan-input" onchange="onKategoriChange(${item.id}, ${i})">
<option value="" disabled ${!p.kategoriPemesanan ? 'selected' : ''}>Kategori Pemesanan</option>
<option value="Same Day" ${p.kategoriPemesanan === 'Same Day' ? 'selected' : ''}>Same Day</option>
<option value="Menu Normal" ${p.kategoriPemesanan === 'Menu Normal' ? 'selected' : ''}>Menu Normal</option>
</select>
</div>
<div class="col-6 col-md-2">
<input type="number" class="form-control form-control-sm jumlah-input" value="${p.jumlah}" min="1" oninput="onJumlahChange(${item.id}, ${i})">
</div>
<div class="col-6 col-md-2 text-end">
<button type="button" class="btn btn-sm btn-danger w-100 w-md-auto" onclick="removeOrderDate(${item.id}, ${i})">
<i class="fa-solid fa-trash"></i>
</button>
</div>
</div>`;
});
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 = `
<div class="card mb-3 shadow-sm">
<div class="row g-0">
<div class="col-md-4 d-flex align-items-center justify-content-center p-2">
<img src="gambar/${item.foto || 'default.jpg'}" alt="${item.nama_menu}" class="img-fluid rounded" style="max-height: 180px; object-fit: cover;">
</div>
<div class="col-md-8">
<div class="card-body">
<h5 class="card-title">${item.nama_menu}</h5>
<div class="text-muted small">Rp ${parseInt(harga).toLocaleString('id-ID')}</div>
<p class="card-text text-muted small mb-3">${item.deskripsi || ''}</p>
${pesananHTML}
<div class="mt-3 d-flex justify-content-between align-items-center">
<button type="button" class="btn btn-sm btn-outline-success" onclick="addOrderDate(${item.id})">+ Tambah Tanggal</button>
<div><strong>Total:</strong> <span class="text-success">Rp ${itemTotal.toLocaleString('id-ID')}</span></div>
<button type="button" class="btn btn-sm btn-outline-danger" onclick="removeCartItem(${item.id})"><i class="fa-solid fa-trash"></i> Hapus</button>
</div>
</div>
</div>
</div>
</div>`;
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();
});
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 += `
<div class="row g-2 align-items-center mb-2" data-item-id="${item.id}" data-index="${i}">
<div class="col-12 col-md-5">
<input type="date" class="form-control form-control-sm tanggal-input" min="${today}" value="${p.tgl}"
onchange="onTanggalChange(${item.id}, ${i})">
</div>
<div class="col-12 col-md-3">
<select class="form-select form-select-sm kategori-pemesanan-input"
onchange="onKategoriChange(${item.id}, ${i})">
<option value="" ${!p.kategoriPemesanan ? 'selected' : ''}>Kategori Pemesanan</option>
<option value="Same Day" ${p.kategoriPemesanan === 'Same Day' ? 'selected' : ''} ${isTodayAndLate ? 'disabled' : ''}>Same Day</option>
<option value="Menu Normal" ${p.kategoriPemesanan === 'Menu Normal' ? 'selected' : ''} >Menu Normal
</option>
</select>
</div>
<div class="col-6 col-md-2">
<input type="number" class="form-control form-control-sm jumlah-input" value="${p.jumlah}"
onchange="onJumlahChange(${item.id}, ${i})">
</div>
<div class="col-6 col-md-2 text-end">
<button type="button" class="btn btn-sm btn-danger w-100 w-md-auto"
onclick="removeOrderDate(${item.id}, ${i}, ${countDate})">
<i class="fa-solid fa-trash"></i>
</button>
</div>
</div>`;
});
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 = `
<div class="card mb-3 shadow-sm">
<div class="row g-0">
<div class="col-md-4 d-flex align-items-center justify-content-center p-2">
<img src="gambar/${item.foto || 'default.jpg'}" alt="${item.nama_menu}" class="img-fluid rounded"
style="max-height: 180px; object-fit: cover;">
</div>
<div class="col-md-8">
<div class="card-body">
<h5 class="card-title">${item.nama_menu}</h5>
<div class="text-muted small">Rp ${parseInt(harga).toLocaleString('id-ID')}</div>
<p class="card-text text-muted small mb-3">${item.deskripsi || ''}</p>
${pesananHTML}
<div class="mt-3 d-flex justify-content-between align-items-center">
<button type="button" class="btn btn-sm btn-outline-success"
onclick="addOrderDate(${item.id})">+ Tambah Tanggal</button>
<div><strong>Total:</strong> <span class="text-success">Rp
${itemTotal.toLocaleString('id-ID')}</span></div>
<button type="button" class="btn btn-sm btn-outline-danger"
onclick="removeCartItem(${item.id})">
<i class="fa-solid fa-trash"></i> Hapus
</button>
</div>
</div>
</div>
</div>
</div>`;
container.insertAdjacentHTML('beforeend', itemHTML);
});
container.insertAdjacentHTML('beforeend', `
<div class="text-end mt-4">
<h5><strong>Total Keseluruhan:</strong> <span class="text-success">Rp ${totalKeseluruhan.toLocaleString('id-ID')}</span></h5>
</div>
`);
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.");
});
}

View File

@ -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() {

View File

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

View File

@ -11,143 +11,42 @@
</div>
{{-- Form Identitas --}}
<form id="checkoutFormFinal" method="POST" action="/submit-checkout">
<form id="checkoutFormFinal" method="POST" enctype="multipart/form-data">
@csrf
<!-- Step Indicators -->
<div class="d-flex justify-content-between align-items-center mb-3 px-2" id="stepIndicators">
<div class="step-indicator text-center flex-fill">
<div class="step-circle" id="step-circle-1">1</div>
<small class="d-block mt-1">Data</small>
</div>
<div class="step-indicator text-center flex-fill">
<div class="step-circle" id="step-circle-2">2</div>
<small class="d-block mt-1">Konfirmasi</small>
</div>
<div class="step-indicator text-center flex-fill">
<div class="step-circle" id="step-circle-3">3</div>
<small class="d-block mt-1">Pembayaran</small>
</div>
</div>
<div class="progress mb-4">
<div class="progress-bar bg-success" role="progressbar" id="stepProgressBar" style="width: 50%;">
Langkah 1 dari 2
</div>
</div>
{{-- STEP ONE --}}
<div class="form-step active">
<div class="row g-3 mb-4">
<input type="hidden" name="cart_data" id="cart_data">
<div class="col-md-12">
<label for="exampleInputEmail1" class="form-label">Apakah Anda Seorang ?</label>
<div class="form-check">
<input class="form-check-input" type="radio" name="jenis_customer" id="radio_karyawan" value="Karyawan RSAB Harapan Kita" required>
<label class="form-check-label" for="radio_karyawan" >
Karyawan RSAB Harapan Kita
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="jenis_customer" id="radio_kp" value="Keluarga Pasien / Penunggu Pasien" required>
<label class="form-check-label" for="radio_kp">
Keluarga Pasien / Penunggu Pasien
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="jenis_customer" id="radio_public" value="Masyarakat Umum" required>
<label class="form-check-label" for="radio_public">
Masyarakat Umum
</label>
</div>
</div>
<div class="col-md-6">
<label class="form-label">Nama Pemesan</label>
<input type="text" class="form-control" name="nama_pemesan" id="nama_pemesan" required>
</div>
<div class="col-md-6">
<label class="form-label">Jenis Kelamin</label>
<select class="form-select" name="jenis_kelamin" id="jenis_kelamin" required>
<option value="">Pilih...</option>
<option value="Laki-laki">Laki-laki</option>
<option value="Perempuan">Perempuan</option>
</select>
</div>
<div class="col-md-6">
<label class="form-label">Tanggal Lahir</label>
<input type="date" class="form-control" name="tanggal_lahir" id="tanggal_lahir">
</div>
<div class="col-md-6">
<label class="form-label">Tinggi Badan</label>
<input type="number" class="form-control" name="tinggi_badan" id="tinggi_badan">
</div>
<div class="col-md-6">
<label class="form-label">Berat Badan</label>
<input type="number" class="form-control" name="berat_badan" id="berat_badan">
</div>
<div class="col-md-6">
<label class="form-label">No. Whatsapp</label>
<input type="number" class="form-control" name="no_whatsapp" id="no_whatsapp" required>
</div>
{{-- Pasien --}}
<div class="col-md-6 pasien">
<label class="form-label">Nama Pasien</label>
<input type="text" class="form-control pasien-field" name="nama_pasien" id="nama_pasien">
</div>
<div class="col-md-6 pasien">
<label class="form-label">Ruang Perawatan</label>
<select class="form-select pasien-field" name="ruang_perawatan" id="ruang_perawatan">
<option value="">Pilih...</option>
<option value="Ruang Kenanga">Ruang Kenanga</option>
<option value="Ruang Menur">Ruang Menur</option>
<option value="Ruang Melati">Ruang Melati</option>
<option value="Ruang Mawar">Ruang Mawar</option>
<option value="Ruang Cempaka">Ruang Cempaka</option>
<option value="Ruang Widuri">Ruang Widuri</option>
<option value="Ruang Teratai">Ruang Teratai</option>
<option value="Klinik Anggrek">Klinik Melati</option>
<option value="Ruang VK">Ruang VK</option>
</select>
</div>
<div class="col-md-6 pasien">
<label class="form-label">Nomor Kamar Perawatan</label>
<input type="text" class="form-control pasien-field" name="no_kamar" id="no_kamar">
</div>
<div class="col-md-6 pasien">
<label class="form-label">Kelas Perawatan </label>
<select class="form-select pasien-field" name="kelas_perawatan" id="kelas_perawatan">
<option value="">Pilih...</option>
<option value="VIP A">VIP A</option>
<option value="VIP B">VIP B</option>
<option value="Kelas I">Kelas I</option>
<option value="Mesa Tesa">Mesa Tesa</option>
</select>
</div>
{{-- End Pasien --}}
{{-- Karyawan --}}
<div class="col-md-6 karyawan">
<label class="form-label">Bagian /Instalasi</label>
<input type="text" class="form-control karyawan-field" name="bagian_instalasi" id="bagian_instalasi">
</div>
<div class="col-md-6 karyawan">
<label class="form-label">Ekstensien yang bisa di Hubungi</label>
<input type="text" class="form-control karyawan-field" name="no_ekstensien" id="no_ekstensien">
</div>
{{-- End Karyawan --}}
</div>
<button type="button" class="btn btn-success w-100 next-step">Lanjutkan</button>
</div>
@include('guest.checkout.step.step1')
{{-- STEP TWO --}}
<div class="form-step d-none">
<h5 class="mb-4">Langkah 2: Konfirmasi Pemesanan</h5>
{{-- Ringkasan Pesanan --}}
<h6 class="fw-bold mb-3">Pesanan Gizi</h6>
<div id="checkout_cart_summary">
{{-- Akan diisi oleh JavaScript --}}
</div>
{{-- Tombol Navigasi --}}
<div class="d-flex justify-content-between mt-4">
<button type="button" class="btn btn-secondary prev-step">Kembali</button>
<button type="submit" class="btn btn-success">Simpan Pemesanan</button>
</div>
</div>
@include('guest.checkout.step.step2')
{{-- STEP THREE --}}
@include('guest.checkout.step.step3')
</form>
</div>
</div>
</section>
<script src="{{ ver('/js/checkout/index.js') }}"></script>
<script src="{{ ver('/js/checkout/action.js') }}"></script>
@endsection

View File

@ -0,0 +1,104 @@
<div class="form-step active">
<div class="row g-3 mb-4">
<input type="hidden" name="cart_data" id="cart_data">
<div class="col-md-12">
<label for="exampleInputEmail1" class="form-label">Apakah Anda Seorang ?</label>
<div class="form-check">
<input class="form-check-input" type="radio" name="jenis_customer" id="radio_karyawan" value="Karyawan RSAB Harapan Kita" required>
<label class="form-check-label" for="radio_karyawan" >
Karyawan RSAB Harapan Kita
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="jenis_customer" id="radio_kp" value="Keluarga Pasien / Penunggu Pasien" required>
<label class="form-check-label" for="radio_kp">
Keluarga Pasien / Penunggu Pasien
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="jenis_customer" id="radio_public" value="Masyarakat Umum" required>
<label class="form-check-label" for="radio_public">
Masyarakat Umum
</label>
</div>
</div>
<div class="col-md-6">
<label class="form-label">Nama Pemesan</label>
<input type="text" class="form-control" name="nama_pemesan" id="nama_pemesan" required>
</div>
<div class="col-md-6">
<label class="form-label">Jenis Kelamin</label>
<select class="form-select" name="jenis_kelamin" id="jenis_kelamin" required>
<option value="">Pilih...</option>
<option value="Laki-laki">Laki-laki</option>
<option value="Perempuan">Perempuan</option>
</select>
</div>
<div class="col-md-6">
<label class="form-label">Tanggal Lahir</label>
<input type="date" class="form-control" name="tanggal_lahir" id="tanggal_lahir">
</div>
<div class="col-md-6">
<label class="form-label">Tinggi Badan</label>
<input type="number" class="form-control" name="tinggi_badan" id="tinggi_badan">
</div>
<div class="col-md-6">
<label class="form-label">Berat Badan</label>
<input type="number" class="form-control" name="berat_badan" id="berat_badan">
</div>
<div class="col-md-6">
<label class="form-label">No. Whatsapp</label>
<input type="number" class="form-control" name="no_whatsapp" id="no_whatsapp" required>
</div>
{{-- Pasien --}}
<div class="col-md-6 pasien">
<label class="form-label">Nama Pasien</label>
<input type="text" class="form-control pasien-field" name="nama_pasien" id="nama_pasien">
</div>
<div class="col-md-6 pasien">
<label class="form-label">Ruang Perawatan</label>
<select class="form-select pasien-field" name="ruang_perawatan" id="ruang_perawatan">
<option value="">Pilih...</option>
<option value="Ruang Kenanga">Ruang Kenanga</option>
<option value="Ruang Menur">Ruang Menur</option>
<option value="Ruang Melati">Ruang Melati</option>
<option value="Ruang Mawar">Ruang Mawar</option>
<option value="Ruang Cempaka">Ruang Cempaka</option>
<option value="Ruang Widuri">Ruang Widuri</option>
<option value="Ruang Teratai">Ruang Teratai</option>
<option value="Klinik Anggrek">Klinik Melati</option>
<option value="Ruang VK">Ruang VK</option>
</select>
</div>
<div class="col-md-6 pasien">
<label class="form-label">Nomor Kamar Perawatan</label>
<input type="text" class="form-control pasien-field" name="no_kamar" id="no_kamar">
</div>
<div class="col-md-6 pasien">
<label class="form-label">Kelas Perawatan </label>
<select class="form-select pasien-field" name="kelas_perawatan" id="kelas_perawatan">
<option value="">Pilih...</option>
<option value="VIP A">VIP A</option>
<option value="VIP B">VIP B</option>
<option value="Kelas I">Kelas I</option>
<option value="Mesa Tesa">Mesa Tesa</option>
</select>
</div>
{{-- End Pasien --}}
{{-- Karyawan --}}
<div class="col-md-6 karyawan">
<label class="form-label">Bagian /Instalasi</label>
<input type="text" class="form-control karyawan-field" name="bagian_instalasi" id="bagian_instalasi">
</div>
<div class="col-md-6 karyawan">
<label class="form-label">Ekstensien yang bisa di Hubungi</label>
<input type="text" class="form-control karyawan-field" name="no_ekstensien" id="no_ekstensien">
</div>
{{-- End Karyawan --}}
</div>
<button type="button" class="btn btn-success w-100 next-step">Lanjutkan</button>
</div>

View File

@ -0,0 +1,20 @@
<div class="form-step d-none">
<h5 class="mb-4">Langkah 2: Konfirmasi Pemesanan</h5>
{{-- Ringkasan Pesanan --}}
<h6 class="fw-bold mb-3">Pesanan Gizi</h6>
<div class="alert alert-info py-2 px-3 small" role="alert">
<div class="fw-bold">Kategori Pemesanan</div>
<div><span class="fw-semibold">Menu Same Day:</span> Dipesan pada hari yang sama setelah pukul 10.00 WIB</div>
<div><span class="fw-semibold">Menu Normal:</span> Dipesan minimal H-1 sebelum hari penyajian</div>
</div>
<div id="checkout_cart_summary">
{{-- Akan diisi oleh JavaScript --}}
</div>
{{-- Tombol Navigasi --}}
<div class="d-flex justify-content-between mt-4">
<button type="button" class="btn btn-secondary prev-step">Sebelumnya</button>
<button type="button" class="btn btn-success next-step" id="btnSimpanPemesanan">Lanjutkan</button>
</div>
</div>

View File

@ -0,0 +1,80 @@
<div class="form-step">
<h5 class="mb-4 text-center fw-bold">Langkah 3: Lakukan Pembayaran</h5>
<div class="card shadow-sm p-4">
<div class="row justify-content-center text-center">
<div class="col-12 col-sm-10 col-md-8 col-lg-6 mb-3">
<img src="gambar/images.jpg" alt="Pembayaran"
class="img-fluid rounded shadow w-100"
style="max-width: 500px; height: auto;">
</div>
</div>
<div class="row justify-content-center">
<div class="col-md-8 text-center">
<h6 class="fw-bold">Detail Pembayaran</h6>
<ul class="list-group list-group-flush mb-3">
<li class="list-group-item d-flex justify-content-between">
<span>No Order</span>
<div>
<button type="button" class="btn btn-sm btn-outline-secondary" onclick="copyNoOrder()">
<i class="fa fa-copy me-1"></i> Salin
</button>
<strong id="no_order_display"></strong>
</div>
</li>
<li class="list-group-item d-flex justify-content-between">
<span>Bank</span>
<strong>Bank BCA</strong>
</li>
<li class="list-group-item d-flex justify-content-between">
<span>Nama Rekening</span>
<strong>RSAB Harapan Kita</strong>
</li>
<li class="list-group-item d-flex justify-content-between">
<span>No Rekening:</span>
<div>
<button type="button" class="btn btn-sm btn-outline-secondary" onclick="copyNoRek()">
<i class="fa fa-copy me-1"></i> Salin
</button>
<strong id="noRekText">1234-5678-9101</strong>
</div>
</li>
<li class="list-group-item d-flex justify-content-between">
<span>Nominal yang harus dibayar</span>
<strong id="no_order_price"></strong>
</li>
<li class="list-group-item d-flex justify-content-between">
<span>Batas Waktu Pembayaran</span>
<strong>12/07/2025 15:30</strong>
</li>
</ul>
<p class="text-muted">Mohon untuk melakukan pembayaran sebelum batas waktu yang tertera, lalu unggah bukti pembayaran sebagai konfirmasi</p>
</div>
</div>
<div class="row justify-content-center mt-4">
<div class="col-md-8">
<input type="hidden" id="no_order_result" name="no_order_result">
<label for="bukti_pembayaran" class="form-label fw-semibold">Upload Bukti Pembayaran</label>
<div class="card p-3 border-dashed position-relative text-center shadow-sm">
<input type="file" class="form-control position-absolute top-0 start-0 opacity-0 w-100 h-100"
id="bukti_pembayaran" name="bukti_pembayaran" accept="image/*" required onchange="previewBuktiPembayaran()">
<div id="preview_text" class="text-muted" required>
Klik atau drag file ke sini untuk upload<br>
<small>Format: JPG, PNG | Max: 2MB</small>
</div>
<img id="bukti_preview" class="img-fluid rounded mt-3 d-none" style="max-height: 300px; object-fit: contain;" />
</div>
</div>
</div>
</div>
<div class="d-flex justify-content-center mt-4">
<button type="submit" class="btn btn-success w-100">Selesaikan Pesanan</button>
</div>
</div>

View File

@ -4,6 +4,7 @@
<head>
<meta charset="utf-8">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>{{ $title }} | Order Gizi RSAB HK</title>
<meta name="description" content="">
<meta name="keywords" content="">
@ -30,6 +31,7 @@
{{-- Jquery --}}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
</head>
<body class="index-page">

View File

@ -12,12 +12,20 @@
<nav id="navmenu" class="navmenu">
{{-- <i class="mobile-nav-toggle d-xl-none bi bi-list"></i> --}}
<button type="button" class="btn btn-sm btn-success position-relative" id="cartButton" onclick="checkout()">
<i class="fa-solid fa-cart-shopping"></i>
<span class="position-absolute top-0 start-100 translate-middle badge rounded-pill bg-danger" id="cartCount" style="display: none;">
0
</span>
</button>
<div class="d-flex align-items-center gap-2">
<!-- Tombol No Order -->
<button href="/check-order" class="btn btn-outline-success position-relative me-2">
Check Order
</button>
<!-- Tombol Keranjang -->
<button type="button" class="btn btn-sm btn-success position-relative" id="cartButton" onclick="checkout()">
<i class="fa-solid fa-cart-shopping"></i>
<span class="position-absolute top-0 start-100 translate-middle badge rounded-pill bg-danger" id="cartCount" style="display: none;">
0
</span>
</button>
</div>
</nav>

View File

@ -0,0 +1,36 @@
@extends('guest.layout.main')
@section('body_main_guests')
<section class="section py-5 bg-light text-center">
<div class="container">
<div class="card shadow-lg p-4 mx-auto" style="max-width: 600px;">
<div class="mb-4">
<img src="{{ asset('gambar/success.svg') }}" alt="Success" style="width: 100px;">
</div>
<h3 class="text-success mb-3">Pesanan Anda Berhasil!</h3>
<p class="lead">Terima kasih atas pesanan Anda. Kami akan segera menyiapkannya dan menghubungi Anda jika diperlukan.</p>
<hr class="my-4">
<p class="text-muted">Silakan cek status pesanan secara berkala atau hubungi kami jika ada pertanyaan.</p>
<p>No Order : <strong>{{ $no_order }}</strong>
<button class="btn btn-sm btn-outline-secondary ms-2" onclick="copyNoOrder()">
<i class="fa fa-copy"></i> Salin
</button>
</p>
<a href="/" class="btn btn-success mt-3"><i class="fa fa-home me-1"></i> Kembali ke Beranda</a>
</div>
</div>
</section>
@endsection
<script>
document.addEventListener('DOMContentLoaded', () => {
$("#cartButton").addClass('d-none');
})
function copyNoOrder() {
const text = document.getElementById('noOrderText').innerText;
navigator.clipboard.writeText(text).then(() => {
alert("Nomor order berhasil disalin: " + text);
}).catch(err => {
console.error('Gagal menyalin: ', err);
alert("Gagal menyalin teks.");
});
}
</script>

View File

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