同時接続50人でエラー0件、法令15項目を稼働中システムで実測検証 — オンプレミス完結の請求書・契約管理システム

Web 社内システム CMS セキュリティ オンプレミス 2026
同時接続50人でエラー0件、法令15項目を稼働中システムで実測検証 — オンプレミス完結の請求書・契約管理システム

プロジェクトの背景

継続請求を抱える企業では、インボイス制度・電子帳簿保存法への対応をExcelと運用ルールで「間に合わせている」状態が少なくありません。VAONは、契約を起点に請求・入金・督促までを1つの台帳で管理し、貴社サーバー内だけで完結するオンプレミス型の請求書・契約管理システムを社内で開発しました。外部通信はメール送信のみに限定し、法令15項目すべてを稼働中のシステムに対する実測で確認しています。

課題

1

確定後の訂正を許さない設計と、電子帳簿保存法の真実性要件を両立させる必要があった

電子帳簿保存法は取引データの訂正・削除履歴の保持を求めます。単に確定後の編集を禁止するだけでは、担当者が誤りに気づいた際の実務が回りません。確定した請求書は内容を変更できない一方、正しい状態への修正手段を別途用意する必要がありました。

2

アプリ層の記録だけでは、直接SQLによる操作履歴が漏れる

訂正・削除履歴をアプリケーションのコードだけで記録すると、データベースへの直接操作は履歴に残りません。監査や税務調査で「アプリを経由しない操作も含めて記録されているか」を問われた場合、アプリ層の実装だけでは説明できないという課題がありました。

3

クラウドの潤沢なリソースなしで、3秒以内の検索要件を満たす必要があった

電子帳簿保存法は取引年月日・取引金額・取引先での検索、範囲指定、2項目以上の組み合わせ検索を3秒以内で求めます。オンプレミス環境では、貴社が用意する1台のサーバーでこの要件を満たす設計にする必要があり、クラウドのように処理能力を後から増やす前提を置けませんでした。

4

ソースコードを納品する以上、顧客側の改修が法令要件を壊すリスクがある

買い切り・ソースコード納品というモデルは、ベンダーロックインを避けられる一方、税計算・監査ログ・PDF確定処理といった法令要件に関わる箇所を、貴社または他ベンダーが改修した際に意図せず壊してしまうリスクを伴います。

VAONのソリューション

単票の請求書発行ツールではなく、取引先→契約→請求書→入金消込→督促という一連の流れを1つの台帳で管理する設計にしました。

確定済み請求書は物理削除・内容変更を不可とし、誤りへの対応は「取消(赤伝)」による理由つき取消と再作成に限定しました。原本のPDFには手を加えず、取消済みの表示はハッシュ値が変わらない別ファイルとして出力しています。

訂正・削除履歴を証憑にあたる6つのテーブルに対しデータベーストリガーで記録する構成にしました。アプリのコードを経由しない直接SQLの操作も、この方式であれば同じ履歴に残ります。

検索要件はインデックス設計で対応しました。ルールベースの全文検索エンジンなどを追加するのではなく、PostgreSQLの標準機能内で解決する方針を取り、1万件のデータセットに対しEXPLAINでIndex Scanが使われていることを確認しています。あわせて構成要素をWeb・API・Worker・PostgreSQL・オブジェクトストレージ・Nginxの6つに抑え、Redis等の追加ミドルウェアを持たない設計にすることで、運用対象と障害点を減らしています。

外部通信をメール送信(SMTP)のみに限定しました。ソースコード全体を対象に外部サービスの認証情報を検索し、SMTP関連の6つの環境変数以外に外部サービスへの依存がないことを確認しています。

税計算・監査ログ・請求書確定処理など、法令要件に関わる箇所は自動テストで保護しました。改修時にこれらの要件を壊した場合、テストが失敗する構成にしています。

提供価値

一覧・詳細画面がp95で100ms未満、3秒以内という要件に対して大幅な余裕

一覧画面(100件表示)はp50 3ms・p95 87ms、詳細画面はp50 2ms・p95 83msでした。要件である3秒以内に対し、実測値は要件の1〜3%程度にとどまっています。

1万件の検索が0.075〜0.371msで完了

契約・請求書それぞれ1万件のデータセットに対し、取引年月日・取引金額・取引先での検索を実行した結果、0.075〜0.371msで完了しました。EXPLAINでIndex Scanが使われていることを確認しており、件数が増えても同様の傾向が見込めます。

同時接続50ユーザー、30秒間で1,645リクエスト・エラー0件

50セッションが同時にログインし、請求書一覧→詳細→金額範囲検索→契約一覧という実際の経理業務に近い操作を繰り返す負荷試験を実施しました。30秒間で1,645リクエストを処理し、エラーは0件でした。

インボイス制度・電子帳簿保存法、法令15項目すべてを実測で確認

インボイス制度の記載事項7項目、電子帳簿保存法の電子取引データ保存8項目、合計15項目について、実装の有無ではなく実際の動作結果を1項目ずつ確認しました。確認結果と確認方法をまとめたチェックリストを納品物として用意しています。

外部通信はメール送信のみ、社内SMTPがあればインターネット接続なしで全機能が動作

ソースコード全体を対象に外部サービスの認証情報を検索した結果、確認された環境変数はSMTP関連の6項目のみでした。クラウドストレージ、外部決済、外部認証基盤、生成AIのAPIなど、他社サービスへの依存は一切ありません。

テクノロジースタック

TypeScript
TypeScript
Node.js
Node.js
React
React
PostgreSQL
PostgreSQL
Nginx
Nginx
Docker
Docker