📚 Mục lục sách

Ở bài trước, trang /dat-lich của Nuny Nail đã nhận được lịch hẹn: khách chọn dịch vụ, chọn thợ, chọn giờ trong giờ mở cửa và gửi đi, chủ tiệm thấy lịch ngay trong admin. Nhưng khách vẫn có thể chọn đúng giờ mà thợ đã có người đặt, và chủ tiệm phải gọi điện xin dời lịch.

Trong bài này, chúng ta sẽ cùng AI tính khung giờ còn trống cho từng thợ, dựa trên giờ mở cửa, thời gian làm của dịch vụ, ngày nghỉ và những lịch hẹn đã có, rồi hiển thị các giờ đó thành nút bấm trên trang /dat-lich để khách chỉ chọn được giờ thợ thật sự rảnh.

Phần 1. Chốt quy tắc tính giờ trống

Đừng để AI tự hiểu "giờ trống" là gì. Hãy nói rõ quy tắc của tiệm và để AI ghi lại trước khi viết code:

Prompt mẫu

"Hãy đọc docs/thiet-ke-du-lieu-dat-lich.md và dữ liệu thợ, giờ mở cửa, ngày nghỉ của Nuny Nail (dùng MCP Server, chỉ đọc). CHƯA viết code. Một khung giờ chỉ còn trống khi: Giờ bắt đầu từ giờ mở cửa, và giờ kết thúc (cộng tổng thời gian các dịch vụ khách chọn) không quá giờ đóng cửa của ngày đó. Thợ đi làm hôm đó: không trùng ngày nghỉ cố định, ngày nghỉ đột xuất, ngày tiệm nghỉ. Thợ làm được tất cả dịch vụ khách chọn. Không chồng lên lịch hẹn chờ xác nhận hoặc đã xác nhận của thợ. Lịch đã hủy, khách không đến thì không chiếm giờ. Giữa hai khách của cùng một thợ nghỉ 15 phút để dọn bàn. Khung giờ cách nhau 15 phút. Đặt cho hôm nay phải trước ít nhất 1 giờ, đặt trước tối đa 14 ngày. 'Thợ nào cũng được': khung giờ còn trống nếu có ít nhất một thợ phù hợp rảnh, khi đặt thì gán thợ rảnh có ít lịch nhất trong ngày. Mọi giờ tính theo giờ Việt Nam. Hãy ghi bộ quy tắc vào docs/quy-tac-gio-trong.md, mỗi quy tắc kèm một ví dụ của Nuny Nail, và liệt kê những điểm bạn chưa rõ."

AI ghi lại bộ quy tắc tính giờ trống vào docs/quy-tac-gio-trong.md
AI ghi lại bộ quy tắc tính giờ trống

Thay các con số bằng cách làm thật của tiệm bạn. Thời gian nghỉ giữa hai khách là điểm hay bị quên nhất: không có nó, thợ vừa xong khách này đã phải ngồi ngay vào khách khác.

Phần 2. Chuẩn bị ví dụ có sẵn đáp án

Nhìn code rất khó biết AI tính đúng hay sai, nhưng nếu có sẵn ví dụ đã tính đáp án thì chỉ cần so kết quả. Lấy một ngày thứ Bảy, tiệm mở 9:00 đến 20:00, đã có các lịch hẹn:

Thợ Giờ Dịch vụ Trạng thái
Mai 9:00 đến 10:30 Đắp bột Đã xác nhận
Mai 14:00 đến 15:15 Sơn gel tay và Vẽ móng Đã xác nhận
Chị Lan 10:00 đến 11:00 Nối móng úp Chờ xác nhận
Chị Lan 13:00 đến 13:45 Sơn gel tay Đã hủy

Đáp án đúng theo bộ quy tắc ở Phần 1:

