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.web.struts;
017
018 import java.util.List;
019
020 import javax.servlet.http.HttpServletRequest;
021
022 import org.kuali.kfs.module.purap.PurapConstants;
023 import org.kuali.kfs.module.purap.PurapAuthorizationConstants.PaymentRequestEditMode;
024 import org.kuali.kfs.module.purap.PurapConstants.PaymentRequestStatuses;
025 import org.kuali.kfs.module.purap.businessobject.PurApItem;
026 import org.kuali.kfs.module.purap.businessobject.PurchaseOrderItem;
027 import org.kuali.kfs.module.purap.document.PaymentRequestDocument;
028 import org.kuali.kfs.module.purap.document.service.PurapService;
029 import org.kuali.kfs.sys.KFSConstants;
030 import org.kuali.kfs.sys.context.SpringContext;
031 import org.kuali.rice.kns.document.authorization.DocumentAuthorizer;
032 import org.kuali.rice.kns.service.DataDictionaryService;
033 import org.kuali.rice.kns.service.DocumentHelperService;
034 import org.kuali.rice.kns.service.KualiConfigurationService;
035 import org.kuali.rice.kns.util.GlobalVariables;
036 import org.kuali.rice.kns.util.KNSConstants;
037 import org.kuali.rice.kns.util.ObjectUtils;
038 import org.kuali.rice.kns.web.ui.ExtraButton;
039 import org.kuali.rice.kns.web.ui.HeaderField;
040 import org.kuali.rice.kns.workflow.service.KualiWorkflowDocument;
041
042 /**
043 * Struts Action Form for Payment Request document.
044 */
045 public class PaymentRequestForm extends AccountsPayableFormBase {
046
047 /**
048 * Indicates whether tax has been calculated based on the tax area data.
049 * Tax calculation is enforced before preq can be routed for tax approval.
050 */
051 protected boolean calculatedTax;
052
053 /**
054 * Constructs a PaymentRequestForm instance and sets up the appropriately casted document.
055 */
056 public PaymentRequestForm() {
057 super();
058 this.setNewPurchasingItemLine(setupNewPurchasingItemLine());
059 }
060
061 @Override
062 protected String getDefaultDocumentTypeName() {
063 return "PREQ";
064 }
065
066 public boolean isCalculatedTax() {
067 return calculatedTax;
068 }
069
070 public void setCalculatedTax(boolean calculatedTax) {
071 this.calculatedTax = calculatedTax;
072 }
073
074 public PaymentRequestDocument getPaymentRequestDocument() {
075 return (PaymentRequestDocument) getDocument();
076 }
077
078 public void setPaymentRequestDocument(PaymentRequestDocument purchaseOrderDocument) {
079 setDocument(purchaseOrderDocument);
080 }
081
082 @Override
083 public void populateHeaderFields(KualiWorkflowDocument workflowDocument) {
084 super.populateHeaderFields(workflowDocument);
085 if (ObjectUtils.isNotNull(this.getPaymentRequestDocument().getPurapDocumentIdentifier())) {
086 getDocInfo().add(new HeaderField("DataDictionary.PaymentRequestDocument.attributes.purapDocumentIdentifier", ((PaymentRequestDocument) this.getDocument()).getPurapDocumentIdentifier().toString()));
087 }
088 else {
089 getDocInfo().add(new HeaderField("DataDictionary.PaymentRequestDocument.attributes.purapDocumentIdentifier", "Not Available"));
090 }
091 if (ObjectUtils.isNotNull(this.getPaymentRequestDocument().getStatus())) {
092 getDocInfo().add(new HeaderField("DataDictionary.PaymentRequestDocument.attributes.statusCode", ((PaymentRequestDocument) this.getDocument()).getStatus().getStatusDescription()));
093 }
094 else {
095 getDocInfo().add(new HeaderField("DataDictionary.PaymentRequestDocument.attributes.statusCode", "Not Available"));
096 }
097 }
098
099 /**
100 * @see org.kuali.kfs.module.purap.document.web.struts.PurchasingFormBase#setupNewPurchasingItemLine()
101 */
102 @Override
103 public PurApItem setupNewPurchasingItemLine() {
104 return new PurchaseOrderItem();
105 }
106
107 /**
108 * Build additional payment request specific buttons and set extraButtons list.
109 *
110 * @return - list of extra buttons to be displayed to the user
111 */
112 @Override
113 public List<ExtraButton> getExtraButtons() {
114 extraButtons.clear(); // clear out the extra buttons array
115 PaymentRequestDocument paymentRequestDocument = this.getPaymentRequestDocument();
116 String externalImageURL = SpringContext.getBean(KualiConfigurationService.class).getPropertyString(KFSConstants.RICE_EXTERNALIZABLE_IMAGES_URL_KEY);
117 String appExternalImageURL = SpringContext.getBean(KualiConfigurationService.class).getPropertyString(KFSConstants.EXTERNALIZABLE_IMAGES_URL_KEY);
118
119 if (canContinue()) {
120 addExtraButton("methodToCall.continuePREQ", externalImageURL + "buttonsmall_continue.gif", "Continue");
121 addExtraButton("methodToCall.clearInitFields", externalImageURL + "buttonsmall_clear.gif", "Clear");
122 }
123 else {
124 if (getEditingMode().containsKey(PaymentRequestEditMode.HOLD)) {
125 addExtraButton("methodToCall.addHoldOnPayment", appExternalImageURL + "buttonsmall_hold.gif", "Hold");
126 }
127
128 if (getEditingMode().containsKey(PaymentRequestEditMode.REMOVE_HOLD) && paymentRequestDocument.isHoldIndicator()) {
129 addExtraButton("methodToCall.removeHoldFromPayment", appExternalImageURL + "buttonsmall_removehold.gif", "Remove");
130 }
131
132 if (getEditingMode().containsKey(PaymentRequestEditMode.REQUEST_CANCEL)) {
133 addExtraButton("methodToCall.requestCancelOnPayment", appExternalImageURL + "buttonsmall_requestcancel.gif", "Cancel");
134 }
135
136 if (getEditingMode().containsKey(PaymentRequestEditMode.REMOVE_REQUEST_CANCEL) && paymentRequestDocument.isPaymentRequestedCancelIndicator()) {
137 addExtraButton("methodToCall.removeCancelRequestFromPayment", appExternalImageURL + "buttonsmall_remreqcanc.gif", "Remove");
138 }
139
140 if (canCalculate()) {
141 addExtraButton("methodToCall.calculate", appExternalImageURL + "buttonsmall_calculate.gif", "Calculate");
142 }
143
144 if (getEditingMode().containsKey(PaymentRequestEditMode.ACCOUNTS_PAYABLE_PROCESSOR_CANCEL) ||
145 getEditingMode().containsKey(PaymentRequestEditMode.ACCOUNTS_PAYABLE_MANAGER_CANCEL)) {
146 if (PurapConstants.PurchaseOrderStatuses.CLOSED.equals(paymentRequestDocument.getPurchaseOrderDocument().getStatusCode())) {
147 //if the PO is CLOSED, show the 'open order' button; but only if there are no pending actions on the PO
148 if (!paymentRequestDocument.getPurchaseOrderDocument().isPendingActionIndicator()) {
149 addExtraButton("methodToCall.reopenPo", appExternalImageURL + "buttonsmall_openorder.gif", "Reopen PO");
150 }
151 }
152 else {
153 addExtraButton("methodToCall.cancel", externalImageURL + "buttonsmall_cancel.gif", "Cancel");
154 }
155 }
156 }
157
158 return extraButtons;
159 }
160
161 /**
162 * Determines whether the current user can continue creating or clear fields of the payment request in initial status. Conditions:
163 * - the Payment Request must be in the INITIATE state; and
164 * - the user must have the authorization to initiate a Payment Request.
165 *
166 * @return True if the current user can continue creating or clear fields of the initiated Payment Request.
167 */
168 public boolean canContinue() {
169 // preq must be in initiated status
170 boolean can = PaymentRequestStatuses.INITIATE.equals(getPaymentRequestDocument().getStatusCode());
171
172 // check user authorization
173 if (can) {
174 DocumentAuthorizer documentAuthorizer = SpringContext.getBean(DocumentHelperService.class).getDocumentAuthorizer(getPaymentRequestDocument());
175 can = documentAuthorizer.canInitiate(KFSConstants.FinancialDocumentTypeCodes.PAYMENT_REQUEST, GlobalVariables.getUserSession().getPerson());
176 }
177
178 return can;
179 }
180
181 /**
182 * Determine whether the current user can calculate the paymentRequest. Conditions:
183 * - Payment Request is not FullDocumentEntryCompleted, and
184 * - current user has the permission to edit the document.
185 *
186 * @return True if the current user can calculate the Payment Request.
187 */
188 public boolean canCalculate() {
189 // preq must not be FullDocumentEntryCompleted
190 boolean can = !SpringContext.getBean(PurapService.class).isFullDocumentEntryCompleted(getPaymentRequestDocument());
191
192 // check user authorization: whoever can edit can calculate
193 can = can && documentActions.containsKey(KNSConstants.KUALI_ACTION_CAN_EDIT);
194
195 //FIXME this is temporary so that calculate will show up at tax
196 can = can || editingMode.containsKey(PaymentRequestEditMode.TAX_AREA_EDITABLE);
197
198 return can;
199 }
200
201 /**
202 * @see org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase#shouldMethodToCallParameterBeUsed(java.lang.String, java.lang.String, javax.servlet.http.HttpServletRequest)
203 */
204 @Override
205 public boolean shouldMethodToCallParameterBeUsed(String methodToCallParameterName, String methodToCallParameterValue, HttpServletRequest request) {
206 if (KNSConstants.DISPATCH_REQUEST_PARAMETER.equals(methodToCallParameterName) &&
207 ("changeUseTaxIndicator".equals(methodToCallParameterValue))) {
208 return true;
209 }
210 return super.shouldMethodToCallParameterBeUsed(methodToCallParameterName, methodToCallParameterValue, request);
211 }
212
213 }
214