# Mục 1.4.9 — Nhân bản Thư mục / Tài liệu trong Cấu trúc hồ sơ (UC??)

> ⚠️ **Mã UC chưa được chốt** (2026-08-14). Đã biết: 1.4.1 = UC22, 1.4.2 = UC23, 1.4.6 = UC25;
> 1.4.4, 1.4.5, 1.4.7, 1.4.8 và 1.4.9 chưa có xác nhận của QA. Tạm ghi `UC??` trong tên test và dùng
> prefix dữ liệu `AT-1.4.9-<mã case>-<ts>`. Khi QA chốt: sửa tên test + prefix trong **từng spec**
> và bảng danh sách case bên dưới.

> 📌 **PHẠM VI FILE NÀY — CHỈ TIỀN ĐIỀU KIỆN CHUNG CỦA CẢ BỘ CASE.**
>
> Được ghi ở đây: nguyên văn tiền điều kiện QA, cách đọc nó, bảng "vai → cách script dựng dữ liệu",
> dữ liệu mà setup tạo ra, danh sách case của mục.
>
> **KHÔNG** ghi ở đây: thao tác/kỳ vọng của từng case, cách assert, giả định khi viết case, điểm cần
> QA/DEV chốt, bảng hàm dùng chung. Những thứ đó là **logic của case** → mô tả trong khối comment đầu
> file `1.4.9.<mã case>.spec.ts` của chính case đó (hàm dùng chung thì tự mô tả bằng JSDoc trong
> [`1.4.9.steps.ts`](./1.4.9.steps.ts) / `KHO-TAI-LIEU.functions.ts`).

> **Đọc file này trước khi viết bất kỳ case nào của mục 1.4.9.**
>
> Tài liệu màn hình: `src/screen-instructions/KHO-TAI-LIEU.md` (+ mục **4.4** — menu hành động của
> dòng bảng Cấu trúc hồ sơ, nơi có mục `mni-nhan-ban`; và `KHO-TAI-LIEU.MODAL-TAO-THU-MUC.md` mục
> **6b** — modal "Cập nhật thư mục").
> Quy ước đặt tên & cấu trúc: `CLAUDE.md`. Fixture/TIMEOUT/PW: `tests/README.md`.

---

## 1. Tiền điều kiện chung của mục 1.4.9

Chưa có bản **nguyên văn QA** cho toàn mục — hiện chỉ có phần thao tác của từng case do người dùng
gửi. Bản dưới đây suy ra từ mục 1.4.2 / 1.4.7 / 1.4.8 (cùng màn, cùng nhóm vai, cùng đối tượng là
thư mục / tài liệu trong Cấu trúc hồ sơ); **thay bằng nguyên văn khi QA gửi**:

- Thủ thư / ITAdmin / Người dùng được phân quyền **tạo mới bộ hồ sơ**: BHS ở trạng thái
  **"Khai báo"** hoặc **"Đang hoạt động"**.
- Người dùng / Nhóm được phân quyền **Owner / Tạo mới** của Bộ hồ sơ: BHS **"Đang hoạt động"**.

Cách đọc tiền điều kiện: xem `CLAUDE.md` mục "Đọc tiền điều kiện của testcase QA" — vai QA ghi là
có quyền thì **mặc định làm được** tới bước Mong muốn; quyền **cấp lớn bao trùm cấp nhỏ**.

### 🚨 Ràng buộc bắt buộc khi dựng dữ liệu

1. **Mỗi case tự dựng BHS mới** (`dungThuMucLongNhau`) để chạy song song được và để mọi item thấy
   sau thao tác đều do case đó sinh ra.
2. **Vai không phải người tạo BHS chỉ mở được BHS ở trạng thái "Hoạt động"**
   (`KHO-TAI-LIEU.PHAN-QUYEN-THEO-VAI.md` mục 1) → case nào để vai khác thao tác thì phải
   `chuyenHoatDong` trước.
3. **`recordUrl` của BHS phải lưu ngay sau khi tạo** (`KHO-TAI-LIEU.md` mục 9.3) — `createBoHoSo`
   đã trả về sẵn, luôn mở lại BHS bằng biến này. Thao tác `mni-nhan-ban` và `mni-cap-nhat` đều
   **đổi `page.url()`** sang item vừa mở nên biến này là đường về duy nhất.
4. **Tên thư mục phải unique và không tên nào là tiền tố của tên khác** — `getCauTrucRow` khớp theo
   **chuỗi con**, mà bản sao lại mang tên `"Copy of <tên gốc>"` (chứa nguyên tên gốc) → sau khi nhân
   bản, tra dòng theo tên phải đối chiếu **tên đã tách mã prefix** (`phanTichDongCauTruc`), đừng
   dùng `hasText`.

