Quản lý Công việc (Task)

Figma Design: Xem thiết kế trên Figma (UCALL-2026 Task & Subtask)


I. Tổng quan

Lưu ý: Các thuộc tính, quy tắc phân quyền và tính năng chung của đối tượng này được kế thừa từ tài liệu Objects (Đối tượng CRM).

Tính năng quản lý, phân công và theo dõi mọi hoạt động công việc (task / to-do list), danh sách công việc phụ (subtask / checklist) có liên kết chuẩn với các đối tượng trong hệ thống CRM.

1. Vấn đề

  • Nhân sự làm việc không có công cụ nhắc nhở, dễ bỏ sót lịch hẹn, nhiệm vụ quan trọng với khách hàng (Contact) hoặc cơ hội bán hàng (Deal).
  • Các team thiếu một bức tranh tổng thể về khối lượng công việc đang xử lý dẫn tới phân phối nguồn lực không đồng đều.
  • Một công việc trong thực tế thường gồm nhiều bước thực hiện, giai đoạn nhỏ hoặc phối hợp giữa nhiều thành viên (ví dụ: công việc “Tổ chức seminar hướng dẫn mn sử dụng MS” gồm: chuẩn bị slide, gửi email thư mời, đặt phòng họp, chuẩn bị handout). Thiếu checklist con khiến nhân viên dễ bỏ sót các khâu nhỏ; nếu tạo riêng từng task lớn cho từng bước thì làm tràn ngập và phân mảnh danh sách Task chính.

2. Giải pháp

  • Ra mắt module Task cho phép tạo công việc cá nhân hoặc giao việc cho đối tác/nhân viên, có đính kèm file, thiết lập ngày hết hạn, tùy chọn loại cảnh báo thông báo nhắc nhở đa nền tảng và ghim chặt (link) với các Object CRM cốt lõi (Liên hệ, Công ty, Cơ hội, Đơn hàng).
  • Tích hợp tính năng Công việc phụ (Subtask / Checklist) ngay trong Drawer xem nhanh chi tiết Task:
    • Cho phép thêm nhiều công việc phụ cho mỗi task cha, gồm: Tên công việc phụ và Người phụ trách.
    • Tự động autofill người phụ trách công việc phụ bằng Nhân viên phụ trách của Task cha để tiết kiệm thao tác nhập liệu.
    • Hiển thị chỉ số tiến độ trực quan dạng x/y (ví dụ: 1/3), phản ánh chính xác số công việc phụ đã hoàn thành trên tổng số công việc phụ hiện có.
    • Đảm bảo nguyên tắc độc lập trạng thái: Hoàn thành toàn bộ công việc phụ (3/3) tuyệt đối không tự động hoàn thành Task cha.

3. Đối tượng

  • Sales/CSKH: Tự lập lịch nhắc việc bản thân, chia nhỏ các bước thực hiện trong quy trình chăm sóc khách hàng.
  • Manager/Admin: Giao task, tạo deadline, theo dõi tiến độ chi tiết qua tỷ lệ checklist (1/3, 2/3, 3/3), monitor hiệu suất xử lý công việc của đội ngũ.
  • Nhân viên hỗ trợ (Support/Collaborator): Nhận các công việc phụ được giao riêng trong task lớn và cập nhật kết quả.

4. Tầm nhìn/insight

  • Tương lai tính năng Task sẽ được tự động hóa từ các luồng Automation (Ví dụ: Khách nhắn tin sau 24h chưa phản hồi -> Auto sinh Task gọi lại). Cần thiết kế cấu trúc DB linh hoạt, cho phép extend thêm các nguồn trigger sinh Task tự động.
  • Mở rộng hỗ trợ Mẫu công việc phụ (Checklist Template) theo loại công việc, cho phép convert công việc phụ thành Task độc lập khi khối lượng phát sinh lớn, và tích hợp điều kiện hoàn thành subtask vào AdaFlow Trigger.

II. Yêu cầu chức năng