# Khách chọn Giờ còn trống đúng
1 Đắp bột (90 phút), thợ Mai, thứ Bảy 10:45 đến 12:15 và 15:30 đến 18:30
2 Sơn gel tay (45 phút), chị Lan, thứ Bảy 9:00 và 11:15 đến 19:15 (có cả 13:00)
3 Đắp bột, thợ Thảo, thứ Bảy Không có, vì Thảo không làm đắp bột
4 Đắp bột, thợ nào cũng được, thứ Bảy 10:45 đến 18:30
5 Đắp bột, chị Lan, Chủ nhật chưa có lịch 9:00 đến 16:30
6 Sơn gel tay, chị Lan, thứ Hai Không có, vì là ngày nghỉ cố định

Ví dụ ở tình huống 1: Mai xong khách lúc 10:30, nghỉ 15 phút nên sớm nhất 10:45. Lịch sau bắt đầu 14:00, khách mới phải xong trước 13:45, nên đắp bột 90 phút bắt đầu muộn nhất 12:15. Buổi chiều Mai rảnh từ 15:30, và để xong trước 20:00 thì bắt đầu muộn nhất 18:30.

Cho AI tính tay trước khi viết code:

Prompt mẫu

"Đây là ngày làm việc mẫu và 6 tình huống kiểm tra: [dán hai bảng ở trên]. Theo docs/quy-tac-gio-trong.md, hãy tự tính giờ còn trống từng tình huống, trình bày cách tính. CHƯA viết code. So với cột đáp án, nếu khác thì chỉ ra bạn hiểu sai quy tắc nào. Lưu hai bảng vào docs/tinh-huong-kiem-tra-gio-trong.md."

AI tự tính giờ trống cho 6 tình huống kiểm tra trước khi viết code
AI tự tính giờ trống cho 6 tình huống kiểm tra

Nếu AI tính tay đã sai thì code viết ra cũng sẽ sai. Sửa cho thống nhất ở bước này nhanh hơn nhiều so với sửa code.

Phần 3. Tính giờ trống ở phía máy chủ

Tính giờ trống cần đọc lịch hẹn của mọi khách, trong đó có tên và số điện thoại. Vì vậy phải tính ở phía máy chủ, trang web chỉ nhận về danh sách giờ, không kèm thông tin của khách khác.

Prompt mẫu

"Dùng MCP Server và tài liệu EzyPlatform, hãy viết API tính giờ trống cho Nuny Nail theo docs/quy-tac-gio-trong.md: Nhận vào: mã dịch vụ (một hoặc nhiều), mã thợ hoặc 'bat-ky', ngày. Trả về: danh sách giờ còn trống và tên thợ nhận được ở từng giờ. Không trả về tên, số điện thoại của khách. Từ chối ngày đã qua hoặc quá 14 ngày, kèm thông báo dễ hiểu. Khi khách gửi lịch hẹn, máy chủ phải kiểm tra lại giờ đó còn trống không trước khi lưu, để hai khách không đặt trùng. Viết kiểm tra tự động cho 6 tình huống trong docs/tinh-huong-kiem-tra-gio-trong.md với đúng đáp án trong bảng. Yêu cầu: Trước khi làm, cho tôi biết sẽ viết ở đâu trong EzyPlatform và theo cách nào. Phần nào là suy đoán thì ghi rõ. Không đưa admin_access_token hay thông tin bí mật vào code giao diện. Sau khi xong, chạy kiểm tra tự động, báo kết quả từng tình huống, liệt kê các file đã thay đổi và dừng lại để tôi xem trước."

API tính giờ trống chạy kiểm tra tự động cho 6 tình huống
Chạy kiểm tra tự động cho 6 tình huống

Lưu ý: Nếu có tình huống chưa đúng, yêu cầu AI sửa code, không được sửa đáp án trong bảng để kiểm tra "qua". Đáp án là quy tắc của tiệm, chỉ bạn mới được quyết định đổi.

Phần 4. Hiển thị giờ trống trên trang /dat-lich

Bước 1: Đổi ô chọn giờ thành các nút giờ trống

Prompt mẫu

