調査の配布

発行は、調査がエンドユーザによる完了準備が整っていることを示します。発行は、調査のプロパティと質問の編集を制限する調査をロックします。デフォルトのバッチを使用して調査が発行されると、以下の処理が行われます。

管理者は、配布ジョブの結果を含む zip ファイルをダウンロードできます。zip ファイルには CSV ファイルが 2 つ含まれます。1 つ目のファイルは、発行ジョブの詳細が表示された行を 1 つ含みます。2 つ目のファイルは、割り当て済みターゲットアカウントごとに 1 つの行を含みます。ターゲットアカウントが割り当てられていない場合、ファイルには割り当てが失敗した理由が含まれます。ターゲットアカウントの割り当てが想定されていない場合に、これを使って調査発行のトラブルシューティングを行います。

管理者は、進行中のジョブの中止または調査の再発行を実行することができます。ジョブを中止すると、調査のステータスは前のステータス (Development_vod または Published_vod) に戻ります。

[再発行] を選択すると、すべての調査対象について調査発行ジョブが再実行されます。調査のステータスは、ジョブの実行中に Publishing_vod になり、ジョブが完了すると Published_vod になります。

バッチを作成して、新しいバッチに設定をポイントすると、異なるロジックが適用されます。

発行が失敗しないようにするために、調査に含まれているユーザテリトリー内に存在し、かつ調査対象レコードに割り当てられる可能性があるすべてのユーザに、Survey_Target_vod オブジェクトの参照権限を付与してください。

調査を発行するための Veeva 設定

2 つの Veeva 設定は、調査の発行時に実行される発行バッチと、終了日が近づいている調査対象のアラートをエンドユーザに表示するタイミングを決定するためのものです。

  • Survey_Publish_Apex_vod - 調査を発行するときに実行される Apex クラス名が定義されます。空白の場合 (デフォルト設定)、デフォルトバッチの Veeva_Batch_Survey_Publish を指します。異なる発行バッチを使用するには、この設定にバッチ名を入力してください。
  • SURVEY_ALERT_THRESHOLD_vod - CRM for iPad のホームページで担当者へのアラートを表示するための調査対象の終了日までの日数を決定する値

VEEVA_BATCH_SURVEY_PUBLISH Apex クラスは、Survey_Publish_Apex_vod Veeva 設定で参照されるデフォルトバッチです。調査管理者が発行を選択すると、デフォルトバッチがトリガーされます。

MC エンジンの発行

調査自体から調査を発行するのに併せて、ユーザはマルチチャネルエンジン (MC エンジン) を使用しても調査を発行することができます。Veeva の MC エンジンを使うと、現在のジョブを 5 件以上同時に実行することができます。

Veeva の MC エンジンを使って調査を発行する方法:

  1. Survey_Publish_Apex_vod Veeva 設定に値「1」を入力します。
  2. 管理者ユーザに調査管理タブへのアクセス権を付与してください。
  3. インテグレーションユーザの認証情報を入力し検証します。インテグレーションユーザは、調査が発行された後、SFDC データベースにデータをライトバックするのに使用されます。
  4. インテグレーションユーザに、以下のオブジェクトに対して編集権限を付与します:
  • Survey_vod
  • Survey_Target_vod
  • Survey_Question_vod

MC エンジンを使用して調査を発行する場合、管理者に通知メールは送信されません。

発行タスクが並行して多すぎる場合、調査または調査対象のクエリを問い合わせる問題が表示されることを示すエラーメッセージが表示されます。

調査を新規ターゲットに発行する

調査が発行され編集がロックされても、新規調査対象は調査管理画面の対象セクションから追加できます。調査対象が追加されると、レコードステータスは Development_vod に代わり、新規ターゲット向けに発行ボタンが調査管理画面の上部に表示されます。このボタンを選択すると、調査が再発行され、バッチで新規調査対象レコードのみが処理されます。

調査用の保存ボタン

