@geekbeer/minion 4.2.1 → 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/core/lib/bundled-skills.js +94 -0
- package/docs/api-reference.md +117 -7
- package/docs/task-guides.md +19 -0
- package/linux/server.js +24 -0
- package/package.json +1 -1
- package/roles/accountant.md +12 -3
- package/rules/core.md +62 -0
- package/skills/accounting-bookkeeping/SKILL.md +94 -21
- package/skills/accounting-bookkeeping/references/api-counterparties.md +24 -40
- package/skills/accounting-bookkeeping/references/api-expense-reimbursement.md +47 -134
- package/skills/accounting-bookkeeping/references/api-journal-entries.md +29 -12
- package/skills/accounting-bookkeeping/references/api-receipts.md +75 -0
- package/skills/accounting-bookkeeping/references/api-reports-tax.md +106 -0
- package/skills/accounting-bookkeeping/references/troubleshooting.md +42 -25
- package/win/server.js +24 -0
|
@@ -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 /
|
|
28
|
+
該当科目が無い場合は先に `POST /accounts` で作成すること。
|
|
26
29
|
|
|
27
30
|
## エンドポイント
|
|
28
31
|
|
|
29
|
-
### GET /
|
|
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 /
|
|
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
|
|
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 /
|
|
62
|
+
### GET /counterparties/:counterpartyId
|
|
63
|
+
|
|
64
|
+
取引先詳細と残高サマリ。補助元帳の照会はこのエンドポイントを使う。
|
|
62
65
|
|
|
63
66
|
```
|
|
64
|
-
Response:
|
|
67
|
+
Response:
|
|
68
|
+
{
|
|
69
|
+
"counterparty": {...},
|
|
70
|
+
"balance": { "debit_total": ..., "credit_total": ..., "net": ... }
|
|
71
|
+
}
|
|
65
72
|
404 counterparty_not_found
|
|
66
73
|
```
|
|
67
74
|
|
|
68
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
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
|
-
"
|
|
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
|
|
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
|
|
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
|
-
|
|
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?
|
|
90
|
+
- 立替者を識別できない場合は推測しない。`GET /counterparties?kind=director,employee` で検索し、複数候補がある場合は **PMに確認** すること
|
|
179
91
|
- 「立替金」(asset 勘定として存在することがある)は会社が他者のために立て替えた場合の科目。**役員/従業員が立て替えた場合の貸方には使わない** こと
|
|
180
|
-
-
|
|
92
|
+
- 返ってきた `next_action` を必ず読む。recover 可能なエラーは指示通りに対処
|
|
93
|
+
- **記帳に失敗して中途半端な状態が残った場合、ミニオンは DELETE できない。** `POST /api/threads` で状況を報告し、人間に取消を依頼すること
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
# API: 仕訳(Journal Entries)
|
|
2
2
|
|
|
3
|
-
複式簿記の仕訳エンドポイント。立替経費以外の通常取引(
|
|
3
|
+
複式簿記の仕訳エンドポイント。立替経費以外の通常取引(収入/支出/振替/手動仕訳)を扱う。
|
|
4
|
+
|
|
5
|
+
> パスはすべて **ミニオン用** `$HQ_URL/api/minion/workspaces/:id/accounting/` を基準とした相対表記。
|
|
6
|
+
> 認証は `Authorization: Bearer $API_TOKEN`。人間用 `/api/accounting/*` は使わない。
|
|
7
|
+
> ミニオンが作成した仕訳は **常に `source='ai_generated'`** で記録される。
|
|
4
8
|
|
|
5
9
|
## entry_type の区別
|
|
6
10
|
|
|
@@ -10,11 +14,11 @@
|
|
|
10
14
|
| `expense` | 支出 | (借)category(費用) / (貸)wallet |
|
|
11
15
|
| `transfer` | 振替 | (借)to_account / (貸)from_account |
|
|
12
16
|
| `manual` | 手動仕訳(複合仕訳) | lines を直接指定 |
|
|
13
|
-
| `opening_balance` | 期首残高 |
|
|
17
|
+
| `opening_balance` | 期首残高 | **人間専用**(ミニオンからは設定不可) |
|
|
14
18
|
|
|
15
19
|
## エンドポイント
|
|
16
20
|
|
|
17
|
-
### POST /
|
|
21
|
+
### POST /entries
|
|
18
22
|
|
|
19
23
|
**シンプル仕訳 (income/expense):**
|
|
20
24
|
```
|
|
@@ -72,37 +76,50 @@ Response: { "entry": {...} }
|
|
|
72
76
|
400 manual entry requires at least 2 lines — lines 配列が短い
|
|
73
77
|
400 line[N]: exactly one of debit/credit must be positive — 行レベル不整合
|
|
74
78
|
400 指定された勘定科目がこの帳簿に存在しません — account_id が別 book / 削除済
|
|
75
|
-
409 period_closed
|
|
79
|
+
409 code: 'period_closed' — entry_date が締め済期間内
|
|
76
80
|
```
|
|
77
81
|
|
|
78
|
-
### PATCH /
|
|
82
|
+
### PATCH /entries/:entryId
|
|
79
83
|
|
|
80
84
|
仕訳の編集。明細は全置換(既存lineを削除して body.lines を挿入)。
|
|
81
85
|
|
|
86
|
+
**`source='ai_generated'` の仕訳(=ミニオンが作成したもの)のみ編集可能。**
|
|
87
|
+
人間作成仕訳 (`source='manual'` / `'import'`) を PATCH すると **409 `code: 'human_owned_entry'`**。
|
|
88
|
+
修正が必要なら `POST /api/threads` で人間に依頼すること。
|
|
89
|
+
|
|
82
90
|
```
|
|
83
91
|
締めチェック:
|
|
84
|
-
- 元の entry_date が締め後 → 409 period_closed (編集不可)
|
|
92
|
+
- 元の entry_date が締め後 → 409 code: 'period_closed' (編集不可)
|
|
85
93
|
- 新しい entry_date が締め後 → 409 (日付変更不可)
|
|
86
|
-
- opening_balance は編集不可(
|
|
94
|
+
- opening_balance は編集不可(人間専用画面から再入力)
|
|
87
95
|
```
|
|
88
96
|
|
|
89
|
-
###
|
|
97
|
+
### 仕訳の削除 — **人間専用**
|
|
90
98
|
|
|
91
|
-
|
|
99
|
+
`DELETE` はミニオンには提供されない。誤記帳の取消が必要な場合は、可能なら PATCH で訂正するか、
|
|
100
|
+
`POST /api/threads` で `@user` メンションして HQ UI からの削除を依頼する。
|
|
92
101
|
|
|
93
|
-
### GET /
|
|
102
|
+
### GET /entries
|
|
94
103
|
|
|
95
104
|
```
|
|
96
105
|
Query:
|
|
97
106
|
?from=YYYY-MM-DD&to=YYYY-MM-DD
|
|
98
|
-
?
|
|
107
|
+
?entry_type=income,expense,... (カンマ区切り)
|
|
108
|
+
?limit=100&offset=0
|
|
99
109
|
|
|
100
110
|
Response: { "entries": [{ ..., lines: [...] }] }
|
|
101
111
|
```
|
|
102
112
|
|
|
113
|
+
### GET /entries/:entryId
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
Response: { "entry": { ..., lines: [...] } }
|
|
117
|
+
```
|
|
118
|
+
|
|
103
119
|
## ベストプラクティス
|
|
104
120
|
|
|
105
121
|
- **通常の経費は manual で複合仕訳を組まず、`expense` ですませる。** シンプルな分、間違いが少ない
|
|
106
|
-
- **立替経費は仕訳APIで組み立てず、必ず /
|
|
122
|
+
- **立替経費は仕訳APIで組み立てず、必ず /reimbursements を使う。** 自前で組むと「立替者」軸の集計ができない
|
|
107
123
|
- **dimensions の `net_asset_restriction`** は一般社団法人プロファイル時のみ意味あり。株式会社(corporation-jp)では空でOK
|
|
108
124
|
- **manual を使う判断基準**: 1取引イベントで3科目以上を同時に動かす必要があるとき (給与/源泉/振込のセット、1レシートを複数費用科目に按分 等)。2科目で済むなら income/expense/transfer のいずれかに当てはまる
|
|
125
|
+
- **作成した仕訳は人間がレビューしてから承認する前提。** ミニオン作成分は HQ UI で 🤖 バッジ付き表示される
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# API: レシート(Receipts)
|
|
2
|
+
|
|
3
|
+
レシート(領収書)画像/PDF のメタデータ照会とダウンロード。OCR や内容確認の入力に使う。
|
|
4
|
+
|
|
5
|
+
> パスはすべて **ミニオン用** `$HQ_URL/api/minion/workspaces/:id/accounting/` を基準とした相対表記。
|
|
6
|
+
> 認証は `Authorization: Bearer $API_TOKEN`。**accountant ロール必須**(v4.3.0〜)。
|
|
7
|
+
|
|
8
|
+
## ミニオンが扱える操作
|
|
9
|
+
|
|
10
|
+
照会 (一覧・メタデータ) と **ダウンロード用 signed URL の取得** のみ。
|
|
11
|
+
アップロードと仕訳への attach/detach は **人間専用**(後述)。
|
|
12
|
+
|
|
13
|
+
## エンドポイント
|
|
14
|
+
|
|
15
|
+
### GET /receipts
|
|
16
|
+
|
|
17
|
+
レシート一覧。
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
Query:
|
|
21
|
+
?attached=true|false|all (default: false = 未添付のみ)
|
|
22
|
+
?limit=100 (max 500)
|
|
23
|
+
|
|
24
|
+
Response:
|
|
25
|
+
{ "receipts": [{ id, file_name, mime_type, uploaded_at, attached_entry_id, ... }] }
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
- `attached=false` … まだ仕訳に紐付いていないレシート(OCR → 記帳の対象を探すときに使う)
|
|
29
|
+
- `attached=all` … 添付済み含む全件
|
|
30
|
+
|
|
31
|
+
### GET /receipts/:receiptId
|
|
32
|
+
|
|
33
|
+
単一レシートのメタデータ。
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
Response: { "receipt": { id, file_name, mime_type, uploaded_at, attached_entry_id, ... } }
|
|
37
|
+
404 not_found — ID 違い / 別ワークスペース
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### GET /receipts/:receiptId/download
|
|
41
|
+
|
|
42
|
+
**60秒だけ有効な signed URL** を返す。画像/PDF の実体取得や OCR への入力に使う。
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
Response:
|
|
46
|
+
{
|
|
47
|
+
"url": "https://...", // 60秒で失効
|
|
48
|
+
"mime_type": "image/jpeg",
|
|
49
|
+
"file_name": "receipt-2026-05.jpg",
|
|
50
|
+
"expires_in_seconds": 60
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
URL は短命なので、取得したら即座に fetch すること。失効したら再度このエンドポイントを叩く。
|
|
55
|
+
|
|
56
|
+
対応 MIME: `image/png` / `image/jpeg` / `image/webp` / `image/gif` / `image/heic` / `image/heif` / `application/pdf`。
|
|
57
|
+
|
|
58
|
+
## 典型フロー (OCR → 記帳)
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
1. GET /receipts?attached=false で未処理レシートを一覧
|
|
62
|
+
2. GET /receipts/:id/download で signed URL を取得し、画像/PDF を読み取り (OCR)
|
|
63
|
+
3. 読み取った内容から POST /entries または POST /reimbursements で仕訳を作成
|
|
64
|
+
4. レシートと仕訳の attach は人間が HQ UI で行う (下記)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## 人間専用操作 (ミニオンから提供されない)
|
|
68
|
+
|
|
69
|
+
| 操作 | 説明 / 依頼先 |
|
|
70
|
+
|------|--------------|
|
|
71
|
+
| レシートのアップロード | HQ UI からユーザーがアップロード |
|
|
72
|
+
| 仕訳との attach / detach (`PATCH`) | HQ UI で人間が判断・操作 |
|
|
73
|
+
|
|
74
|
+
ミニオンが OCR → 仕訳作成した後、「この仕訳にこのレシートを添付してほしい」場合は
|
|
75
|
+
`POST /api/threads` で `@user` メンションして依頼する(レシート ID と仕訳 ID をリンク)。
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# API: 財務諸表(Reports)・法人税計算(Tax Calculations)
|
|
2
|
+
|
|
3
|
+
> パスはすべて **ミニオン用** `$HQ_URL/api/minion/workspaces/:id/accounting/` を基準とした相対表記。
|
|
4
|
+
> 認証は `Authorization: Bearer $API_TOKEN`。
|
|
5
|
+
|
|
6
|
+
## 財務諸表(Reports)
|
|
7
|
+
|
|
8
|
+
すべて Read 専用。PM・ユーザーへの月次/期次報告で使う。取得した数値は
|
|
9
|
+
**ノート (`hq note create <project_id> --title ... --content ...`)** にまとめると HQ UI で共有・検索できる。
|
|
10
|
+
|
|
11
|
+
### GET /reports/trial-balance
|
|
12
|
+
|
|
13
|
+
試算表 + B/S + P/L を一括で返す(最も情報量が多い)。
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
Query:
|
|
17
|
+
?from=YYYY-MM-DD&to=YYYY-MM-DD (任意。期間絞り込み)
|
|
18
|
+
?includeZero=true|false (残高ゼロ科目を含めるか。default false)
|
|
19
|
+
|
|
20
|
+
Response (概略):
|
|
21
|
+
{
|
|
22
|
+
"trialBalance": [{ account_id, code, name, type, debit, credit, balance }],
|
|
23
|
+
"balanceSheet": {...},
|
|
24
|
+
"incomeStatement": {...},
|
|
25
|
+
"netAssetBalanceSheet": {...} // 一般社団法人プロファイルのときのみ含まれる(正味財産区分付き B/S)
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### GET /reports/income-statement
|
|
30
|
+
|
|
31
|
+
P/L のみ(軽量)。当期の収益・費用・当期純利益を返す。
|
|
32
|
+
|
|
33
|
+
### GET /reports/balance-sheet
|
|
34
|
+
|
|
35
|
+
B/S のみ(軽量)。資産・負債・純資産の残高を返す。
|
|
36
|
+
|
|
37
|
+
## 法人税計算(Tax Calculations)ウィザード
|
|
38
|
+
|
|
39
|
+
**対象は `org_type=corporation` または `general_incorporated_association` の帳簿のみ**。
|
|
40
|
+
それ以外は 403 `code: 'org_type_ineligible'`。
|
|
41
|
+
|
|
42
|
+
ミニオンが触れるのは **`draft` 状態の計算だけ**。`finalized` / `journalized` 状態の計算を
|
|
43
|
+
更新しようとすると 409 `code: 'invalid_status'`。**finalize / journalize / reopen は人間専用**。
|
|
44
|
+
|
|
45
|
+
> 税率はツール側にテーブルを持たない。国税庁・自治体サイトで**最新の値をミニオン自身が調査**して入力する。
|
|
46
|
+
> 税率の確定は法的責任を伴うため、最終確定(finalize)は必ず人間が行う。
|
|
47
|
+
|
|
48
|
+
### エンドポイント
|
|
49
|
+
|
|
50
|
+
| Method | Path | 説明 |
|
|
51
|
+
|--------|------|------|
|
|
52
|
+
| GET | `/tax-calculations` | 計算一覧。Query: `?fiscal_period_id=<uuid>&status=draft,finalized,journalized` |
|
|
53
|
+
| GET | `/tax-calculations/:calcId` | 詳細 `{ calculation, adjustments, components }` |
|
|
54
|
+
| POST | `/tax-calculations` | 新規作成。Body: `{ fiscal_period_id, notes? }`。6税目を seed |
|
|
55
|
+
| PATCH | `/tax-calculations/:calcId` | `pretax_income` / `notes` 更新 |
|
|
56
|
+
| GET | `/tax-calculations/:calcId/pretax-income` | P/L から税引前当期純利益を再計算(法人税科目は除外) |
|
|
57
|
+
| GET | `/tax-calculations/:calcId/ensure-accounts` | 必要4科目(法人税費用/未払/仮払/未収還付)の存在確認 |
|
|
58
|
+
| POST | `/tax-calculations/:calcId/ensure-accounts` | 不足4科目をテンプレから自動追加 |
|
|
59
|
+
| POST | `/tax-calculations/:calcId/adjustments` | 別表四相当の加算/減算追加(下記) |
|
|
60
|
+
| PATCH | `/tax-calculations/:calcId/adjustments/:adjId` | 加算/減算更新 |
|
|
61
|
+
| DELETE | `/tax-calculations/:calcId/adjustments/:adjId` | 加算/減算削除 |
|
|
62
|
+
| PATCH | `/tax-calculations/:calcId/components/:compId` | 税目別の税率・中間納付・(均等割のみ)直接税額を更新 |
|
|
63
|
+
|
|
64
|
+
#### adjustments の Body
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
{
|
|
68
|
+
"adjustment_type": "addition" | "deduction",
|
|
69
|
+
"category": "entertainment_excess" | "depreciation_excess" | "executive_salary_excess"
|
|
70
|
+
| "reserve_addition" | "dividend_excluded" | "tax_refund_excluded" | "custom",
|
|
71
|
+
"amount": 100000,
|
|
72
|
+
"description": "交際費損金不算入", // 任意
|
|
73
|
+
"sort_order": 1 // 任意
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
#### components (税目) の更新 Body
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
{
|
|
81
|
+
"tax_rate": 23.2, // % 表記 (例: 23.2)
|
|
82
|
+
"prepaid_amount": 50000, // 中間納付額 (任意)
|
|
83
|
+
"calculated_amount": 70000 // tax_type='inhabitant_per_capita' (均等割) のときのみ受理
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 典型ワークフロー
|
|
88
|
+
|
|
89
|
+
1. `GET /periods` で対象期(status='open')の id を選ぶ
|
|
90
|
+
2. `POST /tax-calculations` で新規作成(pretax_income は P/L から自動取得)
|
|
91
|
+
3. `POST /tax-calculations/:calcId/ensure-accounts` で必要4科目を揃える
|
|
92
|
+
4. 国税庁・自治体サイトで最新税率を調査 → `PATCH /components/:compId` で各税目の `tax_rate` を入力
|
|
93
|
+
5. 中間納付があれば `PATCH /components/:compId` で `prepaid_amount` を入力
|
|
94
|
+
6. 必要なら `POST /adjustments` で別表四相当の加減算を追加(調査・税理士相談の上)
|
|
95
|
+
7. `POST /api/threads` で `@user` メンションして finalize → journalize を依頼
|
|
96
|
+
|
|
97
|
+
依頼スレッドの例:
|
|
98
|
+
```json
|
|
99
|
+
{
|
|
100
|
+
"thread_type": "help",
|
|
101
|
+
"mentions": ["user"],
|
|
102
|
+
"title": "法人税計算 FY3 の finalize お願いします",
|
|
103
|
+
"content": "計算ID xxxx の入力が完了しました。HQダッシュボード /accounting/tax-calculations/xxxx でレビュー後、Finalize → Journalize ボタンを押してください。",
|
|
104
|
+
"context": { "accounting_action": "tax_finalize", "calculation_id": "xxxx" }
|
|
105
|
+
}
|
|
106
|
+
```
|