cairn

CLI 參考

進階套組

cairn <resource> <verb>259 命令,依領域分類。每條標出對應的 /api/v1 端點與回應欄位;寫入命令對 production target 需 --confirm。按 ⌘K 搜尋。

開始使用

cairn CLI 是 API 的命令列封裝——你(或你的 agent)在終端機操作租戶後台,走跟後台網頁完全相同的業務規則、 權限與稽核。整個 CLI 自我描述:cairn help 列出所有資源、cairn <resource> help 列出該資源的命令,不必背。

認證走 OAuth 2.0 device flow:先 cairn target add 設定要操作的租戶網域,cairn login 取得驗證碼、到瀏覽器(已登入、含 2FA)核准後 CLI 拿到 bearer token——終端機從不輸入密碼。token 按 target 各存一份、隨租戶網域天然隔離;權限沿用你帳號的角色,CLI 不會給你後台沒有的能力。

輸出預設是給人看的精簡表格;加 --json 就回 API 的原始 JSON,方便管線與 agent 解析。

quickstart
bun run cairn help

cairn target add demo https://your-tenant.example.com
cairn login            # 開瀏覽器核准 device code
cairn whoami

cairn orders list --status pending_payment
cairn orders list --status pending_payment --json

命令結構

絕大多數命令都是同一個形狀:cairn <resource> <verb> [positional] [--flags]。positional 通常是主鍵 id,flags 是篩選/欄位/選項。

全域旗標所有命令通用:--target <name> 單次指定要打的 target、--json 機器可讀輸出、--confirm 對 production 寫入時必帶(見下)。

CLI 不是另一條捷徑——每個命令對應一個 /api/v1 端點,走相同的權限檢查與稽核。下方參考每條命令都標出對應端點(可點擊跳到 API 參考),回應欄位即該端點的回應。

target 切換
cairn target list
cairn target use demo
cairn orders list --target staging   # 單次覆寫

Production 安全

把正式環境的 target 標成 production,CLI 就會在任何寫入命令上要求 --confirm,避免手滑打到正式資料。讀取命令不受影響。

--confirm 只是 client 端的減速丘,不是授權:每個寫入端點都會在 server 重跑權限檢查,權限不足一律回 403 forbidden;owner-scope 也由 server 依你的 token 重算——業務經 CLI 一樣只看得到自己經手的訂單。

production target
cairn target add prod https://your-tenant.example.com --production

cairn orders mark-paid <id>             # ✗ 需 --confirm
cairn orders mark-paid <id> --confirm   # ✓

cairn discount-codes

折扣碼:列表、明細、預覽試算、兌換報表

cairn discount-codes list

列出所有折扣碼

參數

--json
旗標 · 選填

回應欄位 · data[]

id
string

折扣碼 id(disc_ 前綴)。

code
string

折扣碼字串(客戶結帳輸入用,租戶內唯一)。

label
string

折扣碼顯示名稱(後台辨識用)。

discountType
DiscountType

折扣型別:fixed 定額折抵 / percentage 比例折抵。

discountValue
number

折扣值:fixed 為 TWD 整數,percentage 為百分比數字。

profitShareType
ProfitShareType | null

分潤型別:fixed 定額 / percentage 比例;null = 無分潤。

profitShareValue
number | null

分潤值:fixed 為 TWD 整數,percentage 為百分比;null = 無分潤。

profitSharePayee
string | null

分潤受款對象(如合作夥伴名稱);null = 無。

isActive
boolean

是否啟用(停用後不可再兌換)。

validFrom
Date | null

生效起始時間;null = 無下限。

validUntil
Date | null

生效截止時間;null = 無上限。

maxRedemptions
number | null

總兌換次數上限;null = 不限。

redemptionCount
number

已兌換次數(不含已取消訂單)。

minOrderTwd
number | null

最低訂單金額門檻(TWD 整數);null = 無門檻。

appliesToAll
boolean

是否適用所有行程(true = 全站,false = 僅限 tripIds 名單)。

maxRedemptionsPerCustomer
number | null

每位客戶兌換次數上限;null = 不限。

allowedPriceChannels
string[] | null

限用的價格通路清單(如 direct / agency);null = 不限。

allowedCustomerTypes
string[] | null

限用的客戶類型清單;null = 不限。

stackable
boolean

是否可與其他折扣疊加使用。

notes
string | null

內部備註;null = 無。

createdAt
Date

建立時間。

範例
cairn discount-codes list
回應
{
  "ok": true,
  "data": [
    {
      "id": "…",
      "code": "…",
      "label": "…",
      "discountType": "…",
      "discountValue": 0,
      "profitShareType": null,
      "profitShareValue": 0,
      "profitSharePayee": "…",
      "isActive": true,
      "validFrom": null,
      "validUntil": null,
      "maxRedemptions": 0,
      "redemptionCount": 0,
      "minOrderTwd": 0,
      "appliesToAll": true,
      "maxRedemptionsPerCustomer": 0,
      "allowedPriceChannels": "…",
      "allowedCustomerTypes": "…",
      "stackable": true,
      "notes": "…",
      "createdAt": "2026-06-30T08:00:00.000Z"
    }
  ]
}
cairn discount-codes get

單一折扣碼完整明細

參數

<id>位置參數 · 必填
--json
旗標 · 選填

回應欄位 · data

id
string

折扣碼 id(disc_ 前綴)。

code
string

折扣碼字串(客戶結帳輸入用,租戶內唯一)。

label
string

折扣碼顯示名稱(後台辨識用)。

discountType
DiscountType

折扣型別:fixed 定額折抵 / percentage 比例折抵。

discountValue
number

折扣值:fixed 為 TWD 整數,percentage 為百分比數字。

profitShareType
ProfitShareType | null

分潤型別:fixed 定額 / percentage 比例;null = 無分潤。

profitShareValue
number | null

分潤值:fixed 為 TWD 整數,percentage 為百分比;null = 無分潤。

profitSharePayee
string | null

分潤受款對象(如合作夥伴名稱);null = 無。

isActive
boolean

是否啟用(停用後不可再兌換)。

validFrom
Date | null

生效起始時間;null = 無下限。

validUntil
Date | null

生效截止時間;null = 無上限。

maxRedemptions
number | null

總兌換次數上限;null = 不限。

redemptionCount
number

已兌換次數(不含已取消訂單)。

minOrderTwd
number | null

最低訂單金額門檻(TWD 整數);null = 無門檻。

appliesToAll
boolean

是否適用所有行程(true = 全站,false = 僅限 tripIds 名單)。

maxRedemptionsPerCustomer
number | null

每位客戶兌換次數上限;null = 不限。

allowedPriceChannels
string[] | null

限用的價格通路清單(如 direct / agency);null = 不限。

allowedCustomerTypes
string[] | null

限用的客戶類型清單;null = 不限。

stackable
boolean

是否可與其他折扣疊加使用。

notes
string | null

內部備註;null = 無。

createdAt
Date

建立時間。

tripIds
string[]

限定適用的行程 id 清單(appliesToAll=false 時生效)。

redemptions
object[]

逐筆兌換紀錄。

orderId
string

兌換該折扣碼的訂單 id(ord_ 前綴)。

orderNumber
string

訂單編號(人類可讀流水號)。

codeSnapshot
string

兌換當下的折扣碼字串快照。

originalTotalTwd
number

套用折扣前的原始應收總額(TWD 整數)。

discountTwd
number

本次折抵金額(TWD 整數)。

profitShareTwd
number

本次分潤金額(TWD 整數)。

orderStatus
string

訂單當前狀態。

createdAt
Date

兌換(下單)時間。

totalDiscountTwd
number

累計折抵金額合計(TWD 整數)。

totalProfitShareTwd
number

累計分潤金額合計(TWD 整數)。

totalPaidTwd
number

兌換訂單累計已收金額合計(TWD 整數)。

範例
cairn discount-codes get <id>
回應
{
  "ok": true,
  "data": {
    "id": "…",
    "code": "…",
    "label": "…",
    "discountType": "…",
    "discountValue": 0,
    "profitShareType": null,
    "profitShareValue": 0,
    "profitSharePayee": "…",
    "isActive": true,
    "validFrom": null,
    "validUntil": null,
    "maxRedemptions": 0,
    "redemptionCount": 0,
    "minOrderTwd": 0,
    "appliesToAll": true,
    "maxRedemptionsPerCustomer": 0,
    "allowedPriceChannels": "…",
    "allowedCustomerTypes": "…",
    "stackable": true,
    "notes": "…",
    "createdAt": "2026-06-30T08:00:00.000Z",
    "tripIds": [
      "…"
    ],
    "redemptions": [
      {
        "orderId": "…",
        "orderNumber": "…",
        "codeSnapshot": "…",
        "originalTotalTwd": 0,
        "discountTwd": 0,
        "profitShareTwd": 0,
        "orderStatus": "…",
        "createdAt": "2026-06-30T08:00:00.000Z"
      }
    ],
    "totalDiscountTwd": 0,
    "totalProfitShareTwd": 0,
    "totalPaidTwd": 0
  }
}
cairn discount-codes preview

預覽試算折抵(唯讀,不消耗名額)

參數

--code <CODE>
旗標 · 必填

欲試算的折扣碼字串

--kind
旗標 · 必填

產品種類:tour 行程或 lodging 住宿

--trip-id
旗標 · 選填

行程 id(kind=tour 時必填)

--total <twd>
旗標 · 必填

試算用原始金額(TWD,未折扣前)

--price-channel
旗標 · 選填

價格渠道(direct / agency / promo),用於折扣碼資格判定

--customer-type
旗標 · 選填

客戶類型(direct / agency_contact),用於折扣碼資格判定

--user-id
旗標 · 選填

客戶 user id,用於每客戶使用次數限制判定

--json
旗標 · 選填
範例
cairn discount-codes preview --code <CODE> --kind --total <twd>
回應
{
  "ok": true,
  "data": "…"
}
cairn discount-codes redemptions

折扣碼兌換 / 分潤報表

參數

<id>位置參數 · 必填
--json
旗標 · 選填

回應欄位 · data

id
string

折扣碼 id(disc_ 前綴)。

code
string

折扣碼字串。

label
string

折扣碼顯示名稱。

redemptionCount
number

已兌換次數(不含已取消訂單)。

totalDiscountTwd
number

累計折抵金額合計(TWD 整數)。

totalProfitShareTwd
number

累計分潤金額合計(TWD 整數)。

totalPaidTwd
number

兌換訂單累計已收金額合計(TWD 整數)。

redemptions
object[]

逐筆兌換紀錄。

orderId
string

兌換該折扣碼的訂單 id(ord_ 前綴)。

orderNumber
string

訂單編號(人類可讀流水號)。

codeSnapshot
string

兌換當下的折扣碼字串快照。

originalTotalTwd
number

套用折扣前的原始應收總額(TWD 整數)。

discountTwd
number

本次折抵金額(TWD 整數)。

profitShareTwd
number

本次分潤金額(TWD 整數)。

orderStatus
string

訂單當前狀態。

createdAt
Date

兌換(下單)時間。

範例
cairn discount-codes redemptions <id>
回應
{
  "ok": true,
  "data": {
    "id": "…",
    "code": "…",
    "label": "…",
    "redemptionCount": 0,
    "totalDiscountTwd": 0,
    "totalProfitShareTwd": 0,
    "totalPaidTwd": 0,
    "redemptions": [
      {
        "orderId": "…",
        "orderNumber": "…",
        "codeSnapshot": "…",
        "originalTotalTwd": 0,
        "discountTwd": 0,
        "profitShareTwd": 0,
        "orderStatus": "…",
        "createdAt": "2026-06-30T08:00:00.000Z"
      }
    ]
  }
}
cairn discount-codes create

建立折扣碼

參數

--code <C>
旗標 · 必填

折扣碼字串(前台結帳輸入,不分大小寫須唯一)

--label <t>
旗標 · 必填

折扣碼顯示名稱(後台與報表辨識用)

--discount-type
旗標 · 必填

折抵方式:fixed 固定金額(TWD)或 percentage 百分比

--discount-value <n>
旗標 · 必填

折抵數值;fixed 為折抵金額(TWD),percentage 為百分比(1–100)

--profit-share-type
旗標 · 選填

分潤方式:fixed 固定金額或 percentage 百分比;null 為不分潤

--profit-share-value
旗標 · 選填

分潤數值;搭配 profitShareType,percentage 須 1–100,null 為不分潤

--profit-share-payee
旗標 · 選填

分潤對象名稱(如合作推廣者),供出款對帳辨識

--active
旗標 · 選填
--valid-from
旗標 · 選填

生效起日(YYYY-MM-DD);留空為不限起日

--valid-until
旗標 · 選填

生效迄日(YYYY-MM-DD);留空為不限迄日

--max-redemptions
旗標 · 選填

全碼可使用總次數上限;null 為不限

--min-order
旗標 · 選填
--applies-to-all
旗標 · 選填

是否適用全部行程;true 時忽略 tripIds

--trip-ids
旗標 · 選填

指定可套用的行程 id 清單(appliesToAll=false 時生效)

--max-per-customer
旗標 · 選填
--price-channels
旗標 · 選填
--customer-types
旗標 · 選填
--stackable
旗標 · 選填

是否可與其他折扣碼疊加使用

--notes
旗標 · 選填

內部備註(不對外顯示)

--confirm
對 production target 寫入時必帶

回應欄位 · data

id
string

新建立折扣碼的 id(disc_ 前綴)。

範例
cairn discount-codes create --code <C> --label <t> --discount-type --discount-value <n>
回應
{
  "ok": true,
  "data": {
    "id": "…"
  }
}
cairn discount-codes update

更新折扣碼(送出完整欄位,未帶旗標的欄位沿用表單預設)

參數

<id>位置參數 · 必填
--code <C>
旗標 · 必填

折扣碼字串(前台結帳輸入,不分大小寫須唯一)

--label <t>
旗標 · 必填

折扣碼顯示名稱(後台與報表辨識用)

--discount-type
旗標 · 必填

折抵方式:fixed 固定金額(TWD)或 percentage 百分比

--discount-value <n>
旗標 · 必填

折抵數值;fixed 為折抵金額(TWD),percentage 為百分比(1–100)

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

操作成功旗標,恆為 true。

範例
cairn discount-codes update <id> --code <C> --label <t> --discount-type --discount-value <n>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn discount-codes set-active

啟用 / 停用折扣碼

參數

<id>位置參數 · 必填
--active
旗標 · 必填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

操作成功旗標,恆為 true。

範例
cairn discount-codes set-active <id> --active
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}

cairn group-codes

團號:碼表(地區/航空)與團號反查

cairn group-codes regions

地區碼對照表

參數

--active-only
旗標 · 選填
--json
旗標 · 選填
對應端點GET /api/v1/group-codes/regions:param
範例
cairn group-codes regions
cairn group-codes airlines

航空碼對照表

參數

--active-only
旗標 · 選填
--json
旗標 · 選填
對應端點GET /api/v1/group-codes/airlines:param
範例
cairn group-codes airlines
cairn group-codes lookup

精確團號反查單一梯次

參數

<groupCode>位置參數 · 必填
--json
旗標 · 選填

回應欄位 · data

id
string

梯次 id(dep_ 前綴)。

tripId
string

所屬行程 id(trip_ 前綴)。

tripTitle
string

所屬行程標題。

tripSlug
string

所屬行程網址 slug。

departureDate
string

出發日(ISO 'YYYY-MM-DD')。

groupCode
string

完整團號。

regionCode
string | null

地區代碼;null = 未設。

airlineCode
string | null

航空公司代碼;null = 國內團或未設。

範例
cairn group-codes lookup <groupCode>
回應
{
  "ok": true,
  "data": {
    "id": "…",
    "tripId": "…",
    "tripTitle": "…",
    "tripSlug": "…",
    "departureDate": "…",
    "groupCode": "…",
    "regionCode": "…",
    "airlineCode": "…"
  }
}
cairn group-codes region-create

新增地區碼

參數

<code>位置參數 · 必填
--name <>
旗標 · 必填

碼的顯示名稱(如地區或航空公司全名)

--order
旗標 · 選填
--inactive
旗標 · 選填

回應欄位 · data

ok
boolean

操作成功旗標,恆為 true。

code
string

新增或更新的地區代碼。

範例
cairn group-codes region-create <code> --name <名>
回應
{
  "ok": true,
  "data": {
    "ok": true,
    "code": "…"
  }
}
cairn group-codes region-update

更新地區碼(name / 啟用 / 排序,不改碼)

參數

<code>位置參數 · 必填
--name <>
旗標 · 必填

碼的顯示名稱(如地區或航空公司全名)

--order
旗標 · 選填
--inactive
旗標 · 選填

回應欄位 · data

ok
boolean

操作成功旗標,恆為 true。

code
string

新增或更新的地區代碼。

範例
cairn group-codes region-update <code> --name <名>
回應
{
  "ok": true,
  "data": {
    "ok": true,
    "code": "…"
  }
}
cairn group-codes airline-create

新增航空碼

參數

<code>位置參數 · 必填
--name <>
旗標 · 必填

碼的顯示名稱(如地區或航空公司全名)

--order
旗標 · 選填
--inactive
旗標 · 選填

回應欄位 · data

ok
boolean

操作成功旗標,恆為 true。

code
string

新增或更新的航空公司代碼。

範例
cairn group-codes airline-create <code> --name <名>
回應
{
  "ok": true,
  "data": {
    "ok": true,
    "code": "…"
  }
}
cairn group-codes airline-update

更新航空碼(name / 啟用 / 排序,不改碼)

參數

<code>位置參數 · 必填
--name <>
旗標 · 必填

碼的顯示名稱(如地區或航空公司全名)

--order
旗標 · 選填
--inactive
旗標 · 選填

回應欄位 · data

ok
boolean

操作成功旗標,恆為 true。

code
string

新增或更新的航空公司代碼。

範例
cairn group-codes airline-update <code> --name <名>
回應
{
  "ok": true,
  "data": {
    "ok": true,
    "code": "…"
  }
}

cairn holidays

國定假日 / 補班表:查詢、年度統計

cairn holidays list

列出假日 / 補班(可依年度篩選)

參數

--year
旗標 · 選填
--json
旗標 · 選填
對應端點/api/v1/holidays${qs.toString()
範例
cairn holidays list
cairn holidays stats

某年度假日 / 補班計數

參數

--year
旗標 · 必填

要統計的西元年份(1000..9999,必填)

--json
旗標 · 選填

回應欄位 · data

holidayCount
number

該年度放假日數。

makeupCount
number

該年度補班日數。

範例
cairn holidays stats --year
回應
{
  "ok": true,
  "data": {
    "holidayCount": 0,
    "makeupCount": 0
  }
}
cairn holidays upsert

新增 / 覆寫一筆假日或補班(date 為自然鍵)

參數

--date
旗標 · 必填

假日 / 補班日的日期(YYYY-MM-DD,路徑參數),作為該筆紀錄的自然鍵

--name
旗標 · 必填

假日 / 補班日名稱(如「春節」「補行上班」)

--makeup
旗標 · 選填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

操作成功旗標,恆為 true。

範例
cairn holidays upsert --date --name
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn holidays delete

刪除一筆假日 / 補班

參數

--date
旗標 · 必填

假日 / 補班日的日期(YYYY-MM-DD,路徑參數),作為該筆紀錄的自然鍵

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

操作成功旗標,恆為 true。

範例
cairn holidays delete --date
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}

cairn images

圖片庫:查詢圖片、行程選單

cairn images list

列出/搜尋行程圖片

參數

--trip-id
旗標 · 選填

行程 ID 篩選,僅回傳掛在該行程的圖片

--q
旗標 · 選填

關鍵字,模糊比對行程標題、slug、圖說或網址

--page
旗標 · 選填

分頁頁碼,從 1 起算,預設第 1 頁

--page-size
旗標 · 選填

每頁筆數,上限 200,預設由後端決定

--json
旗標 · 選填

回應欄位 · data

rows
object[]

當頁圖片列。

id
string

圖片資源 id(timg_ 前綴)。

tripId
string

所屬行程 id(trip_ 前綴)。

tripTitle
string

所屬行程標題。

tripSlug
string

所屬行程網址 slug。

url
string

圖片公開 URL。

caption
string | null

圖說文字;null = 無。

displayOrder
number

在行程相簿中的排序(由小到大)。

createdAt
Date

上傳建立時間。

total
number

符合條件的總筆數(跨頁)。

page
number

目前頁碼(1 起算)。

pageSize
number

每頁筆數。

對應端點GET /api/v1/images
範例
cairn images list
回應
{
  "ok": true,
  "data": {
    "rows": [
      {
        "id": "…",
        "tripId": "…",
        "tripTitle": "…",
        "tripSlug": "…",
        "url": "…",
        "caption": "…",
        "displayOrder": 0,
        "createdAt": "2026-06-30T08:00:00.000Z"
      }
    ],
    "total": 0,
    "page": 0,
    "pageSize": 0
  }
}
cairn images trips

可掛圖的行程選單(draft + published)

參數

--json
旗標 · 選填

回應欄位 · data[]

id
string

行程 id(trip_ 前綴)。

title
string

行程標題。

範例
cairn images trips
回應
{
  "ok": true,
  "data": [
    {
      "id": "…",
      "title": "…"
    }
  ]
}
cairn images create

掛圖到行程(以網址)

參數

--trip-id <id>
旗標 · 必填

行程 ID 篩選,僅回傳掛在該行程的圖片

--url <https://…>
旗標 · 必填

圖片網址(http 或 https),以引用方式掛載,非檔案上傳

--caption
旗標 · 選填

圖片說明文字,選填

--display-order
旗標 · 選填

排序權重,數字越小越前面,預設 0

--confirm
對 production target 寫入時必帶

回應欄位 · data

id
string

新建立圖片的 id(timg_ 前綴)。

範例
cairn images create --trip-id <id> --url <https://…>
回應
{
  "ok": true,
  "data": {
    "id": "…"
  }
}
cairn images delete

刪除行程圖片

參數

<id>位置參數 · 必填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

操作成功旗標,恆為 true。

範例
cairn images delete <id>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}

cairn lodging

旅宿:物件、房型、可用量、訂房、統計

cairn lodging properties

列出旅宿物件

參數

--json
旗標 · 選填

回應欄位 · data[]

id
object

住宿館 id(prop_ 前綴)。

length
number

Returns the length of a String object.

slug
string

網址 slug(公開站路徑,租戶內唯一)。

name
string

住宿館名稱。

kind
string

類型:hotel 旅館 / camp 營地。

isOverseas
boolean

是否為海外住宿。

location
string | null

地點描述;null = 未設。

description
string | null

簡介文字;null = 未設。

contentMdx
string | null

內文(MDX 原始碼);null = 未設。

facilities
unknown

設施清單(JSON);null = 未設。

coverImageUrl
string | null

封面圖 URL;null = 未設。

usageHint
string

用途:direct 散客直訂 / package 梯次配套 / both 兩者皆可。

checkInTime
string | null

入住時間文字(如「15:00」);null = 未設。

checkOutTime
string | null

退房時間文字(如「11:00」);null = 未設。

checkInInfo
string | null

入住須知;null = 未設。

houseRules
string | null

館內規範;null = 未設。

cancellationPolicy
string | null

取消政策;null = 未設。

addressRegion
string | null

地址:縣市/區域;null = 未設。

addressLocality
string | null

地址:鄉鎮/地區;null = 未設。

streetAddress
string | null

街道地址;null = 未設。

postalCode
string | null

郵遞區號;null = 未設。

latitude
number | null

緯度;null = 未設。

longitude
number | null

經度;null = 未設。

phone
string | null

聯絡電話;null = 未設。

petsAllowed
boolean | null

是否允許攜帶寵物;null = 未設。

smokingAllowed
boolean | null

是否允許吸菸;null = 未設。

status
string

狀態:active 啟用 / inactive 停用。

seoTitle
string | null

SEO 標題覆寫;null = 沿用內容欄。

seoDescription
string | null

SEO 描述;null = 未設。

ogImageUrl
string | null

Open Graph 分享圖 URL;null = 未設。

createdAt
Date

建立時間。

updatedAt
Date

最後更新時間。

範例
cairn lodging properties
回應
{
  "ok": true,
  "data": [
    {
      "id": {
        "length": 0
      },
      "slug": "…",
      "name": "…",
      "kind": "…",
      "isOverseas": true,
      "location": "…",
      "description": "…",
      "contentMdx": "…",
      "facilities": "…",
      "coverImageUrl": "…",
      "usageHint": "…",
      "checkInTime": "…",
      "checkOutTime": "…",
      "checkInInfo": "…",
      "houseRules": "…",
      "cancellationPolicy": "…",
      "addressRegion": "…",
      "addressLocality": "…",
      "streetAddress": "…",
      "postalCode": "…",
      "latitude": 0,
      "longitude": 0,
      "phone": "…",
      "petsAllowed": true,
      "smokingAllowed": true,
      "status": "…",
      "seoTitle": "…",
      "seoDescription": "…",
      "ogImageUrl": "…",
      "createdAt": "2026-06-30T08:00:00.000Z",
      "updatedAt": "2026-06-30T08:00:00.000Z"
    }
  ]
}
cairn lodging property

單一旅宿物件

參數

<id>位置參數 · 必填
--json
旗標 · 選填

回應欄位 · data

id
object

住宿館 id(prop_ 前綴)。

length
number

Returns the length of a String object.

slug
string

網址 slug(公開站路徑,租戶內唯一)。

name
string

住宿館名稱。

kind
string

類型:hotel 旅館 / camp 營地。

isOverseas
boolean

是否為海外住宿。

location
string | null

地點描述;null = 未設。

description
string | null

簡介文字;null = 未設。

contentMdx
string | null

內文(MDX 原始碼);null = 未設。

facilities
unknown

設施清單(JSON);null = 未設。

coverImageUrl
string | null

封面圖 URL;null = 未設。

usageHint
string

用途:direct 散客直訂 / package 梯次配套 / both 兩者皆可。

checkInTime
string | null

入住時間文字(如「15:00」);null = 未設。

checkOutTime
string | null

退房時間文字(如「11:00」);null = 未設。

checkInInfo
string | null

入住須知;null = 未設。

houseRules
string | null

館內規範;null = 未設。

cancellationPolicy
string | null

取消政策;null = 未設。

addressRegion
string | null

地址:縣市/區域;null = 未設。

addressLocality
string | null

地址:鄉鎮/地區;null = 未設。

streetAddress
string | null

街道地址;null = 未設。

postalCode
string | null

郵遞區號;null = 未設。

latitude
number | null

緯度;null = 未設。

longitude
number | null

經度;null = 未設。

phone
string | null

聯絡電話;null = 未設。

petsAllowed
boolean | null

是否允許攜帶寵物;null = 未設。

smokingAllowed
boolean | null

是否允許吸菸;null = 未設。

status
string

狀態:active 啟用 / inactive 停用。

seoTitle
string | null

SEO 標題覆寫;null = 沿用內容欄。

seoDescription
string | null

SEO 描述;null = 未設。

ogImageUrl
string | null

Open Graph 分享圖 URL;null = 未設。

createdAt
Date

建立時間。

updatedAt
Date

最後更新時間。

範例
cairn lodging property <id>
回應
{
  "ok": true,
  "data": {
    "id": {
      "length": 0
    },
    "slug": "…",
    "name": "…",
    "kind": "…",
    "isOverseas": true,
    "location": "…",
    "description": "…",
    "contentMdx": "…",
    "facilities": "…",
    "coverImageUrl": "…",
    "usageHint": "…",
    "checkInTime": "…",
    "checkOutTime": "…",
    "checkInInfo": "…",
    "houseRules": "…",
    "cancellationPolicy": "…",
    "addressRegion": "…",
    "addressLocality": "…",
    "streetAddress": "…",
    "postalCode": "…",
    "latitude": 0,
    "longitude": 0,
    "phone": "…",
    "petsAllowed": true,
    "smokingAllowed": true,
    "status": "…",
    "seoTitle": "…",
    "seoDescription": "…",
    "ogImageUrl": "…",
    "createdAt": "2026-06-30T08:00:00.000Z",
    "updatedAt": "2026-06-30T08:00:00.000Z"
  }
}
cairn lodging room-types

列出某物件的房型

參數

--property <propertyId>
旗標 · 必填
--json
旗標 · 選填

回應欄位 · data[]

id
object

房型 id(rt_ 前綴)。

length
number

Returns the length of a String object.

propertyId
object

所屬住宿館 id(prop_ 前綴)。

length
number

Returns the length of a String object.

name
string

房型名稱。

inventoryUnit
string

庫存單位:room 以房計 / bed 以床位計。

unitsTotal
number

總庫存量(房間數或床位數)。

capacityPerUnit
number

每單位可住人數。

basePriceTwd
number

底價(TWD 整數,每晚每單位;可被逐晚覆寫)。

description
string | null

房型描述;null = 未設。

facilities
unknown

設施清單(JSON);null = 未設。

bedConfig
unknown

床型配置(JSON);null = 未設。

floorSizeSqm
number | null

房間坪數(平方公尺);null = 未設。

status
string

狀態:active 啟用 / inactive 停用。

createdAt
Date

建立時間。

updatedAt
Date

最後更新時間。

範例
cairn lodging room-types --property <propertyId>
回應
{
  "ok": true,
  "data": [
    {
      "id": {
        "length": 0
      },
      "propertyId": {
        "length": 0
      },
      "name": "…",
      "inventoryUnit": "…",
      "unitsTotal": 0,
      "capacityPerUnit": 0,
      "basePriceTwd": 0,
      "description": "…",
      "facilities": "…",
      "bedConfig": "…",
      "floorSizeSqm": 0,
      "status": "…",
      "createdAt": "2026-06-30T08:00:00.000Z",
      "updatedAt": "2026-06-30T08:00:00.000Z"
    }
  ]
}
cairn lodging room-type

單一房型

參數

<id>位置參數 · 必填
--json
旗標 · 選填

回應欄位 · data

id
object

房型 id(rt_ 前綴)。

length
number

Returns the length of a String object.

propertyId
object

所屬住宿館 id(prop_ 前綴)。

length
number

Returns the length of a String object.

name
string

房型名稱。

inventoryUnit
string

庫存單位:room 以房計 / bed 以床位計。

unitsTotal
number

總庫存量(房間數或床位數)。

capacityPerUnit
number

每單位可住人數。

basePriceTwd
number

底價(TWD 整數,每晚每單位;可被逐晚覆寫)。

description
string | null

房型描述;null = 未設。

facilities
unknown

設施清單(JSON);null = 未設。

bedConfig
unknown

床型配置(JSON);null = 未設。

floorSizeSqm
number | null

房間坪數(平方公尺);null = 未設。

status
string

狀態:active 啟用 / inactive 停用。

createdAt
Date

建立時間。

updatedAt
Date

最後更新時間。

範例
cairn lodging room-type <id>
回應
{
  "ok": true,
  "data": {
    "id": {
      "length": 0
    },
    "propertyId": {
      "length": 0
    },
    "name": "…",
    "inventoryUnit": "…",
    "unitsTotal": 0,
    "capacityPerUnit": 0,
    "basePriceTwd": 0,
    "description": "…",
    "facilities": "…",
    "bedConfig": "…",
    "floorSizeSqm": 0,
    "status": "…",
    "createdAt": "2026-06-30T08:00:00.000Z",
    "updatedAt": "2026-06-30T08:00:00.000Z"
  }
}
cairn lodging availability

房型逐夜可用量+價格 [check-in, check-out)

參數

--room-type <id>
旗標 · 必填
--check-in <date>
旗標 · 必填

入住日(YYYY-MM-DD,含此晚)

--check-out <date>
旗標 · 必填

退房日(YYYY-MM-DD,不含此晚)

--json
旗標 · 選填

回應欄位 · data

available
number

整段住宿期間可訂房間數(各晚剩餘取最小;任一晚關閉則為 0)。

nights
number

住宿晚數。

totalPriceTwd
number

整段期間房價合計(TWD 整數,逐晚牌價加總)。

perNight
object[]

逐晚可售明細。

night
string

該晚日期(ISO 'YYYY-MM-DD')。

capacity
number

該晚可售容量(房間數;有覆寫則用覆寫值,否則房型總數)。

booked
number

該晚已訂數。

remaining
number

該晚剩餘可訂數(capacity − booked,不小於 0)。

priceTwd
number

該晚房價(TWD 整數;有逐晚覆寫則用覆寫值,否則房型底價)。

status
string

該晚販售狀態:open 開放 / closed 關閉。

範例
cairn lodging availability --room-type <id> --check-in <date> --check-out <date>
回應
{
  "ok": true,
  "data": {
    "available": 0,
    "nights": 0,
    "totalPriceTwd": 0,
    "perNight": [
      {
        "night": "…",
        "capacity": 0,
        "booked": 0,
        "remaining": 0,
        "priceTwd": 0,
        "status": "…"
      }
    ]
  }
}
cairn lodging breakdown

逐夜已訂量(直訂 vs 套裝)[from, to)

參數

--room-type <id>
旗標 · 必填
--from <date>
旗標 · 必填

起始日(YYYY-MM-DD,含此晚)

--to <date>
旗標 · 必填

結束日(YYYY-MM-DD,不含此晚)

--json
旗標 · 選填

回應欄位 · data[]

night
string

該晚日期(ISO 'YYYY-MM-DD')。

directBooked
number

該晚散客直訂的已訂數。

packageBooked
number

該晚梯次配套佔用的已訂數。

範例
cairn lodging breakdown --room-type <id> --from <date> --to <date>
回應
{
  "ok": true,
  "data": [
    {
      "night": "…",
      "directBooked": 0,
      "packageBooked": 0
    }
  ]
}
cairn lodging images

列出物件或房型的圖片

參數

<id>位置參數 · 必填
--room-type <id>
旗標 · 必填
--json
旗標 · 選填
對應端點/api/v1/lodging/properties/:param/images/api/v1/lodging/room-types/:param/images
範例
cairn lodging images <id> --room-type <id>
cairn lodging bookings

列出旅宿訂房(代訂)

參數

--q
旗標 · 選填

自由文字關鍵字(訂房人、旅宿等)

--status
旗標 · 選填

依訂單狀態篩選(省略則回全部)

--json
旗標 · 選填

