DBA Data[Home] [Help]

PACKAGE BODY: APPS.IEC_STATUS_PVT

Source


1 PACKAGE BODY IEC_STATUS_PVT AS
2 /* $Header: IECOCSTB.pls 120.1 2006/03/28 07:57:56 minwang noship $ */
3 
4 g_pkg_name CONSTANT VARCHAR2(30) := 'IEC_STATUS_PVT';
5 
6 g_error_msg VARCHAR2(2048) := NULL;
7 
8 G_LIST_STATUS_EXECUTING CONSTANT NUMBER := 310;
9 G_LIST_STATUS_LOCKED CONSTANT NUMBER := 304;
10 
11 G_NUM_MINUTES_IN_DAY CONSTANT NUMBER := 1440;
12 G_FUNCTIONAL CONSTANT NUMBER := 2;
13 G_PERFORMANCE CONSTANT NUMBER := 1;
14 G_DEFAULT_SUBSET_NAME CONSTANT VARCHAR2(30) := 'IEC_DEFAULT_SUBSET_NAME';
15 TYPE KEY_LIST IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
16 
17 PROCEDURE Log
18    ( p_method        IN VARCHAR2
19    , p_sub_method    IN VARCHAR2
20    , p_sqlerrm       IN VARCHAR2)
21 IS
22 BEGIN
23 
24    IEC_OCS_LOG_PVT.LOG_INTERNAL_PLSQL_ERROR
25       ( 'IEC_STATUS_PVT'
26       , p_method
27       , p_sub_method
28       , p_sqlerrm
29       , g_error_msg
30       );
31 
32 END Log;
33 
34 PROCEDURE Log_IecStatusError
35    ( p_method        IN VARCHAR2
36    , p_sub_method    IN VARCHAR2
37    , p_list_id       IN NUMBER
38    , p_status_id     IN NUMBER
39    )
40 IS
41 BEGIN
42 
43    IEC_OCS_LOG_PVT.LOG_LIST_STATUS_IEC_ERROR
44       ( 'IEC_STATUS_PVT'
45       , p_method
46       , p_sub_method
47       , p_list_id
48       , p_status_id
49       , g_error_msg
50       );
51 
52 END Log_IecStatusError;
53 
54 PROCEDURE Log_AmsStatusError
55    ( p_method        IN VARCHAR2
56    , p_sub_method    IN VARCHAR2
57    , p_list_id       IN NUMBER
58    , p_status_id     IN NUMBER
59    )
60 IS
61 BEGIN
62 
63    IEC_OCS_LOG_PVT.LOG_LIST_STATUS_AMS_ERROR
64       ( 'IEC_STATUS_PVT'
65       , p_method
66       , p_sub_method
67       , p_list_id
68       , p_status_id
69       , g_error_msg
70       );
71 
72 END Log_AmsStatusError;
73 
74 PROCEDURE Log_CannotStopSchedule
75    ( p_method        IN VARCHAR2
76    , p_sub_method    IN VARCHAR2
77    , p_schedule_name     IN VARCHAR2
78    )
79 IS
80    l_message VARCHAR2(4000);
81    l_encoded_message VARCHAR2(4000);
82    l_module VARCHAR2(4000);
83 BEGIN
84 
85    IEC_OCS_LOG_PVT.Init_CannotStopScheduleMsg
86       ( p_schedule_name
87       , l_message
88       , l_encoded_message
89       );
90 
91    IEC_OCS_LOG_PVT.Get_Module('IEC_STATUS_PVT', p_method, p_sub_method, l_module);
92    IEC_OCS_LOG_PVT.Log_Message(l_module);
93 
94 END Log_CannotStopSchedule;
95 
96 -----------------------------++++++-------------------------------
97 --
98 -- Start of comments
99 --
100 --  API name    : Update_Schedule_Status
101 --  Type        : Public
102 --  Pre-reqs    : None
103 --  Function    : Makes call to AMS_LISTHEADER_PUB.UpdateListheader to change the value of the
104 --                particular list's status value.
105 --
106 --  Parameters  : p_schedule_id      IN      NUMBER          Required
107 --                p_status           IN      NUMBER          Required
108 --
109 --  Version     : Initial version 1.0
110 --
111 -- End of comments
112 --
113 -----------------------------++++++-------------------------------
114 PROCEDURE Update_Schedule_Status
115    ( p_schedule_id     IN            NUMBER
116    , p_status          IN            NUMBER
117    , p_user_id         IN            NUMBER
118    )
119 IS
120    PRAGMA AUTONOMOUS_TRANSACTION;
121    l_api_name      CONSTANT VARCHAR2(30) := 'UPDATE_SCHEDULE_STATUS';
122    l_schedule_rec           AMS_CAMP_SCHEDULE_PUB.schedule_rec_type;
123    l_api_version   CONSTANT NUMBER       := 1.0;
124    l_msg_count              NUMBER;
125    l_msg_data               VARCHAR2(4000);
126    l_return_code            VARCHAR2(1);
127 
128    l_object_version_number  NUMBER;
129 BEGIN
130 
131   ----------------------------------------------------------------
132   -- We modify the header id and user status id fields to indicate
133   -- that the status is what we want to modify on this list.
134   ----------------------------------------------------------------
135   l_schedule_rec.schedule_id := p_schedule_id;
136   l_schedule_rec.user_status_id := p_status;
137   l_schedule_rec.status_date := sysdate;
138   l_schedule_rec.last_update_date := sysdate;
139   l_schedule_rec.last_updated_by := p_user_id;
140 
141   -- Get object version number
142   SELECT OBJECT_VERSION_NUMBER
143   INTO l_schedule_rec.object_version_number
144   FROM AMS_CAMPAIGN_SCHEDULES_B
145   WHERE SCHEDULE_ID = p_schedule_id;
146 
147   ----------------------------------------------------------------
148   -- Call the AMS api to execute the schedule modification for
149   -- us.
150   ----------------------------------------------------------------
151   AMS_CAMP_SCHEDULE_PUB.Update_Camp_Schedule
152             ( p_api_version_number               => l_api_version,
153               p_init_msg_list                    => FND_API.G_TRUE,
154               p_commit                           => FND_API.G_FALSE,
155               p_validation_level                 => FND_API.G_VALID_LEVEL_FULL,
156               x_return_status                    => l_return_code,
157               x_msg_count                        => l_msg_count,
158               x_msg_data                         => l_msg_data ,
159               p_schedule_rec                     => l_schedule_rec,
160               x_object_version_number            => l_object_version_number
161             );
162   ----------------------------------------------------------------
163   -- If the call to the ams api did not complete successfully then write
164   -- a log and stop the update list procedure.
165   ----------------------------------------------------------------
166   IF l_return_code <> FND_API.G_RET_STS_SUCCESS THEN
167 
168     Log_AmsStatusError('UPDATE_SCHEDULE_STATUS', 'UPDATE_SCHEDULE', p_schedule_id, p_status);
169 
170     IF l_return_code = FND_API.G_RET_STS_ERROR THEN
171        RAISE FND_API.G_EXC_ERROR;
172     ELSIF l_return_code = FND_API.G_RET_STS_UNEXP_ERROR THEN
173        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
174     END IF;
175 
176   END IF;
177 
178   COMMIT;
179 
180 EXCEPTION
181   ----------------------------------------------------------------
182   -- If either of the two FND_API exceptions have been thrown then
183   -- the procedure has already logged the error and we now just
184   -- set the return status flag and return to the calling
185   -- procedure.
186   ----------------------------------------------------------------
187   WHEN FND_API.G_EXC_ERROR THEN
188     ROLLBACK;
189     RAISE_APPLICATION_ERROR(-20999, g_error_msg);
190   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
191     ROLLBACK;
192     RAISE_APPLICATION_ERROR(-20999, g_error_msg);
193   ----------------------------------------------------------------
194   -- If an anonymous exception has been thrown then
195   -- the we must log an internal PLSQL error and
196   -- set the return status flag and return to the calling
197   -- procedure.
198   ----------------------------------------------------------------
199   WHEN OTHERS THEN
200     LOG ( l_api_name
201         , 'MAIN'
202         , SQLERRM );
203     ROLLBACK;
204     RAISE_APPLICATION_ERROR(-20999, g_error_msg);
205 
206 END Update_Schedule_Status;
207 
208 -----------------------------++++++-------------------------------
209 --
210 -- Start of comments
211 --
212 --  API name    : Update_List_Status
213 --  Type        : Public
214 --  Pre-reqs    : None
215 --  Function    : Updates the Advanced Outbound list status, and
216 --                makes call to AMS_LISTHEADER_PVT.UpdateListheader
217 --                to update the Marketing list status as well.
218 --                Accepts a parameter p_api_init_flag that is used
219 --                to flag whether or not a call to a public api
220 --                initiated the status change (i.e. start purge).
221 --                In most cases, this flag isn't relevant and the
222 --                overloaded procedure Update_List_Status that accepts
223 --                only p_list_id and p_status parameters should be used.
224 --
225 --  Parameters  : p_list_id       IN      NUMBER          Required
226 --                p_status        IN      VARCHAR2        Required
227 --                p_api_init_flag IN      VARCHAR2        Required
228 --
229 --  Version     : Initial version 1.0
230 --
231 -- End of comments
232 --
233 -----------------------------++++++-------------------------------
234 PROCEDURE Update_List_Status
235    ( p_list_id       IN NUMBER
236    , p_status        IN VARCHAR2
237    , p_api_init_flag IN VARCHAR2
238    )
239 IS
240    PRAGMA AUTONOMOUS_TRANSACTION;
241    l_api_name      CONSTANT VARCHAR2(30) := 'UPDATE_LIST_STATUS';
242    l_list_rec               AMS_LISTHEADER_PVT.list_header_rec_type;
243    l_api_version   CONSTANT NUMBER       := 1.0;
244    l_msg_count              NUMBER;
245    l_msg_data               VARCHAR2(4000);
246    l_return_code            VARCHAR2(1);
247 
248    l_mkt_status             NUMBER;
249    l_curr_mkt_status        NUMBER;
250 
251    l_api_init_flag          VARCHAR2(1);
252 BEGIN
253 
254    BEGIN
255 
256       ----------------------------------------------------------------
257       -- In order to set a list associated with an AO schedule to
258       -- ACTIVE, we must set the execution start time.
259       ----------------------------------------------------------------
260       IF (p_status = 'ACTIVE') THEN
261 
262          l_mkt_status := G_LIST_STATUS_EXECUTING;
263 
264          -- Set Execution Start Time
265          BEGIN
266             UPDATE IEC_G_LIST_RT_INFO
267             SET    EXECUTION_START_TIME = SYSDATE
268                  , LAST_UPDATED_BY = NVL(FND_GLOBAL.conc_login_id, -1)
269                  , LAST_UPDATE_DATE = SYSDATE
270             WHERE LIST_HEADER_ID = p_list_id
271             AND EXECUTION_START_TIME IS NULL;
272          EXCEPTION
273             WHEN OTHERS THEN
274                Log ( l_api_name
275                    , 'PRE_PROCESSING.UPDATE_EXECUTION_START_TIME'
276                    , SQLERRM );
277                RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
278          END;
279 
280       ELSIF (p_status = 'PENDING_VALIDATION') THEN
281 
282          l_mkt_status := G_LIST_STATUS_EXECUTING;
283 
284       ELSIF (p_status = 'FAILED_VALIDATION') THEN
285 
286          l_mkt_status := G_LIST_STATUS_LOCKED;
287 
288       ELSIF (p_status = 'VALIDATING') THEN
289 
290          l_mkt_status := G_LIST_STATUS_EXECUTING;
291 
292       ELSIF (p_status = 'VALIDATED') THEN
293 
294          l_mkt_status := G_LIST_STATUS_LOCKED;
295 
296       ELSIF (p_status = 'STOPPING') THEN
297 
298          l_mkt_status := G_LIST_STATUS_EXECUTING;
299 
300       ELSIF (p_status = 'INACTIVE') THEN
301 
302          l_mkt_status := G_LIST_STATUS_LOCKED;
303 
304       ELSIF (p_status = 'PENDING_PURGE') THEN
305 
306          l_mkt_status := G_LIST_STATUS_EXECUTING;
307 
308       ELSIF (p_status = 'FAILED_PURGE') THEN
309 
310          l_mkt_status := G_LIST_STATUS_LOCKED;
311 
312       ELSIF (p_status = 'PURGING') THEN
313 
314          l_mkt_status := G_LIST_STATUS_EXECUTING;
315 
316       ELSIF (p_status = 'PURGED') THEN
317 
318          l_mkt_status := G_LIST_STATUS_LOCKED;
319 
320       END IF;
321 
322    EXCEPTION
323       ----------------------------------------------------------------
324       -- This has already been logged so just re-raise the exception.
325       ----------------------------------------------------------------
326       WHEN FND_API.G_EXC_ERROR THEN
327          RAISE;
328       WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
329          RAISE;
330       ----------------------------------------------------------------
331       -- If the preprocessing throws an unexpected exception then write
332       -- a log and stop the update list procedure.
333       ----------------------------------------------------------------
334       WHEN OTHERS THEN
335          Log_IecStatusError(l_api_name, 'PRE_PROCESSING', p_list_id, p_status);
336          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
337    END;
338 
339    -- We only want to use the flag to indicate when an api
340    -- initiated the call to change the status (or perform an
341    -- action).  If not initiated by an api, then should be NULL,
342    -- rather than 'N'
343    IF p_api_init_flag = 'Y' THEN
344       l_api_init_flag := 'Y';
345    ELSE
346       l_api_init_flag := NULL;
347    END IF;
348 
349    -- Update AO List Status
350    BEGIN
351       UPDATE IEC_G_LIST_RT_INFO
352       SET    STATUS_CODE = p_status
353            , API_INITIATED_FLAG = l_api_init_flag
354            , LAST_UPDATED_BY = NVL(FND_GLOBAL.conc_login_id, -1)
355            , LAST_UPDATE_DATE = SYSDATE
356       WHERE LIST_HEADER_ID = p_list_id;
357    EXCEPTION
358       WHEN OTHERS THEN
359          Log ( l_api_name
360              , 'UPDATE_AO_STATUS'
361              , SQLERRM );
362          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
363    END;
364 
365    -- Get current Marketing list status
366    BEGIN
367       SELECT USER_STATUS_ID
368       INTO l_curr_mkt_status
369       FROM AMS_LIST_HEADERS_ALL
370       WHERE LIST_HEADER_ID = p_list_id;
371    EXCEPTION
372       WHEN OTHERS THEN
373          Log ( l_api_name
374              , 'GET_AMS_STATUS'
375              , SQLERRM );
376          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
377    END;
378 
379    -- Update Marketing list status has changed
380    IF l_curr_mkt_status <> l_mkt_status THEN
381 
382       ----------------------------------------------------------------
383       -- We need to grab an empty list header rec from marketing.
384       ----------------------------------------------------------------
385       AMS_LISTHEADER_PVT.Init_ListHeader_rec(x_listheader_rec  => l_list_rec);
386 
387       ----------------------------------------------------------------
388       -- We modify the header id and user status id fields to indicate
389       -- that the status is what we want to modify on this list.
390       ----------------------------------------------------------------
391       l_list_rec.list_header_id := p_list_id;
392       l_list_rec.user_status_id := l_mkt_status;
393 
394       ----------------------------------------------------------------
395       -- Call the AMS api to execute the list header modification for
396       -- us.  FUTURE: we might have to use their public api in the
397       -- future.
398       ----------------------------------------------------------------
399       AMS_LISTHEADER_PVT.Update_ListHeader
400             ( p_api_version                      => l_api_version,
401               p_init_msg_list                    => FND_API.G_TRUE,
402               p_commit                           => FND_API.G_FALSE,
403               p_validation_level                 => FND_API.G_VALID_LEVEL_FULL,
404               x_return_status                    => l_return_code,
405               x_msg_count                        => l_msg_count,
406               x_msg_data                         => l_msg_data ,
407               p_listheader_rec                   => l_list_rec
408             );
409 
410       ----------------------------------------------------------------
411       -- If the call to the ams api did not complete successfully then write
412       -- a log and stop the update list procedure.
413       ----------------------------------------------------------------
414       IF l_return_code <> FND_API.G_RET_STS_SUCCESS THEN
415 
416          Log ( l_api_name
417              , 'UPDATE_AMS_LIST_STATUS'
418              , l_msg_data );
419 
420          IF l_return_code = FND_API.G_RET_STS_ERROR THEN
421             RAISE FND_API.G_EXC_ERROR;
422          ELSIF l_return_code = FND_API.G_RET_STS_UNEXP_ERROR THEN
423             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
424          END IF;
425 
426       END IF;
427    END IF;
428 
429    COMMIT;
430 
431 EXCEPTION
432 
433   ----------------------------------------------------------------
434   -- If either of the two FND_API exceptions have been thrown then
435   -- the procedure has already logged the error and we now just
436   -- set the return status flag and return to the calling
437   -- procedure.
438   ----------------------------------------------------------------
439   WHEN FND_API.G_EXC_ERROR THEN
440     ROLLBACK;
441     RAISE_APPLICATION_ERROR(-20999, g_error_msg);
442   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
443     ROLLBACK;
444     RAISE_APPLICATION_ERROR(-20999, g_error_msg);
445 
446   ----------------------------------------------------------------
447   -- If an anonymous exception has been thrown then
448   -- the we must log an internal PLSQL error and
449   -- set the return status flag and return to the calling
450   -- procedure.
451   ----------------------------------------------------------------
452   WHEN OTHERS THEN
453     LOG ( l_api_name
454         , 'MAIN'
455         , SQLERRM );
456     ROLLBACK;
457     RAISE_APPLICATION_ERROR(-20999, g_error_msg);
458 
459 END Update_List_Status;
460 
461 -----------------------------++++++-------------------------------
462 --
463 -- Start of comments
464 --
465 --  API name    : Update_List_Status
466 --  Type        : Public
467 --  Pre-reqs    : None
468 --  Function    : Updates the Advanced Outbound list status, and
469 --                makes call to AMS_LISTHEADER_PVT.UpdateListheader
470 --                to update the Marketing list status as well.
471 --
472 --  Parameters  : p_list_id      IN      NUMBER          Required
473 --                p_status       IN      VARCHAR2        Required
474 --
475 --  Version     : Initial version 1.0
476 --
477 -- End of comments
478 --
479 -----------------------------++++++-------------------------------
480 PROCEDURE Update_List_Status
481    ( p_list_id     IN           NUMBER
482    , p_status      IN           VARCHAR2
483    )
484 IS
485 BEGIN
486    Update_List_Status(p_list_id, p_status, 'N');
487 END Update_List_Status;
488 
489 -----------------------------++++++-------------------------------
490 --
491 -- Start of comments
492 --
493 --  API name    : Stop_Lists
494 --  Type        : Public
495 --  Pre-reqs    : None
496 --  Function    : Stops executing on lists that currently have a status
497 --                code of STOPPING.
498 --
499 --  Parameters  :
500 --
501 --  Version     : Initial version 1.0
502 --
503 -- End of comments
504 --
505 -----------------------------++++++-------------------------------
506 PROCEDURE Stop_Lists
507 IS
508   l_method_name CONSTANT VARCHAR2(30) := 'STOP_LISTS';
509   l_error_stack VARCHAR2(4000);
510 BEGIN
511 
512    SAVEPOINT STOP_LISTS_START;
513 
514    FOR list_rec IN (SELECT LIST_HEADER_ID
515                     FROM   IEC_O_LISTS_TO_STOP_V)
516    LOOP
517 
518       BEGIN
519          Stop_ListExecution(list_rec.LIST_HEADER_ID);
520       EXCEPTION
521          WHEN OTHERS THEN
522             IF l_error_stack IS NOT NULL THEN
523                l_error_stack := l_error_stack || ':' || g_error_msg;
524             ELSE
525                l_error_stack := g_error_msg;
526             END IF;
527       END;
528 
529    END LOOP;
530 
531    IF l_error_stack IS NOT NULL THEN
532       g_error_msg := l_error_stack;
533       RAISE FND_API.G_EXC_ERROR;
534    END IF;
535 
536 EXCEPTION
537   WHEN FND_API.G_EXC_ERROR THEN
538      RAISE;
539   WHEN OTHERS THEN
540     LOG ( l_method_name
541         , 'MAIN'
542         , SQLERRM );
543     ROLLBACK TO STOP_LISTS_START;
544     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
545 END Stop_Lists;
546 
547 -----------------------------++++++-------------------------------
548 --
549 -- Start of comments
550 --
551 --  API name    : Clean_ListEntries
552 --  Type        : Public
553 --  Pre-reqs    : None
554 --  Function    : Set the list status to 'DELETED' and make sure
555 --                that all unecessary database entries related to the list
556 --                are delted.
557 --
558 --  Parameters  : p_list_id IN NUMBER
559 --
560 --  Version     : Initial version 1.0
561 --
562 -- End of comments
563 --
564 -----------------------------++++++-------------------------------
565 PROCEDURE Clean_ListEntries (p_list_id IN NUMBER)
566 IS
567    l_method_name CONSTANT VARCHAR2(30) := 'Clean_ListEntries';
568    l_stopped_server_id_col SYSTEM.number_tbl_type;
569    l_records_out NUMBER;
570    l_user_status_id NUMBER;
571 BEGIN
572 
573    -- REMOVE ENTRIES FROM THE CALL HISTORIES TABLE FOR THIS TARGET GROUP.
574    BEGIN
575       EXECUTE IMMEDIATE 'DELETE FROM IEC_O_RCY_CALL_HISTORIES WHERE RETURNS_ID IN ' ||
576                         '(SELECT RETURNS_ID FROM IEC_G_RETURN_ENTRIES WHERE LIST_HEADER_ID = :1)'
577          USING p_list_id;
578    EXCEPTION
579    WHEN OTHERS THEN
580       LOG ( l_method_name
581           , 'DELETE_CALL_HISTORY.LIST_' || p_list_id
582           , SQLERRM );
583       RAISE;
584    END;
585 
586    -- REMOVE POSSIBLE ENTRIES FROM ONE OF THE SUBSET TRANSITION TABLES FOR THIS TARGET GROUP.
587    BEGIN
588       EXECUTE IMMEDIATE 'DELETE FROM IEC_O_TRANSITION_PHONES WHERE LIST_ID = :1'
589          USING p_list_id;
590    EXCEPTION
591    WHEN OTHERS THEN
592       LOG ( l_method_name
593           , 'DELETE_TRANSITION_PHONES.LIST_' || p_list_id
594           , SQLERRM );
595       RAISE;
596    END;
597 
598    -- REMOVE POSSIBLE ENTRIES FROM ONE OF THE SUBSET TRANSITION TABLES FOR THIS TARGET GROUP.
599    BEGIN
600       EXECUTE IMMEDIATE 'DELETE FROM IEC_O_TRANSITION_SUBSETS WHERE LIST_ID = :1'
601          USING p_list_id;
602    EXCEPTION
603    WHEN OTHERS THEN
604       LOG ( l_method_name
605           , 'DELETE_TRANSITION_SUBSETS.LIST_' || p_list_id
606           , SQLERRM );
607       RAISE;
608    END;
609 
610    -- REMOVE POSSIBLE ENTRIES FROM ONE OF THE SUBSET TRANSITION TABLES FOR THIS TARGET GROUP.
611    BEGIN
612       EXECUTE IMMEDIATE 'DELETE FROM IEC_O_TRANSITION_SUBSETS WHERE LIST_ID = :1'
613          USING p_list_id;
614    EXCEPTION
615    WHEN OTHERS THEN
616       LOG ( l_method_name
617           , 'DELETE_TRANSITION_SUBSETS.LIST_' || p_list_id
618           , SQLERRM );
619       RAISE;
620    END;
621 
622    -- REMOVE POSSIBLE ENTRIES FROM THE SUBSET COUNTS TABLE.
623    BEGIN
624       EXECUTE IMMEDIATE 'DELETE FROM IEC_G_REP_SUBSET_COUNTS WHERE LIST_HEADER_ID = :1'
625          USING p_list_id;
626    EXCEPTION
627    WHEN OTHERS THEN
628       LOG ( l_method_name
629           , 'DELETE_SUBSET_COUNTS.LIST_' || p_list_id
630           , SQLERRM );
631       RAISE;
632    END;
633 
634    -- REMOVE ENTRIES FROM THE CALL ZONE TABLE FOR THIS TARGET GROUP.
635    BEGIN
636       EXECUTE IMMEDIATE 'DELETE FROM IEC_G_MKTG_ITEM_CC_TZS WHERE LIST_HEADER_ID = :1'
637          USING p_list_id;
638    EXCEPTION
639    WHEN OTHERS THEN
640       LOG ( l_method_name
641           , 'DELETE_CALLABLE_ZONES.LIST_' || p_list_id
642           , SQLERRM );
643       RAISE;
644    END;
645 
646    -- REMOVE ENTRIES FROM THE VALIDATION HISTORY TABLE FOR THIS TARGET GROUP.
647    BEGIN
648       EXECUTE IMMEDIATE 'DELETE FROM IEC_O_VALIDATION_HISTORY WHERE LIST_HEADER_ID = :1'
649          USING p_list_id;
650    EXCEPTION
651    WHEN OTHERS THEN
652       LOG ( l_method_name
653           , 'DELETE_VALIDATION_HISTORY.LIST_' || p_list_id
654           , SQLERRM );
655       RAISE;
656    END;
657 
658    -- REMOVE ENTRIES FROM THE VALIDATION REPORT DETAILS TABLE FOR THIS TARGET GROUP.
659    BEGIN
660       EXECUTE IMMEDIATE 'DELETE FROM IEC_O_VALIDATION_REPORT_DETS WHERE LIST_HEADER_ID = :1'
661          USING p_list_id;
662    EXCEPTION
663    WHEN OTHERS THEN
664       LOG ( l_method_name
665           , 'DELETE_VALIDATION_REPORT_DETAILS.LIST_' || p_list_id
666           , SQLERRM );
667       RAISE;
668    END;
669 
670    -- REMOVE ENTRIES FROM THE VALIDATION STATUS TABLE FOR THIS TARGET GROUP.
671    BEGIN
672       EXECUTE IMMEDIATE 'DELETE FROM IEC_O_VALIDATION_STATUS WHERE LIST_HEADER_ID = :1'
673          USING p_list_id;
674    EXCEPTION
675    WHEN OTHERS THEN
676       LOG ( l_method_name
677           , 'DELETE_VALIDATION_STATUS.LIST_' || p_list_id
678           , SQLERRM );
679       RAISE;
680    END;
681 
682    -- REMOVE ENTRIES FROM THE AO ENTRIES TABLE FOR THIS TARGET GROUP.
683    BEGIN
684       EXECUTE IMMEDIATE 'DELETE FROM IEC_G_RETURN_ENTRIES WHERE LIST_HEADER_ID = :1'
685          USING p_list_id;
686    EXCEPTION
687    WHEN OTHERS THEN
688       LOG ( l_method_name
689           , 'DELETE_RETURN_ENTRIES.LIST_' || p_list_id
690           , SQLERRM );
691       RAISE;
692    END;
693 
694    -- Update target group status to reflect
695    -- that the entries have been removed.
696    Update_List_Status(p_list_id, 'DELETED');
697 
698    -- Commit the changes to make it final.
699    COMMIT;
700 
701 EXCEPTION
702    WHEN OTHERS THEN
703       ROLLBACK;
704       LOG ( l_method_name
705           , 'MAIN.LIST_' || p_list_id
706           , SQLERRM );
707       RAISE_APPLICATION_ERROR(-20999, g_error_msg);
708 END Clean_ListEntries;
709 
710 
711 -----------------------------++++++-------------------------------
712 --
713 -- Start of comments
714 --
715 --  API name    : Start_ListExecution
716 --  Type        : Public
717 --  Pre-reqs    : None
718 --  Function    : Set the list status to 'EXECUTING' and update
719 --                the execution start time.
720 --
721 --  Parameters  : p_list_id IN NUMBER
722 --
723 --  Version     : Initial version 1.0
724 --
725 -- End of comments
726 --
727 -----------------------------++++++-------------------------------
728 PROCEDURE Start_ListExecution (p_list_id IN NUMBER)
729 IS
730   PRAGMA AUTONOMOUS_TRANSACTION;
731   l_method_name CONSTANT VARCHAR2(30) := 'Start_ListExecution';
732 BEGIN
733 
734    ----------------------------------------------------------------
735    -- We call update list status to set the status of this list to
736    -- ACTIVE.  The UPDATE_LIST_STATUS procedure will handle any
737    -- addtional procedures that need to be executed for a list to
738    -- become active.  This includes creating the runtime information.
739    ----------------------------------------------------------------
740    UPDATE_LIST_STATUS( p_list_id
741                      , 'ACTIVE');
742    COMMIT;
743 
744 EXCEPTION
745    WHEN OTHERS THEN
746       ROLLBACK;
747       LOG ( l_method_name
748           , 'MAIN.LIST_' || p_list_id
749           , SQLERRM );
750       RAISE_APPLICATION_ERROR(-20999, g_error_msg);
751 END Start_ListExecution;
752 
753 -----------------------------++++++-------------------------------
754 --
755 -- Start of comments
756 --
757 --  API name    : Stop_ListExecution
758 --  Type        : Public
759 --  Pre-reqs    : None
760 --  Function    : Set the list status to 'LOCKED' and make sure
761 --                that all entries are checked back into list.
762 --
763 --  Parameters  : p_list_id IN NUMBER
764 --
765 --  Version     : Initial version 1.0
766 --
767 -- End of comments
768 --
769 -----------------------------++++++-------------------------------
770 PROCEDURE Stop_ListExecution (p_list_id IN NUMBER)
771 IS
772    PRAGMA AUTONOMOUS_TRANSACTION;
773    l_method_name CONSTANT VARCHAR2(30) := 'Stop_ListExecution';
774    l_stopped_server_id_col SYSTEM.number_tbl_type;
775    l_records_out NUMBER;
776    l_user_status_id NUMBER;
777 BEGIN
778 
779    -- Get list of STOPPED servers that have records checked out
780    SELECT DISTINCT B.SERVER_ID
781    BULK COLLECT INTO l_stopped_server_id_col
782    FROM IEC_G_RETURN_ENTRIES A, IEO_SVR_RT_INFO B
783    WHERE A.CHECKOUT_ACTION_ID = B.SERVER_ID
784    AND A.LIST_HEADER_ID = p_list_id
785    AND A.RECORD_OUT_FLAG = 'Y'
786    AND B.STATUS = 1;
787 
788    -- Recover any records that are checked out to STOPPED servers
789    IF l_stopped_server_id_col IS NOT NULL AND l_stopped_server_id_col.COUNT > 0 THEN
790       FORALL i IN l_stopped_server_id_col.FIRST..l_stopped_server_id_col.LAST
791          UPDATE IEC_G_RETURN_ENTRIES
792          SET RECORD_OUT_FLAG = 'N'
793            , CHECKOUT_ACTION_ID = NULL
794            , LAST_UPDATE_DATE = SYSDATE
795          WHERE LIST_HEADER_ID = p_list_id
796          AND CHECKOUT_ACTION_ID = l_stopped_server_id_col(i);
797    END IF;
798 
799    -- Check if all records have been checked back in
800    SELECT COUNT(*)
801    INTO l_records_out
802    FROM IEC_G_RETURN_ENTRIES
803    WHERE LIST_HEADER_ID = p_list_id
804    AND RECORD_OUT_FLAG = 'Y';
805 
806    IF l_records_out = 0 THEN
807 
808       -- Update status to Inactive since we can stop the list right now
809       UPDATE_LIST_STATUS( p_list_id
810                         , 'INACTIVE');
811 
812    ELSE
813       -- Update status to Stopping since we can't stop the list right now
814       -- since a running dial server still has entries checked out
815       UPDATE_LIST_STATUS( p_list_id
816                         , 'STOPPING');
817 
818    END IF;
819 
820    COMMIT;
821 
822 EXCEPTION
823    WHEN OTHERS THEN
824       ROLLBACK;
825       LOG ( l_method_name
826           , 'MAIN.LIST_' || p_list_id
827           , SQLERRM );
828       RAISE_APPLICATION_ERROR(-20999, g_error_msg);
829 END Stop_ListExecution;
830 
831 PROCEDURE Stop_ScheduleExecution_Pub
832    ( p_schedule_id   IN            NUMBER
833    , p_commit        IN            BOOLEAN
834    , x_return_status    OUT NOCOPY VARCHAR2)
835 IS
836    l_method_name CONSTANT VARCHAR2(30) := 'Stop_ListExecution_Pub';
837 
838    l_list_id NUMBER(15);
839    l_schedule_name VARCHAR2(100);
840    l_status_code VARCHAR2(30);
841 
842    l_stopped_server_id_col SYSTEM.number_tbl_type;
843    l_records_out NUMBER;
844    l_user_status_id NUMBER;
845 
846 BEGIN
847 
848    SAVEPOINT stop_list;
849 
850    x_return_status := FND_API.G_RET_STS_SUCCESS;
851 
852    IEC_COMMON_UTIL_PVT.Get_ListId(p_schedule_id, l_list_id);
853 
854    -- Check ao status to make sure that list is Active
855    -- It only makes sense to stop an Active schedule, but
856    -- the user may call this api with an Inactive schedule
857    EXECUTE IMMEDIATE
858       'SELECT A.STATUS_CODE
859        FROM IEC_G_AO_LISTS_V A
860        WHERE A.LIST_HEADER_ID = :list_id
861        AND LANGUAGE = USERENV(''LANG'')'
862    INTO l_status_code
863    USING l_list_id;
864 
865    -- Only Active schedules may be stopped
866    IF l_status_code <> 'ACTIVE' THEN
867       RETURN;
868    END IF;
869 
870    -- Update status to Stopping with api_initiated_flag = 'Y'
871    Update_List_Status(l_list_id, 'STOPPING', 'Y');
872 
873    -- Get list of STOPPED servers that have records checked out
874    SELECT DISTINCT B.SERVER_ID
875    BULK COLLECT INTO l_stopped_server_id_col
876    FROM IEC_G_RETURN_ENTRIES A, IEO_SVR_RT_INFO B
877    WHERE A.CHECKOUT_ACTION_ID = B.SERVER_ID
878    AND A.LIST_HEADER_ID = l_list_id
879    AND A.RECORD_OUT_FLAG = 'Y'
880    AND B.STATUS = 1;
881 
882    -- Recover any records that are checked out to STOPPED servers
883    IF l_stopped_server_id_col IS NOT NULL AND l_stopped_server_id_col.COUNT > 0 THEN
884       FORALL i IN l_stopped_server_id_col.FIRST..l_stopped_server_id_col.LAST
885          UPDATE IEC_G_RETURN_ENTRIES
886          SET RECORD_OUT_FLAG = 'N'
887            , CHECKOUT_ACTION_ID = NULL
888            , LAST_UPDATE_DATE = SYSDATE
889          WHERE LIST_HEADER_ID = l_list_id
890          AND CHECKOUT_ACTION_ID = l_stopped_server_id_col(i);
891    END IF;
892 
893    -- Check if all records have been checked back in
894    SELECT COUNT(*)
895    INTO l_records_out
896    FROM IEC_G_RETURN_ENTRIES
897    WHERE LIST_HEADER_ID = l_list_id
898    AND RECORD_OUT_FLAG = 'Y';
899 
900    IF l_records_out = 0 THEN
901       -- Update status to Inactive since we can stop the list right now
902       UPDATE_LIST_STATUS( l_list_id
903                         , 'INACTIVE'
904                         , NULL);
905 
906    ELSE
907       -- List cannot be stopped b/c records are still checked out
908       -- Rather than update the status to STOPPING so that the
909       -- status plugin will continually check to see if the records
910       -- are checked back in, we will simply log a message and
911       -- set the status back to ACTIVE.
912       -- The reasoning is that if they are calling an api to stop
913       -- the list, they really can't wait for it to happen.
914       UPDATE_LIST_STATUS( l_list_id
915                         , 'ACTIVE'
916                         , NULL);
917 
918       IEC_COMMON_UTIL_PVT.Get_ScheduleName(p_schedule_id, l_schedule_name);
919       Log_CannotStopSchedule(l_method_name, 'CANNOT_STOP_LIST', l_schedule_name);
920       RAISE fnd_api.g_exc_error;
921    END IF;
922 
923    IF p_commit THEN
924       COMMIT;
925    END IF;
926 
927 EXCEPTION
928    WHEN fnd_api.g_exc_error THEN
929       ROLLBACK TO stop_list;
930       FND_MSG_PUB.ADD;
931       x_return_status := FND_API.G_RET_STS_ERROR;
932    WHEN OTHERS THEN
933       ROLLBACK TO stop_list;
934       LOG ( l_method_name
935           , 'MAIN.SCHEDULE_' || p_schedule_id
936           , SQLERRM );
937       FND_MSG_PUB.ADD;
938       x_return_status := FND_API.G_RET_STS_ERROR;
939 END Stop_ScheduleExecution_Pub;
940 
941 -----------------------------++++++-------------------------------
942 --
943 -- Start of comments
944 --
945 --  API name    : Pause_ListExecution
946 --  Type        : Public
947 --  Pre-reqs    : None
948 --  Function    : Set the schedule status to 'ON_HOLD'.
949 --
950 --  Parameters  : p_schedule_id IN NUMBER
951 --
952 --  Version     : Initial version 1.0
953 --
954 -- End of comments
955 --
956 -----------------------------++++++-------------------------------
957 PROCEDURE Pause_ScheduleExecution
958    ( p_schedule_id IN NUMBER
959    , p_user_id     IN NUMBER
960    )
961 IS
962    PRAGMA AUTONOMOUS_TRANSACTION;
963    l_method_name CONSTANT VARCHAR2(30) := 'Pause_ListExecution';
964    l_user_status_id NUMBER;
965 BEGIN
966 
967    SELECT USER_STATUS_ID
968    INTO l_user_status_id
969    FROM AMS_USER_STATUSES_B
970    WHERE SYSTEM_STATUS_TYPE = 'AMS_CAMPAIGN_SCHEDULE_STATUS'
971    AND SYSTEM_STATUS_CODE = 'ON_HOLD'
972    AND ROWNUM = 1;
973 
974    UPDATE_SCHEDULE_STATUS( p_schedule_id
975                          , l_user_status_id
976                          , p_user_id
977                          );
978    COMMIT;
979 
980 EXCEPTION
981    WHEN OTHERS THEN
982       ROLLBACK;
983       LOG ( l_method_name
984           , 'MAIN.SCHEDULE_' || p_schedule_id
985           , SQLERRM );
986       RAISE_APPLICATION_ERROR(-20999, g_error_msg);
987 END Pause_ScheduleExecution;
988 
989 -----------------------------++++++-------------------------------
990 --
991 -- Start of comments
992 --
993 --  API name    : HANDLE_STATUS_TRANSITIONS
994 --  Type        : Public
995 --  Pre-reqs    : None
996 --  Function    : Called by the Status plugin to execute status
997 --                transitions.
998 --  Parameters  : P_SERVER_ID     IN      NUMBER        Required
999 --
1000 --  Version     : Initial version 1.0
1001 --
1002 -- End of comments
1003 --
1004 -----------------------------++++++-------------------------------
1005 PROCEDURE HANDLE_STATUS_TRANSITIONS
1006    ( P_SERVER_ID          IN            NUMBER
1007    )
1008 IS
1009   L_STATUS_CODE VARCHAR2(1);
1010   L_DEFAULT_SUBSET_NAME VARCHAR2(255);
1011   L_USER_ID NUMBER;
1012   L_LOGIN_ID NUMBER;
1013   l_log_status VARCHAR2(1);
1014   l_method_name CONSTANT VARCHAR2(30) := 'HANDLE_STATUS_TRANSITIONS';
1015 
1016 BEGIN
1017   L_STATUS_CODE := 'S';
1018   L_DEFAULT_SUBSET_NAME := 'DEFAULT SUBSET';
1019   L_USER_ID := NVL(FND_GLOBAL.USER_ID, -1);
1020   L_LOGIN_ID := NVL(FND_GLOBAL.CONC_LOGIN_ID, -1);
1021 
1022   SAVEPOINT STATUS_START;
1023 
1024   ----------------------------------------------------------------
1025   -- Call procedure to stop lists that no longer meet the
1026   -- requirements for execution.
1027   ----------------------------------------------------------------
1028   STOP_LISTS;
1029 
1030   COMMIT;
1031 
1032 EXCEPTION
1033   ----------------------------------------------------------------
1034   -- If either of the two FND_API exceptions have been thrown then
1035   -- the procedure has already logged the error and we now just
1036   -- set the return status flag and return to the calling
1037   -- procedure.
1038   ----------------------------------------------------------------
1039   WHEN FND_API.G_EXC_ERROR THEN
1040     ROLLBACK TO STATUS_START;
1041     RAISE_APPLICATION_ERROR(-20999, g_error_msg);
1042   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1043     ROLLBACK TO STATUS_START;
1044     RAISE_APPLICATION_ERROR(-20999, g_error_msg);
1045   ----------------------------------------------------------------
1046   -- If an anonymous exception has been thrown then
1047   -- the we must log an internal PLSQL error and
1048   -- set the return status flag and return to the calling
1049   -- procedure.
1050   ----------------------------------------------------------------
1051   WHEN OTHERS THEN
1052     ROLLBACK TO STATUS_START;
1053     LOG ( l_method_name
1054         , 'MAIN'
1055         , SQLERRM );
1056     RAISE_APPLICATION_ERROR(-20999, g_error_msg);
1057 END HANDLE_STATUS_TRANSITIONS;
1058 
1059 END IEC_STATUS_PVT;