Loan externalId unique validation
This commit is contained in:
committed by
Arnold Gálovics
parent
2d07e8c867
commit
357062a186
+2
@@ -161,4 +161,6 @@ public interface LoanRepository extends JpaRepository<Loan, Long>, JpaSpecificat
|
|||||||
@Query(FIND_BY_ACCOUNT_NUMBER)
|
@Query(FIND_BY_ACCOUNT_NUMBER)
|
||||||
Loan findLoanAccountByAccountNumber(@Param("accountNumber") String accountNumber);
|
Loan findLoanAccountByAccountNumber(@Param("accountNumber") String accountNumber);
|
||||||
|
|
||||||
|
boolean existsByExternalId(@Param("externalId") String externalId);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+4
@@ -240,6 +240,10 @@ public class LoanRepositoryWrapper {
|
|||||||
return this.repository.findNonClosedLoanByAccountNumber(accountNumber);
|
return this.repository.findNonClosedLoanByAccountNumber(accountNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean existLoanByExternalId(final String externalId) {
|
||||||
|
return this.repository.existsByExternalId(externalId);
|
||||||
|
}
|
||||||
|
|
||||||
// Looks like we need complete entity
|
// Looks like we need complete entity
|
||||||
@Transactional(readOnly = true)
|
@Transactional(readOnly = true)
|
||||||
public Loan findNonClosedLoanThatBelongsToClient(@Param("loanId") Long loanId, @Param("clientId") Long clientId) {
|
public Loan findNonClosedLoanThatBelongsToClient(@Param("loanId") Long loanId, @Param("clientId") Long clientId) {
|
||||||
|
|||||||
+10
@@ -303,6 +303,16 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa
|
|||||||
|
|
||||||
this.fromApiJsonDeserializer.validateForCreate(command.json(), isMeetingMandatoryForJLGLoans, loanProduct);
|
this.fromApiJsonDeserializer.validateForCreate(command.json(), isMeetingMandatoryForJLGLoans, loanProduct);
|
||||||
|
|
||||||
|
// Validate If the externalId is already registered
|
||||||
|
final String externalId = this.fromJsonHelper.extractStringNamed("externalId", command.parsedJson());
|
||||||
|
if (StringUtils.isNotBlank(externalId)) {
|
||||||
|
final boolean existByExternalId = this.loanRepositoryWrapper.existLoanByExternalId(externalId);
|
||||||
|
if (existByExternalId) {
|
||||||
|
throw new GeneralPlatformDomainRuleException("error.msg.loan.with.externalId.already.used",
|
||||||
|
"Loan with externalId is already registered.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
final List<ApiParameterError> dataValidationErrors = new ArrayList<>();
|
final List<ApiParameterError> dataValidationErrors = new ArrayList<>();
|
||||||
final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("loan");
|
final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("loan");
|
||||||
|
|
||||||
|
|||||||
+42
@@ -19,6 +19,7 @@
|
|||||||
package org.apache.fineract.integrationtests;
|
package org.apache.fineract.integrationtests;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
@@ -125,6 +126,26 @@ public class ClientLoanIntegrationTest {
|
|||||||
verifyLoanRepaymentSchedule(loanSchedule);
|
verifyLoanRepaymentSchedule(loanSchedule);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void validateClientLoanWithUniqueExternalId() {
|
||||||
|
// Given
|
||||||
|
this.loanTransactionHelper = new LoanTransactionHelper(this.requestSpec, this.responseSpec);
|
||||||
|
final ResponseSpecification responseSpec403 = new ResponseSpecBuilder().expectStatusCode(403).build();
|
||||||
|
|
||||||
|
final Integer clientID = ClientHelper.createClient(this.requestSpec, this.responseSpec);
|
||||||
|
final Integer loanProductID = createLoanProduct(false, NONE);
|
||||||
|
|
||||||
|
final String externalId = Utils.randomStringGenerator("qwerty", 10);
|
||||||
|
|
||||||
|
// When
|
||||||
|
final Integer loanID = applyForLoanApplicationWithExternalId(this.requestSpec, this.responseSpec, clientID, loanProductID,
|
||||||
|
"12,000.00", externalId);
|
||||||
|
|
||||||
|
// Then
|
||||||
|
assertNotNull(loanID);
|
||||||
|
applyForLoanApplicationWithExternalId(this.requestSpec, responseSpec403, clientID, loanProductID, "12,000.00", externalId);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testLoanCharges_DISBURSEMENT_FEE() {
|
public void testLoanCharges_DISBURSEMENT_FEE() {
|
||||||
this.loanTransactionHelper = new LoanTransactionHelper(this.requestSpec, this.responseSpec);
|
this.loanTransactionHelper = new LoanTransactionHelper(this.requestSpec, this.responseSpec);
|
||||||
@@ -1155,6 +1176,27 @@ public class ClientLoanIntegrationTest {
|
|||||||
return this.loanTransactionHelper.getLoanId(loanApplicationJSON);
|
return this.loanTransactionHelper.getLoanId(loanApplicationJSON);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Integer applyForLoanApplicationWithExternalId(RequestSpecification requestSpec, ResponseSpecification responseSpec,
|
||||||
|
final Integer clientID, final Integer loanProductID, String principal, final String externalId) {
|
||||||
|
LOG.info("------------------------APPLYING FOR LOAN APPLICATION WITH EXTERNALID------------------------");
|
||||||
|
final String loanApplicationJSON = new LoanApplicationTestBuilder() //
|
||||||
|
.withPrincipal(principal) //
|
||||||
|
.withExternalId(externalId) //
|
||||||
|
.withLoanTermFrequency("4") //
|
||||||
|
.withLoanTermFrequencyAsMonths() //
|
||||||
|
.withNumberOfRepayments("4") //
|
||||||
|
.withRepaymentEveryAfter("1") //
|
||||||
|
.withRepaymentFrequencyTypeAsMonths() //
|
||||||
|
.withInterestRatePerPeriod("2") //
|
||||||
|
.withAmortizationTypeAsEqualInstallments() //
|
||||||
|
.withInterestTypeAsDecliningBalance() //
|
||||||
|
.withInterestCalculationPeriodTypeSameAsRepaymentPeriod() //
|
||||||
|
.withExpectedDisbursementDate("20 September 2011") //
|
||||||
|
.withSubmittedOnDate("20 September 2011") //
|
||||||
|
.build(clientID.toString(), loanProductID.toString(), null);
|
||||||
|
return this.loanTransactionHelper.getLoanId(loanApplicationJSON, requestSpec, responseSpec);
|
||||||
|
}
|
||||||
|
|
||||||
private Integer applyForLoanApplicationWithTranches(final Integer clientID, final Integer loanProductID, List<HashMap> charges,
|
private Integer applyForLoanApplicationWithTranches(final Integer clientID, final Integer loanProductID, List<HashMap> charges,
|
||||||
final String savingsId, String principal, List<HashMap> tranches, List<HashMap> collaterals) {
|
final String savingsId, String principal, List<HashMap> tranches, List<HashMap> collaterals) {
|
||||||
LOG.info("--------------------------------APPLYING FOR LOAN APPLICATION--------------------------------");
|
LOG.info("--------------------------------APPLYING FOR LOAN APPLICATION--------------------------------");
|
||||||
|
|||||||
+11
-1
@@ -43,6 +43,7 @@ public class LoanApplicationTestBuilder {
|
|||||||
public static final String RBI_INDIA_STRATEGY = "4";
|
public static final String RBI_INDIA_STRATEGY = "4";
|
||||||
public static final String INTEREST_PRINCIPAL_PENALTIES_FEES_ORDER_STRATEGY = "6";
|
public static final String INTEREST_PRINCIPAL_PENALTIES_FEES_ORDER_STRATEGY = "6";
|
||||||
|
|
||||||
|
private String externalId = null;
|
||||||
private String principal = "10,000";
|
private String principal = "10,000";
|
||||||
private String glimPrincipal = "1000";
|
private String glimPrincipal = "1000";
|
||||||
private String loanTermFrequency = "";
|
private String loanTermFrequency = "";
|
||||||
@@ -124,7 +125,7 @@ public class LoanApplicationTestBuilder {
|
|||||||
if (this.glimPrincipal != null) {
|
if (this.glimPrincipal != null) {
|
||||||
map.put("glimPrincipal", this.glimPrincipal);
|
map.put("glimPrincipal", this.glimPrincipal);
|
||||||
}
|
}
|
||||||
map.put("locale", "en_GB");
|
map.put("locale", LOCALE);
|
||||||
|
|
||||||
String approvalFormData = new Gson().toJson(map);
|
String approvalFormData = new Gson().toJson(map);
|
||||||
LOG.info("approvalFormData: {} ", approvalFormData);
|
LOG.info("approvalFormData: {} ", approvalFormData);
|
||||||
@@ -153,6 +154,10 @@ public class LoanApplicationTestBuilder {
|
|||||||
map.put("collateral", this.collaterals);
|
map.put("collateral", this.collaterals);
|
||||||
map.put("interestChargedFromDate", this.interestChargedFromDate);
|
map.put("interestChargedFromDate", this.interestChargedFromDate);
|
||||||
|
|
||||||
|
if (this.externalId != null) {
|
||||||
|
map.put("externalId", this.externalId);
|
||||||
|
}
|
||||||
|
|
||||||
if (repaymentsStartingFromDate != null) {
|
if (repaymentsStartingFromDate != null) {
|
||||||
map.put("repaymentsStartingFromDate", this.repaymentsStartingFromDate);
|
map.put("repaymentsStartingFromDate", this.repaymentsStartingFromDate);
|
||||||
}
|
}
|
||||||
@@ -185,6 +190,11 @@ public class LoanApplicationTestBuilder {
|
|||||||
return new Gson().toJson(map);
|
return new Gson().toJson(map);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public LoanApplicationTestBuilder withExternalId(final String externalId) {
|
||||||
|
this.externalId = externalId;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public LoanApplicationTestBuilder withPrincipal(final String principalAmount) {
|
public LoanApplicationTestBuilder withPrincipal(final String principalAmount) {
|
||||||
this.principal = principalAmount;
|
this.principal = principalAmount;
|
||||||
return this;
|
return this;
|
||||||
|
|||||||
+5
-1
@@ -81,7 +81,11 @@ public class LoanTransactionHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Integer getLoanId(final String loanApplicationJSON) {
|
public Integer getLoanId(final String loanApplicationJSON) {
|
||||||
return Utils.performServerPost(this.requestSpec, this.responseSpec, APPLY_LOAN_URL, loanApplicationJSON, "loanId");
|
return this.getLoanId(loanApplicationJSON, this.requestSpec, this.responseSpec);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getLoanId(final String loanApplicationJSON, RequestSpecification requestSpec, ResponseSpecification responseSpec) {
|
||||||
|
return Utils.performServerPost(requestSpec, responseSpec, APPLY_LOAN_URL, loanApplicationJSON, "loanId");
|
||||||
}
|
}
|
||||||
|
|
||||||
public HashMap<String, Integer> getGlimId(final String loanApplicationJSON) {
|
public HashMap<String, Integer> getGlimId(final String loanApplicationJSON) {
|
||||||
|
|||||||
Reference in New Issue
Block a user