const steps = [ { step: 1, title: "Periksa Data Belanja" }, { step: 2, title: "Periksa Informasi Anda" }, { step: 3, title: "Pilih Metode Pembayaran" }, { step: 4, title: "Lakukan Pembayaran" }, ]; function getStep() { const params = new URLSearchParams(window.location.search); let step = parseInt(params.get("step")); if (!step || step < 1 || step > 4) step = 1; return step; } function goToStep(step) { if ( (localStorage.getItem("paymentMethod") || null) === null && step === 4 ) { alert("Pilih salah satu metode pembayaran!", false); return; } window.location.href = "payment.html?step=" + step; } function renderStepNav(currentStep) { let navHtml = `
`; steps.forEach((s) => { navHtml += ``; }); navHtml += `
Langkah ${s.step}
`; document.getElementById("step-nav").innerHTML = navHtml; } function renderStepButtons(currentStep) { let btnHtml = `
`; if (currentStep > 1) { btnHtml += ``; } if (currentStep === 2) { btnHtml += ``; } else if (currentStep < 4) { btnHtml += ``; } else { btnHtml += ``; } btnHtml += `
`; document.getElementById("step-buttons").innerHTML = btnHtml; } async function displayStep1Content() { document.getElementById("step-content").innerHTML = `

Langkah ${steps[0].step}: ${steps[0].title}

`; await loadCartSummary(); } var products = []; var totalPrice = 0; async function calculateTotalPrice() { products = await fetchProductsData(); try { const cart = await getCarts(); let cartCount = {}; cart.forEach((id) => { cartCount[id] = (cartCount[id] || 0) + 1; }); totalPrice = 0; for (let id in cartCount) { const product = products.find((p) => p.id === parseInt(id)); if (product) { totalPrice += product.price * cartCount[id]; } } } catch (err) { console.error("Error loading cart summary:", err); } return totalPrice; } async function getTotalPrice() { totalPrice = await calculateTotalPrice(); console.log("Total Harga:", totalPrice); return totalPrice; } async function loadCartSummary() { products = await fetchProductsData(); totalPrice = await getTotalPrice(); const cart = await getCarts(); let cartCount = {}; cart.forEach((id) => { cartCount[id] = (cartCount[id] || 0) + 1; }); let tableHtml = `
`; let index = 1; if (Object.keys(cartCount).length === 0) { tableHtml += ``; } else { for (let id in cartCount) { const product = products.find((p) => p.id === parseInt(id)); if (product) { const qty = cartCount[id]; const subtotal = product.price * qty; tableHtml += ``; } } tableHtml += ``; } tableHtml += `
No Nama Produk Harga Quantity Subtotal
Keranjang kosong.
${index++} ${product.name} ${formatRupiah(product.price)} ${qty} ${formatRupiah(subtotal)}
Total ${formatRupiah(totalPrice)}
`; document.getElementById("cart-summary-step").innerHTML = tableHtml; } async function displayStep2Content() { const userData = await getUserData(); document.getElementById("step-content").innerHTML = `

Langkah ${steps[1].step}: ${steps[1].title}

`; } async function saveInfoAndLanjut() { const name = document.getElementById("infoName").value.trim(); const email = document.getElementById("infoEmail").value.trim(); const phone = document.getElementById("infoPhone").value.trim(); const address = document.getElementById("infoAddress").value.trim(); const userData = await getUserData(); const transactions = userData.transactions ? userData.transactions : {}; const updatedUser = { uid: userData.uid, name: name, email: userData.email, phone: phone, address: address, photo_profile: userData.photo_profile, cart: userData.cart, transactions: transactions, }; if (!name || !email || !phone || !address) { alert("Semua input wajib diisi!", false); return; } localStorage.setItem("userData", JSON.stringify(updatedUser)); await updateUserDataToGitHub(updatedUser); goToStep(3); } function displayStep3Content() { const params = new URLSearchParams(window.location.search); const message = params.get("message") || ""; if (message.trim()) alert(message, false); document.getElementById("step-content").innerHTML = `

Langkah ${steps[2].step}: ${steps[2].title}



${message}

`; const infoChoose = document.getElementById("infoChoose"); document .querySelectorAll("#payment-method-buttons button") .forEach((btn) => { btn.addEventListener("click", function () { const method = this.getAttribute("data-method"); localStorage.setItem("paymentMethod", method); document .querySelectorAll("#payment-method-buttons button") .forEach((b) => { b.classList.remove("active"); }); this.classList.add("active"); infoChoose.innerText = "Anda memilih metode pembayaran: " + this.innerText; }); }); const savedMethod = localStorage.getItem("paymentMethod"); infoChoose.innerText = "Sebelum lanjut pilih metode pembayaran yang tersedia diatas"; if (savedMethod) { const btn = document.querySelector( `#payment-method-buttons button[data-method="${savedMethod}"]` ); if (btn) { btn.classList.add("active"); infoChoose.innerText = "Anda memilih metode pembayaran: " + btn.innerText; } } } async function loadBankList() { try { const url = "https://gist.githubusercontent.com/muhammadyana/6abf8480799637b4082359b509410018/raw/indonesia-bank.json"; const response = await fetch(url); if (!response.ok) { throw new Error("Gagal memuat data bank: " + response.status); } const banks = await response.json(); const bankSelect = document.getElementById("bankName"); bankSelect.innerHTML = ''; banks.forEach((bank) => { const option = document.createElement("option"); option.value = bank.code; option.text = bank.name; bankSelect.appendChild(option); }); } catch (error) { console.error("Error loadBankList:", error); } } async function displayStep4Content() { await getTotalPrice(); const method = localStorage.getItem("paymentMethod") || null; if (method === null) { window.location.href = "payment.html?step=3&message=Sebelum lanjut mohon pilih metode pembayaran terlebih dahulu!"; } let html = `

Langkah ${steps[3].step}: ${steps[3].title}

`; if (method === "qr") { html += `

Silakan scan QR Code berikut dengan aplikasi pembayaran Anda:

`; document.getElementById("step-content").innerHTML = html; generateQRCode(); } else if (method === "bank") { html += `
`; document.getElementById("step-content").innerHTML = html; await loadBankList(); } else { html += `
`; document.getElementById("step-content").innerHTML = html; } } async function processFinalPayment() { const method = localStorage.getItem("paymentMethod") || "card"; let valid = true; if (method === "bank") { valid = document.getElementById("bankName").value.trim() && document.getElementById("accountNumber").value.trim(); } else if (method === "card") { valid = document.getElementById("cardNumber").value.trim() && document.getElementById("expiry").value.trim() && document.getElementById("cvv").value.trim(); } if (!valid) { alert("Semua input wajib diisi!", false); return; } await alert( "Proses pembayaran...", true, true, 7, [ { timeOut: 3, message: "Pembayaran Berhasil!", }, ], 3 ); await clearCart(method); } async function clearCart(payment_method) { const userData = await getUserData(); const transactions = userData.transactions ? userData.transactions : {}; const updatedUser = { uid: userData.uid, name: userData.name, email: userData.email, phone: userData.phone, address: userData.address, photo_profile: userData.photo_profile, cart: [], transactions: transactions, }; console.log("clearCart", updatedUser); await saveTransaction(updatedUser, userData.cart, payment_method); updateCartIcon(); } async function saveTransaction(userData, productIDs, paymentMethod) { let now = new Date(); let transactionID = now.getFullYear() + "_" + String(now.getMonth() + 1).padStart(2, "0") + "_" + String(now.getDate()).padStart(2, "0") + "_" + String(now.getHours()).padStart(2, "0") + "_" + String(now.getMinutes()).padStart(2, "0") + "_" + String(now.getSeconds()).padStart(2, "0") + "_" + String(now.getMilliseconds()).padStart(3, "0"); const products = await fetchProductsData(); const transactions = userData.transactions; let productMap = {}; productIDs.forEach((id) => { if (products[id]) { if (productMap[id]) { productMap[id].total += 1; } else { productMap[id] = { ...products[id], total: 1 }; } } }); let theProducts = Object.values(productMap); transactions[transactionID] = { products: theProducts, payment_method: paymentMethod, user: { name: userData.name, email: userData.email, phone: userData.phone, address: userData.address, photo_profile: userData.photo_profile, }, }; userData.transactions = transactions; await updateUserDataToGitHub(userData); localStorage.setItem("userData", JSON.stringify(userData)); console.log("saveTransaction", userData); console.log("Transaksi berhasil disimpan dengan ID:", transactionID); window.location.href = `transaction.html?date=${transactionID}`; } function computeCRC(input) { let crc = 0xffff; for (let i = 0; i < input.length; i++) { crc ^= input.charCodeAt(i) << 8; for (let j = 0; j < 8; j++) { if (crc & 0x8000) { crc = ((crc << 1) ^ 0x1021) & 0xffff; } else { crc = (crc << 1) & 0xffff; } } } return crc.toString(16).toUpperCase().padStart(4, "0"); } function generateQRCode() { const qrContainer = document.getElementById("qr-code"); if (!qrContainer) return; qrContainer.innerHTML = ""; const payloadWithoutCRC = `00 02 01 01 0F ID.CO.QRIS000001 02 07 QRIS V2 03 02 12 04 03 360 05 06 ${totalPrice} 06 02 ID 07 0B BRI Virtual 08 07 Sidoarjo 63 04`; const payloadForCRC = payloadWithoutCRC + "0000"; const crcValue = computeCRC(payloadForCRC); const finalPayload = payloadWithoutCRC + crcValue; new QRCode(qrContainer, { text: finalPayload, width: 200, height: 200, }); } async function initPaymentSteps() { const step = getStep(); const cart = await getCarts(); if (cart.length === 0) window.location.href = `cart.html?message=${encodeURIComponent("Anda belum memesan produk apapun. Pergi ke halaman produk untuk berbelanja")}`; products = await fetchProductsData(); switch (step) { case 1: await displayStep1Content(); break; case 2: await displayStep2Content(); break; case 3: displayStep3Content(); break; case 4: await displayStep4Content(); break; default: displayStep1Content(); } renderStepNav(step); renderStepButtons(step); } document.addEventListener("DOMContentLoaded", function () { AOS.init(); initPaymentSteps(); });