001 /*
002 * Copyright 2011 The Kuali Foundation.
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.kfs.module.cam.document.service.impl;
017
018 import java.sql.Timestamp;
019 import java.util.Calendar;
020 import java.util.HashMap;
021 import java.util.Map;
022
023 import org.apache.commons.lang.StringUtils;
024 import org.kuali.kfs.module.cam.CamsConstants;
025 import org.kuali.kfs.module.cam.CamsPropertyConstants;
026 import org.kuali.kfs.module.cam.businessobject.Asset;
027 import org.kuali.kfs.module.cam.businessobject.AssetDepreciationConvention;
028 import org.kuali.kfs.module.cam.businessobject.AssetType;
029 import org.kuali.kfs.module.cam.document.service.AssetDateService;
030 import org.kuali.kfs.module.cam.document.service.AssetService;
031 import org.kuali.kfs.sys.KFSPropertyConstants;
032 import org.kuali.kfs.sys.businessobject.UniversityDate;
033 import org.kuali.kfs.sys.context.SpringContext;
034 import org.kuali.kfs.sys.service.UniversityDateService;
035 import org.kuali.rice.kns.exception.ValidationException;
036 import org.kuali.rice.kns.service.BusinessObjectService;
037 import org.kuali.rice.kns.service.DateTimeService;
038 import org.kuali.rice.kns.util.ObjectUtils;
039
040
041 public class AssetDateServiceImpl implements AssetDateService {
042
043 private AssetService assetService;
044 private UniversityDateService universityDateService;
045 private DateTimeService dateTimeService;
046 private BusinessObjectService businessObjectService;
047
048 /**
049 * @see org.kuali.kfs.module.cam.document.service.AssetDateService#checkAndUpdateFiscalYearAndPeriod(org.kuali.kfs.module.cam.businessobject.Asset,
050 * org.kuali.kfs.module.cam.businessobject.Asset)
051 */
052 public void checkAndUpdateFiscalYearAndPeriod(Asset oldAsset, Asset newAsset) {
053 if (assetService.isInServiceDateChanged(oldAsset, newAsset)) {
054 Integer newPostingYear = null;
055 String newPostingPeriodCode = null;
056
057 if (ObjectUtils.isNotNull(newAsset.getCapitalAssetInServiceDate())) {
058 Map<String, Object> primaryKeys = new HashMap<String, Object>();
059 primaryKeys.put(KFSPropertyConstants.UNIVERSITY_DATE, newAsset.getCapitalAssetInServiceDate());
060 UniversityDate inServiceDate = (UniversityDate) businessObjectService.findByPrimaryKey(UniversityDate.class, primaryKeys);
061
062 if (ObjectUtils.isNotNull(inServiceDate)) {
063 newPostingYear = inServiceDate.getUniversityFiscalYear();
064 newPostingPeriodCode = inServiceDate.getUniversityFiscalAccountingPeriod();
065 }
066 }
067 // if the user blank in-service date, posting year and period code will be blank also.
068 newAsset.setFinancialDocumentPostingYear(newPostingYear);
069 newAsset.setFinancialDocumentPostingPeriodCode(newPostingPeriodCode);
070 }
071 }
072
073 /**
074 * @see org.kuali.module.cams.service.AssetDetailInformationService#checkAndUpdateLastInventoryDate(org.kuali.kfs.module.cam.businessobject.Asset,
075 * org.kuali.kfs.module.cam.businessobject.Asset)
076 */
077 public void checkAndUpdateLastInventoryDate(Asset oldAsset, Asset newAsset) {
078 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())) {
079 Timestamp timestamp = new Timestamp(dateTimeService.getCurrentDate().getTime());
080 newAsset.setLastInventoryDate(timestamp);
081 }
082 }
083
084 /**
085 * @see org.kuali.module.cams.service.AssetDetailInformationService#checkAndUpdateDepreciationDate(org.kuali.kfs.module.cam.businessobject.Asset,
086 * org.kuali.kfs.module.cam.businessobject.Asset)
087 */
088 public void checkAndUpdateDepreciationDate(Asset oldAsset, Asset newAsset) {
089 if (assetService.isAssetTypeCodeChanged(oldAsset, newAsset) && assetService.isAssetDepreciableLifeLimitZero(newAsset)) {
090 // If Asset Type changed to Depreciable Life Limit to "0", set both In-service Date and Depreciation Date to NULL.
091 newAsset.setDepreciationDate(null);
092 newAsset.setCapitalAssetInServiceDate(null);
093 }
094 else if (assetService.isInServiceDateChanged(oldAsset, newAsset) || assetService.isFinancialObjectSubTypeCodeChanged(oldAsset, newAsset)) {
095 Map<String, String> primaryKeys = new HashMap<String, String>();
096 primaryKeys.put(CamsPropertyConstants.AssetDepreciationConvention.FINANCIAL_OBJECT_SUB_TYPE_CODE, newAsset.getFinancialObjectSubTypeCode());
097 AssetDepreciationConvention depreciationConvention = (AssetDepreciationConvention) SpringContext.getBean(BusinessObjectService.class).findByPrimaryKey(AssetDepreciationConvention.class, primaryKeys);
098 newAsset.setDepreciationDate(computeDepreciationDate(newAsset.getCapitalAssetType(), depreciationConvention, newAsset.getCapitalAssetInServiceDate()));
099 }
100 }
101
102
103 /**
104 * @see org.kuali.kfs.module.cam.document.service.AssetDateService#computeDepreciationDate(org.kuali.kfs.module.cam.businessobject.AssetType,
105 * org.kuali.kfs.module.cam.businessobject.AssetDepreciationConvention, java.sql.Date)
106 */
107 public java.sql.Date computeDepreciationDate(AssetType assetType, AssetDepreciationConvention depreciationConvention, java.sql.Date inServiceDate) {
108 java.sql.Date depreciationDate = null;
109 if (assetType.getDepreciableLifeLimit() != null && assetType.getDepreciableLifeLimit().intValue() != 0) {
110 if (depreciationConvention == null || CamsConstants.DepreciationConvention.CREATE_DATE.equalsIgnoreCase(depreciationConvention.getDepreciationConventionCode())) {
111 depreciationDate = inServiceDate;
112 }
113 else {
114 Integer fiscalYear = universityDateService.getFiscalYear(inServiceDate);
115 if (fiscalYear == null) {
116 throw new ValidationException("University Fiscal year is not defined for date - " + inServiceDate);
117 }
118
119 java.sql.Date newInServiceFiscalYearStartDate = new java.sql.Date(universityDateService.getFirstDateOfFiscalYear(fiscalYear).getTime());
120 String conventionCode = depreciationConvention.getDepreciationConventionCode();
121
122 if (CamsConstants.DepreciationConvention.FULL_YEAR.equalsIgnoreCase(conventionCode)) {
123 depreciationDate = newInServiceFiscalYearStartDate;
124 }
125 else if (CamsConstants.DepreciationConvention.HALF_YEAR.equalsIgnoreCase(conventionCode)) {
126 // Half year depreciation convention
127 Calendar calendar = Calendar.getInstance();
128 calendar.setTime(newInServiceFiscalYearStartDate);
129 calendar.add(Calendar.MONTH, 6);
130 depreciationDate = new java.sql.Date(calendar.getTimeInMillis());
131 }
132
133 }
134 }
135 return depreciationDate;
136 }
137
138 public AssetService getAssetService() {
139 return assetService;
140 }
141
142 public void setAssetService(AssetService assetService) {
143 this.assetService = assetService;
144 }
145
146 public UniversityDateService getUniversityDateService() {
147 return universityDateService;
148 }
149
150 public void setUniversityDateService(UniversityDateService universityDateService) {
151 this.universityDateService = universityDateService;
152 }
153
154 /**
155 * Gets the dateTimeService attribute.
156 *
157 * @return Returns the dateTimeService.
158 */
159 public DateTimeService getDateTimeService() {
160 return dateTimeService;
161 }
162
163 /**
164 * Sets the dateTimeService attribute value.
165 *
166 * @param dateTimeService The dateTimeService to set.
167 */
168 public void setDateTimeService(DateTimeService dateTimeService) {
169 this.dateTimeService = dateTimeService;
170 }
171
172 /**
173 * Gets the businessObjectService attribute.
174 *
175 * @return Returns the businessObjectService.
176 */
177 public BusinessObjectService getBusinessObjectService() {
178 return businessObjectService;
179 }
180
181 /**
182 * Sets the businessObjectService attribute value.
183 *
184 * @param businessObjectService The businessObjectService to set.
185 */
186 public void setBusinessObjectService(BusinessObjectService businessObjectService) {
187 this.businessObjectService = businessObjectService;
188 }
189
190 }