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    }