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.missedpunch; 017 018 import java.util.HashMap; 019 import java.util.List; 020 import java.util.Set; 021 022 import javax.servlet.http.HttpServletRequest; 023 import javax.servlet.http.HttpServletResponse; 024 025 import org.apache.commons.lang.StringUtils; 026 import org.apache.struts.action.ActionForm; 027 import org.apache.struts.action.ActionForward; 028 import org.apache.struts.action.ActionMapping; 029 import org.kuali.hr.time.assignment.AssignmentDescriptionKey; 030 import org.kuali.hr.time.clocklog.ClockLog; 031 import org.kuali.hr.time.clocklog.TkClockActionValuesFinder; 032 import org.kuali.hr.time.service.base.TkServiceLocator; 033 import org.kuali.hr.time.timesheet.TimesheetDocument; 034 import org.kuali.hr.time.util.TKUser; 035 import org.kuali.hr.time.util.TkConstants; 036 import org.kuali.rice.core.api.util.ConcreteKeyValue; 037 import org.kuali.rice.core.api.util.KeyValue; 038 import org.kuali.rice.core.api.util.RiceConstants; 039 import org.kuali.rice.kew.api.KewApiConstants; 040 import org.kuali.rice.kew.api.KewApiServiceLocator; 041 import org.kuali.rice.kns.web.struts.action.KualiTransactionalDocumentActionBase; 042 import org.kuali.rice.krad.exception.ValidationException; 043 044 public class MissedPunchAction extends KualiTransactionalDocumentActionBase { 045 046 @Override 047 public ActionForward docHandler(ActionMapping mapping, ActionForm form, 048 HttpServletRequest request, HttpServletResponse response) 049 throws Exception { 050 //HACK!!! 051 MissedPunchForm mpForm = (MissedPunchForm) form; 052 String command = mpForm.getCommand(); 053 if (StringUtils.equals(KewApiConstants.INITIATE_COMMAND, command)) { 054 ((MissedPunchForm) form).setDocId(null); 055 } 056 //END HACK!!!! 057 058 ActionForward act = super.docHandler(mapping, form, request, response); 059 MissedPunchDocument mpDoc = (MissedPunchDocument) mpForm.getDocument(); 060 //mpForm.setDocId(mpDoc.getTimesheetDocumentId()); 061 062 if (StringUtils.equals(request.getParameter("command"), "initiate")) { 063 String tdocId = request.getParameter("tdocid"); 064 TimesheetDocument timesheetDocument = TkServiceLocator.getTimesheetService().getTimesheetDocument(tdocId); 065 mpForm.setDocNum(mpDoc.getDocumentNumber()); 066 mpDoc.setPrincipalId(timesheetDocument.getPrincipalId()); 067 mpDoc.setTimesheetDocumentId(tdocId); 068 // set default document description 069 070 if (StringUtils.isEmpty(mpDoc.getDocumentHeader().getDocumentDescription())) { 071 mpDoc.getDocumentHeader().setDocumentDescription("Missed Punch: " + timesheetDocument.getPrincipalId()); 072 } 073 } 074 if (StringUtils.equals(request.getParameter("command"), "displayDocSearchView") 075 || StringUtils.equals(request.getParameter("command"), "displayActionListView") 076 || StringUtils.equals(command, "displaySuperUserView")) { 077 TKUser.setTargetPerson(mpDoc.getPrincipalId()); 078 mpForm.setDocId(mpDoc.getDocumentNumber()); 079 } 080 // mpForm.setAssignmentReadOnly(true); 081 TkClockActionValuesFinder finder = new TkClockActionValuesFinder(); 082 List<KeyValue> keyLabels = (List<KeyValue>) finder.getKeyValues(); 083 if (keyLabels.size() == 2) { 084 // && !mpForm.getDocumentActions().containsKey(KNSConstants.KUALI_ACTION_CAN_EDIT)) { 085 Set<String> actions = TkConstants.CLOCK_ACTION_TRANSITION_MAP.get(TkConstants.CLOCK_IN); 086 boolean flag = true; 087 for (String entry : actions) { 088 if (!keyLabels.contains(new ConcreteKeyValue(entry, TkConstants.CLOCK_ACTION_STRINGS.get(entry)))) { 089 flag = false; 090 } 091 } 092 if (flag) { 093 mpForm.setAssignmentReadOnly(true); 094 } 095 } else if (keyLabels.size() == 1) { 096 Set<String> actions = TkConstants.CLOCK_ACTION_TRANSITION_MAP.get(TkConstants.LUNCH_IN); 097 boolean flag = true; 098 for (String entry : actions) { 099 if (!keyLabels.contains(new ConcreteKeyValue(entry, TkConstants.CLOCK_ACTION_STRINGS.get(entry)))) { 100 flag = false; 101 } 102 } 103 if (flag) { 104 mpForm.setAssignmentReadOnly(true); 105 } 106 } 107 108 ClockLog lastClock = TkServiceLocator.getClockLogService().getLastClockLog(TKUser.getCurrentTargetPersonId()); 109 if (lastClock != null && !StringUtils.equals(lastClock.getClockAction(), TkConstants.CLOCK_OUT)) { 110 MissedPunchDocument lastDoc = TkServiceLocator.getMissedPunchService().getMissedPunchByClockLogId(lastClock.getTkClockLogId()); 111 // Default the assignment if last clock was a clock in. 112 defaultMissedPunchAssignment(mpDoc, lastDoc, lastClock); 113 mpForm.setAssignmentReadOnly(true); 114 } else { 115 mpForm.setAssignmentReadOnly(false); 116 } 117 118 return act; 119 } 120 121 private void defaultMissedPunchAssignment(MissedPunchDocument mpDoc, MissedPunchDocument lastDoc, ClockLog lastClock) { 122 if (lastDoc != null) { // last action was a missed punch 123 mpDoc.setAssignment(lastDoc.getAssignment()); 124 } else { // last action was not a missed punch 125 AssignmentDescriptionKey adk = new AssignmentDescriptionKey(lastClock.getJobNumber().toString(), lastClock.getWorkArea().toString(), lastClock.getTask().toString()); 126 mpDoc.setAssignment(adk.toAssignmentKeyString()); 127 } 128 } 129 130 @Override 131 public ActionForward route(ActionMapping mapping, ActionForm form, 132 HttpServletRequest request, HttpServletResponse response) 133 throws Exception { 134 MissedPunchForm mpForm = (MissedPunchForm) form; 135 mpForm.setEditingMode(new HashMap()); 136 MissedPunchDocument mpDoc = (MissedPunchDocument) mpForm.getDocument(); 137 mpDoc.setDocumentStatus("R"); 138 request.setAttribute(TkConstants.DOCUMENT_ID_REQUEST_NAME, mpDoc.getDocumentNumber()); 139 request.setAttribute(TkConstants.TIMESHEET_DOCUMENT_ID_REQUEST_NAME, mpDoc.getTimesheetDocumentId()); 140 //TkServiceLocator.getMissedPunchService().addClockLogForMissedPunch(mpDoc); 141 mpForm.setDocId(mpDoc.getDocumentNumber()); 142 mpForm.setAssignmentReadOnly(true); 143 try { 144 return super.route(mapping, mpForm, request, response); 145 } catch (ValidationException e) { 146 mpForm.setAssignmentReadOnly(false); 147 return mapping.findForward(RiceConstants.MAPPING_BASIC); 148 } 149 } 150 151 @Override 152 public ActionForward approve(ActionMapping mapping, ActionForm form, 153 HttpServletRequest request, HttpServletResponse response) 154 throws Exception { 155 MissedPunchForm mpForm = (MissedPunchForm) form; 156 MissedPunchDocument mpDoc = (MissedPunchDocument) mpForm.getDocument(); 157 mpDoc.setDocumentStatus("A"); 158 mpForm.setAssignmentReadOnly(true); 159 request.setAttribute(TkConstants.DOCUMENT_ID_REQUEST_NAME, mpDoc.getDocumentNumber()); 160 request.setAttribute(TkConstants.TIMESHEET_DOCUMENT_ID_REQUEST_NAME, mpDoc.getTimesheetDocumentId()); 161 TkServiceLocator.getMissedPunchService().updateClockLogAndTimeBlockIfNecessary(mpDoc); 162 return super.approve(mapping, form, request, response); 163 } 164 165 @Override 166 public ActionForward reload(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 167 MissedPunchForm mpForm = (MissedPunchForm) form; 168 MissedPunchDocument mpDoc = (MissedPunchDocument) mpForm.getDocument(); 169 request.setAttribute(TkConstants.DOCUMENT_ID_REQUEST_NAME, mpDoc.getDocumentNumber()); 170 request.setAttribute(TkConstants.TIMESHEET_DOCUMENT_ID_REQUEST_NAME, mpDoc.getTimesheetDocumentId()); 171 return super.reload(mapping, form, request, response); 172 } 173 174 @Override 175 public ActionForward save(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 176 MissedPunchForm mpForm = (MissedPunchForm) form; 177 mpForm.setEditingMode(new HashMap()); 178 MissedPunchDocument mpDoc = (MissedPunchDocument) mpForm.getDocument(); 179 mpDoc.setDocumentStatus("S"); 180 request.setAttribute(TkConstants.DOCUMENT_ID_REQUEST_NAME, mpDoc.getDocumentNumber()); 181 request.setAttribute(TkConstants.TIMESHEET_DOCUMENT_ID_REQUEST_NAME, mpDoc.getTimesheetDocumentId()); 182 mpForm.setDocId(mpDoc.getDocumentNumber()); 183 mpForm.setAssignmentReadOnly(true); 184 try { 185 return super.save(mapping, mpForm, request, response); 186 } catch (ValidationException e) { 187 mpForm.setAssignmentReadOnly(false); 188 return mapping.findForward(RiceConstants.MAPPING_BASIC); 189 } 190 191 } 192 }