概要

項目内容
案件IDMAS-089
カテゴリ会計指針
PhaseP2
優先度★★
所要時間8〜12 時間(5 Step)
対象ファイル100_config/101_sys_config.js, 000_infra/002_constants.js, 400_domain/410_subledger_engine.js, 600_report/601_datamart_ingest.js, 600_report/603_datamart_pl.js, 600_report/604_datamart_bs.js, 800_ops/811_migration_s17_tax_accounts.js(新規)
前提案件MAS-073(未払法人税等), MAS-110(発生日基準), MAS-201(バックアップ)
関連案件MAS-111(科目マスタ説明列), MAS-179(監査ログ)

目的

現行システムは仕訳P/LB/S いずれも税込金額ベースで運用されているが、免税事業者から課税事業者への移行に伴い、中小企業会計指針 第24項(消費税の会計処理) に準拠した「税抜方式」への切替えが必要となる。本案件では、税込/税抜の双方を CFG_TAX_METHOD で切替可能とし、移行日以前データは税込のまま、以降データは税抜で処理するハイブリッド期間を許容する設計とする。

現在のコード

消費税フィールドの現状(410_subledger_engine.js L203-220)

const exTax  = Number(row[invIdx['税抜金額_計画']]) || 0;
const tax    = Number(row[invIdx['消費税額_計画']]) || 0;
const incTax = Number(row[invIdx['税込金額_計画']]) || 0;

const trnRow = buildTrnRow_(trnIdx, trnColCount, {
  ...
  '税区分':       row[invIdx['税区分']],
  '税抜金額_実績':   exTax,
  '消費税額_実績':   tax,
  '税込金額_実績':  incTax,
  ...
});

既存 TRN_JOUR は 3 列(税抜 / 消費税 / 税込)を既に保持している。本案件で新規列を追加する必要はなく、「どれを P/L/B/S の集計キーに採用するか」の切替えで実装可能。

P/L 集計の現状(601_datamart_ingest.js L42, L104, L290, L511)

const idxAmt = hInv.indexOf("税込金額_計画");    // L42, L290
const idxBAmt = hBank.indexOf("税込金額_決済");  // L104
const idxTotal = headers.indexOf('税込金額_計画'); // L511

P/L・B/S・CF のすべての集計で税込金額を参照している。税抜方式への切替は、これらの参照を「税区分コードに応じて 税抜/税込 を選択」する関数に置き換えることで実現する。

消費税関連の勘定科目の現状(11_mst_account)

現在の Constants.TAX_RATES / DEFAULT_TAX_RATE法人税等の税率であり、消費税率ではない。消費税率は INV 起票時の 消費税額_計画 に手動入力 or RPA による 10% 計算で反映されている(32_wrk_invoice の onEdit L182-194)。

仕訳エンジン側では消費税勘定(仮受消費税 / 仮払消費税 / 未払消費税)は科目としては未登録(要確認)。本案件で MST_ACCT への追加が必要。

修正方針

Step 1: システムパラメータと勘定科目マスタの整備

1-1. 03_sys_params への追加パラメータ

Constants.getParam 経由で取得。101_sys_config.jsinitConfigs に以下を追加:

パラメータキーデフォルト値用途
CFG_TAX_METHOD"税込""税込" or "税抜"。全社統一の方針
CFG_TAX_TRANSITION_DATE""YYYY-MM-DD。税抜方式の適用開始日。空なら全期間 CFG_TAX_METHOD を適用
CFG_TAX_ROUNDING"切捨"税込→税抜逆算時の端数処理。"切捨" / "四捨五入" / "切上"
CFG_CONSUMPTION_TAX_RATE_STD0.10標準税率(10%)
CFG_CONSUMPTION_TAX_RATE_REDUCED0.08軽減税率(8%)

Constants.getParam(key, defaultValue) の既存パターンで参照。

1-2. 勘定科目マスタへの追加(11_mst_account)

中小企業会計指針 第24項に準拠した消費税専用科目を新設:

主科目コード諸表区分表示区分正式科目名大分類固変区分
135BS流動資産仮払消費税等流動資産
220BS流動負債仮受消費税等流動負債
222BS流動負債未払消費税等流動負債

既存コードとの衝突確認: MST_ACCT の「主科目コード」は既存の 212 未払法人税等 と近接するが重複しないこと。Step 1 の最初に AccountRepository.findAll() で既存コード表をダンプして空きコードを決定する。

002_constants.js に定数として定義:

Constants.TAX_ACCOUNTS = {
  INPUT:   '仮払消費税等',   // 費用計上時の相手勘定(B/S 流動資産)
  OUTPUT:  '仮受消費税等',   // 売上計上時の相手勘定(B/S 流動負債)
  PAYABLE: '未払消費税等',   // 決算整理後の純額(B/S 流動負債)
};

Step 2: Action A の仕訳生成ロジック拡張

2-1. 税抜方式の判定ヘルパー

004_utils.jsUtils.isExclusiveTaxMethod(accrualDate) を新設:

Utils.isExclusiveTaxMethod = function(accrualDate) {
  var method = Constants.getParam('CFG_TAX_METHOD', '税込');
  if (method !== '税抜') return false;
  var transitionDate = Constants.getParam('CFG_TAX_TRANSITION_DATE', '');
  if (!transitionDate) return true; // 全期間税抜
  var ad = accrualDate instanceof Date ? accrualDate : new Date(accrualDate);
  var td = new Date(transitionDate);
  return ad >= td;
};

2-2. Action A 仕訳生成の拡張(410_subledger_engine.js L200-230)

