Fab Forward Dev/

DDD ドキュメント

TransLead CRM

Sales CRM DDD インスタンス — Payload CMS + Drizzle ORM 実装

fab-forward-sales 実装設定 / Implementation Configuration

目的: fab-forward-sales (Sales CRM) の実装仕様書。 DDD モデル (docs/ddd/sales/) の「インスタンス」として、実装済みのコレクション・フィールド・業務ルール・ アクセス制御を正規のソースコードから導出し記録する。

ベンチマーク元: TransLead CRM (fab-forward-sales/benchmark_translead/) テクノロジースタック: Next.js + Payload CMS + Drizzle ORM + PostgreSQL リポジトリ: ~/repos/fab-forward-sales

DDD モデル: docs/ddd/sales/ (ドメインモデル仕様) → 知識ベース: docs/knowledge/06-crm-fundamentals/, 07-sales-management/, 09-japanese-sales-culture/


1. コレクション一覧 (Collections)

出典: src/collections/index.ts

コレクションSlug日本語カテゴリDDD 集約実装ファイル
Accountsaccounts取引先masterSales Pipelinesrc/collections/Accounts.ts
Contactscontacts担当者masterSales Pipelinesrc/collections/Contacts.ts
Dealsdeals案件transactionSales Pipelinesrc/collections/Deals.ts
Activitiesactivities活動transactionActivity Trackingsrc/collections/Activities.ts
DailyReportsdaily-reports日報transactionActivity Trackingsrc/collections/DailyReports.ts
FilesfilesファイルtransactionFile Managementsrc/collections/Files.ts
UsersusersユーザーmasterIAMsrc/collections/Users.ts
StaffGroupsstaff_groups部署グループmasterIAMsrc/collections/StaffGroups.ts
CompanySettingscompany_settings企業設定configIAMsrc/collections/CompanySettings.ts
CustomFieldConfigscustom_field_configsカスタムフィールドconfigConfigurationsrc/collections/CustomFieldConfigs.ts

計画中のコレクション / エンドポイント

名称種別DDD 集約DDD 仕様状態
CommentstransactionSales Pipeline→ see sales-pipeline.md §Comment✅ 実装済み
/api/reports/pipelineread-only APIReporting→ see reporting.md §PipelineReport✅ 実装済み
/api/reports/activitiesread-only APIReporting→ see reporting.md §ActivitySummary✅ 実装済み
QuoteTemplatesconfigQuote Management→ see quote-management.md §QuoteTemplate✅ 実装済み
QuoteDocumentstransactionQuote Management→ see quote-management.md §QuoteDocument✅ 実装済み
GoalsconfigGoal Tracking→ see goal-tracking.md §Goal✅ 実装済み
GoalValuestransactionGoal Tracking→ see goal-tracking.md §GoalValue✅ 実装済み
/api/reports/goalsread-only APIGoal Tracking→ see goal-tracking.md §GoalProgress✅ 実装済み
DuplicateCandidatestransactionSales Pipeline→ see sales-pipeline.md §DuplicateDetection✅ 実装済み
/api/dedup/candidatesread-only APISales Pipeline→ see sales-pipeline.md §DuplicateCandidate✅ 実装済み
/api/dedup/detectaction APISales Pipeline→ see sales-pipeline.md §DuplicateDetection✅ 実装済み
/api/dedup/mergeaction APISales Pipeline→ see sales-pipeline.md §DuplicateDetection✅ 実装済み
/api/dedup/:id/dismissaction APISales Pipeline→ see sales-pipeline.md §DuplicateDetection✅ 実装済み
CalendarSyncconfigActivity Tracking→ see activity-tracking.md §CalendarSync(計画中)
EmailCaptureconfigActivity Tracking→ see activity-tracking.md §EmailCapture(計画中)
/api/settings/custom-fields/:id/impact-countread-only APIConfiguration→ see custom-fields.md §AffectedRecordCount✅ 実装済み

2. 区分マスタ (Enumerations — SSOT)

出典: src/lib/constants/labels.ts, src/lib/types/roles.ts

2.1 案件タイプ — DEAL_TYPE_VALUES

// src/lib/constants/labels.ts:65
export const DEAL_TYPE_VALUES = ["negotiation", "inquiry", "lead"] as const;
日本語ラベルTransLead 対応
negotiation商談商談
inquiry引合引合・リード (統合)
leadリード引合・リード (統合)

TransLead は inquirylead を「引合・リード」として統合 (2値)。実装では 3値に分離。

