001 /*
002 * Copyright 2011 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.kfs.module.purap.document.authorization;
017
018 import org.apache.commons.lang.StringUtils;
019 import org.kuali.kfs.module.purap.PurapConstants;
020 import org.kuali.kfs.module.purap.PurapPropertyConstants;
021 import org.kuali.kfs.module.purap.businessobject.PurApAccountingLine;
022 import org.kuali.kfs.module.purap.businessobject.PurchaseOrderItem;
023 import org.kuali.kfs.module.purap.document.PurchaseOrderAmendmentDocument;
024 import org.kuali.kfs.module.purap.document.PurchaseOrderDocument;
025 import org.kuali.kfs.sys.businessobject.AccountingLine;
026 import org.kuali.kfs.sys.document.AccountingDocument;
027 import org.kuali.rice.kns.util.KualiDecimal;
028 import org.kuali.rice.kns.workflow.service.KualiWorkflowDocument;
029
030 /**
031 * Accounting line authorizer for Requisition document which allows adding accounting lines at specified nodes
032 */
033 public class PurchaseOrderAccountingLineAuthorizer extends PurapAccountingLineAuthorizer {
034 private static final String NEW_UNORDERED_ITEMS_NODE = "NewUnorderedItems";
035
036 /**
037 * Allow new lines to be rendered at NewUnorderedItems node
038 * @see org.kuali.kfs.sys.document.authorization.AccountingLineAuthorizerBase#renderNewLine(org.kuali.kfs.sys.document.AccountingDocument, java.lang.String)
039 */
040 @Override
041 public boolean renderNewLine(AccountingDocument accountingDocument, String accountingGroupProperty) {
042 KualiWorkflowDocument workflowDoc = accountingDocument.getDocumentHeader().getWorkflowDocument();
043 String currentRouteNodeName = workflowDoc.getCurrentRouteNodeNames();
044
045 // if its in the NEW_UNORDERED_ITEMS node, then allow the new line to be drawn
046 if (PurchaseOrderAccountingLineAuthorizer.NEW_UNORDERED_ITEMS_NODE.equals(currentRouteNodeName)) {
047 return true;
048 }
049
050 if (PurapConstants.PurchaseOrderDocTypes.PURCHASE_ORDER_AMENDMENT_DOCUMENT.equals(workflowDoc.getDocumentType()) && StringUtils.isNotBlank(accountingGroupProperty) && accountingGroupProperty.contains(PurapPropertyConstants.ITEM)) {
051 int itemNumber = determineItemNumberFromGroupProperty(accountingGroupProperty);
052 PurchaseOrderAmendmentDocument poaDoc = (PurchaseOrderAmendmentDocument) accountingDocument;
053 PurchaseOrderItem item = (PurchaseOrderItem) poaDoc.getItem(itemNumber);
054 return item.isNewItemForAmendment() || item.getSourceAccountingLines().size() == 0;
055 }
056
057 return super.renderNewLine(accountingDocument, accountingGroupProperty);
058 }
059
060 private int determineItemNumberFromGroupProperty(String accountingGroupProperty) {
061 int openBracketPos = accountingGroupProperty.indexOf("[");
062 int closeBracketPos = accountingGroupProperty.indexOf("]");
063 String itemNumberString = accountingGroupProperty.substring(openBracketPos + 1, closeBracketPos);
064 int itemNumber = new Integer(itemNumberString).intValue();
065 return itemNumber;
066 }
067
068 @Override
069 protected boolean allowAccountingLinesAreEditable(AccountingDocument accountingDocument,
070 AccountingLine accountingLine){
071 PurApAccountingLine purapAccount = (PurApAccountingLine)accountingLine;
072 PurchaseOrderItem poItem = (PurchaseOrderItem)purapAccount.getPurapItem();
073 PurchaseOrderDocument po = (PurchaseOrderDocument)accountingDocument;
074
075
076 if (poItem != null && !poItem.getItemType().isAdditionalChargeIndicator()) {
077 if (!poItem.isItemActiveIndicator()) {
078 return false;
079 }
080
081 // if total amount has a value and is non-zero
082 if (poItem.getItemInvoicedTotalAmount() != null && poItem.getItemInvoicedTotalAmount().compareTo(new KualiDecimal(0)) != 0) {
083 return false;
084 }
085
086 if (po.getContainsUnpaidPaymentRequestsOrCreditMemos() && !poItem.isNewItemForAmendment()) {
087 return false;
088 }
089
090 }
091 return super.allowAccountingLinesAreEditable(accountingDocument, accountingLine);
092 }
093
094 @Override
095 public boolean determineEditPermissionOnLine(AccountingDocument accountingDocument, AccountingLine accountingLine, String accountingLineCollectionProperty, boolean currentUserIsDocumentInitiator, boolean pageIsEditable) {
096 // the fields in a new line should be always editable
097 if (accountingLine.getSequenceNumber() == null) {
098 return true;
099 }
100
101 // check the initiation permission on the document if it is in the state of preroute, but only if
102 // the PO status is not In Process.
103 KualiWorkflowDocument workflowDocument = accountingDocument.getDocumentHeader().getWorkflowDocument();
104 PurchaseOrderDocument poDocument = (PurchaseOrderDocument)accountingDocument;
105 if (!poDocument.getStatusCode().equals(PurapConstants.PurchaseOrderStatuses.IN_PROCESS) && (workflowDocument.stateIsInitiated() || workflowDocument.stateIsSaved())) {
106 if (PurapConstants.PurchaseOrderDocTypes.PURCHASE_ORDER_AMENDMENT_DOCUMENT.equals(workflowDocument.getDocumentType())) {
107 PurApAccountingLine purapAccount = (PurApAccountingLine)accountingLine;
108 PurchaseOrderItem item = (PurchaseOrderItem)purapAccount.getPurapItem();
109 return item.isNewItemForAmendment() || item.getSourceAccountingLines().size() == 0;
110 }
111 else {
112 return currentUserIsDocumentInitiator;
113 }
114 }
115 else {
116 return true;
117 }
118 }
119
120 }