DFP セールス マネージャのワークフロー

このガイドでは、ワークフロー リクエストの概要と、2 種類のワークフロー リクエストについて説明します。また、API で WorkflowApprovalRequest オブジェクトと WorkflowExternalConditionRequest オブジェクトを作成する方法も紹介します。

はじめに

DFP セールス マネージャのワークフローは、プロポーザルが販売確定となるために通過しなければならないルールの集まりです。たとえば、1,000 インプレッション以上を予約するすべてのプロポーザルは社内の担当者による承認を受ける、という決まりがある場合は、DFP セールス マネージャ管理画面で WorkflowRequest を定義して検証が行われるようにします。

WorkflowRequest には次の 2 種類があります。

  • WorkflowApprovalRequest オブジェクト: 管理画面ユーザーまたは API リクエストのいずれかによる承認アクションを受けて、ワークフローの次の項目に進むことができます。
  • WorkflowExternalConditionRequest オブジェクト: 外部システムの回答を保留状態で待機します。外部システムでは、DFP 外部で一定のロジックを実行し、ワークフローの次のアクションを呼び出すか省略するかを判定する必要があります。このタイプのリクエストは、サイト運営者のワークフローが複雑すぎてシステム内のルールだけでは定義できない場合に使用します。
ワークフローは RateCard オブジェクトと関連付けられ、該当のレート表を使用しているすべてのプロポーザルにそのワークフローのルールが適用されます。

ワークフロー リクエストを取得する

通常、ワークフロー リクエストを操作するときには、1 つのプロポーザルに含まれる特定のワークフロー リクエストを取得してそれらの検証を行います。ワークフローには、承認タイプと外部条件タイプの両方のリクエストが含まれている場合があるため、type をクエリ ステートメントに渡す必要があります。

プロポーザルで保留中となっているワークフロー外部条件リクエストをすべて表示するには、次のように WorkflowRequestServiceInterface をインスタンス化します。

Java

  // Get the WorkflowRequestService.
  WorkflowRequestServiceInterface workflowRequestService =
      dfpServices.get(session, WorkflowRequestServiceInterface.class);
    

ワークフロー承認リクエストの場合は、「WORKFLOW_APPROVAL_REQUEST」タイプ、エンティティ タイプ「PROPOSAL」という条件に加え、approvalStatus が「PENDING_APPROVAL」となっているプロポーザルの ID を条件にしてフィルタリングします。

Java

  // Create a statement to select workflow approval requests for a proposal.
  StatementBuilder statementBuilder = new StatementBuilder()
      .where("WHERE entityId = :entityId and entityType = :entityType "
          + "and type = :type and approvalStatus = :approvalStatus")
      .orderBy("id ASC")
      .limit(StatementBuilder.SUGGESTED_PAGE_LIMIT)
      .withBindVariableValue("entityId", proposalId)
      .withBindVariableValue("entityType", WorkflowEntityType.PROPOSAL.toString())
      .withBindVariableValue("approvalStatus",
          WorkflowApprovalRequestStatus.PENDING_APPROVAL.toString())
      .withBindVariableValue("type", WorkflowRequestType.WORKFLOW_APPROVAL_REQUEST.toString());
    

ワークフロー外部条件リクエストの場合は、「WORKFLOW_EXTERNAL_CONDITION_REQUEST」タイプ、エンティティ タイプ「PROPOSAL」という条件に加え、conditionStatus が「PENDING」となっているプロポーザルの ID を条件にしてフィルタリングします。

Java

  // Create a statement to select workflow external condition requests for a proposal.
  StatementBuilder statementBuilder = new StatementBuilder()
      .where("WHERE entityId = :entityId and entityType = :entityType "
          + "and type = :type and conditionStatus = :conditionStatus")
      .orderBy("id ASC")
      .limit(StatementBuilder.SUGGESTED_PAGE_LIMIT)
      .withBindVariableValue("entityId", proposalId)
      .withBindVariableValue("entityType", WorkflowEntityType.PROPOSAL.toString())
      .withBindVariableValue("conditionStatus",
          WorkflowEvaluationStatus.PENDING.toString())
      .withBindVariableValue("type",
          WorkflowRequestType.WORKFLOW_EXTERNAL_CONDITION_REQUEST.toString());
    

この 2 つのフィルタ ステートメントを getWorkflowRequestsByStatement 呼び出しに渡すと、プロポーザルで保留中のワークフロー リクエストをタイプ別に取得できます。

Java

  // Get workflow requests by statement.
  WorkflowRequestPage page = workflowRequestService.getWorkflowRequestsByStatement(
      statementBuilder.toStatement());
    

ワークフロー承認リクエストを承認する

