001 /**
002 * Copyright 2004-2014 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.kpme.tklm.time.missedpunch.web;
017
018 import java.util.Collections;
019 import java.util.List;
020 import java.util.Properties;
021 import java.util.Set;
022
023 import javax.servlet.http.HttpServletRequest;
024 import javax.servlet.http.HttpServletResponse;
025
026 import org.apache.commons.collections.CollectionUtils;
027 import org.apache.commons.lang.StringUtils;
028 import org.kuali.kpme.core.util.HrContext;
029 import org.kuali.kpme.core.util.TKUtils;
030 import org.kuali.kpme.tklm.common.TkConstants;
031 import org.kuali.kpme.tklm.time.clocklog.ClockLog;
032 import org.kuali.kpme.tklm.time.missedpunch.MissedPunch;
033 import org.kuali.kpme.tklm.time.missedpunch.MissedPunchDocument;
034 import org.kuali.kpme.tklm.time.service.TkServiceLocator;
035 import org.kuali.kpme.tklm.time.timesheet.TimesheetDocument;
036 import org.kuali.rice.core.api.config.property.ConfigContext;
037 import org.kuali.rice.kew.api.exception.WorkflowException;
038 import org.kuali.rice.krad.bo.Note;
039 import org.kuali.rice.krad.document.Document;
040 import org.kuali.rice.krad.exception.ValidationException;
041 import org.kuali.rice.krad.rules.rule.event.SaveDocumentEvent;
042 import org.kuali.rice.krad.service.KRADServiceLocator;
043 import org.kuali.rice.krad.service.SequenceAccessorService;
044 import org.kuali.rice.krad.uif.UifConstants;
045 import org.kuali.rice.krad.uif.UifParameters;
046 import org.kuali.rice.krad.uif.UifConstants.WorkflowAction;
047 import org.kuali.rice.krad.uif.component.Component;
048 import org.kuali.rice.krad.uif.container.CollectionGroup;
049 import org.kuali.rice.krad.uif.widget.Disclosure;
050 import org.kuali.rice.krad.util.GlobalVariables;
051 import org.kuali.rice.krad.util.KRADConstants;
052 import org.kuali.rice.krad.web.controller.DocumentControllerBase;
053 import org.kuali.rice.krad.web.controller.TransactionalDocumentControllerBase;
054 import org.kuali.rice.krad.web.form.DocumentFormBase;
055 import org.kuali.rice.krad.web.form.HistoryFlow;
056 import org.kuali.rice.krad.web.form.UifFormBase;
057 import org.springframework.stereotype.Controller;
058 import org.springframework.validation.BindingResult;
059 import org.springframework.web.bind.annotation.ModelAttribute;
060 import org.springframework.web.bind.annotation.RequestMapping;
061 import org.springframework.web.servlet.ModelAndView;
062
063 @Controller
064 @RequestMapping("/missedPunch")
065 public class MissedPunchDocumentController extends TransactionalDocumentControllerBase {
066
067 private transient SequenceAccessorService sequenceAccessorService;
068
069 @Override
070 protected DocumentFormBase createInitialForm(HttpServletRequest request) {
071 return new MissedPunchForm();
072 }
073
074 @Override
075 @RequestMapping(params = "methodToCall=start")
076 public ModelAndView start(@ModelAttribute("KualiForm") UifFormBase form, BindingResult result, HttpServletRequest request, HttpServletResponse response) {
077
078 MissedPunchForm missedPunchForm = (MissedPunchForm) form;
079 MissedPunch missedPunch = missedPunchForm.getMissedPunch();
080
081 TimesheetDocument timesheetDocument = TkServiceLocator.getTimesheetService().getTimesheetDocument(missedPunch.getTimesheetDocumentId());
082 if (timesheetDocument != null) {
083 missedPunch.setPrincipalId(timesheetDocument.getPrincipalId());
084 missedPunch.setTimesheetDocumentId(missedPunch.getTimesheetDocumentId());
085 }
086
087 ClockLog lastClock = TkServiceLocator.getClockLogService().getLastClockLog(HrContext.getTargetPrincipalId());
088 if (lastClock != null && !StringUtils.equals(lastClock.getClockAction(), TkConstants.CLOCK_OUT)) {
089 MissedPunch lastMissedPunch = TkServiceLocator.getMissedPunchService().getMissedPunchByClockLogId(lastClock.getTkClockLogId());
090 if (lastMissedPunch != null) {
091 missedPunch.setJobNumber(lastMissedPunch.getJobNumber());
092 missedPunch.setWorkArea(lastMissedPunch.getWorkArea());
093 missedPunch.setTask(lastMissedPunch.getTask());
094 } else {
095 missedPunch.setJobNumber(lastClock.getJobNumber());
096 missedPunch.setWorkArea(lastClock.getWorkArea());
097 missedPunch.setTask(lastClock.getTask());
098 }
099 }
100
101 missedPunchForm.setAssignmentReadOnly(isAssignmentReadOnly(missedPunch));
102
103 return super.start(missedPunchForm, result, request, response);
104 }
105
106 @Override
107 protected void createDocument(DocumentFormBase form) throws WorkflowException {
108 super.createDocument(form);
109
110 MissedPunchForm missedPunchForm = (MissedPunchForm) form;
111 MissedPunchDocument missedPunchDocument = (MissedPunchDocument) missedPunchForm.getDocument();
112
113 if (StringUtils.isEmpty(missedPunchDocument.getDocumentHeader().getDocumentDescription())) {
114 missedPunchDocument.getDocumentHeader().setDocumentDescription("Missed Punch: " + missedPunchForm.getMissedPunch().getPrincipalId());
115 }
116
117 missedPunchDocument.setTkMissedPunchId(missedPunchForm.getMissedPunch().getTkMissedPunchId());
118 missedPunchDocument.setMissedPunch(missedPunchForm.getMissedPunch());
119 }
120
121 @RequestMapping(params = "methodToCall=submit")
122 public ModelAndView submit(@ModelAttribute("KualiForm") DocumentFormBase form, BindingResult result, HttpServletRequest request, HttpServletResponse response) throws Exception {
123 MissedPunchForm missedPunchForm = (MissedPunchForm) form;
124
125 createDocument(missedPunchForm);
126 ModelAndView modelAndView = null;
127 try {
128 missedPunchForm.getDocument().validateBusinessRules(new SaveDocumentEvent( missedPunchForm.getDocument()));
129
130 if (GlobalVariables.getMessageMap().hasNoErrors()) {
131 modelAndView = save(missedPunchForm, result, request, response);
132
133 if (StringUtils.isNotBlank(missedPunchForm.getMissedPunch().getNote())) {
134 Document doc = missedPunchForm.getDocument();
135 Note note = new Note();
136 note.setNoteText(missedPunchForm.getMissedPunch().getNote());
137 note.setAuthorUniversalIdentifier(HrContext.getPrincipalId());
138 note.setNotePostedTimestampToCurrent();
139 doc.setNotes(Collections.<Note>singletonList(note));
140 }
141 modelAndView = route(missedPunchForm, result, request, response);
142 missedPunchForm.setMissedPunchSubmitted(true);
143
144 return modelAndView;
145 }
146
147
148 } catch (ValidationException exception) {
149 //ignore
150 }
151 return getUIFModelAndView(form);
152 }
153
154 @Override
155 @RequestMapping(params = "methodToCall=route")
156 public ModelAndView route(@ModelAttribute("KualiForm") DocumentFormBase form, BindingResult result, HttpServletRequest request, HttpServletResponse response) {
157
158 MissedPunchForm missedPunchForm = (MissedPunchForm) form;
159 MissedPunchDocument missedPunchDocument = (MissedPunchDocument) missedPunchForm.getDocument();
160 MissedPunch missedPunch = (MissedPunch) missedPunchDocument.getMissedPunch();
161 TkServiceLocator.getMissedPunchService().addClockLog(missedPunch, TKUtils.getIPAddressFromRequest(request.getRemoteAddr()));
162
163 missedPunchDocument.setMissedPunch(missedPunch);
164 missedPunchForm.setDocument(missedPunchDocument);
165
166 return super.route(missedPunchForm, result, request, response);
167 }
168
169 @Override
170 @RequestMapping(params = "methodToCall=approve")
171 public ModelAndView approve(@ModelAttribute("KualiForm") DocumentFormBase form, BindingResult result, HttpServletRequest request, HttpServletResponse response) throws Exception {
172 MissedPunchDocument missedPunchDocument = (MissedPunchDocument) form.getDocument();
173 MissedPunch missedPunch = (MissedPunch) missedPunchDocument.getMissedPunch();
174 TkServiceLocator.getMissedPunchService().updateClockLog(missedPunch, TKUtils.getIPAddressFromRequest(request.getRemoteAddr()));
175
176 return super.approve(form, result, request, response);
177 }
178
179 protected boolean isAssignmentReadOnly(MissedPunch missedPunch) {
180 boolean isAssignmentReadOnly = false;
181
182 if (StringUtils.isNotBlank(missedPunch.getClockAction())) {
183 Set<String> availableActions = TkConstants.CLOCK_AVAILABLE_ACTION_MAP.get(missedPunch.getClockAction());
184 if (availableActions.contains(TkConstants.CLOCK_OUT)) {
185 isAssignmentReadOnly = true;
186 }
187 } else {
188 ClockLog lastClock = TkServiceLocator.getClockLogService().getLastClockLog(HrContext.getTargetPrincipalId());
189 if (lastClock != null) {
190 if (!StringUtils.equals(lastClock.getClockAction(), TkConstants.CLOCK_OUT)) {
191 isAssignmentReadOnly = true;
192 }
193 }
194 }
195
196 return isAssignmentReadOnly;
197 }
198
199 protected SequenceAccessorService getSequenceAccessorService() {
200 if (sequenceAccessorService == null) {
201 sequenceAccessorService = KRADServiceLocator.getSequenceAccessorService();
202 }
203 return sequenceAccessorService;
204 }
205
206 public void setSequenceAccessorService(SequenceAccessorService sequenceAccessorService) {
207 this.sequenceAccessorService = sequenceAccessorService;
208 }
209
210 @Override
211 @RequestMapping(params = "methodToCall=docHandler")
212 public ModelAndView docHandler(@ModelAttribute("KualiForm") DocumentFormBase form, BindingResult result,
213 HttpServletRequest request, HttpServletResponse response) throws Exception {
214 ModelAndView mav = super.docHandler(form, result, request, response);
215
216 //return getUIFModelAndView(form);
217 List<? extends Component> pageComponents = ((MissedPunchForm)form).getView().getItems().get(0).getItems();
218 for (Component c : pageComponents) {
219 if (c instanceof CollectionGroup) {
220 CollectionGroup collGroup = (CollectionGroup)c;
221 if (CollectionUtils.isNotEmpty(collGroup.getItems())) {
222 Disclosure disclosure = collGroup.getDisclosure();
223 disclosure.setDefaultOpen(true);
224 }
225 }
226 }
227 return mav;
228 }
229
230 @Override
231 @RequestMapping(params = "methodToCall=back")
232 public ModelAndView back(@ModelAttribute("KualiForm") UifFormBase form,
233 BindingResult result, HttpServletRequest request,
234 HttpServletResponse response) {
235 if (!StringUtils.contains(form.getReturnLocation(), "dataObjectClassName="+MissedPunch.class.getName())) {
236 form.setReturnLocation(UifConstants.NO_RETURN);
237 }
238 return super.back(form, result, request, response);
239 }
240
241 }