View Javadoc
1   /*
2    * The Kuali Financial System, a comprehensive financial management system for higher education.
3    * 
4    * Copyright 2005-2014 The Kuali Foundation
5    * 
6    * This program is free software: you can redistribute it and/or modify
7    * it under the terms of the GNU Affero General Public License as
8    * published by the Free Software Foundation, either version 3 of the
9    * License, or (at your option) any later version.
10   * 
11   * This program is distributed in the hope that it will be useful,
12   * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   * GNU Affero General Public License for more details.
15   * 
16   * You should have received a copy of the GNU Affero General Public License
17   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18   */
19  package org.kuali.kfs.module.tem.document.authorization;
20  
21  import java.util.Set;
22  
23  import org.apache.commons.lang.StringUtils;
24  import org.kuali.kfs.module.tem.TemConstants;
25  import org.kuali.kfs.module.tem.TemConstants.TravelAuthorizationParameters;
26  import org.kuali.kfs.module.tem.TemConstants.TravelEditMode;
27  import org.kuali.kfs.module.tem.TemWorkflowConstants;
28  import org.kuali.kfs.module.tem.document.TravelAuthorizationDocument;
29  import org.kuali.kfs.module.tem.document.TravelDocument;
30  import org.kuali.kfs.module.tem.document.service.TravelDocumentService;
31  import org.kuali.kfs.module.tem.service.TemProfileService;
32  import org.kuali.kfs.module.tem.service.TemRoleService;
33  import org.kuali.kfs.sys.KFSConstants;
34  import org.kuali.kfs.sys.KfsAuthorizationConstants;
35  import org.kuali.kfs.sys.context.SpringContext;
36  import org.kuali.kfs.sys.document.authorization.FinancialSystemTransactionalDocumentPresentationControllerBase;
37  import org.kuali.rice.core.api.config.property.ConfigurationService;
38  import org.kuali.rice.coreservice.framework.parameter.ParameterService;
39  import org.kuali.rice.kew.api.WorkflowDocument;
40  import org.kuali.rice.kew.api.action.ActionRequest;
41  import org.kuali.rice.kim.api.identity.Person;
42  import org.kuali.rice.kns.document.authorization.DocumentAuthorizer;
43  import org.kuali.rice.kns.service.DocumentHelperService;
44  import org.kuali.rice.krad.document.Document;
45  import org.kuali.rice.krad.util.GlobalVariables;
46  
47  /**
48   * Travel Document Presentation Controller
49   *
50   */
51  public class TravelDocumentPresentationController extends FinancialSystemTransactionalDocumentPresentationControllerBase{
52      protected volatile TravelDocumentService travelDocumentService;
53  
54      /**
55       * @see org.kuali.kfs.sys.document.authorization.FinancialSystemTransactionalDocumentPresentationControllerBase#getEditModes(org.kuali.rice.kns.document.Document)
56       */
57      @Override
58      public Set<String> getEditModes(Document document) {
59          Set<String> editModes = super.getEditModes(document);
60          ParameterService paramService = SpringContext.getBean(ParameterService.class);
61  
62          if (paramService.getParameterValueAsBoolean(TravelAuthorizationDocument.class, TravelAuthorizationParameters.DISPLAY_EMERGENCY_CONTACT_IND)) {
63              editModes.add(TemConstants.DISPLAY_EMERGENCY_CONTACT_TAB);
64          }
65  
66          editModes.add(KfsAuthorizationConstants.TransactionalEditMode.IMMEDIATE_DISBURSEMENT_ENTRY);
67          editModes.add(TemConstants.EditModes.CHECK_AMOUNT_ENTRY);
68  
69          if (document.getDocumentHeader().getWorkflowDocument().getNodeNames().contains(KFSConstants.RouteLevelNames.PAYMENT_METHOD)) {
70              editModes.add(KfsAuthorizationConstants.TransactionalEditMode.WIRE_ENTRY);
71              editModes.add(KfsAuthorizationConstants.TransactionalEditMode.FRN_ENTRY);
72          }
73  
74          if (document.getDocumentHeader().getWorkflowDocument().isInitiated() || document.getDocumentHeader().getWorkflowDocument().isSaved() || isActionRequestedOfCurrentUser(document)) {
75              editModes.add(TemConstants.EditModes.CONVERSION_RATE_ENTRY);
76          }
77          return editModes;
78      }
79  
80      /**
81       * Determines if there's an action request for the current user
82       * @param document the document to check action requests on
83       * @return true if there are action requests for the current user, false otherwise
84       */
85      protected boolean isActionRequestedOfCurrentUser(Document document) {
86          final Person currentUser = GlobalVariables.getUserSession().getPerson();
87          for (ActionRequest request : document.getDocumentHeader().getWorkflowDocument().getRootActionRequests()) {
88              if (request.getActionTaken() == null) {
89                  if (StringUtils.equals(currentUser.getPrincipalId(), request.getPrincipalId())) {
90                      return true;
91                  }
92                  if (request.getChildRequests() != null && !request.getChildRequests().isEmpty()) {
93                      for (ActionRequest childRequest : request.getChildRequests()) {
94                          if (StringUtils.equals(currentUser.getPrincipalId(), childRequest.getPrincipalId())) {
95                              return true;
96                          }
97                      }
98                  }
99              }
100         }
101         return false;
102     }
103 
104     /**
105      * Check user's edit permission in order to grant full entry edit
106      *
107      * When the document is routed to document manager's approval node, check for permission on document
108      * manager to get full edit
109      *
110      * @param document
111      * @param editModes
112      */
113     protected void addFullEntryEditMode(Document document, Set<String> editModes) {
114         WorkflowDocument workflowDocument = document.getDocumentHeader().getWorkflowDocument();
115         Person currentUser = GlobalVariables.getUserSession().getPerson();
116 
117         DocumentAuthorizer authorizer = getDocumentHelperService().getDocumentAuthorizer(document);
118         TravelArrangeableAuthorizer travelAuthorizer = (TravelArrangeableAuthorizer)authorizer;
119 
120         //check edit permission when document is in init or saved
121         if ((workflowDocument.isInitiated() || workflowDocument.isSaved())) {
122             //check for edit permission on the document
123             if (travelAuthorizer.canEditDocument(document, currentUser)){
124                 editModes.add(TravelEditMode.FULL_ENTRY);
125             }
126         } else if(isAtNode(workflowDocument, getDocumentManagerApprovalNode())){ //Document manager will also get full entry edit mode on the approval node
127             if (travelAuthorizer.canEditDocument(document, currentUser)){
128                 editModes.add(TravelEditMode.FULL_ENTRY);
129             }
130         }
131     }
132 
133     /**
134      * Check if workflow is at the specific node
135      *
136      * @param workflowDocument
137      * @param nodeName
138      * @return
139      */
140     public boolean isAtNode(WorkflowDocument workflowDocument, String nodeName) {
141         Set<String> nodeNames = workflowDocument.getNodeNames();
142         for (String nodeNamesNode : nodeNames) {
143             if (nodeName.equals(nodeNamesNode)) {
144                 return true;
145             }
146         }
147         return false;
148     }
149 
150     /**
151      * Get the Document Manager approval node
152      *
153      * Default to Travel Manager's - AP_TRAVEL
154      *
155      * @return
156      */
157     public String getDocumentManagerApprovalNode(){
158         return TemWorkflowConstants.RouteNodeNames.AP_TRAVEL;
159     }
160 
161     /**
162      * Check current user is the initiator
163      *
164      * @param workflowDocument
165      * @return
166      */
167     public boolean isInitiator(WorkflowDocument workflowDocument){
168         String docInitiator = workflowDocument.getInitiatorPrincipalId();
169         Person currentUser = GlobalVariables.getUserSession().getPerson();
170         return docInitiator.equals(currentUser.getPrincipalId());
171     }
172 
173     /**
174      * Determines if the given travel doc is the "root" travel document
175      * @param travelDoc the travel document to verify
176      * @return true if the travel document is the root document, false otherwise
177      */
178     protected boolean isRootTravelDocument(TravelDocument travelDoc) {
179         if (StringUtils.isBlank(travelDoc.getTravelDocumentIdentifier())) {
180             // no trip id?  then we must be the root
181             return true;
182         }
183         final TravelDocument baseTravelDocument = getTravelDocumentService().getParentTravelDocument(travelDoc.getTravelDocumentIdentifier());
184         return baseTravelDocument == null || StringUtils.equals(baseTravelDocument.getDocumentNumber(), travelDoc.getDocumentNumber());
185     }
186 
187     public ParameterService getParamService() {
188         return SpringContext.getBean(ParameterService.class);
189     }
190 
191     protected TemRoleService getTemRoleService() {
192         return SpringContext.getBean(TemRoleService.class);
193     }
194 
195     protected TemProfileService getTemProfileService() {
196         return SpringContext.getBean(TemProfileService.class);
197     }
198 
199     protected DocumentHelperService getDocumentHelperService() {
200         return SpringContext.getBean(DocumentHelperService.class);
201     }
202 
203     protected ConfigurationService getConfigurationService() {
204         return SpringContext.getBean(ConfigurationService.class);
205     }
206 
207     protected TravelDocumentService getTravelDocumentService() {
208         if (travelDocumentService == null) {
209             travelDocumentService = SpringContext.getBean(TravelDocumentService.class);
210         }
211         return travelDocumentService;
212     }
213 }