/*
* 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.center.struts.action;
import static org.mifos.accounts.loan.util.helpers.LoanConstants.METHODCALLED;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
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.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.mifos.application.meeting.business.MeetingBO;
import org.mifos.application.questionnaire.struts.DefaultQuestionnaireServiceFacadeLocator;
import org.mifos.application.questionnaire.struts.QuestionnaireFlowAdapter;
import org.mifos.application.questionnaire.struts.QuestionnaireServiceFacadeLocator;
import org.mifos.application.servicefacade.CustomerSearch;
import org.mifos.application.util.helpers.ActionForwards;
import org.mifos.application.util.helpers.Methods;
import org.mifos.calendar.CalendarUtils;
import org.mifos.core.MifosRuntimeException;
import org.mifos.customers.center.business.CenterBO;
import org.mifos.customers.center.struts.actionforms.CenterCustActionForm;
import org.mifos.customers.struts.action.CustAction;
import org.mifos.customers.util.helpers.CustomerConstants;
import org.mifos.dto.domain.AddressDto;
import org.mifos.dto.domain.ApplicableAccountFeeDto;
import org.mifos.dto.domain.CenterCreation;
import org.mifos.dto.domain.CenterCreationDetail;
import org.mifos.dto.domain.CenterDto;
import org.mifos.dto.domain.CenterInformationDto;
import org.mifos.dto.domain.CenterUpdate;
import org.mifos.dto.domain.CreateAccountFeeDto;
import org.mifos.dto.domain.CustomFieldDto;
import org.mifos.dto.domain.CustomerDetailsDto;
import org.mifos.dto.domain.MeetingDto;
import org.mifos.dto.screen.CenterFormCreationDto;
import org.mifos.dto.screen.OnlyBranchOfficeHierarchyDto;
import org.mifos.framework.business.util.Address;
import org.mifos.framework.exceptions.ApplicationException;
import org.mifos.framework.exceptions.PageExpiredException;
import org.mifos.framework.util.helpers.CloseSession;
import org.mifos.framework.util.helpers.Constants;
import org.mifos.framework.util.helpers.SessionUtils;
import org.mifos.framework.util.helpers.TransactionDemarcate;
import org.mifos.platform.questionnaire.service.QuestionGroupInstanceDetail;
import org.mifos.platform.questionnaire.service.QuestionnaireServiceFacade;
import org.mifos.security.util.UserContext;
import org.mifos.service.BusinessRuleException;
public class CenterCustAction extends CustAction {
private QuestionnaireServiceFacadeLocator questionnaireServiceFacadeLocator = new DefaultQuestionnaireServiceFacadeLocator();
private QuestionnaireFlowAdapter createCenterQuestionnaire = new QuestionnaireFlowAdapter("Create", "Center",
ActionForwards.preview_success, "clientsAndAccounts.ftl", questionnaireServiceFacadeLocator
);
@TransactionDemarcate(saveToken = true)
public ActionForward chooseOffice(ActionMapping mapping, @SuppressWarnings("unused") ActionForm form,
HttpServletRequest request, @SuppressWarnings("unused") HttpServletResponse response) throws Exception {
OnlyBranchOfficeHierarchyDto officeHierarchy = customerServiceFacade.retrieveBranchOnlyOfficeHierarchy();
SessionUtils.setAttribute(OnlyBranchOfficeHierarchyDto.IDENTIFIER, officeHierarchy, request);
SessionUtils.setAttribute(CustomerConstants.URL_MAP, null, request.getSession(false));
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 {
CenterCustActionForm actionForm = (CenterCustActionForm) form;
actionForm.clearActionFormFields();
SessionUtils.removeAttribute(CustomerConstants.CUSTOMER_MEETING, request);
UserContext userContext = getUserContext(request);
CenterCreation centerCreationDto = new CenterCreation(actionForm.getOfficeIdValue(), userContext.getId(),
userContext.getLevelId(), userContext.getPreferredLocale());
CenterFormCreationDto centerFormCreation = this.centerServiceFacade.retrieveCenterFormCreationData(centerCreationDto);
// SessionUtils.setCollectionAttribute(CustomerConstants.CUSTOM_FIELDS_LIST, new ArrayList<Serializable>(), request);
SessionUtils.setCollectionAttribute(CustomerConstants.LOAN_OFFICER_LIST, centerFormCreation.getActiveLoanOfficersForBranch(), request);
SessionUtils.setCollectionAttribute(CustomerConstants.ADDITIONAL_FEES_LIST, centerFormCreation.getAdditionalFees(), request);
// actionForm.setCustomFields(centerFormCreation.getCustomFieldViews());
actionForm.setDefaultFees(centerFormCreation.getDefaultFees());
DateTime today = new DateTime().toDateMidnight().toDateTime();
actionForm.setMfiJoiningDate(today.getDayOfMonth(), today.getMonthOfYear(), today.getYear());
return mapping.findForward(ActionForwards.load_success.toString());
}
@TransactionDemarcate(joinToken = true)
public ActionForward loadMeeting(ActionMapping mapping, @SuppressWarnings("unused") ActionForm form,
@SuppressWarnings("unused") HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
// NOTE - forwards to MeetingAction.load and MeetingAction.create to save meeting schedule
return mapping.findForward(ActionForwards.loadMeeting_success.toString());
}
@TransactionDemarcate(joinToken = true)
public ActionForward preview(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
// NOTE - pulls information from session scope variables and from actionform in session scope
CenterCustActionForm actionForm = (CenterCustActionForm) form;
return createCenterQuestionnaire.fetchAppliedQuestions(
mapping, actionForm, request, ActionForwards.preview_success);
}
@TransactionDemarcate(joinToken = true)
public ActionForward previous(ActionMapping mapping, @SuppressWarnings("unused") ActionForm form,
@SuppressWarnings("unused") HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
return mapping.findForward(ActionForwards.previous_success.toString());
}
@TransactionDemarcate(validateAndResetToken = true)
public ActionForward create(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
CenterCustActionForm actionForm = (CenterCustActionForm) form;
MeetingBO meeting = (MeetingBO) SessionUtils.getAttribute(CustomerConstants.CUSTOMER_MEETING, request);
LocalDate mfiJoiningDate = new LocalDate(CalendarUtils.getDateFromString(actionForm.getMfiJoiningDate(), getUserContext(request).getPreferredLocale()));
Address address = actionForm.getAddress();
AddressDto addressDto = Address.toDto(address);
MeetingDto meetingDto = meeting.toDto();
List<CreateAccountFeeDto> accountFeesToBeApplied = new ArrayList<CreateAccountFeeDto>();
List<ApplicableAccountFeeDto> feesToBeApplied = actionForm.getFeesToApply();
for (ApplicableAccountFeeDto feeDto : feesToBeApplied) {
accountFeesToBeApplied.add(new CreateAccountFeeDto(feeDto.getFeeId(), feeDto.getAmount()));
}
try {
CenterCreationDetail centerCreationDetail = new CenterCreationDetail(mfiJoiningDate, actionForm.getDisplayName(), actionForm.getExternalId(), addressDto, actionForm.getLoanOfficerIdValue(), actionForm.getOfficeIdValue(), accountFeesToBeApplied);
CustomerDetailsDto centerDetails = this.centerServiceFacade.createNewCenter(centerCreationDetail, meetingDto);
createCenterQuestionnaire.saveResponses(request, actionForm, centerDetails.getId());
actionForm.setCustomerId(centerDetails.getId().toString());
actionForm.setGlobalCustNum(centerDetails.getGlobalCustNum());
} catch (BusinessRuleException e) {
throw new ApplicationException(e.getMessageKey(), e.getMessageValues());
}
return mapping.findForward(ActionForwards.create_success.toString());
}
// NOTE edit center details
@TransactionDemarcate(joinToken = true)
public ActionForward manage(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
CenterCustActionForm actionForm = (CenterCustActionForm) form;
actionForm.clearActionFormFields();
CenterBO center = (CenterBO) SessionUtils.getAttribute(Constants.BUSINESS_KEY, request);
final Integer centerId = center.getCustomerId();
center = this.customerDao.findCenterBySystemId(center.getGlobalCustNum());
SessionUtils.setAttribute(Constants.BUSINESS_KEY, null, request);
CenterDto centerDto = this.centerServiceFacade.retrieveCenterDetailsForUpdate(centerId);
actionForm.setLoanOfficerId(centerDto.getLoanOfficerIdAsString());
actionForm.setCustomerId(centerDto.getCustomerIdAsString());
actionForm.setGlobalCustNum(centerDto.getGlobalCustNum());
actionForm.setExternalId(centerDto.getExternalId());
actionForm.setMfiJoiningDate(centerDto.getMfiJoiningDateAsString());
actionForm.setMfiJoiningDate(centerDto.getMfiJoiningDate().getDayOfMonth(), centerDto.getMfiJoiningDate()
.getMonthOfYear(), centerDto.getMfiJoiningDate().getYear());
actionForm.setAddress(center.getAddress());
actionForm.setCustomerPositions(centerDto.getCustomerPositionViews());
actionForm.setCustomFields(new ArrayList<CustomFieldDto>());
SessionUtils.setAttribute(Constants.BUSINESS_KEY, center, request);
SessionUtils.setCollectionAttribute(CustomerConstants.LOAN_OFFICER_LIST, centerDto.getActiveLoanOfficersForBranch(), request);
SessionUtils.setCollectionAttribute(CustomerConstants.CUSTOM_FIELDS_LIST, new ArrayList<CustomFieldDto>(), request);
SessionUtils.setCollectionAttribute(CustomerConstants.POSITIONS, centerDto.getCustomerPositionViews(), request);
SessionUtils.setCollectionAttribute(CustomerConstants.CLIENT_LIST, centerDto.getClientList(), request);
return mapping.findForward(ActionForwards.manage_success.toString());
}
// NOTE - manage->preview
@TransactionDemarcate(joinToken = true)
public ActionForward editPreview(ActionMapping mapping, @SuppressWarnings("unused") ActionForm form,
@SuppressWarnings("unused") HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
return mapping.findForward(ActionForwards.editpreview_success.toString());
}
@TransactionDemarcate(joinToken = true)
public ActionForward editPrevious(ActionMapping mapping, @SuppressWarnings("unused") ActionForm form,
@SuppressWarnings("unused") HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
return mapping.findForward(ActionForwards.editprevious_success.toString());
}
// NOTE - manage->preview->update
@CloseSession
@TransactionDemarcate(validateAndResetToken = true)
public ActionForward update(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
CenterBO centerFromSession = (CenterBO) SessionUtils.getAttribute(Constants.BUSINESS_KEY, request);
CenterCustActionForm actionForm = (CenterCustActionForm) form;
AddressDto dto = null;
if (actionForm.getAddress() != null) {
dto = Address.toDto(actionForm.getAddress());
}
CenterUpdate centerUpdate = new CenterUpdate(centerFromSession.getCustomerId(),
actionForm.getDisplayName(), centerFromSession.getVersionNo(),
actionForm.getLoanOfficerIdValue(), actionForm.getExternalId(), actionForm
.getMfiJoiningDate(), dto, actionForm.getCustomFields(), actionForm.getCustomerPositions());
try {
this.centerServiceFacade.updateCenter(centerUpdate);
} catch (BusinessRuleException e) {
throw new ApplicationException(e.getMessageKey(), e);
}
return mapping.findForward(ActionForwards.update_success.toString());
}
@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(validateAndResetToken = true)
public ActionForward cancel(ActionMapping mapping, ActionForm form,
@SuppressWarnings("unused") HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) {
CenterCustActionForm actionForm = (CenterCustActionForm) form;
ActionForwards forward = null;
if (actionForm.getInput().equals(Methods.create.toString())) {
forward = ActionForwards.cancel_success;
} else if (actionForm.getInput().equals(Methods.manage.toString())) {
forward = ActionForwards.editcancel_success;
}
return mapping.findForward(forward.toString());
}
@TransactionDemarcate(saveToken = true)
public ActionForward get(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
CenterInformationDto centerInformationDto;
try {
centerInformationDto = this.centerServiceFacade.getCenterInformationDto(((CenterCustActionForm) form).getGlobalCustNum());
}
catch (MifosRuntimeException e) {
if (e.getCause() instanceof ApplicationException) {
throw (ApplicationException) e.getCause();
}
throw e;
}
SessionUtils.removeThenSetAttribute("centerInformationDto", centerInformationDto, request);
// John W - 'BusinessKey' attribute used by breadcrumb but is not in associated jsp
CenterBO centerBO = (CenterBO) this.customerDao.findCustomerById(centerInformationDto.getCenterDisplay().getCustomerId());
SessionUtils.removeThenSetAttribute(Constants.BUSINESS_KEY, centerBO, request);
setCurrentPageUrl(request, centerBO);
setQuestionGroupInstances(request, centerBO);
return mapping.findForward(ActionForwards.get_success.toString());
}
private void setQuestionGroupInstances(HttpServletRequest request, CenterBO centerBO) throws PageExpiredException {
QuestionnaireServiceFacade questionnaireServiceFacade = questionnaireServiceFacadeLocator.getService(request);
if (questionnaireServiceFacade != null) {
setQuestionGroupInstances(questionnaireServiceFacade, request, centerBO.getCustomerId());
}
}
// Intentionally made public to aid testing !
public void setQuestionGroupInstances(QuestionnaireServiceFacade questionnaireServiceFacade, HttpServletRequest request, Integer customerId) throws PageExpiredException {
List<QuestionGroupInstanceDetail> instanceDetails = questionnaireServiceFacade.getQuestionGroupInstances(customerId, "View", "Center");
SessionUtils.setCollectionAttribute("questionGroupInstances", instanceDetails, request);
}
private void setCurrentPageUrl(HttpServletRequest request, CenterBO centerBO) throws PageExpiredException, UnsupportedEncodingException {
SessionUtils.removeThenSetAttribute("currentPageUrl", constructCurrentPageUrl(request, centerBO), request);
}
private String constructCurrentPageUrl(HttpServletRequest request, CenterBO centerBO) throws UnsupportedEncodingException {
String officerId = request.getParameter("recordOfficeId");
String loanOfficerId = request.getParameter("recordLoanOfficerId");
String url = String.format("centerCustAction.do?globalCustNum=%s&recordOfficeId=%s&recordLoanOfficerId=%s",
centerBO.getGlobalCustNum(), officerId, loanOfficerId);
return url;
}
@TransactionDemarcate(conditionToken = true)
public ActionForward loadSearch(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
cleanSearchResults(request, (CenterCustActionForm) form);
return mapping.findForward(ActionForwards.loadSearch_success.toString());
}
@TransactionDemarcate(conditionToken = true)
public ActionForward loadTransferSearch(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
cleanSearchResults(request, (CenterCustActionForm) form);
return mapping.findForward(ActionForwards.loadTransferSearch_success.toString());
}
@TransactionDemarcate(joinToken = true)
public ActionForward searchTransfer(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
cleanUpSearch(request);
CenterCustActionForm actionForm = (CenterCustActionForm) form;
String searchString = actionForm.getSearchString();
CustomerSearch searchResult = this.customerServiceFacade.search(searchString);
addSeachValues(searchString, searchResult.getOfficeId(), searchResult.getOfficeName(), request);
SessionUtils.setQueryResultAttribute(Constants.SEARCH_RESULTS, searchResult.getSearchResult(), request);
return mapping.findForward(ActionForwards.transferSearch_success.toString());
}
/**
* invoked when searching for centers from group creation screen
*/
@Override
@TransactionDemarcate(joinToken = true)
public ActionForward search(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
ActionForward actionForward = super.search(mapping, form, request, response);
CenterCustActionForm actionForm = (CenterCustActionForm) form;
String searchString = actionForm.getSearchString();
CustomerSearch searchResult = this.customerServiceFacade.search(searchString);
addSeachValues(searchString, searchResult.getOfficeId(), searchResult.getOfficeName(), request);
SessionUtils.setQueryResultAttribute(Constants.SEARCH_RESULTS, searchResult.getSearchResult(), request);
return actionForward;
}
private void cleanSearchResults(HttpServletRequest request, CenterCustActionForm actionForm)
throws PageExpiredException {
actionForm.setSearchString(null);
cleanUpSearch(request);
}
@TransactionDemarcate(joinToken = true)
public ActionForward captureQuestionResponses(
final ActionMapping mapping, final ActionForm form, final HttpServletRequest request,
@SuppressWarnings("unused") final HttpServletResponse response) throws Exception {
request.setAttribute(METHODCALLED, "captureQuestionResponses");
ActionErrors errors = createCenterQuestionnaire.validateResponses(request, (CenterCustActionForm) form);
if (errors != null && !errors.isEmpty()) {
addErrors(request, errors);
return mapping.findForward(ActionForwards.captureQuestionResponses.toString());
}
return createCenterQuestionnaire.rejoinFlow(mapping);
}
@TransactionDemarcate(joinToken = true)
public ActionForward editQuestionResponses(
final ActionMapping mapping, final ActionForm form,
final HttpServletRequest request, @SuppressWarnings("unused") final HttpServletResponse response) throws Exception {
request.setAttribute(METHODCALLED, "editQuestionResponses");
return createCenterQuestionnaire.editResponses(mapping, request, (CenterCustActionForm) form);
}
}