DBA Data[Home] [Help]

PACKAGE BODY: APPS.OKC_QA_DATA_INTEGRITY

Source


1 PACKAGE BODY OKC_QA_DATA_INTEGRITY AS
2 /* $Header: OKCRQADB.pls 120.3 2006/08/09 22:31:42 abkumar noship $ */
3 
4 	l_debug VARCHAR2(1) := NVL(FND_PROFILE.VALUE('AFLOG_ENABLED'),'N');
5 
6 --  G_DESCRIPTIVE_FLEXFIELD_NAME CONSTANT VARCHAR2(200) := 'OKC Rule Developer DF';    -- /striping/
7   G_DF_COUNT                   CONSTANT NUMBER(2)     := 15;
8   --
9   G_PACKAGE  Varchar2(33) := '  OKC_QA_DATA_INTEGRITY.';
10   G_MSG_NAME Varchar2(30);
11   G_LINE     Varchar2(4) := 'LINE';
12   G_TOKEN    Varchar2(30);
13   G_BULK_FETCH_LIMIT           CONSTANT NUMBER := 1000;
14   --
15 -- /striping/
16 p_rule_code   OKC_RULE_DEFS_B.rule_code%TYPE;
17 p_appl_id     OKC_RULE_DEFS_B.application_id%TYPE;
18 p_dff_name    OKC_RULE_DEFS_B.descriptive_flexfield_name%TYPE;
19 
20   PROCEDURE Set_QA_Message(p_chr_id IN OKC_K_LINES_V.chr_id%TYPE,
21                            p_cle_id IN OKC_K_LINES_V.id%TYPE,
22                            p_msg_name IN VARCHAR2,
23                            p_token1 IN VARCHAR2 DEFAULT NULL,
24                            p_token1_value IN VARCHAR2 DEFAULT NULL,
25                            p_token2 IN VARCHAR2 DEFAULT NULL,
26                            p_token2_value IN VARCHAR2 DEFAULT NULL,
27                            p_token3 IN VARCHAR2 DEFAULT NULL,
28                            p_token3_value IN VARCHAR2 DEFAULT NULL,
29                            p_token4 IN VARCHAR2 DEFAULT NULL,
30                            p_token4_value IN VARCHAR2 DEFAULT NULL) IS
31     l_line Varchar2(200);
32     l_token1_value Varchar2(200) := p_token1_value;
33     l_token2_value Varchar2(200) := p_token2_value;
34     l_token3_value Varchar2(200) := p_token3_value;
35     l_token4_value Varchar2(200) := p_token4_value;
36     l_return_status Varchar2(3);
37   BEGIN
38     If p_cle_id Is Not Null Then
39       l_line := okc_contract_pub.get_concat_line_no(p_cle_id,
40                                                     l_return_status);
41       If p_token1 = g_line Then
42         l_token1_value := l_line;
43       Elsif p_token2 = g_line Then
44         l_token2_value := l_line;
45       Elsif p_token3 = g_line Then
46         l_token3_value := l_line;
47       Elsif p_token4 = g_line Then
48         l_token4_value := l_line;
49       End If;
50     End If;
51 
52     OKC_API.set_message(
53                  p_app_name     => G_APP_NAME,
54                  p_msg_name     => p_msg_name,
55                  p_token1       => p_token1,
56                  p_token1_value => l_token1_value,
57                  p_token2       => p_token2,
58                  p_token2_value => l_token2_value,
59                  p_token3       => p_token3,
60                  p_token3_value => l_token3_value,
61                  p_token4       => p_token4,
62                  p_token4_value => l_token4_value);
63   END;
64   --
65   -- Start of comments
66   --
67   -- Procedure Name  : check_art_compatible
68   -- Description     :
69   -- Business Rules  :
70   -- Parameters      :
71   -- Version         : 1.0
72   -- End of comments
73 
74   PROCEDURE check_art_compatible(
75     x_return_status            OUT NOCOPY VARCHAR2,
76     p_chr_id                   IN  NUMBER
77   ) IS
78 
79   cursor c1 is
80   select ID,SAV_SAE_ID,NAME
81   from okc_k_articles_v
82   where dnz_chr_id = p_chr_id
83   and chr_id = p_chr_id
84   and cat_type='STA';
85 
86   r1 c1%ROWTYPE;
87 
88   l_id number;
89   p_sae_id number;
90   l_name varchar2(150);
91 
92   Cursor l_catv_csr Is
93   SELECT 'E'
94   FROM okc_k_articles_b
95   WHERE SAV_SAE_ID in (
96 	SELECT SAE_ID from OKC_STD_ART_INCMPTS_V
97 	WHERE SAE_ID_FOR = p_sae_id
98 	UNION
99 	SELECT SAE_ID_FOR from OKC_STD_ART_INCMPTS_V
100 	WHERE SAE_ID = p_sae_id
101 	)
102 	AND DNZ_CHR_ID = p_chr_id
103 	AND CHR_ID = p_chr_id
104 	AND ID <> l_id;
105 l_return_status varchar2(1):='S';
106    --
107    l_proc varchar2(72) := g_package||'check_art_compatible';
108    --
109 BEGIN
110 
111   IF (l_debug = 'Y') THEN
112      okc_debug.Set_Indentation(l_proc);
113      okc_debug.Log('10: Entering ',2);
114   END IF;
115 
116   x_return_status := 'S';
117   FOR r1 IN c1 LOOP
118     l_id := r1.ID;
119     p_sae_id := r1.SAV_SAE_ID;
120     l_name := r1.NAME;
121 --
122     Open l_catv_csr;
123     Fetch l_catv_csr Into l_return_status;
124     Close l_catv_csr;
125     if (l_return_status<>'S') then
126       x_return_status := l_return_status;
127       OKC_API.set_message(
128         p_app_name     => G_APP_NAME,
129         p_msg_name     => 'OKC_INCOMP_ARTICLE_EXISTS',
130         p_token1       => 'VALUE1',
131         p_token1_value => l_name);
132     end if;
133   END LOOP;
134   IF x_return_status = OKC_API.G_RET_STS_SUCCESS THEN
135       OKC_API.set_message(
136         p_app_name      => G_APP_NAME,
137         p_msg_name      => G_QA_SUCCESS);
138   END IF;
139 
140   IF (l_debug = 'Y') THEN
141      okc_debug.Log('1000: Leaving ',2);
142      okc_debug.Reset_Indentation;
143   END IF;
144 exception
145   WHEN OTHERS THEN
146     IF (l_debug = 'Y') THEN
147        okc_debug.Log('2000: Leaving ',2);
148        okc_debug.Reset_Indentation;
149     END IF;
150     if c1%ISOPEN then
151       close c1;
152     end if;
153     OKC_API.SET_MESSAGE(
154       p_app_name        => G_APP_NAME,
155       p_msg_name        => G_UNEXPECTED_ERROR,
156       p_token1	        => G_SQLCODE_TOKEN,
157       p_token1_value    => SQLCODE,
158       p_token2          => G_SQLERRM_TOKEN,
159       p_token2_value    => SQLERRM);
160     x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
161 end check_art_compatible;
162 
163   -- Start of comments
164   --
165   -- Procedure Name  : check_required_values
166   -- Description     :
167   -- Business Rules  :
168   -- Parameters      :
169   -- Version         : 1.0
170   -- End of comments
171 
172   PROCEDURE check_required_values(
173     x_return_status            OUT NOCOPY VARCHAR2,
174     p_chr_id                   IN  NUMBER
175   ) IS
176 
177     l_return_status	VARCHAR2(1) := OKC_API.G_RET_STS_SUCCESS;
178     l_dummy VARCHAR2(1) := '?';
179     l_count NUMBER := 0;
180     l_row_notfound BOOLEAN;
181     l_token VARCHAR2(2000);
182 
183     CURSOR l_clev_csr IS
184     SELECT RTRIM(RTRIM(line_number) || ', ' || RTRIM(lsev.name) || ' ' ||
185            RTRIM(clev.name)) "LINE_NAME", currency_code,
186            clev.lse_id, --bug 2398639
187            clev.cle_id --bug 2398639
188       FROM OKC_LINE_STYLES_V lsev,
189            OKC_K_LINES_V clev
190      WHERE lsev.id = clev.lse_id
191        AND clev.dnz_chr_id = p_chr_id
192 	   AND clev.date_cancelled is NULL;  --changes [llc]--
193 
194 
195     --l_clev_rec l_clev_csr%ROWTYPE;
196 
197     TYPE chr15_tbl_type IS TABLE OF okc_k_lines_v.currency_code%TYPE INDEX BY BINARY_INTEGER;
198     TYPE chr450_tbl_type IS TABLE OF VARCHAR2(450) INDEX BY BINARY_INTEGER;
199     TYPE num_tbl_type IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
200 
201     l_line_name_tbl      chr450_tbl_type;
202     l_currency_code_tbl  chr15_tbl_type;
203     l_lse_id_tbl         num_tbl_type;
204     l_cle_id_tbl         num_tbl_type;
205 
206 
207     CURSOR l_ctc_csr (p_cpl_id NUMBER) IS
208       SELECT ctc.JTOT_OBJECT1_CODE, ctc.OBJECT1_ID1, ctc.OBJECT1_ID2,
209              fnd.MEANING
210         FROM FND_LOOKUPS fnd,
211              OKC_CONTACTS ctc
212        WHERE fnd.LOOKUP_CODE = ctc.cro_code
213          AND fnd.LOOKUP_TYPE = 'OKC_CONTACT_ROLE'
214          AND ctc.cpl_id = p_cpl_id;
215     l_ctc_rec l_ctc_csr%ROWTYPE;
216 
217     CURSOR l_cpl1_csr IS
218       SELECT cpl.ID, cpl.JTOT_OBJECT1_CODE, cpl.OBJECT1_ID1, cpl.OBJECT1_ID2,
219              fnd.MEANING, cpl.rle_code, cpl.chr_id, cpl.cle_id
220         FROM FND_LOOKUPS fnd,
221              OKC_K_PARTY_ROLES_B cpl
222        WHERE fnd.LOOKUP_CODE = cpl.rle_code
223          AND fnd.LOOKUP_TYPE = 'OKC_ROLE'
224          AND cpl.dnz_chr_id  = p_chr_id;
225     l_cpl1_rec l_cpl1_csr%ROWTYPE;
226 
227     -- Do not use chr_id in the where clause, this column is not indexed.
228     CURSOR l_cpl_csr IS
229       SELECT count(distinct RLE_CODE)
230         FROM OKC_K_PARTY_ROLES_B cpl
231        WHERE cpl.dnz_chr_id = p_chr_id
232        	 AND cpl.cle_id is NULL;
233 
234 
235     CURSOR l_chrv_csr IS
236       SELECT chrv.*, sub.cls_code
237         FROM OKC_K_HEADERS_B chrv,
238              OKC_SUBCLASSES_B sub
239        WHERE chrv.id = p_chr_id
240 	 AND sub.code = chrv.scs_code;
241     l_chrv_rec l_chrv_csr%ROWTYPE;
242 
243     CURSOR l_cle_csr(p_id okc_k_lines_b.id%TYPE) IS
244       SELECT cle.chr_id
245         FROM OKC_K_LINES_B cle
246        WHERE cle.id = p_id;
247     l_cle_rec l_cle_csr%ROWTYPE;
248 
249     CURSOR l_chr_csr IS
250       SELECT 'x'
251         FROM OKC_K_PARTY_ROLES_B
252        WHERE dnz_chr_id  = p_chr_id
253          AND chr_id  = p_chr_id
254          AND rle_code = l_cpl1_rec.rle_code
255          AND jtot_object1_code = l_cpl1_rec.jtot_object1_code
256          AND object1_id1 = l_cpl1_rec.object1_id1
257          AND object1_id2 = l_cpl1_rec.object1_id2;
258  --bug 2398639
259      CURSOR l_ph_can_rule(b_chr_id number) IS
260      SELECT 'Y'
261      FROM okc_rule_groups_b    rgp
262          ,okc_rules_b          rul
263      WHERE rgp.dnz_chr_id   = b_chr_id
264      AND rgp.cle_id IS NULL
265      AND rul.rgp_id         = rgp.id
266      AND rul.rule_information_category = 'CAN';
267 --end bug 2398639
268    --
269    l_proc varchar2(72) := g_package||'check_required_values';
270    l_line Varchar2(200);
271    l_can_found varchar2(1) :='N'; -- bug 2398639
272    --/rules migration/
273    l_func_curr_code  VARCHAR2(30);
274    --
275   BEGIN
276 
277   IF (l_debug = 'Y') THEN
278      okc_debug.Set_Indentation(l_proc);
279      okc_debug.Log('10: Entering ',2);
280   END IF;
281 
282     -- initialize return status
283     x_return_status := OKC_API.G_RET_STS_SUCCESS;
284 
285     -- fetch the contract header information
286     OPEN  l_chrv_csr;
287     FETCH l_chrv_csr INTO l_chrv_rec;
288     CLOSE l_chrv_csr;
289 
290     -- check required data for contract header
291     IF (l_chrv_rec.BUY_OR_SELL IS NULL) THEN
292       OKC_API.set_message(
293         p_app_name     => G_APP_NAME,
294         p_msg_name     => 'OKC_QA_INTENT_REQUIRED');
295 
296       -- notify caller of an error
297       x_return_status := OKC_API.G_RET_STS_ERROR;
298     END IF;
299     IF (l_chrv_rec.CURRENCY_CODE IS NULL) THEN
300       OKC_API.set_message(
301         p_app_name     => G_APP_NAME,
302         p_msg_name     => 'OKC_QA_CURRENCY_REQUIRED');
303 
304       -- notify caller of an error
305       x_return_status := OKC_API.G_RET_STS_ERROR;
306     END IF;
307     IF (l_chrv_rec.ISSUE_OR_RECEIVE IS NULL) THEN
308       OKC_API.set_message(
309         p_app_name     => G_APP_NAME,
310         p_msg_name     => 'OKC_QA_PERSPECTIVE_REQUIRED');
311 
312       -- notify caller of an error
313       x_return_status := OKC_API.G_RET_STS_ERROR;
314     END IF;
315 
316     -- Check that at least 2 different parties have been attached
317     -- to the contract header.
318     -- get party count
319     OPEN  l_cpl_csr;
320     FETCH l_cpl_csr INTO l_count;
321     CLOSE l_cpl_csr;
322 
323     -- There must be 2 distinct party roles defined at the header level
324     IF (l_count < 2) THEN
325       OKC_API.set_message(
326         p_app_name      => G_APP_NAME,
327         p_msg_name      => 'OKC_QA_PARTY_COUNT');
328       -- notify caller of an error
329       x_return_status := OKC_API.G_RET_STS_ERROR;
330     END IF;
331     IF (l_chrv_rec.TEMPLATE_YN = 'N') THEN
332       -- Check all of the parties attached to the contract and contract
333       -- lines to make sure that all integration information is supplied
334       OPEN  l_cpl1_csr;
335       LOOP
336         FETCH l_cpl1_csr INTO l_cpl1_rec;
337         EXIT WHEN l_cpl1_csr%NOTFOUND;
338         IF (l_cpl1_rec.JTOT_OBJECT1_CODE IS NULL OR
339             l_cpl1_rec.OBJECT1_ID1 IS NULL OR
340             l_cpl1_rec.OBJECT1_ID2 IS NULL) THEN
341 
342           If l_cpl1_rec.chr_id Is Not Null Then
343             g_msg_name := 'OKC_QA_K_CPL_MISSING';
344             g_token := Null;
345           Else
346             g_msg_name := 'OKC_QA_KL_CPL_MISSING';
347             g_token := g_line;
348           End If;
349           Set_QA_Message(p_chr_id => l_cpl1_rec.chr_id,
350                          p_cle_id => l_cpl1_rec.cle_id,
351                          p_msg_name => g_msg_name,
352                          p_token1 => 'PARTY',
353                          p_token1_value => l_cpl1_rec.meaning,
354                          p_token2 => g_token);
355 
356           -- notify caller of an error
357           x_return_status := OKC_API.G_RET_STS_ERROR;
358         END IF;
359         OPEN  l_ctc_csr (l_cpl1_rec.id);
360         LOOP
361           FETCH l_ctc_csr INTO l_ctc_rec;
362           EXIT WHEN l_ctc_csr%NOTFOUND;
363           IF (l_ctc_rec.JTOT_OBJECT1_CODE IS NULL OR
364               l_ctc_rec.OBJECT1_ID1 IS NULL OR
365               l_ctc_rec.OBJECT1_ID2 IS NULL) THEN
366             If l_cpl1_rec.chr_id Is Not Null Then
367               g_msg_name := 'OKC_QA_K_CTC_MISSING';
368               g_token := Null;
369             Else
370               g_msg_name := 'OKC_QA_KL_CTC_MISSING';
371               g_token := g_line;
372             End If;
373             Set_QA_Message(p_chr_id => l_cpl1_rec.chr_id,
374                            p_cle_id => l_cpl1_rec.cle_id,
375                            p_msg_name => g_msg_name,
376                            p_token1 => 'CONTACT',
377                            p_token1_value => l_ctc_rec.meaning,
378                            p_token2 => 'PARTY',
379                            p_token2_value => l_cpl1_rec.meaning,
380                            p_token3 => g_token);
381 
382             -- notify caller of an error
383             x_return_status := OKC_API.G_RET_STS_ERROR;
384           END IF;
385         END LOOP;
386         CLOSE l_ctc_csr;
387       END LOOP;
388       CLOSE l_cpl1_csr;
389     END IF; -- template_yn = 'N'
390 
391     -- Check that the currency on the Contract Line
392     -- is the same as the contract header.
393     /*******
394     OPEN  l_clev_csr;
395     LOOP
396       FETCH l_clev_csr INTO l_clev_rec;
397       EXIT WHEN l_clev_csr%NOTFOUND;
398       IF (l_clev_rec.CURRENCY_CODE IS NULL) THEN
399         OKC_API.set_message(
400           p_app_name     => G_APP_NAME,
401           p_msg_name     => 'OKC_REQUIRED_LINE_CURRENCY',
402           p_token1       => 'LINE_NAME',
403           p_token1_value => l_clev_rec.line_name);
404 
405         -- notify caller of an error
406         x_return_status := OKC_API.G_RET_STS_ERROR;
407       ELSIF l_clev_rec.currency_code <> l_chrv_rec.currency_code THEN
408         OKC_API.set_message(
409           p_app_name     => G_APP_NAME,
410           p_msg_name     => G_INVALID_LINE_CURRENCY,
411           p_token1       => 'LINE_NAME',
412           p_token1_value => l_clev_rec.line_name);
413         -- notify caller of an error
414         x_return_status := OKC_API.G_RET_STS_ERROR;
415       END IF;
416       --bug 2398639     Check if Its price hold top-line then Contract header must have a CAN rule.
417       IF l_clev_rec.lse_id=61 and l_clev_rec.cle_id is null and  l_chrv_rec.BUY_OR_SELL='S' THEN
418 
419           OPEN l_ph_can_rule(p_chr_id);
420           FETCH l_ph_can_rule into l_can_found;
421           IF l_ph_can_rule%NOTFOUND THEN
422              OKC_API.set_message(p_app_name   => g_app_name, --OKC
423                                  p_msg_name   => 'OKC_NO_PRICE_HOLD_CAN');
424               x_return_status := OKC_API.G_RET_STS_ERROR;
425 
426           END IF;
427           CLOSE l_ph_can_rule;
428       END IF;
429      -- bug 2398639
430     END LOOP;
431     CLOSE l_clev_csr;
432     *******/
433 
434     --bug 5442886
435     OPEN  l_clev_csr;
436     LOOP
437       FETCH l_clev_csr BULK COLLECT INTO l_line_name_tbl, l_currency_code_tbl,
438                                          l_lse_id_tbl, l_cle_id_tbl LIMIT G_BULK_FETCH_LIMIT;
439 
440       EXIT WHEN l_line_name_tbl.COUNT = 0;
441 
442       FOR i IN l_line_name_tbl.FIRST..l_line_name_tbl.LAST LOOP
443 
444          IF (l_currency_code_tbl(i) IS NULL) THEN
445            OKC_API.set_message(
446              p_app_name     => G_APP_NAME,
447              p_msg_name     => 'OKC_REQUIRED_LINE_CURRENCY',
448              p_token1       => 'LINE_NAME',
449              p_token1_value => l_line_name_tbl(i));
450 
451            -- notify caller of an error
452            x_return_status := OKC_API.G_RET_STS_ERROR;
453          ELSIF l_currency_code_tbl(i) <> l_chrv_rec.currency_code THEN
454            OKC_API.set_message(
455              p_app_name     => G_APP_NAME,
456              p_msg_name     => G_INVALID_LINE_CURRENCY,
457              p_token1       => 'LINE_NAME',
458              p_token1_value => l_line_name_tbl(i));
459            -- notify caller of an error
460            x_return_status := OKC_API.G_RET_STS_ERROR;
461          END IF;
462          --bug 2398639     Check if Its price hold top-line then Contract header must have a CAN rule.
463          IF l_lse_id_tbl(i)=61 and l_cle_id_tbl(i) is null and  l_chrv_rec.BUY_OR_SELL='S' THEN
464 
465              OPEN l_ph_can_rule(p_chr_id);
466              FETCH l_ph_can_rule into l_can_found;
467              IF l_ph_can_rule%NOTFOUND THEN
468                 OKC_API.set_message(p_app_name   => g_app_name, --OKC
469                                     p_msg_name   => 'OKC_NO_PRICE_HOLD_CAN');
470                  x_return_status := OKC_API.G_RET_STS_ERROR;
471 
472              END IF;
473              CLOSE l_ph_can_rule;
474          END IF;
475         -- bug 2398639
476       END LOOP;
477 
478     END LOOP;
479     CLOSE l_clev_csr;
480 
481 
482 --/Rules Migration/
483 --For non-okc,oko contracts check conversion data here
484     If l_chrv_rec.application_id not in (510,871) Then
485       l_func_curr_code := OKC_CURRENCY_API.GET_OU_CURRENCY(l_chrv_rec.authoring_org_id);
486    ---
487       IF l_chrv_rec.currency_code <> l_func_curr_code Then
488         If (l_chrv_rec.conversion_type is null or
489           l_chrv_rec.conversion_rate is null or
490           l_chrv_rec.conversion_rate_date is null)
491         Then
492           OKC_API.set_message(
493           p_app_name     => G_APP_NAME,
494           p_msg_name     => 'OKC_QA_CONVERSION_DATA');
495 
496          --raise error message
497           x_return_status := OKC_API.G_RET_STS_ERROR;
498         End If;
499       End If;
500     End If;
501 ---/Rules Migration/
502 
503     IF x_return_status = OKC_API.G_RET_STS_SUCCESS THEN
504       OKC_API.set_message(
505         p_app_name      => G_APP_NAME,
506         p_msg_name      => G_QA_SUCCESS);
507     END IF;
508 
509   IF (l_debug = 'Y') THEN
510      okc_debug.Log('1000: Leaving ',2);
511      okc_debug.Reset_Indentation;
512   END IF;
513   EXCEPTION
514   WHEN G_EXCEPTION_HALT_VALIDATION THEN
515     IF (l_debug = 'Y') THEN
516        okc_debug.Log('2000: Leaving ',2);
517        okc_debug.Reset_Indentation;
518     END IF;
519     -- no processing necessary; validation can continue with next column
520     NULL;
521   WHEN OTHERS THEN
522     IF (l_debug = 'Y') THEN
523        okc_debug.Log('3000: Leaving ',2);
524        okc_debug.Reset_Indentation;
525     END IF;
526     -- store SQL error message on message stack
527     OKC_API.SET_MESSAGE(
528       p_app_name        => G_APP_NAME,
529       p_msg_name        => G_UNEXPECTED_ERROR,
530       p_token1	        => G_SQLCODE_TOKEN,
531       p_token1_value    => SQLCODE,
532       p_token2          => G_SQLERRM_TOKEN,
533       p_token2_value    => SQLERRM);
534     -- notify caller of an error as UNEXPETED error
535     x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
536     -- verify that cursor was closed
537     IF l_chrv_csr%ISOPEN THEN
538       CLOSE l_chrv_csr;
539     END IF;
540     IF l_cpl_csr%ISOPEN THEN
541       CLOSE l_cpl_csr;
542     END IF;
543     IF l_cpl1_csr%ISOPEN THEN
544       CLOSE l_cpl1_csr;
545     END IF;
546     IF l_ctc_csr%ISOPEN THEN
547       CLOSE l_ctc_csr;
548     END IF;
549     IF l_clev_csr%ISOPEN THEN
550       CLOSE l_clev_csr;
551     END IF;
552   END check_required_values;
553 --
554   -- Start of comments
555   --
556   -- Procedure Name  : check_rule_values
557   -- Description     :
558   -- Business Rules  :
559   -- Parameters      :
560   -- Version         : 1.0
561   -- End of comments
562 
563   PROCEDURE check_rule_values(
564     x_return_status            OUT NOCOPY VARCHAR2,
565     p_rul_rec                  IN  OKC_RULES_B%ROWTYPE,
566     p_rgd_code                 IN  OKC_RULE_GROUPS_B.rgd_code%TYPE,
567     p_rgp_id                   IN  OKC_RULE_GROUPS_B.id%TYPE,
568     p_chr_id                   IN  OKC_RULE_GROUPS_B.chr_id%TYPE,
569     p_cle_id                   IN  OKC_RULE_GROUPS_B.cle_id%TYPE,
570     p_cls_code                 IN  OKC_SUBCLASSES_B.CLS_CODE%TYPE
571   ) IS
572 
573     CURSOR l_cti_csr IS
574       SELECT 'x'
575         FROM OKC_COVER_TIMES cti
576        WHERE cti.rul_id = p_rul_rec.id;
577 
578     CURSOR l_ril_csr IS
579       SELECT 'x'
580         FROM OKC_REACT_INTERVALS ril
581        WHERE ril.rul_id = p_rul_rec.id;
582 
583     CURSOR l_rgr_csr IS
584       -- SELECT NVL(rgr.optional_yn, 'N')
585       SELECT decode(sign(nvl(rgr.min_cardinality, 0)), 1, 'N', 'Y')
586         FROM OKC_RG_DEF_RULES rgr
587        WHERE rgr.rdf_code = p_rul_rec.rule_information_category
588          AND rgr.rgd_code = p_rgd_code;
589 
590 /* -- /striping/
591     CURSOR l_rul_csr IS
592       SELECT fnd.MEANING
593         FROM FND_LOOKUPS fnd
594        WHERE fnd.LOOKUP_CODE = p_rul_rec.RULE_INFORMATION_CATEGORY
595          AND fnd.LOOKUP_TYPE = 'OKC_RULE_DEF';
596 */
597 -- /striping/
598     CURSOR l_rul_csr IS
599       SELECT MEANING
600         FROM okc_rule_defs_v
601        WHERE RULE_CODE = p_rul_rec.RULE_INFORMATION_CATEGORY;
602 
603 --    l_rule_def FND_LOOKUPS.MEANING%TYPE;   -- /striping/
604     l_rule_def okc_rule_defs_v.MEANING%TYPE;
605 
606 
607     l_dummy VARCHAR2(1);
608     l_optional_yn OKC_RG_DEF_RULES.OPTIONAL_YN%TYPE;
609 
610     l_token VARCHAR2(2000);
611     l_return_status	VARCHAR2(1) := OKC_API.G_RET_STS_SUCCESS;
612     TYPE l_info_type IS REF CURSOR;
613     l_info_csr             l_info_type;
614     sql_stmt               VARCHAR2(2000);
615     l_end_user_column_name FND_DESCR_FLEX_COL_USAGE_VL.END_USER_COLUMN_NAME%TYPE;
616     l_rule_information     OKC_RULES_V.RULE_INFORMATION1%TYPE;
617     l_flex_value_set_id    FND_DESCR_FLEX_COL_USAGE_VL.FLEX_VALUE_SET_ID%TYPE;
618     l_required_flag        FND_DESCR_FLEX_COL_USAGE_VL.REQUIRED_FLAG%TYPE;
619 
620     l_missing_values VARCHAR2(1) := 'N';
621     l_all_must_be_present BOOLEAN := False;
622 
623     l_adv_pricing_profile  VARCHAR2(10) := 'N';
624     l_adv_pricing_warn     VARCHAR2(10) := 'N';
625 
626 -- skekkar # 1586976
627 --    cursor l_flex_csr(p_rule_cat varchar2, p_attribute varchar2) is      -- /striping/
628     cursor l_flex_csr(p_rule_cat varchar2, p_attribute varchar2, appl_id number, dff_name varchar2) is
629       SELECT END_USER_COLUMN_NAME, FLEX_VALUE_SET_ID, REQUIRED_FLAG
630         FROM FND_DESCR_FLEX_COLUMN_USAGES dfcu
631 --        WHERE dfcu.descriptive_flexfield_name = 'OKC Rule Developer DF'     -- /striping/
632         WHERE dfcu.descriptive_flexfield_name = dff_name
633         AND dfcu.descriptive_flex_context_code = p_rule_cat
634         AND dfcu.application_column_name       =  p_attribute
635 --        AND dfcu.application_id =510;      -- /striping/
636         AND dfcu.application_id = appl_id;
637 -- skekkar
638 
639    --
640    l_proc varchar2(72) := g_package||'check_rule_values';
641    --
642   BEGIN
643 
644   IF (l_debug = 'Y') THEN
645      okc_debug.Set_Indentation(l_proc);
646      okc_debug.Log('10: Entering ',2);
647   END IF;
648 
649     -- initialize return status
650     x_return_status := OKC_API.G_RET_STS_SUCCESS;
651 
652     -- check if the rule is a required rule
653     OPEN  l_rgr_csr;
654     FETCH l_rgr_csr INTO l_optional_yn;
655     CLOSE l_rgr_csr;
656 
657    -- bug 1965956
658    -- Added By skekkar
659    -- If the Rule Group is 'PRICING' and if the Advanced Pricing Profile is enabled then we will
660    -- ignore all Rules under 'PRICING' rule group and issue a warning to the user
661        IF NVL(p_rgd_code,'XYZ') = 'PRICING' THEN
662           IF (l_debug = 'Y') THEN
663              okc_debug.Log('20: Pricing Rule Group  '||p_rgd_code,2);
664           END IF;
665          -- check the Advanced Pricing Profile value
666             l_adv_pricing_profile := nvl(fnd_profile.value('OKC_ADVANCED_PRICING'), 'N');
667             IF (l_debug = 'Y') THEN
668                okc_debug.Log('30: Advance Pricing Profile : '||l_adv_pricing_profile,2);
669             END IF;
670              IF l_adv_pricing_profile = 'Y' THEN
671                -- ignore this Rule and make it optional
672                 IF (l_debug = 'Y') THEN
673                    okc_debug.Log('40: Setting l_optional_yn to Y ',2);
674                 END IF;
675                 l_optional_yn := 'Y' ;
676                -- warn the user , done at Rule Group Level
677                 IF (l_debug = 'Y') THEN
678                    okc_debug.Log('50: Issuing Warning To User ',2);
679                 END IF;
680                 l_adv_pricing_warn := 'Y';
681              END IF; -- AP is 'Y'
682        END IF; -- Rule Group is PRICING
683 
684 
685     -- Loop through the rule definitions,
686     -- the +3 is for the integration objects.
687     FOR i IN 1..G_DF_COUNT+3 LOOP
688       IF i = 1 THEN
689         l_rule_information := p_rul_rec.RULE_INFORMATION1;
690       ELSIF i = 2 THEN
691         l_rule_information := p_rul_rec.RULE_INFORMATION2;
692       ELSIF i = 3 THEN
693         l_rule_information := p_rul_rec.RULE_INFORMATION3;
694       ELSIF i = 4 THEN
695         l_rule_information := p_rul_rec.RULE_INFORMATION4;
696       ELSIF i = 5 THEN
697         l_rule_information := p_rul_rec.RULE_INFORMATION5;
698       ELSIF i = 6 THEN
699         l_rule_information := p_rul_rec.RULE_INFORMATION6;
700       ELSIF i = 7 THEN
701         l_rule_information := p_rul_rec.RULE_INFORMATION7;
702       ELSIF i = 8 THEN
703         l_rule_information := p_rul_rec.RULE_INFORMATION8;
704       ELSIF i = 9 THEN
705         l_rule_information := p_rul_rec.RULE_INFORMATION9;
706       ELSIF i = 10 THEN
707         l_rule_information := p_rul_rec.RULE_INFORMATION10;
708       ELSIF i = 11 THEN
709         l_rule_information := p_rul_rec.RULE_INFORMATION11;
710       ELSIF i = 12 THEN
711         l_rule_information := p_rul_rec.RULE_INFORMATION12;
712       ELSIF i = 13 THEN
713         l_rule_information := p_rul_rec.RULE_INFORMATION13;
714       ELSIF i = 14 THEN
715         l_rule_information := p_rul_rec.RULE_INFORMATION14;
716       ELSIF i = 15 THEN
717         l_rule_information := p_rul_rec.RULE_INFORMATION15;
718       ELSIF i = G_DF_COUNT+1 THEN
719         l_rule_information := p_rul_rec.JTOT_OBJECT1_CODE;
720       ELSIF i = G_DF_COUNT+2 THEN
721         l_rule_information := p_rul_rec.JTOT_OBJECT2_CODE;
722       ELSIF i = G_DF_COUNT+3 THEN
723         l_rule_information := p_rul_rec.JTOT_OBJECT3_CODE;
724       END IF;
725 
726 /*
727       -- SQL statement to retrieve the developer descriptive flex field information
728       sql_stmt := 'SELECT END_USER_COLUMN_NAME, FLEX_VALUE_SET_ID, REQUIRED_FLAG ' ||
729                   ' FROM FND_DESCR_FLEX_COL_USAGE_VL dfcu ' ||
730                   ' WHERE dfcu.application_id=510 and dfcu.descriptive_flexfield_name = ' ||
731                   ''''||G_DESCRIPTIVE_FLEXFIELD_NAME||'''' ||
732                   '   AND dfcu.descriptive_flex_context_code = :rule_cat ' ||
733                   '   AND dfcu.application_column_name       = :attribute' ;
734 */
735 -- /striping/
736 p_appl_id  := okc_rld_pvt.get_appl_id(p_rul_rec.rule_information_category);
737 p_dff_name := okc_rld_pvt.get_dff_name(p_rul_rec.rule_information_category);
738 
739       IF i <= G_DF_COUNT THEN
740       -- skekkar # 1586976
741       OPEN l_flex_csr(p_rul_rec.rule_information_category,
742 --                        'RULE_INFORMATION'||LTRIM(TO_CHAR(i)) );      -- /striping/
743                         'RULE_INFORMATION'||LTRIM(TO_CHAR(i)), p_appl_id, p_dff_name );
744       FETCH l_flex_csr INTO l_end_user_column_name, l_flex_value_set_id,
745             l_required_flag;
746       -- skekkar
747 /*
748          OPEN l_info_csr
749           FOR sql_stmt
750         USING p_rul_rec.rule_information_category,
751               'RULE_INFORMATION'||LTRIM(TO_CHAR(i));
752         FETCH l_info_csr INTO l_end_user_column_name, l_flex_value_set_id,
753               l_required_flag;
754 */
755       ELSE
756       -- skekkar # 1586976
757       OPEN l_flex_csr(p_rul_rec.rule_information_category,
758 --                        'JTOT_OBJECT'||LTRIM(TO_CHAR(i - G_DF_COUNT))||'_CODE');  -- /striping/
759                         'JTOT_OBJECT'||LTRIM(TO_CHAR(i - G_DF_COUNT))||'_CODE', p_appl_id, p_dff_name);
760       FETCH l_flex_csr INTO l_end_user_column_name, l_flex_value_set_id,
761             l_required_flag;
762       -- skekkar
763 /*
764          OPEN l_info_csr
765           FOR sql_stmt
766         USING p_rul_rec.rule_information_category,
767               'JTOT_OBJECT'||LTRIM(TO_CHAR(i - G_DF_COUNT))||'_CODE';
768         FETCH l_info_csr INTO l_end_user_column_name, l_flex_value_set_id,
769               l_required_flag;
770 */
771       END IF;
772 
773       IF l_flex_csr%NOTFOUND THEN
774         l_end_user_column_name := NULL;
775         l_flex_value_set_id    := NULL;
776       END IF;
777       CLOSE l_flex_csr;
778 
779 /*
780       IF l_info_csr%NOTFOUND THEN
781         l_end_user_column_name := NULL;
782         l_flex_value_set_id    := NULL;
783       END IF;
784       CLOSE l_info_csr;
785 */
786 
787    -- bug 1965956
788    -- Added By skekkar
789    -- If the Rule Group is 'PRICING' and if the Advanced Pricing Profile is enabled then we will
790    -- ignore all Rules under 'PRICING' rule group and issue a warning to the user
791    -- If the Rule Segments have Required values , we set it to Not Required
792 
793        IF NVL(p_rgd_code,'XYZ') = 'PRICING' THEN
794           IF (l_debug = 'Y') THEN
795              okc_debug.Log('100: Pricing Rule Group  '||p_rgd_code,2);
796           END IF;
797          -- check the Advanced Pricing Profile value
798             l_adv_pricing_profile := nvl(fnd_profile.value('OKC_ADVANCED_PRICING'), 'N');
799             IF (l_debug = 'Y') THEN
800                okc_debug.Log('110: Advance Pricing Profile : '||l_adv_pricing_profile,2);
801             END IF;
802              IF l_adv_pricing_profile = 'Y' THEN
803                -- ignore this Rule and make it optional
804                 IF (l_debug = 'Y') THEN
805                    okc_debug.Log('120: Setting l_required_flag to N ',2);
806                 END IF;
807                 l_required_flag := 'N' ;
808              END IF; -- AP is 'Y'
809        END IF; -- Rule Group is PRICING
810 
811 
812       -- if the attribute has been defined
813       IF l_end_user_column_name IS NOT NULL THEN
814 	   IF l_optional_yn = 'Y' AND
815            l_rule_information IS NOT NULL THEN
816           l_all_must_be_present := True;
817         END IF;
818         -- check if data is required
819         IF l_required_flag = 'Y' THEN
820           -- data is required
821           IF (l_rule_information = OKC_API.G_MISS_CHAR OR
822               l_rule_information IS NULL) THEN
823             l_missing_values := 'Y';
824           END IF;
825         END IF;
826       END IF;
827     END LOOP;
828 
829     -- get the rule meaning for the error messages
830     OPEN  l_rul_csr;
831     FETCH l_rul_csr INTO l_rule_def;
832     CLOSE l_rul_csr;
833 
834     -- check if required data is missing for a required rule
835     -- or a rule that has some information entered.
836     IF l_missing_values = 'Y' THEN
837       IF ((l_optional_yn = 'N') OR
838           (l_optional_yn = 'Y' AND l_all_must_be_present)) THEN
839         If p_chr_id Is Not Null Then
840           g_msg_name := 'OKC_QA_K_RULE_VAL_MISSING';
841           g_token := Null;
842         Else
843           g_msg_name := 'OKC_QA_KL_RULE_VAL_MISSING';
844           g_token := g_line;
845         End If;
846         Set_QA_Message(p_chr_id => p_chr_id,
847                        p_cle_id => p_cle_id,
848                        p_msg_name => g_msg_name,
849                        p_token1 => 'RULE',
850                        p_token1_value => l_rule_def,
851                        p_token2 => g_token);
852         -- notify caller of an error
853         x_return_status := OKC_API.G_RET_STS_ERROR;
854       END IF;
855     END IF;
856 
857 /*
858    Warning given at Rule Group Level
859    -- skekkar, Bug 1965956
860    -- issue warning if Pricing Rule used and Advanced Pricing Profile is set to Y
861    --
862      IF l_adv_pricing_warn = 'Y' THEN
863        OKC_API.set_message(
864                 p_app_name     => G_APP_NAME,
865                 p_msg_name     => 'OKC_PRICING_RULE_WARN');
866      END IF;
867 
868 */
869 
870     -- There must be at least on child record in OKC_COVER_TIMES for a CVR rule
871     IF (p_rul_rec.rule_information_category = 'CVR') THEN
872       l_dummy := '?';
873       -- check for record in cover times
874       OPEN  l_cti_csr;
875       FETCH l_cti_csr INTO l_dummy;
876       CLOSE l_cti_csr;
877 
878       IF (l_dummy = '?') THEN
879         If p_chr_id Is Not Null Then
880           g_msg_name := 'OKC_QA_K_CVR_VALUE_MISSING';
881           g_token := Null;
882         Else
883           g_msg_name := 'OKC_QA_KL_CVR_VALUE_MISSING';
884           g_token := g_line;
885         End If;
886         Set_QA_Message(p_chr_id => p_chr_id,
887                        p_cle_id => p_cle_id,
888                        p_msg_name => g_msg_name,
889                        p_token1 => 'RULE',
890                        p_token1_value => l_rule_def,
891                        p_token2 => g_token);
892         -- notify caller of an error
893         x_return_status := OKC_API.G_RET_STS_ERROR;
894       END IF;
895     END IF;
896 
897     -- There must be at least on child record in OKC_REACT_INTERVALS for a rule
898     IF (p_rul_rec.rule_information_category = 'RCN') THEN
899       l_dummy := '?';
900       -- check for record in cover times
901       OPEN  l_ril_csr;
902       FETCH l_ril_csr INTO l_dummy;
903       CLOSE l_ril_csr;
904 
905       IF (l_dummy = '?') THEN
906         If p_chr_id Is Not Null Then
907           g_msg_name := 'OKC_QA_K_RCN_VALUE_MISSING';
908           g_token := Null;
909         Else
910           g_msg_name := 'OKC_QA_KL_RCN_VALUE_MISSING';
911           g_token := g_line;
912         End If;
913         Set_QA_Message(p_chr_id => p_chr_id,
914                        p_cle_id => p_cle_id,
915                        p_msg_name => g_msg_name,
916                        p_token1 => 'RULE',
917                        p_token1_value => l_rule_def,
918                        p_token2 => g_token);
919         -- notify caller of an error
920         x_return_status := OKC_API.G_RET_STS_ERROR;
921       END IF;
922     END IF;
923 
924     -- Bug 1496111. For Non-Service Contracts, check that for the renewal type of
925     -- Notify Sales Rep 'NSR', the Contact information has been entered.
926     -- Bug 1630898. Contacts must be defined for EVN/SFA also.
927     If p_cls_code <> 'SERVICE' Then
928       IF (p_rul_rec.rule_information_category = 'REN') And
929 	    (p_rul_rec.rule_information1 IN ('NSR', 'SFA', 'EVN')) And
930 	    ((p_rul_rec.rule_information2 Is Null) Or
931 	     (p_rul_rec.rule_information2 = OKC_API.G_MISS_CHAR)) Then
932 
933         OKC_API.set_message(
934           p_app_name     => G_APP_NAME,
935           p_msg_name     => 'OKC_NO_CONTACT_FOR_NSR');
936 
937           -- notify caller of an error
938           x_return_status := OKC_API.G_RET_STS_ERROR;
939       END IF;
940     END IF;
941 
942 
943   IF (l_debug = 'Y') THEN
944      okc_debug.Log('1000: Leaving ',2);
945      okc_debug.Reset_Indentation;
946   END IF;
947   EXCEPTION
948   WHEN G_EXCEPTION_HALT_VALIDATION THEN
949     IF (l_debug = 'Y') THEN
950        okc_debug.Log('2000: Leaving ',2);
951        okc_debug.Reset_Indentation;
952     END IF;
953     -- no processing necessary; validation can continue with next column
954     NULL;
955   WHEN OTHERS THEN
956     IF (l_debug = 'Y') THEN
957        okc_debug.Log('3000: Leaving ',2);
958        okc_debug.Reset_Indentation;
959     END IF;
960     -- store SQL error message on message stack
961     OKC_API.SET_MESSAGE(
962       p_app_name        => G_APP_NAME,
963       p_msg_name        => G_UNEXPECTED_ERROR,
964       p_token1	        => G_SQLCODE_TOKEN,
965       p_token1_value    => SQLCODE,
966       p_token2          => G_SQLERRM_TOKEN,
967       p_token2_value    => SQLERRM);
968     -- notify caller of an error as UNEXPETED error
969     x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
970     -- verify that cursor was closed
971     IF l_rgr_csr%ISOPEN THEN
972       CLOSE l_rgr_csr;
973     END IF;
974     IF l_flex_csr%ISOPEN THEN
975       CLOSE l_flex_csr;
976     END IF;
977     IF l_info_csr%ISOPEN THEN
978       CLOSE l_info_csr;
979     END IF;
980     IF l_cti_csr%ISOPEN THEN
981       CLOSE l_cti_csr;
982     END IF;
983     IF l_rul_csr%ISOPEN THEN
984       CLOSE l_rul_csr;
985     END IF;
986   END check_rule_values;
987 --
988   -- Start of comments
989   --
990   -- Procedure Name  : check_rule_groups
991   -- Description     :
992   -- Business Rules  :
993   -- Parameters      :
994   -- Version         : 1.0
995   -- End of comments
996 
997   PROCEDURE check_rule_groups(
998     x_return_status            OUT NOCOPY VARCHAR2,
999     p_chr_id                   IN  NUMBER
1000   ) IS
1001 
1002     CURSOR l_chr_csr IS
1003       SELECT chr.*, sub.cls_code
1004         FROM OKC_K_HEADERS_B chr,
1005              OKC_SUBCLASSES_B sub
1006        WHERE chr.id = p_chr_id
1007          AND sub.code = chr.scs_code;
1008     l_chr_rec l_chr_csr%ROWTYPE;
1009 
1010 -- use only for getting info about OKC_RULE_GROUP_DEF, don't use OKC_RULE_DEF -- /striping/
1011     CURSOR l_rgpm_csr IS
1012       SELECT fnd.MEANING
1013         FROM FND_LOOKUPS fnd
1014        WHERE fnd.LOOKUP_CODE = 'CURRENCY'
1015          AND fnd.LOOKUP_TYPE = 'OKC_RULE_GROUP_DEF';
1016       -- WHERE fnd.LOOKUP_CODE = 'CVN'
1017       --   AND fnd.LOOKUP_TYPE = 'OKC_RULE_DEF';
1018     l_rgpm_meaning FND_LOOKUPS.MEANING%TYPE;
1019 
1020     --
1021     -- modified as part of bug 2155930 (jkodiyan - 26/12/2001)
1022     -- Cursor to check Conversion rule at the header level with
1023     -- all required values
1024     -- p_rgd_code = 'SVC_K' for service contracts and
1025     --            = 'CURRENCY' for core contracts
1026     --
1027     CURSOR l_cvn_csr(p_rgd_code VARCHAR2) IS
1028        SELECT 'x'
1029        FROM OKC_RULE_GROUPS_B rgp, OKC_RULES_B rul
1030        WHERE rgp.rgd_code   = p_rgd_code
1031          AND rgp.dnz_chr_id = p_chr_id
1032 	    AND rul.dnz_chr_id = rgp.dnz_chr_id
1033 	    AND rgp.cle_id is null
1034 	    AND rul.rgp_id = rgp.id
1035 	    AND rul.rule_information_category = 'CVN'
1036 	    AND rul.rule_information1 is not null
1037 	    AND rul.rule_information2 is not null
1038 	    AND rul.object1_id1 is not null;
1039 /* -- /striping/
1040     CURSOR l_rgp_csr IS
1041       SELECT rgp.id, rgp.rgd_code, fnd.meaning rule_group_name,
1042              rgp.chr_id, rgp.cle_id,
1043              rgr.rdf_code, rgr.min_cardinality, rgr.max_cardinality,
1044              fnd1.meaning rule_name
1045         FROM FND_LOOKUPS fnd,
1046              FND_LOOKUPS fnd1,
1047              OKC_RG_DEF_RULES rgr,
1048              OKC_RULE_GROUPS_B rgp
1049        WHERE rgp.dnz_chr_id = p_chr_id
1050          AND fnd.lookup_code = rgp.rgd_code
1051          AND fnd.lookup_type = 'OKC_RULE_GROUP_DEF'
1052          AND rgr.rgd_code = rgp.rgd_code
1053          AND rgr.rdf_code = fnd1.lookup_code
1054          AND fnd1.lookup_type = 'OKC_RULE_DEF'
1055        ORDER BY rgp.id;
1056 */
1057 -- /striping/
1058     CURSOR l_rgp_csr IS
1059       SELECT rgp.id, rgp.rgd_code, fnd.meaning rule_group_name,
1060              rgp.chr_id, rgp.cle_id,
1061              rgr.rdf_code, rgr.min_cardinality, rgr.max_cardinality,
1062              fnd1.meaning rule_name
1063         FROM FND_LOOKUPS fnd,
1064              okc_rule_defs_v fnd1,
1065              OKC_RG_DEF_RULES rgr,
1066              OKC_RULE_GROUPS_B rgp
1067        WHERE rgp.dnz_chr_id = p_chr_id
1068          AND fnd.lookup_code = rgp.rgd_code
1069          AND fnd.lookup_type = 'OKC_RULE_GROUP_DEF'
1070          AND rgr.rgd_code = rgp.rgd_code
1071          AND rgr.rdf_code = fnd1.rule_code
1072        ORDER BY rgp.id;
1073 
1074     l_rgp_rec l_rgp_csr%ROWTYPE;
1075 
1076     /* CURSOR l_rgr_csr(p_rgd_code IN okc_rg_def_rules.rgd_code%TYPE) IS
1077       SELECT rgr.rdf_code, rgr.min_cardinality, rgr.max_cardinality,
1078              fnd.meaning
1079         FROM OKC_RG_DEF_RULES rgr,
1080              FND_LOOKUPS fnd
1081        WHERE rgr.rgd_code = p_rgd_code
1082          AND rgr.rdf_code = fnd.lookup_code
1083          AND fnd.lookup_type = 'OKC_RULE_DEF';
1084     l_rgr_rec l_rgr_csr%ROWTYPE; */
1085 
1086     CURSOR l_rul_cnt_csr(p_rgp_id IN okc_rules_b.rgp_id%TYPE,
1087                          p_rdf_code IN okc_rules_b.rule_information_category%TYPE) IS
1088       SELECT count(*)
1089         FROM OKC_RULES_B rul
1090        WHERE rul.rule_information_category = p_rdf_code
1091          AND rul.rgp_id = p_rgp_id;
1092     l_rule_count Number;
1093 
1094     CURSOR l_rul_csr IS
1095       SELECT rul.*
1096         FROM OKC_RULES_B rul
1097        WHERE rgp_id = l_rgp_rec.id;
1098 
1099     l_rul_rec OKC_RULES_B%ROWTYPE;
1100 
1101     CURSOR l_cle_csr(p_id okc_k_lines_b.id%TYPE) IS
1102       SELECT cle.chr_id
1103         FROM OKC_K_LINES_B cle
1104        WHERE cle.id = p_id;
1105     l_cle_rec l_cle_csr%ROWTYPE;
1106 
1107     l_prev_rgp_rec_id Number := -1;
1108     l_token VARCHAR2(2000);
1109     l_dummy VARCHAR2(1);
1110     l_optional_yn OKC_RG_DEF_RULES.OPTIONAL_YN%TYPE;
1111     l_func_curr_code OKC_K_HEADERS_B.CURRENCY_CODE%TYPE;
1112     l_return_status VARCHAR2(1);
1113 
1114     l_adv_pricing_profile  VARCHAR2(10) := 'N';
1115     l_adv_pricing_warn     VARCHAR2(10) := 'N';
1116 
1117    --
1118    l_proc varchar2(72) := g_package||'check_rule_groups';
1119    --
1120   BEGIN
1121 
1122   IF (l_debug = 'Y') THEN
1123      okc_debug.Set_Indentation(l_proc);
1124      okc_debug.Log('10: Entering ',2);
1125   END IF;
1126 
1127     -- initialize return status
1128     x_return_status := OKC_API.G_RET_STS_SUCCESS;
1129 
1130     -- Get Contract Header info
1131     OPEN l_chr_csr;
1132     FETCH l_chr_csr INTO l_chr_rec;
1133     CLOSE l_chr_csr;
1134 
1135 --/Rules migration/
1136 --Rule group check should not be performed for other contract catregories
1137 --apart from OKC/OKO/OKL
1138 
1139     If l_chr_rec.application_id not in (510,871,540) Then
1140 	RAISE G_EXCEPTION_HALT_VALIDATION;
1141     End If;
1142 --/Rules migration/
1143 
1144     -- get the rules attached to the contract
1145     OPEN l_rgp_csr;
1146     LOOP
1147       FETCH l_rgp_csr INTO l_rgp_rec;
1148       EXIT WHEN l_rgp_csr%NOTFOUND;
1149       --
1150       -- Check that all required rules for the rule group
1151       -- have been associated.
1152       -- l_dummy := '?';
1153       /* For l_rgr_rec in l_rgr_csr(l_rgp_rec.rgd_code) Loop */
1154         Open l_rul_cnt_csr(l_rgp_rec.id, l_rgp_rec.rdf_code);
1155         Fetch l_rul_cnt_csr Into l_rule_count;
1156         Close l_rul_cnt_csr;
1157 
1158    -- bug 1965956
1159    -- Added By skekkar
1160    -- If the Rule Group is 'PRICING' and if the Advanced Pricing Profile is enabled then we will
1161    -- ignore all Rules under 'PRICING' rule group and issue a warning to the user
1162    -- set the l_rule_count to min_cardinality
1163 
1164        IF NVL(l_rgp_rec.rgd_code,'XYZ') = 'PRICING' THEN
1165           IF (l_debug = 'Y') THEN
1166              okc_debug.Log('200: Pricing Rule Group  '||l_rgp_rec.rgd_code,2);
1167           END IF;
1168          -- check the Advanced Pricing Profile value
1169             l_adv_pricing_profile := nvl(fnd_profile.value('OKC_ADVANCED_PRICING'), 'N');
1170              IF (l_debug = 'Y') THEN
1171                 okc_debug.Log('210: Advance Pricing Profile : '||l_adv_pricing_profile,2);
1172              END IF;
1173              IF l_adv_pricing_profile = 'Y' THEN
1174                -- ignore this Rule and make it optional
1175                 IF (l_debug = 'Y') THEN
1176                    okc_debug.Log('220: Setting l_rule_count to min_cardinality ',2);
1177                 END IF;
1178                 l_rule_count := nvl(l_rgp_rec.min_cardinality, 0);
1179                 -- issue Warning to the user
1180                 l_adv_pricing_warn := 'Y';
1181              END IF; -- AP is 'Y'
1182        END IF; -- Rule Group is PRICING
1183 
1184         IF l_rule_count < l_rgp_rec.min_cardinality Then
1185           If l_rgp_rec.chr_id Is Not Null Then
1186             g_msg_name := 'OKC_QA_K_RULE_MIN';
1187             g_token := Null;
1188           Else
1189             g_msg_name := 'OKC_QA_KL_RULE_MIN';
1190             g_token := g_line;
1191           End If;
1192           Set_QA_Message(p_chr_id => l_rgp_rec.chr_id,
1193                          p_cle_id => l_rgp_rec.cle_id,
1194                          p_msg_name => g_msg_name,
1195                          p_token1 => 'NUM_OF_RULE',
1196                          p_token1_value => l_rgp_rec.min_cardinality,
1197                          p_token2 => 'RULE',
1198                          p_token2_value => l_rgp_rec.rule_name,
1199                          p_token3 => g_token);
1200           -- notify caller of an error
1201           x_return_status := OKC_API.G_RET_STS_ERROR;
1202         END IF;
1203         --
1204         IF l_rule_count > l_rgp_rec.max_cardinality Then
1205           If l_rgp_rec.chr_id Is Not Null Then
1206             g_msg_name := 'OKC_QA_K_RULE_MAX';
1207             g_token := Null;
1208           Else
1209             g_msg_name := 'OKC_QA_KL_RULE_MAX';
1210             g_token := g_line;
1211           End If;
1212           Set_QA_Message(p_chr_id => l_rgp_rec.chr_id,
1213                          p_cle_id => l_rgp_rec.cle_id,
1214                          p_msg_name => g_msg_name,
1215                          p_token1 => 'NUM_OF_RULE',
1216                          p_token1_value => l_rgp_rec.max_cardinality,
1217                          p_token2 => 'RULE',
1218                          p_token2_value => l_rgp_rec.rule_name,
1219                          p_token3 => g_token);
1220           -- notify caller of an error
1221           x_return_status := OKC_API.G_RET_STS_ERROR;
1222         END IF;
1223       -- End Loop; -- l_rgr_csr
1224 
1225       If l_rgp_rec.id <> l_prev_rgp_rec_id Then
1226         OPEN l_rul_csr;
1227         LOOP
1228           FETCH l_rul_csr INTO l_rul_rec;
1229           EXIT WHEN l_rul_csr%NOTFOUND;
1230           check_rule_values(l_return_status, l_rul_rec,
1231                             l_rgp_rec.rgd_code, l_rgp_rec.id,
1232                             l_rgp_rec.chr_id, l_rgp_rec.cle_id,
1233                             l_chr_rec.cls_code);
1234           IF l_return_status = OKC_API.G_RET_STS_ERROR THEN
1235             -- notify caller of an error
1236             x_return_status := OKC_API.G_RET_STS_ERROR;
1237           END IF;
1238         END LOOP; -- l_rul_csr;
1239         CLOSE l_rul_csr;
1240         l_prev_rgp_rec_id := l_rgp_rec.id;
1241       End If;
1242     END LOOP; -- l_rgp_csr
1243     CLOSE l_rgp_csr;
1244 
1245 -- Bug 2357950
1246     --l_func_curr_code := OKC_CURRENCY_API.GET_OU_CURRENCY();
1247     l_func_curr_code := OKC_CURRENCY_API.GET_OU_CURRENCY(l_chr_rec.authoring_org_id);
1248 ---
1249     IF l_chr_rec.currency_code <> l_func_curr_code  AND
1250     --/rules migration/
1251     --Don't check conversion rule fro Non OKC/OKO contracts
1252        l_chr_rec.application_id in (510,871) THEN
1253       -- Check for conversion rule, which is required if
1254       -- currency code is different from the functional currency
1255       l_dummy := '?';
1256 
1257       -- modified for bug# 1413682 - tsaifee 09/21/00
1258       -- For service Ks use l_cvn_csr which uses SVC_K rule grp.
1259 	 -- modified for bug# 2155930 - jkodiyan 26/12/01
1260 	 --
1261       IF l_chr_rec.cls_code = 'SERVICE' then -- if SERVICE, then use
1262          OPEN  l_cvn_csr('SVC_K');
1263       ELSE
1264          OPEN  l_cvn_csr('CURRENCY');
1265       END IF;
1266 
1267       FETCH l_cvn_csr INTO l_dummy;
1268       CLOSE l_cvn_csr;
1269 
1270       IF (l_dummy <> 'x') THEN
1271         -- get the rule group meaning for the error message
1272         OPEN  l_rgpm_csr;
1273         FETCH l_rgpm_csr INTO l_rgpm_meaning;
1274         CLOSE l_rgpm_csr;
1275 
1276         OKC_API.set_message(
1277           p_app_name     => G_APP_NAME,
1278           p_msg_name     => G_REQUIRED_RULE_GROUP,
1279           p_token1       => 'RULE_GROUP',
1280           p_token1_value => l_rgpm_meaning);
1281         -- notify caller of an error
1282         x_return_status := OKC_API.G_RET_STS_ERROR;
1283       END IF;
1284     END IF;
1285 
1286 
1287     IF x_return_status = OKC_API.G_RET_STS_SUCCESS THEN
1288 
1289      -- since there were no errors , we will issue warning depending on l_adv_pricing_warn flag
1290         -- Bug 1965956
1291         -- skekkar
1292         -- issue warning if Pricing Rule Group used and Advanced Pricing Profile is set to Y
1293         --
1294            IF l_adv_pricing_warn = 'Y' THEN
1295               OKC_API.set_message(
1296                        p_app_name     => G_APP_NAME,
1297                        p_msg_name     => 'OKC_PRICING_RULE_WARN');
1298                -- notify caller of an warning
1299                x_return_status := OKC_API.G_RET_STS_WARNING;
1300            ELSE
1301               OKC_API.set_message(
1302                 p_app_name      => G_APP_NAME,
1303                 p_msg_name      => G_QA_SUCCESS);
1304            END IF;  -- l_adv_pricing_warn = 'Y'
1305 
1306     END IF; -- x_return_status is SUCCESS
1307 
1308 
1309   IF (l_debug = 'Y') THEN
1310      okc_debug.Log('1000: Leaving ',2);
1311      okc_debug.Reset_Indentation;
1312   END IF;
1313   EXCEPTION
1314   WHEN G_EXCEPTION_HALT_VALIDATION THEN
1315     IF (l_debug = 'Y') THEN
1316        okc_debug.Log('2000: Leaving ',2);
1317        okc_debug.Reset_Indentation;
1318     END IF;
1319     -- no processing necessary; validation can continue with next column
1320     NULL;
1321   WHEN OTHERS THEN
1322     IF (l_debug = 'Y') THEN
1323        okc_debug.Log('3000: Leaving ',2);
1324        okc_debug.Reset_Indentation;
1325     END IF;
1326     -- store SQL error message on message stack
1327     OKC_API.SET_MESSAGE(
1328       p_app_name        => G_APP_NAME,
1329       p_msg_name        => G_UNEXPECTED_ERROR,
1330       p_token1	        => G_SQLCODE_TOKEN,
1331       p_token1_value    => SQLCODE,
1332       p_token2          => G_SQLERRM_TOKEN,
1333       p_token2_value    => SQLERRM);
1334     -- notify caller of an error as UNEXPETED error
1335     x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
1336     -- verify that cursor was closed
1337     /* IF l_rgr_csr%ISOPEN THEN
1338       CLOSE l_rgr_csr;
1339     END IF; */
1340     IF l_rgp_csr%ISOPEN THEN
1341       CLOSE l_rgp_csr;
1342     END IF;
1343     IF l_rul_csr%ISOPEN THEN
1344       CLOSE l_rgp_csr;
1345     END IF;
1346     IF l_chr_csr%ISOPEN THEN
1347       CLOSE l_chr_csr;
1348     END IF;
1349     IF l_rgpm_csr%ISOPEN THEN
1350       CLOSE l_rgpm_csr;
1351     END IF;
1352   END check_rule_groups;
1353 --
1354   -- Start of comments
1355   --
1356   -- Procedure Name  : check_rule_group_parties
1357   -- Description     :
1358   -- Business Rules  :
1359   -- Parameters      :
1360   -- Version         : 1.0
1361   -- End of comments
1362 
1363   PROCEDURE check_rule_group_parties(
1364     x_return_status            OUT NOCOPY VARCHAR2,
1365     p_chr_id                   IN  NUMBER
1366   ) IS
1367 
1368     CURSOR l_chr_csr IS
1369       SELECT chr.template_yn,chr.application_id
1370         FROM OKC_K_HEADERS_B chr
1371        WHERE chr.id = p_chr_id;
1372     l_template_yn OKC_K_HEADERS_B.TEMPLATE_YN%TYPE;
1373 
1374     CURSOR l_rrd_csr IS
1375       SELECT rgp.id "RGP_ID", rrd.id "RRD_ID", rgp.rgd_code , sre.rle_code,
1376              fndrgd.meaning "RGD_MEANING", fndrle.meaning "RLE_MEANING",
1377              rgp.chr_id, rgp.cle_id
1378         FROM FND_LOOKUPS fndrle,
1379              FND_LOOKUPS fndrgd,
1380              OKC_SUBCLASS_ROLES sre,
1381              OKC_RG_ROLE_DEFS rrd,
1382              OKC_SUBCLASS_RG_DEFS srd,
1383              OKC_RULE_GROUPS_B rgp,
1384              OKC_K_HEADERS_B chr
1385        WHERE fndrle.LOOKUP_CODE = sre.rle_code
1386          AND fndrle.LOOKUP_TYPE = 'OKC_ROLE'
1387          AND fndrgd.LOOKUP_CODE = srd.rgd_code
1388          AND fndrgd.LOOKUP_TYPE = 'OKC_RULE_GROUP_DEF'
1389          AND sre.id         = rrd.sre_id
1390          AND NVL(rrd.optional_yn, 'N') = 'N'
1391          AND rrd.srd_id     = srd.id
1392          AND srd.rgd_code   = rgp.rgd_code
1393          AND srd.scs_code   = chr.scs_code
1394          AND rgp.dnz_chr_id = chr.id
1395          AND chr.id         = p_chr_id;
1396     l_rrd_rec l_rrd_csr%ROWTYPE;
1397 
1398     CURSOR l_rpr_csr IS
1399       SELECT rpr.cpl_id
1400         FROM OKC_RG_PARTY_ROLES rpr
1401        WHERE rpr.rgp_id = l_rrd_rec.rgp_id
1402          AND rpr.rrd_id = l_rrd_rec.rrd_id;
1403        -- WHERE (rpr.cpl_id IS NOT NULL or l_template_yn = 'Y')
1404 
1405     l_cpl_id OKC_RG_PARTY_ROLES.CPL_ID%TYPE;
1406 
1407     CURSOR l_kpr_csr(p_id OKC_K_PARTY_ROLES_B.ID%TYPE) IS
1408 	 SELECT kpr.rle_code, fl.meaning
1409 	   FROM OKC_K_PARTY_ROLES_B kpr,
1410                 FND_LOOKUPS fl
1411           WHERE kpr.id = p_id
1412 	    AND fl.lookup_type = 'OKC_ROLE'
1413 	    AND fl.lookup_code = kpr.rle_code;
1414 
1415     l_kpr_rec l_kpr_csr%ROWTYPE;
1416     l_row_notfound BOOLEAN;
1417     l_token VARCHAR2(2000);
1418 
1419     l_adv_pricing_profile  VARCHAR2(10) := 'N';
1420     l_appl_id NUMBER;
1421    --
1422    l_proc varchar2(72) := g_package||'check_rule_group_parties';
1423    --
1424 
1425     PROCEDURE Set_Rule_Party_Message IS
1426       l_token VARCHAR2(2000);
1427        --
1428        l_proc varchar2(72) := g_package||'Set_Rule_Party_Message';
1429        --
1430     BEGIN
1431 
1432       IF (l_debug = 'Y') THEN
1433          okc_debug.Set_Indentation(l_proc);
1434          okc_debug.Log('10: Entering ',2);
1435       END IF;
1436       If l_rrd_rec.chr_id Is Not Null Then
1437         g_msg_name := 'OKC_QA_K_RGP_ROLE_MISSING';
1438         g_token := Null;
1439       Else
1440         g_msg_name := 'OKC_QA_KL_RGP_ROLE_MISSING';
1441         g_token := g_line;
1442       End If;
1443       Set_QA_Message(p_chr_id       => l_rrd_rec.chr_id,
1444                      p_cle_id       => l_rrd_rec.cle_id,
1445                      p_msg_name     => g_msg_name,
1446                      p_token1       => 'ROLE',
1447                      p_token1_value => l_rrd_rec.rle_meaning,
1448                      p_token2       => 'RULE_GROUP',
1449                      p_token2_value => l_rrd_rec.rgd_meaning,
1450                      p_token3       => g_token);
1451 
1452       IF (l_debug = 'Y') THEN
1453          okc_debug.Log('1000: Leaving ',2);
1454          okc_debug.Reset_Indentation;
1455       END IF;
1456     END;
1457 
1458   BEGIN
1459 
1460   IF (l_debug = 'Y') THEN
1461      okc_debug.Set_Indentation(l_proc);
1462      okc_debug.Log('10: Entering ',2);
1463   END IF;
1464 
1465     -- initialize return status
1466     x_return_status := OKC_API.G_RET_STS_SUCCESS;
1467 
1468     -- get template info from contract header
1469     OPEN l_chr_csr;
1470     FETCH l_chr_csr INTO l_template_yn,l_appl_id;
1471     CLOSE l_chr_csr;
1472 
1473 --/Rules migration/
1474 --Rule party check should not be performed for other contract catregories
1475 --apart from OKC/OKO/OKL
1476 
1477     If l_appl_id not in (510,871,540) Then
1478      RAISE G_EXCEPTION_HALT_VALIDATION;
1479     End If;
1480 --/Rules migration/
1481 
1482     --
1483     -- For all of the rules attached to a contract
1484     -- check that all required rule party roles have
1485     -- been assigned.
1486     OPEN  l_rrd_csr;
1487     LOOP
1488       FETCH l_rrd_csr INTO l_rrd_rec;
1489       EXIT WHEN l_rrd_csr%NOTFOUND;
1490       --
1491       -- Check that all required party roles have been
1492       -- attached to a rule group.
1493       OPEN l_rpr_csr;
1494         LOOP
1495         FETCH l_rpr_csr INTO l_cpl_id;
1496         EXIT WHEN l_rpr_csr%NOTFOUND;
1497           IF l_template_yn = 'N' THEN
1498             IF l_cpl_id IS NULL THEN
1499               Set_Rule_Party_Message;
1500               x_return_status := OKC_API.G_RET_STS_ERROR;
1501             ELSE
1502               OPEN l_kpr_csr(l_cpl_id);
1503               FETCH l_kpr_csr INTO l_kpr_rec;
1504               l_row_notfound := l_kpr_csr%NOTFOUND;
1505               CLOSE l_kpr_csr;
1506               IF l_row_notfound THEN
1507                 If l_rrd_rec.chr_id Is Not Null Then
1508                   g_msg_name := 'OKC_QA_K_RULE_ROLE_DELETED';
1509                   g_token := Null;
1510                 Else
1511                   g_msg_name := 'OKC_QA_KL_RULE_ROLE_DELETED';
1512                   g_token := g_line;
1513                 End If;
1514                 Set_QA_Message(p_chr_id       => l_rrd_rec.chr_id,
1515                                p_cle_id       => l_rrd_rec.cle_id,
1516                                p_msg_name     => g_msg_name,
1517                                p_token1       => 'ROLE',
1518                                p_token1_value => l_rrd_rec.rle_meaning,
1519                                p_token2       => 'RULE_GROUP',
1520                                p_token2_value => l_rrd_rec.rgd_meaning,
1521                                p_token3       => g_token);
1522                 x_return_status := OKC_API.G_RET_STS_ERROR;
1523               ELSIF l_kpr_rec.rle_code <> l_rrd_rec.rle_code THEN
1524                 If l_rrd_rec.chr_id Is Not Null Then
1525                   g_msg_name := 'OKC_QA_K_RULE_ROLE_CHANGED';
1526                   g_token := Null;
1527                 Else
1528                   g_msg_name := 'OKC_QA_KL_RULE_ROLE_CHANGED';
1529                   g_token := g_line;
1530                 End If;
1531                 Set_QA_Message(p_chr_id       => l_rrd_rec.chr_id,
1532                                p_cle_id       => l_rrd_rec.cle_id,
1533                                p_msg_name     => g_msg_name,
1534                                p_token1       => 'ROLE1',
1535                                p_token1_value => l_rrd_rec.rle_meaning,
1536                                p_token2       => 'RULE_GROUP',
1537                                p_token2_value => l_rrd_rec.rgd_meaning,
1538                                p_token3       => 'ROLE2',
1539                                p_token3_value => l_kpr_rec.meaning,
1540                                p_token4       => g_token);
1541                 x_return_status := OKC_API.G_RET_STS_ERROR;
1542               END IF;
1543             END IF;
1544           END IF;
1545         END LOOP; --l_rpr_csr
1546 
1547       IF l_rpr_csr%ROWCOUNT <= 0 THEN
1548         -- Bug 1965956
1549         -- skekkar
1550         -- check if the Rule Group is Pricing
1551         IF (l_debug = 'Y') THEN
1552            okc_debug.Log('20:Rowcount is 0 , rgd_code is : '||l_rrd_rec.rgd_code,2);
1553         END IF;
1554         IF NVL(l_rrd_rec.rgd_code,'XYZ') = 'PRICING' THEN
1555           -- check the Advanced Pricing Profile value
1556           l_adv_pricing_profile := nvl(fnd_profile.value('OKC_ADVANCED_PRICING'), 'N');
1557           IF (l_debug = 'Y') THEN
1558              okc_debug.Log('40: Advance Pricing Profile : '||l_adv_pricing_profile,2);
1559           END IF;
1560 
1561           IF l_adv_pricing_profile = 'N' THEN
1562             -- Rule Group Party Role is missing.
1563             -- notify caller of an error
1564             IF (l_debug = 'Y') THEN
1565                okc_debug.Log('100: Rule Group Party Role is missing ',2);
1566             END IF;
1567             Set_Rule_Party_Message;
1568             x_return_status := OKC_API.G_RET_STS_ERROR;
1569           END IF; -- l_adv_pricing_profile is N
1570 
1571         ELSE
1572           -- rule group is NOT Pricing, error
1573           IF (l_debug = 'Y') THEN
1574              okc_debug.Log('50: rule group is NOT Pricing , error ',2);
1575           END IF;
1576           -- Rule Group Party Role is missing.
1577           -- notify caller of an error
1578           IF (l_debug = 'Y') THEN
1579              okc_debug.Log('200: Rule Group Party Role is missing ',2);
1580           END IF;
1581           Set_Rule_Party_Message;
1582           x_return_status := OKC_API.G_RET_STS_ERROR;
1583         END IF; -- rule group is Pricing
1584 
1585       END IF; -- rowcount is 0
1586       CLOSE l_rpr_csr;
1587     END LOOP; --l_rrd_csr
1588     CLOSE l_rrd_csr;
1589 
1590     -- notify caller of success
1591     IF x_return_status = OKC_API.G_RET_STS_SUCCESS THEN
1592       OKC_API.set_message(
1593         p_app_name      => G_APP_NAME,
1594         p_msg_name      => G_QA_SUCCESS);
1595     END IF;
1596 
1597 
1598   IF (l_debug = 'Y') THEN
1599      okc_debug.Log('1000: Leaving ',2);
1600      okc_debug.Reset_Indentation;
1601   END IF;
1602   EXCEPTION
1603   WHEN G_EXCEPTION_HALT_VALIDATION THEN
1604     IF (l_debug = 'Y') THEN
1605        okc_debug.Log('2000: Leaving ',2);
1606        okc_debug.Reset_Indentation;
1607     END IF;
1608     -- no processing necessary; validation can continue with next column
1609     NULL;
1610   WHEN OTHERS THEN
1611     IF (l_debug = 'Y') THEN
1612        okc_debug.Log('3000: Leaving ',2);
1613        okc_debug.Reset_Indentation;
1614     END IF;
1615     -- store SQL error message on message stack
1616     OKC_API.SET_MESSAGE(
1617       p_app_name        => G_APP_NAME,
1618       p_msg_name        => G_UNEXPECTED_ERROR,
1619       p_token1	        => G_SQLCODE_TOKEN,
1620       p_token1_value    => SQLCODE,
1621       p_token2          => G_SQLERRM_TOKEN,
1622       p_token2_value    => SQLERRM);
1623     -- notify caller of an error as UNEXPETED error
1624     x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
1625     -- verify that cursor was closed
1626     IF l_chr_csr%ISOPEN THEN
1627       CLOSE l_chr_csr;
1628     END IF;
1629     IF l_rrd_csr%ISOPEN THEN
1630       CLOSE l_rrd_csr;
1631     END IF;
1632     IF l_rpr_csr%ISOPEN THEN
1633       CLOSE l_rpr_csr;
1634     END IF;
1635   END check_rule_group_parties;
1636 --
1637   -- Start of comments
1638   --
1639   -- Procedure Name  : check_effectivity_dates
1640   -- Description     :
1641   -- Business Rules  :
1642   -- Parameters      :
1643   -- Version         : 1.0
1644   -- End of comments
1645 
1646   PROCEDURE check_effectivity_dates(
1647     x_return_status            OUT NOCOPY VARCHAR2,
1648     p_chr_id                   IN  NUMBER) IS
1649 
1650     CURSOR l_chrv_csr IS
1651       SELECT start_date, end_date
1652         FROM OKC_K_HEADERS_B chrv
1653        WHERE chrv.id = p_chr_id;
1654 
1655     CURSOR l_cle_csr IS
1656 	 /**
1657       SELECT level, start_date, end_date, line_number,
1658              id, chr_id, cle_id,lse_id
1659         FROM OKC_K_LINES_B
1660 	WHERE date_cancelled is null	--changes [llc]-- bug #4727744 -- to ignore cancelled lines
1661        START WITH chr_id = p_chr_id
1662      CONNECT BY PRIOR id = cle_id
1663      AND date_cancelled is NULL;          --changes [llc]-- to ignore cancelled sublines
1664 	**/
1665      --bug 5442886
1666      SELECT kla.start_date, kla.end_date,
1667             kla.id, kla.chr_id, kla.lse_id,
1668             --
1669             klb.start_date parent_start_date, klb.end_date parent_end_date
1670      FROM okc_k_lines_b kla,
1671           okc_k_lines_b klb
1672      WHERE kla.dnz_chr_id = p_chr_id
1673      AND   kla.cle_id = klb.id (+)
1674      AND   kla.date_cancelled is NULL
1675      AND   klb.date_cancelled is NULL;
1676 
1677 
1678     CURSOR l_clev_csr (p_cle_id NUMBER) IS
1679     SELECT Rtrim(Rtrim(cle.line_number) || ', ' || lse.name ||
1680                                            ' ' || cle.name) "LINE_NAME"
1681       FROM OKC_LINE_STYLES_TL lse,
1682            OKC_K_LINES_V cle
1683      WHERE cle.id = p_cle_id
1684        and lse.id = cle.lse_id
1685        and lse.language = userenv('LANG');
1686 
1687     l_chrv_rec l_chrv_csr%ROWTYPE;
1688     l_line_name Varchar2(2000);
1689 
1690 
1691     -- l_cle_rec l_cle_csr%ROWTYPE;
1692     --TYPE l_cle_tbl_type is table of l_cle_csr%ROWTYPE INDEX BY BINARY_INTEGER;
1693     --l_cle_tbl l_cle_tbl_type;
1694 
1695 
1696     TYPE dte_tbl_type IS TABLE OF DATE INDEX BY BINARY_INTEGER;
1697     TYPE num_tbl_type IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
1698 
1699     l_start_date_tbl        dte_tbl_type;
1700     l_end_date_tbl          dte_tbl_type;
1701     l_id_tbl                num_tbl_type;
1702     l_chr_id_tbl            num_tbl_type;
1703     l_lse_id_tbl            num_tbl_type;
1704     l_parent_start_date_tbl dte_tbl_type;
1705     l_parent_end_date_tbl   dte_tbl_type;
1706 
1707 
1708     l_clev_rec l_clev_csr%ROWTYPE;
1709     l_index Number;
1710     l_prev_level Number := 0;
1711     l_parent_start_date DATE;
1712     l_parent_end_date DATE;
1713     l_parent_found Boolean;
1714     l_row_notfound Boolean;
1715     l_error_number Varchar2(4);
1716     l_return_status Varchar2(1);
1717 
1718    --
1719    l_proc varchar2(72) := g_package||'check_effectivity_dates';
1720    --
1721   BEGIN
1722 
1723   IF (l_debug = 'Y') THEN
1724      okc_debug.Set_Indentation(l_proc);
1725      okc_debug.Log('10: Entering ',2);
1726   END IF;
1727 
1728     -- initialize return status
1729     x_return_status := OKC_API.G_RET_STS_SUCCESS;
1730 
1731     -- check that start date is less than end date
1732     OPEN  l_chrv_csr;
1733     FETCH l_chrv_csr INTO l_chrv_rec;
1734     CLOSE l_chrv_csr;
1735 
1736     -- data is required
1737     IF (l_chrv_rec.start_date IS NULL) THEN
1738       OKC_API.set_message(
1739         p_app_name     => G_APP_NAME,
1740         p_msg_name     => 'OKC_QA_START_DATE_REQUIRED');
1741 
1742       -- notify caller of an error
1743       x_return_status := OKC_API.G_RET_STS_ERROR;
1744 
1745       -- halt validation
1746       RAISE G_EXCEPTION_HALT_VALIDATION;
1747     END IF;
1748 
1749     IF (l_chrv_rec.start_date > NVL(l_chrv_rec.end_date, l_chrv_rec.start_date)) THEN
1750       OKC_API.set_message(
1751         p_app_name      => G_APP_NAME,
1752         p_msg_name      => G_INVALID_END_DATE);
1753       -- notify caller of an error
1754       x_return_status := OKC_API.G_RET_STS_ERROR;
1755 
1756       -- halt validation
1757       RAISE G_EXCEPTION_HALT_VALIDATION;
1758     END IF;
1759 
1760     -- Loop thru the contract sub lines
1761 
1762     /***********************************************
1763     FOR l_cle_rec IN l_cle_csr LOOP
1764       If l_cle_rec.chr_id Is Not Null Then
1765         l_parent_start_date := l_chrv_rec.start_date;
1766         l_parent_end_date   := l_chrv_rec.end_date;
1767         l_cle_tbl.delete;
1768         l_index := 1;
1769       Else
1770         If l_cle_rec.level <> l_prev_level Then
1771 	     l_parent_found := False;
1772           If l_cle_tbl.COUNT > 0 Then
1773             FOR i IN l_cle_tbl.FIRST .. l_cle_tbl.LAST LOOP
1774               If l_cle_tbl(i).id = l_cle_rec.cle_id Then
1775                 l_parent_start_date := l_cle_tbl(i).start_date;
1776                 l_parent_end_date := l_cle_tbl(i).end_date;
1777                 l_parent_found := True;
1778                 Exit;
1779               End If;
1780             End Loop;
1781           End If;
1782           If Not l_parent_found Then
1783             -- Control should never reach here. It means something
1784             -- wrong with the data.
1785             l_parent_start_date := l_chrv_rec.start_date;
1786             l_parent_end_date   := l_chrv_rec.end_date;
1787 	  End If;
1788         End If;
1789       End If;
1790       l_cle_tbl(l_index).id := l_cle_rec.id;
1791       l_cle_tbl(l_index).start_date := l_cle_rec.start_date;
1792       l_cle_tbl(l_index).end_date := l_cle_rec.end_date;
1793       l_index := l_index + 1;
1794       l_prev_level := l_cle_rec.level;
1795       l_error_number := '0000';
1796 
1797       -- data is required
1798       IF (l_cle_rec.start_date IS NULL) THEN
1799         l_error_number := '1000';
1800       END IF;
1801 
1802       IF (l_cle_rec.start_date > NVL(l_cle_rec.end_date, l_cle_rec.start_date)) THEN
1803         l_error_number := substr(l_error_number, 1, 1) || '100';
1804       END IF;
1805 
1806       IF (l_cle_rec.end_date IS NULL AND
1807           l_parent_end_date IS NOT NULL) THEN
1808         l_error_number := substr(l_error_number, 1, 2) || '10';
1809       END IF;
1810 
1811       IF ((l_cle_rec.start_date NOT BETWEEN l_parent_start_date AND
1812            NVL(l_parent_end_date, l_cle_rec.start_date)) OR
1813           (l_cle_rec.end_date IS NOT NULL AND l_cle_rec.end_date NOT BETWEEN
1814            l_parent_start_date AND NVL(l_parent_end_date, l_cle_rec.end_date))) THEN
1815           --below if condition added for bug#3339185
1816           if ((l_cle_rec.lse_id >=2 and l_cle_rec.lse_id <=6) or (l_cle_rec.lse_id=15)or (l_cle_rec.lse_id=16) or (l_cle_rec.lse_id=17)
1817              or (l_cle_rec.lse_id>=21 and l_cle_rec.lse_id <=24)) then
1818               l_error_number := substr(l_error_number, 1, 3) || '2';  --coverage lines
1819           else --non coverage lines
1820             l_error_number := substr(l_error_number, 1, 3) || '1';
1821           end if;
1822         --l_error_number := substr(l_error_number, 1, 3) || '1';
1823       END IF;
1824       --at below if statement,added second condition for bug#3339185
1825       If (Instr(l_error_number, '1') > 0 or Instr(l_error_number, '2') > 0) Then
1826         x_return_status := OKC_API.G_RET_STS_ERROR;
1827         l_line_name := okc_contract_pub.get_concat_line_no(l_cle_rec.id, l_return_status);
1828         IF l_return_status <> okc_api.g_ret_sts_success THEN
1829           l_line_name := 'Unknown';
1830         END IF;
1831 
1832         If Substr(l_error_number, 1, 1) = '1' Then
1833           OKC_API.set_message(
1834             p_app_name     => G_APP_NAME,
1835             p_msg_name     => 'OKC_QA_LINE_SDATE_REQUIRED',
1836             p_token1       => 'LINE_NAME',
1837             p_token1_value => l_line_name);
1838         End If;
1839 
1840         If Substr(l_error_number, 2, 1) = '1' Then
1841           OKC_API.set_message(
1842             p_app_name     => G_APP_NAME,
1843             p_msg_name     => G_INVALID_LINE_DATES,
1844             p_token1       => 'LINE_NAME',
1845             p_token1_value => l_line_name);
1846         End If;
1847 
1848         If Substr(l_error_number, 3, 1) = '1' Then
1849           OKC_API.set_message(
1850             p_app_name     => G_APP_NAME,
1851             p_msg_name     => 'OKC_QA_LINE_EDATE_REQUIRED',
1852             p_token1       => 'LINE_NAME',
1853             p_token1_value => l_line_name);
1854         End If;
1855 
1856         If Substr(l_error_number, 4, 1) = '1' Then
1857           OKC_API.set_message(
1858             p_app_name     => G_APP_NAME,
1859             p_msg_name     => G_INVALID_LINE_DATES,
1860             p_token1       => 'LINE_NAME',
1861             p_token1_value => l_line_name);
1862         End If;
1863         --below condition added for bug#3339185
1864         If Substr(l_error_number, 4, 1) = '2' Then
1865           OKC_API.set_message(
1866             p_app_name     => G_APP_NAME,
1867             p_msg_name     => G_INVALID_COVERAGELINE_DATES,
1868             p_token1       => 'LINE_NAME',
1869             p_token1_value => l_line_name);
1870         End If;
1871       End If;
1872 
1873     END LOOP;   -- Lines attached to header
1874     ***********************************************/
1875 
1876 
1877     --added for bug 5442886
1878     OPEN l_cle_csr;
1879     LOOP
1880 
1881       FETCH l_cle_csr BULK COLLECT INTO l_start_date_tbl, l_end_date_tbl, l_id_tbl,
1882                                         l_chr_id_tbl, l_lse_id_tbl, l_parent_start_date_tbl,
1883                                         l_parent_end_date_tbl LIMIT G_BULK_FETCH_LIMIT;
1884 
1885       EXIT WHEN l_id_tbl.COUNT = 0;
1886 
1887       FOR i IN l_id_tbl.FIRST..l_id_tbl.LAST LOOP
1888 
1889           If l_chr_id_tbl(i) Is Not Null Then
1890              l_parent_start_date := l_chrv_rec.start_date;
1891              l_parent_end_date   := l_chrv_rec.end_date;
1892           Else
1893              l_parent_start_date := l_parent_start_date_tbl(i);
1894              l_parent_end_date   := l_parent_end_date_tbl(i);
1895 	     End if;
1896 
1897           l_error_number := '0000';
1898 
1899           -- data is required
1900           IF (l_start_date_tbl(i) IS NULL) THEN
1901             l_error_number := '1000';
1902           END IF;
1903 
1904           IF (l_start_date_tbl(i) > NVL(l_end_date_tbl(i), l_start_date_tbl(i))) THEN
1905             l_error_number := substr(l_error_number, 1, 1) || '100';
1906           END IF;
1907 
1908           IF (l_end_date_tbl(i) IS NULL AND
1909               l_parent_end_date IS NOT NULL) THEN
1910             l_error_number := substr(l_error_number, 1, 2) || '10';
1911           END IF;
1912 
1913           IF ((l_start_date_tbl(i) NOT BETWEEN l_parent_start_date AND
1914                NVL(l_parent_end_date, l_start_date_tbl(i))) OR
1915               (l_end_date_tbl(i) IS NOT NULL AND l_end_date_tbl(i) NOT BETWEEN
1916                l_parent_start_date AND NVL(l_parent_end_date, l_end_date_tbl(i)))) THEN
1917               --below if condition added for bug#3339185
1918               if ((l_lse_id_tbl(i) >=2 and l_lse_id_tbl(i) <=6) or (l_lse_id_tbl(i)=15)or (l_lse_id_tbl(i)=16) or (l_lse_id_tbl(i)=17)
1919                  or (l_lse_id_tbl(i)>=21 and l_lse_id_tbl(i) <=24)) then
1920                   l_error_number := substr(l_error_number, 1, 3) || '2';  --coverage lines
1921               else --non coverage lines
1922                 l_error_number := substr(l_error_number, 1, 3) || '1';
1923               end if;
1924             --l_error_number := substr(l_error_number, 1, 3) || '1';
1925           END IF;
1926           --at below if statement,added second condition for bug#3339185
1927           If (Instr(l_error_number, '1') > 0 or Instr(l_error_number, '2') > 0) Then
1928             x_return_status := OKC_API.G_RET_STS_ERROR;
1929             l_line_name := okc_contract_pub.get_concat_line_no(l_id_tbl(i), l_return_status);
1930             IF l_return_status <> okc_api.g_ret_sts_success THEN
1931               l_line_name := 'Unknown';
1932             END IF;
1933 
1934             If Substr(l_error_number, 1, 1) = '1' Then
1935               OKC_API.set_message(
1936                 p_app_name     => G_APP_NAME,
1937                 p_msg_name     => 'OKC_QA_LINE_SDATE_REQUIRED',
1938                 p_token1       => 'LINE_NAME',
1939                 p_token1_value => l_line_name);
1940             End If;
1941 
1942             If Substr(l_error_number, 2, 1) = '1' Then
1943               OKC_API.set_message(
1944                 p_app_name     => G_APP_NAME,
1945                 p_msg_name     => G_INVALID_LINE_DATES,
1946                 p_token1       => 'LINE_NAME',
1947                 p_token1_value => l_line_name);
1948             End If;
1949 
1950             If Substr(l_error_number, 3, 1) = '1' Then
1951               OKC_API.set_message(
1952                 p_app_name     => G_APP_NAME,
1953                 p_msg_name     => 'OKC_QA_LINE_EDATE_REQUIRED',
1954                 p_token1       => 'LINE_NAME',
1955                 p_token1_value => l_line_name);
1956             End If;
1957 
1958             If Substr(l_error_number, 4, 1) = '1' Then
1959               OKC_API.set_message(
1960                 p_app_name     => G_APP_NAME,
1961                 p_msg_name     => G_INVALID_LINE_DATES,
1962                 p_token1       => 'LINE_NAME',
1963                 p_token1_value => l_line_name);
1964             End If;
1965             --below condition added for bug#3339185
1966             If Substr(l_error_number, 4, 1) = '2' Then
1967               OKC_API.set_message(
1968                 p_app_name     => G_APP_NAME,
1969                 p_msg_name     => G_INVALID_COVERAGELINE_DATES,
1970                 p_token1       => 'LINE_NAME',
1971                 p_token1_value => l_line_name);
1972             End If;
1973           End If;
1974 
1975 
1976       END LOOP;
1977 
1978     END LOOP;   -- Lines attached to header
1979 
1980 
1981 
1982 
1983     -- notify caller of success
1984     IF x_return_status = OKC_API.G_RET_STS_SUCCESS THEN
1985       OKC_API.set_message(
1986         p_app_name      => G_APP_NAME,
1987         p_msg_name      => G_QA_SUCCESS);
1988     END IF;
1989 
1990   IF (l_debug = 'Y') THEN
1991      okc_debug.Log('1000: Leaving ',2);
1992      okc_debug.Reset_Indentation;
1993   END IF;
1994   EXCEPTION
1995   WHEN G_EXCEPTION_HALT_VALIDATION THEN
1996     IF (l_debug = 'Y') THEN
1997        okc_debug.Log('2000: Leaving ',2);
1998        okc_debug.Reset_Indentation;
1999     END IF;
2000     -- no processing necessary; validation can continue with next column
2001     NULL;
2002   WHEN OTHERS THEN
2003     IF (l_debug = 'Y') THEN
2004        okc_debug.Log('3000: Leaving ',2);
2005        okc_debug.Reset_Indentation;
2006     END IF;
2007     -- store SQL error message on message stack
2008     OKC_API.SET_MESSAGE(
2009       p_app_name        => G_APP_NAME,
2010       p_msg_name        => G_UNEXPECTED_ERROR,
2011       p_token1	        => G_SQLCODE_TOKEN,
2012       p_token1_value    => SQLCODE,
2013       p_token2          => G_SQLERRM_TOKEN,
2014       p_token2_value    => SQLERRM);
2015     -- notify caller of an error as UNEXPETED error
2016     x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
2017     -- verify that cursor was closed
2018     IF l_chrv_csr%ISOPEN THEN
2019       CLOSE l_chrv_csr;
2020     END IF;
2021     IF l_cle_csr%ISOPEN THEN
2022       CLOSE l_cle_csr;
2023     END IF;
2024     IF l_clev_csr%ISOPEN THEN
2025       CLOSE l_clev_csr;
2026     END IF;
2027   END check_effectivity_dates;
2028 --
2029 
2030 END OKC_QA_DATA_INTEGRITY;