DBA Data[Home] [Help]

PACKAGE BODY: APPS.JTF_RS_SRP_GROUPS_CONC_PUB

Source


1 PACKAGE BODY jtf_rs_srp_groups_conc_pub AS
2 /* $Header: jtfrsbbb.pls 120.0 2005/05/11 08:19:13 appldev noship $ */
3 
4   /****************************************************************************
5    This is a concurrent program to populate the data in JTF_RS_SRP_GROUPS_INT
6    and JTF_RS_SRP_GROUPS. This program will create primary groups for salesreps
7    for date date range from 01/01/1900 to 12/31/4712. For a specific date there
8    will be only one primary group for a salesrep.
9 
10    CREATED BY    nsinghai   14-AUG-2003
11    MODIFIED BY   nsinghai   20-JAN-2004  ER 3378250 : Giving member role higher
12                                          priority than manager. Not checking for
13                                          Admin and lead roles any more.
14                  nsinghai   06-MAY-2004  Bug 3615320 : Fetch only those rows whose
15                                          start_date is less than or equal to end
16                                          date
17                  nsinghai   03-SEP-2004  Bug 3872750 : Added stages and salesrep_id
18                                          for better informative error.
19                  nsinghai   13-SEP-2004  Bug 3882194 - Change logic to make CP
20                                          incremental on JTF_RS_SRP_GROUPS table
21                  nsinghai   27-SEP-2004  Added logic to filter out -1 group_id
22                                          record from defaulting logic if any other
23                                          valid group is present even at lower level.
24                  nsinghai   07-JAN-2005  added nvl conditions for org_id, since it is
25                                          possible to have org_id as NULL in jtf_rs_salesreps
26                                          table (Bug 4109716)
27    ***************************************************************************/
28 
29 PROCEDURE  populate_default_groups
30   (ERRBUF                    OUT NOCOPY VARCHAR2,
31    RETCODE                   OUT NOCOPY VARCHAR2)
32   IS
33 
34   TYPE srp_grp_type IS RECORD
35   (p_salesrep_id NUMBER,
36    p_org_id NUMBER,
37    p_resource_id NUMBER,
38    p_user_id NUMBER,
39    p_group_id NUMBER,
40    p_start_date DATE,
41    p_end_date DATE
42    );
43 
44    TYPE srp_grp_tbl IS TABLE OF srp_grp_type INDEX BY BINARY_INTEGER;
45 
46    g_srp_grp_tab srp_grp_tbl;
47    temp_srp_grp_tab srp_grp_tbl;
48 
49    l_inner_loop VARCHAR2(10) ;
50 
51    i INTEGER := 0;
52    j INTEGER := 0;
53    k INTEGER := 0;
54    l INTEGER := 0;
55    m INTEGER := 0;
56    n INTEGER := 0;
57    o INTEGER := 0;
58    p INTEGER := 0;
59    q INTEGER := 0;
60 
61    l_user_id NUMBER ;
62    l_sysdate DATE   ;
63    l_status                VARCHAR2(30);
64    l_index_owner           VARCHAR2(30);
65    l_table_owner           VARCHAR2(30);
66    l_index_tblspace        VARCHAR2(60);
67    l_index_exists          VARCHAR2(10);
68    l_prev_start_date       DATE;
69    l_prev_end_date         DATE;
70    l_skip_row              VARCHAR2(10);
71    l_overlap               VARCHAR2(10);
72    l_deletion_occured      VARCHAR2(10);
73    l_stage                 VARCHAR2(300);
74 
75    l_jtfu varchar2(60);
76    l_jtfx varchar2(60);
77    l_jtft varchar2(60);
78 
79   CURSOR c_outer IS
80   SELECT salesrep_id, org_id
81   FROM   jtf_rs_salesreps
82   ;
83 
84   CURSOR c1 (ll_salesrep_id NUMBER, ll_org_id NUMBER )IS
85   SELECT salesrep_id, org_id, resource_id, user_id, group_id, start_date, end_date
86   FROM   jtf_rs_srp_groups_int
87   WHERE  salesrep_id = ll_salesrep_id
88   AND    nvl(org_id,-99)      = nvl(ll_org_id,-99)
89   AND    start_date <= end_date
90   ORDER BY denorm_count, role_type_priority, role_priority;
91 
92   CURSOR c_product_info IS
93     SELECT i.tablespace, i.index_tablespace, u.oracle_username
94     FROM   fnd_product_installations i, fnd_application a, fnd_oracle_userid u
95     WHERE  a.application_short_name = 'JTF'
96     AND    a.application_id = i.application_id
97     AND    u.oracle_id = i.oracle_id;
98 
99   FUNCTION f_get_degree_of_parallelism RETURN NUMBER IS
100     l_parallel NUMBER;
101   BEGIN
102 	l_parallel := null;
103     -- EDW : Degree of Parallelism-Source
104 	l_parallel := null;
105 	l_parallel := floor(fnd_profile.value('EDW_PARALLEL_SRC')); -- gets value of profile option
106 
107 	  /* Set by the customer, return this value */
108 
109 	  IF (l_parallel IS NOT NULL and l_parallel > 0) THEN
110  		return l_parallel;
111 	  END IF;
112 
113 	  /* Not set by customer, so query v$pq_sysstat */
114 
115 	  BEGIN
116  	    SELECT value INTO l_parallel
117 	    FROM v$pq_sysstat  WHERE trim(statistic) = 'Servers Idle';
118   	  EXCEPTION WHEN no_data_found THEN
119 		l_parallel := 1;
120 	  END;
121 
122 	  IF (l_parallel IS NULL) THEN
123 		l_parallel:=1;
124 	  END IF;
125 
126 	  l_parallel := floor(l_parallel/2);
127 	  IF (l_parallel = 0) THEN
128 		l_parallel := 1;
129 	  END IF;
130 
131 	  RETURN l_parallel;
132   END f_get_degree_of_parallelism;
133 
134 BEGIN
135 
136  -- putting initialization variable here because of GSCC warning File.Sql.35
137  -- removed intialization of variables from declaration
138 
139  l_stage      := 'Stage=Initialize';
140 
141  l_inner_loop := 'N';
142  l_user_id    := fnd_global.user_id;
143  l_sysdate    := SYSDATE;
144  l_skip_row   := 'N' ;
145  l_overlap    := 'N' ;
146  l_deletion_occured := 'N' ;
147 
148  retcode := '0' ;
149 
150  l_stage      := 'Stage=FETCH_SCHEMA_DETAILS';
151 
152   --EXECUTE IMMEDIATE 'ALTER SESSION SET SQL_TRACE=TRUE';
153   EXECUTE IMMEDIATE 'ALTER SESSION ENABLE PARALLEL DML';
154 
155   --fetch user name for JTF product
156   OPEN  c_product_info;
157   FETCH c_product_info INTO l_jtft,l_jtfx,l_jtfu;
158   CLOSE c_product_info;
159 
160   -------- Check owner name for the tables and indexes.
161   -- keep index information so that it is easy to create them back
162   -- Check owner name for the tables and indexes.
163   BEGIN
164     SELECT owner, table_owner, tablespace_name
165     INTO   l_index_owner, l_table_owner, l_index_tblspace
166     FROM   ALL_INDEXES
167     WHERE  TABLE_NAME = 'JTF_RS_SRP_GROUPS_INT'
168     AND    index_name = 'JTF_RS_SRP_GROUPS_INT_N1'
169     AND    table_owner= l_jtfu;
170 
171     l_index_exists := 'Y' ;
172 
173   EXCEPTION WHEN OTHERS THEN
174 
175     l_index_exists := 'N' ;
176 
177     -- Check some ther index which will definitly exist
178     SELECT owner, table_owner, tablespace_name
179     INTO   l_index_owner, l_table_owner, l_index_tblspace
180     FROM   ALL_INDEXES
181     WHERE  TABLE_NAME = 'JTF_RS_GROUPS_DENORM'
182     AND    index_name = 'JTF_RS_GROUPS_DENORM_U1'
183 	AND    table_owner= l_jtfu;
184   END;
185 
186   l_stage      := 'Stage=DROP_INDEX  '||l_index_owner||'.JTF_RS_SRP_GROUPS_INT_N1';
187 
188   --------- Drop Index before inserting into intermediate table ----------
189   IF (l_index_exists = 'Y') THEN
190     EXECUTE IMMEDIATE 'DROP INDEX '||l_index_owner||'.JTF_RS_SRP_GROUPS_INT_N1';
191   END IF;
192 
193   -------------Insert into intermediate table ---------
194   EXECUTE IMMEDIATE 'TRUNCATE TABLE '||l_index_owner||'.JTF_RS_SRP_GROUPS_INT';
195 
196   COMMIT;
197 
198   l_stage      := 'Stage=INSERT_IN_JTF_RS_SRP_GROUPS_INT_TABLE';
199 
200   INSERT INTO /*+ APPEND PARALLEL(sg1) NOLOGGING */ jtf_rs_srp_groups_int sg1
201        (srp_groups_id, resource_id, salesrep_id, org_id, user_id,
202         group_id, role_type_code, role_id, role_type_priority,
203         role_priority, start_date, end_date, denorm_count,
204         created_by, creation_date, last_updated_by, last_update_date )
205   SELECT jtf_rs_srp_groups_stage_s.NEXTVAL srp_groups_id,
206        x.resource_id, x.salesrep_id, x.org_id, x.user_id,
207        x.group_id,
208        x.role_type_code, x.role_id, x.role_type_priority, x.role_priority,
209        x.start_date, x.end_date, x.denorm_count,
210        l_user_id, sysdate, l_user_id, sysdate
211   FROM (
212     SELECT /*+ use_hash(rrl mem usg rol den res srp) PARALLEL(rrl)
213              PARALLEL(mem) PARALLEL(usg) PARALLEL(rol) PARALLEL(den)
214              PARALLEL(res) PARALLEL(srp) */
215       mem.resource_id
216      ,mem.group_id
217      ,srp.salesrep_id
218      ,srp.org_id
219      ,res.user_id
220      ,DECODE(rol.role_type_code,'SALES',1,2) role_type_priority
221      --,DECODE('Y',rol.manager_flag,1,rol.admin_flag,2,rol.lead_flag,3,4)role_priority
222      ,DECODE('Y',rol.member_flag,1,rol.manager_flag,2)role_priority
223      ,rrl.start_date_active start_date
224      ,nvl(rrl.end_date_active,TO_DATE('12/31/4712','MM/DD/RRRR')) end_date
225      ,rrl.role_id
226      ,rol.role_type_code
227      ,COUNT(den.group_id) denorm_count
228    FROM   jtf_rs_role_relations rrl
229         ,jtf_rs_group_members mem
230         ,jtf_rs_salesreps srp
231         ,jtf_rs_group_usages usg
232         ,jtf_rs_roles_b rol
233         ,jtf_rs_groups_denorm den
234         ,jtf_rs_resource_extns res
235    WHERE  rrl.role_resource_type = 'RS_GROUP_MEMBER'
236      AND  rrl.delete_flag        = 'N'
237      AND  rrl.role_resource_id   = mem.group_member_id
238      AND  mem.delete_flag        = 'N'
239      AND  mem.group_id           <> -1
240      AND  mem.resource_id        = srp.resource_id
241      AND  mem.group_id           = usg.group_id
242      AND  usg.usage              = 'SALES'
243      AND  rrl.role_id            = rol.role_id
244      AND  'Y' IN (rol.member_flag, rol.manager_flag)
245      AND  mem.resource_id        = res.resource_id
246      AND  mem.group_id           = den.group_id
247      AND  (	rrl.start_date_active BETWEEN den.start_date_active AND
248             nvl(den.end_date_active,TO_DATE('12/31/4712','MM/DD/RRRR'))
249        OR
250            den.start_date_active BETWEEN rrl.start_date_active AND
251            nvl(rrl.end_date_active,TO_DATE('12/31/4712','MM/DD/RRRR'))
252          )
253    GROUP BY mem.resource_id, srp.salesrep_id, srp.org_id,
254            res.user_id, mem.group_id, rrl.start_date_active,
255      rrl.end_date_active, DECODE(rol.role_type_code,'SALES',1,2),
256 --     DECODE('Y',rol.manager_flag,1,rol.admin_flag,2,rol.lead_flag,3,4)
257      DECODE('Y',rol.member_flag,1,rol.manager_flag,2)
258     ,rrl.role_id, rol.role_type_code
259   ) x ;
260 
261   COMMIT;
262 
263   l_stage      := 'Stage=INSERT_IN_JTF_RS_SRP_GROUPS_INT_TABLE_FOR_UNASSIGNED_GROUPS';
264 
265   INSERT INTO /*+ APPEND PARALLEL(sg1) NOLOGGING */ jtf_rs_srp_groups_int sg1
266        (srp_groups_id, resource_id, salesrep_id, org_id, user_id,
267         group_id, role_type_code, role_id, role_type_priority,
268         role_priority, start_date, end_date, denorm_count,
269         created_by, creation_date, last_updated_by, last_update_date )
270   SELECT jtf_rs_srp_groups_stage_s.NEXTVAL srp_groups_id,
271        x.resource_id, x.salesrep_id, x.org_id, x.user_id,
272        x.group_id,
273        x.role_type_code, x.role_id, x.role_type_priority, x.role_priority,
274        x.start_date, x.end_date, x.denorm_count,
275        l_user_id, sysdate, l_user_id, sysdate
276   FROM (
277       SELECT /*+ use_hash(srp res) PARALLEL(srp) PARALLEL(res) */
278              srp.resource_id,
279              srp.salesrep_id,
280              srp.org_id,
281              res.user_id,
282              -1 group_id,
283              'NONE' role_type_code,
284              -1 role_id,
285              9 role_type_priority,
286              9 role_priority,
287              TO_DATE('01/01/1900','MM/DD/RRRR') START_DATE,
288              TO_DATE('12/31/4712','MM/DD/RRRR') END_DATE,
289              99999999 denorm_count
290       FROM
291              jtf_rs_salesreps srp,
292              jtf_rs_resource_extns res
293       WHERE  srp.resource_id = res.resource_id
294      ) x;
295 
296   COMMIT;
297 
298   l_stage      := 'Stage=CREATE_INDEX_ON_JTF_RS_SRP_GROUPS_INT_TABLE';
299 
300   -------------Create index and Analyze table on Intermediate table -------
301   EXECUTE IMMEDIATE 'CREATE INDEX '||l_index_owner
302              ||'.JTF_RS_SRP_GROUPS_INT_N1 ON '
303              ||l_table_owner||'.JTF_RS_SRP_GROUPS_INT '
304              ||' (salesrep_id, org_id, denorm_count, role_type_priority, role_priority) '
305              ||' TABLESPACE '||l_index_tblspace
306              ||' NOLOGGING PARALLEL (DEGREE '||f_get_degree_of_parallelism||' ) ';
307 
308   fnd_stats.gather_table_stats(ownname => l_table_owner, tabname => 'JTF_RS_SRP_GROUPS_INT',
309   percent=>5, degree=>f_get_degree_of_parallelism, granularity=>'GLOBAL',cascade=>TRUE);
310 
311   -------------Truncate the Main table  ---------
312   l_stage      := 'Stage=TRUNCATE_JTF_RS_SRP_GROUPS_STAGE_TABLE';
313 
314   EXECUTE IMMEDIATE 'TRUNCATE TABLE '||l_index_owner||'.JTF_RS_SRP_GROUPS_STAGE';
315 
316   COMMIT;
317 
318   ------------ Start the main logic here --------
319   l_stage      := 'Stage=START_PLSQL_POPULATION_LOGIC';
320 
321   FOR c_get_salesrep_id IN c_outer
322   LOOP
323 
324     l_stage      := 'Stage=INSIDE_PLSQL_OUTER_LOOP_FOR SALESREP_ID:'||c_get_salesrep_id.salesrep_id
325                     ||':ORG_ID:'||c_get_salesrep_id.org_id;
326 
327     -- re-initialize i and dates
328     i := 0;
329     l_prev_start_date := NULL;
330     l_prev_end_date   := NULL;
331     ---------------------main for loop -----------------
332     FOR c_rec IN c1 (c_get_salesrep_id.salesrep_id, c_get_salesrep_id.org_id)
333     LOOP
334 
335       l_stage      := 'Stage=INSIDE_PLSQL_INNER_LOOP_FOR SALESREP_ID:'||c_get_salesrep_id.salesrep_id
336                     ||':ORG_ID:'||c_get_salesrep_id.org_id;
337 
338       -- we should procees further only if the date range is different
339       -- this will help in eliminating few rows and improve performance
340       IF (l_prev_start_date IS NULL) THEN
341         l_skip_row := 'N';
342         l_prev_start_date := c_rec.START_DATE;
343         l_prev_end_date := c_rec.END_DATE;
344       ELSIF
345         ((c_rec.START_DATE BETWEEN l_prev_start_date AND l_prev_end_date) AND
346          (c_rec.END_DATE BETWEEN l_prev_start_date AND l_prev_end_date)) THEN
347          l_skip_row := 'Y';
348       ELSE
349         l_skip_row := 'N';
350         l_prev_start_date := c_rec.START_DATE;
351         l_prev_end_date := c_rec.END_DATE;
352       END IF;
353 
354       -------------------If i=0------------------------
355       -- proceed only if l_skip_row = N
356       IF (l_skip_row = 'N') THEN
357         IF (i = 0) THEN
358           g_srp_grp_tab(i).p_salesrep_id := c_rec.salesrep_id;
359           g_srp_grp_tab(i).p_org_id := c_rec.org_id;
360           g_srp_grp_tab(i).p_resource_id := c_rec.resource_id;
361           g_srp_grp_tab(i).p_user_id := c_rec.user_id;
362           g_srp_grp_tab(i).p_group_id := c_rec.group_id;
363           g_srp_grp_tab(i).p_start_date := c_rec.start_date;
364           g_srp_grp_tab(i).p_end_date := c_rec.end_date;
365           -------------------else of If i=0------------------------
366         ELSE
367           -- loop through the plsql table to check the dates of each record
368           ------------------For outer table looop-----------------------
369           l_inner_loop := 'N';
370           l_overlap    := 'N';
371           l_deletion_occured := 'N' ;
372           j := g_srp_grp_tab.FIRST;
373           WHILE j IS NOT NULL
374           LOOP
375             -- if data existed in inner table
376             IF (temp_srp_grp_tab.COUNT > 0) THEN
377               l_inner_loop := 'Y' ;
378               l := temp_srp_grp_tab.FIRST ;
379               WHILE l IS NOT NULL
380               LOOP
381                 IF ((temp_srp_grp_tab(l).p_start_date < g_srp_grp_tab(j).p_start_date) AND
382                    (temp_srp_grp_tab(l).p_end_date BETWEEN g_srp_grp_tab(j).p_start_date AND g_srp_grp_tab(j).p_end_date))
383                    THEN
384                    temp_srp_grp_tab(l).p_end_date := g_srp_grp_tab(j).p_start_date -1;
385                 ELSIF
386                    ((temp_srp_grp_tab(l).p_start_date BETWEEN g_srp_grp_tab(j).p_start_date AND g_srp_grp_tab(j).p_end_date)
387                      AND
388                     (temp_srp_grp_tab(l).p_end_date > g_srp_grp_tab(j).p_end_date)) THEN
389                    temp_srp_grp_tab(l).p_start_date := g_srp_grp_tab(j).p_end_date +1;
390                 ELSIF
391                    ((temp_srp_grp_tab(l).p_start_date < g_srp_grp_tab(j).p_start_date) AND
392                     (temp_srp_grp_tab(l).p_end_date > g_srp_grp_tab(j).p_end_date)) THEN
393                    -- first get temo_srp_grp_tab(l).p_end_date into new record
394                    -- and then modify the end date in existing record
395                    m := temp_srp_grp_tab.LAST + 1;
396                    --insert the 2nd record for this breakup
397                    temp_srp_grp_tab(m).p_salesrep_id := temp_srp_grp_tab(l).p_salesrep_id;
398                    temp_srp_grp_tab(m).p_org_id := temp_srp_grp_tab(l).p_org_id;
399                    temp_srp_grp_tab(m).p_resource_id := temp_srp_grp_tab(l).p_resource_id;
400                    temp_srp_grp_tab(m).p_user_id := temp_srp_grp_tab(l).p_user_id;
401                    temp_srp_grp_tab(m).p_group_id := temp_srp_grp_tab(l).p_group_id;
402                    temp_srp_grp_tab(m).p_start_date := g_srp_grp_tab(j).p_end_date +1;
403                    temp_srp_grp_tab(m).p_end_date := temp_srp_grp_tab(l).p_end_date;
404 
405                    -- modify existing record
406                    temp_srp_grp_tab(l).p_end_date := g_srp_grp_tab(j).p_start_date -1;
407                 ELSIF
408                    ((temp_srp_grp_tab(l).p_start_date BETWEEN g_srp_grp_tab(j).p_start_date AND g_srp_grp_tab(j).p_end_date)
409                     AND
410                    (temp_srp_grp_tab(l).p_end_date BETWEEN g_srp_grp_tab(j).p_start_date AND g_srp_grp_tab(j).p_end_date))
411                   THEN
412                   -- delete this row from the inner table
413                   temp_srp_grp_tab.DELETE(l);
414                   l_deletion_occured := 'Y' ;
415                 END IF; -- end of inner table date checks
416 
417               l := temp_srp_grp_tab.NEXT(l);
418              END LOOP;
419           ELSE
420             l_inner_loop := 'N' ;
421           END IF;
422 
423          -- do not go further if the inner loop record is deleted and now
424          -- we do not have any row inside that inner that inner table
425          -- i.e. further comparison is useless and we should not insert that record.
426          IF ((temp_srp_grp_tab.COUNT = 0) AND (l_deletion_occured = 'Y')) THEN
427            -- falsely set the variable so that it does not go inside at all
428            l_inner_loop := 'Y';
429            EXIT ;
430          END IF;
431 
432          -- if no row was there in inner table, continue comparing dates with
433          -- cursor dates
434          IF  (l_inner_loop = 'N') THEN
435            -- check if date overlaps
436            IF  ((g_srp_grp_tab(j).p_start_date BETWEEN c_rec.start_date AND c_rec.end_date)
437              OR (c_rec.start_date BETWEEN g_srp_grp_tab(j).p_start_date AND g_srp_grp_tab(j).p_end_date))
438            THEN
439              -- go deep
440              --intialize the inner table counter
441              l_overlap := 'Y';
442              k := 0;
443              IF ((c_rec.start_date < g_srp_grp_tab(j).p_start_date) AND
444                 (c_rec.end_date BETWEEN g_srp_grp_tab(j).p_start_date AND g_srp_grp_tab(j).p_end_date)) THEN
445                 temp_srp_grp_tab(k).p_salesrep_id := c_rec.salesrep_id;
446                 temp_srp_grp_tab(k).p_org_id := c_rec.org_id;
447                 temp_srp_grp_tab(k).p_resource_id := c_rec.resource_id;
448                 temp_srp_grp_tab(k).p_user_id := c_rec.user_id;
449                 temp_srp_grp_tab(k).p_group_id := c_rec.group_id;
450                 temp_srp_grp_tab(k).p_start_date := c_rec.start_date;
451                 temp_srp_grp_tab(k).p_end_date := g_srp_grp_tab(j).p_start_date -1;
452               ELSIF
453                 ((c_rec.start_date BETWEEN g_srp_grp_tab(j).p_start_date AND g_srp_grp_tab(j).p_end_date) AND
454                  (c_rec.end_date > g_srp_grp_tab(j).p_end_date)) THEN
455                 temp_srp_grp_tab(k).p_salesrep_id := c_rec.salesrep_id;
456                 temp_srp_grp_tab(k).p_org_id := c_rec.org_id;
457                 temp_srp_grp_tab(k).p_resource_id := c_rec.resource_id;
458                 temp_srp_grp_tab(k).p_user_id := c_rec.user_id;
459                 temp_srp_grp_tab(k).p_group_id := c_rec.group_id;
460                 temp_srp_grp_tab(k).p_start_date := g_srp_grp_tab(j).p_end_date +1;
461                 temp_srp_grp_tab(k).p_end_date := c_rec.end_date;
462               ELSIF
463                 ((c_rec.start_date < g_srp_grp_tab(j).p_start_date) AND
464                  (c_rec.end_date > g_srp_grp_tab(j).p_end_date)) THEN
465                 temp_srp_grp_tab(k).p_salesrep_id := c_rec.salesrep_id;
466                 temp_srp_grp_tab(k).p_org_id := c_rec.org_id;
467                 temp_srp_grp_tab(k).p_resource_id := c_rec.resource_id;
468                 temp_srp_grp_tab(k).p_user_id := c_rec.user_id;
469                 temp_srp_grp_tab(k).p_group_id := c_rec.group_id;
470                 temp_srp_grp_tab(k).p_start_date := c_rec.start_date;
471                 temp_srp_grp_tab(k).p_end_date := g_srp_grp_tab(j).p_start_date -1;
472 
473                 k := k + 1;
474                 temp_srp_grp_tab(k).p_salesrep_id := c_rec.salesrep_id;
475                 temp_srp_grp_tab(k).p_org_id := c_rec.org_id;
476                 temp_srp_grp_tab(k).p_resource_id := c_rec.resource_id;
477                 temp_srp_grp_tab(k).p_user_id := c_rec.user_id;
478                 temp_srp_grp_tab(k).p_group_id := c_rec.group_id;
479                 temp_srp_grp_tab(k).p_start_date := g_srp_grp_tab(j).p_end_date +1;
480                 temp_srp_grp_tab(k).p_end_date := c_rec.end_date;
481               ELSIF
482                 ((c_rec.start_date BETWEEN g_srp_grp_tab(j).p_start_date AND g_srp_grp_tab(j).p_end_date) AND
483                 (c_rec.end_date BETWEEN g_srp_grp_tab(j).p_start_date AND g_srp_grp_tab(j).p_end_date)) THEN
484                  -- break from loop because we do not want to check further
485                  -- for this condition
486                  EXIT;
487               END IF; -- end of outer table date checks
488 
489          ELSE -- doesn't overlap with any one
490            l_overlap := 'N';
491          END IF;
492 
493        END IF; -- l_inner_loop = 'N' check
494      -------------------End of outer table loop------------------------
495      j := g_srp_grp_tab.NEXT(j);
496      END LOOP;
497 
498      -- If there was no overlap with any previous group, insert it
499      IF (l_overlap = 'N') THEN
500         g_srp_grp_tab(i).p_salesrep_id := c_rec.salesrep_id;
501         g_srp_grp_tab(i).p_org_id := c_rec.org_id;
502         g_srp_grp_tab(i).p_resource_id := c_rec.resource_id;
503         g_srp_grp_tab(i).p_user_id := c_rec.user_id;
504         g_srp_grp_tab(i).p_group_id := c_rec.group_id;
505         g_srp_grp_tab(i).p_start_date := c_rec.start_date;
506         g_srp_grp_tab(i).p_end_date := c_rec.end_date;
507       END IF;
508 
509       -- move data from inner table to outer table and then delete inner table.
510       IF (temp_srp_grp_tab.COUNT > 0) THEN
511         n := g_srp_grp_tab.LAST;
512         p := temp_srp_grp_tab.FIRST;
513 
514         WHILE p IS NOT NULL
515         LOOP
516           -- do only if start_date is before or eqal to end date
517           IF (temp_srp_grp_tab(p).p_start_date <= temp_srp_grp_tab(p).p_end_date) THEN
518             n := n + 1;
519             g_srp_grp_tab(n).p_salesrep_id := temp_srp_grp_tab(p).p_salesrep_id;
520             g_srp_grp_tab(n).p_org_id := temp_srp_grp_tab(p).p_org_id;
521             g_srp_grp_tab(n).p_resource_id := temp_srp_grp_tab(p).p_resource_id;
522             g_srp_grp_tab(n).p_user_id := temp_srp_grp_tab(p).p_user_id;
523             g_srp_grp_tab(n).p_group_id := temp_srp_grp_tab(p).p_group_id;
524             g_srp_grp_tab(n).p_start_date := temp_srp_grp_tab(p).p_start_date;
525             g_srp_grp_tab(n).p_end_date := temp_srp_grp_tab(p).p_end_date;
526           END IF;
527           p := temp_srp_grp_tab.NEXT(p);
528         END LOOP;
529 
530         temp_srp_grp_tab.DELETE;
531       END IF;
532      -------------------If i=0------------------------
533      END IF;
534     --------------End If l_skip_row = N check---------
535     END IF;
536 
537     i :=  i + 1;
538    ---------------------main for loop -----------------
539    END LOOP;
540 
541    IF (g_srp_grp_tab.COUNT > 0) THEN
542 
543      o := g_srp_grp_tab.FIRST ;
544 
545      WHILE o IS NOT NULL
546      LOOP
547        INSERT INTO /*+ APPEND PARALLEL(sg1) NOLOGGING */ jtf_rs_srp_groups_stage sg1
548                 (srp_groups_id, resource_id, salesrep_id, org_id, user_id,
549                  group_id, start_date, end_date,
550                  created_by, creation_date, last_updated_by, last_update_date )
551        VALUES (jtf_rs_srp_groups_stage_s.NEXTVAL, g_srp_grp_tab(o).p_resource_id,
552                  g_srp_grp_tab(o).p_salesrep_id, g_srp_grp_tab(o).p_org_id,
553                  g_srp_grp_tab(o).p_user_id, g_srp_grp_tab(o).p_group_id,
554                  g_srp_grp_tab(o).p_start_date, g_srp_grp_tab(o).p_end_date,
555                  l_user_id, sysdate, l_user_id, sysdate);
556 
557        o := g_srp_grp_tab.NEXT(o);
558      END LOOP;
559 
560      -- delete the table for next set of salesrep id and org id
561      g_srp_grp_tab.DELETE;
562    END IF;
563    COMMIT;
564 
565   END LOOP; -- end of c_outer cursor
566 
567   -- analyze Staging table
568   l_stage := 'Stage=ANALYZING_JTF_RS_SRP_GROUPS_STAGE_TABLE';
569 
570   fnd_stats.gather_table_stats(ownname => l_table_owner, tabname => 'JTF_RS_SRP_GROUPS_STAGE',
571   percent=>5, degree=>f_get_degree_of_parallelism, granularity=>'GLOBAL',cascade=>TRUE);
572 
573   ----------------------------------------
574   -- Added by NSINGHAI on 13-Sep-2004 for Bug # 3882194 - to make CP Incremental
575 
576   -- Now compare data in recently refreshed table JTF_RS_SRP_GROUPS_STAGE (new) with
577   -- previously populated table JTF_RS_SRP_GROUPS (old) (final incremental table)
578 
579   -- If there is some data in JTF_RS_SRP_GROUPS (old data) which does not exist in
580   -- recently refreshed table JTF_RS_SRP_GROUPS_STAGE, it means it is STALE data and
581   -- has to be DELETED from JTF_RS_SRP_GROUPS (final table)
582 
583   l_stage := 'Stage=DELETE_DATA_FROM_JTF_RS_SRP_GROUPS_TABLE';
584 
585   DELETE FROM jtf_rs_srp_groups
586   WHERE (resource_id, salesrep_id, NVL(org_id,-99), NVL(user_id,-84), group_id, START_DATE, end_date) IN
587   (
588    SELECT resource_id, salesrep_id, NVL(org_id,-99), NVL(user_id,-84), group_id, START_DATE, end_date
589    FROM   jtf_rs_srp_groups
590    MINUS
591    SELECT resource_id, salesrep_id, NVL(org_id,-99), NVL(user_id,-84), group_id, START_DATE, end_date
592    FROM   jtf_rs_srp_groups_stage
593   )  ;
594 
595   COMMIT;
596 
597   -- If there is some data in recently refreshed table JTF_RS_SRP_GROUPS_STAGE
598   -- (new data) which does not exist in final table JTF_RS_SRP_GROUPS_STAGE, it
599   -- means it is NEW data and has to be INSERTED in JTF_RS_SRP_GROUPS (final table)
600 
601   l_stage := 'Stage=INSERT_DATA_IN_JTF_RS_SRP_GROUPS_TABLE';
602 
603   INSERT INTO /*+ APPEND PARALLEL(sg1) NOLOGGING */ jtf_rs_srp_groups sg1
604         (srp_groups_id, resource_id, salesrep_id, org_id, user_id,
605          group_id, start_date, end_date,
606          created_by, creation_date, last_updated_by, last_update_date )
607   SELECT
608       jtf_rs_srp_groups_s.NEXTVAL, resource_id, salesrep_id, org_id, user_id,
609       group_id, start_date, end_date,
610       l_user_id created_by, SYSDATE creation_date, l_user_id last_updated_by, SYSDATE
611   FROM (
612          SELECT resource_id, salesrep_id, org_id, user_id, group_id, START_DATE, end_date
613          FROM jtf_rs_srp_groups_stage
614          MINUS
615          SELECT resource_id, salesrep_id, org_id, user_id, group_id, START_DATE, end_date
616          FROM jtf_rs_srp_groups
617        );
618 
619   COMMIT;
620 
621   -- analyze Staging table
622   l_stage := 'Stage=ANALYZING_JTF_RS_SRP_GROUPS_TABLE';
623 
624   fnd_stats.gather_table_stats(ownname => l_table_owner, tabname => 'JTF_RS_SRP_GROUPS',
625   percent=>5, degree=>f_get_degree_of_parallelism, granularity=>'GLOBAL',cascade=>TRUE);
626 
627   ----------------------------------------
628 
629   EXECUTE IMMEDIATE 'ALTER SESSION DISABLE PARALLEL DML';
630   --EXECUTE IMMEDIATE 'ALTER SESSION SET SQL_TRACE=FALSE';
631 
632   l_stage := 'Stage=Completed';
633   errbuf := l_stage;
634 
635   EXCEPTION WHEN OTHERS THEN
636     fnd_file.put_line(fnd_file.log, l_stage);
637     fnd_file.put_line(fnd_file.log, sqlerrm);
638     retcode := '2'; -- Error
639     errbuf  := l_stage||' : ERROR : '||sqlerrm;
640     --dbms_output.put_line(l_stage||': Error : '||SQLERRM);
641   END populate_default_groups; -- end procedure
642 
643 END jtf_rs_srp_groups_conc_pub; -- end package body