ConsolidationService - スコープ指定、Gobal
ConsolidationService API は、カスタムロジックを使用して複雑な階層ビジネスデータ (契約、見積、品目、エンタイトルメントなど) を結合および重複排除するためのメソッドを含むスクリプトインクルードです。
この API は sn_l2c_core 名前空間に属しており、アクセスするには admin ロールと Lead to Cash Core (com.snc.l2c_core) プラグインが必要です。
- 複数の属性またはネストされた子エンティティ間で 2 つのレコードを同じにする理由を定義します。
- 特定の条件が満たされたときに条件付きでレコードを結合します。
- 数量の合計や日付範囲の計算など、連結中にカスタム計算を適用します。
- 深くネストされた子構造を再帰的に重複排除 (統合) します。
- フローと統合全体で同じ統合ロジックを一貫して再利用する。
ConsolidationService は Lead to Cash Core プリミティブエンジンの一部であり、Lead to Cash コア 製品からアクセスします。
事前準備
- インストールされている Lead to Cash Core プラグイン (
com.snc.l2c_core) とadminロール。 - sn_l2c_coreを拡張するカスタムスクリプトインクルード
。LeadToCashService を呼び出し、getConsolidationService()からConsolidationService実装を返します。これにより、統合ロジックがパイプラインに配線され、実行時に PrimitiveUtil によって解決されます。 - 統合を含む L2C Core プリミティブを呼び出すためのエントリーポイントである PrimitiveUtil に精通していること。
ConsolidationService は、 Lead to Cash コア (l2c) Core プリミティブエンジンの一部です。この API を実装する前に、この API がより広範な発動パイプラインにどのように適合するかを理解する必要があります。
PrimitiveUtil は、統合を含むすべての L2C Core プリミティブ操作のランタイムエントリーポイントです。PrimitiveUtil は、 ConsolidationService を直接呼び出すのではなく、拡張ポイント メカニズムを使用して、サーバー側スクリプトからトリガーされるか、Lead-to-Cash Flow Designer プリミティブからトリガーされるかにかかわらず、実行時に正しいサービス実装を解決します。
ConsolidationService ロジックをこのパイプラインに配線するには、sn_l2c_coreを拡張するカスタムスクリプトインクルードを作成する必要があります。LeadToCashService を呼び出し、getConsolidationService() から ConsolidationService 実装を返します。PrimitiveUtil は、実行時に拡張ポイントレジストリでカスタム LeadToCashService をチェックし、見つかった場合は呼び出します。カスタム実装が登録されていない場合、PrimitiveUtil はベースsn_l2c_coreにフォールバックします。自動的に LeadToCashService です。このフォールバックをコードで直接インスタンス化したり参照したりする必要はありません。
ConsolidationServiceSNC API 拡張とワークフロー
ConsolidationServiceSNC API のベースシステムは、不要な連結が無意識のうちに適用されないように、デフォルトでは無効になっています。統合アクションを有効にするには、カスタムロジックを作成し、オプションで ConsolidationServiceSNC スクリプトインクルードで提供されているメソッドを上書きする必要があります。
- 必須。sn_l2c_coreを拡張するカスタムスクリプトインクルードを作成します。ConsolidationService。
- 必須。enableConsolidation() をオーバーライドして true を返します。このフラグにより、サービスでの統合を許可できます。スクリプト例:
var MyConsolidationService = Class.create(); MyConsolidationService.prototype = Object.extendsObject( sn_l2c_core.ConsolidationService, { enableConsolidation: function () { return true; // REQUIRED }, type: 'MyConsolidationService' }); - 制御するエンティティに応じて、オプションで次の追加メソッドを任意の数で上書き (または有効) します。注:どのメソッドも上書きしない場合、
consolidate() はマージや統合を行わずにターゲット JSON をそのまま返します。メソッド アクション canConsolidateEntity(contextType) ターゲット内で統合する子アレイを選択します。 canMergeEntity(contextType) ソースの子をターゲットに結合します。 getHashConfig() エンティティをグループ化する方法 (ハッシュ) を指定します。 canConsolidateJSONs(json1, json2) 2 つの JSON を結合するかどうかを決定します。 overrideAttributeValues() 結合後、最終的な統合 JSON がワークフローを続行する前に、カスタムビジネスロジックを適用します。 getPrimary(json1, json2) 連結中にプライマリレコードとして扱われる 2 つのエンティティのうちのどれを決定します。その属性値は、結合結果でデフォルトで保持されます。 preProcess() データを計算するためのプリフック。 postHierarchyConsolidation() 最終クリーンアップのポストフック。 - sn_l2c_coreからカスタム ConsolidationService を返します。LeadToCashService。
LeadToCashServiceは、統合ロジックを Lead-to-Cash パイプラインに接続するエントリーポイントであり、統合が呼び出されるたびに実際に使用されます。スクリプト例:var MyLeadToCashService = Class.create(); MyLeadToCashService.prototype = Object.extendsObject( sn_l2c_core.LeadToCashService, { getConsolidationService: function () { return new MyConsolidationService(); }, type: 'MyLeadToCashService' }); - サーバー側スクリプトから直接、または Lead-to-Cash Flow Designer プリミティブを介して間接的に LeadToCashService.consolidate() を呼び出して、連結を呼び出します。
ConsolidationService:canConsolidateEntity(文字列 contextType)
JSON 内で統合できる子エンティティタイプを指定するための上書き可能なメソッド。基本実装では、上書きされない場合、すべてのエンティティタイプに対して false が返されます。
| 名前 | タイプ | 説明 |
|---|---|---|
| contextType | 文字列 | 子エンティティタイプを表すエンティティ JSON のアレイプロパティのキー名。例:「lineItems」、「characteristics」、「coveredProducts」。 |
| タイプ | 説明 |
|---|---|
| ブーリアン | 選択したエンティティタイプで連結が可能かどうかを示すフラグ。 有効な値:
デフォルト値:false |
次の例は、 canConsolidateEntity() を上書きして、品目と対象製品の連結を有効にする方法を示しています。
var MyConsolidationService = Class.create();
MyConsolidationService.prototype = Object.extendsObject(sn_l2c_core.ConsolidationService, {
enableConsolidation: function() {
return true;
},
canConsolidateEntity: function(contextType) {
return contextType == "lineItems" || contextType == "coveredProducts";
},
type: 'MyConsolidationService'
});
var service = new MyConsolidationService();
gs.info("Can consolidate lineItems = " + service.canConsolidateEntity("lineItems"));
gs.info("Can consolidate characteristics = " + service.canConsolidateEntity("characteristics"));
Can consolidate lineItems = true
Can consolidate characteristics = falseConsolidationService:canConsolidateJSONs(オブジェクト json1, オブジェクト json2)
同じハッシュを持つ 2 つのエンティティ JSON を統合できるかどうかを判断するための条件を追加する上書き可能なメソッド。基本実装は、上書きされない場合に false を返します。
| 名前 | タイプ | 説明 |
|---|---|---|
| json1 | オブジェクト | 比較する最初のエンティティ JSON。sys_id、テーブル、属性、および子アレイが含まれます。 |
| json2 | オブジェクト | 比較する 2 番目のエンティティ JSON。sys_id、テーブル、属性、および子アレイが含まれます。 |
| タイプ | 説明 |
|---|---|
| ブーリアン | 2 つの JSON を 1 つに統合できるかどうかを示すフラグ。 有効な値:
デフォルト値:false |
この例では、 canConsolidateJSONs() を上書きして、同じ製品オファリングを持つ品目の連結を許可する方法を示します。
var MyConsolidationService = Class.create();
MyConsolidationService.prototype = Object.extendsObject(sn_l2c_core.ConsolidationService, {
enableConsolidation: function() {
return true;
},
canConsolidateJSONs: function(json1, json2) {
if (json1.table == "sn_quote_mgmt_core_quote_line_item") {
// Fall back to empty string if product_offering has no value
var po1 = json1.attributes.product_offering ? json1.attributes.product_offering.value : "";
// Fall back to empty string if product_offering has no value
var po2 = json2.attributes.product_offering ? json2.attributes.product_offering.value : "";
// Consolidate only if both line items share the same product offering, and that value is not empty
return po1 == po2 && po1 != "";
}
return false;
},
type: 'MyConsolidationService'
});
falseConsolidationService:canMergeEntity(文字列 contextType)
ソース JSON からターゲット JSON に結合できる子エンティティタイプを指定するための上書き可能なメソッド。基本実装では、上書きされない場合、すべてのエンティティタイプに対して false が返されます。
| 名前 | タイプ | 説明 |
|---|---|---|
| contextType | 文字列 | 子エンティティタイプを表すエンティティ JSON のアレイプロパティのキー名。例:「lineItems」、「characteristics」、「coveredProducts」。 |
| タイプ | 説明 |
|---|---|
| ブーリアン | このタイプのエンティティをソースからターゲットに結合できるかどうかを示すフラグ。 有効な値:
デフォルト値:false |
次の例は、 canMergeEntity() を上書きして、品目と対象製品の結合を有効にする方法を示しています。
var MyConsolidationService = Class.create();
MyConsolidationService.prototype = Object.extendsObject(sn_l2c_core.ConsolidationService, {
enableConsolidation: function() {
return true;
},
canMergeEntity: function(contextType) {
return contextType == "lineItems" || contextType == "coveredProducts";
},
type: 'MyConsolidationService'
});
var service = new MyConsolidationService();
gs.info("Can merge lineItems = " + service.canMergeEntity("lineItems"));
gs.info("Can merge characteristics = " + service.canMergeEntity("characteristics"));
Can merge lineItems = true
Can merge characteristics = falseConsolidationService - consolidate(オブジェクト sourceJSON, オブジェクト targetJSON, オブジェクト additionalParams)
ソースエンティティ JSON をターゲットエンティティ JSON に結合し、ハッシュベースのグループ化とペアワイズ統合ロジックに基づいて、結合された結果内の子エンティティを統合します。
consolidate() メソッドは、JSON を統合するための主要なエントリーポイントとして機能します。このメソッドは、 items アレイを介して、単一の JSON と複数の JSON の両方をソース入力として処理します。
| 名前 | タイプ | 説明 |
|---|---|---|
| additionalParams | オブジェクト | オプション。統合メソッドに渡される追加の設定パラメーター。このインスタンスに this.additionalParams として格納され、すべての上書き可能なメソッドでアクセスできます。実装クラスが必要とするカスタムのキーと値のペアを含めることができます。 |
| ソース JSON | オブジェクト | LeadtoCashCore - スコープ対象 createInstance() メソッドまたは effect() メソッドの JSON 出力を受け取ります。単一のエンティティ JSON オブジェクトにすることも、複数のエンティティ JSON のアイテムアレイを含む JSON オブジェクトにすることもできます。 sourceJSON に items 配列が含まれていない場合、メソッドはそれを単一のエンティティとして扱い、自動的に配列にラップします。ターゲット統合のみが必要な場合は、null を渡すか、このパラメーターを省略します。 |
| sourceJSON.items | オブジェクトのアレイ | オプション。ターゲットに結合するエンティティ JSON のアレイ。各アイテムは、その属性と子アレイを持つエンティティを表します。このプロパティが存在する場合、 items ソースエンティティのリストとして直接使用されます。 |
| sourceJSON.items.attributes | オブジェクト | エンティティ属性を表すキーと値のペア。各属性は値プロパティを持つオブジェクトです。例: |
| sourceJSON.items.attributes.end_date | 文字列 | 属性の終了日。 形式:GlideDate 値 (例:2026-01-01) |
| sourceJSON.items.attributes.product_offering | 文字列 | 属性に関連付けられた製品オファリングの名前。製品オファリング [sn_prd_pm_product_offering] テーブルにあります。 |
| sourceJSON.items.attributes.quantity | 文字列 | 属性を基準にして購入された製品アイテムの数。 |
| sourceJSON.items.attributes.start_date | 文字列 | 属性の開始日。 形式:GlideDate 値 (例:2026-01-01) |
| sourceJSON.items.characteristics | オブジェクトのアレイ | オプション。特性エンティティ JSON のアレイ。 |
| sourceJSON.items.characteristics.attributes | オブジェクト | アイテム特性に関連付けられた属性。各子プロパティは、属性を表すキーと値のペアです。属性は値プロパティを持つオブジェクトです。 |
| sourceJSON.items.characteristics.attributes.characteristic | オブジェクト | 属性に関連付けられた特性を表すキーと値のペア。 characteristic は値プロパティを持つオブジェクトです。 |
| sourceJSON.items.characteristics.attributes.value | オブジェクト | 親特性に関連付けられた属性値を表すキーと値のペア。 value は値プロパティを持つオブジェクトです。 |
| sourceJSON.items.characteristics.sys_id | 文字列 | アイテムに関連付けられた特性のSys_id。 |
| sourceJSON.items.characteristics.table | 文字列 | アイテムに関連付けられた特性のテーブルの場所。 |
| sourceJSON.items.coveredProducts | オブジェクトのアレイ | オプション。対象製品エンティティ JSON のアレイ。 |
| sourceJSON.items.coveredProducts.sys_id | オブジェクト | 対象製品レコードのSys_id。 |
| sourceJSON.items.coveredProducts.table | 文字列 | 対象製品レコードを含むテーブル名。たとえば、 sn_install_base_m2m_contract_sold_product などです。 |
| sourceJSON.items.coveredProducts.attributes | オブジェクト | 対象製品の属性。フィールドはレコードによって異なる場合があります。 |
| sourceJSON.items.coveredProducts.attributes.sold_product | オブジェクト | この対象製品に関連付けられた販売済み製品レコード。 |
| sourceJSON.items.coveredProducts.attributes.contract | オブジェクト | 補償が定義されている親契約レコード。 |
| sourceJSON.items.coveredProducts.attributes.service_contract_line | オブジェクト | この対象製品にリンクされた特定のサービス契約品目。 |
| sourceJSON.items.coveredProducts.attributes.entitlement | オブジェクト | 補償条件を規定するエンタイトルメントレコード。 |
| sourceJSON.items.coveredProducts.attributes.install_base | オブジェクト | 展開された資産を表すインストールベースレコード。 |
| sourceJSON.items.coveredProducts.attributes.covering_sold_product | オブジェクト | このエントリの対象となる販売済み製品。 |
| sourceJSON.items.coveredProducts.attributes.date_added | オブジェクト | 製品がいつ補償に追加されたかを示す ISO 8601 日付文字列。 |
| sourceJSON.items.coveredProducts.attributes.date_removed | オブジェクト | 製品がいつ補償から除外されたかを示す ISO 8601 日付文字列。現在アクティブな場合は null または空です。 |
| sourceJSON.items.lineItems | オブジェクトのアレイ | オプション。子品目エンティティ JSON のアレイ。各子は同じ構造 (sys_id、テーブル、属性、およびネストされた子) に従います。 |
| sourceJSON.items.lineItems.attributes | オブジェクト | エンティティ属性を表すキーと値のペア。各属性は値プロパティを持つオブジェクトです。sourceJSON.items.attributesと同じ構造に従います。 |
| sourceJSON.items.lineItems.characteristic | オブジェクト | 品目の特性を表すキーと値のペア。特性は値プロパティを持つオブジェクトです。sourceJSON.items.characteristicsと同じ構造に従います。 |
| sourceJSON.items.lineItems.coveredProducts | 品目に関連付けられた対象製品エンティティ JSON のアレイ。sourceJSON.items.coveredProductsと同じ構造に従います。 |
|
| sourceJSON.items.lineItems.sys_id | エンティティ JSON 品目のSys_id。 | |
| sourceJSON.items.lineItems.table | エンティティ JSON 品目のテーブルの場所。 | |
| sourceJSON.items.sys_id | 文字列 | ソースエンティティレコードのSys_id。 |
| sourceJSON.items.table | 文字列 | ソースエンティティのテーブル名。例: sn_pss_core_service_contract_line。 |
| targetJSON | オブジェクト | 必須。ソース JSON を統合するターゲットエンティティ JSON。null または空にすることはできません。ソースエンティティと同じオブジェクト構造に従います (sourceJSON パラメーター)。 |
| targetJSON.attributes | オブジェクト | ターゲットエンティティ属性を表すキーと値のペア。各属性は値プロパティを持つオブジェクトです。ソース属性 (sourceJSON.items.attributes パラメーター) と同じオブジェクト構造に従います。例: |
| targetJSON.lineItems | オブジェクトのアレイ | オプション。ターゲット上の子品目エンティティ JSON のアレイ。sourceJSON.items.lineItemsと同じオブジェクト構造に従います。 |
| targetJSON.lineItems.attributes | オブジェクト | エンティティ属性を表すキーと値のペア。各属性は値プロパティを持つオブジェクトです。sourceJSON.items.attributesと同じ構造に従います。 |
| targetJSON.lineItems.characteristics | オブジェクト | 品目の特性を表すキーと値のペア。特性は値プロパティを持つオブジェクトです。sourceJSON.items.characteristicsと同じ構造に従います。 |
| targetJSON.lineItems.coveredProducts | 品目に関連付けられた対象製品エンティティ JSON のアレイ。sourceJSON.items.coveredProductsと同じ構造に従います。 |
|
| targetJSON.lineItems.sys_id | エンティティ JSON 品目のSys_id。 | |
| targetJSON.lineItems.table | エンティティ JSON 品目のテーブルの場所。 | |
| targetJSON.sys_id | 文字列 | ターゲットエンティティレコードのSys_id。 |
| targetJSON.table | 文字列 | ターゲットエンティティのテーブル名。例: sn_pss_core_service_contract |
| タイプ | 説明 |
|---|---|
| オブジェクト | 統合された JSON 結果。結合および統合されたエンティティ JSON には、ターゲットおよび結合/統合された子アレイのすべての属性が含まれています。 統合が無効になっている場合、または sourceJSON が無効な場合は、targetJSON を返します。 targetJSON が null または空の場合は null を返します。 |
次の例は、LeadToCashService を介して統合メソッドを呼び出す方法を示しています。品目を含むソースエンティティ JSON をターゲットエンティティ JSON に統合します。同じ製品オファリングを持つ品目が統合されます。
LeadToCashService を直接インスタンス化しますが、本番環境での使用では、カスタムサブクラスを拡張ポイントを介して登録し、PrimitiveUtil を介して呼び出す必要があります。var sourceToTargetConfigID = "sn_cont_ent_wf_contract_to_quote";
var util = new sn_l2c_core.LeadToCashService(sourceToTargetConfigID);
var sourceJSON = {
"items": [{
"sys_id": "a1b2c3d4e5f6",
"table": "sn_pss_core_service_contract_line",
"attributes": {
"product_offering": {
"value": "po_001"
},
"quantity": {
"value": "5"
},
"start_date": {
"value": "2026-01-01"
},
"end_date": {
"value": "2026-12-31"
}
},
"characteristics": [{
"sys_id": "ch_001",
"table": "sn_pss_core_entitlement_characteristic",
"attributes": {
"characteristic": {
"value": "speed"
},
"value": {
"value": "100mbps"
}
}
}],
"coveredProducts": []
}]
};
var targetJSON = {
"sys_id": "t1a2b3c4d5e6",
"table": "sn_quote_mgmt_core_quote",
"attributes": {
"account": {
"value": "acct_001"
}
},
"lineItems": [{
"sys_id": "li_001",
"table": "sn_quote_mgmt_core_quote_line_item",
"attributes": {
"product_offering": {
"value": "po_001"
},
"quantity": {
"value": "3"
},
"start_date": {
"value": "2026-03-01"
},
"end_date": {
"value": "2026-11-30"
}
},
"characteristics": [{
"sys_id": "ch_002",
"table": "sn_pss_core_entitlement_characteristic",
"attributes": {
"characteristic": {
"value": "speed"
},
"value": {
"value": "100mbps"
}
}
}],
"coveredProducts": []
}]
};
var additionalParams = {};
var output = util.consolidate(sourceJSON, targetJSON, additionalParams);
gs.info("Consolidated output = " + JSON.stringify(output));
出力:
{
"sys_id": "t1a2b3c4d5e6",
"table": "sn_quote_mgmt_core_quote",
"attributes": {
"account": {
"value": "acct_001"
}
},
"lineItems": [
{
"sys_id": "li_001",
"table": "sn_quote_mgmt_core_quote_line_item",
"attributes": {
"product_offering": {
"value": "po_001"
},
"quantity": {
"value": "8"
},
"start_date": {
"value": "2026-01-01"
},
"end_date": {
"value": "2026-12-31"
}
},
"characteristics": [
{
"sys_id": "ch_002",
"table": "sn_pss_core_entitlement_characteristic",
"attributes": {
"characteristic": {
"value": "speed"
},
"value": {
"value": "100mbps"
}
}
}
],
"coveredProducts": []
}
]
}
次の例は、null sourceJSON を使用して consolidate メソッドを呼び出す方法を示しています。この場合、targetJSON 内の子エンティティのみが統合されます。これは、結合する必要がある重複品目がターゲットに既に含まれている場合に便利です。
var sourceToTargetConfigID = "sn_cont_ent_wf_contract_to_quote";
var util = new sn_l2c_core.LeadToCashService(sourceToTargetConfigID);
var targetJSON = {
"sys_id": "t1a2b3c4d5e6",
"table": "sn_quote_mgmt_core_quote",
"attributes": {
"account": {
"value": "acct_001"
}
},
"lineItems": [{
"sys_id": "li_001",
"table": "sn_quote_mgmt_core_quote_line_item",
"attributes": {
"product_offering": {
"value": "po_001"
},
"quantity": {
"value": "5"
}
},
"characteristics": [],
"coveredProducts": []
},
{
"sys_id": "li_002",
"table": "sn_quote_mgmt_core_quote_line_item",
"attributes": {
"product_offering": {
"value": "po_001"
},
"quantity": {
"value": "3"
}
},
"characteristics": [],
"coveredProducts": []
}
]
};
var output = util.consolidate(null, targetJSON, {});
gs.info("Consolidated output = " + JSON.stringify(output));
出力:
{
"sys_id": "t1a2b3c4d5e6",
"table": "sn_quote_mgmt_core_quote",
"attributes": {
"account": {
"value": "acct_001"
}
},
"lineItems": [
{
"sys_id": "li_001",
"table": "sn_quote_mgmt_core_quote_line_item",
"attributes": {
"product_offering": {
"value": "po_001"
},
"quantity": {
"value": "8"
}
},
"characteristics": [],
"coveredProducts": []
}
]
}
ConsolidationService:enableConsolidation()
このサービスインスタンスに対して統合を有効にするかどうかを制御する上書き可能なメソッド。基本実装は、上書きされない場合に false を返します。統合を有効にするには、実装クラスでこのメソッドをオーバーライドして true を返す必要があります。
| 名前 | タイプ | 説明 |
|---|---|---|
| なし |
| タイプ | 説明 |
|---|---|
| ブール | サービスが統合を正常に有効にしたかどうかを示すフラグ。 有効な値:
デフォルト値:false |
var MyConsolidationService = Class.create();
MyConsolidationService.prototype = Object.extendsObject(sn_l2c_core.ConsolidationService, {
enableConsolidation: function() {
return true;
},
type: 'MyConsolidationService'
});
var service = new MyConsolidationService();
var isEnabled = service.enableConsolidation();
gs.info("Consolidation enabled = " + isEnabled);
Consolidation enabled = true統合サービス:getHashConfig()
連結前にエンティティをグループ化するためのハッシュ構成を返す上書き可能なメソッド。この設定では、各エンティティの MD5 ハッシュを生成する属性と子コンテキストタイプを指定します。同じハッシュを持つエンティティは、ペアごとの統合のためにグループ化されます。基本実装は、上書きされていない場合、空のオブジェクトを返します。
| 名前 | タイプ | 説明 |
|---|---|---|
| なし |
| タイプ | 説明 |
|---|---|
| オブジェクト | テーブル名をハッシュ構成にマッピングする JSON オブジェクト。各テーブルエントリには次のものが含まれます。
想定される戻り値の形式: テーブルのハッシュ構成が空のオブジェクト テーブルのハッシュ構成が見つからない場合 (未定義または null)、エラーがログに記録され、エンティティは変更されずに返されます。基本実装は、上書きされていない場合、空のオブジェクトを返します。 |
次の例は、 getHashConfig() を上書きして、契約品目とエンタイトルメント特性のハッシュ属性を定義する方法を示しています。
var MyConsolidationService = Class.create();
MyConsolidationService.prototype = Object.extendsObject(sn_l2c_core.ConsolidationService, {
enableConsolidation: function() {
return true;
},
getHashConfig: function() {
return {
"sn_quote_mgmt_core_quote_line_item": {
"attributes": ["product_offering"],
"childContextTypes": ["sn_pss_core_entitlement_characteristic"]
},
"sn_pss_core_entitlement_characteristic": {
"attributes": ["characteristic", "option", "value"]
},
"sn_pss_core_covered_product": {
"attributes": ["sold_product"]
}
};
},
type: 'MyConsolidationService'
});
var service = new MyConsolidationService();
var config = service.getHashConfig();
gs.info("Hash config = " + JSON.stringify(config));
Hash config = {
"sn_quote_mgmt_core_quote_line_item": {
"attributes": ["product_offering"],
"childContextTypes": ["sn_pss_core_entitlement_characteristic"]
},
"sn_pss_core_entitlement_characteristic": {
"attributes": ["characteristic", "option", "value"]
},
"sn_pss_core_covered_product": {
"attributes": ["sold_product"]
}
}ConsolidationService:getPrimary(オブジェクト json1, オブジェクト json2)
2 つの JSON が統合されているときにプライマリ JSON を決定する上書き可能なメソッド。上書きされていない属性の場合、プライマリ JSON の属性値が統合結果で使用されます。基本実装では、上書きされていない場合は json1 が返されます。
| 名前 | タイプ | 説明 |
|---|---|---|
| json1 | オブジェクト | 統合する最初のエンティティ JSON。sys_id、テーブル、属性、および子アレイが含まれます。 |
| json2 | オブジェクト | 統合する 2 番目のエンティティ JSON。sys_id、テーブル、属性、および子アレイが含まれます。 |
| タイプ | 説明 |
|---|---|
| オブジェクト | 選択したプライマリ JSON。この JSON の属性が、統合結果のデフォルト値になります。json1 または json2 のいずれかである必要があります。基本実装では、上書きされていない場合は json1 が返されます。 |
次の例は、 getPrimary() を上書きして、開始日が早いエンティティをプライマリとして選択する方法を示しています。
// Custom ConsolidationService with getPrimary override
var MyConsolidationService = Class.create();
MyConsolidationService.prototype = Object.extendsObject(sn_l2c_core.ConsolidationService, {
enableConsolidation: function() {
return true;
},
getPrimary: function(json1, json2) {
var date1 = json1.attributes.start_date ? json1.attributes.start_date.value : "";
var date2 = json2.attributes.start_date ? json2.attributes.start_date.value : "";
return date1 <= date2 ? json1 : json2;
},
type: 'MyConsolidationService'
});
// json1 — earlier start date
var json1 = {
sys_id: { value: "a1b2c3d4e5f6" },
table: "sn_pss_core_service_contract_line",
attributes: {
product_offering: { value: "po_abc123" },
quantity: { value: "5" },
start_date: { value: "2024-01-01" }
}
};
// json2 — later start date
var json2 = {
sys_id: { value: "f6e5d4c3b2a1" },
table: "sn_pss_core_service_contract_line",
attributes: {
product_offering: { value: "po_abc123" },
quantity: { value: "3" },
start_date: { value: "2024-06-01" }
}
};
var result = new MyConsolidationService().getPrimary(json1, json2);
出力:
// result === json1 → true
// "2024-01-01" <= "2024-06-01" is true, so json1 (earlier start date) is returned
{
sys_id: { value: "a1b2c3d4e5f6" },
table: "sn_pss_core_service_contract_line",
attributes: {
product_offering: { value: "po_abc123" },
quantity: { value: "5" },
start_date: { value: "2024-01-01" }
}
}
ConsolidationService:overrideAttributeValues(Object json1, Object json2, Object consolidatedJSON)
統合 JSON の属性を更新するために、2 つの JSON が統合された後に呼び出される上書き可能なメソッド。基本実装は、上書きされなければ操作されません。
一般的なユースケースには、数量の合計、日付範囲の計算 (最も早い開始/最も遅い終了)、期間の再計算、consolidated_fromの追跡などがあります。
| 名前 | タイプ | 説明 |
|---|---|---|
| json1 | オブジェクト | 統合された最初のエンティティ JSON。これはプライマリ JSON です ( getPrimary() で決定)。連結前の元の属性が含まれています。 |
| json2 | オブジェクト | 統合された 2 番目のエンティティ JSON。これはセカンダリ JSON です。連結前の元の属性が含まれています。 |
| 統合済み JSON | オブジェクト | 結合後の結果 JSON このオブジェクトの属性を直接変更して、カスタムロジックを適用します。最初は、結合された子アレイを含むプライマリ JSON の属性のディープコピーが含まれています。 |
| タイプ | 説明 |
|---|---|
| なし | このメソッドは値を返しません。consolidatedJSONオブジェクトを直接変更します。 |
var MyConsolidationService = Class.create();
MyConsolidationService.prototype = Object.extendsObject(sn_l2c_core.ConsolidationService, {
enableConsolidation: function() {
return true;
},
overrideAttributeValues: function(json1, json2, consolidatedJSON) {
// Sum quantities from both entities; fall back to 0 if quantity has no value
var qty1 = parseInt(json1.attributes.quantity ? json1.attributes.quantity.value : "0");
var qty2 = parseInt(json2.attributes.quantity ? json2.attributes.quantity.value : "0");
consolidatedJSON.attributes.quantity = {
"value": String(qty1 + qty2)
};
// Use the earliest start date; fall back to empty string if start_date has no value
var start1 = json1.attributes.start_date ? json1.attributes.start_date.value : "";
var start2 = json2.attributes.start_date ? json2.attributes.start_date.value : "";
consolidatedJSON.attributes.start_date = {
"value": start1 <= start2 ? start1 : start2
};
// Use the latest end date; fall back to empty string if end_date has no value
var end1 = json1.attributes.end_date ? json1.attributes.end_date.value : "";
var end2 = json2.attributes.end_date ? json2.attributes.end_date.value : "";
consolidatedJSON.attributes.end_date = {
"value": end1 >= end2 ? end1 : end2
};
// Record the sys_ids of the source entities that were merged into this consolidated result
var consolidatedFrom = [];
if (json1.sys_id) consolidatedFrom.push(json1.sys_id);
if (json2.sys_id) consolidatedFrom.push(json2.sys_id);
consolidatedJSON.attributes.consolidated_from = {
"value": consolidatedFrom.join(",")
};
},
type: 'MyConsolidationService'
});ConsolidationService:postHierarchyConsolidation(オブジェクト consolidatedJSON)
階層の統合が完了した後に統合された JSON に最終的な変更を適用する上書き可能なメソッド。基本実装は、上書きされなければ操作されません。
システムは、 consolidate() メソッドの最終的な統合結果と、 processHashGroup() 内の各結果エンティティでこのメソッドを呼び出します。
| 名前 | タイプ | 説明 |
|---|---|---|
| 統合済み JSON | オブジェクト | すべての結合と統合が完了した後、完全に処理された統合 JSON オブジェクト。このオブジェクトを直接変更して、最終的な変換を適用します。 |
| タイプ | 説明 |
|---|---|
| なし | このメソッドは値を返しません。consolidatedJSONオブジェクトを直接変更します。 |
次の例は、 postHierarchyConsolidation() をオーバーライドして、統合エンティティにフラグを設定する方法を示しています。
var MyConsolidationService = Class.create();
MyConsolidationService.prototype = Object.extendsObject(sn_l2c_core.ConsolidationService, {
enableConsolidation: function() {
return true;
},
postHierarchyConsolidation: function(consolidatedJSON) {
if (consolidatedJSON && consolidatedJSON.attributes) {
consolidatedJSON.attributes.is_consolidated = {
"value": "true"
};
}
},
type: 'MyConsolidationService'
});
ConsolidationService - preProcess(オブジェクト sourceJSON, オブジェクト targetJSON, オブジェクト additionalParams)
一括マップ作成やルックアップデータのキャッシュなどのカスタム前処理タスクを実行するために、結合と統合の前に呼び出される上書き可能なメソッド。
計算結果を この オブジェクトに保存します ( 例:this.targetHeaderId = "sample_sys_id")。このメソッドは値を返しません。
| 名前 | タイプ | 説明 |
|---|---|---|
| ソースターゲット | オブジェクト | 統合する sourceJSON の出力。LeadtoCashCore - スコープ対象 createInstance() メソッドまたは effect() メソッドの JSON 出力を受け取ります。単一のエンティティ JSON オブジェクトにすることも、複数のエンティティ JSON のアイテムアレイを含む JSON オブジェクトにすることもできます。null または空にすることができます。 |
| targetJSON | オブジェクト | 必須。統合用のターゲットエンティティ JSON。 |
| additionalParams | オブジェクト | オプション。発信者から渡された追加データ。 |
| タイプ | 説明 |
|---|---|
| なし | このメソッドは値を返しません。後続の統合ステップで使用するために、 この オブジェクトの計算結果を保存します。 |
次の例は、 preProcess() をオーバーライドして、統合中に使用するターゲットヘッダー ID をキャッシュする方法を示しています。
var MyConsolidationService = Class.create();
MyConsolidationService.prototype = Object.extendsObject(sn_l2c_core.ConsolidationService, {
enableConsolidation: function() {
return true;
},
preProcess: function(sourceJSON, targetJSON, additionalParams) {
// Cache the target entity's sys_id for use in subsequent consolidation steps
this.targetHeaderId = targetJSON.sys_id;
// If sourceJSON and sourceJSON.items are both present, store the item count; otherwise default to 0
this.sourceCount = sourceJSON && sourceJSON.items ? sourceJSON.items.length : 0;
},
type: 'MyConsolidationService'
});