# Mục 1.4.4 — Cập nhật thư mục trong Cấu trúc hồ sơ (UC??)

> ⚠️ **Mã UC chưa được chốt** (2026-08-05). Đã biết: 1.4.1 = UC22, 1.4.2 = UC23, 1.4.6 = UC25 →
> mục này **có thể** là UC24 nhưng 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.4-<mã case>-<ts>`. Khi QA chốt: sửa tên test + prefix ở
> [`1.4.4.setup.ts`](./1.4.4.setup.ts) 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.4.<mã case>.spec.ts` của chính case đó (hàm dùng chung thì tự mô tả bằng JSDoc trong
> [`1.4.4.steps.ts`](./1.4.4.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.4.**
>
> Tài liệu màn hình: `src/screen-instructions/KHO-TAI-LIEU.md` (+ `MODAL-TAO-THU-MUC.md` mục **6b**
> — modal "Cập nhật thư mục", `MODAL-PHAN-QUYEN-NANG-CAO.md`, `PHAN-QUYEN-THEO-VAI.md`).
> 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.4

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.1 / 1.4.6 (cùng màn, cùng nhóm vai, cùng đối tượng là thư mục);
**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** của thư mục: BHS **"Đang hoạt động"**.
- Người dùng / Nhóm được phân quyền **Cập nhật** tại thư mục: 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. **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) → phải `chuyenHoatDong` trước khi vai đó thao tác.
2. **Mở màn "Cập nhật thư mục" đổi `page.url()`** sang `itemId` của thư mục
   (`KHO-TAI-LIEU.md` mục 4.4) → luôn giữ `recordUrl` của BHS và mở lại BHS ở bước sau.

---

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

Dựng qua `dungDuLieuCapNhatThuMuc()` trong [`1.4.4.setup.ts`](./1.4.4.setup.ts); 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 `dungDuLieuCapNhatThuMuc` → 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 + `quyenBoHoSo: { permTestId: DOC_PERM.OWNER, account: "ecm05" }` + `chuyenSangHoatDong: true`                 | `Hoạt động`    |
| Người dùng được **Cập nhật** BHS       | `ecm05`     | như trên với `DOC_PERM.EDIT`                                                                                                 | `Hoạt động`    |
| **Nhóm** được Owner / Cập nhật         | `ecm06`     | như trên nhưng `account: GROUP.ECM06` (`AUTO_GROUP_ECM06`, thành viên `ecm06`), thao tác bằng `ecm06`                          | `Hoạt động`    |
| Chỉ có quyền **tại 1 thư mục**         | `ecm06`     | `quyenThuMuc: { permTestId: FOLDER_PICKER.OWNER \| EDIT, account }` — thư mục đó **đặt quyền độc lập** rồi cấp quyền cho vai   | `Hoạt động`    |

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

```
BHS  AT-1.4.4-<maCase>-<ts>              (Owner = người gọi; + quyenBoHoSo nếu có)
 └─ AT-1.4.4-<maCase>-<ts>-TM-CU         ← thư mục ở gốc BHS (quyền ĐỘC LẬP khi có quyenThuMuc,
                                           ngược lại KẾ THỪA quyền BHS)
```

Tên dùng cho bước sửa (`tenThuMucMoi` = `...-TM-MOI`) **chỉ được sinh sẵn** — việc đổi tên là phần
Thao tác của case nên nằm ở [`1.4.4.steps.ts`](./1.4.4.steps.ts).

⚠️ Tên cũ / tên mới đặt hậu tố khác nhau (`-TM-CU`, `-TM-MOI`) và **không tên nào là tiền tố của tên
khác**: `getCauTrucRow` / `getCodeCuaItemPhanQuyen` khớp theo **chuỗi con**, nên tên mới kiểu
`<tên cũ>-DOI-TEN` sẽ khớp nhầm cả 2 và không assert được "tên cũ đã biến mất".

---

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

| Mã  | UC   | Nội dung testcase                                     | File                                       | Trạng thái                     |
| --- | ---- | ----------------------------------------------------- | ------------------------------------------ | ------------------------------ |
| 454 | UC?? | Kiểm tra button **Lưu** khi nhập thông tin hợp lệ     | [`1.4.4.454.spec.ts`](./1.4.4.454.spec.ts) | 1 test (Admin). Viết 2026-08-05. **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).
