# 手動功能測試清單（測試站）

> 測試站：http://wing.dpdns.org（請先 Ctrl+F5 強制重新整理）
> 建議開兩個帳號：一個 admin、一個一般帳號（頁面權限各設幾種等級），許多項目要交叉測。

## A. 工人檔案（近期新增欄位）

| # | 步驟 | 預期結果 | 通過 |
|---|---|---|---|
| A1 | 詳情頁 →「合約與證件」卡 | 出現「續約人工」「替補信有效期」兩列；未填顯示「未填寫」 | ☐ |
| A2 | 詳情頁 →「在勞工總表中檢視此工人」按鈕 | 跳到勞工總表且該工人被篩選出來 | ☐ |
| A3 | 編輯頁填續約人工 19000、替補信有效期日期，儲存 → 重開詳情頁 | 兩值正確顯示 | ☐ |
| A4 | 新增工人頁也有这两個欄位並可儲存 | 同上 | ☐ |
| A5 | 續約人工填負數 / 替補信填亂字 | 驗證錯誤訊息，不寫入 | ☐ |
| A6 | 詳情頁 gender 欄（選單改值後提交） | 只接受 男/女，其他被擋 | ☐ |

## B. 勞工總表

| # | 步驟 | 預期結果 | 通過 |
|---|---|---|---|
| B1 | 開勞工總表 | 有分頁（每頁 50 筆）；序號跨頁連續（第 2 頁由 51 開始） | ☐ |
| B2 | 搜尋關鍵字後翻頁 | 關鍵字條件維持（URL 帶 keyword） | ☐ |
| B3 | 「匯出 Excel」 | 下載 44 欄完整檔案（不分頁、全量匯出） | ☐ |
| B4 | 匯出檔再用「Excel 匯入」傳回 | 可正常匯入、資料不跑位 | ☐ |
| B5 | 搜尋姓名含特殊字元（% _ \） | 只回傳精確命中，不產生萬用字元搜尋 | ☐ |

## C. 收租月曆（本次修復的功能）

| # | 步驟 | 預期結果 | 通過 |
|---|---|---|---|
| C1 | 宿舍管理 → 收租月曆 → 點「未收」月份 → 輸入備註 → 儲存 | 顯示成功，月份變「已收」，重開還在 | ☐ |
| C2 | 點已收月份 → 取消 | 變回未收 | ☐ |
| C3 | 宿舍未設月租時標記已收 | 提示「請先設定月租」 | ☐ |
| C4 | 收租管理頁核對 | 剛標記的月份有對應支出記錄 | ☐ |

## D. 收支表附件（安全修復後回歸）

| # | 步驟 | 預期結果 | 通過 |
|---|---|---|---|
| D1 | 收支表 → 上傳 PDF 附件 | 成功 | ☐ |
| D2 | 上傳 .exe/.html/.jpg（若站只准 PDF 請改測 jpg 依實際設定） | 被擋「只接受 PDF 格式」 | ☐ |
| D3 | 新增收支時一併附檔案 | 正常儲存 | ☐ |
| D4 | 「下載 ZIP」全年 | 附件在 ZIP 內、檔名正常、無路徑跳脫 | ☐ |

## E. 頁面權限（本次核心修復，用一般帳號測）

| # | 步驟 | 預期結果 | 通過 |
|---|---|---|---|
| E1 | admin 在帳號管理把測試帳號「問題追蹤板」設不顯示 → 該帳號直連 /issues/1/attachments/x/view（任一附件 id） | 403 | ☐ |
| E2 | 同帳號直連 PUT /dorm-rooms/{id}（用瀏覽器 devtools 或 curl 帶 cookie） | 403（以前會放行） | ☐ |
| E3 | 「公司與店鋪」設唯讀 → 試 /branches/{id}/edit 或 PUT | 403 / 唯讀擋下（branches 現歸 companies 頁管） | ☐ |
| E4 | 「資料新增」設不顯示 → POST /labor-officers | 403 | ☐ |
| E5 | 「收租管理」設唯讀、「會計收支表」單獨設不顯示 → 直連 /accounting-statement | 403（statement 權限現在真的有效，不再被 rent 吃掉） | ☐ |
| E6 | 「收租管理」設不顯示但收支表設可編輯 → /accounting-statement 可進 | 可進（兩個權限正式分開） | ☐ |
| E7 | 一般帳號（工種頁不屬任何頁面）→ 履歷頁工種 Modal 新增工種 | 仍可新增（刻意開放，非漏洞） | ☐ |

