# Mục 1.4.5 — Cập nhật tài liệu 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;
> 1.4.4 và 1.4.5 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.5-<mã case>-<ts>`. Khi QA chốt: sửa tên test + prefix ở
> [`1.4.5.setup.ts`](./1.4.5.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.5.<mã case>.spec.ts` của chính case đó (hàm dùng chung thì tự mô tả bằng JSDoc trong
> [`1.4.5.steps.ts`](./1.4.5.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.5.**
>
> Tài liệu màn hình: `src/screen-instructions/KHO-TAI-LIEU.md` (+ `MODAL-TAO-TAI-LIEU.md` mục **6**
> — màn chi tiết Tài liệu, `TAB-TAI-LIEU-SO.md` mục **1–2** — xếp lớp modal & 3 tab,
> `MODAL-CAP-NHAT-QUYEN-TAI-LIEU.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.5

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.4 (cùng màn, cùng nhóm vai, đối tượng là tài liệu);
**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 Bộ hồ sơ / thư mục / tài liệu: BHS **"Đang hoạt động"**.
- Người dùng / Nhóm được phân quyền **Cập nhật** tại Bộ hồ sơ / thư mục / tài liệu: 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
   (`chuyenSangHoatDong: true`).
2. **`recordUrl` của BHS phải lưu TRƯỚC khi tạo tài liệu** (`KHO-TAI-LIEU.md` mục 9.3): tạo tài liệu
   xong `page.url()` bị thay bằng URL của tài liệu vừa tạo.
3. **Không mở tài liệu bằng URL `?itemId=<id tài liệu>`** — đường đi duy nhất đã kiểm chứng là
   BHS → tab "Cấu trúc hồ sơ" → click tên tài liệu (`openChiTietTaiLieu`), xem
   `KHO-TAI-LIEU.TAB-TAI-LIEU-SO.md` mục 1.

---

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

Dựng qua `dungDuLieuCapNhatTaiLieu()` trong [`1.4.5.setup.ts`](./1.4.5.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 `dungDuLieuCapNhatTaiLieu` → 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**, cấp quyền cho vai, và **tài liệu được tạo bên trong thư mục đó** | `Hoạt động` |

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

```
BHS  AT-1.4.5-<maCase>-<ts>                  (Owner = người gọi; + quyenBoHoSo nếu có)
 ├─ AT-1.4.5-<maCase>-<ts>-TL-CU             ← tài liệu ở GỐC BHS (khi không có quyenThuMuc)
 └─ AT-1.4.5-<maCase>-<ts>-TM                ← chỉ khi có quyenThuMuc: thư mục quyền ĐỘC LẬP
      └─ AT-1.4.5-<maCase>-<ts>-TL-CU          + tài liệu nằm bên trong thư mục đó
```

Tên dùng cho bước sửa (`tenTaiLieuMoi` = `...-TL-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.5.steps.ts`](./1.4.5.steps.ts).

⚠️ Tên cũ / tên mới đặt hậu tố khác nhau (`-TL-CU`, `-TL-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.5

| Mã  | UC   | Nội dung testcase                                 | File                                       | Trạng thái                                     |
| --- | ---- | ------------------------------------------------- | ------------------------------------------ | ---------------------------------------------- |
| 529 | UC?? | Kiểm tra button **Lưu** khi nhập thông tin hợp lệ | [`1.4.5.529.spec.ts`](./1.4.5.529.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).
