synapse-hub 2.4.2 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/agents/orchestrator.md +1 -0
- package/.agents/agents/pom-crafter.md +1 -0
- package/.agents/agents/quality-gatekeeper.md +6 -0
- package/.agents/rules/skill-precedence.md +38 -18
- package/.agents/rules/systematic-debugging.md +2 -0
- package/.agents/skills/lean-code-ladder/SKILL.md +12 -1
- package/.agents/skills/lean-impact-scoreboard/SKILL.md +48 -0
- package/.agents/skills/lean-impact-scoreboard/examples/sample_benchmark_gain.md +20 -0
- package/.agents/skills/lean-impact-scoreboard/examples/sample_scoreboard.md +15 -0
- package/.agents/skills/repo-quality-audit/SKILL.md +68 -0
- package/.agents/skills/repo-quality-audit/examples/sample_audit_walkthrough.md +15 -0
- package/.agents/skills/repo-quality-audit/examples/sample_repo_audit.md +33 -0
- package/.agents/skills/senior-code-review/SKILL.md +90 -0
- package/.agents/skills/senior-code-review/examples/sample_review_walkthrough.md +29 -0
- package/.agents/skills/technical-debt-harvester/SKILL.md +70 -0
- package/.agents/skills/technical-debt-harvester/examples/sample_debt_ledger.md +25 -0
- package/.agents/skills/technical-debt-harvester/examples/sample_ledger_output.md +20 -0
- package/.cursor/rules/synapse-qa.mdc +4 -3
- package/.cursorrules +1 -0
- package/.windsurfrules +1 -0
- package/AGENTS.md +51 -179
- package/CLAUDE.md +5 -0
- package/README.en.md +12 -8
- package/README.md +12 -8
- package/bin/agent-qa.js +3 -2
- package/docs/ARCHITECTURE.md +3 -3
- package/docs/CLI_REFERENCE.md +15 -1
- package/package.json +1 -3
- package/skills_manifest.json +38 -2
- package/synapse.config.json +1 -1
- package/templates/ai_bridges/CLAUDE.md +5 -0
- package/templates/ai_bridges/copilot-instructions.md +2 -0
- package/templates/ai_bridges/cursor_synapse_qa.mdc +4 -3
- package/templates/ai_bridges/windsurfrules +1 -0
- package/tools/.infer_baseline.json +7 -1079
- package/tools/TOOLS_RUNBOOK.md +53 -13
- package/tools/__init__.py +1 -1
- package/tools/agent_canary.py +4 -4
- package/tools/analyze_project.py +2 -2
- package/tools/api_fuzzer.py +4 -4
- package/tools/auto_heal.py +4 -2
- package/tools/browser_helpers.js +2 -2
- package/tools/bump_version.py +30 -2
- package/tools/cache_resolver.py +6 -6
- package/tools/check_env.py +82 -18
- package/tools/cli.py +265 -197
- package/tools/count_tokens.py +7 -7
- package/tools/dashboard_generator.py +14 -14
- package/tools/db_sandbox.py +5 -5
- package/tools/debt_harvester.py +236 -0
- package/tools/distill_log.py +2 -2
- package/tools/flaky_detector.py +5 -5
- package/tools/generate_tc_from_story.py +2 -2
- package/tools/generate_test_reports.py +4 -4
- package/tools/git_pre_commit_guard.py +6 -6
- package/tools/infer_linter.py +12 -7
- package/tools/lint_ai_docs.py +2 -2
- package/tools/matrix_sharder.py +4 -4
- package/tools/mcp_excel_server.py +1 -1
- package/tools/mcp_server.py +3 -3
- package/tools/micro_mutator.py +6 -6
- package/tools/omni_transpiler.py +2 -2
- package/tools/output_formatter.py +37 -2
- package/tools/pinpoint_failure.py +4 -1
- package/tools/repo_map.py +2 -2
- package/tools/safety_firewall.py +2 -2
- package/tools/senior_code_review.py +341 -0
- package/tools/setup_project.py +17 -9
- package/tools/skillspector.py +2 -2
- package/tools/sync_agent_rules.py +14 -3
- package/tools/test_impact.py +4 -4
- package/tools/tms_sync_bridge.py +2 -2
- package/tools/update_sentinel.py +24 -23
- package/tools/verify_all.py +12 -12
- package/tools/visual_som_helper.py +8 -8
- package/tools/watch_mode.py +6 -7
- package/tools/wcag_audit.py +5 -1
- package/tools/welcome_page.py +11 -11
- package/benchmarks/qa_eval/README.md +0 -71
- package/benchmarks/qa_eval/build_dataset.py +0 -677
- package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-06_api_contract_drift.json +0 -22
- package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-07_api_contract_drift.json +0 -22
- package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-08_api_contract_drift.json +0 -22
- package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-09_api_contract_drift.json +0 -22
- package/benchmarks/qa_eval/dataset/api_contract_drift/qa-challenge-10_api_contract_drift.json +0 -22
- package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-21_fake_pass_tautology.json +0 -21
- package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-22_fake_pass_tautology.json +0 -21
- package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-23_fake_pass_tautology.json +0 -21
- package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-24_fake_pass_tautology.json +0 -21
- package/benchmarks/qa_eval/dataset/fake_pass_tautology/qa-challenge-25_fake_pass_tautology.json +0 -21
- package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-01_locator_drift.json +0 -23
- package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-02_locator_drift.json +0 -23
- package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-03_locator_drift.json +0 -23
- package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-04_locator_drift.json +0 -23
- package/benchmarks/qa_eval/dataset/locator_drift/qa-challenge-05_locator_drift.json +0 -23
- package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-16_stale_and_mutation.json +0 -22
- package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-17_stale_and_mutation.json +0 -22
- package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-18_stale_and_mutation.json +0 -22
- package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-19_stale_and_mutation.json +0 -22
- package/benchmarks/qa_eval/dataset/stale_and_mutation/qa-challenge-20_stale_and_mutation.json +0 -23
- package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-11_timing_and_race.json +0 -22
- package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-12_timing_and_race.json +0 -22
- package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-13_timing_and_race.json +0 -22
- package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-14_timing_and_race.json +0 -22
- package/benchmarks/qa_eval/dataset/timing_and_race/qa-challenge-15_timing_and_race.json +0 -22
- package/benchmarks/qa_eval/eval_runner.py +0 -418
- package/benchmarks/qa_eval/reports/BENCHMARK_REPORT.md +0 -94
- package/benchmarks/qa_eval/reports/eval_results.json +0 -461
- package/examples/cypress-ecommerce-suite/README.md +0 -45
- package/examples/cypress-ecommerce-suite/cypress/e2e/checkout.cy.js +0 -17
- package/examples/cypress-ecommerce-suite/cypress/pages/BasePage.js +0 -29
- package/examples/cypress-ecommerce-suite/cypress/pages/CartPage.js +0 -51
- package/examples/cypress-ecommerce-suite/cypress.config.js +0 -13
- package/examples/cypress-ecommerce-suite/package.json +0 -13
- package/examples/katalon-suite/Keywords/pages/BasePage.groovy +0 -19
- package/examples/katalon-suite/Keywords/pages/DashboardPage.groovy +0 -29
- package/examples/katalon-suite/Keywords/pages/LoginPage.groovy +0 -45
- package/examples/katalon-suite/Profiles/default.glbl +0 -12
- package/examples/katalon-suite/README.md +0 -18
- package/examples/katalon-suite/Scripts/Auth/TC_LoginSuccess/Script1234567890.groovy +0 -12
- package/examples/katalon-suite/Scripts/Dashboard/TC_ViewSummary/Script1234567891.groovy +0 -15
- package/examples/katalon-suite/katalon_suite.prj +0 -21
- package/examples/playwright-crm-suite/README.md +0 -40
- package/examples/playwright-crm-suite/package.json +0 -14
- package/examples/playwright-crm-suite/pages/BasePage.ts +0 -37
- package/examples/playwright-crm-suite/pages/CustomerPage.ts +0 -57
- package/examples/playwright-crm-suite/pages/LoginPage.ts +0 -32
- package/examples/playwright-crm-suite/playwright.config.ts +0 -27
- package/examples/playwright-crm-suite/tests/auth.spec.ts +0 -22
- package/examples/playwright-crm-suite/tests/customers.spec.ts +0 -33
- package/examples/plugins/sample-custom-plugin/README.md +0 -14
- package/examples/plugins/sample-custom-plugin/plugin.json +0 -16
- package/examples/plugins/sample-custom-plugin/skills/custom-security-headers-audit/SKILL.md +0 -29
- package/examples/plugins/sample-custom-plugin/skills/custom-security-headers-audit/examples/audit_fixture.json +0 -8
- package/examples/plugins/sample-custom-plugin/tools/custom_security_headers.py +0 -125
- package/examples/practices/README.md +0 -22
- package/examples/practices/requirements/crm/requirements_contracts.md +0 -292
- package/examples/practices/requirements/crm/requirements_customers.md +0 -462
- package/examples/practices/requirements/crm/requirements_login.md +0 -202
- package/examples/practices/requirements/crm/requirements_projects.md +0 -396
- package/examples/practices/requirements/crm/requirements_tasks.md +0 -343
- package/examples/practices/requirements/ecommerce/requirements_category_brand.txt +0 -402
- package/examples/practices/requirements/jira/KAN-5/KAN-1/2026-04-03_04-28-27.png +0 -0
- package/examples/practices/requirements/jira/KAN-5/KAN-1/KAN-1_requirement.md +0 -52
- package/examples/practices/requirements/jira/KAN-5/KAN-4/2026-04-03_04-28-19.png +0 -0
- package/examples/practices/requirements/jira/KAN-5/KAN-4/2026-04-03_04-28-57.png +0 -0
- package/examples/practices/requirements/jira/KAN-5/KAN-4/KAN-4_requirement.md +0 -119
- package/examples/practices/requirements/jira/KAN-5/KAN-5_overview.md +0 -9
- package/examples/practices/requirements/jira/KAN-5/KAN-6/2026-04-03_05-58-08.png +0 -0
- package/examples/practices/requirements/jira/KAN-5/KAN-6/2026-04-03_05-58-23.png +0 -0
- package/examples/practices/requirements/jira/KAN-5/KAN-6/KAN-6_requirement.md +0 -32
- package/examples/practices/testcases/api/book_management_api_test_cases.md +0 -144
- package/examples/practices/testcases/api/user_management_api_test_cases.md +0 -139
- package/examples/practices/testcases/crm/test_cases_crm_login.md +0 -148
- package/examples/practices/testcases/crm/test_cases_customers.md +0 -156
- package/examples/pytest-api-suite/README.md +0 -45
- package/examples/pytest-api-suite/conftest.py +0 -31
- package/examples/pytest-api-suite/pages/user_api_client.py +0 -36
- package/examples/pytest-api-suite/requirements.txt +0 -2
- package/examples/pytest-api-suite/tests/test_user_api.py +0 -44
- package/examples/selenium-suite/README.md +0 -18
- package/examples/selenium-suite/pages/base_page.py +0 -27
- package/examples/selenium-suite/pages/login_page.py +0 -29
- package/examples/selenium-suite/pages/order_page.py +0 -25
- package/examples/selenium-suite/pytest.ini +0 -6
- package/examples/selenium-suite/requirements.txt +0 -2
- package/examples/selenium-suite/tests/test_login.py +0 -10
- package/examples/selenium-suite/tests/test_order.py +0 -10
|
@@ -1,396 +0,0 @@
|
|
|
1
|
-
# Tài liệu Yêu cầu — Module Projects
|
|
2
|
-
|
|
3
|
-
> **Hệ thống:** Perfex CRM
|
|
4
|
-
> **URL Module:** `https://crm.anhtester.com/admin/projects`
|
|
5
|
-
> **Ngày tạo:** 03/04/2026
|
|
6
|
-
> **Phiên bản:** 1.0
|
|
7
|
-
> **Người tạo:** AI Agent (Antigravity)
|
|
8
|
-
> **Phương pháp:** Khảo sát UI/DOM trực tiếp trên browser (1920×1080)
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## 1. Tổng quan (Overview)
|
|
13
|
-
|
|
14
|
-
Module **Projects** là một thành phần quản lý dự án trong hệ thống Perfex CRM, cho phép người dùng Admin:
|
|
15
|
-
|
|
16
|
-
- Xem danh sách tất cả dự án với tổng quan trạng thái.
|
|
17
|
-
- Tạo mới, chỉnh sửa và xóa dự án.
|
|
18
|
-
- Gán khách hàng (Customer) và thành viên (Members) vào dự án.
|
|
19
|
-
- Thiết lập loại hình thanh toán (Billing Type), tiến độ, và thời hạn.
|
|
20
|
-
- Quản lý cài đặt dự án: thông báo, tab hiển thị, quyền hạn khách hàng.
|
|
21
|
-
- Theo dõi tiến độ qua biểu đồ Gantt.
|
|
22
|
-
- Lọc, tìm kiếm và xuất dữ liệu dự án.
|
|
23
|
-
|
|
24
|
-
Module này liên kết chặt chẽ với các module khác: **Customers**, **Tasks**, **Contracts**, **Invoices**, **Tickets**, **Timesheets**, **Milestones**, **Discussions**, v.v.
|
|
25
|
-
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
## 2. Yêu cầu Chức năng (Functional Requirements)
|
|
29
|
-
|
|
30
|
-
### FR-01: Xem danh sách Dự án (View Projects List)
|
|
31
|
-
|
|
32
|
-
**Mô tả:** Là một quản trị viên, tôi muốn xem danh sách toàn bộ dự án dưới dạng bảng để có cái nhìn tổng quan về tất cả các dự án đang quản lý.
|
|
33
|
-
|
|
34
|
-
**Tiêu chí chấp nhận (Acceptance Criteria):**
|
|
35
|
-
- Trang hiển thị bảng dữ liệu với các cột: `#` (ID), `Project Name`, `Customer`, `Tags`, `Start Date`, `Deadline`, `Members`, `Status`.
|
|
36
|
-
- Phần **Projects Summary** hiển thị tổng số dự án theo từng trạng thái: `Not Started`, `In Progress`, `On Hold`, `Cancelled`, `Finished`.
|
|
37
|
-
- Có thể click vào từng nhãn trạng thái trong Summary để lọc nhanh danh sách.
|
|
38
|
-
- Bảng hỗ trợ phân trang, có dropdown chọn số bản ghi hiển thị (mặc định: 25).
|
|
39
|
-
- Các cột có thể sắp xếp (sort) bằng cách click vào tiêu đề cột.
|
|
40
|
-
- Hiển thị "No entries found" khi không có dữ liệu.
|
|
41
|
-
|
|
42
|
-
---
|
|
43
|
-
|
|
44
|
-
### FR-02: Tạo mới Dự án (Create New Project)
|
|
45
|
-
|
|
46
|
-
**Mô tả:** Là một quản trị viên, tôi muốn tạo một dự án mới với đầy đủ thông tin cơ bản và cài đặt quyền hạn để bắt đầu quản lý dự án cho khách hàng.
|
|
47
|
-
|
|
48
|
-
**Tiêu chí chấp nhận (Acceptance Criteria):**
|
|
49
|
-
- Nhấn nút **"+ New Project"** trên trang danh sách → Chuyển đến trang "Add new project" (`/admin/projects/project`).
|
|
50
|
-
- Form chia thành 2 tab: **"Project"** (thông tin cơ bản) và **"Project Settings"** (cài đặt & quyền).
|
|
51
|
-
- Các trường bắt buộc: `Project Name`, `Customer`, `Billing Type`, `Start Date`.
|
|
52
|
-
- Sau khi điền đủ thông tin và nhấn **"Save"** → Dự án được tạo thành công.
|
|
53
|
-
- Có tùy chọn **"Send project created email"** (checkbox) để gửi email thông báo cho khách hàng.
|
|
54
|
-
- Hệ thống validate client-side: hiển thị lỗi ngay dưới trường khi nhấn Save mà thiếu dữ liệu bắt buộc.
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
### FR-03: Chỉnh sửa Dự án (Edit Project)
|
|
59
|
-
|
|
60
|
-
**Mô tả:** Là một quản trị viên, tôi muốn chỉnh sửa thông tin của một dự án đã tồn tại để cập nhật thay đổi.
|
|
61
|
-
|
|
62
|
-
**Tiêu chí chấp nhận (Acceptance Criteria):**
|
|
63
|
-
- Click vào tên dự án trong danh sách → Mở trang chi tiết dự án.
|
|
64
|
-
- Chỉnh sửa các trường thông tin tương tự form tạo mới.
|
|
65
|
-
- Nhấn **"Save"** → Cập nhật thành công.
|
|
66
|
-
|
|
67
|
-
---
|
|
68
|
-
|
|
69
|
-
### FR-04: Xóa Dự án (Delete Project)
|
|
70
|
-
|
|
71
|
-
**Mô tả:** Là một quản trị viên, tôi muốn xóa một dự án không còn cần thiết.
|
|
72
|
-
|
|
73
|
-
**Tiêu chí chấp nhận (Acceptance Criteria):**
|
|
74
|
-
- Thao tác xóa nằm trong trang chi tiết dự án hoặc qua menu hành động.
|
|
75
|
-
- Hệ thống hiển thị hộp thoại xác nhận trước khi xóa.
|
|
76
|
-
- Xóa thành công → Dự án bị loại khỏi danh sách.
|
|
77
|
-
|
|
78
|
-
---
|
|
79
|
-
|
|
80
|
-
### FR-05: Lọc và Tìm kiếm Dự án (Filter & Search Projects)
|
|
81
|
-
|
|
82
|
-
**Mô tả:** Là một quản trị viên, tôi muốn lọc và tìm kiếm dự án để nhanh chóng tìm được dự án cần thiết.
|
|
83
|
-
|
|
84
|
-
**Tiêu chí chấp nhận (Acceptance Criteria):**
|
|
85
|
-
- **Tìm kiếm:** Ô tìm kiếm toàn cục (Search) ở góc phải bảng dữ liệu, tìm kiếm theo keyword.
|
|
86
|
-
- **Lọc nhanh:** Click vào nhãn trạng thái trong Projects Summary (Not Started, In Progress, On Hold, Cancelled, Finished).
|
|
87
|
-
- **Lọc nâng cao (Filter):** Nút filter (biểu tượng phễu) ở góc phải trên → Hiển thị popup "New Filter" cho phép tạo và lưu bộ lọc tùy chỉnh (Saved Filters).
|
|
88
|
-
|
|
89
|
-
---
|
|
90
|
-
|
|
91
|
-
### FR-06: Xuất dữ liệu Dự án (Export Projects)
|
|
92
|
-
|
|
93
|
-
**Mô tả:** Là một quản trị viên, tôi muốn xuất danh sách dự án ra file để báo cáo hoặc lưu trữ.
|
|
94
|
-
|
|
95
|
-
**Tiêu chí chấp nhận (Acceptance Criteria):**
|
|
96
|
-
- Nút **"Export"** trên toolbar → Dropdown hiển thị 3 tùy chọn:
|
|
97
|
-
- **CSV** — Xuất ra file CSV
|
|
98
|
-
- **PDF** — Xuất ra file PDF
|
|
99
|
-
- **Print** — Mở cửa sổ in trực tiếp
|
|
100
|
-
|
|
101
|
-
---
|
|
102
|
-
|
|
103
|
-
### FR-07: Xem biểu đồ Gantt (Gantt View)
|
|
104
|
-
|
|
105
|
-
**Mô tả:** Là một quản trị viên, tôi muốn xem biểu đồ Gantt của tất cả dự án để theo dõi tiến độ trực quan theo dòng thời gian.
|
|
106
|
-
|
|
107
|
-
**Tiêu chí chấp nhận (Acceptance Criteria):**
|
|
108
|
-
- Nhấn nút biểu tượng Gantt (cạnh nút "New Project") → Chuyển sang trang Gantt View.
|
|
109
|
-
- Trang Gantt có bộ lọc:
|
|
110
|
-
- **Status:** Dropdown multi-select (mặc định: Not Started, In Progress, On Hold).
|
|
111
|
-
- **Project Member:** Dropdown chọn thành viên.
|
|
112
|
-
- Nút **"Apply"** để áp dụng bộ lọc.
|
|
113
|
-
- Hiển thị "No Tasks Found" khi không có dữ liệu phù hợp.
|
|
114
|
-
|
|
115
|
-
---
|
|
116
|
-
|
|
117
|
-
### FR-08: Quản lý Cài đặt & Quyền hạn Dự án (Manage Project Settings & Permissions)
|
|
118
|
-
|
|
119
|
-
**Mô tả:** Là một quản trị viên, tôi muốn cấu hình các cài đặt hiển thị và quyền hạn cho khách hàng đối với từng dự án.
|
|
120
|
-
|
|
121
|
-
**Tiêu chí chấp nhận (Acceptance Criteria):**
|
|
122
|
-
- Tab **"Project Settings"** trong form tạo/sửa dự án cho phép cấu hình:
|
|
123
|
-
- Gửi thông báo cho contacts (Send contacts notifications).
|
|
124
|
-
- Chọn các tab hiển thị (Visible Tabs) cho khách hàng.
|
|
125
|
-
- Bật/tắt từng quyền hạn cụ thể cho khách hàng (18 checkbox).
|
|
126
|
-
- Xem chi tiết tại mục [3.2 - Tab Project Settings](#32-tab-project-settings-cài-đặt--quyền).
|
|
127
|
-
|
|
128
|
-
---
|
|
129
|
-
|
|
130
|
-
## 3. Đặc tả Trường Dữ liệu (Field Specifications)
|
|
131
|
-
|
|
132
|
-
### 3.1. Tab "Project" (Thông tin cơ bản)
|
|
133
|
-
|
|
134
|
-
| # | Tên trường (Label) | Loại UI | Bắt buộc | Giá trị mặc định | Validation / Ràng buộc | Ghi chú |
|
|
135
|
-
|---|---|---|---|---|---|---|
|
|
136
|
-
| 1 | Project Name | TextBox (input text) | ✅ Có | — | Không được để trống. Lỗi: *"This field is required."* | — |
|
|
137
|
-
| 2 | Customer | Dropdown tìm kiếm (AJAX select) | ✅ Có | — | Phải chọn 1 khách hàng. Lỗi: *"Select and begin typing"* (highlight đỏ). Placeholder: "Select and begin typing" | Tìm kiếm theo tên KH |
|
|
138
|
-
| 3 | Calculate progress through tasks | Checkbox | Không | ✅ Checked | Khi **checked**: tiến độ tự tính từ tasks. Khi **unchecked**: hiện thanh trượt để nhập thủ công | Ảnh hưởng đến hiển thị Progress |
|
|
139
|
-
| 4 | Progress | Progress bar / Slider | Không | 0% | Khi checkbox ở #3 được tích → hiển thị progress bar (read-only). Khi bỏ tích → hiển thị slider (0–100%) cho phép kéo thủ công | Hiển thị giá trị: "Progress X%" |
|
|
140
|
-
| 5 | Billing Type | Dropdown (select) | ✅ Có | Nothing selected | Phải chọn 1 giá trị. Lỗi: *"This field is required."*. Các options: **Fixed Rate**, **Project Hours**, **Task Hours** *(Based on task hourly rate)* | — |
|
|
141
|
-
| 6 | Status | Dropdown (select) | Không | In Progress | 5 options: **Not Started**, **In Progress**, **On Hold**, **Cancelled**, **Finished** | Luôn mặc định "In Progress" khi tạo mới |
|
|
142
|
-
| 7 | Estimated Hours | TextBox (input number) | Không | — | Nhập số giờ ước tính cho dự án | — |
|
|
143
|
-
| 8 | Members | Multi-select Dropdown (tìm kiếm) | Không | User hiện tại (VD: "Admin Example") | Cho phép chọn nhiều thành viên. Tự động gán user đang đăng nhập | — |
|
|
144
|
-
| 9 | Start Date | Date Picker (input date) | ✅ Có | Ngày hiện tại (DD-MM-YYYY) | Định dạng: `DD-MM-YYYY`. Có nút calendar popup | Mặc định lấy ngày hệ thống |
|
|
145
|
-
| 10 | Deadline | Date Picker (input date) | Không | — | Định dạng: `DD-MM-YYYY`. Có nút calendar popup | — |
|
|
146
|
-
| 11 | Tags | Tag Input | Không | — | Cho phép nhập nhiều tag, mỗi tag là 1 label riêng. Placeholder: "Tag" | — |
|
|
147
|
-
| 12 | Description | Rich Text Editor (TinyMCE) | Không | — | Hỗ trợ formatting: Bold, Italic, căn lề, bảng, chèn link/ảnh. Thanh toolbar: File, Edit, View, Insert, Format, Tools, Table | — |
|
|
148
|
-
| 13 | Send project created email | Checkbox | Không | ☐ Unchecked | Nằm cuối form. Khi tích → gửi email thông báo tạo dự án cho KH | — |
|
|
149
|
-
|
|
150
|
-
---
|
|
151
|
-
|
|
152
|
-
### 3.2. Tab "Project Settings" (Cài đặt & Quyền)
|
|
153
|
-
|
|
154
|
-
#### 3.2.1. Thông báo (Notifications)
|
|
155
|
-
|
|
156
|
-
| # | Tên trường (Label) | Loại UI | Bắt buộc | Giá trị mặc định | Ghi chú |
|
|
157
|
-
|---|---|---|---|---|---|
|
|
158
|
-
| 1 | Send contacts notifications | Dropdown (select) | ✅ Có (`*`) | "To all contacts with notifications for projects enabled" | Cấu hình đối tượng nhận thông báo dự án |
|
|
159
|
-
|
|
160
|
-
#### 3.2.2. Tab hiển thị (Visible Tabs)
|
|
161
|
-
|
|
162
|
-
| # | Tên trường (Label) | Loại UI | Giá trị mặc định | Ghi chú |
|
|
163
|
-
|---|---|---|---|---|
|
|
164
|
-
| 1 | Visible Tabs | Multi-select Dropdown | Tất cả tabs được chọn | Cho phép chọn các tab sẽ hiển thị cho khách hàng trong chi tiết dự án |
|
|
165
|
-
|
|
166
|
-
**Danh sách các tab có thể chọn (16 tabs):**
|
|
167
|
-
|
|
168
|
-
| # | Tên Tab | Mô tả |
|
|
169
|
-
|---|---|---|
|
|
170
|
-
| 1 | Tasks | Quản lý task/công việc |
|
|
171
|
-
| 2 | Timesheets | Bảng chấm công |
|
|
172
|
-
| 3 | Milestones | Các mốc quan trọng |
|
|
173
|
-
| 4 | Files | Quản lý file/tài liệu |
|
|
174
|
-
| 5 | Discussions | Thảo luận |
|
|
175
|
-
| 6 | Gantt | Biểu đồ Gantt |
|
|
176
|
-
| 7 | Tickets | Ticket hỗ trợ |
|
|
177
|
-
| 8 | Contracts | Hợp đồng |
|
|
178
|
-
| 9 | Proposals | Đề xuất |
|
|
179
|
-
| 10 | Estimates | Báo giá |
|
|
180
|
-
| 11 | Invoices | Hóa đơn |
|
|
181
|
-
| 12 | Subscriptions | Gói đăng ký |
|
|
182
|
-
| 13 | Expenses | Chi phí |
|
|
183
|
-
| 14 | Credit Notes | Phiếu giảm giá |
|
|
184
|
-
| 15 | Notes | Ghi chú |
|
|
185
|
-
| 16 | Activity | Nhật ký hoạt động |
|
|
186
|
-
|
|
187
|
-
#### 3.2.3. Quyền hạn Khách hàng (Customer Permissions)
|
|
188
|
-
|
|
189
|
-
Tất cả đều là **Checkbox**, mặc định **Checked** (trừ mục cuối).
|
|
190
|
-
|
|
191
|
-
| # | Tên quyền (Label) | Mặc định | Mô tả |
|
|
192
|
-
|---|---|---|---|
|
|
193
|
-
| 1 | Allow customer to view tasks | ✅ Checked | KH có thể xem danh sách tasks |
|
|
194
|
-
| 2 | Allow customer to create tasks | ✅ Checked | KH có thể tạo task mới |
|
|
195
|
-
| 3 | Allow customer to edit tasks (only tasks created from contact) | ✅ Checked | KH chỉ sửa được task do chính mình tạo |
|
|
196
|
-
| 4 | Allow customer to comment on project tasks | ✅ Checked | KH có thể bình luận vào tasks |
|
|
197
|
-
| 5 | Allow customer to view task comments | ✅ Checked | KH có thể xem bình luận của tasks |
|
|
198
|
-
| 6 | Allow customer to view task attachments | ✅ Checked | KH có thể xem file đính kèm của task |
|
|
199
|
-
| 7 | Allow customer to view task checklist items | ✅ Checked | KH có thể xem checklist của task |
|
|
200
|
-
| 8 | Allow customer to upload attachments on tasks | ✅ Checked | KH có thể upload file vào task |
|
|
201
|
-
| 9 | Allow customer to view task total logged time | ✅ Checked | KH có thể xem tổng thời gian đã log |
|
|
202
|
-
| 10 | Allow customer to view finance overview | ✅ Checked | KH có thể xem tổng quan tài chính |
|
|
203
|
-
| 11 | Allow customer to upload files | ✅ Checked | KH có thể upload file lên dự án |
|
|
204
|
-
| 12 | Allow customer to open discussions | ✅ Checked | KH có thể mở thảo luận mới |
|
|
205
|
-
| 13 | Allow customer to view milestones | ✅ Checked | KH có thể xem các mốc quan trọng |
|
|
206
|
-
| 14 | Allow customer to view Gantt | ✅ Checked | KH có thể xem biểu đồ Gantt |
|
|
207
|
-
| 15 | Allow customer to view timesheets | ✅ Checked | KH có thể xem bảng chấm công |
|
|
208
|
-
| 16 | Allow customer to view activity log | ✅ Checked | KH có thể xem nhật ký hoạt động |
|
|
209
|
-
| 17 | Allow customer to view team members | ✅ Checked | KH có thể xem danh sách thành viên |
|
|
210
|
-
| 18 | Hide project tasks on main tasks table (admin area) | ☐ Unchecked | Ẩn task của dự án này khỏi bảng Tasks chính |
|
|
211
|
-
|
|
212
|
-
---
|
|
213
|
-
|
|
214
|
-
## 4. Quy tắc Validation và Thông báo lỗi (Business Rules & Validations)
|
|
215
|
-
|
|
216
|
-
### 4.1. Validation khi Tạo mới / Chỉnh sửa Dự án
|
|
217
|
-
|
|
218
|
-
| # | Trường | Điều kiện lỗi | Thông báo lỗi (Validation Message) | Loại Validation |
|
|
219
|
-
|---|---|---|---|---|
|
|
220
|
-
| 1 | Project Name | Để trống | *"This field is required."* | Client-side |
|
|
221
|
-
| 2 | Customer | Chưa chọn khách hàng | *"Select and begin typing"* (highlight đỏ) | Client-side |
|
|
222
|
-
| 3 | Billing Type | Chưa chọn loại | *"This field is required."* | Client-side |
|
|
223
|
-
| 4 | Start Date | Để trống (nếu xóa giá trị mặc định) | *"This field is required."* | Client-side |
|
|
224
|
-
|
|
225
|
-
### 4.2. Quy tắc liên quan đến Tiến độ (Progress)
|
|
226
|
-
|
|
227
|
-
| # | Điều kiện | Hành vi |
|
|
228
|
-
|---|---|---|
|
|
229
|
-
| 1 | Checkbox "Calculate progress through tasks" = **Checked** | Progress bar hiển thị giá trị read-only, tự tính từ hoàn thành các tasks con |
|
|
230
|
-
| 2 | Checkbox "Calculate progress through tasks" = **Unchecked** | Hiển thị thanh trượt (Slider) cho phép kéo chỉnh từ 0% đến 100% |
|
|
231
|
-
|
|
232
|
-
### 4.3. Quy tắc liên quan đến Billing Type
|
|
233
|
-
|
|
234
|
-
| # | Loại (Billing Type) | Mô tả |
|
|
235
|
-
|---|---|---|
|
|
236
|
-
| 1 | Fixed Rate | Dự án tính theo giá cố định |
|
|
237
|
-
| 2 | Project Hours | Dự án tính theo tổng số giờ của dự án |
|
|
238
|
-
| 3 | Task Hours | Dự án tính theo số giờ của từng task (dựa trên đơn giá giờ của task) |
|
|
239
|
-
|
|
240
|
-
---
|
|
241
|
-
|
|
242
|
-
## 5. Các Luồng xử lý (User Flows)
|
|
243
|
-
|
|
244
|
-
### Flow 01: Tạo mới Dự án thành công (Happy Path)
|
|
245
|
-
|
|
246
|
-
```
|
|
247
|
-
1. Truy cập /admin/projects
|
|
248
|
-
2. Click "+ New Project"
|
|
249
|
-
3. Hệ thống chuyển đến trang "Add new project"
|
|
250
|
-
4. Tab "Project" mặc định được chọn
|
|
251
|
-
5. Nhập "Project Name" (bắt buộc)
|
|
252
|
-
6. Chọn "Customer" từ dropdown tìm kiếm (bắt buộc)
|
|
253
|
-
7. Chọn "Billing Type" (bắt buộc)
|
|
254
|
-
8. Chọn "Status" (mặc định: In Progress)
|
|
255
|
-
9. Nhập "Estimated Hours" (tùy chọn)
|
|
256
|
-
10. Chọn/thêm "Members" (mặc định: user hiện tại)
|
|
257
|
-
11. "Start Date" tự điền ngày hiện tại (bắt buộc)
|
|
258
|
-
12. Chọn "Deadline" (tùy chọn)
|
|
259
|
-
13. Thêm "Tags" (tùy chọn)
|
|
260
|
-
14. Nhập "Description" qua TinyMCE (tùy chọn)
|
|
261
|
-
15. (Tùy chọn) Click tab "Project Settings" để cấu hình thêm
|
|
262
|
-
16. Click "Save"
|
|
263
|
-
17. → Dự án được tạo thành công, chuyển đến trang chi tiết dự án
|
|
264
|
-
```
|
|
265
|
-
|
|
266
|
-
### Flow 02: Tạo Dự án thất bại (Validation Error)
|
|
267
|
-
|
|
268
|
-
```
|
|
269
|
-
1. Truy cập /admin/projects/project
|
|
270
|
-
2. Không nhập bất kỳ dữ liệu nào
|
|
271
|
-
3. Click "Save"
|
|
272
|
-
4. → Hệ thống hiển thị validation errors:
|
|
273
|
-
- Project Name: "This field is required."
|
|
274
|
-
- Customer: "Select and begin typing" (đỏ)
|
|
275
|
-
- Billing Type: "This field is required."
|
|
276
|
-
5. Người dùng cần sửa lỗi và nhấn Save lại
|
|
277
|
-
```
|
|
278
|
-
|
|
279
|
-
### Flow 03: Lọc Dự án theo Trạng thái
|
|
280
|
-
|
|
281
|
-
```
|
|
282
|
-
1. Truy cập /admin/projects
|
|
283
|
-
2. Nhìn phần "Projects Summary"
|
|
284
|
-
3. Click vào nhãn trạng thái (vd: "In Progress")
|
|
285
|
-
4. → Bảng lọc chỉ hiển thị các dự án có trạng thái tương ứng
|
|
286
|
-
```
|
|
287
|
-
|
|
288
|
-
### Flow 04: Chuyển sang Gantt View
|
|
289
|
-
|
|
290
|
-
```
|
|
291
|
-
1. Truy cập /admin/projects
|
|
292
|
-
2. Click biểu tượng Gantt (cạnh nút "New Project")
|
|
293
|
-
3. → Chuyển sang trang Gantt View với bộ lọc:
|
|
294
|
-
- Status: Not Started, In Progress, On Hold (mặc định)
|
|
295
|
-
- Project Member: Dropdown chọn thành viên
|
|
296
|
-
4. Click "Apply" để áp dụng bộ lọc
|
|
297
|
-
5. Biểu đồ timeline hiển thị tiến độ các dự án
|
|
298
|
-
```
|
|
299
|
-
|
|
300
|
-
### Flow 05: Xuất dữ liệu Dự án
|
|
301
|
-
|
|
302
|
-
```
|
|
303
|
-
1. Truy cập /admin/projects
|
|
304
|
-
2. Click nút "Export"
|
|
305
|
-
3. → Dropdown hiện 3 tùy chọn: CSV, PDF, Print
|
|
306
|
-
4. Chọn định dạng mong muốn
|
|
307
|
-
5. → File được tải xuống hoặc cửa sổ in mở ra
|
|
308
|
-
```
|
|
309
|
-
|
|
310
|
-
### Flow 06: Cấu hình Quyền hạn Khách hàng
|
|
311
|
-
|
|
312
|
-
```
|
|
313
|
-
1. Trong form tạo/sửa dự án, click tab "Project Settings"
|
|
314
|
-
2. Cấu hình "Send contacts notifications"
|
|
315
|
-
3. Chọn/bỏ chọn các "Visible Tabs" cho khách hàng
|
|
316
|
-
4. Bật/tắt từng quyền hạn khách hàng (18 checkbox)
|
|
317
|
-
5. Click "Save" để lưu cấu hình
|
|
318
|
-
```
|
|
319
|
-
|
|
320
|
-
---
|
|
321
|
-
|
|
322
|
-
## 6. Giao diện Trang danh sách (Projects List UI)
|
|
323
|
-
|
|
324
|
-
### 6.1. Thanh công cụ (Toolbar)
|
|
325
|
-
|
|
326
|
-
| # | Thành phần | Loại UI | Mô tả |
|
|
327
|
-
|---|---|---|---|
|
|
328
|
-
| 1 | + New Project | Button (xanh lá) | Tạo dự án mới |
|
|
329
|
-
| 2 | Gantt View | Icon Button | Chuyển sang chế độ xem Gantt |
|
|
330
|
-
| 3 | Filter | Icon Button (phễu) | Mở popup quản lý bộ lọc (New Filter / Saved Filters) |
|
|
331
|
-
| 4 | Table Length | Dropdown (select) | Chọn số bản ghi/trang: 25, 50, 100... (mặc định: 25) |
|
|
332
|
-
| 5 | Export | Button | Dropdown: CSV, PDF, Print |
|
|
333
|
-
| 6 | Reload | Icon Button | Làm mới dữ liệu bảng |
|
|
334
|
-
| 7 | Search | TextBox | Tìm kiếm toàn cục trên bảng |
|
|
335
|
-
|
|
336
|
-
### 6.2. Projects Summary
|
|
337
|
-
|
|
338
|
-
| # | Trạng thái | Màu sắc | Có thể click để lọc |
|
|
339
|
-
|---|---|---|---|
|
|
340
|
-
| 1 | Not Started | Đen (default) | ✅ |
|
|
341
|
-
| 2 | In Progress | Xanh dương (blue) | ✅ |
|
|
342
|
-
| 3 | On Hold | Cam (orange) | ✅ |
|
|
343
|
-
| 4 | Cancelled | Xám (grey) | ✅ |
|
|
344
|
-
| 5 | Finished | Xanh lá (green) | ✅ |
|
|
345
|
-
|
|
346
|
-
### 6.3. Bảng dữ liệu (Data Table)
|
|
347
|
-
|
|
348
|
-
| # | Tên cột | Có thể sắp xếp (Sort) | Mô tả |
|
|
349
|
-
|---|---|---|---|
|
|
350
|
-
| 1 | # | ✅ | ID dự án (số tự tăng) |
|
|
351
|
-
| 2 | Project Name | ✅ | Tên dự án, click vào → mở chi tiết |
|
|
352
|
-
| 3 | Customer | ✅ | Tên khách hàng liên kết |
|
|
353
|
-
| 4 | Tags | — | Các tag phân loại |
|
|
354
|
-
| 5 | Start Date | ✅ | Ngày bắt đầu dự án |
|
|
355
|
-
| 6 | Deadline | ✅ | Hạn chót dự án |
|
|
356
|
-
| 7 | Members | — | Avatar/tên thành viên tham gia |
|
|
357
|
-
| 8 | Status | ✅ | Trạng thái hiện tại (badge màu) |
|
|
358
|
-
|
|
359
|
-
---
|
|
360
|
-
|
|
361
|
-
## 7. Yêu cầu Phi chức năng (Non-functional Requirements)
|
|
362
|
-
|
|
363
|
-
| # | Yêu cầu | Mô tả |
|
|
364
|
-
|---|---|---|
|
|
365
|
-
| NFR-01 | Responsive Layout | Giao diện sidebar + main content tương thích desktop. Sidebar thu gọn được |
|
|
366
|
-
| NFR-02 | Hiệu năng tải trang | Danh sách dự án hỗ trợ phân trang (pagination) để xử lý lượng dữ liệu lớn |
|
|
367
|
-
| NFR-03 | Client-side Validation | Form validate ngay khi nhấn Save, không cần submit lên server |
|
|
368
|
-
| NFR-04 | AJAX Search | Dropdown Customer sử dụng AJAX để tìm kiếm, không load toàn bộ danh sách |
|
|
369
|
-
| NFR-05 | Rich Text Editor | Trường Description sử dụng TinyMCE với đầy đủ toolbar |
|
|
370
|
-
| NFR-06 | Export Performance | Hỗ trợ xuất toàn bộ dữ liệu bảng ra CSV/PDF/Print |
|
|
371
|
-
| NFR-07 | Multiple Tabs | Form tạo/sửa chia thành 2 tab rõ ràng, không mất dữ liệu khi chuyển tab |
|
|
372
|
-
|
|
373
|
-
---
|
|
374
|
-
|
|
375
|
-
## 8. Câu hỏi cần Làm rõ với PO/User
|
|
376
|
-
|
|
377
|
-
| # | Câu hỏi | Ghi chú |
|
|
378
|
-
|---|---|---|
|
|
379
|
-
| 1 | Có giới hạn ký tự cho trường **Project Name** không? (maxlength) | Không quan sát thấy `maxlength` trên DOM |
|
|
380
|
-
| 2 | Trường **Estimated Hours** có validation số dương không? Có giới hạn giá trị tối đa? | — |
|
|
381
|
-
| 3 | Khi chọn **Billing Type** = "Fixed Rate", có trường nhập **Rate Amount** xuất hiện thêm không? | Cần kiểm tra thêm sau khi chọn từng option |
|
|
382
|
-
| 4 | **Deadline** có validate phải lớn hơn **Start Date** không? | Chưa xác minh được trên giao diện |
|
|
383
|
-
| 5 | Khi **xóa dự án**, các dữ liệu liên quan (Tasks, Files, Timesheets, Invoices...) có bị cascade delete không? | Cần xác nhận business rule |
|
|
384
|
-
| 6 | Quyền tạo/sửa/xóa dự án có phân biệt theo **vai trò** (Staff role/permissions) không? | Hiện chỉ khảo sát từ tài khoản Admin |
|
|
385
|
-
| 7 | **Saved Filters** — Cấu trúc bộ lọc hỗ trợ những trường nào? (Status, Customer, Members, Tags, Date range...) | Cần tạo một filter thực tế để xác minh |
|
|
386
|
-
| 8 | Trang **chi tiết dự án** (Project Detail) có những tab/tính năng gì cụ thể? | Cần khảo sát thêm nếu nằm trong scope |
|
|
387
|
-
|
|
388
|
-
---
|
|
389
|
-
|
|
390
|
-
## Phụ lục: URL Tham chiếu
|
|
391
|
-
|
|
392
|
-
| Trang | URL |
|
|
393
|
-
|---|---|
|
|
394
|
-
| Danh sách Dự án | `https://crm.anhtester.com/admin/projects` |
|
|
395
|
-
| Tạo mới Dự án | `https://crm.anhtester.com/admin/projects/project` |
|
|
396
|
-
| Gantt View | `https://crm.anhtester.com/admin/projects/gantt` |
|