方針: 既存の TRN_JOUR 行構造(1 INV = 1 TRN 行)は維持し、P/L・B/S 集計側で税抜列を参照することで税抜方式を実現する(Option A・低リスク)。

ただし、複式簿記の完全性を担保するため、税抜方式適用時には「消費税額を明示的に分離する補助仕訳行」をオプションで生成可能とする(Option B・決算書外部連携用)。本案件では Option A をメインとし、Option B は Step 6(将来拡張)とする。

Action A 内で以下のロジックを追加(既存の trnRow 構築の直後):

// 税抜方式の判定と税区分による分岐
var isExclusive = Utils.isExclusiveTaxMethod(accrualDate);
var taxClass = String(row[invIdx['税区分']] || '').trim();
var isTaxable = (taxClass === '課税' || taxClass === '課税10%' || taxClass === '課税8%');

// 非課税・対象外は tax=0 として扱う(INV 起票時点で 0 のはずだが防衛的に)
if (!isTaxable) {
  // 税抜 == 税込 として扱う。消費税=0 で通す
}

// 税抜方式 かつ 課税取引 のとき、仕訳ステータスに「税抜」フラグを付与
if (isExclusive && isTaxable && tax > 0) {
  trnRow[trnIdx['仕訳ステータス']] = '計上済_税抜';
  // 摘要に補記: "[税抜 10%: 本体 ex, 消費税 tax]"
  var originalMemo = trnRow[trnIdx['摘要']];
  trnRow[trnIdx['摘要']] = originalMemo + ' [税抜 本体:' + exTax + ' 税:' + tax + ']';
}

重要: 既存の 税抜金額_実績 / 消費税額_実績 / 税込金額_実績 の値はすべて保持する。P/L は 税抜金額_実績 を参照、B/S は 消費税額_実績 を仮受/仮払消費税として集計する。

2-3. 税込→税抜逆算ヘルパー(INV 起票時のガード)

INV の「税抜金額_計画 + 消費税額_計画 == 税込金額_計画」が成立していない場合、税抜方式では計算ズレが発生する。201_data_validator.js に以下を追加:

Validator.validateTaxConsistency = function(exTax, tax, incTax, taxClass) {
  if (taxClass === '対象外' || taxClass === '非課税') {
    // 税額0、税抜==税込が前提
    if (tax !== 0 || exTax !== incTax) return { ok: false, reason: '非課税/対象外で税額非ゼロ' };
  }
  if (Math.abs((exTax + tax) - incTax) > 1) { // 丸め誤差 1 円は許容
    return { ok: false, reason: '税抜+税=税込 が不整合' };
  }
  return { ok: true };
};

Action A の承認済 INV ループ内で呼び出し、不整合時は Utils.logWarn + 処理結果 列に警告記録(処理は継続)。

Step 3: データマート P/L の税抜切替

3-1. 集計列セレクタの共通化(601_datamart_ingest.js)

現在 hInv.indexOf("税込金額_計画") でハードコードしている箇所(L42, L290, L511)を、行単位で税抜/税込を選択するロジックに変更:

function getPlAmount_(row, invIdx, accrualDateIdx) {
  var accrualDate = row[accrualDateIdx];
  if (!Utils.isExclusiveTaxMethod(accrualDate)) {
    return Number(row[invIdx['税込金額_計画']]) || 0;
  }
  var taxClass = String(row[invIdx['税区分']] || '').trim();
  if (taxClass === '対象外' || taxClass === '非課税') {
    return Number(row[invIdx['税込金額_計画']]) || 0; // 非課税は税抜=税込
  }
  return Number(row[invIdx['税抜金額_計画']]) || 0;
}

L42 / L290 / L511 の Number(row[idxAmt]) || 0getPlAmount_(row, invIdx, invIdx['発生日(P/L計上日)']) に置換。

3-2. B/S への消費税勘定の注入(604_datamart_bs.js)

P/L の費用/売上側で剥がした消費税額は、B/S 側で 仮受消費税等 / 仮払消費税等 に集計する必要がある。

INV の税区分が課税 かつ Utils.isExclusiveTaxMethod(accrualDate) == true の場合、B/S 集計ロジックに以下を追加:

収支区分科目名金額B/S 影響
収入仮受消費税等消費税額_計画流動負債 増加
支出仮払消費税等消費税額_計画流動資産 増加

実装は 604_datamart_bs.js の集計ループ内に「仮想仕訳」として追加(P/L と同じ行数を走査するが、科目を消費税勘定に付け替えて加算)。

3-3. CF 計算書の整合性(605_datamart_cf.js)

CF は税込ベースで動く(実際の入出金は税込)。そのため 605 は変更不要。ただし、CF 計算表の「当期純利益 → 営業 CF」の調整項目に「仮受消費税増加」「仮払消費税増加」を追加する必要がある場合は、Step 4 と同時に対応する。本 Step では一旦スキップし、Step 4 で対応。

Step 4: 決算整理仕訳(仮受 ⇔ 仮払 → 未払消費税)

決算時(年度末 or 四半期)に、仮受消費税と仮払消費税を相殺して未払消費税(還付の場合は未収消費税)を算出する処理を追加。dmCalcPl_ と同様、データマート層で完結し、TRN への書き込みは行わない「見積値」として B/S に反映する設計(法人税等と同方式)。

実装場所: 609_datamart_kpi.js 末尾 or 604_datamart_bs.js 内の決算月判定ブロック。

