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.gl.businessobject; 017 018 import java.math.BigDecimal; 019 import java.sql.Date; 020 import java.util.LinkedHashMap; 021 import java.util.Map; 022 023 import org.kuali.kfs.coa.businessobject.A21SubAccount; 024 import org.kuali.kfs.coa.businessobject.Account; 025 import org.kuali.kfs.coa.businessobject.Chart; 026 import org.kuali.kfs.coa.businessobject.ObjectCode; 027 import org.kuali.kfs.coa.businessobject.SubAccount; 028 import org.kuali.kfs.coa.businessobject.SubObjectCode; 029 import org.kuali.kfs.gl.Constant; 030 import org.kuali.kfs.gl.GeneralLedgerConstants; 031 import org.kuali.kfs.sys.KFSPropertyConstants; 032 import org.kuali.kfs.sys.businessobject.SystemOptions; 033 import org.kuali.rice.kns.bo.PersistableBusinessObjectBase; 034 import org.kuali.rice.kns.util.KualiDecimal; 035 036 /** 037 * Just as Balance is a summarization of Entry, so AccountBalance is a summarization of Balance. 038 * Specifically, it stores the current budget, actual, and encumbrance totals in one record. 039 */ 040 public class AccountBalance extends PersistableBusinessObjectBase { 041 static final long serialVersionUID = 6873573726961704771L; 042 043 private Integer universityFiscalYear; 044 private String chartOfAccountsCode; 045 private String accountNumber; 046 private String subAccountNumber; 047 private String objectCode; 048 private String subObjectCode; 049 private KualiDecimal currentBudgetLineBalanceAmount; 050 private KualiDecimal accountLineActualsBalanceAmount; 051 private KualiDecimal accountLineEncumbranceBalanceAmount; 052 private Date timestamp; 053 054 private Chart chart; 055 private Account account; 056 private SubAccount subAccount; 057 private ObjectCode financialObject; 058 private SubObjectCode financialSubObject; 059 private A21SubAccount a21SubAccount; 060 private TransientBalanceInquiryAttributes dummyBusinessObject; 061 private SystemOptions option; 062 private String title; 063 064 public static final String TYPE_CONSOLIDATION = "Consolidation"; 065 public static final String TYPE_LEVEL = "Level"; 066 public static final String TYPE_OBJECT = "Object"; 067 068 public AccountBalance() { 069 super(); 070 this.dummyBusinessObject = new TransientBalanceInquiryAttributes(); 071 this.financialObject = new ObjectCode(); 072 } 073 074 public AccountBalance(Transaction t) { 075 this(); 076 universityFiscalYear = t.getUniversityFiscalYear(); 077 chartOfAccountsCode = t.getChartOfAccountsCode(); 078 accountNumber = t.getAccountNumber(); 079 subAccountNumber = t.getSubAccountNumber(); 080 objectCode = t.getFinancialObjectCode(); 081 subObjectCode = t.getFinancialSubObjectCode(); 082 currentBudgetLineBalanceAmount = KualiDecimal.ZERO; 083 accountLineActualsBalanceAmount = KualiDecimal.ZERO; 084 accountLineEncumbranceBalanceAmount = KualiDecimal.ZERO; 085 } 086 087 public AccountBalance(String type, Map data, Integer universityFiscalYear, String chartOfAccountsCode, String accountNumber) { 088 this(); 089 090 this.universityFiscalYear = universityFiscalYear; 091 this.chartOfAccountsCode = chartOfAccountsCode; 092 this.accountNumber = accountNumber; 093 subAccountNumber = (String) data.get(GeneralLedgerConstants.ColumnNames.SUB_ACCOUNT_NUMBER); 094 095 currentBudgetLineBalanceAmount = new KualiDecimal((BigDecimal) data.get(GeneralLedgerConstants.ColumnNames.CURRENT_BDLN_BALANCE_AMOUNT)); 096 accountLineActualsBalanceAmount = new KualiDecimal((BigDecimal) data.get(GeneralLedgerConstants.ColumnNames.ACCOUNTING_LINE_ACTUALS_BALANCE_AMOUNT)); 097 accountLineEncumbranceBalanceAmount = new KualiDecimal((BigDecimal) data.get(GeneralLedgerConstants.ColumnNames.ACCOUNTING_LINE_ENCUMBRANCE_BALANCE_AMOUNT)); 098 099 financialObject.getFinancialObjectLevel().setFinancialConsolidationObjectCode((String) data.get(GeneralLedgerConstants.ColumnNames.CONSOLIDATION_OBJECT_CODE)); 100 financialObject.getFinancialObjectLevel().getFinancialConsolidationObject().setFinConsolidationObjectCode((String) data.get(GeneralLedgerConstants.ColumnNames.CONSOLIDATION_OBJECT_CODE)); 101 102 if (TYPE_CONSOLIDATION.equals(type)) { 103 financialObject.getFinancialObjectType().setFinancialReportingSortCode((String) data.get(GeneralLedgerConstants.ColumnNames.REPORT_SORT_CODE)); 104 financialObject.getFinancialObjectLevel().getFinancialConsolidationObject().setFinancialReportingSortCode((String) data.get(GeneralLedgerConstants.ColumnNames.CONSOLIDATION_REPORT_SORT_CODE)); 105 fixVariance(); 106 } 107 else if (TYPE_LEVEL.equals(type)) { 108 financialObject.getFinancialObjectLevel().setFinancialReportingSortCode((String) data.get(GeneralLedgerConstants.ColumnNames.REPORT_SORT_CODE)); 109 financialObject.setFinancialObjectLevelCode((String) data.get(GeneralLedgerConstants.ColumnNames.OBJECT_LEVEL_CODE2)); 110 financialObject.getFinancialObjectLevel().setFinancialObjectLevelCode((String) data.get(GeneralLedgerConstants.ColumnNames.OBJECT_LEVEL_CODE2)); 111 112 // tricking it so getVariance() works 113 financialObject.getFinancialObjectType().setFinancialReportingSortCode(Constant.START_CHAR_OF_REPORTING_SORT_CODE_B); 114 fixVariance(); 115 } 116 else if (TYPE_OBJECT.equals(type)) { 117 objectCode = (String) data.get(GeneralLedgerConstants.ColumnNames.OBJECT_CODE); 118 financialObject.setFinancialObjectLevelCode((String) data.get(GeneralLedgerConstants.ColumnNames.OBJECT_LEVEL_CODE)); 119 financialObject.getFinancialObjectLevel().setFinancialObjectLevelCode((String) data.get(GeneralLedgerConstants.ColumnNames.OBJECT_LEVEL_CODE)); 120 121 // tricking it so getVariance() works 122 financialObject.getFinancialObjectType().setFinancialReportingSortCode(Constant.START_CHAR_OF_REPORTING_SORT_CODE_B); 123 fixVariance(); 124 } 125 else { 126 throw new RuntimeException("Unknown type: " + type); 127 } 128 } 129 130 public AccountBalance(String title) { 131 this(); 132 this.title = title; 133 // financialObject.getFinancialObjectLevel().setFinancialConsolidationObjectCode(title); 134 currentBudgetLineBalanceAmount = KualiDecimal.ZERO; 135 accountLineActualsBalanceAmount = KualiDecimal.ZERO; 136 accountLineEncumbranceBalanceAmount = KualiDecimal.ZERO; 137 } 138 139 /** 140 * Constructs a AccountBalance.java per the primary keys only of the passed in accountBalanceHistory 141 * @param accountBalanceHistory 142 */ 143 public AccountBalance(AccountBalanceHistory accountBalanceHistory) { 144 universityFiscalYear = accountBalanceHistory.getUniversityFiscalYear(); 145 chartOfAccountsCode = accountBalanceHistory.getChartOfAccountsCode(); 146 accountNumber = accountBalanceHistory.getAccountNumber(); 147 subAccountNumber = accountBalanceHistory.getSubAccountNumber(); 148 objectCode = accountBalanceHistory.getObjectCode(); 149 subObjectCode = accountBalanceHistory.getSubObjectCode(); 150 } 151 152 public void fixVariance() { 153 dummyBusinessObject.setGenericAmount(getVariance()); 154 } 155 156 public KualiDecimal getVariance() { 157 158 KualiDecimal variance = KualiDecimal.ZERO; 159 160 // get the reporting sort code 161 String reportingSortCode = financialObject.getFinancialObjectType().getFinancialReportingSortCode(); 162 163 // calculate the variance based on the starting character of reporting sort code 164 if (reportingSortCode.startsWith(Constant.START_CHAR_OF_REPORTING_SORT_CODE_B)) { 165 variance = currentBudgetLineBalanceAmount.subtract(accountLineActualsBalanceAmount); 166 variance = variance.subtract(accountLineEncumbranceBalanceAmount); 167 } 168 else { 169 variance = accountLineActualsBalanceAmount.subtract(currentBudgetLineBalanceAmount); 170 } 171 return variance; 172 } 173 174 public void add(AccountBalance ab) { 175 currentBudgetLineBalanceAmount = currentBudgetLineBalanceAmount.add(ab.currentBudgetLineBalanceAmount); 176 accountLineActualsBalanceAmount = accountLineActualsBalanceAmount.add(ab.accountLineActualsBalanceAmount); 177 accountLineEncumbranceBalanceAmount = accountLineEncumbranceBalanceAmount.add(ab.accountLineEncumbranceBalanceAmount); 178 } 179 180 /* 181 * (non-Javadoc) 182 * 183 * @see org.kuali.rice.kns.bo.BusinessObjectBase#toStringMapper() 184 */ 185 protected LinkedHashMap toStringMapper() { 186 187 LinkedHashMap map = new LinkedHashMap(); 188 map.put(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, getUniversityFiscalYear()); 189 map.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, getChartOfAccountsCode()); 190 map.put(KFSPropertyConstants.ACCOUNT_NUMBER, getAccountNumber()); 191 map.put(KFSPropertyConstants.SUB_ACCOUNT_NUMBER, getSubAccountNumber()); 192 map.put(KFSPropertyConstants.OBJECT_CODE, getObjectCode()); 193 map.put(KFSPropertyConstants.SUB_OBJECT_CODE, getSubObjectCode()); 194 return map; 195 } 196 197 public String getTitle() { 198 return title; 199 } 200 201 public A21SubAccount getA21SubAccount() { 202 return a21SubAccount; 203 } 204 205 public void setA21SubAccount(A21SubAccount subAccount) { 206 a21SubAccount = subAccount; 207 } 208 209 public SystemOptions getOption() { 210 return option; 211 } 212 213 public void setOption(SystemOptions option) { 214 this.option = option; 215 } 216 217 public KualiDecimal getAccountLineActualsBalanceAmount() { 218 return accountLineActualsBalanceAmount; 219 } 220 221 public void setAccountLineActualsBalanceAmount(KualiDecimal accountLineActualsBalanceAmount) { 222 this.accountLineActualsBalanceAmount = accountLineActualsBalanceAmount; 223 } 224 225 public KualiDecimal getAccountLineEncumbranceBalanceAmount() { 226 return accountLineEncumbranceBalanceAmount; 227 } 228 229 public void setAccountLineEncumbranceBalanceAmount(KualiDecimal accountLineEncumbranceBalanceAmount) { 230 this.accountLineEncumbranceBalanceAmount = accountLineEncumbranceBalanceAmount; 231 } 232 233 public String getAccountNumber() { 234 return accountNumber; 235 } 236 237 public void setAccountNumber(String accountNumber) { 238 this.accountNumber = accountNumber; 239 } 240 241 public String getChartOfAccountsCode() { 242 return chartOfAccountsCode; 243 } 244 245 public void setChartOfAccountsCode(String chartOfAccountsCode) { 246 this.chartOfAccountsCode = chartOfAccountsCode; 247 } 248 249 public KualiDecimal getCurrentBudgetLineBalanceAmount() { 250 return currentBudgetLineBalanceAmount; 251 } 252 253 public void setCurrentBudgetLineBalanceAmount(KualiDecimal currentBudgetLineBalanceAmount) { 254 this.currentBudgetLineBalanceAmount = currentBudgetLineBalanceAmount; 255 } 256 257 public String getObjectCode() { 258 return objectCode; 259 } 260 261 public void setObjectCode(String objectCode) { 262 this.objectCode = objectCode; 263 } 264 265 public String getSubAccountNumber() { 266 return subAccountNumber; 267 } 268 269 public void setSubAccountNumber(String subAccountNumber) { 270 this.subAccountNumber = subAccountNumber; 271 } 272 273 public String getSubObjectCode() { 274 return subObjectCode; 275 } 276 277 public void setSubObjectCode(String subObjectCode) { 278 this.subObjectCode = subObjectCode; 279 } 280 281 public Date getTimestamp() { 282 return timestamp; 283 } 284 285 public void setTimestamp(Date timestamp) { 286 this.timestamp = timestamp; 287 } 288 289 public Integer getUniversityFiscalYear() { 290 return universityFiscalYear; 291 } 292 293 public void setUniversityFiscalYear(Integer universityFiscalYear) { 294 this.universityFiscalYear = universityFiscalYear; 295 } 296 297 /** 298 * Gets the account attribute. 299 * 300 * @return Returns the account. 301 */ 302 public Account getAccount() { 303 return account; 304 } 305 306 /** 307 * Sets the account attribute value. 308 * 309 * @param account The account to set. 310 */ 311 public void setAccount(Account account) { 312 this.account = account; 313 } 314 315 /** 316 * Gets the chart attribute. 317 * 318 * @return Returns the chart. 319 */ 320 public Chart getChart() { 321 return chart; 322 } 323 324 /** 325 * Sets the chart attribute value. 326 * 327 * @param chart The chart to set. 328 */ 329 public void setChart(Chart chart) { 330 this.chart = chart; 331 } 332 333 /** 334 * Gets the financialObject attribute. 335 * 336 * @return Returns the financialObject. 337 */ 338 public ObjectCode getFinancialObject() { 339 return financialObject; 340 } 341 342 /** 343 * Sets the financialObject attribute value. 344 * 345 * @param financialObject The financialObject to set. 346 */ 347 public void setFinancialObject(ObjectCode financialObject) { 348 this.financialObject = financialObject; 349 } 350 351 /** 352 * Gets the dummyBusinessObject attribute. 353 * 354 * @return Returns the dummyBusinessObject. 355 */ 356 public TransientBalanceInquiryAttributes getDummyBusinessObject() { 357 return dummyBusinessObject; 358 } 359 360 /** 361 * Sets the dummyBusinessObject attribute value. 362 * 363 * @param dummyBusinessObject The dummyBusinessObject to set. 364 */ 365 public void setDummyBusinessObject(TransientBalanceInquiryAttributes dummyBusinessObject) { 366 this.dummyBusinessObject = dummyBusinessObject; 367 } 368 369 /** 370 * Gets the subAccount attribute. 371 * 372 * @return Returns the subAccount. 373 */ 374 public SubAccount getSubAccount() { 375 return subAccount; 376 } 377 378 /** 379 * Sets the subAccount attribute value. 380 * 381 * @param subAccount The subAccount to set. 382 */ 383 public void setSubAccount(SubAccount subAccount) { 384 this.subAccount = subAccount; 385 } 386 387 /** 388 * Gets the subObject 389 * 390 * @return 391 */ 392 public SubObjectCode getFinancialSubObject() { 393 return financialSubObject; 394 } 395 396 /** 397 * Sets the subObject. 398 * 399 * @param financialSubObject 400 */ 401 public void setFinancialSubObject(SubObjectCode financialSubObject) { 402 this.financialSubObject = financialSubObject; 403 } 404 405 }