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ên | Khai 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ường | Ghi chú |
|---|---|---|
| Khung giờ rảnh | nhân viên, thứ trong tuần, giờ bắt đầu, giờ kết thúc, đang dùng | Mặ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ẹn | nhâ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ẹn | loạ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ọ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, 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ụ
- 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ễ.
- 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.
- 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.
- Loại cuộc hẹn không mở đặt thì link công khai không nhận đặt.
- 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.
- 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.
- Gửi thông báo khi đặt, đổi, hủy và nhắc trước giờ hẹn theo cấu hình.
- 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ình | Nội dung |
|---|---|
| Lịch của tôi | Lịch tuần/tháng gộp cuộc hẹn và cuộc họp |
| Giờ rảnh | Khung giờ theo thứ, ngoại lệ theo ngày |
| Loại cuộc hẹn | Danh sách, bật/tắt, sao chép link công khai |
| Trang đặt lịch công khai | Chọn ngày → các khung trống → điền tên, email → xác nhận |
| Tạo cuộc họp | Chọn người tham dự, xem giờ rảnh chung, chọn lặp lại và nhắc hẹn |
| Lời mời | Cuộ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
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
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
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).