## F. 帳號／登入／Session

| # | 步驟 | 預期結果 | 通過 |
|---|---|---|---|
| F1 | 同一帳號故意連錯密碼 10 次 | 第 11 次起顯示「失敗次數過多，請 X 秒後再試」（10 分鐘） | ☐ |
| F2 | 改密碼後，用另一瀏覽器保持登入 → 重新整理 | 另一處被登出；本處仍登入 | ☐ |
| F3 | admin 重設他人密碼 / 改他人角色權限 | 該帳號所有裝置被登出、新權限立即生效 | ☐ |
| F4 | admin 在帳號管理把自己設最後一位 admin 並降權 | 擋下「至少保留一名管理員」 | ☐ |
| F5 | 個人設定改密碼：目前密碼填錯 | 擋下 | ☐ |

## G. Excel 匯入／匯出（公式注入修復）

| # | 步驟 | 預期結果 | 通過 |
|---|---|---|---|
| G1 | 新增工人姓名填 `=1+1` 或 `=HYPERLINK("http://evil","x")` → 匯出工人名單/勞工總表 Excel | 儲存格顯示為文字，不被執行、不跳安全警告 | ☐ |
| G2 | 收支表項目填 `@SUM(1+9)*cmd|'/c calc'!A0` → 匯出收支表 Excel | 同上，純文字 | ☐ |
| G3 | 匯入含「無勞工處編號」行 + 既有另一筆進度記錄（labor_dept_no 為空）的檔案 | 不再錯蓋那筆進度資料；比對：匯入前後該筆內容不變 | ☐ |
| G4 | 正常 44 欄模板匯入 2 筆同公司名工人 | 只建 1 家公司（不重複），且重複被 DB 唯一索引擋住 | ☐ |

## H. 鈴鐺／通知

| # | 步驟 | 預期結果 | 通過 |
|---|---|---|---|
| H1 | 造一筆「逾期且指派給自己」的問題 | 鈴鐺數字只加 1（不重複計） | ☐ |
| H2 | 點自己的通知「標為已讀」；試改 URL id 為別人的通知 id | 自己的成功；別人的 403 | ☐ |

## I. 既有核心功能回歸（大改後必測）

| # | 步驟 | 預期結果 | 通過 |
|---|---|---|---|
| I1 | 儀表板各卡片數字、到期提醒 | 正常顯示 | ☐ |
| I2 | 工人詳情頁「立即匯出」Word | 可下載、內容正確 | ☐ |
| I3 | 文件管理：上傳 PDF → 預覽（簽章網址）→ 非上傳者當日刪 | 正常；過期簽章 403 | ☐ |
| I4 | 智能宿位分配：選 A 宿舍 + B 宿舍的房 → 指派 | 被擋（驗證 + Service 雙重檢查） | ☐ |
| I5 | 宿舍管理：新增房、改房、刪房（權限分級都試） | 依權限通過/擋下 | ☐ |
| I6 | 申請批文進度 / 勞工申請進度 CRUD | 正常 | ☐ |
| I7 | 問題板：開單→回覆→編輯自己回覆→關閉→重開 | 正常；非本人不能改別人回覆 | ☐ |
| I8 | 會計：月產生、鎖月/解鎖、月報 PDF/Excel | 正常；鎖月後改動被擋 | ☐ |
| I9 | 操作日誌有無異常 flood（改 session 清掉不該記的） | 密碼變更不入內容日誌 | ☐ |
| I10 | 瀏覽器 devtools 看 console | 各頁無 JS 錯誤 | ☐ |

## J. 部署驗證（給你自己核對用）

- [ ] 後台「勞工總表」分頁可翻；「匯出 Excel」仍為全量 44 欄
- [ ] 收租月曆儲存不再出現「儲存失敗，請重試」
- [ ] 一般帳號的權限設定真的生效（E 組）
- [ ] users 表無多餘 admin（`SELECT id,username,role FROM users` 核對一次；歷史 migration 曾把舊帳號全部升 admin）
- [ ] 正式啟用前：刪 demo_iris/demo_kent 帳號或改掉 demo12345 密碼；上 HTTPS + SESSION_SECURE_COOKIE
