1 /*
2 * Copyright 2007 The Kuali Foundation
3 *
4 * Licensed under the Educational Community License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.opensource.org/licenses/ecl2.php
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package org.kuali.ole.sys.service;
17
18 import java.util.Collection;
19 import java.util.Iterator;
20 import java.util.List;
21 import java.util.Map;
22
23 import org.kuali.ole.coa.businessobject.Account;
24 import org.kuali.ole.coa.businessobject.ObjectCode;
25 import org.kuali.ole.gl.businessobject.Balance;
26 import org.kuali.ole.gl.businessobject.Encumbrance;
27 import org.kuali.ole.sys.businessobject.Bank;
28 import org.kuali.ole.sys.businessobject.GeneralLedgerPendingEntry;
29 import org.kuali.ole.sys.businessobject.GeneralLedgerPendingEntrySequenceHelper;
30 import org.kuali.ole.sys.businessobject.GeneralLedgerPendingEntrySourceDetail;
31 import org.kuali.ole.sys.document.GeneralLedgerPendingEntrySource;
32 import org.kuali.ole.sys.document.GeneralLedgerPostingDocument;
33 import org.kuali.ole.sys.document.OLEGeneralLedgerPendingEntrySource;
34 import org.kuali.rice.core.api.util.type.KualiDecimal;
35
36 /**
37 * This interface defines methods that a GeneralLedgerPendingEntry Service must provide
38 */
39 public interface GeneralLedgerPendingEntryService {
40
41 /**
42 * This method...
43 *
44 * @param universityFiscalYears
45 * @param chartOfAccountsCode
46 * @param accountNumber
47 * @param isDebit
48 * @return
49 */
50 public KualiDecimal getCashSummary(List universityFiscalYears, String chartOfAccountsCode, String accountNumber, boolean isDebit);
51
52 /**
53 * This method...
54 *
55 * @param universityFiscalYears
56 * @param chartOfAccountsCode
57 * @param accountNumber
58 * @param isDebit
59 * @return
60 */
61 public KualiDecimal getActualSummary(List universityFiscalYears, String chartOfAccountsCode, String accountNumber, boolean isDebit);
62
63 /**
64 * This method...
65 *
66 * @param universityFiscalYear
67 * @param chartOfAccountsCode
68 * @param accountNumber
69 * @param sufficientFundsObjectCode
70 * @param isDebit
71 * @param isYearEnd
72 * @return
73 */
74 public KualiDecimal getExpenseSummary(Integer universityFiscalYear, String chartOfAccountsCode, String accountNumber, String sufficientFundsObjectCode, boolean isDebit, boolean isYearEnd);
75
76 /**
77 * This method...
78 *
79 * @param universityFiscalYear
80 * @param chartOfAccountsCode
81 * @param accountNumber
82 * @param sufficientFundsObjectCode
83 * @param isDebit
84 * @param isYearEnd
85 * @return
86 */
87 public KualiDecimal getEncumbranceSummary(Integer universityFiscalYear, String chartOfAccountsCode, String accountNumber, String sufficientFundsObjectCode, boolean isDebit, boolean isYearEnd);
88
89 /**
90 * This method...
91 *
92 * @param universityFiscalYear
93 * @param chartOfAccountsCode
94 * @param accountNumber
95 * @param sufficientFundsObjectCode
96 * @param isYearEnd
97 * @return
98 */
99 public KualiDecimal getBudgetSummary(Integer universityFiscalYear, String chartOfAccountsCode, String accountNumber, String sufficientFundsObjectCode, boolean isYearEnd);
100
101 /**
102 * @param transactionEntrySequenceId
103 * @param documentHeaderId
104 */
105 public GeneralLedgerPendingEntry getByPrimaryId(Integer transactionEntrySequenceId, String documentHeaderId);
106
107 /**
108 * Invokes generateGeneralLedgerPendingEntries method on the transactional document.
109 *
110 * @param document - document whose pending entries need generated
111 * @return whether the business rules succeeded
112 */
113 public boolean generateGeneralLedgerPendingEntries(GeneralLedgerPendingEntrySource document);
114
115 /**
116 * Invokes generateGeneralLedgerPendingEntries method on the transactional document.
117 *
118 * @param document - document whose pending entries need generated
119 * @return whether the business rules succeeded
120 */
121 public boolean generateGeneralLedgerPendingEntries(OLEGeneralLedgerPendingEntrySource document);
122
123 /**
124 * The fiscal year and period is null in quite a few glpe's. This will put in a sensible default.
125 *
126 * @param glpe
127 */
128 public void fillInFiscalPeriodYear(GeneralLedgerPendingEntry glpe);
129
130 /**
131 * @param generalLedgerPendingEntry
132 */
133 public void save(GeneralLedgerPendingEntry generalLedgerPendingEntry);
134
135 /**
136 * @param documentHeaderId
137 */
138 public void delete(String documentHeaderId);
139
140 /**
141 * Delete all pending entries for a specific document approved code
142 *
143 * @param financialDocumentApprovedCode
144 */
145 public void deleteByFinancialDocumentApprovedCode(String financialDocumentApprovedCode);
146
147 /**
148 * Does the given account have any general ledger entries? It is necessary to check this before closing an account.
149 *
150 * @param account
151 * @return
152 */
153 public boolean hasPendingGeneralLedgerEntry(Account account);
154
155 /**
156 * The method finds all pending ledger entries
157 *
158 * @return all pending ledger entries
159 */
160 public Iterator findApprovedPendingLedgerEntries();
161
162 /**
163 * This method retrieves all pending ledger entries for the given encumbrance
164 *
165 * @param encumbrance the encumbrance entry
166 * @param isApproved the flag that indicates whether the pending entries are approved or don't care
167 * @return all pending ledger entries of the given encumbrance
168 */
169 public Iterator findPendingLedgerEntries(Encumbrance encumbrance, boolean isApproved);
170
171 /**
172 * This method retrieves all pending ledger entries for the given encumbrance
173 *
174 * @param balance the balance entry
175 * @param isApproved the flag that indicates whether the pending entries are approved or don't care
176 * @param isConsolidated determine whether the search results are consolidated
177 * @return all pending ledger entries of the given encumbrance
178 */
179 public Iterator findPendingLedgerEntries(Balance balance, boolean isApproved, boolean isConsolidated);
180
181 /**
182 * This method retrieves all pending ledger entries matching the given entry criteria
183 *
184 * @param isApproved the flag that indicates whether the pending entries are approved or don't care
185 * @param fieldValues the input fields and values
186 * @return all pending ledger entries matching the given balance criteria
187 */
188 public Iterator findPendingLedgerEntriesForEntry(Map fieldValues, boolean isApproved);
189
190 /**
191 * This method retrieves all pending ledger entries matching the given balance criteria
192 *
193 * @param isApproved the flag that indicates whether the pending entries are approved or don't care
194 * @param fieldValues the input fields and values
195 * @return all pending ledger entries matching the given balance criteria
196 */
197 public Iterator findPendingLedgerEntriesForBalance(Map fieldValues, boolean isApproved);
198
199 /**
200 * This method retrieves all pending ledger entries that may belong to cash balance in the future
201 *
202 * @param isApproved the flag that indicates whether the pending entries are approved or don't care
203 * @return all pending ledger entries that may belong to cash balance
204 */
205 public Iterator findPendingLedgerEntriesForCashBalance(Map fieldValues, boolean isApproved);
206
207 /**
208 * This method retrieves all pending ledger entries that may belong to encumbrance table in the future
209 *
210 * @param isApproved the flag that indicates whether the pending entries are approved or don't care
211 * @return all pending ledger entries that may belong to encumbrance table
212 */
213 public Iterator findPendingLedgerEntriesForEncumbrance(Map fieldValues, boolean isApproved);
214
215 /**
216 * This method retrieves all pending ledger entries that may belong to the given account balance record in the future
217 *
218 * @param fieldValues
219 * @param isApproved the flag that indicates whether the pending entries are approved or don't care
220 * @return all pending ledger entries that may belong to encumbrance table
221 */
222 public Iterator findPendingLedgerEntrySummaryForAccountBalance(Map fieldValues, boolean isApproved);
223
224 /**
225 * This method retrieves all pending ledger entries that may belong to the given account balance record in the future
226 *
227 * @param fieldValues
228 * @param isApproved the flag that indicates whether the pending entries are approved or don't care
229 * @return all pending ledger entries that may belong to encumbrance table
230 */
231 public Iterator findPendingLedgerEntriesForAccountBalance(Map fieldValues, boolean isApproved);
232
233 /**
234 * @param fieldValues
235 * @return
236 */
237 public Collection findPendingEntries(Map fieldValues, boolean isApproved);
238
239 /**
240 * This populates an empty GeneralLedgerPendingEntry explicitEntry object instance with default values.
241 *
242 * @param accountingDocument
243 * @param accountingLine
244 * @param sequenceHelper
245 * @param explicitEntry
246 */
247 public void populateExplicitGeneralLedgerPendingEntry(GeneralLedgerPendingEntrySource poster, GeneralLedgerPendingEntrySourceDetail postable, GeneralLedgerPendingEntrySequenceHelper sequenceHelper, GeneralLedgerPendingEntry explicitEntry);
248
249 /**
250 * Convenience method to build a GLPE without a generalLedgerPendingEntrySourceDetail
251 *
252 * @param document a GeneralLedgerPostingDocument
253 * @param account the account for use in the GLPE
254 * @param objectCode the object code for use in the GLPE
255 * @param subAccountNumber the sub account number for use in the GLPE
256 * @param subObjectCode the subobject code for use in the GLPE
257 * @param organizationReferenceId the organization reference id to use in the GLPE
258 * @param projectCode the project code to use in the GLPE
259 * @param referenceNumber the reference number to use in the GLPE
260 * @param referenceTypeCode the reference type code to use in the GLPE
261 * @param referenceOriginCode the reference origin code to use in the GLPE
262 * @param description the description to put in the GLPE
263 * @param isDebit true if the GLPE represents a debit, false if it represents a credit
264 * @param amount the amount of the GLPE
265 * @param sequenceHelper the sequence helper to use
266 * @return a populated general ledger pending entry
267 */
268 public GeneralLedgerPendingEntry buildGeneralLedgerPendingEntry(GeneralLedgerPostingDocument document, Account account, ObjectCode objectCode, String subAccountNumber, String subObjectCode, String organizationReferenceId, String projectCode, String referenceNumber, String referenceTypeCode, String referenceOriginCode, String description, boolean isDebit, KualiDecimal amount, GeneralLedgerPendingEntrySequenceHelper sequenceHelper);
269
270 /**
271 * This populates an GeneralLedgerPendingEntry offsetEntry object instance with values that differ from the values supplied in
272 * the explicit entry that it was cloned from. Note that the entries do not contain BOs now.
273 *
274 * @param universityFiscalYear
275 * @param explicitEntry
276 * @param sequenceHelper
277 * @param offsetEntry Cloned from the explicit entry
278 */
279 public boolean populateOffsetGeneralLedgerPendingEntry(Integer universityFiscalYear, GeneralLedgerPendingEntry explicitEntry, GeneralLedgerPendingEntrySequenceHelper sequenceHelper, GeneralLedgerPendingEntry offsetEntry);
280
281 /**
282 * This populates an empty GeneralLedgerPendingEntry instance with default values for a bank offset. A global error will be
283 * posted as a side-effect if the given Bank has not defined the necessary bank offset relations.
284 *
285 * @param bank
286 * @param depositAmount
287 * @param financialDocument
288 * @param universityFiscalYear
289 * @param sequenceHelper
290 * @param bankOffsetEntry
291 * @param errorPropertyName
292 */
293 public boolean populateBankOffsetGeneralLedgerPendingEntry(Bank bank, KualiDecimal depositAmount, GeneralLedgerPostingDocument financialDocument, Integer universityFiscalYear, GeneralLedgerPendingEntrySequenceHelper sequenceHelper, GeneralLedgerPendingEntry bankOffsetEntry, String errorPropertyName);
294
295 /**
296 * Adds up the amounts of all cash to offset GeneralLedgerPendingEntry records on the given AccountingDocument
297 *
298 * @param glPostingDocument the accounting document total the offset to cash amount for
299 * @return the offset to cash amount, where debited values have been subtracted and credited values have been added
300 */
301 public abstract KualiDecimal getOffsetToCashAmount(GeneralLedgerPostingDocument glPostingDocument);
302
303 /**
304 * Determines if the given GeneralLedgerPendingEntry represents offsets to cash
305 *
306 * @param generalLedgerPendingEntry the GeneralLedgerPendingEntry to check
307 * @return true if the GeneralLedgerPendingEntry represents an offset to cash; false otherwise
308 */
309 public abstract boolean isOffsetToCash(GeneralLedgerPendingEntry generalLedgerPendingEntry);
310
311 /**
312 * Gets the encumbrance balance type. It returns the encumbrance balance type for the given universityFiscalYear if one is
313 * passed in the fieldValues or the current year encumbrance balance types.
314 *
315 * @param fieldValues
316 * @param currentFiscalYear
317 * @return the encumbrance balance type for the given universityFiscalYear if one is passed in the fieldValues or the current
318 * year encumbrance balance types.
319 */
320 public List<String> getEncumbranceBalanceTypes(Map fieldValues, Integer currentFiscalYear);
321
322
323 public void populateExplicitGeneralLedgerPendingEntry(OLEGeneralLedgerPendingEntrySource poster, GeneralLedgerPendingEntrySourceDetail postable, GeneralLedgerPendingEntrySequenceHelper sequenceHelper, GeneralLedgerPendingEntry explicitEntry);
324 }