DBA Data[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;