App 13 – Lịch hẹn & cuộc họp ​

Hướng: Bổ sung vào calendar (dùng builder) · Đợt: Song song · Phụ thuộc: hrm (sự kiện nghỉ phép)
Quy ước chung, nguồn dữ liệu nhân viên và cách chạy builder: 00-tong-quan.md

Mục đích: nhân viên khai báo giờ rảnh, tạo loại cuộc hẹn (như Calendly), người khác đặt lịch vào khung trống; lên lịch họp nội bộ có lặp lại và nhắc hẹn. Nguồn: Event Scheduling, Availability, Appointments, Meetings. VENI đã có app calendar: nên đối chiếu trước khi xây.

Hướng: bổ sung vào calendar. Repo calendar hiện chỉ có khung giao diện, chưa có API trong repo. Xây phần còn lại trên khung đó; nghỉ phép và ngày lễ đọc từ hrm qua sự kiện.

Vai trò & quyền ​

Vai tròĐược làm
Nhân viênKhai giờ rảnh và loại cuộc hẹn của mình; đặt hẹn với người khác; tạo cuộc họp; chấp nhận/từ chối lời mời
Khách bên ngoài (không đăng nhập)Mở link đặt lịch công khai của một nhân viên, chọn khung trống, điền tên và email
Quản trịXem mọi lịch; cấu hình giờ làm mặc định của công ty

Dữ liệu ​

Thực thểTrườngGhi chú
Khung giờ rảnhnhân viên, thứ trong tuần, giờ bắt đầu, giờ kết thúc, đang dùngMặc định thứ Hai–thứ Sáu 9:00–17:00
Ngoại lệnhân viên, ngày, cả ngày (đúng/sai), từ giờ, đến giờ, kiểu (Bận, Rảnh thêm)Nghỉ phép và ngày lễ (App 2) cũng là Bận
Loại cuộc hẹnnhân viên, tên, thời lượng (phút), đệm trước (phút), đệm sau (phút), địa điểm hoặc link video, đang mở đặt, đường dẫn công khai
Cuộc hẹnloại cuộc hẹn, chủ (nhân viên), người đặt (nhân viên hoặc khách: tên + email), tiêu đề, bắt đầu, kết thúc, ghi chú, trạng thái (Đã đặt, Đã hủy, Đã diễn ra), lý do hủy
Cuộc họptiêu đề, loại (Standup, Sprint planning, Retro, 1-1, All hands, Họp khách hàng), chương trình, bắt đầu, kết thúc, địa điểm hoặc link, người tổ chức, quy tắc lặp (Hằng ngày, Hằng tuần, Hằng tháng, Không) kèm ngày kết thúc lặp, nhắc trước (5, 15, 30, 60 phút)
Người tham dựcuộc họp, nhân viên, phản hồi (Chưa trả lời, Tham gia, Từ chối, Có thể)

Quy tắc nghiệp vụ ​

  1. Chỉ đặt được cuộc hẹn trong khung giờ rảnh của chủ lịch, trừ ngoại lệ Bận, nghỉ phép và ngày lễ.
  2. Không trùng giờ: khoảng [bắt đầu − đệm trước, kết thúc + đệm sau] của cuộc hẹn mới không được chồng lên cuộc hẹn hoặc cuộc họp đã có của chủ lịch. Kiểm tra ở server, kể cả khi hai người đặt cùng lúc.
  3. Kết thúc = bắt đầu + thời lượng của loại cuộc hẹn; không đặt vào thời điểm đã qua.
  4. Loại cuộc hẹn không mở đặt thì link công khai không nhận đặt.
  5. Hủy phải ghi lý do; người đặt hoặc chủ lịch đều hủy được; khung giờ được trả lại.
  6. Cuộc họp lặp lại sinh các lần họp đến ngày kết thúc lặp; sửa hoặc hủy được một lần hoặc cả chuỗi.
  7. Gửi thông báo khi đặt, đổi, hủy và nhắc trước giờ hẹn theo cấu hình.
  8. Mỗi người chỉ xem chi tiết lịch của mình; lịch người khác chỉ hiện Bận/Rảnh.

Màn hình ​

Màn hìnhNội dung
Lịch của tôiLịch tuần/tháng gộp cuộc hẹn và cuộc họp
Giờ rảnhKhung giờ theo thứ, ngoại lệ theo ngày
Loại cuộc hẹnDanh sách, bật/tắt, sao chép link công khai
Trang đặt lịch công khaiChọn ngày → các khung trống → điền tên, email → xác nhận
Tạo cuộc họpChọn người tham dự, xem giờ rảnh chung, chọn lặp lại và nhắc hẹn
Lời mờiCuộc họp được mời, nút Tham gia / Từ chối / Có thể

