744 lines
29 KiB
JavaScript
744 lines
29 KiB
JavaScript
// =======================
|
|
// 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');
|
|
$("#no_order_result").val(order_id)
|
|
let currentStep = 0;
|
|
let orderDate=''
|
|
let deadline=''
|
|
let time_order=''
|
|
// Setup button step
|
|
document.querySelectorAll('.next-step').forEach(btn => {
|
|
btn.addEventListener('click', async () => {
|
|
let cart = JSON.parse(sessionStorage.getItem('cart') || '[]');
|
|
|
|
if (cart.length === 0) {
|
|
window.location.href = "/";
|
|
return;
|
|
}
|
|
if (currentStep === 0){
|
|
if(!validateStepOne()) return
|
|
isiKonfirmasi();
|
|
currentStep++; showStep(currentStep);
|
|
}else if(currentStep === 1){
|
|
const {isValid, errorMessage} =validateCartBeforeSubmit();
|
|
if (!isValid) {
|
|
alert(errorMessage);
|
|
return
|
|
}
|
|
let checkout_biodata = JSON.parse(sessionStorage.getItem('checkout_biodata') || '{}');
|
|
|
|
if (!checkout_biodata.nama_pemesan) {
|
|
Swal.fire({
|
|
title: 'Biodata Belum Terisi!',
|
|
text: 'Lakukan Pengisian biodata terlebih dahulu.',
|
|
icon: 'warning',
|
|
confirmButtonText: 'oke!',
|
|
}).then(() => {
|
|
window.location.href = "/checkout";
|
|
});
|
|
return
|
|
}
|
|
let cart = JSON.parse(sessionStorage.getItem('cart') || '[]');
|
|
for (const item of cart) {
|
|
for (const p of item.pesanan) {
|
|
const result = validateTanggalPemesanan(item, p.tgl);
|
|
|
|
if (!result.valid) {
|
|
alert(result.message);
|
|
return; // hentikan di sini, tidak lanjut
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
if (!sessionStorage.getItem('order_id')) {
|
|
await submitOrderToServer(); // async function simpan ke server
|
|
|
|
}
|
|
|
|
time_order = sessionStorage.getItem('time_order')
|
|
orderDate = new Date(time_order);
|
|
deadline = new Date(orderDate.getTime() + 10 * 60 * 1000)
|
|
updateCountdown()
|
|
currentStep++;
|
|
showStep(currentStep)
|
|
}else if(currentStep === 2){
|
|
renderCartSummary()
|
|
}
|
|
});
|
|
});
|
|
|
|
document.querySelectorAll('.prev-step').forEach(btn => {
|
|
btn.addEventListener('click', () => {
|
|
let cart = JSON.parse(sessionStorage.getItem('cart') || '[]');
|
|
if (cart.length === 0) {
|
|
window.location.href = "/";
|
|
return;
|
|
}
|
|
if (currentStep > 0) {
|
|
currentStep--;
|
|
showStep(currentStep);
|
|
}
|
|
});
|
|
});
|
|
|
|
// Inisialisasi tampilan dan data
|
|
renderCartSummary();
|
|
showStep(currentStep);
|
|
isiKonfirmasi();
|
|
toggleCustomerFields()
|
|
document.getElementById('no_order_display').textContent = order_id
|
|
|
|
const countDownPayment = document.getElementById('countdownPayment')
|
|
|
|
|
|
|
|
function updateCountdown(){
|
|
const now = new Date();
|
|
orderDate = new Date(time_order);
|
|
deadline = new Date(orderDate.getTime() + 10 * 60 * 1000)
|
|
const distance = deadline - now
|
|
|
|
if(distance <= 0){
|
|
countDownPayment.textContent = "Waktu Habis Lakukan Pemesanan Ulang";
|
|
return;
|
|
}
|
|
|
|
const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60))
|
|
const seconds = Math.floor((distance % (1000 * 60)) / 1000)
|
|
|
|
countDownPayment.textContent = `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`
|
|
}
|
|
|
|
updateCountdown();
|
|
const interval = setInterval(() => {
|
|
updateCountdown()
|
|
if(new Date() >= deadline) clearInterval(interval)
|
|
}, 1000)
|
|
|
|
});
|
|
// =======================
|
|
// 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, .umum').hide();
|
|
} else if (selected === 'Keluarga Pasien / Penunggu Pasien') {
|
|
$('.pasien').show();
|
|
$('.karyawan, .umum').hide();
|
|
} else {
|
|
$('.umum').show();
|
|
$('.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);
|
|
}
|
|
if(checkout_biodata.jenis_kelamin){
|
|
$(`input[name="jenis_kelamin"][value="${checkout_biodata.jenis_kelamin}"]`).prop('checked', true);
|
|
}
|
|
$('#nama_pemesan').val(checkout_biodata.nama_pemesan);
|
|
// $('#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);
|
|
$('#email').val(checkout_biodata.email);
|
|
$('#alamat').val(checkout_biodata.alamat);
|
|
}
|
|
|
|
function isiKonfirmasi() {
|
|
const biodata = {
|
|
jenis_customer: $('input[name="jenis_customer"]:checked').val(),
|
|
nama_pemesan: $('#nama_pemesan').val(),
|
|
jenis_kelamin: $('input[name="jenis_kelamin"]:checked').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(),
|
|
email: $('#email').val(),
|
|
alamat: $('#alamat').val(),
|
|
};
|
|
|
|
sessionStorage.setItem('checkout_biodata', JSON.stringify(biodata));
|
|
checkout_biodata = biodata;
|
|
renderCartSummary();
|
|
}
|
|
|
|
// =======================
|
|
// FUNGSI CART / PESANAN
|
|
// =======================
|
|
function renderCartSummary() {
|
|
const container = document.getElementById('checkout_cart_summary');
|
|
container.innerHTML = '';
|
|
let totalKeseluruhan = 0;
|
|
const carts = JSON.parse(sessionStorage.getItem('cart') || '[]');
|
|
|
|
carts.forEach((item) => {
|
|
const pesananList = Array.isArray(item.pesanan) ? item.pesanan : [];
|
|
let pesananHTML = '';
|
|
const harga = checkout_biodata.jenis_customer === 'Karyawan RSAB Harapan Kita'
|
|
? item.harga_karyawan || 0
|
|
: item.harga_public || 0;
|
|
const itemTotal = pesananList.reduce((sum, p) => sum + (p.jumlah * harga), 0);
|
|
totalKeseluruhan += itemTotal;
|
|
|
|
pesananList.forEach((p, i) => {
|
|
const selectedDate = new Date(p.tgl);
|
|
const now = new Date();
|
|
const isToday = selectedDate.toDateString() === now.toDateString();
|
|
const jam = now.getHours();
|
|
const disableSiang = isToday && jam >= 10;
|
|
const disableSore = isToday && jam >= 13;
|
|
const countDate = pesananList.length;
|
|
|
|
pesananHTML += `
|
|
<div class=" rounded p-2 mb-2" data-item-id="${item.id}" data-index="${i}">
|
|
<div class="row g-2 align-items-center">
|
|
|
|
<!-- Tanggal -->
|
|
<div class="col-12 col-md-3">
|
|
<input type="text" class="form-control form-control-sm tanggal-input" id="tanggal-${item.id}-${i}" readonly>
|
|
</div>
|
|
|
|
<!-- Karbohidrat -->
|
|
${item.apakah_someday ? `` : `
|
|
<div class="col-12 col-md-3">
|
|
<select class="form-select form-select-sm karbohidrat-input" onchange="onKarbohidratChange(${item.id}, ${i})">
|
|
<option value="">Pilih Karbohidrat</option>
|
|
${(karhohidrats || []).map(k => `
|
|
<option value="${k.karbohidrat_id}" ${p.karbohidrat_id === k.karbohidrat_id ? 'selected' : ''}>
|
|
${k.nama_karbohidrat} (${k.nilai_kalori} kkal)
|
|
</option>`).join('')}
|
|
</select>
|
|
</div>`}
|
|
|
|
<!-- Waktu Makan -->
|
|
<div class="col-12 col-md-3">
|
|
<select class="form-select form-select-sm kategori-pemesanan-input"
|
|
data-item-id="${item.id}" data-index="${i}"
|
|
onchange="onKategoriChange(${item.id}, ${i}, ${isToday})"
|
|
onfocus="this.dataset.previousValue = this.value"
|
|
${item.apakah_menu_siang || item.apakah_menu_sore ? '' : 'disabled'}>
|
|
|
|
${
|
|
item.apakah_someday
|
|
? (
|
|
item.apakah_menu_siang && item.apakah_menu_sore
|
|
? `
|
|
<option value="Makan Siang" ${p.kategoriPemesanan === 'Makan Siang' ? 'selected' : ''} ${disableSiang ? 'disabled' : ''}>Makan Siang</option>
|
|
<option value="Makan Sore" ${p.kategoriPemesanan === 'Makan Sore' ? 'selected' : ''} ${disableSore ? 'disabled' : ''}>Makan Sore</option>
|
|
`
|
|
: item.apakah_menu_siang
|
|
? `<option value="Makan Siang" selected ${disableSiang ? 'disabled' : ''}>Makan Siang</option>`
|
|
: item.apakah_menu_sore
|
|
? `<option value="Makan Sore" selected ${disableSore ? 'disabled' : ''}>Makan Sore</option>`
|
|
: `<option value="" disabled selected>Tidak tersedia</option>`
|
|
)
|
|
: (
|
|
item.apakah_menu_siang && item.apakah_menu_sore
|
|
? `
|
|
<option value="Makan Siang" ${p.kategoriPemesanan === 'Makan Siang' ? 'selected' : ''}>Makan Siang</option>
|
|
<option value="Makan Sore" ${p.kategoriPemesanan === 'Makan Sore' ? 'selected' : ''}>Makan Sore</option>
|
|
`
|
|
: item.apakah_menu_siang
|
|
? `<option value="Makan Siang" selected>Makan Siang</option>`
|
|
: item.apakah_menu_sore
|
|
? `<option value="Makan Sore" selected>Makan Sore</option>`
|
|
: `<option value="" disabled selected>Tidak tersedia</option>`
|
|
)
|
|
}
|
|
</select>
|
|
</div>
|
|
|
|
<!-- Jumlah -->
|
|
<div class="col-6 col-md-2">
|
|
<div class="d-flex align-items-center justify-content-between">
|
|
<button class="btn btn-sm btn-outline-success" onclick="decrement(${item.id}, ${i})">
|
|
<i class="fa fa-minus"></i>
|
|
</button>
|
|
<input type="text" class="form-control form-control-sm text-center mx-2 jumlah-input"
|
|
value="${p.jumlah}" readonly style="width: 70px;" id="jumlah-${item.id}-${i}">
|
|
<button class="btn btn-sm btn-outline-success" onclick="increment(${item.id}, ${i})">
|
|
<i class="fa fa-plus"></i>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Hapus -->
|
|
<div class="col-6 col-md-1 text-end">
|
|
${countDate > 1
|
|
? `<button class="btn btn-sm btn-danger" onclick="removeOrderDate(${item.id}, ${i}, ${countDate})">
|
|
<i class="fa fa-trash"></i>
|
|
</button>`
|
|
: ''}
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
`;
|
|
});
|
|
|
|
const itemHTML = `
|
|
<div class="card mb-3 shadow-sm position-relative">
|
|
<div class="d-flex flex-column flex-md-row">
|
|
<div class="p-2 d-flex justify-content-center align-items-center" style="flex: 0 0 300px;">
|
|
<img src="gambar/${item.foto || 'default.jpg'}" alt="${item.nama_menu}"
|
|
class="img-fluid rounded" style="max-height: 180px; width: 100%; object-fit: cover;">
|
|
</div>
|
|
|
|
<div class="flex-grow-1 position-relative">
|
|
<button type="button" class="btn btn-sm btn-outline-danger position-absolute top-0 end-0 m-2"
|
|
onclick="removeCartItem(${item.id})">
|
|
Hapus
|
|
</button>
|
|
|
|
<div class="card-body">
|
|
<h5 class="card-title">${item.nama_menu}</h5>
|
|
<div class="text-muted small mb-1">Rp ${parseInt(harga).toLocaleString('id-ID')}</div>
|
|
${item.deskripsi ? `<p class="card-text text-muted small mb-2">${item.deskripsi}</p>` : ''}
|
|
<div class="mb-2 small text-muted"><i class="fa fa-calendar-check me-1"></i>
|
|
${item.apakah_someday
|
|
? 'Tersedia setiap hari (Senin - Minggu)'
|
|
: (item.tgl_tersedia ? `Tersedia pada tanggal: ${item.tgl_tersedia}` : 'Tidak ada info tanggal tersedia')}
|
|
</div>
|
|
<div class="mb-2 small text-muted"><i class="fa fa-utensils me-1"></i>
|
|
Menu: <strong>${item.apakah_someday ? 'Someday' : 'Menu Normal'}</strong>
|
|
</div>
|
|
${item.kalori
|
|
? `<div class="mb-2 small text-muted"><i class="fa-solid fa-bolt me-1"></i> Kalori: <strong>${item.kalori} kkal</strong></div>`
|
|
: ''}
|
|
<div class="mb-2 small text-muted"><strong>Silakan isi tanggal pemesanan dan pilih karbohidrat yang diinginkan</strong></div>
|
|
${pesananHTML}
|
|
|
|
<div class="mt-3 d-flex justify-content-between align-items-center flex-wrap gap-2">
|
|
<button class="btn btn-sm btn-outline-success"
|
|
onclick="addOrderDate(${item.id}, ${item.apakah_menu_sore})">
|
|
+ Tambah Tanggal
|
|
</button>'
|
|
|
|
<div><strong>Total:</strong> <span class="text-success">Rp ${itemTotal.toLocaleString('id-ID')}</span></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
`;
|
|
|
|
container.insertAdjacentHTML('beforeend', itemHTML);
|
|
pesananList.forEach((p, i) => initFlatpickrTersedia(item, i));
|
|
});
|
|
|
|
container.insertAdjacentHTML('beforeend', `
|
|
<div class="text-end mt-4">
|
|
<hr>
|
|
<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 onKarbohidratChange(itemId, index){
|
|
let cart = JSON.parse(sessionStorage.getItem('cart') || '[]');
|
|
const input = document.querySelector(`div[data-item-id='${itemId}'][data-index='${index}'] .karbohidrat-input`);
|
|
cart.find(item => item.id === itemId).pesanan[index].karbohidrat_id = parseInt(input.value);
|
|
sessionStorage.setItem('cart', JSON.stringify(cart));
|
|
renderCartSummary();
|
|
}
|
|
|
|
function onKategoriChange(itemId, index, isToday) {
|
|
let cart = JSON.parse(sessionStorage.getItem('cart') || '[]');
|
|
const selectEl = document.querySelector(`.kategori-pemesanan-input[data-item-id='${itemId}'][data-index='${index}']`);
|
|
const kategori = selectEl.value;
|
|
let now = new Date();
|
|
let jam = now.getHours();
|
|
console.log(isToday);
|
|
|
|
if (kategori === "Makan Siang" && isToday && jam >= 10) {
|
|
batasLewat = true;
|
|
alert("Pemesanan Makan Siang hanya bisa dilakukan sebelum jam 10:00.");
|
|
} else if (kategori === "Makan Sore" && isToday && jam >= 15) {
|
|
batasLewat = true;
|
|
alert("Pemesanan Makan Sore hanya bisa dilakukan sebelum jam 13:00.");
|
|
}
|
|
|
|
if (batasLewat) {
|
|
// Kembalikan ke value sebelumnya
|
|
const previous = selectEl.dataset.previousValue || '';
|
|
selectEl.value = previous;
|
|
return;
|
|
}
|
|
|
|
const item = cart.find(item => item.id === itemId);
|
|
if (item && item.pesanan && item.pesanan[index]) {
|
|
item.pesanan[index].kategoriPemesanan = kategori;
|
|
sessionStorage.setItem('cart', JSON.stringify(cart));
|
|
renderCartSummary();
|
|
}
|
|
}
|
|
|
|
|
|
// =======================
|
|
// TAMBAH / HAPUS PESANAN
|
|
// =======================
|
|
function addOrderDate(itemId, sore) {
|
|
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: sore ? 'Makan Sore' : 'Makan Siang'
|
|
});
|
|
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 jenisKelamin = document.querySelector('input[name="jenis_kelamin"]:checked');
|
|
const namaPemesan = document.getElementById('nama_pemesan').value.trim();
|
|
const noWA = document.getElementById('no_whatsapp').value.trim();
|
|
const email = document.getElementById('email').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;
|
|
}
|
|
if (!email) {
|
|
alert('Silakan isi email terlebih dahulu.');
|
|
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();
|
|
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;
|
|
}
|
|
}else if(selected === "Masyarakat Umum"){
|
|
const alamat = document.getElementById('alamat').value;
|
|
if(!alamat){
|
|
alert('Silahkan lengkapi alamat')
|
|
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})`;
|
|
}else if(!pesanan.karbohidrat_id){
|
|
isValid = false;
|
|
errorMessage = `Karbohidrat belum diisi 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_public || 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.");
|
|
});
|
|
}
|
|
|
|
|
|
function initFlatpickrTersedia(item, i) {
|
|
const now = new Date();
|
|
const jamFlat = now.getHours();
|
|
const menitFlat = now.getMinutes();
|
|
const totalMenitFlatSekarang = jamFlat * 60 + menitFlat;
|
|
|
|
const menitBatasFlat = 13 * 60;
|
|
|
|
const lewatBatasNormal = totalMenitFlatSekarang >= menitBatasFlat;
|
|
|
|
// Ambil string tgl_tersedia dan ubah jadi array tanggal lengkap
|
|
const dayNumbers = (item.tgl_tersedia || "")
|
|
.split(',')
|
|
.map(s => s.trim())
|
|
.filter(s => s !== '' && !isNaN(s))
|
|
.map(s => parseInt(s));
|
|
|
|
|
|
|
|
// Generate tanggal dalam format YYYY-MM-DD untuk 3 bulan ke depan
|
|
let availableDates = [];
|
|
const bulanKeDepan = 3;
|
|
|
|
for (let bulanOffset = 0; bulanOffset < bulanKeDepan; bulanOffset++) {
|
|
const baseDate = new Date(now.getFullYear(), now.getMonth() + bulanOffset, 1);
|
|
const year = baseDate.getFullYear();
|
|
const month = String(baseDate.getMonth() + 1).padStart(2, '0');
|
|
|
|
dayNumbers.forEach(day => {
|
|
const dayStr = String(day).padStart(2, '0');
|
|
const fullDateStr = `${year}-${month}-${dayStr}`;
|
|
const fullDate = new Date(`${fullDateStr}T23:00:00`);
|
|
|
|
// Jika bukan menu someday, cek aturan H-1 dan jam batas
|
|
if (item.apakah_someday) {
|
|
availableDates.push(fullDateStr);
|
|
} else {
|
|
const selisihHari = Math.floor((fullDate - now) / (1000 * 60 * 60 * 24));
|
|
|
|
if (selisihHari >= 1 || (selisihHari === 1 && !lewatBatasNormal)) {
|
|
availableDates.push(fullDateStr);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
|
|
let minTanggal = 'today';
|
|
|
|
// Jika item adalah someday dan waktu sekarang sudah lewat 13:00
|
|
if (item?.apakah_someday && totalMenitFlatSekarang >= 13 * 60) {
|
|
const besok = new Date(now);
|
|
besok.setDate(now.getDate() + 1);
|
|
minTanggal = besok.toISOString().split("T")[0]; // format YYYY-MM-DD
|
|
}
|
|
|
|
|
|
|
|
if(!item.apakah_someday){
|
|
availableDates = availableDates.filter(dateStr => {
|
|
const dateObj = new Date(dateStr);
|
|
const selisihHari = Math.floor((dateObj - now) / (1000 * 60 * 60 * 24));
|
|
return selisihHari >= 1 || (selisihHari === 1 && !lewatBatasNormal);
|
|
});
|
|
}
|
|
|
|
flatpickr(`#tanggal-${item.id}-${i}`, {
|
|
dateFormat: "Y-m-d",
|
|
...(item?.apakah_someday ? { minDate: minTanggal,} : {enable : availableDates}),
|
|
defaultDate: item.pesanan[i]?.tgl || null,
|
|
onChange: function(selectedDates, dateStr) {
|
|
onTanggalChange(item.id, i, dateStr);
|
|
}
|
|
});
|
|
}
|
|
|
|
function increment(itemId, index) {
|
|
const input = document.getElementById(`jumlah-${itemId}-${index}`);
|
|
input.value = parseInt(input.value || "0") + 1;
|
|
onJumlahChange(itemId, index); // Tetap panggil function milikmu
|
|
}
|
|
|
|
function decrement(itemId, index) {
|
|
const input = document.getElementById(`jumlah-${itemId}-${index}`);
|
|
let current = parseInt(input.value || "0");
|
|
console.log(current);
|
|
|
|
if (current > 1) {
|
|
input.value = current - 1;
|
|
onJumlahChange(itemId, index);
|
|
}else{
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
function toggleBuktiPembayaran() {
|
|
const metode = document.getElementById("cara_pembayaran").value;
|
|
const buktiSection = document.getElementById("bukti_section");
|
|
const buktiInput = document.getElementById("bukti_pembayaran");
|
|
|
|
buktiInput.required = true;
|
|
if (metode === "billing") {
|
|
buktiSection.style.display = "none";
|
|
buktiInput.required = false;
|
|
} else {
|
|
buktiSection.style.display = "block";
|
|
buktiInput.required = true;
|
|
}
|
|
}
|
|
|
|
|
|
function validateTanggalPemesanan(item, tglDipilih) {
|
|
const now = new Date();
|
|
const jam = now.getHours();
|
|
const menit = now.getMinutes();
|
|
const totalMenit = jam * 60 + menit;
|
|
const batasWaktu = 13 * 60;
|
|
const tglSekarang = now.toISOString().split("T")[0];
|
|
|
|
if (item.apakah_someday && totalMenit >= batasWaktu && tglDipilih === tglSekarang) {
|
|
return {
|
|
valid: false,
|
|
message: `Maaf, Anda tidak bisa memilih hari ini (${tglDipilih}) untuk menu sameday karena sudah lewat jam 13:00`
|
|
};
|
|
}
|
|
|
|
return { valid: true };
|
|
}
|