回應欄位 · data[]

orderId
string

訂單 id(ord_ 前綴)。

orderNumber
string

訂單編號(人類可讀流水號)。

status
string

顯示狀態(派生自三軸,沿用舊欄名供 UI badge / canCancel 相容)。

bookingState
string

訂位軸狀態(如 confirmed / cancelled)。

paymentState
string

付款軸狀態(如 unpaid / partial / paid)。

refundState
string

退款軸狀態。

totalTwd
number

應收總額(TWD 整數,訂單各應收明細加總)。

createdAt
Date

訂單建立時間。

bookerName
string

訂購人姓名。

bookerEmail
string

訂購人 email。

propertyId
string

住宿館 id(prop_ 前綴)。

propertyName
string

住宿館名稱。

roomTypeId
string

房型 id(rt_ 前綴)。

roomTypeName
string

房型名稱。

checkIn
string

入住日(ISO 'YYYY-MM-DD')。

checkOut
string

退房日(ISO 'YYYY-MM-DD')。

units
number

訂購房間數。

guestCount
number

入住總人數。

範例
cairn lodging bookings
回應
{
  "ok": true,
  "data": [
    {
      "orderId": "…",
      "orderNumber": "…",
      "status": "…",
      "bookingState": "…",
      "paymentState": "…",
      "refundState": "…",
      "totalTwd": 0,
      "createdAt": "2026-06-30T08:00:00.000Z",
      "bookerName": "…",
      "bookerEmail": "…",
      "propertyId": "…",
      "propertyName": "…",
      "roomTypeId": "…",
      "roomTypeName": "…",
      "checkIn": "…",
      "checkOut": "…",
      "units": 0,
      "guestCount": 0
    }
  ]
}
cairn lodging booking

單一旅宿訂房明細

參數

<orderId>位置參數 · 必填
--json
旗標 · 選填

回應欄位 · data

orderId
string

訂單 id(ord_ 前綴)。

orderNumber
string

訂單編號(人類可讀流水號)。

status
string

顯示狀態(派生自三軸,沿用舊欄名供 UI badge / canCancel 相容)。

bookingState
string

訂位軸狀態(如 confirmed / cancelled)。

paymentState
string

付款軸狀態(如 unpaid / partial / paid)。

refundState
string

退款軸狀態。

totalTwd
number

應收總額(TWD 整數,訂單各應收明細加總)。

createdAt
Date

訂單建立時間。

bookerName
string

訂購人姓名。

bookerEmail
string

訂購人 email。

propertyId
string

住宿館 id(prop_ 前綴)。

propertyName
string

住宿館名稱。

roomTypeId
string

房型 id(rt_ 前綴)。

roomTypeName
string

房型名稱。

checkIn
string

入住日(ISO 'YYYY-MM-DD')。

checkOut
string

退房日(ISO 'YYYY-MM-DD')。

units
number

訂購房間數。

guestCount
number

入住總人數。

範例
cairn lodging booking <orderId>
回應
{
  "ok": true,
  "data": {
    "orderId": "…",
    "orderNumber": "…",
    "status": "…",
    "bookingState": "…",
    "paymentState": "…",
    "refundState": "…",
    "totalTwd": 0,
    "createdAt": "2026-06-30T08:00:00.000Z",
    "bookerName": "…",
    "bookerEmail": "…",
    "propertyId": "…",
    "propertyName": "…",
    "roomTypeId": "…",
    "roomTypeName": "…",
    "checkIn": "…",
    "checkOut": "…",
    "units": 0,
    "guestCount": 0
  }
}
cairn lodging stats

旅宿 KPI 統計

參數

--json
旗標 · 選填

回應欄位 · data

tonightCheckInUnits
number

今晚入住房間數(Asia/Taipei)。

tonightCheckInGuests
number

今晚入住總人數(Asia/Taipei)。

weekOccupancyPct
number

未來 7 晚住房率(已訂 / 可售,0–100)。

next7AvailableUnits
number

未來 7 晚仍可售的房晚數。

pendingPaymentCount
number

待收款訂單筆數。

pendingPaymentTwd
number

待收款金額合計(TWD 整數)。

範例
cairn lodging stats
回應
{
  "ok": true,
  "data": {
    "tonightCheckInUnits": 0,
    "tonightCheckInGuests": 0,
    "weekOccupancyPct": 0,
    "next7AvailableUnits": 0,
    "pendingPaymentCount": 0,
    "pendingPaymentTwd": 0
  }
}
cairn lodging property-create

新增旅宿物件

參數

--slug <s>
旗標 · 必填

旅宿代稱(小寫英數與連字號,2-63 字,租戶內唯一,用於網址)

--name <n>
旗標 · 必填

旅宿名稱(對外顯示)

--kind
旗標 · 選填

旅宿類型:camp 營地/hotel 旅館,預設 hotel

--overseas
旗標 · 選填
--location
旗標 · 選填

所在地點概述(如縣市、區域)

--description
旗標 · 選填

旅宿介紹文字

--usage-hint
旗標 · 選填

銷售用途:direct 僅直接訂房/package 僅併入套裝行程/both 兩者皆可,預設 both

--confirm
對 production target 寫入時必帶
--json
旗標 · 選填

回應欄位 · data

id
string

新建立住宿館的 id(prop_ 前綴)。

範例
cairn lodging property-create --slug <s> --name <n>
回應
{
  "ok": true,
  "data": {
    "id": "…"
  }
}
cairn lodging property-update

更新旅宿物件(patch 語意;只送有帶的欄位)

參數

<id>位置參數 · 必填
--name
旗標 · 選填

旅宿名稱(對外顯示)

--location
旗標 · 選填

所在地點概述(如縣市、區域)

--description
旗標 · 選填

旅宿介紹文字

--usage-hint
旗標 · 選填

銷售用途:direct 僅直接訂房/package 僅併入套裝行程/both 兩者皆可

--facilities
旗標 · 選填

設施代碼陣列(須為合法 amenity key;送空陣列代表清空)

--pets
旗標 · 選填
--smoking
旗標 · 選填
--seo-title
旗標 · 選填

SEO 標題(送空字串代表清空,退回預設)

--seo-description
旗標 · 選填

SEO 描述(送空字串代表清空,退回預設)

--og-image-url
旗標 · 選填

社群分享圖 URL(須為 http/https,送空字串代表清空)

--phone
旗標 · 選填

聯絡電話

--confirm
對 production target 寫入時必帶
--json
旗標 · 選填

回應欄位 · data

ok
boolean

操作成功旗標,恆為 true。

範例
cairn lodging property-update <id>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn lodging property-archive

封存旅宿物件(status→inactive)

參數

<id>位置參數 · 必填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

操作成功旗標,恆為 true。

範例
cairn lodging property-archive <id>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn lodging room-type-create

新增房型

參數

--property <id>
旗標 · 必填
--name <n>
旗標 · 必填

房型名稱(如標準雙人房)

--units-total <n>
旗標 · 必填

此房型可售總單元數(房數或床位數)

--base-price <twd>
旗標 · 必填
--inventory-unit
旗標 · 選填

庫存單位:room 以房計/bed 以床位計,預設 room

--capacity-per-unit <n>
旗標 · 選填

每單元可容納人數,預設 1

--bed-type
旗標 · 選填

床型代碼(須為合法 bed type,搭配 bedCount 才生效)

--floor-size <sqm>
旗標 · 選填
--facilities
旗標 · 選填

房型設施代碼陣列(須為合法 amenity key)

--description
旗標 · 選填

房型介紹文字

--confirm
對 production target 寫入時必帶
--json
旗標 · 選填

回應欄位 · data

id
string

新建立房型的 id(rt_ 前綴)。

範例
cairn lodging room-type-create --property <id> --name <n> --units-total <n> --base-price <twd>
回應
{
  "ok": true,
  "data": {
    "id": "…"
  }
}
cairn lodging room-type-update

更新房型(patch;送 --facilities= 空字串可清空)

參數

<id>位置參數 · 必填
--name
旗標 · 選填

房型名稱(如標準雙人房)

--units-total
旗標 · 選填

此房型可售總單元數(房數或床位數)

--base-price
旗標 · 選填
--inventory-unit
旗標 · 選填

庫存單位:room 以房計/bed 以床位計

--capacity-per-unit
旗標 · 選填

每單元可容納人數

--bed-type
旗標 · 選填

床型代碼(須為合法 bed type,搭配 bedCount 才生效)

--floor-size
旗標 · 選填
--facilities
旗標 · 選填

房型設施代碼陣列(須為合法 amenity key;送空陣列代表清空)

--description
旗標 · 選填

房型介紹文字

--confirm
對 production target 寫入時必帶
--json
旗標 · 選填

回應欄位 · data

ok
boolean

操作成功旗標,恆為 true。

範例
cairn lodging room-type-update <id>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn lodging room-type-archive

封存房型(status→inactive)

參數

<id>位置參數 · 必填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

操作成功旗標,恆為 true。

範例
cairn lodging room-type-archive <id>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn lodging nights-override

批次覆寫房型一段區間每晚的價/容量/封房 [from, to](inclusive)

參數

--room-type <id>
旗標 · 必填
--from <date>
旗標 · 必填

套用起始日(YYYY-MM-DD,含此日)

--to <date>
旗標 · 必填

套用結束日(YYYY-MM-DD,含此日;須不早於起始日)

--price <twd>
旗標 · 選填
--capacity <n>
旗標 · 選填

覆寫的每晚可售單元數,若低於已訂數量會回 409 衝突

--status
旗標 · 選填

每晚開關房狀態:open 開放/closed 封房

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

操作成功旗標,恆為 true。

範例
cairn lodging nights-override --room-type <id> --from <date> --to <date>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn lodging booking-cancel

取消旅宿訂房(釋回保留夜;owner-scope)

參數

<orderId>位置參數 · 必填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

操作成功旗標,恆為 true。

範例
cairn lodging booking-cancel <orderId>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn lodging book

代客建立旅宿訂房(訂房人須為既有會員)

參數

--property <id>
旗標 · 必填
--room-type <id>
旗標 · 必填
--check-in <date>
旗標 · 必填

入住日(YYYY-MM-DD,含此晚)

--check-out <date>
旗標 · 必填

退房日(YYYY-MM-DD,不含此晚,須晚於入住日)

--units <n>
旗標 · 必填

預訂單元數(房數或床位數,1-50)

--guests <n>
旗標 · 必填
--email <e>
旗標 · 必填
--payment-method <cash|atm|manual>
旗標 · 必填

付款方式:cash 現金/atm 轉帳/manual 其他人工

--receiving-account
旗標 · 選填
--notes
旗標 · 選填

代訂備註

--confirm
對 production target 寫入時必帶
--json
旗標 · 選填

回應欄位 · data

orderId
string

新建立住宿訂單的 id(ord_ 前綴)。

範例
cairn lodging book --property <id> --room-type <id> --check-in <date> --check-out <date> --units <n> --guests <n> --email <e> --payment-method <cash|atm|manual>
回應
{
  "ok": true,
  "data": {
    "orderId": "…"
  }
}
cairn lodging image-add

新增物件或房型圖片

參數

<id>位置參數 · 必填
--room-type <id>
旗標 · 必填
--url <u>
旗標 · 必填

圖片網址

--caption
旗標 · 選填

圖片說明文字(可省略)

--order
旗標 · 選填
--confirm
對 production target 寫入時必帶
--json
旗標 · 選填
對應端點/api/v1/lodging/properties/:param/images/api/v1/lodging/room-types/:param/images
範例
cairn lodging image-add <id> --room-type <id> --url <u>
cairn lodging image-delete

刪除物件或房型圖片

參數

<imageId>位置參數 · 必填
--room-type
旗標 · 必填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

操作成功旗標,恆為 true。

範例
cairn lodging image-delete <imageId> --room-type
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}

cairn trips

行程:查詢、明細、團號梯次、成本範本

cairn trips list

列出/搜尋行程

參數

--status
旗標 · 選填

依行程狀態篩選(draft 草稿/published 上架/archived 封存)

--q
旗標 · 選填

自由文字搜尋(行程標題/代稱/目的地)

--group-code
旗標 · 選填

依團號篩選,列出含該團號梯次的行程

--json
旗標 · 選填

回應欄位 · data[]

id
string

行程 id(trip_ 前綴)。

slug
string

行程網址 slug。

title
string

行程標題。

destination
string

目的地名稱。

durationDays
number

天數。

priceFromTwd
number

「NT$ X 起」起價(TWD 整數)。

status
TripStatus

上架狀態:draft 草稿 / published 已上架 / archived 封存。

updatedAt
Date

最後更新時間。

isClimbing
boolean

是否登山團(行程層模組旗標)。

isOverseas
boolean

是否海外團(行程層模組旗標)。

activeDepartureCount
number

Count of departures with status='selling'.

nextDepartureDate
string | null

Earliest selling departure_date, ISO date string, or null.

representativeGroupCode
string | null

代表團號(group-code §8.2):最新一筆有團號的梯次;無則 null(UI 顯示 —)。

對應端點GET /api/v1/trips
範例
cairn trips list
回應
{
  "ok": true,
  "data": [
    {
      "id": "…",
      "slug": "…",
      "title": "…",
      "destination": "…",
      "durationDays": 0,
      "priceFromTwd": 0,
      "status": "…",
      "updatedAt": "2026-06-30T08:00:00.000Z",
      "isClimbing": true,
      "isOverseas": true,
      "activeDepartureCount": 0,
      "nextDepartureDate": "…",
      "representativeGroupCode": "…"
    }
  ]
}
cairn trips get

單一行程完整明細

參數

<id>位置參數 · 必填
--json
旗標 · 選填

回應欄位 · data

id
object

行程 id(trip_ 前綴)。

length
number

Returns the length of a String object.

slug
string

行程網址 slug(公開站路徑)。

title
string

行程標題。

summary
string | null

一句話摘要;null = 未設。

contentMdx
string | null

行程內文(MDX 原始碼);null = 未設。

destination
string

目的地名稱。

durationDays
number

天數。

priceFromTwd
number

「NT$ X 起」起價(TWD 整數)。

coverImageUrl
string | null

封面圖 URL;null = 未設。

status
TripStatus

上架狀態:draft 草稿 / published 已上架 / archived 封存。

createdAt
Date

建立時間。

updatedAt
Date

最後更新時間。

isClimbing
boolean

是否登山團(行程層模組旗標)。

isOverseas
boolean

是否海外團(行程層模組旗標)。

gradeScore
number | null

難度評鑑分數(climbing-screening §3.1);null = 未評級。

requiresAlpineExperience
boolean

是否要求具備高山經驗(報名審核用)。

gradeLabel
string | null

難度標籤(如「B+」);null = 未設。

feeInclusions
{ ok: boolean; text: string; }[] | null

團費包含/不包含(前台費用區唯一來源);null = 未設。

seoTitle
string | null

SEO 標題覆寫;null = 沿用 title。

seoDescription
string | null

SEO 描述;null = 未設。

ogImageUrl
string | null

Open Graph 分享圖 URL;null = 未設。

images
object[]

行程相簿圖片(依 displayOrder 排序)。

id
string

圖片資源 id(timg_ 前綴)。

url
string

圖片公開 URL。

caption
string | null

圖說文字;null = 無。

displayOrder
number

在行程相簿中的排序(由小到大)。

departures
object[]

Active (selling, future) departures only on the public side; all on admin.

id
string

梯次 id(dep_ 前綴)。

tripId
string

所屬行程 id(trip_ 前綴)。

departureDate
string

出發日(ISO 'YYYY-MM-DD')。

returnDate
string

回程日(ISO 'YYYY-MM-DD')。

priceTwd
number

售價(TWD 整數,未稅牌價)。

capacity
number

名額上限(人數)。

bookedCount
number

已成團佔用名額(人數)。

status
DepartureStatus

梯次狀態:selling 販售中 / closed 關閉 / cancelled 取消 / completed 已結團。

notes
string | null

內部備註;null = 無。

allocationMode
"fcfs" | "lottery"

抽籤分配模式(lottery-integration §2.1):fcfs=先到先得 / lottery=抽籤制。

agencyPriceTwd選填
number | null | undefined

同業價(TWD 整數);admin-only,公開站不映射。

depositMode選填
DepositMode | null | undefined

訂金規則模式:none 免訂金 / fixed 定額 / percent 比例;admin-only。

depositAmountTwd選填
number | null | undefined

訂金定額(TWD 整數,depositMode=fixed 時適用);admin-only。

depositPercent選填
number | null | undefined

訂金比例(百分比,depositMode=percent 時適用);admin-only。

groupCode選填
string | null | undefined

團號(group-code §3.3);admin-only,公開站不映射。

regionCode選填
string | null | undefined

地區代碼(團號組成);admin-only。

airlineCode選填
string | null | undefined

航空公司代碼(團號組成);admin-only。

promoActive選填
boolean | undefined

梯次促銷是否啟用(trip-pricing);admin-only。

promoPriceTwd選填
number | null | undefined

促銷覆寫售價(TWD 整數);admin-only。

promoAgencyPriceTwd選填
number | null | undefined

促銷覆寫同業價(TWD 整數);admin-only。

範例
cairn trips get <id>
回應
{
  "ok": true,
  "data": {
    "id": {
      "length": 0
    },
    "slug": "…",
    "title": "…",
    "summary": "…",
    "contentMdx": "…",
    "destination": "…",
    "durationDays": 0,
    "priceFromTwd": 0,
    "coverImageUrl": "…",
    "status": "…",
    "createdAt": "2026-06-30T08:00:00.000Z",
    "updatedAt": "2026-06-30T08:00:00.000Z",
    "isClimbing": true,
    "isOverseas": true,
    "gradeScore": 0,
    "requiresAlpineExperience": true,
    "gradeLabel": "…",
    "feeInclusions": "…",
    "seoTitle": "…",
    "seoDescription": "…",
    "ogImageUrl": "…",
    "images": [
      {
        "id": "…",
        "url": "…",
        "caption": "…",
        "displayOrder": 0
      }
    ],
    "departures": [
      {
        "id": "…",
        "tripId": "…",
        "departureDate": "…",
        "returnDate": "…",
        "priceTwd": 0,
        "capacity": 0,
        "bookedCount": 0,
        "status": "…",
        "notes": "…",
        "allocationMode": "fcfs",
        "agencyPriceTwd": 0,
        "depositMode": null,
        "depositAmountTwd": 0,
        "depositPercent": 0,
        "groupCode": "…",
        "regionCode": "…",
        "airlineCode": "…",
        "promoActive": true,
        "promoPriceTwd": 0,
        "promoAgencyPriceTwd": 0
      }
    ]
  }
}
cairn trips departures

梯次:查詢(find/search)、建立、編輯、狀態、團號

參數

<tripId>位置參數 · 必填
<departureId>位置參數 · 必填
--group-code <code>
旗標 · 必填

完整團號,格式為 YY+地區+航空+MMDD+序號(如 26EGTK1010A,自動轉大寫)

--group-code-prefix <prefix>
旗標 · 必填

團號前綴,前綴比對列出多個梯次

--status <s>
旗標 · 必填

梯次狀態(selling 銷售中/closed 關閉/cancelled 取消/completed 完成)

--region <c>
旗標 · 必填
--airline <c>
旗標 · 必填
--departure-date <d>
旗標 · 必填

出發日期(YYYY-MM-DD)

回應欄位 · data

id
string

新建立梯次的 id(dep_ 前綴)。

範例
cairn trips departures <tripId> <departureId> --group-code <code> --group-code-prefix <prefix> --status <s> --region <c> --airline <c> --departure-date <d>
回應
{
  "ok": true,
  "data": {
    "id": "…"
  }
}
cairn trips create

建立行程

參數

--slug <s>
旗標 · 必填

行程網址代稱(slug),用於前台路徑與後台識別,只能小寫英數與連字號

--title <t>
旗標 · 必填

行程標題,顯示於前台與訂單

--destination <d>
旗標 · 必填

目的地名稱

--duration-days <n>
旗標 · 必填

行程天數

--price-from-twd <n>
旗標 · 必填

起價(新台幣),前台「OOO 元起」顯示用

--summary
旗標 · 選填

行程摘要,前台列表卡片用的一句話簡介

--status
旗標 · 選填

依行程狀態篩選(draft 草稿/published 上架/archived 封存)

--confirm
對 production target 寫入時必帶

回應欄位 · data

id
string

新建立行程的 id(trip_ 前綴)。

對應端點POST /api/v1/trips
範例
cairn trips create --slug <s> --title <t> --destination <d> --duration-days <n> --price-from-twd <n>
回應
{
  "ok": true,
  "data": {
    "id": "…"
  }
}
cairn trips update

更新行程(null = 清空、未帶 = 不動)

參數

<id>位置參數 · 必填
--title
旗標 · 選填

行程標題,顯示於前台與訂單

--slug
旗標 · 選填

行程網址代稱(slug),用於前台路徑與後台識別,只能小寫英數與連字號

--status
旗標 · 選填

行程狀態(draft 草稿/published 上架/archived 封存)

--price-from-twd
旗標 · 選填

起價(新台幣),前台「OOO 元起」顯示用

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

操作成功旗標,恆為 true。

範例
cairn trips update <id>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn trips set-cost-template

綁定 / 解綁行程的成本範本(可多範本疊加)

參數

<tripId>位置參數 · 必填
--template-ids <id1,id2,…>
旗標 · 選填

要綁定的成本範本 ID 陣列(依序疊加);[] 或省略表示解除全部綁定

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

操作成功旗標,恆為 true。

範例
cairn trips set-cost-template <tripId>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn trips cost-templates

列出可綁定的 active 成本範本

參數

--json
旗標 · 選填

回應欄位 · data[]

id
string

成本範本 id(ct_ 前綴)。

name
string

成本範本名稱。

範例
cairn trips cost-templates
回應
{
  "ok": true,
  "data": [
    {
      "id": "…",
      "name": "…"
    }
  ]
}
cairn trips import

批次匯入行程(.xlsx/.csv;預設 dry-run,--commit 才建檔)

參數

--file <path.xlsx>
旗標 · 必填
--commit
旗標 · 選填
--confirm
對 production target 寫入時必帶
--json
旗標 · 選填

回應欄位 · data

filename
string

已匯入的檔名。

result
object

匯入結果(建檔筆數與逐列結果)。

importBatchId
string

本次匯入批次 id(imp_ 前綴),供稽核追溯。

createdTripCount
number

新建行程數。

createdDepartureCount
number

新建梯次數。

skippedCount
number

略過列數(重複/無需匯入)。

errorCount
number

失敗列數。

results
object[]

逐列匯入結果。

範例
cairn trips import --file <path.xlsx>
回應
{
  "ok": true,
  "data": {
    "filename": "…",
    "result": {
      "importBatchId": "…",
      "createdTripCount": 0,
      "createdDepartureCount": 0,
      "skippedCount": 0,
      "errorCount": 0,
      "results": []
    }
  }
}
cairn trips export

匯出行程為 CSV/JSON(同 list 篩選)

參數

--status
旗標 · 選填

依行程狀態篩選(draft 草稿/published 上架/archived 封存)

--q
旗標 · 選填

自由文字搜尋(行程標題/代稱/目的地)

--group-code
旗標 · 選填

依團號篩選,匯出含該團號梯次的行程

--format
旗標 · 選填
--json
旗標 · 選填

回應欄位 · data

rows
object[]

匯出的行程列(套用相同 filter,無分頁)。

id
string

行程 id(trip_ 前綴)。

slug
string

行程網址 slug。

title
string

行程標題。

destination
string

目的地名稱。

durationDays
number

天數。

priceFromTwd
number

「NT$ X 起」起價(TWD 整數)。

status
TripStatus

上架狀態:draft 草稿 / published 已上架 / archived 封存。

updatedAt
Date

最後更新時間。

isClimbing
boolean

是否登山團(行程層模組旗標)。

isOverseas
boolean

是否海外團(行程層模組旗標)。

activeDepartureCount
number

Count of departures with status='selling'.

nextDepartureDate
string | null

Earliest selling departure_date, ISO date string, or null.

representativeGroupCode
string | null

代表團號(group-code §8.2):最新一筆有團號的梯次;無則 null(UI 顯示 —)。

total
number

匯出總筆數。

truncated
boolean

是否因上限被截斷(此端點回全列,恆為 false)。

範例
cairn trips export
回應
{
  "ok": true,
  "data": {
    "rows": [
      {
        "id": "…",
        "slug": "…",
        "title": "…",
        "destination": "…",
        "durationDays": 0,
        "priceFromTwd": 0,
        "status": "…",
        "updatedAt": "2026-06-30T08:00:00.000Z",
        "isClimbing": true,
        "isOverseas": true,
        "activeDepartureCount": 0,
        "nextDepartureDate": "…",
        "representativeGroupCode": "…"
      }
    ],
    "total": 0,
    "truncated": true
  }
}

cairn agencies

同業:查詢、明細、指派候選、匯出

cairn agencies list

列出/篩選同業

參數

--status
旗標 · 選填

同業狀態篩選(active 啟用中/archived 已封存;省略為全部)

--owner <userId>
旗標 · 選填

負責業務篩選(傳明確使用者 ID;none=只列尚未指派負責業務者;all 或省略=全部)

--has-tax-id
旗標 · 選填

是否有統一編號篩選(yes 僅列有統編者/no 僅列無統編者)

--json
旗標 · 選填

回應欄位 · data[]

id
string

同業 id(前綴 `agc_`)。

name
string

同業公司名 / 個人團主名稱。

taxId
string | null

統一編號(個人團主可留空)。

contactName
string | null

主要聯絡人姓名(未填 → null)。

phone
string | null

聯絡電話(未填 → null)。

email
string | null

聯絡 Email(未填 → null)。

address
string | null

公司地址(未填 → null)。

paymentTerm
string | null

帳期 / 結算方式(自由文字,例:'月結 30 天')。

ownerUserId
string | null

負責業務 user id(NULL = 未指派)。

ownerName
string | null

負責業務顯示名;未指派為 null。

status
"active" | "archived"

同業狀態:active 啟用中 / archived 已封存。

note
string | null

內部備註(未填 → null)。

orderCount
number

累計訂單數(COUNT orders WHERE agency_id = id)。

createdAt
Date

建立時間。

updatedAt
Date

最後更新時間。

範例
cairn agencies list
回應
{
  "ok": true,
  "data": [
    {
      "id": "…",
      "name": "…",
      "taxId": "…",
      "contactName": "…",
      "phone": "…",
      "email": "…",
      "address": "…",
      "paymentTerm": "…",
      "ownerUserId": "…",
      "ownerName": "…",
      "status": "active",
      "note": "…",
      "orderCount": 0,
      "createdAt": "2026-06-30T08:00:00.000Z",
      "updatedAt": "2026-06-30T08:00:00.000Z"
    }
  ]
}
cairn agencies get

單一同業完整明細

參數

<id>位置參數 · 必填
--json
旗標 · 選填

回應欄位 · data

id
string

同業 id(前綴 `agc_`)。

name
string

同業公司名 / 個人團主名稱。

taxId
string | null

統一編號(個人團主可留空)。

contactName
string | null

主要聯絡人姓名(未填 → null)。

phone
string | null

聯絡電話(未填 → null)。

email
string | null

聯絡 Email(未填 → null)。

address
string | null

公司地址(未填 → null)。

paymentTerm
string | null

帳期 / 結算方式(自由文字,例:'月結 30 天')。

ownerUserId
string | null

負責業務 user id(NULL = 未指派)。

ownerName
string | null

負責業務顯示名;未指派為 null。

status
"active" | "archived"

同業狀態:active 啟用中 / archived 已封存。

note
string | null

內部備註(未填 → null)。

orderCount
number

累計訂單數(COUNT orders WHERE agency_id = id)。

createdAt
Date

建立時間。

updatedAt
Date

最後更新時間。

範例
cairn agencies get <id>
回應
{
  "ok": true,
  "data": {
    "id": "…",
    "name": "…",
    "taxId": "…",
    "contactName": "…",
    "phone": "…",
    "email": "…",
    "address": "…",
    "paymentTerm": "…",
    "ownerUserId": "…",
    "ownerName": "…",
    "status": "active",
    "note": "…",
    "orderCount": 0,
    "createdAt": "2026-06-30T08:00:00.000Z",
    "updatedAt": "2026-06-30T08:00:00.000Z"
  }
}
cairn agencies assignable-staff

負責業務指派候選清單

參數

--json
旗標 · 選填

回應欄位 · data[]

userId
string

員工使用者 id(可作為負責業務指派的 ownerUserId)。

name
string

員工顯示名。

role
string

角色代碼(admin / sales / op / accountant)。

範例
cairn agencies assignable-staff
回應
{
  "ok": true,
  "data": [
    {
      "userId": "…",
      "name": "…",
      "role": "…"
    }
  ]
}
cairn agencies export

匯出同業名單(當前篩選視圖)

參數

--status
旗標 · 選填

同業狀態篩選(active 啟用中/archived 已封存;省略為全部)

--owner <userId>
旗標 · 選填

負責業務篩選(傳明確使用者 ID;none=只列尚未指派負責業務者;all 或省略=全部)

--has-tax-id
旗標 · 選填

是否有統一編號篩選(yes 僅列有統編者/no 僅列無統編者)

--json
旗標 · 選填

回應欄位 · data

rows
object[]

同業匯出資料列(依 owner 篩選後的全表快照,供試算表匯出)。

id
string

同業 id(前綴 `agc_`)。

name
string

同業公司名 / 個人團主名稱。

taxId
string | null

統一編號(個人團主可留空)。

contactName
string | null

主要聯絡人姓名(未填 → null)。

phone
string | null

聯絡電話(未填 → null)。

email
string | null

聯絡 Email(未填 → null)。

address
string | null

公司地址(未填 → null)。

paymentTerm
string | null

帳期 / 結算方式(自由文字,例:'月結 30 天')。

ownerUserId
string | null

負責業務 user id(NULL = 未指派)。

ownerName
string | null

負責業務顯示名;未指派為 null。

status
"active" | "archived"

同業狀態:active 啟用中 / archived 已封存。

note
string | null

內部備註(未填 → null)。

orderCount
number

累計訂單數(COUNT orders WHERE agency_id = id)。

createdAt
Date

建立時間。

updatedAt
Date

最後更新時間。

範例
cairn agencies export
回應
{
  "ok": true,
  "data": {
    "rows": [
      {
        "id": "…",
        "name": "…",
        "taxId": "…",
        "contactName": "…",
        "phone": "…",
        "email": "…",
        "address": "…",
        "paymentTerm": "…",
        "ownerUserId": "…",
        "ownerName": "…",
        "status": "active",
        "note": "…",
        "orderCount": 0,
        "createdAt": "2026-06-30T08:00:00.000Z",
        "updatedAt": "2026-06-30T08:00:00.000Z"
      }
    ]
  }
}
cairn agencies create

新增同業(鏡射 createAgency;agency.manage)

參數

--name <name>
旗標 · 必填

同業公司名稱(B2B 旅行社或個人團主名稱)

--tax-id
旗標 · 選填

統一編號(選填)

--contact-name
旗標 · 選填

主要聯絡人姓名(選填)

--phone
旗標 · 選填

聯絡電話(選填)

--email
旗標 · 選填

聯絡 Email(選填;留空字串視為未填)

--address
旗標 · 選填

公司地址(選填)

--payment-term
旗標 · 選填

付款條件/帳期約定(選填,如月結 30 天)

--owner <userId>
旗標 · 選填

負責業務篩選(傳明確使用者 ID;none=只列尚未指派負責業務者;all 或省略=全部)

--status
旗標 · 選填

同業狀態篩選(active 啟用中/archived 已封存;省略為全部)

--note
旗標 · 選填

內部備註(選填)

--confirm
對 production target 寫入時必帶

回應欄位 · data

id
string

新建立同業的 ID(agc_ 前綴)。

範例
cairn agencies create --name <name>
回應
{
  "ok": true,
  "data": {
    "id": "…"
  }
}
cairn agencies update

更新同業(真 partial;鏡射 updateAgency;agency.manage)

參數

<id>位置參數 · 必填
--name
旗標 · 選填

同業公司名稱(省略則不更動)

--tax-id
旗標 · 選填

統一編號(省略則不更動)

--contact-name
旗標 · 選填

主要聯絡人姓名(省略則不更動)

--phone
旗標 · 選填

聯絡電話(省略則不更動)

--email
旗標 · 選填

聯絡 Email(省略則不更動;空字串視為清空)

--address
旗標 · 選填

公司地址(省略則不更動)

--payment-term
旗標 · 選填

付款條件/帳期約定(省略則不更動)

--owner <userId>
旗標 · 選填
--status
旗標 · 選填

同業狀態(active 啟用中/archived 已封存;省略則不更動)

--note
旗標 · 選填

內部備註(省略則不更動)

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

固定為 true:同業資料已更新。

範例
cairn agencies update <id>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn agencies archive

下架同業(鏡射 setAgencyStatus archived;agency.manage)

參數

<id>位置參數 · 必填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

固定為 true:同業啟用/停用狀態已更新。

範例
cairn agencies archive <id>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn agencies restore

上架同業(鏡射 setAgencyStatus active;agency.manage)

參數

<id>位置參數 · 必填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

固定為 true:同業啟用/停用狀態已更新。

範例
cairn agencies restore <id>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}

cairn members

會員(客戶):查詢、明細、統計

cairn members list

列出/搜尋會員

參數

--q
旗標 · 選填

關鍵字,模糊比對會員姓名、Email 或電話

--county
旗標 · 選填

縣市篩選,僅回傳通訊地址在該縣市的會員

--year
旗標 · 選填

加入年份(西元四位數),僅回傳該年註冊的會員

--page
旗標 · 選填

分頁頁碼,從 1 起算,預設第 1 頁

--page-size
旗標 · 選填

每頁筆數,上限 200,預設由後端決定

--json
旗標 · 選填

回應欄位 · data

rows
object[]

當前頁的會員列。

userId
string

會員(顧客)的 user id。

email
string

會員 Email(登入帳號)。

name
string

會員姓名。

createdAt
Date

會員註冊時間。

phone
string | null

聯絡電話(未填 → null)。

address
string | null

通訊地址(未填 → null)。

birthDate
string | null

生日 YYYY-MM-DD(未填 → null)。

