Simulation Paths

How to follow this chapter

Inputs: The order inputs from Plan creation and an isolated simulation environment.

Steps and expected result: Submit a separate order for each scenario and inspect the later status. The initial HTTP response acknowledges the request; the scenario describes subsequent processing.

Alternative or later actions: These are optional development scenarios, separate from the normal client journey.

DTO source: PortfolioOrderOutputModel

Variables assigned in an earlier block are reused by later blocks. Client-entered values come from your UI; keep identifiers and lookup results in the current client context. Do not create a fresh context between steps.

The snippets use shared helper classes. See Shared helper classes: complete C# and Java source before copying an example.
Before you start: A separately configured simulation environment, a supporting order adapter and the inputs from Plan Creation.
Keep for the next step: An order whose later status must be checked. Simulation support is specific to the integration.
The keywords below document the simulation scenarios used by some order adapters. They are integration-specific; the WMS API accepts the Note field, but this does not guarantee that the active adapter implements a keyword.
Confirm support and simulation configuration with the operator of your isolated development environment before using them. These are alternative scenarios: submit a separate order for each scenario and check its eventual status. Do not assume universal support across custody institutions or deployments.

Order Submission Failed

In an adapter supporting this keyword, !#PORTFOLIO-SUBMISSION-FAIL#! requests a failed-submission scenario, such as a simulated network failure.
								
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
var orderPortfolioCreationInputModel = new
{
    AccountHoldingInstitutionCode = accountHoldingInstitution.Code,
    UserId = userId,
    InvestmentCategoryId = investmentCategory3A.Id,
    ProposalId = proposalSelectedByUser.Id,
    ReasonToChangeProposalResponsesIds = selectedReasonIds,
    Note = "!#PORTFOLIO-SUBMISSION-FAIL#!"
};

  using var httpContent = GuideHttp.CreateMultipartContent(orderPortfolioCreationInputModel, pdfContractAsByteArray);
  (await httpClient.PostAsync("api/v1/user-portfolio-orders/creation", httpContent)).EnsureSuccessStatusCode();

								
// Use only in an environment whose order adapter supports this keyword.
JsonObject payload = new JsonObject();
payload.addProperty("AccountHoldingInstitutionCode", accountHoldingInstitutionObj.Code);
payload.addProperty("UserId", userId);
payload.addProperty("InvestmentCategoryId", investmentCategoryId);
payload.addProperty("ProposalId", proposalId);
payload.add("ReasonToChangeProposalResponsesIds", new Gson().toJsonTree(selectedReasonIds));
payload.addProperty("Note", "!#PORTFOLIO-SUBMISSION-FAIL#!");
MultiPartBodyPublisher body = new MultiPartBodyPublisher()
    .addPart("jsonPayload", payload.toString())
    .addPart("userContracts", () -> new ByteArrayInputStream(pdfAsByteArray), "Contract.pdf", "application/pdf");
HttpRequest request = HttpRequest.newBuilder()
    .uri(Settings.wmsUri("user-portfolio-orders/creation"))
    .timeout(Duration.ofMinutes(1))
    .header("Authorization", "Bearer " + accessToken)
    .header("Content-Type", "multipart/form-data; boundary=" + body.getBoundary())
    .POST(body.build()).build();
var response = httpClient.send(request, BodyHandlers.ofString());
Api.requireSuccess(response);
PortfolioOrderOutputModel order = new Gson().fromJson(response.body(), PortfolioOrderOutputModel.class);
// Check the order status separately; HTTP success does not prove the simulated outcome.

Order Submitted

In a supporting adapter, !#PORTFOLIO-SUBMITTED#! requests a submitted-order scenario with simulated external order data.
								
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
var orderPortfolioCreationInputModel = new
{
    AccountHoldingInstitutionCode = accountHoldingInstitution.Code,
    UserId = userId,
    InvestmentCategoryId = investmentCategory3A.Id,
    ProposalId = proposalSelectedByUser.Id,
    ReasonToChangeProposalResponsesIds = selectedReasonIds,
    Note = "!#PORTFOLIO-SUBMITTED#!"
};

  using var httpContent = GuideHttp.CreateMultipartContent(orderPortfolioCreationInputModel, pdfContractAsByteArray);
  (await httpClient.PostAsync("api/v1/user-portfolio-orders/creation", httpContent)).EnsureSuccessStatusCode();

								
