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.module.purap.service;
17
18 import org.kuali.ole.module.purap.businessobject.PurApAccountingLine;
19 import org.kuali.ole.module.purap.businessobject.PurApItem;
20 import org.kuali.ole.module.purap.document.InvoiceDocument;
21 import org.kuali.ole.module.purap.document.PaymentRequestDocument;
22 import org.kuali.ole.module.purap.document.PurchasingAccountsPayableDocument;
23 import org.kuali.ole.module.purap.util.SummaryAccount;
24 import org.kuali.ole.module.purap.util.UseTaxContainer;
25 import org.kuali.ole.sys.businessobject.SourceAccountingLine;
26 import org.kuali.rice.core.api.util.type.KualiDecimal;
27
28 import java.util.List;
29 import java.util.Set;
30
31 /**
32 * This class is used to generate Account Summaries for the Purchasing Accounts Payable Module account lists as well as to generate account lists that can be
33 * used for distribution to below the line items or any other items that may require distribution
34 */
35 public interface PurapAccountingService {
36
37 /**
38 * unused see other generateAccountDistribution methods
39 *
40 * @param accounts
41 * @param totalAmount
42 * @param percentScale
43 * @return
44 * @deprecated
45 */
46 @Deprecated
47 public List<PurApAccountingLine> generateAccountDistributionForProration(List<SourceAccountingLine> accounts, KualiDecimal totalAmount, Integer percentScale);
48
49 /**
50 * Determines an appropriate account distribution for a particular Purchasing Accounts Payable list of Accounts. It does this by looking at the accounts that were provided
51 * which should be generated from a generateSummary method. It then builds up a list of PurApAccountingLines (specified by the Class variable) and tries to determine the
52 * appropriate percents to use on the new accounts, this may require some moving of percents to the last account as a slush.
53 *
54 * @param accounts the incoming source accounts from generateSummary
55 * @param totalAmount the total amount of the document
56 * @param percentScale the scale to round to
57 * @param clazz the class of the Purchasing Accounts Payable Account
58 * @return a list of new Purchasing Accounts Payable Accounts
59 */
60 public List<PurApAccountingLine> generateAccountDistributionForProration(List<SourceAccountingLine> accounts, KualiDecimal totalAmount, Integer percentScale, Class clazz);
61
62 /**
63 * Determines an appropriate account distribution for a particular Purchasing Accounts Payable list of Accounts. It does this by looking at the accounts that were provided
64 * which should be generated from a generateSummary method. It then builds up a list of PurApAccountingLines (specified by the Class variable) and tries to determine the
65 * appropriate percents to use on the new accounts, this may require some moving of percents to the last account as a slush. This is called when a document has a zero dollar
66 * total
67 *
68 * @param accounts the incoming source accounts from generateSummary
69 * @param percentScale the scale to round to
70 * @param clazz the class of the Purchasing Accounts Payable Account
71 * @return a list of new Purchasing Accounts Payable Accounts
72 */
73 public List<PurApAccountingLine> generateAccountDistributionForProrationWithZeroTotal(PurchasingAccountsPayableDocument purapdoc);
74
75 /**
76 * This creates summary accounts based on a list of items.
77 *
78 * @param document the document to generate the summary accounts from
79 * @return a list of summary accounts.
80 */
81 public List<SummaryAccount> generateSummaryAccounts(PurchasingAccountsPayableDocument document);
82
83 /**
84 * This creates summary accounts based on a list of items excluding zero totals.
85 *
86 * @param document the document to generate the summary accounts from
87 * @return a list of summary accounts.
88 */
89 public List<SummaryAccount> generateSummaryAccountsWithNoZeroTotals(PurchasingAccountsPayableDocument document);
90
91
92 /**
93 * This creates summary accounts based on a list of items excluding zero totals and use tax.
94 *
95 * @param document the document to generate the summary accounts from
96 * @return a list of summary accounts.
97 */
98 public List<SummaryAccount> generateSummaryAccountsWithNoZeroTotalsNoUseTax(PurchasingAccountsPayableDocument document);
99
100
101 /**
102 * Generates an account summary, that is it creates a list of source accounts
103 * by rounding up the Purchasing Accounts Payable accounts off of the Purchasing Accounts Payable items.
104 *
105 * @param document the document to generate the summary from
106 * @return a list of source accounts
107 */
108 public List<SourceAccountingLine> generateSummary(List<PurApItem> items);
109
110 /**
111 * Generates an account summary with only taxable accounts.
112 *
113 * @param items
114 * @return
115 */
116 public List<SourceAccountingLine> generateSummaryTaxableAccounts(List<PurApItem> items);
117
118 /**
119 * convenience method that generates a list of source accounts while excluding items with
120 * $0 amounts
121 *
122 * @param items the items to generate source accounts from
123 * @return a list of source accounts "rolled up" from the purap accounts
124 */
125 public List<SourceAccountingLine> generateSummaryWithNoZeroTotals(List<PurApItem> items);
126
127 /**
128 * convenience method that generates a list of source accounts while excluding items with
129 * $0 amounts and use tax
130 *
131 * @param items the items to generate source accounts from
132 * @return a list of source accounts "rolled up" from the purap accounts
133 */
134 public List<SourceAccountingLine> generateSummaryWithNoZeroTotalsNoUseTax(List<PurApItem> items);
135
136 /**
137 * convenience method that generates a list of source accounts while excluding items with
138 * $0 amounts and using the alternate amount
139 *
140 * @param items the items to generate source accounts from
141 * @return a list of source accounts "rolled up" from the purap accounts
142 */
143 public List<SourceAccountingLine> generateSummaryWithNoZeroTotalsUsingAlternateAmount(List<PurApItem> items);
144
145 /**
146 * convenience method that generates a list of source accounts while excluding items with
147 * the specified item types
148 *
149 * @param items the items to generate source accounts from
150 * @param excludedItemTypeCodes the item types to exclude
151 * @return a list of source accounts "rolled up" from the purap accounts
152 */
153 public List<SourceAccountingLine> generateSummaryExcludeItemTypes(List<PurApItem> items, Set excludedItemTypeCodes);
154
155 /**
156 * convenience method that generates a list of source accounts while excluding items with
157 * the specified item types and not including items with zero totals
158 *
159 * @param items the items to generate source accounts from
160 * @param excludedItemTypeCodes the item types to exclude
161 * @return a list of source accounts "rolled up" from the purap accounts
162 */
163 public List<SourceAccountingLine> generateSummaryExcludeItemTypesAndNoZeroTotals(List<PurApItem> items, Set excludedItemTypeCodes);
164
165 /**
166 * convenience method that generates a list of source accounts while only including items with
167 * the specified item types
168 *
169 * @param items the items to generate source accounts from
170 * @param excludedItemTypeCodes the item types to include
171 * @return a list of source accounts "rolled up" from the purap accounts
172 */
173 public List<SourceAccountingLine> generateSummaryIncludeItemTypes(List<PurApItem> items, Set includedItemTypeCodes);
174
175 /**
176 * convenience method that generates a list of source accounts while only including items with
177 * the specified item types and not including items with zero totals
178 *
179 * @param items the items to generate source accounts from
180 * @param excludedItemTypeCodes the item types to include
181 * @return a list of source accounts "rolled up" from the purap accounts
182 */
183 public List<SourceAccountingLine> generateSummaryIncludeItemTypesAndNoZeroTotals(List<PurApItem> items, Set includedItemTypeCodes);
184
185 /**
186 * Updates account amounts based on the percents. If this is a preq past full entry it updates the
187 * percents based on the amounts instead
188 *
189 * @param document the document
190 */
191 public void updateAccountAmounts(PurchasingAccountsPayableDocument document);
192
193 /**
194 * Updates a single items account amounts
195 *
196 * @param item
197 */
198 public void updateItemAccountAmounts(PurApItem item);
199
200 /**
201 * Updates a single preq item accounts amounts
202 *
203 * @param item
204 */
205 public void updatePreqItemAccountAmounts(PurApItem item);
206
207 /**
208 * Updates a single preq item accounts amounts
209 *
210 * @param item
211 */
212 public void updatePreqProportionalItemAccountAmounts(PurApItem item);
213
214 public List<PurApAccountingLine> getAccountsFromItem(PurApItem item);
215
216 /**
217 * Deletes the ap summary accounts by the id of the doc type (Payment Request - PREQ or Credit Memo - CM)
218 *
219 * @param purapDocumentIdentifier The purapDocumentIdentifier of the document whose summary accounts are to be deleted.
220 */
221 public void deleteSummaryAccounts(Integer purapDocumentIdentifier, String docType);
222
223 /**
224 * Retrieves the ap summary accounts by the id of the doc type (Payment Request - PREQ or Credit Memo - CM)
225 *
226 * @param purapDocumentIdentifier The purapDocumentIdentifier of the document.
227 */
228 public List getAccountsPayableSummaryAccounts(Integer purapDocumentIdentifier, String docType);
229
230 /**
231 * This method generates summary accounts for a vendor payment.
232 *
233 * @param document
234 * @return This will get the proper amount on the items that is sent to the vendor
235 */
236 public List<SourceAccountingLine> generateSourceAccountsForVendorRemit(PurchasingAccountsPayableDocument document);
237
238 /**
239 * Converts the amount to percent and updates the percent field on the CreditMemoAccount
240 *
241 * @param pr The payment request document containing the accounts whose percentage would be set.
242 */
243 public void convertMoneyToPercent(PaymentRequestDocument pr);
244
245 /**
246 * Converts the amount to percent and updates the percent field on the CreditMemoAccount
247 *
248 * @param pr The payment request document containing the accounts whose percentage would be set.
249 */
250 public void convertMoneyToPercent(InvoiceDocument inv);
251
252 /**
253 * Generates use tax helper class for a purap document
254 *
255 * @param document
256 * @return useTaxContainer
257 */
258 public List<UseTaxContainer> generateUseTaxAccount(PurchasingAccountsPayableDocument document);
259
260 /**
261 * Checks whether the specified accounting line in the specified PurAP document is used for tax withholding.
262 * This applies only to PaymentRequestDocument; otherwise it always returns false.
263 *
264 * @param document the specified PurAP document
265 * @param account the specified accounting line
266 * @return true if the accounting line is a tax account
267 */
268 public boolean isTaxAccount(PurchasingAccountsPayableDocument document, SourceAccountingLine account);
269
270 /**
271 * calculates values for a list of accounting lines based on an amount
272 *
273 * @param <T>
274 * @param sourceAccountingLines
275 * @param totalAmount
276 */
277 public <T extends PurApAccountingLine> void updateAccountAmountsWithTotal(List<T> sourceAccountingLines, KualiDecimal totalAmount);
278
279 /**
280 * calculates values for a list of accounting lines based on an amount taking discount into account
281 *
282 * @param <T>
283 * @param sourceAccountingLines
284 * @param totalAmount
285 * @param discountAmount
286 */
287 public <T extends PurApAccountingLine> void updateAccountAmountsWithTotal(List<T> sourceAccountingLines,
288 KualiDecimal totalAmount, KualiDecimal discountAmount);
289
290 /**
291 * calculates values for a list of accounting lines based on an amount on preq for sequential method.
292 *
293 * @param <T>
294 * @param sourceAccountingLines
295 * @param totalAmount
296 */
297 public <T extends PurApAccountingLine> void updatePreqAccountAmountsWithTotal(List<T> sourceAccountingLines, KualiDecimal totalAmount);
298
299 /**
300 * calculates values for a list of accounting lines based on an amount on preq for proportional method.
301 *
302 * @param <T>
303 * @param sourceAccountingLines
304 * @param totalAmount
305 */
306 public <T extends PurApAccountingLine> void updatePreqProporationalAccountAmountsWithTotal(List<T> sourceAccountingLines, KualiDecimal totalAmount);
307
308 /**
309 * Merges list 2 into list 1
310 *
311 * @param list1
312 * @param list2
313 * @return
314 */
315 public List<SourceAccountingLine> mergeAccountingLineLists(List<SourceAccountingLine> accountingLines1, List<SourceAccountingLine> accountingLines2);
316
317 /**
318 * Retrieves the summary accounts by payment request document id.
319 *
320 * @param paymentRequestIdentifier - payment request document id
321 * @return List of SummaryAccounts
322 */
323 public List getSummaryAccountsbyPaymentRequestIdentifier(Integer paymentRequestIdentifier);
324
325 /**
326 * Retrieves the summary accounts by Invoice document id.
327 *
328 * @param invoicetIdentifier - payment request document id
329 * @return List of SummaryAccounts
330 */
331 public List getSummaryAccountsbyInvoiceIdentifier(Integer invoicetIdentifier);
332
333
334 /**
335 * Retrieves the summary accounts by credit memo document id.
336 *
337 * @param creditMemoIdentifier - credit memo document id
338 * @return List of SummaryAccounts
339 */
340 public List getSummaryAccountsbyCreditMemoIdentifier(Integer creditMemoIdentifier);
341
342 }