อัปเดตดีล

คุณสามารถใช้วิธีการต่อไปนี้เพื่ออัปเดตดีล ทีละรายการ หรือ เป็นกลุ่ม โดยคุณสามารถอัปเดตดีลระหว่างการเจรจาต่อรอง หรือเริ่มการเจรจาต่อรองใหม่สำหรับข้อเสนอที่ยอมรับไปก่อนหน้านี้

แก้ไขดีล

คุณสามารถใช้วิธี buyers.proposals.deals.patch เพื่ออัปเดตดีลที่ต้องการซึ่งเชื่อมโยงกับ ข้อเสนอ สำหรับบัญชีผู้ซื้อหรือบัญชี ลูกค้าของคุณ

คุณสามารถใช้ patch เพื่อทำการเปลี่ยนแปลงดีลที่เสนอระหว่างการเจรจาต่อรองครั้งแรก และเริ่มเจรจาต่อรองดีลที่สรุปแล้วอีกครั้ง

ตัวอย่างต่อไปนี้แสดงวิธีอัปเดตดีลด้วยวิธี patch

REST

ส่งคำขอ

PATCH https://authorizedbuyersmarketplace.googleapis.com/v1/buyers/12345678/proposals/MP21673270/deals/52404updateMask=flightStartTime%2CflightEndTime%2CprogrammaticGuaranteedTerms.fixedPrice.amount.units%2CprogrammaticGuaranteedTerms.fixedPrice.amount.nanos&alt=json
Authorization: Bearer ACCESS_TOKEN
Content-Type: application/json

{
 "proposalRevision": "4",
 "flightStartTime": "2037-04-02T20:15:59.584739+00:00",
 "flightEndTime": "2037-04-03T20:15:59.584739+00:00",
 "programmaticGuaranteedTerms": {
   "fixedPrice": {
     "amount": {
       "units": 1,
       "nanos": 500000000
     }
   }
 }
}

การตอบกลับ

{
 "name": "buyers/12345678/proposals/MP21673270/deals/52404",
 "createTime": "2036-12-27T04:02:39.731Z",
 "updateTime": "2037-03-31T20:12:40.875Z",
 "proposalRevision": "5",
 "displayName": "test_deal_7435251",
 "buyer": "buyers/12345678",
 "publisherProfile": "buyers/12345678/publisherProfiles/PP54321",
 "flightStartTime": "2037-04-02T20:12:39.038Z",
 "flightEndTime": "2037-04-03T20:12:39.038Z",
 "targeting": {
   "inventorySizeTargeting": {
     "targetedInventorySizes": [
       {
         "width": "1024",
         "height": "768",
         "type": "PIXEL"
       }
     ]
   }
 },
 "creativeRequirements": {
   "creativePreApprovalPolicy": "SELLER_PRE_APPROVAL_NOT_REQUIRED",
   "creativeSafeFrameCompatibility": "COMPATIBLE",
   "programmaticCreativeSource": "ADVERTISER",
   "creativeFormat": "DISPLAY"
 },
 "deliveryControl": {
   "deliveryRateType": "EVENLY"
 },
 "billedBuyer": "buyers/12345678",
 "dealType": "PROGRAMMATIC_GUARANTEED",
 "programmaticGuaranteedTerms": {
   "guaranteedLooks": "100",
   "fixedPrice": {
     "type": "CPM",
     "amount": {
       "currencyCode": "CNY",
       "units": "1",
       "nanos": 500000000
     }
   },
   "reservationType": "STANDARD"
 },
 "sellerTimeZone": {
   "id": "Asia/Shanghai"
 }
}

Java

