progress order gizi
This commit is contained in:
parent
911d4fe68e
commit
28639db59a
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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'
|
||||
];
|
||||
}
|
||||
|
||||
@ -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'
|
||||
];
|
||||
}
|
||||
|
||||
@ -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
BIN
public/gambar/images.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.5 KiB |
7
public/gambar/success.svg
Normal file
7
public/gambar/success.svg
Normal 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 |
105
public/js/checkout/action.js
Normal file
105
public/js/checkout/action.js
Normal 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.");
|
||||
}
|
||||
})
|
||||
@ -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.");
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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() {
|
||||
|
||||
@ -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');
|
||||
|
||||
@ -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
|
||||
|
||||
104
resources/views/guest/checkout/step/step1.blade.php
Normal file
104
resources/views/guest/checkout/step/step1.blade.php
Normal 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>
|
||||
20
resources/views/guest/checkout/step/step2.blade.php
Normal file
20
resources/views/guest/checkout/step/step2.blade.php
Normal 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>
|
||||
80
resources/views/guest/checkout/step/step3.blade.php
Normal file
80
resources/views/guest/checkout/step/step3.blade.php
Normal 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>
|
||||
@ -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">
|
||||
|
||||
@ -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>
|
||||
|
||||
|
||||
|
||||
36
resources/views/guest/success_page.blade.php
Normal file
36
resources/views/guest/success_page.blade.php
Normal 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>
|
||||
@ -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']);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user