DBA Data[Home] [Help]

PACKAGE BODY: APPS.CN_API

Source


1 PACKAGE BODY CN_API as
2 /* $Header: cnputilb.pls 120.24 2011/09/09 01:00:15 rnagaraj ship $ */
3 
4 
5 
6   TYPE salesrep_cache_rec_type IS RECORD(
7     salesrep_id       NUMBER
8   , period_id         NUMBER
9   , role_name         VARCHAR2(2000)
10   );
11 
12 
13   /**
14    * PLSQL Index By Table Type to contain information about many Resources
15    * where each element is of type RESOURCE_CACHE_REC_TYPE.
16    */
17   TYPE salesrep_cache_tbl_type IS TABLE OF salesrep_cache_rec_type
18     INDEX BY BINARY_INTEGER;
19 
20   g_salesrep_info_cache           salesrep_cache_tbl_type;
21 
22 
23 
24    g_user_tab jtf_number_table;
25 
26 --| ----------------------------------------------------------------------+
27 --|   Procedure Name :  get_fnd_message
28 --| ----------------------------------------------------------------------+
29 PROCEDURE get_fnd_message( p_msg_count NUMBER,
30                            p_msg_data  VARCHAR2)  IS
31 
32      l_msg_count         NUMBER;
33      l_msg_data          VARCHAR2(2000);
34 
35 BEGIN
36    IF (p_msg_count IS NULL) THEN
37       FND_MSG_PUB.Count_And_Get
38   (
39    p_count   =>  l_msg_count ,
40    p_data    =>  l_msg_data   ,
41    p_encoded =>  FND_API.G_FALSE
42    );
43     ELSE
44       l_msg_count := p_msg_count;
45       l_msg_data  := p_msg_data;
46    END IF;
47 
48    IF l_msg_count = 1 THEN
49       cn_message_pkg.debug(substrb(l_msg_data,1,240));
50     ELSIF l_msg_count = 0 THEN
51       cn_message_pkg.debug('No Message');
52     ELSE
53       FOR ctr IN 1..l_msg_count LOOP
54          cn_message_pkg.debug
55      (substrb((FND_MSG_PUB.get
56          (p_msg_index => ctr, p_encoded   => FND_API.G_FALSE)),
57         1,
58         240)
59       );
60       END LOOP ;
61    END IF;
62 
63    cn_message_pkg.flush;
64 
65    FND_MSG_PUB.initialize;
66 
67 END get_fnd_message;
68 
69 --| ----------------------------------------------------------------------+
70 --|   Function Name :  get_rate_table_name
71 --| ----------------------------------------------------------------------+
72 FUNCTION  get_rate_table_name( p_rate_table_id  NUMBER)
73   RETURN cn_rate_schedules.name%TYPE IS
74 
75    l_rs_name      cn_rate_schedules.name%TYPE;
76 
77 BEGIN
78    SELECT name INTO l_rs_name
79      FROM cn_rate_schedules_all
80      WHERE rate_schedule_id = p_rate_table_id;
81 
82    RETURN l_rs_name;
83 
84 EXCEPTION
85    WHEN no_data_found THEN
86       RETURN NULL;
87 END get_rate_table_name;
88 
89 --| ----------------------------------------------------------------------+
90 --|   Function Name :  get_rate_table_id
91 --| ----------------------------------------------------------------------+
92 FUNCTION  get_rate_table_id( p_rate_table_name  VARCHAR2,
93                              p_org_id NUMBER)
94   RETURN cn_rate_schedules.rate_schedule_id%TYPE IS
95 
96    l_rs_id      cn_rate_schedules.rate_schedule_id%TYPE;
97 
98 BEGIN
99    SELECT rate_schedule_id INTO l_rs_id
100      FROM cn_rate_schedules_all
101      WHERE name = p_rate_table_name
102        AND org_id = p_org_id;
103 
104    RETURN l_rs_id;
105 
106 EXCEPTION
107    WHEN no_data_found THEN
108       RETURN NULL;
109 END get_rate_table_id;
110 
111 
112 --| ----------------------------------------------------------------------+
113 --|   Function Name :  get_period_name  -- only get active periods
114 --| ----------------------------------------------------------------------+
115 FUNCTION  get_period_name( p_period_id  NUMBER, p_org_id NUMBER)
116   RETURN cn_periods.period_name%TYPE IS
117 
118   l_period_name cn_periods.period_name%TYPE;
119 
120 BEGIN
121    SELECT period_name
122      INTO l_period_name
123      FROM cn_period_statuses_all
124      WHERE period_id = p_period_id
125      AND org_id = p_org_id
126      AND period_status IN ('F', 'O');
127 
128    RETURN l_period_name;
129 
130 EXCEPTION
131    WHEN no_data_found THEN
132       RETURN NULL;
133 END get_period_name;
134 
135 --| ----------------------------------------------------------------------+
136 --|   Function Name :  get_period_id -- only get active periods
137 --| ----------------------------------------------------------------------+
138 FUNCTION  get_period_id( p_period_name  VARCHAR2, p_org_id NUMBER)
139   RETURN cn_periods.period_id%TYPE IS
140 
141   l_period_id cn_periods.period_id%TYPE;
142 
143 BEGIN
144    SELECT period_id
145      INTO l_period_id
146      FROM cn_period_statuses_all
147      WHERE Upper(period_name) = Upper(p_period_name)
148      AND org_id = p_org_id
149      AND period_status IN ('F', 'O');
150 
151    RETURN l_period_id;
152 
153 EXCEPTION
154    WHEN no_data_found THEN
155       RETURN NULL;
156 END get_period_id;
157 
158 --| ---------------------------------------------------------------------+
159 --| Function Name :  get_rev_class_id
160 --| Desc : Pass in revenue class name then return revenue class id
161 --| ---------------------------------------------------------------------+
162 FUNCTION  get_rev_class_id( p_rev_class_name  VARCHAR2, p_org_id NUMBER)
163   RETURN cn_revenue_classes.revenue_class_id%TYPE IS
164 
165      l_rev_class_id cn_revenue_classes.revenue_class_id%TYPE;
166 
167 BEGIN
168    SELECT revenue_class_id
169      INTO l_rev_class_id
170      FROM cn_revenue_classes_all
171      WHERE name = p_rev_class_name
172      AND org_id = p_org_id
173      ;
174    RETURN l_rev_class_id;
175 EXCEPTION
176    WHEN no_data_found THEN
177       RETURN NULL;
178 END get_rev_class_id;
179 
180 --| -----------------------------------------------------------------------+
181 --| Function Name :  get_rev_class_name
182 --| Desc : Pass in revenue class name then return revenue class id
183 --| ---------------------------------------------------------------------+
184 FUNCTION  get_rev_class_name( p_rev_class_id  NUMBER)
185   RETURN cn_revenue_classes.name%TYPE IS
186 
187      l_rev_class_name cn_revenue_classes.name%TYPE;
188 
189 BEGIN
190    SELECT name
191      INTO l_rev_class_name
192      FROM cn_revenue_classes_all
193      WHERE revenue_class_id = p_rev_class_id
194      ;
195    RETURN l_rev_class_name;
196 EXCEPTION
197    WHEN no_data_found THEN
198       RETURN NULL;
199 END get_rev_class_name;
200 
201 --| ---------------------------------------------------------------------+
202 --|   Function Name :  get_lkup_meaning
203 --| ---------------------------------------------------------------------+
204 FUNCTION  get_lkup_meaning( p_lkup_code VARCHAR2,
205           p_lkup_type VARCHAR2 )
206   RETURN cn_lookups.meaning%TYPE IS
207 
208   l_meaning cn_lookups.meaning%TYPE;
209 
210 BEGIN
211      SELECT meaning
212        INTO l_meaning
213        FROM cn_lookups
214        WHERE lookup_type = p_lkup_type
215        AND   lookup_code = p_lkup_code
216        ;
217 
218      RETURN l_meaning;
219 
220 EXCEPTION
221    WHEN no_data_found THEN
222       RETURN NULL;
223 END get_lkup_meaning;
224 
225 --| ---------------------------------------------------------------------+
226 --|   Procedure Name :  chk_miss_char_para
227 --|   Desc : Check for missing parameters -- Char type
228 --| ---------------------------------------------------------------------+
229 FUNCTION chk_miss_char_para
230   ( p_char_para  IN VARCHAR2 ,
231     p_para_name  IN VARCHAR2 ,
232     p_loading_status IN VARCHAR2 ,
233     x_loading_status OUT NOCOPY VARCHAR2 )
234   RETURN VARCHAR2 IS
235 
236      l_return_code VARCHAR2(1);
237 
238 BEGIN
239    l_return_code := FND_API.G_FALSE;
240    x_loading_status := p_loading_status;
241    IF (p_char_para = FND_API.G_MISS_CHAR) THEN
242      FND_MESSAGE.SET_NAME ('CN' , 'CN_MISS_PARAMETER');
243      FND_MESSAGE.SET_TOKEN('PARA_NAME',p_para_name);
244      if (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
245        FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR,
246                        'cn.plsql.cn_api.chk_miss_char_para.error',
247 	       		       true);
248      end if;
249 
250      -- Error, check the msg level and add an error message to the
251      -- API message list
252      IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
253        FND_MESSAGE.SET_NAME ('CN' , 'CN_MISS_PARAMETER');
254        FND_MESSAGE.SET_TOKEN('PARA_NAME',p_para_name);
255        FND_MSG_PUB.Add;
256      END IF;
257      x_loading_status := 'CN_MISS_PARAMETER';
258      l_return_code := FND_API.G_TRUE;
259    END IF;
260 
261    RETURN l_return_code;
262 
263 END chk_miss_char_para;
264 
265 --| ---------------------------------------------------------------------+
266 --|   Function Name :  chk_miss_num_para
267 --|   Desc : Check for missing parameters -- Number type
268 --| ---------------------------------------------------------------------+
269 FUNCTION chk_miss_num_para
270   ( p_num_para  IN NUMBER ,
271     p_para_name  IN VARCHAR2 ,
272     p_loading_status IN VARCHAR2 ,
273     x_loading_status OUT NOCOPY VARCHAR2 )
274   RETURN VARCHAR2 IS
275      l_return_code VARCHAR2(1);
276 BEGIN
277    l_return_code := FND_API.G_FALSE;
278    x_loading_status := p_loading_status;
279    IF (p_num_para = FND_API.G_MISS_NUM) THEN
280      FND_MESSAGE.SET_NAME ('CN' , 'CN_MISS_PARAMETER');
281      FND_MESSAGE.SET_TOKEN('PARA_NAME',p_para_name);
282      if (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
283        FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR,
284                        'cn.plsql.cn_api.chk_miss_num_para.error',
285 	       		       true);
286      end if;
287 
288      -- Error, check the msg level and add an error message to the
289      -- API message list
290      IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
291        FND_MESSAGE.SET_NAME ('CN' , 'CN_MISS_PARAMETER');
292        FND_MESSAGE.SET_TOKEN('PARA_NAME',p_para_name);
293        FND_MSG_PUB.Add;
294      END IF;
295      x_loading_status := 'CN_MISS_PARAMETER';
296      l_return_code := FND_API.G_TRUE;
297    END IF;
298    RETURN l_return_code;
299 END chk_miss_num_para;
300 
301 --| ---------------------------------------------------------------------+
302 --|   Procedure Name :  chk_miss_date_para
303 --|   Desc : Check for missing parameters -- Date type
304 --| ---------------------------------------------------------------------+
305 FUNCTION chk_miss_date_para
306   ( p_date_para  IN DATE ,
307     p_para_name  IN VARCHAR2 ,
308     p_loading_status IN VARCHAR2 ,
309     x_loading_status OUT NOCOPY VARCHAR2 )
310   RETURN VARCHAR2 IS
311 
312      l_return_code VARCHAR2(1);
313 
314 BEGIN
315    l_return_code := FND_API.G_FALSE;
316    x_loading_status := p_loading_status;
317    IF (p_date_para = FND_API.G_MISS_DATE) THEN
318      FND_MESSAGE.SET_NAME ('CN' , 'CN_MISS_PARAMETER');
319      FND_MESSAGE.SET_TOKEN('PARA_NAME',p_para_name);
320      if (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
321        FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR,
322                        'cn.plsql.cn_api.chk_miss_date_para.error',
323 	       		       true);
324      end if;
325 
326      -- Error, check the msg level and add an error message to the
327      -- API message list
328      IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
329        FND_MESSAGE.SET_NAME ('CN' , 'CN_MISS_PARAMETER');
330        FND_MESSAGE.SET_TOKEN('PARA_NAME',p_para_name);
331        FND_MSG_PUB.Add;
332      END IF;
333      x_loading_status := 'CN_MISS_PARAMETER';
334      l_return_code := FND_API.G_TRUE;
335    END IF;
336 
337    RETURN l_return_code;
338 
339 END chk_miss_date_para;
340 
341 --| ---------------------------------------------------------------------+
342 --|   Function Name :  chk_null_num_para
343 --|   Desc : Check for Null parameters -- Number type
344 --| ---------------------------------------------------------------------+
345 FUNCTION chk_null_num_para
346   ( p_num_para  IN NUMBER ,
347     p_obj_name IN VARCHAR2 ,
348     p_loading_status IN VARCHAR2 ,
349     x_loading_status OUT NOCOPY VARCHAR2 )
350   RETURN VARCHAR2 IS
351      l_return_code VARCHAR2(1);
352 BEGIN
353    l_return_code := FND_API.G_FALSE;
354    x_loading_status := p_loading_status;
355    IF (p_num_para IS NULL ) THEN
356      FND_MESSAGE.SET_NAME ('CN' , 'CN_CANNOT_NULL');
357      FND_MESSAGE.SET_TOKEN('OBJ_NAME',p_obj_name);
358      if (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
359        FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR,
360                        'cn.plsql.cn_api.chk_null_num_para.error',
361 	       		       true);
362      end if;
363 
364      -- Error, check the msg level and add an error message to the
365      -- API message list
366      IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
367        FND_MESSAGE.SET_NAME ('CN' , 'CN_CANNOT_NULL');
368        FND_MESSAGE.SET_TOKEN('OBJ_NAME',p_obj_name);
369        FND_MSG_PUB.Add;
370      END IF;
371      x_loading_status := 'CN_CANNOT_NULL';
372      l_return_code := FND_API.G_TRUE;
373    END IF;
374    RETURN l_return_code;
375 END chk_null_num_para;
376 
377 --| ---------------------------------------------------------------------+
378 --|   Function Name :  chk_null_char_para
379 --|   Desc : Check for Null parameters -- Character type
380 --| ---------------------------------------------------------------------+
381 FUNCTION chk_null_char_para
382   ( p_char_para  IN VARCHAR2 ,
383     p_obj_name  IN VARCHAR2 ,
384     p_loading_status IN VARCHAR2 ,
385     x_loading_status OUT NOCOPY VARCHAR2 )
386   RETURN VARCHAR2 IS
387      l_return_code VARCHAR2(1);
388 BEGIN
389    l_return_code := FND_API.G_FALSE;
390    x_loading_status := p_loading_status;
391    IF (p_char_para IS NULL ) THEN
392      Fnd_message.SET_NAME ('CN' , 'CN_CANNOT_NULL');
393      FND_MESSAGE.SET_TOKEN('OBJ_NAME',p_obj_name);
394      if (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
395        FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR,
396                        'cn.plsql.cn_api.chk_null_char_para.error',
397 	       		       true);
398      end if;
399 
400      -- Error, check the msg level and add an error message to the
401      -- API message list
402      IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
403        Fnd_message.SET_NAME ('CN' , 'CN_CANNOT_NULL');
404        FND_MESSAGE.SET_TOKEN('OBJ_NAME',p_obj_name);
405        FND_MSG_PUB.Add;
406      END IF;
407      x_loading_status := 'CN_CANNOT_NULL';
408      l_return_code := FND_API.G_TRUE;
409    END IF;
410    RETURN l_return_code;
411 END chk_null_char_para;
412 
413 --| ---------------------------------------------------------------------+
414 --|   Function Name :  chk_null_date_para
415 --|   Desc : Check for Null parameters -- Date type
416 --| ---------------------------------------------------------------------+
417 FUNCTION chk_null_date_para
418   ( p_date_para IN DATE ,
419     p_obj_name  IN VARCHAR2 ,
420     p_loading_status IN VARCHAR2 ,
421     x_loading_status OUT NOCOPY VARCHAR2 )
422   RETURN VARCHAR2 IS
423      l_return_code VARCHAR2(1);
424 BEGIN
425    l_return_code := FND_API.G_FALSE;
426    x_loading_status := p_loading_status;
427    IF (p_date_para IS NULL ) THEN
428      FND_MESSAGE.SET_NAME ('CN' , 'CN_CANNOT_NULL');
429      FND_MESSAGE.SET_TOKEN('OBJ_NAME',p_obj_name);
430      if (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
431        FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR,
432                        'cn.plsql.cn_api.chk_null_date_para.error',
433 	       		       true);
434      end if;
435 
436      -- Error, check the msg level and add an error message to the
437      -- API message list
438      IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
439        FND_MESSAGE.SET_NAME ('CN' , 'CN_CANNOT_NULL');
440        FND_MESSAGE.SET_TOKEN('OBJ_NAME',p_obj_name);
441        FND_MSG_PUB.Add;
442      END IF;
443      x_loading_status := 'CN_CANNOT_NULL';
444      l_return_code := FND_API.G_TRUE;
445    END IF;
446    RETURN l_return_code;
447 END chk_null_date_para;
448 
449 --| ---------------------------------------------------------------------+
450 --|   Function Name :  chk_miss_null_num_para
451 --|   Desc : Check for Missing or Null parameters -- Number type
452 --| ---------------------------------------------------------------------+
453 FUNCTION chk_miss_null_num_para
454   ( p_num_para  IN NUMBER ,
455     p_obj_name IN VARCHAR2 ,
456     p_loading_status IN VARCHAR2 ,
457     x_loading_status OUT NOCOPY VARCHAR2 )
458   RETURN VARCHAR2 IS
459      l_return_code VARCHAR2(1);
460 BEGIN
461    l_return_code := FND_API.G_FALSE;
462    x_loading_status := p_loading_status;
463    IF ((p_num_para IS NULL) OR (p_num_para = FND_API.G_MISS_NUM)) THEN
464      FND_MESSAGE.SET_NAME ('CN' , 'CN_CANNOT_MISS_OR_NULL');
465      FND_MESSAGE.SET_TOKEN('OBJ_NAME',p_obj_name);
466      if (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
467        FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR,
468                        'cn.plsql.cn_api.chk_miss_null_num_para.error',
469 	       		       true);
470      end if;
471 
472      -- Error, check the msg level and add an error message to the
473      -- API message list
474      IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
475        FND_MESSAGE.SET_NAME ('CN' , 'CN_CANNOT_MISS_OR_NULL');
476        FND_MESSAGE.SET_TOKEN('OBJ_NAME',p_obj_name);
477        FND_MSG_PUB.Add;
478      END IF;
479      x_loading_status := 'CN_CANNOT_MISS_OR_NULL';
480      l_return_code := FND_API.G_TRUE;
481    END IF;
482    RETURN l_return_code;
483 END chk_miss_null_num_para;
484 
485 --| ---------------------------------------------------------------------+
486 --|   Function Name :  chk_miss_null_char_para
487 --|   Desc : Check for Missing or Null parameters -- Character type
488 --| ---------------------------------------------------------------------+
489 FUNCTION chk_miss_null_char_para
490   ( p_char_para  IN VARCHAR2 ,
491     p_obj_name  IN VARCHAR2 ,
492     p_loading_status IN VARCHAR2 ,
493     x_loading_status OUT NOCOPY VARCHAR2 )
494   RETURN VARCHAR2 IS
495      l_return_code VARCHAR2(1);
496 BEGIN
497    l_return_code := FND_API.G_FALSE;
498    x_loading_status := p_loading_status;
499    IF ((p_char_para IS NULL ) OR (p_char_para = FND_API.G_MISS_CHAR)) THEN
500      FND_MESSAGE.SET_NAME ('CN' , 'CN_CANNOT_MISS_OR_NULL');
501      FND_MESSAGE.SET_TOKEN('OBJ_NAME',p_obj_name);
502      if (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
503        FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR,
504                        'cn.plsql.cn_api.chk_miss_null_char_para.error',
505 	       		       true);
506      end if;
507 
508      -- Error, check the msg level and add an error message to the
509      -- API message list
510      IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)  THEN
511        FND_MESSAGE.SET_NAME ('CN' , 'CN_CANNOT_MISS_OR_NULL');
512        FND_MESSAGE.SET_TOKEN('OBJ_NAME',p_obj_name);
513        FND_MSG_PUB.Add;
514      END IF;
515      x_loading_status := 'CN_CANNOT_MISS_OR_NULL';
516      l_return_code := FND_API.G_TRUE;
517    END IF;
518    RETURN l_return_code;
519 END chk_miss_null_char_para;
520 
521 --| ---------------------------------------------------------------------+
522 --|   Function Name :  chk_miss_null_date_para
523 --|   Desc : Check for Missing or Null parameters -- Date type
524 --| ---------------------------------------------------------------------+
525 FUNCTION chk_miss_null_date_para
526   ( p_date_para IN DATE ,
527     p_obj_name  IN VARCHAR2 ,
528     p_loading_status IN VARCHAR2 ,
529     x_loading_status OUT NOCOPY VARCHAR2 )
530   RETURN VARCHAR2 IS
531      l_return_code VARCHAR2(1);
532 BEGIN
533    l_return_code := FND_API.G_FALSE;
534    x_loading_status := p_loading_status;
535    IF ((p_date_para IS NULL ) OR (p_date_para = FND_API.G_MISS_DATE)) THEN
536      FND_MESSAGE.SET_NAME ('CN' , 'CN_CANNOT_MISS_OR_NULL');
537      FND_MESSAGE.SET_TOKEN('OBJ_NAME',p_obj_name);
538      if (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
539        FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR,
540                        'cn.plsql.cn_api.chk_miss_null_date_para.error',
541 	       		       true);
542      end if;
543 
544       -- Error, check the msg level and add an error message to the
545       -- API message list
546       IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
547         THEN
548          FND_MESSAGE.SET_NAME ('CN' , 'CN_CANNOT_MISS_OR_NULL');
549          FND_MESSAGE.SET_TOKEN('OBJ_NAME',p_obj_name);
550    FND_MSG_PUB.Add;
551       END IF;
552       x_loading_status := 'CN_CANNOT_MISS_OR_NULL';
553       l_return_code := FND_API.G_TRUE;
554    END IF;
555    RETURN l_return_code;
556 END chk_miss_null_date_para;
557 
558 --| ---------------------------------------------------------------------+
559 --|   Function Name :  pe_num_field_must_null
560 --|   Desc : Check for Field (Number Type) must be Null
561 --| ---------------------------------------------------------------------+
562 FUNCTION pe_num_field_must_null
563   ( p_num_field  IN NUMBER  ,
564     p_pe_type IN VARCHAR2 ,
565     p_obj_name  IN VARCHAR2 ,
566     p_token1    IN VARCHAR2 ,
567     p_token2    IN VARCHAR2 ,
568     p_token3    IN VARCHAR2 ,
569     p_loading_status IN VARCHAR2 ,
570     x_loading_status OUT NOCOPY VARCHAR2 )
571   RETURN VARCHAR2 IS
572      l_return_code VARCHAR2(1);
573 BEGIN
574    l_return_code := FND_API.G_TRUE;
575    x_loading_status := p_loading_status;
576    IF (p_num_field IS NOT NULL ) THEN
577      FND_MESSAGE.SET_NAME ('CN' , 'CN_PE_FIELD_MUST_NULL');
578      FND_MESSAGE.SET_TOKEN('OBJ_NAME',p_obj_name);
579      FND_MESSAGE.SET_TOKEN('PLAN_TYPE',
580                            get_lkup_meaning(p_pe_type,'QUOTA_TYPE'));
581      FND_MESSAGE.SET_TOKEN('TOKEN1',p_token1);
582      FND_MESSAGE.SET_TOKEN('TOKEN2',p_token2);
583      FND_MESSAGE.SET_TOKEN('TOKEN3',p_token3);
584      if (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
585        FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR,
586                        'cn.plsql.cn_api.pe_num_field_must_null.error',
587 	       		       true);
588      end if;
589 
590       -- Error, check the msg level and add an error message to the
591       -- API message list
592       IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
593         THEN
594          FND_MESSAGE.SET_NAME ('CN' , 'CN_PE_FIELD_MUST_NULL');
595          FND_MESSAGE.SET_TOKEN('OBJ_NAME',p_obj_name);
596    FND_MESSAGE.SET_TOKEN('PLAN_TYPE',
597              get_lkup_meaning(p_pe_type,'QUOTA_TYPE'));
598          FND_MESSAGE.SET_TOKEN('TOKEN1',p_token1);
599    FND_MESSAGE.SET_TOKEN('TOKEN2',p_token2);
600    FND_MESSAGE.SET_TOKEN('TOKEN3',p_token3);
601    FND_MSG_PUB.Add;
602       END IF;
603       x_loading_status := 'CN_PE_FIELD_MUST_NULL';
604       l_return_code := FND_API.G_FALSE;
605    END IF;
606    RETURN l_return_code;
607 END pe_num_field_must_null;
608 
609 --| ---------------------------------------------------------------------+
610 --|   Function Name :  pe_char_field_must_null
611 --|   Desc : Check for Field (Char Type) must be Null
612 --| ---------------------------------------------------------------------+
613 FUNCTION pe_char_field_must_null
614   ( p_char_field  IN VARCHAR2 ,
615     p_pe_type IN VARCHAR2 ,
616     p_obj_name  IN VARCHAR2 ,
617     p_token1    IN VARCHAR2 ,
618     p_token2    IN VARCHAR2 ,
619     p_token3    IN VARCHAR2 ,
620     p_loading_status IN VARCHAR2 ,
621     x_loading_status OUT NOCOPY VARCHAR2 )
622   RETURN VARCHAR2 IS
623      l_return_code VARCHAR2(1);
624 BEGIN
625    l_return_code := FND_API.G_TRUE;
626    x_loading_status := p_loading_status;
627    IF (p_char_field IS NOT NULL ) THEN
628          FND_MESSAGE.SET_NAME ('CN' , 'CN_PE_FIELD_MUST_NULL');
629          FND_MESSAGE.SET_TOKEN('OBJ_NAME',p_obj_name);
630    FND_MESSAGE.SET_TOKEN('PLAN_TYPE',
631              get_lkup_meaning(p_pe_type,'QUOTA_TYPE'));
632          FND_MESSAGE.SET_TOKEN('TOKEN1',p_token1);
633    FND_MESSAGE.SET_TOKEN('TOKEN2',p_token2);
634    FND_MESSAGE.SET_TOKEN('TOKEN3',p_token3);
635 
636      if (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
637        FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR,
638                        'cn.plsql.cn_api.pe_char_field_must_null.error',
639 	       		       true);
640      end if;
641 
642       -- Error, check the msg level and add an error message to the
643       -- API message list
644       IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
645         THEN
646          FND_MESSAGE.SET_NAME ('CN' , 'CN_PE_FIELD_MUST_NULL');
647          FND_MESSAGE.SET_TOKEN('OBJ_NAME',p_obj_name);
648    FND_MESSAGE.SET_TOKEN('PLAN_TYPE',
649              get_lkup_meaning(p_pe_type,'QUOTA_TYPE'));
650          FND_MESSAGE.SET_TOKEN('TOKEN1',p_token1);
651    FND_MESSAGE.SET_TOKEN('TOKEN2',p_token2);
652    FND_MESSAGE.SET_TOKEN('TOKEN3',p_token3);
653    FND_MSG_PUB.Add;
654       END IF;
655       x_loading_status := 'CN_PE_FIELD_MUST_NULL';
656       l_return_code := FND_API.G_FALSE;
657    END IF;
658    RETURN l_return_code;
659 END pe_char_field_must_null;
660 
661 --| ---------------------------------------------------------------------+
662 --|   Function Name :  pe_num_field_cannot_null
663 --|   Desc : Check for Field (Number Type) can not be Null
664 --| ---------------------------------------------------------------------+
665 FUNCTION pe_num_field_cannot_null
666   ( p_num_field  IN NUMBER ,
667     p_pe_type IN VARCHAR2 ,
668     p_obj_name  IN VARCHAR2 ,
669     p_token1    IN VARCHAR2 ,
670     p_token2    IN VARCHAR2 ,
671     p_token3    IN VARCHAR2 ,
672     p_loading_status IN VARCHAR2 ,
673     x_loading_status OUT NOCOPY VARCHAR2 )
674   RETURN VARCHAR2 IS
675      l_return_code VARCHAR2(1);
676 BEGIN
677    l_return_code := FND_API.G_TRUE;
678    x_loading_status := p_loading_status;
679    IF (p_num_field IS NULL ) THEN
680          FND_MESSAGE.SET_NAME ('CN' , 'CN_PE_FIELD_CANNOT_NULL');
681          FND_MESSAGE.SET_TOKEN('OBJ_NAME',p_obj_name);
682    FND_MESSAGE.SET_TOKEN('PLAN_TYPE',
683              get_lkup_meaning(p_pe_type,'QUOTA_TYPE'));
684          FND_MESSAGE.SET_TOKEN('TOKEN1',p_token1);
685    FND_MESSAGE.SET_TOKEN('TOKEN2',p_token2);
686    FND_MESSAGE.SET_TOKEN('TOKEN3',p_token3);
687 
688      if (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
689        FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR,
690                        'cn.plsql.cn_api.pe_num_field_cannot_null.error',
691 	       		       true);
692      end if;
693 
694       -- Error, check the msg level and add an error message to the
695       -- API message list
696       IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
697         THEN
698          FND_MESSAGE.SET_NAME ('CN' , 'CN_PE_FIELD_CANNOT_NULL');
699          FND_MESSAGE.SET_TOKEN('OBJ_NAME',p_obj_name);
700    FND_MESSAGE.SET_TOKEN('PLAN_TYPE',
701              get_lkup_meaning(p_pe_type,'QUOTA_TYPE'));
702          FND_MESSAGE.SET_TOKEN('TOKEN1',p_token1);
703    FND_MESSAGE.SET_TOKEN('TOKEN2',p_token2);
704    FND_MESSAGE.SET_TOKEN('TOKEN3',p_token3);
705    FND_MSG_PUB.Add;
706       END IF;
707       x_loading_status := 'CN_PE_FIELD_CANNOT_NULL';
708       l_return_code := FND_API.G_FALSE;
709    END IF;
710    RETURN l_return_code;
711 END pe_num_field_cannot_null;
712 
713 --| ---------------------------------------------------------------------+
714 --|   Function Name :  pe_char_field_cannot_null
715 --|   Desc : Check for Field (Char Type) can not be Null
716 --| ---------------------------------------------------------------------+
717 FUNCTION pe_char_field_cannot_null
718   ( p_char_field  IN VARCHAR2 ,
719     p_pe_type IN VARCHAR2 ,
720     p_obj_name  IN VARCHAR2 ,
721     p_token1    IN VARCHAR2 ,
722     p_token2    IN VARCHAR2 ,
723     p_token3    IN VARCHAR2 ,
724     p_loading_status IN VARCHAR2 ,
725     x_loading_status OUT NOCOPY VARCHAR2 )
726   RETURN VARCHAR2 IS
727      l_return_code VARCHAR2(1);
728 BEGIN
729    l_return_code := FND_API.G_TRUE;
730    x_loading_status := p_loading_status;
731    IF (p_char_field IS NULL ) THEN
732          FND_MESSAGE.SET_NAME ('CN' , 'CN_PE_FIELD_CANNOT_NULL');
733          FND_MESSAGE.SET_TOKEN('OBJ_NAME',p_obj_name);
734    FND_MESSAGE.SET_TOKEN('PLAN_TYPE',
735              get_lkup_meaning(p_pe_type,'QUOTA_TYPE'));
736          FND_MESSAGE.SET_TOKEN('TOKEN1',p_token1);
737    FND_MESSAGE.SET_TOKEN('TOKEN2',p_token2);
738    FND_MESSAGE.SET_TOKEN('TOKEN3',p_token3);
739 
740      if (FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
741        FND_LOG.MESSAGE(FND_LOG.LEVEL_ERROR,
742                        'cn.plsql.cn_api.pe_char_field_cannot_null.error',
743 	       		       true);
744      end if;
745 
746       -- Error, check the msg level and add an error message to the
747       -- API message list
748       IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
749         THEN
750          FND_MESSAGE.SET_NAME ('CN' , 'CN_PE_FIELD_CANNOT_NULL');
751          FND_MESSAGE.SET_TOKEN('OBJ_NAME',p_obj_name);
752    FND_MESSAGE.SET_TOKEN('PLAN_TYPE',
753              get_lkup_meaning(p_pe_type,'QUOTA_TYPE'));
754          FND_MESSAGE.SET_TOKEN('TOKEN1',p_token1);
755    FND_MESSAGE.SET_TOKEN('TOKEN2',p_token2);
756    FND_MESSAGE.SET_TOKEN('TOKEN3',p_token3);
757    FND_MSG_PUB.Add;
758       END IF;
759       x_loading_status := 'CN_PE_FIELD_CANNOT_NULL';
760       l_return_code := FND_API.G_FALSE;
761    END IF;
762    RETURN l_return_code;
763 END pe_char_field_cannot_null;
764 --| ---------------------------------------------------------------------+
765 --| Function Name :  get_cp_name
766 --| Desc : Pass in comp plan id then return comp plan name
767 --| ---------------------------------------------------------------------+
768 FUNCTION  get_cp_name( p_comp_plan_id  NUMBER)
769   RETURN cn_comp_plans.name%TYPE IS
770 
771   l_comp_plan_name cn_comp_plans.name%TYPE;
772 
773 BEGIN
774    SELECT name
775      INTO l_comp_plan_name
776      FROM cn_comp_plans_all
777      WHERE comp_plan_id = p_comp_plan_id;
778 
779    RETURN l_comp_plan_name;
780 
781 EXCEPTION
782    WHEN no_data_found THEN
783       RETURN NULL;
784 END get_cp_name;
785 
786 --| ---------------------------------------------------------------------+
787 --| Function Name :  get_cp_id
788 --| Desc : Pass in comp plan name then return comp plan id
789 --| ---------------------------------------------------------------------+
790 FUNCTION  get_cp_id( p_comp_plan_name  VARCHAR2, p_org_id NUMBER)
791   RETURN cn_comp_plans.comp_plan_id%TYPE IS
792 
793   l_comp_plan_id cn_comp_plans.comp_plan_id%TYPE;
794 
795 BEGIN
796    SELECT comp_plan_id
797      INTO l_comp_plan_id
798      FROM cn_comp_plans_all
799      WHERE name = p_comp_plan_name
800        AND org_id = p_org_id;
801 
802    RETURN l_comp_plan_id;
803 
804 EXCEPTION
805    WHEN no_data_found THEN
806       RETURN NULL;
807 END get_cp_id;
808 
809 --| ---------------------------------------------------------------------+
810 --| Function Name :  get_pp_name
811 --| Desc : Pass in payment plan id then return payment plan name
812 --| ---------------------------------------------------------------------+
813 FUNCTION  get_pp_name( p_pmt_plan_id  NUMBER)
814   RETURN cn_pmt_plans.name%TYPE IS
815 
816   l_pmt_plan_name cn_pmt_plans.name%TYPE;
817 
818 BEGIN
819    SELECT name
820      INTO l_pmt_plan_name
821      FROM cn_pmt_plans_all
822      WHERE pmt_plan_id = p_pmt_plan_id;
823 
824    RETURN l_pmt_plan_name;
825 
826 EXCEPTION
827    WHEN no_data_found THEN
828       RETURN NULL;
829 END get_pp_name;
830 
831 --| ---------------------------------------------------------------------+
832 --| Function Name :  get_pp_id
833 --| Desc : Pass in payment plan name then return payment plan id
834 --| ---------------------------------------------------------------------+
835 FUNCTION  get_pp_id( p_pmt_plan_name  VARCHAR2, p_org_id NUMBER)
836   RETURN cn_pmt_plans.pmt_plan_id%TYPE IS
837 
838   l_pmt_plan_id cn_pmt_plans.pmt_plan_id%TYPE;
839 
840 BEGIN
841    SELECT pmt_plan_id
842      INTO l_pmt_plan_id
843      FROM cn_pmt_plans_all
844      WHERE name = p_pmt_plan_name
845        AND org_id = p_org_id;
846 
847    RETURN l_pmt_plan_id;
848 
849 EXCEPTION
850    WHEN no_data_found THEN
851       RETURN NULL;
852 END get_pp_id;
853 
854 --| ---------------------------------------------------------------------+
855 --| Function Name :  get_salesrep_name
856 --| Desc : Pass in salesrep id then return salesrep name
857 --| ---------------------------------------------------------------------+
858 FUNCTION  get_salesrep_name( p_salesrep_id  NUMBER, p_org_id NUMBER)
859   RETURN cn_salesreps.name%TYPE IS
860 
861   l_salesrep_name cn_salesreps.name%TYPE;
862 
863 BEGIN
864    SELECT name
865      INTO l_salesrep_name
866      FROM cn_salesreps
867      WHERE salesrep_id = p_salesrep_id
868        AND org_id = p_org_id;
869 
870    RETURN l_salesrep_name;
871 
872 EXCEPTION
873    WHEN no_data_found THEN
874       RETURN NULL;
875 END get_salesrep_name;
876 
877 --| -----------------------------------------------------------------------+
878 --| Function Name :  chk_and get_salesrep_id
879 --| Desc : Based on the employee number and salesrep type passed in,
880 --|        Check if only one rec retrieve, if yes get the salesrep_id
881 --| ---------------------------------------------------------------------+
882 PROCEDURE  chk_and_get_salesrep_id
883   ( p_emp_num         IN VARCHAR2,
884     p_type            IN VARCHAR2,
885     p_org_id          IN NUMBER,
886     x_salesrep_id     OUT NOCOPY cn_salesreps.salesrep_id%TYPE,
887     x_return_status   OUT NOCOPY VARCHAR2,
888     x_loading_status  OUT NOCOPY VARCHAR2,
889     p_show_message    IN VARCHAR2) IS
890 
891        l_salesrep_id cn_salesreps.salesrep_id%TYPE;
892        l_emp_num  cn_salesreps.employee_number%TYPE;
893 
894 BEGIN
895    -- change for performance. Force to hit index on employee_number
896    -- Bug 1508614
897    -- Fixed  l_emp_num
898 
899    -- employee number or type cannot be null - fixed for bug 5075017
900 
901    l_emp_num := upper(p_emp_num);
902 
903 /*   IF p_emp_num IS NULL THEN
904       SELECT salesrep_id
905 	INTO l_salesrep_id
906 	FROM cn_salesreps
907 	WHERE employee_number IS NULL
908 	  AND org_id = p_org_id
909 	  AND ((type = p_type) OR (type IS NULL AND p_type IS NULL));
910      ELSE
911 */
912       SELECT /*+ first_rows */ salesrep_id
913 	INTO l_salesrep_id
914 	FROM cn_salesreps
915 	WHERE upper(employee_number) = l_emp_num
916 	AND org_id = p_org_id
917 	AND type = p_type;
918 --   END IF;
919    x_salesrep_id := l_salesrep_id;
920    x_return_status  := FND_API.G_RET_STS_SUCCESS;
921    x_loading_status := 'CN_SALESREP_FOUND';
922 
923 EXCEPTION
924    WHEN no_data_found THEN
925       x_salesrep_id := NULL;
926       x_return_status := FND_API.G_RET_STS_ERROR;
927       x_loading_status := 'CN_SALESREP_NOT_FOUND';
928       IF (p_show_message = FND_API.G_TRUE) THEN
929    -- Error, check the msg level and add an error message to the
930    -- API message list
931    IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
932      THEN
933       FND_MESSAGE.SET_NAME ('CN',x_loading_status);
934       FND_MSG_PUB.Add;
935    END IF;
936       END IF;
937    WHEN too_many_rows THEN
938       x_salesrep_id := NULL;
939       x_return_status := FND_API.G_RET_STS_ERROR;
940       x_loading_status := 'CN_SALESREP_TOO_MANY_ROWS';
941       IF (p_show_message = FND_API.G_TRUE) THEN
942    -- Error, check the msg level and add an error message to the
943    -- API message list
944    IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
945      THEN
946       FND_MESSAGE.SET_NAME ('CN',x_loading_status);
947       FND_MSG_PUB.Add;
948    END IF;
949       END IF;
950 END chk_and_get_salesrep_id;
951 
952 
953 --| -----------------------------------------------------------------------+
954 --| Function Name :  get_salesrep_id
955 --| Desc : Pass in salesrep name and employee number then return salesrep id
956 --| ---------------------------------------------------------------------+
957 FUNCTION  get_salesrep_id( p_salesrep_name  VARCHAR2, p_emp_num VARCHAR2, p_org_id NUMBER)
958   RETURN cn_salesreps.salesrep_id%TYPE IS
959 
960   l_salesrep_id cn_salesreps.salesrep_id%TYPE;
961 
962 BEGIN
963    SELECT salesrep_id
964      INTO l_salesrep_id
965      FROM cn_salesreps
966      WHERE name = p_salesrep_name AND employee_number = p_emp_num
967      AND org_id = p_org_id;
968 
969    RETURN l_salesrep_id;
970 
971 EXCEPTION
972    WHEN no_data_found THEN
973       RETURN NULL;
974 END get_salesrep_id;
975 
976 
977 -- --------------------------------------------------------------------------+
978 -- Function : date_range_overlap
979 -- Desc     : Check if two set of dates (a_start_date,a_end_date) and
980 --            (b_start_date, b_end_date) are overlap or not.
981 --            Assuming
982 --            1. a_start_date is not null and a_start_date > a_end_date
983 --            2. b_start_date is not null and b_start_date > b_end_date
984 --            3. both end_date can be open (null)
985 -- --------------------------------------------------------------------------+
986 FUNCTION date_range_overlap
987   (
988    a_start_date   DATE,
989    a_end_date     DATE,
990    b_start_date   DATE,
991    b_end_date     DATE
992    ) RETURN BOOLEAN IS
993 
994 BEGIN
995 
996    IF (a_end_date IS NOT NULL) THEN
997       IF (b_end_date IS NOT NULL) THEN
998    IF ((b_start_date BETWEEN a_start_date AND a_end_date) OR
999        (b_end_date BETWEEN a_start_date AND a_end_date) OR
1000        (a_start_date BETWEEN b_start_date AND b_end_date) OR
1001        (a_end_date BETWEEN b_start_date AND b_end_date)) THEN
1002       RETURN TRUE; -- overlap
1003    END IF;
1004        ELSE
1005    IF (b_start_date <= a_end_date) THEN
1006       RETURN TRUE; -- overlap
1007    END IF;
1008       END IF;
1009     ELSE
1010       IF (b_end_date IS NOT NULL) THEN
1011    IF (b_end_date >= a_start_date) THEN
1012       RETURN TRUE; -- overlap
1013    END IF;
1014        ELSE
1015    RETURN TRUE; -- overlap
1016       END IF;
1017    END IF;
1018 
1019    RETURN FALSE;  -- not overlap
1020 
1021 END date_range_overlap;
1022 
1023 -- ---------------------------------------------------------------------------+
1024 -- PROCEDURE : get_date_range_diff_action
1025 -- Desc     : get the difference portion of the two date ranges
1026 --            Assuming
1027 --            1. start_date_new is not null and start_date_new < end_date_new
1028 --            2. start_date_old is not null and start_date_old < end_date_old
1029 --            3. both end_date can be open (null)
1030 -- ---------------------------------------------------------------------------+
1031 PROCEDURE get_date_range_diff_action
1032   (
1033    start_date_new   DATE,
1034    end_date_new     DATE,
1035    start_date_old   DATE,
1036    end_date_old     DATE,
1037    x_date_range_action_tbl OUT NOCOPY date_range_action_tbl_type ) IS
1038 
1039    l_counter NUMBER :=0;
1040 
1041 BEGIN
1042 
1043    IF cn_api.date_range_overlap
1044      (start_date_new,
1045       end_date_new,
1046       start_date_old,
1047       end_date_old) THEN
1048 
1049       -- overlap exists
1050 
1051       IF start_date_new > start_date_old THEN
1052 
1053 	 l_counter := l_counter + 1;
1054 	 x_date_range_action_tbl(l_counter).start_date := start_date_old;
1055 	 x_date_range_action_tbl(l_counter).end_date   := start_date_new - 1;
1056 	 x_date_range_action_tbl(l_counter).action_flag:= 'D';
1057 
1058 	 -- clku, fixed compaison
1059        ELSIF start_date_new < start_date_old THEN
1060 
1061 	 l_counter := l_counter + 1;
1062 	 x_date_range_action_tbl(l_counter).start_date := start_date_new;
1063 	 x_date_range_action_tbl(l_counter).end_date   := start_date_old - 1;
1064 	 x_date_range_action_tbl(l_counter).action_flag:= 'I';
1065 
1066       END IF;
1067 
1068       IF end_date_new IS NULL AND end_date_old IS NULL THEN
1069 
1070 	 NULL;
1071 
1072        ELSIF end_date_new IS NULL AND end_date_old IS NOT NULL THEN
1073 
1074 	 l_counter := l_counter + 1;
1075 	 x_date_range_action_tbl(l_counter).start_date := end_date_old + 1;
1076 	 x_date_range_action_tbl(l_counter).end_date   := NULL;
1077 	 x_date_range_action_tbl(l_counter).action_flag:= 'I';
1078 
1079        ELSIF end_date_new IS NOT NULL AND end_date_old IS NULL THEN
1080 
1081 	 l_counter := l_counter + 1;
1082 	 x_date_range_action_tbl(l_counter).start_date := end_date_new + 1;
1083 	 x_date_range_action_tbl(l_counter).end_date   := NULL;
1084 	 x_date_range_action_tbl(l_counter).action_flag:= 'D';
1085 
1086        ELSE
1087 
1088 	 IF end_date_new > end_date_old THEN
1089 
1090 	    l_counter := l_counter + 1;
1091 	    x_date_range_action_tbl(l_counter).start_date := end_date_old + 1;
1092 	    x_date_range_action_tbl(l_counter).end_date   := end_date_new;
1093 	    x_date_range_action_tbl(l_counter).action_flag:= 'I';
1094 
1095 	  ELSIF end_date_new < end_date_old THEN
1096 
1097 	    l_counter := l_counter + 1;
1098 	    x_date_range_action_tbl(l_counter).start_date := end_date_new + 1;
1099 	    x_date_range_action_tbl(l_counter).end_date   := end_date_old;
1100             -- clku, fixed action
1101 	    x_date_range_action_tbl(l_counter).action_flag:= 'D';
1102 
1103 	 END IF;
1104 
1105       END IF;
1106 
1107     ELSE
1108 
1109       -- no overlap
1110       l_counter := l_counter + 1;
1111       x_date_range_action_tbl(l_counter).start_date := start_date_new ;
1112       x_date_range_action_tbl(l_counter).end_date   := end_date_new;
1113       x_date_range_action_tbl(l_counter).action_flag:= 'I';
1114 
1115       l_counter := l_counter + 1;
1116       x_date_range_action_tbl(l_counter).start_date := start_date_old;
1117       x_date_range_action_tbl(l_counter).end_date   := end_date_old;
1118       x_date_range_action_tbl(l_counter).action_flag:= 'D';
1119 
1120    END IF;
1121 
1122 END get_date_range_diff_action;
1123 
1124 -- ---------------------------------------------------------------------------+
1125 -- Function : date_range_within
1126 -- Desc     : Check if (a_start_date,a_end_date) is within (b_start_date, b_end_date)
1127 --            Assuming
1128 --            1. a_start_date is not null and a_start_date > a_end_date
1129 --            2. b_start_date is not null and b_start_date > b_end_date
1130 --            3. both end_date can be open (null)
1131 -- ---------------------------------------------------------------------------+
1132 FUNCTION date_range_within
1133   (
1134    a_start_date   DATE,
1135    a_end_date     DATE,
1136    b_start_date   DATE,
1137    b_end_date     DATE
1138    ) RETURN BOOLEAN IS
1139 
1140 BEGIN
1141    IF (b_end_date IS NOT NULL) THEN
1142       IF (a_end_date IS NOT NULL) THEN
1143    IF ((a_start_date BETWEEN b_start_date AND b_end_date) AND
1144        (a_end_date BETWEEN b_start_date AND b_end_date)) THEN
1145       RETURN TRUE; -- within
1146    END IF;
1147        ELSE
1148    RETURN FALSE; -- not within
1149       END IF;
1150     ELSE
1151       IF (a_start_date >= b_start_date) THEN
1152    RETURN TRUE; -- within
1153       END IF;
1154    END IF;
1155 
1156    RETURN FALSE;  -- not within
1157 
1158 END date_range_within;
1159 
1160 --| ---------------------------------------------------------------------=
1161 --|   Procedure Name :  invalid_date_range
1162 --|   Desc : Check if date range is invalid
1163 --| ---------------------------------------------------------------------=
1164 FUNCTION invalid_date_range
1165   ( p_start_date  IN DATE ,
1166     p_end_date    IN DATE ,
1167     p_end_date_nullable IN VARCHAR2,
1168     p_loading_status IN VARCHAR2,
1169     x_loading_status OUT NOCOPY VARCHAR2,
1170     p_show_message IN VARCHAR2)
1171   RETURN VARCHAR2 IS
1172 
1173      l_return_code VARCHAR2(1);
1174 
1175 BEGIN
1176    l_return_code := FND_API.G_FALSE;
1177    x_loading_status := p_loading_status;
1178    IF p_start_date IS NULL THEN
1179       x_loading_status := 'CN_START_DATE_CANNOT_NULL';
1180       l_return_code := FND_API.G_TRUE;
1181     ELSIF p_start_date = FND_API.G_MISS_DATE THEN
1182       x_loading_status := 'CN_START_DATE_CANNOT_MISSING';
1183       l_return_code := FND_API.G_TRUE;
1184     ELSIF p_end_date IS NULL AND p_end_date_nullable <> FND_API.G_TRUE THEN
1185       x_loading_status := 'CN_END_DATE_CANNOT_NULL';
1186       l_return_code := FND_API.G_TRUE;
1187     ELSIF p_end_date = FND_API.G_MISS_DATE
1188       AND p_end_date_nullable <> FND_API.G_TRUE THEN
1189       x_loading_status := 'CN_END_DATE_CANNOT_MISSING';
1190       l_return_code := FND_API.G_TRUE;
1191     ELSIF p_end_date IS NOT NULL AND p_start_date > p_end_date THEN
1192       x_loading_status := 'CN_INVALID_DATE_RANGE';
1193       l_return_code := FND_API.G_TRUE;
1194     ELSE
1195       l_return_code := FND_API.G_FALSE;
1196    END IF;
1197    IF (l_return_code =  FND_API.g_true AND p_show_message = fnd_api.G_TRUE) THEN
1198       -- Error, check the msg level and add an error message to the
1199       -- API message list
1200       IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
1201         THEN
1202          FND_MESSAGE.SET_NAME ('CN',x_loading_status);
1203    FND_MSG_PUB.Add;
1204       END IF;
1205    END IF;
1206 
1207    RETURN l_return_code;
1208 
1209 END invalid_date_range;
1210 --| ---------------------------------------------------------------------=
1211 --| Function Name :  get_role_id
1212 --| Desc : Get the  role id using the role name
1213 --| ---------------------------------------------------------------------=
1214 FUNCTION  get_role_id ( p_role_name     VARCHAR2 )
1215   RETURN cn_roles.role_id%TYPE IS
1216 
1217      l_role_id cn_roles.role_id%TYPE;
1218 
1219 BEGIN
1220    -- added uppers to avoid FTS for bug 5075017
1221    SELECT role_id
1222      INTO l_role_id
1223      FROM cn_roles
1224      WHERE Upper(name) = Upper(p_role_name) ;
1225 
1226    RETURN l_role_id;
1227 
1228 EXCEPTION
1229    WHEN no_data_found THEN
1230       RETURN NULL;
1231 
1232 END get_role_id;
1233 --| ---------------------------------------------------------------------=
1234 --| Function Name :  get_role_name
1235 --| Desc : Get the  role name using the role id
1236 --| ---------------------------------------------------------------------=
1237 FUNCTION  get_role_name ( p_role_id     VARCHAR2 )
1238   RETURN cn_roles.name%TYPE IS
1239 
1240      l_role_name cn_roles.name%TYPE;
1241 
1242 BEGIN
1243    SELECT name
1244      INTO l_role_name
1245      FROM cn_roles
1246      WHERE  role_id = p_role_id ;
1247 
1248    RETURN l_role_name;
1249 
1250 EXCEPTION
1251    WHEN no_data_found THEN
1252       RETURN NULL;
1253 
1254 END get_role_name;
1255 
1256 -- --------------------------------------------------------------------------=
1257 -- Function : get_srp_role_id
1258 -- Desc     : get the srp_role_id if it exists in cn_srp_roles
1259 -- --------------------------------------------------------------------------=
1260 FUNCTION get_srp_role_id
1261   (p_emp_num    IN cn_salesreps.employee_number%type,
1262    p_type       IN cn_salesreps.TYPE%type,
1263    p_role_name  IN cn_roles.name%type,
1264    p_start_date IN cn_srp_roles.start_date%type,
1265    p_end_date   IN cn_srp_roles.end_date%TYPE,
1266    p_org_id     IN cn_salesreps.org_id%type
1267    ) RETURN cn_srp_roles.srp_role_id%TYPE IS
1268 
1269       CURSOR l_cur(l_salesrep_id  cn_srp_roles.salesrep_id%TYPE,
1270 		   l_role_id      cn_srp_roles.role_id%TYPE,
1271 		   l_start_date   cn_srp_roles.start_date%TYPE,
1272 		   l_end_date     cn_srp_roles.end_date%TYPE) IS
1273    SELECT srp_role_id
1274      FROM cn_srp_roles
1275      WHERE role_id = l_role_id AND
1276      salesrep_id = l_salesrep_id AND
1277      start_date = l_start_date AND
1278      org_id = p_org_id AND
1279      ((end_date = l_end_date) OR
1280       (end_date IS NULL AND l_end_date IS NULL));
1281 
1282       l_rec              l_cur%ROWTYPE;
1283       l_role_id          cn_srp_roles.role_id%TYPE;
1284       l_salesrep_id      cn_srp_roles.salesrep_id%TYPE;
1285       l_return_status    VARCHAR2(2000);
1286       l_loading_status   VARCHAR2(2000);
1287 
1288 BEGIN
1289 
1290    l_role_id     := cn_api.get_role_id(p_role_name);
1291    chk_and_get_salesrep_id
1292      (p_emp_num ,
1293       p_type,
1294       p_org_id,
1295       l_salesrep_id,
1296       l_return_status,
1297       l_loading_status,
1298       fnd_api.g_false);
1299 
1300    OPEN l_cur(l_salesrep_id, l_role_id, p_start_date, p_end_date);
1301    FETCH l_cur INTO l_rec;
1302    IF (l_cur%notfound) THEN
1303       CLOSE l_cur;
1304       RETURN NULL;
1305     ELSE
1306       CLOSE l_cur;
1307       RETURN l_rec.srp_role_id;
1308    END IF;
1309 
1310 END get_srp_role_id;
1311 
1312 -- --------------------------------------------------------------------------=
1313 -- Function : get_role_plan_id
1314 -- Desc     : get the role_plan_id if it exists in cn_roles
1315 -- --------------------------------------------------------------------------=
1316 FUNCTION get_role_plan_id
1317   (
1318    p_role_name              IN  VARCHAR2,
1319    p_comp_plan_name         IN  VARCHAR2,
1320    p_start_date             IN  DATE,
1321    p_end_date               IN  DATE,
1322    p_org_id                 IN NUMBER
1323    ) RETURN cn_role_plans.role_plan_id%TYPE IS
1324 
1325       CURSOR l_cur(l_role_id      cn_role_plans.role_id%TYPE,
1326        l_comp_plan_id cn_role_plans.comp_plan_id%TYPE,
1327        l_start_date   cn_role_plans.start_date%TYPE,
1328        l_end_date     cn_role_plans.end_date%TYPE) IS
1329    SELECT role_plan_id
1330      FROM cn_role_plans
1331      WHERE role_id = l_role_id AND
1332      comp_plan_id = l_comp_plan_id AND
1333      start_date = l_start_date AND
1334      ((end_date = l_end_date) OR
1335       (end_date IS NULL AND l_end_date IS NULL));
1336 
1337       l_rec              l_cur%ROWTYPE;
1338       l_role_id          cn_role_plans.role_id%TYPE;
1339       l_comp_plan_id     cn_role_plans.comp_plan_id%TYPE;
1340 
1341 BEGIN
1342 
1343    l_role_id      := cn_api.get_role_id(p_role_name);
1344    l_comp_plan_id := cn_api.get_cp_id(p_comp_plan_name, p_org_id);
1345 
1346    OPEN l_cur(l_role_id, l_comp_plan_id, p_start_date, p_end_date);
1347    FETCH l_cur INTO l_rec;
1348    IF (l_cur%notfound) THEN
1349       CLOSE l_cur;
1350       RETURN NULL;
1351     ELSE
1352       CLOSE l_cur;
1353       RETURN l_rec.role_plan_id;
1354    END IF;
1355 
1356 END get_role_plan_id;
1357 
1358 -- --------------------------------------------------------------------------=
1359 -- Function : get_role_pmt_plan_id
1360 -- Desc     : get the role_pmt_plan_id if it exists in cn_roles_pmt_plans
1361 -- --------------------------------------------------------------------------=
1362 FUNCTION get_role_pmt_plan_id
1363   (
1364    p_role_name              IN  VARCHAR2,
1365    p_pmt_plan_name          IN  VARCHAR2,
1366    p_start_date             IN  DATE,
1367    p_end_date               IN  DATE,
1368    p_org_id                 IN NUMBER
1369    ) RETURN cn_role_pmt_plans.role_pmt_plan_id%TYPE IS
1370 
1371       CURSOR l_cur(l_role_id      cn_role_pmt_plans.role_id%TYPE,
1372        l_pmt_plan_id  cn_role_pmt_plans.pmt_plan_id%TYPE,
1373        l_start_date   cn_role_pmt_plans.start_date%TYPE,
1374        l_end_date     cn_role_pmt_plans.end_date%TYPE) IS
1375    SELECT role_pmt_plan_id
1376      FROM cn_role_pmt_plans
1377      WHERE role_id = l_role_id AND
1378      pmt_plan_id = l_pmt_plan_id AND
1379      start_date = l_start_date AND
1380      ((end_date = l_end_date) OR
1381       (end_date IS NULL AND l_end_date IS NULL));
1382 
1383       l_rec              l_cur%ROWTYPE;
1384       l_role_id          cn_role_pmt_plans.role_id%TYPE;
1385       l_pmt_plan_id      cn_role_pmt_plans.pmt_plan_id%TYPE;
1386 
1387 BEGIN
1388 
1389    l_role_id      := cn_api.get_role_id(p_role_name);
1390    l_pmt_plan_id  := cn_api.get_pp_id(p_pmt_plan_name, p_org_id);
1391 
1392    OPEN l_cur(l_role_id, l_pmt_plan_id, p_start_date, p_end_date);
1393    FETCH l_cur INTO l_rec;
1394    IF (l_cur%notfound) THEN
1395       CLOSE l_cur;
1396       RETURN NULL;
1397     ELSE
1398       CLOSE l_cur;
1399       RETURN l_rec.role_pmt_plan_id;
1400    END IF;
1401 
1402 END get_role_pmt_plan_id;
1403 
1404 
1405 --| -----------------------------------------------------------------------=
1406 --| Function Name :  get_srp_payee_assign_id
1407 --| Desc : Get the  srp_payee_assign_id using the
1408 --| payee_id, salesrep_id, quota_id, start_date, end_date
1409 --| ---------------------------------------------------------------------=
1410 FUNCTION  get_srp_payee_assign_id ( p_payee_id     NUMBER,
1411 				    p_salesrep_id  NUMBER,
1412 				    p_quota_id     NUMBER,
1413 				    p_start_date   DATE,
1414 				    p_end_date     DATE,
1415 				    p_org_id       NUMBER)
1416   RETURN cn_srp_payee_assigns.srp_payee_assign_id%TYPE IS
1417 
1418      CURSOR get_srp_payee_assign_id_curs IS
1419 	SELECT srp_payee_assign_id
1420 	  FROM cn_srp_payee_assigns
1421 	  WHERE payee_id     = p_payee_id
1422 	  AND salesrep_id  = p_salesrep_id
1423 	  AND org_id       = p_org_id
1424 	  AND quota_id     = p_quota_id
1425 	  AND start_date   = p_start_date
1426     AND end_date     = p_end_date ;
1427 
1428      CURSOR get_srp_payee_assign_id_curs1 IS
1429 	SELECT srp_payee_assign_id
1430 	  FROM cn_srp_payee_assigns
1431 	  WHERE payee_id     = p_payee_id
1432 	  AND salesrep_id  = p_salesrep_id
1433 	  AND org_id       = p_org_id
1434 	  AND quota_id     = p_quota_id
1435 	  AND start_date   = p_start_date
1436 	  AND end_date     IS NULL ;
1437 
1438     l_srp_payee_assign_id cn_srp_payee_assigns.srp_payee_assign_id%TYPE;
1439 
1440 BEGIN
1441 
1442    IF p_end_date IS NOT NULL THEN
1443 
1444       OPEN  get_srp_payee_assign_id_curs;
1445       FETCH get_srp_payee_assign_id_curs INTO l_srp_payee_assign_id;
1446       CLOSE get_srp_payee_assign_id_curs;
1447     ELSE
1448       OPEN  get_srp_payee_assign_id_curs1;
1449       FETCH get_srp_payee_assign_id_curs1 INTO l_srp_payee_assign_id;
1450       CLOSE get_srp_payee_assign_id_curs1;
1451    END IF;
1452 
1453    RETURN l_srp_payee_assign_id;
1454 
1455 END get_srp_payee_assign_id;
1456 --| ---------------------------------------------------------------------=
1457 --| Function Name :  next_period
1458 --| ---------------------------------------------------------------------=
1459 FUNCTION next_period (p_end_date DATE, p_org_id NUMBER)
1460    RETURN cn_acc_period_statuses_v.end_date%TYPE IS
1461 
1462       l_next_end_date cn_acc_period_statuses_v.end_date%TYPE;
1463 
1464    BEGIN
1465 
1466       SELECT MAX(end_date)
1467         INTO l_next_end_date
1468         FROM cn_acc_period_statuses_v
1469        WHERE period_status IN ('F', 'O')
1470          AND org_id = p_org_id;
1471 
1472      IF trunc(l_next_end_date) > trunc(p_end_date) THEN
1473 
1474         SELECT MIN(end_date)
1475           INTO l_next_end_date
1476           FROM cn_acc_period_statuses_v
1477          WHERE trunc(end_date) >= trunc(p_end_date)
1478            AND period_status IN ('F', 'O')
1479            AND org_id = p_org_id;
1480 
1481      END IF;
1482 
1483      RETURN l_next_end_date;
1484 
1485    EXCEPTION
1486       WHEN no_data_found THEN
1487          RETURN NULL;
1488 END next_period;
1489 
1490 FUNCTION get_pay_period(p_salesrep_id NUMBER,
1491                         p_date        DATE,
1492                         p_org_id      NUMBER )
1493   RETURN cn_commission_lines.pay_period_id%TYPE IS
1494 
1495      l_pay_period_id  cn_commission_lines.pay_period_id%TYPE;
1496 
1497 BEGIN
1498 
1499    SELECT a.period_id
1500      INTO l_pay_period_id
1501      FROM cn_period_statuses_all a, cn_srp_pay_groups_all b, cn_pay_groups_all c
1502      WHERE a.period_set_id = c.period_set_id
1503      AND a.org_id = p_org_id
1504      AND a.period_type_id = c.period_type_id
1505      AND b.pay_group_id = c.pay_group_id
1506      AND b.org_id = p_org_id
1507      AND c.org_id = p_org_id
1508      AND p_date BETWEEN a.start_date AND least(a.end_date, nvl(b.end_date,a.end_date))
1509      AND p_salesrep_id = b.salesrep_id
1510      AND p_date BETWEEN b.start_date AND nvl(b.end_date, p_date);
1511 
1512    RETURN l_pay_period_id;
1513 
1514 END get_pay_period;
1515 
1516 
1517 --| ---------------------------------------------------------------------=
1518 --| Function Name :  Get Itd Flag
1519 --| ---------------------------------------------------------------------=
1520 FUNCTION get_itd_flag(p_calc_formula_id NUMBER)
1521   RETURN cn_calc_formulas.itd_flag%TYPE IS
1522 
1523      l_itd_flag cn_calc_formulas.itd_flag%TYPE;
1524 
1525 BEGIN
1526 
1527    SELECT itd_flag
1528      INTO l_itd_flag
1529      FROM cn_calc_formulas_all
1530      WHERE calc_formula_id = p_calc_formula_id ;
1531 
1532    RETURN l_itd_flag;
1533  EXCEPTION
1534     WHEN no_data_found THEN
1535    RETURN  NULL;
1536 
1537 END get_itd_flag;
1538 
1539 --| -----------------------------------------------------------------------=
1540 --|   Function Name :  get_acc_period_id -- only get active periods
1541 --| ---------------------------------------------------------------------=
1542 FUNCTION  get_acc_period_id( p_period_name  VARCHAR2, p_org_id NUMBER)
1543   RETURN cn_periods.period_id%TYPE IS
1544 
1545   l_period_id cn_periods.period_id%TYPE;
1546 
1547 BEGIN
1548    SELECT period_id
1549      INTO l_period_id
1550      FROM cn_acc_period_statuses_v
1551      WHERE period_name = p_period_name
1552      AND org_id = p_org_id;
1553 
1554    RETURN l_period_id;
1555 
1556 EXCEPTION
1557    WHEN no_data_found THEN
1558       RETURN NULL;
1559 END get_acc_period_id;
1560 
1561 --| -----------------------------------------------------------------------=
1562 --|   Function Name :  get_acc_period_name -- only get active periods
1563 --| ---------------------------------------------------------------------=
1564 FUNCTION  get_acc_period_name( p_period_id  NUMBER, p_org_id NUMBER)
1565   RETURN cn_periods.period_name%TYPE IS
1566 
1567   l_period_name cn_periods.period_name%TYPE;
1568 
1569 BEGIN
1570    SELECT period_name
1571      INTO l_period_name
1572      FROM cn_acc_period_statuses_v
1573      WHERE period_id = p_period_id
1574      AND org_id = p_org_id;
1575 
1576    RETURN l_period_name;
1577 
1578 EXCEPTION
1579    WHEN no_data_found THEN
1580       RETURN NULL;
1581 END get_acc_period_name;
1582 --| -----------------------------------------------------------------------=
1583 --|   Function Name :  get_quota_assign_id
1584 --| ---------------------------------------------------------------------=
1585 FUNCTION  get_quota_assign_id( p_quota_id NUMBER,
1586              p_comp_plan_id NUMBER )
1587   RETURN cn_quota_assigns.quota_assign_id%TYPE IS
1588 
1589    l_quota_assign_id      cn_quota_assigns.quota_assign_id%TYPE;
1590 
1591 BEGIN
1592    SELECT quota_assign_id INTO l_quota_assign_id
1593      FROM cn_quota_assigns_all
1594      WHERE quota_id = p_quota_id
1595    AND  comp_plan_id = p_comp_plan_id;
1596 
1597    RETURN l_quota_assign_id;
1598 
1599 EXCEPTION
1600    WHEN no_data_found THEN
1601       RETURN NULL;
1602 END get_quota_assign_id ;
1603 
1604 -- ---------------------------------------------------------------------------=
1605 -- PROCEDURE : get_date_range_diff
1606 -- Desc     : get the difference portion of the two date ranges
1607 --            Assuming
1608 --            1. a_start_date is not null and a_start_date < a_end_date
1609 --            2. b_start_date is not null and b_start_date < b_end_date
1610 --            3. both end_date can be open (null)
1611 -- --------------------------------------------------------------------------=
1612 PROCEDURE get_date_range_diff    ( a_start_date   DATE,
1613            a_end_date     DATE,
1614            b_start_date   DATE,
1615            b_end_date     DATE,
1616            x_date_range_tbl OUT NOCOPY date_range_tbl_type ) IS
1617 
1618    l_counter  NUMBER := 0;
1619 BEGIN
1620 
1621    IF cn_api.date_range_overlap( a_start_date, a_end_date,
1622 				 b_start_date, b_end_date )
1623      THEN  -- there is overlap
1624       -- first, check the start dates
1625       IF a_start_date> b_start_date THEN
1626 	 l_counter := l_counter + 1;
1627 	 x_date_range_tbl(l_counter).start_date := b_start_date;
1628 	 x_date_range_tbl(l_counter).end_date   := a_start_date-1;
1629        ELSIF a_start_date< b_start_date THEN
1630 	 l_counter := l_counter + 1;
1631 	 x_date_range_tbl(l_counter).start_date := a_start_date;
1632 	 x_date_range_tbl(l_counter).end_date   := b_start_date-1;
1633       END IF;
1634 
1635       -- second, check end dates
1636       IF a_end_date IS NULL AND b_end_date IS NULL THEN
1637 	 NULL;
1638        ELSIF (a_end_date IS NULL AND b_end_date IS NOT NULL ) THEN
1639 	 l_counter := l_counter + 1;
1640 	 x_date_range_tbl(l_counter).start_date := b_end_date + 1;
1641 	 x_date_range_tbl(l_counter).end_date   := NULL;
1642        ELSIF (a_end_date IS NOT NULL AND b_end_date IS NULL ) THEN
1643 	 l_counter := l_counter + 1;
1644 	 x_date_range_tbl(l_counter).start_date := a_end_date + 1;
1645 	 x_date_range_tbl(l_counter).end_date   := NULL;
1646        ELSE -- a_end_date IS NOT NULL AND b_end_date IS NOT NULL
1647 	 IF a_end_date > b_end_date THEN
1648 	    l_counter := l_counter + 1;
1649 	    x_date_range_tbl(l_counter).start_date := b_end_date + 1;
1650 	    x_date_range_tbl(l_counter).end_date   := a_end_date;
1651 	  ELSIF a_end_date < b_end_date THEN
1652 	    l_counter := l_counter + 1;
1653 	    x_date_range_tbl(l_counter).start_date := a_end_date + 1;
1654 	    x_date_range_tbl(l_counter).end_date   := b_end_date;
1655 	 END IF;
1656       END IF;
1657     ELSE -- there is no overlap
1658       l_counter := l_counter + 1;
1659       x_date_range_tbl(l_counter).start_date := a_start_date;
1660       x_date_range_tbl(l_counter).end_date   := a_end_date;
1661 
1662       l_counter := l_counter + 1;
1663       x_date_range_tbl(l_counter).start_date := b_start_date;
1664       x_date_range_tbl(l_counter).end_date   := b_end_date;
1665    END IF;
1666 END get_date_range_diff   ;
1667 
1668 -- -------------------------------------------------------------------------+
1669 -- PROCEDURE : get_date_range_intersect
1670 -- Desc     : get the intersection of two date ranges
1671 --            Assuming
1672 --            1. a_start_date is not null and a_start_date < a_end_date
1673 --            2. b_start_date is not null and b_start_date < b_end_date
1674 --            3. both end_date can be open (null)
1675 --            4. the two date ranges overlap
1676 -- -------------------------------------------------------------------------+
1677 PROCEDURE get_date_range_intersect
1678   (
1679    a_start_date   DATE,
1680    a_end_date     DATE,
1681    b_start_date   DATE,
1682    b_end_date     DATE,
1683    x_start_date   OUT NOCOPY DATE,
1684    x_end_date     OUT NOCOPY DATE) IS
1685 
1686 BEGIN
1687 
1688       IF a_start_date> b_start_date THEN
1689    x_start_date := a_start_date;
1690        ELSIF a_start_date<= b_start_date THEN
1691    x_start_date := b_start_date;
1692       END IF;
1693 
1694       IF a_end_date IS NULL AND b_end_date IS NULL THEN
1695    x_end_date := NULL;
1696 
1697       ELSIF (a_end_date IS NULL AND b_end_date IS NOT NULL ) THEN
1698    x_end_date := b_end_date;
1699 
1700       ELSIF (a_end_date IS NOT NULL AND b_end_date IS NULL ) THEN
1701    x_end_date := a_end_date;
1702 
1703       ELSE
1704    IF a_end_date > b_end_date THEN
1705       x_end_date := b_end_date;
1706     ELSIF a_end_date <= b_end_date THEN
1707       x_end_date := a_end_date;
1708    END IF;
1709       END IF;
1710 
1711 END get_date_range_intersect;
1712 
1713 -- ---------------------------------------------------------------------------=
1714 -- PROCEDURE : get_date_range_overlap
1715 -- Desc     : get the overlap portion of the two date ranges
1716 --            Assuming
1717 --            1. a_start_date is not null and a_start_date < a_end_date
1718 --            2. b_start_date is not null and b_start_date < b_end_date
1719 --            3. both end_date can be open (null)
1720 -- ---------------------------------------------------------------------------=
1721 PROCEDURE get_date_range_overlap (a_start_date   DATE,
1722           a_end_date     DATE,
1723           b_start_date   DATE,
1724 	  b_end_date     DATE,
1725 	  p_org_id       NUMBER,
1726           x_date_range_tbl OUT NOCOPY date_range_tbl_type ) IS
1727 
1728    l_start_date   DATE;
1729    l_end_date     DATE;
1730 
1731    CURSOR l_last_date_cr IS
1732 
1733       -- fixed query for bug 5075017
1734       SELECT MAX(end_date)
1735 	FROM cn_acc_period_statuses_v
1736        WHERE period_status IN ('F', 'O')
1737          AND org_id = p_org_id;
1738 
1739 BEGIN
1740    IF cn_api.date_range_overlap( a_start_date, a_end_date,
1741          b_start_date, b_end_date )
1742      THEN  -- there is overlap
1743       -- first, check the start dates
1744       IF a_start_date> b_start_date THEN
1745    l_start_date := a_start_date;
1746        ELSIF a_start_date<= b_start_date THEN
1747    l_start_date := b_start_date;
1748       END IF;
1749 
1750       -- second, check end dates
1751       IF a_end_date IS NULL AND b_end_date IS NULL THEN
1752 
1753    OPEN l_last_date_cr;
1754    FETCH l_last_date_cr INTO l_end_date;
1755 
1756    IF (l_last_date_cr%notfound) THEN
1757 
1758       l_end_date := NULL;
1759 
1760    END IF;
1761 
1762        ELSIF (a_end_date IS NULL AND b_end_date IS NOT NULL ) THEN
1763    l_end_date := b_end_date;
1764        ELSIF (a_end_date IS NOT NULL AND b_end_date IS NULL ) THEN
1765    l_end_date := a_end_date;
1766        ELSE -- a_end_date IS NOT NULL AND b_end_date IS NOT NULL
1767    IF a_end_date > b_end_date THEN
1768       l_end_date := b_end_date;
1769     ELSIF a_end_date <= b_end_date THEN
1770       l_end_date := a_end_date;
1771    END IF;
1772       END IF;
1773 
1774       x_date_range_tbl(1).start_date := l_start_date;
1775       x_date_range_tbl(1).end_date := l_end_date;
1776    END IF;
1777 END get_date_range_overlap;
1778 
1779 -- ---------------------------------------------------------------------------=
1780 -- FUNCTION: get_acc_period_id
1781 -- Desc     : get the accumulation period_id given the date
1782 --            If the date is null, will return the latest accumulation period
1783 --            with period_status = 'O'
1784 -- --------------------------------------------------------------------------=
1785 FUNCTION get_acc_period_id (p_date   DATE, p_org_id NUMBER) RETURN NUMBER IS
1786    CURSOR l_date_period_csr IS
1787       SELECT period_id
1788   FROM cn_acc_period_statuses_v
1789   WHERE p_date BETWEEN start_date AND end_date
1790   AND org_id = p_org_id;
1791 
1792    CURSOR l_null_date_period_csr IS
1793       SELECT MAX(period_id)
1794   FROM cn_acc_period_statuses_v
1795     WHERE period_status = 'O'
1796     AND org_id = p_org_id;
1797 
1798    l_period_id  NUMBER(15);
1799 
1800 BEGIN
1801    IF p_date IS NOT NULL THEN
1802       OPEN l_date_period_csr;
1803       FETCH l_date_period_csr INTO l_period_id;
1804       CLOSE l_date_period_csr;
1805    END IF;
1806 
1807    IF (l_period_id IS NULL) THEN
1808       OPEN l_null_date_period_csr;
1809       FETCH l_null_date_period_csr INTO l_period_id;
1810       CLOSE l_null_date_period_csr;
1811    END IF;
1812 
1813       RETURN l_period_id;
1814 EXCEPTION WHEN OTHERS THEN
1815    IF l_date_period_csr%isopen THEN
1816       CLOSE l_date_period_csr;
1817    END IF;
1818 
1819    IF l_null_date_period_csr%isopen THEN
1820       CLOSE l_null_date_period_csr;
1821    END IF;
1822 
1823    RAISE;
1824 
1825 END get_acc_period_id;
1826 
1827 
1828 -- ---------------------------------------------------------------------------=
1829 -- FUNCTION: get_acc_period_id_fo
1830 -- Desc     : get the accumulation period_id given the date
1831 --            If the date is null, will return the first accumulation period
1832 --            with period_status = 'O'
1833 -- --------------------------------------------------------------------------=
1834 FUNCTION get_acc_period_id_fo (p_date   DATE, p_org_id NUMBER) RETURN NUMBER IS
1835 
1836    CURSOR l_date_period_csr IS
1837       SELECT period_id
1838   FROM cn_acc_period_statuses_v
1839   WHERE p_date BETWEEN start_date AND end_date
1840   AND org_id = p_org_id;
1841 
1842    CURSOR l_null_date_period_csr IS
1843       SELECT MIN(period_id)
1844   FROM cn_acc_period_statuses_v
1845     WHERE period_status = 'O'
1846     AND org_id = p_org_id;
1847 
1848    l_period_id  NUMBER(15);
1849 
1850 BEGIN
1851    IF p_date IS NOT NULL THEN
1852       OPEN l_date_period_csr;
1853       FETCH l_date_period_csr INTO l_period_id;
1854       CLOSE l_date_period_csr;
1855    END IF;
1856 
1857    IF (l_period_id IS NULL) THEN
1858       OPEN l_null_date_period_csr;
1859       FETCH l_null_date_period_csr INTO l_period_id;
1860       CLOSE l_null_date_period_csr;
1861    END IF;
1862 
1863       RETURN l_period_id;
1864 EXCEPTION WHEN OTHERS THEN
1865    IF l_date_period_csr%isopen THEN
1866       CLOSE l_date_period_csr;
1867    END IF;
1868 
1869    IF l_null_date_period_csr%isopen THEN
1870       CLOSE l_null_date_period_csr;
1871    END IF;
1872 
1873    RAISE;
1874 
1875 END get_acc_period_id_fo;
1876 
1877 --| -----------------------------------------------------------------------=
1878 --| Procedure Name : check_revenue_class_overlap
1879 --| Desc : Pass in Comp  Plan ID
1880 --|        pass in Comp Plan Name
1881 --| Note:  Comented out the overlap check
1882 --| ---------------------------------------------------------------------=
1883 PROCEDURE  check_revenue_class_overlap
1884   (
1885    p_comp_plan_id  IN NUMBER,
1886    p_rc_overlap    IN VARCHAR2,
1887    p_loading_status IN VARCHAR2,
1888    x_loading_status OUT NOCOPY VARCHAR2,
1889    x_return_status  OUT NOCOPY VARCHAR2 ) IS
1890 
1891    l_rev_class_total        NUMBER := 0;
1892    l_rev_class_total_unique NUMBER := 0;
1893    l_comp_plan_name         cn_comp_plans.name%TYPE;
1894    l_rc_overlap             VARCHAR2(03);
1895    l_sum_trx_flag           VARCHAR2(03); -- commented for bug 7655423 / uncommented for f port of 7330382
1896 
1897 BEGIN
1898    x_return_status := FND_API.G_RET_STS_SUCCESS;
1899    x_loading_status := p_loading_status;
1900 
1901    BEGIN
1902       SELECT name, Nvl(p_rc_overlap,allow_rev_class_overlap),sum_trx_flag  -- commented for bug 7655423
1903   INTO l_comp_plan_name,l_rc_overlap,l_sum_trx_flag
1904   FROM cn_comp_plans_all
1905   WHERE comp_plan_id = p_comp_plan_id;
1906    EXCEPTION
1907       WHEN NO_DATA_FOUND THEN
1908    IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
1909       FND_MESSAGE.SET_NAME ('CN' , 'CN_INVALID_COMP_PLAN');
1910       FND_MSG_PUB.Add;
1911    END IF;
1912    x_loading_status := 'CN_INVALID_COMP_PLAN';
1913    x_return_status  :=  FND_API.G_RET_STS_ERROR;
1914    END ;
1915 
1916    IF l_rc_overlap = 'N' THEN
1917       -- The function below adds the message
1918       IF CN_COMP_PLANS_PKG.check_unique_rev_class
1919 	(p_comp_plan_id,l_comp_plan_name,l_rc_overlap,l_sum_trx_flag) = FALSE THEN
1920           x_loading_status := 'PLN_PLAN_DUP_REV_CLASS';
1921           x_return_status := FND_API.G_RET_STS_ERROR;
1922       END IF ;
1923    END IF;
1924 
1925 END check_revenue_class_overlap;
1926 --| -----------------------------------------------------------------------=
1927 --| Function Name :  get_comp_group_name
1928 --| Desc : Pass in comp_group id then return comp_group name
1929 --| ---------------------------------------------------------------------=
1930 FUNCTION  get_comp_group_name( p_comp_group_id  NUMBER)
1931   RETURN cn_comp_groups.name%TYPE IS
1932 
1933   l_comp_group_name cn_comp_groups.name%TYPE;
1934 
1935 BEGIN
1936    SELECT name
1937      INTO l_comp_group_name
1938      FROM cn_comp_groups
1939      WHERE comp_group_id = p_comp_group_id;
1940 
1941    RETURN l_comp_group_name;
1942 
1943 EXCEPTION
1944    WHEN no_data_found THEN
1945       RETURN NULL;
1946 END get_comp_group_name;
1947 
1948 --| -----------------------------------------------------------------------=
1949 --| Function Name :  get_order_booked_date
1950 --| Desc : Pass in order header_id then return date order was booked (or NULL)
1951 --| ---------------------------------------------------------------------=
1952 /* See comment in  file header (DEC-20-99)
1953 FUNCTION  get_order_booked_date(p_order_header_id  NUMBER) RETURN DATE IS
1954    l_booked_flag VARCHAR2(1);
1955    l_booked_date DATE;
1956 BEGIN
1957 -- This is what we need to call, but we can't - it violates the function pragma
1958 -- Because of this , I have copied in the code out of this procedure
1959 --   oe_header_status_pub.get_booked_status(p_order_header_id,
1960 --                                        l_booked_flag,
1961 --                                        l_booked_date);
1962    SELECT nvl(booked_flag, 'N')
1963    INTO l_booked_flag
1964    FROM aso_i_oe_order_headers_v
1965    WHERE header_id = p_order_header_id;
1966 
1967    IF l_booked_flag = 'Y' THEN
1968       SELECT end_date
1969       INTO l_booked_date
1970       FROM wf_item_activity_statuses
1971       WHERE item_type = OE_GLOBALS.G_WFI_HDR
1972          AND item_key = p_order_header_id
1973          AND process_activity IN (SELECT wpa.instance_id
1974                                  FROM  wf_process_activities wpa
1975                                  WHERE wpa.activity_item_type = OE_GLOBALS.G_WFI_HDR
1976                                        AND wpa.activity_name = 'BOOK_ORDER');
1977    ELSE
1978   l_booked_date := NULL;
1979    END IF;
1980    RETURN l_booked_date;
1981 END get_order_booked_date;
1982 */
1983 
1984 
1985 --| -----------------------------------------------------------------------=
1986 --| Function Name :  get_site_address_id
1987 --| Desc : Pass in order site_use_id then return address_id of 'use site'
1988 --|        (gets address_id out of RA_SITE_USES)
1989 --| ---------------------------------------------------------------------=
1990 FUNCTION  get_site_address_id(p_site_use_id  NUMBER, p_org_id NUMBER ) RETURN NUMBER IS
1991 
1992    CURSOR l_address_id_csr IS
1993       SELECT cust_acct_site_id
1994       FROM hz_cust_site_uses
1995    WHERE site_use_id = p_site_use_id
1996    AND org_id = p_org_id;
1997    l_address_id NUMBER;
1998 
1999 BEGIN
2000 
2001    IF p_site_use_id IS NOT NULL THEN
2002 
2003       OPEN l_address_id_csr;
2004       FETCH l_address_id_csr INTO l_address_id;
2005       CLOSE l_address_id_csr;
2006       RETURN l_address_id;
2007 
2008 
2009    ELSE
2010       RETURN NULL;
2011    END IF;
2012 
2013 EXCEPTION WHEN OTHERS THEN
2014 
2015    IF l_address_id_csr%isopen THEN
2016       CLOSE l_address_id_csr;
2017    END IF;
2018 
2019    RAISE;
2020 
2021 END get_site_address_id;
2022 
2023 --| -----------------------------------------------------------------------=
2024 --| Function Name :  get_order_revenue_type
2025 --| Desc : Derives the Revenue Type of an order, in the format required by
2026 --|        CN
2027 --| ---------------------------------------------------------------------=
2028 FUNCTION  get_order_revenue_type(p_sales_credit_type_id  NUMBER) RETURN VARCHAR2 IS
2029 
2030    CURSOR l_qu_flag_csr IS
2031       SELECT quota_flag
2032       FROM   aso_i_sales_credit_types_v
2033    WHERE  sales_credit_type_id = p_sales_credit_type_id;
2034    l_qu_flag VARCHAR2(1);
2035 
2036 BEGIN
2037    IF p_sales_credit_type_id IS NOT NULL THEN
2038        OPEN l_qu_flag_csr;
2039        FETCH l_qu_flag_csr INTO l_qu_flag;
2040        CLOSE l_qu_flag_csr;
2041        IF l_qu_flag = 'Y' THEN
2042            RETURN 'REVENUE';
2043        ELSE
2044            RETURN 'NONREVENUE';
2045        END IF;
2046    ELSE
2047        RETURN NULL;
2048    END IF;
2049 
2050 EXCEPTION WHEN OTHERS THEN
2051    IF l_qu_flag_csr%isopen THEN
2052       CLOSE l_qu_flag_csr;
2053    END IF;
2054    RAISE;
2055 
2056 END get_order_revenue_type;
2057 
2058 
2059 -- |------------------------------------------------------------------------=
2060 -- | Function Name : get_credit_info
2061 -- |
2062 -- | Description   : Procedure to return precision and extended precision for credit
2063 -- |                 types
2064 -- |-------------------------------------------------------------------------=
2065 PROCEDURE get_credit_info
2066   (p_credit_type_name IN  cn_credit_types.name%TYPE, /* credit type name */
2067    x_precision      OUT NOCOPY NUMBER, /* number of digits to right of decimal*/
2068    x_ext_precision  OUT NOCOPY NUMBER, /* precision where more precision is needed*/
2069    p_org_id   NUMBER
2070    )  IS
2071 
2072 BEGIN
2073 
2074    SELECT PRECISION, EXTENDED_PRECISION
2075      INTO x_precision, x_ext_precision
2076      FROM cn_credit_types
2077      WHERE name = p_credit_type_name
2078      AND org_id = p_org_id;
2079 
2080    /* Precision should never be NULL; this is just so it works w/ bad data*/
2081    IF (x_precision IS NULL)
2082      THEN /* Default precision to two if necessary. */
2083       x_precision := 2;
2084    END IF;
2085 
2086    /* Ext Precision should never be NULL; this is so it works w/ bad data*/
2087    IF (x_ext_precision IS NULL)
2088      THEN /* Default ext_precision if necc. */
2089       x_ext_precision := 5;
2090    END IF;
2091 
2092 EXCEPTION
2093    WHEN NO_DATA_FOUND THEN
2094       x_precision := 0;
2095       x_ext_precision := 0;
2096 END;
2097 
2098 
2099 --| -----------------------------------------------------------------------=
2100 --| Function Name :  convert_to_repcurr
2101 --| Desc : Convert from credit unit into salesrep currency amount
2102 --| ---------------------------------------------------------------------=
2103 FUNCTION  convert_to_repcurr
2104   (p_credit_unit         IN NUMBER,
2105    p_conv_date           IN DATE ,
2106    p_conv_type           IN VARCHAR2,
2107    p_from_credit_type_id IN NUMBER,
2108    p_funcurr_code        IN VARCHAR2,
2109    p_repcurr_code        IN VARCHAR2,
2110    p_org_id              IN NUMBER
2111   ) RETURN NUMBER IS
2112 
2113      l_monetary_flag  cn_credit_types.monetary_flag%TYPE;
2114      l_conv_date      DATE;
2115      l_conv_amount    NUMBER;
2116      l_repcurr_amount NUMBER;
2117 
2118      CURSOR get_closest_date IS
2119   SELECT start_date
2120     FROM cn_credit_conv_fcts_all
2121     WHERE from_credit_type_id = p_from_credit_type_id
2122     AND   to_credit_type_id = -1000
2123     AND   start_date <= p_conv_date
2124     AND org_id = p_org_id
2125     ORDER BY start_date DESC ;
2126 
2127      l_date DATE;
2128 
2129 BEGIN
2130 
2131    SELECT monetary_flag into l_monetary_flag
2132      FROM cn_credit_types_all
2133      WHERE credit_type_id = p_from_credit_type_id
2134      AND org_id = p_org_id;
2135 
2136    IF (l_monetary_flag = 'N') THEN
2137       BEGIN
2138    SELECT conversion_factor * Nvl(p_credit_unit,0)
2139      INTO l_conv_amount
2140      FROM cn_credit_conv_fcts_all
2141      WHERE from_credit_type_id = p_from_credit_type_id
2142      AND   to_credit_type_id = -1000
2143      AND org_id = p_org_id
2144      AND   p_conv_date between start_date and nvl(end_date, p_conv_date)
2145      ;
2146       EXCEPTION
2147    WHEN NO_DATA_FOUND THEN
2148       -- if no conv_factor defined for p_conv_date, trace back to
2149       -- closest defined date before p_conv_date
2150       OPEN  get_closest_date;
2151       FETCH get_closest_date INTO l_date;
2152       IF NOT get_closest_date%FOUND THEN
2153          CLOSE get_closest_date;
2154          RAISE NO_DATA_FOUND;
2155        ELSE
2156          SELECT conversion_factor * Nvl(p_credit_unit,0)
2157      INTO l_conv_amount
2158      FROM cn_credit_conv_fcts_all
2159      WHERE from_credit_type_id = p_from_credit_type_id
2160      AND   to_credit_type_id = -1000
2161      AND org_id = p_org_id
2162      AND   l_date between start_date and nvl(end_date, l_date)
2163      ;
2164       END IF;
2165       CLOSE get_closest_date;
2166       END;
2167     ELSE
2168       SELECT Nvl(p_credit_unit,0) INTO l_conv_amount
2169   FROM sys.dual;
2170    END IF;
2171 
2172    l_repcurr_amount :=
2173      gl_currency_api.convert_amount
2174      (x_from_currency => p_funcurr_code,
2175       x_to_currency   => p_repcurr_code,
2176       x_conversion_date => p_conv_date,
2177       x_conversion_type => p_conv_type,
2178       x_amount        => l_conv_amount
2179       );
2180 
2181    RETURN l_repcurr_amount;
2182 
2183 EXCEPTION
2184    WHEN NO_DATA_FOUND THEN
2185       FND_MESSAGE.SET_NAME('CN','CN_CRCVFT_NOT_EXIST');
2186       FND_MSG_PUB.Add;
2187       APP_EXCEPTION.raise_exception;
2188 END convert_to_repcurr;
2189 
2190 
2191 
2192 --| -----------------------------------------------------------------------=
2193 --| PROCEDURE Name :  convert_to_repcurr_report
2194 --| Desc : Convert from credit unit into salesrep currency amount
2195 --|        Called by reports.
2196 --| ---------------------------------------------------------------------=
2197 PROCEDURE  convert_to_repcurr_report
2198   (p_credit_unit         IN NUMBER,
2199    p_conv_date           IN DATE ,
2200    p_conv_type           IN VARCHAR2,
2201    p_from_credit_type_id IN NUMBER,
2202    p_funcurr_code        IN VARCHAR2,
2203    p_repcurr_code        IN VARCHAR2,
2204    x_repcurr_amount      OUT NOCOPY NUMBER,
2205    x_return_status       OUT NOCOPY VARCHAR2,
2206    p_org_id              IN NUMBER
2207   ) IS
2208 
2209      l_monetary_flag  cn_credit_types.monetary_flag%TYPE;
2210      l_conv_date      DATE;
2211      l_conv_amount    NUMBER;
2212 
2213      CURSOR get_closest_date IS
2214   SELECT start_date
2215     FROM cn_credit_conv_fcts_all
2216     WHERE from_credit_type_id = p_from_credit_type_id
2217     AND   to_credit_type_id = -1000
2218     AND   Trunc(start_date) <= Trunc(p_conv_date)
2219     AND org_id = p_org_id
2220     ORDER BY start_date DESC ;
2221 
2222      l_date DATE;
2223 
2224 BEGIN
2225 
2226    x_return_status := 'S';
2227 --   dbms_output.put_line('p_conv_date = ' || p_conv_date);
2228 --   dbms_output.put_line('p_conv_type = ' || p_conv_type);
2229 --   dbms_output.put_line('p_from_credit_type_id = ' || p_from_credit_type_id);
2230 --   dbms_output.put_line('p_funcurr_code = '|| p_funcurr_code);
2231 --   dbms_output.put_line('p_repcurr_code = ' ||  p_repcurr_code);
2232 
2233    SELECT monetary_flag into l_monetary_flag
2234      FROM cn_credit_types_all
2235      WHERE credit_type_id = p_from_credit_type_id
2236      AND org_id = p_org_id;
2237 
2238 --   dbms_output.put_line('l_monetary_flag = ' || l_monetary_flag);
2239 
2240    IF (l_monetary_flag = 'N') THEN
2241       BEGIN
2242    SELECT conversion_factor * Nvl(p_credit_unit,0)
2243      INTO l_conv_amount
2244      FROM cn_credit_conv_fcts_all
2245      WHERE from_credit_type_id = p_from_credit_type_id
2246      AND   to_credit_type_id = -1000
2247      AND org_id = p_org_id
2248      AND   p_conv_date between start_date and nvl(end_date, p_conv_date)
2249      ;
2250 --   dbms_output.put_line('l_conv_amount = ' || l_conv_amount);
2251 
2252       EXCEPTION
2253    WHEN NO_DATA_FOUND THEN
2254       -- if no conv_factor defined for p_conv_date, trace back to
2255       -- closest defined date before p_conv_date
2256 --      dbms_output.put_line('no data found -- 1');
2257       OPEN  get_closest_date;
2258       FETCH get_closest_date INTO l_date;
2259 --      dbms_output.put_line('l_date = ' || l_date);
2260       IF NOT get_closest_date%FOUND THEN
2261          CLOSE get_closest_date;
2262          RAISE NO_DATA_FOUND;
2263        ELSE
2264          SELECT conversion_factor * Nvl(p_credit_unit,0)
2265      INTO l_conv_amount
2266      FROM cn_credit_conv_fcts_all
2267      WHERE from_credit_type_id = p_from_credit_type_id
2268      AND   to_credit_type_id = -1000
2269      AND org_id = p_org_id
2270      AND   l_date between start_date and nvl(end_date, l_date);
2271 --    dbms_output.put_line('l_conv_amount = ' || l_conv_amount);
2272       END IF;
2273       CLOSE get_closest_date;
2274       END;
2275     ELSE
2276       SELECT Nvl(p_credit_unit,0) INTO l_conv_amount
2277   FROM sys.dual;
2278    END IF;
2279 
2280 --   dbms_output.put_line('p_conv_date = ' || p_conv_date);
2281 --   dbms_output.put_line('p_conv_type = ' || p_conv_type);
2282 --   dbms_output.put_line('l_conv_amount = ' || l_conv_amount);
2283 --   dbms_output.put_line('p_funcurr_code = '|| p_funcurr_code);
2284 --   dbms_output.put_line('p_repcurr_code = ' ||  p_repcurr_code);
2285 
2286    x_repcurr_amount :=
2287      gl_currency_api.convert_amount
2288      (x_from_currency => p_funcurr_code,
2289       x_to_currency   => p_repcurr_code,
2290       x_conversion_date => p_conv_date,
2291       x_conversion_type => p_conv_type,
2292       x_amount        => l_conv_amount
2293       );
2294 
2295 
2296 EXCEPTION
2297    WHEN NO_DATA_FOUND THEN
2298 --      dbms_output.put_line('no data found --2 ');
2299       FND_MESSAGE.SET_NAME('CN','CN_CRCVFT_NOT_EXIST');
2300       FND_MSG_PUB.Add;
2301       x_return_status := 'E';
2302 END convert_to_repcurr_report;
2303 
2304 
2305 
2306 --| -----------------------------------------------------------------------=
2307 --| Function Name :  g_miss_char
2308 --| Desc : function to return FND_API.g_miss_char
2309 --| ---------------------------------------------------------------------=
2310 FUNCTION g_miss_char RETURN VARCHAR2 IS
2311 BEGIN
2312    RETURN fnd_api.g_miss_char;
2313 END g_miss_char;
2314 
2315 --| -----------------------------------------------------------------------=
2316 --| Function Name :  g_miss_date
2317 --| Desc : function to return FND_API.g_miss_date
2318 --| ---------------------------------------------------------------------=
2319 FUNCTION g_miss_date RETURN DATE IS
2320 BEGIN
2321    RETURN fnd_api.g_miss_date;
2322 END g_miss_date;
2323 
2324 --| -----------------------------------------------------------------------=
2325 --| Function Name :  g_miss_num
2326 --| Desc : function to return FND_API.g_miss_num
2327 --| ---------------------------------------------------------------------=
2328 FUNCTION g_miss_num RETURN NUMBER IS
2329 BEGIN
2330    RETURN fnd_api.g_miss_num;
2331 END g_miss_num;
2332 
2333 --| -----------------------------------------------------------------------=
2334 --| Function Name :  g_miss_id
2335 --| Desc : function to return -99999999999999
2336 --| ---------------------------------------------------------------------=
2337 FUNCTION g_miss_id RETURN NUMBER IS
2338 BEGIN
2339    RETURN -99999999999999;
2340 END g_miss_id;
2341 
2342 --| -----------------------------------------------------------------------=
2343 --| Function Name :  g_false
2344 --| Desc : function to return FND_API.g_false
2345 --| ---------------------------------------------------------------------=
2346 FUNCTION g_false RETURN VARCHAR2 IS
2347 BEGIN
2348    RETURN fnd_api.g_false;
2349 END g_false;
2350 
2351 --| -----------------------------------------------------------------------=
2352 --| Function Name :  g_true
2353 --| Desc : function to return FND_API.g_true
2354 --| ---------------------------------------------------------------------=
2355 FUNCTION g_true RETURN VARCHAR2 IS
2356 BEGIN
2357    RETURN fnd_api.g_true;
2358 END g_true;
2359 
2360 --| -----------------------------------------------------------------------=
2361 --| Function Name :  g_valid_level_none
2362 --| Desc : function to return FND_API.G_VALID_LEVEL_NONE
2363 --| ---------------------------------------------------------------------=
2364 FUNCTION g_valid_level_none RETURN NUMBER IS
2365 BEGIN
2366    RETURN fnd_api.g_valid_level_none;
2367 END g_valid_level_none;
2368 
2369 --| -----------------------------------------------------------------------=
2370 --| Function Name :  g_valid_level_full
2371 --| Desc : function to return FND_API.G_VALID_LEVEL_FULL
2372 --| ---------------------------------------------------------------------=
2373 FUNCTION g_valid_level_full RETURN NUMBER IS
2374 BEGIN
2375    RETURN fnd_api.g_valid_level_full;
2376 END g_valid_level_full;
2377 
2378 
2379 
2380 
2381 --| -----------------------------------------------------------------------=
2382 --| Function Name :  generate code combinations
2383 --| Desc :
2384 --| ---------------------------------------------------------------------=
2385 PROCEDURE get_ccids
2386   (p_account_type IN varchar2,
2387    p_org_id       IN NUMBER,
2388    x_account_structure OUT NOCOPY varchar2,
2389    x_code_combinations OUT NOCOPY code_combination_tbl) IS
2390 
2391    kff        fnd_flex_key_api.flexfield_type;
2392    str        fnd_flex_key_api.structure_type;
2393    seg        fnd_flex_key_api.segment_type;
2394    seg_list   fnd_flex_key_api.segment_list;
2395    j          number;
2396    i          number;
2397    nsegs      number;
2398    segment_descr varchar2(2000);
2399    sql_stmt   varchar2(2000);
2400    l_chart_of_accounts_id gl_sets_of_books.chart_of_accounts_id%TYPE;
2401 
2402    l_counter NUMBER := 0;
2403    ccid     NUMBER;
2404    ccid_value VARCHAR2(2000);
2405    l_account_type    gl_code_combinations.account_type%type;
2406 
2407    TYPE curtype IS ref CURSOR;
2408    ccid_cur curtype;
2409 
2410 BEGIN
2411 
2412    SELECT chart_of_accounts_id
2413      INTO l_chart_of_accounts_id
2414      FROM gl_sets_of_books gsb,
2415      cn_repositories_all cr
2416      WHERE cr.set_of_books_id = gsb.set_of_books_id
2417      AND cr.org_id = p_org_id;
2418 
2419    fnd_flex_key_api.set_session_mode('customer_data');
2420    kff := fnd_flex_key_api.find_flexfield('SQLGL','GL#');
2421    str := fnd_flex_key_api.find_structure(kff, l_chart_of_accounts_id);
2422    fnd_flex_key_api.get_segments(kff, str, TRUE, nsegs, seg_list);
2423 
2424    -- The segments in the seg_list array are sorted in display order.
2425    -- i.e. sorted by segment number.
2426    sql_stmt := 'SELECT ';
2427    for i in 1..nsegs loop
2428     seg := fnd_flex_key_api.find_segment(kff, str, seg_list(i));
2429     segment_descr := segment_descr || seg.segment_name;
2430     sql_stmt := sql_stmt || seg.column_name;
2431     If i <> nsegs
2432     then
2433       segment_descr := segment_descr || str.segment_separator;
2434       sql_stmt := sql_stmt || '||'''||str.segment_separator||'''||';
2435     end if;
2436    end loop;
2437    x_account_structure := segment_descr;
2438    sql_stmt := sql_stmt ||
2439      ', code_combination_id, account_type '||
2440      ' FROM gl_code_combinations '||
2441      ' WHERE chart_of_accounts_id = :B1' ||
2442      ' AND enabled_flag = ''Y''';
2443 
2444 -- commented out by KS.
2445 -- Using Bind Variables
2446 -- ||l_chart_of_accounts_id||
2447 
2448    OPEN ccid_cur FOR sql_stmt using l_chart_of_accounts_id;
2449      LOOP
2450 
2451      ccid_value := null;
2452      ccid := null;
2453      l_account_type := null;
2454 
2455   FETCH ccid_cur INTO
2456          ccid_value, ccid,
2457          l_account_type;
2458   EXIT WHEN ccid_cur%notfound;
2459 
2460       IF l_account_type = p_account_type
2461        THEN
2462        x_code_combinations(l_counter).ccid   := ccid;
2463        x_code_combinations(l_counter).code_combination   :=  ccid_value;
2464          l_counter := l_counter + 1;
2465        END IF;
2466 
2467      END LOOP;
2468      CLOSE ccid_cur;
2469 END get_ccids;
2470 
2471 --| -----------------------------------------------------------------------=
2472 --| Function Name :  get code combination in display format
2473 --| Desc :
2474 --| ---------------------------------------------------------------------=
2475 PROCEDURE get_ccid_disp
2476   (p_ccid IN varchar2,
2477    p_org_id IN NUMBER,
2478    x_code_combination OUT NOCOPY varchar2) IS
2479 
2480    kff        fnd_flex_key_api.flexfield_type;
2481    str        fnd_flex_key_api.structure_type;
2482    seg        fnd_flex_key_api.segment_type;
2483    seg_list   fnd_flex_key_api.segment_list;
2484    j          number;
2485    i          number;
2486    nsegs      number;
2487    segment_descr varchar2(2000);
2488    sql_stmt   varchar2(2000);
2489    l_chart_of_accounts_id gl_sets_of_books.chart_of_accounts_id%TYPE;
2490 
2491    l_counter NUMBER := 0;
2492    ccid     NUMBER;
2493    ccid_value VARCHAR2(2000);
2494    l_account_type    gl_code_combinations.account_type%type;
2495 
2496    TYPE curtype IS ref CURSOR;
2497    ccid_cur curtype;
2498 
2499 BEGIN
2500 
2501    SELECT chart_of_accounts_id
2502      INTO l_chart_of_accounts_id
2503      FROM gl_sets_of_books gsb,
2504      cn_repositories_all cr
2505      WHERE cr.set_of_books_id = gsb.set_of_books_id
2506      AND org_id = p_org_id;
2507 
2508    fnd_flex_key_api.set_session_mode('customer_data');
2509    kff := fnd_flex_key_api.find_flexfield('SQLGL','GL#');
2510    str := fnd_flex_key_api.find_structure(kff, l_chart_of_accounts_id);
2511    fnd_flex_key_api.get_segments(kff, str, TRUE, nsegs, seg_list);
2512 
2513    -- The segments in the seg_list array are sorted in display order.
2514    -- i.e. sorted by segment number.
2515    sql_stmt := 'SELECT ';
2516    for i in 1..nsegs loop
2517     seg := fnd_flex_key_api.find_segment(kff, str, seg_list(i));
2518     segment_descr := segment_descr || seg.segment_name;
2519     sql_stmt := sql_stmt || seg.column_name;
2520     If i <> nsegs
2521     then
2522       segment_descr := segment_descr || str.segment_separator;
2523       sql_stmt := sql_stmt || '||'''||str.segment_separator||'''||';
2524     end if;
2525    end loop;
2526    sql_stmt := sql_stmt ||
2527      ', code_combination_id, account_type '||
2528      ' FROM gl_code_combinations '||
2529      ' WHERE code_combination_id = :B1';
2530 
2531 -- commented out by KS
2532 -- 09/28/01
2533 -- ||p_ccid;
2534 
2535    OPEN ccid_cur FOR sql_stmt using p_ccid;
2536      LOOP
2537 
2538      ccid_value := null;
2539      ccid := null;
2540      l_account_type := null;
2541 
2542   FETCH ccid_cur INTO
2543          ccid_value, ccid,
2544          l_account_type;
2545   EXIT WHEN ccid_cur%notfound;
2546 
2547        x_code_combination  :=  ccid_value;
2548          l_counter := l_counter + 1;
2549      END LOOP;
2550      CLOSE ccid_cur;
2551 END get_ccid_disp;
2552 
2553 
2554 --| -----------------------------------------------------------------------=
2555 --| Function Name :  get code combination in display format
2556 --| Desc :
2557 --| ---------------------------------------------------------------------=
2558 FUNCTION get_ccid_disp_func
2559   (p_ccid IN varchar2, p_org_id IN NUMBER ) RETURN VARCHAR2 IS
2560 
2561    kff        fnd_flex_key_api.flexfield_type;
2562    str        fnd_flex_key_api.structure_type;
2563    seg        fnd_flex_key_api.segment_type;
2564    seg_list   fnd_flex_key_api.segment_list;
2565    j          number;
2566    i          number;
2567    nsegs      number;
2568    segment_descr varchar2(2000);
2569    sql_stmt   varchar2(2000);
2570 
2571    l_code    Varchar2(4000);
2572 
2573 
2574    l_chart_of_accounts_id gl_sets_of_books.chart_of_accounts_id%TYPE;
2575 
2576    l_counter NUMBER := 0;
2577    ccid     NUMBER;
2578    ccid_value VARCHAR2(2000);
2579    l_account_type    gl_code_combinations.account_type%type;
2580 
2581    TYPE curtype IS ref CURSOR;
2582    ccid_cur curtype;
2583 
2584 BEGIN
2585 
2586    SELECT chart_of_accounts_id
2587      INTO l_chart_of_accounts_id
2588      FROM gl_sets_of_books gsb,
2589      cn_repositories_all cr
2590      WHERE cr.set_of_books_id = gsb.set_of_books_id
2591      AND org_id = p_org_id;
2592 
2593    fnd_flex_key_api.set_session_mode('customer_data');
2594    kff := fnd_flex_key_api.find_flexfield('SQLGL','GL#');
2595    str := fnd_flex_key_api.find_structure(kff, l_chart_of_accounts_id);
2596    fnd_flex_key_api.get_segments(kff, str, TRUE, nsegs, seg_list);
2597 
2598    -- The segments in the seg_list array are sorted in display order.
2599    -- i.e. sorted by segment number.
2600    sql_stmt := 'SELECT ';
2601    for i in 1..nsegs loop
2602     seg := fnd_flex_key_api.find_segment(kff, str, seg_list(i));
2603     segment_descr := segment_descr || seg.segment_name;
2604     sql_stmt := sql_stmt || seg.column_name;
2605     If i <> nsegs
2606     then
2607       segment_descr := segment_descr || str.segment_separator;
2608       sql_stmt := sql_stmt || '||'''||str.segment_separator||'''||';
2609     end if;
2610    end loop;
2611    sql_stmt := sql_stmt ||
2612      ', code_combination_id, account_type '||
2613      ' FROM gl_code_combinations '||
2614      ' WHERE code_combination_id =  :B1' ;
2615 
2616 -- commented out by KS
2617 -- 09/28/01
2618 -- ||p_ccid;
2619 
2620 
2621    OPEN ccid_cur FOR sql_stmt using p_ccid;
2622      LOOP
2623 
2624      ccid_value := null;
2625      ccid := null;
2626      l_account_type := null;
2627 
2628   FETCH ccid_cur INTO
2629          ccid_value, ccid,
2630          l_account_type;
2631   EXIT WHEN ccid_cur%notfound;
2632 
2633        l_code  :=  ccid_value;
2634          l_counter := l_counter + 1;
2635      END LOOP;
2636      CLOSE ccid_cur;
2637 
2638      return l_code;
2639 
2640 END get_ccid_disp_func;
2641 
2642 
2643 --| ---------------------------------------------------------------------+
2644 --| Function Name :  attribute_desc
2645 --| Desc : Pass in rule_id, rule_attribute_id
2646 --| ---------------------------------------------------------------------+
2647 FUNCTION  get_attribute_desc( p_rule_id NUMBER,
2648                             p_attribute_id NUMBER )
2649   RETURN VARCHAR2 IS
2650 
2651   l_desc  cn_rule_attributes_desc_v.descriptive_rule_attribute%TYPE;
2652 
2653 BEGIN
2654      SELECT descriptive_rule_attribute
2655        INTO l_desc
2656        FROM cn_rule_attributes_desc_v
2657        WHERE rule_id = p_rule_id
2658        AND   attribute_rule_id  = p_attribute_id ;
2659 
2660      RETURN l_desc;
2661 
2662 EXCEPTION
2663    WHEN no_data_found THEN
2664       RETURN NULL;
2665 END get_attribute_desc;
2666 
2667 
2668 --| ---------------------------------------------------------------------+
2669 --| Function Name :  rule_count
2670 --| Desc : Pass in rule_id
2671 --| ---------------------------------------------------------------------+
2672 FUNCTION  get_rule_count( p_rule_id NUMBER)
2673 
2674   RETURN NUMBER IS
2675 
2676   l_count  NUMBER := 1;
2677 
2678 BEGIN
2679      SELECT count(*)
2680        INTO l_count
2681        FROM cn_attribute_rules
2682        WHERE rule_id = p_rule_id;
2683 
2684      if l_count = 0 then
2685         l_count := 1;
2686     end if;
2687 
2688     RETURN l_count;
2689 
2690 EXCEPTION
2691    WHEN no_data_found THEN
2692       RETURN 1;
2693 END get_rule_count;
2694 
2695 -- ===========================================================================
2696 --   Function   : chk_Payrun_status_paid
2697 --   Description : Check for valid payrun_id, Status must be unpaid
2698 -- ===========================================================================
2699 FUNCTION chk_payrun_status_paid
2700   ( p_payrun_id             IN  NUMBER,
2701     p_loading_status         IN  VARCHAR2,
2702     x_loading_status         OUT NOCOPY VARCHAR2
2703     ) RETURN VARCHAR2 IS
2704 
2705        CURSOR get_payrun_status IS
2706           SELECT status, payrun_id
2707             FROM cn_payruns
2708             WHERE payrun_id = p_payrun_id;
2709 
2710        l_status cn_payruns.status%TYPE;
2711        l_payrun_id cn_payruns.payrun_id%TYPE;
2712 
2713 BEGIN
2714    --  Initialize API return status to success
2715    x_loading_status := p_loading_status ;
2716 
2717    -- Get Payrun Status
2718    OPEN get_payrun_status;
2719    FETCH get_payrun_status INTO l_status, l_payrun_id;
2720    CLOSE get_payrun_status;
2721 
2722    -- check payrun status, No operation can be done for PAID
2723    IF l_status <>  'UNPAID'  THEN
2724      IF fnd_msg_pub.check_msg_level (fnd_msg_pub.g_msg_lvl_error)
2725         THEN
2726          fnd_message.set_name('CN', 'CN_CANNOT_UPD_PAID_F_PAYRUN');
2727          fnd_msg_pub.add;
2728       END IF;
2729       x_loading_status := 'CN_CANNOT_UPD_PAID_F_PAYRUN';
2730       RETURN fnd_api.g_true;
2731    END IF;
2732 
2733    -- check payrun exists
2734    IF l_payrun_id  IS NULL THEN
2735       IF fnd_msg_pub.check_msg_level (fnd_msg_pub.g_msg_lvl_error)
2736         THEN
2737          fnd_message.set_name('CN', 'CN_PAYRUN_DOES_NOT_EXIST');
2738          fnd_msg_pub.add;
2739       END IF;
2740       x_loading_status := 'CN_PAYRUN_DOES_NOT_EXIST';
2741       RETURN fnd_api.g_true;
2742    END IF;
2743 
2744    RETURN fnd_api.g_false;
2745 
2746 END chk_payrun_status_paid;
2747 -- ===========================================================================
2748 --   Procedure   : Chk_hold_status
2749 --   Description : This procedure is used to check if the salesrep is on hold
2750 --         and valid salesrep ID is passed
2751 -- ===========================================================================
2752 FUNCTION chk_hold_status
2753   (
2754    p_salesrep_id            IN  NUMBER,
2755    p_org_id                 IN  NUMBER,
2756    p_loading_status         IN  VARCHAR2,
2757    x_loading_status         OUT NOCOPY VARCHAR2
2758    ) RETURN VARCHAR2 IS
2759 
2760       CURSOR get_hold_status IS
2761          SELECT hold_payment, salesrep_id
2762            FROM cn_salesreps
2763            WHERE salesrep_id = p_salesrep_id
2764 	     AND org_id      = p_org_id;
2765 
2766       l_status cn_payruns.status%TYPE;
2767       l_salesrep_id cn_salesreps.salesrep_id%TYPE;
2768 
2769 BEGIN
2770 
2771    x_loading_status := p_loading_status ;
2772 
2773    OPEN get_hold_status;
2774    FETCH get_hold_status INTO l_status,l_salesrep_id;
2775    CLOSE get_hold_status;
2776 
2777    IF l_status = 'Y' THEN
2778       IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
2779         THEN
2780          fnd_message.set_name('CN', 'CN_SRP_ON_HOLD');
2781          fnd_msg_pub.add;
2782       END IF;
2783       x_loading_status := 'CN_SRP_ON_HOLD';
2784       RETURN fnd_api.g_true;
2785    END IF;
2786 
2787    IF l_salesrep_id IS NULL THEN
2788       x_loading_status := 'CN_SRP_NOT_EXISTS';
2789      IF fnd_msg_pub.check_msg_level (fnd_msg_pub.g_msg_lvl_error)
2790         THEN
2791          fnd_message.set_name('CN', 'CN_SRP_NOT_EXISTS');
2792          fnd_msg_pub.add;
2793       END IF;
2794       x_loading_status := 'CN_SRP_NOT_EXISTS';
2795       RETURN fnd_api.g_true;
2796    END IF;
2797 
2798    RETURN fnd_api.g_false;
2799 END chk_hold_status;
2800 
2801 -- ===========================================================================
2802 --   Procedure   : Chk_srp_hold_status
2803 --   Description : This procedure is used to check if the salesrep is on hold
2804 --         and valid salesrep ID is passed
2805 -- ===========================================================================
2806 FUNCTION chk_srp_hold_status
2807   (
2808    p_salesrep_id            IN  NUMBER,
2809    p_org_id                 IN  NUMBER,
2810    p_loading_status         IN  VARCHAR2,
2811    x_loading_status         OUT NOCOPY VARCHAR2
2812    ) RETURN VARCHAR2 IS
2813 
2814       CURSOR get_hold_status IS
2815          SELECT hold_payment, salesrep_id
2816            FROM cn_salesreps
2817            WHERE salesrep_id = p_salesrep_id
2818 	     AND org_id = p_org_id;
2819 
2820       l_status cn_payruns.status%TYPE;
2821       l_salesrep_id cn_salesreps.salesrep_id%TYPE;
2822 
2823 BEGIN
2824 
2825    x_loading_status := p_loading_status ;
2826 
2827    OPEN get_hold_status;
2828    FETCH get_hold_status INTO l_status,l_salesrep_id;
2829    CLOSE get_hold_status;
2830 
2831    IF l_status = 'Y' THEN
2832       IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
2833         THEN
2834          fnd_message.set_name('CN', 'CN_SRP_ON_HOLD');
2835          fnd_msg_pub.add;
2836       END IF;
2837       x_loading_status := 'CN_SRP_ON_HOLD';
2838       RETURN fnd_api.g_true;
2839    END IF;
2840 
2841    IF l_salesrep_id IS NULL THEN
2842       x_loading_status := 'CN_SRP_NOT_EXISTS';
2843      IF fnd_msg_pub.check_msg_level (fnd_msg_pub.g_msg_lvl_error)
2844         THEN
2845          fnd_message.set_name('CN', 'CN_SRP_NOT_EXISTS');
2846          fnd_msg_pub.add;
2847       END IF;
2848       x_loading_status := 'CN_SRP_NOT_EXISTS';
2849       RETURN fnd_api.g_true;
2850    END IF;
2851 
2852    RETURN fnd_api.g_false;
2853 END chk_srp_hold_status;
2854 --| ---------------------------------------------------------------------+
2855 --   Function   : Get_pay_Element_ID(P_quota_id, p_salesrep_id, p_date)
2856 --| ---------------------------------------------------------------------+
2857 FUNCTION Get_pay_Element_ID
2858   (
2859    p_quota_id            IN  NUMBER,
2860    p_Salesrep_id         IN  cn_rs_salesreps.salesrep_id%TYPE,
2861    p_org_id              IN  NUMBER,
2862    p_date                IN  DATE
2863    ) RETURN NUMBER IS
2864 
2865 -- Bug 2875120 3/27/03
2866  CURSOR  /*+ ordered */ get_pay_element IS
2867       SELECT pay_element_type_id
2868   FROM cn_quota_pay_elements p,
2869 	cn_rs_salesreps s
2870 	WHERE p.quota_id    = p_quota_id
2871 	AND p_date between p.start_date and p.end_date
2872 	AND s.salesrep_id = p_salesrep_id
2873 	AND s.org_id      = p_org_id
2874 	AND nvl(s.status,'A') =  p.status;
2875 
2876   l_pay_element_type_id NUMBER;
2877   l_payroll_flag  Varchar2(01);
2878 
2879 
2880  BEGIN
2881     select nvl(payroll_flag,'N')
2882      into  l_payroll_flag
2883       from cn_repositories
2884      WHERE org_id = p_org_id;
2885 
2886     if l_payroll_flag = 'Y' THEN
2887       open  get_pay_element;
2888       fetch get_pay_element into l_pay_element_type_id;
2889       close get_pay_element;
2890     end if;
2891 
2892     RETURN l_pay_element_type_id;
2893 
2894  END;
2895 -- ===========================================================================
2896 -- Procedure   : check_duplicate_worksheet
2897 -- Description : Check Duplicate Work sheet for salesrep and role in payrun
2898 -- ===========================================================================
2899 FUNCTION chk_duplicate_worksheet
2900   ( p_payrun_id       IN  NUMBER,
2901     p_salesrep_id           IN  NUMBER,
2902     p_org_id                IN  NUMBER,
2903     p_loading_status         IN  VARCHAR2,
2904     x_loading_status         OUT NOCOPY VARCHAR2
2905     ) RETURN VARCHAR2  IS
2906 
2907  CURSOR get_worksheet IS
2908     SELECT 1
2909       FROM cn_payment_worksheets
2910       WHERE payrun_id = p_payrun_id
2911       AND salesrep_id = p_salesrep_id
2912       AND org_id      = p_org_id;
2913 
2914    l_found number;
2915 
2916 BEGIN
2917 
2918    x_loading_status := p_loading_status ;
2919    OPEN get_worksheet;
2920    FETCH get_worksheet INTO l_found;
2921    CLOSE get_worksheet;
2922    IF l_found = 1
2923      THEN
2924       --Error condition
2925       IF fnd_msg_pub.check_msg_level (fnd_msg_pub.g_msg_lvl_error)
2926 	THEN
2927          fnd_message.set_name('CN', 'CN_DUPLICATE_WORKSHEET');
2928          fnd_msg_pub.add;
2929       END IF;
2930       x_loading_status := 'CN_DUPLICATE_WORKSHEET';
2931       RAISE FND_API.G_EXC_ERROR;
2932    END IF;
2933    RETURN fnd_api.g_false;
2934 
2935 EXCEPTION
2936    WHEN FND_API.G_EXC_ERROR THEN
2937       RETURN fnd_api.g_true;
2938 END chk_duplicate_worksheet;
2939 
2940 -- ===========================================================================
2941 -- Procedure   : check_worksheet_status
2942 -- Description : Check Worksheet Status
2943 -- ===========================================================================
2944 FUNCTION chk_worksheet_status
2945   ( p_payrun_id       IN  NUMBER,
2946     p_salesrep_id           IN  NUMBER,
2947     p_org_id                IN  NUMBER,
2948     p_loading_status         IN  VARCHAR2,
2949     x_loading_status         OUT NOCOPY VARCHAR2
2950     ) RETURN VARCHAR2  IS
2951 
2952  CURSOR get_worksheet IS
2953     SELECT worksheet_status
2954       FROM cn_payment_worksheets
2955       WHERE payrun_id = p_payrun_id
2956       AND salesrep_id = p_salesrep_id
2957       AND org_id      = p_org_id
2958       AND quota_id   iS NULL;
2959 
2960 
2961    l_status Varchar2(30);
2962 
2963 BEGIN
2964 
2965    x_loading_status := p_loading_status ;
2966    OPEN get_worksheet;
2967    FETCH get_worksheet INTO l_status;
2968    CLOSE get_worksheet;
2969    IF l_status NOT IN ( 'UNPAID','PROCESSING' )
2970      THEN
2971       --Error condition
2972       IF fnd_msg_pub.check_msg_level (fnd_msg_pub.g_msg_lvl_error)
2973 	THEN
2974          fnd_message.set_name('CN', 'CN_WKSHT_CANNOT_BE_MODIFIED');
2975          fnd_msg_pub.add;
2976       END IF;
2977       x_loading_status := 'CN_WKSHT_CANNOT_BE_MODIFIED';
2978       RAISE FND_API.G_EXC_ERROR;
2979    END IF;
2980    RETURN fnd_api.g_false;
2981 
2982 EXCEPTION
2983    WHEN FND_API.G_EXC_ERROR THEN
2984       RETURN fnd_api.g_true;
2985 END chk_worksheet_status;
2986 
2987 --| ---------------------------------------------------------------------+
2988 --   Function   : Get_pay_Element_Name(P_element_type_id)
2989 --| ---------------------------------------------------------------------+
2990 FUNCTION Get_pay_Element_Name
2991   (
2992    p_element_type_id     IN  NUMBER
2993    ) RETURN VARCHAR2 IS
2994 
2995   Cursor get_element_name IS
2996    SELECT element_name
2997           FROM pay_element_types_f
2998    WHERE element_type_id = p_element_type_id;
2999 
3000    l_element_name pay_element_types_f.element_name%TYPE;
3001 
3002   BEGIN
3003 
3004     OPEN get_element_name;
3005     FETCH get_element_name into l_element_name;
3006     CLOSE get_element_name;
3007 
3008    RETURN l_element_name;
3009 
3010 EXCEPTION
3011    WHEN OTHERS THEN
3012    RETURN l_element_name;
3013 END get_pay_element_name;
3014 
3015 --| -----------------------------------------------------------------------+
3016 --| Function Name :  can_user_view_page()
3017 --| Desc : procedure to test if a HTML page is accessible to a user
3018 --| Return true if yes, else return false
3019 --| -----------------------------------------------------------------------+
3020 procedure can_user_view_page(p_page_name IN varchar2,
3021 			     x_return_status OUT NOCOPY varchar2) IS
3022    l_result boolean := false;
3023    funcName fnd_form_functions.function_name%TYPE ;  --varchar2(100);
3024 
3025    CURSOR l_function_csr  (p_name VARCHAR2)IS
3026      SELECT function_name
3027        FROM fnd_form_functions
3028        WHERE UPPER(web_html_call) like p_name;
3029 BEGIN
3030    x_return_status := 'N';
3031 
3032    IF p_page_name IS NULL THEN
3033     x_return_status := 'N';
3034    ELSE
3035     OPEN l_function_csr ((UPPER(p_page_name) || '%'));
3036     LOOP
3037       FETCH l_function_csr INTO funcName;
3038       EXIT WHEN l_function_csr%NOTFOUND;
3039 
3040       l_result := FND_FUNCTION.TEST (funcName, 'Y');
3041     IF (l_result = true) THEN
3042      x_return_status := 'Y';
3043      EXIT;
3044     ELSE
3045      x_return_status := 'N';
3046     END IF;
3047   END LOOP;
3048     CLOSE l_function_csr;
3049 
3050    END IF;
3051 END can_user_view_page;
3052 
3053 --| ---------------------------------------------------------------------+
3054 --|   Function   : Is_Payee(p_salesrep_id)
3055 --| Desc : Check if passed in salesrep is a Payee
3056 --| Return 1 if the passed in salesrep_id is a Payee; otherwise return 0
3057 --| ---------------------------------------------------------------------+
3058 
3059 FUNCTION Is_Payee( p_salesrep_id    IN     NUMBER,
3060 		   p_period_id      IN     NUMBER,
3061 		   p_org_id         IN     NUMBER) RETURN NUMBER IS
3062    l_exist NUMBER := 0;
3063 BEGIN
3064    l_exist := 0;
3065    BEGIN
3066       -- isPayee if assigned to srp in this period
3067       SELECT 1 INTO l_exist  FROM dual WHERE EXISTS
3068 	(SELECT 1
3069 	 FROM cn_srp_payee_assigns cnspay, cn_period_statuses cnps
3070 	 WHERE cnspay.payee_id = p_salesrep_id
3071 	 AND cnps.period_id = p_period_id
3072 	 AND cnps.org_id    = p_org_id
3073 	 AND cnspay.org_id  = p_org_id
3074 	 AND ((cnspay.start_date <= cnps.end_date)
3075 	      AND (cnps.start_date <= Nvl(cnspay.end_date,cnps.start_date)))
3076 	 );
3077 
3078       RETURN l_exist;
3079 
3080    EXCEPTION
3081       WHEN NO_DATA_FOUND THEN
3082    l_exist := 0;
3083          BEGIN
3084       -- isPayee if have Payee role in this period
3085       SELECT 1 INTO l_exist  FROM dual WHERE EXISTS
3086         (SELECT 1 FROM cn_srp_roles sr, cn_period_statuses cnps
3087          WHERE sr.salesrep_id = p_salesrep_id
3088          AND sr.role_id = 54
3089 	 AND sr.org_id = p_org_id
3090 	 AND cnps.org_id = p_org_id
3091          AND cnps.period_id = p_period_id
3092          AND ((sr.start_date <= cnps.end_date)
3093         AND (cnps.start_date <= Nvl(sr.end_date,cnps.start_date)))
3094          );
3095 
3096       RETURN l_exist;
3097    EXCEPTION
3098 	    WHEN NO_DATA_FOUND THEN
3099 	       RETURN 0;
3100 	 END;
3101    END;
3102 
3103 END Is_Payee;
3104 
3105 --| ---------------------------------------------------------------------+
3106 --|   Function   : Test_Function(p_function_name)
3107 --| Desc : Check if passed in function is allowed
3108 --| Return 1 if it is allowed; otherwise return 0
3109 --| ---------------------------------------------------------------------+
3110 
3111 FUNCTION Test_Function( p_function_name    IN     VARCHAR2) RETURN NUMBER IS
3112 BEGIN
3113    if fnd_function.test(p_function_name) THEN
3114       return 1;
3115     else return 0;
3116    end if;
3117 END test_function;
3118 
3119 
3120 
3121 FUNCTION  get_role_name_2 (period_id NUMBER,
3122                           -- payrun_id NUMBER,
3123                            salesrep_id NUMBER)
3124 RETURN cn_roles.name%TYPE IS
3125      l_role_name cn_roles.name%TYPE;
3126      l_role_str VARCHAR2(1000):= '';
3127      l_start_date DATE;
3128 
3129  CURSOR get_role_cursor(l_period_id NUMBER,
3130                             l_salesrep_id IN NUMBER)
3131    IS
3132    SELECT DISTINCT t.role_name role_name,
3133          assign.start_date
3134    FROM cn_srp_periods srp  ,
3135         cn_srp_plan_assigns assign,
3136         JTF_RS_ROLES_TL T         ,
3137         JTF_RS_ROLES_B B
3138   WHERE assign.srp_plan_assign_id(+)= srp.srp_plan_assign_id
3139     AND srp.period_id                   = l_period_id
3140     AND assign.role_id                  = B.role_id(+)
3141     AND srp.ORG_ID                      = assign.ORG_ID
3142     AND srp.salesrep_id                 = l_salesrep_id
3143     AND B.ROLE_ID                       = T.ROLE_ID
3144     AND T.LANGUAGE                      = userenv('LANG')
3145       -- AND srp.credit_type_id = -1000
3146     AND srp.quota_id <> -1000
3147     ORDER BY assign.start_date;
3148 
3149     /*SELECT distinct r.name role_name,assign.start_date
3150     FROM   cn_srp_periods srp,
3151        cn_srp_plan_assigns assign,
3152        cn_roles r
3153     WHERE assign.srp_plan_assign_id(+)= srp.srp_plan_assign_id
3154       AND srp.period_id	  = l_period_id
3155       AND assign.role_id  = r.role_id(+)
3156       AND srp.salesrep_id = l_salesrep_id
3157      -- AND srp.credit_type_id = -1000
3158       AND srp.quota_id <> -1000
3159     ORDER BY assign.start_date;*/
3160 
3161     --variable added for bug 6685748
3162     l_html_text varchar2(2000);
3163 BEGIN
3164  --Code added for bug 6685748
3165 -- l_html_text :='<HTML>';
3166 
3167  OPEN get_role_cursor(period_id,salesrep_id) ;
3168  LOOP
3169       FETCH get_role_cursor into l_role_name,l_start_date;
3170       EXIT WHEN get_role_cursor%NOTFOUND;
3171       l_role_str := l_role_str || l_role_name;
3172 	  --Code line added for bug 6685748
3173 	  l_role_str := l_role_str ||'<br>';
3174 
3175  END LOOP;
3176  --Code line added for bug 6685748
3177 l_html_text :='<HTML>'||l_role_str||'<\HTML>';
3178 RETURN l_html_text;
3179 
3180 EXCEPTION
3181    WHEN others THEN
3182       RETURN 'Error';
3183 END get_role_name_2;
3184 
3185 
3186 FUNCTION  get_role_name_3 (p_period_id NUMBER DEFAULT NULL,
3187                            p_salesrep_id NUMBER DEFAULT NULL,
3188                            p_payrun_id NUMBER DEFAULT NULL,
3189                            p_ORG_ID   NUMBER DEFAULT NULL,
3190                            populate NUMBER DEFAULT NULL)
3191 	RETURN  VARCHAR2 IS
3192 
3193 
3194 
3195 	  CURSOR C_GET_SALESREP_ID
3196 	  IS
3197 		SELECT salesrep_id
3198 		FROM cn_payment_worksheets cnw
3199 		WHERE cnw.payrun_id 	  = p_payrun_id
3200 		  AND cnw.org_id          = p_ORG_ID
3201 		  AND cnw.quota_id       IS NULL ;
3202 
3203 	  l_cnw_salesrep_id JTF_NUMBER_TABLE;
3204 
3205 	  CURSOR C_SRP_ASSIGN_ID
3206 	  IS
3207 	    SELECT /*+ leading(cnw,srp) use_nl(srp) */ DISTINCT
3208                    srp.salesrep_id ||'-' ||srp_plan_assign_id ||'-' ||srp.period_id
3209 	    FROM cn_srp_periods srp,
3210 	         (SELECT column_value SALESREP_ID FROM TABLE(CAST(l_cnw_salesrep_id AS JTF_NUMBER_TABLE))) cnw
3211 	    WHERE srp.period_id       = p_period_id
3212 	      AND srp.quota_id       <> -1000
3213 	      AND srp.org_id          = p_ORG_ID
3214 	      AND srp.salesrep_id     = cnw.SALESREP_ID;
3215 
3216 	  l_cnw_srp_salrep_id JTF_VARCHAR2_TABLE_2000;
3217 
3218 	  CURSOR get_role_cursor
3219 	  IS
3220 	    SELECT /*+ leading(cnw_srp,assign) use_nl(assign,rl) */ DISTINCT
3221                    cnw_srp.SALESREP_ID, cnw_srp.PERIOD_ID, RL.ROLE_NAME, ASSIGN.START_DATE
3222 	    FROM CN_SRP_PLAN_ASSIGNS assign ,
3223                  JTF_RS_ROLES_VL rl ,
3224 	         (SELECT TO_NUMBER(SUBSTR(column_value, 1, INSTR(column_value, '-', 1, 1) - 1 ) ) SALESREP_ID,
3225 	                 TO_NUMBER(SUBSTR(column_value , INSTR(column_value, '-', 1, 1) + 1,
3226                                     (INSTR(column_value, '-', 1, 2) - INSTR(column_value, '-', 1, 1))-1) ) PLANASSIGNID,
3227                          TO_NUMBER(SUBSTR(column_value , INSTR(column_value, '-', 1, 2) + 1 ,LENGTH(column_value) )) PERIOD_ID
3228 	            FROM TABLE(CAST(l_cnw_srp_salrep_id AS JTF_VARCHAR2_TABLE_2000))
3229                  ) cnw_srp
3230 	    WHERE assign.ORG_ID                = p_ORG_ID
3231 	      AND assign.srp_plan_assign_id(+) = cnw_srp.PLANASSIGNID
3232 	      AND assign.salesrep_id(+)        = cnw_srp.SALESREP_ID
3233 	      AND rl.role_id(+)                = assign.ROLE_ID
3234 	      AND rl.role_type_code            = 'SALES_COMP'
3235 	      ORDER BY assign.start_date;
3236 
3237 
3238 		l_salesrep_id_tbl 	JTF_NUMBER_TABLE;
3239 	    l_period_tbl 		JTF_NUMBER_TABLE;
3240 	    l_role_name_tbl 	JTF_VARCHAR2_TABLE_2000;
3241 	    l_start_date_tbl 	JTF_DATE_TABLE;
3242 	    l_sales_id_tbl 		JTF_NUMBER_TABLE;
3243 
3244 	    l_role_name_cache 	VARCHAR2(2000);
3245 	    l_html_text       	VARCHAR2(2000);
3246 	    l_role_str 		  	VARCHAR2(2000):= '';
3247 		l_sales_temp_num 	NUMBER;
3248 	    l_sales_perio_id 	NUMBER;
3249 		l_salrep_tmp  		NUMBER;
3250 	    l_rec_count 		PLS_INTEGER;
3251 	    l_start_date 		DATE;
3252 		l_found 			BOOLEAN;
3253 		l_salesrep_cache_info salesrep_cache_rec_type;
3254 
3255 	BEGIN
3256 
3257 	    IF populate IS NULL THEN
3258 	      IF g_salesrep_info_cache.EXISTS(p_salesrep_id) THEN
3259 	        l_salesrep_cache_info := g_salesrep_info_cache(p_salesrep_id);
3260 	        l_found               := l_salesrep_cache_info.period_id = p_period_id;
3261 			IF l_found
3262 			THEN
3263 				l_role_name_cache     := l_salesrep_cache_info.ROLE_NAME;
3264 			END IF;
3265 	      END IF;
3266 	    END IF;
3267 
3268 
3269 	    IF populate            =1
3270 		THEN
3271 	      l_salesrep_id_tbl   :=JTF_NUMBER_TABLE();
3272 	      l_period_tbl        :=JTF_NUMBER_TABLE();
3273 	      l_role_name_tbl     :=JTF_VARCHAR2_TABLE_2000();
3274 	      l_start_date_tbl    :=JTF_DATE_TABLE();
3275 	      l_sales_id_tbl      :=JTF_NUMBER_TABLE();
3276 	      l_cnw_salesrep_id   := JTF_NUMBER_TABLE();
3277 	      l_cnw_srp_salrep_id :=JTF_VARCHAR2_TABLE_2000();
3278 
3279   		  OPEN C_GET_SALESREP_ID;
3280 	      FETCH C_GET_SALESREP_ID BULK COLLECT INTO l_cnw_salesrep_id;
3281 	      CLOSE C_GET_SALESREP_ID;
3282 
3283 
3284 	      OPEN C_SRP_ASSIGN_ID;
3285 	      FETCH C_SRP_ASSIGN_ID BULK COLLECT INTO l_cnw_srp_salrep_id;
3286 	      CLOSE C_SRP_ASSIGN_ID;
3287 
3288 	      OPEN get_role_cursor;
3289 	      FETCH get_role_cursor BULK COLLECT
3290 	      INTO l_salesrep_id_tbl,
3291 			   l_period_tbl     ,
3292 	           l_role_name_tbl  ,
3293 	           l_start_date_tbl;
3294 	      CLOSE get_role_cursor;
3295 
3296 	      g_salesrep_info_cache.DELETE;
3297 	      l_sales_temp_num := -1;
3298 	      l_sales_perio_id := -1;
3299 	      l_rec_count      := l_salesrep_id_tbl.COUNT;
3300 
3301 	      if l_rec_count > 0
3302         then
3303 
3304 	      FOR i IN l_salesrep_id_tbl.FIRST..l_salesrep_id_tbl.LAST
3305 	      LOOP
3306 	        IF l_sales_temp_num  <>l_salesrep_id_tbl(i) THEN
3307 	          IF l_sales_temp_num = -1 OR l_sales_perio_id = -1 THEN
3308 	            l_sales_temp_num :=l_salesrep_id_tbl(i);
3309 	            l_sales_perio_id :=l_period_tbl(i);
3310 	          ELSE
3311 	            l_salesrep_cache_info.salesrep_id             :=l_salesrep_id_tbl(i-1);
3312 	            l_salesrep_cache_info.period_id               :=l_period_tbl(i-1);
3313 	            l_salesrep_cache_info.role_name               :=substr(l_role_str,1,length(l_role_str)-1);
3314 	            g_salesrep_info_cache(l_salesrep_id_tbl(i-1)) :=l_salesrep_cache_info;
3315 	            l_role_str                                    :=NULL;
3316 				l_sales_temp_num :=l_salesrep_id_tbl(i);
3317 	            l_sales_perio_id :=l_period_tbl(i);
3318 	          END IF;
3319 	        END IF;
3320 	        l_role_str                                    := l_role_str || l_role_name_tbl(i)||',';
3321 	        IF (i= l_rec_count) THEN
3322 	          l_salesrep_cache_info.salesrep_id           :=l_salesrep_id_tbl(i);
3323 	          l_salesrep_cache_info.period_id             :=l_period_tbl(i);
3324 	          l_salesrep_cache_info.role_name             :=substr(l_role_str,1,length(l_role_str)-1);
3325 	          g_salesrep_info_cache(l_salesrep_id_tbl(i)) :=l_salesrep_cache_info;
3326 	          l_role_str                                  :=NULL;
3327 	        END IF;
3328 	      END LOOP;
3329 	     END IF;
3330 	      l_role_name_cache := l_role_str;
3331 	    END IF; --if populate =1
3332   RETURN l_role_name_cache;
3333 END get_role_name_3;
3334 
3335 
3336 
3337 FUNCTION get_user(p_user_id NUMBER DEFAULT NULL,p_payrun_id NUMBER DEFAULT NULL)
3338     RETURN jtf_number_table IS
3339 
3340     CURSOR C_USER(l_user_id number,l_payrun_id number)
3341     is
3342      SELECT DISTINCT re2.user_id
3343       FROM jtf_rs_group_usages u2,
3344            jtf_rs_rep_managers m2,
3345            jtf_rs_resource_extns_vl re2,
3346            (SELECT DISTINCT m1.resource_id,
3347                             greatest(pr.start_date, m1.start_date_active) start_date,
3348                             least(pr.end_date, nvl(m1.end_date_active, pr.end_date)) end_date
3349               FROM jtf_rs_resource_extns re1,
3350                    cn_period_statuses    pr,
3351                    jtf_rs_group_usages   u1,
3352                    jtf_rs_rep_managers   m1
3353              WHERE re1.user_id = l_user_id --129941
3354                AND (pr.period_id, pr.org_id) =
3355                    (SELECT p.pay_period_id,
3356                            p.org_id
3357                       FROM cn_payruns p
3358                      WHERE p.payrun_id = l_payrun_id ) -- 852986
3359                AND u1.usage = 'COMP_PAYMENT'
3360                AND ((m1.start_date_active <= pr.end_date) AND
3361                    (pr.start_date <= nvl(m1.end_date_active, pr.start_date)))
3362                AND u1.group_id = m1.group_id
3363                AND m1.resource_id = re1.resource_id
3364                AND m1.parent_resource_id = m1.resource_id
3365                AND m1.hierarchy_type IN ('MGR_TO_MGR', 'REP_TO_REP')
3366                AND m1.category <> 'TBH') v3
3367      WHERE u2.usage = 'COMP_PAYMENT'
3368        AND u2.group_id = m2.group_id
3369        AND m2.parent_resource_id = v3.resource_id
3370        AND ((m2.start_date_active <= v3.end_date) AND
3371            (v3.start_date <= nvl(m2.end_date_active, v3.start_date)))
3372        AND m2.category <> 'TBH'
3373        AND m2.hierarchy_type IN ('MGR_TO_MGR', 'MGR_TO_REP', 'REP_TO_REP')
3374        AND m2.resource_id = re2.resource_id;
3375 
3376 
3377        l_user_tab jtf_number_table;
3378        l_user_id number;
3379        l_payrun_id number;
3380        l_found boolean;
3381 
3382 Begin
3383 
3384 --G_USER_TAB := jtf_number_table();
3385 
3386 l_found := FALSE;
3387 
3388 IF g_user_tab.COUNT > 0 THEN
3389       --dbms_output.put_line('Returning from cache');
3390 	     RETURN G_USER_TAB;
3391 	END IF;
3392 
3393 IF NOT l_found
3394 	THEN
3395  l_user_tab := jtf_number_table();
3396 
3397 OPEN c_user(p_user_id,p_payrun_id);
3398       FETCH c_user BULK COLLECT INTO l_user_tab;
3399       CLOSE c_user;
3400       G_USER_TAB:=L_USER_TAB;
3401 
3402       return l_user_tab;
3403 END IF;
3404 
3405 End;
3406 
3407 PROCEDURE get_user_info(p_user_id NUMBER DEFAULT NULL,p_payrun_id NUMBER DEFAULT NULL)
3408    is
3409     CURSOR C_USER(l_user_id number,l_payrun_id number)
3410     is
3411      SELECT DISTINCT re2.user_id
3412       FROM jtf_rs_group_usages u2,
3413            jtf_rs_rep_managers m2,
3414            jtf_rs_resource_extns_vl re2,
3415            (SELECT DISTINCT m1.resource_id,
3416                             greatest(pr.start_date, m1.start_date_active) start_date,
3417                             least(pr.end_date, nvl(m1.end_date_active, pr.end_date)) end_date
3418               FROM jtf_rs_resource_extns re1,
3419                    cn_period_statuses    pr,
3420                    jtf_rs_group_usages   u1,
3421                    jtf_rs_rep_managers   m1
3422              WHERE re1.user_id = l_user_id --129941
3423                AND (pr.period_id, pr.org_id) =
3424                    (SELECT p.pay_period_id,
3425                            p.org_id
3426                       FROM cn_payruns p
3427                      WHERE p.payrun_id = l_payrun_id ) -- 852986
3428                AND u1.usage = 'COMP_PAYMENT'
3429                AND ((m1.start_date_active <= pr.end_date) AND
3430                    (pr.start_date <= nvl(m1.end_date_active, pr.start_date)))
3431                AND u1.group_id = m1.group_id
3432                AND m1.resource_id = re1.resource_id
3433                AND m1.parent_resource_id = m1.resource_id
3434                AND m1.hierarchy_type IN ('MGR_TO_MGR', 'REP_TO_REP')
3435                AND m1.category <> 'TBH') v3
3436      WHERE u2.usage = 'COMP_PAYMENT'
3437        AND u2.group_id = m2.group_id
3438        AND m2.parent_resource_id = v3.resource_id
3439        AND ((m2.start_date_active <= v3.end_date) AND
3440            (v3.start_date <= nvl(m2.end_date_active, v3.start_date)))
3441        AND m2.category <> 'TBH'
3442        AND m2.hierarchy_type IN ('MGR_TO_MGR', 'MGR_TO_REP', 'REP_TO_REP')
3443        AND m2.resource_id = re2.resource_id;
3444 
3445        l_user_tab jtf_number_table;
3446 
3447 begin
3448 
3449  l_user_tab := jtf_number_table();
3450  G_USER_TAB := jtf_number_table();
3451 
3452       OPEN c_user(p_user_id,p_payrun_id);
3453       FETCH c_user BULK COLLECT INTO l_user_tab;
3454       CLOSE c_user;
3455   G_USER_TAB:=L_USER_TAB;
3456  -- dbms_output.put_line('Putting Inside  cache');
3457 
3458 end;
3459 
3460 
3461 END CN_API;