"Hãy sửa trang /dat-lich để dùng API giờ trống: Sau khi khách chọn dịch vụ và thợ, hiện dải 14 ngày tới dạng nút ngang (ví dụ 'T7 17/10'), ngày thợ nghỉ hiện mờ, không bấm được. Khách chọn ngày thì hiện các giờ còn trống dạng nút, chia Sáng, Chiều, Tối. Với 'thợ nào cũng được', chọn giờ xong thì ghi rõ thợ sẽ làm. Ngày không còn giờ trống thì hiện 'Ngày này đã kín lịch' và gợi ý ngày gần nhất còn trống. Nếu khách gửi đúng lúc giờ đó vừa có người đặt, báo 'Giờ này vừa có người đặt, mời bạn chọn giờ khác' và tải lại danh sách giờ. Giữ nguyên phần nhập thông tin và màn hình cảm ơn đã làm ở bài trước. Làm theo brand-guide.md, ưu tiên điện thoại. Yêu cầu: Không đưa admin_access_token hay thông tin bí mật vào code giao diện. Nếu chưa lấy được giờ trống, hiển thị thông báo thân thiện kèm số điện thoại, Zalo của tiệm. Sau khi xong, liệt kê các file đã thay đổi và dừng lại để tôi xem trước."

Trang /dat-lich hiển thị các giờ còn trống dạng nút bấm
Trang /dat-lich hiển thị giờ còn trống dạng nút bấm

Bước 2: Thử trên website như khách và chủ tiệm

Cách kiểm tra rõ nhất là đóng vai hai khách cùng đặt lịch trong một ngày cùng một thợ.

Khách thứ nhất đặt lịch

Mở /dat-lich?dich-vu=son-gel-tay, chọn thợ Mai, chọn Thứ Năm 15/10 và giờ 9:15, nhập tên, số điện thoại rồi bấm gửi. Trang cảm ơn sau khi khách thứ nhất đặt Sơn gel tay với Mai lúc 9:15 như ảnh bên dưới đây.

Trang cảm ơn sau khi khách thứ nhất đặt lịch với Mai lúc 9:15
Khách thứ nhất đặt lịch với Mai lúc 9:15

Khách thứ hai đặt lịch cùng ngày

Chọn Thứ Năm 15/10: giờ bắt đầu sớm nhất của Mai là 10:15. Khách thứ nhất đã giữ Mai từ 9:15 đến 10:00, cộng 15 phút nghỉ dọn bàn, nên những giờ trước 10:15 không còn hiện.

Khách thứ hai chỉ thấy giờ trống của Mai từ 10:15 trở đi
Khách thứ hai chỉ còn thấy giờ trống từ 10:15

Kết luận

Qua bài này, trang đặt lịch Nuny Nail đã chỉ cho khách chọn những giờ thợ thật sự rảnh: máy chủ tính giờ trống dựa trên giờ mở cửa từng ngày, tổng thời gian các dịch vụ, ngày nghỉ của thợ, thời gian nghỉ giữa hai khách và những lịch hẹn đang giữ chỗ, trang /dat-lich hiển thị các giờ đó thành nút bấm dễ chọn trên điện thoại, còn khi hai khách cùng bấm một giờ thì chỉ một người đặt được và thông tin của khách khác không bao giờ lộ ra trang web.

Cách làm quan trọng nhất vẫn là chốt quy tắc bằng lời, chuẩn bị ví dụ có sẵn đáp án, cho AI tính tay rồi mới viết code, và giữ nguyên đáp án khi kiểm tra thay vì để AI sửa cho "qua".

Ở bài tiếp theo, chúng ta sẽ hoàn thiện form đặt lịch nhiều bước trên điện thoại, cho khách gửi kèm ảnh mẫu móng muốn làm và có trang xác nhận lịch hẹn rõ ràng.

Chương trước: Thiết kế dữ liệu đặt lịch và tìm chức năng bằng MCP Server. ← Đọc Chương 4
Chương tiếp theo: Tạo form đặt lịch cho khách. Đọc Chương 6 →