/*
* 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.ld.document;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.kuali.kfs.module.ld.LaborConstants;
import org.kuali.kfs.module.ld.businessobject.ErrorCertification;
import org.kuali.kfs.module.ld.businessobject.ExpenseTransferAccountingLine;
import org.kuali.kfs.module.ld.businessobject.LaborLedgerPendingEntry;
import org.kuali.kfs.module.ld.util.LaborPendingEntryGenerator;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.KFSPropertyConstants;
import org.kuali.kfs.sys.businessobject.AccountingLine;
import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySequenceHelper;
import org.kuali.kfs.sys.businessobject.SourceAccountingLine;
import org.kuali.kfs.sys.businessobject.TargetAccountingLine;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.service.FinancialSystemUserService;
import org.kuali.kfs.sys.service.impl.KfsParameterConstants;
import org.kuali.rice.core.api.util.type.KualiDecimal;
import org.kuali.rice.coreservice.framework.parameter.ParameterService;
import org.kuali.rice.krad.datadictionary.AttributeDefinition;
import org.kuali.rice.krad.datadictionary.BusinessObjectEntry;
import org.kuali.rice.krad.rules.rule.event.KualiDocumentEvent;
/**
* Labor Document Class for the Salary Expense Transfer Document.
*/
public class SalaryExpenseTransferDocument extends LaborExpenseTransferDocumentBase implements ErrorCertifiable {
protected static final org.apache.commons.logging.Log LOG = org.apache.commons.logging.LogFactory.getLog(SalaryExpenseTransferDocument.class);
protected Map<String, KualiDecimal> approvalObjectCodeBalances;
protected ErrorCertification errorCertification;
/**
* Default Constructor.
*/
public SalaryExpenseTransferDocument() {
super();
approvalObjectCodeBalances = new HashMap<String, KualiDecimal>();
}
/**
* Gets the approvalObjectCodeBalances attribute.
*
* @return Returns the approvalObjectCodeBalances.
*/
public Map<String, KualiDecimal> getApprovalObjectCodeBalances() {
return approvalObjectCodeBalances;
}
/**
* Sets the approvalObjectCodeBalances attribute value.
*
* @param approvalObjectCodeBalances The approvalObjectCodeBalances to set.
*/
public void setApprovalObjectCodeBalances(Map<String, KualiDecimal> approvalObjectCodeBalances) {
this.approvalObjectCodeBalances = approvalObjectCodeBalances;
}
/**
* Gets the errorCertification attribute.
*
* @return Returns the errorCertification.
*/
@Override
public ErrorCertification getErrorCertification() {
return errorCertification;
}
/**
* Sets the errorCertification attribute value.
*
* @param errorCertification The errorCertification to set.
*/
@Override
public void setErrorCertification(ErrorCertification errorCertification) {
this.errorCertification = errorCertification;
}
/**
* @see org.kuali.kfs.module.ld.document.LaborExpenseTransferDocumentBase#generateLaborLedgerPendingEntries(org.kuali.kfs.sys.businessobject.AccountingLine,
* org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySequenceHelper)
*/
@Override
public boolean generateLaborLedgerPendingEntries(AccountingLine accountingLine, GeneralLedgerPendingEntrySequenceHelper sequenceHelper) {
LOG.debug("started generateLaborLedgerPendingEntries()");
boolean isSuccessful = true;
ExpenseTransferAccountingLine expenseTransferAccountingLine = (ExpenseTransferAccountingLine) accountingLine;
List<LaborLedgerPendingEntry> expensePendingEntries = LaborPendingEntryGenerator.generateExpensePendingEntries(this, expenseTransferAccountingLine, sequenceHelper);
if (expensePendingEntries != null && !expensePendingEntries.isEmpty()) {
isSuccessful &= this.getLaborLedgerPendingEntries().addAll(expensePendingEntries);
}
List<LaborLedgerPendingEntry> benefitPendingEntries = LaborPendingEntryGenerator.generateBenefitPendingEntries(this, expenseTransferAccountingLine, sequenceHelper);
if (benefitPendingEntries != null && !benefitPendingEntries.isEmpty()) {
isSuccessful &= this.getLaborLedgerPendingEntries().addAll(benefitPendingEntries);
}
return isSuccessful;
}
/**
* @see org.kuali.kfs.module.ld.document.LaborExpenseTransferDocumentBase#generateLaborLedgerBenefitClearingPendingEntries(org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySequenceHelper)
*/
@Override
public boolean generateLaborLedgerBenefitClearingPendingEntries(GeneralLedgerPendingEntrySequenceHelper sequenceHelper) {
LOG.debug("started generateLaborLedgerBenefitClearingPendingEntries()");
String chartOfAccountsCode = SpringContext.getBean(ParameterService.class).getParameterValueAsString(SalaryExpenseTransferDocument.class, LaborConstants.SalaryExpenseTransfer.BENEFIT_CLEARING_CHART_PARM_NM);
String accountNumber = SpringContext.getBean(ParameterService.class).getParameterValueAsString(SalaryExpenseTransferDocument.class, LaborConstants.SalaryExpenseTransfer.BENEFIT_CLEARING_ACCOUNT_PARM_NM);
List<LaborLedgerPendingEntry> benefitClearingPendingEntries = LaborPendingEntryGenerator.generateBenefitClearingPendingEntries(this, sequenceHelper, accountNumber, chartOfAccountsCode);
if (benefitClearingPendingEntries != null && !benefitClearingPendingEntries.isEmpty()) {
return this.getLaborLedgerPendingEntries().addAll(benefitClearingPendingEntries);
}
return true;
}
@Override
public boolean answerSplitNodeQuestion(String nodeName) throws UnsupportedOperationException {
// KFSMI-4606 added routeNode condition
if (nodeName.equals(KFSConstants.REQUIRES_WORKSTUDY_REVIEW)) {
return checkOjbectCodeForWorkstudy();
}
else {
return super.answerSplitNodeQuestion(nodeName);
}
}
/**
* KFSMI-4606 check routeNode condition
* @return boolean
*/
protected boolean checkOjbectCodeForWorkstudy(){
Collection<String> workstudyRouteObjectcodes = SpringContext.getBean(ParameterService.class).getParameterValuesAsString(KfsParameterConstants.FINANCIAL_SYSTEM_DOCUMENT.class, KFSConstants.WORKSTUDY_ROUTE_OBJECT_CODES_PARM_NM);
List<SourceAccountingLine> sourceAccountingLines = getSourceAccountingLines();
List<TargetAccountingLine> targetAccountingLines = getTargetAccountingLines();
// check object code in source and target accounting lines
for (SourceAccountingLine sourceLine : sourceAccountingLines){
if (workstudyRouteObjectcodes.contains(sourceLine.getFinancialObjectCode())) {
return true;
}
}
for (TargetAccountingLine targetLine : targetAccountingLines){
if (workstudyRouteObjectcodes.contains(targetLine.getFinancialObjectCode())) {
return true;
}
}
return false;
}
/**
* KFSMI-4606 Set GLPE descriptions to persons name. Take care that this needs to overwrite prepareForSave so that it
* catches pending entries generated by generateLaborLedgerPendingEntries and generateLaborLedgerBenefitClearingPendingEntries.
* @see org.kuali.kfs.module.ld.document.LaborLedgerPostingDocumentBase#prepareForSave(org.kuali.rice.kns.rule.event.KualiDocumentEvent)
*/
@Override
public void prepareForSave(KualiDocumentEvent event) {
super.prepareForSave(event);
for (Iterator<LaborLedgerPendingEntry> iterator = this.getLaborLedgerPendingEntries().iterator(); iterator.hasNext();) {
LaborLedgerPendingEntry laborLedgerPendingEntry = iterator.next();
String personName = SpringContext.getBean(FinancialSystemUserService.class).getPersonNameByEmployeeId(this.getEmplid());
// Get the maxlength of the description field we are setting
BusinessObjectEntry laborLedgerPendingEntryBusinessObjectEntry = getDataDictionaryService().getDataDictionary().getBusinessObjectEntry(LaborLedgerPendingEntry.class.getName());
AttributeDefinition laborLedgerPendingEntryAttribute = laborLedgerPendingEntryBusinessObjectEntry.getAttributeDefinition(KFSPropertyConstants.TRANSACTION_LEDGER_ENTRY_DESC);
int descriptionLength = laborLedgerPendingEntryAttribute.getMaxLength();
// Set the description field truncating name if necessary
laborLedgerPendingEntry.setTransactionLedgerEntryDescription(personName.length() > descriptionLength ? personName.substring(0, descriptionLength - 1) : personName);
}
// KFSCNTRB-846 Need to set doc number on Error Certification object because it's the primary key; otherwise OJB complains
if (errorCertification != null) {
errorCertification.setDocumentNumber(this.documentNumber);
}
}
@Override
public List getLaborLedgerPendingEntriesForSearching() {
return super.getLaborLedgerPendingEntries();
}
}