package org.mifos.ui.core.controller;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import org.apache.commons.lang.StringUtils;
import org.mifos.application.admin.servicefacade.OfficeServiceFacade;
import org.mifos.dto.domain.OfficeDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping("/editOfficeInformation")
@SuppressWarnings("PMD")
public class EditOfficeInformationController {
@Autowired
OfficeServiceFacade officeServiceFacade;
private static final String REDIRECT_TO_ADMIN_SCREEN = "redirect:/AdminAction.do?method=load";
private static final String CANCEL_PARAM = "CANCEL";
private static final String PREVIEW_PARAM = "PREVIEW";
public EditOfficeInformationController(){
//empty controller for spring auto wiring
}
public EditOfficeInformationController(final OfficeServiceFacade officeServiceFacade){
this.officeServiceFacade=officeServiceFacade;
}
@RequestMapping(method=RequestMethod.GET)
public ModelAndView populateForm(HttpServletRequest request){
ModelAndView modelAndView = new ModelAndView();
Short officeId=officeServiceFacade.retrieveOfficeById(Short.parseShort(request.getParameter("officeLevelId"))).getLevelId();
OfficeDto officeDto= officeServiceFacade.retrieveOfficeById(Short.parseShort(request.getParameter("officeLevelId")));
OfficeFormBean formBean=new OfficeFormBean();
if(officeDto.getAddress()!=null){
formBean.setCity(officeDto.getAddress().getCity());
formBean.setCountry(officeDto.getAddress().getCountry());
formBean.setLine1(officeDto.getAddress().getLine1());
formBean.setLine2(officeDto.getAddress().getLine2());
formBean.setLine3(officeDto.getAddress().getLine3());
formBean.setZip(officeDto.getAddress().getZip());
formBean.setPhoneNumber(officeDto.getAddress().getPhoneNumber());
formBean.setState(officeDto.getAddress().getState());
}
if(officeDto.getCustomFields()!=null){
formBean.setCustomFields(officeDto.getCustomFields());
}
formBean.setGlobalNum(officeDto.getGlobalNum());
formBean.setId(officeDto.getId());
formBean.setLevelId(officeDto.getLevelId().toString());
formBean.setLookupNameKey(officeDto.getLookupNameKey());
formBean.setName(officeDto.getName());
formBean.setOfficeLevelName(officeDto.getOfficeLevelName());
formBean.setOfficeShortName(officeDto.getOfficeShortName());
formBean.setOfficeStatusName(officeDto.getOfficeStatusName());
if(officeDto.getLevelId()!=1){
formBean.setParentId(officeDto.getParentId().toString());
formBean.setParentOfficeName(officeDto.getParentOfficeName());
}
formBean.setSearchId(officeDto.getSearchId());
formBean.setStatusId(officeDto.getStatusId().toString());
formBean.setVersionNum(officeDto.getVersionNum());
modelAndView.addObject("officeFormBean", formBean);
modelAndView.addObject("parentOffices", getParentDetails(officeId.toString()));
modelAndView.addObject("view", "disable");
modelAndView.addObject("officeTypes", getOfficeTypes(officeDto.getLevelId().toString()));
modelAndView.addObject("showError", "false");
return modelAndView;
}
public Map<String, String> getParentDetails(String officelevelId){
List<OfficeDto> headOffices=officeServiceFacade.retrieveAllOffices().getHeadOffices();
List<OfficeDto> regionalOffices=officeServiceFacade.retrieveAllOffices().getRegionalOffices();
List<OfficeDto> divisionalOffices=officeServiceFacade.retrieveAllOffices().getDivisionalOffices();
List<OfficeDto> areaOffices=officeServiceFacade.retrieveAllOffices().getAreaOffices();
Map<String, String> parentOffices=new LinkedHashMap<String, String>();
if(!officelevelId.equals("")){
int officeId=Integer.parseInt(officelevelId);
if(officeId>=2){
for(OfficeDto officeDto:headOffices){
parentOffices.put(officeDto.getLevelId().toString(), "Head Office("+officeDto.getName()+")");
}
}
if(officeId>=3){
for(OfficeDto officeDto:regionalOffices){
parentOffices.put(officeDto.getLevelId().toString(), "Regional Office("+officeDto.getName()+")");
}
}
if(officeId>=4){
for(OfficeDto officeDto:divisionalOffices){
parentOffices.put(officeDto.getLevelId().toString(), "Divisional Office("+officeDto.getName()+")");
}
}
if(officeId>=5){
for(OfficeDto officeDto:areaOffices){
parentOffices.put(officeDto.getLevelId().toString(), "Area Office("+officeDto.getName()+")");
}
}
}else{
parentOffices.put("", "");
}
return parentOffices;
}
public Map<String, String> getOfficeTypes(String officeId){
Map<String, String> officeTypes=new LinkedHashMap<String, String>();
if(officeId.equals("1")){
officeTypes.put("1", "Head Office");
}else if(officeId.equals("new")){
officeTypes.put("1", "Head Office");
officeTypes.put("2", "Regional Office");
officeTypes.put("3", "Divisional Office");
officeTypes.put("4", "Area Office");
officeTypes.put("5", "Branch Office");
}else{
officeTypes.put("2", "Regional Office");
officeTypes.put("3", "Divisional Office");
officeTypes.put("4", "Area Office");
officeTypes.put("5", "Branch Office");
}
return officeTypes;
}
@RequestMapping(method = RequestMethod.POST)
public ModelAndView processFormSubmit(@RequestParam(value = CANCEL_PARAM, required = false) String cancel,@RequestParam(value = PREVIEW_PARAM, required = false) String preview,
@Valid @ModelAttribute("officeFormBean") OfficeFormBean formBean,
BindingResult result,
SessionStatus status) {
ModelAndView mav = new ModelAndView(REDIRECT_TO_ADMIN_SCREEN);
if (StringUtils.isNotBlank(cancel)) {
status.setComplete();
}
else if(StringUtils.isNotBlank(preview)){
if (result.hasErrors()) {
mav = new ModelAndView("editOfficeInformation");
mav.addObject("officeTypes", getOfficeTypes(formBean.getLevelId()));
if(!formBean.getLevelId().equals("1")){
mav.addObject("parentOffices", getParentDetails(officeServiceFacade.retrieveOfficeById(formBean.getId()).getLevelId().toString()));
formBean.setParentId(officeServiceFacade.retrieveOfficeById(formBean.getId()).getParentId().toString());
}
mav.addObject("showError", "true");
mav.addObject("officeTypes", getOfficeTypes(formBean.getLevelId()));
mav.addObject("officeFormBean", formBean);
mav.addObject("view", "enable");
}else {
if((!formBean.getLevelId().equals("1") && StringUtils.isNotBlank(formBean.getParentId())) || (formBean.getLevelId().equals("1") && !StringUtils.isNotBlank(formBean.getParentId()))){
mav = new ModelAndView("officePreview");
}else{
mav = new ModelAndView("editOfficeInformation");
result.addError(new ObjectError("parentLevelId", "Please specify Parent Level name"));
mav.addObject("showError", "true");
}
switch(Integer.parseInt(formBean.getLevelId())){
case 1:
formBean.setOfficeLevelName("Head Office");
break;
case 2:
formBean.setOfficeLevelName("Regional Office");
break;
case 3:
formBean.setOfficeLevelName("Divisional Office");
break;
case 4:
formBean.setOfficeLevelName("Area Office");
break;
default:
formBean.setOfficeLevelName("Branch Office");
break;
}
if(!formBean.getLevelId().equals("1")){
formBean.setParentOfficeName(officeServiceFacade.retrieveOfficeById(Short.parseShort(formBean.getParentId())).getName());
mav.addObject("parentOffices", getParentDetails(formBean.getLevelId()));
}
mav.addObject("officeTypes", getOfficeTypes(formBean.getLevelId()));
mav.addObject("officeFormBean",formBean);
}
}else{
mav = new ModelAndView("editOfficeInformation");
if(!formBean.getLevelId().equals("1")){
mav.addObject("parentOffices", getParentDetails(formBean.getLevelId()));
}
mav.addObject("officeTypes", getOfficeTypes(formBean.getLevelId()));
mav.addObject("officeFormBean", formBean);
mav.addObject("view", "enable");
mav.addObject("showError", "false");
}
return mav;
}
}