/*
* 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.cab.batch.service;
import java.sql.Date;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.time.DateUtils;
import org.kuali.kfs.fp.businessobject.CapitalAssetAccountsGroupDetails;
import org.kuali.kfs.fp.businessobject.CapitalAssetInformation;
import org.kuali.kfs.fp.businessobject.CapitalAssetInformationDetail;
import org.kuali.kfs.gl.businessobject.Entry;
import org.kuali.kfs.module.cab.businessobject.GeneralLedgerEntry;
import org.kuali.kfs.module.cab.document.service.GlLineService;
import org.kuali.kfs.module.cam.businessobject.AssetGlobal;
import org.kuali.kfs.module.cam.businessobject.AssetGlobalDetail;
import org.kuali.kfs.module.cam.businessobject.AssetPaymentDetail;
import org.kuali.kfs.module.cam.document.AssetPaymentDocument;
import org.kuali.kfs.module.cam.document.service.AssetGlobalService;
import org.kuali.kfs.sys.ConfigureContext;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.context.KualiTestBase;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.fixture.UserNameFixture;
import org.kuali.rice.core.api.util.type.KualiDecimal;
import org.kuali.rice.kns.document.MaintenanceDocument;
import org.kuali.rice.krad.document.Document;
import org.kuali.rice.krad.service.BusinessObjectService;
public class GlLineServiceTest extends KualiTestBase {
private GlLineService glLineService;
private BusinessObjectService businessObjectService;
private AssetGlobalService assetGlobalService;
private GeneralLedgerEntry primary;
private List<GeneralLedgerEntry> entries;
@Override
@ConfigureContext(session = UserNameFixture.bomiddle, shouldCommitTransactions = false)
protected void setUp() throws Exception {
super.setUp();
glLineService = SpringContext.getBean(GlLineService.class);
businessObjectService = SpringContext.getBean(BusinessObjectService.class);
assetGlobalService = SpringContext.getBean(AssetGlobalService.class);
// create a list of GL entries
GeneralLedgerEntry entry = createCABGLEntry("1031400", 1, new KualiDecimal(5200.50));
GeneralLedgerEntry entry2 = createCABGLEntry("1031400", 2, new KualiDecimal(3300.50));
// use a primary entry too
this.primary = entry;
this.entries = new ArrayList<GeneralLedgerEntry>();
entries.add(entry);
entries.add(entry2);
}
private CapitalAssetInformationDetail createNewCapitalAssetInformationDetail() {
CapitalAssetInformationDetail assetInformationDetail = new CapitalAssetInformationDetail();
assetInformationDetail.setDocumentNumber("1001");
assetInformationDetail.setCapitalAssetLineNumber(1);
assetInformationDetail.setItemLineNumber(1);
assetInformationDetail.setCampusCode("BL");
assetInformationDetail.setBuildingCode("BL001");
assetInformationDetail.setBuildingRoomNumber("001");
assetInformationDetail.setBuildingSubRoomNumber("23");
assetInformationDetail.setCapitalAssetTagNumber("TGX");
assetInformationDetail.setCapitalAssetSerialNumber("SER");
businessObjectService.save(assetInformationDetail);
return assetInformationDetail;
}
private CapitalAssetAccountsGroupDetails createNewCapitalAssetAcountsGroupDetails() {
CapitalAssetAccountsGroupDetails capitalAssetAccountsGroupDetails = new CapitalAssetAccountsGroupDetails();
capitalAssetAccountsGroupDetails.setDocumentNumber("1001");
capitalAssetAccountsGroupDetails.setChartOfAccountsCode(primary.getChartOfAccountsCode());
capitalAssetAccountsGroupDetails.setAccountNumber(primary.getAccountNumber());
capitalAssetAccountsGroupDetails.setSubAccountNumber(primary.getSubAccountNumber());
capitalAssetAccountsGroupDetails.setFinancialDocumentLineTypeCode(KFSConstants.GL_CREDIT_CODE.equals(primary.getTransactionDebitCreditCode()) ? KFSConstants.SOURCE_ACCT_LINE_TYPE_CODE : KFSConstants.TARGET_ACCT_LINE_TYPE_CODE);
capitalAssetAccountsGroupDetails.setCapitalAssetAccountLineNumber(1);
capitalAssetAccountsGroupDetails.setCapitalAssetLineNumber(1);
capitalAssetAccountsGroupDetails.setFinancialObjectCode(primary.getFinancialObjectCode());
capitalAssetAccountsGroupDetails.setFinancialSubObjectCode(primary.getFinancialSubObjectCode());
capitalAssetAccountsGroupDetails.setProjectCode(primary.getProjectCode());
capitalAssetAccountsGroupDetails.setOrganizationReferenceId(primary.getOrganizationReferenceId());
capitalAssetAccountsGroupDetails.setSequenceNumber(0);
capitalAssetAccountsGroupDetails.setAmount(KualiDecimal.ZERO);
return capitalAssetAccountsGroupDetails;
}
private CapitalAssetInformation createNewCapitalAssetInformation() {
CapitalAssetInformation assetInformation = new CapitalAssetInformation();
assetInformation.setDocumentNumber("1001");
assetInformation.setCapitalAssetActionIndicator("C");
assetInformation.setCapitalAssetLineAmount(new KualiDecimal(5200.50));
assetInformation.setCapitalAssetLineNumber(1);
assetInformation.setVendorHeaderGeneratedIdentifier(1000);
assetInformation.setVendorDetailAssignedIdentifier(0);
assetInformation.setCapitalAssetTypeCode("07009");
assetInformation.setCapitalAssetManufacturerName("MFR");
assetInformation.setCapitalAssetDescription("DESC");
assetInformation.setCapitalAssetManufacturerModelNumber("MDL");
businessObjectService.save(assetInformation);
return assetInformation;
}
private GeneralLedgerEntry createCABGLEntry(String accountNumber, int seqNumber, KualiDecimal amount) throws ParseException {
Entry glEntry = createGLEntry(accountNumber, seqNumber, amount);
businessObjectService.save(glEntry);
GeneralLedgerEntry entry = new GeneralLedgerEntry(glEntry);
return entry;
}
private Entry createGLEntry(String accountNumber, int seqNumber, KualiDecimal amount) throws ParseException {
Entry entry = new Entry();
entry.setUniversityFiscalYear(2009);
entry.setChartOfAccountsCode("BL");
entry.setAccountNumber(accountNumber);
entry.setSubAccountNumber("---");
entry.setFinancialObjectCode("7015");
entry.setFinancialSubObjectCode("---");
entry.setFinancialBalanceTypeCode("AC");
entry.setFinancialObjectTypeCode("AS");
entry.setUniversityFiscalPeriodCode("10");
entry.setFinancialDocumentTypeCode("INV");
entry.setFinancialSystemOriginationCode("01");
entry.setDocumentNumber("1001");
entry.setTransactionLedgerEntrySequenceNumber(seqNumber);
entry.setTransactionLedgerEntryDescription("Test GL");
entry.setTransactionLedgerEntryAmount(amount);
entry.setOrganizationReferenceId(null);
entry.setReferenceFinancialSystemOriginationCode(null);
entry.setReferenceFinancialDocumentNumber(null);
entry.setTransactionDebitCreditCode("D");
entry.setOrganizationDocumentNumber(null);
entry.setProjectCode(null);
entry.setTransactionDate(new Date(DateUtils.parseDate("04/23/2009", new String[] { "MM/dd/yyyy" }).getTime()));
entry.setTransactionPostingDate(new Date(DateUtils.parseDate("04/23/2009", new String[] { "MM/dd/yyyy" }).getTime()));
entry.setTransactionDateTimeStamp(new Timestamp(DateUtils.parseDate("04/23/2009 10:59:59", new String[] { "MM/dd/yyyy HH:mm:ss" }).getTime()));
return entry;
}
public void testCreateAssetGlobalDocument_noFPData() throws Exception {
MaintenanceDocument assetGlobalDocument = (MaintenanceDocument) glLineService.createAssetGlobalDocument(primary, 1);
assertNotNull(assetGlobalDocument);
AssetGlobal assetGlobal = (AssetGlobal) assetGlobalDocument.getNewMaintainableObject().getBusinessObject();
// assert here
assertEquals("BL", assetGlobal.getOrganizationOwnerChartOfAccountsCode());
assertEquals("1031400", assetGlobal.getOrganizationOwnerAccountNumber());
assertEquals(assetGlobalService.getNewAcquisitionTypeCode(), assetGlobal.getAcquisitionTypeCode());
assertEquals(null, assetGlobal.getInventoryStatusCode());
assertEquals(null, assetGlobal.getCapitalAssetTypeCode());
assertEquals(null, assetGlobal.getManufacturerName());
assertEquals(null, assetGlobal.getManufacturerModelNumber());
assertEquals(null, assetGlobal.getVendorName());
assertEquals(null, assetGlobal.getCapitalAssetDescription());
List<AssetGlobalDetail> assetGlobalDetails = assetGlobal.getAssetSharedDetails();
assertTrue(assetGlobalDetails.isEmpty());
List<AssetPaymentDetail> assetPaymentDetails = assetGlobal.getAssetPaymentDetails();
assertEquals(0, assetPaymentDetails.size());
}
public void testCreateAssetGlobalDocument_FPData() throws Exception {
CapitalAssetInformation assetInformation = createNewCapitalAssetInformation();
assetInformation.getCapitalAssetInformationDetails().add(createNewCapitalAssetInformationDetail());
assetInformation.getCapitalAssetAccountsGroupDetails().add(createNewCapitalAssetAcountsGroupDetails());
businessObjectService.save(assetInformation);
assetInformation.refreshNonUpdateableReferences();
MaintenanceDocument assetGlobalDocument = (MaintenanceDocument) glLineService.createAssetGlobalDocument(primary, 1);
assertNotNull(assetGlobalDocument);
AssetGlobal assetGlobal = (AssetGlobal) assetGlobalDocument.getNewMaintainableObject().getBusinessObject();
// assert here
assertEquals("BL", assetGlobal.getOrganizationOwnerChartOfAccountsCode());
assertEquals("1031400", assetGlobal.getOrganizationOwnerAccountNumber());
assertEquals(assetGlobalService.getNewAcquisitionTypeCode(), assetGlobal.getAcquisitionTypeCode());
assertEquals("A", assetGlobal.getInventoryStatusCode());
assertEquals("07009", assetGlobal.getCapitalAssetTypeCode());
assertEquals("MFR", assetGlobal.getManufacturerName());
assertEquals("MDL", assetGlobal.getManufacturerModelNumber());
assertEquals("DESC", assetGlobal.getCapitalAssetDescription());
assertEquals("ABC CLEANING SERVICES", assetGlobal.getVendorName());
List<AssetGlobalDetail> assetGlobalDetails = assetGlobal.getAssetSharedDetails();
assertEquals(1, assetGlobalDetails.size());
AssetGlobalDetail assetGlobalDetail = assetGlobalDetails.get(0);
assertEquals("BL", assetGlobalDetail.getCampusCode());
assertEquals("BL001", assetGlobalDetail.getBuildingCode());
assertEquals("001", assetGlobalDetail.getBuildingRoomNumber());
assertEquals("23", assetGlobalDetail.getBuildingSubRoomNumber());
assertEquals("TGX", assetGlobalDetail.getCampusTagNumber());
assertEquals("SER", assetGlobalDetail.getSerialNumber());
List<AssetPaymentDetail> assetPaymentDetails = assetGlobal.getAssetPaymentDetails();
assertEquals(1, assetPaymentDetails.size());
assertAssetPaymentDetail(assetGlobalDocument, assetPaymentDetails.get(0), "1031400", new KualiDecimal(5200.50), Integer.valueOf(1));
}
private void assertAssetPaymentDetail(Document document, AssetPaymentDetail detail, String accountNumber, KualiDecimal amount, Integer seqNo) {
assertEquals(document.getDocumentNumber(), detail.getDocumentNumber());
assertEquals(seqNo, detail.getSequenceNumber());
assertEquals(Integer.valueOf(2009), detail.getPostingYear());
assertEquals("10", detail.getPostingPeriodCode());
assertEquals("BL", detail.getChartOfAccountsCode());
assertEquals(accountNumber, detail.getAccountNumber());
assertEquals("", detail.getSubAccountNumber());
assertEquals("7015", detail.getFinancialObjectCode());
assertEquals("", detail.getProjectCode());
assertEquals("", detail.getOrganizationReferenceId());
// assertEquals(amount, detail.getAmount());
assertEquals("01", detail.getExpenditureFinancialSystemOriginationCode());
assertEquals("1001", detail.getExpenditureFinancialDocumentNumber());
assertEquals("INV", detail.getExpenditureFinancialDocumentTypeCode());
assertEquals("04/23/2009", new SimpleDateFormat("MM/dd/yyyy").format(detail.getExpenditureFinancialDocumentPostedDate()));
assertEquals("", detail.getPurchaseOrderNumber());
assertEquals(false, detail.isTransferPaymentIndicator());
}
public void testCreateAssetPaymentDocument_noFPData() throws Exception {
AssetPaymentDocument document = (AssetPaymentDocument) glLineService.createAssetPaymentDocument(primary, 1);
assertNotNull(document);
// assert here
List<AssetPaymentDetail> assetPaymentDetails = document.getSourceAccountingLines();
assertEquals(0, assetPaymentDetails.size());
}
public void testCreateAssetPaymentDocument_FPData() throws Exception {
CapitalAssetInformation assetInformation = new CapitalAssetInformation();
assetInformation.getCapitalAssetAccountsGroupDetails().add(createNewCapitalAssetAcountsGroupDetails());
assetInformation.setDocumentNumber("1001");
assetInformation.setCapitalAssetNumber(1594L);
assetInformation.setCapitalAssetLineAmount(new KualiDecimal(5200.50));
assetInformation.setCapitalAssetLineNumber(1);
assetInformation.setCapitalAssetActionIndicator("C");
businessObjectService.save(assetInformation);
AssetPaymentDocument document = (AssetPaymentDocument) glLineService.createAssetPaymentDocument(primary, 1);
assertNotNull(document);
// assert here
List<AssetPaymentDetail> assetPaymentDetails = document.getSourceAccountingLines();
assertEquals(1, assetPaymentDetails.size());
assertAssetPaymentDetail(document, assetPaymentDetails.get(0), "1031400", new KualiDecimal(5200.50), Integer.valueOf(1));
}
}