/*
 * Copyright 2022 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.google.api.services.samples.authorizedbuyers.marketplace.v1.buyers.proposals.deals;

import com.google.api.services.authorizedbuyersmarketplace.v1.AuthorizedBuyersMarketplace;
import com.google.api.services.authorizedbuyersmarketplace.v1.model.Deal;
import com.google.api.services.authorizedbuyersmarketplace.v1.model.Money;
import com.google.api.services.authorizedbuyersmarketplace.v1.model.Price;
import com.google.api.services.authorizedbuyersmarketplace.v1.model.ProgrammaticGuaranteedTerms;
import com.google.api.services.samples.authorizedbuyers.marketplace.v1.Utils;
import java.io.IOException;
import java.security.GeneralSecurityException;
import net.sourceforge.argparse4j.ArgumentParsers;
import net.sourceforge.argparse4j.inf.ArgumentParser;
import net.sourceforge.argparse4j.inf.ArgumentParserException;
import net.sourceforge.argparse4j.inf.Namespace;
import org.joda.time.DateTime;
import org.joda.time.format.ISODateTimeFormat;

/**
 * Patches a programmatic guaranteed deal at the given revision number.
 *
 * <p>This will modify the deal's flightStartTime, flightEndTime, and programmaticGuaranteedTerms.
 *
 * <p>Note: If the revision number is lower than what is stored for the deal server-side, the
 * operation will be deemed obsolete and an error will be returned.
 */
public class PatchProgrammaticGuaranteedDeals {

  public static void execute(AuthorizedBuyersMarketplace marketplaceClient, Namespace parsedArgs) {
    Long accountId = parsedArgs.getLong("account_id");
    String proposalId = parsedArgs.getString("proposal_id");
    Long dealId = parsedArgs.getLong("deal_id");
    String name = String.format("buyers/%d/proposals/%s/deals/%d", accountId, proposalId, dealId);
    Long proposalRevision = parsedArgs.getLong("proposal_revision");

    Deal patchedProgrammaticGuaranteedDeal = new Deal();
    patchedProgrammaticGuaranteedDeal.setProposalRevision(proposalRevision);

    // Patch new start and end flight times in RFC3339 UTC "Zulu" format.
    DateTime startTime = DateTime.now().plusDays(1);
    DateTime endTime = startTime.plusDays(1);
    patchedProgrammaticGuaranteedDeal.setFlightStartTime(
        startTime.toString(ISODateTimeFormat.dateTime()));
    patchedProgrammaticGuaranteedDeal.setFlightEndTime(
        endTime.toString(ISODateTimeFormat.dateTime()));

    Money fixedPriceAmount = new Money();
    fixedPriceAmount.setUnits(parsedArgs.getLong("fixed_price_units"));
    fixedPriceAmount.setNanos(parsedArgs.getInt("fixed_price_nanos"));

    Price fixedPrice = new Price();
    fixedPrice.setAmount(fixedPriceAmount);

    ProgrammaticGuaranteedTerms programmaticGuaranteedTerms = new ProgrammaticGuaranteedTerms();
    programmaticGuaranteedTerms.setFixedPrice(fixedPrice);
    patchedProgrammaticGuaranteedDeal.setProgrammaticGuaranteedTerms(programmaticGuaranteedTerms);

    String updateMask =
        "flightStartTime,flightEndTime,"
            + "programmaticGuaranteedTerms.fixedPrice.amount.units,"
            + "programmaticGuaranteedTerms.fixedPrice.amount.nanos";

    Deal deal = null;
    try {
      deal =
          marketplaceClient
              .buyers()
              .proposals()
              .deals()
              .patch(name, patchedProgrammaticGuaranteedDeal)
              .setUpdateMask(updateMask)
              .execute();
    } catch (IOException ex) {
      System.out.printf("Marketplace API returned error response:%n%s", ex);
      System.exit(1);
    }

    System.out.printf("Patching deal with name \"%s\":%n", name);
    Utils.printDeal(deal);
  }

