{"openapi":"3.1.0","info":{"title":"Pawnshop API","description":"\n# 當鋪系統 API 文件\n\n## 快速驗證流程\n\n### Mobile (手機 App)\n1. `POST /api/v1/auth/send-otp` — purpose: `register` / `login` / `reset_password`\n2. `POST /api/v1/auth/verify-otp` — 回傳 `verification_token`\n3. `POST /api/v1/auth/register` or `POST /api/v1/auth/login` — 回傳 `access_token`\n4. 其他 API：Header `Authorization: Bearer <access_token>`\n\n**OTP**：隨機 6 位數，TTL 由 SMS 設定的 `otp_ttl_seconds` 控制（預設 300 秒）。如需 dev 固定值除錯，可設環境變數 `DEV_OTP_CODE`（僅在 `env` ∈ {dev, local, test} 生效）。\n\n### Admin (後台)\n1. `POST /api/v1/admin/auth/bootstrap` — 首次初始化（建立 `server_admin`）\n2. `POST /api/v1/admin/auth/login`\n3. `POST /api/v1/admin/auth/switch-group` → `POST /api/v1/admin/auth/switch-tenant`\n4. Header `Authorization: Bearer <access_token>`\n\n### 預設憑證（DEV）\n- **server_admin** / ServerAdmin@12345\n\n### 錯誤碼\n| HTTP | 意義 |\n|---|---|\n| 400 | 業務邏輯錯誤（ex. 金額不合法、狀態不允許） |\n| 401 | 未授權 / token 失效 |\n| 403 | 權限不足 / 跨 tenant |\n| 404 | 資源不存在（或跨 tenant 隱藏存在性） |\n| 422 | Pydantic 驗證錯誤（參數缺失/型別錯誤） |\n\n### RBAC 資料隔離\n- `SERVER_ADMIN`：切到 group/tenant 才能看到對應範圍\n- `SUPER_ADMIN`：僅能看自己 group 內的 tenants\n- `MAIN_STORE_ADMIN`：僅能看自己 tenant\n- `BRANCH_ADMIN`：僅能看自己 tenant **且** 自己建立的資料\n\n## 約定俗成\n\n- 大部分 `POST /admin/customers`、`POST /admin/loans`、`PUT /admin/customers/{id}` 等 **CRUD 用 query string** 傳參。Multipart 上傳（KYC、存摺、照片同步）用 `multipart/form-data`。JSON 只在少數路由（還款、雜支、管理員建立等）使用。\n- 金額單位：整數（NTD）。店鋪可在 `tenants.amount_display_divisor` 設定顯示除數（1 / 10 / 100 / 1000）。\n- 時間：ISO 8601 with timezone；日期：`YYYY-MM-DD`。\n","version":"1.1.0"},"paths":{"/health":{"get":{"tags":["Public / Health"],"summary":"健康檢查","description":"回傳 `{\"ok\": true}`，容器存活探針用。","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/auth/send-otp":{"post":{"tags":["Public / Auth"],"summary":"發送 OTP 驗證碼","description":"`purpose` 可為 `register` / `login` / `reset_password`。\nOTP 為隨機 6 位數；若需 dev 固定值除錯，可設 env `DEV_OTP_CODE`（僅在 `env` ∈ {dev, local, test} 時生效）。\n同一 phone+purpose 在 60 秒內不會重複發送。","operationId":"send_otp_api_api_v1_auth_send_otp_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendOTPRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{},"example":{"success":true,"message":"驗證碼已發送","expire_in":300}}}},"400":{"description":"店鋪未開啟 SMS 或冷卻中"},"404":{"description":"找不到店鋪"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/verify-otp":{"post":{"tags":["Public / Auth"],"summary":"驗證 OTP，拿到 verification_token","description":"驗證成功後會回傳一次性的 `verification_token`，用於接下來的 `register` / `reset-password`。","operationId":"verify_otp_api_api_v1_auth_verify_otp_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyOTPRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/tenant/{tenant_code}":{"get":{"tags":["Public / Auth"],"summary":"取得店鋪品牌資訊（登入畫面用）","operationId":"get_tenant_info_api_v1_auth_tenant__tenant_code__get","parameters":[{"name":"tenant_code","in":"path","required":true,"schema":{"type":"string","title":"Tenant Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/register":{"post":{"tags":["Public / Auth"],"summary":"註冊新使用者","description":"需先完成 `send-otp` → `verify-otp` 取得 `verification_token`。回傳 `access_token`（Bearer）。","operationId":"register_api_v1_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/login":{"post":{"tags":["Public / Auth"],"summary":"手機端密碼登入","description":"以手機號 + 密碼登入。OTP 登入請走 `/auth/send-otp` + `/auth/verify-otp` → 之後用 `/auth/login`（OTP 流程版本依商業需求擴充）。","operationId":"login_api_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/reset-password":{"post":{"tags":["Public / Auth"],"summary":"重設密碼","operationId":"reset_password_api_v1_auth_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/kyc/step1/id-card":{"post":{"tags":["Public / KYC"],"summary":"KYC Step 1：上傳身分證正反面","description":"`multipart/form-data` 欄位：`id_front`、`id_back`。選填 `name`、`id_number`。","operationId":"step1_id_card_api_v1_kyc_step1_id_card_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_step1_id_card_api_v1_kyc_step1_id_card_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/kyc/step2/face":{"post":{"tags":["Public / KYC"],"summary":"KYC Step 2：上傳人臉自拍","description":"`multipart/form-data` 欄位：`selfie`。","operationId":"step2_face_api_v1_kyc_step2_face_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_step2_face_api_v1_kyc_step2_face_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/kyc/step3/personal-info":{"post":{"tags":["Public / KYC"],"summary":"KYC Step 3：填寫個人資料","operationId":"step3_personal_info_api_v1_kyc_step3_personal_info_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonalInfoRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/kyc/status":{"get":{"tags":["Public / KYC"],"summary":"查詢 KYC 整體與各區塊狀態","operationId":"kyc_status_api_v1_kyc_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/documents/financial":{"post":{"tags":["Public / Documents"],"summary":"Upload Financial","operationId":"upload_financial_api_v1_documents_financial_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_financial_api_v1_documents_financial_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/documents/work":{"post":{"tags":["Public / Documents"],"summary":"Upload Work","operationId":"upload_work_api_v1_documents_work_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_work_api_v1_documents_work_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/documents/work/employment-cert":{"post":{"tags":["Public / Documents"],"summary":"Upload Employment Cert","description":"在職證明（1張）","operationId":"upload_employment_cert_api_v1_documents_work_employment_cert_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_employment_cert_api_v1_documents_work_employment_cert_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/documents/work/salary-slips":{"post":{"tags":["Public / Documents"],"summary":"Upload Salary Slips","description":"薪資單（可多張）。每張都存成一筆 Document，doc_type = SALARY_SLIP","operationId":"upload_salary_slips_api_v1_documents_work_salary_slips_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_salary_slips_api_v1_documents_work_salary_slips_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/documents/work-proof/status":{"get":{"tags":["Public / Documents"],"summary":"Work Proof Status","description":"回傳在職證明 + 薪資單的審核狀態","operationId":"work_proof_status_api_v1_documents_work_proof_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/documents/financial/status":{"get":{"tags":["Public / Documents"],"summary":"Financial Status","operationId":"financial_status_api_v1_documents_financial_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/documents/work/status":{"get":{"tags":["Public / Documents"],"summary":"Work Status","operationId":"work_status_api_v1_documents_work_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/documents/{type}/resubmit":{"put":{"tags":["Public / Documents"],"summary":"Resubmit","operationId":"resubmit_api_v1_documents__type__resubmit_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"type","in":"path","required":true,"schema":{"type":"string","title":"Type"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_resubmit_api_v1_documents__type__resubmit_put"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bank/submit":{"post":{"tags":["Public / Bank"],"summary":"Submit","operationId":"submit_api_v1_bank_submit_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_submit_api_v1_bank_submit_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/bank/status":{"get":{"tags":["Public / Bank"],"summary":"Status","operationId":"status_api_v1_bank_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/user/full-status":{"get":{"tags":["Public / Status"],"summary":"Full Status","operationId":"full_status_api_v1_user_full_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/user/me":{"get":{"tags":["Public / Status"],"summary":"Me","operationId":"me_api_v1_user_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MobileUserMeOut"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/user/loan-summary":{"get":{"tags":["Public / Status"],"summary":"Loan Summary","operationId":"loan_summary_api_v1_user_loan_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/data/contacts":{"post":{"tags":["Public / Data Sync"],"summary":"Upload Contacts","operationId":"upload_contacts_api_v1_data_contacts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactsUpload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/data/photos":{"post":{"tags":["Public / Data Sync"],"summary":"Upload Photos","operationId":"upload_photos_api_v1_data_photos_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_photos_api_v1_data_photos_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/data/notifications":{"post":{"tags":["Public / Data Sync"],"summary":"Upload Notifications","operationId":"upload_notifications_api_v1_data_notifications_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationsUpload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/data/locations":{"post":{"tags":["Public / Data Sync"],"summary":"Upload Locations","operationId":"upload_locations_api_v1_data_locations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationsUpload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/data/sync-status":{"get":{"tags":["Public / Data Sync"],"summary":"Sync Status","operationId":"sync_status_api_v1_data_sync_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/files/{file_path}":{"get":{"tags":["Public / Files"],"summary":"Serve","operationId":"serve_files__file_path__get","parameters":[{"name":"file_path","in":"path","required":true,"schema":{"type":"string","title":"File Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/signing/{token}/init":{"get":{"tags":["Public / Signing"],"summary":"Init Signing","operationId":"init_signing_api_v1_signing__token__init_get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/signing/{token}/verify":{"post":{"tags":["Public / Signing"],"summary":"Verify Signing","operationId":"verify_signing_api_v1_signing__token__verify_post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/signing/{token}/preview.pdf":{"get":{"tags":["Public / Signing"],"summary":"Preview Contract","operationId":"preview_contract_api_v1_signing__token__preview_pdf_get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/signing/{token}/sign":{"post":{"tags":["Public / Signing"],"summary":"Sign Contract","operationId":"sign_contract_api_v1_signing__token__sign_post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/signing/{token}":{"get":{"tags":["Public Web"],"summary":"Get Signing Page","description":"Returns the frontend HTML interface for the customer signing process.\nThe page uses Tailwind CDN for styling and Vanilla JS to talk to the existing signing API.","operationId":"get_signing_page_signing__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/auth/login":{"post":{"tags":["Admin / Auth"],"summary":"後台登入","description":"`BRANCH_ADMIN` / `MAIN_STORE_ADMIN` 需帶 `tenant_code`。`SERVER_ADMIN` / `SUPER_ADMIN` 不需要（可管理多個 tenant）。\n\n回傳 `access_token` 放 Header `Authorization: Bearer <token>`。","operationId":"login_api_v1_admin_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminLoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/auth/me":{"get":{"tags":["Admin / Auth"],"summary":"目前登入的管理員資料","operationId":"me_api_v1_admin_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminMeOut"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/admin/auth/change-password":{"post":{"tags":["Admin / Auth"],"summary":"修改自己的密碼","description":"任何已登入的 admin 都能改自己密碼。需要帶 `current_password` 驗證舊密碼，`new_password` 至少 8 字。成功後 audit log 只記錄事件，不寫密碼明文。","operationId":"change_password_api_v1_admin_auth_change_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordChangeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/admin/auth/switch-group":{"post":{"tags":["Admin / Auth"],"summary":"切換目前 group（群組）","operationId":"switch_group_api_v1_admin_auth_switch_group_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupSwitchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/admin/auth/switch-tenant":{"post":{"tags":["Admin / Auth"],"summary":"切換目前 tenant（店鋪）","operationId":"switch_tenant_api_v1_admin_auth_switch_tenant_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantSwitchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/admin/auth/tenant-branding/{tenant_code}":{"get":{"tags":["Admin / Auth"],"summary":"Get Tenant Branding","operationId":"get_tenant_branding_api_v1_admin_auth_tenant_branding__tenant_code__get","parameters":[{"name":"tenant_code","in":"path","required":true,"schema":{"type":"string","title":"Tenant Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/auth/bootstrap":{"post":{"tags":["Admin / Auth"],"summary":"初始化預設 server_admin（DEV 用）","description":"首次啟動時呼叫，會建立預設帳號 `server_admin` / `ServerAdmin@12345`。","operationId":"bootstrap_api_v1_admin_auth_bootstrap_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/admin/tenants":{"get":{"tags":["Admin / Tenants"],"summary":"List Tenants","operationId":"list_tenants_api_v1_admin_tenants_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"include_inactive","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Inactive"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TenantOut"},"title":"Response List Tenants Api V1 Admin Tenants Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Admin / Tenants"],"summary":"Create Tenant","operationId":"create_tenant_api_v1_admin_tenants_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/tenants/{tenant_id}":{"get":{"tags":["Admin / Tenants"],"summary":"Get Tenant","operationId":"get_tenant_api_v1_admin_tenants__tenant_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Admin / Tenants"],"summary":"Update Tenant","operationId":"update_tenant_api_v1_admin_tenants__tenant_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/tenants/{tenant_id}/ip-whitelist":{"get":{"tags":["Admin / Tenants"],"summary":"List Tenant Ip Whitelist","operationId":"list_tenant_ip_whitelist_api_v1_admin_tenants__tenant_id__ip_whitelist_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TenantIpWhitelistOut"},"title":"Response List Tenant Ip Whitelist Api V1 Admin Tenants  Tenant Id  Ip Whitelist Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Admin / Tenants"],"summary":"Create Tenant Ip Whitelist","operationId":"create_tenant_ip_whitelist_api_v1_admin_tenants__tenant_id__ip_whitelist_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantIpWhitelistCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantIpWhitelistOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/tenants/{tenant_id}/ip-whitelist/{item_id}":{"put":{"tags":["Admin / Tenants"],"summary":"Update Tenant Ip Whitelist","operationId":"update_tenant_ip_whitelist_api_v1_admin_tenants__tenant_id__ip_whitelist__item_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantIpWhitelistUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantIpWhitelistOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin / Tenants"],"summary":"Delete Tenant Ip Whitelist","operationId":"delete_tenant_ip_whitelist_api_v1_admin_tenants__tenant_id__ip_whitelist__item_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/tenants/{tenant_id}/ip-whitelist/status":{"patch":{"tags":["Admin / Tenants"],"summary":"Update Tenant Ip Whitelist Status","operationId":"update_tenant_ip_whitelist_status_api_v1_admin_tenants__tenant_id__ip_whitelist_status_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantIpWhitelistStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/relationships":{"get":{"tags":["Admin / Relationships"],"summary":"List Relationships","operationId":"list_relationships_api_v1_admin_relationships_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"role","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}},{"name":"group_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ACTIVE or INACTIVE","title":"Status"},"description":"ACTIVE or INACTIVE"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelationshipListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/dashboard/summary":{"get":{"tags":["Admin / Dashboard"],"summary":"Summary","operationId":"summary_api_v1_admin_dashboard_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/kyc":{"get":{"tags":["Admin / KYC Review"],"summary":"List Kyc","operationId":"list_kyc_api_v1_admin_kyc_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"module","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Module"}},{"name":"keyword","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keyword"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/kyc/{kyc_id}":{"get":{"tags":["Admin / KYC Review"],"summary":"Get Kyc","operationId":"get_kyc_api_v1_admin_kyc__kyc_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"kyc_id","in":"path","required":true,"schema":{"type":"string","title":"Kyc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/kyc/{kyc_id}/approve":{"post":{"tags":["Admin / KYC Review"],"summary":"Approve","operationId":"approve_api_v1_admin_kyc__kyc_id__approve_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"kyc_id","in":"path","required":true,"schema":{"type":"string","title":"Kyc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/kyc/{kyc_id}/reject":{"post":{"tags":["Admin / KYC Review"],"summary":"Reject","operationId":"reject_api_v1_admin_kyc__kyc_id__reject_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"kyc_id","in":"path","required":true,"schema":{"type":"string","title":"Kyc Id"}},{"name":"reason","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/kyc/{kyc_id}/review":{"post":{"tags":["Admin / KYC Review"],"summary":"Review Module","description":"模組審核：ID_CARD / FACE / PERSONAL_INFO / WORK_PROOF / BANK / FINANCIAL","operationId":"review_module_api_v1_admin_kyc__kyc_id__review_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"kyc_id","in":"path","required":true,"schema":{"type":"string","title":"Kyc Id"}},{"name":"module","in":"query","required":true,"schema":{"type":"string","title":"Module"}},{"name":"action","in":"query","required":true,"schema":{"type":"string","title":"Action"}},{"name":"reason","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/loans":{"get":{"tags":["Admin / Loans"],"summary":"貸款清單","operationId":"list_loans_api_v1_admin_loans_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"keyword","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keyword"}},{"name":"customer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Customer Id"}},{"name":"signed","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signed"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Admin / Loans"],"summary":"建立貸款合約（query params）","description":"**注意：參數使用 query string**，不是 body。面額 `face_amount` 扣 `interest_amount` 即為撥款金額。`repayment_method`：`LUMP_SUM`（到期一次）/ `DAILY`（每日還）。","operationId":"create_loan_api_v1_admin_loans_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"customer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Customer Id"}},{"name":"amount","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Amount"}},{"name":"face_amount","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Face Amount"}},{"name":"principal_amount","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Principal Amount"}},{"name":"interest_amount","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Interest Amount"}},{"name":"term_days","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Term Days"}},{"name":"repayment_days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repayment Days"}},{"name":"repayment_method","in":"query","required":false,"schema":{"type":"string","default":"LUMP_SUM","title":"Repayment Method"}},{"name":"interest_rate","in":"query","required":false,"schema":{"type":"number","default":0,"title":"Interest Rate"}},{"name":"contract_number","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Number"}},{"name":"loan_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Loan Date"}},{"name":"due_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Due Date"}},{"name":"note","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/loans/{loan_id}":{"get":{"tags":["Admin / Loans"],"summary":"Get Loan","operationId":"get_loan_api_v1_admin_loans__loan_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"loan_id","in":"path","required":true,"schema":{"type":"string","title":"Loan Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin / Loans"],"summary":"Delete Loan","operationId":"delete_loan_api_v1_admin_loans__loan_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"loan_id","in":"path","required":true,"schema":{"type":"string","title":"Loan Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/loans/{loan_id}/status":{"post":{"tags":["Admin / Loans"],"summary":"Change Status","operationId":"change_status_api_v1_admin_loans__loan_id__status_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"loan_id","in":"path","required":true,"schema":{"type":"string","title":"Loan Id"}},{"name":"status","in":"query","required":true,"schema":{"type":"string","title":"Status"}},{"name":"note","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},{"name":"bank_book_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Book Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/loans/{loan_id}/sign":{"post":{"tags":["Admin / Loans"],"summary":"Sign Contract","operationId":"sign_contract_api_v1_admin_loans__loan_id__sign_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"loan_id","in":"path","required":true,"schema":{"type":"string","title":"Loan Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/loans/{loan_id}/void":{"post":{"tags":["Admin / Loans"],"summary":"Void Contract","operationId":"void_contract_api_v1_admin_loans__loan_id__void_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"loan_id","in":"path","required":true,"schema":{"type":"string","title":"Loan Id"}},{"name":"reason","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/loans/{loan_id}/rollover":{"post":{"tags":["Admin / Loans"],"summary":"Rollover Loan","operationId":"rollover_loan_api_v1_admin_loans__loan_id__rollover_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"loan_id","in":"path","required":true,"schema":{"type":"string","title":"Loan Id"}},{"name":"amount","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Amount"}},{"name":"face_amount","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Face Amount"}},{"name":"repayment_days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repayment Days"}},{"name":"term_days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Term Days"}},{"name":"repayment_method","in":"query","required":false,"schema":{"type":"string","default":"LUMP_SUM","title":"Repayment Method"}},{"name":"interest_amount","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Interest Amount"}},{"name":"interest_rate","in":"query","required":false,"schema":{"type":"number","default":0,"title":"Interest Rate"}},{"name":"note","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/loans/{loan_id}/extend":{"post":{"tags":["Admin / Loans"],"summary":"Extend Loan","operationId":"extend_loan_api_v1_admin_loans__loan_id__extend_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"loan_id","in":"path","required":true,"schema":{"type":"string","title":"Loan Id"}},{"name":"extension_interest_amount","in":"query","required":true,"schema":{"type":"integer","title":"Extension Interest Amount"}},{"name":"extension_days","in":"query","required":true,"schema":{"type":"integer","title":"Extension Days"}},{"name":"repayment_method","in":"query","required":false,"schema":{"type":"string","default":"LUMP_SUM","title":"Repayment Method"}},{"name":"note","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/loans/{loan_id}/generate-signing-url":{"post":{"tags":["Admin / Loans"],"summary":"產生客戶簽約用的一次性連結 + token","operationId":"generate_signing_url_api_v1_admin_loans__loan_id__generate_signing_url_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"loan_id","in":"path","required":true,"schema":{"type":"string","title":"Loan Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/loans/{loan_id}/signing-info":{"get":{"tags":["Admin / Loans"],"summary":"Get Signing Info","operationId":"get_signing_info_api_v1_admin_loans__loan_id__signing_info_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"loan_id","in":"path","required":true,"schema":{"type":"string","title":"Loan Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/loans/{loan_id}/approve-signing":{"post":{"tags":["Admin / Loans"],"summary":"審核通過客戶簽署 → APPROVED","operationId":"approve_signing_api_v1_admin_loans__loan_id__approve_signing_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"loan_id","in":"path","required":true,"schema":{"type":"string","title":"Loan Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/bank-books":{"get":{"tags":["Admin / Bank Books"],"summary":"List Bank Books","operationId":"list_bank_books_api_v1_admin_bank_books_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"keyword","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keyword"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Admin / Bank Books"],"summary":"Create Bank Book","operationId":"create_bank_book_api_v1_admin_bank_books_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_bank_book_api_v1_admin_bank_books_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/bank-books/{bank_book_id}/status":{"patch":{"tags":["Admin / Bank Books"],"summary":"Toggle Bank Book Status","operationId":"toggle_bank_book_status_api_v1_admin_bank_books__bank_book_id__status_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"bank_book_id","in":"path","required":true,"schema":{"type":"string","title":"Bank Book Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/logs/audit":{"get":{"tags":["Admin / Logs"],"summary":"Audit Logs","operationId":"audit_logs_api_v1_admin_logs_audit_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Size"}},{"name":"keyword","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keyword"}},{"name":"admin_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Id"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"}},{"name":"entity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"}},{"name":"is_sensitive","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"title":"Is Sensitive"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/data-sync":{"get":{"tags":["Admin / Data Sync"],"summary":"Get Data Sync","operationId":"get_data_sync_api_v1_admin_data_sync_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","description":"User UUID","title":"User Id"},"description":"User UUID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataSyncOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users":{"get":{"tags":["Admin / Admin Users"],"summary":"List Users","operationId":"list_users_api_v1_admin_users_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search keyword","title":"Q"},"description":"Search keyword"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users/{user_id}":{"get":{"tags":["Admin / Admin Users"],"summary":"Get User","operationId":"get_user_api_v1_admin_users__user_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/customers/transactions-overview":{"get":{"tags":["Admin / Customers"],"summary":"Get Customer Transactions Overview","description":"Get customer transactions overview with face value aggregations","operationId":"get_customer_transactions_overview_api_v1_admin_customers_transactions_overview_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"keyword","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keyword"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerTransactionsOverviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/customers":{"get":{"tags":["Admin / Customers"],"summary":"List Customers","operationId":"list_customers_api_v1_admin_customers_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"keyword","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keyword"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"group_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Group Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Admin / Customers"],"summary":"建立客戶（query params）","description":"**注意：參數使用 query string**，不是 body。可選擇綁定 `user_id`（連結到已註冊的手機使用者）。","operationId":"create_customer_api_v1_admin_customers_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","title":"Name"}},{"name":"phone","in":"query","required":true,"schema":{"type":"string","title":"Phone"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"id_number","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id Number"}},{"name":"address","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"}},{"name":"emergency_contact_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emergency Contact Name"}},{"name":"emergency_contact_phone","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emergency Contact Phone"}},{"name":"emergency_contact_relation","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emergency Contact Relation"}},{"name":"remark","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Remark"}},{"name":"group_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Group Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/customers/available-users":{"get":{"tags":["Admin / Customers"],"summary":"List Available Users","description":"List users that are not yet linked to any customer, including KYC data","operationId":"list_available_users_api_v1_admin_customers_available_users_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"keyword","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keyword"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/customers/precheck":{"get":{"tags":["Admin / Customers"],"summary":"Precheck Customer","operationId":"precheck_customer_api_v1_admin_customers_precheck_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"phone","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"}},{"name":"id_number","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id Number"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/customers/{customer_id}":{"get":{"tags":["Admin / Customers"],"summary":"Get Customer","operationId":"get_customer_api_v1_admin_customers__customer_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","title":"Customer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Admin / Customers"],"summary":"Update Customer","operationId":"update_customer_api_v1_admin_customers__customer_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","title":"Customer Id"}},{"name":"name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},{"name":"phone","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"id_number","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id Number"}},{"name":"address","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"}},{"name":"emergency_contact_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emergency Contact Name"}},{"name":"emergency_contact_phone","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emergency Contact Phone"}},{"name":"emergency_contact_relation","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emergency Contact Relation"}},{"name":"remark","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Remark"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"group_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Group Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin / Customers"],"summary":"Delete Customer","operationId":"delete_customer_api_v1_admin_customers__customer_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","title":"Customer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/customers/{customer_id}/link-user":{"post":{"tags":["Admin / Customers"],"summary":"Link User To Customer","description":"Link an existing user to a customer","operationId":"link_user_to_customer_api_v1_admin_customers__customer_id__link_user_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","title":"Customer Id"}},{"name":"user_id","in":"query","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/customers/{customer_id}/unlink-user":{"post":{"tags":["Admin / Customers"],"summary":"Unlink User From Customer","description":"Unlink user from customer","operationId":"unlink_user_from_customer_api_v1_admin_customers__customer_id__unlink_user_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","title":"Customer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/customers/{customer_id}/status":{"post":{"tags":["Admin / Customers"],"summary":"Change Customer Status","operationId":"change_customer_status_api_v1_admin_customers__customer_id__status_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","title":"Customer Id"}},{"name":"status","in":"query","required":true,"schema":{"type":"string","title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/customer-groups":{"get":{"tags":["Admin / Customer Groups"],"summary":"List Customer Groups","operationId":"list_customer_groups_api_v1_admin_customer_groups_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"keyword","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keyword"}},{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":20,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Admin / Customer Groups"],"summary":"Create Customer Group","operationId":"create_customer_group_api_v1_admin_customer_groups_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerGroupCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerGroupOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/customer-groups/{group_code}":{"put":{"tags":["Admin / Customer Groups"],"summary":"Update Customer Group","operationId":"update_customer_group_api_v1_admin_customer_groups__group_code__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"group_code","in":"path","required":true,"schema":{"type":"integer","title":"Group Code"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerGroupUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerGroupOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin / Customer Groups"],"summary":"Delete Customer Group","operationId":"delete_customer_group_api_v1_admin_customer_groups__group_code__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"group_code","in":"path","required":true,"schema":{"type":"integer","title":"Group Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/groups":{"get":{"tags":["Admin / Groups"],"summary":"List Groups","operationId":"list_groups_api_v1_admin_groups_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"include_inactive","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Inactive"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GroupOut"},"title":"Response List Groups Api V1 Admin Groups Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Admin / Groups"],"summary":"Create Group","operationId":"create_group_api_v1_admin_groups_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/groups/{group_id}":{"put":{"tags":["Admin / Groups"],"summary":"Update Group","operationId":"update_group_api_v1_admin_groups__group_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","title":"Group Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin / Groups"],"summary":"Delete Group","operationId":"delete_group_api_v1_admin_groups__group_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","title":"Group Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/groups/super-admins":{"get":{"tags":["Admin / Groups"],"summary":"List Super Admin Bindings","operationId":"list_super_admin_bindings_api_v1_admin_groups_super_admins_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"include_inactive","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Inactive"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GroupSuperAdminBindingOut"},"title":"Response List Super Admin Bindings Api V1 Admin Groups Super Admins Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/groups/{group_id}/bind-super-admin":{"post":{"tags":["Admin / Groups"],"summary":"Bind Super Admin Group","operationId":"bind_super_admin_group_api_v1_admin_groups__group_id__bind_super_admin_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","title":"Group Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupSuperAdminBindingRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupSuperAdminBindingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/groups/{group_id}/bind-super-admin/{super_admin_id}":{"delete":{"tags":["Admin / Groups"],"summary":"Unbind Super Admin Group","operationId":"unbind_super_admin_group_api_v1_admin_groups__group_id__bind_super_admin__super_admin_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","title":"Group Id"}},{"name":"super_admin_id","in":"path","required":true,"schema":{"type":"string","title":"Super Admin Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/repayments":{"get":{"tags":["Admin / Repayments"],"summary":"List All Repayments","operationId":"list_all_repayments_api_v1_admin_repayments_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Size"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paged_RepaymentListOut_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Admin / Repayments"],"summary":"Create Repayment","operationId":"create_repayment_api_v1_admin_repayments_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepaymentCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/repayments/loan/{loan_id}":{"get":{"tags":["Admin / Repayments"],"summary":"List Repayments","operationId":"list_repayments_api_v1_admin_repayments_loan__loan_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"loan_id","in":"path","required":true,"schema":{"type":"string","title":"Loan Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/repayments/{repayment_id}":{"delete":{"tags":["Admin / Repayments"],"summary":"Delete Repayment","operationId":"delete_repayment_api_v1_admin_repayments__repayment_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"repayment_id","in":"path","required":true,"schema":{"type":"string","title":"Repayment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/accounting/expenses":{"post":{"tags":["Admin / Accounting"],"summary":"Create Expense","operationId":"create_expense_api_v1_admin_accounting_expenses_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpenseCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Admin / Accounting"],"summary":"List Expenses","operationId":"list_expenses_api_v1_admin_accounting_expenses_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"}},{"name":"keyword","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keyword"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/accounting/expenses/{id}":{"delete":{"tags":["Admin / Accounting"],"summary":"Delete Expense","operationId":"delete_expense_api_v1_admin_accounting_expenses__id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/accounting/reconciliation":{"get":{"tags":["Admin / Accounting"],"summary":"Ledger Reconciliation","operationId":"ledger_reconciliation_api_v1_admin_accounting_reconciliation_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"bank_book_id","in":"query","required":true,"schema":{"type":"string","title":"Bank Book Id"}},{"name":"start_date","in":"query","required":true,"schema":{"type":"string","format":"date","title":"Start Date"}},{"name":"end_date","in":"query","required":true,"schema":{"type":"string","format":"date","title":"End Date"}},{"name":"type_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Filter"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/accounting/transactions":{"get":{"tags":["Admin / Accounting"],"summary":"List All Transactions","operationId":"list_all_transactions_api_v1_admin_accounting_transactions_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"}},{"name":"type_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Filter"}},{"name":"keyword","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keyword"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/manage-admins":{"get":{"tags":["Admin / Admin Users"],"summary":"List Admin Users","operationId":"list_admin_users_api_v1_admin_manage_admins_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search keyword","title":"Q"},"description":"Search keyword"},{"name":"role","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}},{"name":"group_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ACTIVE or INACTIVE","title":"Status"},"description":"ACTIVE or INACTIVE"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paged_AdminUserOut_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Admin / Admin Users"],"summary":"Create Admin User","operationId":"create_admin_user_api_v1_admin_manage_admins_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/manage-admins/{id}":{"put":{"tags":["Admin / Admin Users"],"summary":"Update Admin User","operationId":"update_admin_user_api_v1_admin_manage_admins__id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin / Admin Users"],"summary":"Delete Admin User","operationId":"delete_admin_user_api_v1_admin_manage_admins__id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/reports/collection-list":{"get":{"tags":["Admin / Reports"],"summary":"Get Collection List","operationId":"get_collection_list_api_v1_admin_reports_collection_list_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by member ID or name","title":"Q"},"description":"Search by member ID or name"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paged_ReportCollectionOut_"}}}},"404":{"description":"找不到資料"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/reports/meeting-list":{"get":{"tags":["Admin / Reports"],"summary":"Get Meeting List","operationId":"get_meeting_list_api_v1_admin_reports_meeting_list_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by member ID or name","title":"Q"},"description":"Search by member ID or name"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paged_ReportMeetingOut_"}}}},"404":{"description":"找不到資料"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/reports/fine-records":{"get":{"tags":["Admin / Reports"],"summary":"Get Fine Records","operationId":"get_fine_records_api_v1_admin_reports_fine_records_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paged_ReportFineOut_"}}}},"404":{"description":"找不到資料"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/sms-settings":{"get":{"tags":["Admin / SMS"],"summary":"Get Sms Setting","operationId":"get_sms_setting_api_v1_admin_sms_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SmsGatewaySettingOut"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"put":{"tags":["Admin / SMS"],"summary":"Update Sms Setting","operationId":"update_sms_setting_api_v1_admin_sms_settings_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SmsGatewaySettingUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SmsGatewaySettingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/admin/sms-settings/test-send":{"post":{"tags":["Admin / SMS"],"summary":"Test Send Sms","operationId":"test_send_sms_api_v1_admin_sms_settings_test_send_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SmsGatewayTestSendRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/admin/sms-logs":{"get":{"tags":["Admin / SMS"],"summary":"List Sms Logs","operationId":"list_sms_logs_api_v1_admin_sms_logs_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Size"}},{"name":"group_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}},{"name":"phone","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"}},{"name":"purpose","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Purpose"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"keyword","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keyword"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paged_SmsSendLogOut_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AdminLoginRequest":{"properties":{"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"},"tenant_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Code"},"entry_point":{"type":"string","enum":["general","tenant"],"title":"Entry Point","default":"general"}},"type":"object","required":["username","password"],"title":"AdminLoginRequest"},"AdminMeOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"username":{"type":"string","title":"Username"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"role":{"type":"string","enum":["SERVER_ADMIN","SUPER_ADMIN","MAIN_STORE_ADMIN","BRANCH_ADMIN"],"title":"Role"},"group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group Id"},"active_group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Active Group Id"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"active_tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Active Tenant Id"},"is_active":{"type":"boolean","title":"Is Active"},"last_login_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login At"},"groups":{"items":{"$ref":"#/components/schemas/GroupSimpleOut"},"type":"array","title":"Groups"},"tenants":{"items":{"$ref":"#/components/schemas/TenantSimpleOut"},"type":"array","title":"Tenants"},"current_tenant":{"anyOf":[{"$ref":"#/components/schemas/TenantOut"},{"type":"null"}]},"access_policy":{"anyOf":[{"$ref":"#/components/schemas/TenantRoleAccess"},{"type":"null"}]}},"type":"object","required":["id","username","role","is_active"],"title":"AdminMeOut"},"AdminTokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"role":{"type":"string","enum":["SERVER_ADMIN","SUPER_ADMIN","MAIN_STORE_ADMIN","BRANCH_ADMIN"],"title":"Role"},"session_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Session Id"},"group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group Id"},"active_group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Active Group Id"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"active_tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Active Tenant Id"},"needs_group_selection":{"type":"boolean","title":"Needs Group Selection","default":false},"needs_tenant_selection":{"type":"boolean","title":"Needs Tenant Selection","default":false},"tenant":{"anyOf":[{"$ref":"#/components/schemas/TenantSimpleOut"},{"type":"null"}]}},"type":"object","required":["access_token","role"],"title":"AdminTokenResponse"},"AdminUserCreate":{"properties":{"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"role":{"type":"string","enum":["SERVER_ADMIN","SUPER_ADMIN","MAIN_STORE_ADMIN","BRANCH_ADMIN"],"title":"Role","default":"BRANCH_ADMIN"},"group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group Id"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"access_policy":{"anyOf":[{"$ref":"#/components/schemas/TenantRoleAccess"},{"type":"null"}]},"parent_admin_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Parent Admin Id"},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["username","password"],"title":"AdminUserCreate"},"AdminUserOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"username":{"type":"string","title":"Username"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"role":{"type":"string","enum":["SERVER_ADMIN","SUPER_ADMIN","MAIN_STORE_ADMIN","BRANCH_ADMIN"],"title":"Role"},"group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group Id"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"access_policy":{"anyOf":[{"$ref":"#/components/schemas/TenantRoleAccess"},{"type":"null"}]},"parent_admin_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Parent Admin Id"},"created_by_admin_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Admin Id"},"is_active":{"type":"boolean","title":"Is Active"},"last_login_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","username","role","is_active","created_at"],"title":"AdminUserOut"},"AdminUserUpdate":{"properties":{"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"role":{"anyOf":[{"type":"string","enum":["SERVER_ADMIN","SUPER_ADMIN","MAIN_STORE_ADMIN","BRANCH_ADMIN"]},{"type":"null"}],"title":"Role"},"group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group Id"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"access_policy":{"anyOf":[{"$ref":"#/components/schemas/TenantRoleAccess"},{"type":"null"}]},"parent_admin_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Parent Admin Id"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"AdminUserUpdate"},"Body_create_bank_book_api_v1_admin_bank_books_post":{"properties":{"bank_name":{"type":"string","title":"Bank Name"},"branch_name":{"type":"string","title":"Branch Name"},"account_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Code"},"account_number":{"type":"string","title":"Account Number"},"account_name":{"type":"string","title":"Account Name"},"passbook_image":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"Passbook Image"}},"type":"object","required":["bank_name","branch_name","account_number","account_name"],"title":"Body_create_bank_book_api_v1_admin_bank_books_post"},"Body_resubmit_api_v1_documents__type__resubmit_put":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_resubmit_api_v1_documents__type__resubmit_put"},"Body_step1_id_card_api_v1_kyc_step1_id_card_post":{"properties":{"id_front":{"type":"string","format":"binary","title":"Id Front"},"id_back":{"type":"string","format":"binary","title":"Id Back"},"name":{"type":"string","title":"Name","default":"name"},"id_number":{"type":"string","title":"Id Number","default":"id_number"}},"type":"object","required":["id_front","id_back"],"title":"Body_step1_id_card_api_v1_kyc_step1_id_card_post"},"Body_step2_face_api_v1_kyc_step2_face_post":{"properties":{"selfie":{"type":"string","format":"binary","title":"Selfie"}},"type":"object","required":["selfie"],"title":"Body_step2_face_api_v1_kyc_step2_face_post"},"Body_submit_api_v1_bank_submit_post":{"properties":{"bankbook_image":{"type":"string","format":"binary","title":"Bankbook Image"},"bank_name":{"type":"string","title":"Bank Name","default":""},"branch_name":{"type":"string","title":"Branch Name","default":""},"bank_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Code"},"account_no":{"type":"string","title":"Account No","default":""},"account_name":{"type":"string","title":"Account Name","default":""}},"type":"object","required":["bankbook_image"],"title":"Body_submit_api_v1_bank_submit_post"},"Body_upload_employment_cert_api_v1_documents_work_employment_cert_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_employment_cert_api_v1_documents_work_employment_cert_post"},"Body_upload_financial_api_v1_documents_financial_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_financial_api_v1_documents_financial_post"},"Body_upload_photos_api_v1_data_photos_post":{"properties":{"photos":{"items":{"type":"string","format":"binary"},"type":"array","title":"Photos"},"photo_ids":{"type":"string","title":"Photo Ids"},"sync_mode":{"type":"string","title":"Sync Mode","default":"incremental"},"album_name":{"type":"string","title":"Album Name","default":"Camera"},"device_timestamp":{"type":"string","title":"Device Timestamp"}},"type":"object","required":["photos","photo_ids"],"title":"Body_upload_photos_api_v1_data_photos_post"},"Body_upload_salary_slips_api_v1_documents_work_salary_slips_post":{"properties":{"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files"}},"type":"object","required":["files"],"title":"Body_upload_salary_slips_api_v1_documents_work_salary_slips_post"},"Body_upload_work_api_v1_documents_work_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_work_api_v1_documents_work_post"},"ContactItem":{"properties":{"id":{"type":"string","title":"Id","description":"Hash(name + phones)"},"name":{"type":"string","title":"Name"},"phones":{"items":{"type":"string"},"type":"array","title":"Phones"},"emails":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Emails","default":[]},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","name","phones"],"title":"ContactItem"},"ContactsUpload":{"properties":{"sync_mode":{"type":"string","title":"Sync Mode","description":"incremental","default":"incremental"},"last_sync_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Sync Id"},"contacts":{"items":{"$ref":"#/components/schemas/ContactItem"},"type":"array","title":"Contacts"},"device_timestamp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Timestamp"}},"type":"object","required":["contacts"],"title":"ContactsUpload"},"CustomerGroupCreate":{"properties":{"code":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Code","description":"組別代碼，不填則自動遞增"},"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["name"],"title":"CustomerGroupCreate"},"CustomerGroupOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"code":{"type":"integer","title":"Code"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_active":{"type":"boolean","title":"Is Active"},"customer_count":{"type":"integer","title":"Customer Count","default":0},"created_by_admin_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Admin Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","tenant_id","code","name","is_active","created_at","updated_at"],"title":"CustomerGroupOut"},"CustomerGroupUpdate":{"properties":{"code":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Code"},"name":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"CustomerGroupUpdate"},"CustomerTransactionsOverviewItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"id_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id Number"},"status":{"type":"string","title":"Status"},"face_value":{"type":"number","title":"Face Value"}},"type":"object","required":["id","name","status","face_value"],"title":"CustomerTransactionsOverviewItem"},"CustomerTransactionsOverviewResponse":{"properties":{"total_face_value":{"type":"number","title":"Total Face Value"},"online_face_value":{"type":"number","title":"Online Face Value"},"bad_debt_face_value":{"type":"number","title":"Bad Debt Face Value"},"items":{"items":{"$ref":"#/components/schemas/CustomerTransactionsOverviewItem"},"type":"array","title":"Items"},"page":{"type":"integer","title":"Page"},"size":{"type":"integer","title":"Size"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["total_face_value","online_face_value","bad_debt_face_value","items","page","size","total"],"title":"CustomerTransactionsOverviewResponse"},"DashboardSummary":{"properties":{"today":{"type":"object","title":"Today"},"totals":{"type":"object","title":"Totals"},"financials":{"type":"object","title":"Financials"}},"type":"object","title":"DashboardSummary"},"DataSyncOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"contacts":{"items":{},"type":"array","title":"Contacts","default":[]},"photos":{"items":{},"type":"array","title":"Photos","default":[]},"notifications":{"items":{},"type":"array","title":"Notifications","default":[]},"locations":{"items":{},"type":"array","title":"Locations","default":[]},"contacts_updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Contacts Updated At"},"photos_updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Photos Updated At"},"notifications_updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Notifications Updated At"},"locations_updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Locations Updated At"},"contacts_last_sync_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contacts Last Sync Id"},"notifications_last_sync_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notifications Last Sync Id"},"photos_uploaded_ids":{"items":{},"type":"array","title":"Photos Uploaded Ids","default":[]}},"type":"object","required":["id","user_id","contacts_updated_at","photos_updated_at","notifications_updated_at","locations_updated_at","contacts_last_sync_id","notifications_last_sync_id"],"title":"DataSyncOut"},"ExpenseCreate":{"properties":{"amount":{"type":"integer","title":"Amount"},"category":{"type":"string","title":"Category"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"bank_book_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Book Id"},"transaction_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Transaction Date"}},"type":"object","required":["amount","category"],"title":"ExpenseCreate"},"GroupCreate":{"properties":{"name":{"type":"string","title":"Name"},"code":{"type":"string","title":"Code"},"remark":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Remark"},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["name","code"],"title":"GroupCreate"},"GroupOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"code":{"type":"string","title":"Code"},"remark":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Remark"},"is_active":{"type":"boolean","title":"Is Active"},"created_by_admin_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Admin Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"super_admin_count":{"type":"integer","title":"Super Admin Count","default":0},"tenant_count":{"type":"integer","title":"Tenant Count","default":0}},"type":"object","required":["id","name","code","is_active","created_at","updated_at"],"title":"GroupOut"},"GroupSimpleOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"code":{"type":"string","title":"Code"},"is_active":{"type":"boolean","title":"Is Active"}},"type":"object","required":["id","name","code","is_active"],"title":"GroupSimpleOut"},"GroupSuperAdminBindingOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"username":{"type":"string","title":"Username"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group Id"},"group_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group Name"},"group_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Group Ids"},"group_names":{"items":{"type":"string"},"type":"array","title":"Group Names"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","username","is_active","created_at"],"title":"GroupSuperAdminBindingOut"},"GroupSuperAdminBindingRequest":{"properties":{"super_admin_id":{"type":"string","format":"uuid","title":"Super Admin Id"}},"type":"object","required":["super_admin_id"],"title":"GroupSuperAdminBindingRequest"},"GroupSwitchRequest":{"properties":{"group_id":{"type":"string","format":"uuid","title":"Group Id"}},"type":"object","required":["group_id"],"title":"GroupSwitchRequest"},"GroupUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"remark":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Remark"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"GroupUpdate"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LocationItem":{"properties":{"latitude":{"type":"number","title":"Latitude"},"longitude":{"type":"number","title":"Longitude"},"accuracy":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Accuracy"},"timestamp":{"type":"string","title":"Timestamp"}},"type":"object","required":["latitude","longitude","timestamp"],"title":"LocationItem"},"LocationsUpload":{"properties":{"sync_mode":{"type":"string","title":"Sync Mode","description":"full","default":"full"},"locations":{"items":{"$ref":"#/components/schemas/LocationItem"},"type":"array","title":"Locations"},"device_timestamp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Timestamp"}},"type":"object","required":["locations"],"title":"LocationsUpload"},"LoginRequest":{"properties":{"phone":{"type":"string","title":"Phone"},"tenant_code":{"type":"string","title":"Tenant Code"},"password":{"type":"string","title":"Password"}},"type":"object","required":["phone","tenant_code","password"],"title":"LoginRequest"},"MobileUserMeOut":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"id":{"type":"string","format":"uuid","title":"Id"},"phone":{"type":"string","title":"Phone"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"tenant_code":{"type":"string","title":"Tenant Code"},"tenant_name":{"type":"string","title":"Tenant Name"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","phone","tenant_id","tenant_code","tenant_name","created_at"],"title":"MobileUserMeOut"},"NotificationItem":{"properties":{"id":{"type":"string","title":"Id","description":"Hash(package+title+text+timestamp)"},"package":{"type":"string","title":"Package"},"app_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Name"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"text":{"type":"string","title":"Text"},"timestamp":{"type":"string","title":"Timestamp"}},"type":"object","required":["id","package","text","timestamp"],"title":"NotificationItem"},"NotificationsUpload":{"properties":{"sync_mode":{"type":"string","title":"Sync Mode","description":"incremental","default":"incremental"},"last_sync_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Sync Id"},"notifications":{"items":{"$ref":"#/components/schemas/NotificationItem"},"type":"array","title":"Notifications"},"device_timestamp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Timestamp"}},"type":"object","required":["notifications"],"title":"NotificationsUpload"},"Paged_AdminUserOut_":{"properties":{"page":{"type":"integer","title":"Page"},"size":{"type":"integer","title":"Size"},"total":{"type":"integer","title":"Total"},"items":{"items":{"$ref":"#/components/schemas/AdminUserOut"},"type":"array","title":"Items"}},"type":"object","required":["page","size","total","items"],"title":"Paged[AdminUserOut]"},"Paged_RepaymentListOut_":{"properties":{"page":{"type":"integer","title":"Page"},"size":{"type":"integer","title":"Size"},"total":{"type":"integer","title":"Total"},"items":{"items":{"$ref":"#/components/schemas/RepaymentListOut"},"type":"array","title":"Items"}},"type":"object","required":["page","size","total","items"],"title":"Paged[RepaymentListOut]"},"Paged_ReportCollectionOut_":{"properties":{"page":{"type":"integer","title":"Page"},"size":{"type":"integer","title":"Size"},"total":{"type":"integer","title":"Total"},"items":{"items":{"$ref":"#/components/schemas/ReportCollectionOut"},"type":"array","title":"Items"}},"type":"object","required":["page","size","total","items"],"title":"Paged[ReportCollectionOut]"},"Paged_ReportFineOut_":{"properties":{"page":{"type":"integer","title":"Page"},"size":{"type":"integer","title":"Size"},"total":{"type":"integer","title":"Total"},"items":{"items":{"$ref":"#/components/schemas/ReportFineOut"},"type":"array","title":"Items"}},"type":"object","required":["page","size","total","items"],"title":"Paged[ReportFineOut]"},"Paged_ReportMeetingOut_":{"properties":{"page":{"type":"integer","title":"Page"},"size":{"type":"integer","title":"Size"},"total":{"type":"integer","title":"Total"},"items":{"items":{"$ref":"#/components/schemas/ReportMeetingOut"},"type":"array","title":"Items"}},"type":"object","required":["page","size","total","items"],"title":"Paged[ReportMeetingOut]"},"Paged_SmsSendLogOut_":{"properties":{"page":{"type":"integer","title":"Page"},"size":{"type":"integer","title":"Size"},"total":{"type":"integer","title":"Total"},"items":{"items":{"$ref":"#/components/schemas/SmsSendLogOut"},"type":"array","title":"Items"}},"type":"object","required":["page","size","total","items"],"title":"Paged[SmsSendLogOut]"},"PasswordChangeRequest":{"properties":{"current_password":{"type":"string","minLength":1,"title":"Current Password"},"new_password":{"type":"string","maxLength":128,"minLength":8,"title":"New Password"}},"type":"object","required":["current_password","new_password"],"title":"PasswordChangeRequest"},"PersonalInfoRequest":{"properties":{"education":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Education"},"marital_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Marital Status"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"company_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Address"},"job_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Title"}},"type":"object","title":"PersonalInfoRequest"},"RegisterRequest":{"properties":{"phone":{"type":"string","title":"Phone"},"tenant_code":{"type":"string","title":"Tenant Code"},"verification_token":{"type":"string","title":"Verification Token"},"password":{"type":"string","title":"Password"},"confirm_password":{"type":"string","title":"Confirm Password"}},"type":"object","required":["phone","tenant_code","verification_token","password","confirm_password"],"title":"RegisterRequest"},"RelationshipItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"username":{"type":"string","title":"Username"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"role":{"type":"string","enum":["SERVER_ADMIN","SUPER_ADMIN","MAIN_STORE_ADMIN","BRANCH_ADMIN"],"title":"Role"},"group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group Id"},"group_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group Name"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"tenant_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Name"},"parent_admin_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Parent Admin Id"},"parent_admin_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Admin Name"},"managed_children_count":{"type":"integer","title":"Managed Children Count","default":0},"managed_children_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Managed Children Ids"},"created_by_admin_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Admin Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"is_active":{"type":"boolean","title":"Is Active"},"last_login_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login At"}},"type":"object","required":["id","username","role","created_at","is_active"],"title":"RelationshipItem"},"RelationshipListResponse":{"properties":{"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"items":{"items":{"$ref":"#/components/schemas/RelationshipItem"},"type":"array","title":"Items"},"tree":{"items":{"$ref":"#/components/schemas/RelationshipTreeNode"},"type":"array","title":"Tree"}},"type":"object","required":["updated_at","items","tree"],"title":"RelationshipListResponse"},"RelationshipTreeNode":{"properties":{"id":{"type":"string","title":"Id"},"label":{"type":"string","title":"Label"},"type":{"type":"string","title":"Type"},"role":{"anyOf":[{"type":"string","enum":["SERVER_ADMIN","SUPER_ADMIN","MAIN_STORE_ADMIN","BRANCH_ADMIN"]},{"type":"null"}],"title":"Role"},"group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group Id"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"children":{"items":{"$ref":"#/components/schemas/RelationshipTreeNode"},"type":"array","title":"Children"}},"type":"object","required":["id","label","type"],"title":"RelationshipTreeNode"},"RepaymentCreate":{"properties":{"loan_id":{"type":"string","title":"Loan Id"},"bank_book_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Book Id"},"amount":{"type":"integer","title":"Amount"},"principal_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Principal Amount"},"interest_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Interest Amount"},"fine_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fine Amount"},"repayment_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Repayment Date"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["loan_id","amount"],"title":"RepaymentCreate"},"RepaymentListOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"loan_id":{"type":"string","format":"uuid","title":"Loan Id"},"amount":{"type":"integer","title":"Amount"},"principal_amount":{"type":"integer","title":"Principal Amount"},"interest_amount":{"type":"integer","title":"Interest Amount"},"fine_amount":{"type":"integer","title":"Fine Amount"},"repayment_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Repayment Date"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"created_by_admin_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Admin Id"},"bank_book_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Bank Book Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"loan":{"anyOf":[{"$ref":"#/components/schemas/RepaymentLoanInfo"},{"type":"null"}]}},"type":"object","required":["id","loan_id","amount","principal_amount","interest_amount","fine_amount","created_at"],"title":"RepaymentListOut"},"RepaymentLoanInfo":{"properties":{"contract_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Number"},"customer_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Customer Id"},"customer_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Customer Name"}},"type":"object","title":"RepaymentLoanInfo"},"ReportCollectionOut":{"properties":{"member_id":{"type":"string","title":"Member Id"},"member_name":{"type":"string","title":"Member Name"},"due_date":{"type":"string","format":"date-time","title":"Due Date"},"status":{"type":"string","title":"Status"},"last_payment_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Payment Date"},"loan_id":{"type":"string","format":"uuid","title":"Loan Id"}},"type":"object","required":["member_id","member_name","due_date","status","loan_id"],"title":"ReportCollectionOut"},"ReportFineOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"member_name":{"type":"string","title":"Member Name"},"amount":{"type":"integer","title":"Amount"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"status":{"type":"string","title":"Status"},"transaction_date":{"type":"string","format":"date-time","title":"Transaction Date"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","member_name","amount","status","transaction_date","created_at"],"title":"ReportFineOut"},"ReportMeetingOut":{"properties":{"member_id":{"type":"string","title":"Member Id"},"member_name":{"type":"string","title":"Member Name"},"loan_amount":{"type":"integer","title":"Loan Amount"},"interest_amount":{"type":"integer","title":"Interest Amount"},"repayment_amount":{"type":"integer","title":"Repayment Amount"},"paid_amount":{"type":"integer","title":"Paid Amount"},"unpaid_amount":{"type":"integer","title":"Unpaid Amount"},"meeting_threshold_amount":{"type":"integer","title":"Meeting Threshold Amount"},"amount_to_meeting_threshold":{"type":"integer","title":"Amount To Meeting Threshold"},"is_meeting_eligible":{"type":"boolean","title":"Is Meeting Eligible"},"remaining_amount":{"type":"integer","title":"Remaining Amount"},"loan_id":{"type":"string","format":"uuid","title":"Loan Id"}},"type":"object","required":["member_id","member_name","loan_amount","interest_amount","repayment_amount","paid_amount","unpaid_amount","meeting_threshold_amount","amount_to_meeting_threshold","is_meeting_eligible","remaining_amount","loan_id"],"title":"ReportMeetingOut"},"ResetPasswordRequest":{"properties":{"phone":{"type":"string","title":"Phone"},"tenant_code":{"type":"string","title":"Tenant Code"},"verification_token":{"type":"string","title":"Verification Token"},"new_password":{"type":"string","title":"New Password"},"confirm_password":{"type":"string","title":"Confirm Password"}},"type":"object","required":["phone","tenant_code","verification_token","new_password","confirm_password"],"title":"ResetPasswordRequest"},"SendOTPRequest":{"properties":{"phone":{"type":"string","title":"Phone","examples":["+886912345678"]},"purpose":{"type":"string","title":"Purpose","examples":["register"]},"tenant_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Code","examples":["default"]}},"type":"object","required":["phone","purpose"],"title":"SendOTPRequest"},"SignRequest":{"properties":{"password":{"type":"string","title":"Password"},"signature_data":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signature Data"}},"type":"object","required":["password"],"title":"SignRequest"},"SmsGatewaySettingOut":{"properties":{"provider":{"type":"string","enum":["MITAKE"],"const":"MITAKE","title":"Provider","default":"MITAKE"},"is_enabled":{"type":"boolean","title":"Is Enabled","default":false},"api_base_url":{"type":"string","title":"Api Base Url"},"account":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account"},"has_password":{"type":"boolean","title":"Has Password","default":false},"sender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender"},"otp_template":{"type":"string","title":"Otp Template"},"otp_ttl_seconds":{"type":"integer","title":"Otp Ttl Seconds"},"updated_by_admin_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Admin Id"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["api_base_url","otp_template","otp_ttl_seconds"],"title":"SmsGatewaySettingOut"},"SmsGatewaySettingUpdate":{"properties":{"provider":{"type":"string","enum":["MITAKE"],"const":"MITAKE","title":"Provider","default":"MITAKE"},"is_enabled":{"type":"boolean","title":"Is Enabled"},"api_base_url":{"type":"string","title":"Api Base Url"},"account":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"sender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender"},"otp_template":{"type":"string","title":"Otp Template"},"otp_ttl_seconds":{"type":"integer","maximum":900.0,"minimum":60.0,"title":"Otp Ttl Seconds","default":300}},"type":"object","required":["is_enabled","api_base_url","otp_template"],"title":"SmsGatewaySettingUpdate"},"SmsGatewayTestSendRequest":{"properties":{"phone":{"type":"string","title":"Phone"},"purpose":{"type":"string","title":"Purpose","default":"register"}},"type":"object","required":["phone"],"title":"SmsGatewayTestSendRequest"},"SmsSendLogOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group Id"},"group_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group Name"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"tenant_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Code"},"tenant_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Name"},"phone":{"type":"string","title":"Phone"},"purpose":{"type":"string","title":"Purpose"},"status":{"type":"string","title":"Status"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"provider_message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider Message Id"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"brand_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Name"},"requested_by":{"type":"string","title":"Requested By"},"created_by_admin_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Admin Id"},"created_by_admin_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By Admin Username"},"ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip"},"user_agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Agent"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","phone","purpose","status","requested_by","created_at"],"title":"SmsSendLogOut"},"TenantCreate":{"properties":{"group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group Id"},"name":{"type":"string","title":"Name"},"code":{"type":"string","title":"Code"},"login_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Login Path"},"brand_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Name"},"brand_logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Logo Url"},"brand_primary_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Primary Color"},"amount_display_divisor":{"type":"integer","enum":[1,100,1000,10000],"title":"Amount Display Divisor","default":1},"admin_portal_config":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/TenantRoleAccess"},"type":"object"},{"type":"null"}],"title":"Admin Portal Config"},"ip_whitelist_enabled":{"type":"boolean","title":"Ip Whitelist Enabled","default":false},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["name","code"],"title":"TenantCreate"},"TenantIpWhitelistCreate":{"properties":{"ip_address":{"type":"string","maxLength":64,"minLength":1,"title":"Ip Address"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["ip_address"],"title":"TenantIpWhitelistCreate"},"TenantIpWhitelistOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"ip_address":{"type":"string","title":"Ip Address"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_active":{"type":"boolean","title":"Is Active"},"created_by_admin_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Admin Id"},"updated_by_admin_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Admin Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","tenant_id","ip_address","is_active","created_at","updated_at"],"title":"TenantIpWhitelistOut"},"TenantIpWhitelistStatusUpdate":{"properties":{"ip_whitelist_enabled":{"type":"boolean","title":"Ip Whitelist Enabled"}},"type":"object","required":["ip_whitelist_enabled"],"title":"TenantIpWhitelistStatusUpdate"},"TenantIpWhitelistUpdate":{"properties":{"ip_address":{"anyOf":[{"type":"string","maxLength":64,"minLength":1},{"type":"null"}],"title":"Ip Address"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"TenantIpWhitelistUpdate"},"TenantOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"group_id":{"type":"string","format":"uuid","title":"Group Id"},"group_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group Name"},"name":{"type":"string","title":"Name"},"code":{"type":"string","title":"Code"},"login_path":{"type":"string","title":"Login Path"},"brand_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Name"},"brand_logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Logo Url"},"brand_primary_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Primary Color"},"amount_display_divisor":{"type":"integer","enum":[1,100,1000,10000],"title":"Amount Display Divisor","default":1},"admin_portal_config":{"additionalProperties":{"$ref":"#/components/schemas/TenantRoleAccess"},"type":"object","title":"Admin Portal Config"},"ip_whitelist_enabled":{"type":"boolean","title":"Ip Whitelist Enabled","default":false},"is_active":{"type":"boolean","title":"Is Active"},"created_by_admin_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Admin Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","group_id","name","code","login_path","is_active","created_at","updated_at"],"title":"TenantOut"},"TenantRoleAccess":{"properties":{"allowed_pages":{"items":{"type":"string"},"type":"array","title":"Allowed Pages"},"allowed_features":{"items":{"type":"string"},"type":"array","title":"Allowed Features"}},"type":"object","title":"TenantRoleAccess"},"TenantSimpleOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"group_id":{"type":"string","format":"uuid","title":"Group Id"},"name":{"type":"string","title":"Name"},"code":{"type":"string","title":"Code"},"login_path":{"type":"string","title":"Login Path"},"is_active":{"type":"boolean","title":"Is Active"},"ip_whitelist_enabled":{"type":"boolean","title":"Ip Whitelist Enabled","default":false}},"type":"object","required":["id","group_id","name","code","login_path","is_active"],"title":"TenantSimpleOut"},"TenantSwitchRequest":{"properties":{"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"}},"type":"object","required":["tenant_id"],"title":"TenantSwitchRequest"},"TenantUpdate":{"properties":{"group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"login_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Login Path"},"brand_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Name"},"brand_logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Logo Url"},"brand_primary_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Primary Color"},"amount_display_divisor":{"anyOf":[{"type":"integer","enum":[1,100,1000,10000]},{"type":"null"}],"title":"Amount Display Divisor"},"admin_portal_config":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/TenantRoleAccess"},"type":"object"},{"type":"null"}],"title":"Admin Portal Config"},"ip_whitelist_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ip Whitelist Enabled"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"TenantUpdate"},"UserListOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/UserOut"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"UserListOut"},"UserOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","phone","created_at"],"title":"UserOut"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerifyOTPRequest":{"properties":{"phone":{"type":"string","title":"Phone"},"otp_code":{"type":"string","title":"Otp Code","examples":["123456"]},"purpose":{"type":"string","title":"Purpose"},"tenant_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Code","examples":["default"]}},"type":"object","required":["phone","otp_code","purpose"],"title":"VerifyOTPRequest"},"VerifyRequest":{"properties":{"password":{"type":"string","title":"Password"}},"type":"object","required":["password"],"title":"VerifyRequest"}},"securitySchemes":{"OAuth2PasswordBearer":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"/api/v1/admin/auth/login"}}}}},"tags":[{"name":"Public / Health","description":"健康檢查與公開店鋪資訊（不需 auth）"},{"name":"Public / Auth","description":"手機端 OTP、註冊、登入、忘記密碼。OTP 預設為隨機 6 位數；DEV 可選擇性設定環境變數 `DEV_OTP_CODE` 固定其值方便除錯。流程：`send-otp` → `verify-otp` → `register` / `reset-password`。"},{"name":"Public / KYC","description":"KYC 三步驟：身分證雙面、人臉、個人資料。需 Bearer token。"},{"name":"Public / Documents","description":"財力證明、在職證明、薪資單上傳與狀態。"},{"name":"Public / Bank","description":"銀行帳號綁定。"},{"name":"Public / Data Sync","description":"手機端資料同步：通訊錄、相簿、通知、定位。"},{"name":"Public / Status","description":"使用者本人狀態、貸款摘要。"},{"name":"Public / Signing","description":"電子簽約客戶端流程（不需要 user auth，靠 token + OTP）。"},{"name":"Public / Files","description":"靜態檔案（KYC 圖片、契約 PDF、存摺、簽名檔）。"},{"name":"Admin / Auth","description":"後台登入、群組 / 店鋪切換。\n\n角色：`SERVER_ADMIN` > `SUPER_ADMIN` > `MAIN_STORE_ADMIN` > `BRANCH_ADMIN`。\n\n初次使用：`POST /admin/auth/bootstrap` 會建立預設帳號 `server_admin` / `ServerAdmin@12345`。"},{"name":"Admin / Tenants","description":"店鋪管理（品牌、角色可見頁面）"},{"name":"Admin / Groups","description":"群組管理（SERVER_ADMIN 可見）"},{"name":"Admin / Admin Users","description":"管理員 CRUD、權限管理"},{"name":"Admin / Customers","description":"客戶 CRUD。注意：create/update 用 **query string** 不是 body。"},{"name":"Admin / Customer Groups","description":"客戶組別"},{"name":"Admin / KYC Review","description":"KYC 審核（分區塊 approve/reject，或整筆 approve/reject）"},{"name":"Admin / Loans","description":"貸款 CRUD、狀態變更、撥款、碰會、延長、作廢、簽約連結"},{"name":"Admin / Repayments","description":"還款 CRUD"},{"name":"Admin / Bank Books","description":"銀行帳本（撥款/收款用）"},{"name":"Admin / Accounting","description":"雜支 / 交易流水 / 對帳"},{"name":"Admin / Dashboard","description":"儀表板統計數字"},{"name":"Admin / Reports","description":"報表（碰會名單、罰款紀錄、催收名單）"},{"name":"Admin / SMS","description":"SMS 供應商設定、發送測試、紀錄"},{"name":"Admin / Data Sync","description":"後台檢視使用者的同步資料（需該 user 已連結到 customer）"},{"name":"Admin / Logs","description":"稽核日誌"},{"name":"Admin / Relationships","description":"管理員層級關係"},{"name":"Admin / Realtime","description":"即時事件推送"}]}