/*
* 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.cam.document.service;
import static org.kuali.kfs.sys.fixture.UserNameFixture.bomiddle;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.kuali.kfs.module.cam.CamsPropertyConstants;
import org.kuali.kfs.module.cam.businessobject.AssetPayment;
import org.kuali.kfs.module.cam.businessobject.AssetPaymentAssetDetail;
import org.kuali.kfs.module.cam.businessobject.AssetPaymentDetail;
import org.kuali.kfs.module.cam.document.AssetPaymentDocument;
import org.kuali.kfs.module.cam.fixture.AssetPaymentServiceFixture;
import org.kuali.kfs.sys.ConfigureContext;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.businessobject.FinancialSystemDocumentHeader;
import org.kuali.kfs.sys.context.KualiTestBase;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.service.UniversityDateService;
import org.kuali.rice.core.api.datetime.DateTimeService;
import org.kuali.rice.core.api.util.type.KualiDecimal;
import org.kuali.rice.kew.api.WorkflowDocument;
import org.kuali.rice.kew.api.document.WorkflowDocumentService;
import org.kuali.rice.kns.service.DataDictionaryService;
import org.kuali.rice.krad.bo.DocumentHeader;
import org.kuali.rice.krad.service.BusinessObjectService;
import org.kuali.rice.krad.util.GlobalVariables;
import org.kuali.rice.krad.util.KRADPropertyConstants;
@ConfigureContext(session = bomiddle)
public class AssetPaymentServiceTest extends KualiTestBase {
private static Logger LOG = Logger.getLogger(AssetPaymentServiceTest.class);
private DateTimeService dateTimeService;
private UniversityDateService universityDateService;
private AssetPaymentService assetPaymentService;
private BusinessObjectService businessObjectService;
@Override
// @ConfigureContext(session = UserNameFixture.khuntley)
protected void setUp() throws Exception {
super.setUp();
assetPaymentService = SpringContext.getBean(AssetPaymentService.class);
businessObjectService = SpringContext.getBean(BusinessObjectService.class);
universityDateService = SpringContext.getBean(UniversityDateService.class);
dateTimeService = SpringContext.getBean(DateTimeService.class);
}
public void testAdjustPaymentAmounts_params_false_false() throws Exception {
AssetPayment assetPayment = AssetPaymentServiceFixture.PAYMENT1.newAssetPayment();
this.assetPaymentService.adjustPaymentAmounts(assetPayment, false, false);
assertTrue(assetPayment.getAccountChargeAmount().isPositive());
assertTrue(assetPayment.getAccumulatedPrimaryDepreciationAmount().isPositive());
assertNotNull(assetPayment.getPeriod1Depreciation1Amount());
assertNotNull(assetPayment.getPeriod11Depreciation1Amount());
assertTrue(assetPayment.getPeriod11Depreciation1Amount() instanceof KualiDecimal);
}
public void testAdjustPaymentAmounts_params_true_true() throws Exception {
AssetPayment assetPayment = AssetPaymentServiceFixture.PAYMENT1.newAssetPayment();
this.assetPaymentService.adjustPaymentAmounts(assetPayment, true, true);
assertTrue(assetPayment.getAccountChargeAmount().isNegative());
assertTrue(assetPayment.getAccumulatedPrimaryDepreciationAmount().isNegative());
assertNull(assetPayment.getPeriod1Depreciation1Amount());
assertNull(assetPayment.getPeriod11Depreciation1Amount());
assertFalse(assetPayment.getPeriod11Depreciation1Amount() instanceof KualiDecimal);
}
public void testAdjustPaymentAmounts_false_true() throws Exception {
AssetPayment assetPayment = AssetPaymentServiceFixture.PAYMENT1.newAssetPayment();
this.assetPaymentService.adjustPaymentAmounts(assetPayment, false, true);
assertTrue(assetPayment.getAccountChargeAmount().isPositive());
assertTrue(assetPayment.getAccumulatedPrimaryDepreciationAmount().isPositive());
assertNull(assetPayment.getPeriod1Depreciation1Amount());
assertNull(assetPayment.getPeriod2Depreciation1Amount());
assertNull(assetPayment.getPeriod3Depreciation1Amount());
assertNull(assetPayment.getPeriod4Depreciation1Amount());
assertNull(assetPayment.getPeriod5Depreciation1Amount());
assertNull(assetPayment.getPeriod6Depreciation1Amount());
assertNull(assetPayment.getPeriod7Depreciation1Amount());
assertNull(assetPayment.getPeriod8Depreciation1Amount());
assertNull(assetPayment.getPeriod9Depreciation1Amount());
assertNull(assetPayment.getPeriod10Depreciation1Amount());
assertNull(assetPayment.getPeriod11Depreciation1Amount());
assertNull(assetPayment.getPeriod12Depreciation1Amount());
}
public void testProcessApprovedAssetPayment() throws Exception {
int detailRows=0;
int assetRows=0;
// Creating document
AssetPaymentDocument document = AssetPaymentServiceFixture.PAYMENT1.newAssetPaymentDocument();
document.setDocumentHeader(getDocumentHeader());
document.setAssetPaymentAllocationTypeCode(CamsPropertyConstants.AssetPaymentAllocation.ASSET_DISTRIBUTION_BY_TOTAL_COST_CODE);
KualiDecimal totalDocument = new KualiDecimal(0);
List<AssetPaymentAssetDetail> assetPaymentAssetDetails = document.getAssetPaymentAssetDetail();
List<AssetPaymentDetail> assetPaymentDetails = document.getSourceAccountingLines();
for(AssetPaymentDetail assetPaymentDetail:assetPaymentDetails){
detailRows++;
totalDocument = totalDocument.add(assetPaymentDetail.getAmount());
}
Double totalHistoricalAmount = new Double(0);
HashMap<Long,Double>assets = new HashMap();
HashMap<Long,KualiDecimal>assetsNewCost = new HashMap();
Map key;
for(AssetPaymentAssetDetail assetPaymentAssetDetail:assetPaymentAssetDetails) {
assetRows++;
assetPaymentAssetDetail.refreshReferenceObject(CamsPropertyConstants.AssetPaymentAssetDetail.ASSET);
assets.put(assetPaymentAssetDetail.getCapitalAssetNumber(), new Double(assetPaymentAssetDetail.getAsset().getTotalCostAmount().toString()));
assetPaymentAssetDetail.setPreviousTotalCostAmount(assetPaymentAssetDetail.getAsset().getTotalCostAmount());
totalHistoricalAmount = totalHistoricalAmount + new Double(assetPaymentAssetDetail.getAsset().getTotalCostAmount().toString());
LOG.info("***Asset:"+assetPaymentAssetDetail.getCapitalAssetNumber().toString()+" Previous Cost:"+assetPaymentAssetDetail.getAsset().getTotalCostAmount());
}
LOG.info("***Saving Document:"+document.getDocumentHeader().getDocumentNumber());
// Saving document **************************
this.businessObjectService.save(document);
// ******************************************
LOG.info("***Processing Document:"+document.getDocumentNumber());
// *********Saving asset payment, only. *********************
this.assetPaymentService.processApprovedAssetPayment(document);
// ***********************************************************
// ********** Testing data **********************
key = new HashMap();
key.put(KRADPropertyConstants.DOCUMENT_NUMBER,document.getDocumentNumber());
LOG.info("***Retrieving Document:"+document.getDocumentNumber());
// Checking that total cost was updated in the asset table
document = (AssetPaymentDocument) businessObjectService.findByPrimaryKey(AssetPaymentDocument.class, key);
document.setAssetPaymentAllocationTypeCode(CamsPropertyConstants.AssetPaymentAllocation.ASSET_DISTRIBUTION_BY_TOTAL_COST_CODE);
KualiDecimal calculatedAssetNewCost;
KualiDecimal assetOldCost;
// Getting the number of records in the asset payment
key = new HashMap();
key.put(KRADPropertyConstants.DOCUMENT_NUMBER, document.getDocumentNumber());
List<AssetPayment> assetPayments = (List<AssetPayment>) businessObjectService.findMatching(AssetPayment.class, key);
// Checking that all rows were saved
assertEquals(assetPayments.size(), (assetRows*detailRows));
//Comparing records by record
for (int x = 0; x < document.getAssetPaymentAssetDetail().size(); x++) {
AssetPaymentAssetDetail assetPaymentAssetDetail =document.getAssetPaymentAssetDetail().get(x);
assetPaymentAssetDetail.refreshReferenceObject("asset");
Long capitalAssetNumber = assetPaymentAssetDetail.getAsset().getCapitalAssetNumber();
key = new HashMap();
key.put(CamsPropertyConstants.Asset.CAPITAL_ASSET_NUMBER, capitalAssetNumber);
key.put(KRADPropertyConstants.DOCUMENT_NUMBER, document.getDocumentNumber());
assetPayments = (List<AssetPayment>) businessObjectService.findMatching(AssetPayment.class, key);
calculatedAssetNewCost = new KualiDecimal(assets.get(capitalAssetNumber));
Double previousTotalCostAmount = assets.get(capitalAssetNumber);
Double percentage = (previousTotalCostAmount/totalHistoricalAmount);
for (int i = 0; i < document.getSourceAccountingLines().size(); i++) {
AssetPaymentDetail assetPaymentDetail =(AssetPaymentDetail)document.getSourceAccountingLines().get(i);
Double paymentAmount = new Double(assetPaymentDetail.getAmount().toString());
KualiDecimal amount = new KualiDecimal(paymentAmount.doubleValue() * percentage.doubleValue());
calculatedAssetNewCost = calculatedAssetNewCost.add(amount);
// LOG.info("*****************************************************************************");
// LOG.info("***Asset: "+capitalAssetNumber);
// LOG.info("***Previous Cost:"+previousTotalCostAmount);
// LOG.info("***New Cost:"+assetPaymentAssetDetail.getAsset().getTotalCostAmount());
// LOG.info("*** % :"+ percentage + " - Total Historical Cost:"+totalHistoricalAmount);
// LOG.info("***Payment amount:"+paymentAmount);
// LOG.info("***Calculated Amount:"+amount);
// LOG.info("***Calculated new cost:"+calculatedAssetNewCost);
// LOG.info("*****************************************************************************");
// Checking fields were saved in the asset payment table
AssetPayment assetPayment = assetPayments.get(i);
assertEquals(assetPaymentDetail.getAccountNumber(), assetPayment.getAccountNumber());
assertEquals(assetPaymentDetail.getChartOfAccountsCode(), assetPayment.getChartOfAccountsCode());
assertEquals(assetPaymentDetail.getFinancialObjectCode(), assetPayment.getFinancialObjectCode());
assertEquals(amount, assetPayment.getAccountChargeAmount());
assertEquals(assetPaymentDetail.getPostingYear(), assetPayment.getFinancialDocumentPostingYear());
assertEquals(assetPaymentDetail.getPostingPeriodCode(), assetPayment.getFinancialDocumentPostingPeriodCode());
}
assetsNewCost.put(capitalAssetNumber, calculatedAssetNewCost);
}
for (int x = 0; x < document.getAssetPaymentAssetDetail().size(); x++) {
AssetPaymentAssetDetail assetPaymentAssetDetail =document.getAssetPaymentAssetDetail().get(x);
assetPaymentAssetDetail.refreshReferenceObject("asset");
Long capitalAssetNumber = assetPaymentAssetDetail.getAsset().getCapitalAssetNumber();
calculatedAssetNewCost = assetsNewCost.get(capitalAssetNumber);
//assetOldCost = new KualiDecimal(assets.get(capitalAssetNumber));
assertEquals(calculatedAssetNewCost, assetPaymentAssetDetail.getAsset().getTotalCostAmount());
}
}
public DocumentHeader getDocumentHeader() throws Exception {
WorkflowDocument workflowDocument = SpringContext.getBean(org.kuali.rice.krad.workflow.service.WorkflowDocumentService.class).createWorkflowDocument(SpringContext.getBean(DataDictionaryService.class).getDocumentTypeNameByClass(AssetPaymentDocument.class), GlobalVariables.getUserSession().getPerson());
FinancialSystemDocumentHeader documentHeader = new FinancialSystemDocumentHeader();
documentHeader.setWorkflowDocument(workflowDocument);
documentHeader.setDocumentNumber(workflowDocument.getDocumentId());
documentHeader.setFinancialDocumentStatusCode(KFSConstants.DocumentStatusCodes.APPROVED);
documentHeader.setExplanation("New asset payment");
documentHeader.setDocumentDescription("New asset payment");
documentHeader.setFinancialDocumentTotalAmount(KualiDecimal.ZERO);
return documentHeader;
}
public void testExtractPostedDatePeriod() throws Exception {
Calendar currentDate = Calendar.getInstance();
java.sql.Date jsqlD;
List<AssetPaymentDetail> assetPaymentDetails = new ArrayList<AssetPaymentDetail>();
AssetPaymentDetail assetPaymentDetail = new AssetPaymentDetail();
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
int currentYear = universityDateService.getCurrentFiscalYear();
int testYear = universityDateService.getCurrentFiscalYear() + 1000;
currentDate.setTime(dateFormat.parse(currentYear+"-01-01"));
jsqlD = new java.sql.Date(currentDate.getTime().getTime());
assetPaymentDetail.setExpenditureFinancialDocumentPostedDate(jsqlD);
assertEquals(assetPaymentService.extractPostedDatePeriod(assetPaymentDetail),true);
currentDate.setTime(dateFormat.parse(testYear+"-01-01"));
jsqlD = new java.sql.Date(currentDate.getTime().getTime());
assetPaymentDetail.setExpenditureFinancialDocumentPostedDate(jsqlD);
assertEquals(assetPaymentService.extractPostedDatePeriod(assetPaymentDetail),false);
}
}