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.
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.