| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| package org.apache.fineract.portfolio.savings.api; |
| |
| import java.util.Arrays; |
| import java.util.Collection; |
| import java.util.HashSet; |
| import java.util.Set; |
| |
| import javax.ws.rs.Consumes; |
| import javax.ws.rs.DELETE; |
| import javax.ws.rs.DefaultValue; |
| import javax.ws.rs.GET; |
| import javax.ws.rs.POST; |
| import javax.ws.rs.PUT; |
| import javax.ws.rs.Path; |
| import javax.ws.rs.PathParam; |
| import javax.ws.rs.Produces; |
| import javax.ws.rs.QueryParam; |
| import javax.ws.rs.core.Context; |
| import javax.ws.rs.core.MediaType; |
| import javax.ws.rs.core.UriInfo; |
| |
| import org.apache.commons.lang.StringUtils; |
| 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.core.api.ApiParameterHelper; |
| import org.apache.fineract.infrastructure.core.api.ApiRequestParameterHelper; |
| import org.apache.fineract.infrastructure.core.api.JsonQuery; |
| import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; |
| import org.apache.fineract.infrastructure.core.data.PaginationParameters; |
| import org.apache.fineract.infrastructure.core.exception.UnrecognizedQueryParamException; |
| import org.apache.fineract.infrastructure.core.serialization.ApiRequestJsonSerializationSettings; |
| import org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer; |
| import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; |
| import org.apache.fineract.infrastructure.core.service.Page; |
| import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; |
| import org.apache.fineract.portfolio.account.data.PortfolioAccountData; |
| import org.apache.fineract.portfolio.account.service.AccountAssociationsReadPlatformService; |
| import org.apache.fineract.portfolio.savings.DepositAccountType; |
| import org.apache.fineract.portfolio.savings.DepositsApiConstants; |
| import org.apache.fineract.portfolio.savings.SavingsApiConstants; |
| import org.apache.fineract.portfolio.savings.data.DepositAccountData; |
| import org.apache.fineract.portfolio.savings.data.FixedDepositAccountData; |
| import org.apache.fineract.portfolio.savings.data.SavingsAccountChargeData; |
| import org.apache.fineract.portfolio.savings.data.SavingsAccountTransactionData; |
| import org.apache.fineract.portfolio.savings.service.DepositAccountPreMatureCalculationPlatformService; |
| import org.apache.fineract.portfolio.savings.service.DepositAccountReadPlatformService; |
| import org.apache.fineract.portfolio.savings.service.SavingsAccountChargeReadPlatformService; |
| import org.springframework.beans.factory.annotation.Autowired; |
| import org.springframework.context.annotation.Scope; |
| import org.springframework.stereotype.Component; |
| import org.springframework.util.CollectionUtils; |
| |
| import com.google.gson.JsonElement; |
| |
| @Path("/fixeddepositaccounts") |
| @Component |
| @Scope("singleton") |
| public class FixedDepositAccountsApiResource { |
| |
| private final DepositAccountReadPlatformService depositAccountReadPlatformService; |
| private final PlatformSecurityContext context; |
| private final DefaultToApiJsonSerializer<DepositAccountData> toApiJsonSerializer; |
| private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; |
| private final ApiRequestParameterHelper apiRequestParameterHelper; |
| private final SavingsAccountChargeReadPlatformService savingsAccountChargeReadPlatformService; |
| private final FromJsonHelper fromJsonHelper; |
| private final DepositAccountPreMatureCalculationPlatformService accountPreMatureCalculationPlatformService; |
| private final AccountAssociationsReadPlatformService accountAssociationsReadPlatformService; |
| |
| @Autowired |
| public FixedDepositAccountsApiResource(final DepositAccountReadPlatformService depositAccountReadPlatformService, |
| final PlatformSecurityContext context, final DefaultToApiJsonSerializer<DepositAccountData> toApiJsonSerializer, |
| final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService, |
| final ApiRequestParameterHelper apiRequestParameterHelper, |
| final SavingsAccountChargeReadPlatformService savingsAccountChargeReadPlatformService, final FromJsonHelper fromJsonHelper, |
| final DepositAccountPreMatureCalculationPlatformService accountPreMatureCalculationPlatformService, |
| final AccountAssociationsReadPlatformService accountAssociationsReadPlatformService) { |
| this.depositAccountReadPlatformService = depositAccountReadPlatformService; |
| this.context = context; |
| this.toApiJsonSerializer = toApiJsonSerializer; |
| this.commandsSourceWritePlatformService = commandsSourceWritePlatformService; |
| this.apiRequestParameterHelper = apiRequestParameterHelper; |
| this.savingsAccountChargeReadPlatformService = savingsAccountChargeReadPlatformService; |
| this.fromJsonHelper = fromJsonHelper; |
| this.accountPreMatureCalculationPlatformService = accountPreMatureCalculationPlatformService; |
| this.accountAssociationsReadPlatformService = accountAssociationsReadPlatformService; |
| } |
| |
| @GET |
| @Path("template") |
| @Consumes({ MediaType.APPLICATION_JSON }) |
| @Produces({ MediaType.APPLICATION_JSON }) |
| public String template(@QueryParam("clientId") final Long clientId, @QueryParam("groupId") final Long groupId, |
| @QueryParam("productId") final Long productId, |
| @DefaultValue("false") @QueryParam("staffInSelectedOfficeOnly") final boolean staffInSelectedOfficeOnly, |
| @Context final UriInfo uriInfo) { |
| |
| this.context.authenticatedUser().validateHasReadPermission(DepositsApiConstants.FIXED_DEPOSIT_ACCOUNT_RESOURCE_NAME); |
| |
| final DepositAccountData account = this.depositAccountReadPlatformService.retrieveTemplate(DepositAccountType.FIXED_DEPOSIT, |
| clientId, groupId, productId, staffInSelectedOfficeOnly); |
| |
| final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); |
| return this.toApiJsonSerializer.serialize(settings, account, DepositsApiConstants.FIXED_DEPOSIT_ACCOUNT_RESPONSE_DATA_PARAMETERS); |
| } |
| |
| @GET |
| @Consumes({ MediaType.APPLICATION_JSON }) |
| @Produces({ MediaType.APPLICATION_JSON }) |
| public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("paged") final Boolean paged, |
| @QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit, |
| @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder) { |
| |
| this.context.authenticatedUser().validateHasReadPermission(DepositsApiConstants.FIXED_DEPOSIT_ACCOUNT_RESOURCE_NAME); |
| final PaginationParameters paginationParameters = PaginationParameters.instance(paged, offset, limit, orderBy, sortOrder); |
| final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); |
| |
| if (paginationParameters.isPaged()) { |
| final Page<DepositAccountData> account = this.depositAccountReadPlatformService.retrieveAllPaged( |
| DepositAccountType.FIXED_DEPOSIT, paginationParameters); |
| return this.toApiJsonSerializer.serialize(settings, account, |
| DepositsApiConstants.FIXED_DEPOSIT_ACCOUNT_RESPONSE_DATA_PARAMETERS); |
| } |
| |
| final Collection<DepositAccountData> account = this.depositAccountReadPlatformService.retrieveAll(DepositAccountType.FIXED_DEPOSIT, |
| paginationParameters); |
| |
| return this.toApiJsonSerializer.serialize(settings, account, DepositsApiConstants.FIXED_DEPOSIT_ACCOUNT_RESPONSE_DATA_PARAMETERS); |
| } |
| |
| @POST |
| @Consumes({ MediaType.APPLICATION_JSON }) |
| @Produces({ MediaType.APPLICATION_JSON }) |
| public String submitApplication(final String apiRequestBodyAsJson) { |
| |
| final CommandWrapper commandRequest = new CommandWrapperBuilder().createFixedDepositAccount().withJson(apiRequestBodyAsJson) |
| .build(); |
| |
| final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest); |
| |
| return this.toApiJsonSerializer.serialize(result); |
| } |
| |
| @GET |
| @Path("{accountId}") |
| @Consumes({ MediaType.APPLICATION_JSON }) |
| @Produces({ MediaType.APPLICATION_JSON }) |
| public String retrieveOne(@PathParam("accountId") final Long accountId, |
| @DefaultValue("false") @QueryParam("staffInSelectedOfficeOnly") final boolean staffInSelectedOfficeOnly, |
| @DefaultValue("all") @QueryParam("chargeStatus") final String chargeStatus, @Context final UriInfo uriInfo) { |
| |
| this.context.authenticatedUser().validateHasReadPermission(DepositsApiConstants.FIXED_DEPOSIT_ACCOUNT_RESOURCE_NAME); |
| |
| if (!(is(chargeStatus, "all") || is(chargeStatus, "active") || is(chargeStatus, "inactive"))) { throw new UnrecognizedQueryParamException( |
| "status", chargeStatus, new Object[] { "all", "active", "inactive" }); } |
| |
| final FixedDepositAccountData account = (FixedDepositAccountData) this.depositAccountReadPlatformService.retrieveOneWithChartSlabs( |
| DepositAccountType.FIXED_DEPOSIT, accountId); |
| |
| final Set<String> mandatoryResponseParameters = new HashSet<>(); |
| final FixedDepositAccountData accountTemplate = populateTemplateAndAssociations(accountId, account, staffInSelectedOfficeOnly, |
| chargeStatus, uriInfo, mandatoryResponseParameters); |
| |
| final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters(), |
| mandatoryResponseParameters); |
| return this.toApiJsonSerializer.serialize(settings, accountTemplate, |
| DepositsApiConstants.FIXED_DEPOSIT_ACCOUNT_RESPONSE_DATA_PARAMETERS); |
| } |
| |
| private FixedDepositAccountData populateTemplateAndAssociations(final Long accountId, final FixedDepositAccountData savingsAccount, |
| final boolean staffInSelectedOfficeOnly, final String chargeStatus, final UriInfo uriInfo, |
| final Set<String> mandatoryResponseParameters) { |
| |
| Collection<SavingsAccountTransactionData> transactions = null; |
| Collection<SavingsAccountChargeData> charges = null; |
| PortfolioAccountData linkedAccount = null; |
| |
| final Set<String> associationParameters = ApiParameterHelper.extractAssociationsForResponseIfProvided(uriInfo.getQueryParameters()); |
| if (!associationParameters.isEmpty()) { |
| |
| if (associationParameters.contains("all")) { |
| associationParameters.addAll(Arrays.asList(SavingsApiConstants.transactions, SavingsApiConstants.charges, |
| SavingsApiConstants.linkedAccount)); |
| } |
| |
| if (associationParameters.contains(SavingsApiConstants.transactions)) { |
| mandatoryResponseParameters.add(SavingsApiConstants.transactions); |
| final Collection<SavingsAccountTransactionData> currentTransactions = this.depositAccountReadPlatformService |
| .retrieveAllTransactions(DepositAccountType.FIXED_DEPOSIT, accountId); |
| if (!CollectionUtils.isEmpty(currentTransactions)) { |
| transactions = currentTransactions; |
| } |
| } |
| |
| if (associationParameters.contains(SavingsApiConstants.charges)) { |
| mandatoryResponseParameters.add(SavingsApiConstants.charges); |
| final Collection<SavingsAccountChargeData> currentCharges = this.savingsAccountChargeReadPlatformService |
| .retrieveSavingsAccountCharges(accountId, chargeStatus); |
| if (!CollectionUtils.isEmpty(currentCharges)) { |
| charges = currentCharges; |
| } |
| } |
| |
| if (associationParameters.contains(SavingsApiConstants.linkedAccount)) { |
| mandatoryResponseParameters.add(SavingsApiConstants.linkedAccount); |
| linkedAccount = this.accountAssociationsReadPlatformService.retriveSavingsLinkedAssociation(accountId); |
| } |
| } |
| |
| FixedDepositAccountData templateData = null; |
| final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); |
| |
| if (settings.isTemplate()) { |
| templateData = (FixedDepositAccountData) this.depositAccountReadPlatformService.retrieveTemplate( |
| DepositAccountType.FIXED_DEPOSIT, savingsAccount.clientId(), savingsAccount.groupId(), savingsAccount.productId(), |
| staffInSelectedOfficeOnly); |
| } |
| |
| return FixedDepositAccountData.associationsAndTemplate(savingsAccount, templateData, transactions, charges, linkedAccount); |
| } |
| |
| @PUT |
| @Path("{accountId}") |
| @Consumes({ MediaType.APPLICATION_JSON }) |
| @Produces({ MediaType.APPLICATION_JSON }) |
| public String update(@PathParam("accountId") final Long accountId, final String apiRequestBodyAsJson) { |
| |
| final CommandWrapper commandRequest = new CommandWrapperBuilder().updateFixedDepositAccount(accountId) |
| .withJson(apiRequestBodyAsJson).build(); |
| |
| final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest); |
| |
| return this.toApiJsonSerializer.serialize(result); |
| } |
| |
| @POST |
| @Path("{accountId}") |
| @Consumes({ MediaType.APPLICATION_JSON }) |
| @Produces({ MediaType.APPLICATION_JSON }) |
| public String handleCommands(@PathParam("accountId") final Long accountId, @QueryParam("command") final String commandParam, |
| @Context final UriInfo uriInfo, final String apiRequestBodyAsJson) { |
| |
| String jsonApiRequest = apiRequestBodyAsJson; |
| if (StringUtils.isBlank(jsonApiRequest)) { |
| jsonApiRequest = "{}"; |
| } |
| |
| final CommandWrapperBuilder builder = new CommandWrapperBuilder().withJson(jsonApiRequest); |
| |
| CommandProcessingResult result = null; |
| if (is(commandParam, "reject")) { |
| final CommandWrapper commandRequest = builder.rejectFixedDepositAccountApplication(accountId).build(); |
| result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest); |
| } else if (is(commandParam, "withdrawnByApplicant")) { |
| final CommandWrapper commandRequest = builder.withdrawFixedDepositAccountApplication(accountId).build(); |
| result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest); |
| } else if (is(commandParam, "approve")) { |
| final CommandWrapper commandRequest = builder.approveFixedDepositAccountApplication(accountId).build(); |
| result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest); |
| } else if (is(commandParam, "undoapproval")) { |
| final CommandWrapper commandRequest = builder.undoFixedDepositAccountApplication(accountId).build(); |
| result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest); |
| } else if (is(commandParam, "activate")) { |
| final CommandWrapper commandRequest = builder.fixedDepositAccountActivation(accountId).build(); |
| result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest); |
| } else if (is(commandParam, "calculateInterest")) { |
| final CommandWrapper commandRequest = builder.withNoJsonBody().fixedDepositAccountInterestCalculation(accountId).build(); |
| result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest); |
| } else if (is(commandParam, "postInterest")) { |
| final CommandWrapper commandRequest = builder.fixedDepositAccountInterestPosting(accountId).build(); |
| result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest); |
| } else if (is(commandParam, "close")) { |
| final CommandWrapper commandRequest = builder.closeFixedDepositAccount(accountId).build(); |
| result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest); |
| } else if (is(commandParam, "prematureClose")) { |
| final CommandWrapper commandRequest = builder.prematureCloseFixedDepositAccount(accountId).build(); |
| result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest); |
| } else if (is(commandParam, "calculatePrematureAmount")) { |
| final JsonElement parsedQuery = this.fromJsonHelper.parse(apiRequestBodyAsJson); |
| final JsonQuery query = JsonQuery.from(apiRequestBodyAsJson, parsedQuery, this.fromJsonHelper); |
| final DepositAccountData account = this.accountPreMatureCalculationPlatformService.calculatePreMatureAmount(accountId, query, |
| DepositAccountType.FIXED_DEPOSIT); |
| final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); |
| return this.toApiJsonSerializer.serialize(settings, account, |
| DepositsApiConstants.FIXED_DEPOSIT_ACCOUNT_RESPONSE_DATA_PARAMETERS); |
| } |
| |
| if (result == null) { throw new UnrecognizedQueryParamException("command", commandParam, new Object[] { "reject", |
| "withdrawnByApplicant", "approve", "undoapproval", "activate", "calculateInterest", "postInterest", "close", |
| "prematureClose", "calculatePrematureAmount" }); } |
| |
| return this.toApiJsonSerializer.serialize(result); |
| } |
| |
| private boolean is(final String commandParam, final String commandValue) { |
| return StringUtils.isNotBlank(commandParam) && commandParam.trim().equalsIgnoreCase(commandValue); |
| } |
| |
| @DELETE |
| @Path("{accountId}") |
| @Consumes({ MediaType.APPLICATION_JSON }) |
| @Produces({ MediaType.APPLICATION_JSON }) |
| public String delete(@PathParam("accountId") final Long accountId) { |
| |
| final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteFixedDepositAccount(accountId).build(); |
| |
| final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest); |
| |
| return this.toApiJsonSerializer.serialize(result); |
| } |
| |
| @GET |
| @Path("{accountId}/template") |
| @Consumes({ MediaType.APPLICATION_JSON }) |
| @Produces({ MediaType.APPLICATION_JSON }) |
| public String accountClosureTemplate(@PathParam("accountId") final Long accountId, @QueryParam("command") final String commandParam, |
| @Context final UriInfo uriInfo) { |
| |
| this.context.authenticatedUser().validateHasReadPermission(DepositsApiConstants.FIXED_DEPOSIT_ACCOUNT_RESOURCE_NAME); |
| DepositAccountData account = null; |
| if (is(commandParam, "close")) { |
| account = this.depositAccountReadPlatformService.retrieveOneWithClosureTemplate(DepositAccountType.FIXED_DEPOSIT, accountId); |
| } |
| |
| final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); |
| return this.toApiJsonSerializer.serialize(settings, account, DepositsApiConstants.FIXED_DEPOSIT_ACCOUNT_RESPONSE_DATA_PARAMETERS); |
| } |
| } |