orderCount
number

累計訂單數(含所有狀態與 kind)。

paidOrderCount
number

已付清 / 已完成的訂單數(payment_state in paid/overpaid 或 booking_state=completed)。

totalSpent
number

累計消費(上述已付清訂單的應收總額,TWD 整數)。

lastOrderAt
Date | null

最後一筆訂單建立時間(無訂單 → null)。

pdpaSignedAt
Date | null

最新版 PDPA 同意書簽署時間(未簽 → null)。

anonymizedAt
Date | null

PDPA 匿名化時間;非空 = 已匿名化。

total
number

符合篩選的會員總數。

page
number

當前頁碼(從 1 起算)。

pageSize
number

每頁筆數。

範例
cairn members list
回應
{
  "ok": true,
  "data": {
    "rows": [
      {
        "userId": "…",
        "email": "…",
        "name": "…",
        "createdAt": "2026-06-30T08:00:00.000Z",
        "phone": "…",
        "address": "…",
        "birthDate": "…",
        "orderCount": 0,
        "paidOrderCount": 0,
        "totalSpent": 0,
        "lastOrderAt": null,
        "pdpaSignedAt": null,
        "anonymizedAt": null
      }
    ],
    "total": 0,
    "page": 0,
    "pageSize": 0
  }
}
cairn members get

單一會員完整明細(含訂單/同意紀錄)

參數

<userId>位置參數 · 必填
--json
旗標 · 選填

回應欄位 · data

profile
object

會員基本資料 + 訂單彙整。

userId
string

會員(顧客)的 user id。

email
string

會員 Email(登入帳號)。

name
string

會員姓名。

createdAt
Date

會員註冊時間。

phone
string | null

聯絡電話(未填 → null)。

address
string | null

通訊地址(未填 → null)。

birthDate
string | null

生日 YYYY-MM-DD(未填 → null)。

orderCount
number

累計訂單數(含所有狀態與 kind)。

paidOrderCount
number

已付清 / 已完成的訂單數(payment_state in paid/overpaid 或 booking_state=completed)。

totalSpent
number

累計消費(上述已付清訂單的應收總額,TWD 整數)。

lastOrderAt
Date | null

最後一筆訂單建立時間(無訂單 → null)。

pdpaSignedAt
Date | null

最新版 PDPA 同意書簽署時間(未簽 → null)。

anonymizedAt
Date | null

PDPA 匿名化時間;非空 = 已匿名化。

orders
object[]

近期訂單列表(上限 50 筆,含 lodging)。

id
string

訂單 id。

orderNumber
string

人類可讀訂單編號。

status
string

金流模型 v2:deriveOrderDisplayStatus(booking/payment/refund) 派生的單一顯示狀態。

total
number

該會員所有訂單的應收總額(TWD 整數)。

createdAt
Date

訂單建立時間。

tripTitle
string

行程 / 產品標題。

consents
object[]

已簽署的同意書紀錄(上限 50 筆)。

id
string

簽署紀錄 id。

kind
string

同意書類型(pdpa / tour_agreement / cancellation_policy / refund_policy)。

version
number

簽署當下的範本版本號。

signedAt
Date

簽署時間。

ipAddress
string | null

簽署時來源 IP(未記錄 → null)。

範例
cairn members get <userId>
回應
{
  "ok": true,
  "data": {
    "profile": {
      "userId": "…",
      "email": "…",
      "name": "…",
      "createdAt": "2026-06-30T08:00:00.000Z",
      "phone": "…",
      "address": "…",
      "birthDate": "…",
      "orderCount": 0,
      "paidOrderCount": 0,
      "totalSpent": 0,
      "lastOrderAt": null,
      "pdpaSignedAt": null,
      "anonymizedAt": null
    },
    "orders": [
      {
        "id": "…",
        "orderNumber": "…",
        "status": "…",
        "total": 0,
        "createdAt": "2026-06-30T08:00:00.000Z",
        "tripTitle": "…"
      }
    ],
    "consents": [
      {
        "id": "…",
        "kind": "…",
        "version": 0,
        "signedAt": "2026-06-30T08:00:00.000Z",
        "ipAddress": "…"
      }
    ]
  }
}
cairn members stats

會員 KPI 統計

參數

--json
旗標 · 選填

回應欄位 · data

totalMembers
number

會員(顧客)總數(排除員工帳號)。

newThisMonth
number

本月新註冊會員數。

withOrders
number

有下過訂單的會員數。

averageOrders
number

平均訂單數(只計有訂單者,避免零訂單稀釋)。

範例
cairn members stats
回應
{
  "ok": true,
  "data": {
    "totalMembers": 0,
    "newThisMonth": 0,
    "withOrders": 0,
    "averageOrders": 0
  }
}
cairn members expiry-flags

標記護照即將到期的會員(給定 userId 批次)

參數

--ids
旗標 · 必填

以逗號分隔的會員使用者 ID 批次,上限 200 個,回傳其中護照即將到期者

--json
旗標 · 選填

回應欄位 · data

userIds
string[]

證件即將到期(或已過期)需提醒的會員 user id 清單。

範例
cairn members expiry-flags --ids
回應
{
  "ok": true,
  "data": {
    "userIds": [
      "…"
    ]
  }
}
cairn members anonymize

PDPA 匿名化會員(不可逆:抹除 PII + 封鎖登入 + 撤銷憑證)

參數

<userId>位置參數 · 必填
--reason
旗標 · 選填

匿名化原因,記入稽核紀錄備查

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

固定為 true:會員個資已匿名化(PDPA 刪除權)。

範例
cairn members anonymize <userId>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}

cairn orders

訂單:查詢、明細、統計

cairn orders list

列出/搜尋訂單

參數

--status
旗標 · 選填

依訂單顯示狀態篩選(如 pending、paid、cancelled)

--q
旗標 · 選填

關鍵字搜尋(訂單編號、訂購人姓名或 Email 等)

--date-from
旗標 · 選填

出發日期區間起(格式 YYYY-MM-DD,含當日)

--date-to
旗標 · 選填

出發日期區間迄(格式 YYYY-MM-DD,含當日)

--page
旗標 · 選填

頁碼,從 1 起算,預設第 1 頁

--json
旗標 · 選填

回應欄位 · data

rows
object[]

當前頁的訂單列(tour-centric,每筆 tour line 一列)。

id
string

訂單 id(前綴 `ord_`)。

orderNumber
string

人類可讀訂單編號(每租戶 sequence 產生,如 `20260707-0001`)。

bookingState
string

預訂狀態(真相軸):pending_payment → confirmed → completed;cancelled 為終態。

paymentState
string

付款狀態(派生自分類帳、快取於此供過濾):unpaid / partially_paid / deposit_paid / paid / overpaid。paid 只代表「應收被現金覆蓋」,不代表錢未退。

refundState
string

退款狀態(派生快取,只算會影響應收的已付退款):none / partially_refunded / refunded。

grossReceivableTwd
number

應收(TWD 整數,派生自應收分類帳)。

collectedTwd
number

收到現金(TWD 整數,派生)。

customerCashAppliedTwd
number

客戶現金淨套用(收款減已退現金,TWD 整數,派生)。

outstandingTwd
number

未收(應收減客戶現金淨套用,TWD 整數,派生)。

partySize
number

參團人數(tour 訂單)。

createdAt
Date

訂單建立時間。

notes
string | null

訂單備註(未填 → null)。

userId
string

下單客戶的 user id(同庫 user 表)。

userName
string

下單客戶顯示名。

userEmail
string

下單客戶 Email。

primaryTravelerName
string | null

主要旅客姓名(is_primary,未登記 → null)。

primaryTravelerPhone
string | null

主要旅客電話(未登記 → null)。

tripId
string

行程 id(tour 訂單經梯次反查;lodging 為空字串)。

tripTitle
string

行程 / 產品標題。

tripSlug
string

行程 slug。

departureId
string

梯次 id(tour 訂單;lodging 為空字串)。

departureDate
string

出發日 YYYY-MM-DD(lodging 為入住日)。

returnDate
string

回程日 YYYY-MM-DD(lodging 為退房日)。

assignedToUserId
string | null

派發給哪位業務的 user id(未派發 → null)。

assigneeName
string | null

承辦業務顯示名(未派發 / 查無 → null)。

assignmentStatus
string

派發狀態:unassigned / assigned / reassigned / pending_review。

assignedAt
Date | null

最近一次派發時間(未派發 → null)。

assignedByUserId
string | null

執行派發者的 user id(未派發 → null)。

createdByUserId
string | null

S5: who created the order. null / equal to `userId` = customer self-service (自助下單); a staff id ≠ userId = 業務代訂 / K單. Distinct from assignment — a self-service order can still be assigned to a sales rep.

pendingConsent
boolean

是否尚缺最新版 PDPA 同意書簽署(true = 待客戶重簽)。

roomingStatus
RoomingStatus

分房狀態:由訂單旅客的分房偏好與已分配房間派生。 'unregistered' | 'registered' | 'needs_single' | 'assigned'。

lotteryState
string | null

抽籤狀態(null = FCFS 非抽籤)。'applied'|'won'|'lost'。

failoverFromOrderId
string | null

備案單反查主單用:備案單的 failover_from_order_id 指向主單 id。

isOverdue
boolean

逾期旗標:存在 status='open' 且 due_at 已過的收款計畫(未收齊的到期款)。 供列表列以 `bg-destructive/5` 標紅提示。由 OVERDUE_SUBSELECT 一次算回。

total
number

符合篩選的訂單總數(DISTINCT 訂單,非列數)。

page
number

當前頁碼(從 1 起算)。

pageSize
number

每頁筆數。

對應端點GET /api/v1/orders
範例
cairn orders list
回應
{
  "ok": true,
  "data": {
    "rows": [
      {
        "id": "…",
        "orderNumber": "…",
        "bookingState": "…",
        "paymentState": "…",
        "refundState": "…",
        "grossReceivableTwd": 0,
        "collectedTwd": 0,
        "customerCashAppliedTwd": 0,
        "outstandingTwd": 0,
        "partySize": 0,
        "createdAt": "2026-06-30T08:00:00.000Z",
        "notes": "…",
        "userId": "…",
        "userName": "…",
        "userEmail": "…",
        "primaryTravelerName": "…",
        "primaryTravelerPhone": "…",
        "tripId": "…",
        "tripTitle": "…",
        "tripSlug": "…",
        "departureId": "…",
        "departureDate": "…",
        "returnDate": "…",
        "assignedToUserId": "…",
        "assigneeName": "…",
        "assignmentStatus": "…",
        "assignedAt": null,
        "assignedByUserId": "…",
        "createdByUserId": "…",
        "pendingConsent": true,
        "roomingStatus": "…",
        "lotteryState": "…",
        "failoverFromOrderId": "…",
        "isOverdue": true
      }
    ],
    "total": 0,
    "page": 0,
    "pageSize": 0
  }
}
cairn orders get

單一訂單完整明細

參數

<id>位置參數 · 必填
--json
旗標 · 選填

回應欄位 · data

id
string

訂單 id(前綴 `ord_`)。

orderNumber
string

人類可讀訂單編號(每租戶 sequence 產生,如 `20260707-0001`)。

bookingState
string

預訂狀態(真相軸):pending_payment → confirmed → completed;cancelled 為終態。

paymentState
string

付款狀態(派生自分類帳、快取於此供過濾):unpaid / partially_paid / deposit_paid / paid / overpaid。paid 只代表「應收被現金覆蓋」,不代表錢未退。

refundState
string

退款狀態(派生快取,只算會影響應收的已付退款):none / partially_refunded / refunded。

grossReceivableTwd
number

應收(TWD 整數,派生自應收分類帳)。

collectedTwd
number

收到現金(TWD 整數,派生)。

customerCashAppliedTwd
number

客戶現金淨套用(收款減已退現金,TWD 整數,派生)。

outstandingTwd
number

未收(應收減客戶現金淨套用,TWD 整數,派生)。

partySize
number

參團人數(tour 訂單)。

createdAt
Date

訂單建立時間。

notes
string | null

訂單備註(未填 → null)。

userId
string

下單客戶的 user id(同庫 user 表)。

userName
string

下單客戶顯示名。

userEmail
string

下單客戶 Email。

primaryTravelerName
string | null

主要旅客姓名(is_primary,未登記 → null)。

primaryTravelerPhone
string | null

主要旅客電話(未登記 → null)。

tripId
string

行程 id(tour 訂單經梯次反查;lodging 為空字串)。

tripTitle
string

行程 / 產品標題。

tripSlug
string

行程 slug。

departureId
string

梯次 id(tour 訂單;lodging 為空字串)。

departureDate
string

出發日 YYYY-MM-DD(lodging 為入住日)。

returnDate
string

回程日 YYYY-MM-DD(lodging 為退房日)。

assignedToUserId
string | null

派發給哪位業務的 user id(未派發 → null)。

assigneeName
string | null

承辦業務顯示名(未派發 / 查無 → null)。

assignmentStatus
string

派發狀態:unassigned / assigned / reassigned / pending_review。

assignedAt
Date | null

最近一次派發時間(未派發 → null)。

assignedByUserId
string | null

執行派發者的 user id(未派發 → null)。

createdByUserId
string | null

S5: who created the order. null / equal to `userId` = customer self-service (自助下單); a staff id ≠ userId = 業務代訂 / K單. Distinct from assignment — a self-service order can still be assigned to a sales rep.

pendingConsent
boolean

是否尚缺最新版 PDPA 同意書簽署(true = 待客戶重簽)。

roomingStatus
RoomingStatus

分房狀態:由訂單旅客的分房偏好與已分配房間派生。 'unregistered' | 'registered' | 'needs_single' | 'assigned'。

lotteryState
string | null

抽籤狀態(null = FCFS 非抽籤)。'applied'|'won'|'lost'。

failoverFromOrderId
string | null

備案單反查主單用:備案單的 failover_from_order_id 指向主單 id。

isOverdue
boolean

逾期旗標:存在 status='open' 且 due_at 已過的收款計畫(未收齊的到期款)。 供列表列以 `bg-destructive/5` 標紅提示。由 OVERDUE_SUBSELECT 一次算回。

kind
"lodging" | "tour"

訂單種類(kind-agnostic 外殼)。'tour' 用既有 tour 區塊(梯次/分房/登山審核); 'lodging' 隱藏 tour-only 區、改顯示住宿 header(見 `lodging`)。共用的金流/旅客/ 派發/同意書區塊兩者皆 order-scoped 通用。

lodging
AdminLodgingHeader | null

lodging 住宿 header(房型/住期/房數/人數);tour 為 null。

travelers
object[]

旅客名單(含 PII 遮罩欄;主要旅客排前)。

id
string

旅客 id(前綴 `trv_`)。

fullName
string

旅客姓名。

idNumberMask
string | null

遮罩碼(jsonb→mask,零解密);NULL = 未填。全碼走 reveal action(Task 7)。

passportNoMask
string | null

護照號碼遮罩碼(零解密);NULL = 未填。全碼走 order-scoped reveal。

birthDate
string | null

生日 YYYY-MM-DD(未填 → null)。

phone
string | null

聯絡電話(未填 → null)。

email
string | null

聯絡 Email(未填 → null)。

emergencyContactName
string | null

緊急聯絡人姓名(未填 → null)。

emergencyContactPhone
string | null

緊急聯絡人電話(未填 → null)。

isPrimary
boolean

是否為主要旅客(訂單聯絡人)。

gender
string | null

性別(分房硬約束 + 顯示):'male'|'female'|'other'|null。明文。

roomPreference
string | null

分房房型偏好(下單登記)。

roommatePref
string | null

指定房友 / 特殊需求自由文字。

diet
string | null

飲食需求(葷素)明文;null = 未填。非 PII,不走 reveal。

medicalNotes
string | null

醫療 / 過敏 / 病史備註明文;null = 未填。非 PII,不走 reveal。

address
string | null

通訊地址(未填 → null)。

roomLabel
string | null

團控已排房號的房間 label(null = 待團控分房)。

chargeLines
object[]

應收分類帳(itemized)。

id
string

應收明細列 id。

type
string

應收類型:base(原始價)/ room_upgrade(房升補款)/ adjustment / failover_deposit_credit 等。

amountTwd
number

金額(TWD 整數,signed;credit / 沖銷為負)。

description
string

明細說明文字。

sourceType
string

來源:system(系統派生)/ manual(人工登錄)等。

reversesChargeLineId
string | null

若為沖銷列,指向被沖銷的應收明細列 id(否則 null)。

createdAt
Date

建立時間。

transactions
object[]

現金分類帳。

id
string

現金交易列 id。

direction
string

金流方向:in(收款)/ out(退款、扣款、沖銷)。

type
string

交易類型:payment / refund / chargeback / reversal。

amountTwd
number

交易金額(TWD 整數,正值)。

feeTwd
number

金流商手續費(TWD 整數)。

netTwd
number

淨額 = amount − fee(TWD 整數)。

provider
string

金流商:manual / ecpay / test 等。

providerTradeNo
string | null

金流商交易序號(manual 入帳可能為 null)。

refundId
string | null

若屬退款,指向 refunds 列 id(否則 null)。

occurredAt
Date

交易發生時間。

schedules
object[]

收款計畫(current + historical)。

id
string

收款計畫列 id。

purpose
string

用途:full(全額)/ deposit(訂金)/ balance(尾款)/ adjustment(補款)。

targetAmountTwd
number

應收目標金額(TWD 整數)。

status
string

計畫狀態:open(未收齊)/ satisfied(已收齊)。

dueAt
Date | null

到期日(null = 未設)。

sequence
number

排序序號(deposit → balance → adjustment)。

範例
cairn orders get <id>
回應
{
  "ok": true,
  "data": {
    "id": "…",
    "orderNumber": "…",
    "bookingState": "…",
    "paymentState": "…",
    "refundState": "…",
    "grossReceivableTwd": 0,
    "collectedTwd": 0,
    "customerCashAppliedTwd": 0,
    "outstandingTwd": 0,
    "partySize": 0,
    "createdAt": "2026-06-30T08:00:00.000Z",
    "notes": "…",
    "userId": "…",
    "userName": "…",
    "userEmail": "…",
    "primaryTravelerName": "…",
    "primaryTravelerPhone": "…",
    "tripId": "…",
    "tripTitle": "…",
    "tripSlug": "…",
    "departureId": "…",
    "departureDate": "…",
    "returnDate": "…",
    "assignedToUserId": "…",
    "assigneeName": "…",
    "assignmentStatus": "…",
    "assignedAt": null,
    "assignedByUserId": "…",
    "createdByUserId": "…",
    "pendingConsent": true,
    "roomingStatus": "…",
    "lotteryState": "…",
    "failoverFromOrderId": "…",
    "isOverdue": true,
    "kind": "lodging",
    "lodging": null,
    "travelers": [
      {
        "id": "…",
        "fullName": "…",
        "idNumberMask": "…",
        "passportNoMask": "…",
        "birthDate": "…",
        "phone": "…",
        "email": "…",
        "emergencyContactName": "…",
        "emergencyContactPhone": "…",
        "isPrimary": true,
        "gender": "…",
        "roomPreference": "…",
        "roommatePref": "…",
        "diet": "…",
        "medicalNotes": "…",
        "address": "…",
        "roomLabel": "…"
      }
    ],
    "chargeLines": [
      {
        "id": "…",
        "type": "…",
        "amountTwd": 0,
        "description": "…",
        "sourceType": "…",
        "reversesChargeLineId": "…",
        "createdAt": "2026-06-30T08:00:00.000Z"
      }
    ],
    "transactions": [
      {
        "id": "…",
        "direction": "…",
        "type": "…",
        "amountTwd": 0,
        "feeTwd": 0,
        "netTwd": 0,
        "provider": "…",
        "providerTradeNo": "…",
        "refundId": "…",
        "occurredAt": "2026-06-30T08:00:00.000Z"
      }
    ],
    "schedules": [
      {
        "id": "…",
        "purpose": "…",
        "targetAmountTwd": 0,
        "status": "…",
        "dueAt": null,
        "sequence": 0
      }
    ]
  }
}
cairn orders reveal

顯示旅客證號/護照全碼(owner-scope;寫 traveler.decrypt 稽核)

參數

<orderId>位置參數 · 必填
<travelerId>位置參數 · 必填
--field <idNumber|passportNo>
旗標 · 必填

欲顯示全碼的個資欄位:idNumber 身分證字號、passportNo 護照號碼

--json
旗標 · 選填

回應欄位 · data

field
"idNumber" | "passportNo"

本次解密的欄位:idNumber 身分證字號 / passportNo 護照號碼。

value
string | null

解密後的證件明碼;null = 該欄未填。每次呼叫都會寫入解密稽核紀錄。

範例
cairn orders reveal <orderId> <travelerId> --field <idNumber|passportNo>
回應
{
  "ok": true,
  "data": {
    "field": "idNumber",
    "value": "…"
  }
}
cairn orders create

代客 K 單(手動建立 tour 訂單;訂購人須為既有會員)

參數

--trip <id>
旗標 · 必填
--departure <id>
旗標 · 必填
--email <e>
旗標 · 必填
--party-size <n>
旗標 · 必填

報名人數,決定佔位數,須為 1 至 20 之間整數

--payment-method <cash|atm|manual>
旗標 · 必填

收款方式:cash 現金、atm 轉帳、manual 人工

--travelers <json>
旗標 · 必填

旅客名單,筆數須與報名人數一致

--customer-type
旗標 · 選填

客戶類型:direct 直客、agency 同業,預設直客

--payment-plan
旗標 · 選填

付款方案:full 全額、deposit 訂金,預設全額

--receiving-account
旗標 · 選填
--assignee
旗標 · 選填
--notes
旗標 · 選填

訂單備註

--confirm
對 production target 寫入時必帶

回應欄位 · data

orderId
string

新建立訂單的 ID(ord_ 前綴)。

orderNumber
string

訂單編號(租戶內流水序號,對外顯示用)。

範例
cairn orders create --trip <id> --departure <id> --email <e> --party-size <n> --payment-method <cash|atm|manual> --travelers <json>
回應
{
  "ok": true,
  "data": {
    "orderId": "…",
    "orderNumber": "…"
  }
}
cairn orders mark-paid

手動入帳標記訂單已付(idempotent)

參數

<id>位置參數 · 必填
--note
旗標 · 選填

對帳備註,記錄人工核款說明

--receiving-account
旗標 · 選填
--confirm
對 production target 寫入時必帶

回應欄位 · data

idempotent
boolean

true = 訂單原已為已付狀態,本次為冪等無變更。

範例
cairn orders mark-paid <id>
回應
{
  "ok": true,
  "data": {
    "idempotent": true
  }
}
cairn orders cancel

取消訂單(釋回席次,不自動退款)

參數

<id>位置參數 · 必填
--reason
旗標 · 選填

取消事由說明

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

固定為 true:訂單已取消(座位釋出、booking_state 轉 cancelled)。

範例
cairn orders cancel <id>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn orders adjust

掛帳:加收 / 折讓(append charge line + 重算金流)

參數

<id>位置參數 · 必填
--kind <surcharge|allowance>
旗標 · 必填

調整類型:surcharge 加收、allowance 減免

--amount <twd>
旗標 · 必填
--description <t>
旗標 · 必填

調整事由說明

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

固定為 true:訂單金額調整已套用。

範例
cairn orders adjust <id> --kind <surcharge|allowance> --amount <twd> --description <t>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn orders reverse

沖正既有應收項目(append reversal line)

參數

<id>位置參數 · 必填
--charge-line <id>
旗標 · 必填
--description <t>
旗標 · 必填

沖正事由說明

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

固定為 true:訂單已沖銷(沖回應收與已認列項)。

範例
cairn orders reverse <id> --charge-line <id> --description <t>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn orders refund-create

建立並送審客戶退款(draft→submitted)

參數

<orderId>位置參數 · 必填
--amount <twd>
旗標 · 必填
--reason <t>
旗標 · 必填

退款事由說明

--kind <receivable_reduction|overpayment_return>
旗標 · 必填
--execution-method
旗標 · 選填

退款執行方式:chargeback 原路退刷、remit 銀行匯款

--origin-account
旗標 · 選填
--admin-fee
旗標 · 選填
--remit-fee
旗標 · 選填
--payee-name
旗標 · 選填
--payee-bank
旗標 · 選填
--payee-account
旗標 · 選填
--confirm
對 production target 寫入時必帶

回應欄位 · data

id
string

退款單 id(前綴 `rfnd_`)。

refundNumber
string

人類可讀退款單號。

status
RefundStatus

退款工作流狀態:draft → submitted → approved → processing → paid。

範例
cairn orders refund-create <orderId> --amount <twd> --reason <t> --kind <receivable_reduction|overpayment_return>
回應
{
  "ok": true,
  "data": {
    "id": "…",
    "refundNumber": "…",
    "status": "…"
  }
}
cairn orders refund-approve

核准退款(責任分離:非建單人)

參數

<orderId>位置參數 · 必填
--refund <refundId>
旗標 · 必填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

固定為 true:退款申請已核准。

範例
cairn orders refund-approve <orderId> --refund <refundId>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn orders refund-reject

退件退款(submitted→cancelled)

參數

<orderId>位置參數 · 必填
--refund <refundId>
旗標 · 必填
--reason
旗標 · 選填

退件事由說明

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

固定為 true:退款申請已駁回。

範例
cairn orders refund-reject <orderId> --refund <refundId>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn orders refund-paid

標記退款已付(approved→paid,現金整合點)

參數

<orderId>位置參數 · 必填
--refund <refundId>
旗標 · 必填
--bank-ref
旗標 · 選填
--receiving-account
旗標 · 選填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

固定為 true:退款已標記為完成出款。

範例
cairn orders refund-paid <orderId> --refund <refundId>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn orders assign

指派訂單給承辦業務(首派;pending_review→assigned)

參數

<id>位置參數 · 必填
--assignee <userId>
旗標 · 必填
--reason
旗標 · 選填

派發事由說明(上限 500 字)

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

固定為 true:訂單已指派承辦。

idempotent
boolean

true = 該訂單原已指派給同一承辦,本次為冪等無變更。

範例
cairn orders assign <id> --assignee <userId>
回應
{
  "ok": true,
  "data": {
    "ok": true,
    "idempotent": true
  }
}
cairn orders reassign

重新指派已派發訂單(admin-only;→reassigned)

參數

<id>位置參數 · 必填
--assignee <userId>
旗標 · 必填
--reason
旗標 · 選填

重派事由說明(上限 500 字)

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

固定為 true:訂單已改派承辦。

idempotent
boolean

true = 目標承辦與原承辦相同,本次為冪等無變更。

範例
cairn orders reassign <id> --assignee <userId>
回應
{
  "ok": true,
  "data": {
    "ok": true,
    "idempotent": true
  }
}
cairn orders bulk-assign

批次把多張訂單派給同一位業務(all-or-nothing)

參數

--assignee <userId>
旗標 · 必填
--orders <id,id,...>
旗標 · 必填
--reason
旗標 · 選填

派發事由說明(上限 500 字)

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

固定為 true:批次指派已執行。

assignedCount
number

成功指派的訂單筆數。

skippedCount
number

略過的訂單筆數(如已指派或不在可指派範圍)。

範例
cairn orders bulk-assign --assignee <userId> --orders <id,id,...>
回應
{
  "ok": true,
  "data": {
    "ok": true,
    "assignedCount": 0,
    "skippedCount": 0
  }
}
cairn orders review-screening

人工核可/駁回登山資格審核(駁回不自動退單)

參數

<id>位置參數 · 必填
--decision <approve|reject>
旗標 · 必填

登山資格審核裁決:approve 核可、reject 駁回

--note
旗標 · 選填

審核註記說明(上限 500 字)

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

固定為 true:名單複核結果已登錄。

範例
cairn orders review-screening <id> --decision <approve|reject>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn orders traveler-add

新增旅客到訂單(owner-scope;出發前 7 天凍結)

參數

<orderId>位置參數 · 必填
--full-name <n>
旗標 · 必填

旅客全名,須與證件一致;新增旅客時必填,更新時可省略

--phone
旗標 · 選填

旅客聯絡電話

--email
旗標 · 選填

旅客電子郵件

--birth-date
旗標 · 選填

旅客出生日期(格式 YYYY-MM-DD)

--gender
旗標 · 選填

旅客性別:male 男、female 女、other 其他

--id-number
旗標 · 選填

身分證字號,屬個資將加密保存

--passport
旗標 · 選填
--room-pref
旗標 · 選填
--roommate-pref
旗標 · 選填

指定同住室友(用於分房作業)

--emergency-name
旗標 · 選填
--emergency-phone
旗標 · 選填
--address
旗標 · 選填

旅客通訊地址

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

固定為 true:旅客已新增至訂單。

travelerId
string

新建立旅客的 ID(trv_ 前綴)。

範例
cairn orders traveler-add <orderId> --full-name <n>
回應
{
  "ok": true,
  "data": {
    "ok": true,
    "travelerId": "…"
  }
}
cairn orders traveler-update

更新旅客資料(owner-scope;出發前 7 天凍結)

參數

<orderId>位置參數 · 必填
<travelerId>位置參數 · 必填
--full-name
旗標 · 選填

旅客全名,須與證件一致;新增旅客時必填,更新時可省略

--phone
旗標 · 選填

旅客聯絡電話

--email
旗標 · 選填

旅客電子郵件

--birth-date
旗標 · 選填

旅客出生日期(格式 YYYY-MM-DD)

--gender
旗標 · 選填

旅客性別:male 男、female 女、other 其他

--id-number
旗標 · 選填

身分證字號,屬個資將加密保存

--passport
旗標 · 選填
--room-pref
旗標 · 選填
--roommate-pref
旗標 · 選填

指定同住室友(用於分房作業)

--emergency-name
旗標 · 選填
--emergency-phone
旗標 · 選填
--address
旗標 · 選填

旅客通訊地址

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

固定為 true:旅客資料已更新。

範例
cairn orders traveler-update <orderId> <travelerId>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn orders traveler-remove

移除旅客(owner-scope;至少保留一位、不可移主要聯絡人)

參數

<orderId>位置參數 · 必填
<travelerId>位置參數 · 必填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

固定為 true:旅客已自訂單移除。

範例
cairn orders traveler-remove <orderId> <travelerId>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn orders rooming-pref

更新旅客分房需求(房型偏好/指定室友;owner-scope)

參數

<orderId>位置參數 · 必填
<travelerId>位置參數 · 必填
--room-pref
旗標 · 選填
--roommate-pref
旗標 · 選填

指定同住室友(用於分房作業)

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

固定為 true:旅客分房設定已更新。

範例
cairn orders rooming-pref <orderId> <travelerId>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn orders stats

訂單 KPI 統計

參數

--json
旗標 · 選填

回應欄位 · data

pendingPayment
number

待付款訂單數(未取消 / 未完成 / 未退款且 payment_state=unpaid)。

depositPaid
number

已付訂金訂單數(payment_state=deposit_paid)。

paid
number

已收齊訂單數(payment_state in paid/overpaid)。

cancelled
number

已取消訂單數(booking_state=cancelled)。

refunded
number

有退款的訂單數(refund_state in refunded/partially_refunded)。

completed
number

已完成訂單數(booking_state=completed)。

thisMonthPaidTwd
number

本月實收現金(payment_transactions direction=in 加總,TWD 整數)。

thisMonthNewOrders
number

本月新建訂單數。

thisMonthCancelled
number

本月取消訂單數。

範例
cairn orders stats
回應
{
  "ok": true,
  "data": {
    "pendingPayment": 0,
    "depositPaid": 0,
    "paid": 0,
    "cancelled": 0,
    "refunded": 0,
    "completed": 0,
    "thisMonthPaidTwd": 0,
    "thisMonthNewOrders": 0,
    "thisMonthCancelled": 0
  }
}
cairn orders export

匯出訂單為 CSV/JSON(同 list 篩選 + owner-scope;取全頁)

參數

--status
旗標 · 選填

依訂單顯示狀態篩選(如 pending、paid、cancelled)

--date-from
旗標 · 選填

出發日期區間起(格式 YYYY-MM-DD,含當日)

--date-to
旗標 · 選填

出發日期區間迄(格式 YYYY-MM-DD,含當日)

--q
旗標 · 選填

關鍵字搜尋(訂單編號、訂購人姓名或 Email 等)

--assignment
旗標 · 選填

依派發狀態篩選(如 unassigned、assigned)

--rooming
旗標 · 選填

依分房狀態篩選

--agency-id
旗標 · 選填

依合作旅行社 ID 篩選(同業單)

--format
旗標 · 選填
--json
旗標 · 選填

回應欄位 · data

rows
object[]

符合篩選條件的所有列(逐頁累積;達安全上限時截斷)。

id
string

訂單 id(前綴 `ord_`)。

orderNumber
string

人類可讀訂單編號(每租戶 sequence 產生,如 `20260707-0001`)。

bookingState
string

預訂狀態(真相軸):pending_payment → confirmed → completed;cancelled 為終態。

paymentState
string

付款狀態(派生自分類帳、快取於此供過濾):unpaid / partially_paid / deposit_paid / paid / overpaid。paid 只代表「應收被現金覆蓋」,不代表錢未退。

refundState
string

退款狀態(派生快取,只算會影響應收的已付退款):none / partially_refunded / refunded。

grossReceivableTwd
number

應收(TWD 整數,派生自應收分類帳)。

collectedTwd
number

收到現金(TWD 整數,派生)。

customerCashAppliedTwd
number

客戶現金淨套用(收款減已退現金,TWD 整數,派生)。

outstandingTwd
number

未收(應收減客戶現金淨套用,TWD 整數,派生)。

partySize
number

參團人數(tour 訂單)。

createdAt
Date

訂單建立時間。

notes
string | null

訂單備註(未填 → null)。

userId
string

下單客戶的 user id(同庫 user 表)。

userName
string

下單客戶顯示名。

userEmail
string

下單客戶 Email。

primaryTravelerName
string | null

主要旅客姓名(is_primary,未登記 → null)。

primaryTravelerPhone
string | null

主要旅客電話(未登記 → null)。

tripId
string

行程 id(tour 訂單經梯次反查;lodging 為空字串)。

tripTitle
string

行程 / 產品標題。

tripSlug
string

行程 slug。

