HostTài liệu cho lập trình viên

Kết nối đặt bàn vào website của quán

Ba mức, chọn theo website của quán. Đặt bàn từ mọi kênh đều về chung app Sunpa Host: lịch, sơ đồ bàn, chuông nhân viên, email xác nhận và chăm sóc khách tự chạy.

1 · Đường dẫn có sẵn

https://sunpa.vn/dat-ban/<quan>

2 · Gắn vào website bằng một dòng mã

Dán trước thẻ </body>. Hiện nút "Đặt bàn" nổi góc màn hình; bấm là mở khung đặt bàn ngay trên web.

<script src="https://sunpa.vn/nhung.js" data-quan="<quan>" data-mau="#14234d" async></script>

3 · Website tự dựng giao diện (API)

Quán vào Cài đặt › Kết nối website khai tên miền web (vd norai.vn, *.norai.vn, localhost:3000 khi đang làm). Trình duyệt ở các tên miền đó được phép gọi API (CORS). Gọi từ máy chủ của web (Next.js route, PHP…) thì không cần khai. Không cần khoá, không cần đăng nhập. Mọi phản hồi là JSON; lỗi trả { ok: false, error } — câu error viết sẵn tiếng Việt để hiện thẳng cho khách.

GET/api/p/<quan>

Thông tin quán + các ngày nhận đặt.

{ ok, restaurant: { name, city, address, phone, notice, online, guestPicksTable },
  days: [{ day: "2026-10-21", open: true }, …], maxParty: 10, hold: 90 }

online = false: quán đang tạm ngừng nhận đặt online — hiện notice và số điện thoại.

GET/api/p/<quan>?day=2026-10-21&party=4

Giờ còn bàn cho nhóm đó. Quán cho khách tự chọn bàn thì có thêm floorSlots (giờ còn bàn theo từng khu).

{ …, slots: [{ time: "18:00", ok: true }, { time: "18:15", ok: false }, …] }
GET/api/p/<quan>?day=2026-10-21&party=4&time=19:00

(Khi guestPicksTable) sơ đồ bàn tại giờ đó, toạ độ theo khung width × height của khu. ok = bàn khách được chọn.rot = góc xoay (độ, quanh tâm bàn); items = vật dụng để vẽ cho giống quán (khu vực, tường, quầy, cửa…), không đặt được.

{ …, floors: [{ id, name, width, height,
  items: [{ id, kind: "zone" | "wall" | "counter" | "door" | "window" | "stairs" | "plant" | "text", x, y, w, h, rot, label, tone }],
  tables: [{ id, name, seats, shape: "rect" | "round" | "booth", x, y, w, h, rot, bar, st, ok }] }] }
POST/api/p/<quan>

Đặt bàn. Xếp bàn tự động (hoặc đúng tableId khách chọn), gửi email xác nhận, báo chuông nhân viên.

fetch("https://sunpa.vn/api/p/<quan>", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    day: "2026-10-21", time: "19:00", party: 4,
    name: "Nguyễn Lan", phone: "0912345678",
    email: "lan@example.com",   // không bắt buộc — có thì khách nhận email xác nhận
    note: "Sinh nhật",          // không bắt buộc
    marketing: true,            // khách đồng ý nhận tin ưu đãi
    tableId: "…"                // chỉ khi khách tự chọn bàn
  })
}).then(r => r.json())
// → { ok: true, code: "K7Q2", token, day, time, party, name }

Giữ token để khách xem / huỷ đơn: trang có sẵn https://sunpa.vn/dat-ban/<quan>/don?t=<token>.

GET/api/p/<quan>/don?t=<token>

Xem đơn: { ok, restaurant, booking: { code, day, time, party, name, status, tables, canCancel } }

POST/api/p/<quan>/don

Khách tự huỷ: body { token }.

GET/api/p/<quan>/lich?t=<token>

Tệp lịch .ics — nút "Thêm vào lịch" cho khách.

Lưu ý