001/* 002 * The Kuali Financial System, a comprehensive financial management system for higher education. 003 * 004 * Copyright 2005-2014 The Kuali Foundation 005 * 006 * This program is free software: you can redistribute it and/or modify 007 * it under the terms of the GNU Affero General Public License as 008 * published by the Free Software Foundation, either version 3 of the 009 * License, or (at your option) any later version. 010 * 011 * This program is distributed in the hope that it will be useful, 012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 014 * GNU Affero General Public License for more details. 015 * 016 * You should have received a copy of the GNU Affero General Public License 017 * along with this program. If not, see <http://www.gnu.org/licenses/>. 018 */ 019package org.kuali.kfs.module.cab.batch.service; 020 021import java.sql.Date; 022import java.sql.Timestamp; 023import java.text.ParseException; 024import java.text.SimpleDateFormat; 025import java.util.ArrayList; 026import java.util.List; 027 028import org.apache.commons.lang.time.DateUtils; 029import org.kuali.kfs.fp.businessobject.CapitalAssetAccountsGroupDetails; 030import org.kuali.kfs.fp.businessobject.CapitalAssetInformation; 031import org.kuali.kfs.fp.businessobject.CapitalAssetInformationDetail; 032import org.kuali.kfs.gl.businessobject.Entry; 033import org.kuali.kfs.module.cab.businessobject.GeneralLedgerEntry; 034import org.kuali.kfs.module.cab.document.service.GlLineService; 035import org.kuali.kfs.module.cam.businessobject.AssetGlobal; 036import org.kuali.kfs.module.cam.businessobject.AssetGlobalDetail; 037import org.kuali.kfs.module.cam.businessobject.AssetPaymentDetail; 038import org.kuali.kfs.module.cam.document.AssetPaymentDocument; 039import org.kuali.kfs.module.cam.document.service.AssetGlobalService; 040import org.kuali.kfs.sys.ConfigureContext; 041import org.kuali.kfs.sys.KFSConstants; 042import org.kuali.kfs.sys.context.KualiTestBase; 043import org.kuali.kfs.sys.context.SpringContext; 044import org.kuali.kfs.sys.fixture.UserNameFixture; 045import org.kuali.rice.core.api.util.type.KualiDecimal; 046import org.kuali.rice.kns.document.MaintenanceDocument; 047import org.kuali.rice.krad.document.Document; 048import org.kuali.rice.krad.service.BusinessObjectService; 049 050public class GlLineServiceTest extends KualiTestBase { 051 private GlLineService glLineService; 052 private BusinessObjectService businessObjectService; 053 private AssetGlobalService assetGlobalService; 054 private GeneralLedgerEntry primary; 055 private List<GeneralLedgerEntry> entries; 056 057 @Override 058 @ConfigureContext(session = UserNameFixture.bomiddle, shouldCommitTransactions = false) 059 protected void setUp() throws Exception { 060 super.setUp(); 061 glLineService = SpringContext.getBean(GlLineService.class); 062 businessObjectService = SpringContext.getBean(BusinessObjectService.class); 063 assetGlobalService = SpringContext.getBean(AssetGlobalService.class); 064 // create a list of GL entries 065 GeneralLedgerEntry entry = createCABGLEntry("1031400", 1, new KualiDecimal(5200.50)); 066 067 GeneralLedgerEntry entry2 = createCABGLEntry("1031400", 2, new KualiDecimal(3300.50)); 068 069 // use a primary entry too 070 this.primary = entry; 071 this.entries = new ArrayList<GeneralLedgerEntry>(); 072 entries.add(entry); 073 entries.add(entry2); 074 } 075 076 private CapitalAssetInformationDetail createNewCapitalAssetInformationDetail() { 077 CapitalAssetInformationDetail assetInformationDetail = new CapitalAssetInformationDetail(); 078 assetInformationDetail.setDocumentNumber("1001"); 079 assetInformationDetail.setCapitalAssetLineNumber(1); 080 assetInformationDetail.setItemLineNumber(1); 081 assetInformationDetail.setCampusCode("BL"); 082 assetInformationDetail.setBuildingCode("BL001"); 083 assetInformationDetail.setBuildingRoomNumber("001"); 084 assetInformationDetail.setBuildingSubRoomNumber("23"); 085 assetInformationDetail.setCapitalAssetTagNumber("TGX"); 086 assetInformationDetail.setCapitalAssetSerialNumber("SER"); 087 businessObjectService.save(assetInformationDetail); 088 089 return assetInformationDetail; 090 } 091 092 private CapitalAssetAccountsGroupDetails createNewCapitalAssetAcountsGroupDetails() { 093 CapitalAssetAccountsGroupDetails capitalAssetAccountsGroupDetails = new CapitalAssetAccountsGroupDetails(); 094 capitalAssetAccountsGroupDetails.setDocumentNumber("1001"); 095 capitalAssetAccountsGroupDetails.setChartOfAccountsCode(primary.getChartOfAccountsCode()); 096 capitalAssetAccountsGroupDetails.setAccountNumber(primary.getAccountNumber()); 097 capitalAssetAccountsGroupDetails.setSubAccountNumber(primary.getSubAccountNumber()); 098 capitalAssetAccountsGroupDetails.setFinancialDocumentLineTypeCode(KFSConstants.GL_CREDIT_CODE.equals(primary.getTransactionDebitCreditCode()) ? KFSConstants.SOURCE_ACCT_LINE_TYPE_CODE : KFSConstants.TARGET_ACCT_LINE_TYPE_CODE); 099 capitalAssetAccountsGroupDetails.setCapitalAssetAccountLineNumber(1); 100 capitalAssetAccountsGroupDetails.setCapitalAssetLineNumber(1); 101 capitalAssetAccountsGroupDetails.setFinancialObjectCode(primary.getFinancialObjectCode()); 102 capitalAssetAccountsGroupDetails.setFinancialSubObjectCode(primary.getFinancialSubObjectCode()); 103 capitalAssetAccountsGroupDetails.setProjectCode(primary.getProjectCode()); 104 capitalAssetAccountsGroupDetails.setOrganizationReferenceId(primary.getOrganizationReferenceId()); 105 capitalAssetAccountsGroupDetails.setSequenceNumber(0); 106 capitalAssetAccountsGroupDetails.setAmount(KualiDecimal.ZERO); 107 108 return capitalAssetAccountsGroupDetails; 109 } 110 111 private CapitalAssetInformation createNewCapitalAssetInformation() { 112 CapitalAssetInformation assetInformation = new CapitalAssetInformation(); 113 assetInformation.setDocumentNumber("1001"); 114 assetInformation.setCapitalAssetActionIndicator("C"); 115 assetInformation.setCapitalAssetLineAmount(new KualiDecimal(5200.50)); 116 assetInformation.setCapitalAssetLineNumber(1); 117 assetInformation.setVendorHeaderGeneratedIdentifier(1000); 118 assetInformation.setVendorDetailAssignedIdentifier(0); 119 assetInformation.setCapitalAssetTypeCode("07009"); 120 assetInformation.setCapitalAssetManufacturerName("MFR"); 121 assetInformation.setCapitalAssetDescription("DESC"); 122 assetInformation.setCapitalAssetManufacturerModelNumber("MDL"); 123 businessObjectService.save(assetInformation); 124 return assetInformation; 125 } 126 127 private GeneralLedgerEntry createCABGLEntry(String accountNumber, int seqNumber, KualiDecimal amount) throws ParseException { 128 Entry glEntry = createGLEntry(accountNumber, seqNumber, amount); 129 businessObjectService.save(glEntry); 130 GeneralLedgerEntry entry = new GeneralLedgerEntry(glEntry); 131 return entry; 132 } 133 134 private Entry createGLEntry(String accountNumber, int seqNumber, KualiDecimal amount) throws ParseException { 135 Entry entry = new Entry(); 136 entry.setUniversityFiscalYear(2009); 137 entry.setChartOfAccountsCode("BL"); 138 entry.setAccountNumber(accountNumber); 139 entry.setSubAccountNumber("---"); 140 entry.setFinancialObjectCode("7015"); 141 entry.setFinancialSubObjectCode("---"); 142 entry.setFinancialBalanceTypeCode("AC"); 143 entry.setFinancialObjectTypeCode("AS"); 144 entry.setUniversityFiscalPeriodCode("10"); 145 entry.setFinancialDocumentTypeCode("INV"); 146 entry.setFinancialSystemOriginationCode("01"); 147 entry.setDocumentNumber("1001"); 148 entry.setTransactionLedgerEntrySequenceNumber(seqNumber); 149 entry.setTransactionLedgerEntryDescription("Test GL"); 150 entry.setTransactionLedgerEntryAmount(amount); 151 entry.setOrganizationReferenceId(null); 152 entry.setReferenceFinancialSystemOriginationCode(null); 153 entry.setReferenceFinancialDocumentNumber(null); 154 entry.setTransactionDebitCreditCode("D"); 155 entry.setOrganizationDocumentNumber(null); 156 entry.setProjectCode(null); 157 entry.setTransactionDate(new Date(DateUtils.parseDate("04/23/2009", new String[] { "MM/dd/yyyy" }).getTime())); 158 entry.setTransactionPostingDate(new Date(DateUtils.parseDate("04/23/2009", new String[] { "MM/dd/yyyy" }).getTime())); 159 entry.setTransactionDateTimeStamp(new Timestamp(DateUtils.parseDate("04/23/2009 10:59:59", new String[] { "MM/dd/yyyy HH:mm:ss" }).getTime())); 160 return entry; 161 } 162 163 public void testCreateAssetGlobalDocument_noFPData() throws Exception { 164 MaintenanceDocument assetGlobalDocument = (MaintenanceDocument) glLineService.createAssetGlobalDocument(primary, 1); 165 assertNotNull(assetGlobalDocument); 166 AssetGlobal assetGlobal = (AssetGlobal) assetGlobalDocument.getNewMaintainableObject().getBusinessObject(); 167 // assert here 168 assertEquals("BL", assetGlobal.getOrganizationOwnerChartOfAccountsCode()); 169 assertEquals("1031400", assetGlobal.getOrganizationOwnerAccountNumber()); 170 assertEquals(assetGlobalService.getNewAcquisitionTypeCode(), assetGlobal.getAcquisitionTypeCode()); 171 assertEquals(null, assetGlobal.getInventoryStatusCode()); 172 assertEquals(null, assetGlobal.getCapitalAssetTypeCode()); 173 assertEquals(null, assetGlobal.getManufacturerName()); 174 assertEquals(null, assetGlobal.getManufacturerModelNumber()); 175 assertEquals(null, assetGlobal.getVendorName()); 176 assertEquals(null, assetGlobal.getCapitalAssetDescription()); 177 List<AssetGlobalDetail> assetGlobalDetails = assetGlobal.getAssetSharedDetails(); 178 assertTrue(assetGlobalDetails.isEmpty()); 179 List<AssetPaymentDetail> assetPaymentDetails = assetGlobal.getAssetPaymentDetails(); 180 assertEquals(0, assetPaymentDetails.size()); 181 } 182 183 public void testCreateAssetGlobalDocument_FPData() throws Exception { 184 CapitalAssetInformation assetInformation = createNewCapitalAssetInformation(); 185 assetInformation.getCapitalAssetInformationDetails().add(createNewCapitalAssetInformationDetail()); 186 assetInformation.getCapitalAssetAccountsGroupDetails().add(createNewCapitalAssetAcountsGroupDetails()); 187 188 businessObjectService.save(assetInformation); 189 assetInformation.refreshNonUpdateableReferences(); 190 MaintenanceDocument assetGlobalDocument = (MaintenanceDocument) glLineService.createAssetGlobalDocument(primary, 1); 191 assertNotNull(assetGlobalDocument); 192 AssetGlobal assetGlobal = (AssetGlobal) assetGlobalDocument.getNewMaintainableObject().getBusinessObject(); 193 // assert here 194 assertEquals("BL", assetGlobal.getOrganizationOwnerChartOfAccountsCode()); 195 assertEquals("1031400", assetGlobal.getOrganizationOwnerAccountNumber()); 196 assertEquals(assetGlobalService.getNewAcquisitionTypeCode(), assetGlobal.getAcquisitionTypeCode()); 197 assertEquals("A", assetGlobal.getInventoryStatusCode()); 198 assertEquals("07009", assetGlobal.getCapitalAssetTypeCode()); 199 assertEquals("MFR", assetGlobal.getManufacturerName()); 200 assertEquals("MDL", assetGlobal.getManufacturerModelNumber()); 201 assertEquals("DESC", assetGlobal.getCapitalAssetDescription()); 202 assertEquals("ABC CLEANING SERVICES", assetGlobal.getVendorName()); 203 204 List<AssetGlobalDetail> assetGlobalDetails = assetGlobal.getAssetSharedDetails(); 205 assertEquals(1, assetGlobalDetails.size()); 206 AssetGlobalDetail assetGlobalDetail = assetGlobalDetails.get(0); 207 assertEquals("BL", assetGlobalDetail.getCampusCode()); 208 assertEquals("BL001", assetGlobalDetail.getBuildingCode()); 209 assertEquals("001", assetGlobalDetail.getBuildingRoomNumber()); 210 assertEquals("23", assetGlobalDetail.getBuildingSubRoomNumber()); 211 assertEquals("TGX", assetGlobalDetail.getCampusTagNumber()); 212 assertEquals("SER", assetGlobalDetail.getSerialNumber()); 213 List<AssetPaymentDetail> assetPaymentDetails = assetGlobal.getAssetPaymentDetails(); 214 assertEquals(1, assetPaymentDetails.size()); 215 assertAssetPaymentDetail(assetGlobalDocument, assetPaymentDetails.get(0), "1031400", new KualiDecimal(5200.50), Integer.valueOf(1)); 216 } 217 218 private void assertAssetPaymentDetail(Document document, AssetPaymentDetail detail, String accountNumber, KualiDecimal amount, Integer seqNo) { 219 assertEquals(document.getDocumentNumber(), detail.getDocumentNumber()); 220 assertEquals(seqNo, detail.getSequenceNumber()); 221 assertEquals(Integer.valueOf(2009), detail.getPostingYear()); 222 assertEquals("10", detail.getPostingPeriodCode()); 223 assertEquals("BL", detail.getChartOfAccountsCode()); 224 assertEquals(accountNumber, detail.getAccountNumber()); 225 assertEquals("", detail.getSubAccountNumber()); 226 assertEquals("7015", detail.getFinancialObjectCode()); 227 assertEquals("", detail.getProjectCode()); 228 assertEquals("", detail.getOrganizationReferenceId()); 229 // assertEquals(amount, detail.getAmount()); 230 assertEquals("01", detail.getExpenditureFinancialSystemOriginationCode()); 231 assertEquals("1001", detail.getExpenditureFinancialDocumentNumber()); 232 assertEquals("INV", detail.getExpenditureFinancialDocumentTypeCode()); 233 assertEquals("04/23/2009", new SimpleDateFormat("MM/dd/yyyy").format(detail.getExpenditureFinancialDocumentPostedDate())); 234 assertEquals("", detail.getPurchaseOrderNumber()); 235 assertEquals(false, detail.isTransferPaymentIndicator()); 236 } 237 238 public void testCreateAssetPaymentDocument_noFPData() throws Exception { 239 AssetPaymentDocument document = (AssetPaymentDocument) glLineService.createAssetPaymentDocument(primary, 1); 240 assertNotNull(document); 241 // assert here 242 List<AssetPaymentDetail> assetPaymentDetails = document.getSourceAccountingLines(); 243 assertEquals(0, assetPaymentDetails.size()); 244 } 245 246 public void testCreateAssetPaymentDocument_FPData() throws Exception { 247 CapitalAssetInformation assetInformation = new CapitalAssetInformation(); 248 assetInformation.getCapitalAssetAccountsGroupDetails().add(createNewCapitalAssetAcountsGroupDetails()); 249 assetInformation.setDocumentNumber("1001"); 250 assetInformation.setCapitalAssetNumber(1594L); 251 assetInformation.setCapitalAssetLineAmount(new KualiDecimal(5200.50)); 252 assetInformation.setCapitalAssetLineNumber(1); 253 assetInformation.setCapitalAssetActionIndicator("C"); 254 businessObjectService.save(assetInformation); 255 256 AssetPaymentDocument document = (AssetPaymentDocument) glLineService.createAssetPaymentDocument(primary, 1); 257 assertNotNull(document); 258 259 // assert here 260 List<AssetPaymentDetail> assetPaymentDetails = document.getSourceAccountingLines(); 261 assertEquals(1, assetPaymentDetails.size()); 262 263 assertAssetPaymentDetail(document, assetPaymentDetails.get(0), "1031400", new KualiDecimal(5200.50), Integer.valueOf(1)); 264 } 265}