/*
* eGov suite of products aim to improve the internal efficiency,transparency,
* accountability and the service delivery of the government organizations.
*
* Copyright (C) <2015> eGovernments Foundation
*
* The updated version of eGov suite of products as by eGovernments Foundation
* is available at http://www.egovernments.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses/ or
* http://www.gnu.org/licenses/gpl.html .
*
* In addition to the terms of the GPL license to be adhered to in using this
* program, the following additional terms are to be complied with:
*
* 1) All versions of this program, verbatim or modified must carry this
* Legal Notice.
*
* 2) Any misrepresentation of the origin of the material is prohibited. It
* is required that all modified versions of this material be marked in
* reasonable ways as different from the original version.
*
* 3) This license does not grant any rights to any user of the program
* with regards to rights under trademark law for use of the trade names
* or trademarks of eGovernments Foundation.
*
* In case of any queries, you can reach eGovernments Foundation at contact@egovernments.org.
*/
package org.egov.ptis.web.rest;
import static org.egov.ptis.constants.PropertyTaxConstants.ARR_COLL_STR;
import static org.egov.ptis.constants.PropertyTaxConstants.ARR_DMD_STR;
import static org.egov.ptis.constants.PropertyTaxConstants.CURR_COLL_STR;
import static org.egov.ptis.constants.PropertyTaxConstants.CURR_DMD_STR;
import static org.egov.ptis.constants.PropertyTaxConstants.NATURE_TITLE_TRANSFER;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_CONTENT_TYPE;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_CODE_AADHAAR_NUMBER_NOTEXISTS;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_CODE_ASSESSMENT_NO_LEN;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_CODE_ASSESSMENT_NO_NOT_FOUND;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_CODE_ASSESSMENT_NO_REQUIRED;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_CODE_INVALIDCREDENTIALS;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_CODE_PROPERTYTRANSFER_ALREADYINWORKFLOW;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_CODE_PROPERTYTRANSFER_MUTATIONDEEDNUMBER_MANDATORY;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_CODE_PROPERTYTRANSFER_MUTATIONRDEEDDATE_MANDATORY;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_CODE_PROPERTYTRANSFER_MUTATIONREASON_MANDATORY;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_CODE_PROPERTYTRANSFER_REQUIREDDOCUMENTMISSING;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_CODE_PROPERTYTRANSFER_SALEDETAIL_MANDATORY;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_CODE_PROPERTYTRANSFER_TAXPENDING;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_CODE_PROPERTYTRANSFER_TRANSFEREENAME_MANDATORY;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_CODE_PROPERTYTRANSFER_TRANSFEREE_GENDERMANDATORY;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_CODE_PROPERTYTRANSFER_TRANSFEREE_MOBILENUMBERMANDATORY;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_CODE_PROPERTYTRANSFER_TRANSFEREE_NAMEMANDATORY;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_MSG_AADHAAR_NUMBER_NOTEXISTS;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_MSG_ASSESSMENT_NO_LEN;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_MSG_ASSESSMENT_NO_NOT_FOUND;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_MSG_ASSESSMENT_NO_REQUIRED;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_MSG_INVALIDCREDENTIALS;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_MSG_PROPERTYTRANSFER_ALREADYINWORKFLOW;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_MSG_PROPERTYTRANSFER_MUTATIONDEEDNUMBER_MANDATORY;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_MSG_PROPERTYTRANSFER_MUTATIONRDEEDDATE_MANDATORY;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_MSG_PROPERTYTRANSFER_MUTATIONREASON_MANDATORY;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_MSG_PROPERTYTRANSFER_REQUIREDDOCUMENTMISSING;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_MSG_PROPERTYTRANSFER_SALEDETAIL_MANDATORY;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_MSG_PROPERTYTRANSFER_TAXPENDING;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_MSG_PROPERTYTRANSFER_TRANSFEREENAME_MANDATORY;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_MSG_PROPERTYTRANSFER_TRANSFEREE_GENDERMANDATORY;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_MSG_PROPERTYTRANSFER_TRANSFEREE_MOBILENUMBERMANDATORY;
import static org.egov.ptis.constants.PropertyTaxConstants.THIRD_PARTY_ERR_MSG_PROPERTYTRANSFER_TRANSFEREE_NAMEMANDATORY;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.text.MessageFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang.StringUtils;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.annotate.JsonMethod;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
import org.egov.eis.entity.Assignment;
import org.egov.eis.service.EisCommonService;
import org.egov.infra.aadhaar.webservice.client.AadhaarInfoServiceClient;
import org.egov.infra.admin.master.entity.User;
import org.egov.infra.config.core.ApplicationThreadLocals;
import org.egov.infra.persistence.entity.enums.Gender;
import org.egov.infra.persistence.entity.enums.UserType;
import org.egov.infra.workflow.matrix.entity.WorkFlowMatrix;
import org.egov.infra.workflow.service.SimpleWorkflowService;
import org.egov.pims.commons.Position;
import org.egov.ptis.domain.entity.property.BasicProperty;
import org.egov.ptis.domain.entity.property.Document;
import org.egov.ptis.domain.entity.property.DocumentType;
import org.egov.ptis.domain.entity.property.PropertyMutation;
import org.egov.ptis.domain.entity.property.PropertyMutationMaster;
import org.egov.ptis.domain.entity.property.PropertyMutationTransferee;
import org.egov.ptis.domain.model.ErrorDetails;
import org.egov.ptis.domain.model.MasterCodeNamePairDetails;
import org.egov.ptis.domain.model.OwnerDetails;
import org.egov.ptis.domain.service.property.PropertyService;
import org.egov.ptis.domain.service.transfer.PropertyTransferService;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.sun.jersey.core.header.ContentDisposition;
import com.sun.jersey.multipart.FormDataBodyPart;
import com.sun.jersey.multipart.FormDataMultiPart;
import com.sun.jersey.multipart.FormDataParam;
/**
* The PropertyTransferRestService class is used as the RESTFul service to
* handle user request and response.
*
* @author Pradeep
*/
@Component
@Path("/transfer")
public class PropertyTransferRestService {
private static final String DOCUMENT_TYPE_ADDRESSPROOF = "Address Proof Of Parties";
private static final String DOCUMENT_TYPE_PROPERTYDOCUMENT = "Attested Copies Of Property Documents";
private static final String DOCUMENT_TYPE_DEEDISSUEDBYREVENUEDEPT = "Title Deeds Issued By Revenue Department";
@Autowired
private PropertyTransferService propertyTransferService;
@Autowired
private PropertyService propertyService;
@Autowired
@Qualifier("workflowService")
private SimpleWorkflowService<PropertyMutation> transferWorkflowService;
@Autowired
private AadhaarInfoServiceClient aadhaarInfoServiceClient;
@Autowired
private EisCommonService eisCommonService;
@Context
HttpServletRequest context;
String USER_NAME = "mahesh";
String PASSWORD = "demo";
String LOGIN_USERID = "16";
/**
* @param accessmentnumber
* @param username
* @param password
* @param details
* @param receivedon
* @param recievedBy
* @return
* @throws JsonGenerationException
* @throws JsonMappingException
* @throws IOException
*/
@POST
@Path("/propertyTransfer/createPropertyTransfer")
@Produces(MediaType.APPLICATION_JSON)
@Consumes({ MediaType.MULTIPART_FORM_DATA })
public String createRevisionPetitionFromRest(@FormDataParam("accessmentnumber") String accessmentnumber,
@FormDataParam("username") String username, @FormDataParam("password") String password,
@FormDataParam("ownerDetails") String ownerDetails,
@FormDataParam("mutationReasonCode") String mutationReason, @FormDataParam("saleDetail") String saleDetail,
@FormDataParam("deedNo") String deedNo, @FormDataParam("deedDate") String deedDate,
FormDataMultiPart formTransferDocument) throws JsonGenerationException, JsonMappingException, IOException {
List<DocumentType> documentTypes = new ArrayList<>();
String responseJson = new String();
PropertyMutationMaster mutationMaster = null;
BasicProperty basicProperty = null;
Boolean isAuthenticatedUser = authenticateUser(username, password);
if (isAuthenticatedUser) {
ApplicationThreadLocals.setUserId(Long.valueOf(LOGIN_USERID));
List<OwnerDetails> ownerDetailsList = null;
if (ownerDetails != null && ownerDetails.trim().length() > 0)
ownerDetailsList = new ObjectMapper().readValue(ownerDetails.toString(),
new TypeReference<Collection<OwnerDetails>>() {
});
documentTypes = propertyTransferService.getPropertyTransferDocumentTypes();
if (accessmentnumber != null)
basicProperty = propertyTransferService.getBasicPropertyByUpicNo(accessmentnumber);
if (mutationReason != null)
mutationMaster = propertyTransferService.getPropertyTransferReasonsByCode(mutationReason);
ErrorDetails errorDetails = validateTransferPropertyParams(formTransferDocument, documentTypes,
mutationMaster, accessmentnumber, basicProperty, ownerDetailsList, mutationReason, saleDetail,
deedNo, deedDate);
if (null != errorDetails) {
responseJson = getJSONResponse(errorDetails);
} else {
List<Document> documents = getDocumentList(formTransferDocument, documentTypes);
PropertyMutation propertyMutation = buildPropertyMutationObject(mutationReason, saleDetail, deedNo,
deedDate, ownerDetailsList, basicProperty);
if (documents != null && documents.size() > 0)
propertyMutation.setDocuments(documents);
transitionWorkFlow(propertyMutation, basicProperty);
propertyTransferService.initiatePropertyTransfer(basicProperty, propertyMutation);
responseJson = convertPropertyMutationToJson(propertyMutation);
}
} else {
ErrorDetails errorDetails = getInvalidCredentialsErrorDetails();
responseJson = getJSONResponse(errorDetails);
;
}
return responseJson;
}
/**
*
* @param username
* @param password
* @return
* @throws JsonGenerationException
* @throws JsonMappingException
* @throws IOException
*/
@POST
@Path("/propertyTransfer/getMutationReasons")
@Produces(MediaType.APPLICATION_JSON)
public String getMutationReasons(@FormParam("username") String username, @FormParam("password") String password)
throws JsonGenerationException, JsonMappingException, IOException {
List<MasterCodeNamePairDetails> mstrCodeNamePairDetailsList = new ArrayList<MasterCodeNamePairDetails>();
ErrorDetails errorDetails = null;
String responseJson = null;
Boolean isAuthenticatedUser = authenticateUser(username, password);
if (isAuthenticatedUser) {
List<PropertyMutationMaster> mutationMasterList = propertyTransferService.getPropertyTransferReasons();
for(PropertyMutationMaster mutationMaster: mutationMasterList )
{
MasterCodeNamePairDetails masterCodeObj= new MasterCodeNamePairDetails();
masterCodeObj.setCode(mutationMaster.getCode());
masterCodeObj.setName(mutationMaster.getMutationName());
mstrCodeNamePairDetailsList.add(masterCodeObj);
}
responseJson = getJSONResponse(mstrCodeNamePairDetailsList);
} else {
errorDetails = getInvalidCredentialsErrorDetails();
responseJson = getJSONResponse(errorDetails);
}
return responseJson;
}
/**
*
* @param username
* @param password
* @return
* @throws JsonGenerationException
* @throws JsonMappingException
* @throws IOException
*/
@POST
@Path("/propertyTransfer/getTransferDocumentType")
@Produces(MediaType.APPLICATION_JSON)
public String getPropertyTransferDocumentType(@FormParam("username") String username, @FormParam("password") String password)
throws JsonGenerationException, JsonMappingException, IOException {
List<MasterCodeNamePairDetails> mstrCodeNamePairDetailsList = new ArrayList<MasterCodeNamePairDetails>();
ErrorDetails errorDetails = null;
String responseJson = null;
Boolean isAuthenticatedUser = authenticateUser(username, password);
if (isAuthenticatedUser) {
List<DocumentType> documentTypeList = propertyTransferService.getPropertyTransferDocumentTypes();
for(DocumentType documentType: documentTypeList )
{
MasterCodeNamePairDetails masterCodeObj= new MasterCodeNamePairDetails();
masterCodeObj.setCode(documentType.getName());
masterCodeObj.setName(documentType.getName());
mstrCodeNamePairDetailsList.add(masterCodeObj);
}
responseJson = getJSONResponse(mstrCodeNamePairDetailsList);
} else {
errorDetails = getInvalidCredentialsErrorDetails();
responseJson = getJSONResponse(errorDetails);
}
return responseJson;
}
/**
*
* @param object
* @return
*/
private String convertPropertyMutationToJson(final Object object) {
GsonBuilder gsonBuilder = new GsonBuilder();
Gson gson = gsonBuilder.registerTypeAdapter(PropertyMutation.class, new PropertyMutationAdaptor()).create();
String json = gson.toJson(object);
return json;
}
/**
*
* @param formTransferDocument
* @param documentTypes
* @return
*/
private List<Document> getDocumentList(FormDataMultiPart formTransferDocument, List<DocumentType> documentTypes) {
InputStream fileInputStream;
ContentDisposition headerOfFilePart;
List<FormDataBodyPart> fields;
List<Document> documents = new ArrayList<Document>();
DocumentType documentType = null;
Document document = null;
fields = formTransferDocument.getFields("addressProofOfParties");
if (fields != null) {
for (FormDataBodyPart field : fields) {
fileInputStream = (field.getValueAs(InputStream.class));
headerOfFilePart = field.getContentDisposition();
if (fileInputStream != null && headerOfFilePart != null) {
documentType = getDocumentTypeByCode(DOCUMENT_TYPE_ADDRESSPROOF, documentTypes);
document = createDocument(fileInputStream, headerOfFilePart);
document.setType(documentType);
documents.add(document);
}
}
}
fields = formTransferDocument.getFields("attestedPropertyDocument");
if (fields != null) {
for (FormDataBodyPart field : fields) {
fileInputStream = (field.getValueAs(InputStream.class));
headerOfFilePart = field.getContentDisposition();
if (fileInputStream != null && headerOfFilePart != null) {
documentType = getDocumentTypeByCode(DOCUMENT_TYPE_PROPERTYDOCUMENT, documentTypes);
document = createDocument(fileInputStream, headerOfFilePart);
document.setType(documentType);
documents.add(document);
}
}
}
fields = formTransferDocument.getFields("titleDeedDocument");
if (fields != null) {
for (FormDataBodyPart field : fields) {
fileInputStream = (field.getValueAs(InputStream.class));
headerOfFilePart = field.getContentDisposition();
if (fileInputStream != null && headerOfFilePart != null) {
documentType = getDocumentTypeByCode(DOCUMENT_TYPE_DEEDISSUEDBYREVENUEDEPT, documentTypes);
document = createDocument(fileInputStream, headerOfFilePart);
document.setType(documentType);
documents.add(document);
}
}
}
return documents;
}
/**
*
* @param fileInputStream
* @param headerOfFilePart
* @return
*/
private Document createDocument(InputStream fileInputStream, ContentDisposition headerOfFilePart) {
Document document = new Document();
List<File> files = new ArrayList<File>();
List<String> contentTypes = new ArrayList<String>();
List<String> fileNames = new ArrayList<String>();
File file = null;
if (fileInputStream != null && headerOfFilePart != null) {
fileNames.add(headerOfFilePart.getFileName());
document.setUploadsFileName(fileNames);
file = writeToFile(fileInputStream, headerOfFilePart.getFileName());
files.add(file);
document.setUploads(files);
contentTypes.add(MessageFormat.format(THIRD_PARTY_CONTENT_TYPE,
FilenameUtils.getExtension(file.getPath())));
document.setUploadsContentType(contentTypes);
}
return document;
}
/**
*
* @param uploadedInputStream
* @param fileName
* @return
*/
private File writeToFile(InputStream uploadedInputStream, String fileName) {
File file = new File(fileName);
try {
OutputStream out = new FileOutputStream(new File(fileName));
int read = 0;
byte[] bytes = new byte[1024];
while ((read = uploadedInputStream.read(bytes)) != -1) {
out.write(bytes, 0, read);
}
out.flush();
out.close();
} catch (IOException e) {
}
return file;
}
/**
*
* @param thirdPartyPhotoOfAssessmentCode
* @param documentTypes
* @return
*/
private DocumentType getDocumentTypeByCode(String thirdPartyPhotoOfAssessmentCode, List<DocumentType> documentTypes) {
for (DocumentType docType : documentTypes) {
if (docType.getName().equalsIgnoreCase(thirdPartyPhotoOfAssessmentCode))
return docType;
}
return null;
}
/**
*
* @param mutationReason
* @param saleDetail
* @param deedNo
* @param deedDate
* @param ownerDetailsList
* @param basicProperty
* @return
*/
private PropertyMutation buildPropertyMutationObject(String mutationReason, String saleDetail, String deedNo,
String deedDate, List<OwnerDetails> ownerDetailsList, BasicProperty basicProperty) {
PropertyMutation propertyMutation = new PropertyMutation();
propertyMutation.setBasicProperty(basicProperty);
SimpleDateFormat dateformat = new SimpleDateFormat("dd/MM/yyyy");
try {
propertyMutation.setDeedDate(dateformat.parse(deedDate));
} catch (ParseException e) {
}
propertyMutation.setDeedNo(deedNo);
propertyMutation.setSaleDetail(saleDetail);
propertyMutation.setMutationReason(propertyTransferService.getPropertyTransferReasonsByCode(mutationReason));
propertyMutation.setTransfereeInfos(getPropertyOwnerInfoList(ownerDetailsList,propertyMutation));
return propertyMutation;
}
/**
*
* @param propertyMutation
* @param basicProperty
*/
private void transitionWorkFlow(PropertyMutation propertyMutation, BasicProperty basicProperty) {
String currentState = "Created";
Position pos = null;
DateTime currentDate = new DateTime();
User user = propertyTransferService.getLoggedInUser();
Assignment assignment = propertyService.getUserPositionByZone(basicProperty, false);
pos = assignment.getPosition();
if (null == propertyMutation.getState()) {
final WorkFlowMatrix wfmatrix = transferWorkflowService.getWfMatrix(propertyMutation.getStateType(), null,
null, null, currentState, null);
if (pos != null)
user = eisCommonService.getUserForPosition(pos.getId(), new Date());
propertyMutation.transition().start().withSenderName(user.getName()).withComments("")
.withStateValue(wfmatrix.getNextState()).withDateInfo(currentDate.toDate()).withOwner(pos)
.withSenderName((user != null && user.getName() != null) ? user.getName() : "").withOwner(user)
.withNextAction(wfmatrix.getNextAction()).withNatureOfTask(NATURE_TITLE_TRANSFER);
}
}
/**
*
* @param ownerDetailsList
* @return
*/
private List<PropertyMutationTransferee> getPropertyOwnerInfoList(List<OwnerDetails> ownerDetailsList,PropertyMutation propertyMutation) {
List<PropertyMutationTransferee> proeprtyOwnerInfoList = new ArrayList<PropertyMutationTransferee>();
for (OwnerDetails ownerDetais : ownerDetailsList) {
PropertyMutationTransferee pmt = new PropertyMutationTransferee();
User owner = new User();
owner.setAadhaarNumber(ownerDetais.getAadhaarNo());
owner.setSalutation(ownerDetais.getSalutationCode());
owner.setType(UserType.CITIZEN);
owner.setName(ownerDetais.getName());
owner.setGender(Gender.valueOf(ownerDetais.getGender()));
owner.setMobileNumber(ownerDetais.getMobileNumber());
owner.setEmailId(ownerDetais.getEmailId());
owner.setGuardianRelation(ownerDetais.getGuardianRelation());
owner.setGuardian(ownerDetais.getGuardian());
pmt.setTransferee(owner);
pmt.setPropertyMutation(propertyMutation);
proeprtyOwnerInfoList.add(pmt);
}
return proeprtyOwnerInfoList;
}
/**
*
* @param formTransferDocument
* @param documentTypes
* @param mutationMaster
* @param accessmentnumber
* @param basicProperty
* @param ownerDetailsList
* @param mutationReason
* @param saleDetail
* @param deedNo
* @param deedDate
* @return
*/
private ErrorDetails validateTransferPropertyParams(FormDataMultiPart formTransferDocument,
List<DocumentType> documentTypes, PropertyMutationMaster mutationMaster, String accessmentnumber,
BasicProperty basicProperty, List<OwnerDetails> ownerDetailsList, String mutationReason, String saleDetail,
String deedNo, String deedDate) {
BigDecimal currentPropertyTaxDue;
BigDecimal currentWaterTaxDue;
BigDecimal arrearPropertyTaxDue;
ErrorDetails errorDetails = null;
if (accessmentnumber == null || accessmentnumber.trim().length() == 0) {
errorDetails = new ErrorDetails();
errorDetails.setErrorCode(THIRD_PARTY_ERR_CODE_ASSESSMENT_NO_REQUIRED);
errorDetails.setErrorMessage(THIRD_PARTY_ERR_MSG_ASSESSMENT_NO_REQUIRED);
} else {
if (basicProperty == null) {
errorDetails = new ErrorDetails();
errorDetails.setErrorCode(THIRD_PARTY_ERR_CODE_ASSESSMENT_NO_NOT_FOUND);
errorDetails.setErrorMessage(THIRD_PARTY_ERR_MSG_ASSESSMENT_NO_NOT_FOUND);
} else if (accessmentnumber.trim().length() > 0 && accessmentnumber.trim().length() < 10) {
errorDetails = new ErrorDetails();
errorDetails.setErrorCode(THIRD_PARTY_ERR_CODE_ASSESSMENT_NO_LEN);
errorDetails.setErrorMessage(THIRD_PARTY_ERR_MSG_ASSESSMENT_NO_LEN);
} else if (basicProperty != null && basicProperty.isUnderWorkflow()) {
errorDetails = new ErrorDetails();
errorDetails.setErrorCode(THIRD_PARTY_ERR_CODE_PROPERTYTRANSFER_ALREADYINWORKFLOW);
errorDetails
.setErrorMessage(THIRD_PARTY_ERR_MSG_PROPERTYTRANSFER_ALREADYINWORKFLOW);
}
currentWaterTaxDue = propertyService.getWaterTaxDues(accessmentnumber);
Map<String, BigDecimal> propertyTaxDetails = propertyService.getCurrentPropertyTaxDetails(basicProperty
.getActiveProperty());
currentPropertyTaxDue = propertyTaxDetails.get(CURR_DMD_STR).subtract(
propertyTaxDetails.get(CURR_COLL_STR));
arrearPropertyTaxDue = propertyTaxDetails.get(ARR_DMD_STR).subtract(
propertyTaxDetails.get(ARR_COLL_STR));
if (currentWaterTaxDue.add(currentPropertyTaxDue).add(arrearPropertyTaxDue).longValue() > 0) {
errorDetails = new ErrorDetails();
errorDetails.setErrorCode(THIRD_PARTY_ERR_CODE_PROPERTYTRANSFER_TAXPENDING);
errorDetails.setErrorMessage(THIRD_PARTY_ERR_MSG_PROPERTYTRANSFER_TAXPENDING);
}
}
if (documentTypes != null) {
for (final DocumentType docTypes : documentTypes) {
if (docTypes.isMandatory()) {
if (docTypes.getName().equalsIgnoreCase(DOCUMENT_TYPE_ADDRESSPROOF)) {
if (!checkDocumentDetailsAvailable(DOCUMENT_TYPE_ADDRESSPROOF, formTransferDocument)) {
errorDetails = new ErrorDetails();
errorDetails
.setErrorCode(THIRD_PARTY_ERR_CODE_PROPERTYTRANSFER_REQUIREDDOCUMENTMISSING);
errorDetails
.setErrorMessage(THIRD_PARTY_ERR_MSG_PROPERTYTRANSFER_REQUIREDDOCUMENTMISSING
+ DOCUMENT_TYPE_ADDRESSPROOF);
break;
}
} else if (docTypes.getName().equalsIgnoreCase(DOCUMENT_TYPE_PROPERTYDOCUMENT)) {
if (!checkDocumentDetailsAvailable(DOCUMENT_TYPE_PROPERTYDOCUMENT, formTransferDocument)) {
errorDetails = new ErrorDetails();
errorDetails
.setErrorCode(THIRD_PARTY_ERR_CODE_PROPERTYTRANSFER_REQUIREDDOCUMENTMISSING);
errorDetails
.setErrorMessage(THIRD_PARTY_ERR_MSG_PROPERTYTRANSFER_REQUIREDDOCUMENTMISSING
+ DOCUMENT_TYPE_ADDRESSPROOF);
break;
}
}
if (docTypes.getName().equalsIgnoreCase(DOCUMENT_TYPE_DEEDISSUEDBYREVENUEDEPT)) {
if (!checkDocumentDetailsAvailable(DOCUMENT_TYPE_DEEDISSUEDBYREVENUEDEPT, formTransferDocument)) {
errorDetails = new ErrorDetails();
errorDetails
.setErrorCode(THIRD_PARTY_ERR_CODE_PROPERTYTRANSFER_REQUIREDDOCUMENTMISSING);
errorDetails
.setErrorMessage(THIRD_PARTY_ERR_MSG_PROPERTYTRANSFER_REQUIREDDOCUMENTMISSING
+ DOCUMENT_TYPE_ADDRESSPROOF);
break;
}
}
}
}
}
if (mutationMaster == null) {
errorDetails = new ErrorDetails();
errorDetails
.setErrorCode(THIRD_PARTY_ERR_CODE_PROPERTYTRANSFER_MUTATIONREASON_MANDATORY);
errorDetails
.setErrorMessage(THIRD_PARTY_ERR_MSG_PROPERTYTRANSFER_MUTATIONREASON_MANDATORY);
} else if (ownerDetailsList == null || ownerDetailsList.size() == 0) {
errorDetails = new ErrorDetails();
errorDetails
.setErrorCode(THIRD_PARTY_ERR_CODE_PROPERTYTRANSFER_TRANSFEREENAME_MANDATORY);
errorDetails
.setErrorMessage(THIRD_PARTY_ERR_MSG_PROPERTYTRANSFER_TRANSFEREENAME_MANDATORY);
} else if (ownerDetailsList != null && ownerDetailsList.size() > 0) {
for (OwnerDetails owner : ownerDetailsList) {
if (!StringUtils.isBlank(owner.getAadhaarNo())) {
try {
if (aadhaarInfoServiceClient.getAadhaarInfo(owner.getAadhaarNo()) != null) {
errorDetails = new ErrorDetails();
errorDetails
.setErrorCode(THIRD_PARTY_ERR_CODE_AADHAAR_NUMBER_NOTEXISTS);
errorDetails
.setErrorMessage(THIRD_PARTY_ERR_MSG_AADHAAR_NUMBER_NOTEXISTS
+ owner.getAadhaarNo());
}
} catch (Exception e) {
errorDetails = new ErrorDetails();
errorDetails.setErrorCode(THIRD_PARTY_ERR_CODE_AADHAAR_NUMBER_NOTEXISTS);
errorDetails.setErrorMessage(THIRD_PARTY_ERR_MSG_AADHAAR_NUMBER_NOTEXISTS
+ owner.getAadhaarNo());
}
} else if (StringUtils.isBlank(owner.getName())) {
errorDetails = new ErrorDetails();
errorDetails
.setErrorCode(THIRD_PARTY_ERR_CODE_PROPERTYTRANSFER_TRANSFEREE_NAMEMANDATORY);
errorDetails
.setErrorMessage(THIRD_PARTY_ERR_MSG_PROPERTYTRANSFER_TRANSFEREE_NAMEMANDATORY);
} else if (StringUtils.isBlank(owner.getMobileNumber())) {
errorDetails = new ErrorDetails();
errorDetails
.setErrorCode(THIRD_PARTY_ERR_CODE_PROPERTYTRANSFER_TRANSFEREE_MOBILENUMBERMANDATORY);
errorDetails
.setErrorMessage(THIRD_PARTY_ERR_MSG_PROPERTYTRANSFER_TRANSFEREE_MOBILENUMBERMANDATORY);
} else if (StringUtils.isBlank(owner.getGender())) {
errorDetails = new ErrorDetails();
errorDetails
.setErrorCode(THIRD_PARTY_ERR_CODE_PROPERTYTRANSFER_TRANSFEREE_GENDERMANDATORY);
errorDetails
.setErrorMessage(THIRD_PARTY_ERR_MSG_PROPERTYTRANSFER_TRANSFEREE_GENDERMANDATORY);
}
}
} else if (mutationReason == null || mutationReason.trim().length() == 0) {
errorDetails = new ErrorDetails();
errorDetails
.setErrorCode(THIRD_PARTY_ERR_CODE_PROPERTYTRANSFER_MUTATIONREASON_MANDATORY);
errorDetails
.setErrorMessage(THIRD_PARTY_ERR_MSG_PROPERTYTRANSFER_MUTATIONREASON_MANDATORY);
} else if (mutationReason != null && mutationReason.equalsIgnoreCase("SALE")
&& (saleDetail == null || saleDetail.trim().length() == 0)) {
errorDetails = new ErrorDetails();
errorDetails.setErrorCode(THIRD_PARTY_ERR_CODE_PROPERTYTRANSFER_SALEDETAIL_MANDATORY);
errorDetails
.setErrorMessage(THIRD_PARTY_ERR_MSG_PROPERTYTRANSFER_SALEDETAIL_MANDATORY);
} else if (deedNo == null || deedNo.trim().length() == 0) {
errorDetails = new ErrorDetails();
errorDetails
.setErrorCode(THIRD_PARTY_ERR_CODE_PROPERTYTRANSFER_MUTATIONDEEDNUMBER_MANDATORY);
errorDetails
.setErrorMessage(THIRD_PARTY_ERR_MSG_PROPERTYTRANSFER_MUTATIONDEEDNUMBER_MANDATORY);
} else if (deedDate == null || deedDate.trim().length() == 0) {
errorDetails = new ErrorDetails();
errorDetails
.setErrorCode(THIRD_PARTY_ERR_CODE_PROPERTYTRANSFER_MUTATIONRDEEDDATE_MANDATORY);
errorDetails
.setErrorMessage(THIRD_PARTY_ERR_MSG_PROPERTYTRANSFER_MUTATIONRDEEDDATE_MANDATORY);
}
return errorDetails;
}
/**
*
* @param documentTypeAddressproof
* @param formTransferDocument
* @return
*/
private boolean checkDocumentDetailsAvailable(String documentTypeAddressproof,
FormDataMultiPart formTransferDocument) {
if (formTransferDocument != null) {
if (documentTypeAddressproof != null
&& documentTypeAddressproof.equals(DOCUMENT_TYPE_ADDRESSPROOF)
&& (formTransferDocument.getFields("addressProofOfParties") == null || formTransferDocument
.getFields("addressProofOfParties").size() == 0)) {
return false;
} else if (documentTypeAddressproof != null
&& documentTypeAddressproof.equals(DOCUMENT_TYPE_PROPERTYDOCUMENT)
&& (formTransferDocument.getFields("attestedPropertyDocument") == null || formTransferDocument
.getFields("attestedPropertyDocument").size() == 0)) {
return false;
} else if (documentTypeAddressproof != null
&& documentTypeAddressproof.equals(DOCUMENT_TYPE_DEEDISSUEDBYREVENUEDEPT)
&& (formTransferDocument.getFields("titleDeedDocument") == null || formTransferDocument.getFields(
"titleDeedDocument").size() == 0)) {
return false;
}
}
return true;
}
/**
*
* @param obj
* @return
* @throws JsonGenerationException
* @throws JsonMappingException
* @throws IOException
*/
private String getJSONResponse(Object obj) throws JsonGenerationException, JsonMappingException, IOException {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(JsonMethod.FIELD, Visibility.ANY);
String jsonResponse = objectMapper.writeValueAsString(obj);
return jsonResponse;
}
/**
* This method is used to get the error details for invalid credentials.
*
* @return
*/
private ErrorDetails getInvalidCredentialsErrorDetails() {
ErrorDetails errorDetails = new ErrorDetails();
errorDetails.setErrorCode(THIRD_PARTY_ERR_CODE_INVALIDCREDENTIALS);
errorDetails.setErrorMessage(THIRD_PARTY_ERR_MSG_INVALIDCREDENTIALS);
return errorDetails;
}
public Boolean authenticateUser(String username, String password) {
Boolean isAuthenticated = false;
if (username != null && password != null && username.equals(USER_NAME) && password.equals(PASSWORD)) {
isAuthenticated = true;
}
return isAuthenticated;
}
}