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 }