  public static void main(String[] args) {
    ArgumentParser parser =
        ArgumentParsers.newFor("PatchProgrammaticGuaranteedDeals")
            .build()
            .defaultHelp(true)
            .description(("Patches a programmatic guaranteed deal at the given revision number."));
    parser
        .addArgument("-a", "--account_id")
        .help(
            "The resource ID of the buyers resource under which the deal is being patched. "
                + "This will be used to construct the name used as a path parameter for the "
                + "deals.patch request.")
        .required(true)
        .type(Long.class);
    parser
        .addArgument("-d", "--deal_id")
        .help(
            "The resource ID of the buyers.proposals.deals resource that is being patched. "
                + "This will be used to construct the name used as a path parameter for the "
                + "deals.patch request.")
        .required(true)
        .type(Long.class);
    parser
        .addArgument("-p", "--proposal_id")
        .help(
            "The resource ID of the buyers.proposals resource under which the deal is being"
                + " patched. This will be used to construct the name used as a path parameter for"
                + " the deals.patch request.")
        .required(true)
        .type(String.class);
    parser
        .addArgument("-r", "--proposal_revision")
        .help(
            "The revision number for the proposal being modified. Each update to the proposal "
                + "or its deals causes the number to increment. The revision number specified must "
                + "match the value stored server-side in order for the operation to be performed.")
        .required(true)
        .type(Long.class);
    parser
        .addArgument("-u", "--fixed_price_units")
        .help("Whole units of the currency specified for the programmatic guaranteed deal.")
        .type(Long.class)
        .setDefault(1L);
    parser
        .addArgument("-n", "--fixed_price_nanos")
        .help(
            "Number of nano units of the currency specified for the programmatic guaranteed "
                + "deal.")
        .type(Integer.class)
        .setDefault(500000000);

    Namespace parsedArgs = null;
    try {
      parsedArgs = parser.parseArgs(args);
    } catch (ArgumentParserException ex) {
      parser.handleError(ex);
      System.exit(1);
    }

    AuthorizedBuyersMarketplace client = null;
    try {
      client = Utils.getMarketplaceClient();
    } catch (IOException ex) {
      System.out.printf("Unable to create Marketplace API service:%n%s", ex);
      System.out.println("Did you specify a valid path to a service account key file?");
      System.exit(1);
    } catch (GeneralSecurityException ex) {
      System.out.printf("Unable to establish secure HttpTransport:%n%s", ex);
      System.exit(1);
    }

    execute(client, parsedArgs);
  }
}

อัปเดตดีลเป็นกลุ่ม

คุณสามารถใช้วิธี buyers.proposals.deals.batchUpdate เพื่ออัปเดตดีลอย่างน้อย 1 รายการที่เชื่อมโยงกับข้อเสนอสำหรับบัญชีผู้ซื้อ หรือบัญชีลูกค้าของคุณ

ตัวอย่างเช่น คุณสามารถเริ่มการเจรจาต่อรองใหม่ได้โดยการอัปเดตดีลหลายรายการที่รวมอยู่ในข้อเสนอในการเรียก API ครั้งเดียว

ดีลที่รวมอยู่ในเนื้อหาของวิธี batchUpdate ต้องมีข้อเสนอหลักเดียวกัน

ตัวอย่างต่อไปนี้แสดงวิธีอัปเดตดีลอย่างน้อย 1 รายการของข้อเสนอด้วยวิธี batchUpdate

REST

ส่งคำขอ

POST https://authorizedbuyersmarketplace.googleapis.com/v1/buyers/12345678/proposals/MP21673270/deals:batchUpdate?alt=json
Authorization: Bearer ACCESS_TOKEN
Content-Type: application/json

{
 "requests": [
   {
     "deal": {
       "name": "buyers/12345678/proposals/MP21673270/deals/52404",
       "proposalRevision": "6",
       "targeting": {
         "userListTargeting": {
           "targetedCriteriaIds": [
             "111111"
           ]
         }
       }
     },
     "updateMask": "targeting.userListTargeting.targetedCriteriaIds"
   }
 ]
}

การตอบกลับ