1. Danh sách tính năng

  • Tạo mới Task: Giao diện Modal popup khởi tạo nhanh đầy đủ thông tin.
  • Bảng danh sách Task (Data Grid): Xem bảng phân trang, tùy biến cột, Custom Views (View 1, View 2, View 3…), bộ lọc (Nhân viên, Hạn hoàn thành, Trạng thái, Độ ưu tiên) và tìm kiếm text.
  • Hiển thị tiến độ Subtask ngoài danh sách: Biểu tượng phân nhánh kèm badge x/y (ví dụ 1/3) cạnh tên task và tooltip popover tóm tắt danh sách subtask.
  • Xem nhanh chi tiết Task (Quick View Drawer): Sửa tiêu đề, cập nhật thông tin nhanh, khối Liên kết đa đối tượng CRM, timeline Ghi chú nội bộ.
  • Quản lý Công việc phụ (Subtask / Checklist):
    • Thêm mới subtask (Tên + Người phụ trách).
    • Tự động autofill người phụ trách subtask từ nhân viên phụ trách task cha.
    • Bộ đếm tiến độ x/y (ví dụ: 1/3, 2/3, 3/3).
    • Đánh dấu hoàn thành / Hủy hoàn thành (Checkbox toggle, hiệu ứng gạch ngang text).
    • Chỉnh sửa tên inline và thay đổi người phụ trách subtask.
    • Xóa subtask và tự động tính toán lại tiến độ.
    • Độc lập trạng thái giữa Subtask và Task cha (Kèm cảnh báo khi hoàn thành task cha lúc subtask còn dang dở).
  • Tích hợp Lịch sử Task vào màn hình Chi Tiết CRM Entity: Phân cụm [Sắp tới] và [Quá khứ] (nhóm theo tháng).

2. Đặc tả chi tiết (Use Cases)

User Story 1: Tạo mới Task

Là một nhân sự, tôi muốn có thể tạo một công việc mới nhanh chóng trên hệ thống kèm thiết lập nhắc nhở để tránh quên.

  • Use case 1.1 (Tạo thành công):
    • Tại màn hình bất kỳ, chọn “Thêm mới task”. Hệ thống hiển thị Modal form.
    • Điền các trường bắt buộc (Tên công việc).
    • Cấu hình Thời gian hết hạn, và tuỳ chọn “Thông báo trước X phút”.
    • Click Thêm công việc -> Hệ thống lưu record vào DB, hiện popup thông báo thành công và reload lại danh sách hiện tại.

User Story 2: Bộ lọc và Hiển thị danh sách Task

Là người dùng, tôi muốn xem lại tất cả các Task của mình (hoặc nhân viên dưới quyền) để check trạng thái hoàn thành.

  • Use case 2.1 (Bộ lọc và Hiển thị):
    • Click vào Menu bên trái icon “Task”. Bảng Danh sách Task xuất hiện.
    • Mặc định tải theo View hiện tại. Người dùng có thể click chuyển qua các View 1, View 2, View 3 (lưu preset filter).
    • Có thể filter nhanh theo: Nhân viên, Ngày hết hạn, Trạng thái, Độ ưu tiên. Có thanh Input search text.
    • Bảng hiển thị các cột cơ bản được pagination (vd: 50 dòng/page).
    • Những task có subtask hiển thị badge tỷ lệ x/y (ví dụ 1/3) cạnh tên task.

User Story 3: Lịch sử Task trong Context CRM Detail

Là một Sales đang theo sát khách hàng, tôi muốn vào trong chi tiết khách hàng và xem được dọc theo timeline các công việc gì tôi chưa làm, công việc gì đã lỡ bỏ trôi.

  • Use case 3.1 (Lịch sử Task):
    • Tại màn Xem chi tiết Liên hệ. Tab “Lịch sử tương tác”.
    • Hệ thống load ra các Card ghi chú Task (có hiển thị Nhãn, Nguồn, Trạng thái check/uncheck, Assignee).
    • Render hai bộ nhóm thời gian riêng biệt: “Sắp tới” và “Quá khứ” (Chia nhỏ theo tháng) giúp Sales dễ quét mắt và định vị tính khẩn cấp của việc cần xử lý.

User Story 4: Quản lý Công việc phụ (Subtask / Checklist)

Là người thực hiện công việc, tôi muốn chia nhỏ task thành các đầu việc phụ có gán người phụ trách và theo dõi tiến độ hoàn thành chi tiết.