// Use only in an environment whose order adapter supports this keyword.
JsonObject payload = new JsonObject();
payload.addProperty("AccountHoldingInstitutionCode", accountHoldingInstitutionObj.Code);
payload.addProperty("UserId", userId);
payload.addProperty("InvestmentCategoryId", investmentCategoryId);
payload.addProperty("ProposalId", proposalId);
payload.add("ReasonToChangeProposalResponsesIds", new Gson().toJsonTree(selectedReasonIds));
payload.addProperty("Note", "!#PORTFOLIO-SUBMITTED#!");
MultiPartBodyPublisher body = new MultiPartBodyPublisher()
    .addPart("jsonPayload", payload.toString())
    .addPart("userContracts", () -> new ByteArrayInputStream(pdfAsByteArray), "Contract.pdf", "application/pdf");
HttpRequest request = HttpRequest.newBuilder()
    .uri(Settings.wmsUri("user-portfolio-orders/creation"))
    .timeout(Duration.ofMinutes(1))
    .header("Authorization", "Bearer " + accessToken)
    .header("Content-Type", "multipart/form-data; boundary=" + body.getBoundary())
    .POST(body.build()).build();
var response = httpClient.send(request, BodyHandlers.ofString());
Api.requireSuccess(response);
PortfolioOrderOutputModel order = new Gson().fromJson(response.body(), PortfolioOrderOutputModel.class);
// Check the order status separately; HTTP success does not prove the simulated outcome.

Order Accepted

In a supporting adapter, !#PORTFOLIO-ACCEPTED#! requests an accepted-order scenario with simulated external order data.
								
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
var orderPortfolioCreationInputModel = new
{
    AccountHoldingInstitutionCode = accountHoldingInstitution.Code,
    UserId = userId,
    InvestmentCategoryId = investmentCategory3A.Id,
    ProposalId = proposalSelectedByUser.Id,
    ReasonToChangeProposalResponsesIds = selectedReasonIds,
    Note = "!#PORTFOLIO-ACCEPTED#!"
};

  using var httpContent = GuideHttp.CreateMultipartContent(orderPortfolioCreationInputModel, pdfContractAsByteArray);
  (await httpClient.PostAsync("api/v1/user-portfolio-orders/creation", httpContent)).EnsureSuccessStatusCode();

								
// Use only in an environment whose order adapter supports this keyword.
JsonObject payload = new JsonObject();
payload.addProperty("AccountHoldingInstitutionCode", accountHoldingInstitutionObj.Code);
payload.addProperty("UserId", userId);
payload.addProperty("InvestmentCategoryId", investmentCategoryId);
payload.addProperty("ProposalId", proposalId);
payload.add("ReasonToChangeProposalResponsesIds", new Gson().toJsonTree(selectedReasonIds));
payload.addProperty("Note", "!#PORTFOLIO-ACCEPTED#!");
MultiPartBodyPublisher body = new MultiPartBodyPublisher()
    .addPart("jsonPayload", payload.toString())
    .addPart("userContracts", () -> new ByteArrayInputStream(pdfAsByteArray), "Contract.pdf", "application/pdf");
HttpRequest request = HttpRequest.newBuilder()
    .uri(Settings.wmsUri("user-portfolio-orders/creation"))
    .timeout(Duration.ofMinutes(1))
    .header("Authorization", "Bearer " + accessToken)
    .header("Content-Type", "multipart/form-data; boundary=" + body.getBoundary())
    .POST(body.build()).build();
var response = httpClient.send(request, BodyHandlers.ofString());
Api.requireSuccess(response);
PortfolioOrderOutputModel order = new Gson().fromJson(response.body(), PortfolioOrderOutputModel.class);
// Check the order status separately; HTTP success does not prove the simulated outcome.

Order Accepted and Portfolio Invested