2.2 案件ステータス — DEAL_STATUS_VALUES

// src/lib/constants/labels.ts:84
export const DEAL_STATUS_VALUES = ["open", "won", "lost"] as const;
日本語ラベル
open進行中
won成約
lost失注

2.3 活動タイプ — ACTIVITY_TYPE_VALUES

// src/lib/constants/labels.ts:26
export const ACTIVITY_TYPE_VALUES = ["call", "meeting", "inquiry", "email", "email_received", "other"] as const;
日本語ラベルTransLead 対応
call電話発信電話
meeting面談打ち合わせ
inquiry電話受信問い合わせ
emailメール送信メール
email_receivedメール受信(なし — 実装で追加)
otherその他(なし — 実装で追加)

2.4 ファイルタイプ — FILE_TYPE_VALUES

// src/lib/constants/labels.ts:103
export const FILE_TYPE_VALUES = ["proposal", "quote", "contract", "business_card", "other"] as const;
日本語ラベル
proposal提案書
quote見積書
contract契約書
business_card名刺
otherその他

2.5 ユーザーロール — USER_ROLE_VALUES

// src/lib/types/roles.ts:13
export const USER_ROLE_VALUES = ["admin", "manager", "sales_rep", "executive"] as const;
日本語説明
admin管理者全権限 + ユーザー管理 + 設定変更
manager営業マネージャーチーム管理 + 全レポート閲覧/編集
sales_rep営業担当者自分の担当分のみ (定義済み、コレクションレベルは部分実装)
executive経営者全データ閲覧 (読取専用)

出典: src/lib/types/roles.ts — ROLES 定数に permission 定義あり。

2.6 カスタムフィールドタイプ

// src/types/customField.ts
export type FieldType = "text" | "number" | "date" | "dropdown" | "checkbox";
export type EntityType = "account" | "contact" | "deal";

3. フィールド定義 (全コレクション)

3.1 accounts — 取引先

出典: src/collections/Accounts.ts:77-231

フィールド必須インデックス備考
nametext取引先名
websitetextWEBサイト URL
phonetext代表電話
postalCodetext郵便番号 (XXX-XXXX)
addresstext住所
coordinatespoint座標 (lat/lng) — TransLead にない拡張
grouptextStaffGroups.slug
salesRep→ users営業担当
dealCountnumber案件数 (computed, readOnly, default: 0)
activityCountnumber活動件数 (computed, readOnly, default: 0)
lastActivityAtdate最終活動日 (computed, readOnly)
nextActivityAtdate次回活動予定日 (computed, readOnly)
createdBy→ users作成者 (readOnly)
updatedBy→ users最終更新者 (readOnly)
versionnumber楽観ロック (readOnly, default: 0)

Hooks: beforeChange → 楽観ロック検証 + version++ + AuditService Access: RBAC 実装済み (§4 参照)

3.2 contacts — 担当者

出典: src/collections/Contacts.ts:62-178

フィールド必須インデックス備考
nametext担当者名
nameKanatextカナ (ソート用) — TransLead にない拡張
titletext部署
emailemailメールアドレス
phonetext電話番号
mobiletext携帯番号
account→ accounts所属取引先
grouptextStaffGroups.slug
salesRep→ users営業担当
createdBy→ users作成者 (readOnly)
updatedBy→ users最終更新者 (readOnly)
versionnumber楽観ロック (readOnly, default: 0)

Hooks: beforeChange → AuditService + 楽観ロック検証 + version++ Access: RBAC 実装済み (§4 参照)

3.3 deals — 案件

出典: src/collections/Deals.ts:68-222

フィールド必須インデックス備考
nametext案件名
dealTypeselectDEAL_TYPE_OPTIONS
statusselectDEAL_STATUS_OPTIONS (default: "open")
amountnumber金額 (円)
probabilitynumber確度 0-100 (min:0, max:100)
expectedCloseDatedate成約予定日
account→ accounts関連取引先
contact→ contacts関連担当者 (任意)
commentCountnumberコメント数 (computed, readOnly, default: 0)
grouptextStaffGroups.slug
salesRep→ users営業担当
createdBy→ users作成者 (readOnly)
updatedBy→ users最終更新者 (readOnly)
versionnumber楽観ロック (readOnly, default: 0)

Hooks: beforeChange → 楽観ロック検証 + version++ + AuditService Access: RBAC 実装済み (§4 参照)

3.4 activities — 活動

出典: src/collections/Activities.ts:124-261

