Anlagevorschlag wählen

So folgen Sie diesem Kapitel

Eingaben: Gewählter Geschäftsbereich und Anlagekategorie, anschliessend die Fragebogenantworten des Kunden.

Schritte und erwartetes Ergebnis: Ermitteln Sie Referenz-IDs, erfassen Sie Antwort-IDs, berechnen Sie das Risiko und lassen Sie den Kunden einen Vorschlag wählen. Übernehmen Sie diese Werte in Portfolio eröffnen.

Alternativen und spätere Aktionen: Der empfohlene Vorschlag ist der Hauptablauf. Ein anderer Vorschlag kann Abweichungsgründe erfordern.

DTO-Quellcode: BusinessLineOutputModel, InvestmentCategoryOutputModel, ProposalOutputModel, QuestionnaireOutputModel, ReasonToChangeProposalOutputModel, ReasonToChangeProposalResponseOutputModel, RiskCategorizationOutputModel

In früheren Codeblöcken zugewiesene Variablen werden später wiederverwendet. Kundeneingaben stammen aus Ihrer Oberfläche. Bewahren Sie IDs und Referenzwerte im Kontext des jeweiligen Kunden auf; legen Sie nicht für jeden Schritt einen neuen Kontext an.

Die Beispiele verwenden gemeinsame Hilfsklassen. Lesen Sie Gemeinsame Hilfsklassen: vollständiger C#- und Java-Quellcode bevor Sie ein Beispiel übernehmen.
Voraussetzungen: Ein eingerichteter HTTP-Client. Referenzaufrufe können einen GUEST-Token verwenden; bewahren Sie für spätere Schreibzugriffe den Kunden- oder administrativen Kontext auf.
Für den nächsten Schritt aufbewahren: Geschäftsbereich, Anlagekategorie, Antwort-IDs, berechnetes Risiko und die vom Kunden gewählte proposalId.
Der Kunde wählt zunächst die gewünschte Anlagekategorie. Typische Geschäftsbereiche und Kategorien stehen nachfolgend. Rufen Sie die aktivierten Referenzdaten der Zielumgebung ab, bevor Sie ein Produkt anbieten:
Vorsorge:
  • Säule 3a (3a)
  • Freizügigkeit (FZ)
Finance (Vermögensverwaltung):
  • Invest (3b)

Hinweis

Anlagearten können je nach Unternehmensbedarf aktiviert oder deaktiviert werden.

Geschäftsbereiche abfragen

Eingaben: Die für das Produkt gewählten Geschäftsbereichs- und Anlagekategoriecodes.
Aktion: Ermitteln Sie die zugehörigen Referenzeinträge.
Aufbewahren / erwartetes Ergebnis: Bewahren Sie businessLineId und investmentCategoryId auf.
Für einen Kunden, der ein Säule-3a-Portfolio eröffnen möchte, ermitteln Sie die ID des Geschäftsbereichs Vorsorge und der Anlagekategorie 3A. Die Geschäftsbereichs-ID bestimmt den aktiven Fragebogen und die Risikoberechnung. Mit Anlagekategorie-ID und ermittelter Risiko-ID rufen Sie die Vorschläge ab:
								
var businessLines = await httpClient.GetFromJsonAsync<IList<BusinessLineOutputModel>>("api/v1/business-lines");
var businessLineVorsorge = businessLines.First(x => x.Code == "VORSORGE");
var investmentCategories = await httpClient.GetFromJsonAsync<IList<InvestmentCategoryOutputModel>>("api/v1/investment-categories/business-line-id/" + businessLineVorsorge.Id);
var investmentCategory3A = investmentCategories.First(x => x.Code == "3A");

								
HttpRequest businessLineRequest = HttpRequest.newBuilder()
    .timeout(Duration.ofMinutes(1))
    .uri(Settings.wmsUri("business-lines/code/VORSORGE"))
    .header("Accept-Language", "de-DE")
    .header("Authorization", "Bearer " + Settings.GUEST_TOKEN)
    .header("Content-Type", "application/json")
    .build();

var response = httpClient.send(businessLineRequest, BodyHandlers.ofString());
Api.requireSuccess(response);
BusinessLineOutputModel businessLineOutputModelObj = new Gson().fromJson(response.body(), BusinessLineOutputModel.class);
var businessLineId = businessLineOutputModelObj.Id;

HttpRequest investmentCategoryRequest = HttpRequest.newBuilder()
    .timeout(Duration.ofMinutes(1))
    .uri(Settings.wmsUri("investment-categories/code/3A"))
    .header("Accept-Language", "de-DE")
    .header("Authorization", "Bearer " + Settings.GUEST_TOKEN)
    .header("Content-Type", "application/json")
    .build();