departureId
string

梯次 id(tour 訂單;lodging 為空字串)。

departureDate
string

出發日 YYYY-MM-DD(lodging 為入住日)。

returnDate
string

回程日 YYYY-MM-DD(lodging 為退房日)。

assignedToUserId
string | null

派發給哪位業務的 user id(未派發 → null)。

assigneeName
string | null

承辦業務顯示名(未派發 / 查無 → null)。

assignmentStatus
string

派發狀態:unassigned / assigned / reassigned / pending_review。

assignedAt
Date | null

最近一次派發時間(未派發 → null)。

assignedByUserId
string | null

執行派發者的 user id(未派發 → null)。

createdByUserId
string | null

S5: who created the order. null / equal to `userId` = customer self-service (自助下單); a staff id ≠ userId = 業務代訂 / K單. Distinct from assignment — a self-service order can still be assigned to a sales rep.

pendingConsent
boolean

是否尚缺最新版 PDPA 同意書簽署(true = 待客戶重簽)。

roomingStatus
RoomingStatus

分房狀態:由訂單旅客的分房偏好與已分配房間派生。 'unregistered' | 'registered' | 'needs_single' | 'assigned'。

lotteryState
string | null

抽籤狀態(null = FCFS 非抽籤)。'applied'|'won'|'lost'。

failoverFromOrderId
string | null

備案單反查主單用:備案單的 failover_from_order_id 指向主單 id。

isOverdue
boolean

逾期旗標:存在 status='open' 且 due_at 已過的收款計畫(未收齊的到期款)。 供列表列以 `bg-destructive/5` 標紅提示。由 OVERDUE_SUBSELECT 一次算回。

total
number

符合篩選條件的總筆數。

truncated
boolean

是否因達安全上限而截斷(true 表未回傳完整結果,呼叫端應提示)。

範例
cairn orders export
回應
{
  "ok": true,
  "data": {
    "rows": [
      {
        "id": "…",
        "orderNumber": "…",
        "bookingState": "…",
        "paymentState": "…",
        "refundState": "…",
        "grossReceivableTwd": 0,
        "collectedTwd": 0,
        "customerCashAppliedTwd": 0,
        "outstandingTwd": 0,
        "partySize": 0,
        "createdAt": "2026-06-30T08:00:00.000Z",
        "notes": "…",
        "userId": "…",
        "userName": "…",
        "userEmail": "…",
        "primaryTravelerName": "…",
        "primaryTravelerPhone": "…",
        "tripId": "…",
        "tripTitle": "…",
        "tripSlug": "…",
        "departureId": "…",
        "departureDate": "…",
        "returnDate": "…",
        "assignedToUserId": "…",
        "assigneeName": "…",
        "assignmentStatus": "…",
        "assignedAt": null,
        "assignedByUserId": "…",
        "createdByUserId": "…",
        "pendingConsent": true,
        "roomingStatus": "…",
        "lotteryState": "…",
        "failoverFromOrderId": "…",
        "isOverdue": true
      }
    ],
    "total": 0,
    "truncated": true
  }
}

cairn control

團控:梯次列表、名單、驗證、分房、財務、報表

cairn control departures

近期梯次主列表(團控面板)

參數

--range
旗標 · 選填

時間視窗:future_60(未來 60 天)/ this_month(本月)/ next_month(下個月),預設不限

--trip
旗標 · 選填

行程 ID,只看該行程的梯次

--status
旗標 · 選填

梯次狀態篩選(如 open / closed)

--attention
旗標 · 選填

設為 true 時只回傳付款或同意書有異常、需要關注的梯次

--json
旗標 · 選填

回應欄位 · data[]

id
string

梯次 id。

tripId
string

所屬行程 id。

tripTitle
string

行程名稱。

tripSlug
string

行程公開頁網址代稱(slug)。

groupCode
string | null

團號(可空)。

departureDate
string

出發日(YYYY-MM-DD)。

returnDate
string

回程日(YYYY-MM-DD)。

capacity
number

團位容量(總名額)。

bookedCount
number

已佔位人數。

status
string

梯次狀態(如 open 開放/closed 關閉)。

allocationMode
"fcfs" | "lottery"

佔位模式:fcfs 先到先得/lottery 抽籤。

leaderNames
string[]

已排領隊姓名(confirmed + tentative 皆列;空 = 未指派)。

assistantNames
string[]

已排協作 / 助教姓名(空 = 未指派協作)。

priceTwd
number

定價(TWD)。

agencyPriceTwd
number | null

同業/旅行社報價(TWD;未設為 null)。

promoActive
boolean

是否有進行中的促銷價。

promoPriceTwd
number | null

促銷價(TWD;無促銷為 null)。

promoAgencyPriceTwd
number | null

同業促銷價(TWD;無促銷為 null)。

daysUntilDeparture
number

距出發天數(負值表示已出發)。

travelerCount
number

旅客總人數(未取消訂單的 party_size 加總)。

paidCount
number

已付款人數(party_size 加總)。

pendingCount
number

未結清人數(未付/部分付/已付訂金;不含取消)。

cancelledCount
number

已取消人數(僅供參考,不計入總數)。

ordersWithoutConsent
number

尚未簽署同意書(PDPA)的訂單數。

codedRevenueTwd
number

有折扣訂單的應收營收合計(TWD;排除取消/退款)。

discountTotalTwd
number

折扣金額合計(TWD)。

profitShareTotalTwd
number

利潤分潤金額合計(TWD)。

範例
cairn control departures
回應
{
  "ok": true,
  "data": [
    {
      "id": "…",
      "tripId": "…",
      "tripTitle": "…",
      "tripSlug": "…",
      "groupCode": "…",
      "departureDate": "…",
      "returnDate": "…",
      "capacity": 0,
      "bookedCount": 0,
      "status": "…",
      "allocationMode": "fcfs",
      "leaderNames": [
        "…"
      ],
      "assistantNames": [
        "…"
      ],
      "priceTwd": 0,
      "agencyPriceTwd": 0,
      "promoActive": true,
      "promoPriceTwd": 0,
      "promoAgencyPriceTwd": 0,
      "daysUntilDeparture": 0,
      "travelerCount": 0,
      "paidCount": 0,
      "pendingCount": 0,
      "cancelledCount": 0,
      "ordersWithoutConsent": 0,
      "codedRevenueTwd": 0,
      "discountTotalTwd": 0,
      "profitShareTotalTwd": 0
    }
  ]
}
cairn control manifest

梯次旅客名單

參數

<depId>位置參數 · 必填
--json
旗標 · 選填

回應欄位 · data[]

orderId
string

所屬訂單 id。

orderNumber
string

所屬訂單編號。

travelerName
string

旅客姓名。

phone
string

聯絡電話。

email
string

聯絡 Email。

isPrimary
boolean

是否為該訂單的主要聯絡人(訂購人)。

gender
"male" | "female" | "other" | null

性別(明文 enum-like):'male'|'female'|'other'|null(未填)。

birthDate
string | null

生日 ISO `YYYY-MM-DD`;null = 未填。

diet
string | null

飲食需求(葷素)明文;null = 未填。

medicalNotes
string | null

醫療 / 過敏 / 病史備註明文;null = 未填。

specialNeeds
string | null

「飲食 · 特殊需求」欄的合併顯示字串(diet + medical_notes,以 ` · ` 併接)。 結構化欄落地後改吃 diet / medical_notes(不再湊 roommate_pref —— 分房需求回歸分房面板)。 兩者皆空 → null。

emergencyContactName
string | null

緊急聯絡人姓名;null = 未填。

emergencyContactPhone
string | null

緊急聯絡人電話;null = 未填。

consentPending
boolean

該訂單是否仍缺最新版 PDPA 同意書(per-order,同訂單所有旅客共享此旗標)。 true = 未簽 / 只簽過舊版;與 dashboard KPI、催簽 badge 同一述詞。

orderStatus
string

Single display status (派生自三軸,與 deriveOrderDisplayStatus 同 precedence)。

amount
number

該訂單應收金額(TWD;自 order_charge_lines 派生)。

範例
cairn control manifest <depId>
回應
{
  "ok": true,
  "data": [
    {
      "orderId": "…",
      "orderNumber": "…",
      "travelerName": "…",
      "phone": "…",
      "email": "…",
      "isPrimary": true,
      "gender": "male",
      "birthDate": "…",
      "diet": "…",
      "medicalNotes": "…",
      "specialNeeds": "…",
      "emergencyContactName": "…",
      "emergencyContactPhone": "…",
      "consentPending": true,
      "orderStatus": "…",
      "amount": 0
    }
  ]
}
cairn control validation

梯次旅客資料驗證摘要

參數

<depId>位置參數 · 必填
--json
旗標 · 選填

回應欄位 · data[]

orderId
string

訂單 id。

orderNumber
string

訂單編號。

errorCount
number

該訂單的 error(必補缺漏)項目數。

warningCount
number

該訂單的 warning(建議補齊)項目數。

incompleteTravelerCount
number

至少有一項 error 或 warning 的旅客數(資料待補人數)。

errorTravelerCount
number

含 error 的旅客數(出團前置紅標用)。

範例
cairn control validation <depId>
回應
{
  "ok": true,
  "data": [
    {
      "orderId": "…",
      "orderNumber": "…",
      "errorCount": 0,
      "warningCount": 0,
      "incompleteTravelerCount": 0,
      "errorTravelerCount": 0
    }
  ]
}
cairn control lottery-orders

梯次抽籤訂單清單

參數

<depId>位置參數 · 必填
--json
旗標 · 選填

回應欄位 · data[]

orderId
string

訂單 id。

orderNumber
string

訂單編號。

customerName
string

訂購人姓名。

partySize
number

佔位人數。

lotteryState
"applied" | "won" | "lost"

抽籤狀態:applied 已應募/won 中籤/lost 未中籤。

backupChoiceCount
number

客人自選的有序備案筆數(order_backup_choices;0 = 無備案)。

collectedTwd
number

已收現金(payment_transactions direction='in');抽籤未中安置時的訂金結轉基準。

failoverFromOrderId
string | null

落腳譜系:本單若是由某主單 force-place / cascade 落腳而成立的備案單,指向原主單 id。 null = 本單即主單(非備案落腳單)。供線控從備案列回溯主單。

awaitingPlacement
boolean

true when lottery_state='lost' and still active (not cancelled). Means backup cascade exhausted — awaiting manual placement or explicit cancel.

範例
cairn control lottery-orders <depId>
回應
{
  "ok": true,
  "data": [
    {
      "orderId": "…",
      "orderNumber": "…",
      "customerName": "…",
      "partySize": 0,
      "lotteryState": "applied",
      "backupChoiceCount": 0,
      "collectedTwd": 0,
      "failoverFromOrderId": "…",
      "awaitingPlacement": true
    }
  ]
}
cairn control rooms

梯次分房檢視

參數

<depId>位置參數 · 必填
--json
旗標 · 選填

回應欄位 · data

departure
object

梯次表頭(id/起訖日/行程名/容量等)。

id
string

梯次 id(dep_ 前綴)。

departureDate
string

出發日(ISO 'YYYY-MM-DD')。

returnDate
string

回程日(ISO 'YYYY-MM-DD')。

tripTitle
string

所屬行程標題。

tripSlug
string

所屬行程網址 slug。

capacity
number

名額上限(人數)。

bookedCount
number

已成團佔用名額(人數)。

rooms
object[]

此梯次的所有房間(含入住旅客)。

id
string

房間 id。

roomLabel
string

房號/房間標籤。

roomType
string

房型(如 single 單人/double 雙人/dorm 通舖)。

bedCount
number

床位數。

bedConfig
string | null

床位配置說明(可空)。

accommodationName
string | null

住宿名稱(梯次配套派生房才有;可空)。

accommodationDate
string | null

住宿日期(YYYY-MM-DD;可空)。

baseCostTwd
number

房間底價成本(TWD)。

upgradeFeeTwd
number

房型升等補款(TWD)。

notes
string | null

備註(可空)。

departureLodgingId
string | null

null = 手動建立的房;non-null = 梯次配套自動派生房的來源 ID。

assignedTravelers
object[]

已入住此房的旅客。

unassignedTravelers
object[]

尚未分房的旅客清單。

id
string

旅客 id。

fullName
string

旅客姓名。

orderId
string

所屬訂單 id。

orderNumber
string

所屬訂單編號。

isPrimary
boolean

是否為該訂單的主要聯絡人(訂購人)。

gender
string | null

性別:'male'|'female'|'other'|null。

birthDate選填
string | undefined

出生日期(YYYY-MM-DD;可空)。

roomPreference
string | null

下單登記的房型偏好(auto-pair 起點提示)。

roommatePref
string | null

指定房友 id / 特殊需求自由文字。

stats
object

分房統計彙總(總人數/已分房數/房間數/升等補款合計)。

totalTravelers
number

此梯次旅客總人數。

assignedCount
number

已分配房間的旅客數。

roomCount
number

房間數。

totalUpgradeFee
number

升等補款合計(TWD 整數)。

範例
cairn control rooms <depId>
回應
{
  "ok": true,
  "data": {
    "departure": {
      "id": "…",
      "departureDate": "…",
      "returnDate": "…",
      "tripTitle": "…",
      "tripSlug": "…",
      "capacity": 0,
      "bookedCount": 0
    },
    "rooms": [
      {
        "id": "…",
        "roomLabel": "…",
        "roomType": "…",
        "bedCount": 0,
        "bedConfig": "…",
        "accommodationName": "…",
        "accommodationDate": "…",
        "baseCostTwd": 0,
        "upgradeFeeTwd": 0,
        "notes": "…",
        "departureLodgingId": "…",
        "assignedTravelers": []
      }
    ],
    "unassignedTravelers": [
      {
        "id": "…",
        "fullName": "…",
        "orderId": "…",
        "orderNumber": "…",
        "isPrimary": true,
        "gender": "…",
        "birthDate": "…",
        "roomPreference": "…",
        "roommatePref": "…"
      }
    ],
    "stats": {
      "totalTravelers": 0,
      "assignedCount": 0,
      "roomCount": 0,
      "totalUpgradeFee": 0
    }
  }
}
cairn control room-stats

多梯次分房進度統計

參數

<depId>位置參數 · 必填
--json
旗標 · 選填
範例
cairn control room-stats <depId>
回應
{
  "ok": true,
  "data": {}
}
cairn control finance

梯次財務摘要(唯讀)

參數

<depId>位置參數 · 必填
--json
旗標 · 選填

回應欄位 · data

header
object

梯次表頭(團號/行程名/出發日等基本資訊)。

id
string

梯次 id(dep_ 前綴)。

tripTitle
string

所屬行程標題。

tripSlug
string

所屬行程網址 slug。

departureDate
string

出發日(ISO 'YYYY-MM-DD')。

returnDate
string

回程日(ISO 'YYYY-MM-DD')。

finance
object

應收/已收金額彙整(TWD)。

receivableTwd
number

梯次應收:tour 訂單 order_charge_lines 聚合(排除已取消單)。

collectedTwd
number

實收:tour 訂單 payment_transactions(direction='in')。

cashReturnedTwd
number

客戶現金退回(refund/chargeback/reversal)。

outstandingTwd
number

待收 = 應收 − (實收 − 退回),floor 0。

costTwd
number

成本:departure_costs 真實額(房費另計,見成本登記簿)。

costBilledTwd
number

已轉請款成本。

costUnbilledTwd
number

未轉請款成本。

anomalyOrderCount
number

異常單數:overpaid / partially_refunded / refund pending 的 tour 訂單。

cost
object

成本彙整(各類直接成本合計,TWD)。

totalTwd
number

內帳真實成本合計(TWD 整數,各成本列金額加總)。

billedTwd
number

已轉請款的成本合計(TWD 整數)。

unbilledTwd
number

尚未轉請款的成本合計(TWD 整數)。

declarableTwd
number

外帳可申報金額合計(TWD 整數,各列憑證金額加總)。

nonDeclarableTwd
number

無憑證的不可申報成本合計(TWD 整數,逐列取 金額−憑證 的正值,不可跨列抵減)。

count
number

成本列筆數。

範例
cairn control finance <depId>
回應
{
  "ok": true,
  "data": {
    "header": {
      "id": "…",
      "tripTitle": "…",
      "tripSlug": "…",
      "departureDate": "…",
      "returnDate": "…"
    },
    "finance": {
      "receivableTwd": 0,
      "collectedTwd": 0,
      "cashReturnedTwd": 0,
      "outstandingTwd": 0,
      "costTwd": 0,
      "costBilledTwd": 0,
      "costUnbilledTwd": 0,
      "anomalyOrderCount": 0
    },
    "cost": {
      "totalTwd": 0,
      "billedTwd": 0,
      "unbilledTwd": 0,
      "declarableTwd": 0,
      "nonDeclarableTwd": 0,
      "count": 0
    }
  }
}
cairn control template-costs

梯次成本範本列

參數

<depId>位置參數 · 必填
--json
旗標 · 選填

回應欄位 · data[]

id
string

梯次成本列 ID。

category
string

成本分類(如 交通 / 餐費 / 保險)。

vendorName
string | null

供應商 / 廠商名(可空)。

description
string | null

摘要說明(可空)。

amountTwd
number

內帳成本金額(TWD;數量 × 單價派生)。

invoiceAmountTwd
number

報帳/發票金額(TWD;is_declarable=true 時同步 amount,否則 0)。

isDeclarable
boolean

是否有合法憑證可報帳(開發票)。

quantityMode
QuantityMode | null

數量模式:fixed 固定值 / headcount 依人頭公式(ceil(Σ人頭 / 組距))。

headcountComponents
HeadcountComponent[] | null

headcount 模式選定的人頭 component(passenger / leader / assistant / driver);fixed 為 null。

groupDivisor
number | null

headcount 模式的組距(每 N 人一組,ceil 進位);null = 直接加總。

quantity
number | null

實際套用的數量(依 quantityMode 派生)。

unitPriceTwd
number | null

內帳單價(TWD;外幣列可為 null)。

currency
string

幣別('TWD' = 台幣列)。

unitPriceForeign
number | null

外幣單價;TWD 列 null。

foreignAmount
number | null

外幣金額快照 = unit_price_foreign × quantity;TWD 列 null。

internalRate
string | null

內帳匯率快照(numeric 字串);TWD 列 null。

externalRate
string | null

外帳匯率快照(numeric 字串);TWD 列 null。

isManualOverride
boolean

是否為線控手動改寫(true 時重算會跳過此列,不覆蓋手改值)。

payableId
string | null

已轉請款 → 鎖定(不可手改 / 重算)。

範例
cairn control template-costs <depId>
回應
{
  "ok": true,
  "data": [
    {
      "id": "…",
      "category": "…",
      "vendorName": "…",
      "description": "…",
      "amountTwd": 0,
      "invoiceAmountTwd": 0,
      "isDeclarable": true,
      "quantityMode": null,
      "headcountComponents": null,
      "groupDivisor": 0,
      "quantity": 0,
      "unitPriceTwd": 0,
      "currency": "…",
      "unitPriceForeign": 0,
      "foreignAmount": 0,
      "internalRate": "…",
      "externalRate": "…",
      "isManualOverride": true,
      "payableId": "…"
    }
  ]
}
cairn control manifest-export

梯次旅客名單匯出(csv|json)

參數

<depId>位置參數 · 必填
--format
旗標 · 選填
--json
旗標 · 選填

回應欄位 · data[]

orderId
string

所屬訂單 id。

orderNumber
string

所屬訂單編號。

travelerName
string

旅客姓名。

phone
string

聯絡電話。

email
string

聯絡 Email。

isPrimary
boolean

是否為該訂單的主要聯絡人(訂購人)。

gender
"male" | "female" | "other" | null

性別(明文 enum-like):'male'|'female'|'other'|null(未填)。

birthDate
string | null

生日 ISO `YYYY-MM-DD`;null = 未填。

diet
string | null

飲食需求(葷素)明文;null = 未填。

medicalNotes
string | null

醫療 / 過敏 / 病史備註明文;null = 未填。

specialNeeds
string | null

「飲食 · 特殊需求」欄的合併顯示字串(diet + medical_notes,以 ` · ` 併接)。 結構化欄落地後改吃 diet / medical_notes(不再湊 roommate_pref —— 分房需求回歸分房面板)。 兩者皆空 → null。

emergencyContactName
string | null

緊急聯絡人姓名;null = 未填。

emergencyContactPhone
string | null

緊急聯絡人電話;null = 未填。

consentPending
boolean

該訂單是否仍缺最新版 PDPA 同意書(per-order,同訂單所有旅客共享此旗標)。 true = 未簽 / 只簽過舊版;與 dashboard KPI、催簽 badge 同一述詞。

orderStatus
string

Single display status (派生自三軸,與 deriveOrderDisplayStatus 同 precedence)。

amount
number

該訂單應收金額(TWD;自 order_charge_lines 派生)。

範例
cairn control manifest-export <depId>
回應
{
  "ok": true,
  "data": [
    {
      "orderId": "…",
      "orderNumber": "…",
      "travelerName": "…",
      "phone": "…",
      "email": "…",
      "isPrimary": true,
      "gender": "male",
      "birthDate": "…",
      "diet": "…",
      "medicalNotes": "…",
      "specialNeeds": "…",
      "emergencyContactName": "…",
      "emergencyContactPhone": "…",
      "consentPending": true,
      "orderStatus": "…",
      "amount": 0
    }
  ]
}
cairn control rooming-export

分房表匯出(csv|json)

參數

<depId>位置參數 · 必填
--format
旗標 · 選填
--json
旗標 · 選填

回應欄位 · data[]

fullName
string

旅客姓名。

gender
string

性別(中文標籤:男/女/其他)。

roomLabel
string

房號/房間標籤(未排房為「未分房」)。

bedInfo
string

床位資訊(房型中文標籤 + 床位)。

roommates
string

同房其他旅客姓名(依房號分組派生)。

specialRequest
string

特殊需求(房友偏好等自由文字)。

contactSummary
string

聯絡摘要(電話已遮罩,只露末 3 碼)。

範例
cairn control rooming-export <depId>
回應
{
  "ok": true,
  "data": [
    {
      "fullName": "…",
      "gender": "…",
      "roomLabel": "…",
      "bedInfo": "…",
      "roommates": "…",
      "specialRequest": "…",
      "contactSummary": "…"
    }
  ]
}
cairn control cost-add

登記梯次成本(現場作業)

參數

<depId>位置參數 · 必填
--category <c>
旗標 · 必填

成本科目類別,決定歸入哪個分類帳

--amount <twd>
旗標 · 必填
--vendor
旗標 · 選填
--desc
旗標 · 選填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

建立成功旗標,恆為 true。

id
string

新建立的梯次成本列 id。

範例
cairn control cost-add <depId> --category <c> --amount <twd>
回應
{
  "ok": true,
  "data": {
    "ok": true,
    "id": "…"
  }
}
cairn control cost-update

編輯梯次成本(會計)

參數

<depId>位置參數 · 必填
--cost <costId>
旗標 · 必填
--category <c>
旗標 · 必填

成本科目類別,決定歸入哪個分類帳

--amount <twd>
旗標 · 必填
--vendor
旗標 · 選填
--desc
旗標 · 選填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

更新成功旗標,恆為 true。

範例
cairn control cost-update <depId> --cost <costId> --category <c> --amount <twd>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn control cost-rm

刪除梯次成本(會計)

參數

<depId>位置參數 · 必填
--cost <costId>
旗標 · 必填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

刪除成功旗標,恆為 true。

範例
cairn control cost-rm <depId> --cost <costId>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn control template-apply

套用行程綁定範本到本梯次(冪等)

參數

<depId>位置參數 · 必填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

套用成功旗標,恆為 true。

inserted
number

本次新補插入的範本成本行數(冪等,已存在的不重複插)。

範例
cairn control template-apply <depId>
回應
{
  "ok": true,
  "data": {
    "ok": true,
    "inserted": 0
  }
}
cairn control template-override

手改某範本成本列金額(停自動重算)

參數

<depId>位置參數 · 必填
--id <costId>
旗標 · 必填

範本成本列 ID

--amount <twd>
旗標 · 必填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

手改金額成功旗標,恆為 true。

範例
cairn control template-override <depId> --id <costId> --amount <twd>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn control template-clear-override

重設範本成本列為範本算法(清手改鎖)

參數

<depId>位置參數 · 必填
--id <costId>
旗標 · 必填

範本成本列 ID

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

清除手改鎖並重算成功旗標,恆為 true。

範例
cairn control template-clear-override <depId> --id <costId>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn control cost-to-payable

成本轉請款(建立 payable)

參數

<depId>位置參數 · 必填
--cost-ids <a,b>
旗標 · 必填

要轉成請款單的成本列 ID 清單,至少一筆

--payee-type <supplier|guide|staff_commission|other>
旗標 · 必填

受款人類型:supplier(供應商)/ guide(領隊)/ staff_commission(員工佣金)/ other(其他)

--payee-name <n>
旗標 · 必填

受款人姓名/戶名(必填)

--bank-account
旗標 · 選填
--bank-name
旗標 · 選填
--tax-id
旗標 · 選填
--submit
旗標 · 選填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

轉請款成功旗標,恆為 true。

payableId
string

新建立的出款單(payable)id。

payableNumber
string

出款單編號。

範例
cairn control cost-to-payable <depId> --cost-ids <a,b> --payee-type <supplier|guide|staff_commission|other> --payee-name <n>
回應
{
  "ok": true,
  "data": {
    "ok": true,
    "payableId": "…",
    "payableNumber": "…"
  }
}
cairn control room-add

建立梯次房間

參數

<depId>位置參數 · 必填
--label <l>
旗標 · 必填
--type <t>
旗標 · 必填
--beds <n>
旗標 · 必填
--base-cost
旗標 · 選填
--upgrade-fee
旗標 · 選填
--notes
旗標 · 選填

房間備註

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

建立成功旗標,恆為 true。

id
string

新建立的房間 id。

範例
cairn control room-add <depId> --label <l> --type <t> --beds <n>
回應
{
  "ok": true,
  "data": {
    "ok": true,
    "id": "…"
  }
}
cairn control room-update

編輯房間

參數

<depId>位置參數 · 必填
--room <roomId>
旗標 · 必填
--label
旗標 · 選填
--type
旗標 · 選填
--beds
旗標 · 選填
--notes
旗標 · 選填

房間備註;給 null 清空、未給則不變

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

更新成功旗標,恆為 true。

範例
cairn control room-update <depId> --room <roomId>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn control room-rm

刪除房間

參數

<depId>位置參數 · 必填
--room <roomId>
旗標 · 必填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

刪除成功旗標,恆為 true。

範例
cairn control room-rm <depId> --room <roomId>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn control room-assign

指派旅客進房

參數

--room <roomId>
旗標 · 必填
--traveler <travelerId>
旗標 · 必填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

指派入房成功旗標,恆為 true。

範例
cairn control room-assign --room <roomId> --traveler <travelerId>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn control room-unassign

把旅客移出房間

參數

--traveler <travelerId>
旗標 · 必填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

移出房間成功旗標,恆為 true。

範例
cairn control room-unassign --traveler <travelerId>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn control room-auto-pair-preview

auto-pair 建議分組預覽(純讀取;供 apply 取 travelerIds)

參數

<depId>位置參數 · 必填
--json
旗標 · 選填

回應欄位 · data

suggestion
object

auto-pair 引擎產出的分房建議(未寫入,供線控確認)。

groups
object[]

建議的分房組合(每組一間房,含旅客與需確認註記)。

unmatched
object[]

無法安全自動配對、待人工處理的旅客。

names
object

travelerId → 顯示名(建議分組渲染用)。

範例
cairn control room-auto-pair-preview <depId>
回應
{
  "ok": true,
  "data": {
    "suggestion": {
      "groups": [],
      "unmatched": []
    },
    "names": "…"
  }
}
cairn control room-auto-pair-apply

套用 auto-pair 建議分組(單一交易建房+整組指派)

參數

<depId>位置參數 · 必填
--travelers <a,b,c>
旗標 · 必填
--type
旗標 · 選填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

套用成功旗標,恆為 true。

roomId
string

建議分組寫入後所在的房間 id。

travelerIds
string[]

被排入該房的旅客 id 清單。

範例
cairn control room-auto-pair-apply <depId> --travelers <a,b,c>
回應
{
  "ok": true,
  "data": {
    "ok": true,
    "roomId": "…",
    "travelerIds": [
      "…"
    ]
  }
}
cairn control lottery-resolve

抽籤手動裁決(won|lost)

參數

<orderId>位置參數 · 必填
--outcome <won|lost>
旗標 · 必填

抽籤裁決結果:won 中籤確認、lost 未中籤(啟動備案或取消)

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

固定為 true:抽籤結果已登錄。

outcome
"won" | "lost"

抽籤結果:won 中籤 / lost 未中籤。

範例
cairn control lottery-resolve <orderId> --outcome <won|lost>
回應
{
  "ok": true,
  "data": {
    "ok": true,
    "outcome": "won"
  }
}
cairn control lottery-set-mode

設定梯次分配模式(fcfs|lottery)

參數

<depId>位置參數 · 必填
--mode <fcfs|lottery>
旗標 · 必填

分配模式:fcfs(先到先得)或 lottery(抽籤)

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

更新成功旗標,恆為 true。

departureId
string

被更新的梯次 id。

mode
"fcfs" | "lottery"

更新後的佔位模式:fcfs 先到先得/lottery 抽籤。

範例
cairn control lottery-set-mode <depId> --mode <fcfs|lottery>
回應
{
  "ok": true,
  "data": {
    "ok": true,
    "departureId": "…",
    "mode": "fcfs"
  }
}
cairn control prep-checklist

設定行前總檢查項勾選

參數

<depId>位置參數 · 必填
--item <key>
旗標 · 必填
--checked <true|false>
旗標 · 必填

該檢查項目是否已完成勾選

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

設定成功旗標,恆為 true。

id
string

行前檢查項紀錄 id。

範例
cairn control prep-checklist <depId> --item <key> --checked <true|false>
回應
{
  "ok": true,
  "data": {
    "ok": true,
    "id": "…"
  }
}
cairn control prep-document

upsert 證件追蹤狀態

參數

<depId>位置參數 · 必填
--type <docType>
旗標 · 必填
--apply-status
旗標 · 選填

申辦狀態:todo(待辦)/ applying(申請中)/ approved(已核准)

--file-ready
旗標 · 選填

文件檔案是否已備妥

--note
旗標 · 選填

備註;給 null 清空

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

upsert 成功旗標,恆為 true。

id
string

證件追蹤紀錄 id。

範例
cairn control prep-document <depId> --type <docType>
回應
{
  "ok": true,
  "data": {
    "ok": true,
    "id": "…"
  }
}
cairn control prep-deadlines

設定梯次期限警戒(登山專屬;全量取代,空值=清除)

參數

<depId>位置參數 · 必填
--permit-apply
旗標 · 選填

入山申請截止日(ISO 日期);傳空字串或省略則清除此期限

--permit-download
旗標 · 選填

入山證下載截止日(ISO 日期);傳空字串或省略則清除此期限

--climbing-insurance
旗標 · 選填

登山險送保截止日(ISO 日期);傳空字串或省略則清除此期限

--liability-insurance
旗標 · 選填

旅責險送保截止日(ISO 日期);傳空字串或省略則清除此期限

--confirm
對 production target 寫入時必帶

回應欄位 · data

permitApply
string | null

入山申請截止日(ISO 日期;null = 未設 / 已清除)。

permitDownload
string | null

入山證下載截止日(ISO 日期;null = 未設 / 已清除)。

climbingInsurance
string | null

登山險送保截止日(ISO 日期;null = 未設 / 已清除)。

liabilityInsurance
string | null

旅責險送保截止日(ISO 日期;null = 未設 / 已清除)。

ok
boolean

設定成功旗標,恆為 true。

departureId
string

被設定期限的梯次 id。

範例
cairn control prep-deadlines <depId>
回應
{
  "ok": true,
  "data": {
    "permitApply": "…",
    "permitDownload": "…",
    "climbingInsurance": "…",
    "liabilityInsurance": "…",
    "ok": true,
    "departureId": "…"
  }
}
cairn control prep-equipment-need

upsert 裝備需求數

參數

<depId>位置參數 · 必填
--item <equipmentItemId>
旗標 · 必填
--qty <n>
旗標 · 必填
--note
旗標 · 選填

需求備註;給 null 清空

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

upsert 成功旗標,恆為 true。

id
string

裝備需求紀錄 id。

範例
cairn control prep-equipment-need <depId> --item <equipmentItemId> --qty <n>
回應
{
  "ok": true,
  "data": {
    "ok": true,
    "id": "…"
  }
}
cairn control prep-equipment-need-rm

刪除裝備需求列

參數

<depId>位置參數 · 必填
--id <needId>
旗標 · 必填

裝備需求列 ID

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

刪除成功旗標,恆為 true。

範例
cairn control prep-equipment-need-rm <depId> --id <needId>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn control prep-guide-assign

指派領隊到梯次

參數

<depId>位置參數 · 必填
--guide <guideId>
旗標 · 必填
--role <leader|assistant>
旗標 · 必填

指派角色:leader(領隊)或 assistant(隨隊/助理)

--status
旗標 · 選填

指派狀態:tentative(暫定)或 confirmed(已確認)

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

指派成功旗標,恆為 true。

id
string

領隊指派紀錄 id。

範例
cairn control prep-guide-assign <depId> --guide <guideId> --role <leader|assistant>
回應
{
  "ok": true,
  "data": {
    "ok": true,
    "id": "…"
  }
}
cairn control prep-rental

從裝備需求開租借單(含金流接入)

參數

<depId>位置參數 · 必填
--order <orderId>
旗標 · 必填
--lines <itemId:qty,itemId:qty>
旗標 · 必填

租借品項明細(品項 + 數量),數量需大於 0 才計入

--renter
旗標 · 選填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

開單成功旗標,恆為 true。

rentalId
string

新開立的裝備租借單 id。

範例
cairn control prep-rental <depId> --order <orderId> --lines <itemId:qty,itemId:qty>
回應
{
  "ok": true,
  "data": {
    "ok": true,
    "rentalId": "…"
  }
}
cairn control prep-insurance-add

新增投保紀錄

參數