UC-4.1: Thêm mới công việc phụ (Autofill người phụ trách)

  • Tiền điều kiện: Mở Drawer chi tiết Task.
  • Luồng chính:
    1. User click vào nút hoặc dòng Thêm công việc phụ (icon phân nhánh).
    2. Hệ thống hiển thị dòng nhập subtask mới:
      • Ô nhập text: Tên công việc phụ (focus con trỏ chuột sẵn).
      • Chọn người phụ trách: Đã được autofill sẵn bằng Nhân viên phụ trách task cha (task.assignee).
    3. User nhập tên công việc phụ (ví dụ: “Soạn nội dung slide seminar”).
    4. (Tùy chọn) User click vào tên/avatar người phụ trách để chọn nhân viên khác trong workspace nếu muốn giao cho người khác.
    5. User nhấn Enter hoặc click biểu tượng Xác nhận.
    6. Hệ thống tạo thành công subtask:
      • Checkbox chưa hoàn thành, tên subtask hiển thị rõ ràng.
      • Cập nhật bộ đếm tiến độ phía trên (ví dụ từ 0/2 thành 0/3, hoặc khởi tạo 0/1).
      • Tiếp tục hiển thị dòng trống để nhập tiếp subtask kế tiếp (Quick add).
  • Luồng ngoại lệ:
    • Nếu tên để trống: Tooltip báo “Vui lòng nhập tên công việc phụ”, không tạo record.
    • Nếu task cha chưa có người phụ trách: Trường người phụ trách subtask autofill bằng Người đang thực hiện thao tác (Current User).

UC-4.2: Đánh dấu hoàn thành / Hủy hoàn thành subtask

  • Luồng chính:
    1. User click vào Checkbox trước tên subtask chưa hoàn thành.
    2. Hệ thống cập nhật tức thì (Optimistic UI):
      • Checkbox tích xanh, tên subtask gạch ngang (line-through) và chuyển xám nhạt.
      • Bộ đếm tiến độ tăng tử số thêm 1 (ví dụ: từ 1/3 -> 2/3).
    3. Gửi API cập nhật is_completed = true, ghi log vào Tab Hoạt động.
  • Luồng hủy hoàn thành (Uncheck):
    1. Click vào Checkbox đã tick -> Bỏ tích, tên subtask trở lại bình thường.
    2. Bộ đếm tiến độ giảm tử số đi 1 (ví dụ: từ 2/3 -> 1/3).

UC-4.3: Chỉnh sửa tên và Phân công lại subtask

  • Sửa tên: Double-click vào tên subtask -> Nhập tên mới -> Nhấn Enter hoặc click ra ngoài để lưu.
  • Đổi người phụ trách: Click vào avatar/tên người phụ trách hiện tại -> Chọn nhân viên mới từ dropdown list -> Hệ thống lưu và gửi thông báo chuông cho nhân viên mới.

UC-4.4: Xóa công việc phụ

  • Luồng chính:
    1. Hover vào dòng subtask, click icon Thùng rác (Xóa).
    2. Popconfirm xác nhận: “Bạn có chắc chắn muốn xóa công việc phụ này?”.
    3. Chọn Đồng ý: Subtask bị xóa, bộ đếm tiến độ giảm mẫu số đi 1 (ví dụ 2/3 xóa 1 subtask chưa xong -> 2/2; xóa 1 subtask đã xong -> 1/2). Nếu xóa hết subtask, hiển thị lại nút ban đầu + Thêm công việc phụ.

UC-4.5: Xử lý trạng thái độc lập giữa Subtask và Task cha

  • Kịch bản A (Hoàn thành tất cả subtask 3/3):
    • Khi hoàn thành subtask cuối cùng, bộ đếm đạt 3/3, badge chuyển xanh lá.
    • Trạng thái Task cha VẪN GIỮ NGUYÊN (ví dụ vẫn là “Đang làm”).
    • Nút [Hoàn thành] trên header Task cha KHÔNG bị tự động trigger.
    • Người phụ trách task cha phải tự mình đánh giá tổng thể và chủ động bấm [Hoàn thành] khi nghiệm thu xong.
  • Kịch bản B (Bấm Hoàn thành Task cha khi còn subtask chưa xong x < y):
    • Khi tiến độ đang là 1/3 mà user click nút [Hoàn thành] trên Header hoặc chọn Trạng thái = “Hoàn thành”.
    • Hệ thống bật Modal cảnh báo:
      • Tiêu đề: “Xác nhận hoàn thành công việc”
      • Nội dung: “Công việc này vẫn còn 2 công việc phụ chưa hoàn thành (1/3). Bạn có chắc chắn muốn hoàn thành toàn bộ công việc không?”
      • Xác nhận hoàn thành: Đổi trạng thái Task cha sang “Hoàn thành”, các subtask giữ nguyên 1/3.
      • Hủy bỏ: Giữ nguyên Task cha để tiếp tục xử lý các subtask còn dang dở.
  • Kịch bản C (Bấm Hoàn thành Task cha khi tất cả subtask đã xong 3/3):
    • Không hiển thị modal cảnh báo tồn đọng, chuyển Task cha sang “Hoàn thành” ngay lập tức.

