View a markdown version of this page

Update purchase orders after agreement acceptance using an AWS SDK - AWS SDK Code Examples

There are more AWS SDK examples available in the AWS Doc SDK Examples GitHub repo.

Update purchase orders after agreement acceptance using an AWS SDK

The following code examples show how to update purchase orders after the agreement has been accepted.

Java
SDK for Java 2.x
Note

There's more on GitHub. Find the complete example and learn how to set up and run in the AWS Marketplace API Reference Code Library repository.

package com.example.awsmarketplace.agreementapi.buyer; import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider; import software.amazon.awssdk.http.apache.ApacheHttpClient; import software.amazon.awssdk.services.marketplaceagreement.MarketplaceAgreementClient; import software.amazon.awssdk.services.marketplaceagreement.model.AcceptAgreementRequestRequest; import software.amazon.awssdk.services.marketplaceagreement.model.AcceptAgreementRequestResponse; import software.amazon.awssdk.services.marketplaceagreement.model.Charge; import software.amazon.awssdk.services.marketplaceagreement.model.ConfigurableUpfrontPricingTermConfiguration; import software.amazon.awssdk.services.marketplaceagreement.model.CreateAgreementRequestRequest; import software.amazon.awssdk.services.marketplaceagreement.model.CreateAgreementRequestResponse; import software.amazon.awssdk.services.marketplaceagreement.model.Dimension; import software.amazon.awssdk.services.marketplaceagreement.model.Intent; import software.amazon.awssdk.services.marketplaceagreement.model.ListAgreementChargesRequest; import software.amazon.awssdk.services.marketplaceagreement.model.ListAgreementChargesResponse; import software.amazon.awssdk.services.marketplaceagreement.model.PurchaseOrder; import software.amazon.awssdk.services.marketplaceagreement.model.RequestedTerm; import software.amazon.awssdk.services.marketplaceagreement.model.RequestedTermConfiguration; import software.amazon.awssdk.services.marketplaceagreement.model.UpdatePurchaseOrdersRequest; import utils.AgreementApiUtils; /** * Demonstrates how to associate a purchase order reference with a SaaS agreement with CONTRACT pricing model * using the AWS Marketplace Agreement Service APIs. * * <p>Scenario: A buyer creates a SaaS agreement request with CONTRACT pricing model and provides a purchase order * reference in AcceptAgreementRequest. After acceptance, the buyer lists the resulting * charges via ListAgreementCharges and associates the purchase order reference with a * specific charge via UpdatePurchaseOrders. * * <p>Before running this sample, replace the placeholder constants below with values from * your AWS Marketplace offer: * <ul> * <li>{@code AGREEMENT_PROPOSAL_IDENTIFIER} — the agreementProposalId from the offer.</li> * <li>Term IDs (starting with {@code term-}) — found in the offer's term list.</li> * <li>{@code SELECTOR_VALUE} — duration for the agreement.</li> * <li>{@code DIMENSION_1_KEY} — dimension key defined in the offer.</li> * <li>{@code PURCHASE_ORDER_REFERENCE} — your internal purchase order number (e.g., {@code po-123456}).</li> * </ul> */ public class UpdatePurchaseOrdersAfterAgreementAcceptance { // Your internal purchase order reference number (e.g., "po-123456"). private static final String PURCHASE_ORDER_REFERENCE = "po-123456"; // The agreementProposalId from the offer. private static final String AGREEMENT_PROPOSAL_IDENTIFIER = "<your-agreement-proposal-identifier>"; // Term ID for the ConfigurableUpfrontPricingTerm in your offer. private static final String CONFIGURABLE_UPFRONT_PRICING_TERM_ID = "<your-configurable-upfront-pricing-term-id>"; // Duration for the agreement (e.g., "P366D" for 366 days). private static final String SELECTOR_VALUE = "<your-selector-value>"; // Dimension key and quantity defined in your offer. private static final String DIMENSION_1_KEY = "<your-dimension-key>"; private static final int DIMENSION_1_VALUE = 1; // Term ID for the LegalTerm in your offer. private static final String LEGAL_TERM_ID = "<your-legal-term-id>"; // Term ID for the ValidityTerm in your offer. private static final String VALIDITY_TERM_ID = "<your-validity-term-id>"; public static void main(String[] args) { listAgreementChargesAndUpdatePurchaseOrders(); } /** * Full end-to-end flow: * 1. Create a SaaS agreement with CONTRACT pricing model with a purchase order reference. * 2. List charges to retrieve charge IDs and revisions. * 3. Associate the purchase order reference with a specific charge via UpdatePurchaseOrders. * 4. List charges again to confirm the update. */ private static void listAgreementChargesAndUpdatePurchaseOrders() { MarketplaceAgreementClient marketplaceAgreementClient = MarketplaceAgreementClient.builder() .httpClient(ApacheHttpClient.builder().build()) .credentialsProvider(ProfileCredentialsProvider.create()) .build(); RequestedTerm configurableUpfrontPricingTerm = RequestedTerm.builder() .id(CONFIGURABLE_UPFRONT_PRICING_TERM_ID) .configuration(RequestedTermConfiguration.fromConfigurableUpfrontPricingTermConfiguration( ConfigurableUpfrontPricingTermConfiguration.builder() .selectorValue(SELECTOR_VALUE) .dimensions(Dimension.builder() .dimensionKey(DIMENSION_1_KEY) .dimensionValue(DIMENSION_1_VALUE) .build()) .build())) .build(); RequestedTerm legalTerm = RequestedTerm.builder().id(LEGAL_TERM_ID).build(); RequestedTerm validityTerm = RequestedTerm.builder().id(VALIDITY_TERM_ID).build(); // --- Create Agreement --- CreateAgreementRequestRequest createAgreementRequestRequest = CreateAgreementRequestRequest.builder() .clientToken(AgreementApiUtils.generateClientToken()) .intent(Intent.NEW) .requestedTerms(configurableUpfrontPricingTerm, legalTerm, validityTerm) .agreementProposalIdentifier(AGREEMENT_PROPOSAL_IDENTIFIER) .build(); CreateAgreementRequestResponse createAgreementRequestResponse = marketplaceAgreementClient.createAgreementRequest(createAgreementRequestRequest); System.out.println("Agreement request created. AgreementRequestId: " + createAgreementRequestResponse.agreementRequestId()); // --- Accept Agreement Request with Purchase Order --- // The chargeId is available from the CAR response's chargeSummary.expectedCharges. String chargeId = createAgreementRequestResponse.chargeSummary().expectedCharges().get(0).id(); PurchaseOrder purchaseOrderAtAcceptance = PurchaseOrder.builder() .chargeId(chargeId) .purchaseOrderReference(PURCHASE_ORDER_REFERENCE) .build(); AcceptAgreementRequestRequest acceptAgreementRequestRequest = AcceptAgreementRequestRequest.builder() .agreementRequestId(createAgreementRequestResponse.agreementRequestId()) .purchaseOrders(purchaseOrderAtAcceptance) .build(); AcceptAgreementRequestResponse acceptAgreementRequestResponse = marketplaceAgreementClient.acceptAgreementRequest(acceptAgreementRequestRequest); final String agreementId = acceptAgreementRequestResponse.agreementId(); System.out.println("Agreement request accepted with purchase order reference '" + PURCHASE_ORDER_REFERENCE + "'. AgreementId: " + agreementId); // --- List Agreement Charges --- ListAgreementChargesRequest listAgreementChargesRequest = ListAgreementChargesRequest.builder() .agreementId(agreementId) .build(); ListAgreementChargesResponse listAgreementChargesResponse = marketplaceAgreementClient.listAgreementCharges(listAgreementChargesRequest); System.out.println("All charges for agreement " + agreementId + ":"); AgreementApiUtils.formatOutput(listAgreementChargesResponse); // --- Update Purchase Order --- Charge firstCharge = listAgreementChargesResponse.items().get(0); PurchaseOrder purchaseOrder = PurchaseOrder.builder() .agreementId(agreementId) .purchaseOrderReference(PURCHASE_ORDER_REFERENCE) .chargeRevision(firstCharge.revision()) .chargeId(firstCharge.id()) .build(); UpdatePurchaseOrdersRequest updatePurchaseOrdersRequest = UpdatePurchaseOrdersRequest.builder() .purchaseOrders(purchaseOrder) .build(); marketplaceAgreementClient.updatePurchaseOrders(updatePurchaseOrdersRequest); System.out.println("Purchase order reference '" + PURCHASE_ORDER_REFERENCE + "' updated for ChargeId: " + firstCharge.id()); // --- Verify Update --- ListAgreementChargesRequest lacRequest = ListAgreementChargesRequest.builder() .agreementId(agreementId) .build(); ListAgreementChargesResponse lacResponse = marketplaceAgreementClient.listAgreementCharges(lacRequest); System.out.println("Verified updated charge:"); AgreementApiUtils.formatOutput(lacResponse.items().get(0)); } }
JavaScript
SDK for JavaScript (v3)
Note

There's more on GitHub. Find the complete example and learn how to set up and run in the AWS Marketplace API Reference Code Library repository.

const { MarketplaceAgreementClient, CreateAgreementRequestCommand, AcceptAgreementRequestCommand, ListAgreementChargesCommand, UpdatePurchaseOrdersCommand, } = require("@aws-sdk/client-marketplace-agreement"); const { generateClientToken, formatOutput } = require("./utils/AgreementApiUtils"); /** * Demonstrates how to associate a purchase order reference with a SaaS agreement with CONTRACT pricing model * using the AWS Marketplace Agreement Service APIs. * * Scenario: A buyer creates a SaaS agreement request with CONTRACT pricing model and provides a purchase order * reference in AcceptAgreementRequest. After acceptance, the buyer lists the resulting * charges via ListAgreementCharges and associates the purchase order reference with a * specific charge via UpdatePurchaseOrders. * * Before running this sample, replace the placeholder constants below with values from * your AWS Marketplace offer: * - AGREEMENT_PROPOSAL_IDENTIFIER — the agreementProposalId from the offer. * - Term IDs (starting with "term-") — found in the offer's term list. * - SELECTOR_VALUE — duration for the agreement. * - DIMENSION_1_KEY — dimension key defined in the offer. * - PURCHASE_ORDER_REFERENCE — your internal purchase order number (e.g., "po-123456"). */ // Your internal purchase order reference number (e.g., "po-123456"). const PURCHASE_ORDER_REFERENCE = "po-123456"; // The agreementProposalId from the offer. const AGREEMENT_PROPOSAL_IDENTIFIER = "<your-agreement-proposal-identifier>"; // Term ID for the ConfigurableUpfrontPricingTerm in your offer. const CONFIGURABLE_UPFRONT_PRICING_TERM_ID = "<your-configurable-upfront-pricing-term-id>"; // Duration for the agreement (e.g., "P366D" for 366 days). const SELECTOR_VALUE = "<your-selector-value>"; // Dimension key and quantity defined in your offer. const DIMENSION_1_KEY = "<your-dimension-key>"; const DIMENSION_1_VALUE = 1; // Term ID for the LegalTerm in your offer. const LEGAL_TERM_ID = "<your-legal-term-id>"; // Term ID for the ValidityTerm in your offer. const VALIDITY_TERM_ID = "<your-validity-term-id>"; /** * Full end-to-end flow: * 1. Create a SaaS agreement with CONTRACT pricing model with a purchase order reference. * 2. List charges to retrieve charge IDs and revisions. * 3. Associate the purchase order reference with a specific charge via UpdatePurchaseOrders. * 4. List charges again to confirm the update. */ async function listAgreementChargesAndUpdatePurchaseOrders() { const client = new MarketplaceAgreementClient(); const configurableUpfrontPricingTerm = { id: CONFIGURABLE_UPFRONT_PRICING_TERM_ID, configuration: { configurableUpfrontPricingTermConfiguration: { selectorValue: SELECTOR_VALUE, dimensions: [ { dimensionKey: DIMENSION_1_KEY, dimensionValue: DIMENSION_1_VALUE }, ], }, }, }; const legalTerm = { id: LEGAL_TERM_ID }; const validityTerm = { id: VALIDITY_TERM_ID }; // --- Create Agreement --- const createAgreementRequestResponse = await client.send( new CreateAgreementRequestCommand({ clientToken: generateClientToken(), intent: "NEW", requestedTerms: [configurableUpfrontPricingTerm, legalTerm, validityTerm], agreementProposalIdentifier: AGREEMENT_PROPOSAL_IDENTIFIER, }) ); console.log("Agreement request created. AgreementRequestId: " + createAgreementRequestResponse.agreementRequestId); // --- Accept Agreement Request with Purchase Order --- // The chargeId is available from the CAR response's chargeSummary.expectedCharges. const chargeId = createAgreementRequestResponse.chargeSummary.expectedCharges[0].id; const purchaseOrderAtAcceptance = { chargeId: chargeId, purchaseOrderReference: PURCHASE_ORDER_REFERENCE, }; const acceptAgreementRequestResponse = await client.send( new AcceptAgreementRequestCommand({ agreementRequestId: createAgreementRequestResponse.agreementRequestId, purchaseOrders: [purchaseOrderAtAcceptance], }) ); const agreementId = acceptAgreementRequestResponse.agreementId; console.log("Agreement request accepted with purchase order reference '" + PURCHASE_ORDER_REFERENCE + "'. AgreementId: " + agreementId); // --- List Agreement Charges --- const listAgreementChargesResponse = await client.send( new ListAgreementChargesCommand({ agreementId: agreementId, }) ); console.log("All charges for agreement " + agreementId + ":"); formatOutput(listAgreementChargesResponse); // --- Update Purchase Order --- const firstCharge = listAgreementChargesResponse.items[0]; const purchaseOrder = { agreementId: agreementId, purchaseOrderReference: PURCHASE_ORDER_REFERENCE, chargeRevision: firstCharge.revision, chargeId: firstCharge.id, }; await client.send( new UpdatePurchaseOrdersCommand({ purchaseOrders: [purchaseOrder], }) ); console.log("Purchase order reference '" + PURCHASE_ORDER_REFERENCE + "' updated for ChargeId: " + firstCharge.id); // --- Verify Update --- const lacResponse = await client.send( new ListAgreementChargesCommand({ agreementId: agreementId, }) ); console.log("Verified updated charge:"); formatOutput(lacResponse.items[0]); } listAgreementChargesAndUpdatePurchaseOrders();
Python
SDK for Python (Boto3)
Note

There's more on GitHub. Find the complete example and learn how to set up and run in the AWS Marketplace API Reference Code Library repository.

""" Demonstrates how to associate a purchase order reference with a SaaS agreement with CONTRACT pricing model using the AWS Marketplace Agreement Service APIs. Scenario: A buyer creates a SaaS agreement request with CONTRACT pricing model and provides a purchase order reference in AcceptAgreementRequest. After acceptance, the buyer lists the resulting charges via ListAgreementCharges and associates the purchase order reference with a specific charge via UpdatePurchaseOrders. Before running this sample, replace the placeholder constants below with values from your AWS Marketplace offer: - AGREEMENT_PROPOSAL_IDENTIFIER — the agreementProposalId from the offer. - Term IDs (starting with term-) — found in the offer's term list. - SELECTOR_VALUE — duration for the agreement. - DIMENSION_1_KEY — dimension key defined in the offer. - PURCHASE_ORDER_REFERENCE — your internal purchase order number (e.g., po-123456). """ import boto3 from utils.agreement_api_utils import format_output, generate_client_token class UpdatePurchaseOrdersAfterAgreementAcceptance: # Your internal purchase order reference number (e.g., "po-123456"). PURCHASE_ORDER_REFERENCE = "po-123456" # The agreementProposalId from the offer. AGREEMENT_PROPOSAL_IDENTIFIER = "<your-agreement-proposal-identifier>" # Term ID for the ConfigurableUpfrontPricingTerm in your offer. CONFIGURABLE_UPFRONT_PRICING_TERM_ID = "<your-configurable-upfront-pricing-term-id>" # Duration for the agreement (e.g., "P366D" for 366 days). SELECTOR_VALUE = "<your-selector-value>" # Dimension key and quantity defined in your offer. DIMENSION_1_KEY = "<your-dimension-key>" DIMENSION_1_VALUE = 1 # Term ID for the LegalTerm in your offer. LEGAL_TERM_ID = "<your-legal-term-id>" # Term ID for the ValidityTerm in your offer. VALIDITY_TERM_ID = "<your-validity-term-id>" @staticmethod def list_agreement_charges_and_update_purchase_orders(): """ Full end-to-end flow: 1. Create a SaaS agreement with CONTRACT pricing model with a purchase order reference. 2. List charges to retrieve charge IDs and revisions. 3. Associate the purchase order reference with a specific charge via UpdatePurchaseOrders. 4. List charges again to confirm the update. """ client = boto3.client("marketplace-agreement") cls = UpdatePurchaseOrdersAfterAgreementAcceptance configurable_upfront_pricing_term = { "id": cls.CONFIGURABLE_UPFRONT_PRICING_TERM_ID, "configuration": { "configurableUpfrontPricingTermConfiguration": { "selectorValue": cls.SELECTOR_VALUE, "dimensions": [ { "dimensionKey": cls.DIMENSION_1_KEY, "dimensionValue": cls.DIMENSION_1_VALUE, }, ], } }, } legal_term = {"id": cls.LEGAL_TERM_ID} validity_term = {"id": cls.VALIDITY_TERM_ID} # --- Create Agreement --- create_response = client.create_agreement_request( clientToken=generate_client_token(), intent="NEW", requestedTerms=[configurable_upfront_pricing_term, legal_term, validity_term], agreementProposalIdentifier=cls.AGREEMENT_PROPOSAL_IDENTIFIER, ) agreement_request_id = create_response["agreementRequestId"] print("Agreement request created. AgreementRequestId: " + agreement_request_id) # --- Accept Agreement Request with Purchase Order --- # The chargeId is available from the CAR response's chargeSummary.expectedCharges. charge_id = create_response["chargeSummary"]["expectedCharges"][0]["id"] accept_response = client.accept_agreement_request( agreementRequestId=agreement_request_id, purchaseOrders=[ { "chargeId": charge_id, "purchaseOrderReference": cls.PURCHASE_ORDER_REFERENCE, } ], ) agreement_id = accept_response["agreementId"] print( "Agreement request accepted with purchase order reference '" + cls.PURCHASE_ORDER_REFERENCE + "'. AgreementId: " + agreement_id ) # --- List Agreement Charges --- list_charges_response = client.list_agreement_charges(agreementId=agreement_id) print("All charges for agreement " + agreement_id + ":") format_output(list_charges_response) # --- Update Purchase Order --- first_charge = list_charges_response["items"][0] client.update_purchase_orders( purchaseOrders=[ { "agreementId": agreement_id, "purchaseOrderReference": cls.PURCHASE_ORDER_REFERENCE, "chargeRevision": first_charge["revision"], "chargeId": first_charge["id"], } ], ) print( "Purchase order reference '" + cls.PURCHASE_ORDER_REFERENCE + "' updated for ChargeId: " + first_charge["id"] ) # --- Verify Update --- lac_response = client.list_agreement_charges(agreementId=agreement_id) print("Verified updated charge:") format_output(lac_response["items"][0]) if __name__ == "__main__": UpdatePurchaseOrdersAfterAgreementAcceptance.list_agreement_charges_and_update_purchase_orders()