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.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.lm.leaveSummary.LeaveSummary; 036 import org.kuali.hr.lm.leaveblock.LeaveBlock; 037 import org.kuali.hr.lm.leavecalendar.validation.LeaveCalendarValidationUtil; 038 import org.kuali.hr.time.assignment.Assignment; 039 import org.kuali.hr.time.assignment.AssignmentDescriptionKey; 040 import org.kuali.hr.time.calendar.CalendarEntries; 041 import org.kuali.hr.time.detail.validation.TimeDetailValidationUtil; 042 import org.kuali.hr.time.earncode.EarnCode; 043 import org.kuali.hr.time.service.base.TkServiceLocator; 044 import org.kuali.hr.time.timesheet.web.TimesheetAction; 045 import org.kuali.hr.time.util.TKContext; 046 import org.kuali.hr.time.util.TKUtils; 047 import org.kuali.hr.time.util.TkConstants; 048 import org.kuali.rice.kns.web.struts.form.KualiMaintenanceForm; 049 import org.kuali.rice.krad.util.ObjectUtils; 050 051 public class TimeDetailWSAction extends TimesheetAction { 052 053 private static final Logger LOG = Logger.getLogger(TimeDetailWSAction.class); 054 055 @Override 056 public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 057 return super.execute(mapping, form, request, response); 058 } 059 060 /** 061 * This is an ajax call triggered after a user submits the time entry form. 062 * If there is any error, it will return error messages as a json object. 063 * 064 * @param mapping 065 * @param form 066 * @param request 067 * @param response 068 * @return jsonObj 069 * @throws Exception 070 */ 071 @SuppressWarnings("unchecked") 072 public ActionForward validateTimeEntry(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 073 TimeDetailActionFormBase tdaf = (TimeDetailActionFormBase) form; 074 JSONArray errorMsgList = new JSONArray(); 075 List<String> errors; 076 077 EarnCode ec = TkServiceLocator.getEarnCodeService().getEarnCode(tdaf.getSelectedEarnCode(), tdaf.getTimesheetDocument().getAsOfDate()); 078 if(ec != null 079 && (ec.getLeavePlan() != null || ec.getEligibleForAccrual().equals("N"))) { // leave blocks changes 080 errors = this.validateLeaveEntry(tdaf); 081 } else { // time blocks changes 082 errors = TimeDetailValidationUtil.validateTimeEntryDetails(tdaf); 083 } 084 085 // List<String> errors = TimeDetailValidationService.validateTimeEntryDetails(tdaf); 086 errorMsgList.addAll(errors); 087 088 tdaf.setOutputString(JSONValue.toJSONString(errorMsgList)); 089 return mapping.findForward("ws"); 090 } 091 092 public List<String> validateLeaveEntry(TimeDetailActionFormBase tdaf) throws Exception { 093 List<String> errorMsgList = new ArrayList<String>(); 094 CalendarEntries payCalendarEntry = tdaf.getPayCalendarDates(); 095 if(ObjectUtils.isNotNull(payCalendarEntry)) { 096 LeaveSummary ls = TkServiceLocator.getLeaveSummaryService().getLeaveSummary(TKContext.getTargetPrincipalId(), tdaf.getPayCalendarDates()); 097 LeaveBlock lb = null; 098 if(StringUtils.isNotEmpty(tdaf.getLmLeaveBlockId())) { 099 lb = TkServiceLocator.getLeaveBlockService().getLeaveBlock(tdaf.getLmLeaveBlockId()); 100 } 101 102 // Validate LeaveBlock timings and all that 103 errorMsgList.addAll(LeaveCalendarValidationUtil.validateParametersForLeaveEntry(tdaf.getSelectedEarnCode(), tdaf.getPayCalendarDates(), 104 tdaf.getStartDate(), tdaf.getEndDate(), tdaf.getStartTime(), tdaf.getEndTime(), tdaf.getSelectedAssignment(), null, tdaf.getLmLeaveBlockId())); 105 106 errorMsgList.addAll(LeaveCalendarValidationUtil.validateAvailableLeaveBalanceForUsage(tdaf.getSelectedEarnCode(), 107 tdaf.getStartDate(), tdaf.getEndDate(), tdaf.getLeaveAmount(), lb)); 108 //Validate leave block does not exceed max usage. Leave Calendar Validators at this point rely on a leave summary. 109 errorMsgList.addAll(LeaveCalendarValidationUtil.validateLeaveAccrualRuleMaxUsage(ls, tdaf.getSelectedEarnCode(), 110 tdaf.getStartDate(), tdaf.getEndDate(), tdaf.getLeaveAmount(), lb)); 111 } 112 return errorMsgList; 113 } 114 115 116 //this is an ajax call for the assignment maintenance page 117 public ActionForward getDepartmentForJobNumber(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 118 KualiMaintenanceForm kualiForm = (KualiMaintenanceForm) form; 119 120 String principalId = (String) request.getAttribute("principalId"); 121 Long jobNumber = (Long) request.getAttribute("jobNumber"); 122 123 Job job = TkServiceLocator.getJobService().getJob(principalId, jobNumber, TKUtils.getCurrentDate()); 124 kualiForm.setAnnotation(job.getDept()); 125 126 return mapping.findForward("ws"); 127 } 128 129 public ActionForward getEarnCodeJson(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 130 TimeDetailWSActionForm tdaf = (TimeDetailWSActionForm) form; 131 List<Map<String, Object>> earnCodeList = new LinkedList<Map<String, Object>>(); 132 133 if (StringUtils.isNotBlank(tdaf.getSelectedAssignment())) { 134 List<Assignment> assignments = tdaf.getTimesheetDocument().getAssignments(); 135 AssignmentDescriptionKey key = new AssignmentDescriptionKey(tdaf.getSelectedAssignment()); 136 for (Assignment assignment : assignments) { 137 if (assignment.getJobNumber().compareTo(key.getJobNumber()) == 0 && 138 assignment.getWorkArea().compareTo(key.getWorkArea()) == 0 && 139 assignment.getTask().compareTo(key.getTask()) == 0) { 140 List<EarnCode> earnCodes = TkServiceLocator.getEarnCodeService().getEarnCodesForTime(assignment, tdaf.getTimesheetDocument().getAsOfDate()); 141 for (EarnCode earnCode : earnCodes) { 142 Map<String, Object> earnCodeMap = new HashMap<String, Object>(); 143 earnCodeMap.put("assignment", assignment.getAssignmentKey()); 144 earnCodeMap.put("earnCode", earnCode.getEarnCode()); 145 earnCodeMap.put("desc", earnCode.getDescription()); 146 earnCodeMap.put("type", earnCode.getEarnCodeType()); 147 // for leave blocks 148 earnCodeMap.put("leavePlan", earnCode.getLeavePlan()); 149 if(StringUtils.isNotEmpty(earnCode.getLeavePlan())) { 150 earnCodeMap.put("fractionalTimeAllowed", earnCode.getFractionalTimeAllowed()); 151 earnCodeMap.put("unitOfTime", ActionFormUtils.getUnitOfTimeForEarnCode(earnCode)); 152 } 153 earnCodeMap.put("eligibleForAccrual", earnCode.getEligibleForAccrual()); 154 earnCodeList.add(earnCodeMap); 155 } 156 } 157 } 158 } 159 LOG.info(tdaf.toString()); 160 tdaf.setOutputString(JSONValue.toJSONString(earnCodeList)); 161 return mapping.findForward("ws"); 162 } 163 164 public ActionForward getOvertimeEarnCodes(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 165 TimeDetailWSActionForm tdaf = (TimeDetailWSActionForm) form; 166 List<EarnCode> overtimeEarnCodes = TkServiceLocator.getEarnCodeService().getOvertimeEarnCodes(TKUtils.getCurrentDate()); 167 List<Map<String, Object>> overtimeEarnCodeList = new LinkedList<Map<String, Object>>(); 168 169 for (EarnCode earnCode : overtimeEarnCodes) { 170 Map<String, Object> earnCodeMap = new HashMap<String, Object>(); 171 earnCodeMap.put("earnCode", earnCode.getEarnCode()); 172 earnCodeMap.put("desc", earnCode.getDescription()); 173 174 overtimeEarnCodeList.add(earnCodeMap); 175 } 176 177 LOG.info(tdaf.toString()); 178 tdaf.setOutputString(JSONValue.toJSONString(overtimeEarnCodeList)); 179 return mapping.findForward("ws"); 180 } 181 182 }