複数のエンドユーザに調査が発行されている場合、調査対象の実行画面から保存ボタンを削除して、調査送信前に別のエンドユーザの回答を誤って削除できないようにすることができます。ユーザは 1 回だけ調査対象を送信することができます。調査が送信されると、回答は編集できません。

保存ボタンを削除するには、適切な調査対象のレコードタイプに進み、ステータス選択リストに選択された値から Saved_vod ボタンを削除します。

調査の発行バッチのカスタマイズ

このセクションでは、カスタム発行ロジックを使用する方法のコード例を 2 つ挙げます。これらはあくまでも一例であり、ご利用の環境でのテストが必要です。

ロールに基づいてユーザに発行する

この例では、まず調査の Territory_vod フィールドを調べて、次に調査の custom Role_vod フィールドを調べることにより、ターゲットアカウントをユーザに割り当てます。組織に同じテリトリーノード内で複数のロールを持つユーザがいて、特定のロールを持つユーザのみに調査対象レコードを発行したい場合は、この方法を行ってください。調査管理者がロール制限を選択できるようにカスタム選択リストを作成し、この選択リストに組織内のロールをマッピングする値を設定する必要があります。

  1. init() メソッドでユーザロールオブジェクトのマップを作成します。

for (UserRole ur :[Select Id.Name from UserRole] )

{

roleIds.put(ur.Name.ur.Id);

}

  1. テリトリーフィールドに基づいてユーザを検索するために、カスタムフィールド名を Role_dk と想定した以下のコードスニペットにコード GetUsersForAccounts() メソッドを置換します。

//sample: ロール ID に基づいてユーザを検索

String roleName = surveyToUpdate.Role_dk__c;

Id roleId = roleIds.get(roleName);

System.debug('role id:'+ roleId);

Map<Id,User> activeuserids = null;

if(roleId != null)

activeuserids = new Map<Id,User>([Select Id From User Where Id In :alluserids And IsActive=true And userRoleId = :roleId]);

else

activeuserids = new Map<Id,User>([Select Id From User Where Id In :alluserids And IsActive=true]);

System.debug('activeuserids'+activeuserids);

for(string acctId : acctList)

{

List<String> userids = acct_userids.get(acctId);

if(userids != null && userids.size() > 0){

for(String id : userids)

{

if(activeuserids.keySet().contains(id))

{ acctUserMap.put(acctId,id); }

}

}

}

プロファイルに基づいてユーザに発行する

このコード例では、調査対象割り当てをユーザプロファイルによって制限します。このとき、調査対象レコードを割り当てる組織内のプロフィールの名前の値を Survey_vod のカスタムフィールドに正しくマッピングする必要があります。

調査ユーザが自身のターゲットアカウントを選択して新しい調査対象レコードを作成できる新規調査対象では、これらのカスタムフィールドを使用して調査に新しいターゲットアカウントを追加する機能は制限されません。この機能で制限できるのは、調査に選択された Territory_vod フィールドによってターゲットアカウントを追加できるユーザの範囲のみです。

  1. inti() メソッドのプロファイルオブジェクトにマップを作成します。

for (Profile ur:[Select Id.Name from Profile])

{

prfileIds.put(ur.Name.ur.Id);

}

 

  1. テリトリーフィールドに基づいてユーザを検索するために、カスタムフィールド名を Profile_dk と想定した以下のコードスニペットにコード GetUsersForAccounts() メソッドを置換します。

String profileName = surveyToUpdate.Profile_dk__c;

Id profileId = profileIds.get(profileName);

System.debug('profile id' + profileId);

Map<Id,User> activeuserids = null;

if(profileId!= null)

activeuserids = new Map<Id,User>([Select Id From User Where Id In :alluserids And IsActive=true And ProfileId= :profileId]);

else

activeuserids = new Map<Id,User>([Select Id From User Where Id In :alluserids And IsActive=true]);

for(string acctId : acctList)

{

List<String> userids = acct_userids.get(acctId);

if(userids != null && userids.size() > 0){

for(String id : userids)

{

if(activeuserids.keySet().contains(id)){ acctUserMap.put(acctId,id); }

}

}

}