function dmCalcConsumptionTax_(martBs, boundaryYm) {
  // 年度末月(例: 7月が決算月なら 2026-07)判定
  var yearEndMonth = Constants.getParam('CFG_FISCAL_YEAR_END_MONTH', '7');
  var currentM = boundaryYm.split('-')[1];
  if (currentM !== String(yearEndMonth).padStart(2, '0')) return;

  var outputYtd = sumByAccount_(martBs, '仮受消費税等'); // 期中累計
  var inputYtd  = sumByAccount_(martBs, '仮払消費税等');
  var payable   = outputYtd - inputYtd;

  // 振替仕訳: 仮受 → 未払、仮払 → 未払(相殺)
  // 実 TRN への書き込みではなく、B/S 表示上の組み替えとして処理
  martBs[boundaryYm]['仮受消費税等'] = 0;
  martBs[boundaryYm]['仮払消費税等'] = 0;
  martBs[boundaryYm]['未払消費税等'] = (martBs[boundaryYm]['未払消費税等'] || 0) + Math.max(0, payable);
  // 還付の場合: payable < 0 → 未収消費税(科目未登録なら流動資産側で保持)
}

決算月の特定: CFG_FISCAL_YEAR_END_MONTH を 03_sys_params に追加(デフォルト 7)。会計基準上は期末ではなく消費税申告期限に合わせた振替が正しいが、本案件では簡略化して決算月末に実施。

Step 5: 移行期間マイグレーションと検証スクリプト

800_ops/811_migration_s17_tax_accounts.js を新設(804-808 パターン準拠)。

function migrationS17VerifyTaxConsistency() {
  // 1. CFG_TAX_TRANSITION_DATE 以降の INV/TRN を全走査
  // 2. 各行で Validator.validateTaxConsistency() を実行
  // 3. 不整合行を一覧レポートにまとめ、スプレッドシート末尾タブ「90_s17_audit」に出力
  // 4. 不整合を自動修正するオプション(--fix フラグ相当)は提供しない(手動レビュー必須)
  //    中小企業会計指針 第24項に従った人間レビューを前提
}

非修正ポリシー: 税抜/税込の逆算は丸め誤差が発生しうるため、自動修正は行わず監査レポートのみ出力する。人間(経理担当)がレビューして手動で修正。

仕訳パターン(税込方式 vs 税抜方式)

売上計上(¥110 の課税売上)

税込方式(現行):

借方貸方
売掛金 110売上高 110

P/L 売上高: 110、B/S 仮受消費税: なし

税抜方式(本案件):

借方貸方
売掛金 110売上高 100
仮受消費税等 10

P/L 売上高: 100、B/S 仮受消費税等: 10(流動負債)

経費計上(¥11,000 の課税仕入)

税込方式(現行):

借方貸方
費用科目 11,000買掛金 11,000

税抜方式(本案件):

借方貸方
費用科目 10,000買掛金 11,000
仮払消費税等 1,000

決算整理(期末)

税抜方式の場合のみ:

借方貸方
仮受消費税等 ○○仮払消費税等 △△
未払消費税等 (差額)

※ 差額がマイナスなら借方「未収消費税」、貸方「仮受消費税」。

非課税・対象外取引

税区分税込方式税抜方式
非課税(例: 住居家賃)税込=税抜税込=税抜(税抜方式でも変化なし)
対象外(例: 給与、社保)税込=税抜税込=税抜(変化なし)
軽減税率 8%税込のまま集計本体(税抜)と 8% 税に分離
標準税率 10%税込のまま集計本体(税抜)と 10% 税に分離

影響範囲