{
 "deals": [
   {
     "name": "buyers/12345678/proposals/MP21673270/deals/52404",
     "createTime": "2036-12-27T04:02:39.731Z",
     "updateTime": "2037-03-31T20:33:04.773Z",
     "proposalRevision": "7",
     "displayName": "test_deal_7435251",
     "buyer": "buyers/12345678",
     "publisherProfile": "buyers/12345678/publisherProfiles/PP54321",
     "flightStartTime": "2037-04-02T20:12:39.038Z",
     "flightEndTime": "2037-04-03T20:12:39.038Z",
     "targeting": {
       "inventorySizeTargeting": {
         "targetedInventorySizes": [
           {
             "width": "1024",
             "height": "768",
             "type": "PIXEL"
           }
         ]
       },
        "userListTargeting": {
         "targetedCriteriaIds": [
           "111111"
         ]
       }
     },
     "creativeRequirements": {
       "creativePreApprovalPolicy": "SELLER_PRE_APPROVAL_NOT_REQUIRED",
       "creativeSafeFrameCompatibility": "COMPATIBLE",
       "programmaticCreativeSource": "ADVERTISER",
       "creativeFormat": "DISPLAY"
     },
     "deliveryControl": {
         "deliveryRateType": "EVENLY"
     },
     "billedBuyer": "buyers/12345678",
     "dealType": "PROGRAMMATIC_GUARANTEED",
     "programmaticGuaranteedTerms": {
       "guaranteedLooks": "100",
       "fixedPrice": {
         "type": "CPM",
         "amount": {
           "currencyCode": "CNY",
           "units": "1",
           "nanos": 500000000
         }
       },
       "reservationType": "STANDARD"
     },
     "sellerTimeZone": {
       "id": "Asia/Shanghai"
     }
   }
 ]
}

Java

/*
 * Copyright 2022 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.google.api.services.samples.authorizedbuyers.marketplace.v1.buyers.proposals.deals;

import com.google.api.services.authorizedbuyersmarketplace.v1.AuthorizedBuyersMarketplace;
import com.google.api.services.authorizedbuyersmarketplace.v1.model.BatchUpdateDealsRequest;
import com.google.api.services.authorizedbuyersmarketplace.v1.model.BatchUpdateDealsResponse;
import com.google.api.services.authorizedbuyersmarketplace.v1.model.CriteriaTargeting;
import com.google.api.services.authorizedbuyersmarketplace.v1.model.Deal;
import com.google.api.services.authorizedbuyersmarketplace.v1.model.MarketplaceTargeting;
import com.google.api.services.authorizedbuyersmarketplace.v1.model.UpdateDealRequest;
import com.google.api.services.samples.authorizedbuyers.marketplace.v1.Utils;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.ArrayList;
import java.util.List;
import net.sourceforge.argparse4j.ArgumentParsers;
import net.sourceforge.argparse4j.inf.ArgumentParser;
import net.sourceforge.argparse4j.inf.ArgumentParserException;
import net.sourceforge.argparse4j.inf.Namespace;

/**
 * Patches the user list targeting of one or more deals for the given buyer's proposal.
 *
 * <p>This operation requires that the deals all exist under the same proposal.
 *
 * <p>The user list targeting of the given deals will be modified to target the specified user
 * lists. User lists can be retrieved via the Real-time Bidding API's buyers.userLists resource. You
 * can learn more about buyers.userLists in the reference documentation:
 * https://developers.google.com/authorized-buyers/apis/realtimebidding/reference/rest/v1/buyers.userLists
 *
 * <p>Note: Only preferred and programmatic guaranteed deals can be modified by the buyer;
 * attempting to modify a private auction deal will result in an error response.
 */
public class BatchUpdateDeals {