フィールド必須インデックス備考
activityTypeselectACTIVITY_TYPE_OPTIONS
subjecttext件名
descriptiontextarea詳細
activityDatedate活動日
durationnumber所要時間 (分)
account→ accounts関連取引先
contact→ contacts関連担当者 (任意)
deal→ deals関連案件 (任意)
grouptextStaffGroups.slug
salesRep→ users営業担当
createdBy→ users作成者 (readOnly)
updatedBy→ users最終更新者 (readOnly)
versionnumber楽観ロック (readOnly, default: 0)

Hooks: beforeValidate → account 必須 + activityType 検証 + subject 空文字 + duration > 0 Hooks: beforeChange → 楽観ロック + AuditService Access: RBAC 実装済み (§4 参照)

3.5 daily-reports — 日報

出典: src/collections/DailyReports.ts:91-236

フィールド必須インデックス備考
user→ users報告者
reportDatedate報告日
dealSummariesarray案件サマリー配列
deal→ deals案件参照
probabilitynumber確度 (0-100)
statustextステータス
commenttextareaコメント
activitySummariesarray活動サマリー配列
activity→ activities活動参照
outcometext結果
notestextarea所感・メモ
nextActionstextarea次のアクション
createdBy→ users作成者 (readOnly)
updatedBy→ users最終更新者 (readOnly)

Hooks: beforeValidate → user + reportDate ユニーク制約 Hooks: beforeChange → AuditService + user 自動設定 Access: RBAC 実装済み (§4 参照)

3.6 files — ファイル

出典: src/collections/Files.ts:62-226

フィールド必須インデックス備考
fileNametextファイル名
fileSourceselectlink / upload (default: link)
urltext条件付fileSource=link 時必須、http(s) のみ
descriptiontextarea説明
fileTypeselectFILE_TYPE_OPTIONS
fileUrltext非推奨 (後方互換)
fileSizenumberファイルサイズ (KB)
uploadedBy→ usersアップロード者
relatedContact→ contacts関連担当者
relatedDeal→ deals関連案件
relatedAccount→ accounts関連取引先
grouptextStaffGroups.slug
salesRep→ users営業担当
createdBy→ users作成者 (readOnly)
updatedBy→ users最終更新者 (readOnly)
versionnumber楽観ロック (readOnly, default: 0)

URL バリデーション: javascript: 禁止、http: / https: のみ許可 Access: RBAC 実装済み (§4 参照)

3.7 users — ユーザー

出典: src/collections/Users.ts:93-223

フィールド必須インデックス備考
usernametext✓ (unique)[a-z0-9_]+ パターン
full_nametext表示名
email(auth)Payload 認証用
grouptextStaffGroups.slug
roleselectUSER_ROLE_OPTIONS (default: sales_rep)
statusselectactive / inactive (default: active)
notestextarea管理者メモ
password_changed_atdateパスワード変更日時 (readOnly)
must_change_passwordcheckbox初回パスワード変更 (default: true)
last_logindate最終ログイン (readOnly)
createdBy→ users作成者 (readOnly)
updatedBy→ users最終更新者 (readOnly)

Auth 設定: tokenExpiration=7200s, maxLoginAttempts=3, lockTime=900000ms Access: RBAC 実装済み (§4 参照)

3.8 staff_groups — 部署グループ

出典: src/collections/StaffGroups.ts:32-62

フィールド必須インデックス備考
nametextグループ表示名
slugtext✓ (unique)一意識別子
sortOrdernumber表示順 (default: 0)

Access: read=全員, create/update/delete=admin のみ

3.9 company_settings — 企業設定

出典: src/collections/CompanySettings.ts:132-265

フィールド必須備考
company_nametext企業名 (maxLength: 100)
postal_codetextXXX-XXXX 形式 (beforeChange で検証)
prefecturetext都道府県
citytext市区町村
street_addresstext番地・建物名
logo_urltextロゴ画像 URL (readOnly)
logo_file_keytextストレージキー (readOnly)
business_hours_starttextHH:MM 形式
business_hours_endtextHH:MM 形式 (start < end 検証)
fiscal_year_start_monthnumber1-12
createdBy→ users作成者 (readOnly)
updatedBy→ users最終更新者 (readOnly)
versionnumber楽観ロック (readOnly, default: 0)

シングルトンパターン: beforeChange で既存レコード存在チェック → 2件目作成禁止 Access: read=全員, create/update/delete=admin のみ

3.10 custom_field_configs — カスタムフィールド