変更ファイル変更量内容
000_infra/002_constants.js約 10 行Constants.TAX_ACCOUNTS 定数定義
000_infra/004_utils.js約 15 行Utils.isExclusiveTaxMethod 追加
100_config/101_sys_config.js約 8 行initConfigs に新 5 パラメータ追加 + MST_ACCT に 3 科目追加
200_data/201_data_validator.js約 20 行Validator.validateTaxConsistency 追加
400_domain/410_subledger_engine.js約 25 行Action A に税抜方式フラグ + 摘要補記(既存列は破壊しない
600_report/601_datamart_ingest.js約 40 行getPlAmount_ ヘルパー + 4 箇所(L42/L104/L290/L511)の置換
600_report/603_datamart_pl.js0-10 行行定義は変更不要。集計値の解釈が変わるのみ
600_report/604_datamart_bs.js約 30 行仮受/仮払消費税の仮想仕訳追加 + 決算月の相殺ロジック
600_report/605_datamart_cf.js0-10 行現状維持(Step 6 以降で営業CF調整項目検討)
800_ops/811_migration_s17_tax_accounts.js約 150 行(新規)整合性チェックレポート + MST_ACCT 科目追加マイグレーション

既存動作への影響:

  • CFG_TAX_METHOD = "税込"(デフォルト)かつ CFG_TAX_TRANSITION_DATE = "" の場合、すべてのロジックは現行と同一動作(フラグが立たないため)
  • 税抜方式適用後は、P/L 売上高・費用科目の数値が小さくなる(10% 分剥がれる)。前年同月比較(MAS-020)や予実差異(MAS-001)は、税込/税抜が混在する期間で比較不能になる点に注意
  • CF は現状通り税込ベース。営業 CF と P/L 営業利益の乖離が拡大する(仮受増加分だけ営業CFが多くなる)

注意事項

  1. 既存列は破壊しない — TRN_JOUR の 税抜金額_実績 / 消費税額_実績 / 税込金額_実績 の 3 列はすべて保持。税抜方式は「どれを集計に使うか」の切替えに過ぎない。
  2. 列参照はヘッダー名ベースindexOf を貫徹。特に getPlAmount_ ヘルパー内でも invIdx['税抜金額_計画'] / invIdx['消費税額_計画'] / invIdx['税込金額_計画'] のすべてを事前解決する。
  3. CFG_TAX_TRANSITION_DATE の境界>=(以降)を採用。開始日当日は税抜扱い。
  4. 非課税/対象外の防御的処理 — 税抜方式でも「非課税」「対象外」は税込=税抜のまま扱う。getPlAmount_ / B/S 集計の両方で税区分チェックを行う。
  5. 丸め誤差の吸収 — 税抜+税=税込 は JIS 丸めで最大 1 円のズレが発生しうる。validateTaxConsistency では 1 円を許容範囲とする。それ以上のズレは INV 側のバグまたはユーザー入力ミスの可能性が高い。
  6. 決算整理の実装範囲 — Step 4 の仮受/仮払→未払振替は「データマート層の B/S 表示上の組み替え」として実装。実 TRN_JOUR への書き込みはしない(法人税等と同方針)。冪等性確保のため、再計算時は必ず martBs をゼロから再構築する。
  7. CFG_FISCAL_YEAR_END_MONTH — 月数値のみ保持(7 or 07)。期の切替ロジックは既存の Utils.getFiscalYearStart_() があるなら流用する。未実装なら本案件では月判定のみで簡略化。
  8. MAS-020 / MAS-001 の注記 — 税込/税抜が混在する期間では、前年同月比較は機能無効化または注釈表示とする。Step 5 マイグレーション完了時に「過去データを税抜相当に補正するか」を経理で協議。
  9. MST_ACCT への追加は setupAllSchemas ではなく手動マイグレーション — 科目マスタは 03_sys_params と同じく DDL 非管理 or 既存科目との競合リスクがあるため、811_migration で追加する(冪等)。
  10. 801_migration_v1_to_v2.js や既存マイグレーションで TAX_RATES を参照している箇所DEFAULT_TAX_RATE = 0.30 は法人税等であり本案件と無関係。混同しないこと。

エッジケース

条件挙動理由
CFG_TAX_METHOD = "税込"全期間・全取引を税込で処理デフォルト動作、後方互換
CFG_TAX_METHOD = "税抜" + CFG_TAX_TRANSITION_DATE = ""全期間税抜新規立ち上げ企業向け
CFG_TAX_METHOD = "税抜" + CFG_TAX_TRANSITION_DATE = "2026-08-01"2026-08-01 以降が税抜、それ以前は税込免税→課税事業者移行ケース
税区分「対象外」で 消費税額_計画 != 0警告ログ、税込=税抜 として処理継続入力ミスの可能性、人間レビュー促進
税区分「非課税」税抜方式でも税込=税抜非課税取引は消費税発生しない
税抜+税≠税込 (1 円以内)許容(丸め誤差)JIS 丸めの範囲内
税抜+税≠税込 (1 円超)警告ログ、税込を正として税抜=税込-税 で再計算入力整合性異常、手動修正必要
税率 8%(軽減税率)税区分「課税8%」として扱う軽減税率対象の飲食料品等
税率 0%(輸出等)税区分「免税」として新設 or 「対象外」運用中小企業会計指針では免税取引として別途管理
決算月に仮受 < 仮払(還付ケース)未払消費税 = 0、差額は未収消費税(要勘定科目追加)輸出主体企業・設備投資年度で発生
移行日跨ぎの支払サイト(6/30 発生、8/1 決済)発生日で判定(税込)P/L 計上基準は発生日
RPA 起票の INV が移行日以降税抜方式で処理されるRPA 側の変更は不要(発生日で判定)
税抜方式適用後にユーザーが手動で 税抜金額_計画 を改変P/L に直接反映されるAction A の再計上ではなく、マート再計算で即時反映

実データ検証(MCP での事前確認)

  1. MST_ACCT の既存主科目コード一覧 — 仮受(220)/仮払(135)/未払(222) が既存コードと衝突していないか。衝突時は空きコードに変更。
  2. 32_wrk_invoice の税区分プルダウン値の実態 — DDL 想定値(課税/非課税/対象外)と実データが一致するか。「課税10%」「課税8%」等の派生値の有無。
  3. 既存 INV の税抜+税=税込 整合性 — 全件中どの程度が不整合か事前計測(MCP で SUM チェック)。移行前の前処理の要否を判断。
  4. 税区分「対象外」で消費税額が非ゼロのレコード数 — データ品質の現状確認。
  5. CFG_ 系の既存パラメータ命名規則 — 03_sys_params の既存キーと重複しないか(CFG_REIMBURSEMENT_PAYEE 等の前例に準拠)。
  6. Constants.getParam の実装 — デフォルト値の扱い、空文字と未定義の区別を把握(Step 2 の isExclusiveTaxMethod 実装に影響)。
  7. 決算月の現行運用 — 03_sys_params に既存の期末月パラメータがあるか、GAS コード内にハードコード箇所があるか。
  8. 最新の消費税申告実績 — 経理担当から直近 1 期の仮受/仮払/納付額を入手し、Step 4 の計算結果と突合できるテストデータにする。

関連ドキュメント

仕様書関連箇所
docs/spec/spec_corporate_tax.md法人税等の自動計算(本案件と同方式のデータマート層完結パターン)
dev_mas-073_corporate_tax_formal.md未払法人税等の B/S 計上ロジック(Step 4 で参考)
dev_mas-116_migration_framework.md800_ops マイグレーション基盤
dev_mas-110_document_date.md発生日(P/L計上日)の扱い
dev_mas-179_audit_trail.md税抜方式切替の監査ログ(Utils.auditLog で CFG_TAX_METHOD 変更を記録)
中小企業会計指針 第24項消費税の会計処理(税抜方式原則)
CLAUDE.md会計ロジック規約(科目マスタ未登録はエラー、税区分=対象外ルール等)

人間が検討すべき事項

✅ MAS-304 にて調査済(2026-04-19)MAS-304 研究結果 ✅ MAS-305 にて調査済(2026-04-19)MAS-305 研究結果 確定済の項目は 【MAS-304 確定】 または 【MAS-305 確定】 タグで明示。

  • 移行日の確定 — 課税事業者の開始事業年度の初日(例: 2026-08-01)。経理・税理士と確定。
  • 移行前データの取扱い — 移行日以前の税込データを税抜相当に遡及補正するか・そのまま保持するか。前年同月比較が必要なら遡及補正、不要ならそのまま。本仕様書はデフォルトで「そのまま保持」。
  • 【MAS-304 確定】還付時の勘定科目「未収消費税等」(流動資産)として独立科目を新設する方針で確定。「未払消費税等」のマイナス表示は XBRL 出力等でバリデーションエラーリスクのため非推奨。科目マスタ初期データに「未収消費税等」を登録すること。
  • 【MAS-304 確定】期中の仮受/仮払の表示レベル — B/S に 「仮受消費税等」「仮払消費税等」を別表示。中小企業会計指針 第 24 項に準拠。
  • 決算整理の実施タイミング — 年度末のみ vs 四半期末 vs 月次。本仕様書は年度末のみで実装。四半期対応は Step 6 以降。
  • 【MAS-304 確定】軽減税率(8%)の適用範囲とインボイス端数処理 — 「1 つの適格請求書につき税率ごとに 1 回ずつの端数処理」を厳守。明細行単位の積み上げ計算は法令違反。仕訳ヘッダレベルで Tax_Code でグループ化 → 税率ごとの合計に税率を乗じて端数処理する設計とする。
  • 【MAS-304 確定 / MAS-305 更新】インボイス未対応取引の経過措置(時系列ロジック) — 取引日ベースで控除率を動的決定。令和 8 年度税制改正大綱により延長:
    • 2023-10-01 〜 2026-09-30: 80% 控除
    • 2026-10-01 〜 2028-09-30: 70% 控除(改正後の新段階、旧 50% から引き上げ)
    • 2028-10-01 〜 2029-09-30: 50% 控除(改正後の新段階)
    • 2029-10-01 〜: 0%(控除不可)
    • 控除不可分は 元の経費科目に加算actualExpense = baseAmount + nonDeductibleTax)して費用化する。
    • 【MAS-305 確定】判定基準日は「支払日」ではなく「役務提供完了日(課税仕入れの日)」
    • 入力 UI に「適格請求書発行事業者フラグ(Boolean)」必須。
  • 【MAS-304 確定】端数差額の自動雑損益化 — 期末バッチで「税理士確定額」を入力させ、システム理論値との差分を 雑収入 / 雑損失 に自動振替する設計を実装。
  • 【MAS-304 確定】「1 円のズレ」の手動補正 — 取引先の端数処理仕様差で発生する 1 円ズレは不可避。システム自動計算値はあくまで初期値とし、UI 上で手入力上書きを許容する。上書き値を「正」とし税抜本体を逆算調整する。
  • 【MAS-304 確定】税込・税抜の混在入力 UI — 入力 UI に「税込/税抜入力」トグルを必須化。「税込入力」選択時はバックエンドで自動分割し、DB には税抜 2 行に正規化保存。
  • 【MAS-305 確定】T 番号バリデーション仕様 — 入力時に ^T\d{13}$ の正規表現でフォーマット検証 + モジュラス 11 系チェックデジット検証を実施。validateTNumber() 関数をユーティリティに実装。詳細アルゴリズムは RQ-007_result.md §② 参照。
  • 【MAS-305 確定】国税庁 Web-API 連携 — 「適格請求書発行事業者公表システム Web-API」を利用する場合は事前承認申請が必要。レート制限は非公開。利用時は UI に「国税庁によって保証されたものではない」旨の明示義務。
  • 【MAS-305 確定】取引区分の判別フロー国外? → 事業/対価? → 非課税別表一? → 輸出免税? → 課税(10%/8%) の 4 段階意思決定フローを UI・バックエンド両方に実装。詳細は RQ-007_result.md §④ 参照。
  • 【MAS-305 確定】軽減税率判定マトリクス — 飲食料品 8% / 酒類 10% / 外食・ケータリング 10% / 一体資産(税抜 ≤ 1 万円 かつ 食品部分 ≥ 2/3 なら 8%)/ 新聞 8%(週 2 回以上・定期購読)。
  • 【MAS-305 確定】簡易インボイス対応 — 小売業・飲食店業・タクシー業では通常インボイスと比べ「宛名省略可 / 税額記載は適用税率のみで代用可 / 対価は税抜・税込いずれか一方のみで可」。自動生成テンプレートは出し分け必須。
  • 【MAS-305 確定】T 番号未記載・誤記載時の SOP — (1) 売手に修正インボイス再発行依頼 (2) 買手側で仕入明細書作成 → 売手確認で代替可。取引先の登録ステータス・課税期間をシステムで厳密管理。遡及登録の特例あり。
  • 【MAS-305 確定】電帳法との連携 — 電子取引データは「取引年月日 / 取引先 / 取引金額」の 3 項目検索機能必須。輸出関係書類は輸出許可日の翌日から 5 年間保存。
  • MAS-020 / MAS-001 の注記方針 — 税込/税抜混在期間の扱い。経理との協議事項。
  • 監査対応 — 税抜方式切替の変更履歴を監査証跡(MAS-179)に必ず記録する方針。
  • 輸入消費税の扱い — 該当があれば「仮払消費税等」に合算するか、別科目にするか。

