1 /**
2 * Copyright 2005-2016 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.rice.krad.service;
17
18 import org.kuali.rice.kew.api.exception.WorkflowException;
19 import org.kuali.rice.kim.api.identity.Person;
20 import org.kuali.rice.krad.bo.AdHocRouteRecipient;
21 import org.kuali.rice.krad.bo.Note;
22 import org.kuali.rice.krad.document.Document;
23 import org.kuali.rice.krad.exception.ValidationException;
24 import org.kuali.rice.krad.rules.rule.event.DocumentEvent;
25 import org.kuali.rice.krad.rules.rule.event.SaveEvent;
26
27 import java.util.List;
28
29 /**
30 * Defines various operations that support the Document framework.
31 *
32 * The calling code should always use any returned Document object for future operations since a new object will be
33 * created if a passed-in document is saved.
34 *
35 * @author Kuali Rice Team (rice.collab@kuali.org)
36 */
37 public interface DocumentService {
38
39 /**
40 * @param documentHeaderId
41 * @return true if a document with the given documentHeaderId exists
42 */
43 boolean documentExists(String documentHeaderId);
44
45 /**
46 * get a new blank document instance based on the document type name
47 *
48 * @param documentTypeName
49 * @return new document instance
50 */
51 Document getNewDocument(String documentTypeName) throws WorkflowException;
52
53 /**
54 * get a new blank document instance having the given Document class
55 *
56 * @param documentClass
57 * @return new document instance
58 */
59 Document getNewDocument(Class<? extends Document> documentClass) throws WorkflowException;
60
61 /**
62 * get a new blank document instance based on the document type name. The principal name
63 * passed in will be used as the document initiator.
64 *
65 * @param documentTypeName
66 * @param initiatorPrincipalNm
67 * @return new document instance
68 */
69 Document getNewDocument(String documentTypeName, String initiatorPrincipalNm) throws WorkflowException;
70
71 /**
72 * get a document based on the document header id which is the primary key for all document types
73 *
74 * @param documentHeaderId
75 * @return document, by id
76 */
77 Document getByDocumentHeaderId(String documentHeaderId) throws WorkflowException;
78
79 /**
80 * get a document based on the document header id which is the primary key for all document types. Using this
81 * method does not require that GlobalVariables.getUserSession() be populated. Therefore, this method can be used
82 * when a HTTP request is not being processed (e.g. during workflow indexing/post-processing).
83 *
84 * @param documentHeaderId
85 * @return document, by id
86 */
87 Document getByDocumentHeaderIdSessionless(String documentHeaderId) throws WorkflowException;
88
89 /**
90 * This method retrieves a list of fully-populated documents given a list of document header id values.
91 *
92 * @param documentClass
93 * @param documentHeaderIds
94 * @return list of fully-populated documents
95 * @throws WorkflowException
96 */
97 List<Document> getDocumentsByListOfDocumentHeaderIds(Class<? extends Document> documentClass,
98 List<String> documentHeaderIds) throws WorkflowException;
99
100 /**
101 * This method is to allow for documents to be updated. It is currently used to update the document status as
102 * well as to allow for locked docs to be unlocked
103 *
104 * @param document the document to be updated
105 * @return the updated document
106 */
107 Document updateDocument(Document document);
108
109 /**
110 * This is a helper method that performs the same as the {@link #saveDocument(Document, Class)} method. The
111 * convenience of this method is that the event being used is the standard SaveDocumentEvent.
112 *
113 * @see org.kuali.rice.krad.service.DocumentService#saveDocument(Document, Class)
114 */
115 Document saveDocument(Document document) throws WorkflowException;
116
117 /**
118 * This method saves the given document using the document event passed in.
119 *
120 * @see org.kuali.rice.krad.service.DocumentService#saveDocument(Document, Class)
121 */
122 Document saveDocument(Document document, DocumentEvent docEvent) throws WorkflowException;
123
124 /**
125 * Saves the passed-in document. This will persist it both to the Kuali database, and also initiate it
126 * (if necessary) within workflow, so its available in the initiator's action list. This method uses the
127 * passed in DocumentEvent class when saving the document. The DocumentEvent class must implement
128 * the {@link SaveEvent} interface.
129 *
130 * Note that the system does not support passing in Workflow Annotations or AdHoc Route Recipients on a SaveDocument
131 * call. These are sent to workflow on a routeDocument action, or any of the others which actually causes a
132 * routing action to happen in workflow.
133 *
134 * Also note that this method will not check the document action flags to check if a save is valid
135 *
136 * The calling code should always use the object returned from this method for future operations since a new
137 * object is created when the passed-in document is saved.
138 *
139 * @param document the document to be saved
140 * @param kualiDocumentEventClass the event class to use when saving (class must implement the SaveEvent interface)
141 * @return the saved document
142 * @throws WorkflowException
143 */
144 Document saveDocument(Document document,
145 Class<? extends DocumentEvent> kualiDocumentEventClass) throws WorkflowException;
146
147 /**
148 * Save and then route the document, optionally providing an annotation which will show up in the route log
149 * of the document for the action taken, and optionally providing a list of ad hoc recipients for the document.
150 *
151 * @param document the document to be routed
152 * @param annotation the annotation to appear in the route log of the document
153 * @param adHocRoutingRecipients list of ad hoc recipients to which the document will be routed
154 * @return the saved and routed document
155 * @throws WorkflowException
156 */
157 Document routeDocument(Document document, String annotation,
158 List<AdHocRouteRecipient> adHocRoutingRecipients) throws WorkflowException;
159
160 /**
161 * Save and then approve the document, optionally providing an annotation which will show up in the route log
162 * of the document for the action taken, and optionally providing a list of ad hoc recipients for the document.
163 *
164 * @param document the document to be approved
165 * @param annotation the annotation to appear in the route log of the document
166 * @param adHocRoutingRecipients list of ad hoc recipients to which the document will be routed
167 * @return the saved and approved document
168 * @throws WorkflowException
169 */
170 Document approveDocument(Document document, String annotation,
171 List<AdHocRouteRecipient> adHocRoutingRecipients) throws WorkflowException;
172
173 /**
174 * Save and then approve the document as a super user, optionally providing an annotation which will show up in the
175 * route log of the document for the action taken.
176 *
177 * @param document the document to be super user approved
178 * @param annotation the annotation to appear in the route log of the document
179 * @return the saved and super user approved document
180 * @throws WorkflowException
181 */
182 Document superUserApproveDocument(Document document, String annotation) throws WorkflowException;
183
184 /**
185 * Save and then cancel the document as a super user, optionally providing an annotation which will show up in the
186 * route log of the document for the action taken.
187 *
188 * @param document the document to be super user canceled
189 * @param annotation the annotation to appear in the route log of the document
190 * @return the saved and super user canceled document
191 * @throws WorkflowException
192 */
193 Document superUserCancelDocument(Document document, String annotation) throws WorkflowException;
194
195 /**
196 * Save and then disapprove the document as a super user, optionally providing an annotation which will show up
197 * in the route log of the document for the action taken.
198 *
199 * @param document the document to be super user disapproved
200 * @param annotation the annotation to appear in the route log of the document
201 * @return the saved and super user disapproved document
202 * @throws WorkflowException
203 */
204 Document superUserDisapproveDocument(Document document, String annotation) throws WorkflowException;
205
206 /**
207 * Disapprove the document as super user, without saving, optionally providing an annotation which will show
208 * up in the route log of the document for the action taken.
209 *
210 * @param document the document to be super user disapproved
211 * @param annotation the annotation to appear in the route log of the document
212 * @return the super user disapproved document
213 * @throws WorkflowException
214 */
215 Document superUserDisapproveDocumentWithoutSaving(Document document,
216 String annotation) throws WorkflowException;
217
218 /**
219 * Disapprove the document, without saving, optionally providing an annotation which will show up in the route log
220 * of the document for the action taken.
221 *
222 * @param document the document to be disapproved
223 * @param annotation the annotation to appear in the route log of the document
224 * @return the disapproved document
225 * @throws Exception
226 */
227 Document disapproveDocument(Document document, String annotation) throws Exception;
228
229 /**
230 * Cancel the document, without saving, optionally providing an annotation for the disapproval which will show
231 * up in the route log of the document for the action taken.
232 *
233 * @param document the document to be canceled
234 * @param annotation the annotation to appear in the route log of the document
235 * @return the canceled document
236 * @throws WorkflowException
237 */
238 Document cancelDocument(Document document, String annotation) throws WorkflowException;
239
240 /**
241 * Acknowledge the document, optionally providing an annotation for the acknowledgement which will show up in the
242 * route log of the document, and optionally providing a list of ad hoc recipients for the document. The list of
243 * ad hoc recipients for this document should have an action requested of acknowledge or fyi as all other actions
244 * requested will be discarded as invalid due to the fact that this action being taken is an acknowledgement.
245 *
246 * @param document the document to be acknowledged
247 * @param annotation the annotation to appear in the route log of the document
248 * @param adHocRecipients list of ad hoc recipients to which the document will be routed
249 * @return the acknowledged document
250 * @throws WorkflowException
251 */
252 Document acknowledgeDocument(Document document, String annotation,
253 List<AdHocRouteRecipient> adHocRecipients) throws WorkflowException;
254
255 /**
256 * Blanket approve the document which will save the document, approve the document, and stand in for an
257 * approve for all typically generated approval actions requested for this document. The user must have blanket
258 * approval authority for this document by being registered as a user in the blanket approval workgroup that is
259 * associated with this document type. Optionally an annotation can be provided which will show up for the
260 * action taken on the document in the route log. Also optionally a list of ad hoc recipients can be provided
261 * for the document, which should be restricted to actions requested of acknowledge and fyi as all other actions
262 * requested will be discarded.
263 *
264 * @param document the document to be blanket approved
265 * @param annotation the annotation to appear in the route log of the document
266 * @param adHocRecipients list of ad hoc recipients to which the document will be routed
267 * @return the saved and blanket approved document
268 * @throws WorkflowException
269 */
270 Document blanketApproveDocument(Document document, String annotation,
271 List<AdHocRouteRecipient> adHocRecipients) throws WorkflowException;
272
273 /**
274 * Clear the fyi requests for the document, optionally providing a list of ad hoc recipients for the document,
275 * which should be restricted to action requested of fyi as all other actions requested will be discarded.
276 *
277 * @param document the document to clear of fyi requests
278 * @param adHocRecipients list of ad hoc recipients to which the document will be routed
279 * @return the document
280 * @throws WorkflowException
281 */
282 Document clearDocumentFyi(Document document,
283 List<AdHocRouteRecipient> adHocRecipients) throws WorkflowException;
284
285 /**
286 * Sets the title and app document id in the workflow document
287 *
288 * @param document the document to prepare
289 * @throws WorkflowException
290 */
291 void prepareWorkflowDocument(Document document) throws WorkflowException;
292
293 /**
294 * This method creates a note from the given document and note text. The resulting Note will
295 * have it's note type set to the value of {@link Document#getNoteType()}. Additionally, it's
296 * remoteObjectId will be set to the object id of the document's note target.
297 *
298 * @param document the document from which to use the note type and note target when creating the note
299 * @param text the text value to include in the resulting note
300 * @return the note that was created
301 */
302 Note createNoteFromDocument(Document document, String text);
303
304 /**
305 * Saves the notes associated with the given document if they are in a state where they can be
306 * saved. In certain cases they may not be ready to be saved. For example, in maintenance documents
307 * where the notes are associated with the business object instead of the document header, the notes
308 * cannot be saved until the business object itself has been persisted.
309 *
310 * @param document the document for which to save notes
311 * @return true if the notes were saved, false if they were not
312 */
313 boolean saveDocumentNotes(Document document);
314
315 /**
316 * Send ad hoc requests for the given document, optionally providing an annotation which will show up in the route
317 * log of the document. Also optionally providing a list of ad hoc recipients for the document. However if
318 * no ad hoc recipients are provided, no ad hoc requests will be sent.
319 *
320 * @param document the document for which the ad hoc requests are sent
321 * @param annotation the annotation to appear in the route log of the document
322 * @param adHocRecipients list of ad hoc recipients to which the document will be routed
323 * @return the document
324 * @throws WorkflowException
325 */
326 public Document sendAdHocRequests(Document document, String annotation, List<AdHocRouteRecipient> adHocRecipients) throws WorkflowException;
327
328 /**
329 * Builds an workflow notification request for the note and sends it to note recipient.
330 *
331 * @param document - document that contains the note
332 * @param note - note to notify
333 * @param sender - user who is sending the notification
334 * @return the document
335 * @throws WorkflowException
336 */
337 public Document sendNoteRouteNotification(Document document, Note note, Person sender) throws WorkflowException;
338
339 /**
340 * Recall the document, optionally providing an annotation for the recall which will show up in the route
341 * log of the document for the action taken.
342 *
343 * @since 2.1
344 * @param document the document to recall
345 * @param annotation the annotation to appear in the route log of the document
346 * @param cancel indicates if the document should be canceled as part of the recall
347 * @return the recalled document
348 * @throws WorkflowException
349 * @since 2.1
350 */
351 Document recallDocument(Document document, String annotation, boolean cancel) throws WorkflowException;
352
353 /**
354 * Save and then complete the document, optionally providing an annotation which will show up in the route log
355 * of the document for the action taken, and optionally providing a list of ad hoc recipients for the document
356 *
357 * @param document the document to complete
358 * @param annotation the annotation to appear in the route log of the document
359 * @param adHocRecipients list of ad hoc recipients to which the document will be routed
360 * @return the saved and completed document
361 */
362 Document completeDocument(Document document, String annotation,
363 List adHocRecipients) throws WorkflowException;
364
365 /**
366 * Helper method used to save and validate a document
367 *
368 * @param document document to be validated and persisted
369 * @param event indicates which kualiDocumentEvent was requested
370 * @return the saved document
371 */
372 Document validateAndPersistDocument(Document document, DocumentEvent event) throws ValidationException;
373 }