<depId>位置參數 · 必填
--kind <k>
旗標 · 必填

保險種類(如登山險、旅責險)

--insurer
旗標 · 選填

保險公司名稱

--policy-no
旗標 · 選填

保單號碼

--status
旗標 · 選填

投保狀態,預設 pending

--note
旗標 · 選填

備註;給 null 清空

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

建立成功旗標,恆為 true。

id
string

新建立的投保紀錄 id。

範例
cairn control prep-insurance-add <depId> --kind <k>
回應
{
  "ok": true,
  "data": {
    "ok": true,
    "id": "…"
  }
}
cairn control prep-insurance-update

更新投保紀錄

參數

<depId>位置參數 · 必填
--id <insId>
旗標 · 必填

投保紀錄 ID

--insurer
旗標 · 選填

保險公司名稱

--policy-no
旗標 · 選填

保單號碼

--status
旗標 · 選填

投保狀態

--note
旗標 · 選填

備註;給 null 清空

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

更新成功旗標,恆為 true。

範例
cairn control prep-insurance-update <depId> --id <insId>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn control prep-insurance-rm

刪除投保紀錄

參數

<depId>位置參數 · 必填
--id <insId>
旗標 · 必填

投保紀錄 ID

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

刪除成功旗標,恆為 true。

範例
cairn control prep-insurance-rm <depId> --id <insId>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn control prep-transport-add

新增派車紀錄

參數

<depId>位置參數 · 必填
--desc
旗標 · 選填
--driver
旗標 · 選填
--vehicle
旗標 · 選填
--fare-note
旗標 · 選填

車資備註

--status
旗標 · 選填

派車狀態,預設 pending

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

建立成功旗標,恆為 true。

id
string

新建立的派車紀錄 id。

範例
cairn control prep-transport-add <depId>
回應
{
  "ok": true,
  "data": {
    "ok": true,
    "id": "…"
  }
}
cairn control prep-transport-update

更新派車紀錄

參數

<depId>位置參數 · 必填
--id <tId>
旗標 · 必填

派車紀錄 ID

--desc
旗標 · 選填
--driver
旗標 · 選填
--vehicle
旗標 · 選填
--fare-note
旗標 · 選填

車資備註

--status
旗標 · 選填

派車狀態

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

更新成功旗標,恆為 true。

範例
cairn control prep-transport-update <depId> --id <tId>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn control prep-transport-rm

刪除派車紀錄

參數

<depId>位置參數 · 必填
--id <tId>
旗標 · 必填

派車紀錄 ID

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

刪除成功旗標,恆為 true。

範例
cairn control prep-transport-rm <depId> --id <tId>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn control prep-catering-add

新增餐食紀錄

參數

<depId>位置參數 · 必填
--supplier
旗標 · 選填

餐食供應商名稱

--meal-plan
旗標 · 選填

餐食安排說明(如餐數、菜色)

--headcount-note
旗標 · 選填

人數備註(如素食、特殊餐需求)

--status
旗標 · 選填

餐食安排狀態,預設 pending

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

建立成功旗標,恆為 true。

id
string

新建立的餐食紀錄 id。

範例
cairn control prep-catering-add <depId>
回應
{
  "ok": true,
  "data": {
    "ok": true,
    "id": "…"
  }
}
cairn control prep-catering-update

更新餐食紀錄

參數

<depId>位置參數 · 必填
--id <cId>
旗標 · 必填

餐食紀錄 ID

--supplier
旗標 · 選填

餐食供應商名稱

--meal-plan
旗標 · 選填

餐食安排說明(如餐數、菜色)

--headcount-note
旗標 · 選填

人數備註(如素食、特殊餐需求)

--status
旗標 · 選填

餐食安排狀態

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

更新成功旗標,恆為 true。

範例
cairn control prep-catering-update <depId> --id <cId>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn control prep-catering-rm

刪除餐食紀錄

參數

<depId>位置參數 · 必填
--id <cId>
旗標 · 必填

餐食紀錄 ID

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

刪除成功旗標,恆為 true。

範例
cairn control prep-catering-rm <depId> --id <cId>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}

cairn equipment

裝備租借:品項主檔、租借單查詢

cairn equipment items

裝備品項主檔:list / get / create / update

參數

<id>位置參數 · 必填
--active-only
旗標 · 選填
--name <n>
旗標 · 選填
--total
旗標 · 選填
--rent-price
旗標 · 選填
--active
旗標 · 選填
範例
cairn equipment items <id>
cairn equipment rentals

租借單:list / get / order-options / create / return / mark-overdue

參數

<id>位置參數 · 必填
<rentalId>位置參數 · 必填
--return-state
旗標 · 選填
--recon-state
旗標 · 選填
--order-id <id>
旗標 · 選填
--limit
旗標 · 選填
--line <itemId>
旗標 · 必填
--damage-cost
旗標 · 選填
範例
cairn equipment rentals <id> <rentalId> --line <itemId>

cairn guide-roster

帶團排班:名冊載量、月梯次、檔期衝突

cairn guide-roster guides

名冊 + 該月帶團載量

參數

--month <YYYY-MM>
旗標 · 必填

查詢月份(YYYY-MM 格式)

--include-inactive
旗標 · 選填

是否一併列出已停用的嚮導(預設不列出)

--json
旗標 · 選填

回應欄位 · data[]

id
string

嚮導 id。

name
string

嚮導姓名。

rosterRole
"leader" | "assistant" | "both"

名冊職能:leader 領隊/assistant 隨隊助理/both 皆可。

specialties
string[]

可帶路線 / 專長;未設為空陣列。

status
string

嚮導狀態:active 啟用/inactive 停用。

maxDaysPerMonth
number | null

單月可帶上限(天);NULL = 不限。

monthDays
number

本月 confirmed 指派的帶團天數彙總。

monthTrips
number

本月 confirmed 帶團梯次數。

hasTentative
boolean

本月是否含 tentative(預塞)指派。

availability
Availability

派生載量狀態。

範例
cairn guide-roster guides --month <YYYY-MM>
回應
{
  "ok": true,
  "data": [
    {
      "id": "…",
      "name": "…",
      "rosterRole": "leader",
      "specialties": [
        "…"
      ],
      "status": "…",
      "maxDaysPerMonth": 0,
      "monthDays": 0,
      "monthTrips": 0,
      "hasTentative": true,
      "availability": "…"
    }
  ]
}
cairn guide-roster departures

該月梯次 + 已排指派

參數

--month <YYYY-MM>
旗標 · 必填

查詢月份(YYYY-MM 格式)

--include-cancelled
旗標 · 選填

是否一併納入已取消的梯次(預設不納入)

--json
旗標 · 選填

回應欄位 · data[]

id
string

梯次 id。

tripId
string

所屬行程 id。

tripTitle
string

行程名稱。

departureDate
string

出發日(YYYY-MM-DD)。

returnDate
string

回程日(YYYY-MM-DD)。

days
number

帶團天數(含頭尾)。

capacity
number

團位容量(總名額)。

bookedCount
number

已成團報名人數。

status
string

梯次狀態(如 open 開放/full 已滿/cancelled 已取消)。

assignments
object[]

該梯次所有指派(領隊在前)。

id
string

指派紀錄 id。

guideId
string

被指派的嚮導 id。

guideName
string

被指派的嚮導姓名。

role
"leader" | "assistant"

指派角色:leader 領隊/assistant 隨隊助理。

status
"tentative" | "confirmed"

指派狀態:tentative 預塞暫定/confirmed 正式確認。

範例
cairn guide-roster departures --month <YYYY-MM>
回應
{
  "ok": true,
  "data": [
    {
      "id": "…",
      "tripId": "…",
      "tripTitle": "…",
      "departureDate": "…",
      "returnDate": "…",
      "days": 0,
      "capacity": 0,
      "bookedCount": 0,
      "status": "…",
      "assignments": [
        {
          "id": "…",
          "guideId": "…",
          "guideName": "…",
          "role": "leader",
          "status": "tentative"
        }
      ]
    }
  ]
}
cairn guide-roster conflicts

該月檔期衝突偵測

參數

--month <YYYY-MM>
旗標 · 必填

查詢月份(YYYY-MM 格式)

--json
旗標 · 選填

回應欄位 · data[]

guideId
string

發生衝突的嚮導 id。

guideName
string

發生衝突的嚮導姓名。

a
object

衝突梯次之一(含梯次 id/行程名/起訖日)。

departureId
string

梯次 id。

tripTitle
string

行程名稱。

departureDate
string

出發日(YYYY-MM-DD)。

returnDate
string

回程日(YYYY-MM-DD)。

b
object

與 a 日期重疊的另一梯次(含梯次 id/行程名/起訖日)。

departureId
string

梯次 id。

tripTitle
string

行程名稱。

departureDate
string

出發日(YYYY-MM-DD)。

returnDate
string

回程日(YYYY-MM-DD)。

範例
cairn guide-roster conflicts --month <YYYY-MM>
回應
{
  "ok": true,
  "data": [
    {
      "guideId": "…",
      "guideName": "…",
      "a": {
        "departureId": "…",
        "tripTitle": "…",
        "departureDate": "…",
        "returnDate": "…"
      },
      "b": {
        "departureId": "…",
        "tripTitle": "…",
        "departureDate": "…",
        "returnDate": "…"
      }
    }
  ]
}
cairn guide-roster check-conflict

撞期預檢(指定梯次×領隊)

參數

--departure <id>
旗標 · 必填
--guide <id>
旗標 · 必填
--json
旗標 · 選填
範例
cairn guide-roster check-conflict --departure <id> --guide <id>
回應
{
  "ok": true,
  "data": null
}
cairn guide-roster assign

指派 / 重派領隊到梯次(upsert)

參數

--departure <id>
旗標 · 必填
--guide <id>
旗標 · 必填
--role <leader|assistant>
旗標 · 必填

指派角色(leader 領隊/assistant 隨隊助理)

--status <tentative|confirmed>
旗標 · 必填

指派狀態(tentative 預塞暫定/confirmed 正式確認)

--confirm
對 production target 寫入時必帶

回應欄位 · data

id
string

新建立(或重派後)的指派紀錄 id。

範例
cairn guide-roster assign --departure <id> --guide <id> --role <leader|assistant> --status <tentative|confirmed>
回應
{
  "ok": true,
  "data": {
    "id": "…"
  }
}
cairn guide-roster confirm

正式確認某筆指派

參數

<assignmentId>位置參數 · 必填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

確認成功旗標,恆為 true。

範例
cairn guide-roster confirm <assignmentId>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn guide-roster remove

移除某筆指派

參數

<assignmentId>位置參數 · 必填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

移除成功旗標,恆為 true。

範例
cairn guide-roster remove <assignmentId>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn guide-roster change-leader

換領隊(升任新領隊為 confirmed leader)

參數

--departure <id>
旗標 · 必填
--to <guideId>
旗標 · 必填
--reason <t>
旗標 · 必填

換領隊的原因(必填,記入稽核)

--from <guideId>
旗標 · 選填
--confirm
對 production target 寫入時必帶

回應欄位 · data

id
string

新任領隊的指派紀錄 id。

removedGuideIds
string[]

被移除的舊領隊嚮導 id 清單(DB 權威)。

範例
cairn guide-roster change-leader --departure <id> --to <guideId> --reason <t>
回應
{
  "ok": true,
  "data": {
    "id": "…",
    "removedGuideIds": [
      "…"
    ]
  }
}

cairn guides

嚮導:查詢、明細

cairn guides list

列出/搜尋嚮導

參數

--status
旗標 · 選填

嚮導狀態篩選(all 全部/active 啟用/inactive 停用)

--q
旗標 · 選填

關鍵字搜尋(比對嚮導姓名等欄位)

--page
旗標 · 選填

頁碼(從 1 起算)

--page-size
旗標 · 選填

每頁筆數(上限 200)

--json
旗標 · 選填
對應端點GET /api/v1/guides
範例
cairn guides list
回應
{
  "ok": true,
  "data": "…"
}
cairn guides get

單一嚮導明細(依 id 或 --slug)

參數

<id>位置參數 · 必填
--slug <slug>
旗標 · 必填

公開頁網址代稱(小寫英數與連字號;省略則不更動)

--json
旗標 · 選填
對應端點/api/v1/guides/:param/api/v1/guides
範例
cairn guides get <id> --slug <slug>
cairn guides create

建立嚮導(建檔)

參數

--name <name>
旗標 · 必填

嚮導/領隊姓名

--slug
旗標 · 選填

依嚮導公開頁網址代稱(slug)精確查單筆(選填)

--bio
旗標 · 選填

嚮導簡介/經歷(選填)

--avatar-url
旗標 · 選填

大頭照圖片網址(選填,http/https)

--specialties
旗標 · 選填

專長領域(選填,以逗號分隔多項)

--years-experience
旗標 · 選填

帶團年資(年數,0~80;選填)

--contact-phone
旗標 · 選填

聯絡電話(選填)

--contact-email
旗標 · 選填

聯絡 Email(選填)

--status
旗標 · 選填

嚮導狀態篩選(all 全部/active 啟用/inactive 停用)

--confirm
對 production target 寫入時必帶

回應欄位 · data

id
string

新建立的嚮導 id。

slug
string

嚮導公開頁網址代稱(未帶則系統自動產生)。

範例
cairn guides create --name <name>
回應
{
  "ok": true,
  "data": {
    "id": "…",
    "slug": "…"
  }
}
cairn guides update

更新嚮導(建檔編輯;只送有帶的欄位)

參數

<id>位置參數 · 必填
--name
旗標 · 選填

嚮導/領隊姓名(省略則不更動)

--slug
旗標 · 選填

公開頁網址代稱(小寫英數與連字號;省略則不更動)

--bio
旗標 · 選填

嚮導簡介/經歷(省略則不更動)

--avatar-url
旗標 · 選填

大頭照圖片網址(http/https;省略則不更動)

--specialties
旗標 · 選填

專長領域(以逗號分隔多項;省略則不更動)

--years-experience
旗標 · 選填

帶團年資(年數,0~80;省略則不更動)

--contact-phone
旗標 · 選填

聯絡電話(省略則不更動)

--contact-email
旗標 · 選填

聯絡 Email(省略則不更動)

--status
旗標 · 選填

嚮導狀態(active 啟用/inactive 停用;省略則不更動)

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

更新成功旗標,恆為 true。

範例
cairn guides update <id>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn guides archive

封存嚮導(status→inactive;重啟用請用 guides update --status active)

參數

<id>位置參數 · 必填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

封存成功旗標,恆為 true。

範例
cairn guides archive <id>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn guides invite-account

開通嚮導 portal 登入帳號(回傳一次性暫時密碼,僅此一次)

參數

<id>位置參數 · 必填
--email <e>
旗標 · 必填

嚮導 portal 登入帳號的 Email

--name <n>
旗標 · 必填

嚮導帳號的顯示姓名

--confirm
對 production target 寫入時必帶
--json
旗標 · 選填

回應欄位 · data

tempPassword
string

一次性明文暫時密碼(僅此次回傳,請立即轉交嚮導並要求首次登入改密)。

email
string

已開通登入帳號的 Email。

範例
cairn guides invite-account <id> --email <e> --name <n>
回應
{
  "ok": true,
  "data": {
    "tempPassword": "…",
    "email": "…"
  }
}

cairn journal

嚮導手記:查詢、明細、作者選項

cairn journal list

列出/搜尋手記

參數

--status
旗標 · 選填

依狀態篩選:all 全部、draft 草稿、published 已發佈、archived 已封存

--q
旗標 · 選填

關鍵字搜尋(標題/內容)

--page
旗標 · 選填

頁碼(從 1 起)

--page-size
旗標 · 選填

每頁筆數(上限 200)

--json
旗標 · 選填

回應欄位 · data

rows
object[]

本頁的手記文章列表。

id
string

手記文章 id(journalPost_ 前綴)。

slug
string

文章公開頁網址代稱(slug)。

title
string

文章標題。

excerpt
string | null

摘要(列表/SEO 用;可空)。

coverImageUrl
string | null

封面圖網址(可空)。

contentMdx
string

內文原始 MDX 內容。

authorGuideId
`guide_${string}` | null

作者嚮導 id(未指定作者時 null)。

seoTitle
string | null

SEO 標題(覆寫 <title>;可空)。

seoDescription
string | null

SEO 描述(meta description;可空)。

ogImageUrl
string | null

Open Graph 分享圖網址(可空)。

status
JournalStatus

文章狀態:draft 草稿/published 已發佈/archived 已封存。

publishedAt
Date | null

首次發佈時間(尚未發佈為 null)。

createdAt
Date

建檔時間。

updatedAt
Date

最後更新時間。

total
number

符合條件的文章總數(跨頁)。

page
number

目前頁碼(從 1 起)。

pageSize
number

每頁筆數。

範例
cairn journal list
回應
{
  "ok": true,
  "data": {
    "rows": [
      {
        "id": "…",
        "slug": "…",
        "title": "…",
        "excerpt": "…",
        "coverImageUrl": "…",
        "contentMdx": "…",
        "authorGuideId": "…",
        "seoTitle": "…",
        "seoDescription": "…",
        "ogImageUrl": "…",
        "status": "…",
        "publishedAt": null,
        "createdAt": "2026-06-30T08:00:00.000Z",
        "updatedAt": "2026-06-30T08:00:00.000Z"
      }
    ],
    "total": 0,
    "page": 0,
    "pageSize": 0
  }
}
cairn journal get

單一手記完整明細

參數

<id>位置參數 · 必填
--json
旗標 · 選填

回應欄位 · data

id
string

手記文章 id(journalPost_ 前綴)。

slug
string

文章公開頁網址代稱(slug)。

title
string

文章標題。

excerpt
string | null

摘要(列表/SEO 用;可空)。

coverImageUrl
string | null

封面圖網址(可空)。

contentMdx
string

內文原始 MDX 內容。

authorGuideId
`guide_${string}` | null

作者嚮導 id(未指定作者時 null)。

seoTitle
string | null

SEO 標題(覆寫 <title>;可空)。

seoDescription
string | null

SEO 描述(meta description;可空)。

ogImageUrl
string | null

Open Graph 分享圖網址(可空)。

status
JournalStatus

文章狀態:draft 草稿/published 已發佈/archived 已封存。

publishedAt
Date | null

首次發佈時間(尚未發佈為 null)。

createdAt
Date

建檔時間。

updatedAt
Date

最後更新時間。

範例
cairn journal get <id>
回應
{
  "ok": true,
  "data": {
    "id": "…",
    "slug": "…",
    "title": "…",
    "excerpt": "…",
    "coverImageUrl": "…",
    "contentMdx": "…",
    "authorGuideId": "…",
    "seoTitle": "…",
    "seoDescription": "…",
    "ogImageUrl": "…",
    "status": "…",
    "publishedAt": null,
    "createdAt": "2026-06-30T08:00:00.000Z",
    "updatedAt": "2026-06-30T08:00:00.000Z"
  }
}
cairn journal authors

可選作者(active 嚮導)清單

參數

--json
旗標 · 選填

回應欄位 · data[]

value
string

作者嚮導 id(作為選項值)。

label
string

顯示用的嚮導姓名。

範例
cairn journal authors
回應
{
  "ok": true,
  "data": [
    {
      "value": "…",
      "label": "…"
    }
  ]
}
cairn journal create

建立手記

參數

--title <t>
旗標 · 必填

手記標題,顯示於前台與後台列表

--content-mdx <md>
旗標 · 必填

內文(MDX 格式)

--slug <s>
旗標 · 選填

網址代稱(slug);僅小寫英數與連字號,省略時由系統依標題產生

--excerpt <e>
旗標 · 選填

摘要,列表與分享預覽用;null 清除

--cover-image-url <url>
旗標 · 選填

封面圖網址(http/https);null 清除

--author-guide-id <id>
旗標 · 選填

作者嚮導 ID;null 表示無指定作者

--seo-title <t>
旗標 · 選填

SEO 標題,省略時用 title;null 清除

--seo-description <d>
旗標 · 選填

SEO 描述(meta description);null 清除

--og-image-url <url>
旗標 · 選填

Open Graph 分享圖網址(http/https);null 清除

--status
旗標 · 選填

依狀態篩選:all 全部、draft 草稿、published 已發佈、archived 已封存

--json
旗標 · 選填

回應欄位 · data

id
string

新建立的手記文章 id。

slug
string

文章公開頁網址代稱(slug)。

範例
cairn journal create --title <t> --content-mdx <md>
回應
{
  "ok": true,
  "data": {
    "id": "…",
    "slug": "…"
  }
}
cairn journal update

更新手記(整體取代,欄位比照建立)

參數

<id>位置參數 · 必填
--title <t>
旗標 · 必填

手記標題,顯示於前台與後台列表

--content-mdx <md>
旗標 · 必填

內文(MDX 格式)

--slug <s>
旗標 · 選填

網址代稱(slug);僅小寫英數與連字號,省略時由系統依標題產生

--excerpt <e>
旗標 · 選填

摘要,列表與分享預覽用;null 清除

--cover-image-url <url>
旗標 · 選填

封面圖網址(http/https);null 清除

--author-guide-id <id>
旗標 · 選填

作者嚮導 ID;null 表示無指定作者

--seo-title <t>
旗標 · 選填

SEO 標題,省略時用 title;null 清除

--seo-description <d>
旗標 · 選填

SEO 描述(meta description);null 清除

--og-image-url <url>
旗標 · 選填

Open Graph 分享圖網址(http/https);null 清除

--status
旗標 · 選填

發佈狀態:draft 草稿、published 已發佈、archived 已封存

--json
旗標 · 選填

回應欄位 · data

ok
boolean

更新成功旗標,恆為 true。

範例
cairn journal update <id> --title <t> --content-mdx <md>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn journal archive

封存手記

參數

<id>位置參數 · 必填
--json
旗標 · 選填

回應欄位 · data

ok
boolean

封存成功旗標,恆為 true。

範例
cairn journal archive <id>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}

cairn exchange-rates

牌告匯率:列出、解析

cairn exchange-rates list

列出牌告匯率(台銀 bot + manual 覆蓋)

參數

--currency
旗標 · 選填

幣別篩選(ISO 4217 三碼,如 JPY / USD);省略則回傳所有幣別

--month-from
旗標 · 選填

起始月份(YYYY-MM,含當月);省略則不設下界

--month-to
旗標 · 選填

結束月份(YYYY-MM,含當月);省略則不設上界

--json
旗標 · 選填

回應欄位 · data[]

id
string

匯率牌價列 ID。

rateDate
string

掛牌日期('YYYY-MM-DD',Asia/Taipei)。

currency
string

ISO 4217('JPY' / 'IDR' / 'USD'…)。

cashBuy
string | null

各報價 canonical「1 外幣 = ? 台幣」(numeric → 字串原值保精度;NULL = 該幣別無此報價)。

cashSell
string | null

現金賣出匯率「1 外幣 = ? 台幣」(字串保精度;null = 無此報價)。

spotBuy
string | null

即期買入匯率「1 外幣 = ? 台幣」(字串保精度;null = 無此報價)。

spotSell
string | null

即期賣出匯率「1 外幣 = ? 台幣」(字串保精度;null = 無此報價)。

source
ExchangeRateSource

牌價來源:bot 台銀自動抓取 / manual 租戶手動覆蓋。

createdAt
Date

建立時間。

updatedAt
Date

最後更新時間。

範例
cairn exchange-rates list
回應
{
  "ok": true,
  "data": [
    {
      "id": "…",
      "rateDate": "…",
      "currency": "…",
      "cashBuy": "…",
      "cashSell": "…",
      "spotBuy": "…",
      "spotSell": "…",
      "source": "…",
      "createdAt": "2026-06-30T08:00:00.000Z",
      "updatedAt": "2026-06-30T08:00:00.000Z"
    }
  ]
}
cairn exchange-rates resolve

解析某幣別某日報價(manual 優先 + carry-forward)

參數

--currency
旗標 · 必填

要換算的外幣幣別(ISO 4217 三碼,如 JPY / USD)

--date
旗標 · 必填

換算基準日期(YYYY-MM-DD),套用手動優先 + 往前承接的解析規則

--quote
旗標 · 選填

報價類型:cash_buy 現金買入、cash_sell 現金賣出、spot_buy 即期買入、spot_sell 即期賣出;省略預設 spot_sell

--json
旗標 · 選填

回應欄位 · data

currency
string

換算的外幣幣別(ISO 4217 三碼)。

date
string

換算基準日期(YYYY-MM-DD)。

quote
"cash_buy" | "cash_sell" | "spot_buy" | "spot_sell"

使用的報價類型(cash_buy / cash_sell / spot_buy / spot_sell)。

rate
string | null

解析出的匯率「1 外幣 = ? 台幣」(字串保精度);查無適用牌價為 null。

範例
cairn exchange-rates resolve --currency --date
回應
{
  "ok": true,
  "data": {
    "currency": "…",
    "date": "…",
    "quote": "cash_buy",
    "rate": "…"
  }
}
cairn exchange-rates set-manual

手動覆蓋某日某幣別匯率(source=manual,可重存覆蓋)

參數

--date
旗標 · 必填
--currency
旗標 · 必填

幣別(ISO 4217 三碼大寫,如 JPY / USD)

--cash-buy
旗標 · 選填

現金買入匯率(正數最多 6 位小數,以字串表達);四種報價至少填一個,留空傳 null

--cash-sell
旗標 · 選填

現金賣出匯率(正數最多 6 位小數,以字串表達);四種報價至少填一個,留空傳 null

--spot-buy
旗標 · 選填

即期買入匯率(正數最多 6 位小數,以字串表達);四種報價至少填一個,留空傳 null

--spot-sell
旗標 · 選填

即期賣出匯率(正數最多 6 位小數,以字串表達);四種報價至少填一個,留空傳 null

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

是否覆蓋寫入成功。

id
string

寫入 / 更新的 manual 匯率牌價列 ID。

範例
cairn exchange-rates set-manual --date --currency
回應
{
  "ok": true,
  "data": {
    "ok": true,
    "id": "…"
  }
}

cairn payment-requests

對外應付請款單:查詢、明細、統計、廠商建議

cairn payment-requests list

列出/搜尋對外應付請款單

參數

--status
旗標 · 選填

依狀態篩選(draft 草稿 / submitted 已送審 / approved 已核准 / paid 已付款 / rejected 已退件 / cancelled 已取消 / all 全部)

--payee-type
旗標 · 選填

依收款對象類型篩選(supplier 供應商 / guide 領隊嚮導 / staff_commission 員工獎金 / other 其他 / all 全部)

--departure
旗標 · 選填
--created-by
旗標 · 選填
--q
旗標 · 選填

關鍵字搜尋(請款單號、收款對象名稱等)

--page
旗標 · 選填

頁碼(從 1 起算)

--page-size
旗標 · 選填

每頁筆數(上限 200)

--json
旗標 · 選填

回應欄位 · data

rows
object[]

本頁請款單列。

id
string

請款單 ID。

requestNumber
string

請款單號(人可讀,每租戶流水號)。

status
PaymentRequestStatus

核簽工作流狀態:draft / submitted / approved / paid / rejected / cancelled。

payeeType
PayeeType

收款對象類型:supplier 供應商 / guide 領隊嚮導 / staff_commission 員工獎金 / other 其他。

payeeName
string

收款對象名稱。

amountTwd
number

請款總額(TWD 整數;= 細項小計合計,代扣稅前)。

netAmountTwd
number

實付淨額(TWD 整數;= 請款總額 − 代扣稅額,即實際匯款金額)。

taxAmountTwd
number

代扣稅額(TWD 整數)。

departureId
string | null

關聯梯次 ID;未歸屬特定出團為 null。

departureLabel
string | null

關聯梯次顯示標籤(行程名稱+出發日);無則為 null。

description
string

請款單摘要說明。

createdAt
Date

建立時間。

updatedAt
Date

最後更新時間。

createdByUserId
string

建單人 user ID。

createdByName
string | null

建單人姓名;查無為 null。

paidAt
Date | null

標記付款完成時間;未付為 null。

submittedAt
Date | null

送審時間;未送審為 null。

approvedAt
Date | null

核准時間;未核准為 null。

total
number

符合篩選條件的總筆數(跨全部分頁)。

page
number

目前頁碼(從 1 起算)。

pageSize
number

每頁筆數。

範例
cairn payment-requests list
回應
{
  "ok": true,
  "data": {
    "rows": [
      {
        "id": "…",
        "requestNumber": "…",
        "status": "…",
        "payeeType": "…",
        "payeeName": "…",
        "amountTwd": 0,
        "netAmountTwd": 0,
        "taxAmountTwd": 0,
        "departureId": "…",
        "departureLabel": "…",
        "description": "…",
        "createdAt": "2026-06-30T08:00:00.000Z",
        "updatedAt": "2026-06-30T08:00:00.000Z",
        "createdByUserId": "…",
        "createdByName": "…",
        "paidAt": null,
        "submittedAt": null,
        "approvedAt": null
      }
    ],
    "total": 0,
    "page": 0,
    "pageSize": 0
  }
}
cairn payment-requests get

單一請款單完整明細

參數

<id>位置參數 · 必填
--json
旗標 · 選填

回應欄位 · data

payeeBankAccount
string | null

收款銀行帳號。

payeeBankName
string | null

收款銀行名稱。

payeeBankBranch
string | null

收款銀行分行。

payeeTaxId
string | null

收款對象統一編號 / 稅籍編號。

submittedByUserId
string | null

送審人 user ID;未送審為 null。

submittedByName
string | null

送審人姓名;無則為 null。

approvedByUserId
string | null

核准人 user ID;未核准為 null。

approvedByName
string | null

核准人姓名;無則為 null。

paidByUserId
string | null

標記付款人 user ID;未付為 null。

paidByName
string | null

標記付款人姓名;無則為 null。

rejectedAt
Date | null

退件時間;未退件為 null。

rejectedByName
string | null

退件人姓名;無則為 null。

rejectionReason
string | null

退件原因;無則為 null。

cancelledAt
Date | null

取消時間;未取消為 null。

cancelledByName
string | null

取消人姓名;無則為 null。

cancellationReason
string | null

取消原因;無則為 null。

pdfGeneratedAt
Date | null

請款單 PDF 產生時間;未產生為 null。

paperPrintedAt
Date | null

紙本列印時間;未列印為 null。

paperSignedBy
string | null

紙本簽核人;未簽為 null。

bankReference
string | null

銀行匯款交易參考號(付款後回填);無則為 null。

items
object[]

請款細項清單。

id
string

請款細項 ID。

category
string

細項類別(如住宿、交通、餐食)。

description
string

細項說明。

quantity
number

數量。

unitPriceTwd
number

單價(TWD 整數;負值表折讓)。

totalTwd
number

細項小計(TWD 整數;= 數量 × 單價)。

notes
string | null

細項備註;無則為 null。

sortOrder
number

顯示排序(由小到大)。

audit
object[]

稽核軌跡(狀態機每次轉移一筆,時間新到舊或建立序)。

id
string

稽核記錄 ID。

action
string

動作代號(如 payable.create、payable.submit、payable.approve)。

createdAt
Date

動作發生時間。

actorUserId
string | null

操作者 user ID;系統動作為 null。

actorName
string | null

操作者姓名;無則為 null。

metadata
unknown

動作附帶的結構化資料(欄位隨 action 而定)。

ipAddress
string | null

操作來源 IP;無則為 null。

id
string

請款單 ID。

requestNumber
string

請款單號(人可讀,每租戶流水號)。

status
PaymentRequestStatus

核簽工作流狀態:draft / submitted / approved / paid / rejected / cancelled。

payeeType
PayeeType

收款對象類型:supplier 供應商 / guide 領隊嚮導 / staff_commission 員工獎金 / other 其他。

payeeName
string

收款對象名稱。

amountTwd
number

請款總額(TWD 整數;= 細項小計合計,代扣稅前)。

netAmountTwd
number

實付淨額(TWD 整數;= 請款總額 − 代扣稅額,即實際匯款金額)。

taxAmountTwd
number

代扣稅額(TWD 整數)。

departureId
string | null

關聯梯次 ID;未歸屬特定出團為 null。

departureLabel
string | null

關聯梯次顯示標籤(行程名稱+出發日);無則為 null。

description
string

請款單摘要說明。

createdAt
Date

建立時間。

updatedAt
Date

最後更新時間。

createdByUserId
string

建單人 user ID。

createdByName
string | null

建單人姓名;查無為 null。

paidAt
Date | null

標記付款完成時間;未付為 null。

submittedAt
Date | null

送審時間;未送審為 null。

approvedAt
Date | null

核准時間;未核准為 null。

範例
cairn payment-requests get <id>
回應
{
  "ok": true,
  "data": {
    "payeeBankAccount": "…",
    "payeeBankName": "…",
    "payeeBankBranch": "…",
    "payeeTaxId": "…",
    "submittedByUserId": "…",
    "submittedByName": "…",
    "approvedByUserId": "…",
    "approvedByName": "…",
    "paidByUserId": "…",
    "paidByName": "…",
    "rejectedAt": null,
    "rejectedByName": "…",
    "rejectionReason": "…",
    "cancelledAt": null,
    "cancelledByName": "…",
    "cancellationReason": "…",
    "pdfGeneratedAt": null,
    "paperPrintedAt": null,
    "paperSignedBy": "…",
    "bankReference": "…",
    "items": [
      {
        "id": "…",
        "category": "…",
        "description": "…",
        "quantity": 0,
        "unitPriceTwd": 0,
        "totalTwd": 0,
        "notes": "…",
        "sortOrder": 0
      }
    ],
    "audit": [
      {
        "id": "…",
        "action": "…",
        "createdAt": "2026-06-30T08:00:00.000Z",
        "actorUserId": "…",
        "actorName": "…",
        "metadata": "…",
        "ipAddress": "…"
      }
    ],
    "id": "…",
    "requestNumber": "…",
    "status": "…",
    "payeeType": "…",
    "payeeName": "…",
    "amountTwd": 0,
    "netAmountTwd": 0,
    "taxAmountTwd": 0,
    "departureId": "…",
    "departureLabel": "…",
    "description": "…",
    "createdAt": "2026-06-30T08:00:00.000Z",
    "updatedAt": "2026-06-30T08:00:00.000Z",
    "createdByUserId": "…",
    "createdByName": "…",
    "paidAt": null,
    "submittedAt": null,
    "approvedAt": null
  }
}
cairn payment-requests stats