顧問税理士への確認事項(MAS-304 / MAS-305 結果より、導入時オンボーディングで取得)

導入企業ごとに 03_sys_params の Tenant Settings として保持:

パラメータ質問内容既定値出典
CFG_TAX_ROUNDING_RULE端数処理ルール(切り捨て / 四捨五入 / 切り上げ)floorMAS-304
CFG_REFUND_DISPLAY_ACCOUNT還付時の表示科目(未収消費税等 / 未払消費税等マイナス)未収消費税等MAS-304
CFG_NONDEDUCTIBLE_TAX_ACCOUNTインボイス未対応の控除不可分の科目(元経費に加算 / 租税公課に集約)元経費に加算MAS-304
CFG_TAX_ADJUSTMENT_DATE決算整理仕訳の起票日付(期末日固定)期末日MAS-304
CFG_EXPENSE_REIMBURSEMENT_POLICY立替経費×簡易インボイスの紐付け運用従業員名簿連携MAS-305 Q1
CFG_RETROACTIVE_TREGISTRATION_POLICY取引先の遡及登録時のデータ修正方針(遡及修正 / 当月調整仕訳)当月調整仕訳MAS-305 Q3

実装プロンプト(Claude Code 用)

あなたはGAS会計システム(bizlp-gas-accounting)のシニア開発者です。
案件 MAS-089「消費税 税抜方式への切替え」を実装してください。
会計指針準拠かつ既存の仕訳エンジンの堅牢性を損なわない段階実装が必要なため、
Step 1 → Step 2 → Step 3 → Step 4 → Step 5 の順に段階実装し、
各 Step 完了後に dev 動作確認してから次へ進むこと。