  public static void execute(AuthorizedBuyersMarketplace marketplaceClient, Namespace parsedArgs) {
    Long accountId = parsedArgs.getLong("account_id");
    List<Long> dealIds = parsedArgs.getList("deal_ids");
    String proposalId = parsedArgs.getString("proposal_id");
    String parent = String.format("buyers/%d/proposals/%s", accountId, proposalId);
    Long proposalRevision = parsedArgs.getLong("proposal_revision");
    List<Long> userListIds = parsedArgs.getList("user_list_ids");

    List<UpdateDealRequest> updateDealRequests = new ArrayList<>();

    // Populate the request body based on the deals specified.
    for (Long dealId : dealIds) {
      Deal deal = new Deal();
      deal.setName(String.format("buyers/%d/proposals/%s/deals/%d", accountId, proposalId, dealId));
      deal.setProposalRevision(proposalRevision);

      CriteriaTargeting userListTargeting = new CriteriaTargeting();
      userListTargeting.setTargetedCriteriaIds(userListIds);

      MarketplaceTargeting marketplaceTargeting = new MarketplaceTargeting();
      marketplaceTargeting.setUserListTargeting(userListTargeting);
      deal.setTargeting(marketplaceTargeting);

      UpdateDealRequest updateDealRequest = new UpdateDealRequest();
      updateDealRequest.setDeal(deal);
      updateDealRequest.setUpdateMask("targeting.userListTargeting.targetedCriteriaIds");

      updateDealRequests.add(updateDealRequest);
    }

    BatchUpdateDealsRequest batchUpdateDealsRequest = new BatchUpdateDealsRequest();
    batchUpdateDealsRequest.setRequests(updateDealRequests);

    BatchUpdateDealsResponse response = null;
    try {
      response =
          marketplaceClient
              .buyers()
              .proposals()
              .deals()
              .batchUpdate(parent, batchUpdateDealsRequest)
              .execute();
    } catch (IOException ex) {
      System.out.printf("Marketplace API returned error response:%n%s", ex);
      System.exit(1);
    }

    System.out.printf("Batch updating deals for proposal with name \"%s\":%n", parent);

    for (Deal deal : response.getDeals()) {
      Utils.printDeal(deal);
    }
  }

  public static void main(String[] args) {
    ArgumentParser parser =
        ArgumentParsers.newFor("BatchUpdateDeals")
            .build()
            .defaultHelp(true)
            .description(
                ("Patches the user list targeting of one or more deals for the given "
                    + "buyer's proposal."));
    parser
        .addArgument("-a", "--account_id")
        .help(
            "The resource ID of the buyers resource under which one or more deals are being"
                + " patched. This will be used to construct the proposal name used as a path"
                + " parameter for the deals.batchUpdate request, and each deal name included in the"
                + " request body.")
        .required(true)
        .type(Long.class);
    parser
        .addArgument("-d", "--deal_ids")
        .help(
            "The resource ID of one or more buyers.proposals.deals resources that will be patched"
                + " in a batch update operation. These will be used to construct the deal names"
                + " included in the request body. Specify each client ID separated by a space.")
        .required(true)
        .type(Long.class)
        .nargs("+");
    parser
        .addArgument("-p", "--proposal_id")
        .help(
            "The resource ID of the buyers.proposals resource under which one or more deals is"
                + " being patched. This will be used to construct the name used as a path parameter"
                + " for the deals.batchUpdate request, and each deal name included in the request"
                + " body")
        .required(true);
    parser
        .addArgument("-r", "--proposal_revision")
        .help(
            "The revision number for the corresponding proposal of the deals being modified. Each"
                + " update to the proposal or its deals causes the number to increment. The"
                + " revision number specified must match the value stored server-side in order for"
                + " the operation to be performed.")
        .required(true)
        .type(Long.class);
    parser
        .addArgument("-u", "--user_list_ids")
        .help(
            "The resource ID of one or more buyers.userLists resources that are to be targeted "
                + "by the given deals. Specify each client ID separated by a space.")
        .required(true)
        .type(Long.class)
        .nargs("+");

    Namespace parsedArgs = null;
    try {
      parsedArgs = parser.parseArgs(args);
    } catch (ArgumentParserException ex) {
      parser.handleError(ex);
      System.exit(1);
    }

    AuthorizedBuyersMarketplace client = null;
    try {
      client = Utils.getMarketplaceClient();
    } catch (IOException ex) {
      System.out.printf("Unable to create Marketplace API service:%n%s", ex);
      System.out.println("Did you specify a valid path to a service account key file?");
      System.exit(1);
    } catch (GeneralSecurityException ex) {
      System.out.printf("Unable to establish secure HttpTransport:%n%s", ex);
      System.exit(1);
    }

    execute(client, parsedArgs);
  }
}