Skip to content
Draft
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
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public class GlobalConfigurationStepDef {
private FineractFeignClient fineractClient;

// restore the default even when a scenario fails mid-way, so the submitted-date setting cannot leak
@After("@WorkingCapitalLoanChargeAccrualFeature")
@After("@WorkingCapitalLoanChargeAccrualFeature or @WorkingCapitalTransactionSummaryReportFeature")
public void restoreChargeAccrualDateConfig() {
globalConfigurationHelper.setGlobalConfigValueString("charge-accrual-date", "due-date");
globalConfigurationHelper.setGlobalConfigValueString("wcl-charge-accrual-time", "eod");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3397,6 +3397,19 @@ public void writeOffLoan(String transactionDate, String writeOffReason) {
testContext().set(TestContextKey.LOAN_WRITE_OFF_RESPONSE, writeOffResponse);
}

@And("Admin makes a recovery payment of {double} on the loan on {string}")
public void makeRecoveryPayment(final double transactionAmount, final String transactionDate) {
final long loanId = getLoanId();
final PostLoansLoanIdTransactionsRequest recoveryRequest = new PostLoansLoanIdTransactionsRequest()//
.transactionDate(transactionDate)//
.transactionAmount(transactionAmount)//
.dateFormat(DATE_FORMAT)//
.locale(DEFAULT_LOCALE);

ok(() -> fineractClient.loanTransactions().handleCommandsLoanTransaction(loanId, recoveryRequest,
Map.of("command", "recoverypayment")));
}

@Then("Write-off transaction is not possible on {string}")
public void writeOffFailure(final String transactionDate) {
final long loanId = getLoanId();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,14 @@
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import lombok.RequiredArgsConstructor;
import org.apache.fineract.client.feign.FineractFeignClient;
import org.apache.fineract.client.models.PostOfficesResponse;
Expand All @@ -44,6 +47,8 @@ public class ReportingStepDef extends AbstractStepDef {

private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd MMMM yyyy", Locale.ENGLISH);
private static final String TRIAL_BALANCE_REPORT = "Trial Balance Summary Report with Asset Owner";
private static final String WC_TRANSACTION_SUMMARY_REPORT = "Transaction Summary Report for Working Capital Loans";
private static final String WC_TRANSACTION_SUMMARY_REPORT_WITH_ASSET_OWNER = "Transaction Summary Report with Asset Owner for Working Capital Loans";
private final FineractFeignClient fineractClient;

@Then("Transaction Summary Report for date {string} has the following data:")
Expand Down Expand Up @@ -72,6 +77,22 @@ public void transactionSummaryReportWithAssetOwnerColumnEmpty(final String dateS
verifyColumnNullability("Transaction Summary Report with Asset Owner", dateStr, columnName, true);
}

@Then("Transaction Summary Report for Working Capital Loans for date {string} has the following data:")
public void transactionSummaryReportForWorkingCapitalLoansHasData(final String dateStr, final DataTable dataTable) {
verifyReportDataWithEmptyValues(WC_TRANSACTION_SUMMARY_REPORT, dateStr, dataTable);
}

@Then("Transaction Summary Report with Asset Owner for Working Capital Loans for date {string} has the following data:")
public void transactionSummaryReportWithAssetOwnerForWorkingCapitalLoansHasData(final String dateStr, final DataTable dataTable) {
verifyReportDataWithEmptyValues(WC_TRANSACTION_SUMMARY_REPORT_WITH_ASSET_OWNER, dateStr, dataTable);
}

@Then("Transaction Summary Report with Asset Owner for Working Capital Loans for date {string} has originatorId, asset owner externalId and the following data:")
public void transactionSummaryReportWithAssetOwnerForWorkingCapitalLoansHasDataWithOriginatorId(final String dateStr,
final DataTable dataTable) {
verifyReportDataWithOwnerExternalIdAndOriginatorId(WC_TRANSACTION_SUMMARY_REPORT_WITH_ASSET_OWNER, dateStr, dataTable);
}

@Then("Trial Balance Summary Report with Asset Owner for date {string} has originatorId, asset owner externalId and the following data:")
public void trialBalanceSummaryReportWithAssetOwnerHasDataWithOwnerExternalIdAndOriginatorId(final String dateStr,
final DataTable dataTable) {
Expand Down Expand Up @@ -106,6 +127,15 @@ private void verifyReportData(final String reportName, final String dateStr, fin
verifyReportData(reportName, response, expected, headers);
}

private void verifyReportDataWithEmptyValues(final String reportName, final String dateStr, final DataTable dataTable) {
final RunReportsResponse response = executeReport(reportName, dateStr);

final List<List<String>> expected = dataTable.asLists();
final List<String> headers = expected.getFirst();

verifyReportDataWithEmptyValues(reportName, response, expected, headers);
}

private List<List<String>> verifyReportDataHeaders(final String reportName, final RunReportsResponse response,
final List<List<String>> expected, List<String> headers) {
assertThat(response.getColumnHeaders()).isNotNull();
Expand Down Expand Up @@ -204,6 +234,11 @@ private void verifyBalanceReportData(final String reportName, final RunReportsRe
private void verifyReportDataWithOwnerExternalIdAndOriginatorId(final String reportName, final String dateStr,
final DataTable dataTable) {
String originatorExternalId = testContext().get(TestContextKey.ORIGINATOR_EXTERNAL_ID);
String secondOriginatorExternalId = testContext().get(TestContextKey.ORIGINATOR_SECOND_EXTERNAL_ID);
// "originator_external_ids" = every originator created in the scenario, rendered like the report column:
// sorted, comma-separated. The ids are UUIDs, so the Java sort order matches the DB collation of STRING_AGG.
String allOriginatorExternalIds = Stream.of(originatorExternalId, secondOriginatorExternalId).filter(Objects::nonNull).sorted()
.collect(Collectors.joining(", "));
String ownerExternalId = testContext().get(TestContextKey.ASSET_EXTERNALIZATION_OWNER_EXTERNAL_ID);
String previousOwnerExternalId = testContext().get(TestContextKey.ASSET_EXTERNALIZATION_PREVIOUS_OWNER_EXTERNAL_ID);

Expand Down Expand Up @@ -232,6 +267,7 @@ private void verifyReportDataWithOwnerExternalIdAndOriginatorId(final String rep
expectedRow.set(index, originatorExternalId);
}
}
Collections.replaceAll(expectedRow, "originator_external_ids", allOriginatorExternalIds);
});
verifyReportDataWithEmptyValues(reportName, response, expected, headers);
}
Expand Down
Loading
Loading