DBA Data[Home] [Help]

PACKAGE BODY: APPS.JTF_IH_PURGE

Source


1 PACKAGE BODY JTF_IH_PURGE AS
2 /* $Header: JTFIHPRB.pls 120.5 2006/01/24 21:03:28 nchouras ship $ */
3 G_PKG_NAME CONSTANT VARCHAR2(30) := 'JTF_IH_PURGE';
4 
5 -- Program History
6 -- 09-OCT-2002  Igor Aleshin    Created.
7 -- 26-NOV-2002  Igor Aleshin    Added parameters O/R/R for Interactions and
8 --                              Activities.
9 -- 13-JAN-2003  Igor Aleshin    Added parameter p_Active
10 -- 07-MAY-2003  Igor Aleshin    Fixed bug# 2945880 - TST1159_DROP11: WHEN THE
11 --                              PURGE TYPE = ALL GETTING ORA-01006 BIND
12 --                              VARIABLE NOT E
13 -- 09-MAY-2003  Igor Aleshin    TST1159: THE PURGE PARAMETERS ARE CASE
14 --                              SENSITIVE AND DOES NOT COVERT THE LOWERCA
15 -- 24-OCT-2003  Igor Aleshin	Fixed bug# 3216639 - JTH.R:  CLEAN-UP DROP C
16 --                              ISSUES IN THE ACTIVITIES AND INTERACTIONS
17 --                              VIEWERS
18 -- 07-MAY-2004	Igor Aleshin	Fixed File.sql.35 issue
19 -- 25-MAY-2004	Igor Aleshin	Fixed bug# 3647806 - JTH.R: NEED TO CORRECT
20 --                              PERF. ISSUE WITH PARTY_TYPE VALIDATION IN
21 --                              PURGE PROGRAM
22 -- 04-NOV-2004  Venkatesh K     Bug fix 3999018 - Media Item Check for G_MISS
23 -- 29-DEC-2004  Neha Chourasia	Bug 4063673 fix for date range purge not working for Active set to Y
24 -- 25-FEB-2005  Neha Chourasia  ER 4007013 Added API PURGE_BY_OBJECT to purge interactions and
25 --                              activities related to the object passed.
26 -- 25-JAN-2006 Neha Chourasia   Bug 4965592 fix for hints for sqls as suggested
27 --                              by batch perf team
28 
29   PROCEDURE PURGE(ERRBUF OUT NOCOPY VARCHAR2, RETCODE OUT NOCOPY VARCHAR2,
30     p_Party_IDs VARCHAR2,
31     p_Party_Type VARCHAR2,
32     p_Active VARCHAR2, -- Bug# 4063673 - changed position from last param to 3rd
33     p_Start_Date DATE,
34     p_End_Date DATE,
35     p_SafeMode VARCHAR2,
36     p_Purge_Type VARCHAR2,
37     -- Added on 26-NOV-2002
38     p_ActivityOutcome VARCHAR2,
39     p_ActivityResult VARCHAR2,
40     p_ActivityReason VARCHAR2,
41     p_InterOutcome VARCHAR2,
42     p_InterResult VARCHAR2,
43     p_InterReason VARCHAR2
44     --Added on 13-JAN-2003
45     --p_Active VARCHAR2
46   ) IS
47 
48     nCountInteraction NUMBER;       -- Count of Interactions for Purge
49     nCountActivities NUMBER;        -- Count of Activities for Purge;
50     nCntWrngInteraction NUMBER;     -- Count of Interactions for Purge which have an errors
51     nCountMediaItems NUMBER;        -- Count of Related of Media Items
52     nCountMediaItemLC NUMBER;       -- Count of Related of Media Item Lifecycle
53     nCount NUMBER;
54     nCountMedia NUMBER;
55     sSql VARCHAR2(2000);
56     nRowTrn NUMBER;
57     nInteraction_Id JTF_IH_INTERACTIONS.INTERACTION_ID%TYPE;
58     ErrNoPartyType EXCEPTION;
59     ErrInteraction EXCEPTION;
60     ErrStartEndDate EXCEPTION;
61     ErrEndDateNull EXCEPTION;  -- Added for Bug# 4063673
62     NoCriteriaSpecified EXCEPTION;
63     ErrPatyIdsDescription EXCEPTION;
64     ErrInvPartyType EXCEPTION;
65     n_CursorId NUMBER;
66     n_Res NUMBER;
67     n_Media_Id NUMBER;
68     l_msg_data VARCHAR2(2000);
69     n_NLS_Format VARCHAR2(30);
70     i_Dummy     NUMBER;
71     l_SafeMode VARCHAR2(10);
72     l_Active VARCHAR2(1);
73 
74   BEGIN
75     l_SafeMode := NVL(p_SafeMode,'TRUE');
76     l_Active := NVL(p_Active,'N');
77     p_commit := NVL(p_commit,FND_API.G_TRUE);
78     TranRows := NVL(TranRows,1000);
79     -- Check range for purge. If you are going to purge all interactions
80     -- then you should specify the p_Purge_Type = 'ALL'
81     IF p_Start_Date IS NULL AND p_End_Date IS NULL
82       AND (p_Purge_Type IS NULL OR UPPER(p_Purge_Type) <> 'ALL')
83       AND p_Party_IDs IS NULL AND p_Party_Type IS NULL
84       -- Added on 26-NOV-2002
85       AND p_ActivityOutcome IS NULL AND p_ActivityResult IS NULL
86       AND p_ActivityReason IS NULL AND p_InterOutcome IS NULL
87       AND p_InterResult IS NULL AND p_InterReason IS NULL THEN
88 
89       RAISE NoCriteriaSpecified;
90     END IF;
91 
92     IF UPPER(p_Purge_Type) <> 'ALL' OR p_Purge_Type IS NULL THEN
93 
94       -- Check p_Party_Type value, it it required.
95       IF p_Party_Type IS NOT NULL AND UPPER(p_Party_Type) NOT IN('PERSON','ORGANIZATION','PARTY_RELATIONSHIP') THEN
96         RAISE ErrInvPartyType;
97       END IF;
98 
99       --  Now I'm going to build a dynamic sql statement based on input parameters.
100       --
101       IF p_ActivityOutcome IS NOT NULL OR p_ActivityResult IS NOT NULL OR p_ActivityReason IS NOT NULL THEN
102         sSql := 'SELECT DISTINCT JTFI.INTERACTION_ID FROM JTF_IH_INTERACTIONS JTFI, JTF_IH_ACTIVITIES ACT ';
103         -- If you've set up some value to p_Party_Type parameter, then include HZ_PARTIES table
104         -- to major sql statement, based on JTF_IH_INTERACTION.Party_ID
105         IF p_Party_Type IS NOT NULL THEN
106           sSql := sSql || ', HZ_PARTIES HZ ';
107         END IF;
108         --sSql := sSql ||'WHERE JTFI.ACTIVE = '''||p_Active||''' AND ACT.INTERACTION_ID = JTFI.INTERACTION_ID ';
109         sSql := sSql ||'WHERE JTFI.ACTIVE = :active AND ACT.INTERACTION_ID = JTFI.INTERACTION_ID ';
110 
111         IF p_Party_Type IS NOT NULL THEN
112           sSql := sSql ||' AND JTFI.PARTY_ID=HZ.PARTY_ID ';
113         END IF;
114 
115       ELSE
116 
117         sSql := 'SELECT INTERACTION_ID FROM JTF_IH_INTERACTIONS JTFI ';
118         IF p_Party_Type IS NOT NULL THEN
119           sSql := sSql ||', HZ_PARTIES HZ ';
120         END IF;
121         --sSql := sSql || 'WHERE JTFI.ACTIVE = '''||p_Active||'''';
122         sSql := sSql || 'WHERE JTFI.ACTIVE = :active ';
123         IF p_Party_Type IS NOT NULL THEN
124           sSql := sSql || ' AND JTFI.PARTY_ID=HZ.PARTY_ID ';
125         END IF;
126       END IF;
127 
128       IF p_Party_Type IS NOT NULL THEN
129         --sSql := sSql ||' AND PARTY_TYPE = UPPER('''||p_Party_Type||''') ';
130         sSql := sSql ||' AND PARTY_TYPE = UPPER(:party_type) ';
131       END IF;
132 
133       -- Compare p_End_Date and p_Start_Date. p_End_Date shouldn't be less then p_Start_Date
134       -- This comparation I'll make if p_Active flag is 'N', otherwise let pass it.
135       IF p_Start_Date IS NOT NULL AND p_End_Date IS NOT NULL AND l_Active = 'N' THEN
136         BEGIN
137           SELECT p_End_Date-p_Start_Date INTO n_Res FROM DUAL;
138           IF n_Res < 0 THEN
139             RAISE ErrStartEndDate;
140           END IF;
141         EXCEPTION
142           WHEN OTHERS THEN
143             RAISE ErrStartEndDate;
144         END;
145       END IF;
146 
147       -- Add Party_IDs to major select statement if they are setup.
148       IF p_Party_Ids IS NOT NULL THEN
149         -- Make data validation for PartyIds
150         BEGIN
151           SELECT TO_NUMBER(REPLACE(REPLACE(p_Party_IDs,',',''),' ','')) INTO n_Res FROM DUAL;
152         EXCEPTION
153           WHEN OTHERS THEN
154             RAISE ErrPatyIdsDescription;
155         END;
156         sSql := sSql ||' AND JTFI.PARTY_ID IN ('||p_Party_IDs||') ';
157       END IF;
158 
159       -- Fix for Bug# 4063673 - purge based only on START_DATE
160       IF p_START_DATE IS NOT NULL THEN
161         --IF l_Active = 'N' THEN
162           sSql := sSql || ' AND TO_DATE(TO_CHAR(JTFI.START_DATE_TIME,''MM/DD/RRRR''),''MM/DD/RRRR'') >= TO_DATE(TO_CHAR(:start_date,''MM/DD/RRRR''),''MM/DD/RRRR'') ';
163         --ELSE
164         --  sSql := sSql || ' AND TO_DATE(TO_CHAR(JTFI.START_DATE_TIME,''MM/DD/RRRR''),''MM/DD/RRRR'') <= TO_DATE(TO_CHAR(:start_date,''MM/DD/RRRR''),''MM/DD/RRRR'') ';
165         --END IF;
166       END IF;
167 
168       -- If Interaction is Active and Start Date is not null then end date cannot be null
169       -- else all active records after Start Date upto current date are deleted
170       -- Fix for Bug# 4063673
171       IF p_END_DATE IS NULL AND l_Active = 'Y' THEN
172         RAISE ErrEndDateNull;
173       END IF;
174 
175       -- Fix for Bug# 4063673 - purge based only on START_DATE
176       --IF p_END_DATE IS NOT NULL AND l_Active = 'N' THEN
177       IF p_END_DATE IS NOT NULL THEN
178         sSql := sSql || ' AND TO_DATE(TO_CHAR(JTFI.START_DATE_TIME,''MM/DD/RRRR''),''MM/DD/RRRR'') <= TO_DATE(TO_CHAR(:end_date,''MM/DD/RRRR''),''MM/DD/RRRR'') ';
179       END IF;
180 
181       -- Added on 26-NOV-2002
182       --
183       IF p_InterOutcome IS NOT NULL THEN
184         sSql := sSql || ' AND JTFI.OUTCOME_ID IN ('||p_InterOutcome||') ';
185       END IF;
186 
187       IF p_InterResult IS NOT NULL THEN
188         sSql := sSql || ' AND JTFI.RESULT_ID IN ('||p_InterResult||') ';
189       END IF;
190 
191       IF p_InterReason IS NOT NULL THEN
192         sSql := sSql || ' AND JTFI.REASON_ID IN ('||p_InterReason||') ';
193       END IF;
194 
195       IF p_ActivityOutcome IS NOT NULL THEN
196         sSql := sSql || ' AND ACT.OUTCOME_ID IN ('||p_ActivityOutcome||') ';
197       END IF;
198 
199       IF p_ActivityResult IS NOT NULL THEN
200         sSql := sSql || ' AND ACT.RESULT_ID IN ('||p_ActivityResult||') ';
201       END IF;
202 
203       IF p_ActivityReason IS NOT NULL THEN
204         sSql := sSql || ' AND ACT.REASON_ID IN ('||p_ActivityReason||') ';
205       END IF;
206 
207     ELSE
208       sSql := 'SELECT INTERACTION_ID FROM JTF_IH_INTERACTIONS WHERE ACTIVE = :active ORDER BY INTERACTION_ID ';
209     END IF;
210 
211     -- This piece of code need for debugging a sql statement
212             /*
213             if length(sSql) > 80 then
214                 dbms_output.put_line(substr(sSql,1,80));
215                 for i_Dummy in 1..round(length(sSql)/80) loop
216                     dbms_output.put_line(substr(sSql,(i_Dummy*80)+1,80));
217                 end loop;
218             else
219                 dbms_output.put_line(sSql);
220             end if;*/
221 
222     n_CursorId := DBMS_SQL.OPEN_CURSOR;
223 
224     DBMS_SQL.PARSE(n_CursorId, sSql, DBMS_SQL.NATIVE);
225     --dbms_output.put_line('');
226     DBMS_SQL.BIND_VARIABLE(n_CursorId,':active',l_Active);
227     IF UPPER(p_Purge_Type) <> 'ALL' OR p_Purge_Type IS NULL THEN
228       IF (p_Party_Type IS NOT NULL) THEN
229         DBMS_SQL.BIND_VARIABLE(n_CursorId,':party_type',p_Party_Type);
230       END IF;
231 
232       -- Bug# 2945880 - added expression for p_Purge_Type
233       --
234 
235       -- Fix for Bug# 4063673
236       --IF p_END_DATE IS NOT NULL AND l_Active = 'N' AND (RTRIM(p_Purge_Type) = '' OR p_Purge_Type IS NULL) THEN
237       IF p_END_DATE IS NOT NULL AND (RTRIM(p_Purge_Type) = '' OR p_Purge_Type IS NULL) THEN
238         DBMS_SQL.BIND_VARIABLE(n_CursorId,':end_date',p_End_Date);
239       END IF;
240       -- Bug# 2945880 - added expression for p_Purge_Type
241       --
242       IF p_START_DATE IS NOT NULL AND (RTRIM(p_Purge_Type) = '' OR p_Purge_Type IS NULL) THEN
243         DBMS_SQL.BIND_VARIABLE(n_CursorId,':start_date',p_Start_Date);
244       END IF;
245     END IF;
246     DBMS_SQL.DEFINE_COLUMN(n_CursorId, 1, nInteraction_Id);
247 
248     --FND_FILE.NEW_LINE(FND_FILE.LOG,1);
249     --FND_FILE.PUT_LINE(FND_FILE.LOG, sSql);
250 
251     n_Res := DBMS_SQL.EXECUTE(n_CursorId);
252 
253     nCount := 0;
254     nRowTrn := 0;
255     nCountInteraction := 0;
256     nCountActivities := 0;
257     nCountMediaItems := 0;
258     nCountMediaItemLC := 0;
259 
260     LOOP
261       IF DBMS_SQL.FETCH_ROWS(n_CursorId) = 0 THEN
262         EXIT;
263       END IF;
264       DBMS_SQL.COLUMN_VALUE(n_CursorId,1,nInteraction_Id);
265       -- If current interaction has any errors then skip it
266       BEGIN
267         IF l_SafeMode = 'FALSE' THEN
268           BEGIN
269             SAVEPOINT Activities;
270             -- Clean Up an Activities
271             FOR curActivity IN (SELECT ACTIVITY_ID FROM JTF_IH_ACTIVITIES
272                                 WHERE INTERACTION_ID = nInteraction_Id) LOOP
273               DELETE FROM JTF_IH_ACTIVITIES
274                 WHERE ACTIVITY_ID = curActivity.ACTIVITY_ID
275                 RETURNING Media_ID INTO n_Media_Id;
276 
277               nCountActivities := nCountActivities + 1;
278               IF ( (n_Media_Id IS NOT NULL) AND (n_Media_Id <> fnd_api.g_miss_num) ) THEN
279                 SELECT Count(*) INTO nCountMedia
280                   FROM JTF_IH_ACTIVITIES WHERE MEDIA_ID = n_Media_Id;
281                 --
282                 -- Delete Media Item If they aren't
283                 -- related to other Activities.
284                 --
285                 IF nCountMedia = 0 THEN
286                   DELETE FROM JTF_IH_MEDIA_ITEMS WHERE MEDIA_ID = n_Media_Id;
287                   nCountMediaItems := nCountMediaItems + 1;
288                   -- And Related to MediaID Media Item LifeCycle.
289                   BEGIN
290                     DELETE FROM JTF_IH_MEDIA_ITEM_LC_SEGS WHERE MEDIA_ID = n_Media_Id;
291                     nCountMediaItemLC := nCountMediaItemLC + SQL%ROWCOUNT;
292                   EXCEPTION
293                     WHEN NO_DATA_FOUND THEN
294                       NULL;
295                   END;
296                 END IF;
297               END IF;
298             END LOOP;
299             -- Clean Up Parent and All Child Interactions in the JTF_IH_INTERACTION_INTERS.
300             DELETE FROM JTF_IH_INTERACTION_INTERS WHERE
301               (INTERACT_INTERACTION_IDRELATES = nInteraction_Id)
302                OR (INTERACT_INTERACTION_ID = nInteraction_Id);
303             -- Clean Up current Intraction.
304             DELETE FROM JTF_IH_INTERACTIONS WHERE INTERACTION_ID = nInteraction_Id;
305           EXCEPTION
306             WHEN OTHERS THEN
307               --DBMS_OUTPUT.PUT_LINE('JTF_IH_PURGE: Interaction_ID = '||nInteraction_Id||' has an error:');
308               --DBMS_OUTPUT.PUT_LINE('JTF_IH_PURGE: '||SQLERRM);
309               --DBMS_OUTPUT.PUT_LINE('JTF_IH_PURGE: -----------------------------------------');
310               FND_MESSAGE.SET_NAME('JTF','JTF_IH_PURGE_INTERACTION_ERROR');
311               FND_MESSAGE.SET_TOKEN('INTERACTION', to_char(nInteraction_Id));
312               FND_MESSAGE.SET_TOKEN('ERRORMSG', SQLERRM);
313               FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
314               ROLLBACK TO SAVEPOINT Activities;
315               RAISE ErrInteraction;
316             END;
317           ELSE
318             SELECT nCountActivities + Count(*) INTO nCountActivities
319               FROM JTF_IH_ACTIVITIES WHERE INTERACTION_ID = nInteraction_Id;
320 
321             SELECT nCountMediaItems + Count(*) INTO nCountMediaItems
322               FROM JTF_IH_ACTIVITIES WHERE INTERACTION_ID = nInteraction_Id AND
323               Media_ID IS NOT NULL;
324 
325           END IF;
326           nCountInteraction := nCountInteraction + 1;
327           nRowTrn := nRowTrn + 1;
328           -- Make a commit for transactions only if SafeMode is False.
329           IF nRowTrn = TranRows AND l_SafeMode = 'FALSE' THEN
330             IF p_commit = FND_API.G_TRUE THEN
331               COMMIT;
332               nRowTrn := 0;
333             END IF;
334           END IF;
335         EXCEPTION
336           WHEN ErrInteraction THEN
337             nCntWrngInteraction := nCntWrngInteraction + 1;
338         END;
339       END LOOP;
340 
341       IF p_commit = FND_API.G_TRUE THEN
342         COMMIT;
343         NULL;
344       END IF;
345 
346       --DBMS_OUTPUT.PUT_LINE('JTF_IH_PURGE: Done :');
347       FND_MESSAGE.SET_NAME('JTF','JTF_IH_PURGE_DONE');
348       FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
349 
350       IF nCountInteraction = 0 THEN
351         --DBMS_OUTPUT.PUT_LINE('JTF_IH_PURGE: Interactions not found');
352         FND_MESSAGE.SET_NAME('JTF','JTF_IH_PURGE_NO_INTERACTIONS');
353         FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
354       ELSE
355         IF l_SafeMode = 'TRUE' THEN
356           --DBMS_OUTPUT.PUT_LINE('JTF_IH_PURGE: You are going to delete :');
357           --DBMS_OUTPUT.PUT_LINE('JTF_IH_PURGE:        Interactions....'||to_char(nCountInteraction));
358           --DBMS_OUTPUT.PUT_LINE('JTF_IH_PURGE:        Activities......'||to_char(nCountActivities));
359           --DBMS_OUTPUT.PUT_LINE('JTF_IH_PURGE:        Media Items.....'||to_char(nCountMediaItems));
360           --DBMS_OUTPUT.PUT_LINE('JTF_IH_PURGE: -----------------------------------------');
361           FND_MESSAGE.SET_NAME('JTF','JTF_IH_PURGE_SAFEMODE_REPORT');
362           FND_MESSAGE.SET_TOKEN('INTERACTIONS', to_char(nCountInteraction));
363           FND_MESSAGE.SET_TOKEN('ACTIVITIES', to_char(nCountActivities));
364           FND_MESSAGE.SET_TOKEN('MEDIAITEMS', to_char(nCountMediaItems));
365           FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
366         ELSE
367           --DBMS_OUTPUT.PUT_LINE('JTF_IH_PURGE: Deleted :');
368           --DBMS_OUTPUT.PUT_LINE('JTF_IH_PURGE:        Interactions....'||to_char(nCountInteraction));
369           --DBMS_OUTPUT.PUT_LINE('JTF_IH_PURGE:        Activities......'||to_char(nCountActivities));
370           --DBMS_OUTPUT.PUT_LINE('JTF_IH_PURGE:        Media Items.....'||to_char(nCountMediaItems));
371           --DBMS_OUTPUT.PUT_LINE('JTF_IH_PURGE:        Media Item LC...'||to_char(nCountMediaItemLC));
372           --DBMS_OUTPUT.PUT_LINE('JTF_IH_PURGE: -----------------------------------------');
373           FND_MESSAGE.SET_NAME('JTF','JTF_IH_PURGE_REPORT');
374           FND_MESSAGE.SET_TOKEN('INTERACTIONS', to_char(nCountInteraction));
375           FND_MESSAGE.SET_TOKEN('ACTIVITIES', to_char(nCountActivities));
376           FND_MESSAGE.SET_TOKEN('MEDIAITEMS', to_char(nCountMediaItems));
377           FND_MESSAGE.SET_TOKEN('MEDIAITEMLC', to_char(nCountMediaItemLC));
378           FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
379         END IF;
380       END IF;
381       DBMS_SQL.CLOSE_CURSOR(n_CursorId);
382     EXCEPTION
383       WHEN ErrInvPartyType THEN
384         FND_MESSAGE.SET_NAME('JTF','JTF_IH_PURGE_INV_PARTY_TYPE');
385         FND_MESSAGE.SET_TOKEN('PARTYTYPE', p_Party_Type);
386         FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
387         --DBMS_OUTPUT.PUT_LINE(FND_MESSAGE.GET);
388       WHEN ErrNoPartyType THEN
389         FND_MESSAGE.SET_NAME('JTF','JTF_IH_PURGE_NO_PARTY_TYPE');
390         FND_MESSAGE.SET_TOKEN('PARTYTYPE', p_Party_Type);
391         FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
392         --DBMS_OUTPUT.PUT_LINE(FND_MESSAGE.GET);
393       WHEN ErrStartEndDate THEN
394         FND_MESSAGE.SET_NAME('JTF','JTF_IH_PURGE_INVALID_DATE');
395         FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
396         --DBMS_OUTPUT.PUT_LINE(FND_MESSAGE.GET);
397       -- Added for Bug# 4063673
398       WHEN ErrEndDateNull THEN
399 	FND_MESSAGE.SET_NAME('JTF','JTF_IH_PURGE_DATE_TO_NOTNULL');
400 	FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
401         --DBMS_OUTPUT.PUT_LINE(FND_MESSAGE.GET);
402       WHEN NoCriteriaSpecified THEN
403         FND_MESSAGE.SET_NAME('JTF','JTF_IH_PURGE_NO_CRITERIA');
404         FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
405         --DBMS_OUTPUT.PUT_LINE(FND_MESSAGE.GET);
406       WHEN ErrPatyIdsDescription THEN
407         FND_MESSAGE.SET_NAME('JTF','JTF_IH_PURGE_WRONG_PARTY_IDS');
408         FND_MESSAGE.SET_TOKEN('PARTYIDS', p_Party_IDs);
409         FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
410         --DBMS_OUTPUT.PUT_LINE(FND_MESSAGE.GET);
411       WHEN OTHERS THEN
412         FND_FILE.PUT_LINE(FND_FILE.LOG,SQLERRM);
413         FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
414         --DBMS_OUTPUT.PUT_LINE('JTF_IH_PURGE: '||SQLERRM);
415     END PURGE;
416 
417     PROCEDURE P_DELETE_INTERACTIONS (
418     p_api_version          IN NUMBER,
419     p_init_msg_list        IN VARCHAR2,
420     p_commit               IN VARCHAR2,
421     x_return_status        OUT NOCOPY VARCHAR2,
422     x_msg_data             OUT  NOCOPY VARCHAR2,
423     x_msg_count            OUT  NOCOPY NUMBER,
424     p_processing_set_id    IN NUMBER,
425     p_object_type          IN VARCHAR2
426     )IS
427       l_api_name        CONSTANT VARCHAR2(30) := 'P_DELETE_INTERACTIONS';
428       l_api_version     CONSTANT NUMBER       := 1.1;
429       l_api_name_full   CONSTANT VARCHAR2(61) := g_pkg_name||'.'||l_api_name;
430       l_return_status   VARCHAR2(1);
431       l_msg_count       NUMBER;
432       l_msg_data        VARCHAR2(2000);
433       l_fnd_log_msg     VARCHAR2(2000);
434 
435       -- cursor on stage global temp table
436       -- to select object ids corresp. to which
437       -- interactions and activities are to be purged
438 
439       CURSOR c_jtf_obj_purge_temp_success IS
440       SELECT distinct object_id, null
441       FROM   JTF_OBJECT_PURGE_PARAM_TMP
442       WHERE  nvl(purge_status, 'S') <> 'E'
443       AND    OBJECT_TYPE = p_object_type
444       AND    PROCESSING_SET_ID = p_processing_set_id;
445 
446       TYPE table_incidents_ids IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
447       TYPE table_media_ids IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
448       TYPE table_int_ids IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
449 
450       l_inter_int_ids			table_incidents_ids;
451       l_activity_id			table_incidents_ids;
452       l_incident_ids			table_incidents_ids;
453       l_dummy_col			table_incidents_ids;
454       l_media_ids			table_media_ids;
455       lc_media_ids			table_media_ids;
456       l_int_ids				table_int_ids;
457 
458       l_processing_set_id		NUMBER;
459       l_obj_type_lookup			VARCHAR2(50);
460       l_jtf_activity			VARCHAR2(50);
461       l_jtf_interaction			VARCHAR2(50);
462 
463       ErrNoRecFound	  EXCEPTION;
464 
465     BEGIN
466 
467 
468       IF( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
469         l_fnd_log_msg := 'P_DELETE_INTERACTIONS In parameters :'||
470 	      	                       'p_api_version       = '|| p_api_version ||
471 	      	                       'p_init_msg_list     = '|| p_init_msg_list ||
472 	      	                       'p_commit            = '|| p_commit||
473 	      	                       'p_processing_set_id = '|| p_processing_set_id ||
474 	      	                       'p_object_type       = '|| p_object_type;
475         --dbms_output.put_line(l_fnd_log_msg);
476         FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
477           'jtf.plsql.JTF_IH_PURGE.P_DELETE_INTERACTIONS.begin', l_fnd_log_msg);
478       END IF;
479 
480       l_obj_type_lookup := CONCAT(p_object_type,'-%');
481 
482       -- Standard start of API savepoint
483       SAVEPOINT delete_interactions_p;
484 
485       -- Standard call to check for call compatibility
486       IF NOT fnd_api.compatible_api_call(l_api_version, p_api_version,
487         l_api_name, g_pkg_name) THEN
488         RAISE fnd_api.g_exc_unexpected_error;
489       END IF;
490 
491       -- Initialize message list if p_init_msg_list is set to TRUE
492       IF fnd_api.to_boolean(p_init_msg_list) THEN
493         fnd_msg_pub.initialize;
494       END IF;
495 
496       -- Initialize API return status to success
497       x_return_status := fnd_api.g_ret_sts_success;
498       l_return_status := x_return_status;
499 
500       OPEN  c_jtf_obj_purge_temp_success;
501       FETCH c_jtf_obj_purge_temp_success bulk collect
502       INTO  l_incident_ids, l_dummy_col;
503       CLOSE c_jtf_obj_purge_temp_success;
504 
505       --Select set of Activities related to object_type
506       --to be deleted if the action item can be deleted
507       --for this object type
508       IF l_incident_ids.COUNT < 1 THEN
509         RAISE ErrNoRecFound;
510       END IF;
511 
512       FORALL i IN l_incident_ids.FIRST..l_incident_ids.LAST
513       DELETE
514       FROM   JTF_IH_ACTIVITIES
515       WHERE  doc_id = l_incident_ids(i)
516       AND    doc_ref = p_object_type
517       AND    action_item_id
518            IN (SELECT meaning
519                FROM   FND_LOOKUP_VALUES
520                WHERE  lookup_type = 'JTF_IH_PURGE_OBJ_AI_MAP'
521                AND    lookup_code like l_obj_type_lookup
522                AND    view_application_id = 0
523                AND    security_group_id = 0
524               )
525       RETURNING media_id,interaction_id,activity_id  BULK COLLECT
526       INTO      l_media_ids,l_int_ids,l_activity_id;
527 
528 
529       --Logging after deleting activities
530       IF( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
531         l_fnd_log_msg := 'No. of Activities purged = '||SQL%ROWCOUNT;
532         --dbms_output.put_line(l_fnd_log_msg);
533 
534         FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
535           'jtf.plsql.JTF_IH_PURGE.P_DELETE_INTERACTIONS.delete_activity',l_fnd_log_msg);
536       END IF;
537 
538 
539       -- Inserting the deleted activity ID into temp table
540       -- with new Proc Set ID for Notes dependent object processing
541 
542       IF l_activity_id.COUNT > 0 THEN
543 
544         l_jtf_activity := 'JTF_ACTIVITY';
545 
546         SELECT	JTF_OBJECT_PURGE_PROC_SET_S.NEXTVAL
547         INTO	l_processing_set_id
548         FROM	dual
549         WHERE	rownum = 1;
550 
551 
552         FORALL i IN l_activity_id.FIRST..l_activity_id.LAST
553         INSERT INTO JTF_OBJECT_PURGE_PARAM_TMP
554           (
555 	  object_id,
556           object_type,
557           processing_set_id,
558           purge_status,
559           purge_error_message
560           )
561           values
562           (
563 	   l_activity_id(i),
564            l_jtf_activity,
565            l_processing_set_id,
566            null,
567            null
568           );
569 
570 
571 	--Logging after inserting activities
572 	IF( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
573 	  l_fnd_log_msg := 'No. of Activities Inserted into temp table = '||SQL%ROWCOUNT;
574 	  --dbms_output.put_line(l_fnd_log_msg);
575 	  FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
576            'jtf.plsql.JTF_IH_PURGE.P_DELETE_INTERACTIONS.activity_tmp',l_fnd_log_msg);
577         END IF;
578 
579         --Logging before calling Notes Purge API
580         IF( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
581 	  FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
582 	        'jtf.plsql.JTF_IH_PURGE.P_DELETE_INTERACTIONS.begin.purge_notes', 'Calling Notes Purge API for Activities');
583 	END IF;
584 
585         --Delete Notes related to the activities being purged
586 	CAC_NOTE_PURGE_PUB.PURGE_NOTES
587 	(  p_api_version => 1.0,
588 	   p_init_msg_list => p_init_msg_list,
589 	   p_commit => p_commit,
590 	   x_return_status => l_return_status,
591 	   x_msg_data => l_msg_data,
592 	   x_msg_count => l_msg_count,
593 	   p_processing_set_id => l_processing_set_id,
594 	   p_object_type => 'JTF_ACTIVITY'
595         );
596 
597         --Logging on return from Notes Purge API
598 	IF( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
599 	  FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
600 	     'jtf.plsql.JTF_IH_PURGE.P_DELETE_INTERACTIONS.end.purge_notes', 'After call to Notes Purge API for Activities');
601 	END IF;
602 
603 	IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
604 	  RAISE FND_API.G_EXC_ERROR;
605 	ELSIF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
606 	  RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
607         END IF;
608 
609        END IF;
610 
611       --Delinking activities from SR
612       FORALL i IN l_incident_ids.FIRST..l_incident_ids.LAST
613       UPDATE JTF_IH_ACTIVITIES
614       SET    doc_id = l_dummy_col(i),
615              doc_ref = l_dummy_col(i)
616       WHERE  doc_id = l_incident_ids(i)
617       AND    doc_ref = p_object_type;
618 
619 
620 
621       --Logging after delinking activities
622       IF( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
623         l_fnd_log_msg := 'No. of Activities Delinked = '||SQL%ROWCOUNT;
624         --dbms_output.put_line(l_fnd_log_msg);
625         FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
626          'jtf.plsql.JTF_IH_PURGE.P_DELETE_INTERACTIONS.delink_act',l_fnd_log_msg);
627       END IF;
628 
629       --Deleting the associated Interactions
630 
631       IF l_int_ids.COUNT > 0 THEN
632         FORALL j IN l_int_ids.FIRST..l_int_ids.LAST
633         DELETE
634         FROM   JTF_IH_INTERACTIONS
635         WHERE  interaction_id = l_int_ids(j)
636         AND
637         NOT EXISTS (SELECT 1
638                     FROM   JTF_IH_ACTIVITIES
639                     WHERE  interaction_id = l_int_ids(j))
640         RETURNING interaction_id BULK COLLECT INTO l_inter_int_ids;
641       END IF;
642 
643 
644       --Logging after deleting interactions
645       IF( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
649           'jtf.plsql.JTF_IH_PURGE.P_DELETE_INTERACTIONS.del_inter',l_fnd_log_msg);
646         l_fnd_log_msg := 'No. of Interactions purged = '||SQL%ROWCOUNT;
647         --dbms_output.put_line(l_fnd_log_msg);
648         FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
650       END IF;
651 
652       -- Clean Up Parent and All Child Interactions
653       --in the JTF_IH_INTERACTION_INTERS.
654       IF l_inter_int_ids.COUNT > 0 THEN
655         FORALL j IN l_inter_int_ids.FIRST..l_inter_int_ids.LAST
656         DELETE
657         FROM   JTF_IH_INTERACTION_INTERS
658         WHERE  (INTERACT_INTERACTION_IDRELATES = l_inter_int_ids(j))
659         OR     (INTERACT_INTERACTION_ID = l_inter_int_ids(j));
660       END IF;
661 
662 
663 
664       --Logging after cleaning Interaction Relationships
665       IF( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
666         l_fnd_log_msg := 'No. of Interaction Relationships purged = '||SQL%ROWCOUNT;
667         --dbms_output.put_line(l_fnd_log_msg);
668         FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
669          'jtf.plsql.JTF_IH_PURGE.P_DELETE_INTERACTIONS.del_inter_inter',l_fnd_log_msg);
670       END IF;
671 
672       -- Inserting the deleted interaction ID into temp table
673       -- with new Proc Set ID for Notes dependent object processing
674 
675       IF l_inter_int_ids.COUNT > 0 THEN
676 
677         l_jtf_interaction := 'JTF_INTERACTION';
678 
679         SELECT    JTF_OBJECT_PURGE_PROC_SET_S.NEXTVAL
680         INTO      l_processing_set_id
681         FROM      dual
682         WHERE     rownum = 1;
683 
684 
685         FORALL i IN l_inter_int_ids.FIRST..l_inter_int_ids.LAST
686         INSERT INTO JTF_OBJECT_PURGE_PARAM_TMP
687         (
688           object_id,
689           object_type,
690           processing_set_id,
691           purge_status,
692           purge_error_message
693         )
694         values
695         (
696            l_inter_int_ids(i),
697            l_jtf_interaction,
698            l_processing_set_id,
699            null,
700            null
701         );
702 
703 
704 
705 	--Logging after inserting interactions into temp table
706 	IF( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
707 	  l_fnd_log_msg := 'No. of Interactions inserted into temp table = '||SQL%ROWCOUNT;
708 	  --dbms_output.put_line(l_fnd_log_msg);
709 	  FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
710 	    'jtf.plsql.JTF_IH_PURGE.P_DELETE_INTERACTIONS.inter_tmp',l_fnd_log_msg);
711         END IF;
712 
713         --Logging before calling Notes Purge API
714 	IF( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
715 	  FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
716 	       'jtf.plsql.JTF_IH_PURGE.P_DELETE_INTERACTIONS.begin.purge_notes', 'Calling Notes Purge API for Interactions');
717 	END IF;
718 
719         --Delete Notes related to the interactions being purged
720 	CAC_NOTE_PURGE_PUB.PURGE_NOTES
721 	(  p_api_version => 1.0,
722 	   p_init_msg_list => p_init_msg_list,
723 	   p_commit => p_commit,
724 	   x_return_status => l_return_status,
725 	   x_msg_data => l_msg_data,
726 	   x_msg_count => l_msg_count,
727 	   p_processing_set_id => l_processing_set_id,
728 	   p_object_type => 'JTF_INTERACTION'
729         );
730         --Logging on return from Notes Purge API
731 	IF( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
732 	  FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
733 	     'jtf.plsql.JTF_IH_PURGE.P_DELETE_INTERACTIONS.end.purge_notes', 'After call to Notes Purge API for Activities');
734 	END IF;
735 	IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
736 	  RAISE FND_API.G_EXC_ERROR;
737 	ELSIF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
738 	  RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
739         END IF;
740 
741       END IF;
742 
743       --
744       -- Delete Media Item If they aren't
745       -- related to other Activities.
746       --
747       IF l_media_ids.COUNT > 0 THEN
748         FORALL j IN l_media_ids.FIRST..l_media_ids.LAST
749         DELETE
750         FROM   JTF_IH_MEDIA_ITEMS
751         WHERE  media_id IS NOT NULL
752         AND    media_id <> fnd_api.g_miss_num
753         AND    media_id = l_media_ids(j)
754         AND
755         NOT EXISTS (SELECT 1
756                     FROM   JTF_IH_ACTIVITIES
757                     WHERE  MEDIA_ID = l_media_ids(j))
758         RETURNING media_id BULK COLLECT INTO lc_media_ids;
759       END IF;
760 
761 
762 
763 
764       --Logging after deleting media items
765       IF( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
766         l_fnd_log_msg := 'No. of Media Items purged = '||SQL%ROWCOUNT;
767         --dbms_output.put_line(l_fnd_log_msg);
768         FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
769           'jtf.plsql.JTF_IH_PURGE.P_DELETE_INTERACTIONS.delete_MI',l_fnd_log_msg);
770       END IF;
771 
772       -- And Related to MediaID Media Item LifeCycle.
773       IF lc_media_ids.COUNT > 0 THEN
774         FORALL j IN lc_media_ids.FIRST..lc_media_ids.LAST
775         DELETE
776         FROM   JTF_IH_MEDIA_ITEM_LC_SEGS
777         WHERE  MEDIA_ID = lc_media_ids(j);
778       END IF;
779 
780       IF p_commit = FND_API.G_TRUE THEN
781         COMMIT;
782       END IF;
783 
784       --Logging after deleting media life cycle segments
785       IF( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
786         l_fnd_log_msg := 'No. of Media Life-cycle segments purged = '||SQL%ROWCOUNT;
787         --dbms_output.put_line(l_fnd_log_msg);
788         FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
792 
789          'jtf.plsql.JTF_IH_PURGE.P_DELETE_INTERACTIONS.delete_MLCS',l_fnd_log_msg);
790       END IF;
791 
793 
794       IF( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
795         l_fnd_log_msg := 'P_DELETE_INTERACTIONS Out parameters:' ||
796 	       	                       'x_return_status = '|| x_return_status ||
797 	       	                       'x_msg_data      = '||x_msg_data||
798 	       	                       'x_msg_count     ='||x_msg_count;
799 
800         --dbms_output.put_line(l_fnd_log_msg);
801         FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
802       	 'jtf.plsql.JTF_IH_PURGE.P_DELETE_INTERACTIONS.end', l_fnd_log_msg);
803       END IF;
804 
805     EXCEPTION
806       WHEN fnd_api.g_exc_error THEN
807         ROLLBACK TO delete_interactions_p;
808         --dbms_output.put_line('FAILURE EXPECTED');
809         x_return_status := fnd_api.g_ret_sts_error;
810         IF( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
811           fnd_msg_pub.count_and_get
812           ( p_count => x_msg_count,
813             p_data  => x_msg_data );
814           x_msg_data:=FND_MSG_PUB.Get(p_msg_index => x_msg_count, p_encoded=>'F');
815           FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION,
816 	  	             'jtf.plsql.JTF_IH_PURGE.P_DELETE_INTERACTIONS', x_msg_data);
817 	END IF;
818 
819       WHEN fnd_api.g_exc_unexpected_error THEN
820         ROLLBACK TO delete_interactions_p;
821         --dbms_output.put_line('FAILURE UNEXPECTED');
822         x_return_status := fnd_api.g_ret_sts_unexp_error;
823         IF( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
824           fnd_msg_pub.count_and_get
825           ( p_count => x_msg_count,
826             p_data  => x_msg_data );
827           x_msg_data := FND_MSG_PUB.Get(p_msg_index=>x_msg_count, p_encoded=>'F');
828           FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION,
829 	             'jtf.plsql.JTF_IH_PURGE.P_DELETE_INTERACTIONS', x_msg_data);
830 	END IF;
831 
832       WHEN ErrNoRecFound THEN
833         ROLLBACK TO delete_interactions_p;
834         x_return_status := fnd_api.g_ret_sts_success;
835         IF( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
836           fnd_msg_pub.count_and_get
837           ( p_count => x_msg_count,
838             p_data  => x_msg_data );
839           x_msg_data:=FND_MSG_PUB.Get(p_msg_index => x_msg_count, p_encoded=>'F');
840           FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION,
841 	             'jtf.plsql.JTF_IH_PURGE.P_DELETE_INTERACTIONS', x_msg_data);
842 	END IF;
843 
844       WHEN OTHERS THEN
845         ROLLBACK TO delete_interactions_p;
846         --dbms_output.put_line('FAILURE OTHERS');
847         x_return_status := fnd_api.g_ret_sts_unexp_error;
848         IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_unexp_error) THEN
849           fnd_msg_pub.add_exc_msg(g_pkg_name, l_api_name);
850         END IF;
851         IF( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
852           fnd_msg_pub.count_and_get
853           ( p_count => x_msg_count,
854             p_data  => x_msg_data );
855           x_msg_data:=FND_MSG_PUB.Get(p_msg_index => x_msg_count, p_encoded=>'F');
856           FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION,
857 	             'jtf.plsql.JTF_IH_PURGE.P_DELETE_INTERACTIONS', x_msg_data);
858 	END IF;
859 
860     END P_DELETE_INTERACTIONS;
861 
862 END JTF_IH_PURGE;