/* * 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.fp.document.web.struts; import java.util.Iterator; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.kuali.kfs.fp.businessobject.AdvanceDepositDetail; import org.kuali.kfs.fp.document.AdvanceDepositDocument; import org.kuali.kfs.fp.document.validation.impl.AdvanceDepositDocumentRuleUtil; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.KFSPropertyConstants; import org.kuali.rice.core.api.util.type.KualiDecimal; import org.kuali.rice.krad.util.GlobalVariables; /** * This is the action class for the Advance Deposit document. */ public class AdvanceDepositAction extends CapitalAccountingLinesActionBase { /** * Adds handling for advance deposit detail amount updates. * * @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, * javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { AdvanceDepositForm adForm = (AdvanceDepositForm) form; if ( adForm != null && adForm.hasDocumentId()) { AdvanceDepositDocument adDoc = adForm.getAdvanceDepositDocument(); adDoc.setTotalAdvanceDepositAmount(calculateAdvanceDepositTotal(adDoc)); // recalc b/c changes to the amounts could // have happened } // proceed as usual return super.execute(mapping, form, request, response); } /* NOTE * The following method was originally added to fix the NPE caused by the reference to AdvanceDepositDocument inside AdvanceDepositDetail. * Now it's commented out as we are fixing the NPE in a better way, by removing the nested reference to AdvanceDepositDocument, * which is not used anymore. */ /** * Overridden to ensure that the nested AdvanceDepositDocuments in AdvanceDepositDetails are populated. * @see org.kuali.rice.kns.web.struts.action.KualiTransactionalDocumentActionBase#copy(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) * @Override public ActionForward copy(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { AdvanceDepositForm adForm = (AdvanceDepositForm) form; AdvanceDepositDocument adDoc = adForm.getAdvanceDepositDocument(); List<AdvanceDepositDetail> advanceDeposits = adDoc.getAdvanceDeposits(); for (AdvanceDepositDetail advanceDeposit: advanceDeposits) { /* somehow ObjectUtils.isNull(nestAdDoc) returns false here AdvanceDepositDocument nestAdDoc = advanceDeposit.getAdvanceDepositDocument(); if (ObjectUtils.isNull(nestAdDoc)) { nestAdDoc = null; } * // need to populate the referred document, otherwise there will be NPE when copying advanceDeposit.setAdvanceDepositDocument(adDoc); } return super.copy(mapping, form, request, response); } */ /** * Adds a AdvanceDepositDetail instance created from the current "new advanceDeposit" line to the document * * @param mapping * @param form * @param request * @param response * @return ActionForward * @throws Exception */ public ActionForward addAdvanceDeposit(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { AdvanceDepositForm adForm = (AdvanceDepositForm) form; AdvanceDepositDocument adDoc = adForm.getAdvanceDepositDocument(); AdvanceDepositDetail newAdvanceDeposit = adForm.getNewAdvanceDeposit(); adDoc.prepareNewAdvanceDeposit(newAdvanceDeposit); // advanceDeposit business rules boolean rulePassed = validateNewAdvanceDeposit(newAdvanceDeposit); if (rulePassed) { // add advanceDeposit adDoc.addAdvanceDeposit(newAdvanceDeposit); // clear the used advanceDeposit AdvanceDepositDetail advanceDepositDetail = new AdvanceDepositDetail(); advanceDepositDetail.setDefaultBankCode(); adForm.setNewAdvanceDeposit(advanceDepositDetail); } return mapping.findForward(KFSConstants.MAPPING_BASIC); } /** * Deletes the selected advanceDeposit (line) from the document * * @param mapping * @param form * @param request * @param response * @return ActionForward * @throws Exception */ public ActionForward deleteAdvanceDeposit(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { AdvanceDepositForm adForm = (AdvanceDepositForm) form; AdvanceDepositDocument adDoc = adForm.getAdvanceDepositDocument(); int deleteIndex = getLineToDelete(request); // delete advanceDeposit adDoc.removeAdvanceDeposit(deleteIndex); return mapping.findForward(KFSConstants.MAPPING_BASIC); } /** * This method validates a new advance deposit detail record. * * @param advanceDeposit * @return boolean */ protected boolean validateNewAdvanceDeposit(AdvanceDepositDetail advanceDeposit) { GlobalVariables.getMessageMap().addToErrorPath(KFSPropertyConstants.NEW_ADVANCE_DEPOSIT); boolean isValid = AdvanceDepositDocumentRuleUtil.validateAdvanceDeposit(advanceDeposit); GlobalVariables.getMessageMap().removeFromErrorPath(KFSPropertyConstants.NEW_ADVANCE_DEPOSIT); return isValid; } /** * Recalculates the advance deposit total since user could have changed it during their update. * * @param advanceDepositDocument */ protected KualiDecimal calculateAdvanceDepositTotal(AdvanceDepositDocument advanceDepositDocument) { KualiDecimal total = KualiDecimal.ZERO; Iterator<AdvanceDepositDetail> deposits = advanceDepositDocument.getAdvanceDeposits().iterator(); while (deposits.hasNext()) { AdvanceDepositDetail deposit = deposits.next(); if (deposit.getFinancialDocumentAdvanceDepositAmount() !=null) { total = total.add(deposit.getFinancialDocumentAdvanceDepositAmount()); } } return total; } }