IBM TechXchange Japan Business Automation User Group

 View Only

IBM Process MiningのProcess Application Builderを使い、SalesforceのProcess Applicationを作成する

By HIDEO SAITOH posted Mon July 10, 2023 02:59 AM

  

IBM Process MiningのProcess Application Builderを使い、SalesforceのProcess Applicationを作成する

Process Applicationとは

Process ApplicationはIBM Process Mining 1.14に追加された新しい機能です。

Process Applicationは、特定のプロセス・マイニングのシナリオをカバーするための機能になります。

特定のプロセス・マイニングのシナリオをカバーするための機能には以下が含まれます。

  1. データの取得
  2. データの変換
  3. 分析ダッシュボード

たとえば、「Procure to Pay」Process Applicationでは、、SAP ERPから取得したデータを変換して、SAPに実装されている企業の調達プロセスから洞察を得ることを提供しています。

Process Applicationには、ビジネス・アナリストが特定のユースケースに関する洞察を得るために、必要な重要な要素である定義済みのダッシュボードも付属しています。

Process Application Builderとは

Process Application Builderは、特定のプロセス・マイニングのシナリオをカバーするために必要な要素を提供することで、独自のProcess Applicationを作成する機能です。データの取得と変換をPythonスクリプトとして提供する必要があります。

SalesforceのOpportunityと時刻に沿った過去の変化を取り込むProcess Applicationを作成する

シナリオとしては、下記の図のように、SalesforceのOpportunityのテーブルと、OpportunityFieldHistoryのテーブルからデータを抽出して、IBM Process Miningに取り込むProcess Applicatonの作成と、Process Applicationを使って、Opportunityのデータを取り込んだプロジェクトを作成する。

Process Application Builder作成に必要なこと

上記の絵を実現するために必要なものは以下になります。

  1. Salesforceの接続アプリケーションを作成して、Consumer Key,Consumer Secretを作成
  2. SalesforceのOpportunityに対する変更履歴を追跡できるように、商談項目履歴を有効化し、取得する項目にチェックを入れる
  3. Salesforceから、必要なデータを抽出するためのPythonスクリプト
    SalesforceのREST APIを使い、OpportunityテーブルとOpportunityFieldHistoryテーブルからデータを抽出する
  4. プロジェクト・バックアップファイル
    プロセス・マイニングでは、プロセスID,アクティビティ,開始時間,リソース,ロールの情報をログデータと突き合わせてマッピングすることで可視化されます。プロジェクトバックアップファイルには、上記のマッピング情報が含まれるため必要。仮のプロジェクトを作成して、Python Scriptが生成したのと同じカラムを持つCSVファイルを使って、作成することができます

1と2の具体的な手順は、こちらを参照してください。

Salesforceから、必要なデータを抽出するためのPythonスクリプト

下記のコードがSalesforceのSOQLを使い、REST API経由でデータを取得します。

import requests
import json
import pandas as pd
from requests.models import PreparedRequest
from process_app import ProcessAppException

def execute(context):
	# reading data from accelerator config
	config = context["config"]
	consumerKey = config["consumerKey"]
	secret = config["consumerSecret"]
	username = config["username"]
	password = config["password"]

	if consumerKey =='' or secret =='' or username =='' or password =='':
		raise ProcessAppException('configuration not valid')
	
	# login to salesforce
	loginParams = {'client_id': consumerKey,'client_secret': secret, 'grant_type': 'password','username':username, 'password':password}
	req = PreparedRequest()
	req.prepare_url('https://login.salesforce.com/services/oauth2/token', loginParams)

	loginResponse = requests.post(req.url)
	if loginResponse.status_code != 200 :
		raise ProcessAppException('cannot log to salesforce account')
	data = loginResponse.json()
	accessToken = data.get('access_token')
	instanceUrl = data.get('instance_url')
	
	events = []

	importOpportunityCreation(accessToken, instanceUrl, events)
	importOpportunityChange(accessToken, instanceUrl, events)
	df = pd.DataFrame(events,columns= ['opportunityId', 'activity', 'startTime', 'resource', 'opportunityAmount', 'opportunityStage'])
	return df
 
def runSOQLQuery(query, accessToken, instanceUrl, nextRecordsUrl=None):
	req = PreparedRequest()
	if nextRecordsUrl != None:
		req.prepare_url(instanceUrl+nextRecordsUrl, {} )
	else:
		req.prepare_url(instanceUrl+'/services/data/v57.0/query/', {'q' : query})
	queryResponse = requests.get(req.url, headers={'Authorization': 'Bearer ' + accessToken})
	if queryResponse.status_code != 200 :
		raise Exception('cannot perform SOQL query to salesforce account')
	return queryResponse.json()

def formatDate(date):
	return date[0: date.find('.')].replace('T', ' ')

def importOpportunityCreation(accessToken, instanceUrl, events, nextRecordsUrl=None):
	queryResults = runSOQLQuery('Select Id, Amount, StageName, CreatedBy.Name, CreatedDate from Opportunity ', accessToken, instanceUrl, nextRecordsUrl)
	records = queryResults.get('records')
	for record in records:
		resource = record.get('CreatedBy').get('Name')
		createDate = formatDate(record.get('CreatedDate'))
		amount = record.get('Amount')
		events.append([ record.get('Id'), 'Create Opportunity', createDate, resource, '0' if 'null' == amount else amount, record.get('StageName') ])

	if queryResults.get('nextRecordsUrl') != None :
		importOpportunityCreation(accessToken, instanceUrl, events , queryResults.get('nextRecordsUrl'))

