001    /**
002     * Copyright 2004-2012 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.detail.web;
017    
018    import java.util.ArrayList;
019    import java.util.HashMap;
020    import java.util.LinkedList;
021    import java.util.List;
022    import java.util.Map;
023    
024    import javax.servlet.http.HttpServletRequest;
025    import javax.servlet.http.HttpServletResponse;
026    
027    import org.apache.commons.lang.StringUtils;
028    import org.apache.log4j.Logger;
029    import org.apache.struts.action.ActionForm;
030    import org.apache.struts.action.ActionForward;
031    import org.apache.struts.action.ActionMapping;
032    import org.json.simple.JSONArray;
033    import org.json.simple.JSONValue;
034    import org.kuali.hr.job.Job;
035    import org.kuali.hr.time.assignment.Assignment;
036    import org.kuali.hr.time.assignment.AssignmentDescriptionKey;
037    import org.kuali.hr.time.detail.validation.TimeDetailValidationService;
038    import org.kuali.hr.time.earncode.EarnCode;
039    import org.kuali.hr.time.service.base.TkServiceLocator;
040    import org.kuali.hr.time.timesheet.web.TimesheetAction;
041    import org.kuali.hr.time.util.TKContext;
042    import org.kuali.hr.time.util.TKUtils;
043    import org.kuali.hr.time.util.TkConstants;
044    import org.kuali.rice.kns.web.struts.form.KualiMaintenanceForm;
045    
046    public class TimeDetailWSAction extends TimesheetAction {
047    
048        private static final Logger LOG = Logger.getLogger(TimeDetailWSAction.class);
049    
050        @Override
051        public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
052            return super.execute(mapping, form, request, response);
053        }
054    
055        /**
056         * This is an ajax call triggered after a user submits the time entry form.
057         * If there is any error, it will return error messages as a json object.
058         *
059         * @param mapping
060         * @param form
061         * @param request
062         * @param response
063         * @return jsonObj
064         * @throws Exception
065         */
066        @SuppressWarnings("unchecked")
067        public ActionForward validateTimeEntry(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
068            TimeDetailActionFormBase tdaf = (TimeDetailActionFormBase) form;
069            JSONArray errorMsgList = new JSONArray();
070    
071            List<String> errors = TimeDetailValidationService.validateTimeEntryDetails(tdaf);
072            errorMsgList.addAll(errors);
073    
074            tdaf.setOutputString(JSONValue.toJSONString(errorMsgList));
075            return mapping.findForward("ws");
076        }
077    
078        //this is an ajax call for the assignment maintenance page
079        public ActionForward getDepartmentForJobNumber(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
080            KualiMaintenanceForm kualiForm = (KualiMaintenanceForm) form;
081    
082            String principalId = (String) request.getAttribute("principalId");
083            Long jobNumber = (Long) request.getAttribute("jobNumber");
084    
085            Job job = TkServiceLocator.getJobService().getJob(principalId, jobNumber, TKUtils.getCurrentDate());
086            kualiForm.setAnnotation(job.getDept());
087    
088            return mapping.findForward("ws");
089        }
090    
091        public ActionForward getEarnCodeJson(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
092            TimeDetailWSActionForm tdaf = (TimeDetailWSActionForm) form;
093            List<Map<String, Object>> earnCodeList = new LinkedList<Map<String, Object>>();
094    
095            if (StringUtils.isNotBlank(tdaf.getSelectedAssignment())) {
096                List<Assignment> assignments = tdaf.getTimesheetDocument().getAssignments();
097                AssignmentDescriptionKey key = new AssignmentDescriptionKey(tdaf.getSelectedAssignment());
098                for (Assignment assignment : assignments) {
099                    if (assignment.getJobNumber().compareTo(key.getJobNumber()) == 0 &&
100                            assignment.getWorkArea().compareTo(key.getWorkArea()) == 0 &&
101                            assignment.getTask().compareTo(key.getTask()) == 0) {
102                        List<EarnCode> earnCodes = TkServiceLocator.getEarnCodeService().getEarnCodesForTime(assignment, tdaf.getTimesheetDocument().getAsOfDate());
103                        for (EarnCode earnCode : earnCodes) {
104                            // TODO: minimize / compress the crazy if logics below
105                            if (earnCode.getEarnCode().equals(TkConstants.HOLIDAY_EARN_CODE)
106                                    && !(TKContext.getUser().isSystemAdmin() || TKContext.getUser().isTimesheetApprover())) {
107                                continue;
108                            }
109                            if (!(assignment.getTimeCollectionRule().isClockUserFl() &&
110                                    StringUtils.equals(assignment.getJob().getPayTypeObj().getRegEarnCode(), earnCode.getEarnCode())
111                                    && StringUtils.equals(TKContext.getPrincipalId(), assignment.getPrincipalId()))) {
112                                Map<String, Object> earnCodeMap = new HashMap<String, Object>();
113                                earnCodeMap.put("assignment", assignment.getAssignmentKey());
114                                earnCodeMap.put("earnCode", earnCode.getEarnCode());
115                                earnCodeMap.put("desc", earnCode.getDescription());
116                                earnCodeMap.put("type", earnCode.getEarnCodeType());
117    
118                                earnCodeList.add(earnCodeMap);
119                            } else if(!StringUtils.equals(assignment.getJob().getPayTypeObj().getRegEarnCode(), earnCode.getEarnCode())){
120                                Map<String, Object> earnCodeMap = new HashMap<String, Object>();
121                                earnCodeMap.put("assignment", assignment.getAssignmentKey());
122                                earnCodeMap.put("earnCode", earnCode.getEarnCode());
123                                earnCodeMap.put("desc", earnCode.getDescription());
124                                earnCodeMap.put("type", earnCode.getEarnCodeType());
125    
126                                earnCodeList.add(earnCodeMap);
127                            }
128                        }
129                    }
130                }
131            }
132            LOG.info(tdaf.toString());
133            tdaf.setOutputString(JSONValue.toJSONString(earnCodeList));
134            return mapping.findForward("ws");
135        }
136    
137        private boolean shouldAddEarnCode(Assignment assignment, EarnCode earnCode, boolean isTimeBlockReadOnly) {
138    
139            Boolean shouldAddEarnCode;
140    
141            shouldAddEarnCode = earnCode.getEarnCode().equals(TkConstants.HOLIDAY_EARN_CODE)
142                    && !(TKContext.getUser().isSystemAdmin() || TKContext.getUser().isTimesheetApprover());
143    
144            shouldAddEarnCode |= !(assignment.getTimeCollectionRule().isClockUserFl() &&
145                    StringUtils.equals(assignment.getJob().getPayTypeObj().getRegEarnCode(), earnCode.getEarnCode()) &&
146                    StringUtils.equals(TKContext.getPrincipalId(), assignment.getPrincipalId()));
147    
148            // If the timeblock is readonly (happens when a sync user is editing a sync timeblock) and the earn code is RGH,
149            // it should still add the RGH earn code.
150            shouldAddEarnCode |= isTimeBlockReadOnly;
151    
152            return shouldAddEarnCode;
153    
154        }
155    
156        public ActionForward getOvertimeEarnCodes(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
157            TimeDetailWSActionForm tdaf = (TimeDetailWSActionForm) form;
158            List<EarnCode> overtimeEarnCodes = TkServiceLocator.getEarnCodeService().getOvertimeEarnCodes(TKUtils.getCurrentDate());
159            List<Map<String, Object>> overtimeEarnCodeList = new LinkedList<Map<String, Object>>();
160    
161            for (EarnCode earnCode : overtimeEarnCodes) {
162                Map<String, Object> earnCodeMap = new HashMap<String, Object>();
163                earnCodeMap.put("earnCode", earnCode.getEarnCode());
164                earnCodeMap.put("desc", earnCode.getDescription());
165    
166                overtimeEarnCodeList.add(earnCodeMap);
167            }
168    
169            LOG.info(tdaf.toString());
170            tdaf.setOutputString(JSONValue.toJSONString(overtimeEarnCodeList));
171            return mapping.findForward("ws");
172        }
173    
174    }