Fab Forward Dev/

DDD ドキュメント

Sales CRM ドメインイベントカタログ / Domain Events Catalog

Sales CRM で発生するドメインイベントの一覧。 イベント名・トリガー・ペイロード・購読者を定義する。

対応ドメイン: docs/ddd/pms/04-domain-events.md (PMS 側のイベントカタログ)


凡例

説明
Event Typeコード上のイベント識別子
トリガーイベントが発火する条件
発行元イベントを生成するコンテキスト
購読者イベントを受信するコンテキスト

1. 営業パイプライン (Sales Pipeline)

内部イベント

イベント名Event Typeトリガー購読者
案件作成deal.created新規 Deal を保存Operations (日報連携)
案件更新deal.updatedDeal の status/amount/probability 変更Operations
案件成約deal.wonDeal.status → wonPMS (CreateOrderRequest)
案件失注deal.lostDeal.status → lost— (内部ログ)
取引先作成account.created新規 Account を保存
取引先更新account.updatedAccount フィールド変更
担当者作成contact.created新規 Contact を保存
活動記録activity.logged新規 Activity を保存Account (lastActivityAt 更新)
コメント追加comment.added案件にコメント投稿Deal (commentCount 更新)

PMS 連携イベント (送信)

イベント名Event Typeトリガーペイロード先
受注依頼CreateOrderRequestDeal 成約 (won)PMS API
顧客同期CustomerSyncPayloadAccount 作成/更新PMS API
見積依頼QuoteRequest見積依頼作成PMS API

deal.won → CreateOrderRequest ペイロード

interface CreateOrderRequest {
  customer_code: string;       // Account の PMS 連携コード
  order_date: string;          // ISO 8601
  due_date: string;            // 納期
  line_items: {
    product_code: string;      // PMS 製品コード
    quantity: number;
    unit_price: number;
    description?: string;
  }[];
  total_amount: number;
  correlation_id: string;      // Deal.id (トレーサビリティ用)
  schema_version: string;      // コントラクトバージョン
}

2. PMS → Sales CRM (受信イベント)

PMS から Webhook 経由で受信するドメインイベント。

イベント処理フロー

PMS (Webhook)
  │
  ▼
webhookAuth.ts (HMAC 署名検証)
  │
  ▼
eventProcessor.ts (イベントルーティング)
  │
  ├─▶ ProductionTracking 作成/更新
  │
  └─▶ Deal.productionTracking 仮想フィールド (afterRead)

受信イベント一覧

Event Type日本語ステータス遷移処理内容
OrderReceived受注受付orderedProductionTracking 作成
WorkOrderCreated作業指示作成orderedworkOrders 配列に追加
ProductionScheduled生産計画確定scheduledestimatedCompletion 設定
ProductionApproved生産承認scheduled
ProductionStarted製作開始in_progress
ProductionCompleted製作完了completedqualityMetrics 更新
DefectRecorded不良記録(変更なし)defect_qty, defect_rate 更新
PurchaseOrderIssued発注発行(変更なし)
GoodsReceived入荷完了(変更なし)
OrderFulfilled出荷完了shippedactualCompletion 設定

DomainEvent ペイロード (受信)

interface DomainEvent {
  event_id: number;            // 連番 (冪等性チェック用)
  event_type: string;          // EventType
  correlation_id: string;      // Deal.id or Order No
  occurred_at: string;         // ISO 8601
  actor_id: string;            // PMS ユーザー ID
  version: number;             // スキーマバージョン
  payload: {
    order_number: string;      // PMS オーダー番号
    work_order_id?: number;    // 作業指示 ID
    work_type?: string;        // 作業種別
    completed_qty?: number;    // 完了数
    defect_qty?: number;       // 不良数
    scheduled_date?: string;   // 予定日
    actual_completion_date?: string;  // 実完了日
    [key: string]: unknown;
  };
}

冪等性 (Idempotency)

イベント処理は冪等性を保証:

  • lastEventId で処理済みイベントをスキップ
  • event_id <= lastEventId の場合は { processed: false } を返す
  • 未知のイベントタイプはログ出力のみ (クラッシュしない)

3. レポート・分析 (Reporting)

イベント名Event Typeトリガー購読者
レポート生成report.generatedPipelineReport または ActivitySummary の集計リクエスト— (ログ記録)

レポートは読取専用プロジェクションのため、状態変更イベントは発生しない。 report.generated は監査・利用状況追跡目的のオプショナルイベント。

comment.added ペイロード

