[Home] [Help]
PACKAGE BODY: APPS.JTF_TASK_WORKFLOW_PKG
Source
1 PACKAGE BODY JTF_TASK_WORKFLOW_PKG as
2 /* $Header: jtftkwfb.pls 120.3 2006/02/23 22:16:32 sbarat ship $ */
3
4 g_pkg_name CONSTANT VARCHAR2(30) := 'JTF_TASK_WORKFLOW_PKG';
5 temp1 number := 1 ;
6
7 -- -----------------------------------------------------------------------
8 -- Is_Task_Item_Active
9 -- Determine whether the workflow process identified by the given process
10 -- ID for the given task is still active.
11 -- IN
12 -- p_task_id : task ID
13 -- p_wf_process_id : workflow process ID for this task ID
14 -- RETURN
15 -- 'Y' if process is active, 'N' otherwise
16 -- -----------------------------------------------------------------------
17
18 FUNCTION Is_Task_Item_Active
19 ( p_task_id IN NUMBER,
20 p_wf_process_id IN NUMBER ) RETURN VARCHAR2 IS
21
22
23
24 l_itemkey VARCHAR2(240);
25 l_dummy VARCHAR2(1);
26 l_end_date DATE;
27 l_result VARCHAR2(1);
28
29 CURSOR l_task_csr IS
30 SELECT end_date
31 FROM wf_items
32 WHERE item_type = 'JTFTASK'
33 AND item_key = l_itemkey;
34
35 BEGIN
36 --
37 -- First construct the item key
38 -- If we ever change the format of the itemkey, the following code
39 -- must be updated
40 --
41 l_itemkey := to_char(p_task_id)||'-'||to_char(p_wf_process_id);
42
43 --
44 -- An item is considered active if its end_date is NULL
45 --
46 OPEN l_task_csr;
47 FETCH l_task_csr INTO l_end_date;
48 IF ((l_task_csr%NOTFOUND) OR (l_end_date IS NOT NULL)) THEN
49 l_result := 'N';
50 ELSE
51 l_result := 'Y';
52 END IF;
53 CLOSE l_task_csr;
54
55 return l_result;
56
57 END Is_Task_Item_Active;
58
59 -- -------------------------------------------------------------------
60 -- Get_Workflow_Display_Name
61 -- -------------------------------------------------------------------
62
63 FUNCTION Get_Workflow_Disp_Name (
64 p_item_type IN VARCHAR2,
65 p_process_name IN VARCHAR2,
66 p_raise_error IN BOOLEAN DEFAULT FALSE )
67 RETURN VARCHAR2 IS
68
69 l_display_name VARCHAR2(80);
70
71 BEGIN
72 IF (p_process_name IS NULL) OR
73 (p_item_type IS NULL) THEN
74 RETURN NULL;
75 END IF;
76
77 SELECT display_name INTO l_display_name
78 FROM WF_RUNNABLE_PROCESSES_V
79 WHERE item_type = p_item_type
80 AND process_name = p_process_name;
81
82 return l_display_name;
83
84
85 EXCEPTION
86 WHEN NO_DATA_FOUND THEN
87 IF (p_raise_error = TRUE) THEN
88 raise;
89 ELSE
90 return NULL;
91 END IF;
92 END Get_Workflow_Disp_Name;
93
94 PROCEDURE check_event (
95 itemtype IN VARCHAR2,
96 itemkey IN VARCHAR2,
97 actid IN NUMBER,
98 funcmode IN VARCHAR2,
99 resultout OUT NOCOPY VARCHAR2
100 )
101 IS
102 l_resultout VARCHAR2(200);
103 x varchar2(200);
104 BEGIN
105 --
106 -- RUN mode - normal process execution
107 --
108 IF (funcmode = 'RUN')
109 THEN
110 --
111 -- Return process to run
112 --
113 l_resultout :=
114 wf_engine.getitemattrtext (
115 itemtype => itemtype,
116 itemkey => itemkey,
117 aname => 'TASK_EVENT'
118 );
119 resultout := 'COMPLETE:' || l_resultout;
120
121 RETURN;
122 END IF;
123
124 --
125 -- CANCEL mode - activity 'compensation'
126 --
127 IF (funcmode = 'CANCEL')
128 THEN
129 --
130 -- Return process to run
131 --
132 resultout := 'COMPLETE';
133 RETURN;
134 END IF;
135
136 --
137 -- TIMEOUT mode
138 --
139 IF (funcmode = 'TIMEOUT')
140 THEN
141 resultout := 'COMPLETE';
142 RETURN;
143 END IF;
144 --
145
146 EXCEPTION
147 WHEN OTHERS
148 THEN
149 wf_core.context (
150 'JTFTASK',
151 'Check Event',
152 itemtype,
153 itemkey,
154 actid,
155 funcmode
156 );
157 RAISE;
158 END check_event;
159
160
161 FUNCTION default_task_details_tbl return task_details_tbl is
162 begin
163 return g_miss_task_details_tbl;
164 end;
165
166 PROCEDURE start_task_workflow (
167 p_api_version IN NUMBER,
168 p_init_msg_list IN VARCHAR2 DEFAULT fnd_api.g_false,
169 p_commit IN VARCHAR2 DEFAULT fnd_api.g_false,
170 p_task_id IN NUMBER,
171 p_old_assignee_code IN VARCHAR2 DEFAULT NULL,
172 p_old_assignee_id IN NUMBER DEFAULT NULL,
173 p_new_assignee_code IN VARCHAR2 DEFAULT NULL,
174 p_new_assignee_id IN NUMBER DEFAULT NULL,
175 p_old_owner_code IN VARCHAR2 DEFAULT NULL,
176 p_old_owner_id IN NUMBER DEFAULT NULL,
177 p_new_owner_code IN VARCHAR2 DEFAULT NULL,
178 p_new_owner_id IN NUMBER DEFAULT NULL,
179 p_task_details_tbl IN task_details_tbl
180 DEFAULT g_miss_task_details_tbl,
181 p_event IN VARCHAR2,
182 p_wf_display_name IN VARCHAR2 DEFAULT NULL,
183 p_wf_process IN VARCHAR2 DEFAULT 'TASK_WORKFLOW',
184 p_wf_item_type IN VARCHAR2 DEFAULT 'JTFTASK',
185 x_return_status OUT NOCOPY VARCHAR2,
186 x_msg_count OUT NOCOPY NUMBER,
187 x_msg_data OUT NOCOPY VARCHAR2
188 )
189 IS
190 l_api_version CONSTANT NUMBER
191 := 1.0;
192 l_api_name CONSTANT VARCHAR2(30)
193 := 'START_TASK_WORKFLOW';
194 l_wf_process_id NUMBER;
195 l_itemkey wf_item_activity_statuses.item_key%TYPE;
196 l_old_assigned_user_name fnd_user.user_name%TYPE;
197 l_new_assigned_user_name fnd_user.user_name%TYPE;
198 l_owner_user_name fnd_user.user_name%TYPE;
199 l_task_name jtf_tasks_tl.task_name%TYPE;
200 l_description jtf_tasks_tl.description%TYPE;
201 l_owner_code jtf_tasks_b.owner_type_code%TYPE;
202 l_owner_id jtf_tasks_b.owner_id%TYPE;
203 l_task_number jtf_tasks_b.task_number%TYPE;
204 l_task_status_name jtf_tasks_v.task_status%type ;
205 l_task_type_name jtf_tasks_v.task_type%type ;
206 l_task_priority_name jtf_tasks_v.task_priority%type ;
207 current_record NUMBER;
208 source_text VARCHAR2(200);
209 l_errname varchar2(60);
210 l_errmsg varchar2(2000);
211 l_errstack varchar2(4000);
212
213 CURSOR c_wf_processs_id
214 IS
215 SELECT jtf_task_workflow_process_s.nextval
216 FROM dual;
217
218 -- Commented out by SBARAT on 23/02/2006 for bug# 5045559
219 /*CURSOR c_task_details
220 IS
221 SELECT task_name, description, owner_type_code owner_code, owner_id, task_number
222 FROM jtf_tasks_v
223 WHERE task_id = p_task_id;*/
224
225 -- Added by SBARAT on 23/02/2006 for bug# 5045559
226 CURSOR c_task_details
227 IS
228 SELECT a.task_name, a.description, a.owner_type_code owner_code, a.owner_id, a.task_number
229 FROM jtf_tasks_vl a
230 WHERE a.task_id = p_task_id
231 AND (a.deleted_flag <> 'Y' OR a.deleted_flag is null)
232 AND a.task_type_id <> 22;
233
234 BEGIN
235
236
237
238 SAVEPOINT start_task_workflow;
239 x_return_status := fnd_api.g_ret_sts_success;
240
241 IF NOT fnd_api.compatible_api_call (
242 l_api_version,
243 p_api_version,
244 l_api_name,
245 g_pkg_name
246 )
247 THEN
248 RAISE fnd_api.g_exc_unexpected_error;
249 END IF;
250
251 IF fnd_api.to_boolean (p_init_msg_list)
252 THEN
253 fnd_msg_pub.initialize;
254 END IF;
255
256
257
258 --- write the code for the selector in case the process name is not given
259 IF p_event NOT IN ('ADD_ASSIGNEE',
260 'CHANGE_ASSIGNEE',
261 'DELETE_ASSIGNEE',
262 'CHANGE_OWNER',
263 'CHANGE_TASK_DETAILS'
264 )
265 THEN
266 null;
267 fnd_message.set_name ('JTF', 'JTF_TASK_INVALID_EVENT');
268 fnd_msg_pub.add;
269 RAISE fnd_api.g_exc_unexpected_error;
270 END IF;
271
272 OPEN c_wf_processs_id;
273 FETCH c_wf_processs_id INTO l_wf_process_id;
274 CLOSE c_wf_processs_id;
275 l_itemkey := TO_CHAR (p_task_id) || '-' || TO_CHAR (l_wf_process_id);
276 OPEN c_task_details;
277 FETCH c_task_details INTO l_task_name,
278 l_description,
279 l_owner_code,
280 l_owner_id,
281 l_task_number;
282
283 IF c_task_details%NOTFOUND
284 THEN
285 fnd_message.set_name ('JTF', 'JTF_TASK_INVALID_ID');
286 fnd_msg_pub.add;
287 RAISE fnd_api.g_exc_unexpected_error;
288 END IF;
289
290 CLOSE c_task_details;
291 wf_engine.createprocess (
292 itemtype => 'JTFTASK',
293 itemkey => l_itemkey,
294 process => p_wf_process
295 );
296 wf_engine.setitemuserkey (
297 itemtype => 'JTFTASK',
298 itemkey => l_itemkey,
299 userkey => l_task_name
300 );
301
302 wf_engine.setitemattrtext (
303 itemtype => 'JTFTASK',
304 itemkey => l_itemkey,
305 aname => 'TASK_NAME',
306 avalue => l_task_name
307 );
308 wf_engine.setitemattrtext (
309 itemtype => 'JTFTASK',
310 itemkey => l_itemkey,
311 aname => 'TASK_DESC',
312 avalue => l_description
313 );
314
315 wf_engine.setitemattrtext (
316 itemtype => 'JTFTASK',
317 itemkey => l_itemkey,
318 aname => 'TASK_NUMBER',
319 avalue => l_task_number
320 );
321
322 -- Commented out by SBARAT on 23/02/2006 for bug# 5045559
323 /*select task_status, task_priority , task_type
324 into l_task_status_name, l_task_priority_name , l_task_type_name
325 from jtf_tasks_v where task_id = p_task_id ;*/
326
327 -- Added by SBARAT on 23/02/2006 for bug# 5045559
328 select b.name task_status, c.name task_priority , d.name task_type
329 into l_task_status_name, l_task_priority_name , l_task_type_name
330 from jtf_tasks_b a,
331 jtf_task_statuses_tl b,
332 jtf_task_priorities_tl c,
333 jtf_task_types_tl d
334 where a.task_id = p_task_id
335 and (a.deleted_flag <> 'Y' OR a.deleted_flag is null)
336 and d.task_type_id <> 22
337 and b.task_status_id=a.task_status_id
338 and c.task_priority_id=a.task_priority_id
339 and d.task_type_id=a.task_type_id
340 and b.language=userenv('lang')
341 and c.language=userenv('lang')
342 and d.language=userenv('lang');
343
344 wf_engine.setitemattrtext (
345 itemtype => 'JTFTASK',
346 itemkey => l_itemkey,
347 aname => 'TASK_STATUS_NAME',
348 avalue => l_task_status_name
349 );
350
351 wf_engine.setitemattrtext (
352 itemtype => 'JTFTASK',
353 itemkey => l_itemkey,
354 aname => 'TASK_PRIORITY_NAME',
355 avalue => l_task_priority_name
356 );
357
358 wf_engine.setitemattrtext (
359 itemtype => 'JTFTASK',
360 itemkey => l_itemkey,
361 aname => 'TASK_TYPE_NAME',
362 avalue => l_task_type_name
363 );
364
365 ----
366 ---- Task Owner
367 ----
368 l_owner_user_name := jtf_rs_resource_pub.get_wf_role( l_owner_id );
369
370 if l_owner_user_name is null then
371 raise fnd_api.g_exc_unexpected_error;
372 end if ;
373
374 wf_engine.setitemattrtext (
375 itemtype => 'JTFTASK',
376 itemkey => l_itemkey,
377 aname => 'OWNER_ID',
378 avalue => l_owner_user_name
379 );
380 wf_engine.setitemattrtext (
381 itemtype => 'JTFTASK',
382 itemkey => l_itemkey,
383 aname => 'OWNER_NAME',
384 -- avalue => wf_directory.getroledisplayname (l_owner_user_name)
385 avalue => jtf_task_utl.get_owner(l_owner_code, l_owner_id)
386 );
387 wf_engine.setitemattrtext (
388 itemtype => 'JTFTASK',
389 itemkey => l_itemkey,
390 aname => 'TASK_DESC',
391 avalue => l_description
392 );
393
394
395 IF p_event = 'ADD_ASSIGNEE'
396 THEN
397 IF ( p_new_assignee_code IS NULL
398 OR p_new_assignee_id IS NULL)
399 THEN
400 null ;
401 fnd_message.set_name ('JTF', 'JTF_TASK_INVALID_ASSIGNEE_DETAILS');
402 fnd_msg_pub.add;
403 ELSE
404 l_new_assigned_user_name := jtf_rs_resource_pub.get_wf_role( p_new_assignee_id );
405
406 if l_new_assigned_user_name is null then
407 raise fnd_api.g_exc_unexpected_error;
408 end if ;
409
410
411
412
413
414
415
416 wf_engine.setitemattrtext (
417 itemtype => 'JTFTASK',
418 itemkey => l_itemkey,
419 aname => 'TASK_EVENT',
420 avalue => 'NOTIFY_NEW_ASSIGNEE'
421 );
422
423 wf_engine.setitemattrtext (
424 itemtype => 'JTFTASK',
425 itemkey => l_itemkey,
426 aname => 'NEW_TASK_ASSIGNEE_ID',
427 avalue => l_new_assigned_user_name
428 );
429
430
431
432 wf_engine.setitemattrtext (
433 itemtype => 'JTFTASK',
434 itemkey => l_itemkey,
435 aname => 'NEW_TASK_ASSIGNEE_NAME',
436 avalue => wf_directory.getroledisplayname (
437 l_new_assigned_user_name
438 )
439 );
440
441
442
443 END IF;
444 END IF;
445
446
447
448 IF p_event = 'CHANGE_ASSIGNEE'
449 THEN
450 IF ( p_old_assignee_code IS NULL
451 OR p_old_assignee_id IS NULL)
452 THEN
453 null ;
454 fnd_message.set_name ('JTF', 'JTF_TASK_INVALID_ASSIGNEE_DETAILS');
455 fnd_msg_pub.add;
456 ELSIF ( p_old_assignee_code IS NULL
457 OR p_old_assignee_id IS NULL)
458 THEN
459
460 fnd_message.set_name ('JTF', 'JTF_TASK_INVALID_ASSIGNEE_DETAILS');
461 fnd_msg_pub.add;
462 ELSE
463 l_new_assigned_user_name := jtf_rs_resource_pub.get_wf_role( p_new_assignee_id );
464
465 if l_new_assigned_user_name is null then
466 raise fnd_api.g_exc_unexpected_error;
467 end if ;
468 l_old_assigned_user_name := jtf_rs_resource_pub.get_wf_role( p_old_assignee_id );
469 if l_old_assigned_user_name is null then
470 raise fnd_api.g_exc_unexpected_error;
471 end if ;
472
473
474 wf_engine.setitemattrtext (
475 itemtype => 'JTFTASK',
476 itemkey => l_itemkey,
477 aname => 'TASK_EVENT',
478 avalue => 'CHANGE_ASSIGNEE'
479 );
480
481 wf_engine.setitemattrtext (
482 itemtype => 'JTFTASK',
483 itemkey => l_itemkey,
484 aname => 'NEW_TASK_ASSIGNEE_ID',
485 avalue => l_new_assigned_user_name
486 );
487
488
489
490
491 wf_engine.setitemattrtext (
492 itemtype => 'JTFTASK',
493 itemkey => l_itemkey,
494 aname => 'NEW_TASK_ASSIGNEE_NAME',
495 avalue => wf_directory.getroledisplayname (
496 l_new_assigned_user_name
497 )
498 );
499
500 wf_engine.setitemattrtext (
501 itemtype => 'JTFTASK',
502 itemkey => l_itemkey,
503 aname => 'OLD_TASK_ASSIGNEE_ID',
504 avalue => l_old_assigned_user_name
505 );
506
507
508
509 wf_engine.setitemattrtext (
510 itemtype => 'JTFTASK',
511 itemkey => l_itemkey,
512 aname => 'OLD_TASK_ASSIGNEE_NAME',
513 avalue => wf_directory.getroledisplayname (
514 l_old_assigned_user_name
515 )
516 );
517
518 END IF;
519 END IF;
520
521
522 IF p_event = 'DELETE_ASSIGNEE'
523 THEN
524
525 IF ( p_old_assignee_code IS NULL
526 OR p_old_assignee_id IS NULL)
527 THEN
528 fnd_message.set_name ('JTF', 'JTF_TASK_INVALID_ASSIGNEE_DETAILS');
529 fnd_msg_pub.add;
530 ELSE
531
532 l_old_assigned_user_name := jtf_rs_resource_pub.get_wf_role( p_old_assignee_id );
533
534 if l_old_assigned_user_name is null then
535 raise fnd_api.g_exc_unexpected_error;
536 end if ;
537 wf_engine.setitemattrtext (
538 itemtype => 'JTFTASK',
539 itemkey => l_itemkey,
540 aname => 'TASK_EVENT',
541 avalue => 'ASSIGNEE_REMOVAL'
542 );
543 wf_engine.setitemattrtext (
544 itemtype => 'JTFTASK',
545 itemkey => l_itemkey,
546 aname => 'OLD_TASK_ASSIGNEE_ID',
547 avalue => l_old_assigned_user_name
548 );
549 wf_engine.setitemattrtext (
550 itemtype => 'JTFTASK',
551 itemkey => l_itemkey,
552 aname => 'OLD_TASK_ASSIGNEE_NAME',
553 avalue => wf_directory.getroledisplayname (
554 l_old_assigned_user_name
555 )
556 );
557 END IF;
558 END IF;
559
560
561 IF p_event = 'CHANGE_OWNER'
562 THEN
563 IF ( p_old_owner_code IS NULL
564 OR p_old_owner_id IS NULL)
565 THEN
566 fnd_message.set_name ('JTF', 'JTF_TASK_INVALID_OWNER_DETAILS');
567 fnd_msg_pub.add;
568 ELSIF ( p_new_owner_code IS NULL
569 OR p_new_owner_id IS NULL)
570 THEN
571 fnd_message.set_name ('JTF', 'JTF_TASK_INVALID_OWNER_DETAILS');
572 fnd_msg_pub.add;
573 ELSE
574
575 l_new_assigned_user_name := jtf_rs_resource_pub.get_wf_role( p_new_owner_id );
576 if l_new_assigned_user_name is null then
577 raise fnd_api.g_exc_unexpected_error;
578 end if ;
579
580 l_old_assigned_user_name := jtf_rs_resource_pub.get_wf_role( p_old_owner_id );
581 if l_old_assigned_user_name is null then
582 raise fnd_api.g_exc_unexpected_error;
583 end if ;
584 wf_engine.setitemattrtext (
585 itemtype => 'JTFTASK',
586 itemkey => l_itemkey,
587 aname => 'TASK_EVENT',
588 avalue => 'CHANGE_OWNER'
589 );
590 wf_engine.setitemattrtext (
591 itemtype => 'JTFTASK',
592 itemkey => l_itemkey,
593 aname => 'OLD_TASK_OWNER_ID',
594 avalue => l_old_assigned_user_name
595 );
596 wf_engine.setitemattrtext (
597 itemtype => 'JTFTASK',
598 itemkey => l_itemkey,
599 aname => 'OLD_TASK_OWNER_NAME',
600 avalue => wf_directory.getroledisplayname (
601 l_old_assigned_user_name
602 )
603 );
604 wf_engine.setitemattrtext (
605 itemtype => 'JTFTASK',
606 itemkey => l_itemkey,
607 aname => 'NEW_TASK_OWNER_ID',
608 avalue => l_new_assigned_user_name
609 );
610 wf_engine.setitemattrtext (
611 itemtype => 'JTFTASK',
612 itemkey => l_itemkey,
613 aname => 'NEW_TASK_OWNER_NAME',
614 avalue => wf_directory.getroledisplayname (
615 l_new_assigned_user_name
616 )
617 );
618 END IF;
619 END IF;
620
621
622 IF p_event = 'CHANGE_TASK_DETAILS'
623 THEN
624 wf_engine.setitemattrtext (
625 itemtype => 'JTFTASK',
626 itemkey => l_itemkey,
627 aname => 'TASK_EVENT',
628 avalue => 'CHANGE_TASK_DETAILS'
629 );
630
631 IF p_task_details_tbl.COUNT > 0
632 THEN
633 current_record := p_task_details_tbl.FIRST;
634 source_text := '';
635
636 FOR i IN 1 .. p_task_details_tbl.COUNT
637 LOOP
638 source_text :=
639 source_text ||
640 p_task_details_tbl (current_record).task_attribute ||
641 ' ' ||
642 p_task_details_tbl (current_record).old_value ||
643 ' ' ||
644 p_task_details_tbl (current_record).new_value
645 ;
646
647 current_record := p_task_details_tbl.NEXT (current_record);
648
649 END LOOP;
650 ELSE
651 fnd_message.set_name ('JTF', 'JTF_TASK_NO_ATTRIBUTES_PASSED');
652 fnd_msg_pub.add;
653 END IF;
654
655 wf_engine.setitemattrtext (
656 itemtype => 'JTFTASK',
657 itemkey => l_itemkey,
658 aname => 'TASK_TEXT',
659 avalue => source_text
660 );
661 END IF;
662
663
664
665 wf_engine.startprocess (
666 itemtype => 'JTFTASK',
667 itemkey => l_itemkey
668 );
669
670 IF fnd_api.to_boolean (p_commit)
671 THEN
672 COMMIT WORK;
673 END IF;
674
675
676 fnd_msg_pub.count_and_get (p_count => x_msg_count, p_data => x_msg_data);
677
678 EXCEPTION
679 WHEN fnd_api.g_exc_unexpected_error
680 THEN
681
682 ROLLBACK TO start_task_workflow;
683 x_return_status := fnd_api.g_ret_sts_unexp_error;
684 fnd_msg_pub.count_and_get (
685 p_count => x_msg_count,
686 p_data => x_msg_data
687 );
688 WHEN OTHERS
689 THEN
690 ROLLBACK TO start_task_workflow ;
691
692 wf_core.get_error(l_errname, l_errmsg, l_errstack);
693
694 if (l_errname is not null) then
695 fnd_message.set_name('FND', 'WF_ERROR');
696 fnd_message.set_token('ERROR_MESSAGE', l_errmsg);
697 fnd_message.set_token('ERROR_STACK', l_errstack);
698 fnd_msg_pub.add;
699 end if;
700
701 ---fnd_message.set_name ('JTF', 'JTF_TASK_UNKNOWN_ERROR');
702 ---fnd_message.set_token ('P_TEXT', SQLCODE || SQLERRM);
703 x_return_status := fnd_api.g_ret_sts_unexp_error;
704 fnd_msg_pub.count_and_get (p_count => x_msg_count, p_data => x_msg_data);
705 END;
706
707
708 PROCEDURE abort_task_workflow (
709 p_api_version IN NUMBER,
710 p_init_msg_list IN VARCHAR2 DEFAULT fnd_api.g_false,
711 p_commit IN VARCHAR2 DEFAULT fnd_api.g_false,
712 p_task_id IN NUMBER,
713 p_wf_process_id IN NUMBER,
714 p_user_code IN VARCHAR2,
715 p_user_id IN NUMBER,
716 x_return_status OUT NOCOPY VARCHAR2,
717 x_msg_count OUT NOCOPY NUMBER,
718 x_msg_data OUT NOCOPY VARCHAR2
719 )
720 IS
721 CURSOR c_task_details
722 IS
723 SELECT task_name, description, owner_type_code owner_code, owner_id
724 FROM jtf_tasks_vl
725 WHERE task_id = p_task_id;
726
727 l_api_version CONSTANT NUMBER := 1.0;
728 l_api_name CONSTANT VARCHAR2(30)
729 := 'ABORT_TASK_WORKFLOW';
730 l_wf_process_id NUMBER;
731 l_itemkey wf_item_activity_statuses.item_key%TYPE;
732 l_task_name jtf_tasks_tl.task_name%TYPE;
733 l_description jtf_tasks_tl.description%TYPE;
734 l_owner_code jtf_tasks_b.owner_type_code%TYPE;
735 l_owner_id jtf_tasks_b.owner_id%TYPE;
736 l_aborted_by_user_name fnd_user.user_name%TYPE;
737 l_task_owner_name fnd_user.user_name%TYPE;
738 l_context VARCHAR2(100);
739 l_notification_id NUMBER;
740 wf_not_active EXCEPTION;
741 BEGIN
742 SAVEPOINT abort_task_workflow;
743
744 x_return_status := fnd_api.g_ret_sts_success;
745
746 IF NOT fnd_api.compatible_api_call (
747 l_api_version,
748 p_api_version,
749 l_api_name,
750 g_pkg_name
751 )
752 THEN
753 RAISE fnd_api.g_exc_unexpected_error;
754 END IF;
755
756 IF fnd_api.to_boolean (p_init_msg_list)
757 THEN
758 fnd_msg_pub.initialize;
759 END IF;
760
761
762 l_itemkey := TO_CHAR (p_task_id) || '-' || TO_CHAR (p_wf_process_id);
763
764 IF jtf_task_workflow_pkg.is_task_item_active (
765 p_task_id => p_task_id,
766 p_wf_process_id => p_wf_process_id
767 ) =
768 'N'
769 THEN
770 RAISE wf_not_active;
771 END IF;
772
773 l_aborted_by_user_name := jtf_rs_resource_pub.get_wf_role( p_user_id );
774 if l_aborted_by_user_name is null then
775 raise fnd_api.g_exc_unexpected_error;
776 end if ;
777
778 OPEN c_task_details;
779 FETCH c_task_details INTO l_task_name,
780 l_description,
781 l_owner_code,
782 l_owner_id;
783
784
785 IF c_task_details%NOTFOUND
786 THEN
787 fnd_message.set_name ('JTF', 'JTF_TASK_INVALID_ID');
788 fnd_msg_pub.add;
789 END IF;
790
791 CLOSE c_task_details;
792
793 l_task_owner_name := jtf_rs_resource_pub.get_wf_role( l_owner_id );
794 if l_task_owner_name is null then
795 raise fnd_api.g_exc_unexpected_error;
796 end if ;
797
798
799 wf_engine.abortprocess (
800 itemtype => 'JTFTASK',
801 itemkey => l_itemkey
802 );
803 l_context := 'JTFTASK' ||
804 ':' ||
805 l_itemkey ||
806 ':' ||
807 TO_CHAR (-1);
808 l_notification_id :=
809 wf_notification.send (
810 role => l_task_owner_name,
811 msg_type => 'JTFTASK',
812 msg_name => 'ABORT_MSG',
813 callback => 'WF_ENGINE.CB',
814 context => l_context
815 );
816 wf_engine.setitemattrtext (
817 itemtype => 'JTFTASK',
818 itemkey => l_itemkey,
819 aname => 'ABORTED_BY_NAME',
820 avalue => wf_directory.getroledisplayname (l_aborted_by_user_name)
821 );
822 wf_notification.setattrtext (
823 nid => l_notification_id,
824 aname => 'ABORTED_BY',
825 avalue => l_aborted_by_user_name
826 );
827 wf_engine.setitemattrtext (
828 itemtype => 'JTFTASK',
829 itemkey => l_itemkey,
830 aname => 'TASK_NAME',
831 avalue => l_task_name
832 );
833 wf_engine.setitemattrtext (
834 itemtype => 'JTFTASK',
835 itemkey => l_itemkey,
836 aname => 'TASK_DESC',
837 avalue => l_description
838 );
839
840
841 EXCEPTION
842 when wf_not_active then
843 ROLLBACK TO abort_task_workflow ;
844 fnd_message.set_name('JTF','Workflow is not active ');
845 fnd_msg_pub.add ;
846 x_return_status := fnd_api.g_ret_sts_unexp_error;
847 fnd_msg_pub.count_and_get (p_count => x_msg_count, p_data => x_msg_data);
848 WHEN OTHERS
849 THEN
850 ROLLBACK TO abort_task_workflow ;
851 fnd_message.set_name ('JTF', 'JTF_TASK_UNKNOWN_ERROR');
852 fnd_message.set_token ('P_TEXT', SQLCODE || SQLERRM);
853 x_return_status := fnd_api.g_ret_sts_unexp_error;
854 fnd_msg_pub.count_and_get (p_count => x_msg_count, p_data => x_msg_data);
855
856
857 END;
858
859 END JTF_TASK_WORKFLOW_PKG;