/* * 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.ArrayList; import java.util.List; import java.util.Map; import org.kuali.kfs.fp.businessobject.Check; import org.kuali.kfs.fp.businessobject.CheckBase; import org.kuali.kfs.fp.businessobject.CoinDetail; import org.kuali.kfs.fp.businessobject.CurrencyDetail; import org.kuali.kfs.fp.businessobject.DepositWizardCashieringCheckHelper; import org.kuali.kfs.fp.businessobject.DepositWizardHelper; import org.kuali.kfs.fp.businessobject.format.CashReceiptDepositTypeFormatter; import org.kuali.kfs.fp.document.CashReceiptDocument; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.KFSConstants.DocumentStatusCodes.CashReceipt; import org.kuali.kfs.sys.KFSKeyConstants; import org.kuali.kfs.sys.businessobject.Bank; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.kfs.sys.service.BankService; import org.kuali.rice.core.api.util.type.KualiDecimal; import org.kuali.rice.core.web.format.CurrencyFormatter; import org.kuali.rice.kns.util.WebUtils; import org.kuali.rice.kns.web.struts.form.KualiForm; /** * This class is the action form for the deposit document wizard. */ public class DepositWizardForm extends KualiForm { private String cashDrawerCampusCode; private String cashManagementDocId; private List<CashReceiptDocument> depositableCashReceipts; private List depositWizardHelpers; private List<Check> depositableCashieringChecks; private transient List<DepositWizardCashieringCheckHelper> depositWizardCashieringCheckHelpers; private List<CashReceiptDocument> checkFreeCashReceipts; // Deposit fields private Bank bank; private String bankCode; private String depositTypeCode; private String depositTicketNumber; private CurrencyDetail currencyDetail; private CoinDetail coinDetail; private KualiDecimal targetDepositAmount; private KualiDecimal currentCheckTotal; // carried over editing modes and document actions to make the bank tags happy protected Map editingMode; protected Map documentActions; protected String noVerifiedCashErrorMessage = ""; /** * Constructs a DepositWizardForm class instance. */ public DepositWizardForm() { depositableCashReceipts = new ArrayList(); depositableCashieringChecks = new ArrayList<Check>(); depositWizardHelpers = new ArrayList(); depositWizardCashieringCheckHelpers = new ArrayList<DepositWizardCashieringCheckHelper>(); setFormatterType("depositTypeCode", CashReceiptDepositTypeFormatter.class); setDefaultBankCode(); } /** * Sets the bank code for a new deposit to the setup default for the Cash Management document. */ public void setDefaultBankCode() { Bank defaultBank = SpringContext.getBean(BankService.class).getDefaultBankByDocType(KFSConstants.FinancialDocumentTypeCodes.CASH_MANAGEMENT); if (defaultBank != null) { this.bankCode = defaultBank.getBankCode(); this.bank = defaultBank; } } /** * @return current value of cashManagementDocId. */ public String getCashManagementDocId() { return cashManagementDocId; } /** * Sets the cashManagementDocId attribute value. * * @param cashManagementDocId The cashManagementDocId to set. */ public void setCashManagementDocId(String cashManagementDocId) { this.cashManagementDocId = cashManagementDocId; } /** * @param depositTypeCode */ public void setDepositTypeCode(String depositTypeCode) { this.depositTypeCode = depositTypeCode; } /** * @return depositTypeCode */ public String getDepositTypeCode() { return depositTypeCode; } /** * Hack to make the translated depositTypeCode more readily available to the JSP * * @return translated depositTypeCode */ public String getDepositTypeString() { CashReceiptDepositTypeFormatter f = new CashReceiptDepositTypeFormatter(); return (String) f.format(getDepositTypeCode()); } /** * @return List */ public List<CashReceiptDocument> getDepositableCashReceipts() { return depositableCashReceipts; } /** * @param cashReceiptsReadyForDeposit */ public void setDepositableCashReceipts(List cashReceiptsReadyForDeposit) { this.depositableCashReceipts = cashReceiptsReadyForDeposit; } public CashReceiptDocument getDepositableCashReceipt(int i) { while (depositableCashReceipts.size() <= i) { depositableCashReceipts.add(new CashReceiptDocument()); } return depositableCashReceipts.get(i); } /** * @return ArrayList */ public List getDepositWizardHelpers() { return depositWizardHelpers; } /** * @param depositWizardHelpers */ public void setDepositWizardHelpers(List depositWizardHelpers) { this.depositWizardHelpers = depositWizardHelpers; } /** * This method retrieves whether the cash receipt ID at the specified index will be selected or not. * * @param index * @return DepositWizarHelper */ public DepositWizardHelper getDepositWizardHelper(int index) { while (this.depositWizardHelpers.size() <= index) { this.depositWizardHelpers.add(new DepositWizardHelper()); // default to no check } return (DepositWizardHelper) this.depositWizardHelpers.get(index); } /** * @return current value of cashDrawerCampusCode. */ public String getCashDrawerCampusCode() { return cashDrawerCampusCode; } /** * Sets the cashDrawerCampusCode attribute value. * * @param cashDrawerCampusCode The cashDrawerCampusCode to set. */ public void setCashDrawerCampusCode(String cashDrawerVerificationUnit) { this.cashDrawerCampusCode = cashDrawerVerificationUnit; } /** * @return current value of bankCode. */ public String getBankCode() { return bankCode; } /** * Sets the bankCode attribute value. * * @param bankCode The bankCode to set. */ public void setBankCode(String bankCode) { this.bankCode = bankCode; } /** * @return current value of depositTicketNumber. */ public String getDepositTicketNumber() { return depositTicketNumber; } /** * Sets the depositTicketNumber attribute value. * * @param depositTicketNumber The depositTicketNumber to set. */ public void setDepositTicketNumber(String depositTicketNumber) { this.depositTicketNumber = depositTicketNumber; } /** * @return current value of bank. */ public Bank getBank() { return bank; } /** * Sets the bank attribute value. * * @param bank The bank to set. */ public void setBank(Bank bank) { this.bank = bank; } /** * Gets the coinDetail attribute. * * @return Returns the coinDetail. */ public CoinDetail getCoinDetail() { return coinDetail; } /** * Sets the coinDetail attribute value. * * @param coinDetail The coinDetail to set. */ public void setCoinDetail(CoinDetail coinDetail) { this.coinDetail = coinDetail; } /** * Gets the currencyDetail attribute. * * @return Returns the currencyDetail. */ public CurrencyDetail getCurrencyDetail() { return currencyDetail; } /** * Sets the currencyDetail attribute value. * * @param currencyDetail The currencyDetail to set. */ public void setCurrencyDetail(CurrencyDetail currencyDetail) { this.currencyDetail = currencyDetail; } /** * Retrieves the summed total amount in a currency format with commas. * * @return String */ public String getCurrencyFormattedSumTotalAmount() { return (String) new CurrencyFormatter().format(getTotalDollarAmount()); } /** * This method returns the overall total of the document - coin plus check plus cash. * * @return KualiDecimal */ public KualiDecimal getTotalDollarAmount() { KualiDecimal sumTotalAmount = getTotalCoinAmount().add(getTotalCurrencyAmount()); return sumTotalAmount; } /** * Gets the totalCoinAmount attribute. * * @return Returns the totalCoinAmount. */ public KualiDecimal getTotalCoinAmount() { return (coinDetail != null) ? coinDetail.getTotalAmount() : KualiDecimal.ZERO; } /** * Gets the totalCurrencyAmount attribute. * * @return Returns the totalCurrencyAmount. */ public KualiDecimal getTotalCurrencyAmount() { return (currencyDetail != null) ? currencyDetail.getTotalAmount() : KualiDecimal.ZERO; } /** * Explains if this deposit form is for creating a final deposit or not * * @return true if this deposit form will create a final deposit, false if it will create an interim */ public boolean isDepositFinal() { return (depositTypeCode.equals(KFSConstants.DepositConstants.DEPOSIT_TYPE_FINAL)); } /** * Gets the depositableCashieringChecks attribute. * * @return Returns the depositableCashieringChecks. */ public List<Check> getDepositableCashieringChecks() { return depositableCashieringChecks; } /** * Sets the depositableCashieringChecks attribute value. * * @param depositableCashieringChecks The depositableCashieringChecks to set. */ public void setDepositableCashieringChecks(List<Check> depositableCashieringChecks) { this.depositableCashieringChecks = depositableCashieringChecks; } /** * Return the deposit cashiering check at the given index * * @param index index of check to retrieve * @return a check */ public Check getDepositableCashieringCheck(int index) { while (this.depositableCashieringChecks.size() <= index) { this.depositableCashieringChecks.add(new CheckBase()); } return this.depositableCashieringChecks.get(index); } /** * Gets the depositWizardCashieringCheckHelpers attribute. * * @return Returns the depositWizardCashieringCheckHelpers. */ public List<DepositWizardCashieringCheckHelper> getDepositWizardCashieringCheckHelpers() { return depositWizardCashieringCheckHelpers; } /** * Gets the checkFreeCashReceipts attribute. * * @return Returns the checkFreeCashReceipts. */ public List<CashReceiptDocument> getCheckFreeCashReceipts() { return checkFreeCashReceipts; } /** * Sets the checkFreeCashReceipts attribute value. * * @param checkFreeCashReceipts The checkFreeCashReceipts to set. */ public void setCheckFreeCashReceipts(List<CashReceiptDocument> checkFreeCashReceipts) { this.checkFreeCashReceipts = checkFreeCashReceipts; } /** * Retreive a single check free cash receipt * * @param index the index of the cash receipt * @return a cash receipt document */ public CashReceiptDocument getCheckFreeCashReceipt(int index) { while (this.checkFreeCashReceipts.size() <= index) { this.checkFreeCashReceipts.add(new CashReceiptDocument()); } return this.checkFreeCashReceipts.get(index); } /** * Sets the depositWizardCashieringCheckHelpers attribute value. * * @param depositWizardCashieringCheckHelpers The depositWizardCashieringCheckHelpers to set. */ public void setDepositWizardCashieringCheckHelpers(List<DepositWizardCashieringCheckHelper> depositWizardCashieringCheckHelpers) { this.depositWizardCashieringCheckHelpers = depositWizardCashieringCheckHelpers; } public DepositWizardCashieringCheckHelper getDepositWizardCashieringCheckHelper(int index) { while (this.depositWizardCashieringCheckHelpers.size() <= index) { this.depositWizardCashieringCheckHelpers.add(new DepositWizardCashieringCheckHelper()); } return this.depositWizardCashieringCheckHelpers.get(index); } /** * Gets the documentActions attribute. * @return Returns the documentActions. */ public Map getDocumentActions() { return documentActions; } /** * Sets the documentActions attribute value. * @param documentActions The documentActions to set. */ public void setDocumentActions(Map documentActions) { this.documentActions = documentActions; } /** * Gets the editingMode attribute. * @return Returns the editingMode. */ public Map getEditingMode() { return editingMode; } /** * Sets the editingMode attribute value. * @param editingMode The editingMode to set. */ public void setEditingMode(Map editingMode) { this.editingMode = editingMode; } /** * @return the total target amount which needs deposited */ public KualiDecimal getTargetDepositAmount() { return targetDepositAmount; } /** * Adds a cash receipt to the target total amount for the given deposit (if the deposit was final) * The amount to add is: confirmed check amount + confirmed currency amount + confirmed coin amount - change request * currency amount - change request coin amount * @param crDoc */ public void addCashReceiptToTargetTotal(CashReceiptDocument crDoc) { if (targetDepositAmount == null) { targetDepositAmount = KualiDecimal.ZERO; } String statusCode = crDoc.getFinancialSystemDocumentHeader().getFinancialDocumentStatusCode(); if (statusCode.equals(CashReceipt.VERIFIED) || statusCode.equals(CashReceipt.FINAL)) { targetDepositAmount = targetDepositAmount.add(crDoc.getTotalConfirmedCheckAmount()); } targetDepositAmount = targetDepositAmount.add(crDoc.getTotalConfirmedNetCashAmount()); } /** * Adds total undeposited cashiering transaction amount to the target total * @param transaction */ public void addCashieringTransactionToTargetTotal(KualiDecimal undepositedCheckAmount) { if (targetDepositAmount == null) { targetDepositAmount = KualiDecimal.ZERO; } targetDepositAmount = targetDepositAmount.subtract(undepositedCheckAmount); } /** * @return the current amount for checks needing depositing */ public KualiDecimal getCurrentCheckTotal() { return currentCheckTotal; } /** * Adds the check total for a cash receipt to checks * @param crDoc */ public void addCashReceiptToChecks(CashReceiptDocument crDoc) { if (currentCheckTotal == null) { currentCheckTotal = KualiDecimal.ZERO; } currentCheckTotal = currentCheckTotal.add(crDoc.getTotalConfirmedCheckAmount()); } /** * Adds the cashiering check total to checks * @param crDoc */ public void addCashieringReceiptToChecks() { if (currentCheckTotal == null) { currentCheckTotal = KualiDecimal.ZERO; } KualiDecimal totalCashieringChecksAmount = KualiDecimal.ZERO; for (Check cashieringCheck : depositableCashieringChecks) { totalCashieringChecksAmount = totalCashieringChecksAmount.add(cashieringCheck.getAmount()); } currentCheckTotal = currentCheckTotal.add(totalCashieringChecksAmount); } /** * Resets the current check total back to 0 for cases where the form is being refreshed after validation. */ public void resetCurrentCheckTotal() { currentCheckTotal = KualiDecimal.ZERO; } /** * @return the no verified cash error message */ public String getNoVerifiedCashErrorMessage() { String errorMessage = WebUtils.getKualiConfigurationService().getPropertyValueAsString(KFSKeyConstants.CashManagement.ERROR_NO_VERIFIED_CASH); errorMessage = errorMessage.replace("{0}", getCashDrawerCampusCode()); errorMessage = errorMessage.replace("{1}", getCashManagementDocId()); return WebUtils.filterHtmlAndReplaceRiceMarkup(errorMessage); } /** * @param noVerifiedCashErrorMessage the noVerifiedCashErrorMessage to set */ public void setNoVerifiedCashErrorMessage(String noVerifiedCashErrorMessage) { this.noVerifiedCashErrorMessage = noVerifiedCashErrorMessage; } }