Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/CAPABILITY_DATA_SETUP.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ Periodic limit per service agreement, for function group "Admin":

- Transactional limit with amount of 1,000,000
- Privileges "create" and "approve"
- Functions SEPA CT, ACH Debit, US Domestic Wire and US Foreign Wire
- Functions SEPA CT, ACH Debit, US Domestic Wire, US Foreign Wire, US Cross Border Wire, US FX Foreign Wire, and FCY Wire

## Notifications setup
Global notifications are only created by the bank manager using approvals
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,11 @@
import static com.backbase.ct.bbfuel.data.CommonConstants.PRODUCT_SUMMARY_FUNCTION_NAME;
import static com.backbase.ct.bbfuel.data.CommonConstants.PRODUCT_SUMMARY_RESOURCE_NAME;
import static com.backbase.ct.bbfuel.data.CommonConstants.SEPA_CT_FUNCTION_NAME;
import static com.backbase.ct.bbfuel.data.CommonConstants.FCY_WIRE_FUNCTION_NAME;
import static com.backbase.ct.bbfuel.data.CommonConstants.US_CROSS_BORDER_WIRE_FUNCTION_NAME;
import static com.backbase.ct.bbfuel.data.CommonConstants.US_DOMESTIC_WIRE_FUNCTION_NAME;
import static com.backbase.ct.bbfuel.data.CommonConstants.US_FOREIGN_WIRE_FUNCTION_NAME;
import static com.backbase.ct.bbfuel.data.CommonConstants.US_FX_FOREIGN_WIRE_FUNCTION_NAME;
import static org.apache.http.HttpStatus.SC_OK;

import com.backbase.ct.bbfuel.client.common.RestClient;
Expand Down Expand Up @@ -79,18 +82,7 @@ public List<ProductSummaryItem> getSepaCtArrangements() {
}

public List<ProductSummaryItem> getUsDomesticWireArrangements() {
return Arrays.asList(getProductSummaryContextArrangements(new ProductSummaryQueryParameters()
.withBusinessFunction(US_DOMESTIC_WIRE_FUNCTION_NAME)
.withResourceName(PAYMENTS_RESOURCE_NAME)
.withPrivilege(PRIVILEGE_CREATE)
.withDebitAccount(true)
.withCreditAccount(true)
.withSize(999)
.withOrderBy("name"))
.then()
.statusCode(SC_OK)
.extract()
.as(ProductSummaryItem[].class));
return getPaymentArrangements(US_DOMESTIC_WIRE_FUNCTION_NAME, "USD");
}

