小規模店舗向け 顧客・販促管理システム(CRM)
AI CRM Demo
顧客・来店・売上を 1 か所にまとめ、次に声をかけるべき顧客を見つけ、販促の文案を用意し、人が承認するまでを回す。
このページについて
含めていないもの
- LINE Messaging API 連携(webhook / 一斉・個別・ステップ配信 / リッチメニュー)
- 代理店マルチテナント管理(/agencies UI・代理店単位の店舗ダッシュボード)
- Celery + Redis による配信の定期実行・バックグラウンド処理
- 本番インフラ(HTTPS 終端・HSTS・secure cookie・CDN・VPS 運用手順)
- 実顧客 CSV 取込のポリシー(生データのマスキング・保持期限の削除)
Architecture
画面(React 18 / TypeScript / Vite)→ API(Django 5.0 / DRF・/api/v1/)→ AI provider(mock = DEFAULT / anthropic = OPTIONAL)/ DB の 4 層。Django アプリは計 11 個、業務の流れ 7 段(人による承認を含む)。
Why this architecture
ドメインが顧客・予約・売上・施策・監査の 5 系統に分かれ、いずれも管理系の CRUD と権限判定が中心である。ORM とマイグレーション、認証・権限の既製レイヤ、drf-spectacular による OpenAPI 自動生成が標準で揃うため、業務ロジックとテストに時間を割ける。監査ログとマスキングを Serializer / 認証クラスという単一の通り道へ集約できることも決め手。同一画面を権限で出し分ける要件があるため、画面側は型で応答形状を固定し、サーバ状態の取得を TanStack Query に寄せて分岐をコンポーネントへ閉じ込めた。
Django テンプレートによる一体構成
画面数は少ないため作れはするが、権限別の出し分けがテンプレート内の条件分岐へ散り、API 契約として外部へ渡せる形(引き継ぎ・別クライアント)が残らない。「引き継げること」を要件に含めたため却下。
SSR フレームワーク(Next.js 等)でのフルスタック構成
認証・権限・監査をアプリ側で自作する比重が上がり、Django の既製レイヤで済む部分を書き直すことになる。SEO 要件もない。
既製 SaaS CRM のカスタマイズ
AI 文案の承認フローと権限別マスキングが中核要件であり、外部サービスの拡張点に載せるとロジックが分散する。
Failure modes
- ログイン状態の失効は秒単位ではない(次アクセス時に token_version 判定)。
- マスクは API 応答時の加工であり、DB は平文。
- 画面側のトークン自動更新は未実装(apiClient.ts に TODO)。
- 監査は対象操作限定で、reservation / sale の書き込みは対象外。
- 表現チェックは辞書ベースで、辞書に無い表現は検出しない(法的判断ではない)。
Trade-offs
- マスキングを表示層に置いたため、DB 直参照や dump では平文が見える。
- 監査を「対象操作の列挙」にしたため、網羅性より可読性を取っている。
- AI 利用ログは 5 サービス中 3 つのみトークン数を保持しており、コスト上限制御はこのデータのままでは組めない。
- frontend / backend の 2 デプロイ単位、型定義の二重管理(OpenAPI からの生成は未導入)、frontend テスト 0 件。
Tests
静的 def test_ 480 件、CI 実測 484 passed(run 32078586978、Python 3.12 / config.settings.test / SQLite in-memory / AI_PROVIDER=mock)。frontend テストは 0 件。
| 領域 | 内容 |
|---|---|
| 認証 | apps/accounts/tests/test_auth.py(30) |
| マスキング | apps/customers/tests/test_masking.py(19) |
| 承認 | apps/campaigns/tests/test_approval.py(16) |
| CSV 出力 | 29 |
| AI 呼び出し | apps/ai_core/tests(37) |
| 監査 | apps/audit/tests/test_audit.py(7) |
| 共同作業者 | test_collaborators.py(21) |
| 取込エラー保持 | test_import_error_retention.py(8) |
Security / Data handling
- apps/customers/utils.py:1-40 と serializers.py:182-202 が to_representation 時にマスク。
- apps/accounts/authentication.py:26-40 で per-request token_version 判定。
- ログイン試行は SimpleRateThrottle。
- 監査は apps/audit/services.py の write_audit_log(before-after スナップショット)。
- 取込エラー行は PII をマスクして保持し、purge_import_errors で削除する(自動実行なし)。
Limitations
できること・含めていないことの各行に対応。README「Differences from the Original Product Scope」および「AI Architecture」の 5 サービス表を正本とする。
この公開デモに含めていない
- frontend テストは 0 件(CI が frontend で回すのは lint / type-check / build のみ)。
- マスキングは API 応答時の表示制御で、データベースは平文で保持している。
- 監査ログは対象操作限定。予約・売上の書き込みは対象外(23 か所 / 7 アプリ)。
Scale
| 項目 | 実測値 | 取得方法 |
|---|---|---|
| API エンドポイント | 55 | apps/*/urls.py の path() 総数 63 から、下位 urls.py を束ねる include() 8 件を除いた実数。DRF Router は不使用 |
| モデル / アプリ | 26 / 11 | Django のモデルレジストリ(apps.get_models() のうち apps.* 所属) |
| 設計文書 | 24 本 | docs/ の Markdown(連番の設計文書 23 本 + API_CONTRACT.md) |
| backend テスト | 静的 480 件 / CI 実測 484 passed | backend/apps のテスト定義を数えた静的件数 480 件(2026-08-20 再計測)。CI 実行ログ run 32078586978 の実測は 484 passed |
| frontend テスト | 0 件 | frontend/ 配下に *.test.* / *.spec.* が 0 件(node_modules 除く) |
Links
ai-crm-demo/backend/apps/ai-crm-demo/frontend/src/docs/API_CONTRACT.md
specs/05_業務要件定義書specs/06_機能要件定義書design/09_データベース設計書design/23_アーキテクチャ設計書design/20_AIプロンプト設計書