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