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.util.HashMap;
019    import java.util.Map;
020    
021    import org.apache.commons.lang.StringUtils;
022    
023    /**
024     * A collection of many LedgerEntry records, which appropriately groups the records
025     */
026    public class LedgerEntryHolder {
027        private Map ledgerEntries;
028        private Map subtotals;
029        private LedgerEntryForReporting grandTotal;
030    
031        private static final String GRAND_TOTAL = "Grand Total";
032        private static final String SUB_TOTAL = "Subtotal";
033    
034        /**
035         * Constructs a LedgerEntryHolder.java.
036         */
037        public LedgerEntryHolder() {
038            ledgerEntries = new HashMap();
039            subtotals = new HashMap();
040            grandTotal = new LedgerEntryForReporting(null, null, null, GRAND_TOTAL);
041        }
042    
043        /**
044         * add a given ledger entry into the holder. If there exists a ledger entry with the same key, then update the amount and count
045         * fields of the ledger entry; otherwise, insert it into the holder.
046         * 
047         * @param newLedgerEntry the given ledger entry
048         * @param calculateTotals indicate if the subtotals and grand total need to be calculated
049         */
050        public void insertLedgerEntry(LedgerEntryForReporting newLedgerEntry, boolean calculateTotal) {
051            Integer fiscalYear = newLedgerEntry.getFiscalYear();
052            String periodCode = newLedgerEntry.getPeriod();
053    
054            String balanceType = newLedgerEntry.getBalanceType();
055            String originCode = newLedgerEntry.getOriginCode();
056    
057            String keyOfLedgerEntry = balanceType + "-" + originCode + "-" + fiscalYear + "-" + periodCode;
058    
059            if (!ledgerEntries.containsKey(keyOfLedgerEntry)) {
060                ledgerEntries.put(keyOfLedgerEntry, newLedgerEntry);
061            }
062            else {
063                LedgerEntryForReporting ledgerEntry = (LedgerEntryForReporting) ledgerEntries.get(keyOfLedgerEntry);
064                ledgerEntry.add(newLedgerEntry);
065            }
066    
067            // calculate the subtotals and grand total
068            if (calculateTotal) {
069                updateSubtotal(newLedgerEntry);
070                updateGrandTotal(newLedgerEntry);
071            }
072        }
073    
074        /**
075         * update the subtotal using the given ledger entry
076         * 
077         * @param newLedgerEntry a new ledger entry to add to the holder
078         */
079        private void updateSubtotal(LedgerEntryForReporting newLedgerEntry) {
080            String groupingKey = newLedgerEntry.getBalanceType();
081    
082            if (StringUtils.isBlank(groupingKey)) {
083                return;
084            }
085    
086            LedgerEntryForReporting ledgerEntry = null;
087            if (!subtotals.containsKey(groupingKey)) {
088                ledgerEntry = new LedgerEntryForReporting(null, "", newLedgerEntry.getBalanceType(), SUB_TOTAL);
089                subtotals.put(groupingKey, ledgerEntry);
090            }
091            else {
092                ledgerEntry = (LedgerEntryForReporting) subtotals.get(groupingKey);
093            }
094            ledgerEntry.add(newLedgerEntry);
095        }
096    
097        /**
098         * update the grand total with the given ledger entry
099         * 
100         * @param newLedgerEntry entry to help update the grand total
101         */
102        private void updateGrandTotal(LedgerEntryForReporting newLedgerEntry) {
103            this.grandTotal.add(newLedgerEntry);
104        }
105    
106        /**
107         * Gets the grandTotal attribute.
108         * 
109         * @return Returns the grandTotal.
110         */
111        public LedgerEntryForReporting getGrandTotal() {
112            return grandTotal;
113        }
114    
115        /**
116         * Gets the ledgerEntries attribute.
117         * 
118         * @return Returns the ledgerEntries.
119         */
120        public Map getLedgerEntries() {
121            return ledgerEntries;
122        }
123    
124        /**
125         * Gets the subtotals attribute.
126         * 
127         * @return Returns the subtotals.
128         */
129        public Map getSubtotals() {
130            return subtotals;
131        }
132    }