# Mục 1.4.16 — Khôi phục cấu trúc hồ sơ đã xóa (Quản lý cấu trúc đã xóa)

> 📌 **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à script 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. Những thứ đó là **logic của case** → khối comment đầu file
> `1.4.16.<mã case>.spec.ts` của chính case đó.

> **Đọc file này trước khi viết bất kỳ case nào của mục 1.4.16.**
>
> Tài liệu màn hình: `src/screen-instructions/KHO-TAI-LIEU.md` +
> **`KHO-TAI-LIEU.MODAL-KHOI-PHUC-CAU-TRUC-DA-XOA.md`** (modal "Quản lý cấu trúc đã xóa", dialog xoá).
> Quy ước đặt tên & cấu trúc: `CLAUDE.md`. Fixture/TIMEOUT/PW: `tests/README.md`.

> ⚠️ **Mã UC chưa được xác nhận** → spec đang ghi `UC??`. QA/người dùng chốt mã UC thì sửa lại tên
> test + comment đầu spec.

---

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

Chưa có bản **nguyên văn QA** cho toàn mục — người dùng mới gửi phần Thao tác của từng case.
Điều kiện tối thiểu suy ra từ chức năng (thay bằng nguyên văn khi QA gửi):

- Có 1 **Bộ hồ sơ** và ít nhất 1 item trong Cấu trúc hồ sơ (Thư mục / Tài liệu) **đã bị xóa**.
- Vai thao tác phải **mở được BHS** và thấy mục `btn-quan-ly-cau-truc-da-xoa` trong menu `btn-more`
  của header BHS (mục này **không có** ở menu `btn-more` của bảng Cấu trúc hồ sơ).

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) → cần `chuyenHoatDong` trước khi vai đó thao tác.
   Case nào để **chính người tạo BHS** thao tác thì không cần bước này.
2. **Nguồn dữ liệu của màn "Quản lý cấu trúc đã xóa" là thao tác xóa** — muốn có item để khôi phục
   thì script phải tự xóa trước (`xoaItemCauTruc`), không có cách dựng sẵn nào khác.

---

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

| Vai         | Fixture     | Cách dựng                                                                    | Trạng thái BHS |
| ----------- | ----------- | ---------------------------------------------------------------------------- | -------------- |
| Thủ thư     | `librarian` | Chính nó tạo BHS + tài liệu nên là **Owner**, thao tác luôn trên phiên đó     | `Khai báo`     |
| ITAdmin     | `admin`     | Như trên                                                                     | `Khai báo`     |

> Case cần vai **không phải người tạo BHS** (Owner được cấp quyền, Owner thư mục, nhóm…) thì bổ sung
> dòng vào bảng này kèm cách cấp quyền, và nhớ `chuyenHoatDong` theo ràng buộc 1 ở trên.

### Dữ liệu case của mục hiện dựng ra

```
BHS  AT-1.4.16-<maCase>-<ts>
 └─ AT-1.4.16-<maCase>-<ts>-TL1        ← tài liệu ở GỐC BHS (không nằm trong thư mục nào)
```

⚠️ Mỗi test **tự dựng BHS riêng** (tên có `Date.now()`) để chạy song song được và để danh sách
"cấu trúc đã xóa" của BHS đó chỉ chứa đúng item của case.

---

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

| Mã  | UC   | Nội dung testcase                                              | File                                             | Trạng thái                          |
| --- | ---- | -------------------------------------------------------------- | ------------------------------------------------ | ----------------------------------- |
| 917 | UC?? | Khôi phục thành công 01 tài liệu đơn lẻ về đúng vị trí cũ      | [`1.4.16.917.spec.ts`](./1.4.16.917.spec.ts)     | 2 test (Thủ thư + Admin). Viết 2026-08-14. Chạy sitdev 2026-08-14: **PASS 2/2** (~3.8 phút/test) |

> 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).
