/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kuali.kfs.module.purap.document.web.struts; import java.util.HashMap; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.kuali.kfs.module.purap.PurapConstants; import org.kuali.kfs.module.purap.PurapConstants.PREQDocumentsStrings; import org.kuali.kfs.module.purap.PurapConstants.PaymentRequestStatuses; import org.kuali.kfs.module.purap.PurapKeyConstants; import org.kuali.kfs.module.purap.PurapPropertyConstants; import org.kuali.kfs.module.purap.businessobject.PaymentRequestItem; import org.kuali.kfs.module.purap.document.AccountsPayableDocument; import org.kuali.kfs.module.purap.document.PaymentRequestDocument; import org.kuali.kfs.module.purap.document.PurchaseOrderDocument; import org.kuali.kfs.module.purap.document.PurchasingAccountsPayableDocument; import org.kuali.kfs.module.purap.document.service.PaymentRequestService; import org.kuali.kfs.module.purap.document.service.PurapService; import org.kuali.kfs.module.purap.document.service.PurchaseOrderService; import org.kuali.kfs.module.purap.document.validation.event.AttributedCalculateAccountsPayableEvent; import org.kuali.kfs.module.purap.document.validation.event.AttributedContinuePurapEvent; import org.kuali.kfs.module.purap.document.validation.event.AttributedPreCalculateAccountsPayableEvent; import org.kuali.kfs.module.purap.service.PurapAccountingService; import org.kuali.kfs.module.purap.util.PurQuestionCallback; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.KFSKeyConstants; import org.kuali.kfs.sys.KFSPropertyConstants; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.kfs.sys.service.UniversityDateService; import org.kuali.rice.core.api.config.property.ConfigurationService; import org.kuali.rice.core.api.util.RiceConstants; import org.kuali.rice.core.api.util.type.KualiDecimal; import org.kuali.rice.kew.api.exception.WorkflowException; import org.kuali.rice.kim.api.KimConstants; import org.kuali.rice.kns.question.ConfirmationQuestion; import org.kuali.rice.kns.service.DocumentHelperService; import org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase; import org.kuali.rice.krad.service.KualiRuleService; import org.kuali.rice.krad.util.GlobalVariables; import org.kuali.rice.krad.util.KRADConstants; import org.kuali.rice.krad.util.ObjectUtils; /** * Struts Action for Payment Request document. */ public class PaymentRequestAction extends AccountsPayableActionBase { static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(PaymentRequestAction.class); /** * Do initialization for a new payment request. * * @see org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase#createDocument(org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase) */ @Override protected void createDocument(KualiDocumentFormBase kualiDocumentFormBase) throws WorkflowException { super.createDocument(kualiDocumentFormBase); ((PaymentRequestDocument) kualiDocumentFormBase.getDocument()).initiateDocument(); } /** * @see org.kuali.rice.kns.web.struts.action.KualiAction#refresh(org.apache.struts.action.ActionMapping, * org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ @Override public ActionForward refresh(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { PaymentRequestForm preqForm = (PaymentRequestForm) form; PaymentRequestDocument document = (PaymentRequestDocument) preqForm.getDocument(); return super.refresh(mapping, form, request, response); } /** * Executes the continue action on a payment request. Populates and initializes the rest of the payment request besides what was * shown on the init screen. * * @param mapping An ActionMapping * @param form An ActionForm * @param request The HttpServletRequest * @param response The HttpServletResponse * @throws Exception * @return An ActionForward */ public ActionForward continuePREQ(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { LOG.debug("continuePREQ() method"); PaymentRequestForm preqForm = (PaymentRequestForm) form; PaymentRequestDocument paymentRequestDocument = (PaymentRequestDocument) preqForm.getDocument(); boolean poNotNull = true; boolean rulePassed = SpringContext.getBean(KualiRuleService.class).applyRules(new AttributedContinuePurapEvent(paymentRequestDocument)); if (!rulePassed){ return mapping.findForward(KFSConstants.MAPPING_BASIC); } GlobalVariables.getMessageMap().clearErrorPath(); GlobalVariables.getMessageMap().addToErrorPath(KFSPropertyConstants.DOCUMENT); //check for a po id if (ObjectUtils.isNull(paymentRequestDocument.getPurchaseOrderIdentifier())) { GlobalVariables.getMessageMap().putError(PurapPropertyConstants.PURCHASE_ORDER_IDENTIFIER, KFSKeyConstants.ERROR_REQUIRED, PREQDocumentsStrings.PURCHASE_ORDER_ID); poNotNull = false; } if (ObjectUtils.isNull(paymentRequestDocument.getInvoiceDate())) { GlobalVariables.getMessageMap().putError(PurapPropertyConstants.INVOICE_DATE, KFSKeyConstants.ERROR_REQUIRED, PREQDocumentsStrings.INVOICE_DATE); poNotNull = false; } if (ObjectUtils.isNull(paymentRequestDocument.getInvoiceNumber())) { GlobalVariables.getMessageMap().putError(PurapPropertyConstants.INVOICE_NUMBER, KFSKeyConstants.ERROR_REQUIRED, PREQDocumentsStrings.INVOICE_NUMBER); poNotNull = false; } paymentRequestDocument.setInvoiceNumber(paymentRequestDocument.getInvoiceNumber().toUpperCase()); if (ObjectUtils.isNull(paymentRequestDocument.getVendorInvoiceAmount())) { GlobalVariables.getMessageMap().putError(PurapPropertyConstants.VENDOR_INVOICE_AMOUNT, KFSKeyConstants.ERROR_REQUIRED, PREQDocumentsStrings.VENDOR_INVOICE_AMOUNT); poNotNull = false; } //exit early as the po is null, no need to proceed further until this is taken care of if(poNotNull == false){ return mapping.findForward(KFSConstants.MAPPING_BASIC); } PurchaseOrderDocument po = SpringContext.getBean(PurchaseOrderService.class).getCurrentPurchaseOrder(paymentRequestDocument.getPurchaseOrderIdentifier()); if (ObjectUtils.isNotNull(po)) { // TODO figure out a more straightforward way to do this. ailish put this in so the link id would be set and the perm check would work paymentRequestDocument.setAccountsPayablePurchasingDocumentLinkIdentifier(po.getAccountsPayablePurchasingDocumentLinkIdentifier()); //check to see if user is allowed to initiate doc based on PO sensitive data if (!SpringContext.getBean(DocumentHelperService.class).getDocumentAuthorizer(paymentRequestDocument).isAuthorizedByTemplate(paymentRequestDocument, KRADConstants.KNS_NAMESPACE, KimConstants.PermissionTemplateNames.OPEN_DOCUMENT, GlobalVariables.getUserSession().getPrincipalId())) { throw buildAuthorizationException("initiate document", paymentRequestDocument); } } if(!SpringContext.getBean(PaymentRequestService.class).isPurchaseOrderValidForPaymentRequestDocumentCreation(paymentRequestDocument,po)) { return mapping.findForward(KFSConstants.MAPPING_BASIC); } // perform duplicate check which will forward to a question prompt if one is found ActionForward forward = performDuplicatePaymentRequestAndEncumberFiscalYearCheck(mapping, form, request, response, paymentRequestDocument); if (forward != null) { return forward; } // If we are here either there was no duplicate or there was a duplicate and the user hits continue, in either case we need // to validate the business rules SpringContext.getBean(PaymentRequestService.class).populateAndSavePaymentRequest(paymentRequestDocument); // force calculation preqForm.setCalculated(false); //TODO if better, move this to the action just before preq goes into ATAX status // force calculation for tax preqForm.setCalculatedTax(false); // sort below the line SpringContext.getBean(PurapService.class).sortBelowTheLine(paymentRequestDocument); // update the counts on the form preqForm.updateItemCounts(); return mapping.findForward(KFSConstants.MAPPING_BASIC); } /** * Clears the initial fields on the <code>PaymentRequestDocument</code> which should be accessible from the given form. * * @param mapping An ActionMapping * @param form An ActionForm, which must be a PaymentRequestForm * @param request The HttpServletRequest * @param response The HttpServletResponse * @throws Exception * @return An ActionForward */ public ActionForward clearInitFields(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { LOG.debug("clearInitValues() method"); PaymentRequestForm preqForm = (PaymentRequestForm) form; PaymentRequestDocument paymentRequestDocument = (PaymentRequestDocument) preqForm.getDocument(); paymentRequestDocument.clearInitFields(); return super.refresh(mapping, form, request, response); } /** * This method runs two checks based on the user input on PREQ initiate screen: Encumber next fiscal year check and Duplicate * payment request check. Encumber next fiscal year is checked first and will display a warning message to the user if it's the * case. Duplicate payment request check calls <code>PaymentRequestService</code> to perform the duplicate payment request * check. If one is found, a question is setup and control is forwarded to the question action method. Coming back from the * question prompt the button that was clicked is checked and if 'no' was selected they are forward back to the page still in * init mode. * * @param mapping An ActionMapping * @param form An ActionForm * @param request The HttpServletRequest * @param response The HttpServletResponse * @param paymentRequestDocument The PaymentRequestDocument * @throws Exception * @return An ActionForward * @see org.kuali.kfs.module.purap.document.service.PaymentRequestService */ protected ActionForward performDuplicatePaymentRequestAndEncumberFiscalYearCheck(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response, PaymentRequestDocument paymentRequestDocument) throws Exception { ActionForward forward = null; Object question = request.getParameter(KFSConstants.QUESTION_INST_ATTRIBUTE_NAME); if (question == null) { // perform encumber next fiscal year check and prompt warning message if needs if (isEncumberNextFiscalYear(paymentRequestDocument)) { String questionText = SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString(PurapKeyConstants.WARNING_ENCUMBER_NEXT_FY); return this.performQuestionWithoutInput(mapping, form, request, response, PREQDocumentsStrings.ENCUMBER_NEXT_FISCAL_YEAR_QUESTION, questionText, KFSConstants.CONFIRMATION_QUESTION, KFSConstants.ROUTE_METHOD, ""); } else { // perform duplicate payment request check HashMap<String, String> duplicateMessages = SpringContext.getBean(PaymentRequestService.class).paymentRequestDuplicateMessages(paymentRequestDocument); if (!duplicateMessages.isEmpty()) { return this.performQuestionWithoutInput(mapping, form, request, response, PREQDocumentsStrings.DUPLICATE_INVOICE_QUESTION, duplicateMessages.get(PREQDocumentsStrings.DUPLICATE_INVOICE_QUESTION), KFSConstants.CONFIRMATION_QUESTION, KFSConstants.ROUTE_METHOD, ""); } } } else { Object buttonClicked = request.getParameter(KFSConstants.QUESTION_CLICKED_BUTTON); // If the user replies 'Yes' to the encumber-next-year-question, proceed with duplicate payment check if (PurapConstants.PREQDocumentsStrings.ENCUMBER_NEXT_FISCAL_YEAR_QUESTION.equals(question) && ConfirmationQuestion.YES.equals(buttonClicked)) { HashMap<String, String> duplicateMessages = SpringContext.getBean(PaymentRequestService.class).paymentRequestDuplicateMessages(paymentRequestDocument); if (!duplicateMessages.isEmpty()) { return this.performQuestionWithoutInput(mapping, form, request, response, PREQDocumentsStrings.DUPLICATE_INVOICE_QUESTION, duplicateMessages.get(PREQDocumentsStrings.DUPLICATE_INVOICE_QUESTION), KFSConstants.CONFIRMATION_QUESTION, KFSConstants.ROUTE_METHOD, ""); } } // If the user replies 'No' to either of the questions, redirect to the PREQ initiate page. else if ((PurapConstants.PREQDocumentsStrings.ENCUMBER_NEXT_FISCAL_YEAR_QUESTION.equals(question) || PurapConstants.PREQDocumentsStrings.DUPLICATE_INVOICE_QUESTION.equals(question)) && ConfirmationQuestion.NO.equals(buttonClicked)) { paymentRequestDocument.updateAndSaveAppDocStatus(PurapConstants.PaymentRequestStatuses.APPDOC_INITIATE); forward = mapping.findForward(KFSConstants.MAPPING_BASIC); } } return forward; } /** * Check if the current PREQ encumber next fiscal year from PO document. * * @param paymentRequestDocument * @return */ protected boolean isEncumberNextFiscalYear(PaymentRequestDocument paymentRequestDocument) { Integer fiscalYear = SpringContext.getBean(UniversityDateService.class).getCurrentFiscalYear(); if (paymentRequestDocument.getPurchaseOrderDocument().getPostingYear().intValue() > fiscalYear) { return true; } return false; } /** * Puts a payment on hold, prompting for a reason beforehand. This stops further approvals or routing. * * @param mapping An ActionMapping * @param form An ActionForm * @param request The HttpServletRequest * @param response The HttpServletResponse * @throws Exception * @return An ActionForward */ public ActionForward addHoldOnPayment(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String operation = "Hold "; PurQuestionCallback callback = new PurQuestionCallback() { @Override public AccountsPayableDocument doPostQuestion(AccountsPayableDocument document, String noteText) throws Exception { document = SpringContext.getBean(PaymentRequestService.class).addHoldOnPaymentRequest((PaymentRequestDocument) document, noteText); return document; } }; return askQuestionWithInput(mapping, form, request, response, PREQDocumentsStrings.HOLD_PREQ_QUESTION, PREQDocumentsStrings.HOLD_NOTE_PREFIX, operation, PurapKeyConstants.PAYMENT_REQUEST_MESSAGE_HOLD_DOCUMENT, callback); } /** * Removes a hold on the payment request. * * @param mapping An ActionMapping * @param form An ActionForm * @param request The HttpServletRequest * @param response The HttpServletResponse * @throws Exception * @return An ActionForward */ public ActionForward removeHoldFromPayment(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String operation = "Remove "; PurQuestionCallback callback = new PurQuestionCallback() { @Override public AccountsPayableDocument doPostQuestion(AccountsPayableDocument document, String noteText) throws Exception { document = SpringContext.getBean(PaymentRequestService.class).removeHoldOnPaymentRequest((PaymentRequestDocument) document, noteText); return document; } }; return askQuestionWithInput(mapping, form, request, response, PREQDocumentsStrings.REMOVE_HOLD_PREQ_QUESTION, PREQDocumentsStrings.REMOVE_HOLD_NOTE_PREFIX, operation, PurapKeyConstants.PAYMENT_REQUEST_MESSAGE_REMOVE_HOLD_DOCUMENT, callback); } /** * This action requests a cancel on a preq, prompting for a reason before hand. This stops further approvals or routing. * * @param mapping An ActionMapping * @param form An ActionForm * @param request The HttpServletRequest * @param response The HttpServletResponse * @throws Exception * @return An ActionForward */ public ActionForward requestCancelOnPayment(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String operation = "Cancel "; PurQuestionCallback callback = new PurQuestionCallback() { @Override public AccountsPayableDocument doPostQuestion(AccountsPayableDocument document, String noteText) throws Exception { SpringContext.getBean(PaymentRequestService.class).requestCancelOnPaymentRequest((PaymentRequestDocument) document, noteText); return document; } }; return askQuestionWithInput(mapping, form, request, response, PREQDocumentsStrings.CANCEL_PREQ_QUESTION, PREQDocumentsStrings.CANCEL_NOTE_PREFIX, operation, PurapKeyConstants.PAYMENT_REQUEST_MESSAGE_CANCEL_DOCUMENT, callback); } /** * @see org.kuali.kfs.module.purap.document.web.struts.AccountsPayableActionBase#cancelPOActionCallbackMethod() */ // @Override // protected PurQuestionCallback cancelPOActionCallbackMethod() { // // return new PurQuestionCallback() { // public AccountsPayableDocument doPostQuestion(AccountsPayableDocument document, String noteText) throws Exception { // PaymentRequestDocument preqDocument = (PaymentRequestDocument) document; // preqDocument.setReopenPurchaseOrderIndicator(true); // return preqDocument; // } // }; // } /** * Removes a request for cancel on a payment request. * * @param mapping An ActionMapping * @param form An ActionForm * @param request The HttpServletRequest * @param response The HttpServletResponse * @throws Exception * @return An ActionForward */ public ActionForward removeCancelRequestFromPayment(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String operation = "Cancel "; PurQuestionCallback callback = new PurQuestionCallback() { @Override public AccountsPayableDocument doPostQuestion(AccountsPayableDocument document, String noteText) throws Exception { SpringContext.getBean(PaymentRequestService.class).removeRequestCancelOnPaymentRequest((PaymentRequestDocument) document, noteText); return document; } }; return askQuestionWithInput(mapping, form, request, response, PREQDocumentsStrings.REMOVE_CANCEL_PREQ_QUESTION, PREQDocumentsStrings.REMOVE_CANCEL_NOTE_PREFIX, operation, PurapKeyConstants.PAYMENT_REQUEST_MESSAGE_REMOVE_CANCEL_DOCUMENT, callback); } /** * Calls a service method to calculate for a payment request document. * * @param apDoc The AccountsPayableDocument */ @Override protected void customCalculate(PurchasingAccountsPayableDocument apDoc) { PaymentRequestDocument preqDoc = (PaymentRequestDocument) apDoc; // set amounts on any empty preqDoc.updateExtendedPriceOnItems(); // calculation just for the tax area, only at tax review stage // by now, the general calculation shall have been done. if (StringUtils.equals(preqDoc.getApplicationDocumentStatus(), PaymentRequestStatuses.APPDOC_AWAITING_TAX_REVIEW)) { SpringContext.getBean(PaymentRequestService.class).calculateTaxArea(preqDoc); return; } // notice we're ignoring whether the boolean, because these are just warnings they shouldn't halt anything //Calculate Payment request before rules since the rule check totalAmount. SpringContext.getBean(PaymentRequestService.class).calculatePaymentRequest(preqDoc, true); SpringContext.getBean(KualiRuleService.class).applyRules(new AttributedCalculateAccountsPayableEvent(preqDoc)); } /** * @see org.kuali.kfs.module.purap.document.web.struts.AccountsPayableActionBase#getActionName() */ @Override public String getActionName() { return PurapConstants.PAYMENT_REQUEST_ACTION_NAME; } public ActionForward useAlternateVendor(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { PaymentRequestForm preqForm = (PaymentRequestForm) form; PaymentRequestDocument document = (PaymentRequestDocument) preqForm.getDocument(); SpringContext.getBean(PaymentRequestService.class).changeVendor( document, document.getAlternateVendorHeaderGeneratedIdentifier(), document.getAlternateVendorDetailAssignedIdentifier()); return mapping.findForward(KFSConstants.MAPPING_BASIC); } public ActionForward useOriginalVendor(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { PaymentRequestForm preqForm = (PaymentRequestForm) form; PaymentRequestDocument document = (PaymentRequestDocument) preqForm.getDocument(); SpringContext.getBean(PaymentRequestService.class).changeVendor( document, document.getOriginalVendorHeaderGeneratedIdentifier(), document.getOriginalVendorDetailAssignedIdentifier()); return mapping.findForward(KFSConstants.MAPPING_BASIC); } @Override public ActionForward route (ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { PaymentRequestDocument preq = ((PaymentRequestForm)form).getPaymentRequestDocument(); SpringContext.getBean(PurapService.class).prorateForTradeInAndFullOrderDiscount(preq); SpringContext.getBean(PurapAccountingService.class).updateAccountAmounts(preq); if (preq.isClosePurchaseOrderIndicator()) { PurchaseOrderDocument po = preq.getPurchaseOrderDocument(); if (po.canClosePOForTradeIn()) { return super.route(mapping, form, request, response); } else { return mapping.findForward(KFSConstants.MAPPING_BASIC); } } else { return super.route(mapping, form, request, response); } } /** * Overrides to invoke the updateAccountAmounts so that the account percentage will be * correctly updated before validation for account percent is called. * @see org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase#approve(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ @Override public ActionForward approve(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { PaymentRequestDocument preq = ((PaymentRequestForm)form).getPaymentRequestDocument(); SpringContext.getBean(PurapService.class).prorateForTradeInAndFullOrderDiscount(preq); // if tax is required but not yet calculated, return and prompt user to calculate if (requiresCalculateTax((PaymentRequestForm)form)) { GlobalVariables.getMessageMap().putError(KFSConstants.DOCUMENT_ERRORS, PurapKeyConstants.ERROR_APPROVE_REQUIRES_CALCULATE); return mapping.findForward(KFSConstants.MAPPING_BASIC); } // enforce calculating tax again upon approval, just in case user changes tax data without calculation // other wise there will be a loophole, because the taxCalculated indicator is already set upon first calculation // and thus system wouldn't know it's not re-calculated after tax data are changed if (SpringContext.getBean(KualiRuleService.class).applyRules(new AttributedPreCalculateAccountsPayableEvent(preq))) { // pre-calculation rules succeed, calculate tax again and go ahead with approval customCalculate(preq); SpringContext.getBean(PurapAccountingService.class).updateAccountAmounts(preq); return super.approve(mapping, form, request, response); } else { // pre-calculation rules fail, go back to same page with error messages return mapping.findForward(KFSConstants.MAPPING_BASIC); } } /** * Checks if tax calculation is required. * Currently it is required when preq is awaiting for tax approval and tax has not already been calculated. * * @param apForm A Form, which must inherit from <code>AccountsPayableFormBase</code> * @return true if calculation is required, false otherwise */ protected boolean requiresCalculateTax(PaymentRequestForm preqForm) { PaymentRequestDocument preq = (PaymentRequestDocument) preqForm.getDocument(); boolean requiresCalculateTax = StringUtils.equals(preq.getApplicationDocumentStatus(), PaymentRequestStatuses.APPDOC_AWAITING_TAX_REVIEW) && !preqForm.isCalculatedTax(); return requiresCalculateTax; } public ActionForward changeUseTaxIndicator(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { PurchasingAccountsPayableDocument document = (PurchasingAccountsPayableDocument) ((PurchasingAccountsPayableFormBase) form).getDocument(); //clear/recalculate tax and recreate GL entries SpringContext.getBean(PurapService.class).updateUseTaxIndicator(document, !document.isUseTaxIndicator()); SpringContext.getBean(PurapService.class).calculateTax(document); //TODO: add recalculate GL entries hook here return mapping.findForward(KFSConstants.MAPPING_BASIC); } /** * Calls service to clear tax info. */ public ActionForward clearTaxInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { PaymentRequestForm prForm = (PaymentRequestForm) form; PaymentRequestDocument document = (PaymentRequestDocument) prForm.getDocument(); PaymentRequestService taxService = SpringContext.getBean(PaymentRequestService.class); /* call service to clear previous lines */ taxService.clearTax(document); return mapping.findForward(KFSConstants.MAPPING_BASIC); } @Override public ActionForward cancel(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { PaymentRequestForm preqForm = (PaymentRequestForm) form; PaymentRequestDocument preqDocument = (PaymentRequestDocument) preqForm.getDocument(); ActionForward forward = mapping.findForward(RiceConstants.MAPPING_BASIC); if(preqDocument.getPurchaseOrderDocument().isPendingActionIndicator()) { GlobalVariables.getMessageMap().putError( KFSPropertyConstants.DOCUMENT + "." + KFSPropertyConstants.DOCUMENT_NUMBER, PurapKeyConstants.ERROR_PAYMENT_REQUEST_CANNOT_BE_CANCELLED); } else { forward = super.cancel(mapping, form, request, response); } return forward; } /** * For each quantity based item, set item quantity to ZERO. * * @param mapping * @param form * @param request * @param response * @return * @throws Exception */ public ActionForward clearQty(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { PaymentRequestForm preqForm = (PaymentRequestForm) form; PaymentRequestDocument preqDocument = (PaymentRequestDocument) preqForm.getDocument(); for (PaymentRequestItem item : (List<PaymentRequestItem>) preqDocument.getItems()) { if (item.getItemType().isQuantityBasedGeneralLedgerIndicator()) { item.setItemQuantity(null); } } return mapping.findForward(KFSConstants.MAPPING_BASIC); } /** * For each quantity based item, loads total outstanding quantity into item quantity. * * @param mapping * @param form * @param request * @param response * @return * @throws Exception */ public ActionForward loadQty(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { PaymentRequestForm preqForm = (PaymentRequestForm) form; PaymentRequestDocument preqDocument = (PaymentRequestDocument) preqForm.getDocument(); for (PaymentRequestItem item : (List<PaymentRequestItem>) preqDocument.getItems()) { if (item.getItemType().isQuantityBasedGeneralLedgerIndicator() && (item.getPoOutstandingQuantity() != null) && (item.getPoOutstandingQuantity().isGreaterThan(KualiDecimal.ZERO))) { item.setItemQuantity(item.getPoOutstandingQuantity()); } } return mapping.findForward(KFSConstants.MAPPING_BASIC); } }