1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.kuali.kfs.gl.service.impl;
20
21 import java.util.Comparator;
22 import java.util.Map;
23
24 import org.apache.commons.lang.StringUtils;
25 import org.kuali.kfs.coa.businessobject.Account;
26 import org.kuali.kfs.coa.businessobject.SubFundGroup;
27 import org.kuali.kfs.gl.batch.service.AccountingCycleCachingService;
28 import org.kuali.kfs.gl.businessobject.OriginEntryInformation;
29 import org.kuali.kfs.gl.businessobject.PosterOutputSummaryAmountHolder;
30 import org.kuali.kfs.gl.businessobject.PosterOutputSummaryEntry;
31 import org.kuali.kfs.gl.businessobject.Transaction;
32 import org.kuali.kfs.gl.service.PosterOutputSummaryService;
33 import org.kuali.rice.core.api.util.type.KualiDecimal;
34
35
36
37
38 public class PosterOutputSummaryServiceImpl implements PosterOutputSummaryService {
39 private AccountingCycleCachingService accountingCycleCachingService;
40
41
42
43
44
45 public void addAmountToAmountHolder(OriginEntryInformation originEntry, PosterOutputSummaryAmountHolder amountHolder) {
46 final String debitCreditCode = originEntry.getTransactionDebitCreditCode();
47 final KualiDecimal amount = originEntry.getTransactionLedgerEntryAmount();
48 final String objectTypeCode = originEntry.getFinancialObjectTypeCode();
49
50 amountHolder.addAmount(debitCreditCode, objectTypeCode, amount);
51 }
52
53
54
55
56
57 public void addAmountToAmountHolder(Transaction transaction, PosterOutputSummaryAmountHolder amountHolder) {
58 final String debitCreditCode = transaction.getTransactionDebitCreditCode();
59 final KualiDecimal amount = transaction.getTransactionLedgerEntryAmount();
60 final String objectTypeCode = transaction.getFinancialObjectTypeCode();
61
62 amountHolder.addAmount(debitCreditCode, objectTypeCode, amount);
63 }
64
65
66
67
68 public Comparator<PosterOutputSummaryEntry> getEntryComparator() {
69 return new Comparator<PosterOutputSummaryEntry>() {
70
71
72
73
74
75
76
77
78 public int compare(PosterOutputSummaryEntry vladimir, PosterOutputSummaryEntry estragon) {
79 if (shouldCompare(vladimir.getBalanceTypeCode(), estragon.getBalanceTypeCode())) {
80 return vladimir.getBalanceTypeCode().toUpperCase().compareTo(estragon.getBalanceTypeCode().toUpperCase());
81 } else if (shouldCompare(vladimir.getUniversityFiscalYear(), estragon.getUniversityFiscalYear())) {
82 return vladimir.getUniversityFiscalYear().compareTo(estragon.getUniversityFiscalYear());
83 } else if (shouldCompare(vladimir.getFiscalPeriodCode(), estragon.getFiscalPeriodCode())) {
84 return vladimir.getFiscalPeriodCode().toUpperCase().compareTo(estragon.getFiscalPeriodCode().toUpperCase());
85 } else if (shouldCompare(vladimir.getFundGroup(), estragon.getFundGroup())) {
86 return vladimir.getFundGroup().toUpperCase().compareTo(estragon.getFundGroup().toUpperCase());
87 } else {
88 return 0;
89 }
90 }
91
92
93
94
95
96
97
98 protected boolean shouldCompare(String s1, String s2) {
99 return !StringUtils.isBlank(s1) && !StringUtils.isBlank(s2) && !s1.equalsIgnoreCase(s2);
100 }
101
102
103
104
105
106
107
108 protected boolean shouldCompare(Integer i1, Integer i2) {
109 return i1 != null && i2 != null && !i1.equals(i2);
110 }
111 };
112 }
113
114
115
116
117 protected String getPosterOutputSummaryEntryMapKey(OriginEntryInformation originEntry) {
118 return buildKey(originEntry.getFinancialBalanceTypeCode(), originEntry.getUniversityFiscalYear(), originEntry.getUniversityFiscalPeriodCode(), originEntry.getChartOfAccountsCode(), originEntry.getAccountNumber());
119 }
120
121
122
123
124 protected String getPosterOutputSummaryEntryMapKey(Transaction transaction) {
125 return buildKey(transaction.getFinancialBalanceTypeCode(), transaction.getUniversityFiscalYear(), transaction.getUniversityFiscalPeriodCode(), transaction.getChartOfAccountsCode(), transaction.getAccountNumber());
126 }
127
128
129
130
131
132
133
134
135
136 protected String buildKey(String balanceTypeCode, Integer universityFiscalYear, String fiscalPeriodCode, String chartOfAccountsCode, String accountNumber) {
137 return StringUtils.join(new String[] {balanceTypeCode, universityFiscalYear == null ? "" : universityFiscalYear.toString(), fiscalPeriodCode, getFundGroupCodeForAccount(chartOfAccountsCode, accountNumber)}, ':');
138 }
139
140
141
142
143
144
145 protected String getFundGroupCodeForAccount(String chartOfAccountsCode, String accountNumber) {
146 final Account account = this.getAccountingCycleCachingService().getAccount(chartOfAccountsCode, accountNumber);
147 if (account != null) {
148 final SubFundGroup subFundGroup = this.getAccountingCycleCachingService().getSubFundGroup(account.getSubFundGroupCode());
149 if (subFundGroup != null) {
150 return subFundGroup.getFundGroupCode();
151 }
152 }
153 return "";
154 }
155
156
157
158
159 public void summarize(OriginEntryInformation originEntry, Map<String, PosterOutputSummaryEntry> entries) {
160 final String key = getPosterOutputSummaryEntryMapKey(originEntry);
161 PosterOutputSummaryEntry entry = entries.get(key);
162 if (entry == null) {
163 entry = new PosterOutputSummaryEntry(originEntry.getFinancialBalanceTypeCode(), originEntry.getUniversityFiscalYear(), originEntry.getUniversityFiscalPeriodCode(), getFundGroupCodeForAccount(originEntry.getChartOfAccountsCode(), originEntry.getAccountNumber()));
164 entries.put(key, entry);
165 }
166 addAmountToAmountHolder(originEntry, entry);
167 }
168
169
170
171
172 public void summarize(Transaction transaction, Map<String, PosterOutputSummaryEntry> entries) {
173 final String key = getPosterOutputSummaryEntryMapKey(transaction);
174 PosterOutputSummaryEntry entry = entries.get(key);
175 if (entry == null) {
176 entry = new PosterOutputSummaryEntry(transaction.getFinancialBalanceTypeCode(), transaction.getUniversityFiscalYear(), transaction.getUniversityFiscalPeriodCode(), getFundGroupCodeForAccount(transaction.getChartOfAccountsCode(), transaction.getAccountNumber()));
177 entries.put(key, entry);
178 }
179 addAmountToAmountHolder(transaction, entry);
180 }
181
182
183
184
185
186 public AccountingCycleCachingService getAccountingCycleCachingService() {
187 return accountingCycleCachingService;
188 }
189
190
191
192
193
194 public void setAccountingCycleCachingService(AccountingCycleCachingService accountingCycleCachingService) {
195 this.accountingCycleCachingService = accountingCycleCachingService;
196 }
197 }