org.mifos.customers.center.struts.action.CenterCustAction.java Source code

Java tutorial

Introduction

Here is the source code for org.mifos.customers.center.struts.action.CenterCustAction.java

Source

/*
 * 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);
    }
}