## 実行前タスク

以下のファイルを Read し、構造と既存パターンを把握すること
(Grep の部分一致のみで推測しない、failure_patterns.md #18-#20 参照):

- `docs/dev/dev_mas-089_consumption_tax_exclusive_method.md` — 本仕様書全文
- `docs/spec/spec_corporate_tax.md` — 法人税等のデータマート層完結パターン(本案件と同方式)
- `docs/arch/ref_sme_accounting_guidelines.md` — 中小企業会計指針 第24項
- `docs/_internal/failure_patterns.md` — #18-#20(Read 原則)、#11(未登録科目エラー)
- `000_infra/002_constants.js`
  - `Constants.TAX_RATES` / `DEFAULT_TAX_RATE` の定義(これは法人税等。混同しない)
  - `Constants.getParam(key, default)` の実装
- `000_infra/004_utils.js` — `Utils.logInfo` / `Utils.logWarn` / `Utils.logError` / 日付ユーティリティ
- `100_config/101_sys_config.js`
  - `initConfigs` の既存パラメータ登録パターン(`CFG_REIMBURSEMENT_PAYEE` 等)
  - MST_ACCT の headers 定義(L477)と科目追加の既存先例
- `200_data/201_data_validator.js` — 既存 Validator のパターン
- `400_domain/410_subledger_engine.js`
  - L180-L295 Action A の承認済 INV ループ、TRN 生成ロジック
  - L200-L230 税額 3 列を TRN_JOUR に書き込んでいる既存処理
  - L247-L254 決済手段「仕訳振替」「資産計上」の分岐
- `600_report/601_datamart_ingest.js`
  - L42, L104, L290, L511 `税込金額_計画` / `税込金額_決済` を参照する 4 箇所
- `600_report/603_datamart_pl.js` — P/L 行構成定義
- `600_report/604_datamart_bs.js` — B/S 集計ロジック、仮受/仮払の注入ポイント
- `800_ops/808_migration_i24.js` — マイグレーションの標準パターン

## 修正対象ファイル

1. `000_infra/002_constants.js` — 定数追加のみ
2. `000_infra/004_utils.js` — ヘルパー関数追加のみ
3. `100_config/101_sys_config.js` — initConfigs 拡張、MST_ACCT 定義確認(自動追加はしない)
4. `200_data/201_data_validator.js` — バリデーション関数追加のみ
5. `400_domain/410_subledger_engine.js` — Action A に税抜フラグ付与
6. `600_report/601_datamart_ingest.js` — getPlAmount_ ヘルパー + 4 箇所置換
7. `600_report/604_datamart_bs.js` — 仮受/仮払の仮想仕訳注入 + 決算月相殺
8. `800_ops/811_migration_s17_tax_accounts.js` — 新規(MST_ACCT 追加 + 整合性チェックレポート)

## 実装内容

### Step 1: 基盤整備

1-A. `002_constants.js` に `Constants.TAX_ACCOUNTS` 定数追加
1-B. `004_utils.js` に `Utils.isExclusiveTaxMethod(accrualDate)` 追加
1-C. `101_sys_config.js` `initConfigs` に 5 パラメータ追加(CFG_TAX_METHOD / CFG_TAX_TRANSITION_DATE / CFG_TAX_ROUNDING / CFG_CONSUMPTION_TAX_RATE_STD / CFG_CONSUMPTION_TAX_RATE_REDUCED)
1-D. `811_migration_s17_tax_accounts.js` に MST_ACCT 追加処理(冪等)— 仮受/仮払/未払消費税等の3科目
1-E. 101_sys_config.js の「🔧 マイグレーション」メニューに `migrationS17AddTaxAccounts` 追加
1-F. dev で `migrationS17AddTaxAccounts` 実行 → 3 科目追加確認

### Step 2: 仕訳エンジン拡張(Action A)

2-A. `201_data_validator.js` に `Validator.validateTaxConsistency` 追加
2-B. `410_subledger_engine.js` L200-L230 付近に税抜方式フラグロジック追加
2-C. 既存 3 列(税抜/消費税/税込)の値保存は維持
2-D. 摘要に「[税抜 本体:X 税:Y]」補記(税抜方式適用時のみ)

### Step 3: データマート P/L 切替

3-A. `601_datamart_ingest.js` に `getPlAmount_(row, invIdx, accrualDateIdx)` ヘルパー追加
3-B. L42, L104, L290, L511 の `税込金額_計画/決済` 参照を `getPlAmount_` に置換
3-C. `603_datamart_pl.js` は行定義のみのため原則変更不要

### Step 4: B/S 消費税勘定集計

4-A. `604_datamart_bs.js` の集計ループに「仮想仕訳」として 仮受/仮払消費税の加算を追加
4-B. 決算月(CFG_FISCAL_YEAR_END_MONTH)判定で 仮受⇔仮払→未払 振替
4-C. 還付ケース(仮受 < 仮払)の処理: 未払消費税=0、差額は B/S 側で「未収消費税」か未払マイナス表示かを経理協議(本案件ではコメントのみ)

### Step 5: マイグレーション・監査レポート

5-A. `811_migration_s17_tax_accounts.js` に `migrationS17VerifyTaxConsistency` 関数追加
5-B. CFG_TAX_TRANSITION_DATE 以降の全 INV/TRN で `validateTaxConsistency` 実行
5-C. 不整合行を「90_s17_audit」タブに書き出し
5-D. 101_sys_config.js のマイグレーションメニューに追加
5-E. 自動修正は行わない(人間レビュー必須)

## 制約

- 既存の `税抜金額_実績` / `消費税額_実績` / `税込金額_実績` の 3 列はすべて保持。破壊しない
- 列参照は必ずヘッダー名ベース(`indexOf`)
- `CFG_TAX_METHOD = "税込"`(デフォルト)の場合、すべてのロジックは現行と同一動作であること
- TRN_JOUR への書き込みは Action A のみ。データマート層から TRN への逆流禁止
- 決算整理は B/S 表示上の組み替えのみ(法人税等と同方式)
- 科目マスタ追加は `setupAllSchemas` ではなく 811_migration で手動実行(誤上書き防止)
- CF 計算書(605)は本案件では変更しない(将来 Step 6)
- MAS-020(YoY)/ MAS-001(予実差異)のロジック変更は本案件スコープ外。税込/税抜混在期間の扱いは経理協議事項として注記のみ

## エッジケース

仕様書「エッジケース」テーブルの全 12 行を実装時の判定条件に反映:
- 税込方式デフォルト(CFG_TAX_METHOD 未設定時)
- 移行日の前後判定(>= で以降を税抜)
- 非課税・対象外は税抜方式でも税込=税抜
- 税抜+税=税込 の丸め誤差 1 円以内は許容
- 還付ケース(仮受 < 仮払)の分岐
- 軽減税率 8% の税区分扱い
- RPA 起票 INV は発生日で判定(RPA 側変更不要)

## 実データ検証

実装着手前に MCP で以下を確認:
1. MST_ACCT の既存主科目コードの空き(135/220/222 を仮定したが要確認)
2. 32_wrk_invoice の税区分プルダウン実値(課税/非課税/対象外/課税8% 等の実態)
3. 既存 INV の 税抜+税=税込 整合率(≥99% であることを目安)
4. 税区分「対象外」で消費税額>0 のレコード数
5. 03_sys_params の既存 CFG_ キー群との重複なし
6. 直近 1 期の仮受/仮払/納付実績(経理から入手)

## 動作確認

1. `npm run push:dev` で開発 GAS にデプロイ
2. `migrationS17AddTaxAccounts` 実行 → 11_mst_account に 3 科目追加、冪等性(2 回目実行でスキップ)
3. `initConfigs` 実行 → 03_sys_params に 5 パラメータ追加
4. `CFG_TAX_METHOD = 税込` の状態で runAllTests 実行 → 全テスト green(後方互換)
5. `CFG_TAX_METHOD = 税抜` に変更し、発生日=今日の課税売上 INV を 1 件作成・承認 → Action A 実行
6. TRN_JOUR に 1 行計上され、摘要に「[税抜 本体:X 税:Y]」が付くこと
7. P/L データマート再計算 → 売上高が税抜金額で集計されること
8. B/S 再計算 → 仮受消費税等に税額が計上されること
9. 課税仕入 INV を 1 件計上 → 仮払消費税等に反映
10. `CFG_FISCAL_YEAR_END_MONTH` 月末の B/S → 仮受/仮払が 0、未払消費税等に差額計上
11. `CFG_TAX_TRANSITION_DATE` を今日に設定し、前日発生の INV で確認 → 税込のまま処理されること
12. `migrationS17VerifyTaxConsistency` 実行 → 整合性レポートが 90_s17_audit に出力
13. 税区分「対象外」で消費税 0 の INV → 税抜方式でも税抜=税込のまま
14. `CFG_TAX_METHOD = 税込` に戻す → P/L が税込ベースに即時復元

### 拡張思考の使用状況

| フェーズ | 拡張思考 | 備考 |
|---------|:--------:|------|
| Step 1 基盤整備 | なし | 定数・パラメータ追加の機械的作業 |
| Step 2 Action A 拡張 | あり | 既存ロジックへの非破壊的注入、税区分分岐 |
| Step 3 P/L 切替 | あり | 4 箇所置換 + ヘルパー設計 |
| Step 4 B/S 集計 | あり | 仮想仕訳の注入位置、決算月相殺、還付ケース分岐 |
| Step 5 マイグレーション | なし | 808_migration_i24 パターン踏襲 |

推奨実行モデル

工程推奨モデル理由
Step 1 基盤整備Claude Sonnet 4.6定数・パラメータ追加だが、既存命名規則との整合確認が必要
Step 2 Action AClaude Opus 4.6仕訳エンジンへの非破壊注入、会計ロジック理解、失敗時の影響大
Step 3 P/L 切替Claude Sonnet 4.6ヘルパー導入 + 4 箇所置換、パターン適用中心
Step 4 B/S 集計Claude Opus 4.6決算整理ロジック、仮想仕訳設計、還付ケース、会計指針準拠判断
Step 5 マイグレーションClaude Sonnet 4.6808_migration_i24 パターン踏襲、標準構造

変更履歴

日付変更内容
2026-04-17初版作成。CFG_TAX_METHOD による税込/税抜切替、既存 3 列(税抜/消費税/税込)の非破壊活用、601 の getPlAmount_ ヘルパー導入、604 への仮受/仮払仮想仕訳注入、決算月相殺、整合性監査レポートの 5 ステップ設計

仕様書作成プロンプト(再現性・監査性のため記録)

展開して表示
あなたはGAS会計システム(bizlp-gas-accounting)のシニアアーキテクト兼仕様書ライターです。
案件 MAS-089「消費税 税抜方式への切替え」の開発仕様書を作成してください。

## 実行前タスク

以下のファイルを読み込み、現在の消費税計算と仕訳生成ロジックを把握してください。
- `docs/_internal/TODO_future.md` — MAS-089 の概要確認
- `410_subledger_engine.js` — Action A/B の仕訳生成ロジック
- `603_datamart_pl.js` — P/L の集計ロジック
- `002_constants.js` — 勘定科目コードの定義
- `docs/spec/spec_corporate_tax.md` — 参考:法人税等の自動計算仕様

## 既存実装の前提知識

- 現在、多くのデータは「税込」で管理されており、P/L も税込ベースで表示されています。
- 免税事業者から課税事業者への移行に伴い、会計指針に準拠した「税抜方式」への切替えが必要です。

## 仕様書の出力先ファイル名
`docs/dev/dev_mas-089_consumption_tax_exclusive_method.md`

## 固有の設計要件

1. **システムパラメータの追加**:
   - `03_sys_params` に `CFG_TAX_METHOD` (税込/税抜) および `CFG_TAX_TRANSITION_DATE` (適用開始日) を追加する設計。
2. **仕訳エンジン (Action A/B) の拡張**:
   - 税抜方式が有効な場合、1つの請求 (INV) から「本体金額」と「消費税額」を分離し、以下の科目を自動計上するロジック。
     - 収入時:売上高(税抜) + 仮受消費税
     - 支出時:費用科目(税抜) + 仮払消費税
3. **データマート (P/L) の対応**:
   - 税抜方式の場合、売上高や費用科目の集計値を税抜金額ベースに切り替える。
   - 消費税額自体は P/L の営業損益には影響させず、B/S の資産・負債として管理する。
4. **移行期間の考慮**:
   - `CFG_TAX_TRANSITION_DATE` 以前のデータは税込、以降のデータは税抜として処理する「ハイブリッド期間」の整合性確保。
5. **エッジケース**:
   - 非課税・対象外取引の扱い。
   - 税込金額から税抜・税額を逆算する際の端数処理(切捨て/四捨五入)の統一。
   - 決算時の仮受・仮払消費税の相殺(未払消費税への振替)の考え方。

## 出力品質の基準

- `docs/_internal/dev_spec_prompt_template.md` のセクション構成に完全準拠すること。
- **仕訳パターン表**(税込時 vs 税抜時)を必ず含めること。
- エッジケーステーブル(端数処理、非課税取引等)を含めること。
- 実装プロンプトはバッククォートで囲まず、行頭4スペースインデントで出力すること。

## 重要な制約
- 必要な指示をすべて自己完結的に含め、既存の仕訳エンジンの堅牢性を損なわないように配慮してください。

調査中に判明した重要な構造:

  • 既存 TRN_JOUR は 税抜金額_実績 / 消費税額_実績 / 税込金額_実績 の 3 列を既に保持しており、税抜方式切替は「どれを集計に使うか」の切替で実装可能(追加列不要)
  • P/L・B/S・CF 集計は 601_datamart_ingest.js の 4 箇所(L42/L104/L290/L511)が税込金額を参照。ここに getPlAmount_ ヘルパーを噛ませることで切替実現
  • Constants.DEFAULT_TAX_RATE = 0.30法人税等の税率であり、本案件の消費税とは無関係(混同禁止)
  • 消費税関連の勘定科目(仮受/仮払/未払)は MST_ACCT に未登録。Step 1 で追加マイグレーション必要
  • 決算整理仕訳は法人税等(MAS-073)と同様「データマート層の表示組み替え」で完結させ、TRN への書き込みは行わない方針