@geekbeer/minion 4.2.0 → 4.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/rules/core.md CHANGED
@@ -514,6 +514,68 @@ cp /tmp/report.pdf ~/files/reports/2026-04/report.pdf
514
514
  - テキスト成果物 → ローカルメモリ (`POST /api/memory`) に保存
515
515
  - バイナリファイル → `~/files/` に保存
516
516
 
517
+ ## Accounting Operations (会計操作, v4.3.0〜)
518
+
519
+ 会計データは法的責任を伴うため、**accountant ロールを付与されたミニオンのみ** 操作可能。
520
+
521
+ ### アクセス要件
522
+
523
+ - 対象 workspace 内の **いずれかのプロジェクト** で `accountant` ロールを持っていること
524
+ - workspace で `experimental_accounting` feature flag が ON であること
525
+ - 不在の場合は 403 `code: 'accountant_role_required'` / `'feature_disabled'` が返る
526
+
527
+ ### API
528
+
529
+ エンドポイントは `/api/minion/workspaces/:id/accounting/*`。詳細は `~/.minion/docs/api-reference.md` の「Accounting」セクションを参照。
530
+
531
+ 主なリソース:
532
+ - **Books / Periods / Reports** — 帳簿メタ、決算期、試算表 / B/S / P/L (照会のみ)
533
+ - **Accounts** — 勘定科目の照会 (GET) と追加 (POST) のみ。rename / アーカイブ / 削除は人間専用
534
+ - **Counterparties** — 取引先マスタの照会・追加・更新 (GET / POST / PATCH。`is_archived` でアーカイブ可)
535
+ - **Journal Entries** — 仕訳の作成 (POST) と AI 生成仕訳の更新 (PATCH)
536
+ - **Receipts** — レシート一覧 / ダウンロード
537
+ - **Expense Reimbursements** — 立替経費の登録
538
+ - **Tax Calculations** — 法人税計算ウィザード (別表四相当の加減算 + 6 税目別税率入力 + 仕訳生成準備)
539
+
540
+ ### 守るべきルール
541
+
542
+ 1. **仕訳は `source='ai_generated'` で自動記録される** — ミニオン経由で作成した仕訳は HQ UI で 🤖 バッジ付きで表示される。人間がレビューしてから承認する前提で動くこと。
543
+ 2. **人間作成仕訳 (`source='manual'` / `'import'`) は更新できない** — PATCH すると 409 `code: 'human_owned_entry'`。修正が必要なら人間に依頼する。
544
+ 3. **税率はユーザー責任で入力する** — 法人税計算ウィザードの税率欄は国税庁・自治体サイトで最新値を調査して入力すること。本ツールは税率テーブルを持たない。
545
+
546
+ ### 人間専用操作 (ミニオンから提供されない API)
547
+
548
+ 以下はデータの根幹に影響するため、ミニオンが自律実行することを禁止している。
549
+ ミニオンは **threads で `@user` メンション + 計算 ID / 期 ID をリンクして人間に依頼** すること。
550
+
551
+ | 操作 | 依頼すべき相手 / 方法 |
552
+ |------|---------------------|
553
+ | 決算期の `close` / `reopen` / 期首残高設定 | HQ ダッシュボード `/accounting/periods` から人間が実行 |
554
+ | 法人税計算の `finalize` / `journalize` / `reopen` | `/accounting/tax-calculations/:id` のウィザード末尾ボタン |
555
+ | 仕訳・科目・取引先・税計算の `DELETE` | HQ UI 各リスト画面 |
556
+ | 勘定科目の rename / アーカイブ (`PATCH`) | `/accounting/accounts` から人間が実行 (ミニオンは POST のみ) |
557
+ | 立替経費の `settle` / `bulk-settle` | `/accounting/reimbursements` の精算ボタン |
558
+ | レシートと仕訳の `attach` / `detach` | HQ UI で人間が判断 |
559
+
560
+ 依頼スレッドの body 例:
561
+ ```bash
562
+ curl -X POST -H "Authorization: Bearer $API_TOKEN" -H "Content-Type: application/json" \
563
+ http://localhost:8080/api/threads \
564
+ -d '{
565
+ "thread_type": "help",
566
+ "mentions": ["user"],
567
+ "title": "法人税計算 FY3 の finalize お願いします",
568
+ "content": "計算ID XXXX の入力が完了しました。HQダッシュボードでレビュー後、Finalize → Journalize ボタンを押してください。",
569
+ "context": { "accounting_action": "tax_finalize", "calculation_id": "XXXX" }
570
+ }'
571
+ ```
572
+
573
+ ### 監査と可視化
574
+
575
+ ミニオン書き込みは以下で記録・可視化される:
576
+ - DB: `created_by_minion_id` / `updated_by_minion_id` 列 (主要 7 テーブル)
577
+ - HQ UI: 仕訳一覧 / 取引先 / 立替経費 / 法人税計算ウィザードの各項目に 🤖 バッジ表示
578
+
517
579
  ## Documentation
