Interop KYC and Interop Loan Disbursement (#1330)

* Interop get account KYC

* loan interop disbursement

* checkstyle fix

Co-authored-by: Subham Pramanik <subhampramanik@google.com>
This commit is contained in:
SubhamPramanik
2020-09-29 23:22:18 +05:30
committed by GitHub
co-authored by Subham Pramanik
parent 3479e44b40
commit e5f3e8720d
8 changed files with 667 additions and 3 deletions
@@ -58,6 +58,7 @@ import org.apache.fineract.interoperation.data.InteropAccountData;
import org.apache.fineract.interoperation.data.InteropIdentifierAccountResponseData;
import org.apache.fineract.interoperation.data.InteropIdentifierRequestData;
import org.apache.fineract.interoperation.data.InteropIdentifiersResponseData;
import org.apache.fineract.interoperation.data.InteropKycResponseData;
import org.apache.fineract.interoperation.data.InteropQuoteRequestData;
import org.apache.fineract.interoperation.data.InteropQuoteResponseData;
import org.apache.fineract.interoperation.data.InteropTransactionRequestData;
@@ -389,4 +390,29 @@ public class InteropApiResource {
return jsonSerializer.serialize(settings, result);
}
@GET
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
@Path("accounts/{accountId}/kyc")
@Operation(summary = "Query KYC by Account Id", description = "")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = InteropKycResponseData.class))) })
public String getClientKyc(@PathParam("accountId") @Parameter(description = "accountId") String accountId, @Context UriInfo uriInfo) {
InteropKycResponseData result = interopService.getKyc(accountId);
ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
return jsonSerializer.serialize(settings, result);
}
@POST
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
@Path("transactions/{accountId}/disburse")
@Operation(summary = "Disburse Loan by Account Id", description = "")
public String disburseLoan(@PathParam("accountId") @Parameter(description = "accountId") String accountId,
@Parameter(hidden = true) final String apiRequestBodyAsJson, @Context UriInfo uriInfo) {
return interopService.disburseLoan(accountId, apiRequestBodyAsJson);
}
}
@@ -0,0 +1,69 @@
/**
* 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.interoperation.data;
import java.io.Serializable;
public class IdDocument implements Serializable {
String idType;
String idNumber;
String issuerCountry;
String otherIdDescription;
public IdDocument(String idType, String idNumber, String issuerCountry, String otherIdDescription) {
this.idType = idType;
this.idNumber = idNumber;
this.issuerCountry = issuerCountry;
this.otherIdDescription = otherIdDescription;
}
public String getIdType() {
return idType;
}
public void setIdType(String idType) {
this.idType = idType;
}
public String getIdNumber() {
return idNumber;
}
public void setIdNumber(String idNumber) {
this.idNumber = idNumber;
}
public String getIssuerCountry() {
return issuerCountry;
}
public void setIssuerCountry(String issuerCountry) {
this.issuerCountry = issuerCountry;
}
public String getOtherIdDescription() {
return otherIdDescription;
}
public void setOtherIdDescription(String otherIdDescription) {
this.otherIdDescription = otherIdDescription;
}
}
@@ -0,0 +1,145 @@
/**
* 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.interoperation.data;
import java.io.Serializable;
public class InteropKycData implements Serializable {
private String nationality;
private String dateOfBirth;
private String contactPhone;
private String gender;
private String email;
private String idType;
private String idNo;
private String description;
private String country;
private String addressLine1;
private String addressLine2;
private String city;
private String stateProvince;
private String postalCode;
private String firstName;
private String middleName;
private String lastName;
private String displayName;
public InteropKycData(String nationality, String dateOfBirth, String contactPhone, String gender, String email, String idType,
String idNo, String description, String country, String addressLine1, String addressLine2, String city, String stateProvince,
String postalCode, String firstName, String middleName, String lastName, String displayName) {
this.nationality = nationality;
this.dateOfBirth = dateOfBirth;
this.contactPhone = contactPhone;
this.gender = gender;
this.email = email;
this.idType = idType;
this.idNo = idNo;
this.description = description;
this.country = country;
this.addressLine1 = addressLine1;
this.addressLine2 = addressLine2;
this.city = city;
this.stateProvince = stateProvince;
this.postalCode = postalCode;
this.firstName = firstName;
this.middleName = middleName;
this.lastName = lastName;
this.displayName = displayName;
}
public static InteropKycData instance(String nationality, String dateOfBirth, String contactPhone, String gender, String email,
String idType, String idNo, String description, String country, String address_line_1, String address_line_2, String city,
String stateProvince, String postalCode, String firstName, String middleName, String lastName, String displayName) {
return new InteropKycData(nationality, dateOfBirth, contactPhone, gender, email, idType, idNo, description, country, address_line_1,
address_line_2, city, stateProvince, postalCode, firstName, middleName, lastName, displayName);
}
public String getNationality() {
return nationality;
}
public String getDateOfBirth() {
return dateOfBirth;
}
public String getContactPhone() {
return contactPhone;
}
public String getGender() {
return gender;
}
public String getEmail() {
return email;
}
public String getIdType() {
return idType;
}
public String getIdNo() {
return idNo;
}
public String getDescription() {
return description;
}
public String getCountry() {
return country;
}
public String getAddressLine1() {
return addressLine1;
}
public String getAddressLine2() {
return addressLine2;
}
public String getCity() {
return city;
}
public String getStateProvince() {
return stateProvince;
}
public String getPostalCode() {
return postalCode;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public String getMiddleName() {
return middleName;
}
public String getDisplayName() {
return displayName;
}
}
@@ -0,0 +1,147 @@
/**
* 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.interoperation.data;
import java.util.Map;
import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
public class InteropKycResponseData extends CommandProcessingResult {
private String nationality;
private String dateOfBirth;
private String contactPhone;
private String gender;
private IdDocument[] idDocument;
private PostalAddress postalAddress;
private SubjectName subjectName;
private String emailAddress;
private String birthCountry;
public InteropKycResponseData(Long resourceId, Long officeId, Long commandId, Map<String, Object> changesOnly, String nationality,
String dateOfBirth, String contactPhone, String gender, IdDocument[] idDocument, PostalAddress postalAddress,
SubjectName subjectName, String emailAddress, String birthCountry) {
super(resourceId, officeId, commandId, changesOnly);
this.nationality = nationality;
this.dateOfBirth = dateOfBirth;
this.contactPhone = contactPhone;
this.gender = gender;
this.idDocument = idDocument;
this.postalAddress = postalAddress;
this.subjectName = subjectName;
this.emailAddress = emailAddress;
this.birthCountry = birthCountry;
}
public InteropKycResponseData(String nationality, String dateOfBirth, String contactPhone, String gender, IdDocument[] idDocument,
PostalAddress postalAddress, SubjectName subjectName, String emailAddress, String birthCountry) {
this(null, null, null, null, nationality, dateOfBirth, contactPhone, gender, idDocument, postalAddress, subjectName, emailAddress,
birthCountry);
}
public static InteropKycResponseData build(InteropKycData accountKyc) {
PostalAddress postalAddress = new PostalAddress(accountKyc.getAddressLine1(), accountKyc.getAddressLine2(), accountKyc.getCity(),
accountKyc.getStateProvince(), accountKyc.getPostalCode(), accountKyc.getCountry());
IdDocument idDocument = new IdDocument(accountKyc.getIdType(), accountKyc.getIdNo(), accountKyc.getCountry(),
accountKyc.getDescription());
SubjectName subjectName = new SubjectName(accountKyc.getFirstName(), accountKyc.getMiddleName(), accountKyc.getLastName(),
accountKyc.getDisplayName());
return new InteropKycResponseData(accountKyc.getNationality(), accountKyc.getDateOfBirth(), accountKyc.getContactPhone(),
accountKyc.getGender(), new IdDocument[] { idDocument }, postalAddress, subjectName, accountKyc.getEmail(),
accountKyc.getCountry());
}
public String getNationality() {
return nationality;
}
public void setNationality(String nationality) {
this.nationality = nationality;
}
public String getDateOfBirth() {
return dateOfBirth;
}
public void setDateOfBirth(String dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
public String getContactPhone() {
return contactPhone;
}
public void setContactPhone(String contactPhone) {
this.contactPhone = contactPhone;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public IdDocument[] getIdDocument() {
return idDocument;
}
public void setIdDocument(IdDocument[] idDocument) {
this.idDocument = idDocument;
}
public PostalAddress getPostalAddress() {
return postalAddress;
}
public void setPostalAddress(PostalAddress postalAddress) {
this.postalAddress = postalAddress;
}
public SubjectName getSubjectName() {
return subjectName;
}
public void setSubjectName(SubjectName subjectName) {
this.subjectName = subjectName;
}
public String getEmailAddress() {
return emailAddress;
}
public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
}
public String getBirthCountry() {
return birthCountry;
}
public void setBirthCountry(String birthCountry) {
this.birthCountry = birthCountry;
}
}
@@ -0,0 +1,89 @@
/**
* 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.interoperation.data;
import java.io.Serializable;
public class PostalAddress implements Serializable {
String addressLine1;
String addressLine2;
String city;
String stateProvince;
String postalCode;
String country;
public PostalAddress(String addressLine1, String addressLine2, String city, String stateProvince, String postalCode, String country) {
this.addressLine1 = addressLine1;
this.addressLine2 = addressLine2;
this.city = city;
this.stateProvince = stateProvince;
this.postalCode = postalCode;
this.country = country;
}
public String getAddressLine1() {
return addressLine1;
}
public void setAddressLine1(String addressLine1) {
this.addressLine1 = addressLine1;
}
public String getAddressLine2() {
return addressLine2;
}
public void setAddressLine2(String addressLine2) {
this.addressLine2 = addressLine2;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getStateProvince() {
return stateProvince;
}
public void setStateProvince(String stateProvince) {
this.stateProvince = stateProvince;
}
public String getPostalCode() {
return postalCode;
}
public void setPostalCode(String postalCode) {
this.postalCode = postalCode;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
}
@@ -0,0 +1,68 @@
/**
* 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.interoperation.data;
import java.io.Serializable;
public class SubjectName implements Serializable {
String firstName;
String middleName;
String lastName;
String displayName;
public SubjectName(String firstName, String middleName, String lastName, String displayName) {
this.firstName = firstName;
this.middleName = middleName;
this.lastName = lastName;
this.displayName = displayName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getMiddleName() {
return middleName;
}
public void setMiddleName(String middleName) {
this.middleName = middleName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getDisplayName() {
return displayName;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
}
@@ -24,6 +24,7 @@ import org.apache.fineract.infrastructure.core.api.JsonCommand;
import org.apache.fineract.interoperation.data.InteropAccountData;
import org.apache.fineract.interoperation.data.InteropIdentifierAccountResponseData;
import org.apache.fineract.interoperation.data.InteropIdentifiersResponseData;
import org.apache.fineract.interoperation.data.InteropKycResponseData;
import org.apache.fineract.interoperation.data.InteropQuoteResponseData;
import org.apache.fineract.interoperation.data.InteropTransactionRequestResponseData;
import org.apache.fineract.interoperation.data.InteropTransactionsData;
@@ -74,4 +75,10 @@ public interface InteropService {
@NotNull
InteropTransferResponseData releaseTransfer(@NotNull JsonCommand command);
@NotNull
InteropKycResponseData getKyc(@NotNull String accountId);
@NotNull
String disburseLoan(@NotNull String accountId, String apiRequestBodyAsJson);
}
@@ -28,20 +28,30 @@ import static org.apache.fineract.portfolio.savings.domain.SavingsAccountTransac
import jakarta.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.ZoneId;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.function.Predicate;
import org.apache.commons.lang3.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.JsonCommand;
import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
import org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer;
import org.apache.fineract.infrastructure.core.service.DateUtils;
import org.apache.fineract.infrastructure.core.service.RoutingDataSource;
import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil;
import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
import org.apache.fineract.interoperation.data.InteropAccountData;
import org.apache.fineract.interoperation.data.InteropIdentifierAccountResponseData;
import org.apache.fineract.interoperation.data.InteropIdentifierRequestData;
import org.apache.fineract.interoperation.data.InteropIdentifiersResponseData;
import org.apache.fineract.interoperation.data.InteropKycData;
import org.apache.fineract.interoperation.data.InteropKycResponseData;
import org.apache.fineract.interoperation.data.InteropQuoteRequestData;
import org.apache.fineract.interoperation.data.InteropQuoteResponseData;
import org.apache.fineract.interoperation.data.InteropRequestData;
@@ -61,6 +71,9 @@ import org.apache.fineract.organisation.monetary.domain.ApplicationCurrency;
import org.apache.fineract.organisation.monetary.domain.ApplicationCurrencyRepository;
import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
import org.apache.fineract.organisation.monetary.domain.Money;
import org.apache.fineract.portfolio.loanaccount.data.LoanAccountData;
import org.apache.fineract.portfolio.loanaccount.domain.Loan;
import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository;
import org.apache.fineract.portfolio.note.domain.Note;
import org.apache.fineract.portfolio.note.domain.NoteRepository;
import org.apache.fineract.portfolio.paymentdetail.domain.PaymentDetail;
@@ -84,6 +97,9 @@ import org.joda.time.format.DateTimeFormatter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@@ -102,19 +118,28 @@ public class InteropServiceImpl implements InteropService {
private final NoteRepository noteRepository;
private final PaymentTypeRepository paymentTypeRepository;
private final InteropIdentifierRepository identifierRepository;
private final LoanRepository loanRepository;
private final SavingsHelper savingsHelper;
private final SavingsAccountTransactionSummaryWrapper savingsAccountTransactionSummaryWrapper;
private final SavingsAccountDomainService savingsAccountService;
private final JdbcTemplate jdbcTemplate;
private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService;
private final DefaultToApiJsonSerializer<LoanAccountData> toApiJsonSerializer;
@Autowired
public InteropServiceImpl(PlatformSecurityContext securityContext, InteropDataValidator interopDataValidator,
SavingsAccountRepository savingsAccountRepository, SavingsAccountTransactionRepository savingsAccountTransactionRepository,
ApplicationCurrencyRepository applicationCurrencyRepository, NoteRepository noteRepository,
PaymentTypeRepository paymentTypeRepository, InteropIdentifierRepository identifierRepository, SavingsHelper savingsHelper,
SavingsAccountTransactionSummaryWrapper savingsAccountTransactionSummaryWrapper,
SavingsAccountDomainService savingsAccountService) {
PaymentTypeRepository paymentTypeRepository, InteropIdentifierRepository identifierRepository, LoanRepository loanRepository,
SavingsHelper savingsHelper, SavingsAccountTransactionSummaryWrapper savingsAccountTransactionSummaryWrapper,
SavingsAccountDomainService savingsAccountService, final RoutingDataSource dataSource,
final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService,
final DefaultToApiJsonSerializer<LoanAccountData> toApiJsonSerializer) {
this.securityContext = securityContext;
this.dataValidator = interopDataValidator;
this.savingsAccountRepository = savingsAccountRepository;
@@ -123,9 +148,56 @@ public class InteropServiceImpl implements InteropService {
this.noteRepository = noteRepository;
this.paymentTypeRepository = paymentTypeRepository;
this.identifierRepository = identifierRepository;
this.loanRepository = loanRepository;
this.savingsHelper = savingsHelper;
this.savingsAccountTransactionSummaryWrapper = savingsAccountTransactionSummaryWrapper;
this.savingsAccountService = savingsAccountService;
this.jdbcTemplate = new JdbcTemplate(dataSource);
this.commandsSourceWritePlatformService = commandsSourceWritePlatformService;
this.toApiJsonSerializer = toApiJsonSerializer;
}
private static final class KycMapper implements RowMapper<InteropKycData> {
public String schema() {
return " country.code_value as nationality, c.`date_of_birth` as dateOfBirth, c.`mobile_no` as contactPhone, gender.code_value as gender, c.`email_address` as email, "
+ "kyc.code_value as idType, ci.`document_key` as idNo, ci.`description` as description, "
+ "country.code_value as country, a.`address_line_1`, a.`address_line_2`, "
+ "a.`city`, state.code_value as stateProvince, a.`postal_code` as postalCode, c.`firstname` as firstName, c.`middlename` as middleName,"
+ "c.`lastname` as lastName, c.`display_name` as displayName" + " from " + "m_client c "
+ "left join m_client_address ca on c.id=ca.client_id " + "left join m_address a on a.id = ca.address_id "
+ "inner join m_code_value gender on gender.id=c.`gender_cv_id` "
+ "left join m_code_value country on country.id=a.`country_id` "
+ "left join m_code_value state on state.id = a.`state_province_id` "
+ "left join m_client_identifier ci on c.id=ci.`client_id` "
+ "left join m_code_value kyc on kyc.id = ci.`document_type_id` ";
}
@Override
public InteropKycData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException {
final String nationality = rs.getString("nationality");
final String dateOfBirth = rs.getString("dateOfBirth");
final String contactPhone = rs.getString("contactPhone");
final String gender = rs.getString("gender");
final String email = rs.getString("email");
final String idType = rs.getString("idType");
final String idNo = rs.getString("idNo");
final String description = rs.getString("description");
final String country = rs.getString("country");
final String addressLine1 = rs.getString("address_line_1");
final String addressLine2 = rs.getString("address_line_2");
final String city = rs.getString("city");
final String stateProvince = rs.getString("stateProvince");
final String postalCode = rs.getString("postalCode");
final String firstName = rs.getString("firstName");
final String middleName = rs.getString("middleName");
final String lastName = rs.getString("lastName");
final String displayName = rs.getString("displayName");
return InteropKycData.instance(nationality, dateOfBirth, contactPhone, gender, email, idType, idNo, description, country,
addressLine1, addressLine2, city, stateProvince, postalCode, firstName, middleName, lastName, displayName);
}
}
@NotNull
@@ -409,6 +481,39 @@ public class InteropServiceImpl implements InteropService {
request.getExpiration(), request.getExtensionList(), request.getTransferCode(), transactionDateTime);
}
@Override
public @NotNull InteropKycResponseData getKyc(@NotNull @NotNull String accountId) {
SavingsAccount savingsAccount = validateAndGetSavingAccount(accountId);
Long client_id = savingsAccount.getClient().getId();
try {
final InteropServiceImpl.KycMapper rm = new InteropServiceImpl.KycMapper();
final String sql = "select " + rm.schema() + " where c.id = ?";
final InteropKycData accountKyc = this.jdbcTemplate.queryForObject(sql, rm, new Object[] { client_id });
return InteropKycResponseData.build(accountKyc);
} catch (final EmptyResultDataAccessException e) {
throw new UnsupportedOperationException("Error in retrieving KYC information: " + e);
}
}
@Override
public @NotNull String disburseLoan(@NotNull String accountId, String apiRequestBodyAsJson) {
Loan loan = validateAndGetLoan(accountId);
Long loanId = loan.getId();
LocalDateTime disbursedOnDate = DateUtils.getLocalDateTimeOfTenant();
final CommandWrapperBuilder builder = new CommandWrapperBuilder().withJson(apiRequestBodyAsJson);
final CommandWrapper commandRequest = builder.disburseLoanApplication(loanId).build();
CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
return this.toApiJsonSerializer.serialize(result);
}
private SavingsAccount validateAndGetSavingAccount(String accountId) {
SavingsAccount savingsAccount = savingsAccountRepository.findByExternalId(accountId);
if (savingsAccount == null) {
@@ -417,6 +522,14 @@ public class InteropServiceImpl implements InteropService {
return savingsAccount;
}
private Loan validateAndGetLoan(String accountId) {
Loan loan = loanRepository.findNonClosedLoanByAccountNumber(accountId);
if (loan == null) {
throw new UnsupportedOperationException("Loan not found for the given account No: " + accountId);
}
return loan;
}
private SavingsAccount validateAndGetSavingAccount(@NotNull InteropRequestData request) {
// TODO: error handling
SavingsAccount savingsAccount = validateAndGetSavingAccount(request.getAccountId());