/* * 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.impl; import java.sql.Timestamp; import java.util.Calendar; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.kuali.kfs.module.cam.CamsConstants; import org.kuali.kfs.module.cam.CamsPropertyConstants; import org.kuali.kfs.module.cam.businessobject.Asset; import org.kuali.kfs.module.cam.businessobject.AssetDepreciationConvention; import org.kuali.kfs.module.cam.businessobject.AssetGlobal; import org.kuali.kfs.module.cam.businessobject.AssetLocation; import org.kuali.kfs.module.cam.businessobject.AssetType; import org.kuali.kfs.module.cam.document.service.AssetDateService; import org.kuali.kfs.module.cam.document.service.AssetService; import org.kuali.kfs.sys.KFSPropertyConstants; import org.kuali.kfs.sys.businessobject.UniversityDate; 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.coreservice.framework.parameter.ParameterService; import org.kuali.rice.krad.exception.ValidationException; import org.kuali.rice.krad.service.BusinessObjectService; import org.kuali.rice.krad.util.ObjectUtils; public class AssetDateServiceImpl implements AssetDateService { private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(AssetDateService.class); private AssetService assetService; private UniversityDateService universityDateService; private DateTimeService dateTimeService; private BusinessObjectService businessObjectService; /** * @see org.kuali.kfs.module.cam.document.service.AssetDateService#checkAndUpdateFiscalYearAndPeriod(org.kuali.kfs.module.cam.businessobject.Asset, * org.kuali.kfs.module.cam.businessobject.Asset) */ @Override public void checkAndUpdateFiscalYearAndPeriod(Asset oldAsset, Asset newAsset) { if (assetService.isInServiceDateChanged(oldAsset, newAsset)) { Integer newPostingYear = null; String newPostingPeriodCode = null; if (ObjectUtils.isNotNull(newAsset.getCapitalAssetInServiceDate())) { Map<String, Object> primaryKeys = new HashMap<String, Object>(); primaryKeys.put(KFSPropertyConstants.UNIVERSITY_DATE, newAsset.getCapitalAssetInServiceDate()); UniversityDate inServiceDate = businessObjectService.findByPrimaryKey(UniversityDate.class, primaryKeys); if (ObjectUtils.isNotNull(inServiceDate)) { newPostingYear = inServiceDate.getUniversityFiscalYear(); newPostingPeriodCode = inServiceDate.getUniversityFiscalAccountingPeriod(); } } // if the user blank in-service date, posting year and period code will be blank also. newAsset.setFinancialDocumentPostingYear(newPostingYear); newAsset.setFinancialDocumentPostingPeriodCode(newPostingPeriodCode); } } /** * @see org.kuali.module.cams.service.AssetDetailInformationService#checkAndUpdateLastInventoryDate(org.kuali.kfs.module.cam.businessobject.Asset, * org.kuali.kfs.module.cam.businessobject.Asset) */ @Override public void checkAndUpdateLastInventoryDate(Asset oldAsset, Asset newAsset) { AssetLocation oldOffCampusLocation = oldAsset.getOffCampusLocation(); AssetLocation newOffCampusLocation = newAsset.getOffCampusLocation(); if(ObjectUtils.isNull(oldOffCampusLocation) || ObjectUtils.isNull(newOffCampusLocation)){ return; } if (!StringUtils.equalsIgnoreCase(oldAsset.getCampusCode(), newAsset.getCampusCode()) || !StringUtils.equalsIgnoreCase(oldAsset.getBuildingCode(), newAsset.getBuildingCode()) || !StringUtils.equalsIgnoreCase(oldAsset.getBuildingRoomNumber(), newAsset.getBuildingRoomNumber()) || !StringUtils.equalsIgnoreCase(oldAsset.getBuildingSubRoomNumber(), newAsset.getBuildingSubRoomNumber()) || !StringUtils.equalsIgnoreCase(oldAsset.getCampusTagNumber(), newAsset.getCampusTagNumber()) || !StringUtils.equalsIgnoreCase(oldOffCampusLocation.getAssetLocationContactName(), newOffCampusLocation.getAssetLocationContactName()) || !StringUtils.equalsIgnoreCase(oldOffCampusLocation.getAssetLocationStreetAddress(), newOffCampusLocation.getAssetLocationStreetAddress()) || !StringUtils.equalsIgnoreCase(oldOffCampusLocation.getAssetLocationCityName(), newOffCampusLocation.getAssetLocationCityName()) || !StringUtils.equalsIgnoreCase(oldOffCampusLocation.getAssetLocationStateCode(), newOffCampusLocation.getAssetLocationStateCode()) || !StringUtils.equalsIgnoreCase(oldOffCampusLocation.getAssetLocationZipCode(), newOffCampusLocation.getAssetLocationZipCode()) || !StringUtils.equalsIgnoreCase(oldOffCampusLocation.getAssetLocationCountryCode(), newOffCampusLocation.getAssetLocationCountryCode()) ) { Timestamp timestamp = new Timestamp(dateTimeService.getCurrentDate().getTime()); newAsset.setLastInventoryDate(timestamp); } } /** * @see org.kuali.module.cams.service.AssetDetailInformationService#checkAndUpdateDepreciationDate(org.kuali.kfs.module.cam.businessobject.Asset, * org.kuali.kfs.module.cam.businessobject.Asset) */ @Override public void checkAndUpdateDepreciationDate(Asset oldAsset, Asset newAsset) { if (assetService.isAssetTypeCodeChanged(oldAsset, newAsset) && assetService.isAssetDepreciableLifeLimitZero(newAsset)) { // If Asset Type changed to Depreciable Life Limit to "0", set both In-service Date and Depreciation Date to NULL. newAsset.setDepreciationDate(null); newAsset.setCapitalAssetInServiceDate(null); } else if (assetService.isInServiceDateChanged(oldAsset, newAsset) || assetService.isFinancialObjectSubTypeCodeChanged(oldAsset, newAsset)) { Map<String, String> primaryKeys = new HashMap<String, String>(); primaryKeys.put(CamsPropertyConstants.AssetDepreciationConvention.FINANCIAL_OBJECT_SUB_TYPE_CODE, newAsset.getFinancialObjectSubTypeCode()); AssetDepreciationConvention depreciationConvention = SpringContext.getBean(BusinessObjectService.class).findByPrimaryKey(AssetDepreciationConvention.class, primaryKeys); newAsset.setDepreciationDate(computeDepreciationDate(newAsset.getCapitalAssetType(), depreciationConvention, newAsset.getCapitalAssetInServiceDate())); } } /** * @see org.kuali.kfs.module.cam.document.service.AssetDateService#computeDepreciationDate(org.kuali.kfs.module.cam.businessobject.AssetType, * org.kuali.kfs.module.cam.businessobject.AssetDepreciationConvention, java.sql.Date) */ @Override public java.sql.Date computeDepreciationDate(AssetType assetType, AssetDepreciationConvention depreciationConvention, java.sql.Date inServiceDate) { java.sql.Date depreciationDate = null; if (assetType.getDepreciableLifeLimit() != null && assetType.getDepreciableLifeLimit().intValue() != 0) { if (depreciationConvention == null || CamsConstants.DepreciationConvention.CREATE_DATE.equalsIgnoreCase(depreciationConvention.getDepreciationConventionCode())) { depreciationDate = inServiceDate; } else { Integer fiscalYear = universityDateService.getFiscalYear(inServiceDate); if (fiscalYear == null) { throw new ValidationException("University Fiscal year is not defined for date - " + inServiceDate); } //Retrieve new in service start date from parameter String newInServiceAssetDepreciationStartMMDD = SpringContext.getBean(ParameterService.class).getParameterValueAsString(AssetGlobal.class, CamsConstants.Parameters.NEW_IN_SERVICE_ASSET_DEPRECIATION_START_DATE); java.sql.Date newInServiceFiscalYearStartDate = null; try { newInServiceFiscalYearStartDate= getDateTimeService().convertToSqlDate(newInServiceAssetDepreciationStartMMDD + "/" + fiscalYear); } catch( Exception e ){ //issue to construct the new in service fiscal year start date String error = "Unable to construct new in service fiscal year start date - param value: [ " + newInServiceAssetDepreciationStartMMDD + "]"; LOG.error(error, e ); throw new IllegalArgumentException(error, e); } String conventionCode = depreciationConvention.getDepreciationConventionCode(); //kfsmi-8390 fix... //when depreciationConventionCode = FY then NEW_IN_SERVICE_ASSET_DEPRECIATION_START_DATE + fiscal year and then //subtracting 1 from the year to set the deprection date if (CamsConstants.DepreciationConvention.FULL_YEAR.equalsIgnoreCase(conventionCode)) { Calendar calendar = Calendar.getInstance(); calendar.setTime(newInServiceFiscalYearStartDate); calendar.add(Calendar.YEAR, -1); depreciationDate = new java.sql.Date(calendar.getTimeInMillis()); // depreciationDate = newInServiceFiscalYearStartDate; } //when depreciationConventionCode = HY else if (CamsConstants.DepreciationConvention.HALF_YEAR.equalsIgnoreCase(conventionCode)) { // Half year depreciation convention //start the month and date as "01/01" and concat the fiscal year... java.sql.Date newInServiceFiscalYearStartDateForHalfYear = null; try { newInServiceFiscalYearStartDateForHalfYear= getDateTimeService().convertToSqlDate("01/01/" + fiscalYear); } catch( Exception e ){ //issue to construct the new in service fiscal year start date String error = "Unable to construct new in service fiscal year start date"; LOG.error(error, e ); throw new IllegalArgumentException(error, e); } depreciationDate = newInServiceFiscalYearStartDateForHalfYear; } } } return depreciationDate; } public AssetService getAssetService() { return assetService; } public void setAssetService(AssetService assetService) { this.assetService = assetService; } public UniversityDateService getUniversityDateService() { return universityDateService; } public void setUniversityDateService(UniversityDateService universityDateService) { this.universityDateService = universityDateService; } /** * Gets the dateTimeService attribute. * * @return Returns the dateTimeService. */ public DateTimeService getDateTimeService() { return dateTimeService; } /** * Sets the dateTimeService attribute value. * * @param dateTimeService The dateTimeService to set. */ public void setDateTimeService(DateTimeService dateTimeService) { this.dateTimeService = dateTimeService; } /** * Gets the businessObjectService attribute. * * @return Returns the businessObjectService. */ public BusinessObjectService getBusinessObjectService() { return businessObjectService; } /** * Sets the businessObjectService attribute value. * * @param businessObjectService The businessObjectService to set. */ public void setBusinessObjectService(BusinessObjectService businessObjectService) { this.businessObjectService = businessObjectService; } /** * @see org.kuali.kfs.module.cam.document.service.AssetDateService#computeDepreciationDateForPeriod13(java.lang.String, java.sql.Date) */ public java.sql.Date computeDepreciationDateForPeriod13(String depreciationConventionCode, java.sql.Date inServiceDate) { java.sql.Date depreciationDate = null; Integer fiscalYear = getUniversityDateService().getFiscalYear(inServiceDate); java.sql.Date fiscalYearStartDate = new java.sql.Date(getUniversityDateService().getFirstDateOfFiscalYear(fiscalYear).getTime()); if (CamsConstants.DepreciationConvention.CREATE_DATE.equals(depreciationConventionCode)) { depreciationDate = inServiceDate; } else if (CamsConstants.DepreciationConvention.FULL_YEAR.equals(depreciationConventionCode)) { depreciationDate = fiscalYearStartDate; } else if (CamsConstants.DepreciationConvention.HALF_YEAR.equals(depreciationConventionCode)) { // Half year depreciation convention Calendar calendar = Calendar.getInstance(); calendar.setTime(fiscalYearStartDate); calendar.add(Calendar.MONTH, 6); depreciationDate = new java.sql.Date(calendar.getTimeInMillis()); } return depreciationDate; } }