518
580
 
519
581
  API仕様やタスク手順の詳細は以下を参照:
@@ -1,17 +1,26 @@
1
1
  ---
2
2
  name: accounting-bookkeeping
3
- description: 会計帳簿の記帳・立替経費の処理・補助元帳の照会を行うワークフロー。使用タイミング:(1) 取引を仕訳として記録する時、(2) 役員・従業員の立替経費を記帳・精算する時、(3) 取引先別の残高を確認する時。accountantロールのミニオンが主に使用する。
3
+ description: 会計帳簿の記帳・立替経費の処理・補助元帳の照会・財務諸表の照会・法人税計算の補助を行うワークフロー。使用タイミング:(1) 取引を仕訳として記録する時、(2) 役員・従業員の立替経費を記帳する時、(3) 取引先別の残高を確認する時、(4) 試算表・B/S・P/L を取得して報告する時、(5) 法人税計算ウィザードに入力する時。accountantロールのミニオンが主に使用する。
4
4
  ---
5
5
 
6
6
  # Accounting Bookkeeping
7
7
 
8
8
  会計帳簿(HQ Accounting API)を操作するためのスキル。複式簿記の整合性を保ちながら、AI(ミニオン)が安全に記帳できるよう設計されている。
9
9
 
10
- ## 前提
10
+ ## 前提・アクセス要件
11
11
 
12
- - ワークスペースで experimental_accounting feature flag が有効になっていること
13
- - HQ API は `$HQ_URL/api/accounting/*` で利用可能(authentication `Authorization: Bearer $API_TOKEN`)
14
- - 1ワークスペース1帳簿の前提。`GET /books` で帳簿を取得し、勘定科目テンプレートはデフォルトで投入済み
12
+ このスキルが叩くのは **ミニオン専用の会計 API** (`$HQ_URL/api/minion/workspaces/:id/accounting/*`)。
13
+ 人間用の `/api/accounting/*` (Supabase セッション認証) とは別系統で、**ミニオンは必ずこちらを使う**こと。
14
+
15
+ - 認証は `Authorization: Bearer $API_TOKEN`。`:id` は対象 **ワークスペース ID**(パスに含める)
16
+ - 対象 workspace 内の **いずれかのプロジェクト**で `accountant` ロールを持っていること
17
+ (持たない場合は 403 `code: 'accountant_role_required'`)
18
+ - workspace で `experimental_accounting` feature flag が ON であること
19
+ (OFF なら 403 `code: 'feature_disabled'`)
20
+ - 1ワークスペース1帳簿の前提。`GET .../books` で帳簿を取得し、勘定科目テンプレートはデフォルトで投入済み
21
+ - 書き込みは `created_by_minion_id` / `updated_by_minion_id` に呼び出し元ミニオン ID が記録され、HQ UI で 🤖 バッジ表示される。仕訳の `source` は常に `'ai_generated'`
22
+
23
+ API 全体のエンドポイント表は `~/.minion/docs/api-reference.md` の「Accounting」セクションを参照。
15
24
 
16
25
  ## 語彙
17
26
 
@@ -26,12 +35,14 @@ description: 会計帳簿の記帳・立替経費の処理・補助元帳の照
26
35
 
27
36
  ## 典型フロー
28
37
 
38
+ > 以下のパスはすべて `$HQ_URL/api/minion/workspaces/:id/accounting/` を基準とした相対表記。
39
+
29
40
  ### A) 通常取引の記帳
30
41
 
