/*
* 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 javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
import org.apache.struts.util.LabelValueBean;
import org.kuali.kfs.fp.businessobject.CapitalAssetInformation;
import org.kuali.kfs.fp.businessobject.CashDrawer;
import org.kuali.kfs.fp.businessobject.Check;
import org.kuali.kfs.fp.document.CapitalAssetEditable;
import org.kuali.kfs.fp.document.CashManagementDocument;
import org.kuali.kfs.fp.document.CashReceiptDocument;
import org.kuali.kfs.fp.document.service.CashManagementService;
import org.kuali.kfs.fp.document.service.CashReceiptCoverSheetService;
import org.kuali.kfs.fp.service.CashDrawerService;
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.context.SpringContext;
import org.kuali.kfs.sys.service.FinancialSystemWorkflowHelperService;
import org.kuali.rice.core.api.config.property.ConfigurationService;
import org.kuali.rice.core.api.util.type.KualiDecimal;
import org.kuali.rice.core.web.format.SimpleBooleanFormatter;
import org.kuali.rice.krad.util.GlobalVariables;
/**
* This class is the action form for Cash Receipts.
*/
public class CashReceiptForm extends CapitalAccountingLinesFormBase implements CapitalAssetEditable{
protected static final long serialVersionUID = 1L;
protected static final String CAN_PRINT_COVERSHEET_SIG_STR = "isCoverSheetPrintingAllowed";
protected Check newCheck;
protected Check newConfirmedCheck;
protected KualiDecimal checkTotal;
protected String checkEntryMode;
protected List checkEntryModes;
protected List baselineChecks;
protected List<CapitalAssetInformation> capitalAssetInformation;
/**
* Constructs a CashReceiptForm.java.
*/
public CashReceiptForm() {
super();
setFormatterType(CAN_PRINT_COVERSHEET_SIG_STR, SimpleBooleanFormatter.class);
setNewCheck(getCashReceiptDocument().createNewCheck());
setNewConfirmedCheck(getCashReceiptDocument().createNewConfirmedCheck());
checkEntryModes = new ArrayList();
checkEntryModes.add(new LabelValueBean("Individual Checks/Batches", CashReceiptDocument.CHECK_ENTRY_DETAIL));
checkEntryModes.add(new LabelValueBean("Total Only", CashReceiptDocument.CHECK_ENTRY_TOTAL));
baselineChecks = new ArrayList();
capitalAssetInformation = new ArrayList<CapitalAssetInformation>();
this.capitalAccountingLine.setCanCreateAsset(false); //This document can only edit asset information
}
@Override
protected String getDefaultDocumentTypeName() {
return "CR";
}
@Override
public void populate(HttpServletRequest request) {
super.populate(request);
setCheckEntryMode(getCashReceiptDocument().getCheckEntryMode());
}
/**
* @return CashReceiptDocument
*/
public CashReceiptDocument getCashReceiptDocument() {
return (CashReceiptDocument) getDocument();
}
/**
* @return Check
*/
public Check getNewCheck() {
return newCheck;
}
/**
* @param newCheck
*/
public void setNewCheck(Check newCheck) {
this.newCheck = newCheck;
}
/**
* @return Confirmed Check
*/
public Check getNewConfirmedCheck() {
return newConfirmedCheck;
}
/**
* @param newConfirmedCheck
*/
public void setNewConfirmedCheck(Check newConfirmedCheck) {
this.newConfirmedCheck = newConfirmedCheck;
}
/**
* @param checkTotal
*/
public void setCheckTotal(KualiDecimal checkTotal) {
this.checkTotal = checkTotal;
}
/**
* @return KualiDecimal
*/
public KualiDecimal getCheckTotal() {
return checkTotal;
}
/**
* @return List of LabelValueBeans representing all available check entry modes
*/
public List getCheckEntryModes() {
return checkEntryModes;
}
/**
* @return String
*/
public String getCheckEntryMode() {
return checkEntryMode;
}
/**
* @param checkEntryMode
*/
public void setCheckEntryMode(String checkEntryMode) {
this.checkEntryMode = checkEntryMode;
}
/**
* @return boolean
*/
public boolean isCheckEntryDetailMode() {
return CashReceiptDocument.CHECK_ENTRY_DETAIL.equals(getCheckEntryMode());
}
/**
* @return current List of baseline checks for use in update detection
*/
public List getBaselineChecks() {
return baselineChecks;
}
/**
* Sets the current List of baseline checks to the given List
*
* @param baselineChecks
*/
public void setBaselineChecks(List baselineChecks) {
this.baselineChecks = baselineChecks;
}
/**
* @param index
* @return true if a baselineCheck with the given index exists
*/
public boolean hasBaselineCheck(int index) {
boolean has = false;
if ((index >= 0) && (index < baselineChecks.size())) {
has = true;
}
return has;
}
/**
* Implementation creates empty Checks as a side-effect, so that Struts' efforts to set fields of lines which haven't been
* created will succeed rather than causing a NullPointerException.
*
* @param index
* @return baseline Check at the given index
*/
public Check getBaselineCheck(int index) {
while (baselineChecks.size() <= index) {
baselineChecks.add(getCashReceiptDocument().createNewCheck());
}
return (Check) baselineChecks.get(index);
}
/**
* Gets the financialDocumentStatusMessage which is dependent upon document state.
*
* @return Returns the financialDocumentStatusMessage.
*/
public String getFinancialDocumentStatusMessage() {
String financialDocumentStatusMessage = "";
CashReceiptDocument crd = getCashReceiptDocument();
String financialDocumentStatusCode = crd.getFinancialSystemDocumentHeader().getFinancialDocumentStatusCode();
if (financialDocumentStatusCode.equals(CashReceipt.VERIFIED)) {
financialDocumentStatusMessage = SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString(KFSKeyConstants.CashReceipt.MSG_VERIFIED_BUT_NOT_AWAITING_DEPOSIT);
}
else if (financialDocumentStatusCode.equals(CashReceipt.INTERIM) || financialDocumentStatusCode.equals(CashReceipt.FINAL)) {
CashManagementDocument cmd = SpringContext.getBean(CashManagementService.class).getCashManagementDocumentForCashReceiptId(crd.getDocumentNumber());
if (cmd != null) {
String cmdFinancialDocNbr = cmd.getDocumentNumber();
String loadCMDocUrl = SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString(KFSKeyConstants.CashManagement.URL_LOAD_DOCUMENT_CASH_MGMT);
loadCMDocUrl = StringUtils.replace(loadCMDocUrl, "{0}", cmdFinancialDocNbr);
financialDocumentStatusMessage = SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString(KFSKeyConstants.CashReceipt.MSG_VERIFIED_AND_AWAITING_DEPOSIT);
financialDocumentStatusMessage = StringUtils.replace(financialDocumentStatusMessage, "{0}", loadCMDocUrl);
}
}
else if (financialDocumentStatusCode.equals(KFSConstants.DocumentStatusCodes.APPROVED)) {
CashManagementDocument cmd = SpringContext.getBean(CashManagementService.class).getCashManagementDocumentForCashReceiptId(crd.getDocumentNumber());
if (cmd != null) {
String cmdFinancialDocNbr = cmd.getDocumentNumber();
String loadCMDocUrl = SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString(KFSKeyConstants.CashManagement.URL_LOAD_DOCUMENT_CASH_MGMT);
loadCMDocUrl = StringUtils.replace(loadCMDocUrl, "{0}", cmdFinancialDocNbr);
financialDocumentStatusMessage = SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString(KFSKeyConstants.CashReceipt.MSG_VERIFIED_AND_DEPOSITED);
financialDocumentStatusMessage = StringUtils.replace(financialDocumentStatusMessage, "{0}", loadCMDocUrl);
}
}
return financialDocumentStatusMessage;
}
/**
* This method will build out a message in the case the document is ENROUTE and the cash drawer is closed.
*
* @return String
*/
public String getCashDrawerStatusMessage() {
String cashDrawerStatusMessage = "";
CashReceiptDocument crd = getCashReceiptDocument();
// first check to see if the document is in the appropriate state for this message
if (crd != null
&& crd.getDocumentHeader() != null
&& crd.getDocumentHeader().getWorkflowDocument() != null) {
if (crd.getDocumentHeader().getWorkflowDocument().isEnroute()) {
CashDrawer cd = SpringContext.getBean(CashDrawerService.class).getByCampusCode(crd.getCampusLocationCode());
if ( cd != null ) {
if (crd.getDocumentHeader().getWorkflowDocument().isApprovalRequested()
&& cd.isClosed()
&& !SpringContext.getBean(FinancialSystemWorkflowHelperService.class).isAdhocApprovalRequestedForPrincipal(crd.getDocumentHeader().getWorkflowDocument(), GlobalVariables.getUserSession().getPrincipalId())) {
cashDrawerStatusMessage = SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString(KFSKeyConstants.CashReceipt.MSG_CASH_DRAWER_CLOSED_VERIFICATION_NOT_ALLOWED);
cashDrawerStatusMessage = StringUtils.replace(cashDrawerStatusMessage, "{0}", crd.getCampusLocationCode());
}
}
}
}
return cashDrawerStatusMessage;
}
/**
* determines if the <code>{@link CashReceiptDocument}</code> is in a state that allows printing of the cover sheet.
*
* @return boolean
*/
public boolean isCoverSheetPrintingAllowed() {
return SpringContext.getBean(CashReceiptCoverSheetService.class).isCoverSheetPrintingAllowed(getCashReceiptDocument());
}
/**
* @see org.kuali.kfs.fp.document.CapitalAssetEditable#getCapitalAssetInformation()
*/
@Override
public List<CapitalAssetInformation> getCapitalAssetInformation() {
return this.capitalAssetInformation;
}
/**
* @see org.kuali.kfs.fp.document.CapitalAssetEditable#setCapitalAssetInformation(org.kuali.kfs.fp.businessobject.CapitalAssetInformation)
*/
@Override
public void setCapitalAssetInformation(List<CapitalAssetInformation> capitalAssetInformation) {
this.capitalAssetInformation = capitalAssetInformation;
}
/**
* @see org.kuali.kfs.sys.web.struts.KualiAccountingDocumentFormBase#getExcludedmethodToCall()
*/
@Override
protected List<String> getExcludedmethodToCall() {
List<String> execludedMethodToCall = super.getExcludedmethodToCall();
execludedMethodToCall.add("printCoverSheet");
return execludedMethodToCall;
}
}