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.kns.web.struts.action.KualiTransactionalDocumentActionBase; 039 040 public class MissedPunchAction extends KualiTransactionalDocumentActionBase { 041 042 @Override 043 public ActionForward docHandler(ActionMapping mapping, ActionForm form, 044 HttpServletRequest request, HttpServletResponse response) 045 throws Exception { 046 ActionForward act = super.docHandler(mapping, form, request, response); 047 MissedPunchForm mpForm = (MissedPunchForm) form; 048 MissedPunchDocument mpDoc = (MissedPunchDocument) mpForm.getDocument(); 049 mpForm.setDocId(mpDoc.getTimesheetDocumentId()); 050 051 if (StringUtils.equals(request.getParameter("command"), "initiate")) { 052 String tdocId = request.getParameter("tdocid"); 053 TimesheetDocument timesheetDocument = TkServiceLocator.getTimesheetService().getTimesheetDocument(tdocId); 054 mpForm.setDocNum(mpDoc.getDocumentNumber()); 055 mpDoc.setPrincipalId(timesheetDocument.getPrincipalId()); 056 mpDoc.setTimesheetDocumentId(tdocId); 057 // set default document description 058 if (StringUtils.isEmpty(mpDoc.getDocumentHeader().getDocumentDescription())) { 059 mpDoc.getDocumentHeader().setDocumentDescription("Missed Punch: " + timesheetDocument.getPrincipalId()); 060 } 061 } 062 if (StringUtils.equals(request.getParameter("command"), "displayDocSearchView") 063 || StringUtils.equals(request.getParameter("command"), "displayActionListView")) { 064 TKUser.setTargetPerson(mpDoc.getPrincipalId()); 065 mpForm.setDocId(mpDoc.getDocumentNumber()); 066 } 067 // mpForm.setAssignmentReadOnly(true); 068 TkClockActionValuesFinder finder = new TkClockActionValuesFinder(); 069 List<KeyValue> keyLabels = (List<KeyValue>) finder.getKeyValues(); 070 if (keyLabels.size() == 2) { 071 // && !mpForm.getDocumentActions().containsKey(KNSConstants.KUALI_ACTION_CAN_EDIT)) { 072 Set<String> actions = TkConstants.CLOCK_ACTION_TRANSITION_MAP.get(TkConstants.CLOCK_IN); 073 boolean flag = true; 074 for (String entry : actions) { 075 if (!keyLabels.contains(new ConcreteKeyValue(entry, TkConstants.CLOCK_ACTION_STRINGS.get(entry)))) { 076 flag = false; 077 } 078 } 079 if (flag) { 080 mpForm.setAssignmentReadOnly(true); 081 } 082 } else if (keyLabels.size() == 1) { 083 Set<String> actions = TkConstants.CLOCK_ACTION_TRANSITION_MAP.get(TkConstants.LUNCH_IN); 084 boolean flag = true; 085 for (String entry : actions) { 086 if (!keyLabels.contains(new ConcreteKeyValue(entry, TkConstants.CLOCK_ACTION_STRINGS.get(entry)))) { 087 flag = false; 088 } 089 } 090 if (flag) { 091 mpForm.setAssignmentReadOnly(true); 092 } 093 } 094 095 ClockLog lastClock = TkServiceLocator.getClockLogService().getLastClockLog(TKUser.getCurrentTargetPersonId()); 096 if (lastClock != null && !StringUtils.equals(lastClock.getClockAction(), TkConstants.CLOCK_OUT)) { 097 MissedPunchDocument lastDoc = TkServiceLocator.getMissedPunchService().getMissedPunchByClockLogId(lastClock.getTkClockLogId()); 098 // Default the assignment if last clock was a clock in. 099 defaultMissedPunchAssignment(mpDoc, lastDoc, lastClock); 100 mpForm.setAssignmentReadOnly(true); 101 } else { 102 mpForm.setAssignmentReadOnly(false); 103 } 104 105 return act; 106 } 107 108 private void defaultMissedPunchAssignment(MissedPunchDocument mpDoc, MissedPunchDocument lastDoc, ClockLog lastClock) { 109 if (lastDoc != null) { // last action was a missed punch 110 mpDoc.setAssignment(lastDoc.getAssignment()); 111 } else { // last action was not a missed punch 112 AssignmentDescriptionKey adk = new AssignmentDescriptionKey(lastClock.getJobNumber().toString(), lastClock.getWorkArea().toString(), lastClock.getTask().toString()); 113 mpDoc.setAssignment(adk.toAssignmentKeyString()); 114 } 115 } 116 117 @Override 118 public ActionForward route(ActionMapping mapping, ActionForm form, 119 HttpServletRequest request, HttpServletResponse response) 120 throws Exception { 121 MissedPunchForm mpForm = (MissedPunchForm) form; 122 mpForm.setEditingMode(new HashMap()); 123 MissedPunchDocument mpDoc = (MissedPunchDocument) mpForm.getDocument(); 124 mpDoc.setDocumentStatus("R"); 125 request.setAttribute(TkConstants.DOCUMENT_ID_REQUEST_NAME, mpDoc.getDocumentNumber()); 126 request.setAttribute(TkConstants.TIMESHEET_DOCUMENT_ID_REQUEST_NAME, mpDoc.getTimesheetDocumentId()); 127 ActionForward fwd = super.route(mapping, mpForm, request, response); 128 TkServiceLocator.getMissedPunchService().addClockLogForMissedPunch(mpDoc); 129 mpForm.setDocId(mpDoc.getDocumentNumber()); 130 mpForm.setAssignmentReadOnly(true); 131 return fwd; 132 133 } 134 135 @Override 136 public ActionForward approve(ActionMapping mapping, ActionForm form, 137 HttpServletRequest request, HttpServletResponse response) 138 throws Exception { 139 MissedPunchForm mpForm = (MissedPunchForm) form; 140 MissedPunchDocument mpDoc = (MissedPunchDocument) mpForm.getDocument(); 141 mpDoc.setDocumentStatus("A"); 142 mpForm.setAssignmentReadOnly(true); 143 request.setAttribute(TkConstants.DOCUMENT_ID_REQUEST_NAME, mpDoc.getDocumentNumber()); 144 request.setAttribute(TkConstants.TIMESHEET_DOCUMENT_ID_REQUEST_NAME, mpDoc.getTimesheetDocumentId()); 145 TkServiceLocator.getMissedPunchService().updateClockLogAndTimeBlockIfNecessary(mpDoc); 146 ActionForward fwd = super.approve(mapping, form, request, response); 147 return fwd; 148 } 149 150 @Override 151 public ActionForward reload(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 152 MissedPunchForm mpForm = (MissedPunchForm) form; 153 MissedPunchDocument mpDoc = (MissedPunchDocument) mpForm.getDocument(); 154 request.setAttribute(TkConstants.DOCUMENT_ID_REQUEST_NAME, mpDoc.getDocumentNumber()); 155 request.setAttribute(TkConstants.TIMESHEET_DOCUMENT_ID_REQUEST_NAME, mpDoc.getTimesheetDocumentId()); 156 return super.reload(mapping, form, request, response); 157 } 158 159 @Override 160 public ActionForward save(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 161 MissedPunchForm mpForm = (MissedPunchForm) form; 162 mpForm.setEditingMode(new HashMap()); 163 MissedPunchDocument mpDoc = (MissedPunchDocument) mpForm.getDocument(); 164 mpDoc.setDocumentStatus("S"); 165 request.setAttribute(TkConstants.DOCUMENT_ID_REQUEST_NAME, mpDoc.getDocumentNumber()); 166 request.setAttribute(TkConstants.TIMESHEET_DOCUMENT_ID_REQUEST_NAME, mpDoc.getTimesheetDocumentId()); 167 ActionForward fwd = super.save(mapping, mpForm, request, response); 168 mpForm.setDocId(mpDoc.getDocumentNumber()); 169 mpForm.setAssignmentReadOnly(true); 170 return fwd; 171 172 } 173 }