DBA Data[Home] [Help]

PACKAGE BODY: APPS.IEC_SUBSET_PVT

Source


1 PACKAGE BODY IEC_SUBSET_PVT AS
2 /* $Header: IECOCSBB.pls 115.27 2004/09/03 16:47:23 alromero noship $ */
3 
4 g_pkg_name CONSTANT VARCHAR2(30) := 'IEC_SUBSET_PVT';
5 
6 TYPE TerritoryList IS TABLE OF VARCHAR2(2) INDEX BY BINARY_INTEGER;
7 TYPE UniqueIdList IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
8 
9 G_NUM_MINUTES_IN_DAY CONSTANT NUMBER := 1440;
10 G_SYSTEM_OUTCOME_CODE CONSTANT NUMBER := 37;
11 G_LOST_RESULT_CODE CONSTANT NUMBER := 11;
12 G_RELEASE_STRATEGY_DEFAULT CONSTANT VARCHAR2(30) := 'QUA';
13 G_QUANTUM_DEFAULT CONSTANT NUMBER := 100;
14 G_QUOTA_DEFAULT CONSTANT NUMBER := 100;
15 G_QUOTA_RESET_DEFAULT CONSTANT NUMBER := 60;
16 G_MIN_CACHE_ENTRIES CONSTANT NUMBER := 1000;
17 G_MAX_INIT_CACHE_ENTRIES CONSTANT NUMBER := 30000;
18 G_QUERY_CALLBACK_NUM CONSTANT NUMBER := 1000;
19 g_error_msg VARCHAR2(2048) := NULL;
20 
21 -----------------------------++++++-------------------------------
22 --
23 -- Start of comments
24 --
25 --  API name    : LOG
26 --  Type        : Private
27 --  Pre-reqs    : None
28 --  Function    :
29 --  Parameters  : P_ACTIVITY_DESC  IN     NUMBER            Required
30 --                P_METHOD_NAME    IN     NUMBER            Required
31 --                P_SQL_CODE       IN     NUMBER            Required
32 --                P_SQL_ERRM       IN     VARCHAR2          Required
33 --                P_SOURCE_ID      IN     NUMBER            Required
34 --
35 --  Version     : Initial version 1.0
36 --
37 -- End of comments
38 --
39 -----------------------------++++++-------------------------------
40 PROCEDURE Log ( p_method_name   IN VARCHAR2
41               , p_sub_method    IN VARCHAR2
42               , p_sql_errm      IN VARCHAR2)
43 IS
44    l_error_msg VARCHAR2(2048);
45 BEGIN
46 
47    IEC_OCS_LOG_PVT.LOG_INTERNAL_PLSQL_ERROR
48                       ( 'IEC_SUBSET_PVT'
49                       , p_method_name
50                       , p_sub_method
51                       , p_sql_errm
52                       , g_error_msg
53                       );
54 
55 END Log;
56 
57 -- Logs a translatable message that has already been initialized
58 PROCEDURE Log
59    ( p_method_name   IN VARCHAR2
60    , p_sub_method    IN VARCHAR2)
61 IS
62    l_module VARCHAR2(4000);
63 BEGIN
64 
65    IEC_OCS_LOG_PVT.Get_Module('IEC_SUBSET_PVT', p_method_name, p_sub_method, l_module);
66    g_error_msg := l_module || ':' || g_error_msg;
67    IEC_OCS_LOG_PVT.Log_Message(l_module);
68 
69 END Log;
70 
71 PROCEDURE Log_SubsetViewInvalid
72    ( p_method_name   IN VARCHAR2
73    , p_sub_method    IN VARCHAR2
74    , p_subset_name   IN VARCHAR2
75    , p_list_name     IN VARCHAR2)
76 IS
77    l_module VARCHAR2(4000);
78    l_encoded_message VARCHAR2(4000);
79 BEGIN
80 
81    IEC_OCS_LOG_PVT.Init_SubsetViewInvalidMsg(p_subset_name, p_list_name, g_error_msg, l_encoded_message);
82    IEC_OCS_LOG_PVT.Get_Module('IEC_SUBSET_PVT', p_method_name, p_sub_method, l_module);
83    g_error_msg := l_module || ':' || g_error_msg;
84    IEC_OCS_LOG_PVT.Log_Message(l_module);
85 
86 END Log_SubsetViewInvalid;
87 
88 -----------------------------++++++-------------------------------
89 --
90 -- Start of comments
91 --
92 --  API name    : TRACELOG
93 --  Type        : Private
94 --  Pre-reqs    : None
95 --  Function    :
96 --  Parameters  : P_TEXT     IN     NUMBER                Required
97 --
98 --  Version     : Initial version 1.0
99 --
100 -- End of comments
101 --
102 -----------------------------++++++-------------------------------
103 PROCEDURE TRACELOG
104    (P_TEXT IN VARCHAR2)
105 IS
106 BEGIN
107 --   DBMS_OUTPUT.PUT_LINE(P_TEXT);
108    NULL;
109 END TRACELOG;
110 
111 FUNCTION Get_AppsSchemaName
112 RETURN VARCHAR2
113 IS
114    l_schema_name VARCHAR2(30);
115 BEGIN
116 
117    SELECT ORACLE_USERNAME
118    INTO l_schema_name
119    FROM FND_ORACLE_USERID
120    WHERE READ_ONLY_FLAG = 'U';
121 
122    RETURN l_schema_name;
123 
124 EXCEPTION
125    WHEN OTHERS THEN
126       Log( 'Get_AppsSchemaName'
127          , 'MAIN'
128          , SQLERRM);
129       RAISE fnd_api.g_exc_unexpected_error;
130 
131 END Get_AppsSchemaName;
132 
133 -----------------------------++++++-------------------------------
134 --
135 -- Start of comments
136 --
137 --  API name    : LOCK_SCHEDULE
138 --  Type        : Private
139 --  Pre-reqs    : None
140 --  Function    : Attempt to lock or unlock the schedule.
141 --
142 --  Parameters  : P_SOURCE_ID    IN     NUMBER            Required
143 --                P_SCHED_ID     IN     NUMBER            Required
144 --                P_SERVER_ID    IN     NUMBER            Required
145 --                P_LOCK_FLAG    IN     VARCHAR2          Required
146 --                X_SUCCESS_FLAG    OUT VARCHAR2          Required
147 --
148 --  Version     : Initial version 1.0
149 --
150 -- End of comments
151 --
152 -----------------------------++++++-------------------------------
153 PROCEDURE LOCK_SCHEDULE
154    ( P_SOURCE_ID    IN            NUMBER
155    , P_SCHED_ID     IN            NUMBER
156    , P_SERVER_ID    IN            NUMBER
157    , P_LOCK_FLAG    IN            VARCHAR2
158    , X_SUCCESS_FLAG    OUT NOCOPY VARCHAR2
159    )
160 IS
161 BEGIN
162 
163    IEC_COMMON_UTIL_PVT.LOCK_SCHEDULE
164       ( P_SOURCE_ID
165       , P_SCHED_ID
166       , P_SERVER_ID
167       , P_LOCK_FLAG
168       , X_SUCCESS_FLAG
169       );
170 
171 EXCEPTION
172    WHEN OTHERS THEN
173       -- FND_MESSAGE is initialized but not logged in IEC_COMMON_UTIL_PVT
174       -- if an exception is thrown, so we log it here with current
175       -- module
176       Log( 'LOCK_SCHEDULE'
177          , 'MAIN.SCHEDULE_' || P_SCHED_ID
178          );
179       RAISE fnd_api.g_exc_unexpected_error;
180 
181 END LOCK_SCHEDULE;
182 
183 FUNCTION Get_ListName
184    (p_list_id IN NUMBER)
185 RETURN VARCHAR2
186 IS
187    l_name VARCHAR2(240);
188 BEGIN
189 
190    IEC_COMMON_UTIL_PVT.Get_ListName(p_list_id, l_name);
191 
192    RETURN l_name;
193 EXCEPTION
194    WHEN OTHERS THEN
195       -- FND_MESSAGE is initialized but not logged in IEC_COMMON_UTIL_PVT
196       -- if an exception is thrown, so we log it here with current
197       -- module
198       Log('Get_ListName', 'MAIN.LIST_' || p_list_id);
199       RAISE fnd_api.g_exc_unexpected_error;
200 END Get_ListName;
201 
202 FUNCTION Get_SubsetName
203    (p_subset_id IN NUMBER)
204 RETURN VARCHAR2
205 IS
206    l_name VARCHAR2(240);
207 BEGIN
208 
209    IEC_COMMON_UTIL_PVT.Get_SubsetName(p_subset_id, l_name);
210 
211    RETURN l_name;
212 EXCEPTION
213    WHEN OTHERS THEN
214       -- FND_MESSAGE is initialized but not logged in IEC_COMMON_UTIL_PVT
215       -- if an exception is thrown, so we log it here with current
216       -- module
217       Log('Get_ListName', 'MAIN.SUBSET_' || p_subset_id);
218       RAISE fnd_api.g_exc_unexpected_error;
219 END Get_SubsetName;
220 
221 
222 -----------------------------++++++-------------------------------
223 --
224 -- Start of comments
225 --
226 --  API name    : GET_SOURCETYPE_VIEW_NAME
227 --  Type        : Public
228 --  Pre-reqs    : None
229 --  Function    : Retrieve the target group's source type view name.
230 --
231 --  Parameters  : P_SOURCE_ID          IN     NUMBER                       Required
232 --                P_TARGET_GROUP_ID    IN     VARCHAR2                     Required
233 --                X_VIEW_NAME          IN OUT DBMS_SQL.VARCHAR2S           Required
234 --
235 --  Version     : Initial version 1.0
236 --
237 -- End of comments
238 --
239 -----------------------------++++++-------------------------------
240 PROCEDURE GET_SOURCETYPE_VIEW_NAME
241    ( P_SOURCE_ID          IN            NUMBER
242    , P_TARGET_GROUP_ID    IN            VARCHAR2
243    , X_VIEW_NAME             OUT NOCOPY VARCHAR2
244    )
245 IS
246 BEGIN
247 
248    IEC_COMMON_UTIL_PVT.Get_SourceTypeView(p_target_group_id, x_view_name);
249 
250 EXCEPTION
251    WHEN OTHERS THEN
252       -- FND_MESSAGE is initialized but not logged in Get_SourceTypeView
253       -- if an exception is thrown, so we log it here with current
254       -- module
255       Log( 'GET_SOURCETYPE_VIEW_NAME'
256          , 'MAIN.LIST_' || p_target_group_id
257          );
258       RAISE fnd_api.g_exc_unexpected_error;
259 
260 END GET_SOURCETYPE_VIEW_NAME;
261 
262 PROCEDURE UPDATE_SUBSET_COUNTS
263    ( p_campaign_id IN NUMBER
264    , p_schedule_id IN NUMBER
265    , p_list_id     IN NUMBER
266    , p_subset_id   IN NUMBER
267    , p_rec_loaded  IN NUMBER
268    , p_rec_called  IN NUMBER)
269 IS
270    l_rec_count NUMBER;
271 BEGIN
272 
273    -- Check for existence of record for the current subset
274    EXECUTE IMMEDIATE
275       'SELECT COUNT(*)
276        FROM IEC_G_REP_SUBSET_COUNTS
277        WHERE SUBSET_ID = :subset_id'
278    INTO l_rec_count
279    USING p_subset_id;
280 
281    -- If record does not exist, create record and initialize counts
282    IF l_rec_count = 0 THEN
283 
284       EXECUTE IMMEDIATE
285          'INSERT INTO IEC_G_REP_SUBSET_COUNTS
286           ( SUBSET_COUNT_ID
287           , CAMPAIGN_ID
288           , SCHEDULE_ID
289           , LIST_HEADER_ID
290           , SUBSET_ID
291           , RECORD_LOADED
292           , RECORD_CALLED_ONCE
293           , RECORD_CALLED_AND_REMOVED
294           , RECORD_CALLED_AND_REMOVED_COPY
295           , LAST_COPY_TIME
296           , CREATED_BY
297           , CREATION_DATE
298           , LAST_UPDATE_LOGIN
299           , LAST_UPDATE_DATE
300           , LAST_UPDATED_BY
301           , OBJECT_VERSION_NUMBER
302           )
303           VALUES
304           (IEC_G_REP_SUBSET_COUNTS_S.NEXTVAL
305           , :campaign_id
306           , :schedule_id
307           , :list_id
308           , :subset_id
309           , :records_loaded
310           , :records_called
311           , 0
312           , 0
313           , SYSDATE
314           , 1
315           , SYSDATE
316           , 1
317           , SYSDATE
318           , 0
319           , 0)'
320       USING p_campaign_id
321           , p_schedule_id
322           , p_list_id
323           , p_subset_id
324           , p_rec_loaded
325           , p_rec_called;
326 
327    ELSE
328       -- If record exists, simply update counts by appropriate increment
329       EXECUTE IMMEDIATE
330          'UPDATE IEC_G_REP_SUBSET_COUNTS
331           SET RECORD_LOADED = NVL(RECORD_LOADED, 0) + :records_loaded
332             , RECORD_CALLED_ONCE = NVL(RECORD_CALLED_ONCE, 0) + :records_called
333             , LAST_UPDATE_DATE = SYSDATE
334           WHERE SUBSET_ID = :subset_id'
335       USING p_rec_loaded
336           , p_rec_called
337           , p_subset_id;
338 
339    END IF;
340 
341 EXCEPTION
342    WHEN OTHERS THEN
343       Log( 'UPDATE_SUBSET_COUNTS'
344          , 'MAIN.SUBSET_' || p_subset_id
345          , SQLERRM
346          );
347       RAISE_APPLICATION_ERROR(-20999, g_error_msg);
348 END UPDATE_SUBSET_COUNTS;
349 
350 -----------------------------++++++-------------------------------
351 -- Start of comments
352 --
353 --  API name    : CREATE_SUBSET_VIEW
354 --  Type        : Public
355 --  Pre-reqs    : None
356 --  Function    : Creates a view for the specified subset using
357 --                the view name provided.
358 --
359 --  Parameters  : P_SOURCE_ID                IN     NUMBER                       Required
360 --                P_SUBSET_ID                IN     NUMBER                       Required
361 --                P_VIEW_NAME                IN     VARCHAR2                     Required
362 --                P_TARGET_GROUP_ID          IN     NUMBER                       Required
363 --                P_SOURCE_TYPE_VIEW_NAME    IN     VARCHAR2                     Required
364 --                P_DEFAULT_SUBSET_FLAG      IN     VARCHAR2                     Required
365 --                X_RETURN_CODE                 OUT VARCHAR2                     Required
366 --
367 --  Version     : Initial version 1.0
368 --
369 -- End of comments
370 --
371 -----------------------------++++++-------------------------------
372 PROCEDURE CREATE_SUBSET_VIEW
373    ( P_SOURCE_ID             IN            NUMBER
374    , P_SUBSET_ID             IN            NUMBER
375    , P_VIEW_NAME             IN            VARCHAR2
376    , P_TARGET_GROUP_ID       IN            NUMBER
377    , P_SOURCE_TYPE_VIEW_NAME IN            VARCHAR2
378    , P_DEFAULT_SUBSET_FLAG   IN            VARCHAR2
379    , X_RETURN_CODE              OUT NOCOPY VARCHAR2
380    )
381 IS
382 
383    ----------------------------------------------------------------
384    -- A table of VARCHAR2(256) that is used to build the subset
385    -- query.
386    ----------------------------------------------------------------
387    l_create_statement DBMS_SQL.VARCHAR2S;
388 
389    ----------------------------------------------------------------
390    -- The identifier for the DBMS_SQL cursor that we are going to
391    -- use.
392    ----------------------------------------------------------------
393     l_work_cursor NUMBER;
394 
395    ----------------------------------------------------------------
396    -- Dummy number variable used in the execute function.
397    ----------------------------------------------------------------
398    l_dummy NUMBER;
399 
400    ----------------------------------------------------------------
401    -- The first part of the subset query SQL that is unique to
402    -- each list by source view id and list id:
403    ----------------------------------------------------------------
404    l_create_start_str  CONSTANT VARCHAR2(16) := 'CREATE VIEW ';
405 
406    ----------------------------------------------------------------
407    -- The first part of the subset query SQL that is unique to
408    -- each list by source view id and list id:
409    ----------------------------------------------------------------
410    l_create_as_str  CONSTANT VARCHAR2(100) := ' AS SELECT LIST_ENTRY_ID FROM ';
411 
412    ----------------------------------------------------------------
413    -- The first part of the subset query SQL that is unique to
414    -- each list by source view id and list id:
415    ----------------------------------------------------------------
416    l_create_where_str  CONSTANT VARCHAR2(32) := ' WHERE LIST_HEADER_ID = ';
417 
418    ----------------------------------------------------------------
419    -- Local Status code.
420    ----------------------------------------------------------------
421    l_status_code VARCHAR2(1);
422 
423 BEGIN
424    TRACELOG( 'STARTING CREATE SUBSET VIEW');
425    X_RETURN_CODE := FND_API.G_RET_STS_SUCCESS;
426 
427    ----------------------------------------------------------------
428    -- If this is a default subset, then we need to call the get
429    -- default subset criteria procedure.
430    ----------------------------------------------------------------
431    IF NVL(P_DEFAULT_SUBSET_FLAG, 'N') = 'N'
432    THEN
433 
434       l_create_statement(1) := l_create_start_str
435                             || P_VIEW_NAME
436                             || l_create_as_str
437                             || P_SOURCE_TYPE_VIEW_NAME
438                             || l_create_where_str
439                             || P_TARGET_GROUP_ID
440                             || ' AND ';
441 
442       ----------------------------------------------------------------
443       -- Append the subset criteria clause.
444       ----------------------------------------------------------------
445       IEC_CRITERIA_UTIL_PVT.Append_SubsetCriteriaClause( p_source_id
446                                                        , p_subset_id
447                                                        , p_source_type_view_name
448                                                        , l_create_statement
449                                                        , l_status_code);
450 
451       TRACELOG('Number of subset lines ' || l_Create_statement.COUNT);
452 
453       FOR T IN l_create_statement.FIRST..l_create_statement.LAST
454       LOOP
455          TRACELOG(l_create_statement(T));
456       END LOOP;
457 
458       l_work_cursor := DBMS_SQL.OPEN_CURSOR;
459 
460       DBMS_SQL.PARSE( c             => l_work_cursor
461                     , statement     => l_create_statement
462                     , lb            => 1
463                     , ub            => l_create_statement.COUNT
464                     , lfflg         => FALSE
465                     , language_flag => DBMS_SQL.NATIVE);
466 
467 
468       l_dummy := DBMS_SQL.EXECUTE(l_work_cursor);
469 
470       DBMS_SQL.CLOSE_CURSOR(l_work_cursor);
471 
472    ----------------------------------------------------------------
473    -- If this is a default subset, then we don't create a view.
474    ----------------------------------------------------------------
475    ELSE
476       NULL;
477    END IF; -- end of the if default subset conditional.
478    TRACELOG('STOP CREATE SUBSET VIEW');
479 
480 EXCEPTION
481    -- Fixme add logic to handle if entry does not exist.
482    -- This should no happen.
483    WHEN FND_API.G_EXC_ERROR  THEN
484       IF DBMS_SQL.IS_OPEN(l_work_cursor) THEN
485          DBMS_SQL.CLOSE_CURSOR(l_work_cursor);
486       END IF;
487       X_RETURN_CODE := 'E';
488     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
489       IF DBMS_SQL.IS_OPEN(l_work_cursor) THEN
490          DBMS_SQL.CLOSE_CURSOR(l_work_cursor);
491       END IF;
492       X_RETURN_CODE := 'U';
493     WHEN OTHERS THEN
494       TRACELOG('SQLERRM: ' || SQLERRM);
495       IF DBMS_SQL.IS_OPEN(l_work_cursor)
496       THEN
497          DBMS_SQL.CLOSE_CURSOR(l_work_cursor);
498       END IF;
499       X_RETURN_CODE := 'U';
500 
501 END CREATE_SUBSET_VIEW;
502 
503 -----------------------------++++++-------------------------------
504 -- Start of comments
505 --
506 --  API name    : DROP_SUBSET_VIEW
507 --  Type        : Public
508 --  Pre-reqs    : None
509 --  Function    : Drops the view defined for the specified subset.
510 --
511 --  Parameters  : P_SOURCE_ID                IN     NUMBER                       Required
512 --                P_SUBSET_ID                IN     NUMBER                       Required
513 --                X_RETURN_CODE                 OUT VARCHAR2                     Required
514 --
515 --  Version     : Initial version 1.0
516 --
517 -- End of comments
518 --
519 -----------------------------++++++-------------------------------
520 PROCEDURE DROP_SUBSET_VIEW
521    ( P_SOURCE_ID             IN             NUMBER
522    , P_SUBSET_ID             IN             NUMBER
523    , X_RETURN_CODE              OUT NOCOPY VARCHAR2
524    )
525 IS
526 
527   ----------------------------------------------------------------
528   -- Local Status code.
529   ----------------------------------------------------------------
530   l_status_code VARCHAR2(1);
531   l_view_name VARCHAR2(30);
532   l_view_owner VARCHAR2(30);
533   l_ignore NUMBER;
534 
535 BEGIN
536    TRACELOG('STARTING DROP SUBSET VIEW');
537    X_RETURN_CODE := FND_API.G_RET_STS_SUCCESS;
538 
539    /*
540        DROP VIEW IEC_SUBSET_<id>_V
541    */
542 
543    l_view_name := 'IEC_SUBSET_' || P_SUBSET_ID || '_V';
544    l_view_owner := Get_AppsSchemaName;
545 
546    BEGIN
547       SELECT 1
548       INTO   l_ignore
549       FROM   ALL_VIEWS
550       WHERE  VIEW_NAME = UPPER(l_view_name)
551       AND    OWNER = UPPER(l_view_owner);
552 
553       EXECUTE IMMEDIATE 'DROP VIEW ' || l_view_name;
554 
555    EXCEPTION
556       WHEN NO_DATA_FOUND THEN
557         NULL;
558       WHEN OTHERS THEN
559         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
560    END;
561 
562    TRACELOG('STOP DROP SUBSET VIEW');
563 
564 EXCEPTION
565     -- Fixme add logic to handle if entry does not exist.
566     -- This should no happen.
567     WHEN FND_API.G_EXC_ERROR  THEN
568       X_RETURN_CODE := 'E';
569     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
570       X_RETURN_CODE := 'U';
571     WHEN OTHERS THEN
572       TRACELOG('SQLERRM: ' || SQLERRM);
573       X_RETURN_CODE := 'U';
574 END DROP_SUBSET_VIEW;
575 
576 -----------------------------++++++-------------------------------
577 --
578 -- Start of comments
579 --
580 --  API name    : DROP_TARGET_GROUP_VIEWS
581 --  Type        : Private
582 --  Pre-reqs    : None
583 --  Function    : For each subset in the specified target group,
584 --                drop the subset view.
585 --
586 --  Parameters  : P_SOURCE_ID            IN     NUMBER                       Required
587 --                P_TARGET_GROUP_ID      IN     NUMBER                       Required
588 --                X_RETURN_CODE             OUT VARCHAR2                     Required
589 --
590 --  Version     : Initial version 1.0
591 --
592 -- End of comments
593 --
594 -----------------------------++++++-------------------------------
595 PROCEDURE DROP_TARGET_GROUP_VIEWS
596    ( P_SOURCE_ID             IN            NUMBER
597    , P_TARGET_GROUP_ID       IN            NUMBER
598    , X_RETURN_CODE              OUT NOCOPY VARCHAR2
599    )
600 IS
601 
602   ----------------------------------------------------------------
603   -- Local Status code.
604   ----------------------------------------------------------------
605   l_status_code VARCHAR2(1);
606 
607 BEGIN
608    TRACELOG('STARTING DROP TARGET GROUP VIEWS');
609    X_RETURN_CODE := FND_API.G_RET_STS_SUCCESS;
610 
611     FOR subset_rec IN (SELECT LIST_SUBSET_ID
612                       FROM    IEC_G_LIST_SUBSETS
613                       WHERE   LIST_HEADER_ID = P_TARGET_GROUP_ID
614                       AND     NVL(DEFAULT_SUBSET_FLAG, 'N') = 'N')
615     LOOP
616        DROP_SUBSET_VIEW( P_SOURCE_ID
617                        , subset_rec.LIST_SUBSET_ID
618                        , l_status_code);
619     END LOOP;
620 
621    TRACELOG('STOP CREATE TARGET GROUP VIEWS');
622 
623 EXCEPTION
624     -- Fixme add logic to handle if entry does not exist.
625     -- This should no happen.
626     WHEN FND_API.G_EXC_ERROR  THEN
627       X_RETURN_CODE := 'E';
628     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
629       X_RETURN_CODE := 'U';
630     WHEN OTHERS THEN
631       TRACELOG('SQLERRM: ' || SQLERRM);
632       X_RETURN_CODE := 'U';
633 
634 END DROP_TARGET_GROUP_VIEWS;
635 
636 -----------------------------++++++-------------------------------
637 --
638 -- Start of comments
639 --
640 --  API name    : VERIFY_SUBSET_VIEW
641 --  Type        : Private
642 --  Pre-reqs    : None
643 --  Function    :
644 --  Parameters  : P_SOURCE_ID       IN     NUMBER         Required
645 --                P_SUBSET_ID       IN     NUMBER         Required
646 --                X_VIEW_NAME          OUT VARCHAR2       Required
647 --                X_VIEW_EXISTS        OUT VARCHAR2       Required
648 --                X_RETURN_CODE        OUT VARCHAR2       Required
649 --
650 --  Version     : Initial version 1.0
651 --
652 -- End of comments
653 --
654 -----------------------------++++++-------------------------------
655 PROCEDURE VERIFY_SUBSET_VIEW
656    ( P_SOURCE_ID          IN            NUMBER
657    , P_SUBSET_ID          IN            NUMBER
658    , P_TARGET_GROUP_ID    IN            NUMBER
659    , X_VIEW_NAME             OUT NOCOPY VARCHAR2
660    , X_VIEW_EXISTS           OUT NOCOPY VARCHAR2
661    , X_RETURN_CODE           OUT NOCOPY VARCHAR2
662    )
663 IS
664 
665    L_STATUS VARCHAR2(10);
666    L_VIEW_NAME VARCHAR2(30);
667    l_view_owner VARCHAR2(30);
668    L_RETURN_CODE VARCHAR2(1);
669 
670 BEGIN
671    TRACELOG('STARTING VERIFY SUBSET VIEW');
672    X_RETURN_CODE := FND_API.G_RET_STS_SUCCESS;
673    X_VIEW_NAME := NULL;
674    X_VIEW_EXISTS := 'N';
675 
676    L_VIEW_NAME := 'IEC_SUBSET_' || P_SUBSET_ID || '_V';
677    l_view_owner := Get_AppsSchemaName;
678 
679    BEGIN
680 
681      EXECUTE IMMEDIATE ' SELECT STATUS ' ||
682                        ' FROM ALL_OBJECTS ' ||
683                        ' WHERE OWNER = :owner ' ||
684                        ' AND OBJECT_NAME = :b1 ' ||
685                        ' AND OBJECT_TYPE = ''VIEW'' '
686      INTO L_STATUS
687      USING l_view_owner
688          , L_VIEW_NAME;
689 
690 
691      IF (L_STATUS <> 'VALID')
692      THEN
693 
694        BEGIN
695           EXECUTE IMMEDIATE 'ALTER VIEW ' || L_VIEW_NAME || ' COMPILE';
696           X_VIEW_EXISTS := 'Y';
697        EXCEPTION
698          WHEN OTHERS THEN
699            TRACELOG('VIEW <' || L_VIEW_NAME || '> IS INVALID');
700            Log_SubsetViewInvalid
701               ( 'VERIFY_SUBSET_VIEW'
702     	      , 'RECOMPILE_SUBSET_VIW'
703     	      , Get_SubsetName(p_subset_id)
704     	      , Get_ListName(p_target_group_id)
705 	          );
706          RAISE FND_API.G_EXC_ERROR;
707        END;
708 
709      ELSE
710        X_VIEW_EXISTS := 'Y';
711      END IF;
712 
713      X_VIEW_NAME := L_VIEW_NAME;
714 
715    EXCEPTION
716     WHEN NO_DATA_FOUND THEN
717        X_VIEW_EXISTS := 'N';
718        X_VIEW_NAME := L_VIEW_NAME;
719     WHEN OTHERS THEN
720        RAISE;
721    END;
722 
723    TRACELOG('END VERIFY SUBSET VIEW ' || X_VIEW_EXISTS);
724    TRACELOG('END VERIFY SUBSET VIEWNAME ' || X_VIEW_NAME);
725 
726 EXCEPTION
727     WHEN FND_API.G_EXC_ERROR  THEN
728        X_RETURN_CODE := 'E';
729     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
730        X_RETURN_CODE := 'U';
731     WHEN OTHERS THEN
732        TRACELOG('SQLERRM: ' || SQLERRM);
733        LOG( 'VERIFY_SUBSET_VIEW'
734     	  , 'MAIN.SUBSET_' || p_subset_id
735 	      , SQLERRM
736 	      );
737        X_RETURN_CODE := 'U';
738 
739 END VERIFY_SUBSET_VIEW;
740 
741 -----------------------------++++++-------------------------------
742 --
743 -- Start of comments
744 --
745 --  API name    : CREATE_SUBSET_RT_INFO
746 --  Type        : Public
747 --  Pre-reqs    : None
748 --  Function    : If the subset runtime information entries do not
749 --                already exist, create them.
750 --
751 --  Parameters  : P_SUBSET_ID      IN     NUMBER                       Required
752 --
753 --  Version     : Initial version 1.0
754 --
755 -- End of comments
756 --
757 -----------------------------++++++-------------------------------
758 PROCEDURE CREATE_SUBSET_RT_INFO
759    ( P_SUBSET_ID            IN            NUMBER
760    )
761 IS
762 
763   L_RELEASE_STRATEGY VARCHAR2(30);
764   L_RETURN_CODE      VARCHAR2(1);
765   L_STATUS_CODE      VARCHAR2(100);
766   L_LOAD_PRIORITY    NUMBER;
767   L_QUANTUM          NUMBER;
768   L_QUOTA            NUMBER;
769   L_QUOTA_RESET      NUMBER;
770   L_LOGIN_USERID     NUMBER;
771   L_USERID           NUMBER;
772 
773 BEGIN
774   L_LOGIN_USERID     := NVL(FND_GLOBAL.conc_login_id, -1);
775   L_USERID           := NVL(FND_GLOBAL.user_id, -1);
776 
777   ----------------------------------------------------------------
778   -- Create save point for this procedure.
779   ----------------------------------------------------------------
780   SAVEPOINT CREATE_SUBSET_RT_INFO_SAVE;
781 
782   ----------------------------------------------------------------
783   -- Retrieve the default data values for the release strategy
784   -- from the subset entry on the IEC_G_LIST_SUBSETS table.  If
785   -- default values do not exists then we use defaults.  We could
786   -- have retrieved this data in the populate cache procedure, but
787   -- a subset is only going to retrieve these once, but could be
788   -- used for a long time.  That was the reason behind taking the
789   -- performance hit here.
790   ----------------------------------------------------------------
791 
792   BEGIN
793     SELECT NVL(RELEASE_STRATEGY, G_RELEASE_STRATEGY_DEFAULT)
794     ,      NVL(QUANTUM, G_QUANTUM_DEFAULT)
795     ,      NVL(QUOTA, G_QUOTA_DEFAULT)
796     ,      NVL(QUOTA_RESET, G_QUOTA_RESET_DEFAULT)
797     ,      STATUS_CODE
798     ,      LOAD_PRIORITY
799     INTO   L_RELEASE_STRATEGY
800     ,      L_QUANTUM
801     ,      L_QUOTA
802     ,      L_QUOTA_RESET
803     ,      L_STATUS_CODE
804     ,      L_LOAD_PRIORITY
805     FROM   IEC_G_LIST_SUBSETS
806     WHERE  LIST_SUBSET_ID = P_SUBSET_ID;
807 
808   EXCEPTION
809     WHEN NO_DATA_FOUND THEN
810       ----------------------------------------------------------------
811       -- This shouldn't happen, if it does log an error and stop
812       -- processing for this subset. TODO
813       ----------------------------------------------------------------
814       RAISE;
815     WHEN OTHERS THEN
816       RAISE;
817   END; -- end block to query for subset default values.
818 
819   ----------------------------------------------------------------
820   -- If the release strategy is quantum then we need to set the
821   -- value of the quota equal to the start value of the quantum.
822   ----------------------------------------------------------------
823   IF L_RELEASE_STRATEGY = 'QUA'
824   THEN
825     L_QUOTA := L_QUANTUM;
826   END IF;
827 
828   ----------------------------------------------------------------
829   -- We calculate the next time to reset the quota be taking the
830   -- quota reset interval retrieved in the previous query,
831   -- dividing it by the number of minutes in a day (1440), and
832   -- adding this value to the current SYSDATE.
833   ----------------------------------------------------------------
834   L_QUOTA_RESET := L_QUOTA_RESET / G_NUM_MINUTES_IN_DAY;
835 
836   ----------------------------------------------------------------
837   -- Create an entry in the IEC_G_SUBSET_RT_INFO table to support
838   -- the new subset.
839   ----------------------------------------------------------------
840   BEGIN
841 
842     INSERT INTO IEC_G_SUBSET_RT_INFO
843     (           SUBSET_RT_INFO_ID
844     ,           LIST_SUBSET_ID
845     ,           WORKING_QUANTUM
846     ,           WORKING_QUOTA
847     ,           QUOTA_RESET_TIME
848     ,           CACHE_AMT_NEEDED
849     ,           VALID_FLAG
850     ,           USE_FLAG
851     ,           CALLABLE_FLAG
852     ,           TOTAL_CACHE_COUNT
853     ,           STATUS_CODE
854     ,           LOAD_PRIORITY
855     ,           CREATED_BY
856     ,           CREATION_DATE
857     ,           LAST_UPDATED_BY
858     ,           LAST_UPDATE_DATE
859     )
860     VALUES
861     (           IEC_G_SUBSET_RT_INFO_S.NEXTVAL
862     ,           P_SUBSET_ID
863     ,           L_QUANTUM
864     ,           L_QUOTA
865     ,           SYSDATE + L_QUOTA_RESET
866     ,           NULL
867     ,           'Y'
868     ,           'Y'
869     ,           'Y'
870     ,           0
871     ,           L_STATUS_CODE
872     ,           L_LOAD_PRIORITY
873     ,           L_USERID
874     ,           SYSDATE
875     ,           L_LOGIN_USERID
876     ,           SYSDATE
877     );
878 
879   EXCEPTION
880     WHEN DUP_VAL_ON_INDEX THEN
881 	   EXECUTE IMMEDIATE
882           ' UPDATE IEC_G_SUBSET_RT_INFO
883 		    SET  STATUS_CODE = :1
884               ,  LOAD_PRIORITY = :2
885 		   	  ,  LAST_UPDATE_DATE = SYSDATE
886 			WHERE LIST_SUBSET_ID = :3'
887        USING L_STATUS_CODE, L_LOAD_PRIORITY, P_SUBSET_ID;
888 
889     WHEN OTHERS THEN
890       RAISE;
891   END; -- end of block for inserting entry into IEC_G_SUBSET_RT_INFO table.
892 
893 EXCEPTION
894     WHEN OTHERS THEN
895       ROLLBACK TO CREATE_SUBSET_RT_INFO_SAVE;
896       Log( 'CREATE_SUBSET_RT_INFO'
897          , 'MAIN.SUBSET_' || p_subset_id
898          , SQLERRM
899          );
900       RAISE_APPLICATION_ERROR(-20999, g_error_msg);
901 
902 END CREATE_SUBSET_RT_INFO;
903 
904 -----------------------------++++++-------------------------------
905 --
906 -- Start of comments
907 --
908 --  API name    : GET_SUBSET_VIEW
909 --  Type        : Public
910 --  Pre-reqs    : None
911 --  Function    : Returns the subset view name after verifying that the view
912 --                exists, creating the view if necessary.
913 --
914 --  Parameters  : P_SOURCE_ID                IN     NUMBER                       Required
915 --                P_TARGET_GROUP_ID          IN     NUMBER                       Required
916 --                P_SUBSET_ID                IN     NUMBER                       Required
917 --                P_DEFAULT_SUBSET_FLAG      IN     VARCHAR2                     Required
918 --                P_SOURCE_TYPE_VIEW_NAME    IN     VARCHAR2                     Required
919 --                X_RETURN_CODE                 OUT VARCHAR2                     Required
920 --
921 --  Version     : Initial version 1.0
922 --
923 -- End of comments
924 --
925 -----------------------------++++++-------------------------------
926 FUNCTION GET_SUBSET_VIEW
927    ( P_SOURCE_ID                IN            NUMBER
928    , P_TARGET_GROUP_ID          IN            NUMBER
929    , P_SUBSET_ID                IN            NUMBER
930    , P_DEFAULT_SUBSET_FLAG      IN            VARCHAR2
931    , P_SOURCE_TYPE_VIEW_NAME    IN            VARCHAR2
932    , X_RETURN_CODE                 OUT NOCOPY VARCHAR2
933    )
934 RETURN VARCHAR2
935 IS
936    l_subset_view_name VARCHAR2(500);
937    l_return_code      VARCHAR2(1);
938    l_view_exists      VARCHAR2(1);
939    l_default_subset_flag VARCHAR2(1);
940 
941 BEGIN
942    l_return_code      := FND_API.G_RET_STS_SUCCESS;
943    l_view_exists      := 'N';
944    l_default_subset_flag := 'N';
945 
946    TRACELOG('BEGIN GET SUBSET VIEW');
947    ----------------------------------------------------------------
948    -- Initialize the return code.
949    ----------------------------------------------------------------
950    X_RETURN_CODE := FND_API.G_RET_STS_SUCCESS;
951 
952    ----------------------------------------------------------------
953    -- Create save point for this procedure.
954    ----------------------------------------------------------------
955    SAVEPOINT GET_SUBSET_VIEW_SAVE;
956 
957    IF P_DEFAULT_SUBSET_FLAG = 'Y' OR P_DEFAULT_SUBSET_FLAG = 'N'
958    THEN
959       l_default_Subset_Flag := P_DEFAULT_SUBSET_FLAG;
960    ELSE
961 
962       BEGIN
963          SELECT NVL(DEFAULT_SUBSET_FLAG, 'N')
964          INTO l_default_subset_Flag
965          FROM   IEC_G_LIST_SUBSETS
966          WHERE  LIST_HEADER_ID = P_TARGET_GROUP_ID
967          AND    LIST_SUBSET_ID = P_SUBSET_ID;
968       EXCEPTION
969       WHEN OTHERS THEN
970          RAISE;
971       END;
972 
973    END IF;
974 
975    IF l_default_subset_flag <> 'Y' THEN
976 
977       l_subset_view_name := 'IEC_SUBSET_' || P_SUBSET_ID || '_V';
978 
979       TRACELOG('BEFORE VERIFY SUBSET VIEW ' || l_subset_view_name);
980       VERIFY_SUBSET_VIEW ( P_SOURCE_ID => P_SOURCE_ID
981                          , P_SUBSET_ID => P_SUBSET_ID
982                          , P_TARGET_GROUP_ID => P_TARGET_GROUP_ID
983                          , X_VIEW_NAME => l_subset_view_name
984                          , X_VIEW_EXISTS => l_view_exists
985                          , X_RETURN_CODE => l_return_code
986                          );
987 
988       TRACELOG('AFTER VERIFY SUBSET VIEW ' || l_return_code || ' : ' || l_view_exists);
989 
990       IF (l_return_code = FND_API.G_RET_STS_SUCCESS AND l_view_exists = 'N') THEN
991 
992          CREATE_SUBSET_VIEW( P_SOURCE_ID => P_SOURCE_ID
993                            , P_SUBSET_ID => P_SUBSET_ID
994                            , P_VIEW_NAME => l_subset_view_name
995                            , P_TARGET_GROUP_ID => P_TARGET_GROUP_ID
996                            , P_SOURCE_TYPE_VIEW_NAME => P_SOURCE_TYPE_VIEW_NAME
997                            , P_DEFAULT_SUBSET_FLAG => l_default_Subset_Flag
998                            , X_RETURN_CODE => l_return_code
999                            );
1000 
1001          IF (l_return_code <> FND_API.G_RET_STS_SUCCESS) THEN
1002             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1003          END IF;
1004 
1005       ELSIF (l_return_code <> FND_API.G_RET_STS_SUCCESS) THEN
1006          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1007       END IF;
1008    ELSE
1009       l_subset_view_name := 'DEFAULT';
1010    END IF;
1011 
1012    TRACELOG('END GET SUBSET VIEW ' || l_subset_view_name);
1013    RETURN l_subset_view_name;
1014 
1015 EXCEPTION
1016     WHEN OTHERS THEN
1017       ROLLBACK TO GET_SUBSET_VIEW_SAVE;
1018       X_RETURN_CODE := FND_API.G_RET_STS_UNEXP_ERROR;
1019 
1020 END GET_SUBSET_VIEW;
1021 
1022 -----------------------------++++++-------------------------------
1023 --
1024 -- Start of comments
1025 --
1026 --  API name    : RECREATE_SUBSET_VIEW
1027 --  Type        : Public
1028 --  Pre-reqs    : None
1029 --  Procedure   : Recreates the subset view, deleting it first if necessary.
1030 --
1031 --  Parameters  : P_SOURCE_ID           IN            NUMBER   Required
1032 --                P_TARGET_GROUP_ID     IN            NUMBER   Required
1033 --                P_SUBSET_ID           IN            NUMBER   Required
1034 --                X_SUBSET_VIEW_NAME       OUT NOCOPY VARCHAR2 Required
1035 --
1036 --  Version     : Initial version 1.0
1037 --
1038 -- End of comments
1039 --
1040 -----------------------------++++++-------------------------------
1041 PROCEDURE RECREATE_SUBSET_VIEW
1042    ( P_SOURCE_ID                IN            NUMBER
1043    , P_TARGET_GROUP_ID          IN            NUMBER
1044    , P_SUBSET_ID                IN            NUMBER
1045    , X_SUBSET_VIEW_NAME            OUT NOCOPY VARCHAR2
1046    )
1047 IS
1048    l_subset_view_name VARCHAR2(500);
1049    l_source_type_view_name VARCHAR2(30);
1050    l_view_exists      VARCHAR2(1);
1051    l_return_code      VARCHAR2(1);
1052 
1053 BEGIN
1054    l_view_exists      := 'N';
1055    ----------------------------------------------------------------
1056    -- Initialize the return code.
1057    ----------------------------------------------------------------
1058    l_return_code := FND_API.G_RET_STS_SUCCESS;
1059 
1060    X_SUBSET_VIEW_NAME := 'ERROR';
1061 
1062    ----------------------------------------------------------------
1063    -- Create save point for this procedure.
1064    ----------------------------------------------------------------
1065    SAVEPOINT RECREATE_SUBSET_VIEW_SAVE;
1066 
1067     ----------------------------------------------------------------
1068     -- This will retrieve the view name from an IEc lookup value
1069     -- that has been seeded in the database.  In the future there
1070     -- might be an algorithm used to BUILD the view name using values
1071     -- stored in the marketing schema.
1072     ----------------------------------------------------------------
1073     GET_SOURCETYPE_VIEW_NAME
1074       ( P_SOURCE_ID  => P_SOURCE_ID
1075       , P_TARGET_GROUP_ID  => P_TARGET_GROUP_ID
1076       , X_VIEW_NAME  => l_source_type_view_name);
1077 
1078 
1079    l_subset_view_name := 'IEC_SUBSET_' || P_SUBSET_ID || '_V';
1080 
1081    ----------------------------------------------------------------
1082    -- Check to see if the view already exists.
1083    ----------------------------------------------------------------
1084    VERIFY_SUBSET_VIEW ( P_SOURCE_ID => P_SOURCE_ID
1085                       , P_SUBSET_ID => P_SUBSET_ID
1086                       , P_TARGET_GROUP_ID => P_TARGET_GROUP_ID
1087                       , X_VIEW_NAME => l_subset_view_name
1088                       , X_VIEW_EXISTS => l_view_exists
1089                       , X_RETURN_CODE => l_return_code
1090                       );
1091 
1092    ----------------------------------------------------------------
1093    -- If the view already exists then drop the view.
1094    ----------------------------------------------------------------
1095    IF (l_return_code = FND_API.G_RET_STS_SUCCESS AND l_view_exists = 'Y')
1096    THEN
1097       DROP_SUBSET_VIEW( P_SOURCE_ID => P_SOURCE_ID
1098                       , P_SUBSET_ID => P_SUBSET_ID
1099                       , X_RETURN_CODE => l_return_code);
1100 
1101    ELSIF (l_return_code <> FND_API.G_RET_STS_SUCCESS)
1102    THEN
1103       Log( 'RECREATE_SUBSET_VIEW'
1104          , 'VERIFY_SUBSET_VIEW.SUBSET_' || p_subset_id
1105          , SQLERRM);
1106       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1107 
1108    END IF;
1109 
1110    ----------------------------------------------------------------
1111    -- If everything was successful up to this point then we
1112    -- create the subset view.
1113    ----------------------------------------------------------------
1114    IF (l_return_code = FND_API.G_RET_STS_SUCCESS)
1115    THEN
1116       CREATE_SUBSET_VIEW( P_SOURCE_ID => P_SOURCE_ID
1117                         , P_SUBSET_ID => P_SUBSET_ID
1118                         , P_VIEW_NAME => l_subset_view_name
1119                         , P_TARGET_GROUP_ID => P_TARGET_GROUP_ID
1120                         , P_SOURCE_TYPE_VIEW_NAME => l_source_type_view_name
1121                         , P_DEFAULT_SUBSET_FLAG => 'N'
1122                         , X_RETURN_CODE => l_return_code
1123                         );
1124 
1125       IF (l_return_code <> FND_API.G_RET_STS_SUCCESS) THEN
1126          Log( 'RECREATE_SUBSET_VIEW'
1127             , 'CREATE_SUBSET_VIEW.SUBSET_' || p_subset_id
1128             , SQLERRM);
1129          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1130       END IF;
1131 
1132       X_SUBSET_VIEW_NAME := l_subset_view_name;
1133 
1134    ELSE
1135       Log( 'RECREATE_SUBSET_VIEW'
1136          , 'DROP_SUBSET_VIEW.SUBSET_' || p_subset_id
1137          , SQLERRM);
1138       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1139    END IF;
1140 
1141 EXCEPTION
1142     WHEN FND_API.G_EXC_UNEXPECTED_ERROR
1143     THEN
1144 --      ROLLBACK TO RECREATE_SUBSET_VIEW_SAVE;
1145       RAISE_APPLICATION_ERROR(-20999, g_error_msg);
1146     WHEN OTHERS THEN
1147       Log( 'RECREATE_SUBSET_VIEW'
1148          , 'MAIN.SUBSET_' || p_subset_id
1149          , SQLERRM);
1150 --      ROLLBACK TO RECREATE_SUBSET_VIEW_SAVE;
1151       RAISE_APPLICATION_ERROR(-20999, g_error_msg);
1152 
1153 END RECREATE_SUBSET_VIEW;
1154 
1155 -----------------------------++++++-------------------------------
1156 --
1157 -- Start of comments
1158 --
1159 --  API name    : TRANSITION_NON_CHECKED_ENTRIES
1160 --  Type        : Public
1161 --  Pre-reqs    : None
1162 --  Function    :
1163 --  Parameters  : P_SOURCE_ID                      IN     NUMBER                       Required
1164 --                P_TARGET_GROUP_ID                IN     NUMBER                       Required
1165 --                X_RETURN_CODE                    OUT  VARCHAR2                       Required
1166 --
1167 --  Version     : Initial version 1.0
1168 --
1169 -- End of comments
1170 --
1171 -----------------------------++++++-------------------------------
1172 PROCEDURE TRANSITION_NON_CHECKED_ENTRIES
1173    ( P_SOURCE_ID          IN     NUMBER
1174    , p_CAMPAIGN_ID        IN     NUMBER
1175    , P_SCHEDULE_ID        IN     NUMBER
1176    , P_TARGET_GROUP_ID    IN     NUMBER
1177    , P_STYPE_VIEW_NAME    IN     VARCHAR2
1178    , P_REINIT_FLAG        IN     VARCHAR2
1179    )
1180 IS
1181 
1182   l_called_once_count NUMBER;
1183 
1184 BEGIN
1185 
1186             ----------------------------------------------------------------
1187             -- Need to collect counts.  This is for the records that have
1188             -- NOT been checked out of AMS_LIST_ENTRIES.  Those records
1189             -- need to be treated differently to keep from causing
1190             -- deadlocks with the other processes.
1191             ----------------------------------------------------------------
1192             FOR count_rec IN (
1193                select   orig_subset_id
1194                ,        new_subset_id
1195                ,        do_not_use_flag
1196                ,        orig_itm_cc_tz_id
1197                ,        new_itm_cc_tz_id
1198                ,        call_Attempts
1199                ,        count(*) NUM_ENTRIES
1200                from     iec_o_transition_subsets
1201                where    (record_out_Flag = 'N' OR record_out_flag = 'R')
1202 --               and      new_subset_id <> orig_subset_id
1203                and      list_id = P_TARGET_GROUP_ID
1204                group by orig_subset_id
1205                ,        new_Subset_id
1206                ,        do_not_use_flag
1207                ,        orig_itm_cc_tz_id
1208                ,        new_itm_cc_Tz_id
1209                ,        call_Attempts
1210                )
1211             LOOP
1212 
1213                ----------------------------------------------------------------
1214                -- Update the subset ids for the entries that have changed
1215                -- subsets and are not checked out in bulk.  These are only
1216                -- available for updates by prefetching or validation and these
1217                -- should not be allowed at the same time as the subset
1218                -- transitioning for this schedule.  I only updates these by time zones so I can
1219                -- update one record at a time from the IEC_G_REP_SUBSET_COUNTS and
1220                -- IEC_G_MKTG_ITEM_CC_TZS table to avoid deadlocks with validation
1221                -- calendar and recycling.
1222                ----------------------------------------------------------------
1223                TRACELOG('UPDATING RETURN_ENTRIES ');
1224 
1225                EXECUTE IMMEDIATE 'UPDATE IEC_G_RETURN_ENTRIES A ' ||
1226                                  'SET A.SUBSET_ID = :newSubset ' ||
1227                                  ', A.ITM_CC_TZ_ID = :newCallZone ' ||
1228                                  ', A.PULLED_SUBSET_ID = NULL ' ||
1229                                  'WHERE A.LIST_ENTRY_ID IN (SELECT C.LIST_ENTRY_ID ' ||
1230                                                            'FROM   IEC_O_TRANSITION_SUBSETS C ' ||
1231                                                            'WHERE  C.LIST_ID = :listID ' ||
1232                                                            'AND    C.NEW_SUBSET_ID = :newSubset ' ||
1233                                                            'AND    C.ORIG_SUBSET_ID = :origSubset ' ||
1234                                                            'AND    C.NEW_ITM_CC_TZ_ID = :newCall ' ||
1235                                                            'AND    C.ORIG_ITM_CC_TZ_ID = :origCall ' ||
1236                                                            'AND    C.CALL_ATTEMPTS = :callAttempts ' ||
1237                                                            'AND    C.DO_NOT_USE_FLAG = :do_not_use_Flag ' ||
1238                                                            'AND    (C.RECORD_OUT_FLAG = ''N'' OR C.RECORD_OUT_FLAG = ''R''))' ||
1239                                  'AND A.LIST_HEADER_ID = :listID'
1240                                  USING count_rec.new_subset_id
1241                                      , count_rec.new_itm_cc_tz_id
1242                                      , P_TARGET_GROUP_ID
1243                                      , count_rec.new_subset_id
1244                                      , count_rec.orig_subset_id
1245                                      , count_rec.new_itm_cc_tz_id
1246                                      , count_rec.orig_itm_cc_tz_id
1247                                      , count_rec.call_Attempts
1248                                      , count_rec.do_not_use_flag
1249                                      , P_TARGET_GROUP_ID;
1250 
1251                TRACELOG('UPDATED RETURN_ENTRIES ' || SQL%ROWCOUNT);
1252                ----------------------------------------------------------------
1253                -- Update the phone cross reference foreign keys for all of the
1254                -- entries that are moving subsets.  Once we move to the
1255                -- architecture away from ALE then this will no longer be needed.
1256                ----------------------------------------------------------------
1257                TRACELOG('UPDATING VIEW ');
1258                EXECUTE IMMEDIATE 'UPDATE ' || P_STYPE_VIEW_NAME || ' A ' ||
1259                                  ' SET A.REASON_CODE_S1 = ( SELECT /*+ index(B iec_o_transition_phones_u1) */ ITM_CC_TZ_ID ' ||
1260                                                           ' FROM IEC_O_TRANSITION_PHONES B' ||
1261                                                           ' WHERE B.PHONE_INDEX = 1 ' ||
1262                                                           ' AND B.LIST_ENTRY_ID = A.LIST_ENTRY_ID  ' ||
1263                                                           ' AND B.LIST_ID = A.LIST_HEADER_ID ) ' ||
1264                                  ' , A.REASON_CODE_S2 = ( SELECT /*+ index(C iec_o_transition_phones_u1) */ C.ITM_CC_TZ_ID ' ||
1265                                                           ' FROM IEC_O_TRANSITION_PHONES C' ||
1266                                                           ' WHERE C.PHONE_INDEX = 2 ' ||
1267                                                           ' AND C.LIST_ENTRY_ID = A.LIST_ENTRY_ID  ' ||
1268                                                           ' AND C.LIST_ID = A.LIST_HEADER_ID ) ' ||
1269                                  ' , A.REASON_CODE_S3 = ( SELECT /*+ index(D iec_o_transition_phones_u1) */ D.ITM_CC_TZ_ID ' ||
1270                                                           ' FROM IEC_O_TRANSITION_PHONES D' ||
1271                                                           ' WHERE D.PHONE_INDEX = 3 ' ||
1272                                                           ' AND D.LIST_ENTRY_ID = A.LIST_ENTRY_ID  ' ||
1273                                                           ' AND D.LIST_ID = A.LIST_HEADER_ID ) ' ||
1274                                  ' , A.REASON_CODE_S4 = ( SELECT /*+ index(E iec_o_transition_phones_u1) */ E.ITM_CC_TZ_ID ' ||
1275                                                           ' FROM IEC_O_TRANSITION_PHONES E' ||
1276                                                           ' WHERE E.PHONE_INDEX = 4 ' ||
1277                                                           ' AND E.LIST_ENTRY_ID = A.LIST_ENTRY_ID  ' ||
1278                                                           ' AND E.LIST_ID = A.LIST_HEADER_ID ) ' ||
1279                                  ' , A.REASON_CODE_S5 = ( SELECT /*+ index(F iec_o_transition_phones_u1) */ F.ITM_CC_TZ_ID ' ||
1280                                                           ' FROM IEC_O_TRANSITION_PHONES F' ||
1281                                                           ' WHERE F.PHONE_INDEX = 5 ' ||
1282                                                           ' AND F.LIST_ENTRY_ID = A.LIST_ENTRY_ID  ' ||
1283                                                           ' AND F.LIST_ID = A.LIST_HEADER_ID ) ' ||
1284                                  ' , A.REASON_CODE_S6 = ( SELECT /*+ index(G iec_o_transition_phones_u1) */ G.ITM_CC_TZ_ID ' ||
1285                                                           ' FROM IEC_O_TRANSITION_PHONES G' ||
1286                                                           ' WHERE G.PHONE_INDEX = 6 ' ||
1287                                                           ' AND G.LIST_ENTRY_ID = A.LIST_ENTRY_ID  ' ||
1288                                                           ' AND G.LIST_ID = A.LIST_HEADER_ID ) ' ||
1289                                  'WHERE A.LIST_ENTRY_ID IN (SELECT H.LIST_ENTRY_ID ' ||
1290                                                            'FROM   IEC_O_TRANSITION_SUBSETS H ' ||
1291                                                            'WHERE  H.LIST_ID = :listID ' ||
1292                                                            'AND    H.NEW_SUBSET_ID = :newSubset ' ||
1293                                                            'AND    H.ORIG_SUBSET_ID = :origSubset ' ||
1294                                                            'AND    H.NEW_ITM_CC_TZ_ID = :newCall ' ||
1295                                                            'AND    H.ORIG_ITM_CC_TZ_ID = :origCall ' ||
1296                                                            'AND    H.CALL_ATTEMPTS = :callAttempts ' ||
1297                                                            'AND    H.DO_NOT_USE_FLAG = :do_not_use_Flag ' ||
1298                                                            'AND    (H.RECORD_OUT_FLAG = ''N'' OR H.RECORD_OUT_FLAG = ''R''))' ||
1299                                  'AND A.LIST_HEADER_ID = :listID'
1300                                  USING P_TARGET_GROUP_ID
1301                                      , count_rec.new_subset_id
1302                                      , count_rec.orig_subset_id
1303                                      , count_rec.new_itm_cc_tz_id
1304                                      , count_rec.orig_itm_cc_tz_id
1305                                      , count_rec.call_Attempts
1306                                      , count_rec.do_not_use_flag
1307                                      , P_TARGET_GROUP_ID;
1308 
1309                TRACELOG('UPDATED VIEW ' || SQL%ROWCOUNT);
1310 
1311                TRACELOG('Before Modifying callzones ' || count_rec.new_itm_cc_tz_id ||
1312                                        ' : ' || count_rec.orig_itm_cc_tz_id || ' : ' || count_rec.do_not_use_flag);
1313                ----------------------------------------------------------------
1314                -- If this group represents a remaining group then we have to
1315                -- adjust the iec_g_mktg_item_cc_Tzs callZones counts.
1316                ----------------------------------------------------------------
1317                IF count_rec.do_not_use_flag = 'N' AND count_rec.new_itm_cc_tz_id  <> count_rec.orig_itm_cc_tz_id
1318                THEN
1319 
1320                   TRACELOG('Modifying callzones ' || count_rec.new_itm_cc_tz_id ||
1321                                        ' : ' || count_rec.orig_itm_cc_tz_id || ' : ' || count_rec.NUM_ENTRIES);
1322                   ----------------------------------------------------------------
1323                   -- Update the IEC_G_MKTG_ITEM_CC_TZS table.  May need to select
1324                   -- for update to dismiss the deadlock possibilities.
1325                   ----------------------------------------------------------------
1326                   EXECUTE IMMEDIATE 'UPDATE IEC_G_MKTG_ITEM_CC_TZS ' ||
1327                                     'SET    RECORD_COUNT = RECORD_COUNT + :remainingCount ' ||
1328                                     'WHERE  ITM_CC_TZ_ID = :callZone'
1329                                     USING count_rec.NUM_ENTRIES, count_rec.new_itm_cc_tz_id;
1330 
1331                   ----------------------------------------------------------------
1332                   -- Update the IEC_G_MKTG_ITEM_CC_TZS table.
1333                   ----------------------------------------------------------------
1334                   IF (P_REINIT_FLAG = 'N')
1335                   THEN
1336                      EXECUTE IMMEDIATE 'UPDATE IEC_G_MKTG_ITEM_CC_TZS ' ||
1337                                        'SET    RECORD_COUNT = RECORD_COUNT - :remainingCount ' ||
1338                                        'WHERE  ITM_CC_TZ_ID = :callZone'
1339                                        USING count_rec.NUM_ENTRIES, count_rec.orig_itm_cc_tz_id;
1340                   END IF;
1341                END IF;
1342 
1343                ----------------------------------------------------------------
1344                -- Has this group been called once or not.
1345                ----------------------------------------------------------------
1346                IF count_rec.call_Attempts = 0
1347                THEN
1348                   l_called_once_count := 0;
1349                ELSE
1350                   l_called_once_count := count_rec.NUM_ENTRIES;
1351                END IF;
1352 
1353                ----------------------------------------------------------------
1354                -- Update the IEC_G_REP_SUBSET_COUNTS table.
1355                -- May need to select for update to dismiss the deadlock possibilities.
1356                ----------------------------------------------------------------
1357                IF  count_rec.new_subset_id <>  count_rec.orig_subset_id
1358                THEN
1359                   UPDATE_SUBSET_COUNTS( P_CAMPAIGN_ID
1360                                       , P_SCHEDULE_ID
1361                                       , P_TARGET_GROUP_ID
1362                                       , count_rec.new_subset_id
1363                                       , count_rec.NUM_ENTRIES
1364                                       , l_called_once_count
1365                                       );
1366 
1367                   IF (P_REINIT_FLAG = 'N')
1368                   THEN
1369                      UPDATE_SUBSET_COUNTS( P_CAMPAIGN_ID
1370                                          , P_SCHEDULE_ID
1371                                          , P_TARGET_GROUP_ID
1372                                          , count_rec.orig_subset_id
1373                                          , (0 - count_rec.NUM_ENTRIES)
1374                                          , (0 - l_called_once_count)
1375                                          );
1376                   END IF;
1377                END IF;
1378                COMMIT;
1379 
1380             END LOOP;
1381 
1382 
1383 
1384 EXCEPTION
1385    -- Fixme add logic to handle if entry does not exist.
1386     -- This should no happen.
1387     WHEN FND_API.G_EXC_ERROR  THEN
1388       ROLLBACK;
1389       RAISE;
1390     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1391       ROLLBACK;
1392       RAISE;
1393     WHEN OTHERS THEN
1394       ROLLBACK;
1395       RAISE;
1396   END TRANSITION_NON_CHECKED_ENTRIES;-- PL/SQL Block
1397 
1398 
1399 -----------------------------++++++-------------------------------
1400 --
1401 -- Start of comments
1402 --
1403 --  API name    : GET_NEW_ZONE_XREF
1404 --  Type        : Public
1405 --  Pre-reqs    : None
1406 --  Function    :
1407 --  Parameters  : P_SOURCE_ID                      IN     NUMBER                       Required
1408 --                P_TARGET_GROUP_ID    IN     NUMBER
1409 --                P_NEW_SUBSET_ID IN NUMBER
1410 --                P_ORIG_XREF IN NUMBER
1411 --                X_NEW_XREF  OUT NUMBER
1412 --
1413 --  Version     : Initial version 1.0
1414 --
1415 -- End of comments
1416 --
1417 -----------------------------++++++-------------------------------
1418 PROCEDURE GET_NEW_ZONE_XREF( P_SOURCE_ID       IN            NUMBER
1419                            , P_SCHEDULE_ID     IN            NUMBER
1420                            , P_TARGET_GROUP_ID IN            NUMBER
1421                            , P_NEW_SUBSET_ID   IN            NUMBER
1422                            , P_ORIG_XREF       IN            NUMBER
1423                            , X_NEW_XREF           OUT NOCOPY NUMBER)
1424 IS
1425 
1426 BEGIN
1427 
1428   x_new_xref := NULL;
1429 
1430   ----------------------------------------------------------------
1431   -- If the original id is -1 then one was not assigned.
1432   ----------------------------------------------------------------
1433   IF (P_ORIG_XREF = -1)
1434   THEN
1435     X_NEW_XREF := -1;
1436 
1437   ----------------------------------------------------------------
1438   -- The original id isn't -1 then one was assigned.
1439   ----------------------------------------------------------------
1440   ELSE
1441     BEGIN
1442 
1443       EXECUTE IMMEDIATE 'SELECT ITM_CC_TZ_ID FROM IEC_G_MKTG_ITEM_CC_TZS ' ||
1444                         ' WHERE LIST_HEADER_ID = :listId AND SUBSET_ID = :subsetID ' ||
1445                         ' AND (TERRITORY_CODE, TIMEZONE_ID, NVL(REGION_ID, -1)) = ' ||
1446                         ' (SELECT TERRITORY_CODE, TIMEZONE_ID, NVL(REGION_ID, -1) ' ||
1447                         ' FROM IEC_G_MKTG_ITEM_CC_TZS WHERE ITM_CC_TZ_ID = :xref_id)'
1448                         INTO X_NEW_XREF
1449                         USING P_TARGET_GROUP_ID, P_NEW_SUBSET_ID, P_ORIG_XREF;
1450 
1451     EXCEPTION
1452       ----------------------------------------------------------------
1453       -- If we cannot find a new zone then we need to create one.
1454       ----------------------------------------------------------------
1455       WHEN NO_DATA_FOUND THEN
1456 
1457         BEGIN
1458           ----------------------------------------------------------------
1459           -- Insert a new entry into the iec_g_mktg_item_cc_Tzs table for
1460           -- any new zone that is now in the
1461           ----------------------------------------------------------------
1462           EXECUTE IMMEDIATE 'INSERT INTO IEC_G_MKTG_ITEM_CC_TZS ' ||
1463                             ' (ITM_CC_TZ_ID, LIST_HEADER_ID, CAMPAIGN_SCHEDULE_ID, TERRITORY_CODE, ' ||
1464                             ' TIMEZONE_ID, LAST_CALLABLE_TIME, CALLABLE_FLAG, OBJECT_VERSION_NUMBER, ' ||
1465                             ' SECURITY_GROUP_ID, LAST_UPDATE_DATE, RECORD_COUNT, REGION_ID, SUBSET_ID) '||
1466                             ' select IEC_G_MKTG_ITEM_CC_TZS_S.NEXTVAL, :listID, :schedID ' ||
1467                             ', a.territory_code, a.timezone_id, NULL, ''N'', 0, -1 ' ||
1468                             ', SYSDATE, 0, a.region_id, :subsetId from ' ||
1469                             ' (SELECT region_id, territory_code,  timezone_id '||
1470                             ' from iec_g_mktg_item_cc_tzs c where c.itm_cc_Tz_id = :xref_id) a ' ||
1471                             ' RETURNING ITM_CC_TZ_ID '
1472                             INTO X_NEW_XREF
1473                             USING P_TARGET_GROUP_ID, P_SCHEDULE_ID, P_ORIG_XREF;
1474         EXCEPTION
1475           WHEN OTHERS THEN
1476             RAISE;
1477         END;   -- end insertingnew xref block.
1478       WHEN OTHERS THEN
1479         RAISE;
1480     END; -- end locating new xref block.
1481   END IF;
1482 EXCEPTION
1483     WHEN FND_API.G_EXC_ERROR  THEN
1484       ROLLBACK;
1485       RAISE_APPLICATION_ERROR(-20999, g_error_msg);
1486     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1487       ROLLBACK;
1488       RAISE_APPLICATION_ERROR(-20999, g_error_msg);
1489     WHEN OTHERS THEN
1490       ROLLBACK;
1491       Log( 'GET_NEW_ZONE_XREF'
1492          , 'ASSIGN_NEW_CALLABLE_ZONES.LIST_' || p_target_group_id
1493          , SQLERRM);
1494       RAISE_APPLICATION_ERROR(-20999, g_error_msg);
1495 
1496 END GET_NEW_ZONE_XREF;
1497 
1498 
1499 -----------------------------++++++-------------------------------
1500 --
1501 -- Start of comments
1502 --
1503 --  API name    : CONTINUAL_TRANSITION
1504 --  Type        : Public
1505 --  Pre-reqs    : None
1506 --  Function    :
1507 --  Parameters  : P_SOURCE_ID          IN     NUMBER                       Required
1508 --                P_TARGET_GROUP_ID    IN     NUMBER                       Required
1509 --                X_NUM_REMAINING         OUT NUMBER                       Required
1510 --                X_ACTION_ID             OUT NUMBER                       Required
1511 --
1512 --  Version     : Initial version 1.0
1513 --
1514 -- End of comments
1515 --
1516 -----------------------------++++++-------------------------------
1517 PROCEDURE CONTINUAL_TRANSITION
1518    ( P_SOURCE_ID          IN            NUMBER
1519    , P_CAMPAIGN_ID        IN            NUMBER
1520    , P_SCHEDULE_ID        IN            NUMBER
1521    , P_TARGET_GROUP_ID    IN            NUMBER
1522    , X_NUM_REMAINING         OUT NOCOPY NUMBER
1523    , X_ACTION_ID             OUT NOCOPY NUMBER
1524    )
1525 IS
1526   l_new_itm_xref_id1 NUMBER := 0;
1527   l_new_itm_xref_id2 NUMBER := 0;
1528   l_new_itm_xref_id3 NUMBER := 0;
1529   l_new_itm_xref_id4 NUMBER := 0;
1530   l_new_itm_xref_id5 NUMBER := 0;
1531   l_new_itm_xref_id6 NUMBER := 0;
1532   l_old_itm_xref_id1 NUMBER := 0;
1533   l_old_itm_xref_id2 NUMBER := 0;
1534   l_old_itm_xref_id3 NUMBER := 0;
1535   l_old_itm_xref_id4 NUMBER := 0;
1536   l_old_itm_xref_id5 NUMBER := 0;
1537   l_old_itm_xref_id6 NUMBER := 0;
1538   l_curr_itm_xref_id NUMBER := 0;
1539   l_curr_phone_index NUMBER := 0;
1540 
1541   ----------------------------------------------------------------
1542   -- The source type view name for the current list.
1543   ----------------------------------------------------------------
1544   l_src_type_view_name VARCHAR2(30);
1545 
1546 BEGIN
1547   l_src_type_view_name := 'NULL';
1548   X_NUM_REMAINING := 0;
1549   x_action_id := NULL;
1550 
1551    ----------------------------------------------------------------
1552    -- Need to get the source type name.
1553    ----------------------------------------------------------------
1554    GET_SOURCETYPE_VIEW_NAME
1555      ( P_SOURCE_ID  => P_SOURCE_ID
1556      , P_TARGET_GROUP_ID  => P_TARGET_GROUP_ID
1557      , X_VIEW_NAME  => l_src_type_view_name
1558      );
1559 
1560    IF (l_src_type_view_name <> 'NULL')
1561    THEN
1562      ----------------------------------------------------------------
1563      -- Need to loop thru the entries we were unable to transition
1564      -- due to their state in the system and transition them
1565      -- if they have been checked back in.
1566      ----------------------------------------------------------------
1567      FOR entry_rec IN (
1568                  select   a.subset_id SUBSET_ID
1569                  ,        a.pulled_subset_id TRANSITION_SUBSET_ID
1570                  ,        a.list_entry_id  LIST_ENTRY_ID
1571                  ,        a.record_out_flag RECORD_OUT_FLAG
1572                  ,        a.itm_cc_Tz_id ITM_CC_TZ_ID
1573                  ,        a.contact_point_index CONTACT_POINT_INDEX
1574                  ,        a.returns_id RETURNS_ID
1575                  ,        a.do_not_use_flag DO_NOT_USE_FLAG
1576                  ,        DECODE(NVL(SUM(B.CALL_ATTEMPT), 0), 0, 0, 1) CALLED_ONCE
1577                  from     iec_g_return_entries a
1578                  ,        IEC_O_RCY_CALL_HISTORIES B
1579                  where    a.LIST_HEADER_ID = P_TARGET_GROUP_ID
1580                  and      a.pulled_subset_id IS NOT NULL
1581                  and      a.returns_id = b.returns_id(+)
1582 								 group by a.subset_id
1583 								 ,        a.pulled_subset_id
1584                  ,        a.list_entry_id
1585                  ,        a.record_out_flag
1586                  ,        a.itm_cc_Tz_id
1587                  ,        a.contact_point_index
1588                  ,        a.returns_id
1589                  ,        a.do_not_use_flag
1590                  )
1591      LOOP
1592 
1593 
1594        ----------------------------------------------------------------
1595        -- If the entry is still checked out then simply update the
1596        -- counter.
1597        ----------------------------------------------------------------
1598        IF (entry_rec.record_out_flag = 'Y')
1599        THEN
1600          X_NUM_REMAINING := X_NUM_REMAINING + 1;
1601 
1602        ----------------------------------------------------------------
1603        -- The record has been checked back in so execute the transition.
1604        ----------------------------------------------------------------
1605        ELSE
1606 
1607          ----------------------------------------------------------------
1608          -- We have to get the new itm_cc_Tz_ids for the entry.
1609          ----------------------------------------------------------------
1610          EXECUTE IMMEDIATE 'SELECT NVL(A.reason_code_S1, -1), NVL(A.reason_code_S2, -1), ' ||
1611                            ' NVL(A.reason_code_S3, -1), NVL(A.reason_code_S4, -1), ' ||
1612                            ' NVL(A.reason_code_S5, -1), NVL(A.reason_code_S6, -1) ' ||
1613                            ' FROM ' || l_src_type_view_name || ' a ' ||
1614                            ' WHERE A.LIST_HEADER_ID = :listID AND A.LIST_ENTRY_ID = :entryId'
1615                            INTO l_old_itm_xref_id1, l_old_itm_xref_id2, l_old_itm_xref_id3
1616                            ,    l_old_itm_xref_id4, l_old_itm_xref_id5, l_old_itm_xref_id6
1617                            USING P_TARGET_GROUP_ID, entry_rec.list_entry_id;
1618 
1619          ----------------------------------------------------------------
1620          -- Look at each phone cross ref to see if it has been assigned.
1621          -- And try to fetch the new one if it hasn't.
1622          ----------------------------------------------------------------
1623          GET_NEW_ZONE_XREF( P_SOURCE_ID
1624                           , P_SCHEDULE_ID
1625                           , P_TARGET_GROUP_ID
1626                           , entry_rec.TRANSITION_SUBSET_ID
1627                           , l_old_itm_xref_id1
1628                           , l_new_itm_xref_id1);
1629 
1630          GET_NEW_ZONE_XREF( P_SOURCE_ID
1631                           , P_SCHEDULE_ID
1632                           , P_TARGET_GROUP_ID
1633                           , entry_rec.TRANSITION_SUBSET_ID
1634                           , l_old_itm_xref_id2
1635                           , l_new_itm_xref_id2);
1636 
1637          GET_NEW_ZONE_XREF( P_SOURCE_ID
1638                           , P_SCHEDULE_ID
1639                           , P_TARGET_GROUP_ID
1640                           , entry_rec.TRANSITION_SUBSET_ID
1641                           , l_old_itm_xref_id3
1642                           , l_new_itm_xref_id3);
1643 
1644          GET_NEW_ZONE_XREF( P_SOURCE_ID
1645                           , P_SCHEDULE_ID
1646                           , P_TARGET_GROUP_ID
1647                           , entry_rec.TRANSITION_SUBSET_ID
1648                           , l_old_itm_xref_id4
1649                           , l_new_itm_xref_id4);
1650 
1651          GET_NEW_ZONE_XREF( P_SOURCE_ID
1652                           , P_SCHEDULE_ID
1653                           , P_TARGET_GROUP_ID
1654                           , entry_rec.TRANSITION_SUBSET_ID
1655                           , l_old_itm_xref_id5
1656                           , l_new_itm_xref_id5);
1657 
1658          GET_NEW_ZONE_XREF( P_SOURCE_ID
1659                           , P_SCHEDULE_ID
1660                           , P_TARGET_GROUP_ID
1661                           , entry_rec.TRANSITION_SUBSET_ID
1662                           , l_old_itm_xref_id6
1663                           , l_new_itm_xref_id6);
1664 
1665          ----------------------------------------------------------------
1666          -- Need to set the current xref id according to the index.
1667          ----------------------------------------------------------------
1668          IF (entry_rec.CONTACT_POINT_INDEX = 1)
1669          THEN
1670            l_curr_itm_xref_id := l_new_itm_xref_id1;
1671 
1672          ELSIF (entry_rec.CONTACT_POINT_INDEX = 2)
1673          THEN
1674            l_curr_itm_xref_id := l_new_itm_xref_id2;
1675 
1676          ELSIF (entry_rec.CONTACT_POINT_INDEX = 3)
1677          THEN
1678            l_curr_itm_xref_id := l_new_itm_xref_id3;
1679 
1680          ELSIF (entry_rec.CONTACT_POINT_INDEX = 4)
1681          THEN
1682            l_curr_itm_xref_id := l_new_itm_xref_id4;
1683 
1684          ELSIF (entry_rec.CONTACT_POINT_INDEX = 5)
1685          THEN
1686            l_curr_itm_xref_id := l_new_itm_xref_id5;
1687 
1688          ELSIF (entry_rec.CONTACT_POINT_INDEX = 6)
1689          THEN
1690            l_curr_itm_xref_id := l_new_itm_xref_id6;
1691          END IF;
1692 
1693 
1694          ----------------------------------------------------------------
1695          -- FIRST RESET THE SUBSET AND CURRENT CALL ZONE ON THE LIST.
1696          ----------------------------------------------------------------
1697          EXECUTE IMMEDIATE 'UPDATE IEC_G_RETURN_ENTRIES SET SUBSET_ID = :subsetId ' ||
1698                            ', PULLED_SUBSET_ID = NULL, ITM_CC_TZ_ID = :xrefId ' ||
1699                            ' WHERE RETURNS_ID = :returnsId'
1700                            USING entry_rec.TRANSITION_SUBSET_ID
1701                                , l_curr_itm_xref_id
1702                                , entry_rec.RETURNS_ID;
1703 
1704          IF (l_new_itm_xref_id1 = -1)
1705          THEN
1706             l_new_itm_xref_id1 := NULL;
1707          END IF;
1708          IF (l_new_itm_xref_id2 = -1)
1709          THEN
1710             l_new_itm_xref_id2 := NULL;
1711          END IF;
1712          IF (l_new_itm_xref_id3 = -1)
1713          THEN
1714             l_new_itm_xref_id3 := NULL;
1715          END IF;
1716          IF (l_new_itm_xref_id4 = -1)
1717          THEN
1718             l_new_itm_xref_id4 := NULL;
1719          END IF;
1720          IF (l_new_itm_xref_id5 = -1)
1721          THEN
1722             l_new_itm_xref_id5 := NULL;
1723          END IF;
1724          IF (l_new_itm_xref_id6 = -1)
1725          THEN
1726             l_new_itm_xref_id6 := NULL;
1727          END IF;
1728 
1729          ----------------------------------------------------------------
1730          -- RESET ALL OF THE CALL ZONES FOR THE ENTRY ON THE LIST.
1731          ----------------------------------------------------------------
1732          EXECUTE IMMEDIATE 'UPDATE ' || l_src_type_view_name || ' SET ' ||
1733                            ' REASON_CODE_S1 = :zoneXref1, ' ||
1734                            ' REASON_CODE_S2 = :zoneXref2, ' ||
1735                            ' REASON_CODE_S3 = :zoneXref3, ' ||
1736                            ' REASON_CODE_S4 = :zoneXref4, ' ||
1737                            ' REASON_CODE_S5 = :zoneXref5, ' ||
1738                            ' REASON_CODE_S6 = :zoneXref6 ' ||
1739                            ' WHERE LIST_HEADER_ID = :listID AND LIST_ENTRY_ID = :entryID '
1740                            USING l_new_itm_xref_id1
1741                            ,     l_new_itm_xref_id2
1742                            ,     l_new_itm_xref_id3
1743                            ,     l_new_itm_xref_id4
1744                            ,     l_new_itm_xref_id5
1745                            ,     l_new_itm_xref_id6
1746                            ,     P_TARGET_GROUP_ID, entry_rec.LIST_ENTRY_ID;
1747 
1748          ----------------------------------------------------------------
1749          -- Update the count of the callzones that the entry is
1750          -- transitioning between if the entry is still usable.
1751          ----------------------------------------------------------------
1752          IF (entry_rec.DO_NOT_USE_FLAG = 'N')
1753          THEN
1754 
1755            ----------------------------------------------------------------
1756            -- Increment the count for the new callzone by one.
1757            ----------------------------------------------------------------
1758            EXECUTE IMMEDIATE 'UPDATE IEC_G_MKTG_ITEM_CC_TZS ' ||
1759                               ' SET RECORD_COUNT = RECORD_COUNT + 1' ||
1760                               ', LAST_UPDATE_DATE = SYSDATE ' ||
1761                               ' WHERE ITM_CC_TZ_ID = :xrefId '
1762                               USING l_curr_itm_xref_id;
1763 
1764            ----------------------------------------------------------------
1765            -- Decrement the count for the orig callzone by one.
1766            ----------------------------------------------------------------
1767            EXECUTE IMMEDIATE 'UPDATE IEC_G_MKTG_ITEM_CC_TZS ' ||
1768                               ' SET RECORD_COUNT = RECORD_COUNT - 1' ||
1769                               ', LAST_UPDATE_DATE = SYSDATE ' ||
1770                               ' WHERE ITM_CC_TZ_ID = :xrefId '
1771                               USING entry_rec.ITM_CC_TZ_ID;
1772 
1773          END IF;
1774 
1775          ----------------------------------------------------------------
1776          -- Increment the count for the new subset by one.
1777          ----------------------------------------------------------------
1778          UPDATE_SUBSET_COUNTS( P_CAMPAIGN_ID
1779                              , P_SCHEDULE_ID
1780                              , P_TARGET_GROUP_ID
1781                              , entry_rec.TRANSITION_SUBSET_ID
1782                              , 1
1783                              , entry_rec.CALLED_ONCE
1784                              );
1785 
1786          ----------------------------------------------------------------
1787          -- Decrement the count for the original subset by one.
1788          ----------------------------------------------------------------
1789          UPDATE_SUBSET_COUNTS( P_CAMPAIGN_ID
1790                              , P_SCHEDULE_ID
1791                              , P_TARGET_GROUP_ID
1792                              , entry_rec.SUBSET_ID
1793                              , (0 - 1)
1794                              , (0 - entry_rec.CALLED_ONCE)
1795                              );
1796          COMMIT;
1797        END IF;
1798 
1799      END LOOP;
1800 
1801   ----------------------------------------------------------------
1802   -- We weren't able to process cause we couldn't find the
1803   -- source type view name.
1804   ----------------------------------------------------------------
1805   ELSE
1806     -- this won't really happen - procedure to get source type view
1807     -- will throw exception if source type view doesn't exist
1808     g_error_msg := 'Could not locate source type view name for list: ' || P_TARGET_GROUP_ID;
1809 
1810   END IF; -- end of if we could find the source type view name.
1811 
1812 EXCEPTION
1813     WHEN FND_API.G_EXC_ERROR  THEN
1814        ROLLBACK;
1815        RAISE_APPLICATION_ERROR(-20999, g_error_msg);
1816     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1817        ROLLBACK;
1818        RAISE_APPLICATION_ERROR(-20999, g_error_msg);
1819     WHEN OTHERS THEN
1820        Log( 'CONTINUAL_TRANSITION'
1821           , 'TRANSITION_SUBSETS.LIST_' || p_target_group_id
1822           , SQLERRM);
1823        ROLLBACK;
1824        RAISE_APPLICATION_ERROR(-20999, g_error_msg);
1825 
1826 END CONTINUAL_TRANSITION;
1827 
1828 -----------------------------++++++-------------------------------
1829 --
1830 -- Start of comments
1831 --
1832 --  API name    : GET_LIST_SCHEDULE_ID
1833 --  Type        : Public
1834 --  Pre-reqs    : None
1835 --  Function    :
1836 --  Parameters  : P_SOURCE_ID          IN     NUMBER                       Required
1837 --                P_TARGET_GROUP_ID    IN     NUMBER
1838 --                X_SCHED_ID              OUT NUMBER
1839 --
1840 --  Version     : Initial version 1.0
1841 --
1842 -- End of comments
1843 --
1844 -----------------------------++++++-------------------------------
1845 PROCEDURE GET_LIST_SCHEDULE_ID( P_SOURCE_ID       IN            NUMBER
1846                               , P_TARGET_GROUP_ID IN            NUMBER
1847                               , X_SCHEDULE_ID        OUT NOCOPY NUMBER
1848 )
1849 IS
1850 BEGIN
1851 
1852    x_schedule_id := NULL;
1853    IEC_COMMON_UTIL_PVT.Get_ScheduleId(p_target_group_id, x_schedule_id);
1854 
1855 EXCEPTION
1856    WHEN OTHERS THEN
1857       ROLLBACK;
1858       -- FND_MESSAGE is initialized but not logged in IEC_COMMON_UTIL_PVT
1859       -- if an exception is thrown, so we log it here with current
1860       -- module
1861       Log( 'GET_LIST_SCHEDULE_ID', 'MAIN.LIST_' || p_target_group_id);
1862       RAISE fnd_api.g_exc_unexpected_error;
1863 
1864 END GET_LIST_SCHEDULE_ID;
1865 
1866 -----------------------------++++++-------------------------------
1867 --
1868 -- Start of comments
1869 --
1870 --  API name    : GET_DEFAULT_SUBSET_ID
1871 --  Type        : Public
1872 --  Pre-reqs    : None
1873 --  Function    :
1874 --  Parameters  : P_SOURCE_ID          IN     NUMBER                       Required
1875 --                P_TARGET_GROUP_ID    IN     NUMBER
1876 --                X_DEFAULT_SUBSET_ID              OUT NUMBER
1877 --
1878 --  Version     : Initial version 1.0
1879 --
1880 -- End of comments
1881 --
1882 -----------------------------++++++-------------------------------
1883 PROCEDURE GET_DEFAULT_SUBSET_ID( P_SOURCE_ID         IN            NUMBER
1884                                , P_TARGET_GROUP_ID   IN            NUMBER
1885                                , X_DEFAULT_SUBSET_ID    OUT NOCOPY NUMBER
1886 )
1887 IS
1888 BEGIN
1889 
1890    x_default_subset_id := NULL;
1891 
1892    EXECUTE IMMEDIATE 'SELECT LIST_SUBSET_ID FROM IEC_G_LIST_SUBSETS ' ||
1893                      'WHERE LIST_HEADER_ID = :listID AND DEFAULT_SUBSET_FLAG = ''Y'''
1894    INTO X_DEFAULT_SUBSET_ID
1895    USING P_TARGET_GROUP_ID;
1896 
1897 EXCEPTION
1898    WHEN OTHERS THEN
1899       ROLLBACK;
1900       x_default_subset_id := NULL;
1901       Log( 'GET_DEFAULT_SUBSET_ID'
1902          , 'MAIN.LIST_' || p_target_group_id
1903          , SQLERRM);
1904       RAISE_APPLICATION_ERROR(-20999, g_error_msg);
1905 
1906 END GET_DEFAULT_SUBSET_ID;
1907 
1908 -----------------------------++++++-------------------------------
1909 --
1910 -- Start of comments
1911 --
1912 --  API name    : TRANSITION_ENTRIES
1913 --  Type        : Private
1914 --  Pre-reqs    : None
1915 --  Function    :
1916 --  Parameters  : P_SOURCE_ID          IN     NUMBER                       Required
1917 --                P_SERVER_ID          IN     NUMBER                       Required
1918 --                P_SCHED_ID           IN     NUMBER                       Required
1919 --                P_TARGET_GROUP_ID    IN     NUMBER                       Required
1920 --                P_FROM_SUBSET        IN     NUMBER_TBL_TYPE              Required
1921 --                P_INTO_SUBSET        IN     NUMBER_TBL_TYPE              Required
1922 --                P_ACTION_TYPE        IN     VARCHAR2                     Required
1923 --                P_PHONE_SQL          IN     VARCHAR2                     Required
1924 --                P_ENTRY_SQL          IN     VARCHAR2                     Required
1925 --                P_BATCH_SIZE         IN     NUMBER                       Required
1926 --                P_SRC_TYPE_VIEW      IN     VARCHAR2                     Required
1927 --                X_NUM_PENDING        IN OUT NUMBER                       Required
1928 --
1929 --  Version     : Initial version 1.0
1930 --
1931 -- End of comments
1932 --
1933 -----------------------------++++++-------------------------------
1934 PROCEDURE TRANSITION_ENTRIES
1935    ( P_SOURCE_ID          IN            NUMBER
1936    , P_SERVER_ID          IN            NUMBER
1937    , P_CAMPAIGN_ID        IN            NUMBER
1938    , P_SCHED_ID           IN            NUMBER
1939    , P_TARGET_GROUP_ID    IN            NUMBER
1940    , P_FROM_SUBSET        IN            NUMBER
1941    , P_INTO_SUBSET        IN            NUMBER
1942    , P_ACTION_TYPE        IN            VARCHAR2
1943    , P_PHONE_SQL          IN            VARCHAR2
1944    , P_ENTRY_SQL          IN            VARCHAR2
1945    , P_BATCH_SIZE         IN            NUMBER
1946    , P_SRC_TYPE_VIEW      IN            VARCHAR2
1947    , X_NUM_PENDING        IN OUT NOCOPY NUMBER)
1948 IS
1949 
1950   TYPE SubsetEntryType IS REF CURSOR;
1951 
1952   l_return_tbl SYSTEM.NUMBER_TBL_TYPE := SYSTEM.NUMBER_TBL_TYPE();
1953   l_locked_flag VARCHAR2(1);
1954   l_subset_entry_cursor SubsetEntryType;
1955   l_checked_entry_cursor SubsetEntryType;
1956   l_phone_cursor SubsetEntryType;
1957   l_phone_index NUMBER := 0;
1958   l_curr_list_Entry_id NUMBER;
1959   l_curr_subset_id NUMBER;
1960   l_curr_returns_id NUMBER;
1961   l_phone_entry_tbl UniqueIdList;
1962   l_phone_subset_tbl UniqueIdList;
1963   l_index_tbl UniqueIdList;
1964   l_region_tbl UniqueIdList;
1965   l_timezone_tbl UniqueIdList;
1966   l_territory_tbl TerritoryList;
1967   l_curr_return_id NUMBER;
1968 
1969 BEGIN
1970   l_locked_flag := 'N';
1971 
1972    ----------------------------------------------------------------
1973    -- OPEN THE CURSOR FOR ALL ENTRIES TRANSITIONED FROM THE FROM
1974    -- SUBSET TO THE INTO SUBSET.
1975    ----------------------------------------------------------------
1976    OPEN l_subset_entry_cursor FOR P_ENTRY_SQL USING P_FROM_SUBSET;
1977 
1978    LOOP
1979 
1980       LOOP
1981          FETCH l_subset_entry_cursor INTO l_curr_return_id;
1982 
1983          EXIT WHEN l_subset_entry_cursor%NOTFOUND;
1984 
1985          l_return_tbl.EXTEND(1);
1986          l_return_tbl(l_return_tbl.LAST) := l_curr_return_id;
1987 
1988          EXIT WHEN l_return_tbl.COUNT >=  P_BATCH_SIZE;
1989       END LOOP;
1990 
1991       ----------------------------------------------------------------
1992       -- If fetch did not return any rows then drop out of loop.
1993       ----------------------------------------------------------------
1994       EXIT WHEN l_return_tbl.COUNT = 0 ;
1995 
1996       ----------------------------------------------------------------
1997       -- We first lock the schedule.  This is only executed in order
1998       -- to lock individual entries.  If we try to lock individual
1999       -- subsets there maybe the chance that we leave the subsets
2000       -- locked indefinitely if the procedure is cancelled.  Therefore
2001       -- we stick at the schedule level for safety reasons.
2002       ----------------------------------------------------------------
2003       LOCK_SCHEDULE( P_SOURCE_ID    => P_SOURCE_ID
2004                    , P_SCHED_ID     => P_SCHED_ID
2005                    , P_SERVER_ID    => P_SERVER_ID
2006                    , P_LOCK_FLAG    => 'Y'
2007                    , X_SUCCESS_FLAG => l_locked_flag);
2008 
2009       ----------------------------------------------------------------
2010       -- If we were able to lock the schedule then we will update
2011       -- all of the pulled subset ids for this particular batch
2012       -- of entries that have not been pulled yet so they are locked.
2013       ----------------------------------------------------------------
2014       IF l_locked_flag = 'Y' THEN
2015          TRACELOG('LOCKED SCHEDULE ' || P_SCHED_ID);
2016 
2017          BEGIN
2018             EXECUTE IMMEDIATE 'UPDATE IEC_G_RETURN_ENTRIES A ' ||
2019                               'SET A.PULLED_SUBSET_ID = :newSubsetId ' ||
2020                               'WHERE A.RETURNS_ID IN (SELECT * FROM TABLE(CAST(:collection AS SYSTEM.NUMBER_TBL_TYPE))) ' ||
2021                               'AND A.RECORD_OUT_FLAG = ''N'' AND A.PULLED_SUBSET_ID IS NULL'
2022             USING P_INTO_SUBSET
2023             ,     l_return_tbl;
2024 
2025             ----------------------------------------------------------------
2026             -- Increment transition entries to account for these
2027             -- entries.
2028             ----------------------------------------------------------------
2029             X_NUM_PENDING := X_NUM_PENDING + SQL%ROWCOUNT;
2030 
2031             ----------------------------------------------------------------
2032             -- Commit will lock the entries.
2033             ----------------------------------------------------------------
2034             COMMIT;
2035 
2036          EXCEPTION
2037             WHEN OTHERS THEN
2038                Log( 'Transition_Entries'
2039                   , 'LOCK_SUBSET_ENTRIES.SUBSET_' || p_from_subset
2040                   , SQLERRM);
2041                ----------------------------------------------------------------
2042                -- We can now unlock the schedule.
2043                ----------------------------------------------------------------
2044                LOCK_SCHEDULE( P_SOURCE_ID    => P_SOURCE_ID
2045                             , P_SCHED_ID     => P_SCHED_ID
2046                             , P_SERVER_ID    => P_SERVER_ID
2047                             , P_LOCK_FLAG    => 'N'
2048                             , X_SUCCESS_FLAG => l_locked_flag);
2049                RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2050          END;
2051 
2052          ----------------------------------------------------------------
2053          -- We can now unlock the schedule.
2054          ----------------------------------------------------------------
2055          LOCK_SCHEDULE( P_SOURCE_ID    => P_SOURCE_ID
2056                       , P_SCHED_ID     => P_SCHED_ID
2057                       , P_SERVER_ID    => P_SERVER_ID
2058                       , P_LOCK_FLAG    => 'N'
2059                       , X_SUCCESS_FLAG => l_locked_flag);
2060 
2061       ELSE
2062          TRACELOG('COULD NOT LOCK SCHEDULE ' || P_SCHED_ID);
2063       END IF;
2064 
2065       ----------------------------------------------------------------
2066       -- At This point either we have entries that have already been
2067       -- checked out or we weren't able to get a lock so we have
2068       -- to loop thru the remaining entries and lock them one by one.
2069       ----------------------------------------------------------------
2070 
2071       OPEN l_checked_entry_cursor FOR 'SELECT RETURNS_ID FROM IEC_G_RETURN_ENTRIES ' ||
2072                                       'WHERE PULLED_SUBSET_ID IS NULL ' ||
2073                                       'AND RETURNS_ID IN (SELECT * FROM TABLE(CAST(:collection AS SYSTEM.NUMBER_TBL_TYPE)))'
2074       USING l_return_tbl;
2075 
2076       ----------------------------------------------------------------
2077       -- LOOP THRU ENTRIES RETRIEVED IN THE FETCH.  These are the
2078       -- entries in the original cursor that were not previously
2079       -- locked.
2080       ----------------------------------------------------------------
2081       LOOP
2082          FETCH l_checked_entry_cursor
2083          INTO  l_curr_returns_id;
2084          EXIT WHEN l_checked_entry_cursor%NOTFOUND;
2085 
2086          EXECUTE IMMEDIATE 'UPDATE IEC_G_RETURN_ENTRIES A ' ||
2087                            'SET PULLED_SUBSET_ID = :newSubsetId ' ||
2088                            'WHERE RETURNS_ID = :returnsId ' ||
2089                            'AND PULLED_SUBSET_ID IS NULL'
2090          USING P_INTO_SUBSET
2091          ,     l_curr_returns_id;
2092 
2093          ----------------------------------------------------------------
2094          -- Increment transition entries to account for this individual
2095          -- entry.
2096          ----------------------------------------------------------------
2097          X_NUM_PENDING := X_NUM_PENDING + 1;
2098 
2099          COMMIT;
2100       END LOOP;
2101 
2102       CLOSE l_checked_entry_cursor;
2103 
2104       ----------------------------------------------------------------
2105       -- Make sure the table has been cleaned of any entries belonging
2106       -- to this target group.  If we only allow one subset transition
2107       -- at a time, then we could truncate the table.
2108       ----------------------------------------------------------------
2109       BEGIN
2110          EXECUTE IMMEDIATE 'DELETE FROM iec_o_transition_subsets ' ||
2111                            'WHERE list_id = :1 '
2112          USING P_TARGET_GROUP_ID;
2113       EXCEPTION
2114          WHEN OTHERS THEN
2115             RAISE;
2116       END;
2117 
2118       ----------------------------------------------------------------
2119       -- The entries are locked and we now need to transition this
2120       -- batch.  First we pull entries that are not checked out into
2121       -- the transition table.  Ones that are checked out will be
2122       -- transitioned when they are checked back in.
2123       ----------------------------------------------------------------
2124       EXECUTE IMMEDIATE 'INSERT INTO IEC_O_TRANSITION_SUBSETS ' ||
2125               '( LIST_ID  ' ||
2126               ', LIST_ENTRY_ID  ' ||
2127               ', ORIG_SUBSET_ID ' ||
2128               ', NEW_SUBSET_ID ' ||
2129               ', ORIG_ITM_CC_TZ_ID ' ||
2130               ', NEW_ITM_CC_TZ_ID ' ||
2131               ', DO_NOT_USE_FLAG ' ||
2132               ', RECORD_OUT_FLAG ' ||
2133               ', RETURNS_ID ' ||
2134               ', CALL_ATTEMPTS  ' ||
2135               ') ' ||
2136               'SELECT A.LIST_HEADER_ID, A.LIST_ENTRY_ID, A.SUBSET_ID, A.PULLED_SUBSET_ID ' ||
2137                     ',  A.ITM_CC_TZ_ID, NULL, A.DO_NOT_USE_FLAG, ''N'', A.RETURNS_ID,  ' ||
2138                     ' DECODE(NVL(SUM(B.CALL_ATTEMPT), 0), 0, 0, 1) ' ||
2139                     ' FROM IEC_G_RETURN_ENTRIES A, IEC_O_RCY_CALL_HISTORIES B ' ||
2140                     ' WHERE A.SUBSET_ID = :oldSubsetId ' ||
2141                     ' AND A.RETURNS_ID = B.RETURNS_ID(+) ' ||
2142                     ' AND A.PULLED_SUBSET_ID = :newSubsetId' ||
2143                     ' AND A.RECORD_OUT_FLAG = ''N'' GROUP BY ' ||
2144                     ' A.LIST_HEADER_ID, A.LIST_ENTRY_ID, A.SUBSET_ID, A.PULLED_SUBSET_ID ' ||
2145                     ',  A.ITM_CC_TZ_ID, NULL, A.DO_NOT_USE_FLAG, ''N'', A.RETURNS_ID'
2146       USING P_FROM_SUBSET
2147       ,     P_INTO_SUBSET;
2148 
2149       ----------------------------------------------------------------
2150       -- Now that we have all of the entries in the transition table
2151       -- we need to get all of the entries phone numbers in the
2152       -- phone number entry table.  First we make sure the
2153       -- phone number transition table is cleared of all
2154       -- entries that pertain to this target group.
2155       ----------------------------------------------------------------
2156       EXECUTE IMMEDIATE 'DELETE FROM iec_o_transition_phones where list_id = :1'
2157       USING P_TARGET_GROUP_ID;
2158 
2159       ----------------------------------------------------------------
2160       -- Need to get all of the unique calling zones of the moved entries
2161       -- phone numbers.  Make sure there is a zone in the
2162       -- IEC_G_MKTG_ITEM_CC_TZS table to support.
2163       ----------------------------------------------------------------
2164       l_phone_index := 0;
2165 
2166       ----------------------------------------------------------------
2167       -- open the cursor to fetch the phone numbers for the current
2168       -- set of transitioning entries.
2169       ----------------------------------------------------------------
2170       OPEN l_phone_cursor FOR P_PHONE_SQL USING P_TARGET_GROUP_ID;
2171 
2172       ----------------------------------------------------------------
2173       -- Continue fetching the entries phone numbers and bringing
2174       -- them into a local collection.
2175       ----------------------------------------------------------------
2176       LOOP
2177          l_phone_index := l_phone_index + 1;
2178 
2179          FETCH l_phone_cursor INTO l_curr_list_Entry_id
2180                                  , l_curr_subset_id
2181                                  , l_index_tbl(l_phone_index)
2182                                  , l_territory_tbl(l_phone_index)
2183                                  , l_timezone_tbl(l_phone_index)
2184                                  , l_region_tbl(l_phone_index)
2185                                  , l_index_tbl(l_phone_index + 1)
2186                                  , l_territory_tbl(l_phone_index + 1)
2187                                  , l_timezone_tbl(l_phone_index + 1)
2188                                  , l_region_tbl(l_phone_index + 1)
2189                                  , l_index_tbl(l_phone_index + 2)
2190                                  , l_territory_tbl(l_phone_index + 2)
2191                                  , l_timezone_tbl(l_phone_index + 2)
2192                                  , l_region_tbl(l_phone_index + 2)
2193                                  , l_index_tbl(l_phone_index + 3)
2194                                  , l_territory_tbl(l_phone_index + 3)
2195                                  , l_timezone_tbl(l_phone_index + 3)
2196                                  , l_region_tbl(l_phone_index + 3)
2197                                  , l_index_tbl(l_phone_index + 4)
2198                                  , l_territory_tbl(l_phone_index + 4)
2199                                  , l_timezone_tbl(l_phone_index + 4)
2200                                  , l_region_tbl(l_phone_index + 4)
2201                                  , l_index_tbl(l_phone_index + 5)
2202                                  , l_territory_tbl(l_phone_index + 5)
2203                                  , l_timezone_tbl(l_phone_index + 5)
2204                                  , l_region_tbl(l_phone_index + 5);
2205 
2206          ----------------------------------------------------------------
2207          -- When cursor returns NOTFOUND we have stopped fetching from
2208          -- the cursor and therefore can exit the loop.
2209          ----------------------------------------------------------------
2210          EXIT WHEN l_phone_cursor%NOTFOUND;
2211 
2212          l_phone_subset_tbl(l_phone_index) := l_curr_subset_id;
2213          l_phone_entry_tbl(l_phone_index) := l_curr_list_Entry_id;
2214          l_phone_subset_tbl(l_phone_index + 1) := l_curr_subset_id;
2215          l_phone_entry_tbl(l_phone_index + 1) := l_curr_list_Entry_id;
2216          l_phone_subset_tbl(l_phone_index + 2) := l_curr_subset_id;
2217          l_phone_entry_tbl(l_phone_index + 2) := l_curr_list_Entry_id;
2218          l_phone_subset_tbl(l_phone_index + 3) := l_curr_subset_id;
2219          l_phone_entry_tbl(l_phone_index + 3) := l_curr_list_Entry_id;
2220          l_phone_subset_tbl(l_phone_index + 4) := l_curr_subset_id;
2221          l_phone_entry_tbl(l_phone_index + 4) := l_curr_list_Entry_id;
2222          l_phone_subset_tbl(l_phone_index + 5) := l_curr_subset_id;
2223          l_phone_entry_tbl(l_phone_index + 5) := l_curr_list_Entry_id;
2224          l_phone_index := l_phone_index + 5;
2225 
2226       END LOOP;
2227 
2228       ----------------------------------------------------------------
2229       -- Now that the internal collections have been filled we can close
2230       -- the phone cursor.
2231       ----------------------------------------------------------------
2232       CLOSE l_phone_cursor;
2233 
2234       ----------------------------------------------------------------
2235       -- Insert the phone entries into the transition table using
2236       -- the internal collections.
2237       ----------------------------------------------------------------
2238       IF l_phone_entry_tbl.COUNT > 0
2239       THEN
2240          FORALL j IN l_phone_entry_tbl.FIRST..l_phone_entry_tbl.LAST
2241             INSERT INTO iec_o_transition_phones
2242                ( LIST_ID
2243                , LIST_ENTRY_ID
2244                , SUBSET_ID
2245                , territory_code
2246                , region_id
2247                , timezone_id
2248                , phone_index
2249                )
2250                VALUES
2251                ( P_TARGET_GROUP_ID
2252                , l_phone_entry_tbl(j)
2253                , l_phone_subset_tbl(j)
2254                , l_territory_tbl(j)
2255                , l_region_tbl(j)
2256                , l_timezone_tbl(j)
2257                , l_index_tbl(j));
2258       END IF;
2259 
2260       ----------------------------------------------------------------
2261       -- Initialize all of the internal collections.
2262       ----------------------------------------------------------------
2263       l_phone_entry_tbl.DELETE;
2264       l_phone_subset_tbl.DELETE;
2265       l_territory_tbl.DELETE;
2266       l_region_tbl.DELETE;
2267       l_timezone_tbl.DELETE;
2268       l_index_tbl.DELETE;
2269 
2270       ----------------------------------------------------------------
2271       -- Insert a new entry into the iec_g_mktg_item_cc_Tzs table for
2272       -- any new zone that is now in the phone transition table.
2273       ----------------------------------------------------------------
2274       EXECUTE IMMEDIATE 'INSERT INTO IEC_G_MKTG_ITEM_CC_TZS ' ||
2275                         ' (ITM_CC_TZ_ID, LIST_HEADER_ID, CAMPAIGN_SCHEDULE_ID, TERRITORY_CODE, ' ||
2276                         ' TIMEZONE_ID, LAST_CALLABLE_TIME, CALLABLE_FLAG, OBJECT_VERSION_NUMBER, ' ||
2277                         ' SECURITY_GROUP_ID, LAST_UPDATE_DATE, RECORD_COUNT, REGION_ID, SUBSET_ID) '||
2278                         ' select IEC_G_MKTG_ITEM_CC_TZS_S.NEXTVAL, :listID, :schedID ' ||
2279                         ', a.territory_code, a.timezone_id, NULL, ''N'', 0, -1 ' ||
2280                         ', SYSDATE, 0, a.region_code, a.subset_id from ' ||
2281                         ' (SELECT DISTINCT DECODE(region_id, -1, NULL, region_id) region_code, territory_code, subset_id, timezone_id '||
2282                         ' from iec_o_transition_phones c where c.list_id = :listID ' ||
2283                         ' and territory_code <> ''-1'' and timezone_id <> -1 ' ||
2284                         ' and not exists (select null from iec_g_mktg_item_Cc_Tzs b where ' ||
2285                         ' c.subset_id = b.subset_id and c.territory_code = b.territory_code ' ||
2286                         ' and NVL(b.region_id, -1) = c.region_id and c.timezone_id = b.timezone_id ' ||
2287                         ' and c.list_id = b.list_header_id) ) a'
2288                         USING P_TARGET_GROUP_ID
2289                         ,     P_SCHED_ID
2290                         ,     P_TARGET_GROUP_ID;
2291 
2292       ----------------------------------------------------------------
2293       -- Updating the temporary
2294       -- phones table with the callable zones cross reference id.
2295       ----------------------------------------------------------------
2296       EXECUTE IMMEDIATE 'UPDATE IEC_O_TRANSITION_PHONES A SET A.ITM_CC_TZ_ID = ' ||
2297                         '( SELECT B.ITM_CC_TZ_ID FROM IEC_G_MKTG_ITEM_CC_TZS B ' ||
2298                         ' WHERE B.LIST_HEADER_ID = A.LIST_ID AND B.SUBSET_ID = A.SUBSET_ID ' ||
2299                         ' AND B.TERRITORY_CODE = A.TERRITORY_CODE AND B.TIMEZONE_ID = A.TIMEZONE_ID ' ||
2300                         ' AND NVL(B.REGION_ID, -1) = A.REGION_ID) WHERE A.LIST_ID = :listID ' ||
2301                         ' AND A.TERRITORY_CODE <> ''-1'' AND A.TIMEZONE_ID <> -1 '
2302                         USING P_TARGET_GROUP_ID;
2303 
2304       ----------------------------------------------------------------
2305       -- Updating the transition entries table with the
2306       -- new current callable zone cross reference id.
2307       ----------------------------------------------------------------
2308       EXECUTE IMMEDIATE 'UPDATE IEC_O_TRANSITION_SUBSETS A SET A.NEW_ITM_CC_TZ_ID = ' ||
2309                         ' (SELECT D.ITM_CC_TZ_ID ' ||
2310                         ' FROM IEC_G_RETURN_ENTRIES B, IEC_G_MKTG_ITEM_CC_TZS C, IEC_G_MKTG_ITEM_CC_TZS D ' ||
2311                         ' WHERE A.LIST_ENTRY_ID = B.LIST_ENTRY_ID AND A.LIST_ID = B.LIST_HEADER_ID ' ||
2312                         ' AND B.LIST_HEADER_ID = C.LIST_HEADER_ID AND B.ITM_CC_TZ_ID = C.ITM_CC_TZ_ID' ||
2313                         ' AND D.TERRITORY_CODE = C.TERRITORY_CODE AND D.SUBSET_ID = A.NEW_SUBSET_ID AND ' ||
2314                         ' D.TIMEZONE_ID = C.TIMEZONE_ID AND D.LIST_HEADER_ID = C.LIST_HEADER_ID ' ||
2315                         ' AND NVL(D.REGION_ID, -1) = NVL(C.REGION_ID, -1)) ' ||
2316                         ' WHERE A.LIST_ID = :list_ID' ||
2317                         ' AND A.ORIG_SUBSET_ID <> A.NEW_SUBSET_ID'
2318                         USING P_TARGET_GROUP_ID;
2319 
2320       ----------------------------------------------------------------
2321       -- Need to transition entries.  This is for the records that have
2322       -- NOT been checked out of AMS_LIST_ENTRIES.  Those records
2323       -- need to be treated differently to keep from causing
2324       -- deadlocks with the other processes.
2325       ----------------------------------------------------------------
2326       TRANSITION_NON_CHECKED_ENTRIES( P_SOURCE_ID
2327                                     , P_CAMPAIGN_ID
2328                                     , P_SCHED_ID
2329                                     , P_TARGET_GROUP_ID
2330                                     , P_SRC_TYPE_VIEW
2331                                     , 'N');
2332 
2333       ----------------------------------------------------------------
2334       -- If fetch did not return batch size then finished with cursor.
2335       ----------------------------------------------------------------
2336       EXIT WHEN l_return_tbl.COUNT < P_BATCH_SIZE ;
2337 
2338       l_return_tbl.DELETE;
2339    END LOOP;
2340 
2341    ----------------------------------------------------------------
2342    -- Return the number of entries that have yet to be transitioned.
2343    -- For perforamnce reasons we could choose to simply look for
2344    -- the first instead of actually counting.
2345    ----------------------------------------------------------------
2346    EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM IEC_G_RETURN_ENTRIES WHERE SUBSET_ID = :1 and PULLED_SUBSET_ID IS NOT NULL'
2347    INTO X_NUM_PENDING
2348    USING P_FROM_SUBSET;
2349 
2350    ----------------------------------------------------------------
2351    -- Makes sure the returns collection is removed.
2352    ----------------------------------------------------------------
2353    l_return_tbl.DELETE;
2354 
2355    ----------------------------------------------------------------
2356    -- Makes sure the subset entry cursor is closed.
2357    ----------------------------------------------------------------
2358    CLOSE l_subset_entry_cursor;
2359 
2360 EXCEPTION
2361    WHEN FND_API.G_EXC_ERROR  THEN
2362       IF l_subset_entry_cursor%ISOPEN
2363       THEN
2364          CLOSE l_subset_entry_cursor;
2365       END IF;
2366       ROLLBACK;
2367       RAISE_APPLICATION_ERROR(-20999, g_error_msg);
2368    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2369       IF l_subset_entry_cursor%ISOPEN
2370       THEN
2371          CLOSE l_subset_entry_cursor;
2372       END IF;
2373       ROLLBACK;
2374       RAISE_APPLICATION_ERROR(-20999, g_error_msg);
2375    WHEN OTHERS THEN
2376       Log( 'Transition_Entries'
2377          , 'MAIN.LIST_' || p_target_group_id
2378          , SQLERRM);
2379       IF l_subset_entry_cursor%ISOPEN
2380       THEN
2381         CLOSE l_subset_entry_cursor;
2382       END IF;
2383       ROLLBACK;
2384       RAISE_APPLICATION_ERROR(-20999, g_error_msg);
2385 
2386 END TRANSITION_ENTRIES;-- PL/SQL Block
2387 
2388 -----------------------------++++++-------------------------------
2389 --
2390 -- Start of comments
2391 --
2392 --  API name    : SUBSET_TRANSITION
2393 --  Type        : Public
2394 --  Pre-reqs    : None
2395 --  Function    :
2396 --  Parameters  : P_SOURCE_ID                      IN     NUMBER                       Required
2397 --                P_SERVER_ID          IN     NUMBER
2398 --                P_TARGET_GROUP_ID    IN     NUMBER
2399 --                P_FROM_SUBSETS       IN     NUMBER_TBL_TYPE
2400 --                P_INTO_SUBSETS       IN     NUMBER_TBL_TYPE
2401 --                P_ACTION_TYPE        IN     VARCHAR2
2402 --                X_NUM_PENDING           OUT NUMBER
2403 --                X_ACTION_ID             OUT NUMBER
2404 --
2405 --  Version     : Initial version 1.0
2406 --
2407 -- End of comments
2408 --
2409 -----------------------------++++++-------------------------------
2410 PROCEDURE SUBSET_TRANSITION
2411    ( P_SOURCE_ID          IN            NUMBER
2412    , P_SERVER_ID          IN            NUMBER
2413    , P_CAMPAIGN_ID        IN            NUMBER
2414    , P_SCHEDULE_ID        IN            NUMBER
2415    , P_TARGET_GROUP_ID    IN            NUMBER
2416    , P_FROM_SUBSETS       IN            SYSTEM.NUMBER_TBL_TYPE
2417    , P_INTO_SUBSETS       IN            SYSTEM.NUMBER_TBL_TYPE
2418    , P_ACTION_TYPE        IN            VARCHAR2
2419    , X_NUM_PENDING           OUT NOCOPY NUMBER
2420    , X_ACTION_ID             OUT NOCOPY NUMBER
2421    )
2422 IS
2423 
2424   ----------------------------------------------------------------
2425   -- Local copy of the subsets to move entries into.
2426   ----------------------------------------------------------------
2427   l_into_subsets SYSTEM.NUMBER_TBL_TYPE := SYSTEM.NUMBER_TBL_TYPE();
2428 
2429   ----------------------------------------------------------------
2430   -- Status code used locally.
2431   ----------------------------------------------------------------
2432   L_STATUS_CODE VARCHAR2(1);
2433 
2434   ----------------------------------------------------------------
2435   -- Status code used locally.
2436   ----------------------------------------------------------------
2437   l_return_code VARCHAR2(1);
2438 
2439   ----------------------------------------------------------------
2440   -- The source type view name for the current list.
2441   ----------------------------------------------------------------
2442   l_src_type_view_name VARCHAR2(30);
2443 
2444   ----------------------------------------------------------------
2445   -- The subset view name for the current subset.
2446   ----------------------------------------------------------------
2447   l_subset_view_name VARCHAR2(30);
2448 
2449   ----------------------------------------------------------------
2450   -- Query used to return candidate entries.
2451   ----------------------------------------------------------------
2452   l_first_query_entry_sql VARCHAR2(3000);
2453 
2454   ----------------------------------------------------------------
2455   -- Query used to return candidate entries.
2456   ----------------------------------------------------------------
2457   l_second_query_entry_sql VARCHAR2(3000);
2458 
2459   ----------------------------------------------------------------
2460   -- Query used to return candidate entries' phone numbers.
2461   ----------------------------------------------------------------
2462   l_phone_sql VARCHAR2(3000);
2463 
2464   ----------------------------------------------------------------
2465   -- Default Subset id for the passed in list.
2466   ----------------------------------------------------------------
2467   l_default_subset_id NUMBER := 0;
2468 
2469   ----------------------------------------------------------------
2470   -- The size of the current subset that the entries
2471   -- will be transitioned from.
2472   ----------------------------------------------------------------
2473   l_subset_load_size NUMBER := 0;
2474 
2475   ----------------------------------------------------------------
2476   -- The number of entries left in the current subset that the entries
2477   -- will be transitioned from.
2478   ----------------------------------------------------------------
2479   l_subset_left_size NUMBER := 0;
2480 
2481   ----------------------------------------------------------------
2482   -- The number of entries callable in the current subset that the entries
2483   -- will be transitioned from.
2484   ----------------------------------------------------------------
2485   l_subset_callable_size NUMBER := 0;
2486 
2487   ----------------------------------------------------------------
2488   -- The maximum number of entries to lock of the next entries.
2489   ----------------------------------------------------------------
2490   l_first_batch_size NUMBER := 0;
2491 
2492   ----------------------------------------------------------------
2493   -- The maximum number of entries to lock of all of the rest
2494   -- of the entries.
2495   ----------------------------------------------------------------
2496   l_last_batch_size NUMBER := 0;
2497 
2498   ----------------------------------------------------------------
2499   -- Initialize l_transition_entries to 0.  If l_transition_entries
2500   -- is greater than 0 at the end of this procedure then this is a
2501   -- continuous transition.
2502   ----------------------------------------------------------------
2503   l_transition_entries NUMBER := 0;
2504 
2505   ----------------------------------------------------------------
2506   -- Flag determines if there are currently any entries callable.
2507   -- If there are then the candidate entries in the first transition
2508   -- process will be the callable entries if not then the candidate
2509   -- entries will be all of the entries that can still be used.
2510   ----------------------------------------------------------------
2511   L_USE_CALLABLE_FLAG BOOLEAN := TRUE;
2512 
2513 BEGIN
2514   L_STATUS_CODE  := FND_API.G_RET_STS_SUCCESS;
2515   l_return_code  := FND_API.G_RET_STS_SUCCESS;
2516 
2517     X_NUM_PENDING := 0;
2518     X_ACTION_ID := 0;
2519 
2520     ----------------------------------------------------------------
2521     -- This will retrieve the view name from an IEc lookup value
2522     -- that has been seeded in the database.  In the future there
2523     -- might be an algorithm used to BUILD the view name using values
2524     -- stored in the marketing schema.
2525     ----------------------------------------------------------------
2526     GET_SOURCETYPE_VIEW_NAME
2527       ( P_SOURCE_ID  => P_SOURCE_ID
2528       , P_TARGET_GROUP_ID  => P_TARGET_GROUP_ID
2529       , X_VIEW_NAME  => l_src_type_view_name);
2530 
2531 
2532 
2533     ----------------------------------------------------------------
2534     -- If the transition from subset is to be deleted then we need
2535     -- the id for the default subset in order to transition all
2536     -- entries that do not fall into the category of another defined
2537     -- subset.
2538     ----------------------------------------------------------------
2539     IF (P_ACTION_TYPE = 'Y')
2540     THEN
2541 
2542       ----------------------------------------------------------------
2543       -- This will return the default subset id for this target group.
2544       ----------------------------------------------------------------
2545       GET_DEFAULT_SUBSET_ID( P_SOURCE_ID => P_SOURCE_ID
2546                           , P_TARGET_GROUP_ID  => P_TARGET_GROUP_ID
2547                           , X_DEFAULT_SUBSET_ID => l_default_subset_id);
2548 
2549       ----------------------------------------------------------------
2550       -- Loop thru the list of subsets that entries will be
2551       -- transitioning into.  Make sure the default subset is placed at
2552       -- the end of the collection.  If the default subset is anywhere
2553       -- else in the list then set it to -1 so it doesn't try to
2554       -- execute.
2555       ----------------------------------------------------------------
2556       FOR I IN P_INTO_SUBSETS.FIRST..P_INTO_SUBSETS.LAST
2557       LOOP
2558         IF (P_INTO_SUBSETS(I) = l_default_subset_id)
2559         THEN
2560           IF (I = P_INTO_SUBSETS.LAST)
2561           THEN
2562             l_into_subsets.EXTEND(1);
2563             l_into_subsets(l_into_subsets.LAST) := P_INTO_SUBSETS(I);
2564             EXIT;
2565           END IF;
2566         ELSE
2567           l_into_subsets.EXTEND(1);
2568           l_into_subsets(l_into_subsets.LAST) := P_INTO_SUBSETS(I);
2569           IF (I = P_INTO_SUBSETS.LAST)
2570           THEN
2571             l_into_subsets.EXTEND(1);
2572             l_into_subsets(l_into_subsets.LAST) := l_default_subset_id;
2573           END IF;
2574         END IF;
2575       END LOOP;
2576 
2577     ELSE
2578 
2579       ----------------------------------------------------------------
2580       -- Loop thru the list of subsets that entries will be
2581       -- transitioning into.  Make sure the default subset is placed at
2582       -- the end of the collection.  If the default subset is anywhere
2583       -- else in the list then set it to -1 so it doesn't try to
2584       -- execute.
2585       ----------------------------------------------------------------
2586       FOR I IN P_INTO_SUBSETS.FIRST..P_INTO_SUBSETS.LAST
2587       LOOP
2588         l_into_subsets.EXTEND(1);
2589         l_into_subsets(l_into_subsets.LAST) := P_INTO_SUBSETS(I);
2590       END LOOP;
2591 
2592     END IF;
2593 
2594    ----------------------------------------------------------------
2595    -- Calculate the size of the current subset that the entries
2596    -- will be transitioned from.
2597    ----------------------------------------------------------------
2598    BEGIN
2599       EXECUTE IMMEDIATE 'SELECT  NVL(RECORD_LOADED,0) ' ||
2600                         ' FROM   IEC_G_REP_SUBSET_COUNTS ' ||
2601                         ' WHERE  subset_id = :subsetId '
2602       INTO   l_subset_load_size
2603       USING  P_FROM_SUBSETS(1);
2604    EXCEPTION
2605       WHEN OTHERS THEN
2606          Log( 'Subset_Transition'
2607             , 'GET_TOTAL_ENTRY_COUNT.SUBSET_' || P_FROM_SUBSETS(1)
2608             , SQLERRM);
2609          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2610    END;
2611 
2612    ----------------------------------------------------------------
2613    -- Calculate the number of entries left in the current subset that the entries
2614    -- will be transitioned from.
2615    ----------------------------------------------------------------
2616    BEGIN
2617       EXECUTE IMMEDIATE 'SELECT  NVL(SUM(RECORD_COUNT),0) ' ||
2618                         ' FROM   IEC_G_MKTG_ITEM_CC_TZS ' ||
2619                         ' WHERE  subset_id = :subsetId '
2620       INTO   l_subset_left_size
2621       USING  P_FROM_SUBSETS(1);
2622    EXCEPTION
2623       WHEN OTHERS THEN
2624          Log( 'Subset_Transition'
2625             , 'GET_REMAINING_ENTRY_COUNT.SUBSET_' || P_FROM_SUBSETS(1)
2626             , SQLERRM);
2627          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2628    END;
2629 
2630    ----------------------------------------------------------------
2631    -- Calculate the number of entries callable in the current subset that the entries
2632    -- will be transitioned from.
2633    ----------------------------------------------------------------
2634    BEGIN
2635       EXECUTE IMMEDIATE 'SELECT  NVL(SUM(RECORD_COUNT),0) ' ||
2636                         ' FROM   IEC_G_MKTG_ITEM_CC_TZS ' ||
2637                         ' WHERE  subset_id = :subsetId ' ||
2638                         ' AND    CALLABLE_FLAG = ''Y'' ' ||
2639                         ' AND    LAST_CALLABLE_TIME > SYSDATE '
2640       INTO   l_subset_callable_size
2641       USING  P_FROM_SUBSETS(1);
2642 
2643    EXCEPTION
2644       WHEN OTHERS THEN
2645          Log( 'Subset_Transition'
2646             , 'GET_CALLABLE_ENTRY_COUNT.SUBSET_' || P_FROM_SUBSETS(1)
2647             , SQLERRM);
2648          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2649    END;
2650 
2651    ----------------------------------------------------------------
2652    -- Determine the max batch size for moving entries that are
2653    -- candidates for the next retrieval.
2654    ----------------------------------------------------------------
2655    IF (L_SUBSET_CALLABLE_SIZE <= 0) THEN
2656       IF (L_SUBSET_LEFT_SIZE <= 0) THEN
2657          IF (L_SUBSET_LEFT_SIZE > 200) THEN
2658             L_FIRST_BATCH_SIZE := TRUNC(L_SUBSET_LEFT_SIZE / 2);
2659          ELSE
2660             L_FIRST_BATCH_SIZE := L_SUBSET_LEFT_SIZE;
2661          END IF;
2662       ELSE
2663          L_FIRST_BATCH_SIZE := 10000;
2664       END IF;
2665       L_USE_CALLABLE_FLAG := FALSE;
2666    ELSE
2667       IF (L_SUBSET_CALLABLE_SIZE > 200) THEN
2668          L_FIRST_BATCH_SIZE := TRUNC(L_SUBSET_CALLABLE_SIZE / 2);
2669       ELSE
2670          L_FIRST_BATCH_SIZE := L_SUBSET_CALLABLE_SIZE;
2671       END IF;
2672       L_USE_CALLABLE_FLAG := TRUE;
2673    END IF;
2674 
2675    ----------------------------------------------------------------
2676    -- Determine the max batch size for moving entries that are
2677    -- not candidates for the next retrieval.
2678    ----------------------------------------------------------------
2679    l_LAST_BATCH_SIZE := 10000;
2680 
2681    ----------------------------------------------------------------
2682    -- We need to retrieve all of the phone numbers for the current
2683    -- group of candidate entries.
2684    ----------------------------------------------------------------
2685    l_phone_sql := 'SELECT a.list_entry_id, h.new_subset_id ' ||
2686                   ',1, NVL(b.TERRITORY_CODE, ''-1''), NVL(b.TIMEZONE_ID, -1), NVL(b.REGION_ID, -1) ' ||
2687                   ',2, NVL(c.TERRITORY_CODE, ''-1''), NVL(c.TIMEZONE_ID, -1), NVL(c.REGION_ID, -1) ' ||
2688                   ',3, NVL(d.TERRITORY_CODE, ''-1''), NVL(d.TIMEZONE_ID, -1), NVL(d.REGION_ID, -1) ' ||
2689                   ',4, NVL(e.TERRITORY_CODE, ''-1''), NVL(e.TIMEZONE_ID, -1), NVL(e.REGION_ID, -1) ' ||
2690                   ',5, NVL(f.TERRITORY_CODE, ''-1''), NVL(f.TIMEZONE_ID, -1), NVL(f.REGION_ID, -1) ' ||
2691                   ',6, NVL(g.TERRITORY_CODE, ''-1''), NVL(g.TIMEZONE_ID, -1), NVL(g.REGION_ID, -1) ' ||
2692                   'from ' || l_src_type_view_name || ' a ' ||
2693                   ', iec_g_mktg_item_cc_Tzs b ' ||
2694                   ', iec_g_mktg_item_cc_Tzs c ' ||
2695                   ', iec_g_mktg_item_cc_Tzs d ' ||
2696                   ', iec_g_mktg_item_cc_Tzs e ' ||
2697                   ', iec_g_mktg_item_cc_Tzs f ' ||
2698                   ', iec_g_mktg_item_cc_Tzs g ' ||
2699                   ', IEC_O_TRANSITION_SUBSETS h ' ||
2700                   'where h.list_id = :listID ' ||
2701                   'and h.list_id = a.list_header_id ' ||
2702                   'and h.list_entry_id = a.list_entry_id ' ||
2703                   'and a.reason_code_S1 = b.itm_cc_tz_id(+) ' ||
2704                   'and a.reason_code_S2 = c.itm_cc_tz_id(+) ' ||
2705                   'and a.reason_code_S3 = d.itm_cc_tz_id(+) ' ||
2706                   'and a.reason_code_S4 = e.itm_cc_tz_id(+) ' ||
2707                   'and a.reason_code_S5 = f.itm_cc_tz_id(+) ' ||
2708                   'and a.reason_code_S6 = g.itm_cc_tz_id(+)';
2709 
2710    ----------------------------------------------------------------
2711    -- Initialize l_transition_entries to 0.  If l_transition_entries
2712    -- is greater than 0 at the end of this procedure then this is a
2713    -- continuous transition.
2714    ----------------------------------------------------------------
2715    l_transition_entries := 0;
2716 
2717    ----------------------------------------------------------------
2718    -- Loop thru the list of subsets that entries will be
2719    -- transitioning into.  Disregard the default subset.
2720    -- This loop is to move entries that are the next that could be
2721    -- called.
2722    ----------------------------------------------------------------
2723    FOR I IN l_into_subsets.FIRST..l_into_subsets.LAST
2724    LOOP
2725       IF (l_into_subsets(I) > 0 OR (P_ACTION_TYPE = 'N' AND l_into_subsets(I) = l_default_subset_id))
2726       THEN
2727 
2728          IF (P_ACTION_TYPE = 'N' OR l_into_subsets(I) <> l_default_subset_id)
2729          THEN
2730 
2731             ----------------------------------------------------------------
2732             -- Return the view that we will use for this into subset.
2733             ----------------------------------------------------------------
2734             l_subset_view_name := GET_SUBSET_VIEW( P_SOURCE_ID
2735                                                  , P_TARGET_GROUP_ID
2736                                                  , l_into_subsets(I)
2737                                                  , ' '
2738                                                  , l_src_type_view_name
2739                                                  , l_return_code);
2740 
2741             ----------------------------------------------------------------
2742             -- Build SQL query for the cursor for this into subset.
2743             -- Think about the timing with the L_USE_CALLABLE_FLAG.
2744             ----------------------------------------------------------------
2745             IF L_USE_CALLABLE_FLAG = TRUE
2746             THEN
2747                l_first_query_entry_sql := 'SELECT A.RETURNS_ID ' ||
2748                         ' FROM IEC_G_RETURN_ENTRIES A ' ||
2749                         ' WHERE A.SUBSET_ID = :subsetId ' ||
2750                         ' AND A.PULLED_SUBSET_ID IS NULL ' ||
2751                         ' AND A.ITM_CC_TZ_ID IN ' ||
2752                         ' (SELECT ITM_CC_TZ_ID FROM ' ||
2753                         ' IEC_G_MKTG_ITEM_CC_TZS B WHERE ' ||
2754                         ' A.SUBSET_ID = B.SUBSET_ID ' ||
2755                         ' AND B.CALLABLE_FLAG = ''Y'' ' ||
2756                         ' AND B.LAST_CALLABLE_TIME > SYSDATE) ' ||
2757                         ' AND A.LIST_ENTRY_ID IN (SELECT  C.LIST_ENTRY_ID ' ||
2758                         ' FROM ' || l_subset_view_name || ' C)';
2759             ELSE
2760                l_first_query_entry_sql := 'SELECT A.RETURNS_ID ' ||
2761                         ' FROM IEC_G_RETURN_ENTRIES A ' ||
2762                         ' WHERE A.SUBSET_ID = :subsetId ' ||
2763                         ' AND A.PULLED_SUBSET_ID IS NULL ' ||
2764                         ' AND A.DO_NOT_USE_FLAG = ''N'' ' ||
2765                         ' AND A.LIST_ENTRY_ID IN (SELECT  C.LIST_ENTRY_ID ' ||
2766                         ' FROM ' || l_subset_view_name || ' C)';
2767 
2768             END IF;
2769 
2770             l_second_query_entry_sql := 'SELECT A.RETURNS_ID ' ||
2771                     ' FROM IEC_G_RETURN_ENTRIES A ' ||
2772                     ' WHERE A.SUBSET_ID = :subsetId ' ||
2773                     ' AND A.PULLED_SUBSET_ID IS NULL ' ||
2774                     ' AND A.LIST_ENTRY_ID IN (SELECT  C.LIST_ENTRY_ID ' ||
2775                     ' FROM ' || l_subset_view_name || ' C)';
2776 
2777          ELSE
2778             ----------------------------------------------------------------
2779             -- Build SQL query for the cursor for this into subset.
2780             -- Think about the timing with the L_USE_CALLABLE_FLAG.
2781             ----------------------------------------------------------------
2782             IF L_USE_CALLABLE_FLAG = TRUE THEN
2783                l_first_query_entry_sql := 'SELECT A.RETURNS_ID ' ||
2784                         ' FROM IEC_G_RETURN_ENTRIES A ' ||
2785                         ' WHERE A.SUBSET_ID = :subsetId ' ||
2786                         ' AND A.PULLED_SUBSET_ID IS NULL ' ||
2787                         ' AND A.ITM_CC_TZ_ID IN ' ||
2788                         ' (SELECT ITM_CC_TZ_ID FROM ' ||
2789                         ' IEC_G_MKTG_ITEM_CC_TZS B WHERE ' ||
2790                         ' A.SUBSET_ID = B.SUBSET_ID ' ||
2791                         ' AND B.CALLABLE_FLAG = ''Y'' ' ||
2792                         ' AND B.LAST_CALLABLE_TIME > SYSDATE)';
2793             ELSE
2794                l_first_query_entry_sql := 'SELECT A.RETURNS_ID ' ||
2795                         ' FROM IEC_G_RETURN_ENTRIES A ' ||
2796                         ' WHERE A.SUBSET_ID = :subsetId ' ||
2797                         ' AND A.PULLED_SUBSET_ID IS NULL ' ||
2798                         ' AND A.DO_NOT_USE_FLAG = ''N'' ';
2799             END IF;
2800 
2801             l_second_query_entry_sql := 'SELECT A.RETURNS_ID ' ||
2802                     ' FROM IEC_G_RETURN_ENTRIES A ' ||
2803                     ' WHERE A.SUBSET_ID = :subsetId ' ||
2804                     ' AND A.PULLED_SUBSET_ID IS NULL ';
2805 
2806          END IF;
2807 
2808          ----------------------------------------------------------------
2809          -- First Call Tranisition Entries to transition the entries that
2810          -- will be the most likely to be fetched next.
2811          ----------------------------------------------------------------
2812 
2813          TRANSITION_ENTRIES( P_SOURCE_ID => P_SOURCE_ID
2814                            , P_SERVER_ID => P_SERVER_ID
2815                            , P_CAMPAIGN_ID => P_CAMPAIGN_ID
2816                            , P_SCHED_ID => P_SCHEDULE_ID
2817                            , P_TARGET_GROUP_ID => P_TARGET_GROUP_ID
2818                            , P_FROM_SUBSET => P_FROM_SUBSETS(1)
2819                            , P_INTO_SUBSET => l_into_subsets(I)
2820                            , P_ACTION_TYPE => P_ACTION_TYPE
2821                            , P_PHONE_SQL => l_phone_sql
2822                            , P_ENTRY_SQL => l_first_query_entry_sql
2823                            , P_BATCH_SIZE => L_FIRST_BATCH_SIZE
2824                            , P_SRC_TYPE_VIEW => l_src_type_view_name
2825                            , X_NUM_PENDING => l_transition_entries);
2826 
2827          ----------------------------------------------------------------
2828          -- Next Call Tranisition Entries to transition the rest of the
2829          -- entries.
2830          ----------------------------------------------------------------
2831          TRANSITION_ENTRIES( P_SOURCE_ID => P_SOURCE_ID
2832                            , P_SERVER_ID => P_SERVER_ID
2833                            , P_CAMPAIGN_ID => P_CAMPAIGN_ID
2834                            , P_SCHED_ID => P_SCHEDULE_ID
2835                            , P_TARGET_GROUP_ID => P_TARGET_GROUP_ID
2836                            , P_FROM_SUBSET => P_FROM_SUBSETS(1)
2837                            , P_INTO_SUBSET => l_into_subsets(I)
2838                            , P_ACTION_TYPE => P_ACTION_TYPE
2839                            , P_PHONE_SQL => l_phone_sql
2840                            , P_ENTRY_SQL => l_second_query_entry_sql
2841                            , P_BATCH_SIZE => L_LAST_BATCH_SIZE
2842                            , P_SRC_TYPE_VIEW => l_src_type_view_name
2843                            , X_NUM_PENDING => l_transition_entries);
2844 
2845       END IF; -- end if subset id <> 0 condition
2846 
2847    END LOOP; -- end loop thru into collection to apply views
2848 
2849    COMMIT;
2850 EXCEPTION
2851     WHEN FND_API.G_EXC_ERROR  THEN
2852       ROLLBACK;
2853       RAISE_APPLICATION_ERROR(-20999, g_error_msg);
2854     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2855       ROLLBACK;
2856       RAISE_APPLICATION_ERROR(-20999, g_error_msg);
2857     WHEN OTHERS THEN
2858       ROLLBACK;
2859       Log( 'Subset_Transition'
2860          , 'MAIN.LIST_' || p_target_group_id
2861          , SQLERRM);
2862       RAISE_APPLICATION_ERROR(-20999, g_error_msg);
2863 
2864 END SUBSET_TRANSITION;
2865 
2866 -----------------------------++++++-------------------------------
2867 --
2868 -- Start of comments
2869 --
2870 --  API name    : TEST_TRANSITION
2871 --  Type        : Public
2872 --  Pre-reqs    : None
2873 --  Function    :
2874 --  Parameters  :
2875 --
2876 --  Version     : Initial version 1.0
2877 --
2878 -- End of comments
2879 --
2880 -----------------------------++++++-------------------------------
2881   PROCEDURE TEST_TRANSITION
2882   IS
2883    LIST_ID NUMBER;
2884    SUBSET_INTO_TBL SYSTEM.NUMBER_TBL_TYPE;
2885    SUBSET_FROM_TBL SYSTEM.NUMBER_TBL_TYPE;
2886    RETURN_NUM NUMBER;
2887    X_ACTION_ID NUMBER;
2888 BEGIN
2889    LIST_ID := 10606;
2890    SUBSET_INTO_TBL := SYSTEM.NUMBER_TBL_TYPE(10041);
2891    SUBSET_FROM_TBL := SYSTEM.NUMBER_TBL_TYPE(10028);
2892    TRACELOG(TO_CHAR(SYSDATE, 'MM-DD-YYYY:HH24:MI:SS'));
2893    IEC_SUBSET_PVT.SUBSET_TRANSITION (      1001
2894                                          , 10115
2895                                          , 0 -- CAMPAIGN_ID
2896                                          , 0 -- SCHEDULE_ID
2897                                          , LIST_ID
2898                                          , SUBSET_FROM_TBL
2899                                          , SUBSET_INTO_TBL
2900                                          , 'N'
2901                                          , RETURN_NUM
2902                                          , X_ACTION_ID);
2903    TRACELOG(RETURN_NUM);
2904    TRACELOG(TO_CHAR(SYSDATE, 'MM-DD-YYYY:HH24:MI:SS'));
2905 END TEST_TRANSITION;
2906 
2907 END IEC_SUBSET_PVT;