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.purap.document.service;
017
018 import java.sql.Date;
019 import java.util.List;
020 import java.util.Map;
021
022 import org.kuali.kfs.module.purap.businessobject.ItemType;
023 import org.kuali.kfs.module.purap.businessobject.PurApAccountingLine;
024 import org.kuali.kfs.module.purap.businessobject.PurApItem;
025 import org.kuali.kfs.module.purap.document.AccountsPayableDocument;
026 import org.kuali.kfs.module.purap.document.PurapItemOperations;
027 import org.kuali.kfs.module.purap.document.PurchasingAccountsPayableDocument;
028 import org.kuali.kfs.module.purap.document.PurchasingDocument;
029 import org.kuali.rice.kew.exception.WorkflowException;
030 import org.kuali.rice.kns.bo.Parameter;
031 import org.kuali.rice.kns.document.Document;
032 import org.kuali.rice.kns.util.KualiDecimal;
033
034 /**
035 * Defines methods that must be implemented by classes providing a PurapService.
036 */
037 public interface PurapService {
038
039 /**
040 * Update the status for the given Purchasing/Accounts Payable document
041 *
042 * @param document
043 * @param statusToSet
044 * @return
045 */
046 public boolean updateStatus(PurchasingAccountsPayableDocument document, String statusToSet);
047
048 public List<String> getRelatedDocumentIds(Integer accountsPayablePurchasingDocumentLinkIdentifier);
049
050 public void saveRoutingDataForRelatedDocuments(Integer accountsPayablePurchasingDocumentLinkIdentifier);
051
052 /**
053 * Retrieve list of views for given identifier
054 *
055 * @param clazz
056 * @param accountsPayablePurchasingDocumentLinkIdentifier
057 * @return List of views for given identifier
058 */
059 @SuppressWarnings("unchecked")
060 public List getRelatedViews(Class clazz, Integer accountsPayablePurchasingDocumentLinkIdentifier);
061
062 /**
063 * Add the allowed below the line items to the given document
064 *
065 * @param document PurchasingAccountsPayableDocument
066 */
067 public void addBelowLineItems(PurchasingAccountsPayableDocument document);
068
069 /**
070 * Retrieves the below the line items allowed from the parameter table for the given document
071 *
072 * @param document PurchasingAccountsPayableDocument
073 * @return Array list of below the line items
074 */
075 public String[] getBelowTheLineForDocument(PurchasingAccountsPayableDocument document);
076
077 /**
078 * Retrieve the below the line item for a doc by item type (unknown result if multiple of same below the line item
079 * type)
080 *
081 * @param document the document
082 * @param iT the itemType
083 * @return below the line item by item type
084 */
085 public PurApItem getBelowTheLineByType(PurchasingAccountsPayableDocument document, ItemType iT);
086
087 /**
088 * Return a Date object which is which is a given number of days away from today, in either direction.
089 *
090 * @param offsetDays
091 * @return A java.sql.Date
092 */
093 public Date getDateFromOffsetFromToday(int offsetDays);
094
095 /**
096 * Determine whether a given date is in the past.
097 *
098 * @param compareDate An SQL date (not a DateFormatter date, or a util Date)
099 * @return True if the given date is before today.
100 */
101 public boolean isDateInPast(Date compareDate);
102
103 /**
104 * Determine whether a given date is more than a given number of days away from the current date.
105 *
106 * @param compareDate An SQL date (not a DateFormatter date, or a util Date)
107 * @param daysAway An int, positive for future days, negative for past days
108 * @return True if the given date is more than the given number of days away in either direction.
109 */
110 public boolean isDateMoreThanANumberOfDaysAway(Date compareDate, int daysAway);
111
112 /**
113 * We are obliged not to simply use a dateDiff and compare the result to 365, because we have to worry about leap years.
114 *
115 * @param compareDate An SQL date (not a DateFormatter date, or a util Date)
116 * @return True if the date given for comparison is more than a year in the past, not including today.
117 */
118 public boolean isDateAYearBeforeToday(Date compareDate);
119
120 /**
121 * Retrieve the Automatic Purchase Order Limit amount based first on the derived contract limit (see
122 * {@link org.kuali.kfs.vnd.document.service.VendorService#getApoLimitFromContract(Integer, String, String)}) and if that is null
123 * then based on the {@link org.kuali.kfs.module.purap.businessobject.OrganizationParameter} associated with the given 'chart' and 'org' values.
124 *
125 * @param vendorContractGeneratedIdentifier
126 * @param chart chart code to use when looking up limit amount on {@link org.kuali.kfs.vnd.businessobject.VendorContract} and
127 * {@link org.kuali.kfs.module.purap.businessobject.OrganizationParameter}
128 * @param org organization code to use when looking up limit amount on {@link org.kuali.kfs.vnd.businessobject.VendorContract} and
129 * {@link org.kuali.kfs.module.purap.businessobject.OrganizationParameter}
130 * @return a KualiDecimal if a valid limit amount is found or null if one is not found
131 */
132 public KualiDecimal getApoLimit(Integer vendorContractGeneratedIdentifier, String chart, String org);
133
134 /**
135 * Determines if full entry mode has ended for this Purchasing/Accounts Payable document.
136 *
137 * @param purapDocument PurchasingAccountsPayableDocument
138 * @return a boolean to indicate if document has completed full entry mode
139 */
140 public boolean isFullDocumentEntryCompleted(PurchasingAccountsPayableDocument purapDocument);
141
142 /**
143 * Create a close or reopen purchase order document.
144 *
145 * @param purapDocument PurchasingAccountsPayableDocument
146 */
147 public void performLogicForCloseReopenPO(PurchasingAccountsPayableDocument purapDocument);
148
149 /**
150 * Performs the given logic with the given fake user id. Need this to control the user.
151 *
152 * @param requiredPersonPersonUserId
153 * @param logicToRun
154 * @param objects
155 * @return
156 * @throws WorkflowException
157 * @throws Exception
158 */
159 public Object performLogicWithFakedUserSession(String requiredPersonPersonUserId, LogicContainer logicToRun, Object... objects) throws WorkflowException, Exception;
160
161 /**
162 * Sort the below the line elements of the given document
163 *
164 * @param document PurchasingAccountsPayableDocument to be sorted
165 */
166 public void sortBelowTheLine(PurchasingAccountsPayableDocument document);
167
168 /**
169 * Remove items that have not been "entered" which means no data has been added to them so no more processing needs to continue
170 * on these items.
171 *
172 * @param apDocument AccountsPayableDocument which contains list of items to be reviewed
173 */
174 public void deleteUnenteredItems(PurapItemOperations document);
175
176 /**
177 * Saves the document without doing validation by invoking the saveDocument method of documentService.
178 *
179 * @param document The purchase order document to be saved.
180 */
181 public void saveDocumentNoValidation(Document document);
182
183 /**
184 * Determines if a document is in a specified node.
185 *
186 * @param document
187 * @param nodeName
188 * @return
189 */
190 public boolean isDocumentStoppedInRouteNode(PurchasingAccountsPayableDocument document, String nodeName);
191
192 /**
193 * Returns true if the current date falls within the allowed range to encumber in the next fiscal year.
194 *
195 * @return
196 */
197 public boolean allowEncumberNextFiscalYear();
198
199 /**
200 * Returns a list of fiscal years that can be selected from on the document (built for Requisition and Purchase Order).
201 * Typically only the current year is returned. However, if the current date falls within the allowed range to encumber in the
202 * next fiscal year, the current year and the next current year is returned.
203 *
204 * @return List<Integer>
205 */
206 public List<Integer> getAllowedFiscalYears();
207
208 /**
209 * Returns true if today is within the APO allowed date range. If the difference between today and this years closing date is
210 * less than or equal to the number of days allowed for APO.
211 *
212 * @return boolean
213 */
214 public boolean isTodayWithinApoAllowedRange();
215
216 /**
217 * Calculates sales or use tax for each item if sales tax enabled and item is taxable.
218 *
219 * @param purapDocument
220 */
221 public void calculateTax(PurchasingAccountsPayableDocument purapDocument);
222
223 /**
224 * Clears the tax from a document. Useful when changing from use to sales
225 * @param purapDocument document
226 * @param useTax the whether to clear use or sales
227 */
228 public void clearTax(PurchasingAccountsPayableDocument purapDocument, boolean useTax);
229
230 /**
231 * Updates the use tax field, clearing old values if it has changed
232 * @param purapDocument document
233 * @param newUseTaxIndicatorValue useTaxIndicator to change to
234 */
235 public void updateUseTaxIndicator(PurchasingAccountsPayableDocument purapDocument, boolean newUseTaxIndicatorValue);
236
237 /**
238 *
239 * Proation for Trade in and Full Order Discount miscellaneous items.
240 * @param purDoc
241 */
242 public void prorateForTradeInAndFullOrderDiscount(PurchasingAccountsPayableDocument purDoc);
243
244 /**
245 * Determines if the item is taxable based on a decision tree.
246 *
247 * @param useTaxIndicator
248 * @param deliveryState
249 * @param item
250 * @return
251 */
252 public boolean isTaxable(boolean useTaxIndicator, String deliveryState, PurApItem item);
253
254 /**
255 * Determines if the item is taxable based on a decision tree.
256 * Does not consider if item is entered, this is not used to calculate tax,
257 * just if the item is indeed taxable.
258 *
259 * @param useTaxIndicator
260 * @param deliveryState
261 * @param item
262 * @return
263 */
264 public boolean isTaxableForSummary(boolean useTaxIndicator, String deliveryState, PurApItem item);
265
266 /**
267 * Retrieves the delivery state from the document
268 *
269 * @param purapDocument
270 * @return
271 */
272 public String getDeliveryState(PurchasingAccountsPayableDocument purapDocument);
273
274 /**
275 * Determines if the accounting line is taxable based on account and object code.
276 *
277 * @param acctLine
278 * @param deliveryStateTaxable
279 * @return
280 */
281 public boolean isAccountingLineTaxable(PurApAccountingLine acctLine, boolean deliveryStateTaxable);
282
283 /**
284 * Determines if the delivery state is taxable or not. If parameter is Allow and delivery state in list, or parameter is Denied
285 * and delivery state is not in list then state is taxable.
286 *
287 * @param deliveryState
288 * @return
289 */
290 public boolean isDeliveryStateTaxable(String deliveryState);
291
292 public void clearAllTaxes(PurchasingAccountsPayableDocument apDoc);
293
294 /**
295 * Determines if the item type specified conflict with the Account tax policy.
296 *
297 * @param purchasingDocument purchasing document to check
298 * @param item item to check if in conflict with tax policy
299 * @return true if item is in conflict, false otherwise
300 */
301 public abstract boolean isItemTypeConflictWithTaxPolicy(PurchasingDocument purchasingDocument, PurApItem item);
302 }
303