### 🚨 Chưa khảo sát: chức năng "Nhân bản"

Bộ case này viết theo yêu cầu **"không sử dụng MCP để khảo sát màn hình"** (2026-08-14). Phần **đã
khảo sát** chỉ gồm: menu hành động của dòng thư mục và mục `mni-nhan-ban` trong đó
(`KHO-TAI-LIEU.md` mục 4.4). Những điểm sau **do QA mô tả, chưa đọc DOM**:

| Điểm                                             | Nguồn                  |
| ------------------------------------------------ | ---------------------- |
| Toast `"Nhân bản hoàn thành"`                    | QA mô tả 2026-08-14    |
| Sau nhân bản app mở **màn cập nhật của bản sao** | QA mô tả 2026-08-14    |
| Tên bản sao = `"Copy of " + <tên gốc>`           | QA mô tả 2026-08-14    |
| Bản sao giữ nguyên cây con bên trong             | QA mô tả 2026-08-14    |

→ Chạy thật mà lệch: khảo sát bằng `/khao-sat-man-hinh`, thay bằng testId thật rồi bổ sung mô tả vào
tài liệu màn hình. **Đừng** vá bằng selector đoán thêm.

---

## 2. Bảng vai → cách script dựng dữ liệu

**Mục này KHÔNG có file `1.4.9.setup.ts`**: mỗi case dựng một cây khác nhau nên phần tiền điều kiện
viết **thẳng trong spec** bằng `createBoHoSo` / `createThuMuc` / `createTaiLieu`. File
[`1.4.9.steps.ts`](./1.4.9.steps.ts) chỉ giữ những bước **thật sự dùng ở ≥ 2 case**
(nhân bản thư mục + assert quan hệ cha–con). Mỗi test **tự dựng BHS riêng** để chạy song song được.

| Vai QA nêu                    | Fixture     | Cách dựng                                                                                          | Trạng thái BHS |
| ----------------------------- | ----------- | -------------------------------------------------------------------------------------------------- | -------------- |
| Thủ thư                       | `librarian` | Chính nó gọi `createBoHoSo` → tự tạo BHS nên là **Owner**                                           | `Khai báo`     |
| ITAdmin                       | `admin`     | Như trên                                                                                           | `Khai báo`     |
| Người dùng được **Owner** BHS | `ecm05`     | người tạo dựng + `createBoHoSo(..., { peoplePickers: [{ testId: DOC_PERM.OWNER, account }] })`, rồi `chuyenHoatDong` | `Hoạt động` |
| **Nhóm** được Owner / Tạo mới | `ecm06`     | như trên với `account: GROUP.ECM06` (`AUTO_GROUP_ECM06`, thành viên `ecm06`), thao tác bằng `ecm06` | `Hoạt động`    |

### Quy ước tên dữ liệu dùng chung cho cả mục

```
BHS  AT-1.4.9-<maCase>-<ts>                (Owner = người tạo)
 ├─ AT-1.4.9-<maCase>-<ts>-TM1             ← "thư mục 1" — ở gốc BHS, kế thừa quyền BHS
 ├─ AT-1.4.9-<maCase>-<ts>-TM2 / -TL1      ← item con bên trong thư mục 1
 └─ AT-1.4.9-<maCase>-<ts>-TL2             ← item ở gốc BHS, ngang cấp thư mục 1
```

Cây cụ thể của từng case xem phần đầu spec của case đó.

---

## 3. Danh sách case của mục 1.4.9

| Mã  | UC   | Nội dung testcase                                                          | File                                       | Trạng thái                                               |
| --- | ---- | -------------------------------------------------------------------------- | ------------------------------------------ | -------------------------------------------------------- |
| 710 | UC?? | Kiểm tra **Nhân bản Thư mục** thành công (thư mục con bên trong)            | [`1.4.9.710.spec.ts`](./1.4.9.710.spec.ts) | 2 test (Thủ thư + Admin). Viết 2026-08-14. **Chưa chạy** |
| 720 | UC?? | Kiểm tra **Nhân bản Thư mục** thành công (tài liệu bên trong) + nhân bản Tài liệu | [`1.4.9.720.spec.ts`](./1.4.9.720.spec.ts) | 2 test (Thủ thư + Admin). Viết 2026-08-14. **Chưa chạy** |

> Viết case mới → thêm 1 dòng vào bảng này (chỉ **nội dung testcase + file + trạng thái chạy**,
> không mô tả cách làm / kỳ vọng).