Prompt cho builder – chia lượt ​

Dán từng lượt theo thứ tự, mỗi lượt là một tin nhắn. Duyệt kế hoạch trước khi builder chạy; chỉ sang lượt sau khi lượt trước đã kiểm tra xong trong bản xem trước.

Lượt 1 – Lõi: giờ rảnh, loại cuộc hẹn, đặt hẹn ​

text
Bổ sung vào app calendar hiện có (đang là khung giao diện): phần đặt lịch hẹn, có
phân quyền, lưu trong database.
Mọi dữ liệu tách theo tổ chức của người đăng nhập.
Nhân viên lấy từ sự kiện của app hrm (hrm:stream:employees), đơn nghỉ đã duyệt lấy
từ sự kiện hrm:stream:leave, lưu vào bảng chỉ đọc và coi là giờ bận; người đăng nhập
khớp với nhân viên qua mã user Shell.
Có dữ liệu mẫu cho bảng nhân viên (khoảng 10 người) để thử trong bản xem trước.
Dữ liệu: giờ rảnh theo thứ của từng nhân viên (mặc định thứ Hai–thứ Sáu 9:00–17:00),
ngoại lệ theo ngày (cả ngày hoặc từ giờ đến giờ, kiểu Bận hoặc Rảnh thêm), loại cuộc
hẹn (tên, thời lượng phút, đệm trước, đệm sau, địa điểm hoặc link video, đang mở
đặt, đường dẫn công khai), cuộc hẹn (loại, chủ lịch, người đặt là nhân viên hoặc
khách với tên và email, tiêu đề, bắt đầu, kết thúc, ghi chú, trạng thái Đã đặt/Đã
hủy/Đã diễn ra, lý do hủy).
Phân quyền: nhân viên quản lý giờ rảnh, loại cuộc hẹn và lịch của mình; lịch người
khác chỉ thấy bận/rảnh.
Quy tắc (kiểm tra ở API, kể cả khi hai người đặt cùng lúc): chỉ đặt trong giờ rảnh,
trừ ngoại lệ Bận và ngày nghỉ phép; kết thúc = bắt đầu + thời lượng; khoảng có tính
đệm không chồng lên cuộc hẹn khác của chủ lịch; không đặt vào quá khứ; hủy phải có
lý do và trả lại khung giờ.
Màn hình: lịch tuần của tôi, cài giờ rảnh và ngoại lệ, danh sách loại cuộc hẹn.

Lượt 2 – Trang đặt lịch công khai ​

text
Thêm trang đặt lịch công khai theo đường dẫn của loại cuộc hẹn, không cần đăng
nhập: chọn ngày, hiện các khung trống, điền tên và email, xác nhận. Loại cuộc hẹn
đang tắt thì không nhận đặt. Gửi thông báo khi đặt và hủy.

Lượt 3 – Cuộc họp ​

text
Thêm cuộc họp (tiêu đề, loại Standup/Sprint planning/Retro/1-1/All hands/Họp khách
hàng, chương trình, bắt đầu, kết thúc, địa điểm hoặc link, người tổ chức, lặp hằng
ngày/tuần/tháng đến ngày kết thúc, nhắc trước 5/15/30/60 phút) và người tham dự với
phản hồi Chưa trả lời/Tham gia/Từ chối/Có thể. Cuộc họp lặp sinh các lần họp; sửa
hoặc hủy được một lần hoặc cả chuỗi. Cuộc họp cũng là giờ bận khi đặt hẹn. Màn tạo
cuộc họp có xem giờ rảnh chung và màn lời mời họp.

Kiểm tra trước khi Publish ​

Đăng nhập lần lượt bằng từng vai trò trong bản xem trước:

  • [ ] Đặt hẹn chồng giờ (tính cả đệm) với cuộc hẹn khác bị từ chối ở API.
  • [ ] Không đặt được ngoài giờ rảnh hoặc vào ngày nghỉ phép.
  • [ ] Xem lịch người khác chỉ thấy bận/rảnh, không thấy tiêu đề.
  • [ ] Loại cuộc hẹn đã tắt thì link công khai không nhận đặt.
  • [ ] Checklist chung trong 00-tong-quan.md (mục Checklist chung trước khi Publish).