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 org.kuali.kfs.sys.KFSConstants;
019    import org.kuali.rice.kns.util.KualiDecimal;
020    
021    /**
022     * A representation of LedgerEntries, which are summaries that show up on Ledger Reports created by the scrubber and poster.
023     */
024    public class LedgerEntry {
025    
026        private String balanceType;
027        private String originCode;
028        private Integer fiscalYear;
029        private String period;
030        private int recordCount;
031        private KualiDecimal debitAmount;
032        private int debitCount;
033        private KualiDecimal creditAmount;
034        private int creditCount;
035        private KualiDecimal noDCAmount;
036        private int noDCCount;
037    
038        /**
039         * Constructs a LedgerEntry.java.
040         */
041        public LedgerEntry() {
042            this(null, null, null, null);
043        }
044    
045        /**
046         * Constructs a LedgerEntry.java.
047         * 
048         * @param fiscalYear
049         * @param period
050         * @param balanceType
051         * @param originCode
052         */
053        public LedgerEntry(Integer fiscalYear, String period, String balanceType, String originCode) {
054            this.fiscalYear = fiscalYear;
055            this.period = period;
056            this.balanceType = balanceType;
057            this.originCode = originCode;
058    
059            this.creditAmount = KualiDecimal.ZERO;
060            this.debitAmount = KualiDecimal.ZERO;
061            this.noDCAmount = KualiDecimal.ZERO;
062        }
063        
064        /**
065         * Constructs a LedgerEntry.java.
066         * 
067         * @param fiscalYear
068         * @param period
069         * @param balanceType
070         * @param originCode
071         * @param debitCreditCode
072         * @param amount
073         * @param count
074         */
075        public LedgerEntry(Integer fiscalYear, String period, String balanceType, String originCode, String debitCreditCode, KualiDecimal amount, int count) {
076            this.fiscalYear = fiscalYear;
077            this.period = period;
078            this.balanceType = balanceType;
079            this.originCode = originCode;
080    
081            if (KFSConstants.GL_CREDIT_CODE.equals(debitCreditCode)) {
082                this.creditAmount = amount;
083                this.creditCount = count;
084            }
085            else if (KFSConstants.GL_DEBIT_CODE.equals(debitCreditCode)) {
086                this.debitAmount = amount;
087                this.debitCount = count;
088            }
089            else {
090                this.noDCAmount = amount;
091                this.noDCCount = count;
092            }
093            
094            this.recordCount = count;
095        }
096    
097        /**
098         * Add the amounts of the given ledger entry into those of current ledger entry, and update the counts of corresponding fields
099         * 
100         * @param addend the given ledger entry to be added into current one
101         */
102        public void add(LedgerEntry addend) {
103            this.creditAmount = this.creditAmount.add(addend.getCreditAmount());
104            this.creditCount += addend.getCreditCount();
105    
106            this.debitAmount = this.debitAmount.add(addend.getDebitAmount());
107            this.debitCount += addend.getDebitCount();
108    
109            this.noDCAmount = this.noDCAmount.add(addend.getNoDCAmount());
110            this.noDCCount += addend.getNoDCCount();
111    
112            this.recordCount = this.creditCount + this.debitCount + this.noDCCount;
113        }
114    
115        /**
116         * create or update a ledger entry with the array of information from the given entry summary object
117         * 
118         * @param entrySummary an entry summary to turn into a ledger entry
119         * @return a LedgerEntry created from the entrySummary array
120         */
121        public static LedgerEntry buildLedgerEntry(Object[] entrySummary) {
122            // extract the data from an array and use them to populate a ledger entry
123            Object oFiscalYear = entrySummary[0];
124            Object oPeriodCode = entrySummary[1];
125            Object oBalanceType = entrySummary[2];
126            Object oOriginCode = entrySummary[3];
127            Object oDebitCreditCode = entrySummary[4];
128            Object oAmount = entrySummary[5];
129            Object oCount = entrySummary[6];
130    
131            Integer fiscalYear = oFiscalYear != null ? new Integer(oFiscalYear.toString()) : null;
132            String periodCode = oPeriodCode != null ? oPeriodCode.toString() : "  ";
133            String balanceType = oBalanceType != null ? oBalanceType.toString() : "  ";
134            String originCode = oOriginCode != null ? oOriginCode.toString() : "  ";
135            String debitCreditCode = oDebitCreditCode != null ? oDebitCreditCode.toString() : " ";
136            KualiDecimal amount = oAmount != null ? new KualiDecimal(oAmount.toString()) : KualiDecimal.ZERO;
137            int count = oCount != null ? Integer.parseInt(oCount.toString()) : 0;
138    
139            // construct a ledger entry with the information fetched from the given array
140            LedgerEntry ledgerEntry = new LedgerEntry(fiscalYear, periodCode, balanceType, originCode);
141            if (KFSConstants.GL_CREDIT_CODE.equals(debitCreditCode)) {
142                ledgerEntry.setCreditAmount(amount);
143                ledgerEntry.setCreditCount(count);
144            }
145            else if (KFSConstants.GL_DEBIT_CODE.equals(debitCreditCode)) {
146                ledgerEntry.setDebitAmount(amount);
147                ledgerEntry.setDebitCount(count);
148            }
149            else {
150                ledgerEntry.setNoDCAmount(amount);
151                ledgerEntry.setNoDCCount(count);
152            }
153            ledgerEntry.setRecordCount(count);
154    
155            return ledgerEntry;
156        }
157    
158        /**
159         * Gets the balanceType attribute.
160         * 
161         * @return Returns the balanceType.
162         */
163        public String getBalanceType() {
164            return balanceType;
165        }
166    
167        /**
168         * Sets the balanceType attribute value.
169         * 
170         * @param balanceType The balanceType to set.
171         */
172        public void setBalanceType(String balanceType) {
173            this.balanceType = balanceType;
174        }
175    
176        /**
177         * Gets the creditAmount attribute.
178         * 
179         * @return Returns the creditAmount.
180         */
181        public KualiDecimal getCreditAmount() {
182            return creditAmount;
183        }
184    
185        /**
186         * Sets the creditAmount attribute value.
187         * 
188         * @param creditAmount The creditAmount to set.
189         */
190        public void setCreditAmount(KualiDecimal creditAmount) {
191            this.creditAmount = creditAmount;
192        }
193    
194        /**
195         * Gets the creditCount attribute.
196         * 
197         * @return Returns the creditCount.
198         */
199        public int getCreditCount() {
200            return creditCount;
201        }
202    
203        /**
204         * Sets the creditCount attribute value.
205         * 
206         * @param creditCount The creditCount to set.
207         */
208        public void setCreditCount(int creditCount) {
209            this.creditCount = creditCount;
210        }
211    
212        /**
213         * Gets the debitAmount attribute.
214         * 
215         * @return Returns the debitAmount.
216         */
217        public KualiDecimal getDebitAmount() {
218            return debitAmount;
219        }
220    
221        /**
222         * Sets the debitAmount attribute value.
223         * 
224         * @param debitAmount The debitAmount to set.
225         */
226        public void setDebitAmount(KualiDecimal debitAmount) {
227            this.debitAmount = debitAmount;
228        }
229    
230        /**
231         * Gets the debitCount attribute.
232         * 
233         * @return Returns the debitCount.
234         */
235        public int getDebitCount() {
236            return debitCount;
237        }
238    
239        /**
240         * Sets the debitCount attribute value.
241         * 
242         * @param debitCount The debitCount to set.
243         */
244        public void setDebitCount(int debitCount) {
245            this.debitCount = debitCount;
246        }
247    
248        /**
249         * Gets the fiscalYear attribute.
250         * 
251         * @return Returns the fiscalYear.
252         */
253        public Integer getFiscalYear() {
254            return fiscalYear;
255        }
256    
257        /**
258         * Sets the fiscalYear attribute value.
259         * 
260         * @param fiscalYear The fiscalYear to set.
261         */
262        public void setFiscalYear(Integer fiscalYear) {
263            this.fiscalYear = fiscalYear;
264        }
265    
266        /**
267         * Gets the noDCAmount attribute.
268         * 
269         * @return Returns the noDCAmount.
270         */
271        public KualiDecimal getNoDCAmount() {
272            return noDCAmount;
273        }
274    
275        /**
276         * Sets the noDCAmount attribute value.
277         * 
278         * @param noDCAmount The noDCAmount to set.
279         */
280        public void setNoDCAmount(KualiDecimal noDCAmount) {
281            this.noDCAmount = noDCAmount;
282        }
283    
284        /**
285         * Gets the noDCCount attribute.
286         * 
287         * @return Returns the noDCCount.
288         */
289        public int getNoDCCount() {
290            return noDCCount;
291        }
292    
293        /**
294         * Sets the noDCCount attribute value.
295         * 
296         * @param noDCCount The noDCCount to set.
297         */
298        public void setNoDCCount(int noDCCount) {
299            this.noDCCount = noDCCount;
300        }
301    
302        /**
303         * Gets the originCode attribute.
304         * 
305         * @return Returns the originCode.
306         */
307        public String getOriginCode() {
308            return originCode;
309        }
310    
311        /**
312         * Sets the originCode attribute value.
313         * 
314         * @param originCode The originCode to set.
315         */
316        public void setOriginCode(String originCode) {
317            this.originCode = originCode;
318        }
319    
320        /**
321         * Gets the period attribute.
322         * 
323         * @return Returns the period.
324         */
325        public String getPeriod() {
326            return period;
327        }
328    
329        /**
330         * Sets the period attribute value.
331         * 
332         * @param period The period to set.
333         */
334        public void setPeriod(String period) {
335            this.period = period;
336        }
337    
338        /**
339         * Gets the recordCount attribute.
340         * 
341         * @return Returns the recordCount.
342         */
343        public int getRecordCount() {
344            return recordCount;
345        }
346    
347        /**
348         * Sets the recordCount attribute value.
349         * 
350         * @param recordCount The recordCount to set.
351         */
352        public void setRecordCount(int recordCount) {
353            this.recordCount = recordCount;
354        }
355    
356        /**
357         * @see java.lang.Object#toString()
358         */
359        public String toString() {
360            StringBuffer ledgerEntryDescription = new StringBuffer();
361    
362            ledgerEntryDescription.append(fiscalYear + "\t");
363            ledgerEntryDescription.append(period + "\t");
364            ledgerEntryDescription.append(balanceType + "\t");
365            ledgerEntryDescription.append(originCode + "\t");
366            ledgerEntryDescription.append(recordCount + "\t");
367    
368            ledgerEntryDescription.append(debitAmount + "\t\t");
369            ledgerEntryDescription.append(debitCount + "\t");
370    
371            ledgerEntryDescription.append(creditAmount + "\t\t");
372            ledgerEntryDescription.append(creditCount + "\t");
373    
374            ledgerEntryDescription.append(noDCAmount + "\t\t");
375            ledgerEntryDescription.append(noDCCount + "\t");
376    
377            return ledgerEntryDescription.toString();
378        }
379    }