3. Danh sách nghiệp vụ (Logic & Validation Rules)

  • Rule 1: Các trường thông tin Khởi tạo Task
    • Tên công việc (Text): Không được bỏ trống, tối đa 255 ký tự.
    • Nhân viên phụ trách (User): Mặc định là Người đang tạo task (Current User).
    • Thời gian hết hạn (Date time):
      • Không thể nhỏ hơn hoặc bằng thời điểm quá khứ tại lúc tạo form (Trừ trường hợp cho phép log backdate).
      • Logic mặc định: Lấy Thời gian hiện tại + 60 phút, làm tròn đơn vị phần nghìn.
    • Thông báo (Single option dropdown): Tại thời điểm đến hạn (8:30 AM), Trước 10 phút, Trước 1 ngày, Trước 2 ngày, Trước 1 tuần.
    • Độ ưu tiên (Single option): Cao (Màu đỏ), Trung bình (Màu vàng cam), Thấp (Màu xanh).
    • File đính kèm (File input): Upload giới hạn size theo server storage config.
    • Mô tả (Rich text): Hỗ trợ đính bullet point, bold/italic.
    • Nhân viên hỗ trợ (Multi-users): Select-box nhiều options.
  • Rule 2: Khối Liên Kết (Link Objects) trong màn Xem Nhanh
    • Một task có thể liên kết (Link) tới Nhiều đối tượng (multi-objects) (Liên hệ, Công ty, Đơn hàng, Cơ hội, Phiếu ghi, Meeting).
    • Giao diện: Mặc định hiển thị n đối tượng có sẵn, bấm + Thêm hiển thị dropdown list phân cụm theo Object (Liên hệ / Công ty…). Khi gõ tìm kiếm, list data được render theo paging scroll dưới dropdown.
    • Logic đếm số Liên kết: Nếu có 1 liên hệ + 3 đơn hàng thì Label hiển thị Liên kết (2) (tổng nhóm Data Source là 2).
    • UI Ẩn n-link: Vượt quá giới hạn khung chứa, hiển thị list icon user + text đại diện cho Object đầu tiên, kèm icon +n (VD: U Dương Thu Hoài Ngọc + 3). Hover vào +3 bật Tooltip liệt kê toàn bộ item bị giấu. Bấm x pop-confirm xác nhận gỡ liên kết.
  • Rule 3: Ghi chú trong màn Xem Nhanh
    • Editor note ghim ngang dưới đáy. Khung Header (Title task) fix cứng ở trên.
    • Logic render note: Render Ngược (Theo thời gian).
    • Pagination ghi chú: Load mặc định 10 record gần nhất lúc init. Ghi chú mới gửi bay xuống cuối. Bấm text Xem thêm nằm trên đỉnh để fetch 10 record cũ hơn.
  • Rule 4: Hiển thị Lịch sử nhóm ở Context Detail
    • Cụm [Sắp tới]: Bất kỳ Task nào có deadline >= ngày hiện tại.
    • Cụm [Quá khứ]: Bất kỳ Task nào có deadline < ngày hiện tại HOẶC Task bị hủy. Cụm Quá khứ phải được Group/Group-by theo Tháng.
    • Cập nhật Hot-update: Nếu Edit đổi ngày sang tương lai, card Task tự động văng bay sang bucket [Sắp tới] và ngược lại.
  • Rule 5: Công việc phụ (Subtask / Checklist)
    • 5.1. Thuộc tính Subtask:
      • title (Tên subtask): Bắt buộc, 1 - 255 ký tự, không toàn khoảng trắng.
      • assignee_id (Người phụ trách): Bắt buộc, trỏ tới một active user trong workspace.
      • is_completed (Trạng thái hoàn thành): Boolean, mặc định false.
      • completed_at: Datetime ghi nhận thời điểm hoàn thành.
      • completed_by: User ID người thực hiện tích hoàn thành.
      • sort_order: Số nguyên tự tăng quản lý thứ tự hiển thị.
    • 5.2. Cơ chế Autofill Người phụ trách:
      • Khi bấm thêm mới subtask:
        • Nếu Task cha đã có người phụ trách (task.assignee_id != null) -> Autofill subtask.assignee_id = task.assignee_id.
        • Nếu Task cha chưa có người phụ trách (task.assignee_id == null) -> Autofill subtask.assignee_id = current_user_id.
      • Người dùng có thể click chọn lại nhân viên khác trong workspace trước hoặc sau khi lưu.
      • Việc thay đổi người phụ trách của Task cha sau này không tự động đổi người phụ trách các subtask đã tạo trước đó.
    • 5.3. Bộ đếm tiến độ x/y (Ví dụ 1/3):
      • x (Tử số): Số subtask có is_completed = true (chưa xóa).
      • y (Mẫu số): Tổng số subtask (chưa xóa) của task cha.
      • Định dạng hiển thị: Badge x/y (ví dụ 0/3, 1/3, 2/3, 3/3).
      • Màu sắc Badge: Xám khi x == 0, Xanh dương (#1677FF) khi 0 < x < y, Xanh lá cây (#52C41A) khi x == y (đã hoàn thành tất cả).
      • Khi task chưa có subtask (y == 0): Không hiển thị badge 0/0, chỉ hiển thị nút Thêm công việc phụ.
    • 5.4. Độc lập tuyệt đối về trạng thái:
      • Hoàn thành tất cả subtask (3/3) tuyệt đối KHÔNG làm Task cha chuyển sang Hoàn thành.
      • Task cha chỉ chuyển trạng thái khi người dùng chủ động thao tác nút [Hoàn thành] trên Header hoặc Dropdown trạng thái.
    • 5.5. Cảnh báo khi hoàn thành Task cha lúc subtask chưa xong:
      • Nếu task cha còn subtask chưa tick (x < y) mà user bấm [Hoàn thành] task cha, hệ thống bắt buộc hiển thị Modal cảnh báo xác nhận.
    • 5.6. Phân quyền:
      • Xem subtask: Ai có quyền xem task cha đều xem được subtask.
      • Thêm / Sửa / Xóa: Người tạo task cha, Người phụ trách task cha, Người phụ trách chính subtask đó, Admin/Manager.
      • Đánh dấu hoàn thành: Người phụ trách subtask, Người phụ trách task cha, Admin/Manager.
    • 5.7. Giới hạn: Tối đa 50 subtask/task.
    • 5.8. Lịch sử & Thông báo:
      • Tab “Hoạt động” ghi nhận chi tiết: tạo, tick hoàn thành, bỏ tick, đổi người phụ trách, xóa subtask.
      • Bắn thông báo chuông/in-app cho nhân viên khi được phân công subtask.

4. Giao diện (UI / UX)

  • Figma Design: UCALL-2026 - Task & Subtask Design
  • Vị trí hiển thị trong Drawer xem nhanh chi tiết Task:
    • Nằm phía dưới “Không có người duyệt” / “Nhân viên hỗ trợ” và nằm ngay phía trên nhóm trường tùy chỉnh (Custom Fields).
    • Trạng thái chưa có subtask: Hiển thị text link icon phân nhánh: [Icon Phân nhánh] Thêm công việc phụ (màu #1677FF).
    • Trạng thái đã có subtask:
      • Header khối: [Icon Phân nhánh] Công việc phụ [ 1/3 ] (badge bo góc tròn, màu xanh dương khi đang làm, xanh lá khi xong hết).
      • Danh sách dòng: Checkbox + Tên công việc phụ (gạch ngang khi done) + Avatar/Tên người phụ trách (dropdown select) + Icon thùng rác khi hover.
      • Cuối danh sách: Dòng nhập nhanh + Thêm công việc phụ (nhấn Enter để tạo liên tục).
  • Hiển thị ngoài Data Grid danh sách Task:
    • Cột “Tên công việc” có thêm icon phân nhánh kèm text 1/3 bên cạnh tên công việc.
    • Hover vào badge 1/3 hiển thị popover tóm tắt danh sách subtask và trạng thái hoàn thành.

III. Yêu cầu phi chức năng

  • Hiệu năng & Virtual Scrolling: Khối render ghi chú ở Quick View tích hợp Infinite Reverse Load (Virtual Scrolling) tránh lag thiết bị. Subtasks load đồng thời hoặc lazy-load < 200ms.
  • Optimistic UI: Thao tác tick checkbox subtask cập nhật giao diện ngay lập tức trước khi API phản hồi.
  • Realtime Sync: Đồng bộ tức thời qua WebSocket khi có nhiều người cùng xem 1 task và có subtask được hoàn thành.
  • Tính toàn vẹn dữ liệu: Khi xóa task cha, các subtask liên quan tự động soft-delete theo (Cascading Soft Delete).

IV. Dependency (Liên quan & phụ thuộc)

  • Notification Service: Bắn thông báo chuông/push nhắc hẹn trước X phút và thông báo khi được giao subtask.
  • User & Role Management: Cung cấp danh sách nhân viên workspace phục vụ autofill và phân quyền subtask.
  • Activity Log Service: Ghi nhận mọi thay đổi task và subtask vào timeline Hoạt động.
  • Global Search: Task và subtask được index vào Redis/ElasticSearch để tìm kiếm xuyên suốt hệ thống.

V. API Contract (Dev viết)

1. Database Schema cho Subtask (crm_task_subtasks)

CREATE TABLE crm_task_subtasks (
    id VARCHAR(36) PRIMARY KEY,
    workspace_id VARCHAR(36) NOT NULL,
    task_id VARCHAR(36) NOT NULL,
    title VARCHAR(255) NOT NULL,
    assignee_id VARCHAR(36) NOT NULL,
    is_completed BOOLEAN NOT NULL DEFAULT FALSE,
    completed_at TIMESTAMP NULL DEFAULT NULL,
    completed_by VARCHAR(36) NULL DEFAULT NULL,
    sort_order INT NOT NULL DEFAULT 0,
    created_by VARCHAR(36) NOT NULL,
    updated_by VARCHAR(36) NOT NULL,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    deleted_at TIMESTAMP NULL DEFAULT NULL,
    INDEX idx_task_subtasks_task (task_id, deleted_at),
    INDEX idx_task_subtasks_assignee (assignee_id),
    FOREIGN KEY (task_id) REFERENCES crm_tasks(id) ON DELETE CASCADE
);

2. Endpoints Subtask

API 1: Lấy danh sách subtask của Task

  • Method & Endpoint: GET /api/v1/crm/tasks/{task_id}/subtasks
  • Response 200:
    {
      "code": 200,
      "data": {
        "summary": {
          "total": 3,
          "completed": 1,
          "progress_text": "1/3",
          "percent": 33.33
        },
        "subtasks": [
          {
            "id": "subtask-1",
            "title": "Chuẩn bị slide trình chiếu seminar",
            "assignee": {
              "id": "user-1",
              "name": "Nhân viên 1",
              "avatar_url": "https://cdn.ucall.vn/avatars/user1.png"
            },
            "is_completed": true,
            "completed_at": "2024-03-22T10:15:30Z",
            "sort_order": 1
          },
          {
            "id": "subtask-2",
            "title": "Gửi email thư mời và form đăng ký",
            "assignee": {
              "id": "user-1",
              "name": "Nhân viên 1",
              "avatar_url": "https://cdn.ucall.vn/avatars/user1.png"
            },
            "is_completed": false,
            "completed_at": null,
            "sort_order": 2
          },
          {
            "id": "subtask-3",
            "title": "Đặt phòng họp và kiểm tra thiết bị",
            "assignee": {
              "id": "user-2",
              "name": "Dương Thu Hoài Ngọc",
              "avatar_url": "https://cdn.ucall.vn/avatars/user2.png"
            },
            "is_completed": false,
            "completed_at": null,
            "sort_order": 3
          }
        ]
      }
    }
    

API 2: Thêm mới subtask

  • Method & Endpoint: POST /api/v1/crm/tasks/{task_id}/subtasks
  • Request Body:
    {
      "title": "Đặt phòng họp và kiểm tra thiết bị",
      "assignee_id": "user-1"
    }
    

    (Nếu không truyền assignee_id, backend tự động fallback sang task.assignee_id hoặc current_user.id).

  • Response 201: Trả về đối tượng subtask vừa tạo thành công.

API 3: Cập nhật trạng thái / Thông tin subtask

  • Method & Endpoint: PATCH /api/v1/crm/tasks/{task_id}/subtasks/{subtask_id}
  • Request Body (Đổi trạng thái): {"is_completed": true}
  • Request Body (Đổi người / sửa tên): {"title": "Tên mới", "assignee_id": "user-2"}
  • Response 200: Trả về dữ liệu subtask và summary tiến độ mới (total, completed, progress_text).

API 4: Xóa subtask

  • Method & Endpoint: DELETE /api/v1/crm/tasks/{task_id}/subtasks/{subtask_id}
  • Response 200: Trả về thông báo thành công và bộ đếm tóm tắt cập nhật.

VI. Test case (BA hoặc Tester viết)

1. Test cases cho Task cha

  • TC-01: Test trigger mặc định thời gian khi bấm mở form tạo mới. Kiểm thử có đúng là Time current + 60 mins và làm tròn giây luôn không.
  • TC-02: Nhập các test data siêu dài vào Tên công việc và Mô tả xem Quick View có dãn layout hoặc gãy vỡ hay không.
  • TC-03: Đổi deadline task từ tương lai về quá khứ ngay trên màn Lịch sử Liên hệ. Card Task biến mất khỏi block Sắp tới và nhảy xuống block Quá khứ (Tháng X). Đổi tiếp về tương lai, nhảy ngược lên bảng.
  • TC-04: Hover tooltip vào khối Liên kết lớn hơn 5 object xem content tooltip có hiện đúng giới hạn item/viewport không.

2. Test cases cho Công việc phụ (Subtask / Checklist)

  • TC-SUB-01 (Happy Path - Autofill): Mở drawer task có người phụ trách “Nhân viên 1”. Bấm Thêm công việc phụ. Kiểm tra trường Người phụ trách được autofill sẵn “Nhân viên 1”. Nhập tên và lưu -> Tạo thành công, tiến độ 0/1.
  • TC-SUB-02 (Happy Path - Đổi Assignee): Tại dòng subtask, click đổi người phụ trách sang “Dương Thu Hoài Ngọc” -> Subtask cập nhật người mới, nhân viên phụ trách task cha vẫn giữ nguyên là “Nhân viên 1”.
  • TC-SUB-03 (Happy Path - Tiến độ x/y): Tạo 3 subtask (0/3). Tick hoàn thành subtask 1 -> Checkbox checked, tên gạch ngang, tiến độ cập nhật 1/3. Tick tiếp subtask 2 -> Tiến độ thành 2/3.
  • TC-SUB-04 (Business Rule - Độc lập trạng thái): Task cha đang ở trạng thái “Đang làm”. Có 3 subtask, tiến độ 2/3. Tick hoàn thành subtask thứ 3 -> Tiến độ đạt 3/3, badge đổi màu xanh lá. Trạng thái Task cha VẪN LÀ “Đang làm”, không tự động đổi sang “Hoàn thành”.
  • TC-SUB-05 (Business Rule - Cảnh báo khi còn subtask): Task cha có tiến độ subtask là 1/3. User click nút [Hoàn thành] trên Header task cha -> Hệ thống bật Modal cảnh báo: “Công việc này vẫn còn 2 công việc phụ chưa hoàn thành. Bạn có chắc chắn muốn hoàn thành?”. Bấm Hủy: Giữ nguyên task cha; Bấm Xác nhận: Task cha hoàn thành, subtask giữ nguyên 1/3.
  • TC-SUB-06 (Business Rule - Hoàn thành khi 3/3): Tiến độ subtask đang là 3/3. User bấm [Hoàn thành] task cha -> Task cha chuyển Hoàn thành ngay lập tức không có cảnh báo.
  • TC-SUB-07 (Validation): Thêm subtask với tên để trống hoặc toàn space -> Báo lỗi yêu cầu nhập tên, không tạo record.
  • TC-SUB-08 (Edge Case - Xóa subtask): Task có 3 subtask, 1 đã xong (1/3). Xóa 1 subtask chưa xong -> Tiến độ thành 1/2. Xóa tiếp subtask đã xong -> Tiến độ thành 0/1.
  • TC-SUB-09 (UI - Grid Display): Bảng Task Grid bên ngoài hiển thị icon phân nhánh kèm text badge 1/3 cạnh tên task; hover vào hiển thị popover danh sách subtask.
  • TC-SUB-10 (Audit Log): Mọi thao tác thêm, tick, đổi người, xóa subtask đều ghi log đầy đủ trong Tab “Hoạt động” của Task cha.