ワークフロー承認リクエストはシステム定義のアクションであるため、ユーザーが追加アクションなしで直接承認できます。ワークフロー承認リクエストのフィルタ ステートメントを使用すると保留中の承認リクエストのみを取得できるため、すでにあるフィルタ ステートメントを、承認に向けた WorkflowRequestService のアクション呼び出しに渡します。

Java

  // Create action.
  com.google.api.ads.dfp.axis.v201702.ApproveWorkflowApprovalRequests action =
      new com.google.api.ads.dfp.axis.v201702.ApproveWorkflowApprovalRequests();

  // Perform action.
  UpdateResult result =
      workflowRequestService.performWorkflowRequestAction(
          action, statementBuilder.toStatement());
    

ワークフロー外部条件リクエストを呼び出す

ワークフロー外部条件リクエストは、サイト運営者のワークフローに DFP または セールス マネージャの事前定義アクションよりも複雑なアクションが含まれている場合に使用します。外部の価格設定エンジンがある、広告枠の予約前に独自の広告枠予測メソッドを使用している、といった場合に使用することができます。たとえば、「Check Inventory External(外部で在庫を確認)」というルールを定義しているとします。この場合、すべての ProposalLineItems に対してシステムの在庫確認を実行し、外部の確認で失敗した場合に「承認のリクエスト」ステップを呼び出す、という処理を行うことができます。

Java

  Set<Long> workflowIdsToTrigger = Sets.newHashSet();
  Set<Long> workflowIdsToSkip = Sets.newHashSet();

  ProposalLineItemServiceInterface proposalLineItemService = dfpServices.get(
          session, ProposalLineItemServiceInterface.class);

  for (WorkflowRequest workflowRequest : page.getResults()) {
    if (workflowRequest.getWorkflowRuleName().equals(“Check Inventory External”)) {
      // Query for the ProposalLineItems belonging to the
      // Proposal via workflowRequest.getEntityId()
      StatementBuilder proposalLineItemStatementBuilder =
          new StatementBuilder()
              .where("proposalId = :proposalId")
              .orderBy("id ASC")
              .limit(StatementBuilder.SUGGESTED_PAGE_LIMIT)
              .withBindVariableValue("proposalId",
                  workflowRequest.getEntityId());

      // Get proposal line items by statement.
      ProposalLineItemPage proposalLineItemPage =
           proposalLineItemService.getProposalLineItemsByStatement(
               statementBuilder.toStatement());

      for (ProposalLineItem proposalLineItem : proposalLineItemPage.getResults()) {
        // Assume your external forecast returns true if overbooking.
        if (externalSystem.runExternalForcast(proposalLineItem)) {
            workflowIdsToTrigger.add(workflowRequest.getId());
            // In the example above, only one proposal line item failing to book
            // inventory is needed to trigger.
            break;
        }
      }

      if (!workflowIdsToTrigger.contains(workflowRequest.getId()){
        workflowIdsToSkip.add(workflowRequest.getId());
      }
    }
  }
    

これらのリクエストは、DFP またはセールス マネージャの外部でなんらかのアクションが行われるまで PENDING の状態に留まります。外部のアクションが発生したタイミングで、ルールに定義されているアクションに対し TRIGGERSKIP のどちらを適用するかが決定されます。 上記の例については、次のように TriggerWorkflowExternalConditionRequest アクションを使って workflowIdsToTrigger に含まれるワークフロー リクエストのリストを呼び出し、workflowIdsToSkip に含まれるワークフロー リクエストをスキップします。

Java

  // Create actions.
  TriggerWorkflowExternalConditionRequests triggerAction =
      new TriggerWorkflowExternalConditionRequests();

  SkipWorkflowExternalConditionRequests skipAction =
      new SkipWorkflowExternalConditionRequests();

  // Perform action to selectively trigger workflow requests.
    StatementBuilder triggerStatementBuilder = new StatementBuilder()
      .where("id IN (" + Joiner.on(",").join(workflowIdsToTrigger, ‘,’) + ")");

  UpdateResult triggerResult =
      workflowRequestService.performWorkflowRequestAction(
          triggerAction, triggerStatementBuilder.toStatement());

  // Perform action to selectively skip workflow requests.
    StatementBuilder skipStatementBuilder = new StatementBuilder()
      .where("id IN (" + Joiner.on(",").join(workflowIdsToSkip, ‘,’) + ")");

  UpdateResult skipResult =
      workflowRequestService.performWorkflowRequestAction(
          skipAction, skipStatementBuilder.toStatement());
    

保留中のリクエストがなくなったプロポーザルは、DFP に送信して入稿に進むことができます。

フィードバックを送信...

Doubleclick for Publishers
Doubleclick for Publishers
ご不明な点がありましたら、Google のサポートページをご覧ください。