response = httpClient.send(investmentCategoryRequest, BodyHandlers.ofString());
Api.requireSuccess(response);
InvestmentCategoryOutputModel investmentCategoryObj = new Gson().fromJson(response.body(), InvestmentCategoryOutputModel.class);
var investmentCategoryId = investmentCategoryObj.Id;

Fragebogenantworten

Eingaben: businessLineId und die vom Kunden gewählten Fragebogenantworten.
Aktion: Rufen Sie den Fragebogen ab, ermitteln Sie Antwort-IDs und berechnen Sie das Risiko.
Aufbewahren / erwartetes Ergebnis: Bewahren Sie responseIds und den ermittelten Risikoeintrag auf.
Rufen Sie für den gewählten Geschäftsbereich den Fragebogen mit den verfügbaren Antworten ab.

Zeigen Sie den aktiven Fragebogen an und erfassen Sie selectedResponseCodes über alle Abschnitte hinweg. Dieses Beispiel verwendet diskrete Auswahlmöglichkeiten. Falls numerische Antworten erforderlich sind, verwenden Sie das passende Schema und geben Sie beim Speichern ResponseValue an. Ordnen Sie Codes den IDs dieses Fragebogens zu. Pflichtantworten und Eignungsregeln werden von der API validiert; setzen Sie keine feste Version oder Fragenreihenfolge voraus:
								
var activeQuestionnaire = await httpClient.GetFromJsonAsync<QuestionnaireOutputModel>($"api/v1/questionnaires/business-line-id/{businessLineVorsorge.Id}/active");
var availableResponses = activeQuestionnaire.Sections.SelectMany(s => s.Questions).SelectMany(q => q.Responses).ToList();
// selectedResponseCodes comes from the client answers to the displayed questionnaire.
var responseIds = selectedResponseCodes.Select(code => availableResponses.Single(r => r.Code == code).Id).ToArray();
var responsesCsv = string.Join(",", responseIds);
var risk = await httpClient.GetFromJsonAsync<RiskCategorizationOutputModel>($"api/v1/risk-categorizations/business-line-id/{businessLineVorsorge.Id}/calculate-risk?csv-response-ids={Uri.EscapeDataString(responsesCsv)}");

								
HttpRequest questionnaireRequest = HttpRequest.newBuilder()
    .uri(Settings.wmsUri("questionnaires/business-line-id/" + businessLineId + "/active"))
    .timeout(Duration.ofMinutes(1))
    .header("Authorization", "Bearer " + Settings.GUEST_TOKEN).GET().build();
var questionnaireResponse = httpClient.send(questionnaireRequest, BodyHandlers.ofString());
Api.requireSuccess(questionnaireResponse);
QuestionnaireOutputModel activeQuestionnaire = new Gson().fromJson(questionnaireResponse.body(), QuestionnaireOutputModel.class);
var availableResponses = activeQuestionnaire.Sections.stream()
    .flatMap(s -> s.Questions.stream()).flatMap(q -> q.Responses.stream()).toList();
// selectedResponseCodes comes from the client answers to the displayed questionnaire.
var responseIds = selectedResponseCodes.stream().map(code -> availableResponses.stream()
    .filter(r -> code.equals(r.Code)).findFirst()
    .orElseThrow(() -> new IllegalArgumentException("Response not in the active questionnaire")).Id).toList();
var responsesCsv = responseIds.stream().map(String::valueOf).collect(java.util.stream.Collectors.joining(","));
HttpRequest riskRequest = HttpRequest.newBuilder()
    .uri(Settings.wmsUri("risk-categorizations/business-line-id/" + businessLineId
    + "/calculate-risk?csv-response-ids=" + java.net.URLEncoder.encode(responsesCsv, StandardCharsets.UTF_8)))
    .timeout(Duration.ofMinutes(1))
    .header("Authorization", "Bearer " + Settings.GUEST_TOKEN).GET().build();
var riskResponse = httpClient.send(riskRequest, BodyHandlers.ofString());
Api.requireSuccess(riskResponse);
RiskCategorizationOutputModel riskCategorizationObj = new Gson().fromJson(riskResponse.body(), RiskCategorizationOutputModel.class);

Anlagevorschläge abrufen

