1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.kuali.kfs.module.purap.document.authorization;
20
21 import java.util.ArrayList;
22 import java.util.Collection;
23 import java.util.List;
24 import java.util.Set;
25
26 import org.apache.commons.lang.StringUtils;
27 import org.kuali.kfs.module.purap.PurapParameterConstants;
28 import org.kuali.kfs.module.purap.PurapPropertyConstants;
29 import org.kuali.kfs.module.purap.businessobject.PurApAccountingLine;
30 import org.kuali.kfs.module.purap.businessobject.PurApItem;
31 import org.kuali.kfs.module.purap.document.PaymentRequestDocument;
32 import org.kuali.kfs.module.purap.document.PurchaseOrderDocument;
33 import org.kuali.kfs.module.purap.document.PurchasingAccountsPayableDocument;
34 import org.kuali.kfs.module.purap.document.PurchasingAccountsPayableDocumentBase;
35 import org.kuali.kfs.module.purap.document.RequisitionDocument;
36 import org.kuali.kfs.module.purap.document.service.PurapService;
37 import org.kuali.kfs.sys.KFSPropertyConstants;
38 import org.kuali.kfs.sys.businessobject.AccountingLine;
39 import org.kuali.kfs.sys.context.SpringContext;
40 import org.kuali.kfs.sys.document.AccountingDocument;
41 import org.kuali.kfs.sys.document.authorization.AccountingLineAuthorizerBase;
42 import org.kuali.kfs.sys.document.authorization.FinancialSystemTransactionalDocumentAuthorizerBase;
43 import org.kuali.kfs.sys.document.authorization.FinancialSystemTransactionalDocumentPresentationController;
44 import org.kuali.kfs.sys.document.web.AccountingLineRenderingContext;
45 import org.kuali.rice.coreservice.framework.parameter.ParameterService;
46 import org.kuali.rice.kim.api.identity.Person;
47 import org.kuali.rice.kns.datadictionary.TransactionalDocumentEntry;
48 import org.kuali.rice.kns.document.authorization.DocumentAuthorizer;
49 import org.kuali.rice.kns.service.DataDictionaryService;
50 import org.kuali.rice.krad.document.DocumentPresentationController;
51
52
53
54
55
56 public class PurapAccountingLineAuthorizer extends AccountingLineAuthorizerBase {
57
58
59
60
61
62
63
64
65
66
67 @Override
68 protected String getAddMethod(AccountingLine accountingLine, String accountingLineProperty) {
69 final String infix = getActionInfixForNewAccountingLine(accountingLine, accountingLineProperty);
70 String lineNumber = null;
71 if (accountingLineProperty.equals(PurapPropertyConstants.ACCOUNT_DISTRIBUTION_NEW_SRC_LINE)) {
72 lineNumber = "-2";
73 }
74 else {
75 lineNumber = StringUtils.substringBetween(accountingLineProperty, "[", "]");
76 }
77 return "insert"+infix + "Line.line" + lineNumber + "." + "anchoraccounting"+infix+"Anchor";
78 }
79
80
81
82
83
84
85
86
87 @Override
88 protected String getDeleteLineMethod(AccountingLine accountingLine, String accountingLineProperty, Integer accountingLineIndex) {
89 final String infix = getActionInfixForExtantAccountingLine(accountingLine, accountingLineProperty);
90 String lineNumber = StringUtils.substringBetween(accountingLineProperty, "item[", "].sourceAccountingLine");
91 if (lineNumber == null) {
92 lineNumber = "-2";
93 }
94 String accountingLineNumber = StringUtils.substringBetween(accountingLineProperty, "sourceAccountingLine[", "]");
95 return "delete"+infix+"Line.line"+ lineNumber + ":" + accountingLineNumber + ".anchoraccounting"+infix+"Anchor";
96 }
97
98
99
100
101
102
103
104 @Override
105 protected String getBalanceInquiryMethod(AccountingLine accountingLine, String accountingLineProperty, Integer accountingLineIndex) {
106 final String infix = getActionInfixForNewAccountingLine(accountingLine, accountingLineProperty);
107 String lineNumber = StringUtils.substringBetween(accountingLineProperty, "item[", "].sourceAccountingLine");
108 if (lineNumber == null) {
109 lineNumber = "-2";
110 }
111 String accountingLineNumber = StringUtils.substringBetween(accountingLineProperty, "sourceAccountingLine[", "]");
112 return "performBalanceInquiryFor"+infix+"Line.line"+ ":" + lineNumber + ":" + accountingLineNumber + ".anchoraccounting"+infix+ "existingLineLineAnchor"+accountingLineNumber;
113 }
114
115
116
117
118 @Override
119 public Set<String> getUnviewableBlocks(AccountingDocument accountingDocument, AccountingLine accountingLine, boolean newLine, Person currentUser) {
120 Set<String> unviewableBlocks = super.getUnviewableBlocks(accountingDocument, accountingLine, newLine, currentUser);
121 if (showAmountOnly(accountingDocument)) {
122 unviewableBlocks.add(KFSPropertyConstants.PERCENT);
123 }
124 else {
125 unviewableBlocks.add(KFSPropertyConstants.AMOUNT);
126 }
127 return unviewableBlocks;
128 }
129
130 private boolean showAmountOnly(AccountingDocument accountingDocument) {
131 PurapService purapService = SpringContext.getBean(PurapService.class);
132 if (accountingDocument instanceof PurchasingAccountsPayableDocument) {
133 if (purapService.isFullDocumentEntryCompleted((PurchasingAccountsPayableDocument)accountingDocument)) {
134 return true;
135 }
136 }
137 return false;
138 }
139
140
141
142
143
144
145 private FinancialSystemTransactionalDocumentPresentationController getPresentationController(AccountingDocument accountingDocument) {
146 final Class<? extends DocumentPresentationController> presentationControllerClass = ((TransactionalDocumentEntry)SpringContext.getBean(DataDictionaryService.class).getDataDictionary().getDictionaryObjectEntry(accountingDocument.getClass().getName())).getDocumentPresentationControllerClass();
147 FinancialSystemTransactionalDocumentPresentationController presentationController = null;
148 try {
149 presentationController = (FinancialSystemTransactionalDocumentPresentationController)presentationControllerClass.newInstance();
150 }
151 catch (InstantiationException ie) {
152 throw new RuntimeException("Cannot instantiate instance of presentation controller for "+accountingDocument.getClass().getName(), ie);
153 }
154 catch (IllegalAccessException iae) {
155 throw new RuntimeException("Cannot instantiate instance of presentation controller for "+accountingDocument.getClass().getName(), iae);
156 }
157 return presentationController;
158 }
159
160
161
162
163
164
165 @Override
166 protected FinancialSystemTransactionalDocumentAuthorizerBase getDocumentAuthorizer(AccountingDocument accountingDocument) {
167 final Class<? extends DocumentAuthorizer> documentAuthorizerClass = ((TransactionalDocumentEntry)SpringContext.getBean(DataDictionaryService.class).getDataDictionary().getDictionaryObjectEntry(accountingDocument.getClass().getName())).getDocumentAuthorizerClass();
168 FinancialSystemTransactionalDocumentAuthorizerBase documentAuthorizer = null;
169 try {
170 documentAuthorizer = (FinancialSystemTransactionalDocumentAuthorizerBase)documentAuthorizerClass.newInstance();
171 }
172 catch (InstantiationException ie) {
173 throw new RuntimeException("Cannot instantiate instance of document authorizer for "+accountingDocument.getClass().getName(), ie);
174 }
175 catch (IllegalAccessException iae) {
176 throw new RuntimeException("Cannot instantiate instance of document authorizer for "+accountingDocument.getClass().getName(), iae);
177 }
178 return documentAuthorizer;
179 }
180
181 @Override
182 public boolean isGroupEditable(AccountingDocument accountingDocument,
183 List<? extends AccountingLineRenderingContext> accountingLineRenderingContexts,
184 Person currentUser) {
185
186 boolean isEditable = super.isGroupEditable(accountingDocument, accountingLineRenderingContexts, currentUser);
187
188 if (isEditable){
189 if (accountingLineRenderingContexts.size() == 0) {
190 return false;
191 }
192 isEditable = allowAccountingLinesAreEditable(accountingDocument,accountingLineRenderingContexts.get(0).getAccountingLine());
193 }
194
195 return isEditable;
196 }
197
198 @Override
199 public boolean determineEditPermissionOnField(AccountingDocument accountingDocument,
200 AccountingLine accountingLine,
201 String accountingLineCollectionProperty,
202 String fieldName,
203 boolean editablePage) {
204
205
206 if (accountingLine.getSequenceNumber() == null) {
207 return true;
208 }
209
210 boolean isEditable = super.determineEditPermissionOnField(accountingDocument, accountingLine, accountingLineCollectionProperty,fieldName,editablePage);
211
212 if (isEditable){
213 isEditable = allowAccountingLinesAreEditable(accountingDocument,accountingLine);
214 }
215
216 return isEditable;
217 }
218
219 @Override
220 public boolean determineEditPermissionOnLine(AccountingDocument accountingDocument,
221 AccountingLine accountingLine,
222 String accountingLineCollectionProperty,
223 boolean currentUserIsDocumentInitiator,
224 boolean pageIsEditable) {
225
226 boolean isEditable = super.determineEditPermissionOnLine(accountingDocument, accountingLine, accountingLineCollectionProperty, currentUserIsDocumentInitiator, pageIsEditable);
227
228 if (isEditable){
229 isEditable = allowAccountingLinesAreEditable(accountingDocument,accountingLine);
230 }
231
232 return (isEditable && pageIsEditable);
233 }
234
235
236
237
238
239 protected boolean allowAccountingLinesAreEditable(AccountingDocument accountingDocument,
240 AccountingLine accountingLine){
241
242 PurApAccountingLine purapAccount = (PurApAccountingLine)accountingLine;
243 @SuppressWarnings("rawtypes")
244 Class clazz = getPurapDocumentClass(accountingDocument);
245 if (clazz == null){
246 return true;
247 }
248
249
250 PurchasingAccountsPayableDocumentBase purapDoc = (PurchasingAccountsPayableDocumentBase) accountingDocument;
251 if (!purapDoc.isCalculated()) {
252 return true;
253 }
254
255 Collection<String> restrictedItemTypesList = new ArrayList<String>( SpringContext.getBean(ParameterService.class).getParameterValuesAsString(clazz, PurapParameterConstants.PURAP_ITEM_TYPES_RESTRICTING_ACCOUNT_EDIT) );
256
257
258
259 boolean retval = true;
260 retval = isEditableBasedOnTradeInRestriction(accountingDocument, accountingLine);
261
262 if (restrictedItemTypesList != null && purapAccount.getPurapItem() != null){
263 return (!restrictedItemTypesList.contains(purapAccount.getPurapItem().getItemTypeCode()) && retval);
264 } else if (restrictedItemTypesList != null && purapAccount.getPurapItem() == null) {
265 return retval;
266 } else {
267 return true;
268 }
269 }
270
271
272
273
274
275
276
277
278
279
280
281
282
283 protected PurApItem findTheItemForAccountingLine(AccountingDocument accountingDocument, AccountingLine accountingLine) {
284 PurApItem retval = null;
285 List<PurApItem> listItems = null;
286
287 scan: {
288 if (accountingDocument instanceof PurchasingAccountsPayableDocumentBase) {
289 listItems = ((PurchasingAccountsPayableDocumentBase) accountingDocument).getItems();
290
291
292
293 for (PurApItem oneItem : listItems) {
294 List<PurApAccountingLine> acctLines = oneItem.getSourceAccountingLines();
295 for (PurApAccountingLine oneAcctLine : acctLines) {
296
297 if (oneAcctLine == accountingLine) {
298 retval = oneItem;
299
300
301 break scan;
302 }
303 }
304 }
305 }
306 }
307
308 return retval;
309 }
310
311
312
313
314
315
316
317
318
319
320
321
322
323 private boolean isEditableBasedOnTradeInRestriction(AccountingDocument accountingDocument, AccountingLine accountingLine) {
324 boolean retval = true;
325
326
327 if ((accountingLine != null) && (accountingLine instanceof PurApAccountingLine)) {
328 PurApItem purApItem = (((PurApAccountingLine) accountingLine)).getPurapItem();
329
330
331
332
333
334 if (purApItem == null) {
335 purApItem = findTheItemForAccountingLine(accountingDocument, accountingLine);
336 }
337
338 if (purApItem != null) {
339 String itemTypeCode = purApItem.getItemTypeCode();
340 if (itemTypeCode.toUpperCase().equalsIgnoreCase(PurapParameterConstants.PURAP_ITEM_TYPE_TRDI)) {
341
342 if ((accountingLine.getChartOfAccountsCode() != null) || (accountingLine.getAccountNumber() != null) || (accountingLine.getFinancialObjectCode() != null)) {
343 retval = false;
344 }
345 }
346
347
348 }
349 }
350 return retval;
351 }
352
353 @SuppressWarnings("rawtypes")
354 private Class getPurapDocumentClass(AccountingDocument accountingDocument){
355 if (accountingDocument instanceof RequisitionDocument){
356 return RequisitionDocument.class;
357 }else if (accountingDocument instanceof PurchaseOrderDocument){
358 return PurchaseOrderDocument.class;
359 }else if (accountingDocument instanceof PaymentRequestDocument){
360 return PaymentRequestDocument.class;
361 }else{
362 return null;
363 }
364 }
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383 @Override
384 protected boolean approvedForUnqualifiedEditing(AccountingDocument accountingDocument, AccountingLine accountingLine, String accountingLineCollectionProperty, boolean currentUserIsDocumentInitiator) {
385 boolean retval = true;
386
387 retval = isEditableBasedOnTradeInRestriction(accountingDocument, accountingLine);
388
389 if (retval) {
390 retval = super.approvedForUnqualifiedEditing(accountingDocument, accountingLine, accountingLineCollectionProperty, currentUserIsDocumentInitiator);
391 }
392 return retval;
393 }
394 }
395