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:
co-authored by
Subham Pramanik
parent
3479e44b40
commit
e5f3e8720d
+26
@@ -58,6 +58,7 @@ import org.apache.fineract.interoperation.data.InteropAccountData;
|
|||||||
import org.apache.fineract.interoperation.data.InteropIdentifierAccountResponseData;
|
import org.apache.fineract.interoperation.data.InteropIdentifierAccountResponseData;
|
||||||
import org.apache.fineract.interoperation.data.InteropIdentifierRequestData;
|
import org.apache.fineract.interoperation.data.InteropIdentifierRequestData;
|
||||||
import org.apache.fineract.interoperation.data.InteropIdentifiersResponseData;
|
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.InteropQuoteRequestData;
|
||||||
import org.apache.fineract.interoperation.data.InteropQuoteResponseData;
|
import org.apache.fineract.interoperation.data.InteropQuoteResponseData;
|
||||||
import org.apache.fineract.interoperation.data.InteropTransactionRequestData;
|
import org.apache.fineract.interoperation.data.InteropTransactionRequestData;
|
||||||
@@ -389,4 +390,29 @@ public class InteropApiResource {
|
|||||||
|
|
||||||
return jsonSerializer.serialize(settings, result);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+69
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+145
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
+147
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+89
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+68
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
+7
@@ -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.InteropAccountData;
|
||||||
import org.apache.fineract.interoperation.data.InteropIdentifierAccountResponseData;
|
import org.apache.fineract.interoperation.data.InteropIdentifierAccountResponseData;
|
||||||
import org.apache.fineract.interoperation.data.InteropIdentifiersResponseData;
|
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.InteropQuoteResponseData;
|
||||||
import org.apache.fineract.interoperation.data.InteropTransactionRequestResponseData;
|
import org.apache.fineract.interoperation.data.InteropTransactionRequestResponseData;
|
||||||
import org.apache.fineract.interoperation.data.InteropTransactionsData;
|
import org.apache.fineract.interoperation.data.InteropTransactionsData;
|
||||||
@@ -74,4 +75,10 @@ public interface InteropService {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
InteropTransferResponseData releaseTransfer(@NotNull JsonCommand command);
|
InteropTransferResponseData releaseTransfer(@NotNull JsonCommand command);
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
InteropKycResponseData getKyc(@NotNull String accountId);
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
String disburseLoan(@NotNull String accountId, String apiRequestBodyAsJson);
|
||||||
}
|
}
|
||||||
|
|||||||
+116
-3
@@ -28,20 +28,30 @@ import static org.apache.fineract.portfolio.savings.domain.SavingsAccountTransac
|
|||||||
|
|
||||||
import jakarta.validation.constraints.NotNull;
|
import jakarta.validation.constraints.NotNull;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
import java.time.ZoneId;
|
import java.time.ZoneId;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
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.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.DateUtils;
|
||||||
|
import org.apache.fineract.infrastructure.core.service.RoutingDataSource;
|
||||||
import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil;
|
import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil;
|
||||||
import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
|
import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
|
||||||
import org.apache.fineract.interoperation.data.InteropAccountData;
|
import org.apache.fineract.interoperation.data.InteropAccountData;
|
||||||
import org.apache.fineract.interoperation.data.InteropIdentifierAccountResponseData;
|
import org.apache.fineract.interoperation.data.InteropIdentifierAccountResponseData;
|
||||||
import org.apache.fineract.interoperation.data.InteropIdentifierRequestData;
|
import org.apache.fineract.interoperation.data.InteropIdentifierRequestData;
|
||||||
import org.apache.fineract.interoperation.data.InteropIdentifiersResponseData;
|
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.InteropQuoteRequestData;
|
||||||
import org.apache.fineract.interoperation.data.InteropQuoteResponseData;
|
import org.apache.fineract.interoperation.data.InteropQuoteResponseData;
|
||||||
import org.apache.fineract.interoperation.data.InteropRequestData;
|
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.ApplicationCurrencyRepository;
|
||||||
import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
|
import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
|
||||||
import org.apache.fineract.organisation.monetary.domain.Money;
|
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.Note;
|
||||||
import org.apache.fineract.portfolio.note.domain.NoteRepository;
|
import org.apache.fineract.portfolio.note.domain.NoteRepository;
|
||||||
import org.apache.fineract.portfolio.paymentdetail.domain.PaymentDetail;
|
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.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
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.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Propagation;
|
import org.springframework.transaction.annotation.Propagation;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
@@ -102,19 +118,28 @@ public class InteropServiceImpl implements InteropService {
|
|||||||
private final NoteRepository noteRepository;
|
private final NoteRepository noteRepository;
|
||||||
private final PaymentTypeRepository paymentTypeRepository;
|
private final PaymentTypeRepository paymentTypeRepository;
|
||||||
private final InteropIdentifierRepository identifierRepository;
|
private final InteropIdentifierRepository identifierRepository;
|
||||||
|
private final LoanRepository loanRepository;
|
||||||
|
|
||||||
private final SavingsHelper savingsHelper;
|
private final SavingsHelper savingsHelper;
|
||||||
private final SavingsAccountTransactionSummaryWrapper savingsAccountTransactionSummaryWrapper;
|
private final SavingsAccountTransactionSummaryWrapper savingsAccountTransactionSummaryWrapper;
|
||||||
|
|
||||||
private final SavingsAccountDomainService savingsAccountService;
|
private final SavingsAccountDomainService savingsAccountService;
|
||||||
|
|
||||||
|
private final JdbcTemplate jdbcTemplate;
|
||||||
|
|
||||||
|
private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService;
|
||||||
|
|
||||||
|
private final DefaultToApiJsonSerializer<LoanAccountData> toApiJsonSerializer;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public InteropServiceImpl(PlatformSecurityContext securityContext, InteropDataValidator interopDataValidator,
|
public InteropServiceImpl(PlatformSecurityContext securityContext, InteropDataValidator interopDataValidator,
|
||||||
SavingsAccountRepository savingsAccountRepository, SavingsAccountTransactionRepository savingsAccountTransactionRepository,
|
SavingsAccountRepository savingsAccountRepository, SavingsAccountTransactionRepository savingsAccountTransactionRepository,
|
||||||
ApplicationCurrencyRepository applicationCurrencyRepository, NoteRepository noteRepository,
|
ApplicationCurrencyRepository applicationCurrencyRepository, NoteRepository noteRepository,
|
||||||
PaymentTypeRepository paymentTypeRepository, InteropIdentifierRepository identifierRepository, SavingsHelper savingsHelper,
|
PaymentTypeRepository paymentTypeRepository, InteropIdentifierRepository identifierRepository, LoanRepository loanRepository,
|
||||||
SavingsAccountTransactionSummaryWrapper savingsAccountTransactionSummaryWrapper,
|
SavingsHelper savingsHelper, SavingsAccountTransactionSummaryWrapper savingsAccountTransactionSummaryWrapper,
|
||||||
SavingsAccountDomainService savingsAccountService) {
|
SavingsAccountDomainService savingsAccountService, final RoutingDataSource dataSource,
|
||||||
|
final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService,
|
||||||
|
final DefaultToApiJsonSerializer<LoanAccountData> toApiJsonSerializer) {
|
||||||
this.securityContext = securityContext;
|
this.securityContext = securityContext;
|
||||||
this.dataValidator = interopDataValidator;
|
this.dataValidator = interopDataValidator;
|
||||||
this.savingsAccountRepository = savingsAccountRepository;
|
this.savingsAccountRepository = savingsAccountRepository;
|
||||||
@@ -123,9 +148,56 @@ public class InteropServiceImpl implements InteropService {
|
|||||||
this.noteRepository = noteRepository;
|
this.noteRepository = noteRepository;
|
||||||
this.paymentTypeRepository = paymentTypeRepository;
|
this.paymentTypeRepository = paymentTypeRepository;
|
||||||
this.identifierRepository = identifierRepository;
|
this.identifierRepository = identifierRepository;
|
||||||
|
this.loanRepository = loanRepository;
|
||||||
this.savingsHelper = savingsHelper;
|
this.savingsHelper = savingsHelper;
|
||||||
this.savingsAccountTransactionSummaryWrapper = savingsAccountTransactionSummaryWrapper;
|
this.savingsAccountTransactionSummaryWrapper = savingsAccountTransactionSummaryWrapper;
|
||||||
this.savingsAccountService = savingsAccountService;
|
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
|
@NotNull
|
||||||
@@ -409,6 +481,39 @@ public class InteropServiceImpl implements InteropService {
|
|||||||
request.getExpiration(), request.getExtensionList(), request.getTransferCode(), transactionDateTime);
|
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) {
|
private SavingsAccount validateAndGetSavingAccount(String accountId) {
|
||||||
SavingsAccount savingsAccount = savingsAccountRepository.findByExternalId(accountId);
|
SavingsAccount savingsAccount = savingsAccountRepository.findByExternalId(accountId);
|
||||||
if (savingsAccount == null) {
|
if (savingsAccount == null) {
|
||||||
@@ -417,6 +522,14 @@ public class InteropServiceImpl implements InteropService {
|
|||||||
return savingsAccount;
|
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) {
|
private SavingsAccount validateAndGetSavingAccount(@NotNull InteropRequestData request) {
|
||||||
// TODO: error handling
|
// TODO: error handling
|
||||||
SavingsAccount savingsAccount = validateAndGetSavingAccount(request.getAccountId());
|
SavingsAccount savingsAccount = validateAndGetSavingAccount(request.getAccountId());
|
||||||
|
|||||||
Reference in New Issue
Block a user