出典: src/collections/CustomFieldConfigs.ts:131-269

フィールド必須インデックス備考
entity_typeselectaccount / contact / deal
field_nametext^[a-z_][a-z0-9_]*$ パターン
display_nametextユーザー表示名
field_typeselecttext / number / date / dropdown / checkbox
descriptiontextarea項目説明
is_requiredcheckbox必須フラグ (default: false)
display_ordernumber表示順 (default: 0)
is_system_fieldcheckboxシステム項目 (readOnly, default: false)
type_propertiesjsonタイプ固有設定 (options, min/max, etc.)
createdBy→ users作成者 (readOnly)
updatedBy→ users最終更新者 (readOnly)
versionnumber楽観ロック (readOnly, default: 0)

予約語: src/types/customField.ts:120 — id, created_at, updated_at, created_by, updated_by, version, deleted_at, deleted_by ユニーク制約: entity_type + field_name (beforeChange で検証) dropdown 検証: options 配列に最低 1 要素必須 number 検証: min_value ≤ max_value Access: 全操作 admin のみ


4. アクセス制御 (RBAC) 実装状況

出典: 各コレクションの access プロパティ → 完全な RBAC 仕様: iam.md §RBAC データアクセスマトリクス

コレクションreadcreateupdatedelete実装状況
accountsRBACRBACRBACadmin only✅ 実装済み
contactsRBACRBACRBACadmin only✅ 実装済み
dealsRBACRBACRBACadmin only✅ 実装済み
activitiesRBACRBACRBACadmin only✅ 実装済み
daily-reportsRBACopenRBACadmin only✅ 実装済み
filesRBACRBACRBACadmin only✅ 実装済み
usersRBACadminRBACadmin✅ 実装済み
staff_groupsopenadminadminadmin✅ 実装済み
company_settingsopenadminadminadmin✅ 実装済み
custom_field_configsadminadminadminadmin✅ 実装済み

RBAC 詳細 (実装済みコレクション)

accounts, contacts, deals, activities, files (共通パターン — src/lib/access/salesRepScoped.ts):

  • read: admin/manager/executive → 全件、sales_rep → { salesRep: { equals: user.id } }
  • create: admin/manager/sales_rep → 許可、executive → 不可
  • update: admin/manager → 全件、sales_rep → { salesRep: { equals: user.id } }、executive → 不可
  • delete: admin のみ

daily-reports:

  • read: admin/manager/executive → 全件、sales_rep → { user: { equals: user.id } }
  • update: admin/manager → 全件、sales_rep → { user: { equals: user.id } }
  • delete: admin のみ

users:

  • read: admin/manager/executive → 全件、sales_rep → { id: { equals: user.id } }
  • update: admin → 全件、その他 → { id: { equals: user.id } }

→ see iam.md §RBAC データアクセスマトリクス (per-collection × per-role 完全定義) → see 05-business-rules.md §10 RBAC データスコーピング (ルール RBAC-001 〜 RBAC-005)


5. 共通パターン (Cross-cutting)

5.1 楽観ロック

実装済みコレクション: accounts, contacts, deals, activities, daily-reports, files, company_settings, custom_field_configs

beforeChange:
  if update && incomingVersion !== currentVersion:
    → 409 Conflict + { latestData, modifiedBy, modifiedAt }
  else:
    version = currentVersion + 1
  if create:
    version = 0

全コレクション楽観ロック実装完了 ✅

5.2 監査フィールド

出典: src/lib/services/AuditService.ts

全コレクションの beforeChangeapplyAuditFields() を呼び出し:

  • create: createdBy = req.user.id, updatedBy = req.user.id
  • update: updatedBy = req.user.id

5.3 タイムスタンプ

全コレクション: timestamps: true → Payload が createdAt, updatedAt を自動管理


6. PMS 連携 (Integration Layer)

出典: src/integrations/pms/

レイヤーファイル実装済み
型定義types.ts
設定config.ts
コレクションcollections/Products.ts, ProductionTracking.ts
API エンドポイントendpoints/pmsQuotes.ts, pmsOrders.ts, pmsProducts.ts, pmsEvents.ts
クライアントservices/pmsClient.ts
イベント処理services/eventProcessor.ts
Webhook 認証services/webhookAuth.ts
応答拡張hooks/enrichDealResponse.ts, extendDealFields.ts, extendAccountFields.ts

7. ERD (Entity Relationship Diagram)

