Sales CRM 集約: ファイル管理 / Aggregate: File Management
バウンデッドコンテキスト: File Management (ファイル管理)
集約ルート
File (ファイル)
File (集約ルート)
├── fileName: string (ファイル名、必須)
├── fileSource: enum (link / upload)
├── fileType: FileType (提案書/見積書/契約書/名刺/その他)
├── url: string (外部リンク URL)
├── description: string (説明)
├── fileSize: number (KB、アップロード時)
├── relatedAccount: → Account (関連取引先)
├── relatedContact: → Contact (関連担当者)
├── relatedDeal: → Deal (関連案件)
├── uploadedBy: → User (アップロード者)
└── salesRep: → User (営業担当)
| プロパティ | 型 | 必須 | 説明 |
|---|---|---|---|
| fileName | string | ✓ | ファイル名 |
| fileSource | select | ✓ | link (外部リンク) / upload (アップロード) |
| fileType | FileType | ✓ | proposal / quote / contract / business_card / other |
| url | string | 条件付 | fileSource=link の場合は必須。http(s) のみ許可 |
| description | string | ファイルの説明・備考 | |
| fileUrl | string | 非推奨 (後方互換性)。新規は url を使用 | |
| fileSize | number | アップロードファイルのサイズ (KB) | |
| uploadedBy | → User | アップロード者 | |
| relatedAccount | → Account | 関連取引先 | |
| relatedContact | → Contact | 関連担当者 | |
| relatedDeal | → Deal | 関連案件 | |
| group | string | StaffGroups.slug | |
| salesRep | → User | 営業担当者 | |
| createdBy | → User | 作成者 (読取専用) | |
| updatedBy | → User | 最終更新者 (読取専用) | |
| version | number | 楽観ロック用 |
不変条件 (Invariants):
fileNameは必須fileTypeは FILE_TYPE_VALUES の値のみurlのバリデーション (fileSource=link の場合):- 空文字不可
- 有効な URL 形式
javascript:プロトコル禁止 (XSS 防止)http:/https:プロトコルのみ許可
- 楽観ロック: バージョン不整合で 409 Conflict
ファイルタイプの業務的意味
| FileType | 日本語 | 営業プロセスでの位置 |
|---|---|---|
proposal | 提案書 | 商談段階で提出する提案資料 |
quote | 見積書 | 見積段階で提出する価格提示 |
contract | 契約書 | 成約後の契約文書 |
business_card | 名刺 | 担当者情報のデジタル保存 |
other | その他 | 議事録、カタログ等 |
関連モデル
File ──→ Account (任意)
File ──→ Contact (任意)
File ──→ Deal (任意)
File ──→ User (uploadedBy, salesRep)
File は Account, Contact, Deal それぞれに任意で関連付け可能。 1 つのファイルが複数エンティティに同時に関連付くことも可能。