對外應付請款單 KPI 統計

參數

--json
旗標 · 選填

回應欄位 · data

draftCount
number

草稿狀態的請款單數。

submittedCount
number

已送審待核准的請款單數。

approvedCount
number

已核准待付款的請款單數。

paidCount
number

已付款的請款單數。

thisMonthPaidCount
number

本月已付款的請款單數。

thisMonthAmount
number

本月已付款的實付淨額合計(TWD 整數;台北月起算)。

totalApprovedAmount
number

已核准未付的實付淨額合計(TWD 整數;待出款金額)。

範例
cairn payment-requests stats
回應
{
  "ok": true,
  "data": {
    "draftCount": 0,
    "submittedCount": 0,
    "approvedCount": 0,
    "paidCount": 0,
    "thisMonthPaidCount": 0,
    "thisMonthAmount": 0,
    "totalApprovedAmount": 0
  }
}
cairn payment-requests suggest-items

由梯次住宿成本推導供應商請款細項建議

參數

--departure <id>
旗標 · 必填
--json
旗標 · 選填

回應欄位 · data[]

category
string

建議的請款細項類別(如住宿)。

description
string

建議的細項說明(住宿廠商 × 房型 × 晚數)。

quantity
number

建議數量(間數 × 晚數)。

unitPriceTwd
number

建議單價(TWD 整數;每間每晚成本)。

totalTwd
number

建議小計(TWD 整數;= 數量 × 單價)。

suggestedPayee
string | null

建議的收款對象(住宿供應商名稱);查無為 null。

範例
cairn payment-requests suggest-items --departure <id>
回應
{
  "ok": true,
  "data": [
    {
      "category": "…",
      "description": "…",
      "quantity": 0,
      "unitPriceTwd": 0,
      "totalTwd": 0,
      "suggestedPayee": "…"
    }
  ]
}
cairn payment-requests create

建立對外應付請款單(draft,或 --submit 同步送審)

參數

<cat:desc:qty:price[:notes]>位置參數 · 必填
--payee-type <supplier|guide|staff_commission|other>
旗標 · 必填

依收款對象類型篩選(supplier 供應商 / guide 領隊嚮導 / staff_commission 員工獎金 / other 其他 / all 全部)

--payee-name <n>
旗標 · 必填

收款對象名稱

--description <d>
旗標 · 必填

請款單摘要說明

--tax
旗標 · 選填
--departure
旗標 · 選填
--bank-account
旗標 · 選填
--bank-name
旗標 · 選填
--bank-branch
旗標 · 選填
--tax-id
旗標 · 選填
--submit
旗標 · 選填
--confirm
對 production target 寫入時必帶

回應欄位 · data

id
string

新建立請款單的 id。

requestNumber
string

新建立請款單的單號(人可讀)。

status
PaymentRequestStatus

建立後狀態(draft,或 submitImmediately 時為 submitted)。

範例
cairn payment-requests create <cat:desc:qty:price[:notes]> --payee-type <supplier|guide|staff_commission|other> --payee-name <n> --description <d>
回應
{
  "ok": true,
  "data": {
    "id": "…",
    "requestNumber": "…",
    "status": "…"
  }
}
cairn payment-requests approve

核可請款單(submitted→approved;責任分離,需 payable.approve)

參數

<id>位置參數 · 必填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

是否核可成功(submitted→approved)。

範例
cairn payment-requests approve <id>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn payment-requests submit

送審請款單(draft→submitted)

參數

<id>位置參數 · 必填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

是否送審成功(draft→submitted)。

範例
cairn payment-requests submit <id>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn payment-requests reject

退件請款單(submitted→draft)

參數

<id>位置參數 · 必填
--reason <text>
旗標 · 必填

退件原因(必填,回饋給建單人)

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

是否退件成功(submitted→draft)。

範例
cairn payment-requests reject <id> --reason <text>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn payment-requests mark-paid

標記請款單已付(approved→paid)

參數

<id>位置參數 · 必填
--bank-reference <ref>
旗標 · 必填

網銀交易序號 / 轉帳憑證號(必填)

--receiving-account
旗標 · 選填
--paper-signed-by
旗標 · 選填

紙本簽核人姓名

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

是否標記付款成功(approved→paid)。

範例
cairn payment-requests mark-paid <id> --bank-reference <ref>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn payment-requests cancel

取消請款單(非 paid;僅建單人或 admin)

參數

<id>位置參數 · 必填
--reason
旗標 · 選填

取消原因;留空預設為「使用者取消」(上限 200 字)

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

是否取消成功(idempotent,已取消再呼叫仍為 true)。

範例
cairn payment-requests cancel <id>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn payment-requests mark-signed

記錄紙本簽核人

參數

<id>位置參數 · 必填
--signed-by <name>
旗標 · 必填

紙本簽核人姓名(必填)

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

是否記錄紙本簽核人成功。

範例
cairn payment-requests mark-signed <id> --signed-by <name>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn payment-requests mark-printed

標記 PDF/紙本已產生(idempotent)

參數

<id>位置參數 · 必填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

是否標記 PDF / 紙本已產生成功(idempotent)。

範例
cairn payment-requests mark-printed <id>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}

cairn payments

收款流水帳:查詢、統計

cairn payments list

列出/搜尋收款流水

參數

--status
旗標 · 選填

依金流狀態篩選(如 paid 已收款 / pending 待付 / failed 失敗 / refunded 已退款)

--method
旗標 · 選填

依付款方式篩選(如信用卡、ATM 轉帳)

--q
旗標 · 選填

關鍵字搜尋(訂單編號、客戶名稱等)

--date-from
旗標 · 選填

收款日期區間起日(YYYY-MM-DD)

--date-to
旗標 · 選填

收款日期區間迄日(YYYY-MM-DD)

--page
旗標 · 選填

頁碼(從 1 起算)

--json
旗標 · 選填

回應欄位 · data

rows
object[]

本頁付款嘗試列。

id
string

付款嘗試(payment attempt)ID,此列的唯一識別。

orderId
string

所屬訂單 ID。

orderNumber
string

所屬訂單編號(人可讀)。

merchantTradeNo
string

provider_order_ref(= 我們產的 MerchantTradeNo)。

providerTradeNo
string | null

金流商回傳的交易序號(未成交或手動入帳為 null)。

provider
string

金流商代號(如 ecpay、test;手動入帳為 manual)。

paymentMethod
string

付款方式(如信用卡、ATM 虛擬帳號)。

amountTwd
number

此筆嘗試的金額(TWD 整數)。

status
string

attempt 狀態:pending | submitted | succeeded | failed | expired。

refunded
boolean

此 attempt 是否關聯到任何退款 / 退單交易(out 方向)。

paidAt
Date | null

實際入帳(現金結算)時間;未結算為 null。

createdAt
Date

此筆付款嘗試的建立時間。

customerName
string

付款客戶姓名。

customerEmail
string

付款客戶 email。

tripTitle
string

訂單對應的行程名稱。

total
number

符合篩選條件的總筆數(跨全部分頁)。

page
number

目前頁碼(從 1 起算)。

pageSize
number

每頁筆數。

範例
cairn payments list
回應
{
  "ok": true,
  "data": {
    "rows": [
      {
        "id": "…",
        "orderId": "…",
        "orderNumber": "…",
        "merchantTradeNo": "…",
        "providerTradeNo": "…",
        "provider": "…",
        "paymentMethod": "…",
        "amountTwd": 0,
        "status": "…",
        "refunded": true,
        "paidAt": null,
        "createdAt": "2026-06-30T08:00:00.000Z",
        "customerName": "…",
        "customerEmail": "…",
        "tripTitle": "…"
      }
    ],
    "total": 0,
    "page": 0,
    "pageSize": 0
  }
}
cairn payments stats

收款 KPI 統計

參數

--json
旗標 · 選填

回應欄位 · data

totalAmount
number

累計實收現金(payment_transactions in)。

paidCount
number

已成功收款的付款嘗試數。

pendingCount
number

待付 / 處理中的付款嘗試數(pending、submitted)。

failedCount
number

失敗或逾期的付款嘗試數(failed、expired)。

refundedCount
number

有關聯退款 / 退單的付款嘗試數。

thisMonthAmount
number

本月累計實收現金(TWD 整數)。

範例
cairn payments stats
回應
{
  "ok": true,
  "data": {
    "totalAmount": 0,
    "paidCount": 0,
    "pendingCount": 0,
    "failedCount": 0,
    "refundedCount": 0,
    "thisMonthAmount": 0
  }
}
cairn payments export

匯出金流分類帳為 CSV/JSON(同 list 篩選;取全頁)

參數

--status
旗標 · 選填

依金流狀態篩選(如 paid 已收款 / pending 待付 / failed 失敗 / refunded 已退款)

--method
旗標 · 選填

依付款方式篩選(如信用卡、ATM 轉帳)

--date-from
旗標 · 選填

收款日期區間起日(YYYY-MM-DD)

--date-to
旗標 · 選填

收款日期區間迄日(YYYY-MM-DD)

--q
旗標 · 選填

關鍵字搜尋(訂單編號、客戶名稱等)

--format
旗標 · 選填
--json
旗標 · 選填

回應欄位 · data

rows
object[]

符合篩選條件的所有列(逐頁累積;達安全上限時截斷)。

id
string

付款嘗試(payment attempt)ID,此列的唯一識別。

orderId
string

所屬訂單 ID。

orderNumber
string

所屬訂單編號(人可讀)。

merchantTradeNo
string

provider_order_ref(= 我們產的 MerchantTradeNo)。

providerTradeNo
string | null

金流商回傳的交易序號(未成交或手動入帳為 null)。

provider
string

金流商代號(如 ecpay、test;手動入帳為 manual)。

paymentMethod
string

付款方式(如信用卡、ATM 虛擬帳號)。

amountTwd
number

此筆嘗試的金額(TWD 整數)。

status
string

attempt 狀態:pending | submitted | succeeded | failed | expired。

refunded
boolean

此 attempt 是否關聯到任何退款 / 退單交易(out 方向)。

paidAt
Date | null

實際入帳(現金結算)時間;未結算為 null。

createdAt
Date

此筆付款嘗試的建立時間。

customerName
string

付款客戶姓名。

customerEmail
string

付款客戶 email。

tripTitle
string

訂單對應的行程名稱。

total
number

符合篩選條件的總筆數。

truncated
boolean

是否因達安全上限而截斷(true 表未回傳完整結果,呼叫端應提示)。

範例
cairn payments export
回應
{
  "ok": true,
  "data": {
    "rows": [
      {
        "id": "…",
        "orderId": "…",
        "orderNumber": "…",
        "merchantTradeNo": "…",
        "providerTradeNo": "…",
        "provider": "…",
        "paymentMethod": "…",
        "amountTwd": 0,
        "status": "…",
        "refunded": true,
        "paidAt": null,
        "createdAt": "2026-06-30T08:00:00.000Z",
        "customerName": "…",
        "customerEmail": "…",
        "tripTitle": "…"
      }
    ],
    "total": 0,
    "truncated": true
  }
}

cairn reconciliation

收款帳戶對帳 + 帳戶結算(讀取 / 報表)

cairn reconciliation accounts

逐收款帳戶現金進出對帳

參數

--date-from
旗標 · 選填

對帳期間起日(YYYY-MM-DD,含當日),以 Asia/Taipei 牆鐘日界計;省略則不設下界

--date-to
旗標 · 選填

對帳期間迄日(YYYY-MM-DD,含整日),以 Asia/Taipei 牆鐘日界計;省略則不設上界

--json
旗標 · 選填

回應欄位 · data[]

accountId
string | null

收款帳戶 id;null = 未歸戶桶。

code
string | null

帳戶代碼;未歸戶桶為 null。

displayName
string | null

帳戶顯示名;未歸戶桶為 null。

kind
ReceivingAccountKind | null

帳戶類型(bank / cash / gateway);未歸戶桶為 null。

inTwd
number

期間內 direction='in' 的金額合計。

outTwd
number

期間內 payment_transactions direction='out' 的金額合計(客戶退款 / gateway 出)。

payableOutTwd
number

期間內供應商出款合計(payables paid 的 net_amount_twd;非 order-scoped,獨立來源 §3.1)。

netTwd
number

淨額 = in − out − payableOut(不扣手續費,純現金流向;對帳找銀行入帳用毛額)。

txCount
number

期間內這帳戶的活動筆數(payment_transactions + payables paid)。

範例
cairn reconciliation accounts
回應
{
  "ok": true,
  "data": [
    {
      "accountId": "…",
      "code": "…",
      "displayName": "…",
      "kind": null,
      "inTwd": 0,
      "outTwd": 0,
      "payableOutTwd": 0,
      "netTwd": 0,
      "txCount": 0
    }
  ]
}
cairn reconciliation list-accounts

收款帳戶目錄

參數

--active-only
旗標 · 選填

是否只回傳啟用中的收款帳戶(true/false);省略則含停用

--json
旗標 · 選填

回應欄位 · data[]

id
string

收款帳戶 ID。

code
string

帳戶代碼(租戶內唯一穩定識別)。

displayName
string

帳戶顯示名。

kind
ReceivingAccountKind

帳戶類型:bank 銀行 / cash 現金 / gateway 金流閘道。

bankName
string | null

銀行名稱;現金/閘道帳戶為 null。

accountNo
string | null

銀行帳號;現金/閘道帳戶為 null。

canReceive
boolean

可收款(幾乎都 true)。

canRemit
boolean

可對外匯款(ATM / 匯出退款 / 補款匯出)。荒野只有永豐。

canChargeback
boolean

可刷退(退回原信用卡)。荒野只有綠界(gateway)。

isDeprecated
boolean

廢帳戶:仍可零星收款,但其收款需由他帳戶代墊歸集。荒野=RU 台銀 / 登山社。

isSettlementMaster
boolean

主結算帳戶:所有資金最終向它彙整。每租戶恰一個(partial unique index)。荒野=永豐。

currency
string

帳戶幣別(ISO 4217;既有帳戶皆 'TWD',外幣帳戶如 IDR / USD)。

isActive
boolean

此帳戶是否啟用。

displayOrder
number

後台清單排序序位(小者在前)。

usedCount
number

被多少 payment_transactions 引用(UI 鎖頭 / 「使用中 N」)。

createdAt
Date

建立時間。

updatedAt
Date

最後更新時間。

範例
cairn reconciliation list-accounts
回應
{
  "ok": true,
  "data": [
    {
      "id": "…",
      "code": "…",
      "displayName": "…",
      "kind": "…",
      "bankName": "…",
      "accountNo": "…",
      "canReceive": true,
      "canRemit": true,
      "canChargeback": true,
      "isDeprecated": true,
      "isSettlementMaster": true,
      "currency": "…",
      "isActive": true,
      "displayOrder": 0,
      "usedCount": 0,
      "createdAt": "2026-06-30T08:00:00.000Z",
      "updatedAt": "2026-06-30T08:00:00.000Z"
    }
  ]
}
cairn reconciliation settlement-overview

月結互抵派生總覽

參數

--period
旗標 · 必填

要查詢月結互抵總覽的結算期(YYYY-MM)

--json
旗標 · 選填

回應欄位 · data

period
string

結算月份(YYYY-MM,Asia/Taipei)。

matrix
object

兩層互抵矩陣(各帳戶對主結算帳戶的有向淨額 + 未分類彙總)。

lines
object[]

各帳戶對主結算帳戶(或其類別 final)的有向淨額;恆正、方向由 debtor/creditor。

unclassified
object

未分類(未標費用類型)收款彙總,不進互抵,供 UI 提示補 tag。

obligations
object[]

本期相關掛帳(period_settlement,含結清進度)。

id
string

帳戶間掛帳 ID。

debtorAccountId
string

欠款方(債務人)收款帳戶 ID。

creditorAccountId
string

收款方(債權人)收款帳戶 ID。

amountTwd
number

應補目標總額(TWD 整數,恆正)。

settledAmountTwd
number

已結清金額(TWD 整數,0 ≤ settled ≤ amount)。

outstandingTwd
number

待結餘額(派生 = amount − settled,>= 0)。

reason
ObligationReason

掛帳成因:period_settlement 月結互抵 / advance_repayment 代墊償還 / refund_advance 退款代墊 / adjustment 手動調整。

originPeriod
string

產生月份(YYYY-MM,Asia/Taipei)。

status
ObligationStatus

結清狀態:outstanding 未結 / partially_settled 部分結清 / settled 已結清。

note
string | null

備註;無則為 null。

createdAt
Date

建立時間。

updatedAt
Date

最後更新時間。

carriedForward
object

跨期掛帳結轉基數(上期未結 period_settlement 殘額,已種入 matrix 淨額;此處供顯示明細 + 小計)。

lines
object[]

上期未結 period_settlement 殘額逐筆明細(已種入本期互抵基數)。

totalTwd
number

結轉殘額小計(TWD 整數)。

範例
cairn reconciliation settlement-overview --period
回應
{
  "ok": true,
  "data": {
    "period": "…",
    "matrix": {
      "lines": [],
      "unclassified": "…"
    },
    "obligations": [
      {
        "id": "…",
        "debtorAccountId": "…",
        "creditorAccountId": "…",
        "amountTwd": 0,
        "settledAmountTwd": 0,
        "outstandingTwd": 0,
        "reason": "…",
        "originPeriod": "…",
        "status": "…",
        "note": "…",
        "createdAt": "2026-06-30T08:00:00.000Z",
        "updatedAt": "2026-06-30T08:00:00.000Z"
      }
    ],
    "carriedForward": {
      "lines": [],
      "totalTwd": 0
    }
  }
}
cairn reconciliation transfers

帳戶間移轉統一分類帳

參數

--kind
旗標 · 選填

移轉類型篩選(fx_conversion 換匯 / replenishment 補款 / advance 代墊 / backfill 回填 / refund_payout 退款匯出 / reversal 沖正);省略則含全部

--account
旗標 · 選填

帳戶 ID 篩選,回傳該帳戶為出帳或進帳方的移轉;省略則不限帳戶

--date-from
旗標 · 選填

移轉日期起日(YYYY-MM-DD,含當日);省略則不設下界

--date-to
旗標 · 選填

移轉日期迄日(YYYY-MM-DD,含當日);省略則不設上界

--settlement-period
旗標 · 選填

對應月結期間(YYYY-MM)篩選;省略則不限月結

--obligation
旗標 · 選填

掛帳 ID 篩選,回傳沖減該筆掛帳的移轉;省略則不限掛帳

--json
旗標 · 選填

回應欄位 · data[]

id
string

帳戶間移轉 ID。

kind
AccountTransferKind

移轉類型:fx_conversion 換匯 / replenishment 補款 / advance 代墊 / backfill 回填 / refund_payout 退款匯出 / opening 期初 / reversal 沖正。

fromAccountId
string | null

出帳帳戶 ID;期初等單邊移轉為 null。

toAccountId
string | null

進帳帳戶 ID;單邊移轉為 null。

amountTwd
number

移轉金額(TWD 整數)。

feeTwd
number

手續費(TWD 整數)。

currency
string | null

外幣幣別(ISO 4217;純台幣移轉為 null)。

foreignAmount
number | null

外幣金額(整數;非外幣移轉為 null)。

feeForeign
number | null

外幣手續費(整數;無則為 null)。

grossRate
string | null

換匯牌價(numeric → 字串原值保精度;顯示/溯源用)。

settlementPeriod
string | null

對應月結期間(YYYY-MM);未歸屬月結為 null。

obligationId
string | null

沖減的帳戶間掛帳 ID;未沖減掛帳為 null。

reversesTransferId
string | null

被本筆沖正的原移轉 ID(kind='reversal' 時非 null)。

occurredAt
string

移轉日期('YYYY-MM-DD',date 欄)。

note
string | null

備註;無則為 null。

createdByUserId
string

登錄人 user ID。

createdAt
Date

建立時間。

updatedAt
Date

最後更新時間。

範例
cairn reconciliation transfers
回應
{
  "ok": true,
  "data": [
    {
      "id": "…",
      "kind": "…",
      "fromAccountId": "…",
      "toAccountId": "…",
      "amountTwd": 0,
      "feeTwd": 0,
      "currency": "…",
      "foreignAmount": 0,
      "feeForeign": 0,
      "grossRate": "…",
      "settlementPeriod": "…",
      "obligationId": "…",
      "reversesTransferId": "…",
      "occurredAt": "…",
      "note": "…",
      "createdByUserId": "…",
      "createdAt": "2026-06-30T08:00:00.000Z",
      "updatedAt": "2026-06-30T08:00:00.000Z"
    }
  ]
}
cairn reconciliation obligations

未結掛帳追蹤

參數

--period
旗標 · 選填

月結來源期間(YYYY-MM),篩選由該期月結互抵推導出的掛帳;省略則不限期間

--reason
旗標 · 選填

掛帳原因代碼,篩選特定成因的掛帳;省略則不限原因

--status
旗標 · 選填

掛帳狀態(如未結清 / 已結清),篩選特定結清狀態;省略則含全部

--json
旗標 · 選填

回應欄位 · data[]

id
string

帳戶間掛帳 ID。

debtorAccountId
string

欠款方(債務人)收款帳戶 ID。

creditorAccountId
string

收款方(債權人)收款帳戶 ID。

amountTwd
number

應補目標總額(TWD 整數,恆正)。

settledAmountTwd
number

已結清金額(TWD 整數,0 ≤ settled ≤ amount)。

outstandingTwd
number

待結餘額(派生 = amount − settled,>= 0)。

reason
ObligationReason

掛帳成因:period_settlement 月結互抵 / advance_repayment 代墊償還 / refund_advance 退款代墊 / adjustment 手動調整。

originPeriod
string

產生月份(YYYY-MM,Asia/Taipei)。

status
ObligationStatus

結清狀態:outstanding 未結 / partially_settled 部分結清 / settled 已結清。

note
string | null

備註;無則為 null。

createdAt
Date

建立時間。

updatedAt
Date

最後更新時間。

範例
cairn reconciliation obligations
回應
{
  "ok": true,
  "data": [
    {
      "id": "…",
      "debtorAccountId": "…",
      "creditorAccountId": "…",
      "amountTwd": 0,
      "settledAmountTwd": 0,
      "outstandingTwd": 0,
      "reason": "…",
      "originPeriod": "…",
      "status": "…",
      "note": "…",
      "createdAt": "2026-06-30T08:00:00.000Z",
      "updatedAt": "2026-06-30T08:00:00.000Z"
    }
  ]
}
cairn reconciliation refund-execs

退款執行清單(approved + paid)

參數

--status
旗標 · 選填

退款狀態篩選:approved 待執行(已核准)、paid 已執行(已出款);省略則合併回傳兩者

--json
旗標 · 選填

回應欄位 · data

rows
object[]

退款執行列(合併 approved 待執行 + paid 已執行,或收斂為指定段)。

id
string

退款單 ID。

refundNumber
string

退款單號(人可讀,每租戶流水號)。

orderId
string

所屬訂單 ID。

orderNumber
string | null

所屬訂單編號(人可讀);無則為 null。

status
RefundStatus

退款工作流狀態:draft / submitted / approved / processing / paid / failed / cancelled。

refundKind
RefundKind

退款種類:receivable_reduction 減應收退款(取消 / 降價 / 服務失敗)/ overpayment_return 溢收退還(不動應收,只退多收現金)。

affectsReceivable
boolean

是否減少應收(receivable_reduction 為 true、overpayment_return 為 false;溢收退還不列入 refund_state)。

amountTwd
number

退款金額(TWD 整數,正值)。

method
RefundMethod

退款方式:original_gateway 原路退刷 / bank_transfer 銀行匯款 / cash 現金 / manual 手動。

reason
string

退款原因說明。

createdAt
Date

退款單建立時間。

paidAt
Date | null

實際退款出款(現金結算)時間;未執行為 null。

createdByName
string | null

建單人姓名;無則為 null。

executionMethod
RefundExecutionMethod | null

退款執行方法:chargeback 原信用卡刷退 / remit 匯出;未指定為 null。

originAccountId
string | null

出款來源帳戶 ID(從哪個收款帳戶退出);未指定為 null。

adminFeeTwd
number

內扣手續費(TWD 整數;自退款金額中扣除的行政費)。

remitFeeTwd
number

匯款手續費(TWD 整數;銀行匯出的轉帳費)。

payeeAccountName
string | null

收款人戶名(匯款退款用);無則為 null。

payeeBankCode
string | null

收款銀行代碼(匯款退款用);無則為 null。

payeeAccountNumber
string | null

收款帳號(匯款退款用);無則為 null。

total
number

回傳的退款執行筆數。

範例
cairn reconciliation refund-execs
回應
{
  "ok": true,
  "data": {
    "rows": [
      {
        "id": "…",
        "refundNumber": "…",
        "orderId": "…",
        "orderNumber": "…",
        "status": "…",
        "refundKind": "…",
        "affectsReceivable": true,
        "amountTwd": 0,
        "method": "…",
        "reason": "…",
        "createdAt": "2026-06-30T08:00:00.000Z",
        "paidAt": null,
        "createdByName": "…",
        "executionMethod": null,
        "originAccountId": "…",
        "adminFeeTwd": 0,
        "remitFeeTwd": 0,
        "payeeAccountName": "…",
        "payeeBankCode": "…",
        "payeeAccountNumber": "…"
      }
    ],
    "total": 0
  }
}
cairn reconciliation settlement-report

月結互抵矩陣報表(同 settlement-overview 資料源)

參數

--period
旗標 · 必填

要查詢月結互抵總覽的結算期(YYYY-MM)

--json
旗標 · 選填

回應欄位 · data

period
string

結算月份(YYYY-MM,Asia/Taipei)。

matrix
object

兩層互抵矩陣(各帳戶對主結算帳戶的有向淨額 + 未分類彙總)。

lines
object[]

各帳戶對主結算帳戶(或其類別 final)的有向淨額;恆正、方向由 debtor/creditor。

unclassified
object

未分類(未標費用類型)收款彙總,不進互抵,供 UI 提示補 tag。

obligations
object[]

本期相關掛帳(period_settlement,含結清進度)。

id
string

帳戶間掛帳 ID。

debtorAccountId
string

欠款方(債務人)收款帳戶 ID。

creditorAccountId
string

收款方(債權人)收款帳戶 ID。

amountTwd
number

應補目標總額(TWD 整數,恆正)。

settledAmountTwd
number

已結清金額(TWD 整數,0 ≤ settled ≤ amount)。

outstandingTwd
number

待結餘額(派生 = amount − settled,>= 0)。

reason
ObligationReason

掛帳成因:period_settlement 月結互抵 / advance_repayment 代墊償還 / refund_advance 退款代墊 / adjustment 手動調整。

originPeriod
string

產生月份(YYYY-MM,Asia/Taipei)。

status
ObligationStatus

結清狀態:outstanding 未結 / partially_settled 部分結清 / settled 已結清。

note
string | null

備註;無則為 null。

createdAt
Date

建立時間。

updatedAt
Date

最後更新時間。

carriedForward
object

跨期掛帳結轉基數(上期未結 period_settlement 殘額,已種入 matrix 淨額;此處供顯示明細 + 小計)。

lines
object[]

上期未結 period_settlement 殘額逐筆明細(已種入本期互抵基數)。

totalTwd
number

結轉殘額小計(TWD 整數)。

範例
cairn reconciliation settlement-report --period
回應
{
  "ok": true,
  "data": {
    "period": "…",
    "matrix": {
      "lines": [],
      "unclassified": "…"
    },
    "obligations": [
      {
        "id": "…",
        "debtorAccountId": "…",
        "creditorAccountId": "…",
        "amountTwd": 0,
        "settledAmountTwd": 0,
        "outstandingTwd": 0,
        "reason": "…",
        "originPeriod": "…",
        "status": "…",
        "note": "…",
        "createdAt": "2026-06-30T08:00:00.000Z",
        "updatedAt": "2026-06-30T08:00:00.000Z"
      }
    ],
    "carriedForward": {
      "lines": [],
      "totalTwd": 0
    }
  }
}
cairn reconciliation compute-settlement

重跑當期月結互抵派生 + upsert 掛帳(冪等)

參數

--period
旗標 · 必填

要計算月結互抵的結算期(YYYY-MM),可重跑且冪等(不回退已結額)

--json
旗標 · 選填

回應欄位 · data

period
string

結算月份(YYYY-MM,Asia/Taipei)。

matrix
object

兩層互抵矩陣(各帳戶對主結算帳戶的有向淨額 + 未分類彙總)。

lines
object[]

各帳戶對主結算帳戶(或其類別 final)的有向淨額;恆正、方向由 debtor/creditor。

unclassified
object

未分類(未標費用類型)收款彙總,不進互抵,供 UI 提示補 tag。

upserts
object[]

本次 run 對每條互抵列 upsert 的結果(含冪等護欄調整)。

debtorAccountId
string

欠款方(債務人)收款帳戶 ID。

creditorAccountId
string

收款方(債權人)收款帳戶 ID。

derivedAmountTwd
number

本次派生的目標淨額。

appliedAmountTwd
number

實際落地的掛帳 amount_twd(受冪等護欄約束,不低於已 settled)。

obligationId
string

對應的帳戶間掛帳 ID(本次 upsert 的目標列)。

action
"created" | "updated" | "floored_to_settled"

本次動作:created 新建 / updated 更新 / floored_to_settled 派生低於已結被護欄下限鎖住。

adjustmentTwd
number

派生目標低於已結額、被 floor 時的差額(保留為 adjustment 線索;> 0 表示有缺口)。

adjustmentObligationId
string | null

floor 缺口另記的 adjustment 掛帳 id(action='floored_to_settled' 時非 null)。

deletedObligationIds
string[]

本次 run 刪除的失效派生掛帳 id(settled=0 且不在新派生)。

範例
cairn reconciliation compute-settlement --period
回應
{
  "ok": true,
  "data": {
    "period": "…",
    "matrix": {
      "lines": [],
      "unclassified": "…"
    },
    "upserts": [
      {
        "debtorAccountId": "…",
        "creditorAccountId": "…",
        "derivedAmountTwd": 0,
        "appliedAmountTwd": 0,
        "obligationId": "…",
        "action": "created",
        "adjustmentTwd": 0,
        "adjustmentObligationId": "…"
      }
    ],
    "deletedObligationIds": [
      "…"
    ]
  }
}
cairn reconciliation create-transfer

登錄帳戶間移轉(補款/代墊/回填/退款匯出/換匯/沖正;可選沖減掛帳)

參數

--kind <fx_conversion|replenishment|advance|backfill|refund_payout|reversal>
旗標 · 必填

移轉類型篩選(fx_conversion 換匯 / replenishment 補款 / advance 代墊 / backfill 回填 / refund_payout 退款匯出 / reversal 沖正);省略則含全部

--amount <twd>
旗標 · 必填
--occurred-at <YYYY-MM-DD>
旗標 · 必填

移轉發生日期(YYYY-MM-DD)

--from
旗標 · 選填
--to
旗標 · 選填
--fee
旗標 · 選填
--settlement-period
旗標 · 選填

對應月結期間(YYYY-MM)篩選;省略則不限月結

--currency
旗標 · 選填

換匯外幣幣別(ISO 4217 三碼);非換匯傳 null

--foreign-amount
旗標 · 選填

換匯外幣金額(整數最小單位,須大於 0);非換匯傳 null

--gross-rate
旗標 · 選填

換匯牌價(正數,最多 6 位小數,以字串表達避免精度遺失);非換匯傳 null

--obligation
旗標 · 選填

掛帳 ID 篩選,回傳沖減該筆掛帳的移轉;省略則不限掛帳

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

是否登錄成功(移轉 + 沖減掛帳的原子交易皆完成)。

範例
cairn reconciliation create-transfer --kind <fx_conversion|replenishment|advance|backfill|refund_payout|reversal> --amount <twd> --occurred-at <YYYY-MM-DD>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn reconciliation statement

銀行對帳單匯入 + 配對(範本 / 匯入 / 自動配對 / 人工配對 / 略過 / 刪批)

參數

<importId>位置參數 · 必填
<lineId>位置參數 · 必填
--account <id>
旗標 · 必填

收款帳戶 ID,回傳該帳戶的對帳單批次 / 行 / 進度彙總

--out <path>
旗標 · 必填
--period-start <d>
旗標 · 必填

對帳單期間起日(含當日)

--period-end <d>
旗標 · 必填

對帳單期間迄日(含當日)

--file <path.xlsx>
旗標 · 必填
--commit
旗標 · 選填
--confirm
對 production target 寫入時必帶
--source-type <payment_transaction|payable|account_transfer>
旗標 · 必填

配對來源種類:payment_transaction / payable / account_transfer

--source-id <id>
旗標 · 必填

配對來源 ID(該帳戶內未被配對的 ERP 候選)

--reason <r>
旗標 · 必填

略過原因(必填;如「手續費」「利息」)

回應欄位 · data

imports
object[]

該帳戶的對帳單批次清單(新到舊)。

id
string

對帳單批次 ID。

periodStart
string

批次期間起日('YYYY-MM-DD',含當日)。

periodEnd
string

批次期間迄日('YYYY-MM-DD',含當日)。

filename
string

匯入的檔名。

createdAt
Date

匯入時間。

lineCount
number

批內總行數。

autoCount
number

自動配對的行數。

manualCount
number

人工配對的行數。

unmatchedCount
number

尚未配對的行數。

ignoredCount
number

已略過(ignored)的行數。

excludedCount
number

已解除配對(excluded)的行數。

lines
object[]

該帳戶所有對帳單行(跨批次)。

id
string

對帳單行 ID。

importId
string

所屬對帳單批次 ID。

lineNo
number

檔案內行號(1 起算)。

txnDate
string

交易日期('YYYY-MM-DD')。

direction
"out" | "in"

現金流向:in 存入 / out 支出。

amountTwd
number

金額(TWD 整數)。

memo
string

摘要 / 備註文字。

status
string

配對狀態:unmatched 未配 / auto 自動 / manual 人工 / ignored 略過 / excluded 已解除。

matchedSourceType
string | null

已配對來源種類(payment_transaction / payable / account_transfer);未配為 null。

matchedSourceId
string | null