出典: src/lib/erd/deriveSchema.ts — Payload コレクション定義から自動導出 API: GET /api/erd (admin 認証必須)

                 ┌──────────────────┐
                 │  staff_groups    │
                 │  (部署グループ)  │
                 │  name, slug, sort│
                 └───────┬──────────┘
                         │ slug → group (text 参照)
         ┌───────────────┼───────────────┐
         │               │               │
┌────────┴────────┐ ┌────┴──────┐ ┌──────┴──────┐
│    users        │ │ company_  │ │ custom_     │
│  (ユーザー)     │ │ settings  │ │ field_      │
│  username (UQ)  │ │ (企業設定) │ │ configs     │
│  role (RBAC)    │ │ singleton │ │ entity_type │
│  status         │ └───────────┘ │ + field_name│
│  auth (Payload) │               │ = UQ        │
└────────┬────────┘               └─────────────┘
         │ FK: salesRep, createdBy, updatedBy
         │
┌────────┴──────────────────────────────────────┐
│  ┌──────────┐  1:N  ┌──────────┐              │
│  │ accounts │───────│ contacts │              │
│  │ (取引先) │       │ (担当者) │              │
│  │ name (IX)│       │ name (IX)│              │
│  │ coords   │       │ account  │              │
│  │ (point)  │       │ (FK, IX) │              │
│  └────┬─────┘       └────┬─────┘              │
│       │ 1:N              │ N:1                │
│  ┌────┴─────┐            │      ┌──────────┐  │
│  │  deals   │──N:1───────┘      │  files   │  │
│  │  (案件)  │                   │ (ファイル) │  │
│  │ dealType │                   │ fileType  │  │
│  │ status   │                   │ fileSource│  │
│  │ (IX)     │                   │ → account │  │
│  │ amount   │                   │ → contact │  │
│  │ probab.  │                   │ → deal    │  │
│  └────┬─────┘                   └──────────┘  │
│       │ 1:N                                   │
│  ┌────┴──────────┐    ┌───────────────┐       │
│  │  activities   │    │ daily_reports  │       │
│  │  (活動)       │    │ (日報)         │       │
│  │ activityType  │    │ user (FK,IX)   │       │
│  │ subject (IX)  │    │ reportDate(IX) │       │
│  │ actDate (IX)  │    │ user+date = UQ │       │
│  │ account(FK,IX)│    │ dealSummaries[]│       │
│  │ contact (FK)  │    │ → deals        │       │
│  │ deal (FK)     │    │ actSummaries[] │       │
│  └───────────────┘    │ → activities   │       │
│                       └───────────────┘       │
└───────────────────────────────────────────────┘

8. TransLead ベンチマーク差分

TransLead CRM にあって本実装にない機能。DDD 仕様化済みの機能と未着手の拡張候補を区分する。

DDD 仕様化済み (Phase 2 で DDD に昇格)

TransLead 機能DDD 仕様実装状況
案件コメント CRUD→ see sales-pipeline.md §Comment✅ 実装済み
RBAC データスコーピング→ see iam.md §RBAC データアクセスマトリクス✅ 実装済み
パイプライン分析・加重金額→ see reporting.md §PipelineReport, §ActivitySummary✅ 実装済み

DDD 仕様化済み (Phase 5 で DDD に昇格)

TransLead 機能DDD 仕様実装状況
見積書生成→ see quote-management.md §QuoteTemplate, §QuoteDocument, rules QT-001〜✅ 実装済み
目標管理→ see goal-tracking.md §Goal, §GoalValue, §GoalProgress, rules GL-001〜✅ 実装済み
重複チェック→ see sales-pipeline.md §DuplicateDetection, rules DUP-001〜✅ 実装済み
カレンダー連携→ see activity-tracking.md §CalendarSync, rules CAL-001〜(計画中)
メール連携→ see activity-tracking.md §EmailCapture, rules EM-001〜(計画中)
日報楽観ロック→ see activity-tracking.md §DailyReport version, rules DR-001✅ 実装済み
カスタムフィールド影響件数→ see custom-fields.md §AffectedRecordCount, rules CF-002✅ 実装済み

未着手の拡張候補

TransLead 機能概要DDD 拡張候補
確度グレード制 (S/A/B/C/D/F)数値 0-100 ではなくグレードUI 層で変換テーブル対応可
プッシュ通知コメント通知・デバイス管理Cross-cutting に Notification BC 追加
多言語ラベル8言語フィールドラベルConfiguration BC に i18n 追加
一括インポート UIseed 用 CSV パーサーのみCross-cutting に ImportJob 追加