/*
* Copyright (c) 2005-2011 Grameen Foundation USA
* All rights reserved.
*
* Licensed 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.
*
* See also http://www.apache.org/licenses/LICENSE-2.0.html for an
* explanation of the license and how it is applied.
*/
package org.mifos.customers.client.struts.action;
import static org.mifos.accounts.loan.util.helpers.LoanConstants.METHODCALLED;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.sql.Date;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.upload.FormFile;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.mifos.application.admin.servicefacade.InvalidDateException;
import org.mifos.application.master.business.SpouseFatherLookupEntity;
import org.mifos.application.meeting.business.MeetingBO;
import org.mifos.application.questionnaire.struts.DefaultQuestionnaireServiceFacadeLocator;
import org.mifos.application.questionnaire.struts.QuestionnaireAction;
import org.mifos.application.questionnaire.struts.QuestionnaireFlowAdapter;
import org.mifos.application.questionnaire.struts.QuestionnaireServiceFacadeLocator;
import org.mifos.application.servicefacade.ApplicationContextProvider;
import org.mifos.application.util.helpers.ActionForwards;
import org.mifos.application.util.helpers.YesNoFlag;
import org.mifos.config.ClientRules;
import org.mifos.config.util.helpers.HiddenMandatoryFieldNamesConstants;
import org.mifos.core.MifosRuntimeException;
import org.mifos.customers.business.CustomerBO;
import org.mifos.customers.center.util.helpers.CenterConstants;
import org.mifos.customers.client.business.ClientBO;
import org.mifos.customers.client.struts.actionforms.ClientCustActionForm;
import org.mifos.customers.client.util.helpers.ClientConstants;
import org.mifos.customers.exceptions.CustomerException;
import org.mifos.customers.group.util.helpers.GroupConstants;
import org.mifos.customers.struts.action.CustAction;
import org.mifos.customers.struts.uihelpers.CustomerUIHelperFn;
import org.mifos.customers.util.helpers.CustomerConstants;
import org.mifos.customers.util.helpers.CustomerStatus;
import org.mifos.dto.domain.AddressDto;
import org.mifos.dto.domain.ApplicableAccountFeeDto;
import org.mifos.dto.domain.ClientCreationDetail;
import org.mifos.dto.domain.ClientFamilyDetailsDto;
import org.mifos.dto.domain.ClientFamilyInfoUpdate;
import org.mifos.dto.domain.ClientMfiInfoUpdate;
import org.mifos.dto.domain.ClientPersonalInfoUpdate;
import org.mifos.dto.domain.ClientRulesDto;
import org.mifos.dto.domain.CustomFieldDto;
import org.mifos.dto.domain.CustomerDetailsDto;
import org.mifos.dto.domain.MeetingDto;
import org.mifos.dto.domain.ProcessRulesDto;
import org.mifos.dto.domain.SavingsDetailDto;
import org.mifos.dto.screen.ClientFamilyDetailDto;
import org.mifos.dto.screen.ClientFamilyInfoDto;
import org.mifos.dto.screen.ClientFormCreationDto;
import org.mifos.dto.screen.ClientInformationDto;
import org.mifos.dto.screen.ClientMfiInfoDto;
import org.mifos.dto.screen.ClientNameDetailDto;
import org.mifos.dto.screen.ClientPersonalDetailDto;
import org.mifos.dto.screen.ClientPersonalInfoDto;
import org.mifos.dto.screen.ClientPhotoDto;
import org.mifos.dto.screen.OnlyBranchOfficeHierarchyDto;
import org.mifos.dto.screen.UploadedFileDto;
import org.mifos.framework.business.util.Address;
import org.mifos.framework.components.fieldConfiguration.util.helpers.FieldConfig;
import org.mifos.framework.exceptions.ApplicationException;
import org.mifos.framework.exceptions.PageExpiredException;
import org.mifos.framework.image.domain.ClientPhoto;
import org.mifos.framework.image.service.ClientPhotoService;
import org.mifos.framework.util.helpers.CloseSession;
import org.mifos.framework.util.helpers.Constants;
import org.mifos.framework.util.helpers.DateUtils;
import org.mifos.framework.util.helpers.SessionUtils;
import org.mifos.framework.util.helpers.TransactionDemarcate;
import org.mifos.platform.questionnaire.service.InformationOrderServiceFacade;
import org.mifos.platform.questionnaire.service.QuestionGroupInstanceDetail;
import org.mifos.platform.questionnaire.service.QuestionnaireServiceFacade;
import org.mifos.security.util.ActivityMapper;
import org.mifos.security.util.SecurityConstants;
import org.mifos.security.util.UserContext;
public class ClientCustAction extends CustAction implements QuestionnaireAction {
private QuestionnaireServiceFacadeLocator questionnaireServiceFacadeLocator = new DefaultQuestionnaireServiceFacadeLocator();
private final QuestionnaireFlowAdapter createClientQuestionnaire = new QuestionnaireFlowAdapter("Create", "Client",
ActionForwards.next_success, "clientCustAction.do?method=cancel", questionnaireServiceFacadeLocator);
@TransactionDemarcate(saveToken = true)
public ActionForward chooseOffice(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
ClientCustActionForm actionForm = (ClientCustActionForm) form;
actionForm.setGroupFlag(ClientConstants.NO);
OnlyBranchOfficeHierarchyDto officeHierarchy = customerServiceFacade.retrieveBranchOnlyOfficeHierarchy();
SessionUtils.setAttribute(OnlyBranchOfficeHierarchyDto.IDENTIFIER, officeHierarchy, request);
return mapping.findForward(ActionForwards.chooseOffice_success.toString());
}
@TransactionDemarcate(saveToken = true)
public ActionForward load(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
ClientCustActionForm actionForm = (ClientCustActionForm) form;
UserContext userContext = getUserContext(request);
actionForm.clearMostButNotAllFieldsOnActionForm();
SessionUtils.removeAttribute(CustomerConstants.CUSTOMER_MEETING, request);
Short officeId = actionForm.getOfficeIdValue();
String officeName = actionForm.getOfficeName();
Short groupFlag = actionForm.getGroupFlagValue();
String parentGroupId = actionForm.getParentGroupId();
ClientFormCreationDto clientFormCreationDto = this.clientServiceFacade.retrieveClientFormCreationData(groupFlag, officeId, parentGroupId);
if (clientFormCreationDto.getFormedByPersonnelId() != null) {
actionForm.setFormedByPersonnel(clientFormCreationDto.getFormedByPersonnelId().toString());
MeetingBO groupMeeting = customerDao.findCustomerById(Integer.valueOf(parentGroupId)).getCustomerMeetingValue();
clientFormCreationDto.getParentCustomerMeeting().setMeetingSchedule(CustomerUIHelperFn.getMeetingSchedule(groupMeeting, userContext));
SessionUtils.setAttribute("meeting", clientFormCreationDto.getParentCustomerMeeting(), request);
}
actionForm.setCenterDisplayName(clientFormCreationDto.getCenterDisplayName());
actionForm.setGroupDisplayName(clientFormCreationDto.getGroupDisplayName());
actionForm.setOfficeId(clientFormCreationDto.getOfficeId().toString());
actionForm.setOfficeName(officeName);
if (clientFormCreationDto.getFormedByPersonnelId() != null) {
actionForm.setLoanOfficerId(clientFormCreationDto.getFormedByPersonnelId().toString());
}
actionForm.setLoanOfficerName(clientFormCreationDto.getFormedByPersonnelName());
actionForm.setCustomFields(new ArrayList<CustomFieldDto>());
List<ApplicableAccountFeeDto> defaultFees = clientFormCreationDto.getDefaultFees();
actionForm.setDefaultFees(defaultFees);
List<ApplicableAccountFeeDto> additionalFees = clientFormCreationDto.getAdditionalFees();
SessionUtils.setCollectionAttribute(CustomerConstants.ADDITIONAL_FEES_LIST, additionalFees, request);
List<SpouseFatherLookupEntity> spouseFather = legacyMasterDao.findMasterDataEntitiesWithLocale(SpouseFatherLookupEntity.class);
SessionUtils.setCollectionAttribute(ClientConstants.SPOUSE_FATHER_ENTITY, spouseFather, request);
SessionUtils.setCollectionAttribute(ClientConstants.SALUTATION_ENTITY, clientFormCreationDto.getClientDropdowns().getSalutations(), request);
SessionUtils.setCollectionAttribute(ClientConstants.GENDER_ENTITY, clientFormCreationDto.getClientDropdowns().getGenders(), request);
SessionUtils.setCollectionAttribute(ClientConstants.MARITAL_STATUS_ENTITY, clientFormCreationDto.getClientDropdowns().getMaritalStatuses(), request);
SessionUtils.setCollectionAttribute(ClientConstants.CITIZENSHIP_ENTITY, clientFormCreationDto.getClientDropdowns().getCitizenship(), request);
SessionUtils.setCollectionAttribute(ClientConstants.ETHNICITY_ENTITY, clientFormCreationDto.getClientDropdowns().getEthnicity(), request);
SessionUtils.setCollectionAttribute(ClientConstants.EDUCATION_LEVEL_ENTITY, clientFormCreationDto.getClientDropdowns().getEducationLevels(), request);
SessionUtils.setCollectionAttribute(ClientConstants.BUSINESS_ACTIVITIES_ENTITY, clientFormCreationDto.getClientDropdowns().getBusinessActivity(), request);
SessionUtils.setCollectionAttribute(ClientConstants.POVERTY_STATUS, clientFormCreationDto.getClientDropdowns().getPoverty(), request);
SessionUtils.setCollectionAttribute(ClientConstants.HANDICAPPED_ENTITY, clientFormCreationDto.getClientDropdowns().getHandicapped(), request);
SessionUtils.setCollectionAttribute(CustomerConstants.CUSTOM_FIELDS_LIST, new ArrayList<CustomFieldDto>(), request);
SessionUtils.setCollectionAttribute(CustomerConstants.LOAN_OFFICER_LIST, clientFormCreationDto.getPersonnelList(), request);
SessionUtils.setCollectionAttribute(CustomerConstants.FORMEDBY_LOAN_OFFICER_LIST, clientFormCreationDto.getFormedByPersonnelList(), request);
SessionUtils.setCollectionAttribute(ClientConstants.SAVINGS_OFFERING_LIST, clientFormCreationDto.getSavingsOfferings(), request);
SessionUtils.setAttribute(GroupConstants.CENTER_HIERARCHY_EXIST, ClientRules.getCenterHierarchyExists(), request);
SessionUtils.setAttribute(ClientConstants.MAXIMUM_NUMBER_OF_FAMILY_MEMBERS, ClientRules.getMaximumNumberOfFamilyMembers(), request);
InformationOrderServiceFacade informationOrderServiceFacade = ApplicationContextProvider.getBean(InformationOrderServiceFacade.class);
SessionUtils.setCollectionAttribute("personalInformationOrder", informationOrderServiceFacade.getInformationOrder("CreateClient"), request);
boolean isFamilyDetailsRequired = ClientRules.isFamilyDetailsRequired();
SessionUtils.setAttribute(ClientConstants.ARE_FAMILY_DETAILS_REQUIRED, isFamilyDetailsRequired, request);
if (isFamilyDetailsRequired) {
boolean isFamilyDetailsMandatory = isFamilyDetailsMandatory();
if (!isFamilyDetailsMandatory) {
actionForm.removeFamilyMember(0);
}
SessionUtils.setAttribute(ClientConstants.ARE_FAMILY_DETAILS_MANDATORY, isFamilyDetailsMandatory, request);
SessionUtils.setAttribute(ClientConstants.ARE_FAMILY_DETAILS_HIDDEN, false, request);
} else {
SessionUtils.setAttribute(ClientConstants.ARE_FAMILY_DETAILS_MANDATORY, isSpouseFatherInformationMandatory(), request);
SessionUtils.setAttribute(ClientConstants.ARE_FAMILY_DETAILS_HIDDEN, isSpouseFatherInformationHidden(), request);
}
return mapping.findForward(ActionForwards.load_success.toString());
}
@TransactionDemarcate(joinToken = true)
public ActionForward addFile(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
ClientCustActionForm actionForm = (ClientCustActionForm) form;
FormFile file = actionForm.getSelectedFile();
String fileName = actionForm.getSelectedFile().getFileName();
String fileContentType = actionForm.getSelectedFile().getContentType();
Integer fileSize = actionForm.getSelectedFile().getFileSize();
String fileDescription = actionForm.getSelectedFileDescription();
if (file != null) {
actionForm.getFiles().add(file);
actionForm.getFilesMetadata().add(
new UploadedFileDto(fileName, fileContentType, fileSize, fileDescription));
}
return mapping.findForward(ActionForwards.load_success.toString());
}
@TransactionDemarcate(joinToken = true)
public ActionForward deleteFile(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
ClientCustActionForm actionForm = (ClientCustActionForm) form;
String fileName = request.getParameter("fileName");
if (fileName != null) {
int index = 0;
for(FormFile formFile : actionForm.getFiles()) {
if (formFile.getFileName().equals(fileName)) {
index = actionForm.getFiles().indexOf(formFile);
break;
}
}
if (index >= 0) {
actionForm.getFiles().remove(index);
actionForm.getFilesMetadata().remove(index);
}
}
return mapping.findForward(ActionForwards.load_success.toString());
}
@TransactionDemarcate(joinToken = true)
public ActionForward next(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
ClientCustActionForm actionForm = (ClientCustActionForm) form;
ClientFamilyDetailsDto clientFamilyDetails = this.clientServiceFacade.retrieveClientFamilyDetails();
if (clientFamilyDetails.isFamilyDetailsRequired()) {
SessionUtils.setCollectionAttribute(ClientConstants.LIVING_STATUS_ENTITY, clientFamilyDetails.getLivingStatus(), request);
SessionUtils.setCollectionAttribute(ClientConstants.GENDER_ENTITY, clientFamilyDetails.getGenders(), request);
actionForm.setFamilyDetailBean(clientFamilyDetails.getFamilyDetails());
return mapping.findForward(ActionForwards.next_success_family.toString());
}
return createClientQuestionnaire.fetchAppliedQuestions(mapping, actionForm, request, ActionForwards.next_success);
}
@TransactionDemarcate(joinToken = true)
public ActionForward familyInfoNext(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
ClientCustActionForm actionForm = (ClientCustActionForm) form;
actionForm.setFamilyDateOfBirth();
actionForm.constructFamilyDetails();
return createClientQuestionnaire.fetchAppliedQuestions(mapping, actionForm, request, ActionForwards.next_success);
}
@TransactionDemarcate(joinToken = true)
public ActionForward addFamilyRow(ActionMapping mapping, ActionForm form,
@SuppressWarnings("unused") HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
ClientCustActionForm actionForm = (ClientCustActionForm) form;
if (actionForm.getFamilyNames().size() < ClientRules.getMaximumNumberOfFamilyMembers()) {
actionForm.addFamilyMember();
}
return mapping.findForward(ActionForwards.addFamilyRow_success.toString());
}
@TransactionDemarcate(joinToken = true)
public ActionForward deleteFamilyRow(ActionMapping mapping, ActionForm form,
@SuppressWarnings("unused") HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
ClientCustActionForm actionForm = (ClientCustActionForm) form;
if (Integer.parseInt(actionForm.getDeleteThisRow()) < actionForm.getFamilyFirstName().size()) {
actionForm.removeFamilyMember(Integer.parseInt(actionForm.getDeleteThisRow()));
}
return mapping.findForward(ActionForwards.addFamilyRow_success.toString());
}
@TransactionDemarcate(joinToken = true)
public ActionForward editAddFamilyRow(ActionMapping mapping, ActionForm form,
@SuppressWarnings("unused") HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
ClientCustActionForm actionForm = (ClientCustActionForm) form;
if (actionForm.getFamilyNames().size() < ClientRules.getMaximumNumberOfFamilyMembers()) {
actionForm.addFamilyMember();
}
return mapping.findForward(ActionForwards.editAddFamilyRow_success.toString());
}
@TransactionDemarcate(joinToken = true)
public ActionForward editDeleteFamilyRow(ActionMapping mapping, ActionForm form,
@SuppressWarnings("unused") HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
ClientCustActionForm actionForm = (ClientCustActionForm) form;
if (Integer.parseInt(actionForm.getDeleteThisRow()) < actionForm.getFamilyFirstName().size()) {
actionForm.removeFamilyMember(Integer.parseInt(actionForm.getDeleteThisRow()));
}
return mapping.findForward(ActionForwards.editAddFamilyRow_success.toString());
}
@TransactionDemarcate(joinToken = true)
public ActionForward preview(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
ClientCustActionForm actionForm = (ClientCustActionForm) form;
String governmentId = actionForm.getGovernmentId();
ClientNameDetailDto clientNameDetail = actionForm.getClientName();
clientNameDetail.setNames(ClientRules.getNameSequence());
String clientName = clientNameDetail.getDisplayName();
String givenDateOfBirth = actionForm.getDateOfBirth();
ClientNameDetailDto spouseName = actionForm.getSpouseName();
spouseName.setNames(ClientRules.getNameSequence());
DateTime dateOfBirth = new DateTime(DateUtils.getDateAsSentFromBrowser(givenDateOfBirth));
ProcessRulesDto processRules = this.clientServiceFacade.previewClient(governmentId, dateOfBirth, clientName, actionForm.isDefaultFeeRemoved(), actionForm.getOfficeIdValue(), actionForm.getLoanOfficerIdValue());
String pendingApprovalState = processRules.isClientPendingApprovalStateEnabled() ? CustomerConstants.YES : CustomerConstants.NO;
SessionUtils.setAttribute(CustomerConstants.PENDING_APPROVAL_DEFINED, pendingApprovalState, request);
Short officeId = actionForm.getOfficeIdValue();
Short groupFlag = actionForm.getGroupFlagValue();
String parentGroupId = actionForm.getParentGroupId();
ClientFormCreationDto clientFormCreationDto = this.clientServiceFacade.retrieveClientFormCreationData(groupFlag, officeId, parentGroupId);
InformationOrderServiceFacade informationOrderServiceFacade = ApplicationContextProvider.getBean(InformationOrderServiceFacade.class);
SessionUtils.setCollectionAttribute("personalInformationOrder", informationOrderServiceFacade.getInformationOrder("CreateClient"), request);
if (clientFormCreationDto.getFormedByPersonnelId() != null) {
UserContext userContext = getUserContext(request);
MeetingBO groupMeeting = customerDao.findCustomerById(Integer.valueOf(parentGroupId)).getCustomerMeetingValue();
clientFormCreationDto.getParentCustomerMeeting().setMeetingSchedule(CustomerUIHelperFn.getMeetingSchedule(groupMeeting, userContext));
SessionUtils.setAttribute("meeting", clientFormCreationDto.getParentCustomerMeeting(), request);
}
addWarningMessages(request, processRules,calculateAge(DateUtils.getDateAsSentFromBrowser(givenDateOfBirth)));
actionForm.setEditFamily("edit");
actionForm.setAge(calculateAge(DateUtils.getDateAsSentFromBrowser(givenDateOfBirth)));
actionForm.setClientName(clientNameDetail);
actionForm.setSpouseName(spouseName);
return mapping.findForward(ActionForwards.preview_success.toString());
}
private void addWarningMessages(HttpServletRequest request, ProcessRulesDto processRules, int age)
throws PageExpiredException {
SessionUtils.removeAttribute("processRules", request);
if (processRules.isGovernmentIdValidationFailing()) {
SessionUtils.addWarningMessage(request, CustomerConstants.CLIENT_WITH_SAME_GOVT_ID_EXIST_IN_CLOSED);
SessionUtils.setAttribute("processRules", processRules, request);
}
if (processRules.isDuplicateNameOnBlackListedClient()) {
SessionUtils.addWarningMessage(request, CustomerConstants.CLIENT_WITH_SAME_NAME_DOB_EXIST_IN_BLACKLISTED);
SessionUtils.setAttribute("processRules", processRules, request);
}
if (processRules.isDuplicateNameOnClosedClient()) {
SessionUtils.addWarningMessage(request, CustomerConstants.CLIENT_WITH_SAME_NAME_DOB_EXIST_IN_CLOSED);
SessionUtils.setAttribute("processRules", processRules, request);
}
if (processRules.isGovermentIdValidationUnclosedFailing()) {
SessionUtils.addWarningMessage(request, CustomerConstants.CLIENT_WITH_SAME_GOVT_ID_EXIST_IN_UNCLOSED);
SessionUtils.setAttribute("processRules", processRules, request);
}
if (processRules.isduplicateNameOnClient()) {
SessionUtils.addWarningMessage(request, CustomerConstants.CLIENT_WITH_SAME_NAME_EXIST);
SessionUtils.setAttribute("processRules", processRules, request);
}
if(ClientRules.isAgeCheckEnabled()&&ClientRules.isAgeCheckWarningInsteadOfErrorEnabled()) {
if(age > ClientRules.getMaximumAgeForNewClient() || age< ClientRules.getMinimumAgeForNewClient()){
SessionUtils.addWarningMessage(request, new ActionMessage(CustomerConstants.CLIENT_AGE_OUT_OF_BOUNDS
,ClientRules.getMinimumAgeForNewClient()
,ClientRules.getMaximumAgeForNewClient()));
}
}
}
public ActionForward cancel(ActionMapping mapping, ActionForm form,
@SuppressWarnings("unused") HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
String forward = null;
ClientCustActionForm actionForm = (ClientCustActionForm) form;
String fromPage = actionForm.getInput();
if (ClientConstants.INPUT_PERSONAL_INFO.equals(fromPage) || ClientConstants.INPUT_MFI_INFO.equals(fromPage)
|| CenterConstants.INPUT_CREATE.equals(fromPage)) {
actionForm.setEditFamily("notEdit");
forward = ActionForwards.cancelCreate_success.toString();
} else if (ClientConstants.INPUT_EDIT_PERSONAL_INFO.equals(fromPage)
|| ClientConstants.INPUT_EDIT_MFI_INFO.equals(fromPage)
|| ClientConstants.INPUT_EDIT_FAMILY_INFO.equals(fromPage)) {
forward = ActionForwards.cancelEdit_success.toString();
}
return mapping.findForward(forward);
}
public ActionForward editPreviewEditFamilyInfo(ActionMapping mapping, @SuppressWarnings("unused") ActionForm form,
@SuppressWarnings("unused") HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
return mapping.findForward(ActionForwards.editPreviewEditFamilyInfo_success.toString());
}
@TransactionDemarcate(joinToken = true)
public ActionForward retrievePictureOnPreview(ActionMapping mapping, ActionForm form,
@SuppressWarnings("unused") HttpServletRequest request, HttpServletResponse response) throws Exception {
ClientCustActionForm actionForm = (ClientCustActionForm) form;
InputStream in = actionForm.getPicture().getInputStream();
in.mark(0);
response.setContentType("image/jpeg");
BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
byte[] by = new byte[1024 * 4]; // 4K buffer buf, 0, buf.length
int index = in.read(by, 0, 1024 * 4);
while (index != -1) {
out.write(by, 0, index);
index = in.read(by, 0, 1024 * 4);
}
out.flush();
out.close();
in.reset();
String forward = ClientConstants.CUSTOMER_PICTURE_PAGE;
return mapping.findForward(forward);
}
@TransactionDemarcate(joinToken = true)
public ActionForward retrievePicture(ActionMapping mapping, @SuppressWarnings("unused") ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
ClientBO clientBO = getClientFromSession(request);
ClientPhotoService cps = ApplicationContextProvider.getBean(ClientPhotoService.class);
ClientPhoto cp = cps.read(clientBO.getCustomerId().longValue());
InputStream in = null;
if(cp != null) {
in = new ByteArrayInputStream(cps.getData(cp));
response.setContentType(cp.getImageInfo().getContentType());
} else {
in = ClientPhotoService.class.getResourceAsStream("/org/mifos/image/nopicture.png");
response.setContentType("image/png");
}
in.mark(0);
BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
byte[] by = new byte[1024 * 4]; // 4K buffer buf, 0, buf.length
int index = in.read(by, 0, 1024 * 4);
while (index != -1) {
out.write(by, 0, index);
index = in.read(by, 0, 1024 * 4);
}
out.flush();
out.close();
in.reset();
String forward = ClientConstants.CUSTOMER_PICTURE_PAGE;
return mapping.findForward(forward);
}
@TransactionDemarcate(joinToken = true)
public ActionForward previewPersonalInfo(ActionMapping mapping, ActionForm form,
@SuppressWarnings("unused") HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
ClientCustActionForm actionForm = (ClientCustActionForm) form;
actionForm.setAge(calculateAge(DateUtils.getDateAsSentFromBrowser(actionForm.getDateOfBirth())));
String governmentId = actionForm.getGovernmentId();
ClientNameDetailDto clientNameDetail = actionForm.getClientName();
clientNameDetail.setNames(ClientRules.getNameSequence());
String clientName = clientNameDetail.getDisplayName();
String givenDateOfBirth = actionForm.getDateOfBirth();
ClientNameDetailDto spouseName = actionForm.getSpouseName();
spouseName.setNames(ClientRules.getNameSequence());
DateTime dateOfBirth = new DateTime(DateUtils.getDateAsSentFromBrowser(givenDateOfBirth));
ProcessRulesDto processRules = this.clientServiceFacade.previewClient(governmentId,
dateOfBirth, clientName, actionForm.isDefaultFeeRemoved(), actionForm.getOfficeIdValue(), actionForm.getLoanOfficerIdValue());
addWarningMessages(request, processRules,calculateAge(DateUtils.getDateAsSentFromBrowser(actionForm.getDateOfBirth())));
return mapping.findForward(ActionForwards.previewPersonalInfo_success.toString());
}
@TransactionDemarcate(joinToken = true)
public ActionForward prevFamilyInfo(ActionMapping mapping, @SuppressWarnings("unused") ActionForm form,
@SuppressWarnings("unused") HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse httpservletresponse) throws Exception {
return mapping.findForward(ActionForwards.prevFamilyInfo_success.toString());
}
@TransactionDemarcate(joinToken = true)
public ActionForward prevFamilyInfoNext(ActionMapping mapping, ActionForm form,
@SuppressWarnings("unused") HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse httpservletresponse) throws Exception {
ClientCustActionForm actionForm = (ClientCustActionForm) form;
actionForm.setFamilyDateOfBirth();
actionForm.constructFamilyDetails();
return mapping.findForward(ActionForwards.prevFamilyInfoNext_success.toString());
}
@TransactionDemarcate(joinToken = true)
public ActionForward prevPersonalInfo(ActionMapping mapping, @SuppressWarnings("unused") ActionForm form,
@SuppressWarnings("unused") HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse httpservletresponse) throws Exception {
return mapping.findForward(ActionForwards.prevPersonalInfo_success.toString());
}
@TransactionDemarcate(joinToken = true)
public ActionForward prevMFIInfo(ActionMapping mapping, @SuppressWarnings("unused") ActionForm form,
@SuppressWarnings("unused") HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse httpservletresponse) throws Exception {
return mapping.findForward(ActionForwards.prevMFIInfo_success.toString());
}
@TransactionDemarcate(joinToken = true)
public ActionForward prevMeeting(ActionMapping mapping, @SuppressWarnings("unused") ActionForm form,
@SuppressWarnings("unused") HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
return mapping.findForward(ActionForwards.next_success.toString());
}
@TransactionDemarcate(joinToken = true)
public ActionForward loadMeeting(ActionMapping mapping, @SuppressWarnings("unused") ActionForm form,
@SuppressWarnings("unused") HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
return mapping.findForward(ActionForwards.loadMeeting_success.toString());
}
@TransactionDemarcate(validateAndResetToken = true)
public ActionForward create(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
ClientCustActionForm actionForm = (ClientCustActionForm) form;
MeetingBO meeting = (MeetingBO) SessionUtils.getAttribute(CustomerConstants.CUSTOMER_MEETING, request);
List<SavingsDetailDto> allowedSavingProducts = getSavingsOfferingsFromSession(request);
if (ClientRules.isFamilyDetailsRequired()) {
actionForm.setFamilyDateOfBirth();
actionForm.constructFamilyDetails();
}
List<Short> selectedSavingProducts = actionForm.getSelectedOfferings();
String clientName = actionForm.getClientName().getDisplayName();
Short clientStatus = actionForm.getStatusValue().getValue();
java.sql.Date mfiJoiningDate = DateUtils.getDateAsSentFromBrowser(actionForm.getMfiJoiningDate());
String externalId = actionForm.getExternalId();
AddressDto address = null;
if (actionForm.getAddress() != null) {
address = Address.toDto(actionForm.getAddress());
}
Short formedBy = actionForm.getFormedByPersonnelValue();
java.sql.Date dateOfBirth = DateUtils.getDateAsSentFromBrowser(actionForm.getDateOfBirth());
String governmentId = actionForm.getGovernmentId();
boolean trained = isTrained(actionForm.getTrainedValue());
java.sql.Date trainedDate = DateUtils.getDateAsSentFromBrowser(actionForm.getTrainedDate());
Short groupFlagValue = actionForm.getGroupFlagValue();
ClientNameDetailDto clientNameDetailDto = actionForm.getClientName();
ClientPersonalDetailDto clientPersonalDetailDto = actionForm.getClientDetailView();
ClientNameDetailDto spouseFatherName = actionForm.getSpouseName();
InputStream picture = actionForm.getCustomerPicture();
String parentGroupId = actionForm.getParentGroupId();
List<ClientNameDetailDto> familyNames = actionForm.getFamilyNames();
List<ClientFamilyDetailDto> familyDetails = actionForm.getFamilyDetails();
Short loanOfficerId = actionForm.getLoanOfficerIdValue();
Short officeId = actionForm.getOfficeIdValue();
// only applies when status is active
LocalDate activationDateAsToday = new LocalDate();
ClientCreationDetail clientCreationDetail = new ClientCreationDetail(selectedSavingProducts, clientName, clientStatus, mfiJoiningDate, externalId,
address, formedBy, dateOfBirth, governmentId, trained, trainedDate, groupFlagValue, clientNameDetailDto, clientPersonalDetailDto, spouseFatherName,
picture, actionForm.getFeesToApply(), parentGroupId, familyNames, familyDetails, loanOfficerId, officeId, activationDateAsToday);
MeetingDto meetingDto = null;
if (meeting != null) {
meetingDto = meeting.toDto();
}
CustomerDetailsDto clientDetails = this.clientServiceFacade.createNewClient(clientCreationDetail, meetingDto,
allowedSavingProducts);
List<FormFile> formFiles = actionForm.getFiles();
List<UploadedFileDto> filesMetadata = actionForm.getFilesMetadata();
for(int i=0; i<formFiles.size(); i++)
{
if (formFiles.get(i).getFileSize() != 0) {
InputStream inputStream = formFiles.get(i).getInputStream();
UploadedFileDto fileMetadata = filesMetadata.get(i);
clientServiceFacade.uploadFile(clientDetails.getId(), inputStream, fileMetadata);
}
}
actionForm.setCustomerId(clientDetails.getId().toString());
actionForm.setGlobalCustNum(clientDetails.getGlobalCustNum());
actionForm.setEditFamily("notEdit");
createClientQuestionnaire.saveResponses(request, actionForm, clientDetails.getId());
return mapping.findForward(ActionForwards.create_success.toString());
}
private boolean isTrained(Short trainedValue) {
return Short.valueOf("1").equals(trainedValue);
}
@TransactionDemarcate(joinToken = true)
public ActionForward validate(ActionMapping mapping, @SuppressWarnings("unused") ActionForm form,
HttpServletRequest request, @SuppressWarnings("unused") HttpServletResponse response) throws Exception {
String method = (String) request.getAttribute("methodCalled");
return mapping.findForward(method + "_failure");
}
@TransactionDemarcate(saveToken = true)
public ActionForward get(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
String clientSystemId = ((ClientCustActionForm) form).getGlobalCustNum();
ClientInformationDto clientInformationDto;
try {
clientInformationDto = clientServiceFacade.getClientInformationDto(clientSystemId);
}
catch (MifosRuntimeException e) {
if (e.getCause() instanceof ApplicationException) {
throw (ApplicationException) e.getCause();
}
throw e;
}
// John W - for breadcrumb or another other action downstream that exists business_key set (until refactored)
ClientBO clientBO = (ClientBO) this.customerDao.findCustomerById(clientInformationDto.getClientDisplay().getCustomerId());
SessionUtils.removeThenSetAttribute(Constants.BUSINESS_KEY, clientBO, request);
SessionUtils.setAttribute(ClientConstants.IS_PHOTO_FIELD_HIDDEN, FieldConfig.getInstance().isFieldHidden("Client.Photo"), request);
setCurrentPageUrl(request, clientBO);
setQuestionGroupInstances(request, clientBO);
InformationOrderServiceFacade informationOrderServiceFacade = ApplicationContextProvider.getBean(InformationOrderServiceFacade.class);
SessionUtils.removeThenSetAttribute("clientInformationDto", clientInformationDto, request);
request.getSession().setAttribute("guarantyClientInformation" , loanAccountServiceFacade.retrieveGuarantyClientInformation(clientInformationDto));
QuestionnaireServiceFacade questionnaireServiceFacade = questionnaireServiceFacadeLocator.getService(request);
List<QuestionGroupInstanceDetail> questions = new ArrayList<QuestionGroupInstanceDetail>();
questions.addAll(questionnaireServiceFacade.getQuestionGroupInstancesWithUnansweredQuestionGroups(clientInformationDto.getClientDisplay().getCustomerId(), "Create", "Client"));
questions.addAll(questionnaireServiceFacade.getQuestionGroupInstancesWithUnansweredQuestionGroups(clientInformationDto.getClientDisplay().getCustomerId(), "View", "Client"));
questions.addAll(questionnaireServiceFacade.getQuestionGroupInstancesWithUnansweredQuestionGroups(clientInformationDto.getClientDisplay().getCustomerId(), "Close", "Client"));
SessionUtils.setCollectionAttribute("questionGroups", questions, request);
SessionUtils.setCollectionAttribute("personalInformationOrder", informationOrderServiceFacade.getInformationOrder("Client"), request);
return mapping.findForward(ActionForwards.get_success.toString());
}
private void setQuestionGroupInstances(HttpServletRequest request, ClientBO clientBO) throws PageExpiredException {
QuestionnaireServiceFacade questionnaireServiceFacade = questionnaireServiceFacadeLocator.getService(request);
boolean containsQGForCloseClient = false;
if (questionnaireServiceFacade != null) {
setQuestionGroupInstances(questionnaireServiceFacade, request, clientBO.getCustomerId());
if (clientBO.getCustomerStatus().getId().equals(CustomerStatus.CLIENT_CLOSED.getValue())) {
containsQGForCloseClient = questionnaireServiceFacade.getQuestionGroupInstances(clientBO.getCustomerId(), "Close", "Client").size() > 0;
}
}
SessionUtils.removeThenSetAttribute("containsQGForCloseClient", containsQGForCloseClient, request);
}
// Intentionally made public to aid testing !
public void setQuestionGroupInstances(QuestionnaireServiceFacade questionnaireServiceFacade, HttpServletRequest request, Integer customerId) throws PageExpiredException {
List<QuestionGroupInstanceDetail> instanceDetails = questionnaireServiceFacade.getQuestionGroupInstances(customerId, "View", "Client");
SessionUtils.setCollectionAttribute("questionGroupInstances", instanceDetails, request);
}
private void setCurrentPageUrl(HttpServletRequest request, ClientBO clientBO) throws PageExpiredException, UnsupportedEncodingException {
SessionUtils.removeThenSetAttribute("currentPageUrl", constructCurrentPageUrl(request, clientBO), request);
}
private String constructCurrentPageUrl(HttpServletRequest request, CustomerBO clientBO) throws UnsupportedEncodingException {
String officerId = request.getParameter("recordOfficeId");
String loanOfficerId = request.getParameter("recordLoanOfficerId");
String url = String.format("clientCustAction.do?globalCustNum=%s&recordOfficeId=%s&recordLoanOfficerId=%s",
clientBO.getGlobalCustNum(), officerId, loanOfficerId);
return url;
}
@TransactionDemarcate(joinToken = true)
public ActionForward showPicture(ActionMapping mapping, @SuppressWarnings("unused") ActionForm form,
@SuppressWarnings("unused") HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
String forward = ClientConstants.CUSTOMER_PICTURE_PAGE;
return mapping.findForward(forward);
}
@TransactionDemarcate(joinToken = true)
public ActionForward editPersonalInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
ClientCustActionForm actionForm = (ClientCustActionForm) form;
actionForm.clearMostButNotAllFieldsOnActionForm();
ClientBO clientFromSession = getClientFromSession(request);
final String clientSystemId = clientFromSession.getGlobalCustNum();
ClientBO client = this.customerDao.findClientBySystemId(clientSystemId);
short loanOfficerId = client.getCreatedBy();
String clientStatus = client.getCustomerStatus().getName();
ClientPersonalInfoDto personalInfo = this.clientServiceFacade.retrieveClientPersonalInfoForUpdate(clientSystemId, clientStatus, loanOfficerId);
SessionUtils.setCollectionAttribute(ClientConstants.SALUTATION_ENTITY, personalInfo.getClientDropdowns().getSalutations(), request);
SessionUtils.setCollectionAttribute(ClientConstants.GENDER_ENTITY, personalInfo.getClientDropdowns().getGenders(), request);
SessionUtils.setCollectionAttribute(ClientConstants.MARITAL_STATUS_ENTITY, personalInfo.getClientDropdowns().getMaritalStatuses(), request);
SessionUtils.setCollectionAttribute(ClientConstants.CITIZENSHIP_ENTITY, personalInfo.getClientDropdowns().getCitizenship(), request);
SessionUtils.setCollectionAttribute(ClientConstants.ETHNICITY_ENTITY, personalInfo.getClientDropdowns().getEthnicity(), request);
SessionUtils.setCollectionAttribute(ClientConstants.EDUCATION_LEVEL_ENTITY, personalInfo.getClientDropdowns().getEducationLevels(), request);
SessionUtils.setCollectionAttribute(ClientConstants.BUSINESS_ACTIVITIES_ENTITY, personalInfo.getClientDropdowns().getBusinessActivity(), request);
SessionUtils.setCollectionAttribute(ClientConstants.POVERTY_STATUS, personalInfo.getClientDropdowns().getPoverty(), request);
SessionUtils.setCollectionAttribute(ClientConstants.HANDICAPPED_ENTITY, personalInfo.getClientDropdowns().getHandicapped(), request);
UserContext userContext = getUserContext(request);
List<SpouseFatherLookupEntity> spouseFather = legacyMasterDao.findMasterDataEntitiesWithLocale(SpouseFatherLookupEntity.class);
SessionUtils.setCollectionAttribute(ClientConstants.SPOUSE_FATHER_ENTITY, spouseFather, request);
SessionUtils.setAttribute("CanEditPhoneNumber", ActivityMapper.getInstance().isEditPhoneNumberPermitted(userContext, userContext.getBranchId()), request);
InformationOrderServiceFacade informationOrderServiceFacade = ApplicationContextProvider.getBean(InformationOrderServiceFacade.class);
SessionUtils.setCollectionAttribute("personalInformationOrder", informationOrderServiceFacade.getInformationOrder("CreateClient"), request);
boolean isFamilyDetailsRequired = personalInfo.getClientRules().isFamilyDetailsRequired();
SessionUtils.setAttribute(ClientConstants.ARE_FAMILY_DETAILS_REQUIRED, isFamilyDetailsRequired, request);
if (isFamilyDetailsRequired) {
SessionUtils.setAttribute(ClientConstants.ARE_FAMILY_DETAILS_MANDATORY, isFamilyDetailsMandatory(), request);
SessionUtils.setAttribute(ClientConstants.ARE_FAMILY_DETAILS_HIDDEN, false, request);
} else {
SessionUtils.setAttribute(ClientConstants.ARE_FAMILY_DETAILS_MANDATORY, isSpouseFatherInformationMandatory(), request);
SessionUtils.setAttribute(ClientConstants.ARE_FAMILY_DETAILS_HIDDEN, isSpouseFatherInformationHidden(), request);
}
SessionUtils.setCollectionAttribute(CustomerConstants.CUSTOM_FIELDS_LIST, new ArrayList<CustomFieldDto>(), request);
// customer specific
actionForm.setCustomerId(personalInfo.getCustomerDetail().getCustomerId().toString());
actionForm.setLoanOfficerId(personalInfo.getCustomerDetail().getLoanOfficerIdAsString());
actionForm.setGlobalCustNum(personalInfo.getCustomerDetail().getGlobalCustNum());
actionForm.setExternalId(personalInfo.getCustomerDetail().getExternalId());
actionForm.setAddress(Address.toAddress(client.getAddress()));
// client specific
actionForm.setGovernmentId(personalInfo.getClientDetail().getGovernmentId());
actionForm.setDateOfBirth(personalInfo.getClientDetail().getDateOfBirth());
actionForm.setClientDetailView(personalInfo.getClientDetail().getCustomerDetail());
ClientNameDetailDto clientName = personalInfo.getClientDetail().getClientName();
clientName.setNames(ClientRules.getNameSequence());
actionForm.setClientName(clientName);
String photoDelete = request.getParameter("photoDelete");
if(photoDelete != null && photoDelete.equals("true")) {
ApplicationContextProvider.getBean(ClientPhotoService.class).delete(client.getCustomerId().longValue());
}
boolean isPhotoFieldHidden = FieldConfig.getInstance().isFieldHidden("Client.Photo");
SessionUtils.setAttribute(ClientConstants.IS_PHOTO_FIELD_HIDDEN, isPhotoFieldHidden, request);
if (!isPhotoFieldHidden) {
ClientPhotoDto clientPhotoDto = this.clientServiceFacade.getClientPhoto(client.getCustomerId().longValue());
if (clientPhotoDto != null) {
FormFile formFile = new PictureFormFile(clientPhotoDto.getContentType(), clientPhotoDto.getOut(),
client.getCustomerId().toString(), clientPhotoDto.getContentLength().intValue());
actionForm.setPicture(formFile);
} else {
actionForm.setPicture(null);
}
} else {
actionForm.setPicture(null);
}
ClientNameDetailDto spouseName = personalInfo.getClientDetail().getSpouseName();
if (spouseName != null) {
spouseName.setNames(ClientRules.getNameSequence());
actionForm.setSpouseName(spouseName);
}
actionForm.setSpouseName(spouseName);
actionForm.setCustomFields(new ArrayList<CustomFieldDto>());
SessionUtils.removeThenSetAttribute(Constants.BUSINESS_KEY, client, request);
return mapping.findForward(ActionForwards.editPersonalInfo_success.toString());
}
@TransactionDemarcate(joinToken = true)
public ActionForward previewEditPersonalInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse httpservletresponse) throws Exception {
ClientCustActionForm actionForm = (ClientCustActionForm) form;
String dateOfBirth = actionForm.getDateOfBirth();
actionForm.setAge(calculateAge(DateUtils.getDateAsSentFromBrowser(dateOfBirth)));
ClientRulesDto clientRules = this.clientServiceFacade.retrieveClientDetailsForPreviewingEditOfPersonalInfo();
boolean isFamilyDetailsRequired = clientRules.isFamilyDetailsRequired();
SessionUtils.setAttribute(ClientConstants.ARE_FAMILY_DETAILS_REQUIRED, isFamilyDetailsRequired, request);
if (isFamilyDetailsRequired) {
SessionUtils.setAttribute(ClientConstants.ARE_FAMILY_DETAILS_MANDATORY, isFamilyDetailsMandatory(), request);
SessionUtils.setAttribute(ClientConstants.ARE_FAMILY_DETAILS_HIDDEN, false, request);
} else {
SessionUtils.setAttribute(ClientConstants.ARE_FAMILY_DETAILS_MANDATORY, isSpouseFatherInformationMandatory(), request);
SessionUtils.setAttribute(ClientConstants.ARE_FAMILY_DETAILS_HIDDEN, isSpouseFatherInformationHidden(), request);
}
ClientNameDetailDto clientName = actionForm.getClientName();
clientName.setNames(ClientRules.getNameSequence());
actionForm.setClientName(clientName);
ClientNameDetailDto spouseName = actionForm.getSpouseName();
if (spouseName != null) {
spouseName.setNames(ClientRules.getNameSequence());
actionForm.setSpouseName(spouseName);
}
return mapping.findForward(ActionForwards.previewEditPersonalInfo_success.toString());
}
@TransactionDemarcate(joinToken = true)
public ActionForward prevEditPersonalInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse httpservletresponse) throws Exception {
ClientCustActionForm actionForm = (ClientCustActionForm) form;
boolean isFamilyDetailsRequired = ClientRules.isFamilyDetailsRequired();
SessionUtils.setAttribute(ClientConstants.ARE_FAMILY_DETAILS_REQUIRED, isFamilyDetailsRequired, request);
if (isFamilyDetailsRequired) {
SessionUtils.setAttribute(ClientConstants.ARE_FAMILY_DETAILS_MANDATORY, isFamilyDetailsMandatory(), request);
SessionUtils.setAttribute(ClientConstants.ARE_FAMILY_DETAILS_HIDDEN, false, request);
} else {
SessionUtils.setAttribute(ClientConstants.ARE_FAMILY_DETAILS_MANDATORY, isSpouseFatherInformationMandatory(), request);
SessionUtils.setAttribute(ClientConstants.ARE_FAMILY_DETAILS_HIDDEN, isSpouseFatherInformationHidden(), request);
}
actionForm.setAge(calculateAge(DateUtils.getDateAsSentFromBrowser(actionForm.getDateOfBirth())));
return mapping.findForward(ActionForwards.prevEditPersonalInfo_success.toString());
}
@CloseSession
@TransactionDemarcate(validateAndResetToken = true)
public ActionForward updatePersonalInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
ClientCustActionForm actionForm = (ClientCustActionForm) form;
ClientBO clientInSession = getClientFromSession(request);
Integer oldClientVersionNumber = clientInSession.getVersionNo();
Integer customerId = clientInSession.getCustomerId();
String clientStatus = clientInSession.getCustomerStatus().getName();
List<CustomFieldDto> customFields = new ArrayList<CustomFieldDto>();
short loanOfficerId = clientInSession.getCreatedBy();
final String clientSystemId = clientInSession.getGlobalCustNum();
ClientPersonalInfoDto clientPersonalInfo = this.clientServiceFacade.retrieveClientPersonalInfoForUpdate(clientSystemId, clientStatus, loanOfficerId);
AddressDto address = null;
if (actionForm.getAddress() != null) {
address = Address.toDto(actionForm.getAddress());
}
if(clientPersonalInfo.getCustomerDetail()!= null)
{
if(clientPersonalInfo.getCustomerDetail().getAddress()!=null)
{
if(clientPersonalInfo.getCustomerDetail().getAddress().getPhoneNumber() != null && (!clientPersonalInfo.getCustomerDetail().getAddress().getPhoneNumber().equals(address.getPhoneNumber())))
{
UserContext userContext = getUserContext(request);
if(!ActivityMapper.getInstance().isEditPhoneNumberPermitted(userContext, userContext.getBranchId()))
{
throw new CustomerException(SecurityConstants.KEY_ACTIVITY_NOT_ALLOWED);
}
}
else if(clientPersonalInfo.getCustomerDetail().getAddress().getPhoneNumber() == null && address.getPhoneNumber()!= null && !address.getPhoneNumber().equals(""))
{
UserContext userContext = getUserContext(request);
if(!ActivityMapper.getInstance().isEditPhoneNumberPermitted(userContext, userContext.getBranchId()))
{
throw new CustomerException(SecurityConstants.KEY_ACTIVITY_NOT_ALLOWED);
}
}
}
else if(address.getPhoneNumber()!= null && !address.getPhoneNumber().equals(""))
{
UserContext userContext = getUserContext(request);
if(!ActivityMapper.getInstance().isEditPhoneNumberPermitted(userContext, userContext.getBranchId()))
{
throw new CustomerException(SecurityConstants.KEY_ACTIVITY_NOT_ALLOWED);
}
}
}
else if(address.getPhoneNumber()!= null && !address.getPhoneNumber().equals(""))
{
UserContext userContext = getUserContext(request);
if(!ActivityMapper.getInstance().isEditPhoneNumberPermitted(userContext, userContext.getBranchId()))
{
throw new CustomerException(SecurityConstants.KEY_ACTIVITY_NOT_ALLOWED);
}
}
ClientNameDetailDto spouseFather = null;
if (!ClientRules.isFamilyDetailsRequired()) {
spouseFather = actionForm.getSpouseName();
}
InputStream picture = null;
if (actionForm.getPicture() != null && StringUtils.isNotBlank(actionForm.getPicture().getFileName())) {
picture = actionForm.getCustomerPicture();
}
ClientNameDetailDto clientNameDetails = actionForm.getClientName();
ClientPersonalDetailDto clientDetail = actionForm.getClientDetailView();
String governmentId = actionForm.getGovernmentId();
String clientDisplayName = actionForm.getClientName().getDisplayName();
String dateOfBirth = actionForm.getDateOfBirth();
ClientPersonalInfoUpdate personalInfo = new ClientPersonalInfoUpdate(customerId, oldClientVersionNumber,
customFields, address, clientDetail, clientNameDetails, spouseFather, picture, governmentId,
clientDisplayName, dateOfBirth);
this.clientServiceFacade.updateClientPersonalInfo(personalInfo, clientStatus, loanOfficerId);
return mapping.findForward(ActionForwards.updatePersonalInfo_success.toString());
}
@TransactionDemarcate(joinToken = true)
public ActionForward editFamilyInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
ClientCustActionForm actionForm = (ClientCustActionForm) form;
actionForm.clearMostButNotAllFieldsOnActionForm();
ClientBO clientFromSession = getClientFromSession(request);
ClientFamilyInfoDto clientFamilyInfo = this.clientServiceFacade.retrieveFamilyInfoForEdit(clientFromSession.getGlobalCustNum());
SessionUtils.setCollectionAttribute(ClientConstants.LIVING_STATUS_ENTITY, clientFamilyInfo.getClientDropdowns().getLivingStatus(), request);
SessionUtils.setCollectionAttribute(ClientConstants.GENDER_ENTITY, clientFamilyInfo.getClientDropdowns().getGenders(), request);
SessionUtils.setCollectionAttribute(CustomerConstants.CUSTOM_FIELDS_LIST, new ArrayList<CustomFieldDto>(), request);
UserContext userContext = getUserContext(request);
List<SpouseFatherLookupEntity> spouseFather = legacyMasterDao.findMasterDataEntitiesWithLocale(SpouseFatherLookupEntity.class);
SessionUtils.setCollectionAttribute(ClientConstants.SPOUSE_FATHER_ENTITY, spouseFather, request);
SessionUtils.setAttribute(ClientConstants.ARE_FAMILY_DETAILS_MANDATORY, isFamilyDetailsMandatory(), request);
// customer specific
actionForm.setCustomerId(clientFamilyInfo.getCustomerDetail().getCustomerId().toString());
actionForm.setLoanOfficerId(clientFamilyInfo.getCustomerDetail().getLoanOfficerIdAsString());
actionForm.setGlobalCustNum(clientFamilyInfo.getCustomerDetail().getGlobalCustNum());
actionForm.setExternalId(clientFamilyInfo.getCustomerDetail().getExternalId());
// client specific
actionForm.setGovernmentId(clientFamilyInfo.getClientDetail().getGovernmentId());
actionForm.setDateOfBirth(clientFamilyInfo.getClientDetail().getDateOfBirth());
actionForm.initializeFamilyMember();
actionForm.setClientDetailView(clientFamilyInfo.getClientDetail().getCustomerDetail());
actionForm.setClientName(clientFamilyInfo.getClientDetail().getClientName());
actionForm.setSpouseName(clientFamilyInfo.getClientDetail().getSpouseName());
actionForm.setCustomFields(new ArrayList<CustomFieldDto>());
// client family specific
int familyMemberCount = 0;
for (ClientNameDetailDto familyMember : clientFamilyInfo.getFamilyMembers()) {
actionForm.addFamilyMember();
actionForm.setFamilyPrimaryKey(familyMemberCount, familyMember.getCustomerNameId());
actionForm.setFamilyFirstName(familyMemberCount, familyMember.getFirstName());
actionForm.setFamilyMiddleName(familyMemberCount, familyMember.getMiddleName());
actionForm.setFamilyLastName(familyMemberCount, familyMember.getLastName());
actionForm.setFamilySecondLastName(familyMemberCount, familyMember.getSecondLastName());
actionForm.setFamilyRelationship(familyMemberCount, familyMember.getNameType());
Map<Integer, List<ClientFamilyDetailDto>> clientFamilyDetailsMap = clientFamilyInfo.getClientFamilyDetails();
Integer key = Integer.valueOf(familyMemberCount);
List<ClientFamilyDetailDto> clientFamilyDetails = clientFamilyDetailsMap.get(key);
if (clientFamilyDetails != null) {
for (ClientFamilyDetailDto clientFamilyDetailDto : clientFamilyDetails) {
Calendar cal = Calendar.getInstance();
if (clientFamilyDetailDto.getDateOfBirth() != null) {
String date1 = DateUtils.makeDateAsSentFromBrowser(clientFamilyDetailDto.getDateOfBirth());
java.util.Date date = DateUtils.getDate(date1);
cal.setTime(date);
actionForm.setFamilyDateOfBirthDD(familyMemberCount, String.valueOf(cal.get(Calendar.DAY_OF_MONTH)));
actionForm.setFamilyDateOfBirthMM(familyMemberCount, String.valueOf(cal.get(Calendar.MONTH) + 1));
actionForm.setFamilyDateOfBirthYY(familyMemberCount, String.valueOf(cal.get(Calendar.YEAR)));
}
actionForm.setFamilyGender(familyMemberCount, clientFamilyDetailDto.getGender());
actionForm.setFamilyLivingStatus(familyMemberCount, clientFamilyDetailDto.getLivingStatus());
}
}
familyMemberCount++;
}
ClientBO client = this.customerDao.findClientBySystemId(clientFromSession.getGlobalCustNum());
actionForm.setAddress(Address.toAddress(client.getAddress()));
SessionUtils.removeThenSetAttribute(Constants.BUSINESS_KEY, client, request);
return mapping.findForward(ActionForwards.editFamilyInfo_success.toString());
}
@TransactionDemarcate(joinToken = true)
public ActionForward previewEditFamilyInfo(ActionMapping mapping, ActionForm form,
@SuppressWarnings("unused") HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse httpservletresponse) throws Exception {
ClientCustActionForm actionForm = (ClientCustActionForm) form;
actionForm.setFamilyDateOfBirth();
actionForm.constructFamilyDetails();
return mapping.findForward(ActionForwards.previewEditFamilyInfo_success.toString());
}
@CloseSession
@TransactionDemarcate(validateAndResetToken = true)
public ActionForward updateFamilyInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
ClientCustActionForm actionForm = (ClientCustActionForm) form;
ClientBO clientInSession = getClientFromSession(request);
Integer customerId = clientInSession.getCustomerId();
ClientFamilyInfoUpdate clientFamilyInfoUpdate = new ClientFamilyInfoUpdate(customerId, clientInSession.getVersionNo(),
actionForm.getFamilyPrimaryKey(), actionForm.getFamilyNames(), actionForm.getFamilyDetails());
this.clientServiceFacade.updateFamilyInfo(clientFamilyInfoUpdate);
actionForm.setFamilyDateOfBirth();
actionForm.constructFamilyDetails();
SessionUtils.removeAttribute(Constants.BUSINESS_KEY, request);
return mapping.findForward(ActionForwards.updateFamilyInfo_success.toString());
}
@TransactionDemarcate(joinToken = true)
public ActionForward editMfiInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
ClientCustActionForm actionForm = (ClientCustActionForm) form;
actionForm.clearMostButNotAllFieldsOnActionForm();
ClientBO clientFromSession = getClientFromSession(request);
String clientSystemId = clientFromSession.getGlobalCustNum();
ClientMfiInfoDto mfiInfoDto = this.clientServiceFacade.retrieveMfiInfoForEdit(clientSystemId);
SessionUtils.setAttribute(GroupConstants.CENTER_HIERARCHY_EXIST, ClientRules.getCenterHierarchyExists(), request);
SessionUtils.setCollectionAttribute(CustomerConstants.LOAN_OFFICER_LIST, mfiInfoDto.getLoanOfficersList(), request);
actionForm.setGroupDisplayName(mfiInfoDto.getGroupDisplayName());
actionForm.setCenterDisplayName(mfiInfoDto.getCenterDisplayName());
actionForm.setLoanOfficerId(mfiInfoDto.getCustomerDetail().getLoanOfficerIdAsString());
actionForm.setCustomerId(mfiInfoDto.getCustomerDetail().getCustomerId().toString());
actionForm.setGlobalCustNum(mfiInfoDto.getCustomerDetail().getGlobalCustNum());
actionForm.setExternalId(mfiInfoDto.getCustomerDetail().getExternalId());
actionForm.setGroupFlag(mfiInfoDto.getClientDetail().getGroupFlagAsString());
actionForm.setParentGroupId(mfiInfoDto.getClientDetail().getParentGroupId().toString());
actionForm.setTrained(mfiInfoDto.getClientDetail().getTrainedAsString());
actionForm.setTrainedDate(mfiInfoDto.getClientDetail().getTrainedDate());
actionForm.setDateOfBirth(clientFromSession.getDateOfBirth());
ClientBO client = this.customerDao.findClientBySystemId(clientSystemId);
SessionUtils.removeThenSetAttribute(Constants.BUSINESS_KEY, client, request);
return mapping.findForward(ActionForwards.editMfiInfo_success.toString());
}
@TransactionDemarcate(joinToken = true)
public ActionForward previewEditMfiInfo(ActionMapping mapping, @SuppressWarnings("unused") ActionForm form,
@SuppressWarnings("unused") HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse httpservletresponse) throws Exception {
return mapping.findForward(ActionForwards.previewEditMfiInfo_success.toString());
}
@TransactionDemarcate(joinToken = true)
public ActionForward prevEditMfiInfo(ActionMapping mapping, @SuppressWarnings("unused") ActionForm form,
@SuppressWarnings("unused") HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse httpservletresponse) throws Exception {
return mapping.findForward(ActionForwards.prevEditMfiInfo_success.toString());
}
@CloseSession
@TransactionDemarcate(validateAndResetToken = true)
public ActionForward updateMfiInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
ClientCustActionForm actionForm = (ClientCustActionForm) form;
ClientBO clientInSession = getClientFromSession(request);
Integer clientId = clientInSession.getCustomerId();
Integer oldVersionNumber = clientInSession.getVersionNo();
boolean trained = false;
if (trainedValue(actionForm) != null && trainedValue(actionForm).equals(YesNoFlag.YES.getValue())) {
trained = true;
}
DateTime trainedDate = null;
try {
java.sql.Date inputDate = trainedDate(actionForm);
if (inputDate != null) {
trainedDate = new DateTime(trainedDate(actionForm));
}
} catch (InvalidDateException e) {
throw new CustomerException(ClientConstants.TRAINED_DATE_MANDATORY);
}
Short personnelId = Short.valueOf("-1");
if (groupFlagValue(actionForm).equals(YesNoFlag.NO.getValue())) {
if (actionForm.getLoanOfficerIdValue() != null) {
personnelId = actionForm.getLoanOfficerIdValue();
}
} else if (groupFlagValue(actionForm).equals(YesNoFlag.YES.getValue())) {
// TODO for an urgent fix this reads client to get personnelId.
// Client is read again in updateClientMfiInfo. Refactor to only read in
// updateClientMfiInfo.
ClientBO client = (ClientBO) this.customerDao.findCustomerById(clientId);
personnelId = client.getPersonnel().getPersonnelId();
}
ClientMfiInfoUpdate clientMfiInfoUpdate = new ClientMfiInfoUpdate(clientId, oldVersionNumber, personnelId,
externalId(actionForm), trained, trainedDate);
this.clientServiceFacade.updateClientMfiInfo(clientMfiInfoUpdate);
return mapping.findForward(ActionForwards.updateMfiInfo_success.toString());
}
private Date trainedDate(ClientCustActionForm actionForm) throws InvalidDateException {
return DateUtils.getDateAsSentFromBrowser(actionForm.getTrainedDate());
}
private Short trainedValue(ClientCustActionForm actionForm) {
return actionForm.getTrainedValue();
}
private String externalId(ClientCustActionForm actionForm) {
return actionForm.getExternalId();
}
private Short groupFlagValue(ClientCustActionForm actionForm) {
return actionForm.getGroupFlagValue();
}
private int calculateAge(Date date) {
return DateUtils.DateDiffInYears(date);
}
private ClientBO getClientFromSession(HttpServletRequest request) throws PageExpiredException {
return (ClientBO) SessionUtils.getAttribute(Constants.BUSINESS_KEY, request);
}
@SuppressWarnings("unchecked")
private List<SavingsDetailDto> getSavingsOfferingsFromSession(HttpServletRequest request)
throws PageExpiredException {
return (List<SavingsDetailDto>) SessionUtils.getAttribute(ClientConstants.SAVINGS_OFFERING_LIST, request);
}
private boolean isSpouseFatherInformationMandatory() {
return FieldConfig.getInstance().isFieldManadatory("Client." + HiddenMandatoryFieldNamesConstants.SPOUSE_FATHER_INFORMATION);
}
private boolean isSpouseFatherInformationHidden() {
return FieldConfig.getInstance().isFieldHidden("Client." + HiddenMandatoryFieldNamesConstants.SPOUSE_FATHER_INFORMATION);
}
private boolean isFamilyDetailsMandatory() {
return FieldConfig.getInstance().isFieldManadatory("Client." + HiddenMandatoryFieldNamesConstants.FAMILY_DETAILS);
}
@Override
public ActionForward captureQuestionResponses(ActionMapping mapping, ActionForm form, HttpServletRequest request, @SuppressWarnings("unused") HttpServletResponse response) throws Exception {
request.setAttribute(METHODCALLED, "captureQuestionResponses");
ActionErrors errors = createClientQuestionnaire.validateResponses(request, (ClientCustActionForm) form);
if (errors != null && !errors.isEmpty()) {
addErrors(request, errors);
return mapping.findForward(ActionForwards.captureQuestionResponses.toString());
}
return createClientQuestionnaire.rejoinFlow(mapping);
}
@Override
public ActionForward editQuestionResponses(ActionMapping mapping, ActionForm form, HttpServletRequest request, @SuppressWarnings("unused") HttpServletResponse response) throws Exception {
request.setAttribute(METHODCALLED, "editQuestionResponses");
return createClientQuestionnaire.editResponses(mapping, request, (ClientCustActionForm) form);
}
}
class PictureFormFile implements FormFile {
private String contentType;
private byte[] data;
private String name;
private int size;
public PictureFormFile(String contentType, byte[] data, String name, int size) {
super();
this.contentType = contentType;
this.data = data;
this.name = name;
this.size = size;
}
@Override
public void destroy() {
contentType = null;
data = null;
name = null;
size = 0;
}
@Override
public String getContentType() {
return contentType;
}
@Override
public byte[] getFileData() throws FileNotFoundException, IOException {
return data;
}
@Override
public String getFileName() {
return name;
}
@Override
public int getFileSize() {
return size;
}
@Override
public InputStream getInputStream() throws FileNotFoundException, IOException {
return new ByteArrayInputStream(data);
}
@Override
public void setContentType(String contentType) {
this.contentType = contentType;
}
@Override
public void setFileName(String name) {
this.name = name;
}
@Override
public void setFileSize(int size) {
this.size = size;
}
}