---
sidebar_position: 6
title: "注文フルフィルメント"
---

# 注文フルフィルメント

Salesforceの注文がWHMCSのサービスとして実現される技術的プロセスを説明します。

## フルフィルメントトリガー

Salesforce Change Data Capture (CDC)が注文の`Activation_Status__c`フィールドの変更を検出すると、BFFのプロビジョニングキュー（BullMQ）にジョブがエンキューされます。

### トリガー条件

- 注文ステータスが「Approved」または「Reactivate」に変更
- べき等キーにより同一注文の重複処理を防止
- ジョブはバックオフ付きリトライ戦略を使用

## プロビジョニングワークフロー

### ステップ1：ステータス更新

Salesforce注文の`Activation_Status__c`を「Activating」に設定し、処理中であることを示します。

### ステップ2：WHMCS注文作成

- Salesforce OrderItemsをWHMCS商品IDにマッピング（Product2の`WH_Product_ID__c`フィールドを使用）
- WHMCS `AddOrder` APIアクションを呼び出し
- 作成されるもの：WHMCSオーダー、請求書、サブスクリプション/サービスレコード
- 支払い方法：`stripe`
- プロモコード：設定されている場合に適用

### ステップ3：SIMアクティベーション（SIM注文のみ）

- eSIM注文：Freebit APIでeSIMプロファイルをアクティベート
- Physical SIM注文：エージェントが`Assign_Physical_SIM__c`にSIMを割り当て後にアクティベート

### ステップ4：Salesforce更新

- `WHMCS_Order_ID__c`に作成されたWHMCS Order IDを記録
- `Activation_Status__c`を「Active」（成功時）またはエラーステータスに更新
- 各OrderItemに`WHMCS_Service_ID__c`を記録
- 関連Opportunityに`WHMCS_Service_ID__c`を記録しステージを「Active」に更新

### ステップ5：リアルタイム通知

- SSEイベントを公開して接続中のクライアントに注文ステータスの変更を通知
- アプリ内通知を作成（「Order approved」「Service activated」など）

## エラー処理とリカバリ

### 支払い方法不足

`Activation_Error_Code__c` = `PAYMENT_METHOD_MISSING`が設定されます。顧客がWHMCSで支払い方法を追加し、サポートチームが再トリガーするまでプロビジョニングは一時停止されます。

### WHMCS APIエラー

- WHMCS注文作成失敗時、Salesforceステータスをロールバック
- エラーコードとメッセージをSalesforceに記録
- 部分的なWHMCS注文は保持されません

### Freebit/SIMエラー

- エラーをログに記録しactivation statusに表示
- 注文はSalesforceにリトライ用に保持

### 一時的エラー

- BullMQキューでエクスポネンシャルバックオフ付きリトライ
- 最大リトライ回数後にフルフィルメント失敗としてマーク

## 双方向リンク

フルフィルメント後、システムは双方向にリンクされます：

| 方向 | フィールド | 場所 | 値 |
| --- | --- | --- | --- |
| SF Order → WHMCS | `WHMCS_Order_ID__c` | Salesforce Order | WHMCS Order ID |
| SF OrderItem → WHMCS | `WHMCS_Service_ID__c` | Salesforce OrderItem | WHMCSサービスID |
| SF Opportunity → WHMCS | `WHMCS_Service_ID__c` | Salesforce Opportunity | メインWHMCSサービスID |
| WHMCS Service → SF | OpportunityIdカスタムフィールド | WHMCS Product/Service | Salesforce Opportunity ID |

この双方向リンクにより解約が機能します。ポータルはWHMCSサービスIDでOpportunityを検索しステージを更新します。
