Spaces:
Running
Running
File size: 7,968 Bytes
4be0489 9163d00 1ba07e2 9163d00 731da74 9163d00 3406bb1 a699d0b 3406bb1 4be0489 a699d0b 4be0489 a699d0b 4be0489 a699d0b 3406bb1 a699d0b 3406bb1 a699d0b 4be0489 6a9cf26 3406bb1 6a9cf26 3406bb1 6a9cf26 3406bb1 9163d00 3406bb1 6a9cf26 3406bb1 6a9cf26 3406bb1 6a9cf26 3406bb1 a699d0b 4be0489 6a9cf26 a699d0b 6a9cf26 4be0489 3406bb1 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 | const scriptURL = "https://api.sheetbest.com/sheets/67a68e64-dca9-4eea-99b7-0431c5786cf6";
const menu = [
{
section: "เมนูข้าวต้ม",
items: [
{ name: "ข้าวต้มปลา (ปลาช่อน)", price: 59 },
{ name: "ข้าวต้มปลา (ปลากระพง)", price: 79 },
{ name: "ข้าวต้มปลาแห้ง (ปลาช่อน)", price: 59 },
{ name: "ข้าวต้มปลาแห้ง (ปลากระพง)", price: 79 },
{ name: "ข้าวต้มกุ้ง", price: 79 },
{ name: "ข้าวต้มปลาหมึก", price: 59 },
{ name: "ข้าวต้มทะเล", price: 99 }
]
},
{
section: "เมนูอาหารไทย",
items: [
{ name: "ผัดฉ่าปลา (ปลาช่อน)", price: 69 },
{ name: "ผัดฉ่าปลา (ปลากระพง)", price: 89 },
{ name: "ผัดขี้เมาปลา (ปลาช่อน)", price: 69 },
{ name: "ผัดขี้เมาปลา (ปลากระพง)", price: 89 },
{ name: "ต้มยำเนื้อปลา (ปลาช่อน)", price: 69 },
{ name: "ต้มยำเนื้อปลา (ปลากระพง)", price: 89 },
{ name: "ต้มยำหัวปลา", price: 89 },
{ name: "ต้มยำทะเล", price: 109 },
{ name: "ต้มยำกุ้ง", price: 99 },
{ name: "เกาเหลาปลา (ปลาช่อน)", price: 79 },
{ name: "เกาเหลาปลา (ปลากระพง)", price: 99 },
{ name: "เกาเหลาทะเล", price: 109 },
{ name: "ลวกจิ้มปลา (ปลาช่อน)", price: 79 },
{ name: "ลวกจิ้มปลา (ปลากระพง)", price: 99 },
{ name: "รวมทะเลลวกจิ้ม", price: 129 },
{ name: "ยำรวมทะเล", price: 109 },
{ name: "ยำแมงกะพรุน", price: 69 },
{ name: "แมงกะพรุนน้ำมันงา", price: 59 }
]
},
{
section: "ของทอด",
items: [
{ name: "แหนมกระดูกอ่อนหมู", price: 69 },
{ name: "ปีกไก่ทอด", price: 79 },
{ name: "คางกุ้งทอด", price: 59 },
{ name: "เฟรนซ์ฟรายส์", price: 59 },
{ name: "ไข่เจียว", price: 20 }
]
},
{
section: "เครื่องดื่ม/อื่นๆ",
items: [
{ name: "ข้าวสวย", price: 10 },
{ name: "น้ำเปล่า", price: 10 },
{ name: "น้ำอัดลม", price: 15 },
{ name: "น้ำอัดลม ขวดใหญ่", price: 40 },
{ name: "น้ำแข็ง", price: 25 },
{ name: "โซดา", price: 20 }
]
}
];
function renderMenuDropdown() {
const select = document.getElementById("add-menu");
let html = `<option value="">เลือกเมนู</option>`;
menu.forEach(section => {
section.items.forEach(item => {
html += `<option value="${item.name}">${item.name} (${item.price} ฿)</option>`;
});
});
select.innerHTML = html;
}
// ฟังก์ชันสำคัญ: เอาเฉพาะรายการ unpaid ล่าสุด (ที่ไม่มี deleted/paid ทับ) ต่อเมนู
function getLatestUnpaidOrders(data, tableNum) {
const rows = data.filter(i => String(i.table).trim() === String(tableNum));
// เก็บสถานะล่าสุดของแต่ละเมนู
const latest = {};
rows.forEach((row, idx) => {
latest[row.menu] = { ...row, idx }; // ทับของเก่า, แถวท้ายสุดจะถูกใช้
});
return Object.values(latest).filter(r => (r.status ?? "unpaid") === "unpaid");
}
// แสดงออเดอร์
async function loadOrder() {
const table = document.getElementById("table").value;
const res = await fetch(`${scriptURL}?table=${table}`);
const data = await res.json();
const orders = getLatestUnpaidOrders(data, table);
let html = "";
let sum = 0;
if (orders.length === 0) {
html = "<div style='color:#bbb'>ไม่มีออเดอร์ที่ยังไม่เช็กบิล</div>";
document.getElementById("checkout-btn").style.display = "none";
} else {
orders.forEach(item => {
const qty = Number(item.qty) || 1;
const price = Number(item.price) || 0;
html += `<div class="order-item">
<span>${item.menu} x${qty}</span>
<span>${price * qty} ฿</span>
<button onclick="removeOrder('${item.menu}')">ลบ</button>
</div>`;
sum += price * qty;
});
document.getElementById("checkout-btn").style.display = "inline-block";
}
document.getElementById("order-list").innerHTML = html;
document.getElementById("total").textContent = sum ? `รวมทั้งหมด ${sum} ฿` : "";
}
// เพิ่มออเดอร์ (POST status=unpaid)
async function addOrder() {
const table = document.getElementById("table").value;
const menuName = document.getElementById("add-menu").value;
const qty = parseInt(document.getElementById("add-qty").value, 10) || 1;
let price = 0;
menu.forEach(section => {
section.items.forEach(item => { if(item.name === menuName) price = item.price; });
});
if (!menuName || !qty) return alert("กรุณาเลือกเมนูและจำนวน");
const now = new Date().toISOString().split(".")[0] + "Z";
for (let i = 0; i < qty; i++) {
const order = {
table: table,
menu: menuName,
price: price,
qty: 1,
note: "[เพิ่มโดยแอดมิน]",
timestamp: now,
status: "unpaid"
};
await fetch(scriptURL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(order),
});
}
alert("เพิ่มรายการสำเร็จ");
loadOrder();
}
// ลบเมนู = POST status=deleted
async function removeOrder(menuName) {
const table = document.getElementById("table").value;
if (!confirm(`ต้องการลบเมนู "${menuName}" ออกจากโต๊ะ ${table} ?`)) return;
const now = new Date().toISOString().split(".")[0] + "Z";
const order = {
table: table,
menu: menuName,
price: 0,
qty: 1,
note: "[ลบโดยแอดมิน]",
timestamp: now,
status: "deleted"
};
await fetch(scriptURL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(order),
});
alert("ลบเมนูสำเร็จ");
loadOrder();
}
// เช็กบิล = POST status=paid สำหรับทุกเมนู unpaid ที่ยังไม่ถูกเช็กบิล/ลบ
async function checkout() {
const table = document.getElementById("table").value;
const res = await fetch(`${scriptURL}?table=${table}`);
const data = await res.json();
const unpaidOrders = getLatestUnpaidOrders(data, table);
const now = new Date().toISOString().split(".")[0] + "Z";
for (const order of unpaidOrders) {
const paidOrder = {
table: order.table,
menu: order.menu,
price: order.price,
qty: order.qty,
note: "[เช็กบิล]",
timestamp: now,
status: "paid"
};
await fetch(scriptURL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(paidOrder),
});
}
alert("เช็กบิลเรียบร้อย!");
loadOrder();
}
renderMenuDropdown();
loadOrder();
|