1 /**
2 * Copyright 2005-2012 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.rules.rule.event.KualiDocumentEvent;
24 import org.kuali.rice.krad.rules.rule.event.SaveEvent;
25
26 import java.util.List;
27
28 /**
29 * Defines various operations that support the Document framework.
30 *
31 * @author Kuali Rice Team (rice.collab@kuali.org)
32 */
33 public interface DocumentService {
34
35 /**
36 * @param documentHeaderId
37 * @return true if a document with the given documentHeaderId exists
38 */
39 public boolean documentExists(String documentHeaderId);
40
41 /**
42 * get a new blank document instance based on the document type name
43 *
44 * @param documentTypeName
45 * @return
46 */
47 public Document getNewDocument(String documentTypeName) throws WorkflowException;
48
49 /**
50 * get a new blank document instance having the given Document class
51 *
52 * @param documentClass
53 * @return
54 */
55 public Document getNewDocument(Class<? extends Document> documentClass) throws WorkflowException;
56
57 /**
58 * get a document based on the document header id which is the primary key for all document types
59 *
60 * @param documentHeaderId
61 * @return
62 */
63 public Document getByDocumentHeaderId(String documentHeaderId) throws WorkflowException;
64 /**
65 * get a document based on the document header id which is the primary key for all document types. Using this method
66 * does not require that GlobalVariables.getUserSession() be populated. Therefore, this method can be used when a HTTP request
67 * is not being processed (e.g. during workflow indexing/post-processing).
68 *
69 * @param documentHeaderId
70 * @return
71 */
72 public Document getByDocumentHeaderIdSessionless(String documentHeaderId) throws WorkflowException;
73
74 /**
75 * This method retrieves a list of fully-populated documents given a list of document header id values.
76 *
77 * @param clazz
78 * @param documentHeaderIds
79 * @return List of fully-populated documents
80 * @throws WorkflowException
81 */
82 public List<Document> getDocumentsByListOfDocumentHeaderIds(Class<? extends Document> documentClass, List<String> documentHeaderIds) throws WorkflowException;
83
84 /**
85 *
86 * This method is to allow for documents to be updated which is currently used to update the document status as well as to allow
87 * for locked docs to be unlocked
88 *
89 * @param document
90 */
91 public Document updateDocument(Document document);
92
93 /**
94 * This is a helper method that performs the same as the {@link #saveDocument(Document, Class)} method. The convenience
95 * of this method is that the event being used is the standard SaveDocumentEvent.
96 *
97 * @see org.kuali.rice.krad.service.DocumentService#saveDocument(Document, Class)
98 */
99 public Document saveDocument(Document document) throws WorkflowException;
100
101 /**
102 * Saves the passed-in document. This will persist it both to the Kuali database, and also initiate it (if necessary) within
103 * workflow, so its available in the initiator's action list. This method uses the passed in KualiDocumentEvent class when saving
104 * the document. The KualiDocumentEvent class must implement the {@link SaveEvent} interface.
105 *
106 * Note that the system does not support passing in Workflow Annotations or AdHoc Route Recipients on a SaveDocument call. These
107 * are sent to workflow on a routeDocument action, or any of the others which actually causes a routing action to happen in
108 * workflow.
109 *
110 * NOTE: This method will not check the document action flags to check if a save is valid
111 *
112 * @param document The document to be saved
113 * @param kualiDocumentEventClass The event class to use when saving (class must implement the SaveEvent interface)
114 * @return the document that was passed in
115 * @throws WorkflowException
116 */
117 public Document saveDocument(Document document, Class<? extends KualiDocumentEvent> kualiDocumentEventClass) throws WorkflowException;
118
119 /**
120 * start the route the document for approval, optionally providing a list of ad hoc recipients, and additionally provideing a
121 * annotation to show up in the route log for the document
122 *
123 * @param document
124 * @param annotation
125 * @param adHocRoutingRecipients
126 * @return
127 * @throws ValidationErrorList
128 */
129 public Document routeDocument(Document document, String annotation, List<AdHocRouteRecipient> adHocRoutingRecipients) throws WorkflowException;
130
131 /**
132 * approve this document, optionally providing an annotation which will show up in the route log for this document for this
133 * action taken, and optionally providing a list of ad hoc recipients for the document
134 *
135 * @param document
136 * @param annotation
137 * @param adHocRoutingRecipients
138 * @return
139 * @throws ValidationErrorList
140 */
141 public Document approveDocument(Document document, String annotation, List<AdHocRouteRecipient> adHocRoutingRecipients) throws WorkflowException;
142
143 /**
144 * approve this document as super user, optionally providing an annotation which will show up in the route log for this document
145 * for this action taken
146 *
147 * @param document
148 * @param annotation
149 * @return
150 * @throws ValidationErrorList
151 */
152 public Document superUserApproveDocument(Document document, String annotation) throws WorkflowException;
153
154 /**
155 * cancel this document as super user, optionally providing an annotation which will show up in the route log for this document
156 * for this action taken
157 *
158 * @param document
159 * @param annotation
160 * @return
161 * @throws WorkflowException
162 */
163 public Document superUserCancelDocument(Document document, String annotation) throws WorkflowException;
164
165 /**
166 * disapprove this document as super user, optionally providing an annotation which will show up in the route log for this document
167 * for this action taken
168 *
169 * @param document
170 * @param annotation
171 * @return
172 * @throws WorkflowException
173 */
174 public Document superUserDisapproveDocument(Document document, String annotation) throws WorkflowException;
175
176 /**
177 * disapprove this document, optionally providing an annotation for the disapproval which will show up in the route log for the
178 * document for this action taken
179 *
180 * @param document
181 * @param annotation
182 * @return Document
183 * @throws Exception
184 */
185 public Document disapproveDocument(Document document, String annotation) throws Exception;
186
187 /**
188 * cancel this document, optionally providing an annotation for the disapproval which will show up in the route log for the
189 * document for this action taken
190 *
191 * @param document
192 * @param annotation
193 * @return
194 */
195 public Document cancelDocument(Document document, String annotation) throws WorkflowException;
196
197 /**
198 * acknowledge this document, optionally providing an annotation for the acknowledgement which will show up in the route log for
199 * the document for this acknowledgement, additionally optionally provide a list of ad hoc recipients that should recieve this
200 * document. The list of ad hoc recipients for this document should have an action requested of acknowledge or fyi as all other
201 * actions requested will be discarded as invalid based on the action being taken being an acknowledgement.
202 *
203 * @param document
204 * @param annotation
205 * @param adHocRecipients
206 * @return
207 */
208 public Document acknowledgeDocument(Document document, String annotation, List<AdHocRouteRecipient> adHocRecipients) throws WorkflowException;
209
210 /**
211 * blanket approve this document which will approve the document and stand in for an approve for all typically generated
212 * approval actions requested for this document. The user must have blanket approval authority for this document by being
213 * registered as a user in the blanket approval workgroup that is associated with this document type. Optionally an annotation
214 * can be provided which will show up for this action taken on the document in the route log. Additionally optionally provide a
215 * list of ad hoc recipients for this document, which should be restricted to actions requested of acknowledge and fyi as all
216 * other actions requested will be discarded
217 *
218 * @param document
219 * @param annotation
220 * @param adHocRecipients
221 * @return
222 * @throws ValidationErrorList
223 */
224 public Document blanketApproveDocument(Document document, String annotation, List<AdHocRouteRecipient> adHocRecipients) throws WorkflowException;
225
226 /**
227 * clear the fyi request for this document, optionally providing a list of ad hoc recipients for this document, which should be
228 * restricted to action requested of fyi as all other actions requested will be discarded
229 *
230 * @param document
231 * @param adHocRecipients
232 * @return
233 */
234 public Document clearDocumentFyi(Document document, List<AdHocRouteRecipient> adHocRecipients) throws WorkflowException;
235
236 /**
237 * Sets the title and app document id in the workflow document
238 *
239 * @param document
240 * @throws WorkflowException
241 */
242 public void prepareWorkflowDocument(Document document) throws WorkflowException;
243
244
245 /**
246 * This method creates a note from a given document and note text. The resulting Note will
247 * have it's note type set to the value of {@link Document#getNoteType()}. Additionally, it's
248 * remoteObjectId will be set to the object id of the document's note target.
249 *
250 * @param document the document from which to use the note type and note target when creating the note
251 * @param text the text value to include in the resulting note
252 * @return the note that was created
253 */
254 public Note createNoteFromDocument(Document document, String text);
255
256 /**
257 * Saves the notes associated with the given document if they are in a state where they can be
258 * saved. In certain cases they may not be ready to be saved. For example, in maintenance documents
259 * where the notes are associated with the business object instead of the document header, the notes
260 * cannot be saved until the business object itself has been persisted.
261 *
262 * @param document the document for which to save notes
263 * @return true if the notes were saved, false if they were not
264 */
265 public boolean saveDocumentNotes(Document document);
266
267 public void sendAdHocRequests(Document document, String annotation, List<AdHocRouteRecipient> adHocRecipients) throws WorkflowException;
268
269 /**
270 * Builds an workflow notification request for the note and sends it to note recipient.
271 *
272 * @param document - document that contains the note
273 * @param note - note to notify
274 * @param sender - user who is sending the notification
275 * @throws WorkflowException
276 */
277 public void sendNoteRouteNotification(Document document, Note note, Person sender) throws WorkflowException;
278 }