DBA Data[Home] [Help]

PACKAGE BODY: APPS.JTF_RS_GROUP_RELATE_VUHK

Source


1 PACKAGE BODY jtf_rs_group_relate_vuhk AS
2 /* $Header: cnirsgrb.pls 120.2 2005/08/04 15:12:41 mblum noship $ */
3 
4 -- variables to pass the values from update_res_group_relate_pre to update_res_group_relate_post
5   G_PKG_NAME          VARCHAR2(30) := 'JTF_RS_GROUP_RELATE_VUHK';
6   g_event_log_id      NUMBER;
7   g_start_date_old    DATE;
8   g_end_date_old      DATE;
9   g_group_id          NUMBER;
10 
11   -- helper procedure for the MOAC session context
12   PROCEDURE restore_context(p_acc_mode VARCHAR2,
13                             p_org_id   NUMBER) IS
14   BEGIN
15      IF p_acc_mode IS NOT NULL then
16         mo_global.set_policy_context(p_acc_mode, p_org_id);
17      END IF;
18   END restore_context;
19 
20 
21  PROCEDURE  create_res_group_relate_pre
22   (P_GROUP_ID             IN   JTF_RS_GROUPS_B.GROUP_ID%TYPE,
23    P_RELATED_GROUP_ID     IN   JTF_RS_GRP_RELATIONS.RELATED_GROUP_ID%TYPE,
24    P_RELATION_TYPE        IN   JTF_RS_GRP_RELATIONS.RELATION_TYPE%TYPE,
25    P_START_DATE_ACTIVE    IN   JTF_RS_GRP_RELATIONS.START_DATE_ACTIVE%TYPE,
26    P_END_DATE_ACTIVE      IN   JTF_RS_GRP_RELATIONS.END_DATE_ACTIVE%TYPE   DEFAULT  NULL,
27    P_DATA                 OUT  NOCOPY VARCHAR2,
28    P_COUNT                OUT  NOCOPY NUMBER,
29    P_RETURN_CODE          OUT  NOCOPY VARCHAR2
30    ) IS
31   BEGIN
32      p_return_code := fnd_api.g_ret_sts_success;
33   END create_res_group_relate_pre;
34 
35 
36   PROCEDURE  update_res_group_relate_pre
37   (P_GROUP_RELATE_ID      IN   JTF_RS_GRP_RELATIONS.GROUP_RELATE_ID%TYPE,
38    P_START_DATE_ACTIVE    IN   JTF_RS_GRP_RELATIONS.START_DATE_ACTIVE%TYPE   DEFAULT  FND_API.G_MISS_DATE,
39    P_END_DATE_ACTIVE      IN   JTF_RS_GRP_RELATIONS.END_DATE_ACTIVE%TYPE   DEFAULT  FND_API.G_MISS_DATE,
40    P_OBJECT_VERSION_NUM   IN   JTF_RS_GRP_RELATIONS.OBJECT_VERSION_NUMBER%TYPE,
41    P_DATA                   OUT  NOCOPY VARCHAR2,
42    P_COUNT            OUT  NOCOPY NUMBER,
43    P_RETURN_CODE            OUT  NOCOPY VARCHAR2
44    ) IS
45       l_start_date        DATE;
46       l_end_date          DATE;
47       l_group_name        VARCHAR2(60);
48       l_action_link_id    NUMBER;
49       l_roll_action_link_id    NUMBER;
50       l_srp               cn_rollup_pvt.srp_group_rec_type;
51       l_srp_tbl           cn_rollup_pvt.srp_group_tbl_type;
52       l_return_status     VARCHAR2(30);
53       l_msg_count         NUMBER;
54       l_msg_data          VARCHAR2(256);
55       l_api_name          VARCHAR2(30) := 'update_res_group_relate_pre';
56       -- clku, fix max date
57       l_max_date        CONSTANT DATE  := to_date('31-12-9999','DD-MM-YYYY');
58 
59       l_orig_org_id       NUMBER;
60       l_orig_acc_mode     VARCHAR2(1);
61 
62 
63       -- cursor to get the usage code of the group identified by p_group_id
64       -- Do we need to make sure that the related group is also used by OSC
65       CURSOR group_info IS
66 	 SELECT r.start_date_active, r.end_date_active, r.group_id
67 	   FROM jtf_rs_group_usages u,
68 	        jtf_rs_grp_relations r
69 	   WHERE r.group_relate_id = p_group_relate_id
70 	     AND u.group_id = r.group_id AND u.usage = 'SALES_COMP';
71 
72       -- cursor to get the name of the group identified by p_group_id
73       CURSOR group_name IS
74 	 SELECT name
75 	   FROM cn_comp_groups
76 	   WHERE comp_group_id = g_group_id;
77 
78       -- cursor to find all periods in the date range for each srp
79       CURSOR periods(p_salesrep_id NUMBER, p_start_date DATE, p_end_date DATE) IS
80 	 SELECT p.period_id,
81 	        greatest(p_start_date, p.start_date) start_date,
82 	        Decode(p_end_date, NULL, p.end_date, Least(p_end_date, p.end_date)) end_date
83 	   FROM cn_srp_intel_periods p
84 	  WHERE p.salesrep_id = p_salesrep_id
85 	    AND (p_end_date IS NULL OR p.start_date <= p_end_date)
86 	    AND (p.end_date >= p_start_date);
87 
88         --- get the reps who belong to the group
89      CURSOR srp_group_team_csr (p_salesrep_id NUMBER, p_group_id NUMBER, p_start_date DATE, p_end_date DATE)IS
90          select distinct ct.name name,
91                 ct.comp_team_id team_id,
92                 greatest(p_start_date, cg.start_date_active, ct.start_date_active) start_date,
93                 least(nvl(ct.end_date_active, l_max_date), nvl(cg.end_date_active, l_max_date), nvl(p_end_date, l_max_date)) end_date
94          from cn_srp_comp_teams_v srt, cn_comp_teams ct, cn_srp_comp_groups_v cg
95          where (p_salesrep_id IS NULL or srt.salesrep_id = p_salesrep_id)
96            and (p_salesrep_id IS NULL or cg.salesrep_id = p_salesrep_id)
97            and cg.comp_group_id = p_group_id
98            and srt.comp_team_id = ct.comp_team_id
99            and (cg.start_date_active <= ct.start_date_active
100              or cg.start_date_active between ct.start_date_active and nvl (ct.end_date_active, cg.start_date_active))
101            and nvl(cg.end_date_active, ct.start_date_active) >= ct.start_date_active
102            and (cg.end_date_active IS NULL OR p_start_date <= cg.end_date_active)
103   	       and (p_end_date IS NULL OR p_end_date >= cg.start_date_active);
104 
105      CURSOR get_orgs IS
106 	SELECT org_id FROM cn_repositories_all WHERE status = 'A';
107   BEGIN
108      p_return_code := fnd_api.g_ret_sts_success;
109 
110      IF fnd_profile.value('CN_MARK_EVENTS') <> 'Y' THEN
111 	RETURN;
112      END IF;
113 
114      -- store MOAC session info in local variables
115      l_orig_org_id   := mo_global.get_current_org_id;
116      l_orig_acc_mode := mo_global.get_access_mode;
117 
118      -- loop through orgs
119      FOR o IN get_orgs LOOP
120         mo_global.set_policy_context('S', o.org_id);
121 
122 	-- reset g_group_id to null before trying to set it to another value.
123 	g_group_id := NULL;
124 
125 	OPEN group_info;
126 	FETCH group_info INTO g_start_date_old, g_end_date_old, g_group_id;
127 	IF (group_info%notfound) THEN
128 	   CLOSE group_info;
129 	 ELSE
130 	   CLOSE group_info;
131 
132 	   OPEN group_name;
133 	   FETCH group_name INTO l_group_name;
134 	   IF (group_name%notfound) THEN
135 	      CLOSE group_name;
136 	    ELSE
137 	      CLOSE group_name;
138 
139 	      cn_mark_events_pkg.log_event
140 		( p_event_name      => 'CHANGE_CP_HIER_DATE',
141 		  p_object_name     => l_group_name,
142 		  p_object_id       => g_group_id,
143 		  p_start_date      => p_start_date_active,
144 		  p_start_date_old  => g_start_date_old,
145 		  p_end_date        => p_end_date_active,
146 		  p_end_date_old    => g_end_date_old,
147 		  x_event_log_id    => g_event_log_id,
148 		  p_org_id          => o.org_id);
149 
150 	      l_srp.group_id := g_group_id;
151 	      -- delete the period (g_start_date_old, p_start_date_active) which is not active any more
152 	      IF (p_start_date_active > g_start_date_old) THEN
153 		 IF (g_end_date_old IS NOT NULL AND g_end_date_old < p_start_date_active) THEN
154 		    l_end_date := g_end_date_old;
155 		  ELSE
156 		    l_end_date := p_start_date_active - 1;
157 		 END IF;
158 
159 		 l_srp.start_date := g_start_date_old;
160 		 l_srp.end_date := l_end_date;
161 
162 		 cn_rollup_pvt.get_ancestor_salesrep
163 		   ( p_api_version         => 1.0,
164 		     p_init_msg_list       => FND_API.G_false,
165 		     p_commit              => FND_API.G_false,
166 		     p_validation_level    => FND_API.G_VALID_LEVEL_FULL,
167 		     x_return_status       => l_return_status,
168 		     x_msg_count           => l_msg_count,
169 		     x_msg_data            => l_msg_data,
170 		     p_srp                 => l_srp,
171 		     p_org_id              => o.org_id,
172 		     x_srp                 => l_srp_tbl);
173 
174 		 IF (l_srp_tbl.COUNT > 0) THEN
175 		    cn_mark_events_pkg.mark_notify_salesreps
176 		      ( p_salesrep_id        => NULL,
177 			p_comp_group_id      => l_srp.group_id,
178 			p_period_id          => null,
179 			p_start_date         => l_srp.start_date,
180 			p_end_date           => l_srp.end_date,
181 			p_revert_to_state    => 'NCALC',
182 			p_action             => 'DELETE_ROLL_PULL',
183 			p_action_link_id     => NULL,
184 			p_base_salesrep_id   => NULL,
185 			p_base_comp_group_id => NULL,
186 			p_event_log_id       => g_event_log_id,
187 			x_action_link_id     => l_roll_action_link_id,
188 			p_org_id             => o.org_id);
189 
190 		    FOR i IN l_srp_tbl.first..l_srp_tbl.last LOOP
191 		       FOR prd IN periods(l_srp_tbl(i).salesrep_id, l_srp_tbl(i).start_date, l_srp_tbl(i).end_date) LOOP
192 			  cn_mark_events_pkg.mark_notify_salesreps
193 			    ( p_salesrep_id        => l_srp_tbl(i).salesrep_id,
194 			      p_comp_group_id      => l_srp_tbl(i).group_id,
195 			      p_period_id          => prd.period_id,
196 			      p_start_date         => prd.start_date,
197 			      p_end_date           => prd.end_date,
198 			      p_revert_to_state    => 'CALC',
199 			      p_action             => NULL,
200 			      p_action_link_id     => l_roll_action_link_id,
201 			      p_base_salesrep_id   => NULL,
202 			      p_base_comp_group_id => NULL,
203 			      p_event_log_id       => g_event_log_id,
204 			      x_action_link_id     => l_action_link_id,
205 			      p_org_id             => o.org_id);
206 		       END LOOP;
207 
208 		       -- check if this rep belongs to a team
209 		       FOR srp_gp_tm_rec IN srp_group_team_csr (l_srp_tbl(i).salesrep_id, l_srp_tbl(i).group_id, l_srp_tbl(i).start_date, l_srp_tbl(i).end_date) LOOP
210 
211 			  if srp_gp_tm_rec.end_date = l_max_date then
212 			     srp_gp_tm_rec.end_date := NULL;
213 			  end if;
214 
215 			  cn_mark_events_pkg.mark_notify_team
216 			    (P_TEAM_ID              => srp_gp_tm_rec.team_id ,
217 			     P_TEAM_EVENT_NAME      => 'CHANGE_TEAM_DEL_REP',
218 			     P_TEAM_NAME            => srp_gp_tm_rec.name,
219 			     P_START_DATE_ACTIVE    => srp_gp_tm_rec.start_date,
220 			     P_END_DATE_ACTIVE      => srp_gp_tm_rec.end_date,
221 			     P_EVENT_LOG_ID         => g_event_log_id,
222 			     p_org_id               => o.org_id);
223 		       END LOOP;
224 		    END LOOP;
225 		 END IF;
226 		 l_srp_tbl.DELETE;
227 	      END IF;
228 
229 	      -- delete the period (p_end_date_active, g_end_date_old) which is not active any more
230 	      IF ((g_end_date_old IS NULL AND p_end_date_active IS NOT NULL) OR p_end_date_active < g_end_date_old) THEN
231 		 IF (p_end_date_active < g_start_date_old) THEN
232 		    l_start_date := g_start_date_old;
233 		  ELSE
234 		    l_start_date := p_end_date_active + 1;
235 		 END IF;
236 
237 		 l_srp.start_date := l_start_date;
238 		 l_srp.end_date := g_end_date_old;
239 
240 		 cn_rollup_pvt.get_ancestor_salesrep
241 		   ( p_api_version         => 1.0,
242 		     p_init_msg_list       => FND_API.G_false,
243 		     p_commit              => FND_API.G_false,
244 		     p_validation_level    => FND_API.G_VALID_LEVEL_FULL,
245 		     x_return_status       => l_return_status,
246 		     x_msg_count           => l_msg_count,
247 		     x_msg_data            => l_msg_data,
248 		     p_srp                 => l_srp,
249 		     p_org_id              => o.org_id,
250 		     x_srp                 => l_srp_tbl);
251 
252 		 IF (l_srp_tbl.COUNT > 0) THEN
253 		    cn_mark_events_pkg.mark_notify_salesreps
254 		      ( p_salesrep_id        => NULL,
255 			p_comp_group_id      => l_srp.group_id,
256 			p_period_id          => null,
257 			p_start_date         => l_srp.start_date,
258 			p_end_date           => l_srp.end_date,
259 			p_revert_to_state    => 'NCALC',
260 			p_action             => 'DELETE_ROLL_PULL',
261 			p_action_link_id     => NULL,
262 			p_base_salesrep_id   => NULL,
263 			p_base_comp_group_id => NULL,
264 			p_event_log_id       => g_event_log_id,
265 			x_action_link_id     => l_roll_action_link_id,
266 			p_org_id             => o.org_id);
267 
268 		    FOR i IN l_srp_tbl.first..l_srp_tbl.last LOOP
269 		       FOR prd IN periods(l_srp_tbl(i).salesrep_id, l_srp_tbl(i).start_date, l_srp_tbl(i).end_date) LOOP
270 
271 			  cn_mark_events_pkg.mark_notify_salesreps
272 			    ( p_salesrep_id        => l_srp_tbl(i).salesrep_id,
273 			      p_comp_group_id      => l_srp_tbl(i).group_id,
274 			      p_period_id          => prd.period_id,
275 			      p_start_date         => prd.start_date,
276 			      p_end_date           => prd.end_date,
277 			      p_revert_to_state    => 'CALC',
278 			      p_action             => NULL,
279 			      p_action_link_id     => l_roll_action_link_id,
280 			      p_base_salesrep_id   => NULL,
281 			      p_base_comp_group_id => NULL,
282 			      p_event_log_id       => g_event_log_id,
283 			      x_action_link_id     => l_action_link_id,
284 			      p_org_id             => o.org_id);
285 		       END LOOP;
286 
287 		       -- check if this rep belongs to a team
288 		       FOR srp_gp_tm_rec IN srp_group_team_csr (l_srp_tbl(i).salesrep_id, l_srp_tbl(i).group_id, l_srp_tbl(i).start_date, l_srp_tbl(i).end_date) LOOP
289 
290 			  if srp_gp_tm_rec.end_date = l_max_date then
291 			     srp_gp_tm_rec.end_date := NULL;
292 			  end if;
293 
294 			  cn_mark_events_pkg.mark_notify_team
295 			    (P_TEAM_ID              => srp_gp_tm_rec.team_id ,
296 			     P_TEAM_EVENT_NAME      => 'CHANGE_TEAM_DEL_REP',
297 			     P_TEAM_NAME            => srp_gp_tm_rec.name,
298 			     P_START_DATE_ACTIVE    => srp_gp_tm_rec.start_date,
299 			     P_END_DATE_ACTIVE      => srp_gp_tm_rec.end_date,
300 			     P_EVENT_LOG_ID         => g_event_log_id,
301 			     p_org_id               => o.org_id);
302 		       END LOOP;
303 		    END LOOP;
304 		 END IF;
305 		 l_srp_tbl.DELETE;
306 	      END IF;
307 
308 	   END IF; -- group_name found
309 	END IF; -- group_info found
310      END LOOP; -- orgs
311 
312       -- restore context
313      restore_context(l_orig_acc_mode, l_orig_org_id);
314 
315   EXCEPTION
316      WHEN OTHERS THEN
317 	p_return_code := fnd_api.g_ret_sts_unexp_error;
318 	restore_context(l_orig_acc_mode, l_orig_org_id);
319 	IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
320 	  THEN
321 	   FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME ,l_api_name );
322 	END IF;
323 	FND_MSG_PUB.count_and_get
324 	  (
325 	   p_count   =>  p_count ,
326 	   p_data    =>  p_data  ,
327 	   p_encoded => FND_API.g_false
328 	   );
329 
330   END update_res_group_relate_pre;
331 
332   PROCEDURE  delete_res_group_relate_pre
333   (P_GROUP_RELATE_ID      IN   JTF_RS_GRP_RELATIONS.GROUP_RELATE_ID%TYPE,
334    P_OBJECT_VERSION_NUM   IN   JTF_RS_GROUPS_VL.OBJECT_VERSION_NUMBER%TYPE,
335    P_DATA                 OUT  NOCOPY VARCHAR2,
336    P_COUNT                OUT  NOCOPY NUMBER,
337    P_RETURN_CODE          OUT  NOCOPY VARCHAR2
338    ) IS
339       l_event_log_id      NUMBER;
340       l_start_date        DATE;
341       l_end_date          DATE;
342       l_group_name        VARCHAR2(60);
343       l_action_link_id    NUMBER;
344       p_action_link_id    NUMBER;
345       l_srp               cn_rollup_pvt.srp_group_rec_type;
346       l_srp_tbl           cn_rollup_pvt.srp_group_tbl_type;
347       l_return_status     VARCHAR2(30);
348       l_msg_count         NUMBER;
349       l_msg_data          VARCHAR2(256);
350       l_group_id          NUMBER;
351       l_api_name          VARCHAR2(30) := 'delete_res_group_relate_pre';
352       -- clku, fix max date
353       l_max_date CONSTANT DATE  := to_date('31-12-9999','DD-MM-YYYY');
354 
355       l_orig_org_id       NUMBER;
356       l_orig_acc_mode     VARCHAR2(1);
357 
358       -- cursor to get the usage code of the group identified by p_group_id
359       -- Do we need to make sure that the related group is also used by OSC
360       CURSOR group_info IS
361 	 SELECT r.start_date_active, r.end_date_active, r.group_id
362 	   FROM jtf_rs_group_usages u,
363 	        jtf_rs_grp_relations r
364 	   WHERE r.group_relate_id = p_group_relate_id
365 	     AND u.group_id = r.group_id AND u.usage = 'SALES_COMP';
366 
367       -- cursor to get the name of the group identified by p_group_id
368       CURSOR group_name IS
369 	 SELECT name
370 	   FROM cn_comp_groups
371 	   WHERE comp_group_id = l_group_id;
372 
373       -- cursor to find all periods in the date range for each srp
374       CURSOR periods(p_salesrep_id NUMBER, p_start_date DATE, p_end_date DATE) IS
375 	 SELECT p.period_id,
376 	        greatest(p_start_date, p.start_date) start_date,
377 	        Decode(p_end_date, NULL, p.end_date, Least(p_end_date, p.end_date)) end_date
378 	   FROM cn_srp_intel_periods p
379 	  WHERE p.salesrep_id = p_salesrep_id
380 	    AND (p_end_date IS NULL OR p.start_date <= p_end_date)
381 	    AND (p.end_date >= p_start_date);
382 
383        --- get the reps who belong to the group
384      CURSOR srp_group_team_csr (p_salesrep_id NUMBER, p_group_id NUMBER, p_start_date DATE, p_end_date DATE)IS
385          select distinct ct.name name,
386                 ct.comp_team_id team_id,
387                 greatest(p_start_date, cg.start_date_active, ct.start_date_active) start_date,
388                 Least(nvl(ct.end_date_active, l_max_date), nvl(cg.end_date_active, l_max_date), nvl(p_end_date, l_max_date)) end_date
389          from cn_srp_comp_teams_v srt, cn_comp_teams ct, cn_srp_comp_groups_v cg
390          where (p_salesrep_id IS NULL or srt.salesrep_id = p_salesrep_id)
391            and (p_salesrep_id IS NULL or cg.salesrep_id = p_salesrep_id)
392            and cg.comp_group_id = p_group_id
393            and srt.comp_team_id = ct.comp_team_id
394            and (cg.start_date_active <= ct.start_date_active
395              or cg.start_date_active between ct.start_date_active and nvl (ct.end_date_active, cg.start_date_active))
396            and nvl(cg.end_date_active, ct.start_date_active) >= ct.start_date_active
397            and (cg.end_date_active IS NULL OR p_start_date <= cg.end_date_active)
398   	       and (p_end_date IS NULL OR p_end_date >= cg.start_date_active);
399 
400      CURSOR get_orgs is
401 	SELECT org_id FROM cn_repositories_all WHERE status = 'A';
402   BEGIN
403      p_return_code := fnd_api.g_ret_sts_success;
404 
405      IF fnd_profile.value('CN_MARK_EVENTS') <> 'Y' THEN
406 	RETURN;
407      END IF;
408 
409      -- store MOAC session info in local variables
410      l_orig_org_id   := mo_global.get_current_org_id;
411      l_orig_acc_mode := mo_global.get_access_mode;
412 
413       -- loop through orgs
414      FOR o IN get_orgs LOOP
415         mo_global.set_policy_context('S', o.org_id);
416 
417 	OPEN group_info;
418 	FETCH group_info INTO l_start_date, l_end_date, l_group_id;
419 	IF (group_info%notfound) THEN
420 	   CLOSE group_info;
421 	ELSE
422 	   CLOSE group_info;
423 
424 	   OPEN group_name;
425 	   FETCH group_name INTO l_group_name;
426 	   IF (group_name%notfound) THEN
427 	      CLOSE group_name;
428 	    ELSE
429 	      CLOSE group_name;
430 
431 	      cn_mark_events_pkg.log_event
432 		( p_event_name      => 'CHANGE_CP_HIER_DELETE',
433 		  p_object_name     => l_group_name,
434 		  p_object_id       => l_group_id,
435 		  p_start_date      => NULL,
436 		  p_start_date_old  => l_start_date,
437 		  p_end_date        => NULL,
438 		  p_end_date_old    => l_end_date,
439 		  x_event_log_id    => l_event_log_id,
440 		  p_org_id          => o.org_id);
441 
442 	      cn_mark_events_pkg.mark_notify_salesreps
443 		( p_salesrep_id        => NULL,
444 		  p_comp_group_id      => l_group_id,
445 		  p_period_id          => null,
446 		  p_start_date         => l_start_date,
447 		  p_end_date           => l_end_date,
448 		  p_revert_to_state    => 'NCALC',
449 		  p_action             => 'DELETE_ROLL_PULL',
450 		  p_action_link_id     => NULL,
451 		  p_base_salesrep_id   => NULL,
452 		  p_base_comp_group_id => NULL,
453 		  p_event_log_id       => l_event_log_id,
454 		  x_action_link_id     => p_action_link_id,
455 		  p_org_id             => o.org_id);
456 
457 	      -- check if this rep belongs to a team
458 	      FOR srp_gp_tm_rec IN srp_group_team_csr (NULL, l_group_id, l_start_date, l_end_date) LOOP
459 
460 		 if srp_gp_tm_rec.end_date = l_max_date then
461 		    srp_gp_tm_rec.end_date := null;
462 		 end if;
463 
464 		 cn_mark_events_pkg.mark_notify_team
465 		   (P_TEAM_ID              => srp_gp_tm_rec.team_id ,
466 		    P_TEAM_EVENT_NAME      => 'CHANGE_TEAM_DEL_REP',
467 		    P_TEAM_NAME            => srp_gp_tm_rec.name,
468 		    P_START_DATE_ACTIVE    => srp_gp_tm_rec.start_date,
469 		    P_END_DATE_ACTIVE      => srp_gp_tm_rec.end_date,
470 		    P_EVENT_LOG_ID         => l_event_log_id,
471 		    p_org_id               => o.org_id);
472 	      END LOOP;
473 
474 	      -- find the ancestors of the group identified by p_group_id and call mark_notify for all of them
475 	      -- not that we use l_start_date and l_end_date since this date range is the super range which covers
476 	      -- the date effectivity of all the salesreps in this group.
477 	      l_srp.group_id    := l_group_id;
478 	      l_srp.start_date  := l_start_date;
479 	      l_srp.end_date    := l_end_date;
480 
481 	      cn_rollup_pvt.get_ancestor_salesrep
482 		( p_api_version         => 1.0,
483 		  p_init_msg_list       => FND_API.G_false,
484 		  p_commit              => FND_API.G_false,
485 		  p_validation_level    => FND_API.G_VALID_LEVEL_FULL,
486 		  x_return_status       => l_return_status,
487 		  x_msg_count           => l_msg_count,
488 		  x_msg_data            => l_msg_data,
489 		  p_srp                 => l_srp,
490 		  p_org_id              => o.org_id,
491 		  x_srp                 => l_srp_tbl);
492 
493 	      IF (l_srp_tbl.COUNT > 0) THEN
494 		 FOR i IN l_srp_tbl.first..l_srp_tbl.last LOOP
495 		    FOR prd IN periods(l_srp_tbl(i).salesrep_id, l_srp_tbl(i).start_date, l_srp_tbl(i).end_date) LOOP
496 		       cn_mark_events_pkg.mark_notify_salesreps
497 			 ( p_salesrep_id        => l_srp_tbl(i).salesrep_id,
498 			   p_comp_group_id      => l_srp_tbl(i).group_id,
499 			   p_period_id          => prd.period_id,
500 			   p_start_date         => prd.start_date,
501 			   p_end_date           => prd.end_date,
502 			   p_revert_to_state    => 'CALC',
503 			   p_action             => NULL,
504 			   p_action_link_id     => p_action_link_id,
505 			   p_base_salesrep_id   => NULL,
506 			   p_base_comp_group_id => NULL,
507 			   p_event_log_id       => l_event_log_id,
508 			   x_action_link_id     => l_action_link_id,
509 			   p_org_id             => o.org_id);
510 		    END LOOP;
511 
512 		    -- check if this rep belongs to a team
513 		    FOR srp_gp_tm_rec IN srp_group_team_csr (l_srp_tbl(i).salesrep_id, l_srp_tbl(i).group_id, l_srp_tbl(i).start_date, l_srp_tbl(i).end_date) LOOP
514 
515 		       if srp_gp_tm_rec.end_date = l_max_date then
516 			  srp_gp_tm_rec.end_date := null;
517 		       end if;
518 
519 		       cn_mark_events_pkg.mark_notify_team
520 			 (P_TEAM_ID              => srp_gp_tm_rec.team_id ,
521 			  P_TEAM_EVENT_NAME      => 'CHANGE_TEAM_DEL_REP',
522 			  P_TEAM_NAME            => srp_gp_tm_rec.name,
523 			  P_START_DATE_ACTIVE    => srp_gp_tm_rec.start_date,
524 			  P_END_DATE_ACTIVE      => srp_gp_tm_rec.end_date,
525 			  P_EVENT_LOG_ID         => l_event_log_id,
526 			  p_org_id               => o.org_id);
527 		    END LOOP;
528 		 END LOOP;
529 	      END IF;
530 	      l_srp_tbl.DELETE;
531 	   END IF; -- group_name found
532 	END IF; -- group_info found
533      END LOOP; -- orgs
534 
535      -- restore context
536      restore_context(l_orig_acc_mode, l_orig_org_id);
537 
538   EXCEPTION
539      WHEN OTHERS THEN
540 	p_return_code := fnd_api.g_ret_sts_unexp_error;
541 	restore_context(l_orig_acc_mode, l_orig_org_id);
542 	IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
543 	  THEN
544 	   FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME ,l_api_name );
545 	END IF;
546 	FND_MSG_PUB.count_and_get
547 	  (
548 	   p_count   =>  p_count ,
549 	   p_data    =>  p_data  ,
550 	   p_encoded => FND_API.g_false
551 	   );
552   END delete_res_group_relate_pre;
553 
554   PROCEDURE  create_res_group_relate_post
555   (P_GROUP_RELATE_ID      IN   JTF_RS_GRP_RELATIONS.GROUP_RELATE_ID%TYPE,
556    P_GROUP_ID             IN   JTF_RS_GROUPS_B.GROUP_ID%TYPE,
557    P_RELATED_GROUP_ID     IN   JTF_RS_GRP_RELATIONS.RELATED_GROUP_ID%TYPE,
558    P_RELATION_TYPE        IN   JTF_RS_GRP_RELATIONS.RELATION_TYPE%TYPE,
559    P_START_DATE_ACTIVE    IN   JTF_RS_GRP_RELATIONS.START_DATE_ACTIVE%TYPE,
560    P_END_DATE_ACTIVE      IN   JTF_RS_GRP_RELATIONS.END_DATE_ACTIVE%TYPE   DEFAULT  NULL,
561    P_DATA                 OUT  NOCOPY VARCHAR2,
562    P_COUNT                OUT  NOCOPY NUMBER,
563    P_RETURN_CODE          OUT  NOCOPY VARCHAR2
564    ) IS
565       l_event_log_id      NUMBER;
566       l_start_date        DATE;
567       l_end_date          DATE;
568       l_group_name        VARCHAR2(60);
569       l_action_link_id    NUMBER;
570       p_action_link_id    NUMBER;
571       l_srp               cn_rollup_pvt.srp_group_rec_type;
572       l_srp_tbl           cn_rollup_pvt.srp_group_tbl_type;
573       l_return_status     VARCHAR2(30);
574       l_msg_count         NUMBER;
575       l_msg_data          VARCHAR2(256);
576       l_dummy             NUMBER;
577       l_api_name          VARCHAR2(30) := 'create_res_group_relate_post';
578       -- clku fix max date
579       l_max_date CONSTANT DATE  := to_date('31-12-9999','DD-MM-YYYY');
580 
581       l_orig_org_id       NUMBER;
582       l_orig_acc_mode     VARCHAR2(1);
583 
584       -- cursor to get the usage code of the group identified by p_group_id.
585       -- Do we need to make sure that the related group is also used by OSC ???
586       CURSOR usage IS
587 	 SELECT 1
588 	   FROM jtf_rs_group_usages
589 	   WHERE group_id = p_group_id AND usage = 'SALES_COMP';
590 
591       -- cursor to get the name of the group identified by p_group_id
592       CURSOR group_name IS
593 	 SELECT name
594 	   FROM cn_comp_groups
595 	  WHERE comp_group_id = p_group_id;
596 
597       -- cursor to find all periods in the date range for each srp
598       CURSOR periods(p_salesrep_id NUMBER, p_start_date DATE, p_end_date DATE) IS
599 	 SELECT p.period_id,
600 	        greatest(p_start_date, p.start_date) start_date,
601 	        Decode(p_end_date, NULL, p.end_date, Least(p_end_date, p.end_date)) end_date
602 	   FROM cn_srp_intel_periods p
603 	  WHERE p.salesrep_id = p_salesrep_id
604 	    AND (p_end_date IS NULL OR p.start_date <= p_end_date)
605 	    AND (p.end_date >= p_start_date);
606 
607       --- get the reps who belong to the group
608      CURSOR srp_group_team_csr (p_salesrep_id NUMBER, p_group_id NUMBER, p_start_date DATE, p_end_date DATE)IS
609          select distinct ct.name name,
610                 ct.comp_team_id team_id,
611                 greatest(p_start_date, cg.start_date_active, ct.start_date_active) start_date,
612                 least(nvl(ct.end_date_active, l_max_date), nvl(cg.end_date_active, l_max_date), nvl(p_end_date, l_max_date)) end_date
613          from cn_srp_comp_teams_v srt, cn_comp_teams ct, cn_srp_comp_groups_v cg
614          where srt.salesrep_id = p_salesrep_id
615            and cg.salesrep_id = p_salesrep_id
616            and cg.comp_group_id = p_group_id
617            and srt.comp_team_id = ct.comp_team_id
618            and (cg.start_date_active <= ct.start_date_active
619              or cg.start_date_active between ct.start_date_active and nvl (ct.end_date_active, cg.start_date_active))
620            and nvl(cg.end_date_active, ct.start_date_active) >= ct.start_date_active
621            and (cg.end_date_active IS NULL OR p_start_date <= cg.end_date_active)
622   	       and (p_end_date IS NULL OR p_end_date >= cg.start_date_active);
623 
624      CURSOR get_orgs is
625 	SELECT org_id FROM cn_repositories_all WHERE status = 'A';
626   BEGIN
627      p_return_code := fnd_api.g_ret_sts_success;
628 
629      IF fnd_profile.value('CN_MARK_EVENTS') <> 'Y' THEN
630 	RETURN;
631      END IF;
632 
633      -- store MOAC session info in local variables
634      l_orig_org_id   := mo_global.get_current_org_id;
635      l_orig_acc_mode := mo_global.get_access_mode;
636 
637      -- loop through orgs
638      FOR o IN get_orgs LOOP
639         mo_global.set_policy_context('S', o.org_id);
640 
641 	OPEN usage;
642 	FETCH usage INTO l_dummy;
643 	IF (usage%notfound) THEN
644 	   CLOSE usage;
645 	 ELSE
646 	   CLOSE usage;
647 
648 	   OPEN group_name;
649 	   FETCH group_name INTO l_group_name;
650 	   IF (group_name%notfound) THEN
651 	      CLOSE group_name;
652 	    ELSE
653 	      CLOSE group_name;
654 
655 	      cn_mark_events_pkg.log_event
656 		( p_event_name      => 'CHANGE_CP_HIER_ADD',
657 		  p_object_name     => l_group_name,
658 		  p_object_id       => p_group_id,
659 		  p_start_date      => p_start_date_active,
660 		  p_start_date_old  => NULL,
661 		  p_end_date        => p_end_date_active,
662 		  p_end_date_old    => NULL,
663 		  x_event_log_id    => l_event_log_id,
664 		  p_org_id          => o.org_id);
665 
666 	      cn_mark_events_pkg.mark_notify_salesreps
667 		( p_salesrep_id        => NULL,
668 		  p_comp_group_id      => p_group_id,
669 		  p_period_id          => null,
670 		  p_start_date         => p_start_date_active,
671 		  p_end_date           => p_end_date_active,
672 		  p_revert_to_state    => 'NCALC',
673 		  p_action             => 'ROLL_PULL',
674 		  p_action_link_id     => NULL,
675 		  p_base_salesrep_id   => NULL,
676 		  p_base_comp_group_id => NULL,
677 		  p_event_log_id       => l_event_log_id,
678 		  x_action_link_id     => p_action_link_id,
679 		  p_org_id             => o.org_id);
680 
681 	      -- check if this rep belongs to a team
682 	      FOR srp_gp_tm_rec IN srp_group_team_csr (NULL, p_group_id, p_start_date_active, p_end_date_active) LOOP
683 
684 		 if srp_gp_tm_rec.end_date = l_max_date then
685 		    srp_gp_tm_rec.end_date := null;
686 		 end if;
687 
688 		 cn_mark_events_pkg.mark_notify_team
689 		   (P_TEAM_ID              => srp_gp_tm_rec.team_id ,
690 		    P_TEAM_EVENT_NAME      => 'CHANGE_TEAM_ADD_REP',
691 		    P_TEAM_NAME            => srp_gp_tm_rec.name,
692 		    P_START_DATE_ACTIVE    => srp_gp_tm_rec.start_date,
693 		    P_END_DATE_ACTIVE      => srp_gp_tm_rec.end_date,
694 		    P_EVENT_LOG_ID         => l_event_log_id,
695 		    p_org_id               => o.org_id);
696 	      END LOOP;
697 
698 
699 	      -- find the ancestors of the group identifed by p_group_id and call mark_notify for all of them
700 	      -- not that we use l_start_date and l_end_date since this date range is the super range which covers
701 	      -- the date effectivity of all the salesreps in this group.
702 	      l_srp.start_date := p_start_date_active;
703 	      l_srp.end_date := p_end_date_active;
704 	      l_srp.group_id := p_group_id;
705 
706 	      cn_rollup_pvt.get_ancestor_salesrep
707 		( p_api_version         => 1.0,
708 		  p_init_msg_list       => FND_API.G_false,
709 		  p_commit              => FND_API.G_false,
710 		  p_validation_level    => FND_API.G_VALID_LEVEL_FULL,
711 		  x_return_status       => l_return_status,
712 		  x_msg_count           => l_msg_count,
713 		  x_msg_data            => l_msg_data,
714 		  p_srp                 => l_srp,
715 		  p_org_id              => o.org_id,
716 		  x_srp                 => l_srp_tbl);
717 
718 	      IF (l_srp_tbl.COUNT > 0) THEN
719 		 FOR i IN l_srp_tbl.first..l_srp_tbl.last LOOP
720 		    FOR prd IN periods(l_srp_tbl(i).salesrep_id, l_srp_tbl(i).start_date, l_srp_tbl(i).end_date) LOOP
721 		       cn_mark_events_pkg.mark_notify_salesreps
722 			 ( p_salesrep_id        => l_srp_tbl(i).salesrep_id,
723 			   p_comp_group_id      => l_srp_tbl(i).group_id,
724 			   p_period_id          => prd.period_id,
725 			   p_start_date         => prd.start_date,
726 			   p_end_date           => prd.end_date,
727 			   p_revert_to_state    => 'CALC',
728 			   p_action             => NULL,
729 			   p_action_link_id     => p_action_link_id,
730 			   p_base_salesrep_id   => NULL,
731 			   p_base_comp_group_id => NULL,
732 			   p_event_log_id       => l_event_log_id,
733 			   x_action_link_id     => l_action_link_id,
734 			   p_org_id             => o.org_id);
735 		    END LOOP;
736 
737 		    -- check if this rep belongs to a team
738 		    FOR srp_gp_tm_rec IN srp_group_team_csr (l_srp_tbl(i).salesrep_id, l_srp_tbl(i).group_id, l_srp_tbl(i).start_date, l_srp_tbl(i).end_date) LOOP
739 
740 		       if srp_gp_tm_rec.end_date = l_max_date then
741 			  srp_gp_tm_rec.end_date := null;
742 		       end if;
743 
744 		       cn_mark_events_pkg.mark_notify_team
745 			 (P_TEAM_ID              => srp_gp_tm_rec.team_id ,
746 			  P_TEAM_EVENT_NAME      => 'CHANGE_TEAM_ADD_REP',
747 			  P_TEAM_NAME            => srp_gp_tm_rec.name,
748 			  P_START_DATE_ACTIVE    => srp_gp_tm_rec.start_date,
749 			  P_END_DATE_ACTIVE      => srp_gp_tm_rec.end_date,
750 			  P_EVENT_LOG_ID         => l_event_log_id,
751 			  p_org_id               => o.org_id);
752 		    END LOOP;
753 		 END LOOP;
754 	      END IF;
755 	      l_srp_tbl.DELETE;
756 	   END IF; -- group_name found
757 	END IF; -- usage found
758      END LOOP; -- orgs
759 
760       -- restore context
761      restore_context(l_orig_acc_mode, l_orig_org_id);
762 
763   EXCEPTION
764      WHEN OTHERS THEN
765 	p_return_code := fnd_api.g_ret_sts_unexp_error;
766 	restore_context(l_orig_acc_mode, l_orig_org_id);
767 	IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
768 	  THEN
769 	   FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME ,l_api_name );
770 	END IF;
771 	FND_MSG_PUB.count_and_get
772 	  (
773 	   p_count   =>  p_count ,
774 	   p_data    =>  p_data  ,
775 	   p_encoded => FND_API.g_false
776 	   );
777   END create_res_group_relate_post;
778 
779 
780   PROCEDURE  update_res_group_relate_post
781   (P_GROUP_RELATE_ID      IN   JTF_RS_GRP_RELATIONS.GROUP_RELATE_ID%TYPE,
782    P_START_DATE_ACTIVE    IN   JTF_RS_GRP_RELATIONS.START_DATE_ACTIVE%TYPE   DEFAULT  FND_API.G_MISS_DATE,
783    P_END_DATE_ACTIVE      IN   JTF_RS_GRP_RELATIONS.END_DATE_ACTIVE%TYPE   DEFAULT  FND_API.G_MISS_DATE,
784    P_OBJECT_VERSION_NUM   IN   JTF_RS_GRP_RELATIONS.OBJECT_VERSION_NUMBER%TYPE,
785    P_DATA                 OUT  NOCOPY VARCHAR2,
786    P_COUNT                OUT  NOCOPY NUMBER,
787    P_RETURN_CODE          OUT  NOCOPY VARCHAR2
788    ) IS
789       l_start_date        DATE;
790       l_end_date          DATE;
791       l_action_link_id    NUMBER;
792       p_action_link_id    NUMBER;
793       l_srp               cn_rollup_pvt.srp_group_rec_type;
794       l_srp_tbl           cn_rollup_pvt.srp_group_tbl_type;
795       l_return_status     VARCHAR2(30);
796       l_msg_count         NUMBER;
797       l_msg_data          VARCHAR2(256);
798       l_api_name          VARCHAR2(30) := 'update_res_group_relate_post';
799       -- clku , fix max date
800       l_max_date    CONSTANT DATE  := to_date('31-12-9999','DD-MM-YYYY');
801       l_orig_org_id       NUMBER;
802       l_orig_acc_mode     VARCHAR2(1);
803 
804 
805       -- cursor to find all periods in the date range for each srp
806       CURSOR periods(p_salesrep_id NUMBER, p_start_date DATE, p_end_date DATE) IS
807 	 SELECT p.period_id,
808 	        greatest(p_start_date, p.start_date) start_date,
809 	        Decode(p_end_date, NULL, p.end_date, Least(p_end_date, p.end_date)) end_date
810 	   FROM cn_srp_intel_periods p
811 	  WHERE p.salesrep_id = p_salesrep_id
812 	    AND (p_end_date IS NULL OR p.start_date <= p_end_date)
813 	    AND (p.end_date >= p_start_date);
814 
815       --- get the reps who belong to the group
816      CURSOR srp_group_team_csr (p_salesrep_id NUMBER, p_group_id NUMBER, p_start_date DATE, p_end_date DATE)IS
817          select distinct ct.name name,
818                 ct.comp_team_id team_id,
819                 greatest(p_start_date, cg.start_date_active, ct.start_date_active) start_date,
820                 Least(nvl(ct.end_date_active, l_max_date), nvl(cg.end_date_active, l_max_date), nvl(p_end_date, l_max_date) ) end_date
821          from cn_srp_comp_teams_v srt, cn_comp_teams ct, cn_srp_comp_groups_v cg
822          where srt.salesrep_id = p_salesrep_id
823            and cg.salesrep_id = p_salesrep_id
824            and cg.comp_group_id = p_group_id
825            and srt.comp_team_id = ct.comp_team_id
826            and (cg.start_date_active <= ct.start_date_active
827              or cg.start_date_active between ct.start_date_active and nvl (ct.end_date_active, cg.start_date_active))
828            and nvl(cg.end_date_active, ct.start_date_active) >= ct.start_date_active
829            and (cg.end_date_active IS NULL OR p_start_date <= cg.end_date_active)
830   	       and (p_end_date IS NULL OR p_end_date >= cg.start_date_active);
831 
832      CURSOR get_orgs IS
833 	SELECT org_id FROM cn_repositories_all WHERE status = 'A';
834   BEGIN
835      p_return_code := fnd_api.g_ret_sts_success;
836 
837      IF fnd_profile.value('CN_MARK_EVENTS') <> 'Y' THEN
838 	RETURN;
839      END IF;
840 
841      IF (g_group_id IS NULL) THEN
842 	RETURN;
843      END IF;
844 
845      -- store MOAC session info in local variables
846      l_orig_org_id   := mo_global.get_current_org_id;
847      l_orig_acc_mode := mo_global.get_access_mode;
848 
849      -- loop through orgs
850      FOR o IN get_orgs LOOP
851         mo_global.set_policy_context('S', o.org_id);
852 
853 	cn_mark_events_pkg.mark_notify_salesreps
854 	  ( p_salesrep_id        => NULL,
855 	    p_comp_group_id      => g_group_id,
856 	    p_period_id          => null,
857 	    p_start_date         => p_start_date_active,
858 	    p_end_date           => p_end_date_active,
859 	    p_revert_to_state    => 'NCALC',
860 	    p_action             => 'ROLL_PULL',
861 	    p_action_link_id     => NULL,
862 	    p_base_salesrep_id   => NULL,
863 	    p_base_comp_group_id => NULL,
864 	    p_event_log_id       => g_event_log_id,
865 	    x_action_link_id     => p_action_link_id,
866 	    p_org_id             => o.org_id);
867 
868 	l_srp.group_id := g_group_id;
869 	-- insert the period(p_start_date_active, g_start_date_old) which becomes active
870 	IF (p_start_date_active < g_start_date_old) THEN
871 	   IF (p_end_date_active IS NOT NULL AND p_end_date_active < g_start_date_old) THEN
872 	      l_end_date := p_end_date_active;
873 	    ELSE
874 	      l_end_date := g_start_date_old - 1;
875 	   END IF;
876 
877 	   l_srp.start_date := p_start_date_active;
878 	   l_srp.end_date := l_end_date;
879 
880 	   cn_rollup_pvt.get_ancestor_salesrep
881 	     ( p_api_version         => 1.0,
882 	       p_init_msg_list       => FND_API.G_false,
883 	       p_commit              => FND_API.G_false,
884 	       p_validation_level    => FND_API.G_VALID_LEVEL_FULL,
885 	       x_return_status       => l_return_status,
886 	       x_msg_count           => l_msg_count,
887 	       x_msg_data            => l_msg_data,
888 	       p_srp                 => l_srp,
889 	       p_org_id              => o.org_id,
890 	       x_srp                 => l_srp_tbl);
891 
892 	   IF (l_srp_tbl.COUNT > 0) THEN
893 	      FOR i IN l_srp_tbl.first..l_srp_tbl.last LOOP
894 		 FOR prd IN periods(l_srp_tbl(i).salesrep_id, l_srp_tbl(i).start_date, l_srp_tbl(i).end_date) LOOP
895 		    cn_mark_events_pkg.mark_notify_salesreps
896 		      ( p_salesrep_id        => l_srp_tbl(i).salesrep_id,
897 			p_comp_group_id      => l_srp_tbl(i).group_id,
898 			p_period_id          => prd.period_id,
899 			p_start_date         => prd.start_date,
900 			p_end_date           => prd.end_date,
901 			p_revert_to_state    => 'CALC',
902 			p_action             => NULL,
903 			p_action_link_id     => p_action_link_id,
904 			p_base_salesrep_id   => NULL,
905 			p_base_comp_group_id => NULL,
906 			p_event_log_id       => g_event_log_id,
907 			x_action_link_id     => l_action_link_id,
908 			p_org_id             => o.org_id);
909 		 END LOOP;
910 
911 		 -- check if this rep belongs to a team
912 		 FOR srp_gp_tm_rec IN srp_group_team_csr (l_srp_tbl(i).salesrep_id, l_srp_tbl(i).group_id, l_srp_tbl(i).start_date, l_srp_tbl(i).end_date) LOOP
913 
914 		    if srp_gp_tm_rec.end_date = l_max_date then
915 		       srp_gp_tm_rec.end_date := null;
916 		    end if;
917 
918 		    cn_mark_events_pkg.mark_notify_team
919 		      (P_TEAM_ID              => srp_gp_tm_rec.team_id ,
920 		       P_TEAM_EVENT_NAME      => 'CHANGE_TEAM_ADD_REP',
921 		       P_TEAM_NAME            => srp_gp_tm_rec.name,
922 		       P_START_DATE_ACTIVE    => srp_gp_tm_rec.start_date,
923 		       P_END_DATE_ACTIVE      => srp_gp_tm_rec.end_date,
924 		       P_EVENT_LOG_ID         => g_event_log_id,
925 		       p_org_id               => o.org_id);
926 		 END LOOP;
927 	      END LOOP;
928 	   END IF;
929 	   l_srp_tbl.DELETE;
930 	END IF;
931 
932 	-- insert the period (l_end_date_old, p_end_date_active) which becomes active.
933 	IF ((p_end_date_active IS NULL AND g_end_date_old IS NOT NULL) OR p_end_date_active > g_end_date_old) THEN
934 	   IF (g_end_date_old < p_start_date_active) THEN
935 	      l_start_date := p_start_date_active;
936 	    ELSE
937 	      l_start_date := g_end_date_old + 1;
938 	   END IF;
939 
940 	   l_srp.start_date := l_start_date;
941 	   l_srp.end_date := p_end_date_active;
942 
943 	   cn_rollup_pvt.get_ancestor_salesrep
944 	     ( p_api_version         => 1.0,
945 	       p_init_msg_list       => FND_API.G_false,
946 	       p_commit              => FND_API.G_false,
947 	       p_validation_level    => FND_API.G_VALID_LEVEL_FULL,
948 	       x_return_status       => l_return_status,
949 	       x_msg_count           => l_msg_count,
950 	       x_msg_data            => l_msg_data,
951 	       p_srp                 => l_srp,
952 	       p_org_id              => o.org_id,
953 	       x_srp                 => l_srp_tbl);
954 
955 	   IF (l_srp_tbl.COUNT > 0) THEN
956 	      FOR i IN l_srp_tbl.first..l_srp_tbl.last LOOP
957 		 FOR prd IN periods(l_srp_tbl(i).salesrep_id, l_srp_tbl(i).start_date, l_srp_tbl(i).end_date) LOOP
958 		    cn_mark_events_pkg.mark_notify_salesreps
959 		      ( p_salesrep_id        => l_srp_tbl(i).salesrep_id,
960 			p_comp_group_id      => l_srp_tbl(i).group_id,
961 			p_period_id          => prd.period_id,
962 			p_start_date         => prd.start_date,
963 			p_end_date           => prd.end_date,
964 			p_revert_to_state    => 'CALC',
965 			p_action             => NULL,
966 			p_action_link_id     => p_action_link_id,
967 			p_base_salesrep_id   => NULL,
968 			p_base_comp_group_id => NULL,
969 			p_event_log_id       => g_event_log_id,
970 			x_action_link_id     => l_action_link_id,
971 			p_org_id             => o.org_id);
972 		 END LOOP;
973 
974 		 -- check if this rep belongs to a team
975 		 FOR srp_gp_tm_rec IN srp_group_team_csr (l_srp_tbl(i).salesrep_id, l_srp_tbl(i).group_id, l_srp_tbl(i).start_date, l_srp_tbl(i).end_date) LOOP
976 
977 		    if srp_gp_tm_rec.end_date = l_max_date then
978 		       srp_gp_tm_rec.end_date := null;
979 		    end if;
980 
981 		    cn_mark_events_pkg.mark_notify_team
982 		      (P_TEAM_ID              => srp_gp_tm_rec.team_id ,
983 		       P_TEAM_EVENT_NAME      => 'CHANGE_TEAM_ADD_REP',
984 		       P_TEAM_NAME            => srp_gp_tm_rec.name,
985 		       P_START_DATE_ACTIVE    => srp_gp_tm_rec.start_date,
986 		       P_END_DATE_ACTIVE      => srp_gp_tm_rec.end_date,
987 		       P_EVENT_LOG_ID         => g_event_log_id,
988 		       p_org_id               => o.org_id);
989 		 END LOOP;
990 	      END LOOP;
991 	   END IF;
992 	   l_srp_tbl.DELETE;
993 	END IF;
994      END LOOP; -- orgs
995 
996      -- restore context
997      restore_context(l_orig_acc_mode, l_orig_org_id);
998 
999   EXCEPTION
1000      WHEN OTHERS THEN
1001 	p_return_code := fnd_api.g_ret_sts_unexp_error;
1002 	restore_context(l_orig_acc_mode, l_orig_org_id);
1003 	IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
1004 	  THEN
1005 	   FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME ,l_api_name );
1006 	END IF;
1007 	FND_MSG_PUB.count_and_get
1008 	  (
1009 	   p_count   =>  p_count ,
1010 	   p_data    =>  p_data  ,
1011 	   p_encoded => FND_API.g_false
1012 	   );
1013   END update_res_group_relate_post;
1014 
1015   PROCEDURE  delete_res_group_relate_post
1016   (P_GROUP_RELATE_ID      IN   JTF_RS_GRP_RELATIONS.GROUP_RELATE_ID%TYPE,
1017    P_OBJECT_VERSION_NUM   IN   JTF_RS_GROUPS_VL.OBJECT_VERSION_NUMBER%TYPE,
1018    P_DATA                 OUT  NOCOPY VARCHAR2,
1019    P_COUNT                OUT  NOCOPY NUMBER,
1020    P_RETURN_CODE          OUT  NOCOPY VARCHAR2
1021    ) IS
1022   BEGIN
1023      p_return_code := fnd_api.g_ret_sts_success;
1024   END delete_res_group_relate_post;
1025 
1026 
1027   FUNCTION Ok_To_Generate_Msg
1028   (P_DATA                   OUT  NOCOPY VARCHAR2,
1029    P_COUNT            OUT  NOCOPY NUMBER,
1030    P_RETURN_CODE            OUT  NOCOPY VARCHAR2)
1031     RETURN BOOLEAN IS
1032   BEGIN
1033      p_return_code := fnd_api.g_ret_sts_success;
1034      RETURN false;
1035   END ok_to_generate_msg;
1036 
1037 END jtf_rs_group_relate_vuhk;