31
42
  ```
32
- 1. GET /api/accounting/accounts で勘定科目一覧取得
43
+ 1. GET /accounts で勘定科目一覧取得
33
44
  2. 入金/出金口座(is_wallet=true)と相手勘定(費用 or 収益)を特定
34
- 3. POST /api/accounting/entries でシンプル仕訳を作成
45
+ 3. POST /entries でシンプル仕訳を作成
35
46
  body: { entry_type: 'expense'|'income', entry_date, amount, wallet_account_id, category_account_id, description }
36
47
  ```
37
48
 
@@ -41,37 +52,82 @@ description: 会計帳簿の記帳・立替経費の処理・補助元帳の照
41
52
 
42
53
  ```
43
54
  1. 立替者(役員/従業員)の counterparty を確認
44
- - GET /api/accounting/counterparties?q=<name>&kind=director,employee
45
- - 見つからなければ POST /api/accounting/counterparties で作成
55
+ - GET /counterparties?kind=director,employee
56
+ - 見つからなければ POST /counterparties で作成
46
57
  - default_payable_account_id が未設定なら PATCH で先に設定する
47
- 2. POST /api/accounting/expense-reimbursements で記帳
58
+ 2. POST /reimbursements で記帳
48
59
  body: { paid_by_counterparty_id, occurred_on, amount, expense_account_id, description }
49
60
  → 内部で「(借)費用 / (貸)立替者の負債科目」の仕訳が自動生成される
50
- 3. レシートがあれば事前に POST /api/accounting/receipts でアップロードし、receipt_ids を渡す
61
+ 3. レシートがあれば事前に GET /receipts で対象を確認 (アップロードと仕訳への attach は人間が HQ UI で行う)
51
62
  ```
52
63
 
53
64
  詳細: `references/api-expense-reimbursement.md`
54
65
 
55
- ### C) 立替経費の精算
66
+ ### B') レシートの照会・OCR
56
67
 
57
68
  ```
58
- 1. GET /api/accounting/expense-reimbursements?settled=false で未精算リスト取得
59
- 2. POST /api/accounting/expense-reimbursements/<id>/settle で精算
60
- body: { settled_on, wallet_account_id }
61
- → 内部で「(借)立替者の負債科目 / (貸)現金or預金」の仕訳が自動生成される
69
+ GET /receipts?attached=false 未処理(未添付)レシート一覧
70
+ GET /receipts/:receiptId/download → 60秒有効な signed URL を取得し画像/PDFを読み取り (OCR)
62
71
  ```
63
72
 
64
- 部分精算は非対応。全額精算のみ。
73
+ 読み取った内容から仕訳/立替を作成する。アップロードと仕訳への attach/detach は人間専用。
74
+ 詳細: `references/api-receipts.md`
75
+
76
+ ### C) 立替経費の精算 — **人間専用**
77
+
78
+ 精算 (`settle` / `bulk-settle`) は実際の出金を伴うため**ミニオンからは実行できない**。
79
+ 未精算リストを `GET /reimbursements?status=unsettled` で把握し、精算が必要な分は
80
+ `POST /api/threads` で `@user` メンションして HQ UI の精算ボタンを依頼すること。
65
81
 
66
82
  ### D) 補助元帳の照会
67
83
 
68
84
  ```
69
- GET /api/accounting/counterparties/<id>/balance
70
- 取引先別の残高(勘定科目ごと)・明細リスト・未精算立替件数を返す
85
+ GET /counterparties/:counterpartyId
86
+ 取引先の詳細 + 残高サマリ ({ counterparty, balance: { debit_total, credit_total, net } }) を返す
71
87
  ```
72
88
 
73
89
  詳細: `references/api-counterparties.md`
74
90
 
