View Javadoc
1   /*
2    * Copyright 2008 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.ole.module.purap.document.authorization;
17  
18  import org.kuali.ole.module.purap.PurapAuthorizationConstants;
19  import org.kuali.ole.module.purap.PurapAuthorizationConstants.RequisitionEditMode;
20  import org.kuali.ole.module.purap.PurapConstants;
21  import org.kuali.ole.module.purap.PurapConstants.RequisitionSources;
22  import org.kuali.ole.module.purap.PurapConstants.RequisitionStatuses;
23  import org.kuali.ole.module.purap.PurapParameterConstants;
24  import org.kuali.ole.module.purap.businessobject.RequisitionItem;
25  import org.kuali.ole.module.purap.document.PurchasingAccountsPayableDocument;
26  import org.kuali.ole.module.purap.document.RequisitionDocument;
27  import org.kuali.ole.module.purap.document.service.PurapService;
28  import org.kuali.ole.sys.context.SpringContext;
29  import org.kuali.ole.sys.service.impl.OleParameterConstants;
30  import org.kuali.rice.coreservice.framework.parameter.ParameterService;
31  import org.kuali.rice.kew.api.WorkflowDocument;
32  import org.kuali.rice.krad.document.Document;
33  import org.kuali.rice.krad.util.ObjectUtils;
34  
35  import java.util.ArrayList;
36  import java.util.Iterator;
37  import java.util.List;
38  import java.util.Set;
39  
40  
41  public class RequisitionDocumentPresentationController extends PurchasingAccountsPayableDocumentPresentationController {
42  
43      @Override
44      public boolean canEdit(Document document) {
45          RequisitionDocument reqDocument = (RequisitionDocument) document;
46          // boolean canEdit = false;
47  
48          if (!RequisitionStatuses.APPDOC_IN_PROCESS.equals(reqDocument.getApplicationDocumentStatus()) &&
49                  !RequisitionStatuses.APPDOC_AWAIT_CONTENT_REVIEW.equals(reqDocument.getApplicationDocumentStatus()) &&
50                  !RequisitionStatuses.APPDOC_AWAIT_HAS_ACCOUNTING_LINES.equals(reqDocument.getApplicationDocumentStatus()) &&
51                  !RequisitionStatuses.APPDOC_AWAIT_FISCAL_REVIEW.equals(reqDocument.getApplicationDocumentStatus())) {
52                  /*!RequisitionStatuses.APPDOC_AWAIT_LICENSE_REVIEW.equals(reqDocument.getApplicationDocumentStatus())) {*/
53              //unless the Requisition is in process, awaiting content, awaiting accounting lines or awaiting fiscal, editing is not allowed
54              return false;
55          }
56          return super.canEdit(document);
57      }
58      /*@Override
59      public boolean canRoute(Document document) {
60          RequisitionDocument reqDocument = (RequisitionDocument)document;
61  
62          if ( StringUtils.endsWith( reqDocument.getLicensingRequirementCode(), "ALNC") ) {
63              //unless the Requisition is in process, awaiting content, awaiting accounting lines or awaiting fiscal, editing is not allowed
64              return false;
65          }
66          return super.canRoute(document);
67      }*/
68  
69     /* @Override
70      public boolean canApprove(Document document) {
71          RequisitionDocument reqDocument = (RequisitionDocument)document;
72          if (PurapConstants.RequisitionStatuses.APPDOC_AWAIT_LICENSE_REVIEW.equals(reqDocument.getApplicationDocumentStatus())) {
73              return false;
74          }
75          return super.canApprove(document);
76      }*/
77  
78      /*@Override
79      public boolean canBlanketApprove(Document document){
80          RequisitionDocument reqDocument = (RequisitionDocument)document;
81          if (PurapConstants.RequisitionStatuses.APPDOC_AWAIT_LICENSE_REVIEW.equals(reqDocument.getApplicationDocumentStatus()))  {
82              return false;
83          }
84          return super.canBlanketApprove(document);
85      }*/
86  
87      /*@Override
88      public boolean canDisapprove(Document document) {
89          RequisitionDocument reqDocument = (RequisitionDocument)document;
90          if (PurapConstants.RequisitionStatuses.APPDOC_AWAIT_LICENSE_REVIEW.equals(reqDocument.getApplicationDocumentStatus()))  {
91              return false;
92          }
93          return super.canDisapprove(document);
94      }*/
95  
96  
97      @Override
98      public Set<String> getEditModes(Document document) {
99          Set<String> editModes = super.getEditModes(document);
100         RequisitionDocument reqDocument = (RequisitionDocument) document;
101 
102         //if the ENABLE_COMMODITY_CODE_IND system parameter is Y then add this edit mode so that the commodity code fields would display on the document.
103         boolean enableCommodityCode = SpringContext.getBean(ParameterService.class).getParameterValueAsBoolean(OleParameterConstants.PURCHASING_DOCUMENT.class, PurapParameterConstants.ENABLE_COMMODITY_CODE_IND);
104         if (enableCommodityCode) {
105             editModes.add(RequisitionEditMode.ENABLE_COMMODITY_CODE);
106         }
107 
108         // if vendor has been selected from DB, certain vendor fields are not allowed to be edited
109         if (ObjectUtils.isNotNull(reqDocument.getVendorHeaderGeneratedIdentifier())) {
110             editModes.add(RequisitionEditMode.LOCK_VENDOR_ENTRY);
111         }
112 
113         // if B2B requisition, certain fields are not allowed to be edited
114         if (RequisitionSources.B2B.equals(reqDocument.getRequisitionSourceCode())) {
115             editModes.add(RequisitionEditMode.LOCK_B2B_ENTRY);
116         }
117 
118         // if not B2B requisition, the posting year cannot be edited if within a given amount of time set in a parameter
119         if (!RequisitionSources.B2B.equals(reqDocument.getRequisitionSourceCode()) &&
120                 SpringContext.getBean(PurapService.class).allowEncumberNextFiscalYear()) {
121             editModes.add(RequisitionEditMode.ALLOW_POSTING_YEAR_ENTRY);
122         }
123         /*if (!RequisitionStatuses.APPDOC_IN_PROCESS.equals(reqDocument.getApplicationDocumentStatus())
124                 || document.getDocumentHeader().getWorkflowDocument().isEnroute()) {
125             editModes.add(RequisitionEditMode.ENABLE_LICENSE_INDICATOR);
126 
127         }*/
128 
129      /*   if (reqDocument.getLicensingRequirementCode().endsWith("ALNC")) {
130             editModes.add(RequisitionEditMode.ENABLE_ROUTE_BUTTONS);
131             System.out.println(RequisitionEditMode.ENABLE_ROUTE_BUTTONS);
132         }
133         */
134         // check if purap tax is enabled
135         boolean salesTaxInd = SpringContext.getBean(ParameterService.class).getParameterValueAsBoolean(OleParameterConstants.PURCHASING_DOCUMENT.class, PurapParameterConstants.ENABLE_SALES_TAX_IND);
136         if (salesTaxInd) {
137             editModes.add(PurapAuthorizationConstants.PURAP_TAX_ENABLED);
138             editModes.add(RequisitionEditMode.CLEAR_ALL_TAXES); // always available now if taxes
139 
140             if (reqDocument.isUseTaxIndicator()) {
141                 // don't allow tax editing if doc using use tax
142                 editModes.add(RequisitionEditMode.LOCK_TAX_AMOUNT_ENTRY);
143             }
144         }
145 
146         // set display mode for Receiving Address section according to parameter value
147         boolean displayReceivingAddress = SpringContext.getBean(ParameterService.class).getParameterValueAsBoolean(OleParameterConstants.PURCHASING_DOCUMENT.class, PurapParameterConstants.ENABLE_RECEIVING_ADDRESS_IND);
148         if (displayReceivingAddress) {
149             editModes.add(RequisitionEditMode.DISPLAY_RECEIVING_ADDRESS);
150         }
151 
152         // set display mode for Address to Vendor section according to parameter value
153         boolean lockAddressToVendor = !SpringContext.getBean(ParameterService.class).getParameterValueAsBoolean(PurapConstants.PURAP_NAMESPACE, "Requisition", PurapParameterConstants.ENABLE_ADDRESS_TO_VENDOR_SELECTION_IND);
154         if (lockAddressToVendor) {
155             editModes.add(RequisitionEditMode.LOCK_ADDRESS_TO_VENDOR);
156         }
157 
158         // CONTENT ROUTE LEVEL - Approvers can edit full detail on Requisition except they cannot change the CHART/ORG.
159         //to be removed
160         //for app doc status
161         if (reqDocument.isDocumentStoppedInRouteNode(RequisitionStatuses.NODE_CONTENT_REVIEW) ||
162                 reqDocument.isDocumentStoppedInRouteNode(RequisitionStatuses.NODE_HAS_ACCOUNTING_LINES)) {
163             editModes.add(RequisitionEditMode.LOCK_CONTENT_ENTRY);
164         }
165 
166         // FISCAL OFFICER ROUTE LEVEL - Approvers can edit only the accounting lines that they own and no other detail on REQ.
167         // to be removed
168         //for app doc status
169         else if (reqDocument.isDocumentStoppedInRouteNode(RequisitionStatuses.NODE_ACCOUNT)) {
170 
171             // remove FULL_ENTRY because FO cannot edit rest of doc; only their own acct lines
172             editModes.add(RequisitionEditMode.RESTRICT_FISCAL_ENTRY);
173 
174             List lineList = new ArrayList();
175             for (Iterator iter = reqDocument.getItems().iterator(); iter.hasNext(); ) {
176                 RequisitionItem item = (RequisitionItem) iter.next();
177                 lineList.addAll(item.getSourceAccountingLines());
178                 // If FO has deleted the last accounting line for an item, set entry mode to full so they can add another one
179 
180                 if (item.getSourceAccountingLines().size() == 0) {
181                     editModes.add(RequisitionEditMode.RESTRICT_FISCAL_ENTRY);
182                     //FIXME hjs-this is a problem because we can't put the id in the map anymore
183 //                    editModeMap.put(RequisitionEditMode.ALLOW_ITEM_ENTRY, item.getItemIdentifier());
184                 }
185             }
186 
187         }
188 
189         return editModes;
190     }
191 
192     @Override
193     public boolean canCopy(Document document) {
194         //  disallow copying until the doc is saved
195         //   WorkflowDocument workflowDocument = ((PurchasingAccountsPayableDocument) document).getFinancialSystemDocumentHeader().getWorkflowDocument();
196 
197         WorkflowDocument workflowDocument = document.getDocumentHeader().getWorkflowDocument();
198 
199         if (workflowDocument.isInitiated() && !workflowDocument.isSaved()) {
200             return false;
201         }
202         return super.canCopy(document);
203     }
204 
205     @Override
206     public boolean canReload(Document document) {
207         RequisitionDocument reqDocument = (RequisitionDocument) document;
208 
209         //  this is a global rule, if the doc is in your queue for ACK, then you lose the reload button
210         WorkflowDocument workflowDocument = ((PurchasingAccountsPayableDocument) document).getFinancialSystemDocumentHeader().getWorkflowDocument();
211 
212         if (workflowDocument.isAcknowledgeRequested()) {
213             return false;
214         }
215         if (reqDocument.isDocumentStoppedInRouteNode(RequisitionStatuses.NODE_SUBACCOUNT)) {
216             return false;
217         }
218         //  but the non-approvers do
219 
220         else if (isDocInRouteNodeNotForCurrentUser(reqDocument, RequisitionStatuses.NODE_SUBACCOUNT)) {
221             return true;
222         }
223 
224         //  while in AccountingHierarchyOrgReview ... org reviewers do NOT get reload button
225         else if (reqDocument.isDocumentStoppedInRouteNode(RequisitionStatuses.NODE_ORG_REVIEW)) {
226             return false;
227         }
228         // but the non-approvers do
229         else if (isDocInRouteNodeNotForCurrentUser(reqDocument, RequisitionStatuses.NODE_ORG_REVIEW)) {
230             return true;
231         }
232 
233         //  while in SeparationOfDuties ... approvers do NOT get reload button
234         else if (reqDocument.isDocumentStoppedInRouteNode(RequisitionStatuses.NODE_SEPARATION_OF_DUTIES)) {
235             return false;
236         }
237         // but the non-approvers do
238         else if (isDocInRouteNodeNotForCurrentUser(reqDocument, RequisitionStatuses.NODE_SEPARATION_OF_DUTIES)) {
239             return true;
240         }
241 
242         return super.canReload(document);
243     }
244 
245     @Override
246     public boolean canSave(Document document) {
247         RequisitionDocument reqDocument = (RequisitionDocument) document;
248 
249         if (reqDocument.isDocumentStoppedInRouteNode(RequisitionStatuses.NODE_ORG_REVIEW)) {
250             return false;
251         }
252         return super.canSave(document);
253     }
254 
255     /**
256      * @param document
257      * @param nodeDetails
258      * @return
259      */
260     protected boolean isDocInRouteNodeNotForCurrentUser(Document document, String nodeName) {
261         List<String> currentRouteLevels = new ArrayList<String>();
262 
263         WorkflowDocument workflowDocument = ((PurchasingAccountsPayableDocument) document).getFinancialSystemDocumentHeader().getWorkflowDocument();
264         Set<String> names = workflowDocument.getCurrentNodeNames();
265 
266         currentRouteLevels = new ArrayList<String>(names);
267 
268         if (currentRouteLevels.contains(nodeName) && !workflowDocument.isApprovalRequested()) {
269             return true;
270         }
271         return false;
272     }
273 }