public List<ProductSummaryItem> getAchDebitArrangements() {
Expand All @@ -114,8 +106,24 @@ private static boolean isValidCurrencyForAchDebit(String currency) {
}

public List<ProductSummaryItem> getUSForeignWireArrangements() {
return Arrays.asList(getProductSummaryContextArrangements(new ProductSummaryQueryParameters()
.withBusinessFunction(US_FOREIGN_WIRE_FUNCTION_NAME)
return getPaymentArrangements(US_FOREIGN_WIRE_FUNCTION_NAME, "USD");
}

public List<ProductSummaryItem> getUsCrossBorderWireArrangements() {
return getPaymentArrangements(US_CROSS_BORDER_WIRE_FUNCTION_NAME, "USD");
}

public List<ProductSummaryItem> getUsFxForeignWireArrangements() {
return getPaymentArrangements(US_FX_FOREIGN_WIRE_FUNCTION_NAME, "EUR");
}

public List<ProductSummaryItem> getFcyWireArrangements() {
return getPaymentArrangements(FCY_WIRE_FUNCTION_NAME, "EUR");
}

private List<ProductSummaryItem> getPaymentArrangements(String businessFunction, String currency) {
return Arrays.stream(getProductSummaryContextArrangements(new ProductSummaryQueryParameters()
.withBusinessFunction(businessFunction)
.withResourceName(PAYMENTS_RESOURCE_NAME)
.withPrivilege(PRIVILEGE_CREATE)
.withDebitAccount(true)
Expand All @@ -125,7 +133,9 @@ public List<ProductSummaryItem> getUSForeignWireArrangements() {
.then()
.statusCode(SC_OK)
.extract()
.as(ProductSummaryItem[].class));
.as(ProductSummaryItem[].class))
.filter(arrangement -> currency.equals(arrangement.getCurrency()))
.collect(Collectors.toList());
}

private Response getProductSummaryContextArrangements(ProductSummaryQueryParameters queryParameters) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -148,8 +148,9 @@ private void assignCurrencyBoundPolicies(String externalServiceAgreementId, int
List<IntegrationPolicyAssignmentRequest> generatedItems;

if (numberOfUsers < 3) {
generatedItems = getPolicyAssignmentsBasedOnZeroApprovalPolicyOnly(
externalServiceAgreementId, resource, functionName);
generatedItems = getZeroApprovalCurrencyBoundPolicyAssignments(
externalServiceAgreementId, resource, functionName,
determineCurrencyForFunction(functionName));
} else {
generatedItems = getCurrencyPolicyAssignments(externalServiceAgreementId, resource,
functionName, determineCurrencyForFunction(functionName));
Expand Down Expand Up @@ -225,6 +226,18 @@ private List<IntegrationPolicyAssignmentRequest> getPolicyAssignmentsBasedOnZero
singletonList(createPolicyAssignmentRequestBounds(policyZeroId, null))));
}

private List<IntegrationPolicyAssignmentRequest> getZeroApprovalCurrencyBoundPolicyAssignments(
String externalServiceAgreementId, String resource, String businessFunction, String currencyCode) {
Currency upperBound = new Currency()
.withCurrencyCode(currencyCode)
.withAmount(UPPER_BOUND_HUNDRED);
return singletonList(createPolicyAssignmentRequest(
externalServiceAgreementId,
resource,
businessFunction,
singletonList(createPolicyAssignmentRequestBounds(policyZeroId, upperBound))));
}

private List<IntegrationPolicyAssignmentRequest> getPolicyAssignments(
String externalServiceAgreementId, String resource, String businessFunction) {
return singletonList(createPolicyAssignmentRequest(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,19 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.IntStream;

import static com.backbase.ct.bbfuel.data.CommonConstants.PAYMENT_TYPE_ACH_DEBIT;
import static com.backbase.ct.bbfuel.data.CommonConstants.PAYMENT_TYPE_FCY_WIRE;
import static com.backbase.ct.bbfuel.data.CommonConstants.PAYMENT_TYPE_SEPA_CREDIT_TRANSFER;
import static com.backbase.ct.bbfuel.data.CommonConstants.PAYMENT_TYPE_US_CROSS_BORDER_WIRE;
import static com.backbase.ct.bbfuel.data.CommonConstants.PAYMENT_TYPE_US_DOMESTIC_WIRE;
import static com.backbase.ct.bbfuel.data.CommonConstants.PAYMENT_TYPE_US_FOREIGN_WIRE;
import static com.backbase.ct.bbfuel.data.CommonConstants.PAYMENT_TYPE_US_FX_FOREIGN_WIRE;
import static com.backbase.ct.bbfuel.data.CommonConstants.PROPERTY_PAYMENTS_OOTB_TYPES;
import static com.backbase.ct.bbfuel.util.CommonHelpers.getRandomFromList;
import static org.apache.http.HttpStatus.SC_ACCEPTED;
Expand All @@ -43,47 +49,76 @@ public void ingestPaymentOrders(String externalUserId) {

loginRestClient.login(externalUserId, externalUserId);
userContextPresentationRestClient.selectContextBasedOnMasterServiceAgreement();
List<ProductSummaryItem> sepaCtArrangements = productSummaryPresentationRestClient
.getSepaCtArrangements();
List<ProductSummaryItem> usDomesticWireArrangements = productSummaryPresentationRestClient
.getUsDomesticWireArrangements();
List<ProductSummaryItem> achDebitArrangements = productSummaryPresentationRestClient
.getAchDebitArrangements();
List<com.backbase.dbs.arrangement.client.api.v2.model.ProductSummaryItem> usForeignWireArrangements = productSummaryPresentationRestClient
.getUSForeignWireArrangements();

Map<String, List<ProductSummaryItem>> arrangementsByPaymentType = new HashMap<>();
for (String paymentType : ootbPaymentTypes) {
List<ProductSummaryItem> arrangements = getArrangementsForPaymentType(paymentType);
if (!isEmpty(arrangements)) {
arrangementsByPaymentType.put(paymentType, arrangements);
} else {
log.warn("No debit arrangements available for configured payment type [{}]", paymentType);
}
}

if (arrangementsByPaymentType.isEmpty()) {
log.warn("Payment order ingestion skipped for user [{}]: no arrangements found for any configured type",
externalUserId);
return;
}

List<String> availablePaymentTypes = new ArrayList<>(arrangementsByPaymentType.keySet());

for (String paymentType : availablePaymentTypes) {
ingestPaymentOrder(externalUserId, paymentType, arrangementsByPaymentType.get(paymentType));
}

int randomAmount = CommonHelpers
.generateRandomNumberInRange(globalProperties.getInt(CommonConstants.PROPERTY_PAYMENTS_MIN),
globalProperties.getInt(CommonConstants.PROPERTY_PAYMENTS_MAX));

if (!isEmpty(sepaCtArrangements) && !isEmpty(usDomesticWireArrangements)
&& !isEmpty(achDebitArrangements) && !isEmpty(usForeignWireArrangements)) {

IntStream.range(0, randomAmount).parallel().forEach(randomNumber -> {
String paymentType = getRandomFromList(ootbPaymentTypes);
ProductSummaryItem randomArrangement;

if (PAYMENT_TYPE_SEPA_CREDIT_TRANSFER.equals(paymentType)) {
randomArrangement = getRandomFromList(sepaCtArrangements);
} else if (PAYMENT_TYPE_ACH_DEBIT.equals(paymentType)) {
randomArrangement = getRandomFromList(achDebitArrangements);
} else if (PAYMENT_TYPE_US_FOREIGN_WIRE.equals(paymentType)) {
randomArrangement = getRandomFromList(usForeignWireArrangements);
} else if (PAYMENT_TYPE_US_DOMESTIC_WIRE.equals(paymentType)) {
randomArrangement = getRandomFromList(usDomesticWireArrangements);
} else {
throw new IllegalArgumentException("Unknown payment type " + paymentType);
}

InitiatePaymentOrderWithId initiatePaymentOrder = PaymentsDataGenerator
.generateInitiatePaymentOrder(randomArrangement.getId(), randomArrangement.getCurrency(), paymentType);
paymentOrderPresentationRestClient.initiatePaymentOrder(initiatePaymentOrder)
.then()
.statusCode(SC_ACCEPTED);

log.info("Payment order ingested for originator account [{}] for user [{}]",
initiatePaymentOrder.getOriginatorAccount().getIdentification().getIdentification(), externalUserId);
});
int additionalOrders = Math.max(0, randomAmount - availablePaymentTypes.size());
IntStream.range(0, additionalOrders).parallel().forEach(randomNumber -> {
String paymentType = getRandomFromList(availablePaymentTypes);
ingestPaymentOrder(externalUserId, paymentType, arrangementsByPaymentType.get(paymentType));
});
}

private void ingestPaymentOrder(String externalUserId, String paymentType,
List<ProductSummaryItem> arrangements) {
ProductSummaryItem randomArrangement = getRandomFromList(arrangements);

InitiatePaymentOrderWithId initiatePaymentOrder = PaymentsDataGenerator
.generateInitiatePaymentOrder(randomArrangement.getId(), randomArrangement.getCurrency(), paymentType);
paymentOrderPresentationRestClient.initiatePaymentOrder(initiatePaymentOrder)
.then()
.statusCode(SC_ACCEPTED);

log.info("Payment order ingested for originator account [{}] for user [{}]",
initiatePaymentOrder.getOriginatorAccount().getIdentification().getIdentification(), externalUserId);
}

private List<ProductSummaryItem> getArrangementsForPaymentType(String paymentType) {
if (PAYMENT_TYPE_SEPA_CREDIT_TRANSFER.equals(paymentType)) {
return productSummaryPresentationRestClient.getSepaCtArrangements();
}
if (PAYMENT_TYPE_ACH_DEBIT.equals(paymentType)) {
return productSummaryPresentationRestClient.getAchDebitArrangements();
}
if (PAYMENT_TYPE_US_FOREIGN_WIRE.equals(paymentType)) {
return productSummaryPresentationRestClient.getUSForeignWireArrangements();
}
if (PAYMENT_TYPE_US_DOMESTIC_WIRE.equals(paymentType)) {
return productSummaryPresentationRestClient.getUsDomesticWireArrangements();
}
if (PAYMENT_TYPE_US_CROSS_BORDER_WIRE.equals(paymentType)) {
return productSummaryPresentationRestClient.getUsCrossBorderWireArrangements();
}
if (PAYMENT_TYPE_US_FX_FOREIGN_WIRE.equals(paymentType)) {
return productSummaryPresentationRestClient.getUsFxForeignWireArrangements();
}
if (PAYMENT_TYPE_FCY_WIRE.equals(paymentType)) {
return productSummaryPresentationRestClient.getFcyWireArrangements();
}
throw new IllegalArgumentException("Unknown payment type " + paymentType);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ private CommonConstants() {
public static final String US_DOMESTIC_WIRE_FUNCTION_NAME = "US Domestic Wire";
public static final String US_DOMESTIC_WIRE_INTRACOMPANY_FUNCTION_NAME = "US Domestic Wire - Intracompany";
public static final String US_FOREIGN_WIRE_FUNCTION_NAME = "US Foreign Wire";
public static final String US_CROSS_BORDER_WIRE_FUNCTION_NAME = "US Cross Border Wire";
public static final String US_FX_FOREIGN_WIRE_FUNCTION_NAME = "US FX Foreign Wire";
public static final String FCY_WIRE_FUNCTION_NAME = "FCY Wire";
public static final String PRODUCT_SUMMARY_RESOURCE_NAME = "Product Summary";
public static final String PAYMENTS_RESOURCE_NAME = "Payments";
public static final String CONTACTS_RESOURCE_NAME = "Contacts";
Expand Down Expand Up @@ -116,6 +119,9 @@ private CommonConstants() {
public static final String PAYMENT_TYPE_US_DOMESTIC_WIRE = "US_DOMESTIC_WIRE";
public static final String PAYMENT_TYPE_ACH_DEBIT = "ACH_DEBIT";
public static final String PAYMENT_TYPE_US_FOREIGN_WIRE = "US_FOREIGN_WIRE";
public static final String PAYMENT_TYPE_US_CROSS_BORDER_WIRE = "US_CROSS_BORDER_WIRE";
public static final String PAYMENT_TYPE_US_FX_FOREIGN_WIRE = "US_FX_FOREIGN_WIRE";
public static final String PAYMENT_TYPE_FCY_WIRE = "FCY_WIRE";
public static final String PROPERTY_PAYMENTS_OOTB_TYPES = "payments.ootb.types";

// Contacts
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.backbase.ct.bbfuel.data;

import static com.backbase.ct.bbfuel.data.CommonConstants.PAYMENT_TYPE_ACH_DEBIT;
import static com.backbase.ct.bbfuel.data.CommonConstants.PAYMENT_TYPE_FCY_WIRE;
import static com.backbase.ct.bbfuel.data.CommonConstants.PAYMENT_TYPE_SEPA_CREDIT_TRANSFER;
import static com.backbase.ct.bbfuel.data.CommonConstants.PAYMENT_TYPE_US_FX_FOREIGN_WIRE;
import static com.backbase.ct.bbfuel.util.CommonHelpers.getRandomFromEnumValues;
import static com.backbase.ct.bbfuel.util.CommonHelpers.getRandomFromList;

Expand Down Expand Up @@ -72,6 +74,12 @@ public static InitiatePaymentOrderWithId generateInitiatePaymentOrder(String ori
counterpartyBank = generateCounterpartyBank();
currency.setCurrencyCode(originatorArrangementCurrency);
identification = generateBbanIdentification();
} else if (PAYMENT_TYPE_US_FX_FOREIGN_WIRE.equals(paymentType)
|| PAYMENT_TYPE_FCY_WIRE.equals(paymentType)) {
counterpartyBank = generateCounterpartyBank();
correspondentBank = generateCorrespondentBank();
currency.setCurrencyCode(originatorArrangementCurrency);
identification = generateBbanIdentification();
} else {
counterpartyBank = generateCounterpartyBank();
correspondentBank = generateCorrespondentBank();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,10 @@
import static com.backbase.ct.bbfuel.data.CommonConstants.SEPA_CT_INTRACOMPANY_FUNCTION_NAME;
import static com.backbase.ct.bbfuel.data.CommonConstants.US_DOMESTIC_WIRE_FUNCTION_NAME;
import static com.backbase.ct.bbfuel.data.CommonConstants.US_DOMESTIC_WIRE_INTRACOMPANY_FUNCTION_NAME;
import static com.backbase.ct.bbfuel.data.CommonConstants.FCY_WIRE_FUNCTION_NAME;
import static com.backbase.ct.bbfuel.data.CommonConstants.US_CROSS_BORDER_WIRE_FUNCTION_NAME;
import static com.backbase.ct.bbfuel.data.CommonConstants.US_FOREIGN_WIRE_FUNCTION_NAME;
import static com.backbase.ct.bbfuel.data.CommonConstants.US_FX_FOREIGN_WIRE_FUNCTION_NAME;
import static java.util.Arrays.asList;
import static java.util.Collections.unmodifiableList;

Expand All @@ -37,6 +40,9 @@ public final class PaymentsFunctionService {
US_DOMESTIC_WIRE_FUNCTION_NAME,
US_DOMESTIC_WIRE_INTRACOMPANY_FUNCTION_NAME,
US_FOREIGN_WIRE_FUNCTION_NAME,
US_CROSS_BORDER_WIRE_FUNCTION_NAME,
US_FX_FOREIGN_WIRE_FUNCTION_NAME,
FCY_WIRE_FUNCTION_NAME,
ACH_DEBIT_FUNCTION_NAME));

/**
Expand All @@ -55,14 +61,21 @@ public final class PaymentsFunctionService {
);

/**
* Simple logic is used to determine the currency from the business function name.
* If it contains SEPA (case insensitive) it is EUR otherwise USD.
* Determines the currency from the business function name.
* SEPA, US FX Foreign Wire, and FCY Wire use EUR; other payment functions use USD.
*
* @param functionName business function name
* @return currency
*/
public static String determineCurrencyForFunction(String functionName) {
return functionName.toUpperCase().contains("SEPA") ? "EUR" : "USD";
if (functionName.toUpperCase().contains("SEPA")) {
return "EUR";
}
if (US_FX_FOREIGN_WIRE_FUNCTION_NAME.equals(functionName)
|| FCY_WIRE_FUNCTION_NAME.equals(functionName)) {
return "EUR";
}
return "USD";
}

}
Loading
Loading