91
+ ### E) 財務諸表の照会・報告
92
+
93
+ ```
94
+ GET /reports/trial-balance → 試算表 + B/S + P/L 一括 (Query: ?from&to&includeZero)
95
+ GET /reports/income-statement → P/L のみ (軽量)
96
+ GET /reports/balance-sheet → B/S のみ (軽量)
97
+ ```
98
+
99
+ PM やユーザーへの月次報告などで使う。取得した数値は**ノート (`hq note create`)** にまとめて共有するとよい。
100
+ 詳細: `references/api-reports-tax.md`
101
+
102
+ ### F) 法人税計算ウィザードの入力補助
103
+
104
+ `org_type=corporation` / `general_incorporated_association` の帳簿のみ対象 (それ以外は 403 `org_type_ineligible`)。
105
+ ミニオンが触れるのは `draft` 状態のみ。**`finalize` / `journalize` は人間専用**。
106
+
107
+ ```
108
+ 1. GET /periods で対象期 (status='open') を選ぶ
109
+ 2. POST /tax-calculations で新規作成 (pretax_income は P/L から自動取得)
110
+ 3. POST /tax-calculations/:calcId/ensure-accounts で必要4科目を揃える
111
+ 4. 国税庁・自治体サイトで最新税率を調査 → PATCH /tax-calculations/:calcId/components/:compId で各税目の tax_rate を入力
112
+ 5. 中間納付があれば PATCH /components/:compId で prepaid_amount を入力
113
+ 6. 必要なら POST /tax-calculations/:calcId/adjustments で別表四相当の加減算を追加
114
+ 7. POST /api/threads で人間に finalize → journalize を依頼
115
+ ```
116
+
117
+ 詳細: `references/api-reports-tax.md`
118
+
119
+ ### G) 勘定科目の追加
120
+
121
+ テンプレートに不足している科目(例: 立替用の「役員借入金」)は追加できる。
122
+
123
+ ```
124
+ POST /accounts
125
+ body: { name, type: 'asset'|'liability'|'equity'|'revenue'|'expense', code?, is_wallet?, sort_order? }
126
+ ```
127
+
128
+ **科目の rename / アーカイブ / 削除はミニオンからは実行できない**(人間専用)。
129
+ 不要・誤った科目の整理が必要な場合は `POST /api/threads` で人間に HQ UI 操作を依頼すること。
130
+
75
131
  ## エラーレスポンスの読み方
76
132
 
77
133
  会計APIは AI 向けに以下の構造でエラーを返す:
@@ -80,7 +136,7 @@ GET /api/accounting/counterparties/<id>/balance
80
136
  {
81
137
  "error": "missing_default_payable_account",
82
138
  "message": "取引先「山田太郎」に立替用の貸方科目が未設定です",
83
- "next_action": "PATCH /api/accounting/counterparties/<id> で default_payable_account_id を設定してください...",
139
+ "next_action": "PATCH /counterparties/<id> で default_payable_account_id を設定してください...",
84
140
  "context": { "counterparty_id": "..." }
85
141
  }