已配對來源 ID;未配為 null。

ignoredReason
string | null

略過原因;非 ignored 為 null。

progress
object

配對進度彙總。

total
number

總行數。

matched
number

已配對行數(auto + manual)。

unmatched
number

未配對行數。

ignored
number

已略過行數。

excluded
number

已解除配對行數。

範例
cairn reconciliation statement <importId> <lineId> --account <id> --out <path> --period-start <d> --period-end <d> --file <path.xlsx> --source-type <payment_transaction|payable|account_transfer> --source-id <id> --reason <r>
回應
{
  "ok": true,
  "data": {
    "imports": [
      {
        "id": "…",
        "periodStart": "…",
        "periodEnd": "…",
        "filename": "…",
        "createdAt": "2026-06-30T08:00:00.000Z",
        "lineCount": 0,
        "autoCount": 0,
        "manualCount": 0,
        "unmatchedCount": 0,
        "ignoredCount": 0,
        "excludedCount": 0
      }
    ],
    "lines": [
      {
        "id": "…",
        "importId": "…",
        "lineNo": 0,
        "txnDate": "…",
        "direction": "out",
        "amountTwd": 0,
        "memo": "…",
        "status": "…",
        "matchedSourceType": "…",
        "matchedSourceId": "…",
        "ignoredReason": "…"
      }
    ],
    "progress": {
      "total": 0,
      "matched": 0,
      "unmatched": 0,
      "ignored": 0,
      "excluded": 0
    }
  }
}

cairn accrual-ledger

掛帳台帳:四區塊派生、梯次彙總(純讀)

cairn accrual-ledger get

單一期間掛帳台帳四區塊

參數

--period
旗標 · 必填

出團月(格式 YYYY-MM,Asia/Taipei 時區)

--json
旗標 · 選填

回應欄位 · data

period
string

結算期間(YYYY-MM,Asia/Taipei 出團月)。

departureSummary
object[]

梯次彙總(區塊 1):出團月落於 period 的各梯次收入 / 成本 / 毛利。

departureId
string

梯次 ID。

tripTitle
string

團名。

departureDate
string

出團日期(YYYY-MM-DD)。

pax
number

出團人數(該梯次確認人數)。

revenueTwd
number

總收入(梯次成交應收,排除已取消訂單,TWD 整數)。

realCostTwd
number

真實成本合計(TWD 整數)= 房費底價成本 + 已核准的逐筆成本。逐筆成本區塊不含房費 (房費由分房資料另計),故逐筆成本加總會小於此值,差額即房費(設計如此)。

grossProfitTwd
number

毛利毛估 = revenue − realCost(含房費)。

costLines
object[]

成本掛帳逐筆(區塊 2):該期梯次上所有 departure_costs 成本列。

id
string

成本列 ID。

tripTitle
string

團名。

departureDate
string

所屬梯次出團日期(YYYY-MM-DD)。

category
string

成本分類(如 交通 / 餐費 / 保險 / 嚮導)。

vendor
string | null

廠商:已建檔廠商名優先,否則用成本列上填寫的廠商名;null = 未填。

amountTwd
number

代墊額(真實成本,TWD 整數)。

invoiceAmountTwd
number

憑證額(外帳可申報金額,TWD 整數)。

isDeclarable
boolean

有無發票憑證。

reviewStatus
string

覆核狀態:掛了支出證明單則用其 status(pending/approved),否則由有無憑證派生。

payables
object[]

應付清單(區塊 3):該期歸屬的請款單(payables)。

payableNumber
string

請款單號(人類可讀)。

tripTitle
string

團名(未綁定梯次的手動請款顯示「未綁定梯次」)。

payeeName
string

受款對象(供應商 / 嚮導 / 派車人等)。

amountTwd
number

請款金額(整數 TWD)。

status
string

draft | submitted | approved | paid | cancelled | rejected。

receivables
object[]

應收清單(區塊 4):該期梯次上的 tour 訂單應收 / 實收 / 待收。

orderNumber
string

訂單編號。

tripTitle
string

團名(該訂單在期間內任一梯次的團名)。

receivableTwd
number

應收金額(TWD 整數)。

receivedTwd
number

實收金額(收款減退款,TWD 整數)。

outstandingTwd
number

待收 = receivable − received。

範例
cairn accrual-ledger get --period
回應
{
  "ok": true,
  "data": {
    "period": "…",
    "departureSummary": [
      {
        "departureId": "…",
        "tripTitle": "…",
        "departureDate": "…",
        "pax": 0,
        "revenueTwd": 0,
        "realCostTwd": 0,
        "grossProfitTwd": 0
      }
    ],
    "costLines": [
      {
        "id": "…",
        "tripTitle": "…",
        "departureDate": "…",
        "category": "…",
        "vendor": "…",
        "amountTwd": 0,
        "invoiceAmountTwd": 0,
        "isDeclarable": true,
        "reviewStatus": "…"
      }
    ],
    "payables": [
      {
        "payableNumber": "…",
        "tripTitle": "…",
        "payeeName": "…",
        "amountTwd": 0,
        "status": "…"
      }
    ],
    "receivables": [
      {
        "orderNumber": "…",
        "tripTitle": "…",
        "receivableTwd": 0,
        "receivedTwd": 0,
        "outstandingTwd": 0
      }
    ]
  }
}
cairn accrual-ledger departure-summary

梯次彙總區塊(收入/成本/毛利)

參數

--period
旗標 · 必填

出團月(格式 YYYY-MM,Asia/Taipei 時區)

--json
旗標 · 選填

回應欄位 · data

period
string

結算期間(YYYY-MM,Asia/Taipei 出團月),回聲請求參數。

departureSummary
object[]

梯次彙總:出團月落於 period 的各梯次收入 / 真實成本 / 毛估毛利。

departureId
string

梯次 ID。

tripTitle
string

團名。

departureDate
string

出團日期(YYYY-MM-DD)。

pax
number

出團人數(該梯次確認人數)。

revenueTwd
number

總收入(梯次成交應收,排除已取消訂單,TWD 整數)。

realCostTwd
number

真實成本合計(TWD 整數)= 房費底價成本 + 已核准的逐筆成本。逐筆成本區塊不含房費 (房費由分房資料另計),故逐筆成本加總會小於此值,差額即房費(設計如此)。

grossProfitTwd
number

毛利毛估 = revenue − realCost(含房費)。

範例
cairn accrual-ledger departure-summary --period
回應
{
  "ok": true,
  "data": {
    "period": "…",
    "departureSummary": [
      {
        "departureId": "…",
        "tripTitle": "…",
        "departureDate": "…",
        "pax": 0,
        "revenueTwd": 0,
        "realCostTwd": 0,
        "grossProfitTwd": 0
      }
    ]
  }
}

cairn cost-templates

成本範本:查詢、明細

cairn cost-templates list

列出成本範本(--active 只回啟用中精簡清單)

參數

--status
旗標 · 選填

依狀態篩選:active 啟用、archived 已封存

--active
旗標 · 選填

啟用時只回傳輕量的 { id, name } 綁定挑選清單(行程設定的成本範本下拉用)

--json
旗標 · 選填

回應欄位 · data[]

id
string

成本範本 id(ct_ 前綴)。

name
string

成本範本名稱。

範例
cairn cost-templates list
回應
{
  "ok": true,
  "data": [
    {
      "id": "…",
      "name": "…"
    }
  ]
}
cairn cost-templates get

單一成本範本完整明細(含成本行)

參數

<id>位置參數 · 必填
--json
旗標 · 選填

回應欄位 · data

lines
object[]

成本行明細(品項 × 單價 × 數量模型)。

id
string

成本行 ID。

templateId
string

所屬成本範本 ID。

category
string

成本分類(如 交通 / 餐費 / 保險)。

vendorName
string | null

供應商 / 廠商名(選填)。

description
string | null

摘要說明(選填)。

unitPriceTwd
number | null

TWD 行的單價;外幣行 null。

currency
string

幣別('TWD' = 台幣行)。

unitPriceForeign
number | null

外幣行的外幣單價;TWD 行 null。

internalRateSource
TemplateRateSource | null

外幣行的內帳匯率來源;TWD 行 null。

fxAccountId
string | null

internalRateSource='fx_account' 時的外幣帳戶 id。

quantityMode
QuantityMode

數量模式:fixed 固定值 / headcount 依人頭公式(ceil(Σ人頭 / 組距))。

quantityFixed
number | null

fixed 模式的固定數量;headcount 模式為 null。

headcountComponents
HeadcountComponent[] | null

headcount 模式選定的人頭 component(passenger / leader / assistant / driver);fixed 為 null。

groupDivisor
number | null

headcount 模式的組距(每 N 人一組,ceil 進位);null = 直接加總。

isDeclarable
boolean

是否預設有合法憑證(帶入成本列的 is_declarable 初值)。

sortOrder
number

顯示排序。

id
string

成本範本 ID。

name
string

範本名稱。

description
string | null

範本說明(選填)。

status
"active" | "archived"

狀態:active 啟用 / archived 已封存。

lineCount
number

成本行數(派生)。

boundTripCount
number

綁定行程數(派生)。

createdAt
Date

建立時間。

updatedAt
Date

最後更新時間。

範例
cairn cost-templates get <id>
回應
{
  "ok": true,
  "data": {
    "lines": [
      {
        "id": "…",
        "templateId": "…",
        "category": "…",
        "vendorName": "…",
        "description": "…",
        "unitPriceTwd": 0,
        "currency": "…",
        "unitPriceForeign": 0,
        "internalRateSource": null,
        "fxAccountId": "…",
        "quantityMode": "…",
        "quantityFixed": 0,
        "headcountComponents": null,
        "groupDivisor": 0,
        "isDeclarable": true,
        "sortOrder": 0
      }
    ],
    "id": "…",
    "name": "…",
    "description": "…",
    "status": "active",
    "lineCount": 0,
    "boundTripCount": 0,
    "createdAt": "2026-06-30T08:00:00.000Z",
    "updatedAt": "2026-06-30T08:00:00.000Z"
  }
}
cairn cost-templates create

建立成本範本

參數

--name <名稱>
旗標 · 必填

成本範本名稱

--description <說明>
旗標 · 選填

成本範本說明

--json
旗標 · 選填

回應欄位 · data

id
string

新建成本範本 ID(ct_ 前綴)。

範例
cairn cost-templates create --name <名稱>
回應
{
  "ok": true,
  "data": {
    "id": "…"
  }
}
cairn cost-templates update

更新成本範本(名稱/說明/狀態)

參數

<id>位置參數 · 必填
--name <名稱>
旗標 · 必填

成本範本名稱

--status
旗標 · 必填

範本狀態:active 啟用、archived 已封存

--description <說明>
旗標 · 選填

成本範本說明

--json
旗標 · 選填

回應欄位 · data

ok
boolean

是否更新成功。

範例
cairn cost-templates update <id> --name <名稱> --status
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn cost-templates add-line

新增成本行(--line 為 JSON:{category,unitPriceTwd,quantityMode,...})

參數

<templateId>位置參數 · 必填
--line
旗標 · 必填

成本明細列:含 category 科目、vendorName 廠商、unitPriceTwd 單價、quantityMode 計量方式(fixed 固定/headcount 人數)與對應數量/人數組成、isDeclarable 是否可報帳等欄位

--json
旗標 · 選填

回應欄位 · data

id
string

新建成本明細行 ID。

範例
cairn cost-templates add-line <templateId> --line
回應
{
  "ok": true,
  "data": {
    "id": "…"
  }
}
cairn cost-templates update-line

更新成本行(--line 為 JSON)

參數

<lineId>位置參數 · 必填
--line
旗標 · 必填

成本明細列更新內容:含 category 科目、vendorName 廠商、unitPriceTwd 單價、quantityMode 計量方式(fixed 固定/headcount 人數)與對應數量/人數組成、isDeclarable 是否可報帳等欄位

--json
旗標 · 選填

回應欄位 · data

ok
boolean

是否更新成功。

範例
cairn cost-templates update-line <lineId> --line
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn cost-templates delete-line

刪除成本行

參數

<lineId>位置參數 · 必填
--json
旗標 · 選填

回應欄位 · data

ok
boolean

是否刪除成功。

範例
cairn cost-templates delete-line <lineId>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}

cairn ledger

內外帳:梯次毛利、逐筆成本、支出證明單、待覆核申報

cairn ledger list

列出各梯次內外帳摘要(毛利 / 可申報 / pending 證明單)

參數

--period
旗標 · 選填
--trip <id>
旗標 · 選填
--window-days
旗標 · 選填
--json
旗標 · 選填
範例
cairn ledger list
cairn ledger get

單一梯次內外帳派生明細

參數

<departureId>位置參數 · 必填
--json
旗標 · 選填
範例
cairn ledger get <departureId>
cairn ledger costs

列出某梯次逐筆成本登記

參數

<departureId>位置參數 · 必填
--created-by <userId>
旗標 · 選填
--json
旗標 · 選填
範例
cairn ledger costs <departureId>
cairn ledger proofs

列出某梯次支出證明單

參數

<departureId>位置參數 · 必填
--json
旗標 · 選填
範例
cairn ledger proofs <departureId>
cairn ledger declarations

列出跨梯次待覆核的嚮導申報成本

參數

--json
旗標 · 選填
範例
cairn ledger declarations
cairn ledger cancelled-departures

列出取消梯次待結轉(殘餘成本 / 是否已結轉特殊損益)

參數

--json
旗標 · 選填
範例
cairn ledger cancelled-departures
cairn ledger cost-create

登記一筆成本(departure_cost.manage)

參數

<departureId>位置參數 · 必填
--category <類別>
旗標 · 必填
--amount <twd>
旗標 · 必填
--vendor
旗標 · 選填
--description
旗標 · 選填
--no-receipt
旗標 · 選填
--invoice-amount
旗標 · 選填
--quantity-mode <fixed|headcount>
旗標 · 選填
--unit-price-twd <twd>
旗標 · 選填
--headcount-components <passenger,leader,assistant,driver>
旗標 · 選填
--group-divisor <n>
旗標 · 選填
--quantity-fixed <n>
旗標 · 選填
--currency <fx_account|published|manual>
旗標 · 選填
--confirm
對 production target 寫入時必帶
範例
cairn ledger cost-create <departureId> --category <類別> --amount <twd>
cairn ledger cost-update

更新一筆成本(departure_cost.manage)

參數

<costId>位置參數 · 必填
--category <類別>
旗標 · 必填
--amount
旗標 · 選填
--vendor
旗標 · 選填
--description
旗標 · 選填
--no-receipt
旗標 · 選填
--invoice-amount
旗標 · 選填
--quantity-mode <fixed|headcount>
旗標 · 選填
--unit-price-twd <twd>
旗標 · 選填
--headcount-components <passenger,leader,assistant,driver>
旗標 · 選填
--group-divisor <n>
旗標 · 選填
--quantity-fixed <n>
旗標 · 選填
--currency
旗標 · 選填
--confirm
對 production target 寫入時必帶
範例
cairn ledger cost-update <costId> --category <類別>
cairn ledger cost-delete

刪除一筆未轉請款的成本(departure_cost.manage)

參數

<costId>位置參數 · 必填
--confirm
對 production target 寫入時必帶
範例
cairn ledger cost-delete <costId>
cairn ledger approve-proof

核准支出證明單(ledger.approve;責任分離)

參數

<proofId>位置參數 · 必填
--confirm
對 production target 寫入時必帶
範例
cairn ledger approve-proof <proofId>
cairn ledger approve-declaration

覆核嚮導自報待覆核成本(ledger.approve;責任分離)

參數

<costId>位置參數 · 必填
--confirm
對 production target 寫入時必帶
範例
cairn ledger approve-declaration <costId>
cairn ledger convert-to-payable

成本轉請款核簽(departure_cost.manage 且 payable.create)

參數

<departureId>位置參數 · 必填
--costs <id1,id2,...>
旗標 · 必填
--payee-name
旗標 · 必填
--payee-type <supplier|guide|staff_commission|other>
旗標 · 選填
--bank-account
旗標 · 選填
--bank-name
旗標 · 選填
--bank-branch
旗標 · 選填
--tax-id
旗標 · 選填
--tax-amount
旗標 · 選填
--submit
旗標 · 選填
--confirm
對 production target 寫入時必帶
範例
cairn ledger convert-to-payable <departureId> --costs <id1,id2,...> --payee-name
cairn ledger convert-cancelled

結轉取消梯次殘餘成本為公司特殊損益(operating_expense.manage)

參數

--departure <id>
旗標 · 必填
--category <expenseCategoryId>
旗標 · 必填
--amount <twd>
旗標 · 必填
--period
旗標 · 必填
--description
旗標 · 必填
--note
旗標 · 選填
--confirm
對 production target 寫入時必帶
範例
cairn ledger convert-cancelled --departure <id> --category <expenseCategoryId> --amount <twd> --period --description
cairn ledger revert-cancelled

撤銷取消梯次的結轉(operating_expense.manage)

參數

--departure <id>
旗標 · 必填
--confirm
對 production target 寫入時必帶
範例
cairn ledger revert-cancelled --departure <id>

cairn payouts

出款批次:彙整 preview、出帳帳戶、批次轉帳檔

cairn payouts aggregate

建批前彙整 preview(當月已核准未付 payable 依收款對象 group)

參數

--period <YYYY-MM>
旗標 · 必填

出款月份(YYYY-MM),彙整該月已核准未付的應付

--scope <guide|supplier|staff>
旗標 · 必填

收款對象範圍(guide 領隊嚮導 / supplier 供應商 / staff 員工)

--json
旗標 · 選填

回應欄位 · data[]

payeeType
PayoutPayeeType

收款對象類型:guide 領隊嚮導 / supplier 供應商 / staff 員工。

payeeRefId
string

收款對象識別 key:供應商為其 ID,領隊 / 員工為收款人姓名。

payeeName
string

收款對象名稱。

payeeAccountName
string | null

收款人戶名(supplier 取 suppliers / guide 取 guides;staff 暫無主檔 → null)。

payeeBankCode
string | null

收款銀行代號(同上來源;無主檔為 null)。

payeeAccountNumber
string | null

收款帳號(同上來源;無主檔為 null,遮罩回傳)。

grossTwd
number

當月已核准未付的請款單淨額合計(TWD 整數)。

items
object[]

彙整明細(日期 + 團名 + 金額,唯讀派生,不另存)。

payableId
string

請款單 ID。

payableNumber
string

請款單人類可讀單號。

date
string | null

梯次出發日('YYYY-MM-DD');無連梯次時 null。

tripLabel
string | null

團名;無連梯次時 null。

amountTwd
number

該請款單的應付淨額(TWD 整數)。

範例
cairn payouts aggregate --period <YYYY-MM> --scope <guide|supplier|staff>
回應
{
  "ok": true,
  "data": [
    {
      "payeeType": "…",
      "payeeRefId": "…",
      "payeeName": "…",
      "payeeAccountName": "…",
      "payeeBankCode": "…",
      "payeeAccountNumber": "…",
      "grossTwd": 0,
      "items": [
        {
          "payableId": "…",
          "payableNumber": "…",
          "date": "…",
          "tripLabel": "…",
          "amountTwd": 0
        }
      ]
    }
  ]
}
cairn payouts remit-accounts

出帳帳戶選項(收款帳戶目錄)

參數

--json
旗標 · 選填

回應欄位 · data[]

id
string

收款帳戶 ID。

code
string

帳戶代碼(租戶內唯一穩定識別)。

displayName
string

帳戶顯示名。

kind
ReceivingAccountKind

帳戶類型:bank 銀行 / cash 現金 / gateway 金流閘道。

bankName
string | null

銀行名稱;現金/閘道帳戶為 null。

accountNo
string | null

銀行帳號;現金/閘道帳戶為 null。

canReceive
boolean

可收款(幾乎都 true)。

canRemit
boolean

可對外匯款(ATM / 匯出退款 / 補款匯出)。荒野只有永豐。

canChargeback
boolean

可刷退(退回原信用卡)。荒野只有綠界(gateway)。

isDeprecated
boolean

廢帳戶:仍可零星收款,但其收款需由他帳戶代墊歸集。荒野=RU 台銀 / 登山社。

isSettlementMaster
boolean

主結算帳戶:所有資金最終向它彙整。每租戶恰一個(partial unique index)。荒野=永豐。

currency
string

帳戶幣別(ISO 4217;既有帳戶皆 'TWD',外幣帳戶如 IDR / USD)。

isActive
boolean

此帳戶是否啟用。

displayOrder
number

後台清單排序序位(小者在前)。

usedCount
number

被多少 payment_transactions 引用(UI 鎖頭 / 「使用中 N」)。

createdAt
Date

建立時間。

updatedAt
Date

最後更新時間。

範例
cairn payouts remit-accounts
回應
{
  "ok": true,
  "data": [
    {
      "id": "…",
      "code": "…",
      "displayName": "…",
      "kind": "…",
      "bankName": "…",
      "accountNo": "…",
      "canReceive": true,
      "canRemit": true,
      "canChargeback": true,
      "isDeprecated": true,
      "isSettlementMaster": true,
      "currency": "…",
      "isActive": true,
      "displayOrder": 0,
      "usedCount": 0,
      "createdAt": "2026-06-30T08:00:00.000Z",
      "updatedAt": "2026-06-30T08:00:00.000Z"
    }
  ]
}
cairn payouts transfer-file

出款批次標準四欄批次轉帳檔

參數

<pob_id>位置參數 · 必填
--format
旗標 · 選填

輸出格式:json 完整匯出(預設)或 csv 僅回傳轉帳檔字串

--json
旗標 · 選填
範例
cairn payouts transfer-file <pob_id>
回應
{
  "ok": true,
  "data": "…"
}
cairn payouts create-batch

建立出款批次草稿(gross + 通用扣款項 → draft,不 mark paid)

參數

--period <YYYY-MM>
旗標 · 必填

出款月份(YYYY-MM)

--scope <guide|supplier|staff>
旗標 · 必填
--account <acct_id>
旗標 · 選填
--lines <json|@file>
旗標 · 必填

納入批次的出款列(至少一列)

--confirm
對 production target 寫入時必帶

回應欄位 · data

id
string

新建立出款批次的 ID(pob_ 前綴)。

範例
cairn payouts create-batch --period <YYYY-MM> --scope <guide|supplier|staff> --lines <json|@file>
回應
{
  "ok": true,
  "data": {
    "id": "…"
  }
}
cairn payouts confirm-batch

確認出款批次(draft → confirmed:mark paid + 記出帳)

參數

<pob_id>位置參數 · 必填
--bank-ref <ref>
旗標 · 選填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

固定為 true:出款批次已確認送出。

範例
cairn payouts confirm-batch <pob_id>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn payouts issue-confirm-token

為供應商批次列簽發廠商自助確認 token(idempotent,回 token)

參數

<pobl_id>位置參數 · 必填
--confirm
對 production target 寫入時必帶

回應欄位 · data

token
string

廠商自助確認 token(拼成對外確認頁網址;idempotent,重複簽發回原 token)。

範例
cairn payouts issue-confirm-token <pobl_id>
回應
{
  "ok": true,
  "data": {
    "token": "…"
  }
}

cairn pnl

公司損益:營業費用台帳、費用科目、月損益表

cairn pnl expenses

列出公司營業費用(list)

參數

--period
旗標 · 選填

歸屬月(格式 YYYY-MM);只列出該月的費用

--kind
旗標 · 選填

費用大類:opex 營業費用、tax 稅、platform_fee 平台手續費、special 特殊損益

--category
旗標 · 選填

費用類別 ID;只列出該類別的費用

--json
旗標 · 選填

回應欄位 · data[]

id
string

費用列 ID。

categoryId
string

費用科目 ID。

categoryCode
string | null

費用科目代碼(如 rent / salary_admin)。

categoryDisplayName
string | null

費用科目顯示名。

categoryKind
string | null

費用科目大類(opex / tax / platform_fee / special)。

period
string

歸屬月(YYYY-MM,損益表據此彙整;可與支付日不同月)。

incurredOn
string | null

發生 / 支付日期(YYYY-MM-DD);金流商內扣 / 攤提無單一發生日者為 null。

amountTwd
number

金額(整數 TWD)。

description
string

摘要(廠商 / 品名,如 台中房租 / 委外廣告投放)。

paidFromAccountId
string | null

出帳帳戶 ID;金流商內扣者為 null。

paidFromAccountName
string | null

出帳帳戶顯示名。

frontedByUserId
string | null

代墊者 user ID;非空代表由此人代墊待回補(走請款回補代墊者)。

frontedByName
string | null

代墊者姓名。

payableId
string | null

若走出款核簽,連結的請款單 ID;否則 null。

payableNumber
string | null

連結請款單的人類可讀單號。

recurring
boolean

月固定標記(人工登記時備註「月固定」;自動生成走範本表,非此欄)。

status
"confirmed" | "draft"

'draft'(月固定範本自動生成、待確認,不入損益)| 'confirmed'(計入損益)。

origin
"manual" | "recurring" | "departure_conversion"

'manual'(手動登記)| 'recurring'(月固定範本自動生成)| 'departure_conversion'(取消梯次結轉,§3.4)。

sourceTemplateId
string | null

生成來源範本(origin='recurring');手動登記為 null。

note
string | null

備註。

createdByUserId
string

經手人 user ID(建立此費用列者)。

createdAt
Date

建立時間。

updatedAt
Date

最後更新時間。

範例
cairn pnl expenses
回應
{
  "ok": true,
  "data": [
    {
      "id": "…",
      "categoryId": "…",
      "categoryCode": "…",
      "categoryDisplayName": "…",
      "categoryKind": "…",
      "period": "…",
      "incurredOn": "…",
      "amountTwd": 0,
      "description": "…",
      "paidFromAccountId": "…",
      "paidFromAccountName": "…",
      "frontedByUserId": "…",
      "frontedByName": "…",
      "payableId": "…",
      "payableNumber": "…",
      "recurring": true,
      "status": "confirmed",
      "origin": "manual",
      "sourceTemplateId": "…",
      "note": "…",
      "createdByUserId": "…",
      "createdAt": "2026-06-30T08:00:00.000Z",
      "updatedAt": "2026-06-30T08:00:00.000Z"
    }
  ]
}
cairn pnl expense-categories

列出費用科目目錄(list)

參數

--active-only
旗標 · 選填

是否只回傳啟用中的費用類別;預設含停用列

--json
旗標 · 選填

回應欄位 · data[]

id
string

費用類別 ID。

code
string

科目代碼(租戶內唯一穩定識別,如 rent / salary_admin / tax_vat)。

displayName
string

顯示名(如 房租 / 行政薪資 / 營業稅)。

kind
"opex" | "tax" | "platform_fee" | "special"

費用大類:opex 營業費用 / tax 稅 / platform_fee 平台手續費 / special 特殊損益(損益表據此 roll-up)。

isActive
boolean

是否啟用(停用不刪,既有費用列仍引用得到)。

createdAt
Date

建立時間。

updatedAt
Date

最後更新時間。

範例
cairn pnl expense-categories
回應
{
  "ok": true,
  "data": [
    {
      "id": "…",
      "code": "…",
      "displayName": "…",
      "kind": "opex",
      "isActive": true,
      "createdAt": "2026-06-30T08:00:00.000Z",
      "updatedAt": "2026-06-30T08:00:00.000Z"
    }
  ]
}
cairn pnl expense-create

登錄一筆公司營業費用(與梯次無關;歸屬月供月損益彙整)

參數

--category <id>
旗標 · 必填

費用類別 ID;只列出該類別的費用

--period <YYYY-MM>
旗標 · 必填

歸屬月(格式 YYYY-MM);只列出該月的費用

--description <t>
旗標 · 必填

費用摘要

--amount <twd>
旗標 · 必填
--paid-from
旗標 · 選填
--fronted-by
旗標 · 選填
--incurred-on
旗標 · 選填

費用發生日期(格式 YYYY-MM-DD)

--note
旗標 · 選填

備註

--recurring
旗標 · 選填

是否為週期性費用

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

固定為 true:營業費用列已新增。

id
string

新建立營業費用列的 ID(opx_ 前綴)。

範例
cairn pnl expense-create --category <id> --period <YYYY-MM> --description <t> --amount <twd>
回應
{
  "ok": true,
  "data": {
    "ok": true,
    "id": "…"
  }
}
cairn pnl expense-update

更正一筆公司營業費用(整列覆寫;payable 連結須帶回)

參數

<id>位置參數 · 必填
--category <id>
旗標 · 必填
--period <YYYY-MM>
旗標 · 必填

歸屬月(格式 YYYY-MM),供月損益表彙整

--description <t>
旗標 · 必填

費用摘要

--amount <twd>
旗標 · 必填
--paid-from
旗標 · 選填
--fronted-by
旗標 · 選填
--incurred-on
旗標 · 選填

費用發生日期(格式 YYYY-MM-DD)

--note
旗標 · 選填

備註

--payable-id
旗標 · 選填

關聯的請款核簽 ID;整列覆寫時須原樣帶回,省略則清為 null

--recurring
旗標 · 選填

是否為週期性費用

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

固定為 true:營業費用列已更新。

範例
cairn pnl expense-update <id> --category <id> --period <YYYY-MM> --description <t> --amount <twd>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn pnl statement

公司月損益表(各區毛利→公司淨利)

參數

--period
旗標 · 必填

損益表結算月(格式 YYYY-MM)

--extra-income
旗標 · 選填

額外收入(台幣非負整數),併入公司淨利計算;預設 0

--json
旗標 · 選填

回應欄位 · data

period
string

結算期間(YYYY-MM)。

regions
object[]

各區毛利明細(出團月落 period 的梯次按區 roll-up)。

region
string

派生 region key(穩定,由 trip 屬性派生)。

label
string

顯示標籤(destination 原文 / 衍生)。

revenueTwd
number

本區成交應收(出團月落 period 的梯次合計,TWD 整數)。

directCostTwd
number

本區真實直接成本(TWD 整數)= 房費底價成本 + 已核准的逐筆成本合計。

marginTwd
number

本區毛利 = revenue − directCost。

departures
number

本區梯次數(出團月落 period)。

grossMarginTwd
number

各區毛利加總(整數 TWD)。

revenueTotalTwd
number

各區營收加總(整數 TWD)。

extraIncomeTwd
number

額外收入(GS 二、額外收入總計;本批無 schema 載體 → 0,見 §5)。

adminFeeIncomeTwd
number

行政手續費收入(退款收取的行政手續費,只計未出團 / 取消單,TWD 整數)。

otherIncomeTwd
number

其他收入合計 = extraIncome + adminFeeIncome(整數 TWD)。

expensesByKind
object[]

公司營業費用按 kind roll-up(opex / tax / platform_fee,只計已確認)。

kind
string

'opex' / 'tax' / 'platform_fee'。

amountTwd
number

該 kind 本期費用合計(整數 TWD)。

count
number

該 kind 本期費用筆數。

operatingExpenseTotalTwd
number

公司營業費用合計 = Σ opex / tax / platform_fee(整數 TWD)。

special
object[]

特殊損益逐筆(kind='special',一次性、獨立列,只計已確認)。

id
string

費用列 ID。

categoryId
string

費用科目 ID(特殊損益科目)。

categoryDisplayName
string | null

費用科目顯示名。

description
string

摘要(如 取消神山床位沒收訂金)。

amountTwd
number

金額(整數 TWD ≥ 0,DB CHECK operating_expenses_amount_nonneg)。**第一版 special 一律視為「損」**(扣減淨利,與營業費用同向)——對齊 GS 五月事件「取消神山床位沒收」= 損。schema 無 sign 欄,無法表達一次性「益」;一次性收益(§3.4)落地 sign 欄後再分流, 屆時 specialTotal 改帶號。當前 specialTotalTwd 一律從淨利扣減。

specialTotalTwd
number

特殊損益加總(整數 TWD,第一版一律視為損)。

netProfitTwd
number

公司淨利 = grossMargin + otherIncome − operatingExpenseTotal − specialTotal。

netMarginPct
number | null

淨利率(netProfit / revenueTotal),revenue=0 時 null。

範例
cairn pnl statement --period
回應
{
  "ok": true,
  "data": {
    "period": "…",
    "regions": [
      {
        "region": "…",
        "label": "…",
        "revenueTwd": 0,
        "directCostTwd": 0,
        "marginTwd": 0,
        "departures": 0
      }
    ],
    "grossMarginTwd": 0,
    "revenueTotalTwd": 0,
    "extraIncomeTwd": 0,
    "adminFeeIncomeTwd": 0,
    "otherIncomeTwd": 0,
    "expensesByKind": [
      {
        "kind": "…",
        "amountTwd": 0,
        "count": 0
      }
    ],
    "operatingExpenseTotalTwd": 0,
    "special": [
      {
        "id": "…",
        "categoryId": "…",
        "categoryDisplayName": "…",
        "description": "…",
        "amountTwd": 0
      }
    ],
    "specialTotalTwd": 0,
    "netProfitTwd": 0,
    "netMarginPct": 0
  }
}

cairn reports

財務報表:月結摘要(實收現金口徑,tour-scoped)

cairn reports monthly

月結財務摘要(KPI + 行程排行 + 金流商分布)

參數

--year <YYYY>
旗標 · 必填

報表年份(西元四位數),月界以台北時區計

--month <1-12>
旗標 · 必填

報表月份,1 至 12

--json
旗標 · 選填

回應欄位 · data

year
number

報表年份(西元四位數)。

month
number

報表月份(1-12,月界以 Asia/Taipei 計)。

totalOrders
number

本月建立的 tour 訂單數(依 created_at 計)。

paidOrders
number

本月有實收現金的 tour 訂單數(月內有 inbound 交易)。

cancelledOrders
number

本月取消的 tour 訂單數(依 updated_at 計)。

totalRevenue
number

collected_cash:本月實收現金 = SUM(payment_transactions in) within month。

refundedAmount
number

refunded_cash:本月退還現金 = SUM(payment_transactions out, refund/chargeback) within month。

netCash
number

net_cash:本月淨現金 = SUM(in:+amount, out:-amount) - SUM(fee) within month。

newCustomers
number

本月新註冊會員數(排除 staff 角色)。

byTrip
object[]

依行程銷售排行(前 10 名,按本月實收現金)。

tripId
string