def importOpportunityChange(accessToken, instanceUrl, events, nextRecordsUrl=None):
	queryResults = runSOQLQuery('Select OpportunityId, CreatedBy.Name, CreatedDate, Field, NewValue, OldValue from OpportunityFieldHistory', accessToken, instanceUrl, nextRecordsUrl)

	records = queryResults.get('records')
	for record in records:
		resource = record.get('CreatedBy').get('Name')
		opportunityId = record.get('OpportunityId')
		createDate = formatDate(record.get('CreatedDate'))
		field_ = record.get('Field')

		if 'StageName' == field_:
			activity='Set Opportunity to ' + record.get('NewValue')
			events.append([ opportunityId, activity, createDate, resource, 0, '' ])
		elif 'Owner' == field_:
			activity='Change opportunity Owner'
			events.append([ opportunityId, activity, createDate, resource, 0, '' ])
		elif 'AccountId' == field_:
			activity = 'Change opportunity Account'
			events.append([ opportunityId, activity, createDate, resource, 0, '' ])
		elif 'Amount' == field_:
			activity= 'Change opportunity Amount'
			events.append([ opportunityId, activity, createDate, resource, 0, '' ])

	#events.append([ opportunityId, activity, createDate, resource, 0, '' ])

	if queryResults.get('nextRecordsUrl') != None :
		importOpportunityChange(accessToken, instanceUrl, events, queryResults.get('nextRecordsUrl'))

プロジェクト・バックアップファイル

プロジェクト・バックアップファイルを作成するには、opportunityId.csvというファイル名で下記内容のファイルを作成します。

'opportunityId', 'activity', 'startTime', 'resource', 'opportunityAmount', 'opportunityStage'
1,create,2005-10-08 01:02:03,aaa,100,create

dummyのプロセス・マイニングのプロジェクトを作って、上記のCSVファイルをデータとしてuploadしたうえで、プロジェクトのバックアップを取得します。

opportunityId.csvファイルをUploadします。

データ項目をマッピングします。

時刻形式は、事前に検出されているため、そのまま次に進みます。

カスタム構成もそのままで、プロセスの作成ボタンをクリックします。

次に、プロジェクト・バックアップを取得します。

管理タブを開き、バックアップ&履歴をクリックし、新規バックアップの作成をクリックします。

新規バックアップの作成では、名称として、「sfdcdummy」と入力して、バックアップを作成します。

バックアップが作成できたら、ダウンロードしておきます。

Process Application Builderの作成の手順

Process Application Builderの作成は、下記のような手順で行っていきます。

Process Application Builderを使って、Process Applicationを新規に作成する

Process Applicationの作成は、Process Appのアイコンをクリックして作成を始めます。

Process Appの作成のボタンをクリックして、Process Appの作成が開始されます。

サマリー・カードでは、名前と要旨が入力できますが、名前に「Salesforce」と入力します。

事前に作成したPhtyonスクリプトをアップロードします。

正常にUploadされ、Salesforce.pyがUploadされたことがわかります。

ユーザー入力の定義では、必要な入力フィールドを設定していきます。Pythonコードの変数に合わせておきます。

すべての項目は、必須項目と設定します。

  1. uesrname
    ラベル: username  変数名: username  入力タイプ: ストリング
  2. password
    ラベル: password  変数名: password  入力タイプ: パスワード
  3. consumerKey
    ラベル: consumerKey  変数名: consumerKey  入力タイプ: ストリング
  4. consumerSecret
    ラベル: consumerSecret  変数名: consumerSecret  入力タイプ: ストリング

ユーザーガイダンスの提供では、ユーザーがProcess Applicationの作成をナビゲートするガイドを情報として入力します。

プロセス設定では、プロジェクト・バックアップファイルをUploadします。

Uploadが成功すると、.idpファイルがUploadされたことがわかります。

Process Applicationを使って、Salesforceのデータを取り込んでみる

作成された、SalesforceのProcess Applicationを始める。始めに->のところをクリックします。

プロセスの詳細では、名称として、「Salesforce Opportunity Management」と入力する。

ドキュメンテーションでは、内容を確認して、次に進みます。

イベントログの構成では、必要項目(すべて必須項目なので、すべてを入力)を入力します。

プロセスの生成では、しばらく時間がかかりますが、終了するまで待ちます。

正常に終了すると、下記のような画面に変わります。

完了ボタンをクリックすると、プロセス・モデル図に画面が遷移します。

下記のように、SalesforceのOpportunityの時系列での状態の遷移がプロセス・モデルとして可視化されました。

可視化されたプロセスでは、頻度、リワーク、時間などの分析や、シミュレーションなどIBM Process Miningの機能を使って様々な分析が可能になります。

まとめ

Process Application Builderを使って、Pythonコードを記述して、Salesforceから必要なデータを抽出するProcess Applicationを作りました。

Process Applicationを開始することで、Salesforceから必要なデータを自動で抽出・加工し、プロセス・モデルが自動的に可視化できることがわかりました。

データの抽出・加工は手間のかかる処理ですが、Process Applicationが自動的にデータの取得を行うことができるようになります。

#CloudPakforBusinessAutomation #IPM #ProcessApplication 


#ProcessMining
0 comments
19 views

Permalink