条件付き承認ルート
申請種別・提出時の所属部署・金額と優先度から、1〜複数段の直列ルートを決定。同じ優先度で同時に一致し得るルールは設定時に拒否します。申請者本人は承認者になれません。
業務システム開発ポートフォリオ
申請・承認・差戻し・再提出・履歴を
メールやExcel、チャットに分散しがちな社内の申請・承認業務を、1つのWebシステムで扱えるようにしました。単純な申請CRUDではなく、承認経路の決定、差戻しと再提出、承認者の再割当、権限、履歴と監査ログまでを業務ルールとして実装しています。
1:39で、申請 → 差戻し → 再提出 → 承認者の再割当 → 最終承認 → 履歴・監査ログまでを、1件の申請で通して紹介します。字幕のみ(音声なし)。
中小〜中堅企業の購買申請・経費精算を想定した、社内申請・承認のWebシステムです。申請者・承認者・経理・管理者が、それぞれの権限で同じ申請を扱います。動画では、次の流れを1件の申請で通しています。
却下・取下げで終わる経路もあります。差戻し後の再提出は「上書き」ではなく新しい提出回です。第1回の内容・添付・承認経路・差戻し理由はそのまま残ります。
申請種別・提出時の所属部署・金額と優先度から、1〜複数段の直列ルートを決定。同じ優先度で同時に一致し得るルールは設定時に拒否します。申請者本人は承認者になれません。
提出した時点の申請内容・添付・申請者・部署・承認経路・承認者を、提出回ごとに保存。後から組織やルールを変えても、過去の提出回の意味は変わりません。
差戻し後は同じ申請を修正して再提出。再提出時点のルールで承認経路を決め直し、先頭の段階から承認します。旧提出回と旧承認履歴は保持します。
退職・長期不在などに備え、管理者が進行中の提出回の未処理の段階だけ担当を変更できます。変更前後の担当・実行者・理由を記録し、処理済みの段階は変えません。
申請者・承認者・経理・管理者のRole(兼務可)と、提出回ごとの関係(本人・現在の担当・処理した人)で閲覧と操作を判定。画面だけでなくAPIで拒否します。
提出・差戻し・再割当・承認などを提出回の履歴と監査ログに記録。PDF / JPEG / PNG の証憑はDBに保存し、保存済みの申請・証憑・履歴を削除する機能は設けていません。
申請を保存するだけでなく、「いつ・誰の判断で・どの条件だったか」を後から説明できることを重視しました。
承認者が異動しても、過去の提出回には「提出時: 佐藤 一郎 · 営業部」のように当時の部署・担当がそのまま表示されます。現在のマスタを都度参照して表示を作り直すのではなく、提出時点の内容を提出回として保存しているためです。
技術補足: 申請(現在の下書き)と、不変の提出回・初期の承認段階・現在の担当・確定した操作を別のデータとして持つ。提出回の snapshot と証憑の関連は、DBの権限とトリガーで更新・削除できないようにしている。

担当者が長期不在でも、申請を止めずに済むよう、管理者が担当を変更できます。対象は進行中の提出回の未処理の段階だけで、処理済みの承認や過去の提出回は変わりません。再割当の画面には、申請本文や金額を出していません。
技術補足: 再割当は割当の版番号で競合を検出し、同じ版への同時変更は1件だけ成立する。変更前後の担当・実行者・理由を割当履歴と監査ログへ同一トランザクションで記録する。

差戻し後の再提出は第2回として保存し、その時点のルール・組織で承認経路を決め直します。第1回の内容と差戻し理由は残ります。
同じ承認段階に2人が同時に操作しても、成立するのは最初の1件だけです。後の操作は競合として拒否し、状態・履歴・監査ログが中途半端に残らないようにしています。
設定の共有/排他ロック→申請ロックの順に取得し、状態・操作履歴・監査ログは同一トランザクションで保存。成立順は実DBの並行試験で確認。
20同時セッションの読取り負荷中に、管理変更・パスワード変更が待ち続ける問題を見つけました。原因(ロックの待ち順)を設計文書へ反映してから修正し、再測定で 14/14 件成立・503は0件になりました。
画面に出さないだけでなく、現在の権限をAPIで毎回判定します。検索・履歴・添付・監査ログのどの経路からも、権限外の申請内容は取得できません。
| Role | 主な業務 | 制限 |
|---|---|---|
申請者EMPLOYEE | 購買・経費の申請作成・提出・取下げ、自分の申請と提出回の閲覧 | 他人の下書きや、関係のない提出回は閲覧できない |
承認者APPROVER | 現在担当している段階の承認・差戻し・却下 | 閲覧できるのは、現在の担当か自分が処理した提出回のみ。担当を外れると操作できない |
経理BACKOFFICE | 全社の提出回の検索・閲覧 | 承認操作はできない |
管理者ADMIN | ユーザー・部署・承認担当・承認ルールの管理、承認者の再割当、監査ログ | 管理者であることだけでは申請本文を閲覧できない(管理に必要な情報のみ) |


数値は、動画の実績カードと同じ記録(ApprovalFlow の実装報告・Review・検証証跡)から自動で取得しています。
Project Complete は、現在承認されている初期Scopeに対して、ローカル環境で動く作品として完了と判断したことを指します。一般公開・納品・本番運用の完了を意味するものではありません。
フォーマット(Spotless / Prettier)・静的解析(SpotBugs / ESLint)・型チェック・単体テスト・実PostgreSQLでの統合テスト・ビルド・秘密情報スキャン(gitleaks)・依存関係の脆弱性検査(OWASP Dependency-Check / npm audit)・E2E を、各Featureの完了前に実行。
AI Development System(ADS)を使い、AIを設計・実装・レビューなどの役割に分けて開発しました。実装とレビューの役割を分離し、指摘は修正・再レビューまで確認しています。業務判断は開発者本人が行っています。
Codex と Claude Code を工程ごとに使い分け、実装したAIとレビューするAIは常に別の製品・別セッションにしました。
設計・計画・実装・Review・最終監査などの工程で使用。
設計・計画・実装・Review などの工程で使用。
開発者本人が AI へ渡す作業指示文の作成補助に使用。設計・実装・Review は担当していない。
実装Reviewは 12 回行い、うち 2 回は差戻し(Request changes)でした。認証応答に内部用の値が含まれていた問題や、管理者が発行した一時パスワードを本人へ渡せない画面の問題など、自動チェックを通過した後の欠陥をReviewで見つけ、修正・再Reviewを経て承認しています。
負荷試験で見つかったロックの待ちの問題は、コードだけで回避せず、Feedback として起票し、設計文書とADRを更新してから実装を直しました。修正前の実装で失敗し、修正後に成功する試験を追加しています。
ApprovalFlowの成果物と記録から確認できる範囲です。AIとの分担は「開発プロセス(ADS)」に記載しています。