001    /**
002     * Copyright 2004-2013 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.hr.time.department;
017    
018    import org.apache.commons.lang.StringUtils;
019    import org.kuali.hr.time.HrBusinessObject;
020    import org.kuali.hr.time.roles.TkRole;
021    import org.kuali.hr.time.service.base.TkServiceLocator;
022    import org.kuali.hr.time.util.HrBusinessObjectMaintainableImpl;
023    import org.kuali.hr.time.util.TKContext;
024    import org.kuali.rice.kim.api.identity.principal.Principal;
025    import org.kuali.rice.kim.api.services.KimApiServiceLocator;
026    import org.kuali.rice.kns.document.MaintenanceDocument;
027    import org.kuali.rice.kns.maintenance.Maintainable;
028    import org.kuali.rice.kns.web.ui.Section;
029    import org.kuali.rice.krad.bo.PersistableBusinessObject;
030    import org.kuali.rice.krad.util.GlobalVariables;
031    import org.kuali.rice.krad.util.KRADConstants;
032    
033    import java.sql.Timestamp;
034    import java.util.ArrayList;
035    import java.util.List;
036    import java.util.Map;
037    
038    public class DepartmentMaintainableImpl extends HrBusinessObjectMaintainableImpl {
039    
040            private static final long serialVersionUID = -330523155799598560L;
041    
042        @Override
043            protected void setNewCollectionLineDefaultValues(String arg0,
044                            PersistableBusinessObject arg1) {
045            if(arg1 instanceof TkRole){
046                    TkRole role = (TkRole)arg1;
047                    Department dept = (Department) this.getBusinessObject();
048                    role.setEffectiveDate(dept.getEffectiveDate());
049            }
050                    super.setNewCollectionLineDefaultValues(arg0, arg1);
051            }
052    
053            @Override
054        public void processAfterEdit( MaintenanceDocument document, Map<String,String[]> parameters ) {
055            Department dOld = (Department)document.getOldMaintainableObject().getBusinessObject();
056            Department dNew = (Department)document.getNewMaintainableObject().getBusinessObject();
057    
058            TkServiceLocator.getDepartmentService().populateDepartmentRoles(dOld);
059            TkServiceLocator.getDepartmentService().populateDepartmentRoles(dNew);
060            super.processAfterEdit(document, parameters);
061        }
062            
063            @Override
064        public void addNewLineToCollection(String collectionName) {
065            if (collectionName.equals("roles")) {
066                    TkRole aRole = (TkRole)newCollectionLines.get(collectionName );
067                if ( aRole != null ) {
068                    if(!aRole.getPrincipalId().isEmpty()) {
069                            Principal aPerson = KimApiServiceLocator.getIdentityService().getPrincipal(aRole.getPrincipalId());
070                            if(aPerson == null) {
071                                    GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath(KRADConstants.MAINTENANCE_NEW_MAINTAINABLE +"roles", 
072                                                    "dept.role.person.notExist",aRole.getPrincipalId());
073                                    return;
074                            }
075                    }
076                }
077            }
078            super.addNewLineToCollection(collectionName);
079            }
080            
081            @SuppressWarnings("rawtypes")
082            @Override
083            public List getSections(MaintenanceDocument document,
084                            Maintainable oldMaintainable) {
085                    List sections = super.getSections(document, oldMaintainable);
086                    for (Object obj : sections) {
087                            Section sec = (Section) obj;
088                            if (document.isOldBusinessObjectInDocument()
089                                            && sec.getSectionId().equals("inactiveRoles")) {
090                                    sec.setHidden(false);
091                            } else if (!document.isOldBusinessObjectInDocument()
092                                            && sec.getSectionId().equals("inactiveRoles")) {
093                                    sec.setHidden(true);
094                            }
095                    }
096                    return sections;
097            }
098    
099            @Override
100            public HrBusinessObject getObjectById(String id) {
101                    return TkServiceLocator.getDepartmentService().getDepartment(id);
102            }
103    
104        @Override
105            public void customSaveLogic(HrBusinessObject hrObj) {
106                    Department department = (Department) hrObj;
107                    
108                    List<TkRole> roles = new ArrayList<TkRole>();
109                    roles.addAll(department.getRoles());
110                    roles.addAll(department.getInactiveRoles());
111                    roles.addAll(createInactiveRoles(department.getRoles()));
112    
113                    for (TkRole role : roles) {
114                            role.setDepartmentObj(department);
115                            role.setUserPrincipalId(TKContext.getPrincipalId());
116                    }
117                    department.setRoles(roles);
118                    
119                    TkServiceLocator.getTkRoleService().saveOrUpdate(roles);
120            }
121        
122        private List<TkRole> createInactiveRoles(List<TkRole> activeRoles) {
123            List<TkRole> inactiveRoles = new ArrayList<TkRole>();
124            
125            List<TkRole> oldRoles = new ArrayList<TkRole>();
126            List<TkRole> newRoles = new ArrayList<TkRole>();
127            
128            for (TkRole activeRole : activeRoles) {
129                            if (!StringUtils.isEmpty(activeRole.getHrRolesId())) {
130                                    oldRoles.add(activeRole);
131                            } else {
132                                    newRoles.add(activeRole);
133                            }
134            }
135            
136            for (TkRole newRole : newRoles) {
137                    for (TkRole oldRole : oldRoles) {
138                            if (StringUtils.equals(newRole.getRoleName(), oldRole.getRoleName()) 
139                     && StringUtils.equals(newRole.getPrincipalId(), oldRole.getPrincipalId())) {
140                                    TkRole newInactiveRole = new TkRole();
141                                    newInactiveRole.setPrincipalId(oldRole.getPrincipalId());
142                                    newInactiveRole.setRoleName(oldRole.getRoleName());
143                                    newInactiveRole.setWorkArea(oldRole.getWorkArea());
144                                    newInactiveRole.setDepartment(oldRole.getDepartment());
145                                    newInactiveRole.setChart(oldRole.getChart());
146                                    newInactiveRole.setHrDeptId(oldRole.getHrDeptId());
147                                    newInactiveRole.setPositionNumber(oldRole.getPositionNumber());
148                                    newInactiveRole.setExpirationDate(oldRole.getExpirationDate());
149                                    newInactiveRole.setEffectiveDate(newRole.getEffectiveDate());
150                                    newInactiveRole.setTimestamp(new Timestamp(System.currentTimeMillis()));
151                                            newInactiveRole.setUserPrincipalId(TKContext.getPrincipalId());
152                                    newInactiveRole.setActive(false);
153                                    
154                                    inactiveRoles.add(newInactiveRole);
155                            }
156                    }
157            }
158            
159            return inactiveRoles;
160        }
161    }