/* * 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.ui.core.controller; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.joda.time.DateTime; import org.mifos.application.admin.servicefacade.AdminServiceFacade; import org.mifos.application.admin.servicefacade.OfficeServiceFacade; import org.mifos.application.admin.servicefacade.PersonnelServiceFacade; import org.mifos.dto.domain.AddressDto; import org.mifos.dto.domain.CreateOrUpdatePersonnelInformation; import org.mifos.dto.domain.CustomFieldDto; import org.mifos.dto.domain.MandatoryHiddenFieldsDto; import org.mifos.dto.domain.OfficeDto; import org.mifos.dto.domain.OfficeHierarchyDto; import org.mifos.dto.domain.UserDetailDto; import org.mifos.dto.screen.DefinePersonnelDto; import org.mifos.dto.screen.ListElement; import org.mifos.dto.screen.OnlyBranchOfficeHierarchyDto; import org.mifos.dto.screen.PersonnelDetailsDto; import org.mifos.dto.screen.PersonnelInformationDto; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @Controller public class SystemUserController { @Autowired private OfficeServiceFacade officeServiceFacade; @Autowired private AdminServiceFacade adminServiceFacade; @Autowired private PersonnelServiceFacade personnelServiceFacade; protected SystemUserController() { // default contructor for spring autowiring } public SystemUserController(final OfficeServiceFacade serviceFacade, final PersonnelServiceFacade personnelServiceFacade) { this.officeServiceFacade = serviceFacade; this.personnelServiceFacade = personnelServiceFacade; } @SuppressWarnings("PMD") public OfficeHierarchyFormBean showBranchHierarchy() { OnlyBranchOfficeHierarchyDto hierarchy = this.officeServiceFacade.retrieveBranchOnlyOfficeHierarchy(); List<BranchOnlyHierarchyBean> branchOnlyHierarchyList = new ArrayList<BranchOnlyHierarchyBean>(); for (OfficeHierarchyDto office : hierarchy.getBranchOnlyOfficeHierarchy()) { BranchOnlyHierarchyBean branchOnlyHierarchyBean = new BranchOnlyHierarchyBean(); branchOnlyHierarchyBean.setId(office.getOfficeId().intValue()); branchOnlyHierarchyBean.setName(office.getOfficeName()); List<ListElement> branches = new ArrayList<ListElement>(); for (OfficeHierarchyDto child : office.getChildren()) { branches.add(new ListElement(child.getOfficeId().intValue(), child.getOfficeName())); } branchOnlyHierarchyBean.setChildren(branches); branchOnlyHierarchyList.add(branchOnlyHierarchyBean); } List<OfficeDto> nonBranchOffices = this.officeServiceFacade.retrieveAllNonBranchOfficesApplicableToLoggedInUser(); List<ListElement> nonBranches = new ArrayList<ListElement>(); for (OfficeDto office : nonBranchOffices) { nonBranches.add(new ListElement(office.getId().intValue(), office.getName())); } OfficeHierarchyFormBean bean = new OfficeHierarchyFormBean(); bean.setNonBranches(nonBranches); bean.setBranchOnlyOfficeHierarchy(branchOnlyHierarchyList); return bean; } public UserFormBean createUserFormBean(final Long officeId, final UserFormBean formBean) { OfficeDto selectedOffice = this.officeServiceFacade.retrieveOfficeById(officeId.shortValue()); formBean.setOfficeId(officeId); formBean.setOfficeName(selectedOffice.getName()); MandatoryHiddenFieldsDto dtoFields = this.adminServiceFacade.retrieveHiddenMandatoryFields(); formBean.getAddress().setAddress1Mandatory(dtoFields.isMandatorySystemAddress1()); formBean.getAddress().setAddress2Hidden(dtoFields.isHideSystemAddress2()); formBean.getAddress().setAddress3Hidden(dtoFields.isHideSystemAddress3()); formBean.getAddress().setCityDistrictHidden(dtoFields.isHideSystemCity()); formBean.getAddress().setStateHidden(dtoFields.isHideSystemState()); formBean.getAddress().setCountryHidden(dtoFields.isHideSystemCountry()); formBean.getAddress().setPostalCodeHidden(dtoFields.isHideSystemPostalCode()); DefinePersonnelDto userRefData = this.personnelServiceFacade.retrieveInfoForNewUserDefinition(officeId.shortValue()); Map<String, String> genderOptions = new LinkedHashMap<String, String>(); for (ListElement option : userRefData.getGenderList()) { genderOptions.put(option.getId().toString(), option.getName()); } formBean.setGenderOptions(genderOptions); Map<String, String> maritalStatusOptions = new LinkedHashMap<String, String>(); for (ListElement option : userRefData.getMaritalStatusList()) { maritalStatusOptions.put(option.getId().toString(), option.getName()); } formBean.setMaritalStatusOptions(maritalStatusOptions); Map<String, String> preferredLanguageOptions = new LinkedHashMap<String, String>(); for (ListElement option : userRefData.getLanguageList()) { preferredLanguageOptions.put(option.getId().toString(), option.getName()); } formBean.setPreferredLanguageOptions(preferredLanguageOptions); Map<String, String> userTitleOptions = new LinkedHashMap<String, String>(); for (ListElement option : userRefData.getTitleList()) { userTitleOptions.put(option.getId().toString(), option.getName()); } formBean.setUserTitleOptions(userTitleOptions); Map<String, String> userHierarchyOptions = new LinkedHashMap<String, String>(); for (ListElement option : userRefData.getPersonnelLevelList()) { userHierarchyOptions.put(option.getId().toString(), option.getName()); } formBean.setUserHierarchyOptions(userHierarchyOptions); Map<String, String> availableRolesOptions = new LinkedHashMap<String, String>(); for (ListElement option : userRefData.getRolesList()) { availableRolesOptions.put(option.getId().toString(), option.getName()); } formBean.setAvailableRolesOptions(availableRolesOptions); formBean.setSelectedRolesOptions(new LinkedHashMap<String, String>()); DateTime today = new DateTime(); formBean.setMfiJoiningDateDay(today.getDayOfMonth()); formBean.setMfiJoiningDateMonth(today.getMonthOfYear()); formBean.setMfiJoiningDateYear(today.getYearOfEra()); return formBean; } public void updateUser(final UserFormBean userFormBean) { CreateOrUpdatePersonnelInformation personnel = translateUserFormBeanToDto(userFormBean); this.personnelServiceFacade.updatePersonnel(personnel); } public UserDetailDto createUser(final UserFormBean userFormBean) { CreateOrUpdatePersonnelInformation personnel = translateUserFormBeanToDto(userFormBean); return this.personnelServiceFacade.createPersonnelInformation(personnel); } @SuppressWarnings("PMD") private CreateOrUpdatePersonnelInformation translateUserFormBeanToDto(final UserFormBean userFormBean) { Short officeId = userFormBean.getOfficeId().shortValue(); String firstName = userFormBean.getFirstName(); String middleName = userFormBean.getMiddleName(); String secondLastName = userFormBean.getSecondLastName(); String lastName = userFormBean.getLastName(); String governmentIdNumber = userFormBean.getGovernmentId(); DateTime dateOfBirth = userFormBean.getDateOfBirthAsDateTime(); DateTime mfiJoiningDate = userFormBean.getMfiJoiningDateAsDateTime(); DateTime branchJoiningDate = userFormBean.getMfiJoiningDateAsDateTime(); DateTime passwordExpirationDate = userFormBean.getPasswordExpirationDateAsDateTime(); String email = userFormBean.getEmail(); Integer maritalStatus = null; if (StringUtils.isNotBlank(userFormBean.getSelectedMaritalStatus())) { maritalStatus = Integer.valueOf(userFormBean.getSelectedMaritalStatus()); } Integer gender = Integer.valueOf(userFormBean.getSelectedGender()); Integer title = null; if (StringUtils.isNotBlank(userFormBean.getSelectedUserTitle())) { title = Integer.valueOf(userFormBean.getSelectedUserTitle()); } Short personnelLevelId = Short.valueOf(userFormBean.getSelectedUserHierarchy()); List<ListElement> roles = new ArrayList<ListElement>(); String[] selectedRoles = userFormBean.getSelectedRoles(); if (selectedRoles != null) { for (String role : selectedRoles) { roles.add(new ListElement(Integer.valueOf(role), userFormBean.getSelectedRolesOptions().get(role))); } } AddressBean bean = userFormBean.getAddress(); AddressDto address = new AddressDto(bean.getAddress1(), bean.getAddress2(), bean.getAddress3(), bean.getCityDistrict(), bean.getState(), bean.getCountry(), bean.getPostalCode(), bean.getTelephoneNumber()); Short preferredLocale = null; if (StringUtils.isNotBlank(userFormBean.getSelectedPreferredLanguage())) { preferredLocale = Short.valueOf(userFormBean.getSelectedPreferredLanguage()); } String password = userFormBean.getPassword(); String username = userFormBean.getUsername(); // FIXME - add status to screen and support translation from bean to DTO Short personnelStatusId = Short.valueOf("1"); // active List<CustomFieldDto> customFields = userFormBean.getCustomFields(); CreateOrUpdatePersonnelInformation personnel = new CreateOrUpdatePersonnelInformation(userFormBean.getUserId(), personnelLevelId, officeId, title, preferredLocale, password, username, email, roles, customFields, firstName, middleName, lastName, secondLastName, governmentIdNumber, dateOfBirth, maritalStatus, gender, mfiJoiningDate, branchJoiningDate, address, personnelStatusId, passwordExpirationDate); return personnel; } @ModelAttribute("userFormBean") @RequestMapping(value="viewSystemUserDetails.ftl") public UserFormBean viewSystemUserDetails(@RequestParam(value="id", required=true) Long userId) { UserFormBean formBean = new UserFormBean(); formBean.setUserId(userId); UserFormBean userFormBean = createPopulatedUserFormBean(userId, formBean); return userFormBean; } public UserFormBean createPopulatedUserFormBean(final Long userId, final UserFormBean formBean) { PersonnelInformationDto personnelInformation = this.personnelServiceFacade.getPersonnelInformationDto(userId, ""); UserFormBean populatedBean = createUserFormBean(personnelInformation.getOfficeId().longValue(), formBean); populatedBean.setUserId(userId); populatedBean.setStatusId(personnelInformation.getStatus().getId()); populatedBean.setDisplayName(personnelInformation.getDisplayName()); PersonnelDetailsDto details = personnelInformation.getPersonnelDetails(); populatedBean.setFirstName(details.getFirstName()); populatedBean.setMiddleName(details.getMiddleName()); populatedBean.setSecondLastName(details.getSecondLastName()); populatedBean.setLastName(details.getLastName()); populatedBean.setGovernmentId(details.getGovernmentIdNumber()); populatedBean.setEmail(personnelInformation.getEmailId()); populatedBean.setDateOfBirthDay(details.getDob().getDayOfMonth()); populatedBean.setDateOfBirthMonth(details.getDob().getMonthOfYear()); populatedBean.setDateOfBirthYear(details.getDob().getYearOfEra()); if (details.getDateOfJoiningMFI() != null) { populatedBean.setDateOfBirthDay(details.getPasswordExpirationDate().getDayOfMonth()); populatedBean.setDateOfBirthMonth(details.getPasswordExpirationDate().getMonthOfYear()); populatedBean.setDateOfBirthYear(details.getPasswordExpirationDate().getYearOfEra()); } if (details.getDateOfJoiningMFI() != null) { populatedBean.setMfiJoiningDateDay(details.getDateOfJoiningMFI().getDayOfMonth()); populatedBean.setMfiJoiningDateMonth(details.getDateOfJoiningMFI().getMonthOfYear()); populatedBean.setMfiJoiningDateYear(details.getDateOfJoiningMFI().getYearOfEra()); } populatedBean.setSelectedGender(details.getGender().toString()); if (details.getMaritalStatus() != null) { populatedBean.setSelectedMaritalStatus(details.getMaritalStatus().toString()); } if (personnelInformation.getPreferredLanguageId() != null) { populatedBean.setSelectedPreferredLanguage(personnelInformation.getPreferredLanguageId().toString()); } AddressDto address = details.getAddress(); AddressBean bean = populatedBean.getAddress(); bean.setAddress1(address.getLine1()); bean.setAddress2(address.getLine2()); bean.setAddress3(address.getLine3()); bean.setCityDistrict(address.getCity()); bean.setState(address.getState()); bean.setCountry(address.getCountry()); bean.setPostalCode(address.getZip()); bean.setTelephoneNumber(address.getPhoneNumber()); populatedBean.setAddress(bean); if (personnelInformation.getTitle() != null) { populatedBean.setSelectedUserTitle(personnelInformation.getTitle().toString()); } populatedBean.setSelectedUserHierarchy(personnelInformation.getLevelId().toString()); Set<ListElement> roles = personnelInformation.getPersonnelRoles(); String[] selectedRoles = new String[roles.size()]; int roleIndex = 0; for (ListElement listElement : roles) { selectedRoles[roleIndex] = listElement.getId().toString(); roleIndex++; } populatedBean.setSelectedRoles(selectedRoles); populatedBean.setUsername(personnelInformation.getUserName()); List<CustomFieldDto> currentBeanFields = new ArrayList<CustomFieldDto>(); List<CustomFieldDto> defaultBeanFields = populatedBean.getCustomFields(); for (CustomFieldDto customFieldDto : defaultBeanFields) { CustomFieldDto matchingField = findMatchingAndSetFieldValue(customFieldDto, personnelInformation.getCustomFields()); if (matchingField != null) { currentBeanFields.add(matchingField); } } populatedBean.setRecentNotes(personnelInformation.getRecentPersonnelNotes()); populatedBean.setCustomFields(currentBeanFields); populatedBean.prepareForPreview(); populatedBean.prepateForReEdit(); return populatedBean; } private CustomFieldDto findMatchingAndSetFieldValue(CustomFieldDto source, Set<CustomFieldDto> customFields) { CustomFieldDto match = null; for (CustomFieldDto possibleMatch : customFields) { if (source.getFieldId().equals(possibleMatch.getFieldId())) { source.setFieldValue(possibleMatch.getFieldValue()); match = source; } } return match; } }