# Mục 1.4.6 — Cập nhật quyền của thư mục, tài liệu trong Cấu trúc hồ sơ (UC25)

> **Đọc file này trước khi viết/sửa case của mục 1.4.6.**
> Nơi lưu **tiền điều kiện chung** do QA gửi + cách script dựng nó (mỗi spec vẫn ghi lại nguyên văn
> testcase của riêng nó ở khối comment đầu file).
>
> Tài liệu màn hình: `src/screen-instructions/KHO-TAI-LIEU.md` (+ `MODAL-TAO-THU-MUC.md`,
> `MODAL-CAP-NHAT-QUYEN-TAI-LIEU.md`, `MODAL-PHAN-QUYEN-NANG-CAO.md`).

---

## 1. Tiền điều kiện chung của mục 1.4.6 — NGUYÊN VĂN QA

> - 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** của TM/TL, trạng thái TL **đang hoạt động**.
> - Người dùng / Nhóm được phân quyền **Cập nhật** tại TM/TL, trạng thái TL **đang hoạt động**.

Một số case có **tiền điều kiện thêm** về trạng thái kế thừa của item con
(đang kế thừa / đã có quyền riêng tư) — ghi trong comment đầu file spec tương ứ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; quyền cấp lớn bao trùm cấp nhỏ).

---

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

Dựng qua `dungDuLieuThuMuc()` trong [`1.4.6.setup.ts`](./1.4.6.setup.ts); chuỗi thao tác dùng chung
ở [`1.4.6.steps.ts`](./1.4.6.steps.ts). Mỗi test **tự dựng BHS riêng**.

| Vai QA nêu                          | Fixture     | Cách dựng                                                                                   | Trạng thái BHS |
| ----------------------------------- | ----------- | ------------------------------------------------------------------------------------------- | -------------- |
| Thủ thư                             | `librarian` | Chính nó dựng dữ liệu → 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** tại TM/TL | `ecm06`     | `librarian` dựng + `quyenBanDau: { permTestId: DOC_PERM.OWNER, account: "ecm06" }` + `chuyenSangHoatDong` | `Hoạt động` |
| **Nhóm** được Owner tại TM/TL       | `ecm06`     | như trên với `account: GROUP.ECM06` (`AUTO_GROUP_ECM06`)                                     | `Hoạt động`    |
| Người dùng được **Cập nhật** TM/TL  | `ecm05`     | như trên với `DOC_PERM.EDIT`                                                                 | `Hoạt động`    |

### Tên hiển thị của người được cấp quyền — lấy động, không hard-code

Bảng quyền chỉ hiển thị **tên**, nên mỗi test **inject thêm fixture của account được cấp quyền**
(vd `ecm07`) rồi lấy tên từ phiên của họ:

```ts
async ({ librarian, ecm06, ecm07 }) => {   // ecm06 thao tác, ecm07 là người được thêm quyền
  await runTestVaiDuocPhanQuyen(librarian, ecm06, "OWN",
    { account: "ecm06", permTestId: DOC_PERM.OWNER },
    { account: "ecm07", page: ecm07 });    // → layTenDoiTuongPhanQuyen đọc tên từ avatar
}
```

Tốn thêm 1 phiên browser mỗi account, nhưng **tên user có thể bị đổi trong lúc test** nên không
hard-code (`TEN_HIEN_THI` chỉ còn là phương án cuối — xem `KHO-TAI-LIEU.md` mục 9.10).
Nhóm người dùng không đăng nhập được → truyền `{ account: GROUP.ECM06 }` (không có `page`), hàm trả
về chính tên nhóm.

Quyền cấp ở **BHS lúc tạo** rồi để TM/TL **kế thừa** xuống — nhờ vậy TM/TL vẫn ở trạng thái
"Kế thừa" và vẫn còn nút "Đặt quyền độc lập" cho case thao tác
(xem `KHO-TAI-LIEU.PHAN-QUYEN-THEO-VAI.md` mục 4).

### Dữ liệu `dungDuLieuThuMuc` tạo ra

```
BHS  AT-UC25-<maCase>-<ts>            (Owner = người tạo; + quyenBanDau nếu có)
 └─ ...-TM                            ← thư mục ở gốc BHS, đang KẾ THỪA
     ├─ ...-TMC                       ← thư mục con, KẾ THỪA        (khi taoItemCon)
     └─ ...-TL                        ← tài liệu, KẾ THỪA           (khi taoItemCon)
```

---

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

| Mã  | UC   | Mô tả                                                             | File                                       |
| --- | ---- | ----------------------------------------------------------------- | ------------------------------------------ |
| 586 | UC25 | Cập nhật phân quyền của **Thư mục** — enable 5 trường quyền       | [`1.4.6.586.spec.ts`](./1.4.6.586.spec.ts) |
| 587 | UC25 | **Lưu** cập nhật phân quyền cho Thư mục                            | [`1.4.6.587.spec.ts`](./1.4.6.587.spec.ts) |
| 606 | UC25 | Phân quyền của TM/TL con — con **đang kế thừa** → nhận quyền cha   | [`1.4.6.606.spec.ts`](./1.4.6.606.spec.ts) |
| 607 | UC25 | Phân quyền của TM/TL con — con **không kế thừa** → giữ nguyên      | [`1.4.6.607.spec.ts`](./1.4.6.607.spec.ts) |
| 608 | UC25 | Cập nhật phân quyền của **Tài liệu** — enable 5 trường quyền       | [`1.4.6.608.spec.ts`](./1.4.6.608.spec.ts) |
| 609 | UC25 | **Lưu** phân quyền cho TL — TL **đang kế thừa** → Quyền riêng tư   | [`1.4.6.609.spec.ts`](./1.4.6.609.spec.ts) |
| 610 | UC25 | **Lưu** phân quyền cho TL — TL **đã quyền riêng tư** → giữ nguyên  | [`1.4.6.610.spec.ts`](./1.4.6.610.spec.ts) |
