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 }