証跡は、モデルで守る。
本アプリの実装は、業務シナリオから導出したユースケース図・クラス図・状態機械図に基づきます。アクター(管理者・担当者・閲覧者)と UC-01〜UC-23、業務ルール(BR)・不変条件(INV)がそのまま実装へトレースされ、操作マニュアルの各章と対応します。
本書は、本アプリケーションの操作手順をまとめた利用者向けマニュアルです。画面・ボタン名は実装に準拠しています。
- 対象アプリ: 士業文書作成支援システム / 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}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支援、本文
- 「作成」を押すと登録され、文書詳細へ移動します。
case-001)。
5.3 文書詳細と状態遷移
詳細画面の上部に「操作(状態遷移)」セクションがあり、現在の状態バッジと操作ボタンが並びます。
| ボタン | 実行できる状態 | 遷移後 |
|---|---|---|
| 入力開始 | 下書き | 入力中 |
| 生成 | 入力中 | 生成済 |
| レビューへ | 生成済 | レビュー済 |
| 再生成(差戻) | レビュー済 | 生成済 |
| 確定 | レビュー済(かつ必須変数が反映済) | 確定 |
| 出力(Word/PDF) | 確定 | 出力済(文書出力が1件生成される) |
5.4 確定できない場合(INV-Document)
テンプレートの必須変数が本文に未反映の文書は確定できません。本文に {{顧客名}} のような変数がそのまま残っている状態が「未反映」です。
下図は、本文に {{顧客名}} が残ったまま「確定」を押した例です。赤字でエラーが表示され、状態は「レビュー済」のままです。
対処: 「編集」から本文を開き、{{顧客名}} を実際の値(例: 株式会社アルファ)に置き換えて保存してから、再度「確定」を押します。
5.5 出力(UC-17)
「確定」状態で 出力(Word/PDF) を押すと、状態が「出力済」になり、文書出力が1件生成されます。同時に監査ログへ 出力 として記録されます。
curl -X POST http://localhost:4000/api/documents/{id}/export \
-H "Content-Type: application/json" \
-d '{"format":"Word","downloadRestricted":false}'
5.6 確定・出力済の文書は変更できない(BR-006)
「確定」「出力済」の文書は、編集・削除ができません(証跡の保全)。詳細画面に「編集」「削除」ボタンは表示されますが、実行すると次のエラーになります。
06文書ビューアと印刷
文書詳細の「文書ビューア(本文)」で、本文が表題・章・条項の段組として構造化表示されます(BR-019)。
構造は本文の書式規約で判定されます。
| 書き方 | 表示 |
|---|---|
第1章 総則 | 章見出し |
第1条(目的) 本契約は… | 条番号+見出し+本文の段組 |
| その他の行 | 通常の段落 |
6.1 印刷プレビュー・印刷
- 「印刷プレビュー」を押すと、A4を模した用紙イメージで表示されます。
- 「印刷」を押すとブラウザの印刷ダイアログが開きます。
- 印刷では本文のみが出力されます。サイドバー・ヘッダー・操作ボタンは印刷されません。
- 「プレビューを閉じる」で通常表示に戻ります。
上図は「確定」状態の文書です。文書詳細の全体像(操作・ビューア・詳細情報・関連する文書出力)は次のとおりです。
07文書出力のプレビューとダウンロード
サイドバー「文書出力」、または文書詳細の「文書出力」一覧から開きます。出力形式・ファイル名・電子署名・ダウンロード制限を管理します。
7.1 ダウンロードできる出力(BR-020)
「ダウンロード可能です(ファイル名: …)」と緑色で表示され、右上の「ダウンロード」ボタンが有効です。押すとファイルが保存され、監査ログに 出力 が記録されます。
7.2 ダウンロードが制限された出力(BR-021)
外部共有制御により制限された出力は、黄色の帯で次のように表示されます。
このとき「ダウンロード」ボタンは灰色(無効)になり、押せません。プレビューと印刷プレビューは利用できます。
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名以上) | 運用開始 |
| 停止 | 運用開始 | 停止中 |
| 再開 | 停止中 | 運用開始 |
10.2 士業
士業種別・テナント・AI利用可否・外部通信制限・保存ポリシー・テンプレート適用範囲を設定します。
10.3 セキュリティポリシー
セキュリティレベルは3段階です。
| レベル | 意味 |
|---|---|
| A:完全オフライン | 外部通信を遮断 |
| B:閉域網 | 閉じたネットワーク内で利用 |
| C:クラウド利用可 | クラウド利用を許可 |
10.4 AI設定
AI利用有効・AI種別(AI非利用/ローカルLLM/閉域環境AI/制限付き外部API)・プロンプト制限・送信データ制限を設定します。
11権限・監査
11.1 ユーザ
氏名・メールアドレス・ロール・テナント・有効を管理します。
11.2 権限(ロール)
RBACのロール定義です。ロール種別・権限セット・文書アクセス制御を設定します。
| ロール | 想定 |
|---|---|
| 管理者(Admin) | 事務所の管理者。テナントの運用開始に1名以上必要 |
| 担当者(Staff) | 文書作成・編集の担当 |
| 閲覧者(Viewer) | 参照のみ |
Edit や Export の権限を設定して保存しても、保存時に自動的に取り除かれます(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-002 | AIを使わなくても文書作成が成立する | 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/backend で npm 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 実装に差し替えます。