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 java.util.Set;
019
020 import org.apache.commons.lang.StringUtils;
021 import org.kuali.kfs.module.purap.PurapAuthorizationConstants;
022 import org.kuali.kfs.module.purap.PurapConstants;
023 import org.kuali.kfs.module.purap.PurapParameterConstants;
024 import org.kuali.kfs.module.purap.PurapAuthorizationConstants.CreditMemoEditMode;
025 import org.kuali.kfs.module.purap.PurapConstants.CreditMemoStatuses;
026 import org.kuali.kfs.module.purap.document.VendorCreditMemoDocument;
027 import org.kuali.kfs.module.purap.document.service.PurapService;
028 import org.kuali.kfs.sys.KFSConstants;
029 import org.kuali.kfs.sys.context.SpringContext;
030 import org.kuali.kfs.sys.service.impl.KfsParameterConstants;
031 import org.kuali.rice.kns.document.Document;
032 import org.kuali.rice.kns.service.ParameterService;
033 import org.kuali.rice.kns.util.ObjectUtils;
034 import org.kuali.rice.kns.workflow.service.KualiWorkflowDocument;
035
036
037 public class VendorCreditMemoDocumentPresentationController extends PurchasingAccountsPayableDocumentPresentationController {
038
039 @Override
040 protected boolean canSave(Document document) {
041 VendorCreditMemoDocument vendorCreditMemoDocument = (VendorCreditMemoDocument) document;
042
043 if (StringUtils.equals(vendorCreditMemoDocument.getStatusCode(), PurapConstants.CreditMemoStatuses.INITIATE)) {
044 return false;
045 }
046
047 if (canEditPreExtraction(vendorCreditMemoDocument)) {
048 return true;
049 }
050
051 return super.canSave(document);
052 }
053
054 @Override
055 protected boolean canReload(Document document) {
056 VendorCreditMemoDocument vendorCreditMemoDocument = (VendorCreditMemoDocument) document;
057
058 if (StringUtils.equals(vendorCreditMemoDocument.getStatusCode(), PurapConstants.CreditMemoStatuses.INITIATE)) {
059 return false;
060 }
061
062 if (canEditPreExtraction(vendorCreditMemoDocument)) {
063 return true;
064 }
065
066 return super.canReload(document);
067 }
068
069 @Override
070 protected boolean canCancel(Document document) {
071 //controlling the cancel button through getExtraButtons in CreditMemoForm
072 return false;
073 }
074
075 @Override
076 protected boolean canDisapprove(Document document) {
077 //disapprove is never allowed for Credit Memo
078 return false;
079 }
080
081 /**
082 *
083 * @see org.kuali.rice.kns.document.authorization.DocumentPresentationControllerBase#canEdit(org.kuali.rice.kns.document.Document)
084 */
085 @Override
086 protected boolean canEdit(Document document) {
087 if (SpringContext.getBean(PurapService.class).isFullDocumentEntryCompleted((VendorCreditMemoDocument) document)) {
088 return false;
089 }
090
091 return super.canEdit(document);
092 }
093
094 /**
095 *
096 * @see org.kuali.rice.kns.document.authorization.TransactionalDocumentPresentationControllerBase#getEditModes(org.kuali.rice.kns.document.Document)
097 */
098 @Override
099 public Set<String> getEditModes(Document document) {
100 Set<String> editModes = super.getEditModes(document);
101 KualiWorkflowDocument workflowDocument = document.getDocumentHeader().getWorkflowDocument();
102 VendorCreditMemoDocument vendorCreditMemoDocument = (VendorCreditMemoDocument)document;
103
104 if (canCancel(vendorCreditMemoDocument)) {
105 editModes.add(CreditMemoEditMode.ACCOUNTS_PAYABLE_PROCESSOR_CANCEL);
106 }
107
108 if (canHold(vendorCreditMemoDocument)) {
109 editModes.add(CreditMemoEditMode.HOLD);
110 }
111
112 if (canRemoveHold(vendorCreditMemoDocument)) {
113 editModes.add(CreditMemoEditMode.REMOVE_HOLD);
114 }
115
116 if (SpringContext.getBean(PurapService.class).isFullDocumentEntryCompleted(vendorCreditMemoDocument)) {
117 editModes.add(CreditMemoEditMode.FULL_DOCUMENT_ENTRY_COMPLETED);
118 }
119 else {
120 if (ObjectUtils.isNotNull(vendorCreditMemoDocument.getPurchaseOrderDocument()) &&
121 !vendorCreditMemoDocument.isSourceVendor() &&
122 PurapConstants.PurchaseOrderStatuses.CLOSED.equals(vendorCreditMemoDocument.getPurchaseOrderDocument().getStatusCode())) {
123 // TODO hjs-is this right? check to see if the checkbox is showing up for non-AP folks
124 editModes.add(CreditMemoEditMode.ALLOW_REOPEN_PURCHASE_ORDER);
125 }
126 }
127
128 if (StringUtils.equals(vendorCreditMemoDocument.getStatusCode(), PurapConstants.CreditMemoStatuses.INITIATE)) {
129 editModes.add(CreditMemoEditMode.DISPLAY_INIT_TAB);
130 }
131
132 if (canEditPreExtraction(vendorCreditMemoDocument)) {
133 editModes.add(CreditMemoEditMode.EDIT_PRE_EXTRACT);
134 }
135
136 if (!vendorCreditMemoDocument.isSourceDocumentPaymentRequest()) {
137 editModes.add(CreditMemoEditMode.LOCK_VENDOR_ENTRY);
138 }
139
140 // See if purap tax is enabled
141 boolean salesTaxInd = SpringContext.getBean(ParameterService.class).getIndicatorParameter(KfsParameterConstants.PURCHASING_DOCUMENT.class, PurapParameterConstants.ENABLE_SALES_TAX_IND);
142 if (salesTaxInd) {
143 editModes.add(PurapAuthorizationConstants.PURAP_TAX_ENABLED);
144
145 if (vendorCreditMemoDocument.isUseTaxIndicator()) {
146 // only allow tax editing if doc is not using use tax
147 editModes.add(CreditMemoEditMode.LOCK_TAX_AMOUNT_ENTRY);
148 }
149 else {
150 // display the "clear all taxes" button if doc is not using use tax
151 editModes.add(CreditMemoEditMode.CLEAR_ALL_TAXES);
152 }
153 }
154
155 // Remove editBank edit mode if the document has been extracted
156 if (vendorCreditMemoDocument.isExtracted()) {
157 editModes.remove(KFSConstants.BANK_ENTRY_EDITABLE_EDITING_MODE);
158 }
159
160 return editModes;
161 }
162
163 /**
164 * Determines if the document can be put on hold. Credit memo not already on hold, extracted date is null, and credit memo
165 * status approved or complete.
166 *
167 * @param cmDocument - credit memo document to hold.
168 * @return boolean - true if hold can occur, false if not allowed.
169 */
170 protected boolean canHold(VendorCreditMemoDocument cmDocument) {
171 return !cmDocument.isHoldIndicator() && !cmDocument.isExtracted() && !PurapConstants.CreditMemoStatuses.STATUSES_DISALLOWING_HOLD.contains(cmDocument.getStatusCode());
172 }
173
174 /**
175 * Determines if the document can be taken off hold. Credit memo must be on hold.
176 *
177 * @param cmDocument - credit memo document that is on hold.
178 * @return boolean - true if document can be taken off hold, false if it cannot.
179 */
180 protected boolean canRemoveHold(VendorCreditMemoDocument cmDocument) {
181 return cmDocument.isHoldIndicator();
182 }
183
184 /**
185 * Determines if the document can be canceled. Document can be canceled if not in canceled status already, extracted date is
186 * null, and hold indicator is false.
187 *
188 * @param cmDocument - credit memo document to cancel.
189 * @return boolean - true if document can be canceled, false if it cannot be.
190 */
191 protected boolean canCancel(VendorCreditMemoDocument cmDocument) {
192 return !CreditMemoStatuses.CANCELLED_STATUSES.contains(cmDocument.getStatusCode()) && !cmDocument.isExtracted() && !cmDocument.isHoldIndicator();
193 }
194
195 protected boolean canEditPreExtraction(VendorCreditMemoDocument vendorCreditMemoDocument) {
196 return (!vendorCreditMemoDocument.isExtracted() &&
197 !vendorCreditMemoDocument.getDocumentHeader().getWorkflowDocument().isAdHocRequested() &&
198 !PurapConstants.CreditMemoStatuses.CANCELLED_STATUSES.contains(vendorCreditMemoDocument.getStatusCode()));
199 }
200
201 }