Skip to content

PRD: Đặt bàn

ModuleBán hàngPRD IDPRD-RSV-001
Trạng tháiSẵn sàng devFEATRSV
EpicPlaneBANA-1560
Ngày2026-05-29Phiên bảnv1.0
Gói@nx/saleURDRSV
SurfaceSale · POS
Phụ tráchPhát Nguyễn

TL;DR

Giúp nhà hàng full-service nhận đặt bàn trước giờ phục vụ - khách, số khách, ngày/giờ, bàn/phòng - theo một vòng đời rõ ràng, và biến lượt đặt thành đơn hàng ngay khi check-in mà không cần nhập lại. Floor view và tình trạng zone luôn đồng bộ theo thời gian thực.

1. Context & Problem

Các nhà hàng F&B full-service nhận đặt bàn trước giờ phục vụ: host ghi lại khách, số khách, và ngày/giờ, rồi xếp chỗ cho nhóm khi họ đến. Luồng đơn hàng của BANA chưa có một thực thể đặt chỗ hạng nhất, nên một lượt đặt trong tương lai và đơn hàng sau đó của nó bị tách rời - host phải nhập lại đơn tại bàn, việc giữ chỗ trên một zone/unit là vô hình, và floor view không thể hiển thị bàn nào đang được đặt so với đã ngồi. Đây là điểm chặn cốt lõi với nhà hàng full-service, và khiến việc theo dõi hiệu suất bàn không thể thực hiện.

Tính năng bổ sung thực thể reservation riêng - vòng đời, metadata nguồn/dịp, và lượt giữ zone/unit (bàn/phòng) - kết nối lượt đặt với đơn hàng đang chạy ngay khi check-in.

2. Goals & Non-Goals

Goals

  • Một thực thể reservation ghi lại tên khách, số điện thoại, số khách, và ngày/giờ, scope theo merchant.
  • Một vòng đời đặt chỗ: tập trạng thái gồm PENDING → CONFIRMED → CHECKED_IN / CANCELLED, nhưng trong code hiện tại một reservation được tạo thẳng ở CONFIRMED (không có bước/endpoint xác nhận riêng, nên PENDING không phát sinh); vòng đời hiệu lực là CONFIRMED → CHECKED_IN / CANCELLED.
  • Gắn dịp (sinh nhật, kỷ niệm, công việc, v.v.) được ghi nhận. Một trường nguồn (điện thoại, khách vãng lai, online, khác) tồn tại trên model nhưng chưa được ghi nhận lúc tạo (không được nhận trong request tạo và mặc định là điện thoại), nên nguồn chưa được theo dõi về mặt chức năng.
  • Tự sinh và liên kết một sale order khi check-in, để lượt đặt trở thành đơn hàng đang chạy mà không phải nhập lại.
  • Giữ zone/unit (bàn/phòng) qua một bản ghi giữ bàn/phòng, với cập nhật theo thời gian thực tới floor view.

Non-Goals

  • Quản lý sơ đồ bàn / xếp chỗ - Planned, tách khỏi việc đặt chỗ.
  • Một ứng dụng màn hình bếp chuyên dụng.
  • Order template và theo dõi đơn giao hàng.

3. Success Metrics

MetricMục tiêu / tín hiệu
Loại bỏ nhập lại100% reservation đã check-in sinh và liên kết một sale order (không tạo đơn thủ công tại bàn)
Độ chính xác floorTình trạng zone/unit phản ánh các lượt giữ chỗ đang hiệu lực, không còn bản ghi cũ
Đồng bộ thời gian thựcCập nhật reservation và zone lan tới floor view theo thời gian thực trong phiên đang chạy
Tỉ lệ chuyển đổi đặt chỗTỉ lệ reservation đã CONFIRMED đạt tới CHECKED_IN tăng dần theo từng merchant

4. Personas & Use Cases

PersonaMục tiêu trong tính năng này
HostNhận và quản lý lượt đặt, giữ đúng bàn, check-in khách
CashierTiếp tục đơn hàng được sinh từ check-in mà không phải nhập lại
Manager / OwnerThấy việc giữ bàn và hoạt động đặt chỗ trên floor view

