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.module.endow.report.util;
017    
018    import java.math.BigDecimal;
019    import java.util.Collection;
020    import java.util.Iterator;
021    import java.util.TreeMap;
022    
023    import org.kuali.kfs.module.endow.EndowConstants.IncomePrincipalIndicator;
024    import org.kuali.kfs.module.endow.businessobject.Security;
025    import org.kuali.kfs.module.endow.businessobject.SecurityReportingGroup;
026    
027    
028    public class AssetStatementReportDataHolder {
029    
030        // header
031        private String institution;
032        private String monthEndDate;
033        private String endingDate;
034        private String kemid;
035        private String kemidLongTitle;
036    
037        // body
038        private BigDecimal historyIncomeCash; // 1i
039        private BigDecimal historyPrincipalCash; // 1p
040    
041        // Map<report group order, Map<securityId, ReportGroupData>>
042        private TreeMap<Integer, TreeMap<String, ReportGroupData>> reportGroupsForIncome; // 2,3,4,5,6,7 for income
043        private TreeMap<Integer, TreeMap<String, ReportGroupData>> reportGroupsForPrincipal; // 2,3,4,5,6,7 for principal
044    
045        // footer
046        private EndowmentReportFooterDataHolder footer;
047    
048        public AssetStatementReportDataHolder() {
049            reportGroupsForIncome = new TreeMap<Integer, TreeMap<String, ReportGroupData>>();
050            reportGroupsForPrincipal = new TreeMap<Integer, TreeMap<String, ReportGroupData>>();
051            historyIncomeCash = BigDecimal.ZERO;
052            historyPrincipalCash = BigDecimal.ZERO;
053            footer = null;
054        }
055    
056        /**
057         * Creates a report group data and registers it
058         * 
059         * @param reportingGroup
060         * @param security
061         * @param ipInd
062         * @return
063         */
064        public ReportGroupData createReportGroupData(SecurityReportingGroup reportingGroup, Security security, String ipInd) {
065    
066            Integer reportGroupOrder = reportingGroup.getSecurityReportingGrpOrder();
067            String securityId = security.getId();
068    
069            // create a new report group data
070            ReportGroupData rgd = new ReportGroupData();
071            rgd.setSecurityId(securityId);
072            rgd.setSecurityDesc(security.getDescription());
073            rgd.setReportGroupOrder(reportGroupOrder);
074            rgd.setReportGroupDesc(reportingGroup.getName());
075            
076            if (ipInd.equalsIgnoreCase(IncomePrincipalIndicator.INCOME)) {
077                if (reportGroupsForIncome.containsKey(reportGroupOrder)) {
078                    TreeMap<String, ReportGroupData> dataBySecurityId = reportGroupsForIncome.get(reportGroupOrder);
079                    // assume that the same securityId does not exist
080                    dataBySecurityId.put(securityId, rgd);
081                } else {
082                    TreeMap<String, ReportGroupData> dataBySecurityId = new TreeMap<String, ReportGroupData>();
083                    dataBySecurityId.put(securityId, rgd);
084                    reportGroupsForIncome.put(reportGroupOrder, dataBySecurityId);
085                }
086            } else {
087                if (reportGroupsForPrincipal.containsKey(reportGroupOrder)) {
088                    TreeMap<String, ReportGroupData> dataBySecurityId = reportGroupsForPrincipal.get(reportGroupOrder);
089                    dataBySecurityId.put(securityId, rgd);
090                } else {
091                    TreeMap<String, ReportGroupData> dataBySecurityId = new TreeMap<String, ReportGroupData>();
092                    dataBySecurityId.put(securityId, rgd);
093                    reportGroupsForPrincipal.put(reportGroupOrder, dataBySecurityId);
094                }
095            }
096    
097            return rgd;
098        }
099           
100        /**
101         * Calculates the sum of units
102         * 
103         * @param ipInd
104         * @return
105         */
106        public BigDecimal getTotalSumOfUnits(String ipInd) {
107            
108            BigDecimal total = BigDecimal.ZERO;
109            Collection<TreeMap<String, ReportGroupData>> reportGroupMap;
110            if (IncomePrincipalIndicator.INCOME.equalsIgnoreCase(ipInd) && reportGroupsForIncome != null) {
111                reportGroupMap = reportGroupsForIncome.values();
112            } else {
113                reportGroupMap = reportGroupsForPrincipal.values();
114            }
115            for (TreeMap<String, ReportGroupData> reportGroup : reportGroupMap) {
116                Iterator<ReportGroupData> iter = reportGroup.values().iterator();
117                while (iter.hasNext()) {
118                    total = total.add(iter.next().getSumOfUnits());
119                }
120            }
121            
122            return total;
123        }
124    
125        /**
126         * Calculates the sum of market values for cash and equivalents
127         * 
128         * @param ipInd
129         * @return
130         */
131        public BigDecimal getTotalMarketValueForCashEquivalents(String ipInd) {
132            return getTotalSumOfMarketValue(ipInd, new Integer(1));
133        }
134    
135        /**
136         * Calculates the sum of market values
137         * 
138         * @param ipInd
139         * @param reportGroupOrder
140         * @return
141         */
142        public BigDecimal getTotalSumOfMarketValue(String ipInd, Integer reportGroupOrder) {
143            
144            BigDecimal total = BigDecimal.ZERO;
145            TreeMap<String, ReportGroupData> reportGroupMap;
146            if (IncomePrincipalIndicator.INCOME.equalsIgnoreCase(ipInd) && reportGroupsForIncome != null) {
147                reportGroupMap = reportGroupsForIncome.get(reportGroupOrder);
148            } else {
149                reportGroupMap = reportGroupsForPrincipal.get(reportGroupOrder);
150            }
151            if (reportGroupMap != null && !reportGroupMap.isEmpty()) {
152                Iterator<ReportGroupData> iter = reportGroupMap.values().iterator();
153                while (iter.hasNext()) {
154                    total = total.add(iter.next().getSumOfMarketValue());
155                }
156            }
157            
158            return total;
159        }
160        
161        /**
162         * Calculates the sum of market values
163         * 
164         * @param ipInd
165         * @return
166         */
167        public BigDecimal getTotalSumOfMarketValue(String ipInd) {
168            
169            BigDecimal total = BigDecimal.ZERO;
170            Collection<TreeMap<String, ReportGroupData>> reportGroupMap;
171            if (IncomePrincipalIndicator.INCOME.equalsIgnoreCase(ipInd) && reportGroupsForIncome != null) {
172                reportGroupMap = reportGroupsForIncome.values();
173            } else {
174                reportGroupMap = reportGroupsForPrincipal.values();
175            }
176            for (TreeMap<String, ReportGroupData> reportGroup : reportGroupMap) {
177                Iterator<ReportGroupData> iter = reportGroup.values().iterator();
178                while (iter.hasNext()) {
179                    total = total.add(iter.next().getSumOfMarketValue());
180                }
181            }
182            
183            return total;
184        }
185        
186        /**
187         * Calculates the sum of estimated income
188         * 
189         * @param ipInd
190         * @return
191         */
192        public BigDecimal getTotalSumOfEstimatedIncome(String ipInd) {
193    
194            BigDecimal total = BigDecimal.ZERO;
195            Collection<TreeMap<String, ReportGroupData>> reportGroupMap;
196            if (IncomePrincipalIndicator.INCOME.equalsIgnoreCase(ipInd) && reportGroupsForIncome != null) {
197                reportGroupMap = reportGroupsForIncome.values();
198            } else {
199                reportGroupMap = reportGroupsForPrincipal.values();
200            }
201            for (TreeMap<String, ReportGroupData> reportGroup : reportGroupMap) {
202                Iterator<ReportGroupData> iter = reportGroup.values().iterator();
203                while (iter.hasNext()) {
204                    total = total.add(iter.next().getSumOfEstimatedIncome());
205                }
206            }
207            
208            return total;       
209         }
210        
211        /**
212         * Calculates the sum of remainder of FY estimated income
213         * 
214         * @param ipInd
215         * @return
216         */
217        public BigDecimal getTotalSumOfRemainderOfFYEstimated(String ipInd) {
218            
219            BigDecimal total = BigDecimal.ZERO;
220            Collection<TreeMap<String, ReportGroupData>> reportGroupMap;
221            if (IncomePrincipalIndicator.INCOME.equalsIgnoreCase(ipInd) && reportGroupsForIncome != null) {
222                reportGroupMap = reportGroupsForIncome.values();
223            } else {
224                reportGroupMap = reportGroupsForPrincipal.values();
225            }
226            for (TreeMap<String, ReportGroupData> reportGroup : reportGroupMap) {
227                Iterator<ReportGroupData> iter = reportGroup.values().iterator();
228                while (iter.hasNext()) {
229                    total = total.add(iter.next().getSumOfRemainderOfFYEstimated());
230                }
231            }
232            
233            return total;
234        }
235        
236        /**
237         * Calculates the sum of next FY estimated income
238         * 
239         * @param ipInd
240         * @return
241         */
242        public BigDecimal getTotalSumOfNextFYEstimatedIncome(String ipInd) {
243            
244            BigDecimal total = BigDecimal.ZERO;
245            Collection<TreeMap<String, ReportGroupData>> reportGroupMap;
246            if (IncomePrincipalIndicator.INCOME.equalsIgnoreCase(ipInd) && reportGroupsForIncome != null) {
247                reportGroupMap = reportGroupsForIncome.values();
248            } else {
249                reportGroupMap = reportGroupsForPrincipal.values();
250            }
251            for (TreeMap<String, ReportGroupData> reportGroup : reportGroupMap) {
252                Iterator<ReportGroupData> iter = reportGroup.values().iterator();
253                while (iter.hasNext()) {
254                    total = total.add(iter.next().getSumOfNextFYEstimatedIncome());
255                }
256            }
257            
258            return total;
259        }
260    
261        /**
262         * Report group data holder 
263         */
264        public class ReportGroupData {
265            private Integer reportGroupOrder;
266            private String reportGroupDesc;
267            private String securityId;
268            private String securityDesc;
269            private BigDecimal sumOfUnits;
270            private BigDecimal sumOfMarketValue;
271            private BigDecimal sumOfEstimatedIncome;
272            private BigDecimal sumOfRemainderOfFYEstimated;
273            private BigDecimal sumOfNextFYEstimatedIncome;
274    
275            public ReportGroupData() {
276                sumOfUnits = BigDecimal.ZERO;
277                sumOfMarketValue = BigDecimal.ZERO;
278                sumOfEstimatedIncome = BigDecimal.ZERO;
279                sumOfRemainderOfFYEstimated = BigDecimal.ZERO;
280                sumOfNextFYEstimatedIncome = BigDecimal.ZERO;
281            }
282    
283            public Integer getReportGroupOrder() {
284                return reportGroupOrder;
285            }
286    
287            public void setReportGroupOrder(Integer reportGroupOrder) {
288                this.reportGroupOrder = reportGroupOrder;
289            }
290    
291            public String getReportGroupDesc() {
292                return reportGroupDesc;
293            }
294    
295            public void setReportGroupDesc(String reportGroupDesc) {
296                this.reportGroupDesc = reportGroupDesc;
297            }
298    
299            public String getSecurityId() {
300                return securityId;
301            }
302    
303            public void setSecurityId(String securityId) {
304                this.securityId = securityId;
305            }
306    
307            public String getSecurityDesc() {
308                return securityDesc;
309            }
310    
311            public void setSecurityDesc(String securityDesc) {
312                this.securityDesc = securityDesc;
313            }
314    
315            public BigDecimal getSumOfUnits() {
316                return sumOfUnits;
317            }
318    
319            public void addSumOfUnits(BigDecimal sumOfUnits) {
320                this.sumOfUnits = this.sumOfUnits.add(sumOfUnits);
321            }
322    
323            public BigDecimal getSumOfMarketValue() {
324                return sumOfMarketValue;
325            }
326    
327            public void addSumOfMarketValue(BigDecimal sumOfMarketValue) {
328                this.sumOfMarketValue = this.sumOfMarketValue.add(sumOfMarketValue);
329            }
330    
331            public BigDecimal getSumOfEstimatedIncome() {
332                return sumOfEstimatedIncome;
333            }
334    
335            public void addSumOfEstimatedIncome(BigDecimal sumOfEstimatedIncome) {
336                this.sumOfEstimatedIncome = this.sumOfEstimatedIncome.add(sumOfEstimatedIncome);
337            }
338    
339            public BigDecimal getSumOfRemainderOfFYEstimated() {
340                return sumOfRemainderOfFYEstimated;
341            }
342    
343            public void addSumOfRemainderOfFYEstimated(BigDecimal sumOfRemainderOfFYEstimated) {
344                this.sumOfRemainderOfFYEstimated = this.sumOfRemainderOfFYEstimated.add(sumOfRemainderOfFYEstimated);
345            }
346    
347            public BigDecimal getSumOfNextFYEstimatedIncome() {
348                return sumOfNextFYEstimatedIncome;
349            }
350    
351            public void addSumOfNextFYEstimatedIncome(BigDecimal sumOfNextFYEstimatedIncome) {
352                this.sumOfNextFYEstimatedIncome = this.sumOfNextFYEstimatedIncome.add(sumOfNextFYEstimatedIncome);
353            }
354        }
355    
356        public String getInstitution() {
357            return institution;
358        }
359    
360        public void setInstitution(String institution) {
361            this.institution = institution;
362        }
363    
364        public String getMonthEndDate() {
365            return monthEndDate;
366        }
367    
368        public void setMonthEndDate(String monthEndDate) {
369            this.monthEndDate = monthEndDate;
370        }
371    
372        public String getEndingDate() {
373            return endingDate;
374        }
375    
376        public void setEndingDate(String endingDate) {
377            this.endingDate = endingDate;
378        }
379    
380        public String getKemid() {
381            return kemid;
382        }
383    
384        public void setKemid(String kemid) {
385            this.kemid = kemid;
386        }
387    
388        public String getKemidLongTitle() {
389            return kemidLongTitle;
390        }
391    
392        public void setKemidLongTitle(String kemidLongTitle) {
393            this.kemidLongTitle = kemidLongTitle;
394        }
395    
396        public BigDecimal getHistoryIncomeCash() {
397            return historyIncomeCash;
398        }
399    
400        public void setHistoryIncomeCash(BigDecimal historyIncomeCash) {
401            this.historyIncomeCash = historyIncomeCash;
402        }
403    
404        public BigDecimal getHistoryPrincipalCash() {
405            return historyPrincipalCash;
406        }
407    
408        public void setHistoryPrincipalCash(BigDecimal historyPrincipalCash) {
409            this.historyPrincipalCash = historyPrincipalCash;
410        }
411    
412        public TreeMap<Integer, TreeMap<String, ReportGroupData>> getReportGroupsForIncome() {
413            return reportGroupsForIncome;
414        }
415    
416        public void setReportGroupsForIncome(TreeMap<Integer, TreeMap<String, ReportGroupData>> reportGroupsForIncome) {
417            this.reportGroupsForIncome = reportGroupsForIncome;
418        }
419    
420        public TreeMap<Integer, TreeMap<String, ReportGroupData>> getReportGroupsForPrincipal() {
421            return reportGroupsForPrincipal;
422        }
423    
424        public void setReportGroupsForPrincipal(TreeMap<Integer, TreeMap<String, ReportGroupData>> reportGroupsForPrincipal) {
425            this.reportGroupsForPrincipal = reportGroupsForPrincipal;
426        }
427    
428        public EndowmentReportFooterDataHolder getFooter() {
429            return footer;
430        }
431    
432        public void setFooter(EndowmentReportFooterDataHolder footer) {
433            this.footer = footer;
434        }
435            
436    }