diff --git a/fineract-cob/src/main/java/org/apache/fineract/cob/service/BusinessStepMapper.java b/fineract-cob/src/main/java/org/apache/fineract/cob/service/BusinessStepMapper.java index 56c6b8f7a..e35dbbecc 100644 --- a/fineract-cob/src/main/java/org/apache/fineract/cob/service/BusinessStepMapper.java +++ b/fineract-cob/src/main/java/org/apache/fineract/cob/service/BusinessStepMapper.java @@ -24,12 +24,11 @@ import org.apache.fineract.cob.domain.BatchBusinessStep; import org.apache.fineract.infrastructure.core.config.MapstructMapperConfig; import org.mapstruct.Mapper; import org.mapstruct.Mapping; -import org.mapstruct.Mappings; @Mapper(config = MapstructMapperConfig.class) public interface BusinessStepMapper { - @Mappings({ @Mapping(target = "order", source = "source.stepOrder") }) + @Mapping(target = "order", source = "source.stepOrder") BusinessStep map(BatchBusinessStep source); List map(List source); diff --git a/fineract-core/src/main/java/org/apache/fineract/batch/api/BatchApiResource.java b/fineract-core/src/main/java/org/apache/fineract/batch/api/BatchApiResource.java index 491b13b44..26b1bcb29 100644 --- a/fineract-core/src/main/java/org/apache/fineract/batch/api/BatchApiResource.java +++ b/fineract-core/src/main/java/org/apache/fineract/batch/api/BatchApiResource.java @@ -25,7 +25,6 @@ import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.parameters.RequestBody; import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.ws.rs.Consumes; import jakarta.ws.rs.DefaultValue; @@ -63,13 +62,14 @@ import org.springframework.stereotype.Component; */ @Path("/v1/batches") @Component -@Tag(name = "Batch API", description = "The Apache Fineract Batch API enables a consumer to access significant amounts of data in a single call or to make changes to several objects at once. Batching allows a consumer to pass instructions for several operations in a single HTTP request. A consumer can also specify dependencies between related operations. Once all operations have been completed, a consolidated response will be passed back and the HTTP connection will be closed.\n" - + "\n" - + "The Batch API takes in an array of logical HTTP requests represented as JSON arrays - each request has a requestId (the id of a request used to specify the sequence and as a dependency between requests), a method (corresponding to HTTP method GET/PUT/POST/DELETE etc.), a relativeUrl (the portion of the URL after https://example.org/api/v2/), optional headers array (corresponding to HTTP headers), optional reference parameter if a request is dependent on another request and an optional body (for POST and PUT requests). The Batch API returns an array of logical HTTP responses represented as JSON arrays - each response has a requestId, a status code, an optional headers array and an optional body (which is a JSON encoded string).\n" - + "\n" - + "Batch API uses Json Path to handle dependent parameters. For example, if request '2' is referencing request '1' and in the \"body\" or in \"relativeUrl\" of request '2', there is a dependent parameter (which will look like \"$.parameter_name\"), then Batch API will internally substitute this dependent parameter from the response body of request '1'.\n" - + "\n" - + "Batch API is able to handle deeply nested dependent requests as well nested parameters. As shown in the example, requests are dependent on each other as, 1<--2<--6, i.e a nested dependency, where request '6' is not directly dependent on request '1' but still it is one of the nested child of request '1'. In the same way Batch API could handle a deeply nested dependent value, such as {..[..{..,$.parameter_name,..}..]}.") +@Tag(name = "Batch API", description = """ + The Apache Fineract Batch API enables a consumer to access significant amounts of data in a single call or to make changes to several objects at once. Batching allows a consumer to pass instructions for several operations in a single HTTP request. A consumer can also specify dependencies between related operations. Once all operations have been completed, a consolidated response will be passed back and the HTTP connection will be closed. + + The Batch API takes in an array of logical HTTP requests represented as JSON arrays - each request has a requestId (the id of a request used to specify the sequence and as a dependency between requests), a method (corresponding to HTTP method GET/PUT/POST/DELETE etc.), a relativeUrl (the portion of the URL after https://example.org/api/v2/), optional headers array (corresponding to HTTP headers), optional reference parameter if a request is dependent on another request and an optional body (for POST and PUT requests). The Batch API returns an array of logical HTTP responses represented as JSON arrays - each response has a requestId, a status code, an optional headers array and an optional body (which is a JSON encoded string). + + Batch API uses Json Path to handle dependent parameters. For example, if request '2' is referencing request '1' and in the "body" or in "relativeUrl" of request '2', there is a dependent parameter (which will look like "$.parameter_name"), then Batch API will internally substitute this dependent parameter from the response body of request '1'. + + Batch API is able to handle deeply nested dependent requests as well nested parameters. As shown in the example, requests are dependent on each other as, 1<--2<--6, i.e a nested dependency, where request '6' is not directly dependent on request '1' but still it is one of the nested child of request '1'. In the same way Batch API could handle a deeply nested dependent value, such as {..[..{..,$.parameter_name,..}..]}.""") @RequiredArgsConstructor public class BatchApiResource { @@ -88,12 +88,12 @@ public class BatchApiResource { @POST @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) - @Operation(summary = "Batch requests in a single transaction", description = "The Apache Fineract Batch API is also capable of executing all the requests in a single transaction, by setting a Query Parameter, \"enclosingTransaction=true\". So, if one or more of the requests in a batch returns an erroneous response all of the Data base transactions made by other successful requests will be rolled back.\n" - + "\n" - + "If there has been a rollback in a transaction then a single response will be provided, with a '400' status code and a body consisting of the error details of the first failed request.") + @Operation(summary = "Batch requests in a single transaction", description = """ + The Apache Fineract Batch API is also capable of executing all the requests in a single transaction, by setting a Query Parameter, "enclosingTransaction=true". So, if one or more of the requests in a batch returns an erroneous response all of the Data base transactions made by other successful requests will be rolled back. + + If there has been a rollback in a transaction then a single response will be provided, with a '400' status code and a body consisting of the error details of the first failed request.""") @RequestBody(required = true, content = @Content(array = @ArraySchema(schema = @Schema(implementation = BatchRequest.class, description = "request body")))) - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Success", content = @Content(array = @ArraySchema(schema = @Schema(implementation = BatchResponse.class)))) }) + @ApiResponse(responseCode = "200", description = "Success", content = @Content(array = @ArraySchema(schema = @Schema(implementation = BatchResponse.class)))) public List handleBatchRequests( @DefaultValue("false") @QueryParam("enclosingTransaction") @Parameter(description = "enclosingTransaction", required = false) final boolean enclosingTransaction, @Parameter(hidden = true) List requestList, @Context UriInfo uriInfo) { diff --git a/fineract-core/src/main/java/org/apache/fineract/batch/serialization/BatchRequestJsonHelper.java b/fineract-core/src/main/java/org/apache/fineract/batch/serialization/BatchRequestJsonHelper.java index 42071bb0f..0b73d2b5d 100644 --- a/fineract-core/src/main/java/org/apache/fineract/batch/serialization/BatchRequestJsonHelper.java +++ b/fineract-core/src/main/java/org/apache/fineract/batch/serialization/BatchRequestJsonHelper.java @@ -45,7 +45,6 @@ public class BatchRequestJsonHelper extends FromJsonHelper { */ public List extractList(final String json) { final Type listType = new TypeToken>() {}.getType(); - final List requests = super.getGsonConverter().fromJson(json, listType); - return requests; + return super.getGsonConverter().fromJson(json, listType); } } diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/bulkimport/data/GlobalEntityType.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/bulkimport/data/GlobalEntityType.java index 00b26f810..5476e0cf6 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/bulkimport/data/GlobalEntityType.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/bulkimport/data/GlobalEntityType.java @@ -20,7 +20,9 @@ package org.apache.fineract.infrastructure.bulkimport.data; import java.util.HashMap; import java.util.Map; +import lombok.Getter; +@Getter public enum GlobalEntityType { INVALID(0, "invalid"), // @@ -91,27 +93,17 @@ public enum GlobalEntityType { this.code = code; } - public Integer getValue() { - return this.value; - } - - public String getCode() { - return this.code; - } - public static GlobalEntityType fromInt(final int i) { - final GlobalEntityType entityType = intToEnumMap.get(Integer.valueOf(i)); - return entityType; + return intToEnumMap.get(i); } public static GlobalEntityType fromCode(final String key) { - final GlobalEntityType entityType = stringToEnumMap.get(key); - return entityType; + return stringToEnumMap.get(key); } @Override public String toString() { - return name().toString(); + return name(); } } diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/businessdate/mapper/BusinessDateMapper.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/businessdate/mapper/BusinessDateMapper.java index 9e678f0c9..4f39c4b47 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/businessdate/mapper/BusinessDateMapper.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/businessdate/mapper/BusinessDateMapper.java @@ -27,12 +27,12 @@ import org.apache.fineract.infrastructure.businessdate.domain.BusinessDate; import org.apache.fineract.infrastructure.core.config.MapstructMapperConfig; import org.mapstruct.Mapper; import org.mapstruct.Mapping; -import org.mapstruct.Mappings; @Mapper(config = MapstructMapperConfig.class) public interface BusinessDateMapper { - @Mappings({ @Mapping(target = "description", source = "type.description"), @Mapping(target = "changes", ignore = true) }) + @Mapping(target = "description", source = "type.description") + @Mapping(target = "changes", ignore = true) BusinessDateDTO mapEntity(BusinessDate source); List mapEntity(List sources); diff --git a/fineract-core/src/main/java/org/apache/fineract/organisation/monetary/domain/ApplicationCurrencyRepositoryWrapper.java b/fineract-core/src/main/java/org/apache/fineract/organisation/monetary/domain/ApplicationCurrencyRepositoryWrapper.java index 94303ad84..a9697be7e 100644 --- a/fineract-core/src/main/java/org/apache/fineract/organisation/monetary/domain/ApplicationCurrencyRepositoryWrapper.java +++ b/fineract-core/src/main/java/org/apache/fineract/organisation/monetary/domain/ApplicationCurrencyRepositoryWrapper.java @@ -50,10 +50,7 @@ public class ApplicationCurrencyRepositoryWrapper { throw new CurrencyNotFoundException(currency.getCode()); } - final ApplicationCurrency applicationCurrency = ApplicationCurrency.from(defaultApplicationCurrency, - currency.getDigitsAfterDecimal(), currency.getInMultiplesOf()); - - return applicationCurrency; + return ApplicationCurrency.from(defaultApplicationCurrency, currency.getDigitsAfterDecimal(), currency.getInMultiplesOf()); } /** diff --git a/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/AnnualCompoundingPeriod.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/AnnualCompoundingPeriod.java index 45ce4b6e0..58951b8dc 100644 --- a/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/AnnualCompoundingPeriod.java +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/AnnualCompoundingPeriod.java @@ -72,7 +72,7 @@ public final class AnnualCompoundingPeriod implements CompoundingPeriod { final BigDecimal minOverdraftForInterestCalculation) { BigDecimal cumulativeBalance = BigDecimal.ZERO; - Integer numberOfDays = Integer.valueOf(0); + Integer numberOfDays = 0; for (final EndOfDayBalance balance : this.endOfDayBalances) { final BigDecimal endOfDayCumulativeBalance = balance.cumulativeBalance(interestToCompound); @@ -126,28 +126,10 @@ public final class AnnualCompoundingPeriod implements CompoundingPeriod { daysInYear, minBalanceForInterestCalculation, overdraftInterestRateAsFraction, minOverdraftForInterestCalculation); break; - case MONTHLY: + case MONTHLY, ANNUAL, BI_ANNUAL, QUATERLY: interestOnBalanceUnrounded = balance.calculateInterestOnBalance(interestToCompound, interestRateAsFraction, daysInYear, minBalanceForInterestCalculation, overdraftInterestRateAsFraction, minOverdraftForInterestCalculation); break; - case QUATERLY: - interestOnBalanceUnrounded = balance.calculateInterestOnBalance(interestToCompound, interestRateAsFraction, daysInYear, - minBalanceForInterestCalculation, overdraftInterestRateAsFraction, minOverdraftForInterestCalculation); - break; - // case WEEKLY: - // break; - // case BIWEEKLY: - // break; - case BI_ANNUAL: - interestOnBalanceUnrounded = balance.calculateInterestOnBalance(interestToCompound, interestRateAsFraction, daysInYear, - minBalanceForInterestCalculation, overdraftInterestRateAsFraction, minOverdraftForInterestCalculation); - break; - case ANNUAL: - interestOnBalanceUnrounded = balance.calculateInterestOnBalance(interestToCompound, interestRateAsFraction, daysInYear, - minBalanceForInterestCalculation, overdraftInterestRateAsFraction, minOverdraftForInterestCalculation); - break; - // case NO_COMPOUNDING_SIMPLE_INTEREST: - // break; case INVALID: break; } diff --git a/fineract-core/src/main/java/org/apache/fineract/useradministration/data/AppUserData.java b/fineract-core/src/main/java/org/apache/fineract/useradministration/data/AppUserData.java index 6538af46d..ed5d6cec1 100644 --- a/fineract-core/src/main/java/org/apache/fineract/useradministration/data/AppUserData.java +++ b/fineract-core/src/main/java/org/apache/fineract/useradministration/data/AppUserData.java @@ -20,7 +20,10 @@ package org.apache.fineract.useradministration.data; import java.util.Collection; import java.util.List; +import java.util.Objects; import java.util.Set; +import lombok.Getter; +import lombok.Setter; import org.apache.fineract.organisation.office.data.OfficeData; import org.apache.fineract.organisation.staff.data.StaffData; import org.apache.fineract.portfolio.client.data.ClientData; @@ -43,6 +46,7 @@ public final class AppUserData { private List roles; private Boolean sendPasswordToEmail; private Long staffId; + @Getter private transient Integer rowIndex; @SuppressWarnings("unused") @@ -53,6 +57,7 @@ public final class AppUserData { private final StaffData staff; private final Boolean isSelfServiceUser; + @Setter @SuppressWarnings("unused") private Set clients; @@ -85,10 +90,6 @@ public final class AppUserData { this.clients = null; } - public Integer getRowIndex() { - return rowIndex; - } - public static AppUserData template(final AppUserData user, final Collection officesForDropdown) { return new AppUserData(user.id, user.username, user.email, user.officeId, user.officeName, user.firstname, user.lastname, user.availableRoles, user.selfServiceRoles, user.selectedRoles, officesForDropdown, user.staff, user.passwordNeverExpires, @@ -146,17 +147,11 @@ public final class AppUserData { if (this == o) { return true; } - if (o == null || !(o instanceof AppUserData)) { + if (!(o instanceof AppUserData that)) { return false; } - AppUserData that = (AppUserData) o; - - if (id != null ? !id.equals(that.id) : that.id != null) { - return false; - } - - return true; + return Objects.equals(id, that.id); } @Override @@ -164,12 +159,8 @@ public final class AppUserData { return id != null ? id.hashCode() : 0; } - public void setClients(Set clients) { - this.clients = clients; - } - public boolean isSelfServiceUser() { - return this.isSelfServiceUser == null ? false : this.isSelfServiceUser; + return this.isSelfServiceUser != null && this.isSelfServiceUser; } } diff --git a/fineract-core/src/main/java/org/apache/fineract/useradministration/domain/AppUserClientMapping.java b/fineract-core/src/main/java/org/apache/fineract/useradministration/domain/AppUserClientMapping.java index 2215f58d9..ef9a1c8cc 100644 --- a/fineract-core/src/main/java/org/apache/fineract/useradministration/domain/AppUserClientMapping.java +++ b/fineract-core/src/main/java/org/apache/fineract/useradministration/domain/AppUserClientMapping.java @@ -72,7 +72,7 @@ public class AppUserClientMapping extends AbstractPersistableCustom { AppUserClientMapping that = (AppUserClientMapping) obj; - return null == this.client.getId() ? false : this.client.getId().equals(that.client.getId()); + return null != this.client.getId() && this.client.getId().equals(that.client.getId()); } @Override diff --git a/fineract-document/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/DocumentWritePlatformServiceJpaRepositoryImpl.java b/fineract-document/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/DocumentWritePlatformServiceJpaRepositoryImpl.java index e87575d65..0ae4f5998 100644 --- a/fineract-document/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/DocumentWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-document/src/main/java/org/apache/fineract/infrastructure/documentmanagement/service/DocumentWritePlatformServiceJpaRepositoryImpl.java @@ -101,9 +101,7 @@ public class DocumentWritePlatformServiceJpaRepositoryImpl implements DocumentWr final DocumentCommand documentCommand = new DocumentCommand(null, null, entityType, entityId, name, fileName, fileSize, mimeType, description, null); - final Long documentId = createDocument(documentCommand, inputStream); - - return documentId; + return createDocument(documentCommand, inputStream); } @@ -196,7 +194,7 @@ public class DocumentWritePlatformServiceJpaRepositoryImpl implements DocumentWr @Override public String toString() { - return name().toString().toLowerCase(); + return name().toLowerCase(); } } } diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/assetexternalization/AssetExternalizationStepDef.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/assetexternalization/AssetExternalizationStepDef.java index 10b9bb20b..f98360a89 100644 --- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/assetexternalization/AssetExternalizationStepDef.java +++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/assetexternalization/AssetExternalizationStepDef.java @@ -645,11 +645,8 @@ public class AssetExternalizationStepDef extends AbstractStepDef { PageExternalTransferData transfersResponse = externalAssetOwnersApi().getTransfers(Map.of("loanId", loanId)); List content = transfersResponse.getContent(); - ExternalTransferData result = content.stream().filter(bizEvent -> bizEvent.getTransferExternalId().equals(transferExternalId)) - .toList().stream().reduce((first, second) -> second) - .orElseThrow(() -> new IllegalStateException("transfersResponse.getContent() is empty")); - - return result; + return content.stream().filter(bizEvent -> bizEvent.getTransferExternalId().equals(transferExternalId)).toList().stream() + .reduce((first, second) -> second).orElseThrow(() -> new IllegalStateException("transfersResponse.getContent() is empty")); } @Then("The asset external owner has the following OWNER Journal entries:") diff --git a/fineract-investor/src/test/java/org/apache/fineract/investor/service/ExternalAssetOwnerLoanProductAttributesWriteServiceImplTest.java b/fineract-investor/src/test/java/org/apache/fineract/investor/service/ExternalAssetOwnerLoanProductAttributesWriteServiceImplTest.java index 4a9a80052..320202275 100644 --- a/fineract-investor/src/test/java/org/apache/fineract/investor/service/ExternalAssetOwnerLoanProductAttributesWriteServiceImplTest.java +++ b/fineract-investor/src/test/java/org/apache/fineract/investor/service/ExternalAssetOwnerLoanProductAttributesWriteServiceImplTest.java @@ -21,7 +21,6 @@ package org.apache.fineract.investor.service; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -29,9 +28,9 @@ import static org.mockito.Mockito.when; import com.google.gson.JsonElement; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.Optional; +import java.util.concurrent.ThreadLocalRandom; import java.util.stream.Stream; import lombok.Setter; -import org.apache.commons.lang3.RandomStringUtils; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; @@ -107,7 +106,7 @@ public class ExternalAssetOwnerLoanProductAttributesWriteServiceImplTest { // then verify(testContext.loanProductRepository).existsById(testContext.loanProductId); - verify(testContext.externalAssetOwnerLoanProductAttributesRepository).findById(eq(command.entityId())); + verify(testContext.externalAssetOwnerLoanProductAttributesRepository).findById(command.entityId()); verify(testContext.externalAssetOwnerLoanProductAttributesRepository).saveAndFlush(loanProductAttributeArgumentCaptor.capture()); } @@ -134,7 +133,7 @@ public class ExternalAssetOwnerLoanProductAttributesWriteServiceImplTest { // then verify(testContext.loanProductRepository).existsById(testContext.loanProductId); - verify(testContext.externalAssetOwnerLoanProductAttributesRepository).findById(eq(command.entityId())); + verify(testContext.externalAssetOwnerLoanProductAttributesRepository).findById(command.entityId()); verify(testContext.externalAssetOwnerLoanProductAttributesRepository, times(0)) .saveAndFlush(loanProductAttributeArgumentCaptor.capture()); } @@ -157,7 +156,7 @@ public class ExternalAssetOwnerLoanProductAttributesWriteServiceImplTest { // then verify(testContext.loanProductRepository).existsById(testContext.loanProductId); - verify(testContext.externalAssetOwnerLoanProductAttributesRepository).findById(eq(1L)); + verify(testContext.externalAssetOwnerLoanProductAttributesRepository).findById(1L); verify(testContext.externalAssetOwnerLoanProductAttributesRepository, times(0)) .saveAndFlush(loanProductAttributeArgumentCaptor.capture()); Assertions.assertEquals(thrownException.getMessage(), "Loan product attribute with id " + 1L + " was not found"); @@ -188,7 +187,7 @@ public class ExternalAssetOwnerLoanProductAttributesWriteServiceImplTest { // then verify(testContext.loanProductRepository).existsById(testContext.loanProductId); - verify(testContext.externalAssetOwnerLoanProductAttributesRepository).findById(eq(command.entityId())); + verify(testContext.externalAssetOwnerLoanProductAttributesRepository).findById(command.entityId()); verify(testContext.externalAssetOwnerLoanProductAttributesRepository, times(0)) .saveAndFlush(loanProductAttributeArgumentCaptor.capture()); Assertions.assertEquals(thrownException.getMessage(), @@ -365,7 +364,7 @@ public class ExternalAssetOwnerLoanProductAttributesWriteServiceImplTest { private ExternalAssetOwnerLoanProductAttributesWriteServiceImpl externalAssetOwnerLoanProductAttributesWriteService; private final FromJsonHelper fromJsonHelper = new FromJsonHelper(); - private final Long loanProductId = Long.valueOf(RandomStringUtils.randomNumeric(2)); + private final Long loanProductId = ThreadLocalRandom.current().nextLong(10, 100); @Setter private String attributeKey = "SETTLEMENT_MODEL"; @Setter diff --git a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/impl/AdvancedPaymentScheduleTransactionProcessor.java b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/impl/AdvancedPaymentScheduleTransactionProcessor.java index be883e45e..584eec52f 100644 --- a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/impl/AdvancedPaymentScheduleTransactionProcessor.java +++ b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/impl/AdvancedPaymentScheduleTransactionProcessor.java @@ -3150,9 +3150,8 @@ public class AdvancedPaymentScheduleTransactionProcessor extends AbstractLoanRep .orElse(null); final List liftedLoanCharges = new ArrayList<>(); - installments.stream().filter(installment -> !installment.getDueDate().isBefore(transactionDate)).forEach(i -> { - liftedLoanCharges.addAll(getLoanChargesOfInstallment(ctx.getCharges(), i, 1)); - }); + installments.stream().filter(installment -> !installment.getDueDate().isBefore(transactionDate)) + .forEach(i -> liftedLoanCharges.addAll(getLoanChargesOfInstallment(ctx.getCharges(), i, 1))); installments.removeIf(i -> i.getInstallmentNumber() != null && !i.isDownPayment() && !i.getDueDate().isBefore(transactionDate)); @@ -3308,10 +3307,10 @@ public class AdvancedPaymentScheduleTransactionProcessor extends AbstractLoanRep private LocalDate calculateReAgedNextDate(final PeriodFrequencyType frequencyType, final LocalDate dueDate, final Integer frequencyNumber) { return switch (frequencyType) { - case DAYS -> dueDate.plusDays((long) frequencyNumber); - case WEEKS -> dueDate.plusWeeks((long) frequencyNumber); - case MONTHS -> dueDate.plusMonths((long) frequencyNumber); - case YEARS -> dueDate.plusYears((long) frequencyNumber); + case DAYS -> dueDate.plusDays(frequencyNumber); + case WEEKS -> dueDate.plusWeeks(frequencyNumber); + case MONTHS -> dueDate.plusMonths(frequencyNumber); + case YEARS -> dueDate.plusYears(frequencyNumber); default -> throw new UnsupportedOperationException(); }; } @@ -3799,10 +3798,8 @@ public class AdvancedPaymentScheduleTransactionProcessor extends AbstractLoanRep private void createChargeMappingsForInstallment(final LoanRepaymentScheduleInstallment installment, List reAgedChargeEqualAmortizationValues, Integer index) { - reAgedChargeEqualAmortizationValues.forEach(amortizationValue -> { - installment.getInstallmentCharges().add(new LoanInstallmentCharge( - amortizationValue.equalAmortizationValues.calculateValueBigDecimal(index), amortizationValue.charge, installment)); - }); + reAgedChargeEqualAmortizationValues.forEach(amortizationValue -> installment.getInstallmentCharges().add(new LoanInstallmentCharge( + amortizationValue.equalAmortizationValues.calculateValueBigDecimal(index), amortizationValue.charge, installment))); } private FirstReAgeInstallmentProps calculateFirstReAgeInstallmentProps(List installments, diff --git a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/AdvancedPaymentAllocationsValidator.java b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/AdvancedPaymentAllocationsValidator.java index 127be2034..aa8bf6088 100644 --- a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/AdvancedPaymentAllocationsValidator.java +++ b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/AdvancedPaymentAllocationsValidator.java @@ -78,9 +78,8 @@ public class AdvancedPaymentAllocationsValidator { AtomicInteger pastDueRuleInteger = new AtomicInteger(); AtomicInteger dueRuleInteger = new AtomicInteger(); AtomicInteger inAdvanceRuleInteger = new AtomicInteger(); - paymentAllocationRule.getAllocationTypes().forEach(paymentAllocationType -> { - validateAllocationType(paymentAllocationType, pastDueRuleInteger, dueRuleInteger, inAdvanceRuleInteger); - }); + paymentAllocationRule.getAllocationTypes().forEach(paymentAllocationType -> validateAllocationType(paymentAllocationType, + pastDueRuleInteger, dueRuleInteger, inAdvanceRuleInteger)); }); } @@ -122,14 +121,14 @@ public class AdvancedPaymentAllocationsValidator { } private boolean hasAtLeastOneDefaultPaymentAllocation(List rules) { - return rules != null && rules.stream() // + return rules != null && !rules.stream() // .filter(r -> PaymentAllocationTransactionType.DEFAULT.equals(r.getTransactionType())) // .toList() // - .size() > 0; + .isEmpty(); } private boolean hasLoanProductPaymentAllocationRule(List rules) { - return rules != null && rules.size() > 0; + return rules != null && !rules.isEmpty(); } private void raiseValidationError(String globalisationMessageCode, String msg) { diff --git a/fineract-progressive-loan/src/test/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/impl/AdvancedPaymentScheduleTransactionProcessorTest.java b/fineract-progressive-loan/src/test/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/impl/AdvancedPaymentScheduleTransactionProcessorTest.java index db4fa10ab..bd89375a1 100644 --- a/fineract-progressive-loan/src/test/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/impl/AdvancedPaymentScheduleTransactionProcessorTest.java +++ b/fineract-progressive-loan/src/test/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/impl/AdvancedPaymentScheduleTransactionProcessorTest.java @@ -258,12 +258,12 @@ class AdvancedPaymentScheduleTransactionProcessorTest { when(loan.getPaymentAllocationRules()).thenReturn(List.of(loanPaymentAllocationRule)); when(loanPaymentAllocationRule.getTransactionType()).thenReturn(PaymentAllocationTransactionType.DEFAULT); when(loanPaymentAllocationRule.getAllocationTypes()).thenReturn(List.of(PaymentAllocationType.DUE_PRINCIPAL)); - when(loanTransaction.isOn(eq(transactionDate))).thenReturn(true); + when(loanTransaction.isOn(transactionDate)).thenReturn(true); underTest.processLatestTransaction(loanTransaction, new TransactionCtx(currency, List.of(installment), Set.of(charge), new MoneyHolder(overpaidAmount), null)); - Mockito.verify(installment, times(1)).payFeeChargesComponent(eq(transactionDate), eq(chargeAmountMoney)); + Mockito.verify(installment, times(1)).payFeeChargesComponent(transactionDate, chargeAmountMoney); Mockito.verify(loanTransaction, times(1)).updateComponents(refEq(zero), refEq(zero), refEq(chargeAmountMoney), refEq(zero)); assertEquals(0, BigDecimal.valueOf(20).compareTo(loanTransaction.getAmount(currency).minus(chargeAmountMoney).getAmount())); assertEquals(0, chargeAmount.compareTo(installment.getFeeChargesCharged(currency).getAmount())); diff --git a/fineract-progressive-loan/src/test/java/org/apache/fineract/portfolio/loanproduct/domain/AdvancedPaymentAllocationsJsonParserTest.java b/fineract-progressive-loan/src/test/java/org/apache/fineract/portfolio/loanproduct/domain/AdvancedPaymentAllocationsJsonParserTest.java index cc51c7f51..420188ef4 100644 --- a/fineract-progressive-loan/src/test/java/org/apache/fineract/portfolio/loanproduct/domain/AdvancedPaymentAllocationsJsonParserTest.java +++ b/fineract-progressive-loan/src/test/java/org/apache/fineract/portfolio/loanproduct/domain/AdvancedPaymentAllocationsJsonParserTest.java @@ -220,18 +220,15 @@ class AdvancedPaymentAllocationsJsonParserTest { private static List> createPaymentAllocationTypeList() { AtomicInteger i = new AtomicInteger(1); - List> list = EnumSet.allOf(PaymentAllocationType.class).stream() - .map(p -> Pair.of(i.getAndIncrement(), p)).toList(); - return list; + return EnumSet.allOf(PaymentAllocationType.class).stream().map(p -> Pair.of(i.getAndIncrement(), p)).toList(); } @NonNull private JsonCommand createJsonCommand(Map jsonMap) throws JsonProcessingException { ObjectMapper objectMapper = new ObjectMapper(); String json = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonMap); - JsonCommand command = JsonCommand.from(json, JsonParser.parseString(json), fromJsonHelper, null, 1L, 2L, 3L, 4L, null, null, null, - null, null, null, null, null, null); - return command; + return JsonCommand.from(json, JsonParser.parseString(json), fromJsonHelper, null, 1L, 2L, 3L, 4L, null, null, null, null, null, + null, null, null, null); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportWorkbookPopulatorServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportWorkbookPopulatorServiceImpl.java index 4774daf5c..431712f36 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportWorkbookPopulatorServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportWorkbookPopulatorServiceImpl.java @@ -280,16 +280,14 @@ public class BulkImportWorkbookPopulatorServiceImpl implements BulkImportWorkboo return offices; } - @SuppressWarnings("unchecked") private List fetchCharges() { - return (List) this.chargeReadPlatformService.retrieveAllCharges(); + return this.chargeReadPlatformService.retrieveAllCharges(); } - @SuppressWarnings("unchecked") private List fetchStaff(final Long staffId) { List staff = null; if (staffId == null) { - staff = (List) this.staffReadPlatformService.retrieveAllStaff(null, Boolean.FALSE, null); + staff = this.staffReadPlatformService.retrieveAllStaff(null, Boolean.FALSE, null); } else { staff = new ArrayList<>(); staff.add(this.staffReadPlatformService.retrieveStaff(staffId)); @@ -308,8 +306,7 @@ public class BulkImportWorkbookPopulatorServiceImpl implements BulkImportWorkboo } private List fetchSavingsProducts() { - List savingsProducts = (List) savingsProductReadPlatformService.retrieveAll(); - return savingsProducts; + return (List) savingsProductReadPlatformService.retrieveAll(); } private WorkbookPopulator populateCenterWorkbook(Long officeId, Long staffId) { @@ -396,23 +393,19 @@ public class BulkImportWorkbookPopulatorServiceImpl implements BulkImportWorkboo } private List fetchCurrencies() { - List currencies = (List) this.currencyReadPlatformService.retrieveAllPlatformCurrencies(); - return currencies; + return this.currencyReadPlatformService.retrieveAllPlatformCurrencies(); } private List fetchPaymentTypes() { - List paymentTypeData = (List) this.paymentTypeReadPlatformService.retrieveAllPaymentTypes(); - return paymentTypeData; + return this.paymentTypeReadPlatformService.retrieveAllPaymentTypes(); } private List fetchFunds() { - List funds = (List) this.fundReadPlatformService.retrieveAllFunds(); - return funds; + return this.fundReadPlatformService.retrieveAllFunds(); } private List fetchLoanProducts() { - List loanproducts = (List) this.loanProductReadPlatformService.retrieveAllLoanProducts(); - return loanproducts; + return (List) this.loanProductReadPlatformService.retrieveAllLoanProducts(); } private List fetchGroups(Long officeId) { @@ -470,8 +463,7 @@ public class BulkImportWorkbookPopulatorServiceImpl implements BulkImportWorkboo } private List fetchGLAccounts() { - List glaccounts = this.glAccountReadPlatformService.retrieveAllGLAccounts(null, null, null, null, null, null); - return glaccounts; + return this.glAccountReadPlatformService.retrieveAllGLAccounts(null, null, null, null, null, null); } private WorkbookPopulator populateGuarantorWorkbook(Long officeId) { @@ -504,12 +496,12 @@ public class BulkImportWorkbookPopulatorServiceImpl implements BulkImportWorkboo return new OfficeWorkbookPopulator(offices); } + // TODO: officeId seems to be unused and used in getTemplate() needs to be evaluated and removed private WorkbookPopulator populateChartOfAccountsWorkbook(Long officeId) { this.context.authenticatedUser().validateHasReadPermission(TemplatePopulateImportConstants.GL_ACCOUNT_ENTITY_TYPE); List glAccounts = fetchGLAccounts(); List offices = fetchOffices(null); - return new ChartOfAccountsWorkbook(glAccounts, offices, - (List) this.currencyReadPlatformService.retrieveAllowedCurrencies()); + return new ChartOfAccountsWorkbook(glAccounts, offices, this.currencyReadPlatformService.retrieveAllowedCurrencies()); } private WorkbookPopulator populateStaffWorkbook(Long officeId) { @@ -531,8 +523,7 @@ public class BulkImportWorkbookPopulatorServiceImpl implements BulkImportWorkboo } private List fetchChargesForShares() { - List chargesForShares = (List) chargeReadPlatformService.retrieveSharesApplicableCharges(); - return chargesForShares; + return chargeReadPlatformService.retrieveSharesApplicableCharges(); } private List fetchSharedProducts() { @@ -655,8 +646,7 @@ public class BulkImportWorkbookPopulatorServiceImpl implements BulkImportWorkboo } private List fetchRoles() { - List rolesList = (List) roleReadPlatformService.retrieveAllActiveRoles(); - return rolesList; + return (List) roleReadPlatformService.retrieveAllActiveRoles(); } private WorkbookPopulator populateFixedDepositTransactionsWorkbook(Long officeId) { diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/BatchApiTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/BatchApiTest.java index f6e2c161c..888e493c3 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/BatchApiTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/BatchApiTest.java @@ -40,8 +40,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.concurrent.ThreadLocalRandom; import org.apache.commons.lang3.RandomStringUtils; -import org.apache.commons.lang3.RandomUtils; import org.apache.fineract.batch.command.internal.AdjustLoanTransactionCommandStrategy; import org.apache.fineract.batch.command.internal.CreateTransactionLoanCommandStrategy; import org.apache.fineract.batch.command.internal.GetDatatableEntryByAppTableIdAndDataTableIdCommandStrategy; @@ -413,7 +413,7 @@ public class BatchApiTest extends BaseLoanIntegrationTest { .withInterestTypeAsDecliningBalance() // .currencyDetails("0", "100").build(null); - final Long applyLoanRequestId = Long.valueOf(RandomStringUtils.randomNumeric(4)); + final Long applyLoanRequestId = ThreadLocalRandom.current().nextLong(1000, 10_000); final Long approveLoanRequestId = applyLoanRequestId + 1; final Long disburseLoanRequestId = approveLoanRequestId + 1; final Long createChargeRequestId = disburseLoanRequestId + 1; @@ -474,7 +474,7 @@ public class BatchApiTest extends BaseLoanIntegrationTest { .withInterestTypeAsDecliningBalance() // .currencyDetails("0", "100").build(null); - final Long applyLoanRequestId = Long.valueOf(RandomStringUtils.randomNumeric(4)); + final Long applyLoanRequestId = ThreadLocalRandom.current().nextLong(1000, 10_000); final Long approveLoanRequestId = applyLoanRequestId + 1; final Long disburseLoanRequestId = approveLoanRequestId + 1; final Long createChargeRequestId = disburseLoanRequestId + 1; @@ -1671,7 +1671,7 @@ public class BatchApiTest extends BaseLoanIntegrationTest { final Integer productId = new LoanTransactionHelper(this.requestSpec, this.responseSpec).getLoanProductId(loanProductJSON); final LocalDate date = LocalDate.now(Utils.getZoneIdOfTenant()); - final Long applyLoanRequestId = Long.valueOf(RandomStringUtils.randomNumeric(4)); + final Long applyLoanRequestId = ThreadLocalRandom.current().nextLong(1000, 10_000); final Long approveLoanRequestId = applyLoanRequestId + 1; final Long disburseLoanRequestId = approveLoanRequestId + 1; final Long getLoanBeforeTxnRequestId = disburseLoanRequestId + 1; @@ -2275,7 +2275,7 @@ public class BatchApiTest extends BaseLoanIntegrationTest { .withInterestTypeAsDecliningBalance() // .currencyDetails("0", "100").build(null); - final Long applyLoanRequestId = RandomUtils.nextLong(100, 1000); + final Long applyLoanRequestId = ThreadLocalRandom.current().nextLong(100, 1000); final Long approveLoanRequestId = applyLoanRequestId + 1; final Long disburseLoanRequestId = approveLoanRequestId + 1; final Long updateLoanRequestId = disburseLoanRequestId + 1; @@ -2332,7 +2332,7 @@ public class BatchApiTest extends BaseLoanIntegrationTest { .withInterestTypeAsDecliningBalance() // .currencyDetails("0", "100").build(null); - final Long applyLoanRequestId = RandomUtils.nextLong(100, 1000); + final long applyLoanRequestId = ThreadLocalRandom.current().nextLong(100, 1000); final Long approveLoanRequestId = applyLoanRequestId + 1; final Long disburseLoanRequestId = approveLoanRequestId + 1; final Long updateLoanRequestId = disburseLoanRequestId + 1; @@ -2399,7 +2399,7 @@ public class BatchApiTest extends BaseLoanIntegrationTest { .withInterestTypeAsDecliningBalance() // .currencyDetails("0", "100").build(null); - final Long applyLoanRequestId = RandomUtils.nextLong(100, 1000); + final long applyLoanRequestId = ThreadLocalRandom.current().nextLong(100, 1000); final Long approveLoanRequestId = applyLoanRequestId + 1; final Long disburseLoanRequestId = approveLoanRequestId + 1; final Long getLoanRequestId = disburseLoanRequestId + 1; @@ -2481,7 +2481,7 @@ public class BatchApiTest extends BaseLoanIntegrationTest { .withInterestTypeAsDecliningBalance() // .currencyDetails("0", "100").build(null); - final Long applyLoanRequestId = RandomUtils.nextLong(100, 1000); + final Long applyLoanRequestId = ThreadLocalRandom.current().nextLong(100, 1000); final Long approveLoanRequestId = applyLoanRequestId + 1; final Long disburseLoanRequestId = approveLoanRequestId + 1; final Long getLoanRequestId = disburseLoanRequestId + 1;