Kịch bản chính: một host tạo reservation cho khách (số khách, ngày/giờ, bàn) - được ghi nhận đã ở trạng thái CONFIRMED → khi khách đến thì check-in nhóm khách → một sale order được sinh ra và liên kết, lượt giữ bàn được ghi nhận, và floor view cập nhật trực tiếp.

5. User Stories

  • Là một host, tôi muốn tạo một reservation với tên khách, số điện thoại, số khách, và ngày/giờ, để lượt đặt được ghi nhận theo merchant.
  • Là một host, tôi muốn huỷ một lượt đặt, để vòng đời của nó phản ánh điều thực sự sẽ diễn ra. (Lượt đặt được tạo đã ở trạng thái confirmed; không có bước xác nhận riêng trong code hiện tại.)
  • Là một host, tôi muốn gắn dịp của một lượt đặt, để nhà hàng có thể chuẩn bị và báo cáo theo đó. (Gắn nguồn đã được mô hình hoá nhưng chưa được ghi nhận lúc tạo.)
  • Là một host, tôi muốn giữ một bàn/phòng cụ thể cho một lượt đặt, để floor view hiển thị nó là đã được đặt.
  • Là một host, tôi muốn check-in sinh và liên kết một sale order, để đơn của nhóm khách đã ngồi tiếp tục từ lượt đặt mà không phải nhập lại.
  • Là một manager, tôi muốn floor view và tình trạng zone cập nhật theo thời gian thực, để việc giữ chỗ và xếp chỗ luôn hiện hành.

6. Functional Requirements

#Yêu cầuURD ref
FR-1Tạo một reservation với tên khách, số điện thoại, số khách, và ngày/giờ, scope theo merchantURD-RSV-001
FR-2Vòng đời PENDING → CONFIRMED → CHECKED_IN / CANCELLED - một phần: reservation được tạo thẳng ở CONFIRMED (không có bước/endpoint xác nhận riêng; PENDING không phát sinh), nên vòng đời hiệu lực là CONFIRMED → CHECKED_IN / CANCELLEDURD-RSV-002
FR-3Theo dõi nguồn: điện thoại, khách vãng lai, online, khác - chỉ mức mô hình dữ liệu: trường tồn tại nhưng không được nhận lúc tạo (mặc định điện thoại), nên chưa được theo dõi về mặt chức năngURD-RSV-003
FR-4Gắn dịp: sinh nhật, kỷ niệm, công việc, v.v.URD-RSV-004
FR-5Khi check-in, sinh và liên kết một sale order tới reservationURD-RSV-005
FR-6Gắn bàn/phòng (zone/unit) qua một bản ghi giữ bàn/phòng; lọc theo bàn/phòng và zoneURD-RSV-001
FR-7Cập nhật theo thời gian thực cho bản ghi giữ bàn/phòng và zone để giữ floor view và tình trạng zone trực tiếpURD-RSV-002

Toàn văn requirement và tiêu chí nghiệm thu nằm ở Orders URD. PRD này tham chiếu chúng thay vì viết lại.

7. Non-Functional Requirements

Khía cạnhYêu cầu
Toàn vẹn dữ liệuMột reservation đã check-in và đơn hàng liên kết của nó được ghi cùng nhau; bản ghi giữ bàn/phòng được lưu lại để một lượt giữ chỗ không bao giờ bị mất
Tenancy & authzMọi thao tác giới hạn trong merchant của chính người dùng; các hành động reservation được gate bằng permission
Hiệu năng / quy môLiệt kê/lọc đơn hàng và reservation dùng truy vấn tối ưu; thời gian tạo được phơi ra để sắp xếp danh sách
Real-timeThay đổi bản ghi giữ bàn/phòng và zone phát cập nhật theo thời gian thực tới floor view trong phiên
i18nNhãn/trạng thái hiển thị cho người dùng là song ngữ (tiếng Anh & tiếng Việt)

8. UX & Flows

