構築例一覧へ戻る
構築例 04 / Build Example
Example 04 / 05

士業文書作成支援システム

士業事務所の文書作成業務をテンプレート化・自動化し、証跡を保全するシステム。テンプレートと変数・条項ルールからの文書生成、レビュー・確定・Word/PDF出力に加え、ハッシュチェーンによる改ざん検知付き監査ログと、士業種別ごとのセキュリティレベル制御を備えます。

フロントエンド
React + TypeScript + Vite
バックエンド
Express REST API(インメモリ)
設計トレース
業務シナリオ → ユースケース図 / クラス図 / 状態機械図 → 実装
テンプレート文書生成 条項の条件分岐 改ざん検知監査ログ RBAC権限制御 セキュリティレベル Word/PDF出力・電子署名
設計モデル / Design Models

証跡は、モデルで守る。

本アプリの実装は、業務シナリオから導出したユースケース図・クラス図・状態機械図に基づきます。アクター(管理者・担当者・閲覧者)と UC-01〜UC-23、業務ルール(BR)・不変条件(INV)がそのまま実装へトレースされ、操作マニュアルの各章と対応します。

ユースケース図 Use Case Diagram
士業文書作成支援システム ユースケース図
士業設定(UC-01〜08)・文書生成(UC-09〜17)・権限監査(UC-18〜23)を、証跡保全(BR-006)・外部共有制御(BR-008/021)・AI非依存(BR-002)などの制約とともに表現。 原寸で開く ↗
クラス図(ドメインモデル) Domain Class Diagram
士業文書作成支援システム クラス図(ドメインモデル)
Tenant・Profession・Template・TemplateVariable・ClauseRule・Client・Case・Document・DocumentOutput・User・Role・AuditLog などの関連・多重度と、4つの状態遷移(Document / Template / Case / Tenant)を定義。 原寸で開く ↗

本書は、本アプリケーションの操作手順をまとめた利用者向けマニュアルです。画面・ボタン名は実装に準拠しています。

  • 対象アプリ: 士業文書作成支援システム / Profession Document Create
  • 構成: フロントエンド(React + TypeScript + Vite)+ バックエンド(Express REST API)
  • 設計トレース: 業務シナリオ → ユースケース図 / クラス図 / 状態機械図 → 実装

01はじめに

本アプリは、士業事務所の文書作成業務をテンプレート化・自動化し、証跡を保全するためのシステムです。主な機能は次のとおりです。

区分機能
文書生成テンプレートと入力値からの文書生成、レビュー、確定、Word/PDF出力
テンプレートテンプレート・変数・条項ルール(条件による条項の出し分け)の管理
顧客・案件顧客と案件の管理、案件に紐づく文書の集約
士業設定テナント・士業種別ごとのセキュリティレベル・AI利用可否の設定
権限・監査ロール(RBAC)による権限管理、ハッシュチェーンによる改ざん検知付き監査ログ

対象となる士業種別:弁護士 / 税理士 / 司法書士 / 社会保険労務士 / 行政書士 / 弁理士。

本アプリはログイン認証を実装していないため、すべての画面に誰でもアクセスできます。ロールは「ユーザ」データ上の属性として管理します。

02起動と終了

2.1 必要環境

  • Node.js 20.x 以降

2.2 起動手順

2つのサーバーを起動します。ターミナルを2つ使います。

# ① バックエンド(REST API / ポート 4000)
cd app/backend
npm install        # 初回のみ
npm run dev

# ② フロントエンド(画面 / ポート 5173)
cd app/frontend
npm install        # 初回のみ
npm run dev

ブラウザで http://localhost:5173/ を開きます。

フロントエンドは /api へのアクセスを自動的にバックエンド(4000番)へ転送します。先にバックエンドを起動してください。起動時にデモデータが自動投入されるため、そのまま操作を試せます。
ヘルスチェック: GET http://localhost:4000/api/health{"success":true}
⚠️ OSを移して使う場合(例:Windows でインストールしたものを macOS で動かす場合)は、node_modules を作り直してください。ネイティブバイナリと実行用シムがOS固有のため、そのままでは Permission denied や esbuild/rollup のエラーで起動できません。
rm -rf backend/node_modules frontend/node_modules
npm --prefix backend ci && npm --prefix frontend ci

2.3 終了手順

各ターミナルで Ctrl + C。または以下で停止します。

lsof -ti:4000,5173 | xargs kill