In a supporting adapter, !#PORTFOLIO-TRADED#! requests an accepted-and-invested scenario.
								
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
var orderPortfolioCreationInputModel = new
{
    AccountHoldingInstitutionCode = accountHoldingInstitution.Code,
    UserId = userId,
    InvestmentCategoryId = investmentCategory3A.Id,
    ProposalId = proposalSelectedByUser.Id,
    ReasonToChangeProposalResponsesIds = selectedReasonIds,
    Note = "!#PORTFOLIO-TRADED#!"
};

  using var httpContent = GuideHttp.CreateMultipartContent(orderPortfolioCreationInputModel, pdfContractAsByteArray);
  (await httpClient.PostAsync("api/v1/user-portfolio-orders/creation", httpContent)).EnsureSuccessStatusCode();

								
// Use only in an environment whose order adapter supports this keyword.
JsonObject payload = new JsonObject();
payload.addProperty("AccountHoldingInstitutionCode", accountHoldingInstitutionObj.Code);
payload.addProperty("UserId", userId);
payload.addProperty("InvestmentCategoryId", investmentCategoryId);
payload.addProperty("ProposalId", proposalId);
payload.add("ReasonToChangeProposalResponsesIds", new Gson().toJsonTree(selectedReasonIds));
payload.addProperty("Note", "!#PORTFOLIO-TRADED#!");
MultiPartBodyPublisher body = new MultiPartBodyPublisher()
    .addPart("jsonPayload", payload.toString())
    .addPart("userContracts", () -> new ByteArrayInputStream(pdfAsByteArray), "Contract.pdf", "application/pdf");
HttpRequest request = HttpRequest.newBuilder()
    .uri(Settings.wmsUri("user-portfolio-orders/creation"))
    .timeout(Duration.ofMinutes(1))
    .header("Authorization", "Bearer " + accessToken)
    .header("Content-Type", "multipart/form-data; boundary=" + body.getBoundary())
    .POST(body.build()).build();
var response = httpClient.send(request, BodyHandlers.ofString());
Api.requireSuccess(response);
PortfolioOrderOutputModel order = new Gson().fromJson(response.body(), PortfolioOrderOutputModel.class);
// Check the order status separately; HTTP success does not prove the simulated outcome.

Order Rejected

In a supporting adapter, !#PORTFOLIO-REJECTED#! requests a rejected-order scenario.
								
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
var orderPortfolioCreationInputModel = new
{
    AccountHoldingInstitutionCode = accountHoldingInstitution.Code,
    UserId = userId,
    InvestmentCategoryId = investmentCategory3A.Id,
    ProposalId = proposalSelectedByUser.Id,
    ReasonToChangeProposalResponsesIds = selectedReasonIds,
    Note = "!#PORTFOLIO-REJECTED#!"
};

  using var httpContent = GuideHttp.CreateMultipartContent(orderPortfolioCreationInputModel, pdfContractAsByteArray);
  (await httpClient.PostAsync("api/v1/user-portfolio-orders/creation", httpContent)).EnsureSuccessStatusCode();

								
// Use only in an environment whose order adapter supports this keyword.
JsonObject payload = new JsonObject();
payload.addProperty("AccountHoldingInstitutionCode", accountHoldingInstitutionObj.Code);
payload.addProperty("UserId", userId);
payload.addProperty("InvestmentCategoryId", investmentCategoryId);
payload.addProperty("ProposalId", proposalId);
payload.add("ReasonToChangeProposalResponsesIds", new Gson().toJsonTree(selectedReasonIds));
payload.addProperty("Note", "!#PORTFOLIO-REJECTED#!");
MultiPartBodyPublisher body = new MultiPartBodyPublisher()
    .addPart("jsonPayload", payload.toString())
    .addPart("userContracts", () -> new ByteArrayInputStream(pdfAsByteArray), "Contract.pdf", "application/pdf");
HttpRequest request = HttpRequest.newBuilder()
    .uri(Settings.wmsUri("user-portfolio-orders/creation"))
    .timeout(Duration.ofMinutes(1))
    .header("Authorization", "Bearer " + accessToken)
    .header("Content-Type", "multipart/form-data; boundary=" + body.getBoundary())
    .POST(body.build()).build();
var response = httpClient.send(request, BodyHandlers.ofString());
Api.requireSuccess(response);
PortfolioOrderOutputModel order = new Gson().fromJson(response.body(), PortfolioOrderOutputModel.class);
// Check the order status separately; HTTP success does not prove the simulated outcome.