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 017 package org.kuali.kfs.module.cam.document.dataaccess.impl; 018 019 import java.math.BigDecimal; 020 import java.text.NumberFormat; 021 import java.util.ArrayList; 022 import java.util.Calendar; 023 import java.util.Collection; 024 import java.util.HashMap; 025 import java.util.Iterator; 026 import java.util.List; 027 import java.util.Locale; 028 029 import org.apache.ojb.broker.query.Criteria; 030 import org.apache.ojb.broker.query.QueryFactory; 031 import org.apache.ojb.broker.query.ReportQueryByCriteria; 032 import org.kuali.kfs.coa.businessobject.Account; 033 import org.kuali.kfs.module.cam.CamsConstants; 034 import org.kuali.kfs.module.cam.CamsKeyConstants; 035 import org.kuali.kfs.module.cam.CamsPropertyConstants; 036 import org.kuali.kfs.module.cam.businessobject.Asset; 037 import org.kuali.kfs.module.cam.businessobject.AssetObjectCode; 038 import org.kuali.kfs.module.cam.businessobject.AssetPayment; 039 import org.kuali.kfs.module.cam.businessobject.AssetRetirementGlobal; 040 import org.kuali.kfs.module.cam.document.AssetTransferDocument; 041 import org.kuali.kfs.module.cam.document.dataaccess.DepreciableAssetsDao; 042 import org.kuali.kfs.module.cam.document.dataaccess.DepreciationBatchDao; 043 import org.kuali.kfs.sys.KFSConstants; 044 import org.kuali.kfs.sys.KFSPropertyConstants; 045 import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry; 046 import org.kuali.kfs.sys.dataaccess.UniversityDateDao; 047 import org.kuali.kfs.sys.service.OptionsService; 048 import org.kuali.kfs.sys.service.impl.KfsParameterConstants; 049 import org.kuali.rice.kns.bo.DocumentHeader; 050 import org.kuali.rice.kns.dao.impl.PlatformAwareDaoBaseOjb; 051 import org.kuali.rice.kns.service.BusinessObjectService; 052 import org.kuali.rice.kns.service.DateTimeService; 053 import org.kuali.rice.kns.service.KualiConfigurationService; 054 import org.kuali.rice.kns.service.ParameterService; 055 import org.kuali.rice.kns.util.KualiDecimal; 056 import org.kuali.rice.kns.util.spring.CacheNoCopy; 057 058 public class DepreciableAssetsDaoOjb extends PlatformAwareDaoBaseOjb implements DepreciableAssetsDao { 059 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(DepreciableAssetsDaoOjb.class); 060 private KualiConfigurationService kualiConfigurationService; 061 private ParameterService parameterService; 062 private DateTimeService dateTimeService; 063 private OptionsService optionsService; 064 private BusinessObjectService businessObjectService; 065 private UniversityDateDao universityDateDao; 066 private DepreciationBatchDao depreciationBatchDao; 067 068 private String errorMsg = new String(); 069 070 protected final static String PAYMENT_TO_ASSET_REFERENCE_DESCRIPTOR = "asset."; 071 protected final static String PAYMENT_TO_OBJECT_REFERENCE_DESCRIPTOR = "financialObject."; 072 protected final static String ASSET_TO_ASSET_TYPE_REFERENCE_DESCRIPTOR = "asset.capitalAssetType."; 073 protected final static String[] REPORT_GROUP = { "*** BEFORE RUNNING DEPRECIATION PROCESS ****", "*** AFTER RUNNING DEPRECIATION PROCESS ****" }; 074 075 076 /** 077 * @see org.kuali.kfs.module.cam.document.dataaccess.DepreciableAssetsDao#generateStatistics(boolean, java.lang.String, 078 * java.lang.Integer, java.lang.Integer, java.util.Calendar) 079 */ 080 public List<String[]> generateStatistics(boolean beforeDepreciationReport, List<String> documentNumbers, Integer fiscalYear, Integer fiscalMonth, Calendar depreciationDate) { 081 LOG.debug("generateStatistics() - started"); 082 LOG.info(CamsConstants.Depreciation.DEPRECIATION_BATCH + "generating statistics for report - " + (beforeDepreciationReport ? "Before part." : "After part")); 083 084 List<String[]> reportLine = new ArrayList<String[]>(); 085 boolean processAlreadyRan = false; 086 087 NumberFormat usdFormat = NumberFormat.getCurrencyInstance(Locale.US); 088 KualiDecimal amount = new KualiDecimal(0); 089 String[] columns = new String[2]; 090 091 092 columns[1] = "******************"; 093 if (beforeDepreciationReport) 094 columns[0] = REPORT_GROUP[0]; 095 else 096 columns[0] = REPORT_GROUP[1]; 097 098 reportLine.add(columns.clone()); 099 100 if (beforeDepreciationReport) { 101 columns[0] = "Depreciation Run Date"; 102 columns[1] = (dateTimeService.toDateString(depreciationDate.getTime())); 103 reportLine.add(columns.clone()); 104 105 106 columns[0] = "Fiscal Year"; 107 columns[1] = (fiscalYear.toString()); 108 reportLine.add(columns.clone()); 109 110 columns[0] = "Fiscal Month"; 111 columns[1] = (fiscalMonth.toString()); 112 reportLine.add(columns.clone()); 113 114 columns[0] = "Number of assets fully depreciated"; 115 columns[1] = depreciationBatchDao.getFullyDepreciatedAssetCount().toString(); 116 // columns[1] = getFullyDepreciatedAssetCount().toString(); 117 reportLine.add(columns.clone()); 118 } 119 120 LOG.info(CamsConstants.Depreciation.DEPRECIATION_BATCH + "Getting DocumentHeader row count."); 121 Criteria criteria = new Criteria(); 122 ReportQueryByCriteria q = QueryFactory.newReportQuery(DocumentHeader.class, new Criteria()); 123 q.setAttributes(new String[] { "count(*)" }); 124 Iterator<Object> i = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(q); 125 126 Object[] data = (Object[]) i.next(); 127 columns[0] = "Document header table - record count"; 128 columns[1] = (convertCountValueToString(data[0])); 129 reportLine.add(columns.clone()); 130 131 LOG.info(CamsConstants.Depreciation.DEPRECIATION_BATCH + "Getting general ledger pending entry row count."); 132 q = QueryFactory.newReportQuery(GeneralLedgerPendingEntry.class, new Criteria()); 133 q.setAttributes(new String[] { "count(*)" }); 134 i = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(q); 135 data = (Object[]) i.next(); 136 columns[0] = "General ledger pending entry table - record count"; 137 columns[1] = (convertCountValueToString(data[0])); 138 reportLine.add(columns.clone()); 139 140 if (beforeDepreciationReport) { 141 LOG.info(CamsConstants.Depreciation.DEPRECIATION_BATCH + "Getting assets row count."); 142 q = QueryFactory.newReportQuery(Asset.class, new Criteria()); 143 q.setAttributes(new String[] { "count(*)" }); 144 i = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(q); 145 data = (Object[]) i.next(); 146 columns[0] = "Asset table - record count"; 147 columns[1] = (convertCountValueToString(data[0])); 148 reportLine.add(columns.clone()); 149 } 150 151 LOG.info(CamsConstants.Depreciation.DEPRECIATION_BATCH + "Getting assets payment row count, depreciation base amount, accumulated depreciation amount, and every months depreciation amount."); 152 q = QueryFactory.newReportQuery(AssetPayment.class, new Criteria()); 153 q.setAttributes(new String[] { "count(*)", "SUM(" + CamsPropertyConstants.AssetPayment.PRIMARY_DEPRECIATION_BASE_AMOUNT + ")", "SUM(" + CamsPropertyConstants.AssetPayment.ACCUMULATED_DEPRECIATION_AMOUNT + ")", "SUM(" + CamsPropertyConstants.AssetPayment.PREVIOUS_YEAR_DEPRECIATION_AMOUNT + ")", "SUM(" + CamsPropertyConstants.AssetPayment.PERIOD_1_DEPRECIATION_AMOUNT + ")", "SUM(" + CamsPropertyConstants.AssetPayment.PERIOD_2_DEPRECIATION_AMOUNT + ")", "SUM(" + CamsPropertyConstants.AssetPayment.PERIOD_3_DEPRECIATION_AMOUNT + ")", "SUM(" + CamsPropertyConstants.AssetPayment.PERIOD_4_DEPRECIATION_AMOUNT + ")", "SUM(" + CamsPropertyConstants.AssetPayment.PERIOD_5_DEPRECIATION_AMOUNT + ")", "SUM(" + CamsPropertyConstants.AssetPayment.PERIOD_6_DEPRECIATION_AMOUNT + ")", "SUM(" + CamsPropertyConstants.AssetPayment.PERIOD_7_DEPRECIATION_AMOUNT + ")", "SUM(" + CamsPropertyConstants.AssetPayment.PERIOD_8_DEPRECIATION_AMOUNT + ")", 154 "SUM(" + CamsPropertyConstants.AssetPayment.PERIOD_9_DEPRECIATION_AMOUNT + ")", "SUM(" + CamsPropertyConstants.AssetPayment.PERIOD_10_DEPRECIATION_AMOUNT + ")", "SUM(" + CamsPropertyConstants.AssetPayment.PERIOD_11_DEPRECIATION_AMOUNT + ")", "SUM(" + CamsPropertyConstants.AssetPayment.PERIOD_12_DEPRECIATION_AMOUNT + ")" }); 155 156 i = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(q); 157 data = new Object[16]; 158 if (i.hasNext()) { 159 data = (Object[]) i.next(); 160 } 161 else { 162 for (int c = 0; c < 16; c++) 163 data[c] = new KualiDecimal(0); 164 } 165 166 if (beforeDepreciationReport) { 167 columns[0] = "Asset payment table - record count"; 168 columns[1] = (convertCountValueToString(data[0])); 169 reportLine.add(columns.clone()); 170 } 171 172 columns[0] = "Depreciation base amount"; 173 columns[1] = (usdFormat.format((KualiDecimal) data[1])); 174 reportLine.add(columns.clone()); 175 176 columns[0] = "Current year - accumulated depreciation"; 177 columns[1] = (usdFormat.format((KualiDecimal) data[2])); 178 reportLine.add(columns.clone()); 179 180 columns[0] = "Previous year - accumulated depreciation"; 181 columns[1] = (usdFormat.format((KualiDecimal) data[3])); 182 reportLine.add(columns.clone()); 183 184 /* 185 * Here I'm getting the column of total depreciation for the current fiscal month. The idea here is to prevent the process 186 * from running a second time for the same fiscal month. 3 + fiscalMonth (variable) => current fiscal month depreciation 187 * column in the array. So if the current fiscal month depreciation column > 0 then depreciation was already ran. Therefore, 188 * it should be stop but, not until part of the pdf report List is populated so it can be written. 189 */ 190 processAlreadyRan = false; 191 if (fiscalMonth > 1) { 192 if (((KualiDecimal) data[3 + fiscalMonth]).compareTo(new KualiDecimal(0)) != 0) 193 processAlreadyRan = true; 194 } 195 // ******************************************************************************************************************************* 196 197 // Adding monthly depreciation amounts 198 KualiDecimal yearToDateDepreciationAmt = new KualiDecimal(0); 199 200 int fiscalStartMonth = Integer.parseInt(optionsService.getCurrentYearOptions().getUniversityFiscalYearStartMo()); 201 boolean isJanuaryTheFirstFiscalMonth = (fiscalStartMonth == 1); 202 int col = 4; 203 int currentMonth = fiscalStartMonth - 1; 204 for (int monthCounter = 1; monthCounter <= 12; monthCounter++, currentMonth++) { 205 columns[0] = CamsConstants.MONTHS[currentMonth] + " depreciation amount"; 206 columns[1] = (usdFormat.format((KualiDecimal) data[col])); 207 reportLine.add(columns.clone()); 208 209 yearToDateDepreciationAmt = yearToDateDepreciationAmt.add((KualiDecimal) data[col]); 210 211 col++; 212 213 if (!isJanuaryTheFirstFiscalMonth) { 214 if (currentMonth == 11) 215 currentMonth = -1; 216 } 217 } 218 219 columns[0] = "Year to date depreciation amount"; 220 columns[1] = (usdFormat.format(yearToDateDepreciationAmt)); 221 reportLine.add(columns.clone()); 222 223 if (beforeDepreciationReport) { 224 int federallyOwnedAssetPaymentCount = Integer.valueOf(depreciationBatchDao.getFederallyOwnedAssetAndPaymentCount(fiscalYear, fiscalMonth, depreciationDate)[1].toString()); 225 int retiredAndTransferredAssetCount = depreciationBatchDao.getTransferDocLockedAssetCount() + depreciationBatchDao.getRetireDocLockedAssetCount(); 226 227 columns[0] = "Object code table - record count"; 228 columns[1] = (convertCountValueToString(this.getAssetObjectCodesCount(fiscalYear))); 229 reportLine.add(columns.clone()); 230 231 columns[0] = "Plant fund account table - record count"; 232 columns[1] = (convertCountValueToString(this.getCOAsCount())); 233 reportLine.add(columns.clone()); 234 235 LOG.info(CamsConstants.Depreciation.DEPRECIATION_BATCH + "Getting asset payment row count , depreciation base amount, accumulated depreciation amount, and every months depreciation amount."); 236 data = depreciationBatchDao.getAssetAndPaymentCount(fiscalYear, fiscalMonth, depreciationDate, true); 237 int eligibleAssetPaymentCount = new Integer(data[1].toString()); 238 239 int totalAssetPayments = (eligibleAssetPaymentCount + federallyOwnedAssetPaymentCount); 240 241 columns[0] = "Asset payments eligible for depreciation"; 242 columns[1] = totalAssetPayments + ""; 243 reportLine.add(columns.clone()); 244 245 columns[0] = "Number of assets with pending AR or AT documents"; 246 columns[1] = retiredAndTransferredAssetCount + ""; 247 reportLine.add(columns.clone()); 248 249 data = depreciationBatchDao.getAssetAndPaymentCount(fiscalYear, fiscalMonth, depreciationDate, false); 250 eligibleAssetPaymentCount = new Integer(data[1].toString()); 251 columns[0] = "Asset payments eligible for depreciation - After excluding AR and AT"; 252 columns[1] = "" + (eligibleAssetPaymentCount + federallyOwnedAssetPaymentCount); 253 reportLine.add(columns.clone()); 254 255 columns[0] = "Asset payments ineligible for depreciation (Federally owned assets)"; 256 columns[1] = federallyOwnedAssetPaymentCount + ""; 257 reportLine.add(columns.clone()); 258 259 // payments eligible after deleting pending AR and AT documents.!! 260 columns[0] = "Asset payments eligible for depreciation - After excluding federally owned assets"; 261 columns[1] = eligibleAssetPaymentCount + ""; 262 reportLine.add(columns.clone()); 263 264 columns[0] = "Assets eligible for depreciation"; 265 columns[1] = data[0].toString(); 266 reportLine.add(columns.clone()); 267 } 268 269 270 if (!beforeDepreciationReport) { 271 // Generating a list of depreciation expense object codes. 272 List<String> depreExpObjCodes = this.getExpenseObjectCodes(fiscalYear); 273 274 // Generating a list of accumulated depreciation object codes. 275 List<String> accumulatedDepreciationObjCodes = this.getAccumulatedDepreciationObjectCodes(fiscalYear); 276 277 KualiDecimal debits = new KualiDecimal(0); 278 KualiDecimal credits = new KualiDecimal(0); 279 280 // Document Number created 281 columns[0] = "Document Number(s)"; 282 columns[1] = documentNumbers.toString(); 283 reportLine.add(columns.clone()); 284 285 // Expense Debit 286 LOG.info(CamsConstants.Depreciation.DEPRECIATION_BATCH + "calculating the debit amount for expense object codes."); 287 criteria = new Criteria(); 288 criteria.addIn(KFSPropertyConstants.FINANCIAL_OBJECT_CODE, depreExpObjCodes); 289 criteria.addEqualTo(KFSPropertyConstants.TRANSACTION_DEBIT_CREDIT_CODE, KFSConstants.GL_DEBIT_CODE); 290 criteria.addIn(KFSPropertyConstants.DOCUMENT_NUMBER, documentNumbers); 291 292 q = QueryFactory.newReportQuery(GeneralLedgerPendingEntry.class, criteria); 293 q.setAttributes(new String[] { "SUM(" + KFSPropertyConstants.TRANSACTION_LEDGER_ENTRY_AMOUNT + ")" }); 294 i = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(q); 295 data = (Object[]) i.next(); 296 297 amount = (data[0] == null ? new KualiDecimal(0) : (KualiDecimal) data[0]); 298 KualiDecimal deprAmtDebit = amount; 299 columns[0] = "Debit - Depreciation Expense object codes: " + depreExpObjCodes.toString(); 300 columns[1] = (usdFormat.format(amount)); 301 reportLine.add(columns.clone()); 302 debits = debits.add(amount); 303 304 // Accumulated Depreciation credit 305 LOG.info(CamsConstants.Depreciation.DEPRECIATION_BATCH + "calculating the credit amount for accumulated depreciation object codes."); 306 criteria = new Criteria(); 307 criteria.addIn(KFSPropertyConstants.FINANCIAL_OBJECT_CODE, accumulatedDepreciationObjCodes); 308 criteria.addEqualTo(KFSPropertyConstants.TRANSACTION_DEBIT_CREDIT_CODE, KFSConstants.GL_CREDIT_CODE); 309 criteria.addIn(KFSPropertyConstants.DOCUMENT_NUMBER, documentNumbers); 310 311 q = QueryFactory.newReportQuery(GeneralLedgerPendingEntry.class, criteria); 312 q.setAttributes(new String[] { "SUM(" + KFSPropertyConstants.TRANSACTION_LEDGER_ENTRY_AMOUNT + ")" }); 313 i = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(q); 314 data = (Object[]) i.next(); 315 amount = (data[0] == null ? new KualiDecimal(0) : (KualiDecimal) data[0]); 316 columns[0] = "Credit - Accumulated depreciation object codes: " + accumulatedDepreciationObjCodes.toString(); 317 columns[1] = (usdFormat.format(amount)); 318 reportLine.add(columns.clone()); 319 credits = credits.add(amount); 320 // *********************************************************************************************** 321 322 // Accumulated Depreciation debit 323 LOG.info(CamsConstants.Depreciation.DEPRECIATION_BATCH + "calculating the debit amount for accumulated depreciation object codes."); 324 criteria = new Criteria(); 325 criteria.addIn(KFSPropertyConstants.FINANCIAL_OBJECT_CODE, accumulatedDepreciationObjCodes); 326 criteria.addEqualTo(KFSPropertyConstants.TRANSACTION_DEBIT_CREDIT_CODE, KFSConstants.GL_DEBIT_CODE); 327 criteria.addIn(KFSPropertyConstants.DOCUMENT_NUMBER, documentNumbers); 328 329 q = QueryFactory.newReportQuery(GeneralLedgerPendingEntry.class, criteria); 330 q.setAttributes(new String[] { "SUM(" + KFSPropertyConstants.TRANSACTION_LEDGER_ENTRY_AMOUNT + ")" }); 331 i = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(q); 332 data = (Object[]) i.next(); 333 amount = (data[0] == null ? new KualiDecimal(0) : (KualiDecimal) data[0]); 334 335 columns[0] = "Debit - Accumulated depreciation object codes:" + accumulatedDepreciationObjCodes.toString(); 336 columns[1] = (usdFormat.format(amount)); 337 reportLine.add(columns.clone()); 338 debits = debits.add(amount); 339 340 // Expense credit 341 LOG.info(CamsConstants.Depreciation.DEPRECIATION_BATCH + "calculating the credit amount for expense object codes."); 342 criteria = new Criteria(); 343 criteria.addIn(KFSPropertyConstants.FINANCIAL_OBJECT_CODE, depreExpObjCodes); 344 criteria.addEqualTo(KFSPropertyConstants.TRANSACTION_DEBIT_CREDIT_CODE, KFSConstants.GL_CREDIT_CODE); 345 criteria.addIn(KFSPropertyConstants.DOCUMENT_NUMBER, documentNumbers); 346 347 q = QueryFactory.newReportQuery(GeneralLedgerPendingEntry.class, criteria); 348 q.setAttributes(new String[] { "SUM(" + KFSPropertyConstants.TRANSACTION_LEDGER_ENTRY_AMOUNT + ")" }); 349 i = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(q); 350 data = (Object[]) i.next(); 351 amount = (data[0] == null ? new KualiDecimal(0) : (KualiDecimal) data[0]); 352 KualiDecimal deprAmtCredit = amount; 353 columns[0] = "Credit - Depreciation Expense object codes:" + depreExpObjCodes.toString(); 354 columns[1] = (usdFormat.format(amount)); 355 reportLine.add(columns.clone()); 356 credits = credits.add(amount); 357 358 columns[0] = "Current Month"; 359 columns[1] = usdFormat.format(deprAmtDebit.subtract(deprAmtCredit)); 360 reportLine.add(columns.clone()); 361 362 columns[0] = "Total Debits"; 363 columns[1] = usdFormat.format(debits); 364 reportLine.add(columns.clone()); 365 366 columns[0] = "Total Credits"; 367 columns[1] = usdFormat.format(credits); 368 reportLine.add(columns.clone()); 369 370 columns[0] = "Total Debits - Total Credits"; 371 columns[1] = usdFormat.format(debits.subtract(credits)); 372 reportLine.add(columns.clone()); 373 } 374 LOG.debug("generateStatistics() - ended"); 375 376 if (processAlreadyRan && beforeDepreciationReport) { 377 throw new IllegalStateException(kualiConfigurationService.getPropertyString(CamsKeyConstants.Depreciation.DEPRECIATION_ALREADY_RAN_MSG)); 378 } 379 LOG.info(CamsConstants.Depreciation.DEPRECIATION_BATCH + "Finished generating statistics for report - " + (beforeDepreciationReport ? "Before part." : "After part")); 380 return reportLine; 381 } 382 383 384 /** 385 * This method returns the number of records found resulting from a join of the organization table and the account table 386 * 387 * @param fiscalYear 388 * @return 389 */ 390 protected Object getCOAsCount() { 391 LOG.debug("DepreciableAssetsDaoOjb.getCOAsCount() - started"); 392 LOG.info(CamsConstants.Depreciation.DEPRECIATION_BATCH + "Getting the number of campus plant fund accounts."); 393 394 Criteria criteria = new Criteria(); 395 Object[] data; 396 ReportQueryByCriteria q = QueryFactory.newReportQuery(Account.class, criteria); 397 q.setAttributes(new String[] { "count(" + KFSPropertyConstants.ORGANIZATION + "." + KFSPropertyConstants.CAMPUS_PLANT_ACCOUNT_NUMBER + ")" }); 398 Iterator<Object> i = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(q); 399 if (!i.hasNext()) { 400 data = new Object[1]; 401 data[0] = new BigDecimal(0); 402 } 403 else { 404 data = (Object[]) i.next(); 405 } 406 407 LOG.debug("DepreciableAssetsDaoOjb.getCOAsCount() - ended"); 408 LOG.info(CamsConstants.Depreciation.DEPRECIATION_BATCH + "Finised getting the number of campus plant fund accounts."); 409 return data[0]; 410 } 411 412 /** 413 * This method the value of the system parameter NON_DEPRECIABLE_FEDERALLY_OWNED_OBJECT_SUB_TYPES 414 * 415 * @return 416 */ 417 protected List<String> getFederallyOwnedObjectSubTypes() { 418 LOG.info(CamsConstants.Depreciation.DEPRECIATION_BATCH + "getting the federally owned object subtype codes."); 419 420 List<String> federallyOwnedObjectSubTypes = new ArrayList<String>(); 421 if (parameterService.parameterExists(KfsParameterConstants.CAPITAL_ASSETS_BATCH.class, CamsConstants.Parameters.NON_DEPRECIABLE_FEDERALLY_OWNED_OBJECT_SUB_TYPES)) { 422 federallyOwnedObjectSubTypes = parameterService.getParameterValues(KfsParameterConstants.CAPITAL_ASSETS_BATCH.class, CamsConstants.Parameters.NON_DEPRECIABLE_FEDERALLY_OWNED_OBJECT_SUB_TYPES); 423 } 424 LOG.info(CamsConstants.Depreciation.DEPRECIATION_BATCH + "Finished getting the federally owned object subtype codes which are:" + federallyOwnedObjectSubTypes.toString()); 425 return federallyOwnedObjectSubTypes; 426 } 427 428 429 /** 430 * @see org.kuali.kfs.module.cam.document.dataaccess.DepreciableAssetsDao#getAssetObjectCodes(java.lang.Integer) 431 */ 432 @CacheNoCopy 433 public Collection<AssetObjectCode> getAssetObjectCodes(Integer fiscalYear) { 434 LOG.debug("DepreciableAssetsDAoOjb.getAssetObjectCodes() - started"); 435 LOG.info(CamsConstants.Depreciation.DEPRECIATION_BATCH + "Getting asset object codes."); 436 437 Collection<AssetObjectCode> assetObjectCodesCollection; 438 HashMap<String, Object> fields = new HashMap<String, Object>(); 439 fields.put(CamsPropertyConstants.AssetObject.UNIVERSITY_FISCAL_YEAR, fiscalYear); 440 fields.put(CamsPropertyConstants.AssetObject.ACTIVE, Boolean.TRUE); 441 assetObjectCodesCollection = (Collection<AssetObjectCode>) businessObjectService.findMatching(AssetObjectCode.class, fields); 442 443 LOG.info(CamsConstants.Depreciation.DEPRECIATION_BATCH + "Finished getting asset object codes - which are:" + assetObjectCodesCollection.toString()); 444 LOG.debug("DepreciableAssetsDAoOjb.getAssetObjectCodes() - ended"); 445 return assetObjectCodesCollection; 446 } 447 448 /** 449 * This method gets a list of Expense object codes from the asset object code table for a particular fiscal year 450 * 451 * @param fiscalYear 452 * @return a List<String> 453 */ 454 @CacheNoCopy 455 protected List<String> getExpenseObjectCodes(Integer fiscalYear) { 456 LOG.debug("DepreciableAssetsDAoOjb.getExpenseObjectCodes() - started"); 457 LOG.info(CamsConstants.Depreciation.DEPRECIATION_BATCH + "Getting expense object codes"); 458 459 List<String> depreExpObjCodes = new ArrayList<String>(); 460 Collection<AssetObjectCode> assetObjectCodesCollection = this.getAssetObjectCodes(fiscalYear); 461 462 // Creating a list of depreciation expense object codes. 463 for (Iterator<AssetObjectCode> iterator = assetObjectCodesCollection.iterator(); iterator.hasNext();) { 464 AssetObjectCode assetObjectCode = iterator.next(); 465 466 String objCode = assetObjectCode.getDepreciationExpenseFinancialObjectCode(); 467 if (objCode != null && !objCode.equals("") && !depreExpObjCodes.contains(objCode)) { 468 depreExpObjCodes.add(objCode); 469 } 470 } 471 LOG.debug("DepreciableAssetsDAoOjb.getExpenseObjectCodes() - ended"); 472 LOG.info(CamsConstants.Depreciation.DEPRECIATION_BATCH + "Finished getting expense object codes which are:" + depreExpObjCodes.toString()); 473 return depreExpObjCodes; 474 } 475 476 /** 477 * This method gets a list of Accumulated Depreciation Object Codes from the asset object code table for a particular fiscal 478 * year. 479 * 480 * @param fiscalYear 481 * @return List<String> 482 */ 483 @CacheNoCopy 484 protected List<String> getAccumulatedDepreciationObjectCodes(Integer fiscalYear) { 485 LOG.debug("DepreciableAssetsDAoOjb.getAccumulatedDepreciationObjectCodes() - started"); 486 LOG.info(CamsConstants.Depreciation.DEPRECIATION_BATCH + "Getting accum depreciation object codes"); 487 488 List<String> accumulatedDepreciationObjCodes = new ArrayList<String>(); 489 Collection<AssetObjectCode> assetObjectCodesCollection = this.getAssetObjectCodes(fiscalYear); 490 491 // Creating a list of depreciation expense object codes. 492 for (Iterator<AssetObjectCode> iterator = assetObjectCodesCollection.iterator(); iterator.hasNext();) { 493 AssetObjectCode assetObjectCode = iterator.next(); 494 495 String objCode = assetObjectCode.getAccumulatedDepreciationFinancialObjectCode(); 496 if (objCode != null && !objCode.equals("") && !accumulatedDepreciationObjCodes.contains(objCode)) { 497 accumulatedDepreciationObjCodes.add(objCode); 498 } 499 } 500 LOG.info(CamsConstants.Depreciation.DEPRECIATION_BATCH + "Finished getting accum depreciation object codes which are:" + accumulatedDepreciationObjCodes.toString()); 501 LOG.debug("DepreciableAssetsDAoOjb.getAccumulatedDepreciationObjectCodes() - ended"); 502 return accumulatedDepreciationObjCodes; 503 } 504 505 /** 506 * This method counts the number of assets that exist in both chart of accounts object code table and capital asset object code 507 * tables 508 * 509 * @param fiscalYear 510 * @return number of object codes found 511 */ 512 protected Object getAssetObjectCodesCount(Integer fiscalYear) { 513 LOG.debug("DepreciableAssetsDAoOjb.getAssetObjectCodesCount() - started"); 514 LOG.info(CamsConstants.Depreciation.DEPRECIATION_BATCH + "Getting asset object code count."); 515 516 Criteria criteria = new Criteria(); 517 criteria.addEqualTo(CamsPropertyConstants.AssetObject.UNIVERSITY_FISCAL_YEAR, fiscalYear); 518 519 ReportQueryByCriteria q = QueryFactory.newReportQuery(AssetObjectCode.class, criteria); 520 q.setAttributes(new String[] { "count(" + KFSPropertyConstants.OBJECT_CODE + "." + KFSPropertyConstants.FINANCIAL_OBJECT_CODE + ")" }); 521 Iterator<Object> i = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(q); 522 Object[] data = (Object[]) i.next(); 523 524 LOG.info(CamsConstants.Depreciation.DEPRECIATION_BATCH + "Finisned getting asset object code count which is: " + data[0]); 525 LOG.debug("DepreciableAssetsDAoOjb.getAssetObjectCodesCount() - ended"); 526 return data[0]; 527 } 528 529 /** 530 * This method converts a variable of type object to BigDecimal or a Long type in order to return a string 531 * 532 * @param fieldValue 533 * @return String 534 */ 535 protected String convertCountValueToString(Object fieldValue) { 536 if (fieldValue == null) 537 return "0.0"; 538 539 if (fieldValue instanceof BigDecimal) { 540 return ((BigDecimal) fieldValue).toString(); 541 } 542 else { 543 return ((Long) fieldValue).toString(); 544 } 545 } 546 547 public void setKualiConfigurationService(KualiConfigurationService kcs) { 548 kualiConfigurationService = kcs; 549 } 550 551 public void setParameterService(ParameterService parameterService) { 552 this.parameterService = parameterService; 553 } 554 555 public void setDateTimeService(DateTimeService dateTimeService) { 556 this.dateTimeService = dateTimeService; 557 } 558 559 public void setOptionsService(OptionsService optionService) { 560 this.optionsService = optionService; 561 } 562 563 public void setBusinessObjectService(BusinessObjectService businessObjectService) { 564 this.businessObjectService = businessObjectService; 565 } 566 567 public void setUniversityDateDao(UniversityDateDao universityDateDao) { 568 this.universityDateDao = universityDateDao; 569 } 570 571 /** 572 * Gets the depreciationBatchDao attribute. 573 * 574 * @return Returns the depreciationBatchDao. 575 */ 576 public DepreciationBatchDao getDepreciationBatchDao() { 577 return depreciationBatchDao; 578 } 579 580 /** 581 * Sets the depreciationBatchDao attribute value. 582 * 583 * @param depreciationBatchDao The depreciationBatchDao to set. 584 */ 585 public void setDepreciationBatchDao(DepreciationBatchDao depreciationBatchDao) { 586 this.depreciationBatchDao = depreciationBatchDao; 587 } 588 } // end of class