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