interface CommentAddedEvent {
  dealId: string;           // 対象案件 ID
  commentId: string;        // 新規コメント ID
  authorId: string;         // 投稿者 ID
  body: string;             // コメント本文 (truncated)
  occurredAt: string;       // ISO 8601
}

3.5 見積管理 (Quote Management)

イベント名Event Typeトリガー購読者
見積書作成quote.created新規 QuoteDocument を保存 (draft)
見積書発行quote.issuedQuoteDocument.status → issued (PDF 生成)File Management (File 作成)

quote.issued ペイロード

interface QuoteIssuedEvent {
  quoteId: string;          // 見積書 ID
  quoteNumber: string;      // 見積番号
  dealId: string;           // 関連案件 ID
  accountId: string;        // 宛先取引先 ID
  totalAmount: number;      // 合計金額
  fileId: string;           // 生成された PDF の File ID
  occurredAt: string;       // ISO 8601
}

3.6 目標管理 (Goal Tracking)

イベント名Event Typeトリガー購読者
目標評価goal.evaluatedGoalProgress の集計リクエスト— (ログ記録)

Goal Tracking は読取専用投影に近い性質のため、状態変更イベントは最小限。 goal.evaluated は目標達成率の監査・通知目的のオプショナルイベント。

goal.evaluated ペイロード

interface GoalEvaluatedEvent {
  goalId: string;           // 目標項目 ID
  userId: string;           // 対象ユーザー ID (全体目標時は null)
  periodStart: string;      // 期間開始日 (ISO 8601)
  periodEnd: string;        // 期間終了日 (ISO 8601)
  targetValue: number;      // 目標値
  actualValue: number;      // 実績値
  achievementRate: number;  // 達成率 (%)
  occurredAt: string;       // ISO 8601
}

3.7 重複検出 (Duplicate Detection)

イベント名Event Typeトリガー購読者
重複検出duplicate.detectedバッチジョブが類似レコードを検出— (管理者通知)
重複統合duplicate.mergedDuplicateCandidate の手動統合Sales Pipeline (関連データ移行)

duplicate.detected ペイロード

interface DuplicateDetectedEvent {
  entityType: string;       // account / contact
  sourceId: string;         // 元レコード ID
  targetId: string;         // 重複候補 ID
  similarityScore: number;  // 類似度スコア
  occurredAt: string;       // ISO 8601
}

3.8 カレンダー連携 (Calendar Sync)

イベント名Event Typeトリガー購読者
カレンダー同期calendar.syncedActivity → 外部カレンダーへの同期完了— (ログ記録)
カレンダー同期エラーcalendar.sync_failed外部カレンダー API エラー— (ユーザー通知)

3.9 メール取り込み (Email Capture)

イベント名Event Typeトリガー購読者
メール取り込みemail.captured受信メール → Activity 自動作成Activity Tracking (Activity 作成)
メール取り込みエラーemail.capture_failedメールサーバー接続/認証エラー— (ユーザー通知)

email.captured ペイロード

interface EmailCapturedEvent {
  emailAddress: string;     // 送信元メールアドレス
  contactId: string;        // マッチした Contact ID
  activityId: string;       // 作成された Activity ID
  subject: string;          // メール件名
  occurredAt: string;       // ISO 8601
}

4. 監査イベント (Audit Events)

全コレクション共通の監査フィールド自動設定。

全コレクションの beforeChange フックで自動的に監査フィールドを設定:

操作設定されるフィールドトリガー
createcreatedBy, updatedByレコード作成時
updateupdatedByレコード更新時
// applyAuditFields の処理
if (operation === "create") {
  data.createdBy = req.user.id;
}
data.updatedBy = req.user.id;

5. 楽観ロックイベント (Conflict Events)

イベント名トリガー応答
version.conflictincomingVersion !== currentVersion409 Conflict + latestData
// 409 応答ペイロード
{
  latestData: { /* 最新レコード全体 */ },
  modifiedBy: "user-id",
  modifiedAt: "2026-01-25T10:30:00Z"
}

6. 製造進捗ステータス遷移図

ProductionTracking コレクション

フィールド説明
deal→ Deal関連案件
orderNumberstringPMS オーダー番号
correlationIdstring相関 ID
overallStatusProductionStatusordered / scheduled / in_progress / completed / shipped
completionPctnumber完了率 (0-100)
estimatedCompletionDate予定完了日
actualCompletionDate実際の完了日
qualityMetricsJSONcompleted_qty, defect_qty, defect_rate
workOrdersArray作業指示リスト
eventsArrayイベント履歴
lastEventIdnumber最後に処理したイベント ID
lastUpdatedFromPmsDatePMS からの最終更新日時