From f496e2ff0ec1ec3b17e38ae669fee1d44dc1e1f2 Mon Sep 17 00:00:00 2001 From: Adam Saghy Date: Tue, 18 Oct 2022 18:43:37 +0200 Subject: [PATCH] FINERACT-1782: Improve code quality - Member of Spring components should be injected --- .../service/AdHocDataValidator.java | 85 +- .../command/CommandStrategyProvider.java | 72 +- .../BusinessStepCategoryServiceImpl.java | 2 +- .../bulkimport/api/BulkImportApiResource.java | 6 +- .../center/CenterImportHandler.java | 78 +- .../ChartOfAccountsImportHandler.java | 82 +- .../client/ClientEntityImportHandler.java | 52 +- .../client/ClientPersonImportHandler.java | 43 +- .../FixedDepositImportHandler.java | 82 +- .../FixedDepositTransactionImportHandler.java | 57 +- .../group/GroupImportHandler.java | 56 +- .../guarantor/GuarantorImportHandler.java | 33 +- .../JournalEntriesImportHandler.java | 48 +- .../importhandler/loan/LoanImportHandler.java | 95 +- .../LoanRepaymentImportHandler.java | 32 +- .../office/OfficeImportHandler.java | 23 +- .../RecurringDepositImportHandler.java | 96 +- ...urringDepositTransactionImportHandler.java | 40 +- .../savings/SavingsImportHandler.java | 83 +- .../SavingsTransactionImportHandler.java | 52 +- .../SharedAccountImportHandler.java | 37 +- .../staff/StaffImportHandler.java | 26 +- .../users/UserImportHandler.java | 28 +- .../cache/api/CacheApiResource.java | 8 +- .../api/EmailConfigurationApiResource.java | 6 +- .../codes/api/CodeValuesApiResource.java | 6 +- .../codes/api/CodesApiResource.java | 4 +- .../CodeCommandFromApiJsonDeserializer.java | 7 +- ...deValueCommandFromApiJsonDeserializer.java | 6 +- .../api/GlobalConfigurationApiResource.java | 8 +- ...pertiesCommandFromApiJsonDeserializer.java | 42 +- ...urationCommandFromApiJsonDeserializer.java | 6 +- .../PaginationParametersDataValidator.java | 6 +- ...tatableCommandFromApiJsonDeserializer.java | 214 +++-- .../TomcatJdbcDataSourcePerTenantService.java | 16 +- .../database/DatabaseTypeResolver.java | 9 +- ...DatabaseAwareMigrationContextProvider.java | 5 +- .../api/CreditBureauConfigurationAPI.java | 26 +- ...tBureauCommandFromApiJsonDeserializer.java | 31 +- ...urationCommandFromApiJsonDeserializer.java | 35 +- ...ProductCommandFromApiJsonDeserializer.java | 69 +- ...auTokenCommandFromApiJsonDeserializer.java | 74 +- .../CreditReportWritePlatformServiceImpl.java | 56 +- ...auIntegrationWritePlatformServiceImpl.java | 56 +- .../dataqueries/api/ReportsApiResource.java | 18 +- .../dataqueries/data/DataTableValidator.java | 4 +- .../ReportCommandFromApiJsonDeserializer.java | 4 +- .../EntityDatatableChecksDataValidator.java | 43 +- .../api/DocumentManagementApiResource.java | 14 +- .../processor/HookProcessorProvider.java | 13 +- .../hooks/processor/TwilioHookProcessor.java | 10 +- .../jobs/service/JobRegisterServiceImpl.java | 31 +- .../jobs/service/SchedulerStopListener.java | 12 +- .../ReportMailingJobEmailServiceImpl.java | 53 +- .../TwoFactorConfigurationApiResource.java | 4 +- .../security/domain/OTPRequestRepository.java | 8 +- .../mix/api/MixTaxonomyApiResource.java | 4 +- .../api/MixTaxonomyMappingApiResource.java | 4 +- .../fineract/mix/service/XBRLBuilder.java | 73 +- .../mix/service/XBRLResultServiceImpl.java | 42 +- .../monetary/api/CurrenciesApiResource.java | 8 +- ...urrencyCommandFromApiJsonDeserializer.java | 12 +- .../api/OfficeTransactionsApiResource.java | 6 +- .../office/api/OfficesApiResource.java | 20 +- .../OfficeCommandFromApiJsonDeserializer.java | 58 +- ...sactionCommandFromApiJsonDeserializer.java | 46 +- ...ingCategoryDefinitionJsonDeserializer.java | 32 +- .../staff/api/StaffApiResource.java | 14 +- .../StaffCommandFromApiJsonDeserializer.java | 133 +-- .../service/StaffReadPlatformServiceImpl.java | 28 +- .../TellerCommandFromApiJsonDeserializer.java | 130 +-- ...countTransfersReadPlatformServiceImpl.java | 251 +++-- .../EntityFieldConfigurationApiResources.java | 18 +- .../calendar/api/CalendarsApiResource.java | 33 +- ...alendarCommandFromApiJsonDeserializer.java | 8 +- .../charge/api/ChargesApiResource.java | 24 +- ...initionCommandFromApiJsonDeserializer.java | 345 +++---- .../client/api/ClientAddressApiResources.java | 19 +- .../api/ClientFamilyMembersApiResources.java | 18 +- .../api/ClientIdentifiersApiResource.java | 8 +- ...yMemberCommandFromApiJsonDeserializer.java | 189 ++-- ...ntifierCommandFromApiJsonDeserializer.java | 23 +- ...WritePlatformServiceJpaRepositoryImpl.java | 2 +- .../api/CollateralsApiResource.java | 12 +- ...WritePlatformServiceJpaRepositoryImpl.java | 6 +- .../api/CollateralManagementApiResource.java | 13 - ...enerateCommandFromApiJsonDeserializer.java | 19 +- .../FloatingRateDataValidator.java | 127 +-- .../portfolio/fund/api/FundsApiResource.java | 12 +- .../FundCommandFromApiJsonDeserializer.java | 33 +- .../service/GroupReadPlatformServiceImpl.java | 70 +- ...WritePlatformServiceJpaRepositoryImpl.java | 2 +- ...erestRateChartReadPlatformServiceImpl.java | 10 +- .../loanaccount/api/BulkLoansApiResource.java | 20 +- .../loanaccount/api/LoanApiConstants.java | 13 +- .../api/LoanChargesApiResource.java | 16 +- .../LoanDisbursementDetailApiResource.java | 8 +- .../api/LoanScheduleApiResource.java | 6 +- .../DefaultLoanLifecycleStateMachine.java | 4 +- .../portfolio/loanaccount/domain/Loan.java | 758 ++++++++------- .../domain/LoanAccountDomainServiceJpa.java | 8 +- .../domain/LoanRepositoryWrapper.java | 4 +- .../domain/LoanTermVariations.java | 2 +- .../guarantor/api/GuarantorsApiResource.java | 10 +- ...ritePlatformServiceJpaRepositoryIImpl.java | 2 +- .../domain/AbstractLoanScheduleGenerator.java | 7 +- .../service/LoanScheduleAssembler.java | 6 +- ...cheduleCalculationPlatformServiceImpl.java | 2 +- .../LoanRescheduleRequestDataValidator.java | 4 +- ...nReschedulePreviewPlatformServiceImpl.java | 12 +- ...cheduleRequestReadPlatformServiceImpl.java | 20 +- ...heduleRequestWritePlatformServiceImpl.java | 8 +- ...ateLoanScheduleQueryFromApiJsonHelper.java | 39 +- ...anApplicationCommandFromApiJsonHelper.java | 865 +++++++++--------- ...ApplicationTransitionApiJsonValidator.java | 7 +- .../LoanEventApiJsonValidator.java | 14 +- ...nUpdateCommandFromApiJsonDeserializer.java | 9 +- ...iableLoanScheduleFromApiJsonValidator.java | 33 +- ...WritePlatformServiceJpaRepositoryImpl.java | 6 +- .../service/LoanChargeAssembler.java | 3 +- .../loanaccount/service/LoanUtilService.java | 6 +- ...WritePlatformServiceJpaRepositoryImpl.java | 41 +- .../api/LoanProductsApiResource.java | 44 +- .../productmix/api/ProductMixApiResource.java | 8 +- .../ProductMixDataValidator.java | 21 +- .../LoanProductDataValidator.java | 659 ++++++------- .../portfolio/note/api/NotesApiResource.java | 54 +- .../NoteCommandFromApiJsonDeserializer.java | 24 +- .../portfolio/rate/api/RateApiResource.java | 13 +- ...initionCommandFromApiJsonDeserializer.java | 6 +- ...stDatedChecksWritePlatformServiceImpl.java | 108 ++- .../savings/domain/SavingsHelper.java | 6 +- ...erestRateChartReadPlatformServiceImpl.java | 11 +- ...DepositAccountReadPlatformServiceImpl.java | 723 +++++++++------ ...DepositProductReadPlatformServiceImpl.java | 38 +- .../search/api/SearchApiResource.java | 4 +- .../pockets/data/PocketDataValidator.java | 12 +- .../AccountEntityServiceForLoanImpl.java | 4 +- .../AccountEntityServiceForSavingsImpl.java | 4 +- ...ountEntityServiceForShareAccountsImpl.java | 4 +- .../security/api/SelfUserApiResource.java | 4 +- .../ShareAccountReadPlatformServiceImpl.java | 8 +- .../api/ShareDividendApiResource.java | 11 +- .../tax/api/TaxComponentApiResource.java | 12 +- .../tax/api/TaxGroupApiResource.java | 8 +- .../tax/serialization/TaxValidator.java | 97 +- .../service/TaxReadPlatformServiceImpl.java | 34 +- ...WritePlatformServiceJpaRepositoryImpl.java | 2 +- .../template/api/TemplatesApiResource.java | 35 +- .../service/TemplateMergeService.java | 83 +- .../api/PermissionsApiResource.java | 10 +- .../api/RolesApiResource.java | 36 +- .../api/UsersApiResource.java | 18 +- ...issionsCommandFromApiJsonDeserializer.java | 4 +- .../service/RoleDataValidator.java | 34 +- .../service/UserDataValidator.java | 131 +-- 156 files changed, 4264 insertions(+), 3903 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocDataValidator.java b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocDataValidator.java index 08930ea4d..84a3e83bb 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocDataValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocDataValidator.java @@ -40,11 +40,18 @@ import org.springframework.stereotype.Component; @Component public final class AdHocDataValidator { + public static final String NAME = "name"; + public static final String QUERY = "query"; + public static final String TABLE_NAME = "tableName"; + public static final String TABLE_FIELDS = "tableFields"; + public static final String EMAIL = "email"; + public static final String REPORT_RUN_FREQUENCY = "reportRunFrequency"; + public static final String REPORT_RUN_EVERY = "reportRunEvery"; /** * The parameters supported for this command. */ - private final Set supportedParameters = new HashSet<>( - Arrays.asList("name", "query", "tableName", "tableFields", "email", "isActive", "reportRunFrequency", "reportRunEvery")); + private static final Set supportedParameters = new HashSet<>( + Arrays.asList(NAME, QUERY, TABLE_NAME, TABLE_FIELDS, EMAIL, "isActive", REPORT_RUN_FREQUENCY, REPORT_RUN_EVERY)); private final FromJsonHelper fromApiJsonHelper; @@ -59,37 +66,37 @@ public final class AdHocDataValidator { } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, supportedParameters); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("adhoc"); final JsonElement element = this.fromApiJsonHelper.parse(json); - final String name = this.fromApiJsonHelper.extractStringNamed("name", element); - baseDataValidator.reset().parameter("name").value(name).notBlank().notExceedingLengthOf(100); + final String name = this.fromApiJsonHelper.extractStringNamed(NAME, element); + baseDataValidator.reset().parameter(NAME).value(name).notBlank().notExceedingLengthOf(100); - final String description = this.fromApiJsonHelper.extractStringNamed("query", element); - baseDataValidator.reset().parameter("query").value(description).notBlank().notExceedingLengthOf(2000); + final String description = this.fromApiJsonHelper.extractStringNamed(QUERY, element); + baseDataValidator.reset().parameter(QUERY).value(description).notBlank().notExceedingLengthOf(2000); - final String tableName = this.fromApiJsonHelper.extractStringNamed("tableName", element); - baseDataValidator.reset().parameter("tableName").value(tableName).notBlank().notExceedingLengthOf(100); + final String tableName = this.fromApiJsonHelper.extractStringNamed(TABLE_NAME, element); + baseDataValidator.reset().parameter(TABLE_NAME).value(tableName).notBlank().notExceedingLengthOf(100); - final String tableFields = this.fromApiJsonHelper.extractStringNamed("tableFields", element); - baseDataValidator.reset().parameter("tableFields").value(tableFields).notBlank().notExceedingLengthOf(1000); + final String tableFields = this.fromApiJsonHelper.extractStringNamed(TABLE_FIELDS, element); + baseDataValidator.reset().parameter(TABLE_FIELDS).value(tableFields).notBlank().notExceedingLengthOf(1000); - final String email = this.fromApiJsonHelper.extractStringNamed("email", element); - baseDataValidator.reset().parameter("email").value(email).ignoreIfNull().notExceedingLengthOf(500); + final String email = this.fromApiJsonHelper.extractStringNamed(EMAIL, element); + baseDataValidator.reset().parameter(EMAIL).value(email).ignoreIfNull().notExceedingLengthOf(500); - final Long reportRunFrequencyCode = this.fromApiJsonHelper.extractLongNamed("reportRunFrequency", element); + final Long reportRunFrequencyCode = this.fromApiJsonHelper.extractLongNamed(REPORT_RUN_FREQUENCY, element); if (reportRunFrequencyCode != null) { - baseDataValidator.reset().parameter("reportRunFrequency").value(reportRunFrequencyCode) + baseDataValidator.reset().parameter(REPORT_RUN_FREQUENCY).value(reportRunFrequencyCode) .inMinMaxRange((int) ReportRunFrequency.DAILY.getValue(), (int) ReportRunFrequency.CUSTOM.getValue()); } - final Long reportRunEvery = this.fromApiJsonHelper.extractLongNamed("reportRunEvery", element); + final Long reportRunEvery = this.fromApiJsonHelper.extractLongNamed(REPORT_RUN_EVERY, element); if (reportRunEvery != null) { - baseDataValidator.reset().parameter("reportRunEvery").value(reportRunFrequencyCode).integerGreaterThanZero(); + baseDataValidator.reset().parameter(REPORT_RUN_EVERY).value(reportRunFrequencyCode).integerGreaterThanZero(); } throwExceptionIfValidationWarningsExist(dataValidationErrors); @@ -101,42 +108,42 @@ public final class AdHocDataValidator { } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, supportedParameters); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("adhoc"); final JsonElement element = this.fromApiJsonHelper.parse(json); - if (this.fromApiJsonHelper.parameterExists("name", element)) { - final String name = this.fromApiJsonHelper.extractStringNamed("name", element); - baseDataValidator.reset().parameter("name").value(name).notBlank().notExceedingLengthOf(100); + if (this.fromApiJsonHelper.parameterExists(NAME, element)) { + final String name = this.fromApiJsonHelper.extractStringNamed(NAME, element); + baseDataValidator.reset().parameter(NAME).value(name).notBlank().notExceedingLengthOf(100); } - if (this.fromApiJsonHelper.parameterExists("query", element)) { - final String query = this.fromApiJsonHelper.extractStringNamed("query", element); - baseDataValidator.reset().parameter("query").value(query).notBlank().notExceedingLengthOf(2000); + if (this.fromApiJsonHelper.parameterExists(QUERY, element)) { + final String query = this.fromApiJsonHelper.extractStringNamed(QUERY, element); + baseDataValidator.reset().parameter(QUERY).value(query).notBlank().notExceedingLengthOf(2000); } - if (this.fromApiJsonHelper.parameterExists("tableName", element)) { - final String tableName = this.fromApiJsonHelper.extractStringNamed("tableName", element); - baseDataValidator.reset().parameter("tableName").value(tableName).notBlank().notExceedingLengthOf(100); + if (this.fromApiJsonHelper.parameterExists(TABLE_NAME, element)) { + final String tableName = this.fromApiJsonHelper.extractStringNamed(TABLE_NAME, element); + baseDataValidator.reset().parameter(TABLE_NAME).value(tableName).notBlank().notExceedingLengthOf(100); } - if (this.fromApiJsonHelper.parameterExists("tableFields", element)) { - final String tableField = this.fromApiJsonHelper.extractStringNamed("tableFields", element); - baseDataValidator.reset().parameter("tableFields").value(tableField).notBlank().notExceedingLengthOf(2000); + if (this.fromApiJsonHelper.parameterExists(TABLE_FIELDS, element)) { + final String tableField = this.fromApiJsonHelper.extractStringNamed(TABLE_FIELDS, element); + baseDataValidator.reset().parameter(TABLE_FIELDS).value(tableField).notBlank().notExceedingLengthOf(2000); } - if (this.fromApiJsonHelper.parameterExists("email", element)) { - final String email = this.fromApiJsonHelper.extractStringNamed("email", element); - baseDataValidator.reset().parameter("email").value(email).ignoreIfNull().notExceedingLengthOf(500); + if (this.fromApiJsonHelper.parameterExists(EMAIL, element)) { + final String email = this.fromApiJsonHelper.extractStringNamed(EMAIL, element); + baseDataValidator.reset().parameter(EMAIL).value(email).ignoreIfNull().notExceedingLengthOf(500); } - if (this.fromApiJsonHelper.parameterExists("reportRunFrequency", element)) { - final Long reportRunFrequencyCode = this.fromApiJsonHelper.extractLongNamed("reportRunFrequency", element); - baseDataValidator.reset().parameter("reportRunFrequency").value(reportRunFrequencyCode) + if (this.fromApiJsonHelper.parameterExists(REPORT_RUN_FREQUENCY, element)) { + final Long reportRunFrequencyCode = this.fromApiJsonHelper.extractLongNamed(REPORT_RUN_FREQUENCY, element); + baseDataValidator.reset().parameter(REPORT_RUN_FREQUENCY).value(reportRunFrequencyCode) .inMinMaxRange((int) ReportRunFrequency.DAILY.getValue(), (int) ReportRunFrequency.CUSTOM.getValue()); } - if (this.fromApiJsonHelper.parameterExists("reportRunEvery", element)) { - final Long reportRunEvery = this.fromApiJsonHelper.extractLongNamed("reportRunEvery", element); - baseDataValidator.reset().parameter("reportRunEvery").value(reportRunEvery).integerGreaterThanZero(); + if (this.fromApiJsonHelper.parameterExists(REPORT_RUN_EVERY, element)) { + final Long reportRunEvery = this.fromApiJsonHelper.extractLongNamed(REPORT_RUN_EVERY, element); + baseDataValidator.reset().parameter(REPORT_RUN_EVERY).value(reportRunEvery).integerGreaterThanZero(); } /* * if (this.fromApiJsonHelper.parameterExists("isActive", element)) { final Integer isActive = diff --git a/fineract-provider/src/main/java/org/apache/fineract/batch/command/CommandStrategyProvider.java b/fineract-provider/src/main/java/org/apache/fineract/batch/command/CommandStrategyProvider.java index 6005a4a9e..0d3e71078 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/batch/command/CommandStrategyProvider.java +++ b/fineract-provider/src/main/java/org/apache/fineract/batch/command/CommandStrategyProvider.java @@ -35,8 +35,9 @@ import org.springframework.stereotype.Component; @Component public class CommandStrategyProvider { + public static final String CREATE_TRANSACTION_LOAN_COMMAND_STRATEGY = "createTransactionLoanCommandStrategy"; private final ApplicationContext applicationContext; - private final Map commandStrategies = new ConcurrentHashMap<>(); + private static final Map commandStrategies = new ConcurrentHashMap<>(); /** * Constructs a CommandStrategyProvider with argument of ApplicationContext type. It also initialize @@ -63,13 +64,13 @@ public class CommandStrategyProvider { */ public CommandStrategy getCommandStrategy(final CommandContext commandContext) { - if (this.commandStrategies.containsKey(commandContext)) { - return (CommandStrategy) this.applicationContext.getBean(this.commandStrategies.get(commandContext)); + if (commandStrategies.containsKey(commandContext)) { + return (CommandStrategy) this.applicationContext.getBean(commandStrategies.get(commandContext)); } - for (Map.Entry entry : this.commandStrategies.entrySet()) { + for (Map.Entry entry : commandStrategies.entrySet()) { if (commandContext.matcher(entry.getKey())) { - return (CommandStrategy) this.applicationContext.getBean(this.commandStrategies.get(entry.getKey())); + return (CommandStrategy) applicationContext.getBean(commandStrategies.get(entry.getKey())); } } @@ -80,48 +81,45 @@ public class CommandStrategyProvider { * Contains various available command strategies in {@link org.apache.fineract.batch.command.internal}. Any new * command Strategy will have to be added within this function in order to initiate it within the constructor. */ - private void init() { - this.commandStrategies.put(CommandContext.resource("clients").method("POST").build(), "createClientCommandStrategy"); - this.commandStrategies.put(CommandContext.resource("clients\\/\\d+").method("PUT").build(), "updateClientCommandStrategy"); - this.commandStrategies.put(CommandContext.resource("loans").method("POST").build(), "applyLoanCommandStrategy"); - this.commandStrategies.put(CommandContext.resource("loans\\/\\d+").method("GET").build(), "getLoanByIdCommandStrategy"); - this.commandStrategies.put(CommandContext.resource("loans/\\d+(\\?(\\w+(?:\\=[\\w,]+|&)+)+)").method("GET").build(), + private static void init() { + commandStrategies.put(CommandContext.resource("clients").method("POST").build(), "createClientCommandStrategy"); + commandStrategies.put(CommandContext.resource("clients\\/\\d+").method("PUT").build(), "updateClientCommandStrategy"); + commandStrategies.put(CommandContext.resource("loans").method("POST").build(), "applyLoanCommandStrategy"); + commandStrategies.put(CommandContext.resource("loans\\/\\d+").method("GET").build(), "getLoanByIdCommandStrategy"); + commandStrategies.put(CommandContext.resource("loans/\\d+(\\?(\\w+(?:\\=[\\w,]+|&)+)+)").method("GET").build(), "getLoanByIdCommandStrategy"); - this.commandStrategies.put(CommandContext.resource("savingsaccounts").method("POST").build(), "applySavingsCommandStrategy"); - this.commandStrategies.put(CommandContext.resource("loans\\/\\d+\\/charges").method("POST").build(), "createChargeCommandStrategy"); - this.commandStrategies.put(CommandContext.resource("loans\\/\\d+\\/charges").method("GET").build(), - "collectChargesCommandStrategy"); - this.commandStrategies.put(CommandContext.resource("loans\\/\\d+\\/charges\\/\\d+").method("GET").build(), + commandStrategies.put(CommandContext.resource("savingsaccounts").method("POST").build(), "applySavingsCommandStrategy"); + commandStrategies.put(CommandContext.resource("loans\\/\\d+\\/charges").method("POST").build(), "createChargeCommandStrategy"); + commandStrategies.put(CommandContext.resource("loans\\/\\d+\\/charges").method("GET").build(), "collectChargesCommandStrategy"); + commandStrategies.put(CommandContext.resource("loans\\/\\d+\\/charges\\/\\d+").method("GET").build(), "getChargeByIdCommandStrategy"); - this.commandStrategies.put(CommandContext.resource("loans\\/\\d+\\/transactions\\?command=repayment").method("POST").build(), - "createTransactionLoanCommandStrategy"); - this.commandStrategies.put( - CommandContext.resource("loans\\/\\d+\\/transactions\\?command=creditBalanceRefund").method("POST").build(), - "createTransactionLoanCommandStrategy"); - this.commandStrategies.put(CommandContext.resource("loans\\/\\d+\\/transactions\\?command=goodwillCredit").method("POST").build(), - "createTransactionLoanCommandStrategy"); - this.commandStrategies.put( - CommandContext.resource("loans\\/\\d+\\/transactions\\?command=merchantIssuedRefund").method("POST").build(), - "createTransactionLoanCommandStrategy"); - this.commandStrategies.put(CommandContext.resource("loans\\/\\d+\\/transactions\\?command=payoutRefund").method("POST").build(), - "createTransactionLoanCommandStrategy"); - this.commandStrategies.put(CommandContext.resource("loans\\/\\d+\\/transactions\\/\\d+").method("POST").build(), + commandStrategies.put(CommandContext.resource("loans\\/\\d+\\/transactions\\?command=repayment").method("POST").build(), + CREATE_TRANSACTION_LOAN_COMMAND_STRATEGY); + commandStrategies.put(CommandContext.resource("loans\\/\\d+\\/transactions\\?command=creditBalanceRefund").method("POST").build(), + CREATE_TRANSACTION_LOAN_COMMAND_STRATEGY); + commandStrategies.put(CommandContext.resource("loans\\/\\d+\\/transactions\\?command=goodwillCredit").method("POST").build(), + CREATE_TRANSACTION_LOAN_COMMAND_STRATEGY); + commandStrategies.put(CommandContext.resource("loans\\/\\d+\\/transactions\\?command=merchantIssuedRefund").method("POST").build(), + CREATE_TRANSACTION_LOAN_COMMAND_STRATEGY); + commandStrategies.put(CommandContext.resource("loans\\/\\d+\\/transactions\\?command=payoutRefund").method("POST").build(), + CREATE_TRANSACTION_LOAN_COMMAND_STRATEGY); + commandStrategies.put(CommandContext.resource("loans\\/\\d+\\/transactions\\/\\d+").method("POST").build(), "adjustTransactionCommandStrategy"); - this.commandStrategies.put(CommandContext.resource("clients\\/\\d+\\?command=activate").method("POST").build(), + commandStrategies.put(CommandContext.resource("clients\\/\\d+\\?command=activate").method("POST").build(), "activateClientCommandStrategy"); - this.commandStrategies.put(CommandContext.resource("loans\\/\\d+\\?command=approve").method("POST").build(), + commandStrategies.put(CommandContext.resource("loans\\/\\d+\\?command=approve").method("POST").build(), "approveLoanCommandStrategy"); - this.commandStrategies.put(CommandContext.resource("loans\\/\\d+\\?command=disburse").method("POST").build(), + commandStrategies.put(CommandContext.resource("loans\\/\\d+\\?command=disburse").method("POST").build(), "disburseLoanCommandStrategy"); - this.commandStrategies.put(CommandContext.resource("rescheduleloans").method("POST").build(), + commandStrategies.put(CommandContext.resource("rescheduleloans").method("POST").build(), "createLoanRescheduleRequestCommandStrategy"); - this.commandStrategies.put(CommandContext.resource("rescheduleloans\\/\\d+\\?command=approve").method("POST").build(), + commandStrategies.put(CommandContext.resource("rescheduleloans\\/\\d+\\?command=approve").method("POST").build(), "approveLoanRescheduleCommandStrategy"); - this.commandStrategies.put(CommandContext.resource("loans\\/\\d+\\/transactions\\/\\d+").method("GET").build(), + commandStrategies.put(CommandContext.resource("loans\\/\\d+\\/transactions\\/\\d+").method("GET").build(), "getTransactionByIdCommandStrategy"); - this.commandStrategies.put(CommandContext.resource("datatables\\/[a-zA-Z0-9_]*\\/\\d+").method("GET").build(), + commandStrategies.put(CommandContext.resource("datatables\\/[a-zA-Z0-9_]*\\/\\d+").method("GET").build(), "getDatatableEntryByAppTableIdCommandStrategy"); - this.commandStrategies.put( + commandStrategies.put( CommandContext.resource("datatables\\/[a-zA-Z0-9_]*\\/\\d+(\\?(\\w+(?:\\=[\\w,]+|&)+)+)").method("GET").build(), "getDatatableEntryByAppTableIdCommandStrategy"); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/service/BusinessStepCategoryServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/cob/service/BusinessStepCategoryServiceImpl.java index 87f7b8964..d08983093 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/service/BusinessStepCategoryServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/service/BusinessStepCategoryServiceImpl.java @@ -26,7 +26,7 @@ import org.springframework.stereotype.Service; @Service public class BusinessStepCategoryServiceImpl implements BusinessStepCategoryService { - private final Map> businessSteps = Map.of(BusinessStepCategory.LOAN, + private static final Map> businessSteps = Map.of(BusinessStepCategory.LOAN, LoanCOBBusinessStep.class); @Override diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/api/BulkImportApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/api/BulkImportApiResource.java index 8a2b5f740..bf18b74a7 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/api/BulkImportApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/api/BulkImportApiResource.java @@ -49,7 +49,7 @@ import org.springframework.stereotype.Component; @Tag(name = "Bulk Import", description = "") public class BulkImportApiResource { - private final String resourceNameForPermissions = "IMPORT"; + private static final String RESOURCE_NAME_FOR_PERMISSION = "IMPORT"; private final PlatformSecurityContext context; private final BulkImportWorkbookService bulkImportWorkbookService; @@ -70,7 +70,7 @@ public class BulkImportApiResource { @Produces({ MediaType.APPLICATION_JSON }) public String retrieveImportDocuments(@Context final UriInfo uriInfo, @QueryParam("entityType") final String entityType) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSION); Collection importData = new ArrayList<>(); if (entityType.equals(GlobalEntityType.CLIENT.getCode())) { final Collection importForClientEntity = this.bulkImportWorkbookService.getImports(GlobalEntityType.CLIENTS_ENTTTY); @@ -95,7 +95,7 @@ public class BulkImportApiResource { @GET @Path("getOutputTemplateLocation") public String retriveOutputTemplateLocation(@QueryParam("importDocumentId") final String importDocumentId) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSION); final DocumentData documentData = this.bulkImportWorkbookService.getOutputTemplateLocation(importDocumentId); return this.toApiJsonSerializer.serialize(documentData.fileLocation()); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/center/CenterImportHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/center/CenterImportHandler.java index e27555147..42878e296 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/center/CenterImportHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/center/CenterImportHandler.java @@ -25,6 +25,7 @@ import java.time.LocalDate; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Objects; import org.apache.fineract.commands.domain.CommandWrapper; import org.apache.fineract.commands.service.CommandWrapperBuilder; import org.apache.fineract.commands.service.IdempotencyKeyGenerator; @@ -56,12 +57,8 @@ import org.springframework.stereotype.Service; @Service public class CenterImportHandler implements ImportHandler { + public static final String EMPTY_STR = ""; private static final Logger LOG = LoggerFactory.getLogger(CenterImportHandler.class); - private List centers; - private List meetings; - private List statuses; - private Workbook workbook; - private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; private final IdempotencyKeyGenerator idempotencyKeyGenerator; @@ -73,16 +70,16 @@ public class CenterImportHandler implements ImportHandler { } @Override - public Count process(Workbook workbook, String locale, String dateFormat) { - this.centers = new ArrayList<>(); - this.meetings = new ArrayList<>(); - this.statuses = new ArrayList<>(); - this.workbook = workbook; - readExcelFile(locale, dateFormat); - return importEntity(dateFormat); + public Count process(final Workbook workbook, final String locale, final String dateFormat) { + List centers = new ArrayList<>(); + List meetings = new ArrayList<>(); + List statuses = new ArrayList<>(); + readExcelFile(workbook, centers, meetings, statuses, locale, dateFormat); + return importEntity(workbook, centers, meetings, statuses, dateFormat); } - public void readExcelFile(final String locale, final String dateFormat) { + private void readExcelFile(final Workbook workbook, final List centers, final List meetings, + final List statuses, final String locale, final String dateFormat) { Sheet centersSheet = workbook.getSheet(TemplatePopulateImportConstants.CENTER_SHEET_NAME); Integer noOfEntries = ImportHandlerUtils.getNumberOfRows(centersSheet, TemplatePopulateImportConstants.FIRST_COLUMN_INDEX); @@ -90,13 +87,13 @@ public class CenterImportHandler implements ImportHandler { Row row; row = centersSheet.getRow(rowIndex); if (ImportHandlerUtils.isNotImported(row, CenterConstants.STATUS_COL)) { - centers.add(readCenter(row, locale, dateFormat)); + centers.add(readCenter(workbook, statuses, row, locale, dateFormat)); meetings.add(readMeeting(row, locale, dateFormat)); } } } - private CalendarData readMeeting(Row row, final String locale, final String dateFormat) { + private CalendarData readMeeting(final Row row, final String locale, final String dateFormat) { LocalDate meetingStartDate = ImportHandlerUtils.readAsDate(CenterConstants.MEETING_START_DATE_COL, row); Boolean isRepeating = ImportHandlerUtils.readAsBoolean(CenterConstants.IS_REPEATING_COL, row); String frequency = ImportHandlerUtils.readAsString(CenterConstants.FREQUENCY_COL, row); @@ -117,7 +114,8 @@ public class CenterImportHandler implements ImportHandler { } } - private CenterData readCenter(Row row, final String locale, final String dateFormat) { + private CenterData readCenter(final Workbook workbook, final List statuses, final Row row, final String locale, + final String dateFormat) { String status = ImportHandlerUtils.readAsString(CenterConstants.STATUS_COL, row); String officeName = ImportHandlerUtils.readAsString(CenterConstants.OFFICE_NAME_COL, row); Long officeId = ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.OFFICE_SHEET_NAME), officeName); @@ -127,20 +125,20 @@ public class CenterImportHandler implements ImportHandler { String externalId = ImportHandlerUtils.readAsString(CenterConstants.EXTERNAL_ID_COL, row); Boolean active = ImportHandlerUtils.readAsBoolean(CenterConstants.ACTIVE_COL, row); LocalDate submittedOn = ImportHandlerUtils.readAsDate(CenterConstants.SUBMITTED_ON_DATE_COL, row); - LocalDate activationDate = null; - if (active) { + LocalDate activationDate; + if (Boolean.TRUE.equals(active)) { activationDate = ImportHandlerUtils.readAsDate(CenterConstants.ACTIVATION_DATE_COL, row); } else { activationDate = submittedOn; } String centerName = ImportHandlerUtils.readAsString(CenterConstants.CENTER_NAME_COL, row); - if (centerName == null || centerName.equals("")) { + if (centerName == null || centerName.equals(EMPTY_STR)) { throw new IllegalArgumentException("Name is blank"); } - List groupMembers = new ArrayList(); + List groupMembers = new ArrayList<>(); for (int cellNo = CenterConstants.GROUP_NAMES_STARTING_COL; cellNo < CenterConstants.GROUP_NAMES_ENDING_COL; cellNo++) { String groupName = ImportHandlerUtils.readAsString(cellNo, row); - if (groupName == null || groupName.equals("")) { + if (groupName == null || groupName.equals(EMPTY_STR)) { break; } Long groupId = ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.GROUP_SHEET_NAME), groupName); @@ -164,13 +162,14 @@ public class CenterImportHandler implements ImportHandler { return false; } - public Count importEntity(String dateFormat) { + private Count importEntity(final Workbook workbook, final List centers, final List meetings, + final List statuses, final String dateFormat) { Sheet centerSheet = workbook.getSheet(TemplatePopulateImportConstants.CENTER_SHEET_NAME); int progressLevel = 0; - String centerId = ""; + String centerId = EMPTY_STR; int successCount = 0; int errorCount = 0; - String errorMessage = ""; + String errorMessage; for (int i = 0; i < centers.size(); i++) { Row row = centerSheet.getRow(centers.get(i).getRowIndex()); Cell errorReportCell = row.createCell(CenterConstants.FAILURE_COL); @@ -181,16 +180,17 @@ public class CenterImportHandler implements ImportHandler { progressLevel = getProgressLevel(status); if (progressLevel == 0) { - result = importCenter(i, dateFormat); + result = importCenter(centers, i, dateFormat); centerId = result.getGroupId().toString(); progressLevel = 1; } else { - centerId = ImportHandlerUtils.readAsInt(CenterConstants.CENTER_ID_COL, centerSheet.getRow(centers.get(i).getRowIndex())) + centerId = Objects.requireNonNull( + ImportHandlerUtils.readAsInt(CenterConstants.CENTER_ID_COL, centerSheet.getRow(centers.get(i).getRowIndex()))) .toString(); } if (meetings.get(i) != null) { - progressLevel = importCenterMeeting(result, i, dateFormat); + progressLevel = importCenterMeeting(meetings, Objects.requireNonNull(result), i, dateFormat); } successCount++; statusCell.setCellValue(TemplatePopulateImportConstants.STATUS_CELL_IMPORTED); @@ -199,16 +199,16 @@ public class CenterImportHandler implements ImportHandler { errorCount++; LOG.error("Runtime Exception occured in importEntity function", ex); errorMessage = ImportHandlerUtils.getErrorMessage(ex); - writeCenterErrorMessage(centerId, errorMessage, progressLevel, statusCell, errorReportCell, row); + writeCenterErrorMessage(workbook, centerId, errorMessage, progressLevel, statusCell, errorReportCell, row); } } setReportHeaders(centerSheet); return Count.instance(successCount, errorCount); } - private void writeCenterErrorMessage(String centerId, String errorMessage, int progressLevel, Cell statusCell, Cell errorReportCell, - Row row) { - String status = ""; + private void writeCenterErrorMessage(final Workbook workbook, final String centerId, final String errorMessage, final int progressLevel, + final Cell statusCell, final Cell errorReportCell, final Row row) { + String status = EMPTY_STR; if (progressLevel == 0) { status = TemplatePopulateImportConstants.STATUS_CREATION_FAILED; } else if (progressLevel == 1) { @@ -233,21 +233,22 @@ public class CenterImportHandler implements ImportHandler { return 0; } - private CommandProcessingResult importCenter(int rowIndex, String dateFormat) { + private CommandProcessingResult importCenter(final List centers, final int rowIndex, final String dateFormat) { GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder(); gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat)); - Type groupCollectionType = new TypeToken>() {}.getType(); + Type groupCollectionType = new TypeToken>() { + + }.getType(); gsonBuilder.registerTypeAdapter(groupCollectionType, new GroupIdSerializer()); String payload = gsonBuilder.create().toJson(centers.get(rowIndex)); final CommandWrapper commandRequest = new CommandWrapperBuilder() // .createCenter() // .withJson(payload) // .build(); // - final CommandProcessingResult result = commandsSourceWritePlatformService.logCommandSource(commandRequest); - return result; + return commandsSourceWritePlatformService.logCommandSource(commandRequest); } - private void setReportHeaders(Sheet sheet) { + private void setReportHeaders(final Sheet sheet) { ImportHandlerUtils.writeString(CenterConstants.STATUS_COL, sheet.getRow(0), TemplatePopulateImportConstants.STATUS_COL_REPORT_HEADER); ImportHandlerUtils.writeString(CenterConstants.CENTER_ID_COL, sheet.getRow(0), @@ -256,7 +257,8 @@ public class CenterImportHandler implements ImportHandler { TemplatePopulateImportConstants.FAILURE_COL_REPORT_HEADER); } - private Integer importCenterMeeting(CommandProcessingResult result, int rowIndex, String dateFormat) { + private Integer importCenterMeeting(final List meetings, final CommandProcessingResult result, final int rowIndex, + final String dateFormat) { CalendarData calendarData = meetings.get(rowIndex); calendarData.setTitle("centers_" + result.getGroupId().toString() + "_CollectionMeeting"); GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder(); @@ -271,7 +273,7 @@ public class CenterImportHandler implements ImportHandler { .createCalendar(commandWrapper, TemplatePopulateImportConstants.CENTER_ENTITY_TYPE, result.getGroupId()) // .withJson(payload) // .build(); // - final CommandProcessingResult meetingresult = commandsSourceWritePlatformService.logCommandSource(commandRequest); + commandsSourceWritePlatformService.logCommandSource(commandRequest); return 2; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/chartofaccounts/ChartOfAccountsImportHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/chartofaccounts/ChartOfAccountsImportHandler.java index 43f00f045..563145e67 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/chartofaccounts/ChartOfAccountsImportHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/chartofaccounts/ChartOfAccountsImportHandler.java @@ -23,11 +23,13 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import org.apache.fineract.accounting.glaccount.data.GLAccountData; import org.apache.fineract.accounting.glaccount.domain.GLAccount; import org.apache.fineract.accounting.glaccount.domain.GLAccountRepositoryWrapper; import org.apache.fineract.accounting.glaccount.domain.GLAccountType; import org.apache.fineract.accounting.glaccount.domain.GLAccountUsage; +import org.apache.fineract.accounting.glaccount.exception.GLAccountNotFoundException; import org.apache.fineract.accounting.journalentry.data.CreditDebit; import org.apache.fineract.accounting.journalentry.data.JournalEntryData; import org.apache.fineract.commands.domain.CommandWrapper; @@ -43,7 +45,6 @@ import org.apache.fineract.infrastructure.bulkimport.importhandler.helper.Curren import org.apache.fineract.infrastructure.bulkimport.importhandler.helper.DateSerializer; import org.apache.fineract.infrastructure.bulkimport.importhandler.helper.EnumOptionDataIdSerializer; import org.apache.fineract.infrastructure.codes.data.CodeValueData; -import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.EnumOptionData; import org.apache.fineract.infrastructure.core.serialization.GoogleGsonSerializerHelper; import org.apache.fineract.infrastructure.core.service.DateUtils; @@ -62,16 +63,6 @@ import org.springframework.stereotype.Service; public class ChartOfAccountsImportHandler implements ImportHandler { private static final Logger LOG = LoggerFactory.getLogger(ChartOfAccountsImportHandler.class); - private List glAccounts; - private Workbook workbook; - private LocalDate transactionDate; - - // for opening bal - int flagForOpBal = 0; - private List gltransaction; - List credits = new ArrayList<>(); - List debits = new ArrayList<>(); - String locale; private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; private final GLAccountRepositoryWrapper glAccountRepository; @@ -84,32 +75,38 @@ public class ChartOfAccountsImportHandler implements ImportHandler { } @Override - public Count process(Workbook workbook, String locale, String dateFormat) { - this.glAccounts = new ArrayList<>(); - this.workbook = workbook; + public Count process(final Workbook workbook, final String locale, final String dateFormat) { + List glAccounts = new ArrayList<>(); // for opening bal - gltransaction = new ArrayList<>(); - credits = new ArrayList<>(); - debits = new ArrayList<>(); - this.locale = locale; + List glTransactions = new ArrayList<>(); + List credits = new ArrayList<>(); + List debits = new ArrayList<>(); - readExcelFile(); - return importEntity(dateFormat); + boolean flagForOpBal = readExcelFile(workbook, glAccounts); + return importEntity(workbook, glAccounts, glTransactions, credits, debits, flagForOpBal, locale, dateFormat); } - private void readExcelFile() { + private boolean readExcelFile(final Workbook workbook, final List glAccounts) { Sheet chartOfAccountsSheet = workbook.getSheet(TemplatePopulateImportConstants.CHART_OF_ACCOUNTS_SHEET_NAME); Integer noOfEntries = ImportHandlerUtils.getNumberOfRows(chartOfAccountsSheet, TemplatePopulateImportConstants.FIRST_COLUMN_INDEX); + boolean flagForOpBal = false; for (int rowIndex = 1; rowIndex <= noOfEntries; rowIndex++) { Row row; row = chartOfAccountsSheet.getRow(rowIndex); if (ImportHandlerUtils.isNotImported(row, ChartOfAcountsConstants.STATUS_COL)) { glAccounts.add(readGlAccounts(row)); + if (ImportHandlerUtils.readAsString(ChartOfAcountsConstants.OFFICE_COL, row) != null) { + flagForOpBal = Boolean.TRUE; + } else { + flagForOpBal = Boolean.FALSE; + } } } + + return flagForOpBal; } - private GLAccountData readGlAccounts(Row row) { + private GLAccountData readGlAccounts(final Row row) { String accountType = ImportHandlerUtils.readAsString(ChartOfAcountsConstants.ACCOUNT_TYPE_COL, row); EnumOptionData accountTypeEnum = GLAccountType.fromString(accountType); @@ -127,26 +124,23 @@ public class ChartOfAccountsImportHandler implements ImportHandler { Boolean manualEntriesAllowed = ImportHandlerUtils.readAsBoolean(ChartOfAcountsConstants.MANUAL_ENTRIES_ALLOWED_COL, row); Long parentId = null; if (ImportHandlerUtils.readAsString(ChartOfAcountsConstants.PARENT_ID_COL, row) != null) { - parentId = Long.parseLong(ImportHandlerUtils.readAsString(ChartOfAcountsConstants.PARENT_ID_COL, row)); + parentId = Long.parseLong(Objects.requireNonNull(ImportHandlerUtils.readAsString(ChartOfAcountsConstants.PARENT_ID_COL, row))); } String glCode = ImportHandlerUtils.readAsString(ChartOfAcountsConstants.GL_CODE_COL, row); Long tagId = null; CodeValueData tagIdCodeValueData = null; if (ImportHandlerUtils.readAsString(ChartOfAcountsConstants.TAG_ID_COL, row) != null) { - tagId = Long.parseLong(ImportHandlerUtils.readAsString(ChartOfAcountsConstants.TAG_ID_COL, row)); + tagId = Long.parseLong(Objects.requireNonNull(ImportHandlerUtils.readAsString(ChartOfAcountsConstants.TAG_ID_COL, row))); tagIdCodeValueData = new CodeValueData().setId(tagId); } String description = ImportHandlerUtils.readAsString(ChartOfAcountsConstants.DESCRIPTION_COL, row); - if (ImportHandlerUtils.readAsString(ChartOfAcountsConstants.OFFICE_COL, row) != null) { - flagForOpBal = 1; - } else { - flagForOpBal = 0; - } return GLAccountData.importInstance(accountName, parentId, glCode, manualEntriesAllowed, accountTypeEnum, usageEnum, description, tagIdCodeValueData, row.getRowNum()); } - public Count importEntity(String dateFormat) { + private Count importEntity(final Workbook workbook, final List glAccounts, final List glTransactions, + final List credits, final List debits, final boolean flagForOpBal, final String locale, + final String dateFormat) { Sheet chartOfAccountsSheet = workbook.getSheet(TemplatePopulateImportConstants.CHART_OF_ACCOUNTS_SHEET_NAME); GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder(); @@ -166,7 +160,7 @@ public class ChartOfAccountsImportHandler implements ImportHandler { .createGLAccount() // .withJson(payload) // .build(); // - final CommandProcessingResult result = commandsSourceWritePlatformService.logCommandSource(commandRequest); + commandsSourceWritePlatformService.logCommandSource(commandRequest); successCount++; Cell statusCell = chartOfAccountsSheet.getRow(glAccount.getRowIndex()).createCell(ChartOfAcountsConstants.STATUS_COL); statusCell.setCellValue(TemplatePopulateImportConstants.STATUS_CELL_IMPORTED); @@ -179,16 +173,15 @@ public class ChartOfAccountsImportHandler implements ImportHandler { ChartOfAcountsConstants.STATUS_COL); } } - if (flagForOpBal > 0) { - + if (flagForOpBal) { try { - readExcelFileForOpBal(locale, dateFormat); - JournalEntryData transaction = gltransaction.get(gltransaction.size() - 1); + readExcelFileForOpBal(workbook, glTransactions, credits, debits, locale, dateFormat); + JournalEntryData transaction = glTransactions.get(glTransactions.size() - 1); String payload = gsonBuilder.create().toJson(transaction); final CommandWrapper commandRequest = new CommandWrapperBuilder().defineOpeningBalanceForJournalEntry() .withJson(payload).build(); - final CommandProcessingResult result = commandsSourceWritePlatformService.logCommandSource(commandRequest); + commandsSourceWritePlatformService.logCommandSource(commandRequest); successCount++; Cell statusCell = chartOfAccountsSheet.getRow(1).createCell(ChartOfAcountsConstants.STATUS_COL); statusCell.setCellValue(TemplatePopulateImportConstants.STATUS_CELL_IMPORTED); @@ -216,7 +209,8 @@ public class ChartOfAccountsImportHandler implements ImportHandler { } // for opening balance - public void readExcelFileForOpBal(final String locale, final String dateFormat) { + private void readExcelFileForOpBal(final Workbook workbook, final List glTransactions, + final List credits, final List debits, final String locale, final String dateFormat) { Sheet chartOfAccountsSheet = workbook.getSheet(TemplatePopulateImportConstants.CHART_OF_ACCOUNTS_SHEET_NAME); Integer noOfEntries = ImportHandlerUtils.getNumberOfRows(chartOfAccountsSheet, TemplatePopulateImportConstants.FIRST_COLUMN_INDEX); @@ -225,18 +219,18 @@ public class ChartOfAccountsImportHandler implements ImportHandler { row = chartOfAccountsSheet.getRow(rowIndex); // - JournalEntryData journalEntry = null; - journalEntry = readAddJournalEntries(row, locale, dateFormat); - gltransaction.add(journalEntry); + JournalEntryData journalEntry; + journalEntry = readAddJournalEntries(row, credits, debits, locale, dateFormat); + glTransactions.add(journalEntry); } } // for opening balance - private JournalEntryData readAddJournalEntries(Row row, String locale, String dateFormat) { - transactionDate = DateUtils.getBusinessLocalDate(); + private JournalEntryData readAddJournalEntries(final Row row, final List credits, final List debits, + final String locale, String dateFormat) { + LocalDate transactionDate = DateUtils.getBusinessLocalDate(); - String officeName = ImportHandlerUtils.readAsString(ChartOfAcountsConstants.OFFICE_COL, row); Long officeId = ImportHandlerUtils.readAsLong(ChartOfAcountsConstants.OFFICE_COL_ID, row); String currencyCode = ImportHandlerUtils.readAsString(ChartOfAcountsConstants.CURRENCY_CODE, row); @@ -245,7 +239,7 @@ public class ChartOfAccountsImportHandler implements ImportHandler { GLAccount glAccount = this.glAccountRepository.findOneByGlCodeWithNotFoundDetection(glCode); Long glAccountIdToDebitedCredited = glAccount.getId(); if (glAccountIdToDebitedCredited == null) { - throw new RuntimeException("Account does not exist"); + throw new GLAccountNotFoundException("Account does not exist"); } // String credit = diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/client/ClientEntityImportHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/client/ClientEntityImportHandler.java index 91b7c0be6..dfcd26d4e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/client/ClientEntityImportHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/client/ClientEntityImportHandler.java @@ -22,9 +22,9 @@ import com.google.common.base.Splitter; import com.google.gson.GsonBuilder; import java.time.LocalDate; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.Objects; import org.apache.fineract.commands.domain.CommandWrapper; import org.apache.fineract.commands.service.CommandWrapperBuilder; import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService; @@ -34,7 +34,6 @@ import org.apache.fineract.infrastructure.bulkimport.data.Count; import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandler; import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandlerUtils; import org.apache.fineract.infrastructure.bulkimport.importhandler.helper.DateSerializer; -import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.serialization.GoogleGsonSerializerHelper; import org.apache.fineract.portfolio.address.data.AddressData; import org.apache.fineract.portfolio.client.data.ClientData; @@ -52,10 +51,8 @@ import org.springframework.stereotype.Service; @Service public class ClientEntityImportHandler implements ImportHandler { + public static final String SEPARATOR = "-"; private static final Logger LOG = LoggerFactory.getLogger(ClientEntityImportHandler.class); - private Workbook workbook; - private List clients; - private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; @Autowired @@ -64,26 +61,27 @@ public class ClientEntityImportHandler implements ImportHandler { } @Override - public Count process(Workbook workbook, String locale, String dateFormat) { - this.workbook = workbook; - this.clients = new ArrayList<>(); - readExcelFile(locale, dateFormat); - return importEntity(dateFormat); + public Count process(final Workbook workbook, final String locale, final String dateFormat) { + + List clients = readExcelFile(workbook, locale, dateFormat); + return importEntity(workbook, clients, dateFormat); } - public void readExcelFile(final String locale, final String dateFormat) { + private List readExcelFile(final Workbook workbook, final String locale, final String dateFormat) { + List clients = new ArrayList<>(); Sheet clientSheet = workbook.getSheet(TemplatePopulateImportConstants.CLIENT_ENTITY_SHEET_NAME); Integer noOfEntries = ImportHandlerUtils.getNumberOfRows(clientSheet, 0); for (int rowIndex = 1; rowIndex <= noOfEntries; rowIndex++) { Row row; row = clientSheet.getRow(rowIndex); if (ImportHandlerUtils.isNotImported(row, ClientEntityConstants.STATUS_COL)) { - clients.add(readClient(row, locale, dateFormat)); + clients.add(readClient(workbook, row, locale, dateFormat)); } } + return clients; } - private ClientData readClient(Row row, final String locale, final String dateFormat) { + private ClientData readClient(final Workbook workbook, final Row row, final String locale, final String dateFormat) { Long legalFormId = 2L; String name = ImportHandlerUtils.readAsString(ClientEntityConstants.NAME_COL, row); String officeName = ImportHandlerUtils.readAsString(ClientEntityConstants.OFFICE_NAME_COL, row); @@ -100,13 +98,13 @@ public class ClientEntityImportHandler implements ImportHandler { LocalDate incorporationTill = ImportHandlerUtils.readAsDate(ClientEntityConstants.INCOPORATION_VALID_TILL_COL, row); String mobileNo = null; if (ImportHandlerUtils.readAsLong(ClientEntityConstants.MOBILE_NO_COL, row) != null) { - mobileNo = ImportHandlerUtils.readAsLong(ClientEntityConstants.MOBILE_NO_COL, row).toString(); + mobileNo = Objects.requireNonNull(ImportHandlerUtils.readAsLong(ClientEntityConstants.MOBILE_NO_COL, row)).toString(); } String clientType = ImportHandlerUtils.readAsString(ClientEntityConstants.CLIENT_TYPE_COL, row); Long clientTypeId = null; if (clientType != null) { - List clientTypeAr = Splitter.on('-').splitToList(clientType); + List clientTypeAr = Splitter.on(SEPARATOR).splitToList(clientType); if (clientTypeAr.get(1) != null) { clientTypeId = Long.parseLong(clientTypeAr.get(1)); } @@ -114,7 +112,7 @@ public class ClientEntityImportHandler implements ImportHandler { String clientClassification = ImportHandlerUtils.readAsString(ClientEntityConstants.CLIENT_CLASSIFICATION_COL, row); Long clientClassicationId = null; if (clientClassification != null) { - List clientClassificationAr = Splitter.on('-').splitToList(clientClassification); + List clientClassificationAr = Splitter.on(SEPARATOR).splitToList(clientClassification); if (clientClassificationAr.get(1) != null) { clientClassicationId = Long.parseLong(clientClassificationAr.get(1)); } @@ -124,8 +122,8 @@ public class ClientEntityImportHandler implements ImportHandler { String mainBusinessLine = ImportHandlerUtils.readAsString(ClientEntityConstants.MAIN_BUSINESS_LINE, row); Long mainBusinessId = null; if (mainBusinessLine != null) { - List mainBusinessLineAr = Splitter.on('-') - .splitToList(ImportHandlerUtils.readAsString(ClientEntityConstants.MAIN_BUSINESS_LINE, row)); + List mainBusinessLineAr = Splitter.on(SEPARATOR) + .splitToList(Objects.requireNonNull(ImportHandlerUtils.readAsString(ClientEntityConstants.MAIN_BUSINESS_LINE, row))); if (mainBusinessLineAr.get(1) != null) { mainBusinessId = Long.parseLong(mainBusinessLineAr.get(1)); } @@ -133,7 +131,7 @@ public class ClientEntityImportHandler implements ImportHandler { String constitution = ImportHandlerUtils.readAsString(ClientEntityConstants.CONSTITUTION_COL, row); Long constitutionId = null; if (constitution != null) { - List constitutionAr = Splitter.on('-').splitToList(constitution); + List constitutionAr = Splitter.on(SEPARATOR).splitToList(constitution); if (constitutionAr.get(1) != null) { constitutionId = Long.parseLong(constitutionAr.get(1)); } @@ -153,13 +151,13 @@ public class ClientEntityImportHandler implements ImportHandler { if (!active) { activationDate = submittedOn; } - AddressData addressDataObj = null; + AddressData addressDataObj; Collection addressList = null; if (ImportHandlerUtils.readAsBoolean(ClientEntityConstants.ADDRESS_ENABLED, row)) { String addressType = ImportHandlerUtils.readAsString(ClientEntityConstants.ADDRESS_TYPE_COL, row); Long addressTypeId = null; if (addressType != null) { - List addressTypeAr = Splitter.on('-').splitToList(addressType); + List addressTypeAr = Splitter.on(SEPARATOR).splitToList(addressType); if (addressTypeAr.get(1) != null) { addressTypeId = Long.parseLong(addressTypeAr.get(1)); } @@ -176,7 +174,7 @@ public class ClientEntityImportHandler implements ImportHandler { String stateProvince = ImportHandlerUtils.readAsString(ClientEntityConstants.STATE_PROVINCE_COL, row); Long stateProvinceId = null; if (stateProvince != null) { - List stateProvinceAr = Splitter.on('-').splitToList(stateProvince); + List stateProvinceAr = Splitter.on(SEPARATOR).splitToList(stateProvince); if (stateProvinceAr.get(1) != null) { stateProvinceId = Long.parseLong(stateProvinceAr.get(1)); } @@ -184,26 +182,26 @@ public class ClientEntityImportHandler implements ImportHandler { String country = ImportHandlerUtils.readAsString(ClientEntityConstants.COUNTRY_COL, row); Long countryId = null; if (country != null) { - List countryAr = Splitter.on('-').splitToList(country); + List countryAr = Splitter.on(SEPARATOR).splitToList(country); if (countryAr.get(1) != null) { countryId = Long.parseLong(countryAr.get(1)); } } addressDataObj = new AddressData(addressTypeId, street, addressLine1, addressLine2, addressLine3, city, postalCode, isActiveAddress, stateProvinceId, countryId); - addressList = new ArrayList(Arrays.asList(addressDataObj)); + addressList = new ArrayList<>(List.of(addressDataObj)); } return ClientData.importClientEntityInstance(legalFormId, row.getRowNum(), name, officeId, clientTypeId, clientClassicationId, staffId, active, activationDate, submittedOn, externalId, incorportionDate, mobileNo, clientNonPersonData, addressList, locale, dateFormat); } - public Count importEntity(String dateFormat) { + private Count importEntity(final Workbook workbook, final List clients, final String dateFormat) { Sheet clientSheet = workbook.getSheet(TemplatePopulateImportConstants.CLIENT_ENTITY_SHEET_NAME); int successCount = 0; int errorCount = 0; - String errorMessage = ""; + String errorMessage; GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder(); gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat)); @@ -215,7 +213,7 @@ public class ClientEntityImportHandler implements ImportHandler { .createClient() // .withJson(payload) // .build(); // - final CommandProcessingResult result = commandsSourceWritePlatformService.logCommandSource(commandRequest); + commandsSourceWritePlatformService.logCommandSource(commandRequest); successCount++; Cell statusCell = clientSheet.getRow(client.getRowIndex()).createCell(ClientEntityConstants.STATUS_COL); statusCell.setCellValue(TemplatePopulateImportConstants.STATUS_CELL_IMPORTED); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/client/ClientPersonImportHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/client/ClientPersonImportHandler.java index d48aaea1b..3f76565a5 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/client/ClientPersonImportHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/client/ClientPersonImportHandler.java @@ -22,9 +22,9 @@ import com.google.common.base.Splitter; import com.google.gson.GsonBuilder; import java.time.LocalDate; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.Objects; import org.apache.fineract.commands.domain.CommandWrapper; import org.apache.fineract.commands.service.CommandWrapperBuilder; import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService; @@ -50,10 +50,8 @@ import org.springframework.stereotype.Service; @Service public class ClientPersonImportHandler implements ImportHandler { + public static final String SEPARATOR = "-"; private static final Logger LOG = LoggerFactory.getLogger(ClientPersonImportHandler.class); - private Workbook workbook; - private List clients; - private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; @Autowired @@ -62,26 +60,27 @@ public class ClientPersonImportHandler implements ImportHandler { } @Override - public Count process(Workbook workbook, String locale, String dateFormat) { - this.workbook = workbook; - this.clients = new ArrayList<>(); - readExcelFile(locale, dateFormat); - return importEntity(dateFormat); + public Count process(final Workbook workbook, final String locale, final String dateFormat) { + + List clients = readExcelFile(workbook, locale, dateFormat); + return importEntity(workbook, clients, dateFormat); } - public void readExcelFile(final String locale, final String dateFormat) { + public List readExcelFile(final Workbook workbook, final String locale, final String dateFormat) { + List clients = new ArrayList<>(); Sheet clientSheet = workbook.getSheet(TemplatePopulateImportConstants.CLIENT_PERSON_SHEET_NAME); Integer noOfEntries = ImportHandlerUtils.getNumberOfRows(clientSheet, 0); for (int rowIndex = 1; rowIndex <= noOfEntries; rowIndex++) { Row row; row = clientSheet.getRow(rowIndex); if (ImportHandlerUtils.isNotImported(row, ClientPersonConstants.STATUS_COL)) { - clients.add(readClient(row, locale, dateFormat)); + clients.add(readClient(workbook, row, locale, dateFormat)); } } + return clients; } - private ClientData readClient(Row row, final String locale, final String dateFormat) { + private ClientData readClient(final Workbook workbook, final Row row, final String locale, final String dateFormat) { Long legalFormId = 1L; String firstName = ImportHandlerUtils.readAsString(ClientPersonConstants.FIRST_NAME_COL, row); String lastName = ImportHandlerUtils.readAsString(ClientPersonConstants.LAST_NAME_COL, row); @@ -105,14 +104,14 @@ public class ClientPersonImportHandler implements ImportHandler { } String mobileNo = null; if (ImportHandlerUtils.readAsLong(ClientPersonConstants.MOBILE_NO_COL, row) != null) { - mobileNo = ImportHandlerUtils.readAsLong(ClientPersonConstants.MOBILE_NO_COL, row).toString(); + mobileNo = Objects.requireNonNull(ImportHandlerUtils.readAsLong(ClientPersonConstants.MOBILE_NO_COL, row)).toString(); } LocalDate dob = ImportHandlerUtils.readAsDate(ClientPersonConstants.DOB_COL, row); String clientType = ImportHandlerUtils.readAsString(ClientPersonConstants.CLIENT_TYPE_COL, row); Long clientTypeId = null; if (clientType != null) { - List clientTypeAr = Splitter.on('-').splitToList(clientType); + List clientTypeAr = Splitter.on(SEPARATOR).splitToList(clientType); if (clientTypeAr.size() > 1 && clientTypeAr.get(1) != null) { clientTypeId = Long.parseLong(clientTypeAr.get(1)); } @@ -120,7 +119,7 @@ public class ClientPersonImportHandler implements ImportHandler { String gender = ImportHandlerUtils.readAsString(ClientPersonConstants.GENDER_COL, row); Long genderId = null; if (gender != null) { - List genderAr = Splitter.on('-').splitToList(gender); + List genderAr = Splitter.on(SEPARATOR).splitToList(gender); if (genderAr.size() > 1 && genderAr.get(1) != null) { genderId = Long.parseLong(genderAr.get(1)); } @@ -128,7 +127,7 @@ public class ClientPersonImportHandler implements ImportHandler { String clientClassification = ImportHandlerUtils.readAsString(ClientPersonConstants.CLIENT_CLASSIFICATION_COL, row); Long clientClassificationId = null; if (clientClassification != null) { - List clientClassificationAr = Splitter.on('-').splitToList(clientClassification); + List clientClassificationAr = Splitter.on(SEPARATOR).splitToList(clientClassification); if (clientClassificationAr.size() > 1 && clientClassificationAr.get(1) != null) { clientClassificationId = Long.parseLong(clientClassificationAr.get(1)); } @@ -141,7 +140,7 @@ public class ClientPersonImportHandler implements ImportHandler { String addressType = ImportHandlerUtils.readAsString(ClientPersonConstants.ADDRESS_TYPE_COL, row); Long addressTypeId = null; if (addressType != null) { - List addressTypeAr = Splitter.on('-').splitToList(addressType); + List addressTypeAr = Splitter.on(SEPARATOR).splitToList(addressType); if (addressTypeAr.size() > 1 && addressTypeAr.get(1) != null) { addressTypeId = Long.parseLong(addressTypeAr.get(1)); @@ -159,7 +158,7 @@ public class ClientPersonImportHandler implements ImportHandler { String stateProvince = ImportHandlerUtils.readAsString(ClientPersonConstants.STATE_PROVINCE_COL, row); Long stateProvinceId = null; if (stateProvince != null) { - List stateProvinceAr = Splitter.on('-').splitToList(stateProvince); + List stateProvinceAr = Splitter.on(SEPARATOR).splitToList(stateProvince); // Arkansas-AL <-- expected format of the cell // but probably it's either an empty cell or it is missing a // hyphen @@ -170,14 +169,14 @@ public class ClientPersonImportHandler implements ImportHandler { String country = ImportHandlerUtils.readAsString(ClientPersonConstants.COUNTRY_COL, row); Long countryId = null; if (country != null) { - List countryAr = Splitter.on('-').splitToList(country); + List countryAr = Splitter.on(SEPARATOR).splitToList(country); if (countryAr.size() > 1 && countryAr.get(1) != null) { countryId = Long.parseLong(countryAr.get(1)); } } addressDataObj = new AddressData(addressTypeId, street, addressLine1, addressLine2, addressLine3, city, postalCode, isActiveAddress, stateProvinceId, countryId); - addressList = new ArrayList(Arrays.asList(addressDataObj)); + addressList = new ArrayList<>(List.of(addressDataObj)); } return ClientData.importClientPersonInstance(legalFormId, row.getRowNum(), firstName, lastName, middleName, submittedOn, activationDate, active, externalId, officeId, staffId, mobileNo, dob, clientTypeId, genderId, clientClassificationId, @@ -185,11 +184,11 @@ public class ClientPersonImportHandler implements ImportHandler { } - public Count importEntity(String dateFormat) { + public Count importEntity(final Workbook workbook, final List clients, final String dateFormat) { Sheet clientSheet = workbook.getSheet(TemplatePopulateImportConstants.CLIENT_PERSON_SHEET_NAME); int successCount = 0; int errorCount = 0; - String errorMessage = ""; + String errorMessage; GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder(); gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat)); for (ClientData client : clients) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/fixeddeposits/FixedDepositImportHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/fixeddeposits/FixedDepositImportHandler.java index 744904eef..229c1eedf 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/fixeddeposits/FixedDepositImportHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/fixeddeposits/FixedDepositImportHandler.java @@ -58,14 +58,6 @@ import org.springframework.stereotype.Service; public class FixedDepositImportHandler implements ImportHandler { private static final Logger LOG = LoggerFactory.getLogger(FixedDepositImportHandler.class); - private Workbook workbook; - - private List savings; - private List approvalDates; - private List activationDates; - private List closedOnDate; - private List statuses; - private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; @Autowired @@ -74,25 +66,28 @@ public class FixedDepositImportHandler implements ImportHandler { } @Override - public Count process(Workbook workbook, String locale, String dateFormat) { - this.workbook = workbook; - savings = new ArrayList<>(); - approvalDates = new ArrayList<>(); - activationDates = new ArrayList<>(); - closedOnDate = new ArrayList<>(); - statuses = new ArrayList<>(); - readExcelFile(locale, dateFormat); - return importEntity(dateFormat); + public Count process(final Workbook workbook, final String locale, final String dateFormat) { + + List savings = new ArrayList<>(); + List approvalDates = new ArrayList<>(); + List activationDates = new ArrayList<>(); + List closedOnDates = new ArrayList<>(); + List statuses = new ArrayList<>(); + + readExcelFile(workbook, savings, approvalDates, activationDates, closedOnDates, statuses, locale, dateFormat); + return importEntity(workbook, savings, approvalDates, activationDates, closedOnDates, statuses, dateFormat); } - public void readExcelFile(final String locale, final String dateFormat) { + private void readExcelFile(final Workbook workbook, final List savings, + final List approvalDates, final List activationDates, + final List closedOnDate, final List statuses, final String locale, final String dateFormat) { Sheet savingsSheet = workbook.getSheet(TemplatePopulateImportConstants.FIXED_DEPOSIT_SHEET_NAME); Integer noOfEntries = ImportHandlerUtils.getNumberOfRows(savingsSheet, TemplatePopulateImportConstants.FIRST_COLUMN_INDEX); for (int rowIndex = 1; rowIndex <= noOfEntries; rowIndex++) { Row row; row = savingsSheet.getRow(rowIndex); if (ImportHandlerUtils.isNotImported(row, FixedDepositConstants.STATUS_COL)) { - savings.add(readSavings(row, locale, dateFormat)); + savings.add(readSavings(workbook, statuses, row, locale, dateFormat)); approvalDates.add(readSavingsApproval(row, locale, dateFormat)); activationDates.add(readSavingsActivation(row, locale, dateFormat)); closedOnDate.add(readSavingsClosed(row, locale, dateFormat)); @@ -131,7 +126,8 @@ public class FixedDepositImportHandler implements ImportHandler { } } - private FixedDepositAccountData readSavings(Row row, String locale, String dateFormat) { + private FixedDepositAccountData readSavings(final Workbook workbook, final List statuses, final Row row, final String locale, + final String dateFormat) { String productName = ImportHandlerUtils.readAsString(FixedDepositConstants.PRODUCT_COL, row); Long productId = ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.PRODUCT_SHEET_NAME), productName); @@ -164,7 +160,7 @@ public class FixedDepositImportHandler implements ImportHandler { Long interestPostingPeriodTypeId = null; EnumOptionData interestPostingPeriodTypeEnum = null; - if (interestCompoundingPeriodType != null) { + if (interestPostingPeriodType != null) { if (interestPostingPeriodType.equalsIgnoreCase(TemplatePopulateImportConstants.INTEREST_POSTING_PERIOD_MONTHLY)) { interestPostingPeriodTypeId = 4L; } else if (interestPostingPeriodType.equalsIgnoreCase(TemplatePopulateImportConstants.INTEREST_POSTING_PERIOD_QUARTERLY)) { @@ -238,7 +234,7 @@ public class FixedDepositImportHandler implements ImportHandler { String externalId = ImportHandlerUtils.readAsString(FixedDepositConstants.EXTERNAL_ID_COL, row); String clientName = ImportHandlerUtils.readAsString(FixedDepositConstants.CLIENT_NAME_COL, row); - List charges = new ArrayList(); + List charges = new ArrayList<>(); String charge1 = ImportHandlerUtils.readAsString(FixedDepositConstants.CHARGE_ID_1, row); String charge2 = ImportHandlerUtils.readAsString(FixedDepositConstants.CHARGE_ID_2, row); @@ -273,7 +269,9 @@ public class FixedDepositImportHandler implements ImportHandler { depositPeriodFrequencyId, externalId, charges, row.getRowNum(), locale, dateFormat); } - public Count importEntity(String dateFormat) { + private Count importEntity(final Workbook workbook, final List savings, + final List approvalDates, final List activationDates, + final List closedOnDates, final List statuses, String dateFormat) { Sheet savingsSheet = workbook.getSheet(TemplatePopulateImportConstants.FIXED_DEPOSIT_SHEET_NAME); int successCount = 0; int errorCount = 0; @@ -289,7 +287,7 @@ public class FixedDepositImportHandler implements ImportHandler { progressLevel = getProgressLevel(status); if (progressLevel == 0) { - CommandProcessingResult result = importSavings(i, dateFormat); + CommandProcessingResult result = importSavings(savings, i, dateFormat); savingsId = result.getSavingsId(); progressLevel = 1; } else { @@ -298,15 +296,15 @@ public class FixedDepositImportHandler implements ImportHandler { } if (progressLevel <= 1) { - progressLevel = importSavingsApproval(savingsId, i, dateFormat); + progressLevel = importSavingsApproval(approvalDates, savingsId, i, dateFormat); } if (progressLevel <= 2) { - progressLevel = importSavingsActivation(savingsId, i, dateFormat); + progressLevel = importSavingsActivation(activationDates, savingsId, i, dateFormat); } if (progressLevel <= 3) { - progressLevel = importSavingsClosing(savingsId, i, dateFormat); + progressLevel = importSavingsClosing(closedOnDates, savingsId, i, dateFormat); } successCount++; @@ -316,7 +314,7 @@ public class FixedDepositImportHandler implements ImportHandler { errorCount++; LOG.error("Problem occurred in importEntity function", ex); errorMessage = ImportHandlerUtils.getErrorMessage(ex); - writeFixedDepositErrorMessage(savingsId, errorMessage, progressLevel, statusCell, errorReportCell, row); + writeFixedDepositErrorMessage(workbook, savingsId, errorMessage, progressLevel, statusCell, errorReportCell, row); } } @@ -324,8 +322,8 @@ public class FixedDepositImportHandler implements ImportHandler { return Count.instance(successCount, errorCount); } - private void writeFixedDepositErrorMessage(Long savingsId, String errorMessage, int progressLevel, Cell statusCell, - Cell errorReportCell, Row row) { + private void writeFixedDepositErrorMessage(final Workbook workbook, final Long savingsId, final String errorMessage, + final int progressLevel, final Cell statusCell, Cell errorReportCell, Row row) { String status = ""; if (progressLevel == 0) { status = TemplatePopulateImportConstants.STATUS_CREATION_FAILED; @@ -343,21 +341,22 @@ public class FixedDepositImportHandler implements ImportHandler { errorReportCell.setCellValue(errorMessage); } - private int importSavingsClosing(Long savingsId, int i, String dateFormat) { - if (closedOnDate.get(i) != null) { + private int importSavingsClosing(List closedOnDates, final Long savingsId, final int i, + final String dateFormat) { + if (closedOnDates.get(i) != null) { GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder(); gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat)); - String payload = gsonBuilder.create().toJson(closedOnDate.get(i)); + String payload = gsonBuilder.create().toJson(closedOnDates.get(i)); final CommandWrapper commandRequest = new CommandWrapperBuilder() // .closeFixedDepositAccount(savingsId)// .withJson(payload) // .build(); // - final CommandProcessingResult result = commandsSourceWritePlatformService.logCommandSource(commandRequest); + commandsSourceWritePlatformService.logCommandSource(commandRequest); } return 4; } - private CommandProcessingResult importSavings(int i, String dateFormat) { + private CommandProcessingResult importSavings(List savings, final int i, final String dateFormat) { GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder(); gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat)); gsonBuilder.registerTypeAdapter(EnumOptionData.class, new EnumOptionDataIdSerializer()); @@ -377,11 +376,11 @@ public class FixedDepositImportHandler implements ImportHandler { .createFixedDepositAccount() // .withJson(payload) // .build(); // - final CommandProcessingResult result = commandsSourceWritePlatformService.logCommandSource(commandRequest); - return result; + return commandsSourceWritePlatformService.logCommandSource(commandRequest); } - private int importSavingsApproval(Long savingsId, int i, String dateFormat) { + private int importSavingsApproval(final List approvalDates, final Long savingsId, final int i, + final String dateFormat) { if (approvalDates.get(i) != null) { GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder(); gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat)); @@ -390,12 +389,13 @@ public class FixedDepositImportHandler implements ImportHandler { .approveFixedDepositAccountApplication(savingsId)// .withJson(payload) // .build(); // - final CommandProcessingResult result = commandsSourceWritePlatformService.logCommandSource(commandRequest); + commandsSourceWritePlatformService.logCommandSource(commandRequest); } return 2; } - private int importSavingsActivation(Long savingsId, int i, String dateFormat) { + private int importSavingsActivation(final List activationDates, final Long savingsId, final int i, + final String dateFormat) { if (activationDates.get(i) != null) { GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder(); gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat)); @@ -404,7 +404,7 @@ public class FixedDepositImportHandler implements ImportHandler { .fixedDepositAccountActivation(savingsId)// .withJson(payload) // .build(); // - final CommandProcessingResult result = commandsSourceWritePlatformService.logCommandSource(commandRequest); + commandsSourceWritePlatformService.logCommandSource(commandRequest); } return 3; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/fixeddeposits/FixedDepositTransactionImportHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/fixeddeposits/FixedDepositTransactionImportHandler.java index b30df7d41..cea170251 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/fixeddeposits/FixedDepositTransactionImportHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/fixeddeposits/FixedDepositTransactionImportHandler.java @@ -34,7 +34,6 @@ import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandler import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandlerUtils; import org.apache.fineract.infrastructure.bulkimport.importhandler.helper.DateSerializer; import org.apache.fineract.infrastructure.bulkimport.importhandler.helper.SavingsAccountTransactionEnumValueSerialiser; -import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.serialization.GoogleGsonSerializerHelper; import org.apache.fineract.portfolio.savings.data.SavingsAccountTransactionData; import org.apache.fineract.portfolio.savings.data.SavingsAccountTransactionEnumData; @@ -51,11 +50,12 @@ import org.springframework.stereotype.Service; @Service public class FixedDepositTransactionImportHandler implements ImportHandler { + public static final String TRANSACTION_TYPE = "transactionType"; + public static final String REVERSED = "reversed"; + public static final String INTERESTED_POSTED_AS_ON = "interestedPostedAsOn"; + public static final String WITHDRAWAL = "Withdrawal"; + public static final String DEPOSIT = "Deposit"; private static final Logger LOG = LoggerFactory.getLogger(FixedDepositTransactionImportHandler.class); - private Workbook workbook; - private List savingsTransactions; - private String savingsAccountId = ""; - private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; @Autowired @@ -64,33 +64,34 @@ public class FixedDepositTransactionImportHandler implements ImportHandler { } @Override - public Count process(Workbook workbook, String locale, String dateFormat) { - this.workbook = workbook; - this.savingsTransactions = new ArrayList<>(); - readExcelFile(locale, dateFormat); - return importEntity(dateFormat); + public Count process(final Workbook workbook, final String locale, final String dateFormat) { + List savingsTransactions = readExcelFile(workbook, locale, dateFormat); + return importEntity(workbook, savingsTransactions, dateFormat); } - public void readExcelFile(final String locale, final String dateFormat) { + public List readExcelFile(final Workbook workbook, final String locale, final String dateFormat) { + List savingsTransactions = new ArrayList<>(); Sheet savingsTransactionSheet = workbook.getSheet(TemplatePopulateImportConstants.FIXED_DEPOSIT_TRANSACTION_SHEET_NAME); Integer noOfEntries = ImportHandlerUtils.getNumberOfRows(savingsTransactionSheet, TransactionConstants.AMOUNT_COL); + Long savingsAccountId = null; for (int rowIndex = 1; rowIndex <= noOfEntries; rowIndex++) { Row row; row = savingsTransactionSheet.getRow(rowIndex); if (ImportHandlerUtils.isNotImported(row, TransactionConstants.STATUS_COL)) { - savingsTransactions.add(readSavingsTransaction(row, locale, dateFormat)); + savingsTransactions.add(readSavingsTransaction(workbook, row, savingsAccountId, locale, dateFormat)); } } + return savingsTransactions; } - private SavingsAccountTransactionData readSavingsTransaction(Row row, String locale, String dateFormat) { - String savingsAccountIdCheck = null; - if (ImportHandlerUtils.readAsLong(TransactionConstants.SAVINGS_ACCOUNT_NO_COL, row) != null) { - savingsAccountIdCheck = ImportHandlerUtils.readAsLong(TransactionConstants.SAVINGS_ACCOUNT_NO_COL, row).toString(); - } - if (savingsAccountIdCheck != null) { - savingsAccountId = savingsAccountIdCheck; + private SavingsAccountTransactionData readSavingsTransaction(final Workbook workbook, final Row row, Long savingsAccountId, + final String locale, final String dateFormat) { + + Long newSavingsAccountId = ImportHandlerUtils.readAsLong(TransactionConstants.SAVINGS_ACCOUNT_NO_COL, row); + if (newSavingsAccountId != null) { + savingsAccountId = newSavingsAccountId; } + String transactionType = ImportHandlerUtils.readAsString(TransactionConstants.TRANSACTION_TYPE_COL, row); SavingsAccountTransactionEnumData savingsAccountTransactionEnumData = new SavingsAccountTransactionEnumData(null, null, transactionType); @@ -110,12 +111,12 @@ public class FixedDepositTransactionImportHandler implements ImportHandler { String receiptNumber = ImportHandlerUtils.readAsString(TransactionConstants.RECEIPT_NO_COL, row); String bankNumber = ImportHandlerUtils.readAsString(TransactionConstants.BANK_NO_COL, row); return SavingsAccountTransactionData.importInstance(amount, transactionDate, paymentTypeId, accountNumber, checkNumber, routingCode, - receiptNumber, bankNumber, Long.parseLong(savingsAccountId), savingsAccountTransactionEnumData, row.getRowNum(), locale, - dateFormat); + receiptNumber, bankNumber, savingsAccountId, savingsAccountTransactionEnumData, row.getRowNum(), locale, dateFormat); } - public Count importEntity(String dateFormat) { + public Count importEntity(final Workbook workbook, final List savingsTransactions, + final String dateFormat) { Sheet savingsTransactionSheet = workbook.getSheet(TemplatePopulateImportConstants.FIXED_DEPOSIT_TRANSACTION_SHEET_NAME); int successCount = 0; int errorCount = 0; @@ -127,24 +128,24 @@ public class FixedDepositTransactionImportHandler implements ImportHandler { for (SavingsAccountTransactionData transaction : savingsTransactions) { try { JsonObject savingsTransactionJsonob = gsonBuilder.create().toJsonTree(transaction).getAsJsonObject(); - savingsTransactionJsonob.remove("transactionType"); - savingsTransactionJsonob.remove("reversed"); - savingsTransactionJsonob.remove("interestedPostedAsOn"); + savingsTransactionJsonob.remove(TRANSACTION_TYPE); + savingsTransactionJsonob.remove(REVERSED); + savingsTransactionJsonob.remove(INTERESTED_POSTED_AS_ON); String payload = savingsTransactionJsonob.toString(); CommandWrapper commandRequest = null; - if (transaction.getTransactionType().getValue().equals("Withdrawal")) { + if (transaction.getTransactionType().getValue().equals(WITHDRAWAL)) { commandRequest = new CommandWrapperBuilder() // .fixedDepositAccountWithdrawal(transaction.getSavingsAccountId()) // .withJson(payload) // .build(); // - } else if (transaction.getTransactionType().getValue().equals("Deposit")) { + } else if (transaction.getTransactionType().getValue().equals(DEPOSIT)) { commandRequest = new CommandWrapperBuilder() // .fixedDepositAccountDeposit(transaction.getSavingsAccountId()) // .withJson(payload) // .build(); } - final CommandProcessingResult result = commandsSourceWritePlatformService.logCommandSource(commandRequest); + commandsSourceWritePlatformService.logCommandSource(commandRequest); successCount++; Cell statusCell = savingsTransactionSheet.getRow(transaction.getRowIndex()).createCell(TransactionConstants.STATUS_COL); statusCell.setCellValue(TemplatePopulateImportConstants.STATUS_CELL_IMPORTED); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/group/GroupImportHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/group/GroupImportHandler.java index b792fcb5b..2fa48085a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/group/GroupImportHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/group/GroupImportHandler.java @@ -25,6 +25,7 @@ import java.time.LocalDate; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Objects; import org.apache.fineract.commands.domain.CommandWrapper; import org.apache.fineract.commands.service.CommandWrapperBuilder; import org.apache.fineract.commands.service.IdempotencyKeyGenerator; @@ -57,10 +58,6 @@ import org.springframework.stereotype.Service; public class GroupImportHandler implements ImportHandler { private static final Logger LOG = LoggerFactory.getLogger(GroupImportHandler.class); - private List groups; - private List meetings; - private Workbook workbook; - private List statuses; private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; private final IdempotencyKeyGenerator idempotencyKeyGenerator; @@ -73,23 +70,24 @@ public class GroupImportHandler implements ImportHandler { } @Override - public Count process(Workbook workbook, String locale, String dateFormat) { - this.workbook = workbook; - groups = new ArrayList<>(); - meetings = new ArrayList<>(); - statuses = new ArrayList<>(); - readExcelFile(locale, dateFormat); - return importEntity(dateFormat); + public Count process(final Workbook workbook, final String locale, final String dateFormat) { + + List groups = new ArrayList<>(); + List meetings = new ArrayList<>(); + List statuses = new ArrayList<>(); + readExcelFile(workbook, groups, meetings, statuses, locale, dateFormat); + return importEntity(workbook, groups, meetings, statuses, dateFormat); } - public void readExcelFile(String locale, String dateFormat) { + private void readExcelFile(final Workbook workbook, final List groups, final List meetings, + final List statuses, final String locale, final String dateFormat) { Sheet groupsSheet = workbook.getSheet(TemplatePopulateImportConstants.GROUP_SHEET_NAME); Integer noOfEntries = ImportHandlerUtils.getNumberOfRows(groupsSheet, TemplatePopulateImportConstants.FIRST_COLUMN_INDEX); for (int rowIndex = 1; rowIndex <= noOfEntries; rowIndex++) { Row row; row = groupsSheet.getRow(rowIndex); if (ImportHandlerUtils.isNotImported(row, GroupConstants.STATUS_COL)) { - groups.add(readGroup(row, locale, dateFormat)); + groups.add(readGroup(workbook, row, statuses, locale, dateFormat)); meetings.add(readMeeting(row, locale, dateFormat)); } } @@ -116,7 +114,8 @@ public class GroupImportHandler implements ImportHandler { } } - private GroupGeneralData readGroup(Row row, String locale, String dateFormat) { + private GroupGeneralData readGroup(final Workbook workbook, final Row row, final List statuses, final String locale, + final String dateFormat) { String status = ImportHandlerUtils.readAsString(GroupConstants.STATUS_COL, row); String officeName = ImportHandlerUtils.readAsString(GroupConstants.OFFICE_NAME_COL, row); Long officeId = ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.OFFICE_SHEET_NAME), officeName); @@ -167,7 +166,8 @@ public class GroupImportHandler implements ImportHandler { return false; } - public Count importEntity(String dateFormat) { + private Count importEntity(final Workbook workbook, final List groups, final List meetings, + final List statuses, final String dateFormat) { Sheet groupSheet = workbook.getSheet(TemplatePopulateImportConstants.GROUP_SHEET_NAME); int successCount = 0; int errorCount = 0; @@ -184,16 +184,17 @@ public class GroupImportHandler implements ImportHandler { progressLevel = getProgressLevel(status); if (progressLevel == 0) { - result = importGroup(i, dateFormat); + result = importGroup(groups, i, dateFormat); groupId = result.getGroupId().toString(); progressLevel = 1; } else { - groupId = ImportHandlerUtils.readAsInt(GroupConstants.GROUP_ID_COL, groupSheet.getRow(groups.get(i).getRowIndex())) + groupId = Objects.requireNonNull( + ImportHandlerUtils.readAsInt(GroupConstants.GROUP_ID_COL, groupSheet.getRow(groups.get(i).getRowIndex()))) .toString(); } if (meetings.get(i) != null && groups.get(i).getCenterId() == null) { - progressLevel = importGroupMeeting(result, i, dateFormat); + progressLevel = importGroupMeeting(meetings, Objects.requireNonNull(result), i, dateFormat); } statusCell.setCellValue(TemplatePopulateImportConstants.STATUS_CELL_IMPORTED); @@ -202,15 +203,15 @@ public class GroupImportHandler implements ImportHandler { errorCount++; LOG.error("Problem occurred in importEntity function", ex); errorMessage = ImportHandlerUtils.getErrorMessage(ex); - writeGroupErrorMessage(groupId, errorMessage, progressLevel, statusCell, errorReportCell, row); + writeGroupErrorMessage(workbook, groupId, errorMessage, progressLevel, statusCell, errorReportCell, row); } } setReportHeaders(groupSheet); return Count.instance(successCount, errorCount); } - private void writeGroupErrorMessage(String groupId, String errorMessage, int progressLevel, Cell statusCell, Cell errorReportCell, - Row row) { + private void writeGroupErrorMessage(final Workbook workbook, final String groupId, final String errorMessage, final int progressLevel, + final Cell statusCell, final Cell errorReportCell, final Row row) { String status = ""; if (progressLevel == 0) { status = TemplatePopulateImportConstants.STATUS_CREATION_FAILED; @@ -235,7 +236,7 @@ public class GroupImportHandler implements ImportHandler { TemplatePopulateImportConstants.FAILURE_COL_REPORT_HEADER); } - private Integer importGroupMeeting(CommandProcessingResult result, int rowIndex, String dateFormat) { + private Integer importGroupMeeting(final List meetings, CommandProcessingResult result, int rowIndex, String dateFormat) { CalendarData calendarData = meetings.get(rowIndex); calendarData.setTitle("group_" + result.getGroupId().toString() + "_CollectionMeeting"); GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder(); @@ -250,22 +251,23 @@ public class GroupImportHandler implements ImportHandler { .createCalendar(commandWrapper, TemplatePopulateImportConstants.CENTER_ENTITY_TYPE, result.getGroupId()) // .withJson(payload) // .build(); // - final CommandProcessingResult meetingresult = commandsSourceWritePlatformService.logCommandSource(commandRequest); + commandsSourceWritePlatformService.logCommandSource(commandRequest); return 2; } - private CommandProcessingResult importGroup(int rowIndex, String dateFormat) { + private CommandProcessingResult importGroup(final List groups, final int rowIndex, final String dateFormat) { GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder(); gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat)); - Type clientCollectionType = new TypeToken>() {}.getType(); + Type clientCollectionType = new TypeToken>() { + + }.getType(); gsonBuilder.registerTypeAdapter(clientCollectionType, new ClientIdSerializer()); String payload = gsonBuilder.create().toJson(groups.get(rowIndex)); final CommandWrapper commandRequest = new CommandWrapperBuilder() // .createGroup() // .withJson(payload) // .build(); // - final CommandProcessingResult result = commandsSourceWritePlatformService.logCommandSource(commandRequest); - return result; + return commandsSourceWritePlatformService.logCommandSource(commandRequest); } private int getProgressLevel(String status) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/guarantor/GuarantorImportHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/guarantor/GuarantorImportHandler.java index a14dfbf4f..e8b8c8c8b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/guarantor/GuarantorImportHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/guarantor/GuarantorImportHandler.java @@ -34,7 +34,6 @@ import org.apache.fineract.infrastructure.bulkimport.data.Count; import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandler; import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandlerUtils; import org.apache.fineract.infrastructure.bulkimport.importhandler.helper.DateSerializer; -import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.serialization.GoogleGsonSerializerHelper; import org.apache.fineract.portfolio.loanaccount.guarantor.data.GuarantorData; import org.apache.poi.ss.usermodel.Cell; @@ -50,11 +49,8 @@ import org.springframework.stereotype.Service; @Service public class GuarantorImportHandler implements ImportHandler { + public static final String SEPARATOR = "-"; private static final Logger LOG = LoggerFactory.getLogger(GuarantorImportHandler.class); - private Workbook workbook; - private List guarantors; - private Long loanAccountId; - private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; @Autowired @@ -63,30 +59,31 @@ public class GuarantorImportHandler implements ImportHandler { } @Override - public Count process(Workbook workbook, String locale, String dateFormat) { - this.workbook = workbook; - this.guarantors = new ArrayList<>(); - readExcelFile(locale, dateFormat); - return importEntity(dateFormat); + public Count process(final Workbook workbook, final String locale, final String dateFormat) { + List guarantors = readExcelFile(workbook, locale, dateFormat); + return importEntity(workbook, guarantors, dateFormat); } - public void readExcelFile(final String locale, final String dateFormat) { + private List readExcelFile(final Workbook workbook, final String locale, final String dateFormat) { + List guarantors = new ArrayList<>(); Sheet addGuarantorSheet = workbook.getSheet(TemplatePopulateImportConstants.GUARANTOR_SHEET_NAME); Integer noOfEntries = ImportHandlerUtils.getNumberOfRows(addGuarantorSheet, GuarantorConstants.LOAN_ACCOUNT_NO_COL); + Long loanAccountId = null; for (int rowIndex = 1; rowIndex <= noOfEntries; rowIndex++) { Row row; row = addGuarantorSheet.getRow(rowIndex); if (ImportHandlerUtils.isNotImported(row, GuarantorConstants.STATUS_COL)) { - guarantors.add(readGuarantor(row, locale, dateFormat)); + guarantors.add(readGuarantor(workbook, row, loanAccountId, locale, dateFormat)); } - } + return guarantors; } - private GuarantorData readGuarantor(Row row, String locale, String dateFormat) { + private GuarantorData readGuarantor(final Workbook workbook, final Row row, Long loanAccountId, final String locale, + final String dateFormat) { String loanaccountInfo = ImportHandlerUtils.readAsString(GuarantorConstants.LOAN_ACCOUNT_NO_COL, row); if (loanaccountInfo != null) { - List loanAccountAr = Splitter.on('-').splitToList(loanaccountInfo); + List loanAccountAr = Splitter.on(SEPARATOR).splitToList(loanaccountInfo); loanAccountId = Long.parseLong(loanAccountAr.get(0)); } String guarantorType = ImportHandlerUtils.readAsString(GuarantorConstants.GUARANTO_TYPE_COL, row); @@ -104,7 +101,7 @@ public class GuarantorImportHandler implements ImportHandler { String clientRelationshipTypeInfo = ImportHandlerUtils.readAsString(GuarantorConstants.CLIENT_RELATIONSHIP_TYPE_COL, row); Integer clientRelationshipTypeId = null; if (clientRelationshipTypeInfo != null) { - List clientRelationshipTypeAr = Splitter.on('-').splitToList(clientRelationshipTypeInfo); + List clientRelationshipTypeAr = Splitter.on(SEPARATOR).splitToList(clientRelationshipTypeInfo); clientRelationshipTypeId = Integer.parseInt(clientRelationshipTypeAr.get(1)); } String firstname = ImportHandlerUtils.readAsString(GuarantorConstants.FIRST_NAME_COL, row); @@ -121,7 +118,7 @@ public class GuarantorImportHandler implements ImportHandler { addressLine2, city, dob, zip, savingsId, amount, row.getRowNum(), loanAccountId, locale, dateFormat); } - public Count importEntity(String dateFormat) { + private Count importEntity(final Workbook workbook, final List guarantors, final String dateFormat) { Sheet addGuarantorSheet = workbook.getSheet(TemplatePopulateImportConstants.GUARANTOR_SHEET_NAME); int successCount = 0; int errorCount = 0; @@ -137,7 +134,7 @@ public class GuarantorImportHandler implements ImportHandler { .createGuarantor(guarantor.getAccountId()) // .withJson(payload) // .build(); // - final CommandProcessingResult result = commandsSourceWritePlatformService.logCommandSource(commandRequest); + commandsSourceWritePlatformService.logCommandSource(commandRequest); successCount++; Cell statusCell = addGuarantorSheet.getRow(guarantor.getRowIndex()).createCell(GuarantorConstants.STATUS_COL); statusCell.setCellValue(TemplatePopulateImportConstants.STATUS_CELL_IMPORTED); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/journalentry/JournalEntriesImportHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/journalentry/JournalEntriesImportHandler.java index 74a1d8904..98ddc20c9 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/journalentry/JournalEntriesImportHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/journalentry/JournalEntriesImportHandler.java @@ -35,7 +35,6 @@ import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandler import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandlerUtils; import org.apache.fineract.infrastructure.bulkimport.importhandler.helper.CurrencyDateCodeSerializer; import org.apache.fineract.infrastructure.bulkimport.importhandler.helper.DateSerializer; -import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.serialization.GoogleGsonSerializerHelper; import org.apache.fineract.organisation.monetary.data.CurrencyData; import org.apache.poi.ss.usermodel.Cell; @@ -52,12 +51,6 @@ import org.springframework.stereotype.Service; public class JournalEntriesImportHandler implements ImportHandler { private static final Logger LOG = LoggerFactory.getLogger(JournalEntriesImportHandler.class); - private Workbook workbook; - private List gltransaction; - private LocalDate transactionDate; - - List credits = new ArrayList<>(); - List debits = new ArrayList<>(); private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; @@ -67,17 +60,18 @@ public class JournalEntriesImportHandler implements ImportHandler { } @Override - public Count process(Workbook workbook, String locale, String dateFormat) { - this.workbook = workbook; - gltransaction = new ArrayList<>(); - readExcelFile(locale, dateFormat); - return importEntity(dateFormat); + public Count process(final Workbook workbook, final String locale, final String dateFormat) { + + List glTransactions = readExcelFile(workbook, locale, dateFormat); + return importEntity(workbook, glTransactions, dateFormat); } - public void readExcelFile(final String locale, final String dateFormat) { + private List readExcelFile(final Workbook workbook, final String locale, final String dateFormat) { + List glTransactions = new ArrayList<>(); String currentTransactionId = null; String prevTransactionId = null; JournalEntryData journalEntry = null; + LocalDate transactionDate = null; Sheet addJournalEntriesSheet = workbook.getSheet(TemplatePopulateImportConstants.JOURNAL_ENTRY_SHEET_NAME); Integer noOfEntries = ImportHandlerUtils.getNumberOfRows(addJournalEntriesSheet, 4); @@ -120,22 +114,20 @@ public class JournalEntriesImportHandler implements ImportHandler { } } } else { - if (journalEntry != null) { - gltransaction.add(journalEntry); - journalEntry = null; + glTransactions.add(journalEntry); } - - journalEntry = readAddJournalEntries(row, locale, dateFormat); - + journalEntry = readAddJournalEntries(workbook, row, transactionDate, locale, dateFormat); } prevTransactionId = currentTransactionId; } // Adding last JE - gltransaction.add(journalEntry); + glTransactions.add(journalEntry); + return glTransactions; } - private JournalEntryData readAddJournalEntries(Row row, String locale, String dateFormat) { + private JournalEntryData readAddJournalEntries(final Workbook workbook, final Row row, LocalDate transactionDate, final String locale, + final String dateFormat) { LocalDate transactionDateCheck = ImportHandlerUtils.readAsDate(JournalEntryConstants.TRANSACION_ON_DATE_COL, row); if (transactionDateCheck != null) { transactionDate = transactionDateCheck; @@ -147,8 +139,8 @@ public class JournalEntriesImportHandler implements ImportHandler { Long paymentTypeId = ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.EXTRAS_SHEET_NAME), paymentType); String currencyName = ImportHandlerUtils.readAsString(JournalEntryConstants.CURRENCY_NAME_COL, row); - String currencyCode = ImportHandlerUtils - .getCodeByName(workbook.getSheet(TemplatePopulateImportConstants.EXTRAS_SHEET_NAME), currencyName).toString(); + String currencyCode = ImportHandlerUtils.getCodeByName(workbook.getSheet(TemplatePopulateImportConstants.EXTRAS_SHEET_NAME), + currencyName); String glAccountNameCredit = ImportHandlerUtils.readAsString(JournalEntryConstants.GL_ACCOUNT_ID_CREDIT_COL, row); Long glAccountIdCredit = ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.GL_ACCOUNTS_SHEET_NAME), glAccountNameCredit); @@ -156,8 +148,8 @@ public class JournalEntriesImportHandler implements ImportHandler { Long glAccountIdDebit = ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.GL_ACCOUNTS_SHEET_NAME), glAccountNameDebit); - credits = new ArrayList<>(); - debits = new ArrayList<>(); + List credits = new ArrayList<>(); + List debits = new ArrayList<>(); // String credit = // readAsString(JournalEntryConstants.GL_ACCOUNT_ID_CREDIT_COL, row); @@ -193,7 +185,7 @@ public class JournalEntriesImportHandler implements ImportHandler { } - public Count importEntity(String dateFormat) { + private Count importEntity(final Workbook workbook, final List glTransactions, String dateFormat) { Sheet addJournalEntriesSheet = workbook.getSheet(TemplatePopulateImportConstants.JOURNAL_ENTRY_SHEET_NAME); int successCount = 0; int errorCount = 0; @@ -202,14 +194,14 @@ public class JournalEntriesImportHandler implements ImportHandler { gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat)); gsonBuilder.registerTypeAdapter(CurrencyData.class, new CurrencyDateCodeSerializer()); - for (JournalEntryData transaction : gltransaction) { + for (JournalEntryData transaction : glTransactions) { try { String payload = gsonBuilder.create().toJson(transaction); final CommandWrapper commandRequest = new CommandWrapperBuilder() // .createJournalEntry() // .withJson(payload) // .build(); // - final CommandProcessingResult result = commandsSourceWritePlatformService.logCommandSource(commandRequest); + commandsSourceWritePlatformService.logCommandSource(commandRequest); successCount++; Cell statusCell = addJournalEntriesSheet.getRow(transaction.getRowIndex()).createCell(JournalEntryConstants.STATUS_COL); statusCell.setCellValue(TemplatePopulateImportConstants.STATUS_CELL_IMPORTED); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/loan/LoanImportHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/loan/LoanImportHandler.java index 17c544b09..11ffbc05a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/loan/LoanImportHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/loan/LoanImportHandler.java @@ -27,6 +27,7 @@ import java.time.LocalDate; import java.util.ArrayList; import java.util.List; import java.util.Locale; +import java.util.Objects; import org.apache.fineract.commands.domain.CommandWrapper; import org.apache.fineract.commands.service.CommandWrapperBuilder; import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService; @@ -61,14 +62,8 @@ import org.springframework.stereotype.Service; @Service public class LoanImportHandler implements ImportHandler { + public static final String EMPTY_STR = ""; private static final Logger LOG = LoggerFactory.getLogger(LoanImportHandler.class); - private Workbook workbook; - private List loans; - private List approvalDates; - private List loanRepayments; - private List disbursalDates; - private List statuses; - private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; @Autowired @@ -77,34 +72,35 @@ public class LoanImportHandler implements ImportHandler { } @Override - public Count process(Workbook workbook, String locale, String dateFormat) { - this.workbook = workbook; - this.loans = new ArrayList<>(); - this.approvalDates = new ArrayList<>(); - this.loanRepayments = new ArrayList<>(); - this.disbursalDates = new ArrayList<>(); - this.statuses = new ArrayList<>(); - readExcelFile(locale, dateFormat); - return importEntity(dateFormat); + public Count process(final Workbook workbook, final String locale, final String dateFormat) { + List loans = new ArrayList<>(); + List approvalDates = new ArrayList<>(); + List loanRepayments = new ArrayList<>(); + List disbursalDates = new ArrayList<>(); + List statuses = new ArrayList<>(); + readExcelFile(workbook, loans, approvalDates, loanRepayments, disbursalDates, statuses, locale, dateFormat); + return importEntity(workbook, loans, approvalDates, loanRepayments, disbursalDates, statuses, dateFormat); } - public void readExcelFile(final String locale, final String dateFormat) { + private void readExcelFile(final Workbook workbook, final List loans, final List approvalDates, + final List loanRepayments, final List disbursalDates, List statuses, + final String locale, final String dateFormat) { Sheet loanSheet = workbook.getSheet(TemplatePopulateImportConstants.LOANS_SHEET_NAME); Integer noOfEntries = ImportHandlerUtils.getNumberOfRows(loanSheet, TemplatePopulateImportConstants.FIRST_COLUMN_INDEX); for (int rowIndex = 1; rowIndex <= noOfEntries; rowIndex++) { Row row; row = loanSheet.getRow(rowIndex); if (ImportHandlerUtils.isNotImported(row, LoanConstants.STATUS_COL)) { - loans.add(readLoan(row, locale, dateFormat)); + loans.add(readLoan(workbook, row, statuses, locale, dateFormat)); approvalDates.add(readLoanApproval(row, locale, dateFormat)); disbursalDates.add(readDisbursalData(row, locale, dateFormat)); - loanRepayments.add(readLoanRepayment(row, locale, dateFormat)); + loanRepayments.add(readLoanRepayment(workbook, row, locale, dateFormat)); } } } - private LoanTransactionData readLoanRepayment(Row row, String locale, String dateFormat) { + private LoanTransactionData readLoanRepayment(final Workbook workbook, final Row row, final String locale, final String dateFormat) { BigDecimal repaymentAmount = null; if (ImportHandlerUtils.readAsDouble(LoanConstants.TOTAL_AMOUNT_REPAID_COL, row) != null) { repaymentAmount = BigDecimal.valueOf(ImportHandlerUtils.readAsDouble(LoanConstants.TOTAL_AMOUNT_REPAID_COL, row)); @@ -121,11 +117,11 @@ public class LoanImportHandler implements ImportHandler { return null; } - private DisbursementData readDisbursalData(Row row, String locale, String dateFormat) { + private DisbursementData readDisbursalData(final Row row, final String locale, final String dateFormat) { LocalDate disbursedDate = ImportHandlerUtils.readAsDate(LoanConstants.DISBURSED_DATE_COL, row); String linkAccountId = null; if (ImportHandlerUtils.readAsLong(LoanConstants.LINK_ACCOUNT_ID, row) != null) { - linkAccountId = ImportHandlerUtils.readAsLong(LoanConstants.LINK_ACCOUNT_ID, row).toString(); + linkAccountId = Objects.requireNonNull(ImportHandlerUtils.readAsLong(LoanConstants.LINK_ACCOUNT_ID, row)).toString(); } if (disbursedDate != null) { @@ -134,7 +130,7 @@ public class LoanImportHandler implements ImportHandler { return null; } - private LoanApprovalData readLoanApproval(Row row, String locale, String dateFormat) { + private LoanApprovalData readLoanApproval(final Row row, final String locale, final String dateFormat) { LocalDate approvedDate = ImportHandlerUtils.readAsDate(LoanConstants.APPROVED_DATE_COL, row); if (approvedDate != null) { return LoanApprovalData.importInstance(approvedDate, row.getRowNum(), locale, dateFormat); @@ -143,7 +139,8 @@ public class LoanImportHandler implements ImportHandler { return null; } - private LoanAccountData readLoan(Row row, String locale, String dateFormat) { + private LoanAccountData readLoan(final Workbook workbook, final Row row, final List statuses, final String locale, + final String dateFormat) { String externalId = ImportHandlerUtils.readAsString(LoanConstants.EXTERNAL_ID_COL, row); String status = ImportHandlerUtils.readAsString(LoanConstants.STATUS_COL, row); String productName = ImportHandlerUtils.readAsString(LoanConstants.PRODUCT_COL, row); @@ -167,7 +164,7 @@ public class LoanImportHandler implements ImportHandler { Integer numberOfRepayments = ImportHandlerUtils.readAsInt(LoanConstants.NO_OF_REPAYMENTS_COL, row); Integer repaidEvery = ImportHandlerUtils.readAsInt(LoanConstants.REPAID_EVERY_COL, row); String repaidEveryFrequency = ImportHandlerUtils.readAsString(LoanConstants.REPAID_EVERY_FREQUENCY_COL, row); - String repaidEveryFrequencyId = ""; + String repaidEveryFrequencyId = EMPTY_STR; EnumOptionData repaidEveryFrequencyEnums = null; if (repaidEveryFrequency != null) { if (repaidEveryFrequency.equalsIgnoreCase("Days")) { @@ -185,7 +182,7 @@ public class LoanImportHandler implements ImportHandler { String loanTermFrequencyType = ImportHandlerUtils.readAsString(LoanConstants.LOAN_TERM_FREQUENCY_COL, row); EnumOptionData loanTermFrequencyEnum = null; if (loanTermFrequencyType != null) { - String loanTermFrequencyId = ""; + String loanTermFrequencyId = EMPTY_STR; if (loanTermFrequencyType.equalsIgnoreCase("Days")) { loanTermFrequencyId = "0"; } else if (loanTermFrequencyType.equalsIgnoreCase("Weeks")) { @@ -200,7 +197,7 @@ public class LoanImportHandler implements ImportHandler { nominalInterestRate = BigDecimal.valueOf(ImportHandlerUtils.readAsDouble(LoanConstants.NOMINAL_INTEREST_RATE_COL, row)); } String amortization = ImportHandlerUtils.readAsString(LoanConstants.AMORTIZATION_COL, row); - String amortizationId = ""; + String amortizationId = EMPTY_STR; EnumOptionData amortizationEnumOption = null; if (amortization != null) { if (amortization.equalsIgnoreCase("Equal principal payments")) { @@ -211,7 +208,7 @@ public class LoanImportHandler implements ImportHandler { amortizationEnumOption = new EnumOptionData(null, null, amortizationId); } String interestMethod = ImportHandlerUtils.readAsString(LoanConstants.INTEREST_METHOD_COL, row); - String interestMethodId = ""; + String interestMethodId = EMPTY_STR; EnumOptionData interestMethodEnum = null; if (interestMethod != null) { if (interestMethod.equalsIgnoreCase("Flat")) { @@ -222,7 +219,7 @@ public class LoanImportHandler implements ImportHandler { interestMethodEnum = new EnumOptionData(null, null, interestMethodId); } String interestCalculationPeriod = ImportHandlerUtils.readAsString(LoanConstants.INTEREST_CALCULATION_PERIOD_COL, row); - String interestCalculationPeriodId = ""; + String interestCalculationPeriodId = EMPTY_STR; EnumOptionData interestCalculationPeriodEnum = null; if (interestCalculationPeriod != null) { if (interestCalculationPeriod.equalsIgnoreCase("Daily")) { @@ -385,25 +382,27 @@ public class LoanImportHandler implements ImportHandler { return null; } - public Count importEntity(String dateFormat) { + private Count importEntity(final Workbook workbook, final List loans, final List approvalDates, + final List loanRepayments, final List disbursalDates, final List statuses, + final String dateFormat) { Sheet loanSheet = workbook.getSheet(TemplatePopulateImportConstants.LOANS_SHEET_NAME); int successCount = 0; int errorCount = 0; int progressLevel = 0; String loanId; - String errorMessage = ""; + String errorMessage; for (int i = 0; i < loans.size(); i++) { Row row = loanSheet.getRow(loans.get(i).getRowIndex()); Cell errorReportCell = row.createCell(LoanConstants.FAILURE_REPORT_COL); Cell statusCell = row.createCell(LoanConstants.STATUS_COL); CommandProcessingResult result = null; - loanId = ""; + loanId = EMPTY_STR; try { String status = statuses.get(i); progressLevel = getProgressLevel(status); if (progressLevel == 0 && loans.get(i) != null) { - result = importLoan(i, dateFormat); + result = importLoan(loans, i, dateFormat); loanId = result.getLoanId().toString(); progressLevel = 1; } else { @@ -411,15 +410,15 @@ public class LoanImportHandler implements ImportHandler { } if (progressLevel <= 1 && approvalDates.get(i) != null) { - progressLevel = importLoanApproval(result, i, dateFormat); + progressLevel = importLoanApproval(approvalDates, result, i, dateFormat); } if (progressLevel <= 2 && disbursalDates.get(i) != null) { - progressLevel = importDisbursalData(result, i, dateFormat); + progressLevel = importDisbursalData(approvalDates, disbursalDates, result, i, dateFormat); } if (loanRepayments.get(i) != null) { - progressLevel = importLoanRepayment(result, i, dateFormat); + progressLevel = importLoanRepayment(loanRepayments, result, i, dateFormat); } successCount++; @@ -429,7 +428,7 @@ public class LoanImportHandler implements ImportHandler { errorCount++; LOG.error("Problem occurred in importEntity function", ex); errorMessage = ImportHandlerUtils.getErrorMessage(ex); - writeLoanErrorMessage(loanId, errorMessage, progressLevel, statusCell, errorReportCell, row); + writeLoanErrorMessage(workbook, loanId, errorMessage, progressLevel, statusCell, errorReportCell, row); } } @@ -437,9 +436,9 @@ public class LoanImportHandler implements ImportHandler { return Count.instance(successCount, errorCount); } - private void writeLoanErrorMessage(String loanId, String errorMessage, int progressLevel, Cell statusCell, Cell errorReportCell, - Row row) { - String status = ""; + private void writeLoanErrorMessage(final Workbook workbook, final String loanId, final String errorMessage, final int progressLevel, + final Cell statusCell, final Cell errorReportCell, final Row row) { + String status = EMPTY_STR; if (progressLevel == 0) { status = TemplatePopulateImportConstants.STATUS_CREATION_FAILED; } else if (progressLevel == 1) { @@ -466,7 +465,8 @@ public class LoanImportHandler implements ImportHandler { ImportHandlerUtils.writeString(LoanConstants.FAILURE_REPORT_COL, rowHeader, "Report"); } - private Integer importLoanRepayment(CommandProcessingResult result, int rowIndex, String dateFormat) { + private Integer importLoanRepayment(final List loanRepayments, final CommandProcessingResult result, + final int rowIndex, final String dateFormat) { GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder(); gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat)); JsonObject loanRepaymentJsonob = gsonBuilder.create().toJsonTree(loanRepayments.get(rowIndex)).getAsJsonObject(); @@ -482,14 +482,15 @@ public class LoanImportHandler implements ImportHandler { return 4; } - private Integer importDisbursalData(CommandProcessingResult result, int rowIndex, String dateFormat) { + private Integer importDisbursalData(final List approvalDates, final List disbursalDates, + final CommandProcessingResult result, final int rowIndex, final String dateFormat) { if (approvalDates.get(rowIndex) != null && disbursalDates.get(rowIndex) != null) { DisbursementData disbusalData = disbursalDates.get(rowIndex); String linkAccountId = disbusalData.getLinkAccountId(); GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder(); gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat)); - if (linkAccountId != null && !"".equals(linkAccountId)) { + if (linkAccountId != null && !EMPTY_STR.equals(linkAccountId)) { String payload = gsonBuilder.create().toJson(disbusalData); final CommandWrapper commandRequest = new CommandWrapperBuilder() // .disburseLoanToSavingsApplication(result.getLoanId()) // @@ -509,7 +510,8 @@ public class LoanImportHandler implements ImportHandler { return 3; } - private Integer importLoanApproval(CommandProcessingResult result, int rowIndex, String dateFormat) { + private Integer importLoanApproval(final List approvalDates, final CommandProcessingResult result, final int rowIndex, + final String dateFormat) { if (approvalDates.get(rowIndex) != null) { GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder(); gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat)); @@ -524,7 +526,7 @@ public class LoanImportHandler implements ImportHandler { return 2; } - private CommandProcessingResult importLoan(int rowIndex, String dateFormat) { + private CommandProcessingResult importLoan(final List loans, final int rowIndex, final String dateFormat) { GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder(); gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat)); gsonBuilder.registerTypeAdapter(EnumOptionData.class, new EnumOptionDataValueSerializer()); @@ -550,8 +552,7 @@ public class LoanImportHandler implements ImportHandler { .createLoanApplication() // .withJson(payload) // .build(); // - final CommandProcessingResult result = commandsSourceWritePlatformService.logCommandSource(commandRequest); - return result; + return commandsSourceWritePlatformService.logCommandSource(commandRequest); } private int getProgressLevel(String status) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/loanrepayment/LoanRepaymentImportHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/loanrepayment/LoanRepaymentImportHandler.java index c3ffe4182..59bdc8296 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/loanrepayment/LoanRepaymentImportHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/loanrepayment/LoanRepaymentImportHandler.java @@ -50,10 +50,9 @@ import org.springframework.stereotype.Service; @Service public class LoanRepaymentImportHandler implements ImportHandler { + public static final String SEPARATOR = "-"; + public static final String EMPTY_STR = ""; private static final Logger LOG = LoggerFactory.getLogger(LoanRepaymentImportHandler.class); - private Workbook workbook; - private List loanRepayments; - private Long loanAccountId; private final LoanReadPlatformService loanReadPlatformService; private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; @@ -66,29 +65,32 @@ public class LoanRepaymentImportHandler implements ImportHandler { } @Override - public Count process(Workbook workbook, String locale, String dateFormat) { - this.workbook = workbook; - this.loanRepayments = new ArrayList<>(); - readExcelFile(locale, dateFormat); - return importEntity(dateFormat); + public Count process(final Workbook workbook, final String locale, final String dateFormat) { + + List loanRepayments = readExcelFile(workbook, locale, dateFormat); + return importEntity(workbook, loanRepayments, dateFormat); } - public void readExcelFile(String locale, String dateFormat) { + private List readExcelFile(final Workbook workbook, final String locale, final String dateFormat) { + List loanRepayments = new ArrayList<>(); Sheet loanRepaymentSheet = workbook.getSheet(TemplatePopulateImportConstants.LOAN_REPAYMENT_SHEET_NAME); Integer noOfEntries = ImportHandlerUtils.getNumberOfRows(loanRepaymentSheet, LoanRepaymentConstants.AMOUNT_COL); + Long loanAccountId = null; for (int rowIndex = 1; rowIndex <= noOfEntries; rowIndex++) { Row row; row = loanRepaymentSheet.getRow(rowIndex); if (ImportHandlerUtils.isNotImported(row, LoanRepaymentConstants.STATUS_COL)) { - loanRepayments.add(readLoanRepayment(row, locale, dateFormat)); + loanRepayments.add(readLoanRepayment(workbook, loanAccountId, row, locale, dateFormat)); } } + return loanRepayments; } - private LoanTransactionData readLoanRepayment(Row row, String locale, String dateFormat) { + private LoanTransactionData readLoanRepayment(final Workbook workbook, Long loanAccountId, final Row row, final String locale, + final String dateFormat) { String loanaccountInfo = ImportHandlerUtils.readAsString(LoanRepaymentConstants.LOAN_ACCOUNT_NO_COL, row); if (loanaccountInfo != null) { - List loanAccountAr = Splitter.on('-').splitToList(loanaccountInfo); + List loanAccountAr = Splitter.on(SEPARATOR).splitToList(loanaccountInfo); loanAccountId = this.loanReadPlatformService.retrieveLoanIdByAccountNumber(loanAccountAr.get(0)); } BigDecimal repaymentAmount = null; @@ -105,14 +107,14 @@ public class LoanRepaymentImportHandler implements ImportHandler { Integer receiptNumber = ImportHandlerUtils.readAsInt(LoanRepaymentConstants.RECEIPT_NO_COL, row); Integer bankNumber = ImportHandlerUtils.readAsInt(LoanRepaymentConstants.BANK_NO_COL, row); return LoanTransactionData.importInstance(repaymentAmount, repaymentDate, repaymentTypeId, accountNumber, checkNumber, routingCode, - receiptNumber, bankNumber, loanAccountId, "", row.getRowNum(), locale, dateFormat); + receiptNumber, bankNumber, loanAccountId, EMPTY_STR, row.getRowNum(), locale, dateFormat); } - public Count importEntity(String dateFormat) { + private Count importEntity(final Workbook workbook, final List loanRepayments, final String dateFormat) { Sheet loanRepaymentSheet = workbook.getSheet(TemplatePopulateImportConstants.LOAN_REPAYMENT_SHEET_NAME); int successCount = 0; int errorCount = 0; - String errorMessage = ""; + String errorMessage; GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder(); gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat)); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/office/OfficeImportHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/office/OfficeImportHandler.java index a7fc9f983..d5ad86ee9 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/office/OfficeImportHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/office/OfficeImportHandler.java @@ -31,7 +31,6 @@ import org.apache.fineract.infrastructure.bulkimport.data.Count; import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandler; import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandlerUtils; import org.apache.fineract.infrastructure.bulkimport.importhandler.helper.DateSerializer; -import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.serialization.GoogleGsonSerializerHelper; import org.apache.fineract.organisation.office.data.OfficeData; import org.apache.poi.ss.usermodel.Cell; @@ -48,8 +47,6 @@ import org.springframework.stereotype.Service; public class OfficeImportHandler implements ImportHandler { private static final Logger LOG = LoggerFactory.getLogger(OfficeImportHandler.class); - private List offices; - private Workbook workbook; private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; @Autowired @@ -59,13 +56,12 @@ public class OfficeImportHandler implements ImportHandler { @Override public Count process(final Workbook workbook, final String locale, final String dateFormat) { - this.offices = new ArrayList<>(); - this.workbook = workbook; - readExcelFile(locale, dateFormat); - return importEntity(dateFormat); + List offices = readExcelFile(workbook, locale, dateFormat); + return importEntity(workbook, offices, dateFormat); } - public void readExcelFile(final String locale, final String dateFormat) { + private List readExcelFile(final Workbook workbook, final String locale, final String dateFormat) { + List offices = new ArrayList<>(); Sheet officeSheet = workbook.getSheet(TemplatePopulateImportConstants.OFFICE_SHEET_NAME); Integer noOfEntries = ImportHandlerUtils.getNumberOfRows(officeSheet, 0); for (int rowIndex = 1; rowIndex <= noOfEntries; rowIndex++) { @@ -75,6 +71,7 @@ public class OfficeImportHandler implements ImportHandler { offices.add(readOffice(row, locale, dateFormat)); } } + return offices; } private OfficeData readOffice(Row row, final String locale, final String dateFormat) { @@ -87,14 +84,14 @@ public class OfficeImportHandler implements ImportHandler { return office; } - public Count importEntity(String dateFormat) { + private Count importEntity(final Workbook workbook, final List offices, final String dateFormat) { Sheet officeSheet = workbook.getSheet(TemplatePopulateImportConstants.OFFICE_SHEET_NAME); GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder(); gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat)); int successCount = 0; int errorCount = 0; - String errorMessage = ""; + String errorMessage; for (OfficeData office : offices) { try { String payload = gsonBuilder.create().toJson(office); @@ -102,7 +99,7 @@ public class OfficeImportHandler implements ImportHandler { .createOffice() // .withJson(payload) // .build(); // - final CommandProcessingResult result = commandsSourceWritePlatformService.logCommandSource(commandRequest); + commandsSourceWritePlatformService.logCommandSource(commandRequest); successCount++; Cell statusCell = officeSheet.getRow(office.getRowIndex()).createCell(OfficeConstants.STATUS_COL); statusCell.setCellValue(TemplatePopulateImportConstants.STATUS_CELL_IMPORTED); @@ -119,8 +116,4 @@ public class OfficeImportHandler implements ImportHandler { TemplatePopulateImportConstants.STATUS_COL_REPORT_HEADER); return Count.instance(successCount, errorCount); } - - public List getOffices() { - return offices; - } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/recurringdeposit/RecurringDepositImportHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/recurringdeposit/RecurringDepositImportHandler.java index 0ba328371..e84cf3f32 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/recurringdeposit/RecurringDepositImportHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/recurringdeposit/RecurringDepositImportHandler.java @@ -54,40 +54,38 @@ import org.springframework.stereotype.Service; @Service public class RecurringDepositImportHandler implements ImportHandler { + public static final String WEEKS = "Weeks"; + public static final String DAYS = "Days"; + public static final String MONTHS = "Months"; + public static final String YEARS = "Years"; private static final Logger LOG = LoggerFactory.getLogger(RecurringDepositImportHandler.class); - private Workbook workbook; - private List savings; - private List approvalDates; - private List activationDates; - private List statuses; - private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; @Autowired public RecurringDepositImportHandler(final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService) { this.commandsSourceWritePlatformService = commandsSourceWritePlatformService; - } @Override - public Count process(Workbook workbook, String locale, String dateFormat) { - this.workbook = workbook; - savings = new ArrayList<>(); - approvalDates = new ArrayList<>(); - activationDates = new ArrayList<>(); - statuses = new ArrayList<>(); - readExcelFile(locale, dateFormat); - return importEntity(dateFormat); + public Count process(final Workbook workbook, final String locale, final String dateFormat) { + List savings = new ArrayList<>(); + List approvalDates = new ArrayList<>(); + List activationDates = new ArrayList<>(); + List statuses = new ArrayList<>(); + readExcelFile(workbook, savings, approvalDates, activationDates, statuses, locale, dateFormat); + return importEntity(workbook, savings, approvalDates, activationDates, statuses, dateFormat); } - public void readExcelFile(String locale, String dateFormat) { + private void readExcelFile(final Workbook workbook, final List savings, + final List approvalDates, final List activationDates, final List statuses, + final String locale, final String dateFormat) { Sheet savingsSheet = workbook.getSheet(TemplatePopulateImportConstants.RECURRING_DEPOSIT_SHEET_NAME); Integer noOfEntries = ImportHandlerUtils.getNumberOfRows(savingsSheet, TemplatePopulateImportConstants.ROWHEADER_INDEX); for (int rowIndex = 1; rowIndex <= noOfEntries; rowIndex++) { Row row; row = savingsSheet.getRow(rowIndex); if (ImportHandlerUtils.isNotImported(row, RecurringDepositConstants.STATUS_COL)) { - savings.add(readSavings(row, locale, dateFormat)); + savings.add(readSavings(workbook, row, statuses, locale, dateFormat)); approvalDates.add(readSavingsApproval(row, locale, dateFormat)); activationDates.add(readSavingsActivation(row, locale, dateFormat)); } @@ -95,7 +93,7 @@ public class RecurringDepositImportHandler implements ImportHandler { } - private SavingsActivation readSavingsActivation(Row row, String locale, String dateFormat) { + private SavingsActivation readSavingsActivation(final Row row, final String locale, final String dateFormat) { LocalDate activationDate = ImportHandlerUtils.readAsDate(RecurringDepositConstants.ACTIVATION_DATE_COL, row); if (activationDate != null) { return SavingsActivation.importInstance(activationDate, row.getRowNum(), locale, dateFormat); @@ -104,7 +102,7 @@ public class RecurringDepositImportHandler implements ImportHandler { } } - private SavingsApproval readSavingsApproval(Row row, String locale, String dateFormat) { + private SavingsApproval readSavingsApproval(final Row row, final String locale, final String dateFormat) { LocalDate approvalDate = ImportHandlerUtils.readAsDate(RecurringDepositConstants.APPROVED_DATE_COL, row); if (approvalDate != null) { return SavingsApproval.importInstance(approvalDate, row.getRowNum(), locale, dateFormat); @@ -113,7 +111,8 @@ public class RecurringDepositImportHandler implements ImportHandler { } } - private RecurringDepositAccountData readSavings(Row row, String locale, String dateFormat) { + private RecurringDepositAccountData readSavings(final Workbook workbook, final Row row, final List statuses, + final String locale, final String dateFormat) { String productName = ImportHandlerUtils.readAsString(RecurringDepositConstants.PRODUCT_COL, row); Long productId = ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.PRODUCT_SHEET_NAME), productName); @@ -183,13 +182,13 @@ public class RecurringDepositImportHandler implements ImportHandler { Long lockinPeriodFrequencyTypeId = null; EnumOptionData lockinPeriodFrequencyTypeEnum = null; if (lockinPeriodFrequencyType != null) { - if (lockinPeriodFrequencyType.equalsIgnoreCase("Days")) { + if (lockinPeriodFrequencyType.equalsIgnoreCase(DAYS)) { lockinPeriodFrequencyTypeId = 0L; - } else if (lockinPeriodFrequencyType.equalsIgnoreCase("Weeks")) { + } else if (lockinPeriodFrequencyType.equalsIgnoreCase(WEEKS)) { lockinPeriodFrequencyTypeId = 1L; - } else if (lockinPeriodFrequencyType.equalsIgnoreCase("Months")) { + } else if (lockinPeriodFrequencyType.equalsIgnoreCase(MONTHS)) { lockinPeriodFrequencyTypeId = 2L; - } else if (lockinPeriodFrequencyType.equalsIgnoreCase("Years")) { + } else if (lockinPeriodFrequencyType.equalsIgnoreCase(YEARS)) { lockinPeriodFrequencyTypeId = 3L; } lockinPeriodFrequencyTypeEnum = new EnumOptionData(lockinPeriodFrequencyTypeId, null, null); @@ -203,13 +202,13 @@ public class RecurringDepositImportHandler implements ImportHandler { String depositPeriodFrequency = ImportHandlerUtils.readAsString(RecurringDepositConstants.DEPOSIT_PERIOD_FREQUENCY_COL, row); Long depositPeriodFrequencyId = null; if (depositPeriodFrequency != null) { - if (depositPeriodFrequency.equalsIgnoreCase("Days")) { + if (depositPeriodFrequency.equalsIgnoreCase(DAYS)) { depositPeriodFrequencyId = 0L; - } else if (depositPeriodFrequency.equalsIgnoreCase("Weeks")) { + } else if (depositPeriodFrequency.equalsIgnoreCase(WEEKS)) { depositPeriodFrequencyId = 1L; - } else if (depositPeriodFrequency.equalsIgnoreCase("Months")) { + } else if (depositPeriodFrequency.equalsIgnoreCase(MONTHS)) { depositPeriodFrequencyId = 2L; - } else if (depositPeriodFrequency.equalsIgnoreCase("Years")) { + } else if (depositPeriodFrequency.equalsIgnoreCase(YEARS)) { depositPeriodFrequencyId = 3L; } } @@ -218,13 +217,13 @@ public class RecurringDepositImportHandler implements ImportHandler { Long recurringFrequencyTypeId = null; EnumOptionData recurringFrequencyTypeEnum = null; if (recurringFrequencyType != null) { - if (recurringFrequencyType.equalsIgnoreCase("Days")) { + if (recurringFrequencyType.equalsIgnoreCase(DAYS)) { recurringFrequencyTypeId = 0L; - } else if (recurringFrequencyType.equalsIgnoreCase("Weeks")) { + } else if (recurringFrequencyType.equalsIgnoreCase(WEEKS)) { recurringFrequencyTypeId = 1L; - } else if (recurringFrequencyType.equalsIgnoreCase("Months")) { + } else if (recurringFrequencyType.equalsIgnoreCase(MONTHS)) { recurringFrequencyTypeId = 2L; - } else if (recurringFrequencyType.equalsIgnoreCase("Years")) { + } else if (recurringFrequencyType.equalsIgnoreCase(YEARS)) { recurringFrequencyTypeId = 3L; } recurringFrequencyTypeEnum = new EnumOptionData(recurringFrequencyTypeId, null, null); @@ -272,7 +271,9 @@ public class RecurringDepositImportHandler implements ImportHandler { isMandatoryDeposit, allowWithdrawal, adjustAdvancePayments, externalId, charges, row.getRowNum(), locale, dateFormat); } - public Count importEntity(String dateFormat) { + private Count importEntity(final Workbook workbook, final List savings, + final List approvalDates, final List activationDates, final List statuses, + final String dateFormat) { Sheet savingsSheet = workbook.getSheet(TemplatePopulateImportConstants.RECURRING_DEPOSIT_SHEET_NAME); int successCount = 0; int errorCount = 0; @@ -288,7 +289,7 @@ public class RecurringDepositImportHandler implements ImportHandler { progressLevel = getProgressLevel(status); if (progressLevel == 0) { - CommandProcessingResult result = importSavings(i, dateFormat); + CommandProcessingResult result = importSavings(savings, i, dateFormat); savingsId = result.getSavingsId(); progressLevel = 1; } else { @@ -297,11 +298,11 @@ public class RecurringDepositImportHandler implements ImportHandler { } if (progressLevel <= 1) { - progressLevel = importSavingsApproval(savingsId, i, dateFormat); + progressLevel = importSavingsApproval(approvalDates, savingsId, i, dateFormat); } if (progressLevel <= 2) { - progressLevel = importSavingsActivation(savingsId, i, dateFormat); + progressLevel = importSavingsActivation(activationDates, savingsId, i, dateFormat); } successCount++; statusCell.setCellValue(TemplatePopulateImportConstants.STATUS_CELL_IMPORTED); @@ -310,15 +311,15 @@ public class RecurringDepositImportHandler implements ImportHandler { errorCount++; LOG.error("Problem occurred in importEntity function", ex); errorMessage = ImportHandlerUtils.getErrorMessage(ex); - writeRecurringDepositErrorMessage(savingsId, errorMessage, progressLevel, statusCell, errorReportCell, row); + writeRecurringDepositErrorMessage(workbook, savingsId, errorMessage, progressLevel, statusCell, errorReportCell, row); } } setReportHeaders(savingsSheet); return Count.instance(successCount, errorCount); } - private void writeRecurringDepositErrorMessage(Long savingsId, String errorMessage, int progressLevel, Cell statusCell, - Cell errorReportCell, Row row) { + private void writeRecurringDepositErrorMessage(final Workbook workbook, final Long savingsId, final String errorMessage, + final int progressLevel, final Cell statusCell, final Cell errorReportCell, final Row row) { String status = ""; if (progressLevel == 0) { status = TemplatePopulateImportConstants.STATUS_CREATION_FAILED; @@ -337,7 +338,7 @@ public class RecurringDepositImportHandler implements ImportHandler { errorReportCell.setCellValue(errorMessage); } - private void setReportHeaders(Sheet savingsSheet) { + private void setReportHeaders(final Sheet savingsSheet) { savingsSheet.setColumnWidth(RecurringDepositConstants.STATUS_COL, TemplatePopulateImportConstants.SMALL_COL_SIZE); Row rowHeader = savingsSheet.getRow(TemplatePopulateImportConstants.ROWHEADER_INDEX); ImportHandlerUtils.writeString(RecurringDepositConstants.STATUS_COL, rowHeader, "Status"); @@ -345,7 +346,8 @@ public class RecurringDepositImportHandler implements ImportHandler { ImportHandlerUtils.writeString(RecurringDepositConstants.FAILURE_REPORT_COL, rowHeader, "Report"); } - private int importSavingsActivation(Long savingsId, int i, String dateFormat) { + private int importSavingsActivation(final List activationDates, final Long savingsId, final int i, + final String dateFormat) { if (activationDates.get(i) != null) { GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder(); gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat)); @@ -354,12 +356,13 @@ public class RecurringDepositImportHandler implements ImportHandler { .recurringDepositAccountActivation(savingsId)// .withJson(payload) // .build(); // - final CommandProcessingResult result = commandsSourceWritePlatformService.logCommandSource(commandRequest); + commandsSourceWritePlatformService.logCommandSource(commandRequest); } return 3; } - private int importSavingsApproval(Long savingsId, int i, String dateFormat) { + private int importSavingsApproval(final List approvalDates, final Long savingsId, final int i, + final String dateFormat) { if (approvalDates.get(i) != null) { GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder(); gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat)); @@ -368,12 +371,12 @@ public class RecurringDepositImportHandler implements ImportHandler { .approveRecurringDepositAccountApplication(savingsId)// .withJson(payload) // .build(); // - final CommandProcessingResult result = commandsSourceWritePlatformService.logCommandSource(commandRequest); + commandsSourceWritePlatformService.logCommandSource(commandRequest); } return 2; } - private CommandProcessingResult importSavings(int i, String dateFormat) { + private CommandProcessingResult importSavings(final List savings, final int i, final String dateFormat) { GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder(); gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat)); gsonBuilder.registerTypeAdapter(EnumOptionData.class, new EnumOptionDataIdSerializer()); @@ -384,8 +387,7 @@ public class RecurringDepositImportHandler implements ImportHandler { .createRecurringDepositAccount() // .withJson(payload) // .build(); // - final CommandProcessingResult result = commandsSourceWritePlatformService.logCommandSource(commandRequest); - return result; + return commandsSourceWritePlatformService.logCommandSource(commandRequest); } private int getProgressLevel(String status) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/recurringdeposit/RecurringDepositTransactionImportHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/recurringdeposit/RecurringDepositTransactionImportHandler.java index 3638dddc8..603fd01b6 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/recurringdeposit/RecurringDepositTransactionImportHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/recurringdeposit/RecurringDepositTransactionImportHandler.java @@ -34,7 +34,6 @@ import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandler import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandlerUtils; import org.apache.fineract.infrastructure.bulkimport.importhandler.helper.DateSerializer; import org.apache.fineract.infrastructure.bulkimport.importhandler.helper.SavingsAccountTransactionEnumValueSerialiser; -import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.exception.AbstractPlatformDomainRuleException; import org.apache.fineract.infrastructure.core.serialization.GoogleGsonSerializerHelper; import org.apache.fineract.portfolio.savings.data.SavingsAccountTransactionData; @@ -53,9 +52,6 @@ import org.springframework.stereotype.Service; public class RecurringDepositTransactionImportHandler implements ImportHandler { private static final Logger LOG = LoggerFactory.getLogger(RecurringDepositTransactionImportHandler.class); - private Workbook workbook; - private List savingsTransactions; - private String savingsAccountId = ""; private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; @@ -65,32 +61,32 @@ public class RecurringDepositTransactionImportHandler implements ImportHandler { } @Override - public Count process(Workbook workbook, String locale, String dateFormat) { - this.workbook = workbook; - this.savingsTransactions = new ArrayList<>(); - readExcelFile(locale, dateFormat); - return importEntity(dateFormat); + public Count process(final Workbook workbook, final String locale, final String dateFormat) { + List savingsTransactions = readExcelFile(workbook, locale, dateFormat); + return importEntity(workbook, savingsTransactions, dateFormat); } - public void readExcelFile(String locale, String dateFormat) { + public List readExcelFile(final Workbook workbook, final String locale, final String dateFormat) { + List savingsTransactions = new ArrayList<>(); Sheet savingsTransactionSheet = workbook.getSheet(TemplatePopulateImportConstants.SAVINGS_TRANSACTION_SHEET_NAME); Integer noOfEntries = ImportHandlerUtils.getNumberOfRows(savingsTransactionSheet, TransactionConstants.AMOUNT_COL); + Long savingsAccountId = null; for (int rowIndex = 1; rowIndex <= noOfEntries; rowIndex++) { Row row; row = savingsTransactionSheet.getRow(rowIndex); if (ImportHandlerUtils.isNotImported(row, TransactionConstants.STATUS_COL)) { - savingsTransactions.add(readSavingsTransaction(row, locale, dateFormat)); + savingsTransactions.add(readSavingsTransaction(workbook, row, savingsAccountId, locale, dateFormat)); } } + return savingsTransactions; } - private SavingsAccountTransactionData readSavingsTransaction(Row row, String locale, String dateFormat) { - String savingsAccountIdCheck = null; - if (ImportHandlerUtils.readAsLong(TransactionConstants.SAVINGS_ACCOUNT_NO_COL, row) != null) { - savingsAccountIdCheck = ImportHandlerUtils.readAsLong(TransactionConstants.SAVINGS_ACCOUNT_NO_COL, row).toString(); - } - if (savingsAccountIdCheck != null) { - savingsAccountId = savingsAccountIdCheck; + private SavingsAccountTransactionData readSavingsTransaction(final Workbook workbook, final Row row, Long savingsAccountId, + final String locale, final String dateFormat) { + Long internalSavingsAccountId = ImportHandlerUtils.readAsLong(TransactionConstants.SAVINGS_ACCOUNT_NO_COL, row); + + if (internalSavingsAccountId != null) { + savingsAccountId = internalSavingsAccountId; } String transactionType = ImportHandlerUtils.readAsString(TransactionConstants.TRANSACTION_TYPE_COL, row); SavingsAccountTransactionEnumData savingsAccountTransactionEnumData = new SavingsAccountTransactionEnumData(null, null, @@ -111,12 +107,12 @@ public class RecurringDepositTransactionImportHandler implements ImportHandler { String receiptNumber = ImportHandlerUtils.readAsString(TransactionConstants.RECEIPT_NO_COL, row); String bankNumber = ImportHandlerUtils.readAsString(TransactionConstants.BANK_NO_COL, row); return SavingsAccountTransactionData.importInstance(amount, transactionDate, paymentTypeId, accountNumber, checkNumber, routingCode, - receiptNumber, bankNumber, Long.parseLong(savingsAccountId), savingsAccountTransactionEnumData, row.getRowNum(), locale, - dateFormat); + receiptNumber, bankNumber, savingsAccountId, savingsAccountTransactionEnumData, row.getRowNum(), locale, dateFormat); } - public Count importEntity(String dateFormat) { + public Count importEntity(final Workbook workbook, final List savingsTransactions, + final String dateFormat) { Sheet savingsTransactionSheet = workbook.getSheet(TemplatePopulateImportConstants.SAVINGS_TRANSACTION_SHEET_NAME); int successCount = 0; int errorCount = 0; @@ -145,7 +141,7 @@ public class RecurringDepositTransactionImportHandler implements ImportHandler { .withJson(payload) // .build(); } - final CommandProcessingResult result = commandsSourceWritePlatformService.logCommandSource(commandRequest); + commandsSourceWritePlatformService.logCommandSource(commandRequest); successCount++; Cell statusCell = savingsTransactionSheet.getRow(transaction.getRowIndex()).createCell(TransactionConstants.STATUS_COL); statusCell.setCellValue(TemplatePopulateImportConstants.STATUS_CELL_IMPORTED); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/savings/SavingsImportHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/savings/SavingsImportHandler.java index f5cda1152..d375ad3da 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/savings/SavingsImportHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/savings/SavingsImportHandler.java @@ -55,13 +55,13 @@ import org.springframework.stereotype.Service; @Service public class SavingsImportHandler implements ImportHandler { + public static final String DAILY = "Daily"; + public static final String MONTHLY = "Monthly"; + public static final String QUARTERLY = "Quarterly"; + public static final String SEMI_ANNUAL = "Semi-Annual"; + public static final String ANNUALLY = "Annually"; + public static final String BI_ANNUAL = "BiAnnual"; private static final Logger LOG = LoggerFactory.getLogger(SavingsImportHandler.class); - private Workbook workbook; - private List savings; - private List approvalDates; - private List activationDates; - private List statuses; - private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; @Autowired @@ -70,24 +70,24 @@ public class SavingsImportHandler implements ImportHandler { } @Override - public Count process(Workbook workbook, String locale, String dateFormat) { - this.workbook = workbook; - this.savings = new ArrayList<>(); - this.approvalDates = new ArrayList<>(); - this.activationDates = new ArrayList<>(); - this.statuses = new ArrayList<>(); - readExcelFile(locale, dateFormat); - return importEntity(dateFormat); + public Count process(final Workbook workbook, final String locale, final String dateFormat) { + List savings = new ArrayList<>(); + List approvalDates = new ArrayList<>(); + List activationDates = new ArrayList<>(); + List statuses = new ArrayList<>(); + readExcelFile(workbook, savings, approvalDates, activationDates, statuses, locale, dateFormat); + return importEntity(workbook, savings, approvalDates, activationDates, statuses, dateFormat); } - public void readExcelFile(String locale, String dateFormat) { + public void readExcelFile(final Workbook workbook, final List savings, final List approvalDates, + final List activationDates, final List statuses, final String locale, final String dateFormat) { Sheet savingsSheet = workbook.getSheet(TemplatePopulateImportConstants.SAVINGS_ACCOUNTS_SHEET_NAME); Integer noOfEntries = ImportHandlerUtils.getNumberOfRows(savingsSheet, TemplatePopulateImportConstants.FIRST_COLUMN_INDEX); for (int rowIndex = 1; rowIndex <= noOfEntries; rowIndex++) { Row row; row = savingsSheet.getRow(rowIndex); if (ImportHandlerUtils.isNotImported(row, SavingsConstants.STATUS_COL)) { - savings.add(readSavings(row, locale, dateFormat)); + savings.add(readSavings(workbook, row, statuses, locale, dateFormat)); approvalDates.add(readSavingsApproval(row, locale, dateFormat)); activationDates.add(readSavingsActivation(row, locale, dateFormat)); } @@ -112,7 +112,8 @@ public class SavingsImportHandler implements ImportHandler { } } - private SavingsAccountData readSavings(Row row, String locale, String dateFormat) { + private SavingsAccountData readSavings(final Workbook workbook, final Row row, final List statuses, final String locale, + final String dateFormat) { String productName = ImportHandlerUtils.readAsString(SavingsConstants.PRODUCT_COL, row); Long productId = ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.PRODUCT_SHEET_NAME), productName); String fieldOfficerName = ImportHandlerUtils.readAsString(SavingsConstants.FIELD_OFFICER_NAME_COL, row); @@ -129,15 +130,15 @@ public class SavingsImportHandler implements ImportHandler { Long interestCompoundingPeriodTypeId = null; EnumOptionData interestCompoundingPeriodTypeEnum = null; if (interestCompoundingPeriodType != null) { - if (interestCompoundingPeriodType.equalsIgnoreCase("Daily")) { + if (interestCompoundingPeriodType.equalsIgnoreCase(DAILY)) { interestCompoundingPeriodTypeId = 1L; - } else if (interestCompoundingPeriodType.equalsIgnoreCase("Monthly")) { + } else if (interestCompoundingPeriodType.equalsIgnoreCase(MONTHLY)) { interestCompoundingPeriodTypeId = 4L; - } else if (interestCompoundingPeriodType.equalsIgnoreCase("Quarterly")) { + } else if (interestCompoundingPeriodType.equalsIgnoreCase(QUARTERLY)) { interestCompoundingPeriodTypeId = 5L; - } else if (interestCompoundingPeriodType.equalsIgnoreCase("Semi-Annual")) { + } else if (interestCompoundingPeriodType.equalsIgnoreCase(SEMI_ANNUAL)) { interestCompoundingPeriodTypeId = 6L; - } else if (interestCompoundingPeriodType.equalsIgnoreCase("Annually")) { + } else if (interestCompoundingPeriodType.equalsIgnoreCase(ANNUALLY)) { interestCompoundingPeriodTypeId = 7L; } interestCompoundingPeriodTypeEnum = new EnumOptionData(interestCompoundingPeriodTypeId, null, null); @@ -146,13 +147,13 @@ public class SavingsImportHandler implements ImportHandler { Long interestPostingPeriodTypeId = null; EnumOptionData interestPostingPeriodTypeEnum = null; if (interestPostingPeriodType != null) { - if (interestPostingPeriodType.equalsIgnoreCase("Monthly")) { + if (interestPostingPeriodType.equalsIgnoreCase(MONTHLY)) { interestPostingPeriodTypeId = 4L; - } else if (interestPostingPeriodType.equalsIgnoreCase("Quarterly")) { + } else if (interestPostingPeriodType.equalsIgnoreCase(QUARTERLY)) { interestPostingPeriodTypeId = 5L; - } else if (interestPostingPeriodType.equalsIgnoreCase("Annually")) { + } else if (interestPostingPeriodType.equalsIgnoreCase(ANNUALLY)) { interestPostingPeriodTypeId = 7L; - } else if (interestPostingPeriodType.equalsIgnoreCase("BiAnnual")) { + } else if (interestPostingPeriodType.equalsIgnoreCase(BI_ANNUAL)) { interestPostingPeriodTypeId = 6L; } interestPostingPeriodTypeEnum = new EnumOptionData(interestPostingPeriodTypeId, null, null); @@ -264,7 +265,8 @@ public class SavingsImportHandler implements ImportHandler { } - public Count importEntity(String dateFormat) { + public Count importEntity(final Workbook workbook, final List savings, final List approvalDates, + final List activationDates, final List statuses, final String dateFormat) { Sheet savingsSheet = workbook.getSheet(TemplatePopulateImportConstants.SAVINGS_ACCOUNTS_SHEET_NAME); int successCount = 0; int errorCount = 0; @@ -280,7 +282,7 @@ public class SavingsImportHandler implements ImportHandler { progressLevel = getProgressLevel(status); if (progressLevel == 0) { - CommandProcessingResult result = importSavings(i, dateFormat); + CommandProcessingResult result = importSavings(savings, i, dateFormat); savingsId = result.getSavingsId(); progressLevel = 1; } else { @@ -289,11 +291,11 @@ public class SavingsImportHandler implements ImportHandler { } if (progressLevel <= 1) { - progressLevel = importSavingsApproval(savingsId, i, dateFormat); + progressLevel = importSavingsApproval(approvalDates, savingsId, i, dateFormat); } if (progressLevel <= 2) { - progressLevel = importSavingsActivation(savingsId, i, dateFormat); + progressLevel = importSavingsActivation(activationDates, savingsId, i, dateFormat); } successCount++; statusCell.setCellValue(TemplatePopulateImportConstants.STATUS_CELL_IMPORTED); @@ -302,15 +304,15 @@ public class SavingsImportHandler implements ImportHandler { errorCount++; LOG.error("Problem occurred in importEntity function", ex); errorMessage = ImportHandlerUtils.getErrorMessage(ex); - writeSavingsErrorMessage(savingsId, errorMessage, progressLevel, statusCell, errorReportCell, row); + writeSavingsErrorMessage(workbook, savingsId, errorMessage, progressLevel, statusCell, errorReportCell, row); } } setReportHeaders(savingsSheet); return Count.instance(successCount, errorCount); } - private void writeSavingsErrorMessage(Long savingsId, String errorMessage, int progressLevel, Cell statusCell, Cell errorReportCell, - Row row) { + private void writeSavingsErrorMessage(final Workbook workbook, final Long savingsId, final String errorMessage, final int progressLevel, + final Cell statusCell, final Cell errorReportCell, final Row row) { String status = ""; if (progressLevel == 0) { @@ -340,7 +342,8 @@ public class SavingsImportHandler implements ImportHandler { TemplatePopulateImportConstants.FAILURE_COL_REPORT_HEADER); } - private int importSavingsActivation(Long savingsId, int i, String dateFormat) { + private int importSavingsActivation(final List activationDates, final Long savingsId, final int i, + final String dateFormat) { if (activationDates.get(i) != null) { GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder(); gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat)); @@ -349,12 +352,13 @@ public class SavingsImportHandler implements ImportHandler { .savingsAccountActivation(savingsId)// .withJson(payload) // .build(); // - final CommandProcessingResult result = commandsSourceWritePlatformService.logCommandSource(commandRequest); + commandsSourceWritePlatformService.logCommandSource(commandRequest); } return 3; } - private int importSavingsApproval(Long savingsId, int i, String dateFormat) { + private int importSavingsApproval(final List approvalDates, final Long savingsId, final int i, + final String dateFormat) { if (approvalDates.get(i) != null) { GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder(); gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat)); @@ -363,12 +367,12 @@ public class SavingsImportHandler implements ImportHandler { .approveSavingsAccountApplication(savingsId)// .withJson(payload) // .build(); // - final CommandProcessingResult result = commandsSourceWritePlatformService.logCommandSource(commandRequest); + commandsSourceWritePlatformService.logCommandSource(commandRequest); } return 2; } - private CommandProcessingResult importSavings(int i, String dateFormat) { + private CommandProcessingResult importSavings(final List savings, final int i, final String dateFormat) { GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder(); gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat)); gsonBuilder.registerTypeAdapter(EnumOptionData.class, new EnumOptionDataIdSerializer()); @@ -379,8 +383,7 @@ public class SavingsImportHandler implements ImportHandler { .createSavingsAccount() // .withJson(payload) // .build(); // - final CommandProcessingResult result = commandsSourceWritePlatformService.logCommandSource(commandRequest); - return result; + return commandsSourceWritePlatformService.logCommandSource(commandRequest); } private int getProgressLevel(String status) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/savings/SavingsTransactionImportHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/savings/SavingsTransactionImportHandler.java index 6940096af..77aff1791 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/savings/SavingsTransactionImportHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/savings/SavingsTransactionImportHandler.java @@ -34,7 +34,6 @@ import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandler import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandlerUtils; import org.apache.fineract.infrastructure.bulkimport.importhandler.helper.DateSerializer; import org.apache.fineract.infrastructure.bulkimport.importhandler.helper.SavingsAccountTransactionEnumValueSerialiser; -import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.serialization.GoogleGsonSerializerHelper; import org.apache.fineract.portfolio.savings.data.SavingsAccountTransactionData; import org.apache.fineract.portfolio.savings.data.SavingsAccountTransactionEnumData; @@ -51,11 +50,12 @@ import org.springframework.stereotype.Service; @Service public class SavingsTransactionImportHandler implements ImportHandler { + public static final String TRANSACTION_TYPE = "transactionType"; + public static final String REVERSED = "reversed"; + public static final String INTERESTED_POSTED_AS_ON = "interestedPostedAsOn"; + public static final String WITHDRAWAL = "Withdrawal"; + public static final String DEPOSIT = "Deposit"; private static final Logger LOG = LoggerFactory.getLogger(SavingsTransactionImportHandler.class); - private Workbook workbook; - private List savingsTransactions; - private String savingsAccountId = ""; - private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; @Autowired @@ -64,30 +64,30 @@ public class SavingsTransactionImportHandler implements ImportHandler { } @Override - public Count process(Workbook workbook, String locale, String dateFormat) { - this.workbook = workbook; - this.savingsTransactions = new ArrayList<>(); - readExcelFile(locale, dateFormat); - return importEntity(dateFormat); + public Count process(final Workbook workbook, final String locale, final String dateFormat) { + List savingsTransactions = readExcelFile(workbook, locale, dateFormat); + return importEntity(workbook, savingsTransactions, dateFormat); } - public void readExcelFile(String locale, String dateFormat) { + private List readExcelFile(final Workbook workbook, final String locale, final String dateFormat) { + List savingsTransactions = new ArrayList<>(); Sheet savingsTransactionSheet = workbook.getSheet(TemplatePopulateImportConstants.SAVINGS_TRANSACTION_SHEET_NAME); Integer noOfEntries = ImportHandlerUtils.getNumberOfRows(savingsTransactionSheet, TransactionConstants.AMOUNT_COL); + Long savingsAccountId = null; for (int rowIndex = 1; rowIndex <= noOfEntries; rowIndex++) { Row row; row = savingsTransactionSheet.getRow(rowIndex); if (ImportHandlerUtils.isNotImported(row, TransactionConstants.STATUS_COL)) { - savingsTransactions.add(readSavingsTransaction(row, locale, dateFormat)); + savingsTransactions.add(readSavingsTransaction(workbook, row, savingsAccountId, locale, dateFormat)); } } + return savingsTransactions; } - private SavingsAccountTransactionData readSavingsTransaction(Row row, String locale, String dateFormat) { - String savingsAccountIdCheck = null; - if (ImportHandlerUtils.readAsLong(TransactionConstants.SAVINGS_ACCOUNT_NO_COL, row) != null) { - savingsAccountIdCheck = ImportHandlerUtils.readAsLong(TransactionConstants.SAVINGS_ACCOUNT_NO_COL, row).toString(); - } + private SavingsAccountTransactionData readSavingsTransaction(final Workbook workbook, final Row row, Long savingsAccountId, + final String locale, final String dateFormat) { + Long savingsAccountIdCheck = ImportHandlerUtils.readAsLong(TransactionConstants.SAVINGS_ACCOUNT_NO_COL, row); + if (savingsAccountIdCheck != null) { savingsAccountId = savingsAccountIdCheck; } @@ -110,12 +110,12 @@ public class SavingsTransactionImportHandler implements ImportHandler { String receiptNumber = ImportHandlerUtils.readAsString(TransactionConstants.RECEIPT_NO_COL, row); String bankNumber = ImportHandlerUtils.readAsString(TransactionConstants.BANK_NO_COL, row); return SavingsAccountTransactionData.importInstance(amount, transactionDate, paymentTypeId, accountNumber, checkNumber, routingCode, - receiptNumber, bankNumber, Long.parseLong(savingsAccountId), savingsAccountTransactionEnumData, row.getRowNum(), locale, - dateFormat); + receiptNumber, bankNumber, savingsAccountId, savingsAccountTransactionEnumData, row.getRowNum(), locale, dateFormat); } - public Count importEntity(String dateFormat) { + private Count importEntity(final Workbook workbook, final List savingsTransactions, + final String dateFormat) { Sheet savingsTransactionSheet = workbook.getSheet(TemplatePopulateImportConstants.SAVINGS_TRANSACTION_SHEET_NAME); int successCount = 0; int errorCount = 0; @@ -127,24 +127,24 @@ public class SavingsTransactionImportHandler implements ImportHandler { for (SavingsAccountTransactionData transaction : savingsTransactions) { try { JsonObject savingsTransactionJsonob = gsonBuilder.create().toJsonTree(transaction).getAsJsonObject(); - savingsTransactionJsonob.remove("transactionType"); - savingsTransactionJsonob.remove("reversed"); - savingsTransactionJsonob.remove("interestedPostedAsOn"); + savingsTransactionJsonob.remove(TRANSACTION_TYPE); + savingsTransactionJsonob.remove(REVERSED); + savingsTransactionJsonob.remove(INTERESTED_POSTED_AS_ON); String payload = savingsTransactionJsonob.toString(); CommandWrapper commandRequest = null; - if (transaction.getTransactionType().getValue().equals("Withdrawal")) { + if (transaction.getTransactionType().getValue().equals(WITHDRAWAL)) { commandRequest = new CommandWrapperBuilder() // .savingsAccountWithdrawal(transaction.getSavingsAccountId()) // .withJson(payload) // .build(); // - } else if (transaction.getTransactionType().getValue().equals("Deposit")) { + } else if (transaction.getTransactionType().getValue().equals(DEPOSIT)) { commandRequest = new CommandWrapperBuilder() // .savingsAccountDeposit(transaction.getSavingsAccountId()) // .withJson(payload) // .build(); } - final CommandProcessingResult result = commandsSourceWritePlatformService.logCommandSource(commandRequest); + commandsSourceWritePlatformService.logCommandSource(commandRequest); successCount++; Cell statusCell = savingsTransactionSheet.getRow(transaction.getRowIndex()).createCell(TransactionConstants.STATUS_COL); statusCell.setCellValue(TemplatePopulateImportConstants.STATUS_CELL_IMPORTED); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/sharedaccount/SharedAccountImportHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/sharedaccount/SharedAccountImportHandler.java index 38b5a619e..03aea4680 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/sharedaccount/SharedAccountImportHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/sharedaccount/SharedAccountImportHandler.java @@ -32,7 +32,6 @@ import org.apache.fineract.infrastructure.bulkimport.data.Count; import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandler; import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandlerUtils; import org.apache.fineract.infrastructure.bulkimport.importhandler.helper.DateSerializer; -import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.serialization.GoogleGsonSerializerHelper; import org.apache.fineract.portfolio.shareaccounts.data.ShareAccountChargeData; import org.apache.fineract.portfolio.shareaccounts.data.ShareAccountData; @@ -49,11 +48,10 @@ import org.springframework.stereotype.Service; @Service public class SharedAccountImportHandler implements ImportHandler { + public static final String ZERO = "0"; + public static final String SHARE = "share"; + public static final String EMPTY_STR = ""; private static final Logger LOG = LoggerFactory.getLogger(SharedAccountImportHandler.class); - private Workbook workbook; - private List shareAccountDataList; - private List statuses; - private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; @Autowired @@ -62,27 +60,28 @@ public class SharedAccountImportHandler implements ImportHandler { } @Override - public Count process(Workbook workbook, String locale, String dateFormat) { - this.workbook = workbook; - this.shareAccountDataList = new ArrayList<>(); - statuses = new ArrayList(); - readExcelFile(locale, dateFormat); - return importEntity(dateFormat); + public Count process(final Workbook workbook, final String locale, final String dateFormat) { + List shareAccountDataList = new ArrayList<>(); + List statuses = new ArrayList<>(); + readExcelFile(workbook, shareAccountDataList, statuses, locale, dateFormat); + return importEntity(workbook, shareAccountDataList, dateFormat); } - public void readExcelFile(String locale, String dateFormat) { + private void readExcelFile(final Workbook workbook, final List shareAccountDataList, final List statuses, + final String locale, String dateFormat) { Sheet sharedAccountsSheet = workbook.getSheet(TemplatePopulateImportConstants.SHARED_ACCOUNTS_SHEET_NAME); Integer noOfEntries = ImportHandlerUtils.getNumberOfRows(sharedAccountsSheet, TemplatePopulateImportConstants.FIRST_COLUMN_INDEX); for (int rowIndex = 1; rowIndex <= noOfEntries; rowIndex++) { Row row; row = sharedAccountsSheet.getRow(rowIndex); if (ImportHandlerUtils.isNotImported(row, SharedAccountsConstants.STATUS_COL)) { - shareAccountDataList.add(readSharedAccount(row, locale, dateFormat)); + shareAccountDataList.add(readSharedAccount(workbook, row, statuses, locale, dateFormat)); } } } - private ShareAccountData readSharedAccount(Row row, String locale, String dateFormat) { + private ShareAccountData readSharedAccount(final Workbook workbook, final Row row, final List statuses, final String locale, + final String dateFormat) { String clientName = ImportHandlerUtils.readAsString(SharedAccountsConstants.CLIENT_NAME_COL, row); Long clientId = ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.CLIENT_SHEET_NAME), clientName); @@ -127,7 +126,7 @@ public class SharedAccountImportHandler implements ImportHandler { List charges = new ArrayList<>(); for (int cellNo = SharedAccountsConstants.CHARGES_NAME_1_COL; cellNo < SharedAccountsConstants.CHARGES_NAME_3_COL; cellNo += 2) { String chargeName = ImportHandlerUtils.readAsString(cellNo, row); - if (chargeName == null || chargeName.equals("0")) { + if (chargeName == null || chargeName.equals(ZERO)) { break; } Long chargeId = ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.SHARED_PRODUCTS_SHEET_NAME), @@ -149,11 +148,11 @@ public class SharedAccountImportHandler implements ImportHandler { defaultSavingsAccountId, row.getRowNum(), locale, dateFormat); } - public Count importEntity(String dateFormat) { + private Count importEntity(final Workbook workbook, final List shareAccountDataList, final String dateFormat) { Sheet sharedAccountsSheet = workbook.getSheet(TemplatePopulateImportConstants.SHARED_ACCOUNTS_SHEET_NAME); int successCount = 0; int errorCount = 0; - String errorMessage = ""; + String errorMessage; GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder(); gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat)); @@ -161,10 +160,10 @@ public class SharedAccountImportHandler implements ImportHandler { try { String payload = gsonBuilder.create().toJson(shareAccountData); final CommandWrapper commandRequest = new CommandWrapperBuilder() // - .createAccount("share")// + .createAccount(SHARE)// .withJson(payload) // .build(); // - final CommandProcessingResult result = commandsSourceWritePlatformService.logCommandSource(commandRequest); + commandsSourceWritePlatformService.logCommandSource(commandRequest); successCount++; Cell statusCell = sharedAccountsSheet.getRow(shareAccountData.getRowIndex()).createCell(SharedAccountsConstants.STATUS_COL); statusCell.setCellValue(TemplatePopulateImportConstants.STATUS_CELL_IMPORTED); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/staff/StaffImportHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/staff/StaffImportHandler.java index 6349a3a92..c00c71bff 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/staff/StaffImportHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/staff/StaffImportHandler.java @@ -31,7 +31,6 @@ import org.apache.fineract.infrastructure.bulkimport.data.Count; import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandler; import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandlerUtils; import org.apache.fineract.infrastructure.bulkimport.importhandler.helper.DateSerializer; -import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.serialization.GoogleGsonSerializerHelper; import org.apache.fineract.organisation.staff.data.StaffData; import org.apache.poi.ss.usermodel.Cell; @@ -48,8 +47,6 @@ import org.springframework.stereotype.Service; public class StaffImportHandler implements ImportHandler { private static final Logger LOG = LoggerFactory.getLogger(StaffImportHandler.class); - private List staffList; - private Workbook workbook; private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; @@ -59,27 +56,26 @@ public class StaffImportHandler implements ImportHandler { } @Override - public Count process(Workbook workbook, String locale, String dateFormat) { - this.workbook = workbook; - this.staffList = new ArrayList<>(); - readExcelFile(locale, dateFormat); - return importEntity(dateFormat); + public Count process(final Workbook workbook, final String locale, final String dateFormat) { + List staffList = readExcelFile(workbook, locale, dateFormat); + return importEntity(workbook, staffList, dateFormat); } - public void readExcelFile(String locale, String dateFormat) { + private List readExcelFile(final Workbook workbook, final String locale, final String dateFormat) { + List staffList = new ArrayList<>(); Sheet staffSheet = workbook.getSheet(TemplatePopulateImportConstants.EMPLOYEE_SHEET_NAME); Integer noOfEntries = ImportHandlerUtils.getNumberOfRows(staffSheet, TemplatePopulateImportConstants.FIRST_COLUMN_INDEX); for (int rowIndex = 1; rowIndex <= noOfEntries; rowIndex++) { Row row; row = staffSheet.getRow(rowIndex); if (ImportHandlerUtils.isNotImported(row, StaffConstants.STATUS_COL)) { - staffList.add(readStaff(row, locale, dateFormat)); + staffList.add(readStaff(workbook, row, locale, dateFormat)); } - } + return staffList; } - private StaffData readStaff(Row row, String locale, String dateFormat) { + private StaffData readStaff(final Workbook workbook, final Row row, final String locale, final String dateFormat) { String officeName = ImportHandlerUtils.readAsString(StaffConstants.OFFICE_NAME_COL, row); Long officeId = ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.OFFICE_SHEET_NAME), officeName); String firstName = ImportHandlerUtils.readAsString(StaffConstants.FIRST_NAME_COL, row); @@ -97,11 +93,11 @@ public class StaffImportHandler implements ImportHandler { row.getRowNum(), locale, dateFormat); } - public Count importEntity(String dateFormat) { + private Count importEntity(final Workbook workbook, final List staffList, final String dateFormat) { Sheet staffSheet = workbook.getSheet(TemplatePopulateImportConstants.EMPLOYEE_SHEET_NAME); int successCount = 0; int errorCount = 0; - String errorMessage = ""; + String errorMessage; GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder(); gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat)); for (StaffData staff : staffList) { @@ -111,7 +107,7 @@ public class StaffImportHandler implements ImportHandler { .createStaff()// .withJson(payload) // .build(); // - final CommandProcessingResult result = commandsSourceWritePlatformService.logCommandSource(commandRequest); + commandsSourceWritePlatformService.logCommandSource(commandRequest); successCount++; Cell statusCell = staffSheet.getRow(staff.getRowIndex()).createCell(StaffConstants.STATUS_COL); statusCell.setCellValue(TemplatePopulateImportConstants.STATUS_CELL_IMPORTED); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/users/UserImportHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/users/UserImportHandler.java index 896bebc2d..f7cb1ec51 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/users/UserImportHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/users/UserImportHandler.java @@ -30,7 +30,6 @@ import org.apache.fineract.infrastructure.bulkimport.constants.UserConstants; import org.apache.fineract.infrastructure.bulkimport.data.Count; import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandler; import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandlerUtils; -import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.serialization.GoogleGsonSerializerHelper; import org.apache.fineract.useradministration.data.AppUserData; import org.apache.poi.ss.usermodel.Cell; @@ -47,9 +46,6 @@ import org.springframework.stereotype.Service; public class UserImportHandler implements ImportHandler { private static final Logger LOG = LoggerFactory.getLogger(UserImportHandler.class); - private Workbook workbook; - private List users; - private List statuses; private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; @@ -59,27 +55,27 @@ public class UserImportHandler implements ImportHandler { } @Override - public Count process(Workbook workbook, String locale, String dateFormat) { - this.workbook = workbook; - users = new ArrayList<>(); - statuses = new ArrayList<>(); - readExcelFile(); - return importEntity(dateFormat); + public Count process(final Workbook workbook, final String locale, final String dateFormat) { + List statuses = new ArrayList<>(); + List users = readExcelFile(workbook, statuses); + return importEntity(workbook, users); } - public void readExcelFile() { + private List readExcelFile(final Workbook workbook, final List statuses) { + List users = new ArrayList<>(); Sheet usersSheet = workbook.getSheet(TemplatePopulateImportConstants.USER_SHEET_NAME); Integer noOfEntries = ImportHandlerUtils.getNumberOfRows(usersSheet, TemplatePopulateImportConstants.FIRST_COLUMN_INDEX); for (int rowIndex = 1; rowIndex <= noOfEntries; rowIndex++) { Row row; row = usersSheet.getRow(rowIndex); if (ImportHandlerUtils.isNotImported(row, UserConstants.STATUS_COL)) { - users.add(readUsers(row)); + users.add(readUsers(workbook, row, statuses)); } } + return users; } - private AppUserData readUsers(Row row) { + private AppUserData readUsers(final Workbook workbook, final Row row, final List statuses) { String officeName = ImportHandlerUtils.readAsString(UserConstants.OFFICE_NAME_COL, row); Long officeId = ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.OFFICE_SHEET_NAME), officeName); String staffName = ImportHandlerUtils.readAsString(UserConstants.STAFF_NAME_COL, row); @@ -109,11 +105,11 @@ public class UserImportHandler implements ImportHandler { } - public Count importEntity(String dateFormat) { + private Count importEntity(final Workbook workbook, final List users) { Sheet userSheet = workbook.getSheet(TemplatePopulateImportConstants.USER_SHEET_NAME); int successCount = 0; int errorCount = 0; - String errorMessage = ""; + String errorMessage; GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder(); for (AppUserData user : users) { try { @@ -123,7 +119,7 @@ public class UserImportHandler implements ImportHandler { .createUser() // .withJson(payload) // .build(); // - final CommandProcessingResult result = commandsSourceWritePlatformService.logCommandSource(commandRequest); + commandsSourceWritePlatformService.logCommandSource(commandRequest); successCount++; Cell statusCell = userSheet.getRow(user.getRowIndex()).createCell(UserConstants.STATUS_COL); statusCell.setCellValue(TemplatePopulateImportConstants.STATUS_CELL_IMPORTED); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/cache/api/CacheApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/cache/api/CacheApiResource.java index 045df534f..815bc8eb0 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/cache/api/CacheApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/cache/api/CacheApiResource.java @@ -27,9 +27,9 @@ 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 java.util.Arrays; import java.util.Collection; import java.util.HashSet; +import java.util.List; import java.util.Set; import javax.ws.rs.Consumes; import javax.ws.rs.GET; @@ -64,8 +64,8 @@ import org.springframework.stereotype.Component; + "By default caching is set to No Caching. Switching between caches results in the cache been clear e.g. from Single node to No cache and back again would clear down the single node cache.") public class CacheApiResource { - private static final Set RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id")); - private final String resourceNameForPermissions = "CACHE"; + private static final Set RESPONSE_DATA_PARAMETERS = new HashSet<>(List.of("id")); + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "CACHE"; private final PlatformSecurityContext context; private final DefaultToApiJsonSerializer toApiJsonSerializer; @@ -92,7 +92,7 @@ public class CacheApiResource { @ApiResponse(responseCode = "200", description = "OK", content = @Content(array = @ArraySchema(schema = @Schema(implementation = CacheApiResourceSwagger.GetCachesResponse.class)))) }) public String retrieveAll(@Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final Collection codes = this.cacheService.retrieveAll(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/api/EmailConfigurationApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/api/EmailConfigurationApiResource.java index e34aa0ec4..3ff5e131a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/api/EmailConfigurationApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/api/EmailConfigurationApiResource.java @@ -49,9 +49,8 @@ import org.springframework.stereotype.Component; @Scope("singleton") public class EmailConfigurationApiResource { - private final String resourceNameForPermissions = "EMAIL_CONFIGURATION"; + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "EMAIL_CONFIGURATION"; private final PlatformSecurityContext context; - private final EmailReadPlatformService readPlatformService; private final DefaultToApiJsonSerializer toApiJsonSerializer; private final ApiRequestParameterHelper apiRequestParameterHelper; private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; @@ -64,7 +63,6 @@ public class EmailConfigurationApiResource { final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService, final EmailConfigurationReadPlatformService emailConfigurationReadPlatformService) { this.context = context; - this.readPlatformService = readPlatformService; this.toApiJsonSerializer = toApiJsonSerializer; this.apiRequestParameterHelper = apiRequestParameterHelper; this.commandsSourceWritePlatformService = commandsSourceWritePlatformService; @@ -73,7 +71,7 @@ public class EmailConfigurationApiResource { @GET public String retrieveAll(@Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final Collection configuration = this.emailConfigurationReadPlatformService.retrieveAll(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/api/CodeValuesApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/api/CodeValuesApiResource.java index c16feb13d..5c5a72e2a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/api/CodeValuesApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/api/CodeValuesApiResource.java @@ -73,7 +73,7 @@ public class CodeValuesApiResource { Arrays.asList(CodevalueJSONinputParams.CODEVALUE_ID.getValue(), CodevalueJSONinputParams.NAME.getValue(), CodevalueJSONinputParams.POSITION.getValue(), CodevalueJSONinputParams.IS_MANDATORY.getValue(), CodevalueJSONinputParams.DESCRIPTION.getValue())); - private final String resourceNameForPermissions = "CODEVALUE"; + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "CODEVALUE"; private final PlatformSecurityContext context; private final CodeValueReadPlatformService readPlatformService; @@ -102,7 +102,7 @@ public class CodeValuesApiResource { public String retrieveAllCodeValues(@Context final UriInfo uriInfo, @PathParam("codeId") @Parameter(description = "codeId") final Long codeId) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final Collection codeValues = this.readPlatformService.retrieveAllCodeValues(codeId); @@ -122,7 +122,7 @@ public class CodeValuesApiResource { @PathParam("codeValueId") @Parameter(description = "codeValueId") final Long codeValueId, @PathParam("codeId") @Parameter(description = "codeId") final Long codeId) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final CodeValueData codeValue = this.readPlatformService.retrieveCodeValue(codeValueId); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/api/CodesApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/api/CodesApiResource.java index 811542bb1..cca281a36 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/api/CodesApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/api/CodesApiResource.java @@ -68,7 +68,7 @@ public class CodesApiResource { * The set of parameters that are supported in response for {@link CodeData} */ private static final Set RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id", "name", "systemDefined")); - private final String resourceNameForPermissions = "CODE"; + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "CODE"; private final PlatformSecurityContext context; private final CodeReadPlatformService readPlatformService; @@ -95,7 +95,7 @@ public class CodesApiResource { @ApiResponse(responseCode = "200", description = "OK", content = @Content(array = @ArraySchema(schema = @Schema(implementation = CodesApiResourceSwagger.GetCodesResponse.class)))) }) public String retrieveCodes(@Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final Collection codes = this.readPlatformService.retrieveAllCodes(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/serialization/CodeCommandFromApiJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/serialization/CodeCommandFromApiJsonDeserializer.java index 1dc914c26..ebc2e4ff0 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/serialization/CodeCommandFromApiJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/serialization/CodeCommandFromApiJsonDeserializer.java @@ -22,7 +22,6 @@ import com.google.gson.JsonElement; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -45,7 +44,7 @@ public final class CodeCommandFromApiJsonDeserializer { /** * The parameters supported for this command. */ - private final Set supportedParameters = new HashSet<>(Arrays.asList("name")); + private static final Set SUPPORTED_PARAMETERS = new HashSet<>(List.of("name")); private final FromJsonHelper fromApiJsonHelper; @Autowired @@ -59,7 +58,7 @@ public final class CodeCommandFromApiJsonDeserializer { } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("code"); @@ -78,7 +77,7 @@ public final class CodeCommandFromApiJsonDeserializer { } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("code"); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/serialization/CodeValueCommandFromApiJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/serialization/CodeValueCommandFromApiJsonDeserializer.java index 404193c9f..1f8a771c9 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/serialization/CodeValueCommandFromApiJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/serialization/CodeValueCommandFromApiJsonDeserializer.java @@ -44,7 +44,7 @@ public final class CodeValueCommandFromApiJsonDeserializer { /** * The parameters supported for this command. */ - private final Set supportedParameters = CodevalueJSONinputParams.getAllValues(); + private static final Set SUPPORTED_PARAMETERS = CodevalueJSONinputParams.getAllValues(); private final FromJsonHelper fromApiJsonHelper; @Autowired @@ -58,7 +58,7 @@ public final class CodeValueCommandFromApiJsonDeserializer { } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("code.value"); @@ -93,7 +93,7 @@ public final class CodeValueCommandFromApiJsonDeserializer { } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("code.value"); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/api/GlobalConfigurationApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/api/GlobalConfigurationApiResource.java index f26438d48..2bf63d455 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/api/GlobalConfigurationApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/api/GlobalConfigurationApiResource.java @@ -71,7 +71,7 @@ public class GlobalConfigurationApiResource { private static final Set RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("globalConfiguration")); - private final String resourceNameForPermissions = "CONFIGURATION"; + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "CONFIGURATION"; private final PlatformSecurityContext context; private final ConfigurationReadPlatformService readPlatformService; @@ -106,7 +106,7 @@ public class GlobalConfigurationApiResource { public String retrieveConfiguration(@Context final UriInfo uriInfo, @DefaultValue("false") @QueryParam("survey") @Parameter(description = "survey") final boolean survey) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final GlobalConfigurationData configurationData = this.readPlatformService.retrieveGlobalConfiguration(survey); @@ -125,7 +125,7 @@ public class GlobalConfigurationApiResource { public String retrieveOne(@PathParam("configId") @Parameter(description = "configId") final Long configId, @Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final GlobalConfigurationPropertyData configurationData = this.readPlatformService.retrieveGlobalConfiguration(configId); @@ -143,7 +143,7 @@ public class GlobalConfigurationApiResource { @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = GlobalConfigurationPropertyData.class))) }) public String retrieveOneByName(@PathParam("name") @Parameter(description = "name") final String name, @Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final GlobalConfigurationPropertyData configurationData = this.readPlatformService.retrieveGlobalConfiguration(name); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/serialization/ExternalServicesPropertiesCommandFromApiJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/serialization/ExternalServicesPropertiesCommandFromApiJsonDeserializer.java index c90010c76..2ce038e15 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/serialization/ExternalServicesPropertiesCommandFromApiJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/serialization/ExternalServicesPropertiesCommandFromApiJsonDeserializer.java @@ -36,10 +36,10 @@ import org.springframework.stereotype.Component; @Component public class ExternalServicesPropertiesCommandFromApiJsonDeserializer { - private final Set s3SupportedParameters = S3JSONinputParams.getAllValues(); - private final Set smtpSupportedParameters = SMTPJSONinputParams.getAllValues(); - private final Set smsSupportedParameters = SMSJSONinputParams.getAllValues(); - private final Set notificationSupportedParameters = NotificationJSONinputParams.getAllValues(); + private static final Set S3_SUPPORTED_PARAMETERS = S3JSONinputParams.getAllValues(); + private static final Set SMTP_SUPPORTED_PARAMETERS = SMTPJSONinputParams.getAllValues(); + private static final Set SMS_SUPPORTED_PARAMETERS = SMSJSONinputParams.getAllValues(); + private static final Set NOTIFICATION_SUPPORTED_PARAMETERS = NotificationJSONinputParams.getAllValues(); private final FromJsonHelper fromApiJsonHelper; @Autowired @@ -52,34 +52,24 @@ public class ExternalServicesPropertiesCommandFromApiJsonDeserializer { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); + final Type typeOfMap = new TypeToken>() { + + }.getType(); switch (externalServiceName) { - case "S3": - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.s3SupportedParameters); - break; - - case "SMTP": - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.smtpSupportedParameters); - break; - - case "SMS": - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.smsSupportedParameters); - break; - - case "NOTIFICATION": - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.notificationSupportedParameters); - break; - - default: - throw new ExternalServiceConfigurationNotFoundException(externalServiceName); + case "S3" -> this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, S3_SUPPORTED_PARAMETERS); + case "SMTP" -> this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SMTP_SUPPORTED_PARAMETERS); + case "SMS" -> this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SMS_SUPPORTED_PARAMETERS); + case "NOTIFICATION" -> this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, NOTIFICATION_SUPPORTED_PARAMETERS); + default -> throw new ExternalServiceConfigurationNotFoundException(externalServiceName); } } public Set getNameKeys(final String json) { - final Type typeOfMap = new TypeToken>() {}.getType(); + final Type typeOfMap = new TypeToken>() { + + }.getType(); Map jsonMap = this.fromApiJsonHelper.extractDataMap(typeOfMap, json); - Set keyNames = jsonMap.keySet(); - return keyNames; + return jsonMap.keySet(); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/serialization/GlobalConfigurationCommandFromApiJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/serialization/GlobalConfigurationCommandFromApiJsonDeserializer.java index 67ac28555..948e571a5 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/serialization/GlobalConfigurationCommandFromApiJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/serialization/GlobalConfigurationCommandFromApiJsonDeserializer.java @@ -20,8 +20,8 @@ package org.apache.fineract.infrastructure.configuration.serialization; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; -import java.util.Arrays; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.lang3.StringUtils; @@ -43,7 +43,7 @@ public final class GlobalConfigurationCommandFromApiJsonDeserializer /** * The parameters supported for this command. */ - private final Set supportedParameters = new HashSet<>(Arrays.asList("globalConfiguration")); + private static final Set SUPPORTED_PARAMETERS = new HashSet<>(List.of("globalConfiguration")); private final FromJsonHelper fromApiJsonHelper; @Autowired @@ -59,7 +59,7 @@ public final class GlobalConfigurationCommandFromApiJsonDeserializer } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); return this.fromApiJsonHelper.fromJson(json, UpdateGlobalConfigurationCommand.class); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/data/PaginationParametersDataValidator.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/data/PaginationParametersDataValidator.java index 339ba1bb8..856c49be1 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/data/PaginationParametersDataValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/data/PaginationParametersDataValidator.java @@ -29,14 +29,14 @@ import org.springframework.stereotype.Component; @Component public class PaginationParametersDataValidator { - private final Set sortOrderValues = new HashSet<>(Arrays.asList("ASC", "DESC")); + private static final Set sortOrderValues = new HashSet<>(Arrays.asList("ASC", "DESC")); public void validateParameterValues(PaginationParameters parameters, final Set supportedOrdeByValues, final String resourceName) { final List dataValidationErrors = new ArrayList<>(); if (parameters.isOrderByRequested() && !supportedOrdeByValues.contains(parameters.getOrderBy())) { final String defaultUserMessage = "The orderBy value '" + parameters.getOrderBy() - + "' is not supported. The supported orderBy values are " + supportedOrdeByValues.toString(); + + "' is not supported. The supported orderBy values are " + supportedOrdeByValues; final ApiParameterError error = ApiParameterError.parameterError( "validation.msg." + resourceName + ".orderBy.value.is.not.supported", defaultUserMessage, "orderBy", parameters.getOrderBy(), supportedOrdeByValues.toString()); @@ -45,7 +45,7 @@ public class PaginationParametersDataValidator { if (parameters.isSortOrderProvided() && !sortOrderValues.contains(parameters.getSortOrder().toUpperCase())) { final String defaultUserMessage = "The sortOrder value '" + parameters.getSortOrder() - + "' is not supported. The supported sortOrder values are " + sortOrderValues.toString(); + + "' is not supported. The supported sortOrder values are " + sortOrderValues; final ApiParameterError error = ApiParameterError.parameterError( "validation.msg." + resourceName + ".sortOrder.value.is.not.supported", defaultUserMessage, "sortOrder", parameters.getSortOrder(), sortOrderValues.toString()); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/DatatableCommandFromApiJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/DatatableCommandFromApiJsonDeserializer.java index 367935f36..5f3db62f7 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/DatatableCommandFromApiJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/DatatableCommandFromApiJsonDeserializer.java @@ -40,25 +40,57 @@ import org.springframework.stereotype.Component; @Component public class DatatableCommandFromApiJsonDeserializer { + public static final String DATATABLE_NAME = "datatableName"; + public static final String ENTITY_SUB_TYPE = "entitySubType"; + public static final String APPTABLE_NAME = "apptableName"; + public static final String MULTI_ROW = "multiRow"; + public static final String COLUMNS = "columns"; + public static final String NAME = "name"; + public static final String TYPE = "type"; + public static final String LENGTH = "length"; + public static final String MANDATORY = "mandatory"; + public static final String CODE = "code"; + public static final String CHANGE_COLUMNS = "changeColumns"; + public static final String ADD_COLUMNS = "addColumns"; + public static final String DROP_COLUMNS = "dropColumns"; + public static final String AFTER = "after"; + public static final String NEW_CODE = "newCode"; + public static final String M_LOAN = "m_loan"; + public static final String M_SAVINGS_ACCOUNT = "m_savings_account"; + public static final String M_CLIENT = "m_client"; + public static final String M_GROUP = "m_group"; + public static final String M_CENTER = "m_center"; + public static final String M_OFFICE = "m_office"; + public static final String M_SAVINGS_PRODUCT = "m_savings_product"; + public static final String M_PRODUCT_LOAN = "m_product_loan"; + public static final String NEW_NAME = "newName"; + public static final String STRING = "string"; + public static final String NUMBER = "number"; + public static final String BOOLEAN = "boolean"; + public static final String DECIMAL = "decimal"; + public static final String DATE = "date"; + public static final String DATETIME = "datetime"; + public static final String TEXT = "text"; + public static final String DROPDOWN = "dropdown"; private static final String DATATABLE_NAME_REGEX_PATTERN = "^[a-zA-Z][a-zA-Z0-9\\-_\\s]{0,48}[a-zA-Z0-9]$"; private static final String DATATABLE_COLUMN_NAME_REGEX_PATTERN = "^[a-zA-Z][a-zA-Z0-9\\-_\\s]{0,}[a-zA-Z0-9]$"; /** * The parameters supported for this command. */ - private final Set supportedParametersForCreate = new HashSet<>( - Arrays.asList("datatableName", "entitySubType", "apptableName", "multiRow", "columns")); - private final Set supportedParametersForCreateColumns = new HashSet<>( - Arrays.asList("name", "type", "length", "mandatory", "code")); - private final Set supportedParametersForUpdate = new HashSet<>( - Arrays.asList("apptableName", "entitySubType", "changeColumns", "addColumns", "dropColumns")); - private final Set supportedParametersForAddColumns = new HashSet<>( - Arrays.asList("name", "type", "length", "mandatory", "after", "code")); - private final Set supportedParametersForChangeColumns = new HashSet<>( - Arrays.asList("name", "newName", "length", "mandatory", "after", "code", "newCode")); - private final Set supportedParametersForDropColumns = new HashSet<>(Arrays.asList("name")); - private final Object[] supportedColumnTypes = { "string", "number", "boolean", "decimal", "date", "datetime", "text", "dropdown" }; - private final Object[] supportedApptableNames = { "m_loan", "m_savings_account", "m_client", "m_group", "m_center", "m_office", - "m_savings_product", "m_product_loan" }; + private static final Set SUPPORTED_PARAMETERS_FOR_CREATE = new HashSet<>( + Arrays.asList(DATATABLE_NAME, ENTITY_SUB_TYPE, APPTABLE_NAME, MULTI_ROW, COLUMNS)); + private static final Set SUPPORTED_PARAMETERS_FOR_CREATE_COLUMNS = new HashSet<>( + Arrays.asList(NAME, TYPE, LENGTH, MANDATORY, CODE)); + private static final Set SUPPORTED_PARAMETERS_FOR_UPDATE = new HashSet<>( + Arrays.asList(APPTABLE_NAME, ENTITY_SUB_TYPE, CHANGE_COLUMNS, ADD_COLUMNS, DROP_COLUMNS)); + private static final Set SUPPORTED_PARAMETERS_FOR_ADD_COLUMNS = new HashSet<>( + Arrays.asList(NAME, TYPE, LENGTH, MANDATORY, AFTER, CODE)); + private static final Set SUPPORTED_PARAMETERS_FOR_CHANGE_COLUMNS = new HashSet<>( + Arrays.asList(NAME, NEW_NAME, LENGTH, MANDATORY, AFTER, CODE, NEW_CODE)); + private static final Set SUPPORTED_PARAMETERS_FOR_DROP_COLUMNS = new HashSet<>(List.of(NAME)); + private static final Object[] SUPPORTED_COLUMN_TYPES = { STRING, NUMBER, BOOLEAN, DECIMAL, DATE, DATETIME, TEXT, DROPDOWN }; + private static final Object[] SUPPORTED_APPTABLE_NAMES = { M_LOAN, M_SAVINGS_ACCOUNT, M_CLIENT, M_GROUP, M_CENTER, M_OFFICE, + M_SAVINGS_PRODUCT, M_PRODUCT_LOAN }; private final FromJsonHelper fromApiJsonHelper; @@ -68,37 +100,37 @@ public class DatatableCommandFromApiJsonDeserializer { } private void validateType(final DataValidatorBuilder baseDataValidator, final JsonElement column) { - final String type = this.fromApiJsonHelper.extractStringNamed("type", column); - baseDataValidator.reset().parameter("type").value(type).notBlank().isOneOfTheseStringValues(this.supportedColumnTypes); + final String type = this.fromApiJsonHelper.extractStringNamed(TYPE, column); + baseDataValidator.reset().parameter(TYPE).value(type).notBlank().isOneOfTheseStringValues(SUPPORTED_COLUMN_TYPES); if (type != null && type.equalsIgnoreCase("String")) { - if (this.fromApiJsonHelper.parameterExists("length", column)) { - final String lengthStr = this.fromApiJsonHelper.extractStringNamed("length", column); + if (this.fromApiJsonHelper.parameterExists(LENGTH, column)) { + final String lengthStr = this.fromApiJsonHelper.extractStringNamed(LENGTH, column); if (lengthStr != null && !StringUtils.isWhitespace(lengthStr) && StringUtils.isNumeric(lengthStr) && StringUtils.isNotBlank(lengthStr)) { final Integer length = Integer.parseInt(lengthStr); - baseDataValidator.reset().parameter("length").value(length).positiveAmount(); + baseDataValidator.reset().parameter(LENGTH).value(length).positiveAmount(); } else if (StringUtils.isBlank(lengthStr) || StringUtils.isWhitespace(lengthStr)) { - baseDataValidator.reset().parameter("length").failWithCode("must.be.provided.when.type.is.String"); + baseDataValidator.reset().parameter(LENGTH).failWithCode("must.be.provided.when.type.is.String"); } else if (!StringUtils.isNumeric(lengthStr)) { - baseDataValidator.reset().parameter("length").failWithCode("not.greater.than.zero"); + baseDataValidator.reset().parameter(LENGTH).failWithCode("not.greater.than.zero"); } } else { - baseDataValidator.reset().parameter("length").failWithCode("must.be.provided.when.type.is.String"); + baseDataValidator.reset().parameter(LENGTH).failWithCode("must.be.provided.when.type.is.String"); } } else { - baseDataValidator.reset().parameter("length").mustBeBlankWhenParameterProvidedIs("type", type); + baseDataValidator.reset().parameter(LENGTH).mustBeBlankWhenParameterProvidedIs(TYPE, type); } - final String code = this.fromApiJsonHelper.extractStringNamed("code", column); - if (type != null && type.equalsIgnoreCase("Dropdown")) { + final String code = this.fromApiJsonHelper.extractStringNamed(CODE, column); + if (type != null && type.equalsIgnoreCase(DROPDOWN)) { if (code != null) { - baseDataValidator.reset().parameter("code").value(code).notBlank().matchesRegularExpression(DATATABLE_NAME_REGEX_PATTERN); + baseDataValidator.reset().parameter(CODE).value(code).notBlank().matchesRegularExpression(DATATABLE_NAME_REGEX_PATTERN); } else { - baseDataValidator.reset().parameter("code").value(code).cantBeBlankWhenParameterProvidedIs("type", type); + baseDataValidator.reset().parameter(CODE).value(code).cantBeBlankWhenParameterProvidedIs(TYPE, type); } } else { - baseDataValidator.reset().parameter("code").value(code).mustBeBlankWhenParameterProvided("type", type); + baseDataValidator.reset().parameter(CODE).value(code).mustBeBlankWhenParameterProvided(TYPE, type); } } @@ -107,46 +139,48 @@ public class DatatableCommandFromApiJsonDeserializer { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParametersForCreate); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS_FOR_CREATE); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("datatable"); final JsonElement element = this.fromApiJsonHelper.parse(json); - final String datatableName = this.fromApiJsonHelper.extractStringNamed("datatableName", element); - baseDataValidator.reset().parameter("datatableName").value(datatableName).notBlank().notExceedingLengthOf(50) + final String datatableName = this.fromApiJsonHelper.extractStringNamed(DATATABLE_NAME, element); + baseDataValidator.reset().parameter(DATATABLE_NAME).value(datatableName).notBlank().notExceedingLengthOf(50) .matchesRegularExpression(DATATABLE_NAME_REGEX_PATTERN); - final String apptableName = this.fromApiJsonHelper.extractStringNamed("apptableName", element); - baseDataValidator.reset().parameter("apptableName").value(apptableName).notBlank().notExceedingLengthOf(50) - .isOneOfTheseValues(this.supportedApptableNames); + final String apptableName = this.fromApiJsonHelper.extractStringNamed(APPTABLE_NAME, element); + baseDataValidator.reset().parameter(APPTABLE_NAME).value(apptableName).notBlank().notExceedingLengthOf(50) + .isOneOfTheseValues(SUPPORTED_APPTABLE_NAMES); - if ("m_client".equals(apptableName)) { - String entitySubType = this.fromApiJsonHelper.extractStringNamed("entitySubType", element); - baseDataValidator.reset().parameter("entitySubType").value(entitySubType).notBlank(); // Person or Entity + if (M_CLIENT.equals(apptableName)) { + String entitySubType = this.fromApiJsonHelper.extractStringNamed(ENTITY_SUB_TYPE, element); + baseDataValidator.reset().parameter(ENTITY_SUB_TYPE).value(entitySubType).notBlank(); // Person or Entity } final String fkColumnName = (apptableName != null) ? apptableName.substring(2) + "_id" : ""; - final Boolean multiRow = this.fromApiJsonHelper.extractBooleanNamed("multiRow", element); - baseDataValidator.reset().parameter("multiRow").value(multiRow).ignoreIfNull().notBlank().isOneOfTheseValues(true, false); + final Boolean multiRow = this.fromApiJsonHelper.extractBooleanNamed(MULTI_ROW, element); + baseDataValidator.reset().parameter(MULTI_ROW).value(multiRow).ignoreIfNull().notBlank().isOneOfTheseValues(true, false); - final JsonArray columns = this.fromApiJsonHelper.extractJsonArrayNamed("columns", element); - baseDataValidator.reset().parameter("columns").value(columns).notNull().jsonArrayNotEmpty(); + final JsonArray columns = this.fromApiJsonHelper.extractJsonArrayNamed(COLUMNS, element); + baseDataValidator.reset().parameter(COLUMNS).value(columns).notNull().jsonArrayNotEmpty(); if (columns != null) { for (final JsonElement column : columns) { - this.fromApiJsonHelper.checkForUnsupportedParameters(column.getAsJsonObject(), this.supportedParametersForCreateColumns); + this.fromApiJsonHelper.checkForUnsupportedParameters(column.getAsJsonObject(), SUPPORTED_PARAMETERS_FOR_CREATE_COLUMNS); - final String name = this.fromApiJsonHelper.extractStringNamed("name", column); - baseDataValidator.reset().parameter("name").value(name).notBlank().isNotOneOfTheseValues("id", fkColumnName) + final String name = this.fromApiJsonHelper.extractStringNamed(NAME, column); + baseDataValidator.reset().parameter(NAME).value(name).notBlank().isNotOneOfTheseValues("id", fkColumnName) .matchesRegularExpression(DATATABLE_COLUMN_NAME_REGEX_PATTERN); validateType(baseDataValidator, column); - final Boolean mandatory = this.fromApiJsonHelper.extractBooleanNamed("mandatory", column); - baseDataValidator.reset().parameter("mandatory").value(mandatory).ignoreIfNull().notBlank().isOneOfTheseValues(true, false); + final Boolean mandatory = this.fromApiJsonHelper.extractBooleanNamed(MANDATORY, column); + baseDataValidator.reset().parameter(MANDATORY).value(mandatory).ignoreIfNull().notBlank().isOneOfTheseValues(true, false); } } @@ -166,99 +200,101 @@ public class DatatableCommandFromApiJsonDeserializer { "Provided JSON request body does not have any parameters."); } - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParametersForUpdate); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS_FOR_UPDATE); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("datatable"); final JsonElement element = this.fromApiJsonHelper.parse(json); - final String apptableName = this.fromApiJsonHelper.extractStringNamed("apptableName", element); - baseDataValidator.reset().parameter("apptableName").value(apptableName).ignoreIfNull().notBlank() - .isOneOfTheseValues(this.supportedApptableNames); + final String apptableName = this.fromApiJsonHelper.extractStringNamed(APPTABLE_NAME, element); + baseDataValidator.reset().parameter(APPTABLE_NAME).value(apptableName).ignoreIfNull().notBlank() + .isOneOfTheseValues(SUPPORTED_APPTABLE_NAMES); - if ("m_client".equals(apptableName)) { - String entitySubType = this.fromApiJsonHelper.extractStringNamed("entitySubType", element); - baseDataValidator.reset().parameter("entitySubType").value(entitySubType).notBlank(); // Person or Entity + if (M_CLIENT.equals(apptableName)) { + String entitySubType = this.fromApiJsonHelper.extractStringNamed(ENTITY_SUB_TYPE, element); + baseDataValidator.reset().parameter(ENTITY_SUB_TYPE).value(entitySubType).notBlank(); // Person or Entity } final String fkColumnName = (apptableName != null) ? apptableName.substring(2) + "_id" : ""; - final JsonArray changeColumns = this.fromApiJsonHelper.extractJsonArrayNamed("changeColumns", element); - baseDataValidator.reset().parameter("changeColumns").value(changeColumns).ignoreIfNull().jsonArrayNotEmpty(); + final JsonArray changeColumns = this.fromApiJsonHelper.extractJsonArrayNamed(CHANGE_COLUMNS, element); + baseDataValidator.reset().parameter(CHANGE_COLUMNS).value(changeColumns).ignoreIfNull().jsonArrayNotEmpty(); if (changeColumns != null) { for (final JsonElement column : changeColumns) { - this.fromApiJsonHelper.checkForUnsupportedParameters(column.getAsJsonObject(), this.supportedParametersForChangeColumns); + this.fromApiJsonHelper.checkForUnsupportedParameters(column.getAsJsonObject(), SUPPORTED_PARAMETERS_FOR_CHANGE_COLUMNS); - final String name = this.fromApiJsonHelper.extractStringNamed("name", column); - baseDataValidator.reset().parameter("name").value(name).notBlank().isNotOneOfTheseValues("id", fkColumnName) + final String name = this.fromApiJsonHelper.extractStringNamed(NAME, column); + baseDataValidator.reset().parameter(NAME).value(name).notBlank().isNotOneOfTheseValues("id", fkColumnName) .matchesRegularExpression(DATATABLE_COLUMN_NAME_REGEX_PATTERN); - final String newName = this.fromApiJsonHelper.extractStringNamed("newName", column); - baseDataValidator.reset().parameter("newName").value(newName).ignoreIfNull().notBlank().notExceedingLengthOf(50) + final String newName = this.fromApiJsonHelper.extractStringNamed(NEW_NAME, column); + baseDataValidator.reset().parameter(NEW_NAME).value(newName).ignoreIfNull().notBlank().notExceedingLengthOf(50) .isNotOneOfTheseValues("id", fkColumnName).matchesRegularExpression(DATATABLE_COLUMN_NAME_REGEX_PATTERN); - if (this.fromApiJsonHelper.parameterExists("length", column)) { - final String lengthStr = this.fromApiJsonHelper.extractStringNamed("length", column); + if (this.fromApiJsonHelper.parameterExists(LENGTH, column)) { + final String lengthStr = this.fromApiJsonHelper.extractStringNamed(LENGTH, column); if (StringUtils.isWhitespace(lengthStr) || !StringUtils.isNumeric(lengthStr) || StringUtils.isBlank(lengthStr)) { - baseDataValidator.reset().parameter("length").failWithCode("not.greater.than.zero"); + baseDataValidator.reset().parameter(LENGTH).failWithCode("not.greater.than.zero"); } else { final Integer length = Integer.parseInt(lengthStr); - baseDataValidator.reset().parameter("length").value(length).ignoreIfNull().notBlank().positiveAmount(); + baseDataValidator.reset().parameter(LENGTH).value(length).ignoreIfNull().notBlank().positiveAmount(); } } - final String code = this.fromApiJsonHelper.extractStringNamed("code", column); - baseDataValidator.reset().parameter("code").value(code).ignoreIfNull().notBlank().notExceedingLengthOf(100) + final String code = this.fromApiJsonHelper.extractStringNamed(CODE, column); + baseDataValidator.reset().parameter(CODE).value(code).ignoreIfNull().notBlank().notExceedingLengthOf(100) .matchesRegularExpression(DATATABLE_COLUMN_NAME_REGEX_PATTERN); - final String newCode = this.fromApiJsonHelper.extractStringNamed("newCode", column); - baseDataValidator.reset().parameter("newCode").value(newCode).ignoreIfNull().notBlank().notExceedingLengthOf(100) + final String newCode = this.fromApiJsonHelper.extractStringNamed(NEW_CODE, column); + baseDataValidator.reset().parameter(NEW_CODE).value(newCode).ignoreIfNull().notBlank().notExceedingLengthOf(100) .matchesRegularExpression(DATATABLE_COLUMN_NAME_REGEX_PATTERN); if (StringUtils.isBlank(code) && StringUtils.isNotBlank(newCode)) { - baseDataValidator.reset().parameter("code").value(code).cantBeBlankWhenParameterProvidedIs("newCode", newCode); + baseDataValidator.reset().parameter(CODE).value(code).cantBeBlankWhenParameterProvidedIs(NEW_CODE, newCode); } - final Boolean mandatory = this.fromApiJsonHelper.extractBooleanNamed("mandatory", column); - baseDataValidator.reset().parameter("mandatory").value(mandatory).ignoreIfNull().notBlank().isOneOfTheseValues(true, false); + final Boolean mandatory = this.fromApiJsonHelper.extractBooleanNamed(MANDATORY, column); + baseDataValidator.reset().parameter(MANDATORY).value(mandatory).ignoreIfNull().notBlank().isOneOfTheseValues(true, false); - final Boolean after = this.fromApiJsonHelper.extractBooleanNamed("after", column); - baseDataValidator.reset().parameter("after").value(after).ignoreIfNull().notBlank().isOneOfTheseValues(true, false); + final Boolean after = this.fromApiJsonHelper.extractBooleanNamed(AFTER, column); + baseDataValidator.reset().parameter(AFTER).value(after).ignoreIfNull().notBlank().isOneOfTheseValues(true, false); } } - final JsonArray addColumns = this.fromApiJsonHelper.extractJsonArrayNamed("addColumns", element); - baseDataValidator.reset().parameter("addColumns").value(addColumns).ignoreIfNull().jsonArrayNotEmpty(); + final JsonArray addColumns = this.fromApiJsonHelper.extractJsonArrayNamed(ADD_COLUMNS, element); + baseDataValidator.reset().parameter(ADD_COLUMNS).value(addColumns).ignoreIfNull().jsonArrayNotEmpty(); if (addColumns != null) { for (final JsonElement column : addColumns) { - this.fromApiJsonHelper.checkForUnsupportedParameters(column.getAsJsonObject(), this.supportedParametersForAddColumns); + this.fromApiJsonHelper.checkForUnsupportedParameters(column.getAsJsonObject(), SUPPORTED_PARAMETERS_FOR_ADD_COLUMNS); - final String name = this.fromApiJsonHelper.extractStringNamed("name", column); - baseDataValidator.reset().parameter("name").value(name).notBlank().isNotOneOfTheseValues("id", fkColumnName) + final String name = this.fromApiJsonHelper.extractStringNamed(NAME, column); + baseDataValidator.reset().parameter(NAME).value(name).notBlank().isNotOneOfTheseValues("id", fkColumnName) .matchesRegularExpression(DATATABLE_COLUMN_NAME_REGEX_PATTERN); validateType(baseDataValidator, column); - final Boolean mandatory = this.fromApiJsonHelper.extractBooleanNamed("mandatory", column); - baseDataValidator.reset().parameter("mandatory").value(mandatory).ignoreIfNull().notBlank().isOneOfTheseValues(true, false); + final Boolean mandatory = this.fromApiJsonHelper.extractBooleanNamed(MANDATORY, column); + baseDataValidator.reset().parameter(MANDATORY).value(mandatory).ignoreIfNull().notBlank().isOneOfTheseValues(true, false); - final Boolean after = this.fromApiJsonHelper.extractBooleanNamed("after", column); - baseDataValidator.reset().parameter("after").value(after).ignoreIfNull().notBlank().isOneOfTheseValues(true, false); + final Boolean after = this.fromApiJsonHelper.extractBooleanNamed(AFTER, column); + baseDataValidator.reset().parameter(AFTER).value(after).ignoreIfNull().notBlank().isOneOfTheseValues(true, false); } } - final JsonArray dropColumns = this.fromApiJsonHelper.extractJsonArrayNamed("dropColumns", element); - baseDataValidator.reset().parameter("dropColumns").value(dropColumns).ignoreIfNull().jsonArrayNotEmpty(); + final JsonArray dropColumns = this.fromApiJsonHelper.extractJsonArrayNamed(DROP_COLUMNS, element); + baseDataValidator.reset().parameter(DROP_COLUMNS).value(dropColumns).ignoreIfNull().jsonArrayNotEmpty(); if (dropColumns != null) { for (final JsonElement column : dropColumns) { - this.fromApiJsonHelper.checkForUnsupportedParameters(column.getAsJsonObject(), this.supportedParametersForDropColumns); + this.fromApiJsonHelper.checkForUnsupportedParameters(column.getAsJsonObject(), SUPPORTED_PARAMETERS_FOR_DROP_COLUMNS); - final String name = this.fromApiJsonHelper.extractStringNamed("name", column); - baseDataValidator.reset().parameter("name").value(name).notBlank().isNotOneOfTheseValues("id", fkColumnName) + final String name = this.fromApiJsonHelper.extractStringNamed(NAME, column); + baseDataValidator.reset().parameter(NAME).value(name).notBlank().isNotOneOfTheseValues("id", fkColumnName) .matchesRegularExpression(DATATABLE_COLUMN_NAME_REGEX_PATTERN); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/TomcatJdbcDataSourcePerTenantService.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/TomcatJdbcDataSourcePerTenantService.java index a16ef739d..fb85ebeee 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/TomcatJdbcDataSourcePerTenantService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/TomcatJdbcDataSourcePerTenantService.java @@ -36,7 +36,7 @@ import org.springframework.stereotype.Service; @Service public class TomcatJdbcDataSourcePerTenantService implements RoutingDataSourceService { - private final Map tenantToDataSourceMap = new HashMap<>(1); + private static final Map TENANT_TO_DATA_SOURCE_MAP = new HashMap<>(1); private final DataSource tenantDataSource; private final DataSourcePerTenantServiceFactory dataSourcePerTenantServiceFactory; @@ -51,25 +51,25 @@ public class TomcatJdbcDataSourcePerTenantService implements RoutingDataSourceSe @Override public DataSource retrieveDataSource() { // default to tenant database datasource - DataSource tenantDataSource = this.tenantDataSource; + DataSource actualDataSource = this.tenantDataSource; final FineractPlatformTenant tenant = ThreadLocalContextUtil.getTenant(); if (tenant != null) { final FineractPlatformTenantConnection tenantConnection = tenant.getConnection(); - synchronized (this.tenantToDataSourceMap) { + synchronized (TENANT_TO_DATA_SOURCE_MAP) { // if tenantConnection information available switch to the // appropriate datasource for that tenant. - DataSource possibleDS = this.tenantToDataSourceMap.get(tenantConnection.getConnectionId()); + DataSource possibleDS = TENANT_TO_DATA_SOURCE_MAP.get(tenantConnection.getConnectionId()); if (possibleDS != null) { - tenantDataSource = possibleDS; + actualDataSource = possibleDS; } else { - tenantDataSource = dataSourcePerTenantServiceFactory.createNewDataSourceFor(tenantConnection); - this.tenantToDataSourceMap.put(tenantConnection.getConnectionId(), tenantDataSource); + actualDataSource = dataSourcePerTenantServiceFactory.createNewDataSourceFor(tenantConnection); + TENANT_TO_DATA_SOURCE_MAP.put(tenantConnection.getConnectionId(), actualDataSource); } } } - return tenantDataSource; + return actualDataSource; } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/database/DatabaseTypeResolver.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/database/DatabaseTypeResolver.java index 7062324df..d41ce9031 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/database/DatabaseTypeResolver.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/database/DatabaseTypeResolver.java @@ -28,10 +28,11 @@ import org.springframework.stereotype.Component; @Component public class DatabaseTypeResolver implements InitializingBean { - private final Map driverMapping = Map.of("org.mariadb.jdbc.Driver", DatabaseType.MYSQL, "com.mysql.jdbc.Driver", - DatabaseType.MYSQL, "com.mysql.cj.jdbc.Driver", DatabaseType.MYSQL, "org.postgresql.Driver", DatabaseType.POSTGRESQL); + private static final Map DRIVER_MAPPING = Map.of("org.mariadb.jdbc.Driver", DatabaseType.MYSQL, + "com.mysql.jdbc.Driver", DatabaseType.MYSQL, "com.mysql.cj.jdbc.Driver", DatabaseType.MYSQL, "org.postgresql.Driver", + DatabaseType.POSTGRESQL); - private final AtomicReference currentDatabaseType = new AtomicReference<>(); + private static final AtomicReference currentDatabaseType = new AtomicReference<>(); private final HikariConfig hikariConfig; @Autowired @@ -45,7 +46,7 @@ public class DatabaseTypeResolver implements InitializingBean { } private DatabaseType determineDatabaseType(String driverClassName) { - DatabaseType databaseType = driverMapping.get(driverClassName); + DatabaseType databaseType = DRIVER_MAPPING.get(driverClassName); if (databaseType == null) { throw new IllegalArgumentException("The driver's class is not supported " + driverClassName); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/DatabaseAwareMigrationContextProvider.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/DatabaseAwareMigrationContextProvider.java index 580e6aba7..89357b79f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/DatabaseAwareMigrationContextProvider.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/DatabaseAwareMigrationContextProvider.java @@ -27,7 +27,8 @@ import org.springframework.stereotype.Component; @Component public class DatabaseAwareMigrationContextProvider { - private final Map contextMapping = Map.of(DatabaseType.MYSQL, "mysql", DatabaseType.POSTGRESQL, "postgresql"); + private static final Map CONTEXT_MAPPING = Map.of(DatabaseType.MYSQL, "mysql", DatabaseType.POSTGRESQL, + "postgresql"); private final DatabaseTypeResolver databaseTypeResolver; @@ -38,7 +39,7 @@ public class DatabaseAwareMigrationContextProvider { public String provide() { DatabaseType databaseType = databaseTypeResolver.databaseType(); - String context = contextMapping.get(databaseType); + String context = CONTEXT_MAPPING.get(databaseType); if (context == null) { throw new IllegalStateException("Database is not supported"); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/api/CreditBureauConfigurationAPI.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/api/CreditBureauConfigurationAPI.java index 10bb67676..3b30bb55e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/api/CreditBureauConfigurationAPI.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/api/CreditBureauConfigurationAPI.java @@ -60,9 +60,9 @@ import org.springframework.stereotype.Component; @Tag(name = "Credit Bureau Configuration", description = "") public class CreditBureauConfigurationAPI { - private final Set responseDataParameters = new HashSet<>( + private static final Set RESPONSE_DATA_PARAMETERS = new HashSet<>( Arrays.asList("creditBureauId", "alias", "country", "creditBureauProductId", "startDate", "endDate", "isActive")); - private final String resourceNameForPermissions = "CreditBureau"; + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "CreditBureau"; private final PlatformSecurityContext context; private final CreditBureauReadPlatformService readPlatformService; private final DefaultToApiJsonSerializer toApiJsonSerializer; @@ -105,12 +105,12 @@ public class CreditBureauConfigurationAPI { @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) public String getCreditBureau(@Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final Collection creditBureau = this.readPlatformService.retrieveCreditBureau(); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, creditBureau, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, creditBureau, RESPONSE_DATA_PARAMETERS); } @@ -119,14 +119,14 @@ public class CreditBureauConfigurationAPI { @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) public String getCreditBureauLoanProductMapping(@Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final Collection creditBureauLoanProductMapping = this.readPlatformServiceCreditBureauLoanProduct .readCreditBureauLoanProductMapping(); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); return this.toApiJsonSerializerCreditBureauLoanProduct.serialize(settings, creditBureauLoanProductMapping, - this.responseDataParameters); + RESPONSE_DATA_PARAMETERS); } @@ -135,13 +135,13 @@ public class CreditBureauConfigurationAPI { @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) public String getOrganisationCreditBureau(@Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final Collection organisationCreditBureau = this.readPlatformServiceOrganisationCreditBureau .retrieveOrgCreditBureau(); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializerOrganisationCreditBureau.serialize(settings, organisationCreditBureau, this.responseDataParameters); + return this.toApiJsonSerializerOrganisationCreditBureau.serialize(settings, organisationCreditBureau, RESPONSE_DATA_PARAMETERS); } @@ -152,7 +152,7 @@ public class CreditBureauConfigurationAPI { public String getConfiguration(@PathParam("organisationCreditBureauId") final Long organisationCreditBureauId, @Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final Collection configurationData = this.creditBureauConfiguration .readConfigurationByOrganisationCreditBureauId(organisationCreditBureauId); @@ -165,14 +165,14 @@ public class CreditBureauConfigurationAPI { @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) public String fetchLoanProducts(@Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final Collection creditBureauLoanProductMapping = this.readPlatformServiceCreditBureauLoanProduct .fetchLoanProducts(); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); return this.toApiJsonSerializerCreditBureauLoanProduct.serialize(settings, creditBureauLoanProductMapping, - this.responseDataParameters); + RESPONSE_DATA_PARAMETERS); } @GET @@ -180,14 +180,14 @@ public class CreditBureauConfigurationAPI { @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) public String fetchMappingByLoanProductId(@Context final UriInfo uriInfo, @PathParam("loanProductId") final Long loanProductId) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final CreditBureauLoanProductMappingData creditBureauLoanProductMapping = this.readPlatformServiceCreditBureauLoanProduct .readMappingByLoanId(loanProductId); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); return this.toApiJsonSerializerCreditBureauLoanProduct.serialize(settings, creditBureauLoanProductMapping, - this.responseDataParameters); + RESPONSE_DATA_PARAMETERS); } @PUT diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/serialization/CreditBureauCommandFromApiJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/serialization/CreditBureauCommandFromApiJsonDeserializer.java index cd1907db3..37ead7e6d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/serialization/CreditBureauCommandFromApiJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/serialization/CreditBureauCommandFromApiJsonDeserializer.java @@ -39,7 +39,10 @@ import org.springframework.stereotype.Component; @Component public class CreditBureauCommandFromApiJsonDeserializer { - private final Set supportedParameters = new HashSet<>(Arrays.asList("alias", "isActive", "creditBureauId")); + public static final String ALIAS = "alias"; + public static final String IS_ACTIVE = "isActive"; + public static final String CREDIT_BUREAU_ID = "creditBureauId"; + private static final Set SUPPORTED_PARAMETERS = new HashSet<>(Arrays.asList(ALIAS, IS_ACTIVE, CREDIT_BUREAU_ID)); private final FromJsonHelper fromApiJsonHelper; @@ -54,7 +57,7 @@ public class CreditBureauCommandFromApiJsonDeserializer { } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("CreditBureau"); @@ -63,13 +66,13 @@ public class CreditBureauCommandFromApiJsonDeserializer { baseDataValidator.reset().value(creditBureauId).notBlank().integerGreaterThanZero(); - final String alias = this.fromApiJsonHelper.extractStringNamed("alias", element); - baseDataValidator.reset().parameter("alias").value(alias).notNull().notBlank().notExceedingLengthOf(100); + final String alias = this.fromApiJsonHelper.extractStringNamed(ALIAS, element); + baseDataValidator.reset().parameter(ALIAS).value(alias).notNull().notBlank().notExceedingLengthOf(100); - final String is_activeParameter = "isActive"; + final String is_activeParameter = IS_ACTIVE; if (this.fromApiJsonHelper.parameterExists(is_activeParameter, element)) { - final boolean isActive = this.fromApiJsonHelper.extractBooleanNamed("isActive", element); - baseDataValidator.reset().parameter("isActive").value(isActive).notNull().notBlank().trueOrFalseRequired(isActive); + final boolean isActive = this.fromApiJsonHelper.extractBooleanNamed(IS_ACTIVE, element); + baseDataValidator.reset().parameter(IS_ACTIVE).value(isActive).notNull().notBlank().trueOrFalseRequired(isActive); } throwExceptionIfValidationWarningsExist(dataValidationErrors); @@ -81,23 +84,23 @@ public class CreditBureauCommandFromApiJsonDeserializer { } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("CreditBureau"); final JsonElement element = this.fromApiJsonHelper.parse(json); - final String creditBureauIdParameter = "creditBureauId"; + final String creditBureauIdParameter = CREDIT_BUREAU_ID; if (this.fromApiJsonHelper.parameterExists(creditBureauIdParameter, element)) { - final Long creditBureauId = this.fromApiJsonHelper.extractLongNamed("creditBureauId", element); - baseDataValidator.reset().parameter("creditBureauId").value(creditBureauId).notNull().notBlank().longGreaterThanZero(); + final Long creditBureauId = this.fromApiJsonHelper.extractLongNamed(CREDIT_BUREAU_ID, element); + baseDataValidator.reset().parameter(CREDIT_BUREAU_ID).value(creditBureauId).notNull().notBlank().longGreaterThanZero(); } - final String is_activeParameter = "isActive"; + final String is_activeParameter = IS_ACTIVE; if (this.fromApiJsonHelper.parameterExists(is_activeParameter, element)) { - final boolean isActive = this.fromApiJsonHelper.extractBooleanNamed("isActive", element); - baseDataValidator.reset().parameter("isActive").value(isActive).notNull().notBlank().trueOrFalseRequired(isActive); + final boolean isActive = this.fromApiJsonHelper.extractBooleanNamed(IS_ACTIVE, element); + baseDataValidator.reset().parameter(IS_ACTIVE).value(isActive).notNull().notBlank().trueOrFalseRequired(isActive); } throwExceptionIfValidationWarningsExist(dataValidationErrors); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/serialization/CreditBureauConfigurationCommandFromApiJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/serialization/CreditBureauConfigurationCommandFromApiJsonDeserializer.java index 715cc28e3..5f95c5952 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/serialization/CreditBureauConfigurationCommandFromApiJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/serialization/CreditBureauConfigurationCommandFromApiJsonDeserializer.java @@ -39,7 +39,10 @@ import org.springframework.stereotype.Component; @Component public final class CreditBureauConfigurationCommandFromApiJsonDeserializer { - private final Set supportedParameters = new HashSet<>(Arrays.asList("configkey", "value", "description")); + public static final String CONFIGKEY = "configkey"; + public static final String VALUE = "value"; + public static final String DESCRIPTION = "description"; + private static final Set SUPPORTED_PARAMETERS = new HashSet<>(Arrays.asList(CONFIGKEY, VALUE, DESCRIPTION)); private final FromJsonHelper fromApiJsonHelper; @Autowired @@ -53,7 +56,7 @@ public final class CreditBureauConfigurationCommandFromApiJsonDeserializer { } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors) @@ -63,16 +66,16 @@ public final class CreditBureauConfigurationCommandFromApiJsonDeserializer { baseDataValidator.reset().value(creditBureauId).notBlank().integerGreaterThanZero(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); - final String configkey = this.fromApiJsonHelper.extractStringNamed("configkey", element); - baseDataValidator.reset().parameter("configkey").value(configkey).notBlank().notExceedingLengthOf(100); + final String configkey = this.fromApiJsonHelper.extractStringNamed(CONFIGKEY, element); + baseDataValidator.reset().parameter(CONFIGKEY).value(configkey).notBlank().notExceedingLengthOf(100); - final String value = this.fromApiJsonHelper.extractStringNamed("value", element); - baseDataValidator.reset().parameter("value").value(value).notBlank().notExceedingLengthOf(100); + final String value = this.fromApiJsonHelper.extractStringNamed(VALUE, element); + baseDataValidator.reset().parameter(VALUE).value(value).notBlank().notExceedingLengthOf(100); - final String description = this.fromApiJsonHelper.extractStringNamed("description", element); - baseDataValidator.reset().parameter("description").value(description).notBlank().notExceedingLengthOf(100); + final String description = this.fromApiJsonHelper.extractStringNamed(DESCRIPTION, element); + baseDataValidator.reset().parameter(DESCRIPTION).value(description).notBlank().notExceedingLengthOf(100); throwExceptionIfValidationWarningsExist(dataValidationErrors); } @@ -83,21 +86,21 @@ public final class CreditBureauConfigurationCommandFromApiJsonDeserializer { } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("config"); final JsonElement element = this.fromApiJsonHelper.parse(json); - if (this.fromApiJsonHelper.parameterExists("value", element)) { - final String value = this.fromApiJsonHelper.extractStringNamed("value", element); - baseDataValidator.reset().parameter("value").value(value).notBlank().notExceedingLengthOf(100); + if (this.fromApiJsonHelper.parameterExists(VALUE, element)) { + final String value = this.fromApiJsonHelper.extractStringNamed(VALUE, element); + baseDataValidator.reset().parameter(VALUE).value(value).notBlank().notExceedingLengthOf(100); } - if (this.fromApiJsonHelper.parameterExists("description", element)) { - final String description = this.fromApiJsonHelper.extractStringNamed("description", element); - baseDataValidator.reset().parameter("description").value(description).notBlank().notExceedingLengthOf(100); + if (this.fromApiJsonHelper.parameterExists(DESCRIPTION, element)) { + final String description = this.fromApiJsonHelper.extractStringNamed(DESCRIPTION, element); + baseDataValidator.reset().parameter(DESCRIPTION).value(description).notBlank().notExceedingLengthOf(100); } throwExceptionIfValidationWarningsExist(dataValidationErrors); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/serialization/CreditBureauLoanProductCommandFromApiJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/serialization/CreditBureauLoanProductCommandFromApiJsonDeserializer.java index bd3176a20..f5d8acfd5 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/serialization/CreditBureauLoanProductCommandFromApiJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/serialization/CreditBureauLoanProductCommandFromApiJsonDeserializer.java @@ -39,8 +39,15 @@ import org.springframework.stereotype.Component; @Component public class CreditBureauLoanProductCommandFromApiJsonDeserializer { - private final Set supportedParameters = new HashSet<>(Arrays.asList("loanProductId", "isCreditcheckMandatory", - "skipCreditcheckInFailure", "stalePeriod", "isActive", "locale", "creditbureauLoanProductMappingId")); + public static final String LOAN_PRODUCT_ID = "loanProductId"; + public static final String IS_CREDITCHECK_MANDATORY = "isCreditcheckMandatory"; + public static final String SKIP_CREDITCHECK_IN_FAILURE = "skipCreditcheckInFailure"; + public static final String STALE_PERIOD = "stalePeriod"; + public static final String IS_ACTIVE = "isActive"; + public static final String LOCALE = "locale"; + public static final String CREDITBUREAU_LOAN_PRODUCT_MAPPING_ID = "creditbureauLoanProductMappingId"; + private static final Set SUPPORTED_PARAMETERS = new HashSet<>(Arrays.asList(LOAN_PRODUCT_ID, IS_CREDITCHECK_MANDATORY, + SKIP_CREDITCHECK_IN_FAILURE, STALE_PERIOD, IS_ACTIVE, LOCALE, CREDITBUREAU_LOAN_PRODUCT_MAPPING_ID)); private final FromJsonHelper fromApiJsonHelper; @@ -55,7 +62,7 @@ public class CreditBureauLoanProductCommandFromApiJsonDeserializer { } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors) @@ -65,45 +72,45 @@ public class CreditBureauLoanProductCommandFromApiJsonDeserializer { baseDataValidator.reset().value(cb_id).notBlank().integerGreaterThanZero(); - final long loanProductId = this.fromApiJsonHelper.extractLongNamed("loanProductId", element); - baseDataValidator.reset().parameter("loanProductId").value(loanProductId).notBlank().integerGreaterThanZero(); + final long loanProductId = this.fromApiJsonHelper.extractLongNamed(LOAN_PRODUCT_ID, element); + baseDataValidator.reset().parameter(LOAN_PRODUCT_ID).value(loanProductId).notBlank().integerGreaterThanZero(); - if (this.fromApiJsonHelper.extractBooleanNamed("isCreditcheckMandatory", element) != null) { - final boolean isCreditcheckMandatory = this.fromApiJsonHelper.extractBooleanNamed("isCreditcheckMandatory", element); - baseDataValidator.reset().parameter("isCreditcheckMandatory").value(isCreditcheckMandatory).notBlank() + if (this.fromApiJsonHelper.extractBooleanNamed(IS_CREDITCHECK_MANDATORY, element) != null) { + final boolean isCreditcheckMandatory = this.fromApiJsonHelper.extractBooleanNamed(IS_CREDITCHECK_MANDATORY, element); + baseDataValidator.reset().parameter(IS_CREDITCHECK_MANDATORY).value(isCreditcheckMandatory).notBlank() .trueOrFalseRequired(isCreditcheckMandatory); } else { - baseDataValidator.reset().parameter("isCreditcheckMandatory") - .value(this.fromApiJsonHelper.extractBooleanNamed("isCreditcheckMandatory", element)).notBlank() - .trueOrFalseRequired(this.fromApiJsonHelper.extractBooleanNamed("isCreditcheckMandatory", element)); + baseDataValidator.reset().parameter(IS_CREDITCHECK_MANDATORY) + .value(this.fromApiJsonHelper.extractBooleanNamed(IS_CREDITCHECK_MANDATORY, element)).notBlank() + .trueOrFalseRequired(this.fromApiJsonHelper.extractBooleanNamed(IS_CREDITCHECK_MANDATORY, element)); } - if (this.fromApiJsonHelper.extractBooleanNamed("skipCreditcheckInFailure", element) != null) { - final boolean skipCreditcheckInFailure = this.fromApiJsonHelper.extractBooleanNamed("skipCreditcheckInFailure", element); - baseDataValidator.reset().parameter("skipCreditcheckInFailure").value(skipCreditcheckInFailure).notBlank() + if (this.fromApiJsonHelper.extractBooleanNamed(SKIP_CREDITCHECK_IN_FAILURE, element) != null) { + final boolean skipCreditcheckInFailure = this.fromApiJsonHelper.extractBooleanNamed(SKIP_CREDITCHECK_IN_FAILURE, element); + baseDataValidator.reset().parameter(SKIP_CREDITCHECK_IN_FAILURE).value(skipCreditcheckInFailure).notBlank() .trueOrFalseRequired(skipCreditcheckInFailure); } else { - baseDataValidator.reset().parameter("skipCreditcheckInFailure") - .value(this.fromApiJsonHelper.extractBooleanNamed("skipCreditcheckInFailure", element)).notBlank() - .trueOrFalseRequired(this.fromApiJsonHelper.extractBooleanNamed("skipCreditcheckInFailure", element)); + baseDataValidator.reset().parameter(SKIP_CREDITCHECK_IN_FAILURE) + .value(this.fromApiJsonHelper.extractBooleanNamed(SKIP_CREDITCHECK_IN_FAILURE, element)).notBlank() + .trueOrFalseRequired(this.fromApiJsonHelper.extractBooleanNamed(SKIP_CREDITCHECK_IN_FAILURE, element)); } - if (this.fromApiJsonHelper.extractLongNamed("stalePeriod", element) != null) { - final long stalePeriod = this.fromApiJsonHelper.extractLongNamed("stalePeriod", element); - baseDataValidator.reset().parameter("stalePeriod").value(stalePeriod).notBlank().integerGreaterThanZero(); + if (this.fromApiJsonHelper.extractLongNamed(STALE_PERIOD, element) != null) { + final long stalePeriod = this.fromApiJsonHelper.extractLongNamed(STALE_PERIOD, element); + baseDataValidator.reset().parameter(STALE_PERIOD).value(stalePeriod).notBlank().integerGreaterThanZero(); } else { - baseDataValidator.reset().parameter("stalePeriod").value(this.fromApiJsonHelper.extractLongNamed("stalePeriod", element)) + baseDataValidator.reset().parameter(STALE_PERIOD).value(this.fromApiJsonHelper.extractLongNamed(STALE_PERIOD, element)) .notBlank().integerGreaterThanZero(); } - if (this.fromApiJsonHelper.extractBooleanNamed("isActive", element) != null) { - Boolean isActive = this.fromApiJsonHelper.extractBooleanNamed("isActive", element); + if (this.fromApiJsonHelper.extractBooleanNamed(IS_ACTIVE, element) != null) { + Boolean isActive = this.fromApiJsonHelper.extractBooleanNamed(IS_ACTIVE, element); if (isActive == null) { isActive = false; } else { - baseDataValidator.reset().parameter("isActive").value(isActive).notBlank().trueOrFalseRequired(isActive); + baseDataValidator.reset().parameter(IS_ACTIVE).value(isActive).notBlank().trueOrFalseRequired(isActive); } } @@ -117,7 +124,7 @@ public class CreditBureauLoanProductCommandFromApiJsonDeserializer { } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors) @@ -125,18 +132,18 @@ public class CreditBureauLoanProductCommandFromApiJsonDeserializer { final JsonElement element = this.fromApiJsonHelper.parse(json); - final String creditbureauLoanProductMappingIdParameter = "creditbureauLoanProductMappingId"; + final String creditbureauLoanProductMappingIdParameter = CREDITBUREAU_LOAN_PRODUCT_MAPPING_ID; if (this.fromApiJsonHelper.parameterExists(creditbureauLoanProductMappingIdParameter, element)) { - final Long creditbureauLoanProductMappingId = this.fromApiJsonHelper.extractLongNamed("creditbureauLoanProductMappingId", + final Long creditbureauLoanProductMappingId = this.fromApiJsonHelper.extractLongNamed(CREDITBUREAU_LOAN_PRODUCT_MAPPING_ID, element); - baseDataValidator.reset().parameter("creditbureauLoanProductMappingId").value(creditbureauLoanProductMappingId).notNull() + baseDataValidator.reset().parameter(CREDITBUREAU_LOAN_PRODUCT_MAPPING_ID).value(creditbureauLoanProductMappingId).notNull() .notBlank().longGreaterThanZero(); } - final String is_activeParameter = "isActive"; + final String is_activeParameter = IS_ACTIVE; if (this.fromApiJsonHelper.parameterExists(is_activeParameter, element)) { - final boolean isActive = this.fromApiJsonHelper.extractBooleanNamed("isActive", element); - baseDataValidator.reset().parameter("isActive").value(isActive).notNull().notBlank().trueOrFalseRequired(isActive); + final boolean isActive = this.fromApiJsonHelper.extractBooleanNamed(IS_ACTIVE, element); + baseDataValidator.reset().parameter(IS_ACTIVE).value(isActive).notNull().notBlank().trueOrFalseRequired(isActive); } throwExceptionIfValidationWarningsExist(dataValidationErrors); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/serialization/CreditBureauTokenCommandFromApiJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/serialization/CreditBureauTokenCommandFromApiJsonDeserializer.java index b07de91d7..52c8e2d73 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/serialization/CreditBureauTokenCommandFromApiJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/serialization/CreditBureauTokenCommandFromApiJsonDeserializer.java @@ -34,21 +34,25 @@ import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder; import org.apache.fineract.infrastructure.core.exception.InvalidJsonException; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class CreditBureauTokenCommandFromApiJsonDeserializer { - private static final Logger LOG = LoggerFactory.getLogger(CreditBureauTokenCommandFromApiJsonDeserializer.class); - - private final Set supportedParameters = new HashSet<>( - Arrays.asList("access_token", "token_type", "expires_in", "userName", ".issued", ".expires")); - - private final Set supportedTokenConfigParameters = new HashSet<>( - Arrays.asList("userName", "password", "subscriptionId", "subscriptionKey")); + public static final String ACCESS_TOKEN = "access_token"; + public static final String TOKEN_TYPE = "token_type"; + public static final String EXPIRES_IN = "expires_in"; + public static final String USER_NAME = "userName"; + public static final String ISSUED = ".issued"; + public static final String EXPIRES = ".expires"; + public static final String PASSWORD = "password"; + public static final String SUBSCRIPTION_ID = "subscriptionId"; + public static final String SUBSCRIPTION_KEY = "subscriptionKey"; + private static final Set SUPPORTED_PARAMETERS = new HashSet<>( + Arrays.asList(ACCESS_TOKEN, TOKEN_TYPE, EXPIRES_IN, USER_NAME, ISSUED, EXPIRES)); + private static final Set SUPPORTED_TOKEN_CONFIG_PARAMETERS = new HashSet<>( + Arrays.asList(USER_NAME, PASSWORD, SUBSCRIPTION_ID, SUBSCRIPTION_KEY)); private final FromJsonHelper fromApiJsonHelper; @Autowired @@ -61,31 +65,33 @@ public class CreditBureauTokenCommandFromApiJsonDeserializer { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("tokens"); final JsonElement element = this.fromApiJsonHelper.parse(json); - final String access_token = this.fromApiJsonHelper.extractStringNamed("access_token", element); - baseDataValidator.reset().parameter("access_token").value(access_token).notBlank().notExceedingLengthOf(1000); + final String access_token = this.fromApiJsonHelper.extractStringNamed(ACCESS_TOKEN, element); + baseDataValidator.reset().parameter(ACCESS_TOKEN).value(access_token).notBlank().notExceedingLengthOf(1000); - final String token_type = this.fromApiJsonHelper.extractStringNamed("token_type", element); - baseDataValidator.reset().parameter("token_type").value(token_type).notBlank().notExceedingLengthOf(100); + final String token_type = this.fromApiJsonHelper.extractStringNamed(TOKEN_TYPE, element); + baseDataValidator.reset().parameter(TOKEN_TYPE).value(token_type).notBlank().notExceedingLengthOf(100); - final String expires_in = this.fromApiJsonHelper.extractStringNamed("expires_in", element); - baseDataValidator.reset().parameter("expires_in").value(expires_in).notBlank().notExceedingLengthOf(100); + final String expires_in = this.fromApiJsonHelper.extractStringNamed(EXPIRES_IN, element); + baseDataValidator.reset().parameter(EXPIRES_IN).value(expires_in).notBlank().notExceedingLengthOf(100); - final String userName = this.fromApiJsonHelper.extractStringNamed("userName", element); - baseDataValidator.reset().parameter("userName").value(userName).notBlank().notExceedingLengthOf(100); + final String userName = this.fromApiJsonHelper.extractStringNamed(USER_NAME, element); + baseDataValidator.reset().parameter(USER_NAME).value(userName).notBlank().notExceedingLengthOf(100); - final String issued = this.fromApiJsonHelper.extractStringNamed(".issued", element); - baseDataValidator.reset().parameter(".issued").value(issued).notBlank().notExceedingLengthOf(100); + final String issued = this.fromApiJsonHelper.extractStringNamed(ISSUED, element); + baseDataValidator.reset().parameter(ISSUED).value(issued).notBlank().notExceedingLengthOf(100); - final String expires = this.fromApiJsonHelper.extractStringNamed(".expires", element); - baseDataValidator.reset().parameter(".expires").value(expires).notBlank().notExceedingLengthOf(100); + final String expires = this.fromApiJsonHelper.extractStringNamed(EXPIRES, element); + baseDataValidator.reset().parameter(EXPIRES).value(expires).notBlank().notExceedingLengthOf(100); throwExceptionIfValidationWarningsExist(dataValidationErrors); } @@ -95,25 +101,27 @@ public class CreditBureauTokenCommandFromApiJsonDeserializer { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedTokenConfigParameters); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_TOKEN_CONFIG_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("configdata"); final JsonElement element = this.fromApiJsonHelper.parse(json); - final String userName = this.fromApiJsonHelper.extractStringNamed("userName", element); - baseDataValidator.reset().parameter("userName").value(userName).notBlank().notExceedingLengthOf(1000); + final String userName = this.fromApiJsonHelper.extractStringNamed(USER_NAME, element); + baseDataValidator.reset().parameter(USER_NAME).value(userName).notBlank().notExceedingLengthOf(1000); - final String password = this.fromApiJsonHelper.extractStringNamed("password", element); - baseDataValidator.reset().parameter("password").value(password).notBlank().notExceedingLengthOf(100); + final String password = this.fromApiJsonHelper.extractStringNamed(PASSWORD, element); + baseDataValidator.reset().parameter(PASSWORD).value(password).notBlank().notExceedingLengthOf(100); - final String subscriptionId = this.fromApiJsonHelper.extractStringNamed("subscriptionId", element); - baseDataValidator.reset().parameter("subscriptionId").value(subscriptionId).notBlank().notExceedingLengthOf(100); + final String subscriptionId = this.fromApiJsonHelper.extractStringNamed(SUBSCRIPTION_ID, element); + baseDataValidator.reset().parameter(SUBSCRIPTION_ID).value(subscriptionId).notBlank().notExceedingLengthOf(100); - final String subscriptionKey = this.fromApiJsonHelper.extractStringNamed("subscriptionKey", element); - baseDataValidator.reset().parameter("subscriptionKey").value(subscriptionKey).notBlank().notExceedingLengthOf(100); + final String subscriptionKey = this.fromApiJsonHelper.extractStringNamed(SUBSCRIPTION_KEY, element); + baseDataValidator.reset().parameter(SUBSCRIPTION_KEY).value(subscriptionKey).notBlank().notExceedingLengthOf(100); throwExceptionIfValidationWarningsExist(dataValidationErrors); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/service/CreditReportWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/service/CreditReportWritePlatformServiceImpl.java index 11d552384..5d9566626 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/service/CreditReportWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/service/CreditReportWritePlatformServiceImpl.java @@ -34,17 +34,12 @@ import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuild import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; -import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; import org.apache.fineract.infrastructure.creditbureau.data.CreditBureauConfigurations; import org.apache.fineract.infrastructure.creditbureau.data.CreditBureauReportData; import org.apache.fineract.infrastructure.creditbureau.domain.CreditBureau; -import org.apache.fineract.infrastructure.creditbureau.domain.CreditBureauConfigurationRepositoryWrapper; -import org.apache.fineract.infrastructure.creditbureau.domain.CreditBureauLoanProductMappingRepository; import org.apache.fineract.infrastructure.creditbureau.domain.CreditBureauRepository; import org.apache.fineract.infrastructure.creditbureau.domain.CreditReport; import org.apache.fineract.infrastructure.creditbureau.domain.CreditReportRepository; -import org.apache.fineract.infrastructure.creditbureau.domain.TokenRepositoryWrapper; -import org.apache.fineract.infrastructure.creditbureau.serialization.CreditBureauTokenCommandFromApiJsonDeserializer; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.glassfish.jersey.media.multipart.FormDataContentDisposition; import org.springframework.beans.factory.annotation.Autowired; @@ -56,36 +51,29 @@ import org.springframework.transaction.annotation.Transactional; @Service public class CreditReportWritePlatformServiceImpl implements CreditReportWritePlatformService { + public static final String CREDIT_BUREAU_INTEGRATION = "creditBureauIntegration"; + public static final String CREDIT_BUREAU_HAS_NOT_BEEN_INTEGRATED = "creditBureau.has.not.been.Integrated"; private final PlatformSecurityContext context; - private final CreditBureauConfigurationRepositoryWrapper configDataRepository; + private final CreditBureauRepository creditBureauRepository; private final CreditReportRepository creditReportRepository; private final ThitsaWorksCreditBureauIntegrationWritePlatformService thitsaWorksCreditBureauIntegrationWritePlatformService; - private final ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl thitsaWorksCreditBureauIntegrationWritePlatformServiceImpl; - private final List dataValidationErrors = new ArrayList<>(); - private final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors) - .resource("creditBureauIntegration"); @Autowired - public CreditReportWritePlatformServiceImpl(final PlatformSecurityContext context, final FromJsonHelper fromApiJsonHelper, - final TokenRepositoryWrapper tokenRepository, final CreditBureauConfigurationRepositoryWrapper configDataRepository, - final CreditBureauTokenCommandFromApiJsonDeserializer fromApiJsonDeserializer, - final CreditBureauLoanProductMappingRepository loanProductMappingRepository, - final CreditBureauRepository creditBureauRepository, final CreditReportRepository creditReportRepository, - final ThitsaWorksCreditBureauIntegrationWritePlatformService thitsaWorksCreditBureauIntegrationWritePlatformService, - final ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl thitsaWorksCreditBureauIntegrationWritePlatformServiceImpl) { + public CreditReportWritePlatformServiceImpl(final PlatformSecurityContext context, final CreditBureauRepository creditBureauRepository, + final CreditReportRepository creditReportRepository, + final ThitsaWorksCreditBureauIntegrationWritePlatformService thitsaWorksCreditBureauIntegrationWritePlatformService) { this.context = context; - this.configDataRepository = configDataRepository; this.creditBureauRepository = creditBureauRepository; this.creditReportRepository = creditReportRepository; this.thitsaWorksCreditBureauIntegrationWritePlatformService = thitsaWorksCreditBureauIntegrationWritePlatformService; - this.thitsaWorksCreditBureauIntegrationWritePlatformServiceImpl = thitsaWorksCreditBureauIntegrationWritePlatformServiceImpl; } @Override @Transactional public CommandProcessingResult getCreditReport(JsonCommand command) { - + List dataValidationErrors = new ArrayList<>(); + DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(CREDIT_BUREAU_INTEGRATION); try { Long creditBureauID = command.longValueOfParameterNamed("creditBureauID"); @@ -103,16 +91,16 @@ public class CreditReportWritePlatformServiceImpl implements CreditReportWritePl return new CommandProcessingResultBuilder().withCreditReport(reportMap).build(); } - baseDataValidator.reset().failWithCode("creditBureau.has.not.been.Integrated"); - throw new PlatformApiDataValidationException("creditBureau.has.not.been.Integrated", "creditBureau.has.not.been.Integrated", + baseDataValidator.reset().failWithCode(CREDIT_BUREAU_HAS_NOT_BEEN_INTEGRATED); + throw new PlatformApiDataValidationException(CREDIT_BUREAU_HAS_NOT_BEEN_INTEGRATED, CREDIT_BUREAU_HAS_NOT_BEEN_INTEGRATED, dataValidationErrors); } catch (final JpaSystemException | DataIntegrityViolationException dve) { - handleTokenDataIntegrityIssues(command, dve.getMostSpecificCause(), dve); + handleTokenDataIntegrityIssues(dve.getMostSpecificCause()); return CommandProcessingResult.empty(); } catch (final PersistenceException ee) { Throwable throwable = ExceptionUtils.getRootCause(ee.getCause()); - handleTokenDataIntegrityIssues(command, throwable, ee); + handleTokenDataIntegrityIssues(throwable); return CommandProcessingResult.empty(); } @@ -121,7 +109,8 @@ public class CreditReportWritePlatformServiceImpl implements CreditReportWritePl @Override @Transactional public String addCreditReport(Long bureauId, File creditReport, FormDataContentDisposition fileDetail) { - + List dataValidationErrors = new ArrayList<>(); + DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(CREDIT_BUREAU_INTEGRATION); String creditBureauName = getCreditBureauName(bureauId); String responseMessage = null; @@ -130,8 +119,8 @@ public class CreditReportWritePlatformServiceImpl implements CreditReportWritePl fileDetail); } else { - baseDataValidator.reset().failWithCode("creditBureau.has.not.been.Integrated"); - throw new PlatformApiDataValidationException("creditBureau.has.not.been.Integrated", "creditBureau.has.not.been.Integrated", + baseDataValidator.reset().failWithCode(CREDIT_BUREAU_HAS_NOT_BEEN_INTEGRATED); + throw new PlatformApiDataValidationException(CREDIT_BUREAU_HAS_NOT_BEEN_INTEGRATED, CREDIT_BUREAU_HAS_NOT_BEEN_INTEGRATED, dataValidationErrors); } @@ -141,7 +130,8 @@ public class CreditReportWritePlatformServiceImpl implements CreditReportWritePl } private String getCreditBureauName(Long creditBureauID) { - + List dataValidationErrors = new ArrayList<>(); + DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(CREDIT_BUREAU_INTEGRATION); if (creditBureauID != null) { Optional creditBureau = this.creditBureauRepository.findById(creditBureauID); @@ -150,8 +140,8 @@ public class CreditReportWritePlatformServiceImpl implements CreditReportWritePl } } - baseDataValidator.reset().failWithCode("creditBureau.has.not.been.Integrated"); - throw new PlatformApiDataValidationException("creditBureau.has.not.been.Integrated", "creditBureau.has.not.been.Integrated", + baseDataValidator.reset().failWithCode(CREDIT_BUREAU_HAS_NOT_BEEN_INTEGRATED); + throw new PlatformApiDataValidationException(CREDIT_BUREAU_HAS_NOT_BEEN_INTEGRATED, CREDIT_BUREAU_HAS_NOT_BEEN_INTEGRATED, dataValidationErrors); } @@ -186,11 +176,11 @@ public class CreditReportWritePlatformServiceImpl implements CreditReportWritePl return new CommandProcessingResultBuilder().withEntityId(creditReport.getId()).build(); } catch (final JpaSystemException | DataIntegrityViolationException dve) { - handleTokenDataIntegrityIssues(command, dve.getMostSpecificCause(), dve); + handleTokenDataIntegrityIssues(dve.getMostSpecificCause()); return CommandProcessingResult.empty(); } catch (final PersistenceException ee) { Throwable throwable = ExceptionUtils.getRootCause(ee.getCause()); - handleTokenDataIntegrityIssues(command, throwable, ee); + handleTokenDataIntegrityIssues(throwable); return CommandProcessingResult.empty(); } } @@ -219,7 +209,7 @@ public class CreditReportWritePlatformServiceImpl implements CreditReportWritePl return new CommandProcessingResultBuilder().withEntityId(creditReport.getId()).build(); } - private void handleTokenDataIntegrityIssues(final JsonCommand command, final Throwable realCause, final Exception dve) { + private void handleTokenDataIntegrityIssues(final Throwable realCause) { throw new PlatformDataIntegrityException("error.msg.cund.unknown.data.integrity.issue", "Unknown data integrity issue with resource: " + realCause.getMessage()); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/service/ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/service/ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl.java index f4ff81dcc..1e1fd69a6 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/service/ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/service/ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl.java @@ -49,10 +49,8 @@ import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.creditbureau.data.CreditBureauConfigurations; import org.apache.fineract.infrastructure.creditbureau.data.CreditBureauReportData; import org.apache.fineract.infrastructure.creditbureau.domain.CreditBureauConfiguration; -import org.apache.fineract.infrastructure.creditbureau.domain.CreditBureauConfigurationRepository; import org.apache.fineract.infrastructure.creditbureau.domain.CreditBureauConfigurationRepositoryWrapper; import org.apache.fineract.infrastructure.creditbureau.domain.CreditBureauToken; -import org.apache.fineract.infrastructure.creditbureau.domain.CreditReportRepository; import org.apache.fineract.infrastructure.creditbureau.domain.TokenRepositoryWrapper; import org.apache.fineract.infrastructure.creditbureau.serialization.CreditBureauTokenCommandFromApiJsonDeserializer; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; @@ -68,22 +66,18 @@ import org.springframework.transaction.annotation.Transactional; @Service public class ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl implements ThitsaWorksCreditBureauIntegrationWritePlatformService { + private static final Logger LOG = LoggerFactory.getLogger(ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl.class); private final PlatformSecurityContext context; private final FromJsonHelper fromApiJsonHelper; private final TokenRepositoryWrapper tokenRepositoryWrapper; private final CreditBureauConfigurationRepositoryWrapper configDataRepository; private final CreditBureauTokenCommandFromApiJsonDeserializer fromApiJsonDeserializer; - private final List dataValidationErrors = new ArrayList<>(); - private final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors) - .resource("ThitsaWorksCreditBureauIntegration"); @Autowired public ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl(final PlatformSecurityContext context, final FromJsonHelper fromApiJsonHelper, final TokenRepositoryWrapper tokenRepositoryWrapper, final CreditBureauConfigurationRepositoryWrapper configDataRepository, - final CreditBureauConfigurationRepository configurationDataRepository, - final CreditBureauTokenCommandFromApiJsonDeserializer fromApiJsonDeserializer, - final CreditReportRepository creditReportRepository) { + final CreditBureauTokenCommandFromApiJsonDeserializer fromApiJsonDeserializer) { this.context = context; this.tokenRepositoryWrapper = tokenRepositoryWrapper; this.configDataRepository = configDataRepository; @@ -91,8 +85,6 @@ public class ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl implemen this.fromApiJsonDeserializer = fromApiJsonDeserializer; } - private static final Logger LOG = LoggerFactory.getLogger(ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl.class); - @Transactional @Override @SuppressWarnings("deprecation") @@ -171,8 +163,8 @@ public class ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl implemen if (process.equals("UploadCreditReport")) { // to show the Response on frontEnd JsonObject reportObject = JsonParser.parseString(reponseMessage).getAsJsonObject(); - String ResponseMessageJson = reportObject.get("ResponseMessage").getAsString(); - this.handleAPIIntegrityIssues(ResponseMessageJson); + String responseMessageJson = reportObject.get("ResponseMessage").getAsString(); + this.handleAPIIntegrityIssues(responseMessageJson); } return reponseMessage; @@ -249,7 +241,7 @@ public class ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl implemen JsonElement element = reportObject.get("Data"); if (!(element instanceof JsonNull)) { // NOTE : "element instanceof JsonNull" is for handling empty values (and - // assigning null) while fetching data from results + // assigning null) while fetching data from results jsonData = (JsonObject) element; } @@ -265,9 +257,9 @@ public class ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl implemen borrowerInfo = gson.toJson(borrowerInfos); } - String Name = borrowerInfos.get("Name").toString(); - String Gender = borrowerInfos.get("Gender").toString(); - String Address = borrowerInfos.get("Address").toString(); + String name = borrowerInfos.get("Name").toString(); + String gender = borrowerInfos.get("Gender").toString(); + String address = borrowerInfos.get("Address").toString(); String creditScore = "CreditScore"; creditScore = getJsonObjectToString(creditScore, element, jsonData); @@ -288,7 +280,7 @@ public class ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl implemen writeoffLoanStringArray = convertArrayintoStringArray(writeOffLoansArray); } - return CreditBureauReportData.instance(Name, Gender, Address, creditScore, borrowerInfo, activeLoanStringArray, + return CreditBureauReportData.instance(name, gender, address, creditScore, borrowerInfo, activeLoanStringArray, writeoffLoanStringArray); } @@ -311,10 +303,8 @@ public class ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl implemen String process = "UploadCreditReport"; - String responseMessage = this.okHttpConnectionMethod(userName, password, subscriptionKey, subscriptionId, url, token, creditReport, - fileDetail, 0L, null, process); - - return responseMessage; + return this.okHttpConnectionMethod(userName, password, subscriptionKey, subscriptionId, url, token, creditReport, fileDetail, 0L, + null, process); } private String[] convertArrayintoStringArray(JsonArray jsonResult) { @@ -338,8 +328,8 @@ public class ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl implemen JsonElement element = reportObject.get("Data"); if (element.isJsonNull()) { - String ResponseMessage = reportObject.get("ResponseMessage").getAsString(); - handleAPIIntegrityIssues(ResponseMessage); + String responseMessage = reportObject.get("ResponseMessage").getAsString(); + handleAPIIntegrityIssues(responseMessage); } // to fetch the Unique ID from Result @@ -354,16 +344,16 @@ public class ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl implemen JsonObject jobject = dataArray.get(0).getAsJsonObject(); String uniqueIdString = jobject.get("UniqueID").toString(); - String TrimUniqueId = uniqueIdString.substring(1, uniqueIdString.length() - 1); + String trimUniqueId = uniqueIdString.substring(1, uniqueIdString.length() - 1); - uniqueID = Long.parseLong(TrimUniqueId); + uniqueID = Long.parseLong(trimUniqueId); } else if (dataArray.size() == 0) { - String ResponseMessage = reportObject.get("ResponseMessage").getAsString(); - handleAPIIntegrityIssues(ResponseMessage); + String responseMessage = reportObject.get("ResponseMessage").getAsString(); + handleAPIIntegrityIssues(responseMessage); } else { - String nrc = null; - List arrlist = new ArrayList(); + String nrc; + List arrlist = new ArrayList<>(); for (int i = 0; i < dataArray.size(); ++i) { JsonObject data = dataArray.get(i).getAsJsonObject(); @@ -377,8 +367,8 @@ public class ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl implemen } } catch (IndexOutOfBoundsException e) { - String ResponseMessage = jsonObject.get("ResponseMessage").getAsString(); - handleAPIIntegrityIssues(ResponseMessage); + String responseMessage = jsonObject.get("ResponseMessage").getAsString(); + handleAPIIntegrityIssues(responseMessage); } return uniqueID; } @@ -471,7 +461,9 @@ public class ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl implemen } public String getCreditBureauConfiguration(Integer creditBureauId, String configurationParameterName) { - + List dataValidationErrors = new ArrayList<>(); + DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors) + .resource("ThitsaWorksCreditBureauIntegration"); String creditBureauConfigurationValue = null; try { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/ReportsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/ReportsApiResource.java index b4df23c79..0cd513644 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/ReportsApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/ReportsApiResource.java @@ -63,10 +63,10 @@ import org.springframework.stereotype.Component; @Tag(name = "Reports", description = "Non-core reports can be added, updated and deleted.") public class ReportsApiResource { - private final Set responseDataParameters = new HashSet<>(Arrays.asList("id", "reportName", "reportType", "reportSubType", - "reportCategory", "description", "reportSql", "coreReport", "useReport", "reportParameters")); + private static final Set RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id", "reportName", "reportType", + "reportSubType", "reportCategory", "description", "reportSql", "coreReport", "useReport", "reportParameters")); - private final String resourceNameForPermissions = "REPORT"; + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "REPORT"; private final PlatformSecurityContext context; private final ToApiJsonSerializer toApiJsonSerializer; private final ReadReportingService readReportingService; @@ -95,12 +95,12 @@ public class ReportsApiResource { @ApiResponse(responseCode = "200", description = "OK", content = @Content(array = @ArraySchema(schema = @Schema(implementation = ReportsApiResourceSwagger.GetReportsResponse.class)))) public String retrieveReportList(@Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final Collection result = this.readReportingService.retrieveReportList(); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, result, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, result, RESPONSE_DATA_PARAMETERS); } @GET @@ -113,7 +113,7 @@ public class ReportsApiResource { @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = ReportsApiResourceSwagger.GetReportsResponse.class))) }) public String retrieveReport(@PathParam("id") @Parameter(description = "id") final Long id, @Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final ReportData result = this.readReportingService.retrieveReport(id); @@ -123,7 +123,7 @@ public class ReportsApiResource { result.appendedTemplate(this.readReportingService.getAllowedParameters(), this.reportingProcessServiceProvider.findAllReportingTypes()); } - return this.toApiJsonSerializer.serialize(settings, result, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, result, RESPONSE_DATA_PARAMETERS); } @GET @@ -136,14 +136,14 @@ public class ReportsApiResource { @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = ReportsApiResourceSwagger.GetReportsTemplateResponse.class))) }) public String retrieveOfficeTemplate(@Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final ReportData result = new ReportData(); result.appendedTemplate(this.readReportingService.getAllowedParameters(), this.reportingProcessServiceProvider.findAllReportingTypes()); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, result, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, result, RESPONSE_DATA_PARAMETERS); } @POST diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/DataTableValidator.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/DataTableValidator.java index 6d17f43dd..c6e9b8213 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/DataTableValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/DataTableValidator.java @@ -39,7 +39,7 @@ import org.springframework.stereotype.Component; public class DataTableValidator { private final FromJsonHelper fromApiJsonHelper; - private final Set registerParams = new HashSet<>( + private static final Set SUPPORTED_PARAMETERS = new HashSet<>( Arrays.asList(DataTableApiConstant.categoryParamName, DataTableApiConstant.localParamName)); @Autowired @@ -50,7 +50,7 @@ public class DataTableValidator { public void validateDataTableRegistration(final String json) { final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, registerParams); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors) diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/serialization/ReportCommandFromApiJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/serialization/ReportCommandFromApiJsonDeserializer.java index 4017903cc..c9fdf00f0 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/serialization/ReportCommandFromApiJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/serialization/ReportCommandFromApiJsonDeserializer.java @@ -36,7 +36,7 @@ public final class ReportCommandFromApiJsonDeserializer { /** * The parameters supported for this command. */ - private final Set supportedParameters = new HashSet<>(Arrays.asList("reportName", "reportType", "reportSubType", + private static final Set SUPPORTED_PARAMETERS = new HashSet<>(Arrays.asList("reportName", "reportType", "reportSubType", "reportCategory", "description", "reportSql", "useReport", "reportParameters")); private final FromJsonHelper fromApiJsonHelper; @@ -53,6 +53,6 @@ public final class ReportCommandFromApiJsonDeserializer { final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/EntityDatatableChecksDataValidator.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/EntityDatatableChecksDataValidator.java index 1151342cb..7802fde24 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/EntityDatatableChecksDataValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/EntityDatatableChecksDataValidator.java @@ -40,12 +40,17 @@ import org.springframework.stereotype.Component; @Component public final class EntityDatatableChecksDataValidator { + public static final String ENTITY = "entity"; + public static final String DATATABLE_NAME = "datatableName"; + public static final String STATUS = "status"; + public static final String SYSTEM_DEFINED = "systemDefined"; + public static final String PRODUCT_ID = "productId"; + public static final String ENTITY_DATATABLE_CHECKS = "entityDatatableChecks"; /** * The parameters supported for this command. */ - private final Set supportedParameters = new HashSet<>( - Arrays.asList("entity", "datatableName", "status", "systemDefined", "productId")); - + private static final Set SUPPORTED_PARAMETERS = new HashSet<>( + Arrays.asList(ENTITY, DATATABLE_NAME, STATUS, SYSTEM_DEFINED, PRODUCT_ID)); private final FromJsonHelper fromApiJsonHelper; @Autowired @@ -58,33 +63,35 @@ public final class EntityDatatableChecksDataValidator { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("entityDatatableChecks"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(ENTITY_DATATABLE_CHECKS); final JsonElement element = this.fromApiJsonHelper.parse(json); - final String entity = this.fromApiJsonHelper.extractStringNamed("entity", element); - baseDataValidator.reset().parameter("entity").value(entity).notBlank().isOneOfTheseStringValues(EntityTables.getEntitiesList()); + final String entity = this.fromApiJsonHelper.extractStringNamed(ENTITY, element); + baseDataValidator.reset().parameter(ENTITY).value(entity).notBlank().isOneOfTheseStringValues(EntityTables.getEntitiesList()); - final Integer status = this.fromApiJsonHelper.extractIntegerSansLocaleNamed("status", element); + final Integer status = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(STATUS, element); final Object[] entityTablesStatuses = EntityTables.getStatus(entity).toArray(); - baseDataValidator.reset().parameter("status").value(status).isOneOfTheseValues(entityTablesStatuses); + baseDataValidator.reset().parameter(STATUS).value(status).isOneOfTheseValues(entityTablesStatuses); - final String datatableName = this.fromApiJsonHelper.extractStringNamed("datatableName", element); - baseDataValidator.reset().parameter("datatableName").value(datatableName).notBlank(); + final String datatableName = this.fromApiJsonHelper.extractStringNamed(DATATABLE_NAME, element); + baseDataValidator.reset().parameter(DATATABLE_NAME).value(datatableName).notBlank(); - if (this.fromApiJsonHelper.parameterExists("systemDefined", element)) { - final String systemDefined = this.fromApiJsonHelper.extractStringNamed("systemDefined", element); - baseDataValidator.reset().parameter("systemDefined").value(systemDefined).validateForBooleanValue(); + if (this.fromApiJsonHelper.parameterExists(SYSTEM_DEFINED, element)) { + final String systemDefined = this.fromApiJsonHelper.extractStringNamed(SYSTEM_DEFINED, element); + baseDataValidator.reset().parameter(SYSTEM_DEFINED).value(systemDefined).validateForBooleanValue(); } - if (this.fromApiJsonHelper.parameterExists("productId", element)) { - final long productId = this.fromApiJsonHelper.extractLongNamed("productId", element); - baseDataValidator.reset().parameter("productId").value(productId).integerZeroOrGreater(); + if (this.fromApiJsonHelper.parameterExists(PRODUCT_ID, element)) { + final long productId = this.fromApiJsonHelper.extractLongNamed(PRODUCT_ID, element); + baseDataValidator.reset().parameter(PRODUCT_ID).value(productId).integerZeroOrGreater(); } throwExceptionIfValidationWarningsExist(dataValidationErrors); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/DocumentManagementApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/DocumentManagementApiResource.java index 594adb44e..d1d941994 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/DocumentManagementApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/DocumentManagementApiResource.java @@ -71,10 +71,10 @@ import org.springframework.stereotype.Component; + "Groups: URL Pattern as groups") public class DocumentManagementApiResource { - private final Set responseDataParameters = new HashSet<>( + private static final Set RESPONSE_DATA_PARAMETERS = new HashSet<>( Arrays.asList("id", "parentEntityType", "parentEntityId", "name", "fileName", "size", "type", "description")); - private final String systemEntityType = "DOCUMENT"; + private static final String SYSTEM_ENTITY_TYPE = "DOCUMENT"; private final PlatformSecurityContext context; private final DocumentReadPlatformService documentReadPlatformService; @@ -107,12 +107,12 @@ public class DocumentManagementApiResource { @PathParam("entityType") @Parameter(description = "entityType") final String entityType, @PathParam("entityId") @Parameter(description = "entityId") final Long entityId) { - this.context.authenticatedUser().validateHasReadPermission(this.systemEntityType); + this.context.authenticatedUser().validateHasReadPermission(SYSTEM_ENTITY_TYPE); final Collection documentDatas = this.documentReadPlatformService.retrieveAllDocuments(entityType, entityId); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, documentDatas, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, documentDatas, RESPONSE_DATA_PARAMETERS); } @POST @@ -202,12 +202,12 @@ public class DocumentManagementApiResource { @PathParam("entityId") @Parameter(description = "entityId") final Long entityId, @PathParam("documentId") @Parameter(description = "documentId") final Long documentId, @Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.systemEntityType); + this.context.authenticatedUser().validateHasReadPermission(SYSTEM_ENTITY_TYPE); final DocumentData documentData = this.documentReadPlatformService.retrieveDocument(entityType, entityId, documentId); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, documentData, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, documentData, RESPONSE_DATA_PARAMETERS); } @GET @@ -221,7 +221,7 @@ public class DocumentManagementApiResource { @PathParam("entityId") @Parameter(description = "entityId") final Long entityId, @PathParam("documentId") @Parameter(description = "documentId") final Long documentId) { - this.context.authenticatedUser().validateHasReadPermission(this.systemEntityType); + this.context.authenticatedUser().validateHasReadPermission(SYSTEM_ENTITY_TYPE); final FileData fileData = this.documentReadPlatformService.retrieveFileData(entityType, entityId, documentId); return ContentResources.fileDataToResponse(fileData, "attachment"); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/HookProcessorProvider.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/HookProcessorProvider.java index f4702c9e4..891f07420 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/HookProcessorProvider.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/HookProcessorProvider.java @@ -23,21 +23,16 @@ import static org.apache.fineract.infrastructure.hooks.api.HookApiConstants.http import static org.apache.fineract.infrastructure.hooks.api.HookApiConstants.smsTemplateName; import static org.apache.fineract.infrastructure.hooks.api.HookApiConstants.webTemplateName; +import lombok.RequiredArgsConstructor; import org.apache.fineract.infrastructure.hooks.domain.Hook; -import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Service; @Service -public class HookProcessorProvider implements ApplicationContextAware { +@RequiredArgsConstructor +public class HookProcessorProvider { - private ApplicationContext applicationContext; - - @Override - public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException { - this.applicationContext = applicationContext; - } + private final ApplicationContext applicationContext; public HookProcessor getProcessor(final Hook hook) { HookProcessor processor; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/TwilioHookProcessor.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/TwilioHookProcessor.java index 384a385d8..30cfacc56 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/TwilioHookProcessor.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/TwilioHookProcessor.java @@ -20,8 +20,6 @@ package org.apache.fineract.infrastructure.hooks.processor; import static org.apache.fineract.infrastructure.hooks.api.HookApiConstants.apiKeyName; -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; import com.google.gson.JsonObject; @@ -80,11 +78,11 @@ public class TwilioHookProcessor implements HookProcessor { } if (apiKey != null && !apiKey.equals("")) { - JsonObject json = null; + JsonObject json; if (hook.getUgdTemplate() != null) { entityName = "sms"; actionName = "send"; - json = processUgdTemplate(payload, hook, context.getAuthTokenContext()); + json = processUgdTemplate(payload, hook); if (json == null) { return; } @@ -96,8 +94,7 @@ public class TwilioHookProcessor implements HookProcessor { } } - private JsonObject processUgdTemplate(final String payload, final Hook hook, final String authToken) - throws JsonParseException, JsonMappingException, IOException { + private JsonObject processUgdTemplate(final String payload, final Hook hook) throws IOException { JsonObject json = null; @SuppressWarnings("unchecked") final HashMap map = new ObjectMapper().readValue(payload, HashMap.class); @@ -107,7 +104,6 @@ public class TwilioHookProcessor implements HookProcessor { final Client client = this.clientRepositoryWrapper.findOneWithNotFoundDetection(clientId); final String mobileNo = client.mobileNo(); if (mobileNo != null && !mobileNo.isEmpty()) { - this.templateMergeService.setAuthToken(authToken); final String compiledMessage = this.templateMergeService.compile(hook.getUgdTemplate(), map).replace("

", "") .replace("

", ""); final Map jsonMap = new HashMap<>(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/JobRegisterServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/JobRegisterServiceImpl.java index 5209e5300..dadd2a81a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/JobRegisterServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/JobRegisterServiceImpl.java @@ -45,6 +45,7 @@ import org.springframework.batch.core.Job; import org.springframework.batch.core.configuration.JobLocator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationListener; +import org.springframework.context.annotation.Lazy; import org.springframework.context.event.ContextClosedEvent; import org.springframework.scheduling.quartz.CronTriggerFactoryBean; import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean; @@ -68,10 +69,11 @@ public class JobRegisterServiceImpl implements JobRegisterService, ApplicationLi @Autowired private SchedulerTriggerListener globalSchedulerTriggerListener; - private final HashMap schedulers = new HashMap<>(4); + private static final HashMap SCHEDULERS = new HashMap<>(4); - // This cannot be injected as Autowired due to circular dependency - private SchedulerStopListener schedulerStopListener = new SchedulerStopListener(this); + @Autowired + @Lazy + private SchedulerStopListener schedulerStopListener; @Autowired private FineractProperties fineractProperties; @@ -93,14 +95,14 @@ public class JobRegisterServiceImpl implements JobRegisterService, ApplicationLi jobDataMap.put(SchedulerServiceConstants.TRIGGER_TYPE_REFERENCE, triggerType); jobDataMap.put(SchedulerServiceConstants.TENANT_IDENTIFIER, ThreadLocalContextUtil.getTenant().getTenantIdentifier()); final String schedulerName = getSchedulerName(scheduledJobDetail); - final Scheduler scheduler = this.schedulers.get(schedulerName); + final Scheduler scheduler = SCHEDULERS.get(schedulerName); final JobDetail jobDetail = createJobDetail(scheduledJobDetail); JobKey jobKey = jobDetail.getKey(); if (scheduler == null || !scheduler.checkExists(jobKey)) { final String tempSchedulerName = "temp" + scheduledJobDetail.getId(); final Scheduler tempScheduler = createScheduler(tempSchedulerName, 1, schedulerJobListener, schedulerStopListener); jobDataMap.put(SchedulerServiceConstants.SCHEDULER_NAME, tempSchedulerName); - schedulers.put(tempSchedulerName, tempScheduler); + SCHEDULERS.put(tempSchedulerName, tempScheduler); tempScheduler.addJob(jobDetail, true); tempScheduler.triggerJob(jobKey, jobDataMap); } else { @@ -120,13 +122,13 @@ public class JobRegisterServiceImpl implements JobRegisterService, ApplicationLi final String jobIdentity = scheduledJobDetail.getJobKey(); final JobKey jobKey = constructJobKey(jobIdentity); final String schedulername = getSchedulerName(scheduledJobDetail); - final Scheduler scheduler = this.schedulers.get(schedulername); + final Scheduler scheduler = SCHEDULERS.get(schedulername); if (scheduler != null) { scheduler.deleteJob(jobKey); } scheduleJob(scheduledJobDetail); this.schedularWritePlatformService.saveOrUpdate(scheduledJobDetail); - } catch (final Throwable throwable) { + } catch (final Exception throwable) { final String stackTrace = getStackTraceAsString(throwable); scheduledJobDetail.setErrorLog(stackTrace); this.schedularWritePlatformService.saveOrUpdate(scheduledJobDetail); @@ -158,7 +160,7 @@ public class JobRegisterServiceImpl implements JobRegisterService, ApplicationLi jobDetail.setMismatchedJob(false); } final String schedulerName = getSchedulerName(jobDetail); - final Scheduler scheduler = this.schedulers.get(schedulerName); + final Scheduler scheduler = SCHEDULERS.get(schedulerName); if (scheduler != null) { final String key = jobDetail.getJobKey(); final JobKey jobKey = constructJobKey(key); @@ -244,7 +246,7 @@ public class JobRegisterServiceImpl implements JobRegisterService, ApplicationLi scheduler.scheduleJob(jobDetail, trigger); scheduledJobDetails.setNextRunTime(trigger.getNextFireTime()); scheduledJobDetails.setErrorLog(null); - } catch (final Throwable throwable) { + } catch (final Exception throwable) { scheduledJobDetails.setNextRunTime(null); final String stackTrace = getStackTraceAsString(throwable); scheduledJobDetails.setErrorLog(stackTrace); @@ -255,7 +257,7 @@ public class JobRegisterServiceImpl implements JobRegisterService, ApplicationLi @Override public void stopAllSchedulers() { - for (Scheduler scheduler : this.schedulers.values()) { + for (Scheduler scheduler : SCHEDULERS.values()) { try { scheduler.shutdown(); } catch (final SchedulerException e) { @@ -266,21 +268,21 @@ public class JobRegisterServiceImpl implements JobRegisterService, ApplicationLi private Scheduler getScheduler(final ScheduledJobDetail scheduledJobDetail) throws Exception { final String schedulername = getSchedulerName(scheduledJobDetail); - Scheduler scheduler = this.schedulers.get(schedulername); + Scheduler scheduler = SCHEDULERS.get(schedulername); if (scheduler == null) { int noOfThreads = SchedulerServiceConstants.DEFAULT_THREAD_COUNT; if (scheduledJobDetail.getSchedulerGroup() > 0) { noOfThreads = SchedulerServiceConstants.GROUP_THREAD_COUNT; } scheduler = createScheduler(schedulername, noOfThreads, schedulerJobListener); - this.schedulers.put(schedulername, scheduler); + SCHEDULERS.put(schedulername, scheduler); } return scheduler; } @Override public void stopScheduler(final String name) { - final Scheduler scheduler = this.schedulers.remove(name); + final Scheduler scheduler = SCHEDULERS.remove(name); try { scheduler.shutdown(); } catch (final SchedulerException e) { @@ -363,7 +365,6 @@ public class JobRegisterServiceImpl implements JobRegisterService, ApplicationLi private JobKey constructJobKey(final String Key) { final List keyParams = Splitter.onPattern(SchedulerServiceConstants.JOB_KEY_SEPERATOR).splitToList(Key); - final JobKey jobKey = new JobKey(keyParams.get(0), keyParams.get(1)); - return jobKey; + return new JobKey(keyParams.get(0), keyParams.get(1)); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/SchedulerStopListener.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/SchedulerStopListener.java index a1dbad2a3..e016393aa 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/SchedulerStopListener.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/SchedulerStopListener.java @@ -18,13 +18,17 @@ */ package org.apache.fineract.infrastructure.jobs.service; +import lombok.RequiredArgsConstructor; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.JobListener; +import org.springframework.stereotype.Component; /** * Global job Listener class to Stop the temporary scheduler once job execution completes */ +@Component +@RequiredArgsConstructor public class SchedulerStopListener implements JobListener { private static final String name = "Singlr Trigger Global Listener"; @@ -60,13 +64,7 @@ public class SchedulerStopListener implements JobListener { public void jobWasExecuted(final JobExecutionContext context, @SuppressWarnings("unused") final JobExecutionException jobException) { final String schedulerName = context.getTrigger().getJobDataMap().getString(SchedulerServiceConstants.SCHEDULER_NAME); if (schedulerName != null) { - final Thread newThread = new Thread(new Runnable() { - - @Override - public void run() { - SchedulerStopListener.this.jobRegisterService.stopScheduler(schedulerName); - } - }); + final Thread newThread = new Thread(() -> SchedulerStopListener.this.jobRegisterService.stopScheduler(schedulerName)); newThread.start(); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/service/ReportMailingJobEmailServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/service/ReportMailingJobEmailServiceImpl.java index 97c3b8611..0cc56cf79 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/service/ReportMailingJobEmailServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/service/ReportMailingJobEmailServiceImpl.java @@ -38,7 +38,6 @@ public class ReportMailingJobEmailServiceImpl implements ReportMailingJobEmailSe private static final Logger LOG = LoggerFactory.getLogger(ReportMailingJobEmailServiceImpl.class); private final ReportMailingJobConfigurationReadPlatformService reportMailingJobConfigurationReadPlatformService; - private Collection reportMailingJobConfigurationDataCollection; /** * ReportMailingJobEmailServiceImpl constructor @@ -52,17 +51,18 @@ public class ReportMailingJobEmailServiceImpl implements ReportMailingJobEmailSe @Override public void sendEmailWithAttachment(ReportMailingJobEmailData reportMailingJobEmailData) { + Collection reportMailingJobConfigurationDataCollection; try { // get all ReportMailingJobConfiguration objects from the database - this.reportMailingJobConfigurationDataCollection = this.reportMailingJobConfigurationReadPlatformService + reportMailingJobConfigurationDataCollection = this.reportMailingJobConfigurationReadPlatformService .retrieveAllReportMailingJobConfigurations(); JavaMailSenderImpl javaMailSenderImpl = new JavaMailSenderImpl(); - javaMailSenderImpl.setHost(this.getGmailSmtpServer()); - javaMailSenderImpl.setPort(this.getGmailSmtpPort()); - javaMailSenderImpl.setUsername(this.getGmailSmtpUsername()); - javaMailSenderImpl.setPassword(this.getGmailSmtpPassword()); - javaMailSenderImpl.setJavaMailProperties(this.getJavaMailProperties()); + javaMailSenderImpl.setHost(this.getGmailSmtpServer(reportMailingJobConfigurationDataCollection)); + javaMailSenderImpl.setPort(this.getGmailSmtpPort(reportMailingJobConfigurationDataCollection)); + javaMailSenderImpl.setUsername(this.getGmailSmtpUsername(reportMailingJobConfigurationDataCollection)); + javaMailSenderImpl.setPassword(this.getGmailSmtpPassword(reportMailingJobConfigurationDataCollection)); + javaMailSenderImpl.setJavaMailProperties(this.getJavaMailProperties(reportMailingJobConfigurationDataCollection)); MimeMessage mimeMessage = javaMailSenderImpl.createMimeMessage(); @@ -79,9 +79,7 @@ public class ReportMailingJobEmailServiceImpl implements ReportMailingJobEmailSe } javaMailSenderImpl.send(mimeMessage); - } - - catch (MessagingException e) { + } catch (MessagingException e) { // handle the exception LOG.error("Problem occurred in sendEmailWithAttachment function", e); } @@ -90,12 +88,12 @@ public class ReportMailingJobEmailServiceImpl implements ReportMailingJobEmailSe /** * @return Properties object containing JavaMail properties **/ - private Properties getJavaMailProperties() { + private Properties getJavaMailProperties(Collection reportMailingJobConfigurationDataCollection) { Properties properties = new Properties(); properties.setProperty("mail.smtp.auth", "true"); properties.setProperty("mail.smtp.starttls.enable", "true"); - properties.setProperty("mail.smtp.ssl.trust", this.getGmailSmtpServer()); + properties.setProperty("mail.smtp.ssl.trust", this.getGmailSmtpServer(reportMailingJobConfigurationDataCollection)); return properties; } @@ -107,11 +105,12 @@ public class ReportMailingJobEmailServiceImpl implements ReportMailingJobEmailSe * -- the value of the name property * @return ReportMailingJobConfigurationData object **/ - private ReportMailingJobConfigurationData getReportMailingJobConfigurationData(final String name) { + private ReportMailingJobConfigurationData getReportMailingJobConfigurationData( + final Collection reportMailingJobConfigurationDataCollection, final String name) { ReportMailingJobConfigurationData reportMailingJobConfigurationData = null; - if (this.reportMailingJobConfigurationDataCollection != null && !this.reportMailingJobConfigurationDataCollection.isEmpty()) { - for (ReportMailingJobConfigurationData reportMailingJobConfigurationDataObject : this.reportMailingJobConfigurationDataCollection) { + if (reportMailingJobConfigurationDataCollection != null && !reportMailingJobConfigurationDataCollection.isEmpty()) { + for (ReportMailingJobConfigurationData reportMailingJobConfigurationDataObject : reportMailingJobConfigurationDataCollection) { String configurationName = reportMailingJobConfigurationDataObject.getName(); if (!StringUtils.isEmpty(configurationName) && configurationName.equals(name)) { @@ -127,9 +126,9 @@ public class ReportMailingJobEmailServiceImpl implements ReportMailingJobEmailSe /** * @return Gmail smtp server name **/ - private String getGmailSmtpServer() { - final ReportMailingJobConfigurationData reportMailingJobConfigurationData = this - .getReportMailingJobConfigurationData(ReportMailingJobConstants.GMAIL_SMTP_SERVER); + private String getGmailSmtpServer(Collection reportMailingJobConfigurationDataCollection) { + final ReportMailingJobConfigurationData reportMailingJobConfigurationData = this.getReportMailingJobConfigurationData( + reportMailingJobConfigurationDataCollection, ReportMailingJobConstants.GMAIL_SMTP_SERVER); return (reportMailingJobConfigurationData != null) ? reportMailingJobConfigurationData.getValue() : null; } @@ -137,9 +136,9 @@ public class ReportMailingJobEmailServiceImpl implements ReportMailingJobEmailSe /** * @return Gmail smtp server port number **/ - private Integer getGmailSmtpPort() { - final ReportMailingJobConfigurationData reportMailingJobConfigurationData = this - .getReportMailingJobConfigurationData(ReportMailingJobConstants.GMAIL_SMTP_PORT); + private Integer getGmailSmtpPort(Collection reportMailingJobConfigurationDataCollection) { + final ReportMailingJobConfigurationData reportMailingJobConfigurationData = this.getReportMailingJobConfigurationData( + reportMailingJobConfigurationDataCollection, ReportMailingJobConstants.GMAIL_SMTP_PORT); final String portNumber = (reportMailingJobConfigurationData != null) ? reportMailingJobConfigurationData.getValue() : null; return (portNumber != null) ? Integer.parseInt(portNumber) : null; @@ -148,9 +147,9 @@ public class ReportMailingJobEmailServiceImpl implements ReportMailingJobEmailSe /** * @return Gmail smtp username **/ - private String getGmailSmtpUsername() { - final ReportMailingJobConfigurationData reportMailingJobConfigurationData = this - .getReportMailingJobConfigurationData(ReportMailingJobConstants.GMAIL_SMTP_USERNAME); + private String getGmailSmtpUsername(Collection reportMailingJobConfigurationDataCollection) { + final ReportMailingJobConfigurationData reportMailingJobConfigurationData = this.getReportMailingJobConfigurationData( + reportMailingJobConfigurationDataCollection, ReportMailingJobConstants.GMAIL_SMTP_USERNAME); return (reportMailingJobConfigurationData != null) ? reportMailingJobConfigurationData.getValue() : null; } @@ -158,9 +157,9 @@ public class ReportMailingJobEmailServiceImpl implements ReportMailingJobEmailSe /** * @return Gmail smtp password **/ - private String getGmailSmtpPassword() { - final ReportMailingJobConfigurationData reportMailingJobConfigurationData = this - .getReportMailingJobConfigurationData(ReportMailingJobConstants.GMAIL_SMTP_PASSWORD); + private String getGmailSmtpPassword(Collection reportMailingJobConfigurationDataCollection) { + final ReportMailingJobConfigurationData reportMailingJobConfigurationData = this.getReportMailingJobConfigurationData( + reportMailingJobConfigurationDataCollection, ReportMailingJobConstants.GMAIL_SMTP_PASSWORD); return (reportMailingJobConfigurationData != null) ? reportMailingJobConfigurationData.getValue() : null; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/api/TwoFactorConfigurationApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/api/TwoFactorConfigurationApiResource.java index e76af9af2..b88015221 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/api/TwoFactorConfigurationApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/api/TwoFactorConfigurationApiResource.java @@ -45,7 +45,7 @@ import org.springframework.stereotype.Component; @ConditionalOnProperty("fineract.security.2fa.enabled") public class TwoFactorConfigurationApiResource { - private final String resourceNameForPermissions = "TWOFACTOR_CONFIG"; + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "TWOFACTOR_CONFIG"; private final PlatformSecurityContext context; private final TwoFactorConfigurationService configurationService; @@ -64,7 +64,7 @@ public class TwoFactorConfigurationApiResource { @GET public String retrieveAll() { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); Map configurationMap = configurationService.retrieveAll(); return toApiJsonSerializer.serialize(configurationMap); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/domain/OTPRequestRepository.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/domain/OTPRequestRepository.java index eaf3f4354..459b33a6d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/domain/OTPRequestRepository.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/domain/OTPRequestRepository.java @@ -30,21 +30,21 @@ import org.springframework.util.Assert; @SuppressWarnings({ "MemberName" }) public class OTPRequestRepository { - private final ConcurrentHashMap OTPrequests = new ConcurrentHashMap<>(); + private static final ConcurrentHashMap OTT_REQUESTS = new ConcurrentHashMap<>(); public OTPRequest getOTPRequestForUser(AppUser user) { Assert.notNull(user, "User must not be null"); - return this.OTPrequests.get(user.getId()); + return OTT_REQUESTS.get(user.getId()); } public void addOTPRequest(AppUser user, OTPRequest request) { Assert.notNull(user, "User must not be null"); Assert.notNull(request, "Request must not be null"); - this.OTPrequests.put(user.getId(), request); + OTT_REQUESTS.put(user.getId(), request); } public void deleteOTPRequestForUser(AppUser user) { - this.OTPrequests.remove(user.getId()); + OTT_REQUESTS.remove(user.getId()); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/mix/api/MixTaxonomyApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/mix/api/MixTaxonomyApiResource.java index f82808e23..2e90e8f48 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/mix/api/MixTaxonomyApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/mix/api/MixTaxonomyApiResource.java @@ -47,7 +47,7 @@ import org.springframework.stereotype.Component; @Tag(name = "Mix Taxonomy", description = "") public class MixTaxonomyApiResource { - private final Set responseDataParameters = new HashSet<>( + private static final Set RESPONSE_DATA_PARAMETERS = new HashSet<>( Arrays.asList("taxonomyId", "name", "namespace", "dimension", "description")); private final PlatformSecurityContext context; @@ -75,6 +75,6 @@ public class MixTaxonomyApiResource { final List taxonomyDatas = this.readTaxonomyService.retrieveAll(); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, taxonomyDatas, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, taxonomyDatas, RESPONSE_DATA_PARAMETERS); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/mix/api/MixTaxonomyMappingApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/mix/api/MixTaxonomyMappingApiResource.java index a950050a2..b23583cc8 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/mix/api/MixTaxonomyMappingApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/mix/api/MixTaxonomyMappingApiResource.java @@ -51,7 +51,7 @@ import org.springframework.stereotype.Component; @Tag(name = "Mix Mapping", description = "") public class MixTaxonomyMappingApiResource { - private final Set responseDataParameters = new HashSet<>(Arrays.asList("identifier", "config")); + private static final Set RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("identifier", "config")); private final PlatformSecurityContext context; private final ToApiJsonSerializer toApiJsonSerializer; @@ -80,7 +80,7 @@ public class MixTaxonomyMappingApiResource { this.context.authenticatedUser(); final MixTaxonomyMappingData mappingData = this.readTaxonomyMappingService.retrieveTaxonomyMapping(); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, mappingData, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, mappingData, RESPONSE_DATA_PARAMETERS); } @PUT diff --git a/fineract-provider/src/main/java/org/apache/fineract/mix/service/XBRLBuilder.java b/fineract-provider/src/main/java/org/apache/fineract/mix/service/XBRLBuilder.java index 47fc4ecd2..6af912acb 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/mix/service/XBRLBuilder.java +++ b/fineract-provider/src/main/java/org/apache/fineract/mix/service/XBRLBuilder.java @@ -44,13 +44,6 @@ public class XBRLBuilder { private static final String UNITID_PURE = "Unit1"; private static final String UNITID_CUR = "Unit2"; - private Element root; - private HashMap contextMap; - Date startDate; - Date endDate; - private Integer instantScenarioCounter = 1; - private Integer durationScenarioCounter = 1; - @Autowired private NamespaceReadPlatformService readNamespaceService; @@ -59,38 +52,37 @@ public class XBRLBuilder { } public String build(final Map map, final Date startDate, final Date endDate, final String currency) { - this.instantScenarioCounter = 1; - this.durationScenarioCounter = 1; - this.contextMap = new HashMap<>(); + Integer instantScenarioCounter = 0; + Integer durationScenarioCounter = 0; + Map contextMap = new HashMap<>(); final Document doc = DocumentHelper.createDocument(); - this.root = doc.addElement("xbrl"); + Element root = doc.addElement("xbrl"); - this.root.addElement("schemaRef").addNamespace("link", + root.addElement("schemaRef").addNamespace("link", "http://www.themix.org/sites/default/files/Taxonomy2010/dct/dc-all_2010-08-31.xsd"); - this.startDate = startDate; - this.endDate = endDate; - for (final Map.Entry entry : map.entrySet()) { final MixTaxonomyData taxonomy = entry.getKey(); final BigDecimal value = entry.getValue(); - addTaxonomy(this.root, taxonomy, value); + addTaxonomy(root, taxonomy, value, startDate, endDate, instantScenarioCounter, durationScenarioCounter, contextMap); } - addContexts(); - addCurrencyUnit(currency); - addNumberUnit(); + addContexts(root, startDate, endDate, contextMap); + addCurrencyUnit(root, currency); + addNumberUnit(root); doc.setXMLEncoding("UTF-8"); return doc.asXML(); } - Element addTaxonomy(final Element rootElement, final MixTaxonomyData taxonomy, final BigDecimal value) { + private Element addTaxonomy(final Element rootElement, final MixTaxonomyData taxonomy, final BigDecimal value, final Date startDate, + final Date endDate, Integer instantScenarioCounter, Integer durationScenarioCounter, + final Map contextMap) { // throw an error is start / endate is null - if (this.startDate == null || this.endDate == null) { + if (startDate == null || endDate == null) { throw new XBRLMappingInvalidException("start date and end date should not be null"); } @@ -100,7 +92,7 @@ public class XBRLBuilder { final NamespaceData ns = this.readNamespaceService.retrieveNamespaceByPrefix(prefix); if (ns != null) { - this.root.addNamespace(prefix, ns.getUrl()); + rootElement.addNamespace(prefix, ns.getUrl()); } qname = prefix + ":" + taxonomy.getName(); @@ -127,18 +119,19 @@ public class XBRLBuilder { : 1); } - if (!this.contextMap.containsKey(context)) { + if (!contextMap.containsKey(context)) { - final String startDateStr = timeFormat.format(this.startDate); - final String endDateStr = timeFormat.format(this.endDate); + final String startDateStr = timeFormat.format(startDate); + final String endDateStr = timeFormat.format(endDate); + instantScenarioCounter += 1; + durationScenarioCounter += 1; + final String contextRefID = context.getPeriodType() == 0 ? "As_Of_" + endDateStr + instantScenarioCounter + : "Duration_" + startDateStr + "_To_" + endDateStr + durationScenarioCounter; - final String contextRefID = context.getPeriodType() == 0 ? "As_Of_" + endDateStr + this.instantScenarioCounter++ - : "Duration_" + startDateStr + "_To_" + endDateStr + this.durationScenarioCounter++; - - this.contextMap.put(context, contextRefID); + contextMap.put(context, contextRefID); } - xmlElement.addAttribute("contextRef", this.contextMap.get(context)); + xmlElement.addAttribute("contextRef", contextMap.get(context)); xmlElement.addAttribute("unitRef", getUnitRef(taxonomy)); xmlElement.addAttribute("decimals", getNumberOfDecimalPlaces(value).toString()); @@ -155,8 +148,8 @@ public class XBRLBuilder { /** * Adds the generic number unit */ - void addNumberUnit() { - final Element numerUnit = this.root.addElement("unit"); + private void addNumberUnit(final Element root) { + final Element numerUnit = root.addElement("unit"); numerUnit.addAttribute("id", UNITID_PURE); final Element measure = numerUnit.addElement("measure"); measure.addText("xbrli:pure"); @@ -168,29 +161,29 @@ public class XBRLBuilder { * * @param currencyCode */ - public void addCurrencyUnit(final String currencyCode) { - final Element currencyUnitElement = this.root.addElement("unit"); + private void addCurrencyUnit(final Element root, final String currencyCode) { + final Element currencyUnitElement = root.addElement("unit"); currencyUnitElement.addAttribute("id", UNITID_CUR); final Element measure = currencyUnitElement.addElement("measure"); measure.addText("iso4217:" + currencyCode); } - public void addContexts() { + private void addContexts(final Element root, final Date startDate, final Date endDate, final Map contextMap) { final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); - for (final Map.Entry entry : this.contextMap.entrySet()) { + for (final Map.Entry entry : contextMap.entrySet()) { final ContextData context = entry.getKey(); - final Element contextElement = this.root.addElement("context"); + final Element contextElement = root.addElement("context"); contextElement.addAttribute("id", entry.getValue()); contextElement.addElement("entity").addElement("identifier").addAttribute("scheme", SCHEME_URL).addText(IDENTIFIER); final Element periodElement = contextElement.addElement("period"); if (context.getPeriodType() == 0) { - periodElement.addElement("instant").addText(format.format(this.endDate)); + periodElement.addElement("instant").addText(format.format(endDate)); } else { - periodElement.addElement("startDate").addText(format.format(this.startDate)); - periodElement.addElement("endDate").addText(format.format(this.endDate)); + periodElement.addElement("startDate").addText(format.format(startDate)); + periodElement.addElement("endDate").addText(format.format(endDate)); } final String dimension = context.getDimension(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/mix/service/XBRLResultServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/mix/service/XBRLResultServiceImpl.java index 1a0a1c710..8a487fc28 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/mix/service/XBRLResultServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/mix/service/XBRLResultServiceImpl.java @@ -23,6 +23,7 @@ import java.math.BigDecimal; import java.sql.Date; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -49,7 +50,6 @@ public class XBRLResultServiceImpl implements XBRLResultService { private final MixTaxonomyMappingReadPlatformService readTaxonomyMappingService; private final MixTaxonomyReadPlatformService readTaxonomyService; private final JdbcTemplate jdbcTemplate; - private HashMap accountBalanceMap; @Autowired public XBRLResultServiceImpl(final JdbcTemplate jdbcTemplate, final MixTaxonomyMappingReadPlatformService readTaxonomyMappingService, @@ -85,13 +85,11 @@ public class XBRLResultServiceImpl implements XBRLResultService { } // final HashMap resultMap = new HashMap<>(); - setupBalanceMap(getAccountSql(startDate, endDate)); + Map accountBalanceMap = setupBalanceMap(getAccountSql(startDate, endDate)); for (final Map.Entry entry : configMap.entrySet()) { - final BigDecimal value = processMappingString(entry.getValue()); - if (value != null) { - final MixTaxonomyData taxonomy = this.readTaxonomyService.retrieveOne(Long.parseLong(entry.getKey())); - resultMap.put(taxonomy, value); - } + final BigDecimal value = processMappingString(accountBalanceMap, entry.getValue()); + final MixTaxonomyData taxonomy = this.readTaxonomyService.retrieveOne(Long.parseLong(entry.getKey())); + resultMap.put(taxonomy, value); } return resultMap; @@ -100,7 +98,7 @@ public class XBRLResultServiceImpl implements XBRLResultService { } private String getAccountSql(final Date startDate, final Date endDate) { - final String sql = "select debits.glcode as 'glcode', debits.name as 'name', coalesce(debits.debitamount,0)-coalesce(credits.creditamount,0)) as 'balance' " + return "select debits.glcode as 'glcode', debits.name as 'name', coalesce(debits.debitamount,0)-coalesce(credits.creditamount,0)) as 'balance' " + "from (select acc_gl_account.gl_code as 'glcode',name,sum(amount) as 'debitamount' " + "from acc_gl_journal_entry,acc_gl_account " + "where acc_gl_account.id = acc_gl_journal_entry.account_id " + "and acc_gl_journal_entry.type_enum=2 " + "and acc_gl_journal_entry.entry_date <= " + endDate @@ -134,30 +132,30 @@ public class XBRLResultServiceImpl implements XBRLResultService { // ${branch}=1) " // + + " group by name, glcode " + "order by glcode) credits " + "on debits.glcode=credits.glcode;"; - return sql; } - private void setupBalanceMap(final String sql) { - if (this.accountBalanceMap == null) { - this.accountBalanceMap = new HashMap<>(); - final SqlRowSet rs = this.jdbcTemplate.queryForRowSet(sql); - while (rs.next()) { - this.accountBalanceMap.put(rs.getString("glcode"), rs.getBigDecimal("balance")); - } + private Map setupBalanceMap(final String sql) { + Map accountBalanceMap = new HashMap<>(); + + final SqlRowSet rs = this.jdbcTemplate.queryForRowSet(sql); + while (rs.next()) { + accountBalanceMap.put(rs.getString("glcode"), rs.getBigDecimal("balance")); } + + return accountBalanceMap; } // Calculate Taxonomy value from expression - private BigDecimal processMappingString(String mappingString) { - final ArrayList glCodes = getGLCodes(mappingString); + private BigDecimal processMappingString(Map accountBalanceMap, String mappingString) { + final List glCodes = getGLCodes(mappingString); for (final String glcode : glCodes) { - final BigDecimal balance = this.accountBalanceMap.get(glcode); + final BigDecimal balance = accountBalanceMap.get(glcode); mappingString = mappingString.replaceAll("\\{" + glcode + "\\}", balance != null ? balance.toString() : "0"); } // evaluate the expression - Float eval = 0f; + float eval = 0f; try { final Number value = (Number) SCRIPT_ENGINE.eval(mappingString); if (value != null) { @@ -168,10 +166,10 @@ public class XBRLResultServiceImpl implements XBRLResultService { throw new IllegalArgumentException(e.getMessage(), e); } - return new BigDecimal(eval); + return BigDecimal.valueOf(eval); } - public ArrayList getGLCodes(final String template) { + public List getGLCodes(final String template) { final ArrayList placeholders = new ArrayList<>(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/api/CurrenciesApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/api/CurrenciesApiResource.java index 3a178b8f3..a05b60f80 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/api/CurrenciesApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/api/CurrenciesApiResource.java @@ -58,9 +58,9 @@ import org.springframework.stereotype.Component; @Tag(name = "Currency", description = "Application related configuration around viewing/updating the currencies permitted for use within the MFI.") public class CurrenciesApiResource { - private final Set responseDataParameters = new HashSet<>(Arrays.asList("selectedCurrencyOptions", "currencyOptions")); + private static final Set RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("selectedCurrencyOptions", "currencyOptions")); - private final String resourceNameForPermissions = "CURRENCY"; + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "CURRENCY"; private final PlatformSecurityContext context; private final OrganisationCurrencyReadPlatformService readPlatformService; @@ -89,12 +89,12 @@ public class CurrenciesApiResource { @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = CurrenciesApiResourceSwagger.GetCurrenciesResponse.class))) }) public String retrieveCurrencies(@Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final ApplicationCurrencyConfigurationData configurationData = this.readPlatformService.retrieveCurrencyConfiguration(); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, configurationData, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, configurationData, RESPONSE_DATA_PARAMETERS); } @PUT diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/serialization/CurrencyCommandFromApiJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/serialization/CurrencyCommandFromApiJsonDeserializer.java index 61397c0c7..0e422b312 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/serialization/CurrencyCommandFromApiJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/serialization/CurrencyCommandFromApiJsonDeserializer.java @@ -22,7 +22,6 @@ import com.google.gson.JsonElement; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -39,10 +38,11 @@ import org.springframework.stereotype.Component; @Component public final class CurrencyCommandFromApiJsonDeserializer { + public static final String CURRENCIES = "currencies"; /** * The parameters supported for this command. */ - private final Set supportedParameters = new HashSet<>(Arrays.asList("currencies")); + private static final Set SUPPORTED_PARAMETERS = new HashSet<>(List.of(CURRENCIES)); private final FromJsonHelper fromApiJsonHelper; @@ -58,14 +58,14 @@ public final class CurrencyCommandFromApiJsonDeserializer { } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("currencies"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(CURRENCIES); final JsonElement element = this.fromApiJsonHelper.parse(json); - final String[] currencies = this.fromApiJsonHelper.extractArrayNamed("currencies", element); - baseDataValidator.reset().parameter("currencies").value(currencies).arrayNotEmpty(); + final String[] currencies = this.fromApiJsonHelper.extractArrayNamed(CURRENCIES, element); + baseDataValidator.reset().parameter(CURRENCIES).value(currencies).arrayNotEmpty(); throwExceptionIfValidationWarningsExist(dataValidationErrors); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/api/OfficeTransactionsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/api/OfficeTransactionsApiResource.java index 0cec6e75b..a50e4eee3 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/api/OfficeTransactionsApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/api/OfficeTransactionsApiResource.java @@ -56,7 +56,7 @@ public class OfficeTransactionsApiResource { Arrays.asList("id", "transactionDate", "fromOfficeId", "fromOfficeName", "toOfficeId", "toOfficeIdName", "currencyCode", "digitsAfterDecimal", "inMultiplesOf", "transactionAmount", "description", "allowedOffices", "currencyOptions")); - private final String resourceNameForReadPermissions = "OFFICE"; + private static final String RESOURCE_NAME_FOR_READ_PERMISSIONS = "OFFICE"; private final PlatformSecurityContext context; private final OfficeReadPlatformService readPlatformService; @@ -81,7 +81,7 @@ public class OfficeTransactionsApiResource { @Produces({ MediaType.APPLICATION_JSON }) public String retrieveOfficeTransactions(@Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForReadPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_READ_PERMISSIONS); final Collection officeTransactions = this.readPlatformService.retrieveAllOfficeTransactions(); @@ -95,7 +95,7 @@ public class OfficeTransactionsApiResource { @Produces({ MediaType.APPLICATION_JSON }) public String newOfficeTransactionDetails(@Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForReadPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_READ_PERMISSIONS); final OfficeTransactionData officeTransactionData = this.readPlatformService.retrieveNewOfficeTransactionDetails(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/api/OfficesApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/api/OfficesApiResource.java index cdf579366..a28755e72 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/api/OfficesApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/api/OfficesApiResource.java @@ -28,9 +28,9 @@ 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 java.io.InputStream; -import java.util.Arrays; import java.util.Collection; import java.util.HashSet; +import java.util.List; import java.util.Set; import javax.ws.rs.Consumes; import javax.ws.rs.DefaultValue; @@ -75,10 +75,10 @@ public class OfficesApiResource { /** * The set of parameters that are supported in response for {@link OfficeData}. */ - private final Set responseDataParameters = new HashSet<>(Arrays.asList("id", "name", "nameDecorated", "externalId", - "openingDate", "hierarchy", "parentId", "parentName", "allowedParents")); + private static final Set RESPONSE_DATA_PARAMETERS = new HashSet<>( + List.of("id", "name", "nameDecorated", "externalId", "openingDate", "hierarchy", "parentId", "parentName", "allowedParents")); - private final String resourceNameForPermissions = "OFFICE"; + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "OFFICE"; private final PlatformSecurityContext context; private final OfficeReadPlatformService readPlatformService; @@ -115,14 +115,14 @@ public class OfficesApiResource { @QueryParam("orderBy") @Parameter(description = "orderBy") final String orderBy, @QueryParam("sortOrder") @Parameter(description = "sortOrder") final String sortOrder) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final SearchParameters searchParameters = SearchParameters.forOffices(orderBy, sortOrder); final Collection offices = this.readPlatformService.retrieveAllOffices(onlyManualEntries, searchParameters); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, offices, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, offices, RESPONSE_DATA_PARAMETERS); } @GET @@ -135,7 +135,7 @@ public class OfficesApiResource { @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = OfficesApiResourceSwagger.GetOfficesTemplateResponse.class))) }) public String retrieveOfficeTemplate(@Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); OfficeData office = this.readPlatformService.retrieveNewOfficeTemplate(); @@ -143,7 +143,7 @@ public class OfficesApiResource { office = OfficeData.appendedTemplate(office, allowedParents); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, office, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, office, RESPONSE_DATA_PARAMETERS); } @POST @@ -176,7 +176,7 @@ public class OfficesApiResource { public String retreiveOffice(@PathParam("officeId") @Parameter(description = "officeId") final Long officeId, @Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); @@ -186,7 +186,7 @@ public class OfficesApiResource { office = OfficeData.appendedTemplate(office, allowedParents); } - return this.toApiJsonSerializer.serialize(settings, office, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, office, RESPONSE_DATA_PARAMETERS); } @PUT diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/serialization/OfficeCommandFromApiJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/serialization/OfficeCommandFromApiJsonDeserializer.java index d012d93dd..4e6f7ea15 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/serialization/OfficeCommandFromApiJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/serialization/OfficeCommandFromApiJsonDeserializer.java @@ -43,11 +43,17 @@ import org.springframework.stereotype.Component; @Component public final class OfficeCommandFromApiJsonDeserializer { + public static final String PARENT_ID = "parentId"; + public static final String NAME = "name"; + public static final String OPENING_DATE = "openingDate"; + public static final String EXTERNAL_ID = "externalId"; + public static final String LOCALE = "locale"; + public static final String DATE_FORMAT = "dateFormat"; /** * The parameters supported for this command. */ - private final Set supportedParameters = new HashSet<>( - Arrays.asList("name", "parentId", "openingDate", "externalId", "locale", "dateFormat")); + private static final Set SUPPORTED_PARAMETERS = new HashSet<>( + Arrays.asList(NAME, PARENT_ID, OPENING_DATE, EXTERNAL_ID, LOCALE, DATE_FORMAT)); private final FromJsonHelper fromApiJsonHelper; @@ -62,27 +68,27 @@ public final class OfficeCommandFromApiJsonDeserializer { } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("office"); final JsonElement element = this.fromApiJsonHelper.parse(json); - final String name = this.fromApiJsonHelper.extractStringNamed("name", element); - baseDataValidator.reset().parameter("name").value(name).notBlank().notExceedingLengthOf(100); + final String name = this.fromApiJsonHelper.extractStringNamed(NAME, element); + baseDataValidator.reset().parameter(NAME).value(name).notBlank().notExceedingLengthOf(100); - final LocalDate openingDate = this.fromApiJsonHelper.extractLocalDateNamed("openingDate", element); - baseDataValidator.reset().parameter("openingDate").value(openingDate).notNull(); + final LocalDate openingDate = this.fromApiJsonHelper.extractLocalDateNamed(OPENING_DATE, element); + baseDataValidator.reset().parameter(OPENING_DATE).value(openingDate).notNull(); - if (this.fromApiJsonHelper.parameterExists("externalId", element)) { - final String externalId = this.fromApiJsonHelper.extractStringNamed("externalId", element); - baseDataValidator.reset().parameter("externalId").value(externalId).notExceedingLengthOf(100); + if (this.fromApiJsonHelper.parameterExists(EXTERNAL_ID, element)) { + final String externalId = this.fromApiJsonHelper.extractStringNamed(EXTERNAL_ID, element); + baseDataValidator.reset().parameter(EXTERNAL_ID).value(externalId).notExceedingLengthOf(100); } - if (this.fromApiJsonHelper.parameterExists("parentId", element)) { - final Long parentId = this.fromApiJsonHelper.extractLongNamed("parentId", element); - baseDataValidator.reset().parameter("parentId").value(parentId).notNull().integerGreaterThanZero(); + if (this.fromApiJsonHelper.parameterExists(PARENT_ID, element)) { + final Long parentId = this.fromApiJsonHelper.extractLongNamed(PARENT_ID, element); + baseDataValidator.reset().parameter(PARENT_ID).value(parentId).notNull().integerGreaterThanZero(); } throwExceptionIfValidationWarningsExist(dataValidationErrors); @@ -101,31 +107,31 @@ public final class OfficeCommandFromApiJsonDeserializer { } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("office"); final JsonElement element = this.fromApiJsonHelper.parse(json); - if (this.fromApiJsonHelper.parameterExists("name", element)) { - final String name = this.fromApiJsonHelper.extractStringNamed("name", element); - baseDataValidator.reset().parameter("name").value(name).notBlank().notExceedingLengthOf(100); + if (this.fromApiJsonHelper.parameterExists(NAME, element)) { + final String name = this.fromApiJsonHelper.extractStringNamed(NAME, element); + baseDataValidator.reset().parameter(NAME).value(name).notBlank().notExceedingLengthOf(100); } - if (this.fromApiJsonHelper.parameterExists("openingDate", element)) { - final LocalDate openingDate = this.fromApiJsonHelper.extractLocalDateNamed("openingDate", element); - baseDataValidator.reset().parameter("openingDate").value(openingDate).notNull(); + if (this.fromApiJsonHelper.parameterExists(OPENING_DATE, element)) { + final LocalDate openingDate = this.fromApiJsonHelper.extractLocalDateNamed(OPENING_DATE, element); + baseDataValidator.reset().parameter(OPENING_DATE).value(openingDate).notNull(); } - if (this.fromApiJsonHelper.parameterExists("externalId", element)) { - final String externalId = this.fromApiJsonHelper.extractStringNamed("externalId", element); - baseDataValidator.reset().parameter("externalId").value(externalId).notExceedingLengthOf(100); + if (this.fromApiJsonHelper.parameterExists(EXTERNAL_ID, element)) { + final String externalId = this.fromApiJsonHelper.extractStringNamed(EXTERNAL_ID, element); + baseDataValidator.reset().parameter(EXTERNAL_ID).value(externalId).notExceedingLengthOf(100); } - if (this.fromApiJsonHelper.parameterExists("parentId", element)) { - final Long parentId = this.fromApiJsonHelper.extractLongNamed("parentId", element); - baseDataValidator.reset().parameter("parentId").value(parentId).notNull().integerGreaterThanZero(); + if (this.fromApiJsonHelper.parameterExists(PARENT_ID, element)) { + final Long parentId = this.fromApiJsonHelper.extractLongNamed(PARENT_ID, element); + baseDataValidator.reset().parameter(PARENT_ID).value(parentId).notNull().integerGreaterThanZero(); } throwExceptionIfValidationWarningsExist(dataValidationErrors); diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/serialization/OfficeTransactionCommandFromApiJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/serialization/OfficeTransactionCommandFromApiJsonDeserializer.java index 8e4d2cf32..8029c28e0 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/serialization/OfficeTransactionCommandFromApiJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/serialization/OfficeTransactionCommandFromApiJsonDeserializer.java @@ -41,11 +41,19 @@ import org.springframework.stereotype.Component; @Component public final class OfficeTransactionCommandFromApiJsonDeserializer { + public static final String FROM_OFFICE_ID = "fromOfficeId"; + public static final String TO_OFFICE_ID = "toOfficeId"; + public static final String TRANSACTION_DATE = "transactionDate"; + public static final String CURRENCY_CODE = "currencyCode"; + public static final String TRANSACTION_AMOUNT = "transactionAmount"; + public static final String DESCRIPTION = "description"; + public static final String LOCALE = "locale"; + public static final String DATE_FORMAT = "dateFormat"; /** * The parameters supported for this command. */ - private final Set supportedParameters = new HashSet<>(Arrays.asList("fromOfficeId", "toOfficeId", "transactionDate", - "currencyCode", "transactionAmount", "description", "locale", "dateFormat")); + private static final Set SUPPORTED_PARAMETERS = new HashSet<>(Arrays.asList(FROM_OFFICE_ID, TO_OFFICE_ID, TRANSACTION_DATE, + CURRENCY_CODE, TRANSACTION_AMOUNT, DESCRIPTION, LOCALE, DATE_FORMAT)); private final FromJsonHelper fromApiJsonHelper; @@ -59,38 +67,40 @@ public final class OfficeTransactionCommandFromApiJsonDeserializer { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("officeTransaction"); final JsonElement element = this.fromApiJsonHelper.parse(json); - final Long fromOfficeId = this.fromApiJsonHelper.extractLongNamed("fromOfficeId", element); - baseDataValidator.reset().parameter("fromOfficeId").value(fromOfficeId).ignoreIfNull().integerGreaterThanZero(); + final Long fromOfficeId = this.fromApiJsonHelper.extractLongNamed(FROM_OFFICE_ID, element); + baseDataValidator.reset().parameter(FROM_OFFICE_ID).value(fromOfficeId).ignoreIfNull().integerGreaterThanZero(); - final Long toOfficeId = this.fromApiJsonHelper.extractLongNamed("toOfficeId", element); - baseDataValidator.reset().parameter("toOfficeId").value(toOfficeId).ignoreIfNull().integerGreaterThanZero(); + final Long toOfficeId = this.fromApiJsonHelper.extractLongNamed(TO_OFFICE_ID, element); + baseDataValidator.reset().parameter(TO_OFFICE_ID).value(toOfficeId).ignoreIfNull().integerGreaterThanZero(); if (fromOfficeId == null && toOfficeId == null) { - baseDataValidator.reset().parameter("toOfficeId").value(toOfficeId).notNull(); + baseDataValidator.reset().parameter(TO_OFFICE_ID).value(toOfficeId).notNull(); } if (fromOfficeId != null && toOfficeId != null) { - baseDataValidator.reset().parameter("fromOfficeId").value(fromOfficeId).notSameAsParameter("toOfficeId", toOfficeId); + baseDataValidator.reset().parameter(FROM_OFFICE_ID).value(fromOfficeId).notSameAsParameter(TO_OFFICE_ID, toOfficeId); } - final LocalDate transactionDate = this.fromApiJsonHelper.extractLocalDateNamed("transactionDate", element); - baseDataValidator.reset().parameter("transactionDate").value(transactionDate).notNull(); + final LocalDate transactionDate = this.fromApiJsonHelper.extractLocalDateNamed(TRANSACTION_DATE, element); + baseDataValidator.reset().parameter(TRANSACTION_DATE).value(transactionDate).notNull(); - final String currencyCode = this.fromApiJsonHelper.extractStringNamed("currencyCode", element); - baseDataValidator.reset().parameter("currencyCode").value(currencyCode).notBlank().notExceedingLengthOf(3); + final String currencyCode = this.fromApiJsonHelper.extractStringNamed(CURRENCY_CODE, element); + baseDataValidator.reset().parameter(CURRENCY_CODE).value(currencyCode).notBlank().notExceedingLengthOf(3); - final BigDecimal transactionAmount = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("transactionAmount", element); - baseDataValidator.reset().parameter("transactionAmount").value(transactionAmount).notNull().positiveAmount(); + final BigDecimal transactionAmount = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(TRANSACTION_AMOUNT, element); + baseDataValidator.reset().parameter(TRANSACTION_AMOUNT).value(transactionAmount).notNull().positiveAmount(); - final String description = this.fromApiJsonHelper.extractStringNamed("description", element); - baseDataValidator.reset().parameter("description").value(description).notExceedingLengthOf(100); + final String description = this.fromApiJsonHelper.extractStringNamed(DESCRIPTION, element); + baseDataValidator.reset().parameter(DESCRIPTION).value(description).notExceedingLengthOf(100); throwExceptionIfValidationWarningsExist(dataValidationErrors); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/serialization/ProvisioningCategoryDefinitionJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/serialization/ProvisioningCategoryDefinitionJsonDeserializer.java index 2c296051a..96b0d2b91 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/serialization/ProvisioningCategoryDefinitionJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/serialization/ProvisioningCategoryDefinitionJsonDeserializer.java @@ -39,11 +39,13 @@ import org.springframework.stereotype.Component; @Component public class ProvisioningCategoryDefinitionJsonDeserializer { + public static final String CATEGORYNAME = "categoryname"; + public static final String CATEGORYDESCRIPTION = "categorydescription"; + public static final String PROVISIONINGCATEGORIES = "provisioningcategories"; /** * The parameters supported for this command. */ - private final Set supportedParameters = new HashSet<>(Arrays.asList("categoryname", "categorydescription")); - + private static final Set SUPPORTED_PARAMETERS = new HashSet<>(Arrays.asList(CATEGORYNAME, CATEGORYDESCRIPTION)); private final FromJsonHelper fromApiJsonHelper; @Autowired @@ -55,15 +57,17 @@ public class ProvisioningCategoryDefinitionJsonDeserializer { if (StringUtils.isBlank(json)) { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("provisioningcategories"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(PROVISIONINGCATEGORIES); final JsonElement element = this.fromApiJsonHelper.parse(json); - final String name = this.fromApiJsonHelper.extractStringNamed("categoryname", element); - baseDataValidator.reset().parameter("categoryname").value(name).notBlank().notExceedingLengthOf(100); + final String name = this.fromApiJsonHelper.extractStringNamed(CATEGORYNAME, element); + baseDataValidator.reset().parameter(CATEGORYNAME).value(name).notBlank().notExceedingLengthOf(100); if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException(dataValidationErrors); } @@ -73,16 +77,18 @@ public class ProvisioningCategoryDefinitionJsonDeserializer { if (StringUtils.isBlank(json)) { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("provisioningcategories"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(PROVISIONINGCATEGORIES); final JsonElement element = this.fromApiJsonHelper.parse(json); - if (this.fromApiJsonHelper.parameterExists("categoryname", element)) { - final String categoryName = this.fromApiJsonHelper.extractStringNamed("categoryname", element); - baseDataValidator.reset().parameter("categoryname").value(categoryName).notBlank().notExceedingLengthOf(100); + if (this.fromApiJsonHelper.parameterExists(CATEGORYNAME, element)) { + final String categoryName = this.fromApiJsonHelper.extractStringNamed(CATEGORYNAME, element); + baseDataValidator.reset().parameter(CATEGORYNAME).value(categoryName).notBlank().notExceedingLengthOf(100); } if (!dataValidationErrors.isEmpty()) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/api/StaffApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/api/StaffApiResource.java index 245ccf1e5..89ca2e42a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/api/StaffApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/api/StaffApiResource.java @@ -76,10 +76,10 @@ public class StaffApiResource { /** * The set of parameters that are supported in response for {@link StaffData}. */ - private final Set responseDataParameters = new HashSet<>(Arrays.asList("id", "firstname", "lastname", "displayName", "officeId", - "officeName", "isLoanOfficer", "externalId", "mobileNo", "allowedOffices", "isActive", "joiningDate")); + private static final Set RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id", "firstname", "lastname", "displayName", + "officeId", "officeName", "isLoanOfficer", "externalId", "mobileNo", "allowedOffices", "isActive", "joiningDate")); - private final String resourceNameForPermissions = "STAFF"; + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "STAFF"; private final PlatformSecurityContext context; private final StaffReadPlatformService readPlatformService; @@ -123,7 +123,7 @@ public class StaffApiResource { @DefaultValue("false") @QueryParam("loanOfficersOnly") @Parameter(description = "loanOfficersOnly") final boolean loanOfficersOnly, @DefaultValue("active") @QueryParam("status") @Parameter(description = "status") final String status) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final Collection staff; if (staffInOfficeHierarchy) { @@ -133,7 +133,7 @@ public class StaffApiResource { } final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, staff, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, staff, RESPONSE_DATA_PARAMETERS); } @POST @@ -164,7 +164,7 @@ public class StaffApiResource { public String retrieveOne(@PathParam("staffId") @Parameter(description = "staffId") final Long staffId, @Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); @@ -173,7 +173,7 @@ public class StaffApiResource { final Collection allowedOffices = this.officeReadPlatformService.retrieveAllOfficesForDropdown(); staff = StaffData.templateData(staff, allowedOffices); } - return this.toApiJsonSerializer.serialize(settings, staff, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, staff, RESPONSE_DATA_PARAMETERS); } @PUT diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/serialization/StaffCommandFromApiJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/serialization/StaffCommandFromApiJsonDeserializer.java index 564fc7b81..2af4b9b4a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/serialization/StaffCommandFromApiJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/serialization/StaffCommandFromApiJsonDeserializer.java @@ -42,11 +42,22 @@ import org.springframework.stereotype.Component; @Component public final class StaffCommandFromApiJsonDeserializer { + public static final String FIRSTNAME = "firstname"; + public static final String LASTNAME = "lastname"; + public static final String OFFICE_ID = "officeId"; + public static final String EXTERNAL_ID = "externalId"; + public static final String MOBILE_NO = "mobileNo"; + public static final String IS_LOAN_OFFICER = "isLoanOfficer"; + public static final String IS_ACTIVE = "isActive"; + public static final String JOINING_DATE = "joiningDate"; + public static final String DATE_FORMAT = "dateFormat"; + public static final String LOCALE = "locale"; + public static final String FORCE_STATUS = "forceStatus"; /** * The parameters supported for this command. */ - private final Set supportedParameters = new HashSet<>(Arrays.asList("firstname", "lastname", "officeId", "externalId", - "mobileNo", "isLoanOfficer", "isActive", "joiningDate", "dateFormat", "locale", "forceStatus")); + private static final Set SUPPORTED_PARAMETERS = new HashSet<>(Arrays.asList(FIRSTNAME, LASTNAME, OFFICE_ID, EXTERNAL_ID, + MOBILE_NO, IS_LOAN_OFFICER, IS_ACTIVE, JOINING_DATE, DATE_FORMAT, LOCALE, FORCE_STATUS)); private final FromJsonHelper fromApiJsonHelper; @@ -64,22 +75,24 @@ public final class StaffCommandFromApiJsonDeserializer { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("staff"); final JsonElement element = this.fromApiJsonHelper.parse(json); - final Long officeId = this.fromApiJsonHelper.extractLongNamed("officeId", element); - baseDataValidator.reset().parameter("officeId").value(officeId).notNull().integerGreaterThanZero(); + final Long officeId = this.fromApiJsonHelper.extractLongNamed(OFFICE_ID, element); + baseDataValidator.reset().parameter(OFFICE_ID).value(officeId).notNull().integerGreaterThanZero(); - final String firstname = this.fromApiJsonHelper.extractStringNamed("firstname", element); - baseDataValidator.reset().parameter("firstname").value(firstname).notBlank().notExceedingLengthOf(50); + final String firstname = this.fromApiJsonHelper.extractStringNamed(FIRSTNAME, element); + baseDataValidator.reset().parameter(FIRSTNAME).value(firstname).notBlank().notExceedingLengthOf(50); - final String lastname = this.fromApiJsonHelper.extractStringNamed("lastname", element); - baseDataValidator.reset().parameter("lastname").value(lastname).notBlank().notExceedingLengthOf(50); + final String lastname = this.fromApiJsonHelper.extractStringNamed(LASTNAME, element); + baseDataValidator.reset().parameter(LASTNAME).value(lastname).notBlank().notExceedingLengthOf(50); if (this.fromApiJsonHelper.parameterExists(ClientApiConstants.mobileNoParamName, element)) { final String mobileNo = this.fromApiJsonHelper.extractStringNamed(ClientApiConstants.mobileNoParamName, element); @@ -87,32 +100,32 @@ public final class StaffCommandFromApiJsonDeserializer { .notExceedingLengthOf(50); } - if (this.fromApiJsonHelper.parameterExists("isLoanOfficer", element)) { - final String loanOfficerFlag = this.fromApiJsonHelper.extractStringNamed("isLoanOfficer", element); - baseDataValidator.reset().parameter("isLoanOfficer").trueOrFalseRequired(loanOfficerFlag); + if (this.fromApiJsonHelper.parameterExists(IS_LOAN_OFFICER, element)) { + final String loanOfficerFlag = this.fromApiJsonHelper.extractStringNamed(IS_LOAN_OFFICER, element); + baseDataValidator.reset().parameter(IS_LOAN_OFFICER).trueOrFalseRequired(loanOfficerFlag); } - if (this.fromApiJsonHelper.parameterExists("isActive", element)) { - final String activeFlag = this.fromApiJsonHelper.extractStringNamed("isActive", element); - baseDataValidator.reset().parameter("isActive").trueOrFalseRequired(activeFlag); + if (this.fromApiJsonHelper.parameterExists(IS_ACTIVE, element)) { + final String activeFlag = this.fromApiJsonHelper.extractStringNamed(IS_ACTIVE, element); + baseDataValidator.reset().parameter(IS_ACTIVE).trueOrFalseRequired(activeFlag); } - final LocalDate joiningDate = this.fromApiJsonHelper.extractLocalDateNamed("joiningDate", element); - baseDataValidator.reset().parameter("joiningDate").value(joiningDate).notNull(); + final LocalDate joiningDate = this.fromApiJsonHelper.extractLocalDateNamed(JOINING_DATE, element); + baseDataValidator.reset().parameter(JOINING_DATE).value(joiningDate).notNull(); - if (this.fromApiJsonHelper.parameterExists("dateFormat", element)) { - final String dateFormat = this.fromApiJsonHelper.extractStringNamed("dateFormat", element); - baseDataValidator.reset().parameter("dateFormat").value(dateFormat).notBlank(); + if (this.fromApiJsonHelper.parameterExists(DATE_FORMAT, element)) { + final String dateFormat = this.fromApiJsonHelper.extractStringNamed(DATE_FORMAT, element); + baseDataValidator.reset().parameter(DATE_FORMAT).value(dateFormat).notBlank(); } - if (this.fromApiJsonHelper.parameterExists("locale", element)) { - final String locale = this.fromApiJsonHelper.extractStringNamed("locale", element); - baseDataValidator.reset().parameter("locale").value(locale).notBlank(); + if (this.fromApiJsonHelper.parameterExists(LOCALE, element)) { + final String locale = this.fromApiJsonHelper.extractStringNamed(LOCALE, element); + baseDataValidator.reset().parameter(LOCALE).value(locale).notBlank(); } - if (this.fromApiJsonHelper.parameterExists("externalId", element)) { - final String externalId = this.fromApiJsonHelper.extractStringNamed("externalId", element); - baseDataValidator.reset().parameter("externalId").value(externalId).notBlank().notExceedingLengthOf(100); + if (this.fromApiJsonHelper.parameterExists(EXTERNAL_ID, element)) { + final String externalId = this.fromApiJsonHelper.extractStringNamed(EXTERNAL_ID, element); + baseDataValidator.reset().parameter(EXTERNAL_ID).value(externalId).notBlank().notExceedingLengthOf(100); } throwExceptionIfValidationWarningsExist(dataValidationErrors); @@ -127,26 +140,28 @@ public final class StaffCommandFromApiJsonDeserializer { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("staff"); final JsonElement element = this.fromApiJsonHelper.parse(json); - if (this.fromApiJsonHelper.parameterExists("officeId", element)) { - final Long officeId = this.fromApiJsonHelper.extractLongNamed("officeId", element); - baseDataValidator.reset().parameter("officeId").value(officeId).notNull().integerGreaterThanZero(); + if (this.fromApiJsonHelper.parameterExists(OFFICE_ID, element)) { + final Long officeId = this.fromApiJsonHelper.extractLongNamed(OFFICE_ID, element); + baseDataValidator.reset().parameter(OFFICE_ID).value(officeId).notNull().integerGreaterThanZero(); } - if (this.fromApiJsonHelper.parameterExists("firstname", element)) { - final String firstname = this.fromApiJsonHelper.extractStringNamed("firstname", element); - baseDataValidator.reset().parameter("firstname").value(firstname).notBlank().notExceedingLengthOf(50); + if (this.fromApiJsonHelper.parameterExists(FIRSTNAME, element)) { + final String firstname = this.fromApiJsonHelper.extractStringNamed(FIRSTNAME, element); + baseDataValidator.reset().parameter(FIRSTNAME).value(firstname).notBlank().notExceedingLengthOf(50); } - if (this.fromApiJsonHelper.parameterExists("lastname", element)) { - final String lastname = this.fromApiJsonHelper.extractStringNamed("lastname", element); - baseDataValidator.reset().parameter("lastname").value(lastname).notBlank().notExceedingLengthOf(50); + if (this.fromApiJsonHelper.parameterExists(LASTNAME, element)) { + final String lastname = this.fromApiJsonHelper.extractStringNamed(LASTNAME, element); + baseDataValidator.reset().parameter(LASTNAME).value(lastname).notBlank().notExceedingLengthOf(50); } if (this.fromApiJsonHelper.parameterExists(ClientApiConstants.mobileNoParamName, element)) { @@ -154,21 +169,21 @@ public final class StaffCommandFromApiJsonDeserializer { baseDataValidator.reset().parameter(ClientApiConstants.mobileNoParamName).value(mobileNo).notExceedingLengthOf(50); } - if (this.fromApiJsonHelper.parameterExists("isLoanOfficer", element)) { - final String loanOfficerFlag = this.fromApiJsonHelper.extractStringNamed("isLoanOfficer", element); - baseDataValidator.reset().parameter("isLoanOfficer").trueOrFalseRequired(loanOfficerFlag); + if (this.fromApiJsonHelper.parameterExists(IS_LOAN_OFFICER, element)) { + final String loanOfficerFlag = this.fromApiJsonHelper.extractStringNamed(IS_LOAN_OFFICER, element); + baseDataValidator.reset().parameter(IS_LOAN_OFFICER).trueOrFalseRequired(loanOfficerFlag); } - if (this.fromApiJsonHelper.parameterExists("isActive", element)) { - final String activeFlagStr = this.fromApiJsonHelper.extractStringNamed("isActive", element); - baseDataValidator.reset().parameter("isActive").trueOrFalseRequired(activeFlagStr); + if (this.fromApiJsonHelper.parameterExists(IS_ACTIVE, element)) { + final String activeFlagStr = this.fromApiJsonHelper.extractStringNamed(IS_ACTIVE, element); + baseDataValidator.reset().parameter(IS_ACTIVE).trueOrFalseRequired(activeFlagStr); - final Boolean activeFlag = this.fromApiJsonHelper.extractBooleanNamed("isActive", element); + final Boolean activeFlag = this.fromApiJsonHelper.extractBooleanNamed(IS_ACTIVE, element); // Need to add here check to see if any clients, group, account and // loans are assigned to this staff if staff is being set to // inactive --LJB - final Boolean forceStatus = this.fromApiJsonHelper.extractBooleanNamed("forceStatus", element); + final Boolean forceStatus = this.fromApiJsonHelper.extractBooleanNamed(FORCE_STATUS, element); if ((!activeFlag && forceStatus == null) || (!activeFlag && forceStatus)) { Object[] result = staffReadPlatformService.hasAssociatedItems(staffId); @@ -177,27 +192,27 @@ public final class StaffCommandFromApiJsonDeserializer { } } - baseDataValidator.reset().parameter("isActive").value(activeFlag).notNull(); + baseDataValidator.reset().parameter(IS_ACTIVE).value(activeFlag).notNull(); } - if (this.fromApiJsonHelper.parameterExists("joiningDate", element)) { - final LocalDate joiningDate = this.fromApiJsonHelper.extractLocalDateNamed("joiningDate", element); - baseDataValidator.reset().parameter("joiningDate").value(joiningDate).notNull(); + if (this.fromApiJsonHelper.parameterExists(JOINING_DATE, element)) { + final LocalDate joiningDate = this.fromApiJsonHelper.extractLocalDateNamed(JOINING_DATE, element); + baseDataValidator.reset().parameter(JOINING_DATE).value(joiningDate).notNull(); } - if (this.fromApiJsonHelper.parameterExists("dateFormat", element)) { - final String dateFormat = this.fromApiJsonHelper.extractStringNamed("dateFormat", element); - baseDataValidator.reset().parameter("dateFormat").value(dateFormat).notBlank(); + if (this.fromApiJsonHelper.parameterExists(DATE_FORMAT, element)) { + final String dateFormat = this.fromApiJsonHelper.extractStringNamed(DATE_FORMAT, element); + baseDataValidator.reset().parameter(DATE_FORMAT).value(dateFormat).notBlank(); } - if (this.fromApiJsonHelper.parameterExists("locale", element)) { - final String locale = this.fromApiJsonHelper.extractStringNamed("locale", element); - baseDataValidator.reset().parameter("locale").value(locale).notBlank(); + if (this.fromApiJsonHelper.parameterExists(LOCALE, element)) { + final String locale = this.fromApiJsonHelper.extractStringNamed(LOCALE, element); + baseDataValidator.reset().parameter(LOCALE).value(locale).notBlank(); } - if (this.fromApiJsonHelper.parameterExists("externalId", element)) { - final String externalId = this.fromApiJsonHelper.extractStringNamed("externalId", element); - baseDataValidator.reset().parameter("externalId").value(externalId).notBlank().notExceedingLengthOf(100); + if (this.fromApiJsonHelper.parameterExists(EXTERNAL_ID, element)) { + final String externalId = this.fromApiJsonHelper.extractStringNamed(EXTERNAL_ID, element); + baseDataValidator.reset().parameter(EXTERNAL_ID).value(externalId).notBlank().notExceedingLengthOf(100); } throwExceptionIfValidationWarningsExist(dataValidationErrors); diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/service/StaffReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/service/StaffReadPlatformServiceImpl.java index 6041fe211..8439da901 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/service/StaffReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/service/StaffReadPlatformServiceImpl.java @@ -28,7 +28,6 @@ import java.util.Map; import org.apache.fineract.infrastructure.core.domain.JdbcSupport; import org.apache.fineract.infrastructure.core.exception.UnrecognizedQueryParamException; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; -import org.apache.fineract.infrastructure.security.utils.ColumnValidator; import org.apache.fineract.infrastructure.security.utils.SQLBuilder; import org.apache.fineract.organisation.staff.data.StaffData; import org.apache.fineract.organisation.staff.exception.StaffNotFoundException; @@ -46,16 +45,13 @@ public class StaffReadPlatformServiceImpl implements StaffReadPlatformService { private final JdbcTemplate jdbcTemplate; private final PlatformSecurityContext context; - private final StaffLookupMapper lookupMapper = new StaffLookupMapper(); - private final StaffInOfficeHierarchyMapper staffInOfficeHierarchyMapper = new StaffInOfficeHierarchyMapper(); - private final ColumnValidator columnValidator; + private static final StaffLookupMapper LOOKUP_MAPPER = new StaffLookupMapper(); + private static final StaffInOfficeHierarchyMapper STAFF_IN_OFFICE_HIERARCHY_MAPPER = new StaffInOfficeHierarchyMapper(); @Autowired - public StaffReadPlatformServiceImpl(final PlatformSecurityContext context, final JdbcTemplate jdbcTemplate, - final ColumnValidator columnValidator) { + public StaffReadPlatformServiceImpl(final PlatformSecurityContext context, final JdbcTemplate jdbcTemplate) { this.context = context; this.jdbcTemplate = jdbcTemplate; - this.columnValidator = columnValidator; } private static final class StaffMapper implements RowMapper { @@ -174,9 +170,9 @@ public class StaffReadPlatformServiceImpl implements StaffReadPlatformService { final Long defaultOfficeId = defaultToUsersOfficeIfNull(officeId); - final String sql = "select " + this.lookupMapper.schema() + " where s.office_id = ? and s.is_active=true and o.hierarchy like ? "; + final String sql = "select " + LOOKUP_MAPPER.schema() + " where s.office_id = ? and s.is_active=true and o.hierarchy like ? "; - return this.jdbcTemplate.query(sql, this.lookupMapper, new Object[] { defaultOfficeId, hierarchy }); // NOSONAR + return this.jdbcTemplate.query(sql, LOOKUP_MAPPER, defaultOfficeId, hierarchy); // NOSONAR } private Long defaultToUsersOfficeIfNull(final Long officeId) { @@ -199,7 +195,7 @@ public class StaffReadPlatformServiceImpl implements StaffReadPlatformService { final StaffMapper rm = new StaffMapper(); final String sql = "select " + rm.schema() + " where s.id = ? and o.hierarchy like ? "; - return this.jdbcTemplate.queryForObject(sql, rm, new Object[] { staffId, hierarchy }); // NOSONAR + return this.jdbcTemplate.queryForObject(sql, rm, staffId, hierarchy); // NOSONAR } catch (final EmptyResultDataAccessException e) { throw new StaffNotFoundException(staffId, e); } @@ -246,7 +242,7 @@ public class StaffReadPlatformServiceImpl implements StaffReadPlatformService { extraCriteria.addCriteria(" s.is_active =", false); } else { if (!status.equalsIgnoreCase("all")) { - throw new UnrecognizedQueryParamException("status", status, new Object[] { "all", "active", "inactive" }); + throw new UnrecognizedQueryParamException("status", status, "all", "active", "inactive"); } } } @@ -257,14 +253,14 @@ public class StaffReadPlatformServiceImpl implements StaffReadPlatformService { @Override public Collection retrieveAllStaffInOfficeAndItsParentOfficeHierarchy(final Long officeId, final boolean loanOfficersOnly) { - String sql = "select " + this.staffInOfficeHierarchyMapper.schema(loanOfficersOnly); + String sql = "select " + STAFF_IN_OFFICE_HIERARCHY_MAPPER.schema(loanOfficersOnly); sql = sql + " order by s.lastname"; - return this.jdbcTemplate.query(sql, this.staffInOfficeHierarchyMapper, new Object[] { officeId }); // NOSONAR + return this.jdbcTemplate.query(sql, STAFF_IN_OFFICE_HIERARCHY_MAPPER, officeId); // NOSONAR } @Override public Object[] hasAssociatedItems(final Long staffId) { - ArrayList params = new ArrayList(); + ArrayList params = new ArrayList<>(); String sql = "select c.display_name as client, g.display_name as grp,l.loan_officer_id as loan, s.field_officer_id as sav" + " from m_staff staff " + " left outer join m_client c on staff.id = c.staff_id AND c.status_enum < ? " @@ -273,8 +269,8 @@ public class StaffReadPlatformServiceImpl implements StaffReadPlatformService { + " left outer join m_savings_account s on c.staff_id = s.field_officer_id and s.status_enum < ? " + " where staff.id = ? " + " group by staff.id, client, grp, loan, sav"; - List> result = this.jdbcTemplate.queryForList(sql, new Object[] { ClientStatus.CLOSED.getValue(), - LoanStatus.WITHDRAWN_BY_CLIENT.getValue(), SavingsAccountStatusType.WITHDRAWN_BY_APPLICANT.getValue(), staffId }); + List> result = this.jdbcTemplate.queryForList(sql, ClientStatus.CLOSED.getValue(), + LoanStatus.WITHDRAWN_BY_CLIENT.getValue(), SavingsAccountStatusType.WITHDRAWN_BY_APPLICANT.getValue(), staffId); if (result != null) { for (Map map : result) { if (map.get("client") != null) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/serialization/TellerCommandFromApiJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/serialization/TellerCommandFromApiJsonDeserializer.java index a470e6fc2..0fccf5425 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/serialization/TellerCommandFromApiJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/serialization/TellerCommandFromApiJsonDeserializer.java @@ -46,13 +46,33 @@ import org.springframework.stereotype.Component; @Component public final class TellerCommandFromApiJsonDeserializer { + public static final String OFFICE_ID = "officeId"; + public static final String NAME = "name"; + public static final String DESCRIPTION = "description"; + public static final String START_DATE = "startDate"; + public static final String END_DATE = "endDate"; + public static final String STATUS = "status"; + public static final String DATE_FORMAT = "dateFormat"; + public static final String LOCALE = "locale"; + public static final String IS_FULL_DAY = "isFullDay"; + public static final String STAFF_ID = "staffId"; + public static final String ENTITY_TYPE = "entityType"; + public static final String ENTITY_ID = "entityId"; + public static final String CURRENCY_CODE = "currencyCode"; + public static final String HOUR_START_TIME = "hourStartTime"; + public static final String MIN_START_TIME = "minStartTime"; + public static final String HOUR_END_TIME = "hourEndTime"; + public static final String MIN_END_TIME = "minEndTime"; + public static final String TXN_AMOUNT = "txnAmount"; + public static final String TXN_DATE = "txnDate"; + public static final String TXN_NOTE = "txnNote"; + public static final String TELLER = "teller"; /** * The parameters supported for this command. */ - private final Set supportedParameters = new HashSet<>(Arrays.asList("officeId", "name", "description", "startDate", "endDate", - "status", "dateFormat", "locale", "isFullDay", "staffId", "hourStartTime", "minStartTime", "hourEndTime", "minEndTime", - "txnAmount", "txnDate", "txnNote", "entityType", "entityId", "currencyCode")); - + private static final Set SUPPORTED_PARAMETERS = new HashSet<>(Arrays.asList(OFFICE_ID, NAME, DESCRIPTION, START_DATE, END_DATE, + STATUS, DATE_FORMAT, LOCALE, IS_FULL_DAY, STAFF_ID, HOUR_START_TIME, MIN_START_TIME, HOUR_END_TIME, MIN_END_TIME, TXN_AMOUNT, + TXN_DATE, TXN_NOTE, ENTITY_TYPE, ENTITY_ID, CURRENCY_CODE)); private final FromJsonHelper fromApiJsonHelper; @Autowired @@ -65,36 +85,36 @@ public final class TellerCommandFromApiJsonDeserializer { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("teller"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(TELLER); final JsonElement element = this.fromApiJsonHelper.parse(json); - final Long officeId = this.fromApiJsonHelper.extractLongNamed("officeId", element); - baseDataValidator.reset().parameter("officeId").value(officeId).notNull().integerGreaterThanZero(); + final Long officeId = this.fromApiJsonHelper.extractLongNamed(OFFICE_ID, element); + baseDataValidator.reset().parameter(OFFICE_ID).value(officeId).notNull().integerGreaterThanZero(); - final String name = this.fromApiJsonHelper.extractStringNamed("name", element); - baseDataValidator.reset().parameter("name").value(name).notBlank().notExceedingLengthOf(50); + final String name = this.fromApiJsonHelper.extractStringNamed(NAME, element); + baseDataValidator.reset().parameter(NAME).value(name).notBlank().notExceedingLengthOf(50); - final String description = this.fromApiJsonHelper.extractStringNamed("description", element); - baseDataValidator.reset().parameter("description").value(description).notExceedingLengthOf(100); + final String description = this.fromApiJsonHelper.extractStringNamed(DESCRIPTION, element); + baseDataValidator.reset().parameter(DESCRIPTION).value(description).notExceedingLengthOf(100); - final LocalDate startDate = this.fromApiJsonHelper.extractLocalDateNamed("startDate", element); - baseDataValidator.reset().parameter("startDate").value(startDate).notNull(); + final LocalDate startDate = this.fromApiJsonHelper.extractLocalDateNamed(START_DATE, element); + baseDataValidator.reset().parameter(START_DATE).value(startDate).notNull(); - final LocalDate endDate = this.fromApiJsonHelper.extractLocalDateNamed("endDate", element); - baseDataValidator.reset().parameter("endDate").value(endDate).ignoreIfNull(); + final LocalDate endDate = this.fromApiJsonHelper.extractLocalDateNamed(END_DATE, element); + baseDataValidator.reset().parameter(END_DATE).value(endDate).ignoreIfNull(); - final String status = this.fromApiJsonHelper.extractStringNamed("status", element); - baseDataValidator.reset().parameter("status").value(status).notBlank().notExceedingLengthOf(50); + final String status = this.fromApiJsonHelper.extractStringNamed(STATUS, element); + baseDataValidator.reset().parameter(STATUS).value(status).notBlank().notExceedingLengthOf(50); - if (endDate != null) { - if (endDate.isBefore(startDate)) { - throw new InvalidDateInputException(startDate.toString(), endDate.toString()); - } + if (endDate != null && endDate.isBefore(startDate)) { + throw new InvalidDateInputException(startDate.toString(), endDate.toString()); } throwExceptionIfValidationWarningsExist(dataValidationErrors); } @@ -111,38 +131,40 @@ public final class TellerCommandFromApiJsonDeserializer { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("teller"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(TELLER); final JsonElement element = this.fromApiJsonHelper.parse(json); - final Long staffId = this.fromApiJsonHelper.extractLongNamed("staffId", element); - baseDataValidator.reset().parameter("staffId").value(staffId).notNull().integerGreaterThanZero(); + final Long staffId = this.fromApiJsonHelper.extractLongNamed(STAFF_ID, element); + baseDataValidator.reset().parameter(STAFF_ID).value(staffId).notNull().integerGreaterThanZero(); - final String description = this.fromApiJsonHelper.extractStringNamed("description", element); - baseDataValidator.reset().parameter("description").value(description).notExceedingLengthOf(100); + final String description = this.fromApiJsonHelper.extractStringNamed(DESCRIPTION, element); + baseDataValidator.reset().parameter(DESCRIPTION).value(description).notExceedingLengthOf(100); - final LocalDate startDate = this.fromApiJsonHelper.extractLocalDateNamed("startDate", element); - baseDataValidator.reset().parameter("startDate").value(startDate).notNull(); + final LocalDate startDate = this.fromApiJsonHelper.extractLocalDateNamed(START_DATE, element); + baseDataValidator.reset().parameter(START_DATE).value(startDate).notNull(); - final LocalDate endDate = this.fromApiJsonHelper.extractLocalDateNamed("endDate", element); - baseDataValidator.reset().parameter("endDate").value(endDate).notNull(); + final LocalDate endDate = this.fromApiJsonHelper.extractLocalDateNamed(END_DATE, element); + baseDataValidator.reset().parameter(END_DATE).value(endDate).notNull(); - final Boolean isFullDay = this.fromApiJsonHelper.extractBooleanNamed("isFullDay", element); - baseDataValidator.reset().parameter("isFullDay").value(isFullDay).notNull(); + final Boolean isFullDay = this.fromApiJsonHelper.extractBooleanNamed(IS_FULL_DAY, element); + baseDataValidator.reset().parameter(IS_FULL_DAY).value(isFullDay).notNull(); if (!isFullDay) { - final String hourStartTime = this.fromApiJsonHelper.extractStringNamed("hourStartTime", element); + final String hourStartTime = this.fromApiJsonHelper.extractStringNamed(HOUR_START_TIME, element); baseDataValidator.reset().parameter("startTime").value(hourStartTime).notBlank(); - final String minStartTime = this.fromApiJsonHelper.extractStringNamed("minStartTime", element); + final String minStartTime = this.fromApiJsonHelper.extractStringNamed(MIN_START_TIME, element); baseDataValidator.reset().parameter("startTime").value(minStartTime).notBlank(); - final String hourEndTime = this.fromApiJsonHelper.extractStringNamed("hourEndTime", element); - baseDataValidator.reset().parameter("hourEndTime").value(hourEndTime).notBlank(); - final String minEndTime = this.fromApiJsonHelper.extractStringNamed("minEndTime", element); - baseDataValidator.reset().parameter("minEndTime").value(minEndTime).notBlank(); + final String hourEndTime = this.fromApiJsonHelper.extractStringNamed(HOUR_END_TIME, element); + baseDataValidator.reset().parameter(HOUR_END_TIME).value(hourEndTime).notBlank(); + final String minEndTime = this.fromApiJsonHelper.extractStringNamed(MIN_END_TIME, element); + baseDataValidator.reset().parameter(MIN_END_TIME).value(minEndTime).notBlank(); } @@ -154,24 +176,26 @@ public final class TellerCommandFromApiJsonDeserializer { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("teller"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(TELLER); final JsonElement element = this.fromApiJsonHelper.parse(json); - final BigDecimal txnAmount = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("txnAmount", element); - baseDataValidator.reset().parameter("txnAmount").value(txnAmount).notNull(); + final BigDecimal txnAmount = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(TXN_AMOUNT, element); + baseDataValidator.reset().parameter(TXN_AMOUNT).value(txnAmount).notNull(); - final LocalDate txnDate = this.fromApiJsonHelper.extractLocalDateNamed("txnDate", element); - baseDataValidator.reset().parameter("txnDate").value(txnDate).notNull(); + final LocalDate txnDate = this.fromApiJsonHelper.extractLocalDateNamed(TXN_DATE, element); + baseDataValidator.reset().parameter(TXN_DATE).value(txnDate).notNull(); - final String txnNote = this.fromApiJsonHelper.extractStringNamed("txnNote", element); - baseDataValidator.reset().parameter("txnNote").value(txnNote).notExceedingLengthOf(200); + final String txnNote = this.fromApiJsonHelper.extractStringNamed(TXN_NOTE, element); + baseDataValidator.reset().parameter(TXN_NOTE).value(txnNote).notExceedingLengthOf(200); - final String currencyCode = this.fromApiJsonHelper.extractStringNamed("currencyCode", element); - baseDataValidator.reset().parameter("currencyCode").value(currencyCode).notExceedingLengthOf(3); + final String currencyCode = this.fromApiJsonHelper.extractStringNamed(CURRENCY_CODE, element); + baseDataValidator.reset().parameter(CURRENCY_CODE).value(currencyCode).notExceedingLengthOf(3); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/AccountTransfersReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/AccountTransfersReadPlatformServiceImpl.java index a3862c379..a5498fb22 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/AccountTransfersReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/AccountTransfersReadPlatformServiceImpl.java @@ -26,7 +26,6 @@ import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.List; import org.apache.fineract.infrastructure.core.data.EnumOptionData; import org.apache.fineract.infrastructure.core.domain.JdbcSupport; import org.apache.fineract.infrastructure.core.service.DateUtils; @@ -56,19 +55,17 @@ import org.springframework.util.CollectionUtils; @Service public class AccountTransfersReadPlatformServiceImpl implements AccountTransfersReadPlatformService { + private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); private final JdbcTemplate jdbcTemplate; private final ClientReadPlatformService clientReadPlatformService; private final OfficeReadPlatformService officeReadPlatformService; private final PortfolioAccountReadPlatformService portfolioAccountReadPlatformService; private final ColumnValidator columnValidator; private final DatabaseSpecificSQLGenerator sqlGenerator; - // mapper private final AccountTransfersMapper accountTransfersMapper; - // pagination private final PaginationHelper paginationHelper; - private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); @Autowired public AccountTransfersReadPlatformServiceImpl(final JdbcTemplate jdbcTemplate, @@ -260,137 +257,14 @@ public class AccountTransfersReadPlatformServiceImpl implements AccountTransfers public Collection fetchPostInterestTransactionIds(final Long accountId) { final String sql = "select att.from_savings_transaction_id from m_account_transfer_transaction att inner join m_account_transfer_details atd on atd.id = att.account_transfer_details_id where atd.from_savings_account_id=? and att.is_reversed = false and atd.transfer_type = ?"; - final List transactionId = this.jdbcTemplate.queryForList(sql, Long.class, accountId, - AccountTransferType.INTEREST_TRANSFER.getValue()); - - return transactionId; + return this.jdbcTemplate.queryForList(sql, Long.class, accountId, AccountTransferType.INTEREST_TRANSFER.getValue()); } @Override public Collection fetchPostInterestTransactionIdsWithPivotDate(final Long accountId, final LocalDate pivotDate) { final String sql = "select att.from_savings_transaction_id from m_account_transfer_transaction att inner join m_account_transfer_details atd on atd.id = att.account_transfer_details_id where atd.from_savings_account_id=? and att.is_reversed = false and atd.transfer_type = ? and att.transaction_date >= ?"; - final List transactionIds = this.jdbcTemplate.queryForList(sql, Long.class, accountId, - AccountTransferType.INTEREST_TRANSFER.getValue(), pivotDate); - - return transactionIds; - } - - private static final class AccountTransfersMapper implements RowMapper { - - private final String schemaSql; - - AccountTransfersMapper() { - final StringBuilder sqlBuilder = new StringBuilder(400); - sqlBuilder.append("att.id as id, att.is_reversed as isReversed,"); - sqlBuilder.append("att.transaction_date as transferDate, att.amount as transferAmount,"); - sqlBuilder.append("att.description as transferDescription,"); - sqlBuilder.append("att.currency_code as currencyCode, att.currency_digits as currencyDigits,"); - sqlBuilder.append("att.currency_multiplesof as inMultiplesOf, "); - sqlBuilder.append("curr.name as currencyName, curr.internationalized_name_code as currencyNameCode, "); - sqlBuilder.append("curr.display_symbol as currencyDisplaySymbol, "); - sqlBuilder.append("fromoff.id as fromOfficeId, fromoff.name as fromOfficeName,"); - sqlBuilder.append("tooff.id as toOfficeId, tooff.name as toOfficeName,"); - sqlBuilder.append("fromclient.id as fromClientId, fromclient.display_name as fromClientName,"); - sqlBuilder.append("toclient.id as toClientId, toclient.display_name as toClientName,"); - sqlBuilder.append("fromsavacc.id as fromSavingsAccountId, fromsavacc.account_no as fromSavingsAccountNo,"); - sqlBuilder.append("fromloanacc.id as fromLoanAccountId, fromloanacc.account_no as fromLoanAccountNo,"); - sqlBuilder.append("tosavacc.id as toSavingsAccountId, tosavacc.account_no as toSavingsAccountNo,"); - sqlBuilder.append("toloanacc.id as toLoanAccountId, toloanacc.account_no as toLoanAccountNo,"); - sqlBuilder.append("fromsavtran.id as fromSavingsAccountTransactionId,"); - sqlBuilder.append("fromsavtran.transaction_type_enum as fromSavingsAccountTransactionType,"); - sqlBuilder.append("tosavtran.id as toSavingsAccountTransactionId,"); - sqlBuilder.append("tosavtran.transaction_type_enum as toSavingsAccountTransactionType"); - sqlBuilder.append(" FROM m_account_transfer_transaction att "); - sqlBuilder.append("left join m_account_transfer_details atd on atd.id = att.account_transfer_details_id "); - sqlBuilder.append("join m_currency curr on curr.code = att.currency_code "); - sqlBuilder.append("join m_office fromoff on fromoff.id = atd.from_office_id "); - sqlBuilder.append("join m_office tooff on tooff.id = atd.to_office_id "); - sqlBuilder.append("join m_client fromclient on fromclient.id = atd.from_client_id "); - sqlBuilder.append("join m_client toclient on toclient.id = atd.to_client_id "); - sqlBuilder.append("left join m_savings_account fromsavacc on fromsavacc.id = atd.from_savings_account_id "); - sqlBuilder.append("left join m_loan fromloanacc on fromloanacc.id = atd.from_loan_account_id "); - sqlBuilder.append("left join m_savings_account tosavacc on tosavacc.id = atd.to_savings_account_id "); - sqlBuilder.append("left join m_loan toloanacc on toloanacc.id = atd.to_loan_account_id "); - sqlBuilder.append("left join m_savings_account_transaction fromsavtran on fromsavtran.id = att.from_savings_transaction_id "); - sqlBuilder.append("left join m_savings_account_transaction tosavtran on tosavtran.id = att.to_savings_transaction_id "); - sqlBuilder.append("left join m_loan_transaction fromloantran on fromloantran.id = att.from_savings_transaction_id "); - sqlBuilder.append("left join m_loan_transaction toloantran on toloantran.id = att.to_savings_transaction_id "); - - this.schemaSql = sqlBuilder.toString(); - } - - public String schema() { - return this.schemaSql; - } - - @Override - public AccountTransferData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException { - - final Long id = rs.getLong("id"); - final boolean reversed = rs.getBoolean("isReversed"); - - final LocalDate transferDate = JdbcSupport.getLocalDate(rs, "transferDate"); - final BigDecimal transferAmount = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "transferAmount"); - final String transferDescription = rs.getString("transferDescription"); - - final String currencyCode = rs.getString("currencyCode"); - final String currencyName = rs.getString("currencyName"); - final String currencyNameCode = rs.getString("currencyNameCode"); - final String currencyDisplaySymbol = rs.getString("currencyDisplaySymbol"); - final Integer currencyDigits = JdbcSupport.getInteger(rs, "currencyDigits"); - final Integer inMultiplesOf = JdbcSupport.getInteger(rs, "inMultiplesOf"); - final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDigits, inMultiplesOf, currencyDisplaySymbol, - currencyNameCode); - - final Long fromOfficeId = JdbcSupport.getLong(rs, "fromOfficeId"); - final String fromOfficeName = rs.getString("fromOfficeName"); - final OfficeData fromOffice = OfficeData.dropdown(fromOfficeId, fromOfficeName, null); - - final Long toOfficeId = JdbcSupport.getLong(rs, "toOfficeId"); - final String toOfficeName = rs.getString("toOfficeName"); - final OfficeData toOffice = OfficeData.dropdown(toOfficeId, toOfficeName, null); - - final Long fromClientId = JdbcSupport.getLong(rs, "fromClientId"); - final String fromClientName = rs.getString("fromClientName"); - final ClientData fromClient = ClientData.lookup(fromClientId, fromClientName, fromOfficeId, fromOfficeName); - - final Long toClientId = JdbcSupport.getLong(rs, "toClientId"); - final String toClientName = rs.getString("toClientName"); - final ClientData toClient = ClientData.lookup(toClientId, toClientName, toOfficeId, toOfficeName); - - final Long fromSavingsAccountId = JdbcSupport.getLong(rs, "fromSavingsAccountId"); - final String fromSavingsAccountNo = rs.getString("fromSavingsAccountNo"); - final Long fromLoanAccountId = JdbcSupport.getLong(rs, "fromLoanAccountId"); - final String fromLoanAccountNo = rs.getString("fromLoanAccountNo"); - PortfolioAccountData fromAccount = null; - EnumOptionData fromAccountType = null; - if (fromSavingsAccountId != null) { - fromAccount = PortfolioAccountData.lookup(fromSavingsAccountId, fromSavingsAccountNo); - fromAccountType = AccountTransferEnumerations.accountType(PortfolioAccountType.SAVINGS); - } else if (fromLoanAccountId != null) { - fromAccount = PortfolioAccountData.lookup(fromLoanAccountId, fromLoanAccountNo); - fromAccountType = AccountTransferEnumerations.accountType(PortfolioAccountType.LOAN); - } - - PortfolioAccountData toAccount = null; - EnumOptionData toAccountType = null; - final Long toSavingsAccountId = JdbcSupport.getLong(rs, "toSavingsAccountId"); - final String toSavingsAccountNo = rs.getString("toSavingsAccountNo"); - final Long toLoanAccountId = JdbcSupport.getLong(rs, "toLoanAccountId"); - final String toLoanAccountNo = rs.getString("toLoanAccountNo"); - - if (toSavingsAccountId != null) { - toAccount = PortfolioAccountData.lookup(toSavingsAccountId, toSavingsAccountNo); - toAccountType = AccountTransferEnumerations.accountType(PortfolioAccountType.SAVINGS); - } else if (toLoanAccountId != null) { - toAccount = PortfolioAccountData.lookup(toLoanAccountId, toLoanAccountNo); - toAccountType = AccountTransferEnumerations.accountType(PortfolioAccountType.LOAN); - } - - return AccountTransferData.instance(id, reversed, transferDate, currency, transferAmount, transferDescription, fromOffice, - toOffice, fromClient, toClient, fromAccountType, fromAccount, toAccountType, toAccount); - } + return this.jdbcTemplate.queryForList(sql, Long.class, accountId, AccountTransferType.INTEREST_TRANSFER.getValue(), pivotDate); } @Override @@ -561,8 +435,125 @@ public class AccountTransfersReadPlatformServiceImpl implements AccountTransfers sqlBuilder.append(" and trans.transaction_date = ? "); sqlBuilder.append(" and IF(1=?, det.from_loan_account_id = ?, det.from_savings_account_id = ?) "); - return this.jdbcTemplate.queryForObject(sqlBuilder.toString(), BigDecimal.class, this.formatter.format(transactionDate), + return this.jdbcTemplate.queryForObject(sqlBuilder.toString(), BigDecimal.class, DATE_TIME_FORMATTER.format(transactionDate), accountType, accountId, accountId); } + private static final class AccountTransfersMapper implements RowMapper { + + private final String schemaSql; + + AccountTransfersMapper() { + final StringBuilder sqlBuilder = new StringBuilder(400); + sqlBuilder.append("att.id as id, att.is_reversed as isReversed,"); + sqlBuilder.append("att.transaction_date as transferDate, att.amount as transferAmount,"); + sqlBuilder.append("att.description as transferDescription,"); + sqlBuilder.append("att.currency_code as currencyCode, att.currency_digits as currencyDigits,"); + sqlBuilder.append("att.currency_multiplesof as inMultiplesOf, "); + sqlBuilder.append("curr.name as currencyName, curr.internationalized_name_code as currencyNameCode, "); + sqlBuilder.append("curr.display_symbol as currencyDisplaySymbol, "); + sqlBuilder.append("fromoff.id as fromOfficeId, fromoff.name as fromOfficeName,"); + sqlBuilder.append("tooff.id as toOfficeId, tooff.name as toOfficeName,"); + sqlBuilder.append("fromclient.id as fromClientId, fromclient.display_name as fromClientName,"); + sqlBuilder.append("toclient.id as toClientId, toclient.display_name as toClientName,"); + sqlBuilder.append("fromsavacc.id as fromSavingsAccountId, fromsavacc.account_no as fromSavingsAccountNo,"); + sqlBuilder.append("fromloanacc.id as fromLoanAccountId, fromloanacc.account_no as fromLoanAccountNo,"); + sqlBuilder.append("tosavacc.id as toSavingsAccountId, tosavacc.account_no as toSavingsAccountNo,"); + sqlBuilder.append("toloanacc.id as toLoanAccountId, toloanacc.account_no as toLoanAccountNo,"); + sqlBuilder.append("fromsavtran.id as fromSavingsAccountTransactionId,"); + sqlBuilder.append("fromsavtran.transaction_type_enum as fromSavingsAccountTransactionType,"); + sqlBuilder.append("tosavtran.id as toSavingsAccountTransactionId,"); + sqlBuilder.append("tosavtran.transaction_type_enum as toSavingsAccountTransactionType"); + sqlBuilder.append(" FROM m_account_transfer_transaction att "); + sqlBuilder.append("left join m_account_transfer_details atd on atd.id = att.account_transfer_details_id "); + sqlBuilder.append("join m_currency curr on curr.code = att.currency_code "); + sqlBuilder.append("join m_office fromoff on fromoff.id = atd.from_office_id "); + sqlBuilder.append("join m_office tooff on tooff.id = atd.to_office_id "); + sqlBuilder.append("join m_client fromclient on fromclient.id = atd.from_client_id "); + sqlBuilder.append("join m_client toclient on toclient.id = atd.to_client_id "); + sqlBuilder.append("left join m_savings_account fromsavacc on fromsavacc.id = atd.from_savings_account_id "); + sqlBuilder.append("left join m_loan fromloanacc on fromloanacc.id = atd.from_loan_account_id "); + sqlBuilder.append("left join m_savings_account tosavacc on tosavacc.id = atd.to_savings_account_id "); + sqlBuilder.append("left join m_loan toloanacc on toloanacc.id = atd.to_loan_account_id "); + sqlBuilder.append("left join m_savings_account_transaction fromsavtran on fromsavtran.id = att.from_savings_transaction_id "); + sqlBuilder.append("left join m_savings_account_transaction tosavtran on tosavtran.id = att.to_savings_transaction_id "); + sqlBuilder.append("left join m_loan_transaction fromloantran on fromloantran.id = att.from_savings_transaction_id "); + sqlBuilder.append("left join m_loan_transaction toloantran on toloantran.id = att.to_savings_transaction_id "); + + this.schemaSql = sqlBuilder.toString(); + } + + public String schema() { + return this.schemaSql; + } + + @Override + public AccountTransferData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException { + + final Long id = rs.getLong("id"); + final boolean reversed = rs.getBoolean("isReversed"); + + final LocalDate transferDate = JdbcSupport.getLocalDate(rs, "transferDate"); + final BigDecimal transferAmount = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "transferAmount"); + final String transferDescription = rs.getString("transferDescription"); + + final String currencyCode = rs.getString("currencyCode"); + final String currencyName = rs.getString("currencyName"); + final String currencyNameCode = rs.getString("currencyNameCode"); + final String currencyDisplaySymbol = rs.getString("currencyDisplaySymbol"); + final Integer currencyDigits = JdbcSupport.getInteger(rs, "currencyDigits"); + final Integer inMultiplesOf = JdbcSupport.getInteger(rs, "inMultiplesOf"); + final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDigits, inMultiplesOf, currencyDisplaySymbol, + currencyNameCode); + + final Long fromOfficeId = JdbcSupport.getLong(rs, "fromOfficeId"); + final String fromOfficeName = rs.getString("fromOfficeName"); + final OfficeData fromOffice = OfficeData.dropdown(fromOfficeId, fromOfficeName, null); + + final Long toOfficeId = JdbcSupport.getLong(rs, "toOfficeId"); + final String toOfficeName = rs.getString("toOfficeName"); + final OfficeData toOffice = OfficeData.dropdown(toOfficeId, toOfficeName, null); + + final Long fromClientId = JdbcSupport.getLong(rs, "fromClientId"); + final String fromClientName = rs.getString("fromClientName"); + final ClientData fromClient = ClientData.lookup(fromClientId, fromClientName, fromOfficeId, fromOfficeName); + + final Long toClientId = JdbcSupport.getLong(rs, "toClientId"); + final String toClientName = rs.getString("toClientName"); + final ClientData toClient = ClientData.lookup(toClientId, toClientName, toOfficeId, toOfficeName); + + final Long fromSavingsAccountId = JdbcSupport.getLong(rs, "fromSavingsAccountId"); + final String fromSavingsAccountNo = rs.getString("fromSavingsAccountNo"); + final Long fromLoanAccountId = JdbcSupport.getLong(rs, "fromLoanAccountId"); + final String fromLoanAccountNo = rs.getString("fromLoanAccountNo"); + PortfolioAccountData fromAccount = null; + EnumOptionData fromAccountType = null; + if (fromSavingsAccountId != null) { + fromAccount = PortfolioAccountData.lookup(fromSavingsAccountId, fromSavingsAccountNo); + fromAccountType = AccountTransferEnumerations.accountType(PortfolioAccountType.SAVINGS); + } else if (fromLoanAccountId != null) { + fromAccount = PortfolioAccountData.lookup(fromLoanAccountId, fromLoanAccountNo); + fromAccountType = AccountTransferEnumerations.accountType(PortfolioAccountType.LOAN); + } + + PortfolioAccountData toAccount = null; + EnumOptionData toAccountType = null; + final Long toSavingsAccountId = JdbcSupport.getLong(rs, "toSavingsAccountId"); + final String toSavingsAccountNo = rs.getString("toSavingsAccountNo"); + final Long toLoanAccountId = JdbcSupport.getLong(rs, "toLoanAccountId"); + final String toLoanAccountNo = rs.getString("toLoanAccountNo"); + + if (toSavingsAccountId != null) { + toAccount = PortfolioAccountData.lookup(toSavingsAccountId, toSavingsAccountNo); + toAccountType = AccountTransferEnumerations.accountType(PortfolioAccountType.SAVINGS); + } else if (toLoanAccountId != null) { + toAccount = PortfolioAccountData.lookup(toLoanAccountId, toLoanAccountNo); + toAccountType = AccountTransferEnumerations.accountType(PortfolioAccountType.LOAN); + } + + return AccountTransferData.instance(id, reversed, transferDate, currency, transferAmount, transferDescription, fromOffice, + toOffice, fromClient, toClient, fromAccountType, fromAccount, toAccountType, toAccount); + } + } + } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/api/EntityFieldConfigurationApiResources.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/api/EntityFieldConfigurationApiResources.java index f0be2b722..9709abb2f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/api/EntityFieldConfigurationApiResources.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/api/EntityFieldConfigurationApiResources.java @@ -38,12 +38,10 @@ import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.UriInfo; -import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService; import org.apache.fineract.infrastructure.core.api.ApiRequestParameterHelper; import org.apache.fineract.infrastructure.core.serialization.ApiRequestJsonSerializationSettings; import org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; -import org.apache.fineract.portfolio.address.data.AddressData; import org.apache.fineract.portfolio.address.data.FieldConfigurationData; import org.apache.fineract.portfolio.address.service.FieldConfigurationReadPlatformService; import org.springframework.beans.factory.annotation.Autowired; @@ -58,30 +56,24 @@ import org.springframework.stereotype.Component; + "add regular expression for validation") public class EntityFieldConfigurationApiResources { - private final Set responseDataParameters = new HashSet<>( + private static final Set RESPONSE_DATA_PARAMETERS = new HashSet<>( Arrays.asList("clientAddressId", "client_id", "address_id", "address_type_id", "isActive", "fieldConfigurationId", "entity", "table", "field", "is_enabled", "is_mandatory", "validation_regex")); - private final String resourceNameForPermissions = "Address"; + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "Address"; private final PlatformSecurityContext context; - private final DefaultToApiJsonSerializer toApiJsonSerializer; private final FieldConfigurationReadPlatformService readPlatformServicefld; private final DefaultToApiJsonSerializer toApiJsonSerializerfld; private final ApiRequestParameterHelper apiRequestParameterHelper; - private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; @Autowired public EntityFieldConfigurationApiResources(final PlatformSecurityContext context, - final DefaultToApiJsonSerializer toApiJsonSerializer, final FieldConfigurationReadPlatformService readPlatformServicefld, final DefaultToApiJsonSerializer toApiJsonSerializerfld, - final ApiRequestParameterHelper apiRequestParameterHelper, - final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService) { + final ApiRequestParameterHelper apiRequestParameterHelper) { this.context = context; - this.toApiJsonSerializer = toApiJsonSerializer; this.readPlatformServicefld = readPlatformServicefld; this.toApiJsonSerializerfld = toApiJsonSerializerfld; this.apiRequestParameterHelper = apiRequestParameterHelper; - this.commandsSourceWritePlatformService = commandsSourceWritePlatformService; } @GET @@ -92,12 +84,12 @@ public class EntityFieldConfigurationApiResources { @ApiResponse(responseCode = "200", description = "OK", content = @Content(array = @ArraySchema(schema = @Schema(implementation = EntityFieldConfigurationApiResourcesSwagger.GetFieldConfigurationEntityResponse.class)))) }) public String getAddresses(@PathParam("entity") @Parameter(description = "entity") final String entityname, @Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final Collection fldconfig = this.readPlatformServicefld.retrieveFieldConfiguration(entityname); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializerfld.serialize(settings, fldconfig, this.responseDataParameters); + return this.toApiJsonSerializerfld.serialize(settings, fldconfig, RESPONSE_DATA_PARAMETERS); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/api/CalendarsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/api/CalendarsApiResource.java index fde3a6efe..f85c84ed4 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/api/CalendarsApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/api/CalendarsApiResource.java @@ -69,12 +69,13 @@ public class CalendarsApiResource { /** * The set of parameters that are supported in response for {@link Calendar} */ - private final Set responseDataParameters = new HashSet<>(Arrays.asList("id", "entityId", "entityType", "title", "description", - "location", "startDate", "endDate", "duration", "type", "repeating", "recurrence", "frequency", "interval", "repeatsOnDay", - "remindBy", "firstReminder", "secondReminder", "humanReadable", "createdDate", "lastUpdatedDate", "createdByUserId", - "createdByUsername", "lastUpdatedByUserId", "lastUpdatedByUsername", "recurringDates", "nextTenRecurringDates", - "entityTypeOptions", "calendarTypeOptions", "remindByOptions", "frequencyOptions", "repeatsOnDayOptions")); - private final String resourceNameForPermissions = "CALENDAR"; + private static final Set RESPONSE_DATA_PARAMETERS = new HashSet<>( + Arrays.asList("id", "entityId", "entityType", "title", "description", "location", "startDate", "endDate", "duration", "type", + "repeating", "recurrence", "frequency", "interval", "repeatsOnDay", "remindBy", "firstReminder", "secondReminder", + "humanReadable", "createdDate", "lastUpdatedDate", "createdByUserId", "createdByUsername", "lastUpdatedByUserId", + "lastUpdatedByUsername", "recurringDates", "nextTenRecurringDates", "entityTypeOptions", "calendarTypeOptions", + "remindByOptions", "frequencyOptions", "repeatsOnDayOptions")); + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "CALENDAR"; private final PlatformSecurityContext context; private final CalendarReadPlatformService readPlatformService; @@ -103,7 +104,7 @@ public class CalendarsApiResource { public String retrieveCalendar(@PathParam("calendarId") final Long calendarId, @PathParam("entityType") final String entityType, @PathParam("entityId") final Long entityId, @Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final Integer entityTypeId = CalendarEntityType.valueOf(entityType.toUpperCase()).getValue(); CalendarData calendarData = this.readPlatformService.retrieveCalendar(calendarId, entityId, entityTypeId); @@ -119,7 +120,7 @@ public class CalendarsApiResource { if (settings.isTemplate()) { calendarData = handleTemplate(calendarData); } - return this.toApiJsonSerializer.serialize(settings, calendarData, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, calendarData, RESPONSE_DATA_PARAMETERS); } /** @@ -135,7 +136,7 @@ public class CalendarsApiResource { public String retrieveCalendarsByEntity(@PathParam("entityType") final String entityType, @PathParam("entityId") final Long entityId, @Context final UriInfo uriInfo, @DefaultValue("all") @QueryParam("calendarType") final String calendarType) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final Set associationParameters = ApiParameterHelper.extractAssociationsForResponseIfProvided(uriInfo.getQueryParameters()); @@ -143,11 +144,9 @@ public class CalendarsApiResource { final List calendarTypeOptions = CalendarUtils.createIntegerListFromQueryParameter(calendarType); - if (!associationParameters.isEmpty()) { - if (associationParameters.contains("parentCalendars")) { - calendarsData.addAll(this.readPlatformService.retrieveParentCalendarsByEntity(entityId, - CalendarEntityType.valueOf(entityType.toUpperCase()).getValue(), calendarTypeOptions)); - } + if (!associationParameters.isEmpty() && associationParameters.contains("parentCalendars")) { + calendarsData.addAll(this.readPlatformService.retrieveParentCalendarsByEntity(entityId, + CalendarEntityType.valueOf(entityType.toUpperCase()).getValue(), calendarTypeOptions)); } calendarsData.addAll(this.readPlatformService.retrieveCalendarsByEntity(entityId, @@ -157,7 +156,7 @@ public class CalendarsApiResource { calendarsData = this.readPlatformService.updateWithRecurringDates(calendarsData); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, calendarsData, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, calendarsData, RESPONSE_DATA_PARAMETERS); } @GET @@ -167,13 +166,13 @@ public class CalendarsApiResource { public String retrieveNewCalendarDetails(@Context final UriInfo uriInfo, @PathParam("entityType") final String entityType, @PathParam("entityId") final Long entityId) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); CalendarData calendarData = this.readPlatformService.retrieveNewCalendarDetails(); calendarData = handleTemplate(calendarData); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, calendarData, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, calendarData, RESPONSE_DATA_PARAMETERS); } @POST diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/serialization/CalendarCommandFromApiJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/serialization/CalendarCommandFromApiJsonDeserializer.java index 0792193ed..0a39f1dd2 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/serialization/CalendarCommandFromApiJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/serialization/CalendarCommandFromApiJsonDeserializer.java @@ -50,7 +50,7 @@ public class CalendarCommandFromApiJsonDeserializer extends AbstractFromApiJsonD /** * The parameters supported for this command. */ - private final Set supportedParameters = CalendarSupportedParameters.getAllValues(); + private static final Set SUPPORTED_PARAMETERS = CalendarSupportedParameters.getAllValues(); private final FromJsonHelper fromApiJsonHelper; @@ -66,7 +66,7 @@ public class CalendarCommandFromApiJsonDeserializer extends AbstractFromApiJsonD } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final JsonElement element = this.fromApiJsonHelper.parse(json); final String title = this.fromApiJsonHelper.extractStringNamed(CalendarSupportedParameters.TITLE.getValue(), element); @@ -100,7 +100,7 @@ public class CalendarCommandFromApiJsonDeserializer extends AbstractFromApiJsonD } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final JsonElement element = this.fromApiJsonHelper.parse(json); final List dataValidationErrors = new ArrayList<>(); @@ -221,7 +221,7 @@ public class CalendarCommandFromApiJsonDeserializer extends AbstractFromApiJsonD } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final JsonElement element = this.fromApiJsonHelper.parse(json); final List dataValidationErrors = new ArrayList<>(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/api/ChargesApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/api/ChargesApiResource.java index 0b18874c3..94932bce8 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/api/ChargesApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/api/ChargesApiResource.java @@ -64,13 +64,13 @@ import org.springframework.stereotype.Component; + "At present we support defining charges for use with Client accounts and both loan and saving products.") public class ChargesApiResource { - private final Set chargesDataParameters = new HashSet<>(Arrays.asList("id", "name", "amount", "currency", "penalty", "active", - "chargeAppliesTo", "chargeTimeType", "chargeCalculationType", "chargeCalculationTypeOptions", "chargeAppliesToOptions", - "chargeTimeTypeOptions", "currencyOptions", "loanChargeCalculationTypeOptions", "loanChargeTimeTypeOptions", - "savingsChargeCalculationTypeOptions", "savingsChargeTimeTypeOptions", "incomeAccount", "clientChargeCalculationTypeOptions", - "clientChargeTimeTypeOptions")); + private static final Set CHARGES_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id", "name", "amount", "currency", "penalty", + "active", "chargeAppliesTo", "chargeTimeType", "chargeCalculationType", "chargeCalculationTypeOptions", + "chargeAppliesToOptions", "chargeTimeTypeOptions", "currencyOptions", "loanChargeCalculationTypeOptions", + "loanChargeTimeTypeOptions", "savingsChargeCalculationTypeOptions", "savingsChargeTimeTypeOptions", "incomeAccount", + "clientChargeCalculationTypeOptions", "clientChargeTimeTypeOptions")); - private final String resourceNameForPermissions = "CHARGE"; + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "CHARGE"; private final PlatformSecurityContext context; private final ChargeReadPlatformService readPlatformService; @@ -98,12 +98,12 @@ public class ChargesApiResource { @ApiResponse(responseCode = "200", description = "OK", content = @Content(array = @ArraySchema(schema = @Schema(implementation = ChargesApiResourceSwagger.GetChargesResponse.class)))) }) public String retrieveAllCharges(@Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final Collection charges = this.readPlatformService.retrieveAllCharges(); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, charges, this.chargesDataParameters); + return this.toApiJsonSerializer.serialize(settings, charges, CHARGES_DATA_PARAMETERS); } @GET @@ -117,7 +117,7 @@ public class ChargesApiResource { public String retrieveCharge(@PathParam("chargeId") @Parameter(description = "chargeId") final Long chargeId, @Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); @@ -127,7 +127,7 @@ public class ChargesApiResource { charge = ChargeData.withTemplate(charge, templateData); } - return this.toApiJsonSerializer.serialize(settings, charge, this.chargesDataParameters); + return this.toApiJsonSerializer.serialize(settings, charge, CHARGES_DATA_PARAMETERS); } @GET @@ -140,12 +140,12 @@ public class ChargesApiResource { @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = ChargesApiResourceSwagger.GetChargesTemplateResponse.class))) }) public String retrieveNewChargeDetails(@Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final ChargeData charge = this.readPlatformService.retrieveNewChargeDetails(); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, charge, this.chargesDataParameters); + return this.toApiJsonSerializer.serialize(settings, charge, CHARGES_DATA_PARAMETERS); } @POST diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/serialization/ChargeDefinitionCommandFromApiJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/serialization/ChargeDefinitionCommandFromApiJsonDeserializer.java index eee9ff988..30e05c41f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/serialization/ChargeDefinitionCommandFromApiJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/serialization/ChargeDefinitionCommandFromApiJsonDeserializer.java @@ -48,15 +48,39 @@ import org.springframework.stereotype.Component; @Component public final class ChargeDefinitionCommandFromApiJsonDeserializer { + public static final String NAME = "name"; + public static final String AMOUNT = "amount"; + public static final String LOCALE = "locale"; + public static final String CURRENCY_CODE = "currencyCode"; + public static final String PENALTY = "penalty"; + public static final String CHARGE_CALCULATION_TYPE_OPTIONS = "chargeCalculationTypeOptions"; + public static final String CHARGE_CALCULATION_TYPE = "chargeCalculationType"; + public static final String CHARGE_TIME_TYPE = "chargeTimeType"; + public static final String CHARGE_APPLIES_TO = "chargeAppliesTo"; + public static final String CURRENCY_OPTIONS = "currencyOptions"; + public static final String ACTIVE = "active"; + public static final String CHARGE_PAYMENT_MODE = "chargePaymentMode"; + public static final String FEE_ON_MONTH_DAY = "feeOnMonthDay"; + public static final String FEE_INTERVAL = "feeInterval"; + public static final String MONTH_DAY_FORMAT = "monthDayFormat"; + public static final String MIN_CAP = "minCap"; + public static final String MAX_CAP = "maxCap"; + public static final String FEE_FREQUENCY = "feeFrequency"; + public static final String ENABLE_FREE_WITHDRAWAL_CHARGE = "enableFreeWithdrawalCharge"; + public static final String FREE_WITHDRAWAL_FREQUENCY = "freeWithdrawalFrequency"; + public static final String RESTART_COUNT_FREQUENCY = "restartCountFrequency"; + public static final String COUNT_FREQUENCY_TYPE = "countFrequencyType"; + public static final String ENABLE_PAYMENT_TYPE = "enablePaymentType"; + public static final String PAYMENT_TYPE_ID = "paymentTypeId"; + public static final String CHARGE = "charge"; /** * The parameters supported for this command. */ - private final Set supportedParameters = new HashSet<>(Arrays.asList("name", "amount", "locale", "currencyCode", - "currencyOptions", "chargeAppliesTo", "chargeTimeType", "chargeCalculationType", "chargeCalculationTypeOptions", "penalty", - "active", "chargePaymentMode", "feeOnMonthDay", "feeInterval", "monthDayFormat", "minCap", "maxCap", "feeFrequency", - "enableFreeWithdrawalCharge", "freeWithdrawalFrequency", "restartCountFrequency", "countFrequencyType", "paymentTypeId", - "enablePaymentType", ChargesApiConstants.glAccountIdParamName, ChargesApiConstants.taxGroupIdParamName)); - + private static final Set SUPPORTED_PARAMETERS = new HashSet<>(Arrays.asList(NAME, AMOUNT, LOCALE, CURRENCY_CODE, + CURRENCY_OPTIONS, CHARGE_APPLIES_TO, CHARGE_TIME_TYPE, CHARGE_CALCULATION_TYPE, CHARGE_CALCULATION_TYPE_OPTIONS, PENALTY, + ACTIVE, CHARGE_PAYMENT_MODE, FEE_ON_MONTH_DAY, FEE_INTERVAL, MONTH_DAY_FORMAT, MIN_CAP, MAX_CAP, FEE_FREQUENCY, + ENABLE_FREE_WITHDRAWAL_CHARGE, FREE_WITHDRAWAL_FREQUENCY, RESTART_COUNT_FREQUENCY, COUNT_FREQUENCY_TYPE, PAYMENT_TYPE_ID, + ENABLE_PAYMENT_TYPE, ChargesApiConstants.glAccountIdParamName, ChargesApiConstants.taxGroupIdParamName)); private final FromJsonHelper fromApiJsonHelper; @Autowired @@ -69,86 +93,88 @@ public final class ChargeDefinitionCommandFromApiJsonDeserializer { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("charge"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(CHARGE); final JsonElement element = this.fromApiJsonHelper.parse(json); - final Integer chargeAppliesTo = this.fromApiJsonHelper.extractIntegerSansLocaleNamed("chargeAppliesTo", element); - baseDataValidator.reset().parameter("chargeAppliesTo").value(chargeAppliesTo).notNull(); + final Integer chargeAppliesTo = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(CHARGE_APPLIES_TO, element); + baseDataValidator.reset().parameter(CHARGE_APPLIES_TO).value(chargeAppliesTo).notNull(); if (chargeAppliesTo != null) { - baseDataValidator.reset().parameter("chargeAppliesTo").value(chargeAppliesTo).isOneOfTheseValues(ChargeAppliesTo.validValues()); + baseDataValidator.reset().parameter(CHARGE_APPLIES_TO).value(chargeAppliesTo).isOneOfTheseValues(ChargeAppliesTo.validValues()); } - final Integer chargeCalculationType = this.fromApiJsonHelper.extractIntegerSansLocaleNamed("chargeCalculationType", element); - baseDataValidator.reset().parameter("chargeCalculationType").value(chargeCalculationType).notNull(); + final Integer chargeCalculationType = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(CHARGE_CALCULATION_TYPE, element); + baseDataValidator.reset().parameter(CHARGE_CALCULATION_TYPE).value(chargeCalculationType).notNull(); - final Integer feeInterval = this.fromApiJsonHelper.extractIntegerNamed("feeInterval", element, Locale.getDefault()); - baseDataValidator.reset().parameter("feeInterval").value(feeInterval).integerGreaterThanZero(); + final Integer feeInterval = this.fromApiJsonHelper.extractIntegerNamed(FEE_INTERVAL, element, Locale.getDefault()); + baseDataValidator.reset().parameter(FEE_INTERVAL).value(feeInterval).integerGreaterThanZero(); - final Integer feeFrequency = this.fromApiJsonHelper.extractIntegerNamed("feeFrequency", element, Locale.getDefault()); - baseDataValidator.reset().parameter("feeFrequency").value(feeFrequency).inMinMaxRange(0, 3); + final Integer feeFrequency = this.fromApiJsonHelper.extractIntegerNamed(FEE_FREQUENCY, element, Locale.getDefault()); + baseDataValidator.reset().parameter(FEE_FREQUENCY).value(feeFrequency).inMinMaxRange(0, 3); - if (this.fromApiJsonHelper.parameterExists("enableFreeWithdrawalCharge", element)) { + if (this.fromApiJsonHelper.parameterExists(ENABLE_FREE_WITHDRAWAL_CHARGE, element)) { - final Boolean enableFreeWithdrawalCharge = this.fromApiJsonHelper.extractBooleanNamed("enableFreeWithdrawalCharge", element); - baseDataValidator.reset().parameter("enableFreeWithdrawalCharge").value(enableFreeWithdrawalCharge).notNull(); + final Boolean enableFreeWithdrawalCharge = this.fromApiJsonHelper.extractBooleanNamed(ENABLE_FREE_WITHDRAWAL_CHARGE, element); + baseDataValidator.reset().parameter(ENABLE_FREE_WITHDRAWAL_CHARGE).value(enableFreeWithdrawalCharge).notNull(); if (enableFreeWithdrawalCharge) { - final Integer freeWithdrawalFrequency = this.fromApiJsonHelper.extractIntegerNamed("freeWithdrawalFrequency", element, + final Integer freeWithdrawalFrequency = this.fromApiJsonHelper.extractIntegerNamed(FREE_WITHDRAWAL_FREQUENCY, element, Locale.getDefault()); - baseDataValidator.reset().parameter("freeWithdrawalFrequency").value(freeWithdrawalFrequency).integerGreaterThanZero(); + baseDataValidator.reset().parameter(FREE_WITHDRAWAL_FREQUENCY).value(freeWithdrawalFrequency).integerGreaterThanZero(); - final Integer restartCountFrequency = this.fromApiJsonHelper.extractIntegerNamed("restartCountFrequency", element, + final Integer restartCountFrequency = this.fromApiJsonHelper.extractIntegerNamed(RESTART_COUNT_FREQUENCY, element, Locale.getDefault()); - baseDataValidator.reset().parameter("restartCountFrequency").value(restartCountFrequency).integerGreaterThanZero(); + baseDataValidator.reset().parameter(RESTART_COUNT_FREQUENCY).value(restartCountFrequency).integerGreaterThanZero(); - final Integer countFrequencyType = this.fromApiJsonHelper.extractIntegerNamed("countFrequencyType", element, + final Integer countFrequencyType = this.fromApiJsonHelper.extractIntegerNamed(COUNT_FREQUENCY_TYPE, element, Locale.getDefault()); - baseDataValidator.reset().parameter("countFrequencyType").value(countFrequencyType); + baseDataValidator.reset().parameter(COUNT_FREQUENCY_TYPE).value(countFrequencyType); } } - if (this.fromApiJsonHelper.parameterExists("enablePaymentType", element)) { + if (this.fromApiJsonHelper.parameterExists(ENABLE_PAYMENT_TYPE, element)) { - final boolean enablePaymentType = this.fromApiJsonHelper.extractBooleanNamed("enablePaymentType", element); - baseDataValidator.reset().parameter("enablePaymentType").value(enablePaymentType).notNull(); + final boolean enablePaymentType = this.fromApiJsonHelper.extractBooleanNamed(ENABLE_PAYMENT_TYPE, element); + baseDataValidator.reset().parameter(ENABLE_PAYMENT_TYPE).value(enablePaymentType).notNull(); if (enablePaymentType) { - final Integer paymentTypeId = this.fromApiJsonHelper.extractIntegerNamed("paymentTypeId", element, Locale.getDefault()); - baseDataValidator.reset().parameter("paymentTypeId").value(paymentTypeId).integerGreaterThanZero(); + final Integer paymentTypeId = this.fromApiJsonHelper.extractIntegerNamed(PAYMENT_TYPE_ID, element, Locale.getDefault()); + baseDataValidator.reset().parameter(PAYMENT_TYPE_ID).value(paymentTypeId).integerGreaterThanZero(); } } if (feeFrequency != null) { - baseDataValidator.reset().parameter("feeInterval").value(feeInterval).notNull(); + baseDataValidator.reset().parameter(FEE_INTERVAL).value(feeInterval).notNull(); } final ChargeAppliesTo appliesTo = ChargeAppliesTo.fromInt(chargeAppliesTo); if (appliesTo.isLoanCharge()) { // loan applicable validation - final Integer chargeTimeType = this.fromApiJsonHelper.extractIntegerSansLocaleNamed("chargeTimeType", element); - baseDataValidator.reset().parameter("chargeTimeType").value(chargeTimeType).notNull(); + final Integer chargeTimeType = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(CHARGE_TIME_TYPE, element); + baseDataValidator.reset().parameter(CHARGE_TIME_TYPE).value(chargeTimeType).notNull(); if (chargeTimeType != null) { - baseDataValidator.reset().parameter("chargeTimeType").value(chargeTimeType) + baseDataValidator.reset().parameter(CHARGE_TIME_TYPE).value(chargeTimeType) .isOneOfTheseValues(ChargeTimeType.validLoanValues()); } - final Integer chargePaymentMode = this.fromApiJsonHelper.extractIntegerSansLocaleNamed("chargePaymentMode", element); - baseDataValidator.reset().parameter("chargePaymentMode").value(chargePaymentMode).notNull() + final Integer chargePaymentMode = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(CHARGE_PAYMENT_MODE, element); + baseDataValidator.reset().parameter(CHARGE_PAYMENT_MODE).value(chargePaymentMode).notNull() .isOneOfTheseValues(ChargePaymentMode.validValues()); if (chargePaymentMode != null) { - baseDataValidator.reset().parameter("chargePaymentMode").value(chargePaymentMode) + baseDataValidator.reset().parameter(CHARGE_PAYMENT_MODE).value(chargePaymentMode) .isOneOfTheseValues(ChargePaymentMode.validValues()); } if (chargeCalculationType != null) { - baseDataValidator.reset().parameter("chargeCalculationType").value(chargeCalculationType) + baseDataValidator.reset().parameter(CHARGE_CALCULATION_TYPE).value(chargeCalculationType) .isOneOfTheseValues(ChargeCalculationType.validValuesForLoan()); } @@ -158,49 +184,49 @@ public final class ChargeDefinitionCommandFromApiJsonDeserializer { } else if (appliesTo.isSavingsCharge()) { // savings applicable validation - final Integer chargeTimeType = this.fromApiJsonHelper.extractIntegerSansLocaleNamed("chargeTimeType", element); - baseDataValidator.reset().parameter("chargeTimeType").value(chargeTimeType).notNull(); + final Integer chargeTimeType = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(CHARGE_TIME_TYPE, element); + baseDataValidator.reset().parameter(CHARGE_TIME_TYPE).value(chargeTimeType).notNull(); if (chargeTimeType != null) { - baseDataValidator.reset().parameter("chargeTimeType").value(chargeTimeType) + baseDataValidator.reset().parameter(CHARGE_TIME_TYPE).value(chargeTimeType) .isOneOfTheseValues(ChargeTimeType.validSavingsValues()); } final ChargeTimeType ctt = ChargeTimeType.fromInt(chargeTimeType); if (ctt.isWeeklyFee()) { - final String monthDay = this.fromApiJsonHelper.extractStringNamed("feeOnMonthDay", element); - baseDataValidator.reset().parameter("feeOnMonthDay").value(monthDay).mustBeBlankWhenParameterProvidedIs("chargeTimeType", + final String monthDay = this.fromApiJsonHelper.extractStringNamed(FEE_ON_MONTH_DAY, element); + baseDataValidator.reset().parameter(FEE_ON_MONTH_DAY).value(monthDay).mustBeBlankWhenParameterProvidedIs(CHARGE_TIME_TYPE, chargeTimeType); } if (ctt.isMonthlyFee()) { - final MonthDay monthDay = this.fromApiJsonHelper.extractMonthDayNamed("feeOnMonthDay", element); - baseDataValidator.reset().parameter("feeOnMonthDay").value(monthDay).notNull(); + final MonthDay monthDay = this.fromApiJsonHelper.extractMonthDayNamed(FEE_ON_MONTH_DAY, element); + baseDataValidator.reset().parameter(FEE_ON_MONTH_DAY).value(monthDay).notNull(); - baseDataValidator.reset().parameter("feeInterval").value(feeInterval).notNull().inMinMaxRange(1, 12); + baseDataValidator.reset().parameter(FEE_INTERVAL).value(feeInterval).notNull().inMinMaxRange(1, 12); } if (ctt.isAnnualFee()) { - final MonthDay monthDay = this.fromApiJsonHelper.extractMonthDayNamed("feeOnMonthDay", element); - baseDataValidator.reset().parameter("feeOnMonthDay").value(monthDay).notNull(); + final MonthDay monthDay = this.fromApiJsonHelper.extractMonthDayNamed(FEE_ON_MONTH_DAY, element); + baseDataValidator.reset().parameter(FEE_ON_MONTH_DAY).value(monthDay).notNull(); } if (chargeCalculationType != null) { - baseDataValidator.reset().parameter("chargeCalculationType").value(chargeCalculationType) + baseDataValidator.reset().parameter(CHARGE_CALCULATION_TYPE).value(chargeCalculationType) .isOneOfTheseValues(ChargeCalculationType.validValuesForSavings()); } } else if (appliesTo.isClientCharge()) { // client applicable validation - final Integer chargeTimeType = this.fromApiJsonHelper.extractIntegerSansLocaleNamed("chargeTimeType", element); - baseDataValidator.reset().parameter("chargeTimeType").value(chargeTimeType).notNull(); + final Integer chargeTimeType = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(CHARGE_TIME_TYPE, element); + baseDataValidator.reset().parameter(CHARGE_TIME_TYPE).value(chargeTimeType).notNull(); if (chargeTimeType != null) { - baseDataValidator.reset().parameter("chargeTimeType").value(chargeTimeType) + baseDataValidator.reset().parameter(CHARGE_TIME_TYPE).value(chargeTimeType) .isOneOfTheseValues(ChargeTimeType.validClientValues()); } if (chargeCalculationType != null) { - baseDataValidator.reset().parameter("chargeCalculationType").value(chargeCalculationType) + baseDataValidator.reset().parameter(CHARGE_CALCULATION_TYPE).value(chargeCalculationType) .isOneOfTheseValues(ChargeCalculationType.validValuesForClients()); } @@ -212,52 +238,51 @@ public final class ChargeDefinitionCommandFromApiJsonDeserializer { } } else if (appliesTo.isSharesCharge()) { - final Integer chargeTimeType = this.fromApiJsonHelper.extractIntegerSansLocaleNamed("chargeTimeType", element); - baseDataValidator.reset().parameter("chargeTimeType").value(chargeTimeType).notNull(); + final Integer chargeTimeType = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(CHARGE_TIME_TYPE, element); + baseDataValidator.reset().parameter(CHARGE_TIME_TYPE).value(chargeTimeType).notNull(); if (chargeTimeType != null) { - baseDataValidator.reset().parameter("chargeTimeType").value(chargeTimeType) + baseDataValidator.reset().parameter(CHARGE_TIME_TYPE).value(chargeTimeType) .isOneOfTheseValues(ChargeTimeType.validShareValues()); } if (chargeCalculationType != null) { - baseDataValidator.reset().parameter("chargeCalculationType").value(chargeCalculationType) + baseDataValidator.reset().parameter(CHARGE_CALCULATION_TYPE).value(chargeCalculationType) .isOneOfTheseValues(ChargeCalculationType.validValuesForShares()); } - if (chargeTimeType != null && chargeTimeType.equals(ChargeTimeType.SHAREACCOUNT_ACTIVATION.getValue())) { - if (chargeCalculationType != null) { - baseDataValidator.reset().parameter("chargeCalculationType").value(chargeCalculationType) - .isOneOfTheseValues(ChargeCalculationType.validValuesForShareAccountActivation()); - } + if (chargeTimeType != null && chargeTimeType.equals(ChargeTimeType.SHAREACCOUNT_ACTIVATION.getValue()) + && chargeCalculationType != null) { + baseDataValidator.reset().parameter(CHARGE_CALCULATION_TYPE).value(chargeCalculationType) + .isOneOfTheseValues(ChargeCalculationType.validValuesForShareAccountActivation()); } } - final String name = this.fromApiJsonHelper.extractStringNamed("name", element); - baseDataValidator.reset().parameter("name").value(name).notBlank().notExceedingLengthOf(100); + final String name = this.fromApiJsonHelper.extractStringNamed(NAME, element); + baseDataValidator.reset().parameter(NAME).value(name).notBlank().notExceedingLengthOf(100); - final String currencyCode = this.fromApiJsonHelper.extractStringNamed("currencyCode", element); - baseDataValidator.reset().parameter("currencyCode").value(currencyCode).notBlank().notExceedingLengthOf(3); + final String currencyCode = this.fromApiJsonHelper.extractStringNamed(CURRENCY_CODE, element); + baseDataValidator.reset().parameter(CURRENCY_CODE).value(currencyCode).notBlank().notExceedingLengthOf(3); - final BigDecimal amount = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("amount", element.getAsJsonObject()); - baseDataValidator.reset().parameter("amount").value(amount).notNull().positiveAmount(); + final BigDecimal amount = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(AMOUNT, element.getAsJsonObject()); + baseDataValidator.reset().parameter(AMOUNT).value(amount).notNull().positiveAmount(); - if (this.fromApiJsonHelper.parameterExists("penalty", element)) { - final Boolean penalty = this.fromApiJsonHelper.extractBooleanNamed("penalty", element); - baseDataValidator.reset().parameter("penalty").value(penalty).notNull(); + if (this.fromApiJsonHelper.parameterExists(PENALTY, element)) { + final Boolean penalty = this.fromApiJsonHelper.extractBooleanNamed(PENALTY, element); + baseDataValidator.reset().parameter(PENALTY).value(penalty).notNull(); } - if (this.fromApiJsonHelper.parameterExists("active", element)) { - final Boolean active = this.fromApiJsonHelper.extractBooleanNamed("active", element); - baseDataValidator.reset().parameter("active").value(active).notNull(); + if (this.fromApiJsonHelper.parameterExists(ACTIVE, element)) { + final Boolean active = this.fromApiJsonHelper.extractBooleanNamed(ACTIVE, element); + baseDataValidator.reset().parameter(ACTIVE).value(active).notNull(); } - if (this.fromApiJsonHelper.parameterExists("minCap", element)) { - final BigDecimal minCap = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("minCap", element.getAsJsonObject()); - baseDataValidator.reset().parameter("minCap").value(minCap).notNull().positiveAmount(); + if (this.fromApiJsonHelper.parameterExists(MIN_CAP, element)) { + final BigDecimal minCap = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(MIN_CAP, element.getAsJsonObject()); + baseDataValidator.reset().parameter(MIN_CAP).value(minCap).notNull().positiveAmount(); } - if (this.fromApiJsonHelper.parameterExists("maxCap", element)) { - final BigDecimal maxCap = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("maxCap", element.getAsJsonObject()); - baseDataValidator.reset().parameter("maxCap").value(maxCap).notNull().positiveAmount(); + if (this.fromApiJsonHelper.parameterExists(MAX_CAP, element)) { + final BigDecimal maxCap = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(MAX_CAP, element.getAsJsonObject()); + baseDataValidator.reset().parameter(MAX_CAP).value(maxCap).notNull().positiveAmount(); } if (this.fromApiJsonHelper.parameterExists(ChargesApiConstants.taxGroupIdParamName, element)) { @@ -273,92 +298,94 @@ public final class ChargeDefinitionCommandFromApiJsonDeserializer { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("charge"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(CHARGE); final JsonElement element = this.fromApiJsonHelper.parse(json); - if (this.fromApiJsonHelper.parameterExists("name", element)) { - final String name = this.fromApiJsonHelper.extractStringNamed("name", element); - baseDataValidator.reset().parameter("name").value(name).notBlank().notExceedingLengthOf(100); + if (this.fromApiJsonHelper.parameterExists(NAME, element)) { + final String name = this.fromApiJsonHelper.extractStringNamed(NAME, element); + baseDataValidator.reset().parameter(NAME).value(name).notBlank().notExceedingLengthOf(100); } - if (this.fromApiJsonHelper.parameterExists("currencyCode", element)) { - final String currencyCode = this.fromApiJsonHelper.extractStringNamed("currencyCode", element); - baseDataValidator.reset().parameter("currencyCode").value(currencyCode).notBlank().notExceedingLengthOf(3); + if (this.fromApiJsonHelper.parameterExists(CURRENCY_CODE, element)) { + final String currencyCode = this.fromApiJsonHelper.extractStringNamed(CURRENCY_CODE, element); + baseDataValidator.reset().parameter(CURRENCY_CODE).value(currencyCode).notBlank().notExceedingLengthOf(3); } - if (this.fromApiJsonHelper.parameterExists("amount", element)) { - final BigDecimal amount = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("amount", element.getAsJsonObject()); - baseDataValidator.reset().parameter("amount").value(amount).notNull().positiveAmount(); + if (this.fromApiJsonHelper.parameterExists(AMOUNT, element)) { + final BigDecimal amount = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(AMOUNT, element.getAsJsonObject()); + baseDataValidator.reset().parameter(AMOUNT).value(amount).notNull().positiveAmount(); } - if (this.fromApiJsonHelper.parameterExists("minCap", element)) { - final BigDecimal minCap = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("minCap", element.getAsJsonObject()); - baseDataValidator.reset().parameter("minCap").value(minCap).notNull().positiveAmount(); + if (this.fromApiJsonHelper.parameterExists(MIN_CAP, element)) { + final BigDecimal minCap = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(MIN_CAP, element.getAsJsonObject()); + baseDataValidator.reset().parameter(MIN_CAP).value(minCap).notNull().positiveAmount(); } - if (this.fromApiJsonHelper.parameterExists("maxCap", element)) { - final BigDecimal maxCap = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("maxCap", element.getAsJsonObject()); - baseDataValidator.reset().parameter("maxCap").value(maxCap).notNull().positiveAmount(); + if (this.fromApiJsonHelper.parameterExists(MAX_CAP, element)) { + final BigDecimal maxCap = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(MAX_CAP, element.getAsJsonObject()); + baseDataValidator.reset().parameter(MAX_CAP).value(maxCap).notNull().positiveAmount(); } - if (this.fromApiJsonHelper.parameterExists("chargeAppliesTo", element)) { - final Integer chargeAppliesTo = this.fromApiJsonHelper.extractIntegerSansLocaleNamed("chargeAppliesTo", element); - baseDataValidator.reset().parameter("chargeAppliesTo").value(chargeAppliesTo).notNull() + if (this.fromApiJsonHelper.parameterExists(CHARGE_APPLIES_TO, element)) { + final Integer chargeAppliesTo = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(CHARGE_APPLIES_TO, element); + baseDataValidator.reset().parameter(CHARGE_APPLIES_TO).value(chargeAppliesTo).notNull() .isOneOfTheseValues(ChargeAppliesTo.validValues()); } Boolean enableFreeWithdrawalCharge = false; - if (this.fromApiJsonHelper.parameterExists("enableFreeWithdrawalCharge", element)) { - enableFreeWithdrawalCharge = this.fromApiJsonHelper.extractBooleanNamed("enableFreeWithdrawalCharge", element); - baseDataValidator.reset().parameter("enableFreeWithdrawalCharge").value(enableFreeWithdrawalCharge).notNull(); + if (this.fromApiJsonHelper.parameterExists(ENABLE_FREE_WITHDRAWAL_CHARGE, element)) { + enableFreeWithdrawalCharge = this.fromApiJsonHelper.extractBooleanNamed(ENABLE_FREE_WITHDRAWAL_CHARGE, element); + baseDataValidator.reset().parameter(ENABLE_FREE_WITHDRAWAL_CHARGE).value(enableFreeWithdrawalCharge).notNull(); if (enableFreeWithdrawalCharge) { - final Integer freeWithdrawalFrequency = this.fromApiJsonHelper.extractIntegerNamed("freeWithdrawalFrequency", element, + final Integer freeWithdrawalFrequency = this.fromApiJsonHelper.extractIntegerNamed(FREE_WITHDRAWAL_FREQUENCY, element, Locale.getDefault()); - baseDataValidator.reset().parameter("freeWithdrawalFrequency").value(freeWithdrawalFrequency).integerGreaterThanZero(); + baseDataValidator.reset().parameter(FREE_WITHDRAWAL_FREQUENCY).value(freeWithdrawalFrequency).integerGreaterThanZero(); - final Integer restartCountFrequency = this.fromApiJsonHelper.extractIntegerNamed("restartCountFrequency", element, + final Integer restartCountFrequency = this.fromApiJsonHelper.extractIntegerNamed(RESTART_COUNT_FREQUENCY, element, Locale.getDefault()); - baseDataValidator.reset().parameter("restartCountFrequency").value(restartCountFrequency).integerGreaterThanZero(); + baseDataValidator.reset().parameter(RESTART_COUNT_FREQUENCY).value(restartCountFrequency).integerGreaterThanZero(); - final Integer countFrequencyType = this.fromApiJsonHelper.extractIntegerNamed("countFrequencyType", element, + final Integer countFrequencyType = this.fromApiJsonHelper.extractIntegerNamed(COUNT_FREQUENCY_TYPE, element, Locale.getDefault()); - baseDataValidator.reset().parameter("countFrequencyType").value(countFrequencyType); + baseDataValidator.reset().parameter(COUNT_FREQUENCY_TYPE).value(countFrequencyType); } Boolean enablePaymentType = false; - if (this.fromApiJsonHelper.parameterExists("enablePaymentType", element)) { - enablePaymentType = this.fromApiJsonHelper.extractBooleanNamed("enablePaymentType", element); - baseDataValidator.reset().parameter("enablePaymentType").value(enablePaymentType).notNull(); + if (this.fromApiJsonHelper.parameterExists(ENABLE_PAYMENT_TYPE, element)) { + enablePaymentType = this.fromApiJsonHelper.extractBooleanNamed(ENABLE_PAYMENT_TYPE, element); + baseDataValidator.reset().parameter(ENABLE_PAYMENT_TYPE).value(enablePaymentType).notNull(); if (enablePaymentType) { - final Integer paymentTypeId = this.fromApiJsonHelper.extractIntegerNamed("paymentTypeId", element, Locale.getDefault()); - baseDataValidator.reset().parameter("paymentTypeId").value(paymentTypeId).integerGreaterThanZero(); + final Integer paymentTypeId = this.fromApiJsonHelper.extractIntegerNamed(PAYMENT_TYPE_ID, element, Locale.getDefault()); + baseDataValidator.reset().parameter(PAYMENT_TYPE_ID).value(paymentTypeId).integerGreaterThanZero(); } } } - if (this.fromApiJsonHelper.parameterExists("chargeAppliesTo", element)) { - final Integer chargeAppliesTo = this.fromApiJsonHelper.extractIntegerSansLocaleNamed("chargeAppliesTo", element); - baseDataValidator.reset().parameter("chargeAppliesTo").value(chargeAppliesTo).notNull() + if (this.fromApiJsonHelper.parameterExists(CHARGE_APPLIES_TO, element)) { + final Integer chargeAppliesTo = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(CHARGE_APPLIES_TO, element); + baseDataValidator.reset().parameter(CHARGE_APPLIES_TO).value(chargeAppliesTo).notNull() .isOneOfTheseValues(ChargeAppliesTo.validValues()); } - if (this.fromApiJsonHelper.parameterExists("chargeAppliesTo", element)) { - final Integer chargeAppliesTo = this.fromApiJsonHelper.extractIntegerSansLocaleNamed("chargeAppliesTo", element); - baseDataValidator.reset().parameter("chargeAppliesTo").value(chargeAppliesTo).notNull() + if (this.fromApiJsonHelper.parameterExists(CHARGE_APPLIES_TO, element)) { + final Integer chargeAppliesTo = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(CHARGE_APPLIES_TO, element); + baseDataValidator.reset().parameter(CHARGE_APPLIES_TO).value(chargeAppliesTo).notNull() .isOneOfTheseValues(ChargeAppliesTo.validValues()); } - if (this.fromApiJsonHelper.parameterExists("chargeTimeType", element)) { + if (this.fromApiJsonHelper.parameterExists(CHARGE_TIME_TYPE, element)) { - final Integer chargeTimeType = this.fromApiJsonHelper.extractIntegerSansLocaleNamed("chargeTimeType", element); + final Integer chargeTimeType = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(CHARGE_TIME_TYPE, element); final Collection validLoanValues = Arrays.asList(ChargeTimeType.validLoanValues()); final Collection validSavingsValues = Arrays.asList(ChargeTimeType.validSavingsValues()); @@ -368,51 +395,51 @@ public final class ChargeDefinitionCommandFromApiJsonDeserializer { allValidValues.addAll(validSavingsValues); allValidValues.addAll(validClientValues); allValidValues.addAll(validShareValues); - baseDataValidator.reset().parameter("chargeTimeType").value(chargeTimeType).notNull() + baseDataValidator.reset().parameter(CHARGE_TIME_TYPE).value(chargeTimeType).notNull() .isOneOfTheseValues(allValidValues.toArray(new Object[allValidValues.size()])); } - if (this.fromApiJsonHelper.parameterExists("feeOnMonthDay", element)) { - final MonthDay monthDay = this.fromApiJsonHelper.extractMonthDayNamed("feeOnMonthDay", element); - baseDataValidator.reset().parameter("feeOnMonthDay").value(monthDay).notNull(); + if (this.fromApiJsonHelper.parameterExists(FEE_ON_MONTH_DAY, element)) { + final MonthDay monthDay = this.fromApiJsonHelper.extractMonthDayNamed(FEE_ON_MONTH_DAY, element); + baseDataValidator.reset().parameter(FEE_ON_MONTH_DAY).value(monthDay).notNull(); } - if (this.fromApiJsonHelper.parameterExists("feeInterval", element)) { - final Integer feeInterval = this.fromApiJsonHelper.extractIntegerNamed("feeInterval", element, Locale.getDefault()); - baseDataValidator.reset().parameter("feeInterval").value(feeInterval).integerGreaterThanZero(); + if (this.fromApiJsonHelper.parameterExists(FEE_INTERVAL, element)) { + final Integer feeInterval = this.fromApiJsonHelper.extractIntegerNamed(FEE_INTERVAL, element, Locale.getDefault()); + baseDataValidator.reset().parameter(FEE_INTERVAL).value(feeInterval).integerGreaterThanZero(); } - if (this.fromApiJsonHelper.parameterExists("chargeCalculationType", element)) { - final Integer chargeCalculationType = this.fromApiJsonHelper.extractIntegerNamed("chargeCalculationType", element, + if (this.fromApiJsonHelper.parameterExists(CHARGE_CALCULATION_TYPE, element)) { + final Integer chargeCalculationType = this.fromApiJsonHelper.extractIntegerNamed(CHARGE_CALCULATION_TYPE, element, Locale.getDefault()); - baseDataValidator.reset().parameter("chargeCalculationType").value(chargeCalculationType).notNull().inMinMaxRange(1, 5); + baseDataValidator.reset().parameter(CHARGE_CALCULATION_TYPE).value(chargeCalculationType).notNull().inMinMaxRange(1, 5); } - if (this.fromApiJsonHelper.parameterExists("chargePaymentMode", element)) { - final Integer chargePaymentMode = this.fromApiJsonHelper.extractIntegerNamed("chargePaymentMode", element, Locale.getDefault()); - baseDataValidator.reset().parameter("chargePaymentMode").value(chargePaymentMode).notNull().inMinMaxRange(0, 1); + if (this.fromApiJsonHelper.parameterExists(CHARGE_PAYMENT_MODE, element)) { + final Integer chargePaymentMode = this.fromApiJsonHelper.extractIntegerNamed(CHARGE_PAYMENT_MODE, element, Locale.getDefault()); + baseDataValidator.reset().parameter(CHARGE_PAYMENT_MODE).value(chargePaymentMode).notNull().inMinMaxRange(0, 1); } - if (this.fromApiJsonHelper.parameterExists("penalty", element)) { - final Boolean penalty = this.fromApiJsonHelper.extractBooleanNamed("penalty", element); - baseDataValidator.reset().parameter("penalty").value(penalty).notNull(); + if (this.fromApiJsonHelper.parameterExists(PENALTY, element)) { + final Boolean penalty = this.fromApiJsonHelper.extractBooleanNamed(PENALTY, element); + baseDataValidator.reset().parameter(PENALTY).value(penalty).notNull(); } - if (this.fromApiJsonHelper.parameterExists("active", element)) { - final Boolean active = this.fromApiJsonHelper.extractBooleanNamed("active", element); - baseDataValidator.reset().parameter("active").value(active).notNull(); + if (this.fromApiJsonHelper.parameterExists(ACTIVE, element)) { + final Boolean active = this.fromApiJsonHelper.extractBooleanNamed(ACTIVE, element); + baseDataValidator.reset().parameter(ACTIVE).value(active).notNull(); } - if (this.fromApiJsonHelper.parameterExists("minCap", element)) { - final BigDecimal minCap = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("minCap", element.getAsJsonObject()); - baseDataValidator.reset().parameter("minCap").value(minCap).notNull().positiveAmount(); + if (this.fromApiJsonHelper.parameterExists(MIN_CAP, element)) { + final BigDecimal minCap = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(MIN_CAP, element.getAsJsonObject()); + baseDataValidator.reset().parameter(MIN_CAP).value(minCap).notNull().positiveAmount(); } - if (this.fromApiJsonHelper.parameterExists("maxCap", element)) { - final BigDecimal maxCap = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("maxCap", element.getAsJsonObject()); - baseDataValidator.reset().parameter("maxCap").value(maxCap).notNull().positiveAmount(); + if (this.fromApiJsonHelper.parameterExists(MAX_CAP, element)) { + final BigDecimal maxCap = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(MAX_CAP, element.getAsJsonObject()); + baseDataValidator.reset().parameter(MAX_CAP).value(maxCap).notNull().positiveAmount(); } - if (this.fromApiJsonHelper.parameterExists("feeFrequency", element)) { - final Integer feeFrequency = this.fromApiJsonHelper.extractIntegerNamed("feeFrequency", element, Locale.getDefault()); - baseDataValidator.reset().parameter("feeFrequency").value(feeFrequency).inMinMaxRange(0, 3); + if (this.fromApiJsonHelper.parameterExists(FEE_FREQUENCY, element)) { + final Integer feeFrequency = this.fromApiJsonHelper.extractIntegerNamed(FEE_FREQUENCY, element, Locale.getDefault()); + baseDataValidator.reset().parameter(FEE_FREQUENCY).value(feeFrequency).inMinMaxRange(0, 3); } if (this.fromApiJsonHelper.parameterExists(ChargesApiConstants.glAccountIdParamName, element)) { @@ -429,25 +456,25 @@ public final class ChargeDefinitionCommandFromApiJsonDeserializer { throwExceptionIfValidationWarningsExist(dataValidationErrors); } - public void validateChargeTimeNCalculationType(Integer chargeTimeType, Integer ChargeCalculationType) { + public void validateChargeTimeNCalculationType(Integer chargeTimeType, Integer chargeCalculationType) { final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("charge"); - performChargeTimeNCalculationTypeValidation(baseDataValidator, chargeTimeType, ChargeCalculationType); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(CHARGE); + performChargeTimeNCalculationTypeValidation(baseDataValidator, chargeTimeType, chargeCalculationType); throwExceptionIfValidationWarningsExist(dataValidationErrors); } private void performChargeTimeNCalculationTypeValidation(DataValidatorBuilder baseDataValidator, final Integer chargeTimeType, final Integer chargeCalculationType) { if (chargeTimeType.equals(ChargeTimeType.SHAREACCOUNT_ACTIVATION.getValue())) { - baseDataValidator.reset().parameter("chargeCalculationType").value(chargeCalculationType) + baseDataValidator.reset().parameter(CHARGE_CALCULATION_TYPE).value(chargeCalculationType) .isOneOfTheseValues(ChargeCalculationType.validValuesForShareAccountActivation()); } if (chargeTimeType.equals(ChargeTimeType.TRANCHE_DISBURSEMENT.getValue())) { - baseDataValidator.reset().parameter("chargeCalculationType").value(chargeCalculationType) + baseDataValidator.reset().parameter(CHARGE_CALCULATION_TYPE).value(chargeCalculationType) .isOneOfTheseValues(ChargeCalculationType.validValuesForTrancheDisbursement()); } else { - baseDataValidator.reset().parameter("chargeCalculationType").value(chargeCalculationType) + baseDataValidator.reset().parameter(CHARGE_CALCULATION_TYPE).value(chargeCalculationType) .isNotOneOfTheseValues(ChargeCalculationType.PERCENT_OF_DISBURSEMENT_AMOUNT.getValue()); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientAddressApiResources.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientAddressApiResources.java index b6db99ea0..94346c98a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientAddressApiResources.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientAddressApiResources.java @@ -62,11 +62,12 @@ import org.springframework.stereotype.Component; @Tag(name = "Clients Address", description = "Address module is an optional module and can be configured into the system by using GlobalConfiguration setting: enable-address. In order to activate Address module, we need to enable the configuration, enable-address by setting its value to true.") public class ClientAddressApiResources { - private final Set responseDataParameters = new HashSet<>(Arrays.asList("addressId", "street", "addressLine1", "addressLine2", - "addressLine3", "townVillage", "city", "countyDistrict", "stateProvinceId", "countryId", "postalCode", "latitude", "longitude", - "createdBy", "createdOn", "updatedBy", "updatedOn", "clientAddressId", "client_id", "address_id", "address_type_id", "isActive", - "fieldConfigurationId", "entity", "table", "field", "is_enabled", "is_mandatory", "validation_regex")); - private final String resourceNameForPermissions = "Address"; + private static final Set RESPONSE_DATA_PARAMETERS = new HashSet<>( + Arrays.asList("addressId", "street", "addressLine1", "addressLine2", "addressLine3", "townVillage", "city", "countyDistrict", + "stateProvinceId", "countryId", "postalCode", "latitude", "longitude", "createdBy", "createdOn", "updatedBy", + "updatedOn", "clientAddressId", "client_id", "address_id", "address_type_id", "isActive", "fieldConfigurationId", + "entity", "table", "field", "is_enabled", "is_mandatory", "validation_regex")); + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "Address"; private final PlatformSecurityContext context; private final AddressReadPlatformServiceImpl readPlatformService; private final DefaultToApiJsonSerializer toApiJsonSerializer; @@ -89,12 +90,12 @@ public class ClientAddressApiResources { @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) public String getAddressesTemplate(@Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final AddressData template = this.readPlatformService.retrieveTemplate(); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, template, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, template, RESPONSE_DATA_PARAMETERS); } @@ -131,7 +132,7 @@ public class ClientAddressApiResources { @PathParam("clientid") @Parameter(description = "clientId") final long clientid, @Context final UriInfo uriInfo) { Collection address; - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); // TODO: This is quite a confusing implementation with all these checks // These have to be considered as filtering criterias instead @@ -146,7 +147,7 @@ public class ClientAddressApiResources { } final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, address, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, address, RESPONSE_DATA_PARAMETERS); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientFamilyMembersApiResources.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientFamilyMembersApiResources.java index fd74268eb..4e367608c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientFamilyMembersApiResources.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientFamilyMembersApiResources.java @@ -56,9 +56,9 @@ import org.springframework.stereotype.Component; @Tag(name = "Client Family Member", description = "") public class ClientFamilyMembersApiResources { - private final Set responseDataParameters = new HashSet<>(Arrays.asList("id", "clientId", "firstName", "middleName", "lastName", - "qualification", "relationship", "maritalStatus", "gender", "dateOfBirth", "profession", "clientFamilyMemberId")); - private final String resourceNameForPermissions = "FamilyMembers"; + private static final Set RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id", "clientId", "firstName", "middleName", + "lastName", "qualification", "relationship", "maritalStatus", "gender", "dateOfBirth", "profession", "clientFamilyMemberId")); + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "FamilyMembers"; private final PlatformSecurityContext context; private final ClientFamilyMembersReadPlatformService readPlatformService; private final ToApiJsonSerializer toApiJsonSerializer; @@ -86,12 +86,12 @@ public class ClientFamilyMembersApiResources { public String getFamilyMember(@Context final UriInfo uriInfo, @PathParam("familyMemberId") final Long familyMemberId, @PathParam("clientId") @Parameter(description = "clientId") final Long clientId) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final ClientFamilyMembersData familyMembers = this.readPlatformService.getClientFamilyMember(familyMemberId); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, familyMembers, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, familyMembers, RESPONSE_DATA_PARAMETERS); } @@ -100,12 +100,12 @@ public class ClientFamilyMembersApiResources { @Produces({ MediaType.APPLICATION_JSON }) public String getFamilyMembers(@Context final UriInfo uriInfo, @PathParam("clientId") final long clientId) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final Collection familyMembers = this.readPlatformService.getClientFamilyMembers(clientId); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, familyMembers, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, familyMembers, RESPONSE_DATA_PARAMETERS); } @@ -115,12 +115,12 @@ public class ClientFamilyMembersApiResources { @Produces({ MediaType.APPLICATION_JSON }) public String getTemplate(@Context final UriInfo uriInfo, @PathParam("clientId") final long clientId) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final ClientFamilyMembersData options = this.readPlatformService.retrieveTemplate(); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, options, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, options, RESPONSE_DATA_PARAMETERS); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientIdentifiersApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientIdentifiersApiResource.java index 0ebde1c91..70b793749 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientIdentifiersApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientIdentifiersApiResource.java @@ -71,7 +71,7 @@ public class ClientIdentifiersApiResource { private static final Set CLIENT_IDENTIFIER_DATA_PARAMETERS = new HashSet<>( Arrays.asList("id", "clientId", "documentType", "documentKey", "description", "allowedDocumentTypes")); - private final String resourceNameForPermissions = "CLIENTIDENTIFIER"; + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "CLIENTIDENTIFIER"; private final PlatformSecurityContext context; private final ClientReadPlatformService clientReadPlatformService; @@ -107,7 +107,7 @@ public class ClientIdentifiersApiResource { public String retrieveAllClientIdentifiers(@Context final UriInfo uriInfo, @PathParam("clientId") @Parameter(description = "clientId") final Long clientId) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final Collection clientIdentifiers = this.clientIdentifierReadPlatformService .retrieveClientIdentifiers(clientId); @@ -127,7 +127,7 @@ public class ClientIdentifiersApiResource { public String newClientIdentifierDetails(@Context final UriInfo uriInfo, @PathParam("clientId") @Parameter(description = "clientId") final Long clientId) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final Collection codeValues = this.codeValueReadPlatformService.retrieveCodeValuesByCode("Customer Identifier"); final ClientIdentifierData clientIdentifierData = ClientIdentifierData.template(codeValues); @@ -178,7 +178,7 @@ public class ClientIdentifiersApiResource { @PathParam("identifierId") @Parameter(description = "identifierId") final Long clientIdentifierId, @Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/serialization/ClientFamilyMemberCommandFromApiJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/serialization/ClientFamilyMemberCommandFromApiJsonDeserializer.java index 0a57859a8..af5c6c473 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/serialization/ClientFamilyMemberCommandFromApiJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/serialization/ClientFamilyMemberCommandFromApiJsonDeserializer.java @@ -42,10 +42,29 @@ import org.springframework.stereotype.Component; @Component public final class ClientFamilyMemberCommandFromApiJsonDeserializer { + public static final String ID = "id"; + public static final String CLIENT_ID = "clientId"; + public static final String FIRST_NAME = "firstName"; + public static final String MIDDLE_NAME = "middleName"; + public static final String LAST_NAME = "lastName"; + public static final String QUALIFICATION = "qualification"; + public static final String MOBILE_NUMBER = "mobileNumber"; + public static final String AGE = "age"; + public static final String IS_DEPENDENT = "isDependent"; + public static final String RELATIONSHIP_ID = "relationshipId"; + public static final String MARITAL_STATUS_ID = "maritalStatusId"; + public static final String GENDER_ID = "genderId"; + public static final String DATE_OF_BIRTH = "dateOfBirth"; + public static final String PROFESSION_ID = "professionId"; + public static final String LOCALE = "locale"; + public static final String DATE_FORMAT = "dateFormat"; + public static final String FAMILY_MEMBERS = "familyMembers"; + private static final Set SUPPORTED_PARAMETERS = new HashSet<>( + Arrays.asList(ID, CLIENT_ID, FIRST_NAME, MIDDLE_NAME, LAST_NAME, QUALIFICATION, MOBILE_NUMBER, AGE, IS_DEPENDENT, + RELATIONSHIP_ID, MARITAL_STATUS_ID, GENDER_ID, DATE_OF_BIRTH, PROFESSION_ID, LOCALE, DATE_FORMAT, FAMILY_MEMBERS)); + public static final String FAMILY_MEMBERS1 = "FamilyMembers"; + public static final String RELATION_SHIP_ID = "relationShipId"; private final FromJsonHelper fromApiJsonHelper; - private final Set supportedParameters = new HashSet<>(Arrays.asList("id", "clientId", "firstName", "middleName", "lastName", - "qualification", "mobileNumber", "age", "isDependent", "relationshipId", "maritalStatusId", "genderId", "dateOfBirth", - "professionId", "locale", "dateFormat", "familyMembers")); @Autowired public ClientFamilyMemberCommandFromApiJsonDeserializer(final FromJsonHelper fromApiJsonHelper) { @@ -58,18 +77,20 @@ public final class ClientFamilyMemberCommandFromApiJsonDeserializer { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("FamilyMembers"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(FAMILY_MEMBERS1); final JsonElement element = this.fromApiJsonHelper.parse(json); - if (this.fromApiJsonHelper.extractArrayNamed("familyMembers", element) != null) { - final JsonArray familyMembers = this.fromApiJsonHelper.extractJsonArrayNamed("familyMembers", element); + if (this.fromApiJsonHelper.extractArrayNamed(FAMILY_MEMBERS, element) != null) { + final JsonArray familyMembers = this.fromApiJsonHelper.extractJsonArrayNamed(FAMILY_MEMBERS, element); baseDataValidator.reset().value(familyMembers).arrayNotEmpty(); } else { - baseDataValidator.reset().value(this.fromApiJsonHelper.extractJsonArrayNamed("familyMembers", element)).arrayNotEmpty(); + baseDataValidator.reset().value(this.fromApiJsonHelper.extractJsonArrayNamed(FAMILY_MEMBERS, element)).arrayNotEmpty(); } validateForCreate(1, json); @@ -82,85 +103,87 @@ public final class ClientFamilyMemberCommandFromApiJsonDeserializer { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("FamilyMembers"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(FAMILY_MEMBERS1); final JsonElement element = this.fromApiJsonHelper.parse(json); baseDataValidator.reset().value(clientId).notBlank().integerGreaterThanZero(); - if (this.fromApiJsonHelper.extractStringNamed("firstName", element) != null) { - final String firstName = this.fromApiJsonHelper.extractStringNamed("firstName", element); - baseDataValidator.reset().parameter("firstName").value(firstName).notNull().notBlank().notExceedingLengthOf(100); + if (this.fromApiJsonHelper.extractStringNamed(FIRST_NAME, element) != null) { + final String firstName = this.fromApiJsonHelper.extractStringNamed(FIRST_NAME, element); + baseDataValidator.reset().parameter(FIRST_NAME).value(firstName).notNull().notBlank().notExceedingLengthOf(100); } else { - baseDataValidator.reset().parameter("firstName").value(this.fromApiJsonHelper.extractStringNamed("firstName", element)) - .notNull().notBlank().notExceedingLengthOf(100); + baseDataValidator.reset().parameter(FIRST_NAME).value(this.fromApiJsonHelper.extractStringNamed(FIRST_NAME, element)).notNull() + .notBlank().notExceedingLengthOf(100); } - if (this.fromApiJsonHelper.extractStringNamed("lastName", element) != null) { - final String lastName = this.fromApiJsonHelper.extractStringNamed("lastName", element); - baseDataValidator.reset().parameter("lastName").value(lastName).notNull().notBlank().notExceedingLengthOf(100); + if (this.fromApiJsonHelper.extractStringNamed(LAST_NAME, element) != null) { + final String lastName = this.fromApiJsonHelper.extractStringNamed(LAST_NAME, element); + baseDataValidator.reset().parameter(LAST_NAME).value(lastName).notNull().notBlank().notExceedingLengthOf(100); } - if (this.fromApiJsonHelper.extractStringNamed("middleName", element) != null) { - final String middleName = this.fromApiJsonHelper.extractStringNamed("middleName", element); - baseDataValidator.reset().parameter("middleName").value(middleName).notNull().notBlank().notExceedingLengthOf(100); + if (this.fromApiJsonHelper.extractStringNamed(MIDDLE_NAME, element) != null) { + final String middleName = this.fromApiJsonHelper.extractStringNamed(MIDDLE_NAME, element); + baseDataValidator.reset().parameter(MIDDLE_NAME).value(middleName).notNull().notBlank().notExceedingLengthOf(100); } - if (this.fromApiJsonHelper.extractStringNamed("qualification", element) != null) { - final String qualification = this.fromApiJsonHelper.extractStringNamed("qualification", element); - baseDataValidator.reset().parameter("qualification").value(qualification).notNull().notBlank().notExceedingLengthOf(100); + if (this.fromApiJsonHelper.extractStringNamed(QUALIFICATION, element) != null) { + final String qualification = this.fromApiJsonHelper.extractStringNamed(QUALIFICATION, element); + baseDataValidator.reset().parameter(QUALIFICATION).value(qualification).notNull().notBlank().notExceedingLengthOf(100); } - if (this.fromApiJsonHelper.extractStringNamed("mobileNumber", element) != null) { - final String mobileNumber = this.fromApiJsonHelper.extractStringNamed("mobileNumber", element); - baseDataValidator.reset().parameter("mobileNumber").value(mobileNumber).notNull().notBlank().notExceedingLengthOf(100); + if (this.fromApiJsonHelper.extractStringNamed(MOBILE_NUMBER, element) != null) { + final String mobileNumber = this.fromApiJsonHelper.extractStringNamed(MOBILE_NUMBER, element); + baseDataValidator.reset().parameter(MOBILE_NUMBER).value(mobileNumber).notNull().notBlank().notExceedingLengthOf(100); } - if (this.fromApiJsonHelper.extractBooleanNamed("isDependent", element) != null) { - final Boolean isDependent = this.fromApiJsonHelper.extractBooleanNamed("isDependent", element); - baseDataValidator.reset().parameter("isDependent").value(isDependent).notNull().notBlank().notExceedingLengthOf(100); + if (this.fromApiJsonHelper.extractBooleanNamed(IS_DEPENDENT, element) != null) { + final Boolean isDependent = this.fromApiJsonHelper.extractBooleanNamed(IS_DEPENDENT, element); + baseDataValidator.reset().parameter(IS_DEPENDENT).value(isDependent).notNull().notBlank().notExceedingLengthOf(100); } - if (this.fromApiJsonHelper.extractLongNamed("relationShipId", element) != null) { - final long relationShipId = this.fromApiJsonHelper.extractLongNamed("relationShipId", element); - baseDataValidator.reset().parameter("relationShipId").value(relationShipId).notBlank().longGreaterThanZero(); + if (this.fromApiJsonHelper.extractLongNamed(RELATION_SHIP_ID, element) != null) { + final long relationShipId = this.fromApiJsonHelper.extractLongNamed(RELATION_SHIP_ID, element); + baseDataValidator.reset().parameter(RELATION_SHIP_ID).value(relationShipId).notBlank().longGreaterThanZero(); } else { - baseDataValidator.reset().parameter("relationShipId").value(this.fromApiJsonHelper.extractLongNamed("relationShipId", element)) + baseDataValidator.reset().parameter(RELATION_SHIP_ID).value(this.fromApiJsonHelper.extractLongNamed(RELATION_SHIP_ID, element)) .notBlank().longGreaterThanZero(); } - if (this.fromApiJsonHelper.extractLongNamed("maritalStatusId", element) != null) { - final long maritalStatusId = this.fromApiJsonHelper.extractLongNamed("maritalStatusId", element); - baseDataValidator.reset().parameter("maritalStatusId").value(maritalStatusId).notBlank().longGreaterThanZero(); + if (this.fromApiJsonHelper.extractLongNamed(MARITAL_STATUS_ID, element) != null) { + final long maritalStatusId = this.fromApiJsonHelper.extractLongNamed(MARITAL_STATUS_ID, element); + baseDataValidator.reset().parameter(MARITAL_STATUS_ID).value(maritalStatusId).notBlank().longGreaterThanZero(); } - if (this.fromApiJsonHelper.extractLongNamed("genderId", element) != null) { - final long genderId = this.fromApiJsonHelper.extractLongNamed("genderId", element); - baseDataValidator.reset().parameter("genderId").value(genderId).notBlank().longGreaterThanZero(); + if (this.fromApiJsonHelper.extractLongNamed(GENDER_ID, element) != null) { + final long genderId = this.fromApiJsonHelper.extractLongNamed(GENDER_ID, element); + baseDataValidator.reset().parameter(GENDER_ID).value(genderId).notBlank().longGreaterThanZero(); } - if (this.fromApiJsonHelper.extractLongNamed("age", element) != null) { - final long age = this.fromApiJsonHelper.extractLongNamed("age", element); - baseDataValidator.reset().parameter("age").value(age).notBlank().longGreaterThanZero(); + if (this.fromApiJsonHelper.extractLongNamed(AGE, element) != null) { + final long age = this.fromApiJsonHelper.extractLongNamed(AGE, element); + baseDataValidator.reset().parameter(AGE).value(age).notBlank().longGreaterThanZero(); } - if (this.fromApiJsonHelper.extractLongNamed("professionId", element) != null) { - final long professionId = this.fromApiJsonHelper.extractLongNamed("professionId", element); - baseDataValidator.reset().parameter("professionId").value(professionId).notBlank().longGreaterThanZero(); + if (this.fromApiJsonHelper.extractLongNamed(PROFESSION_ID, element) != null) { + final long professionId = this.fromApiJsonHelper.extractLongNamed(PROFESSION_ID, element); + baseDataValidator.reset().parameter(PROFESSION_ID).value(professionId).notBlank().longGreaterThanZero(); } - if (this.fromApiJsonHelper.extractLocalDateNamed("dateOfBirth", element) != null) { - final LocalDate dateOfBirth = this.fromApiJsonHelper.extractLocalDateNamed("dateOfBirth", element); - baseDataValidator.reset().parameter("dateOfBirth").value(dateOfBirth).value(dateOfBirth).notNull() + if (this.fromApiJsonHelper.extractLocalDateNamed(DATE_OF_BIRTH, element) != null) { + final LocalDate dateOfBirth = this.fromApiJsonHelper.extractLocalDateNamed(DATE_OF_BIRTH, element); + baseDataValidator.reset().parameter(DATE_OF_BIRTH).value(dateOfBirth).value(dateOfBirth).notNull() .validateDateBefore(DateUtils.getBusinessLocalDate()); } @@ -173,63 +196,65 @@ public final class ClientFamilyMemberCommandFromApiJsonDeserializer { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("FamilyMembers"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(FAMILY_MEMBERS1); final JsonElement element = this.fromApiJsonHelper.parse(json); baseDataValidator.reset().value(familyMemberId).notBlank().integerGreaterThanZero(); - if (this.fromApiJsonHelper.extractStringNamed("firstName", element) != null) { - final String firstName = this.fromApiJsonHelper.extractStringNamed("firstName", element); - baseDataValidator.reset().parameter("firstName").value(firstName).notNull().notBlank().notExceedingLengthOf(100); + if (this.fromApiJsonHelper.extractStringNamed(FIRST_NAME, element) != null) { + final String firstName = this.fromApiJsonHelper.extractStringNamed(FIRST_NAME, element); + baseDataValidator.reset().parameter(FIRST_NAME).value(firstName).notNull().notBlank().notExceedingLengthOf(100); } - if (this.fromApiJsonHelper.extractStringNamed("lastName", element) != null) { - final String lastName = this.fromApiJsonHelper.extractStringNamed("lastName", element); - baseDataValidator.reset().parameter("lastName").value(lastName).notNull().notBlank().notExceedingLengthOf(100); + if (this.fromApiJsonHelper.extractStringNamed(LAST_NAME, element) != null) { + final String lastName = this.fromApiJsonHelper.extractStringNamed(LAST_NAME, element); + baseDataValidator.reset().parameter(LAST_NAME).value(lastName).notNull().notBlank().notExceedingLengthOf(100); } - if (this.fromApiJsonHelper.extractStringNamed("middleName", element) != null) { - final String middleName = this.fromApiJsonHelper.extractStringNamed("middleName", element); - baseDataValidator.reset().parameter("middleName").value(middleName).notNull().notBlank().notExceedingLengthOf(100); + if (this.fromApiJsonHelper.extractStringNamed(MIDDLE_NAME, element) != null) { + final String middleName = this.fromApiJsonHelper.extractStringNamed(MIDDLE_NAME, element); + baseDataValidator.reset().parameter(MIDDLE_NAME).value(middleName).notNull().notBlank().notExceedingLengthOf(100); } - if (this.fromApiJsonHelper.extractStringNamed("qualification", element) != null) { - final String qualification = this.fromApiJsonHelper.extractStringNamed("qualification", element); - baseDataValidator.reset().parameter("qualification").value(qualification).notNull().notBlank().notExceedingLengthOf(100); + if (this.fromApiJsonHelper.extractStringNamed(QUALIFICATION, element) != null) { + final String qualification = this.fromApiJsonHelper.extractStringNamed(QUALIFICATION, element); + baseDataValidator.reset().parameter(QUALIFICATION).value(qualification).notNull().notBlank().notExceedingLengthOf(100); } - if (this.fromApiJsonHelper.extractLongNamed("relationShipId", element) != null) { - final long relationShipId = this.fromApiJsonHelper.extractLongNamed("relationShipId", element); - baseDataValidator.reset().parameter("relationShipId").value(relationShipId).notBlank().longGreaterThanZero(); + if (this.fromApiJsonHelper.extractLongNamed(RELATION_SHIP_ID, element) != null) { + final long relationShipId = this.fromApiJsonHelper.extractLongNamed(RELATION_SHIP_ID, element); + baseDataValidator.reset().parameter(RELATION_SHIP_ID).value(relationShipId).notBlank().longGreaterThanZero(); } - if (this.fromApiJsonHelper.extractLongNamed("maritalStatusId", element) != null) { - final long maritalStatusId = this.fromApiJsonHelper.extractLongNamed("maritalStatusId", element); - baseDataValidator.reset().parameter("maritalStatusId").value(maritalStatusId).notBlank().longGreaterThanZero(); + if (this.fromApiJsonHelper.extractLongNamed(MARITAL_STATUS_ID, element) != null) { + final long maritalStatusId = this.fromApiJsonHelper.extractLongNamed(MARITAL_STATUS_ID, element); + baseDataValidator.reset().parameter(MARITAL_STATUS_ID).value(maritalStatusId).notBlank().longGreaterThanZero(); } - if (this.fromApiJsonHelper.extractLongNamed("genderId", element) != null) { - final long genderId = this.fromApiJsonHelper.extractLongNamed("genderId", element); - baseDataValidator.reset().parameter("genderId").value(genderId).longGreaterThanZero(); + if (this.fromApiJsonHelper.extractLongNamed(GENDER_ID, element) != null) { + final long genderId = this.fromApiJsonHelper.extractLongNamed(GENDER_ID, element); + baseDataValidator.reset().parameter(GENDER_ID).value(genderId).longGreaterThanZero(); } - if (this.fromApiJsonHelper.extractLongNamed("professionId", element) != null) { - final long professionId = this.fromApiJsonHelper.extractLongNamed("professionId", element); - baseDataValidator.reset().parameter("professionId").value(professionId).longGreaterThanZero(); + if (this.fromApiJsonHelper.extractLongNamed(PROFESSION_ID, element) != null) { + final long professionId = this.fromApiJsonHelper.extractLongNamed(PROFESSION_ID, element); + baseDataValidator.reset().parameter(PROFESSION_ID).value(professionId).longGreaterThanZero(); } - if (this.fromApiJsonHelper.extractLocalDateNamed("dateOfBirth", element) != null) { - final LocalDate dateOfBirth = this.fromApiJsonHelper.extractLocalDateNamed("dateOfBirth", element); - baseDataValidator.reset().parameter("dateOfBirth").value(dateOfBirth).validateDateBefore(DateUtils.getBusinessLocalDate()); + if (this.fromApiJsonHelper.extractLocalDateNamed(DATE_OF_BIRTH, element) != null) { + final LocalDate dateOfBirth = this.fromApiJsonHelper.extractLocalDateNamed(DATE_OF_BIRTH, element); + baseDataValidator.reset().parameter(DATE_OF_BIRTH).value(dateOfBirth).validateDateBefore(DateUtils.getBusinessLocalDate()); } @@ -238,7 +263,7 @@ public final class ClientFamilyMemberCommandFromApiJsonDeserializer { public void validateForDelete(final long familyMemberId) { final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("FamilyMembers"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(FAMILY_MEMBERS1); // final JsonElement element = this.fromApiJsonHelper.parse(json); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/serialization/ClientIdentifierCommandFromApiJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/serialization/ClientIdentifierCommandFromApiJsonDeserializer.java index 13956afe0..698ff5495 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/serialization/ClientIdentifierCommandFromApiJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/serialization/ClientIdentifierCommandFromApiJsonDeserializer.java @@ -40,11 +40,16 @@ import org.springframework.stereotype.Component; @Component public final class ClientIdentifierCommandFromApiJsonDeserializer extends AbstractFromApiJsonDeserializer { + public static final String DOCUMENT_TYPE_ID = "documentTypeId"; + public static final String DOCUMENT_KEY = "documentKey"; + public static final String STATUS = "status"; + public static final String DESCRIPTION = "description"; + public static final String DOCUMENT_DESCRIPTION = "documentDescription"; /** * The parameters supported for this command. */ - private final Set supportedParameters = new HashSet<>(Arrays.asList("documentTypeId", "documentKey", "status", "description")); - + private static final Set SUPPORTED_PARAMETERS = new HashSet<>( + Arrays.asList(DOCUMENT_TYPE_ID, DOCUMENT_KEY, STATUS, DESCRIPTION)); private final FromJsonHelper fromApiJsonHelper; @Autowired @@ -59,14 +64,16 @@ public final class ClientIdentifierCommandFromApiJsonDeserializer extends Abstra throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final JsonElement element = this.fromApiJsonHelper.parse(json); - final Long documentTypeId = this.fromApiJsonHelper.extractLongNamed("documentTypeId", element); - final String documentKey = this.fromApiJsonHelper.extractStringNamed("documentKey", element); - final String documentDescription = this.fromApiJsonHelper.extractStringNamed("documentDescription", element); - final String statusString = this.fromApiJsonHelper.extractStringNamed("status", element); + final Long documentTypeId = this.fromApiJsonHelper.extractLongNamed(DOCUMENT_TYPE_ID, element); + final String documentKey = this.fromApiJsonHelper.extractStringNamed(DOCUMENT_KEY, element); + final String documentDescription = this.fromApiJsonHelper.extractStringNamed(DOCUMENT_DESCRIPTION, element); + final String statusString = this.fromApiJsonHelper.extractStringNamed(STATUS, element); return new ClientIdentifierCommand(documentTypeId, documentKey, statusString, documentDescription); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientWritePlatformServiceJpaRepositoryImpl.java index fee5c3bab..e7e7740fe 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientWritePlatformServiceJpaRepositoryImpl.java @@ -723,7 +723,7 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP final List clientLoans = this.loanRepositoryWrapper.findLoanByClientId(clientId); for (final Loan loan : clientLoans) { - final LoanStatusMapper loanStatus = new LoanStatusMapper(loan.status().getValue()); + final LoanStatusMapper loanStatus = new LoanStatusMapper(loan.getStatus().getValue()); if (loanStatus.isOpen() || loanStatus.isPendingApproval() || loanStatus.isAwaitingDisbursal()) { final String errorMessage = "Client cannot be closed because of non-closed loans."; throw new InvalidClientStateTransitionException("close", "loan.non-closed", errorMessage); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/api/CollateralsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/api/CollateralsApiResource.java index 50061f7b2..1f357d193 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/api/CollateralsApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/api/CollateralsApiResource.java @@ -68,7 +68,7 @@ public class CollateralsApiResource { private static final Set RESPONSE_DATA_PARAMETERS = new HashSet<>( Arrays.asList("id", "type", "value", "description", "allowedCollateralTypes", "currency")); - private final String resourceNameForPermission = "COLLATERAL"; + private static final String RESOURCE_NAME_FOR_PERMISSION = "COLLATERAL"; private final CollateralReadPlatformService collateralReadPlatformService; private final DefaultToApiJsonSerializer apiJsonSerializerService; @@ -101,7 +101,7 @@ public class CollateralsApiResource { public String newCollateralTemplate(@Context final UriInfo uriInfo, @PathParam("loanId") @Parameter(description = "loanId") final Long loanId) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermission); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSION); final Collection codeValues = this.codeValueReadPlatformService.retrieveCodeValuesByCode("LoanCollateral"); final CollateralData collateralData = CollateralData.template(codeValues); @@ -119,13 +119,13 @@ public class CollateralsApiResource { @ApiResponse(responseCode = "200", description = "OK", content = @Content(array = @ArraySchema(schema = @Schema(implementation = CollateralsApiResourceSwagger.GetLoansLoanIdCollateralsResponse.class)))) }) public String retrieveCollateralDetails(@Context final UriInfo uriInfo, @PathParam("loanId") @Parameter(description = "loanId") final Long loanId) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermission); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSION); - final List CollateralDatas = this.collateralReadPlatformService.retrieveCollateralsForValidLoan(loanId); + final List collateralDatas = this.collateralReadPlatformService.retrieveCollateralsForValidLoan(loanId); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.apiJsonSerializerService.serialize(settings, CollateralDatas, RESPONSE_DATA_PARAMETERS); + return this.apiJsonSerializerService.serialize(settings, collateralDatas, RESPONSE_DATA_PARAMETERS); } @GET @@ -139,7 +139,7 @@ public class CollateralsApiResource { public String retrieveCollateralDetails(@Context final UriInfo uriInfo, @PathParam("loanId") @Parameter(description = "loanId") final Long loanId, @PathParam("collateralId") @Parameter(description = "collateralId") final Long CollateralId) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermission); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSION); CollateralData collateralData = this.collateralReadPlatformService.retrieveCollateral(loanId, CollateralId); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/service/CollateralWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/service/CollateralWritePlatformServiceJpaRepositoryImpl.java index e58d6ed13..92b52da9e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/service/CollateralWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/service/CollateralWritePlatformServiceJpaRepositoryImpl.java @@ -90,7 +90,7 @@ public class CollateralWritePlatformServiceJpaRepositoryImpl implements Collater /** * Collaterals may be added only when the loan associated with them are yet to be approved **/ - if (!loan.status().isSubmittedAndPendingApproval()) { + if (!loan.getStatus().isSubmittedAndPendingApproval()) { throw new CollateralCannotBeCreatedException( LoanCollateralCannotBeCreatedReason.LOAN_NOT_IN_SUBMITTED_AND_PENDING_APPROVAL_STAGE, loan.getId()); } @@ -136,7 +136,7 @@ public class CollateralWritePlatformServiceJpaRepositoryImpl implements Collater /** * Collaterals may be updated only when the loan associated with them are yet to be approved **/ - if (!loan.status().isSubmittedAndPendingApproval()) { + if (!loan.getStatus().isSubmittedAndPendingApproval()) { throw new CollateralCannotBeUpdatedException( LoanCollateralCannotBeUpdatedReason.LOAN_NOT_IN_SUBMITTED_AND_PENDING_APPROVAL_STAGE, loan.getId()); } @@ -169,7 +169,7 @@ public class CollateralWritePlatformServiceJpaRepositoryImpl implements Collater /** * Collaterals may be deleted only when the loan associated with them are yet to be approved **/ - if (!loan.status().isSubmittedAndPendingApproval()) { + if (!loan.getStatus().isSubmittedAndPendingApproval()) { throw new CollateralCannotBeDeletedException( LoanCollateralCannotBeDeletedReason.LOAN_NOT_IN_SUBMITTED_AND_PENDING_APPROVAL_STAGE, loanId, collateralId); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/api/CollateralManagementApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/api/CollateralManagementApiResource.java index c74d58ac2..825409937 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/api/CollateralManagementApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/api/CollateralManagementApiResource.java @@ -42,15 +42,12 @@ import javax.ws.rs.core.UriInfo; import org.apache.fineract.commands.domain.CommandWrapper; import org.apache.fineract.commands.service.CommandWrapperBuilder; import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService; -import org.apache.fineract.infrastructure.codes.service.CodeValueReadPlatformService; -import org.apache.fineract.infrastructure.core.api.ApiRequestParameterHelper; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.organisation.monetary.data.CurrencyData; import org.apache.fineract.organisation.monetary.service.CurrencyReadPlatformService; import org.apache.fineract.portfolio.collateralmanagement.data.CollateralManagementData; -import org.apache.fineract.portfolio.collateralmanagement.service.ClientCollateralManagementReadPlatformService; import org.apache.fineract.portfolio.collateralmanagement.service.CollateralManagementReadPlatformService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; @@ -64,31 +61,21 @@ public class CollateralManagementApiResource { private final DefaultToApiJsonSerializer apiJsonSerializerService; private final DefaultToApiJsonSerializer apiJsonSerializerServiceForCurrency; - private final ApiRequestParameterHelper apiRequestParameterHelper; private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; private final PlatformSecurityContext context; - private final CodeValueReadPlatformService codeValueReadPlatformService; private final CollateralManagementReadPlatformService collateralManagementReadPlatformService; - private final String collateralReadPermission = "COLLATERAL_PRODUCT"; - private final ClientCollateralManagementReadPlatformService clientCollateralManagementReadPlatformService; private final CurrencyReadPlatformService currencyReadPlatformService; @Autowired public CollateralManagementApiResource(final DefaultToApiJsonSerializer apiJsonSerializerService, - final ApiRequestParameterHelper apiRequestParameterHelper, final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService, final PlatformSecurityContext context, - final CodeValueReadPlatformService codeValueReadPlatformService, final CollateralManagementReadPlatformService collateralManagementReadPlatformService, - final ClientCollateralManagementReadPlatformService clientCollateralManagementReadPlatformService, final CurrencyReadPlatformService currencyReadPlatformService, final DefaultToApiJsonSerializer apiJsonSerializerServiceForCurrency) { this.apiJsonSerializerService = apiJsonSerializerService; - this.apiRequestParameterHelper = apiRequestParameterHelper; this.commandsSourceWritePlatformService = commandsSourceWritePlatformService; this.context = context; - this.codeValueReadPlatformService = codeValueReadPlatformService; this.collateralManagementReadPlatformService = collateralManagementReadPlatformService; - this.clientCollateralManagementReadPlatformService = clientCollateralManagementReadPlatformService; this.currencyReadPlatformService = currencyReadPlatformService; this.apiJsonSerializerServiceForCurrency = apiJsonSerializerServiceForCurrency; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collectionsheet/serialization/CollectionSheetGenerateCommandFromApiJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collectionsheet/serialization/CollectionSheetGenerateCommandFromApiJsonDeserializer.java index 8bcac6477..bd134480e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collectionsheet/serialization/CollectionSheetGenerateCommandFromApiJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collectionsheet/serialization/CollectionSheetGenerateCommandFromApiJsonDeserializer.java @@ -47,15 +47,14 @@ import org.springframework.stereotype.Component; @Component public class CollectionSheetGenerateCommandFromApiJsonDeserializer { + public static final String COLLECTIONSHEET = "collectionsheet"; /** * The parameters supported for this command. */ - final Set supportedParameters = new HashSet<>( + private static final Set SUPPORTED_PARAMETERS = new HashSet<>( Arrays.asList(transactionDateParamName, localeParamName, dateFormatParamName, calendarIdParamName)); - private static final Set INDIVIDUAL_COLLECTIONSHEET_SUPPORTED_PARAMS = new HashSet<>( Arrays.asList(transactionDateParamName, localeParamName, dateFormatParamName, officeIdParamName, staffIdParamName)); - private final FromJsonHelper fromApiJsonHelper; @Autowired @@ -69,13 +68,15 @@ public class CollectionSheetGenerateCommandFromApiJsonDeserializer { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final JsonElement element = this.fromApiJsonHelper.parse(json); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("collectionsheet"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(COLLECTIONSHEET); final String transactionDateStr = this.fromApiJsonHelper.extractStringNamed(transactionDateParamName, element); baseDataValidator.reset().parameter(transactionDateParamName).value(transactionDateStr).notBlank(); @@ -100,13 +101,15 @@ public class CollectionSheetGenerateCommandFromApiJsonDeserializer { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); + final Type typeOfMap = new TypeToken>() { + + }.getType(); this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, INDIVIDUAL_COLLECTIONSHEET_SUPPORTED_PARAMS); final JsonElement element = this.fromApiJsonHelper.parse(json); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("collectionsheet"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(COLLECTIONSHEET); final String transactionDateStr = this.fromApiJsonHelper.extractStringNamed(transactionDateParamName, element); baseDataValidator.reset().parameter(transactionDateParamName).value(transactionDateStr).notBlank(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/serialization/FloatingRateDataValidator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/serialization/FloatingRateDataValidator.java index 3888f1b03..550f5365a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/serialization/FloatingRateDataValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/serialization/FloatingRateDataValidator.java @@ -44,11 +44,20 @@ import org.springframework.stereotype.Component; @Component public class FloatingRateDataValidator { - private final Set supportedParametersForFloatingRates = new HashSet<>( - Arrays.asList("name", "isBaseLendingRate", "isActive", "ratePeriods")); - private final Set supportedParametersForFloatingRatePeriods = new HashSet<>( - Arrays.asList("fromDate", "interestRate", "isDifferentialToBaseLendingRate", "locale", "dateFormat")); - + public static final String NAME = "name"; + public static final String IS_BASE_LENDING_RATE = "isBaseLendingRate"; + public static final String IS_ACTIVE = "isActive"; + public static final String RATE_PERIODS = "ratePeriods"; + public static final String FROM_DATE = "fromDate"; + public static final String INTEREST_RATE = "interestRate"; + public static final String IS_DIFFERENTIAL_TO_BASE_LENDING_RATE = "isDifferentialToBaseLendingRate"; + public static final String LOCALE = "locale"; + public static final String DATE_FORMAT = "dateFormat"; + public static final String FLOATINGRATE = "floatingrate"; + private static final Set SUPPORTED_PARAMETERS_FOR_FLOATING_RATES = new HashSet<>( + Arrays.asList(NAME, IS_BASE_LENDING_RATE, IS_ACTIVE, RATE_PERIODS)); + private static final Set SUPPORTED_PARAMETERS_FOR_FLOATING_RATE_PERIODS = new HashSet<>( + Arrays.asList(FROM_DATE, INTEREST_RATE, IS_DIFFERENTIAL_TO_BASE_LENDING_RATE, LOCALE, DATE_FORMAT)); private final FromJsonHelper fromApiJsonHelper; private final FloatingRateRepository floatingRateRepository; @@ -59,37 +68,39 @@ public class FloatingRateDataValidator { } public void validateForCreate(String json) { - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParametersForFloatingRates); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS_FOR_FLOATING_RATES); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("floatingrate"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(FLOATINGRATE); final JsonElement element = this.fromApiJsonHelper.parse(json); - final String name = this.fromApiJsonHelper.extractStringNamed("name", element); - baseDataValidator.reset().parameter("name").value(name).notBlank().notExceedingLengthOf(200); + final String name = this.fromApiJsonHelper.extractStringNamed(NAME, element); + baseDataValidator.reset().parameter(NAME).value(name).notBlank().notExceedingLengthOf(200); Boolean isBaseLendingRate = null; - if (this.fromApiJsonHelper.parameterExists("isBaseLendingRate", element)) { - isBaseLendingRate = this.fromApiJsonHelper.extractBooleanNamed("isBaseLendingRate", element); + if (this.fromApiJsonHelper.parameterExists(IS_BASE_LENDING_RATE, element)) { + isBaseLendingRate = this.fromApiJsonHelper.extractBooleanNamed(IS_BASE_LENDING_RATE, element); - baseDataValidator.reset().parameter("isBaseLendingRate").value(isBaseLendingRate).notNull(); + baseDataValidator.reset().parameter(IS_BASE_LENDING_RATE).value(isBaseLendingRate).notNull(); if (isBaseLendingRate == null) { - baseDataValidator.reset().parameter("isBaseLendingRate").trueOrFalseRequired(false); + baseDataValidator.reset().parameter(IS_BASE_LENDING_RATE).trueOrFalseRequired(false); } else if (isBaseLendingRate) { FloatingRate baseLendingRate = this.floatingRateRepository.retrieveBaseLendingRate(); if (baseLendingRate != null) { - baseDataValidator.reset().parameter("isBaseLendingRate").value(isBaseLendingRate) + baseDataValidator.reset().parameter(IS_BASE_LENDING_RATE).value(isBaseLendingRate) .failWithCode("baselendingrate.duplicate", "Base Lending Rate already exists"); } } } - if (this.fromApiJsonHelper.parameterExists("isActive", element)) { - final Boolean isActive = this.fromApiJsonHelper.extractBooleanNamed("isActive", element); + if (this.fromApiJsonHelper.parameterExists(IS_ACTIVE, element)) { + final Boolean isActive = this.fromApiJsonHelper.extractBooleanNamed(IS_ACTIVE, element); if (isActive == null) { - baseDataValidator.reset().parameter("isActive").trueOrFalseRequired(false); + baseDataValidator.reset().parameter(IS_ACTIVE).trueOrFalseRequired(false); } } @@ -103,9 +114,9 @@ public class FloatingRateDataValidator { private void validateRatePeriods(DataValidatorBuilder baseDataValidator, JsonElement element, boolean isBaseLendingRate, boolean isBLRModifiedAsNonBLR) { - if (this.fromApiJsonHelper.parameterExists("ratePeriods", element)) { - final JsonArray ratePeriods = this.fromApiJsonHelper.extractJsonArrayNamed("ratePeriods", element); - baseDataValidator.reset().parameter("ratePeriods").value(ratePeriods).notBlank().jsonArrayNotEmpty(); + if (this.fromApiJsonHelper.parameterExists(RATE_PERIODS, element)) { + final JsonArray ratePeriods = this.fromApiJsonHelper.extractJsonArrayNamed(RATE_PERIODS, element); + baseDataValidator.reset().parameter(RATE_PERIODS).value(ratePeriods).notBlank().jsonArrayNotEmpty(); if (ratePeriods != null) { List fromDates = new ArrayList<>(); @@ -113,38 +124,38 @@ public class FloatingRateDataValidator { final JsonElement ratePeriod = ratePeriods.get(i); this.fromApiJsonHelper.checkForUnsupportedParameters(ratePeriod.getAsJsonObject(), - this.supportedParametersForFloatingRatePeriods); + SUPPORTED_PARAMETERS_FOR_FLOATING_RATE_PERIODS); - final LocalDate fromDate = this.fromApiJsonHelper.extractLocalDateNamed("fromDate", ratePeriod); - baseDataValidator.reset().parameter("fromDate").parameterAtIndexArray("fromDate", i + 1).value(fromDate).notBlank() + final LocalDate fromDate = this.fromApiJsonHelper.extractLocalDateNamed(FROM_DATE, ratePeriod); + baseDataValidator.reset().parameter(FROM_DATE).parameterAtIndexArray(FROM_DATE, i + 1).value(fromDate).notBlank() .validateDateAfter(DateUtils.getBusinessLocalDate().plusDays(1)); if (fromDate != null) { fromDates.add(fromDate); } - final BigDecimal interestRatePerPeriod = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("interestRate", + final BigDecimal interestRatePerPeriod = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(INTEREST_RATE, ratePeriod); - baseDataValidator.reset().parameter("interestRate").parameterAtIndexArray("interestRate", i + 1) + baseDataValidator.reset().parameter(INTEREST_RATE).parameterAtIndexArray(INTEREST_RATE, i + 1) .value(interestRatePerPeriod).notNull().zeroOrPositiveAmount(); - if (this.fromApiJsonHelper.parameterExists("isDifferentialToBaseLendingRate", ratePeriod)) { + if (this.fromApiJsonHelper.parameterExists(IS_DIFFERENTIAL_TO_BASE_LENDING_RATE, ratePeriod)) { final Boolean isDifferentialToBaseLendingRate = this.fromApiJsonHelper - .extractBooleanNamed("isDifferentialToBaseLendingRate", ratePeriod); + .extractBooleanNamed(IS_DIFFERENTIAL_TO_BASE_LENDING_RATE, ratePeriod); if (isDifferentialToBaseLendingRate == null) { - baseDataValidator.reset().parameter("isDifferentialToBaseLendingRate") - .parameterAtIndexArray("isDifferentialToBaseLendingRate", i + 1).trueOrFalseRequired(false); + baseDataValidator.reset().parameter(IS_DIFFERENTIAL_TO_BASE_LENDING_RATE) + .parameterAtIndexArray(IS_DIFFERENTIAL_TO_BASE_LENDING_RATE, i + 1).trueOrFalseRequired(false); } else if (isDifferentialToBaseLendingRate) { FloatingRate baseLendingRate = this.floatingRateRepository.retrieveBaseLendingRate(); if (baseLendingRate == null || isBLRModifiedAsNonBLR) { - baseDataValidator.reset().parameter("isDifferentialToBaseLendingRate") - .parameterAtIndexArray("isDifferentialToBaseLendingRate", i + 1) + baseDataValidator.reset().parameter(IS_DIFFERENTIAL_TO_BASE_LENDING_RATE) + .parameterAtIndexArray(IS_DIFFERENTIAL_TO_BASE_LENDING_RATE, i + 1) .value(isDifferentialToBaseLendingRate) .failWithCode("no.baselending.rate.defined", "Base Lending Rate doesn't exists"); } if (isBaseLendingRate) { - baseDataValidator.reset().parameter("isDifferentialToBaseLendingRate") - .parameterAtIndexArray("isDifferentialToBaseLendingRate", i + 1) + baseDataValidator.reset().parameter(IS_DIFFERENTIAL_TO_BASE_LENDING_RATE) + .parameterAtIndexArray(IS_DIFFERENTIAL_TO_BASE_LENDING_RATE, i + 1) .value(isDifferentialToBaseLendingRate).failWithCode("cannot.be.true.for.baselendingrate", "isDifferentialToBaseLendingRate cannot be true for floating rate marked as Base Lending Rate."); } @@ -154,7 +165,7 @@ public class FloatingRateDataValidator { } Set uniqueFromDates = new HashSet<>(fromDates); if (fromDates.size() != uniqueFromDates.size()) { - baseDataValidator.reset().parameter("fromDate").failWithCode("multiple.same.date", + baseDataValidator.reset().parameter(FROM_DATE).failWithCode("multiple.same.date", "More than one entry in ratePeriods have same fromDate."); } @@ -163,41 +174,41 @@ public class FloatingRateDataValidator { } public void validateForUpdate(String json, FloatingRate floatingRateForUpdate) { - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParametersForFloatingRates); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS_FOR_FLOATING_RATES); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("floatingrate"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(FLOATINGRATE); final JsonElement element = this.fromApiJsonHelper.parse(json); - if (this.fromApiJsonHelper.parameterExists("name", element)) { - final String name = this.fromApiJsonHelper.extractStringNamed("name", element); - baseDataValidator.reset().parameter("name").value(name).notBlank().notExceedingLengthOf(200); + if (this.fromApiJsonHelper.parameterExists(NAME, element)) { + final String name = this.fromApiJsonHelper.extractStringNamed(NAME, element); + baseDataValidator.reset().parameter(NAME).value(name).notBlank().notExceedingLengthOf(200); } Boolean isBaseLendingRate = null; Boolean isBLRModifiedAsNonBLR = false; FloatingRate baseLendingRate = this.floatingRateRepository.retrieveBaseLendingRate(); - if (this.fromApiJsonHelper.parameterExists("isBaseLendingRate", element)) { - isBaseLendingRate = this.fromApiJsonHelper.extractBooleanNamed("isBaseLendingRate", element); + if (this.fromApiJsonHelper.parameterExists(IS_BASE_LENDING_RATE, element)) { + isBaseLendingRate = this.fromApiJsonHelper.extractBooleanNamed(IS_BASE_LENDING_RATE, element); - baseDataValidator.reset().parameter("isBaseLendingRate").value(isBaseLendingRate).notNull(); + baseDataValidator.reset().parameter(IS_BASE_LENDING_RATE).value(isBaseLendingRate).notNull(); if (isBaseLendingRate == null) { - baseDataValidator.reset().parameter("isBaseLendingRate").trueOrFalseRequired(false); - } else if (isBaseLendingRate) { - if (baseLendingRate != null && !baseLendingRate.getId().equals(floatingRateForUpdate.getId())) { - baseDataValidator.reset().parameter("isBaseLendingRate").value(isBaseLendingRate) - .failWithCode("baselendingrate.duplicate", "Base Lending Rate already exists"); - } + baseDataValidator.reset().parameter(IS_BASE_LENDING_RATE).trueOrFalseRequired(false); + } else if (isBaseLendingRate && baseLendingRate != null && !baseLendingRate.getId().equals(floatingRateForUpdate.getId())) { + baseDataValidator.reset().parameter(IS_BASE_LENDING_RATE).value(isBaseLendingRate).failWithCode("baselendingrate.duplicate", + "Base Lending Rate already exists"); } } Boolean isActive = null; - if (this.fromApiJsonHelper.parameterExists("isActive", element)) { - isActive = this.fromApiJsonHelper.extractBooleanNamed("isActive", element); + if (this.fromApiJsonHelper.parameterExists(IS_ACTIVE, element)) { + isActive = this.fromApiJsonHelper.extractBooleanNamed(IS_ACTIVE, element); if (isActive == null) { - baseDataValidator.reset().parameter("isActive").trueOrFalseRequired(false); + baseDataValidator.reset().parameter(IS_ACTIVE).trueOrFalseRequired(false); } } @@ -209,16 +220,14 @@ public class FloatingRateDataValidator { isActive = floatingRateForUpdate.isActive(); } - if (baseLendingRate != null && baseLendingRate.getId().equals(floatingRateForUpdate.getId())) { - if (!isBaseLendingRate || !isActive) { - isBLRModifiedAsNonBLR = true; - } + if (baseLendingRate != null && baseLendingRate.getId().equals(floatingRateForUpdate.getId()) && (!isBaseLendingRate || !isActive)) { + isBLRModifiedAsNonBLR = true; } if (isBLRModifiedAsNonBLR) { Collection floatingRates = this.floatingRateRepository.retrieveFloatingRatesLinkedToBLR(); - if (floatingRates != null && floatingRates.size() > 0) { - baseDataValidator.reset().parameter("isBaseLendingRate").value(isBaseLendingRate).failWithCode( + if (floatingRates != null && !floatingRates.isEmpty()) { + baseDataValidator.reset().parameter(IS_BASE_LENDING_RATE).value(isBaseLendingRate).failWithCode( "cannot.be.marked.non.baselendingrate", "There are floating rates linked to this Base Lending Rate, cannot be marked as non-Base Lending Rate."); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/fund/api/FundsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/fund/api/FundsApiResource.java index 4b5082f04..8e8a41236 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/fund/api/FundsApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/fund/api/FundsApiResource.java @@ -65,9 +65,9 @@ public class FundsApiResource { /** * The set of parameters that are supported in response for {@link CodeData} */ - private final Set responseDataParameters = new HashSet<>(Arrays.asList("id", "name", "externalId")); + private static final Set RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id", "name", "externalId")); - private final String resourceNameForPermissions = "FUND"; + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "FUND"; private final PlatformSecurityContext context; private final FundReadPlatformService readPlatformService; @@ -94,12 +94,12 @@ public class FundsApiResource { @ApiResponse(responseCode = "200", description = "OK", content = @Content(array = @ArraySchema(schema = @Schema(implementation = FundsApiResourceSwagger.GetFundsResponse.class)))) }) public String retrieveFunds(@Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final Collection funds = this.readPlatformService.retrieveAllFunds(); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, funds, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, funds, RESPONSE_DATA_PARAMETERS); } @POST @@ -128,12 +128,12 @@ public class FundsApiResource { @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = FundsApiResourceSwagger.GetFundsResponse.class))) }) public String retreiveFund(@PathParam("fundId") @Parameter(description = "fundId") final Long fundId, @Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final FundData fund = this.readPlatformService.retrieveFund(fundId); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, fund, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, fund, RESPONSE_DATA_PARAMETERS); } @PUT diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/fund/serialization/FundCommandFromApiJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/fund/serialization/FundCommandFromApiJsonDeserializer.java index a29e90955..fddf2834a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/fund/serialization/FundCommandFromApiJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/fund/serialization/FundCommandFromApiJsonDeserializer.java @@ -39,10 +39,13 @@ import org.springframework.stereotype.Component; @Component public final class FundCommandFromApiJsonDeserializer { + public static final String NAME = "name"; + public static final String EXTERNAL_ID = "externalId"; /** * The parameters supported for this command. */ - private final Set supportedParameters = new HashSet<>(Arrays.asList("name", "externalId")); + private static final Set SUPPORTED_PARAMETERS = new HashSet<>(Arrays.asList(NAME, EXTERNAL_ID)); + public static final String FUND = "fund"; private final FromJsonHelper fromApiJsonHelper; @@ -57,18 +60,18 @@ public final class FundCommandFromApiJsonDeserializer { } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("fund"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(FUND); final JsonElement element = this.fromApiJsonHelper.parse(json); - final String name = this.fromApiJsonHelper.extractStringNamed("name", element); - baseDataValidator.reset().parameter("name").value(name).notBlank().notExceedingLengthOf(100); + final String name = this.fromApiJsonHelper.extractStringNamed(NAME, element); + baseDataValidator.reset().parameter(NAME).value(name).notBlank().notExceedingLengthOf(100); - final String externalId = this.fromApiJsonHelper.extractStringNamed("externalId", element); - baseDataValidator.reset().parameter("externalId").value(externalId).notExceedingLengthOf(100); + final String externalId = this.fromApiJsonHelper.extractStringNamed(EXTERNAL_ID, element); + baseDataValidator.reset().parameter(EXTERNAL_ID).value(externalId).notExceedingLengthOf(100); throwExceptionIfValidationWarningsExist(dataValidationErrors); } @@ -79,20 +82,20 @@ public final class FundCommandFromApiJsonDeserializer { } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("fund"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(FUND); final JsonElement element = this.fromApiJsonHelper.parse(json); - if (this.fromApiJsonHelper.parameterExists("name", element)) { - final String name = this.fromApiJsonHelper.extractStringNamed("name", element); - baseDataValidator.reset().parameter("name").value(name).notBlank().notExceedingLengthOf(100); + if (this.fromApiJsonHelper.parameterExists(NAME, element)) { + final String name = this.fromApiJsonHelper.extractStringNamed(NAME, element); + baseDataValidator.reset().parameter(NAME).value(name).notBlank().notExceedingLengthOf(100); } - if (this.fromApiJsonHelper.parameterExists("externalId", element)) { - final String externalId = this.fromApiJsonHelper.extractStringNamed("externalId", element); - baseDataValidator.reset().parameter("externalId").value(externalId).notExceedingLengthOf(100); + if (this.fromApiJsonHelper.parameterExists(EXTERNAL_ID, element)) { + final String externalId = this.fromApiJsonHelper.extractStringNamed(EXTERNAL_ID, element); + baseDataValidator.reset().parameter(EXTERNAL_ID).value(externalId).notExceedingLengthOf(100); } throwExceptionIfValidationWarningsExist(dataValidationErrors); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupReadPlatformServiceImpl.java index 9e6674036..86f048696 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupReadPlatformServiceImpl.java @@ -59,21 +59,23 @@ import org.springframework.util.CollectionUtils; @Service public class GroupReadPlatformServiceImpl implements GroupReadPlatformService { + public static final String ID = "id"; + public static final String NAME = "name"; + public static final String OFFICE_ID = "officeId"; + public static final String OFFICE_NAME = "officeName"; + private static final AllGroupTypesDataMapper ALL_GROUP_TYPES_DATA_MAPPER = new AllGroupTypesDataMapper(); + private static final Set SUPPORTED_ORDER_BY_VALUES = new HashSet<>(Arrays.asList(ID, NAME, OFFICE_ID, OFFICE_NAME)); private final JdbcTemplate jdbcTemplate; private final PlatformSecurityContext context; private final OfficeReadPlatformService officeReadPlatformService; private final StaffReadPlatformService staffReadPlatformService; private final CenterReadPlatformService centerReadPlatformService; private final CodeValueReadPlatformService codeValueReadPlatformService; - - private final AllGroupTypesDataMapper allGroupTypesDataMapper = new AllGroupTypesDataMapper(); private final PaginationHelper paginationHelper; private final DatabaseSpecificSQLGenerator sqlGenerator; private final PaginationParametersDataValidator paginationParametersDataValidator; private final ColumnValidator columnValidator; - private static final Set supportedOrderByValues = new HashSet<>(Arrays.asList("id", "name", "officeId", "officeName")); - @Autowired public GroupReadPlatformServiceImpl(final PlatformSecurityContext context, final JdbcTemplate jdbcTemplate, final CenterReadPlatformService centerReadPlatformService, final OfficeReadPlatformService officeReadPlatformService, @@ -142,16 +144,16 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService { @Override public Page retrievePagedAll(final SearchParameters searchParameters, final PaginationParameters parameters) { - this.paginationParametersDataValidator.validateParameterValues(parameters, supportedOrderByValues, "audits"); + this.paginationParametersDataValidator.validateParameterValues(parameters, SUPPORTED_ORDER_BY_VALUES, "audits"); final AppUser currentUser = this.context.authenticatedUser(); final String hierarchy = currentUser.getOffice().getHierarchy(); final String hierarchySearchString = hierarchy + "%"; final StringBuilder sqlBuilder = new StringBuilder(200); sqlBuilder.append("select " + sqlGenerator.calcFoundRows() + " "); - sqlBuilder.append(this.allGroupTypesDataMapper.schema()); + sqlBuilder.append(ALL_GROUP_TYPES_DATA_MAPPER.schema()); - final SQLBuilder extraCriteria = getGroupExtraCriteria(this.allGroupTypesDataMapper.schema(), searchParameters); + final SQLBuilder extraCriteria = getGroupExtraCriteria(searchParameters); extraCriteria.addCriteria(" o.hierarchy like ", hierarchySearchString); sqlBuilder.append(" ").append(extraCriteria.getSQLTemplate()); if (parameters.isOrderByRequested()) { @@ -168,7 +170,7 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService { } return this.paginationHelper.fetchPage(this.jdbcTemplate, sqlBuilder.toString(), extraCriteria.getArguments(), - this.allGroupTypesDataMapper); + ALL_GROUP_TYPES_DATA_MAPPER); } @Override @@ -179,16 +181,14 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService { final StringBuilder sqlBuilder = new StringBuilder(200); sqlBuilder.append("select "); - sqlBuilder.append(this.allGroupTypesDataMapper.schema()); - final SQLBuilder extraCriteria = getGroupExtraCriteria(this.allGroupTypesDataMapper.schema(), searchParameters); + sqlBuilder.append(ALL_GROUP_TYPES_DATA_MAPPER.schema()); + final SQLBuilder extraCriteria = getGroupExtraCriteria(searchParameters); extraCriteria.addCriteria("o.hierarchy like ", hierarchySearchString); sqlBuilder.append(" ").append(extraCriteria.getSQLTemplate()); - if (searchParameters != null) { - if (searchParameters.isOrphansOnly()) { - sqlBuilder.append(" and g.parent_id is NULL"); - } + if (searchParameters != null && searchParameters.isOrphansOnly()) { + sqlBuilder.append(" and g.parent_id is NULL"); } if (parameters != null) { @@ -203,13 +203,13 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService { } } - return this.jdbcTemplate.query(sqlBuilder.toString(), this.allGroupTypesDataMapper, extraCriteria.getArguments()); // NOSONAR + return this.jdbcTemplate.query(sqlBuilder.toString(), ALL_GROUP_TYPES_DATA_MAPPER, extraCriteria.getArguments()); // NOSONAR } // 'g.' preffix because of ERROR 1052 (23000): Column 'column_name' in where // clause is ambiguous // caused by the same name of columns in m_office and m_group tables - private SQLBuilder getGroupExtraCriteria(String schemaSql, final SearchParameters searchCriteria) { + private SQLBuilder getGroupExtraCriteria(final SearchParameters searchCriteria) { SQLBuilder extraCriteria = new SQLBuilder(); if (searchCriteria == null) { @@ -243,8 +243,8 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService { final String hierarchy = currentUser.getOffice().getHierarchy(); final String hierarchySearchString = hierarchy + "%"; - final String sql = "select " + this.allGroupTypesDataMapper.schema() + " where g.id = ? and o.hierarchy like ?"; - return this.jdbcTemplate.queryForObject(sql, this.allGroupTypesDataMapper, new Object[] { groupId, hierarchySearchString }); // NOSONAR + final String sql = "select " + ALL_GROUP_TYPES_DATA_MAPPER.schema() + " where g.id = ? and o.hierarchy like ?"; + return this.jdbcTemplate.queryForObject(sql, ALL_GROUP_TYPES_DATA_MAPPER, groupId, hierarchySearchString); // NOSONAR } catch (final EmptyResultDataAccessException e) { throw new GroupNotFoundException(groupId, e); } @@ -255,22 +255,7 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService { this.context.authenticatedUser(); final GroupLookupDataMapper rm = new GroupLookupDataMapper(); final String sql = "Select " + rm.schema() + " and g.office_id=?"; - return this.jdbcTemplate.query(sql, rm, new Object[] { officeId }); // NOSONAR - } - - private static final class GroupLookupDataMapper implements RowMapper { - - public String schema() { - return "g.id as id, g.account_no as accountNo, g.display_name as displayName from m_group g where g.level_id = 2 "; - } - - @Override - public GroupGeneralData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException { - final Long id = JdbcSupport.getLong(rs, "id"); - final String accountNo = rs.getString("accountNo"); - final String displayName = rs.getString("displayName"); - return GroupGeneralData.lookup(id, accountNo, displayName); - } + return this.jdbcTemplate.query(sql, rm, officeId); // NOSONAR } @Override @@ -280,4 +265,21 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService { return GroupGeneralData.withClosureReasons(closureReasons); } + private static final class GroupLookupDataMapper implements RowMapper { + + public static final String G_ID_AS_ID_G_ACCOUNT_NO_AS_ACCOUNT_NO_G_DISPLAY_NAME_AS_DISPLAY_NAME_FROM_M_GROUP_G_WHERE_G_LEVEL_ID_2 = "g.id as id, g.account_no as accountNo, g.display_name as displayName from m_group g where g.level_id = 2 "; + + public String schema() { + return G_ID_AS_ID_G_ACCOUNT_NO_AS_ACCOUNT_NO_G_DISPLAY_NAME_AS_DISPLAY_NAME_FROM_M_GROUP_G_WHERE_G_LEVEL_ID_2; + } + + @Override + public GroupGeneralData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException { + final Long id = JdbcSupport.getLong(rs, ID); + final String accountNo = rs.getString("accountNo"); + final String displayName = rs.getString("displayName"); + return GroupGeneralData.lookup(id, accountNo, displayName); + } + } + } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java index e86fa9294..b72e69d3c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java @@ -611,7 +611,7 @@ public class GroupingTypesWritePlatformServiceJpaRepositoryImpl implements Group private void validateLoansAndSavingsForGroupOrCenterClose(final Group groupOrCenter, final LocalDate closureDate) { final Collection groupLoans = this.loanRepositoryWrapper.findByGroupId(groupOrCenter.getId()); for (final Loan loan : groupLoans) { - final LoanStatusMapper loanStatus = new LoanStatusMapper(loan.status().getValue()); + final LoanStatusMapper loanStatus = new LoanStatusMapper(loan.getStatus().getValue()); if (loanStatus.isOpen()) { final String errorMessage = groupOrCenter.getGroupLevel().getLevelName() + " cannot be closed because of non-closed loans."; throw new InvalidGroupStateTransitionException(groupOrCenter.getGroupLevel().getLevelName(), "close", "loan.not.closed", diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/interestratechart/service/InterestRateChartReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/interestratechart/service/InterestRateChartReadPlatformServiceImpl.java index 3cd6a6bbc..b7fc82a78 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/interestratechart/service/InterestRateChartReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/interestratechart/service/InterestRateChartReadPlatformServiceImpl.java @@ -53,12 +53,11 @@ public class InterestRateChartReadPlatformServiceImpl implements InterestRateCha private final PlatformSecurityContext context; private final JdbcTemplate jdbcTemplate; - private final InterestRateChartMapper chartRowMapper = new InterestRateChartMapper(); + private static final InterestRateChartMapper CHART_ROW_MAPPER = new InterestRateChartMapper(); private final InterestRateChartExtractor chartExtractor; private final InterestRateChartDropdownReadPlatformService chartDropdownReadPlatformService; private final InterestIncentiveDropdownReadPlatformService interestIncentiveDropdownReadPlatformService; private final CodeValueReadPlatformService codeValueReadPlatformService; - private final DatabaseSpecificSQLGenerator sqlGenerator; @Autowired public InterestRateChartReadPlatformServiceImpl(PlatformSecurityContext context, final JdbcTemplate jdbcTemplate, @@ -70,16 +69,15 @@ public class InterestRateChartReadPlatformServiceImpl implements InterestRateCha this.chartDropdownReadPlatformService = chartDropdownReadPlatformService; this.interestIncentiveDropdownReadPlatformService = interestIncentiveDropdownReadPlatformService; this.codeValueReadPlatformService = codeValueReadPlatformService; - this.sqlGenerator = sqlGenerator; - chartExtractor = new InterestRateChartExtractor(this.sqlGenerator); + chartExtractor = new InterestRateChartExtractor(sqlGenerator); } @Override public InterestRateChartData retrieveOne(Long chartId) { try { this.context.authenticatedUser(); - final String sql = "select " + this.chartRowMapper.schema() + " where irc.id = ?"; - return this.jdbcTemplate.queryForObject(sql, this.chartRowMapper, new Object[] { chartId }); // NOSONAR + final String sql = "select " + CHART_ROW_MAPPER.schema() + " where irc.id = ?"; + return this.jdbcTemplate.queryForObject(sql, CHART_ROW_MAPPER, chartId); // NOSONAR } catch (final EmptyResultDataAccessException e) { throw new InterestRateChartNotFoundException(chartId, e); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/BulkLoansApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/BulkLoansApiResource.java index ce8f241e8..e2956ed2a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/BulkLoansApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/BulkLoansApiResource.java @@ -59,10 +59,16 @@ import org.springframework.stereotype.Component; @Tag(name = "Bulk Loans", description = "") public class BulkLoansApiResource { - private final Set responseDataParameters = new HashSet<>(Arrays.asList("officeId", "fromLoanOfficerId", "assignmentDate", - "officeOptions", "loanOfficerOptions", "accountSummaryCollection")); + public static final String OFFICE_ID = "officeId"; + public static final String FROM_LOAN_OFFICER_ID = "fromLoanOfficerId"; + public static final String ASSIGNMENT_DATE = "assignmentDate"; + public static final String OFFICE_OPTIONS = "officeOptions"; + public static final String LOAN_OFFICER_OPTIONS = "loanOfficerOptions"; + public static final String ACCOUNT_SUMMARY_COLLECTION = "accountSummaryCollection"; + private static final Set RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList(OFFICE_ID, FROM_LOAN_OFFICER_ID, + ASSIGNMENT_DATE, OFFICE_OPTIONS, LOAN_OFFICER_OPTIONS, ACCOUNT_SUMMARY_COLLECTION)); - private final String resourceNameForPermissions = "LOAN"; + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "LOAN"; private final PlatformSecurityContext context; private final StaffReadPlatformService staffReadPlatformService; @@ -91,10 +97,10 @@ public class BulkLoansApiResource { @Path("template") @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) - public String loanReassignmentTemplate(@QueryParam("officeId") final Long officeId, - @QueryParam("fromLoanOfficerId") final Long loanOfficerId, @Context final UriInfo uriInfo) { + public String loanReassignmentTemplate(@QueryParam(OFFICE_ID) final Long officeId, + @QueryParam(FROM_LOAN_OFFICER_ID) final Long loanOfficerId, @Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final Collection offices = this.officeReadPlatformService.retrieveAllOfficesForDropdown(); @@ -113,7 +119,7 @@ public class BulkLoansApiResource { LocalDate.now(DateUtils.getDateTimeZoneOfTenant()), offices, loanOfficers, staffAccountSummaryCollectionData); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, loanReassignmentData, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, loanReassignmentData, RESPONSE_DATA_PARAMETERS); } @POST diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanApiConstants.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanApiConstants.java index 5c3281ee3..42492928c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanApiConstants.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanApiConstants.java @@ -23,14 +23,19 @@ public interface LoanApiConstants { String emiAmountParameterName = "fixedEmiAmount"; String maxOutstandingBalanceParameterName = "maxOutstandingLoanBalance"; String disbursementDataParameterName = "disbursementData"; - String disbursementDateParameterName = "expectedDisbursementDate"; + String expectedDisbursementDateParameterName = "expectedDisbursementDate"; String disbursementPrincipalParameterName = "principal"; + String principalParameterName = "principal"; String disbursementReversedParameterName = "reversed"; String disbursementNetDisbursalAmountParameterName = "netDisbursalAmount"; String updatedDisbursementDateParameterName = "updatedExpectedDisbursementDate"; String updatedDisbursementPrincipalParameterName = "updatedPrincipal"; String disbursementIdParameterName = "id"; String loanChargeIdParameterName = "loanChargeId"; + String chargeIdParameterName = "chargeId"; + String amountParameterName = "amount"; + String chargeTimeTypeParameterName = "chargeTimeType"; + String chargeCalculationTypeParameterName = "chargeCalculationType"; String principalDisbursedParameterName = "transactionAmount"; String chargesParameterName = "charges"; String loanIdTobeApproved = "loanId"; @@ -73,8 +78,12 @@ public interface LoanApiConstants { String inArrearsToleranceParameterName = "inArrearsTolerance"; String interestChargedFromDateParameterName = "interestChargedFromDate"; String submittedOnDateParameterName = "submittedOnDate"; - String submittedOnNoteParameterName = "interestChargedFromDate"; + String submittedOnNoteParameterName = "submittedOnNote"; String collateralParameterName = "collateral"; + String collateralsParameterName = "collaterals"; + String clientCollateralIdParameterName = "clientCollateralId"; + + String quantityParameterName = "quantity"; String syncDisbursementWithMeetingParameterName = "syncDisbursementWithMeeting"; String linkAccountIdParameterName = "linkAccountId"; String createStandingInstructionAtDisbursementParameterName = "createStandingInstructionAtDisbursement"; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanChargesApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanChargesApiResource.java index 032e94a5d..61e0f522d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanChargesApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanChargesApiResource.java @@ -71,12 +71,12 @@ import org.springframework.stereotype.Component; + "Loan Charges are instances of Charges and represent either fees and penalties for loan products. Refer Charges for documentation of the various properties of a charge, Only additional properties ( specific to the context of a Charge being associated with a Loan) are described here") public class LoanChargesApiResource { - private final Set responseDataParameters = new HashSet<>( + private static final Set RESPONSE_DATA_PARAMETERS = new HashSet<>( Arrays.asList("id", "chargeId", "name", "penalty", "chargeTimeType", "dueAsOfDate", "chargeCalculationType", "percentage", "amountPercentageAppliedTo", "currency", "amountWaived", "amountWrittenOff", "amountOutstanding", "amountOrPercentage", "amount", "amountPaid", "chargeOptions", "installmentChargeData")); - private final String resourceNameForPermissions = "LOAN"; + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "LOAN"; private final PlatformSecurityContext context; private final ChargeReadPlatformService chargeReadPlatformService; @@ -112,12 +112,12 @@ public class LoanChargesApiResource { public String retrieveAllLoanCharges(@PathParam("loanId") @Parameter(description = "loanId") final Long loanId, @Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final Collection loanCharges = this.loanChargeReadPlatformService.retrieveLoanCharges(loanId); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, loanCharges, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, loanCharges, RESPONSE_DATA_PARAMETERS); } @GET @@ -131,14 +131,14 @@ public class LoanChargesApiResource { public String retrieveTemplate(@PathParam("loanId") @Parameter(description = "loanId") final Long loanId, @Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final Collection chargeOptions = this.chargeReadPlatformService.retrieveLoanAccountApplicableCharges(loanId, new ChargeTimeType[] { ChargeTimeType.OVERDUE_INSTALLMENT }); final LoanChargeData loanChargeTemplate = LoanChargeData.template(chargeOptions); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, loanChargeTemplate, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, loanChargeTemplate, RESPONSE_DATA_PARAMETERS); } @GET @@ -152,7 +152,7 @@ public class LoanChargesApiResource { public String retrieveLoanCharge(@PathParam("loanId") @Parameter(description = "loanId") final Long loanId, @PathParam("chargeId") @Parameter(description = "chargeId") final Long loanChargeId, @Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final LoanChargeData loanCharge = this.loanChargeReadPlatformService.retrieveLoanChargeDetails(loanChargeId, loanId); @@ -162,7 +162,7 @@ public class LoanChargesApiResource { final LoanChargeData loanChargeData = new LoanChargeData(loanCharge, installmentChargeData); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, loanChargeData, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, loanChargeData, RESPONSE_DATA_PARAMETERS); } @POST diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanDisbursementDetailApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanDisbursementDetailApiResource.java index a9ee0ce8c..65fa16995 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanDisbursementDetailApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanDisbursementDetailApiResource.java @@ -51,10 +51,10 @@ import org.springframework.stereotype.Component; @Tag(name = "Loan Disbursement Details", description = "") public class LoanDisbursementDetailApiResource { - private final Set responseDataParameters = new HashSet<>( + private static final Set RESPONSE_DATA_PARAMETERS = new HashSet<>( Arrays.asList("id", "expectedDisbursementDate", "actualDisbursementDate", "principal", "approvedPrincipal")); - private final String resourceNameForPermissions = "LOAN"; + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "LOAN"; private final DefaultToApiJsonSerializer toApiJsonSerializer; private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; @@ -109,12 +109,12 @@ public class LoanDisbursementDetailApiResource { public String retriveDetail(@PathParam("loanId") final Long loanId, @PathParam("disbursementId") final Long disbursementId, @Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final DisbursementData disbursementData = this.loanReadPlatformService.retrieveLoanDisbursementDetail(loanId, disbursementId); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, disbursementData, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, disbursementData, RESPONSE_DATA_PARAMETERS); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanScheduleApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanScheduleApiResource.java index 6d793b72a..3c7138492 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanScheduleApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanScheduleApiResource.java @@ -57,7 +57,7 @@ import org.springframework.stereotype.Component; @Tag(name = "Loan Rescheduling", description = "Loan Term Variations provides the ability to change due dates, amounts and number of instalments before loan approval.") public class LoanScheduleApiResource { - private final String resourceNameForPermissions = "LOAN"; + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "LOAN"; private final PlatformSecurityContext context; private final DefaultToApiJsonSerializer toApiJsonSerializer; private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; @@ -94,12 +94,12 @@ public class LoanScheduleApiResource { CommandWrapper commandRequest = null; if (is(commandParam, "calculateLoanSchedule")) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final LoanScheduleData loanSchedule = this.calculationPlatformService.generateLoanScheduleForVariableInstallmentRequest(loanId, apiRequestBodyAsJson); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, loanSchedule, new HashSet()); + return this.toApiJsonSerializer.serialize(settings, loanSchedule, new HashSet<>()); } else if (is(commandParam, "addVariations")) { commandRequest = new CommandWrapperBuilder().createScheduleExceptions(loanId).withJson(apiRequestBodyAsJson).build(); } else if (is(commandParam, "deleteVariations")) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/DefaultLoanLifecycleStateMachine.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/DefaultLoanLifecycleStateMachine.java index 68f50c177..a66ee09f6 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/DefaultLoanLifecycleStateMachine.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/DefaultLoanLifecycleStateMachine.java @@ -38,7 +38,7 @@ public class DefaultLoanLifecycleStateMachine implements LoanLifecycleStateMachi @Override public LoanStatus dryTransition(final LoanEvent loanEvent, final Loan loan) { LoanStatus nextStatus = getNextState(loanEvent, loan); - return nextStatus != null ? nextStatus : loan.status(); + return nextStatus != null ? nextStatus : loan.getStatus(); } @Override @@ -64,7 +64,7 @@ public class DefaultLoanLifecycleStateMachine implements LoanLifecycleStateMachi return submittedTransition(); } - LoanStatus from = loan.status(); + LoanStatus from = loan.getStatus(); LoanStatus newState = null; switch (loanEvent) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java index 3e2042365..48b69595f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java @@ -140,14 +140,51 @@ import org.apache.fineract.portfolio.paymentdetail.domain.PaymentDetail; import org.apache.fineract.portfolio.rate.domain.Rate; import org.apache.fineract.portfolio.repaymentwithpostdatedchecks.domain.PostDatedChecks; import org.apache.fineract.useradministration.domain.AppUser; -import org.springframework.stereotype.Component; @Entity -@Component @Table(name = "m_loan", uniqueConstraints = { @UniqueConstraint(columnNames = { "account_no" }, name = "loan_account_no_UNIQUE"), @UniqueConstraint(columnNames = { "external_id" }, name = "loan_externalid_UNIQUE") }) public class Loan extends AbstractAuditableWithUTCDateTimeCustom { + public static final String RECALCULATE_LOAN_SCHEDULE = "recalculateLoanSchedule"; + public static final String ACCOUNT_NO = "accountNo"; + public static final String IN_ARREARS_TOLERANCE = "inArrearsTolerance"; + public static final String CREATE_STANDING_INSTRUCTION_AT_DISBURSEMENT = "createStandingInstructionAtDisbursement"; + public static final String EXTERNAL_ID = "externalId"; + public static final String CLIENT_ID = "clientId"; + public static final String GROUP_ID = "groupId"; + public static final String PRODUCT_ID = "productId"; + public static final String IS_FLOATING_INTEREST_RATE = "isFloatingInterestRate"; + public static final String INTEREST_RATE_DIFFERENTIAL = "interestRateDifferential"; + public static final String FUND_ID = "fundId"; + public static final String LOAN_OFFICER_ID = "loanOfficerId"; + public static final String LOAN_PURPOSE_ID = "loanPurposeId"; + public static final String TRANSACTION_PROCESSING_STRATEGY_ID = "transactionProcessingStrategyId"; + public static final String SUBMITTED_ON_DATE = "submittedOnDate"; + public static final String DATE_FORMAT = "dateFormat"; + public static final String LOCALE = "locale"; + public static final String EXPECTED_DISBURSEMENT_DATE = "expectedDisbursementDate"; + public static final String REPAYMENTS_STARTING_FROM_DATE = "repaymentsStartingFromDate"; + public static final String SYNC_DISBURSEMENT_WITH_MEETING = "syncDisbursementWithMeeting"; + public static final String INTEREST_CHARGED_FROM_DATE = "interestChargedFromDate"; + public static final String PARAM_CHARGES = "charges"; + public static final String PARAM_COLLATERAL = "collateral"; + public static final String LOAN_TERM_FREQUENCY = "loanTermFrequency"; + public static final String LOAN_TERM_FREQUENCY_TYPE = "loanTermFrequencyType"; + public static final String PRINCIPAL = "principal"; + public static final String PARAM_STATUS = "status"; + public static final String REJECTED_ON_DATE = "rejectedOnDate"; + public static final String CLOSED_ON_DATE = "closedOnDate"; + public static final String EVENT_DATE = "eventDate"; + public static final String WITHDRAWN_ON_DATE = "withdrawnOnDate"; + public static final String APPROVED_ON_DATE = "approvedOnDate"; + public static final String ACTUAL_DISBURSEMENT_DATE = "actualDisbursementDate"; + public static final String INTEREST = "interest"; + public static final String PENALTY = "penalty"; + public static final String TRANSACTION_DATE = "transactionDate"; + public static final String WRITTEN_OFF_ON_DATE = "writtenOffOnDate"; + public static final String FEE = "fee"; + public static final String PENALTIES = "penalties"; /** Disable optimistic locking till batch jobs failures can be fixed **/ @Version int version; @@ -536,7 +573,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { Money chargesDue = Money.of(getCurrency(), BigDecimal.ZERO); - for (final LoanCharge charge : charges()) { + for (final LoanCharge charge : getActiveCharges()) { if (charge.isDueAtDisbursement()) { chargesDue = chargesDue.plus(charge.amount()); } @@ -621,7 +658,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { // store Id's of existing loan transactions and existing reversed loan // transactions final LoanRepaymentScheduleProcessingWrapper wrapper = new LoanRepaymentScheduleProcessingWrapper(); - wrapper.reprocess(getCurrency(), getDisbursementDate(), getRepaymentScheduleInstallments(), charges()); + wrapper.reprocess(getCurrency(), getDisbursementDate(), getRepaymentScheduleInstallments(), getActiveCharges()); updateLoanSummaryDerivedFields(); loanLifecycleStateMachine.transition(LoanEvent.LOAN_CHARGE_ADDED, this); @@ -633,7 +670,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { .determineProcessor(this.transactionProcessingStrategy); final List allNonContraTransactionsPostDisbursement = retreiveListOfTransactionsPostDisbursement(); changedTransactionDetail = loanRepaymentScheduleTransactionProcessor.handleTransaction(getDisbursementDate(), - allNonContraTransactionsPostDisbursement, getCurrency(), getRepaymentScheduleInstallments(), charges()); + allNonContraTransactionsPostDisbursement, getCurrency(), getRepaymentScheduleInstallments(), getActiveCharges()); for (final Map.Entry mapEntry : changedTransactionDetail.getNewTransactionMappings().entrySet()) { mapEntry.getValue().updateLoan(this); @@ -775,7 +812,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { if (removed) { loanCharge.setActive(false); final LoanRepaymentScheduleProcessingWrapper wrapper = new LoanRepaymentScheduleProcessingWrapper(); - wrapper.reprocess(getCurrency(), getDisbursementDate(), getRepaymentScheduleInstallments(), charges()); + wrapper.reprocess(getCurrency(), getDisbursementDate(), getRepaymentScheduleInstallments(), getActiveCharges()); updateSummaryWithTotalFeeChargesDueAtDisbursement(deriveSumTotalOfChargesDueAtDisbursement()); } @@ -793,7 +830,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { ***/ final List allNonContraTransactionsPostDisbursement = retreiveListOfTransactionsPostDisbursement(); loanRepaymentScheduleTransactionProcessor.handleTransaction(getDisbursementDate(), allNonContraTransactionsPostDisbursement, - getCurrency(), getRepaymentScheduleInstallments(), charges()); + getCurrency(), getRepaymentScheduleInstallments(), getActiveCharges()); } this.charges.remove(loanCharge); updateLoanSummaryDerivedFields(); @@ -842,7 +879,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { final Map actualChanges = new LinkedHashMap<>(3); validateLoanIsNotClosed(loanCharge); - if (charges().contains(loanCharge)) { + if (getActiveCharges().contains(loanCharge)) { final BigDecimal amount = calculateAmountPercentageAppliedTo(loanCharge); final Map loanChargeChanges = loanCharge.update(command, amount); actualChanges.putAll(loanChargeChanges); @@ -861,11 +898,11 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { ***/ final List allNonContraTransactionsPostDisbursement = retreiveListOfTransactionsPostDisbursement(); loanRepaymentScheduleTransactionProcessor.handleTransaction(getDisbursementDate(), allNonContraTransactionsPostDisbursement, - getCurrency(), getRepaymentScheduleInstallments(), charges()); + getCurrency(), getRepaymentScheduleInstallments(), getActiveCharges()); } else { // reprocess loan schedule based on charge been waived. final LoanRepaymentScheduleProcessingWrapper wrapper = new LoanRepaymentScheduleProcessingWrapper(); - wrapper.reprocess(getCurrency(), getDisbursementDate(), getRepaymentScheduleInstallments(), charges()); + wrapper.reprocess(getCurrency(), getDisbursementDate(), getRepaymentScheduleInstallments(), getActiveCharges()); } updateLoanSummaryDerivedFields(); @@ -984,7 +1021,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { Money unrecognizedIncome = amountWaived.zero(); Money chargeComponent = amountWaived; if (isPeriodicAccrualAccountingEnabledOnLoanProduct()) { - Money receivableCharge = Money.zero(getCurrency()); + Money receivableCharge; if (loanInstallmentNumber != null) { receivableCharge = accruedCharge .minus(loanCharge.getInstallmentLoanCharge(loanInstallmentNumber).getAmountPaid(getCurrency())); @@ -1048,11 +1085,11 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { ***/ final List allNonContraTransactionsPostDisbursement = retreiveListOfTransactionsPostDisbursement(); loanRepaymentScheduleTransactionProcessor.handleTransaction(getDisbursementDate(), allNonContraTransactionsPostDisbursement, - getCurrency(), getRepaymentScheduleInstallments(), charges()); + getCurrency(), getRepaymentScheduleInstallments(), getActiveCharges()); } else { // reprocess loan schedule based on charge been waived. final LoanRepaymentScheduleProcessingWrapper wrapper = new LoanRepaymentScheduleProcessingWrapper(); - wrapper.reprocess(getCurrency(), getDisbursementDate(), getRepaymentScheduleInstallments(), charges()); + wrapper.reprocess(getCurrency(), getDisbursementDate(), getRepaymentScheduleInstallments(), getActiveCharges()); } updateLoanSummaryDerivedFields(); @@ -1131,12 +1168,10 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { if (this.loanProduct.isMultiDisburseLoan() && loanCharge.isTrancheDisbursementCharge()) { loanCharge.getTrancheDisbursementCharge().getloanDisbursementDetails().updateLoan(this); for (final LoanDisbursementDetails loanDisbursementDetails : getDisbursementDetails()) { - if (loanCharge.getTrancheDisbursementCharge().getloanDisbursementDetails().getId() == null) { - if (loanCharge.getTrancheDisbursementCharge().getloanDisbursementDetails().equals(loanDisbursementDetails)) { - loanTrancheDisbursementCharge = new LoanTrancheDisbursementCharge(loanCharge, loanDisbursementDetails); - loanCharge.updateLoanTrancheDisbursementCharge(loanTrancheDisbursementCharge); - } - + if (loanCharge.getTrancheDisbursementCharge().getloanDisbursementDetails().getId() == null + && loanCharge.getTrancheDisbursementCharge().getloanDisbursementDetails().equals(loanDisbursementDetails)) { + loanTrancheDisbursementCharge = new LoanTrancheDisbursementCharge(loanCharge, loanDisbursementDetails); + loanCharge.updateLoanTrancheDisbursementCharge(loanTrancheDisbursementCharge); } } } @@ -1149,7 +1184,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { } } final BigDecimal amount = calculateAmountPercentageAppliedTo(loanCharge); - BigDecimal chargeAmt = BigDecimal.ZERO; + BigDecimal chargeAmt; BigDecimal totalChargeAmt = BigDecimal.ZERO; if (loanCharge.getChargeCalculation().isPercentageBased()) { chargeAmt = loanCharge.getPercentage(); @@ -1244,7 +1279,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { */ private void applyAccurals() { Collection accruals = retreiveListOfAccrualTransactions(); - if (accruals.size() > 0) { + if (!accruals.isEmpty()) { if (isPeriodicAccrualAccountingEnabledOnLoanProduct()) { applyPeriodicAccruals(accruals); } else if (isNoneOrCashOrUpfrontAccrualAccountingEnabledOnLoanProduct()) { @@ -1350,7 +1385,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { } public Map loanApplicationModification(final JsonCommand command, final Set possiblyModifedLoanCharges, - final Set possiblyModifedLoanCollateralItems, final AprCalculator aprCalculator, + final Set possiblyModifiedLoanCollateralItems, final AprCalculator aprCalculator, boolean isChargesModified, final LoanProduct loanProduct) { final Map actualChanges = this.loanRepaymentScheduleDetail.updateLoanApplicationAttributes(command, aprCalculator); @@ -1359,71 +1394,65 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { this.loanRepaymentScheduleDetail.updateCurrency(currency); if (!actualChanges.isEmpty()) { - final boolean recalculateLoanSchedule = !(actualChanges.size() == 1 && actualChanges.containsKey("inArrearsTolerance")); - actualChanges.put("recalculateLoanSchedule", recalculateLoanSchedule); + final boolean recalculateLoanSchedule = !(actualChanges.size() == 1 && actualChanges.containsKey(IN_ARREARS_TOLERANCE)); + actualChanges.put(RECALCULATE_LOAN_SCHEDULE, recalculateLoanSchedule); isChargesModified = true; } final String dateFormatAsInput = command.dateFormat(); final String localeAsInput = command.locale(); - final String accountNoParamName = "accountNo"; + final String accountNoParamName = ACCOUNT_NO; if (command.isChangeInStringParameterNamed(accountNoParamName, this.accountNumber)) { final String newValue = command.stringValueOfParameterNamed(accountNoParamName); actualChanges.put(accountNoParamName, newValue); this.accountNumber = StringUtils.defaultIfEmpty(newValue, null); } - final String createSiAtDisbursementParameterName = "createStandingInstructionAtDisbursement"; - if (command.isChangeInBooleanParameterNamed(createSiAtDisbursementParameterName, shouldCreateStandingInstructionAtDisbursement())) { - final Boolean valueAsInput = command.booleanObjectValueOfParameterNamed(createSiAtDisbursementParameterName); - actualChanges.put(createSiAtDisbursementParameterName, valueAsInput); + if (command.isChangeInBooleanParameterNamed(CREATE_STANDING_INSTRUCTION_AT_DISBURSEMENT, + shouldCreateStandingInstructionAtDisbursement())) { + final Boolean valueAsInput = command.booleanObjectValueOfParameterNamed(CREATE_STANDING_INSTRUCTION_AT_DISBURSEMENT); + actualChanges.put(CREATE_STANDING_INSTRUCTION_AT_DISBURSEMENT, valueAsInput); this.createStandingInstructionAtDisbursement = valueAsInput; } - final String externalIdParamName = "externalId"; - if (command.isChangeInStringParameterNamed(externalIdParamName, this.externalId)) { - final String newValue = command.stringValueOfParameterNamed(externalIdParamName); - actualChanges.put(externalIdParamName, newValue); + if (command.isChangeInStringParameterNamed(EXTERNAL_ID, this.externalId)) { + final String newValue = command.stringValueOfParameterNamed(EXTERNAL_ID); + actualChanges.put(EXTERNAL_ID, newValue); this.externalId = StringUtils.defaultIfEmpty(newValue, null); } // add clientId, groupId and loanType changes to actual changes - final String clientIdParamName = "clientId"; final Long clientId = this.client == null ? null : this.client.getId(); - if (command.isChangeInLongParameterNamed(clientIdParamName, clientId)) { - final Long newValue = command.longValueOfParameterNamed(clientIdParamName); - actualChanges.put(clientIdParamName, newValue); + if (command.isChangeInLongParameterNamed(CLIENT_ID, clientId)) { + final Long newValue = command.longValueOfParameterNamed(CLIENT_ID); + actualChanges.put(CLIENT_ID, newValue); } // FIXME: AA - We may require separate api command to move loan from one // group to another - final String groupIdParamName = "groupId"; final Long groupId = this.group == null ? null : this.group.getId(); - if (command.isChangeInLongParameterNamed(groupIdParamName, groupId)) { - final Long newValue = command.longValueOfParameterNamed(groupIdParamName); - actualChanges.put(groupIdParamName, newValue); + if (command.isChangeInLongParameterNamed(GROUP_ID, groupId)) { + final Long newValue = command.longValueOfParameterNamed(GROUP_ID); + actualChanges.put(GROUP_ID, newValue); } - final String productIdParamName = "productId"; - if (command.isChangeInLongParameterNamed(productIdParamName, this.loanProduct.getId())) { - final Long newValue = command.longValueOfParameterNamed(productIdParamName); - actualChanges.put(productIdParamName, newValue); - actualChanges.put("recalculateLoanSchedule", true); + if (command.isChangeInLongParameterNamed(PRODUCT_ID, this.loanProduct.getId())) { + final Long newValue = command.longValueOfParameterNamed(PRODUCT_ID); + actualChanges.put(PRODUCT_ID, newValue); + actualChanges.put(RECALCULATE_LOAN_SCHEDULE, true); } - final String isFloatingInterestRateParamName = "isFloatingInterestRate"; - if (command.isChangeInBooleanParameterNamed(isFloatingInterestRateParamName, this.isFloatingInterestRate)) { - final Boolean newValue = command.booleanObjectValueOfParameterNamed(isFloatingInterestRateParamName); - actualChanges.put(isFloatingInterestRateParamName, newValue); + if (command.isChangeInBooleanParameterNamed(IS_FLOATING_INTEREST_RATE, this.isFloatingInterestRate)) { + final Boolean newValue = command.booleanObjectValueOfParameterNamed(IS_FLOATING_INTEREST_RATE); + actualChanges.put(IS_FLOATING_INTEREST_RATE, newValue); this.isFloatingInterestRate = newValue; } - final String interestRateDifferentialParamName = "interestRateDifferential"; - if (command.isChangeInBigDecimalParameterNamed(interestRateDifferentialParamName, this.interestRateDifferential)) { - final BigDecimal newValue = command.bigDecimalValueOfParameterNamed(interestRateDifferentialParamName); - actualChanges.put(interestRateDifferentialParamName, newValue); + if (command.isChangeInBigDecimalParameterNamed(INTEREST_RATE_DIFFERENTIAL, this.interestRateDifferential)) { + final BigDecimal newValue = command.bigDecimalValueOfParameterNamed(INTEREST_RATE_DIFFERENTIAL); + actualChanges.put(INTEREST_RATE_DIFFERENTIAL, newValue); this.interestRateDifferential = newValue; } @@ -1431,87 +1460,80 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { if (this.fund != null) { existingFundId = this.fund.getId(); } - final String fundIdParamName = "fundId"; - if (command.isChangeInLongParameterNamed(fundIdParamName, existingFundId)) { - final Long newValue = command.longValueOfParameterNamed(fundIdParamName); - actualChanges.put(fundIdParamName, newValue); + if (command.isChangeInLongParameterNamed(FUND_ID, existingFundId)) { + final Long newValue = command.longValueOfParameterNamed(FUND_ID); + actualChanges.put(FUND_ID, newValue); } Long existingLoanOfficerId = null; if (this.loanOfficer != null) { existingLoanOfficerId = this.loanOfficer.getId(); } - final String loanOfficerIdParamName = "loanOfficerId"; - if (command.isChangeInLongParameterNamed(loanOfficerIdParamName, existingLoanOfficerId)) { - final Long newValue = command.longValueOfParameterNamed(loanOfficerIdParamName); - actualChanges.put(loanOfficerIdParamName, newValue); + + if (command.isChangeInLongParameterNamed(LOAN_OFFICER_ID, existingLoanOfficerId)) { + final Long newValue = command.longValueOfParameterNamed(LOAN_OFFICER_ID); + actualChanges.put(LOAN_OFFICER_ID, newValue); } Long existingLoanPurposeId = null; if (this.loanPurpose != null) { existingLoanPurposeId = this.loanPurpose.getId(); } - final String loanPurposeIdParamName = "loanPurposeId"; - if (command.isChangeInLongParameterNamed(loanPurposeIdParamName, existingLoanPurposeId)) { - final Long newValue = command.longValueOfParameterNamed(loanPurposeIdParamName); - actualChanges.put(loanPurposeIdParamName, newValue); + + if (command.isChangeInLongParameterNamed(LOAN_PURPOSE_ID, existingLoanPurposeId)) { + final Long newValue = command.longValueOfParameterNamed(LOAN_PURPOSE_ID); + actualChanges.put(LOAN_PURPOSE_ID, newValue); } - final String strategyIdParamName = "transactionProcessingStrategyId"; - if (command.isChangeInLongParameterNamed(strategyIdParamName, this.transactionProcessingStrategy.getId())) { - final Long newValue = command.longValueOfParameterNamed(strategyIdParamName); - actualChanges.put(strategyIdParamName, newValue); + if (command.isChangeInLongParameterNamed(TRANSACTION_PROCESSING_STRATEGY_ID, this.transactionProcessingStrategy.getId())) { + final Long newValue = command.longValueOfParameterNamed(TRANSACTION_PROCESSING_STRATEGY_ID); + actualChanges.put(TRANSACTION_PROCESSING_STRATEGY_ID, newValue); } - final String submittedOnDateParamName = "submittedOnDate"; - if (command.isChangeInLocalDateParameterNamed(submittedOnDateParamName, getSubmittedOnDate())) { - final String valueAsInput = command.stringValueOfParameterNamed(submittedOnDateParamName); - actualChanges.put(submittedOnDateParamName, valueAsInput); - actualChanges.put("dateFormat", dateFormatAsInput); - actualChanges.put("locale", localeAsInput); + if (command.isChangeInLocalDateParameterNamed(SUBMITTED_ON_DATE, getSubmittedOnDate())) { + final String valueAsInput = command.stringValueOfParameterNamed(SUBMITTED_ON_DATE); + actualChanges.put(SUBMITTED_ON_DATE, valueAsInput); + actualChanges.put(DATE_FORMAT, dateFormatAsInput); + actualChanges.put(LOCALE, localeAsInput); - this.submittedOnDate = command.localDateValueOfParameterNamed(submittedOnDateParamName); + this.submittedOnDate = command.localDateValueOfParameterNamed(SUBMITTED_ON_DATE); } - final String expectedDisbursementDateParamName = "expectedDisbursementDate"; - if (command.isChangeInLocalDateParameterNamed(expectedDisbursementDateParamName, getExpectedDisbursedOnLocalDate())) { - final String valueAsInput = command.stringValueOfParameterNamed(expectedDisbursementDateParamName); - actualChanges.put(expectedDisbursementDateParamName, valueAsInput); - actualChanges.put("dateFormat", dateFormatAsInput); - actualChanges.put("locale", localeAsInput); - actualChanges.put("recalculateLoanSchedule", true); + if (command.isChangeInLocalDateParameterNamed(EXPECTED_DISBURSEMENT_DATE, getExpectedDisbursedOnLocalDate())) { + final String valueAsInput = command.stringValueOfParameterNamed(EXPECTED_DISBURSEMENT_DATE); + actualChanges.put(EXPECTED_DISBURSEMENT_DATE, valueAsInput); + actualChanges.put(DATE_FORMAT, dateFormatAsInput); + actualChanges.put(LOCALE, localeAsInput); + actualChanges.put(RECALCULATE_LOAN_SCHEDULE, true); - this.expectedDisbursementDate = command.localDateValueOfParameterNamed(expectedDisbursementDateParamName); + this.expectedDisbursementDate = command.localDateValueOfParameterNamed(EXPECTED_DISBURSEMENT_DATE); removeFirstDisbursementTransaction(); } - final String repaymentsStartingFromDateParamName = "repaymentsStartingFromDate"; - if (command.isChangeInLocalDateParameterNamed(repaymentsStartingFromDateParamName, getExpectedFirstRepaymentOnDate())) { - final String valueAsInput = command.stringValueOfParameterNamed(repaymentsStartingFromDateParamName); - actualChanges.put(repaymentsStartingFromDateParamName, valueAsInput); - actualChanges.put("dateFormat", dateFormatAsInput); - actualChanges.put("locale", localeAsInput); - actualChanges.put("recalculateLoanSchedule", true); + if (command.isChangeInLocalDateParameterNamed(REPAYMENTS_STARTING_FROM_DATE, getExpectedFirstRepaymentOnDate())) { + final String valueAsInput = command.stringValueOfParameterNamed(REPAYMENTS_STARTING_FROM_DATE); + actualChanges.put(REPAYMENTS_STARTING_FROM_DATE, valueAsInput); + actualChanges.put(DATE_FORMAT, dateFormatAsInput); + actualChanges.put(LOCALE, localeAsInput); + actualChanges.put(RECALCULATE_LOAN_SCHEDULE, true); - this.expectedFirstRepaymentOnDate = command.localDateValueOfParameterNamed(repaymentsStartingFromDateParamName); + this.expectedFirstRepaymentOnDate = command.localDateValueOfParameterNamed(REPAYMENTS_STARTING_FROM_DATE); } - final String syncDisbursementParameterName = "syncDisbursementWithMeeting"; - if (command.isChangeInBooleanParameterNamed(syncDisbursementParameterName, isSyncDisbursementWithMeeting())) { - final Boolean valueAsInput = command.booleanObjectValueOfParameterNamed(syncDisbursementParameterName); - actualChanges.put(syncDisbursementParameterName, valueAsInput); + if (command.isChangeInBooleanParameterNamed(SYNC_DISBURSEMENT_WITH_MEETING, isSyncDisbursementWithMeeting())) { + final Boolean valueAsInput = command.booleanObjectValueOfParameterNamed(SYNC_DISBURSEMENT_WITH_MEETING); + actualChanges.put(SYNC_DISBURSEMENT_WITH_MEETING, valueAsInput); this.syncDisbursementWithMeeting = valueAsInput; } - final String interestChargedFromDateParamName = "interestChargedFromDate"; - if (command.isChangeInLocalDateParameterNamed(interestChargedFromDateParamName, getInterestChargedFromDate())) { - final String valueAsInput = command.stringValueOfParameterNamed(interestChargedFromDateParamName); - actualChanges.put(interestChargedFromDateParamName, valueAsInput); - actualChanges.put("dateFormat", dateFormatAsInput); - actualChanges.put("locale", localeAsInput); - actualChanges.put("recalculateLoanSchedule", true); + if (command.isChangeInLocalDateParameterNamed(INTEREST_CHARGED_FROM_DATE, getInterestChargedFromDate())) { + final String valueAsInput = command.stringValueOfParameterNamed(INTEREST_CHARGED_FROM_DATE); + actualChanges.put(INTEREST_CHARGED_FROM_DATE, valueAsInput); + actualChanges.put(DATE_FORMAT, dateFormatAsInput); + actualChanges.put(LOCALE, localeAsInput); + actualChanges.put(RECALCULATE_LOAN_SCHEDULE, true); - this.interestChargedFromDate = command.localDateValueOfParameterNamed(interestChargedFromDateParamName); + this.interestChargedFromDate = command.localDateValueOfParameterNamed(INTEREST_CHARGED_FROM_DATE); } // the comparison should be done with the tenant date @@ -1522,18 +1544,16 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { throw new InvalidLoanStateTransitionException("submittal", "cannot.be.a.future.date", errorMessage, getSubmittedOnDate()); } - if (!(this.client == null)) { + if (this.client != null) { if (getSubmittedOnDate().isBefore(this.client.getActivationLocalDate())) { final String errorMessage = "The date on which a loan is submitted cannot be earlier than client's activation date."; throw new InvalidLoanStateTransitionException("submittal", "cannot.be.before.client.activation.date", errorMessage, getSubmittedOnDate()); } - } else if (!(this.group == null)) { - if (getSubmittedOnDate().isBefore(this.group.getActivationLocalDate())) { - final String errorMessage = "The date on which a loan is submitted cannot be earlier than groups's activation date."; - throw new InvalidLoanStateTransitionException("submittal", "cannot.be.before.group.activation.date", errorMessage, - getSubmittedOnDate()); - } + } else if (this.group != null && getSubmittedOnDate().isBefore(this.group.getActivationLocalDate())) { + final String errorMessage = "The date on which a loan is submitted cannot be earlier than groups's activation date."; + throw new InvalidLoanStateTransitionException("submittal", "cannot.be.before.group.activation.date", errorMessage, + getSubmittedOnDate()); } if (getSubmittedOnDate().isAfter(getExpectedDisbursedOnLocalDate())) { @@ -1543,51 +1563,40 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { getSubmittedOnDate(), getExpectedDisbursedOnLocalDate()); } - final String chargesParamName = "charges"; - if (isChargesModified) { - actualChanges.put(chargesParamName, getLoanCharges(possiblyModifedLoanCharges)); - actualChanges.put("recalculateLoanSchedule", true); + actualChanges.put(PARAM_CHARGES, getLoanCharges(possiblyModifedLoanCharges)); + actualChanges.put(RECALCULATE_LOAN_SCHEDULE, true); } - final String collateralParamName = "collateral"; + if (command.parameterExists(PARAM_COLLATERAL) && possiblyModifiedLoanCollateralItems != null + && !possiblyModifiedLoanCollateralItems.isEmpty()) { + Set loanCollateralManagements = this.loanCollateralManagements; + boolean isTrue = possiblyModifiedLoanCollateralItems.equals(loanCollateralManagements); - if (command.parameterExists(collateralParamName) && possiblyModifedLoanCollateralItems != null) { - - if (possiblyModifedLoanCollateralItems.size() != 0) { - Set loanCollateralManagements = this.loanCollateralManagements; - boolean isTrue = possiblyModifedLoanCollateralItems.equals(loanCollateralManagements); - - if (!isTrue) { - actualChanges.put(collateralParamName, getLoanCollateralDataFormCommand(possiblyModifedLoanCollateralItems)); - } + if (!isTrue) { + actualChanges.put(PARAM_COLLATERAL, getLoanCollateralDataFormCommand(possiblyModifiedLoanCollateralItems)); } } - final String loanTermFrequencyParamName = "loanTermFrequency"; - if (command.isChangeInIntegerParameterNamed(loanTermFrequencyParamName, this.termFrequency)) { - final Integer newValue = command.integerValueOfParameterNamed(loanTermFrequencyParamName); - actualChanges.put(externalIdParamName, newValue); + if (command.isChangeInIntegerParameterNamed(LOAN_TERM_FREQUENCY, this.termFrequency)) { + final Integer newValue = command.integerValueOfParameterNamed(LOAN_TERM_FREQUENCY); + actualChanges.put(LOAN_TERM_FREQUENCY, newValue); this.termFrequency = newValue; } - final String loanTermFrequencyTypeParamName = "loanTermFrequencyType"; - if (command.isChangeInIntegerParameterNamed(loanTermFrequencyTypeParamName, this.termPeriodFrequencyType)) { - final Integer newValue = command.integerValueOfParameterNamed(loanTermFrequencyTypeParamName); + if (command.isChangeInIntegerParameterNamed(LOAN_TERM_FREQUENCY_TYPE, this.termPeriodFrequencyType)) { + final Integer newValue = command.integerValueOfParameterNamed(LOAN_TERM_FREQUENCY_TYPE); final PeriodFrequencyType newTermPeriodFrequencyType = PeriodFrequencyType.fromInt(newValue); - actualChanges.put(loanTermFrequencyTypeParamName, newTermPeriodFrequencyType.getValue()); + actualChanges.put(LOAN_TERM_FREQUENCY_TYPE, newTermPeriodFrequencyType.getValue()); this.termPeriodFrequencyType = newValue; } - final String principalParamName = "principal"; - if (command.isChangeInBigDecimalParameterNamed(principalParamName, this.approvedPrincipal)) { - final BigDecimal newValue = command.bigDecimalValueOfParameterNamed(principalParamName); - this.approvedPrincipal = newValue; + if (command.isChangeInBigDecimalParameterNamed(PRINCIPAL, this.approvedPrincipal)) { + this.approvedPrincipal = command.bigDecimalValueOfParameterNamed(PRINCIPAL); } - if (command.isChangeInBigDecimalParameterNamed(principalParamName, this.proposedPrincipal)) { - final BigDecimal newValue = command.bigDecimalValueOfParameterNamed(principalParamName); - this.proposedPrincipal = newValue; + if (command.isChangeInBigDecimalParameterNamed(PRINCIPAL, this.proposedPrincipal)) { + this.proposedPrincipal = command.bigDecimalValueOfParameterNamed(PRINCIPAL); } if (loanProduct.isMultiDisburseLoan()) { @@ -1624,7 +1633,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { if (command.isChangeInBigDecimalParameterNamed(LoanApiConstants.emiAmountParameterName, this.fixedEmiAmount)) { this.fixedEmiAmount = command.bigDecimalValueOfParameterNamed(LoanApiConstants.emiAmountParameterName); actualChanges.put(LoanApiConstants.emiAmountParameterName, this.fixedEmiAmount); - actualChanges.put("recalculateLoanSchedule", true); + actualChanges.put(RECALCULATE_LOAN_SCHEDULE, true); } } else { this.fixedEmiAmount = null; @@ -1642,7 +1651,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { } public void recalculateAllCharges() { - Set charges = this.charges(); + Set charges = this.getActiveCharges(); int penaltyWaitPeriod = 0; for (final LoanCharge loanCharge : charges) { recalculateLoanCharge(loanCharge, penaltyWaitPeriod); @@ -1675,7 +1684,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { private void recalculateLoanCharge(final LoanCharge loanCharge, final int penaltyWaitPeriod) { BigDecimal amount = BigDecimal.ZERO; - BigDecimal chargeAmt = BigDecimal.ZERO; + BigDecimal chargeAmt; BigDecimal totalChargeAmt = BigDecimal.ZERO; if (loanCharge.getChargeCalculation().isPercentageBased()) { if (loanCharge.isOverdueInstallmentCharge()) { @@ -1712,16 +1721,17 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { * if (this.loanInstallmentCharge.isEmpty()) { this.loanInstallmentCharge.addAll(newChargeInstallments); */ Loan loan = loanCharge.getLoan(); - if (loan.isSubmittedAndPendingApproval() || loan.isApproved()) { // doing for both just in case status is not - // updated at this points - if (loanCharge.isInstalmentFee()) { - loanCharge.clearLoanInstallmentCharges(); - for (final LoanRepaymentScheduleInstallment installment : getRepaymentScheduleInstallments()) { - if (installment.isRecalculatedInterestComponent()) { - continue; // JW: does this in generateInstallmentLoanCharges - but don't understand it - } - installment.getInstallmentCharges().clear(); + if (!loan.isSubmittedAndPendingApproval() && !loan.isApproved()) { + return; + } // doing for both just in case status is not + // updated at this points + if (loanCharge.isInstalmentFee()) { + loanCharge.clearLoanInstallmentCharges(); + for (final LoanRepaymentScheduleInstallment installment : getRepaymentScheduleInstallments()) { + if (installment.isRecalculatedInterestComponent()) { + continue; // JW: does this in generateInstallmentLoanCharges - but don't understand it } + installment.getInstallmentCharges().clear(); } } } @@ -1783,15 +1793,15 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { private Map parseDisbursementDetails(final JsonObject jsonObject, String dateFormat, Locale locale) { Map returnObject = new HashMap<>(); - if (jsonObject.get(LoanApiConstants.disbursementDateParameterName) != null - && jsonObject.get(LoanApiConstants.disbursementDateParameterName).isJsonPrimitive()) { - final JsonPrimitive primitive = jsonObject.get(LoanApiConstants.disbursementDateParameterName).getAsJsonPrimitive(); + if (jsonObject.get(LoanApiConstants.expectedDisbursementDateParameterName) != null + && jsonObject.get(LoanApiConstants.expectedDisbursementDateParameterName).isJsonPrimitive()) { + final JsonPrimitive primitive = jsonObject.get(LoanApiConstants.expectedDisbursementDateParameterName).getAsJsonPrimitive(); final String valueAsString = primitive.getAsString(); if (StringUtils.isNotBlank(valueAsString)) { - LocalDate date = JsonParserHelper.convertFrom(valueAsString, LoanApiConstants.disbursementDateParameterName, dateFormat, - locale); + LocalDate date = JsonParserHelper.convertFrom(valueAsString, LoanApiConstants.expectedDisbursementDateParameterName, + dateFormat, locale); if (date != null) { - returnObject.put(LoanApiConstants.disbursementDateParameterName, date); + returnObject.put(LoanApiConstants.expectedDisbursementDateParameterName, date); } } } @@ -1850,7 +1860,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { final JsonObject jsonObject = jsonElement.getAsJsonObject(); Map parsedDisbursementData = parseDisbursementDetails(jsonObject, dateFormat, locale); LocalDate expectedDisbursementDate = (LocalDate) parsedDisbursementData - .get(LoanApiConstants.disbursementDateParameterName); + .get(LoanApiConstants.expectedDisbursementDateParameterName); BigDecimal principal = (BigDecimal) parsedDisbursementData.get(LoanApiConstants.disbursementPrincipalParameterName); Long disbursementID = (Long) parsedDisbursementData.get(LoanApiConstants.disbursementIdParameterName); chargeIds = (String) parsedDisbursementData.get(LoanApiConstants.loanChargeIdParameterName); @@ -1881,7 +1891,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { } this.trancheCharges.clear(); } else { - if (loanChargeIds.size() > 0 && loanChargeIds.size() != chargeIdLength) { + if (!loanChargeIds.isEmpty() && loanChargeIds.size() != chargeIdLength) { for (Long chargeId : loanChargeIds) { LoanCharge deleteCharge = fetchLoanChargesById(chargeId); if (this.charges.contains(deleteCharge)) { @@ -1893,7 +1903,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { for (Long id : disbursementList) { removeChargesByDisbursementID(id); this.disbursementDetails.remove(fetchLoanDisbursementsById(id)); - actualChanges.put("recalculateLoanSchedule", true); + actualChanges.put(RECALCULATE_LOAN_SCHEDULE, true); } } @@ -1911,7 +1921,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { if (!loanDisbursementDetail.equals(disbursementDetails)) { loanDisbursementDetail.copy(disbursementDetails); actualChanges.put("disbursementDetailId", disbursementID); - actualChanges.put("recalculateLoanSchedule", true); + actualChanges.put(RECALCULATE_LOAN_SCHEDULE, true); } } } else { @@ -1931,7 +1941,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { addLoanCharge(loanCharge); } actualChanges.put(LoanApiConstants.disbursementDataParameterName, expectedDisbursementDate + "-" + principal); - actualChanges.put("recalculateLoanSchedule", true); + actualChanges.put(RECALCULATE_LOAN_SCHEDULE, true); } } @@ -2063,7 +2073,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { // charges are optional int penaltyWaitPeriod = 0; - for (final LoanCharge loanCharge : charges()) { + for (final LoanCharge loanCharge : getActiveCharges()) { recalculateLoanCharge(loanCharge, penaltyWaitPeriod); } @@ -2110,9 +2120,9 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { final LoanStatus statusEnum = loanLifecycleStateMachine.dryTransition(LoanEvent.LOAN_REJECTED, this); if (!statusEnum.hasStateOf(LoanStatus.fromInt(this.loanStatus))) { loanLifecycleStateMachine.transition(LoanEvent.LOAN_REJECTED, this); - actualChanges.put("status", LoanEnumerations.status(this.loanStatus)); + actualChanges.put(PARAM_STATUS, LoanEnumerations.status(this.loanStatus)); - final LocalDate rejectedOn = command.localDateValueOfParameterNamed("rejectedOnDate"); + final LocalDate rejectedOn = command.localDateValueOfParameterNamed(REJECTED_ON_DATE); final Locale locale = new Locale(command.locale()); final DateTimeFormatter fmt = DateTimeFormatter.ofPattern(command.dateFormat()).withLocale(locale); @@ -2122,10 +2132,10 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { this.closedOnDate = rejectedOn; this.closedBy = currentUser; - actualChanges.put("locale", command.locale()); - actualChanges.put("dateFormat", command.dateFormat()); - actualChanges.put("rejectedOnDate", rejectedOn.format(fmt)); - actualChanges.put("closedOnDate", rejectedOn.format(fmt)); + actualChanges.put(LOCALE, command.locale()); + actualChanges.put(DATE_FORMAT, command.dateFormat()); + actualChanges.put(REJECTED_ON_DATE, rejectedOn.format(fmt)); + actualChanges.put(CLOSED_ON_DATE, rejectedOn.format(fmt)); if (rejectedOn.isBefore(getSubmittedOnDate())) { final String errorMessage = "The date on which a loan is rejected cannot be before its submittal date: " @@ -2156,11 +2166,11 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { final LoanStatus statusEnum = loanLifecycleStateMachine.dryTransition(LoanEvent.LOAN_WITHDRAWN, this); if (!statusEnum.hasStateOf(LoanStatus.fromInt(this.loanStatus))) { loanLifecycleStateMachine.transition(LoanEvent.LOAN_WITHDRAWN, this); - actualChanges.put("status", LoanEnumerations.status(this.loanStatus)); + actualChanges.put(PARAM_STATUS, LoanEnumerations.status(this.loanStatus)); - LocalDate withdrawnOn = command.localDateValueOfParameterNamed("withdrawnOnDate"); + LocalDate withdrawnOn = command.localDateValueOfParameterNamed(WITHDRAWN_ON_DATE); if (withdrawnOn == null) { - withdrawnOn = command.localDateValueOfParameterNamed("eventDate"); + withdrawnOn = command.localDateValueOfParameterNamed(EVENT_DATE); } final Locale locale = new Locale(command.locale()); @@ -2171,10 +2181,10 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { this.closedOnDate = withdrawnOn; this.closedBy = currentUser; - actualChanges.put("locale", command.locale()); - actualChanges.put("dateFormat", command.dateFormat()); - actualChanges.put("withdrawnOnDate", withdrawnOn.format(fmt)); - actualChanges.put("closedOnDate", withdrawnOn.format(fmt)); + actualChanges.put(LOCALE, command.locale()); + actualChanges.put(DATE_FORMAT, command.dateFormat()); + actualChanges.put(WITHDRAWN_ON_DATE, withdrawnOn.format(fmt)); + actualChanges.put(CLOSED_ON_DATE, withdrawnOn.format(fmt)); if (withdrawnOn.isBefore(getSubmittedOnDate())) { final String errorMessage = "The date on which a loan is withdrawn cannot be before its submittal date: " @@ -2219,17 +2229,17 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { if (!newStatusEnum.hasStateOf(LoanStatus.fromInt(this.loanStatus))) { loanLifecycleStateMachine.transition(LoanEvent.LOAN_APPROVED, this); - actualChanges.put("status", LoanEnumerations.status(this.loanStatus)); + actualChanges.put(PARAM_STATUS, LoanEnumerations.status(this.loanStatus)); // only do below if status has changed in the 'approval' case - LocalDate approvedOn = command.localDateValueOfParameterNamed("approvedOnDate"); - String approvedOnDateChange = command.stringValueOfParameterNamed("approvedOnDate"); + LocalDate approvedOn = command.localDateValueOfParameterNamed(APPROVED_ON_DATE); + String approvedOnDateChange = command.stringValueOfParameterNamed(APPROVED_ON_DATE); if (approvedOn == null) { - approvedOn = command.localDateValueOfParameterNamed("eventDate"); - approvedOnDateChange = command.stringValueOfParameterNamed("eventDate"); + approvedOn = command.localDateValueOfParameterNamed(EVENT_DATE); + approvedOnDateChange = command.stringValueOfParameterNamed(EVENT_DATE); } - LocalDate expecteddisbursementDate = command.localDateValueOfParameterNamed("expectedDisbursementDate"); + LocalDate expecteddisbursementDate = command.localDateValueOfParameterNamed(EXPECTED_DISBURSEMENT_DATE); BigDecimal approvedLoanAmount = command.bigDecimalValueOfParameterNamed(LoanApiConstants.approvedLoanAmountParameterName); if (approvedLoanAmount != null) { @@ -2276,9 +2286,9 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { } this.approvedOnDate = approvedOn; this.approvedBy = currentUser; - actualChanges.put("locale", command.locale()); - actualChanges.put("dateFormat", command.dateFormat()); - actualChanges.put("approvedOnDate", approvedOnDateChange); + actualChanges.put(LOCALE, command.locale()); + actualChanges.put(DATE_FORMAT, command.dateFormat()); + actualChanges.put(APPROVED_ON_DATE, approvedOnDateChange); final LocalDate submittalDate = this.submittedOnDate; if (approvedOn.isBefore(submittalDate)) { @@ -2290,7 +2300,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { if (expecteddisbursementDate != null) { this.expectedDisbursementDate = expecteddisbursementDate; - actualChanges.put("expectedDisbursementDate", expectedDisbursementDate); + actualChanges.put(EXPECTED_DISBURSEMENT_DATE, expectedDisbursementDate); if (expecteddisbursementDate.isBefore(approvedOn)) { final String errorMessage = "The expected disbursement date should be either on or after the approval date: " @@ -2360,7 +2370,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { final LoanStatus statusEnum = loanLifecycleStateMachine.dryTransition(LoanEvent.LOAN_APPROVAL_UNDO, this); if (!statusEnum.hasStateOf(currentStatus)) { loanLifecycleStateMachine.transition(LoanEvent.LOAN_APPROVAL_UNDO, this); - actualChanges.put("status", LoanEnumerations.status(this.loanStatus)); + actualChanges.put(PARAM_STATUS, LoanEnumerations.status(this.loanStatus)); this.approvedOnDate = null; this.approvedBy = null; @@ -2374,7 +2384,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { } - actualChanges.put("approvedOnDate", ""); + actualChanges.put(APPROVED_ON_DATE, ""); this.loanOfficerHistory.clear(); } @@ -2408,14 +2418,14 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { public ChangedTransactionDetail disburse(final AppUser currentUser, final JsonCommand command, final Map actualChanges, final ScheduleGeneratorDTO scheduleGeneratorDTO, final PaymentDetail paymentDetail) { - final LocalDate actualDisbursementDate = command.localDateValueOfParameterNamed("actualDisbursementDate"); + final LocalDate actualDisbursementDate = command.localDateValueOfParameterNamed(ACTUAL_DISBURSEMENT_DATE); this.disbursedBy = currentUser; updateLoanScheduleDependentDerivedFields(); - actualChanges.put("locale", command.locale()); - actualChanges.put("dateFormat", command.dateFormat()); - actualChanges.put("actualDisbursementDate", command.stringValueOfParameterNamed("actualDisbursementDate")); + actualChanges.put(LOCALE, command.locale()); + actualChanges.put(DATE_FORMAT, command.dateFormat()); + actualChanges.put(ACTUAL_DISBURSEMENT_DATE, command.stringValueOfParameterNamed(ACTUAL_DISBURSEMENT_DATE)); HolidayDetailDTO holidayDetailDTO = scheduleGeneratorDTO.getHolidayDetailDTO(); @@ -2446,7 +2456,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { ChangedTransactionDetail result = reprocessTransactionForDisbursement(); this.loanLifecycleStateMachine.transition(LoanEvent.LOAN_DISBURSED, this); - actualChanges.put("status", LoanEnumerations.status(this.loanStatus)); + actualChanges.put(PARAM_STATUS, LoanEnumerations.status(this.loanStatus)); return result; } @@ -2464,7 +2474,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { private List getDisbursedLoanDisbursementDetails() { List ret = new ArrayList<>(); - if (this.disbursementDetails != null && this.disbursementDetails.size() > 0) { + if (this.disbursementDetails != null && !this.disbursementDetails.isEmpty()) { for (LoanDisbursementDetails disbursementDetail : getDisbursementDetails()) { if (disbursementDetail.actualDisbursementDate() != null) { ret.add(disbursementDetail); @@ -2621,7 +2631,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { final LoanRepaymentScheduleTransactionProcessor loanRepaymentScheduleTransactionProcessor = this.transactionProcessorFactory .determineProcessor(this.transactionProcessingStrategy); changedTransactionDetail = loanRepaymentScheduleTransactionProcessor.handleTransaction(getDisbursementDate(), - allNonContraTransactionsPostDisbursement, getCurrency(), getRepaymentScheduleInstallments(), charges()); + allNonContraTransactionsPostDisbursement, getCurrency(), getRepaymentScheduleInstallments(), getActiveCharges()); for (final Map.Entry mapEntry : changedTransactionDetail.getNewTransactionMappings().entrySet()) { mapEntry.getValue().updateLoan(this); } @@ -2656,12 +2666,10 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { LocalDate date = this.actualDisbursementDate; if (date != null) { for (LoanDisbursementDetails disbursementDetail : getDisbursementDetails()) { - if (disbursementDetail.actualDisbursementDate() != null) { - if (disbursementDetail.actualDisbursementDate().isAfter(date) - || disbursementDetail.actualDisbursementDate().compareTo(date) == 0 ? Boolean.TRUE : Boolean.FALSE) { - date = disbursementDetail.actualDisbursementDate(); - details = disbursementDetail; - } + if (disbursementDetail.actualDisbursementDate() != null && (disbursementDetail.actualDisbursementDate().isAfter(date) + || disbursementDetail.actualDisbursementDate().compareTo(date) == 0 ? Boolean.TRUE : Boolean.FALSE)) { + date = disbursementDetail.actualDisbursementDate(); + details = disbursementDetail; } } } @@ -2702,7 +2710,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { private boolean isDisbursementAllowed() { boolean isAllowed = false; List disbursementDetails = getDisbursementDetails(); - if (disbursementDetails == null || disbursementDetails.size() == 0) { + if (disbursementDetails == null || disbursementDetails.isEmpty()) { isAllowed = true; } else { for (LoanDisbursementDetails disbursementDetail : disbursementDetails) { @@ -2742,7 +2750,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { return; } updateLoanSchedule(loanSchedule); - final Set charges = this.charges(); + final Set charges = this.getActiveCharges(); for (final LoanCharge loanCharge : charges) { if (!loanCharge.isWaived()) { recalculateLoanCharge(loanCharge, scheduleGeneratorDTO.getPenaltyWaitPeriod()); @@ -2761,7 +2769,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { if (loanApplicationTerms.getInterestMethod().isDecliningBalance()) { final LoanScheduleGenerator decliningLoanScheduleGenerator = scheduleGeneratorDTO.getLoanScheduleFactory() .create(InterestMethod.DECLINING_BALANCE); - Set loanCharges = charges(); + Set loanCharges = getActiveCharges(); LoanScheduleModel loanSchedule = decliningLoanScheduleGenerator.generate(mc, loanApplicationTerms, loanCharges, scheduleGeneratorDTO.getHolidayDetailDTO()); @@ -2774,9 +2782,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { loanScheduleGenerator = scheduleGeneratorDTO.getLoanScheduleFactory().create(loanApplicationTerms.getInterestMethod()); } - final LoanScheduleModel loanSchedule = loanScheduleGenerator.generate(mc, loanApplicationTerms, charges(), - scheduleGeneratorDTO.getHolidayDetailDTO()); - return loanSchedule; + return loanScheduleGenerator.generate(mc, loanApplicationTerms, getActiveCharges(), scheduleGeneratorDTO.getHolidayDetailDTO()); } private BigDecimal constructFloatingInterestRates(final BigDecimal annualNominalInterestRate, final FloatingRateDTO floatingRateDTO, @@ -2821,8 +2827,11 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { final LoanTransaction chargesPayment = LoanTransaction.repaymentAtDisbursement(getOffice(), disbursentMoney, paymentDetail, disbursedOn, null); final Integer installmentNumber = null; - for (final LoanCharge charge : charges()) { + for (final LoanCharge charge : getActiveCharges()) { LocalDate actualDisbursementDate = getActualDisbursementDate(charge); + /** + * create a Charge applied transaction if Up front Accrual, None or Cash based accounting is enabled + **/ if ((charge.getCharge().getChargeTimeType().equals(ChargeTimeType.DISBURSEMENT.getValue()) && disbursedOn.equals(actualDisbursementDate) && (actualDisbursementDate != null) && !charge.isWaived() && !charge.isFullyPaid()) @@ -2837,13 +2846,8 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { chargesPayment.getLoanChargesPaid().add(loanChargePaidBy); disbursentMoney = disbursentMoney.plus(charge.amount()); } - } else if (disbursedOn.equals(this.actualDisbursementDate)) { - /** - * create a Charge applied transaction if Up front Accrual, None or Cash based accounting is enabled - **/ - if (isNoneOrCashOrUpfrontAccrualAccountingEnabledOnLoanProduct()) { - handleChargeAppliedTransaction(charge, disbursedOn); - } + } else if (disbursedOn.equals(this.actualDisbursementDate) && isNoneOrCashOrUpfrontAccrualAccountingEnabledOnLoanProduct()) { + handleChargeAppliedTransaction(charge, disbursedOn); } } @@ -2922,7 +2926,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { existingReversedTransactionIds.addAll(findExistingReversedTransactionIds()); if (!statusEnum.hasStateOf(currentStatus)) { this.loanLifecycleStateMachine.transition(LoanEvent.LOAN_DISBURSAL_UNDO, this); - actualChanges.put("status", LoanEnumerations.status(this.loanStatus)); + actualChanges.put(PARAM_STATUS, LoanEnumerations.status(this.loanStatus)); final LocalDate actualDisbursementDate = getDisbursementDate(); final boolean isScheduleRegenerateRequired = isRepaymentScheduleRegenerationRequiredForDisbursement(actualDisbursementDate); @@ -2937,7 +2941,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { details.updateActualDisbursementDate(null); } } - boolean isEmiAmountChanged = this.loanTermVariations.size() > 0; + boolean isEmiAmountChanged = !this.loanTermVariations.isEmpty(); updateLoanToPreDisbursalState(); if (isScheduleRegenerateRequired || isDisbursedAmountChanged || isEmiAmountChanged @@ -2962,7 +2966,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { this.adjustNetDisbursalAmount(this.approvedPrincipal); - actualChanges.put("actualDisbursementDate", ""); + actualChanges.put(ACTUAL_DISBURSEMENT_DATE, ""); updateLoanSummaryDerivedFields(); @@ -2988,7 +2992,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { this.accruedTill = null; reverseExistingTransactions(); - for (final LoanCharge charge : charges()) { + for (final LoanCharge charge : getActiveCharges()) { if (charge.isOverdueInstallmentCharge()) { charge.setActive(false); } else { @@ -3005,7 +3009,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { } } final LoanRepaymentScheduleProcessingWrapper wrapper = new LoanRepaymentScheduleProcessingWrapper(); - wrapper.reprocess(getCurrency(), getDisbursementDate(), getRepaymentScheduleInstallments(), charges()); + wrapper.reprocess(getCurrency(), getDisbursementDate(), getRepaymentScheduleInstallments(), getActiveCharges()); updateLoanSummaryDerivedFields(); } @@ -3023,10 +3027,8 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { existingTransactionIds.addAll(findExistingTransactionIds()); existingReversedTransactionIds.addAll(findExistingReversedTransactionIds()); - final ChangedTransactionDetail changedTransactionDetail = handleRepaymentOrRecoveryOrWaiverTransaction(waiveInterestTransaction, - loanLifecycleStateMachine, null, scheduleGeneratorDTO); - - return changedTransactionDetail; + return handleRepaymentOrRecoveryOrWaiverTransaction(waiveInterestTransaction, loanLifecycleStateMachine, null, + scheduleGeneratorDTO); } @SuppressWarnings("null") @@ -3057,10 +3059,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { existingTransactionIds.addAll(findExistingTransactionIds()); existingReversedTransactionIds.addAll(findExistingReversedTransactionIds()); - final ChangedTransactionDetail changedTransactionDetail = handleRepaymentOrRecoveryOrWaiverTransaction(repaymentTransaction, - loanLifecycleStateMachine, null, scheduleGeneratorDTO); - - return changedTransactionDetail; + return handleRepaymentOrRecoveryOrWaiverTransaction(repaymentTransaction, loanLifecycleStateMachine, null, scheduleGeneratorDTO); } private void validateRepaymentTypeAccountStatus(LoanTransaction repaymentTransaction, LoanEvent event) { @@ -3120,7 +3119,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { existingTransactionIds.addAll(findExistingTransactionIds()); existingReversedTransactionIds.addAll(findExistingReversedTransactionIds()); - if (status().isOverpaid()) { + if (getStatus().isOverpaid()) { if (this.totalOverpaid.compareTo(loanTransaction.getAmount(getCurrency()).getAmount()) < 0) { final String errorMessage = "The refund amount must be less than or equal to overpaid amount "; throw new InvalidLoanStateTransitionException("transaction", "is.exceeding.overpaid.amount", errorMessage, @@ -3149,13 +3148,6 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { ChangedTransactionDetail changedTransactionDetail = null; - LoanStatus statusEnum = null; - - LocalDate recalculateFrom = loanTransaction.getTransactionDate(); - if (adjustedTransaction != null && adjustedTransaction.getTransactionDate().isBefore(recalculateFrom)) { - recalculateFrom = adjustedTransaction.getTransactionDate(); - } - if (loanTransaction.isRecoveryRepayment()) { loanLifecycleStateMachine.transition(LoanEvent.LOAN_RECOVERY_PAYMENT, this); } else { @@ -3232,7 +3224,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { if (isTransactionChronologicallyLatest && adjustedTransaction == null && (!reprocess || !this.repaymentScheduleDetail().isInterestRecalculationEnabled()) && !isForeclosure()) { loanRepaymentScheduleTransactionProcessor.handleTransaction(loanTransaction, getCurrency(), getRepaymentScheduleInstallments(), - charges()); + getActiveCharges()); reprocess = false; if (this.repaymentScheduleDetail().isInterestRecalculationEnabled()) { if (currentInstallment == null || currentInstallment.isNotFullyPaidOff()) { @@ -3252,7 +3244,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { } final List allNonContraTransactionsPostDisbursement = retreiveListOfTransactionsPostDisbursement(); changedTransactionDetail = loanRepaymentScheduleTransactionProcessor.handleTransaction(getDisbursementDate(), - allNonContraTransactionsPostDisbursement, getCurrency(), getRepaymentScheduleInstallments(), charges()); + allNonContraTransactionsPostDisbursement, getCurrency(), getRepaymentScheduleInstallments(), getActiveCharges()); for (final Map.Entry mapEntry : changedTransactionDetail.getNewTransactionMappings().entrySet()) { mapEntry.getValue().updateLoan(this); } @@ -3401,7 +3393,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { private void processIncomeAccrualTransactionOnLoanClosure() { if (this.loanInterestRecalculationDetails != null && this.loanInterestRecalculationDetails.isCompoundingToBePostedAsTransaction() - && this.status().isClosedObligationsMet()) { + && this.getStatus().isClosedObligationsMet()) { LocalDate closedDate = this.getClosedOnDate(); reverseTransactionsOnOrAfter(retreiveListOfIncomePostingTransactions(), closedDate); reverseTransactionsOnOrAfter(retreiveListOfAccrualTransactions(), closedDate); @@ -3409,11 +3401,11 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { determineCumulativeIncomeFromInstallments(cumulativeIncomeFromInstallments); HashMap cumulativeIncomeFromIncomePosting = new HashMap<>(); determineCumulativeIncomeDetails(retreiveListOfIncomePostingTransactions(), cumulativeIncomeFromIncomePosting); - BigDecimal interestToPost = cumulativeIncomeFromInstallments.get("interest") - .subtract(cumulativeIncomeFromIncomePosting.get("interest")); - BigDecimal feeToPost = cumulativeIncomeFromInstallments.get("fee").subtract(cumulativeIncomeFromIncomePosting.get("fee")); - BigDecimal penaltyToPost = cumulativeIncomeFromInstallments.get("penalty") - .subtract(cumulativeIncomeFromIncomePosting.get("penalty")); + BigDecimal interestToPost = cumulativeIncomeFromInstallments.get(INTEREST) + .subtract(cumulativeIncomeFromIncomePosting.get(INTEREST)); + BigDecimal feeToPost = cumulativeIncomeFromInstallments.get(FEE).subtract(cumulativeIncomeFromIncomePosting.get(FEE)); + BigDecimal penaltyToPost = cumulativeIncomeFromInstallments.get(PENALTY) + .subtract(cumulativeIncomeFromIncomePosting.get(PENALTY)); BigDecimal amountToPost = interestToPost.add(feeToPost).add(penaltyToPost); LoanTransaction finalIncomeTransaction = LoanTransaction.incomePosting(this, this.getOffice(), closedDate, amountToPost, interestToPost, feeToPost, penaltyToPost); @@ -3421,7 +3413,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { if (isPeriodicAccrualAccountingEnabledOnLoanProduct()) { List updatedAccrualTransactions = retreiveListOfAccrualTransactions(); LocalDate lastAccruedDate = this.getDisbursementDate(); - if (updatedAccrualTransactions != null && updatedAccrualTransactions.size() > 0) { + if (!updatedAccrualTransactions.isEmpty()) { lastAccruedDate = updatedAccrualTransactions.get(updatedAccrualTransactions.size() - 1).getTransactionDate(); } HashMap feeDetails = new HashMap<>(); @@ -3445,9 +3437,9 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { fee = fee.add(installment.getFeeChargesCharged(getCurrency()).getAmount()); penalty = penalty.add(installment.getPenaltyChargesCharged(getCurrency()).getAmount()); } - cumulativeIncomeFromInstallments.put("interest", interest); - cumulativeIncomeFromInstallments.put("fee", fee); - cumulativeIncomeFromInstallments.put("penalty", penalty); + cumulativeIncomeFromInstallments.put(INTEREST, interest); + cumulativeIncomeFromInstallments.put(FEE, fee); + cumulativeIncomeFromInstallments.put(PENALTY, penalty); } private void determineCumulativeIncomeDetails(Collection transactions, HashMap incomeDetailsMap) { @@ -3459,9 +3451,9 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { fee = fee.add(transaction.getFeeChargesPortion(getCurrency()).getAmount()); penalty = penalty.add(transaction.getPenaltyChargesPortion(getCurrency()).getAmount()); } - incomeDetailsMap.put("interest", interest); - incomeDetailsMap.put("fee", fee); - incomeDetailsMap.put("penalty", penalty); + incomeDetailsMap.put(INTEREST, interest); + incomeDetailsMap.put(FEE, fee); + incomeDetailsMap.put(PENALTY, penalty); } private void handleLoanOverpayment(final LoanLifecycleStateMachine loanLifecycleStateMachine) { @@ -3479,12 +3471,11 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { final LocalDate currentTransactionDate = loanTransaction.getTransactionDate(); for (final LoanTransaction previousTransaction : loanTransactions) { - if (!previousTransaction.isDisbursement() && previousTransaction.isNotReversed()) { - if (currentTransactionDate.isBefore(previousTransaction.getTransactionDate()) - || currentTransactionDate.isEqual(previousTransaction.getTransactionDate())) { - isChronologicallyLatestRepaymentOrWaiver = false; - break; - } + if (!previousTransaction.isDisbursement() && previousTransaction.isNotReversed() + && (currentTransactionDate.isBefore(previousTransaction.getTransactionDate()) + || currentTransactionDate.isEqual(previousTransaction.getTransactionDate()))) { + isChronologicallyLatestRepaymentOrWaiver = false; + break; } } @@ -3497,11 +3488,10 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { final LocalDate currentTransactionDate = loanTransaction.getTransactionDate(); for (final LoanTransaction previousTransaction : loanTransactions) { - if (previousTransaction.isRepaymentType() && previousTransaction.isNotReversed()) { - if (currentTransactionDate.isBefore(previousTransaction.getTransactionDate())) { - isAfterLatRepayment = false; - break; - } + if (previousTransaction.isRepaymentType() && previousTransaction.isNotReversed() + && currentTransactionDate.isBefore(previousTransaction.getTransactionDate())) { + isAfterLatRepayment = false; + break; } } return isAfterLatRepayment; @@ -3514,12 +3504,10 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { final LocalDate currentTransactionDate = loanTransaction.getTransactionDate(); for (final LoanTransaction previousTransaction : loanTransactions) { - if (previousTransaction.isNotReversed()) { - if (currentTransactionDate.isBefore(previousTransaction.getTransactionDate()) - || currentTransactionDate.isEqual(previousTransaction.getTransactionDate())) { - isChronologicallyLatestRepaymentOrWaiver = false; - break; - } + if (previousTransaction.isNotReversed() && (currentTransactionDate.isBefore(previousTransaction.getTransactionDate()) + || currentTransactionDate.isEqual(previousTransaction.getTransactionDate()))) { + isChronologicallyLatestRepaymentOrWaiver = false; + break; } } @@ -3656,7 +3644,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { } ChangedTransactionDetail changedTransactionDetail = loanRepaymentScheduleTransactionProcessor.handleTransaction( getDisbursementDate(), allNonContraTransactionsPostDisbursement, getCurrency(), getRepaymentScheduleInstallments(), - charges()); + getActiveCharges()); updateLoanSummaryDerivedFields(); return changedTransactionDetail; } @@ -3695,11 +3683,12 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { } for (final LoanTransaction loanTransaction : this.loanTransactions) { - if (!loanTransaction.isReversed()) { - if ((loanTransaction.isRefund() || loanTransaction.isRefundForActiveLoan() || loanTransaction.isCreditBalanceRefund() - || loanTransaction.isChargeback())) { - totalPaidInRepayments = totalPaidInRepayments.minus(loanTransaction.getAmount(currency)); - } + if (loanTransaction.isReversed()) { + continue; + } + if ((loanTransaction.isRefund() || loanTransaction.isRefundForActiveLoan() || loanTransaction.isCreditBalanceRefund() + || loanTransaction.isChargeback())) { + totalPaidInRepayments = totalPaidInRepayments.minus(loanTransaction.getAmount(currency)); } } @@ -3709,10 +3698,9 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { } public Money calculateTotalRecoveredPayments() { - Money totalRecoveredPayments = getTotalRecoveredPayments(); // in case logic for reversing recovered payment is implemented handle // subtraction from totalRecoveredPayments - return totalRecoveredPayments; + return getTotalRecoveredPayments(); } private MonetaryCurrency loanCurrency() { @@ -3735,19 +3723,19 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { LoanTransaction loanTransaction = null; if (!statusEnum.hasStateOf(LoanStatus.fromInt(this.loanStatus))) { loanLifecycleStateMachine.transition(LoanEvent.WRITE_OFF_OUTSTANDING, this); - changes.put("status", LoanEnumerations.status(this.loanStatus)); + changes.put(PARAM_STATUS, LoanEnumerations.status(this.loanStatus)); existingTransactionIds.addAll(findExistingTransactionIds()); existingReversedTransactionIds.addAll(findExistingReversedTransactionIds()); - final LocalDate writtenOffOnLocalDate = command.localDateValueOfParameterNamed("transactionDate"); - final String txnExternalId = command.stringValueOfParameterNamedAllowingNull("externalId"); + final LocalDate writtenOffOnLocalDate = command.localDateValueOfParameterNamed(TRANSACTION_DATE); + final String txnExternalId = command.stringValueOfParameterNamedAllowingNull(EXTERNAL_ID); this.closedOnDate = writtenOffOnLocalDate; this.writtenOffOnDate = writtenOffOnLocalDate; this.closedBy = currentUser; - changes.put("closedOnDate", command.stringValueOfParameterNamed("transactionDate")); - changes.put("writtenOffOnDate", command.stringValueOfParameterNamed("transactionDate")); + changes.put(CLOSED_ON_DATE, command.stringValueOfParameterNamed(TRANSACTION_DATE)); + changes.put(WRITTEN_OFF_ON_DATE, command.stringValueOfParameterNamed(TRANSACTION_DATE)); if (writtenOffOnLocalDate.isBefore(getDisbursementDate())) { final String errorMessage = "The date on which a loan is written off cannot be before the loan disbursement date: " @@ -3795,7 +3783,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { } final List allNonContraTransactionsPostDisbursement = retreiveListOfTransactionsPostDisbursement(); changedTransactionDetail = loanRepaymentScheduleTransactionProcessor.handleTransaction(getDisbursementDate(), - allNonContraTransactionsPostDisbursement, getCurrency(), getRepaymentScheduleInstallments(), charges()); + allNonContraTransactionsPostDisbursement, getCurrency(), getRepaymentScheduleInstallments(), getActiveCharges()); for (final Map.Entry mapEntry : changedTransactionDetail.getNewTransactionMappings().entrySet()) { mapEntry.getValue().updateLoan(this); addLoanTransaction(mapEntry.getValue()); @@ -3827,11 +3815,11 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { existingTransactionIds.addAll(findExistingTransactionIds()); existingReversedTransactionIds.addAll(findExistingReversedTransactionIds()); - final LocalDate closureDate = command.localDateValueOfParameterNamed("transactionDate"); - final String txnExternalId = command.stringValueOfParameterNamedAllowingNull("externalId"); + final LocalDate closureDate = command.localDateValueOfParameterNamed(TRANSACTION_DATE); + final String txnExternalId = command.stringValueOfParameterNamedAllowingNull(EXTERNAL_ID); this.closedOnDate = closureDate; - changes.put("closedOnDate", command.stringValueOfParameterNamed("transactionDate")); + changes.put(CLOSED_ON_DATE, command.stringValueOfParameterNamed(TRANSACTION_DATE)); validateActivityNotBeforeClientOrGroupTransferDate(LoanEvent.REPAID_IN_FULL, closureDate); if (closureDate.isBefore(getDisbursementDate())) { @@ -3858,7 +3846,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { final LoanStatus statusEnum = loanLifecycleStateMachine.dryTransition(LoanEvent.REPAID_IN_FULL, this); if (!statusEnum.hasStateOf(LoanStatus.fromInt(this.loanStatus))) { loanLifecycleStateMachine.transition(LoanEvent.REPAID_IN_FULL, this); - changes.put("status", LoanEnumerations.status(this.loanStatus)); + changes.put(PARAM_STATUS, LoanEnumerations.status(this.loanStatus)); } this.closedOnDate = closureDate; loanTransaction = LoanTransaction.writeoff(this, getOffice(), closureDate, txnExternalId); @@ -3890,7 +3878,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { final LoanStatus statusEnum = loanLifecycleStateMachine.dryTransition(LoanEvent.REPAID_IN_FULL, this); if (!statusEnum.hasStateOf(LoanStatus.fromInt(this.loanStatus))) { loanLifecycleStateMachine.transition(LoanEvent.REPAID_IN_FULL, this); - changes.put("status", LoanEnumerations.status(this.loanStatus)); + changes.put(PARAM_STATUS, LoanEnumerations.status(this.loanStatus)); } this.closedOnDate = closureDate; } else if (totalLoanOverpayment.isGreaterThanZero()) { @@ -3913,18 +3901,18 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { public void closeAsMarkedForReschedule(final JsonCommand command, final LoanLifecycleStateMachine loanLifecycleStateMachine, final Map changes) { - final LocalDate rescheduledOn = command.localDateValueOfParameterNamed("transactionDate"); + final LocalDate rescheduledOn = command.localDateValueOfParameterNamed(TRANSACTION_DATE); final LoanStatus statusEnum = loanLifecycleStateMachine.dryTransition(LoanEvent.LOAN_RESCHEDULE, this); if (!statusEnum.hasStateOf(LoanStatus.fromInt(this.loanStatus))) { loanLifecycleStateMachine.transition(LoanEvent.LOAN_RESCHEDULE, this); - changes.put("status", LoanEnumerations.status(this.loanStatus)); + changes.put(PARAM_STATUS, LoanEnumerations.status(this.loanStatus)); } this.closedOnDate = rescheduledOn; this.rescheduledOnDate = rescheduledOn; - changes.put("closedOnDate", command.stringValueOfParameterNamed("transactionDate")); - changes.put("rescheduledOnDate", command.stringValueOfParameterNamed("transactionDate")); + changes.put(CLOSED_ON_DATE, command.stringValueOfParameterNamed(TRANSACTION_DATE)); + changes.put("rescheduledOnDate", command.stringValueOfParameterNamed(TRANSACTION_DATE)); if (this.rescheduledOnDate.isBefore(getDisbursementDate())) { final String errorMessage = "The date on which a loan is rescheduled cannot be before the loan disbursement date: " @@ -3944,7 +3932,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { return !isSubmittedAndPendingApproval(); } - public LoanStatus status() { + public LoanStatus getStatus() { return LoanStatus.fromInt(this.loanStatus); } @@ -3953,11 +3941,11 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { } public boolean isSubmittedAndPendingApproval() { - return status().isSubmittedAndPendingApproval(); + return getStatus().isSubmittedAndPendingApproval(); } public boolean isApproved() { - return status().isApproved(); + return getStatus().isApproved(); } private boolean isNotDisbursed() { @@ -3979,19 +3967,19 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { } public boolean isClosed() { - return status().isClosed() || isCancelled(); + return getStatus().isClosed() || isCancelled(); } private boolean isClosedObligationsMet() { - return status().isClosedObligationsMet(); + return getStatus().isClosedObligationsMet(); } public boolean isClosedWrittenOff() { - return status().isClosedWrittenOff(); + return getStatus().isClosedWrittenOff(); } private boolean isClosedWithOutsandingAmountMarkedForReschedule() { - return status().isClosedWithOutsandingAmountMarkedForReschedule(); + return getStatus().isClosedWithOutsandingAmountMarkedForReschedule(); } private boolean isCancelled() { @@ -3999,15 +3987,15 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { } private boolean isWithdrawn() { - return status().isWithdrawnByClient(); + return getStatus().isWithdrawnByClient(); } private boolean isRejected() { - return status().isRejected(); + return getStatus().isRejected(); } public boolean isOpen() { - return status().isActive(); + return getStatus().isActive(); } private boolean isAllTranchesNotDisbursed() { @@ -4028,7 +4016,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { } public boolean isSubmittedOnDateAfter(final LocalDate compareDate) { - return this.submittedOnDate == null ? false : this.submittedOnDate.isAfter(compareDate); + return this.submittedOnDate != null && this.submittedOnDate.isAfter(compareDate); } public LocalDate getSubmittedOnDate() { @@ -4460,17 +4448,16 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { } public boolean isSyncDisbursementWithMeeting() { - return this.syncDisbursementWithMeeting == null ? false : this.syncDisbursementWithMeeting; + return this.syncDisbursementWithMeeting != null && this.syncDisbursementWithMeeting; } public LocalDate getClosedOnDate() { return this.closedOnDate; } - public void updateLoanRepaymentScheduleDates(final LocalDate meetingStartDate, final String recuringRule, - final boolean isHolidayEnabled, final List holidays, final WorkingDays workingDays, - final Boolean reschedulebasedOnMeetingDates, final LocalDate presentMeetingDate, final LocalDate newMeetingDate, - final boolean isSkipRepaymentonfirstdayofmonth, final Integer numberofDays) { + public void updateLoanRepaymentScheduleDates(final String recurringRule, final boolean isHolidayEnabled, final List holidays, + final WorkingDays workingDays, final LocalDate presentMeetingDate, final LocalDate newMeetingDate, + final boolean isSkipRepaymentOnFirstDayOfMonth, final Integer numberOfDays) { // first repayment's from date is same as disbursement date. /* @@ -4501,8 +4488,8 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { // tmpFromDate.plusDays(1) is done to make sure // getNewRepaymentMeetingDate method returns next meeting // date and not the same as tmpFromDate - newRepaymentDate = CalendarUtils.getNewRepaymentMeetingDate(recuringRule, tmpFromDate, tmpFromDate.plusDays(1), - loanRepaymentInterval, frequency, workingDays, isSkipRepaymentonfirstdayofmonth, numberofDays); + newRepaymentDate = CalendarUtils.getNewRepaymentMeetingDate(recurringRule, tmpFromDate, tmpFromDate.plusDays(1), + loanRepaymentInterval, frequency, workingDays, isSkipRepaymentOnFirstDayOfMonth, numberOfDays); } if (isHolidayEnabled) { @@ -4610,41 +4597,32 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { } private void validateDisbursementDateIsOnNonWorkingDay(final WorkingDays workingDays, final boolean allowTransactionsOnNonWorkingDay) { - if (!allowTransactionsOnNonWorkingDay) { - if (!WorkingDaysUtil.isWorkingDay(workingDays, getDisbursementDate())) { - final String errorMessage = "Expected disbursement date cannot be on a non working day"; - throw new LoanApplicationDateException("disbursement.date.on.non.working.day", errorMessage, - getExpectedDisbursedOnLocalDate()); - } + if (!allowTransactionsOnNonWorkingDay && !WorkingDaysUtil.isWorkingDay(workingDays, getDisbursementDate())) { + final String errorMessage = "Expected disbursement date cannot be on a non working day"; + throw new LoanApplicationDateException("disbursement.date.on.non.working.day", errorMessage, getExpectedDisbursedOnLocalDate()); } } private void validateDisbursementDateIsOnHoliday(final boolean allowTransactionsOnHoliday, final List holidays) { - if (!allowTransactionsOnHoliday) { - if (HolidayUtil.isHoliday(getDisbursementDate(), holidays)) { - final String errorMessage = "Expected disbursement date cannot be on a holiday"; - throw new LoanApplicationDateException("disbursement.date.on.holiday", errorMessage, getExpectedDisbursedOnLocalDate()); - } + if (!allowTransactionsOnHoliday && HolidayUtil.isHoliday(getDisbursementDate(), holidays)) { + final String errorMessage = "Expected disbursement date cannot be on a holiday"; + throw new LoanApplicationDateException("disbursement.date.on.holiday", errorMessage, getExpectedDisbursedOnLocalDate()); } } public void validateRepaymentDateIsOnNonWorkingDay(final LocalDate repaymentDate, final WorkingDays workingDays, final boolean allowTransactionsOnNonWorkingDay) { - if (!allowTransactionsOnNonWorkingDay) { - if (!WorkingDaysUtil.isWorkingDay(workingDays, repaymentDate)) { - final String errorMessage = "Repayment date cannot be on a non working day"; - throw new LoanApplicationDateException("repayment.date.on.non.working.day", errorMessage, repaymentDate); - } + if (!allowTransactionsOnNonWorkingDay && !WorkingDaysUtil.isWorkingDay(workingDays, repaymentDate)) { + final String errorMessage = "Repayment date cannot be on a non working day"; + throw new LoanApplicationDateException("repayment.date.on.non.working.day", errorMessage, repaymentDate); } } public void validateRepaymentDateIsOnHoliday(final LocalDate repaymentDate, final boolean allowTransactionsOnHoliday, final List holidays) { - if (!allowTransactionsOnHoliday) { - if (HolidayUtil.isHoliday(repaymentDate, holidays)) { - final String errorMessage = "Repayment date cannot be on a holiday"; - throw new LoanApplicationDateException("repayment.date.on.holiday", errorMessage, repaymentDate); - } + if (!allowTransactionsOnHoliday && HolidayUtil.isHoliday(repaymentDate, holidays)) { + final String errorMessage = "Repayment date cannot be on a holiday"; + throw new LoanApplicationDateException("repayment.date.on.holiday", errorMessage, repaymentDate); } } @@ -4852,10 +4830,9 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { public LocalDate getLastUserTransactionDate() { LocalDate currentTransactionDate = getDisbursementDate(); for (final LoanTransaction previousTransaction : this.loanTransactions) { - if (!(previousTransaction.isReversed() || previousTransaction.isAccrual() || previousTransaction.isIncomePosting())) { - if (currentTransactionDate.isBefore(previousTransaction.getTransactionDate())) { - currentTransactionDate = previousTransaction.getTransactionDate(); - } + if (!(previousTransaction.isReversed() || previousTransaction.isAccrual() || previousTransaction.isIncomePosting()) + && currentTransactionDate.isBefore(previousTransaction.getTransactionDate())) { + currentTransactionDate = previousTransaction.getTransactionDate(); } } return currentTransactionDate; @@ -4864,10 +4841,8 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { public LocalDate getLastRepaymentDate() { LocalDate currentTransactionDate = getDisbursementDate(); for (final LoanTransaction previousTransaction : this.loanTransactions) { - if (previousTransaction.isRepaymentType()) { - if (currentTransactionDate.isBefore(previousTransaction.getTransactionDate())) { - currentTransactionDate = previousTransaction.getTransactionDate(); - } + if (previousTransaction.isRepaymentType() && currentTransactionDate.isBefore(previousTransaction.getTransactionDate())) { + currentTransactionDate = previousTransaction.getTransactionDate(); } } return currentTransactionDate; @@ -4881,7 +4856,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { return lastTransaction; } - public Set charges() { + public Set getActiveCharges() { Set loanCharges = new HashSet<>(); if (this.charges != null) { for (LoanCharge charge : this.charges) { @@ -4911,7 +4886,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { if (installment.isRecalculatedInterestComponent()) { continue; } - BigDecimal amount = BigDecimal.ZERO; + BigDecimal amount; if (loanCharge.getChargeCalculation().isFlat()) { amount = loanCharge.amountOrPercentage(); } else { @@ -5071,7 +5046,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { } break; case LOAN_CREDIT_BALANCE_REFUND: - if (!status().isOverpaid()) { + if (!getStatus().isOverpaid()) { final String defaultUserMessage = "Loan Credit Balance Refund is not allowed. Loan Account is not Overpaid."; final ApiParameterError error = ApiParameterError .generalError("error.msg.loan.credit.balance.refund.account.is.not.overpaid", defaultUserMessage); @@ -5112,7 +5087,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { } public List getDisbursementDetails() { - List currentDisbursementDetails = new ArrayList(); + List currentDisbursementDetails = new ArrayList<>(); for (LoanDisbursementDetails disbursementDetail : this.disbursementDetails) { if (!disbursementDetail.isReversed()) { currentDisbursementDetails.add(disbursementDetail); @@ -5130,8 +5105,8 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { final LocalDate expectedDisbursementDate = command .localDateValueOfParameterNamed(LoanApiConstants.updatedDisbursementDateParameterName); disbursementDetails.updateExpectedDisbursementDateAndAmount(expectedDisbursementDate, principal); - actualChanges.put(LoanApiConstants.disbursementDateParameterName, - command.stringValueOfParameterNamed(LoanApiConstants.disbursementDateParameterName)); + actualChanges.put(LoanApiConstants.expectedDisbursementDateParameterName, + command.stringValueOfParameterNamed(LoanApiConstants.expectedDisbursementDateParameterName)); actualChanges.put(LoanApiConstants.disbursementIdParameterName, command.stringValueOfParameterNamed(LoanApiConstants.disbursementIdParameterName)); actualChanges.put(LoanApiConstants.disbursementPrincipalParameterName, @@ -5150,7 +5125,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { final List allNonContraTransactionsPostDisbursement = retreiveListOfTransactionsPostDisbursement(); ChangedTransactionDetail changedTransactionDetail = loanRepaymentScheduleTransactionProcessor.handleTransaction( getDisbursementDate(), allNonContraTransactionsPostDisbursement, getCurrency(), getRepaymentScheduleInstallments(), - charges()); + getActiveCharges()); for (final Map.Entry mapEntry : changedTransactionDetail.getNewTransactionMappings().entrySet()) { mapEntry.getValue().updateLoan(this); addLoanTransaction(mapEntry.getValue()); @@ -5286,7 +5261,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { final List allNonContraTransactionsPostDisbursement = retreiveListOfTransactionsPostDisbursement(); ChangedTransactionDetail changedTransactionDetail = loanRepaymentScheduleTransactionProcessor.handleTransaction( getDisbursementDate(), allNonContraTransactionsPostDisbursement, getCurrency(), getRepaymentScheduleInstallments(), - charges()); + getActiveCharges()); for (final Map.Entry mapEntry : changedTransactionDetail.getNewTransactionMappings().entrySet()) { mapEntry.getValue().updateLoan(this); } @@ -5312,7 +5287,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { updateLoanSchedule(loanSchedule.getInstallments()); this.interestRecalculatedOn = DateUtils.getBusinessLocalDate(); LocalDate lastRepaymentDate = this.getLastRepaymentPeriodDueDate(true); - Set charges = this.charges(); + Set charges = this.getActiveCharges(); for (final LoanCharge loanCharge : charges) { if (!loanCharge.isDueAtDisbursement()) { updateOverdueScheduleInstallment(loanCharge); @@ -5400,13 +5375,13 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { } else if (this.loanInterestRecalculationDetails.getInterestRecalculationCompoundingMethod() .equals(InterestRecalculationCompoundingMethod.FEE)) { determineFeeDetails(lastCompoundingDate, compoundingDetail.getEffectiveDate(), feeDetails); - fee = (BigDecimal) feeDetails.get("fee"); - penalties = (BigDecimal) feeDetails.get("penalties"); + fee = (BigDecimal) feeDetails.get(FEE); + penalties = (BigDecimal) feeDetails.get(PENALTIES); } else if (this.loanInterestRecalculationDetails.getInterestRecalculationCompoundingMethod() .equals(InterestRecalculationCompoundingMethod.INTEREST_AND_FEE)) { determineFeeDetails(lastCompoundingDate, compoundingDetail.getEffectiveDate(), feeDetails); - fee = (BigDecimal) feeDetails.get("fee"); - penalties = (BigDecimal) feeDetails.get("penalties"); + fee = (BigDecimal) feeDetails.get(FEE); + penalties = (BigDecimal) feeDetails.get(PENALTIES); interest = compoundingDetail.getAmount().subtract(fee).subtract(penalties); } @@ -5453,7 +5428,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { List loanCharges = new ArrayList<>(); List loanInstallmentCharges = new ArrayList<>(); - for (LoanCharge loanCharge : this.charges()) { + for (LoanCharge loanCharge : this.getActiveCharges()) { if (loanCharge.isDueForCollectionFromAndUpToAndIncluding(fromDate, toDate)) { if (loanCharge.isPenaltyCharge() && !loanCharge.isInstalmentFee()) { penalties = penalties.add(loanCharge.amount()); @@ -5472,8 +5447,8 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { } } - feeDetails.put("fee", fee); - feeDetails.put("penalties", penalties); + feeDetails.put(FEE, fee); + feeDetails.put(PENALTIES, penalties); feeDetails.put("loanCharges", loanCharges); feeDetails.put("loanInstallmentCharges", loanInstallmentCharges); } @@ -5498,22 +5473,14 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { private List extractInterestRecalculationAdditionalDetails() { List retDetails = new ArrayList<>(); List repaymentSchedule = getRepaymentScheduleInstallments(); - if (null != this.repaymentScheduleInstallments && this.repaymentScheduleInstallments.size() > 0) { - Iterator installmentsItr = repaymentSchedule.iterator(); - while (installmentsItr.hasNext()) { - LoanRepaymentScheduleInstallment installment = installmentsItr.next(); + if (null != repaymentSchedule) { + for (LoanRepaymentScheduleInstallment installment : repaymentSchedule) { if (null != installment.getLoanCompoundingDetails()) { retDetails.addAll(installment.getLoanCompoundingDetails()); } } } - Collections.sort(retDetails, new Comparator() { - - @Override - public int compare(LoanInterestRecalcualtionAdditionalDetails first, LoanInterestRecalcualtionAdditionalDetails second) { - return first.getEffectiveDate().compareTo(second.getEffectiveDate()); - } - }); + retDetails.sort(Comparator.comparing(LoanInterestRecalcualtionAdditionalDetails::getEffectiveDate)); return retDetails; } @@ -5522,12 +5489,12 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { .determineProcessor(this.transactionProcessingStrategy); final List allNonContraTransactionsPostDisbursement = retreiveListOfTransactionsPostDisbursement(); final List copyTransactions = new ArrayList<>(); - if (allNonContraTransactionsPostDisbursement.size() > 0) { + if (!allNonContraTransactionsPostDisbursement.isEmpty()) { for (LoanTransaction loanTransaction : allNonContraTransactionsPostDisbursement) { copyTransactions.add(LoanTransaction.copyTransactionProperties(loanTransaction)); } loanRepaymentScheduleTransactionProcessor.handleTransaction(getDisbursementDate(), copyTransactions, getCurrency(), - getRepaymentScheduleInstallments(), charges()); + getRepaymentScheduleInstallments(), getActiveCharges()); updateLoanSummaryDerivedFields(); } @@ -5596,7 +5563,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { InterestRecalculationCompoundingMethod compoundingMethod = null; RecalculationFrequencyType compoundingFrequencyType = null; LoanRescheduleStrategyMethod rescheduleStrategyMethod = null; - CalendarHistoryDataWrapper calendarHistoryDataWrapper = null; + CalendarHistoryDataWrapper calendarHistoryDataWrapper; boolean allowCompoundingOnEod = false; if (this.repaymentScheduleDetail().isInterestRecalculationEnabled()) { restCalendarInstance = scheduleGeneratorDTO.getCalendarInstanceForInterestRecalculation(); @@ -5606,7 +5573,6 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { compoundingFrequencyType = this.loanInterestRecalculationDetails.getCompoundingFrequencyType(); rescheduleStrategyMethod = this.loanInterestRecalculationDetails.getRescheduleStrategyMethod(); allowCompoundingOnEod = this.loanInterestRecalculationDetails.allowCompoundingOnEod(); - calendarHistoryDataWrapper = scheduleGeneratorDTO.getCalendarHistoryDataWrapper(); } calendar = scheduleGeneratorDTO.getCalendar(); calendarHistoryDataWrapper = scheduleGeneratorDTO.getCalendarHistoryDataWrapper(); @@ -5620,11 +5586,11 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { interestChargedFromDate = getDisbursementDate(); } - final LoanApplicationTerms loanApplicationTerms = LoanApplicationTerms.assembleFrom(scheduleGeneratorDTO.getApplicationCurrency(), - loanTermFrequency, loanTermPeriodFrequencyType, nthDayType, dayOfWeekType, getDisbursementDate(), - getExpectedFirstRepaymentOnDate(), scheduleGeneratorDTO.getCalculatedRepaymentsStartingFromDate(), getInArrearsTolerance(), - this.loanRepaymentScheduleDetail, this.loanProduct.isMultiDisburseLoan(), this.fixedEmiAmount, disbursementData, - this.maxOutstandingLoanBalance, interestChargedFromDate, this.loanProduct.getPrincipalThresholdForLastInstallment(), + return LoanApplicationTerms.assembleFrom(scheduleGeneratorDTO.getApplicationCurrency(), loanTermFrequency, + loanTermPeriodFrequencyType, nthDayType, dayOfWeekType, getDisbursementDate(), getExpectedFirstRepaymentOnDate(), + scheduleGeneratorDTO.getCalculatedRepaymentsStartingFromDate(), getInArrearsTolerance(), this.loanRepaymentScheduleDetail, + this.loanProduct.isMultiDisburseLoan(), this.fixedEmiAmount, disbursementData, this.maxOutstandingLoanBalance, + interestChargedFromDate, this.loanProduct.getPrincipalThresholdForLastInstallment(), this.loanProduct.getInstallmentAmountInMultiplesOf(), recalculationFrequencyType, restCalendarInstance, compoundingMethod, compoundingCalendarInstance, compoundingFrequencyType, this.loanProduct.preCloseInterestCalculationStrategy(), rescheduleStrategyMethod, calendar, getApprovedPrincipal(), annualNominalInterestRate, loanTermVariations, @@ -5632,7 +5598,6 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { holidayDetailDTO, allowCompoundingOnEod, scheduleGeneratorDTO.isFirstRepaymentDateAllowedOnHoliday(), scheduleGeneratorDTO.isInterestToBeRecoveredFirstWhenGreaterThanEMI(), this.fixedPrincipalPercentagePerInstallment, scheduleGeneratorDTO.isPrincipalCompoundingDisabledForOverdueLoans()); - return loanApplicationTerms; } public BigDecimal constructLoanTermVariations(FloatingRateDTO floatingRateDTO, BigDecimal annualNominalInterestRate, @@ -6050,9 +6015,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { existingTransactionIds.addAll(findExistingTransactionIds()); existingReversedTransactionIds.addAll(findExistingReversedTransactionIds()); - final ChangedTransactionDetail changedTransactionDetail = handleRefundTransaction(loanTransaction, loanLifecycleStateMachine, null); - - return changedTransactionDetail; + return handleRefundTransaction(loanTransaction, loanLifecycleStateMachine, null); } @@ -6074,7 +6037,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { loanTransaction.updateLoan(this); - if (status().isOverpaid() || status().isClosed()) { + if (getStatus().isOverpaid() || getStatus().isClosed()) { final String errorMessage = "This refund option is only for active loans "; throw new InvalidLoanStateTransitionException("transaction", "is.exceeding.overpaid.amount", errorMessage, this.totalOverpaid, @@ -6122,11 +6085,11 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { // If is a refund if (adjustedTransaction == null) { loanRepaymentScheduleTransactionProcessor.handleRefund(loanTransaction, getCurrency(), getRepaymentScheduleInstallments(), - charges()); + getActiveCharges()); } else { final List allNonContraTransactionsPostDisbursement = retreiveListOfTransactionsPostDisbursement(); changedTransactionDetail = loanRepaymentScheduleTransactionProcessor.handleTransaction(getDisbursementDate(), - allNonContraTransactionsPostDisbursement, getCurrency(), getRepaymentScheduleInstallments(), charges()); + allNonContraTransactionsPostDisbursement, getCurrency(), getRepaymentScheduleInstallments(), getActiveCharges()); for (final Map.Entry mapEntry : changedTransactionDetail.getNewTransactionMappings().entrySet()) { mapEntry.getValue().updateLoan(this); } @@ -6223,10 +6186,9 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { List loanTransactions = retreiveListOfTransactionsExcludeAccruals(); Collections.reverse(loanTransactions); for (final LoanTransaction previousTransaction : loanTransactions) { - if (lastTransactionDate.isBefore(previousTransaction.getTransactionDate())) { - if (previousTransaction.isRepaymentType() || previousTransaction.isWaiver() || previousTransaction.isChargePayment()) { - throw new UndoLastTrancheDisbursementException(previousTransaction.getId()); - } + if (lastTransactionDate.isBefore(previousTransaction.getTransactionDate()) + && (previousTransaction.isRepaymentType() || previousTransaction.isWaiver() || previousTransaction.isChargePayment())) { + throw new UndoLastTrancheDisbursementException(previousTransaction.getId()); } if (previousTransaction.isDisbursement()) { lastTransactionDate = previousTransaction.getTransactionDate(); @@ -6276,7 +6238,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { private void updateLoanToLastDisbursalState(LocalDate actualDisbursementDate) { - for (final LoanCharge charge : charges()) { + for (final LoanCharge charge : getActiveCharges()) { if (charge.isOverdueInstallmentCharge()) { charge.setActive(false); } else if (charge.isTrancheDisbursementCharge() && actualDisbursementDate @@ -6326,7 +6288,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { } public int fetchNumberOfInstallmensAfterExceptions() { - if (this.repaymentScheduleInstallments.size() > 0) { + if (!this.repaymentScheduleInstallments.isEmpty()) { List installments = getRepaymentScheduleInstallments(); int numberOfInstallments = 0; for (final LoanRepaymentScheduleInstallment installment : installments) { @@ -6666,7 +6628,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { LocalDate installmentStartDate = getDisbursementDate(); - if (newInstallments.size() > 0) { + if (!newInstallments.isEmpty()) { installmentStartDate = newInstallments.get(newInstallments.size() - 1).getDueDate(); } @@ -6683,7 +6645,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { newInstallments.add(newInstallment); updateLoanScheduleOnForeclosure(newInstallments); - Set charges = this.charges(); + Set charges = this.getActiveCharges(); int penaltyWaitPeriod = 0; for (LoanCharge loanCharge : charges) { if (loanCharge.getDueLocalDate() != null && loanCharge.getDueLocalDate().isAfter(transactionDate)) { @@ -6731,14 +6693,14 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { public Set getActiveLoanTermVariations() { Set retData = new HashSet<>(); - if (this.loanTermVariations != null && this.loanTermVariations.size() > 0) { + if (this.loanTermVariations != null && !this.loanTermVariations.isEmpty()) { for (LoanTermVariations loanTermVariations : this.loanTermVariations) { if (loanTermVariations.isActive()) { retData.add(loanTermVariations); } } } - return retData.size() > 0 ? retData : null; + return !retData.isEmpty() ? retData : null; } public void setIsTopup(final boolean isTopup) { @@ -6788,20 +6750,20 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { private void checkAndFetchLazyCollection(Collection lazyCollection) { if (lazyCollection != null) { - lazyCollection.size(); + lazyCollection.size(); // NOSONAR } } public void initializeLoanOfficerHistory() { - this.loanOfficerHistory.size(); + this.loanOfficerHistory.size(); // NOSONAR } - public void initilizeTransactions() { - this.loanTransactions.size(); + public void initializeTransactions() { + this.loanTransactions.size(); // NOSONAR } public void initializeRepaymentSchedule() { - this.repaymentScheduleInstallments.size(); + this.repaymentScheduleInstallments.size(); // NOSONAR } public boolean hasInvalidLoanType() { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java index c16ae83ef..53ded9aa4 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java @@ -555,7 +555,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { public void recalculateAccruals(Loan loan, boolean isInterestCalculationHappened) { LocalDate accruedTill = loan.getAccruedTill(); if (!loan.isPeriodicAccrualAccountingEnabledOnLoanProduct() || !isInterestCalculationHappened || accruedTill == null || loan.isNpa() - || !loan.status().isActive()) { + || !loan.getStatus().isActive()) { return; } @@ -576,7 +576,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { MonetaryCurrency currency = loan.getCurrency(); ApplicationCurrency applicationCurrency = this.applicationCurrencyRepository.findOneWithNotFoundDetection(currency); CurrencyData currencyData = applicationCurrency.toData(); - Set loanCharges = loan.charges(); + Set loanCharges = loan.getActiveCharges(); for (LoanRepaymentScheduleInstallment installment : installments) { if (installment.getDueDate().isAfter(loan.getMaturityDate())) { @@ -748,7 +748,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { newTransactions.add(accrualTransaction); loan.addLoanTransaction(accrualTransaction); Set accrualCharges = accrualTransaction.getLoanChargesPaid(); - for (LoanCharge loanCharge : loan.charges()) { + for (LoanCharge loanCharge : loan.getActiveCharges()) { if (loanCharge.isActive() && !loanCharge.isPaid() && (loanCharge.isDueForCollectionFromAndUpToAndIncluding(fromDate, foreClosureDate) || loanCharge.isInstalmentFee())) { @@ -821,7 +821,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { @Override @Transactional public void disableStandingInstructionsLinkedToClosedLoan(Loan loan) { - if ((loan != null) && (loan.status() != null) && loan.status().isClosed()) { + if ((loan != null) && (loan.getStatus() != null) && loan.getStatus().isClosed()) { final Integer standingInstructionStatus = StandingInstructionStatus.ACTIVE.getValue(); final Collection accountTransferStandingInstructions = this.standingInstructionRepository .findByLoanAccountAndStatus(loan, standingInstructionStatus); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepositoryWrapper.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepositoryWrapper.java index 83ae69a41..01e78fc50 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepositoryWrapper.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepositoryWrapper.java @@ -167,7 +167,7 @@ public class LoanRepositoryWrapper { List loans = this.repository.findLoanByClientId(clientId); if (loans != null && loans.size() > 0) { for (Loan loan : loans) { - loan.initilizeTransactions(); + loan.initializeTransactions(); loan.initializeLoanOfficerHistory(); } } @@ -249,7 +249,7 @@ public class LoanRepositoryWrapper { public Loan findNonClosedLoanThatBelongsToClient(@Param("loanId") Long loanId, @Param("clientId") Long clientId) { Loan loan = this.repository.findNonClosedLoanThatBelongsToClient(loanId, clientId); if (loan != null) { - loan.initilizeTransactions(); + loan.initializeTransactions(); } return loan; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTermVariations.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTermVariations.java index f2df0444b..3695a97fe 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTermVariations.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTermVariations.java @@ -73,7 +73,7 @@ public class LoanTermVariations extends AbstractPersistableCustom { this.decimalValue = decimalValue; this.dateValue = dateValue; this.isSpecificToInstallment = isSpecificToInstallment; - this.onLoanStatus = loan.status().getValue(); + this.onLoanStatus = loan.getStatus().getValue(); this.isActive = true; this.parent = null; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/api/GuarantorsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/api/GuarantorsApiResource.java index 56e62d7ab..1fb872188 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/api/GuarantorsApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/api/GuarantorsApiResource.java @@ -89,7 +89,7 @@ public class GuarantorsApiResource { Arrays.asList(AccountDetailConstants.idParamName, AccountTransfersApiConstants.transferDescriptionParamName, AccountTransfersApiConstants.currencyParamName)); - private final String resourceNameForPermission = "GUARANTOR"; + private static final String RESOURCE_NAME_FOR_PERMISSION = "GUARANTOR"; private final GuarantorReadPlatformService guarantorReadPlatformService; private final CodeValueReadPlatformService codeValueReadPlatformService; @@ -127,7 +127,7 @@ public class GuarantorsApiResource { @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) public String newGuarantorTemplate(@Context final UriInfo uriInfo, @PathParam("loanId") final Long loanId) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermission); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSION); final List guarantorTypeOptions = GuarantorEnumerations.guarantorType(GuarantorType.values()); final Collection allowedClientRelationshipTypes = this.codeValueReadPlatformService @@ -144,7 +144,7 @@ public class GuarantorsApiResource { @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) public String retrieveGuarantorDetails(@Context final UriInfo uriInfo, @PathParam("loanId") final Long loanId) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermission); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSION); final List guarantorDatas = this.guarantorReadPlatformService.retrieveGuarantorsForValidLoan(loanId); @@ -159,7 +159,7 @@ public class GuarantorsApiResource { @Produces({ MediaType.APPLICATION_JSON }) public String retrieveGuarantorDetails(@Context final UriInfo uriInfo, @PathParam("loanId") final Long loanId, @PathParam("guarantorId") final Long guarantorId) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermission); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSION); GuarantorData guarantorData = this.guarantorReadPlatformService.retrieveGuarantor(loanId, guarantorId); @@ -222,7 +222,7 @@ public class GuarantorsApiResource { public String accountsTemplate(@QueryParam("clientId") final Long clientId, @PathParam("loanId") final Long loanId, @Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermission); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSION); PortfolioAccountDTO portfolioAccountDTO = new PortfolioAccountDTO(PortfolioAccountType.SAVINGS.getValue(), clientId, null); Collection accountLinkingOptions = null; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/service/GuarantorWritePlatformServiceJpaRepositoryIImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/service/GuarantorWritePlatformServiceJpaRepositoryIImpl.java index 8439f3e6a..770652be8 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/service/GuarantorWritePlatformServiceJpaRepositoryIImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/service/GuarantorWritePlatformServiceJpaRepositoryIImpl.java @@ -340,7 +340,7 @@ public class GuarantorWritePlatformServiceJpaRepositoryIImpl implements Guaranto } private void validateLoanStatus(Loan loan) { - if (!loan.status().isActiveOrAwaitingApprovalOrDisbursal()) { + if (!loan.getStatus().isActiveOrAwaitingApprovalOrDisbursal()) { final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("loan.guarantor"); baseDataValidator.reset().failWithCodeNoParameterAddedToErrorCode("loan.is.closed"); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java index b523a645d..11dae4619 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java @@ -2120,7 +2120,7 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener // this is required to update total fee amounts in the // LoanScheduleModel - final BigDecimal chargesDueAtTimeOfDisbursement = deriveTotalChargesDueAtTimeOfDisbursement(loan.charges()); + final BigDecimal chargesDueAtTimeOfDisbursement = deriveTotalChargesDueAtTimeOfDisbursement(loan.getActiveCharges()); periods = createNewLoanScheduleListWithDisbursementDetails(loanApplicationTerms.fetchNumberOfRepaymentsAfterExceptions(), loanApplicationTerms, chargesDueAtTimeOfDisbursement); MonetaryCurrency currency = outstandingBalance.getCurrency(); @@ -2399,7 +2399,8 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener loanApplicationTerms.setInterestTobeApproppriated( Money.of(loan.getCurrency(), retainedInstallments.get(retainedInstallments.size() - 1).getRescheduleInterestPortion())); } - LoanScheduleModel loanScheduleModel = generate(mc, loanApplicationTerms, loan.charges(), holidayDetailDTO, loanScheduleParams); + LoanScheduleModel loanScheduleModel = generate(mc, loanApplicationTerms, loan.getActiveCharges(), holidayDetailDTO, + loanScheduleParams); for (LoanScheduleModelPeriod loanScheduleModelPeriod : loanScheduleModel.getPeriods()) { if (loanScheduleModelPeriod.isRepaymentPeriod()) { @@ -2673,7 +2674,7 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener List loanTransactions = loan.retreiveListOfTransactionsPostDisbursementExcludeAccruals(); loanRepaymentScheduleTransactionProcessor.handleTransaction(loanApplicationTerms.getExpectedDisbursementDate(), loanTransactions, - currency, loanScheduleDTO.getInstallments(), loan.charges()); + currency, loanScheduleDTO.getInstallments(), loan.getActiveCharges()); Money feeCharges = Money.zero(currency); Money penaltyCharges = Money.zero(currency); Money totalPrincipal = Money.zero(currency); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleAssembler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleAssembler.java index 9a55c6ed6..531029f6d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleAssembler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleAssembler.java @@ -526,9 +526,9 @@ public class LoanScheduleAssembler { BigDecimal principal = null; BigDecimal netDisbursalAmount = null; - if (jsonObject.has(LoanApiConstants.disbursementDateParameterName)) { - expectedDisbursementDate = this.fromApiJsonHelper - .extractLocalDateNamed(LoanApiConstants.disbursementDateParameterName, jsonObject, dateFormat, locale); + if (jsonObject.has(LoanApiConstants.expectedDisbursementDateParameterName)) { + expectedDisbursementDate = this.fromApiJsonHelper.extractLocalDateNamed( + LoanApiConstants.expectedDisbursementDateParameterName, jsonObject, dateFormat, locale); } if (jsonObject.has(LoanApiConstants.disbursementPrincipalParameterName) && jsonObject.get(LoanApiConstants.disbursementPrincipalParameterName).isJsonPrimitive() diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleCalculationPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleCalculationPlatformServiceImpl.java index 9445407e8..9c975adcd 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleCalculationPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleCalculationPlatformServiceImpl.java @@ -148,7 +148,7 @@ public class LoanScheduleCalculationPlatformServiceImpl implements LoanScheduleC final LoanRepaymentScheduleTransactionProcessor loanRepaymentScheduleTransactionProcessor = loanRepaymentScheduleTransactionProcessorFactory .determineProcessor(loan.transactionProcessingStrategy()); - if (!loan.repaymentScheduleDetail().isInterestRecalculationEnabled() || loan.isNpa() || !loan.status().isActive() + if (!loan.repaymentScheduleDetail().isInterestRecalculationEnabled() || loan.isNpa() || !loan.getStatus().isActive() || !loanRepaymentScheduleTransactionProcessor.isInterestFirstRepaymentScheduleTransactionProcessor()) { return; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/data/LoanRescheduleRequestDataValidator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/data/LoanRescheduleRequestDataValidator.java index cb20dde73..328d1ca2b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/data/LoanRescheduleRequestDataValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/data/LoanRescheduleRequestDataValidator.java @@ -93,7 +93,7 @@ public class LoanRescheduleRequestDataValidator { final JsonElement jsonElement = jsonCommand.parsedJson(); - if (!loan.status().isActive()) { + if (!loan.getStatus().isActive()) { dataValidatorBuilder.reset().failWithCodeNoParameterAddedToErrorCode("loan.is.not.active", "Loan is not active"); } @@ -266,7 +266,7 @@ public class LoanRescheduleRequestDataValidator { LoanRepaymentScheduleInstallment installment = null; if (loan != null) { - if (!loan.status().isActive()) { + if (!loan.getStatus().isActive()) { dataValidatorBuilder.reset().failWithCodeNoParameterAddedToErrorCode("loan.is.not.active", "Loan is not active"); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanReschedulePreviewPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanReschedulePreviewPlatformServiceImpl.java index 2710e1819..8443e888b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanReschedulePreviewPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanReschedulePreviewPlatformServiceImpl.java @@ -55,7 +55,7 @@ public class LoanReschedulePreviewPlatformServiceImpl implements LoanRescheduleP private final LoanRepaymentScheduleTransactionProcessorFactory loanRepaymentScheduleTransactionProcessorFactory; private final LoanScheduleGeneratorFactory loanScheduleFactory; private final LoanSummaryWrapper loanSummaryWrapper; - private final DefaultScheduledDateGenerator scheduledDateGenerator = new DefaultScheduledDateGenerator(); + private static final DefaultScheduledDateGenerator DEFAULT_SCHEDULED_DATE_GENERATOR = new DefaultScheduledDateGenerator(); @Autowired public LoanReschedulePreviewPlatformServiceImpl(final LoanRescheduleRequestRepositoryWrapper loanRescheduleRequestRepository, @@ -115,10 +115,10 @@ public class LoanReschedulePreviewPlatformServiceImpl implements LoanRescheduleP for (LoanTermVariationsData loanTermVariation : loanApplicationTerms.getLoanTermVariations().getDueDateVariation()) { if (rescheduleFromDate.isBefore(loanTermVariation.getTermVariationApplicableFrom())) { - LocalDate applicableDate = this.scheduledDateGenerator.generateNextRepaymentDate(rescheduleFromDate, loanApplicationTerms, - false); + LocalDate applicableDate = DEFAULT_SCHEDULED_DATE_GENERATOR.generateNextRepaymentDate(rescheduleFromDate, + loanApplicationTerms, false); if (loanTermVariation.getTermVariationApplicableFrom().equals(applicableDate)) { - LocalDate adjustedDate = this.scheduledDateGenerator.generateNextRepaymentDate(adjustedApplicableDate, + LocalDate adjustedDate = DEFAULT_SCHEDULED_DATE_GENERATOR.generateNextRepaymentDate(adjustedApplicableDate, loanApplicationTerms, false); loanTermVariation.setApplicableFromDate(adjustedDate); loanTermVariationsData.add(loanTermVariation); @@ -137,10 +137,8 @@ public class LoanReschedulePreviewPlatformServiceImpl implements LoanRescheduleP final LoanScheduleDTO loanSchedule = loanScheduleGenerator.rescheduleNextInstallments(mathContext, loanApplicationTerms, loan, loanApplicationTerms.getHolidayDetailDTO(), loanRepaymentScheduleTransactionProcessor, rescheduleFromDate); final LoanScheduleModel loanScheduleModel = loanSchedule.getLoanScheduleModel(); - LoanScheduleModel loanScheduleModels = LoanScheduleModel.withLoanScheduleModelPeriods(loanScheduleModel.getPeriods(), - loanScheduleModel); - return loanScheduleModels; + return LoanScheduleModel.withLoanScheduleModelPeriods(loanScheduleModel.getPeriods(), loanScheduleModel); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestReadPlatformServiceImpl.java index 368e99f42..d4aedbe7f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestReadPlatformServiceImpl.java @@ -48,7 +48,7 @@ public class LoanRescheduleRequestReadPlatformServiceImpl implements LoanResched private final JdbcTemplate jdbcTemplate; private final LoanRepositoryWrapper loanRepositoryWrapper; - private final LoanRescheduleRequestRowMapper loanRescheduleRequestRowMapper = new LoanRescheduleRequestRowMapper(); + private static final LoanRescheduleRequestRowMapper LOAN_RESCHEDULE_REQUEST_ROW_MAPPER = new LoanRescheduleRequestRowMapper(); private final CodeValueReadPlatformService codeValueReadPlatformService; @Autowired @@ -99,7 +99,7 @@ public class LoanRescheduleRequestReadPlatformServiceImpl implements LoanResched sqlBuilder.append("tv.date_value as dateValue, "); sqlBuilder.append("tv.is_specific_to_installment as isSpecificToInstallment "); - sqlBuilder.append("from " + loanRescheduleRequestTableName() + " lr "); + sqlBuilder.append("from m_loan_reschedule_request lr "); sqlBuilder.append("left join m_code_value cv on cv.id = lr.reschedule_reason_cv_id "); sqlBuilder.append("left join m_appuser sbu on sbu.id = lr.submitted_by_user_id "); sqlBuilder.append("left join m_appuser abu on abu.id = lr.approved_by_user_id "); @@ -116,10 +116,6 @@ public class LoanRescheduleRequestReadPlatformServiceImpl implements LoanResched return this.schema; } - public String loanRescheduleRequestTableName() { - return "m_loan_reschedule_request"; - } - @Override @SuppressWarnings("unused") public LoanRescheduleRequestData mapRow(final ResultSet rs, final int rowNum) throws SQLException { @@ -225,18 +221,18 @@ public class LoanRescheduleRequestReadPlatformServiceImpl implements LoanResched @Override public List readLoanRescheduleRequests(Long loanId) { this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId); - final String sql = "select " + this.loanRescheduleRequestRowMapper.schema() + " where lr.loan_id = ?"; + final String sql = "select " + LOAN_RESCHEDULE_REQUEST_ROW_MAPPER.schema() + " where lr.loan_id = ?"; - return this.jdbcTemplate.query(sql, this.loanRescheduleRequestRowMapper, loanId); // NOSONAR + return this.jdbcTemplate.query(sql, LOAN_RESCHEDULE_REQUEST_ROW_MAPPER, loanId); // NOSONAR } @Override public LoanRescheduleRequestData readLoanRescheduleRequest(Long requestId) { try { - final String sql = "select " + this.loanRescheduleRequestRowMapper.schema() + " where lr.id = ?"; + final String sql = "select " + LOAN_RESCHEDULE_REQUEST_ROW_MAPPER.schema() + " where lr.id = ?"; - return this.jdbcTemplate.queryForObject(sql, this.loanRescheduleRequestRowMapper, requestId); // NOSONAR + return this.jdbcTemplate.queryForObject(sql, LOAN_RESCHEDULE_REQUEST_ROW_MAPPER, requestId); // NOSONAR } catch (final EmptyResultDataAccessException e) { @@ -247,8 +243,8 @@ public class LoanRescheduleRequestReadPlatformServiceImpl implements LoanResched @Override public List readLoanRescheduleRequests(Long loanId, Integer statusEnum) { this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId); - final String sql = "select " + this.loanRescheduleRequestRowMapper.schema() + " where lr.loan_id = ?" + " and lr.status_enum = ?"; - return this.jdbcTemplate.query(sql, this.loanRescheduleRequestRowMapper, loanId, statusEnum); // NOSONAR + final String sql = "select " + LOAN_RESCHEDULE_REQUEST_ROW_MAPPER.schema() + " where lr.loan_id = ?" + " and lr.status_enum = ?"; + return this.jdbcTemplate.query(sql, LOAN_RESCHEDULE_REQUEST_ROW_MAPPER, loanId, statusEnum); // NOSONAR } @Override diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java index ed8e7bdda..1a2244346 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java @@ -108,7 +108,7 @@ public class LoanRescheduleRequestWritePlatformServiceImpl implements LoanResche private final LoanScheduleGeneratorFactory loanScheduleFactory; private final LoanSummaryWrapper loanSummaryWrapper; private final AccountTransfersWritePlatformService accountTransfersWritePlatformService; - private final DefaultScheduledDateGenerator scheduledDateGenerator = new DefaultScheduledDateGenerator(); + private static final DefaultScheduledDateGenerator DEFAULT_SCHEDULED_DATE_GENERATOR = new DefaultScheduledDateGenerator(); private final LoanAccountDomainService loanAccountDomainService; private final LoanRepaymentScheduleInstallmentRepository repaymentScheduleInstallmentRepository; @@ -359,7 +359,7 @@ public class LoanRescheduleRequestWritePlatformServiceImpl implements LoanResche List loanRescheduleRequestToTermVariationMappings, final Boolean isActive, final boolean isSpecificToInstallment, final BigDecimal decimalValue, LoanTermVariations parent) { LoanTermVariations loanTermVariation = new LoanTermVariations(termType, rescheduleFromDate, decimalValue, adjustedDueDate, - isSpecificToInstallment, loan, loan.status().getValue(), isActive, parent); + isSpecificToInstallment, loan, loan.getStatus().getValue(), isActive, parent); loan.getLoanTermVariations().add(loanTermVariation); loanRescheduleRequestToTermVariationMappings .add(LoanRescheduleRequestToTermVariationMapping.createNew(loanRescheduleRequest, loanTermVariation)); @@ -421,9 +421,9 @@ public class LoanRescheduleRequestWritePlatformServiceImpl implements LoanResche dueDateVariationInCurrentRequest.setTermApplicableFrom(rescheduleFromDate); } else if (!activeLoanTermVariation.fetchTermApplicaDate().isBefore(fromScheduleDate)) { while (currentScheduleDate.isBefore(activeLoanTermVariation.fetchTermApplicaDate())) { - currentScheduleDate = this.scheduledDateGenerator.generateNextRepaymentDate(currentScheduleDate, + currentScheduleDate = DEFAULT_SCHEDULED_DATE_GENERATOR.generateNextRepaymentDate(currentScheduleDate, loanApplicationTerms, false); - modifiedScheduleDate = this.scheduledDateGenerator.generateNextRepaymentDate(modifiedScheduleDate, + modifiedScheduleDate = DEFAULT_SCHEDULED_DATE_GENERATOR.generateNextRepaymentDate(modifiedScheduleDate, loanApplicationTerms, false); changeMap.put(currentScheduleDate, modifiedScheduleDate); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/CalculateLoanScheduleQueryFromApiJsonHelper.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/CalculateLoanScheduleQueryFromApiJsonHelper.java index a057418ae..56e494661 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/CalculateLoanScheduleQueryFromApiJsonHelper.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/CalculateLoanScheduleQueryFromApiJsonHelper.java @@ -44,7 +44,7 @@ public final class CalculateLoanScheduleQueryFromApiJsonHelper { /** * The parameters supported for this command. */ - final Set supportedParameters = new HashSet<>(Arrays.asList(LoanApiConstants.idParameterName, + static final Set SUPPORTED_PARAMETERS = new HashSet<>(Arrays.asList(LoanApiConstants.idParameterName, LoanApiConstants.clientIdParameterName, LoanApiConstants.groupIdParameterName, LoanApiConstants.loanTypeParameterName, LoanApiConstants.calendarIdParameterName, LoanApiConstants.productIdParameterName, LoanApiConstants.accountNoParameterName, LoanApiConstants.externalIdParameterName, LoanApiConstants.fundIdParameterName, LoanApiConstants.loanOfficerIdParameterName, @@ -56,7 +56,7 @@ public final class CalculateLoanScheduleQueryFromApiJsonHelper { LoanApiConstants.amortizationTypeParameterName, LoanApiConstants.interestTypeParameterName, LoanApiConstants.interestCalculationPeriodTypeParameterName, LoanProductConstants.ALLOW_PARTIAL_PERIOD_INTEREST_CALCUALTION_PARAM_NAME, - LoanApiConstants.interestRateFrequencyTypeParameterName, LoanApiConstants.disbursementDateParameterName, + LoanApiConstants.interestRateFrequencyTypeParameterName, LoanApiConstants.expectedDisbursementDateParameterName, LoanApiConstants.repaymentsStartingFromDateParameterName, LoanApiConstants.graceOnPrincipalPaymentParameterName, LoanApiConstants.graceOnInterestPaymentParameterName, LoanApiConstants.graceOnInterestChargedParameterName, LoanApiConstants.interestChargedFromDateParameterName, LoanApiConstants.submittedOnDateParameterName, @@ -84,26 +84,26 @@ public final class CalculateLoanScheduleQueryFromApiJsonHelper { } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); final JsonElement element = this.fromApiJsonHelper.parse(json); - final String loanTermFrequencyParameterName = "loanTermFrequency"; + final String loanTermFrequencyParameterName = LoanApiConstants.loanTermFrequencyParameterName; final Integer loanTermFrequency = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(loanTermFrequencyParameterName, element); - final String loanTermFrequencyTypeParameterName = "loanTermFrequencyType"; + final String loanTermFrequencyTypeParameterName = LoanApiConstants.loanTermFrequencyTypeParameterName; final Integer loanTermFrequencyType = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(loanTermFrequencyTypeParameterName, element); - final String numberOfRepaymentsParameterName = "numberOfRepayments"; + final String numberOfRepaymentsParameterName = LoanApiConstants.numberOfRepaymentsParameterName; final Integer numberOfRepayments = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(numberOfRepaymentsParameterName, element); - final String repaymentEveryParameterName = "repaymentEvery"; + final String repaymentEveryParameterName = LoanApiConstants.repaymentEveryParameterName; final Integer repaymentEvery = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(repaymentEveryParameterName, element); - final String repaymentEveryFrequencyTypeParameterName = "repaymentFrequencyType"; + final String repaymentEveryFrequencyTypeParameterName = LoanApiConstants.repaymentFrequencyTypeParameterName; final Integer repaymentEveryType = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(repaymentEveryFrequencyTypeParameterName, element); @@ -113,12 +113,12 @@ public final class CalculateLoanScheduleQueryFromApiJsonHelper { validateSelectedPeriodFrequencyTypeIsTheSame(dataValidationErrors, loanTermFrequency, loanTermFrequencyType, numberOfRepayments, repaymentEvery, repaymentEveryType); - final String expectedDisbursementDateParameterName = "expectedDisbursementDate"; + final String expectedDisbursementDateParameterName = LoanApiConstants.expectedDisbursementDateParameterName; final LocalDate expectedDisbursementDate = this.fromApiJsonHelper.extractLocalDateNamed(expectedDisbursementDateParameterName, element); LocalDate repaymentsStartingFromDate = null; - final String repaymentsStartingFromDateParameterName = "repaymentsStartingFromDate"; + final String repaymentsStartingFromDateParameterName = LoanApiConstants.repaymentsStartingFromDateParameterName; if (this.fromApiJsonHelper.parameterExists(repaymentsStartingFromDateParameterName, element)) { repaymentsStartingFromDate = this.fromApiJsonHelper.extractLocalDateNamed(repaymentsStartingFromDateParameterName, element); } @@ -144,14 +144,14 @@ public final class CalculateLoanScheduleQueryFromApiJsonHelper { } else { if (loanTermFrequency != null && repaymentEvery != null && numberOfRepayments != null) { final int suggestsedLoanTerm = repaymentEvery * numberOfRepayments; - if (loanTermFrequency.intValue() < suggestsedLoanTerm) { + if (loanTermFrequency < suggestsedLoanTerm) { final ApiParameterError error = ApiParameterError.parameterError( "validation.msg.loan.loanTermFrequency.less.than.repayment.structure.suggests", "The parameter loanTermFrequency is less than the suggest loan term as indicated by numberOfRepayments and repaymentEvery.", "loanTermFrequency", loanTermFrequency, numberOfRepayments, repaymentEvery); dataValidationErrors.add(error); } else { - if (loanTermFrequency.intValue() > suggestsedLoanTerm) { + if (loanTermFrequency > suggestsedLoanTerm) { final ApiParameterError error = ApiParameterError.parameterError( "validation.msg.loan.loanTermFrequency.greater.than.repayment.structure.suggests", "The parameter loanTermFrequency is greater than the suggested loan term as indicated by numberOfRepayments and repaymentEvery.", @@ -166,14 +166,13 @@ public final class CalculateLoanScheduleQueryFromApiJsonHelper { private void validateRepaymentsStartingFromDateIsAfterDisbursementDate(final List dataValidationErrors, final LocalDate expectedDisbursementDate, final LocalDate repaymentsStartingFromDate) { - if (expectedDisbursementDate != null) { - if (repaymentsStartingFromDate != null && expectedDisbursementDate.isAfter(repaymentsStartingFromDate)) { - final ApiParameterError error = ApiParameterError.parameterError( - "validation.msg.loan.expectedDisbursementDate.cannot.be.after.first.repayment.date", - "The parameter expectedDisbursementDate has a date which falls after the date for repaymentsStartingFromDate.", - "expectedDisbursementDate", expectedDisbursementDate, repaymentsStartingFromDate); - dataValidationErrors.add(error); - } + if (expectedDisbursementDate != null && repaymentsStartingFromDate != null + && expectedDisbursementDate.isAfter(repaymentsStartingFromDate)) { + final ApiParameterError error = ApiParameterError.parameterError( + "validation.msg.loan.expectedDisbursementDate.cannot.be.after.first.repayment.date", + "The parameter expectedDisbursementDate has a date which falls after the date for repaymentsStartingFromDate.", + "expectedDisbursementDate", expectedDisbursementDate, repaymentsStartingFromDate); + dataValidationErrors.add(error); } } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanApplicationCommandFromApiJsonHelper.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanApplicationCommandFromApiJsonHelper.java index 463afb979..553c64f82 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanApplicationCommandFromApiJsonHelper.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanApplicationCommandFromApiJsonHelper.java @@ -64,7 +64,7 @@ public final class LoanApplicationCommandFromApiJsonHelper { /** * The parameters supported for this command. */ - final Set supportedParameters = new HashSet<>(Arrays.asList(LoanApiConstants.dateFormatParameterName, + private static final Set SUPPORTED_PARAMETERS = new HashSet<>(Arrays.asList(LoanApiConstants.dateFormatParameterName, LoanApiConstants.localeParameterName, LoanApiConstants.idParameterName, LoanApiConstants.clientIdParameterName, LoanApiConstants.groupIdParameterName, LoanApiConstants.loanTypeParameterName, LoanApiConstants.productIdParameterName, LoanApiConstants.principalParamName, LoanApiConstants.totalLoanParamName, LoanApiConstants.parentAccountParamName, @@ -76,7 +76,7 @@ public final class LoanApplicationCommandFromApiJsonHelper { LoanApiConstants.isFloatingInterestRate, LoanApiConstants.interestRateDifferential, LoanApiConstants.interestCalculationPeriodTypeParameterName, LoanProductConstants.ALLOW_PARTIAL_PERIOD_INTEREST_CALCUALTION_PARAM_NAME, - LoanApiConstants.interestRateFrequencyTypeParameterName, LoanApiConstants.disbursementDateParameterName, + LoanApiConstants.interestRateFrequencyTypeParameterName, LoanApiConstants.expectedDisbursementDateParameterName, LoanApiConstants.repaymentsStartingFromDateParameterName, LoanApiConstants.graceOnPrincipalPaymentParameterName, LoanApiConstants.graceOnInterestPaymentParameterName, LoanApiConstants.graceOnInterestChargedParameterName, LoanApiConstants.interestChargedFromDateParameterName, LoanApiConstants.submittedOnDateParameterName, @@ -96,6 +96,7 @@ public final class LoanApplicationCommandFromApiJsonHelper { LoanApiConstants.lastApplication, // glim specific LoanApiConstants.daysInYearTypeParameterName, LoanApiConstants.fixedPrincipalPercentagePerInstallmentParamName, LoanApiConstants.DISALLOW_EXPECTED_DISBURSEMENTS)); + public static final String LOANAPPLICATION_UNDO = "loanapplication.undo"; private final FromJsonHelper fromApiJsonHelper; private final CalculateLoanScheduleQueryFromApiJsonHelper apiJsonHelper; @@ -115,52 +116,57 @@ public final class LoanApplicationCommandFromApiJsonHelper { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("loan"); final JsonElement element = this.fromApiJsonHelper.parse(json); - final String loanTypeParameterName = "loanType"; - final String loanTypeStr = this.fromApiJsonHelper.extractStringNamed(loanTypeParameterName, element); - baseDataValidator.reset().parameter(loanTypeParameterName).value(loanTypeStr).notNull(); + final String loanTypeStr = this.fromApiJsonHelper.extractStringNamed(LoanApiConstants.loanTypeParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.loanTypeParameterName).value(loanTypeStr).notNull(); if (!StringUtils.isBlank(loanTypeStr)) { final AccountType loanType = AccountType.fromName(loanTypeStr); - baseDataValidator.reset().parameter(loanTypeParameterName).value(loanType.getValue()).inMinMaxRange(1, 4); + baseDataValidator.reset().parameter(LoanApiConstants.loanTypeParameterName).value(loanType.getValue()).inMinMaxRange(1, 4); - final Long clientId = this.fromApiJsonHelper.extractLongNamed("clientId", element); - final Long groupId = this.fromApiJsonHelper.extractLongNamed("groupId", element); + final Long clientId = this.fromApiJsonHelper.extractLongNamed(LoanApiConstants.clientIdParameterName, element); + final Long groupId = this.fromApiJsonHelper.extractLongNamed(LoanApiConstants.groupIdParameterName, element); if (loanType.isIndividualAccount()) { - baseDataValidator.reset().parameter("clientId").value(clientId).notNull().longGreaterThanZero(); - baseDataValidator.reset().parameter("groupId").value(groupId).mustBeBlankWhenParameterProvided("clientId", clientId); + baseDataValidator.reset().parameter(LoanApiConstants.clientIdParameterName).value(clientId).notNull().longGreaterThanZero(); + baseDataValidator.reset().parameter(LoanApiConstants.groupIdParameterName).value(groupId) + .mustBeBlankWhenParameterProvided(LoanApiConstants.clientIdParameterName, clientId); } if (loanType.isGroupAccount()) { - baseDataValidator.reset().parameter("groupId").value(groupId).notNull().longGreaterThanZero(); - baseDataValidator.reset().parameter("clientId").value(clientId).mustBeBlankWhenParameterProvided("groupId", groupId); + baseDataValidator.reset().parameter(LoanApiConstants.groupIdParameterName).value(groupId).notNull().longGreaterThanZero(); + baseDataValidator.reset().parameter(LoanApiConstants.clientIdParameterName).value(clientId) + .mustBeBlankWhenParameterProvided(LoanApiConstants.groupIdParameterName, groupId); } if (loanType.isJLGAccount()) { - baseDataValidator.reset().parameter("clientId").value(clientId).notNull().integerGreaterThanZero(); - baseDataValidator.reset().parameter("groupId").value(groupId).notNull().longGreaterThanZero(); + baseDataValidator.reset().parameter(LoanApiConstants.clientIdParameterName).value(clientId).notNull() + .integerGreaterThanZero(); + baseDataValidator.reset().parameter(LoanApiConstants.groupIdParameterName).value(groupId).notNull().longGreaterThanZero(); // if it is JLG loan that must have meeting details if (isMeetingMandatoryForJLGLoans) { - final String calendarIdParameterName = "calendarId"; - final Long calendarId = this.fromApiJsonHelper.extractLongNamed(calendarIdParameterName, element); - baseDataValidator.reset().parameter(calendarIdParameterName).value(calendarId).notNull().integerGreaterThanZero(); + + final Long calendarId = this.fromApiJsonHelper.extractLongNamed(LoanApiConstants.calendarIdParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.calendarIdParameterName).value(calendarId).notNull() + .integerGreaterThanZero(); // if it is JLG loan then must have a value for // syncDisbursement passed in - String syncDisbursementParameterName = "syncDisbursementWithMeeting"; - final Boolean syncDisbursement = this.fromApiJsonHelper.extractBooleanNamed(syncDisbursementParameterName, element); + final Boolean syncDisbursement = this.fromApiJsonHelper + .extractBooleanNamed(LoanApiConstants.syncDisbursementWithMeetingParameterName, element); if (syncDisbursement == null) { - baseDataValidator.reset().parameter(syncDisbursementParameterName).value(syncDisbursement) - .trueOrFalseRequired(false); + baseDataValidator.reset().parameter(LoanApiConstants.syncDisbursementWithMeetingParameterName) + .value(syncDisbursement).trueOrFalseRequired(false); } } @@ -183,85 +189,84 @@ public final class LoanApplicationCommandFromApiJsonHelper { baseDataValidator.reset().parameter(LoanApiConstants.fixedPrincipalPercentagePerInstallmentParamName) .value(fixedPrincipalPercentagePerInstallment).notLessThanMin(BigDecimal.ONE).notGreaterThanMax(BigDecimal.valueOf(100)); - final Long productId = this.fromApiJsonHelper.extractLongNamed("productId", element); - baseDataValidator.reset().parameter("productId").value(productId).notNull().integerGreaterThanZero(); + final Long productId = this.fromApiJsonHelper.extractLongNamed(LoanApiConstants.productIdParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.productIdParameterName).value(productId).notNull().integerGreaterThanZero(); - final String accountNoParameterName = "accountNo"; - if (this.fromApiJsonHelper.parameterExists(accountNoParameterName, element)) { - final String accountNo = this.fromApiJsonHelper.extractStringNamed(accountNoParameterName, element); - baseDataValidator.reset().parameter(accountNoParameterName).value(accountNo).ignoreIfNull().notExceedingLengthOf(20); + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.accountNoParameterName, element)) { + final String accountNo = this.fromApiJsonHelper.extractStringNamed(LoanApiConstants.accountNoParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.accountNoParameterName).value(accountNo).ignoreIfNull() + .notExceedingLengthOf(20); } - final String externalIdParameterName = "externalId"; - if (this.fromApiJsonHelper.parameterExists(externalIdParameterName, element)) { - final String externalId = this.fromApiJsonHelper.extractStringNamed(externalIdParameterName, element); - baseDataValidator.reset().parameter(externalIdParameterName).value(externalId).ignoreIfNull().notExceedingLengthOf(100); + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.externalIdParameterName, element)) { + final String externalId = this.fromApiJsonHelper.extractStringNamed(LoanApiConstants.externalIdParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.externalIdParameterName).value(externalId).ignoreIfNull() + .notExceedingLengthOf(100); } - final String fundIdParameterName = "fundId"; - if (this.fromApiJsonHelper.parameterExists(fundIdParameterName, element)) { - final Long fundId = this.fromApiJsonHelper.extractLongNamed(fundIdParameterName, element); - baseDataValidator.reset().parameter(fundIdParameterName).value(fundId).ignoreIfNull().integerGreaterThanZero(); + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.fundIdParameterName, element)) { + final Long fundId = this.fromApiJsonHelper.extractLongNamed(LoanApiConstants.fundIdParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.fundIdParameterName).value(fundId).ignoreIfNull().integerGreaterThanZero(); } - final String loanOfficerIdParameterName = "loanOfficerId"; - if (this.fromApiJsonHelper.parameterExists(loanOfficerIdParameterName, element)) { - final Long loanOfficerId = this.fromApiJsonHelper.extractLongNamed(loanOfficerIdParameterName, element); - baseDataValidator.reset().parameter(loanOfficerIdParameterName).value(loanOfficerId).ignoreIfNull().integerGreaterThanZero(); + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.loanOfficerIdParameterName, element)) { + final Long loanOfficerId = this.fromApiJsonHelper.extractLongNamed(LoanApiConstants.loanOfficerIdParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.loanOfficerIdParameterName).value(loanOfficerId).ignoreIfNull() + .integerGreaterThanZero(); } - final String loanPurposeIdParameterName = "loanPurposeId"; - if (this.fromApiJsonHelper.parameterExists(loanPurposeIdParameterName, element)) { - final Long loanPurposeId = this.fromApiJsonHelper.extractLongNamed(loanPurposeIdParameterName, element); - baseDataValidator.reset().parameter(loanPurposeIdParameterName).value(loanPurposeId).ignoreIfNull().integerGreaterThanZero(); + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.loanPurposeIdParameterName, element)) { + final Long loanPurposeId = this.fromApiJsonHelper.extractLongNamed(LoanApiConstants.loanPurposeIdParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.loanPurposeIdParameterName).value(loanPurposeId).ignoreIfNull() + .integerGreaterThanZero(); } - final BigDecimal principal = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("principal", element); - baseDataValidator.reset().parameter("principal").value(principal).notNull().positiveAmount(); + final BigDecimal principal = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(LoanApiConstants.principalParamName, element); + baseDataValidator.reset().parameter(LoanApiConstants.principalParamName).value(principal).notNull().positiveAmount(); - final String loanTermFrequencyParameterName = "loanTermFrequency"; - final Integer loanTermFrequency = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(loanTermFrequencyParameterName, element); - baseDataValidator.reset().parameter(loanTermFrequencyParameterName).value(loanTermFrequency).notNull().integerGreaterThanZero(); + final Integer loanTermFrequency = this.fromApiJsonHelper + .extractIntegerWithLocaleNamed(LoanApiConstants.loanTermFrequencyParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.loanTermFrequencyParameterName).value(loanTermFrequency).notNull() + .integerGreaterThanZero(); - final String loanTermFrequencyTypeParameterName = "loanTermFrequencyType"; - final Integer loanTermFrequencyType = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(loanTermFrequencyTypeParameterName, + final Integer loanTermFrequencyType = this.fromApiJsonHelper + .extractIntegerSansLocaleNamed(LoanApiConstants.loanTermFrequencyTypeParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.loanTermFrequencyTypeParameterName).value(loanTermFrequencyType).notNull() + .inMinMaxRange(0, 3); + + final Integer numberOfRepayments = this.fromApiJsonHelper + .extractIntegerWithLocaleNamed(LoanApiConstants.numberOfRepaymentsParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.numberOfRepaymentsParameterName).value(numberOfRepayments).notNull() + .integerGreaterThanZero(); + + final Integer repaymentEvery = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(LoanApiConstants.repaymentEveryParameterName, element); - baseDataValidator.reset().parameter(loanTermFrequencyTypeParameterName).value(loanTermFrequencyType).notNull().inMinMaxRange(0, 3); + baseDataValidator.reset().parameter(LoanApiConstants.repaymentEveryParameterName).value(repaymentEvery).notNull() + .integerGreaterThanZero(); - final String numberOfRepaymentsParameterName = "numberOfRepayments"; - final Integer numberOfRepayments = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(numberOfRepaymentsParameterName, element); - baseDataValidator.reset().parameter(numberOfRepaymentsParameterName).value(numberOfRepayments).notNull().integerGreaterThanZero(); + final Integer repaymentEveryType = this.fromApiJsonHelper + .extractIntegerSansLocaleNamed(LoanApiConstants.repaymentFrequencyTypeParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.repaymentFrequencyTypeParameterName).value(repaymentEveryType).notNull() + .inMinMaxRange(0, 3); - final String repaymentEveryParameterName = "repaymentEvery"; - final Integer repaymentEvery = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(repaymentEveryParameterName, element); - baseDataValidator.reset().parameter(repaymentEveryParameterName).value(repaymentEvery).notNull().integerGreaterThanZero(); + CalendarUtils.validateNthDayOfMonthFrequency(baseDataValidator, LoanApiConstants.repaymentFrequencyNthDayTypeParameterName, + LoanApiConstants.repaymentFrequencyDayOfWeekTypeParameterName, element, this.fromApiJsonHelper); - final String repaymentEveryFrequencyTypeParameterName = "repaymentFrequencyType"; - final Integer repaymentEveryType = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(repaymentEveryFrequencyTypeParameterName, + final Integer interestType = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(LoanApiConstants.interestTypeParameterName, element); - baseDataValidator.reset().parameter(repaymentEveryFrequencyTypeParameterName).value(repaymentEveryType).notNull().inMinMaxRange(0, - 3); + baseDataValidator.reset().parameter(LoanApiConstants.interestTypeParameterName).value(interestType).notNull().inMinMaxRange(0, 1); - final String repaymentFrequencyNthDayTypeParameterName = "repaymentFrequencyNthDayType"; - final String repaymentFrequencyDayOfWeekTypeParameterName = "repaymentFrequencyDayOfWeekType"; - CalendarUtils.validateNthDayOfMonthFrequency(baseDataValidator, repaymentFrequencyNthDayTypeParameterName, - repaymentFrequencyDayOfWeekTypeParameterName, element, this.fromApiJsonHelper); - final String interestTypeParameterName = "interestType"; - final Integer interestType = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(interestTypeParameterName, element); - baseDataValidator.reset().parameter(interestTypeParameterName).value(interestType).notNull().inMinMaxRange(0, 1); - - final String interestCalculationPeriodTypeParameterName = "interestCalculationPeriodType"; final Integer interestCalculationPeriodType = this.fromApiJsonHelper - .extractIntegerSansLocaleNamed(interestCalculationPeriodTypeParameterName, element); - baseDataValidator.reset().parameter(interestCalculationPeriodTypeParameterName).value(interestCalculationPeriodType).notNull() - .inMinMaxRange(0, 1); + .extractIntegerSansLocaleNamed(LoanApiConstants.interestCalculationPeriodTypeParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.interestCalculationPeriodTypeParameterName) + .value(interestCalculationPeriodType).notNull().inMinMaxRange(0, 1); if (loanProduct.isLinkedToFloatingInterestRate()) { if (isEqualAmortization) { throw new EqualAmortizationUnsupportedFeatureException("floating.interest.rate", "floating interest rate"); } - if (this.fromApiJsonHelper.parameterExists("interestRatePerPeriod", element)) { - baseDataValidator.reset().parameter("interestRatePerPeriod").failWithCode( + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.interestRatePerPeriodParameterName, element)) { + baseDataValidator.reset().parameter(LoanApiConstants.interestRatePerPeriodParameterName).failWithCode( "not.supported.loanproduct.linked.to.floating.rate", "interestRatePerPeriod param is not supported, selected Loan Product is linked with floating interest rate."); } @@ -280,7 +285,8 @@ public final class LoanApplicationCommandFromApiJsonHelper { } if (interestType != null && interestType.equals(InterestMethod.FLAT.getValue())) { - baseDataValidator.reset().parameter(interestTypeParameterName).failWithCode("should.be.0.for.selected.loan.product", + baseDataValidator.reset().parameter(LoanApiConstants.interestTypeParameterName).failWithCode( + "should.be.0.for.selected.loan.product", "interestType should be DECLINING_BALANCE for selected Loan Product as it is linked to floating rates."); } @@ -304,17 +310,17 @@ public final class LoanApplicationCommandFromApiJsonHelper { "interestRateDifferential param is not supported, selected Loan Product is not linked with floating interest rate."); } - final String interestRatePerPeriodParameterName = "interestRatePerPeriod"; final BigDecimal interestRatePerPeriod = this.fromApiJsonHelper - .extractBigDecimalWithLocaleNamed(interestRatePerPeriodParameterName, element); - baseDataValidator.reset().parameter(interestRatePerPeriodParameterName).value(interestRatePerPeriod).notNull() + .extractBigDecimalWithLocaleNamed(LoanApiConstants.interestRatePerPeriodParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.interestRatePerPeriodParameterName).value(interestRatePerPeriod).notNull() .zeroOrPositiveAmount(); } - final String amortizationTypeParameterName = "amortizationType"; - final Integer amortizationType = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(amortizationTypeParameterName, element); - baseDataValidator.reset().parameter(amortizationTypeParameterName).value(amortizationType).notNull().inMinMaxRange(0, 1); + final Integer amortizationType = this.fromApiJsonHelper + .extractIntegerSansLocaleNamed(LoanApiConstants.amortizationTypeParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.amortizationTypeParameterName).value(amortizationType).notNull() + .inMinMaxRange(0, 1); if (!amortizationType.equals(AmortizationMethod.EQUAL_PRINCIPAL.getValue()) && fixedPrincipalPercentagePerInstallment != null) { baseDataValidator.reset().parameter(LoanApiConstants.fixedPrincipalPercentagePerInstallmentParamName).failWithCode( @@ -322,99 +328,104 @@ public final class LoanApplicationCommandFromApiJsonHelper { "Principal fixing cannot be done with equal installment amortization"); } - final String expectedDisbursementDateParameterName = "expectedDisbursementDate"; - final LocalDate expectedDisbursementDate = this.fromApiJsonHelper.extractLocalDateNamed(expectedDisbursementDateParameterName, - element); - baseDataValidator.reset().parameter(expectedDisbursementDateParameterName).value(expectedDisbursementDate).notNull(); + final LocalDate expectedDisbursementDate = this.fromApiJsonHelper + .extractLocalDateNamed(LoanApiConstants.expectedDisbursementDateParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.expectedDisbursementDateParameterName).value(expectedDisbursementDate) + .notNull(); // grace validation - final Integer graceOnPrincipalPayment = this.fromApiJsonHelper.extractIntegerWithLocaleNamed("graceOnPrincipalPayment", element); - baseDataValidator.reset().parameter("graceOnPrincipalPayment").value(graceOnPrincipalPayment).zeroOrPositiveAmount(); + final Integer graceOnPrincipalPayment = this.fromApiJsonHelper + .extractIntegerWithLocaleNamed(LoanApiConstants.graceOnPrincipalPaymentParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.graceOnPrincipalPaymentParameterName).value(graceOnPrincipalPayment) + .zeroOrPositiveAmount(); - final Integer graceOnInterestPayment = this.fromApiJsonHelper.extractIntegerWithLocaleNamed("graceOnInterestPayment", element); - baseDataValidator.reset().parameter("graceOnInterestPayment").value(graceOnInterestPayment).zeroOrPositiveAmount(); + final Integer graceOnInterestPayment = this.fromApiJsonHelper + .extractIntegerWithLocaleNamed(LoanApiConstants.graceOnInterestPaymentParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.graceOnInterestPaymentParameterName).value(graceOnInterestPayment) + .zeroOrPositiveAmount(); - final Integer graceOnInterestCharged = this.fromApiJsonHelper.extractIntegerWithLocaleNamed("graceOnInterestCharged", element); - baseDataValidator.reset().parameter("graceOnInterestCharged").value(graceOnInterestCharged).zeroOrPositiveAmount(); + final Integer graceOnInterestCharged = this.fromApiJsonHelper + .extractIntegerWithLocaleNamed(LoanApiConstants.graceOnInterestChargedParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.graceOnInterestChargedParameterName).value(graceOnInterestCharged) + .zeroOrPositiveAmount(); final Integer graceOnArrearsAgeing = this.fromApiJsonHelper .extractIntegerWithLocaleNamed(LoanProductConstants.GRACE_ON_ARREARS_AGEING_PARAMETER_NAME, element); baseDataValidator.reset().parameter(LoanProductConstants.GRACE_ON_ARREARS_AGEING_PARAMETER_NAME).value(graceOnArrearsAgeing) .zeroOrPositiveAmount(); - final String interestChargedFromDateParameterName = "interestChargedFromDate"; - if (this.fromApiJsonHelper.parameterExists(interestChargedFromDateParameterName, element)) { - final LocalDate interestChargedFromDate = this.fromApiJsonHelper.extractLocalDateNamed(interestChargedFromDateParameterName, - element); - baseDataValidator.reset().parameter(interestChargedFromDateParameterName).value(interestChargedFromDate).ignoreIfNull() - .notNull(); + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.interestChargedFromDateParameterName, element)) { + final LocalDate interestChargedFromDate = this.fromApiJsonHelper + .extractLocalDateNamed(LoanApiConstants.interestChargedFromDateParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.interestChargedFromDateParameterName).value(interestChargedFromDate) + .ignoreIfNull().notNull(); } - final String repaymentsStartingFromDateParameterName = "repaymentsStartingFromDate"; - if (this.fromApiJsonHelper.parameterExists(repaymentsStartingFromDateParameterName, element)) { + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.repaymentsStartingFromDateParameterName, element)) { final LocalDate repaymentsStartingFromDate = this.fromApiJsonHelper - .extractLocalDateNamed(repaymentsStartingFromDateParameterName, element); - baseDataValidator.reset().parameter(repaymentsStartingFromDateParameterName).value(repaymentsStartingFromDate).ignoreIfNull() - .notNull(); + .extractLocalDateNamed(LoanApiConstants.repaymentsStartingFromDateParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.repaymentsStartingFromDateParameterName).value(repaymentsStartingFromDate) + .ignoreIfNull().notNull(); } - final String inArrearsToleranceParameterName = "inArrearsTolerance"; - if (this.fromApiJsonHelper.parameterExists(inArrearsToleranceParameterName, element)) { - final BigDecimal inArrearsTolerance = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(inArrearsToleranceParameterName, - element); - baseDataValidator.reset().parameter(inArrearsToleranceParameterName).value(inArrearsTolerance).ignoreIfNull() + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.inArrearsToleranceParameterName, element)) { + final BigDecimal inArrearsTolerance = this.fromApiJsonHelper + .extractBigDecimalWithLocaleNamed(LoanApiConstants.inArrearsToleranceParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.inArrearsToleranceParameterName).value(inArrearsTolerance).ignoreIfNull() .zeroOrPositiveAmount(); } - final String submittedOnDateParameterName = "submittedOnDate"; - final LocalDate submittedOnDate = this.fromApiJsonHelper.extractLocalDateNamed(submittedOnDateParameterName, element); + final LocalDate submittedOnDate = this.fromApiJsonHelper.extractLocalDateNamed(LoanApiConstants.submittedOnDateParameterName, + element); if (submittedOnDate == null) { - baseDataValidator.reset().parameter(submittedOnDateParameterName).value(submittedOnDate).notNull(); + baseDataValidator.reset().parameter(LoanApiConstants.submittedOnDateParameterName).value(submittedOnDate).notNull(); } - final String submittedOnNoteParameterName = "submittedOnNote"; - if (this.fromApiJsonHelper.parameterExists(submittedOnNoteParameterName, element)) { - final String submittedOnNote = this.fromApiJsonHelper.extractStringNamed(submittedOnNoteParameterName, element); - baseDataValidator.reset().parameter(submittedOnNoteParameterName).value(submittedOnNote).ignoreIfNull() + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.submittedOnNoteParameterName, element)) { + final String submittedOnNote = this.fromApiJsonHelper.extractStringNamed(LoanApiConstants.submittedOnNoteParameterName, + element); + baseDataValidator.reset().parameter(LoanApiConstants.submittedOnNoteParameterName).value(submittedOnNote).ignoreIfNull() .notExceedingLengthOf(500); } - final String transactionProcessingStrategyIdParameterName = "transactionProcessingStrategyId"; - final Long transactionProcessingStrategyId = this.fromApiJsonHelper.extractLongNamed(transactionProcessingStrategyIdParameterName, - element); - baseDataValidator.reset().parameter(transactionProcessingStrategyIdParameterName).value(transactionProcessingStrategyId).notNull() - .integerGreaterThanZero(); + final Long transactionProcessingStrategyId = this.fromApiJsonHelper + .extractLongNamed(LoanApiConstants.transactionProcessingStrategyIdParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.transactionProcessingStrategyIdParameterName) + .value(transactionProcessingStrategyId).notNull().integerGreaterThanZero(); - final String linkAccountIdParameterName = "linkAccountId"; - if (this.fromApiJsonHelper.parameterExists(linkAccountIdParameterName, element)) { - final Long linkAccountId = this.fromApiJsonHelper.extractLongNamed(linkAccountIdParameterName, element); - baseDataValidator.reset().parameter(linkAccountIdParameterName).value(linkAccountId).ignoreIfNull().longGreaterThanZero(); + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.linkAccountIdParameterName, element)) { + final Long linkAccountId = this.fromApiJsonHelper.extractLongNamed(LoanApiConstants.linkAccountIdParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.linkAccountIdParameterName).value(linkAccountId).ignoreIfNull() + .longGreaterThanZero(); } - final String createSiAtDisbursementParameterName = "createStandingInstructionAtDisbursement"; - if (this.fromApiJsonHelper.parameterExists(createSiAtDisbursementParameterName, element)) { + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.createStandingInstructionAtDisbursementParameterName, element)) { final Boolean createStandingInstructionAtDisbursement = this.fromApiJsonHelper - .extractBooleanNamed(createSiAtDisbursementParameterName, element); - final Long linkAccountId = this.fromApiJsonHelper.extractLongNamed(linkAccountIdParameterName, element); + .extractBooleanNamed(LoanApiConstants.createStandingInstructionAtDisbursementParameterName, element); + final Long linkAccountId = this.fromApiJsonHelper.extractLongNamed(LoanApiConstants.linkAccountIdParameterName, element); if (createStandingInstructionAtDisbursement) { - baseDataValidator.reset().parameter(linkAccountIdParameterName).value(linkAccountId).notNull().longGreaterThanZero(); + baseDataValidator.reset().parameter(LoanApiConstants.linkAccountIdParameterName).value(linkAccountId).notNull() + .longGreaterThanZero(); } } // charges - final String chargesParameterName = "charges"; - if (element.isJsonObject() && this.fromApiJsonHelper.parameterExists(chargesParameterName, element)) { + if (element.isJsonObject() && this.fromApiJsonHelper.parameterExists(LoanApiConstants.chargesParameterName, element)) { final JsonObject topLevelJsonElement = element.getAsJsonObject(); final String dateFormat = this.fromApiJsonHelper.extractDateFormatParameter(topLevelJsonElement); final Locale locale = this.fromApiJsonHelper.extractLocaleParameter(topLevelJsonElement); - if (topLevelJsonElement.get(chargesParameterName).isJsonArray()) { - final Type arrayObjectParameterTypeOfMap = new TypeToken>() {}.getType(); - final Set supportedParameters = new HashSet<>( - Arrays.asList("id", "chargeId", "amount", "chargeTimeType", "chargeCalculationType", "dueDate")); + if (topLevelJsonElement.get(LoanApiConstants.chargesParameterName).isJsonArray()) { + final Type arrayObjectParameterTypeOfMap = new TypeToken>() { - final JsonArray array = topLevelJsonElement.get("charges").getAsJsonArray(); + }.getType(); + final Set supportedParameters = new HashSet<>( + Arrays.asList(LoanApiConstants.idParameterName, LoanApiConstants.chargeIdParameterName, + LoanApiConstants.amountParameterName, LoanApiConstants.chargeTimeTypeParameterName, + LoanApiConstants.chargeCalculationTypeParameterName, LoanApiConstants.dueDateParamName)); + + final JsonArray array = topLevelJsonElement.get(LoanApiConstants.chargesParameterName).getAsJsonArray(); for (int i = 1; i <= array.size(); i++) { final JsonObject loanChargeElement = array.get(i - 1).getAsJsonObject(); @@ -422,15 +433,18 @@ public final class LoanApplicationCommandFromApiJsonHelper { this.fromApiJsonHelper.checkForUnsupportedParameters(arrayObjectParameterTypeOfMap, arrayObjectJson, supportedParameters); - final Long chargeId = this.fromApiJsonHelper.extractLongNamed("chargeId", loanChargeElement); - baseDataValidator.reset().parameter("charges").parameterAtIndexArray("chargeId", i).value(chargeId).notNull() + final Long chargeId = this.fromApiJsonHelper.extractLongNamed(LoanApiConstants.chargeIdParameterName, + loanChargeElement); + baseDataValidator.reset().parameter(LoanApiConstants.chargesParameterName) + .parameterAtIndexArray(LoanApiConstants.chargeIdParameterName, i).value(chargeId).notNull() .integerGreaterThanZero(); - final BigDecimal amount = this.fromApiJsonHelper.extractBigDecimalNamed("amount", loanChargeElement, locale); - baseDataValidator.reset().parameter("charges").parameterAtIndexArray("amount", i).value(amount).notNull() - .positiveAmount(); + final BigDecimal amount = this.fromApiJsonHelper.extractBigDecimalNamed(LoanApiConstants.amountParameterName, + loanChargeElement, locale); + baseDataValidator.reset().parameter(LoanApiConstants.chargesParameterName) + .parameterAtIndexArray(LoanApiConstants.amountParameterName, i).value(amount).notNull().positiveAmount(); - this.fromApiJsonHelper.extractLocalDateNamed("dueDate", loanChargeElement, dateFormat, locale); + this.fromApiJsonHelper.extractLocalDateNamed(LoanApiConstants.dueDateParamName, loanChargeElement, dateFormat, locale); } } } @@ -443,45 +457,47 @@ public final class LoanApplicationCommandFromApiJsonHelper { if (!StringUtils.isBlank(loanTypeStr)) { final AccountType loanType = AccountType.fromName(loanTypeStr); - if (loanType.isIndividualAccount()) { - // collateral - final String collateralParameterName = "collateral"; - if (element.isJsonObject() && this.fromApiJsonHelper.parameterExists(collateralParameterName, element)) { - final JsonObject topLevelJsonElement = element.getAsJsonObject(); - final Locale locale = this.fromApiJsonHelper.extractLocaleParameter(topLevelJsonElement); - if (topLevelJsonElement.get("collateral").isJsonArray()) { + // collateral + if (loanType.isIndividualAccount() && element.isJsonObject() + && this.fromApiJsonHelper.parameterExists(LoanApiConstants.collateralParameterName, element)) { + final JsonObject topLevelJsonElement = element.getAsJsonObject(); + final Locale locale = this.fromApiJsonHelper.extractLocaleParameter(topLevelJsonElement); + if (topLevelJsonElement.get(LoanApiConstants.collateralParameterName).isJsonArray()) { - final Type collateralParameterTypeOfMap = new TypeToken>() {}.getType(); - final Set supportedParameters = new HashSet<>(Arrays.asList("clientCollateralId", "quantity")); - final JsonArray array = topLevelJsonElement.get("collateral").getAsJsonArray(); - for (int i = 1; i <= array.size(); i++) { - final JsonObject collateralItemElement = array.get(i - 1).getAsJsonObject(); + final Type collateralParameterTypeOfMap = new TypeToken>() { - final String collateralJson = this.fromApiJsonHelper.toJson(collateralItemElement); - this.fromApiJsonHelper.checkForUnsupportedParameters(collateralParameterTypeOfMap, collateralJson, - supportedParameters); + }.getType(); + final Set supportedParameters = new HashSet<>( + Arrays.asList(LoanApiConstants.clientCollateralIdParameterName, LoanApiConstants.quantityParameterName)); + final JsonArray array = topLevelJsonElement.get(LoanApiConstants.collateralParameterName).getAsJsonArray(); + for (int i = 1; i <= array.size(); i++) { + final JsonObject collateralItemElement = array.get(i - 1).getAsJsonObject(); - final Long clientCollateralId = this.fromApiJsonHelper.extractLongNamed("clientCollateralId", - collateralItemElement); - baseDataValidator.reset().parameter("collateral").parameterAtIndexArray("clientCollateralId", i) - .value(clientCollateralId).notNull().integerGreaterThanZero(); + final String collateralJson = this.fromApiJsonHelper.toJson(collateralItemElement); + this.fromApiJsonHelper.checkForUnsupportedParameters(collateralParameterTypeOfMap, collateralJson, + supportedParameters); - final BigDecimal quantity = this.fromApiJsonHelper.extractBigDecimalNamed("quantity", collateralItemElement, - locale); - baseDataValidator.reset().parameter("collateral").parameterAtIndexArray("quantity", i).value(quantity).notNull() - .positiveAmount(); + final Long clientCollateralId = this.fromApiJsonHelper + .extractLongNamed(LoanApiConstants.clientCollateralIdParameterName, collateralItemElement); + baseDataValidator.reset().parameter(LoanApiConstants.collateralParameterName) + .parameterAtIndexArray(LoanApiConstants.clientCollateralIdParameterName, i).value(clientCollateralId) + .notNull().integerGreaterThanZero(); - final ClientCollateralManagement clientCollateralManagement = this.clientCollateralManagementRepositoryWrapper - .getCollateral(clientCollateralId); + final BigDecimal quantity = this.fromApiJsonHelper.extractBigDecimalNamed(LoanApiConstants.quantityParameterName, + collateralItemElement, locale); + baseDataValidator.reset().parameter(LoanApiConstants.collateralParameterName) + .parameterAtIndexArray(LoanApiConstants.quantityParameterName, i).value(quantity).notNull() + .positiveAmount(); - if (clientCollateralId != null - && BigDecimal.valueOf(0).compareTo(clientCollateralManagement.getQuantity()) >= 0) { - throw new InvalidAmountOfCollateralQuantity(clientCollateralManagement.getQuantity()); - } + final ClientCollateralManagement clientCollateralManagement = this.clientCollateralManagementRepositoryWrapper + .getCollateral(clientCollateralId); + + if (clientCollateralId != null && BigDecimal.valueOf(0).compareTo(clientCollateralManagement.getQuantity()) >= 0) { + throw new InvalidAmountOfCollateralQuantity(clientCollateralManagement.getQuantity()); } - } else { - baseDataValidator.reset().parameter(collateralParameterName).expectedArrayButIsNot(); } + } else { + baseDataValidator.reset().parameter(LoanApiConstants.collateralParameterName).expectedArrayButIsNot(); } } } @@ -495,9 +511,9 @@ public final class LoanApplicationCommandFromApiJsonHelper { if (isEqualAmortization) { throw new EqualAmortizationUnsupportedFeatureException("fixed.emi", "fixed emi"); } - final BigDecimal emiAnount = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(LoanApiConstants.emiAmountParameterName, + final BigDecimal emiAmount = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(LoanApiConstants.emiAmountParameterName, element); - baseDataValidator.reset().parameter(LoanApiConstants.emiAmountParameterName).value(emiAnount).ignoreIfNull().positiveAmount(); + baseDataValidator.reset().parameter(LoanApiConstants.emiAmountParameterName).value(emiAmount).ignoreIfNull().positiveAmount(); } if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.maxOutstandingBalanceParameterName, element)) { final BigDecimal maxOutstandingBalance = this.fromApiJsonHelper @@ -506,15 +522,13 @@ public final class LoanApplicationCommandFromApiJsonHelper { .ignoreIfNull().positiveAmount(); } - if (loanProduct.canUseForTopup()) { - if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.isTopup, element)) { - final Boolean isTopup = this.fromApiJsonHelper.extractBooleanNamed(LoanApiConstants.isTopup, element); - baseDataValidator.reset().parameter(LoanApiConstants.isTopup).value(isTopup).validateForBooleanValue(); + if (loanProduct.canUseForTopup() && this.fromApiJsonHelper.parameterExists(LoanApiConstants.isTopup, element)) { + final Boolean isTopup = this.fromApiJsonHelper.extractBooleanNamed(LoanApiConstants.isTopup, element); + baseDataValidator.reset().parameter(LoanApiConstants.isTopup).value(isTopup).validateForBooleanValue(); - if (isTopup != null && isTopup) { - final Long loanId = this.fromApiJsonHelper.extractLongNamed(LoanApiConstants.loanIdToClose, element); - baseDataValidator.reset().parameter(LoanApiConstants.loanIdToClose).value(loanId).notNull().longGreaterThanZero(); - } + if (isTopup != null && isTopup) { + final Long loanId = this.fromApiJsonHelper.extractLongNamed(LoanApiConstants.loanIdToClose, element); + baseDataValidator.reset().parameter(LoanApiConstants.loanIdToClose).value(loanId).notNull().longGreaterThanZero(); } } if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.datatables, element)) { @@ -541,40 +555,40 @@ public final class LoanApplicationCommandFromApiJsonHelper { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("loan"); final JsonElement element = this.fromApiJsonHelper.parse(json); boolean atLeastOneParameterPassedForUpdate = false; - final String clientIdParameterName = "clientId"; - if (this.fromApiJsonHelper.parameterExists(clientIdParameterName, element)) { + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.clientIdParameterName, element)) { atLeastOneParameterPassedForUpdate = true; - final Long clientId = this.fromApiJsonHelper.extractLongNamed(clientIdParameterName, element); - baseDataValidator.reset().parameter(clientIdParameterName).value(clientId).notNull().integerGreaterThanZero(); + final Long clientId = this.fromApiJsonHelper.extractLongNamed(LoanApiConstants.clientIdParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.clientIdParameterName).value(clientId).notNull().integerGreaterThanZero(); } - final String groupIdParameterName = "groupId"; - if (this.fromApiJsonHelper.parameterExists(groupIdParameterName, element)) { + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.groupIdParameterName, element)) { atLeastOneParameterPassedForUpdate = true; - final Long groupId = this.fromApiJsonHelper.extractLongNamed(groupIdParameterName, element); - baseDataValidator.reset().parameter(groupIdParameterName).value(groupId).notNull().integerGreaterThanZero(); + final Long groupId = this.fromApiJsonHelper.extractLongNamed(LoanApiConstants.groupIdParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.groupIdParameterName).value(groupId).notNull().integerGreaterThanZero(); } - final String productIdParameterName = "productId"; - if (this.fromApiJsonHelper.parameterExists(productIdParameterName, element)) { + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.productIdParameterName, element)) { atLeastOneParameterPassedForUpdate = true; - final Long productId = this.fromApiJsonHelper.extractLongNamed(productIdParameterName, element); - baseDataValidator.reset().parameter(productIdParameterName).value(productId).notNull().integerGreaterThanZero(); + final Long productId = this.fromApiJsonHelper.extractLongNamed(LoanApiConstants.productIdParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.productIdParameterName).value(productId).notNull() + .integerGreaterThanZero(); } - final String accountNoParameterName = "accountNo"; - if (this.fromApiJsonHelper.parameterExists(accountNoParameterName, element)) { + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.accountNoParameterName, element)) { atLeastOneParameterPassedForUpdate = true; - final String accountNo = this.fromApiJsonHelper.extractStringNamed(accountNoParameterName, element); - baseDataValidator.reset().parameter(accountNoParameterName).value(accountNo).notBlank().notExceedingLengthOf(20); + final String accountNo = this.fromApiJsonHelper.extractStringNamed(LoanApiConstants.accountNoParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.accountNoParameterName).value(accountNo).notBlank() + .notExceedingLengthOf(20); } boolean isEqualAmortization = existingLoanApplication.getLoanProductRelatedDetail().isEqualAmortization(); @@ -592,111 +606,106 @@ public final class LoanApplicationCommandFromApiJsonHelper { baseDataValidator.reset().parameter(LoanApiConstants.fixedPrincipalPercentagePerInstallmentParamName) .value(fixedPrincipalPercentagePerInstallment).notLessThanMin(BigDecimal.ONE).notGreaterThanMax(BigDecimal.valueOf(100)); - final String externalIdParameterName = "externalId"; - if (this.fromApiJsonHelper.parameterExists(externalIdParameterName, element)) { + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.externalIdParameterName, element)) { atLeastOneParameterPassedForUpdate = true; - final String externalId = this.fromApiJsonHelper.extractStringNamed(externalIdParameterName, element); - baseDataValidator.reset().parameter(externalIdParameterName).value(externalId).ignoreIfNull().notExceedingLengthOf(100); + final String externalId = this.fromApiJsonHelper.extractStringNamed(LoanApiConstants.externalIdParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.externalIdParameterName).value(externalId).ignoreIfNull() + .notExceedingLengthOf(100); } - final String fundIdParameterName = "fundId"; - if (this.fromApiJsonHelper.parameterExists(fundIdParameterName, element)) { + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.fundIdParameterName, element)) { atLeastOneParameterPassedForUpdate = true; - final Long fundId = this.fromApiJsonHelper.extractLongNamed(fundIdParameterName, element); - baseDataValidator.reset().parameter(fundIdParameterName).value(fundId).ignoreIfNull().integerGreaterThanZero(); + final Long fundId = this.fromApiJsonHelper.extractLongNamed(LoanApiConstants.fundIdParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.fundIdParameterName).value(fundId).ignoreIfNull().integerGreaterThanZero(); } - final String loanOfficerIdParameterName = "loanOfficerId"; - if (this.fromApiJsonHelper.parameterExists(loanOfficerIdParameterName, element)) { + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.loanOfficerIdParameterName, element)) { atLeastOneParameterPassedForUpdate = true; - final Long loanOfficerId = this.fromApiJsonHelper.extractLongNamed(loanOfficerIdParameterName, element); - baseDataValidator.reset().parameter(loanOfficerIdParameterName).value(loanOfficerId).ignoreIfNull().integerGreaterThanZero(); - } - - final String transactionProcessingStrategyIdParameterName = "transactionProcessingStrategyId"; - if (this.fromApiJsonHelper.parameterExists(transactionProcessingStrategyIdParameterName, element)) { - atLeastOneParameterPassedForUpdate = true; - final Long transactionProcessingStrategyId = this.fromApiJsonHelper - .extractLongNamed(transactionProcessingStrategyIdParameterName, element); - baseDataValidator.reset().parameter(transactionProcessingStrategyIdParameterName).value(transactionProcessingStrategyId) - .notNull().integerGreaterThanZero(); - } - - final String principalParameterName = "principal"; - BigDecimal principal = null; - if (this.fromApiJsonHelper.parameterExists(principalParameterName, element)) { - atLeastOneParameterPassedForUpdate = true; - principal = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(principalParameterName, element); - baseDataValidator.reset().parameter(principalParameterName).value(principal).notNull().positiveAmount(); - } - - final String inArrearsToleranceParameterName = "inArrearsTolerance"; - if (this.fromApiJsonHelper.parameterExists(inArrearsToleranceParameterName, element)) { - atLeastOneParameterPassedForUpdate = true; - final BigDecimal inArrearsTolerance = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(inArrearsToleranceParameterName, - element); - baseDataValidator.reset().parameter(inArrearsToleranceParameterName).value(inArrearsTolerance).ignoreIfNull() - .zeroOrPositiveAmount(); - } - - final String loanTermFrequencyParameterName = "loanTermFrequency"; - if (this.fromApiJsonHelper.parameterExists(loanTermFrequencyParameterName, element)) { - atLeastOneParameterPassedForUpdate = true; - final Integer loanTermFrequency = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(loanTermFrequencyParameterName, element); - baseDataValidator.reset().parameter(loanTermFrequencyParameterName).value(loanTermFrequency).notNull().integerGreaterThanZero(); - } - - final String loanTermFrequencyTypeParameterName = "loanTermFrequencyType"; - if (this.fromApiJsonHelper.parameterExists(loanTermFrequencyTypeParameterName, element)) { - atLeastOneParameterPassedForUpdate = true; - final Integer loanTermFrequencyType = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(loanTermFrequencyTypeParameterName, - element); - baseDataValidator.reset().parameter(loanTermFrequencyTypeParameterName).value(loanTermFrequencyType).notNull().inMinMaxRange(0, - 3); - } - - final String numberOfRepaymentsParameterName = "numberOfRepayments"; - if (this.fromApiJsonHelper.parameterExists(numberOfRepaymentsParameterName, element)) { - atLeastOneParameterPassedForUpdate = true; - final Integer numberOfRepayments = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(numberOfRepaymentsParameterName, - element); - baseDataValidator.reset().parameter(numberOfRepaymentsParameterName).value(numberOfRepayments).notNull() + final Long loanOfficerId = this.fromApiJsonHelper.extractLongNamed(LoanApiConstants.loanOfficerIdParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.loanOfficerIdParameterName).value(loanOfficerId).ignoreIfNull() .integerGreaterThanZero(); } - final String repaymentEveryParameterName = "repaymentEvery"; - if (this.fromApiJsonHelper.parameterExists(repaymentEveryParameterName, element)) { + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.transactionProcessingStrategyIdParameterName, element)) { atLeastOneParameterPassedForUpdate = true; - final Integer repaymentEvery = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(repaymentEveryParameterName, element); - baseDataValidator.reset().parameter(repaymentEveryParameterName).value(repaymentEvery).notNull().integerGreaterThanZero(); + final Long transactionProcessingStrategyId = this.fromApiJsonHelper + .extractLongNamed(LoanApiConstants.transactionProcessingStrategyIdParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.transactionProcessingStrategyIdParameterName) + .value(transactionProcessingStrategyId).notNull().integerGreaterThanZero(); } - final String repaymentEveryTypeParameterName = "repaymentFrequencyType"; - if (this.fromApiJsonHelper.parameterExists(repaymentEveryTypeParameterName, element)) { + BigDecimal principal = null; + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.principalParameterName, element)) { atLeastOneParameterPassedForUpdate = true; - final Integer repaymentEveryType = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(repaymentEveryTypeParameterName, - element); - baseDataValidator.reset().parameter(repaymentEveryTypeParameterName).value(repaymentEveryType).notNull().inMinMaxRange(0, 3); + principal = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(LoanApiConstants.principalParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.principalParameterName).value(principal).notNull().positiveAmount(); } - final String repaymentFrequencyNthDayTypeParameterName = "repaymentFrequencyNthDayType"; - final String repaymentFrequencyDayOfWeekTypeParameterName = "repaymentFrequencyDayOfWeekType"; - CalendarUtils.validateNthDayOfMonthFrequency(baseDataValidator, repaymentFrequencyNthDayTypeParameterName, - repaymentFrequencyDayOfWeekTypeParameterName, element, this.fromApiJsonHelper); - final String interestTypeParameterName = "interestType"; + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.inArrearsToleranceParameterName, element)) { + atLeastOneParameterPassedForUpdate = true; + final BigDecimal inArrearsTolerance = this.fromApiJsonHelper + .extractBigDecimalWithLocaleNamed(LoanApiConstants.inArrearsToleranceParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.inArrearsToleranceParameterName).value(inArrearsTolerance).ignoreIfNull() + .zeroOrPositiveAmount(); + } + + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.loanTermFrequencyParameterName, element)) { + atLeastOneParameterPassedForUpdate = true; + final Integer loanTermFrequency = this.fromApiJsonHelper + .extractIntegerWithLocaleNamed(LoanApiConstants.loanTermFrequencyParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.loanTermFrequencyParameterName).value(loanTermFrequency).notNull() + .integerGreaterThanZero(); + } + + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.loanTermFrequencyTypeParameterName, element)) { + atLeastOneParameterPassedForUpdate = true; + final Integer loanTermFrequencyType = this.fromApiJsonHelper + .extractIntegerWithLocaleNamed(LoanApiConstants.loanTermFrequencyTypeParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.loanTermFrequencyTypeParameterName).value(loanTermFrequencyType).notNull() + .inMinMaxRange(0, 3); + } + + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.numberOfRepaymentsParameterName, element)) { + atLeastOneParameterPassedForUpdate = true; + final Integer numberOfRepayments = this.fromApiJsonHelper + .extractIntegerWithLocaleNamed(LoanApiConstants.numberOfRepaymentsParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.numberOfRepaymentsParameterName).value(numberOfRepayments).notNull() + .integerGreaterThanZero(); + } + + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.repaymentEveryParameterName, element)) { + atLeastOneParameterPassedForUpdate = true; + final Integer repaymentEvery = this.fromApiJsonHelper + .extractIntegerWithLocaleNamed(LoanApiConstants.repaymentEveryParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.repaymentEveryParameterName).value(repaymentEvery).notNull() + .integerGreaterThanZero(); + } + + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.repaymentFrequencyTypeParameterName, element)) { + atLeastOneParameterPassedForUpdate = true; + final Integer repaymentEveryType = this.fromApiJsonHelper + .extractIntegerWithLocaleNamed(LoanApiConstants.repaymentFrequencyTypeParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.repaymentFrequencyTypeParameterName).value(repaymentEveryType).notNull() + .inMinMaxRange(0, 3); + } + + CalendarUtils.validateNthDayOfMonthFrequency(baseDataValidator, LoanApiConstants.repaymentFrequencyNthDayTypeParameterName, + LoanApiConstants.repaymentFrequencyDayOfWeekTypeParameterName, element, this.fromApiJsonHelper); + Integer interestType = null; - if (this.fromApiJsonHelper.parameterExists(interestTypeParameterName, element)) { + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.interestTypeParameterName, element)) { atLeastOneParameterPassedForUpdate = true; - interestType = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(interestTypeParameterName, element); - baseDataValidator.reset().parameter(interestTypeParameterName).value(interestType).notNull().inMinMaxRange(0, 1); + interestType = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(LoanApiConstants.interestTypeParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.interestTypeParameterName).value(interestType).notNull().inMinMaxRange(0, + 1); } if (loanProduct.isLinkedToFloatingInterestRate()) { if (isEqualAmortization) { throw new EqualAmortizationUnsupportedFeatureException("floating.interest.rate", "floating interest rate"); } - if (this.fromApiJsonHelper.parameterExists("interestRatePerPeriod", element)) { - baseDataValidator.reset().parameter("interestRatePerPeriod").failWithCode( + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.interestRatePerPeriodParameterName, element)) { + baseDataValidator.reset().parameter(LoanApiConstants.interestRatePerPeriodParameterName).failWithCode( "not.supported.loanproduct.linked.to.floating.rate", "interestRatePerPeriod param is not supported, selected Loan Product is linked with floating interest rate."); } @@ -720,19 +729,19 @@ public final class LoanApplicationCommandFromApiJsonHelper { interestType = existingLoanApplication.getLoanProductRelatedDetail().getInterestMethod().getValue(); } if (interestType != null && interestType.equals(InterestMethod.FLAT.getValue())) { - baseDataValidator.reset().parameter(interestTypeParameterName).failWithCode("should.be.0.for.selected.loan.product", + baseDataValidator.reset().parameter(LoanApiConstants.interestTypeParameterName).failWithCode( + "should.be.0.for.selected.loan.product", "interestType should be DECLINING_BALANCE for selected Loan Product as it is linked to floating rates."); } - final String interestRateDifferentialParameterName = LoanApiConstants.interestRateDifferential; BigDecimal interestRateDifferential = existingLoanApplication.getInterestRateDifferential(); - if (this.fromApiJsonHelper.parameterExists(interestRateDifferentialParameterName, element)) { - interestRateDifferential = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(interestRateDifferentialParameterName, - element); + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.interestRateDifferentialParameterName, element)) { + interestRateDifferential = this.fromApiJsonHelper + .extractBigDecimalWithLocaleNamed(LoanApiConstants.interestRateDifferentialParameterName, element); atLeastOneParameterPassedForUpdate = true; } - baseDataValidator.reset().parameter(interestRateDifferentialParameterName).value(interestRateDifferential).notNull() - .zeroOrPositiveAmount().inMinAndMaxAmountRange(loanProduct.getFloatingRates().getMinDifferentialLendingRate(), + baseDataValidator.reset().parameter(LoanApiConstants.interestRateDifferentialParameterName).value(interestRateDifferential) + .notNull().zeroOrPositiveAmount().inMinAndMaxAmountRange(loanProduct.getFloatingRates().getMinDifferentialLendingRate(), loanProduct.getFloatingRates().getMaxDifferentialLendingRate()); } else { @@ -748,70 +757,76 @@ public final class LoanApplicationCommandFromApiJsonHelper { "interestRateDifferential param is not supported, selected Loan Product is not linked with floating interest rate."); } - final String interestRatePerPeriodParameterName = "interestRatePerPeriod"; BigDecimal interestRatePerPeriod = existingLoanApplication.getLoanProductRelatedDetail().getNominalInterestRatePerPeriod(); - if (this.fromApiJsonHelper.parameterExists(interestRatePerPeriodParameterName, element)) { - this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(interestRatePerPeriodParameterName, element); + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.interestRatePerPeriodParameterName, element)) { + this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(LoanApiConstants.interestRatePerPeriodParameterName, element); atLeastOneParameterPassedForUpdate = true; } - baseDataValidator.reset().parameter(interestRatePerPeriodParameterName).value(interestRatePerPeriod).notNull() + baseDataValidator.reset().parameter(LoanApiConstants.interestRatePerPeriodParameterName).value(interestRatePerPeriod).notNull() .zeroOrPositiveAmount(); } Integer interestCalculationPeriodType = loanProduct.getLoanProductRelatedDetail().getInterestCalculationPeriodMethod().getValue(); - final String interestCalculationPeriodTypeParameterName = "interestCalculationPeriodType"; - if (this.fromApiJsonHelper.parameterExists(interestCalculationPeriodTypeParameterName, element)) { + + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.interestCalculationPeriodTypeParameterName, element)) { atLeastOneParameterPassedForUpdate = true; - interestCalculationPeriodType = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(interestCalculationPeriodTypeParameterName, + interestCalculationPeriodType = this.fromApiJsonHelper + .extractIntegerWithLocaleNamed(LoanApiConstants.interestCalculationPeriodTypeParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.interestCalculationPeriodTypeParameterName) + .value(interestCalculationPeriodType).notNull().inMinMaxRange(0, 1); + } + + Integer amortizationType = null; + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.amortizationTypeParameterName, element)) { + atLeastOneParameterPassedForUpdate = true; + amortizationType = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(LoanApiConstants.amortizationTypeParameterName, element); - baseDataValidator.reset().parameter(interestCalculationPeriodTypeParameterName).value(interestCalculationPeriodType).notNull() + baseDataValidator.reset().parameter(LoanApiConstants.amortizationTypeParameterName).value(amortizationType).notNull() .inMinMaxRange(0, 1); } - final String amortizationTypeParameterName = "amortizationType"; - Integer amortizationType = null; - if (this.fromApiJsonHelper.parameterExists(amortizationTypeParameterName, element)) { - atLeastOneParameterPassedForUpdate = true; - amortizationType = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(amortizationTypeParameterName, element); - baseDataValidator.reset().parameter(amortizationTypeParameterName).value(amortizationType).notNull().inMinMaxRange(0, 1); - } - - if (!Integer.valueOf(AmortizationMethod.EQUAL_PRINCIPAL.getValue()).equals(amortizationType) - && fixedPrincipalPercentagePerInstallment != null) { + if (!AmortizationMethod.EQUAL_PRINCIPAL.getValue().equals(amortizationType) && fixedPrincipalPercentagePerInstallment != null) { baseDataValidator.reset().parameter(LoanApiConstants.fixedPrincipalPercentagePerInstallmentParamName).failWithCode( "not.supported.principal.fixing.not.allowed.with.equal.installments", "Principal fixing cannot be done with equal installment amortization"); } - final String expectedDisbursementDateParameterName = "expectedDisbursementDate"; LocalDate expectedDisbursementDate = null; - if (this.fromApiJsonHelper.parameterExists(expectedDisbursementDateParameterName, element)) { + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.expectedDisbursementDateParameterName, element)) { atLeastOneParameterPassedForUpdate = true; - final String expectedDisbursementDateStr = this.fromApiJsonHelper.extractStringNamed(expectedDisbursementDateParameterName, - element); - baseDataValidator.reset().parameter(expectedDisbursementDateParameterName).value(expectedDisbursementDateStr).notBlank(); + final String expectedDisbursementDateStr = this.fromApiJsonHelper + .extractStringNamed(LoanApiConstants.expectedDisbursementDateParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.expectedDisbursementDateParameterName).value(expectedDisbursementDateStr) + .notBlank(); - expectedDisbursementDate = this.fromApiJsonHelper.extractLocalDateNamed(expectedDisbursementDateParameterName, element); - baseDataValidator.reset().parameter(expectedDisbursementDateParameterName).value(expectedDisbursementDate).notNull(); + expectedDisbursementDate = this.fromApiJsonHelper.extractLocalDateNamed(LoanApiConstants.expectedDisbursementDateParameterName, + element); + baseDataValidator.reset().parameter(LoanApiConstants.expectedDisbursementDateParameterName).value(expectedDisbursementDate) + .notNull(); } // grace validation - if (this.fromApiJsonHelper.parameterExists("graceOnPrincipalPayment", element)) { - final Integer graceOnPrincipalPayment = this.fromApiJsonHelper.extractIntegerWithLocaleNamed("graceOnPrincipalPayment", - element); - baseDataValidator.reset().parameter("graceOnPrincipalPayment").value(graceOnPrincipalPayment).zeroOrPositiveAmount(); + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.graceOnPrincipalPaymentParameterName, element)) { + final Integer graceOnPrincipalPayment = this.fromApiJsonHelper + .extractIntegerWithLocaleNamed(LoanApiConstants.graceOnPrincipalPaymentParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.graceOnPrincipalPaymentParameterName).value(graceOnPrincipalPayment) + .zeroOrPositiveAmount(); } - if (this.fromApiJsonHelper.parameterExists("graceOnInterestPayment", element)) { - final Integer graceOnInterestPayment = this.fromApiJsonHelper.extractIntegerWithLocaleNamed("graceOnInterestPayment", element); - baseDataValidator.reset().parameter("graceOnInterestPayment").value(graceOnInterestPayment).zeroOrPositiveAmount(); + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.graceOnInterestPaymentParameterName, element)) { + final Integer graceOnInterestPayment = this.fromApiJsonHelper + .extractIntegerWithLocaleNamed(LoanApiConstants.graceOnInterestPaymentParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.graceOnInterestPaymentParameterName).value(graceOnInterestPayment) + .zeroOrPositiveAmount(); } - if (this.fromApiJsonHelper.parameterExists("graceOnInterestCharged", element)) { - final Integer graceOnInterestCharged = this.fromApiJsonHelper.extractIntegerWithLocaleNamed("graceOnInterestCharged", element); - baseDataValidator.reset().parameter("graceOnInterestCharged").value(graceOnInterestCharged).zeroOrPositiveAmount(); + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.graceOnInterestChargedParameterName, element)) { + final Integer graceOnInterestCharged = this.fromApiJsonHelper + .extractIntegerWithLocaleNamed(LoanApiConstants.graceOnInterestChargedParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.graceOnInterestChargedParameterName).value(graceOnInterestCharged) + .zeroOrPositiveAmount(); } if (this.fromApiJsonHelper.parameterExists(LoanProductConstants.GRACE_ON_ARREARS_AGEING_PARAMETER_NAME, element)) { @@ -821,62 +836,65 @@ public final class LoanApplicationCommandFromApiJsonHelper { .zeroOrPositiveAmount(); } - final String interestChargedFromDateParameterName = "interestChargedFromDate"; - if (this.fromApiJsonHelper.parameterExists(interestChargedFromDateParameterName, element)) { + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.interestChargedFromDateParameterName, element)) { atLeastOneParameterPassedForUpdate = true; - final LocalDate interestChargedFromDate = this.fromApiJsonHelper.extractLocalDateNamed(interestChargedFromDateParameterName, - element); - baseDataValidator.reset().parameter(interestChargedFromDateParameterName).value(interestChargedFromDate).ignoreIfNull(); + final LocalDate interestChargedFromDate = this.fromApiJsonHelper + .extractLocalDateNamed(LoanApiConstants.interestChargedFromDateParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.interestChargedFromDateParameterName).value(interestChargedFromDate) + .ignoreIfNull(); } - final String repaymentsStartingFromDateParameterName = "repaymentsStartingFromDate"; - if (this.fromApiJsonHelper.parameterExists(repaymentsStartingFromDateParameterName, element)) { + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.repaymentsStartingFromDateParameterName, element)) { atLeastOneParameterPassedForUpdate = true; final LocalDate repaymentsStartingFromDate = this.fromApiJsonHelper - .extractLocalDateNamed(repaymentsStartingFromDateParameterName, element); - baseDataValidator.reset().parameter(repaymentsStartingFromDateParameterName).value(repaymentsStartingFromDate).ignoreIfNull(); + .extractLocalDateNamed(LoanApiConstants.repaymentsStartingFromDateParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.repaymentsStartingFromDateParameterName).value(repaymentsStartingFromDate) + .ignoreIfNull(); if (!existingLoanApplication.getLoanTermVariations().isEmpty()) { baseDataValidator.reset().failWithCodeNoParameterAddedToErrorCode("cannot.modify.application.due.to.variable.installments"); } } - final String submittedOnDateParameterName = "submittedOnDate"; - if (this.fromApiJsonHelper.parameterExists(submittedOnDateParameterName, element)) { + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.submittedOnDateParameterName, element)) { atLeastOneParameterPassedForUpdate = true; - final LocalDate submittedOnDate = this.fromApiJsonHelper.extractLocalDateNamed(submittedOnDateParameterName, element); - baseDataValidator.reset().parameter(submittedOnDateParameterName).value(submittedOnDate).notNull(); + final LocalDate submittedOnDate = this.fromApiJsonHelper.extractLocalDateNamed(LoanApiConstants.submittedOnDateParameterName, + element); + baseDataValidator.reset().parameter(LoanApiConstants.submittedOnDateParameterName).value(submittedOnDate).notNull(); } - final String submittedOnNoteParameterName = "submittedOnNote"; - if (this.fromApiJsonHelper.parameterExists(submittedOnNoteParameterName, element)) { + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.submittedOnNoteParameterName, element)) { atLeastOneParameterPassedForUpdate = true; - final String submittedOnNote = this.fromApiJsonHelper.extractStringNamed(submittedOnNoteParameterName, element); - baseDataValidator.reset().parameter(submittedOnNoteParameterName).value(submittedOnNote).ignoreIfNull() + final String submittedOnNote = this.fromApiJsonHelper.extractStringNamed(LoanApiConstants.submittedOnNoteParameterName, + element); + baseDataValidator.reset().parameter(LoanApiConstants.submittedOnNoteParameterName).value(submittedOnNote).ignoreIfNull() .notExceedingLengthOf(500); } - final String linkAccountIdParameterName = "linkAccountId"; - if (this.fromApiJsonHelper.parameterExists(submittedOnNoteParameterName, element)) { + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.submittedOnNoteParameterName, element)) { atLeastOneParameterPassedForUpdate = true; - final Long linkAccountId = this.fromApiJsonHelper.extractLongNamed(linkAccountIdParameterName, element); - baseDataValidator.reset().parameter(linkAccountIdParameterName).value(linkAccountId).ignoreIfNull().longGreaterThanZero(); + final Long linkAccountId = this.fromApiJsonHelper.extractLongNamed(LoanApiConstants.linkAccountIdParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.linkAccountIdParameterName).value(linkAccountId).ignoreIfNull() + .longGreaterThanZero(); } // charges - final String chargesParameterName = "charges"; - if (element.isJsonObject() && this.fromApiJsonHelper.parameterExists(chargesParameterName, element)) { + if (element.isJsonObject() && this.fromApiJsonHelper.parameterExists(LoanApiConstants.chargesParameterName, element)) { atLeastOneParameterPassedForUpdate = true; final JsonObject topLevelJsonElement = element.getAsJsonObject(); final String dateFormat = this.fromApiJsonHelper.extractDateFormatParameter(topLevelJsonElement); final Locale locale = this.fromApiJsonHelper.extractLocaleParameter(topLevelJsonElement); - if (topLevelJsonElement.get(chargesParameterName).isJsonArray()) { - final Type arrayObjectParameterTypeOfMap = new TypeToken>() {}.getType(); - final Set supportedParameters = new HashSet<>( - Arrays.asList("id", "chargeId", "amount", "chargeTimeType", "chargeCalculationType", "dueDate")); + if (topLevelJsonElement.get(LoanApiConstants.chargesParameterName).isJsonArray()) { + final Type arrayObjectParameterTypeOfMap = new TypeToken>() { - final JsonArray array = topLevelJsonElement.get("charges").getAsJsonArray(); + }.getType(); + final Set supportedParameters = new HashSet<>( + Arrays.asList(LoanApiConstants.idParameterName, LoanApiConstants.chargeIdParameterName, + LoanApiConstants.amountParameterName, LoanApiConstants.chargeTimeTypeParameterName, + LoanApiConstants.chargeCalculationTypeParameterName, LoanApiConstants.dueDateParamName)); + + final JsonArray array = topLevelJsonElement.get(LoanApiConstants.chargesParameterName).getAsJsonArray(); for (int i = 1; i <= array.size(); i++) { final JsonObject loanChargeElement = array.get(i - 1).getAsJsonObject(); @@ -884,41 +902,47 @@ public final class LoanApplicationCommandFromApiJsonHelper { this.fromApiJsonHelper.checkForUnsupportedParameters(arrayObjectParameterTypeOfMap, arrayObjectJson, supportedParameters); - final Long chargeId = this.fromApiJsonHelper.extractLongNamed("chargeId", loanChargeElement); - baseDataValidator.reset().parameter("charges").parameterAtIndexArray("chargeId", i).value(chargeId).notNull() + final Long chargeId = this.fromApiJsonHelper.extractLongNamed(LoanApiConstants.chargeIdParameterName, + loanChargeElement); + baseDataValidator.reset().parameter(LoanApiConstants.chargesParameterName) + .parameterAtIndexArray(LoanApiConstants.chargeIdParameterName, i).value(chargeId).notNull() .integerGreaterThanZero(); - final BigDecimal amount = this.fromApiJsonHelper.extractBigDecimalNamed("amount", loanChargeElement, locale); - baseDataValidator.reset().parameter("charges").parameterAtIndexArray("amount", i).value(amount).notNull() - .positiveAmount(); + final BigDecimal amount = this.fromApiJsonHelper.extractBigDecimalNamed(LoanApiConstants.amountParameterName, + loanChargeElement, locale); + baseDataValidator.reset().parameter(LoanApiConstants.chargesParameterName) + .parameterAtIndexArray(LoanApiConstants.amountParameterName, i).value(amount).notNull().positiveAmount(); - this.fromApiJsonHelper.extractLocalDateNamed("dueDate", loanChargeElement, dateFormat, locale); + this.fromApiJsonHelper.extractLocalDateNamed(LoanApiConstants.dueDateParamName, loanChargeElement, dateFormat, locale); } } } - final String loanTypeParameterName = "loanType"; - final String loanTypeStr = this.fromApiJsonHelper.extractStringNamed(loanTypeParameterName, element); - baseDataValidator.reset().parameter(loanTypeParameterName).value(loanTypeStr).notNull(); + final String loanTypeStr = this.fromApiJsonHelper.extractStringNamed(LoanApiConstants.loanTypeParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.loanTypeParameterName).value(loanTypeStr).notNull(); if (!StringUtils.isBlank(loanTypeStr)) { final AccountType loanType = AccountType.fromName(loanTypeStr); if (loanType.isInvalid()) { - baseDataValidator.reset().parameter(loanTypeParameterName).value(loanType.getValue()).isOneOfEnumValues(AccountType.class); + baseDataValidator.reset().parameter(LoanApiConstants.loanTypeParameterName).value(loanType.getValue()) + .isOneOfEnumValues(AccountType.class); } if (!loanType.isInvalid() && loanType.isIndividualAccount()) { // collateral - final String collateralParameterName = "collateral"; + final String collateralParameterName = LoanApiConstants.collateralParameterName; if (element.isJsonObject() && this.fromApiJsonHelper.parameterExists(collateralParameterName, element)) { final JsonObject topLevelJsonElement = element.getAsJsonObject(); final Locale locale = this.fromApiJsonHelper.extractLocaleParameter(topLevelJsonElement); - if (topLevelJsonElement.get("collateral").isJsonArray()) { + if (topLevelJsonElement.get(LoanApiConstants.collateralParameterName).isJsonArray()) { - final Type collateralParameterTypeOfMap = new TypeToken>() {}.getType(); - final Set supportedParameters = new HashSet<>(Arrays.asList("id", "clientCollateralId", "quantity")); - final JsonArray array = topLevelJsonElement.get("collateral").getAsJsonArray(); + final Type collateralParameterTypeOfMap = new TypeToken>() { + + }.getType(); + final Set supportedParameters = new HashSet<>(Arrays.asList(LoanApiConstants.idParameterName, + LoanApiConstants.clientCollateralIdParameterName, LoanApiConstants.quantityParameterName)); + final JsonArray array = topLevelJsonElement.get(LoanApiConstants.collateralParameterName).getAsJsonArray(); if (array.size() > 0) { BigDecimal totalAmount = BigDecimal.ZERO; for (int i = 1; i <= array.size(); i++) { @@ -928,18 +952,22 @@ public final class LoanApplicationCommandFromApiJsonHelper { this.fromApiJsonHelper.checkForUnsupportedParameters(collateralParameterTypeOfMap, collateralJson, supportedParameters); - final Long id = this.fromApiJsonHelper.extractLongNamed("id", collateralItemElement); - baseDataValidator.reset().parameter("collateral").parameterAtIndexArray("id", i).value(id).ignoreIfNull(); - - final Long clientCollateralId = this.fromApiJsonHelper.extractLongNamed("clientCollateralId", + final Long id = this.fromApiJsonHelper.extractLongNamed(LoanApiConstants.idParameterName, collateralItemElement); - baseDataValidator.reset().parameter("collateral").parameterAtIndexArray("clientCollateralId", i) + baseDataValidator.reset().parameter(LoanApiConstants.collateralParameterName) + .parameterAtIndexArray(LoanApiConstants.idParameterName, i).value(id).ignoreIfNull(); + + final Long clientCollateralId = this.fromApiJsonHelper + .extractLongNamed(LoanApiConstants.clientCollateralIdParameterName, collateralItemElement); + baseDataValidator.reset().parameter(LoanApiConstants.collateralParameterName) + .parameterAtIndexArray(LoanApiConstants.clientCollateralIdParameterName, i) .value(clientCollateralId).notNull().integerGreaterThanZero(); - final BigDecimal quantity = this.fromApiJsonHelper.extractBigDecimalNamed("quantity", collateralItemElement, - locale); - baseDataValidator.reset().parameter("collateral").parameterAtIndexArray("quantity", i).value(quantity) - .notNull().positiveAmount(); + final BigDecimal quantity = this.fromApiJsonHelper + .extractBigDecimalNamed(LoanApiConstants.quantityParameterName, collateralItemElement, locale); + baseDataValidator.reset().parameter(LoanApiConstants.collateralParameterName) + .parameterAtIndexArray(LoanApiConstants.quantityParameterName, i).value(quantity).notNull() + .positiveAmount(); if (clientCollateralId != null || quantity != null) { BigDecimal baseAmount = this.clientCollateralManagementRepositoryWrapper @@ -950,10 +978,8 @@ public final class LoanApplicationCommandFromApiJsonHelper { totalAmount = totalAmount.add(total); } } - if (principal != null) { - if (principal.compareTo(totalAmount) > 0) { - throw new InvalidAmountOfCollaterals(totalAmount); - } + if (principal != null && principal.compareTo(totalAmount) > 0) { + throw new InvalidAmountOfCollaterals(totalAmount); } } } else { @@ -965,21 +991,22 @@ public final class LoanApplicationCommandFromApiJsonHelper { boolean meetingIdRequired = false; // validate syncDisbursement - final String syncDisbursementParameterName = "syncDisbursementWithMeeting"; - if (this.fromApiJsonHelper.parameterExists(syncDisbursementParameterName, element)) { - final Boolean syncDisbursement = this.fromApiJsonHelper.extractBooleanNamed(syncDisbursementParameterName, element); + if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.syncDisbursementWithMeetingParameterName, element)) { + final Boolean syncDisbursement = this.fromApiJsonHelper + .extractBooleanNamed(LoanApiConstants.syncDisbursementWithMeetingParameterName, element); if (syncDisbursement == null) { - baseDataValidator.reset().parameter(syncDisbursementParameterName).value(syncDisbursement).trueOrFalseRequired(false); + baseDataValidator.reset().parameter(LoanApiConstants.syncDisbursementWithMeetingParameterName).value(syncDisbursement) + .trueOrFalseRequired(false); } else if (syncDisbursement.booleanValue()) { meetingIdRequired = true; } } - final String calendarIdParameterName = "calendarId"; // if disbursement is synced then must have a meeting (calendar) - if (meetingIdRequired || this.fromApiJsonHelper.parameterExists(calendarIdParameterName, element)) { - final Long calendarId = this.fromApiJsonHelper.extractLongNamed(calendarIdParameterName, element); - baseDataValidator.reset().parameter(calendarIdParameterName).value(calendarId).notNull().integerGreaterThanZero(); + if (meetingIdRequired || this.fromApiJsonHelper.parameterExists(LoanApiConstants.calendarIdParameterName, element)) { + final Long calendarId = this.fromApiJsonHelper.extractLongNamed(LoanApiConstants.calendarIdParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.calendarIdParameterName).value(calendarId).notNull() + .integerGreaterThanZero(); } if (!atLeastOneParameterPassedForUpdate) { @@ -1008,15 +1035,13 @@ public final class LoanApplicationCommandFromApiJsonHelper { .ignoreIfNull().positiveAmount(); } - if (loanProduct.canUseForTopup()) { - if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.isTopup, element)) { - final Boolean isTopup = this.fromApiJsonHelper.extractBooleanNamed(LoanApiConstants.isTopup, element); - baseDataValidator.reset().parameter(LoanApiConstants.isTopup).value(isTopup).ignoreIfNull().validateForBooleanValue(); + if (loanProduct.canUseForTopup() && this.fromApiJsonHelper.parameterExists(LoanApiConstants.isTopup, element)) { + final Boolean isTopup = this.fromApiJsonHelper.extractBooleanNamed(LoanApiConstants.isTopup, element); + baseDataValidator.reset().parameter(LoanApiConstants.isTopup).value(isTopup).ignoreIfNull().validateForBooleanValue(); - if (isTopup != null && isTopup) { - final Long loanId = this.fromApiJsonHelper.extractLongNamed(LoanApiConstants.loanIdToClose, element); - baseDataValidator.reset().parameter(LoanApiConstants.loanIdToClose).value(loanId).notNull().longGreaterThanZero(); - } + if (isTopup != null && isTopup) { + final Long loanId = this.fromApiJsonHelper.extractLongNamed(LoanApiConstants.loanIdToClose, element); + baseDataValidator.reset().parameter(LoanApiConstants.loanIdToClose).value(loanId).notNull().longGreaterThanZero(); } } @@ -1034,12 +1059,14 @@ public final class LoanApplicationCommandFromApiJsonHelper { throw new InvalidJsonException(); } - final Set undoSupportedParameters = new HashSet<>(Arrays.asList("note")); - final Type typeOfMap = new TypeToken>() {}.getType(); + final Set undoSupportedParameters = new HashSet<>(List.of(LoanApiConstants.noteParamName)); + final Type typeOfMap = new TypeToken>() { + + }.getType(); this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, undoSupportedParameters); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("loanapplication.undo"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(LOANAPPLICATION_UNDO); final JsonElement element = this.fromApiJsonHelper.parse(json); final String note = "note"; @@ -1060,7 +1087,7 @@ public final class LoanApplicationCommandFromApiJsonHelper { final BigDecimal minPrincipal = loanProduct.getMinPrincipalAmount().getAmount(); final BigDecimal maxPrincipal = loanProduct.getMaxPrincipalAmount().getAmount(); - final String principalParameterName = "principal"; + final String principalParameterName = LoanApiConstants.principalParameterName; if (this.fromApiJsonHelper.parameterExists(principalParameterName, element)) { final BigDecimal principal = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(principalParameterName, element); @@ -1146,15 +1173,15 @@ public final class LoanApplicationCommandFromApiJsonHelper { if (variationArray != null) { for (int i = 0; i < variationArray.size(); i++) { final JsonObject jsonObject1 = variationArray.get(i).getAsJsonObject(); - if (jsonObject1.has(LoanApiConstants.disbursementDateParameterName)) { - LocalDate date1 = this.fromApiJsonHelper.extractLocalDateNamed(LoanApiConstants.disbursementDateParameterName, + if (jsonObject1.has(LoanApiConstants.expectedDisbursementDateParameterName)) { + LocalDate date1 = this.fromApiJsonHelper.extractLocalDateNamed(LoanApiConstants.expectedDisbursementDateParameterName, jsonObject1, dateFormat, locale); for (int j = i + 1; j < variationArray.size(); j++) { final JsonObject jsonObject2 = variationArray.get(j).getAsJsonObject(); - if (jsonObject2.has(LoanApiConstants.disbursementDateParameterName)) { - LocalDate date2 = this.fromApiJsonHelper.extractLocalDateNamed(LoanApiConstants.disbursementDateParameterName, - jsonObject2, dateFormat, locale); + if (jsonObject2.has(LoanApiConstants.expectedDisbursementDateParameterName)) { + LocalDate date2 = this.fromApiJsonHelper.extractLocalDateNamed( + LoanApiConstants.expectedDisbursementDateParameterName, jsonObject2, dateFormat, locale); if (date1.isAfter(date2)) { baseDataValidator.reset().parameter(LoanApiConstants.disbursementDataParameterName) .failWithCode(LoanApiConstants.DISBURSEMENT_DATES_NOT_IN_ORDER); @@ -1194,12 +1221,12 @@ public final class LoanApplicationCommandFromApiJsonHelper { do { final JsonObject jsonObject = variationArray.get(i).getAsJsonObject(); LocalDate expectedDisbursementDate = this.fromApiJsonHelper - .extractLocalDateNamed(LoanApiConstants.disbursementDateParameterName, jsonObject, dateFormat, locale); + .extractLocalDateNamed(LoanApiConstants.expectedDisbursementDateParameterName, jsonObject, dateFormat, locale); baseDataValidator.reset().parameter(LoanApiConstants.disbursementDataParameterName) - .parameterAtIndexArray(LoanApiConstants.disbursementDateParameterName, i).value(expectedDisbursementDate) - .notNull(); + .parameterAtIndexArray(LoanApiConstants.expectedDisbursementDateParameterName, i) + .value(expectedDisbursementDate).notNull(); if (i == 0 && expectedDisbursementDate != null && !expectedDisbursement.equals(expectedDisbursementDate)) { - baseDataValidator.reset().parameter(LoanApiConstants.disbursementDateParameterName) + baseDataValidator.reset().parameter(LoanApiConstants.expectedDisbursementDateParameterName) .failWithCode(LoanApiConstants.DISBURSEMENT_DATE_START_WITH_ERROR); } else if (i > 0 && expectedDisbursementDate != null && expectedDisbursementDate.isBefore(expectedDisbursement)) { baseDataValidator.reset().parameter(LoanApiConstants.disbursementDataParameterName) @@ -1207,7 +1234,7 @@ public final class LoanApplicationCommandFromApiJsonHelper { } if (expectedDisbursementDate != null && expectedDisbursementDates.contains(expectedDisbursementDate)) { - baseDataValidator.reset().parameter(LoanApiConstants.disbursementDateParameterName) + baseDataValidator.reset().parameter(LoanApiConstants.expectedDisbursementDateParameterName) .failWithCode(LoanApiConstants.DISBURSEMENT_DATE_UNIQUE_ERROR); } expectedDisbursementDates.add(expectedDisbursementDate); @@ -1226,9 +1253,9 @@ public final class LoanApplicationCommandFromApiJsonHelper { baseDataValidator.reset().parameter(LoanApiConstants.disbursementPrincipalParameterName) .failWithCode(LoanApiConstants.APPROVED_AMOUNT_IS_LESS_THAN_SUM_OF_TRANCHES); } - final String interestTypeParameterName = "interestType"; - final Integer interestType = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(interestTypeParameterName, element); - baseDataValidator.reset().parameter(interestTypeParameterName).value(interestType).ignoreIfNull() + final Integer interestType = this.fromApiJsonHelper + .extractIntegerSansLocaleNamed(LoanApiConstants.interestTypeParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.interestTypeParameterName).value(interestType).ignoreIfNull() .integerSameAsNumber(InterestMethod.DECLINING_BALANCE.getValue()); } @@ -1276,19 +1303,19 @@ public final class LoanApplicationCommandFromApiJsonHelper { public void validateLoanForInterestRecalculation(final Loan loan) { final List dataValidationErrors = new ArrayList<>(); - validateLoanCharges(loan.charges(), dataValidationErrors); + validateLoanCharges(loan.getActiveCharges(), dataValidationErrors); if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException(dataValidationErrors); } } public void validateLoanForCollaterals(final Loan loan, final BigDecimal total) { - String errorCode = ""; + String errorCode; final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("loan"); if (loan.getProposedPrincipal().compareTo(total) >= 0) { errorCode = LoanApiConstants.LOAN_COLLATERAL_TOTAL_VALUE_SHOULD_BE_SUFFICIENT; - baseDataValidator.reset().parameter("collaterals").failWithCode(errorCode); + baseDataValidator.reset().parameter(LoanApiConstants.collateralsParameterName).failWithCode(errorCode); } if (!dataValidationErrors.isEmpty()) { @@ -1309,7 +1336,7 @@ public final class LoanApplicationCommandFromApiJsonHelper { .extractBooleanNamed(LoanProductConstants.ALLOW_PARTIAL_PERIOD_INTEREST_CALCUALTION_PARAM_NAME, element); baseDataValidator.reset().parameter(LoanProductConstants.ALLOW_PARTIAL_PERIOD_INTEREST_CALCUALTION_PARAM_NAME) .value(considerPartialInterestEnabled).notNull().isOneOfTheseValues(true, false); - boolean considerPartialPeriods = considerPartialInterestEnabled == null ? false : considerPartialInterestEnabled; + boolean considerPartialPeriods = considerPartialInterestEnabled != null && considerPartialInterestEnabled; if (interestCalculationPeriodMethod.isDaily()) { if (considerPartialPeriods) { baseDataValidator.reset().parameter(LoanProductConstants.ALLOW_PARTIAL_PERIOD_INTEREST_CALCUALTION_PARAM_NAME) diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanApplicationTransitionApiJsonValidator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanApplicationTransitionApiJsonValidator.java index 5c0850e6b..69125cb5a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanApplicationTransitionApiJsonValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanApplicationTransitionApiJsonValidator.java @@ -66,7 +66,7 @@ public final class LoanApplicationTransitionApiJsonValidator { Arrays.asList(LoanApiConstants.loanIdTobeApproved, LoanApiConstants.approvedLoanAmountParameterName, LoanApiConstants.approvedOnDateParameterName, LoanApiConstants.disbursementNetDisbursalAmountParameterName, LoanApiConstants.noteParameterName, LoanApiConstants.localeParameterName, LoanApiConstants.dateFormatParameterName, - LoanApiConstants.disbursementDataParameterName, LoanApiConstants.disbursementDateParameterName)); + LoanApiConstants.disbursementDataParameterName, LoanApiConstants.expectedDisbursementDateParameterName)); final Type typeOfMap = new TypeToken>() {}.getType(); this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, disbursementParameters); @@ -91,8 +91,9 @@ public final class LoanApplicationTransitionApiJsonValidator { baseDataValidator.reset().parameter(LoanApiConstants.approvedOnDateParameterName).value(approvedOnDate).notNull(); final LocalDate expectedDisbursementDate = this.fromApiJsonHelper - .extractLocalDateNamed(LoanApiConstants.disbursementDateParameterName, element); - baseDataValidator.reset().parameter(LoanApiConstants.disbursementDateParameterName).value(expectedDisbursementDate).ignoreIfNull(); + .extractLocalDateNamed(LoanApiConstants.expectedDisbursementDateParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.expectedDisbursementDateParameterName).value(expectedDisbursementDate) + .ignoreIfNull(); final String note = this.fromApiJsonHelper.extractStringNamed(LoanApiConstants.noteParameterName, element); baseDataValidator.reset().parameter(LoanApiConstants.noteParameterName).value(note).notExceedingLengthOf(1000); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanEventApiJsonValidator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanEventApiJsonValidator.java index 1da8a069f..54348344a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanEventApiJsonValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanEventApiJsonValidator.java @@ -545,10 +545,10 @@ public final class LoanEventApiJsonValidator { throw new InvalidJsonException(); } - final Set disbursementParameters = new HashSet<>( - Arrays.asList("locale", "dateFormat", LoanApiConstants.disbursementDataParameterName, - LoanApiConstants.approvedLoanAmountParameterName, LoanApiConstants.updatedDisbursementDateParameterName, - LoanApiConstants.updatedDisbursementPrincipalParameterName, LoanApiConstants.disbursementDateParameterName)); + final Set disbursementParameters = new HashSet<>(Arrays.asList("locale", "dateFormat", + LoanApiConstants.disbursementDataParameterName, LoanApiConstants.approvedLoanAmountParameterName, + LoanApiConstants.updatedDisbursementDateParameterName, LoanApiConstants.updatedDisbursementPrincipalParameterName, + LoanApiConstants.expectedDisbursementDateParameterName)); final Type typeOfMap = new TypeToken>() {}.getType(); this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, disbursementParameters); @@ -558,8 +558,8 @@ public final class LoanEventApiJsonValidator { final JsonElement element = this.fromApiJsonHelper.parse(json); final LocalDate actualDisbursementDate = this.fromApiJsonHelper - .extractLocalDateNamed(LoanApiConstants.disbursementDateParameterName, element); - baseDataValidator.reset().parameter(LoanApiConstants.disbursementDateParameterName).value(actualDisbursementDate).notNull(); + .extractLocalDateNamed(LoanApiConstants.expectedDisbursementDateParameterName, element); + baseDataValidator.reset().parameter(LoanApiConstants.expectedDisbursementDateParameterName).value(actualDisbursementDate).notNull(); final Locale locale = this.fromApiJsonHelper.extractLocaleParameter(element.getAsJsonObject()); final BigDecimal principal = this.fromApiJsonHelper @@ -569,7 +569,7 @@ public final class LoanEventApiJsonValidator { final BigDecimal approvedPrincipal = this.fromApiJsonHelper.extractBigDecimalNamed(LoanApiConstants.approvedLoanAmountParameterName, element, locale); if (loanDisbursementDetails.actualDisbursementDate() != null) { - baseDataValidator.reset().parameter(LoanApiConstants.disbursementDateParameterName) + baseDataValidator.reset().parameter(LoanApiConstants.expectedDisbursementDateParameterName) .failWithCode(LoanApiConstants.ALREADY_DISBURSED); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanUpdateCommandFromApiJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanUpdateCommandFromApiJsonDeserializer.java index debecd9e3..5be2cd6be 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanUpdateCommandFromApiJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanUpdateCommandFromApiJsonDeserializer.java @@ -37,10 +37,13 @@ import org.springframework.stereotype.Component; @Component public final class LoanUpdateCommandFromApiJsonDeserializer extends AbstractFromApiJsonDeserializer { + public static final String UNASSIGNED_DATE = "unassignedDate"; + public static final String LOCALE = "locale"; + public static final String DATE_FORMAT = "dateFormat"; /** * The parameters supported for this command. */ - final Set supportedParameters = new HashSet<>(Arrays.asList("unassignedDate", "locale", "dateFormat")); + private static final Set SUPPORTED_PARAMETERS = new HashSet<>(Arrays.asList(UNASSIGNED_DATE, LOCALE, DATE_FORMAT)); private final FromJsonHelper fromApiJsonHelper; @@ -57,10 +60,10 @@ public final class LoanUpdateCommandFromApiJsonDeserializer extends AbstractFrom } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final JsonElement element = this.fromApiJsonHelper.parse(json); - final LocalDate unassignedDate = this.fromApiJsonHelper.extractLocalDateNamed("unassignedDate", element); + final LocalDate unassignedDate = this.fromApiJsonHelper.extractLocalDateNamed(UNASSIGNED_DATE, element); return new LoanUpdateCommand(unassignedDate); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/VariableLoanScheduleFromApiJsonValidator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/VariableLoanScheduleFromApiJsonValidator.java index 7dcafd81e..1143998c8 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/VariableLoanScheduleFromApiJsonValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/VariableLoanScheduleFromApiJsonValidator.java @@ -47,15 +47,18 @@ import org.springframework.stereotype.Component; @Component public class VariableLoanScheduleFromApiJsonValidator { - final Set variableSchedulesupportedParameters = new HashSet<>(Arrays.asList(LoanApiConstants.exceptionParamName, - LoanApiConstants.localeParameterName, LoanApiConstants.dateFormatParameterName)); - final Set variableSchedulesupportedArrayParameters = new HashSet<>(Arrays.asList(LoanApiConstants.modifiedinstallmentsParamName, - LoanApiConstants.newinstallmentsParamName, LoanApiConstants.deletedinstallmentsParamName)); - final Set variableScheduleModifiedParameters = new HashSet<>(Arrays.asList(LoanApiConstants.dueDateParamName, + private static final Set VARIABLE_SCHEDULESUPPORTED_PARAMETERS = new HashSet<>(Arrays + .asList(LoanApiConstants.exceptionParamName, LoanApiConstants.localeParameterName, LoanApiConstants.dateFormatParameterName)); + private static final Set VARIABLE_SCHEDULESUPPORTED_ARRAY_PARAMETERS = new HashSet<>( + Arrays.asList(LoanApiConstants.modifiedinstallmentsParamName, LoanApiConstants.newinstallmentsParamName, + LoanApiConstants.deletedinstallmentsParamName)); + private static final Set VARIABLE_SCHEDULE_MODIFIED_PARAMETERS = new HashSet<>(Arrays.asList(LoanApiConstants.dueDateParamName, LoanApiConstants.modifiedDueDateParamName, LoanApiConstants.principalParamName, LoanApiConstants.installmentAmountParamName)); - final Set variableScheduleNewInstallmentParameters = new HashSet<>(Arrays.asList(LoanApiConstants.dueDateParamName, - LoanApiConstants.principalParamName, LoanApiConstants.installmentAmountParamName)); - final Set variableScheduleDeleteInstallmentParameters = new HashSet<>(Arrays.asList(LoanApiConstants.dueDateParamName)); + private static final Set VARIABLE_SCHEDULE_NEW_INSTALLMENT_PARAMETERS = new HashSet<>(Arrays + .asList(LoanApiConstants.dueDateParamName, LoanApiConstants.principalParamName, LoanApiConstants.installmentAmountParamName)); + private static final Set VARIABLE_SCHEDULE_DELETE_INSTALLMENT_PARAMETERS = new HashSet<>( + List.of(LoanApiConstants.dueDateParamName)); + public static final String LOAN = "loan"; private final FromJsonHelper fromApiJsonHelper; @@ -70,14 +73,14 @@ public class VariableLoanScheduleFromApiJsonValidator { } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.variableSchedulesupportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, VARIABLE_SCHEDULESUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("loan"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(LOAN); if (!loan.isSubmittedAndPendingApproval()) { baseDataValidator.reset().failWithCodeNoParameterAddedToErrorCode("account.is.not.submitted.and.pending.state", - "Loan is not in submited state"); + "Loan is not in submitted state"); throw new PlatformApiDataValidationException(dataValidationErrors); } @@ -88,25 +91,25 @@ public class VariableLoanScheduleFromApiJsonValidator { final String dateFormat = this.fromApiJsonHelper.extractDateFormatParameter(topLevelJsonElement); final Locale locale = this.fromApiJsonHelper.extractLocaleParameter(topLevelJsonElement); final JsonObject exceptionObject = topLevelJsonElement.getAsJsonObject(LoanApiConstants.exceptionParamName); - this.fromApiJsonHelper.checkForUnsupportedParameters(exceptionObject, this.variableSchedulesupportedArrayParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(exceptionObject, VARIABLE_SCHEDULESUPPORTED_ARRAY_PARAMETERS); if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.modifiedinstallmentsParamName, exceptionObject) && exceptionObject.get(LoanApiConstants.modifiedinstallmentsParamName).isJsonArray()) { final JsonArray modificationsArray = exceptionObject.get(LoanApiConstants.modifiedinstallmentsParamName) .getAsJsonArray(); validateLoanTermVariations(loan, baseDataValidator, dateFormat, locale, modificationsArray, - this.variableScheduleModifiedParameters, LoanApiConstants.modifiedinstallmentsParamName); + VARIABLE_SCHEDULE_MODIFIED_PARAMETERS, LoanApiConstants.modifiedinstallmentsParamName); } if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.newinstallmentsParamName, exceptionObject) && exceptionObject.get(LoanApiConstants.newinstallmentsParamName).isJsonArray()) { final JsonArray array = exceptionObject.get(LoanApiConstants.newinstallmentsParamName).getAsJsonArray(); validateLoanTermVariations(loan, baseDataValidator, dateFormat, locale, array, - this.variableScheduleNewInstallmentParameters, LoanApiConstants.newinstallmentsParamName); + VARIABLE_SCHEDULE_NEW_INSTALLMENT_PARAMETERS, LoanApiConstants.newinstallmentsParamName); } if (this.fromApiJsonHelper.parameterExists(LoanApiConstants.deletedinstallmentsParamName, exceptionObject) && exceptionObject.get(LoanApiConstants.deletedinstallmentsParamName).isJsonArray()) { final JsonArray array = exceptionObject.get(LoanApiConstants.deletedinstallmentsParamName).getAsJsonArray(); validateLoanTermVariations(loan, baseDataValidator, dateFormat, locale, array, - this.variableScheduleDeleteInstallmentParameters, LoanApiConstants.deletedinstallmentsParamName); + VARIABLE_SCHEDULE_DELETE_INSTALLMENT_PARAMETERS, LoanApiConstants.deletedinstallmentsParamName); } } } else { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java index 99d826e55..8b96e84a2 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java @@ -708,7 +708,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa checkClientOrGroupActive(existingLoanApplication); - final Set existingCharges = existingLoanApplication.charges(); + final Set existingCharges = existingLoanApplication.getActiveCharges(); Map chargesMap = new HashMap<>(); for (LoanCharge charge : existingCharges) { LoanChargeData chargeData = new LoanChargeData(charge.getId(), charge.getDueLocalDate(), charge.amountOrPercentage()); @@ -1131,7 +1131,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa } if (!isLinkedAccPresent) { - final Set charges = existingLoanApplication.charges(); + final Set charges = existingLoanApplication.getActiveCharges(); for (final LoanCharge loanCharge : charges) { if (loanCharge.getChargePaymentMode().isPaymentModeAccountTransfer()) { final String errorMessage = "one of the charges requires linked savings account for payment"; @@ -1321,7 +1321,7 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa final JsonArray disbursementDataArray = command.arrayOfParameterNamed(LoanApiConstants.disbursementDataParameterName); - expectedDisbursementDate = command.localDateValueOfParameterNamed(LoanApiConstants.disbursementDateParameterName); + expectedDisbursementDate = command.localDateValueOfParameterNamed(LoanApiConstants.expectedDisbursementDateParameterName); if (expectedDisbursementDate == null) { expectedDisbursementDate = loan.getExpectedDisbursedOnLocalDate(); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeAssembler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeAssembler.java index b6567d626..4165b7932 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeAssembler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeAssembler.java @@ -149,7 +149,8 @@ public class LoanChargeAssembler { if (disbursementArray.size() > 0) { JsonObject disbursementDataElement = disbursementArray.get(0).getAsJsonObject(); expectedDisbursementDate = this.fromApiJsonHelper.extractLocalDateNamed( - LoanApiConstants.disbursementDateParameterName, disbursementDataElement, dateFormat, locale); + LoanApiConstants.expectedDisbursementDateParameterName, disbursementDataElement, dateFormat, + locale); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanUtilService.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanUtilService.java index dbac6b5a5..7c1450b56 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanUtilService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanUtilService.java @@ -321,9 +321,9 @@ public class LoanUtilService { BigDecimal principal = null; BigDecimal netDisbursalAmount = null; - if (jsonObject.has(LoanApiConstants.disbursementDateParameterName)) { - expectedDisbursementDate = this.fromApiJsonHelper - .extractLocalDateNamed(LoanApiConstants.disbursementDateParameterName, jsonObject, dateFormat, locale); + if (jsonObject.has(LoanApiConstants.expectedDisbursementDateParameterName)) { + expectedDisbursementDate = this.fromApiJsonHelper.extractLocalDateNamed( + LoanApiConstants.expectedDisbursementDateParameterName, jsonObject, dateFormat, locale); } if (jsonObject.has(LoanApiConstants.disbursementPrincipalParameterName) && jsonObject.get(LoanApiConstants.disbursementPrincipalParameterName).isJsonPrimitive() diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java index 07f22ce99..85ef0522f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java @@ -505,7 +505,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf postJournalEntries(loan, existingTransactionIds, existingReversedTransactionIds); } - final Set loanCharges = loan.charges(); + final Set loanCharges = loan.getActiveCharges(); final Map disBuLoanCharges = new HashMap<>(); for (final LoanCharge loanCharge : loanCharges) { if (loanCharge.isDueAtDisbursement() && loanCharge.getChargePaymentMode().isPaymentModeAccountTransfer() @@ -773,7 +773,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf } postJournalEntries(loan, existingTransactionIds, existingReversedTransactionIds); } - final Set loanCharges = loan.charges(); + final Set loanCharges = loan.getActiveCharges(); final Map disBuLoanCharges = new HashMap<>(); for (final LoanCharge loanCharge : loanCharges) { if (loanCharge.isDueAtDisbursement() && loanCharge.getChargePaymentMode().isPaymentModeAccountTransfer() @@ -855,7 +855,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf if (loan.isTopup() && loan.getClientId() != null) { final Long loanIdToClose = loan.getTopupLoanDetails().getLoanIdToClose(); final LocalDate expectedDisbursementDate = command - .localDateValueOfParameterNamed(LoanApiConstants.disbursementDateParameterName); + .localDateValueOfParameterNamed(LoanApiConstants.expectedDisbursementDateParameterName); BigDecimal loanOutstanding = this.loanReadPlatformService .retrieveLoanPrePaymentTemplate(LoanTransactionType.REPAYMENT, loanIdToClose, expectedDisbursementDate).getAmount(); BigDecimal netDisbursalAmount = loan.getApprovedPrincipal().subtract(loanOutstanding); @@ -976,7 +976,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf loanCollateralManagement.setLoanTransactionData(loanTransaction); ClientCollateralManagement clientCollateralManagement = loanCollateralManagement.getClientCollateralManagement(); - if (loan.status().isClosed()) { + if (loan.getStatus().isClosed()) { loanCollateralManagement.setIsReleased(true); BigDecimal quantity = loanCollateralManagement.getQuantity(); clientCollateralManagement.updateQuantity(clientCollateralManagement.getQuantity().add(quantity)); @@ -1055,7 +1055,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf this.loanEventApiJsonValidator.validateTransaction(command.json()); Loan loan = this.loanAssembler.assembleFrom(loanId); - if (loan.status().isClosed() && loan.getLoanSubStatus() != null + if (loan.getStatus().isClosed() && loan.getLoanSubStatus() != null && loan.getLoanSubStatus().equals(LoanSubStatus.FORECLOSED.getValue())) { final String defaultUserMessage = "The loan cannot reopened as it is foreclosed."; throw new LoanForeclosureException("loan.cannot.be.reopened.as.it.is.foreclosured", defaultUserMessage, loanId); @@ -1508,7 +1508,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf for (LoanCollateralManagement loanCollateralManagement : loanCollateralManagements) { ClientCollateralManagement clientCollateralManagement = loanCollateralManagement.getClientCollateralManagement(); - if (loan.status().isClosed()) { + if (loan.getStatus().isClosed()) { loanCollateralManagement.setIsReleased(true); BigDecimal quantity = loanCollateralManagement.getQuantity(); clientCollateralManagement.updateQuantity(clientCollateralManagement.getQuantity().add(quantity)); @@ -1573,7 +1573,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf for (LoanCollateralManagement loanCollateralManagement : loanCollateralManagements) { ClientCollateralManagement clientCollateralManagement = loanCollateralManagement.getClientCollateralManagement(); - if (loan.status().isClosed()) { + if (loan.getStatus().isClosed()) { loanCollateralManagement.setIsReleased(true); BigDecimal quantity = loanCollateralManagement.getQuantity(); clientCollateralManagement.updateQuantity(clientCollateralManagement.getQuantity().add(quantity)); @@ -1716,7 +1716,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf chargeDefinition.getName()); } else if (loan.repaymentScheduleDetail().isInterestRecalculationEnabled()) { - if (loanCharge.isInstalmentFee() && loan.status().isActive()) { + if (loanCharge.isInstalmentFee() && loan.getStatus().isActive()) { final String defaultUserMessage = "installment charge addition not allowed after disbursement"; throw new LoanChargeCannotBeAddedException("loanCharge", "installment.charge", defaultUserMessage, null, chargeDefinition.getName()); @@ -1797,7 +1797,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf * we want to apply charge transactions only for those loans charges that are applied when a loan is active and * the loan product uses Upfront Accruals **/ - if (loan.status().isActive() && loan.isNoneOrCashOrUpfrontAccrualAccountingEnabledOnLoanProduct()) { + if (loan.getStatus().isActive() && loan.isNoneOrCashOrUpfrontAccrualAccountingEnabledOnLoanProduct()) { final LoanTransaction applyLoanChargeTransaction = loan.handleChargeAppliedTransaction(loanCharge, null); this.loanTransactionRepository.saveAndFlush(applyLoanChargeTransaction); } @@ -1816,7 +1816,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf // Charges may be edited only when the loan associated with them are // yet to be approved (are in submitted and pending status) - if (!loan.status().isSubmittedAndPendingApproval()) { + if (!loan.getStatus().isSubmittedAndPendingApproval()) { throw new LoanChargeCannotBeUpdatedException(LoanChargeCannotBeUpdatedReason.LOAN_NOT_IN_SUBMITTED_AND_PENDING_APPROVAL_STAGE, loanCharge.getId()); } @@ -1968,9 +1968,9 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf LoanInstallmentCharge installmentChargeEntry = null; Loan loan = loanCharge.getLoan(); - if (!(loan.isOpen() || loan.status().isClosedObligationsMet() || loan.status().isOverpaid())) { + if (!(loan.isOpen() || loan.getStatus().isClosedObligationsMet() || loan.getStatus().isOverpaid())) { final String errorMessage = "loan.charge.refund.invalid.status"; - throw new LoanChargeRefundException(errorMessage, loan.status().toString()); + throw new LoanChargeRefundException(errorMessage, loan.getStatus().toString()); } if (dueDate != null && installmentNumber != null) { @@ -2047,7 +2047,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf // Charges may be waived only when the loan associated with them are // active - if (!loan.status().isActive()) { + if (!loan.getStatus().isActive()) { throw new LoanChargeWaiveCannotBeReversedException(LoanChargeWaiveCannotUndoReason.LOAN_INACTIVE, loanCharge.getId()); } @@ -2172,7 +2172,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf // Charges may be waived only when the loan associated with them are // active - if (!loan.status().isActive()) { + if (!loan.getStatus().isActive()) { throw new LoanChargeCannotBeWaivedException(LoanChargeCannotBeWaivedReason.LOAN_INACTIVE, loanCharge.getId()); } @@ -2254,7 +2254,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf // Charges may be deleted only when the loan associated with them are // yet to be approved (are in submitted and pending status) - if (!loan.status().isSubmittedAndPendingApproval()) { + if (!loan.getStatus().isSubmittedAndPendingApproval()) { throw new LoanChargeCannotBeDeletedException(LoanChargeCannotBeDeletedReason.LOAN_NOT_IN_SUBMITTED_AND_PENDING_APPROVAL_STAGE, loanCharge.getId()); } @@ -2288,7 +2288,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf // Charges may be waived only when the loan associated with them are // active - if (!loan.status().isActive()) { + if (!loan.getStatus().isActive()) { throw new LoanChargeCannotBePayedException(LoanChargeCannotBePayedReason.LOAN_INACTIVE, loanCharge.getId()); } @@ -2667,9 +2667,8 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf existingReversedTransactionIds); createAndSaveLoanScheduleArchive(loan, scheduleGeneratorDTO); } else if (rescheduleBasedOnMeetingDates != null && rescheduleBasedOnMeetingDates) { - loan.updateLoanRepaymentScheduleDates(calendar.getStartDateLocalDate(), calendar.getRecurrence(), isHolidayEnabled, - holidays, workingDays, rescheduleBasedOnMeetingDates, presentMeetingDate, newMeetingDate, - isSkipRepaymentOnFirstMonth, numberOfDays); + loan.updateLoanRepaymentScheduleDates(calendar.getRecurrence(), isHolidayEnabled, holidays, workingDays, + presentMeetingDate, newMeetingDate, isSkipRepaymentOnFirstMonth, numberOfDays); } else { loan.updateLoanRepaymentScheduleDates(calendar.getStartDateLocalDate(), calendar.getRecurrence(), isHolidayEnabled, holidays, workingDays, isSkipRepaymentOnFirstMonth, numberOfDays); @@ -3102,8 +3101,8 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf final String errorMessage = "loan.product.does.not.support.multiple.disbursals"; throw new LoanMultiDisbursementException(errorMessage); } - if (loan.isSubmittedAndPendingApproval() || loan.isClosed() || loan.isClosedWrittenOff() || loan.status().isClosedObligationsMet() - || loan.status().isOverpaid()) { + if (loan.isSubmittedAndPendingApproval() || loan.isClosed() || loan.isClosedWrittenOff() + || loan.getStatus().isClosedObligationsMet() || loan.getStatus().isOverpaid()) { final String errorMessage = "cannot.modify.tranches.if.loan.is.pendingapproval.closed.overpaid.writtenoff"; throw new LoanMultiDisbursementException(errorMessage); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResource.java index 2df0fa579..4fc7cc78d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResource.java @@ -93,8 +93,8 @@ import org.springframework.stereotype.Component; @Tag(name = "Loan Products", description = "A Loan product is a template that is used when creating a loan. Much of the template definition can be overridden during loan creation.") public class LoanProductsApiResource { - private final Set loanProductDataParameters = new HashSet<>(Arrays.asList("id", "name", "shortName", "description", "fundId", - "fundName", "includeInBorrowerCycle", "currency", "principal", "minPrincipal", "maxPrincipal", "numberOfRepayments", + private static final Set LOAN_PRODUCT_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id", "name", "shortName", "description", + "fundId", "fundName", "includeInBorrowerCycle", "currency", "principal", "minPrincipal", "maxPrincipal", "numberOfRepayments", "minNumberOfRepayments", "maxNumberOfRepayments", "repaymentEvery", "repaymentFrequencyType", "graceOnPrincipalPayment", "recurringMoratoriumOnPrincipalPeriods", "graceOnInterestPayment", "graceOnInterestCharged", "interestRatePerPeriod", "minInterestRatePerPeriod", "maxInterestRatePerPeriod", "interestRateFrequencyType", "annualInterestRate", "amortizationType", @@ -109,10 +109,12 @@ public class LoanProductsApiResource { LoanProductConstants.CAN_USE_FOR_TOPUP, LoanProductConstants.IS_EQUAL_AMORTIZATION_PARAM, LoanProductConstants.RATES_PARAM_NAME, LoanApiConstants.fixedPrincipalPercentagePerInstallmentParamName)); - private final Set productMixDataParameters = new HashSet<>( + private static final Set PRODUCT_MIX_DATA_PARAMETERS = new HashSet<>( Arrays.asList("productId", "productName", "restrictedProducts", "allowedProducts", "productOptions")); - private final String resourceNameForPermissions = "LOANPRODUCT"; + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "LOANPRODUCT"; + public static final String PRODUCTMIX = "PRODUCTMIX"; + public static final String PRODUCT_MIXES = "productMixes"; private final PlatformSecurityContext context; private final LoanProductReadPlatformService loanProductReadPlatformService; @@ -208,21 +210,19 @@ public class LoanProductsApiResource { @ApiResponse(responseCode = "200", description = "OK", content = @Content(array = @ArraySchema(schema = @Schema(implementation = LoanProductsApiResourceSwagger.GetLoanProductsResponse.class)))) }) public String retrieveAllLoanProducts(@Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final Set associationParameters = ApiParameterHelper.extractAssociationsForResponseIfProvided(uriInfo.getQueryParameters()); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - if (!associationParameters.isEmpty()) { - if (associationParameters.contains("productMixes")) { - this.context.authenticatedUser().validateHasReadPermission("PRODUCTMIX"); - final Collection productMixes = this.productMixReadPlatformService.retrieveAllProductMixes(); - return this.productMixDataApiJsonSerializer.serialize(settings, productMixes, this.productMixDataParameters); - } + if (!associationParameters.isEmpty() && associationParameters.contains(PRODUCT_MIXES)) { + this.context.authenticatedUser().validateHasReadPermission(PRODUCTMIX); + final Collection productMixes = this.productMixReadPlatformService.retrieveAllProductMixes(); + return this.productMixDataApiJsonSerializer.serialize(settings, productMixes, PRODUCT_MIX_DATA_PARAMETERS); } final Collection products = this.loanProductReadPlatformService.retrieveAllLoanProducts(); - return this.toApiJsonSerializer.serialize(settings, products, this.loanProductDataParameters); + return this.toApiJsonSerializer.serialize(settings, products, LOAN_PRODUCT_DATA_PARAMETERS); } @GET @@ -236,21 +236,21 @@ public class LoanProductsApiResource { public String retrieveTemplate(@Context final UriInfo uriInfo, @QueryParam("isProductMixTemplate") @Parameter(description = "isProductMixTemplate") final boolean isProductMixTemplate) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); if (isProductMixTemplate) { - this.context.authenticatedUser().validateHasReadPermission("PRODUCTMIX"); + this.context.authenticatedUser().validateHasReadPermission(PRODUCTMIX); final Collection productOptions = this.loanProductReadPlatformService.retrieveAvailableLoanProductsForMix(); final ProductMixData productMixData = ProductMixData.template(productOptions); - return this.productMixDataApiJsonSerializer.serialize(settings, productMixData, this.productMixDataParameters); + return this.productMixDataApiJsonSerializer.serialize(settings, productMixData, PRODUCT_MIX_DATA_PARAMETERS); } LoanProductData loanProduct = this.loanProductReadPlatformService.retrieveNewLoanProductDetails(); loanProduct = handleTemplate(loanProduct); - return this.toApiJsonSerializer.serialize(settings, loanProduct, this.loanProductDataParameters); + return this.toApiJsonSerializer.serialize(settings, loanProduct, LOAN_PRODUCT_DATA_PARAMETERS); } @GET @@ -265,16 +265,16 @@ public class LoanProductsApiResource { public String retrieveLoanProductDetails(@PathParam("productId") @Parameter(description = "productId") final Long productId, @Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); LoanProductData loanProduct = this.loanProductReadPlatformService.retrieveLoanProduct(productId); - Map accountingMappings = null; - Collection paymentChannelToFundSourceMappings = null; - Collection feeToGLAccountMappings = null; - Collection penaltyToGLAccountMappings = null; + Map accountingMappings; + Collection paymentChannelToFundSourceMappings; + Collection feeToGLAccountMappings; + Collection penaltyToGLAccountMappings; if (loanProduct.hasAccountingEnabled()) { accountingMappings = this.accountMappingReadPlatformService.fetchAccountMappingDetailsForLoanProduct(productId, loanProduct.getAccountingRule().getId().intValue()); @@ -290,7 +290,7 @@ public class LoanProductsApiResource { if (settings.isTemplate()) { loanProduct = handleTemplate(loanProduct); } - return this.toApiJsonSerializer.serialize(settings, loanProduct, this.loanProductDataParameters); + return this.toApiJsonSerializer.serialize(settings, loanProduct, LOAN_PRODUCT_DATA_PARAMETERS); } @PUT diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/productmix/api/ProductMixApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/productmix/api/ProductMixApiResource.java index fed6f2154..62e67085a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/productmix/api/ProductMixApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/productmix/api/ProductMixApiResource.java @@ -56,9 +56,9 @@ import org.springframework.stereotype.Component; @Tag(name = "Product Mix") public class ProductMixApiResource { - private final String resourceNameForPermissions = "PRODUCTMIX"; + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "PRODUCTMIX"; - private final Set productMixDataParameters = new HashSet<>( + private static final Set PRODUCT_MIX_DATA_PARAMETERS = new HashSet<>( Arrays.asList("productId", "productName", "restrictedProducts", "allowedProducts", "productOptions")); private final PlatformSecurityContext context; @@ -88,7 +88,7 @@ public class ProductMixApiResource { @Produces({ MediaType.APPLICATION_JSON }) public String retrieveTemplate(@PathParam("productId") final Long productId, @Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); ProductMixData productMixData = this.productMixReadPlatformService.retrieveLoanProductMixDetails(productId); @@ -97,7 +97,7 @@ public class ProductMixApiResource { final Collection productOptions = this.loanProductReadPlatformService.retrieveAvailableLoanProductsForMix(); productMixData = ProductMixData.withTemplateOptions(productMixData, productOptions); } - return this.toApiJsonSerializer.serialize(settings, productMixData, this.productMixDataParameters); + return this.toApiJsonSerializer.serialize(settings, productMixData, PRODUCT_MIX_DATA_PARAMETERS); } @POST diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/productmix/serialization/ProductMixDataValidator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/productmix/serialization/ProductMixDataValidator.java index 4d0eced5c..ae3fae2a3 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/productmix/serialization/ProductMixDataValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/productmix/serialization/ProductMixDataValidator.java @@ -38,10 +38,13 @@ import org.springframework.stereotype.Component; @Component public final class ProductMixDataValidator { + public static final String RESTRICTED_PRODUCTS = "restrictedProducts"; /** * The parameters supported for this command. */ - private final Set supportedParameters = new HashSet<>(List.of("restrictedProducts")); + private static final Set SUPPORTED_PARAMETERS = new HashSet<>(List.of(RESTRICTED_PRODUCTS)); + public static final String PRODUCTMIX = "productmix"; + public static final String RESTRICTED_PRODUCT = "restrictedProduct"; private final FromJsonHelper fromApiJsonHelper; @@ -56,15 +59,15 @@ public final class ProductMixDataValidator { } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("productmix"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(PRODUCTMIX); final JsonElement element = this.fromApiJsonHelper.parse(json); - final String[] restrictedProducts = this.fromApiJsonHelper.extractArrayNamed("restrictedProducts", element); - baseDataValidator.reset().parameter("restrictedProducts").value(restrictedProducts).arrayNotEmpty(); + final String[] restrictedProducts = this.fromApiJsonHelper.extractArrayNamed(RESTRICTED_PRODUCTS, element); + baseDataValidator.reset().parameter(RESTRICTED_PRODUCTS).value(restrictedProducts).arrayNotEmpty(); if (restrictedProducts != null) { validateRestrictedProducts(restrictedProducts, baseDataValidator); } @@ -74,7 +77,7 @@ public final class ProductMixDataValidator { private void validateRestrictedProducts(final String[] restrictedProducts, final DataValidatorBuilder baseDataValidator) { for (final String restrictedId : restrictedProducts) { - baseDataValidator.reset().parameter("restrictedProduct").value(restrictedId).notBlank().longGreaterThanZero(); + baseDataValidator.reset().parameter(RESTRICTED_PRODUCT).value(restrictedId).notBlank().longGreaterThanZero(); } } @@ -92,13 +95,13 @@ public final class ProductMixDataValidator { } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("productmix"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(PRODUCTMIX); final JsonElement element = this.fromApiJsonHelper.parse(json); - final String[] restrictedProducts = this.fromApiJsonHelper.extractArrayNamed("restrictedProducts", element); + final String[] restrictedProducts = this.fromApiJsonHelper.extractArrayNamed(RESTRICTED_PRODUCTS, element); validateRestrictedProducts(restrictedProducts, baseDataValidator); throwExceptionIfValidationWarningsExist(dataValidationErrors); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/serialization/LoanProductDataValidator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/serialization/LoanProductDataValidator.java index cb89efb54..de4d59eae 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/serialization/LoanProductDataValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/serialization/LoanProductDataValidator.java @@ -59,19 +59,54 @@ import org.springframework.stereotype.Component; @Component public final class LoanProductDataValidator { + public static final String NAME = "name"; + public static final String DESCRIPTION = "description"; + public static final String FUND_ID = "fundId"; + public static final String INCLUDE_IN_BORROWER_CYCLE = "includeInBorrowerCycle"; + public static final String CURRENCY_CODE = "currencyCode"; + public static final String DIGITS_AFTER_DECIMAL = "digitsAfterDecimal"; + public static final String IN_MULTIPLES_OF = "inMultiplesOf"; + public static final String PRINCIPAL = "principal"; + public static final String MIN_PRINCIPAL = "minPrincipal"; + public static final String MAX_PRINCIPAL = "maxPrincipal"; + public static final String NUMBER_OF_REPAYMENTS = "numberOfRepayments"; + public static final String MIN_NUMBER_OF_REPAYMENTS = "minNumberOfRepayments"; + public static final String MAX_NUMBER_OF_REPAYMENTS = "maxNumberOfRepayments"; + public static final String REPAYMENT_EVERY = "repaymentEvery"; + public static final String REPAYMENT_FREQUENCY_TYPE = "repaymentFrequencyType"; + public static final String AMORTIZATION_TYPE = "amortizationType"; + public static final String INTEREST_TYPE = "interestType"; + public static final String INTEREST_CALCULATION_PERIOD_TYPE = "interestCalculationPeriodType"; + public static final String IN_ARREARS_TOLERANCE = "inArrearsTolerance"; + public static final String TRANSACTION_PROCESSING_STRATEGY_ID = "transactionProcessingStrategyId"; + public static final String GRACE_ON_PRINCIPAL_PAYMENT = "graceOnPrincipalPayment"; + public static final String GRACE_ON_INTEREST_PAYMENT = "graceOnInterestPayment"; + public static final String GRACE_ON_INTEREST_CHARGED = "graceOnInterestCharged"; + public static final String IS_LINKED_TO_FLOATING_INTEREST_RATES = "isLinkedToFloatingInterestRates"; + public static final String INTEREST_RATE_PER_PERIOD = "interestRatePerPeriod"; + public static final String MIN_INTEREST_RATE_PER_PERIOD = "minInterestRatePerPeriod"; + public static final String MAX_INTEREST_RATE_PER_PERIOD = "maxInterestRatePerPeriod"; + public static final String INTEREST_RATE_FREQUENCY_TYPE = "interestRateFrequencyType"; + public static final String FLOATING_RATES_ID = "floatingRatesId"; + public static final String INTEREST_RATE_DIFFERENTIAL = "interestRateDifferential"; + public static final String MIN_DIFFERENTIAL_LENDING_RATE = "minDifferentialLendingRate"; + public static final String DEFAULT_DIFFERENTIAL_LENDING_RATE = "defaultDifferentialLendingRate"; + public static final String MAX_DIFFERENTIAL_LENDING_RATE = "maxDifferentialLendingRate"; + public static final String IS_FLOATING_INTEREST_RATE_CALCULATION_ALLOWED = "isFloatingInterestRateCalculationAllowed"; + public static final String ACCOUNTING_RULE = "accountingRule"; /** * The parameters supported for this command. */ - private final Set supportedParameters = new HashSet<>(Arrays.asList("locale", "dateFormat", "name", "description", "fundId", - "currencyCode", "digitsAfterDecimal", "inMultiplesOf", "principal", "minPrincipal", "maxPrincipal", "repaymentEvery", - "numberOfRepayments", "minNumberOfRepayments", "maxNumberOfRepayments", "repaymentFrequencyType", "interestRatePerPeriod", - "minInterestRatePerPeriod", "maxInterestRatePerPeriod", "interestRateFrequencyType", "amortizationType", "interestType", - "interestCalculationPeriodType", LoanProductConstants.ALLOW_PARTIAL_PERIOD_INTEREST_CALCUALTION_PARAM_NAME, - "inArrearsTolerance", "transactionProcessingStrategyId", "graceOnPrincipalPayment", "recurringMoratoriumOnPrincipalPeriods", - "graceOnInterestPayment", "graceOnInterestCharged", "charges", "accountingRule", "includeInBorrowerCycle", "startDate", - "closeDate", "externalId", "isLinkedToFloatingInterestRates", "floatingRatesId", "interestRateDifferential", - "minDifferentialLendingRate", "defaultDifferentialLendingRate", "maxDifferentialLendingRate", - "isFloatingInterestRateCalculationAllowed", "syncExpectedWithDisbursementDate", + private static final Set SUPPORTED_PARAMETERS = new HashSet<>(Arrays.asList("locale", "dateFormat", NAME, DESCRIPTION, FUND_ID, + CURRENCY_CODE, DIGITS_AFTER_DECIMAL, IN_MULTIPLES_OF, PRINCIPAL, MIN_PRINCIPAL, MAX_PRINCIPAL, REPAYMENT_EVERY, + NUMBER_OF_REPAYMENTS, MIN_NUMBER_OF_REPAYMENTS, MAX_NUMBER_OF_REPAYMENTS, REPAYMENT_FREQUENCY_TYPE, INTEREST_RATE_PER_PERIOD, + MIN_INTEREST_RATE_PER_PERIOD, MAX_INTEREST_RATE_PER_PERIOD, INTEREST_RATE_FREQUENCY_TYPE, AMORTIZATION_TYPE, INTEREST_TYPE, + INTEREST_CALCULATION_PERIOD_TYPE, LoanProductConstants.ALLOW_PARTIAL_PERIOD_INTEREST_CALCUALTION_PARAM_NAME, + IN_ARREARS_TOLERANCE, TRANSACTION_PROCESSING_STRATEGY_ID, GRACE_ON_PRINCIPAL_PAYMENT, "recurringMoratoriumOnPrincipalPeriods", + GRACE_ON_INTEREST_PAYMENT, GRACE_ON_INTEREST_CHARGED, "charges", ACCOUNTING_RULE, INCLUDE_IN_BORROWER_CYCLE, "startDate", + "closeDate", "externalId", IS_LINKED_TO_FLOATING_INTEREST_RATES, FLOATING_RATES_ID, INTEREST_RATE_DIFFERENTIAL, + MIN_DIFFERENTIAL_LENDING_RATE, DEFAULT_DIFFERENTIAL_LENDING_RATE, MAX_DIFFERENTIAL_LENDING_RATE, + IS_FLOATING_INTEREST_RATE_CALCULATION_ALLOWED, "syncExpectedWithDisbursementDate", LoanProductAccountingParams.FEES_RECEIVABLE.getValue(), LoanProductAccountingParams.FUND_SOURCE.getValue(), LoanProductAccountingParams.INCOME_FROM_FEES.getValue(), LoanProductAccountingParams.INCOME_FROM_PENALTIES.getValue(), LoanProductAccountingParams.INTEREST_ON_LOANS.getValue(), LoanProductAccountingParams.INTEREST_RECEIVABLE.getValue(), @@ -113,11 +148,16 @@ public final class LoanProductDataValidator { LoanProductConstants.ALLOW_APPROVED_DISBURSED_AMOUNTS_OVER_APPLIED, LoanProductConstants.OVER_APPLIED_CALCULATION_TYPE, LoanProductConstants.OVER_APPLIED_NUMBER, LoanProductConstants.DELINQUENCY_BUCKET_PARAM_NAME)); - private static final String[] supportedLoanConfigurableAttributes = { LoanProductConstants.amortizationTypeParamName, + private static final String[] SUPPORTED_LOAN_CONFIGURABLE_ATTRIBUTES = { LoanProductConstants.amortizationTypeParamName, LoanProductConstants.interestTypeParamName, LoanProductConstants.transactionProcessingStrategyIdParamName, LoanProductConstants.interestCalculationPeriodTypeParamName, LoanProductConstants.inArrearsToleranceParamName, LoanProductConstants.repaymentEveryParamName, LoanProductConstants.graceOnPrincipalAndInterestPaymentParamName, LoanProductConstants.GRACE_ON_ARREARS_AGEING_PARAMETER_NAME }; + public static final String LOANPRODUCT = "loanproduct"; + public static final String OVER_APPLIED_CALCULATION_TYPE = "overAppliedCalculationType"; + public static final String OPENING_SQUARE_BRACKET = "["; + public static final String CLOSING_SQUARE_BRACKET = "]"; + public static final String DOT = "."; private final FromJsonHelper fromApiJsonHelper; @@ -132,25 +172,25 @@ public final class LoanProductDataValidator { } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("loanproduct"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(LOANPRODUCT); final JsonElement element = this.fromApiJsonHelper.parse(json); - final String name = this.fromApiJsonHelper.extractStringNamed("name", element); - baseDataValidator.reset().parameter("name").value(name).notBlank().notExceedingLengthOf(100); + final String name = this.fromApiJsonHelper.extractStringNamed(NAME, element); + baseDataValidator.reset().parameter(NAME).value(name).notBlank().notExceedingLengthOf(100); final String shortName = this.fromApiJsonHelper.extractStringNamed(LoanProductConstants.SHORT_NAME, element); baseDataValidator.reset().parameter(LoanProductConstants.SHORT_NAME).value(shortName).notBlank().notExceedingLengthOf(4); - final String description = this.fromApiJsonHelper.extractStringNamed("description", element); - baseDataValidator.reset().parameter("description").value(description).notExceedingLengthOf(500); + final String description = this.fromApiJsonHelper.extractStringNamed(DESCRIPTION, element); + baseDataValidator.reset().parameter(DESCRIPTION).value(description).notExceedingLengthOf(500); - if (this.fromApiJsonHelper.parameterExists("fundId", element)) { - final Long fundId = this.fromApiJsonHelper.extractLongNamed("fundId", element); - baseDataValidator.reset().parameter("fundId").value(fundId).ignoreIfNull().integerGreaterThanZero(); + if (this.fromApiJsonHelper.parameterExists(FUND_ID, element)) { + final Long fundId = this.fromApiJsonHelper.extractLongNamed(FUND_ID, element); + baseDataValidator.reset().parameter(FUND_ID).value(fundId).ignoreIfNull().integerGreaterThanZero(); } boolean isEqualAmortization = false; @@ -167,31 +207,31 @@ public final class LoanProductDataValidator { .value(minimumDaysBetweenDisbursalAndFirstRepayment).ignoreIfNull().integerGreaterThanZero(); } - final Boolean includeInBorrowerCycle = this.fromApiJsonHelper.extractBooleanNamed("includeInBorrowerCycle", element); - baseDataValidator.reset().parameter("includeInBorrowerCycle").value(includeInBorrowerCycle).ignoreIfNull() + final Boolean includeInBorrowerCycle = this.fromApiJsonHelper.extractBooleanNamed(INCLUDE_IN_BORROWER_CYCLE, element); + baseDataValidator.reset().parameter(INCLUDE_IN_BORROWER_CYCLE).value(includeInBorrowerCycle).ignoreIfNull() .validateForBooleanValue(); // terms - final String currencyCode = this.fromApiJsonHelper.extractStringNamed("currencyCode", element); - baseDataValidator.reset().parameter("currencyCode").value(currencyCode).notBlank().notExceedingLengthOf(3); + final String currencyCode = this.fromApiJsonHelper.extractStringNamed(CURRENCY_CODE, element); + baseDataValidator.reset().parameter(CURRENCY_CODE).value(currencyCode).notBlank().notExceedingLengthOf(3); - final Integer digitsAfterDecimal = this.fromApiJsonHelper.extractIntegerNamed("digitsAfterDecimal", element, Locale.getDefault()); - baseDataValidator.reset().parameter("digitsAfterDecimal").value(digitsAfterDecimal).notNull().inMinMaxRange(0, 6); + final Integer digitsAfterDecimal = this.fromApiJsonHelper.extractIntegerNamed(DIGITS_AFTER_DECIMAL, element, Locale.getDefault()); + baseDataValidator.reset().parameter(DIGITS_AFTER_DECIMAL).value(digitsAfterDecimal).notNull().inMinMaxRange(0, 6); - final Integer inMultiplesOf = this.fromApiJsonHelper.extractIntegerNamed("inMultiplesOf", element, Locale.getDefault()); - baseDataValidator.reset().parameter("inMultiplesOf").value(inMultiplesOf).ignoreIfNull().integerZeroOrGreater(); + final Integer inMultiplesOf = this.fromApiJsonHelper.extractIntegerNamed(IN_MULTIPLES_OF, element, Locale.getDefault()); + baseDataValidator.reset().parameter(IN_MULTIPLES_OF).value(inMultiplesOf).ignoreIfNull().integerZeroOrGreater(); - final BigDecimal principal = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("principal", element); - baseDataValidator.reset().parameter("principal").value(principal).positiveAmount(); + final BigDecimal principal = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(PRINCIPAL, element); + baseDataValidator.reset().parameter(PRINCIPAL).value(principal).positiveAmount(); - final String minPrincipalParameterName = "minPrincipal"; + final String minPrincipalParameterName = MIN_PRINCIPAL; BigDecimal minPrincipalAmount = null; if (this.fromApiJsonHelper.parameterExists(minPrincipalParameterName, element)) { minPrincipalAmount = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(minPrincipalParameterName, element); baseDataValidator.reset().parameter(minPrincipalParameterName).value(minPrincipalAmount).ignoreIfNull().positiveAmount(); } - final String maxPrincipalParameterName = "maxPrincipal"; + final String maxPrincipalParameterName = MAX_PRINCIPAL; BigDecimal maxPrincipalAmount = null; if (this.fromApiJsonHelper.parameterExists(maxPrincipalParameterName, element)) { maxPrincipalAmount = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(maxPrincipalParameterName, element); @@ -203,20 +243,20 @@ public final class LoanProductDataValidator { if (minPrincipalAmount != null && minPrincipalAmount.compareTo(BigDecimal.ZERO) >= 0) { baseDataValidator.reset().parameter(maxPrincipalParameterName).value(maxPrincipalAmount).notLessThanMin(minPrincipalAmount); if (minPrincipalAmount.compareTo(maxPrincipalAmount) <= 0 && principal != null) { - baseDataValidator.reset().parameter("principal").value(principal).inMinAndMaxAmountRange(minPrincipalAmount, + baseDataValidator.reset().parameter(PRINCIPAL).value(principal).inMinAndMaxAmountRange(minPrincipalAmount, maxPrincipalAmount); } } else if (principal != null) { - baseDataValidator.reset().parameter("principal").value(principal).notGreaterThanMax(maxPrincipalAmount); + baseDataValidator.reset().parameter(PRINCIPAL).value(principal).notGreaterThanMax(maxPrincipalAmount); } } else if (minPrincipalAmount != null && minPrincipalAmount.compareTo(BigDecimal.ZERO) >= 0 && principal != null) { - baseDataValidator.reset().parameter("principal").value(principal).notLessThanMin(minPrincipalAmount); + baseDataValidator.reset().parameter(PRINCIPAL).value(principal).notLessThanMin(minPrincipalAmount); } - final Integer numberOfRepayments = this.fromApiJsonHelper.extractIntegerWithLocaleNamed("numberOfRepayments", element); - baseDataValidator.reset().parameter("numberOfRepayments").value(numberOfRepayments).notNull().integerGreaterThanZero(); + final Integer numberOfRepayments = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(NUMBER_OF_REPAYMENTS, element); + baseDataValidator.reset().parameter(NUMBER_OF_REPAYMENTS).value(numberOfRepayments).notNull().integerGreaterThanZero(); - final String minNumberOfRepaymentsParameterName = "minNumberOfRepayments"; + final String minNumberOfRepaymentsParameterName = MIN_NUMBER_OF_REPAYMENTS; Integer minNumberOfRepayments = null; if (this.fromApiJsonHelper.parameterExists(minNumberOfRepaymentsParameterName, element)) { minNumberOfRepayments = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(minNumberOfRepaymentsParameterName, element); @@ -224,7 +264,7 @@ public final class LoanProductDataValidator { .integerGreaterThanZero(); } - final String maxNumberOfRepaymentsParameterName = "maxNumberOfRepayments"; + final String maxNumberOfRepaymentsParameterName = MAX_NUMBER_OF_REPAYMENTS; Integer maxNumberOfRepayments = null; if (this.fromApiJsonHelper.parameterExists(maxNumberOfRepaymentsParameterName, element)) { maxNumberOfRepayments = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(maxNumberOfRepaymentsParameterName, element); @@ -237,41 +277,41 @@ public final class LoanProductDataValidator { baseDataValidator.reset().parameter(maxNumberOfRepaymentsParameterName).value(maxNumberOfRepayments) .notLessThanMin(minNumberOfRepayments); if (minNumberOfRepayments.compareTo(maxNumberOfRepayments) <= 0) { - baseDataValidator.reset().parameter("numberOfRepayments").value(numberOfRepayments).inMinMaxRange(minNumberOfRepayments, + baseDataValidator.reset().parameter(NUMBER_OF_REPAYMENTS).value(numberOfRepayments).inMinMaxRange(minNumberOfRepayments, maxNumberOfRepayments); } } else { - baseDataValidator.reset().parameter("numberOfRepayments").value(numberOfRepayments) + baseDataValidator.reset().parameter(NUMBER_OF_REPAYMENTS).value(numberOfRepayments) .notGreaterThanMax(maxNumberOfRepayments); } } else if (minNumberOfRepayments != null && minNumberOfRepayments.compareTo(0) > 0) { - baseDataValidator.reset().parameter("numberOfRepayments").value(numberOfRepayments).notLessThanMin(minNumberOfRepayments); + baseDataValidator.reset().parameter(NUMBER_OF_REPAYMENTS).value(numberOfRepayments).notLessThanMin(minNumberOfRepayments); } - final Integer repaymentEvery = this.fromApiJsonHelper.extractIntegerWithLocaleNamed("repaymentEvery", element); - baseDataValidator.reset().parameter("repaymentEvery").value(repaymentEvery).notNull().integerGreaterThanZero(); + final Integer repaymentEvery = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(REPAYMENT_EVERY, element); + baseDataValidator.reset().parameter(REPAYMENT_EVERY).value(repaymentEvery).notNull().integerGreaterThanZero(); - final Integer repaymentFrequencyType = this.fromApiJsonHelper.extractIntegerNamed("repaymentFrequencyType", element, + final Integer repaymentFrequencyType = this.fromApiJsonHelper.extractIntegerNamed(REPAYMENT_FREQUENCY_TYPE, element, Locale.getDefault()); - baseDataValidator.reset().parameter("repaymentFrequencyType").value(repaymentFrequencyType).notNull().inMinMaxRange(0, 3); + baseDataValidator.reset().parameter(REPAYMENT_FREQUENCY_TYPE).value(repaymentFrequencyType).notNull().inMinMaxRange(0, 3); // settings - final Integer amortizationType = this.fromApiJsonHelper.extractIntegerNamed("amortizationType", element, Locale.getDefault()); - baseDataValidator.reset().parameter("amortizationType").value(amortizationType).notNull().inMinMaxRange(0, 1); + final Integer amortizationType = this.fromApiJsonHelper.extractIntegerNamed(AMORTIZATION_TYPE, element, Locale.getDefault()); + baseDataValidator.reset().parameter(AMORTIZATION_TYPE).value(amortizationType).notNull().inMinMaxRange(0, 1); - final Integer interestType = this.fromApiJsonHelper.extractIntegerNamed("interestType", element, Locale.getDefault()); - baseDataValidator.reset().parameter("interestType").value(interestType).notNull().inMinMaxRange(0, 1); + final Integer interestType = this.fromApiJsonHelper.extractIntegerNamed(INTEREST_TYPE, element, Locale.getDefault()); + baseDataValidator.reset().parameter(INTEREST_TYPE).value(interestType).notNull().inMinMaxRange(0, 1); - final Integer interestCalculationPeriodType = this.fromApiJsonHelper.extractIntegerNamed("interestCalculationPeriodType", element, + final Integer interestCalculationPeriodType = this.fromApiJsonHelper.extractIntegerNamed(INTEREST_CALCULATION_PERIOD_TYPE, element, Locale.getDefault()); - baseDataValidator.reset().parameter("interestCalculationPeriodType").value(interestCalculationPeriodType).notNull().inMinMaxRange(0, - 1); + baseDataValidator.reset().parameter(INTEREST_CALCULATION_PERIOD_TYPE).value(interestCalculationPeriodType).notNull() + .inMinMaxRange(0, 1); - final BigDecimal inArrearsTolerance = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("inArrearsTolerance", element); - baseDataValidator.reset().parameter("inArrearsTolerance").value(inArrearsTolerance).ignoreIfNull().zeroOrPositiveAmount(); + final BigDecimal inArrearsTolerance = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(IN_ARREARS_TOLERANCE, element); + baseDataValidator.reset().parameter(IN_ARREARS_TOLERANCE).value(inArrearsTolerance).ignoreIfNull().zeroOrPositiveAmount(); - final Long transactionProcessingStrategyId = this.fromApiJsonHelper.extractLongNamed("transactionProcessingStrategyId", element); - baseDataValidator.reset().parameter("transactionProcessingStrategyId").value(transactionProcessingStrategyId).notNull() + final Long transactionProcessingStrategyId = this.fromApiJsonHelper.extractLongNamed(TRANSACTION_PROCESSING_STRATEGY_ID, element); + baseDataValidator.reset().parameter(TRANSACTION_PROCESSING_STRATEGY_ID).value(transactionProcessingStrategyId).notNull() .integerGreaterThanZero(); if (this.fromApiJsonHelper.parameterExists(LoanProductConstants.DELINQUENCY_BUCKET_PARAM_NAME, element)) { @@ -282,14 +322,14 @@ public final class LoanProductDataValidator { } // grace validation - final Integer graceOnPrincipalPayment = this.fromApiJsonHelper.extractIntegerWithLocaleNamed("graceOnPrincipalPayment", element); - baseDataValidator.reset().parameter("graceOnPrincipalPayment").value(graceOnPrincipalPayment).zeroOrPositiveAmount(); + final Integer graceOnPrincipalPayment = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(GRACE_ON_PRINCIPAL_PAYMENT, element); + baseDataValidator.reset().parameter(GRACE_ON_PRINCIPAL_PAYMENT).value(graceOnPrincipalPayment).zeroOrPositiveAmount(); - final Integer graceOnInterestPayment = this.fromApiJsonHelper.extractIntegerWithLocaleNamed("graceOnInterestPayment", element); - baseDataValidator.reset().parameter("graceOnInterestPayment").value(graceOnInterestPayment).zeroOrPositiveAmount(); + final Integer graceOnInterestPayment = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(GRACE_ON_INTEREST_PAYMENT, element); + baseDataValidator.reset().parameter(GRACE_ON_INTEREST_PAYMENT).value(graceOnInterestPayment).zeroOrPositiveAmount(); - final Integer graceOnInterestCharged = this.fromApiJsonHelper.extractIntegerWithLocaleNamed("graceOnInterestCharged", element); - baseDataValidator.reset().parameter("graceOnInterestCharged").value(graceOnInterestCharged).zeroOrPositiveAmount(); + final Integer graceOnInterestCharged = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(GRACE_ON_INTEREST_CHARGED, element); + baseDataValidator.reset().parameter(GRACE_ON_INTEREST_CHARGED).value(graceOnInterestCharged).zeroOrPositiveAmount(); final Integer graceOnArrearsAgeing = this.fromApiJsonHelper .extractIntegerWithLocaleNamed(LoanProductConstants.GRACE_ON_ARREARS_AGEING_PARAMETER_NAME, element); @@ -325,144 +365,139 @@ public final class LoanProductDataValidator { baseDataValidator.reset().parameter(LoanProductConstants.IS_INTEREST_RECALCULATION_ENABLED_PARAMETER_NAME) .value(isInterestRecalculationEnabled).notNull().isOneOfTheseValues(true, false); - if (isInterestRecalculationEnabled != null) { - if (isInterestRecalculationEnabled) { - if (isEqualAmortization) { - throw new EqualAmortizationUnsupportedFeatureException("interest.recalculation", "interest recalculation"); - } - validateInterestRecalculationParams(element, baseDataValidator, null); + if (isInterestRecalculationEnabled != null && isInterestRecalculationEnabled) { + if (isEqualAmortization) { + throw new EqualAmortizationUnsupportedFeatureException("interest.recalculation", "interest recalculation"); } + validateInterestRecalculationParams(element, baseDataValidator, null); } // interest rates - if (this.fromApiJsonHelper.parameterExists("isLinkedToFloatingInterestRates", element) - && this.fromApiJsonHelper.extractBooleanNamed("isLinkedToFloatingInterestRates", element)) { + if (this.fromApiJsonHelper.parameterExists(IS_LINKED_TO_FLOATING_INTEREST_RATES, element) + && this.fromApiJsonHelper.extractBooleanNamed(IS_LINKED_TO_FLOATING_INTEREST_RATES, element)) { if (isEqualAmortization) { throw new EqualAmortizationUnsupportedFeatureException("floating.interest.rate", "floating interest rate"); } - if (this.fromApiJsonHelper.parameterExists("interestRatePerPeriod", element)) { - baseDataValidator.reset().parameter("interestRatePerPeriod").failWithCode( + if (this.fromApiJsonHelper.parameterExists(INTEREST_RATE_PER_PERIOD, element)) { + baseDataValidator.reset().parameter(INTEREST_RATE_PER_PERIOD).failWithCode( "not.supported.when.isLinkedToFloatingInterestRates.is.true", "interestRatePerPeriod param is not supported when isLinkedToFloatingInterestRates is true"); } - if (this.fromApiJsonHelper.parameterExists("minInterestRatePerPeriod", element)) { - baseDataValidator.reset().parameter("minInterestRatePerPeriod").failWithCode( + if (this.fromApiJsonHelper.parameterExists(MIN_INTEREST_RATE_PER_PERIOD, element)) { + baseDataValidator.reset().parameter(MIN_INTEREST_RATE_PER_PERIOD).failWithCode( "not.supported.when.isLinkedToFloatingInterestRates.is.true", "minInterestRatePerPeriod param is not supported when isLinkedToFloatingInterestRates is true"); } - if (this.fromApiJsonHelper.parameterExists("maxInterestRatePerPeriod", element)) { - baseDataValidator.reset().parameter("maxInterestRatePerPeriod").failWithCode( + if (this.fromApiJsonHelper.parameterExists(MAX_INTEREST_RATE_PER_PERIOD, element)) { + baseDataValidator.reset().parameter(MAX_INTEREST_RATE_PER_PERIOD).failWithCode( "not.supported.when.isLinkedToFloatingInterestRates.is.true", "maxInterestRatePerPeriod param is not supported when isLinkedToFloatingInterestRates is true"); } - if (this.fromApiJsonHelper.parameterExists("interestRateFrequencyType", element)) { - baseDataValidator.reset().parameter("interestRateFrequencyType").failWithCode( + if (this.fromApiJsonHelper.parameterExists(INTEREST_RATE_FREQUENCY_TYPE, element)) { + baseDataValidator.reset().parameter(INTEREST_RATE_FREQUENCY_TYPE).failWithCode( "not.supported.when.isLinkedToFloatingInterestRates.is.true", "interestRateFrequencyType param is not supported when isLinkedToFloatingInterestRates is true"); } if ((interestType == null || !interestType.equals(InterestMethod.DECLINING_BALANCE.getValue())) || (isInterestRecalculationEnabled == null || !isInterestRecalculationEnabled)) { - baseDataValidator.reset().parameter("isLinkedToFloatingInterestRates").failWithCode( + baseDataValidator.reset().parameter(IS_LINKED_TO_FLOATING_INTEREST_RATES).failWithCode( "supported.only.for.declining.balance.interest.recalculation.enabled", "Floating interest rates are supported only for declining balance and interest recalculation enabled loan products"); } - final Integer floatingRatesId = this.fromApiJsonHelper.extractIntegerNamed("floatingRatesId", element, Locale.getDefault()); - baseDataValidator.reset().parameter("floatingRatesId").value(floatingRatesId).notNull(); + final Integer floatingRatesId = this.fromApiJsonHelper.extractIntegerNamed(FLOATING_RATES_ID, element, Locale.getDefault()); + baseDataValidator.reset().parameter(FLOATING_RATES_ID).value(floatingRatesId).notNull(); - final BigDecimal interestRateDifferential = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("interestRateDifferential", + final BigDecimal interestRateDifferential = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(INTEREST_RATE_DIFFERENTIAL, element); - baseDataValidator.reset().parameter("interestRateDifferential").value(interestRateDifferential).notNull() + baseDataValidator.reset().parameter(INTEREST_RATE_DIFFERENTIAL).value(interestRateDifferential).notNull() .zeroOrPositiveAmount(); - final String minDifferentialLendingRateParameterName = "minDifferentialLendingRate"; + final String minDifferentialLendingRateParameterName = MIN_DIFFERENTIAL_LENDING_RATE; BigDecimal minDifferentialLendingRate = this.fromApiJsonHelper .extractBigDecimalWithLocaleNamed(minDifferentialLendingRateParameterName, element); baseDataValidator.reset().parameter(minDifferentialLendingRateParameterName).value(minDifferentialLendingRate).notNull() .zeroOrPositiveAmount(); - final String defaultDifferentialLendingRateParameterName = "defaultDifferentialLendingRate"; + final String defaultDifferentialLendingRateParameterName = DEFAULT_DIFFERENTIAL_LENDING_RATE; BigDecimal defaultDifferentialLendingRate = this.fromApiJsonHelper .extractBigDecimalWithLocaleNamed(defaultDifferentialLendingRateParameterName, element); baseDataValidator.reset().parameter(defaultDifferentialLendingRateParameterName).value(defaultDifferentialLendingRate).notNull() .zeroOrPositiveAmount(); - final String maxDifferentialLendingRateParameterName = "maxDifferentialLendingRate"; + final String maxDifferentialLendingRateParameterName = MAX_DIFFERENTIAL_LENDING_RATE; BigDecimal maxDifferentialLendingRate = this.fromApiJsonHelper .extractBigDecimalWithLocaleNamed(maxDifferentialLendingRateParameterName, element); baseDataValidator.reset().parameter(maxDifferentialLendingRateParameterName).value(maxDifferentialLendingRate).notNull() .zeroOrPositiveAmount(); - if (defaultDifferentialLendingRate != null && defaultDifferentialLendingRate.compareTo(BigDecimal.ZERO) >= 0) { - if (minDifferentialLendingRate != null && minDifferentialLendingRate.compareTo(BigDecimal.ZERO) >= 0) { - baseDataValidator.reset().parameter("defaultDifferentialLendingRate").value(defaultDifferentialLendingRate) - .notLessThanMin(minDifferentialLendingRate); - } + if (defaultDifferentialLendingRate != null && defaultDifferentialLendingRate.compareTo(BigDecimal.ZERO) >= 0 + && minDifferentialLendingRate != null && minDifferentialLendingRate.compareTo(BigDecimal.ZERO) >= 0) { + baseDataValidator.reset().parameter(DEFAULT_DIFFERENTIAL_LENDING_RATE).value(defaultDifferentialLendingRate) + .notLessThanMin(minDifferentialLendingRate); } - if (maxDifferentialLendingRate != null && maxDifferentialLendingRate.compareTo(BigDecimal.ZERO) >= 0) { - if (minDifferentialLendingRate != null && minDifferentialLendingRate.compareTo(BigDecimal.ZERO) >= 0) { - baseDataValidator.reset().parameter("maxDifferentialLendingRate").value(maxDifferentialLendingRate) - .notLessThanMin(minDifferentialLendingRate); - } + if (maxDifferentialLendingRate != null && maxDifferentialLendingRate.compareTo(BigDecimal.ZERO) >= 0 + && minDifferentialLendingRate != null && minDifferentialLendingRate.compareTo(BigDecimal.ZERO) >= 0) { + baseDataValidator.reset().parameter(MAX_DIFFERENTIAL_LENDING_RATE).value(maxDifferentialLendingRate) + .notLessThanMin(minDifferentialLendingRate); } - if (maxDifferentialLendingRate != null && maxDifferentialLendingRate.compareTo(BigDecimal.ZERO) >= 0) { - if (defaultDifferentialLendingRate != null && defaultDifferentialLendingRate.compareTo(BigDecimal.ZERO) >= 0) { - baseDataValidator.reset().parameter("maxDifferentialLendingRate").value(maxDifferentialLendingRate) - .notLessThanMin(defaultDifferentialLendingRate); - } + if (maxDifferentialLendingRate != null && maxDifferentialLendingRate.compareTo(BigDecimal.ZERO) >= 0 + && defaultDifferentialLendingRate != null && defaultDifferentialLendingRate.compareTo(BigDecimal.ZERO) >= 0) { + baseDataValidator.reset().parameter(MAX_DIFFERENTIAL_LENDING_RATE).value(maxDifferentialLendingRate) + .notLessThanMin(defaultDifferentialLendingRate); } final Boolean isFloatingInterestRateCalculationAllowed = this.fromApiJsonHelper - .extractBooleanNamed("isFloatingInterestRateCalculationAllowed", element); - baseDataValidator.reset().parameter("isFloatingInterestRateCalculationAllowed").value(isFloatingInterestRateCalculationAllowed) - .notNull().isOneOfTheseValues(true, false); + .extractBooleanNamed(IS_FLOATING_INTEREST_RATE_CALCULATION_ALLOWED, element); + baseDataValidator.reset().parameter(IS_FLOATING_INTEREST_RATE_CALCULATION_ALLOWED) + .value(isFloatingInterestRateCalculationAllowed).notNull().isOneOfTheseValues(true, false); } else { - if (this.fromApiJsonHelper.parameterExists("floatingRatesId", element)) { - baseDataValidator.reset().parameter("floatingRatesId").failWithCode( + if (this.fromApiJsonHelper.parameterExists(FLOATING_RATES_ID, element)) { + baseDataValidator.reset().parameter(FLOATING_RATES_ID).failWithCode( "not.supported.when.isLinkedToFloatingInterestRates.is.false", "floatingRatesId param is not supported when isLinkedToFloatingInterestRates is not supplied or false"); } - if (this.fromApiJsonHelper.parameterExists("interestRateDifferential", element)) { - baseDataValidator.reset().parameter("interestRateDifferential").failWithCode( + if (this.fromApiJsonHelper.parameterExists(INTEREST_RATE_DIFFERENTIAL, element)) { + baseDataValidator.reset().parameter(INTEREST_RATE_DIFFERENTIAL).failWithCode( "not.supported.when.isLinkedToFloatingInterestRates.is.false", "interestRateDifferential param is not supported when isLinkedToFloatingInterestRates is not supplied or false"); } - if (this.fromApiJsonHelper.parameterExists("minDifferentialLendingRate", element)) { - baseDataValidator.reset().parameter("minDifferentialLendingRate").failWithCode( + if (this.fromApiJsonHelper.parameterExists(MIN_DIFFERENTIAL_LENDING_RATE, element)) { + baseDataValidator.reset().parameter(MIN_DIFFERENTIAL_LENDING_RATE).failWithCode( "not.supported.when.isLinkedToFloatingInterestRates.is.false", "minDifferentialLendingRate param is not supported when isLinkedToFloatingInterestRates is not supplied or false"); } - if (this.fromApiJsonHelper.parameterExists("defaultDifferentialLendingRate", element)) { - baseDataValidator.reset().parameter("defaultDifferentialLendingRate").failWithCode( + if (this.fromApiJsonHelper.parameterExists(DEFAULT_DIFFERENTIAL_LENDING_RATE, element)) { + baseDataValidator.reset().parameter(DEFAULT_DIFFERENTIAL_LENDING_RATE).failWithCode( "not.supported.when.isLinkedToFloatingInterestRates.is.false", "defaultDifferentialLendingRate param is not supported when isLinkedToFloatingInterestRates is not supplied or false"); } - if (this.fromApiJsonHelper.parameterExists("maxDifferentialLendingRate", element)) { - baseDataValidator.reset().parameter("maxDifferentialLendingRate").failWithCode( + if (this.fromApiJsonHelper.parameterExists(MAX_DIFFERENTIAL_LENDING_RATE, element)) { + baseDataValidator.reset().parameter(MAX_DIFFERENTIAL_LENDING_RATE).failWithCode( "not.supported.when.isLinkedToFloatingInterestRates.is.false", "maxDifferentialLendingRate param is not supported when isLinkedToFloatingInterestRates is not supplied or false"); } - if (this.fromApiJsonHelper.parameterExists("isFloatingInterestRateCalculationAllowed", element)) { - baseDataValidator.reset().parameter("isFloatingInterestRateCalculationAllowed").failWithCode( + if (this.fromApiJsonHelper.parameterExists(IS_FLOATING_INTEREST_RATE_CALCULATION_ALLOWED, element)) { + baseDataValidator.reset().parameter(IS_FLOATING_INTEREST_RATE_CALCULATION_ALLOWED).failWithCode( "not.supported.when.isLinkedToFloatingInterestRates.is.false", "isFloatingInterestRateCalculationAllowed param is not supported when isLinkedToFloatingInterestRates is not supplied or false"); } - final BigDecimal interestRatePerPeriod = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("interestRatePerPeriod", + final BigDecimal interestRatePerPeriod = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(INTEREST_RATE_PER_PERIOD, element); - baseDataValidator.reset().parameter("interestRatePerPeriod").value(interestRatePerPeriod).notNull().zeroOrPositiveAmount(); + baseDataValidator.reset().parameter(INTEREST_RATE_PER_PERIOD).value(interestRatePerPeriod).notNull().zeroOrPositiveAmount(); - final String minInterestRatePerPeriodParameterName = "minInterestRatePerPeriod"; + final String minInterestRatePerPeriodParameterName = MIN_INTEREST_RATE_PER_PERIOD; BigDecimal minInterestRatePerPeriod = null; if (this.fromApiJsonHelper.parameterExists(minInterestRatePerPeriodParameterName, element)) { minInterestRatePerPeriod = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(minInterestRatePerPeriodParameterName, @@ -471,7 +506,7 @@ public final class LoanProductDataValidator { .zeroOrPositiveAmount(); } - final String maxInterestRatePerPeriodParameterName = "maxInterestRatePerPeriod"; + final String maxInterestRatePerPeriodParameterName = MAX_INTEREST_RATE_PER_PERIOD; BigDecimal maxInterestRatePerPeriod = null; if (this.fromApiJsonHelper.parameterExists(maxInterestRatePerPeriodParameterName, element)) { maxInterestRatePerPeriod = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(maxInterestRatePerPeriodParameterName, @@ -485,21 +520,22 @@ public final class LoanProductDataValidator { baseDataValidator.reset().parameter(maxInterestRatePerPeriodParameterName).value(maxInterestRatePerPeriod) .notLessThanMin(minInterestRatePerPeriod); if (minInterestRatePerPeriod.compareTo(maxInterestRatePerPeriod) <= 0) { - baseDataValidator.reset().parameter("interestRatePerPeriod").value(interestRatePerPeriod) + baseDataValidator.reset().parameter(INTEREST_RATE_PER_PERIOD).value(interestRatePerPeriod) .inMinAndMaxAmountRange(minInterestRatePerPeriod, maxInterestRatePerPeriod); } } else { - baseDataValidator.reset().parameter("interestRatePerPeriod").value(interestRatePerPeriod) + baseDataValidator.reset().parameter(INTEREST_RATE_PER_PERIOD).value(interestRatePerPeriod) .notGreaterThanMax(maxInterestRatePerPeriod); } } else if (minInterestRatePerPeriod != null && minInterestRatePerPeriod.compareTo(BigDecimal.ZERO) >= 0) { - baseDataValidator.reset().parameter("interestRatePerPeriod").value(interestRatePerPeriod) + baseDataValidator.reset().parameter(INTEREST_RATE_PER_PERIOD).value(interestRatePerPeriod) .notLessThanMin(minInterestRatePerPeriod); } - final Integer interestRateFrequencyType = this.fromApiJsonHelper.extractIntegerNamed("interestRateFrequencyType", element, + final Integer interestRateFrequencyType = this.fromApiJsonHelper.extractIntegerNamed(INTEREST_RATE_FREQUENCY_TYPE, element, Locale.getDefault()); - baseDataValidator.reset().parameter("interestRateFrequencyType").value(interestRateFrequencyType).notNull().inMinMaxRange(0, 4); + baseDataValidator.reset().parameter(INTEREST_RATE_FREQUENCY_TYPE).value(interestRateFrequencyType).notNull().inMinMaxRange(0, + 4); } // Guarantee Funds @@ -510,10 +546,8 @@ public final class LoanProductDataValidator { .isOneOfTheseValues(true, false); } - if (holdGuaranteeFunds != null) { - if (holdGuaranteeFunds) { - validateGuaranteeParams(element, baseDataValidator, null); - } + if (holdGuaranteeFunds != null && holdGuaranteeFunds) { + validateGuaranteeParams(element, baseDataValidator, null); } BigDecimal principalThresholdForLastInstallment = this.fromApiJsonHelper @@ -548,8 +582,8 @@ public final class LoanProductDataValidator { } // accounting related data validation - final Integer accountingRuleType = this.fromApiJsonHelper.extractIntegerNamed("accountingRule", element, Locale.getDefault()); - baseDataValidator.reset().parameter("accountingRule").value(accountingRuleType).notNull().inMinMaxRange(1, 4); + final Integer accountingRuleType = this.fromApiJsonHelper.extractIntegerNamed(ACCOUNTING_RULE, element, Locale.getDefault()); + baseDataValidator.reset().parameter(ACCOUNTING_RULE).value(accountingRuleType).notNull().inMinMaxRange(1, 4); if (isCashBasedAccounting(accountingRuleType) || isAccrualBasedAccounting(accountingRuleType)) { @@ -708,11 +742,11 @@ public final class LoanProductDataValidator { // Validate that parameter names are allowed Set supportedConfigurableAttributes = new HashSet<>(); - Collections.addAll(supportedConfigurableAttributes, supportedLoanConfigurableAttributes); + Collections.addAll(supportedConfigurableAttributes, SUPPORTED_LOAN_CONFIGURABLE_ATTRIBUTES); this.fromApiJsonHelper.checkForUnsupportedNestedParameters(LoanProductConstants.allowAttributeOverridesParamName, object, supportedConfigurableAttributes); - for (String supportedLoanConfigurableAttribute : supportedLoanConfigurableAttributes) { + for (String supportedLoanConfigurableAttribute : SUPPORTED_LOAN_CONFIGURABLE_ATTRIBUTES) { /* Validate the attribute names */ if (this.fromApiJsonHelper.parameterExists(supportedLoanConfigurableAttribute, object)) { Boolean loanConfigurationAttributeValue = this.fromApiJsonHelper.extractBooleanNamed(supportedLoanConfigurableAttribute, @@ -756,13 +790,13 @@ public final class LoanProductDataValidator { baseDataValidator.reset().parameter(LoanProductConstants.MAX_TRANCHE_COUNT_PARAMETER_NAME).value(maxTrancheCount).notNull() .integerGreaterThanZero(); - final Integer interestType = this.fromApiJsonHelper.extractIntegerNamed("interestType", element, Locale.getDefault()); - baseDataValidator.reset().parameter("interestType").value(interestType).ignoreIfNull() + final Integer interestType = this.fromApiJsonHelper.extractIntegerNamed(INTEREST_TYPE, element, Locale.getDefault()); + baseDataValidator.reset().parameter(INTEREST_TYPE).value(interestType).ignoreIfNull() .integerSameAsNumber(InterestMethod.DECLINING_BALANCE.getValue()); } - final String overAppliedCalculationType = this.fromApiJsonHelper.extractStringNamed("overAppliedCalculationType", element); - baseDataValidator.reset().parameter("overAppliedCalculationType").value(overAppliedCalculationType).notExceedingLengthOf(10); + final String overAppliedCalculationType = this.fromApiJsonHelper.extractStringNamed(OVER_APPLIED_CALCULATION_TYPE, element); + baseDataValidator.reset().parameter(OVER_APPLIED_CALCULATION_TYPE).value(overAppliedCalculationType).notExceedingLengthOf(10); } private void validateInterestRecalculationParams(final JsonElement element, final DataValidatorBuilder baseDataValidator, @@ -856,8 +890,8 @@ public final class LoanProductDataValidator { compoundingFrequencyType = RecalculationFrequencyType.fromInt(recalculationCompoundingFrequencyType); if (!compoundingFrequencyType.isSameAsRepayment()) { PeriodFrequencyType repaymentFrequencyType = null; - if (this.fromApiJsonHelper.parameterExists("repaymentFrequencyType", element)) { - Integer repaymentFrequencyTypeVal = this.fromApiJsonHelper.extractIntegerNamed("repaymentFrequencyType", + if (this.fromApiJsonHelper.parameterExists(REPAYMENT_FREQUENCY_TYPE, element)) { + Integer repaymentFrequencyTypeVal = this.fromApiJsonHelper.extractIntegerNamed(REPAYMENT_FREQUENCY_TYPE, element, Locale.getDefault()); repaymentFrequencyType = PeriodFrequencyType.fromInt(repaymentFrequencyTypeVal); } else if (loanProduct != null) { @@ -886,7 +920,7 @@ public final class LoanProductDataValidator { LoanProductConstants.recalculationCompoundingFrequencyIntervalParameterName, element, Locale.getDefault()); Integer repaymentEvery = null; if (loanProduct == null) { - repaymentEvery = this.fromApiJsonHelper.extractIntegerWithLocaleNamed("repaymentEvery", element); + repaymentEvery = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(REPAYMENT_EVERY, element); } else { repaymentEvery = loanProduct.getLoanProductRelatedDetail().getRepayEvery(); } @@ -939,15 +973,15 @@ public final class LoanProductDataValidator { } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("loanproduct"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(LOANPRODUCT); final JsonElement element = this.fromApiJsonHelper.parse(json); - if (this.fromApiJsonHelper.parameterExists("name", element)) { - final String name = this.fromApiJsonHelper.extractStringNamed("name", element); - baseDataValidator.reset().parameter("name").value(name).notBlank().notExceedingLengthOf(100); + if (this.fromApiJsonHelper.parameterExists(NAME, element)) { + final String name = this.fromApiJsonHelper.extractStringNamed(NAME, element); + baseDataValidator.reset().parameter(NAME).value(name).notBlank().notExceedingLengthOf(100); } if (this.fromApiJsonHelper.parameterExists(LoanProductConstants.SHORT_NAME, element)) { @@ -955,116 +989,116 @@ public final class LoanProductDataValidator { baseDataValidator.reset().parameter(LoanProductConstants.SHORT_NAME).value(shortName).notBlank().notExceedingLengthOf(4); } - if (this.fromApiJsonHelper.parameterExists("description", element)) { - final String description = this.fromApiJsonHelper.extractStringNamed("description", element); - baseDataValidator.reset().parameter("description").value(description).notExceedingLengthOf(500); + if (this.fromApiJsonHelper.parameterExists(DESCRIPTION, element)) { + final String description = this.fromApiJsonHelper.extractStringNamed(DESCRIPTION, element); + baseDataValidator.reset().parameter(DESCRIPTION).value(description).notExceedingLengthOf(500); } - if (this.fromApiJsonHelper.parameterExists("fundId", element)) { - final Long fundId = this.fromApiJsonHelper.extractLongNamed("fundId", element); - baseDataValidator.reset().parameter("fundId").value(fundId).ignoreIfNull().integerGreaterThanZero(); + if (this.fromApiJsonHelper.parameterExists(FUND_ID, element)) { + final Long fundId = this.fromApiJsonHelper.extractLongNamed(FUND_ID, element); + baseDataValidator.reset().parameter(FUND_ID).value(fundId).ignoreIfNull().integerGreaterThanZero(); } - if (this.fromApiJsonHelper.parameterExists("includeInBorrowerCycle", element)) { - final Boolean includeInBorrowerCycle = this.fromApiJsonHelper.extractBooleanNamed("includeInBorrowerCycle", element); - baseDataValidator.reset().parameter("includeInBorrowerCycle").value(includeInBorrowerCycle).ignoreIfNull() + if (this.fromApiJsonHelper.parameterExists(INCLUDE_IN_BORROWER_CYCLE, element)) { + final Boolean includeInBorrowerCycle = this.fromApiJsonHelper.extractBooleanNamed(INCLUDE_IN_BORROWER_CYCLE, element); + baseDataValidator.reset().parameter(INCLUDE_IN_BORROWER_CYCLE).value(includeInBorrowerCycle).ignoreIfNull() .validateForBooleanValue(); } - if (this.fromApiJsonHelper.parameterExists("currencyCode", element)) { - final String currencyCode = this.fromApiJsonHelper.extractStringNamed("currencyCode", element); - baseDataValidator.reset().parameter("currencyCode").value(currencyCode).notBlank().notExceedingLengthOf(3); + if (this.fromApiJsonHelper.parameterExists(CURRENCY_CODE, element)) { + final String currencyCode = this.fromApiJsonHelper.extractStringNamed(CURRENCY_CODE, element); + baseDataValidator.reset().parameter(CURRENCY_CODE).value(currencyCode).notBlank().notExceedingLengthOf(3); } - if (this.fromApiJsonHelper.parameterExists("digitsAfterDecimal", element)) { - final Integer digitsAfterDecimal = this.fromApiJsonHelper.extractIntegerNamed("digitsAfterDecimal", element, + if (this.fromApiJsonHelper.parameterExists(DIGITS_AFTER_DECIMAL, element)) { + final Integer digitsAfterDecimal = this.fromApiJsonHelper.extractIntegerNamed(DIGITS_AFTER_DECIMAL, element, Locale.getDefault()); - baseDataValidator.reset().parameter("digitsAfterDecimal").value(digitsAfterDecimal).notNull().inMinMaxRange(0, 6); + baseDataValidator.reset().parameter(DIGITS_AFTER_DECIMAL).value(digitsAfterDecimal).notNull().inMinMaxRange(0, 6); } - if (this.fromApiJsonHelper.parameterExists("inMultiplesOf", element)) { - final Integer inMultiplesOf = this.fromApiJsonHelper.extractIntegerNamed("inMultiplesOf", element, Locale.getDefault()); - baseDataValidator.reset().parameter("inMultiplesOf").value(inMultiplesOf).ignoreIfNull().integerZeroOrGreater(); + if (this.fromApiJsonHelper.parameterExists(IN_MULTIPLES_OF, element)) { + final Integer inMultiplesOf = this.fromApiJsonHelper.extractIntegerNamed(IN_MULTIPLES_OF, element, Locale.getDefault()); + baseDataValidator.reset().parameter(IN_MULTIPLES_OF).value(inMultiplesOf).ignoreIfNull().integerZeroOrGreater(); } - final String minPrincipalParameterName = "minPrincipal"; - BigDecimal minPrincipalAmount = null; + final String minPrincipalParameterName = MIN_PRINCIPAL; + BigDecimal minPrincipalAmount; if (this.fromApiJsonHelper.parameterExists(minPrincipalParameterName, element)) { minPrincipalAmount = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(minPrincipalParameterName, element); baseDataValidator.reset().parameter(minPrincipalParameterName).value(minPrincipalAmount).ignoreIfNull().positiveAmount(); } - final String maxPrincipalParameterName = "maxPrincipal"; - BigDecimal maxPrincipalAmount = null; + final String maxPrincipalParameterName = MAX_PRINCIPAL; + BigDecimal maxPrincipalAmount; if (this.fromApiJsonHelper.parameterExists(maxPrincipalParameterName, element)) { maxPrincipalAmount = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(maxPrincipalParameterName, element); baseDataValidator.reset().parameter(maxPrincipalParameterName).value(maxPrincipalAmount).ignoreIfNull().positiveAmount(); } - if (this.fromApiJsonHelper.parameterExists("principal", element)) { - final BigDecimal principal = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("principal", element); - baseDataValidator.reset().parameter("principal").value(principal).positiveAmount(); + if (this.fromApiJsonHelper.parameterExists(PRINCIPAL, element)) { + final BigDecimal principal = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(PRINCIPAL, element); + baseDataValidator.reset().parameter(PRINCIPAL).value(principal).positiveAmount(); } - if (this.fromApiJsonHelper.parameterExists("inArrearsTolerance", element)) { - final BigDecimal inArrearsTolerance = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("inArrearsTolerance", element); - baseDataValidator.reset().parameter("inArrearsTolerance").value(inArrearsTolerance).ignoreIfNull().zeroOrPositiveAmount(); + if (this.fromApiJsonHelper.parameterExists(IN_ARREARS_TOLERANCE, element)) { + final BigDecimal inArrearsTolerance = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(IN_ARREARS_TOLERANCE, element); + baseDataValidator.reset().parameter(IN_ARREARS_TOLERANCE).value(inArrearsTolerance).ignoreIfNull().zeroOrPositiveAmount(); } - final String minNumberOfRepaymentsParameterName = "minNumberOfRepayments"; - Integer minNumberOfRepayments = null; + final String minNumberOfRepaymentsParameterName = MIN_NUMBER_OF_REPAYMENTS; + Integer minNumberOfRepayments; if (this.fromApiJsonHelper.parameterExists(minNumberOfRepaymentsParameterName, element)) { minNumberOfRepayments = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(minNumberOfRepaymentsParameterName, element); baseDataValidator.reset().parameter(minNumberOfRepaymentsParameterName).value(minNumberOfRepayments).ignoreIfNull() .integerGreaterThanZero(); } - final String maxNumberOfRepaymentsParameterName = "maxNumberOfRepayments"; - Integer maxNumberOfRepayments = null; + final String maxNumberOfRepaymentsParameterName = MAX_NUMBER_OF_REPAYMENTS; + Integer maxNumberOfRepayments; if (this.fromApiJsonHelper.parameterExists(maxNumberOfRepaymentsParameterName, element)) { maxNumberOfRepayments = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(maxNumberOfRepaymentsParameterName, element); baseDataValidator.reset().parameter(maxNumberOfRepaymentsParameterName).value(maxNumberOfRepayments).ignoreIfNull() .integerGreaterThanZero(); } - if (this.fromApiJsonHelper.parameterExists("numberOfRepayments", element)) { - final Integer numberOfRepayments = this.fromApiJsonHelper.extractIntegerWithLocaleNamed("numberOfRepayments", element); - baseDataValidator.reset().parameter("numberOfRepayments").value(numberOfRepayments).notNull().integerGreaterThanZero(); + if (this.fromApiJsonHelper.parameterExists(NUMBER_OF_REPAYMENTS, element)) { + final Integer numberOfRepayments = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(NUMBER_OF_REPAYMENTS, element); + baseDataValidator.reset().parameter(NUMBER_OF_REPAYMENTS).value(numberOfRepayments).notNull().integerGreaterThanZero(); } - if (this.fromApiJsonHelper.parameterExists("repaymentEvery", element)) { - final Integer repaymentEvery = this.fromApiJsonHelper.extractIntegerWithLocaleNamed("repaymentEvery", element); - baseDataValidator.reset().parameter("repaymentEvery").value(repaymentEvery).notNull().integerGreaterThanZero(); + if (this.fromApiJsonHelper.parameterExists(REPAYMENT_EVERY, element)) { + final Integer repaymentEvery = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(REPAYMENT_EVERY, element); + baseDataValidator.reset().parameter(REPAYMENT_EVERY).value(repaymentEvery).notNull().integerGreaterThanZero(); } - if (this.fromApiJsonHelper.parameterExists("repaymentFrequencyType", element)) { - final Integer repaymentFrequencyType = this.fromApiJsonHelper.extractIntegerNamed("repaymentFrequencyType", element, + if (this.fromApiJsonHelper.parameterExists(REPAYMENT_FREQUENCY_TYPE, element)) { + final Integer repaymentFrequencyType = this.fromApiJsonHelper.extractIntegerNamed(REPAYMENT_FREQUENCY_TYPE, element, Locale.getDefault()); - baseDataValidator.reset().parameter("repaymentFrequencyType").value(repaymentFrequencyType).notNull().inMinMaxRange(0, 3); + baseDataValidator.reset().parameter(REPAYMENT_FREQUENCY_TYPE).value(repaymentFrequencyType).notNull().inMinMaxRange(0, 3); } - if (this.fromApiJsonHelper.parameterExists("transactionProcessingStrategyId", element)) { - final Long transactionProcessingStrategyId = this.fromApiJsonHelper.extractLongNamed("transactionProcessingStrategyId", + if (this.fromApiJsonHelper.parameterExists(TRANSACTION_PROCESSING_STRATEGY_ID, element)) { + final Long transactionProcessingStrategyId = this.fromApiJsonHelper.extractLongNamed(TRANSACTION_PROCESSING_STRATEGY_ID, element); - baseDataValidator.reset().parameter("transactionProcessingStrategyId").value(transactionProcessingStrategyId).notNull() + baseDataValidator.reset().parameter(TRANSACTION_PROCESSING_STRATEGY_ID).value(transactionProcessingStrategyId).notNull() .integerGreaterThanZero(); } // grace validation - if (this.fromApiJsonHelper.parameterExists("graceOnPrincipalPayment", element)) { - final Integer graceOnPrincipalPayment = this.fromApiJsonHelper.extractIntegerWithLocaleNamed("graceOnPrincipalPayment", + if (this.fromApiJsonHelper.parameterExists(GRACE_ON_PRINCIPAL_PAYMENT, element)) { + final Integer graceOnPrincipalPayment = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(GRACE_ON_PRINCIPAL_PAYMENT, element); - baseDataValidator.reset().parameter("graceOnPrincipalPayment").value(graceOnPrincipalPayment).zeroOrPositiveAmount(); + baseDataValidator.reset().parameter(GRACE_ON_PRINCIPAL_PAYMENT).value(graceOnPrincipalPayment).zeroOrPositiveAmount(); } - if (this.fromApiJsonHelper.parameterExists("graceOnInterestPayment", element)) { - final Integer graceOnInterestPayment = this.fromApiJsonHelper.extractIntegerWithLocaleNamed("graceOnInterestPayment", element); - baseDataValidator.reset().parameter("graceOnInterestPayment").value(graceOnInterestPayment).zeroOrPositiveAmount(); + if (this.fromApiJsonHelper.parameterExists(GRACE_ON_INTEREST_PAYMENT, element)) { + final Integer graceOnInterestPayment = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(GRACE_ON_INTEREST_PAYMENT, element); + baseDataValidator.reset().parameter(GRACE_ON_INTEREST_PAYMENT).value(graceOnInterestPayment).zeroOrPositiveAmount(); } - if (this.fromApiJsonHelper.parameterExists("graceOnInterestCharged", element)) { - final Integer graceOnInterestCharged = this.fromApiJsonHelper.extractIntegerWithLocaleNamed("graceOnInterestCharged", element); - baseDataValidator.reset().parameter("graceOnInterestCharged").value(graceOnInterestCharged).zeroOrPositiveAmount(); + if (this.fromApiJsonHelper.parameterExists(GRACE_ON_INTEREST_CHARGED, element)) { + final Integer graceOnInterestCharged = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(GRACE_ON_INTEREST_CHARGED, element); + baseDataValidator.reset().parameter(GRACE_ON_INTEREST_CHARGED).value(graceOnInterestCharged).zeroOrPositiveAmount(); } if (this.fromApiJsonHelper.parameterExists(LoanProductConstants.GRACE_ON_ARREARS_AGEING_PARAMETER_NAME, element)) { @@ -1089,20 +1123,20 @@ public final class LoanProductDataValidator { } Integer amortizationType = null; - if (this.fromApiJsonHelper.parameterExists("amortizationType", element)) { - amortizationType = this.fromApiJsonHelper.extractIntegerNamed("amortizationType", element, Locale.getDefault()); - baseDataValidator.reset().parameter("amortizationType").value(amortizationType).notNull().inMinMaxRange(0, 1); + if (this.fromApiJsonHelper.parameterExists(AMORTIZATION_TYPE, element)) { + amortizationType = this.fromApiJsonHelper.extractIntegerNamed(AMORTIZATION_TYPE, element, Locale.getDefault()); + baseDataValidator.reset().parameter(AMORTIZATION_TYPE).value(amortizationType).notNull().inMinMaxRange(0, 1); } - if (this.fromApiJsonHelper.parameterExists("interestType", element)) { - final Integer interestType = this.fromApiJsonHelper.extractIntegerNamed("interestType", element, Locale.getDefault()); - baseDataValidator.reset().parameter("interestType").value(interestType).notNull().inMinMaxRange(0, 1); + if (this.fromApiJsonHelper.parameterExists(INTEREST_TYPE, element)) { + final Integer interestType = this.fromApiJsonHelper.extractIntegerNamed(INTEREST_TYPE, element, Locale.getDefault()); + baseDataValidator.reset().parameter(INTEREST_TYPE).value(interestType).notNull().inMinMaxRange(0, 1); } Integer interestCalculationPeriodType = loanProduct.getLoanProductRelatedDetail().getInterestCalculationPeriodMethod().getValue(); - if (this.fromApiJsonHelper.parameterExists("interestCalculationPeriodType", element)) { - interestCalculationPeriodType = this.fromApiJsonHelper.extractIntegerNamed("interestCalculationPeriodType", element, + if (this.fromApiJsonHelper.parameterExists(INTEREST_CALCULATION_PERIOD_TYPE, element)) { + interestCalculationPeriodType = this.fromApiJsonHelper.extractIntegerNamed(INTEREST_CALCULATION_PERIOD_TYPE, element, Locale.getDefault()); - baseDataValidator.reset().parameter("interestCalculationPeriodType").value(interestCalculationPeriodType).notNull() + baseDataValidator.reset().parameter(INTEREST_CALCULATION_PERIOD_TYPE).value(interestCalculationPeriodType).notNull() .inMinMaxRange(0, 1); } @@ -1144,73 +1178,71 @@ public final class LoanProductDataValidator { .value(isInterestRecalculationEnabled).notNull().isOneOfTheseValues(true, false); } - if (isInterestRecalculationEnabled != null) { - if (isInterestRecalculationEnabled) { - if (isEqualAmortization) { - throw new EqualAmortizationUnsupportedFeatureException("interest.recalculation", "interest recalculation"); - } - validateInterestRecalculationParams(element, baseDataValidator, loanProduct); + if (isInterestRecalculationEnabled != null && isInterestRecalculationEnabled) { + if (isEqualAmortization) { + throw new EqualAmortizationUnsupportedFeatureException("interest.recalculation", "interest recalculation"); } + validateInterestRecalculationParams(element, baseDataValidator, loanProduct); } // interest rates boolean isLinkedToFloatingInterestRates = loanProduct.isLinkedToFloatingInterestRate(); - if (this.fromApiJsonHelper.parameterExists("isLinkedToFloatingInterestRates", element)) { - isLinkedToFloatingInterestRates = this.fromApiJsonHelper.extractBooleanNamed("isLinkedToFloatingInterestRates", element); + if (this.fromApiJsonHelper.parameterExists(IS_LINKED_TO_FLOATING_INTEREST_RATES, element)) { + isLinkedToFloatingInterestRates = this.fromApiJsonHelper.extractBooleanNamed(IS_LINKED_TO_FLOATING_INTEREST_RATES, element); } if (isLinkedToFloatingInterestRates) { if (isEqualAmortization) { throw new EqualAmortizationUnsupportedFeatureException("floating.interest.rate", "floating interest rate"); } - if (this.fromApiJsonHelper.parameterExists("interestRatePerPeriod", element)) { - baseDataValidator.reset().parameter("interestRatePerPeriod").failWithCode( + if (this.fromApiJsonHelper.parameterExists(INTEREST_RATE_PER_PERIOD, element)) { + baseDataValidator.reset().parameter(INTEREST_RATE_PER_PERIOD).failWithCode( "not.supported.when.isLinkedToFloatingInterestRates.is.true", "interestRatePerPeriod param is not supported when isLinkedToFloatingInterestRates is true"); } - if (this.fromApiJsonHelper.parameterExists("minInterestRatePerPeriod", element)) { - baseDataValidator.reset().parameter("minInterestRatePerPeriod").failWithCode( + if (this.fromApiJsonHelper.parameterExists(MIN_INTEREST_RATE_PER_PERIOD, element)) { + baseDataValidator.reset().parameter(MIN_INTEREST_RATE_PER_PERIOD).failWithCode( "not.supported.when.isLinkedToFloatingInterestRates.is.true", "minInterestRatePerPeriod param is not supported when isLinkedToFloatingInterestRates is true"); } - if (this.fromApiJsonHelper.parameterExists("maxInterestRatePerPeriod", element)) { - baseDataValidator.reset().parameter("maxInterestRatePerPeriod").failWithCode( + if (this.fromApiJsonHelper.parameterExists(MAX_INTEREST_RATE_PER_PERIOD, element)) { + baseDataValidator.reset().parameter(MAX_INTEREST_RATE_PER_PERIOD).failWithCode( "not.supported.when.isLinkedToFloatingInterestRates.is.true", "maxInterestRatePerPeriod param is not supported when isLinkedToFloatingInterestRates is true"); } - if (this.fromApiJsonHelper.parameterExists("interestRateFrequencyType", element)) { - baseDataValidator.reset().parameter("interestRateFrequencyType").failWithCode( + if (this.fromApiJsonHelper.parameterExists(INTEREST_RATE_FREQUENCY_TYPE, element)) { + baseDataValidator.reset().parameter(INTEREST_RATE_FREQUENCY_TYPE).failWithCode( "not.supported.when.isLinkedToFloatingInterestRates.is.true", "interestRateFrequencyType param is not supported when isLinkedToFloatingInterestRates is true"); } - Integer interestType = this.fromApiJsonHelper.parameterExists("interestType", element) - ? this.fromApiJsonHelper.extractIntegerNamed("interestType", element, Locale.getDefault()) + Integer interestType = this.fromApiJsonHelper.parameterExists(INTEREST_TYPE, element) + ? this.fromApiJsonHelper.extractIntegerNamed(INTEREST_TYPE, element, Locale.getDefault()) : loanProduct.getLoanProductRelatedDetail().getInterestMethod().getValue(); if ((interestType == null || !interestType.equals(InterestMethod.DECLINING_BALANCE.getValue())) || (isInterestRecalculationEnabled == null || !isInterestRecalculationEnabled)) { - baseDataValidator.reset().parameter("isLinkedToFloatingInterestRates").failWithCode( + baseDataValidator.reset().parameter(IS_LINKED_TO_FLOATING_INTEREST_RATES).failWithCode( "supported.only.for.declining.balance.interest.recalculation.enabled", "Floating interest rates are supported only for declining balance and interest recalculation enabled loan products"); } Long floatingRatesId = loanProduct.getFloatingRates() == null ? null : loanProduct.getFloatingRates().getFloatingRate().getId(); - if (this.fromApiJsonHelper.parameterExists("floatingRatesId", element)) { - floatingRatesId = this.fromApiJsonHelper.extractLongNamed("floatingRatesId", element); + if (this.fromApiJsonHelper.parameterExists(FLOATING_RATES_ID, element)) { + floatingRatesId = this.fromApiJsonHelper.extractLongNamed(FLOATING_RATES_ID, element); } - baseDataValidator.reset().parameter("floatingRatesId").value(floatingRatesId).notNull(); + baseDataValidator.reset().parameter(FLOATING_RATES_ID).value(floatingRatesId).notNull(); BigDecimal interestRateDifferential = loanProduct.getFloatingRates() == null ? null : loanProduct.getFloatingRates().getInterestRateDifferential(); - if (this.fromApiJsonHelper.parameterExists("interestRateDifferential", element)) { - interestRateDifferential = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("interestRateDifferential", element); + if (this.fromApiJsonHelper.parameterExists(INTEREST_RATE_DIFFERENTIAL, element)) { + interestRateDifferential = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(INTEREST_RATE_DIFFERENTIAL, element); } - baseDataValidator.reset().parameter("interestRateDifferential").value(interestRateDifferential).notNull() + baseDataValidator.reset().parameter(INTEREST_RATE_DIFFERENTIAL).value(interestRateDifferential).notNull() .zeroOrPositiveAmount(); - final String minDifferentialLendingRateParameterName = "minDifferentialLendingRate"; + final String minDifferentialLendingRateParameterName = MIN_DIFFERENTIAL_LENDING_RATE; BigDecimal minDifferentialLendingRate = loanProduct.getFloatingRates() == null ? null : loanProduct.getFloatingRates().getMinDifferentialLendingRate(); if (this.fromApiJsonHelper.parameterExists(minDifferentialLendingRateParameterName, element)) { @@ -1220,7 +1252,7 @@ public final class LoanProductDataValidator { baseDataValidator.reset().parameter(minDifferentialLendingRateParameterName).value(minDifferentialLendingRate).notNull() .zeroOrPositiveAmount(); - final String defaultDifferentialLendingRateParameterName = "defaultDifferentialLendingRate"; + final String defaultDifferentialLendingRateParameterName = DEFAULT_DIFFERENTIAL_LENDING_RATE; BigDecimal defaultDifferentialLendingRate = loanProduct.getFloatingRates() == null ? null : loanProduct.getFloatingRates().getDefaultDifferentialLendingRate(); if (this.fromApiJsonHelper.parameterExists(defaultDifferentialLendingRateParameterName, element)) { @@ -1230,7 +1262,7 @@ public final class LoanProductDataValidator { baseDataValidator.reset().parameter(defaultDifferentialLendingRateParameterName).value(defaultDifferentialLendingRate).notNull() .zeroOrPositiveAmount(); - final String maxDifferentialLendingRateParameterName = "maxDifferentialLendingRate"; + final String maxDifferentialLendingRateParameterName = MAX_DIFFERENTIAL_LENDING_RATE; BigDecimal maxDifferentialLendingRate = loanProduct.getFloatingRates() == null ? null : loanProduct.getFloatingRates().getMaxDifferentialLendingRate(); if (this.fromApiJsonHelper.parameterExists(maxDifferentialLendingRateParameterName, element)) { @@ -1240,73 +1272,70 @@ public final class LoanProductDataValidator { baseDataValidator.reset().parameter(maxDifferentialLendingRateParameterName).value(maxDifferentialLendingRate).notNull() .zeroOrPositiveAmount(); - if (defaultDifferentialLendingRate != null && defaultDifferentialLendingRate.compareTo(BigDecimal.ZERO) >= 0) { - if (minDifferentialLendingRate != null && minDifferentialLendingRate.compareTo(BigDecimal.ZERO) >= 0) { - baseDataValidator.reset().parameter("defaultDifferentialLendingRate").value(defaultDifferentialLendingRate) - .notLessThanMin(minDifferentialLendingRate); - } + if (defaultDifferentialLendingRate != null && defaultDifferentialLendingRate.compareTo(BigDecimal.ZERO) >= 0 + && minDifferentialLendingRate != null && minDifferentialLendingRate.compareTo(BigDecimal.ZERO) >= 0) { + baseDataValidator.reset().parameter(DEFAULT_DIFFERENTIAL_LENDING_RATE).value(defaultDifferentialLendingRate) + .notLessThanMin(minDifferentialLendingRate); } - if (maxDifferentialLendingRate != null && maxDifferentialLendingRate.compareTo(BigDecimal.ZERO) >= 0) { - if (minDifferentialLendingRate != null && minDifferentialLendingRate.compareTo(BigDecimal.ZERO) >= 0) { - baseDataValidator.reset().parameter("maxDifferentialLendingRate").value(maxDifferentialLendingRate) - .notLessThanMin(minDifferentialLendingRate); - } + if (maxDifferentialLendingRate != null && maxDifferentialLendingRate.compareTo(BigDecimal.ZERO) >= 0 + && minDifferentialLendingRate != null && minDifferentialLendingRate.compareTo(BigDecimal.ZERO) >= 0) { + baseDataValidator.reset().parameter(MAX_DIFFERENTIAL_LENDING_RATE).value(maxDifferentialLendingRate) + .notLessThanMin(minDifferentialLendingRate); } - if (maxDifferentialLendingRate != null && maxDifferentialLendingRate.compareTo(BigDecimal.ZERO) >= 0) { - if (defaultDifferentialLendingRate != null && defaultDifferentialLendingRate.compareTo(BigDecimal.ZERO) >= 0) { - baseDataValidator.reset().parameter("maxDifferentialLendingRate").value(maxDifferentialLendingRate) - .notLessThanMin(defaultDifferentialLendingRate); - } + if (maxDifferentialLendingRate != null && maxDifferentialLendingRate.compareTo(BigDecimal.ZERO) >= 0 + && defaultDifferentialLendingRate != null && defaultDifferentialLendingRate.compareTo(BigDecimal.ZERO) >= 0) { + baseDataValidator.reset().parameter(MAX_DIFFERENTIAL_LENDING_RATE).value(maxDifferentialLendingRate) + .notLessThanMin(defaultDifferentialLendingRate); } Boolean isFloatingInterestRateCalculationAllowed = loanProduct.getFloatingRates() == null ? null : loanProduct.getFloatingRates().isFloatingInterestRateCalculationAllowed(); - if (this.fromApiJsonHelper.parameterExists("isFloatingInterestRateCalculationAllowed", element)) { + if (this.fromApiJsonHelper.parameterExists(IS_FLOATING_INTEREST_RATE_CALCULATION_ALLOWED, element)) { isFloatingInterestRateCalculationAllowed = this.fromApiJsonHelper - .extractBooleanNamed("isFloatingInterestRateCalculationAllowed", element); + .extractBooleanNamed(IS_FLOATING_INTEREST_RATE_CALCULATION_ALLOWED, element); } - baseDataValidator.reset().parameter("isFloatingInterestRateCalculationAllowed").value(isFloatingInterestRateCalculationAllowed) - .notNull().isOneOfTheseValues(true, false); + baseDataValidator.reset().parameter(IS_FLOATING_INTEREST_RATE_CALCULATION_ALLOWED) + .value(isFloatingInterestRateCalculationAllowed).notNull().isOneOfTheseValues(true, false); } else { - if (this.fromApiJsonHelper.parameterExists("floatingRatesId", element)) { - baseDataValidator.reset().parameter("floatingRatesId").failWithCode( + if (this.fromApiJsonHelper.parameterExists(FLOATING_RATES_ID, element)) { + baseDataValidator.reset().parameter(FLOATING_RATES_ID).failWithCode( "not.supported.when.isLinkedToFloatingInterestRates.is.false", "floatingRatesId param is not supported when isLinkedToFloatingInterestRates is not supplied or false"); } - if (this.fromApiJsonHelper.parameterExists("interestRateDifferential", element)) { - baseDataValidator.reset().parameter("interestRateDifferential").failWithCode( + if (this.fromApiJsonHelper.parameterExists(INTEREST_RATE_DIFFERENTIAL, element)) { + baseDataValidator.reset().parameter(INTEREST_RATE_DIFFERENTIAL).failWithCode( "not.supported.when.isLinkedToFloatingInterestRates.is.false", "interestRateDifferential param is not supported when isLinkedToFloatingInterestRates is not supplied or false"); } - if (this.fromApiJsonHelper.parameterExists("minDifferentialLendingRate", element)) { - baseDataValidator.reset().parameter("minDifferentialLendingRate").failWithCode( + if (this.fromApiJsonHelper.parameterExists(MIN_DIFFERENTIAL_LENDING_RATE, element)) { + baseDataValidator.reset().parameter(MIN_DIFFERENTIAL_LENDING_RATE).failWithCode( "not.supported.when.isLinkedToFloatingInterestRates.is.false", "minDifferentialLendingRate param is not supported when isLinkedToFloatingInterestRates is not supplied or false"); } - if (this.fromApiJsonHelper.parameterExists("defaultDifferentialLendingRate", element)) { - baseDataValidator.reset().parameter("defaultDifferentialLendingRate").failWithCode( + if (this.fromApiJsonHelper.parameterExists(DEFAULT_DIFFERENTIAL_LENDING_RATE, element)) { + baseDataValidator.reset().parameter(DEFAULT_DIFFERENTIAL_LENDING_RATE).failWithCode( "not.supported.when.isLinkedToFloatingInterestRates.is.false", "defaultDifferentialLendingRate param is not supported when isLinkedToFloatingInterestRates is not supplied or false"); } - if (this.fromApiJsonHelper.parameterExists("maxDifferentialLendingRate", element)) { - baseDataValidator.reset().parameter("maxDifferentialLendingRate").failWithCode( + if (this.fromApiJsonHelper.parameterExists(MAX_DIFFERENTIAL_LENDING_RATE, element)) { + baseDataValidator.reset().parameter(MAX_DIFFERENTIAL_LENDING_RATE).failWithCode( "not.supported.when.isLinkedToFloatingInterestRates.is.false", "maxDifferentialLendingRate param is not supported when isLinkedToFloatingInterestRates is not supplied or false"); } - if (this.fromApiJsonHelper.parameterExists("isFloatingInterestRateCalculationAllowed", element)) { - baseDataValidator.reset().parameter("isFloatingInterestRateCalculationAllowed").failWithCode( + if (this.fromApiJsonHelper.parameterExists(IS_FLOATING_INTEREST_RATE_CALCULATION_ALLOWED, element)) { + baseDataValidator.reset().parameter(IS_FLOATING_INTEREST_RATE_CALCULATION_ALLOWED).failWithCode( "not.supported.when.isLinkedToFloatingInterestRates.is.false", "isFloatingInterestRateCalculationAllowed param is not supported when isLinkedToFloatingInterestRates is not supplied or false"); } - final String minInterestRatePerPeriodParameterName = "minInterestRatePerPeriod"; + final String minInterestRatePerPeriodParameterName = MIN_INTEREST_RATE_PER_PERIOD; BigDecimal minInterestRatePerPeriod = loanProduct.getMinNominalInterestRatePerPeriod(); if (this.fromApiJsonHelper.parameterExists(minInterestRatePerPeriodParameterName, element)) { minInterestRatePerPeriod = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(minInterestRatePerPeriodParameterName, @@ -1315,7 +1344,7 @@ public final class LoanProductDataValidator { baseDataValidator.reset().parameter(minInterestRatePerPeriodParameterName).value(minInterestRatePerPeriod).ignoreIfNull() .zeroOrPositiveAmount(); - final String maxInterestRatePerPeriodParameterName = "maxInterestRatePerPeriod"; + final String maxInterestRatePerPeriodParameterName = MAX_INTEREST_RATE_PER_PERIOD; BigDecimal maxInterestRatePerPeriod = loanProduct.getMaxNominalInterestRatePerPeriod(); if (this.fromApiJsonHelper.parameterExists(maxInterestRatePerPeriodParameterName, element)) { maxInterestRatePerPeriod = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(maxInterestRatePerPeriodParameterName, @@ -1325,17 +1354,18 @@ public final class LoanProductDataValidator { .zeroOrPositiveAmount(); BigDecimal interestRatePerPeriod = loanProduct.getLoanProductRelatedDetail().getNominalInterestRatePerPeriod(); - if (this.fromApiJsonHelper.parameterExists("interestRatePerPeriod", element)) { - interestRatePerPeriod = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("interestRatePerPeriod", element); + if (this.fromApiJsonHelper.parameterExists(INTEREST_RATE_PER_PERIOD, element)) { + interestRatePerPeriod = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(INTEREST_RATE_PER_PERIOD, element); } - baseDataValidator.reset().parameter("interestRatePerPeriod").value(interestRatePerPeriod).notNull().zeroOrPositiveAmount(); + baseDataValidator.reset().parameter(INTEREST_RATE_PER_PERIOD).value(interestRatePerPeriod).notNull().zeroOrPositiveAmount(); Integer interestRateFrequencyType = loanProduct.getLoanProductRelatedDetail().getInterestPeriodFrequencyType().getValue(); - if (this.fromApiJsonHelper.parameterExists("interestRateFrequencyType", element)) { - interestRateFrequencyType = this.fromApiJsonHelper.extractIntegerNamed("interestRateFrequencyType", element, + if (this.fromApiJsonHelper.parameterExists(INTEREST_RATE_FREQUENCY_TYPE, element)) { + interestRateFrequencyType = this.fromApiJsonHelper.extractIntegerNamed(INTEREST_RATE_FREQUENCY_TYPE, element, Locale.getDefault()); } - baseDataValidator.reset().parameter("interestRateFrequencyType").value(interestRateFrequencyType).notNull().inMinMaxRange(0, 4); + baseDataValidator.reset().parameter(INTEREST_RATE_FREQUENCY_TYPE).value(interestRateFrequencyType).notNull().inMinMaxRange(0, + 4); } // Guarantee Funds @@ -1346,10 +1376,8 @@ public final class LoanProductDataValidator { .isOneOfTheseValues(true, false); } - if (holdGuaranteeFunds != null) { - if (holdGuaranteeFunds) { - validateGuaranteeParams(element, baseDataValidator, null); - } + if (holdGuaranteeFunds != null && holdGuaranteeFunds) { + validateGuaranteeParams(element, baseDataValidator, null); } if (this.fromApiJsonHelper.parameterExists(LoanProductConstants.principalThresholdForLastInstallmentParamName, element)) { @@ -1385,8 +1413,8 @@ public final class LoanProductDataValidator { .value(installmentAmountInMultiplesOf).ignoreIfNull().integerGreaterThanZero(); } - final Integer accountingRuleType = this.fromApiJsonHelper.extractIntegerNamed("accountingRule", element, Locale.getDefault()); - baseDataValidator.reset().parameter("accountingRule").value(accountingRuleType).ignoreIfNull().inMinMaxRange(1, 4); + final Integer accountingRuleType = this.fromApiJsonHelper.extractIntegerNamed(ACCOUNTING_RULE, element, Locale.getDefault()); + baseDataValidator.reset().parameter(ACCOUNTING_RULE).value(accountingRuleType).ignoreIfNull().inMinMaxRange(1, 4); final Long fundAccountId = this.fromApiJsonHelper.extractLongNamed(LoanProductAccountingParams.FUND_SOURCE.getValue(), element); baseDataValidator.reset().parameter(LoanProductAccountingParams.FUND_SOURCE.getValue()).value(fundAccountId).ignoreIfNull() @@ -1500,12 +1528,12 @@ public final class LoanProductDataValidator { .extractLongNamed(LoanProductAccountingParams.FUND_SOURCE.getValue(), jsonObject); baseDataValidator.reset() - .parameter(LoanProductAccountingParams.PAYMENT_CHANNEL_FUND_SOURCE_MAPPING.getValue() + "[" + i + "]." - + LoanProductAccountingParams.PAYMENT_TYPE.getValue()) + .parameter(LoanProductAccountingParams.PAYMENT_CHANNEL_FUND_SOURCE_MAPPING.getValue() + OPENING_SQUARE_BRACKET + + i + CLOSING_SQUARE_BRACKET + DOT + LoanProductAccountingParams.PAYMENT_TYPE.getValue()) .value(paymentTypeId).notNull().integerGreaterThanZero(); baseDataValidator.reset() - .parameter(LoanProductAccountingParams.PAYMENT_CHANNEL_FUND_SOURCE_MAPPING.getValue() + "[" + i + "]." - + LoanProductAccountingParams.FUND_SOURCE.getValue()) + .parameter(LoanProductAccountingParams.PAYMENT_CHANNEL_FUND_SOURCE_MAPPING.getValue() + OPENING_SQUARE_BRACKET + + i + CLOSING_SQUARE_BRACKET + DOT + LoanProductAccountingParams.FUND_SOURCE.getValue()) .value(paymentSpecificFundAccountId).notNull().integerGreaterThanZero(); i++; } while (i < paymentChannelMappingArray.size()); @@ -1539,10 +1567,11 @@ public final class LoanProductDataValidator { jsonObject); final Long incomeAccountId = this.fromApiJsonHelper .extractLongNamed(LoanProductAccountingParams.INCOME_ACCOUNT_ID.getValue(), jsonObject); - baseDataValidator.reset().parameter(parameterName + "[" + i + "]." + LoanProductAccountingParams.CHARGE_ID.getValue()) - .value(chargeId).notNull().integerGreaterThanZero(); + baseDataValidator.reset().parameter(parameterName + OPENING_SQUARE_BRACKET + i + CLOSING_SQUARE_BRACKET + DOT + + LoanProductAccountingParams.CHARGE_ID.getValue()).value(chargeId).notNull().integerGreaterThanZero(); baseDataValidator.reset() - .parameter(parameterName + "[" + i + "]." + LoanProductAccountingParams.INCOME_ACCOUNT_ID.getValue()) + .parameter(parameterName + OPENING_SQUARE_BRACKET + i + CLOSING_SQUARE_BRACKET + DOT + + LoanProductAccountingParams.INCOME_ACCOUNT_ID.getValue()) .value(incomeAccountId).notNull().integerGreaterThanZero(); i++; } while (i < chargeToIncomeAccountMappingArray.size()); @@ -1564,7 +1593,7 @@ public final class LoanProductDataValidator { final LoanProduct loanProduct, Integer cycleNumber) { final Map minmaxValues = loanProduct.fetchBorrowerCycleVariationsForCycleNumber(cycleNumber); - final String principalParameterName = "principal"; + final String principalParameterName = PRINCIPAL; BigDecimal principalAmount = null; BigDecimal minPrincipalAmount = null; BigDecimal maxPrincipalAmount = null; @@ -1586,7 +1615,7 @@ public final class LoanProductDataValidator { } } - final String numberOfRepaymentsParameterName = "numberOfRepayments"; + final String numberOfRepaymentsParameterName = NUMBER_OF_REPAYMENTS; Integer maxNumberOfRepayments = null; Integer minNumberOfRepayments = null; Integer numberOfRepayments = null; @@ -1613,7 +1642,7 @@ public final class LoanProductDataValidator { .notLessThanMin(minNumberOfRepayments); } - final String interestRatePerPeriodParameterName = "interestRatePerPeriod"; + final String interestRatePerPeriodParameterName = INTEREST_RATE_PER_PERIOD; BigDecimal interestRatePerPeriod = null; BigDecimal minInterestRatePerPeriod = null; BigDecimal maxInterestRatePerPeriod = null; @@ -1643,8 +1672,8 @@ public final class LoanProductDataValidator { boolean principalUpdated = false; boolean minPrincipalUpdated = false; boolean maxPrincipalUpdated = false; - final String principalParameterName = "principal"; - BigDecimal principalAmount = null; + final String principalParameterName = PRINCIPAL; + BigDecimal principalAmount; if (this.fromApiJsonHelper.parameterExists(principalParameterName, element)) { principalAmount = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(principalParameterName, element); principalUpdated = true; @@ -1652,8 +1681,8 @@ public final class LoanProductDataValidator { principalAmount = loanProduct.getPrincipalAmount().getAmount(); } - final String minPrincipalParameterName = "minPrincipal"; - BigDecimal minPrincipalAmount = null; + final String minPrincipalParameterName = MIN_PRINCIPAL; + BigDecimal minPrincipalAmount; if (this.fromApiJsonHelper.parameterExists(minPrincipalParameterName, element)) { minPrincipalAmount = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(minPrincipalParameterName, element); minPrincipalUpdated = true; @@ -1661,8 +1690,8 @@ public final class LoanProductDataValidator { minPrincipalAmount = loanProduct.getMinPrincipalAmount().getAmount(); } - final String maxPrincipalParameterName = "maxPrincipal"; - BigDecimal maxPrincipalAmount = null; + final String maxPrincipalParameterName = MAX_PRINCIPAL; + BigDecimal maxPrincipalAmount; if (this.fromApiJsonHelper.parameterExists(maxPrincipalParameterName, element)) { maxPrincipalAmount = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(maxPrincipalParameterName, element); maxPrincipalUpdated = true; @@ -1701,8 +1730,8 @@ public final class LoanProductDataValidator { boolean minNumberOfRepaymentsUpdated = false; boolean maxNumberOfRepaymentsUpdated = false; - final String numberOfRepaymentsParameterName = "numberOfRepayments"; - Integer numberOfRepayments = null; + final String numberOfRepaymentsParameterName = NUMBER_OF_REPAYMENTS; + Integer numberOfRepayments; if (this.fromApiJsonHelper.parameterExists(numberOfRepaymentsParameterName, element)) { numberOfRepayments = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(numberOfRepaymentsParameterName, element); numberOfRepaymentsUpdated = true; @@ -1710,7 +1739,7 @@ public final class LoanProductDataValidator { numberOfRepayments = loanProduct.getNumberOfRepayments(); } - final String minNumberOfRepaymentsParameterName = "minNumberOfRepayments"; + final String minNumberOfRepaymentsParameterName = MIN_NUMBER_OF_REPAYMENTS; Integer minNumberOfRepayments = null; if (this.fromApiJsonHelper.parameterExists(minNumberOfRepaymentsParameterName, element)) { minNumberOfRepayments = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(minNumberOfRepaymentsParameterName, element); @@ -1719,8 +1748,8 @@ public final class LoanProductDataValidator { minNumberOfRepayments = loanProduct.getMinNumberOfRepayments(); } - final String maxNumberOfRepaymentsParameterName = "maxNumberOfRepayments"; - Integer maxNumberOfRepayments = null; + final String maxNumberOfRepaymentsParameterName = MAX_NUMBER_OF_REPAYMENTS; + Integer maxNumberOfRepayments; if (this.fromApiJsonHelper.parameterExists(maxNumberOfRepaymentsParameterName, element)) { maxNumberOfRepayments = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(maxNumberOfRepaymentsParameterName, element); maxNumberOfRepaymentsUpdated = true; @@ -1757,16 +1786,16 @@ public final class LoanProductDataValidator { private void validateNominalInterestRatePerPeriodMinMaxConstraint(final JsonElement element, final LoanProduct loanProduct, final DataValidatorBuilder baseDataValidator) { - if ((this.fromApiJsonHelper.parameterExists("isLinkedToFloatingInterestRates", element) - && this.fromApiJsonHelper.extractBooleanNamed("isLinkedToFloatingInterestRates", element)) + if ((this.fromApiJsonHelper.parameterExists(IS_LINKED_TO_FLOATING_INTEREST_RATES, element) + && this.fromApiJsonHelper.extractBooleanNamed(IS_LINKED_TO_FLOATING_INTEREST_RATES, element)) || loanProduct.isLinkedToFloatingInterestRate()) { return; } boolean iRPUpdated = false; boolean minIRPUpdated = false; boolean maxIRPUpdated = false; - final String interestRatePerPeriodParameterName = "interestRatePerPeriod"; - BigDecimal interestRatePerPeriod = null; + final String interestRatePerPeriodParameterName = INTEREST_RATE_PER_PERIOD; + BigDecimal interestRatePerPeriod; if (this.fromApiJsonHelper.parameterExists(interestRatePerPeriodParameterName, element)) { interestRatePerPeriod = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(interestRatePerPeriodParameterName, element); @@ -1775,7 +1804,7 @@ public final class LoanProductDataValidator { interestRatePerPeriod = loanProduct.getNominalInterestRatePerPeriod(); } - final String minInterestRatePerPeriodParameterName = "minInterestRatePerPeriod"; + final String minInterestRatePerPeriodParameterName = MIN_INTEREST_RATE_PER_PERIOD; BigDecimal minInterestRatePerPeriod = null; if (this.fromApiJsonHelper.parameterExists(minInterestRatePerPeriodParameterName, element)) { minInterestRatePerPeriod = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(minInterestRatePerPeriodParameterName, @@ -1785,8 +1814,8 @@ public final class LoanProductDataValidator { minInterestRatePerPeriod = loanProduct.getMinNominalInterestRatePerPeriod(); } - final String maxInterestRatePerPeriodParameterName = "maxInterestRatePerPeriod"; - BigDecimal maxInterestRatePerPeriod = null; + final String maxInterestRatePerPeriodParameterName = MAX_INTEREST_RATE_PER_PERIOD; + BigDecimal maxInterestRatePerPeriod; if (this.fromApiJsonHelper.parameterExists(maxInterestRatePerPeriodParameterName, element)) { maxInterestRatePerPeriod = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(maxInterestRatePerPeriodParameterName, element); @@ -2051,7 +2080,7 @@ public final class LoanProductDataValidator { multiDisburseLoan = this.fromApiJsonHelper.extractBooleanNamed(LoanProductConstants.MULTI_DISBURSE_LOAN_PARAMETER_NAME, element); } else if (loanProduct != null) { - isInterestRecalculationEnabled = loanProduct.isMultiDisburseLoan(); + multiDisburseLoan = loanProduct.isMultiDisburseLoan(); } if (multiDisburseLoan != null && multiDisburseLoan) { baseDataValidator.reset().parameter(LoanProductConstants.MULTI_DISBURSE_LOAN_PARAMETER_NAME) @@ -2063,7 +2092,7 @@ public final class LoanProductDataValidator { variableInstallments = this.fromApiJsonHelper .extractBooleanNamed(LoanProductConstants.allowVariableInstallmentsParamName, element); } else if (loanProduct != null) { - isInterestRecalculationEnabled = loanProduct.allowVariabeInstallments(); + variableInstallments = loanProduct.allowVariabeInstallments(); } if (variableInstallments != null && variableInstallments) { baseDataValidator.reset().parameter(LoanProductConstants.allowVariableInstallmentsParamName) @@ -2071,13 +2100,13 @@ public final class LoanProductDataValidator { } Boolean floatingInterestRates = null; - if (this.fromApiJsonHelper.parameterExists("isLinkedToFloatingInterestRates", element)) { - floatingInterestRates = this.fromApiJsonHelper.extractBooleanNamed("isLinkedToFloatingInterestRates", element); + if (this.fromApiJsonHelper.parameterExists(IS_LINKED_TO_FLOATING_INTEREST_RATES, element)) { + floatingInterestRates = this.fromApiJsonHelper.extractBooleanNamed(IS_LINKED_TO_FLOATING_INTEREST_RATES, element); } else if (loanProduct != null) { - isInterestRecalculationEnabled = loanProduct.isLinkedToFloatingInterestRate(); + floatingInterestRates = loanProduct.isLinkedToFloatingInterestRate(); } if (floatingInterestRates != null && floatingInterestRates) { - baseDataValidator.reset().parameter("isLinkedToFloatingInterestRates") + baseDataValidator.reset().parameter(IS_LINKED_TO_FLOATING_INTEREST_RATES) .failWithCode("not.supported.for.selected.interest.calculation.type"); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/api/NotesApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/api/NotesApiResource.java index 6fe12fc02..c66c8ee1e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/api/NotesApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/api/NotesApiResource.java @@ -54,8 +54,6 @@ import org.apache.fineract.portfolio.note.data.NoteData; import org.apache.fineract.portfolio.note.domain.NoteType; import org.apache.fineract.portfolio.note.exception.NoteResourceNotSupportedException; import org.apache.fineract.portfolio.note.service.NoteReadPlatformService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -63,15 +61,18 @@ import org.springframework.stereotype.Component; @Path("/{resourceType}/{resourceId}/notes") @Component @Scope("singleton") - @Tag(name = "Notes", description = "Notes API allows to enter notes for supported resources.") public class NotesApiResource { - private final Set noteDataParemeters = new HashSet<>( + public static final String CLIENTNOTE = "CLIENTNOTE"; + public static final String LOANNOTE = "LOANNOTE"; + public static final String LOANTRANSACTIONNOTE = "LOANTRANSACTIONNOTE"; + public static final String SAVINGNOTE = "SAVINGNOTE"; + public static final String GROUPNOTE = "GROUPNOTE"; + public static final String INVALIDNOTE = "INVALIDNOTE"; + private static final Set NOTE_DATA_PARAMETERS = new HashSet<>( Arrays.asList("id", "clientId", "groupId", "loanId", "loanTransactionId", "depositAccountId", "savingAccountId", "noteType", "note", "createdById", "createdByUsername", "createdOn", "updatedById", "updatedByUsername", "updatedOn")); - - private static final Logger LOG = LoggerFactory.getLogger(NotesApiResource.class); private final PlatformSecurityContext context; private final NoteReadPlatformService readPlatformService; private final DefaultToApiJsonSerializer toApiJsonSerializer; @@ -113,7 +114,7 @@ public class NotesApiResource { final Collection notes = this.readPlatformService.retrieveNotesByResource(resourceId, noteTypeId); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, notes, this.noteDataParemeters); + return this.toApiJsonSerializer.serialize(settings, notes, NOTE_DATA_PARAMETERS); } @GET @@ -143,7 +144,7 @@ public class NotesApiResource { final NoteData note = this.readPlatformService.retrieveNote(noteId, resourceId, noteTypeId); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, note, this.noteDataParemeters); + return this.toApiJsonSerializer.serialize(settings, note, NOTE_DATA_PARAMETERS); } @POST @@ -231,35 +232,32 @@ public class NotesApiResource { private CommandWrapper getResourceDetails(final NoteType type, final Long resourceId) { CommandWrapperBuilder resourceDetails = new CommandWrapperBuilder(); - String resourceNameForPermissions = "INVALIDNOTE"; + String resourceNameForPermissions; switch (type) { - case CLIENT: - resourceNameForPermissions = "CLIENTNOTE"; + case CLIENT -> { + resourceNameForPermissions = CLIENTNOTE; resourceDetails.withClientId(resourceId); - break; - case LOAN: - resourceNameForPermissions = "LOANNOTE"; + } + case LOAN -> { + resourceNameForPermissions = LOANNOTE; resourceDetails.withLoanId(resourceId); - break; - case LOAN_TRANSACTION: - resourceNameForPermissions = "LOANTRANSACTIONNOTE"; + } + case LOAN_TRANSACTION -> { + resourceNameForPermissions = LOANTRANSACTIONNOTE; // updating loanId, to distinguish saving transaction note and // loan transaction note as we are using subEntityId for both. resourceDetails.withLoanId(resourceId); resourceDetails.withSubEntityId(resourceId); - break; - case SAVING_ACCOUNT: - resourceNameForPermissions = "SAVINGNOTE"; + } + case SAVING_ACCOUNT -> { + resourceNameForPermissions = SAVINGNOTE; resourceDetails.withSavingsId(resourceId); - break; - case GROUP: - resourceNameForPermissions = "GROUPNOTE"; + } + case GROUP -> { + resourceNameForPermissions = GROUPNOTE; resourceDetails.withGroupId(resourceId); - break; - default: - resourceNameForPermissions = "INVALIDNOTE"; - break; - + } + default -> resourceNameForPermissions = INVALIDNOTE; } return resourceDetails.withEntityName(resourceNameForPermissions).build(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/serialization/NoteCommandFromApiJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/serialization/NoteCommandFromApiJsonDeserializer.java index e5c1e1ffe..a2c2b9408 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/serialization/NoteCommandFromApiJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/serialization/NoteCommandFromApiJsonDeserializer.java @@ -22,7 +22,6 @@ import com.google.gson.JsonElement; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -45,10 +44,11 @@ import org.springframework.stereotype.Component; @Component public final class NoteCommandFromApiJsonDeserializer extends AbstractFromApiJsonDeserializer { + public static final String NOTE = "note"; /** * The parameters supported for this command. */ - private final Set supportedParameters = new HashSet<>(Arrays.asList("note")); + private static final Set SUPPORTED_PARAMETERS = new HashSet<>(List.of(NOTE)); private final FromJsonHelper fromApiJsonHelper; @@ -64,11 +64,13 @@ public final class NoteCommandFromApiJsonDeserializer extends AbstractFromApiJso throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final JsonElement element = this.fromApiJsonHelper.parse(json); - final String note = this.fromApiJsonHelper.extractStringNamed("note", element); + final String note = this.fromApiJsonHelper.extractStringNamed(NOTE, element); return new NoteCommand(note); } @@ -78,16 +80,18 @@ public final class NoteCommandFromApiJsonDeserializer extends AbstractFromApiJso throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final JsonElement element = this.fromApiJsonHelper.parse(json); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("note"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(NOTE); - final String note = this.fromApiJsonHelper.extractStringNamed("note", element); - baseDataValidator.reset().parameter("note").value(note).notBlank().notExceedingLengthOf(1000); + final String note = this.fromApiJsonHelper.extractStringNamed(NOTE, element); + baseDataValidator.reset().parameter(NOTE).value(note).notBlank().notExceedingLengthOf(1000); if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/rate/api/RateApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/rate/api/RateApiResource.java index 065e796ea..ffa0edd56 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/rate/api/RateApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/rate/api/RateApiResource.java @@ -58,8 +58,9 @@ import org.springframework.stereotype.Component; @Tag(name = "Rate", description = "") public class RateApiResource { - private final Set responseDataParameters = new HashSet<>(Arrays.asList("id", "name", "percentage", "productApply", "active")); - private final String resourceNameForPermissions = "RATE"; + private static final Set RESPONSE_DATA_PARAMETERS = new HashSet<>( + Arrays.asList("id", "name", "percentage", "productApply", "active")); + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "RATE"; private final PlatformSecurityContext context; private final RateReadService readPlatformService; private final DefaultToApiJsonSerializer toApiJsonSerializer; @@ -83,13 +84,13 @@ public class RateApiResource { @Produces({ MediaType.APPLICATION_JSON }) public String retrieveRate(@PathParam("rateId") Long rateId, @Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final RateData rate = this.readPlatformService.retrieveOne(rateId); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, rate, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, rate, RESPONSE_DATA_PARAMETERS); } @POST @@ -109,13 +110,13 @@ public class RateApiResource { @Produces({ MediaType.APPLICATION_JSON }) public String getAllRates(@Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); Collection rates = this.readPlatformService.retrieveAllRates(); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, rates, this.responseDataParameters); + return this.toApiJsonSerializer.serialize(settings, rates, RESPONSE_DATA_PARAMETERS); } @PUT diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/rate/serialization/RateDefinitionCommandFromApiJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/rate/serialization/RateDefinitionCommandFromApiJsonDeserializer.java index 86e8d59a2..e341e2256 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/rate/serialization/RateDefinitionCommandFromApiJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/rate/serialization/RateDefinitionCommandFromApiJsonDeserializer.java @@ -44,7 +44,7 @@ public class RateDefinitionCommandFromApiJsonDeserializer { /** * The parameters supported for this command. */ - private final Set supportedParameters = new HashSet<>( + private static final Set SUPPORTED_PARAMETERS = new HashSet<>( Arrays.asList("id", "name", "percentage", "productApply", "active", "approveUser", "locale")); private final FromJsonHelper fromApiJsonHelper; @@ -61,7 +61,7 @@ public class RateDefinitionCommandFromApiJsonDeserializer { final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); @@ -87,7 +87,7 @@ public class RateDefinitionCommandFromApiJsonDeserializer { } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(RateApiConstants.rate); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/repaymentwithpostdatedchecks/service/RepaymentWithPostDatedChecksWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/repaymentwithpostdatedchecks/service/RepaymentWithPostDatedChecksWritePlatformServiceImpl.java index 039933e96..5c26cbe7e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/repaymentwithpostdatedchecks/service/RepaymentWithPostDatedChecksWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/repaymentwithpostdatedchecks/service/RepaymentWithPostDatedChecksWritePlatformServiceImpl.java @@ -30,7 +30,6 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; -import java.util.stream.Collectors; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.ApiParameterError; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; @@ -55,15 +54,22 @@ import org.springframework.transaction.annotation.Transactional; @Service public class RepaymentWithPostDatedChecksWritePlatformServiceImpl implements RepaymentWithPostDatedChecksWritePlatformService { - private final PostDatedChecksRepository postDatedChecksRepository; - private final FromJsonHelper fromApiJsonHelper; - private final LoanRepository loanRepository; + public static final String NAME = "name"; + public static final String AMOUNT = "amount"; + public static final String ACCOUNT_NO = "accountNo"; + public static final String LOCALE = "locale"; + public static final String CHECK_NO = "checkNo"; + public static final String INSTALLMENT_ID = "installmentId"; + public static final String REPAYMENT_WITH_POST_DATED_CHECKS = "repayment-with-post-dated-checks"; /** * The parameters supported for this command. */ - private final Set supportedParametersForUpdate = new HashSet<>(Arrays.asList("name", "amount", "accountNo", "locale")); - private final Set supportedParametersForBounce = new HashSet<>( - Arrays.asList("name", "amount", "accountNo", "checkNo", "locale", "installmentId")); + private static final Set SUPPORTED_PARAMETERS_FOR_UPDATE = new HashSet<>(Arrays.asList(NAME, AMOUNT, ACCOUNT_NO, LOCALE)); + private static final Set SUPPORTED_PARAMETERS_FOR_BOUNCE = new HashSet<>( + Arrays.asList(NAME, AMOUNT, ACCOUNT_NO, CHECK_NO, LOCALE, INSTALLMENT_ID)); + private final PostDatedChecksRepository postDatedChecksRepository; + private final FromJsonHelper fromApiJsonHelper; + private final LoanRepository loanRepository; @Autowired public RepaymentWithPostDatedChecksWritePlatformServiceImpl(final PostDatedChecksRepository postDatedChecksRepository, @@ -102,19 +108,19 @@ public class RepaymentWithPostDatedChecksWritePlatformServiceImpl implements Rep JsonObject jsonObject = jsonElement.getAsJsonObject(); final Locale locale = this.fromApiJsonHelper.extractLocaleParameter(jsonObject); - final String name = this.fromApiJsonHelper.extractStringNamed("name", jsonObject); + final String name = this.fromApiJsonHelper.extractStringNamed(NAME, jsonObject); - final BigDecimal amount = this.fromApiJsonHelper.extractBigDecimalNamed("amount", jsonObject, locale); + final BigDecimal amount = this.fromApiJsonHelper.extractBigDecimalNamed(AMOUNT, jsonObject, locale); - final Integer installmentId = this.fromApiJsonHelper.extractIntegerNamed("installmentId", jsonObject, locale); + final Integer installmentId = this.fromApiJsonHelper.extractIntegerNamed(INSTALLMENT_ID, jsonObject, locale); - final Long accountNo = this.fromApiJsonHelper.extractLongNamed("accountNo", jsonObject); - final Long checkNo = this.fromApiJsonHelper.extractLongNamed("checkNo", jsonObject); + final Long accountNo = this.fromApiJsonHelper.extractLongNamed(ACCOUNT_NO, jsonObject); + final Long checkNo = this.fromApiJsonHelper.extractLongNamed(CHECK_NO, jsonObject); final List loanRepaymentScheduleInstallments = loan.getRepaymentScheduleInstallments(); final List installmentList = loanRepaymentScheduleInstallments.stream() - .filter(repayment -> repayment.getInstallmentNumber().equals(installmentId)).collect(Collectors.toList()); + .filter(repayment -> repayment.getInstallmentNumber().equals(installmentId)).toList(); final PostDatedChecks postDatedChecks = PostDatedChecks.instanceOf(accountNo, name, amount, installmentList.get(0), loan, checkNo); try { @@ -124,7 +130,7 @@ public class RepaymentWithPostDatedChecksWritePlatformServiceImpl implements Rep final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("postdatedChecks"); if (realCause.getMessage().toLowerCase().contains("transaction has been rolled back")) { - baseDataValidator.reset().parameter("checkNo").failWithCode("value.must.be.unique"); + baseDataValidator.reset().parameter(CHECK_NO).failWithCode("value.must.be.unique"); } if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", @@ -140,37 +146,39 @@ public class RepaymentWithPostDatedChecksWritePlatformServiceImpl implements Rep final JsonElement jsonElement = this.fromApiJsonHelper.parse(command.json()); final List dataValidationErrors = new ArrayList<>(); - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, command.json(), this.supportedParametersForBounce); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, command.json(), SUPPORTED_PARAMETERS_FOR_BOUNCE); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors) - .resource("repayment-with-post-dated-checks"); + .resource(REPAYMENT_WITH_POST_DATED_CHECKS); - if (!command.parameterExists("locale")) { - baseDataValidator.reset().parameter("locale").notNull().failWithCode("locale.not.exists"); + if (!command.parameterExists(LOCALE)) { + baseDataValidator.reset().parameter(LOCALE).notNull().failWithCode("locale.not.exists"); } else { - final String locale = this.fromApiJsonHelper.extractStringNamed("locale", jsonElement); - baseDataValidator.reset().parameter("locale").value(locale).notNull(); + final String locale = this.fromApiJsonHelper.extractStringNamed(LOCALE, jsonElement); + baseDataValidator.reset().parameter(LOCALE).value(locale).notNull(); } - if (command.parameterExists("amount")) { - final BigDecimal amount = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("amount", jsonElement); - baseDataValidator.reset().parameter("amount").value(amount).notNull().positiveAmount(); + if (command.parameterExists(AMOUNT)) { + final BigDecimal amount = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(AMOUNT, jsonElement); + baseDataValidator.reset().parameter(AMOUNT).value(amount).notNull().positiveAmount(); } - if (command.parameterExists("accountNo")) { - final Long accountNo = this.fromApiJsonHelper.extractLongNamed("accountNo", jsonElement); - baseDataValidator.reset().parameter("accountNo").value(accountNo).notNull().positiveAmount(); + if (command.parameterExists(ACCOUNT_NO)) { + final Long accountNo = this.fromApiJsonHelper.extractLongNamed(ACCOUNT_NO, jsonElement); + baseDataValidator.reset().parameter(ACCOUNT_NO).value(accountNo).notNull().positiveAmount(); } - if (command.parameterExists("name")) { - final String name = this.fromApiJsonHelper.extractStringNamed("name", jsonElement); - baseDataValidator.reset().parameter("name").value(name).notNull(); + if (command.parameterExists(NAME)) { + final String name = this.fromApiJsonHelper.extractStringNamed(NAME, jsonElement); + baseDataValidator.reset().parameter(NAME).value(name).notNull(); } - if (command.parameterExists("checkNo")) { - final Long checkNo = this.fromApiJsonHelper.extractLongNamed("checkNo", jsonElement); - baseDataValidator.reset().parameter("checkNo").value(checkNo).notNull().longGreaterThanZero(); + if (command.parameterExists(CHECK_NO)) { + final Long checkNo = this.fromApiJsonHelper.extractLongNamed(CHECK_NO, jsonElement); + baseDataValidator.reset().parameter(CHECK_NO).value(checkNo).notNull().longGreaterThanZero(); } if (!dataValidationErrors.isEmpty()) { @@ -183,32 +191,34 @@ public class RepaymentWithPostDatedChecksWritePlatformServiceImpl implements Rep final JsonElement jsonElement = this.fromApiJsonHelper.parse(command.json()); final List dataValidationErrors = new ArrayList<>(); - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, command.json(), this.supportedParametersForUpdate); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, command.json(), SUPPORTED_PARAMETERS_FOR_UPDATE); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors) - .resource("repayment-with-post-dated-checks"); + .resource(REPAYMENT_WITH_POST_DATED_CHECKS); - if (!command.parameterExists("locale")) { - baseDataValidator.reset().parameter("locale").notNull().failWithCode("locale.not.exists"); + if (!command.parameterExists(LOCALE)) { + baseDataValidator.reset().parameter(LOCALE).notNull().failWithCode("locale.not.exists"); } else { - final String locale = this.fromApiJsonHelper.extractStringNamed("locale", jsonElement); - baseDataValidator.reset().parameter("locale").value(locale).notNull(); + final String locale = this.fromApiJsonHelper.extractStringNamed(LOCALE, jsonElement); + baseDataValidator.reset().parameter(LOCALE).value(locale).notNull(); } - if (command.parameterExists("amount")) { - final BigDecimal amount = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("amount", jsonElement); - baseDataValidator.reset().parameter("amount").value(amount).notNull().positiveAmount(); + if (command.parameterExists(AMOUNT)) { + final BigDecimal amount = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(AMOUNT, jsonElement); + baseDataValidator.reset().parameter(AMOUNT).value(amount).notNull().positiveAmount(); } - if (command.parameterExists("accountNo")) { - final Long accountNo = this.fromApiJsonHelper.extractLongNamed("accountNo", jsonElement); - baseDataValidator.reset().parameter("accountNo").value(accountNo).notNull().positiveAmount(); + if (command.parameterExists(ACCOUNT_NO)) { + final Long accountNo = this.fromApiJsonHelper.extractLongNamed(ACCOUNT_NO, jsonElement); + baseDataValidator.reset().parameter(ACCOUNT_NO).value(accountNo).notNull().positiveAmount(); } - if (command.parameterExists("name")) { - final String name = this.fromApiJsonHelper.extractStringNamed("name", jsonElement); - baseDataValidator.reset().parameter("name").value(name).notNull(); + if (command.parameterExists(NAME)) { + final String name = this.fromApiJsonHelper.extractStringNamed(NAME, jsonElement); + baseDataValidator.reset().parameter(NAME).value(name).notNull(); } if (!dataValidationErrors.isEmpty()) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsHelper.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsHelper.java index 7d3858918..1fe4df28e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsHelper.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsHelper.java @@ -37,14 +37,14 @@ import org.springframework.stereotype.Service; @Service public final class SavingsHelper { - AccountTransfersReadPlatformService accountTransfersReadPlatformService = null; + private final AccountTransfersReadPlatformService accountTransfersReadPlatformService; @Autowired public SavingsHelper(AccountTransfersReadPlatformService accountTransfersReadPlatformService) { this.accountTransfersReadPlatformService = accountTransfersReadPlatformService; } - private final CompoundInterestHelper compoundInterestHelper = new CompoundInterestHelper(); + private static final CompoundInterestHelper COMPOUND_INTEREST_HELPER = new CompoundInterestHelper(); public List determineInterestPostingPeriods(final LocalDate startInterestCalculationLocalDate, final LocalDate interestPostingUpToDate, final SavingsPostingInterestPeriodType postingPeriodType, @@ -169,7 +169,7 @@ public final class SavingsHelper { public Money calculateInterestForAllPostingPeriods(final MonetaryCurrency currency, final List allPeriods, LocalDate accountLockedUntil, Boolean immediateWithdrawalOfInterest) { - return this.compoundInterestHelper.calculateInterestForAllPostingPeriods(currency, allPeriods, accountLockedUntil, + return COMPOUND_INTEREST_HELPER.calculateInterestForAllPostingPeriods(currency, allPeriods, accountLockedUntil, immediateWithdrawalOfInterest); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountInterestRateChartReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountInterestRateChartReadPlatformServiceImpl.java index 170f48064..d83b08ecd 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountInterestRateChartReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountInterestRateChartReadPlatformServiceImpl.java @@ -58,12 +58,11 @@ public class DepositAccountInterestRateChartReadPlatformServiceImpl implements D private final PlatformSecurityContext context; private final JdbcTemplate jdbcTemplate; - private final DepositAccountInterestRateChartMapper chartRowMapper = new DepositAccountInterestRateChartMapper(); + private static final DepositAccountInterestRateChartMapper CHART_ROW_MAPPER = new DepositAccountInterestRateChartMapper(); private final DepositAccountInterestRateChartExtractor chartExtractor; private final InterestRateChartDropdownReadPlatformService chartDropdownReadPlatformService; private final InterestIncentiveDropdownReadPlatformService interestIncentiveDropdownReadPlatformService; private final CodeValueReadPlatformService codeValueReadPlatformService; - private final DatabaseSpecificSQLGenerator sqlGenerator; @Autowired public DepositAccountInterestRateChartReadPlatformServiceImpl(PlatformSecurityContext context, final JdbcTemplate jdbcTemplate, @@ -75,7 +74,6 @@ public class DepositAccountInterestRateChartReadPlatformServiceImpl implements D this.chartDropdownReadPlatformService = chartDropdownReadPlatformService; this.interestIncentiveDropdownReadPlatformService = interestIncentiveDropdownReadPlatformService; this.codeValueReadPlatformService = codeValueReadPlatformService; - this.sqlGenerator = sqlGenerator; chartExtractor = new DepositAccountInterestRateChartExtractor(sqlGenerator); } @@ -83,8 +81,8 @@ public class DepositAccountInterestRateChartReadPlatformServiceImpl implements D public DepositAccountInterestRateChartData retrieveOne(Long chartId) { try { this.context.authenticatedUser(); - final String sql = "select " + this.chartRowMapper.schema() + " where irc.id = ? "; - return this.jdbcTemplate.queryForObject(sql, this.chartRowMapper, new Object[] { chartId }); // NOSONAR + final String sql = "select " + CHART_ROW_MAPPER.schema() + " where irc.id = ? "; + return this.jdbcTemplate.queryForObject(sql, CHART_ROW_MAPPER, new Object[] { chartId }); // NOSONAR } catch (final EmptyResultDataAccessException e) { throw new DepositAccountInterestRateChartNotFoundException(chartId, e); } @@ -106,8 +104,7 @@ public class DepositAccountInterestRateChartReadPlatformServiceImpl implements D sql.append("WHEN NOT irc.is_primary_grouping_by_amount then ircd.amount_range_from "); sql.append("WHEN NOT irc.is_primary_grouping_by_amount then ircd.amount_range_to "); sql.append("END"); - Collection chartDatas = this.jdbcTemplate.query(sql.toString(), this.chartExtractor, - new Object[] { chartId }); + Collection chartDatas = this.jdbcTemplate.query(sql.toString(), this.chartExtractor, chartId); if (chartDatas == null || chartDatas.isEmpty()) { throw new DepositAccountInterestRateChartNotFoundException(chartId); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountReadPlatformServiceImpl.java index f59f70987..5881aca22 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountReadPlatformServiceImpl.java @@ -98,14 +98,17 @@ import org.springframework.util.CollectionUtils; @Service public class DepositAccountReadPlatformServiceImpl implements DepositAccountReadPlatformService { + private static final FixedDepositAccountMapper FIXED_DEPOSIT_ACCOUNT_MAPPER = new FixedDepositAccountMapper(); + private static final RecurringDepositAccountMapper RECURRING_DEPOSIT_ACCOUNT_MAPPER = new RecurringDepositAccountMapper(); + private static final DepositAccountLookupMapper DEPOSIT_ACCOUNT_LOOKUP_MAPPER = new DepositAccountLookupMapper(); + private static final DepositAccountForMaturityMapper DEPOSIT_ACCOUNT_FOR_MATURITY_MAPPER = new DepositAccountForMaturityMapper(); + // allowed column names for sorting the query result + private static final Set supportedOrderByValues = new HashSet<>(Arrays.asList("id", "accountNumbr", "officeId", "officeName")); + private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); private final PlatformSecurityContext context; private final JdbcTemplate jdbcTemplate; private final DepositAccountInterestRateChartReadPlatformService accountChartReadPlatformService; private final InterestRateChartReadPlatformService productChartReadPlatformService; - private final FixedDepositAccountMapper fixedDepositAccountRowMapper = new FixedDepositAccountMapper(); - private final RecurringDepositAccountMapper recurringDepositAccountRowMapper = new RecurringDepositAccountMapper(); - private final DepositAccountLookupMapper depositAccountLookupsRowMapper = new DepositAccountLookupMapper(); - private final DepositAccountForMaturityMapper depositAccountForMaturityRowMapper = new DepositAccountForMaturityMapper(); private final PaginationParametersDataValidator paginationParametersDataValidator; private final DatabaseSpecificSQLGenerator sqlGenerator; private final PaginationHelper paginationHelper; @@ -121,10 +124,7 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead private final RecurringAccountDepositTransactionTemplateMapper rdTransactionTemplateMapper; private final DropdownReadPlatformService dropdownReadPlatformService; private final CalendarReadPlatformService calendarReadPlatformService; - private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); private final PaymentTypeReadPlatformService paymentTypeReadPlatformService; - // allowed column names for sorting the query result - private static final Set supportedOrderByValues = new HashSet<>(Arrays.asList("id", "accountNumbr", "officeId", "officeName")); @Autowired public DepositAccountReadPlatformServiceImpl(final PlatformSecurityContext context, final JdbcTemplate jdbcTemplate, @@ -209,11 +209,10 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead final StringBuilder sqlBuilder = new StringBuilder(400); sqlBuilder.append("select "); - sqlBuilder.append(this.depositAccountLookupsRowMapper.schema()); + sqlBuilder.append(DEPOSIT_ACCOUNT_LOOKUP_MAPPER.schema()); sqlBuilder.append(" where sa.deposit_type_enum = ? "); - return this.jdbcTemplate.query(sqlBuilder.toString(), this.depositAccountLookupsRowMapper, - new Object[] { depositAccountType.getValue() }); + return this.jdbcTemplate.query(sqlBuilder.toString(), DEPOSIT_ACCOUNT_LOOKUP_MAPPER, depositAccountType.getValue()); } @Override @@ -221,12 +220,12 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead final StringBuilder sqlBuilder = new StringBuilder(200); sqlBuilder.append("SELECT "); - sqlBuilder.append(this.depositAccountForMaturityRowMapper.schema()); + sqlBuilder.append(DEPOSIT_ACCOUNT_FOR_MATURITY_MAPPER.schema()); sqlBuilder.append(" WHERE da.deposit_type_enum in (?, ?) and da.status_enum = ?"); - return this.jdbcTemplate.query(sqlBuilder.toString(), this.depositAccountForMaturityRowMapper, - new Object[] { DepositAccountType.FIXED_DEPOSIT.getValue(), DepositAccountType.RECURRING_DEPOSIT.getValue(), - SavingsAccountStatusType.ACTIVE.getValue() }); + return this.jdbcTemplate.query(sqlBuilder.toString(), DEPOSIT_ACCOUNT_FOR_MATURITY_MAPPER, + DepositAccountType.FIXED_DEPOSIT.getValue(), DepositAccountType.RECURRING_DEPOSIT.getValue(), + SavingsAccountStatusType.ACTIVE.getValue()); } @Override @@ -244,8 +243,7 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead sqlBuilder.append(depositAccountMapper.schema()); sqlBuilder.append(" where sa.id = ? and sa.deposit_type_enum = ? "); - return this.jdbcTemplate.queryForObject(sqlBuilder.toString(), depositAccountMapper, - new Object[] { accountId, depositAccountType.getValue() }); + return this.jdbcTemplate.queryForObject(sqlBuilder.toString(), depositAccountMapper, accountId, depositAccountType.getValue()); } catch (final EmptyResultDataAccessException e) { throw new DepositAccountNotFoundException(depositAccountType, accountId, e); @@ -267,8 +265,8 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead sqlBuilder.append(depositAccountMapper.schema()); sqlBuilder.append(" where sa.id = ? and sa.deposit_type_enum = ? "); - DepositAccountData account = this.jdbcTemplate.queryForObject(sqlBuilder.toString(), depositAccountMapper, - new Object[] { accountId, depositAccountType.getValue() }); + DepositAccountData account = this.jdbcTemplate.queryForObject(sqlBuilder.toString(), depositAccountMapper, accountId, + depositAccountType.getValue()); Collection onAccountClosureOptions = SavingsEnumerations .depositAccountOnClosureType(DepositAccountOnClosureType.values()); final Collection paymentTypeOptions = this.paymentTypeReadPlatformService.retrieveAllPaymentTypes(); @@ -495,7 +493,7 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead final String sql = "select " + this.rdTransactionTemplateMapper.schema() + " where sa.id = ? and sa.deposit_type_enum = ? order by mss.installment limit 1"; return this.jdbcTemplate.queryForObject(sql, this.rdTransactionTemplateMapper, // NOSONAR - new Object[] { accountId, accountId, DepositAccountType.RECURRING_DEPOSIT.getValue() }); + accountId, accountId, DepositAccountType.RECURRING_DEPOSIT.getValue()); } catch (final EmptyResultDataAccessException e) { throw new DepositAccountNotFoundException(DepositAccountType.RECURRING_DEPOSIT, accountId, e); } @@ -513,13 +511,13 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead sqlBuilder.append( "and st.transaction_type_enum = ? and sa.status_enum = ? and st.is_reversed=false and st.transaction_date > coalesce(sa.lockedin_until_date_derived,sa.activatedon_date)"); - return this.jdbcTemplate.query(sqlBuilder.toString(), mapper, new Object[] { SavingsAccountTransactionType.WITHDRAWAL.getValue(), - SavingsAccountTransactionType.INTEREST_POSTING.getValue(), SavingsAccountStatusType.ACTIVE.getValue() }); + return this.jdbcTemplate.query(sqlBuilder.toString(), mapper, SavingsAccountTransactionType.WITHDRAWAL.getValue(), + SavingsAccountTransactionType.INTEREST_POSTING.getValue(), SavingsAccountStatusType.ACTIVE.getValue()); } @Override public Collection> retriveDataForRDScheduleCreation() { - String today = formatter.format(DateUtils.getBusinessLocalDate()); + String today = DATE_TIME_FORMATTER.format(DateUtils.getBusinessLocalDate()); final StringBuilder sb = new StringBuilder(300); sb.append(" select rd.savings_account_id savingsId, rd.mandatory_recommended_deposit_amount as amount,"); sb.append(" mc.recurrence as recurrence ,"); @@ -539,14 +537,106 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead CalendarEntityType.SAVINGS.getValue(), CalendarType.COLLECTION.getValue()); } + private DepositAccountMapper getDepositAccountMapper(final DepositAccountType depositAccountType) { + if (depositAccountType.isFixedDeposit()) { + return FIXED_DEPOSIT_ACCOUNT_MAPPER; + } else if (depositAccountType.isRecurringDeposit()) { + return RECURRING_DEPOSIT_ACCOUNT_MAPPER; + } + return null; + } + + private DepositAccountTemplateMapper getDepositAccountTemplaMapper(final DepositAccountType depositAccountType, ClientData client, + GroupGeneralData group) { + if (depositAccountType.isFixedDeposit()) { + return new FixedDepositAccountTemplateMapper(client, group); + } else if (depositAccountType.isRecurringDeposit()) { + return new RecurringDepositAccountTemplateMapper(client, group); + } + return null; + } + + private Collection fromChargesToSavingsCharges(final Collection productCharges) { + final Collection savingsCharges = new ArrayList<>(); + for (final ChargeData chargeData : productCharges) { + final SavingsAccountChargeData savingsCharge = chargeData.toSavingsAccountChargeData(); + savingsCharges.add(savingsCharge); + } + return savingsCharges; + } + private abstract static class DepositAccountMapper implements RowMapper { + public static final String ACCOUNT_NO = "accountNo"; + public static final String ID = "id"; + public static final String EXTERNAL_ID = "externalId"; + public static final String GROUP_ID = "groupId"; + public static final String GROUP_NAME = "groupName"; + public static final String CLIENT_ID = "clientId"; + public static final String CLIENT_NAME = "clientName"; + public static final String PRODUCT_ID = "productId"; + public static final String PRODUCT_NAME = "productName"; + public static final String FIELD_OFFICER_ID = "fieldOfficerId"; + public static final String FIELD_OFFICER_NAME = "fieldOfficerName"; + public static final String STATUS_ENUM = "statusEnum"; + public static final String SUBMITTED_ON_DATE = "submittedOnDate"; + public static final String SUBMITTED_BY_USERNAME = "submittedByUsername"; + public static final String SUBMITTED_BY_LASTNAME = "submittedByLastname"; + public static final String SUBMITTED_BY_FIRSTNAME = "submittedByFirstname"; + public static final String REJECTED_ON_DATE = "rejectedOnDate"; + public static final String REJECTED_BY_USERNAME = "rejectedByUsername"; + public static final String REJECTED_BY_FIRSTNAME = "rejectedByFirstname"; + public static final String REJECTED_BY_LASTNAME = "rejectedByLastname"; + public static final String WITHDRAWN_ON_DATE = "withdrawnOnDate"; + public static final String WITHDRAWN_BY_USERNAME = "withdrawnByUsername"; + public static final String WITHDRAWN_BY_FIRSTNAME = "withdrawnByFirstname"; + public static final String WITHDRAWN_BY_LASTNAME = "withdrawnByLastname"; + public static final String APPROVED_ON_DATE = "approvedOnDate"; + public static final String APPROVED_BY_USERNAME = "approvedByUsername"; + public static final String APPROVED_BY_FIRSTNAME = "approvedByFirstname"; + public static final String APPROVED_BY_LASTNAME = "approvedByLastname"; + public static final String ACTIVATED_ON_DATE = "activatedOnDate"; + public static final String ACTIVATED_BY_USERNAME = "activatedByUsername"; + public static final String ACTIVATED_BY_FIRSTNAME = "activatedByFirstname"; + public static final String ACTIVATED_BY_LASTNAME = "activatedByLastname"; + public static final String CLOSED_ON_DATE = "closedOnDate"; + public static final String CLOSED_BY_USERNAME = "closedByUsername"; + public static final String CLOSED_BY_FIRSTNAME = "closedByFirstname"; + public static final String CLOSED_BY_LASTNAME = "closedByLastname"; + public static final String DEPOSIT_TYPE_ID = "depositTypeId"; + public static final String CURRENCY_CODE = "currencyCode"; + public static final String CURRENCY_NAME = "currencyName"; + public static final String CURRENCY_NAME_CODE = "currencyNameCode"; + public static final String CURRENCY_DISPLAY_SYMBOL = "currencyDisplaySymbol"; + public static final String CURRENCY_DIGITS = "currencyDigits"; + public static final String IN_MULTIPLES_OF = "inMultiplesOf"; + public static final String NOMINAL_ANNUAL_INTEREST_RATE = "nominalAnnualInterestRate"; + public static final String INTEREST_COMPOUNDING_PERIOD_TYPE = "interestCompoundingPeriodType"; + public static final String INTEREST_POSTING_PERIOD_TYPE = "interestPostingPeriodType"; + public static final String INTEREST_CALCULATION_TYPE = "interestCalculationType"; + public static final String INTEREST_CALCULATION_DAYS_IN_YEAR_TYPE = "interestCalculationDaysInYearType"; + public static final String MIN_REQUIRED_OPENING_BALANCE = "minRequiredOpeningBalance"; + public static final String LOCKIN_PERIOD_FREQUENCY = "lockinPeriodFrequency"; + public static final String LOCKIN_PERIOD_FREQUENCY_TYPE = "lockinPeriodFrequencyType"; + public static final String WITHDRAWAL_FEE_FOR_TRANSFERS = "withdrawalFeeForTransfers"; + public static final String MIN_BALANCE_FOR_INTEREST_CALCULATION = "minBalanceForInterestCalculation"; + public static final String TOTAL_DEPOSITS = "totalDeposits"; + public static final String TOTAL_WITHDRAWALS = "totalWithdrawals"; + public static final String TOTAL_WITHDRAWAL_FEES = "totalWithdrawalFees"; + public static final String TOTAL_ANNUAL_FEES = "totalAnnualFees"; + public static final String TOTAL_INTEREST_EARNED = "totalInterestEarned"; + public static final String TOTAL_INTEREST_POSTED = "totalInterestPosted"; + public static final String ACCOUNT_BALANCE = "accountBalance"; + public static final String TOTAL_FEE_CHARGE = "totalFeeCharge"; + public static final String TOTAL_PENALTY_CHARGE = "totalPenaltyCharge"; + public static final String TOTAL_WITHHOLD_TAX = "totalWithholdTax"; + public static final String INTEREST_POSTED_TILL_DATE = "interestPostedTillDate"; + public static final String WITH_HOLD_TAX = "withHoldTax"; + public static final String TAX_GROUP_ID = "taxGroupId"; + public static final String TAX_GROUP_NAME = "taxGroupName"; private final String selectFieldsSql; private final String selectTablesSql; - @Override - public abstract DepositAccountData mapRow(ResultSet rs, int rowNum) throws SQLException; - protected DepositAccountMapper() { final StringBuilder selectFieldsSqlBuilder = new StringBuilder(400); selectFieldsSqlBuilder.append("sa.id as id, sa.account_no as accountNo, sa.external_id as externalId, "); @@ -635,53 +725,53 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead public DepositAccountData mapRow(final ResultSet rs) throws SQLException { - final Long id = rs.getLong("id"); - final String accountNo = rs.getString("accountNo"); - final String externalId = rs.getString("externalId"); + final Long id = rs.getLong(ID); + final String accountNo = rs.getString(ACCOUNT_NO); + final String externalId = rs.getString(EXTERNAL_ID); - final Long groupId = JdbcSupport.getLong(rs, "groupId"); - final String groupName = rs.getString("groupName"); - final Long clientId = JdbcSupport.getLong(rs, "clientId"); - final String clientName = rs.getString("clientName"); + final Long groupId = JdbcSupport.getLong(rs, GROUP_ID); + final String groupName = rs.getString(GROUP_NAME); + final Long clientId = JdbcSupport.getLong(rs, CLIENT_ID); + final String clientName = rs.getString(CLIENT_NAME); - final Long productId = rs.getLong("productId"); - final String productName = rs.getString("productName"); + final Long productId = rs.getLong(PRODUCT_ID); + final String productName = rs.getString(PRODUCT_NAME); - final Long fieldOfficerId = rs.getLong("fieldOfficerId"); - final String fieldOfficerName = rs.getString("fieldOfficerName"); + final Long fieldOfficerId = rs.getLong(FIELD_OFFICER_ID); + final String fieldOfficerName = rs.getString(FIELD_OFFICER_NAME); - final Integer statusEnum = JdbcSupport.getInteger(rs, "statusEnum"); + final Integer statusEnum = JdbcSupport.getInteger(rs, STATUS_ENUM); final SavingsAccountStatusEnumData status = SavingsEnumerations.status(statusEnum); - final LocalDate submittedOnDate = JdbcSupport.getLocalDate(rs, "submittedOnDate"); - final String submittedByUsername = rs.getString("submittedByUsername"); - final String submittedByFirstname = rs.getString("submittedByFirstname"); - final String submittedByLastname = rs.getString("submittedByLastname"); + final LocalDate submittedOnDate = JdbcSupport.getLocalDate(rs, SUBMITTED_ON_DATE); + final String submittedByUsername = rs.getString(SUBMITTED_BY_USERNAME); + final String submittedByFirstname = rs.getString(SUBMITTED_BY_FIRSTNAME); + final String submittedByLastname = rs.getString(SUBMITTED_BY_LASTNAME); - final LocalDate rejectedOnDate = JdbcSupport.getLocalDate(rs, "rejectedOnDate"); - final String rejectedByUsername = rs.getString("rejectedByUsername"); - final String rejectedByFirstname = rs.getString("rejectedByFirstname"); - final String rejectedByLastname = rs.getString("rejectedByLastname"); + final LocalDate rejectedOnDate = JdbcSupport.getLocalDate(rs, REJECTED_ON_DATE); + final String rejectedByUsername = rs.getString(REJECTED_BY_USERNAME); + final String rejectedByFirstname = rs.getString(REJECTED_BY_FIRSTNAME); + final String rejectedByLastname = rs.getString(REJECTED_BY_LASTNAME); - final LocalDate withdrawnOnDate = JdbcSupport.getLocalDate(rs, "withdrawnOnDate"); - final String withdrawnByUsername = rs.getString("withdrawnByUsername"); - final String withdrawnByFirstname = rs.getString("withdrawnByFirstname"); - final String withdrawnByLastname = rs.getString("withdrawnByLastname"); + final LocalDate withdrawnOnDate = JdbcSupport.getLocalDate(rs, WITHDRAWN_ON_DATE); + final String withdrawnByUsername = rs.getString(WITHDRAWN_BY_USERNAME); + final String withdrawnByFirstname = rs.getString(WITHDRAWN_BY_FIRSTNAME); + final String withdrawnByLastname = rs.getString(WITHDRAWN_BY_LASTNAME); - final LocalDate approvedOnDate = JdbcSupport.getLocalDate(rs, "approvedOnDate"); - final String approvedByUsername = rs.getString("approvedByUsername"); - final String approvedByFirstname = rs.getString("approvedByFirstname"); - final String approvedByLastname = rs.getString("approvedByLastname"); + final LocalDate approvedOnDate = JdbcSupport.getLocalDate(rs, APPROVED_ON_DATE); + final String approvedByUsername = rs.getString(APPROVED_BY_USERNAME); + final String approvedByFirstname = rs.getString(APPROVED_BY_FIRSTNAME); + final String approvedByLastname = rs.getString(APPROVED_BY_LASTNAME); - final LocalDate activatedOnDate = JdbcSupport.getLocalDate(rs, "activatedOnDate"); - final String activatedByUsername = rs.getString("activatedByUsername"); - final String activatedByFirstname = rs.getString("activatedByFirstname"); - final String activatedByLastname = rs.getString("activatedByLastname"); + final LocalDate activatedOnDate = JdbcSupport.getLocalDate(rs, ACTIVATED_ON_DATE); + final String activatedByUsername = rs.getString(ACTIVATED_BY_USERNAME); + final String activatedByFirstname = rs.getString(ACTIVATED_BY_FIRSTNAME); + final String activatedByLastname = rs.getString(ACTIVATED_BY_LASTNAME); - final LocalDate closedOnDate = JdbcSupport.getLocalDate(rs, "closedOnDate"); - final String closedByUsername = rs.getString("closedByUsername"); - final String closedByFirstname = rs.getString("closedByFirstname"); - final String closedByLastname = rs.getString("closedByLastname"); + final LocalDate closedOnDate = JdbcSupport.getLocalDate(rs, CLOSED_ON_DATE); + final String closedByUsername = rs.getString(CLOSED_BY_USERNAME); + final String closedByFirstname = rs.getString(CLOSED_BY_FIRSTNAME); + final String closedByLastname = rs.getString(CLOSED_BY_LASTNAME); final SavingsAccountApplicationTimelineData timeline = new SavingsAccountApplicationTimelineData(submittedOnDate, submittedByUsername, submittedByFirstname, submittedByLastname, rejectedOnDate, rejectedByUsername, rejectedByFirstname, @@ -689,63 +779,63 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead approvedByUsername, approvedByFirstname, approvedByLastname, activatedOnDate, activatedByUsername, activatedByFirstname, activatedByLastname, closedOnDate, closedByUsername, closedByFirstname, closedByLastname); - final Integer depositTypeId = JdbcSupport.getInteger(rs, "depositTypeId"); + final Integer depositTypeId = JdbcSupport.getInteger(rs, DEPOSIT_TYPE_ID); final EnumOptionData depositType = (depositTypeId == null) ? null : SavingsEnumerations.depositType(depositTypeId); - final String currencyCode = rs.getString("currencyCode"); - final String currencyName = rs.getString("currencyName"); - final String currencyNameCode = rs.getString("currencyNameCode"); - final String currencyDisplaySymbol = rs.getString("currencyDisplaySymbol"); - final Integer currencyDigits = JdbcSupport.getInteger(rs, "currencyDigits"); - final Integer inMultiplesOf = JdbcSupport.getInteger(rs, "inMultiplesOf"); + final String currencyCode = rs.getString(CURRENCY_CODE); + final String currencyName = rs.getString(CURRENCY_NAME); + final String currencyNameCode = rs.getString(CURRENCY_NAME_CODE); + final String currencyDisplaySymbol = rs.getString(CURRENCY_DISPLAY_SYMBOL); + final Integer currencyDigits = JdbcSupport.getInteger(rs, CURRENCY_DIGITS); + final Integer inMultiplesOf = JdbcSupport.getInteger(rs, IN_MULTIPLES_OF); final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDigits, inMultiplesOf, currencyDisplaySymbol, currencyNameCode); - final BigDecimal nominalAnnualInterestRate = rs.getBigDecimal("nominalAnnualInterestRate"); + final BigDecimal nominalAnnualInterestRate = rs.getBigDecimal(NOMINAL_ANNUAL_INTEREST_RATE); final EnumOptionData interestCompoundingPeriodType = SavingsEnumerations.compoundingInterestPeriodType( - SavingsCompoundingInterestPeriodType.fromInt(JdbcSupport.getInteger(rs, "interestCompoundingPeriodType"))); + SavingsCompoundingInterestPeriodType.fromInt(JdbcSupport.getInteger(rs, INTEREST_COMPOUNDING_PERIOD_TYPE))); final EnumOptionData interestPostingPeriodType = SavingsEnumerations.interestPostingPeriodType( - SavingsPostingInterestPeriodType.fromInt(JdbcSupport.getInteger(rs, "interestPostingPeriodType"))); + SavingsPostingInterestPeriodType.fromInt(JdbcSupport.getInteger(rs, INTEREST_POSTING_PERIOD_TYPE))); final EnumOptionData interestCalculationType = SavingsEnumerations - .interestCalculationType(SavingsInterestCalculationType.fromInt(JdbcSupport.getInteger(rs, "interestCalculationType"))); + .interestCalculationType(SavingsInterestCalculationType.fromInt(JdbcSupport.getInteger(rs, INTEREST_CALCULATION_TYPE))); final EnumOptionData interestCalculationDaysInYearType = SavingsEnumerations.interestCalculationDaysInYearType( - SavingsInterestCalculationDaysInYearType.fromInt(JdbcSupport.getInteger(rs, "interestCalculationDaysInYearType"))); + SavingsInterestCalculationDaysInYearType.fromInt(JdbcSupport.getInteger(rs, INTEREST_CALCULATION_DAYS_IN_YEAR_TYPE))); - final BigDecimal minRequiredOpeningBalance = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "minRequiredOpeningBalance"); + final BigDecimal minRequiredOpeningBalance = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, MIN_REQUIRED_OPENING_BALANCE); - final Integer lockinPeriodFrequency = JdbcSupport.getInteger(rs, "lockinPeriodFrequency"); + final Integer lockinPeriodFrequency = JdbcSupport.getInteger(rs, LOCKIN_PERIOD_FREQUENCY); EnumOptionData lockinPeriodFrequencyType = null; - final Integer lockinPeriodFrequencyTypeValue = JdbcSupport.getInteger(rs, "lockinPeriodFrequencyType"); + final Integer lockinPeriodFrequencyTypeValue = JdbcSupport.getInteger(rs, LOCKIN_PERIOD_FREQUENCY_TYPE); if (lockinPeriodFrequencyTypeValue != null) { final SavingsPeriodFrequencyType lockinPeriodType = SavingsPeriodFrequencyType.fromInt(lockinPeriodFrequencyTypeValue); lockinPeriodFrequencyType = SavingsEnumerations.lockinPeriodFrequencyType(lockinPeriodType); } - final boolean withdrawalFeeForTransfers = rs.getBoolean("withdrawalFeeForTransfers"); + final boolean withdrawalFeeForTransfers = rs.getBoolean(WITHDRAWAL_FEE_FOR_TRANSFERS); final BigDecimal minBalanceForInterestCalculation = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, - "minBalanceForInterestCalculation"); + MIN_BALANCE_FOR_INTEREST_CALCULATION); - final BigDecimal totalDeposits = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "totalDeposits"); - final BigDecimal totalWithdrawals = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "totalWithdrawals"); - final BigDecimal totalWithdrawalFees = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "totalWithdrawalFees"); - final BigDecimal totalAnnualFees = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "totalAnnualFees"); + final BigDecimal totalDeposits = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, TOTAL_DEPOSITS); + final BigDecimal totalWithdrawals = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, TOTAL_WITHDRAWALS); + final BigDecimal totalWithdrawalFees = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, TOTAL_WITHDRAWAL_FEES); + final BigDecimal totalAnnualFees = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, TOTAL_ANNUAL_FEES); - final BigDecimal totalInterestEarned = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "totalInterestEarned"); - final BigDecimal totalInterestPosted = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "totalInterestPosted"); - final BigDecimal accountBalance = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "accountBalance"); - final BigDecimal totalFeeCharge = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "totalFeeCharge"); - final BigDecimal totalPenaltyCharge = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "totalPenaltyCharge"); - final BigDecimal totalWithholdTax = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "totalWithholdTax"); + final BigDecimal totalInterestEarned = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, TOTAL_INTEREST_EARNED); + final BigDecimal totalInterestPosted = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, TOTAL_INTEREST_POSTED); + final BigDecimal accountBalance = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, ACCOUNT_BALANCE); + final BigDecimal totalFeeCharge = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, TOTAL_FEE_CHARGE); + final BigDecimal totalPenaltyCharge = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, TOTAL_PENALTY_CHARGE); + final BigDecimal totalWithholdTax = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, TOTAL_WITHHOLD_TAX); final BigDecimal totalOverdraftInterestDerived = null; - final LocalDate interestPostedTillDate = JdbcSupport.getLocalDate(rs, "interestPostedTillDate"); + final LocalDate interestPostedTillDate = JdbcSupport.getLocalDate(rs, INTEREST_POSTED_TILL_DATE); - final boolean withHoldTax = rs.getBoolean("withHoldTax"); - final Long taxGroupId = JdbcSupport.getLong(rs, "taxGroupId"); - final String taxGroupName = rs.getString("taxGroupName"); + final boolean withHoldTax = rs.getBoolean(WITH_HOLD_TAX); + final Long taxGroupId = JdbcSupport.getLong(rs, TAX_GROUP_ID); + final String taxGroupName = rs.getString(TAX_GROUP_NAME); TaxGroupData taxGroupData = null; if (taxGroupId != null) { taxGroupData = TaxGroupData.lookup(taxGroupId, taxGroupName); @@ -767,6 +857,23 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead private static class FixedDepositAccountMapper extends DepositAccountMapper { + public static final String PRE_CLOSURE_PENAL_APPLICABLE = "preClosurePenalApplicable"; + public static final String PRE_CLOSURE_PENAL_INTEREST = "preClosurePenalInterest"; + public static final String PRE_CLOSURE_PENAL_INTEREST_ON_ID = "preClosurePenalInterestOnId"; + public static final String MIN_DEPOSIT_TERM = "minDepositTerm"; + public static final String MAX_DEPOSIT_TERM = "maxDepositTerm"; + public static final String MIN_DEPOSIT_TERM_TYPE_ID = "minDepositTermTypeId"; + public static final String MAX_DEPOSIT_TERM_TYPE_ID = "maxDepositTermTypeId"; + public static final String IN_MULTIPLES_OF_DEPOSIT_TERM = "inMultiplesOfDepositTerm"; + public static final String IN_MULTIPLES_OF_DEPOSIT_TERM_TYPE_ID = "inMultiplesOfDepositTermTypeId"; + public static final String DEPOSIT_AMOUNT = "depositAmount"; + public static final String MATURITY_AMOUNT = "maturityAmount"; + public static final String MATURITY_DATE = "maturityDate"; + public static final String DEPOSIT_PERIOD = "depositPeriod"; + public static final String DEPOSIT_PERIOD_FREQUENCY_TYPE_ID = "depositPeriodFrequencyTypeId"; + public static final String ON_ACCOUNT_CLOSURE_ID = "onAccountClosureId"; + public static final String TRANSFER_INTEREST_TO_SAVINGS = "transferInterestToSavings"; + public static final String TRANSFER_TO_SAVINGS_ID = "transferToSavingsId"; private final String schemaSql; FixedDepositAccountMapper() { @@ -805,39 +912,39 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead public FixedDepositAccountData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException { final DepositAccountData depositAccountData = super.mapRow(rs); - final boolean preClosurePenalApplicable = rs.getBoolean("preClosurePenalApplicable"); - final BigDecimal preClosurePenalInterest = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "preClosurePenalInterest"); - final Integer preClosurePenalInterestOnTypeId = JdbcSupport.getInteger(rs, "preClosurePenalInterestOnId"); + final boolean preClosurePenalApplicable = rs.getBoolean(PRE_CLOSURE_PENAL_APPLICABLE); + final BigDecimal preClosurePenalInterest = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, PRE_CLOSURE_PENAL_INTEREST); + final Integer preClosurePenalInterestOnTypeId = JdbcSupport.getInteger(rs, PRE_CLOSURE_PENAL_INTEREST_ON_ID); final EnumOptionData preClosurePenalInterestOnType = (preClosurePenalInterestOnTypeId == null) ? null : SavingsEnumerations.preClosurePenaltyInterestOnType(preClosurePenalInterestOnTypeId); - final Integer minDepositTerm = JdbcSupport.getInteger(rs, "minDepositTerm"); - final Integer maxDepositTerm = JdbcSupport.getInteger(rs, "maxDepositTerm"); - final Integer minDepositTermTypeId = JdbcSupport.getInteger(rs, "minDepositTermTypeId"); + final Integer minDepositTerm = JdbcSupport.getInteger(rs, MIN_DEPOSIT_TERM); + final Integer maxDepositTerm = JdbcSupport.getInteger(rs, MAX_DEPOSIT_TERM); + final Integer minDepositTermTypeId = JdbcSupport.getInteger(rs, MIN_DEPOSIT_TERM_TYPE_ID); final EnumOptionData minDepositTermType = (minDepositTermTypeId == null) ? null : SavingsEnumerations.depositTermFrequencyType(minDepositTermTypeId); - final Integer maxDepositTermTypeId = JdbcSupport.getInteger(rs, "maxDepositTermTypeId"); + final Integer maxDepositTermTypeId = JdbcSupport.getInteger(rs, MAX_DEPOSIT_TERM_TYPE_ID); final EnumOptionData maxDepositTermType = (maxDepositTermTypeId == null) ? null : SavingsEnumerations.depositTermFrequencyType(maxDepositTermTypeId); - final Integer inMultiplesOfDepositTerm = JdbcSupport.getInteger(rs, "inMultiplesOfDepositTerm"); - final Integer inMultiplesOfDepositTermTypeId = JdbcSupport.getInteger(rs, "inMultiplesOfDepositTermTypeId"); + final Integer inMultiplesOfDepositTerm = JdbcSupport.getInteger(rs, IN_MULTIPLES_OF_DEPOSIT_TERM); + final Integer inMultiplesOfDepositTermTypeId = JdbcSupport.getInteger(rs, IN_MULTIPLES_OF_DEPOSIT_TERM_TYPE_ID); final EnumOptionData inMultiplesOfDepositTermType = (inMultiplesOfDepositTermTypeId == null) ? null : SavingsEnumerations.depositTermFrequencyType(inMultiplesOfDepositTermTypeId); - final BigDecimal depositAmount = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "depositAmount"); - final BigDecimal maturityAmount = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "maturityAmount"); - final LocalDate maturityDate = JdbcSupport.getLocalDate(rs, "maturityDate"); - final Integer depositPeriod = JdbcSupport.getInteger(rs, "depositPeriod"); - final Integer depositPeriodFrequencyTypeId = JdbcSupport.getInteger(rs, "depositPeriodFrequencyTypeId"); + final BigDecimal depositAmount = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, DEPOSIT_AMOUNT); + final BigDecimal maturityAmount = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, MATURITY_AMOUNT); + final LocalDate maturityDate = JdbcSupport.getLocalDate(rs, MATURITY_DATE); + final Integer depositPeriod = JdbcSupport.getInteger(rs, DEPOSIT_PERIOD); + final Integer depositPeriodFrequencyTypeId = JdbcSupport.getInteger(rs, DEPOSIT_PERIOD_FREQUENCY_TYPE_ID); final EnumOptionData depositPeriodFrequencyType = (depositPeriodFrequencyTypeId == null) ? null : SavingsEnumerations.depositPeriodFrequency(depositPeriodFrequencyTypeId); - final Integer onAccountClosureId = JdbcSupport.getInteger(rs, "onAccountClosureId"); + final Integer onAccountClosureId = JdbcSupport.getInteger(rs, ON_ACCOUNT_CLOSURE_ID); final EnumOptionData onAccountClosureType = (onAccountClosureId == null) ? null : SavingsEnumerations.depositAccountOnClosureType(onAccountClosureId); - final Boolean transferInterestToSavings = rs.getBoolean("transferInterestToSavings"); + final Boolean transferInterestToSavings = rs.getBoolean(TRANSFER_INTEREST_TO_SAVINGS); - final Long transferToSavingsId = JdbcSupport.getLong(rs, "transferToSavingsId"); + final Long transferToSavingsId = JdbcSupport.getLong(rs, TRANSFER_TO_SAVINGS_ID); return FixedDepositAccountData.instance(depositAccountData, preClosurePenalApplicable, preClosurePenalInterest, preClosurePenalInterestOnType, minDepositTerm, maxDepositTerm, minDepositTermType, maxDepositTermType, @@ -848,6 +955,29 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead private static class RecurringDepositAccountMapper extends DepositAccountMapper { + public static final String PRE_CLOSURE_PENAL_APPLICABLE = "preClosurePenalApplicable"; + public static final String PRE_CLOSURE_PENAL_INTEREST = "preClosurePenalInterest"; + public static final String PRE_CLOSURE_PENAL_INTEREST_ON_ID = "preClosurePenalInterestOnId"; + public static final String MIN_DEPOSIT_TERM = "minDepositTerm"; + public static final String MAX_DEPOSIT_TERM = "maxDepositTerm"; + public static final String MIN_DEPOSIT_TERM_TYPE_ID = "minDepositTermTypeId"; + public static final String MAX_DEPOSIT_TERM_TYPE_ID = "maxDepositTermTypeId"; + public static final String IN_MULTIPLES_OF_DEPOSIT_TERM = "inMultiplesOfDepositTerm"; + public static final String IN_MULTIPLES_OF_DEPOSIT_TERM_TYPE_ID = "inMultiplesOfDepositTermTypeId"; + public static final String DEPOSIT_AMOUNT = "depositAmount"; + public static final String MATURITY_AMOUNT = "maturityAmount"; + public static final String MATURITY_DATE = "maturityDate"; + public static final String DEPOSIT_PERIOD = "depositPeriod"; + public static final String DEPOSIT_PERIOD_FREQUENCY_TYPE_ID = "depositPeriodFrequencyTypeId"; + public static final String MANDATORY_RECOMMENDED_DEPOSIT_AMOUNT = "mandatoryRecommendedDepositAmount"; + public static final String TOTAL_OVERDUE_AMOUNT = "totalOverdueAmount"; + public static final String NO_OF_OVERDUE_INSTALLMENTS = "noOfOverdueInstallments"; + public static final String IS_MANDATORY_DEPOSIT = "isMandatoryDeposit"; + public static final String ALLOW_WITHDRAWAL = "allowWithdrawal"; + public static final String ADJUST_ADVANCE_TOWARDS_FUTURE_PAYMENTS = "adjustAdvanceTowardsFuturePayments"; + public static final String IS_CALENDAR_INHERITED = "isCalendarInherited"; + public static final String ON_ACCOUNT_CLOSURE_ID = "onAccountClosureId"; + public static final String EXPECTED_FIRST_DEPOSIT_ON_DATE = "expectedFirstDepositOnDate"; private final String schemaSql; RecurringDepositAccountMapper() { @@ -894,44 +1024,44 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead final DepositAccountData depositAccountData = super.mapRow(rs); - final boolean preClosurePenalApplicable = rs.getBoolean("preClosurePenalApplicable"); - final BigDecimal preClosurePenalInterest = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "preClosurePenalInterest"); - final Integer preClosurePenalInterestOnTypeId = JdbcSupport.getInteger(rs, "preClosurePenalInterestOnId"); + final boolean preClosurePenalApplicable = rs.getBoolean(PRE_CLOSURE_PENAL_APPLICABLE); + final BigDecimal preClosurePenalInterest = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, PRE_CLOSURE_PENAL_INTEREST); + final Integer preClosurePenalInterestOnTypeId = JdbcSupport.getInteger(rs, PRE_CLOSURE_PENAL_INTEREST_ON_ID); final EnumOptionData preClosurePenalInterestOnType = (preClosurePenalInterestOnTypeId == null) ? null : SavingsEnumerations.preClosurePenaltyInterestOnType(preClosurePenalInterestOnTypeId); - final Integer minDepositTerm = JdbcSupport.getInteger(rs, "minDepositTerm"); - final Integer maxDepositTerm = JdbcSupport.getInteger(rs, "maxDepositTerm"); - final Integer minDepositTermTypeId = JdbcSupport.getInteger(rs, "minDepositTermTypeId"); + final Integer minDepositTerm = JdbcSupport.getInteger(rs, MIN_DEPOSIT_TERM); + final Integer maxDepositTerm = JdbcSupport.getInteger(rs, MAX_DEPOSIT_TERM); + final Integer minDepositTermTypeId = JdbcSupport.getInteger(rs, MIN_DEPOSIT_TERM_TYPE_ID); final EnumOptionData minDepositTermType = (minDepositTermTypeId == null) ? null : SavingsEnumerations.depositTermFrequencyType(minDepositTermTypeId); - final Integer maxDepositTermTypeId = JdbcSupport.getInteger(rs, "maxDepositTermTypeId"); + final Integer maxDepositTermTypeId = JdbcSupport.getInteger(rs, MAX_DEPOSIT_TERM_TYPE_ID); final EnumOptionData maxDepositTermType = (maxDepositTermTypeId == null) ? null : SavingsEnumerations.depositTermFrequencyType(maxDepositTermTypeId); - final Integer inMultiplesOfDepositTerm = JdbcSupport.getInteger(rs, "inMultiplesOfDepositTerm"); - final Integer inMultiplesOfDepositTermTypeId = JdbcSupport.getInteger(rs, "inMultiplesOfDepositTermTypeId"); + final Integer inMultiplesOfDepositTerm = JdbcSupport.getInteger(rs, IN_MULTIPLES_OF_DEPOSIT_TERM); + final Integer inMultiplesOfDepositTermTypeId = JdbcSupport.getInteger(rs, IN_MULTIPLES_OF_DEPOSIT_TERM_TYPE_ID); final EnumOptionData inMultiplesOfDepositTermType = (inMultiplesOfDepositTermTypeId == null) ? null : SavingsEnumerations.depositTermFrequencyType(inMultiplesOfDepositTermTypeId); - final BigDecimal depositAmount = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "depositAmount"); - final BigDecimal maturityAmount = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "maturityAmount"); - final LocalDate maturityDate = JdbcSupport.getLocalDate(rs, "maturityDate"); - final Integer depositPeriod = JdbcSupport.getInteger(rs, "depositPeriod"); - final Integer depositPeriodFrequencyTypeId = JdbcSupport.getInteger(rs, "depositPeriodFrequencyTypeId"); + final BigDecimal depositAmount = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, DEPOSIT_AMOUNT); + final BigDecimal maturityAmount = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, MATURITY_AMOUNT); + final LocalDate maturityDate = JdbcSupport.getLocalDate(rs, MATURITY_DATE); + final Integer depositPeriod = JdbcSupport.getInteger(rs, DEPOSIT_PERIOD); + final Integer depositPeriodFrequencyTypeId = JdbcSupport.getInteger(rs, DEPOSIT_PERIOD_FREQUENCY_TYPE_ID); final EnumOptionData depositPeriodFrequencyType = (depositPeriodFrequencyTypeId == null) ? null : SavingsEnumerations.depositPeriodFrequency(depositPeriodFrequencyTypeId); final BigDecimal mandatoryRecommendedDepositAmount = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, - "mandatoryRecommendedDepositAmount"); - final BigDecimal totalOverdueAmount = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "totalOverdueAmount"); - final Integer noOfOverdueInstallments = JdbcSupport.getInteger(rs, "noOfOverdueInstallments"); - final boolean isMandatoryDeposit = rs.getBoolean("isMandatoryDeposit"); - final boolean allowWithdrawal = rs.getBoolean("allowWithdrawal"); - final boolean adjustAdvanceTowardsFuturePayments = rs.getBoolean("adjustAdvanceTowardsFuturePayments"); - final boolean isCalendarInherited = rs.getBoolean("isCalendarInherited"); + MANDATORY_RECOMMENDED_DEPOSIT_AMOUNT); + final BigDecimal totalOverdueAmount = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, TOTAL_OVERDUE_AMOUNT); + final Integer noOfOverdueInstallments = JdbcSupport.getInteger(rs, NO_OF_OVERDUE_INSTALLMENTS); + final boolean isMandatoryDeposit = rs.getBoolean(IS_MANDATORY_DEPOSIT); + final boolean allowWithdrawal = rs.getBoolean(ALLOW_WITHDRAWAL); + final boolean adjustAdvanceTowardsFuturePayments = rs.getBoolean(ADJUST_ADVANCE_TOWARDS_FUTURE_PAYMENTS); + final boolean isCalendarInherited = rs.getBoolean(IS_CALENDAR_INHERITED); - final Integer onAccountClosureId = JdbcSupport.getInteger(rs, "onAccountClosureId"); + final Integer onAccountClosureId = JdbcSupport.getInteger(rs, ON_ACCOUNT_CLOSURE_ID); final EnumOptionData onAccountClosureType = (onAccountClosureId == null) ? null : SavingsEnumerations.depositAccountOnClosureType(onAccountClosureId); - final LocalDate expectedFirstDepositOnDate = JdbcSupport.getLocalDate(rs, "expectedFirstDepositOnDate"); + final LocalDate expectedFirstDepositOnDate = JdbcSupport.getLocalDate(rs, EXPECTED_FIRST_DEPOSIT_ON_DATE); return RecurringDepositAccountData.instance(depositAccountData, preClosurePenalApplicable, preClosurePenalInterest, preClosurePenalInterestOnType, minDepositTerm, maxDepositTerm, minDepositTermType, maxDepositTermType, @@ -945,6 +1075,10 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead private static final class DepositAccountLookupMapper implements RowMapper { + public static final String ID = "id"; + public static final String ACCOUNT_NUMBER = "accountNumber"; + public static final String DEPOSIT_TYPE_ID = "depositTypeId"; + public String schema() { return " sa.id as id, sa.account_no as accountNumber, sa.deposit_type_enum as depositTypeId from m_savings_account sa "; } @@ -952,26 +1086,49 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead @Override public DepositAccountData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException { - final Long id = rs.getLong("id"); - final String name = rs.getString("accountNumber"); - final Integer depositTypeId = JdbcSupport.getInteger(rs, "depositTypeId"); + final Long id = rs.getLong(ID); + final String name = rs.getString(ACCOUNT_NUMBER); + final Integer depositTypeId = JdbcSupport.getInteger(rs, DEPOSIT_TYPE_ID); final EnumOptionData depositType = (depositTypeId == null) ? null : SavingsEnumerations.depositType(depositTypeId); return DepositAccountData.lookup(id, name, depositType); } } - private DepositAccountMapper getDepositAccountMapper(final DepositAccountType depositAccountType) { - if (depositAccountType.isFixedDeposit()) { - return this.fixedDepositAccountRowMapper; - } else if (depositAccountType.isRecurringDeposit()) { - return this.recurringDepositAccountRowMapper; - } - return null; - } - private static final class SavingsAccountTransactionsMapper implements RowMapper { + public static final String TRANSACTION_ID = "transactionId"; + public static final String TRANSACTION_TYPE = "transactionType"; + public static final String TRANSACTION_DATE = "transactionDate"; + public static final String TRANSACTION_AMOUNT = "transactionAmount"; + public static final String RUNNING_BALANCE = "runningBalance"; + public static final String REVERSED = "reversed"; + public static final String SAVINGS_ID = "savingsId"; + public static final String ACCOUNT_NO = "accountNo"; + public static final String PAYMENT_TYPE = "paymentType"; + public static final String PAYMENT_TYPE_NAME = "paymentTypeName"; + public static final String ACCOUNT_NUMBER = "accountNumber"; + public static final String CHECK_NUMBER = "checkNumber"; + public static final String ROUTING_CODE = "routingCode"; + public static final String RECEIPT_NUMBER = "receiptNumber"; + public static final String BANK_NUMBER = "bankNumber"; + public static final String CURRENCY_CODE = "currencyCode"; + public static final String CURRENCY_NAME = "currencyName"; + public static final String CURRENCY_NAME_CODE = "currencyNameCode"; + public static final String CURRENCY_DISPLAY_SYMBOL = "currencyDisplaySymbol"; + public static final String CURRENCY_DIGITS = "currencyDigits"; + public static final String IN_MULTIPLES_OF = "inMultiplesOf"; + public static final String FROM_TRANSFER_ID = "fromTransferId"; + public static final String TO_TRANSFER_ID = "toTransferId"; + public static final String FROM_TRANSFER_DATE = "fromTransferDate"; + public static final String FROM_TRANSFER_AMOUNT = "fromTransferAmount"; + public static final String FROM_TRANSFER_REVERSED = "fromTransferReversed"; + public static final String FROM_TRANSFER_DESCRIPTION = "fromTransferDescription"; + public static final String TO_TRANSFER_DATE = "toTransferDate"; + public static final String TO_TRANSFER_AMOUNT = "toTransferAmount"; + public static final String TO_TRANSFER_REVERSED = "toTransferReversed"; + public static final String TO_TRANSFER_DESCRIPTION = "toTransferDescription"; + public static final String SUBMITTED_BY_USERNAME = "submittedByUsername"; private final String schemaSql; SavingsAccountTransactionsMapper() { @@ -1012,66 +1169,66 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead @Override public SavingsAccountTransactionData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException { - final Long id = rs.getLong("transactionId"); - final int transactionTypeInt = JdbcSupport.getInteger(rs, "transactionType"); + final Long id = rs.getLong(TRANSACTION_ID); + final int transactionTypeInt = JdbcSupport.getInteger(rs, TRANSACTION_TYPE); final SavingsAccountTransactionEnumData transactionType = SavingsEnumerations.transactionType(transactionTypeInt); - final LocalDate date = JdbcSupport.getLocalDate(rs, "transactionDate"); - final BigDecimal amount = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "transactionAmount"); + final LocalDate date = JdbcSupport.getLocalDate(rs, TRANSACTION_DATE); + final BigDecimal amount = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, TRANSACTION_AMOUNT); final BigDecimal outstandingChargeAmount = null; - final BigDecimal runningBalance = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "runningBalance"); - final boolean reversed = rs.getBoolean("reversed"); + final BigDecimal runningBalance = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, RUNNING_BALANCE); + final boolean reversed = rs.getBoolean(REVERSED); - final Long savingsId = rs.getLong("savingsId"); - final String accountNo = rs.getString("accountNo"); + final Long savingsId = rs.getLong(SAVINGS_ID); + final String accountNo = rs.getString(ACCOUNT_NO); PaymentDetailData paymentDetailData = null; if (transactionType.isDepositOrWithdrawal()) { - final Long paymentTypeId = JdbcSupport.getLong(rs, "paymentType"); + final Long paymentTypeId = JdbcSupport.getLong(rs, PAYMENT_TYPE); if (paymentTypeId != null) { - final String typeName = rs.getString("paymentTypeName"); + final String typeName = rs.getString(PAYMENT_TYPE_NAME); final PaymentTypeData paymentType = PaymentTypeData.instance(paymentTypeId, typeName); - final String accountNumber = rs.getString("accountNumber"); - final String checkNumber = rs.getString("checkNumber"); - final String routingCode = rs.getString("routingCode"); - final String receiptNumber = rs.getString("receiptNumber"); - final String bankNumber = rs.getString("bankNumber"); + final String accountNumber = rs.getString(ACCOUNT_NUMBER); + final String checkNumber = rs.getString(CHECK_NUMBER); + final String routingCode = rs.getString(ROUTING_CODE); + final String receiptNumber = rs.getString(RECEIPT_NUMBER); + final String bankNumber = rs.getString(BANK_NUMBER); paymentDetailData = new PaymentDetailData(id, paymentType, accountNumber, checkNumber, routingCode, receiptNumber, bankNumber); } } - final String currencyCode = rs.getString("currencyCode"); - final String currencyName = rs.getString("currencyName"); - final String currencyNameCode = rs.getString("currencyNameCode"); - final String currencyDisplaySymbol = rs.getString("currencyDisplaySymbol"); - final Integer currencyDigits = JdbcSupport.getInteger(rs, "currencyDigits"); - final Integer inMultiplesOf = JdbcSupport.getInteger(rs, "inMultiplesOf"); + final String currencyCode = rs.getString(CURRENCY_CODE); + final String currencyName = rs.getString(CURRENCY_NAME); + final String currencyNameCode = rs.getString(CURRENCY_NAME_CODE); + final String currencyDisplaySymbol = rs.getString(CURRENCY_DISPLAY_SYMBOL); + final Integer currencyDigits = JdbcSupport.getInteger(rs, CURRENCY_DIGITS); + final Integer inMultiplesOf = JdbcSupport.getInteger(rs, IN_MULTIPLES_OF); final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDigits, inMultiplesOf, currencyDisplaySymbol, currencyNameCode); AccountTransferData transfer = null; - final Long fromTransferId = JdbcSupport.getLong(rs, "fromTransferId"); - final Long toTransferId = JdbcSupport.getLong(rs, "toTransferId"); + final Long fromTransferId = JdbcSupport.getLong(rs, FROM_TRANSFER_ID); + final Long toTransferId = JdbcSupport.getLong(rs, TO_TRANSFER_ID); if (fromTransferId != null) { - final LocalDate fromTransferDate = JdbcSupport.getLocalDate(rs, "fromTransferDate"); - final BigDecimal fromTransferAmount = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "fromTransferAmount"); - final boolean fromTransferReversed = rs.getBoolean("fromTransferReversed"); - final String fromTransferDescription = rs.getString("fromTransferDescription"); + final LocalDate fromTransferDate = JdbcSupport.getLocalDate(rs, FROM_TRANSFER_DATE); + final BigDecimal fromTransferAmount = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, FROM_TRANSFER_AMOUNT); + final boolean fromTransferReversed = rs.getBoolean(FROM_TRANSFER_REVERSED); + final String fromTransferDescription = rs.getString(FROM_TRANSFER_DESCRIPTION); transfer = AccountTransferData.transferBasicDetails(fromTransferId, currency, fromTransferAmount, fromTransferDate, fromTransferDescription, fromTransferReversed); } else if (toTransferId != null) { - final LocalDate toTransferDate = JdbcSupport.getLocalDate(rs, "toTransferDate"); - final BigDecimal toTransferAmount = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "toTransferAmount"); - final boolean toTransferReversed = rs.getBoolean("toTransferReversed"); - final String toTransferDescription = rs.getString("toTransferDescription"); + final LocalDate toTransferDate = JdbcSupport.getLocalDate(rs, TO_TRANSFER_DATE); + final BigDecimal toTransferAmount = JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, TO_TRANSFER_AMOUNT); + final boolean toTransferReversed = rs.getBoolean(TO_TRANSFER_REVERSED); + final String toTransferDescription = rs.getString(TO_TRANSFER_DESCRIPTION); transfer = AccountTransferData.transferBasicDetails(toTransferId, currency, toTransferAmount, toTransferDate, toTransferDescription, toTransferReversed); } final boolean postInterestAsOn = false; - final String submittedByUsername = rs.getString("submittedByUsername"); + final String submittedByUsername = rs.getString(SUBMITTED_BY_USERNAME); final String note = null; return SavingsAccountTransactionData.create(id, transactionType, paymentDetailData, savingsId, accountNo, date, currency, amount, outstandingChargeAmount, runningBalance, reversed, transfer, postInterestAsOn, submittedByUsername, note); @@ -1080,6 +1237,28 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead private abstract static class DepositAccountTemplateMapper implements RowMapper { + public static final String DEPOSIT_TYPE_ID = "depositTypeId"; + public static final String PRODUCT_ID = "productId"; + public static final String PRODUCT_NAME = "productName"; + public static final String CURRENCY_CODE = "currencyCode"; + public static final String CURRENCY_NAME = "currencyName"; + public static final String CURRENCY_NAME_CODE = "currencyNameCode"; + public static final String CURRENCY_DISPLAY_SYMBOL = "currencyDisplaySymbol"; + public static final String CURRENCY_DIGITS = "currencyDigits"; + public static final String IN_MULTIPLES_OF = "inMultiplesOf"; + public static final String NOMINAL_ANNUAL_ITEREST_RATE = "nominalAnnualIterestRate"; + public static final String INTEREST_COMPOUNDING_PERIOD_TYPE = "interestCompoundingPeriodType"; + public static final String INTEREST_POSTING_PERIOD_TYPE = "interestPostingPeriodType"; + public static final String INTEREST_CALCULATION_TYPE = "interestCalculationType"; + public static final String INTEREST_CALCULATION_DAYS_IN_YEAR_TYPE = "interestCalculationDaysInYearType"; + public static final String MIN_REQUIRED_OPENING_BALANCE = "minRequiredOpeningBalance"; + public static final String LOCKIN_PERIOD_FREQUENCY = "lockinPeriodFrequency"; + public static final String LOCKIN_PERIOD_FREQUENCY_TYPE = "lockinPeriodFrequencyType"; + public static final String WITHDRAWAL_FEE_FOR_TRANSFERS = "withdrawalFeeForTransfers"; + public static final String MIN_BALANCE_FOR_INTEREST_CALCULATION = "minBalanceForInterestCalculation"; + public static final String WITH_HOLD_TAX = "withHoldTax"; + public static final String TAX_GROUP_ID = "taxGroupId"; + public static final String TAX_GROUP_NAME = "taxGroupName"; private final String selectFieldsSql; private final String selectTablesSql; @@ -1131,52 +1310,49 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead public abstract String schema(); - @Override - public abstract DepositAccountData mapRow(ResultSet rs, int rowNum) throws SQLException; - public DepositAccountData mapRow(final ResultSet rs) throws SQLException { - final Integer depositTypeId = JdbcSupport.getInteger(rs, "depositTypeId"); + final Integer depositTypeId = JdbcSupport.getInteger(rs, DEPOSIT_TYPE_ID); final EnumOptionData depositType = (depositTypeId == null) ? null : SavingsEnumerations.depositType(depositTypeId); - final Long productId = rs.getLong("productId"); - final String productName = rs.getString("productName"); + final Long productId = rs.getLong(PRODUCT_ID); + final String productName = rs.getString(PRODUCT_NAME); - final String currencyCode = rs.getString("currencyCode"); - final String currencyName = rs.getString("currencyName"); - final String currencyNameCode = rs.getString("currencyNameCode"); - final String currencyDisplaySymbol = rs.getString("currencyDisplaySymbol"); - final Integer currencyDigits = JdbcSupport.getInteger(rs, "currencyDigits"); - final Integer inMultiplesOf = JdbcSupport.getInteger(rs, "inMultiplesOf"); + final String currencyCode = rs.getString(CURRENCY_CODE); + final String currencyName = rs.getString(CURRENCY_NAME); + final String currencyNameCode = rs.getString(CURRENCY_NAME_CODE); + final String currencyDisplaySymbol = rs.getString(CURRENCY_DISPLAY_SYMBOL); + final Integer currencyDigits = JdbcSupport.getInteger(rs, CURRENCY_DIGITS); + final Integer inMultiplesOf = JdbcSupport.getInteger(rs, IN_MULTIPLES_OF); final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDigits, inMultiplesOf, currencyDisplaySymbol, currencyNameCode); - final BigDecimal nominalAnnualIterestRate = rs.getBigDecimal("nominalAnnualIterestRate"); + final BigDecimal nominalAnnualIterestRate = rs.getBigDecimal(NOMINAL_ANNUAL_ITEREST_RATE); final EnumOptionData interestCompoundingPeriodType = SavingsEnumerations.compoundingInterestPeriodType( - SavingsCompoundingInterestPeriodType.fromInt(JdbcSupport.getInteger(rs, "interestCompoundingPeriodType"))); + SavingsCompoundingInterestPeriodType.fromInt(JdbcSupport.getInteger(rs, INTEREST_COMPOUNDING_PERIOD_TYPE))); final EnumOptionData interestPostingPeriodType = SavingsEnumerations.interestPostingPeriodType( - SavingsPostingInterestPeriodType.fromInt(JdbcSupport.getInteger(rs, "interestPostingPeriodType"))); + SavingsPostingInterestPeriodType.fromInt(JdbcSupport.getInteger(rs, INTEREST_POSTING_PERIOD_TYPE))); final EnumOptionData interestCalculationType = SavingsEnumerations - .interestCalculationType(SavingsInterestCalculationType.fromInt(JdbcSupport.getInteger(rs, "interestCalculationType"))); + .interestCalculationType(SavingsInterestCalculationType.fromInt(JdbcSupport.getInteger(rs, INTEREST_CALCULATION_TYPE))); final EnumOptionData interestCalculationDaysInYearType = SavingsEnumerations.interestCalculationDaysInYearType( - SavingsInterestCalculationDaysInYearType.fromInt(JdbcSupport.getInteger(rs, "interestCalculationDaysInYearType"))); + SavingsInterestCalculationDaysInYearType.fromInt(JdbcSupport.getInteger(rs, INTEREST_CALCULATION_DAYS_IN_YEAR_TYPE))); - final BigDecimal minRequiredOpeningBalance = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "minRequiredOpeningBalance"); + final BigDecimal minRequiredOpeningBalance = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, MIN_REQUIRED_OPENING_BALANCE); - final Integer lockinPeriodFrequency = JdbcSupport.getInteger(rs, "lockinPeriodFrequency"); + final Integer lockinPeriodFrequency = JdbcSupport.getInteger(rs, LOCKIN_PERIOD_FREQUENCY); EnumOptionData lockinPeriodFrequencyType = null; - final Integer lockinPeriodFrequencyTypeValue = JdbcSupport.getInteger(rs, "lockinPeriodFrequencyType"); + final Integer lockinPeriodFrequencyTypeValue = JdbcSupport.getInteger(rs, LOCKIN_PERIOD_FREQUENCY_TYPE); if (lockinPeriodFrequencyTypeValue != null) { final SavingsPeriodFrequencyType lockinPeriodType = SavingsPeriodFrequencyType.fromInt(lockinPeriodFrequencyTypeValue); lockinPeriodFrequencyType = SavingsEnumerations.lockinPeriodFrequencyType(lockinPeriodType); } - final boolean withdrawalFeeForTransfers = rs.getBoolean("withdrawalFeeForTransfers"); + final boolean withdrawalFeeForTransfers = rs.getBoolean(WITHDRAWAL_FEE_FOR_TRANSFERS); final BigDecimal minBalanceForInterestCalculation = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, - "minBalanceForInterestCalculation"); + MIN_BALANCE_FOR_INTEREST_CALCULATION); Long clientId = null; String clientName = null; @@ -1198,9 +1374,9 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead final SavingsAccountSummaryData summary = null; final SavingsAccountApplicationTimelineData timeline = SavingsAccountApplicationTimelineData.templateDefault(); - final boolean withHoldTax = rs.getBoolean("withHoldTax"); - final Long taxGroupId = JdbcSupport.getLong(rs, "taxGroupId"); - final String taxGroupName = rs.getString("taxGroupName"); + final boolean withHoldTax = rs.getBoolean(WITH_HOLD_TAX); + final Long taxGroupId = JdbcSupport.getLong(rs, TAX_GROUP_ID); + final String taxGroupName = rs.getString(TAX_GROUP_NAME); TaxGroupData taxGroupData = null; if (taxGroupId != null) { taxGroupData = TaxGroupData.lookup(taxGroupId, taxGroupName); @@ -1216,6 +1392,15 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead private static class FixedDepositAccountTemplateMapper extends DepositAccountTemplateMapper { + public static final String PRE_CLOSURE_PENAL_APPLICABLE = "preClosurePenalApplicable"; + public static final String PRE_CLOSURE_PENAL_INTEREST = "preClosurePenalInterest"; + public static final String PRE_CLOSURE_PENAL_INTEREST_ON_ID = "preClosurePenalInterestOnId"; + public static final String MIN_DEPOSIT_TERM = "minDepositTerm"; + public static final String MAX_DEPOSIT_TERM = "maxDepositTerm"; + public static final String MIN_DEPOSIT_TERM_TYPE_ID = "minDepositTermTypeId"; + public static final String MAX_DEPOSIT_TERM_TYPE_ID = "maxDepositTermTypeId"; + public static final String IN_MULTIPLES_OF_DEPOSIT_TERM = "inMultiplesOfDepositTerm"; + public static final String IN_MULTIPLES_OF_DEPOSIT_TERM_TYPE_ID = "inMultiplesOfDepositTermTypeId"; private final String schemaSql; FixedDepositAccountTemplateMapper(final ClientData client, final GroupGeneralData group) { @@ -1248,22 +1433,22 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead final DepositAccountData depositAccountData = super.mapRow(rs); - final boolean preClosurePenalApplicable = rs.getBoolean("preClosurePenalApplicable"); - final BigDecimal preClosurePenalInterest = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "preClosurePenalInterest"); - final Integer preClosurePenalInterestOnTypeId = JdbcSupport.getInteger(rs, "preClosurePenalInterestOnId"); + final boolean preClosurePenalApplicable = rs.getBoolean(PRE_CLOSURE_PENAL_APPLICABLE); + final BigDecimal preClosurePenalInterest = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, PRE_CLOSURE_PENAL_INTEREST); + final Integer preClosurePenalInterestOnTypeId = JdbcSupport.getInteger(rs, PRE_CLOSURE_PENAL_INTEREST_ON_ID); final EnumOptionData preClosurePenalInterestOnType = (preClosurePenalInterestOnTypeId == null) ? null : SavingsEnumerations.preClosurePenaltyInterestOnType(preClosurePenalInterestOnTypeId); - final Integer minDepositTerm = JdbcSupport.getInteger(rs, "minDepositTerm"); - final Integer maxDepositTerm = JdbcSupport.getInteger(rs, "maxDepositTerm"); - final Integer minDepositTermTypeId = JdbcSupport.getInteger(rs, "minDepositTermTypeId"); + final Integer minDepositTerm = JdbcSupport.getInteger(rs, MIN_DEPOSIT_TERM); + final Integer maxDepositTerm = JdbcSupport.getInteger(rs, MAX_DEPOSIT_TERM); + final Integer minDepositTermTypeId = JdbcSupport.getInteger(rs, MIN_DEPOSIT_TERM_TYPE_ID); final EnumOptionData minDepositTermType = (minDepositTermTypeId == null) ? null : SavingsEnumerations.depositTermFrequencyType(minDepositTermTypeId); - final Integer maxDepositTermTypeId = JdbcSupport.getInteger(rs, "maxDepositTermTypeId"); + final Integer maxDepositTermTypeId = JdbcSupport.getInteger(rs, MAX_DEPOSIT_TERM_TYPE_ID); final EnumOptionData maxDepositTermType = (maxDepositTermTypeId == null) ? null : SavingsEnumerations.depositTermFrequencyType(maxDepositTermTypeId); - final Integer inMultiplesOfDepositTerm = JdbcSupport.getInteger(rs, "inMultiplesOfDepositTerm"); - final Integer inMultiplesOfDepositTermTypeId = JdbcSupport.getInteger(rs, "inMultiplesOfDepositTermTypeId"); + final Integer inMultiplesOfDepositTerm = JdbcSupport.getInteger(rs, IN_MULTIPLES_OF_DEPOSIT_TERM); + final Integer inMultiplesOfDepositTermTypeId = JdbcSupport.getInteger(rs, IN_MULTIPLES_OF_DEPOSIT_TERM_TYPE_ID); final EnumOptionData inMultiplesOfDepositTermType = (inMultiplesOfDepositTermTypeId == null) ? null : SavingsEnumerations.depositTermFrequencyType(inMultiplesOfDepositTermTypeId); @@ -1284,6 +1469,18 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead private static class RecurringDepositAccountTemplateMapper extends DepositAccountTemplateMapper { + public static final String PRE_CLOSURE_PENAL_APPLICABLE = "preClosurePenalApplicable"; + public static final String PRE_CLOSURE_PENAL_INTEREST = "preClosurePenalInterest"; + public static final String PRE_CLOSURE_PENAL_INTEREST_ON_ID = "preClosurePenalInterestOnId"; + public static final String MIN_DEPOSIT_TERM = "minDepositTerm"; + public static final String MAX_DEPOSIT_TERM = "maxDepositTerm"; + public static final String MIN_DEPOSIT_TERM_TYPE_ID = "minDepositTermTypeId"; + public static final String MAX_DEPOSIT_TERM_TYPE_ID = "maxDepositTermTypeId"; + public static final String IN_MULTIPLES_OF_DEPOSIT_TERM = "inMultiplesOfDepositTerm"; + public static final String IN_MULTIPLES_OF_DEPOSIT_TERM_TYPE_ID = "inMultiplesOfDepositTermTypeId"; + public static final String IS_MANDATORY_DEPOSIT = "isMandatoryDeposit"; + public static final String ALLOW_WITHDRAWAL = "allowWithdrawal"; + public static final String ADJUST_ADVANCE_TOWARDS_FUTURE_PAYMENTS = "adjustAdvanceTowardsFuturePayments"; private final String schemaSql; RecurringDepositAccountTemplateMapper(final ClientData client, final GroupGeneralData group) { @@ -1320,27 +1517,27 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead final DepositAccountData depositAccountData = super.mapRow(rs); - final boolean preClosurePenalApplicable = rs.getBoolean("preClosurePenalApplicable"); - final BigDecimal preClosurePenalInterest = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "preClosurePenalInterest"); - final Integer preClosurePenalInterestOnTypeId = JdbcSupport.getInteger(rs, "preClosurePenalInterestOnId"); + final boolean preClosurePenalApplicable = rs.getBoolean(PRE_CLOSURE_PENAL_APPLICABLE); + final BigDecimal preClosurePenalInterest = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, PRE_CLOSURE_PENAL_INTEREST); + final Integer preClosurePenalInterestOnTypeId = JdbcSupport.getInteger(rs, PRE_CLOSURE_PENAL_INTEREST_ON_ID); final EnumOptionData preClosurePenalInterestOnType = (preClosurePenalInterestOnTypeId == null) ? null : SavingsEnumerations.preClosurePenaltyInterestOnType(preClosurePenalInterestOnTypeId); - final Integer minDepositTerm = JdbcSupport.getInteger(rs, "minDepositTerm"); - final Integer maxDepositTerm = JdbcSupport.getInteger(rs, "maxDepositTerm"); - final Integer minDepositTermTypeId = JdbcSupport.getInteger(rs, "minDepositTermTypeId"); + final Integer minDepositTerm = JdbcSupport.getInteger(rs, MIN_DEPOSIT_TERM); + final Integer maxDepositTerm = JdbcSupport.getInteger(rs, MAX_DEPOSIT_TERM); + final Integer minDepositTermTypeId = JdbcSupport.getInteger(rs, MIN_DEPOSIT_TERM_TYPE_ID); final EnumOptionData minDepositTermType = (minDepositTermTypeId == null) ? null : SavingsEnumerations.depositTermFrequencyType(minDepositTermTypeId); - final Integer maxDepositTermTypeId = JdbcSupport.getInteger(rs, "maxDepositTermTypeId"); + final Integer maxDepositTermTypeId = JdbcSupport.getInteger(rs, MAX_DEPOSIT_TERM_TYPE_ID); final EnumOptionData maxDepositTermType = (maxDepositTermTypeId == null) ? null : SavingsEnumerations.depositTermFrequencyType(maxDepositTermTypeId); - final Integer inMultiplesOfDepositTerm = JdbcSupport.getInteger(rs, "inMultiplesOfDepositTerm"); - final Integer inMultiplesOfDepositTermTypeId = JdbcSupport.getInteger(rs, "inMultiplesOfDepositTermTypeId"); + final Integer inMultiplesOfDepositTerm = JdbcSupport.getInteger(rs, IN_MULTIPLES_OF_DEPOSIT_TERM); + final Integer inMultiplesOfDepositTermTypeId = JdbcSupport.getInteger(rs, IN_MULTIPLES_OF_DEPOSIT_TERM_TYPE_ID); final EnumOptionData inMultiplesOfDepositTermType = (inMultiplesOfDepositTermTypeId == null) ? null : SavingsEnumerations.depositTermFrequencyType(inMultiplesOfDepositTermTypeId); - final boolean isMandatoryDeposit = rs.getBoolean("isMandatoryDeposit"); - final boolean allowWithdrawal = rs.getBoolean("allowWithdrawal"); - final boolean adjustAdvanceTowardsFuturePayments = rs.getBoolean("adjustAdvanceTowardsFuturePayments"); + final boolean isMandatoryDeposit = rs.getBoolean(IS_MANDATORY_DEPOSIT); + final boolean allowWithdrawal = rs.getBoolean(ALLOW_WITHDRAWAL); + final boolean adjustAdvanceTowardsFuturePayments = rs.getBoolean(ADJUST_ADVANCE_TOWARDS_FUTURE_PAYMENTS); final boolean isCalendarInherited = false; final BigDecimal depositAmount = null; @@ -1363,32 +1560,15 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead } } - private DepositAccountTemplateMapper getDepositAccountTemplaMapper(final DepositAccountType depositAccountType, ClientData client, - GroupGeneralData group) { - if (depositAccountType.isFixedDeposit()) { - return new FixedDepositAccountTemplateMapper(client, group); - } else if (depositAccountType.isRecurringDeposit()) { - return new RecurringDepositAccountTemplateMapper(client, group); - } - return null; - } - - private Collection fromChargesToSavingsCharges(final Collection productCharges) { - final Collection savingsCharges = new ArrayList<>(); - for (final ChargeData chargeData : productCharges) { - final SavingsAccountChargeData savingsCharge = chargeData.toSavingsAccountChargeData(); - savingsCharges.add(savingsCharge); - } - return savingsCharges; - } - private static final class DepositAccountForMaturityMapper implements RowMapper { - private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + public static final String ID = "id"; + public static final String ACCOUNT_NUMBER = "accountNumber"; + public static final String DEPOSIT_TYPE_ID = "depositTypeId"; public String schema() { LocalDate today = DateUtils.getBusinessLocalDate(); - String formattedToday = formatter.format(today); + String formattedToday = DATE_TIME_FORMATTER.format(today); final StringBuilder sqlBuilder = new StringBuilder(200); sqlBuilder.append("da.id as id, "); sqlBuilder.append("da.account_no as accountNumber, "); @@ -1403,9 +1583,9 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead @Override public DepositAccountData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException { - final Long id = rs.getLong("id"); - final String name = rs.getString("accountNumber"); - final Integer depositTypeId = JdbcSupport.getInteger(rs, "depositTypeId"); + final Long id = rs.getLong(ID); + final String name = rs.getString(ACCOUNT_NUMBER); + final Integer depositTypeId = JdbcSupport.getInteger(rs, DEPOSIT_TYPE_ID); final EnumOptionData depositType = (depositTypeId == null) ? null : SavingsEnumerations.depositType(depositTypeId); return DepositAccountData.lookup(id, name, depositType); @@ -1414,6 +1594,18 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead private static final class RecurringAccountDepositTransactionTemplateMapper implements RowMapper { + public static final String ID = "id"; + public static final String ACCOUNT_NO = "accountNo"; + public static final String DUEAMOUNT = "dueamount"; + public static final String OUTSTANDING_CHARGE_AMOUNT = "outstandingChargeAmount"; + public static final String DUEDATE = "duedate"; + public static final String CURRENCY_CODE = "currencyCode"; + public static final String CURRENCY_NAME = "currencyName"; + public static final String CURRENCY_NAME_CODE = "currencyNameCode"; + public static final String CURRENCY_DISPLAY_SYMBOL = "currencyDisplaySymbol"; + public static final String CURRENCY_DIGITS = "currencyDigits"; + public static final String IN_MULTIPLES_OF = "inMultiplesOf"; + public static final String RUNNING_BALANCE = "runningBalance"; private final String schemaSql; RecurringAccountDepositTransactionTemplateMapper() { @@ -1447,24 +1639,24 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead @Override public SavingsAccountTransactionData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException { - final Long savingsId = rs.getLong("id"); - final String accountNo = rs.getString("accountNo"); - final BigDecimal dueamount = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "dueamount"); - final BigDecimal outstandingChargeAmount = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "outstandingChargeAmount"); - final LocalDate duedate = JdbcSupport.getLocalDate(rs, "duedate"); - final String currencyCode = rs.getString("currencyCode"); - final String currencyName = rs.getString("currencyName"); - final String currencyNameCode = rs.getString("currencyNameCode"); - final String currencyDisplaySymbol = rs.getString("currencyDisplaySymbol"); - final Integer currencyDigits = JdbcSupport.getInteger(rs, "currencyDigits"); - final Integer inMultiplesOf = JdbcSupport.getInteger(rs, "inMultiplesOf"); + final Long savingsId = rs.getLong(ID); + final String accountNo = rs.getString(ACCOUNT_NO); + final BigDecimal dueamount = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, DUEAMOUNT); + final BigDecimal outstandingChargeAmount = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, OUTSTANDING_CHARGE_AMOUNT); + final LocalDate duedate = JdbcSupport.getLocalDate(rs, DUEDATE); + final String currencyCode = rs.getString(CURRENCY_CODE); + final String currencyName = rs.getString(CURRENCY_NAME); + final String currencyNameCode = rs.getString(CURRENCY_NAME_CODE); + final String currencyDisplaySymbol = rs.getString(CURRENCY_DISPLAY_SYMBOL); + final Integer currencyDigits = JdbcSupport.getInteger(rs, CURRENCY_DIGITS); + final Integer inMultiplesOf = JdbcSupport.getInteger(rs, IN_MULTIPLES_OF); final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDigits, inMultiplesOf, currencyDisplaySymbol, currencyNameCode); final SavingsAccountTransactionEnumData transactionType = SavingsEnumerations .transactionType(SavingsAccountTransactionType.DEPOSIT.getValue()); final PaymentDetailData paymentDetailData = null; final AccountTransferData transfer = null; - final BigDecimal runningBalance = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "runningBalance"); + final BigDecimal runningBalance = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, RUNNING_BALANCE); final boolean postInterestAsOn = false; final String submittedByUsername = null; final String note = null; @@ -1476,6 +1668,11 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead private static class AccountTransferMapper implements RowMapper { + public static final String FROM_ACC = "fromAcc"; + public static final String TO_ACC = "toAcc"; + public static final String AMOUNT = "amount"; + public static final String TRANSACTION_DATE = "transactionDate"; + public static final String TRANSFER_INTEREST_TO_SAVINGS = "transfer interest to savings"; private final String schemaSql; AccountTransferMapper() { @@ -1495,14 +1692,14 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead @Override public AccountTransferDTO mapRow(ResultSet rs, @SuppressWarnings("unused") int rowNum) throws SQLException { - final Long fromAccountId = rs.getLong("fromAcc"); - final Long toAccountId = rs.getLong("toAcc"); - final BigDecimal transactionAmount = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "amount"); + final Long fromAccountId = rs.getLong(FROM_ACC); + final Long toAccountId = rs.getLong(TO_ACC); + final BigDecimal transactionAmount = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, AMOUNT); final boolean isRegularTransaction = false; final boolean isExceptionForBalanceCheck = false; - final LocalDate transactionDate = JdbcSupport.getLocalDate(rs, "transactionDate"); + final LocalDate transactionDate = JdbcSupport.getLocalDate(rs, TRANSACTION_DATE); return new AccountTransferDTO(transactionDate, transactionAmount, PortfolioAccountType.SAVINGS, PortfolioAccountType.SAVINGS, - fromAccountId, toAccountId, "trasfer interest to savings", null, null, null, null, null, null, null, + fromAccountId, toAccountId, TRANSFER_INTEREST_TO_SAVINGS, null, null, null, null, null, null, null, AccountTransferType.INTEREST_TRANSFER.getValue(), null, null, null, null, null, null, isRegularTransaction, isExceptionForBalanceCheck); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositProductReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositProductReadPlatformServiceImpl.java index 8dfc3db83..efb75399f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositProductReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositProductReadPlatformServiceImpl.java @@ -44,12 +44,12 @@ import org.springframework.stereotype.Service; @Service public class DepositProductReadPlatformServiceImpl implements DepositProductReadPlatformService { + private static final FixedDepositProductMapper FIXED_DEPOSIT_PRODUCT_MAPPER = new FixedDepositProductMapper(); + private static final RecurringDepositProductMapper RECURRING_DEPOSIT_PRODUCT_MAPPER = new RecurringDepositProductMapper(); + private static final DepositProductLookupMapper DEPOSIT_PRODUCT_LOOKUP_MAPPER = new DepositProductLookupMapper(); private final PlatformSecurityContext context; private final JdbcTemplate jdbcTemplate; private final InterestRateChartReadPlatformService chartReadPlatformService; - private final FixedDepositProductMapper fixedDepositProductRowMapper = new FixedDepositProductMapper(); - private final RecurringDepositProductMapper recurringDepositProductRowMapper = new RecurringDepositProductMapper(); - private final DepositProductLookupMapper depositProductLookupsRowMapper = new DepositProductLookupMapper(); @Autowired public DepositProductReadPlatformServiceImpl(final PlatformSecurityContext context, final JdbcTemplate jdbcTemplate, @@ -73,7 +73,7 @@ public class DepositProductReadPlatformServiceImpl implements DepositProductRead sqlBuilder.append(depositProductMapper.schema()); sqlBuilder.append(" where sp.deposit_type_enum = ? "); - return this.jdbcTemplate.query(sqlBuilder.toString(), depositProductMapper, new Object[] { depositAccountType.getValue() }); + return this.jdbcTemplate.query(sqlBuilder.toString(), depositProductMapper, depositAccountType.getValue()); } @Override @@ -81,11 +81,10 @@ public class DepositProductReadPlatformServiceImpl implements DepositProductRead final StringBuilder sqlBuilder = new StringBuilder(400); sqlBuilder.append("select "); - sqlBuilder.append(this.depositProductLookupsRowMapper.schema()); + sqlBuilder.append(DEPOSIT_PRODUCT_LOOKUP_MAPPER.schema()); sqlBuilder.append(" where sp.deposit_type_enum = ? "); - return this.jdbcTemplate.query(sqlBuilder.toString(), this.depositProductLookupsRowMapper, - new Object[] { depositAccountType.getValue() }); + return this.jdbcTemplate.query(sqlBuilder.toString(), DEPOSIT_PRODUCT_LOOKUP_MAPPER, depositAccountType.getValue()); } @Override @@ -103,8 +102,8 @@ public class DepositProductReadPlatformServiceImpl implements DepositProductRead sqlBuilder.append(depositProductMapper.schema()); sqlBuilder.append(" where sp.id = ? and sp.deposit_type_enum = ? "); - return this.jdbcTemplate.queryForObject(sqlBuilder.toString(), depositProductMapper, - new Object[] { fixedDepositProductId, depositAccountType.getValue() }); + return this.jdbcTemplate.queryForObject(sqlBuilder.toString(), depositProductMapper, fixedDepositProductId, + depositAccountType.getValue()); } catch (final EmptyResultDataAccessException e) { throw new FixedDepositProductNotFoundException(fixedDepositProductId, e); @@ -125,13 +124,19 @@ public class DepositProductReadPlatformServiceImpl implements DepositProductRead return depositProduct; } + private DepositProductMapper getDepositProductMapper(final DepositAccountType depositAccountType) { + if (depositAccountType.isFixedDeposit()) { + return FIXED_DEPOSIT_PRODUCT_MAPPER; + } else if (depositAccountType.isRecurringDeposit()) { + return RECURRING_DEPOSIT_PRODUCT_MAPPER; + } + return null; + } + private abstract static class DepositProductMapper implements RowMapper { private final String schemaSql; - @Override - public abstract DepositProductData mapRow(ResultSet rs, int rowNum) throws SQLException; - protected DepositProductMapper() { final StringBuilder sqlBuilder = new StringBuilder(400); sqlBuilder.append("sp.id as id, sp.name as name, sp.short_name as shortName, sp.description as description, "); @@ -368,13 +373,4 @@ public class DepositProductReadPlatformServiceImpl implements DepositProductRead return DepositProductData.lookup(id, name); } } - - private DepositProductMapper getDepositProductMapper(final DepositAccountType depositAccountType) { - if (depositAccountType.isFixedDeposit()) { - return this.fixedDepositProductRowMapper; - } else if (depositAccountType.isRecurringDeposit()) { - return this.recurringDepositProductRowMapper; - } - return null; - } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/search/api/SearchApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/search/api/SearchApiResource.java index f57d2de82..0c95fc9c7 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/search/api/SearchApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/search/api/SearchApiResource.java @@ -59,7 +59,7 @@ import org.springframework.stereotype.Component; @Tag(name = "Search API", description = "Search API allows to search scoped resources clients, loans and groups on specified fields.") public class SearchApiResource { - private final Set searchResponseParameters = SearchResponseParameters.getAllValues(); + private static final Set SEARCH_RESPONSE_PARAMETERS = SearchResponseParameters.getAllValues(); private final SearchReadPlatformService searchReadPlatformService; private final ToApiJsonSerializer toApiJsonSerializer; @@ -109,7 +109,7 @@ public class SearchApiResource { final Collection searchResults = this.searchReadPlatformService.retriveMatchingData(searchConditions); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, searchResults, this.searchResponseParameters); + return this.toApiJsonSerializer.serialize(settings, searchResults, SEARCH_RESPONSE_PARAMETERS); } @POST diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/pockets/data/PocketDataValidator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/pockets/data/PocketDataValidator.java index df4975508..d13403bf8 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/pockets/data/PocketDataValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/pockets/data/PocketDataValidator.java @@ -43,11 +43,11 @@ import org.springframework.stereotype.Service; @Service public class PocketDataValidator { - private final Set linkingAccountsSupportedParameters = new HashSet<>(Arrays.asList(PocketApiConstants.accountIdParamName, - PocketApiConstants.accountTypeParamName, PocketApiConstants.accountsDetail)); + private static final Set LINKING_ACCOUNTS_SUPPORTED_PARAMETERS = new HashSet<>(Arrays + .asList(PocketApiConstants.accountIdParamName, PocketApiConstants.accountTypeParamName, PocketApiConstants.accountsDetail)); - private final Set delinkingAccountsSupportedParameters = new HashSet<>( - Arrays.asList(PocketApiConstants.pocketAccountMappingList)); + private static final Set DELINKING_ACCOUNTS_SUPPORTED_PARAMETERS = new HashSet<>( + List.of(PocketApiConstants.pocketAccountMappingList)); private final FromJsonHelper fromApiJsonHelper; @@ -62,7 +62,7 @@ public class PocketDataValidator { } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.linkingAccountsSupportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, LINKING_ACCOUNTS_SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors) @@ -97,7 +97,7 @@ public class PocketDataValidator { } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.delinkingAccountsSupportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, DELINKING_ACCOUNTS_SUPPORTED_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors) diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/pockets/service/AccountEntityServiceForLoanImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/pockets/service/AccountEntityServiceForLoanImpl.java index 6b5f8015b..120b83013 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/pockets/service/AccountEntityServiceForLoanImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/pockets/service/AccountEntityServiceForLoanImpl.java @@ -30,7 +30,7 @@ import org.springframework.stereotype.Service; @Service public class AccountEntityServiceForLoanImpl implements AccountEntityService { - private final String key = EntityAccountType.LOAN.name(); + private static final String KEY = EntityAccountType.LOAN.name(); private final PlatformSecurityContext context; private final AppuserLoansMapperReadService appuserLoansMapperReadService; @@ -48,7 +48,7 @@ public class AccountEntityServiceForLoanImpl implements AccountEntityService { @Override public String getKey() { - return key; + return KEY; } @Override diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/pockets/service/AccountEntityServiceForSavingsImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/pockets/service/AccountEntityServiceForSavingsImpl.java index f584b48a3..c0089b1e8 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/pockets/service/AccountEntityServiceForSavingsImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/pockets/service/AccountEntityServiceForSavingsImpl.java @@ -30,7 +30,7 @@ import org.springframework.stereotype.Service; @Service public class AccountEntityServiceForSavingsImpl implements AccountEntityService { - private final String key = EntityAccountType.SAVINGS.name(); + private static final String KEY = EntityAccountType.SAVINGS.name(); private final PlatformSecurityContext context; private final AppuserSavingsMapperReadService appuserSavingsMapperReadService; @@ -49,7 +49,7 @@ public class AccountEntityServiceForSavingsImpl implements AccountEntityService @Override public String getKey() { - return key; + return KEY; } @Override diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/pockets/service/AccountEntityServiceForShareAccountsImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/pockets/service/AccountEntityServiceForShareAccountsImpl.java index 952bf5c6c..a1c8ea814 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/pockets/service/AccountEntityServiceForShareAccountsImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/pockets/service/AccountEntityServiceForShareAccountsImpl.java @@ -30,7 +30,7 @@ import org.springframework.stereotype.Service; @Service public class AccountEntityServiceForShareAccountsImpl implements AccountEntityService { - private final String key = EntityAccountType.SHARES.name(); + private static final String KEY = EntityAccountType.SHARES.name(); private final PlatformSecurityContext context; private final AppUserShareAccountsMapperReadPlatformService appUserShareAccountsMapperReadPlatformService; @@ -47,7 +47,7 @@ public class AccountEntityServiceForShareAccountsImpl implements AccountEntitySe @Override public String getKey() { - return key; + return KEY; } @Override diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/security/api/SelfUserApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/security/api/SelfUserApiResource.java index ed7e6dad7..76fff75be 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/security/api/SelfUserApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/security/api/SelfUserApiResource.java @@ -53,7 +53,7 @@ public class SelfUserApiResource { private final UsersApiResource usersApiResource; private final PlatformSecurityContext context; private final FromJsonHelper fromApiJsonHelper; - private final Set supportedParameters = new HashSet<>(Arrays.asList("password", "repeatPassword")); + private static final Set SUPPORTED_PARAMETERS = new HashSet<>(Arrays.asList("password", "repeatPassword")); @Autowired public SelfUserApiResource(final UsersApiResource usersApiResource, final PlatformSecurityContext context, @@ -75,7 +75,7 @@ public class SelfUserApiResource { } final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, apiRequestBodyAsJson, this.supportedParameters); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, apiRequestBodyAsJson, SUPPORTED_PARAMETERS); final AppUser appUser = this.context.authenticatedUser(); return this.usersApiResource.update(appUser.getId(), apiRequestBodyAsJson); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountReadPlatformServiceImpl.java index 085b2b50d..e4faf2849 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountReadPlatformServiceImpl.java @@ -79,7 +79,7 @@ public class ShareAccountReadPlatformServiceImpl implements ShareAccountReadPlat private final ShareAccountChargeReadPlatformService shareAccountChargeReadPlatformService; private final PurchasedSharesReadPlatformService purchasedSharesReadPlatformService; private final JdbcTemplate jdbcTemplate; - private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); private final PaginationHelper shareAccountDataPaginationHelper; private final DatabaseSpecificSQLGenerator sqlGenerator; @@ -155,7 +155,7 @@ public class ShareAccountReadPlatformServiceImpl implements ShareAccountReadPlat ShareAccountMapper mapper = new ShareAccountMapper(charges, purchasedShares); String query = "select " + mapper.schema() + "where sa.id=?"; - ShareAccountData data = (ShareAccountData) this.jdbcTemplate.queryForObject(query, mapper, new Object[] { id }); // NOSONAR + ShareAccountData data = (ShareAccountData) this.jdbcTemplate.queryForObject(query, mapper, id); // NOSONAR String serviceName = "share" + ProductsApiConstants.READPLATFORM_NAME; ShareProductReadPlatformService service = (ShareProductReadPlatformService) this.applicationContext.getBean(serviceName); final ShareProductData productData = (ShareProductData) service.retrieveOne(data.getProductId(), false); @@ -182,7 +182,7 @@ public class ShareAccountReadPlatformServiceImpl implements ShareAccountReadPlat private Collection retrieveAssociatedDividends(final Long shareAccountId) { ShareAccountDividendRowMapper mapper = new ShareAccountDividendRowMapper(); String query = "select " + mapper.schema() + "where sadd.account_id=?"; - return this.jdbcTemplate.query(query, mapper, new Object[] { shareAccountId }); // NOSONAR + return this.jdbcTemplate.query(query, mapper, shareAccountId); // NOSONAR } @Override @@ -222,7 +222,7 @@ public class ShareAccountReadPlatformServiceImpl implements ShareAccountReadPlat params.add(id); params.add(ShareAccountStatusType.ACTIVE.getValue()); if (fetchInActiveAccounts) { - String formattedStartDate = formatter.format(startDate); + String formattedStartDate = DATE_TIME_FORMATTER.format(startDate); sb.append(" and (sa.status_enum = ? or (sa.status_enum = ? "); sb.append(" and sa.closed_date > '" + formattedStartDate + "')) "); params.add(ShareAccountStatusType.CLOSED.getValue()); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/api/ShareDividendApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/api/ShareDividendApiResource.java index b7abf0ca7..9b53495a7 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/api/ShareDividendApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/api/ShareDividendApiResource.java @@ -54,13 +54,14 @@ import org.springframework.stereotype.Component; @Tag(name = "Self Dividend", description = "") public class ShareDividendApiResource { + public static final String APPROVE = "approve"; + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "DIVIDEND_SHAREPRODUCT"; private final DefaultToApiJsonSerializer toApiJsonSerializer; private final DefaultToApiJsonSerializer toApiAccountDetailJsonSerializer; private final PlatformSecurityContext platformSecurityContext; private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; private final ShareAccountDividendReadPlatformService shareAccountDividendReadPlatformService; private final ShareProductDividendReadPlatformService shareProductDividendReadPlatformService; - private final String resourceNameForPermissions = "DIVIDEND_SHAREPRODUCT"; @Autowired public ShareDividendApiResource(final DefaultToApiJsonSerializer toApiJsonSerializer, @@ -84,7 +85,7 @@ public class ShareDividendApiResource { @QueryParam("limit") final Integer limit, @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder, @QueryParam("status") final Integer status) { - this.platformSecurityContext.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.platformSecurityContext.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final SearchParameters searchParameters = SearchParameters.forPagination(offset, limit, orderBy, sortOrder); Page dividendPayoutDetails = this.shareProductDividendReadPlatformService.retriveAll(productId, status, searchParameters); @@ -100,7 +101,7 @@ public class ShareDividendApiResource { @QueryParam("sortOrder") final String sortOrder, @QueryParam("accountNo") final String accountNo, @PathParam("productId") final Long productId) { - this.platformSecurityContext.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.platformSecurityContext.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final SearchParameters searchParameters = SearchParameters.forPaginationAndAccountNumberSearch(offset, limit, orderBy, sortOrder, accountNo); Page dividendDetails = this.shareAccountDividendReadPlatformService.retriveAll(dividendId, @@ -125,9 +126,9 @@ public class ShareDividendApiResource { @Produces({ MediaType.APPLICATION_JSON }) public String updateDividendDetail(@PathParam("productId") final Long productId, @PathParam("dividendId") final Long dividendId, @QueryParam("command") final String commandParam, final String apiRequestBodyAsJson) { - CommandWrapper commandWrapper = null; + CommandWrapper commandWrapper; this.platformSecurityContext.authenticatedUser(); - if (is(commandParam, "approve")) { + if (is(commandParam, APPROVE)) { commandWrapper = new CommandWrapperBuilder().approveShareProductDividendPayoutCommand(productId, dividendId) .withJson(apiRequestBodyAsJson).build(); } else { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/api/TaxComponentApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/api/TaxComponentApiResource.java index 47df4d8cb..9ab0ac54a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/api/TaxComponentApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/api/TaxComponentApiResource.java @@ -59,7 +59,7 @@ import org.springframework.stereotype.Component; @Tag(name = "Tax Components", description = "This defines the Tax Components") public class TaxComponentApiResource { - private final String resourceNameForPermissions = "TAXCOMPONENT"; + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "TAXCOMPONENT"; private final PlatformSecurityContext context; private final TaxReadPlatformService readPlatformService; @@ -87,12 +87,12 @@ public class TaxComponentApiResource { @ApiResponse(responseCode = "200", description = "OK", content = @Content(array = @ArraySchema(schema = @Schema(implementation = TaxComponentApiResourceSwagger.GetTaxesComponentsResponse.class)))) }) public String retrieveAllTaxComponents(@Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); - final Collection TaxComponents = this.readPlatformService.retrieveAllTaxComponents(); + final Collection taxComponents = this.readPlatformService.retrieveAllTaxComponents(); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, TaxComponents); + return this.toApiJsonSerializer.serialize(settings, taxComponents); } @GET @@ -105,7 +105,7 @@ public class TaxComponentApiResource { public String retrieveTaxComponent(@PathParam("taxComponentId") @Parameter(description = "taxComponentId") final Long taxComponentId, @Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); @@ -119,7 +119,7 @@ public class TaxComponentApiResource { @Produces({ MediaType.APPLICATION_JSON }) public String retrieveTemplate(@Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final TaxComponentData taxComponentData = this.readPlatformService.retrieveTaxComponentTemplate(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/api/TaxGroupApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/api/TaxGroupApiResource.java index 5fce11847..d16417800 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/api/TaxGroupApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/api/TaxGroupApiResource.java @@ -59,7 +59,7 @@ import org.springframework.stereotype.Component; @Tag(name = "Tax Group", description = "This defines the Tax Group") public class TaxGroupApiResource { - private final String resourceNameForPermissions = "TAXGROUP"; + private static final String RESOURCE_NAME_FOR_PERMISSIONS = "TAXGROUP"; private final PlatformSecurityContext context; private final TaxReadPlatformService readPlatformService; @@ -86,7 +86,7 @@ public class TaxGroupApiResource { @ApiResponse(responseCode = "200", description = "OK", content = @Content(array = @ArraySchema(schema = @Schema(implementation = TaxGroupApiResourceSwagger.GetTaxesGroupResponse.class)))) }) public String retrieveAllTaxGroups(@Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final Collection taxGroupDatas = this.readPlatformService.retrieveAllTaxGroups(); @@ -104,7 +104,7 @@ public class TaxGroupApiResource { public String retrieveTaxGroup(@PathParam("taxGroupId") @Parameter(description = "taxGroupId") final Long taxGroupId, @Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); TaxGroupData taxGroupData = null; @@ -122,7 +122,7 @@ public class TaxGroupApiResource { @Produces({ MediaType.APPLICATION_JSON }) public String retrieveTemplate(@Context final UriInfo uriInfo) { - this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); final TaxGroupData taxGroupData = this.readPlatformService.retrieveTaxGroupTemplate(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/serialization/TaxValidator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/serialization/TaxValidator.java index 6fc9a7750..0613a8629 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/serialization/TaxValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/serialization/TaxValidator.java @@ -52,23 +52,30 @@ import org.springframework.stereotype.Component; @Component public class TaxValidator { - final Set supportedTaxComponentCreateParameters = new HashSet<>( - Arrays.asList("dateFormat", "locale", TaxApiConstants.nameParamName, TaxApiConstants.percentageParamName, + public static final String DATE_FORMAT = "dateFormat"; + public static final String LOCALE = "locale"; + public static final String TAX_COMPONENT = "tax.component"; + public static final String TAX_GROUP = "tax.group"; + public static final String TOTAL_PERCENTAGE = "total.percentage"; + public static final String GROUP_TOTAL = "group.total."; + public static final String COMPONENT = "component"; + public static final String DATES_ARE_OVERLAPPING = "dates.are.overlapping"; + public static final String COMPONENT_START_DATE = "component.start.date"; + private static final Set SUPPORTED_TAX_COMPONENT_CREATE_PARAMETERS = new HashSet<>( + Arrays.asList(DATE_FORMAT, LOCALE, TaxApiConstants.nameParamName, TaxApiConstants.percentageParamName, TaxApiConstants.startDateParamName, TaxApiConstants.debitAccountTypeParamName, TaxApiConstants.debitAcountIdParamName, TaxApiConstants.creditAccountTypeParamName, TaxApiConstants.creditAcountIdParamName)); - - final Set supportedTaxComponentUpdateParameters = new HashSet<>(Arrays.asList("dateFormat", "locale", + private static final Set SUPPORTED_TAX_COMPONENT_UPDATE_PARAMETERS = new HashSet<>(Arrays.asList(DATE_FORMAT, LOCALE, TaxApiConstants.nameParamName, TaxApiConstants.percentageParamName, TaxApiConstants.startDateParamName)); - - final Set supportedTaxGroupParameters = new HashSet<>( - Arrays.asList("dateFormat", "locale", TaxApiConstants.nameParamName, TaxApiConstants.taxComponentsParamName)); - - final Set supportedTaxGroupTaxComponentsCreateParameters = new HashSet<>( + private static final Set SUPPORTED_TAX_GROUP_PARAMETERS = new HashSet<>( + Arrays.asList(DATE_FORMAT, LOCALE, TaxApiConstants.nameParamName, TaxApiConstants.taxComponentsParamName)); + private static final Set SUPPORTED_TAX_GROUP_TAX_COMPONENTS_CREATE_PARAMETERS = new HashSet<>( Arrays.asList(TaxApiConstants.taxComponentIdParamName, TaxApiConstants.startDateParamName)); - - final Set supportedTaxGroupTaxComponentsUpdateParameters = new HashSet<>(Arrays.asList(TaxApiConstants.idParamName, - TaxApiConstants.taxComponentIdParamName, TaxApiConstants.startDateParamName, TaxApiConstants.endDateParamName)); - + private static final Set SUPPORTED_TAX_GROUP_TAX_COMPONENTS_UPDATE_PARAMETERS = new HashSet<>( + Arrays.asList(TaxApiConstants.idParamName, TaxApiConstants.taxComponentIdParamName, TaxApiConstants.startDateParamName, + TaxApiConstants.endDateParamName)); + public static final String DOT = "."; + public static final String AT_INDEX = ".at.index."; private final FromJsonHelper fromApiJsonHelper; @Autowired @@ -81,11 +88,13 @@ public class TaxValidator { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedTaxComponentCreateParameters); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_TAX_COMPONENT_CREATE_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("tax.component"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(TAX_COMPONENT); final JsonElement element = this.fromApiJsonHelper.parse(json); @@ -129,11 +138,13 @@ public class TaxValidator { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedTaxComponentUpdateParameters); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_TAX_COMPONENT_UPDATE_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("tax.component"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(TAX_COMPONENT); final JsonElement element = this.fromApiJsonHelper.parse(json); @@ -162,11 +173,13 @@ public class TaxValidator { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedTaxGroupParameters); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_TAX_GROUP_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("tax.group"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(TAX_GROUP); final JsonElement element = this.fromApiJsonHelper.parse(json); @@ -184,7 +197,7 @@ public class TaxValidator { final JsonObject taxComponent = array.get(i - 1).getAsJsonObject(); final String arrayObjectJson = this.fromApiJsonHelper.toJson(taxComponent); this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, arrayObjectJson, - supportedTaxGroupTaxComponentsCreateParameters); + SUPPORTED_TAX_GROUP_TAX_COMPONENTS_CREATE_PARAMETERS); final Long taxComponentId = this.fromApiJsonHelper.extractLongNamed(TaxApiConstants.taxComponentIdParamName, taxComponent); baseDataValidator.reset().parameter(TaxApiConstants.taxComponentsParamName) .parameterAtIndexArray(TaxApiConstants.taxComponentIdParamName, i).value(taxComponentId).notNull() @@ -200,11 +213,13 @@ public class TaxValidator { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); - this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, this.supportedTaxGroupParameters); + final Type typeOfMap = new TypeToken>() { + + }.getType(); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, SUPPORTED_TAX_GROUP_PARAMETERS); final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("tax.group"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(TAX_GROUP); final JsonElement element = this.fromApiJsonHelper.parse(json); @@ -225,33 +240,33 @@ public class TaxValidator { final JsonObject taxComponent = array.get(i - 1).getAsJsonObject(); final String arrayObjectJson = this.fromApiJsonHelper.toJson(taxComponent); this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, arrayObjectJson, - supportedTaxGroupTaxComponentsUpdateParameters); + SUPPORTED_TAX_GROUP_TAX_COMPONENTS_UPDATE_PARAMETERS); final Long taxComponentId = this.fromApiJsonHelper.extractLongNamed(TaxApiConstants.taxComponentIdParamName, taxComponent); final Long taxMappingId = this.fromApiJsonHelper.extractLongNamed(TaxApiConstants.taxComponentIdParamName, taxComponent); if (taxMappingId == null) { baseDataValidator.reset().parameter( - TaxApiConstants.taxComponentsParamName + "." + TaxApiConstants.taxComponentIdParamName + ".at.index." + i) + TaxApiConstants.taxComponentsParamName + DOT + TaxApiConstants.taxComponentIdParamName + AT_INDEX + i) .value(taxComponentId).notNull().longGreaterThanZero(); } else { baseDataValidator.reset().parameter( - TaxApiConstants.taxComponentsParamName + "." + TaxApiConstants.taxComponentIdParamName + ".at.index." + i) + TaxApiConstants.taxComponentsParamName + DOT + TaxApiConstants.taxComponentIdParamName + AT_INDEX + i) .value(taxComponentId).longGreaterThanZero(); baseDataValidator.reset() - .parameter(TaxApiConstants.taxComponentsParamName + "." + TaxApiConstants.idParamName + ".at.index." + i) + .parameter(TaxApiConstants.taxComponentsParamName + DOT + TaxApiConstants.idParamName + AT_INDEX + i) .value(taxMappingId).longGreaterThanZero(); } final LocalDate endDate = this.fromApiJsonHelper.extractLocalDateNamed(TaxApiConstants.endDateParamName, taxComponent, dateFormat, locale); baseDataValidator.reset() - .parameter(TaxApiConstants.taxComponentsParamName + "." + TaxApiConstants.endDateParamName + ".at.index." + i) + .parameter(TaxApiConstants.taxComponentsParamName + DOT + TaxApiConstants.endDateParamName + AT_INDEX + i) .value(endDate).ignoreIfNull().validateDateAfter(DateUtils.getBusinessLocalDate()); final LocalDate startDate = this.fromApiJsonHelper.extractLocalDateNamed(TaxApiConstants.startDateParamName, taxComponent, dateFormat, locale); if (endDate != null && startDate != null) { - baseDataValidator.reset().parameter(TaxApiConstants.taxComponentsParamName + ".at.index." + i) + baseDataValidator.reset().parameter(TaxApiConstants.taxComponentsParamName + AT_INDEX + i) .failWithCode("start.date.end.date.both.should.not.be.present", startDate, endDate); } } @@ -262,7 +277,7 @@ public class TaxValidator { public void validateTaxGroupEndDateAndTaxComponent(final TaxGroup taxGroup, final Set groupMappings) { final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("tax.group"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(TAX_GROUP); for (TaxGroupMappings mapping : groupMappings) { if (mapping.getId() != null) { @@ -286,23 +301,23 @@ public class TaxValidator { public void validateTaxGroup(final TaxGroup taxGroup) { final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("tax.group"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(TAX_GROUP); Set groupMappings = taxGroup.getTaxGroupMappings(); - validateGroupTotal(groupMappings, baseDataValidator, "total.percentage"); + validateGroupTotal(groupMappings, baseDataValidator, TOTAL_PERCENTAGE); validateOverlappingComponents(groupMappings, baseDataValidator); throwExceptionIfValidationWarningsExist(dataValidationErrors); } public void validateTaxComponentForUpdate(final TaxComponent taxComponent) { final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("tax.component"); - validateGroupTotal(taxComponent.getTaxGroupMappings(), baseDataValidator, "group.total." + TaxApiConstants.percentageParamName); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(TAX_COMPONENT); + validateGroupTotal(taxComponent.getTaxGroupMappings(), baseDataValidator, GROUP_TOTAL + TaxApiConstants.percentageParamName); throwExceptionIfValidationWarningsExist(dataValidationErrors); } public void validateStartDate(final LocalDate existingStartDate, final JsonCommand command) { final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("tax.component"); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource(TAX_COMPONENT); validateStartDate(existingStartDate, command.localDateValueOfParameterNamed(TaxApiConstants.startDateParamName), baseDataValidator); throwExceptionIfValidationWarningsExist(dataValidationErrors); } @@ -319,12 +334,12 @@ public class TaxValidator { for (TaxGroupMappings groupMappings : mappings) { if (groupMappingsOne.getTaxComponent().equals(groupMappings.getTaxComponent())) { if (groupMappingsOne.endDate() == null && groupMappings.endDate() == null) { - baseDataValidator.reset().parameter("component").failWithCode("dates.are.overlapping"); + baseDataValidator.reset().parameter(COMPONENT).failWithCode(DATES_ARE_OVERLAPPING); } else if (groupMappingsOne.startDate().isAfter(groupMappings.startDate())) { - baseDataValidator.reset().parameter("component.start.date").value(groupMappingsOne.startDate()) + baseDataValidator.reset().parameter(COMPONENT_START_DATE).value(groupMappingsOne.startDate()) .validateDateAfter(groupMappings.endDate()); } else { - baseDataValidator.reset().parameter("component.start.date").value(groupMappings.startDate()) + baseDataValidator.reset().parameter(COMPONENT_START_DATE).value(groupMappings.startDate()) .validateDateAfter(groupMappingsOne.endDate()); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/service/TaxReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/service/TaxReadPlatformServiceImpl.java index 0c3ef225b..721d18663 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/service/TaxReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/service/TaxReadPlatformServiceImpl.java @@ -41,10 +41,10 @@ import org.springframework.stereotype.Service; @Service public class TaxReadPlatformServiceImpl implements TaxReadPlatformService { - final TaxComponentMapper taxComponentMapper = new TaxComponentMapper(); - final TaxGroupMapper taxGroupMapper = new TaxGroupMapper(); - final TaxComponentLookUpMapper taxComponentLookUpMapper = new TaxComponentLookUpMapper(); - final TaxGroupLookUpMapper taxGroupLookUpMapper = new TaxGroupLookUpMapper(); + private static final TaxComponentMapper TAX_COMPONENT_MAPPER = new TaxComponentMapper(); + private static final TaxGroupMapper TAX_GROUP_MAPPER = new TaxGroupMapper(); + private static final TaxComponentLookUpMapper TAX_COMPONENT_LOOK_UP_MAPPER = new TaxComponentLookUpMapper(); + private static final TaxGroupLookUpMapper TAX_GROUP_LOOK_UP_MAPPER = new TaxGroupLookUpMapper(); private final JdbcTemplate jdbcTemplate; private final AccountingDropdownReadPlatformService accountingDropdownReadPlatformService; @@ -58,14 +58,14 @@ public class TaxReadPlatformServiceImpl implements TaxReadPlatformService { @Override public Collection retrieveAllTaxComponents() { - String sql = "select " + this.taxComponentMapper.getSchema(); - return this.jdbcTemplate.query(sql, this.taxComponentMapper); // NOSONAR + String sql = "select " + TAX_COMPONENT_MAPPER.getSchema(); + return this.jdbcTemplate.query(sql, TAX_COMPONENT_MAPPER); // NOSONAR } @Override public TaxComponentData retrieveTaxComponentData(final Long id) { - String sql = "select " + this.taxComponentMapper.getSchema() + " where tc.id=?"; - return this.jdbcTemplate.queryForObject(sql, this.taxComponentMapper, new Object[] { id }); // NOSONAR + String sql = "select " + TAX_COMPONENT_MAPPER.getSchema() + " where tc.id=?"; + return this.jdbcTemplate.queryForObject(sql, TAX_COMPONENT_MAPPER, id); // NOSONAR } @Override @@ -76,14 +76,14 @@ public class TaxReadPlatformServiceImpl implements TaxReadPlatformService { @Override public Collection retrieveAllTaxGroups() { - String sql = "select " + this.taxGroupMapper.getSchema(); - return this.jdbcTemplate.query(sql, this.taxGroupMapper); // NOSONAR + String sql = "select " + TAX_GROUP_MAPPER.getSchema(); + return this.jdbcTemplate.query(sql, TAX_GROUP_MAPPER); // NOSONAR } @Override public TaxGroupData retrieveTaxGroupData(final Long id) { - String sql = "select " + this.taxGroupMapper.getSchema() + " where tg.id=?"; - return this.jdbcTemplate.queryForObject(sql, this.taxGroupMapper, new Object[] { id }); // NOSONAR + String sql = "select " + TAX_GROUP_MAPPER.getSchema() + " where tg.id=?"; + return this.jdbcTemplate.queryForObject(sql, TAX_GROUP_MAPPER, id); // NOSONAR } @Override @@ -99,20 +99,20 @@ public class TaxReadPlatformServiceImpl implements TaxReadPlatformService { } private Collection retrieveTaxComponentsForLookUp() { - String sql = "select " + this.taxComponentLookUpMapper.getSchema(); - return this.jdbcTemplate.query(sql, this.taxComponentLookUpMapper); // NOSONAR + String sql = "select " + TAX_COMPONENT_LOOK_UP_MAPPER.getSchema(); + return this.jdbcTemplate.query(sql, TAX_COMPONENT_LOOK_UP_MAPPER); // NOSONAR } @Override public Collection retrieveTaxGroupsForLookUp() { - String sql = "select " + this.taxGroupLookUpMapper.getSchema(); - return this.jdbcTemplate.query(sql, this.taxGroupLookUpMapper); // NOSONAR + String sql = "select " + TAX_GROUP_LOOK_UP_MAPPER.getSchema(); + return this.jdbcTemplate.query(sql, TAX_GROUP_LOOK_UP_MAPPER); // NOSONAR } private static final class TaxComponentMapper implements RowMapper { private final String schema; - private TaxComponentHistoryDataMapper componentHistoryDataMapper = new TaxComponentHistoryDataMapper(); + private final TaxComponentHistoryDataMapper componentHistoryDataMapper = new TaxComponentHistoryDataMapper(); TaxComponentMapper() { StringBuilder sb = new StringBuilder(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/transfer/service/TransferWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/transfer/service/TransferWritePlatformServiceJpaRepositoryImpl.java index 4d483f463..8e98cf8ae 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/transfer/service/TransferWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/transfer/service/TransferWritePlatformServiceJpaRepositoryImpl.java @@ -238,7 +238,7 @@ public class TransferWritePlatformServiceJpaRepositoryImpl implements TransferWr **/ final List allClientJLGLoans = this.loanRepositoryWrapper.findByClientIdAndGroupId(client.getId(), sourceGroup.getId()); for (final Loan loan : allClientJLGLoans) { - if (loan.status().isActiveOrAwaitingApprovalOrDisbursal()) { + if (loan.getStatus().isActiveOrAwaitingApprovalOrDisbursal()) { loan.updateGroup(destinationGroup); if (inheritDestinationGroupLoanOfficer != null && inheritDestinationGroupLoanOfficer == true && destinationGroupLoanOfficer != null) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/template/api/TemplatesApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/template/api/TemplatesApiResource.java index ae7456e46..4ba4ef5c8 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/template/api/TemplatesApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/template/api/TemplatesApiResource.java @@ -28,9 +28,6 @@ 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 java.io.IOException; -import java.net.MalformedURLException; -import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -81,9 +78,13 @@ import org.springframework.stereotype.Component; + "UGDs can be assigned to an entity like client or loan and be of a type like Document or SMS. The entity and type of a UGD is only there for the convenience of user agents (UIs), in order to know where to show UGDs for the user (i.e. which tab). The Template Engine back-end runner does not actually need this metadata.") public class TemplatesApiResource { - private final Set responseTemplatesDataParameters = new HashSet<>(Arrays.asList("id")); - private final Set responseTemplateDataParameters = new HashSet<>(Arrays.asList("id", "entities", "types", "template")); - private final String resourceNameForPermission = "template"; + public static final String ID = "id"; + public static final String ENTITIES = "entities"; + public static final String TYPES = "types"; + public static final String PARAM_TEMPLATE = "template"; + private static final Set RESPONSE_TEMPLATES_DATA_PARAMETERS = new HashSet<>(List.of(ID)); + private static final Set RESPONSE_TEMPLATE_DATA_PARAMETERS = new HashSet<>(List.of(ID, ENTITIES, TYPES, PARAM_TEMPLATE)); + private static final String RESOURCE_NAME_FOR_PERMISSION = PARAM_TEMPLATE; private final PlatformSecurityContext context; private final DefaultToApiJsonSerializer