03画面構成

画面左のサイドバーから各機能へ移動します。グループ構成は次のとおりです。

グループメニュー内容
(最上部)ダッシュボード件数サマリ・最近の文書・監査ログの完全性
士業設定テナント / 士業 / セキュリティポリシー / AI設定事務所とセキュリティの基礎設定
テンプレート管理テンプレート / テンプレート変数 / 条項ルール文書のひな形の管理
顧客・案件顧客 / 案件顧客と案件の管理
文書生成文書 / 文書出力文書の作成・確定と出力成果物
権限・監査ユーザ / 権限 / 監査ログ利用者・ロール・証跡

全14種類のデータは共通して 一覧 → 詳細 → 新規/編集 の3画面で構成されます。

  • 一覧画面: 検索・関連での絞り込み・並び替え・ページ送り。右上「新規作成」で新規登録。各行の「編集」「削除」で操作。
  • 詳細画面: 「操作(状態遷移)」「詳細情報」、および関連する子情報の一覧(BR-016)。右上に「一覧へ」「編集」「削除」。
  • 新規/編集画面: 入力フォーム。「作成」または「更新」で保存、「キャンセル」で戻る。

04ダッシュボード

トップ画面(http://localhost:5173/)に表示されます。

  • 各データの件数サマリ(テナント・士業・テンプレート・顧客・案件・文書・ユーザ・監査ログ)
  • 最近の文書: 状態バッジとAI支援の有無を表示。クリックで該当の詳細へ移動。
  • 監査ログの完全性(改ざん検知 BR-006): ハッシュチェーンを検証し「整合(改ざんなし)」または改ざん箇所を表示。
ダッシュボード画面
ダッシュボード画面

05文書の作成から出力まで

本システムの中心となる機能です。文書は 下書き → 入力中 → 生成済 → レビュー済 → 確定 → 出力済 と進みます。

5.1 文書一覧

サイドバー「文書」から開きます。

  • 文書名 / 状態 / 案件 / 顧客 / テンプレート / AI支援 / 登録日時 を表示。
  • 参照は「名称 (ID)」形式で表示されます(例: 株式会社アルファ (client-001))。これは BR-017 によるものです。
  • 上部で 案件・顧客・テンプレートによる絞り込みができます(BR-018)。文書名での検索、列見出しでの並び替えも可能です。
文書一覧画面
文書一覧画面

5.2 文書の新規作成

右上「新規作成」から登録します。

  • 文書名(必須)、状態、案件、顧客、テンプレート、AI支援、本文
  • 「作成」を押すと登録され、文書詳細へ移動します。
⚠️ 案件・顧客・テンプレートはIDを直接入力します(ドロップダウンではありません)。入力欄の下に「関連 cases のID」のように対象が示されます。IDは各一覧画面や詳細画面で確認してください(例: case-001)。
文書の新規作成画面
文書の新規作成画面

5.3 文書詳細と状態遷移

詳細画面の上部に「操作(状態遷移)」セクションがあり、現在の状態バッジと操作ボタンが並びます。

📌 重要: ボタンは常にすべて表示されます(状態による出し分けはありません)。現在の状態で実行できない操作を押すと、赤字でエラーメッセージが表示され、状態は変わりません。どの操作がいつ可能かは 12章の状態遷移 を参照してください。
ボタン実行できる状態遷移後
入力開始下書き入力中
生成入力中生成済
レビューへ生成済レビュー済
再生成(差戻)レビュー済生成済
確定レビュー済(かつ必須変数が反映済)確定
出力(Word/PDF)確定出力済(文書出力が1件生成される)
文書詳細画面(レビュー済・操作ボタン)
文書詳細画面(レビュー済・操作ボタン)

5.4 確定できない場合(INV-Document)

テンプレートの必須変数が本文に未反映の文書は確定できません。本文に {{顧客名}} のような変数がそのまま残っている状態が「未反映」です。

下図は、本文に {{顧客名}} が残ったまま「確定」を押した例です。赤字でエラーが表示され、状態は「レビュー済」のままです。

確定エラー(必須変数が未反映)
確定エラー(必須変数が未反映)

対処: 「編集」から本文を開き、{{顧客名}} を実際の値(例: 株式会社アルファ)に置き換えて保存してから、再度「確定」を押します。

5.5 出力(UC-17)

「確定」状態で 出力(Word/PDF) を押すと、状態が「出力済」になり、文書出力が1件生成されます。同時に監査ログへ 出力 として記録されます。

⚠️ 画面から出力した場合、形式は PDFダウンロード制限は「あり」 が既定値になります(外部共有制御 BR-008/BR-021)。そのため画面からはプレビューのみ可能です。ダウンロード可能な出力を作るには、APIで形式と制限を指定します。
curl -X POST http://localhost:4000/api/documents/{id}/export \
  -H "Content-Type: application/json" \
  -d '{"format":"Word","downloadRestricted":false}'

5.6 確定・出力済の文書は変更できない(BR-006)

「確定」「出力済」の文書は、編集・削除ができません(証跡の保全)。詳細画面に「編集」「削除」ボタンは表示されますが、実行すると次のエラーになります。

確定・出力済(Finalized)の文書は改変・削除できません(証跡保全 BR-006)

06文書ビューアと印刷

文書詳細の「文書ビューア(本文)」で、本文が表題・章・条項の段組として構造化表示されます(BR-019)。

構造は本文の書式規約で判定されます。

書き方表示
第1章 総則章見出し
第1条(目的) 本契約は…条番号+見出し+本文の段組
その他の行通常の段落

6.1 印刷プレビュー・印刷

  1. 印刷プレビュー」を押すと、A4を模した用紙イメージで表示されます。
  2. 印刷」を押すとブラウザの印刷ダイアログが開きます。
  3. 印刷では本文のみが出力されます。サイドバー・ヘッダー・操作ボタンは印刷されません。
  4. 「プレビューを閉じる」で通常表示に戻ります。
文書の印刷プレビュー
文書の印刷プレビュー

上図は「確定」状態の文書です。文書詳細の全体像(操作・ビューア・詳細情報・関連する文書出力)は次のとおりです。

文書詳細画面(確定済)
文書詳細画面(確定済)

07文書出力のプレビューとダウンロード

サイドバー「文書出力」、または文書詳細の「文書出力」一覧から開きます。出力形式・ファイル名・電子署名・ダウンロード制限を管理します。

7.1 ダウンロードできる出力(BR-020)

ダウンロード可能です(ファイル名: …)」と緑色で表示され、右上の「ダウンロード」ボタンが有効です。押すとファイルが保存され、監査ログに 出力 が記録されます。

出力プレビュー(ダウンロード可能)
出力プレビュー(ダウンロード可能)

7.2 ダウンロードが制限された出力(BR-021)

外部共有制御により制限された出力は、黄色の帯で次のように表示されます。

🔒 この出力はダウンロードが制限されています(外部共有制御)。プレビューのみ利用できます。

このとき「ダウンロード」ボタンは灰色(無効)になり、押せません。プレビューと印刷プレビューは利用できます

出力プレビュー(ダウンロード制限あり)
出力プレビュー(ダウンロード制限あり)
🔒 制限はサーバー側でも強制されます。APIを直接呼び出しても 403 Forbidden が返り、ファイルは配信されません。画面のボタン無効化は補助的なものです。

08テンプレート管理

文書のひな形です。テンプレート → テンプレート変数 → 条項ルール の3階層で構成されます。

8.1 テンプレート一覧

テンプレート名・文書種別・形式(Word/PDF/Markdown)・公開状態・バージョンを表示します。

テンプレート一覧画面
テンプレート一覧画面

8.2 テンプレート詳細と公開操作

詳細画面には「公開」「公開停止」「アーカイブ」の操作と、関連するテンプレート変数・条項ルール・このテンプレートから作成された文書が一覧表示されます(BR-016)。

ボタン実行できる状態遷移後
公開下書き(かつ変数が1つ以上)公開済
公開停止公開済下書き
アーカイブ公開済アーカイブ
テンプレート詳細画面
テンプレート詳細画面

8.3 公開できない場合(INV-Template)

変数を1つも持たないテンプレートは公開できません。下図は変数が0件のテンプレートで「公開」を押した例です。

公開エラー(変数なし)
公開エラー(変数なし)

対処: 「テンプレート変数」から、そのテンプレートに変数を1つ以上登録してから公開します。

8.4 テンプレート変数

  • 変数キー{{顧客名}} のように {{ }} で囲んだ形式で登録します。この文字列が本文に残っていると「未反映」と判定されます(5.4 参照)。
  • 型(文字列・日付・数値・真偽)、必須、既定値を設定できます。
  • 必須にした変数は、文書の「確定」時に反映済であることが検査されます。

8.5 条項ルール(BR-014)

条件によって条項を出し分けるための定義です。「判定元変数」「演算子(等しい・等しくない・より大きい・より小さい・含む)」「条件値」「条項本文」を登録します。

09顧客・案件

9.1 顧客

顧客名・顧客区分(個人/法人)・連絡先・住所・テナントを登録します。詳細画面には関連する案件・文書が一覧表示されます。

9.2 案件

顧客・案件名・状態・開始日を登録します。詳細画面には関連する文書が一覧表示されます。

ボタン実行できる状態遷移後
着手受任進行中
完了進行中完了
案件詳細画面
案件詳細画面

10士業設定(テナント・士業・セキュリティ・AI)

10.1 テナント(事務所)

事務所名・状態・暗号化有効を管理します。詳細画面には関連する士業・ユーザ・顧客・監査ログが一覧表示されます(BR-016)。

ボタン実行できる状態遷移後
運用開始作成済(設定中)(かつ士業設定1件以上・管理者ユーザ1名以上)運用開始
停止運用開始停止中
再開停止中運用開始
⚠️ INV-Tenant: 士業設定が0件、または管理者ロールのユーザが0名のテナントは「運用開始」できません。
テナント詳細画面(関連一覧)
テナント詳細画面(関連一覧)

10.2 士業

士業種別・テナント・AI利用可否・外部通信制限・保存ポリシー・テンプレート適用範囲を設定します。

10.3 セキュリティポリシー

セキュリティレベルは3段階です。

レベル意味
A:完全オフライン外部通信を遮断
B:閉域網閉じたネットワーク内で利用
C:クラウド利用可クラウド利用を許可
🔧 自動矯正: レベルAを選んで保存すると、AI送信制限・保存時暗号化・通信時暗号化が自動的に有効になり、外部通信は遮断に設定されます。手動で外しても保存時に強制されます。

10.4 AI設定

AI利用有効・AI種別(AI非利用/ローカルLLM/閉域環境AI/制限付き外部API)・プロンプト制限・送信データ制限を設定します。

🔧 自動矯正: 「AI利用有効」をオフにして保存すると、AI種別は自動的に「AI非利用」になります。

11権限・監査

11.1 ユーザ

氏名・メールアドレス・ロール・テナント・有効を管理します。

11.2 権限(ロール)

RBACのロール定義です。ロール種別・権限セット・文書アクセス制御を設定します。

ロール想定
管理者(Admin)事務所の管理者。テナントの運用開始に1名以上必要
担当者(Staff)文書作成・編集の担当
閲覧者(Viewer)参照のみ
🔧 自動矯正: 閲覧者(Viewer)ロールに EditExport の権限を設定して保存しても、保存時に自動的に取り除かれます(BR-005)。

11.3 監査ログ(UC-18 / BR-006)

操作・文書生成・AI利用の証跡です。操作種別・対象種別・対象ID・操作ユーザ・日時を記録します。

  • 記録はハッシュチェーンで連結され、各レコードが直前のハッシュを保持します。
  • 改ざん検知はダッシュボードの「監査ログの完全性」で確認できます(GET /api/audit-logs/verify)。改ざんがあると、該当ログのIDが表示されます。
  • 文書の出力、および出力ファイルのダウンロード時に、自動的に 出力 として記録されます。
監査ログ一覧画面
監査ログ一覧画面

12業務ルールと状態遷移

12.1 文書の状態遷移

         入力開始          生成           レビューへ         確定(※)         出力
 下書き ──────▶ 入力中 ──────▶ 生成済 ──────────▶ レビュー済 ──────▶ 確定 ──────▶ 出力済
                                 ▲                   │
                                 └───────────────────┘
                                    再生成(差戻)

 ※ 確定には、テンプレートの必須変数がすべて本文に反映されていることが必要(INV-Document)
  • 「確定」「出力済」の文書は編集・削除不可(BR-006 証跡保全)。
  • 「出力」は確定からのみ可能(INV-DocumentOutput)。

12.2 テンプレート・案件・テナントの状態遷移

テンプレート:  下書き ──公開(変数≥1)──▶ 公開済 ──アーカイブ──▶ アーカイブ
                  ▲                        │
                  └────── 公開停止 ─────────┘

案件:          受任 ──着手──▶ 進行中 ──完了──▶ 完了

テナント:      作成済 ──運用開始(士業≥1 かつ 管理者≥1)──▶ 運用開始 ⇄ 停止中
                                                        (停止 / 再開)

12.3 主な業務ルール

ID内容アプリでの挙動
BR-002AIを使わなくても文書作成が成立するAI支援なしでも全状態遷移が可能。確定時に必須変数の反映を検査
BR-005ロールに応じた権限制御閲覧者の Edit/Export 権限は保存時に自動除去
BR-006操作・生成・AI利用の証跡を改ざん検知付きで保全監査ログのハッシュチェーン。確定・出力済文書は改変不可
BR-007テンプレートは変数を持つ変数0件のテンプレートは公開不可
BR-008出力は外部共有制御に従う画面からの出力は既定でダウンロード制限あり
BR-013テナントは士業設定と管理者を備えて運用開始する士業0件・管理者0名では運用開始不可
BR-014条件による条項の出し分け条項ルール(判定元変数・演算子・条件値)
BR-016詳細画面に関連する子情報を一覧表示テナント詳細に士業・ユーザ・顧客・監査ログ 等
BR-017参照は「名称 (ID)」で表示株式会社アルファ (client-001)。列挙は日本語ラベル
BR-018一覧を関連で絞り込み文書一覧を案件・顧客・テンプレートで絞り込み
BR-019本文を文書レイアウトで表示・印刷文書ビューア+印刷プレビュー(本文のみ印刷)
BR-020出力済み文書を画面上でプレビュー・ダウンロード出力プレビュー
BR-021ダウンロードは外部共有制御に従う制限時はボタン無効化+APIは403

13よくある質問・トラブルシュート

症状原因・対処
「確定」を押すとエラーになる本文に {{顧客名}} 等の必須変数が残っている(INV-Document)。編集して実際の値に置き換える。またはレビュー済以外の状態。
「公開」を押すとエラーになるテンプレートに変数が0件(INV-Template)。テンプレート変数を1つ以上登録する。
「運用開始」を押すとエラーになる士業設定が0件、または管理者ユーザが0名(INV-Tenant)。
文書を編集・削除できない確定・出力済の文書は改変不可(BR-006)。仕様どおりの動作です。
ダウンロードボタンが押せないダウンロード制限あり(BR-021)。プレビューのみ利用可。制限のない出力はAPIで downloadRestricted:false を指定して作成。
操作ボタンを押しても何も起きない赤字のエラーメッセージが「操作(状態遷移)」の上に出ていないか確認。現在の状態で実行できない操作です。
フォームで案件・顧客を選べないドロップダウンではなくID直接入力です。各一覧画面でID(例: case-001)を確認して入力。
AI種別を設定しても「AI非利用」に戻る「AI利用有効」がオフのため自動矯正されています。先に有効化してください。
セキュリティ設定を外しても有効に戻るセキュリティレベルAは暗号化・AI送信制限が強制されます(仕様)。
画面は出るがデータが空バックエンド未起動。app/backendnpm run dev を実行。
Permission denied や esbuild/rollup のエラーで起動できない別OSでインストールした node_modules を使っている。2.2 の再インストール手順を実行。
ポートが使用中で起動できない既存プロセスを停止:lsof -ti:4000,5173 | xargs kill
登録したデータが消えたインメモリ保持のため、バックエンド再起動で初期状態に戻ります(14章)。

14制約事項

  • データは在メモリ(インメモリ)保持です。バックエンドを再起動すると、登録したデータはデモデータの初期状態に戻ります。
  • ログイン認証はありません。ロールは「ユーザ」データ上の属性として扱い、画面のアクセス制御は行っていません。
  • 文書生成・AI支援は状態遷移の記録が中心です。実際のAIによる文面生成や、テンプレート変数の自動差し込みは本デモ範囲外で、本文は手入力します。
  • Word/PDF出力は実ファイル形式ではありません。出力本文はテキストとして生成され、ファイル名とMIMEタイプのみ実形式に合わせています。
  • フォームの参照項目はID直接入力で、候補選択のドロップダウンは未実装です。
  • 要件では PostgreSQL が挙げられていますが、本実装はインメモリストアで動作します。永続化が必要な場合は backend/src/data/store.ts を Prisma/Postgres 実装に差し替えます。

本マニュアルは uml-workflow-v3 で生成したアプリケーションの実装に基づいています。