86
142
  ```
@@ -89,9 +145,26 @@ GET /api/accounting/counterparties/<id>/balance
89
145
 
90
146
  主要エラーパターンと対処は `references/troubleshooting.md` を参照。
91
147
 
148
+ ## 人間専用操作 (ミニオンから提供されない)
149
+
150
+ 以下はデータの根幹に影響するため、ミニオンが自律実行することを禁じている。
151
+ 必要な場合は `POST /api/threads` で `@user` メンション + 対象 ID をリンクして人間に依頼する。
152
+
153
+ | 操作 | 依頼先 (HQ UI) |
154
+ |------|---------------|
155
+ | 決算期の close / reopen / 期首残高設定 | `/accounting/periods` |
156
+ | 法人税計算の finalize / journalize / reopen | `/accounting/tax-calculations/:id` ウィザード末尾 |
157
+ | 仕訳・科目・取引先・立替・税計算の DELETE | 各リスト画面 |
158
+ | 科目の rename / アーカイブ (PATCH) | `/accounting/accounts` |
159
+ | 立替経費の settle / bulk-settle | `/accounting/reimbursements` |
160
+ | レシートと仕訳の attach / detach | 各画面 |
161
+ | 人間作成仕訳 (`source='manual'`/`'import'`) の編集 | HQ UI (PATCH は 409 `human_owned_entry`) |
162
+
92
163
  ## 重要な制約
93
164
 
94
- - **確定済み期間(closed)の日付では記帳できない。** 422/409 で拒否される。日付を変えるか PM に再オープン依頼
165
+ - **確定済み期間(closed)の日付では記帳できない。** 409 `period_closed` で拒否される。日付を変えるか PM に再オープン依頼
166
+ - **PATCH できる仕訳は `source='ai_generated'` のものだけ。** 人間作成仕訳は 409 `human_owned_entry`
95
167
  - **立替の貸方科目は負債(liability) or 純資産(equity)のみ許容。** 資産勘定の「立替金」(他人のために会社が立て替える勘定)は逆向きなので NG
96
168
  - **counterparty マスタは book スコープ。** 別帳簿のIDは使えない
97
169
  - **複式簿記の借方=貸方は trigger で強制される。** 自前で計算してから POST すること
170
+ - **税率はユーザー責任で入力する。** 本ツールは税率テーブルを持たない。最新値を調査して入力すること
@@ -2,6 +2,9 @@
2
2
 
3
3
  取引先マスタは `book_id` スコープ。役員・従業員・仕入先・顧客などを統一管理する。
4
4
 
5
+ > パスはすべて **ミニオン用** `$HQ_URL/api/minion/workspaces/:id/accounting/` を基準とした相対表記。
6
+ > 認証は `Authorization: Bearer $API_TOKEN`。人間用 `/api/accounting/*` は使わない。
7
+
5
8
  ## kind の選び方
6
9
 
7
10
  | kind | 用途 |
@@ -22,24 +25,22 @@
22
25
  - 許容: **equity** 型(運用実態として一部の帳簿で利用されるため)
23
26
  - NG: **asset/revenue/expense** 型 → API が `invalid_default_payable_account` で 400 を返す
24
27
 
25
- 該当科目が無い場合は先に `POST /api/accounting/accounts` で作成すること。
28
+ 該当科目が無い場合は先に `POST /accounts` で作成すること。
26
29
 
27
30
  ## エンドポイント
28
31
 
29
- ### GET /api/accounting/counterparties
32
+ ### GET /counterparties
30
33
 
31
34
  ```
32
35
  Query:
33
- ?q=<部分一致検索>
34
36
  ?kind=director,employee (カンマ区切り)
35
37
  ?include_archived=true (デフォルトはアクティブのみ)
36
- ?limit=200 (max 500)
37
38
 
38
39
  Response:
39
40
  { "counterparties": [{ id, book_id, name, kind, member_id, default_payable_account_id, is_archived, ... }] }
40
41
  ```
41
42
 
42
- ### POST /api/accounting/counterparties
43
+ ### POST /counterparties
43
44
 
44
45
  ```
45
46
  Body:
@@ -50,7 +51,7 @@ Body:
50
51
  "default_payable_account_id": "<account uuid>"
51
52
  }
52
53
 
53
- Response 201: { "counterparty": {...} }
54
+ Response: { "counterparty": {...} }
54
55
 
55
56
  エラー:
56
57
  400 invalid_kind — kind 不正
@@ -58,14 +59,23 @@ Response 201: { "counterparty": {...} }
58
59
  409 counterparty_name_conflict — 同名のアクティブな取引先が存在 (context.existing_id 参照)
59
60
  ```
60
61
 
61
- ### GET /api/accounting/counterparties/[id]
62
+ ### GET /counterparties/:counterpartyId
63
+
64
+ 取引先詳細と残高サマリ。補助元帳の照会はこのエンドポイントを使う。
62
65
 
63
66
  ```
64
- Response: { "counterparty": {...} }
67
+ Response:
68
+ {
69
+ "counterparty": {...},
70
+ "balance": { "debit_total": ..., "credit_total": ..., "net": ... }
71
+ }
65
72
  404 counterparty_not_found
66
73
  ```
67
74
 
68
- ### PATCH /api/accounting/counterparties/[id]
75
+ 残高の符号: 資産/費用は `debit - credit`、負債/純資産/収益は `credit - debit`。
76
+ 明細レベルの内訳が必要な場合は `GET /entries?...` で当該取引先の line を含む仕訳を取得して集計する。
77
+
78
+ ### PATCH /counterparties/:counterpartyId
69
79
 
70
80
  ```
71
81
  Body (全て任意):
@@ -74,36 +84,10 @@ Body (全て任意):
74
84
  Response: { "counterparty": {...} }
75
85
  ```
76
86
 
77
- ### DELETE /api/accounting/counterparties/[id]
78
-
79
- ソフト削除(`is_archived=true`)。物理削除はしない(過去仕訳の参照を保持するため)。
80
-
81
- ```
82
- エラー:
83
- 409 has_unsettled_reimbursements — 未精算の立替が残っているとアーカイブ不可
84
- ```
85
-
86
- ### GET /api/accounting/counterparties/[id]/balance
87
+ `is_archived: true` でソフトアーカイブできる。未精算の立替が残っている取引先は
88
+ 409 `has_unsettled_reimbursements` でアーカイブ不可(精算は人間専用なので人間に依頼)。
87
89
 
88
- 補助元帳。取引先別の残高(勘定科目別)と明細リスト。
90
+ ### 取引先の削除 — **人間専用**
89
91
 
90
- ```
91
- Query:
92
- ?as_of=YYYY-MM-DD (任意。これより前の仕訳のみ集計)
93
- ?limit=500 (明細最大件数)
94
-
95
- Response:
96
- {
97
- "counterparty": {...},
98
- "balance_by_account": [
99
- { "account_id", "code", "name", "type", "debit", "credit", "balance" }
100
- ],
101
- "lines": [
102
- { "id", "account_id", "debit", "credit", "memo", "entry": {...}, "account": {...} }
103
- ],
104
- "unsettled_reimbursements_count": 2,
105
- "as_of": null
106
- }
107
- ```
108
-
109
- 残高の符号: 資産/費用は `debit - credit`、負債/純資産/収益は `credit - debit`。
92
+ 物理削除 (`DELETE`) はミニオンには提供されない(過去仕訳の参照を保持するため)。
93
+ 不要な取引先は上記 PATCH の `is_archived: true` でアーカイブする。完全削除が必要な場合は人間に依頼する。
@@ -2,15 +2,24 @@
2
2
 
3
3
  立替経費は「立替記帳の仕訳」と「精算の仕訳」の対応関係を保持する別レイヤ。両仕訳の line に同じ `counterparty_id` が付与される。
4
4
 
5
+ > パスはすべて **ミニオン用** `$HQ_URL/api/minion/workspaces/:id/accounting/` を基準とした相対表記。
6
+ > ミニオン側のリソース名は **`reimbursements`**(人間用の `expense-reimbursements` ではない)。
7
+ > 認証は `Authorization: Bearer $API_TOKEN`。
8
+
9
+ ## ミニオンが扱える操作
10
+
11
+ ミニオンに提供されるのは **一覧取得 (GET)** と **記帳 (POST)** の2つだけ。
12
+ 精算・編集・削除は実出金や取消を伴うため **人間専用**(後述)。
13
+
5
14
  ## 仕訳パターン
6
15
 
7
- **立替記帳時:**
16
+ **立替記帳時 (POST /reimbursements が自動生成):**
8
17
  ```
9
18
  (借) 費用科目 amount [counterparty_id=<立替者>]
10
19
  (貸) counterparty.default_payable_account_id amount [counterparty_id=<立替者>]
11
20
  ```
12
21
 
13
- **精算時:**
22
+ **精算時 (人間が HQ UI で実行):**
14
23
  ```
15
24
  (借) counterparty.default_payable_account_id amount [counterparty_id=<立替者>]
16
25
  (貸) wallet_account (現金 or 普通預金) amount [counterparty_id=<立替者>]
@@ -18,9 +27,27 @@
18
27
 
19
28
  ## エンドポイント
20
29
 
21
- ### POST /api/accounting/expense-reimbursements
30
+ ### GET /reimbursements
31
+
32
+ ```
33
+ Query:
34
+ ?status=settled|unsettled|all (default: 全件相当。未精算だけ見たいときは unsettled)
35
+ ?counterparty_id=<uuid>
36
+ ?limit=100&offset=0
37
+
38
+ Response:
39
+ {
40
+ "reimbursements": [{
41
+ id, paid_by_counterparty_id, occurred_on, amount, description,
42
+ expense_journal_entry_id, settled_at, settlement_journal_entry_id,
43
+ counterparty: { id, name, kind }
44
+ }]
45
+ }
46
+ ```
47
+
48
+ ### POST /reimbursements
22
49
 
23
- 立替経費を記帳する。
50
+ 立替経費を記帳する。仕訳(借方=expense, 貸方=payable)を自動生成する。
24
51
 
25
52
  ```
26
53
  Body:
@@ -30,13 +57,10 @@ Body:
30
57
  "amount": 1000,
31
58
  "expense_account_id": "<費用科目 uuid>",
32
59
  "description": "新幹線代 東京→大阪", // 任意
33
- "receipt_ids": ["<receipt uuid>"], // 任意。既存の未添付レシートを紐付ける
34
- "category_dimensions": { // 任意。一般社団法人プロファイル等で expense 行に
35
- "net_asset_restriction": "general" // ディメンションが必要な場合に指定。expense 行(借方)のみに付与される
36
- }
60
+ "payable_account_id": "<貸方科目 uuid>" // 任意。省略時は counterparty.default_payable_account_id を使用
37
61
  }
38
62
 
39
- Response 201: { "reimbursement": { "id", "expense_journal_entry_id" } }
63
+ Response: { "reimbursement": { "id", "expense_journal_entry_id" } }
40
64
 
41
65
  主要エラー:
42
66
  400 invalid_amount — amount が正の数値でない
@@ -44,137 +68,26 @@ Response 201: { "reimbursement": { "id", "expense_journal_entry_id" } }
44
68
  400 invalid_expense_account_type — expense_account_id が expense 型でない
45
69
  404 counterparty_not_found — 立替者が見つからない (next_action: POST で先に作成)
46
70
  409 counterparty_archived — 立替者がアーカイブ済み
47
- 409 period_closed — occurred_on が締め済期間内
48
- 422 missing_default_payable_account — 立替者の default_payable_account_id が未設定
49
- ```
50
-
51
- ### PATCH /api/accounting/expense-reimbursements/[id]
52
-
53
- 未精算の立替経費を編集する。仕訳ヘッダ・明細・reimbursement ヘッダを整合させた状態で更新する。
54
- 精算済みの立替は編集できない (先に精算を取り消す必要がある)。
55
- **counterparty (立替者) の変更はサポートしない** — 変更する場合は削除して再作成すること。
56
-
57
- ```
58
- Body (すべて optional、最低1つは渡す):
59
- {
60
- "occurred_on": "YYYY-MM-DD",
61
- "amount": 1200,
62
- "expense_account_id": "<費用科目 uuid>",
63
- "description": "新幹線代 東京→大阪 (金額訂正)",
64
- "category_dimensions": { "net_asset_restriction": "general" }
65
- }
66
-
67
- Response 200: { "reimbursement": { "id", "expense_journal_entry_id" } }
68
-
69
- 主要エラー:
70
- 400 invalid_amount / invalid_date / expense_account_not_found / invalid_expense_account_type
71
- 404 reimbursement_not_found
72
- 409 already_settled — 精算済み (next_action: 精算を先に取り消す)
73
- 409 period_closed — 変更前後の日付が締め済期間内
74
- 422 missing_default_payable_account
75
- ```
76
-
77
- ### POST /api/accounting/expense-reimbursements/[id]/settle
78
-
79
- 立替を全額精算する。**部分精算は非対応**。
80
-
81
- ```
82
- Body:
83
- {
84
- "settled_on": "YYYY-MM-DD",
85
- "wallet_account_id": "<is_wallet=true の account uuid>"
86
- }
87
-
88
- Response: { "reimbursement": { "id", "expense_journal_entry_id" } }
89
- ※ expense_journal_entry_id は精算仕訳のIDが返る
90
-
91
- 主要エラー:
92
- 404 reimbursement_not_found
93
- 409 already_settled — 既に精算済み (context.settled_at 参照)
94
- 409 period_closed — settled_on が締め済期間内
95
- 400 wallet_account_not_found — 支払口座が見つからない
96
- 400 not_a_wallet_account — is_wallet=false の科目を指定した
97
- 422 missing_default_payable_account — 立替者の貸方科目が後から消去された場合
98
- ```
99
-
100
- ### POST /api/accounting/expense-reimbursements/bulk-settle
101
-
102
- 複数の立替を1本の精算仕訳でまとめて精算する。実運用で「役員Aの今月分3件を1回の振込で精算」する典型ケース向け。
103
-
104
- ```
105
- Body:
106
- {
107
- "reimbursement_ids": ["<uuid>", "<uuid>", ...], // 未精算の立替IDを1件以上
108
- "settled_on": "YYYY-MM-DD",
109
- "wallet_account_id": "<is_wallet=true の account uuid>"
110
- }
111
-
112
- 仕訳 (合計1本):
113
- (借) counterparty.default_payable_account sum(amounts) [counterparty_id=<立替者>]
114
- (貸) wallet_account sum(amounts) [counterparty_id=<立替者>]
115
-
116
- Response: { "settlement_entry_id": "<uuid>", "reimbursement_ids": ["<uuid>", ...] }
117
-
118
- 制約:
119
- - すべての reimbursement が同一 counterparty に属すこと (混在不可)
120
- - 全額精算のみ (部分精算は非対応)
121
-
122
- 主要エラー:
123
- 400 missing_required_fields — reimbursement_ids が空 / 必須項目欠落
124
- 400 multiple_counterparties — 異なる立替者が混在 (context.counterparty_ids)
125
- 400 not_a_wallet_account — 支払口座が is_wallet=false
126
- 404 reimbursement_not_found — 一部のIDが見つからない (context.missing_ids)
127
- 409 already_settled — 一部が既に精算済み (context.settled_ids)
128
- 409 period_closed — settled_on が締め済期間内
129
- 422 missing_default_payable_account — 立替者の貸方科目が未設定
130
- ```
131
-
132
- データモデル: 精算仕訳と立替の関係は `accounting_reimbursement_settlements` (junction) で多対多管理される。単発 `/settle` 経由でも junction に行が書かれるため、補助元帳の集計クエリは junction を起点に書くと統一感が出る。`accounting_expense_reimbursements.settlement_journal_entry_id` は最後に紐付いた精算仕訳のポインタとして残る (後方互換用)。
133
-
134
- ### GET /api/accounting/expense-reimbursements
135
-
71
+ 409 code: 'period_closed' — occurred_on が締め済期間内
72
+ 422 missing_default_payable_account — 立替者の default_payable_account_id が未設定 (先に PATCH /counterparties で設定)
136
73
  ```
137
- Query:
138
- ?counterparty_id=<uuid>
139
- ?settled=true|false (未指定なら両方)
140
- ?from=YYYY-MM-DD&to=YYYY-MM-DD (occurred_on で絞り込み)
141
- ?limit=200
142
-
143
- Response:
144
- {
145
- "reimbursements": [{
146
- id, paid_by_counterparty_id, occurred_on, amount, description,
147
- expense_journal_entry_id, settled_at, settlement_journal_entry_id,
148
- counterparty: { id, name, kind }
149
- }]
150
- }
151
- ```
152
-
153
- ### GET /api/accounting/expense-reimbursements/[id]
154
74
 
155
- ```
156
- Response:
157
- {
158
- "reimbursement": {
159
- ...,
160
- counterparty: {...},
161
- expense_entry: {...},
162
- settlement_entry: null|{...}
163
- }
164
- }
165
- ```
75
+ ## 人間専用操作 (ミニオンから提供されない)
166
76
 
167
- ### DELETE /api/accounting/expense-reimbursements/[id]
77
+ 以下は実出金・取消を伴うため、`POST /api/threads` で `@user` メンションして HQ UI 操作を依頼する。
168
78
 
169
- 立替記帳の取消(精算前のみ)。関連する立替仕訳も同時に削除される。
79
+ | 操作 | 説明 / 依頼先 |
80
+ |------|--------------|
81
+ | `settle` (個別精算) | 立替を全額精算。HQ UI `/accounting/reimbursements` の精算ボタン |
82
+ | `bulk-settle` (一括精算) | 同一立替者の複数件を1本の精算仕訳でまとめて精算 |
83
+ | `PATCH` (編集) | 未精算立替の金額・科目訂正 |
84
+ | `DELETE` (取消) | 精算前の立替記帳の取消 |
170
85
 
171
- ```
172
- エラー:
173
- 409 already_settled — 精算済みは取消不可
174
- ```
86
+ ミニオンができるのは「未精算リストを `GET /reimbursements?status=unsettled` で把握 → 人間に精算を依頼」まで。
175
87
 
176
88
  ## ベストプラクティス
177
89
 
178
- - 立替者を識別できない場合は推測しない。`GET /counterparties?q=<name>` で検索し、複数候補がある場合は **PMに確認** すること
90
+ - 立替者を識別できない場合は推測しない。`GET /counterparties?kind=director,employee` で検索し、複数候補がある場合は **PMに確認** すること
179
91
  - 「立替金」(asset 勘定として存在することがある)は会社が他者のために立て替えた場合の科目。**役員/従業員が立て替えた場合の貸方には使わない** こと
180
- - 描かれた `next_action` を必ず読む。recover 可能なエラーは指示通りに対処
92
+ - 返ってきた `next_action` を必ず読む。recover 可能なエラーは指示通りに対処
93
+ - **記帳に失敗して中途半端な状態が残った場合、ミニオンは DELETE できない。** `POST /api/threads` で状況を報告し、人間に取消を依頼すること