{"openapi":"3.1.0","info":{"title":"豬博士 iPig 系統 API","description":"豬博士 iPig 系統後端 API（GLP 合規之整合型實驗動物管理平台）。\n\n**AI Agent 整合**：\n- A2A Agent Card：`/.well-known/agent.json`\n- MCP Discovery：`/.well-known/mcp.json`，端點 `/api/v1/mcp`（JSON-RPC 2.0）\n- WebMCP Manifest：`/.well-known/webmcp.json`\n- LLM 友善說明：`/llms.txt`\n\n**認證**：\n- Web Session：經 `/api/v1/auth/login` 取得 HttpOnly Cookie JWT，可選 TOTP 2FA\n- MCP API Key：Bearer token，前綴 `mcp_`，由系統管理員於 `user_mcp_keys` 發放\n- AI API Key：Bearer token，前綴 `ai_`，僅可呼叫 `/api/v1/ai`\n\n**速率限制**：每 IP 每分鐘 60 請求，burst 20（由 nginx 與 Cloudflare WAF 雙層防護）。\n\n**回應格式**：所有錯誤統一為 `AppError`，回傳 JSON `{ \"error\": { \"code\": ..., \"message\": ... } }`。","contact":{"name":"豬博士 iPig 系統團隊","url":"https://ipigsystem.asia/"},"license":{"name":"MIT","identifier":"MIT"},"version":"2.0.0"},"paths":{"/api/health":{"get":{"tags":["監控"],"operationId":"health_check","responses":{"200":{"description":"健康檢查正常","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}},"503":{"description":"服務 degraded（DB 連線失敗）","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/api/metrics/vitals":{"post":{"tags":["監控"],"summary":"POST /api/metrics/vitals — 接收前端 Web Vitals 指標","description":"開發環境可記錄至日誌；正式環境可轉送 APM 或儲存。","operationId":"vitals_handler","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebVitalsMetric"}}},"required":true},"responses":{"204":{"description":"已接收"}},"security":[{"bearer":[]}]}},"/api/v1/accounting/ap-aging":{"get":{"tags":["會計"],"summary":"取得應付帳款帳齡","operationId":"get_ap_aging","responses":{"200":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/accounting/ap-payments":{"post":{"tags":["會計"],"summary":"建立 AP 付款","operationId":"create_ap_payment","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApPaymentRequest"}}},"required":true},"responses":{"200":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/accounting/ar-aging":{"get":{"tags":["會計"],"summary":"取得應收帳款帳齡","operationId":"get_ar_aging","responses":{"200":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/accounting/ar-receipts":{"post":{"tags":["會計"],"summary":"建立 AR 收款","operationId":"create_ar_receipt","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateArReceiptRequest"}}},"required":true},"responses":{"200":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/accounting/chart-of-accounts":{"get":{"tags":["會計"],"summary":"取得會計科目表","operationId":"get_chart_of_accounts","responses":{"200":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/accounting/journal-entries":{"get":{"tags":["會計"],"summary":"取得傳票清單","operationId":"get_journal_entries","responses":{"200":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/accounting/trial-balance":{"get":{"tags":["會計"],"summary":"取得試算表","operationId":"get_trial_balance","responses":{"200":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/admin/audit/activities":{"get":{"tags":["稽核管理"],"summary":"列出活動日誌","operationId":"list_activity_logs","responses":{"200":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/admin/audit/dashboard":{"get":{"tags":["稽核管理"],"summary":"取得審計儀表板統計","operationId":"get_audit_dashboard","responses":{"200":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/admin/audit/logins":{"get":{"tags":["稽核管理"],"summary":"列出登入事件","operationId":"list_login_events","responses":{"200":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/admin/treatment-drugs":{"get":{"tags":["治療藥物"],"summary":"列出所有藥物選項（管理員，含篩選）","operationId":"admin_list_treatment_drugs","parameters":[{"name":"keyword","in":"query","required":false,"schema":{"type":["string","null"]}},{"name":"category","in":"query","required":false,"schema":{"type":["string","null"]}},{"name":"is_active","in":"query","required":false,"schema":{"type":["boolean","null"]}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}]},"post":{"tags":["治療藥物"],"summary":"建立藥物選項（管理員）","operationId":"create_treatment_drug","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTreatmentDrugRequest"}}},"required":true},"responses":{"201":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/admin/treatment-drugs/import-from-erp":{"post":{"tags":["治療藥物"],"summary":"從 ERP 匯入藥物選項（管理員）","operationId":"import_treatment_drugs_from_erp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportFromErpRequest"}}},"required":true},"responses":{"201":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/admin/treatment-drugs/{id}":{"put":{"tags":["治療藥物"],"summary":"更新藥物選項（管理員）","operationId":"update_treatment_drug","parameters":[{"name":"id","in":"path","description":"藥物選項 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTreatmentDrugRequest"}}},"required":true},"responses":{"200":{"description":""}},"security":[{"bearer":[]}]},"delete":{"tags":["治療藥物"],"summary":"刪除藥物選項（管理員，軟刪除）","operationId":"delete_treatment_drug","parameters":[{"name":"id","in":"path","description":"藥物選項 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/animals":{"get":{"tags":["動物管理"],"summary":"列出所有動物","operationId":"list_animals","responses":{"200":{"description":"成功獲取動物列表","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AnimalListItem"}}}}},"401":{"description":"未授權"}},"security":[{"bearer":[]}]},"post":{"tags":["動物管理"],"summary":"建立新動物","operationId":"create_animal","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAnimalRequest"}}},"required":true},"responses":{"201":{"description":"建立成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Animal"}}}},"400":{"description":"輸入資料驗證失敗"},"401":{"description":"未授權"}},"security":[{"bearer":[]}]}},"/api/v1/animals/batch/assign":{"post":{"tags":["動物管理"],"summary":"批次分配動物的耳標","operationId":"batch_assign_animals","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchAssignRequest"}}},"required":true},"responses":{"200":{"description":"批次分配成功","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Animal"}}}}},"401":{"description":"未授權"}},"security":[{"bearer":[]}]}},"/api/v1/animals/by-pen":{"get":{"tags":["動物管理"],"summary":"按欄位列出所有動物","operationId":"list_animals_by_pen","responses":{"200":{"description":"成功獲取按欄位分類的動物列表","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AnimalsByPen"}}}}},"401":{"description":"未授權"}},"security":[{"bearer":[]}]}},"/api/v1/animals/stats":{"get":{"tags":["動物管理"],"summary":"取得動物狀態統計","operationId":"get_animal_stats","responses":{"200":{"description":"動物狀態統計","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnimalStatsResponse"}}}},"401":{"description":"未授權"}},"security":[{"bearer":[]}]}},"/api/v1/animals/{animal_id}/observations":{"get":{"tags":["動物子模組"],"summary":"列出動物的所有觀察記錄","operationId":"list_animal_observations","parameters":[{"name":"animal_id","in":"path","description":"動物 ID","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"after","in":"query","description":"僅回傳 created_at > after 的記錄（轉讓資料隔離）","required":false,"schema":{"type":["string","null"],"format":"date-time"}}],"responses":{"200":{"description":"觀察記錄清單","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AnimalObservation"}}}}},"401":{"description":"未認證"}},"security":[{"bearer":[]}]},"post":{"tags":["動物子模組"],"summary":"建立觀察記錄","operationId":"create_animal_observation","parameters":[{"name":"animal_id","in":"path","description":"動物 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateObservationRequest"}}},"required":true},"responses":{"200":{"description":"建立成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnimalObservation"}}}},"400":{"description":"驗證失敗"},"401":{"description":"未認證"}},"security":[{"bearer":[]}]}},"/api/v1/animals/{animal_id}/pathology":{"get":{"tags":["動物子模組"],"summary":"取得動物的病理報告","operationId":"get_animal_pathology_report","parameters":[{"name":"animal_id","in":"path","description":"動物 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AnimalPathologyReport"}]}}}},"401":{"description":""}},"security":[{"bearer":[]}]},"post":{"tags":["動物子模組"],"summary":"建立或更新病理報告","operationId":"upsert_animal_pathology_report","parameters":[{"name":"animal_id","in":"path","description":"動物 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnimalPathologyReport"}}}},"401":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/animals/{animal_id}/sacrifice":{"get":{"tags":["動物子模組"],"summary":"取得動物的犧牲記錄","operationId":"get_animal_sacrifice","parameters":[{"name":"animal_id","in":"path","description":"動物 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AnimalSacrifice"}]}}}},"401":{"description":""}},"security":[{"bearer":[]}]},"post":{"tags":["動物子模組"],"summary":"建立或更新犧牲記錄","operationId":"upsert_animal_sacrifice","parameters":[{"name":"animal_id","in":"path","description":"動物 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSacrificeRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnimalSacrifice"}}}},"400":{"description":""},"401":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/animals/{animal_id}/surgeries":{"get":{"tags":["動物子模組"],"summary":"列出動物的所有手術記錄","operationId":"list_animal_surgeries","parameters":[{"name":"animal_id","in":"path","description":"動物 ID","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"after","in":"query","description":"僅回傳 created_at > after 的記錄（轉讓資料隔離）","required":false,"schema":{"type":["string","null"],"format":"date-time"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AnimalSurgery"}}}}},"401":{"description":""}},"security":[{"bearer":[]}]},"post":{"tags":["動物子模組"],"summary":"建立手術記錄","operationId":"create_animal_surgery","parameters":[{"name":"animal_id","in":"path","description":"動物 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSurgeryRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnimalSurgery"}}}},"400":{"description":""},"401":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/animals/{animal_id}/transfers":{"get":{"tags":["動物子模組"],"summary":"取得動物的轉讓記錄列表","operationId":"list_animal_transfers","parameters":[{"name":"animal_id","in":"path","description":"動物 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AnimalTransfer"}}}}},"401":{"description":""}},"security":[{"bearer":[]}]},"post":{"tags":["動物子模組"],"summary":"步驟 1：發起轉讓","operationId":"initiate_transfer","parameters":[{"name":"animal_id","in":"path","description":"動物 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTransferRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnimalTransfer"}}}},"400":{"description":""},"401":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/animals/{animal_id}/vaccinations":{"get":{"tags":["動物子模組"],"summary":"列出動物的所有疫苗接種記錄","operationId":"list_animal_vaccinations","parameters":[{"name":"animal_id","in":"path","description":"動物 ID","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"after","in":"query","description":"僅回傳 created_at > after 的記錄（轉讓資料隔離）","required":false,"schema":{"type":["string","null"],"format":"date-time"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AnimalVaccination"}}}}},"401":{"description":""}},"security":[{"bearer":[]}]},"post":{"tags":["動物子模組"],"summary":"建立疫苗接種記錄","operationId":"create_animal_vaccination","parameters":[{"name":"animal_id","in":"path","description":"動物 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVaccinationRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnimalVaccination"}}}},"400":{"description":""},"401":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/animals/{animal_id}/weights":{"get":{"tags":["動物子模組"],"summary":"列出動物的所有體重記錄","operationId":"list_animal_weights","parameters":[{"name":"animal_id","in":"path","description":"動物 ID","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"after","in":"query","description":"僅回傳 created_at > after 的記錄（轉讓資料隔離）","required":false,"schema":{"type":["string","null"],"format":"date-time"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AnimalWeightResponse"}}}}},"401":{"description":""}},"security":[{"bearer":[]}]},"post":{"tags":["動物子模組"],"summary":"建立體重記錄","operationId":"create_animal_weight","parameters":[{"name":"animal_id","in":"path","description":"動物 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWeightRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnimalWeight"}}}},"400":{"description":""},"401":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/animals/{id}":{"get":{"tags":["動物管理"],"summary":"取得單個動物的詳細資訊","operationId":"get_animal","parameters":[{"name":"id","in":"path","description":"動物 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"成功獲取動物詳情","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Animal"}}}},"401":{"description":"未授權"},"404":{"description":"找不到動物"}},"security":[{"bearer":[]}]},"put":{"tags":["動物管理"],"summary":"更新動物資訊","operationId":"update_animal","parameters":[{"name":"id","in":"path","description":"動物 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAnimalRequest"}}},"required":true},"responses":{"200":{"description":"更新成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Animal"}}}},"400":{"description":"輸入資料驗證失敗"},"401":{"description":"未授權"},"404":{"description":"找不到動物"}},"security":[{"bearer":[]}]},"delete":{"tags":["動物管理"],"summary":"刪除動物（軟刪除 + 刪除原因）- GLP 合規","operationId":"delete_animal","parameters":[{"name":"id","in":"path","description":"動物 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteRequest"}}},"required":true},"responses":{"200":{"description":"刪除成功"},"401":{"description":"未授權"},"404":{"description":"找不到動物"}},"security":[{"bearer":[]}]}},"/api/v1/animals/{id}/events":{"get":{"tags":["動物管理"],"summary":"取得動物的 IACUC 變更事件（用於時間軸顯示）","operationId":"get_animal_events","parameters":[{"name":"id","in":"path","description":"動物 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"成功獲取事件列表","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AnimalEvent"}}}}},"401":{"description":"未授權"},"404":{"description":"找不到動物"}},"security":[{"bearer":[]}]}},"/api/v1/animals/{id}/vet-read":{"post":{"tags":["動物管理"],"summary":"標記動物為獸醫已讀","operationId":"mark_animal_vet_read","parameters":[{"name":"id","in":"path","description":"動物 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"標記成功"},"401":{"description":"未授權"},"404":{"description":"找不到動物"}},"security":[{"bearer":[]}]}},"/api/v1/annotations/{record_type}/{record_id}":{"get":{"tags":["電子簽章"],"summary":"取得記錄的所有附註","operationId":"get_record_annotations","parameters":[{"name":"record_type","in":"path","description":"紀錄類型","required":true,"schema":{"type":"string"}},{"name":"record_id","in":"path","description":"紀錄 ID","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"附註清單","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AnnotationResponse"}}}}}},"security":[{"bearer":[]}]},"post":{"tags":["電子簽章"],"summary":"新增附註到已鎖定的記錄","operationId":"add_record_annotation","parameters":[{"name":"record_type","in":"path","description":"紀錄類型 (sacrifice, observation 等)","required":true,"schema":{"type":"string"}},{"name":"record_id","in":"path","description":"紀錄 ID","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAnnotationRequest"}}},"required":true},"responses":{"200":{"description":"附註建立成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnotationResponse"}}}},"400":{"description":"只能對已鎖定的記錄新增附註或驗證失敗"},"401":{"description":"未授權或密碼錯誤"}},"security":[{"bearer":[]}]}},"/api/v1/auth/2fa/confirm":{"post":{"tags":["認證"],"summary":"POST /api/auth/2fa/confirm — 驗證第一次 TOTP code 並正式啟用（僅限管理員）","operationId":"confirm_2fa_setup","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwoFactorConfirmRequest"}}},"required":true},"responses":{"200":{"description":"2FA 已啟用"},"400":{"description":"驗證失敗","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"僅管理員可啟用","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/api/v1/auth/2fa/disable":{"post":{"tags":["認證"],"summary":"POST /api/auth/2fa/disable — 停用 2FA（需密碼 + TOTP code）","operationId":"disable_2fa","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwoFactorDisableRequest"}}},"required":true},"responses":{"200":{"description":"2FA 已停用"},"400":{"description":"驗證失敗","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/api/v1/auth/2fa/setup":{"post":{"tags":["認證"],"summary":"POST /api/auth/2fa/setup — 產生 TOTP secret（僅限管理員）","operationId":"setup_2fa","responses":{"200":{"description":"TOTP 設定資訊","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwoFactorSetupResponse"}}}},"403":{"description":"僅管理員可啟用","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/api/v1/auth/2fa/verify":{"post":{"tags":["認證"],"summary":"POST /api/auth/2fa/verify — 使用 temp_token + TOTP code 完成登入","operationId":"verify_2fa_login","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwoFactorLoginRequest"}}},"required":true},"responses":{"200":{"description":"登入成功，回傳 Set-Cookie"},"400":{"description":"驗證失敗","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/auth/confirm-password":{"post":{"tags":["認證"],"summary":"SEC-33：敏感操作二級認證 — 以密碼換取短期 reauth token","operationId":"confirm_password","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmPasswordRequest"}}},"required":true},"responses":{"200":{"description":"驗證成功，回傳 reauth_token 供後續敏感操作使用"},"401":{"description":"密碼錯誤","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/api/v1/auth/forgot-password":{"post":{"tags":["認證"],"summary":"忘記密碼 - 發送重設連結","operationId":"forgot_password","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordRequest"}}},"required":true},"responses":{"200":{"description":"若信箱存在則已寄出重設連結"}}}},"/api/v1/auth/heartbeat":{"post":{"tags":["認證"],"summary":"Heartbeat - 更新使用者 session 的最後活動時間與 IP","operationId":"heartbeat","responses":{"200":{"description":"心跳更新成功"}},"security":[{"bearer":[]}]}},"/api/v1/auth/login":{"post":{"tags":["認證"],"summary":"登入","operationId":"login","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"登入成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginResponse"}}}},"401":{"description":"帳號或密碼錯誤","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"423":{"description":"帳號已鎖定","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/auth/logout":{"post":{"tags":["認證"],"summary":"登出","operationId":"logout","responses":{"200":{"description":"登出成功"},"401":{"description":"未認證","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/api/v1/auth/refresh":{"post":{"tags":["認證"],"summary":"重新整理 Token\n支援從 JSON body 或 Cookie 讀取 refresh_token","operationId":"refresh_token","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshTokenRequest"}}},"required":true},"responses":{"200":{"description":"Token 更新成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginResponse"}}}},"401":{"description":"Refresh token 無效或過期","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/auth/reset-password":{"post":{"tags":["認證"],"summary":"使用 token 重設密碼","operationId":"reset_password_with_token","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordWithTokenRequest"}}},"required":true},"responses":{"200":{"description":"密碼重設成功"},"400":{"description":"Token 無效或已過期","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/auth/stop-impersonate":{"post":{"tags":["認證"],"summary":"停止模擬登入，恢復管理員 session\n從 JWT 的 impersonated_by 欄位取得管理員 ID，重新簽發管理員的正常 token","operationId":"stop_impersonate","responses":{"200":{"description":"恢復管理員 session"},"403":{"description":"非模擬登入狀態","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/api/v1/categories":{"get":{"tags":["產品管理"],"summary":"列出所有產品分類","operationId":"list_categories","responses":{"200":{"description":"分類清單","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductCategory"}}}}},"401":{"description":"未認證","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"post":{"tags":["產品管理"],"summary":"建立產品分類","operationId":"create_category","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCategoryRequest"}}},"required":true},"responses":{"200":{"description":"建立成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCategory"}}}},"400":{"description":"驗證失敗","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"未認證","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/api/v1/documents":{"get":{"tags":["單據管理"],"summary":"列出所有文件","operationId":"list_documents","parameters":[{"name":"doc_type","in":"query","required":false,"schema":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DocType"}]}},{"name":"doc_types","in":"query","description":"多類型篩選，逗號分隔，例如 \"PO,GRN,PR\"；與 doc_type 同時存在時 doc_type 優先","required":false,"schema":{"type":["string","null"]}},{"name":"status","in":"query","required":false,"schema":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DocStatus"}]}},{"name":"warehouse_id","in":"query","required":false,"schema":{"type":["string","null"],"format":"uuid"}},{"name":"partner_id","in":"query","required":false,"schema":{"type":["string","null"],"format":"uuid"}},{"name":"date_from","in":"query","required":false,"schema":{"type":["string","null"],"format":"date"}},{"name":"date_to","in":"query","required":false,"schema":{"type":["string","null"],"format":"date"}},{"name":"keyword","in":"query","required":false,"schema":{"type":["string","null"]}},{"name":"iacuc_no","in":"query","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"單據清單","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DocumentListItem"}}}}},"401":{"description":"未認證"}},"security":[{"bearer":[]}]},"post":{"tags":["單據管理"],"summary":"建立文件","operationId":"create_document","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDocumentRequest"}}},"required":true},"responses":{"200":{"description":"建立成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentWithLines"}}}},"400":{"description":"驗證失敗"},"401":{"description":"未認證"}},"security":[{"bearer":[]}]}},"/api/v1/documents/{id}":{"get":{"tags":["單據管理"],"summary":"取得單個文件","operationId":"get_document","parameters":[{"name":"id","in":"path","description":"單據 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"單據詳細","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentWithLines"}}}},"401":{"description":"未認證"},"403":{"description":"無權存取"},"404":{"description":"找不到單據"}},"security":[{"bearer":[]}]},"put":{"tags":["單據管理"],"summary":"更新文件","operationId":"update_document","parameters":[{"name":"id","in":"path","description":"單據 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDocumentRequest"}}},"required":true},"responses":{"200":{"description":"更新成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentWithLines"}}}},"400":{"description":"驗證失敗"},"401":{"description":"未認證"},"403":{"description":"無權存取"},"404":{"description":"找不到單據"}},"security":[{"bearer":[]}]},"delete":{"tags":["單據管理"],"summary":"刪除文件","operationId":"delete_document","parameters":[{"name":"id","in":"path","description":"單據 ID","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"hard","in":"query","required":false,"schema":{"type":["boolean","null"]}}],"responses":{"200":{"description":"刪除成功"},"401":{"description":"未認證"},"403":{"description":"無權存取"},"404":{"description":"找不到單據"}},"security":[{"bearer":[]}]}},"/api/v1/documents/{id}/approve":{"post":{"tags":["單據管理"],"summary":"核准文件","operationId":"approve_document","parameters":[{"name":"id","in":"path","description":"單據 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"核准成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentWithLines"}}}},"401":{"description":"未認證"},"403":{"description":"僅倉庫管理員可核准"},"404":{"description":"找不到單據"}},"security":[{"bearer":[]}]}},"/api/v1/documents/{id}/cancel":{"post":{"tags":["單據管理"],"summary":"取消文件","operationId":"cancel_document","parameters":[{"name":"id","in":"path","description":"單據 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"取消成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentWithLines"}}}},"401":{"description":"未認證"},"403":{"description":"僅倉庫管理員可取消"},"404":{"description":"找不到單據"}},"security":[{"bearer":[]}]}},"/api/v1/documents/{id}/submit":{"post":{"tags":["單據管理"],"summary":"提交文件","operationId":"submit_document","parameters":[{"name":"id","in":"path","description":"單據 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"提交成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentWithLines"}}}},"401":{"description":"未認證"},"403":{"description":"無權存取"},"404":{"description":"找不到單據"}},"security":[{"bearer":[]}]}},"/api/v1/facilities":{"get":{"tags":["設施管理"],"summary":"列出所有設施","operationId":"list_facilities","responses":{"200":{"description":"設施清單","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Facility"}}}}}},"security":[{"bearer":[]}]},"post":{"tags":["設施管理"],"summary":"建立設施","operationId":"create_facility","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFacilityRequest"}}},"required":true},"responses":{"201":{"description":"建立成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Facility"}}}}},"security":[{"bearer":[]}]}},"/api/v1/facilities/buildings":{"get":{"tags":["設施管理"],"summary":"列出所有棟舍","operationId":"list_buildings","responses":{"200":{"description":"棟舍清單","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BuildingWithFacility"}}}}}},"security":[{"bearer":[]}]},"post":{"tags":["設施管理"],"summary":"建立棟舍","operationId":"create_building","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBuildingRequest"}}},"required":true},"responses":{"201":{"description":"建立成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Building"}}}}},"security":[{"bearer":[]}]}},"/api/v1/facilities/buildings/{id}":{"get":{"tags":["設施管理"],"summary":"取得棟舍詳細","operationId":"get_building","parameters":[{"name":"id","in":"path","description":"棟舍 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"棟舍資訊","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Building"}}}}},"security":[{"bearer":[]}]},"put":{"tags":["設施管理"],"summary":"更新棟舍","operationId":"update_building","parameters":[{"name":"id","in":"path","description":"棟舍 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBuildingRequest"}}},"required":true},"responses":{"200":{"description":"更新成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Building"}}}}},"security":[{"bearer":[]}]},"delete":{"tags":["設施管理"],"summary":"刪除棟舍","operationId":"delete_building","parameters":[{"name":"id","in":"path","description":"棟舍 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"刪除成功"}},"security":[{"bearer":[]}]}},"/api/v1/facilities/departments":{"get":{"tags":["設施管理"],"summary":"列出所有部門","operationId":"list_departments","responses":{"200":{"description":"部門清單","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DepartmentWithManager"}}}}}},"security":[{"bearer":[]}]},"post":{"tags":["設施管理"],"summary":"建立部門","operationId":"create_department","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDepartmentRequest"}}},"required":true},"responses":{"201":{"description":"建立成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Department"}}}}},"security":[{"bearer":[]}]}},"/api/v1/facilities/departments/{id}":{"get":{"tags":["設施管理"],"summary":"取得部門詳細","operationId":"get_department","parameters":[{"name":"id","in":"path","description":"部門 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"部門資訊","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Department"}}}}},"security":[{"bearer":[]}]},"put":{"tags":["設施管理"],"summary":"更新部門","operationId":"update_department","parameters":[{"name":"id","in":"path","description":"部門 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDepartmentRequest"}}},"required":true},"responses":{"200":{"description":"更新成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Department"}}}}},"security":[{"bearer":[]}]},"delete":{"tags":["設施管理"],"summary":"刪除部門","operationId":"delete_department","parameters":[{"name":"id","in":"path","description":"部門 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"刪除成功"}},"security":[{"bearer":[]}]}},"/api/v1/facilities/pens":{"get":{"tags":["設施管理"],"summary":"列出所有欄位","operationId":"list_pens","responses":{"200":{"description":"欄位清單","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PenDetails"}}}}}},"security":[{"bearer":[]}]},"post":{"tags":["設施管理"],"summary":"建立欄位","operationId":"create_pen","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePenRequest"}}},"required":true},"responses":{"201":{"description":"建立成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pen"}}}}},"security":[{"bearer":[]}]}},"/api/v1/facilities/pens/{id}":{"get":{"tags":["設施管理"],"summary":"取得欄位詳細","operationId":"get_pen","parameters":[{"name":"id","in":"path","description":"欄位 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"欄位資訊","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pen"}}}}},"security":[{"bearer":[]}]},"put":{"tags":["設施管理"],"summary":"更新欄位","operationId":"update_pen","parameters":[{"name":"id","in":"path","description":"欄位 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePenRequest"}}},"required":true},"responses":{"200":{"description":"更新成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pen"}}}}},"security":[{"bearer":[]}]},"delete":{"tags":["設施管理"],"summary":"刪除欄位","operationId":"delete_pen","parameters":[{"name":"id","in":"path","description":"欄位 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"刪除成功"}},"security":[{"bearer":[]}]}},"/api/v1/facilities/species":{"get":{"tags":["設施管理"],"summary":"列出所有物種","operationId":"list_species","responses":{"200":{"description":"物種清單","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Species"}}}}}},"security":[{"bearer":[]}]},"post":{"tags":["設施管理"],"summary":"建立物種","operationId":"create_species","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSpeciesRequest"}}},"required":true},"responses":{"201":{"description":"建立成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Species"}}}}},"security":[{"bearer":[]}]}},"/api/v1/facilities/species/{id}":{"get":{"tags":["設施管理"],"summary":"取得物種詳細","operationId":"get_species","parameters":[{"name":"id","in":"path","description":"物種 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"物種資訊","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Species"}}}}},"security":[{"bearer":[]}]},"put":{"tags":["設施管理"],"summary":"更新物種","operationId":"update_species","parameters":[{"name":"id","in":"path","description":"物種 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSpeciesRequest"}}},"required":true},"responses":{"200":{"description":"更新成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Species"}}}}},"security":[{"bearer":[]}]},"delete":{"tags":["設施管理"],"summary":"刪除物種","operationId":"delete_species","parameters":[{"name":"id","in":"path","description":"物種 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"刪除成功"}},"security":[{"bearer":[]}]}},"/api/v1/facilities/zones":{"get":{"tags":["設施管理"],"summary":"列出所有區域","operationId":"list_zones","responses":{"200":{"description":"區域清單","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ZoneWithBuilding"}}}}}},"security":[{"bearer":[]}]},"post":{"tags":["設施管理"],"summary":"建立區域","operationId":"create_zone","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateZoneRequest"}}},"required":true},"responses":{"201":{"description":"建立成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Zone"}}}}},"security":[{"bearer":[]}]}},"/api/v1/facilities/zones/{id}":{"get":{"tags":["設施管理"],"summary":"取得區域詳細","operationId":"get_zone","parameters":[{"name":"id","in":"path","description":"區域 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"區域資訊","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Zone"}}}}},"security":[{"bearer":[]}]},"put":{"tags":["設施管理"],"summary":"更新區域","operationId":"update_zone","parameters":[{"name":"id","in":"path","description":"區域 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateZoneRequest"}}},"required":true},"responses":{"200":{"description":"更新成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Zone"}}}}},"security":[{"bearer":[]}]},"delete":{"tags":["設施管理"],"summary":"刪除區域","operationId":"delete_zone","parameters":[{"name":"id","in":"path","description":"區域 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"刪除成功"}},"security":[{"bearer":[]}]}},"/api/v1/facilities/{id}":{"get":{"tags":["設施管理"],"summary":"取得設施詳細","operationId":"get_facility","parameters":[{"name":"id","in":"path","description":"設施 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"設施資訊","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Facility"}}}}},"security":[{"bearer":[]}]},"put":{"tags":["設施管理"],"summary":"更新設施","operationId":"update_facility","parameters":[{"name":"id","in":"path","description":"設施 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFacilityRequest"}}},"required":true},"responses":{"200":{"description":"更新成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Facility"}}}}},"security":[{"bearer":[]}]},"delete":{"tags":["設施管理"],"summary":"刪除設施","operationId":"delete_facility","parameters":[{"name":"id","in":"path","description":"設施 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"刪除成功"}},"security":[{"bearer":[]}]}},"/api/v1/hr/attendance":{"get":{"tags":["HR 出勤"],"summary":"列出出勤記錄\n- 預設只顯示自己的紀錄；具備 hr.attendance.view_all 且傳 view_all=true 時可查看所有人","operationId":"list_attendance","responses":{"200":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/hr/attendance/clock-in":{"post":{"tags":["HR 出勤"],"summary":"打卡上班","operationId":"clock_in","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClockInRequest"}}},"required":true},"responses":{"200":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/hr/leaves":{"get":{"tags":["HR 請假"],"summary":"列出請假記錄","operationId":"list_leaves","responses":{"200":{"description":""}},"security":[{"bearer":[]}]},"post":{"tags":["HR 請假"],"summary":"建立請假申請","operationId":"create_leave","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLeaveRequest"}}},"required":true},"responses":{"201":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/hr/overtime":{"get":{"tags":["HR 加班"],"summary":"列出加班記錄","operationId":"list_overtime","responses":{"200":{"description":""}},"security":[{"bearer":[]}]},"post":{"tags":["HR 加班"],"summary":"建立加班記錄","operationId":"create_overtime","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOvertimeRequest"}}},"required":true},"responses":{"201":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/me":{"get":{"tags":["認證"],"summary":"取得當前使用者資訊","operationId":"me","responses":{"200":{"description":"目前使用者資訊","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"401":{"description":"未認證","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"put":{"tags":["認證"],"summary":"更新自己的資訊","operationId":"update_me","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserRequest"}}},"required":true},"responses":{"200":{"description":"更新成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"400":{"description":"驗證錯誤","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/api/v1/me/account":{"delete":{"tags":["認證"],"summary":"GDPR：刪除帳號請求（刪除權）- 軟刪除，需 X-Reauth-Token","operationId":"delete_me_account","responses":{"200":{"description":"帳號已停用"},"401":{"description":"未認證","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"需帶 X-Reauth-Token 重新確認密碼","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/api/v1/me/export":{"get":{"tags":["認證"],"summary":"GDPR：匯出個人資料（存取權、可攜權）","operationId":"export_me","responses":{"200":{"description":"個人資料 JSON","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GdprExportResponse"}}}},"401":{"description":"未認證","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/api/v1/me/password":{"put":{"tags":["認證"],"summary":"變更自己的密碼","operationId":"change_own_password","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeOwnPasswordRequest"}}},"required":true},"responses":{"200":{"description":"密碼變更成功"},"400":{"description":"密碼不符合要求","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/api/v1/me/preferences":{"get":{"tags":["認證"],"summary":"取得所有偏好設定\nGET /me/preferences","operationId":"get_all_preferences","responses":{"200":{"description":"所有偏好設定","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllPreferencesResponse"}}}},"401":{"description":"未認證","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/api/v1/me/preferences/{key}":{"get":{"tags":["認證"],"summary":"取得單一偏好設定\nGET /me/preferences/:key","operationId":"get_preference","parameters":[{"name":"key","in":"path","description":"偏好鍵名","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"偏好設定","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreferenceResponse"}}}},"401":{"description":"未認證","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"put":{"tags":["認證"],"summary":"更新偏好設定 (upsert)\nPUT /me/preferences/:key","operationId":"upsert_preference","parameters":[{"name":"key","in":"path","description":"偏好鍵名","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertPreferenceRequest"}}},"required":true},"responses":{"200":{"description":"更新成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreferenceResponse"}}}},"401":{"description":"未認證","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"delete":{"tags":["認證"],"summary":"刪除偏好設定（重置為預設）\nDELETE /me/preferences/:key","operationId":"delete_preference","parameters":[{"name":"key","in":"path","description":"偏好鍵名","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"已刪除，回傳預設值","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreferenceResponse"}}}},"401":{"description":"未認證","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/api/v1/my-projects":{"get":{"tags":["計畫書管理"],"summary":"列出我的專案清單","operationId":"get_my_protocols","responses":{"200":{"description":"我的專案清單","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProtocolListItem"}}}}}},"security":[{"bearer":[]}]}},"/api/v1/notifications":{"get":{"tags":["通知"],"summary":"列出所有通知","operationId":"list_notifications","responses":{"200":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/notifications/unread-count":{"get":{"tags":["通知"],"summary":"取得未讀通知數量","operationId":"get_unread_count","responses":{"200":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/observations/{id}":{"get":{"tags":["動物子模組"],"summary":"取得單個觀察記錄","operationId":"get_animal_observation","parameters":[{"name":"id","in":"path","description":"觀察記錄 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"觀察記錄","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnimalObservation"}}}},"401":{"description":"未認證"},"404":{"description":"找不到"}},"security":[{"bearer":[]}]},"put":{"tags":["動物子模組"],"summary":"更新觀察記錄","operationId":"update_animal_observation","parameters":[{"name":"id","in":"path","description":"觀察記錄 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateObservationRequest"}}},"required":true},"responses":{"200":{"description":"更新成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnimalObservation"}}}},"400":{"description":"驗證失敗"},"401":{"description":"未認證"},"404":{"description":"找不到"}},"security":[{"bearer":[]}]},"delete":{"tags":["動物子模組"],"summary":"刪除觀察記錄（軟刪除 + 刪除原因）- GLP 合規","operationId":"delete_animal_observation","parameters":[{"name":"id","in":"path","description":"觀察記錄 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteRequest"}}},"required":true},"responses":{"200":{"description":"刪除成功"},"401":{"description":"未認證"},"404":{"description":"找不到"}},"security":[{"bearer":[]}]}},"/api/v1/partners":{"get":{"tags":["合作夥伴管理"],"summary":"列出所有合作夥伴","operationId":"list_partners","parameters":[{"name":"partner_type","in":"query","required":false,"schema":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/PartnerType"}]}},{"name":"keyword","in":"query","required":false,"schema":{"type":["string","null"]}},{"name":"is_active","in":"query","required":false,"schema":{"type":["boolean","null"]}},{"name":"page","in":"query","required":false,"schema":{"type":["integer","null"],"format":"int64"}},{"name":"per_page","in":"query","required":false,"schema":{"type":["integer","null"],"format":"int64"}}],"responses":{"200":{"description":"夥伴清單","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Partner"}}}}},"401":{"description":"未認證"}},"security":[{"bearer":[]}]},"post":{"tags":["合作夥伴管理"],"summary":"建立合作夥伴","operationId":"create_partner","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePartnerRequest"}}},"required":true},"responses":{"200":{"description":"建立成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Partner"}}}},"400":{"description":"驗證失敗"},"401":{"description":"未認證"}},"security":[{"bearer":[]}]}},"/api/v1/partners/generate-code":{"get":{"tags":["合作夥伴管理"],"summary":"生成供應商代碼","operationId":"generate_partner_code","parameters":[{"name":"partner_type","in":"query","required":false,"schema":{"type":["string","null"]}},{"name":"category","in":"query","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"代碼","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateCodeResponse"}}}},"400":{"description":"驗證失敗"},"401":{"description":"未認證"}},"security":[{"bearer":[]}]}},"/api/v1/partners/import":{"post":{"tags":["合作夥伴管理"],"summary":"匯入夥伴（供應商/客戶）","operationId":"import_partners","responses":{"200":{"description":"匯入結果 (multipart/form-data, field file: CSV/Excel)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerImportResult"}}}},"400":{"description":"驗證失敗或檔案格式錯誤"},"401":{"description":"未認證"}},"security":[{"bearer":[]}]}},"/api/v1/partners/import/template":{"get":{"tags":["合作夥伴管理"],"summary":"下載夥伴匯入模板","operationId":"download_partner_import_template","responses":{"200":{"description":"Excel 模板檔案"},"401":{"description":"未認證"}},"security":[{"bearer":[]}]}},"/api/v1/partners/{id}":{"get":{"tags":["合作夥伴管理"],"summary":"取得單個合作夥伴","operationId":"get_partner","parameters":[{"name":"id","in":"path","description":"夥伴 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"夥伴詳細","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Partner"}}}},"401":{"description":"未認證"},"404":{"description":"找不到夥伴"}},"security":[{"bearer":[]}]},"put":{"tags":["合作夥伴管理"],"summary":"更新合作夥伴","operationId":"update_partner","parameters":[{"name":"id","in":"path","description":"夥伴 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePartnerRequest"}}},"required":true},"responses":{"200":{"description":"更新成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Partner"}}}},"400":{"description":"驗證失敗"},"401":{"description":"未認證"},"404":{"description":"找不到夥伴"}},"security":[{"bearer":[]}]},"delete":{"tags":["合作夥伴管理"],"summary":"刪除合作夥伴","operationId":"delete_partner","parameters":[{"name":"id","in":"path","description":"夥伴 ID","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"hard","in":"query","required":false,"schema":{"type":["boolean","null"]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteQuery"}}},"required":true},"responses":{"200":{"description":"刪除成功"},"401":{"description":"未認證"},"404":{"description":"找不到夥伴"}},"security":[{"bearer":[]}]}},"/api/v1/permissions":{"get":{"tags":["角色權限"],"summary":"列出所有權限","operationId":"list_permissions","responses":{"200":{"description":"權限清單","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Permission"}}}}}},"security":[{"bearer":[]}]}},"/api/v1/products":{"get":{"tags":["產品管理"],"summary":"列出所有產品","operationId":"list_products","parameters":[{"name":"keyword","in":"query","required":false,"schema":{"type":["string","null"]}},{"name":"category_id","in":"query","required":false,"schema":{"type":["string","null"],"format":"uuid"}},{"name":"category_code","in":"query","required":false,"schema":{"type":["string","null"]}},{"name":"subcategory_code","in":"query","required":false,"schema":{"type":["string","null"]}},{"name":"status","in":"query","required":false,"schema":{"type":["string","null"]}},{"name":"track_batch","in":"query","required":false,"schema":{"type":["boolean","null"]}},{"name":"track_expiry","in":"query","required":false,"schema":{"type":["boolean","null"]}},{"name":"storage_condition","in":"query","required":false,"schema":{"type":["string","null"]}},{"name":"is_active","in":"query","required":false,"schema":{"type":["boolean","null"]}},{"name":"sort_by","in":"query","required":false,"schema":{"type":["string","null"]}},{"name":"sort_order","in":"query","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"產品清單","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Product"}}}}},"401":{"description":"未認證","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"post":{"tags":["產品管理"],"summary":"建立產品","operationId":"create_product","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProductRequest"}}},"required":true},"responses":{"200":{"description":"建立成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductWithUom"}}}},"400":{"description":"驗證失敗","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"未認證","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/api/v1/products/import":{"post":{"tags":["產品管理"],"summary":"匯入產品（CSV 或 Excel）","operationId":"import_products","responses":{"200":{"description":"匯入結果 (multipart/form-data, field file: CSV/Excel)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductImportResult"}}}},"400":{"description":"驗證失敗或檔案格式錯誤","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"未認證","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/api/v1/products/import/preview":{"post":{"tags":["產品管理"],"summary":"匯入預覽：回傳解析後的列資料，供前端「依序設定 SKU」使用","operationId":"preview_product_import","responses":{"200":{"description":"預覽列資料","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductImportPreviewResult"}}}},"400":{"description":"驗證失敗或檔案格式錯誤","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"未認證","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/api/v1/products/import/template":{"get":{"tags":["產品管理"],"summary":"下載產品匯入模板","operationId":"download_product_import_template","responses":{"200":{"description":"Excel 模板檔案 (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)"},"401":{"description":"未認證","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/api/v1/products/with-sku":{"post":{"tags":["產品管理"],"summary":"建立產品並自動產生 SKU","operationId":"create_product_with_sku","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProductWithSkuRequest"}}},"required":true},"responses":{"200":{"description":"建立成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductWithUom"}}}},"400":{"description":"驗證失敗"},"401":{"description":"未認證"}},"security":[{"bearer":[]}]}},"/api/v1/products/{id}":{"get":{"tags":["產品管理"],"summary":"取得單個產品","operationId":"get_product","parameters":[{"name":"id","in":"path","description":"產品 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"產品詳細","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductWithUom"}}}},"401":{"description":"未認證","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"找不到產品","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"put":{"tags":["產品管理"],"summary":"更新產品","operationId":"update_product","parameters":[{"name":"id","in":"path","description":"產品 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProductRequest"}}},"required":true},"responses":{"200":{"description":"更新成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductWithUom"}}}},"400":{"description":"驗證失敗","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"未認證","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"找不到產品","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"delete":{"tags":["產品管理"],"summary":"刪除產品（軟刪除）","operationId":"delete_product","parameters":[{"name":"id","in":"path","description":"產品 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"刪除成功"},"401":{"description":"未認證","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"找不到產品","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/api/v1/protocols":{"get":{"tags":["計畫書管理"],"summary":"列出所有專案","operationId":"list_protocols","responses":{"200":{"description":"專案清單","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProtocolListItem"}}}}}},"security":[{"bearer":[]}]},"post":{"tags":["計畫書管理"],"summary":"建立專案","operationId":"create_protocol","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProtocolRequest"}}},"required":true},"responses":{"201":{"description":"建立成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Protocol"}}}}},"security":[{"bearer":[]}]}},"/api/v1/protocols/{id}":{"get":{"tags":["計畫書管理"],"summary":"取得單個專案","operationId":"get_protocol","parameters":[{"name":"id","in":"path","description":"專案 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"專案詳細","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProtocolResponse"}}}}},"security":[{"bearer":[]}]},"put":{"tags":["計畫書管理"],"summary":"更新專案","operationId":"update_protocol","parameters":[{"name":"id","in":"path","description":"專案 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProtocolRequest"}}},"required":true},"responses":{"200":{"description":"更新成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Protocol"}}}}},"security":[{"bearer":[]}]}},"/api/v1/protocols/{id}/activities":{"get":{"tags":["計畫書管理"],"summary":"取得專案活動歷程","operationId":"get_protocol_activities","parameters":[{"name":"id","in":"path","description":"專案 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"活動歷程","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProtocolActivityResponse"}}}}}},"security":[{"bearer":[]}]}},"/api/v1/protocols/{id}/animal-stats":{"get":{"tags":["計畫書管理"],"summary":"取得專案的動物統計（儀表板用）","operationId":"get_protocol_animal_stats","parameters":[{"name":"id","in":"path","description":"專案 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"動物統計"}},"security":[{"bearer":[]}]}},"/api/v1/protocols/{id}/co-editors":{"get":{"tags":["計畫書管理"],"summary":"列出 co-editor 列表","operationId":"list_co_editors","parameters":[{"name":"id","in":"path","description":"專案 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Co-Editor 清單","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CoEditorAssignmentResponse"}}}}}},"security":[{"bearer":[]}]},"post":{"tags":["計畫書管理"],"summary":"指派 co-editor","operationId":"assign_co_editor","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignCoEditorRequest"}}},"required":true},"responses":{"200":{"description":"指派成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProtocol"}}}}},"security":[{"bearer":[]}]}},"/api/v1/protocols/{id}/co-editors/{user_id}":{"delete":{"tags":["計畫書管理"],"summary":"移除 co-editor","operationId":"remove_co_editor","parameters":[{"name":"id","in":"path","description":"專案 ID","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"user_id","in":"path","description":"使用者 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"移除成功"}},"security":[{"bearer":[]}]}},"/api/v1/protocols/{id}/export-pdf":{"get":{"tags":["計畫書管理"],"summary":"匯出計畫書 PDF","operationId":"export_protocol_pdf","parameters":[{"name":"id","in":"path","description":"專案 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"PDF 檔案"}},"security":[{"bearer":[]}]}},"/api/v1/protocols/{id}/status":{"post":{"tags":["計畫書管理"],"summary":"變更專案狀態","operationId":"change_protocol_status","parameters":[{"name":"id","in":"path","description":"專案 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeStatusRequest"}}},"required":true},"responses":{"200":{"description":"狀態變更成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Protocol"}}}}},"security":[{"bearer":[]}]}},"/api/v1/protocols/{id}/submit":{"post":{"tags":["計畫書管理"],"summary":"提交專案","operationId":"submit_protocol","parameters":[{"name":"id","in":"path","description":"專案 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"提交成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Protocol"}}}}},"security":[{"bearer":[]}]}},"/api/v1/protocols/{id}/versions":{"get":{"tags":["計畫書管理"],"summary":"取得專案版本","operationId":"get_protocol_versions","parameters":[{"name":"id","in":"path","description":"專案 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"版本清單","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProtocolVersion"}}}}}},"security":[{"bearer":[]}]}},"/api/v1/reports/blood-test-analysis":{"get":{"tags":["報表"],"summary":"取得血液檢查結果分析資料\n與動物權限綁定：需 animal.record.view；若僅 view_project（無 view_all），僅回傳已指派計畫之動物","operationId":"get_blood_test_analysis","responses":{"200":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/reports/blood-test-cost":{"get":{"tags":["報表"],"summary":"取得血液檢查費用報表","operationId":"get_blood_test_cost_report","responses":{"200":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/reports/cost-summary":{"get":{"tags":["報表"],"summary":"取得成本彙總報表","operationId":"get_cost_summary_report","responses":{"200":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/reports/purchase-lines":{"get":{"tags":["報表"],"summary":"取得採購明細報表","operationId":"get_purchase_lines_report","responses":{"200":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/reports/sales-lines":{"get":{"tags":["報表"],"summary":"取得銷貨明細報表","operationId":"get_sales_lines_report","responses":{"200":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/reports/stock-ledger":{"get":{"tags":["報表"],"summary":"取得庫存流水報表","operationId":"get_stock_ledger_report","responses":{"200":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/reports/stock-on-hand":{"get":{"tags":["報表"],"summary":"取得庫存現況報表","operationId":"get_stock_on_hand_report","responses":{"200":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/reviews/assignments":{"get":{"tags":["審查管理"],"summary":"列出審查委員指派清單","operationId":"list_review_assignments","responses":{"200":{"description":"指派清單","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReviewAssignmentResponse"}}}}}},"security":[{"bearer":[]}]},"post":{"tags":["審查管理"],"summary":"指派審查委員","operationId":"assign_reviewer","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignReviewerRequest"}}},"required":true},"responses":{"200":{"description":"指派成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewAssignment"}}}}},"security":[{"bearer":[]}]}},"/api/v1/reviews/comments":{"get":{"tags":["審查管理"],"summary":"列出審查意見清單","operationId":"list_review_comments","responses":{"200":{"description":"意見清單","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReviewCommentResponse"}}}}}},"security":[{"bearer":[]}]},"post":{"tags":["審查管理"],"summary":"新增審查意見","operationId":"create_review_comment","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCommentRequest"}}},"required":true},"responses":{"201":{"description":"建立成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewComment"}}}}},"security":[{"bearer":[]}]}},"/api/v1/reviews/comments/draft":{"post":{"tags":["審查管理"],"summary":"儲存草稿回覆","operationId":"save_reply_draft","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveDraftRequest"}}},"required":true},"responses":{"200":{"description":"儲存成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewComment"}}}}},"security":[{"bearer":[]}]}},"/api/v1/reviews/comments/reply":{"post":{"tags":["審查管理"],"summary":"回覆審查意見","operationId":"reply_review_comment","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplyCommentRequest"}}},"required":true},"responses":{"200":{"description":"回覆成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewComment"}}}}},"security":[{"bearer":[]}]}},"/api/v1/reviews/comments/submit-draft":{"post":{"tags":["審查管理"],"summary":"正式送出草稿回覆","operationId":"submit_reply_from_draft","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitReplyRequest"}}},"required":true},"responses":{"200":{"description":"送出成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewComment"}}}}},"security":[{"bearer":[]}]}},"/api/v1/reviews/comments/{id}/draft":{"get":{"tags":["審查管理"],"summary":"取得草稿回覆","operationId":"get_reply_draft","parameters":[{"name":"id","in":"path","description":"意見 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"草稿內容"}},"security":[{"bearer":[]}]}},"/api/v1/reviews/comments/{id}/resolve":{"post":{"tags":["審查管理"],"summary":"標記審查意見為已解決","operationId":"resolve_review_comment","parameters":[{"name":"id","in":"path","description":"意見 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"標記成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewComment"}}}}},"security":[{"bearer":[]}]}},"/api/v1/reviews/vet-form":{"post":{"tags":["審查管理"],"summary":"儲存獸醫審查表","operationId":"save_vet_review_form","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveVetReviewFormRequest"}}},"required":true},"responses":{"200":{"description":"儲存成功"}},"security":[{"bearer":[]}]}},"/api/v1/roles":{"get":{"tags":["角色權限"],"summary":"列出所有角色","operationId":"list_roles","responses":{"200":{"description":"角色清單","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RoleWithPermissions"}}}}}},"security":[{"bearer":[]}]},"post":{"tags":["角色權限"],"summary":"建立角色","operationId":"create_role","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRoleRequest"}}},"required":true},"responses":{"200":{"description":"建立成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleWithPermissions"}}}},"400":{"description":"驗證錯誤","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/api/v1/roles/{id}":{"get":{"tags":["角色權限"],"summary":"取得單個角色","operationId":"get_role","parameters":[{"name":"id","in":"path","description":"角色 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"角色資訊","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleWithPermissions"}}}},"404":{"description":"角色不存在","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"put":{"tags":["角色權限"],"summary":"更新角色","operationId":"update_role","parameters":[{"name":"id","in":"path","description":"角色 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRoleRequest"}}},"required":true},"responses":{"200":{"description":"更新成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleWithPermissions"}}}},"400":{"description":"驗證錯誤","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"delete":{"tags":["角色權限"],"summary":"刪除角色","operationId":"delete_role","parameters":[{"name":"id","in":"path","description":"角色 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"刪除成功"},"403":{"description":"需帶 X-Reauth-Token 重新確認密碼","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"角色不存在","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/api/v1/signatures/euthanasia/{id}":{"get":{"tags":["電子簽章"],"summary":"取得安樂死單據簽章狀態","operationId":"get_euthanasia_signature_status","parameters":[{"name":"id","in":"path","description":"安樂死單據 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"簽章狀態","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignatureStatusResponse"}}}},"404":{"description":"找不到記錄"}},"security":[{"bearer":[]}]},"post":{"tags":["電子簽章"],"summary":"為安樂死單據簽章（PI 同意 / 獸醫執行）","operationId":"sign_euthanasia_order","parameters":[{"name":"id","in":"path","description":"安樂死單據 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignRecordRequest"}}},"required":true},"responses":{"200":{"description":"簽章成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignRecordResponse"}}}},"400":{"description":"請提供密碼或手寫簽名"},"401":{"description":"未授權或密碼錯誤"},"404":{"description":"找不到安樂死單據"}},"security":[{"bearer":[]}]}},"/api/v1/signatures/observation/{id}":{"post":{"tags":["電子簽章"],"summary":"為觀察記錄簽章","operationId":"sign_observation_record","parameters":[{"name":"id","in":"path","description":"觀察記錄 ID","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignRecordRequest"}}},"required":true},"responses":{"200":{"description":"簽章成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignRecordResponse"}}}},"400":{"description":"請提供密碼或手寫簽名"},"401":{"description":"未授權或密碼錯誤"},"404":{"description":"找不到觀察記錄"}},"security":[{"bearer":[]}]}},"/api/v1/signatures/protocol/{id}":{"get":{"tags":["電子簽章"],"summary":"取得計劃審查簽章狀態","operationId":"get_protocol_signature_status","parameters":[{"name":"id","in":"path","description":"計劃書 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"簽章狀態","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignatureStatusResponse"}}}},"404":{"description":"找不到記錄"}},"security":[{"bearer":[]}]},"post":{"tags":["電子簽章"],"summary":"為計劃審查簽章（IACUC 委員核准）","operationId":"sign_protocol_review","parameters":[{"name":"id","in":"path","description":"計劃書 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignRecordRequest"}}},"required":true},"responses":{"200":{"description":"簽章成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignRecordResponse"}}}},"400":{"description":"請提供密碼或手寫簽名"},"401":{"description":"未授權或密碼錯誤"},"404":{"description":"找不到計劃書"}},"security":[{"bearer":[]}]}},"/api/v1/signatures/sacrifice/{id}":{"get":{"tags":["電子簽章"],"summary":"取得犧牲記錄簽章狀態","operationId":"get_sacrifice_signature_status","parameters":[{"name":"id","in":"path","description":"犧牲記錄 ID (UUID)","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"簽章狀態","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignatureStatusResponse"}}}},"404":{"description":"找不到記錄"}},"security":[{"bearer":[]}]},"post":{"tags":["電子簽章"],"summary":"為犧牲記錄簽章","operationId":"sign_sacrifice_record","parameters":[{"name":"id","in":"path","description":"犧牲記錄 ID (UUID)","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignRecordRequest"}}},"required":true},"responses":{"200":{"description":"簽章成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignRecordResponse"}}}},"400":{"description":"請提供密碼或手寫簽名"},"401":{"description":"未授權或密碼錯誤"},"404":{"description":"找不到犧牲記錄"}},"security":[{"bearer":[]}]}},"/api/v1/signatures/transfer/{id}":{"get":{"tags":["電子簽章"],"summary":"取得轉讓記錄簽章狀態","operationId":"get_transfer_signature_status","parameters":[{"name":"id","in":"path","description":"轉讓記錄 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"簽章狀態","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignatureStatusResponse"}}}},"404":{"description":"找不到記錄"}},"security":[{"bearer":[]}]},"post":{"tags":["電子簽章"],"summary":"為轉讓記錄簽章（PI 同意 / 完成轉讓）","operationId":"sign_transfer_record","parameters":[{"name":"id","in":"path","description":"轉讓記錄 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignRecordRequest"}}},"required":true},"responses":{"200":{"description":"簽章成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignRecordResponse"}}}},"400":{"description":"請提供密碼或手寫簽名"},"401":{"description":"未授權或密碼錯誤"},"404":{"description":"找不到轉讓記錄"}},"security":[{"bearer":[]}]}},"/api/v1/sku/categories":{"get":{"tags":["SKU"],"summary":"列出 SKU 分類清單","operationId":"get_sku_categories","responses":{"200":{"description":"分類清單","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoriesResponse"}}}},"401":{"description":"未認證"}},"security":[{"bearer":[]}]}},"/api/v1/sku/categories/tree":{"get":{"tags":["SKU"],"summary":"取得完整品類樹（含停用項）供編輯分類使用","operationId":"get_sku_categories_tree","responses":{"200":{"description":"品類樹","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoriesTreeResponse"}}}},"401":{"description":"未認證"}},"security":[{"bearer":[]}]}},"/api/v1/sku/categories/{category_code}/subcategories":{"post":{"tags":["SKU"],"summary":"新增子類","operationId":"create_sku_subcategory","parameters":[{"name":"category_code","in":"path","description":"品類代碼","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSkuSubcategoryRequest"}}},"required":true},"responses":{"201":{"description":"建立成功"},"400":{"description":"驗證失敗"},"401":{"description":"未認證"},"404":{"description":"找不到品類"},"409":{"description":"子類代碼已存在"}},"security":[{"bearer":[]}]}},"/api/v1/sku/categories/{category_code}/subcategories/{code}":{"delete":{"tags":["SKU"],"summary":"刪除子類（僅 admin；無產品使用時才可刪除）","operationId":"delete_sku_subcategory","parameters":[{"name":"category_code","in":"path","description":"品類代碼","required":true,"schema":{"type":"string"}},{"name":"code","in":"path","description":"子類代碼","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"刪除成功"},"401":{"description":"未認證"},"403":{"description":"僅管理員可刪除分類"},"404":{"description":"找不到子類"},"409":{"description":"尚有產品使用此子類"}},"security":[{"bearer":[]}]},"patch":{"tags":["SKU"],"summary":"更新子類（名稱、排序、啟用狀態）","operationId":"update_sku_subcategory","parameters":[{"name":"category_code","in":"path","description":"品類代碼","required":true,"schema":{"type":"string"}},{"name":"code","in":"path","description":"子類代碼","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSkuSubcategoryRequest"}}},"required":true},"responses":{"200":{"description":"更新成功"},"401":{"description":"未認證"},"404":{"description":"找不到子類"}},"security":[{"bearer":[]}]}},"/api/v1/sku/categories/{code}":{"delete":{"tags":["SKU"],"summary":"刪除品類（僅 admin；無產品使用時才可刪除）","operationId":"delete_sku_category","parameters":[{"name":"code","in":"path","description":"品類代碼","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"刪除成功"},"401":{"description":"未認證"},"403":{"description":"僅管理員可刪除分類"},"404":{"description":"找不到品類"},"409":{"description":"尚有產品使用此品類"}},"security":[{"bearer":[]}]},"patch":{"tags":["SKU"],"summary":"更新品類（名稱、排序、啟用狀態）","operationId":"update_sku_category","parameters":[{"name":"code","in":"path","description":"品類代碼","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSkuCategoryRequest"}}},"required":true},"responses":{"200":{"description":"更新成功"},"401":{"description":"未認證"},"404":{"description":"找不到品類"}},"security":[{"bearer":[]}]}},"/api/v1/sku/categories/{code}/subcategories":{"get":{"tags":["SKU"],"summary":"列出 SKU 子分類清單","operationId":"get_sku_subcategories","parameters":[{"name":"code","in":"path","description":"分類代碼","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"子分類清單","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubcategoriesResponse"}}}},"401":{"description":"未認證"},"404":{"description":"找不到分類"}},"security":[{"bearer":[]}]}},"/api/v1/sku/generate":{"post":{"tags":["SKU"],"summary":"產生 SKU","operationId":"generate_sku","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateSkuRequest"}}},"required":true},"responses":{"200":{"description":"產生成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateSkuResponse"}}}},"400":{"description":"驗證失敗"},"401":{"description":"未認證"}},"security":[{"bearer":[]}]}},"/api/v1/sku/validate":{"post":{"tags":["SKU"],"summary":"驗證 SKU","operationId":"validate_sku","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateSkuRequest"}}},"required":true},"responses":{"200":{"description":"驗證結果","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateSkuResponse"}}}},"401":{"description":"未認證"}},"security":[{"bearer":[]}]}},"/api/v1/skus/preview":{"post":{"tags":["SKU"],"summary":"預覽 SKU","operationId":"preview_sku","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkuPreviewRequest"}}},"required":true},"responses":{"200":{"description":"預覽結果","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkuPreviewResponse"}}}},"400":{"description":"驗證失敗"},"401":{"description":"未認證"}},"security":[{"bearer":[]}]}},"/api/v1/storage-locations":{"get":{"tags":["儲位管理"],"summary":"列出儲位","operationId":"list_storage_locations","parameters":[{"name":"warehouse_id","in":"query","required":false,"schema":{"type":["string","null"],"format":"uuid"}},{"name":"location_type","in":"query","required":false,"schema":{"type":["string","null"]}},{"name":"is_active","in":"query","required":false,"schema":{"type":["boolean","null"]}},{"name":"keyword","in":"query","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"儲位清單","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StorageLocationWithWarehouse"}}}}},"401":{"description":"未認證"}},"security":[{"bearer":[]}]},"post":{"tags":["儲位管理"],"summary":"建立儲位","operationId":"create_storage_location","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateStorageLocationRequest"}}},"required":true},"responses":{"200":{"description":"建立成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StorageLocation"}}}},"400":{"description":"驗證失敗"},"401":{"description":"未認證"}},"security":[{"bearer":[]}]}},"/api/v1/storage-locations/generate-code/{warehouse_id}":{"get":{"tags":["儲位管理"],"summary":"產生儲位代碼","operationId":"generate_storage_location_code","parameters":[{"name":"warehouse_id","in":"path","description":"倉庫 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"代碼 { code }"},"401":{"description":"未認證"}},"security":[{"bearer":[]}]}},"/api/v1/storage-locations/inventory/{item_id}":{"put":{"tags":["儲位管理"],"summary":"更新儲位庫存項目數量","operationId":"update_storage_location_inventory_item","parameters":[{"name":"item_id","in":"path","description":"庫存項目 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStorageLocationInventoryItemRequest"}}},"required":true},"responses":{"200":{"description":"更新成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StorageLocationInventoryItem"}}}},"401":{"description":"未認證"},"404":{"description":"找不到項目"}},"security":[{"bearer":[]}]}},"/api/v1/storage-locations/inventory/{item_id}/transfer":{"post":{"tags":["儲位管理"],"summary":"調撥儲位庫存 (同倉庫內)","operationId":"transfer_storage_location_inventory","parameters":[{"name":"item_id","in":"path","description":"庫存項目 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferStorageLocationInventoryRequest"}}},"required":true},"responses":{"200":{"description":"調撥成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StorageLocationInventoryItem"}}}},"400":{"description":"驗證失敗"},"401":{"description":"未認證"},"404":{"description":"找不到項目"}},"security":[{"bearer":[]}]}},"/api/v1/storage-locations/{id}":{"get":{"tags":["儲位管理"],"summary":"取得單一儲位","operationId":"get_storage_location","parameters":[{"name":"id","in":"path","description":"儲位 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"儲位詳細","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StorageLocationWithWarehouse"}}}},"401":{"description":"未認證"},"404":{"description":"找不到儲位"}},"security":[{"bearer":[]}]},"put":{"tags":["儲位管理"],"summary":"更新儲位","operationId":"update_storage_location","parameters":[{"name":"id","in":"path","description":"儲位 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStorageLocationRequest"}}},"required":true},"responses":{"200":{"description":"更新成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StorageLocation"}}}},"400":{"description":"驗證失敗"},"401":{"description":"未認證"},"404":{"description":"找不到儲位"}},"security":[{"bearer":[]}]},"delete":{"tags":["儲位管理"],"summary":"刪除儲位","operationId":"delete_storage_location","parameters":[{"name":"id","in":"path","description":"儲位 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"刪除成功"},"401":{"description":"未認證"},"404":{"description":"找不到儲位"}},"security":[{"bearer":[]}]}},"/api/v1/storage-locations/{id}/inventory":{"get":{"tags":["儲位管理"],"summary":"取得儲位庫存明細","operationId":"get_storage_location_inventory","parameters":[{"name":"id","in":"path","description":"儲位 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"庫存明細","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StorageLocationInventoryItem"}}}}},"401":{"description":"未認證"},"404":{"description":"找不到儲位"}},"security":[{"bearer":[]}]}},"/api/v1/storage-locations/{storage_location_id}/inventory":{"post":{"tags":["儲位管理"],"summary":"新增儲位庫存項目","operationId":"create_storage_location_inventory_item","parameters":[{"name":"storage_location_id","in":"path","description":"儲位 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateStorageLocationInventoryItemRequest"}}},"required":true},"responses":{"200":{"description":"建立成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StorageLocationInventoryItem"}}}},"400":{"description":"驗證失敗"},"401":{"description":"未認證"},"404":{"description":"找不到儲位"}},"security":[{"bearer":[]}]}},"/api/v1/surgeries/{id}":{"get":{"tags":["動物子模組"],"summary":"取得單個手術記錄","operationId":"get_animal_surgery","parameters":[{"name":"id","in":"path","description":"手術記錄 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnimalSurgery"}}}},"401":{"description":""},"404":{"description":""}},"security":[{"bearer":[]}]},"put":{"tags":["動物子模組"],"summary":"更新手術記錄","operationId":"update_animal_surgery","parameters":[{"name":"id","in":"path","description":"手術記錄 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSurgeryRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnimalSurgery"}}}},"400":{"description":""},"401":{"description":""},"404":{"description":""}},"security":[{"bearer":[]}]},"delete":{"tags":["動物子模組"],"summary":"刪除手術記錄（軟刪除 + 刪除原因）- GLP 合規","operationId":"delete_animal_surgery","parameters":[{"name":"id","in":"path","description":"手術記錄 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteRequest"}}},"required":true},"responses":{"200":{"description":""},"401":{"description":""},"404":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/transfers/{transfer_id}":{"get":{"tags":["動物子模組"],"summary":"取得單一轉讓記錄","operationId":"get_transfer","parameters":[{"name":"transfer_id","in":"path","description":"轉讓 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnimalTransfer"}}}},"401":{"description":""},"404":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/transfers/{transfer_id}/approve":{"post":{"tags":["動物子模組"],"summary":"步驟 4：PI 同意","operationId":"approve_transfer","parameters":[{"name":"transfer_id","in":"path","description":"轉讓 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnimalTransfer"}}}},"401":{"description":""},"404":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/transfers/{transfer_id}/complete":{"post":{"tags":["動物子模組"],"summary":"步驟 5：完成轉讓","operationId":"complete_transfer","parameters":[{"name":"transfer_id","in":"path","description":"轉讓 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnimalTransfer"}}}},"401":{"description":""},"404":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/transfers/{transfer_id}/reject":{"post":{"tags":["動物子模組"],"summary":"拒絕轉讓","operationId":"reject_transfer","parameters":[{"name":"transfer_id","in":"path","description":"轉讓 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectTransferRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnimalTransfer"}}}},"400":{"description":""},"401":{"description":""},"404":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/treatment-drugs":{"get":{"tags":["治療藥物"],"summary":"列出啟用藥物選項（一般使用者，無需特別權限）","operationId":"list_treatment_drugs","responses":{"200":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/users":{"get":{"tags":["使用者管理"],"summary":"列出所有使用者","operationId":"list_users","responses":{"200":{"description":"使用者清單","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserResponse"}}}}}},"security":[{"bearer":[]}]},"post":{"tags":["使用者管理"],"summary":"建立使用者","operationId":"create_user","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUserRequest"}}},"required":true},"responses":{"200":{"description":"建立成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"400":{"description":"驗證錯誤","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"信箱已存在","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/api/v1/users/{id}":{"get":{"tags":["使用者管理"],"summary":"取得單個使用者","operationId":"get_user","parameters":[{"name":"id","in":"path","description":"使用者 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"使用者資訊","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"404":{"description":"使用者不存在","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"put":{"tags":["使用者管理"],"summary":"更新使用者","operationId":"update_user","parameters":[{"name":"id","in":"path","description":"使用者 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserRequest"}}},"required":true},"responses":{"200":{"description":"更新成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"400":{"description":"驗證錯誤","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"使用者不存在","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"delete":{"tags":["使用者管理"],"summary":"刪除使用者","operationId":"delete_user","parameters":[{"name":"id","in":"path","description":"使用者 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"刪除成功"},"403":{"description":"需帶 X-Reauth-Token 重新確認密碼","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"使用者不存在","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/api/v1/users/{id}/impersonate":{"post":{"tags":["使用者管理"],"summary":"模擬登入使用者（管理員專用的測試功能）\n回傳 Response 含 Set-Cookie headers","operationId":"impersonate_user","parameters":[{"name":"id","in":"path","description":"要模擬的使用者 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"模擬登入成功"},"403":{"description":"僅限管理員","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/api/v1/users/{id}/password":{"put":{"tags":["使用者管理"],"summary":"Admin 重設其他使用者密碼","operationId":"reset_user_password","parameters":[{"name":"id","in":"path","description":"使用者 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordRequest"}}},"required":true},"responses":{"200":{"description":"密碼重設成功"},"403":{"description":"權限不足","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/api/v1/vaccinations/{id}":{"put":{"tags":["動物子模組"],"summary":"更新疫苗接種記錄","operationId":"update_animal_vaccination","parameters":[{"name":"id","in":"path","description":"記錄 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateVaccinationRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnimalVaccination"}}}},"400":{"description":""},"401":{"description":""},"404":{"description":""}},"security":[{"bearer":[]}]},"delete":{"tags":["動物子模組"],"summary":"刪除疫苗接種記錄（軟刪除 + 刪除原因）- GLP 合規","operationId":"delete_animal_vaccination","parameters":[{"name":"id","in":"path","description":"記錄 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteRequest"}}},"required":true},"responses":{"200":{"description":""},"401":{"description":""},"404":{"description":""}},"security":[{"bearer":[]}]}},"/api/v1/warehouses":{"get":{"tags":["倉儲管理"],"summary":"列出所有倉庫","operationId":"list_warehouses","responses":{"200":{"description":"倉庫清單","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Warehouse"}}}}}},"security":[{"bearer":[]}]},"post":{"tags":["倉儲管理"],"summary":"建立倉庫","operationId":"create_warehouse","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWarehouseRequest"}}},"required":true},"responses":{"200":{"description":"建立成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Warehouse"}}}}},"security":[{"bearer":[]}]}},"/api/v1/warehouses/with-shelves":{"get":{"tags":["倉儲管理"],"summary":"取得倉庫樹（含貨架，供庫存查詢樹狀選單）","operationId":"list_warehouses_with_shelves","responses":{"200":{"description":"倉庫樹含貨架","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WarehouseTreeNode"}}}}}},"security":[{"bearer":[]}]}},"/api/v1/warehouses/{id}":{"get":{"tags":["倉儲管理"],"summary":"取得單個倉庫","operationId":"get_warehouse","parameters":[{"name":"id","in":"path","description":"倉庫 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"倉庫資訊","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Warehouse"}}}}},"security":[{"bearer":[]}]},"put":{"tags":["倉儲管理"],"summary":"更新倉庫","operationId":"update_warehouse","parameters":[{"name":"id","in":"path","description":"倉庫 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWarehouseRequest"}}},"required":true},"responses":{"200":{"description":"更新成功","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Warehouse"}}}}},"security":[{"bearer":[]}]},"delete":{"tags":["倉儲管理"],"summary":"刪除倉庫（軟刪除）\nDELETE /warehouses/:id 與 POST /warehouses/:id/delete 均支援，避免部分代理/tunnel 對 DELETE 回傳 405","operationId":"delete_warehouse","parameters":[{"name":"id","in":"path","description":"倉庫 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"刪除成功"}},"security":[{"bearer":[]}]}},"/api/v1/warehouses/{warehouse_id}/layout":{"put":{"tags":["儲位管理"],"summary":"批次更新倉庫佈局","operationId":"update_warehouse_layout","parameters":[{"name":"warehouse_id","in":"path","description":"倉庫 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStorageLayoutRequest"}}},"required":true},"responses":{"200":{"description":"更新成功","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StorageLocation"}}}}},"401":{"description":"未認證"}},"security":[{"bearer":[]}]}},"/api/v1/weights/{id}":{"put":{"tags":["動物子模組"],"summary":"更新體重記錄","operationId":"update_animal_weight","parameters":[{"name":"id","in":"path","description":"記錄 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWeightRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnimalWeight"}}}},"400":{"description":""},"401":{"description":""},"404":{"description":""}},"security":[{"bearer":[]}]},"delete":{"tags":["動物子模組"],"summary":"刪除體重記錄（軟刪除 + 刪除原因）- GLP 合規","operationId":"delete_animal_weight","parameters":[{"name":"id","in":"path","description":"記錄 ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteRequest"}}},"required":true},"responses":{"200":{"description":""},"401":{"description":""},"404":{"description":""}},"security":[{"bearer":[]}]}},"/metrics":{"get":{"tags":["監控"],"summary":"回傳 Prometheus 格式的指標文字","description":"使用 `metrics-exporter-prometheus` 的 `PrometheusHandle` 渲染指標","operationId":"metrics_handler","responses":{"200":{"description":"Prometheus 格式指標 (text/plain)"},"503":{"description":"指標收集器未啟用"}}}}},"components":{"schemas":{"AllPreferencesResponse":{"type":"object","description":"所有偏好設定回應","required":["preferences"],"properties":{"preferences":{"type":"array","items":{"$ref":"#/components/schemas/PreferenceResponse"}}}},"Animal":{"type":"object","description":"動物主表","required":["id","ear_tag","status","breed","gender","entry_date","is_deleted","created_at","updated_at"],"properties":{"animal_id":{"type":["string","null"],"format":"uuid"},"animal_no":{"type":["string","null"]},"birth_date":{"type":["string","null"],"format":"date"},"breed":{"$ref":"#/components/schemas/AnimalBreed"},"breed_other":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"},"created_by":{"type":["string","null"],"format":"uuid"},"deleted_at":{"type":["string","null"],"format":"date-time"},"deleted_by":{"type":["string","null"],"format":"uuid"},"deletion_reason":{"type":["string","null"]},"ear_tag":{"type":"string"},"entry_date":{"type":"string","format":"date"},"entry_weight":{"type":["string","null"]},"experiment_assigned_by":{"type":["string","null"],"format":"uuid"},"experiment_assigned_by_name":{"type":["string","null"]},"experiment_date":{"type":["string","null"],"format":"date"},"gender":{"$ref":"#/components/schemas/AnimalGender"},"iacuc_no":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"is_deleted":{"type":"boolean"},"pen_id":{"type":["string","null"],"format":"uuid"},"pen_location":{"type":["string","null"]},"pre_experiment_code":{"type":["string","null"]},"remark":{"type":["string","null"]},"source_id":{"type":["string","null"],"format":"uuid"},"species_id":{"type":["string","null"],"format":"uuid"},"status":{"$ref":"#/components/schemas/AnimalStatus"},"updated_at":{"type":"string","format":"date-time"},"vet_last_viewed_at":{"type":["string","null"],"format":"date-time"},"vet_sacrifice_viewed_at":{"type":["string","null"],"format":"date-time"},"vet_vaccine_viewed_at":{"type":["string","null"],"format":"date-time"},"vet_weight_viewed_at":{"type":["string","null"],"format":"date-time"}}},"AnimalBreed":{"type":"string","description":"動物品種","enum":["minipig","white","lyd","other"]},"AnimalEvent":{"type":"object","description":"動物事件回傳結構","required":["id","event_type","created_at"],"properties":{"actor_name":{"type":["string","null"]},"after_data":{},"before_data":{},"created_at":{"type":"string","format":"date-time"},"event_type":{"type":"string"},"id":{"type":"string"}}},"AnimalGender":{"type":"string","description":"動物性別","enum":["male","female"]},"AnimalListItem":{"type":"object","description":"動物列表項目（含來源名稱）","required":["id","ear_tag","status","breed","gender","entry_date","created_at"],"properties":{"animal_no":{"type":["string","null"]},"breed":{"$ref":"#/components/schemas/AnimalBreed"},"breed_other":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"},"ear_tag":{"type":"string"},"entry_date":{"type":"string","format":"date"},"gender":{"$ref":"#/components/schemas/AnimalGender"},"has_abnormal_record":{"type":["boolean","null"]},"iacuc_no":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"is_on_medication":{"type":["boolean","null"]},"latest_weight":{"type":["string","null"]},"latest_weight_date":{"type":["string","null"],"format":"date"},"pen_id":{"type":["string","null"],"format":"uuid"},"pen_location":{"type":["string","null"]},"source_name":{"type":["string","null"]},"species_id":{"type":["string","null"],"format":"uuid"},"species_name":{"type":["string","null"]},"status":{"$ref":"#/components/schemas/AnimalStatus"},"vet_last_viewed_at":{"type":["string","null"],"format":"date-time"},"vet_recommendation_date":{"type":["string","null"],"format":"date-time"}}},"AnimalObservation":{"type":"object","description":"觀察試驗紀錄","required":["id","animal_id","event_date","record_type","content","no_medication_needed","stop_medication","vet_read","created_at","updated_at"],"properties":{"anesthesia_end":{"type":["string","null"],"format":"date-time"},"anesthesia_start":{"type":["string","null"],"format":"date-time"},"animal_id":{"type":"string","format":"uuid"},"content":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"created_by":{"type":["string","null"],"format":"uuid"},"created_by_name":{"type":["string","null"]},"deleted_at":{"type":["string","null"],"format":"date-time"},"deleted_by":{"type":["string","null"],"format":"uuid"},"deletion_reason":{"type":["string","null"]},"emergency_reason":{"type":["string","null"]},"emergency_status":{"type":["string","null"]},"equipment_used":{},"event_date":{"type":"string","format":"date"},"id":{"type":"string","format":"uuid"},"is_emergency":{"type":["boolean","null"]},"no_medication_needed":{"type":"boolean"},"record_type":{"$ref":"#/components/schemas/RecordType"},"remark":{"type":["string","null"]},"reviewed_at":{"type":["string","null"],"format":"date-time"},"reviewed_by":{"type":["string","null"],"format":"uuid"},"stop_medication":{"type":"boolean"},"treatments":{},"updated_at":{"type":"string","format":"date-time"},"version":{"type":["integer","null"],"format":"int32"},"vet_read":{"type":"boolean"},"vet_read_at":{"type":["string","null"],"format":"date-time"}}},"AnimalPathologyReport":{"type":"object","description":"病理組織報告","required":["id","animal_id","created_at","updated_at"],"properties":{"animal_id":{"type":"string","format":"uuid"},"created_at":{"type":"string","format":"date-time"},"created_by":{"type":["string","null"],"format":"uuid"},"id":{"type":"string","format":"uuid"},"updated_at":{"type":"string","format":"date-time"}}},"AnimalQuery":{"type":"object","properties":{"breed":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AnimalBreed"}]},"gender":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AnimalGender"}]},"iacuc_no":{"type":["string","null"]},"is_on_medication":{"type":["boolean","null"]},"keyword":{"type":["string","null"]},"page":{"type":["integer","null"],"format":"int64"},"pen_location":{"type":["string","null"]},"per_page":{"type":["integer","null"],"format":"int64"},"status":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AnimalStatus"}]}}},"AnimalSacrifice":{"type":"object","description":"犧牲/採樣紀錄","required":["id","animal_id","method_electrocution","method_bloodletting","confirmed_sacrifice","created_at","updated_at"],"properties":{"animal_id":{"type":"string","format":"uuid"},"blood_volume_ml":{"type":["string","null"]},"confirmed_sacrifice":{"type":"boolean"},"created_at":{"type":"string","format":"date-time"},"created_by":{"type":["string","null"],"format":"uuid"},"id":{"type":"string","format":"uuid"},"method_bloodletting":{"type":"boolean"},"method_electrocution":{"type":"boolean"},"method_other":{"type":["string","null"]},"sacrifice_date":{"type":["string","null"],"format":"date"},"sampling":{"type":["string","null"]},"sampling_other":{"type":["string","null"]},"updated_at":{"type":"string","format":"date-time"},"zoletil_dose":{"type":["string","null"]}}},"AnimalStatsResponse":{"type":"object","description":"動物狀態統計（輕量級，僅 COUNT）","required":["status_counts","pen_animals_count","total"],"properties":{"pen_animals_count":{"type":"integer","format":"int64","description":"有欄位的動物數量"},"status_counts":{"type":"object","description":"各狀態的動物數量","additionalProperties":{"type":"integer","format":"int64"},"propertyNames":{"type":"string"}},"total":{"type":"integer","format":"int64","description":"全部動物總數"}}},"AnimalStatus":{"type":"string","description":"動物狀態","enum":["unassigned","in_experiment","completed","euthanized","sudden_death","transferred"]},"AnimalSurgery":{"type":"object","description":"手術紀錄","required":["id","animal_id","is_first_experiment","surgery_date","surgery_site","no_medication_needed","vet_read","created_at","updated_at"],"properties":{"anesthesia_maintenance":{},"anesthesia_observation":{"type":["string","null"]},"animal_id":{"type":"string","format":"uuid"},"created_at":{"type":"string","format":"date-time"},"created_by":{"type":["string","null"],"format":"uuid"},"created_by_name":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"induction_anesthesia":{},"is_first_experiment":{"type":"boolean"},"no_medication_needed":{"type":"boolean"},"positioning":{"type":["string","null"]},"post_surgery_medication":{},"pre_surgery_medication":{},"reflex_recovery":{"type":["string","null"]},"remark":{"type":["string","null"]},"respiration_rate":{"type":["integer","null"],"format":"int32"},"surgery_date":{"type":"string","format":"date"},"surgery_site":{"type":"string"},"updated_at":{"type":"string","format":"date-time"},"vet_read":{"type":"boolean"},"vet_read_at":{"type":["string","null"],"format":"date-time"},"vital_signs":{}}},"AnimalTransfer":{"type":"object","description":"動物轉讓記錄","required":["id","animal_id","from_iacuc_no","status","initiated_by","reason","created_at","updated_at"],"properties":{"animal_id":{"type":"string","format":"uuid"},"completed_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"from_iacuc_no":{"type":"string"},"id":{"type":"string","format":"uuid"},"initiated_by":{"type":"string","format":"uuid"},"reason":{"type":"string"},"rejected_by":{"type":["string","null"],"format":"uuid"},"rejected_reason":{"type":["string","null"]},"remark":{"type":["string","null"]},"status":{"$ref":"#/components/schemas/AnimalTransferStatus"},"to_iacuc_no":{"type":["string","null"]},"transfer_type":{"type":"string","description":"轉讓類型：external = 轉給其他機構（完成時清空欄位），internal = 仍在機構內（保留欄位）"},"updated_at":{"type":"string","format":"date-time"}}},"AnimalTransferStatus":{"type":"string","description":"動物轉讓狀態","enum":["pending","vet_evaluated","plan_assigned","pi_approved","completed","rejected"]},"AnimalVaccination":{"type":"object","description":"疫苗/驅蟲紀錄","required":["id","animal_id","administered_date","created_at"],"properties":{"administered_date":{"type":"string","format":"date"},"animal_id":{"type":"string","format":"uuid"},"created_at":{"type":"string","format":"date-time"},"created_by":{"type":["string","null"],"format":"uuid"},"deworming_dose":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"vaccine":{"type":["string","null"]}}},"AnimalWeight":{"type":"object","description":"體重紀錄","required":["id","animal_id","measure_date","weight","created_at"],"properties":{"animal_id":{"type":"string","format":"uuid"},"created_at":{"type":"string","format":"date-time"},"created_by":{"type":["string","null"],"format":"uuid"},"id":{"type":"string","format":"uuid"},"measure_date":{"type":"string","format":"date"},"weight":{"type":"string"}}},"AnimalWeightResponse":{"type":"object","description":"體重紀錄回應（含建立者名稱）","required":["id","animal_id","measure_date","weight","created_at"],"properties":{"animal_id":{"type":"string","format":"uuid"},"created_at":{"type":"string","format":"date-time"},"created_by":{"type":["string","null"],"format":"uuid"},"created_by_name":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"measure_date":{"type":"string","format":"date"},"weight":{"type":"string"}}},"AnimalsByPen":{"type":"object","description":"依欄位分組的動物","required":["pen_location","animals"],"properties":{"animals":{"type":"array","items":{"$ref":"#/components/schemas/AnimalListItem"}},"pen_location":{"type":"string"}}},"AnnotationResponse":{"type":"object","required":["id","annotation_type","content","created_at","has_signature"],"properties":{"annotation_type":{"type":"string"},"content":{"type":"string"},"created_at":{"type":"string"},"created_by_name":{"type":["string","null"]},"has_signature":{"type":"boolean"},"id":{"type":"string","format":"uuid"}}},"AssignCoEditorRequest":{"type":"object","required":["protocol_id","user_id"],"properties":{"protocol_id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"}}},"AssignReviewerRequest":{"type":"object","required":["protocol_id","reviewer_id"],"properties":{"protocol_id":{"type":"string","format":"uuid"},"reviewer_id":{"type":"string","format":"uuid"}}},"AssignTransferPlanRequest":{"type":"object","description":"指定新計劃請求","required":["to_iacuc_no"],"properties":{"to_iacuc_no":{"type":"string"}}},"BatchAssignRequest":{"type":"object","required":["animal_ids","iacuc_no"],"properties":{"animal_ids":{"type":"array","items":{"type":"string","format":"uuid"}},"iacuc_no":{"type":"string"}}},"Building":{"type":"object","required":["id","facility_id","code","name","is_active","sort_order","created_at","updated_at"],"properties":{"code":{"type":"string"},"config":{},"created_at":{"type":"string","format":"date-time"},"description":{"type":["string","null"]},"facility_id":{"type":"string","format":"uuid"},"id":{"type":"string","format":"uuid"},"is_active":{"type":"boolean"},"name":{"type":"string"},"sort_order":{"type":"integer","format":"int32"},"updated_at":{"type":"string","format":"date-time"}}},"BuildingWithFacility":{"type":"object","required":["id","facility_id","facility_code","facility_name","code","name","is_active","sort_order"],"properties":{"code":{"type":"string"},"config":{},"description":{"type":["string","null"]},"facility_code":{"type":"string"},"facility_id":{"type":"string","format":"uuid"},"facility_name":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_active":{"type":"boolean"},"name":{"type":"string"},"sort_order":{"type":"integer","format":"int32"}}},"CategoriesResponse":{"type":"object","description":"取得類別選項回應","required":["categories"],"properties":{"categories":{"type":"array","items":{"$ref":"#/components/schemas/CategoryOption"}}}},"CategoriesTreeResponse":{"type":"object","description":"編輯分類用：完整品類樹","required":["categories"],"properties":{"categories":{"type":"array","items":{"$ref":"#/components/schemas/CategoryForEdit"}}}},"CategoryForEdit":{"type":"object","description":"編輯用：品類（含子類與 sort_order, is_active）","required":["code","name","sort_order","is_active","subcategories"],"properties":{"code":{"type":"string"},"is_active":{"type":"boolean"},"name":{"type":"string"},"sort_order":{"type":"integer","format":"int32"},"subcategories":{"type":"array","items":{"$ref":"#/components/schemas/SubcategoryForEdit"}}}},"CategoryOption":{"type":"object","required":["code","name"],"properties":{"code":{"type":"string"},"name":{"type":"string"}}},"ChangeOwnPasswordRequest":{"type":"object","description":"修改自己的密碼請求","required":["current_password","new_password"],"properties":{"current_password":{"type":"string"},"new_password":{"type":"string"}}},"ChangeStatusRequest":{"type":"object","required":["to_status"],"properties":{"remark":{"type":["string","null"]},"reviewer_ids":{"type":["array","null"],"items":{"type":"string","format":"uuid"},"description":"審查委員 ID 列表（當目標狀態為 UNDER_REVIEW 時必填 2-3 位）"},"to_status":{"$ref":"#/components/schemas/ProtocolStatus"},"vet_id":{"type":["string","null"],"format":"uuid","description":"獸醫師 ID（當目標狀態為 VET_REVIEW 時可選，未設定則使用預設獸醫）"}}},"ClockInRequest":{"type":"object","properties":{"latitude":{"type":["number","null"],"format":"double","description":"GPS 緯度"},"longitude":{"type":["number","null"],"format":"double","description":"GPS 經度"},"source":{"type":["string","null"]}}},"CoEditorAssignmentResponse":{"type":"object","description":"Co-Editor 指派回應（含用戶資訊）","required":["user_id","protocol_id","role_in_protocol","granted_at","user_name","user_email"],"properties":{"granted_at":{"type":"string","format":"date-time"},"granted_by":{"type":["string","null"],"format":"uuid"},"granted_by_name":{"type":["string","null"]},"protocol_id":{"type":"string","format":"uuid"},"role_in_protocol":{"$ref":"#/components/schemas/ProtocolRole"},"user_email":{"type":"string"},"user_id":{"type":"string","format":"uuid"},"user_name":{"type":"string"}}},"ComponentCheck":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}}},"ConfirmPasswordRequest":{"type":"object","description":"SEC-33：敏感操作二級認證 — 確認密碼請求","required":["password"],"properties":{"password":{"type":"string"}}},"CreateAnimalRequest":{"type":"object","required":["ear_tag","breed","gender","entry_date","entry_weight"],"properties":{"birth_date":{"type":["string","null"],"format":"date"},"breed":{"$ref":"#/components/schemas/AnimalBreed"},"breed_other":{"type":["string","null"]},"ear_tag":{"type":"string"},"entry_date":{"type":"string","format":"date"},"entry_weight":{"type":"string"},"force_create":{"type":"boolean","description":"強制建立（跳過耳號重複警告，但同耳號同出生日期仍會阻擋）"},"gender":{"$ref":"#/components/schemas/AnimalGender"},"pen_id":{"type":["string","null"],"format":"uuid"},"pen_location":{"type":["string","null"]},"pre_experiment_code":{"type":["string","null"]},"remark":{"type":["string","null"]},"source_id":{"type":["string","null"],"format":"uuid"},"species_id":{"type":["string","null"],"format":"uuid"}}},"CreateAnnotationRequest":{"type":"object","required":["content","annotation_type"],"properties":{"annotation_type":{"type":"string"},"content":{"type":"string"},"password":{"type":["string","null"]}}},"CreateApPaymentRequest":{"type":"object","description":"建立 AP 付款請求","required":["partner_id","payment_date","amount"],"properties":{"amount":{"type":"string"},"partner_id":{"type":"string","format":"uuid"},"payment_date":{"type":"string","format":"date"},"reference":{"type":["string","null"]}}},"CreateArReceiptRequest":{"type":"object","description":"建立 AR 收款請求","required":["partner_id","receipt_date","amount"],"properties":{"amount":{"type":"string"},"partner_id":{"type":"string","format":"uuid"},"receipt_date":{"type":"string","format":"date"},"reference":{"type":["string","null"]}}},"CreateBuildingRequest":{"type":"object","required":["facility_id","code","name"],"properties":{"code":{"type":"string"},"config":{},"description":{"type":["string","null"]},"facility_id":{"type":"string","format":"uuid"},"name":{"type":"string"},"sort_order":{"type":["integer","null"],"format":"int32"}}},"CreateCategoryRequest":{"type":"object","required":["code","name"],"properties":{"code":{"type":"string"},"name":{"type":"string"},"parent_id":{"type":["string","null"],"format":"uuid"}}},"CreateCommentRequest":{"type":"object","required":["protocol_version_id","content"],"properties":{"content":{"type":"string"},"protocol_version_id":{"type":"string","format":"uuid"},"review_stage":{"type":["string","null"],"description":"審查階段（若未提供，自動根據 protocol status 決定）"}}},"CreateDepartmentRequest":{"type":"object","required":["code","name"],"properties":{"code":{"type":"string"},"config":{},"manager_id":{"type":["string","null"],"format":"uuid"},"name":{"type":"string"},"parent_id":{"type":["string","null"],"format":"uuid"},"sort_order":{"type":["integer","null"],"format":"int32"}}},"CreateDocumentRequest":{"type":"object","description":"建立單據請求","required":["doc_type","doc_date"],"properties":{"doc_date":{"type":"string","format":"date"},"doc_type":{"$ref":"#/components/schemas/DocType"},"iacuc_no":{"type":["string","null"],"description":"IACUC 計畫編號（專案費用歸屬）"},"lines":{"type":"array","items":{"$ref":"#/components/schemas/DocumentLineInput"},"description":"單據明細（盤點單可選，會根據範圍自動生成）"},"partner_id":{"type":["string","null"],"format":"uuid"},"protocol_id":{"type":["string","null"],"format":"uuid","description":"銷貨計畫 ID（SO/DO 使用）"},"remark":{"type":["string","null"]},"source_doc_id":{"type":["string","null"],"format":"uuid"},"stocktake_scope":{"description":"盤點範圍設定（僅盤點單使用）"},"warehouse_from_id":{"type":["string","null"],"format":"uuid"},"warehouse_id":{"type":["string","null"],"format":"uuid"},"warehouse_to_id":{"type":["string","null"],"format":"uuid"}}},"CreateFacilityRequest":{"type":"object","required":["code","name"],"properties":{"address":{"type":["string","null"]},"code":{"type":"string"},"config":{},"contact_person":{"type":["string","null"]},"name":{"type":"string"},"phone":{"type":["string","null"]}}},"CreateLeaveRequest":{"type":"object","required":["leave_type","start_date","end_date","total_days"],"properties":{"end_date":{"type":"string","format":"date"},"end_time":{"type":["string","null"]},"is_retroactive":{"type":["boolean","null"]},"is_urgent":{"type":["boolean","null"]},"leave_type":{"type":"string"},"proxy_user_id":{"type":["string","null"],"format":"uuid"},"reason":{"type":["string","null"]},"start_date":{"type":"string","format":"date"},"start_time":{"type":["string","null"]},"supporting_documents":{"type":["array","null"],"items":{"type":"string"}},"total_days":{"type":"number","format":"double"},"total_hours":{"type":["number","null"],"format":"double"}}},"CreateObservationRequest":{"type":"object","required":["event_date","record_type","content"],"properties":{"anesthesia_end":{"type":["string","null"],"format":"date-time"},"anesthesia_start":{"type":["string","null"],"format":"date-time"},"content":{"type":"string"},"emergency_reason":{"type":["string","null"]},"equipment_used":{},"event_date":{"type":"string","format":"date"},"is_emergency":{"type":"boolean"},"no_medication_needed":{"type":"boolean"},"record_type":{"$ref":"#/components/schemas/RecordType"},"remark":{"type":["string","null"]},"treatments":{}}},"CreateOvertimeRequest":{"type":"object","required":["overtime_date","start_time","end_time","overtime_type","reason"],"properties":{"end_time":{"type":"string"},"overtime_date":{"type":"string","format":"date"},"overtime_type":{"type":"string"},"reason":{"type":"string"},"start_time":{"type":"string"}}},"CreatePartnerRequest":{"type":"object","required":["partner_type","name"],"properties":{"address":{"type":["string","null"]},"code":{"type":["string","null"]},"customer_category":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CustomerCategory"}]},"email":{"type":["string","null"]},"name":{"type":"string"},"partner_type":{"$ref":"#/components/schemas/PartnerType"},"payment_terms":{"type":["string","null"]},"phone":{"type":["string","null"]},"phone_ext":{"type":["string","null"]},"supplier_category":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SupplierCategory"}]},"tax_id":{"type":["string","null"]}}},"CreatePenRequest":{"type":"object","required":["zone_id","code"],"properties":{"capacity":{"type":["integer","null"],"format":"int32"},"code":{"type":"string"},"col_index":{"type":["integer","null"],"format":"int32"},"name":{"type":["string","null"]},"row_index":{"type":["integer","null"],"format":"int32"},"zone_id":{"type":"string","format":"uuid"}}},"CreateProductRequest":{"type":"object","description":"建立產品請求（SKU 可選填，未填時由系統自動生成）","required":["name","base_uom"],"properties":{"barcode":{"type":["string","null"]},"base_uom":{"type":"string"},"category_code":{"type":["string","null"]},"default_expiry_days":{"type":["integer","null"],"format":"int32"},"image_url":{"type":["string","null"]},"license_no":{"type":["string","null"]},"name":{"type":"string"},"pack_qty":{"type":["integer","null"],"format":"int32"},"pack_unit":{"type":["string","null"]},"remark":{"type":["string","null"]},"reorder_point":{"type":["string","null"]},"reorder_point_uom":{"type":["string","null"]},"safety_stock":{"type":["string","null"]},"safety_stock_uom":{"type":["string","null"]},"sku":{"type":["string","null"],"description":"選填；匯入時可帶入，未填則自動生成"},"spec":{"type":["string","null"]},"storage_condition":{"type":["string","null"]},"subcategory_code":{"type":["string","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"track_batch":{"type":"boolean"},"track_expiry":{"type":"boolean"},"uom_conversions":{"type":"array","items":{"$ref":"#/components/schemas/UomConversionInput"}}}},"CreateProductWithSkuRequest":{"type":"object","description":"擴展的產品創建請求（包含 SKU 生成所需資訊）","required":["base_uom","category_code","subcategory_code","source_code"],"properties":{"attributes":{"type":["object","null"],"additionalProperties":{},"propertyNames":{"type":"string"}},"base_uom":{"type":"string"},"category_code":{"type":"string"},"name":{"type":["string","null"]},"pack_qty":{"type":["integer","null"],"format":"int32"},"pack_unit":{"type":["string","null"]},"reorder_point":{"type":["string","null"]},"safety_stock":{"type":["string","null"]},"source_code":{"type":"string"},"spec":{"type":["string","null"]},"subcategory_code":{"type":"string"},"track_batch":{"type":"boolean"},"track_expiry":{"type":"boolean"}}},"CreateProtocolRequest":{"type":"object","required":["title"],"properties":{"end_date":{"type":["string","null"],"format":"date"},"pi_user_id":{"type":["string","null"],"format":"uuid"},"start_date":{"type":["string","null"],"format":"date"},"title":{"type":"string"},"working_content":{}}},"CreateRoleRequest":{"type":"object","required":["code","name"],"properties":{"code":{"type":"string"},"description":{"type":["string","null"]},"is_internal":{"type":"boolean"},"name":{"type":"string"},"permission_ids":{"type":"array","items":{"type":"string","format":"uuid"}}}},"CreateSacrificeRequest":{"type":"object","properties":{"blood_volume_ml":{"type":["string","null"]},"confirmed_sacrifice":{"type":"boolean"},"method_bloodletting":{"type":"boolean"},"method_electrocution":{"type":"boolean"},"method_other":{"type":["string","null"]},"sacrifice_date":{"type":["string","null"],"format":"date"},"sampling":{"type":["string","null"]},"sampling_other":{"type":["string","null"]},"zoletil_dose":{"type":["string","null"]}}},"CreateSkuSubcategoryRequest":{"type":"object","description":"新增子類請求","required":["code","name"],"properties":{"code":{"type":"string","description":"子類代碼，3 碼大寫英數字"},"is_active":{"type":["boolean","null"],"description":"是否啟用，預設 true"},"name":{"type":"string","description":"顯示名稱"},"sort_order":{"type":["integer","null"],"format":"int32","description":"排序，預設 0"}}},"CreateSpeciesRequest":{"type":"object","required":["code","name"],"properties":{"code":{"type":"string"},"config":{},"icon":{"type":["string","null"]},"name":{"type":"string"},"name_en":{"type":["string","null"]},"parent_id":{"type":["string","null"],"format":"uuid"},"sort_order":{"type":["integer","null"],"format":"int32"}}},"CreateStorageLocationInventoryItemRequest":{"type":"object","description":"新增儲位庫存項目請求","required":["product_id","on_hand_qty"],"properties":{"batch_no":{"type":["string","null"]},"expiry_date":{"type":["string","null"],"format":"date"},"on_hand_qty":{"type":"string"},"product_id":{"type":"string","format":"uuid"}}},"CreateStorageLocationRequest":{"type":"object","description":"建立儲位請求","required":["warehouse_id","name"],"properties":{"capacity":{"type":["integer","null"],"format":"int32"},"code":{"type":["string","null"],"description":"代碼（選填，系統會自動生成）"},"col_index":{"type":["integer","null"],"format":"int32"},"color":{"type":["string","null"]},"config":{},"height":{"type":["integer","null"],"format":"int32"},"location_type":{"type":["string","null"]},"name":{"type":"string","description":"名稱（必填）"},"row_index":{"type":["integer","null"],"format":"int32"},"warehouse_id":{"type":"string","format":"uuid"},"width":{"type":["integer","null"],"format":"int32"}}},"CreateSurgeryRequest":{"type":"object","required":["surgery_date","surgery_site"],"properties":{"anesthesia_maintenance":{},"anesthesia_observation":{"type":["string","null"]},"induction_anesthesia":{},"is_first_experiment":{"type":"boolean"},"no_medication_needed":{"type":"boolean"},"positioning":{"type":["string","null"]},"post_surgery_medication":{},"pre_surgery_medication":{},"reflex_recovery":{"type":["string","null"]},"remark":{"type":["string","null"]},"respiration_rate":{"type":["integer","null"],"format":"int32"},"surgery_date":{"type":"string","format":"date"},"surgery_site":{"type":"string"},"vital_signs":{}}},"CreateTransferRequest":{"type":"object","description":"發起轉讓請求","required":["reason"],"properties":{"reason":{"type":"string"},"remark":{"type":["string","null"]},"transfer_type":{"type":"string","description":"轉讓類型：external = 轉給其他機構（完成時清空欄位），internal = 仍在機構內（保留欄位）。預設 internal。"}}},"CreateTreatmentDrugRequest":{"type":"object","description":"建立藥物選項請求","required":["name"],"properties":{"available_units":{"type":["array","null"],"items":{"type":"string"}},"category":{"type":["string","null"]},"default_dosage_unit":{"type":["string","null"]},"default_dosage_value":{"type":["string","null"]},"display_name":{"type":["string","null"]},"erp_product_id":{"type":["string","null"],"format":"uuid"},"name":{"type":"string"},"sort_order":{"type":"integer","format":"int32"}}},"CreateUserRequest":{"type":"object","required":["email","password","display_name"],"properties":{"aup_roles":{"type":"array","items":{"type":"string"}},"display_name":{"type":"string"},"email":{"type":"string"},"entry_date":{"type":["string","null"],"format":"date"},"expires_at":{"type":["string","null"],"format":"date-time","description":"帳號到期日（NULL = 永不過期），用於實習生等臨時帳號"},"is_internal":{"type":"boolean"},"organization":{"type":["string","null"]},"password":{"type":"string"},"phone":{"type":["string","null"]},"phone_ext":{"type":["string","null"]},"position":{"type":["string","null"]},"role_ids":{"type":"array","items":{"type":"string","format":"uuid"}},"trainings":{"type":"array","items":{"$ref":"#/components/schemas/UserTraining"}},"years_experience":{"type":"integer","format":"int32"}}},"CreateVaccinationRequest":{"type":"object","required":["administered_date"],"properties":{"administered_date":{"type":"string","format":"date"},"deworming_dose":{"type":["string","null"]},"vaccine":{"type":["string","null"]}}},"CreateWarehouseRequest":{"type":"object","required":["name"],"properties":{"address":{"type":["string","null"]},"code":{"type":["string","null"]},"name":{"type":"string"}}},"CreateWeightRequest":{"type":"object","required":["measure_date","weight"],"properties":{"measure_date":{"type":"string","format":"date"},"weight":{"type":"string"}}},"CreateZoneRequest":{"type":"object","required":["building_id","code"],"properties":{"building_id":{"type":"string","format":"uuid"},"code":{"type":"string"},"color":{"type":["string","null"]},"layout_config":{},"name":{"type":["string","null"]},"sort_order":{"type":["integer","null"],"format":"int32"}}},"CustomerCategory":{"type":"string","enum":["internal","external","research","other"]},"DataBoundaryResponse":{"type":"object","description":"資料隔離：回傳當前使用者的可見時間界線","properties":{"boundary":{"type":["string","null"],"format":"date-time","description":"若為 Some，僅應顯示 created_at > boundary 的記錄；null 代表可見所有"}}},"DeleteQuery":{"type":"object","properties":{"hard":{"type":["boolean","null"]}}},"DeleteRequest":{"type":"object","description":"刪除請求（含刪除原因）- GLP 合規要求","required":["reason"],"properties":{"reason":{"type":"string"}}},"Department":{"type":"object","required":["id","code","name","is_active","sort_order","created_at","updated_at"],"properties":{"code":{"type":"string"},"config":{},"created_at":{"type":"string","format":"date-time"},"id":{"type":"string","format":"uuid"},"is_active":{"type":"boolean"},"manager_id":{"type":["string","null"],"format":"uuid"},"name":{"type":"string"},"parent_id":{"type":["string","null"],"format":"uuid"},"sort_order":{"type":"integer","format":"int32"},"updated_at":{"type":"string","format":"date-time"}}},"DepartmentWithManager":{"type":"object","required":["id","code","name","is_active","sort_order"],"properties":{"code":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_active":{"type":"boolean"},"manager_id":{"type":["string","null"],"format":"uuid"},"manager_name":{"type":["string","null"]},"name":{"type":"string"},"parent_id":{"type":["string","null"],"format":"uuid"},"parent_name":{"type":["string","null"]},"sort_order":{"type":"integer","format":"int32"}}},"DiskCheck":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}}},"DocStatus":{"type":"string","description":"單據狀態","enum":["draft","submitted","approved","cancelled"]},"DocType":{"type":"string","description":"單據類型","enum":["PO","GRN","PR","SO","DO","TR","STK","ADJ","RM","SR","RTN"]},"Document":{"type":"object","description":"單據頭","required":["id","doc_type","doc_no","status","doc_date","created_by","created_at","updated_at"],"properties":{"approved_at":{"type":["string","null"],"format":"date-time"},"approved_by":{"type":["string","null"],"format":"uuid"},"created_at":{"type":"string","format":"date-time"},"created_by":{"type":"string","format":"uuid"},"doc_date":{"type":"string","format":"date"},"doc_no":{"type":"string"},"doc_type":{"$ref":"#/components/schemas/DocType"},"iacuc_no":{"type":["string","null"],"description":"IACUC 計畫編號（專案費用歸屬）"},"id":{"type":"string","format":"uuid"},"manager_approval_status":{"type":["string","null"]},"manager_approved_at":{"type":["string","null"],"format":"date-time"},"manager_approved_by":{"type":["string","null"],"format":"uuid"},"manager_reject_reason":{"type":["string","null"]},"partner_id":{"type":["string","null"],"format":"uuid"},"protocol_id":{"type":["string","null"],"format":"uuid","description":"銷貨計畫 ID（SO/DO 直接關聯計畫，取代手動建立客戶）"},"receipt_status":{"type":["string","null"],"description":"入庫狀態（僅採購單使用）: pending/partial/complete"},"remark":{"type":["string","null"]},"requires_manager_approval":{"type":["boolean","null"]},"scrap_total_amount":{"type":["string","null"]},"source_doc_id":{"type":["string","null"],"format":"uuid","description":"來源單據 ID（如入庫單關聯採購單）"},"status":{"$ref":"#/components/schemas/DocStatus"},"stocktake_scope":{"description":"盤點範圍設定（循環盤點用）"},"updated_at":{"type":"string","format":"date-time"},"warehouse_from_id":{"type":["string","null"],"format":"uuid"},"warehouse_id":{"type":["string","null"],"format":"uuid"},"warehouse_to_id":{"type":["string","null"],"format":"uuid"}}},"DocumentLine":{"type":"object","description":"單據明細","required":["id","document_id","line_no","product_id","qty","uom"],"properties":{"batch_no":{"type":["string","null"]},"document_id":{"type":"string","format":"uuid"},"expiry_date":{"type":["string","null"],"format":"date"},"id":{"type":"string","format":"uuid"},"line_no":{"type":"integer","format":"int32"},"product_id":{"type":"string","format":"uuid"},"qty":{"type":"string"},"remark":{"type":["string","null"]},"storage_location_id":{"type":["string","null"],"format":"uuid","description":"儲位 ID（GRN 入庫指定儲位）"},"unit_price":{"type":["string","null"]},"uom":{"type":"string"}}},"DocumentLineInput":{"type":"object","required":["product_id","qty","uom"],"properties":{"batch_no":{"type":["string","null"]},"expiry_date":{"type":["string","null"],"format":"date"},"product_id":{"type":"string","format":"uuid"},"qty":{"type":"string"},"remark":{"type":["string","null"]},"storage_location_id":{"type":["string","null"],"format":"uuid","description":"儲位 ID（GRN 入庫指定儲位）"},"unit_price":{"type":["string","null"]},"uom":{"type":"string"}}},"DocumentLineWithProduct":{"type":"object","required":["id","document_id","line_no","product_id","product_sku","product_name","qty","uom"],"properties":{"batch_no":{"type":["string","null"]},"document_id":{"type":"string","format":"uuid"},"expiry_date":{"type":["string","null"],"format":"date"},"id":{"type":"string","format":"uuid"},"line_no":{"type":"integer","format":"int32"},"product_id":{"type":"string","format":"uuid"},"product_name":{"type":"string"},"product_sku":{"type":"string"},"qty":{"type":"string"},"remark":{"type":["string","null"]},"storage_location_id":{"type":["string","null"],"format":"uuid","description":"儲位 ID（GRN 入庫指定儲位）"},"unit_price":{"type":["string","null"]},"uom":{"type":"string"}}},"DocumentListItem":{"type":"object","description":"單據列表項","required":["id","doc_type","doc_no","status","doc_date","created_by_name","created_at","line_count","has_journal_entry"],"properties":{"approved_at":{"type":["string","null"],"format":"date-time"},"approved_by_name":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"},"created_by_name":{"type":"string"},"doc_date":{"type":"string","format":"date"},"doc_no":{"type":"string"},"doc_type":{"$ref":"#/components/schemas/DocType"},"has_journal_entry":{"type":"boolean","description":"是否已產生會計傳票（核准後觸發過帳的類型：GRN, DO, PR）"},"iacuc_no":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"line_count":{"type":"integer","format":"int64"},"partner_id":{"type":["string","null"],"format":"uuid"},"partner_name":{"type":["string","null"]},"protocol_id":{"type":["string","null"],"format":"uuid"},"protocol_no":{"type":["string","null"]},"receipt_status":{"type":["string","null"]},"status":{"$ref":"#/components/schemas/DocStatus"},"total_amount":{"type":["string","null"]},"warehouse_name":{"type":["string","null"]}}},"DocumentQuery":{"type":"object","description":"查詢單據","properties":{"date_from":{"type":["string","null"],"format":"date"},"date_to":{"type":["string","null"],"format":"date"},"doc_type":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DocType"}]},"doc_types":{"type":["string","null"],"description":"多類型篩選，逗號分隔，例如 \"PO,GRN,PR\"；與 doc_type 同時存在時 doc_type 優先"},"iacuc_no":{"type":["string","null"]},"keyword":{"type":["string","null"]},"partner_id":{"type":["string","null"],"format":"uuid"},"status":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DocStatus"}]},"warehouse_id":{"type":["string","null"],"format":"uuid"}}},"DocumentWithLines":{"allOf":[{"$ref":"#/components/schemas/Document"},{"type":"object","required":["lines","created_by_name"],"properties":{"approved_by_name":{"type":["string","null"]},"created_by_name":{"type":"string"},"lines":{"type":"array","items":{"$ref":"#/components/schemas/DocumentLineWithProduct"}},"partner_name":{"type":["string","null"]},"protocol_no":{"type":["string","null"],"description":"銷貨計畫編號（protocol_id 對應）"},"warehouse_from_name":{"type":["string","null"]},"warehouse_name":{"type":["string","null"]},"warehouse_to_name":{"type":["string","null"]}}}],"description":"單據詳情（含明細）"},"ErrorDetail":{"type":"object","description":"錯誤詳細資訊","required":["message","code","blocking"],"properties":{"blocking":{"type":"boolean","description":"是否阻斷操作"},"code":{"type":"integer","format":"int32","description":"HTTP 狀態碼","minimum":0},"message":{"type":"string","description":"錯誤訊息"}}},"ErrorResponse":{"type":"object","description":"API 錯誤回應格式（供 Swagger 文件展示）","required":["error"],"properties":{"error":{"$ref":"#/components/schemas/ErrorDetail","description":"錯誤資訊"}}},"Facility":{"type":"object","required":["id","code","name","is_active","created_at","updated_at"],"properties":{"address":{"type":["string","null"]},"code":{"type":"string"},"config":{},"contact_person":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"},"id":{"type":"string","format":"uuid"},"is_active":{"type":"boolean"},"name":{"type":"string"},"phone":{"type":["string","null"]},"updated_at":{"type":"string","format":"date-time"}}},"ForgotPasswordRequest":{"type":"object","description":"忘記密碼請求","required":["email"],"properties":{"email":{"type":"string"}}},"GdprExportResponse":{"type":"object","description":"GDPR 匯出：個人資料完整回應","required":["exported_at","user","preferences"],"properties":{"exported_at":{"type":"string","format":"date-time"},"notification_settings":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/NotificationSettings"}]},"preferences":{"type":"array","items":{"$ref":"#/components/schemas/PreferenceExport"}},"user":{"$ref":"#/components/schemas/UserResponse"}}},"GenerateCodeResponse":{"type":"object","required":["code"],"properties":{"code":{"type":"string"}}},"GenerateSkuRequest":{"type":"object","description":"生成 SKU 請求","required":["category","subcategory"],"properties":{"category":{"type":"string"},"subcategory":{"type":"string"}}},"GenerateSkuResponse":{"type":"object","description":"生成 SKU 回應","required":["sku","category","subcategory","sequence"],"properties":{"category":{"$ref":"#/components/schemas/CategoryOption"},"sequence":{"type":"integer","format":"int32"},"sku":{"type":"string"},"subcategory":{"$ref":"#/components/schemas/CategoryOption"}}},"HealthChecks":{"type":"object","required":["database","disk"],"properties":{"database":{"$ref":"#/components/schemas/ComponentCheck"},"disk":{"$ref":"#/components/schemas/DiskCheck"}}},"HealthResponse":{"type":"object","required":["status","checks"],"properties":{"checks":{"$ref":"#/components/schemas/HealthChecks"},"status":{"type":"string"}}},"ImportFromErpRequest":{"type":"object","description":"從 ERP 匯入請求","required":["product_ids"],"properties":{"category":{"type":["string","null"]},"product_ids":{"type":"array","items":{"type":"string","format":"uuid"}}}},"LanguagePreference":{"type":"string","description":"語言偏好","enum":["zh-TW","en"]},"LocationType":{"type":"string","description":"儲位類型","enum":["shelf","rack","zone","bin"]},"LoginRequest":{"type":"object","required":["email","password"],"properties":{"email":{"type":"string"},"password":{"type":"string"}}},"LoginResponse":{"type":"object","required":["access_token","refresh_token","token_type","expires_in","user","must_change_password"],"properties":{"access_token":{"type":"string"},"expires_in":{"type":"integer","format":"int64"},"must_change_password":{"type":"boolean"},"refresh_token":{"type":"string"},"token_type":{"type":"string"},"user":{"$ref":"#/components/schemas/UserResponse"}}},"NotificationSettings":{"type":"object","description":"通知設定","required":["user_id","email_low_stock","email_expiry_warning","email_document_approval","email_protocol_status","email_monthly_report","expiry_warning_days","low_stock_notify_immediately","updated_at"],"properties":{"email_document_approval":{"type":"boolean"},"email_expiry_warning":{"type":"boolean"},"email_low_stock":{"type":"boolean"},"email_monthly_report":{"type":"boolean"},"email_protocol_status":{"type":"boolean"},"expiry_warning_days":{"type":"integer","format":"int32"},"low_stock_notify_immediately":{"type":"boolean"},"updated_at":{"type":"string","format":"date-time"},"user_id":{"type":"string","format":"uuid"}}},"PackInfo":{"type":"object","required":["uom","qty"],"properties":{"qty":{"type":"integer","format":"int32"},"uom":{"type":"string"}}},"Partner":{"type":"object","required":["id","partner_type","code","name","is_active","created_at","updated_at"],"properties":{"address":{"type":["string","null"]},"code":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"customer_category":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CustomerCategory"}]},"email":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"is_active":{"type":"boolean"},"name":{"type":"string"},"partner_type":{"$ref":"#/components/schemas/PartnerType"},"payment_terms":{"type":["string","null"]},"phone":{"type":["string","null"]},"phone_ext":{"type":["string","null"]},"supplier_category":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SupplierCategory"}]},"tax_id":{"type":["string","null"]},"updated_at":{"type":"string","format":"date-time"}}},"PartnerImportErrorDetail":{"type":"object","description":"夥伴匯入錯誤明細","required":["row","error"],"properties":{"code":{"type":["string","null"]},"error":{"type":"string"},"row":{"type":"integer","format":"int32"}}},"PartnerImportResult":{"type":"object","description":"夥伴匯入結果","required":["success_count","error_count","errors"],"properties":{"error_count":{"type":"integer","format":"int32"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/PartnerImportErrorDetail"}},"success_count":{"type":"integer","format":"int32"}}},"PartnerQuery":{"type":"object","properties":{"is_active":{"type":["boolean","null"]},"keyword":{"type":["string","null"]},"page":{"type":["integer","null"],"format":"int64"},"partner_type":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/PartnerType"}]},"per_page":{"type":["integer","null"],"format":"int64"}}},"PartnerType":{"type":"string","enum":["supplier","customer"]},"Pen":{"type":"object","required":["id","zone_id","code","capacity","current_count","status","is_active","created_at","updated_at"],"properties":{"capacity":{"type":"integer","format":"int32"},"code":{"type":"string"},"col_index":{"type":["integer","null"],"format":"int32"},"created_at":{"type":"string","format":"date-time"},"current_count":{"type":"integer","format":"int32"},"id":{"type":"string","format":"uuid"},"is_active":{"type":"boolean"},"name":{"type":["string","null"]},"row_index":{"type":["integer","null"],"format":"int32"},"status":{"type":"string"},"updated_at":{"type":"string","format":"date-time"},"zone_id":{"type":"string","format":"uuid"}}},"PenDetails":{"type":"object","required":["id","code","capacity","current_count","status","zone_id","zone_code","building_id","building_code","building_name","facility_id","facility_code","facility_name"],"properties":{"building_code":{"type":"string"},"building_id":{"type":"string","format":"uuid"},"building_name":{"type":"string"},"capacity":{"type":"integer","format":"int32"},"code":{"type":"string"},"col_index":{"type":["integer","null"],"format":"int32"},"current_count":{"type":"integer","format":"int32"},"facility_code":{"type":"string"},"facility_id":{"type":"string","format":"uuid"},"facility_name":{"type":"string"},"id":{"type":"string","format":"uuid"},"name":{"type":["string","null"]},"row_index":{"type":["integer","null"],"format":"int32"},"status":{"type":"string"},"zone_code":{"type":"string"},"zone_color":{"type":["string","null"]},"zone_id":{"type":"string","format":"uuid"},"zone_layout_config":{},"zone_name":{"type":["string","null"]}}},"Permission":{"type":"object","required":["id","code","name","created_at"],"properties":{"code":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"description":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"module":{"type":["string","null"]},"name":{"type":"string"}}},"PoReceiptItem":{"type":"object","description":"採購單入庫項目","required":["product_id","product_sku","product_name","base_uom","uom","ordered_qty","received_qty","remaining_qty"],"properties":{"base_uom":{"type":"string"},"ordered_qty":{"type":"string"},"product_id":{"type":"string","format":"uuid"},"product_name":{"type":"string"},"product_sku":{"type":"string"},"received_qty":{"type":"string"},"remaining_qty":{"type":"string"},"unit_price":{"type":["string","null"]},"uom":{"type":"string"}}},"PoReceiptStatus":{"type":"object","description":"採購單入庫狀態","required":["po_id","po_no","status","items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PoReceiptItem"}},"po_id":{"type":"string","format":"uuid"},"po_no":{"type":"string"},"status":{"type":"string","description":"pending: 待入庫, partial: 部分入庫, complete: 完成入庫"}}},"PreferenceExport":{"type":"object","description":"GDPR 匯出：單一偏好項目","required":["key","value"],"properties":{"key":{"type":"string"},"updated_at":{"type":["string","null"],"format":"date-time"},"value":{}}},"PreferenceResponse":{"type":"object","description":"偏好設定回應","required":["key","value"],"properties":{"key":{"type":"string"},"updated_at":{"type":["string","null"],"format":"date-time"},"value":{}}},"Product":{"type":"object","required":["id","sku","name","base_uom","track_batch","track_expiry","safety_stock","reorder_point","status","is_active","created_at","updated_at"],"properties":{"barcode":{"type":["string","null"]},"base_uom":{"type":"string"},"category_code":{"type":["string","null"]},"category_id":{"type":["string","null"],"format":"uuid"},"created_at":{"type":"string","format":"date-time"},"created_by":{"type":["string","null"],"format":"uuid"},"default_expiry_days":{"type":["integer","null"],"format":"int32"},"id":{"type":"string","format":"uuid"},"image_url":{"type":["string","null"]},"is_active":{"type":"boolean"},"license_no":{"type":["string","null"]},"name":{"type":"string"},"pack_qty":{"type":["integer","null"],"format":"int32"},"pack_unit":{"type":["string","null"]},"remark":{"type":["string","null"]},"reorder_point":{"type":"string"},"reorder_point_uom":{"type":["string","null"]},"safety_stock":{"type":"string"},"safety_stock_uom":{"type":["string","null"]},"sku":{"type":"string"},"spec":{"type":["string","null"]},"status":{"type":"string"},"storage_condition":{"type":["string","null"]},"subcategory_code":{"type":["string","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"track_batch":{"type":"boolean"},"track_expiry":{"type":"boolean"},"updated_at":{"type":"string","format":"date-time"}}},"ProductCategory":{"type":"object","required":["id","code","name","is_active","created_at"],"properties":{"code":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"id":{"type":"string","format":"uuid"},"is_active":{"type":"boolean"},"name":{"type":"string"},"parent_id":{"type":["string","null"],"format":"uuid"}}},"ProductImportErrorDetail":{"type":"object","description":"產品匯入錯誤明細","required":["row","error"],"properties":{"error":{"type":"string"},"row":{"type":"integer","format":"int32"},"sku":{"type":["string","null"]}}},"ProductImportPreviewResult":{"type":"object","description":"匯入預覽結果","required":["rows","has_sku_column"],"properties":{"has_sku_column":{"type":"boolean"},"rows":{"type":"array","items":{"$ref":"#/components/schemas/ProductImportPreviewRow"}}}},"ProductImportPreviewRow":{"type":"object","description":"匯入預覽列（供前端「依序設定 SKU」使用）","required":["row","name","base_uom","track_batch","track_expiry"],"properties":{"base_uom":{"type":"string"},"category_code":{"type":["string","null"]},"name":{"type":"string"},"remark":{"type":["string","null"]},"row":{"type":"integer","format":"int32","description":"列號（1-based，對應 Excel/CSV 列）"},"safety_stock":{"type":["number","null"],"format":"double","description":"安全庫存（JSON 以數值傳遞）"},"spec":{"type":["string","null"]},"subcategory_code":{"type":["string","null"]},"track_batch":{"type":"boolean"},"track_expiry":{"type":"boolean"}}},"ProductImportResult":{"type":"object","description":"產品匯入結果","required":["success_count","error_count","errors"],"properties":{"error_count":{"type":"integer","format":"int32"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/ProductImportErrorDetail"}},"success_count":{"type":"integer","format":"int32"}}},"ProductQuery":{"type":"object","description":"產品查詢參數","properties":{"category_code":{"type":["string","null"]},"category_id":{"type":["string","null"],"format":"uuid"},"is_active":{"type":["boolean","null"]},"keyword":{"type":["string","null"]},"sort_by":{"type":["string","null"]},"sort_order":{"type":["string","null"]},"status":{"type":["string","null"]},"storage_condition":{"type":["string","null"]},"subcategory_code":{"type":["string","null"]},"track_batch":{"type":["boolean","null"]},"track_expiry":{"type":["boolean","null"]}}},"ProductStatus":{"type":"string","description":"產品狀態","enum":["active","inactive","discontinued"]},"ProductUomConversion":{"type":"object","required":["id","product_id","uom","factor_to_base"],"properties":{"factor_to_base":{"type":"string"},"id":{"type":"string","format":"uuid"},"product_id":{"type":"string","format":"uuid"},"uom":{"type":"string"}}},"ProductWithUom":{"allOf":[{"$ref":"#/components/schemas/Product"},{"type":"object","required":["uom_conversions"],"properties":{"category_name":{"type":["string","null"]},"subcategory_name":{"type":["string","null"]},"uom_conversions":{"type":"array","items":{"$ref":"#/components/schemas/ProductUomConversion"}}}}]},"Protocol":{"type":"object","description":"計畫書主表","required":["id","protocol_no","title","status","pi_user_id","created_by","created_at","updated_at"],"properties":{"created_at":{"type":"string","format":"date-time"},"created_by":{"type":"string","format":"uuid"},"end_date":{"type":["string","null"],"format":"date"},"iacuc_no":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"pi_user_id":{"type":"string","format":"uuid"},"protocol_no":{"type":"string"},"start_date":{"type":["string","null"],"format":"date"},"status":{"$ref":"#/components/schemas/ProtocolStatus"},"title":{"type":"string"},"updated_at":{"type":"string","format":"date-time"},"working_content":{}}},"ProtocolActivity":{"type":"object","description":"計畫活動歷程","required":["id","protocol_id","activity_type","actor_id","created_at"],"properties":{"activity_type":{"$ref":"#/components/schemas/ProtocolActivityType"},"actor_email":{"type":["string","null"]},"actor_id":{"type":"string","format":"uuid"},"actor_name":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"},"extra_data":{},"from_value":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"protocol_id":{"type":"string","format":"uuid"},"remark":{"type":["string","null"]},"target_entity_id":{"type":["string","null"],"format":"uuid"},"target_entity_name":{"type":["string","null"]},"target_entity_type":{"type":["string","null"]},"to_value":{"type":["string","null"]}}},"ProtocolActivityResponse":{"type":"object","description":"計畫活動歷程回應（用於 API）","required":["id","protocol_id","activity_type","activity_type_display","actor_id","actor_name","actor_email","created_at"],"properties":{"activity_type":{"$ref":"#/components/schemas/ProtocolActivityType"},"activity_type_display":{"type":"string"},"actor_email":{"type":"string"},"actor_id":{"type":"string","format":"uuid"},"actor_name":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"extra_data":{},"from_value":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"protocol_id":{"type":"string","format":"uuid"},"remark":{"type":["string","null"]},"target_entity_id":{"type":["string","null"],"format":"uuid"},"target_entity_name":{"type":["string","null"]},"target_entity_type":{"type":["string","null"]},"to_value":{"type":["string","null"]}}},"ProtocolActivityType":{"type":"string","description":"計畫活動類型","enum":["CREATED","UPDATED","SUBMITTED","RESUBMITTED","APPROVED","APPROVED_WITH_CONDITIONS","CLOSED","REJECTED","SUSPENDED","DELETED","STATUS_CHANGED","REVIEWER_ASSIGNED","VET_ASSIGNED","COEDITOR_ASSIGNED","COEDITOR_REMOVED","COMMENT_ADDED","COMMENT_REPLIED","COMMENT_RESOLVED","ATTACHMENT_UPLOADED","ATTACHMENT_DELETED","VERSION_CREATED","VERSION_RECOVERED","AMENDMENT_CREATED","AMENDMENT_SUBMITTED","ANIMAL_ASSIGNED","ANIMAL_UNASSIGNED","MCP_READ"]},"ProtocolAttachment":{"type":"object","description":"計畫附件","required":["id","file_name","file_path","file_size","mime_type","uploaded_by","created_at"],"properties":{"created_at":{"type":"string","format":"date-time"},"file_name":{"type":"string"},"file_path":{"type":"string"},"file_size":{"type":"integer","format":"int32"},"id":{"type":"string","format":"uuid"},"mime_type":{"type":"string"},"protocol_id":{"type":["string","null"],"format":"uuid"},"protocol_version_id":{"type":["string","null"],"format":"uuid"},"uploaded_by":{"type":"string","format":"uuid"}}},"ProtocolListItem":{"type":"object","description":"計畫列表項目","required":["id","protocol_no","title","status","pi_user_id","pi_name","created_at"],"properties":{"apply_study_number":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"},"end_date":{"type":["string","null"],"format":"date"},"iacuc_no":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"pi_name":{"type":"string"},"pi_organization":{"type":["string","null"]},"pi_user_id":{"type":"string","format":"uuid"},"protocol_no":{"type":"string"},"start_date":{"type":["string","null"],"format":"date"},"status":{"$ref":"#/components/schemas/ProtocolStatus"},"title":{"type":"string"}}},"ProtocolResponse":{"type":"object","description":"計畫書回應（含關聯資訊）","required":["protocol","status_display"],"properties":{"pi_email":{"type":["string","null"]},"pi_name":{"type":["string","null"]},"pi_organization":{"type":["string","null"]},"protocol":{"$ref":"#/components/schemas/Protocol"},"status_display":{"type":"string"},"vet_review":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/VetReviewAssignment"}]}}},"ProtocolRole":{"type":"string","description":"計畫中的角色","enum":["Pi","Client","CoEditor"]},"ProtocolStatus":{"type":"string","description":"計畫狀態","enum":["DRAFT","SUBMITTED","PRE_REVIEW","PRE_REVIEW_REVISION_REQUIRED","VET_REVIEW","VET_REVISION_REQUIRED","UNDER_REVIEW","REVISION_REQUIRED","RESUBMITTED","APPROVED","APPROVED_WITH_CONDITIONS","DEFERRED","REJECTED","SUSPENDED","CLOSED","DELETED"]},"ProtocolVersion":{"type":"object","description":"計畫版本快照","required":["id","protocol_id","version_no","content_snapshot","submitted_at","submitted_by"],"properties":{"content_snapshot":{},"id":{"type":"string","format":"uuid"},"protocol_id":{"type":"string","format":"uuid"},"submitted_at":{"type":"string","format":"date-time"},"submitted_by":{"type":"string","format":"uuid"},"version_no":{"type":"integer","format":"int32"}}},"RecordFilterQuery":{"type":"object","description":"資料隔離：用於記錄列表查詢的可選時間過濾","properties":{"after":{"type":["string","null"],"format":"date-time","description":"僅回傳 created_at > after 的記錄（轉讓資料隔離）"}}},"RecordType":{"type":"string","description":"紀錄類型","enum":["abnormal","experiment","observation"]},"RefreshTokenRequest":{"type":"object","required":["refresh_token"],"properties":{"refresh_token":{"type":"string"}}},"RejectTransferRequest":{"type":"object","description":"拒絕轉讓請求","required":["reason"],"properties":{"reason":{"type":"string"}}},"ReplyCommentRequest":{"type":"object","required":["parent_comment_id","content"],"properties":{"content":{"type":"string"},"parent_comment_id":{"type":"string","format":"uuid"}}},"ResetPasswordRequest":{"type":"object","description":"Admin 重設他人密碼請求","required":["new_password"],"properties":{"new_password":{"type":"string"}}},"ResetPasswordWithTokenRequest":{"type":"object","description":"重設密碼請求（透過 token）","required":["token","new_password"],"properties":{"new_password":{"type":"string"},"token":{"type":"string"}}},"ReviewAssignment":{"type":"object","description":"審查人員指派","required":["id","protocol_id","reviewer_id","assigned_by","assigned_at","is_primary_reviewer"],"properties":{"assigned_at":{"type":"string","format":"date-time"},"assigned_by":{"type":"string","format":"uuid"},"completed_at":{"type":["string","null"],"format":"date-time"},"id":{"type":"string","format":"uuid"},"is_primary_reviewer":{"type":"boolean","description":"是否為正式審查委員（可撰寫意見，限 2-3 位）"},"protocol_id":{"type":"string","format":"uuid"},"review_stage":{"type":["string","null"],"description":"審查階段"},"reviewer_id":{"type":"string","format":"uuid"}}},"ReviewAssignmentResponse":{"type":"object","description":"審查指派回應（含審查者與指派者資訊）","required":["id","protocol_id","reviewer_id","reviewer_name","reviewer_email","assigned_by","assigned_by_name","assigned_at","is_primary_reviewer"],"properties":{"assigned_at":{"type":"string","format":"date-time"},"assigned_by":{"type":"string","format":"uuid"},"assigned_by_name":{"type":"string"},"completed_at":{"type":["string","null"],"format":"date-time"},"id":{"type":"string","format":"uuid"},"is_primary_reviewer":{"type":"boolean"},"protocol_id":{"type":"string","format":"uuid"},"review_stage":{"type":["string","null"]},"reviewer_email":{"type":"string"},"reviewer_id":{"type":"string","format":"uuid"},"reviewer_name":{"type":"string"}}},"ReviewComment":{"type":"object","description":"審查意見","required":["id","reviewer_id","content","is_resolved","created_at","updated_at"],"properties":{"content":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"draft_content":{"type":["string","null"],"description":"草稿回覆內容（僅 PI/Coeditor 可見）"},"draft_updated_at":{"type":["string","null"],"format":"date-time","description":"草稿最後更新時間"},"drafted_by":{"type":["string","null"],"format":"uuid","description":"草稿撰寫者"},"id":{"type":"string","format":"uuid"},"is_resolved":{"type":"boolean"},"parent_comment_id":{"type":["string","null"],"format":"uuid"},"protocol_id":{"type":["string","null"],"format":"uuid","description":"直接關聯的計畫 ID（用於預審階段）"},"protocol_version_id":{"type":["string","null"],"format":"uuid"},"replied_by":{"type":["string","null"],"format":"uuid"},"resolved_at":{"type":["string","null"],"format":"date-time"},"resolved_by":{"type":["string","null"],"format":"uuid"},"review_stage":{"type":["string","null"],"description":"審查階段（PRE_REVIEW, VET_REVIEW, UNDER_REVIEW）"},"reviewer_id":{"type":"string","format":"uuid"},"updated_at":{"type":"string","format":"date-time"}}},"ReviewCommentResponse":{"type":"object","description":"審查意見回應（含審查者資訊）","required":["id","protocol_version_id","reviewer_id","reviewer_name","reviewer_email","content","is_resolved","created_at"],"properties":{"content":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"draft_content":{"type":["string","null"],"description":"草稿回覆內容（僅 PI/Coeditor 可見，審查委員不可見）"},"draft_updated_at":{"type":["string","null"],"format":"date-time","description":"草稿最後更新時間"},"drafted_by":{"type":["string","null"],"format":"uuid","description":"草稿撰寫者"},"drafted_by_name":{"type":["string","null"],"description":"草稿撰寫者姓名"},"id":{"type":"string","format":"uuid"},"is_resolved":{"type":"boolean"},"parent_comment_id":{"type":["string","null"],"format":"uuid"},"protocol_id":{"type":["string","null"],"format":"uuid"},"protocol_version_id":{"type":"string","format":"uuid"},"replied_by":{"type":["string","null"],"format":"uuid"},"replied_by_email":{"type":["string","null"]},"replied_by_name":{"type":["string","null"]},"resolved_at":{"type":["string","null"],"format":"date-time"},"resolved_by":{"type":["string","null"],"format":"uuid"},"review_stage":{"type":["string","null"],"description":"審查階段（PRE_REVIEW, VET_REVIEW, UNDER_REVIEW）"},"reviewer_email":{"type":"string"},"reviewer_id":{"type":"string","format":"uuid"},"reviewer_name":{"type":"string"}}},"RoleWithPermissions":{"type":"object","required":["id","code","name","is_internal","is_system","is_active","permissions","created_at","updated_at"],"properties":{"code":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"description":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"is_active":{"type":"boolean"},"is_internal":{"type":"boolean"},"is_system":{"type":"boolean"},"name":{"type":"string"},"permissions":{"type":"array","items":{"$ref":"#/components/schemas/Permission"}},"updated_at":{"type":"string","format":"date-time"}}},"SaveDraftRequest":{"type":"object","description":"儲存草稿回覆請求","required":["comment_id","draft_content"],"properties":{"comment_id":{"type":"string","format":"uuid"},"draft_content":{"type":"string"}}},"SaveVetReviewFormRequest":{"type":"object","description":"儲存獸醫審查表請求","required":["protocol_id","review_form"],"properties":{"protocol_id":{"type":"string","format":"uuid"},"review_form":{}}},"ShelfNode":{"type":"object","description":"貨架節點","required":["id","code"],"properties":{"code":{"type":"string"},"id":{"type":"string","format":"uuid"},"name":{"type":["string","null"]}}},"SignRecordRequest":{"type":"object","properties":{"handwriting_svg":{"type":["string","null"],"description":"手寫簽名 SVG（手寫簽名模式用）"},"password":{"type":["string","null"],"description":"密碼（密碼驗證模式用）"},"signature_type":{"type":["string","null"]},"stroke_data":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Value","description":"手寫簽名筆跡點資料"}]}}},"SignRecordResponse":{"type":"object","required":["signature_id","signed_at","is_locked"],"properties":{"is_locked":{"type":"boolean"},"signature_id":{"type":"string","format":"uuid"},"signed_at":{"type":"string"}}},"SignatureInfo":{"type":"object","required":["id","signature_type","signed_at"],"properties":{"handwriting_svg":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"signature_method":{"type":["string","null"]},"signature_type":{"type":"string"},"signed_at":{"type":"string"},"signer_name":{"type":["string","null"]}}},"SignatureStatusResponse":{"type":"object","required":["is_signed","is_locked","signatures"],"properties":{"is_locked":{"type":"boolean"},"is_signed":{"type":"boolean"},"signatures":{"type":"array","items":{"$ref":"#/components/schemas/SignatureInfo"}}}},"SkuPreviewRequest":{"type":"object","description":"SKU 預覽請求","required":["cat","sub","pack","source"],"properties":{"attributes":{"type":["object","null"],"additionalProperties":{},"propertyNames":{"type":"string"}},"cat":{"type":"string"},"org":{"type":["string","null"]},"pack":{"$ref":"#/components/schemas/PackInfo"},"rule_version_hint":{"type":["string","null"]},"source":{"type":"string"},"sub":{"type":"string"}}},"SkuPreviewResponse":{"type":"object","description":"SKU 預覽回應","required":["preview_sku","segments","rule_version"],"properties":{"preview_sku":{"type":"string"},"rule_updated_at":{"type":["string","null"]},"rule_version":{"type":"string"},"segments":{"type":"array","items":{"$ref":"#/components/schemas/SkuSegment"}}}},"SkuSegment":{"type":"object","description":"SKU 片段","required":["code","label","value","source"],"properties":{"code":{"type":"string"},"label":{"type":"string"},"source":{"type":"string"},"value":{"type":"string"}}},"Species":{"type":"object","required":["id","code","name","is_active","sort_order","created_at","updated_at"],"properties":{"code":{"type":"string"},"config":{},"created_at":{"type":"string","format":"date-time"},"icon":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"is_active":{"type":"boolean"},"name":{"type":"string"},"name_en":{"type":["string","null"]},"parent_id":{"type":["string","null"],"format":"uuid"},"sort_order":{"type":"integer","format":"int32"},"updated_at":{"type":"string","format":"date-time"}}},"StorageLayoutItem":{"type":"object","description":"單一儲位佈局項目（用於批次更新）","required":["id","row_index","col_index","width","height"],"properties":{"col_index":{"type":"integer","format":"int32"},"height":{"type":"integer","format":"int32"},"id":{"type":"string","format":"uuid"},"row_index":{"type":"integer","format":"int32"},"width":{"type":"integer","format":"int32"}}},"StorageLocation":{"type":"object","description":"儲位/貨架資料結構","required":["id","warehouse_id","code","location_type","row_index","col_index","width","height","current_count","is_active","created_at","updated_at"],"properties":{"capacity":{"type":["integer","null"],"format":"int32"},"code":{"type":"string"},"col_index":{"type":"integer","format":"int32"},"color":{"type":["string","null"]},"config":{},"created_at":{"type":"string","format":"date-time"},"current_count":{"type":"integer","format":"int32"},"height":{"type":"integer","format":"int32"},"id":{"type":"string","format":"uuid"},"is_active":{"type":"boolean"},"location_type":{"type":"string"},"name":{"type":["string","null"]},"row_index":{"type":"integer","format":"int32"},"updated_at":{"type":"string","format":"date-time"},"warehouse_id":{"type":"string","format":"uuid"},"width":{"type":"integer","format":"int32"}}},"StorageLocationInventoryItem":{"type":"object","description":"儲位庫存項目（用於顯示儲位內的庫存）","required":["id","storage_location_id","product_id","product_sku","product_name","on_hand_qty","base_uom","updated_at"],"properties":{"base_uom":{"type":"string"},"batch_no":{"type":["string","null"]},"expiry_date":{"type":["string","null"],"format":"date"},"id":{"type":"string","format":"uuid"},"on_hand_qty":{"type":"string"},"product_id":{"type":"string","format":"uuid"},"product_name":{"type":"string"},"product_sku":{"type":"string"},"storage_location_id":{"type":"string","format":"uuid"},"updated_at":{"type":"string","format":"date-time"}}},"StorageLocationQuery":{"type":"object","description":"儲位查詢參數","properties":{"is_active":{"type":["boolean","null"]},"keyword":{"type":["string","null"]},"location_type":{"type":["string","null"]},"warehouse_id":{"type":["string","null"],"format":"uuid"}}},"StorageLocationWithWarehouse":{"type":"object","description":"儲位詳細資料（包含倉庫資訊）","required":["id","warehouse_id","warehouse_code","warehouse_name","code","location_type","row_index","col_index","width","height","current_count","is_active"],"properties":{"capacity":{"type":["integer","null"],"format":"int32"},"code":{"type":"string"},"col_index":{"type":"integer","format":"int32"},"color":{"type":["string","null"]},"config":{},"current_count":{"type":"integer","format":"int32"},"height":{"type":"integer","format":"int32"},"id":{"type":"string","format":"uuid"},"is_active":{"type":"boolean"},"location_type":{"type":"string"},"name":{"type":["string","null"]},"row_index":{"type":"integer","format":"int32"},"warehouse_code":{"type":"string"},"warehouse_id":{"type":"string","format":"uuid"},"warehouse_name":{"type":"string"},"width":{"type":"integer","format":"int32"}}},"SubcategoriesResponse":{"type":"object","description":"取得子類別選項回應","required":["category","subcategories"],"properties":{"category":{"$ref":"#/components/schemas/CategoryOption"},"subcategories":{"type":"array","items":{"$ref":"#/components/schemas/CategoryOption"}}}},"SubcategoryForEdit":{"type":"object","description":"編輯用：子類別（含 sort_order, is_active）","required":["id","code","name","sort_order","is_active"],"properties":{"code":{"type":"string"},"id":{"type":"integer","format":"int32"},"is_active":{"type":"boolean"},"name":{"type":"string"},"sort_order":{"type":"integer","format":"int32"}}},"SubmitReplyRequest":{"type":"object","description":"送出回覆請求（將草稿正式送出）","required":["comment_id"],"properties":{"comment_id":{"type":"string","format":"uuid"}}},"SupplierCategory":{"type":"string","enum":["drug","consumable","feed","equipment"]},"SystemSetting":{"type":"object","description":"系統設定","required":["key","value","updated_at"],"properties":{"description":{"type":["string","null"]},"key":{"type":"string"},"updated_at":{"type":"string","format":"date-time"},"updated_by":{"type":["string","null"],"format":"uuid"},"value":{}}},"ThemePreference":{"type":"string","description":"主題偏好","enum":["light","dark","system"]},"TransferStorageLocationInventoryRequest":{"type":"object","description":"調撥儲位庫存請求 (同倉庫內不需單據)","required":["to_storage_location_id","qty"],"properties":{"qty":{"type":"string"},"to_storage_location_id":{"type":"string","format":"uuid"}}},"TransferVetEvaluation":{"type":"object","description":"轉讓獸醫評估記錄","required":["id","transfer_id","vet_id","health_status","is_fit_for_transfer","evaluated_at"],"properties":{"conditions":{"type":["string","null"]},"evaluated_at":{"type":"string","format":"date-time"},"health_status":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_fit_for_transfer":{"type":"boolean"},"transfer_id":{"type":"string","format":"uuid"},"vet_id":{"type":"string","format":"uuid"}}},"TreatmentDrugOption":{"type":"object","description":"治療方式藥物選項","required":["id","name","sort_order","is_active","created_at","updated_at"],"properties":{"available_units":{"type":["array","null"],"items":{"type":"string"}},"category":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"},"created_by":{"type":["string","null"],"format":"uuid"},"default_dosage_unit":{"type":["string","null"]},"default_dosage_value":{"type":["string","null"]},"display_name":{"type":["string","null"]},"erp_product_id":{"type":["string","null"],"format":"uuid"},"id":{"type":"string","format":"uuid"},"is_active":{"type":"boolean"},"name":{"type":"string"},"sort_order":{"type":"integer","format":"int32"},"updated_at":{"type":"string","format":"date-time"}}},"TwoFactorConfirmRequest":{"type":"object","description":"2FA 確認啟用請求","required":["code"],"properties":{"code":{"type":"string"}}},"TwoFactorDisableRequest":{"type":"object","description":"2FA 停用請求","required":["password","code"],"properties":{"code":{"type":"string"},"password":{"type":"string"}}},"TwoFactorLoginRequest":{"type":"object","description":"2FA 登入驗證請求","required":["temp_token","code"],"properties":{"code":{"type":"string"},"temp_token":{"type":"string"}}},"TwoFactorSetupResponse":{"type":"object","description":"2FA 設定回應（含 otpauth URI 和備用碼）","required":["otpauth_uri","backup_codes"],"properties":{"backup_codes":{"type":"array","items":{"type":"string"}},"otpauth_uri":{"type":"string"}}},"UomConversionInput":{"type":"object","required":["uom","factor_to_base"],"properties":{"factor_to_base":{"type":"string"},"uom":{"type":"string"}}},"UpdateAnimalRequest":{"type":"object","properties":{"experiment_date":{"type":["string","null"],"format":"date"},"iacuc_no":{"type":["string","null"]},"pen_id":{"type":["string","null"],"format":"uuid"},"pen_location":{"type":["string","null"]},"remark":{"type":["string","null"]},"species_id":{"type":["string","null"],"format":"uuid"},"status":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AnimalStatus"}]},"version":{"type":["integer","null"],"format":"int32","description":"Optimistic locking: if provided, update only succeeds when DB version matches"}}},"UpdateBuildingRequest":{"type":"object","properties":{"config":{},"description":{"type":["string","null"]},"is_active":{"type":["boolean","null"]},"name":{"type":["string","null"]},"sort_order":{"type":["integer","null"],"format":"int32"}}},"UpdateDepartmentRequest":{"type":"object","properties":{"config":{},"is_active":{"type":["boolean","null"]},"manager_id":{"type":["string","null"],"format":"uuid"},"name":{"type":["string","null"]},"parent_id":{"type":["string","null"],"format":"uuid"},"sort_order":{"type":["integer","null"],"format":"int32"}}},"UpdateDocumentRequest":{"type":"object","description":"更新單據請求 (僅 Draft 狀態可更新)","properties":{"doc_date":{"type":["string","null"],"format":"date"},"lines":{"type":["array","null"],"items":{"$ref":"#/components/schemas/DocumentLineInput"}},"partner_id":{"type":["string","null"],"format":"uuid"},"protocol_id":{"type":["string","null"],"format":"uuid"},"remark":{"type":["string","null"]},"source_doc_id":{"type":["string","null"],"format":"uuid"},"warehouse_from_id":{"type":["string","null"],"format":"uuid"},"warehouse_id":{"type":["string","null"],"format":"uuid"},"warehouse_to_id":{"type":["string","null"],"format":"uuid"}}},"UpdateFacilityRequest":{"type":"object","properties":{"address":{"type":["string","null"]},"config":{},"contact_person":{"type":["string","null"]},"is_active":{"type":["boolean","null"]},"name":{"type":["string","null"]},"phone":{"type":["string","null"]}}},"UpdateObservationRequest":{"type":"object","description":"更新觀察紀錄請求","properties":{"anesthesia_end":{"type":["string","null"],"format":"date-time"},"anesthesia_start":{"type":["string","null"],"format":"date-time"},"content":{"type":["string","null"]},"emergency_status":{"type":["string","null"]},"equipment_used":{},"event_date":{"type":["string","null"],"format":"date"},"no_medication_needed":{"type":["boolean","null"]},"record_type":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/RecordType"}]},"remark":{"type":["string","null"]},"treatments":{}}},"UpdatePartnerRequest":{"type":"object","properties":{"address":{"type":["string","null"]},"email":{"type":["string","null"]},"is_active":{"type":["boolean","null"]},"name":{"type":["string","null"]},"payment_terms":{"type":["string","null"]},"phone":{"type":["string","null"]},"phone_ext":{"type":["string","null"]},"tax_id":{"type":["string","null"]}}},"UpdatePenRequest":{"type":"object","properties":{"capacity":{"type":["integer","null"],"format":"int32"},"col_index":{"type":["integer","null"],"format":"int32"},"is_active":{"type":["boolean","null"]},"name":{"type":["string","null"]},"row_index":{"type":["integer","null"],"format":"int32"},"status":{"type":["string","null"]}}},"UpdateProductRequest":{"type":"object","description":"更新產品請求（SKU 不可修改）","properties":{"barcode":{"type":["string","null"]},"category_code":{"type":["string","null"]},"default_expiry_days":{"type":["integer","null"],"format":"int32"},"image_url":{"type":["string","null"]},"is_active":{"type":["boolean","null"]},"license_no":{"type":["string","null"]},"name":{"type":["string","null"]},"pack_qty":{"type":["integer","null"],"format":"int32"},"pack_unit":{"type":["string","null"]},"remark":{"type":["string","null"]},"reorder_point":{"type":["string","null"]},"reorder_point_uom":{"type":["string","null"]},"safety_stock":{"type":["string","null"]},"safety_stock_uom":{"type":["string","null"]},"spec":{"type":["string","null"]},"status":{"type":["string","null"]},"storage_condition":{"type":["string","null"]},"subcategory_code":{"type":["string","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"track_batch":{"type":["boolean","null"]},"track_expiry":{"type":["boolean","null"]},"uom_conversions":{"type":["array","null"],"items":{"$ref":"#/components/schemas/UomConversionInput"}}}},"UpdateProtocolRequest":{"type":"object","properties":{"end_date":{"type":["string","null"],"format":"date"},"start_date":{"type":["string","null"],"format":"date"},"title":{"type":["string","null"]},"working_content":{}}},"UpdateRoleRequest":{"type":"object","properties":{"description":{"type":["string","null"]},"is_internal":{"type":["boolean","null"]},"name":{"type":["string","null"]},"permission_ids":{"type":["array","null"],"items":{"type":"string","format":"uuid"}}}},"UpdateSkuCategoryRequest":{"type":"object","description":"更新品類請求（名稱、排序、啟用狀態）","properties":{"is_active":{"type":["boolean","null"]},"name":{"type":["string","null"]},"sort_order":{"type":["integer","null"],"format":"int32"}}},"UpdateSkuSubcategoryRequest":{"type":"object","description":"更新子類請求（名稱、排序、啟用狀態）","properties":{"is_active":{"type":["boolean","null"]},"name":{"type":["string","null"]},"sort_order":{"type":["integer","null"],"format":"int32"}}},"UpdateSpeciesRequest":{"type":"object","properties":{"config":{},"icon":{"type":["string","null"]},"is_active":{"type":["boolean","null"]},"name":{"type":["string","null"]},"name_en":{"type":["string","null"]},"parent_id":{"type":["string","null"],"format":"uuid"},"sort_order":{"type":["integer","null"],"format":"int32"}}},"UpdateStorageLayoutRequest":{"type":"object","description":"批次更新儲位佈局請求","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/StorageLayoutItem"}}}},"UpdateStorageLocationInventoryItemRequest":{"type":"object","description":"更新儲位庫存項目請求","required":["on_hand_qty"],"properties":{"on_hand_qty":{"type":"string"}}},"UpdateStorageLocationRequest":{"type":"object","description":"更新儲位請求","properties":{"capacity":{"type":["integer","null"],"format":"int32"},"code":{"type":["string","null"]},"col_index":{"type":["integer","null"],"format":"int32"},"color":{"type":["string","null"]},"config":{},"height":{"type":["integer","null"],"format":"int32"},"is_active":{"type":["boolean","null"]},"location_type":{"type":["string","null"]},"name":{"type":["string","null"]},"row_index":{"type":["integer","null"],"format":"int32"},"width":{"type":["integer","null"],"format":"int32"}}},"UpdateSurgeryRequest":{"type":"object","description":"更新手術紀錄請求","properties":{"anesthesia_maintenance":{},"anesthesia_observation":{"type":["string","null"]},"induction_anesthesia":{},"is_first_experiment":{"type":["boolean","null"]},"no_medication_needed":{"type":["boolean","null"]},"positioning":{"type":["string","null"]},"post_surgery_medication":{},"pre_surgery_medication":{},"reflex_recovery":{"type":["string","null"]},"remark":{"type":["string","null"]},"respiration_rate":{"type":["integer","null"],"format":"int32"},"surgery_date":{"type":["string","null"],"format":"date"},"surgery_site":{"type":["string","null"]},"vital_signs":{}}},"UpdateTreatmentDrugRequest":{"type":"object","description":"更新藥物選項請求","properties":{"available_units":{"type":["array","null"],"items":{"type":"string"}},"category":{"type":["string","null"]},"default_dosage_unit":{"type":["string","null"]},"default_dosage_value":{"type":["string","null"]},"display_name":{"type":["string","null"]},"erp_product_id":{"type":["string","null"],"format":"uuid"},"is_active":{"type":["boolean","null"]},"name":{"type":["string","null"]},"sort_order":{"type":["integer","null"],"format":"int32"}}},"UpdateUserRequest":{"type":"object","properties":{"aup_roles":{"type":["array","null"],"items":{"type":"string"}},"display_name":{"type":["string","null"]},"email":{"type":["string","null"]},"entry_date":{"type":["string","null"],"format":"date"},"expires_at":{"type":["string","null"],"format":"date-time","description":"帳號到期日（NULL = 永不過期）"},"is_active":{"type":["boolean","null"]},"is_internal":{"type":["boolean","null"]},"organization":{"type":["string","null"]},"phone":{"type":["string","null"]},"phone_ext":{"type":["string","null"]},"position":{"type":["string","null"]},"role_ids":{"type":["array","null"],"items":{"type":"string","format":"uuid"}},"trainings":{"type":["array","null"],"items":{"$ref":"#/components/schemas/UserTraining"}},"years_experience":{"type":["integer","null"],"format":"int32"}}},"UpdateVaccinationRequest":{"type":"object","description":"更新疫苗紀錄請求","properties":{"administered_date":{"type":["string","null"],"format":"date"},"deworming_dose":{"type":["string","null"]},"vaccine":{"type":["string","null"]}}},"UpdateWarehouseRequest":{"type":"object","properties":{"address":{"type":["string","null"]},"is_active":{"type":["boolean","null"]},"name":{"type":["string","null"]}}},"UpdateWeightRequest":{"type":"object","description":"更新體重紀錄請求","properties":{"measure_date":{"type":["string","null"],"format":"date"},"weight":{"type":["string","null"]}}},"UpdateZoneRequest":{"type":"object","properties":{"color":{"type":["string","null"]},"is_active":{"type":["boolean","null"]},"layout_config":{},"name":{"type":["string","null"]},"sort_order":{"type":["integer","null"],"format":"int32"}}},"UpsertPreferenceRequest":{"type":"object","description":"建立或更新偏好設定的請求","required":["value"],"properties":{"value":{}}},"UserProtocol":{"type":"object","description":"使用者計畫關聯","required":["user_id","protocol_id","role_in_protocol","granted_at"],"properties":{"granted_at":{"type":"string","format":"date-time"},"granted_by":{"type":["string","null"],"format":"uuid"},"protocol_id":{"type":"string","format":"uuid"},"role_in_protocol":{"$ref":"#/components/schemas/ProtocolRole"},"user_id":{"type":"string","format":"uuid"}}},"UserResponse":{"type":"object","required":["id","email","display_name","is_internal","is_active","must_change_password","theme_preference","language_preference","aup_roles","years_experience","trainings","roles","permissions","totp_enabled"],"properties":{"aup_roles":{"type":"array","items":{"type":"string"}},"display_name":{"type":"string"},"email":{"type":"string"},"entry_date":{"type":["string","null"],"format":"date"},"expires_at":{"type":["string","null"],"format":"date-time"},"id":{"type":"string","format":"uuid"},"is_active":{"type":"boolean"},"is_internal":{"type":"boolean"},"language_preference":{"type":"string"},"last_login_at":{"type":["string","null"],"format":"date-time"},"must_change_password":{"type":"boolean"},"organization":{"type":["string","null"]},"permissions":{"type":"array","items":{"type":"string"}},"phone":{"type":["string","null"]},"phone_ext":{"type":["string","null"]},"position":{"type":["string","null"]},"roles":{"type":"array","items":{"type":"string"}},"theme_preference":{"type":"string"},"totp_enabled":{"type":"boolean"},"trainings":{"type":"array","items":{"$ref":"#/components/schemas/UserTraining"}},"years_experience":{"type":"integer","format":"int32"}}},"UserTraining":{"type":"object","description":"使用者訓練/資格資料","required":["code"],"properties":{"certificate_no":{"type":["string","null"]},"code":{"type":"string"},"received_date":{"type":["string","null"]}}},"ValidateSkuRequest":{"type":"object","description":"驗證 SKU 請求","required":["sku"],"properties":{"sku":{"type":"string"}}},"ValidateSkuResponse":{"type":"object","description":"驗證 SKU 回應","required":["valid","exists"],"properties":{"category":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CategoryOption"}]},"error":{"type":["string","null"]},"exists":{"type":"boolean"},"sequence":{"type":["integer","null"],"format":"int32"},"subcategory":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CategoryOption"}]},"valid":{"type":"boolean"}}},"Value":{},"VetEvaluateTransferRequest":{"type":"object","description":"獸醫評估轉讓請求","required":["health_status","is_fit_for_transfer"],"properties":{"conditions":{"type":["string","null"]},"health_status":{"type":"string"},"is_fit_for_transfer":{"type":"boolean"}}},"VetReviewAssignment":{"type":"object","description":"獸醫審查指派","required":["id","protocol_id","vet_id","assigned_at"],"properties":{"assigned_at":{"type":"string","format":"date-time"},"assigned_by":{"type":["string","null"],"format":"uuid"},"completed_at":{"type":["string","null"],"format":"date-time"},"decision":{"type":["string","null"]},"decision_remark":{"type":["string","null"]},"id":{"type":"string","format":"uuid"},"protocol_id":{"type":"string","format":"uuid"},"review_form":{},"vet_id":{"type":"string","format":"uuid"}}},"VetReviewForm":{"type":"object","description":"獸醫審查表","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/VetReviewItem"}},"signed_at":{"type":["string","null"],"format":"date-time"},"vet_signature":{"type":["string","null"]}}},"VetReviewItem":{"type":"object","description":"獸醫審查查檢項","required":["item_name","compliance"],"properties":{"comment":{"type":["string","null"]},"compliance":{"type":"string"},"item_name":{"type":"string"},"pi_reply":{"type":["string","null"]}}},"Warehouse":{"type":"object","required":["id","code","name","is_active","created_at","updated_at"],"properties":{"address":{"type":["string","null"]},"code":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"id":{"type":"string","format":"uuid"},"is_active":{"type":"boolean"},"name":{"type":"string"},"updated_at":{"type":"string","format":"date-time"}}},"WarehouseTreeNode":{"type":"object","description":"倉庫樹節點（含貨架）","required":["id","code","name","shelves"],"properties":{"code":{"type":"string"},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"shelves":{"type":"array","items":{"$ref":"#/components/schemas/ShelfNode"}}}},"WebVitalsMetric":{"type":"object","description":"Web Vitals 上報 payload（與 web-vitals 的 Metric 對應）","required":["id","name","value","delta"],"properties":{"delta":{"type":"number","format":"double"},"id":{"type":"string"},"name":{"type":"string"},"navigationType":{"type":["string","null"]},"rating":{"type":["string","null"]},"value":{"type":"number","format":"double"}}},"Zone":{"type":"object","required":["id","building_id","code","is_active","sort_order","created_at","updated_at"],"properties":{"building_id":{"type":"string","format":"uuid"},"code":{"type":"string"},"color":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"},"id":{"type":"string","format":"uuid"},"is_active":{"type":"boolean"},"layout_config":{},"name":{"type":["string","null"]},"sort_order":{"type":"integer","format":"int32"},"updated_at":{"type":"string","format":"date-time"}}},"ZoneWithBuilding":{"type":"object","required":["id","building_id","building_code","building_name","facility_id","facility_name","code","is_active","sort_order"],"properties":{"building_code":{"type":"string"},"building_id":{"type":"string","format":"uuid"},"building_name":{"type":"string"},"code":{"type":"string"},"color":{"type":["string","null"]},"facility_id":{"type":"string","format":"uuid"},"facility_name":{"type":"string"},"id":{"type":"string","format":"uuid"},"is_active":{"type":"boolean"},"layout_config":{},"name":{"type":["string","null"]},"sort_order":{"type":"integer","format":"int32"}}}}},"security":[{"bearer":[]}],"tags":[{"name":"監控","description":"健康檢查、Prometheus 指標、Web Vitals"},{"name":"認證","description":"登入、登出、Token 重整、密碼管理"},{"name":"使用者管理","description":"使用者 CRUD、密碼重設、模擬登入"},{"name":"角色權限","description":"角色 CRUD、權限查詢"},{"name":"設施管理","description":"物種、設施、棟舍、區域、欄位、部門管理"},{"name":"倉儲管理","description":"倉庫 CRUD"},{"name":"計畫書管理","description":"專案 CRUD、狀態變更、版本、活動歷程、Co-Editor"},{"name":"審查管理","description":"審查委員指派、審查意見、草稿、獸醫審查表"},{"name":"電子簽章","description":"犧牲／觀察／安樂死／轉讓／計畫書簽章與附註 (GLP)"},{"name":"動物管理","description":"動物 CRUD、依欄位查詢、批次分配、獸醫已讀、事件歷程"},{"name":"動物子模組","description":"觀察/手術/體重/疫苗/犧牲/病理/轉讓"},{"name":"HR 出勤","description":"出勤列表、打卡"},{"name":"HR 請假","description":"請假列表、建立"},{"name":"HR 加班","description":"加班列表、建立"},{"name":"通知","description":"通知列表、未讀數"},{"name":"稽核管理","description":"活動日誌、登入事件、儀表板"},{"name":"產品管理","description":"產品 CRUD、分類、匯入、SKU 建立"},{"name":"SKU","description":"SKU 分類、子分類、產生、驗證、預覽"},{"name":"合作夥伴管理","description":"夥伴 CRUD、匯入、代碼產生"},{"name":"單據管理","description":"單據 CRUD、提交、核准、取消"},{"name":"儲位管理","description":"儲位 CRUD、庫存、調撥、代碼產生"},{"name":"報表","description":"庫存現況、流水、採購/銷貨明細、成本彙總、血液檢查"},{"name":"會計","description":"會計科目、試算表、傳票、AP/AR 帳齡、付款/收款"},{"name":"治療藥物","description":"治療方式藥物選項 CRUD、ERP 匯入"}]}