# 開發變更紀錄

## 2026-08-25

- 修復：完成率的顯示、與上週差異、更新都會對應到錯誤的週期
- 修復：Sprint 管理頁儲存週期或專案進度後沒有顯示成功訊息
- 修復：專案完成率的調整端點沒有權限檢查，任何登入者都能修改
- 新增：工時填報頁可直接調整專案完成率，不必先建立工時記錄
- 修復：inline style 違反 CSP，啟用 CSP 的環境樣式會失效

``` 說明
CSP 的 style-src 沒有開放 unsafe-inline，inline style 在啟用 CSP 的環境會被瀏覽器擋掉，
本機因為 CSP_ENABLED=false 而測不出來。改用 CSS class：

- 工時填報頁的兩處（調整完成率欄寬、所有專案 modal 寬度）
- 權限總覽頁的兩處（權限名稱欄寬）

新增與調整的兩支 CSS 改由 Vite 打包，不再走 Module::asset，
因此這批部署只需要 npm run build，不必再跑 module:publish。
（其餘既有資源仍走 Module::asset，尚未遷移。）

信件樣板的 inline style 不在此列——郵件不經過 CSP，且郵件客戶端不支援外部 CSS。
```

``` 說明
過去要調整完成率，得先替自己補一筆工時讓專案出現在列表上，改完再把工時刪掉。
現在工時記錄標題列有「調整完成率」按鈕（開啟完成度調整權限者可見），
清單涵蓋當天所有可填報的專案，儲存時只寫入完成率，不會動到任何工時記錄。

本週期尚未有紀錄的專案，預設帶入該專案先前的完成率而非 0。
這一點很重要：表單是整批送出的，若預設值是 0，只改其中一個專案按下儲存，
其餘專案的進度會全部被歸零。

專案數量多，「調整完成率」與「查看所有專案」都加上搜尋，可依名稱、客戶或流水編號過濾。
專案可能同名甚至同名同客戶，因此列表、下拉選項與兩個 modal 都會顯示流水編號與客戶，
避免選了卻分不出是哪一個。
```

``` 說明
使用者設定裡的「是否開啟專案完成度調整權限」（complete_rate_edit）先前沒有接上，
開了也沒有作用；調整完成率的端點更是完全沒有權限檢查。現在改為
complete_rate_edit 或 panel_task_sprint_edit 滿足其一才能調整
（兩者取一是因為 Sprint 管理頁走同一個端點，不能把沒開這個開關的管理者擋掉）。

該端點同時改為依請求類型回應：ajax 回 JSON、一般表單提交導回原頁。
```

``` 說明
專案進度是「每個週期一筆」，而 task:create 會把進度複製到下一週。
原本讀取端用 latest()／MAX(id) 取「最後建立的一筆」，等於讓資料庫猜是哪一週：

- 工時填報頁改完完成率後，畫面跳回別週的舊值，看起來像沒存進去
- 工時管理表（主管端）同樣顯示到別週的完成率
- 「與上週差異」在填報頁是寫死 0，永遠顯示 +0.0%
- 「上週進度」用 created_at 區間判定，補改舊資料時會抓錯
- 週期結算成「已完成」後，更新完成率會直接跳例外整頁錯誤

四處各自不同的取法統一收斂為 TaskProjectProgress::forSprint()，一律指名週期。
上一個週期改用 start_date 往前找最近一筆，不再假設「這週減七天」一定存在
（排程沒跑的那幾週本來就沒有紀錄）。

Sprint 管理頁的儲存是 ajax，成功後會 reload；原本在 reload 前才呼叫 callAlert，
toast 剛建立就被頁面刷新洗掉。改為由後端 flash 到 session，
reload 後交給 layout.js 顯示，與工時填報頁既有的做法一致。

完成率維持每週獨立，改舊週期不會連動後續週期；若因此出現數字倒退，
填報頁的「與上週差異」會顯示負數提示。
```

## 2026-08-24

- 修復：應填名單未隨人員異動同步，新人最多兩週不在名單
- 新增：人員異動即時更新應填名單
- 修復：升為 admin 或設為不顯示的人不會被移出應填名單
- 調整：名單同步的查詢數不再隨人數成長
- 新增：專案管理頁可匯出專案清單 CSV

``` 說明
名單原本只在 sprint 建立當下算一次，而 sprint 提前一週建立，
新人最多兩週不會出現在工時管理表上，離職者則一直留著拉低達成率。
改為每次 task:create 都重算尚未結束的週期，建立帳號時也會即時同步。

應填人天同時改為按實際在職工作日計算（含補班等特殊工作日），
當前與未來週期的達成率數字會因分母修正而變動，歷史週期不受影響。

人員異動（停用、啟用、刪除、改角色、改到期日、改顯示設定）不必再等隔天排程，
操作完即時反映到尚未結束的週期。特殊工作日變更仍由每日 task:create 兜底。

移出名單的條件改為與加入相同的資格標準，因此原本一直留在名單裡的
admin 與被設為不顯示的人會被移出，這些週期的達成率分母會變小。
該週已填過工時的人一律保留，不受影響。

名單同步改為一次查完整個週期的工作日並在同次同步內重用，人員異動即時觸發後
不再逐人查詢。以 30 人為例，單次同步由 455 次查詢降為 7 次。

上線前可先預演確認：
php artisan task:create --dry-run
```