行程 ID。

tripTitle
string

團名。

orderCount
number

該行程本月有實收現金的訂單數。

revenue
number

collected_cash by trip:本月實收現金(tour-scoped)。

byProvider
object[]

依金流商分組的本月實收現金。

provider
string

金流商代碼(如 ecpay / test)。

orderCount
number

該金流商本月有實收現金的訂單數。

amount
number

collected_cash by provider:本月實收現金(tour-scoped)。

dailyRevenue
object[]

collected_cash by day:本月逐日實收現金(tour-scoped,Asia/Taipei 日界), 整月零填滿(無入帳的日子 amount=0)。Σ amount === totalRevenue,與 KPI 對帳。

day
string

日期(YYYY-MM-DD,Asia/Taipei 日界)。

amount
number

當日實收現金(tour-scoped,整數 TWD)。

範例
cairn reports monthly --year <YYYY> --month <1-12>
回應
{
  "ok": true,
  "data": {
    "year": 0,
    "month": 0,
    "totalOrders": 0,
    "paidOrders": 0,
    "cancelledOrders": 0,
    "totalRevenue": 0,
    "refundedAmount": 0,
    "netCash": 0,
    "newCustomers": 0,
    "byTrip": [
      {
        "tripId": "…",
        "tripTitle": "…",
        "orderCount": 0,
        "revenue": 0
      }
    ],
    "byProvider": [
      {
        "provider": "…",
        "orderCount": 0,
        "amount": 0
      }
    ],
    "dailyRevenue": [
      {
        "day": "…",
        "amount": 0
      }
    ]
  }
}

cairn suppliers

廠商目錄:查詢、明細

cairn suppliers list

列出/搜尋廠商目錄

參數

--status
旗標 · 選填

依狀態篩選(active 啟用 / inactive 停用 / all 全部,預設 active)

--q
旗標 · 選填

關鍵字搜尋(廠商名稱或類別)

--json
旗標 · 選填

回應欄位 · data[]

id
string

廠商 ID。

name
string

廠商名稱。

categoryHint
string | null

慣用類別提示(租戶自定,非硬枚舉)。

payeeAccountName
string | null

收款人戶名(批次轉帳檔欄 (1))。

payeeBankCode
string | null

收款銀行代號(批次轉帳檔欄 (3))。

payeeAccountNumber
string | null

收款帳號(批次轉帳檔欄 (2),遮罩回傳)。

status
SupplierStatus

狀態:active 啟用 / inactive 停用(停用不刪)。

createdAt
Date

建立時間。

updatedAt
Date

最後更新時間。

範例
cairn suppliers list
回應
{
  "ok": true,
  "data": [
    {
      "id": "…",
      "name": "…",
      "categoryHint": "…",
      "payeeAccountName": "…",
      "payeeBankCode": "…",
      "payeeAccountNumber": "…",
      "status": "…",
      "createdAt": "2026-06-30T08:00:00.000Z",
      "updatedAt": "2026-06-30T08:00:00.000Z"
    }
  ]
}
cairn suppliers get

單一廠商明細(含遮罩收款資料)

參數

<sup_id>位置參數 · 必填
--json
旗標 · 選填

回應欄位 · data

id
string

廠商 ID。

name
string

廠商名稱。

categoryHint
string | null

慣用類別提示(租戶自定,非硬枚舉)。

payeeAccountName
string | null

收款人戶名(批次轉帳檔欄 (1))。

payeeBankCode
string | null

收款銀行代號(批次轉帳檔欄 (3))。

payeeAccountNumber
string | null

收款帳號(批次轉帳檔欄 (2),遮罩回傳)。

status
SupplierStatus

狀態:active 啟用 / inactive 停用(停用不刪)。

createdAt
Date

建立時間。

updatedAt
Date

最後更新時間。

範例
cairn suppliers get <sup_id>
回應
{
  "ok": true,
  "data": {
    "id": "…",
    "name": "…",
    "categoryHint": "…",
    "payeeAccountName": "…",
    "payeeBankCode": "…",
    "payeeAccountNumber": "…",
    "status": "…",
    "createdAt": "2026-06-30T08:00:00.000Z",
    "updatedAt": "2026-06-30T08:00:00.000Z"
  }
}
cairn suppliers create

新增廠商(出款對象主檔;進階會計模組)

參數

--name <n>
旗標 · 必填

廠商名稱(出款對象顯示名)

--category
旗標 · 選填
--payee-name
旗標 · 選填
--bank-code
旗標 · 選填
--account-number
旗標 · 選填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

固定為 true:廠商已新增。

id
string

新建立廠商的 ID(sup_ 前綴)。

範例
cairn suppliers create --name <n>
回應
{
  "ok": true,
  "data": {
    "ok": true,
    "id": "…"
  }
}
cairn suppliers update

編輯廠商(partial:省略=保留;帳號 write-only,留空不變更)

參數

<sup_id>位置參數 · 必填
--name
旗標 · 選填

廠商名稱(出款對象顯示名)

--category
旗標 · 選填
--payee-name
旗標 · 選填
--bank-code
旗標 · 選填
--account-number
旗標 · 選填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

固定為 true:廠商資料已更新。

範例
cairn suppliers update <sup_id>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}

cairn audit

稽核日誌:查詢、統計(唯讀)

cairn audit list

列出/篩選稽核紀錄

參數

--action
旗標 · 選填

動作代碼篩選,例如 order.update(比對稽核事件的動作)

--actor
旗標 · 選填

操作者篩選,比對執行該動作的使用者 ID

--entity
旗標 · 選填

目標實體篩選,比對被操作對象的類型或 ID

--from
旗標 · 選填

起始時間(ISO 8601),僅回傳此時間之後的事件

--to
旗標 · 選填

結束時間(ISO 8601),僅回傳此時間之前的事件

--limit
旗標 · 選填

回傳筆數上限,最多 1000 筆

--json
旗標 · 選填

回應欄位 · data[]

id
string

稽核事件 ID。

actorUserId
string | null

操作者的使用者 ID;系統事件(webhook/排程等非人為列)為 null。

actorEmail
string | null

操作者 Email;系統事件或帳號已刪時為 null。

actorName
string | null

操作者顯示名;系統事件或帳號已刪時為 null。

action
string

動作代碼,例如 order.create、traveler.decrypt。

targetType
string

被操作對象的類型,例如 order、member。

targetId
string

被操作對象的 ID。

metadata
unknown

該事件的附帶內容(欄位隨動作而異的自由結構 JSON)。

ipAddress
string | null

發起請求的來源 IP;無法取得時為 null。

createdAt
Date

事件發生時間。

範例
cairn audit list
回應
{
  "ok": true,
  "data": [
    {
      "id": "…",
      "actorUserId": "…",
      "actorEmail": "…",
      "actorName": "…",
      "action": "…",
      "targetType": "…",
      "targetId": "…",
      "metadata": "…",
      "ipAddress": "…",
      "createdAt": "2026-06-30T08:00:00.000Z"
    }
  ]
}
cairn audit stats

稽核 KPI 統計

參數

--actor
旗標 · 選填

操作者使用者 ID,指定時將統計數據限縮至該操作者

--json
旗標 · 選填

回應欄位 · data

eventsThisMonth
number

本月(Asia/Taipei)稽核事件總數。

eventsToday
number

今日(Asia/Taipei)稽核事件總數。

writesThisMonth
number

本月寫入類事件數(排除 *.read 讀取事件)。

distinctActorsThisMonth
number

本月有動作紀錄的不重複操作者人數。

範例
cairn audit stats
回應
{
  "ok": true,
  "data": {
    "eventsThisMonth": 0,
    "eventsToday": 0,
    "writesThisMonth": 0,
    "distinctActorsThisMonth": 0
  }
}

cairn leaderboard

業績排行:每位業務成交應收業績、待派發 KPI(admin-only)

cairn leaderboard list

全公司業務業績排行

參數

--period
旗標 · 選填

業績統計區間:當月、當季、當年或全部,預設 month

--json
旗標 · 選填

回應欄位 · data[]

userId
string

業務的使用者 ID。

name
string

業務顯示姓名。

email
string

業務登入 Email。

role
string

業務角色代碼(admin/sales/op/accountant)。

orderCount
number

承作訂單總數(歸屬此業務、含各狀態的旅遊團訂單)。

paidCount
number

已成交訂單數(已付款或履約完成)。

cancelledCount
number

已取消訂單數。

revenue
number

業績額(TWD 整數):歸屬於該業務、未取消訂單的應收合計。

commissionTwd
number

估算佣金 = round(revenue × sales_commission_bps / 10000)(tenant_settings 費率)。

bonusTwd
number

月度第一名加碼 = round(revenue × monthly_top_bonus_bps / 10000),僅當期 rank 1 且 revenue > 0;其餘為 0。與 isMonthlyTop 同步。

isMonthlyTop
boolean

當期 rank 1(revenue > 0)=月度第一,享 bonus。

avgOrderTwd
number

客單均價 = round(revenue / orderCount);0 單為 0。

範例
cairn leaderboard list
回應
{
  "ok": true,
  "data": [
    {
      "userId": "…",
      "name": "…",
      "email": "…",
      "role": "…",
      "orderCount": 0,
      "paidCount": 0,
      "cancelledCount": 0,
      "revenue": 0,
      "commissionTwd": 0,
      "bonusTwd": 0,
      "isMonthlyTop": true,
      "avgOrderTwd": 0
    }
  ]
}
cairn leaderboard review-stats

待派發訂單 KPI

參數

--json
旗標 · 選填

回應欄位 · data

pendingCount
number

待派發(pending_review)訂單筆數。

pendingTotalTwd
number

待派發訂單的應收金額合計(新台幣)。

longestWaitHours
number

目前待派發訂單中,最長已等待的時數。

thisMonthAssigned
number

本月(Asia/Taipei)已完成派發的訂單數。

範例
cairn leaderboard review-stats
回應
{
  "ok": true,
  "data": {
    "pendingCount": 0,
    "pendingTotalTwd": 0,
    "longestWaitHours": 0,
    "thisMonthAssigned": 0
  }
}

cairn message-templates

罐頭訊息範本:查詢、明細

cairn message-templates list

列出訊息範本(可依通道過濾)

參數

--channel
旗標 · 選填
--json
旗標 · 選填
對應端點GET /api/v1/message-templates${query
範例
cairn message-templates list
cairn message-templates get

單一訊息範本完整明細

參數

<id>位置參數 · 必填
--json
旗標 · 選填

回應欄位 · data

id
string

範本 ID。

key
string | null

穩定識別碼(NULL = 未指定)。

stage
"受理" | "審核不通過" | "未成團通知" | "中籤通知" | "行前說明" | "收尾款" | "訂餐調查" | "裝備調查" | "出團完成"

SOP 階段(受理 → 出團完成)。

channel
"email" | "line"

發送管道:line 或 email。

title
string

範本標題。

bodySingle
string

單人版內文(含 {{...}} 合併變數)。

bodyMulti
string | null

多人版變體;NULL = 只有單人版。

isActive
boolean

是否為該階段目前啟用的範本。

createdAt
Date

建立時間。

updatedAt
Date

最後更新時間。

updatedBy
string | null

最後更新者姓名(LEFT JOIN 同庫 user;未知 / 帳號已刪為 null)。

範例
cairn message-templates get <id>
回應
{
  "ok": true,
  "data": {
    "id": "…",
    "key": "…",
    "stage": "受理",
    "channel": "email",
    "title": "…",
    "bodySingle": "…",
    "bodyMulti": "…",
    "isActive": true,
    "createdAt": "2026-06-30T08:00:00.000Z",
    "updatedAt": "2026-06-30T08:00:00.000Z",
    "updatedBy": "…"
  }
}
cairn message-templates create

新增訊息範本

參數

--stage <stage>
旗標 · 必填

訊息對應的 SOP 階段

--channel <line|email>
旗標 · 必填

依發送管道篩選範本(line 或 email)

--title <t>
旗標 · 必填

範本標題(供後台辨識)

--body-single <b>
旗標 · 必填

單人版訊息內文

--key <K>
旗標 · 選填

範本識別碼,2–64 碼大寫英數 / _ / -(用於程式化引用,選填,自動轉大寫)

--body-multi <b>
旗標 · 選填

多人版訊息內文(留空表示沿用單人版;選填)

--inactive
旗標 · 選填
--confirm
對 production target 寫入時必帶

回應欄位 · data

id
string

新建立的訊息範本 ID。

範例
cairn message-templates create --stage <stage> --channel <line|email> --title <t> --body-single <b>
回應
{
  "ok": true,
  "data": {
    "id": "…"
  }
}
cairn message-templates update

更新訊息範本(全量覆寫)

參數

<id>位置參數 · 必填
--stage <stage>
旗標 · 必填

訊息對應的 SOP 階段

--channel <line|email>
旗標 · 必填

發送管道(line 或 email)

--title <t>
旗標 · 必填

範本標題(供後台辨識)

--body-single <b>
旗標 · 必填

單人版訊息內文

--key <K>
旗標 · 選填

範本識別碼,2–64 碼大寫英數 / _ / -(用於程式化引用,選填,自動轉大寫)

--body-multi <b>
旗標 · 選填

多人版訊息內文(留空表示沿用單人版;選填)

--inactive
旗標 · 選填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

是否成功更新訊息範本。

範例
cairn message-templates update <id> --stage <stage> --channel <line|email> --title <t> --body-single <b>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn message-templates set-active

啟用 / 停用訊息範本

參數

<id>位置參數 · 必填
--active
旗標 · 必填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

是否成功切換訊息範本的啟用狀態。

範例
cairn message-templates set-active <id> --active
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn message-templates delete

刪除訊息範本(硬刪,清除草稿)

參數

<id>位置參數 · 必填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

是否成功刪除訊息範本。

範例
cairn message-templates delete <id>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}

cairn roles

RBAC 角色:列表、明細、權限目錄

cairn roles list

列出所有角色(內建 + 自訂)

參數

--system
旗標 · 選填
--custom
旗標 · 選填
--json
旗標 · 選填
對應端點GET /api/v1/roles:param
範例
cairn roles list
cairn roles get

單一角色 + 完整權限矩陣

參數

<roleId>位置參數 · 必填
--json
旗標 · 選填

回應欄位 · data

id
string

角色 ID(內建角色為其代碼)。

name
string

角色代碼(小寫英數與底線,建立後不可改;即帳號綁定的角色值)。

label
string

角色顯示名稱。

isSystem
boolean

是否為系統內建角色(內建角色不可修改或刪除)。

permissions
object[]

此角色授予的完整 (resource, action) 權限清單。

resource
string

權限資源代碼,例如 order、member。

action
string

權限動作代碼,例如 read、update。

範例
cairn roles get <roleId>
回應
{
  "ok": true,
  "data": {
    "id": "…",
    "name": "…",
    "label": "…",
    "isSystem": true,
    "permissions": [
      {
        "resource": "…",
        "action": "…"
      }
    ]
  }
}
cairn roles catalog

列出權限目錄(每個 resource 的可授權 action)

參數

--json
旗標 · 選填

回應欄位 · data[]

resource
string

權限資源代碼,例如 order、member。

actions
string[]

此資源可授予的動作代碼清單,例如 read、update。

範例
cairn roles catalog
回應
{
  "ok": true,
  "data": [
    {
      "resource": "…",
      "actions": [
        "…"
      ]
    }
  ]
}
cairn roles create

新增自訂角色(name + label + 權限)

參數

--name <code>
旗標 · 必填

角色代碼,小寫英數與底線、2–32 字且須以字母開頭,建立後不可改

--label <顯示名>
旗標 · 必填

角色顯示名稱,呈現於後台角色清單

--permissions
旗標 · 選填

此角色授予的權限清單,每筆為一組資源與動作

--confirm
對 production target 寫入時必帶

回應欄位 · data

id
string

新建立的角色 ID。

對應端點POST /api/v1/roles
範例
cairn roles create --name <code> --label <顯示名>
回應
{
  "ok": true,
  "data": {
    "id": "…"
  }
}
cairn roles update

更新自訂角色顯示名與權限(整組覆寫)

參數

<roleId>位置參數 · 必填
--label <顯示名>
旗標 · 必填

角色顯示名稱,呈現於後台角色清單

--permissions
旗標 · 選填

完整取代後的權限清單,會整批覆寫此角色現有權限

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

是否成功更新角色。

範例
cairn roles update <roleId> --label <顯示名>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn roles delete

刪除自訂角色(仍有成員使用時拒絕)

參數

<roleId>位置參數 · 必填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

是否成功刪除角色。

範例
cairn roles delete <roleId>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}

cairn settings

租戶設定:公司檔 / 收款帳戶 / 費用類別 / 模組 / 寄件網域

cairn settings get

租戶設定單例(公司檔 / 指派模式 / SEO / 寄件網域;ECPay 憑證一律遮罩)

參數

--json
旗標 · 選填

回應欄位 · data

id
string

設定列 ID(單例,恆為 'singleton')。

companyName
string | null

公司全名,顯示於發票、合約與對外信件抬頭;null = 未設定。

companyPhone
string | null

公司聯絡電話,顯示於對外文件;null = 未設定。

taxId
string | null

公司統一編號(8 位數字),用於開立發票;null = 未設定。

companyAddress
string | null

公司登記地址,顯示於對外文件;null = 未設定。

logoUrl
string | null

公司 Logo 圖片網址,用於後台與對外頁面品牌呈現;null = 未設定。

siteTagline
string | null

公開站標語(SEO/首頁);null = 未設定。

seoDefaultDescription
string | null

公開站預設 SEO meta description;null = 未設定。

ogImageUrl
string | null

社群分享預設 Open Graph 圖片網址;null = 未設定。

emailReplyTo
string | null

系統寄信時的回覆收件信箱;null = 未設定。

assignmentMode
string

S5: 'auto_round_robin' | 'auto_customer_choice' | 'manual_review'

defaultAssigneeUserId
string | null

S5: fallback assignee when round-robin finds no active sales, etc.

allowSalesClaim
boolean

order-assignment §6:業務自派搶單開關(per-tenant opt-in,預設 false)。

passportExpiryWarningDays
number

護照效期提醒天數(document-expiry §4.1;NOT NULL DEFAULT 180)。

groupCodePattern
string | null

團號 token 樣板(如 '{YY}{region}{airline?}{MMDD}{seq}')。NULL = 內建預設。

groupCodeSeqStyle
string

序號樣式:'alpha' | 'alpha_no_io' | 'numeric'(NOT NULL DEFAULT 'alpha')。

groupCodeSeqWidth
number

numeric 序號補零寬度(NOT NULL DEFAULT 2;alpha 樣式忽略)。

ecpayFeeBps
number

預估綠界手續費率(270 = 2.70%)。NOT NULL DEFAULT 270。

fongshouFeeBps
number

預估豐收款手續費率(50 = 0.50%)。NOT NULL DEFAULT 50。

profitTaxBps
number

預估發票 / 營所稅率(500 = 5.00%)。NOT NULL DEFAULT 500。

salesCommissionBps
number

業務抽成率(1000 = 10.00%)。NOT NULL DEFAULT 1000。

monthlyTopBonusBps
number

月度第一名加碼率(500 = 5.00%)。NOT NULL DEFAULT 500。

ecpayMerchantId
string | null

ECPay 特店 ID(明文,顯示用)。null = 未綁定租戶憑證(走 env 過渡)。

ecpaySecretsMask
string | null

ECPay HashKey/HashIV 的遮罩碼(`****` + 末 4)。DTO **只暴露 mask**, 整包 EncryptedField(含密文)永不出 repo —— 顯示用零 KMS 呼叫。

travelinvoiceMerchantId
string | null

代收轉付 travelinvoice 特店 ID(明文,顯示用)。null = 未綁定租戶憑證(fail-closed)。

travelinvoiceSecretsMask
string | null

travelinvoice HashKey/HashIV 的遮罩碼(`****` + 末 4)。DTO **只暴露 mask**, 整包 EncryptedField(含密文)永不出 repo —— 顯示用零 KMS 呼叫。

sendingDomain
string | null

自有寄件 domain 快照;server 派生(enableSendingDomain),非自由輸入。

resendDomainId
string | null

寄件服務商(Resend)的 domain 識別碼;null = 未設定自有寄件網域。

sendingDomainStatus
string | null

自有寄件網域的驗證狀態(如 pending/verified);null = 未設定。

senderLocalPart
string | null

寄件人 local-part,未填視為 'info'。

updatedAt
Date

設定最後更新時間。

範例
cairn settings get
回應
{
  "ok": true,
  "data": {
    "id": "…",
    "companyName": "…",
    "companyPhone": "…",
    "taxId": "…",
    "companyAddress": "…",
    "logoUrl": "…",
    "siteTagline": "…",
    "seoDefaultDescription": "…",
    "ogImageUrl": "…",
    "emailReplyTo": "…",
    "assignmentMode": "…",
    "defaultAssigneeUserId": "…",
    "allowSalesClaim": true,
    "passportExpiryWarningDays": 0,
    "groupCodePattern": "…",
    "groupCodeSeqStyle": "…",
    "groupCodeSeqWidth": 0,
    "ecpayFeeBps": 0,
    "fongshouFeeBps": 0,
    "profitTaxBps": 0,
    "salesCommissionBps": 0,
    "monthlyTopBonusBps": 0,
    "ecpayMerchantId": "…",
    "ecpaySecretsMask": "…",
    "travelinvoiceMerchantId": "…",
    "travelinvoiceSecretsMask": "…",
    "sendingDomain": "…",
    "resendDomainId": "…",
    "sendingDomainStatus": "…",
    "senderLocalPart": "…",
    "updatedAt": "2026-06-30T08:00:00.000Z"
  }
}
cairn settings accounts

收款帳戶目錄

參數

--active-only
旗標 · 選填
--json
旗標 · 選填
對應端點GET /api/v1/settings/receiving-accounts:param
範例
cairn settings accounts
cairn settings fee-routes

費用類別 → 收款帳戶路由表

參數

--json
旗標 · 選填

回應欄位 · data[]

id
string

路由設定 ID。

feeCategory
string

費用類型代碼(租戶自定唯一鍵,如 tour_fee/lodging/equipment)。

displayName
string

費用類型顯示名。

finalAccountId
string

此費用類型最終結算進的收款帳戶 ID。

finalAccountName
string | null

final 帳戶顯示名(JOIN receiving_accounts;帳戶被刪則 null,但 FK restrict 一般不會)。

finalAccountCode
string | null

final 帳戶代號。

isActive
boolean

此路由是否啟用。

createdAt
Date

建立時間。

updatedAt
Date

最後更新時間。

範例
cairn settings fee-routes
回應
{
  "ok": true,
  "data": [
    {
      "id": "…",
      "feeCategory": "…",
      "displayName": "…",
      "finalAccountId": "…",
      "finalAccountName": "…",
      "finalAccountCode": "…",
      "isActive": true,
      "createdAt": "2026-06-30T08:00:00.000Z",
      "updatedAt": "2026-06-30T08:00:00.000Z"
    }
  ]
}
cairn settings expense-categories

公司營業費用類別目錄

參數

--active-only
旗標 · 選填
--json
旗標 · 選填
對應端點GET /api/v1/settings/expense-categories:param
範例
cairn settings expense-categories
cairn settings modules

租戶啟用的方案模組(唯讀;供應由平台 CLI 管)

參數

--json
旗標 · 選填

回應欄位 · data

climbing
boolean

是否啟用登山團功能模組。

overseas
boolean

是否啟用海外/出國團功能模組。

lodging
boolean

是否啟用訂房子系統模組。

accounting
boolean

是否啟用進階會計子系統模組。

lottery
boolean

是否啟用抽籤子系統模組。

範例
cairn settings modules
回應
{
  "ok": true,
  "data": {
    "climbing": true,
    "overseas": true,
    "lodging": true,
    "accounting": true,
    "lottery": true
  }
}
cairn settings assignable-staff

可被指派訂單的員工名單

參數

--json
旗標 · 選填

回應欄位 · data[]

userId
string

員工的使用者 ID(作為指派對象)。

name
string

員工顯示姓名。

email
string

員工登入 Email。

role
string

員工角色代碼(sales/admin 等可指派角色)。

thisMonthAssigned
number

本月(Asia/Taipei)已指派給此員工的訂單數(供輪派負載參考)。

範例
cairn settings assignable-staff
回應
{
  "ok": true,
  "data": [
    {
      "userId": "…",
      "name": "…",
      "email": "…",
      "role": "…",
      "thisMonthAssigned": 0
    }
  ]
}
cairn settings sending-domain

寄件網域狀態(含 DNS record;網域未設定時 records 為空)

參數

--json
旗標 · 選填

回應欄位 · data

sendingDomain
string | null

自有寄件網域;未設定時為 null。

resendDomainId
string | null

寄件服務商(Resend)的網域識別碼;未設定時為 null。

sendingDomainStatus
string | null

網域驗證狀態(如 pending/verified);未設定時為 null。

senderLocalPart
string | null

寄件人信箱的帳號部分(@ 前段);未填視為 info。

records
object[]

待設定的 DNS 記錄清單(SPF/DKIM 等);Resend 不可達或未設定時為空陣列。

record
string

DNS 記錄用途分類(如 DKIM/SPF 等,來自 Resend)。

name
string

記錄主機名(需在網域 DNS 新增的 host)。

type
string

記錄類型(如 TXT/MX/CNAME)。

value
string

記錄值(需填入 DNS 的內容)。

ttl選填
string | undefined

存活時間(TTL);未指定時省略。

status選填
string | undefined

此筆記錄的驗證狀態(如 pending/verified);未指定時省略。

priority選填
number | undefined

MX 記錄優先權;非 MX 記錄省略。

範例
cairn settings sending-domain
回應
{
  "ok": true,
  "data": {
    "sendingDomain": "…",
    "resendDomainId": "…",
    "sendingDomainStatus": "…",
    "senderLocalPart": "…",
    "records": [
      {
        "record": "…",
        "name": "…",
        "type": "…",
        "value": "…",
        "ttl": "…",
        "status": "…",
        "priority": 0
      }
    ]
  }
}
cairn settings update

更新公司檔 / 寄件身分(只送有帶的欄;空字串=清空)

參數

--company-name
旗標 · 選填

公司全名,顯示於發票、合約與對外信件抬頭;傳 null 或空字串清除

--tax-id
旗標 · 選填

公司統一編號(8 位數字),用於開立發票;傳 null 或空字串清除

--company-phone
旗標 · 選填

公司聯絡電話,顯示於對外文件;傳 null 或空字串清除

--company-address
旗標 · 選填

公司登記地址,顯示於對外文件;傳 null 或空字串清除

--logo-url
旗標 · 選填

公司 Logo 圖片網址(http/https),用於後台與對外頁面品牌呈現;傳 null 或空字串清除

--email-reply-to
旗標 · 選填

系統寄信時的回覆收件信箱,客戶回信會寄到此處;傳 null 或空字串清除

--sender-local-part
旗標 · 選填

寄件人信箱的帳號部分(@ 前段),與寄件網域組成完整寄件地址;傳 null 或空字串清除

--passport-expiry-warning-days
旗標 · 選填

護照到期前提早幾天提醒(1 至 3650 天),用於行前護照效期預警

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

是否成功更新租戶設定。

範例
cairn settings update
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn settings seo

更新 SEO 預設(tagline / description / og 圖;空字串=清空)

參數

--tagline
旗標 · 選填
--description
旗標 · 選填
--og-image-url
旗標 · 選填

社群分享預設縮圖(Open Graph image)網址(http/https);空字串清除

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

是否成功更新公開站 SEO 設定。

範例
cairn settings seo
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn settings ledger-fees

更新內外帳試算費率(bps 0..10000;空=不變)

參數

--ecpay-bps
旗標 · 選填
--fongshou-bps
旗標 · 選填
--profit-tax-bps
旗標 · 選填

淨利稅率,單位 basis points(0..10000,10000=100%),用於內外帳淨利試算;留空不變更

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

是否成功更新內外帳淨利試算的預估費率。

範例
cairn settings ledger-fees
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn settings assignment

設定訂單指派模式 + 預設指派人

參數

--mode <auto_round_robin|auto_customer_choice|manual_review>
旗標 · 必填
--default-assignee
旗標 · 選填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

是否成功更新訂單指派模式設定。

範例
cairn settings assignment --mode <auto_round_robin|auto_customer_choice|manual_review>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn settings ecpay

ECPay 憑證(set 三欄一起寫 / clear 解除綁定;write-only)

參數

--merchant-id
旗標 · 必填

綠界 ECPay 特店編號(MerchantID),用於金流請款與簽章

--hash-key
旗標 · 必填

綠界 ECPay HashKey,CheckMacValue 簽章用密鑰;寫入後即 KMS 加密儲存且永不回傳

--hash-iv
旗標 · 必填

綠界 ECPay HashIV,CheckMacValue 簽章用初始向量;寫入後即 KMS 加密儲存且永不回傳

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

是否成功清除 ECPay 憑證。

範例
cairn settings ecpay --merchant-id --hash-key --hash-iv
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn settings sending-domain-manage

寄件網域:啟用 / 驗證 / 停用

參數

<enable|verify|disable>位置參數 · 必填
--confirm
對 production target 寫入時必帶
對應端點POST /api/v1/settings/sending-domain/:param
範例
cairn settings sending-domain-manage <enable|verify|disable>
cairn settings accounts-write

收款帳戶寫入:create / update

參數

<id>位置參數 · 必填
--code
旗標 · 必填

收款帳戶代號,建立後不可變更,作為帳戶的穩定識別

--name
旗標 · 選填
--kind <bank|cash|gateway>
旗標 · 必填

帳戶種類:bank 銀行帳戶、cash 現金、gateway 金流閘道

--currency
旗標 · 選填

帳戶幣別,ISO 4217 三碼(如 TWD / JPY / IDR);空字串預設 TWD,非 TWD 即為外幣池

--confirm
對 production target 寫入時必帶

回應欄位 · data

id
string

新建立的收款帳戶 ID。

範例
cairn settings accounts-write <id> --code --kind <bank|cash|gateway>
回應
{
  "ok": true,
  "data": {
    "id": "…"
  }
}
cairn settings fee-routes-write

費用類型路由:upsert / set-active

參數

<id>位置參數 · 必填
--category
旗標 · 必填
--name
旗標 · 必填
--final-account
旗標 · 必填
--active <true|false>
旗標 · 選填
--confirm
對 production target 寫入時必帶

回應欄位 · data

id
string

新建立或更新的費用類型路由 ID。

範例
cairn settings fee-routes-write <id> --category --name --final-account
回應
{
  "ok": true,
  "data": {
    "id": "…"
  }
}
cairn settings expense-categories-write

費用類別:create / update / set-active

參數

<id>位置參數 · 必填
--code
旗標 · 必填

費用類別代碼(小寫英數與底線),建立後不可變更,作為類別的穩定識別

--name
旗標 · 必填
--kind <opex|tax|platform_fee|special>
旗標 · 必填

費用類別種類:opex 營業費用、tax 稅務、platform_fee 平台手續費、special 特殊,影響損益表歸類

--confirm
對 production target 寫入時必帶
--active <true|false>
旗標 · 必填

回應欄位 · data

id
string

新建立的費用類別 ID。

範例
cairn settings expense-categories-write <id> --code --name --kind <opex|tax|platform_fee|special> --active <true|false>
回應
{
  "ok": true,
  "data": {
    "id": "…"
  }
}

cairn staff

員工:查詢租戶內部員工名單

cairn staff list

列出租戶所有員工

參數

--json
旗標 · 選填

回應欄位 · data[]

userId
string

員工的使用者 ID。

email
string

員工登入 Email(帳號識別)。

name
string

員工顯示姓名。

role
string

員工角色代碼(admin/sales/op/accountant)。

createdAt
Date

帳號建立時間。

banned
boolean

Account frozen via ban (離職 / 停權).

twoFactorEnabled
boolean

是否已完成 TOTP 兩步驟驗證註冊。

emailVerified
boolean

Email 是否已驗證(可視為「受邀者至少完成過一次登入」)。

pending
boolean

派生的「邀請待完成」狀態:帳號已建立,但受邀者尚未驗證 Email 也未註冊 2FA(未完成首次登入)。

對應端點GET /api/v1/staff
範例
cairn staff list
回應
{
  "ok": true,
  "data": [
    {
      "userId": "…",
      "email": "…",
      "name": "…",
      "role": "…",
      "createdAt": "2026-06-30T08:00:00.000Z",
      "banned": true,
      "twoFactorEnabled": true,
      "emailVerified": true,
      "pending": true
    }
  ]
}
cairn staff invite

建立新員工帳號(指定角色);回一次性暫時密碼

參數

--email <e>
旗標 · 必填

受邀員工的登入 Email,作為帳號識別

--name <n>
旗標 · 必填

員工顯示姓名

--role <admin|sales|op|accountant>
旗標 · 必填

指派的員工角色(admin/sales/op/accountant),決定權限範圍

--confirm
對 production target 寫入時必帶

回應欄位 · data

userId
string

新建立員工的使用者 ID。

tempPassword
string

一次性明文暫時密碼,僅此次回傳(請立即轉交並要求員工首次登入改密)。

email
string

新員工的登入 Email。

role
string

指派的員工角色(admin/sales/op/accountant)。

範例
cairn staff invite --email <e> --name <n> --role <admin|sales|op|accountant>
回應
{
  "ok": true,
  "data": {
    "userId": "…",
    "tempPassword": "…",
    "email": "…",
    "role": "…"
  }
}
cairn staff set-role

變更員工角色(admin|sales|op|accountant)

參數

<userId>位置參數 · 必填
--role <admin|sales|op|accountant>
旗標 · 必填

變更後的員工角色(admin/sales/op/accountant),決定權限範圍

--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

是否成功變更員工角色。

範例
cairn staff set-role <userId> --role <admin|sales|op|accountant>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}
cairn staff remove

移除員工(降為 customer,保留 user 紀錄)

參數

<userId>位置參數 · 必填
--confirm
對 production target 寫入時必帶

回應欄位 · data

ok
boolean

是否成功移除員工身分(降為一般顧客)。

範例
cairn staff remove <userId>
回應
{
  "ok": true,
  "data": {
    "ok": true
  }
}

Command Palette

Search for a command to run...