所得税計算(Income Tax Calculation)
事業所得・各種控除から所得税額を計算するスキル。
settlement スキルで決算書の作成が完了していることを前提とする。
計算結果は /e-tax スキル(Claude in Chrome)で確定申告書等作成コーナーに入力する。
設定の読み込み(最初に実行)
shinkoku.config.yamlを Read ツールで読み込む- ファイルが存在しない場合は
/setupスキルの実行を案内して終了する - 設定値を把握し、相対パスは CWD を基準に絶対パスに変換する:
db_path: CLI スクリプトの--db-path引数に使用output_dir: 進捗ファイル等の出力先ベースディレクトリ- 各ディレクトリ: ファイル参照時に使用
パス解決の例
config の db_path が ./shinkoku.db で CWD が /home/user/tax-2025/ の場合:
shinkoku tax calc-income --input /home/user/tax-2025/output/income_input.json
進捗情報の読み込み
設定の読み込み後、引継書ファイルを読み込んで前ステップの結果を把握する。
.shinkoku/progress/progress-summary.mdを Read ツールで読み込む(存在する場合)- 以下の引継書を Read ツールで読み込む(存在する場合):
.shinkoku/progress/06-settlement.md.shinkoku/progress/02-assess.md.shinkoku/progress/05-furusato.md
- 読み込んだ情報を以降のステップで活用する(ユーザーへの再質問を避ける)
- ファイルが存在しない場合はスキップし、ユーザーに必要情報を直接確認する
基本方針
- settlement スキルで青色申告決算書が完成しているか確認してから開始する
- 所得の計算 → 控除の計算 → 税額の計算 の順序で進める
- 各ステップの計算結果をユーザーに提示し、確認を得る
- references/form-b-fields.md の各欄に正しく値を設定する
- 端数処理ルールを厳守する:
- 課税所得: 1,000円未満切捨て(国税通則法118条)
- 復興特別所得税: 1円未満切捨て(復興財源確保法13条)
- ㊺ 所得税及び復興特別所得税の額: 端数処理なし
- 申告納税額(納付の場合のみ): 100円未満切捨て(国税通則法119条)
- 還付金: 1円単位・切捨てなし(国税通則法120条)
前提条件の確認
所得税計算を開始する前に以下を確認する:
- 青色申告決算書が完成しているか: settlement スキルの出力を確認する
- 納税者プロファイルの読み込み:
uv run shinkoku profile --config {config_path}で config から納税者情報を取得する- 氏名・住所・税務署名 → 確定申告書等作成コーナーへの入力に使用
- 寡婦/ひとり親・障害者・勤労学生の状態 → 人的控除の計算に使用
- 事業所得以外の所得: 給与所得・雑所得・配当所得・一時所得等がある場合は情報を収集する
- 源泉徴収票: 給与所得がある場合は取り込みを案内する
- 各種控除の適用状況: 適用可能な控除を網羅的に確認する
- 予定納税額: assess で確認済みの予定納税額を取得する
- 未確認の場合は、前年の確定申告書(㊺欄)から判定する
- 予定納税額は源泉徴収税額とは別に管理する
- 分離課税の確認: 株式・FX の分離課税(第三表)は対象外。該当する場合は税理士への相談を案内する
必須確認チェックリスト(スキップ不可)
所得税計算を開始する前に、以下の項目がすべて確認済みであることを検証する。 config・引継書に記載がない項目は、ユーザーに直接確認してから先に進む。
- 家族構成: 配偶者の有無・扶養親族の有無を確認済みか?
- 未確認 → ユーザーに確認し、ステップ1.5 で詳細を登録する
- 確認済み(該当なし)→ ステップ1.5 をスキップ可
- 住宅ローン控除: 適用有無を確認済みか?
- 未確認 → ユーザーに確認する
- 適用あり(初年度)→ ステップ3.7 で明細書を作成する
- 予定納税: 有無・金額を確認済みか?
- 未確認 → 前年の確定申告書(㊺欄)から判定するようユーザーに確認する
- 金額未確定 →
estimated_tax_paymentパラメータに正しい値を設定できるまで進まない
ステップ1: 源泉徴収票の取り込み
給与所得がある場合、源泉徴収票からデータを取り込む。
import_data.py import-withholding の呼び出し
shinkoku import import-withholding --input withholding_input.json
入力 JSON:
{
"file_path": "path/to/withholding_slip.pdf"
}
出力:
{
"payer_name": "支払者名",
"payment_amount": 5000000,
"deduction_amount": 3560000,
"income_tax_withheld": 100000,
"social_insurance": 700000,
"life_insurance": 50000,
"spouse_deduction": 0
}
画像ファイルの場合: OCR 読み取り
extracted_text が空の場合(画像ファイルまたはスキャン PDF)、画像の読み取りは /reading-withholding スキルを使用する。
スキルの指示に従い、デュアル検証(2つの独立した読み取り結果の照合)を行って結果を取得する。
結果照合: 両方の読み取り結果から payment_amount, withheld_tax, social_insurance を比較する
一致の場合: そのまま採用。「2つの独立した読み取りで結果が一致しました」と報告
不一致の場合: ユーザーに元画像パスと両方の結果を提示し、正しい方を選択してもらう:
- 差異のあるフィールドを明示する
- A を採用 / B を採用 / 手動入力 の3択を AskUserQuestion で提示する
取り込み後の検算(必須):
OCR 結果の整合性を検証するため、「所得控除の額の合計額」と各内訳の合計を照合する:
検算: 所得控除の額の合計額 ≟ 社会保険料等の金額 ← 小規模企業共済等掛金を含む(内数)
+ 生命保険料の控除額
+ 地震保険料の控除額
+ 配偶者(特別)控除の額
+ 扶養控除額 ← 人数×単価から算出(特定63万/老人48万or58万/その他38万)
+ 障害者控除 ← 人数×単価から算出(一般27万/特別40万/同居特別75万)
+ 寡婦控除(27万)またはひとり親控除(35万) ← 該当時
+ 勤労学生控除(27万) ← 該当時
+ 基礎控除の額 ← 源泉徴収票の記載額を使用。未記載なら所得と年度から算出
注意:
-
「(うち小規模企業共済等掛金の額)」は社会保険料等の金額の内数。別途加算すると二重計上になる
-
扶養控除・障害者控除は金額欄ではなく人数欄で記載されるため、人数×単価で算出する
-
基礎控除の額は源泉徴収票に記載があればその値を使う。未記載の場合は合計所得と年度に応じて算出する(令和7・8年は特例加算あり、令和9年以降は一律58万)
-
一致の場合: 各フィールドの OCR 精度が確認できたものとして採用する
-
不一致の場合: 差額を明示し、どのフィールドが誤読の可能性があるかユーザーに提示する。元画像と突き合わせて修正する
その他の確認事項:
- 複数の勤務先がある場合は各社分を取り込む
- 年末調整済みの控除を確認し、追加控除の有無を判定する
ステップ1.5: 扶養親族・配偶者情報の確認
所得控除の計算前に、扶養親族の情報を収集する。 まず DB に登録済みのデータを確認し、不足があれば追加入力する。
DB からの読み込み
ledger.py get-spouse --db-path DB_PATHで配偶者情報を取得する(登録済みの場合)ledger.py list-dependents --db-path DB_PATHで扶養親族のリストを取得する(登録済みの場合)
未登録の場合の確認項目
-
配偶者: 配偶者の有無と年間所得金額を確認する
- 所得48万円以下 → 配偶者控除(38万円)
- 所得48万円超133万円以下 → 配偶者特別控除(段階的)
- 納税者の所得が1,000万円超 → 配偶者控除なし
- 確認後
ledger.py set-spouse --db-path DB_PATH --input spouse.jsonで DB に登録する
-
扶養親族: 以下の情報を収集する
- 氏名、続柄、生年月日、年間所得、障害の有無、同居の有無
- 16歳未満: 扶養控除なし(児童手当対象)
- 16歳以上: 一般扶養38万円
- 19歳以上23歳未満: 特定扶養63万円
- 70歳以上: 老人扶養48万円(同居58万円)
- 確認後
ledger.py add-dependent --db-path DB_PATH --input dependent.jsonで各人を DB に登録する
-
マイナンバーの収集(申告書B第二表に記載が必要):
- 配偶者のマイナンバー(12桁)
- 扶養親族(16歳以上)全員のマイナンバー
- 16歳未満の子供のマイナンバー(住民税に関する事項の記載に必要)
- 取扱注意: DB に保存するが、ツール出力やログには表示しない
-
事業専従者の確認:
- 配偶者が青色事業専従者として給与を受けている場合 → 配偶者控除の対象外
- 扶養親族が青色事業専従者・白色事業専従者の場合 → 扶養控除の対象外
- 該当する場合は控除計算から除外し、ユーザーに明示する
-
障害者控除: 扶養親族に障害がある場合
- 一般障害者: 27万円、特別障害者: 40万円、同居特別障害者: 75万円
重要: 16歳未満の扶養親族も必ず登録する
16歳未満の子供は扶養控除の対象外だが、以下の理由で申告書への記載が必要:
- 住民税の非課税限度額の判定(扶養人数に16歳未満も含む)
- 住民税の均等割の非課税判定
- 申告書B第二表「住民税に関する事項 - 16歳未満の扶養親族」欄への記載
ledger.py add-dependent で登録する際、16歳未満でもスキップせずに登録すること。
ステップ1.6: iDeCo・小規模企業共済の確認
掛金払込証明書がある場合は import_data.py import-deduction-certificate で取り込むことができる。
- iDeCo(個人型確定拠出年金)の年間掛金を確認する
- 小規模企業共済等掛金払込証明書から金額を確認
- 全額が所得控除(上限: 自営業者は年額81.6万円)
- 小規模企業共済の掛金がある場合も同様に確認する
画像ファイルの場合: OCR 読み取り
extracted_text が空の場合(画像ファイルまたはスキャン PDF)、画像の読み取りは /reading-deduction-cert スキルを使用する。
スキルの指示に従い、デュアル検証(2つの独立した読み取り結果の照合)を行って結果を取得する。
結果照合: 両方の読み取り結果から annual_premium, certificate_type を比較する
一致の場合: そのまま採用。「2つの独立した読み取りで結果が一致しました」と報告
不一致の場合: ユーザーに元画像パスと両方の結果を提示し、正しい方を選択してもらう:
- 差異のあるフィールドを明示する
- A を採用 / B を採用 / 手動入力 の3択を AskUserQuestion で提示する
ステップ1.7: 医療費明細の集計
医療費控除を適用する場合、明細を集計する。
医療費の登録・集計
ledger.py list-medical-expenses --db-path DB_PATH --input query.jsonで登録済み医療費明細を取得する- 未登録の医療費がある場合は
ledger.py add-medical-expense --db-path DB_PATH --input medical.jsonで登録する:{ "fiscal_year": 2025, "detail": { "date": "2025-03-15", "patient_name": "山田太郎", "medical_institution": "ABC病院", "amount": 150000, "insurance_reimbursement": 0, "description": null } } - 集計結果(total_amount - total_reimbursement)を医療費控除の計算に使用する
ステップ1.8: 事業所得の源泉徴収(支払調書)
取引先から受け取った支払調書の情報を登録する。
支払調書の取り込み
import_data.py import-payment-statement --input payment_input.jsonで支払調書PDF/画像からデータを抽出する
画像ファイルの場合: OCR 読み取り
extracted_text が空の場合(画像ファイルまたはスキャン PDF)、画像の読み取りは /reading-payment-statement スキルを使用する。
スキルの指示に従い、デュアル検証(2つの独立した読み取り結果の照合)を行って結果を取得する。
結果照合: 両方の読み取り結果から gross_amount, withholding_tax, payer_name を比較する
一致の場合: そのまま採用。「2つの独立した読み取りで結果が一致しました」と報告
不一致の場合: ユーザーに元画像パスと両方の結果を提示し、正しい方を選択してもらう:
- 差異のあるフィールドを明示する
- A を採用 / B を採用 / 手動入力 の3択を AskUserQuestion で提示する
ledger.py add-business-withholding --db-path DB_PATH --input withholding.jsonで取引先別の源泉徴収情報を登録する:{ "fiscal_year": 2025, "detail": { "client_name": "取引先名", "gross_amount": 1000000, "withholding_tax": 102100 } }ledger.py list-business-withholding --db-path DB_PATH --input query.jsonで登録済み情報を確認する- 源泉徴収税額の合計を
business_withheld_taxとして所得税計算に使用する
ステップ1.8.5: 税理士等報酬の登録
税理士・弁護士等に報酬を支払っている場合、報酬明細を登録する。
ledger.py list-professional-fees --db-path DB_PATH --input query.jsonで登録済みの税理士等報酬を確認する- 未登録の場合は
ledger.py add-professional-fee --db-path DB_PATH --input fee.jsonで登録する:{ "fiscal_year": 2025, "detail": { "payer_address": "支払者住所", "payer_name": "税理士名", "fee_amount": 300000, "expense_deduction": 0, "withheld_tax": 30630 } } - 源泉徴収税額は `business_withh