Các bề mặt front-of-house nằm trong POS front end (Reservation Sheet, màn hình chi tiết, tạo-từ-danh-sách, chỉnh ngày/giờ, listener cập nhật trực tiếp).

9. Data & Domain

EntityVai trò
ReservationLượt đặt - thông tin khách, số khách, ngày/giờ, dịp, status, đơn hàng liên kết tùy chọn (một trường nguồn tồn tại trên model nhưng chưa được ghi nhận lúc tạo)
Bản ghi giữ bàn/phòngBản ghi giữ zone/unit (bàn/phòng) được đặt cho reservation
OrderĐược sinh và liên kết khi check-in để lượt đặt trở thành đơn hàng đang chạy

Chỉ ở mức khái niệm - schema và bất biến đầy đủ nằm trong sale domain model.

10. Dependencies & Assumptions

Phụ thuộc vào

  • Sale Order (URD-ORD) - check-in sinh và liên kết một sale order.
  • Mô hình giữ zone/unit - việc giữ bàn/phòng dùng một bản ghi giữ bàn/phòng.
  • Lớp cập nhật thời gian thực - floor view và tình trạng zone được giữ trực tiếp qua cập nhật thời gian thực.

Giả định

  • Merchant định nghĩa zone/unit (bàn/phòng) mà một reservation có thể giữ.
  • Một host vận hành bề mặt front-of-house (POS front end).

11. Risks & Open Questions

Rủi ro / câu hỏiGiảm thiểu / trạng thái
Một lượt giữ chỗ có thể lệch khỏi lượt đặt khi lỗi một phầnBản ghi giữ bàn/phòng được lưu cùng reservation; check-in ghi lượt đặt + đơn hàng cùng nhau
Chưa có quản lý sơ đồ bàn / xếp chỗNgoài phạm vi đợt này; reservation giữ một zone/unit nhưng sơ đồ là Planned
Tình trạng zone cũ nếu một cập nhật thời gian thực bị bỏ lỡFloor view đối soát theo cập nhật bản ghi giữ bàn/phòng và zone; xem lại nếu phát hiện lệch
Huỷ sau khi đã giữ chỗVòng đời hỗ trợ CANCELLED; lượt giữ chỗ được giải phóng khi huỷ

12. Release Plan & Launch Criteria

Khía cạnhKế hoạch
PhaseP2 (mở rộng F&B) - xem Orders URD feature catalog
RolloutMọi merchant F&B; không feature flag
MigrationEntity mới; bản ghi giữ bàn/phòng được mở rộng cho binding zone/unit
Launch criteriaCreate → confirm → check-in được kiểm tra end-to-end; đơn hàng được sinh và liên kết; lượt giữ zone và cập nhật thời gian thực được kiểm tra trực tiếp
MonitoringSố lượng reservation mỗi merchant, tỉ lệ chuyển đổi check-in, tính nhất quán lượt giữ zone, phân phối cập nhật thời gian thực

13. FAQ

Check-in có tạo đơn tự động không? Có - check-in một reservation sẽ sinh và liên kết một sale order, để đơn của nhóm khách đã ngồi tiếp tục từ lượt đặt mà không phải nhập lại.

Một reservation có thể giữ một bàn hoặc phòng cụ thể không? Có - một reservation gắn một zone/unit qua một bản ghi giữ bàn/phòng; danh sách có thể lọc theo bàn/phòng và zone.

Điều gì xảy ra với lượt giữ bàn nếu một lượt đặt bị huỷ? Lượt giữ chỗ được giải phóng - trạng thái chuyển sang CANCELLED và zone/unit lại trống.

Tính năng này có bao gồm quản lý sơ đồ bàn kéo-thả không? Không - quản lý sơ đồ bàn / xếp chỗ là Planned và tách khỏi việc đặt chỗ; tính năng này giữ một zone/unit nhưng không quản lý sơ đồ floor.

Floor view luôn hiện hành bằng cách nào? Thay đổi bản ghi giữ bàn/phòng và zone phát cập nhật thời gian thực, giữ floor view và tình trạng zone trực tiếp trong phiên.

References

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.