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}