/*
* 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.ar.document;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.kuali.kfs.coa.businessobject.AccountingPeriod;
import org.kuali.kfs.gl.service.EntryService;
import org.kuali.kfs.module.ar.ArConstants;
import org.kuali.kfs.module.ar.businessobject.AccountsReceivableDocumentHeader;
import org.kuali.kfs.module.ar.businessobject.CashControlDetail;
import org.kuali.kfs.module.ar.businessobject.PaymentMedium;
import org.kuali.kfs.module.ar.document.service.CashControlDocumentService;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.KFSParameterKeyConstants;
import org.kuali.kfs.sys.KFSPropertyConstants;
import org.kuali.kfs.sys.businessobject.AccountingLine;
import org.kuali.kfs.sys.businessobject.Bank;
import org.kuali.kfs.sys.businessobject.ElectronicPaymentClaim;
import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry;
import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySequenceHelper;
import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.document.AmountTotaling;
import org.kuali.kfs.sys.document.ElectronicPaymentClaiming;
import org.kuali.kfs.sys.document.GeneralLedgerPendingEntrySource;
import org.kuali.kfs.sys.document.GeneralLedgerPostingDocument;
import org.kuali.kfs.sys.document.GeneralLedgerPostingDocumentBase;
import org.kuali.kfs.sys.document.validation.impl.AccountingDocumentRuleBaseConstants.GENERAL_LEDGER_PENDING_ENTRY_CODE;
import org.kuali.kfs.sys.service.BankService;
import org.kuali.kfs.sys.service.ElectronicPaymentClaimingService;
import org.kuali.kfs.sys.service.UniversityDateService;
import org.kuali.rice.core.api.util.type.KualiDecimal;
import org.kuali.rice.core.web.format.CurrencyFormatter;
import org.kuali.rice.coreservice.framework.parameter.ParameterService;
import org.kuali.rice.kew.api.exception.WorkflowException;
import org.kuali.rice.kns.service.DataDictionaryService;
import org.kuali.rice.krad.document.Document;
import org.kuali.rice.krad.service.BusinessObjectService;
import org.kuali.rice.krad.service.DocumentService;
/**
* @author Kuali Nervous System Team (kualidev@oncourse.iu.edu)
*/
public class CashControlDocument extends GeneralLedgerPostingDocumentBase implements AmountTotaling, GeneralLedgerPendingEntrySource, ElectronicPaymentClaiming, GeneralLedgerPostingDocument {
protected static final String NODE_ASSOCIATED_WITH_ELECTRONIC_PAYMENT = "AssociatedWithElectronicPayment";
protected static Logger LOG = org.apache.log4j.Logger.getLogger(CashControlDocument.class);
protected String referenceFinancialDocumentNumber;
protected Long proposalNumber;// When LOC Type = Award
protected Integer universityFiscalYear;
protected String universityFiscalPeriodCode;
protected String customerPaymentMediumCode;
protected KualiDecimal cashControlTotalAmount = KualiDecimal.ZERO;
protected String lockboxNumber;
protected String bankCode;
protected Bank bank;
protected PaymentMedium customerPaymentMedium;
protected AccountingPeriod universityFiscalPeriod;
protected AccountsReceivableDocumentHeader accountsReceivableDocumentHeader;
protected List<CashControlDetail> cashControlDetails;
protected List<GeneralLedgerPendingEntry> generalLedgerPendingEntries;
protected final static String GENERAL_LEDGER_POSTING_HELPER_BEAN_ID = "kfsGenericGeneralLedgerPostingHelper";
protected List<ElectronicPaymentClaim> electronicPaymentClaims;
/**
* Default constructor.
*/
public CashControlDocument() {
super();
accountsReceivableDocumentHeader = new AccountsReceivableDocumentHeader();
customerPaymentMedium = new PaymentMedium();
// Set the university fiscal year to the current values
UniversityDateService universityDateService = SpringContext.getBean(UniversityDateService.class);
universityFiscalYear = universityDateService.getCurrentUniversityDate().getUniversityFiscalYear();
universityFiscalPeriod = universityDateService.getCurrentUniversityDate().getAccountingPeriod();
universityFiscalPeriodCode = universityDateService.getCurrentUniversityDate().getUniversityFiscalAccountingPeriod();
cashControlDetails = new ArrayList<CashControlDetail>();
generalLedgerPendingEntries = new ArrayList<GeneralLedgerPendingEntry>();
electronicPaymentClaims = new ArrayList<ElectronicPaymentClaim>();
// retrieve value from param table and set to default
try {
DataDictionaryService ddService = SpringContext.getBean(DataDictionaryService.class);
org.kuali.rice.krad.datadictionary.DocumentEntry docEntry = ddService.getDataDictionary().getDocumentEntry(ddService.getValidDocumentClassByTypeName(KFSConstants.FinancialDocumentTypeCodes.CASH_CONTROL).getCanonicalName());
String documentTypeCode = docEntry.getDocumentTypeName();
if (SpringContext.getBean(BankService.class).isBankSpecificationEnabled()) {
bankCode = SpringContext.getBean(ParameterService.class).getSubParameterValueAsString(Bank.class, KFSParameterKeyConstants.DEFAULT_BANK_BY_DOCUMENT_TYPE, documentTypeCode);
}
}
catch (Exception x) {
LOG.error("Problem occurred setting default bank code for cash control document", x);
}
}
/**
* Gets the documentNumber attribute.
*
* @return Returns the documentNumber
*/
@Override
public String getDocumentNumber() {
return documentNumber;
}
/**
* Sets the documentNumber attribute.
*
* @param documentNumber The documentNumber to set.
*/
@Override
public void setDocumentNumber(String documentNumber) {
this.documentNumber = documentNumber;
}
/**
* Gets the referenceFinancialDocumentNumber attribute.
*
* @return Returns the referenceFinancialDocumentNumber
*/
public String getReferenceFinancialDocumentNumber() {
return referenceFinancialDocumentNumber;
}
/**
* Sets the referenceFinancialDocumentNumber attribute.
*
* @param referenceFinancialDocumentNumber The referenceFinancialDocumentNumber to set.
*/
public void setReferenceFinancialDocumentNumber(String referenceFinancialDocumentNumber) {
this.referenceFinancialDocumentNumber = referenceFinancialDocumentNumber;
}
/**
* Gets the universityFiscalYear attribute.
*
* @return Returns the universityFiscalYear
*/
public Integer getUniversityFiscalYear() {
return universityFiscalYear;
}
/**
* Sets the universityFiscalYear attribute.
*
* @param universityFiscalYear The universityFiscalYear to set.
*/
public void setUniversityFiscalYear(Integer universityFiscalYear) {
this.universityFiscalYear = universityFiscalYear;
}
/**
* Gets the universityFiscalPeriodCode attribute.
*
* @return Returns the universityFiscalPeriodCode
*/
public String getUniversityFiscalPeriodCode() {
return universityFiscalPeriodCode;
}
/**
* Sets the universityFiscalPeriodCode attribute.
*
* @param universityFiscalPeriodCode The universityFiscalPeriodCode to set.
*/
public void setUniversityFiscalPeriodCode(String universityFiscalPeriodCode) {
this.universityFiscalPeriodCode = universityFiscalPeriodCode;
}
/**
* Gets the customerPaymentMediumCode attribute.
*
* @return Returns the customerPaymentMediumCode
*/
public String getCustomerPaymentMediumCode() {
return customerPaymentMediumCode;
}
/**
* Sets the customerPaymentMediumCode attribute.
*
* @param customerPaymentMediumCode The customerPaymentMediumCode to set.
*/
public void setCustomerPaymentMediumCode(String customerPaymentMediumCode) {
this.customerPaymentMediumCode = customerPaymentMediumCode;
}
/**
* Gets the cashControlTotalAmount attribute.
*
* @return Returns the cashControlTotalAmount
*/
public KualiDecimal getCashControlTotalAmount() {
return cashControlTotalAmount;
}
/**
* Sets the cashControlTotalAmount attribute.
*
* @param cashControlTotalAmount The cashControlTotalAmount to set.
*/
public void setCashControlTotalAmount(KualiDecimal cashControlTotalAmount) {
this.cashControlTotalAmount = cashControlTotalAmount;
}
/**
* Gets the universityFiscalPeriod attribute.
*
* @return Returns the universityFiscalPeriod
*/
public AccountingPeriod getUniversityFiscalPeriod() {
return universityFiscalPeriod;
}
/**
* Sets the universityFiscalPeriod attribute.
*
* @param universityFiscalPeriod The universityFiscalPeriod to set.
* @deprecated
*/
@Deprecated
public void setUniversityFiscalPeriod(AccountingPeriod universityFiscalPeriod) {
this.universityFiscalPeriod = universityFiscalPeriod;
}
/**
* Gets the accountsReceivableDocumentHeader attribute.
*
* @return Returns the accountsReceivableDocumentHeader.
*/
public AccountsReceivableDocumentHeader getAccountsReceivableDocumentHeader() {
return accountsReceivableDocumentHeader;
}
/**
* Sets the accountsReceivableDocumentHeader attribute value.
*
* @param accountsReceivableDocumentHeader The accountsReceivableDocumentHeader to set.
*/
public void setAccountsReceivableDocumentHeader(AccountsReceivableDocumentHeader accountsReceivableDocumentHeader) {
this.accountsReceivableDocumentHeader = accountsReceivableDocumentHeader;
}
/**
* Gets the cashControlDetails attribute.
*
* @return Returns the cashControlDetails.
*/
public List<CashControlDetail> getCashControlDetails() {
return cashControlDetails;
}
/**
* Sets the cashControlDetails attribute value.
*
* @param cashControlDetails The cashControlDetails to set.
*/
public void setCashControlDetails(List<CashControlDetail> cashControlDetails) {
this.cashControlDetails = cashControlDetails;
}
/**
* This method adds a new cash control detail to the list
*
* @param cashControlDetail
*/
public void addCashControlDetail(CashControlDetail cashControlDetail) {
prepareCashControlDetail(cashControlDetail);
if (cashControlDetail.getFinancialDocumentLineAmount() != null) {
this.cashControlTotalAmount = this.cashControlTotalAmount.add(cashControlDetail.getFinancialDocumentLineAmount());
}
cashControlDetails.add(cashControlDetail);
}
/**
* This method removes a cash control detail from the list
*
* @param index
*/
public void deleteCashControlDetail(int index) {
CashControlDetail cashControlDetail = cashControlDetails.remove(index);
this.cashControlTotalAmount = this.cashControlTotalAmount.subtract(cashControlDetail.getFinancialDocumentLineAmount());
}
/**
* This is a helper method that automatically populates document specfic information into the cash control detail deposit
* (CashControlDetail) instance.
*/
protected void prepareCashControlDetail(CashControlDetail cashControlDetail) {
cashControlDetail.setDocumentNumber(this.getDocumentNumber());
}
/**
* @see org.kuali.rice.krad.bo.BusinessObjectBase#toStringMapper()
*/
@SuppressWarnings("unchecked")
protected LinkedHashMap toStringMapper_RICE20_REFACTORME() {
LinkedHashMap m = new LinkedHashMap();
m.put(KFSPropertyConstants.DOCUMENT_NUMBER, this.documentNumber);
return m;
}
/**
* Gets the customerPaymentMedium attribute.
*
* @return Returns the customerPaymentMedium
*/
public PaymentMedium getCustomerPaymentMedium() {
return customerPaymentMedium;
}
/**
* Sets the customerPaymentMedium attribute value.
*
* @param customerPaymentMedium The customerPaymentMedium to set.
*/
public void setCustomerPaymentMedium(PaymentMedium customerPaymentMedium) {
this.customerPaymentMedium = customerPaymentMedium;
}
/**
* @see org.kuali.kfs.sys.document.AmountTotaling#getTotalDollarAmount()
*/
@Override
public KualiDecimal getTotalDollarAmount() {
return getCashControlTotalAmount();
}
/**
* This method returns the advance deposit total amount as a currency formatted string.
*
* @return String
*/
public String getCurrencyFormattedTotalCashControlAmount() {
return (String) new CurrencyFormatter().format(getCashControlTotalAmount());
}
/**
* Retrieves a specific cash control detail from the list, by array index
*
* @param index the index of the cash control details to retrieve the cash control detail from
* @return a CashControlDetail
*/
public CashControlDetail getCashControlDetail(int index) {
if (index >= cashControlDetails.size()) {
for (int i = cashControlDetails.size(); i <= index; i++) {
cashControlDetails.add(new CashControlDetail());
}
}
return cashControlDetails.get(index);
}
/**
* @see org.kuali.kfs.sys.document.GeneralLedgerPendingEntrySource#addPendingEntry(org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry)
*/
@Override
public void addPendingEntry(GeneralLedgerPendingEntry entry) {
generalLedgerPendingEntries.add(entry);
}
/**
* @see org.kuali.kfs.sys.document.GeneralLedgerPendingEntrySource#clearAnyGeneralLedgerPendingEntries()
*/
@Override
public void clearAnyGeneralLedgerPendingEntries() {
generalLedgerPendingEntries = new ArrayList<GeneralLedgerPendingEntry>();
}
/**
* @see org.kuali.kfs.sys.document.GeneralLedgerPendingEntrySource#customizeExplicitGeneralLedgerPendingEntry(org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail,
* org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry)
*/
public void customizeExplicitGeneralLedgerPendingEntry(GeneralLedgerPendingEntrySourceDetail postable, GeneralLedgerPendingEntry explicitEntry) {
if (explicitEntry.getFinancialDocumentTypeCode().equalsIgnoreCase(KFSConstants.FinancialDocumentTypeCodes.GENERAL_ERROR_CORRECTION)) {
explicitEntry.setTransactionLedgerEntryDescription(buildTransactionLedgerEntryDescriptionUsingRefOriginAndRefDocNumber(postable));
// Clearing fields that are already handled by the parent algorithm - we don't actually want
// these to copy over from the accounting lines b/c they don't belong in the GLPEs
// if the aren't nulled, then GECs fail to post
explicitEntry.setReferenceFinancialDocumentNumber(null);
explicitEntry.setReferenceFinancialSystemOriginationCode(null);
explicitEntry.setReferenceFinancialDocumentTypeCode(null);
}
}
/**
* Builds an appropriately formatted string to be used for the <code>transactionLedgerEntryDescription</code>. It is built using
* information from the <code>{@link AccountingLine}</code>. Format is "01-12345: blah blah blah".
*
* @param line accounting line
* @param transactionalDocument submitted accounting document
* @return String formatted string to be used for transaction ledger entry description
*/
protected String buildTransactionLedgerEntryDescriptionUsingRefOriginAndRefDocNumber(GeneralLedgerPendingEntrySourceDetail line) {
String description = "";
description = line.getReferenceOriginCode() + "-" + line.getReferenceNumber();
if (StringUtils.isNotBlank(line.getFinancialDocumentLineDescription())) {
description += ": " + line.getFinancialDocumentLineDescription();
}
else {
description += ": " + getDocumentHeader().getDocumentDescription();
}
if (description.length() > GENERAL_LEDGER_PENDING_ENTRY_CODE.GLPE_DESCRIPTION_MAX_LENGTH) {
description = description.substring(0, GENERAL_LEDGER_PENDING_ENTRY_CODE.GLPE_DESCRIPTION_MAX_LENGTH - 3) + "...";
}
return description;
}
public boolean customizeOffsetGeneralLedgerPendingEntry(GeneralLedgerPendingEntrySourceDetail accountingLine, GeneralLedgerPendingEntry explicitEntry, GeneralLedgerPendingEntry offsetEntry) {
return false;
}
/**
* @see org.kuali.kfs.sys.document.GeneralLedgerPendingEntrySource#generateDocumentGeneralLedgerPendingEntries(org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySequenceHelper)
*/
@Override
public boolean generateDocumentGeneralLedgerPendingEntries(GeneralLedgerPendingEntrySequenceHelper sequenceHelper) {
boolean success = true;
CashControlDocumentService cashControlDocumentService = SpringContext.getBean(CashControlDocumentService.class);
if (this.getCustomerPaymentMediumCode().equalsIgnoreCase(ArConstants.PaymentMediumCode.CHECK)) {
success &= cashControlDocumentService.createCashReceiptGLPEs(this, sequenceHelper);
success &= cashControlDocumentService.createBankOffsetGLPEs(this, sequenceHelper);
}
else if (this.getCustomerPaymentMediumCode().equalsIgnoreCase(ArConstants.PaymentMediumCode.WIRE_TRANSFER) ) {
success &= cashControlDocumentService.createDistributionOfIncomeAndExpenseGLPEs(this, sequenceHelper);
}
else if (this.getCustomerPaymentMediumCode().equalsIgnoreCase(ArConstants.PaymentMediumCode.CREDIT_CARD)) {
success &= cashControlDocumentService.createGeneralErrorCorrectionGLPEs(this, sequenceHelper);
}
return success;
}
/**
* @see org.kuali.kfs.sys.document.GeneralLedgerPendingEntrySource#getGeneralLedgerPendingEntryAmountForGeneralLedgerPostable(org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail)
*/
@Override
public KualiDecimal getGeneralLedgerPendingEntryAmountForDetail(GeneralLedgerPendingEntrySourceDetail postable) {
return postable.getAmount().abs();
}
/**
* @see org.kuali.kfs.sys.document.GeneralLedgerPendingEntrySource#getGeneralLedgerPostables()
*/
@Override
public List<GeneralLedgerPendingEntrySourceDetail> getGeneralLedgerPendingEntrySourceDetails() {
return new ArrayList<GeneralLedgerPendingEntrySourceDetail>();
}
/**
* The Cash Control document doesn't generate general ledger pending entries based off of the accounting lines on the document
*
* @see org.kuali.kfs.sys.document.GeneralLedgerPendingEntrySource#generateGeneralLedgerPendingEntries(org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail,
* org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySequenceHelper)
*/
@Override
public boolean generateGeneralLedgerPendingEntries(GeneralLedgerPendingEntrySourceDetail glpeSourceDetail, GeneralLedgerPendingEntrySequenceHelper sequenceHelper) {
return true;
}
/**
* @see org.kuali.kfs.sys.document.GeneralLedgerPendingEntrySource#getPostingYear()
*/
@Override
public Integer getPostingYear() {
return SpringContext.getBean(UniversityDateService.class).getCurrentFiscalYear();
}
/**
* @see org.kuali.kfs.sys.document.GeneralLedgerPendingEntrySource#isDebit(org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail)
*/
@Override
public boolean isDebit(GeneralLedgerPendingEntrySourceDetail postable) {
AccountingLine accountingLine = (AccountingLine) postable;
return (accountingLine.getDebitCreditCode().equalsIgnoreCase(KFSConstants.GL_DEBIT_CODE));
}
/**
* This method gets the glpes
*
* @return a list of glpes
*/
@Override
public List<GeneralLedgerPendingEntry> getGeneralLedgerPendingEntries() {
return generalLedgerPendingEntries;
}
/**
* This method sets the glpes
*
* @param generalLedgerPendingEntries
*/
@Override
public void setGeneralLedgerPendingEntries(List<GeneralLedgerPendingEntry> generalLedgerPendingEntries) {
this.generalLedgerPendingEntries = generalLedgerPendingEntries;
}
/**
* This method set glpes status to approved
*/
@Override
public void changeGeneralLedgerPendingEntriesApprovedStatusCode() {
for (GeneralLedgerPendingEntry glpe : getGeneralLedgerPendingEntries()) {
glpe.setFinancialDocumentApprovedCode(KFSConstants.DocumentStatusCodes.APPROVED);
}
}
/**
* This method gets an glpe by it's index in the list of glpes
*
* @param index the glpe index
* @return the glpe
*/
@Override
public GeneralLedgerPendingEntry getGeneralLedgerPendingEntry(int index) {
while (generalLedgerPendingEntries.size() <= index) {
generalLedgerPendingEntries.add(new GeneralLedgerPendingEntry());
}
return generalLedgerPendingEntries.get(index);
}
/**
* Retrieve lockBox Number
*
* @return
*/
public String getLockboxNumber() {
CashControlDocumentService cashControlDocumentService = SpringContext.getBean(CashControlDocumentService.class);
this.lockboxNumber = cashControlDocumentService.getLockboxNumber(this);
return lockboxNumber;
}
/**
* @see org.kuali.rice.krad.document.DocumentBase#populateDocumentForRouting()
*/
@Override
public void populateDocumentForRouting() {
CashControlDocumentService cashControlDocumentService = SpringContext.getBean(CashControlDocumentService.class);
this.lockboxNumber = cashControlDocumentService.getLockboxNumber(this);
super.populateDocumentForRouting();
}
/**
* @see org.kuali.kfs.sys.document.ElectronicPaymentClaiming#declaimElectronicPaymentClaims()
*/
@Override
public void declaimElectronicPaymentClaims() {
SpringContext.getBean(ElectronicPaymentClaimingService.class).declaimElectronicPaymentClaimsForDocument(this);
}
/**
* This method gets electronicPaymentClaims
*
* @return electronicPaymentClaims
*/
public List<ElectronicPaymentClaim> getElectronicPaymentClaims() {
return electronicPaymentClaims;
}
/**
* This method sets electronicPaymentClaims
*
* @param electronicPaymentClaims
* @deprecated
*/
@Deprecated
public void setElectronicPaymentClaims(List<ElectronicPaymentClaim> electronicPaymentClaims) {
this.electronicPaymentClaims = electronicPaymentClaims;
}
/**
* @return
*/
public Document getReferenceFinancialDocument() {
DocumentService documentService = SpringContext.getBean(DocumentService.class);
Document document = null;
try {
document = documentService.getByDocumentHeaderId(getReferenceFinancialDocumentNumber());
}
catch (WorkflowException we) {
LOG.warn( "Unable to retreive reference financial document: " + getReferenceFinancialDocumentNumber(), we);
}
return document;
}
/**
* Gets the bankCode attribute.
*
* @return Returns the 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;
}
/**
* Answers true when document payment medium is WIRE transfer
*
* @see org.kuali.kfs.sys.document.FinancialSystemTransactionalDocumentBase#answerSplitNodeQuestion(java.lang.String)
*/
@Override
public boolean answerSplitNodeQuestion(String nodeName) throws UnsupportedOperationException {
if (NODE_ASSOCIATED_WITH_ELECTRONIC_PAYMENT.equals(nodeName)) {
if (ArConstants.PaymentMediumCode.WIRE_TRANSFER.equals(getCustomerPaymentMediumCode())) {
return true;
}
else {
return false;
}
}
return super.answerSplitNodeQuestion(nodeName);
}
/**
* This is a helper method added to support workflow attribute configuration. This method helps to avoid attribute name mismatch
* between ProcessingChartOfAccountCode and chartOfAccountsCode
*
* @return ProcessingChartOfAccountCode
*/
public String getChartOfAccountsCode() {
if (getAccountsReceivableDocumentHeader() != null) {
return getAccountsReceivableDocumentHeader().getProcessingChartOfAccountCode();
}
return null;
}
/**
* This is a helper method added to support workflow attribute configuration. This method helps to avoid attribute name mismatch
* between ProcessingOrganizationCode and organizationCode
*
* @return ProcessingOrganizationCode
*/
public String getOrganizationCode() {
if (getAccountsReceivableDocumentHeader() != null) {
return getAccountsReceivableDocumentHeader().getProcessingOrganizationCode();
}
return null;
}
/**
* @return
*/
public Bank getBank() {
return bank;
}
/**
* @param bank
*/
public void setBank(Bank bank) {
this.bank = bank;
}
/**
*
*/
public void recalculateTotals() {
KualiDecimal total = KualiDecimal.ZERO;
for (CashControlDetail cashControlDetail : getCashControlDetails()) {
total = total.add(cashControlDetail.getFinancialDocumentLineAmount());
}
cashControlTotalAmount = total;
getFinancialSystemDocumentHeader().setFinancialDocumentTotalAmount(total);
}
/**
* @see org.kuali.kfs.sys.document.FinancialSystemTransactionalDocumentBase#prepareForSave()
*/
@Override
public void prepareForSave() {
captureWorkflowHeaderInformation();
// remove all the cash control detail records from the db in prep for the save,
// where they'll get re-persisted. This is necessary to make sure that details
// deleted on the form are actually deleted, as OJB does a terrible job at this
// by itself.
deleteCashControlDetailsFromDB();
recalculateTotals();
}
/**
*
*/
protected void deleteCashControlDetailsFromDB() {
BusinessObjectService boService = SpringContext.getBean(BusinessObjectService.class);
Map<String, String> pkMap = new HashMap<String, String>();
pkMap.put(KFSPropertyConstants.DOCUMENT_NUMBER, getDocumentNumber());
boService.deleteMatching(CashControlDetail.class, pkMap);
}
/**
* This is a method to check the count of gl entries according to the input fields and values
*
* @return totalGLRecordsCreated returns the count of the gl entries
*/
public Integer getGeneralLedgerEntriesPostedCount() {
Map<String, Object> pkMap = new HashMap<String, Object>();
pkMap.put(KFSPropertyConstants.DOCUMENT_NUMBER, this.getDocumentNumber());
pkMap.put(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, this.getPostingYear().toString());
pkMap.put(KFSPropertyConstants.UNIVERSITY_FISCAL_PERIOD_CODE, this.getPostingPeriodCode());
pkMap.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, this.getChartOfAccountsCode());
Integer totalGLRecordsCreated = SpringContext.getBean(EntryService.class).getEntryRecordCount(pkMap);
return totalGLRecordsCreated;
}
/**
* Gets the proposalNumber attribute.
*
* @return Returns the proposalNumber.
*/
public Long getProposalNumber() {
return proposalNumber;
}
/**
* Sets the proposalNumber attribute value.
*
* @param proposalNumber The proposalNumber to set.
*/
public void setProposalNumber(Long proposalNumber) {
this.proposalNumber = proposalNumber;
}
}