Eingaben: investmentCategoryId und das berechnete Risiko.
Aktion: Rufen Sie die Vorschläge ab und erfassen Sie die Kundenauswahl.
Aufbewahren / erwartetes Ergebnis: Bewahren Sie die gewählte proposalId und die erforderlichen Abweichungsgründe auf.
Rufen Sie anhand des berechneten Risikos die vorgeschlagenen Anlagemodelle ab und lassen Sie den Kunden proposalId aus den angezeigten Ergebnissen wählen. Wenn keine passenden Vorschläge oder Referenzcodes vorhanden sind, behandeln Sie dies als nicht verfügbare Produkt- oder Referenzdaten. Wählen Sie keinen Standardwert:
								
var proposals = await httpClient.GetFromJsonAsync<List<ProposalOutputModel>>($"api/v1/proposals/investment-category-id/{investmentCategory3A.Id}/risk-id/{risk.Id}");
// The client chooses proposalId from the displayed proposals.
var proposalSelectedByUser = proposals.Single(x => x.Id == proposalId);

								
HttpRequest proposalRequest = HttpRequest.newBuilder()
    .timeout(Duration.ofMinutes(1))
    .uri(Settings.wmsUri("proposals/investment-category-id/" + investmentCategoryId + "/risk-id/" + riskCategorizationObj.Id))
    .header("Accept-Language", "de-DE")
    .header("Authorization", "Bearer " + Settings.GUEST_TOKEN)
    .header("Content-Type", "application/json")
    .build();

response = httpClient.send(proposalRequest, BodyHandlers.ofString());
Api.requireSuccess(response);

Type listType = new TypeToken<ArrayList<ProposalOutputModel>>(){}.getType();
List<ProposalOutputModel> proposalsListObj = new Gson().fromJson(response.body(), listType);

// proposalId is selected by the client from the displayed proposals.
var proposalSelectedByUser = proposalsListObj.stream().filter(x -> x.Id == proposalId)
    .findFirst().orElseThrow(() -> new IllegalArgumentException("Select a displayed proposal"));

Den Anlagevorschlag können Sie beispielsweise so anzeigen:
Beispiel eines Anlagevorschlags
Wählt der Kunde ein anderes als das empfohlene Modell, müssen Sie die Abweichungsgründeangeben. Dazu dient eine einfache Antwortliste mit folgender Struktur:
									
public class ReasonToChangeProposalResponseOutputModel
{
    public long Id { get; set; }
    public string Code { get; set; }
    public string Description { get; set; }
    public int Order { get; set; }
}

public class ReasonToChangeProposalOutputModel
{
    public long Id { get; set; }
    public string Code { get; set; }
    public string Name { get; set; }
    public bool IsDeleted { get; set; }
    public IList<ReasonToChangeProposalResponseOutputModel> Responses { get; set; }
}

	
									
import java.util.List;
import java.util.Map;

import com.google.gson.annotations.SerializedName;

public class ReasonToChangeProposalResponseOutputModel {
    @SerializedName("id")
    public long Id;

    @SerializedName("code")
    public String Code;

    @SerializedName("description")
    public String Description;

    @SerializedName("order")
    public int Order;
}

public class ReasonToChangeProposalOutputModel {
    @SerializedName("id")
    public long Id;

    @SerializedName("code")
    public String Code;

    @SerializedName("name")
    public String Name;

    @SerializedName("isDeleted")
    public boolean IsDeleted;

    @SerializedName("responses")
    public List<ReasonToChangeProposalResponseOutputModel> Responses;
}

Die Liste rufen Sie wie folgt ab:
									
var reasonsToChangeProposal = await httpClient.GetFromJsonAsync<ReasonToChangeProposalOutputModel>($"api/v1/reason-to-change-proposed-proposal/investment-category-id/{investmentCategory3A.Id}/active");

	
									
HttpRequest reasonToChangeRequest = HttpRequest.newBuilder()
    .timeout(Duration.ofMinutes(1))
    .uri(Settings.wmsUri("reason-to-change-proposed-proposal/investment-category-id/" + investmentCategoryId + "/active"))
    .header("Accept-Language", "de-DE")
    .header("Authorization", "Bearer " + Settings.GUEST_TOKEN)
    .header("Content-Type", "application/json")
    .build();

response = httpClient.send(reasonToChangeRequest, BodyHandlers.ofString());
Api.requireSuccess(response);
ReasonToChangeProposalOutputModel reasonToChangeProposalObj = new Gson().fromJson(response.body(), ReasonToChangeProposalOutputModel.class);

Weicht der Kunde vom empfohlenen Vorschlag ab, erfassen Sie die relevanten Antwort-IDs in selectedReasonIds. Verwenden Sie eine leere Liste, wenn keine Gründe erforderlich sind, und wählen Sie keine Gründe automatisch. Senden Sie diese IDs mit dem Eröffnungsauftrag; dies zeigt das nächste Kapitel.