/*
* 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.application.meeting.struts.action;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.mifos.application.master.MessageLookup;
import org.mifos.application.meeting.business.MeetingBO;
import org.mifos.application.meeting.exceptions.MeetingException;
import org.mifos.application.meeting.struts.actionforms.MeetingActionForm;
import org.mifos.application.meeting.util.helpers.MeetingConstants;
import org.mifos.application.meeting.util.helpers.MeetingType;
import org.mifos.application.meeting.util.helpers.RankOfDay;
import org.mifos.application.meeting.util.helpers.RecurrenceType;
import org.mifos.application.meeting.util.helpers.WeekDay;
import org.mifos.application.servicefacade.ApplicationContextProvider;
import org.mifos.application.util.helpers.ActionForwards;
import org.mifos.config.FiscalCalendarRules;
import org.mifos.customers.api.CustomerLevel;
import org.mifos.customers.business.CustomerBO;
import org.mifos.customers.util.helpers.CustomerConstants;
import org.mifos.dto.domain.MeetingDto;
import org.mifos.framework.struts.action.BaseAction;
import org.mifos.framework.util.DateTimeService;
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;
public class MeetingAction extends BaseAction {
@TransactionDemarcate(joinToken = true)
public ActionForward load(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
MeetingActionForm form1 = (MeetingActionForm) form;
MeetingBO meeting = (MeetingBO) SessionUtils.getAttribute(CustomerConstants.CUSTOMER_MEETING, request);
clearActionForm(form1);
if (meeting != null) {
setValuesInActionForm(form1, meeting);
}
List<WeekDay> workingDays = getLocalizedWorkingDays();
SessionUtils.setCollectionAttribute(MeetingConstants.WEEKDAYSLIST, workingDays, request);
SessionUtils.setCollectionAttribute(MeetingConstants.WEEKRANKLIST, RankOfDay.getRankOfDayList(), request);
return mapping.findForward(ActionForwards.load_success.toString());
}
private List<WeekDay> getLocalizedWorkingDays() {
List<WeekDay> workingDays = new FiscalCalendarRules().getWorkingDays();
for (WeekDay workDay : workingDays) {
String weekdayName = ApplicationContextProvider.getBean(MessageLookup.class).lookup(workDay.getPropertiesKey());
workDay.setWeekdayName(weekdayName);
}
return workingDays;
}
@TransactionDemarcate(joinToken = true)
public ActionForward create(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
MeetingActionForm actionForm = (MeetingActionForm) form;
MeetingBO meeting = createMeeting(actionForm);
SessionUtils.setAttribute(CustomerConstants.CUSTOMER_MEETING, meeting, request);
return mapping.findForward(forwardForCreate(actionForm.getCustomerLevelValue()).toString());
}
@TransactionDemarcate(conditionToken = true)
public ActionForward edit(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
MeetingActionForm actionForm = (MeetingActionForm) form;
clearActionForm(actionForm);
CustomerBO customerInSession = (CustomerBO) SessionUtils.getAttribute(Constants.BUSINESS_KEY, request);
CustomerBO customer = this.customerDao.findCustomerById(customerInSession.getCustomerId());
SessionUtils.setAttribute(Constants.BUSINESS_KEY, customer, request);
List<WeekDay> workingDays = getLocalizedWorkingDays();
SessionUtils.setCollectionAttribute(MeetingConstants.WEEKDAYSLIST, workingDays, request);
SessionUtils.setCollectionAttribute(MeetingConstants.WEEKRANKLIST, RankOfDay.getRankOfDayList(), request);
ActionForward forward = null;
if (customer.getCustomerMeeting() != null) {
MeetingBO meeting = customer.getCustomerMeeting().getMeeting();
setValuesInActionForm(actionForm, meeting);
forward = mapping.findForward(ActionForwards.edit_success.toString());
actionForm.setInput(MeetingConstants.INPUT_EDIT);
} else {
actionForm.setInput(MeetingConstants.INPUT_CREATE);
forward = mapping.findForward(ActionForwards.createMeeting_success.toString());
}
return forward;
}
@TransactionDemarcate(validateAndResetToken = true)
@CloseSession
public ActionForward update(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
MeetingActionForm actionForm = (MeetingActionForm) form;
MeetingBO meeting = createMeeting(actionForm);
CustomerBO customerInSession = (CustomerBO) SessionUtils.getAttribute(Constants.BUSINESS_KEY, request);
MeetingDto meetingDto = null;
if (meeting!= null) {
meetingDto = meeting.toDto();
}
meetingServiceFacade.updateCustomerMeeting(meetingDto, customerInSession.getCustomerId());
ActionForwards forward = forwardForUpdate(actionForm.getCustomerLevelValue());
return mapping.findForward(forward.toString());
}
@TransactionDemarcate(joinToken = true)
public ActionForward cancelCreate(ActionMapping mapping, ActionForm form, @SuppressWarnings("unused") HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
MeetingActionForm maf = (MeetingActionForm) form;
return mapping.findForward(forwardForCreate(maf.getCustomerLevelValue()).toString());
}
@TransactionDemarcate(validateAndResetToken = true)
public ActionForward cancelUpdate(ActionMapping mapping, ActionForm form, @SuppressWarnings("unused") HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
ActionForwards forward = forwardForUpdate(((MeetingActionForm) form).getCustomerLevelValue());
return mapping.findForward(forward.toString());
}
@TransactionDemarcate(joinToken = true)
public ActionForward validate(ActionMapping mapping, ActionForm form, HttpServletRequest request,
@SuppressWarnings("unused") HttpServletResponse response) throws Exception {
String method = (String) request.getAttribute("methodCalled");
MeetingActionForm maf = (MeetingActionForm) form;
if (maf.getInput() == null || maf.getInput().equals(MeetingConstants.INPUT_EDIT)) {
return mapping.findForward(method + "_failure");
}
return mapping.findForward(ActionForwards.createMeeting_failure.toString());
}
private void setValuesInActionForm(MeetingActionForm form, MeetingBO meeting) {
if (meeting.isWeekly()) {
form.setFrequency(RecurrenceType.WEEKLY.getValue().toString());
form.setWeekDay(meeting.getMeetingDetails().getWeekDay().getValue().toString());
form.setRecurWeek(meeting.getMeetingDetails().getRecurAfter().toString());
Date meetingStartDate = meeting.getMeetingStartDate();
if (meetingStartDate != null) {
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
form.setMeetingStartDate(df.format(meetingStartDate));
}
} else if (meeting.isDaily()) {
form.setFrequency(RecurrenceType.DAILY.getValue().toString());
form.setRecurDay(meeting.getMeetingDetails().getRecurAfter().toString());
Date meetingStartDate = meeting.getMeetingStartDate();
if (meetingStartDate != null) {
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
form.setMeetingStartDate(df.format(meetingStartDate));
}
} else if (meeting.isMonthly()) {
form.setFrequency(RecurrenceType.MONTHLY.getValue().toString());
if (meeting.isMonthlyOnDate()) {
form.setMonthType("1");
form.setDayRecurMonth(meeting.getMeetingDetails().getRecurAfter().toString());
form.setMonthDay(meeting.getMeetingDetails().getDayNumber().toString());
} else {
form.setMonthType("2");
form.setRecurMonth(meeting.getMeetingDetails().getRecurAfter().toString());
form.setMonthWeek(meeting.getMeetingDetails().getWeekDay().getValue().toString());
form.setMonthRank(meeting.getMeetingDetails().getWeekRank().getValue().toString());
}
}
form.setMeetingPlace(meeting.getMeetingPlace());
}
private MeetingBO createMeeting(MeetingActionForm form) throws MeetingException {
MeetingBO meeting = null;
Date startDate = null;
if (form.getMeetingStartDate() == null || form.getMeetingStartDate().isEmpty()) {
startDate = new DateTimeService().getCurrentJavaDateTime();
} else {
startDate = DateUtils.getDate(form.getMeetingStartDate());
}
if (form.getRecurrenceType().equals(RecurrenceType.WEEKLY)) {
meeting = new MeetingBO(form.getWeekDayValue(), form.getRecurWeekValue(), startDate,
MeetingType.CUSTOMER_MEETING, form.getMeetingPlace());
} else if (form.getRecurrenceType().equals(RecurrenceType.DAILY)) {
meeting = new MeetingBO(form.getRecurDayShort(), startDate, MeetingType.CUSTOMER_MEETING, form.getMeetingPlace());
} else if (form.isMonthlyOnDate()) {
meeting = new MeetingBO(form.getMonthDayValue(), form.getDayRecurMonthValue(), startDate,
MeetingType.CUSTOMER_MEETING, form.getMeetingPlace());
} else {
meeting = new MeetingBO(form.getMonthWeekValue(), form.getMonthRankValue(), form.getRecurMonthValue(),
startDate, MeetingType.CUSTOMER_MEETING, form.getMeetingPlace());
}
return meeting;
}
private ActionForwards forwardForCreate(CustomerLevel customerLevel) {
if (customerLevel.equals(CustomerLevel.CENTER)) {
return ActionForwards.loadCreateCenter;
} else if (customerLevel.equals(CustomerLevel.GROUP)) {
return ActionForwards.loadCreateGroup;
} else {
return ActionForwards.loadCreateClient;
}
}
private ActionForwards forwardForUpdate(CustomerLevel customerLevel) {
if (customerLevel.equals(CustomerLevel.CENTER)) {
return ActionForwards.center_detail_page;
} else if (customerLevel.equals(CustomerLevel.GROUP)) {
return ActionForwards.group_detail_page;
} else {
return ActionForwards.client_detail_page;
}
}
private void clearActionForm(MeetingActionForm form) {
form.setFrequency(RecurrenceType.WEEKLY.getValue().toString());
form.setMonthType(null);
form.setWeekDay(null);
form.setRecurWeek(null);
form.setMonthDay(null);
form.setDayRecurMonth(null);
form.setMonthWeek(null);
form.setMonthRank(null);
form.setRecurMonth(null);
form.setMeetingPlace(null);
form.setInput(null);
form.setMeetingStartDate(null);
form.setRecurDay(null);
}
}