``` 說明
專案管理頁「新增專案」左邊的「匯出 CSV」會即時產生下載，伺服器不留檔，
權限與專案列表相同（panel_project_view），職員看不到也下載不了。

也可用指令匯出，預設輸出 storage/app/exports/projects_status.csv，
同名檔會被覆蓋，需要保留請自行指定路徑：
php artisan project:export-status
php artisan project:export-status --output=/path/to/file.csv
```

## 2026-05-26

- 新增：專案填寫日期欄位，獨立控制工時填報起始日

## 2026-05-15

- 調整：工時管理表固定前四欄

## 2026-03-15

- 修復：工時填報專案開始日期追溯問題

## 2026-03-09

- 調整：工時統計圖表，使用堆疊長條圖

## 2026-03-04

- 移除：創建者、編輯者無用欄位
- 調整：Logger 操作記錄 頁面添加搜尋、篩選

## 2026-03-03

- 調整：群組統一名稱為部門
- 調整：工時統計圖表，新增專案類型

``` 需作步驟
php artisan user:convert-group-to-dept
```

## 2026-02-26

- 調整：麵包屑導航位置

## 2026-02-25

- 調整：Sprint 管理權限
- 調整：專案管理新增、編輯

``` 需作步驟
php artisan db:seed --class=Modules\\User\\Database\\Seeders\\RoleAndPermissionSeeder

php artisan optimize:clear
```

## 2026-02-04

- 調整：OAuth 驗證 provider
- 調整：部分整合使用 BaseModuleException

## 2026-02-02

- 修復：專案日期分配週期狀態紀錄

## 2026-01-29

- 新增：Dashboard 工時統計圖表

## 2026-01-12

- 新增：漢堡選單側邊欄，可展開、隱藏

## 2026-01-07

- 調整：專案流水編號格式 YYMMDD-N
- 調整：專案流水編號添加在 專案名稱上方

## 2026-01-06

- 調整：OAuth Controller，移除不必要資訊
- 調整：CSP Font Directive
- 修復：LoginAttempt Rule 查詢
- 調整：env() 函式 改為 config()
- 移除：JavaScript console.log

## 2026-01-05

- 調整：CSP樣式問題、移除忘記密碼功能/頁面
- 調整：env SESSION_ENCRYPT 改為 true

```env
SESSION_ENCRYPT=true
```

## 2025-12-29

- 修復：創建下一週期 command
- 調整：把 Repository 移動到 Service
- 調整：工時紀錄的 Service、Trait 改善
- 修復：工時總表使用 ISO 標準週數年份顯示
- 修復：區間統計表使用 ISO 標準週數年份顯示
- 修復：工時紀錄表使用 ISO 標準週數年份顯示
- 調整：年度統計表 JS
- 調整：使用統一的 config
- 新增：專案流水編號
- 調整：工時填報頁面，選擇專案顯示開始、預計結束日期
- 調整：專案流水編號為預設排序

## 2025-12-26

- 修復：Setting Module，部門、特殊工作日問題
- 調整：使用者管理改使用部門設定資料
- 調整：Debug 日誌檔案儲存關閉
- 修復：小時/人天切換 js

## 2025-12-24

- 新增：Setting Module
  - 調整：使用者設定、寄信設定、特殊工作日設定
  - 改善：Controller 拆分 Request、Service、Policy
  - 改善：分成多個頁面、多個 Controller，單一職責原則
- 升級：Composer、NPM 套件

## 2025-12-23

- 調整：專案管理 > 編輯專案 Modal，使用 select2、flatpickr
- 調整：專案管理 > 技術類型管理，調整 Service、Controller，調整 JS

## 2025-12-19

- 調整：工時管理 > 設定 > 使用者設定、寄信設定、特殊工作日設定
  - 使用者排序功能改善
  - 寄信設定頁面調整
  - 修復特殊工作日設定
- 調整：儀表板頁面樣式改善
- 調整：使用者設定操作組件
- 調整：權限 seeder
- 調整：專案管理頁面 JS 改善、Controller、Service 調整
- 調整：客戶管理頁面 JS 改善、Controller、Service 調整

## 2025-12-17

- 調整：使用者管理，改善邏輯、拆分Request、Service、Policy

## 2025-12-15

- 調整：登出改用從 Get 改為 Post
- 調整：部分樣式、inline 問題
- 修復：使用者管理列表
- 調整：區間統計表 index js、新增 flatpickr 套件

## 2025-12-13

- 調整：開發 docker 環境
- 修復：npm 漏洞、升級 vite / composer 套件

```bash
composer i
npm ci
npm run build
```

## 2025-12-04

- 調整：轉移 Project Module 相關

```bash
php artisan config:clear
php artisan db:seed --class="Modules\\User\\Database\\Seeders\\InitPermissionRoleSeeder"
```

## 2025-12-01

- 新增：Project Module
- 調整：「隱藏未執行案子」預設勾選
- 改善：篩選、切換人天/小時 JS
- 新增：husky 套件
- 調整：限制只有本公司網域能登入OAuth
- 移除：工時不足的個人通知
- 調整：編輯專案客戶使用 select2 選擇

```bash
npm i
npm run build
php artisan module:publish
```

## 2025-11-27

- 調整：移除舊 alert，使用ES6 模組的 alert.js
- 調整：使用者 ajax 改爲 axios
