DBA Data[Home] [Help]

PACKAGE BODY: APPS.OKC_XPRT_UTIL_PVT

Source


1 PACKAGE BODY OKC_XPRT_UTIL_PVT AS
2 /* $Header: OKCVXUTLB.pls 120.49.12000000.8 2007/08/10 21:55:40 krallapa ship $ */
3 
4   ------------------------------------------------------------------------------
5   -- GLOBAL CONSTANTS
6   ------------------------------------------------------------------------------
7   G_PKG_NAME                   CONSTANT   VARCHAR2(200) := 'OKC_XPRT_UTIL_PVT';
8   G_APP_NAME                   CONSTANT   VARCHAR2(3)   :=  OKC_API.G_APP_NAME;
9 
10   G_LEVEL_PROCEDURE            CONSTANT   NUMBER := FND_LOG.LEVEL_PROCEDURE;
11   G_MODULE                     CONSTANT   VARCHAR2(250) := 'okc.plsql.'||g_pkg_name||'.';
12   G_APPLICATION_ID             CONSTANT   NUMBER :=510; -- OKC Application
13 
14   G_FALSE                      CONSTANT   VARCHAR2(1) := FND_API.G_FALSE;
15   G_TRUE                       CONSTANT   VARCHAR2(1) := FND_API.G_TRUE;
16 
17   G_RET_STS_SUCCESS            CONSTANT   VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
18   G_RET_STS_ERROR              CONSTANT   VARCHAR2(1) := FND_API.G_RET_STS_ERROR;
19   G_RET_STS_UNEXP_ERROR        CONSTANT   VARCHAR2(1) := FND_API.G_RET_STS_UNEXP_ERROR;
20 
21   G_UNEXPECTED_ERROR           CONSTANT   VARCHAR2(200) := 'OKC_UNEXPECTED_ERROR';
22   G_SQLERRM_TOKEN              CONSTANT   VARCHAR2(200) := 'ERROR_MESSAGE';
23   G_SQLCODE_TOKEN              CONSTANT   VARCHAR2(200) := 'ERROR_CODE';
24   G_UNABLE_TO_RESERVE_REC      CONSTANT   VARCHAR2(200) := OKC_API.G_UNABLE_TO_RESERVE_REC;
25   G_PRODUCTION_MODE            CONSTANT   VARCHAR2(1)   :=  'p';
26   G_TEST_MODE                  CONSTANT   VARCHAR2(3)   :=  't';
27 
28   G_TEMPLATE_MODEL_OSR         CONSTANT VARCHAR2(255) := 'OKC:TEMPLATEMODEL:';
29 
30   G_EXPERT_QA_TYPE             CONSTANT   VARCHAR2(30)  := 'CONTRACT_EXPERT';
31 
32   G_OKC_MSG_INVALID_ARGUMENT   CONSTANT VARCHAR2(200) := 'OKC_CONTRACTS_INVALID_ARGUMENT';
33   G_QA_STS_WARNING             CONSTANT   varchar2(1) := OKC_TERMS_QA_GRP.G_QA_STS_WARNING;
34   --
35   -- Template Contract Expert QA Checks/Code
36   --
37   G_CHECK_TEMPLATE_RULE_STATUS  CONSTANT VARCHAR2(30) := 'CHECK_TEMPLATE_RULE_STATUS';
38   G_CHECK_TEMPLATE_NO_RULES     CONSTANT VARCHAR2(30) := 'CHECK_TEMPLATE_NO_RULES';
39 
40   --
41   -- Template Validation - Template Rule Status Not Active
42   --
43   G_OKC_TEMPLATE_RULE_STATUS   CONSTANT VARCHAR2(30) := 'OKC_XPRT_TMPL_RULE_STATUS';
44   G_OKC_TEMPLATE_RULE_STATUS_S CONSTANT VARCHAR2(30) := 'OKC_XPRT_TMPL_RULE_STATUS_S';
45 
46   --
47   -- Template Validation - No Active Rules attached to template
48   --
49   G_OKC_TEMPLATE_NO_RULES   CONSTANT VARCHAR2(30) := 'OKC_XPRT_TMPL_NO_RULES';
50   G_OKC_TEMPLATE_NO_RULES_S CONSTANT VARCHAR2(30) := 'OKC_XPRT_TMPL_NO_RULES_S';
51 
52   --
53   -- Document Contract Expert QA Checks/Code
54   --
55   G_CHECK_NEW_EXPERT_ART CONSTANT VARCHAR2(30) := 'CHECK_NEW_EXPERT_ART';
56   G_CHECK_OLD_EXPERT_ART CONSTANT VARCHAR2(30) := 'CHECK_OLD_EXPERT_ART';
57   G_CHECK_INVALID_CONFIG CONSTANT VARCHAR2(30) := 'CHECK_INVALID_CONFIG';
58   G_CHECK_INCOMPLT_CONFIG CONSTANT VARCHAR2(30) := 'CHECK_INCOMPLT_CONFIG';
59   G_CHECK_EXPERT_NOT_APPLIED CONSTANT VARCHAR2(30) := 'CHECK_EXPERT_NOT_APPLIED';
60   G_CHECK_TEMPLATE_NOT_PUBLISHED CONSTANT VARCHAR2(30) := 'CHECK_TEMPLATE_NOT_PUBLISHED';
61   G_CHECK_INVALID_XPRT_SECTION CONSTANT VARCHAR2(30) := 'CHECK_INVALID_XPRT_SECTION';
62   G_CHECK_EXPERT_PARTIALLY_RUN CONSTANT VARCHAR2(30) := 'CHECK_EXPERT_PARTIALLY_APPLIED';
63 
64   --
65   -- Invalid default section in Contract Expert section
66   --
67   G_OKC_INVALID_XPRT_SECTION CONSTANT VARCHAR2(30) := 'OKC_INVALID_XPRT_SECTION';
68   G_OKC_INVALID_XPRT_SECTION_S CONSTANT VARCHAR2(30) := 'OKC_INVALID_XPRT_SECTION_S';
69   --
70   -- Document Validation - Expert Never Used on Document
71   --
72   G_OKC_EXPERT_NOT_APPLIED CONSTANT VARCHAR2(30) := 'OKC_EXPRT_NOT_APPLIED';
73   G_OKC_EXPERT_NOT_APPLIED_S CONSTANT VARCHAR2(30) := 'OKC_EXPRT_NOT_APPLIED_S';
74   G_OKC_EXPERT_NOT_APPLIED_D CONSTANT VARCHAR2(30) := 'OKC_EXPRT_NOT_APPLIED_D';
75 
76   --
77   -- Document Validation - Expert Partially Used on Document
78   --
79   G_OKC_EXPERT_PARTIALLY_RUN CONSTANT VARCHAR2(30) := 'OKC_EXPRT_PARTIALLY_APPLIED';
80   G_OKC_EXPERT_PARTIALLY_RUN_S CONSTANT VARCHAR2(30) := 'OKC_EXPRT_PARTIALLY_APPLIED_S';
81   G_OKC_EXPERT_PARTIALLY_RUN_D CONSTANT VARCHAR2(30) := 'OKC_EXPRT_PARTIALLY_APPLIED_D';
82 
83   --
84   -- Document Validation - New Article from Expert
85   --
86   G_OKC_NEW_EXPERT_ART CONSTANT VARCHAR2(30) := 'OKC_EXPRT_NEW_ARTICLE';
87   G_OKC_NEW_EXPERT_ART_S CONSTANT VARCHAR2(30) := 'OKC_EXPRT_NEW_ARTICLE_S';
88   G_OKC_NEW_EXPERT_ART_D CONSTANT VARCHAR2(30) := 'OKC_EXPRT_NEW_ARTICLE_D';
89 
90   --
91   -- Document Validation - Delete Article from Expert
92   --
93   G_OKC_OLD_EXPERT_ART CONSTANT VARCHAR2(30) := 'OKC_EXPRT_OLD_ARTICLE';
94   G_OKC_OLD_EXPERT_ART_S CONSTANT VARCHAR2(30) := 'OKC_EXPRT_OLD_ARTICLE_S';
95   G_OKC_OLD_EXPERT_ART_D CONSTANT VARCHAR2(30) := 'OKC_EXPRT_OLD_ARTICLE_D';
96 
97   --
98   -- Document Validation - Incomplete Configuration
99   --
100   G_OKC_INCOMPLT_CONFIG CONSTANT VARCHAR2(30) := 'OKC_EXPRT_INCOMPLETE_CONFIG';
101   G_OKC_INCOMPLT_CONFIG_S CONSTANT VARCHAR2(30) := 'OKC_EXPRT_INCOMPLETE_CONFIG_S';
102   G_OKC_INCOMPLT_CONFIG_D CONSTANT VARCHAR2(30) := 'OKC_EXPRT_INCOMPLETE_CONFIG_D';
103 
104 
105   --
106   -- Document Validation - Invalid Configuration
107   --
108   G_OKC_INVALID_CONFIG CONSTANT VARCHAR2(30) := 'OKC_EXPRT_INVALID_CONFIG';
109   G_OKC_INVALID_CONFIG_S CONSTANT VARCHAR2(30) := 'OKC_EXPRT_INVALID_CONFIG_S';
110   G_OKC_INVALID_CONFIG_D CONSTANT VARCHAR2(30) := 'OKC_EXPRT_INVALID_CONFIG_D';
111 
112   --
113   -- Contract Expert Messages
114   --
115   G_OKC_CONTRACT_EXPERT CONSTANT VARCHAR2(30) := 'OKC_EXPRT_CE';
116   G_OKC_TEMPLATE_NOT_CE_ENABLED CONSTANT VARCHAR2(30) := 'OKC_EXPRT_TEMPL_NOT_ENABLD';
117   G_OKC_EXPRT_PROFILE_DISABLED CONSTANT VARCHAR2(30) := 'OKC_EXPRT_PROFILE_DISABLED';
118 
119 
120 ---------------------------------------------------
121 --  Procedure:
122 ---------------------------------------------------
123 PROCEDURE check_import_status
124 (
125  p_run_id           IN NUMBER,
126  p_import_status    IN VARCHAR2,
127  p_model_type       IN VARCHAR2,
128  x_return_status    OUT NOCOPY VARCHAR2,
129  x_msg_data	    OUT	NOCOPY VARCHAR2,
130  x_msg_count	    OUT	NOCOPY NUMBER
131 ) IS
132 
133 l_api_name                CONSTANT VARCHAR2(30) := 'check_import_status';
134 l_rec_number              NUMBER:= 0;
135 l_rule_number             NUMBER:= 0;
136 l_model                   VARCHAR2(450);
137 l_name                    cz_imp_rules.name%TYPE;
138 l_message                 cz_imp_rules.message%TYPE;
139 
140 CURSOR csr_db_logs IS
141 SELECT logtime,
142        caller,
143        message
144 FROM cz_db_logs
145 WHERE run_id = p_run_id
146 ORDER BY logtime;
147 
148 CURSOR csr_xfr_run_results IS
149 SELECT  imp_table,
150         disposition,
151         rec_status,
152         records
153 FROM cz_xfr_run_results
154 WHERE run_id = p_run_id ;
155 
156 CURSOR csr_rule_imp_dtls IS
157 SELECT name,
158        substr(message,1,200) msg
159 FROM cz_imp_rules
160 WHERE rec_status <> 'OK'
161   AND run_id = p_run_id ;
162 
163 
164 BEGIN
165 
166   -- start debug log
167   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
168      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
169                     G_MODULE||l_api_name,
170                     '100: Entered '||G_PKG_NAME ||'.'||l_api_name);
171   END IF;
172 
173   x_return_status :=  G_RET_STS_SUCCESS;
174 
175   -- Check the model that is imported
176    IF  p_model_type = 'V' THEN
177       l_model := 'Variable Model';
178    ELSIF  p_model_type = 'C' THEN
179       l_model := 'Clause Model';
180    ELSIF  p_model_type = 'T' THEN
181       l_model := 'Template Model';
182    ELSIF  p_model_type = 'R' THEN
183       l_model := 'Rules';
184    END IF;
185 
186   -- Check the cz_db_logs table for any messages and write to log file
187   fnd_file.put_line(FND_FILE.LOG,'  ');
188   fnd_file.put_line(FND_FILE.LOG,'Import Summary for '||l_model||' Run Id : '||p_run_id);
189   fnd_file.put_line(FND_FILE.LOG,'  ');
190 
191 
192   -- write to debug log file
193   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
194      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
195                     G_MODULE||l_api_name,
196                     '110:Import Status ');
197      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
198                     G_MODULE||l_api_name,
199                     '110:Imported :  '||l_model);
200      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
201                     G_MODULE||l_api_name,
202                     '110: Run Id :  '||p_run_id);
203      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
204                     G_MODULE||l_api_name,
205                     '110:---------- CZ_DB_LOGS  ----------------------------- ');
206      fnd_file.put_line(FND_FILE.LOG,'---------- CZ_DB_LOGS  ----------------------------- ');
207 
208   FOR csr_db_logs_rec IN csr_db_logs
209     LOOP
210       l_rec_number := l_rec_number +1;
211       fnd_file.put_line(FND_FILE.LOG,'  ');
212       fnd_file.put_line(FND_FILE.LOG,'*************** Record   :  '||l_rec_number||'  **************');
213       fnd_file.put_line(FND_FILE.LOG,'Logtime  :  '||csr_db_logs_rec.logtime);
214       fnd_file.put_line(FND_FILE.LOG,'Caller   :  '||csr_db_logs_rec.caller);
215       fnd_file.put_line(FND_FILE.LOG,'Message  :  '||csr_db_logs_rec.message);
216       fnd_file.put_line(FND_FILE.LOG,'  ');
217       fnd_file.put_line(FND_FILE.LOG,'  ');
218 
219       -- write to debug log file
220          IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
221             FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
222                            G_MODULE||l_api_name,
223                            '110: Logtime  :  '||csr_db_logs_rec.logtime);
224             FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
225                            G_MODULE||l_api_name,
226                            '110: Caller   :  '||csr_db_logs_rec.caller);
227             FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
228                            G_MODULE||l_api_name,
229                            '110: Message  :  '||csr_db_logs_rec.message);
230          END IF;
231 
232    END LOOP;
233 
234   END IF; -- debug log
235 
236 
237 
238   -- If CZ import returns ERROR then there was a database or fatal error
239   -- write to log and Abort the next steps of writing to log
240      IF (p_import_status = G_RET_STS_UNEXP_ERROR) THEN
241          fnd_file.put_line(FND_FILE.LOG,'CZ IMPORT API Return Status :  '||p_import_status);
242          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
243      ELSIF (x_return_status = G_RET_STS_ERROR) THEN
244          fnd_file.put_line(FND_FILE.LOG,'CZ IMPORT API Return Status :  '||p_import_status);
245          RAISE FND_API.G_EXC_ERROR;
246      END IF;
247 
248 
249   -- Check the summary of the import run results
250   fnd_file.put_line(FND_FILE.LOG,'               CZ_XFR_RUN_RESULTS');
251   fnd_file.put_line(FND_FILE.LOG,'----------------------------------------------------------------');
252    fnd_file.put_line(FND_FILE.LOG,RPAD('Import Table',25,' ')||
253                                   ' Disposition'||
254                                   ' Record Status'||
255                                   ' Total Records'
256 			      );
257   fnd_file.put_line(FND_FILE.LOG,'----------------------------------------------------------------');
258 
259   -- write to debug log file
260   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
261      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
262                     G_MODULE||l_api_name,
263                     '120:********** CZ_XFR_RUN_RESULTS  ***************************** ');
264   END IF;
265 
266 
267   -- initial l_rec_number
268   l_rec_number :=0;
269 
270   FOR csr_xfr_run_results_rec IN csr_xfr_run_results
271    LOOP
272       l_rec_number := l_rec_number +1;
273 	 fnd_file.put_line(FND_FILE.LOG,RPAD(csr_xfr_run_results_rec.imp_table,25,' ')||' '||
274 	                                RPAD(csr_xfr_run_results_rec.disposition,11,' ')||' '||
275 	                                RPAD(csr_xfr_run_results_rec.rec_status,13,' ')||' '||
276 							  RPAD(csr_xfr_run_results_rec.records,13,' ')
277 				    );
278 	 /*
279       fnd_file.put_line(FND_FILE.LOG,'  ');
280       fnd_file.put_line(FND_FILE.LOG,'*************** Record   :  '||l_rec_number||'  **************');
281       fnd_file.put_line(FND_FILE.LOG,'Import Table  :  '||csr_xfr_run_results_rec.imp_table);
282       fnd_file.put_line(FND_FILE.LOG,'Disposition   :  '||csr_xfr_run_results_rec.disposition);
283       fnd_file.put_line(FND_FILE.LOG,'Record Status :  '||csr_xfr_run_results_rec.rec_status);
284       fnd_file.put_line(FND_FILE.LOG,'Total Records :  '||csr_xfr_run_results_rec.records);
285       fnd_file.put_line(FND_FILE.LOG,'  ');
286       fnd_file.put_line(FND_FILE.LOG,'  ');
287 	 */
288 
289 
290       -- write to debug log file
291          IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
292             FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
293                            G_MODULE||l_api_name,
294                            '120: *************** Record   :  '||l_rec_number||'  **************');
295             FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
296                            G_MODULE||l_api_name,
297                            '120: Import Table  :  '||csr_xfr_run_results_rec.imp_table);
298             FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
299                            G_MODULE||l_api_name,
300                            '120: Disposition   :  '||csr_xfr_run_results_rec.disposition);
301             FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
302                            G_MODULE||l_api_name,
303                            '120: Record Status :  '||csr_xfr_run_results_rec.rec_status);
304             FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
305                            G_MODULE||l_api_name,
306                            '120: Total Records :  '||csr_xfr_run_results_rec.records);
307          END IF;
308 
309 
310       -- if any status is not OK then the import program was NOT successful in importing all records
311 	 -- for rule import this entity is not updated to OK
312 	 -- Need to roll back the changes to allow PASS status (Bug logged against CZ)
313         IF csr_xfr_run_results_rec.rec_status NOT IN ('OK','PASS') THEN
314            x_return_status :=  G_RET_STS_ERROR;
315         END IF;
316 
317    END LOOP;
318 
319   fnd_file.put_line(FND_FILE.LOG,'----------------------------------------------------------------');
320 
321   -- For Rule Import, if the return status is Error read message from cz_imp_rules
322   IF p_model_type = 'R' THEN
323       -- Check if any rules had error
324 	    OPEN csr_rule_imp_dtls;
325 	       FETCH csr_rule_imp_dtls INTO l_name, l_message;
326 		    IF csr_rule_imp_dtls%FOUND THEN
327 		      -- one or more rules in ERROR
328 			 fnd_file.put_line(FND_FILE.LOG,'Following Rules Could not be imported');
329                 fnd_file.put_line(FND_FILE.LOG,'-----------------------------------------------');
330 			 -- set out status to Error
331                 x_return_status :=  G_RET_STS_ERROR;
332 		    END IF;
333          CLOSE csr_rule_imp_dtls;
334 
335       -- initial l_rule_number
336       l_rule_number :=0;
337 
338       FOR csr_rule_imp_dtls_rec IN csr_rule_imp_dtls
339        LOOP
340           l_rule_number := l_rule_number +1;
341           fnd_file.put_line(FND_FILE.LOG,'  ');
342           fnd_file.put_line(FND_FILE.LOG,'--------------- Record   :  '||l_rule_number||'  --------------');
343           fnd_file.put_line(FND_FILE.LOG,'Rule Name :  '||csr_rule_imp_dtls_rec.name);
344           fnd_file.put_line(FND_FILE.LOG,'Message   :  '||csr_rule_imp_dtls_rec.msg);
345           fnd_file.put_line(FND_FILE.LOG,'  ');
346 
347        END LOOP;
348 
349   END IF; -- for Rule Import only
350 
351   -- end debug log
352   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
353      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
354                     G_MODULE||l_api_name,
355                     '1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
356   END IF;
357 
358 EXCEPTION
359   WHEN FND_API.G_EXC_ERROR THEN
360       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
361          FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
362                         G_MODULE||l_api_name,
363                         '2000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
364       END IF;
365 
366       x_return_status := G_RET_STS_ERROR ;
367       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
368 
369   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
370       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
371          FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
372                         G_MODULE||l_api_name,
373                         '3000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
374       END IF;
375 
376       x_return_status := G_RET_STS_UNEXP_ERROR ;
377       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
378 
379   WHEN OTHERS THEN
380       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
381          FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
382                         G_MODULE||l_api_name,
383                         '4000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
384       END IF;
385 
386    IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
387      FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
388    END IF;
389    x_return_status := G_RET_STS_UNEXP_ERROR ;
390    FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
391 
392 END check_import_status;
393 
394 ---------------------------------------------------
395 --  Function:
396 ---------------------------------------------------
397 FUNCTION is_rule_line_level (
398     p_rule_id    IN NUMBER
399 )
400 RETURN VARCHAR2 IS
401 
402 CURSOR c1 IS
403 --Check the Variable Type for line level
404 SELECT NVL(v.line_level_flag,'N') line_level_flag
405 FROM okc_xprt_rule_hdrs_all rhdr,
406      okc_xprt_rule_conditions rcon,
407      okc_bus_variables_b v
408 WHERE rhdr.rule_id = rcon.rule_id
409 AND rcon.object_type = 'VARIABLE'
410 AND rcon.object_code = v.variable_code
411 AND SUBSTR(rcon.object_code,1,3) = 'OKC'
412 AND v.line_level_flag = 'Y'
413 AND rhdr.rule_id = p_rule_id
414 UNION
415 SELECT NVL(v.line_level_flag,'N') line_level_flag
416 FROM okc_xprt_rule_hdrs_all rhdr,
417    okc_xprt_rule_conditions rcon,
418    okc_bus_variables_b v
419 WHERE rhdr.rule_id = rcon.rule_id
420 AND rcon.object_value_type = 'VARIABLE'
421 AND rcon.object_code = v.variable_code
422 AND SUBSTR(rcon.object_code,1,3) = 'OKC'
423 AND v.line_level_flag = 'Y'
424 AND rhdr.rule_id = p_rule_id;
425 
426 l_value  VARCHAR2(1) := 'N';
427 
428 BEGIN
429 
430  FOR c1_rec IN c1
431  LOOP
432    IF c1_rec.line_level_flag = 'Y' THEN
433      l_value := c1_rec.line_level_flag;
434    END IF;
435  END LOOP;
436 
437  RETURN l_value;
438 EXCEPTION
439  WHEN OTHERS THEN
440       --close cursors
441      IF c1%ISOPEN THEN
442        CLOSE c1;
443      END IF;
444      l_value := 'N';
445      RETURN l_value;
446 END is_rule_line_level;
447 
448 ---------------------------------------------------
449 --  Function:
450 ---------------------------------------------------
451 FUNCTION get_value_set_id
452 (
453  p_value_set_name    IN VARCHAR2
454 ) RETURN NUMBER IS
455 
456 CURSOR csr_value_set_id IS
457 SELECT flex_value_set_id
458 FROM fnd_flex_value_sets
459 WHERE flex_value_set_name = p_value_set_name;
460 
461 l_flex_value_set_id        fnd_flex_value_sets.flex_value_set_id%TYPE ;
462 
463 BEGIN
464 
465   OPEN csr_value_set_id;
466      FETCH csr_value_set_id INTO l_flex_value_set_id;
467   CLOSE csr_value_set_id;
468 
469   RETURN l_flex_value_set_id;
470 
471 END get_value_set_id;
472 
473 ---------------------------------------------------
474 --  Function:  This function will be called in template approval
475 --  Based on the return value of this function, a template will be imported
476 --  into CZ in the template approval workflow
477 ---------------------------------------------------
478 FUNCTION xprt_enabled_template
479 (
480  p_template_id       IN NUMBER
481 ) RETURN VARCHAR2 IS
482 
483 CURSOR csr_local_rules_templates IS
484 -- Local Rules on Template
485 SELECT 'X'
486   FROM okc_xprt_template_rules r,
487        okc_xprt_rule_hdrs_all h
488  WHERE r.rule_id = h.rule_id
489    AND h.status_code = 'ACTIVE'
490    AND template_id = p_template_id ;
491 
492 CURSOR csr_org_rules_templates IS
493 -- Org Wide Rules
494 SELECT 'X'
495   FROM okc_terms_templates_all t,
496        okc_xprt_rule_hdrs_all h
497  WHERE t.org_id = h.org_id
498    AND t.intent = h.intent
499    AND h.status_code = 'ACTIVE'
500    AND NVL(h.org_wide_flag,'N') = 'Y'
501    AND t.template_id = p_template_id  ;
502 
503 CURSOR csr_template_dtls IS
504 SELECT NVL(contract_expert_enabled,'N')
505   FROM okc_terms_templates_all
506  WHERE template_id = p_template_id;
507 
508 l_dummy        VARCHAR2(1);
509 l_expert_flag  VARCHAR2(1);
510 l_contract_expert_enabled okc_terms_templates_all.contract_expert_enabled%TYPE;
511 
512 BEGIN
513 
514   l_dummy := NULL;
515   l_expert_flag := 'N';
516 
517   --
518   -- Check if CE Profile is Enabled.
519   --
520      FND_PROFILE.GET(name=> 'OKC_K_EXPERT_ENABLED', val => l_expert_flag );
521 
522     IF NVL(l_expert_flag,'N') = 'N' THEN
523         -- Not Expert enabled
524         RETURN l_expert_flag;
525     END IF;
526 
527   -- check the expert flag on template
528   OPEN csr_template_dtls;
529     FETCH csr_template_dtls INTO l_contract_expert_enabled;
530   CLOSE csr_template_dtls;
531 
532   IF l_contract_expert_enabled = 'N' THEN
533     l_expert_flag := 'N';
534     RETURN l_expert_flag;
535   END IF;
536 
537   -- check if any local rules exists
538   OPEN csr_local_rules_templates;
539     FETCH csr_local_rules_templates INTO l_dummy;
540       IF csr_local_rules_templates%NOTFOUND THEN
541 	   -- check if any Org Rules exists
542 	      OPEN csr_org_rules_templates;
543 		   FETCH csr_org_rules_templates INTO l_dummy;
544 		     IF csr_org_rules_templates%NOTFOUND THEN
545 			  -- no local or org rules
546 			   l_expert_flag := 'N';
547 			ELSE
548 			  -- Org Rules Exists
549 			   l_expert_flag := 'Y';
550 			END IF;
551 		 CLOSE csr_org_rules_templates;
552 	 ELSE
553 	   -- local rules exists
554 	     l_expert_flag := 'Y';
555 	 END IF;
556   CLOSE csr_local_rules_templates;
557 
558   RETURN l_expert_flag;
559 
560 END xprt_enabled_template;
561 
562 /*
563   This API will delete all the test publications for a model
564 */
565 PROCEDURE delete_test_publications
566 (
567  p_devl_project_id  IN NUMBER,
568  x_return_status    OUT NOCOPY VARCHAR2,
569  x_msg_data	     OUT	NOCOPY VARCHAR2,
570  x_msg_count	     OUT	NOCOPY NUMBER
571 ) IS
572 
573 CURSOR csr_get_publication_dtl IS
574 SELECT publication_id
575 FROM cz_model_publications
576 WHERE model_id = p_devl_project_id
577 AND deleted_flag = '0'
578 AND publication_mode ='t'
579 AND source_target_flag = 'S'; -- only delete 'S' and never 'T'
580 
581 l_api_name                CONSTANT VARCHAR2(30) := 'delete_test_publications';
582 l_api_version              CONSTANT NUMBER := 1;
583 
584 BEGIN
585 
586   -- start debug log
587   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
588      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
589                     G_MODULE||l_api_name,
590                     '100: Entered '||G_PKG_NAME ||'.'||l_api_name);
591   END IF;
592 
593   x_return_status :=  G_RET_STS_SUCCESS;
594 
595   -- for the model get all test publications and delete
596      FOR rec_get_publication_dtl IN csr_get_publication_dtl
597 	LOOP
598     	          OKC_XPRT_CZ_INT_PVT.delete_publication
599 		     (
600 		      p_api_version           => l_api_version,
601 		      p_init_msg_lst          => FND_API.G_FALSE,
602 		      p_publication_id        => rec_get_publication_dtl.publication_id,
603 		      x_return_status         => x_return_status,
604 		      x_msg_count      	      => x_msg_count,
605 		      x_msg_data              => x_msg_data
606 		      );
607 
608                  --- If any errors happen abort API
609                  IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
610                     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
611                  ELSIF (x_return_status = G_RET_STS_ERROR) THEN
612                     RAISE FND_API.G_EXC_ERROR;
613                  END IF;
614 
615 	END LOOP; -- all test publications
616 
617 
618   -- end debug log
619   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
620      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
621                     G_MODULE||l_api_name,
622                     '1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
623   END IF;
624 
625 
626 EXCEPTION
627   WHEN FND_API.G_EXC_ERROR THEN
628       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
629          FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
630                         G_MODULE||l_api_name,
631                         '2000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
632       END IF;
633 
634       x_return_status := G_RET_STS_ERROR ;
635       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
636 
637   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
638       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
639          FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
640                         G_MODULE||l_api_name,
641                         '3000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
642       END IF;
643 
644       x_return_status := G_RET_STS_UNEXP_ERROR ;
645       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
646 
647   WHEN OTHERS THEN
648       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
649          FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
650                         G_MODULE||l_api_name,
651                         '4000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
652       END IF;
653 
654    IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
655      FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
656    END IF;
657    x_return_status := G_RET_STS_UNEXP_ERROR ;
658    FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
659 
660 END delete_test_publications;
661 
662 
663 /*
664    CZ Publication Process (cz_model_publications)
665                             rec# publication_mode    source_target_flag
666    create test publication   1     t                  S
667    publish test pub          2     t                  T    ( new record created)
668 
669    edit test to production   1     p                  S    ( record 1 updated )
670    edit test to production   2     p                  T    ( record 2 updated )
671 
672   Don't touch the source_target_flag with 'T'. Only access source_target_flag='S'
673   If you delete source_target_flag='S', then the source_target_flag='T' will also be deleted.
674 
675   If you delete a publication , then the purge program auto deletes UIs associated with
676   publication. So no need to explictly delete UI
677 
678   OCD shows only source_target_flag='S'  as the target record is never shown to user
679 */
680 
681 /*
682    Procedure : create_test_publication
683    This procedure does the following
684    For All templates in the current concurrent request id
685 	Delete Test Publications
686      Delete Existing UIs except the UI attached to production publication
687 	Create New UI
688 	Generate Logic for the template Model
689 	Create test publication for the Template Model
690 	Publish the test publication
691 */
692 PROCEDURE create_test_publication
693 (
694  x_return_status   OUT   NOCOPY VARCHAR2,
695  x_msg_data	    OUT	NOCOPY VARCHAR2,
696  x_msg_count	    OUT	NOCOPY NUMBER
697 ) IS
698 
699 CURSOR csr_templates IS
700 SELECT DECODE(parent_template_id, NULL, template_id, parent_template_id),
701        template_model_id
702   FROM okc_terms_templates_all
703  WHERE xprt_request_id = FND_GLOBAL.CONC_REQUEST_ID ;
704 
705 -- UIs for the template not attached to Production publication
706 CURSOR csr_template_ui(p_model_id IN NUMBER) IS
707 SELECT ui_def_id
708   FROM cz_ui_defs
709  WHERE devl_project_id = p_model_id
710    AND deleted_flag = '0'
711    AND ui_def_id NOT IN ( SELECT ui_def_id
712                             FROM cz_model_publications
713 					  WHERE model_id = p_model_id
714 					    AND publication_mode = G_PRODUCTION_MODE
715 					    AND  deleted_flag = '0'
716 					    AND source_target_flag = 'S'
717                         );
718 
719 
720 
721 l_api_version             CONSTANT NUMBER := 1;
722 l_api_name                CONSTANT VARCHAR2(30) := 'create_test_publication';
723 l_template_id             okc_terms_templates_all.template_id%TYPE;
724 l_template_model_id       okc_terms_templates_all.template_model_id%TYPE;
725 l_ui_def_id               cz_ui_defs.ui_def_id%TYPE;
726 l_new_ui_def_id           cz_ui_defs.ui_def_id%TYPE;
727 l_run_id                  NUMBER;
728 l_publication_id          NUMBER;
729 
730 
731 BEGIN
732 
733   -- start debug log
734   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
735      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
736                     G_MODULE||l_api_name,
737                     '100: Entered '||G_PKG_NAME ||'.'||l_api_name);
738   END IF;
739 
740   x_return_status :=  G_RET_STS_SUCCESS;
741 
742   OPEN csr_templates;
743     LOOP
744       FETCH csr_templates INTO l_template_id, l_template_model_id;
745 	 EXIT WHEN csr_templates%NOTFOUND;
746 	    -- Step 1:
747 	    -- Delete Test Publications
748 	    delete_test_publications
749          (
750           p_devl_project_id  =>  l_template_model_id,
751           x_return_status    =>  x_return_status,
752           x_msg_data	    =>  x_msg_data,
753           x_msg_count	    =>  x_msg_count
754          );
755                --- If any errors happen abort API
756                IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
757                  RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
758                ELSIF (x_return_status = G_RET_STS_ERROR) THEN
759                  RAISE FND_API.G_EXC_ERROR;
760                END IF;
761 
762 	    -- Step 2:
763 	    -- Delete Existing UIs except the UI attached to production publication
764 	    OPEN csr_template_ui(p_model_id => l_template_model_id);
765 	      LOOP
766 		   FETCH csr_template_ui INTO l_ui_def_id;
767 		   EXIT WHEN csr_template_ui%NOTFOUND;
768 		    -- Call CZ delete UI API
769 		     OKC_XPRT_CZ_INT_PVT.delete_ui_def
770                (
771                 p_api_version      =>  l_api_version,
772                 p_ui_def_id        =>  l_ui_def_id,
773                 x_return_status    =>  x_return_status,
774                 x_msg_data	     =>  x_msg_data,
775                 x_msg_count	     =>  x_msg_count
776                ) ;
777 
778                --- If any errors happen abort API
779                IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
780                  RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
781                ELSIF (x_return_status = G_RET_STS_ERROR) THEN
782                  RAISE FND_API.G_EXC_ERROR;
783                END IF;
784 
785 		 END LOOP; -- csr_template_ui
786 	    CLOSE csr_template_ui;
787 
788 	    -- Step 3:
789 	    -- Create a New UI for the template Model
790 	    OKC_XPRT_CZ_INT_PVT.create_jrad_ui
791 	     (
792 		 p_api_version         =>  l_api_version,
793            p_devl_project_id     =>  l_template_model_id,
794            p_show_all_nodes      =>  '0',
795            p_master_template_id  =>  OKC_XPRT_CZ_INT_PVT.G_MASTER_UI_TMPLATE_ID,
796            p_create_empty_ui     => '0',
797            x_ui_def_id           =>  l_new_ui_def_id,
798            x_return_status       =>  x_return_status,
799            x_msg_data	        =>  x_msg_data,
800            x_msg_count	        =>  x_msg_count
801           ) ;
802          --- If any errors happen abort API
803           IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
804              RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
805           ELSIF (x_return_status = G_RET_STS_ERROR) THEN
806              RAISE FND_API.G_EXC_ERROR;
807           END IF;
808 
809 
810 	    -- Step 4:
811 	    -- Generate Logic for the template Model
812 	    OKC_XPRT_CZ_INT_PVT.generate_logic
813 	     (
814 		 p_api_version         =>  l_api_version,
815 		 p_init_msg_lst        =>  FND_API.G_FALSE,
816            p_devl_project_id     =>  l_template_model_id,
817            x_run_id              =>  l_run_id,
818            x_return_status       =>  x_return_status,
819            x_msg_data	        =>  x_msg_data,
820            x_msg_count	        =>  x_msg_count
821           ) ;
822 
823          --- If any errors happen abort API
824           IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
825              RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
826           ELSIF (x_return_status = G_RET_STS_ERROR) THEN
827              RAISE FND_API.G_EXC_ERROR;
828           END IF;
829 
830 	    -- Step 5:
831          -- Create a test publication for the template Model
832 	    OKC_XPRT_CZ_INT_PVT.create_publication_request
833          (
834 		 p_api_version         =>  l_api_version,
835 		 p_init_msg_lst        =>  FND_API.G_FALSE,
836            p_devl_project_id     =>  l_template_model_id,
837 		 p_ui_def_id           =>  l_new_ui_def_id,
838 		 p_publication_mode    =>  't',
839 		 x_publication_id      =>  l_publication_id,
840            x_return_status       =>  x_return_status,
841            x_msg_data	        =>  x_msg_data,
842            x_msg_count	        =>  x_msg_count
843           ) ;
844 
845          --- If any errors happen abort API
846           IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
847              RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
848           ELSIF (x_return_status = G_RET_STS_ERROR) THEN
849              RAISE FND_API.G_EXC_ERROR;
850           END IF;
851 
852 
853 	    -- Step 6:
854          -- Publish test publication for the template Model
855 	    OKC_XPRT_CZ_INT_PVT.publish_model
856          (
857            p_api_version         =>  l_api_version,
858 	      p_init_msg_lst        =>  FND_API.G_FALSE,
859            p_publication_id      =>  l_publication_id,
860 	      x_run_id              =>  l_run_id,
861            x_return_status       =>  x_return_status,
862            x_msg_data	        =>  x_msg_data,
863            x_msg_count	        =>  x_msg_count
864           ) ;
865 
866          --- If any errors happen abort API
867           IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
868              RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
869           ELSIF (x_return_status = G_RET_STS_ERROR) THEN
870              RAISE FND_API.G_EXC_ERROR;
871           END IF;
872 
873 
874 	END LOOP; -- csr_templates
875   CLOSE csr_templates;
876 
877 
878   -- end debug log
879   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
880      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
881                     G_MODULE||l_api_name,
882                     '1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
883   END IF;
884 
885 
886 EXCEPTION
887   WHEN FND_API.G_EXC_ERROR THEN
888       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
889          FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
890                         G_MODULE||l_api_name,
891                         '2000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
892       END IF;
893 
894       x_return_status := G_RET_STS_ERROR ;
895       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
896 
897   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
898       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
899          FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
900                         G_MODULE||l_api_name,
901                         '3000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
902       END IF;
903 
904       x_return_status := G_RET_STS_UNEXP_ERROR ;
905       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
906 
907   WHEN OTHERS THEN
908       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
909          FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
910                         G_MODULE||l_api_name,
911                         '4000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
912       END IF;
913 
914    IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
915      FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
916    END IF;
917    x_return_status := G_RET_STS_UNEXP_ERROR ;
918    FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
919 
920 END create_test_publication;
921 
922 /*
923 This procedure populates the questions order table for a given template.
924 It is called either from the 'View Question Sequence' UI or from the
925 back-end processes to publish/disable rules or synchronize with CZ.
926 */
927 
928 
929 
930 PROCEDURE Populate_Questions_Order
931 (
932  p_Template_Id   IN NUMBER,
933  p_Commit_Flag   IN VARCHAR2,
934  p_Mode          IN VARCHAR2,
935  x_Return_Status OUT NOCOPY VARCHAR2,
936  x_Msg_Count     OUT NOCOPY NUMBER,
937  x_Msg_Data      OUT NOCOPY VARCHAR2
938 ) AS
939 
940   l_Api_Name CONSTANT VARCHAR2(30) := 'Populate_Questions_Order';
941   l_user_id CONSTANT Number := Fnd_Global.User_Id;
942   l_login_id CONSTANT Number := Fnd_Global.Login_Id;
943   l_conc_request_id CONSTANT Number := Fnd_Global.Conc_Request_Id;
944 
945   cursor Template_Cursor is
946   select org_id, intent from okc_terms_templates_all where template_id = p_Template_Id;
947 
948    l_Org_Id        NUMBER;
949    l_Intent        VARCHAR2(1);
950 
951 /*
952 Parameters for the procedure:
953 
954 p_Template_Id: The template for which question order is to be populated
955 
956 p_Commit_Flag: Depending upon 'Y' or 'N', either the procedure commits or does not.
957 
958 p_mode: The processing mode in which the method is called.
959 
960 p_mode can have values
961 
962 P : Publish mode. There might be some rules being published currently and they can be identified using the current request id from the rules headers table.
963 
964 D: Disable mode. There might be some rules being disabled currently and they can be identified using the current request id from the rules headers table.
965 
966 S: Synchronization mode. This mode is passed when the API is called from the Synchronization process for the template rebuild concurrent program
967 
968 U: UI mode: This mode is passed from the 'Question Reorder UI'.
969 
970 x_Return_Status, x_Msg_Count, x_Msg_Data : Standard parameters for exception handling.
971 */
972 BEGIN
973 
974   -- start debug log
975   IF (Fnd_Log.Level_Procedure >= Fnd_Log.g_Current_Runtime_Level) THEN
976     Fnd_Log.STRING(Fnd_Log.Level_Procedure,
977                    g_Module || l_Api_Name,
978                    '100: Entered ' || g_Pkg_Name || '.' || l_Api_Name);
979     Fnd_Log.STRING(Fnd_Log.Level_Procedure,
980                    g_Module || l_Api_Name,
981                    '100: Parameters passed: -----------------------');
982     Fnd_Log.STRING(Fnd_Log.Level_Procedure,
983                    g_Module || l_Api_Name,
984                    '100: p_Template_Id:' || p_Template_Id);
985     Fnd_Log.STRING(Fnd_Log.Level_Procedure,
986                    g_Module || l_Api_Name,
987                    '100: p_Commit_Flag:' || p_Commit_Flag);
988     Fnd_Log.STRING(Fnd_Log.Level_Procedure,
989                    g_Module || l_Api_Name,
990                    '100: p_Mode:' || p_Mode);
991     Fnd_Log.STRING(Fnd_Log.Level_Procedure,
992                    g_Module || l_Api_Name,
993                    '100: Parameters passed: -----------------------');
994   END IF;
995 
996 
997   x_Return_Status := g_Ret_Sts_Success;
998 
999   FOR Template_Rec IN template_cursor LOOP
1000     l_Org_Id := Template_Rec.Org_Id;
1001     l_Intent := Template_Rec.Intent;
1002   END LOOP;
1003   /*
1004   Delete questions from the table OKC_XPRT_QUESTION_ORDERS for the template where the questions do not exist in
1005   the left and right hand side of OKC_XPRT_RULE_CONDITIONS or in OKC_XPRT_RULE_OUTCOMES
1006   for all rules associated to the template in table OKC_XPRT_TEMPLATE_RULES or rules
1007   with ORG_WIDE_FLAG='Y'  and status in ('ACTIVE', 'DRAFT', 'REVISION', 'PENDINGPUB')
1008   */
1009 
1010   -- write to debug log file
1011   IF (Fnd_Log.Level_Procedure >= Fnd_Log.g_Current_Runtime_Level) THEN
1012     Fnd_Log.STRING(Fnd_Log.Level_Procedure,
1013                    g_Module || l_Api_Name,
1014                    '110: Deleting invalid questions from the table Okc_Xprt_Question_Orders');
1015   END IF;
1016 
1017 
1018   DELETE FROM Okc_Xprt_Question_Orders
1019    WHERE Template_Id = p_Template_Id
1020      AND NOT EXISTS
1021    (SELECT 1
1022             FROM Okc_Xprt_Rule_Conditions Cond,
1023                  okc_xprt_rule_hdrs_all   Rules,
1024                  Okc_Xprt_Template_Rules  Assoc,
1025 					  Okc_xprt_questions_b quest
1026            WHERE Rules.Rule_Id = Cond.Rule_Id
1027              AND Rules.Rule_Id = Assoc.Rule_Id
1028              AND Assoc.Template_Id = p_Template_Id
1029              AND ( ( to_char(Okc_Xprt_Question_Orders.Question_Id) = Cond.Object_Code
1030                      AND Cond.Object_Type = 'QUESTION') OR
1031                     (to_char(Okc_Xprt_Question_Orders.Question_Id) = Cond.Object_Value_Code
1032                      AND Cond.Object_Value_Type = 'QUESTION')
1033                   )
1034 				 AND quest.question_id = Okc_Xprt_Question_Orders.Question_Id
1035 				 AND Rules.Status_Code IN ('ACTIVE', 'DRAFT', 'REVISION', 'PENDINGDISABLE','PENDINGPUB')
1036           UNION ALL  --perf Bug#5030444 Replaced UNION with UNION ALL
1037           SELECT 1
1038             FROM Okc_Xprt_Rule_Outcomes  Outs,
1039                  okc_xprt_rule_hdrs_all  Rules,
1040                  Okc_Xprt_Template_Rules Assoc,
1041 					  Okc_xprt_questions_b quest
1042            WHERE Rules.Rule_Id = Assoc.Rule_Id
1043              AND Rules.rule_id = Outs.rule_id
1044              AND Assoc.Template_Id = p_Template_Id
1045              AND to_char(Okc_Xprt_Question_Orders.Question_Id) =
1046                  Outs.Object_Value_Id
1047              AND Outs.Object_Type = 'QUESTION'
1048 			    AND quest.question_id = Okc_Xprt_Question_Orders.Question_Id
1049 				 AND Rules.Status_Code IN ('ACTIVE', 'DRAFT', 'REVISION', 'PENDINGDISABLE','PENDINGPUB')
1050           UNION ALL   --perf Bug#5030444 Replaced UNION with UNION ALL
1051           SELECT 1
1052             FROM Okc_Xprt_Rule_Conditions Cond, okc_xprt_rule_hdrs_all Rules,
1053 					  Okc_xprt_questions_b quest
1054            WHERE Rules.Rule_Id = Cond.Rule_Id
1055              AND Rules.Org_Wide_Flag = 'Y'
1056              AND Rules.Org_Id = l_Org_Id
1057              AND Rules.Intent = l_Intent
1058              AND ( (to_char(Okc_Xprt_Question_Orders.Question_Id) = Cond.Object_Code
1059                      AND Cond.Object_Type = 'QUESTION') OR
1060                     (to_char(Okc_Xprt_Question_Orders.Question_Id) = Cond.Object_Value_Code
1061                      AND Cond.Object_Value_Type = 'QUESTION')
1062                   )
1063 			    AND quest.question_id = Okc_Xprt_Question_Orders.Question_Id
1064 				 AND Rules.Status_Code IN ('ACTIVE', 'DRAFT', 'REVISION', 'PENDINGDISABLE','PENDINGPUB')
1065           UNION ALL  --perf Bug#5030444 Replaced UNION with UNION ALL
1066           SELECT 1
1067             FROM Okc_Xprt_Rule_Outcomes Outs, okc_xprt_rule_hdrs_all Rules,
1068 					  Okc_xprt_questions_b quest
1069            WHERE Rules.Rule_Id = Outs.Rule_Id
1070              AND Rules.Org_Wide_Flag = 'Y'
1071              AND Rules.Org_Id = l_Org_Id
1072              AND Rules.Intent = l_Intent
1073              AND to_char(Okc_Xprt_Question_Orders.Question_Id) =
1074                  Outs.Object_Value_Id
1075              AND Outs.Object_Type = 'QUESTION'
1076 			    AND quest.question_id = Okc_Xprt_Question_Orders.Question_Id
1077 				 AND Rules.Status_Code IN ('ACTIVE', 'DRAFT', 'REVISION', 'PENDINGDISABLE','PENDINGPUB')
1078              );
1079 
1080   -- write to debug log file
1081   IF (Fnd_Log.Level_Procedure >= Fnd_Log.g_Current_Runtime_Level) THEN
1082     Fnd_Log.STRING(Fnd_Log.Level_Procedure,
1083                    g_Module || l_Api_Name,
1084                    '120: Deleted invalid questions from the table Okc_Xprt_Question_Orders');
1085   END IF;
1086   /*
1087       Initialize the statuses for the questions for the template
1088   */
1089 
1090 
1091 
1092   -- write to debug log file
1093   IF (Fnd_Log.Level_Procedure >= Fnd_Log.g_Current_Runtime_Level) THEN
1094     Fnd_Log.STRING(Fnd_Log.Level_Procedure,
1095                    g_Module || l_Api_Name,
1096                    '130: Initialize the status for the questions for the template.');
1097   END IF;
1098   UPDATE Okc_Xprt_Question_Orders
1099      SET Question_Rule_Status = 'DRAFT',
1100          Last_Updated_By      = l_user_id,
1101          Last_Update_Date     = SYSDATE,
1102          Last_Update_Login    = l_login_id,
1103 	    runtime_available_flag = 'N'
1104    WHERE Template_Id = p_Template_Id;
1105 
1106 
1107   /*
1108   2.  Open cursor to select questions for the template
1109   FROM
1110   the left and right hand side of OKC_XPRT_RULE_CONDITIONS or in OKC_XPRT_RULE_OUTCOMES
1111   for all rules associated to the template in table OKC_XPRT_TEMPLATE_RULES or rules with ORG_WIDE_FLAG='Y'  and status = 'ACTIVE'
1112   */
1113 
1114   IF (Fnd_Log.Level_Procedure >= Fnd_Log.g_Current_Runtime_Level) THEN
1115     Fnd_Log.STRING(Fnd_Log.Level_Procedure,
1116                    g_Module || l_Api_Name,
1117                    '140: Start inserting/updating the Active rule questions.');
1118   END IF;
1119 
1120   DECLARE
1121     CURSOR Active_Draft_Rule_Questions IS
1122     	SELECT * FROM (
1123       SELECT distinct To_Number(Cond.Object_Code) Question_Id, Rules.Status_Code
1124         FROM Okc_Xprt_Rule_Conditions Cond,
1125              okc_xprt_rule_hdrs_all   Rules,
1126              Okc_Xprt_Template_Rules  Assoc
1127        WHERE Rules.Rule_Id = Cond.Rule_Id
1128          AND Rules.Rule_Id = Assoc.Rule_Id
1129          AND Assoc.Template_Id = p_Template_Id
1130          AND Cond.Object_Type = 'QUESTION'
1131          AND Rules.Status_Code IN ('ACTIVE', 'DRAFT', 'REVISION', 'PENDINGDISABLE')
1132       UNION
1133       SELECT distinct To_Number(Cond.Object_Value_Code) Question_Id, Rules.Status_Code
1134         FROM Okc_Xprt_Rule_Conditions Cond,
1135              okc_xprt_rule_hdrs_all   Rules,
1136              Okc_Xprt_Template_Rules  Assoc
1137        WHERE Rules.Rule_Id = Cond.Rule_Id
1138          AND Rules.Rule_Id = Assoc.Rule_Id
1139          AND Assoc.Template_Id = p_Template_Id
1140          AND Cond.Object_Value_Type = 'QUESTION'
1141          AND Rules.Status_Code IN ('ACTIVE', 'DRAFT', 'REVISION', 'PENDINGDISABLE')
1142       UNION
1143       SELECT distinct To_Number(Outs.Object_Value_Id) Question_Id, Rules.Status_Code
1144         FROM Okc_Xprt_Rule_Outcomes   Outs,
1145              okc_xprt_rule_hdrs_all   Rules,
1146              Okc_Xprt_Template_Rules  Assoc
1147        WHERE Rules.Rule_Id = Assoc.Rule_Id
1148          AND Assoc.Template_Id = p_Template_Id
1149          AND Outs.Object_Type = 'QUESTION'
1150          AND Outs.rule_id = Rules.rule_id
1151          AND Rules.Status_Code IN ('ACTIVE', 'DRAFT', 'REVISION', 'PENDINGDISABLE')
1152       UNION
1153       SELECT distinct To_Number(Cond.Object_Code) Question_Id, Rules.Status_Code
1154         FROM Okc_Xprt_Rule_Conditions Cond,
1155              okc_xprt_rule_hdrs_all   Rules
1156        WHERE Rules.Rule_Id = Cond.Rule_Id
1157          AND Rules.Org_Wide_Flag = 'Y'
1158          AND Rules.Org_Id = l_Org_Id
1159          AND Rules.Intent = l_Intent
1160          AND Cond.Object_Type = 'QUESTION'
1161          AND Rules.Status_Code IN ('ACTIVE', 'DRAFT', 'REVISION', 'PENDINGDISABLE')
1162       UNION
1163       SELECT distinct To_Number(Cond.Object_Value_Code) Question_Id, Rules.Status_Code
1164         FROM Okc_Xprt_Rule_Conditions Cond,
1165              okc_xprt_rule_hdrs_all   Rules
1166        WHERE Rules.Rule_Id = Cond.Rule_Id
1167          AND Rules.Org_Wide_Flag = 'Y'
1168          AND Rules.Org_Id = l_Org_Id
1169          AND Rules.Intent = l_Intent
1170          AND Cond.Object_Value_Type = 'QUESTION'
1171          AND Rules.Status_Code IN ('ACTIVE', 'DRAFT', 'REVISION', 'PENDINGDISABLE')
1172       UNION
1173       SELECT distinct To_Number(Outs.Object_Value_Id) Question_Id, Rules.Status_Code
1174         FROM Okc_Xprt_Rule_Outcomes   Outs,
1175              okc_xprt_rule_hdrs_all   Rules
1176        WHERE Rules.Rule_Id = Outs.Rule_Id
1177          AND Rules.Org_Wide_Flag = 'Y'
1178          AND Rules.Org_Id = l_Org_Id
1179          AND Rules.Intent = l_Intent
1180          AND Outs.Object_Type = 'QUESTION'
1181          AND Outs.rule_id = Rules.rule_id
1182          AND Rules.Status_Code IN ('ACTIVE', 'DRAFT', 'REVISION', 'PENDINGDISABLE')
1183       ) ORDER BY Status_Code DESC;
1184     l_Question_Id NUMBER;
1185 
1186   BEGIN
1187 
1188     /*
1189     3.  Run a loop on the cursor to update/insert records into OKC_XPRT_QUESTION_ORDERS and set Draft_rule_qst_flag = 'ACTIVE' or 'DRAFT' based on the rule status.
1190 
1191     */
1192 
1193     FOR Question_Rec IN Active_Draft_Rule_Questions LOOP
1194 
1195       l_Question_Id := Question_Rec.Question_Id;
1196 
1197 
1198       UPDATE Okc_Xprt_Question_Orders
1199          SET Question_Rule_Status = DECODE(Question_Rec.Status_Code, 'ACTIVE','ACTIVE','DRAFT' ),
1200              Last_Updated_By      = l_user_id,
1201              Last_Update_Date     = SYSDATE,
1202              Last_Update_Login    = l_login_id,
1203 		   runtime_available_flag = DECODE(Question_Rec.Status_Code, 'ACTIVE', 'Y','N')
1204        WHERE Template_Id = p_Template_Id
1205          AND Question_Id = l_Question_Id;
1206 
1207       IF SQL%NOTFOUND THEN
1208 
1209         INSERT INTO Okc_Xprt_Question_Orders
1210           (Question_Order_Id,
1211            Template_Id,
1212            Question_Id,
1213            Question_Rule_Status,
1214 		 runtime_available_flag,
1215            Object_Version_Number,
1216            Created_By,
1217            Creation_Date,
1218            Last_Updated_By,
1219            Last_Update_Date,
1220            Last_Update_Login)
1221         VALUES
1222           (OKC_XPRT_QUESTION_ORDERS_S.NEXTVAL,
1223            p_Template_Id,
1224            l_Question_Id,
1225            DECODE(Question_Rec.Status_Code, 'ACTIVE','ACTIVE','DRAFT'),
1226 		 DECODE(Question_Rec.Status_Code, 'ACTIVE','Y','N'),
1227            1,
1228            l_user_id,
1229            SYSDATE,
1230            l_user_id,
1231            SYSDATE,
1232            l_login_id);
1233       END IF;
1234     END LOOP;
1235   END;
1236   /*
1237   4.  Do similar processing for rules in Pending Publication status
1238   */
1239 
1240   IF (Fnd_Log.Level_Procedure >= Fnd_Log.g_Current_Runtime_Level) THEN
1241     Fnd_Log.STRING(Fnd_Log.Level_Procedure,
1242                    g_Module || l_Api_Name,
1243                    '150: End inserting/updating the Active rule questions.');
1244 
1245     Fnd_Log.STRING(Fnd_Log.Level_Procedure,
1246                    g_Module || l_Api_Name,
1247                    '160: Start inserting/updating the Pending Publication rule questions.');
1248   END IF;
1249 
1250   DECLARE
1251     CURSOR Pending_Rule_Questions IS
1252       SELECT distinct To_Number(Cond.Object_Code) Question_Id
1253         FROM Okc_Xprt_Rule_Conditions Cond,
1254              okc_xprt_rule_hdrs_all   Rules,
1255              Okc_Xprt_Template_Rules  Assoc
1256        WHERE Rules.Rule_Id = Cond.Rule_Id
1257          AND Rules.Rule_Id = Assoc.Rule_Id
1258          AND Assoc.Template_Id = p_Template_Id
1259          AND Cond.Object_Type = 'QUESTION'
1260          AND Rules.Status_Code IN ('PENDINGPUB')
1261          AND Rules.Request_Id = l_conc_request_id
1262       UNION
1263       SELECT distinct To_Number(Cond.Object_Value_Code) Question_Id
1264         FROM Okc_Xprt_Rule_Conditions Cond,
1265              okc_xprt_rule_hdrs_all   Rules,
1266              Okc_Xprt_Template_Rules  Assoc
1267        WHERE Rules.Rule_Id = Cond.Rule_Id
1268          AND Rules.Rule_Id = Assoc.Rule_Id
1269          AND Assoc.Template_Id = p_Template_Id
1270          AND Cond.Object_Value_Type = 'QUESTION'
1271          AND Rules.Status_Code IN ('PENDINGPUB')
1272          AND Rules.Request_Id = l_conc_request_id
1273       UNION
1274       SELECT distinct To_Number(Outs.Object_Value_Id) Question_Id
1275         FROM Okc_Xprt_Rule_Outcomes   Outs,
1276              okc_xprt_rule_hdrs_all   Rules,
1277              Okc_Xprt_Template_Rules  Assoc
1278        WHERE Rules.Rule_Id = Assoc.Rule_Id
1279          AND Assoc.Template_Id = p_Template_Id
1280          AND Outs.Object_Type = 'QUESTION'
1281          And Outs.rule_id = Rules.rule_id
1282          AND Rules.Status_Code IN ('PENDINGPUB')
1283          AND Rules.Request_Id = l_conc_request_id
1284       UNION
1285       SELECT distinct To_Number(Cond.Object_Code) Question_Id
1286         FROM Okc_Xprt_Rule_Conditions Cond,
1287              okc_xprt_rule_hdrs_all   Rules
1288        WHERE Rules.Rule_Id = Cond.Rule_Id
1289          AND Rules.Org_Wide_Flag = 'Y'
1290          AND Rules.Org_Id = l_Org_Id
1291          AND Rules.Intent = l_Intent
1292          AND Cond.Object_Type = 'QUESTION'
1293          AND Rules.Status_Code IN ('PENDINGPUB')
1294          AND Rules.Request_Id = l_conc_request_id
1295       UNION
1296       SELECT distinct To_Number(Cond.Object_Value_Code) Question_Id
1297         FROM Okc_Xprt_Rule_Conditions Cond,
1298              okc_xprt_rule_hdrs_all   Rules
1299        WHERE Rules.Rule_Id = Cond.Rule_Id
1300          AND Rules.Org_Wide_Flag = 'Y'
1301          AND Rules.Org_Id = l_Org_Id
1302          AND Rules.Intent = l_Intent
1303          AND Cond.Object_Value_Type = 'QUESTION'
1304          AND Rules.Status_Code IN ('PENDINGPUB')
1305          AND Rules.Request_Id = l_conc_request_id
1306       UNION
1307       SELECT distinct To_Number(Outs.Object_Value_Id) Question_Id
1308         FROM Okc_Xprt_Rule_Outcomes   Outs,
1309              okc_xprt_rule_hdrs_all   Rules
1310        WHERE Rules.Rule_Id = Outs.Rule_Id
1311          AND Rules.Org_Wide_Flag = 'Y'
1312          AND Rules.Org_Id = l_Org_Id
1313          AND Rules.Intent = l_Intent
1314          AND Outs.Object_Type = 'QUESTION'
1315          AND Outs.rule_id = Rules.rule_id
1316          AND Rules.Status_Code IN ('PENDINGPUB')
1317          AND Rules.Request_Id = l_conc_request_id;
1318     l_Question_Id NUMBER;
1319   BEGIN
1320 
1321     /*
1322     Run a loop on the cursor to update/insert records into OKC_XPRT_QUESTION_ORDERS and set QUESTION_RULE_STATUS = 'PENDINGPUB'.
1323 
1324     */
1325     FOR Question_Rec IN Pending_Rule_Questions LOOP
1326 
1327       l_Question_Id := Question_Rec.Question_Id;
1328 
1329 
1330       UPDATE Okc_Xprt_Question_Orders
1331          SET Question_Rule_Status = DECODE(Question_Rule_Status,'ACTIVE','ACTIVE','PENDINGPUB'),
1332              Last_Updated_By      = l_user_id,
1333              Last_Update_Date     = SYSDATE,
1334              Last_Update_Login    = l_login_id,
1335 		   runtime_available_flag = DECODE(Question_Rule_Status,'ACTIVE','Y','N')
1336        WHERE Template_Id = p_Template_Id
1337          AND Question_Id = l_Question_Id ;
1338 
1339       IF SQL%NOTFOUND THEN
1340 
1341         INSERT INTO Okc_Xprt_Question_Orders
1342           (Question_Order_Id,
1343            Template_Id,
1344            Question_Id,
1345            Question_Rule_Status,
1346 		 runtime_available_flag,
1347            Object_Version_Number,
1348            Created_By,
1349            Creation_Date,
1350            Last_Updated_By,
1351            Last_Update_Date,
1352            Last_Update_Login)
1353         VALUES
1354           (OKC_XPRT_QUESTION_ORDERS_S.NEXTVAL,
1355            p_Template_Id,
1356            l_Question_Id,
1357            'PENDINGPUB',
1358 		 'N',
1359            1,
1360            l_user_id,
1361            SYSDATE,
1362            l_user_id,
1363            SYSDATE,
1364            l_login_id);
1365       END IF;
1366     END LOOP;
1367   END;
1368 
1369   /*
1370   5.  Update all the records for the table and set mandatory_flag = 'N'.
1371   Then set mandatory_flag = 'Y' for those questions which appear only in the conditions and not in the outcome.
1372   In the UI mode, choose all rules for selecting the questions.
1373   For all other modes, only select 'ACTIVE' rules and 'PENDINGPUB' rules for the request id.
1374   */
1375 
1376 
1377   UPDATE Okc_Xprt_Question_Orders
1378      SET Mandatory_Flag    = 'N',
1379          Last_Updated_By   = l_user_id,
1380          Last_Update_Date  = SYSDATE,
1381          Last_Update_Login = l_login_id
1382    WHERE Template_Id = p_Template_Id;
1383 
1384   IF p_Mode = 'U' THEN
1385 
1386     IF (Fnd_Log.Level_Procedure >= Fnd_Log.g_Current_Runtime_Level) THEN
1387       Fnd_Log.STRING(Fnd_Log.Level_Procedure,
1388                      g_Module || l_Api_Name,
1389                      '210: Process the "U" mode.');
1390     END IF;
1391 
1392     --Fix for perf Bug#5030429.Breaking big Update stmt into 4 small Update stmts one for each subquery
1393     --Update stmt1: set mandatory_flag = 'Y' for those questions which appear in the conditions of non-org wide rule
1394     UPDATE Okc_Xprt_Question_Orders
1395        SET Mandatory_Flag    = 'Y',
1396            Last_Updated_By   = l_user_id,
1397            Last_Update_Date  = SYSDATE,
1398            Last_Update_Login = l_login_id
1399      WHERE Template_Id = p_Template_Id
1400        AND Question_Id IN
1401            (SELECT Ord.Question_Id
1402               FROM Okc_Xprt_Rule_Conditions Cond,
1403                    okc_xprt_rule_hdrs_all   Rules,
1404                    Okc_Xprt_Template_Rules  Assoc,
1405                    Okc_Xprt_Question_Orders Ord
1406              WHERE Rules.Rule_Id = Cond.Rule_Id
1407                AND Rules.Rule_Id = Assoc.Rule_Id
1408                AND Assoc.Template_Id = p_Template_Id
1409                AND (
1410                     (to_char(Ord.Question_Id) = Cond.Object_Code
1411                        AND Cond.Object_Type = 'QUESTION') OR
1412                     (to_char(Ord.Question_Id) = Cond.Object_Value_Code
1413                        AND Cond.Object_Value_Type = 'QUESTION')
1414                     )
1415             );
1416     --Update stmt2: set mandatory_flag = 'Y' for those questions which appear in the conditions of ORG wide rule
1417     UPDATE Okc_Xprt_Question_Orders
1418        SET Mandatory_Flag    = 'Y',
1419            Last_Updated_By   = l_user_id,
1420            Last_Update_Date  = SYSDATE,
1421            Last_Update_Login = l_login_id
1422      WHERE Template_Id = p_Template_Id
1423        AND Question_Id IN
1424            (SELECT Ord.Question_Id
1425               FROM Okc_Xprt_Rule_Conditions Cond,
1426                    okc_xprt_rule_hdrs_all   Rules,
1427                    Okc_Xprt_Question_Orders Ord
1428              WHERE Rules.Rule_Id = Cond.Rule_Id
1429                AND Rules.Org_Wide_Flag = 'Y'
1430                AND Rules.Org_Id = l_Org_Id
1431                AND Rules.Intent = l_Intent
1432                AND (
1433                     (to_char(Ord.Question_Id) = Cond.Object_Code
1434                        AND Cond.Object_Type = 'QUESTION') OR
1435                     (to_char(Ord.Question_Id) = Cond.Object_Value_Code
1436                        AND Cond.Object_Value_Type = 'QUESTION')
1437                     )
1438             );
1439     --Update stmt3: set mandatory_flag = 'N' for those questions which appear in the outcome of non-ORG wide rule
1440     UPDATE Okc_Xprt_Question_Orders
1441        SET Mandatory_Flag    = 'N',
1442            Last_Updated_By   = l_user_id,
1443            Last_Update_Date  = SYSDATE,
1444            Last_Update_Login = l_login_id
1445      WHERE Template_Id = p_Template_Id
1446        AND Question_Id IN
1447            (SELECT Ord.Question_Id
1448               FROM Okc_Xprt_Rule_Outcomes   Outs,
1449                    okc_xprt_rule_hdrs_all   Rules,
1450                    Okc_Xprt_Template_Rules  Assoc,
1451                    Okc_Xprt_Question_Orders Ord
1452              WHERE Rules.Rule_Id = Assoc.Rule_Id
1453                AND Assoc.Template_Id = p_Template_Id
1454                AND to_char(Ord.Question_Id) = Outs.Object_Value_Id
1455                AND Outs.Object_Type = 'QUESTION'
1456                AND rules.rule_id = outs.rule_id
1457 	       AND rules.status_code <> 'INACTIVE' --Added for Bug#4108690
1458             );
1459      --Update stmt4: set mandatory_flag = 'N' for those questions which appear in the outcome of ORG wide rule
1460      UPDATE Okc_Xprt_Question_Orders
1461        SET Mandatory_Flag    = 'N',
1462            Last_Updated_By   = l_user_id,
1463            Last_Update_Date  = SYSDATE,
1464            Last_Update_Login = l_login_id
1465      WHERE Template_Id = p_Template_Id
1466        AND Question_Id IN
1467            (SELECT Ord.Question_Id
1468               FROM Okc_Xprt_Rule_Outcomes   Outs,
1469                    okc_xprt_rule_hdrs_all   Rules,
1470                    Okc_Xprt_Question_Orders Ord
1471              WHERE Rules.Rule_Id = Outs.Rule_Id
1472                AND Rules.Org_Wide_Flag = 'Y'
1473                AND Rules.Org_Id = l_Org_Id
1474                AND Rules.Intent = l_Intent
1475 	         AND Rules.status_code <> 'INACTIVE' --Added for Bug#4108690
1476                AND to_char(Ord.Question_Id) = Outs.Object_Value_Id
1477                AND Outs.Object_Type = 'QUESTION'
1478             );
1479   ELSE --IF p_Mode = 'U'
1480 
1481     IF (Fnd_Log.Level_Procedure >= Fnd_Log.g_Current_Runtime_Level) THEN
1482       Fnd_Log.STRING(Fnd_Log.Level_Procedure,
1483                      g_Module || l_Api_Name,
1484                      '210: Process modes other than "U".');
1485     END IF;
1486     --Fix for perf Bug#5030086.Breaking big Update stmt into 4 small Update stmts
1487     --Update stmt1: set mandatory_flag = 'Y' for those questions which appear in the conditions of
1488     --Org and non-Org wide rules and rule status is ACTIVE
1489     UPDATE Okc_Xprt_Question_Orders
1490        SET Mandatory_Flag    = 'Y',
1491            Last_Updated_By   = l_user_id,
1492            Last_Update_Date  = SYSDATE,
1493            Last_Update_Login = l_login_id
1494      WHERE Template_Id = p_Template_Id
1495        AND Question_Id IN
1496            (SELECT Ord.Question_Id
1497               FROM Okc_Xprt_Rule_Conditions Cond,
1498                    okc_xprt_rule_hdrs_all   Rules,
1499                    Okc_Xprt_Template_Rules  Assoc,
1500                    Okc_Xprt_Question_Orders Ord
1501              WHERE Rules.Rule_Id = Cond.Rule_Id
1502                AND Rules.Rule_Id = Assoc.Rule_Id
1503                AND Assoc.Template_Id = p_Template_Id
1504                AND (
1505                     (to_char(Ord.Question_Id) = Cond.Object_Code
1506                        AND Cond.Object_Type = 'QUESTION') OR
1507                     (to_char(Ord.Question_Id) = Cond.Object_Value_Code
1508                        AND Cond.Object_Value_Type = 'QUESTION')
1509                    )
1510                AND Rules.Status_Code = 'ACTIVE'
1511             UNION
1512             SELECT Ord.Question_Id
1513               FROM Okc_Xprt_Rule_Conditions Cond,
1514                    okc_xprt_rule_hdrs_all   Rules,
1515                    Okc_Xprt_Question_Orders Ord
1516              WHERE Rules.Rule_Id = Cond.Rule_Id
1517                AND Rules.Org_Wide_Flag = 'Y'
1518                AND Rules.Org_Id = l_Org_Id
1519                AND Rules.Intent = l_Intent
1520                AND (
1521                     (to_char(Ord.Question_Id) = Cond.Object_Code
1522                        AND Cond.Object_Type = 'QUESTION') OR
1523                     (to_char(Ord.Question_Id) = Cond.Object_Value_Code
1524                        AND Cond.Object_Value_Type = 'QUESTION')
1525                    )
1526                AND Rules.Status_Code = 'ACTIVE');
1527 
1528     --Update stmt2: set mandatory_flag = 'Y' for those questions which appear in the conditions of
1529     --Org and non-Org wide rules and rule status is PENDINGPUB
1530     UPDATE Okc_Xprt_Question_Orders
1531        SET Mandatory_Flag    = 'Y',
1532            Last_Updated_By   = l_user_id,
1533            Last_Update_Date  = SYSDATE,
1534            Last_Update_Login = l_login_id
1535      WHERE Template_Id = p_Template_Id
1536        AND Question_Id IN
1537            (SELECT Ord.Question_Id
1538               FROM Okc_Xprt_Rule_Conditions Cond,
1539                    okc_xprt_rule_hdrs_all   Rules,
1540                    Okc_Xprt_Template_Rules  Assoc,
1541                    Okc_Xprt_Question_Orders Ord
1542              WHERE Rules.Rule_Id = Cond.Rule_Id
1543                AND Rules.Rule_Id = Assoc.Rule_Id
1544                AND Assoc.Template_Id = p_Template_Id
1545                AND (
1546                     (to_char(Ord.Question_Id) = Cond.Object_Code
1547                        AND Cond.Object_Type = 'QUESTION') OR
1548                     (to_char(Ord.Question_Id) = Cond.Object_Value_Code
1549                        AND Cond.Object_Value_Type = 'QUESTION')
1550                    )
1551                AND Rules.Status_Code = 'PENDINGPUB'
1552                AND Rules.Request_Id = l_conc_request_id
1553             UNION
1554             SELECT Ord.Question_Id
1555               FROM Okc_Xprt_Rule_Conditions Cond,
1556                    okc_xprt_rule_hdrs_all   Rules,
1557                    Okc_Xprt_Question_Orders Ord
1558              WHERE Rules.Rule_Id = Cond.Rule_Id
1559                AND Rules.Org_Wide_Flag = 'Y'
1560                AND Rules.Org_Id = l_Org_Id
1561                AND Rules.Intent = l_Intent
1562                AND (
1563                     (to_char(Ord.Question_Id) = Cond.Object_Code
1564                        AND Cond.Object_Type = 'QUESTION') OR
1565                     (to_char(Ord.Question_Id) = Cond.Object_Value_Code
1566                        AND Cond.Object_Value_Type = 'QUESTION')
1567                    )
1568                AND Rules.Status_Code = 'PENDINGPUB'
1569                AND Rules.Request_Id = l_conc_request_id );
1570     --Update stmt3: set mandatory_flag = 'N' for those questions which appear in the Outcome Section of
1571     --Org and non-Org wide rules and rule status is ACTIVE
1572     UPDATE Okc_Xprt_Question_Orders
1573        SET Mandatory_Flag    = 'N',
1574            Last_Updated_By   = l_user_id,
1575            Last_Update_Date  = SYSDATE,
1576            Last_Update_Login = l_login_id
1577      WHERE Template_Id = p_Template_Id
1578        AND Question_Id IN
1579            (SELECT Ord.Question_Id
1580               FROM Okc_Xprt_Rule_Outcomes   Outs,
1581                    okc_xprt_rule_hdrs_all   Rules,
1582                    Okc_Xprt_Template_Rules  Assoc,
1583                    Okc_Xprt_Question_Orders Ord
1584              WHERE Rules.Rule_Id = Assoc.Rule_Id
1585                AND Assoc.Template_Id = p_Template_Id
1586                AND to_char(Ord.Question_Id) = Outs.Object_Value_Id
1587                AND Outs.Object_Type = 'QUESTION'
1588                AND Rules.Status_Code = 'ACTIVE'
1589                AND rules.rule_id = outs.rule_id
1590             UNION
1591             SELECT Ord.Question_Id
1592               FROM Okc_Xprt_Rule_Outcomes   Outs,
1593                    okc_xprt_rule_hdrs_all   Rules,
1594                    Okc_Xprt_Question_Orders Ord
1595              WHERE Rules.Rule_Id = Outs.Rule_Id
1596                AND Rules.Org_Wide_Flag = 'Y'
1597                AND Rules.Org_Id = l_Org_Id
1598                AND Rules.Intent = l_Intent
1599                AND to_char(Ord.Question_Id) = Outs.Object_Value_Id
1600                AND Outs.Object_Type = 'QUESTION'
1601                AND Rules.Status_Code = 'ACTIVE'
1602                AND rules.rule_id = outs.rule_id );
1603     --Update stmt4: set mandatory_flag = 'N' for those questions which appear in the Outcome Section of
1604     --Org and non-Org wide rules and rule status is PENDINGPUB
1605     UPDATE Okc_Xprt_Question_Orders
1606        SET Mandatory_Flag    = 'N',
1607            Last_Updated_By   = l_user_id,
1608            Last_Update_Date  = SYSDATE,
1609            Last_Update_Login = l_login_id
1610      WHERE Template_Id = p_Template_Id
1611        AND Question_Id IN
1612            (SELECT Ord.Question_Id
1613               FROM Okc_Xprt_Rule_Outcomes   Outs,
1614                    okc_xprt_rule_hdrs_all   Rules,
1615                    Okc_Xprt_Template_Rules  Assoc,
1616                    Okc_Xprt_Question_Orders Ord
1617              WHERE Rules.Rule_Id = Assoc.Rule_Id
1618                AND Assoc.Template_Id = p_Template_Id
1619                AND to_char(Ord.Question_Id) = Outs.Object_Value_Id
1620                AND Outs.Object_Type = 'QUESTION'
1621                AND Rules.Status_Code = 'PENDINGPUB'
1622                AND Rules.Request_Id = l_conc_request_id
1623                AND rules.rule_id = outs.rule_id
1624             UNION
1625             SELECT Ord.Question_Id
1626               FROM Okc_Xprt_Rule_Outcomes   Outs,
1627                    okc_xprt_rule_hdrs_all   Rules,
1628                    Okc_Xprt_Question_Orders Ord
1629              WHERE Rules.Rule_Id = Outs.Rule_Id
1630                AND Rules.Org_Wide_Flag = 'Y'
1631                AND Rules.Org_Id = l_Org_Id
1632                AND Rules.Intent = l_Intent
1633                AND to_char(Ord.Question_Id) = Outs.Object_Value_Id
1634                AND Outs.Object_Type = 'QUESTION'
1635                AND Rules.Status_Code = 'PENDINGPUB'
1636                AND Rules.Request_Id = l_conc_request_id);
1637 
1638   END IF;
1639 
1640   /*
1641   6.
1642   select a cursor for new records and
1643   set sequence_no with sequence_no+1 for each new record,
1644   where the intial sequence_no is max of existing sequence_no for the template .
1645   */
1646   IF (Fnd_Log.Level_Procedure >= Fnd_Log.g_Current_Runtime_Level) THEN
1647     Fnd_Log.STRING(Fnd_Log.Level_Procedure,
1648                    g_Module || l_Api_Name,
1649                    '220: End setting the mandatory flag.');
1650     Fnd_Log.STRING(Fnd_Log.Level_Procedure,
1651                    g_Module || l_Api_Name,
1652                    '230: Start populating sequence for newly inserted questions.');
1653 
1654   END IF;
1655 
1656   DECLARE
1657     l_Max_Seq     NUMBER :=0;
1658     l_Question_Id NUMBER;
1659     CURSOR Questions_For_Seq IS
1660       SELECT Question_Id
1661         FROM Okc_Xprt_Question_Orders
1662        WHERE Template_Id = p_Template_Id
1663          AND Sequence_Num IS NULL
1664        ORDER BY Mandatory_Flag DESC;
1665 
1666   BEGIN
1667     BEGIN
1668       SELECT MAX(Sequence_Num)
1669         INTO l_Max_Seq
1670         FROM Okc_Xprt_Question_Orders
1671        WHERE Template_Id = p_Template_Id;
1672     EXCEPTION
1673       WHEN OTHERS THEN
1674         l_Max_Seq := 0;
1675     END;
1676     l_Max_Seq := NVL(l_Max_Seq, 0);
1677     FOR Question_Rec IN Questions_For_Seq LOOP
1678       l_Max_Seq := l_Max_Seq + 1;
1679 
1680       l_Question_Id := Question_Rec.Question_Id;
1681 
1682 
1683       UPDATE Okc_Xprt_Question_Orders
1684          SET Sequence_Num = l_Max_Seq
1685        WHERE Template_Id = p_Template_Id
1686          AND Question_Id = l_Question_Id;
1687 
1688     END LOOP;
1689   END;
1690   IF (Fnd_Log.Level_Procedure >= Fnd_Log.g_Current_Runtime_Level) THEN
1691     Fnd_Log.STRING(Fnd_Log.Level_Procedure,
1692                    g_Module || l_Api_Name,
1693                    '240: End populating sequence for newly inserted questions.');
1694 
1695   END IF;
1696 
1697   IF p_Commit_Flag = 'Y' THEN
1698 
1699 
1700     IF (Fnd_Log.Level_Procedure >= Fnd_Log.g_Current_Runtime_Level) THEN
1701       Fnd_Log.STRING(Fnd_Log.Level_Procedure,
1702                      g_Module || l_Api_Name,
1703                      '250: Commiting the transaction');
1704 
1705     END IF;
1706     COMMIT;
1707   END IF;
1708 
1709   IF (Fnd_Log.Level_Procedure >= Fnd_Log.g_Current_Runtime_Level) THEN
1710     Fnd_Log.STRING(Fnd_Log.Level_Procedure,
1711                    g_Module || l_Api_Name,
1712                    '1000: Leaving ' || g_Pkg_Name || '.' || l_Api_Name);
1713   END IF;
1714 
1715 
1716 EXCEPTION
1717 
1718   WHEN OTHERS THEN
1719     IF (Fnd_Log.LEVEL_PROCEDURE >= Fnd_Log.g_Current_Runtime_Level) THEN
1720       Fnd_Log.STRING(Fnd_Log.Level_Procedure,
1721                      g_Module || l_Api_Name,
1722                      '4000: Leaving ' || g_Pkg_Name || '.' || l_Api_Name);
1723     END IF;
1724 
1725     IF Fnd_Msg_Pub.Check_Msg_Level(Fnd_Msg_Pub.g_Msg_Lvl_Unexp_Error) THEN
1726       Fnd_Msg_Pub.Add_Exc_Msg(g_Pkg_Name, l_Api_Name);
1727     END IF;
1728     x_Return_Status := g_Ret_Sts_Unexp_Error;
1729     Fnd_Msg_Pub.Count_And_Get(p_Encoded => 'F',
1730                               p_Count   => x_Msg_Count,
1731                               p_Data    => x_Msg_Data);
1732 
1733 END Populate_Questions_Order;
1734 
1735 
1736 /*
1737    Function : ok_to_delete_question
1738    This function will return 'Y' for a question id if it is not used in
1739 rule condition or outcome.
1740    If used, it returns 'N'.
1741 */
1742 
1743 FUNCTION Ok_To_Delete_Question(
1744     p_question_id         IN NUMBER)
1745 RETURN VARCHAR2 IS
1746     CURSOR used_in_rule_cond_crs IS
1747      SELECT 'N'
1748       FROM OKC_XPRT_RULE_CONDITIONS
1749      WHERE (object_type IN ('QUESTION','CONSTANT') AND
1750             object_code = to_char(p_question_id) ) -- Added for bug 5663927
1751             OR
1752            (object_value_type IN ('QUESTION','CONSTANT') AND
1753             object_value_code = to_char(p_question_id)) -- Added for bug 5663927
1754      UNION
1755      SELECT 'N'
1756       FROM OKC_XPRT_RULE_OUTCOMES
1757       WHERE object_type = 'QUESTION'
1758       AND object_value_id = p_question_id;
1759 
1760      l_ret VARCHAR2(1) := 'Y';
1761 BEGIN
1762     OPEN used_in_rule_cond_crs;
1763     FETCH used_in_rule_cond_crs INTO l_ret;
1764     CLOSE used_in_rule_cond_crs;
1765     RETURN l_ret;
1766 EXCEPTION
1767     WHEN NO_DATA_FOUND THEN
1768      RETURN 'N';
1769     WHEN OTHERS THEN
1770      IF used_in_rule_cond_crs%ISOPEN THEN
1771        CLOSE used_in_rule_cond_crs;
1772      END IF;
1773      RETURN 'N';
1774 END Ok_To_Delete_Question;
1775 
1776 
1777 /*
1778    Procedure : create_production_publication
1779    This procedure will be called from Publish/Disable rules and Question Sync Concurrent programs
1780    This procedure does the following in 'PUBLISH' OR 'DISABLE' OR 'SYNC' modes:
1781    For All templates in the current concurrent request id
1782      Delete Production mode Publication
1783 	DELETE the UI attached to the production publication
1784      Update Test mode Publication to Production mode
1785    Update Rule status in the current concurrent request id
1786    Update the runtime_available_flag in okc_xprt_question_orders table
1787    Delete records from okc_xprt_template_rules where deleted_flag = 'Y'
1788    commit the work
1789 
1790    This procedure can also be called in Template approval flow with mode 'TEMPLATE_APPROVAL'
1791    This procedure does the following in 'TEMPLATE_APPROVAL' mode:
1792    For the called template
1793      Delete Production mode Publication
1794      Update Test mode Publication to Production mode
1795    Update the runtime_available_flag in okc_xprt_question_orders table
1796 */
1797 PROCEDURE create_production_publication
1798 (
1799  p_calling_mode   IN  VARCHAR2,
1800  p_template_id    IN  NUMBER,
1801  x_return_status  OUT NOCOPY VARCHAR2,
1802  x_msg_data	      OUT NOCOPY VARCHAR2,
1803  x_msg_count	  OUT NOCOPY NUMBER
1804 ) IS
1805 
1806 /*Bug 5032199 commented below cursor.Using REF cursor
1807 CURSOR csr_templates IS
1808 SELECT DECODE(parent_template_id, NULL, template_id, parent_template_id) template_id,
1809        template_model_id
1810   FROM okc_terms_templates_all
1811  WHERE template_id = DECODE(p_template_id,NULL,template_id,p_template_id)
1812    AND xprt_request_id = DECODE(p_calling_mode,'TEMPLATE_APPROVAL',xprt_request_id, FND_GLOBAL.CONC_REQUEST_ID);
1813 */
1814 
1815 CURSOR csr_rules IS
1816 SELECT rule_id
1817   FROM okc_xprt_rule_hdrs_all
1818  WHERE request_id = FND_GLOBAL.CONC_REQUEST_ID ;
1819 
1820 CURSOR csr_get_publication_id (p_template_model_id NUMBER, p_publication_mode VARCHAR2) IS
1821 SELECT publication_id ,
1822        ui_def_id
1823   FROM cz_model_publications
1824  WHERE model_id = p_template_model_id
1825    AND deleted_flag = '0'
1826    AND publication_mode = p_publication_mode
1827    AND source_target_flag = 'S';
1828 
1829 l_api_version             CONSTANT NUMBER := 1;
1830 l_api_name                CONSTANT VARCHAR2(30) := 'create_production_publication';
1831 l_template_model_id       okc_terms_templates_all.template_model_id%TYPE;
1832 l_run_id                  NUMBER;
1833 l_publication_id          cz_model_publications.publication_id%TYPE;
1834 l_ui_def_id               cz_model_publications.ui_def_id%TYPE;
1835 l_rule_id                 okc_xprt_rule_hdrs_all.rule_id%TYPE;
1836 l_line_level_flag         okc_xprt_rule_hdrs_all.line_level_flag%TYPE;
1837 
1838 --Bug 5032199 Using REF cursor
1839 TYPE cur_type IS REF CURSOR;
1840 csr_templates cur_type;
1841 l_sql_stmt long;
1842 
1843 
1844 BEGIN
1845 
1846   -- start debug log
1847   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1848      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
1849                     G_MODULE||l_api_name,
1850                     '100: Entered '||G_PKG_NAME ||'.'||l_api_name);
1851   END IF;
1852 
1853   x_return_status :=  G_RET_STS_SUCCESS;
1854 
1855   IF (p_calling_mode = 'PUBLISH' OR p_calling_mode = 'DISABLE' OR p_calling_mode = 'SYNC') THEN
1856      -- Standard Start of API savepoint
1857      SAVEPOINT g_create_prod_publication;
1858   END IF;
1859 
1860   --START: Perf Bug 5032199 Using REF cursor
1861   IF(p_template_id IS NOT NULL) THEN
1862     l_sql_stmt := 'SELECT   template_model_id
1863                    FROM okc_terms_templates_all
1864                    WHERE template_id = '||p_template_id||'
1865                    AND xprt_request_id = DECODE('''||p_calling_mode||''',
1866                    ''TEMPLATE_APPROVAL'',xprt_request_id,'||FND_GLOBAL.CONC_REQUEST_ID||')';
1867   ELSE
1868     l_sql_stmt := 'SELECT   template_model_id
1869                    FROM okc_terms_templates_all
1870                    WHERE xprt_request_id = DECODE('''||p_calling_mode||''',
1871                    ''TEMPLATE_APPROVAL'',xprt_request_id,'||FND_GLOBAL.CONC_REQUEST_ID||')';
1872   END IF;
1873   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1874 		       FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
1875 		               G_MODULE||l_api_name,
1876 		               'l_sql_stmt = '||l_sql_stmt );
1877   END IF;
1878   --END:Bug 5032199
1879 
1880   OPEN csr_templates FOR l_sql_stmt;
1881     LOOP
1882       FETCH csr_templates INTO l_template_model_id;
1883 	  EXIT WHEN csr_templates%NOTFOUND;
1884 	    -- Delete Production mode publication
1885 	    OPEN csr_get_publication_id(p_template_model_id => l_template_model_id,
1886 		                            p_publication_mode  => G_PRODUCTION_MODE);
1887 	      LOOP
1888 		   FETCH csr_get_publication_id INTO l_publication_id,l_ui_def_id;
1889 		   EXIT WHEN csr_get_publication_id%NOTFOUND;
1890      	   -- debug log
1891 		   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1892 		       FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
1893 		               G_MODULE||l_api_name,
1894 		               '   ********************************************************');
1895 		       FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
1896 		               G_MODULE||l_api_name,
1897 		               'Calling OKC_XPRT_CZ_INT_PVT.delete_publication with parameters');
1898 		       FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
1899 		               G_MODULE||l_api_name,
1900 		               'p_api_version : '||l_api_version);
1901 		       FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
1902 		               G_MODULE||l_api_name,
1903 		               'p_publication_id : '||l_publication_id);
1904 		   END IF;
1905 
1906 
1907 		    -- Call CZ delete publicaton API
1908 		     OKC_XPRT_CZ_INT_PVT.delete_publication
1909                (
1910                 p_api_version      =>  l_api_version,
1911 			 p_init_msg_lst        =>  FND_API.G_FALSE,
1912                 p_publication_id   =>  l_publication_id,
1913                 x_return_status    =>  x_return_status,
1914                 x_msg_data	       =>  x_msg_data,
1915                 x_msg_count	       =>  x_msg_count
1916                ) ;
1917 
1918 
1919 		   -- debug log
1920 		   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1921 		       FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
1922 		               G_MODULE||l_api_name,
1923 		               '   ********************************************************');
1924 		       FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
1925 		               G_MODULE||l_api_name,
1926 		               'After Calling OKC_XPRT_CZ_INT_PVT.delete_publication');
1927 		       FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
1928 		               G_MODULE||l_api_name,
1929 		               'x_return_status : '||x_return_status);
1930 		       FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
1931 		               G_MODULE||l_api_name,
1932 		               '   ********************************************************');
1933 		   END IF;
1934 
1935                --- If any errors happen abort API
1936                IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
1937                  RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1938                ELSIF (x_return_status = G_RET_STS_ERROR) THEN
1939                  RAISE FND_API.G_EXC_ERROR;
1940                END IF;
1941 
1942 
1943 		   -- Delete the UI attached to the above production publication
1944 		     OKC_XPRT_CZ_INT_PVT.delete_ui_def
1945                (
1946                 p_api_version      =>  l_api_version,
1947                 p_ui_def_id        =>  l_ui_def_id,
1948                 x_return_status    =>  x_return_status,
1949                 x_msg_data	     =>  x_msg_data,
1950                 x_msg_count	     =>  x_msg_count
1951                ) ;
1952 
1953 
1954                --- If any errors happen abort API
1955                IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
1956                  RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1957                ELSIF (x_return_status = G_RET_STS_ERROR) THEN
1958                  RAISE FND_API.G_EXC_ERROR;
1959                END IF;
1960 
1961 		 END LOOP; -- csr_get_publication_id
1962 	    CLOSE csr_get_publication_id;
1963 
1964 	    -- Edit Test mode publication
1965 	    OPEN csr_get_publication_id(p_template_model_id => l_template_model_id,
1966 		                            p_publication_mode  => G_TEST_MODE);
1967 	      LOOP
1968 		   FETCH csr_get_publication_id INTO l_publication_id,l_ui_def_id;
1969 		   EXIT WHEN csr_get_publication_id%NOTFOUND;
1970 
1971      	   -- debug log
1972 		   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1973 		       FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
1974 		               G_MODULE||l_api_name,
1975 		               '   ********************************************************');
1976 		       FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
1977 		               G_MODULE||l_api_name,
1978 		               'Calling OKC_XPRT_CZ_INT_PVT.delete_publication with parameters');
1979 		       FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
1980 		               G_MODULE||l_api_name,
1981 		               'p_api_version : '||l_api_version);
1982 		       FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
1983 		               G_MODULE||l_api_name,
1984 		               'p_publication_id : '||l_publication_id);
1985 		       FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
1986 		               G_MODULE||l_api_name,
1987 		               'p_publication_mode : '||G_TEST_MODE);
1988 		   END IF;
1989 
1990 		    -- Call CZ edit publicaton API
1991 		     OKC_XPRT_CZ_INT_PVT.edit_publication
1992                (
1993                 p_api_version      =>  l_api_version,
1994   		      p_init_msg_lst        =>  FND_API.G_FALSE,
1995                 p_publication_id   =>  l_publication_id,
1996                 p_publication_mode =>  G_PRODUCTION_MODE,
1997                 x_return_status    =>  x_return_status,
1998                 x_msg_data	       =>  x_msg_data,
1999                 x_msg_count	       =>  x_msg_count
2000                ) ;
2001 
2002 		   -- debug log
2003 		   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2004 		       FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2005 		               G_MODULE||l_api_name,
2006 		               '   ********************************************************');
2007 		       FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2008 		               G_MODULE||l_api_name,
2009 		               'After Calling OKC_XPRT_CZ_INT_PVT.delete_publication');
2010 		       FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2011 		               G_MODULE||l_api_name,
2012 		               'x_return_status : '||x_return_status);
2013 		       FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2014 		               G_MODULE||l_api_name,
2015 		               '   ********************************************************');
2016 		   END IF;
2017 
2018            --- If any errors happen abort API
2019            IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
2020              RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2021            ELSIF (x_return_status = G_RET_STS_ERROR) THEN
2022              RAISE FND_API.G_EXC_ERROR;
2023            END IF;
2024 
2025 		 END LOOP; -- csr_get_publication_id
2026 	    CLOSE csr_get_publication_id;
2027 
2028 	END LOOP; -- l_tmpl_csr
2029   CLOSE csr_templates;
2030 
2031      -- Put the parameters in log file
2032        fnd_file.put_line(FND_FILE.LOG,'  ');
2033        fnd_file.put_line(FND_FILE.LOG,'*********************************************** ');
2034        fnd_file.put_line(FND_FILE.LOG,'p_calling_mode:  '||p_calling_mode);
2035        fnd_file.put_line(FND_FILE.LOG,'p_template_id:  '||p_template_id);
2036        fnd_file.put_line(FND_FILE.LOG,'xprt_request_id:  '||FND_GLOBAL.CONC_REQUEST_ID);
2037        fnd_file.put_line(FND_FILE.LOG,'*********************************************** ');
2038        fnd_file.put_line(FND_FILE.LOG,'  ');
2039 
2040   IF (p_calling_mode = 'PUBLISH') THEN
2041       -- Update all the Question order records that have question_rule_status as PENDINGPUB
2042 	  UPDATE Okc_Xprt_Question_Orders
2043 	     SET runtime_available_flag = 'Y',
2044 		    question_rule_status  = 'ACTIVE',
2045 	         last_updated_by = FND_GLOBAL.USER_ID,
2046 	         last_update_date = SYSDATE,
2047 	         last_update_login = FND_GLOBAL.LOGIN_ID
2048 	   WHERE question_rule_status = 'PENDINGPUB'
2049 	     AND template_id IN ( SELECT template_id
2050 		                       FROM okc_terms_templates_all
2051 						  WHERE xprt_request_id = FND_GLOBAL.CONC_REQUEST_ID
2052 		                   );
2053    -- Delete from okc_xprt_template_rules
2054       DELETE FROM okc_xprt_template_rules
2055 	  WHERE NVL(deleted_flag,'N') = 'Y'
2056 	    AND template_id IN ( SELECT template_id
2057 		                       FROM okc_terms_templates_all
2058 						  WHERE xprt_request_id = FND_GLOBAL.CONC_REQUEST_ID
2059 		                   );
2060 
2061    -- Update published_flag in okc_xprt_template_rules
2062         UPDATE okc_xprt_template_rules
2063 	      SET published_flag = 'Y'
2064 	    WHERE template_id IN ( SELECT template_id
2065 		                       FROM okc_terms_templates_all
2066 						  WHERE xprt_request_id = FND_GLOBAL.CONC_REQUEST_ID
2067 		                   );
2068   END IF; -- p_calling_mode = 'PUBLISH'
2069 
2070   IF p_calling_mode = 'TEMPLATE_APPROVAL' THEN
2071       -- if template approval then go by template id
2072 	  UPDATE Okc_Xprt_Question_Orders
2073 	     SET runtime_available_flag = 'Y',
2074 	         last_updated_by = FND_GLOBAL.USER_ID,
2075 	         last_update_date = SYSDATE,
2076 	         last_update_login = FND_GLOBAL.LOGIN_ID
2077 	   WHERE template_id= p_template_id
2078 	     AND question_rule_status = 'ACTIVE';
2079 
2080    -- Delete from okc_xprt_template_rules
2081       DELETE FROM okc_xprt_template_rules
2082 	  WHERE NVL(deleted_flag,'N') = 'Y'
2083 	    AND template_id =  p_template_id;
2084 
2085    -- Update published_flag in okc_xprt_template_rules
2086         UPDATE okc_xprt_template_rules
2087 	      SET published_flag = 'Y'
2088 	   WHERE template_id= p_template_id ;
2089 
2090   END IF;
2091 
2092   -- Update Rule status
2093     OPEN csr_rules;
2094       LOOP
2095         FETCH csr_rules INTO l_rule_id;
2096   	  EXIT WHEN csr_rules%NOTFOUND;
2097 
2098   	  SELECT okc_xprt_util_pvt.is_rule_line_level(l_rule_id) INTO l_line_level_flag FROM DUAL;
2099 
2100 	  UPDATE okc_xprt_rule_hdrs_all
2101 	     SET status_code = DECODE (p_calling_mode, 'PUBLISH', 'ACTIVE', 'DISABLE', 'INACTIVE', 'SYNC', 'ACTIVE'),
2102 		    published_flag = 'Y',
2103 		 line_level_flag = l_line_level_flag, --is_rule_line_level(l_rule_id),
2104 		 last_updated_by = FND_GLOBAL.USER_ID,
2105 		 last_update_date = SYSDATE,
2106 		 last_update_login = FND_GLOBAL.LOGIN_ID
2107 	   WHERE rule_id = l_rule_id;
2108 
2109       END LOOP;
2110     CLOSE csr_rules;
2111 
2112 
2113 
2114   --- If any errors happen abort API
2115   IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
2116     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2117   ELSIF (x_return_status = G_RET_STS_ERROR) THEN
2118     RAISE FND_API.G_EXC_ERROR;
2119   END IF;
2120 
2121   IF (p_calling_mode = 'PUBLISH' OR p_calling_mode = 'DISABLE' OR p_calling_mode = 'SYNC') THEN
2122     COMMIT WORK;
2123   END IF;
2124 
2125   -- end debug log
2126   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2127      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2128                     G_MODULE||l_api_name,
2129                     '1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
2130   END IF;
2131 
2132 
2133 EXCEPTION
2134   WHEN FND_API.G_EXC_ERROR THEN
2135       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2136          FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2137                         G_MODULE||l_api_name,
2138                         '2000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
2139       END IF;
2140 
2141       IF (p_calling_mode = 'PUBLISH' OR p_calling_mode = 'DISABLE' OR p_calling_mode = 'SYNC') THEN
2142 	    ROLLBACK TO g_create_prod_publication;
2143       END IF;
2144 
2145       x_return_status := G_RET_STS_ERROR ;
2146       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
2147 
2148   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2149       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2150          FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2151                         G_MODULE||l_api_name,
2152                         '3000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
2153       END IF;
2154 
2155       IF (p_calling_mode = 'PUBLISH' OR p_calling_mode = 'DISABLE' OR p_calling_mode = 'SYNC') THEN
2156 	    ROLLBACK TO g_create_prod_publication;
2157       END IF;
2158 
2159       x_return_status := G_RET_STS_UNEXP_ERROR ;
2160       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
2161 
2162   WHEN OTHERS THEN
2163       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2164          FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2165                         G_MODULE||l_api_name,
2166                         '4000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
2167       END IF;
2168 
2169       IF (p_calling_mode = 'PUBLISH' OR p_calling_mode = 'DISABLE' OR p_calling_mode = 'SYNC') THEN
2170 	    ROLLBACK TO g_create_prod_publication;
2171       END IF;
2172 
2173    IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
2174      FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
2175    END IF;
2176    x_return_status := G_RET_STS_UNEXP_ERROR ;
2177    FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
2178 
2179 END create_production_publication;
2180 
2181 ------------------------------------------------------------------------------
2182 /*========================================================================+
2183 Procedure:  validate_template_for_expert
2184 Description:  This API is called from OKC_DOC_QA_PVT for doc type = TEMPLATE
2185 
2186 
2187 +========================================================================*/
2188 
2189 PROCEDURE validate_template_for_expert(
2190 p_api_version                  IN NUMBER,
2191 p_init_msg_list                IN VARCHAR2,
2192 p_template_id                  IN NUMBER,
2193 x_qa_result_tbl                IN OUT NOCOPY OKC_TERMS_QA_GRP.qa_result_tbl_type,
2194 x_return_status                OUT NOCOPY VARCHAR2,
2195 x_msg_count                    OUT NOCOPY NUMBER,
2196 x_msg_data                     OUT NOCOPY VARCHAR2)
2197 
2198 IS
2199 
2200 
2201 l_api_name CONSTANT VARCHAR2(30) := 'validate_template_for_expert';
2202 l_api_version CONSTANT NUMBER := 1;
2203 
2204 l_ce_enabled                VARCHAR2(50);
2205 l_template_ce_enabled       okc_terms_templates_all.contract_expert_enabled%TYPE;
2206 
2207 l_qa_tbl_index NUMBER;
2208 
2209 l_template_rule_status_sev        OKC_QA_ERRORS_T.ERROR_SEVERITY%TYPE;
2210 l_template_rule_status_desc       OKC_QA_ERRORS_T.PROBLEM_SHORT_DESC%TYPE;
2211 l_perf_template_rule_status       VARCHAR2(1);
2212 
2213 l_def_template_sev        OKC_QA_ERRORS_T.ERROR_SEVERITY%TYPE;
2214 l_def_template_desc       OKC_QA_ERRORS_T.PROBLEM_SHORT_DESC%TYPE;
2215 l_def_template_status     VARCHAR2(1);
2216 
2217 l_tmpl_non_active_rule_exists     VARCHAR2(1);
2218 
2219 l_template_no_rule_sev            OKC_QA_ERRORS_T.ERROR_SEVERITY%TYPE;
2220 l_template_no_rule_desc           OKC_QA_ERRORS_T.PROBLEM_SHORT_DESC%TYPE;
2221 l_perf_template_no_rule           VARCHAR2(1);
2222 
2223 l_tmpl_active_rule_exists         VARCHAR2(1);
2224 l_template_name                   okc_terms_templates_all.template_name%TYPE;
2225 l_XPRT_SCN_CODE                   okc_terms_templates_all.XPRT_SCN_CODE%TYPE;
2226 l_section_name                    FND_LOOKUPS.MEANING%TYPE;
2227 
2228 CURSOR csr_template_dtls IS
2229 SELECT contract_expert_enabled , template_name , XPRT_SCN_CODE
2230 FROM okc_terms_templates_all
2231 WHERE template_id = p_template_id;
2232 
2233 
2234 CURSOR csr_tmpl_non_active_rules IS
2235 -- global rules not active
2236 SELECT 'X'
2237   FROM okc_xprt_rule_hdrs_all r,
2238        okc_terms_templates_all t
2239   WHERE t.org_id = r.org_id
2240     AND t.intent  = r.intent
2241     AND t.template_id = p_template_id
2242     AND r.org_wide_flag = 'Y'
2243     AND r.status_code NOT IN ('ACTIVE','INACTIVE')
2244 UNION ALL
2245  -- Local rules not active
2246 SELECT 'X'
2247   FROM okc_xprt_template_rules tr,
2248        okc_xprt_rule_hdrs_all r
2249   WHERE tr.template_id = p_template_id
2250     AND tr.rule_id  = r.rule_id
2251     AND r.status_code NOT IN ('ACTIVE','INACTIVE');
2252 
2253 CURSOR csr_tmpl_active_rules IS
2254 -- global Active rules
2255 SELECT 'X'
2256   FROM okc_xprt_rule_hdrs_all r,
2257        okc_terms_templates_all t
2258   WHERE t.org_id = r.org_id
2259     AND t.intent  = r.intent
2260     AND t.template_id = p_template_id
2261     AND r.org_wide_flag = 'Y'
2262     AND r.status_code = 'ACTIVE'
2263 UNION ALL
2264  -- Local Active rules
2265 SELECT 'X'
2266   FROM okc_xprt_template_rules tr,
2267        okc_xprt_rule_hdrs_all r
2268   WHERE tr.template_id = p_template_id
2269     AND tr.rule_id  = r.rule_id
2270     AND r.status_code = 'ACTIVE' ;
2271 
2272 -- bug 4120816
2273 CURSOR cst_tmpl_def_section (p_scn_code VARCHAR2) IS
2274   SELECT meaning
2275   FROM fnd_lookups
2276   WHERE lookup_type  = 'OKC_ARTICLE_SECTION'
2277   AND lookup_code = p_scn_code
2278   AND sysdate not between start_date_active and nvl(end_date_active,sysdate) ;
2279 
2280 BEGIN
2281 
2282 
2283   -- start debug log
2284   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2285      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2286                     G_MODULE||l_api_name,
2287                     '100: Entered '||G_PKG_NAME ||'.'||l_api_name);
2288      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2289 		          G_MODULE||l_api_name,
2290 		          'p_template_id : '||p_template_id);
2291   END IF;
2292 
2293 
2294       --
2295       -- Standard call to check for call compatibility.
2296       --
2297       IF NOT FND_API.Compatible_API_Call (l_api_version,
2298          	       	    	    	 	p_api_version,
2299           	    	    	    	l_api_name,
2300       		    	    	    	G_PKG_NAME)
2301       THEN
2302       	RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2303       END IF;
2304 
2305       --
2306       -- Initialize message list if p_init_msg_list is set to TRUE.
2307       --
2308       IF FND_API.to_Boolean( p_init_msg_list )
2309       THEN
2310       	FND_MSG_PUB.initialize;
2311       END IF;
2312 
2313       --
2314       --  Initialize API return status to success
2315       --
2316       x_return_status := FND_API.G_RET_STS_SUCCESS;
2317 
2318       --
2319       -- Check if CE Profile is Enabled.
2320       --
2321 	 FND_PROFILE.GET(name=> 'OKC_K_EXPERT_ENABLED', val => l_ce_enabled);
2322 
2323 	 IF NVL(l_ce_enabled,'N') = 'N' THEN
2324 	   -- Not Expert enabled, skip QA
2325         RETURN;
2326       END IF;
2327 
2328 	 -- Check if template is Expert enabled , else skip QA
2329 	 OPEN csr_template_dtls;
2330 	   FETCH csr_template_dtls INTO l_template_ce_enabled, l_template_name, l_XPRT_SCN_CODE;
2331 	 CLOSE csr_template_dtls;
2332 
2333       IF NVL(l_template_ce_enabled,'N') = 'N' THEN
2334 	   RETURN;
2335 	 END IF;
2336 
2337       --
2338       -- Get Not Applied QA Code Severity and Name
2339       --
2340       OKC_TERMS_QA_PVT.get_qa_code_detail(p_qa_code =>  G_CHECK_TEMPLATE_RULE_STATUS ,
2341                          x_perform_qa    => l_perf_template_rule_status,
2342                          x_qa_name       => l_template_rule_status_desc,
2343                          x_severity_flag => l_template_rule_status_sev,
2344                          x_return_status => x_return_status);
2345 
2346       IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR)
2347       THEN
2348         RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
2349       ELSIF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
2350         RAISE FND_API.G_EXC_ERROR ;
2351       END IF;
2352 
2353 
2354       --
2355       -- Get Default template section severity and name
2356       --
2357       OKC_TERMS_QA_PVT.get_qa_code_detail(p_qa_code =>  G_CHECK_INVALID_XPRT_SECTION ,
2358                          x_perform_qa    => l_def_template_status,
2359                          x_qa_name       => l_def_template_desc,
2360                          x_severity_flag => l_def_template_sev,
2361                          x_return_status => x_return_status);
2362 
2363       IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR)
2364       THEN
2365         RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
2366       ELSIF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
2367         RAISE FND_API.G_EXC_ERROR ;
2368       END IF;
2369 
2370 	 --
2371       -- Check for the template default section
2372 	 --
2373 	   OPEN cst_tmpl_def_section ( l_XPRT_SCN_CODE );
2374 	   FETCH cst_tmpl_def_section INTO l_section_name;
2375 	   IF cst_tmpl_def_section%FOUND THEN
2376            l_qa_tbl_index := x_qa_result_tbl.COUNT + 1;
2377 
2378            x_qa_result_tbl(l_qa_tbl_index).error_record_type   := G_EXPERT_QA_TYPE;
2379            x_qa_result_tbl(l_qa_tbl_index).article_id          := NULL;
2380            x_qa_result_tbl(l_qa_tbl_index).deliverable_id      := NULL;
2381            x_qa_result_tbl(l_qa_tbl_index).title               := l_template_name;
2382            x_qa_result_tbl(l_qa_tbl_index).section_name        := l_section_name;
2383            x_qa_result_tbl(l_qa_tbl_index).qa_code             := G_CHECK_INVALID_XPRT_SECTION;
2384            x_qa_result_tbl(l_qa_tbl_index).message_name        := G_OKC_INVALID_XPRT_SECTION;
2385            x_qa_result_tbl(l_qa_tbl_index).suggestion          := OKC_TERMS_UTIL_PVT.Get_Message('OKC',G_OKC_INVALID_XPRT_SECTION_S);
2386            x_qa_result_tbl(l_qa_tbl_index).error_severity      := l_def_template_sev;
2387            x_qa_result_tbl(l_qa_tbl_index).problem_short_desc  := l_def_template_desc;
2388            x_qa_result_tbl(l_qa_tbl_index).problem_details       :=
2389            OKC_TERMS_UTIL_PVT.Get_Message('OKC', G_OKC_INVALID_XPRT_SECTION);
2390 	   END IF; -- rules not active found
2391 	   CLOSE cst_tmpl_def_section;
2392 
2393       --
2394       -- Get Template with no rules QA Code Severity and Name
2395       --
2396 
2397       OKC_TERMS_QA_PVT.get_qa_code_detail(p_qa_code =>  G_CHECK_TEMPLATE_NO_RULES ,
2398                          x_perform_qa    => l_perf_template_no_rule,
2399                          x_qa_name       => l_template_no_rule_desc,
2400                          x_severity_flag => l_template_no_rule_sev,
2401                          x_return_status => x_return_status);
2402 
2403       IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR)
2404       THEN
2405         RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
2406       ELSIF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
2407         RAISE FND_API.G_EXC_ERROR ;
2408       END IF;
2409 
2410 
2411       --
2412       -- These QA Checks should always be performed sequentially,
2413       -- regardless of the set-up.  Therefore, if one of
2414       -- the checks is enabled, then both checks will
2415       -- be performed but with a 'Warning' severity.
2416       --
2417 
2418 	 IF l_perf_template_rule_status = 'Y' THEN
2419 
2420 	   OPEN csr_tmpl_non_active_rules;
2421 	     FETCH csr_tmpl_non_active_rules INTO l_tmpl_non_active_rule_exists;
2422 		IF csr_tmpl_non_active_rules%FOUND THEN
2423         --
2424         -- Template with rules in non active status
2425         --
2426         l_qa_tbl_index := x_qa_result_tbl.COUNT + 1;
2427 
2428         x_qa_result_tbl(l_qa_tbl_index).error_record_type   := G_EXPERT_QA_TYPE;
2429         x_qa_result_tbl(l_qa_tbl_index).article_id          := NULL;
2430         x_qa_result_tbl(l_qa_tbl_index).deliverable_id      := NULL;
2431         x_qa_result_tbl(l_qa_tbl_index).title               := l_template_name;
2432         x_qa_result_tbl(l_qa_tbl_index).section_name        := NULL;
2433         x_qa_result_tbl(l_qa_tbl_index).qa_code             := G_CHECK_TEMPLATE_RULE_STATUS;
2434         x_qa_result_tbl(l_qa_tbl_index).message_name        := G_OKC_TEMPLATE_RULE_STATUS;
2435         x_qa_result_tbl(l_qa_tbl_index).suggestion          := OKC_TERMS_UTIL_PVT.Get_Message('OKC',G_OKC_TEMPLATE_RULE_STATUS_S);
2436         x_qa_result_tbl(l_qa_tbl_index).error_severity      := l_template_rule_status_sev;
2437         x_qa_result_tbl(l_qa_tbl_index).problem_short_desc  := l_template_rule_status_desc;
2438         x_qa_result_tbl(l_qa_tbl_index).problem_details       :=
2439                          OKC_TERMS_UTIL_PVT.Get_Message('OKC',
2440                                                         G_OKC_TEMPLATE_RULE_STATUS);
2441 
2442 
2443 		END IF; -- rules not active found
2444 	   CLOSE csr_tmpl_non_active_rules;
2445 
2446 	 END IF; -- l_perf_template_rule_status
2447 
2448 	 IF l_perf_template_no_rule = 'Y' THEN
2449 
2450 	   OPEN csr_tmpl_active_rules;
2451 	     FETCH csr_tmpl_active_rules INTO l_tmpl_active_rule_exists;
2452 		IF csr_tmpl_active_rules%NOTFOUND THEN
2453         --
2454         -- Template with no rules in active status
2455         --
2456         l_qa_tbl_index := x_qa_result_tbl.COUNT + 1;
2457 
2458         x_qa_result_tbl(l_qa_tbl_index).error_record_type   := G_EXPERT_QA_TYPE;
2459         x_qa_result_tbl(l_qa_tbl_index).article_id          := NULL;
2460         x_qa_result_tbl(l_qa_tbl_index).deliverable_id      := NULL;
2461         x_qa_result_tbl(l_qa_tbl_index).title               := l_template_name;
2462         x_qa_result_tbl(l_qa_tbl_index).section_name        := NULL;
2463         x_qa_result_tbl(l_qa_tbl_index).qa_code             := G_CHECK_TEMPLATE_NO_RULES;
2464         x_qa_result_tbl(l_qa_tbl_index).message_name        := G_OKC_TEMPLATE_NO_RULES;
2465         x_qa_result_tbl(l_qa_tbl_index).suggestion          := OKC_TERMS_UTIL_PVT.Get_Message('OKC',G_OKC_TEMPLATE_NO_RULES_S);
2466         x_qa_result_tbl(l_qa_tbl_index).error_severity      := l_template_no_rule_sev;
2467         x_qa_result_tbl(l_qa_tbl_index).problem_short_desc  := l_template_no_rule_desc;
2468         x_qa_result_tbl(l_qa_tbl_index).problem_details       :=
2469                          OKC_TERMS_UTIL_PVT.Get_Message('OKC',
2470                                                         G_OKC_TEMPLATE_NO_RULES);
2471 
2472 
2473 		END IF; -- rules not active found
2474 	   CLOSE csr_tmpl_active_rules;
2475 
2476 
2477 	 END IF; -- l_perf_template_no_rule
2478 
2479   -- end debug log
2480   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2481      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2482                     G_MODULE||l_api_name,
2483                     '1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
2484   END IF;
2485 
2486 EXCEPTION
2487 
2488         WHEN FND_API.G_EXC_ERROR THEN
2489 
2490     		x_return_status := FND_API.G_RET_STS_ERROR ;
2491     		FND_MSG_PUB.Count_And_Get(
2492     		        p_count => x_msg_count,
2493             		p_data => x_msg_data
2494     		);
2495 
2496         WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2497     		x_return_status := FND_API.G_RET_STS_ERROR ;
2498     		FND_MSG_PUB.Count_And_Get(
2499     		        p_count => x_msg_count,
2500             		p_data => x_msg_data
2501     		);
2502 
2503         WHEN OTHERS THEN
2504     		x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2505 
2506       		IF FND_MSG_PUB.Check_Msg_Level
2507     		   (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
2508     		THEN
2509         	    	FND_MSG_PUB.Add_Exc_Msg(
2510         	    	     G_PKG_NAME  	    ,
2511         	    	     l_api_name
2512     	    	      );
2513     		END IF;
2514 
2515     		FND_MSG_PUB.Count_And_Get(
2516     		     p_count => x_msg_count,
2517             	     p_data => x_msg_data
2518     		);
2519 
2520 END validate_template_for_expert;
2521 
2522 
2523 PROCEDURE build_cz_xml_init_msg(
2524     p_api_version                  IN NUMBER,
2525     p_init_msg_list                IN VARCHAR2,
2526     p_document_id                  IN NUMBER,
2527     p_document_type                IN VARCHAR2,
2528     p_config_header_id             IN NUMBER,
2529     p_config_rev_nbr               IN NUMBER,
2530     p_template_id                  IN NUMBER,
2531     x_cz_xml_init_msg              OUT NOCOPY LONG,
2532     x_return_status                OUT NOCOPY VARCHAR2,
2533     x_msg_count                    OUT NOCOPY NUMBER,
2534     x_msg_data                     OUT NOCOPY VARCHAR2)
2535 
2536 IS
2537 
2538     l_api_name CONSTANT VARCHAR2(30) := 'build_cz_xml_init_msg';
2539     l_api_version CONSTANT NUMBER := 1.0;
2540 
2541     l_msg_data VARCHAR2(2000);
2542     l_msg_count NUMBER;
2543 
2544     --
2545     -- XML Message String Variables
2546     --
2547     l_xml_init_msg VARCHAR2(2000);
2548     l_dummy VARCHAR2(2000);
2549 
2550     --
2551     -- CZ XML Init Message Parameters
2552     --
2553     l_database_id VARCHAR2(100);
2554     l_save_config_behavior VARCHAR2(30);     -- Always save to a new revision
2555     l_ui_type VARCHAR2(30);
2556     l_msg_behavior VARCHAR2(30);  -- Output Msg
2557 
2558     --
2559     -- OKC XML Init Message Parameters
2560     --
2561     l_config_header_id VARCHAR2(80);
2562     l_config_rev_nbr   VARCHAR2(80);
2563     l_product_key      VARCHAR2(80);
2564     l_session_id       VARCHAR2(80);
2565     l_config_creation_date VARCHAR2(15);
2566     l_config_effective_date VARCHAR2(15);
2567     l_config_model_lookup_date VARCHAR2(15);
2568     l_product_id varchar2(100);
2569     l_save_config_behavior varchar2(100);
2570 
2571 
2572     TYPE param_name_type IS TABLE OF VARCHAR2(30)
2573      INDEX BY BINARY_INTEGER;
2574 
2575     TYPE param_value_type IS TABLE OF VARCHAR2(200)
2576      INDEX BY BINARY_INTEGER;
2577 
2578     l_param_name_tbl param_name_type;
2579     l_param_value_tbl param_value_type;
2580     l_num_records NUMBER;
2581     l_rec_index NUMBER;
2582 
2583     l_org_id     okc_terms_templates_all.org_id%TYPE;
2584     l_intent     okc_terms_templates_all.intent%TYPE;
2585 
2586     CURSOR csr_config_effective_date IS
2587     SELECT TO_CHAR(SYSDATE, 'MM-DD-YYYY')
2588     FROM   dual;
2589 
2590     CURSOR csr_template_dtls IS
2591     SELECT org_id,
2592            intent
2593     FROM okc_terms_templates_all
2594     WHERE template_id = p_template_id;
2595 
2596   BEGIN
2597 
2598 
2599   -- start debug log
2600   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2601      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2602                     G_MODULE||l_api_name,
2603                     '100: Entered '||G_PKG_NAME ||'.'||l_api_name);
2604      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2605                     G_MODULE||l_api_name,
2606                     'Parameters : ');
2607      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2608                     G_MODULE||l_api_name,
2609                     'p_document_id : '||p_document_id);
2610      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2611                     G_MODULE||l_api_name,
2612                     'p_document_type : '||p_document_type);
2613      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2614                     G_MODULE||l_api_name,
2615                     'p_config_header_id : '||p_config_header_id);
2616      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2617                     G_MODULE||l_api_name,
2618                     'p_config_rev_nbr : '||p_config_rev_nbr);
2619      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2620                     G_MODULE||l_api_name,
2621                     'p_template_id : '||p_template_id);
2622   END IF;
2623 
2624       x_return_status :=  G_RET_STS_SUCCESS;
2625 
2626     --
2627     -- Standard call to check for call compatibility.
2628     --
2629     IF NOT FND_API.Compatible_API_Call (l_api_version,
2630        	       	    	    	 	p_api_version,
2631         	    	    	    	l_api_name,
2632     		    	    	    	G_PKG_NAME)
2633     THEN
2634     	RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2635     END IF;
2636 
2637     --
2638     -- Initialize message list if p_init_msg_list is set to TRUE.
2639     --
2640     IF FND_API.to_Boolean( p_init_msg_list ) THEN
2641     	FND_MSG_PUB.initialize;
2642     END IF;
2643 
2644     --
2645     --  Initialize API return status to success
2646     --
2647     x_return_status := FND_API.G_RET_STS_SUCCESS;
2648 
2649 
2650     -- Example:  <param name="config_header_id">1890</param>
2651 
2652     --
2653     -- Initialize Values
2654     --
2655     l_xml_init_msg := '<initialize>';
2656 
2657     l_msg_behavior := 'brief';
2658     l_database_id := FND_WEB_CONFIG.database_id;
2659     l_session_id := FND_PROFILE.value('DB_SESSION_ID');
2660 
2661     OPEN csr_config_effective_date;
2662       FETCH csr_config_effective_date INTO l_config_effective_date;
2663     CLOSE csr_config_effective_date;
2664 
2665     l_config_model_lookup_date := l_config_effective_date;
2666     --
2667     -- Set CZ Parameter Names and Values in Tables
2668     --
2669     OPEN csr_template_dtls;
2670       FETCH csr_template_dtls INTO l_org_id, l_intent;
2671     CLOSE csr_template_dtls;
2672 
2673     l_product_id := G_TEMPLATE_MODEL_OSR|| l_org_id||':'|| l_intent||':'|| p_template_id;
2674 
2675 
2676     l_param_name_tbl(1) := 'database_id';
2677     l_param_value_tbl(1) := l_database_id;
2678 
2679     l_param_name_tbl(2) := 'config_effective_date'; -- date that cz published model is effective
2680     l_param_value_tbl(2) := l_config_effective_date;
2681 
2682     l_param_name_tbl(3) := 'config_model_lookup_date';
2683     l_param_value_tbl(3) := l_config_model_lookup_date;
2684 
2685     l_param_name_tbl(4) := 'calling_application_id';
2686     l_param_value_tbl(4) := '510';
2687 
2688     l_param_name_tbl(5) := 'product_id';
2689     l_param_value_tbl(5) := l_product_id;
2690 
2691     l_param_name_tbl(6) := 'config_header_id';
2692     l_param_value_tbl(6) := p_config_header_id;
2693 
2694     l_param_name_tbl(7) := 'config_rev_nbr';
2695     l_param_value_tbl(7) := p_config_rev_nbr;
2696 
2697     l_param_name_tbl(8) := 'terminate_msg_behavior';
2698     l_param_value_tbl(8) := l_msg_behavior;
2699 
2700     l_param_name_tbl(9) := 'icx_session_ticket';
2701     l_param_value_tbl(9) := cz_cf_api.icx_session_ticket;
2702 
2703 
2704     l_param_name_tbl(10) := 'publication_mode';
2705     l_param_value_tbl(10) := 'P'; -- Contracts always uses the 'Production' publication
2706 
2707     l_param_name_tbl(13) := 'save_config_behavior';
2708     l_param_value_tbl(13) := 'new_revision';
2709 
2710     --
2711     -- Set OKC Parameter Names in Table
2712     --
2713     l_param_name_tbl(11) := 'okc_doc_header_id';
2714     l_param_value_tbl(11) := p_document_id;
2715 
2716     l_param_name_tbl(12) := 'okc_doc_type';
2717     l_param_value_tbl(12) := p_document_type;
2718 
2719 
2720     -- AM:  Hard coded.  Needs to be commented out after UT.
2721     l_param_name_tbl(14) := 'okc_test_expert';
2722     l_param_value_tbl(14) := 'false';
2723 
2724     l_num_records := l_param_name_tbl.count;
2725     --
2726     -- Loop to build XML Init Message
2727     --
2728     l_rec_index := 1;
2729 
2730     LOOP
2731     IF (l_param_value_tbl(l_rec_index) IS NOT NULL)
2732       THEN
2733 
2734          l_dummy := '<param name=' || '"' || l_param_name_tbl(l_rec_index) ||
2735                     '"' || '>' || l_param_value_tbl(l_rec_index) ||
2736                     '</param>';
2737          l_xml_init_msg := l_xml_init_msg || l_dummy;
2738 
2739 	    -- debug log
2740 	    IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2741 		       FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2742 		               G_MODULE||l_api_name,
2743 		               l_rec_index||' : '||l_dummy);
2744          END IF; -- debug log
2745 
2746       END IF;   -- l_param_value_tbl is not null
2747 
2748       l_dummy := NULL;
2749       l_rec_index := l_rec_index + 1;
2750 
2751       EXIT WHEN l_rec_index > l_num_records;
2752     END LOOP;
2753 
2754     l_xml_init_msg := l_xml_init_msg || '</initialize>';
2755     l_xml_init_msg := REPLACE(l_xml_init_msg, ' ', '+');
2756 
2757     x_cz_xml_init_msg := l_xml_init_msg;
2758 
2759   -- end debug log
2760   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2761      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2762                     G_MODULE||l_api_name,
2763                     '1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
2764   END IF;
2765 
2766 EXCEPTION
2767       WHEN FND_API.G_EXC_ERROR THEN
2768 
2769   		x_return_status := FND_API.G_RET_STS_ERROR ;
2770   		FND_MSG_PUB.Count_And_Get(
2771   		        p_count => x_msg_count,
2772           		p_data => x_msg_data
2773   		);
2774 
2775       WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2776   		x_return_status := FND_API.G_RET_STS_ERROR ;
2777 
2778   		FND_MSG_PUB.Count_And_Get(
2779   		        p_count => x_msg_count,
2780           		p_data => x_msg_data
2781   		);
2782 
2783       WHEN OTHERS THEN
2784   		x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2785 
2786     		IF FND_MSG_PUB.Check_Msg_Level
2787   		   (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
2788   		THEN
2789       	    	FND_MSG_PUB.Add_Exc_Msg(
2790       	    	     G_PKG_NAME  	    ,
2791       	    	     l_api_name
2792   	    	      );
2793   		END IF;
2794 
2795   		FND_MSG_PUB.Count_And_Get(
2796   		     p_count => x_msg_count,
2797           	     p_data => x_msg_data
2798   		);
2799 
2800 END build_cz_xml_init_msg;
2801 
2802 
2803 PROCEDURE parse_cz_xml_terminate_msg(
2804     p_api_version                  IN NUMBER,
2805     p_init_msg_list                IN VARCHAR2,
2806     p_cz_xml_terminate_msg         IN LONG,
2807     x_valid_config                 OUT NOCOPY VARCHAR2,
2808     x_complete_config              OUT NOCOPY VARCHAR2,
2809     x_config_header_id             OUT NOCOPY NUMBER,
2810     x_config_rev_nbr               OUT NOCOPY NUMBER,
2811     x_return_status                OUT NOCOPY VARCHAR2,
2812     x_msg_count                    OUT NOCOPY NUMBER,
2813     x_msg_data                     OUT NOCOPY VARCHAR2)
2814 
2815 IS
2816 
2817     l_api_name CONSTANT VARCHAR2(30) := 'parse_cz_xml_terminate_msg';
2818     l_api_version CONSTANT NUMBER := 1;
2819     l_msg_data VARCHAR2(2000);
2820     l_msg_count NUMBER;
2821 
2822     l_exit_start_tag                CONSTANT VARCHAR2(20) := '<exit>';
2823     l_exit_end_tag                  CONSTANT VARCHAR2(20) := '</exit>';
2824     l_exit_start_pos                NUMBER;
2825     l_exit_end_pos                  NUMBER;
2826 
2827     l_valid_config_start_tag        CONSTANT VARCHAR2(30) := '<valid_configuration>';
2828     l_valid_config_end_tag          CONSTANT VARCHAR2(30) := '</valid_configuration>';
2829     l_valid_config_start_pos        NUMBER;
2830     l_valid_config_end_pos          NUMBER;
2831 
2832     l_complete_config_start_tag     CONSTANT VARCHAR2(30) := '<complete_configuration>';
2833     l_complete_config_end_tag       CONSTANT VARCHAR2(30) := '</complete_configuration>';
2834     l_complete_config_start_pos     NUMBER;
2835     l_complete_config_end_pos       NUMBER;
2836 
2837     l_config_header_id_start_tag    CONSTANT VARCHAR2(20) := '<config_header_id>';
2838     l_config_header_id_end_tag      CONSTANT VARCHAR2(20) := '</config_header_id>';
2839     l_config_header_id_start_pos    NUMBER;
2840     l_config_header_id_end_pos      NUMBER;
2841 
2842     l_config_rev_nbr_start_tag      CONSTANT VARCHAR2(20) := '<config_rev_nbr>';
2843     l_config_rev_nbr_end_tag        CONSTANT VARCHAR2(20) := '</config_rev_nbr>';
2844     l_config_rev_nbr_start_pos      NUMBER;
2845     l_config_rev_nbr_end_pos        NUMBER;
2846 
2847     /*---------------------------------------------------------------------+
2848           Possibly for debugging only.
2849     +---------------------------------------------------------------------*/
2850 
2851     l_message_text_start_tag          VARCHAR2(20) := '<message_text>';
2852     l_message_text_end_tag            VARCHAR2(20) := '</message_text>';
2853     l_message_text_start_pos          NUMBER;
2854     l_message_text_end_pos            NUMBER;
2855 
2856     l_message_type_start_tag          VARCHAR2(20) := '<message_type>';
2857     l_message_type_end_tag            VARCHAR2(20) := '</message_type>';
2858     l_message_type_start_pos          NUMBER;
2859     l_message_type_end_pos            NUMBER;
2860 
2861     l_message_text                    VARCHAR2(4000);
2862     l_message_type                    VARCHAR2(200);
2863 
2864     l_exit                            VARCHAR(20); -- save, cancel, error, processed
2865     l_config_header_id                NUMBER;
2866     l_config_rev_nbr                  NUMBER;
2867     l_valid_config                    VARCHAR2(10);
2868     l_complete_config                 VARCHAR2(10);
2869 
2870     l_flag                            VARCHAR2(1);
2871     l_true                            VARCHAR2(10);
2872 
2873 BEGIN
2874 
2875 
2876   -- start debug log
2877   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2878      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2879                     G_MODULE||l_api_name,
2880                     '100: Entered '||G_PKG_NAME ||'.'||l_api_name);
2881   END IF;
2882 
2883   x_return_status :=  G_RET_STS_SUCCESS;
2884   l_flag := 'N';
2885   l_true := 'true';
2886 
2887 
2888      /*----------------------------------------------------------------+
2889      Parse Process:  <VALID_CONFIGURATION>true</VALID_CONFIGURATION>
2890            1st instr: posin of a(e.g. 22)
2891            2nd instr: gives posn of c(e.g.25)
2892            substr: string starting from posn a to (posn c - posn a + 1)
2893      +-----------------------------------------------------------------*/
2894       l_exit_start_pos :=
2895                     INSTR(p_cz_xml_terminate_msg, l_exit_start_tag,1, 1) +
2896                                 LENGTH(l_exit_start_tag);
2897 
2898       l_exit_end_pos   :=
2899                           INSTR(p_cz_xml_terminate_msg, l_exit_end_tag,1, 1) - 1;
2900 
2901       l_exit           := SUBSTR (p_cz_xml_terminate_msg, l_exit_start_pos,
2902                                   l_exit_end_pos - l_exit_start_pos + 1);
2903 
2904        -- debug log
2905        IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2906           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2907                     G_MODULE||l_api_name,
2908                     'l_exit_start_pos : '||l_exit_start_pos);
2909           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2910                     G_MODULE||l_api_name,
2911                     'l_exit_end_pos : '||l_exit_end_pos);
2912           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2913                     G_MODULE||l_api_name,
2914                     'l_exit : '||l_exit);
2915        END IF;
2916 
2917 
2918       IF (NVL(LOWER(l_exit),'error') <> 'error')
2919       THEN
2920 
2921         --
2922         -- Valid Config
2923         --
2924         l_valid_config_start_pos :=
2925                 INSTR(p_cz_xml_terminate_msg, l_valid_config_start_tag,1, 1) +
2926           LENGTH(l_valid_config_start_tag);
2927 
2928         l_valid_config_end_pos :=
2929                 INSTR(p_cz_xml_terminate_msg, l_valid_config_end_tag,1, 1) - 1;
2930 
2931         l_valid_config := SUBSTR( p_cz_xml_terminate_msg, l_valid_config_start_pos,
2932                                   l_valid_config_end_pos -
2933                                   l_valid_config_start_pos + 1);
2934 
2935         --
2936         -- Complete Config
2937         --
2938         l_complete_config_start_pos :=
2939                    INSTR(p_cz_xml_terminate_msg, l_complete_config_start_tag,1, 1) +
2940                    LENGTH(l_complete_config_start_tag);
2941         l_complete_config_end_pos :=
2942                    INSTR(p_cz_xml_terminate_msg, l_complete_config_end_tag,1, 1) - 1;
2943 
2944         l_complete_config := SUBSTR( p_cz_xml_terminate_msg, l_complete_config_start_pos,
2945                                      l_complete_config_end_pos -
2946                                      l_complete_config_start_pos + 1);
2947 
2948        -- debug log
2949        IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2950           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2951                     G_MODULE||l_api_name,
2952                     'l_valid_config_start_pos : '||l_valid_config_start_pos);
2953           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2954                     G_MODULE||l_api_name,
2955                     'l_valid_config_end_pos : '||l_valid_config_end_pos);
2956           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2957                     G_MODULE||l_api_name,
2958                     'l_valid_config : '||l_valid_config);
2959           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2960                     G_MODULE||l_api_name,
2961                     'l_complete_config_start_pos : '||l_complete_config_start_pos);
2962           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2963                     G_MODULE||l_api_name,
2964                     'l_complete_config_end_pos : '||l_complete_config_end_pos);
2965           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
2966                     G_MODULE||l_api_name,
2967                     'l_complete_config : '||l_complete_config);
2968        END IF;
2969 
2970         /*
2971         IF (UPPER(NVL(l_valid_config, 'false'))  <> UPPER(l_true)) THEN
2972             l_flag := 'Y';
2973         END IF ;
2974 
2975         IF (UPPER(NVL(l_complete_config, 'false')) <> UPPER(l_true) ) THEN
2976             l_flag := 'Y';
2977         END IF;
2978        */
2979 
2980       ELSE /* error in bv */
2981 	   -- <exit>error</exit>
2982 	   -- parse the error message
2983 	   -- following is the sample output from CZ in case of errors in batch validate
2984 	   /*
2985          <?xml version='1.0'?>
2986            <terminate>
2987              <exit>error</exit>
2988                 <config_messages>
2989                     <message>
2990                        <message_type>error</message_type>
2991                        <message_text>Session cannot be started:BatchValidate.
2992 				                 There is no published model.
2993                                      oracle.apps.cz.dio.pb.NoSuchModelPublicationException:
2994 							  The Publication could not be found.
2995                                      The publishing information provided is:
2996 							  product_id = OKC:TEMPLATEMODEL:::1004,
2997 							  config_model_lookup_date = 02-02-2005,
2998 							  publication_mode = P,
2999 							  calling_application_id = 510.
3000 				    </message_text>
3001                     </message>
3002                 </config_messages>
3003            </terminate>
3004 	   */
3005 
3006         --
3007         -- Parse Error Message text: <message_text> Error Message Text </message_text>
3008         --
3009         l_message_text_start_pos :=
3010                 INSTR(p_cz_xml_terminate_msg,l_message_text_start_tag ,1, 1) +
3011           LENGTH(l_message_text_start_tag);
3012 
3013         l_message_text_end_pos :=
3014                 INSTR(p_cz_xml_terminate_msg, l_message_text_end_tag,1, 1) - 1;
3015 
3016         l_message_text := SUBSTR( p_cz_xml_terminate_msg,l_message_text_start_pos ,
3017                                   l_message_text_end_pos -
3018                                   l_message_text_start_pos + 1);
3019 
3020         --
3021         -- Parse Error Message Type: <message_type>error</message_type>
3022         --
3023         l_message_type_start_pos :=
3024                 INSTR(p_cz_xml_terminate_msg,l_message_type_start_tag ,1, 1) +
3025           LENGTH(l_message_type_start_tag);
3026 
3027         l_message_type_end_pos :=
3028                 INSTR(p_cz_xml_terminate_msg, l_message_type_end_tag,1, 1) - 1;
3029 
3030         l_message_type := SUBSTR( p_cz_xml_terminate_msg,l_message_type_start_pos ,
3031                                   l_message_type_end_pos -
3032                                   l_message_type_start_pos + 1);
3033 
3034 	   -- set the OUT params
3035 	   x_msg_count := 1;
3036 	   x_msg_data := l_message_type||' : '||l_message_text;
3037 
3038         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3039 
3040       END IF; /* l_exit <> error */
3041 
3042       --
3043       -- Parsing message_text and type is not required. Debugging.
3044       --
3045 
3046      --
3047       -- Config_Header_Id
3048       --
3049       l_config_header_id_start_pos :=
3050                        INSTR(p_cz_xml_terminate_msg, l_config_header_id_start_tag, 1, 1)+
3051                        LENGTH(l_config_header_id_start_tag);
3052 
3053       l_config_header_id_end_pos :=
3054                        INSTR(p_cz_xml_terminate_msg, l_config_header_id_end_tag, 1, 1) - 1;
3055 
3056       l_config_header_id :=
3057                        TO_NUMBER(SUBSTR( p_cz_xml_terminate_msg,l_config_header_id_start_pos,
3058                                          l_config_header_id_end_pos -
3059                                          l_config_header_id_start_pos + 1));
3060 
3061 
3062       --
3063       -- Config_Rev_Nbr
3064       --
3065       l_config_rev_nbr_start_pos :=
3066                        INSTR(p_cz_xml_terminate_msg, l_config_rev_nbr_start_tag, 1, 1)+
3067                              LENGTH(l_config_rev_nbr_start_tag);
3068 
3069       l_config_rev_nbr_end_pos :=
3070                        INSTR(p_cz_xml_terminate_msg, l_config_rev_nbr_end_tag, 1, 1) - 1;
3071 
3072       l_config_rev_nbr :=
3073                        TO_NUMBER(SUBSTR( p_cz_xml_terminate_msg,l_config_rev_nbr_start_pos,
3074                                          l_config_rev_nbr_end_pos -
3075                                          l_config_rev_nbr_start_pos + 1));
3076 
3077        -- debug log
3078        IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3079           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
3080                     G_MODULE||l_api_name,
3081                     'l_config_header_id_start_pos : '||l_config_header_id_start_pos);
3082           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
3083                     G_MODULE||l_api_name,
3084                     'l_config_header_id_end_pos : '||l_config_header_id_end_pos);
3085           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
3086                     G_MODULE||l_api_name,
3087                     'l_config_header_id : '||l_config_header_id);
3088           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
3089                     G_MODULE||l_api_name,
3090                     'l_config_rev_nbr_start_pos : '||l_config_rev_nbr_start_pos);
3091           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
3092                     G_MODULE||l_api_name,
3093                     'l_config_rev_nbr_end_pos : '||l_config_rev_nbr_end_pos);
3094           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
3095                     G_MODULE||l_api_name,
3096                     'l_config_rev_nbr : '||l_config_rev_nbr);
3097        END IF;
3098 
3099 
3100       x_config_header_id := l_config_header_id;
3101       x_config_rev_nbr   := l_config_rev_nbr;
3102       x_complete_config  := NVL(l_complete_config, 'FALSE');
3103       x_valid_config     := NVL(l_valid_config, 'FALSE');
3104 
3105   -- end debug log
3106   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3107      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
3108                     G_MODULE||l_api_name,
3109                     '1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
3110   END IF;
3111 
3112   EXCEPTION
3113 
3114       WHEN FND_API.G_EXC_ERROR THEN
3115   		x_return_status := FND_API.G_RET_STS_ERROR ;
3116   		FND_MSG_PUB.Count_And_Get(
3117   		        p_count => x_msg_count,
3118           		p_data => x_msg_data
3119   		);
3120 
3121       WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3122   		x_return_status := FND_API.G_RET_STS_ERROR ;
3123 		-- Uncommented this code to get proper error messages for Bug 5000619
3124   		FND_MSG_PUB.Count_And_Get(
3125   		        p_count => x_msg_count,
3126           		p_data => x_msg_data
3127   		);
3128 
3129       WHEN OTHERS THEN
3130   		x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
3131 
3132     		IF FND_MSG_PUB.Check_Msg_Level
3133   		   (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
3134   		THEN
3135       	    	FND_MSG_PUB.Add_Exc_Msg(
3136       	    	     G_PKG_NAME  	    ,
3137       	    	     l_api_name
3138   	    	      );
3139   		END IF;
3140 
3141   		FND_MSG_PUB.Count_And_Get(
3142   		     p_count => x_msg_count,
3143           	     p_data => x_msg_data
3144   		);
3145 
3146 END parse_cz_xml_terminate_msg;
3147 
3148 
3149 
3150 /*====================================================================+
3151   Procedure Name : process_qa_result
3152   Description    : Compares the newly selected Configurator articles
3153                    with the Configurator-selected articles currently in
3154                    the document.  It does the following:
3155 
3156                    a.	For each CZ Document Article not in CZ New Articles
3157                             -> Insert message in QA PL/SQL Table
3158                    b.	For each CZ New Article not in CZ Document Articles
3159                             -> Insert message in QA PL/SQL Table
3160 +====================================================================*/
3161 PROCEDURE process_qa_result(
3162     p_api_version                  IN NUMBER,
3163     p_init_msg_list                IN VARCHAR2,
3164     p_document_id                  IN NUMBER,
3165     p_document_type                IN VARCHAR2,
3166     p_config_header_id             IN NUMBER,
3167     p_config_rev_nbr               IN NUMBER,
3168     x_qa_result_tbl                IN OUT NOCOPY OKC_TERMS_QA_GRP.qa_result_tbl_type,
3169     x_return_status                OUT NOCOPY VARCHAR2,
3170     x_msg_count                    OUT NOCOPY NUMBER,
3171     x_msg_data                     OUT NOCOPY VARCHAR2)
3172 
3173 IS
3174     l_api_name CONSTANT VARCHAR2(30) := 'process_qa_result';
3175     l_api_version CONSTANT NUMBER := 1;
3176 
3177     l_article_tbl_index NUMBER;
3178     l_article_id NUMBER;
3179     l_article_version_id NUMBER;
3180     l_article_name  varchar2(1000);
3181 
3182     l_prov_allowed  varchar2(1);
3183     l_provision  varchar2(1);
3184 
3185     l_expert_articles_tbl expert_articles_tbl_type;
3186     l_articles_not_in_cz_tbl expert_articles_tbl_type;
3187 
3188     l_qa_tbl_index  NUMBER;
3189     l_severity      OKC_QA_ERRORS_T.ERROR_SEVERITY%TYPE;
3190     l_desc          OKC_QA_ERRORS_T.PROBLEM_SHORT_DESC%TYPE;
3191     l_perform_bv_qa VARCHAR2(1);
3192 
3193     l_new_expert_article_sev      OKC_QA_ERRORS_T.ERROR_SEVERITY%TYPE;
3194     l_new_expert_article_desc          OKC_QA_ERRORS_T.PROBLEM_SHORT_DESC%TYPE;
3195     l_perf_new_expert_art VARCHAR2(1);
3196 
3197     l_old_expert_article_sev      OKC_QA_ERRORS_T.ERROR_SEVERITY%TYPE;
3198     l_old_expert_article_desc          OKC_QA_ERRORS_T.PROBLEM_SHORT_DESC%TYPE;
3199     l_perf_old_expert_art VARCHAR2(1);
3200 
3201     --
3202     -- Cursor to check provision allowed for doc type
3203     --
3204     CURSOR l_get_prov_csr IS
3205     SELECT NVL(PROVISION_ALLOWED_YN,'Y')
3206     FROM OKC_BUS_DOC_TYPES_B
3207     WHERE  DOCUMENT_TYPE=p_document_type;
3208 
3209     --
3210     -- Currsor to Select the Expert Articles
3211     -- that are in the latest Configuration
3212     --
3213     --
3214 
3215     CURSOR l_get_expert_articles_from_cz IS
3216     SELECT SUBSTR(orig_sys_ref,INSTR(orig_sys_ref,':',-1,1)+1)
3217       FROM cz_config_items_v
3218      WHERE  config_hdr_id = p_config_header_id
3219        AND  config_rev_nbr = p_config_rev_nbr
3220        AND  orig_sys_ref LIKE 'OKC:CLAUSEMODELOPTION:%' ;
3221 
3222     --
3223     -- Currsor to find Expert Articles in the new config
3224     -- that are also in the document.
3225     --
3226     --
3227     CURSOR l_article_in_doc (b_article_id NUMBER) IS
3228        SELECT kart.orig_article_id
3229        FROM   OKC_K_ARTICLES_B KART
3230        WHERE  document_type = p_document_type
3231        AND    document_id = p_document_id
3232        AND    source_flag='R'
3233        AND    NVL(kart.AMENDMENT_OPERATION_CODE, '?') <> 'DELETED'
3234        AND    NVL(kart.SUMMARY_AMEND_OPERATION_CODE, '?') <> 'DELETED'
3235        AND     kart.orig_article_id = b_article_id;
3236 
3237     --
3238     -- Currsor to Select the Expert Articles in the Document
3239     -- that are not in the latest Configuration
3240     --
3241     --
3242     CURSOR l_articles_only_in_doc (p_document_type varchar2,
3243                               p_document_id number,
3244                               p_config_header_id number,
3245                               p_config_rev_nbr number) IS
3246             SELECT orig_article_id
3247             FROM   okc_k_articles_b kart
3248             WHERE  kart.document_type = p_document_type
3249             AND    kart.document_id = p_document_id
3250             AND    kart.source_flag = 'R'  -- from Contract Expert
3251             AND    NVL(kart.AMENDMENT_OPERATION_CODE, '?') <> 'DELETED'
3252             AND    NVL(kart.SUMMARY_AMEND_OPERATION_CODE, '?') <> 'DELETED'
3253             --AND    (nvl(nvl(kart.ref_article_id, kart.sav_sae_id), -1) not in (
3254             AND    (kart.orig_article_id NOT IN (
3255 		          SELECT SUBSTR(orig_sys_ref,INSTR(orig_sys_ref,':',-1,1)+1)
3256                       FROM cz_config_items_v
3257                      WHERE  config_hdr_id = p_config_header_id
3258                        AND  config_rev_nbr = p_config_rev_nbr
3259                        AND  orig_sys_ref LIKE 'OKC:CLAUSEMODELOPTION:%'
3260 				                            )
3261 				);
3262 
3263   CURSOR csr_provision (p_article_version_id NUMBER) IS
3264   SELECT NVL(PROVISION_YN,'N')
3265   FROM   OKC_ARTICLE_VERSIONS VERS
3266   WHERE vers.article_version_id = p_article_version_id;
3267 
3268 
3269 CURSOR l_get_max_article_csr(p_article_id NUMBER) IS
3270 SELECT article_version_id
3271   FROM okc_article_versions
3272  WHERE  article_id= p_article_id
3273    AND  article_status in ('ON_HOLD','APPROVED')
3274    AND  start_date = (SELECT MAX(start_date)
3275                         FROM okc_article_versions
3276                        WHERE  article_id= p_article_id
3277                          AND  article_status in ('ON_HOLD','APPROVED')
3278 				  );
3279 
3280   BEGIN
3281 
3282 
3283   -- start debug log
3284   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3285      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
3286                     G_MODULE||l_api_name,
3287                     '100: Entered '||G_PKG_NAME ||'.'||l_api_name);
3288      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
3289                     G_MODULE||l_api_name,
3290                     'Parameters : ');
3291      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
3292                     G_MODULE||l_api_name,
3293                     'p_document_id : '||p_document_id);
3294      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
3295                     G_MODULE||l_api_name,
3296                     'p_document_type : '||p_document_type);
3297      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
3298                     G_MODULE||l_api_name,
3299                     'p_config_header_id : '||p_config_header_id);
3300      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
3301                     G_MODULE||l_api_name,
3302                     'p_config_rev_nbr : '||p_config_rev_nbr);
3303 
3304   END IF;
3305 
3306   x_return_status :=  G_RET_STS_SUCCESS;
3307 
3308     IF (p_config_header_id IS NULL OR p_config_rev_nbr IS NULL)
3309     THEN
3310       x_msg_data := 'OKC_EXPRT_NULL_PARAM';
3311       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3312     END IF;
3313 
3314     --
3315     -- Get New Article QA Code Severity and Name
3316     --
3317     get_qa_code_detail(p_document_type => p_document_type,
3318                        p_qa_code =>  G_CHECK_NEW_EXPERT_ART ,
3319                        x_perform_qa    => l_perf_new_expert_art,
3320                        x_qa_name       => l_new_expert_article_desc,
3321                        x_severity_flag => l_new_expert_article_sev,
3322                        x_return_status => x_return_status);
3323 
3324     IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR)
3325     THEN
3326       RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3327     ELSIF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
3328       RAISE FND_API.G_EXC_ERROR ;
3329     END IF;
3330 
3331 
3332 
3333     /*
3334     --
3335     -- Get New Article QA Code Severity and Name
3336     --
3337     OKC_TERMS_QA_PVT.get_qa_code_detail(p_qa_code =>  G_CHECK_NEW_EXPERT_ART ,
3338                        x_perform_qa    => l_perf_new_expert_art,
3339                        x_qa_name       => l_new_expert_article_desc,
3340                        x_severity_flag => l_new_expert_article_sev,
3341                        x_return_status => x_return_status);
3342 
3343 
3344     IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR)
3345     THEN
3346       RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3347     ELSIF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
3348       RAISE FND_API.G_EXC_ERROR ;
3349     END IF;
3350     */
3351 
3352     --
3353     -- Get Old Article QA Code Severity and Name
3354     --
3355     get_qa_code_detail(p_document_type => p_document_type,
3356                        p_qa_code =>  G_CHECK_OLD_EXPERT_ART ,
3357                        x_perform_qa    => l_perf_old_expert_art,
3358                        x_qa_name       => l_old_expert_article_desc,
3359                        x_severity_flag => l_old_expert_article_sev,
3360                        x_return_status => x_return_status);
3361 
3362     IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR)
3363     THEN
3364       RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3365     ELSIF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
3366       RAISE FND_API.G_EXC_ERROR ;
3367     END IF;
3368 
3369 
3370 /*    --
3371     -- Get Old Article QA Code Severity and Name
3372     --
3373     OKC_TERMS_QA_PVT.get_qa_code_detail(p_qa_code =>  G_CHECK_OLD_EXPERT_ART ,
3374                        x_perform_qa    => l_perf_old_expert_art,
3375                        x_qa_name       => l_old_expert_article_desc,
3376                        x_severity_flag => l_old_expert_article_sev,
3377                        x_return_status => x_return_status);
3378 
3379     IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR)
3380     THEN
3381       RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3382     ELSIF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
3383       RAISE FND_API.G_EXC_ERROR ;
3384     END IF;
3385 
3386 */
3387     IF l_perf_old_expert_art <> 'Y' THEN
3388       l_old_expert_article_sev := 'W';
3389     END IF;
3390 
3391     IF l_perf_new_expert_art <> 'Y' THEN
3392       l_new_expert_article_sev := 'W';
3393     END IF;
3394 
3395     IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR)
3396     THEN
3397       RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3398     ELSIF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
3399       RAISE FND_API.G_EXC_ERROR ;
3400     END IF;
3401 
3402     --
3403     -- Select Articles from configuration
3404     --
3405     OPEN l_get_expert_articles_from_cz;
3406     FETCH l_get_expert_articles_from_cz BULK COLLECT INTO l_expert_articles_tbl;
3407     CLOSE l_get_expert_articles_from_cz;
3408 
3409     --
3410     -- First Check if Provisions are allowed in the document.  If not, do not suggest
3411     -- them in QA.
3412     --
3413     OPEN  l_get_prov_csr;
3414     FETCH l_get_prov_csr INTO l_prov_allowed;
3415     CLOSE l_get_prov_csr;
3416 
3417     --
3418     -- Loop through the article ids table looking for
3419     -- articles that are in the latest configuration but
3420     -- not in the document.
3421     -- If SQL does not find the article, then the article id does not yet
3422     -- exist in the document.
3423     --
3424     l_article_id := NULL;
3425 
3426     FOR l_article_tbl_index IN 1..l_expert_articles_tbl.count LOOP
3427 
3428       OPEN l_article_in_doc(l_expert_articles_tbl(l_article_tbl_index));
3429       FETCH l_article_in_doc INTO l_article_id;
3430 
3431       IF (l_article_in_doc%NOTFOUND)
3432       THEN
3433 
3434              -- debug log
3435 		   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3436 		       FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
3437 		               G_MODULE||l_api_name,
3438 		               'Article id not in document : '||l_expert_articles_tbl(l_article_tbl_index));
3439 		   END IF;
3440 
3441           --
3442           -- Get the article's latest version and name
3443           --
3444           l_article_version_id := NULL;
3445           l_article_name := NULL;
3446 
3447           --
3448           -- Article Version ID is null if there is no effective version of
3449           -- the article.  In this case, we do not want to suggest the article
3450           -- to the user, even if Contract Expert is returning the article in
3451           -- its configuration.
3452           --
3453 		--
3454 		-- Bug 4118467
3455 		-- Report Expired clauses too in QA
3456 		--
3457 
3458           l_article_version_id  :=
3459                OKC_TERMS_UTIL_PVT.Get_latest_art_version_id(
3460                                      l_expert_articles_tbl(l_article_tbl_index)
3461                                    , p_document_type
3462                                    , p_document_id );
3463 
3464 		-- Bug 4118467
3465 		-- Report Expired clauses too in QA
3466           --
3467 		IF l_article_version_id IS NULL THEN
3468 		   -- get the last expired Approved version
3469 		   OPEN l_get_max_article_csr(p_article_id =>  l_expert_articles_tbl(l_article_tbl_index) );
3470 		     FETCH l_get_max_article_csr INTO l_article_version_id ;
3471 		   CLOSE l_get_max_article_csr;
3472 
3473 		END IF; -- l_article_version_id
3474 
3475              -- debug log
3476 		   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3477 		       FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
3478 		               G_MODULE||l_api_name,
3479 		               'l_article_version_id : '||l_article_version_id);
3480 		   END IF;
3481 
3482           IF (l_article_version_id IS NOT NULL)
3483           THEN
3484 
3485             --
3486             -- Does this document type allow provisions?  If not, make sure that  this article
3487             -- is not a provision.
3488             --
3489             IF (UPPER(l_prov_allowed) <> 'Y')
3490             THEN
3491               --
3492               -- BV will not suggest Provisions,
3493               -- based on document type.  So check if this article
3494               -- version is a provision.
3495               --
3496                 OPEN csr_provision (p_article_version_id  => l_article_version_id);
3497                   FETCH csr_provision INTO l_provision;
3498                 CLOSE csr_provision;
3499 
3500 
3501             END IF; -- end l_prov_allowed <> Y
3502 
3503 
3504             --
3505             -- Insert this article in the QA messages if Provision is allowed or
3506             -- if provision is not allowed but the current article version is not a provision
3507             --
3508             IF (UPPER(l_prov_allowed) = 'Y' OR (UPPER(l_prov_allowed) <> 'Y' AND UPPER(l_provision) = 'N'))
3509             THEN
3510 
3511               l_article_name := OKC_TERMS_UTIL_PVT.get_article_name( l_expert_articles_tbl(l_article_tbl_index), l_article_version_id);
3512               l_qa_tbl_index := x_qa_result_tbl.COUNT + 1;
3513               x_qa_result_tbl(l_qa_tbl_index).error_record_type   := G_EXPERT_QA_TYPE;
3514               x_qa_result_tbl(l_qa_tbl_index).article_id          := l_expert_articles_tbl(l_article_tbl_index);
3515               x_qa_result_tbl(l_qa_tbl_index).deliverable_id      := NULL;
3516               x_qa_result_tbl(l_qa_tbl_index).title               := l_article_name;
3517               x_qa_result_tbl(l_qa_tbl_index).section_name        := NULL;
3518               x_qa_result_tbl(l_qa_tbl_index).qa_code             := G_CHECK_NEW_EXPERT_ART;
3519               x_qa_result_tbl(l_qa_tbl_index).message_name        := G_OKC_NEW_EXPERT_ART;
3520               x_qa_result_tbl(l_qa_tbl_index).suggestion          :=
3521                              OKC_TERMS_UTIL_PVT.Get_Message('OKC', G_OKC_NEW_EXPERT_ART_S);
3522               x_qa_result_tbl(l_qa_tbl_index).error_severity      := l_new_expert_article_sev;
3523               x_qa_result_tbl(l_qa_tbl_index).problem_short_desc  := l_new_expert_article_desc;
3524               x_qa_result_tbl(l_qa_tbl_index).problem_details     :=
3525                              OKC_TERMS_UTIL_PVT.Get_Message('OKC',
3526                                                           G_OKC_NEW_EXPERT_ART_D,
3527                                                           'ARTICLE',
3528                                                           l_article_name);
3529             END IF; -- Provision allowed check
3530 
3531           END IF; -- l_article_version_id <> null
3532 
3533       ELSE -- %NOTFOUND
3534 
3535              -- debug log
3536 		   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3537 		       FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
3538 		               G_MODULE||l_api_name,
3539 		               ' Article id is in the document: '||l_article_id);
3540 		   END IF;
3541 
3542       END IF; -- %NOTFOUND
3543       CLOSE l_article_in_doc;
3544 
3545     END LOOP; -- end loop for articles in configuration
3546 
3547     --
3548     -- Loop through the expert articles in the doc
3549     -- looking for articles that are not in the new
3550     -- cz configuration.
3551     --
3552     l_article_id := NULL;
3553 
3554 
3555     OPEN l_articles_only_in_doc(p_document_type,
3556                            p_document_id,
3557                            p_config_header_id,
3558                            p_config_rev_nbr);
3559 
3560     --
3561     -- Get the article's latest version and name.  These
3562     -- are the articles in the doc that are NOT in the latest
3563     -- CZ configuration.  Suggest to delete.
3564     --
3565 
3566     FETCH  l_articles_only_in_doc BULK COLLECT INTO   l_articles_not_in_cz_tbl;
3567 
3568       IF (l_articles_not_in_cz_tbl.COUNT > 0) THEN
3569 
3570       FOR l_article_tbl_index IN 1..l_articles_not_in_cz_tbl.count LOOP
3571 
3572         l_article_id := l_articles_not_in_cz_tbl(l_article_tbl_index);
3573 
3574         l_article_version_id := NULL;
3575         l_article_name := NULL;
3576         l_article_version_id  := OKC_TERMS_UTIL_PVT.Get_latest_art_version_id( l_article_id
3577                                                                           , p_document_type
3578                                                                           , p_document_id );
3579         l_article_name := OKC_TERMS_UTIL_PVT.get_article_name( l_article_id
3580                                                           , l_article_version_id);
3581 
3582         l_qa_tbl_index := x_qa_result_tbl.COUNT + 1;
3583 
3584         x_qa_result_tbl(l_qa_tbl_index).error_record_type   := G_EXPERT_QA_TYPE;
3585         x_qa_result_tbl(l_qa_tbl_index).article_id          := l_article_id;
3586         x_qa_result_tbl(l_qa_tbl_index).deliverable_id      := NULL;
3587         x_qa_result_tbl(l_qa_tbl_index).title               := l_article_name;
3588         x_qa_result_tbl(l_qa_tbl_index).section_name        := NULL;
3589         x_qa_result_tbl(l_qa_tbl_index).qa_code             := G_CHECK_OLD_EXPERT_ART;
3590         x_qa_result_tbl(l_qa_tbl_index).message_name        := G_OKC_OLD_EXPERT_ART;
3591         x_qa_result_tbl(l_qa_tbl_index).suggestion          := OKC_TERMS_UTIL_PVT.Get_Message('OKC',G_OKC_OLD_EXPERT_ART_S);
3592         x_qa_result_tbl(l_qa_tbl_index).error_severity      := l_old_expert_article_sev;
3593         x_qa_result_tbl(l_qa_tbl_index).problem_short_desc  := l_old_expert_article_desc;
3594         x_qa_result_tbl(l_qa_tbl_index).problem_details     :=
3595                           OKC_TERMS_UTIL_PVT.Get_Message('OKC',    -- app name
3596                                                          G_OKC_OLD_EXPERT_ART_D, -- message name
3597                                                          'ARTICLE',            -- token 1
3598                                                          l_article_name);      -- token1 value
3599 
3600 
3601        END LOOP;
3602        END IF;
3603 
3604     CLOSE l_articles_only_in_doc;
3605 
3606   -- end debug log
3607   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3608      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
3609                     G_MODULE||l_api_name,
3610                     '1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
3611   END IF;
3612 
3613 EXCEPTION
3614 
3615       WHEN FND_API.G_EXC_ERROR THEN
3616                 IF l_articles_only_in_doc%ISOPEN
3617                 THEN
3618                  CLOSE l_articles_only_in_doc;
3619                 END IF;
3620 
3621                 IF l_get_expert_articles_from_cz%ISOPEN
3622                 THEN
3623                  CLOSE l_get_expert_articles_from_cz;
3624                 END IF;
3625 
3626                 IF l_get_prov_csr%ISOPEN
3627                 THEN
3628                  CLOSE l_get_prov_csr;
3629                 END IF;
3630 
3631                 IF l_article_in_doc%ISOPEN
3632                 THEN
3633                  CLOSE l_article_in_doc;
3634                 END IF;
3635 
3636   		x_return_status := FND_API.G_RET_STS_ERROR ;
3637   		FND_MSG_PUB.Count_And_Get(
3638   		        p_count => x_msg_count,
3639           		p_data => x_msg_data
3640   		);
3641 
3642       WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3643                 IF l_articles_only_in_doc%ISOPEN
3644                 THEN
3645                  CLOSE l_articles_only_in_doc;
3646                 END IF;
3647                 IF l_get_expert_articles_from_cz%ISOPEN
3648                 THEN
3649                  CLOSE l_get_expert_articles_from_cz;
3650                 END IF;
3651 
3652                 IF l_get_prov_csr%ISOPEN
3653                 THEN
3654                  CLOSE l_get_prov_csr;
3655                 END IF;
3656 
3657                 IF l_article_in_doc%ISOPEN
3658                 THEN
3659                  CLOSE l_article_in_doc;
3660                 END IF;
3661   		x_return_status := FND_API.G_RET_STS_ERROR ;
3662   		FND_MSG_PUB.Count_And_Get(
3663   		        p_count => x_msg_count,
3664           		p_data => x_msg_data
3665   		);
3666 
3667       WHEN OTHERS THEN
3668                 IF l_articles_only_in_doc%ISOPEN
3669                 THEN
3670                  CLOSE l_articles_only_in_doc;
3671                 END IF;
3672                 IF l_get_expert_articles_from_cz%ISOPEN
3673                 THEN
3674                  CLOSE l_get_expert_articles_from_cz;
3675                 END IF;
3676 
3677                 IF l_get_prov_csr%ISOPEN
3678                 THEN
3679                  CLOSE l_get_prov_csr;
3680                 END IF;
3681 
3682                 IF l_article_in_doc%ISOPEN
3683                 THEN
3684                  CLOSE l_article_in_doc;
3685                 END IF;
3686   		x_return_status := FND_API.G_RET_STS_ERROR ;
3687   		FND_MSG_PUB.Count_And_Get(
3688   		        p_count => x_msg_count,
3689           		p_data => x_msg_data
3690   		);
3691 
3692   		x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
3693 
3694     		IF FND_MSG_PUB.Check_Msg_Level
3695   		   (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
3696   		THEN
3697       	    	FND_MSG_PUB.Add_Exc_Msg(
3698       	    	     G_PKG_NAME  	    ,
3699       	    	     l_api_name
3700   	    	      );
3701   		END IF;
3702 
3703   		FND_MSG_PUB.Count_And_Get(
3704   		     p_count => x_msg_count,
3705           	     p_data => x_msg_data
3706   		);
3707 
3708 END process_qa_result;
3709 
3710 
3711 /*====================================================================+
3712   Procedure Name : get_expert_articles
3713   Description    : Returns all articles for a configuration header id
3714                    and rev number.  This is called from the Batch Validation
3715                    process when BV is invoked for the Deviations report.
3716 
3717 			    If the document does NOT support provisions then all expert
3718 			    suggested provisions would be dropped
3719 
3720                    Note:  x_expert_articles_tbl could be NULL if the
3721                           configuration did not return any articles OR
3722 					 if document type does NOT support provisions and
3723 					 all expert suggested articles are provisions
3724 +====================================================================*/
3725 PROCEDURE get_expert_articles(
3726     p_api_version                  IN NUMBER,
3727     p_init_msg_list                IN VARCHAR2,
3728     p_document_id                  IN NUMBER,
3729     p_document_type                IN VARCHAR2,
3730     p_config_header_id             IN NUMBER,
3731     p_config_rev_nbr               IN NUMBER,
3732     x_expert_articles_tbl          OUT NOCOPY expert_articles_tbl_type,
3733     x_return_status                OUT NOCOPY VARCHAR2,
3734     x_msg_count                    OUT NOCOPY NUMBER,
3735     x_msg_data                     OUT NOCOPY VARCHAR2)
3736 IS
3737 
3738     l_api_version CONSTANT NUMBER := 1;
3739     l_api_name CONSTANT VARCHAR2(30) := 'get_expert_articles';
3740     l_prov_allowed  varchar2(1);
3741     l_provision  varchar2(1);
3742     l_expert_articles_tbl        expert_articles_tbl_type;
3743     j                           BINARY_INTEGER :=0;
3744 
3745 
3746     --
3747     -- Cursor to check provision allowed for doc type
3748     --
3749     CURSOR l_get_prov_csr IS
3750     SELECT NVL(PROVISION_ALLOWED_YN,'Y')
3751     FROM OKC_BUS_DOC_TYPES_B
3752     WHERE  DOCUMENT_TYPE=p_document_type;
3753 
3754 
3755     --
3756     -- Currsor to Select the Expert Articles
3757     -- that are in the latest Configuration
3758     --
3759     --
3760 
3761     CURSOR l_get_expert_articles_from_cz IS
3762     SELECT SUBSTR(orig_sys_ref,INSTR(orig_sys_ref,':',-1,1)+1)
3763       FROM cz_config_items_v
3764      WHERE  config_hdr_id = p_config_header_id
3765        AND  config_rev_nbr = p_config_rev_nbr
3766        AND  orig_sys_ref LIKE 'OKC:CLAUSEMODELOPTION:%' ;
3767 
3768 
3769     --
3770     -- Cursor to check if the article is a provision or clause
3771     --
3772     --
3773   CURSOR csr_art_provision (p_article_id NUMBER) IS
3774   SELECT NVL(PROVISION_YN,'N')
3775   FROM   OKC_ARTICLE_VERSIONS VERS
3776   WHERE vers.article_id = p_article_id;
3777 
3778 
3779 BEGIN
3780 
3781 
3782   -- start debug log
3783   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3784      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
3785                     G_MODULE||l_api_name,
3786                     '100: Entered '||G_PKG_NAME ||'.'||l_api_name);
3787      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
3788                     G_MODULE||l_api_name,
3789                     'Parameters : ');
3790      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
3791                     G_MODULE||l_api_name,
3792                     'p_config_header_id : '||p_config_header_id);
3793      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
3794                     G_MODULE||l_api_name,
3795                     'p_config_rev_nbr : '||p_config_rev_nbr);
3796 
3797   END IF;
3798 
3799     --
3800     -- Standard call to check for call compatibility.
3801     --
3802     IF NOT FND_API.Compatible_API_Call (l_api_version,
3803        	       	    	    	 	p_api_version,
3804         	    	    	    	l_api_name,
3805     		    	    	    	G_PKG_NAME)
3806     THEN
3807     	RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3808     END IF;
3809 
3810     --
3811     -- Initialize message list if p_init_msg_list is set to TRUE.
3812     --
3813     IF FND_API.to_Boolean( p_init_msg_list ) THEN
3814     	FND_MSG_PUB.initialize;
3815     END IF;
3816 
3817 
3818     IF (p_config_header_id IS NULL OR p_config_rev_nbr IS NULL)
3819     THEN
3820       x_msg_data := 'OKC_EXPRT_NULL_PARAM';
3821       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3822     END IF;
3823 
3824     --
3825     --  Initialize API return status to success
3826     --
3827     x_return_status := FND_API.G_RET_STS_SUCCESS;
3828 
3829     --
3830     -- This SQL is based on Drop 1 changes to
3831     -- cz_config_items_v, where CZ will
3832     -- add the orig_sys_ref column.
3833     --
3834 
3835 
3836     --
3837     -- If provisions are allowed on current document type then just return all
3838     -- the articles suggested by expert
3839     -- If provision is NOT allowed then process each article to check if it is provision an drop
3840 
3841     --
3842     -- First Check if Provisions are allowed in the document.  If not, do not suggest
3843     -- them in QA.
3844     --
3845     OPEN  l_get_prov_csr;
3846     FETCH l_get_prov_csr INTO l_prov_allowed;
3847     CLOSE l_get_prov_csr;
3848 
3849 
3850     IF l_prov_allowed = 'Y' THEN
3851         --
3852         -- Select Articles from configuration
3853         --
3854         OPEN l_get_expert_articles_from_cz;
3855         FETCH l_get_expert_articles_from_cz BULK COLLECT INTO x_expert_articles_tbl;
3856         CLOSE l_get_expert_articles_from_cz;
3857 
3858     ELSE
3859        -- Provision is Not allowed, check each article for provision flag
3860 	  -- and drop provisons
3861         --
3862         -- Select Articles from configuration
3863         --
3864         OPEN l_get_expert_articles_from_cz;
3865         FETCH l_get_expert_articles_from_cz BULK COLLECT INTO l_expert_articles_tbl;
3866         CLOSE l_get_expert_articles_from_cz;
3867 
3868 
3869 	   FOR i IN NVL(l_expert_articles_tbl.FIRST,0)..NVL(l_expert_articles_tbl.LAST,-1)
3870 	   LOOP
3871 
3872 	       OPEN csr_art_provision (p_article_id => l_expert_articles_tbl(i));
3873 		    FETCH csr_art_provision INTO l_provision;
3874 		  CLOSE csr_art_provision;
3875 
3876 
3877 		  IF l_provision = 'N' THEN
3878 		    j := j + 1;
3879 		    x_expert_articles_tbl(j) := l_expert_articles_tbl(i);
3880 		  END IF; -- not a provision
3881 	   END LOOP;
3882 
3883 
3884     END IF;  -- l_prov_allowed = 'Y'
3885 
3886 
3887   -- end debug log
3888   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3889      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
3890                     G_MODULE||l_api_name,
3891                     '1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
3892   END IF;
3893 
3894 EXCEPTION
3895 
3896       WHEN FND_API.G_EXC_ERROR THEN
3897 
3898   		x_return_status := FND_API.G_RET_STS_ERROR ;
3899   		FND_MSG_PUB.Count_And_Get(
3900   		        p_count => x_msg_count,
3901           		p_data => x_msg_data
3902   		);
3903 
3904       WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3905   		x_return_status := FND_API.G_RET_STS_ERROR ;
3906   		FND_MSG_PUB.Count_And_Get(
3907   		        p_count => x_msg_count,
3908           		p_data => x_msg_data
3909   		);
3910 
3911       WHEN OTHERS THEN
3912   		x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
3913 
3914     		IF FND_MSG_PUB.Check_Msg_Level
3915   		   (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
3916   		THEN
3917       	    	FND_MSG_PUB.Add_Exc_Msg(
3918       	    	     G_PKG_NAME  	    ,
3919       	    	     l_api_name
3920   	    	      );
3921   		END IF;
3922 
3923   		FND_MSG_PUB.Count_And_Get(
3924   		     p_count => x_msg_count,
3925           	     p_data => x_msg_data
3926   		);
3927 
3928 END get_expert_articles;
3929 
3930 
3931 /*========================================================================+
3932          Procedure:  contract_expert_bv
3933          Description:  This API is called from OKC_TERMS_QA_PVT
3934                        It is the main wrapper around the Batch Validation process,
3935                        executed from QA and from the Deviation Report processes.
3936 
3937 +========================================================================*/
3938 
3939 -- Removed old contract_expert_bv
3940 
3941 /*====================================================================+
3942   Procedure Name : update_ce_config
3943   Description    : Update Expert Articles in Document.  This API
3944                    is called from the runtime Contract Expert page during
3945                    document authoring.  Specifically, it is called
3946                    when a user selects the 'Finish' button from Contract
3947                    Expert and the resulting configuration is valid and
3948                    complete.
3949 
3950 			    -- Sanjay
3951 			    Before updating the template usage record read the previous
3952 			    config_header_id and config_rev_nbr and delete the same
3953 
3954   Parameters:
3955                    p_document_id - id of document id to be updated
3956                    p_document_type - type of document to be updated
3957                    p_config_header_id - configuration header id of resulting
3958                                    article configuration
3959                    p_config_rev_nbr - configuration number of resutling
3960                                    article configuration
3961 
3962 
3963 
3964 +====================================================================*/
3965 PROCEDURE update_ce_config(
3966     p_api_version                  IN NUMBER,
3967     p_init_msg_list                IN VARCHAR2,
3968     p_document_id                  IN NUMBER,
3969     p_document_type                IN VARCHAR2,
3970     p_config_header_id             IN NUMBER,
3971     p_config_rev_nbr               IN NUMBER,
3972     p_doc_update_mode              IN VARCHAR2,
3973     x_count_articles_dropped       OUT NOCOPY NUMBER,
3974     x_return_status                OUT NOCOPY VARCHAR2,
3975     x_msg_count                    OUT NOCOPY NUMBER,
3976     x_msg_data                     OUT NOCOPY VARCHAR2)
3977 
3978 IS
3979 
3980     l_api_name CONSTANT VARCHAR2(30) := 'update_ce_config';
3981     l_api_version CONSTANT NUMBER := 1;
3982 
3983     l_expert_articles_tbl OKC_TERMS_MULTIREC_GRP.article_id_tbl_type;
3984     l_validation_string  VARCHAR2(100);
3985 
3986     l_old_config_header_id        okc_template_usages.config_header_id%TYPE;
3987     l_old_config_revision_number  okc_template_usages.config_revision_number%TYPE;
3988     --
3989     -- Currsor to Select the Expert Articles
3990     -- that are in the latest Configuration
3991     --
3992     --
3993 
3994     CURSOR l_get_expert_articles_from_cz IS
3995     SELECT SUBSTR(orig_sys_ref,INSTR(orig_sys_ref,':',-1,1)+1)
3996       FROM cz_config_items_v
3997      WHERE  config_hdr_id = p_config_header_id
3998        AND  config_rev_nbr = p_config_rev_nbr
3999        AND  orig_sys_ref LIKE 'OKC:CLAUSEMODELOPTION:%' ;
4000 
4001   --
4002   -- Cursor to read the previous config_header_id and config_rev_nbr and delete the same
4003   --
4004   CURSOR csr_old_config_dtls IS
4005   SELECT config_header_id,
4006          config_revision_number
4007     FROM okc_template_usages
4008    WHERE document_type  = p_document_type
4009      AND document_id    = p_document_id ;
4010 
4011   BEGIN
4012 
4013 
4014     --
4015     -- Standard call to check for call compatibility.
4016     --
4017     IF NOT FND_API.Compatible_API_Call (l_api_version,
4018        	       	    	    	 	p_api_version,
4019         	    	    	    	l_api_name,
4020     		    	    	    	G_PKG_NAME)
4021     THEN
4022     	RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4023     END IF;
4024 
4025     --
4026     -- Initialize message list if p_init_msg_list is set to TRUE.
4027     --
4028     IF FND_API.to_Boolean( p_init_msg_list ) THEN
4029     	FND_MSG_PUB.initialize;
4030     END IF;
4031 
4032     IF (p_config_header_id is NULL OR p_config_rev_nbr is NULL OR
4033         p_document_id is NULL OR p_document_type is NULL)
4034     THEN
4035       x_msg_data := 'OKC_EXPRT_NULL_PARAM';
4036       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4037     END IF;
4038 
4039     --
4040     --  Initialize API return status to success
4041     --
4042     x_return_status := FND_API.G_RET_STS_SUCCESS;
4043 
4044 
4045     -- Read the previous configuration to be deleted
4046     OPEN csr_old_config_dtls;
4047       FETCH csr_old_config_dtls INTO l_old_config_header_id,l_old_config_revision_number;
4048     CLOSE csr_old_config_dtls;
4049 
4050     --
4051     -- Get Expert Articles from Configurator
4052     --
4053 	  OPEN l_get_expert_articles_from_cz;
4054 	     FETCH l_get_expert_articles_from_cz BULK COLLECT INTO l_expert_articles_tbl;
4055 	  CLOSE l_get_expert_articles_from_cz;
4056 
4057     --
4058     -- Call API to Update Document with new Expert configuration
4059     --
4060     OKC_TERMS_MULTIREC_GRP.sync_doc_with_expert(
4061                    p_api_version => 1,
4062                    p_init_msg_list => FND_API.G_FALSE,
4063                    p_validate_commit => FND_API.G_FALSE,
4064                    p_validation_string => l_validation_string,
4065                    p_commit => FND_API.G_FALSE,
4066                    p_doc_type => p_document_type,
4067                    p_doc_id => p_document_id,
4068                    p_article_id_tbl => l_expert_articles_tbl,
4069                    p_mode => p_doc_update_mode, -- Defaults to 'NORMAL'
4070                    x_articles_dropped => x_count_articles_dropped,
4071                    x_return_status => x_return_status,
4072                    x_msg_count => x_msg_count,
4073                    x_msg_data => x_msg_data);
4074 
4075 
4076     IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
4077       raise FND_API.G_EXC_UNEXPECTED_ERROR;
4078     END IF;
4079 
4080 
4081     --
4082     -- Update the template usage with new config_header_id and config_rev_nbr
4083     --
4084     UPDATE okc_template_usages
4085        SET config_header_id = p_config_header_id,
4086 	      config_revision_number = p_config_rev_nbr,
4087 		 valid_config_yn = 'Y',
4088            last_update_date = SYSDATE,
4089 		 last_updated_by= FND_GLOBAL.USER_ID,
4090 		 last_update_login= FND_GLOBAL.LOGIN_ID
4091     WHERE document_type  = p_document_type
4092       AND document_id    = p_document_id ;
4093 
4094     /*
4095     OKC_TEMPLATE_USAGES_GRP.update_template_usages(
4096         p_api_version            => 1,
4097         p_init_msg_list          => FND_API.G_FALSE,
4098         p_validation_level       => FND_API.G_VALID_LEVEL_FULL,
4099         p_commit                 => FND_API.G_FALSE,
4100         x_return_status          => x_return_status,
4101         x_msg_count              => x_msg_count,
4102         x_msg_data               => x_msg_data,
4103         p_document_type          => p_document_type,
4104         p_document_id            => p_document_id,
4105         p_template_id            => NULL,
4106         p_doc_numbering_scheme   => NULL,
4107         p_document_number        => NULL,
4108         p_article_effective_date => NULL,
4109         p_config_header_id       => p_config_header_id,
4110         p_config_revision_number => p_config_rev_nbr,
4111         p_valid_config_yn        => 'Y',      -- check
4112         p_object_version_number  => 1
4113     );
4114 
4115 
4116     IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
4117       raise FND_API.G_EXC_UNEXPECTED_ERROR;
4118     END IF;
4119 
4120     */
4121 
4122     --
4123     -- Delete the previous configuration
4124     --
4125     --
4126     IF (l_old_config_header_id IS NOT NULL AND
4127         l_old_config_revision_number IS NOT NULL ) THEN
4128 
4129                   OKC_XPRT_CZ_INT_PVT.delete_configuration(
4130                        p_api_version          => 1.0,
4131                        p_init_msg_list        => FND_API.G_FALSE,
4132                        p_config_header_id     => l_old_config_header_id,
4133                        p_config_rev_nbr       => l_old_config_revision_number,
4134                        x_return_status        => x_return_status,
4135                        x_msg_data             => x_msg_data,
4136                        x_msg_count            => x_msg_count);
4137 
4138     END IF; -- delete the old configuration
4139 
4140     IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
4141       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4142     END IF;
4143 
4144 
4145     --
4146     -- Display appropriate message on page depending on whether articles where inserted
4147     -- into document or not.  In this release, we only distinguish between inserting articles
4148     -- and not inserting articles.  We do not explicitly inform user if articles are deleted.
4149     --
4150     /*
4151      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
4152 	* Fix for bug# 4071469.
4153 	* If l_expert_articles_tbl.COUNT = 0 we return 'OKC_EXPRT_NO_ARTICLES' message
4154 	* If l_expert_articles_tbl.COUNT > 0 and = x_count_articles_dropped,
4155 	*    we return 'OKC_EXPRT_ALL_PROVISIONS' message
4156 	* The rest of the original logic is unchanged.
4157     */
4158 
4159     IF (l_expert_articles_tbl.COUNT = 0)
4160     THEN
4161 	 x_msg_data := 'OKC_EXPRT_NO_ARTICLES';
4162 
4163     ELSIF (l_expert_articles_tbl.COUNT = x_count_articles_dropped)
4164     THEN
4165       x_msg_data := 'OKC_EXPRT_ALL_PROVISIONS';
4166 
4167     ELSIF x_count_articles_dropped > 0
4168     THEN
4169 
4170       x_msg_data := 'OKC_EXPRT_UPDATED_WITH_PROVS';
4171 
4172     ELSE
4173 
4174       x_msg_data := 'OKC_EXPRT_ARTICLES_UPDATED';
4175 
4176     END IF;
4177 
4178 EXCEPTION
4179 
4180        WHEN FND_API.G_EXC_ERROR THEN
4181 
4182    		x_return_status := FND_API.G_RET_STS_ERROR ;
4183    		FND_MSG_PUB.Count_And_Get(
4184    		        p_count => x_msg_count,
4185            		p_data => x_msg_data
4186    		);
4187 
4188        WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4189    		x_return_status := FND_API.G_RET_STS_ERROR ;
4190    		FND_MSG_PUB.Count_And_Get(
4191    		        p_count => x_msg_count,
4192            		p_data => x_msg_data
4193    		);
4194 
4195        WHEN OTHERS THEN
4196    		x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
4197 
4198      		IF FND_MSG_PUB.Check_Msg_Level
4199    		   (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
4200    		THEN
4201        	    	FND_MSG_PUB.Add_Exc_Msg(
4202        	    	     G_PKG_NAME  	    ,
4203        	    	     l_api_name
4204    	    	      );
4205    		END IF;
4206 
4207    		FND_MSG_PUB.Count_And_Get(
4208    		     p_count => x_msg_count,
4209            	     p_data => x_msg_data
4210    		);
4211 
4212 
4213 END update_ce_config;
4214 
4215 
4216 /*====================================================================+
4217   Procedure Name : update_config_id_rev_nbr
4218   Description    : Update Configuration ID and Rev Number for document.
4219                    This API is called from the runtime Contract Expert page during
4220                    document authoring.  Specifically, it is called
4221                    when a user selects the 'Save' button from Contract
4222                    Expert.
4223 
4224 			    -- Sanjay
4225 			    Before updating the template usage record read the previous
4226 			    config_header_id and config_rev_nbr and delete the same
4227 
4228 
4229   Parameters:
4230                    p_document_id - id of document id to be updated
4231                    p_document_type - type of document to be updated
4232                    p_template_id - id of template applied to document to be
4233                                    updated
4234                    p_config_header_id - configuration header id of resulting
4235                                    article configuration
4236                    p_config_rev_nbr - configuration number of resutling
4237                                    article configuration
4238 
4239 
4240 +====================================================================*/
4241 PROCEDURE update_config_id_rev_nbr(
4242     p_api_version                  IN NUMBER,
4243     p_init_msg_list                IN VARCHAR2,
4244     p_document_id                  IN NUMBER,
4245     p_document_type                IN VARCHAR2,
4246     p_config_header_id             IN NUMBER,
4247     p_config_rev_nbr               IN NUMBER,
4248     p_template_id                  IN NUMBER,
4249     x_return_status                OUT NOCOPY VARCHAR2,
4250     x_msg_count                    OUT NOCOPY NUMBER,
4251     x_msg_data                     OUT NOCOPY VARCHAR2)
4252 
4253 IS
4254     l_api_name CONSTANT VARCHAR2(30) := 'update_config_id_rev_nbr';
4255     l_api_version CONSTANT NUMBER := 1;
4256 
4257     l_old_config_header_id        okc_template_usages.config_header_id%TYPE;
4258     l_old_config_revision_number  okc_template_usages.config_revision_number%TYPE;
4259 
4260   --
4261   -- Cursor to read the previous config_header_id and config_rev_nbr and delete the same
4262   --
4263   CURSOR csr_old_config_dtls IS
4264   SELECT config_header_id,
4265          config_revision_number
4266     FROM okc_template_usages
4267    WHERE document_type  = p_document_type
4268      AND document_id    = p_document_id ;
4269 
4270 
4271 BEGIN
4272 
4273     --
4274     -- Standard call to check for call compatibility.
4275     --
4276     IF NOT FND_API.Compatible_API_Call (l_api_version,
4277        	       	    	    	 	p_api_version,
4278         	    	    	    	l_api_name,
4279     		    	    	    	G_PKG_NAME)
4280     THEN
4281     	RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4282     END IF;
4283 
4284     --
4285     -- Initialize message list if p_init_msg_list is set to TRUE.
4286     --
4287     IF FND_API.to_Boolean( p_init_msg_list ) THEN
4288     	FND_MSG_PUB.initialize;
4289     END IF;
4290 
4291     IF (p_config_header_id is NULL OR p_config_rev_nbr is NULL OR
4292         p_document_id is NULL OR p_document_type is NULL)
4293     THEN
4294       x_msg_data := 'OKC_EXPRT_NULL_PARAM';
4295       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4296     END IF;
4297 
4298     --
4299     --  Initialize API return status to success
4300     --
4301     x_return_status := FND_API.G_RET_STS_SUCCESS;
4302 
4303 
4304     -- Read the previous configuration to be deleted
4305     OPEN csr_old_config_dtls;
4306       FETCH csr_old_config_dtls INTO l_old_config_header_id,l_old_config_revision_number;
4307     CLOSE csr_old_config_dtls;
4308 
4309 
4310     --
4311     -- Update the template usage with new config_header_id and config_rev_nbr
4312     --
4313     UPDATE okc_template_usages
4314        SET config_header_id = p_config_header_id,
4315 	      config_revision_number = p_config_rev_nbr,
4316 		 valid_config_yn = 'Y',
4317            last_update_date = SYSDATE,
4318 		 last_updated_by= FND_GLOBAL.USER_ID,
4319 		 last_update_login= FND_GLOBAL.LOGIN_ID
4320     WHERE document_type  = p_document_type
4321       AND document_id    = p_document_id ;
4322 
4323 /*
4324     OKC_TEMPLATE_USAGES_GRP.update_template_usages(
4325         p_api_version            => 1,
4326         p_init_msg_list          => FND_API.G_FALSE,
4327         p_validation_level       => FND_API.G_VALID_LEVEL_FULL,
4328         p_commit                 => FND_API.G_FALSE,
4329         x_return_status          => x_return_status,
4330         x_msg_count              => x_msg_count,
4331         x_msg_data               => x_msg_data,
4332         p_document_type          => p_document_type,
4333         p_document_id            => p_document_id,
4334         p_template_id            => p_template_id,
4335         p_doc_numbering_scheme   => NULL,
4336         p_document_number        => NULL,
4337         p_article_effective_date => NULL,
4338         p_config_header_id       => p_config_header_id,
4339         p_config_revision_number => p_config_rev_nbr,
4340         p_valid_config_yn        => 'Y',      -- check
4341         p_object_version_number  => 1
4342     );
4343 
4344 
4345     IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
4346       raise FND_API.G_EXC_UNEXPECTED_ERROR;
4347     END IF;
4348 
4349  */
4350 
4351     --
4352     -- Delete the previous configuration
4353     --
4354     --
4355     IF (l_old_config_header_id IS NOT NULL AND
4356         l_old_config_revision_number IS NOT NULL ) THEN
4357 
4358                   OKC_XPRT_CZ_INT_PVT.delete_configuration(
4359                        p_api_version          => 1.0,
4360                        p_init_msg_list        => FND_API.G_FALSE,
4361                        p_config_header_id     => l_old_config_header_id,
4362                        p_config_rev_nbr       => l_old_config_revision_number,
4363                        x_return_status        => x_return_status,
4364                        x_msg_data             => x_msg_data,
4365                        x_msg_count            => x_msg_count);
4366 
4367     END IF; -- delete the old configuration
4368 
4369     IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
4370       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4371     END IF;
4372 
4373 
4374 EXCEPTION
4375 
4376        WHEN FND_API.G_EXC_ERROR THEN
4377 
4378    		x_return_status := FND_API.G_RET_STS_ERROR ;
4379    		FND_MSG_PUB.Count_And_Get(
4380    		        p_count => x_msg_count,
4381            		p_data => x_msg_data
4382    		);
4383 
4384        WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4385    		x_return_status := FND_API.G_RET_STS_ERROR ;
4386    		FND_MSG_PUB.Count_And_Get(
4387    		        p_count => x_msg_count,
4388            		p_data => x_msg_data
4389    		);
4390 
4391        WHEN OTHERS THEN
4392    		x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
4393 
4394      		IF FND_MSG_PUB.Check_Msg_Level
4395    		   (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
4396    		THEN
4397        	    	FND_MSG_PUB.Add_Exc_Msg(
4398        	    	     G_PKG_NAME  	    ,
4399        	    	     l_api_name
4400    	    	      );
4401    		END IF;
4402 
4403    		FND_MSG_PUB.Count_And_Get(
4404    		     p_count => x_msg_count,
4405            	     p_data => x_msg_data
4406    		);
4407 END update_config_id_rev_nbr;
4408 
4409 /*====================================================================+
4410   Procedure Name : get_article_details
4411   Description    : If the given article_id exists in the
4412                    given document and if so, fetches its article_version_id
4413                    else this procedure fetches the latest article_version_id
4414                    from article library for the given article_id
4415 
4416 +====================================================================*/
4417 PROCEDURE get_article_details(
4418     p_api_version      IN  NUMBER,
4419     p_init_msg_list    IN  VARCHAR2,
4420     p_document_id      IN NUMBER,
4421     p_document_type    IN VARCHAR2,
4422     p_article_id       IN NUMBER,
4423     p_effectivity_date IN DATE,
4424     x_article_id       OUT NOCOPY NUMBER,
4425     x_article_version_id OUT NOCOPY NUMBER,
4426     x_doc_lib           OUT NOCOPY VARCHAR2,
4427     x_return_status    OUT NOCOPY VARCHAR2,
4428     x_msg_count        OUT NOCOPY NUMBER,
4429     x_msg_data         OUT NOCOPY VARCHAR2)
4430 IS
4431      l_article_id NUMBER;
4432      l_article_version_id NUMBER;
4433      l_doc_lib            VARCHAR2(1);
4434      l_api_version      CONSTANT NUMBER := 1;
4435      l_api_name         CONSTANT VARCHAR2(30) := 'get_article_details';
4436 
4437 CURSOR get_doc_article_ver_id(p_doc_id NUMBER,p_doc_type VARCHAR2,p_article_id NUMBER) IS
4438         select id, article_version_id, 'D' from okc_k_articles_b
4439         where document_id = p_doc_id
4440             and document_type = p_doc_type
4441             and ((sav_sae_id = p_article_id) or (ref_article_id = p_article_id))
4442             and source_flag = 'R'
4443             and rownum < 2;
4444 
4445 CURSOR l_approved_ver_csr(p_article_id NUMBER, effective_date DATE) IS
4446           SELECT ver.article_id, ver.article_version_id, 'L'
4447              FROM okc_articles_all art,
4448                okc_article_versions ver
4449              WHERE art.article_id = p_article_id
4450                 AND art.article_id = ver.article_id
4451                 AND ver.article_status IN  ('APPROVED','ON_HOLD')
4452                 AND nvl(effective_date,trunc(SYSDATE)) BETWEEN ver.start_date AND NVL(ver.end_date,TRUNC(SYSDATE));
4453 
4454 -- bug 4106513
4455 CURSOR l_approved_latest_ver_csr(p_article_id NUMBER ) IS
4456         SELECT ver.article_id, ver.article_version_id, 'L'
4457             FROM okc_article_versions ver
4458             WHERE ver.article_id = p_article_id
4459               AND ver.article_status IN ('APPROVED','ON_HOLD')
4460               AND ver.start_date = (SELECT max(start_date)
4461                             FROM okc_article_versions ver1
4462                             WHERE ver1.article_id = p_article_id
4463                             AND ver1.article_status IN ('APPROVED','ON_HOLD'));
4464 
4465 BEGIN
4466 
4467 	   l_doc_lib := 'D';
4468 
4469         -- Standard call to check for call compatibility.
4470         IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
4471           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4472         END IF;
4473         -- Initialize message list if p_init_msg_list is set to TRUE.
4474         IF FND_API.to_Boolean( p_init_msg_list ) THEN
4475           FND_MSG_PUB.initialize;
4476         END IF;
4477 
4478         --  Initialize API return status to success
4479           x_return_status := G_RET_STS_SUCCESS;
4480 
4481 		Open  get_doc_article_ver_id(p_document_id, p_document_type, p_article_id);
4482 		fetch get_doc_article_ver_id into l_article_id, l_article_version_id, l_doc_lib;
4483         IF get_doc_article_ver_id%NOTFOUND  THEN
4484 --          l_article_id := p_article_id;
4485 --          l_article_version_id := OKC_TERMS_UTIL_PVT.Get_latest_tmpl_art_version_id(p_article_id, p_effectivity_date);
4486 --          l_doc_lib := 'L';
4487 		      Open  l_approved_ver_csr(p_article_id, p_effectivity_date);
4488 		      fetch l_approved_ver_csr into l_article_id, l_article_version_id, l_doc_lib;
4489               if l_approved_ver_csr%NOTFOUND  THEN
4490     		      Open  l_approved_latest_ver_csr(p_article_id);
4491 	   	          fetch l_approved_latest_ver_csr into l_article_id, l_article_version_id, l_doc_lib;
4492                   close l_approved_latest_ver_csr;
4493               end if;
4494               close l_approved_ver_csr;
4495         END if;
4496 		close get_doc_article_ver_id;
4497         x_article_id := l_article_id;
4498         x_article_version_id := l_article_version_id;
4499         x_doc_lib := l_doc_lib;
4500         FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4501 
4502 EXCEPTION
4503     WHEN FND_API.G_EXC_ERROR THEN
4504       x_return_status := G_RET_STS_ERROR ;
4505       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4506 
4507     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4508       x_return_status := G_RET_STS_UNEXP_ERROR ;
4509       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4510 
4511     WHEN OTHERS THEN
4512       IF get_doc_article_ver_id%ISOPEN THEN
4513         CLOSE get_doc_article_ver_id;
4514       END IF;
4515       x_return_status := G_RET_STS_UNEXP_ERROR ;
4516       IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
4517         FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
4518       END IF;
4519       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4520 END get_article_details;
4521 
4522 -------------------------FUNCTIONS USED IN RULES PAGES-----------------------------------------------------
4523 
4524 /*====================================================================+
4525   Function Name : check_clause_exists
4526   Description    : Returns 'Y' if a clause exists in arule, otherwise returns 'N'
4527                    Used in Rules Summary Page
4528   Parameters     : p_rule_id : Rule Id
4529                    p_clause_id : Clause Id
4530 +====================================================================*/
4531 
4532 FUNCTION check_clause_exists (
4533     p_rule_id   IN NUMBER,
4534     p_clause_id IN NUMBER)
4535 RETURN VARCHAR2 IS
4536 
4537 CURSOR csr_cond_clause_exists IS
4538 SELECT 'X'
4539 FROM okc_xprt_rule_conditions c,
4540      okc_xprt_rule_cond_vals cv
4541 WHERE c.rule_condition_id = cv.rule_condition_id
4542 AND c.object_value_type = 'CLAUSE'
4543 AND cv.object_value_code = p_clause_id
4544 AND c.rule_id = p_rule_id ;
4545 
4546 CURSOR csr_out_clause_exits IS
4547 SELECT 'X'
4548 FROM okc_xprt_rule_outcomes o
4549 WHERE o.rule_id = p_rule_id
4550 AND o.object_type = 'CLAUSE'
4551 AND o.object_value_id = p_clause_id ;
4552 
4553 l_dummy  VARCHAR2(1);
4554 l_return VARCHAR2(1);
4555 
4556 BEGIN
4557 --check if clause exists as a condition value (RHS)
4558    OPEN csr_cond_clause_exists;
4559      FETCH csr_cond_clause_exists INTO l_dummy;
4560        IF csr_cond_clause_exists%NOTFOUND THEN
4561          l_return := 'N';
4562        ELSE
4563          l_return := 'Y';
4564        END IF;
4565    CLOSE csr_cond_clause_exists;
4566 
4567     IF l_return = 'Y' THEN
4568       RETURN l_return;
4569     END IF;
4570 
4571 --check if clause exists as an outcome
4572 
4573    OPEN csr_out_clause_exits;
4574      FETCH csr_out_clause_exits INTO l_dummy;
4575        IF csr_out_clause_exits%NOTFOUND THEN
4576          l_return := 'N';
4577        ELSE
4578          l_return := 'Y';
4579        END IF;
4580    CLOSE csr_out_clause_exits;
4581 
4582     RETURN l_return;
4583 
4584 EXCEPTION
4585  WHEN OTHERS THEN
4586  --close cursors
4587  IF csr_cond_clause_exists%ISOPEN THEN
4588    CLOSE csr_cond_clause_exists;
4589  END IF;
4590 
4591  IF csr_out_clause_exits%ISOPEN THEN
4592    CLOSE csr_out_clause_exits;
4593  END IF;
4594 
4595  RETURN NULL;
4596 END check_clause_exists;
4597 
4598 /*====================================================================+
4599   Function Name : check_variable_exists
4600   Description    : Returns 'Y' if a variable is used in a rule, otherwise returns 'N'
4601                    Used in Rules Summary Page
4602     Parameters     : p_rule_id : Rule Id
4603                      p_variable_code : variable_code
4604 +====================================================================*/
4605 
4606 FUNCTION check_variable_exists (
4607     p_rule_id            IN NUMBER,
4608     p_variable_code      IN VARCHAR2)
4609 RETURN VARCHAR2 IS
4610 
4611 CURSOR csr_variable_val_exists IS
4612 SELECT 'X'
4613 FROM okc_xprt_rule_conditions c,
4614      okc_xprt_rule_cond_vals cv
4615 WHERE c.rule_condition_id = cv.rule_condition_id
4616   AND c.object_value_type = 'VARIABLE'
4617   AND cv.object_value_code = p_variable_code
4618   AND c.rule_id = p_rule_id ;
4619 
4620 CURSOR csr_variable_cond_exists IS
4621 SELECT 'X'
4622 FROM okc_xprt_rule_conditions c
4623 WHERE  c.object_type = 'VARIABLE'
4624   AND  c.object_code = p_variable_code
4625   AND  c.rule_id = p_rule_id ;
4626 
4627 l_dummy  VARCHAR2(1);
4628 l_return VARCHAR2(1);
4629 
4630 BEGIN
4631 --check if variable exists in condition value (RHS)
4632    OPEN csr_variable_val_exists;
4633      FETCH csr_variable_val_exists INTO l_dummy;
4634        IF csr_variable_val_exists%NOTFOUND THEN
4635          l_return := 'N';
4636        ELSE
4637          l_return := 'Y';
4638        END IF;
4639    CLOSE csr_variable_val_exists;
4640    IF l_return = 'Y' THEN
4641       RETURN l_return;
4642     END IF;
4643 --check if variable exists in condition  (LHS)
4644    OPEN csr_variable_cond_exists;
4645      FETCH csr_variable_cond_exists INTO l_dummy;
4646        IF csr_variable_cond_exists%NOTFOUND THEN
4647          l_return := 'N';
4648        ELSE
4649          l_return := 'Y';
4650        END IF;
4651    CLOSE csr_variable_cond_exists;
4652 
4653    RETURN l_return;
4654 
4655 
4656 EXCEPTION
4657 
4658  WHEN OTHERS THEN
4659  --close cursors
4660  IF csr_variable_cond_exists%ISOPEN THEN
4661    CLOSE csr_variable_cond_exists;
4662  END IF;
4663 
4664  IF csr_variable_val_exists%ISOPEN THEN
4665    CLOSE csr_variable_val_exists;
4666  END IF;
4667 
4668  RETURN NULL;
4669 END check_variable_exists;
4670 
4671 /*====================================================================+
4672   Function Name : check_question_exists
4673   Description    : Returns 'Y' if a question is used in a rule, otherwise returns 'N'
4674                    Used in Rules Summary Page
4675 +====================================================================*/
4676 
4677 FUNCTION check_question_exists (
4678     p_rule_id            IN NUMBER,
4679     p_question_id        IN NUMBER)
4680 RETURN VARCHAR2 IS
4681  CURSOR question_exists IS
4682   SELECT  'x'
4683   FROM okc_xprt_rule_cond_vals cvals,
4684        okc_xprt_rule_conditions cond
4685   WHERE cond.rule_id = p_rule_id
4686   AND cond.rule_condition_id=cvals.rule_condition_id
4687   AND cond.object_value_type ='QUESTION'
4688   AND cvals.object_value_code=p_question_id
4689   UNION ALL
4690   SELECT 'x'
4691   FROM  okc_xprt_rule_conditions cond
4692   WHERE cond.rule_id = p_rule_id
4693   AND  cond.object_type ='QUESTION'
4694   AND cond.object_code=to_char(p_question_id)
4695   UNION ALL
4696   SELECT 'x'
4697   FROM okc_xprt_rule_outcomes xro
4698   WHERE xro.rule_id =p_rule_id
4699   AND xro.object_type='QUESTION'
4700   AND xro.object_value_id=p_question_id;
4701 
4702  l_dummy VARCHAR2(1);
4703   l_return VARCHAR2(1);
4704 
4705 BEGIN
4706 --check if question is used  in condition value (LHS/RHS) or as an outcome
4707  OPEN question_exists;
4708      FETCH question_exists INTO l_dummy;
4709        IF question_exists%NOTFOUND THEN
4710          l_return := 'N';
4711        ELSE
4712          l_return := 'Y';
4713        END IF;
4714    CLOSE question_exists;
4715 
4716   RETURN l_return;
4717 EXCEPTION
4718 
4719  WHEN OTHERS THEN
4720  --close cursors
4721  IF question_exists%ISOPEN THEN
4722    CLOSE question_exists;
4723  END IF;
4724  RETURN 'N';
4725 END check_question_exists;
4726 
4727 /*====================================================================+
4728   Function Name : check_template_exists
4729   Description    : Returns 'Y' if a rule applies to a template
4730                    Used in Rules Summary Page
4731   Parameters     : p_rule_id  : Rule Id
4732                    p_template_id :  Template Id
4733 +====================================================================*/
4734 
4735  FUNCTION check_template_exists (
4736     p_rule_id            IN NUMBER,
4737     p_template_id        IN NUMBER)
4738 RETURN VARCHAR2 IS
4739 
4740    CURSOR all_rules IS
4741 
4742    -- org wide rules applicable to given template
4743    SELECT 'x'
4744     FROM okc_xprt_rule_hdrs_all rule
4745     WHERE rule.rule_id = p_rule_id
4746     AND rule.org_wide_flag = 'Y'
4747     AND (rule.intent, rule.org_id)  in (select intent, org_id from okc_terms_templates_all where template_id = p_template_id)
4748 
4749     UNION ALL
4750 
4751     --template specific rules
4752     SELECT 'x'
4753     FROM okc_xprt_rule_hdrs_all xrh,
4754          okc_xprt_template_rules xtr
4755     WHERE xrh.rule_id = xtr.rule_id
4756     AND xrh.rule_id = p_rule_id
4757     AND template_id=p_template_id;
4758 
4759   l_dummy VARCHAR2(1);
4760   l_return VARCHAR2(1);
4761 
4762 BEGIN
4763 --check if rule applies to the template specifically or thorugh Org wide rules
4764  OPEN all_rules;
4765      FETCH all_rules INTO l_dummy;
4766        IF all_rules%NOTFOUND THEN
4767          l_return := 'N';
4768        ELSE
4769          l_return := 'Y';
4770        END IF;
4771    CLOSE all_rules;
4772 
4773   RETURN l_return;
4774 EXCEPTION
4775 
4776  WHEN OTHERS THEN
4777  --close cursors
4778  IF all_rules%ISOPEN THEN
4779    CLOSE all_rules;
4780  END IF;
4781  RETURN NULL;
4782  END check_template_exists;
4783 
4784 /*====================================================================+
4785   Function Name : check_orgwide_rule_exists
4786   Description    : Returns 'Y' if an org wide rule exists in the user's org, Otherwise returns 'N'
4787                    Used to determine the templates to display in the Assigned to Templates LOV
4788 +====================================================================*/
4789 
4790  FUNCTION check_orgwide_rule_exists
4791   RETURN VARCHAR2
4792 
4793   IS
4794  CURSOR c1 is
4795       select 'x'
4796       from okc_xprt_rule_hdrs_all
4797       where org_wide_flag='Y';
4798       --Bug#4779070 commented below condition
4799       /*and NVL(ORG_ID,NVL(TO_NUMBER(DECODE(SUBSTRB(USERENV('CLIENT_INFO'),1,1), ' ', NULL,
4800          SUBSTRB(USERENV('CLIENT_INFO'),1,10))),-99)) = NVL(TO_NUMBER(DECODE(SUBSTRB(USERENV('CLIENT_INFO'),1,1), ' ', NULL,
4801          SUBSTRB(USERENV('CLIENT_INFO'),1,10))),-99);*/
4802 
4803   l_dummy VARCHAR2(1);
4804   l_return VARCHAR2(1);
4805 
4806 BEGIN
4807 
4808  OPEN c1;
4809      FETCH c1 INTO l_dummy;
4810        IF c1%NOTFOUND THEN
4811          l_return := 'N';
4812        ELSE
4813          l_return := 'Y';
4814        END IF;
4815    CLOSE c1;
4816 
4817   RETURN l_return;
4818 
4819 EXCEPTION
4820 
4821  WHEN OTHERS THEN
4822  --close cursors
4823  IF c1%ISOPEN THEN
4824    CLOSE c1;
4825  END IF;
4826  RETURN NULL;
4827 END  check_orgwide_rule_exists;
4828 
4829 /*====================================================================+
4830   Function Name : get_object_name
4831   Description    : Returns the condition name given the object type and object_code
4832                    Used to display condition name in rules update/view mode
4833 +====================================================================*/
4834 
4835 FUNCTION get_object_name (
4836     p_object_name      IN VARCHAR2,
4837     p_object_code      IN VARCHAR2)
4838 RETURN VARCHAR2 IS
4839 CURSOR c1 IS
4840     SELECT variable_name
4841     FROM okc_bus_variables_v
4842     WHERE variable_code=p_object_code;
4843 
4844 CURSOR c2 IS
4845     SELECT question_name
4846     FROM okc_xprt_questions_vl
4847     WHERE question_id=TO_NUMBER(p_object_code)
4848     AND question_type='Q';
4849 c1rec c1%ROWTYPE;
4850 c2rec c2%ROWTYPE;
4851 l_name VARCHAR2(150);
4852 
4853 BEGIN
4854  IF p_object_name ='VARIABLE'  THEN
4855 
4856     OPEN c1;
4857     FETCH c1  INTO c1rec;
4858     CLOSE c1;
4859     l_name:=c1rec.variable_name;
4860 
4861  ELSIF p_object_name ='QUESTION'  THEN
4862     OPEN c2;
4863     FETCH c2  INTO c2rec;
4864     CLOSE c2;
4865     l_name:=c2rec.question_name;
4866   END IF;
4867  RETURN l_name;
4868 
4869 EXCEPTION
4870 
4871  WHEN OTHERS THEN
4872  --close cursors
4873  IF c1%ISOPEN THEN
4874    CLOSE c1;
4875  END IF;
4876 
4877   --close cursors
4878  IF c2%ISOPEN THEN
4879    CLOSE c2;
4880  END IF;
4881 
4882  RETURN NULL;
4883 
4884 END get_object_name;
4885 
4886 /*====================================================================+
4887   Function Name : get_value_display
4888   Description    : Returns the condition value display name
4889                    Used to display condition value in condition table
4890                    in rules update/view mode
4891 +====================================================================*/
4892 
4893 FUNCTION get_value_display (
4894     p_object_value_type      IN VARCHAR2,
4895     p_object_value_code      IN VARCHAR2,
4896     p_object_value_set_id    IN NUMBER,
4897     p_validation_type        IN VARCHAR2,
4898     p_longlist_flag          IN VARCHAR2,
4899     p_mode                   IN VARCHAR2 )
4900 
4901 RETURN VARCHAR2 IS
4902 CURSOR c1 IS
4903     SELECT article_title
4904     FROM okc_articles_all
4905     WHERE article_id=to_number(p_object_value_code);
4906 
4907 CURSOR C2 IS
4908     SELECT question_name
4909     FROM okc_xprt_questions_vl
4910     WHERE question_id=TO_NUMBER(p_object_value_code)
4911     AND question_type= decode(p_object_value_type,'CONSTANT','C','Q');
4912 
4913  CURSOR c3 IS
4914     SELECT variable_name
4915     FROM okc_bus_variables_v
4916     WHERE variable_code=p_object_value_code;
4917 
4918 
4919 /*CURSOR c2 IS
4920     select value.flex_value
4921     --,value.description
4922     from fnd_flex_values_vl value
4923 where value.FLEX_VALUE_SET_ID =  p_object_value_set_id
4924 and enabled_flag='Y'
4925 and trunc(sysdate) between nvl(trunc(start_date_active),trunc(sysdate)) and nvl(trunc(end_date_active),trunc(sysdate))
4926 */
4927 
4928 l_value  VARCHAR2(1000) := null;
4929 
4930 BEGIN
4931  --This means that the value is from a poplist and display will be taken care of by the poplist
4932  IF p_validation_type = 'I' and p_longlist_flag = 'X' and p_mode is null THEN
4933    return null;
4934  END IF;
4935 
4936 -- If object_type is clause, then get clause name
4937  If p_object_value_type = 'CLAUSE' THEN
4938     OPEN c1;
4939     FETCH c1  INTO l_value;
4940     CLOSE c1;
4941 
4942 -- If object type is constant or question
4943  Elsif (p_object_value_type = 'CONSTANT' OR p_object_value_type ='QUESTION') THEN
4944     OPEN c2;
4945     FETCH c2  INTO l_value;
4946     CLOSE c2;
4947 
4948 -- If opbject type is an expert variable
4949  Elsif (p_object_value_type = 'VARIABLE')  THEN
4950 
4951     OPEN c3;
4952     FETCH c3  INTO l_value;
4953     CLOSE c3;
4954 
4955  ELSIF (p_object_value_type='VALUE') AND (p_object_value_set_id is not null) THEN
4956     l_value := get_valueset_value ( p_object_value_set_id, p_object_value_code,    p_validation_type );
4957  END IF;
4958 
4959  RETURN NVL(l_value,NULL);
4960 
4961 EXCEPTION
4962 WHEN OTHERS THEN
4963   --close cursors
4964  IF c1%ISOPEN THEN
4965    CLOSE c1;
4966  END IF;
4967 
4968  IF c2%ISOPEN THEN
4969    CLOSE c2;
4970  END IF;
4971 
4972  IF c3%ISOPEN THEN
4973    CLOSE c3;
4974  END IF;
4975  RETURN NULL;
4976 
4977 END get_value_display;
4978 
4979 /*====================================================================+
4980   Function Name : get_concat_condition_values
4981   Description   : Returns all the condition values as a comma separated
4982                   string for a given RuleCondition Id
4983 		  Added as a part of Policy Deviations Project
4984 +====================================================================*/
4985 
4986 FUNCTION get_concat_condition_values (
4987            p_rule_condition_id      IN NUMBER)
4988 RETURN VARCHAR2 IS
4989 
4990 CURSOR csr_condition_values IS
4991  SELECT Object_Value_Code
4992  FROM OKC_XPRT_RULE_COND_VALS
4993  WHERE rule_condition_id = p_rule_condition_id;
4994 
4995 l_concat_values  VARCHAR2(1000) := null;
4996 l_value varchar2(1000) := null;
4997 rec_condition_values csr_condition_values%rowtype;
4998 BEGIN
4999      FOR rec_condition_values IN csr_condition_values
5000      LOOP
5001 	 l_value := get_value_display(p_rule_condition_id,
5002 					rec_condition_values.Object_Value_Code);
5003 	IF ((length(l_concat_values)+length (l_value ))> 50 ) THEN
5004 	     l_concat_values := substr(l_concat_values,0,(length(l_concat_values)));
5005 	      --add '....' at the end
5006 	    l_concat_values := l_concat_values ||'......';
5007 	    exit;
5008        END IF;
5009        IF l_concat_values IS null THEN
5010 	    l_concat_values := l_value;
5011        ELSE
5012 	    l_concat_values := l_concat_values || ', ' || l_value;
5013        END IF;
5014    END LOOP;
5015 
5016 RETURN l_concat_values;
5017 
5018 EXCEPTION
5019 WHEN OTHERS THEN
5020   IF csr_condition_values%ISOPEN THEN
5021 	     CLOSE csr_condition_values;
5022   END IF;
5023 RETURN NULL;
5024 END get_concat_condition_values;
5025 
5026 /*====================================================================+
5027   Bug 4728299 Added for Policy Deviations Project
5028   Function Name : get_concat_document_value
5029   Description   : Returns concatinated document value.
5030                   Used to concatinate Item or Item Category Variables
5031         		Used at View Policy Deviation Details Page to show document value
5032 +====================================================================*/
5033 FUNCTION get_concat_document_value (
5034      p_object_code      IN VARCHAR2,
5035      p_sequence_id      IN VARCHAR2)
5036 RETURN VARCHAR2 is
5037 
5038 CURSOR csr_variable_value IS
5039  SELECT variable_value
5040  FROM OKC_XPRT_DEVIATIONS_T
5041  WHERE variable_code = p_object_code
5042  AND run_id = p_sequence_id
5043  AND variable_value is not null;
5044 
5045 CURSOR csr_translated_value(p_variable_id VARCHAR2, p_variable_value VARCHAR2) IS
5046  SELECT localized_str translated_value
5047  FROM cz_localized_texts
5048  WHERE orig_sys_ref LIKE 'OKC:VARIABLEMODELOPTION:-99:%:' || p_variable_id || ':' || p_variable_value
5049  AND LANGUAGE = USERENV('LANG');
5050 
5051 
5052 l_api_name  CONSTANT VARCHAR2(30) := 'get_concat_document_value';
5053 l_final_document_value varchar2(1000) := null;
5054 l_variable_value varchar2(1000) := null;
5055 l_variable_translated_value varchar2(1000) := null;
5056 
5057 BEGIN
5058   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5059      Fnd_Log.STRING(FND_LOG.LEVEL_PROCEDURE ,
5060                     G_MODULE||l_api_name,
5061                     '960: Entered '||G_PKG_NAME ||'.'||l_api_name);
5062      Fnd_Log.STRING(Fnd_Log.Level_Procedure,
5063                    g_Module || l_Api_Name,
5064                    '960: Parameters passed: -----------------------');
5065      Fnd_Log.STRING(FND_LOG.LEVEL_PROCEDURE ,
5066                     G_MODULE||l_api_name,
5067                     '960:Object Type = '||p_object_code);
5068      Fnd_Log.STRING(FND_LOG.LEVEL_PROCEDURE ,
5069                     G_MODULE||l_api_name,
5070                     '960:sequence id = '||p_sequence_id  );
5071   END IF;
5072   FOR rec_variable_value in csr_variable_value
5073   LOOP
5074      l_variable_value := rec_variable_value.variable_value;
5075      l_variable_translated_value := null;
5076      OPEN  csr_translated_value(p_object_code, l_variable_value);
5077      FETCH csr_translated_value INTO l_variable_translated_value;
5078      CLOSE csr_translated_value;
5079      IF(l_variable_translated_value is not null) THEN
5080        IF l_final_document_value IS null THEN
5081 	     l_final_document_value := l_variable_translated_value;
5082        ELSE
5083          l_final_document_value := l_final_document_value || ','||l_variable_translated_value;
5084        END IF;
5085      ELSE
5086        IF l_final_document_value IS null THEN
5087 	     l_final_document_value := l_variable_value;
5088        ELSE
5089          l_final_document_value := l_final_document_value || ','||l_variable_value;
5090        END IF;
5091      END IF;
5092 
5093      IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5094               FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
5095                              G_MODULE||l_api_name,
5096                              '961: l_variable_value = ' || l_variable_value);
5097               FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
5098                              G_MODULE||l_api_name,
5099                              '961: l_variable_translated_value = ' || l_variable_translated_value);
5100               FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
5101                              G_MODULE||l_api_name,
5102                              '961: l_final_document_value = ' || l_final_document_value);
5103      END IF;
5104   END LOOP;
5105   RETURN l_final_document_value;
5106 EXCEPTION
5107   WHEN OTHERS THEN
5108   IF csr_variable_value%ISOPEN THEN
5109 	     CLOSE csr_variable_value;
5110   END IF;
5111   IF csr_translated_value%ISOPEN THEN
5112 	     CLOSE csr_translated_value;
5113   END IF;
5114   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5115      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
5116                     G_MODULE||l_api_name,
5117                     '990: Leaving From Exception Block'||G_PKG_NAME ||'.'||l_api_name);
5118   END IF;
5119   RETURN null;
5120 END get_concat_document_value;
5121 
5122 
5123 -- Bug 4728299 Added for Policy Deviations Project
5124 /*====================================================================+
5125   Function Name : get_deviation_document_value
5126   Description   : Returns document value for a given condition.
5127                   Added as a part of Policy Deviations Project.Used at
5128 		  View Policy Deviation Details Page to show document value
5129 +====================================================================*/
5130 FUNCTION get_deviation_document_value (
5131      p_rule_id          IN NUMBER,
5132      p_object_type      IN VARCHAR2,
5133      p_object_code      IN VARCHAR2,
5134      p_sequence_id      IN VARCHAR2,
5135      p_value_set_id     IN NUMBER,
5136      p_object_value_type IN VARCHAR2,
5137      p_object_value_code IN VARCHAR2,
5138      p_line_number      IN VARCHAR2)
5139 RETURN VARCHAR2 is
5140 
5141 CURSOR csr_config_data IS
5142  SELECT config_header_id,config_revision_number
5143  FROM OKC_TERMS_DEVIATIONS_T
5144  WHERE sequence_id = p_sequence_id
5145  AND rownum < 2;
5146 
5147 CURSOR csr_variable_value(l_object_code VARCHAR2) IS
5148  SELECT variable_value
5149  FROM OKC_XPRT_DEVIATIONS_T
5150  WHERE variable_code = l_object_code
5151  AND (line_number = p_line_number or line_number = '-99')
5152  AND run_id = p_sequence_id
5153  AND variable_value is not null;
5154 
5155 CURSOR csr_translated_value(p_variable_id VARCHAR2, p_variable_value VARCHAR2) IS
5156  SELECT localized_str translated_value
5157  FROM cz_localized_texts
5158  WHERE orig_sys_ref LIKE 'OKC:VARIABLEMODELOPTION:-99:%:' || p_variable_id || ':' || p_variable_value
5159  AND LANGUAGE = USERENV('LANG');
5160 
5161 --Bug 4757962 cursor to fetch value for a given question id
5162 CURSOR csr_get_rule_qst_values (l_config_header_id number, l_config_rev_nbr number) is
5163 SELECT ltxt.localized_str question_value
5164       FROM cz_config_items_v config,
5165            cz_ps_nodes psn,
5166            cz_localized_texts ltxt
5167      WHERE config.config_hdr_id = l_config_header_id
5168        AND config.config_rev_nbr = l_config_rev_nbr
5169        AND config.ps_node_id = psn.ps_node_id
5170        AND psn.intl_text_id = ltxt.intl_text_id
5171        AND ltxt.LANGUAGE = USERENV('LANG')
5172        AND SUBSTR(config.orig_sys_ref, INSTR(config.orig_sys_ref,':',-1,2)+1,
5173                (INSTR(config.orig_sys_ref,':',-1,1) - (INSTR(config.orig_sys_ref,':',-1,2)+1))) = to_char(p_object_code);
5174 
5175 -- Create Dynamic sql for the valueset values
5176 CURSOR csr_value_set_tab IS
5177 SELECT  application_table_name,
5178         value_column_name,
5179         id_column_name,
5180         additional_where_clause
5181 FROM fnd_flex_validation_tables
5182 WHERE flex_value_set_id = p_value_set_id;
5183 
5184 -- cursor to find datatype of a question
5185 CURSOR csr_get_qst_datatype is
5186 select question_datatype from okc_xprt_questions_b
5187 where to_char(question_id) = p_object_code;
5188 
5189 -- cursor to fetch document value for questions based on constants
5190 CURSOR csr_get_rule_qst_const_val (l_config_header_id number, l_config_rev_nbr number) is
5191 SELECT to_char(Item_num_val)
5192       FROM cz_config_items_v config
5193      WHERE config.config_hdr_id = l_config_header_id
5194        AND config.config_rev_nbr = l_config_rev_nbr
5195        AND config.orig_sys_ref LIKE 'OKC:TEMPLATEMODELFEATURE:%:' || p_object_code;
5196 
5197 l_api_name                CONSTANT VARCHAR2(30) := 'get_deviation_document_value';
5198 l_object_code  varchar2(2000)   := null;
5199 l_variable_value varchar2(1000) := null;
5200 l_variable_translated_value varchar2(1000) := null;
5201 l_question_value varchar2(1000) := null;
5202 l_final_document_value varchar2(1000) := null; --contains final document value to be returned
5203 l_table_name              fnd_flex_validation_tables.application_table_name%TYPE;
5204 l_name_col                fnd_flex_validation_tables.value_column_name%TYPE;
5205 l_id_col                  fnd_flex_validation_tables.id_column_name%TYPE;
5206 l_additional_where_clause fnd_flex_validation_tables.additional_where_clause%TYPE;
5207 tempName fnd_flex_validation_tables.value_column_name%TYPE ;
5208 tempId   fnd_flex_validation_tables.id_column_name%TYPE ;
5209 l_sql_stmt                LONG;
5210 l_config_header_id  number;
5211 l_config_rev_nbr    number;
5212 l_is_rule_line_level     varchar2(1);
5213 l_question_datatype      varchar2(10);
5214 l_user_defined_var       varchar2(1);
5215 
5216 TYPE cur_typ IS REF CURSOR;
5217 c_cursor cur_typ;
5218 
5219 BEGIN
5220     -- start debug log
5221     IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5222      Fnd_Log.STRING(FND_LOG.LEVEL_PROCEDURE ,
5223                     G_MODULE||l_api_name,
5224                     '900: Entered '||G_PKG_NAME ||'.'||l_api_name);
5225      Fnd_Log.STRING(Fnd_Log.Level_Procedure,
5226                    g_Module || l_Api_Name,
5227                    '910: Parameters passed: -----------------------');
5228      Fnd_Log.STRING(FND_LOG.LEVEL_PROCEDURE ,
5229                     G_MODULE||l_api_name,
5230                     '910:p_rule_id = '||p_rule_id);
5231      Fnd_Log.STRING(FND_LOG.LEVEL_PROCEDURE ,
5232                     G_MODULE||l_api_name,
5233                     '910:Object Type = '||p_object_type);
5234      Fnd_Log.STRING(Fnd_Log.Level_Procedure,
5235                    g_Module || l_Api_Name,
5236                    '910:Object Code = '||p_object_code);
5237      Fnd_Log.STRING(Fnd_Log.Level_Procedure,
5238                    g_Module || l_Api_Name,
5239                    '910:Sequence Id = '||p_sequence_id);
5240      Fnd_Log.STRING(Fnd_Log.Level_Procedure,
5241                        g_Module || l_Api_Name,
5242                    '910:p_value_set_id = '||p_value_set_id);
5243      Fnd_Log.STRING(Fnd_Log.Level_Procedure,
5244                        g_Module || l_Api_Name,
5245                    '910:p_object_value_type = '||p_object_value_type);
5246      Fnd_Log.STRING(Fnd_Log.Level_Procedure,
5247                             g_Module || l_Api_Name,
5248                    '910:p_object_value_code = '||p_object_value_code);
5249      Fnd_Log.STRING(Fnd_Log.Level_Procedure,
5250                        g_Module || l_Api_Name,
5251                    '910:p_line_number = '||p_line_number);
5252 
5253     END IF;
5254 
5255     --If object_type is QUESTION then get the question response
5256     IF p_object_type = 'QUESTION' THEN
5257       OPEN csr_config_data;
5258       FETCH csr_config_data  INTO l_config_header_id,l_config_rev_nbr;
5259       CLOSE csr_config_data;
5260 
5261       OPEN csr_get_qst_datatype;
5262       FETCH csr_get_qst_datatype  INTO l_question_datatype;
5263       CLOSE csr_get_qst_datatype;
5264       if(l_question_datatype = 'N')then
5265           --In case of Numeric Questions get document value from cz_config_items_v.Item_num_val
5266           OPEN csr_get_rule_qst_const_val(l_config_header_id,l_config_rev_nbr);
5267           FETCH csr_get_rule_qst_const_val  INTO l_question_value;
5268           CLOSE csr_get_rule_qst_const_val;
5269           l_final_document_value := l_question_value;
5270       else
5271           OPEN csr_get_rule_qst_values(l_config_header_id,l_config_rev_nbr);
5272           FETCH csr_get_rule_qst_values  INTO l_question_value;
5273           CLOSE csr_get_rule_qst_values;
5274           l_final_document_value := l_question_value;
5275       end if;
5276 
5277       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5278        Fnd_Log.STRING(FND_LOG.LEVEL_PROCEDURE ,
5279                     G_MODULE||l_api_name,
5280                     '920:l_config_header_id = '||l_config_header_id);
5281        Fnd_Log.STRING(Fnd_Log.Level_Procedure,
5282                     g_Module || l_Api_Name,
5283                     '920:l_config_rev_nbr = '||l_config_rev_nbr);
5284        Fnd_Log.STRING(Fnd_Log.Level_Procedure,
5285                     g_Module || l_Api_Name,
5286                    '920:Question DataType = '||l_question_datatype);
5287        Fnd_Log.STRING(Fnd_Log.Level_Procedure,
5288                     g_Module || l_Api_Name,
5289                    '920:l_final_document_value = '||l_final_document_value);
5290       END IF;
5291 
5292     --If object_type is VARIABLE then get the variable translated value as below
5293     Elsif (p_object_type = 'VARIABLE')  THEN
5294       --get the document value from OKC_XPRT_DEVIATIONS_T
5295       --Find whether rule is at Header level or Line Level
5296       l_is_rule_line_level := is_rule_line_level(p_rule_id);
5297       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5298 	   FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
5299 		  G_MODULE||l_api_name,
5300 		  '920: l_is_rule_line_level = '||l_is_rule_line_level);
5301       END IF;
5302       --If rule is at header level and variable code is Item or Item Category then get
5303       --concatinated Item or Item Category Values
5304       IF(l_is_rule_line_level = 'N' AND
5305          (p_object_code='OKC$S_ITEM' OR p_object_code='OKC$S_ITEM_CATEGORY' OR
5306           p_object_code='OKC$B_ITEM' OR p_object_code='OKC$B_ITEM_CATEGORY')) THEN
5307           l_final_document_value := get_concat_document_value(p_object_code,p_sequence_id);
5308       ELSE
5309          OPEN  csr_variable_value(p_object_code);
5310          FETCH csr_variable_value INTO l_variable_value;
5311          CLOSE csr_variable_value;
5312          IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5313 	   FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
5314 		  G_MODULE||l_api_name,
5315 		  '920: Varialbe Value from xprt_deviations_T table = '||l_variable_value);
5316          END IF;
5317          --Bug#5148503 If l_variable_value is null then check whether we can find variable_value
5318          --using 'USER$'||p_object_code instead of p_object_code
5319          --NOTE:In case of User Defined Variables,variable_code will be
5320          --in the form 'USER$variable_code' in OKC_XPRT_DEVIATIONS_T table.So we need to search on
5321          --'USER$'||p_object_code
5322          IF(l_variable_value is NUll) THEN
5323             OPEN  csr_variable_value('USER$'||p_object_code);
5324             FETCH csr_variable_value INTO l_variable_value;
5325             CLOSE csr_variable_value;
5326             IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5327    	        FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5328 		  '922: Varialbe Value for USER$'||p_object_code||'='||l_variable_value);
5329             END IF;
5330 		if(l_variable_value is not null) then
5331               l_user_defined_var := 'Y';
5332             end if;
5333          END IF;
5334          --Bug#4911316 for constants  no need to get translated value
5335          --In this case l_varialbe_value is same as translated value
5336          IF(p_object_value_type  = 'CONSTANT' ) THEN
5337            l_variable_translated_value := l_variable_value;
5338          ELSE  --If valueType is not CONSTANT then get transalted value
5339            if(l_user_defined_var = 'Y') then
5340              l_object_code := 'USER$'||p_object_code;
5341            else
5342              l_object_code := p_object_code;
5343            end if;
5344            OPEN  csr_translated_value(l_object_code, l_variable_value);
5345            FETCH csr_translated_value INTO l_variable_translated_value;
5346            CLOSE csr_translated_value;
5347          END IF;
5348          l_final_document_value := l_variable_translated_value;
5349       END IF; --IF(l_is_rule_line_level
5350       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5351 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
5352 		  G_MODULE||l_api_name,
5353 		  '920: Translated Document Value = '||l_variable_translated_value);
5354       END IF;
5355 
5356       --If translated variable value is not available in CZ table and variable value is available only
5357       --in OKC_XPRT_DEVIATIONS_T then need to fetch translated value using dyanmic sql query as below
5358       IF(l_variable_value is not null and l_variable_translated_value is null) THEN
5359 
5360 	 -- Build the dynamic SQL for the valueset
5361 	 OPEN csr_value_set_tab;
5362 	 FETCH csr_value_set_tab INTO l_table_name, l_name_col, l_id_col, l_additional_where_clause;
5363 	 CLOSE csr_value_set_tab;
5364 
5365 	 l_sql_stmt :=  'SELECT '||l_name_col||' , '||l_id_col||
5366 			' FROM  '||l_table_name||' '||
5367 			l_additional_where_clause ;
5368 
5369 	 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5370 		 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
5371 				G_MODULE||l_api_name,
5372 				'930: l_table_name  '||l_table_name);
5373 		 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
5374 				G_MODULE||l_api_name,
5375 				'930: l_name_col '||l_name_col);
5376 		 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
5377 				G_MODULE||l_api_name,
5378 				'930: l_id_col  '||l_id_col);
5379 		 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
5380 				G_MODULE||l_api_name,
5381 				'930: l_additional_where_clause '||l_additional_where_clause);
5382 		 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
5383 				G_MODULE||l_api_name,
5384 				'930: SQL STMT '||l_sql_stmt);
5385 	 END IF;
5386 
5387 
5388          IF(l_table_name is not null) THEN
5389 	 	OPEN c_cursor FOR l_sql_stmt;
5390 		LOOP
5391 		       FETCH c_cursor INTO tempName, tempId;
5392 		       EXIT WHEN c_cursor%NOTFOUND;
5393 		       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5394 		       FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
5395 				G_MODULE||l_api_name,
5396 				'931: tempName = '||tempName || ',tempId = '||tempId);
5397 		       END IF;
5398 		       if(tempId = l_variable_value) then
5399 			 l_final_document_value := tempName;
5400 			 exit;
5401 			 end if;
5402 		END LOOP;
5403 	 	CLOSE c_cursor;
5404         ELSE --Bug 5255911 added else block
5405            IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5406 		       FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
5407 				G_MODULE||l_api_name,
5408 				'932: l_table_name is null');
5409 	     END IF;
5410            --could not find translated value.So make final value as is as variable value
5411            l_final_document_value := l_variable_value;
5412 
5413 	  END IF; --IF(l_table_name
5414 
5415       END IF; --end IF(l_variable_value is not
5416     END IF; --IF(p_object_type = 'QUESTION'
5417 
5418     -- end debug log
5419   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5420      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
5421                     G_MODULE||l_api_name,
5422                     '940: final document Value = '||l_final_document_value);
5423      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
5424                     G_MODULE||l_api_name,
5425                     '940: Leaving '||G_PKG_NAME ||'.'||l_api_name);
5426   END IF;
5427 
5428 RETURN l_final_document_value;
5429 
5430 EXCEPTION
5431 WHEN OTHERS THEN
5432   IF csr_variable_value%ISOPEN THEN
5433 	     CLOSE csr_variable_value;
5434   END IF;
5435   IF csr_translated_value%ISOPEN THEN
5436 	     CLOSE csr_translated_value;
5437   END IF;
5438   IF csr_config_data%ISOPEN THEN
5439 	     CLOSE csr_config_data;
5440   END IF;
5441   IF csr_get_rule_qst_values%ISOPEN THEN
5442   	     CLOSE csr_get_rule_qst_values;
5443   END IF;
5444   IF csr_value_set_tab%ISOPEN THEN
5445   	     CLOSE csr_value_set_tab;
5446   END IF;
5447   IF csr_get_qst_datatype%ISOPEN THEN
5448   	     CLOSE csr_get_qst_datatype;
5449   END IF;
5450   IF csr_get_rule_qst_values%ISOPEN THEN
5451   	     CLOSE csr_get_rule_qst_values;
5452   END IF;
5453   IF c_cursor%ISOPEN THEN
5454   	     CLOSE c_cursor;
5455   END IF;
5456   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5457      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
5458                     G_MODULE||l_api_name,
5459                     '950: Leaving '||G_PKG_NAME ||'.'||l_api_name);
5460   END IF;
5461 RETURN NULL;
5462 END get_deviation_document_value;
5463 
5464 /*====================================================================+
5465   Function Name : get_value_display -Overloaded
5466   Description    : Returns the condition value display name.
5467                    Used to display condition value in condition values inner table
5468                    in rules update/view mode. This function has been overloaded to
5469                    handle value display for the condition values row
5470 +====================================================================*/
5471 
5472 FUNCTION get_value_display (
5473     p_rule_condition_id      IN NUMBER,
5474     p_object_value_code      IN VARCHAR2)
5475 RETURN VARCHAR2 IS
5476 
5477 CURSOR c1 IS
5478     SELECT RuleCond.Object_value_code,
5479            RuleCond.Object_value_type,
5480            fvs.flex_value_set_id OBJECT_VALUE_SET_ID,
5481            fvs.validation_type,
5482            fvs.longlist_flag
5483     FROM OKC_XPRT_RULE_CONDITIONS RuleCond,
5484     fnd_flex_value_sets fvs
5485     where rtrim(RuleCond.OBJECT_VALUE_SET_NAME) =  fvs.flex_value_set_name(+)
5486     and rule_condition_id=p_rule_condition_id;
5487 
5488 l_value  VARCHAR2(1000) := null;
5489 c1rec c1%rowtype;
5490 BEGIN
5491 --get the requitred values from the condition
5492     OPEN c1;
5493     FETCH c1  INTO c1rec;
5494     CLOSE c1;
5495 
5496 -- now call the 2nd get_value_display
5497 --we are setting the mode to CONDVAL so poplist values are also handled
5498 
5499     l_value := get_value_display(c1rec.Object_value_type  ,
5500                                 p_object_value_code  ,
5501                                 c1rec.object_value_set_id,
5502                                 c1rec.validation_type ,
5503                                 c1rec.longlist_flag,
5504                                 'CONDVAL' );
5505 
5506  RETURN l_value;
5507 EXCEPTION
5508 WHEN OTHERS THEN
5509  IF c1%ISOPEN THEN
5510    CLOSE c1;
5511  END IF;
5512  RETURN NULL;
5513 END get_value_display;
5514 
5515 
5516 /*====================================================================+
5517   Function Name : get_value_desc
5518   Description    : Returns the condition value description
5519                    Used to display condition value description in inner table
5520                    for rules update/view pages
5521 +====================================================================*/
5522 FUNCTION get_value_desc (
5523     p_rule_condition_id      IN NUMBER,
5524     p_object_value_code      IN VARCHAR2)
5525 RETURN VARCHAR2 IS
5526 
5527 CURSOR c1 IS
5528     SELECT RuleCond.Object_value_code,
5529            RuleCond.Object_value_type,
5530            fvs.flex_value_set_id OBJECT_VALUE_SET_ID,
5531            fvs.validation_type,
5532            fvs.longlist_flag
5533     FROM OKC_XPRT_RULE_CONDITIONS RuleCond,
5534     fnd_flex_value_sets fvs
5535     where RuleCond.OBJECT_VALUE_SET_NAME =  fvs.flex_value_set_name(+)
5536     and rule_condition_id=p_rule_condition_id;
5537 
5538 l_value  VARCHAR2(1000) := null;
5539 c1rec c1%rowtype;
5540 BEGIN
5541 --get the requitred values from the condition
5542     OPEN c1;
5543     FETCH c1  INTO c1rec;
5544     CLOSE c1;
5545 
5546 -- now call the 2nd get_value_display
5547 
5548     l_value := get_value_desc(c1rec.Object_value_type  ,
5549                                 p_object_value_code  ,
5550                                 c1rec.object_value_set_id,
5551                                 c1rec.validation_type ,
5552                                 c1rec.longlist_flag);
5553 
5554  RETURN l_value;
5555 EXCEPTION
5556  WHEN OTHERS THEN
5557   IF c1%ISOPEN THEN
5558    CLOSE c1;
5559   END IF;
5560   RETURN NULL;
5561 END get_value_desc;
5562 
5563 /*====================================================================+
5564   Function Name : get_value_desc
5565   Description    : Returns the condition value description
5566                    Called from previous get_value_desc
5567 +====================================================================*/
5568 
5569 FUNCTION get_value_desc (
5570     p_object_value_type      IN VARCHAR2,
5571     p_object_value_code      IN VARCHAR2,
5572     p_object_value_set_id    IN NUMBER,
5573     p_validation_type        IN VARCHAR2,
5574     p_longlist_flag          IN VARCHAR2)
5575 
5576 RETURN VARCHAR2 IS
5577 --Start:Perf Bug#5032199 sql Id 16474199.Commented below cursor and added new cursor
5578 /*CURSOR c1 IS
5579     SELECT article_description
5580     FROM okc_articles_v art
5581     WHERE article_id=to_number(p_object_value_code)
5582     AND article_version_number=
5583            (select  max(article_version_number)
5584             from  okc_article_versions
5585             where article_id= Art.article_id);*/
5586 CURSOR c1 IS
5587     SELECT article_description
5588     FROM okc_article_versions  art
5589     WHERE article_id=to_number(p_object_value_code)
5590     AND article_version_number=
5591            (select  max(article_version_number)
5592             from  okc_article_versions
5593             where article_id= to_number(p_object_value_code));
5594 --End:Perf Bug#5032199
5595 
5596 CURSOR C2 IS
5597     SELECT description
5598     FROM okc_xprt_questions_vl
5599     WHERE question_id=TO_NUMBER(p_object_value_code)
5600     AND question_type= decode(p_object_value_type,'CONSTANT','C','Q');
5601 
5602  CURSOR c3 IS
5603     SELECT description
5604     FROM okc_bus_variables_v
5605     WHERE variable_code=p_object_value_code;
5606 
5607 
5608 l_value  VARCHAR2(1000) := null;
5609 
5610 BEGIN
5611 -- If object_type is clause, then get clause name
5612  If p_object_value_type = 'CLAUSE' THEN
5613     OPEN c1;
5614     FETCH c1  INTO l_value;
5615     CLOSE c1;
5616 
5617 -- If object type is constant or question
5618  Elsif (p_object_value_type = 'CONSTANT' OR p_object_value_type ='QUESTION') THEN
5619     OPEN c2;
5620     FETCH c2  INTO l_value;
5621     CLOSE c2;
5622 
5623 -- If opbject type is an expert variable
5624  Elsif (p_object_value_type = 'VARIABLE')  THEN
5625     OPEN c3;
5626     FETCH c3  INTO l_value;
5627     CLOSE c3;
5628 
5629  ELSIF (p_object_value_type='VALUE') and (p_object_value_set_id is not null) THEN
5630     l_value := get_valueset_value_desc ( p_object_value_set_id, p_object_value_code,    p_validation_type );
5631  END IF;
5632 
5633  RETURN l_value;
5634 EXCEPTION
5635  WHEN OTHERS THEN
5636       --close cursors
5637      IF c1%ISOPEN THEN
5638        CLOSE c1;
5639      END IF;
5640 
5641      IF c2%ISOPEN THEN
5642        CLOSE c2;
5643      END IF;
5644 
5645      IF c3%ISOPEN THEN
5646        CLOSE c3;
5647      END IF;
5648      RETURN  NULL;
5649 END get_value_desc;
5650 
5651 /*====================================================================+
5652   Function Name : get_valueset_value
5653   Description    : Returns the value set value  based on passed in parameters
5654                    Called from get_value_display
5655 +====================================================================*/
5656 
5657 FUNCTION get_valueset_value (
5658     p_object_value_set_id    IN NUMBER,
5659     p_object_value_code      IN VARCHAR2,
5660     p_validation_type        IN VARCHAR2)
5661 
5662 RETURN VARCHAR2 IS
5663 CURSOR c1 IS
5664     select value.flex_value
5665     --,value.description
5666     from fnd_flex_values_vl value
5667 where value.FLEX_VALUE_SET_ID =  p_object_value_set_id
5668 and enabled_flag='Y'
5669 and trunc(sysdate) between nvl(trunc(start_date_active),trunc(sysdate)) and nvl(trunc(end_date_active),trunc(sysdate))
5670 and value.flex_value_id = to_number(p_object_value_code);
5671 
5672 CURSOR c2 IS
5673 
5674 select
5675 val_tab.application_table_name,
5676 val_tab.value_column_name,
5677 val_tab.id_column_name,
5678 val_tab.additional_where_clause,
5679 val_tab.meaning_column_name
5680 from fnd_flex_validation_tables val_tab
5681 where val_tab.FLEX_VALUE_SET_ID =  p_object_value_set_id ;
5682 
5683 l_value VARCHAR2(1000) := null;
5684 
5685 c2rec c2%rowtype;
5686 l_select_stmt VARCHAR2(2000);
5687 
5688  value_cursor_id INTEGER;
5689  ret_val INTEGER;
5690 BEGIN
5691 
5692  --if value set type is independent or independent translatable
5693  --Added independent translatable validation for Policy Deviations
5694 
5695  IF (p_validation_type = 'I' OR p_validation_type = 'X' ) THEN
5696 
5697     OPEN c1;
5698     FETCH c1  INTO l_value;
5699     CLOSE c1;
5700  ELSIF (p_validation_type = 'F')THEN
5701 
5702  --set the sql statement for valueset
5703     OPEN c2;
5704     FETCH c2  INTO c2rec;
5705     CLOSE c2;
5706 
5707     IF c2rec.id_column_name IS NULL THEN
5708       RETURN null;
5709     END IF;
5710 
5711     l_select_stmt := ' SELECT ' || NVL(c2rec.id_column_name,null) ||' as  Flex_value_id,'||
5712                      NVL(c2rec.value_column_name,'null') ||' as  Flex_value,'||
5713                      NVL(c2rec.meaning_column_name,'null') ||' as  Flex_meaning FROM '||
5714                      c2rec.application_table_name ;
5715 
5716 
5717     If c2rec.additional_where_clause is not null THEN
5718  -- If no WHERE keyword, add it
5719       IF (UPPER(substr(ltrim(c2rec.additional_where_clause),1,5)) <> 'WHERE') AND
5720          (UPPER(substr(ltrim(c2rec.additional_where_clause),1,8)) <> 'ORDER BY') THEN
5721 
5722         l_select_stmt := l_select_stmt||' WHERE';
5723       END IF;
5724 -- add where clause
5725       l_select_stmt :=l_select_stmt||' '|| c2rec.additional_where_clause;
5726    END IF;
5727 --doing this becuase order by may exist in where clause
5728       l_select_stmt := 'SELECT FLEX_VALUE FROM ('||l_select_stmt||') WHERE FLEX_VALUE_ID = :1';
5729 
5730 
5731     value_cursor_id := DBMS_SQL.OPEN_CURSOR;
5732    --parse the query
5733     DBMS_SQL.PARSE(value_cursor_id,l_select_stmt,DBMS_SQL.NATIVE);
5734     --Bind the input variable
5735     DBMS_SQL.BIND_VARIABLE(value_cursor_id,':1',p_object_value_code);
5736 
5737     --define select lis
5738     DBMS_SQL.DEFINE_COLUMN(value_cursor_id,1, l_value,1000);
5739     --execute the query
5740     ret_val := DBMS_SQL.EXECUTE(value_cursor_id);
5741     IF DBMS_SQL.FETCH_ROWS(value_cursor_id) <> 0 THEN
5742       DBMS_SQL.COLUMN_VALUE(value_cursor_id,1, l_value);
5743     END IF;
5744 
5745     DBMS_SQL.CLOSE_CURSOR(value_cursor_id);
5746   END IF;
5747 return l_value;
5748 EXCEPTION
5749 WHEN OTHERS THEN
5750   --close cursors
5751  IF c1%ISOPEN THEN
5752    CLOSE c1;
5753  END IF;
5754 
5755  IF c2%ISOPEN THEN
5756    CLOSE c2;
5757  END IF;
5758 
5759  RETURN NULL;
5760 END get_valueset_value;
5761 
5762 /*====================================================================+
5763   Function Name : get_valueset_value_desc
5764   Description    : Returns the value set value description based on passed in parameters
5765                    Called from get_value_desc
5766 +====================================================================*/
5767 
5768 FUNCTION get_valueset_value_desc (
5769     p_object_value_set_id    IN NUMBER,
5770     p_object_value_code      IN VARCHAR2,
5771     p_validation_type        IN VARCHAR2)
5772 
5773 RETURN VARCHAR2 IS
5774 CURSOR c1 IS
5775     select value.description
5776     from fnd_flex_values_vl value
5777 where value.FLEX_VALUE_SET_ID =  p_object_value_set_id
5778 and enabled_flag='Y'
5779 and trunc(sysdate) between nvl(trunc(start_date_active),trunc(sysdate)) and nvl(trunc(end_date_active),trunc(sysdate))
5780 and value.flex_value_id = to_number(p_object_value_code);
5781 
5782 CURSOR c2 IS
5783 
5784 select
5785 val_tab.application_table_name,
5786 val_tab.value_column_name,
5787 val_tab.id_column_name,
5788 val_tab.additional_where_clause,
5789 val_tab.meaning_column_name
5790 from fnd_flex_validation_tables val_tab
5791 where val_tab.FLEX_VALUE_SET_ID =  p_object_value_set_id ;
5792 
5793 l_value VARCHAR2(1000) := null;
5794 
5795 c2rec c2%rowtype;
5796 l_select_stmt VARCHAR2(2000);
5797 
5798  value_cursor_id INTEGER;
5799  ret_val INTEGER;
5800 BEGIN
5801 
5802  --if value set type is independent
5803 
5804  IF (p_validation_type = 'I') THEN
5805 
5806     OPEN c1;
5807     FETCH c1  INTO l_value;
5808     CLOSE c1;
5809  ELSIF (p_validation_type = 'F')THEN
5810 
5811  --set the sql statement for valueset
5812     OPEN c2;
5813     FETCH c2  INTO c2rec;
5814     CLOSE c2;
5815 
5816     IF c2rec.id_column_name IS NULL THEN
5817       RETURN null;
5818     END IF;
5819      l_select_stmt := ' SELECT ' || NVL(c2rec.id_column_name,null) ||' as  Flex_value_id,'||
5820                      NVL(c2rec.value_column_name,'null') ||' as  Flex_value,'||
5821                      NVL(c2rec.meaning_column_name,'null') ||' as  Flex_meaning FROM '||
5822                      c2rec.application_table_name ;
5823 
5824 
5825     If c2rec.additional_where_clause is not null THEN
5826 -- add where clause
5827    -- If no WHERE keyword, add it
5828       IF (UPPER(substr(ltrim(c2rec.additional_where_clause),1,5)) <> 'WHERE') AND
5829          (UPPER(substr(ltrim(c2rec.additional_where_clause),1,8)) <> 'ORDER BY') THEN
5830 
5831         l_select_stmt := l_select_stmt||' WHERE';
5832       END IF;
5833 
5834       l_select_stmt :=l_select_stmt||' '|| c2rec.additional_where_clause;
5835     END IF;
5836 --doing this becuase order by may exist in where clause
5837       l_select_stmt := 'SELECT FLEX_MEANING FROM ('||l_select_stmt||') WHERE FLEX_VALUE_ID = :1';
5838 
5839     value_cursor_id := DBMS_SQL.OPEN_CURSOR;
5840    --parse the query
5841     DBMS_SQL.PARSE(value_cursor_id,l_select_stmt,DBMS_SQL.NATIVE);
5842     --Bind the input variable
5843     DBMS_SQL.BIND_VARIABLE(value_cursor_id,':1',p_object_value_code);
5844 
5845     --define select lis
5846     DBMS_SQL.DEFINE_COLUMN(value_cursor_id,1, l_value,1000);
5847     --execute the query
5848     ret_val := DBMS_SQL.EXECUTE(value_cursor_id);
5849     IF DBMS_SQL.FETCH_ROWS(value_cursor_id) <> 0 THEN
5850       DBMS_SQL.COLUMN_VALUE(value_cursor_id,1, l_value);
5851     END IF;
5852 
5853     DBMS_SQL.CLOSE_CURSOR(value_cursor_id);
5854   END IF;
5855 return l_value;
5856 
5857 EXCEPTION
5858 WHEN OTHERS THEN
5859   --close cursors
5860  IF c1%ISOPEN THEN
5861    CLOSE c1;
5862  END IF;
5863 
5864  IF c2%ISOPEN THEN
5865    CLOSE c2;
5866  END IF;
5867 
5868  RETURN NULL;
5869 END get_valueset_value_desc;
5870 -----------END: FUNCTIONS USED IN RULES PAGES-------------------------------------------------------------------
5871 
5872 /*
5873   This api will be called if the rule to be published has no expert enabled templates
5874   to be attached
5875 */
5876 PROCEDURE publish_rule_with_no_tmpl
5877 (
5878  p_calling_mode    IN   VARCHAR2,
5879  x_return_status   OUT  NOCOPY VARCHAR2,
5880  x_msg_data        OUT   NOCOPY VARCHAR2,
5881  x_msg_count       OUT   NOCOPY NUMBER
5882 ) IS
5883 
5884 l_api_name                CONSTANT VARCHAR2(30) := 'publish_rule_with_no_tmpl';
5885 
5886 
5887 BEGIN
5888   -- start debug log
5889   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5890      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
5891                     G_MODULE||l_api_name,
5892                     '100: Entered '||G_PKG_NAME ||'.'||l_api_name);
5893   END IF;
5894 
5895   x_return_status :=  G_RET_STS_SUCCESS;
5896 
5897   -- Update Rule status
5898   UPDATE okc_xprt_rule_hdrs_all
5899      SET status_code = DECODE (p_calling_mode, 'PUBLISH', 'ACTIVE', 'DISABLE', 'INACTIVE', 'SYNC', 'ACTIVE'),
5900 	    published_flag = 'Y',
5901          last_updated_by = FND_GLOBAL.USER_ID,
5902          last_update_date = SYSDATE,
5903          last_update_login = FND_GLOBAL.LOGIN_ID
5904    WHERE request_id = FND_GLOBAL.CONC_REQUEST_ID;
5905 
5906 
5907   -- commit work
5908    commit work;
5909 
5910   -- end debug log
5911   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5912      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
5913                     G_MODULE||l_api_name,
5914                     '1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
5915   END IF;
5916 
5917 EXCEPTION
5918   WHEN FND_API.G_EXC_ERROR THEN
5919       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5920          FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
5921                         G_MODULE||l_api_name,
5922                         '2000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
5923       END IF;
5924 
5925       x_return_status := G_RET_STS_ERROR ;
5926       x_msg_data := SQLERRM;
5927       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
5928 
5929   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5930       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5931          FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
5932                         G_MODULE||l_api_name,
5933                         '3000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
5934       END IF;
5935 
5936       x_return_status := G_RET_STS_UNEXP_ERROR ;
5937       x_msg_data := SQLERRM;
5938       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
5939 
5940   WHEN OTHERS THEN
5941       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5942          FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
5943                         G_MODULE||l_api_name,
5944                         '4000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
5945       END IF;
5946 
5947    IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
5948      FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
5949    END IF;
5950    x_return_status := G_RET_STS_UNEXP_ERROR ;
5951    x_msg_data := SQLERRM;
5952    FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
5953 
5954 END publish_rule_with_no_tmpl;
5955 
5956 ------------------------------------------------------------------------------
5957 
5958 /*
5959   This will be called from publish and approval concurrent program.
5960   This procedure will do the QA for rules before importing to CZ and if there are
5961   any errors will put the error details in concurrent request out and log files
5962   p_qa_mode = PUBLISH or APPROVAL
5963   p_template_id = will be passed only in case of APPROVAL
5964 */
5965 PROCEDURE check_rules_validity
5966 (
5967  p_qa_mode		IN VARCHAR2,
5968  p_template_id      IN NUMBER,
5969  x_sequence_id      OUT NOCOPY NUMBER,
5970  x_qa_status        OUT NOCOPY VARCHAR2,
5971  x_return_status    OUT NOCOPY VARCHAR2,
5972  x_msg_data	     OUT	NOCOPY VARCHAR2,
5973  x_msg_count	     OUT	NOCOPY NUMBER
5974 ) IS
5975 
5976 -- Rules under Publication
5977 CURSOR csr_publish_rules IS
5978 SELECT rule_id
5979   FROM okc_xprt_rule_hdrs_all
5980  WHERE request_id = FND_GLOBAL.CONC_REQUEST_ID ;
5981 
5982 -- Rules attached to template
5983 CURSOR csr_approval_rules IS
5984 -- Local Rules on Template
5985 SELECT r.rule_id
5986   FROM okc_xprt_template_rules r,
5987        okc_xprt_rule_hdrs_all h
5988  WHERE r.rule_id = h.rule_id
5989    AND h.status_code = 'ACTIVE'
5990    AND r.template_id = p_template_id
5991 UNION ALL
5992 SELECT h.rule_id
5993   FROM okc_terms_templates_all t,
5994        okc_xprt_rule_hdrs_all h
5995  WHERE t.org_id = h.org_id
5996    AND t.intent = h.intent
5997    AND h.status_code = 'ACTIVE'
5998    AND NVL(h.org_wide_flag,'N') = 'Y'
5999    AND t.template_id = p_template_id;
6000 
6001 -- Rules with errors
6002 CURSOR csr_qa_errors(p_sequence_id IN NUMBER) IS
6003 SELECT title,
6004        problem_short_desc,
6005 	  problem_details,
6006 	  suggestion
6007   FROM okc_qa_errors_t
6008  WHERE sequence_id = p_sequence_id
6009    AND error_severity = 'E';
6010 
6011 l_ruleid_tbl              OKC_XPRT_QA_PVT.RuleIdList;
6012 l_api_name                CONSTANT VARCHAR2(30) := 'check_rules_validity';
6013 i                         BINARY_INTEGER;
6014 
6015 BEGIN
6016 
6017   -- start debug log
6018   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6019      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6020                     G_MODULE||l_api_name,
6021                     '100: Entered '||G_PKG_NAME ||'.'||l_api_name);
6022      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6023                     G_MODULE||l_api_name,
6024                     'Parameter : '||p_qa_mode);
6025   END IF;
6026 
6027   x_return_status :=  G_RET_STS_SUCCESS;
6028 
6029   -- initialize i
6030     i := 0;
6031 
6032   IF p_qa_mode = 'PUBLISH' THEN
6033      FOR rec_publish_rules IN csr_publish_rules
6034 	LOOP
6035 	  i := i + 1;
6036 	  l_ruleid_tbl(i) := rec_publish_rules.rule_id;
6037 	END LOOP;
6038   ELSE
6039    -- p_qa_mode is APPROVAL
6040      FOR rec_approval_rules IN csr_approval_rules
6041 	LOOP
6042 	  i := i + 1;
6043        l_ruleid_tbl(i) := rec_approval_rules.rule_id;
6044 	END LOOP;
6045   END IF;
6046 
6047         fnd_file.put_line(FND_FILE.LOG,'  ');
6048         fnd_file.put_line(FND_FILE.LOG,'Calling OKC_XPRT_QA_PVT.qa_rules ');
6049 
6050   -- Call the QA API
6051        OKC_XPRT_QA_PVT.qa_rules
6052        (
6053         p_qa_mode		   => p_qa_mode,
6054         p_ruleid_tbl        => l_ruleid_tbl,
6055         x_sequence_id	   => x_sequence_id,
6056         x_qa_status	        => x_qa_status,
6057         x_return_status     => x_return_status,
6058         x_msg_count         => x_msg_count,
6059         x_msg_data          => x_msg_data
6060        );
6061 
6062         fnd_file.put_line(FND_FILE.LOG,'  ');
6063         fnd_file.put_line(FND_FILE.LOG,'After OKC_XPRT_QA_PVT.qa_rules ');
6064         fnd_file.put_line(FND_FILE.LOG,'x_return_status: '||x_return_status);
6065         fnd_file.put_line(FND_FILE.LOG,'x_qa_status: '||x_qa_status);
6066         fnd_file.put_line(FND_FILE.LOG,'x_sequence_id: '||x_sequence_id);
6067         fnd_file.put_line(FND_FILE.LOG,'  ');
6068 
6069         --- If any errors happen abort API
6070          IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
6071            RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6072          ELSIF (x_return_status = G_RET_STS_ERROR) THEN
6073            RAISE FND_API.G_EXC_ERROR;
6074          END IF;
6075 
6076 	    -- If QA had one or more errors, log the errors
6077 	    IF x_qa_status <> 'S' THEN
6078 	       fnd_file.put_line(FND_FILE.LOG,'  ');
6079 	       fnd_file.put_line(FND_FILE.LOG,'Following Rules did not pass QA  ');
6080 	       fnd_file.put_line(FND_FILE.LOG,'  ');
6081 		  FOR rec_qa_errors IN csr_qa_errors(p_sequence_id => x_sequence_id)
6082 		    LOOP
6083 	           fnd_file.put_line(FND_FILE.LOG,'Rule Name   : '||rec_qa_errors.title);
6084 	           fnd_file.put_line(FND_FILE.LOG,'QA Check    : '||rec_qa_errors.problem_short_desc);
6085 	           fnd_file.put_line(FND_FILE.LOG,'Problem     : '||rec_qa_errors.problem_details);
6086 	           fnd_file.put_line(FND_FILE.LOG,'Suggestion  : '||rec_qa_errors.suggestion);
6087 	           fnd_file.put_line(FND_FILE.LOG,'  ');
6088 		    END LOOP;
6089 
6090 	    END IF; -- qa had errors
6091 
6092 
6093   -- end debug log
6094   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6095      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6096                     G_MODULE||l_api_name,
6097                     '1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
6098   END IF;
6099 
6100 EXCEPTION
6101   WHEN FND_API.G_EXC_ERROR THEN
6102       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6103          FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6104                         G_MODULE||l_api_name,
6105                         '2000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
6106       END IF;
6107 
6108       x_return_status := G_RET_STS_ERROR ;
6109       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
6110 
6111   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6112       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6113          FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6114                         G_MODULE||l_api_name,
6115                         '3000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
6116       END IF;
6117 
6118       x_return_status := G_RET_STS_UNEXP_ERROR ;
6119       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
6120 
6121   WHEN OTHERS THEN
6122       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6123          FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6124                         G_MODULE||l_api_name,
6125                         '4000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
6126       END IF;
6127 
6128    IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
6129      FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
6130    END IF;
6131    x_return_status := G_RET_STS_UNEXP_ERROR ;
6132    FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
6133 
6134 END check_rules_validity;
6135 -----FUNCTION USED IN RULES PAGES-(2)------------------------------------------------------------------------
6136 
6137 /*====================================================================+
6138   Function Name : is_valid
6139   Description    :
6140                    Called from is_value_valid
6141                    Returns 'N' if a clause is on hold/expired, or question is diabled
6142   Parameters     : p_object_type  : Object type
6143                    p_object_id :  question id/clause id
6144 +====================================================================*/
6145 FUNCTION is_valid (
6146     p_object_id      IN NUMBER,
6147     p_object_type    IN VARCHAR2)
6148  RETURN VARCHAR2 IS
6149 
6150  Cursor c1 is
6151  SELECT decode(article_status,'ON_HOLD','N','EXPIRED','N','Y') valid_yn
6152  FROM okc_article_versions Art
6153  WHERE article_id= p_object_id
6154  AND article_version_number=
6155            (select  max(article_version_number)
6156             from  okc_article_versions
6157             where article_id= Art.article_id);
6158 
6159 
6160  Cursor c2 is
6161  SELECT decode(disabled_flag,'Y','N','Y') disabled_yn
6162  FROM okc_xprt_questions_b
6163  WHERE question_id= p_object_id;
6164 
6165  l_ret_value VARCHAR2(1) := 'Y';
6166 
6167 
6168  BEGIN
6169 
6170  IF (p_object_type = 'CLAUSE') THEN
6171 
6172     OPEN c1;
6173     FETCH c1  INTO l_ret_value;
6174     CLOSE c1;
6175 
6176  ELSIF p_object_type = ('QUESTION') THEN
6177 
6178     OPEN c2;
6179     FETCH c2  INTO l_ret_value;
6180     CLOSE c2;
6181  END IF;
6182 
6183  return l_ret_value;
6184 EXCEPTION
6185  WHEN OTHERS THEN
6186   IF c1%ISOPEN THEN
6187     CLOSE c1;
6188   END IF;
6189 
6190   IF c2%ISOPEN THEN
6191     CLOSE c2;
6192   END IF;
6193 
6194   RETURN 'N';
6195  END is_valid;
6196 
6197 
6198 /*====================================================================+
6199   Bug 4723548 Created this function
6200   Function Name :is_value_set_changed
6201   Description   :Called during validation of conditions on Rules Page
6202 
6203   Parameters    : p_object_code  : Variable Code
6204                 : p_object_value_set_id :  Value Set Id associated with the variable
6205 +====================================================================*/
6206 FUNCTION is_value_set_changed (
6207     p_object_code          IN VARCHAR2,
6208     p_object_value_set_id  IN NUMBER)
6209 RETURN VARCHAR2 IS
6210 
6211 Cursor c1 is
6212 SELECT value_set_id
6213 FROM OKC_BUS_VARIABLES_V
6214 WHERE variable_code = p_object_code
6215 AND  variable_type = 'U';
6216 
6217 l_value_set_id NUMBER ;
6218 l_ret_value VARCHAR2(1) := 'N';
6219 l_api_name   CONSTANT VARCHAR2(30) := 'is_value_set_changed';
6220 BEGIN
6221   -- start debug log
6222     IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6223      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6224                     G_MODULE||l_api_name,
6225                     '900: Entered '||G_PKG_NAME ||'.'||l_api_name);
6226      Fnd_Log.STRING(Fnd_Log.Level_Procedure,
6227                    g_Module || l_Api_Name,
6228                     '910: Parameters passed: -----------------------');
6229      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6230                     G_MODULE||l_api_name,
6231                     '910:p_object_code = '||p_object_code);
6232     Fnd_Log.STRING(Fnd_Log.Level_Procedure,
6233                    g_Module || l_Api_Name,
6234                    '910:p_object_value_set_id = '||p_object_value_set_id);
6235     END IF;
6236   --end log
6237   OPEN c1;
6238       FETCH c1  INTO l_value_set_id;
6239       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6240         FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6241                     G_MODULE||l_api_name,
6242                     '920: l_value_set_id '||l_value_set_id);
6243        END IF;
6244       IF l_value_set_id <> p_object_value_set_id THEN
6245              l_ret_value := 'Y';
6246       END IF;
6247   CLOSE c1;
6248   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6249      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6250                     G_MODULE||l_api_name,
6251                     '930: Leaving '||G_PKG_NAME ||'.'||l_api_name);
6252   END IF;
6253 RETURN l_ret_value;
6254 
6255 EXCEPTION
6256  WHEN OTHERS THEN
6257    IF c1%ISOPEN THEN
6258      CLOSE c1;
6259    END IF;
6260   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6261      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6262                     G_MODULE||l_api_name,
6263                     '940: Leaving '||G_PKG_NAME ||'.'||l_api_name);
6264   END IF;
6265  RETURN 'N';
6266 END is_value_set_changed;
6267 
6268 /*====================================================================+
6269   Function Name : is_value_valid
6270   Description    : wrapper funtion for is_valid above.
6271                    Used in ruleconditionVO, and conditionvaluesVO to determine if clause/question is valid
6272                    Used in Rules Update/duplicate flow
6273   Parameters     : p_rule_condition_id : Condition Id
6274                    p_object_code :  condition object_code
6275 +====================================================================*/
6276 
6277 
6278 FUNCTION  is_value_valid (
6279     p_object_code          IN VARCHAR2,
6280     p_rule_condition_id    IN NUMBER)
6281 RETURN VARCHAR2 IS
6282 
6283 CURSOR c1 IS
6284     SELECT RuleCond.Object_value_type
6285     FROM OKC_XPRT_RULE_CONDITIONS RuleCond
6286     where rule_condition_id=p_rule_condition_id;
6287 
6288 l_value  VARCHAR2(1) := null;
6289 l_value_type VARCHAR2(30) ;
6290 c1rec c1%rowtype;
6291 BEGIN
6292 --get the requitred values from the condition
6293     OPEN c1;
6294     FETCH c1  INTO l_value_type;
6295     CLOSE c1;
6296 
6297 -- now call the is_valid
6298 
6299  IF (l_value_type in ('CLAUSE','QUESTION')) THEN
6300 
6301      l_value := is_valid( p_object_code, l_value_type);
6302  ELSE
6303  --for value set values, we have a seperate validation process, so just return 'Y'
6304      l_value := 'Y';
6305  END IF;
6306 
6307  RETURN l_value;
6308 EXCEPTION
6309  WHEN OTHERS THEN
6310   IF c1%ISOPEN THEN
6311     CLOSE c1;
6312   END IF;
6313   RETURN 'N';
6314 END is_value_valid;
6315 
6316 /*====================================================================+
6317   Function Name : get_message
6318   Description    : Utility method to return the translated message
6319                    API assumes the message has no tokens
6320 +====================================================================*/
6321 
6322 FUNCTION get_message(p_appl_name    IN VARCHAR2,
6323                      p_msg_name     IN VARCHAR2)
6324 RETURN VARCHAR2 IS
6325 
6326 BEGIN
6327 Fnd_Message.Set_Name( p_appl_name, p_msg_name );
6328 return fnd_message.get;
6329 
6330 END get_message;
6331 
6332 ----------END OF FUNCTIONS USED IN RULES PAGES 2------------------------------------
6333 
6334 PROCEDURE get_publication_id
6335 (
6336  p_api_version                  IN NUMBER,
6337  p_init_msg_list                IN VARCHAR2,
6338  p_template_id                  IN NUMBER,
6339  x_publication_id               OUT NOCOPY NUMBER,
6340  x_return_status                OUT NOCOPY VARCHAR2,
6341  x_msg_count                    OUT NOCOPY NUMBER,
6342  x_msg_data                     OUT NOCOPY VARCHAR2
6343 ) IS
6344 
6345 l_api_name CONSTANT VARCHAR2(30) := 'get_publication_id';
6346 l_api_version CONSTANT NUMBER := 1;
6347 l_product_key  VARCHAR2(255);
6348 l_usage_name               cz_model_usages.name%TYPE;
6349 
6350 CURSOR csr_model_usage_name IS
6351 SELECT name
6352   FROM cz_model_usages
6353  WHERE model_usage_id = -1 ; -- seeded for Any Usage
6354 
6355 CURSOR csr_template_key IS
6356 SELECT 'OKC:TEMPLATEMODEL:'||org_id||':'||intent||':'||template_id
6357 FROM okc_terms_templates_all
6358 WHERE template_id = p_template_id;
6359 
6360 
6361 BEGIN
6362 
6363   -- start debug log
6364   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6365      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6366                     G_MODULE||l_api_name,
6367                     '100: Entered '||G_PKG_NAME ||'.'||l_api_name);
6368   END IF;
6369 
6370     --
6371     -- Standard call to check for call compatibility.
6372     --
6373     IF NOT FND_API.Compatible_API_Call (l_api_version,
6374        	       	    	    	 	     p_api_version,
6375         	    	    	    	               l_api_name,
6376     		    	    	    	               G_PKG_NAME)
6377     THEN
6378     	RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6379     END IF;
6380 
6381     --
6382     -- Initialize message list if p_init_msg_list is set to TRUE.
6383     --
6384     IF FND_API.to_Boolean( p_init_msg_list ) THEN
6385     	FND_MSG_PUB.initialize;
6386     END IF;
6387 
6388     --
6389     --  Initialize API return status to success
6390     --
6391     x_return_status := FND_API.G_RET_STS_SUCCESS;
6392 
6393     -- get usage name for Any Usage
6394     --  Defaults to CZ: Publication Usage profile
6395      OPEN csr_model_usage_name;
6396 	  FETCH csr_model_usage_name INTO l_usage_name;
6397 	CLOSE csr_model_usage_name;
6398 
6399     -- generate the template product key
6400      OPEN csr_template_key;
6401 	 FETCH csr_template_key INTO l_product_key;
6402 	CLOSE csr_template_key;
6403 
6404     OKC_XPRT_CZ_INT_PVT.publication_for_product
6405      (
6406       p_api_version                  => p_api_version,
6407       p_init_msg_lst                 => p_init_msg_list,
6408       p_product_key                  => l_product_key,
6409       p_usage_name                   => l_usage_name,
6410       p_publication_mode             => 'P', -- Production
6411       p_effective_date               => SYSDATE,
6412       x_publication_id               => x_publication_id,
6413       x_return_status                => x_return_status,
6414       x_msg_count                    => x_msg_count,
6415       x_msg_data                     => x_msg_data
6416      ) ;
6417 
6418 
6419 -- Standard call to get message count and if count is 1, get message info.
6420 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
6421 
6422 
6423   -- end debug log
6424   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6425      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6426                     G_MODULE||l_api_name,
6427                     '1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
6428   END IF;
6429 
6430 
6431 EXCEPTION
6432 WHEN OTHERS THEN
6433       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6434          FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6435                         G_MODULE||l_api_name,
6436                         '4000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
6437       END IF;
6438       x_return_status := G_RET_STS_UNEXP_ERROR ;
6439 
6440       IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
6441              FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
6442       END IF;
6443 
6444       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
6445 
6446 END get_publication_id;
6447 
6448 
6449 
6450 ------------------------------------------------------------------------------
6451 /*
6452    Function : ok_to_delete_clause
6453    This function will return 'Y' for a article id if it is not used in
6454 rule condition or outcome.
6455    If used, it returns 'N'.
6456 
6457 */
6458 FUNCTION ok_to_delete_clause
6459 (
6460  p_article_id         IN NUMBER
6461 ) RETURN VARCHAR2 IS
6462 
6463 CURSOR csr_clause_exists IS
6464 -- All Clauses from Conditions
6465 SELECT 'N'
6466   FROM okc_xprt_rule_cond_vals v,
6467        okc_xprt_rule_conditions c
6468  WHERE v.rule_condition_id = c.rule_condition_id
6469    AND c.object_type = 'CLAUSE'
6470    AND v.object_value_code = to_char(p_article_id) -- Added to_char function. Fix for Bug 4063007
6471 UNION ALL
6472 -- All Clauses from Outcome
6473 SELECT 'N'
6474   FROM okc_xprt_rule_outcomes o
6475  WHERE  o.object_type = 'CLAUSE'
6476    AND o.object_value_id = p_article_id ; -- Removed to_char which is not needed here
6477 
6478 l_delete_flag     VARCHAR2(1);
6479 
6480 BEGIN
6481 
6482   OPEN csr_clause_exists;
6483     FETCH csr_clause_exists INTO l_delete_flag;
6484       IF csr_clause_exists%NOTFOUND THEN
6485 	   -- Clause is not used in Rules
6486 	   l_delete_flag := 'Y' ;
6487 	 END IF;
6488   CLOSE csr_clause_exists;
6489 
6490   RETURN l_delete_flag;
6491 
6492 END ok_to_delete_clause;
6493 
6494 ------------------------------------------------------------------------------
6495 PROCEDURE get_qa_code_detail
6496 (
6497  p_document_type      IN   VARCHAR2,
6498  p_qa_code            IN   VARCHAR2,
6499  x_perform_qa         OUT  NOCOPY VARCHAR2,
6500  x_qa_name            OUT  NOCOPY VARCHAR2,
6501  x_severity_flag      OUT  NOCOPY VARCHAR2,
6502  x_return_status      OUT  NOCOPY VARCHAR2
6503 ) IS
6504 
6505 CURSOR l_get_qa_detail_csr IS
6506 SELECT fnd.meaning qa_name,
6507        nvl(qa.severity_flag,G_QA_STS_WARNING) severity_flag ,
6508        decode(fnd.enabled_flag,'N','N','Y',decode(qa.enable_qa_yn,'N','N','Y'),'Y') perform_qa
6509 FROM FND_LOOKUPS FND,
6510      OKC_DOC_QA_LISTS QA
6511 WHERE QA.DOCUMENT_TYPE(+)=p_document_type
6512   AND QA.QA_CODE(+) = FND.LOOKUP_CODE
6513   AND Fnd.LOOKUP_TYPE='OKC_TERM_QA_LIST'
6514   AND Fnd.lookup_code = p_qa_code;
6515 
6516 l_api_name CONSTANT VARCHAR2(30) := 'get_qa_code_detail';
6517 
6518 BEGIN
6519   -- start debug log
6520   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6521      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6522                     G_MODULE||l_api_name,
6523                     '100: Entered '||G_PKG_NAME ||'.'||l_api_name);
6524   END IF;
6525 
6526     --
6527     --  Initialize API return status to success
6528     --
6529     x_return_status := FND_API.G_RET_STS_SUCCESS;
6530 
6531     OPEN l_get_qa_detail_csr;
6532       FETCH l_get_qa_detail_csr INTO x_qa_name,
6533 	                                x_severity_flag,
6534 							  x_perform_qa;
6535 		IF l_get_qa_detail_csr%NOTFOUND THEN
6536              FND_MESSAGE.set_name(G_APP_NAME, G_OKC_MSG_INVALID_ARGUMENT);
6537 		   FND_MESSAGE.set_token('ARG_NAME', 'p_qa_code');
6538 		   FND_MESSAGE.set_token('ARG_VALUE', p_qa_code);
6539 		   FND_MSG_PUB.add;
6540              RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
6541 		END IF;
6542     CLOSE l_get_qa_detail_csr;
6543 
6544   -- end debug log
6545   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6546      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6547                     G_MODULE||l_api_name,
6548                     '1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
6549   END IF;
6550 
6551 
6552 EXCEPTION
6553   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6554       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6555          FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6556                         G_MODULE||l_api_name,
6557                         '3000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
6558       END IF;
6559 
6560       x_return_status := G_RET_STS_UNEXP_ERROR ;
6561 
6562       IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
6563              FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
6564       END IF;
6565 
6566 WHEN OTHERS THEN
6567       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6568          FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6569                         G_MODULE||l_api_name,
6570                         '4000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
6571       END IF;
6572       x_return_status := G_RET_STS_UNEXP_ERROR ;
6573 
6574       IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
6575              FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
6576       END IF;
6577 
6578 
6579 END get_qa_code_detail;
6580 ------------------------------------------------------------------------------
6581 
6582   /*====================================================================+
6583   Procedure Name : enable_expert_button
6584   Description    : Determines if the Contract Expert button should be
6585                    enabled in the Authoring UI.
6586 
6587   +====================================================================*/
6588 PROCEDURE enable_expert_button
6589 (
6590  p_api_version                  IN NUMBER,
6591  p_init_msg_list                IN VARCHAR2,
6592  p_template_id                  IN NUMBER,
6593  p_document_id                  IN NUMBER,
6594  p_document_type                IN VARCHAR2,
6595  x_enable_expert_button         OUT NOCOPY VARCHAR2, -- FND_API.G_FALSE or G_TRUE
6596  x_return_status                OUT NOCOPY VARCHAR2,
6597  x_msg_count                    OUT NOCOPY NUMBER,
6598  x_msg_data                     OUT NOCOPY VARCHAR2
6599 ) IS
6600 
6601     l_api_version CONSTANT NUMBER := 1;
6602     l_api_name VARCHAR2(30) := 'enable_expert_button';
6603     l_package_procedure VARCHAR2(60);
6604     l_config_header_id NUMBER;
6605     l_expert_enabled VARCHAR2(1);
6606     l_ce_profile_option_enabled     VARCHAR2(100);
6607 
6608     CURSOR csr_config_header_id IS
6609     SELECT config_header_id
6610     FROM   okc_template_usages
6611     WHERE  document_id = p_document_id
6612     AND    document_type = p_document_type
6613     AND    template_id = p_template_id;
6614 
6615     CURSOR csr_expert_enabled IS
6616     SELECT (nvl(contract_expert_enabled, 'N'))
6617     FROM   okc_terms_templates_all
6618     WHERE  template_id = p_template_id;
6619 
6620     -- bug 4234476
6621     -- For document_Type_class as Sourcing if variable_resolution_am IS NULL
6622     -- then contract expert button must be disabled.
6623     CURSOR csr_sourcing_level IS
6624     SELECT document_type_class,
6625            NVL(variable_resolution_am,'X')
6626       FROM okc_bus_doc_types_b
6627      WHERE document_type = p_document_type;
6628 
6629 l_document_type_class           okc_bus_doc_types_b.document_type_class%TYPE;
6630 l_variable_resolution_am        okc_bus_doc_types_b.variable_resolution_am%TYPE;
6631 
6632 
6633 BEGIN
6634 
6635   -- start debug log
6636   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6637      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6638                     G_MODULE||l_api_name,
6639                     '100: Entered '||G_PKG_NAME ||'.'||l_api_name);
6640   END IF;
6641 
6642     --
6643     -- Standard call to check for call compatibility.
6644     --
6645     IF NOT FND_API.Compatible_API_Call (l_api_version,
6646        	       	    	    	 	p_api_version,
6647         	    	    	    	l_api_name,
6648     		    	    	    	G_PKG_NAME)
6649     THEN
6650     	RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6651     END IF;
6652 
6653     --
6654     -- Initialize message list if p_init_msg_list is set to TRUE.
6655     --
6656     IF FND_API.to_Boolean( p_init_msg_list ) THEN
6657     	FND_MSG_PUB.initialize;
6658     END IF;
6659 
6660     --
6661     --  Initialize API return status to success
6662     --
6663     x_enable_expert_button := FND_API.G_FALSE;
6664     x_return_status := FND_API.G_RET_STS_SUCCESS;
6665 
6666     -- If documentType is 'OKS' then 'Expert Button' should not be displayed
6667     --
6668 
6669        IF(p_document_type is not null and trim(p_document_type)='OKS') THEN
6670           x_enable_expert_button := FND_API.G_FALSE;
6671           RETURN;
6672        END IF;
6673 
6674     -- bug 4234476
6675     OPEN csr_sourcing_level;
6676        FETCH csr_sourcing_level INTO l_document_type_class, l_variable_resolution_am;
6677     CLOSE csr_sourcing_level;
6678 
6679     IF l_document_type_class='SOURCING' AND l_variable_resolution_am = 'X' THEN
6680         -- Not Expert enabled
6681         x_enable_expert_button := FND_API.G_FALSE;
6682         RETURN ;
6683     END IF;
6684 
6685 
6686     --  If 'Use Contract Expert' profile is No,
6687     --  Expert button should not be displayed.
6688     --
6689 
6690   --
6691   -- Check if CE Profile is Enabled.
6692   --
6693      FND_PROFILE.GET(name=> 'OKC_K_EXPERT_ENABLED', val => l_ce_profile_option_enabled );
6694 
6695     IF NVL(l_ce_profile_option_enabled,'N') = 'N' THEN
6696         -- Not Expert enabled
6697         x_enable_expert_button := FND_API.G_FALSE;
6698         RETURN ;
6699     END IF;
6700 
6701 
6702     --
6703     --  If Configurator has been applied to the document
6704     --  then Expert should be enabled, regardless of
6705     --  Template setting.
6706 
6707     OPEN csr_config_header_id;
6708       FETCH csr_config_header_id INTO l_config_header_id;
6709     CLOSE csr_config_header_id;
6710 
6711     IF (l_config_header_id is not NULL)
6712     THEN
6713 
6714        x_enable_expert_button := FND_API.G_TRUE;
6715 
6716     ELSE
6717        --
6718        --  Is Template enabled for Expert?
6719        --
6720        OPEN csr_expert_enabled;
6721          FETCH csr_expert_enabled INTO l_expert_enabled;
6722        CLOSE csr_expert_enabled;
6723 
6724        IF (upper(l_expert_enabled) = 'Y')
6725        THEN
6726 
6727          x_enable_expert_button := FND_API.G_TRUE;
6728 
6729        END IF; -- end l_expert_enabled
6730 
6731     END IF; -- l_config_header_id is not null
6732 
6733 
6734   -- end debug log
6735   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6736      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6737                     G_MODULE||l_api_name,
6738                     '1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
6739   END IF;
6740 
6741 EXCEPTION
6742 
6743 WHEN FND_API.G_EXC_ERROR THEN
6744       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6745          FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6746                         G_MODULE||l_api_name,
6747                         '2000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
6748       END IF;
6749 
6750     		x_return_status := FND_API.G_RET_STS_ERROR ;
6751     		FND_MSG_PUB.Count_And_Get(
6752     		        p_count => x_msg_count,
6753             		p_data => x_msg_data
6754     		);
6755 
6756 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6757       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6758          FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6759                         G_MODULE||l_api_name,
6760                         '3000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
6761       END IF;
6762 
6763     		x_return_status := FND_API.G_RET_STS_ERROR ;
6764     		FND_MSG_PUB.Count_And_Get(
6765     		        p_count => x_msg_count,
6766             		p_data => x_msg_data
6767     		);
6768 
6769 WHEN OTHERS THEN
6770       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6771          FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6772                         G_MODULE||l_api_name,
6773                         '4000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
6774       END IF;
6775 
6776     		x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
6777 
6778       		IF FND_MSG_PUB.Check_Msg_Level
6779     		   (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
6780     		THEN
6781         	    	FND_MSG_PUB.Add_Exc_Msg(
6782         	    	     G_PKG_NAME  	    ,
6783         	    	     l_api_name
6784     	    	      );
6785     		END IF;
6786 
6787     		FND_MSG_PUB.Count_And_Get(
6788     		     p_count => x_msg_count,
6789             	     p_data => x_msg_data);
6790 END enable_expert_button;
6791 
6792 
6793 
6794 
6795 ------------------------------------------------------------------------------
6796 -- Begin: Added for R12
6797 
6798 PROCEDURE get_expert_selections(
6799     p_api_version                  IN NUMBER,
6800     p_init_msg_list                IN VARCHAR2,
6801     p_document_id                  IN NUMBER,
6802     p_document_type                IN VARCHAR2,
6803     p_config_header_id             IN NUMBER,
6804     p_config_rev_nbr               IN NUMBER,
6805     x_expert_clauses_tbl           OUT NOCOPY expert_articles_tbl_type,
6806     x_expert_deviations_tbl        OUT NOCOPY dev_rule_tbl_type,
6807     x_return_status                OUT NOCOPY VARCHAR2,
6808     x_msg_count                    OUT NOCOPY NUMBER,
6809     x_msg_data                     OUT NOCOPY VARCHAR2)
6810 IS
6811 
6812     l_api_version CONSTANT NUMBER := 1;
6813     l_api_name CONSTANT VARCHAR2(30) := 'get_expert_selections';
6814 
6815     j                           BINARY_INTEGER :=1;
6816 
6817     l_prov_allowed  varchar2(1);
6818     l_provision  varchar2(1);
6819 
6820 
6821     --
6822     -- Currsor to Select the Expert Deviations
6823     -- that are in the latest Configuration
6824     --
6825     --
6826 
6827     CURSOR l_get_xprt_det_from_cz_csr IS
6828     SELECT DECODE(SUBSTR(orig_sys_ref,5,3),'CLA',NULL,'VAR',item_val) line_number,
6829            SUBSTR(orig_sys_ref,INSTR(orig_sys_ref,':',-1,1)+1) id,
6830            SUBSTR(orig_sys_ref,5,3) type,
6831            parent_config_item_id
6832        FROM cz_config_items_v
6833      WHERE config_hdr_id = p_config_header_id
6834        AND config_rev_nbr = p_config_rev_nbr
6835        AND (orig_sys_ref LIKE 'OKC:CLAUSEMODELOPTION:%' OR
6836             orig_sys_ref LIKE 'OKC:VARIABLEMODELDEVFEATURE:%');
6837 
6838 
6839     --
6840     -- Cursor to check provision allowed for doc type
6841     --
6842     CURSOR l_get_prov_csr IS
6843     SELECT NVL(PROVISION_ALLOWED_YN,'Y')
6844     FROM OKC_BUS_DOC_TYPES_B
6845     WHERE  DOCUMENT_TYPE=p_document_type;
6846 
6847 
6848     --
6849     -- Cursor to check if the article is a provision or clause
6850     --
6851     --
6852     CURSOR csr_art_provision (p_article_id NUMBER) IS
6853     SELECT NVL(PROVISION_YN,'N')
6854     FROM   OKC_ARTICLE_VERSIONS VERS
6855     WHERE vers.article_id = p_article_id;
6856 
6857     --
6858     -- Currsor to Get Line number for deviation
6859     --
6860 
6861     CURSOR l_get_xprt_dev_line_number_csr(l_parent_config_item_id NUMBER) IS
6862     SELECT NVL(item_val,'-99') line_number
6863     FROM  cz_config_items_v
6864     WHERE config_hdr_id = p_config_header_id
6865     AND config_rev_nbr = p_config_rev_nbr
6866     AND parent_config_item_id = l_parent_config_item_id
6867     AND orig_sys_ref LIKE 'OKC:VARIABLEMODELTEXTFEATURE:%LINE_NUMBER%';
6868 
6869 BEGIN
6870 
6871 
6872   -- start debug log
6873   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6874      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6875                     G_MODULE||l_api_name,
6876                     '100: Entered '||G_PKG_NAME ||'.'||l_api_name);
6877      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6878                     G_MODULE||l_api_name,
6879                     'Parameters : ');
6880      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6881                     G_MODULE||l_api_name,
6882                     'p_document_id : '||p_document_id);
6883      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6884                     G_MODULE||l_api_name,
6885                     'p_document_type : '||p_document_type);
6886      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6887                     G_MODULE||l_api_name,
6888                     'p_config_header_id : '||p_config_header_id);
6889      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6890                     G_MODULE||l_api_name,
6891                     'p_config_rev_nbr : '||p_config_rev_nbr);
6892 
6893   END IF;
6894 
6895     --
6896     -- Standard call to check for call compatibility.
6897     --
6898     IF NOT FND_API.Compatible_API_Call (l_api_version,
6899        	       	    	    	 	p_api_version,
6900         	    	    	    	l_api_name,
6901     		    	    	    	G_PKG_NAME)
6902     THEN
6903     	RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6904     END IF;
6905 
6906     --
6907     -- Initialize message list if p_init_msg_list is set to TRUE.
6908     --
6909     IF FND_API.to_Boolean( p_init_msg_list ) THEN
6910     	FND_MSG_PUB.initialize;
6911     END IF;
6912 
6913 
6914     IF (p_config_header_id IS NULL OR p_config_rev_nbr IS NULL)
6915     THEN
6916       x_msg_data := 'OKC_EXPRT_NULL_PARAM';
6917       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6918     END IF;
6919 
6920     --
6921     --  Initialize API return status to success
6922     --
6923     x_return_status := FND_API.G_RET_STS_SUCCESS;
6924 
6925     --
6926     -- If provisions are allowed on current document type then just return all
6927     -- the articles suggested by expert
6928     -- If provision is NOT allowed then process each article to check if it is provision an drop
6929 
6930     --
6931     -- First Check if Provisions are allowed in the document.  If not, do not suggest
6932     -- them in QA.
6933     --
6934     OPEN  l_get_prov_csr;
6935     FETCH l_get_prov_csr INTO l_prov_allowed;
6936     CLOSE l_get_prov_csr;
6937 
6938 
6939     --
6940     -- Select Articles from configuration
6941     --
6942     FOR l_get_xprt_det_from_cz_rec IN l_get_xprt_det_from_cz_csr
6943     LOOP
6944 
6945     	IF l_get_xprt_det_from_cz_rec.type = 'CLA' -- Clause from Expert
6946     	THEN
6947 	    IF l_prov_allowed = 'Y' THEN
6948 		x_expert_clauses_tbl(j) := l_get_xprt_det_from_cz_rec.id;
6949 		j := j + 1;
6950 
6951 	    ELSE
6952 	        -- PROVISION IS NOT ALLOWED, CHECK EACH ARTICLE FOR PROVISION FLAG
6953 		-- AND DROP PROVISONS
6954 		--
6955 		-- SELECT ARTICLES FROM CONFIGURATION
6956 		--
6957 		OPEN  csr_art_provision (p_article_id => l_get_xprt_det_from_cz_rec.id);
6958 		FETCH csr_art_provision INTO l_provision;
6959 		CLOSE csr_art_provision;
6960 
6961 		IF l_provision = 'N' THEN
6962 		    x_expert_clauses_tbl(j) := l_get_xprt_det_from_cz_rec.id;
6963 		    j := j + 1;
6964 		END IF; -- NOT A PROVISION
6965 
6966 	    END IF;  -- l_prov_allowed = 'Y'
6967 
6968 	ELSE    -- Deviation from Expert
6969 
6970     	    OPEN  l_get_xprt_dev_line_number_csr (l_get_xprt_det_from_cz_rec.parent_config_item_id);
6971 	    FETCH l_get_xprt_dev_line_number_csr INTO x_expert_deviations_tbl(j).line_number;
6972 	    CLOSE l_get_xprt_dev_line_number_csr;
6973     	    --x_expert_deviations_tbl(j).line_number := l_get_xprt_det_from_cz_rec.line_number;
6974     	    x_expert_deviations_tbl(j).rule_id     := l_get_xprt_det_from_cz_rec.id;
6975     	    j := j + 1;
6976 
6977     	END IF;
6978 
6979     END LOOP;
6980 
6981   -- end debug log
6982   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6983      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
6984                     G_MODULE||l_api_name,
6985                     '1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
6986   END IF;
6987 
6988 EXCEPTION
6989 
6990       WHEN FND_API.G_EXC_ERROR THEN
6991 
6992   		x_return_status := FND_API.G_RET_STS_ERROR ;
6993   		FND_MSG_PUB.Count_And_Get(
6994   		        p_count => x_msg_count,
6995           		p_data => x_msg_data
6996   		);
6997 
6998       WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6999   		x_return_status := FND_API.G_RET_STS_ERROR ;
7000   		FND_MSG_PUB.Count_And_Get(
7001   		        p_count => x_msg_count,
7002           		p_data => x_msg_data
7003   		);
7004 
7005       WHEN OTHERS THEN
7006   		x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
7007 
7008     		IF FND_MSG_PUB.Check_Msg_Level
7009   		   (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
7010   		THEN
7011       	    	FND_MSG_PUB.Add_Exc_Msg(
7012       	    	     G_PKG_NAME  	    ,
7013       	    	     l_api_name
7014   	    	      );
7015   		END IF;
7016 
7017   		FND_MSG_PUB.Count_And_Get(
7018   		     p_count => x_msg_count,
7019           	     p_data => x_msg_data
7020   		);
7021 
7022 END get_expert_selections;
7023 
7024 PROCEDURE get_rule_details(
7025     p_api_version                  IN NUMBER,
7026     p_init_msg_list                IN VARCHAR2,
7027     p_dev_rule_tbl                 IN dev_rule_tbl_type,
7028     x_dev_rule_questions_tbl	   OUT NOCOPY dev_rule_questions_tbl_type,
7029     x_dev_rule_variables_tbl	   OUT NOCOPY dev_rule_variables_tbl_type,
7030     x_return_status                OUT NOCOPY VARCHAR2,
7031     x_msg_count                    OUT NOCOPY NUMBER,
7032     x_msg_data                     OUT NOCOPY VARCHAR2)
7033 IS
7034 
7035     l_api_version CONSTANT NUMBER := 1;
7036     l_api_name CONSTANT VARCHAR2(30) := 'get_rule_details';
7037 
7038     l_dev_rule_questions_tbl    dev_rule_questions_tbl_type;
7039     l_dev_rule_variables_tbl	dev_rule_variables_tbl_type;
7040     j                           BINARY_INTEGER :=0;
7041 
7042 
7043     --
7044     -- Currsor to Select Questions and Variables
7045     -- that are present in the  Deviations rule
7046     --
7047     --
7048 
7049     CURSOR l_rule_details_csr(p_dev_rule_id NUMBER) IS
7050 	SELECT DISTINCT object_type type,
7051 			object_code code
7052 	  FROM okc_xprt_rule_conditions
7053 	 WHERE rule_id = p_dev_rule_id
7054 	   AND object_type IN ('QUESTION','VARIABLE')
7055 	UNION ALL
7056 	SELECT DISTINCT object_value_type type,
7057 			object_value_code code
7058 	  FROM okc_xprt_rule_conditions
7059 	 WHERE rule_id = p_dev_rule_id
7060 	   AND object_value_type IN ('QUESTION','VARIABLE');
7061 
7062 BEGIN
7063 
7064 
7065   -- start debug log
7066   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7067      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7068                     G_MODULE||l_api_name,
7069                     '100: Entered '||G_PKG_NAME ||'.'||l_api_name);
7070      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7071                     G_MODULE||l_api_name,
7072                     'Parameters : ');
7073      -- Add Logs for printing deviations rule tbl
7074      IF p_dev_rule_tbl IS NOT NULL THEN
7075      	IF p_dev_rule_tbl.count > 0 THEN
7076 		FOR i IN p_dev_rule_tbl.first..p_dev_rule_tbl.last LOOP
7077 	     		FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7078 			    G_MODULE||l_api_name,
7079 			    'p_dev_rule_tbl.(' || i || ').line_number : ' || to_char(p_dev_rule_tbl(i).line_number));
7080 	     		FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7081 			    G_MODULE||l_api_name,
7082 			    'p_dev_rule_tbl.(' || i || ').rule_id : ' || to_char(p_dev_rule_tbl(i).rule_id));
7083 	  	END LOOP;
7084         END IF;
7085      END IF;
7086   END IF;
7087 
7088     --
7089     -- Standard call to check for call compatibility.
7090     --
7091     IF NOT FND_API.Compatible_API_Call (l_api_version,
7092        	       	    	    	 	p_api_version,
7093         	    	    	    	l_api_name,
7094     		    	    	    	G_PKG_NAME)
7095     THEN
7096     	RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7097     END IF;
7098 
7099     --
7100     -- Initialize message list if p_init_msg_list is set to TRUE.
7101     --
7102     IF FND_API.to_Boolean( p_init_msg_list ) THEN
7103     	FND_MSG_PUB.initialize;
7104     END IF;
7105 
7106 
7107     --
7108     --  Initialize API return status to success
7109     --
7110     x_return_status := FND_API.G_RET_STS_SUCCESS;
7111 
7112     --
7113     -- Select Deviation Rules from configuration
7114     --
7115     FOR i IN p_dev_rule_tbl.FIRST..p_dev_rule_tbl.LAST
7116     LOOP
7117     	FOR l_rule_details_rec IN l_rule_details_csr(p_dev_rule_tbl(i).rule_id)
7118     	LOOP
7119     	   IF (l_rule_details_rec.type = 'QUESTION') THEN
7120               --x_dev_rule_questions_tbl(i).line_number := p_dev_rule_tbl(i).line_number;
7121     	      x_dev_rule_questions_tbl(i).rule_id := p_dev_rule_tbl(i).rule_id;
7122     	      x_dev_rule_questions_tbl(i).question_id := l_rule_details_rec.code;
7123     	   END IF;
7124     	   IF (l_rule_details_rec.type = 'VARIABLE') THEN
7125     	      x_dev_rule_variables_tbl(i).line_number := p_dev_rule_tbl(i).line_number;
7126        	      x_dev_rule_variables_tbl(i).rule_id := p_dev_rule_tbl(i).rule_id;
7127     	      x_dev_rule_variables_tbl(i).variable_id := l_rule_details_rec.code;
7128     	   END IF;
7129     	END LOOP;
7130     END LOOP;
7131 
7132   -- end debug log
7133   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7134      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7135                     G_MODULE||l_api_name,
7136                     '1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
7137   END IF;
7138 
7139 EXCEPTION
7140 
7141       WHEN FND_API.G_EXC_ERROR THEN
7142 
7143   		x_return_status := FND_API.G_RET_STS_ERROR ;
7144   		FND_MSG_PUB.Count_And_Get(
7145   		        p_count => x_msg_count,
7146           		p_data => x_msg_data
7147   		);
7148 
7149       WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7150   		x_return_status := FND_API.G_RET_STS_ERROR ;
7151   		FND_MSG_PUB.Count_And_Get(
7152   		        p_count => x_msg_count,
7153           		p_data => x_msg_data
7154   		);
7155 
7156       WHEN OTHERS THEN
7157   		x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
7158 
7159     		IF FND_MSG_PUB.Check_Msg_Level
7160   		   (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
7161   		THEN
7162       	    	FND_MSG_PUB.Add_Exc_Msg(
7163       	    	     G_PKG_NAME  	    ,
7164       	    	     l_api_name
7165   	    	      );
7166   		END IF;
7167 
7168   		FND_MSG_PUB.Count_And_Get(
7169   		     p_count => x_msg_count,
7170           	     p_data => x_msg_data
7171   		);
7172 
7173 END get_rule_details;
7174 
7175 
7176 PROCEDURE get_rule_variable_values(
7177     p_api_version                  IN NUMBER,
7178     p_init_msg_list                IN VARCHAR2,
7179     p_sequence_id	           IN NUMBER,
7180     p_dev_rule_variables_tbl       IN dev_rule_variables_tbl_type,
7181     x_dev_rule_var_values_tbl	   OUT NOCOPY dev_rule_var_values_tbl_type,
7182     x_return_status                OUT NOCOPY VARCHAR2,
7183     x_msg_count                    OUT NOCOPY NUMBER,
7184     x_msg_data                     OUT NOCOPY VARCHAR2)
7185 IS
7186 
7187     l_api_version CONSTANT NUMBER := 1;
7188     l_api_name CONSTANT VARCHAR2(30) := 'get_rule_variable_values';
7189 
7190     j                           BINARY_INTEGER :=0;
7191 
7192 
7193     --
7194     -- Currsor to Select Variable values for the Variables
7195     -- that are present in the  Deviations rule
7196     --
7197     --
7198 
7199     CURSOR l_get_rul_variable_values_csr (p_line_number VARCHAR2, p_variable_id VARCHAR2) IS
7200     SELECT variable_value variable_value
7201       FROM okc_xprt_deviations_t
7202      WHERE variable_code = p_variable_id
7203      AND run_id = p_sequence_id;
7204        --AND line_number = p_line_number;
7205 
7206     CURSOR l_get_translated_values_csr (p_variable_id VARCHAR2, p_variable_value VARCHAR2) IS
7207     SELECT localized_str translated_value
7208       FROM cz_localized_texts
7209      WHERE orig_sys_ref LIKE 'OKC:VARIABLEMODELOPTION:-99:%:' || p_variable_id || ':' || p_variable_value
7210 	   AND LANGUAGE = USERENV('LANG');
7211 BEGIN
7212 
7213 
7214   -- start debug log
7215   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7216      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7217                     G_MODULE||l_api_name,
7218                     '100: Entered '||G_PKG_NAME ||'.'||l_api_name);
7219      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7220                     G_MODULE||l_api_name,
7221                     'Parameters : ');
7222      -- Add Logs for printing deviations rule variables tbl
7223      IF p_dev_rule_variables_tbl IS NOT NULL THEN
7224      	IF p_dev_rule_variables_tbl.count > 0 THEN
7225 		FOR i IN p_dev_rule_variables_tbl.first..p_dev_rule_variables_tbl.last LOOP
7226 	     	   IF p_dev_rule_variables_tbl.EXISTS(i) THEN
7227 	     		FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7228 			    G_MODULE||l_api_name,
7229 			    'p_dev_rule_variables_tbl.(' || i || ').line_number : ' || to_char(p_dev_rule_variables_tbl(i).line_number));
7230 	     		FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7231 			    G_MODULE||l_api_name,
7232 			    'p_dev_rule_variables_tbl.(' || i || ').rule_id : ' || to_char(p_dev_rule_variables_tbl(i).rule_id));
7233 	     		FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7234 			    G_MODULE||l_api_name,
7235 			    'p_dev_rule_variables_tbl.(' || i || ').variable_id : ' || to_char(p_dev_rule_variables_tbl(i).variable_id));
7236 	  	   END IF;
7237 	  	END LOOP;
7238         END IF;
7239      END IF;
7240   END IF;
7241 
7242     --
7243     -- Standard call to check for call compatibility.
7244     --
7245     IF NOT FND_API.Compatible_API_Call (l_api_version,
7246        	       	    	    	 	p_api_version,
7247         	    	    	    	l_api_name,
7248     		    	    	    	G_PKG_NAME)
7249     THEN
7250     	RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7251     END IF;
7252 
7253     --
7254     -- Initialize message list if p_init_msg_list is set to TRUE.
7255     --
7256     IF FND_API.to_Boolean( p_init_msg_list ) THEN
7257     	FND_MSG_PUB.initialize;
7258     END IF;
7259 
7260 
7261     --
7262     --  Initialize API return status to success
7263     --
7264     x_return_status := FND_API.G_RET_STS_SUCCESS;
7265 
7266     --
7267     -- Select Variable values from Temp table
7268     --
7269     /*FOR i IN p_dev_rule_variables_tbl.FIRST..p_dev_rule_variables_tbl.LAST
7270     LOOP
7271     	IF p_dev_rule_variables_tbl.EXISTS(i) THEN
7272 		FOR l_get_rul_variable_values_rec IN l_get_rul_variable_values_csr(p_dev_rule_variables_tbl(i).line_number,
7273 										   p_dev_rule_variables_tbl(i).variable_id)
7274 		LOOP
7275 		   x_dev_rule_var_values_tbl(i).line_number 		:= 	p_dev_rule_variables_tbl(i).line_number;
7276 		   x_dev_rule_var_values_tbl(i).rule_id 		:= 	p_dev_rule_variables_tbl(i).rule_id;
7277 		   x_dev_rule_var_values_tbl(i).variable_id 		:= 	p_dev_rule_variables_tbl(i).variable_id;
7278 		   --x_dev_rule_var_values_tbl(i).variable_value	:= 	l_get_rul_variable_values_rec.variable_value;
7279 		   OPEN l_get_translated_values_csr(p_dev_rule_variables_tbl(i).variable_id,
7280 		                                    l_get_rul_variable_values_rec.variable_value);
7281 		   FETCH l_get_translated_values_csr INTO x_dev_rule_var_values_tbl(i).variable_value;
7282 		   CLOSE l_get_translated_values_csr;
7283 		END LOOP;
7284   	END IF;
7285     END LOOP;*/
7286 
7287     -- Modified for Bug 4913135 since there is a separate funtion get_deviation_document_value function
7288     FOR i IN p_dev_rule_variables_tbl.FIRST..p_dev_rule_variables_tbl.LAST
7289     LOOP
7290     	IF p_dev_rule_variables_tbl.EXISTS(i) THEN
7291 		   x_dev_rule_var_values_tbl(i).line_number 		:= 	p_dev_rule_variables_tbl(i).line_number;
7292 		   x_dev_rule_var_values_tbl(i).rule_id 		:= 	p_dev_rule_variables_tbl(i).rule_id;
7293 		   x_dev_rule_var_values_tbl(i).variable_id 		:= 	p_dev_rule_variables_tbl(i).variable_id;
7294 		   --x_dev_rule_var_values_tbl(i).variable_value	:= 	l_get_rul_variable_values_rec.variable_value;
7295   	END IF;
7296     END LOOP;
7297 
7298 
7299   -- end debug log
7300   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7301      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7302                     G_MODULE||l_api_name,
7303                     '1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
7304   END IF;
7305 
7306 EXCEPTION
7307 
7308       WHEN FND_API.G_EXC_ERROR THEN
7309 
7310   		x_return_status := FND_API.G_RET_STS_ERROR ;
7311   		FND_MSG_PUB.Count_And_Get(
7312   		        p_count => x_msg_count,
7313           		p_data => x_msg_data
7314   		);
7315 
7316       WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7317   		x_return_status := FND_API.G_RET_STS_ERROR ;
7318   		FND_MSG_PUB.Count_And_Get(
7319   		        p_count => x_msg_count,
7320           		p_data => x_msg_data
7321   		);
7322 
7323       WHEN OTHERS THEN
7324   		x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
7325 
7326     		IF FND_MSG_PUB.Check_Msg_Level
7327   		   (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
7328   		THEN
7329       	    	FND_MSG_PUB.Add_Exc_Msg(
7330       	    	     G_PKG_NAME  	    ,
7331       	    	     l_api_name
7332   	    	      );
7333   		END IF;
7334 
7335   		FND_MSG_PUB.Count_And_Get(
7336   		     p_count => x_msg_count,
7337           	     p_data => x_msg_data
7338   		);
7339 
7340 END get_rule_variable_values;
7341 
7342 PROCEDURE get_rule_question_values(
7343     p_api_version                  IN NUMBER,
7344     p_init_msg_list                IN VARCHAR2,
7345     p_config_header_id             IN NUMBER,
7346     p_config_rev_nbr               IN NUMBER,
7347     p_dev_rule_questions_tbl       IN dev_rule_questions_tbl_type,
7348     x_dev_rule_qst_values_tbl	   OUT NOCOPY dev_rule_qst_values_tbl_type,
7349     x_return_status                OUT NOCOPY VARCHAR2,
7350     x_msg_count                    OUT NOCOPY NUMBER,
7351     x_msg_data                     OUT NOCOPY VARCHAR2)
7352 IS
7353 
7354     l_api_version CONSTANT NUMBER := 1;
7355     l_api_name CONSTANT VARCHAR2(30) := 'get_rule_question_values';
7356 
7357     j                           BINARY_INTEGER :=0;
7358 
7359 
7360     --
7361     -- Currsor to Select Variable values for the Variables
7362     -- that are present in the  Deviations rule
7363     --
7364     --
7365 
7366     CURSOR l_get_rule_qst_values_csr(p_config_header_id NUMBER, p_config_rev_nbr NUMBER, p_question_id NUMBER) IS
7367     SELECT ltxt.localized_str question_value
7368       FROM cz_config_items_v config,
7369            cz_ps_nodes psn,
7370            cz_localized_texts ltxt
7371      WHERE config.config_hdr_id = p_config_header_id
7372        AND config.config_rev_nbr = p_config_rev_nbr
7373        AND config.ps_node_id = psn.ps_node_id
7374        AND psn.intl_text_id = ltxt.intl_text_id
7375        AND ltxt.LANGUAGE = USERENV('LANG')
7376        AND SUBSTR(config.orig_sys_ref, INSTR(config.orig_sys_ref,':',-1,2)+1,
7377                (INSTR(config.orig_sys_ref,':',-1,1) - (INSTR(config.orig_sys_ref,':',-1,2)+1))) = to_char(p_question_id);
7378 
7379 
7380 /*    SELECT ps_node_name question_value
7381       FROM cz_config_items_v
7382      WHERE config_hdr_id = p_config_header_id
7383        AND config_rev_nbr = p_config_rev_nbr
7384        AND SUBSTR(orig_sys_ref, INSTR(orig_sys_ref,':',-1,2)+1,
7385                (INSTR(orig_sys_ref,':',-1,1) - (INSTR(orig_sys_ref,':',-1,2)+1))) = to_char(p_question_id);
7386        --AND orig_sys_ref LIKE 'OKC:DEVIATIONS:%' ;*/
7387 
7388 BEGIN
7389 
7390 
7391   -- start debug log
7392   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7393      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7394                     G_MODULE||l_api_name,
7395                     '100: Entered '||G_PKG_NAME ||'.'||l_api_name);
7396      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7397                     G_MODULE||l_api_name,
7398                     'Parameters : ');
7399      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7400 		  G_MODULE||l_api_name,
7401 		  '101: p_config_header_id : '||p_config_header_id);
7402      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7403 		  G_MODULE||l_api_name,
7404 		  '101: p_config_rev_nbr : '||p_config_rev_nbr);
7405      -- Add Logs for printing deviations rule tbl
7406      IF p_dev_rule_questions_tbl IS NOT NULL THEN
7407      	IF p_dev_rule_questions_tbl.count > 0 THEN
7408 		FOR i IN p_dev_rule_questions_tbl.first..p_dev_rule_questions_tbl.last LOOP
7409 		   IF p_dev_rule_questions_tbl.EXISTS(i) THEN
7410 	     		FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7411 			    G_MODULE||l_api_name,
7412 			    'p_dev_rule_questions_tbl.(' || i || ').rule_id : ' || to_char(p_dev_rule_questions_tbl(i).rule_id));
7413 	     		FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7414 			    G_MODULE||l_api_name,
7415 			    'p_dev_rule_questions_tbl.(' || i || ').question_id : ' || to_char(p_dev_rule_questions_tbl(i).question_id));
7416 	           END IF;
7417 	  	END LOOP;
7418         END IF;
7419      END IF;
7420 
7421   END IF;
7422 
7423     --
7424     -- Standard call to check for call compatibility.
7425     --
7426     IF NOT FND_API.Compatible_API_Call (l_api_version,
7427        	       	    	    	 	p_api_version,
7428         	    	    	    	l_api_name,
7429     		    	    	    	G_PKG_NAME)
7430     THEN
7431     	RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7432     END IF;
7433 
7434     --
7435     -- Initialize message list if p_init_msg_list is set to TRUE.
7436     --
7437     IF FND_API.to_Boolean( p_init_msg_list ) THEN
7438     	FND_MSG_PUB.initialize;
7439     END IF;
7440 
7441 
7442     --
7443     --  Initialize API return status to success
7444     --
7445     x_return_status := FND_API.G_RET_STS_SUCCESS;
7446 
7447     --
7448     -- Select Question value from Cz config table
7449     --
7450     /*FOR i IN p_dev_rule_questions_tbl.FIRST..p_dev_rule_questions_tbl.LAST
7451     LOOP
7452       IF p_dev_rule_questions_tbl.EXISTS(i) THEN
7453     	FOR l_get_rule_qst_values_rec IN l_get_rule_qst_values_csr(p_config_header_id, p_config_rev_nbr,
7454     	                                                           p_dev_rule_questions_tbl(i).question_id)
7455     	LOOP
7456            --x_dev_rule_qst_values_tbl(i).line_number 		:= 	p_dev_rule_questions_tbl(i).line_number;
7457            x_dev_rule_qst_values_tbl(i).rule_id 		:= 	p_dev_rule_questions_tbl(i).rule_id;
7458            x_dev_rule_qst_values_tbl(i).question_id 		:= 	p_dev_rule_questions_tbl(i).question_id;
7459            x_dev_rule_qst_values_tbl(i).question_value	 	:= 	l_get_rule_qst_values_rec.question_value;
7460   	END LOOP;
7461       END IF;
7462     END LOOP;*/
7463 
7464     -- Modified for Bug 4913135 since there is a separate funtion get_deviation_document_value function
7465     FOR i IN p_dev_rule_questions_tbl.FIRST..p_dev_rule_questions_tbl.LAST
7466     LOOP
7467           IF p_dev_rule_questions_tbl.EXISTS(i) THEN
7468                x_dev_rule_qst_values_tbl(i).rule_id 		        := 	p_dev_rule_questions_tbl(i).rule_id;
7469                x_dev_rule_qst_values_tbl(i).question_id 		:= 	p_dev_rule_questions_tbl(i).question_id;
7470                x_dev_rule_qst_values_tbl(i).question_value	 	:= 	null;
7471           END IF;
7472     END LOOP;
7473 
7474 
7475   -- end debug log
7476   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7477      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7478                     G_MODULE||l_api_name,
7479                     '1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
7480   END IF;
7481 
7482 EXCEPTION
7483 
7484       WHEN FND_API.G_EXC_ERROR THEN
7485 
7486   		x_return_status := FND_API.G_RET_STS_ERROR ;
7487   		FND_MSG_PUB.Count_And_Get(
7488   		        p_count => x_msg_count,
7489           		p_data => x_msg_data
7490   		);
7491 
7492       WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7493   		x_return_status := FND_API.G_RET_STS_ERROR ;
7494   		FND_MSG_PUB.Count_And_Get(
7495   		        p_count => x_msg_count,
7496           		p_data => x_msg_data
7497   		);
7498 
7499       WHEN OTHERS THEN
7500   		x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
7501 
7502     		IF FND_MSG_PUB.Check_Msg_Level
7503   		   (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
7504   		THEN
7505       	    	FND_MSG_PUB.Add_Exc_Msg(
7506       	    	     G_PKG_NAME  	    ,
7507       	    	     l_api_name
7508   	    	      );
7509   		END IF;
7510 
7511   		FND_MSG_PUB.Count_And_Get(
7512   		     p_count => x_msg_count,
7513           	     p_data => x_msg_data
7514   		);
7515 
7516 END get_rule_question_values;
7517 
7518 PROCEDURE get_article_details(
7519     p_api_version      		IN  NUMBER,
7520     p_init_msg_list    		IN  VARCHAR2,
7521     p_document_id      		IN  NUMBER,
7522     p_document_type    		IN  VARCHAR2,
7523     p_article_id       		IN  NUMBER,
7524     p_effectivity_date 		IN  DATE,
7525     x_article_id       		OUT NOCOPY NUMBER,
7526     x_article_version_id 	OUT NOCOPY NUMBER,
7527     x_article_title		OUT NOCOPY VARCHAR2,
7528     x_article_description	OUT NOCOPY VARCHAR2,
7529     x_doc_lib           	OUT NOCOPY VARCHAR2,
7530     x_scn_heading		OUT NOCOPY VARCHAR2,
7531     x_return_status    		OUT NOCOPY VARCHAR2,
7532     x_msg_count        		OUT NOCOPY NUMBER,
7533     x_msg_data         		OUT NOCOPY VARCHAR2)
7534 IS
7535 
7536 l_article_id 		NUMBER;
7537 l_article_version_id 	NUMBER;
7538 l_doc_lib            	VARCHAR2(1);
7539 l_api_version      	CONSTANT NUMBER := 1;
7540 l_api_name         	CONSTANT VARCHAR2(30) := 'get_article_details';
7541 
7542 l_xprt_scn_code                okc_terms_templates_all.xprt_scn_code%TYPE;
7543 l_def_scn_code  	       okc_article_versions.default_section%TYPE;
7544 l_scn_code 				   okc_sections_b.scn_code%TYPE;
7545 
7546 
7547 --Bug#4757731 cursor to get clause title and clause description
7548 CURSOR csr_clause_details(b_article_id NUMBER, b_article_version_id NUMBER) IS
7549 SELECT article_title,article_description
7550 FROM okc_articles_all a,okc_article_versions ver
7551 WHERE a.article_id = b_article_id
7552 AND a.article_id = ver.article_id
7553 AND ver.article_version_id = b_article_version_id;
7554 
7555 CURSOR get_doc_article_ver_id IS
7556 select sav_sae_id, article_version_id from okc_k_articles_b
7557 where document_id = p_document_id
7558 and document_type = p_document_type
7559 and ((sav_sae_id = p_article_id) or (ref_article_id = p_article_id))
7560 and source_flag = 'R'
7561 and rownum < 2;
7562 
7563 -- From Library
7564 
7565 CURSOR csr_lib_clause_desc_scn (b_article_id NUMBER, b_article_version_id NUMBER) IS
7566 SELECT nvl(default_section,'UNASSIGNED') scn_code
7567 FROM OKC_ARTICLE_VERSIONS VERS
7568  WHERE vers.article_id = b_article_id
7569    AND vers.article_version_id = b_article_version_id;
7570 
7571 CURSOR csr_xprt_scn_code IS
7572 SELECT NVL(t.xprt_scn_code,'UNASSIGNED')
7573   FROM okc_template_usages u,
7574        okc_terms_templates_all t
7575  WHERE u.template_id = t.template_id
7576    AND u.document_type = p_document_type
7577    AND u.document_id = p_document_id ;
7578 
7579 CURSOR l_get_lib_scn_csr(b_scn_code VARCHAR2) IS
7580 SELECT heading FROM OKC_SECTIONS_B
7581  WHERE scn_code     = b_scn_code
7582    AND rownum=1 ;
7583 
7584 -- From Document
7585 
7586 CURSOR l_get_doc_scn_csr (b_article_version_id NUMBER) IS
7587 SELECT scn.heading
7588 FROM OKC_SECTIONS_B scn,
7589      OKC_K_ARTICLES_B art
7590 WHERE art.document_type=p_document_type
7591 AND   art.document_id =p_document_id
7592 AND   art.article_version_id = b_article_version_id  --Bug#4757731 replaced art.sav_sae_id with art.article_version_id
7593 AND   art.scn_id = scn.id
7594 AND   rownum=1 ;
7595 
7596 BEGIN
7597 
7598   -- start debug log
7599   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7600      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7601                     G_MODULE||l_api_name,
7602                     '100: Entered '||G_PKG_NAME ||'.'||l_api_name);
7603      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7604                     G_MODULE||l_api_name,
7605                     'Parameters : ');
7606      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7607 		  G_MODULE||l_api_name,
7608 		  '101: p_document_id  : '||p_document_id);
7609      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7610 		  G_MODULE||l_api_name,
7611 		  '101: p_document_type : '||p_document_type);
7612      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7613 		  G_MODULE||l_api_name,
7614 		  '101: p_article_id : '||p_article_id);
7615      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7616 		  G_MODULE||l_api_name,
7617 		  '101: p_effectivity_date : '||to_char(p_effectivity_date));
7618   END IF;
7619 
7620     --
7621     -- Standard call to check for call compatibility.
7622     --
7623     IF NOT FND_API.Compatible_API_Call (l_api_version,
7624        	       	    	    	 	p_api_version,
7625         	    	    	    	l_api_name,
7626     		    	    	    	G_PKG_NAME)
7627     THEN
7628     	RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7629     END IF;
7630 
7631     --
7632     -- Initialize message list if p_init_msg_list is set to TRUE.
7633     --
7634     IF FND_API.to_Boolean( p_init_msg_list ) THEN
7635     	FND_MSG_PUB.initialize;
7636     END IF;
7637 
7638 
7639     --
7640     --  Initialize API return status to success
7641     --
7642     x_return_status := FND_API.G_RET_STS_SUCCESS;
7643 
7644 
7645 	-- Step 1: Get Clause values from the old get_article_details api
7646 
7647 	get_article_details(
7648 	    p_api_version        => p_api_version,
7649 	    p_init_msg_list      => p_init_msg_list,
7650 	    p_document_id        => p_document_id,
7651 	    p_document_type      => p_document_type,
7652 	    p_article_id         => p_article_id,
7653 	    p_effectivity_date   => p_effectivity_date,
7654 	    x_article_id         => l_article_id,
7655 	    x_article_version_id => l_article_version_id ,
7656 	    x_doc_lib            => l_doc_lib,
7657 	    x_return_status      => x_return_status,
7658 	    x_msg_count          => x_msg_count,
7659      	    x_msg_data           => x_msg_data);
7660 
7661 	IF (x_return_status <> FND_API.G_RET_STS_SUCCESS)
7662 	THEN
7663 		raise FND_API.G_EXC_UNEXPECTED_ERROR;
7664 	END IF;
7665 
7666 
7667 	-- Step 2: Get Clause title, description and  section info
7668 
7669 	--Bug#4757731 Get Clause Title and Clause Description
7670         OPEN csr_clause_details(p_article_id,l_article_version_id);
7671         FETCH csr_clause_details into x_article_title,x_article_description;
7672         CLOSE csr_clause_details;
7673 
7674 	IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7675 
7676 	  FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7677 		  '102: x_article_id  : '||l_article_id);
7678 	  FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7679 		  '102: x_article_version_id  : '||l_article_version_id);
7680 	  FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7681 		  '102: x_doc_lib   : '||l_doc_lib );
7682           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7683 		  '102: x_article_title  : '||x_article_title);
7684 	  FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7685 		  '102: x_article_description   : '||x_article_description );
7686 
7687         END IF;
7688 
7689         -- If expert suggested clause is made non-std on the document then x_article_title is null
7690         IF(x_article_title is  null) THEN
7691            OPEN get_doc_article_ver_id;
7692            FETCH get_doc_article_ver_id INTO l_article_id,l_article_version_id;
7693            CLOSE get_doc_article_ver_id;
7694 
7695            OPEN csr_clause_details(l_article_id,l_article_version_id);
7696            FETCH csr_clause_details into x_article_title,x_article_description;
7697            CLOSE csr_clause_details;
7698 
7699            IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7700 	    FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7701 		  '103: l_article_id  : '||l_article_id);
7702 	    FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7703 		  '103: l_article_version_id  : '||l_article_version_id);
7704 	    FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7705 		  '103: x_article_title  : '||x_article_title);
7706 	    FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7707 		  '103: x_article_description   : '||x_article_description );
7708 
7709           END IF;
7710 
7711         END IF;
7712 	--End Bug#4757731
7713 
7714         --Get Section Heading
7715 	IF l_doc_lib = 'L' THEN
7716 	   OPEN csr_lib_clause_desc_scn(p_article_id,l_article_version_id);
7717 	   FETCH csr_lib_clause_desc_scn INTO l_def_scn_code;
7718            CLOSE csr_lib_clause_desc_scn;
7719 
7720            l_scn_code := l_def_scn_code;
7721 
7722 	   OPEN csr_xprt_scn_code;
7723 	   FETCH csr_xprt_scn_code INTO l_xprt_scn_code;
7724            CLOSE csr_xprt_scn_code;
7725 
7726            IF l_def_scn_code = 'UNASSIGNED' THEN
7727 	     l_scn_code := l_xprt_scn_code;
7728            END IF;
7729 
7730 	   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7731 	    FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7732 		  '104: l_def_scn_code  : '||l_def_scn_code);
7733 	    FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7734 		  '104: l_xprt_scn_code  : '||l_xprt_scn_code);
7735 	    FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7736 		  '104: l_scn_code  : '|| l_scn_code);
7737            END IF;
7738 
7739            --Bug#4865126 Need to pass l_scn_code.Not l_xprt_scn_code
7740 	   OPEN l_get_lib_scn_csr(l_scn_code);
7741 	   FETCH l_get_lib_scn_csr INTO x_scn_heading;
7742            CLOSE l_get_lib_scn_csr;
7743 	END IF;
7744 
7745 	IF l_doc_lib = 'D' THEN
7746 	  OPEN l_get_doc_scn_csr(l_article_version_id);
7747 	  FETCH l_get_doc_scn_csr INTO x_scn_heading;
7748           CLOSE l_get_doc_scn_csr;
7749         END IF;
7750 
7751 
7752   -- end debug log
7753   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7754      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7755                     G_MODULE||l_api_name,
7756                     '1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
7757   END IF;
7758 
7759 EXCEPTION
7760 
7761       WHEN FND_API.G_EXC_ERROR THEN
7762 
7763   		x_return_status := FND_API.G_RET_STS_ERROR ;
7764   		FND_MSG_PUB.Count_And_Get(
7765   		        p_count => x_msg_count,
7766           		p_data => x_msg_data
7767   		);
7768 
7769       WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7770   		x_return_status := FND_API.G_RET_STS_ERROR ;
7771   		FND_MSG_PUB.Count_And_Get(
7772   		        p_count => x_msg_count,
7773           		p_data => x_msg_data
7774   		);
7775 
7776       WHEN OTHERS THEN
7777   		x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
7778 
7779     		IF FND_MSG_PUB.Check_Msg_Level
7780   		   (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
7781   		THEN
7782       	    	FND_MSG_PUB.Add_Exc_Msg(
7783       	    	     G_PKG_NAME  	    ,
7784       	    	     l_api_name
7785   	    	      );
7786   		END IF;
7787 
7788   		FND_MSG_PUB.Count_And_Get(
7789   		     p_count => x_msg_count,
7790           	     p_data => x_msg_data
7791   		);
7792 END get_article_details;
7793 
7794 PROCEDURE populate_terms_deviations_tbl(
7795     p_api_version                  IN NUMBER,
7796     p_init_msg_list                IN VARCHAR2,
7797     p_document_id                  IN NUMBER,
7798     p_document_type                IN VARCHAR2,
7799     p_sequence_id 	  	   IN NUMBER,
7800     p_config_header_id             IN NUMBER,
7801     p_config_rev_nbr               IN NUMBER,
7802     p_rule_qst_values_tbl	   IN dev_rule_qst_values_tbl_type,
7803     p_rule_var_values_tbl	   IN dev_rule_var_values_tbl_type,
7804     p_clause_tbl	           IN expert_articles_tbl_type,
7805     p_mode			   IN VARCHAR2,
7806     x_return_status                OUT NOCOPY VARCHAR2,
7807     x_msg_count                    OUT NOCOPY NUMBER,
7808     x_msg_data                     OUT NOCOPY VARCHAR2)
7809 IS
7810 
7811     l_api_version CONSTANT NUMBER := 1;
7812     l_api_name CONSTANT VARCHAR2(30) := 'populate_terms_deviations_tbl';
7813 
7814     j                           BINARY_INTEGER :=0;
7815     l_rule_name			okc_xprt_rule_hdrs_all.rule_name%TYPE;
7816     l_rule_description		okc_xprt_rule_hdrs_all.rule_description%TYPE;
7817     l_item_name			MTL_SYSTEM_ITEMS_VL.concatenated_segments%TYPE;
7818     l_item_description		MTL_SYSTEM_ITEMS_VL.description%TYPE;
7819 
7820     l_article_id           	NUMBER;
7821     l_article_version_id        NUMBER;
7822     l_article_title		VARCHAR2(2000);
7823     l_article_description	VARCHAR2(2000);
7824     l_doc_lib           	VARCHAR2(1);
7825     l_scn_heading		VARCHAR2(300);
7826 
7827     l_item_id                   NUMBER;
7828     l_org_id                    NUMBER;
7829     l_rule_var_values_tbl  dev_rule_var_values_tbl_type;
7830 
7831     --For Bug 5327362
7832     l_rule_qst_values_tbl  dev_rule_qst_values_tbl_type;
7833 
7834     --
7835     -- Currsor to Select Deviation Rule name and description
7836     --
7837     CURSOR l_get_rul_details_csr (p_rule_id NUMBER) IS
7838     SELECT rule_name,
7839            rule_description
7840       FROM okc_xprt_rule_hdrs_all
7841      WHERE rule_id = p_rule_id;
7842 
7843     --
7844     -- Currsor to Select Item name and Description
7845     --
7846     CURSOR l_get_item_details_csr (p_item_id NUMBER, p_org_id NUMBER) IS
7847     SELECT concatenated_segments,
7848            description
7849       FROM mtl_system_items_vl
7850      WHERE inventory_item_id = p_item_id
7851        AND organization_id = p_org_id;
7852 
7853     --
7854     -- Currsor to Select Item name and Description
7855     --
7856     CURSOR l_line_item_details_csr (p_line_number VARCHAR2) IS
7857     SELECT item_id,
7858            org_id
7859       FROM okc_xprt_deviations_t
7860      WHERE line_number = p_line_number
7861      and   run_id = p_sequence_id;
7862 
7863 BEGIN
7864 
7865 
7866   -- start debug log
7867   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7868      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7869                     G_MODULE||l_api_name,
7870                     '100: Entered '||G_PKG_NAME ||'.'||l_api_name);
7871      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7872                     G_MODULE||l_api_name,
7873                     'Parameters : ');
7874      -- Add Logs for printing deviations rule tbl
7875      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7876 		  G_MODULE||l_api_name,
7877 		  '101: p_document_id  : '||p_document_id);
7878      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7879 		  G_MODULE||l_api_name,
7880 		  '101: p_document_type : '||p_document_type);
7881      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7882 		  G_MODULE||l_api_name,
7883 		  '101: p_sequence_id : '||p_sequence_id);
7884      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7885 		  G_MODULE||l_api_name,
7886 		  '101: p_config_header_id : '||p_config_header_id);
7887      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7888 		  G_MODULE||l_api_name,
7889 		  '101: p_config_rev_nbr : '||p_config_rev_nbr);
7890      IF p_rule_qst_values_tbl IS NOT NULL THEN
7891      	IF p_rule_qst_values_tbl.count > 0 THEN
7892 		FOR i IN p_rule_qst_values_tbl.first..p_rule_qst_values_tbl.last LOOP
7893 		  IF p_rule_qst_values_tbl.EXISTS(i) THEN
7894 	     		FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7895 			    G_MODULE||l_api_name,
7896 			    'p_rule_qst_values_tbl.(' || i || ').rule_id : ' || to_char(p_rule_qst_values_tbl(i).rule_id));
7897 	     		FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7898 			    G_MODULE||l_api_name,
7899 			    'p_rule_qst_values_tbl.(' || i || ').question_id : ' || to_char(p_rule_qst_values_tbl(i).question_id));
7900 	     		FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7901 			    G_MODULE||l_api_name,
7902 			    'p_rule_qst_values_tbl.(' || i || ').question_value : ' || to_char(p_rule_qst_values_tbl(i).question_value));
7903 	  	  END IF;
7904 	  	END LOOP;
7905         END IF;
7906      END IF;
7907      IF p_rule_var_values_tbl IS NOT NULL THEN
7908      	IF p_rule_var_values_tbl.count > 0 THEN
7909 		FOR i IN p_rule_var_values_tbl.first..p_rule_var_values_tbl.last LOOP
7910 		  IF p_rule_var_values_tbl.EXISTS(i) THEN
7911 	     		FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7912 			    G_MODULE||l_api_name,
7913 			    'p_rule_var_values_tbl.(' || i || ').line_number : ' || to_char(p_rule_var_values_tbl(i).line_number));
7914 	     		FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7915 			    G_MODULE||l_api_name,
7916 			    'p_rule_var_values_tbl.(' || i || ').rule_id : ' || to_char(p_rule_var_values_tbl(i).rule_id));
7917 	     		FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7918 			    G_MODULE||l_api_name,
7919 			    'p_rule_var_values_tbl.(' || i || ').variable_id : ' || to_char(p_rule_var_values_tbl(i).variable_id));
7920 	     		FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7921 			    G_MODULE||l_api_name,
7922 			    'p_rule_var_values_tbl.(' || i || ').variable_value : ' || p_rule_var_values_tbl(i).variable_value);
7923 	  	   END IF;
7924 	  	END LOOP;
7925         END IF;
7926      END IF;
7927      IF p_clause_tbl IS NOT NULL THEN
7928      	IF p_clause_tbl.count > 0 THEN
7929 		FOR i IN p_clause_tbl.first..p_clause_tbl.last LOOP
7930 		  IF p_clause_tbl.EXISTS(i) THEN
7931 	     		FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
7932 			    G_MODULE||l_api_name,
7933 			    'p_clause_tbl.(' || i || ') : ' || to_char(p_clause_tbl(i)));
7934 	  	  END IF;
7935 	  	END LOOP;
7936         END IF;
7937      END IF;
7938   END IF;
7939 
7940     --
7941     -- Standard call to check for call compatibility.
7942     --
7943     IF NOT FND_API.Compatible_API_Call (l_api_version,
7944        	       	    	    	 	p_api_version,
7945         	    	    	    	l_api_name,
7946     		    	    	    	G_PKG_NAME)
7947     THEN
7948     	RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7949     END IF;
7950 
7951     --
7952     -- Initialize message list if p_init_msg_list is set to TRUE.
7953     --
7954     IF FND_API.to_Boolean( p_init_msg_list ) THEN
7955     	FND_MSG_PUB.initialize;
7956     END IF;
7957 
7958 
7959     --
7960     --  Initialize API return status to success
7961     --
7962     x_return_status := FND_API.G_RET_STS_SUCCESS;
7963 
7964     --In case of Buy side line_nubers will be null
7965     --if Line_Number is null then assign -99 as line_number
7966     l_rule_var_values_tbl := p_rule_var_values_tbl;
7967     IF l_rule_var_values_tbl IS NOT NULL THEN
7968       IF l_rule_var_values_tbl.count > 0 THEN
7969     	FOR i IN l_rule_var_values_tbl.first..l_rule_var_values_tbl.last LOOP
7970     	  IF l_rule_var_values_tbl.EXISTS(i) THEN
7971              if(l_rule_var_values_tbl(i).line_number is null) then
7972                  l_rule_var_values_tbl(i).line_number := '-99';
7973              end if;
7974 	     -- Begin: Fix for bug 5182270
7975              if (is_rule_line_level(l_rule_var_values_tbl(i).rule_id) = 'N') then
7976                  l_rule_var_values_tbl(i).line_number := '-99';
7977              end if;
7978 	     -- End: Fix for bug 5182270
7979 	     -- Begin: Fix for bug 5327362
7980              if (is_rule_line_level(l_rule_var_values_tbl(i).rule_id) = 'Y' and
7981                  l_rule_var_values_tbl(i).line_number = '-99') then
7982                  l_rule_var_values_tbl.DELETE(i);
7983              end if;
7984 	     -- End: Fix for bug 5327362
7985 	  END IF;
7986   	END LOOP;
7987       END IF;
7988     END IF;
7989 
7990 	     -- Begin: Fix for bug 5327362
7991     l_rule_qst_values_tbl := p_rule_qst_values_tbl;
7992     IF l_rule_qst_values_tbl IS NOT NULL THEN
7993       IF l_rule_qst_values_tbl.count > 0 THEN
7994     	FOR i IN l_rule_qst_values_tbl.first..l_rule_qst_values_tbl.last LOOP
7995     	  IF l_rule_qst_values_tbl.EXISTS(i) THEN
7996              if (is_rule_line_level(l_rule_qst_values_tbl(i).rule_id) = 'Y') then
7997                  l_rule_qst_values_tbl.DELETE(i);
7998              end if;
7999 	  END IF;
8000   	END LOOP;
8001       END IF;
8002     END IF;
8003     -- End: Fix for bug 5327362
8004 
8005 
8006     --
8007     -- Insert Variable value into temp table
8008     --
8009     IF l_rule_var_values_tbl.count > 0 THEN
8010     FOR i IN l_rule_var_values_tbl.FIRST..l_rule_var_values_tbl.LAST
8011     LOOP
8012 	  IF l_rule_var_values_tbl.EXISTS(i) THEN
8013 	    OPEN  l_get_rul_details_csr(l_rule_var_values_tbl(i).rule_id);
8014 	    FETCH l_get_rul_details_csr INTO l_rule_name,l_rule_description;
8015 	    CLOSE l_get_rul_details_csr;
8016 
8017 	    OPEN  l_line_item_details_csr(l_rule_var_values_tbl(i).line_number);
8018 	    FETCH l_line_item_details_csr INTO l_item_id,l_org_id;
8019 	    CLOSE l_line_item_details_csr;
8020 
8021 	    OPEN  l_get_item_details_csr(l_item_id,l_org_id);
8022 	    FETCH l_get_item_details_csr INTO l_item_name,l_item_description;
8023 	    CLOSE l_get_item_details_csr;
8024 
8025 
8026 	-- Insert header variables into okc_terms_deviations_t
8027 
8028 
8029 	    INSERT INTO OKC_TERMS_DEVIATIONS_T
8030 	    (
8031 	     SEQUENCE_ID,
8032 	     DOCUMENT_TYPE,
8033 	     DOCUMENT_ID,
8034 	     DEVIATION_TYPE,
8035 	     RULE_ID,
8036 	     DEVIATION_CODE,
8037 	     DEVIATION_CODE_MEANING,
8038 	     LINE_NUMBER,
8039 	     ITEM_NAME,
8040 	     ITEM_DESCRIPTION,
8041 	     OBJECT_TYPE,
8042 	     OBJECT_CODE,
8043 	     OBJECT_DESCRIPTION,
8044 	     DOCUMENT_VALUE,
8045 	     CONFIG_HEADER_ID,
8046 	     CONFIG_REVISION_NUMBER
8047 	    )
8048 	    VALUES
8049 	    (
8050 	     p_sequence_id,  		     		     	                                        --SEQUENCE_ID,
8051            p_document_type,		     		     	                                        --DOCUMENT_TYPE,
8052 	     p_document_id,		     		     		                                --DOCUMENT_ID,
8053 	     'P',			     		     			                        --DEVIATION_TYPE,
8054 	     l_rule_var_values_tbl(i).rule_id,  	     	                                        --RULE_ID,
8055 	     l_rule_name,		     		     		                                --DEVIATION_CODE,
8056 	     l_rule_description,	     			     	                                --DEVIATION_CODE_MEANING,
8057            l_rule_var_values_tbl(i).line_number,	     	                                        --LINE_NUMBER,
8058 	     -- Begin: Fix for bug 5182270.If line_number is -99 then putting NULL for Item and Item Desc.So that
8059            -- in VO query Distinct Clause can remove duplicate header level rules
8060            DECODE(l_rule_var_values_tbl(i).line_number,'-99',NULL,l_item_name),			--ITEM_NAME,
8061            DECODE(l_rule_var_values_tbl(i).line_number,'-99',NULL,l_item_description),		--ITEM_DESCRIPTION,
8062 	     'VARIABLE',		     	--OBJECT_TYPE,
8063 	     l_rule_var_values_tbl(i).variable_id,   	--OBJECT_VALUE,
8064 	     null,					     			                        --OBJECT_DESCRIPTION,
8065 	     DECODE(l_rule_var_values_tbl(i).line_number,'-99',NULL,l_rule_var_values_tbl(i).variable_value),   --DOCUMENT_VALUE,
8066 	     -- End: Fix for bug 5182270
8067 	     p_config_header_id,			     			                        --CONFIG_HEADER_ID,
8068 	     p_config_rev_nbr				    	 		                        --CONFIG_REVISION_NUMBER
8069 	    );
8070 
8071        END IF;
8072     END LOOP;
8073     END IF;
8074 
8075     --
8076     -- Select Question responses in to temp table
8077     --
8078     IF l_rule_qst_values_tbl.count > 0 THEN
8079     FOR i IN l_rule_qst_values_tbl.FIRST..l_rule_qst_values_tbl.LAST
8080     LOOP
8081        IF l_rule_qst_values_tbl.EXISTS(i) THEN
8082 
8083 	    OPEN  l_get_rul_details_csr(l_rule_qst_values_tbl(i).rule_id);
8084 	    FETCH l_get_rul_details_csr INTO l_rule_name,l_rule_description;
8085 	    CLOSE l_get_rul_details_csr;
8086 
8087 	    --OPEN  l_get_item_details_csr(l_rule_qst_values_tbl(i).rule_id);
8088 	    --FETCH l_get_item_details_csr INTO l_item_name,l_item_description;
8089 	    --CLOSE l_get_item_details_csr;
8090 
8091 
8092 	-- Insert header variables into okc_terms_deviations_t
8093 
8094 
8095 	    INSERT INTO OKC_TERMS_DEVIATIONS_T
8096 	    (
8097 	     SEQUENCE_ID,
8098 	     DOCUMENT_TYPE,
8099 	     DOCUMENT_ID,
8100 	     DEVIATION_TYPE,
8101 	     RULE_ID,
8102 	     DEVIATION_CODE,
8103 	     DEVIATION_CODE_MEANING,
8104 	     LINE_NUMBER,
8105 	     ITEM_NAME,
8106 	     ITEM_DESCRIPTION,
8107 	     OBJECT_TYPE,
8108 	     OBJECT_CODE,
8109 	     OBJECT_DESCRIPTION,
8110 	     DOCUMENT_VALUE,
8111 	     CONFIG_HEADER_ID,
8112 	     CONFIG_REVISION_NUMBER
8113 	    )
8114 	    VALUES
8115 	    (
8116 	     p_sequence_id,  		     		     --SEQUENCE_ID,
8117           p_document_type,		     		     --DOCUMENT_TYPE,
8118 	     p_document_id,		     		     --DOCUMENT_ID,
8119 	     'P',			     		     --DEVIATION_TYPE,
8120 	     l_rule_qst_values_tbl(i).rule_id,  	     --RULE_ID,
8121 	     l_rule_name,		     		     --DEVIATION_CODE,
8122 	     l_rule_description,	     		     --DEVIATION_CODE_MEANING,
8123              --NULL                                ,           --LINE_NUMBER,
8124              '-99', -- l_rule_qst_values_tbl(i).line_number,   --LINE_NUMBER,
8125 	     null,		     	    	     	     --ITEM_NAME,
8126              null,	     		     	     	     --ITEM_DESCRIPTION,
8127 	     'QUESTION',		     		     --OBJECT_TYPE,
8128 	     l_rule_qst_values_tbl(i).question_id,	     --OBJECT_VALUE,
8129 	     null,					     --OBJECT_DESCRIPTION,
8130 	     l_rule_qst_values_tbl(i).question_value,  	     --DOCUMENT_VALUE,
8131 	     p_config_header_id,			     --CONFIG_HEADER_ID,
8132 	     p_config_rev_nbr			     	     --CONFIG_REVISION_NUMBER
8133 	    );
8134        END IF;
8135     END LOOP;
8136     END IF;
8137 
8138     --
8139     -- Insert Clause details into temp table
8140     --
8141     IF (p_clause_tbl.COUNT > 0 AND p_mode <> 'BV') THEN
8142     FOR i IN p_clause_tbl.FIRST..p_clause_tbl.LAST
8143     LOOP
8144       IF p_clause_tbl.EXISTS(i) THEN
8145  	get_article_details(
8146 		    p_api_version        	  => 1.0,
8147 		    p_init_msg_list      	  => FND_API.G_FALSE,
8148 		    p_document_type           	  => p_document_type,
8149 		    p_document_id             	  => p_document_id,
8150 		    p_article_id        	  => p_clause_tbl(i),
8151 		    p_effectivity_date      	  => sysdate,
8152 		    x_article_id           	  => l_article_id,
8153 		    x_article_version_id          => l_article_version_id,
8154 		    x_article_title		  => l_article_title,
8155 		    x_article_description	  => l_article_description,
8156 		    x_doc_lib           	  => l_doc_lib,
8157 		    x_scn_heading		  => l_scn_heading,
8158 		    x_return_status		  => x_return_status,
8159 		    x_msg_count			  => x_msg_count,
8160 		    x_msg_data			  => x_msg_data);
8161 
8162 	IF (x_return_status <> FND_API.G_RET_STS_SUCCESS)
8163 	THEN
8164 		raise FND_API.G_EXC_UNEXPECTED_ERROR;
8165 	END IF;
8166 
8167 	-- Insert Clause details into okc_terms_deviations_t
8168 
8169 
8170 	    INSERT INTO OKC_TERMS_DEVIATIONS_T
8171 	    (
8172 	     SEQUENCE_ID,
8173 	     DOCUMENT_TYPE,
8174 	     DOCUMENT_ID,
8175 	     DEVIATION_TYPE,
8176 	     DOC_ARTICLE_ID,
8177 	     DOC_ARTICLE_VERSION_ID,
8178 	     ARTICLE_TITLE,
8179 	     ARTICLE_DESCRIPTION,
8180 	     SECTION_HEADING,
8181 	     CONFIG_HEADER_ID,
8182 	     CONFIG_REVISION_NUMBER
8183 	    )
8184 	    VALUES
8185 	    (
8186 	     p_sequence_id,  		     		     --SEQUENCE_ID,
8187              p_document_type,		     		     --DOCUMENT_TYPE,
8188 	     p_document_id,		     		     --DOCUMENT_ID,
8189 	     'C',			     		     --DEVIATION_TYPE,
8190 	     p_clause_tbl(i),				     --DOC_ARTICLE_ID,
8191 	     NULL,		     		             --DOC_ARTICLE_VERSION_ID
8192 	     l_article_title,	     		                     --ARTICLE_TITLE,
8193 	     l_article_description,   		     		     --ARTICLE_DESCRIPTION,
8194              l_scn_heading, 					     --SECTION_HEADING,
8195 	     p_config_header_id,			     --CONFIG_HEADER_ID,
8196 	     p_config_rev_nbr			     	     --CONFIG_REVISION_NUMBER
8197 	    );
8198        END IF;
8199     END LOOP;
8200     END IF;
8201 
8202   -- end debug log
8203   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8204      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8205                     G_MODULE||l_api_name,
8206                     '1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
8207   END IF;
8208 
8209 EXCEPTION
8210 
8211       WHEN FND_API.G_EXC_ERROR THEN
8212 
8213   		x_return_status := FND_API.G_RET_STS_ERROR ;
8214   		FND_MSG_PUB.Count_And_Get(
8215   		        p_count => x_msg_count,
8216           		p_data => x_msg_data
8217   		);
8218 
8219       WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
8220   		x_return_status := FND_API.G_RET_STS_ERROR ;
8221   		FND_MSG_PUB.Count_And_Get(
8222   		        p_count => x_msg_count,
8223           		p_data => x_msg_data
8224   		);
8225 
8226       WHEN OTHERS THEN
8227   		x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
8228 
8229     		IF FND_MSG_PUB.Check_Msg_Level
8230   		   (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
8231   		THEN
8232       	    	FND_MSG_PUB.Add_Exc_Msg(
8233       	    	     G_PKG_NAME  	    ,
8234       	    	     l_api_name
8235   	    	      );
8236   		END IF;
8237 
8238   		FND_MSG_PUB.Count_And_Get(
8239   		     p_count => x_msg_count,
8240           	     p_data => x_msg_data
8241   		);
8242 
8243 END populate_terms_deviations_tbl;
8244 
8245 
8246 PROCEDURE get_expert_results(
8247     p_api_version                  IN NUMBER,
8248     p_init_msg_list                IN VARCHAR2,
8249     p_document_id                  IN NUMBER,
8250     p_document_type                IN VARCHAR2,
8251     p_config_header_id             IN NUMBER,
8252     p_config_rev_nbr               IN NUMBER,
8253     p_mode		           IN VARCHAR2,
8254     p_sequence_id 	  	   IN OUT NOCOPY NUMBER,
8255     x_return_status                OUT NOCOPY VARCHAR2,
8256     x_msg_count                    OUT NOCOPY NUMBER,
8257     x_msg_data                     OUT NOCOPY VARCHAR2)
8258 IS
8259 
8260     l_api_version CONSTANT NUMBER := 1;
8261     l_api_name CONSTANT VARCHAR2(30) := 'get_expert_results';
8262 
8263     j                           BINARY_INTEGER :=0;
8264 
8265     l_hdr_var_value_tbl 	OKC_XPRT_XRULE_VALUES_PVT.var_value_tbl_type;
8266     l_line_sysvar_value_tbl 	OKC_XPRT_XRULE_VALUES_PVT.line_sys_var_value_tbl_type;
8267     l_line_count		NUMBER;
8268     l_line_variables_count      NUMBER;
8269     l_intent			VARCHAR2(1);
8270     l_org_id			NUMBER;
8271 
8272     l_expert_clauses_tbl	expert_articles_tbl_type;
8273     l_expert_deviations_tbl     dev_rule_tbl_type;
8274     l_rule_questions_tbl	dev_rule_questions_tbl_type;
8275     l_rule_variables_tbl	dev_rule_variables_tbl_type;
8276     l_rule_var_values_tbl	dev_rule_var_values_tbl_type;
8277     l_rule_qst_values_tbl	dev_rule_qst_values_tbl_type;
8278 
8279 BEGIN
8280 
8281 
8282   -- start debug log
8283   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8284      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8285                     G_MODULE||l_api_name,
8286                     '100: Entered '||G_PKG_NAME ||'.'||l_api_name);
8287      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8288                     G_MODULE||l_api_name,
8289                     'Parameters : ');
8290      -- Add Logs for printing deviations rule tbl
8291      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8292 		  G_MODULE||l_api_name,
8293 		  '101: p_document_id  : '||p_document_id);
8294      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8295 		  G_MODULE||l_api_name,
8296 		  '101: p_document_type : '||p_document_type);
8297      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8298 		  G_MODULE||l_api_name,
8299 		  '101: p_config_header_id : '||p_config_header_id);
8300      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8301 		  G_MODULE||l_api_name,
8302 		  '101: p_config_rev_nbr : '||p_config_rev_nbr);
8303      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8304 		  G_MODULE||l_api_name,
8305 		  '101: p_mode : '||p_mode);
8306      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8307 		  G_MODULE||l_api_name,
8308 		  '101: p_sequence_id : '||p_sequence_id);
8309 
8310   END IF;
8311 
8312     --
8313     -- Standard call to check for call compatibility.
8314     --
8315     IF NOT FND_API.Compatible_API_Call (l_api_version,
8316        	       	    	    	 	p_api_version,
8317         	    	    	    	l_api_name,
8318     		    	    	    	G_PKG_NAME)
8319     THEN
8320     	RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8321     END IF;
8322 
8323     --
8324     -- Initialize message list if p_init_msg_list is set to TRUE.
8325     --
8326     IF FND_API.to_Boolean( p_init_msg_list ) THEN
8327     	FND_MSG_PUB.initialize;
8328     END IF;
8329 
8330     --
8331     -- Check mode and set value for p_sequence_id for 'RUN' - runtime mode only
8332     -- as the value of p_sequence_id is passed in the 'BV' mode
8333     --
8334     IF (p_mode = 'RUN') THEN
8335         SELECT OKC_TERMS_DEVIATIONS_S1.nextval INTO p_sequence_id from DUAL;
8336     END IF;
8337 
8338 
8339     --
8340     --  Initialize API return status to success
8341     --
8342     x_return_status := FND_API.G_RET_STS_SUCCESS;
8343 
8344 	-- Step 1: Get Document values from the Extension rule api
8345 
8346    	        IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8347 		     FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8348 				    G_MODULE||l_api_name,
8349 				    '110: Step 1: Get Document values from the Extension rule api');
8350 	        END IF;
8351 
8352 		OKC_XPRT_XRULE_VALUES_PVT.get_document_values (
8353 		    p_api_version        	  => 1.0,
8354 		    p_init_msg_list      	  => FND_API.G_FALSE,
8355 		    p_doc_type           	  => p_document_type,
8356 		    p_doc_id             	  => p_document_id,
8357 		    x_return_status      	  => x_return_status,
8358 		    x_msg_data           	  => x_msg_data,
8359 		    x_msg_count          	  => x_msg_count,
8360 		    x_hdr_var_value_tbl           => l_hdr_var_value_tbl,
8361 		    x_line_sysvar_value_tbl       => l_line_sysvar_value_tbl,
8362 		    x_line_count		  => l_line_count,
8363 		    x_line_variables_count        => l_line_variables_count,
8364 		    x_intent                      => l_intent,
8365 		    x_org_id 			  => l_org_id);
8366 
8367 		    IF (x_return_status <> FND_API.G_RET_STS_SUCCESS)
8368      	      	    THEN
8369 			raise FND_API.G_EXC_UNEXPECTED_ERROR;
8370 		    END IF;
8371 
8372 
8373 	-- Step 2: Insert values into okc_xprt_deviations_gt
8374 
8375    	        IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8376 		     FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8377 				    G_MODULE||l_api_name,
8378 				    '120: Step 2: Insert values into okc_xprt_deviations_gt');
8379 	        END IF;
8380 
8381    	        IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8382 		     FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8383 				    G_MODULE||l_api_name,
8384 				    '121: l_hdr_var_value_tbl.COUNT :' || TO_CHAR(l_hdr_var_value_tbl.COUNT));
8385 	        END IF;
8386 
8387 		  IF l_hdr_var_value_tbl.COUNT > 0 THEN
8388 
8389 		    FOR i IN l_hdr_var_value_tbl.FIRST..l_hdr_var_value_tbl.LAST
8390 		    LOOP
8391 			IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8392 			     FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8393 					    G_MODULE||l_api_name,
8394 					    '122: l_hdr_var_value_tbl( '|| i || ').variable_code :' || l_hdr_var_value_tbl(i).variable_code);
8395 			     FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8396 					    G_MODULE||l_api_name,
8397 					    '123: l_hdr_var_value_tbl( '|| i || ').variable_value_id :' || l_hdr_var_value_tbl(i).variable_value_id);
8398 			END IF;
8399 
8400 
8401 		       -- Insert header variables into okc_xprt_deviations_gt
8402 
8403 			    INSERT INTO OKC_XPRT_DEVIATIONS_T
8404 			    (
8405 			     RUN_ID,
8406 			     LINE_NUMBER,
8407 			     VARIABLE_CODE,
8408 			     VARIABLE_VALUE,
8409 			     ITEM_ID,
8410 			     ORG_ID,
8411 			     CREATION_DATE
8412 			    )
8413 			    VALUES
8414 			    (
8415 			     p_sequence_id,                            -- RUN_ID
8416 			     '-99',                                    -- LINE_NUMBER
8417 			     l_hdr_var_value_tbl(i).variable_code,     -- VARIABLE_CODE
8418 			     l_hdr_var_value_tbl(i).variable_value_id, -- VARIABLE_VALUE
8419 			     NULL, 				       -- ITEM_ID
8420 			     NULL, 				       -- ORG_ID
8421 			     SYSDATE
8422 			    );
8423 		    END LOOP;
8424 		  END IF;
8425 
8426 
8427    	        IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8428 		     FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8429 				    G_MODULE||l_api_name,
8430 				    '124: l_line_sysvar_value_tbl.COUNT :' || TO_CHAR(l_line_sysvar_value_tbl.COUNT));
8431 	        END IF;
8432 
8433 		  IF l_line_sysvar_value_tbl.COUNT > 0 THEN
8434 
8435 		    FOR i IN l_line_sysvar_value_tbl.FIRST..l_line_sysvar_value_tbl.LAST
8436 		    LOOP
8437 
8438 			IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8439 			     FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8440 					    G_MODULE||l_api_name,
8441 					    '125: l_line_sysvar_value_tbl( '|| i || ').line_number :' || l_line_sysvar_value_tbl(i).line_number);
8442 			     FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8443 					    G_MODULE||l_api_name,
8444 					    '126: l_line_sysvar_value_tbl( '|| i || ').variable_code :' || l_line_sysvar_value_tbl(i).variable_code);
8445 			     FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8446 					    G_MODULE||l_api_name,
8447 					    '127: l_line_sysvar_value_tbl( '|| i || ').variable_value :' || l_line_sysvar_value_tbl(i).variable_value);
8448 			     FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8449 					    G_MODULE||l_api_name,
8450 					    '128: l_line_sysvar_value_tbl( '|| i || ').item_id :' || l_line_sysvar_value_tbl(i).item_id);
8451 			     FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8452 					    G_MODULE||l_api_name,
8453 					    '129: l_line_sysvar_value_tbl( '|| i || ').org_id :' || l_line_sysvar_value_tbl(i).org_id);
8454 			END IF;
8455 
8456 		       -- Insert line variables into okc_xprt_deviations_t
8457 
8458 			    INSERT INTO OKC_XPRT_DEVIATIONS_T
8459 			    (
8460 			     RUN_ID,
8461 			     LINE_NUMBER,
8462 			     VARIABLE_CODE,
8463 			     VARIABLE_VALUE,
8464 			     ITEM_ID,
8465 			     ORG_ID,
8466 			     CREATION_DATE
8467 			    )
8468 			    VALUES
8469 			    (
8470 			     p_sequence_id,
8471 			     l_line_sysvar_value_tbl(i).line_number,   -- LINE_NUMBER
8472 			     l_line_sysvar_value_tbl(i).variable_code, -- VARIABLE_CODE
8473 			     l_line_sysvar_value_tbl(i).variable_value,-- VARIABLE_VALUE
8474 			     l_line_sysvar_value_tbl(i).item_id,       -- ITEM_ID
8475 			     l_line_sysvar_value_tbl(i).org_id,         -- ORG_ID
8476 			     SYSDATE
8477 			    );
8478 		    END LOOP;
8479 		  END IF;
8480 
8481 
8482 	  -- Step 3: Get Clauses and Deviations from cz_config_items_v
8483 
8484    	        IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8485 		     FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8486 				    G_MODULE||l_api_name,
8487 				    '130: Step 3: Get Clauses and Deviations from cz_config_items_v');
8488 	        END IF;
8489 
8490                     get_expert_selections(
8491                        p_api_version      	=> 1.0,
8492                        p_init_msg_list    	=> FND_API.G_FALSE,
8493                        p_document_id      	=> p_document_id,
8494                        p_document_type          => p_document_type,
8495                        p_config_header_id 	=> p_config_header_id,
8496                        p_config_rev_nbr   	=> p_config_rev_nbr,
8497                        x_expert_clauses_tbl     => l_expert_clauses_tbl,
8498                        x_expert_deviations_tbl  => l_expert_deviations_tbl,
8499                        x_return_status    	=> x_return_status,
8500                        x_msg_data         	=> x_msg_data,
8501                        x_msg_count        	=> x_msg_count);
8502 
8503 
8504 		      IF (x_return_status <> FND_API.G_RET_STS_SUCCESS)
8505 		      THEN
8506 			raise FND_API.G_EXC_UNEXPECTED_ERROR;
8507 		      END IF;
8508 
8509 
8510 	 -- Step 4: For each Deviation rule get unique list of variables and Questions
8511 
8512    	        IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8513 		     FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8514 				    G_MODULE||l_api_name,
8515 				    '140: Step 4: For each Deviation rule get unique list of variables and Questions');
8516 	        END IF;
8517 
8518 	        IF l_expert_deviations_tbl.COUNT > 0 THEN
8519 		    get_rule_details(
8520 		       p_api_version      	=> 1.0,
8521 		       p_init_msg_list    	=> FND_API.G_FALSE,
8522 		       p_dev_rule_tbl      	=> l_expert_deviations_tbl,
8523 		       x_dev_rule_questions_tbl => l_rule_questions_tbl,
8524 		       x_dev_rule_variables_tbl => l_rule_variables_tbl,
8525 		       x_return_status    	=> x_return_status,
8526 		       x_msg_data         	=> x_msg_data,
8527 		       x_msg_count        	=> x_msg_count);
8528 
8529 
8530 		      IF (x_return_status <> FND_API.G_RET_STS_SUCCESS)
8531 		      THEN
8532 			raise FND_API.G_EXC_UNEXPECTED_ERROR;
8533 		      END IF;
8534 
8535 
8536 	  -- Step 5: For variables in rule get value from okc_xprt_deviations_gt
8537 
8538 	IF l_rule_variables_tbl.COUNT > 0 THEN
8539    	        IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8540 		     FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8541 				    G_MODULE||l_api_name,
8542 				    '150: Step 5: For variables in rule get value from okc_xprt_deviations_gt');
8543 	        END IF;
8544 
8545                     get_rule_variable_values(
8546                        p_api_version      	 => 1.0,
8547                        p_init_msg_list    	 => FND_API.G_FALSE,
8548                        p_sequence_id		 => p_sequence_id,
8549                        p_dev_rule_variables_tbl  => l_rule_variables_tbl,
8550                        x_dev_rule_var_values_tbl => l_rule_var_values_tbl,
8551                        x_return_status    	 => x_return_status,
8552                        x_msg_data         	 => x_msg_data,
8553                        x_msg_count        	 => x_msg_count);
8554 
8555 		      IF (x_return_status <> FND_API.G_RET_STS_SUCCESS)
8556 		      THEN
8557 			raise FND_API.G_EXC_UNEXPECTED_ERROR;
8558 		      END IF;
8559 	END IF;
8560 
8561 
8562 	  -- Step 6: For questions in rule get value from cz_config_items_v
8563 
8564 	IF l_rule_questions_tbl.COUNT > 0 THEN
8565    	        IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8566 		     FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8567 				    G_MODULE||l_api_name,
8568 				    '160: Step 6: For questions in rule get value from cz_config_items_v');
8569 	        END IF;
8570 
8571                     get_rule_question_values(
8572                        p_api_version      	 => 1.0,
8573                        p_init_msg_list    	 => FND_API.G_FALSE,
8574                        p_config_header_id        => p_config_header_id,
8575                        p_config_rev_nbr          => p_config_rev_nbr,
8576                        p_dev_rule_questions_tbl  => l_rule_questions_tbl,
8577                        x_dev_rule_qst_values_tbl => l_rule_qst_values_tbl,
8578                        x_return_status    	 => x_return_status,
8579                        x_msg_data         	 => x_msg_data,
8580                        x_msg_count        	 => x_msg_count);
8581 
8582 
8583 		      IF (x_return_status <> FND_API.G_RET_STS_SUCCESS)
8584 		      THEN
8585 			raise FND_API.G_EXC_UNEXPECTED_ERROR;
8586 		      END IF;
8587 
8588 	     END IF; -- Check for presence of Deviations from Expert
8589 	END IF;
8590 
8591 	  -- Step 7: Insert Clauses and Terms deviations into okc_terms_deviations_t
8592 
8593    	        IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8594 		     FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8595 				    G_MODULE||l_api_name,
8596 				    '170: Step 7: Insert Clauses and Terms deviations into okc_terms_deviations_t');
8597 	        END IF;
8598 
8599                     populate_terms_deviations_tbl(
8600                        p_api_version      	=> 1.0,
8601                        p_init_msg_list    	=> FND_API.G_FALSE,
8602                        p_document_id      	=> p_document_id,
8603                        p_document_type          => p_document_type,
8604                        p_sequence_id		=> p_sequence_id,
8605                        p_config_header_id 	=> p_config_header_id,
8606                        p_config_rev_nbr   	=> p_config_rev_nbr,
8607                        p_rule_qst_values_tbl    => l_rule_qst_values_tbl,
8608                        p_rule_var_values_tbl    => l_rule_var_values_tbl,
8609                        p_clause_tbl		=> l_expert_clauses_tbl,
8610                        p_mode			=> p_mode,
8611                        x_return_status    	=> x_return_status,
8612                        x_msg_data         	=> x_msg_data,
8613                        x_msg_count        	=> x_msg_count);
8614 
8615 
8616 		      IF (x_return_status <> FND_API.G_RET_STS_SUCCESS)
8617 		      THEN
8618 			raise FND_API.G_EXC_UNEXPECTED_ERROR;
8619 		      END IF;
8620 
8621 
8622   -- end debug log
8623   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8624      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8625                     G_MODULE||l_api_name,
8626                     '1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
8627   END IF;
8628 
8629 EXCEPTION
8630 
8631       WHEN FND_API.G_EXC_ERROR THEN
8632 
8633   		x_return_status := FND_API.G_RET_STS_ERROR ;
8634   		FND_MSG_PUB.Count_And_Get(
8635   		        p_count => x_msg_count,
8636           		p_data => x_msg_data
8637   		);
8638 
8639       WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
8640   		x_return_status := FND_API.G_RET_STS_ERROR ;
8641   		FND_MSG_PUB.Count_And_Get(
8642   		        p_count => x_msg_count,
8643           		p_data => x_msg_data
8644   		);
8645 
8646       WHEN OTHERS THEN
8647   		x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
8648 
8649     		IF FND_MSG_PUB.Check_Msg_Level
8650   		   (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
8651   		THEN
8652       	    	FND_MSG_PUB.Add_Exc_Msg(
8653       	    	     G_PKG_NAME  	    ,
8654       	    	     l_api_name
8655   	    	      );
8656   		END IF;
8657 
8658   		FND_MSG_PUB.Count_And_Get(
8659   		     p_count => x_msg_count,
8660           	     p_data => x_msg_data
8661   		);
8662 
8663 END get_expert_results;
8664 
8665 ---------------------------------------------------
8666 --  Function:
8667 ---------------------------------------------------
8668 FUNCTION check_template_has_questions (
8669     p_template_id    IN NUMBER
8670 )
8671 RETURN VARCHAR2 IS
8672 
8673 CURSOR c1 IS
8674 --Check if the Template has Active rules with questions
8675 SELECT 'X'
8676 FROM okc_xprt_question_orders
8677 WHERE question_rule_status = 'ACTIVE'
8678 AND template_id = p_template_id;
8679 
8680 l_value  VARCHAR2(1) := 'N';
8681 l_dummy  VARCHAR2(1);
8682 
8683 BEGIN
8684 
8685   OPEN c1;
8686   FETCH c1 INTO l_dummy;
8687   IF c1%FOUND THEN
8688     l_value := 'Y';
8689   END IF;
8690   CLOSE c1;
8691 
8692  RETURN l_value;
8693 EXCEPTION
8694  WHEN OTHERS THEN
8695       --close cursors
8696      IF c1%ISOPEN THEN
8697        CLOSE c1;
8698      END IF;
8699      l_value := 'N';
8700      RETURN l_value;
8701 END check_template_has_questions;
8702 
8703 
8704 
8705 /*========================================================================+
8706          Procedure:  contract_expert_bv
8707          Description:  For R12 - Support for line level deviations
8708 +========================================================================*/
8709 
8710 PROCEDURE contract_expert_bv(
8711     p_api_version                  IN NUMBER,
8712     p_init_msg_list                IN VARCHAR2,
8713     p_document_id                  IN NUMBER,
8714     p_document_type                IN VARCHAR2,
8715     p_bv_mode                      IN VARCHAR2 , -- QA is only valid mode in 11.5.10;
8716                                                  -- Deviation pushed to post 11.5.10.
8717     p_sequence_id 	  	   IN NUMBER,
8718     x_qa_result_tbl                IN OUT NOCOPY OKC_TERMS_QA_GRP.qa_result_tbl_type,
8719     x_expert_articles_tbl          OUT NOCOPY expert_articles_tbl_type,
8720     x_return_status                OUT NOCOPY VARCHAR2,
8721     x_msg_count                    OUT NOCOPY NUMBER,
8722     x_msg_data                     OUT NOCOPY VARCHAR2)
8723 
8724 IS
8725 
8726     L_COMPLETE VARCHAR2(10);
8727     L_VALID VARCHAR2(10);
8728 
8729     l_api_name CONSTANT VARCHAR2(30) := 'contract_expert_bv';
8730     l_api_version CONSTANT NUMBER := 1;
8731 
8732     -- Expert Profile Value and Template Expert Flag
8733     l_ce_enabled                VARCHAR2(50);
8734     l_template_ce_enabled       okc_terms_templates_all.contract_expert_enabled%TYPE;
8735 
8736     -- Header Information related local variables
8737     l_config_header_id NUMBER;
8738     l_config_rev_nbr NUMBER;
8739     l_new_config_header_id NUMBER;
8740     l_new_config_rev_nbr NUMBER;
8741     l_template_id    NUMBER;
8742     l_publication_id NUMBER;
8743     l_valid_config VARCHAR2(10);
8744     l_complete_config VARCHAR2(10);
8745     l_qa_tbl_index NUMBER;
8746     l_sequence_id NUMBER;
8747 
8748     l_cz_xml_init_msg VARCHAR2(2000);
8749     l_xml_terminate_msg LONG;
8750     l_cz_cfg_msgs CZ_CF_API.CFG_OUTPUT_PIECES;
8751     l_validation_status NUMBER;
8752 
8753     -- Severity related local variables
8754     l_expert_not_applied_sev      OKC_QA_ERRORS_T.ERROR_SEVERITY%TYPE;
8755     l_expert_not_applied_sev_e      OKC_QA_ERRORS_T.ERROR_SEVERITY%TYPE;
8756     l_expert_not_applied_sev_w      OKC_QA_ERRORS_T.ERROR_SEVERITY%TYPE;
8757     l_expert_not_applied_desc          OKC_QA_ERRORS_T.PROBLEM_SHORT_DESC%TYPE;
8758     l_perf_expert_not_applied    VARCHAR2(1);
8759 
8760     l_expert_partially_run_desc     OKC_QA_ERRORS_T.PROBLEM_SHORT_DESC%TYPE;
8761     l_expert_partially_run_sev      OKC_QA_ERRORS_T.ERROR_SEVERITY%TYPE;
8762     l_perf_expert_partially_run     VARCHAR2(1);
8763 
8764     l_invalid_config_sev      OKC_QA_ERRORS_T.ERROR_SEVERITY%TYPE;
8765     l_invalid_config_desc          OKC_QA_ERRORS_T.PROBLEM_SHORT_DESC%TYPE;
8766     l_perf_invalid_config    VARCHAR2(1);
8767 
8768     l_incomplt_config_sev      OKC_QA_ERRORS_T.ERROR_SEVERITY%TYPE;
8769     l_incomplt_config_desc          OKC_QA_ERRORS_T.PROBLEM_SHORT_DESC%TYPE;
8770     l_perf_incomplt_config    VARCHAR2(1);
8771 
8772     l_new_expert_article_sev      OKC_QA_ERRORS_T.ERROR_SEVERITY%TYPE;
8773     l_new_expert_article_desc          OKC_QA_ERRORS_T.PROBLEM_SHORT_DESC%TYPE;
8774     l_perf_new_expert_art VARCHAR2(1);
8775 
8776     l_old_expert_article_sev      OKC_QA_ERRORS_T.ERROR_SEVERITY%TYPE;
8777     l_old_expert_article_desc          OKC_QA_ERRORS_T.PROBLEM_SHORT_DESC%TYPE;
8778     l_perf_old_expert_art VARCHAR2(1);
8779 
8780     --Start - Added by kartik dummy variable
8781     l_count_articles_dropped NUMBER;
8782     --End - Added by kartik
8783 
8784     l_expert_articles_tbl expert_articles_tbl_type;
8785 
8786 
8787     --
8788     -- Cursor to get template information
8789     --
8790     CURSOR l_get_template_info_csr IS
8791 	    SELECT u.config_header_id,
8792 		   u.config_revision_number,
8793 		   t.template_id,
8794 		   t.contract_expert_enabled
8795 	    FROM okc_template_usages u,
8796 		 okc_terms_templates_all t
8797 	    WHERE t.template_id = u.template_id
8798 	      AND u.document_type= p_document_type
8799 	      AND u.document_id =  p_document_id;
8800 
8801 
8802 BEGIN
8803 	-- Initialising default values
8804 	L_COMPLETE := 'true';
8805 	L_VALID := 'true';
8806 
8807 	-- Initialising severity local variables
8808 	l_expert_not_applied_sev_e := 'E';
8809 	l_expert_not_applied_sev_w := 'W';
8810 
8811 	-- start debug log
8812 	IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8813 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8814 	    G_MODULE||l_api_name,
8815 	    '100: Entered '||G_PKG_NAME ||'.'||l_api_name);
8816 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8817 	    G_MODULE||l_api_name,
8818 	    'Parameters : ');
8819 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8820 	    G_MODULE||l_api_name,
8821 	    'p_document_id : '||p_document_id);
8822 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8823 	    G_MODULE||l_api_name,
8824 	    'p_document_type : '||p_document_type);
8825 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8826 	    G_MODULE||l_api_name,
8827 	    'p_bv_mode : '||p_bv_mode);
8828 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
8829 	    G_MODULE||l_api_name,
8830 	    'p_sequence_id : '||p_sequence_id);
8831 
8832 	END IF;
8833 
8834 
8835 	--
8836 	--  Initialize API return status to success
8837 	--
8838 	x_return_status := FND_API.G_RET_STS_SUCCESS;
8839 
8840 
8841 	--
8842 	-- Standard call to check for call compatibility.
8843 	--
8844 	IF NOT FND_API.Compatible_API_Call (l_api_version,
8845 				p_api_version,
8846 				l_api_name,
8847 				G_PKG_NAME)
8848 	THEN
8849 		RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8850 	END IF;
8851 
8852 
8853 	--
8854 	-- Initialize message list if p_init_msg_list is set to TRUE.
8855 	--
8856 	IF FND_API.to_Boolean( p_init_msg_list )
8857 	THEN
8858 		FND_MSG_PUB.initialize;
8859 	END IF;
8860 
8861 
8862 	--
8863 	-- Check if CE Profile is Enabled.
8864 	--
8865 	FND_PROFILE.GET(name=> 'OKC_K_EXPERT_ENABLED', val => l_ce_enabled);
8866 
8867 	IF NVL(l_ce_enabled,'N') = 'N' THEN
8868 		-- Not Expert enabled, skip BV
8869 		x_msg_data := G_OKC_EXPRT_PROFILE_DISABLED;
8870 		RETURN;
8871 	END IF;
8872 
8873 
8874 	-- If mode is not authoring then get QA code Severities and Names
8875 
8876 	IF p_bv_mode <> 'AUTH' THEN
8877 
8878 		--
8879 		-- Get Not Applied QA Code Severity and Name
8880 		--
8881 		get_qa_code_detail(p_document_type => p_document_type,
8882 			       p_qa_code =>  G_CHECK_EXPERT_NOT_APPLIED ,
8883 			       x_perform_qa    => l_perf_expert_not_applied,
8884 			       x_qa_name       => l_expert_not_applied_desc,
8885 			       x_severity_flag => l_expert_not_applied_sev,
8886 			       x_return_status => x_return_status);
8887 
8888 		IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR)
8889 		THEN
8890 			RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
8891 		ELSIF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
8892 			RAISE FND_API.G_EXC_ERROR ;
8893 		END IF;
8894 
8895 		--
8896 		-- Get Partially Applied QA Code Severity and Name
8897 		--
8898 		get_qa_code_detail(p_document_type => p_document_type,
8899 			       p_qa_code =>  G_CHECK_EXPERT_PARTIALLY_RUN ,
8900 			       x_perform_qa    => l_perf_expert_partially_run,
8901 			       x_qa_name       => l_expert_partially_run_desc,
8902 			       x_severity_flag => l_expert_partially_run_sev,
8903 			       x_return_status => x_return_status);
8904 
8905 		IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR)
8906 		THEN
8907 			RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
8908 		ELSIF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
8909 			RAISE FND_API.G_EXC_ERROR ;
8910 		END IF;
8911 
8912 		--
8913 		-- Get Invalid Config QA Code Severity and Name
8914 		--
8915 		get_qa_code_detail(p_document_type => p_document_type,
8916 			       p_qa_code =>  G_CHECK_INVALID_CONFIG ,
8917 			       x_perform_qa    => l_perf_invalid_config,
8918 			       x_qa_name       => l_invalid_config_desc,
8919 			       x_severity_flag => l_invalid_config_sev,
8920 			       x_return_status => x_return_status);
8921 
8922 		IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR)
8923 		THEN
8924 			RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
8925 		ELSIF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
8926 			RAISE FND_API.G_EXC_ERROR ;
8927 		END IF;
8928 
8929 
8930 		--
8931 		-- Get Incomplete Config QA Code Severity and Name
8932 		--
8933 		get_qa_code_detail(p_document_type => p_document_type,
8934 			       p_qa_code =>  G_CHECK_INCOMPLT_CONFIG ,
8935 			       x_perform_qa    => l_perf_incomplt_config,
8936 			       x_qa_name       => l_incomplt_config_desc,
8937 			       x_severity_flag => l_incomplt_config_sev,
8938 			       x_return_status => x_return_status);
8939 
8940 		IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR)
8941 		THEN
8942 			RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
8943 		ELSIF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
8944 			RAISE FND_API.G_EXC_ERROR ;
8945 		END IF;
8946 
8947 		--
8948 		-- Get New Article QA Code Severity and Name
8949 		--
8950 		get_qa_code_detail(p_document_type => p_document_type,
8951 			       p_qa_code =>  G_CHECK_NEW_EXPERT_ART ,
8952 			       x_perform_qa    => l_perf_new_expert_art,
8953 			       x_qa_name       => l_new_expert_article_desc,
8954 			       x_severity_flag => l_new_expert_article_sev,
8955 			       x_return_status => x_return_status);
8956 
8957 		IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR)
8958 		THEN
8959 			RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
8960 		ELSIF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
8961 			RAISE FND_API.G_EXC_ERROR ;
8962 		END IF;
8963 
8964 
8965 		--
8966 		-- Get Old Article QA Code Severity and Name
8967 		--
8968 		get_qa_code_detail(p_document_type => p_document_type,
8969 			       p_qa_code =>  G_CHECK_OLD_EXPERT_ART ,
8970 			       x_perform_qa    => l_perf_old_expert_art,
8971 			       x_qa_name       => l_old_expert_article_desc,
8972 			       x_severity_flag => l_old_expert_article_sev,
8973 			       x_return_status => x_return_status);
8974 
8975 		IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR)
8976 		THEN
8977 			RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
8978 		ELSIF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
8979 			RAISE FND_API.G_EXC_ERROR ;
8980 		END IF;
8981 
8982 		--
8983 		-- Contract Expert QA Checks are inter-dependent.
8984 		-- Therefore, if any one of the qa codes for
8985 		-- Contract Expert is enabled, then all checks
8986 		-- will be executed.
8987 		--
8988 		--  Bug 4773590 Commented below stmt
8989 		/*IF (l_perf_expert_not_applied <> 'Y' AND
8990 		l_perf_invalid_config <> 'Y' AND l_perf_incomplt_config <> 'Y' AND
8991 		l_perf_old_expert_art <> 'Y' AND  l_perf_new_expert_art <> 'Y')
8992 		THEN
8993 			RETURN;
8994 		END IF;*/
8995 
8996 		--
8997 		-- These QA Checks should always be performed sequentially,
8998 		-- regardless of the set-up.  Therefore, if one of
8999 		-- the checks is disabled, that check will still
9000 		-- be performed but with a 'Warning' severity.
9001 		--
9002 		IF l_perf_expert_not_applied <> 'Y'
9003 		THEN
9004 			l_expert_not_applied_sev := 'W';
9005 		END IF;
9006 
9007 		IF l_perf_invalid_config <> 'Y'
9008 		THEN
9009 			l_invalid_config_sev := 'E';
9010 		END IF;
9011 
9012 		IF l_perf_incomplt_config <> 'Y'
9013 		THEN
9014 			l_incomplt_config_sev := 'E';
9015 		END IF;
9016 
9017 		--
9018 		-- By default the severity of following should be Error
9019 		-- as per Policy Deviation Enhancement.
9020 		--
9021 		l_expert_partially_run_sev := 'E';
9022 		l_invalid_config_sev := 'E';
9023 		l_incomplt_config_sev := 'E';
9024 
9025 	END IF;
9026 
9027 
9028 
9029 	--
9030 	-- Retrieve Template Usage Info
9031 	--
9032 	OPEN  l_get_template_info_csr;
9033 	FETCH l_get_template_info_csr INTO l_config_header_id, l_config_rev_nbr,
9034 			       l_template_id,l_template_ce_enabled;
9035 	CLOSE l_get_template_info_csr;
9036 
9037 	-- debug log
9038 	IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
9039 	    FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
9040 	    G_MODULE||l_api_name,
9041 	    'l_config_header_id : '||l_config_header_id);
9042 	    FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
9043 	    G_MODULE||l_api_name,
9044 	    'l_config_rev_nbr : '||l_config_rev_nbr);
9045 	    FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
9046 	    G_MODULE||l_api_name,
9047 	    'l_template_id : '||l_template_id);
9048 	    FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
9049 	    G_MODULE||l_api_name,
9050 	    'l_template_ce_enabled : '||l_template_ce_enabled);
9051 	END IF;
9052 
9053 
9054 	--
9055 	-- Template Enabled for Expert?
9056 	-- BV will be executed even if Template is disabled for Expert
9057 	-- if Expert has been previously applied to document
9058 	--
9059 	IF (NVL(l_template_ce_enabled,'N') <> 'Y')
9060 	THEN
9061 		IF (l_config_header_id IS NULL OR l_config_rev_nbr IS NULL)
9062 		THEN
9063 			-- Expert has never been applied to document
9064 			x_msg_data := G_OKC_TEMPLATE_NOT_CE_ENABLED;
9065 			RETURN;
9066 		END IF;
9067 	END IF;
9068 
9069 
9070 	--Bug 5077098
9071 	--check whether template is published.If template is not published then return
9072 	get_publication_id(
9073 	 p_api_version                  => p_api_version,
9074 	 p_init_msg_list                => p_init_msg_list,
9075 	 p_template_id                  => l_template_id,
9076 	 x_publication_id               => l_publication_id,
9077 	 x_return_status                => x_return_status,
9078 	 x_msg_count                    => x_msg_count,
9079 	 x_msg_data                     => x_msg_data );
9080 
9081 	IF (l_publication_id is null ) THEN
9082 		RETURN;
9083 	END IF;
9084 	-- end Bug 5077098
9085 
9086 
9087 	--If Clause Selection has Rules and mode is AUTHORING
9088 	--Add QA message and Return
9089 	IF check_rule_type_has_questions(l_template_id,'CLAUSE_SELECTION') = 'Y' AND (p_bv_mode = 'AUTH')
9090 	THEN
9091 		--
9092 		-- Add QA Message for expert needs to be run
9093 		--
9094 		l_qa_tbl_index := x_qa_result_tbl.COUNT + 1;
9095 
9096 		x_qa_result_tbl(l_qa_tbl_index).error_record_type   := G_EXPERT_QA_TYPE;
9097 		x_qa_result_tbl(l_qa_tbl_index).article_id          := NULL;
9098 		x_qa_result_tbl(l_qa_tbl_index).deliverable_id      := NULL;
9099 		x_qa_result_tbl(l_qa_tbl_index).title               := OKC_TERMS_UTIL_PVT.Get_Message('OKC', G_OKC_CONTRACT_EXPERT);
9100 		x_qa_result_tbl(l_qa_tbl_index).section_name        := NULL;
9101 		x_qa_result_tbl(l_qa_tbl_index).qa_code             := G_CHECK_EXPERT_NOT_APPLIED;
9102 		x_qa_result_tbl(l_qa_tbl_index).message_name        := G_OKC_EXPERT_NOT_APPLIED;
9103 		x_qa_result_tbl(l_qa_tbl_index).suggestion          := OKC_TERMS_UTIL_PVT.Get_Message('OKC',G_OKC_EXPERT_NOT_APPLIED_S);
9104 		x_qa_result_tbl(l_qa_tbl_index).error_severity      := l_expert_not_applied_sev_w;
9105 		x_qa_result_tbl(l_qa_tbl_index).problem_short_desc  := l_expert_not_applied_desc;
9106 		x_qa_result_tbl(l_qa_tbl_index).problem_details     :=
9107 			       OKC_TERMS_UTIL_PVT.Get_Message('OKC', G_OKC_EXPERT_NOT_APPLIED_D);
9108 		RETURN;
9109 
9110 	END IF;
9111 	--
9112 	-- Template is enabled for Expert.
9113 	-- But if CE has not been invoked at all, do not execute BV.
9114 	-- Add Error in Stack.
9115 	--
9116 	IF ((l_config_header_id IS NULL OR l_config_rev_nbr IS NULL) AND check_template_has_questions(l_template_id) = 'Y' AND p_bv_mode = 'QA')
9117 	THEN
9118 		--
9119 		-- Contract Expert has not been applied to the document
9120 		--
9121 		l_qa_tbl_index := x_qa_result_tbl.COUNT + 1;
9122 
9123 		x_qa_result_tbl(l_qa_tbl_index).error_record_type   := G_EXPERT_QA_TYPE;
9124 		x_qa_result_tbl(l_qa_tbl_index).article_id          := NULL;
9125 		x_qa_result_tbl(l_qa_tbl_index).deliverable_id      := NULL;
9126 		x_qa_result_tbl(l_qa_tbl_index).title               := OKC_TERMS_UTIL_PVT.Get_Message('OKC', G_OKC_CONTRACT_EXPERT);
9127 		x_qa_result_tbl(l_qa_tbl_index).section_name        := NULL;
9128 		x_qa_result_tbl(l_qa_tbl_index).qa_code             := G_CHECK_EXPERT_NOT_APPLIED;
9129 		x_qa_result_tbl(l_qa_tbl_index).message_name        := G_OKC_EXPERT_NOT_APPLIED;
9130 		x_qa_result_tbl(l_qa_tbl_index).suggestion          := OKC_TERMS_UTIL_PVT.Get_Message('OKC',G_OKC_EXPERT_NOT_APPLIED_S);
9131 		x_qa_result_tbl(l_qa_tbl_index).error_severity      := l_expert_not_applied_sev_e;
9132 		x_qa_result_tbl(l_qa_tbl_index).problem_short_desc  := l_expert_not_applied_desc;
9133 		x_qa_result_tbl(l_qa_tbl_index).problem_details       :=
9134 			       OKC_TERMS_UTIL_PVT.Get_Message('OKC',
9135 							      G_OKC_EXPERT_NOT_APPLIED_D);
9136 		RETURN;
9137 	END IF; -- config_header_id is null or config_rev_nbr is null
9138 
9139 
9140 	--
9141 	-- All Requirements are met.
9142 	-- Build XML Init Msg for BV.
9143 	--
9144 	build_cz_xml_init_msg(
9145 		p_api_version      => 1.0,
9146 		p_init_msg_list    => FND_API.G_FALSE,
9147 		p_document_id      => p_document_id,
9148 		p_document_type    => p_document_type,
9149 		p_config_header_id => l_config_header_id,
9150 		p_config_rev_nbr   => l_config_rev_nbr,
9151 		p_template_id      => l_template_id,
9152 		x_cz_xml_init_msg  => l_cz_xml_init_msg,
9153 		x_return_status    => x_return_status,
9154 		x_msg_data         => x_msg_data,
9155 		x_msg_count        => x_msg_count);
9156 
9157 
9158 	IF (x_return_status <> FND_API.G_RET_STS_SUCCESS OR l_cz_xml_init_msg IS NULL)
9159 	THEN
9160 		RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9161 	END IF;
9162 
9163 	--
9164 	-- Invoke BV.
9165 	--
9166 	OKC_XPRT_CZ_INT_PVT.batch_validate(
9167 		p_api_version          => 1.0,
9168 		p_init_msg_list        => FND_API.G_FALSE,
9169 		p_cz_xml_init_msg      => l_cz_xml_init_msg,
9170 		x_cz_xml_terminate_msg => l_xml_terminate_msg, -- this has been converted
9171 							       -- internally from
9172 							       -- HTML_PIECES to LONG.
9173 		x_return_status        => x_return_status,
9174 		x_msg_data             => x_msg_data,
9175 		x_msg_count            => x_msg_count);
9176 
9177 
9178 	IF (x_return_status <> FND_API.G_RET_STS_SUCCESS OR l_xml_terminate_msg IS NULL)
9179 	THEN
9180 		RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9181 	END IF;
9182 
9183 
9184 	--
9185 	-- Parse BV Results
9186 	--
9187 	parse_cz_xml_terminate_msg(
9188 		p_api_version          => 1.0,
9189 		p_init_msg_list        => FND_API.G_FALSE,
9190 		p_cz_xml_terminate_msg => l_xml_terminate_msg,
9191 		x_valid_config         => l_valid_config,
9192 		x_complete_config      => l_complete_config,
9193 		x_config_header_id     => l_new_config_header_id,
9194 		x_config_rev_nbr       => l_new_config_rev_nbr,
9195 		x_return_status        => x_return_status,
9196 		x_msg_data             => x_msg_data,
9197 		x_msg_count            => x_msg_count);
9198 
9199 	/*
9200 	Bug # 4115488
9201 	If one or more questions on a existing configuration were deleted due to the rule
9202 	getting disabled, when we run batch validate in back end, CZ returns valid_configuration
9203 	as false.
9204 	In 'DEV' mode, we need to continue processing the expert clauses from CZ even if the
9205 	valid_configuration is false
9206 	*/
9207 
9208 	IF (x_return_status <> FND_API.G_RET_STS_SUCCESS)
9209 	THEN
9210 		RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9211 	END IF;
9212 
9213 	--
9214 	-- Template is enabled for Expert.
9215 	-- But if CE has been partially invoked, do not execute BV.
9216 	-- Add Error in Stack.
9217 	--
9218 
9219 	IF ((l_config_header_id IS NOT NULL AND l_config_rev_nbr IS NOT NULL) AND check_template_has_questions(l_template_id) = 'Y' AND (LOWER(l_complete_config) <> L_COMPLETE) AND p_bv_mode = 'QA')
9220 	THEN
9221 		--
9222 		-- Contract Expert has not been applied to the document
9223 		--
9224 		l_qa_tbl_index := x_qa_result_tbl.COUNT + 1;
9225 
9226 		x_qa_result_tbl(l_qa_tbl_index).error_record_type   := G_EXPERT_QA_TYPE;
9227 		x_qa_result_tbl(l_qa_tbl_index).article_id          := NULL;
9228 		x_qa_result_tbl(l_qa_tbl_index).deliverable_id      := NULL;
9229 		x_qa_result_tbl(l_qa_tbl_index).title               := OKC_TERMS_UTIL_PVT.Get_Message('OKC', G_OKC_CONTRACT_EXPERT);
9230 		x_qa_result_tbl(l_qa_tbl_index).section_name        := NULL;
9231 		x_qa_result_tbl(l_qa_tbl_index).qa_code             := G_CHECK_EXPERT_PARTIALLY_RUN;
9232 		x_qa_result_tbl(l_qa_tbl_index).message_name        := G_OKC_EXPERT_PARTIALLY_RUN;
9233 		x_qa_result_tbl(l_qa_tbl_index).suggestion          := OKC_TERMS_UTIL_PVT.Get_Message('OKC',G_OKC_EXPERT_PARTIALLY_RUN_S);
9234 		x_qa_result_tbl(l_qa_tbl_index).error_severity      := l_expert_partially_run_sev;
9235 		x_qa_result_tbl(l_qa_tbl_index).problem_short_desc  := l_expert_partially_run_desc;
9236 		x_qa_result_tbl(l_qa_tbl_index).problem_details       :=
9237 			       OKC_TERMS_UTIL_PVT.Get_Message('OKC',
9238 							      G_OKC_EXPERT_PARTIALLY_RUN_D);
9239 							      -- delete config before return
9240 		-- delete config before return
9241 		--
9242 		-- Delete BV Configuration from CZ.
9243 		--
9244 
9245 		OKC_XPRT_CZ_INT_PVT.delete_configuration(
9246 			p_api_version          => 1.0,
9247 			p_init_msg_list        => FND_API.G_FALSE,
9248 			p_config_header_id     => l_new_config_header_id,
9249 			p_config_rev_nbr       => l_new_config_rev_nbr,
9250 			x_return_status        => x_return_status,
9251 			x_msg_data             => x_msg_data,
9252 			x_msg_count            => x_msg_count);
9253 
9254 		IF (x_return_status <> FND_API.G_RET_STS_SUCCESS)
9255 		THEN
9256 			RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9257 		END IF;
9258 
9259 		RETURN;
9260 
9261 	END IF;
9262 
9263 	-- If mode is QA and configuration is incomplete
9264 	-- Add QA message and Return
9265 
9266 	IF (LOWER(l_complete_config) <> L_COMPLETE) AND (p_bv_mode = 'QA')
9267 	THEN
9268 
9269 		--
9270 		-- Add QA Message for invalid configuration
9271 		--
9272 		l_qa_tbl_index := x_qa_result_tbl.COUNT + 1;
9273 
9274 		x_qa_result_tbl(l_qa_tbl_index).error_record_type   := G_EXPERT_QA_TYPE;
9275 		x_qa_result_tbl(l_qa_tbl_index).article_id          := NULL;
9276 		x_qa_result_tbl(l_qa_tbl_index).deliverable_id      := NULL;
9277 		x_qa_result_tbl(l_qa_tbl_index).title               :=
9278 		OKC_TERMS_UTIL_PVT.Get_Message('OKC',G_OKC_CONTRACT_EXPERT);
9279 		x_qa_result_tbl(l_qa_tbl_index).section_name        := NULL;
9280 		x_qa_result_tbl(l_qa_tbl_index).qa_code             := G_CHECK_INCOMPLT_CONFIG;
9281 		x_qa_result_tbl(l_qa_tbl_index).message_name        := G_OKC_INCOMPLT_CONFIG;
9282 		x_qa_result_tbl(l_qa_tbl_index).suggestion          :=
9283 		OKC_TERMS_UTIL_PVT.Get_Message('OKC',G_OKC_INCOMPLT_CONFIG_S);
9284 		x_qa_result_tbl(l_qa_tbl_index).error_severity      := l_incomplt_config_sev;
9285 		x_qa_result_tbl(l_qa_tbl_index).problem_short_desc  := l_incomplt_config_desc;
9286 		x_qa_result_tbl(l_qa_tbl_index).problem_details     :=
9287 		OKC_TERMS_UTIL_PVT.Get_Message('OKC',
9288 				    G_OKC_INCOMPLT_CONFIG_D);
9289 
9290 		-- delete config before return
9291 		--
9292 		-- Delete BV Configuration from CZ.
9293 		--
9294 
9295 		OKC_XPRT_CZ_INT_PVT.delete_configuration(
9296 			p_api_version          => 1.0,
9297 			p_init_msg_list        => FND_API.G_FALSE,
9298 			p_config_header_id     => l_new_config_header_id,
9299 			p_config_rev_nbr       => l_new_config_rev_nbr,
9300 			x_return_status        => x_return_status,
9301 			x_msg_data             => x_msg_data,
9302 			x_msg_count            => x_msg_count);
9303 
9304 		IF (x_return_status <> FND_API.G_RET_STS_SUCCESS)
9305 		THEN
9306 			RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9307 		END IF;
9308 
9309 		RETURN;
9310 
9311 	END IF;
9312 
9313 	-- If mode is QA and configuration is Invalid
9314 	-- Add QA message and Return
9315 
9316 	IF (LOWER(l_valid_config) <> L_VALID) AND (p_bv_mode = 'QA')
9317 	THEN
9318 		--
9319 		-- Add QA Message for invalid configuration
9320 		--
9321 		l_qa_tbl_index := x_qa_result_tbl.COUNT + 1;
9322 
9323 		x_qa_result_tbl(l_qa_tbl_index).error_record_type   := G_EXPERT_QA_TYPE;
9324 		x_qa_result_tbl(l_qa_tbl_index).article_id          := NULL;
9325 		x_qa_result_tbl(l_qa_tbl_index).deliverable_id      := NULL;
9326 		x_qa_result_tbl(l_qa_tbl_index).title               := OKC_TERMS_UTIL_PVT.Get_Message('OKC', G_OKC_CONTRACT_EXPERT);
9327 		x_qa_result_tbl(l_qa_tbl_index).section_name        := NULL;
9328 		x_qa_result_tbl(l_qa_tbl_index).qa_code             := G_CHECK_INVALID_CONFIG;
9329 		x_qa_result_tbl(l_qa_tbl_index).message_name        := G_OKC_INVALID_CONFIG;
9330 		x_qa_result_tbl(l_qa_tbl_index).suggestion          := OKC_TERMS_UTIL_PVT.Get_Message('OKC',G_OKC_INVALID_CONFIG_S);
9331 		x_qa_result_tbl(l_qa_tbl_index).error_severity      := l_invalid_config_sev;
9332 		x_qa_result_tbl(l_qa_tbl_index).problem_short_desc  := l_invalid_config_desc;
9333 		x_qa_result_tbl(l_qa_tbl_index).problem_details     :=
9334 		OKC_TERMS_UTIL_PVT.Get_Message('OKC',
9335 					    G_OKC_INVALID_CONFIG_D);
9336 		-- delete config before return
9337 		--
9338 		-- Delete BV Configuration from CZ.
9339 		--
9340 		OKC_XPRT_CZ_INT_PVT.delete_configuration(
9341 			p_api_version          => 1.0,
9342 			p_init_msg_list        => FND_API.G_FALSE,
9343 			p_config_header_id     => l_new_config_header_id,
9344 			p_config_rev_nbr       => l_new_config_rev_nbr,
9345 			x_return_status        => x_return_status,
9346 			x_msg_data             => x_msg_data,
9347 			x_msg_count            => x_msg_count);
9348 
9349 		IF (x_return_status <> FND_API.G_RET_STS_SUCCESS)
9350 		THEN
9351 			RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9352 		END IF;
9353 
9354 		RETURN;
9355 
9356 	END IF;
9357 
9358 	--If mode is approval and no previous configuration exists and template has questions
9359 	-- or invalid configuration, Add QA message and Return.
9360 
9361 	IF (((l_config_header_id IS NULL OR l_config_rev_nbr IS NULL) AND check_template_has_questions(l_template_id) = 'Y' ) OR (LOWER(l_valid_config) <> L_VALID)) AND (p_bv_mode = 'APPR')
9362 	THEN
9363 		--
9364 		-- Add QA Message for invalid configuration
9365 		--
9366 		l_qa_tbl_index := x_qa_result_tbl.COUNT + 1;
9367 
9368 		x_qa_result_tbl(l_qa_tbl_index).error_record_type   := G_EXPERT_QA_TYPE;
9369 		x_qa_result_tbl(l_qa_tbl_index).article_id          := NULL;
9370 		x_qa_result_tbl(l_qa_tbl_index).deliverable_id      := NULL;
9371 		x_qa_result_tbl(l_qa_tbl_index).title               := OKC_TERMS_UTIL_PVT.Get_Message('OKC', G_OKC_CONTRACT_EXPERT);
9372 		x_qa_result_tbl(l_qa_tbl_index).section_name        := NULL;
9373 		x_qa_result_tbl(l_qa_tbl_index).qa_code             := G_CHECK_EXPERT_NOT_APPLIED;
9374 		x_qa_result_tbl(l_qa_tbl_index).message_name        := G_OKC_EXPERT_NOT_APPLIED;
9375 		x_qa_result_tbl(l_qa_tbl_index).suggestion          := OKC_TERMS_UTIL_PVT.Get_Message('OKC',G_OKC_EXPERT_NOT_APPLIED_S);
9376 		x_qa_result_tbl(l_qa_tbl_index).error_severity      := l_expert_not_applied_sev_e;
9377 		x_qa_result_tbl(l_qa_tbl_index).problem_short_desc  := l_expert_not_applied_desc;
9378 		x_qa_result_tbl(l_qa_tbl_index).problem_details       :=
9379 		OKC_TERMS_UTIL_PVT.Get_Message('OKC',
9380 				      'OKC_EXPRT_NOT_RUN');
9381 
9382 		-- delete config before return
9383 		--
9384 		-- Delete BV Configuration from CZ.
9385 		--
9386 		OKC_XPRT_CZ_INT_PVT.delete_configuration(
9387 			p_api_version          => 1.0,
9388 			p_init_msg_list        => FND_API.G_FALSE,
9389 			p_config_header_id     => l_new_config_header_id,
9390 			p_config_rev_nbr       => l_new_config_rev_nbr,
9391 			x_return_status        => x_return_status,
9392 			x_msg_data             => x_msg_data,
9393 			x_msg_count            => x_msg_count);
9394 
9395 		IF (x_return_status <> FND_API.G_RET_STS_SUCCESS)
9396 		THEN
9397 			RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9398 		END IF;
9399 
9400 		RETURN;
9401 
9402 	END IF;
9403 
9404 	--If mode is DEVIATION and Invalid Configuration and if both Clause and Policy Rules have
9405 	--Questions then Add QA message and Return.
9406 
9407 	IF (p_bv_mode = 'DEV') AND (LOWER(l_valid_config) <> L_VALID) AND  (check_rule_type_has_questions(l_template_id,'CLAUSE_SELECTION') = 'Y' AND check_rule_type_has_questions(l_template_id,'TERM_DEVIATION') = 'Y')
9408 	THEN
9409 
9410 		-- delete config before return
9411 		--
9412 		-- Delete BV Configuration from CZ.
9413 		--
9414 		OKC_XPRT_CZ_INT_PVT.delete_configuration(
9415 			p_api_version          => 1.0,
9416 			p_init_msg_list        => FND_API.G_FALSE,
9417 			p_config_header_id     => l_new_config_header_id,
9418 			p_config_rev_nbr       => l_new_config_rev_nbr,
9419 			x_return_status        => x_return_status,
9420 			x_msg_data             => x_msg_data,
9421 			x_msg_count            => x_msg_count);
9422 
9423 		IF (x_return_status <> FND_API.G_RET_STS_SUCCESS)
9424 		THEN
9425 			RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9426 		END IF;
9427 
9428 		-- Raises error for invalid configuration
9429 		FND_MESSAGE.set_name('OKC', G_OKC_INVALID_CONFIG_D);
9430 		FND_MSG_PUB.ADD;
9431 		RAISE FND_API.G_EXC_ERROR;
9432 
9433 		RETURN;
9434 
9435     END IF;
9436 
9437 
9438 	--
9439 	-- Config Valid and Complete => Process BV Results
9440 	-- We will always execute this in QA as Deviation has been
9441 	-- pushed to post 11.5.10.
9442 	--
9443 	IF (p_bv_mode = 'QA') THEN
9444 
9445 		process_qa_result(
9446 			p_api_version          => 1.0,
9447 			p_init_msg_list        => FND_API.G_FALSE,
9448 			p_document_id          => p_document_id,
9449 			p_document_type        => p_document_type,
9450 			p_config_header_id     => l_new_config_header_id,
9451 			p_config_rev_nbr       => l_new_config_rev_nbr,
9452 			x_qa_result_tbl        => x_qa_result_tbl,
9453 			x_return_status        => x_return_status,
9454 			x_msg_data             => x_msg_data,
9455 			x_msg_count            => x_msg_count);
9456 
9457 
9458 		IF (x_return_status <> FND_API.G_RET_STS_SUCCESS)
9459 		THEN
9460 			RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9461 		END IF;
9462 
9463 
9464 	-- p_bv_mode is 'DEV' for deviation report
9465 	ELSIF (p_bv_mode = 'DEV') THEN
9466 		-- if clause rules have no questions or has answered questions
9467 		IF check_rule_type_has_questions(l_template_id,'CLAUSE_SELECTION') <> 'Y' OR has_unanswered_questions(p_document_type, p_document_id,'CLAUSE_SELECTION') <> 'Y' THEN
9468 
9469 			process_qa_result(
9470 				p_api_version          => 1.0,
9471 				p_init_msg_list        => FND_API.G_FALSE,
9472 				p_document_id          => p_document_id,
9473 				p_document_type        => p_document_type,
9474 				p_config_header_id     => l_new_config_header_id,
9475 				p_config_rev_nbr       => l_new_config_rev_nbr,
9476 				x_qa_result_tbl        => x_qa_result_tbl,
9477 				x_return_status        => x_return_status,
9478 				x_msg_data             => x_msg_data,
9479 				x_msg_count            => x_msg_count);
9480 
9481 
9482 			IF (x_return_status <> FND_API.G_RET_STS_SUCCESS)
9483 			THEN
9484 				RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9485 			END IF;
9486 	        END IF;
9487 
9488 		-- if policy rules have no questions or has answered questions
9489 		IF check_rule_type_has_questions(l_template_id,'TERM_DEVIATION') <> 'Y' OR has_unanswered_questions(p_document_type, p_document_id,'TERM_DEVIATION') <> 'Y' THEN
9490 
9491 			get_expert_articles(
9492 				p_api_version      => 1.0,
9493 				p_init_msg_list    => FND_API.G_FALSE,
9494 				p_document_id          => p_document_id,
9495 				p_document_type        => p_document_type,
9496 				p_config_header_id => l_new_config_header_id,
9497 				p_config_rev_nbr   => l_new_config_rev_nbr,
9498 				x_expert_articles_tbl  => x_expert_articles_tbl,
9499 				x_return_status    => x_return_status,
9500 				x_msg_data         => x_msg_data,
9501 				x_msg_count        => x_msg_count);
9502 
9503 			IF (x_return_status <> FND_API.G_RET_STS_SUCCESS)
9504 			THEN
9505 				raise FND_API.G_EXC_UNEXPECTED_ERROR;
9506 			END IF;
9507 
9508 
9509 			--SELECT OKC_TERMS_DEVIATIONS_S1.nextval INTO l_sequence_id from DUAL;
9510 			l_sequence_id := p_sequence_id;
9511 
9512 			get_expert_results(
9513 				p_api_version      	=> 1.0,
9514 				p_init_msg_list    	=> FND_API.G_FALSE,
9515 				p_document_id      	=> p_document_id,
9516 				p_document_type          => p_document_type,
9517 				p_mode                   => 'BV',
9518 				p_sequence_id		=> l_sequence_id,
9519 				p_config_header_id 	=> l_new_config_header_id,
9520 				p_config_rev_nbr   	=> l_new_config_rev_nbr,
9521 				x_return_status    	=> x_return_status,
9522 				x_msg_data         	=> x_msg_data,
9523 				x_msg_count        	=> x_msg_count);
9524 
9525 
9526 			IF (x_return_status <> FND_API.G_RET_STS_SUCCESS)
9527 			THEN
9528 			raise FND_API.G_EXC_UNEXPECTED_ERROR;
9529 			END IF;
9530 		END IF;
9531 
9532 		RETURN;
9533    ELSIF (p_bv_mode = 'AUTH') THEN
9534 
9535 		update_ce_config(
9536 			p_api_version          => 1.0,
9537 			p_init_msg_list        => FND_API.G_FALSE,
9538 			p_document_id          => p_document_id,
9539 			p_document_type        => p_document_type,
9540 			p_config_header_id     => l_new_config_header_id,
9541 			p_config_rev_nbr       => l_new_config_rev_nbr,
9542 			p_doc_update_mode      => 'BV',
9543 			x_count_articles_dropped => l_count_articles_dropped,
9544 			x_return_status        => x_return_status,
9545 			x_msg_data             => x_msg_data,
9546 			x_msg_count            => x_msg_count);
9547 
9548 		IF (x_return_status <> FND_API.G_RET_STS_SUCCESS)
9549 		THEN
9550 			RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9551 		END IF;
9552 
9553 	ELSIF (p_bv_mode = 'APPR') THEN
9554 
9555 		process_qa_result(
9556 			p_api_version          => 1.0,
9557 			p_init_msg_list        => FND_API.G_FALSE,
9558 			p_document_id          => p_document_id,
9559 			p_document_type        => p_document_type,
9560 			p_config_header_id     => l_new_config_header_id,
9561 			p_config_rev_nbr       => l_new_config_rev_nbr,
9562 			x_qa_result_tbl        => x_qa_result_tbl,
9563 			x_return_status        => x_return_status,
9564 			x_msg_data             => x_msg_data,
9565 			x_msg_count            => x_msg_count);
9566 
9567 		IF (x_return_status <> FND_API.G_RET_STS_SUCCESS)
9568 		THEN
9569 			RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9570 		END IF;
9571 
9572 		get_expert_articles(
9573 			p_api_version      => 1.0,
9574 			p_init_msg_list    => FND_API.G_FALSE,
9575 			p_document_id          => p_document_id,
9576 			p_document_type        => p_document_type,
9577 			p_config_header_id => l_new_config_header_id,
9578 			p_config_rev_nbr   => l_new_config_rev_nbr,
9579 			x_expert_articles_tbl  => x_expert_articles_tbl,
9580 			x_return_status    => x_return_status,
9581 			x_msg_data         => x_msg_data,
9582 			x_msg_count        => x_msg_count);
9583 
9584 		IF (x_return_status <> FND_API.G_RET_STS_SUCCESS)
9585 		THEN
9586 			raise FND_API.G_EXC_UNEXPECTED_ERROR;
9587 		END IF;
9588 
9589 
9590 		--SELECT OKC_TERMS_DEVIATIONS_S1.nextval INTO l_sequence_id from DUAL;
9591 		l_sequence_id := p_sequence_id;
9592 
9593 		get_expert_results(
9594 		p_api_version      	=> 1.0,
9595 		p_init_msg_list    	=> FND_API.G_FALSE,
9596 		p_document_id      	=> p_document_id,
9597 		p_document_type          => p_document_type,
9598 		p_mode                   => 'BV',
9599 		p_sequence_id		=> l_sequence_id,
9600 		p_config_header_id 	=> l_new_config_header_id,
9601 		p_config_rev_nbr   	=> l_new_config_rev_nbr,
9602 		x_return_status    	=> x_return_status,
9603 		x_msg_data         	=> x_msg_data,
9604 		x_msg_count        	=> x_msg_count);
9605 
9606 
9607 		IF (x_return_status <> FND_API.G_RET_STS_SUCCESS)
9608 		THEN
9609 			raise FND_API.G_EXC_UNEXPECTED_ERROR;
9610 		END IF;
9611 
9612     -------------------- END OF CODE CHANGES BY KARTK -----------------------
9613 
9614     END IF; -- p_bv_mode
9615 
9616     --
9617     -- Delete BV Configuration from CZ.
9618     --
9619     --Bug#4757962 In DEV mode do not delete configuration
9620     --CODE MODIFIED BY KARTIK ADDED AUTHORING MODE FOR NOT TO DELETE CONFIGURATION-----------------------------
9621 	IF(p_bv_mode = 'QA') THEN
9622 		OKC_XPRT_CZ_INT_PVT.delete_configuration(
9623 		       p_api_version          => 1.0,
9624 		       p_init_msg_list        => FND_API.G_FALSE,
9625 		       p_config_header_id     => l_new_config_header_id,
9626 		       p_config_rev_nbr       => l_new_config_rev_nbr,
9627 		       x_return_status        => x_return_status,
9628 		       x_msg_data             => x_msg_data,
9629 		       x_msg_count            => x_msg_count);
9630 
9631 		IF (x_return_status <> FND_API.G_RET_STS_SUCCESS)
9632 		THEN
9633 			RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9634 		END IF;
9635 	END IF; --IF(p_bv_mode <> 'DEV')
9636 
9637     --
9638     -- Standard call to get message count and if count is 1, get message info.
9639     --
9640     FND_MSG_PUB.Count_And_Get(
9641        	  	p_count => x_msg_count,
9642             	p_data => x_msg_data
9643     		);
9644 
9645   -- end debug log
9646   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
9647      FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
9648                     G_MODULE||l_api_name,
9649                     '1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
9650   END IF;
9651 
9652 EXCEPTION
9653 
9654       WHEN FND_API.G_EXC_ERROR THEN
9655 
9656   		x_return_status := FND_API.G_RET_STS_ERROR ;
9657   		FND_MSG_PUB.Count_And_Get(
9658   		        p_count => x_msg_count,
9659           		p_data => x_msg_data
9660   		);
9661 
9662       WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
9663   		x_return_status := FND_API.G_RET_STS_ERROR ;
9664 		/*
9665   		FND_MSG_PUB.Count_And_Get(
9666   		        p_count => x_msg_count,
9667           		p_data => x_msg_data
9668   		); */
9669 
9670       WHEN OTHERS THEN
9671   		x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
9672 
9673     		IF FND_MSG_PUB.Check_Msg_Level
9674   		   (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
9675   		THEN
9676       	    	FND_MSG_PUB.Add_Exc_Msg(
9677       	    	     G_PKG_NAME  	    ,
9678       	    	     l_api_name
9679   	    	      );
9680   		END IF;
9681 
9682   		FND_MSG_PUB.Count_And_Get(
9683   		     p_count => x_msg_count,
9684           	 p_data  => x_msg_data
9685   		);
9686 
9687 END contract_expert_bv;
9688 
9689 
9690 
9691 -- End: Added for R12
9692 
9693 -- Rajendra
9694 
9695   /*====================================================================+
9696   Procedure Name : is_template_applied
9697   Description    : This would check if the template is already
9698                    instantiated on any document.
9699 
9700   +====================================================================*/
9701 
9702 PROCEDURE is_template_applied (
9703     p_api_version               IN            NUMBER,
9704     p_init_msg_list             IN            VARCHAR2,
9705     p_document_type             IN            VARCHAR2,
9706     p_document_id               IN            NUMBER,
9707     p_template_id               IN            NUMBER,
9708     x_template_applied_yn       OUT  NOCOPY   VARCHAR2,
9709     x_return_status             OUT  NOCOPY   VARCHAR2,
9710     x_msg_count                 OUT  NOCOPY   NUMBER,
9711     x_msg_data                  OUT  NOCOPY   VARCHAR2
9712 ) IS
9713 
9714     l_api_version CONSTANT NUMBER := 1;
9715     l_api_name VARCHAR2(30) := 'is_template_applied';
9716     l_package_procedure VARCHAR2(60);
9717     l_template_applied  VARCHAR2(1);
9718 
9719     CURSOR csr_tmpl_applied_yn IS
9720     SELECT 'X'
9721       FROM okc_template_usages
9722       WHERE document_type = p_document_type
9723         AND document_id = p_document_id
9724         AND template_id = p_template_id;
9725 
9726     BEGIN
9727         -- start debug log
9728         IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
9729            FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
9730                           G_MODULE||l_api_name,
9731                           '100: Entered '||G_PKG_NAME ||'.'||l_api_name);
9732         END IF;
9733 
9734         --
9735 	   -- Standard call to check for call compatibility.
9736         --
9737         IF NOT FND_API.Compatible_API_Call (l_api_version,
9738 	                                   p_api_version,
9739 	                                   l_api_name,
9740 	                                   G_PKG_NAME)
9741 	   THEN
9742 	     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9743         END IF;
9744 
9745         --
9746         -- Initialize message list if p_init_msg_list is set to TRUE.
9747         --
9748         IF FND_API.to_Boolean( p_init_msg_list ) THEN
9749            FND_MSG_PUB.initialize;
9750         END IF;
9751 
9752         --
9753         --  Initialize API return status to success
9754         --
9755         x_return_status := FND_API.G_RET_STS_SUCCESS;
9756 
9757         OPEN csr_tmpl_applied_yn;
9758         FETCH csr_tmpl_applied_yn INTO l_template_applied;
9759         IF csr_tmpl_applied_yn%FOUND THEN
9760            -- template already applied
9761            x_template_applied_yn := 'Y';
9762            RETURN;
9763         ELSE
9764            -- template not applied
9765            x_template_applied_yn := 'N';
9766            RETURN;
9767         END IF;
9768         CLOSE csr_tmpl_applied_yn;
9769 
9770         -- end debug log
9771 	   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
9772 	       FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
9773 	                   G_MODULE||l_api_name,
9774 	                   '1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
9775         END IF;
9776 
9777 EXCEPTION
9778 
9779 WHEN FND_API.G_EXC_ERROR THEN
9780       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
9781          FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
9782                         G_MODULE||l_api_name,
9783                         '2000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
9784       END IF;
9785 
9786     		x_return_status := FND_API.G_RET_STS_ERROR ;
9787     		FND_MSG_PUB.Count_And_Get(
9788     		        p_count => x_msg_count,
9789             		p_data => x_msg_data
9790     		);
9791 
9792 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
9793       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
9794          FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
9795                         G_MODULE||l_api_name,
9796                         '3000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
9797       END IF;
9798 
9799     		x_return_status := FND_API.G_RET_STS_ERROR ;
9800     		FND_MSG_PUB.Count_And_Get(
9801     		        p_count => x_msg_count,
9802             		p_data => x_msg_data
9803     		);
9804 
9805 WHEN OTHERS THEN
9806       IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
9807          FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
9808                         G_MODULE||l_api_name,
9809                         '4000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
9810       END IF;
9811 
9812     		x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
9813 
9814       		IF FND_MSG_PUB.Check_Msg_Level
9815     		   (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
9816     		THEN
9817         	    	FND_MSG_PUB.Add_Exc_Msg(
9818         	    	     G_PKG_NAME  	    ,
9819         	    	     l_api_name
9820     	    	      );
9821     		END IF;
9822 
9823     		FND_MSG_PUB.Count_And_Get(
9824     		     p_count => x_msg_count,
9825             	     p_data => x_msg_data);
9826 END is_template_applied;
9827 
9828  /*====================================================================+
9829   Procedure Name : get_current_config_dtls
9830   Description    : This would get the current config_header_id and
9831                    config_revision_number is the contract expert was
9832                    already run on the quote. It would also check if the
9833                    template is contract expert enabled.
9834 
9835   +====================================================================*/
9836 
9837 PROCEDURE get_current_config_dtls (
9838     p_api_version               IN            NUMBER,
9839     p_init_msg_list             IN            VARCHAR2,
9840     p_document_type             IN            VARCHAR2,
9841     p_document_id               IN            NUMBER,
9842     p_template_id               IN            NUMBER,
9843     x_expert_enabled_yn         OUT  NOCOPY   VARCHAR2,
9844     x_config_header_id          OUT  NOCOPY   NUMBER,
9845     x_config_rev_nbr            OUT  NOCOPY   NUMBER,
9846     x_return_status             OUT  NOCOPY   VARCHAR2,
9847     x_msg_count                 OUT  NOCOPY   NUMBER,
9848     x_msg_data                  OUT  NOCOPY   VARCHAR2
9849 ) IS
9850 
9851     l_api_version CONSTANT NUMBER := 1;
9852     l_api_name VARCHAR2(30) := 'get_current_config_dtls';
9853     l_package_procedure VARCHAR2(60);
9854     l_template_id       NUMBER;
9855 
9856     /*l_contract_expert_enabled  VARCHAR2(1);
9857     l_config_header_id  NUMBER;
9858     l_config_rev_nbr    NUMBER;
9859     l_template_id       NUMBER;*/
9860 
9861     CURSOR l_get_template_info_csr IS
9862         SELECT u.config_header_id,
9863                u.config_revision_number,
9864                t.template_id,
9865                t.contract_expert_enabled
9866         FROM okc_template_usages u,
9867              okc_terms_templates_all t
9868         WHERE t.template_id = u.template_id
9869           AND u.document_type= p_document_type
9870           AND u.document_id =  p_document_id
9871 		AND t.template_id = p_template_id;
9872 
9873     BEGIN
9874         -- start debug log
9875         IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
9876            FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
9877                           G_MODULE||l_api_name,
9878                           '100: Entered '||G_PKG_NAME ||'.'||l_api_name);
9879         END IF;
9880 
9881         --
9882 	   -- Standard call to check for call compatibility.
9883         --
9884         IF NOT FND_API.Compatible_API_Call (l_api_version,
9885 	                                   p_api_version,
9886 	                                   l_api_name,
9887 	                                   G_PKG_NAME)
9888 	   THEN
9889 	     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9890         END IF;
9891 
9892         --
9893         -- Initialize message list if p_init_msg_list is set to TRUE.
9894         --
9895         IF FND_API.to_Boolean( p_init_msg_list ) THEN
9896            FND_MSG_PUB.initialize;
9897         END IF;
9898 
9899         --
9900         --  Initialize API return status to success
9901         --
9902         x_return_status := FND_API.G_RET_STS_SUCCESS;
9903 
9904         OPEN l_get_template_info_csr;
9905         FETCH l_get_template_info_csr INTO x_config_header_id, x_config_rev_nbr, l_template_id, x_expert_enabled_yn;
9906         CLOSE l_get_template_info_csr;
9907 
9908         -- end debug log
9909 	   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
9910 	       FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
9911 	                   G_MODULE||l_api_name,
9912 	                   '1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
9913         END IF;
9914 
9915  EXCEPTION
9916 
9917  WHEN FND_API.G_EXC_ERROR THEN
9918        IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
9919           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
9920                          G_MODULE||l_api_name,
9921                          '2000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
9922        END IF;
9923 
9924      		x_return_status := FND_API.G_RET_STS_ERROR ;
9925      		FND_MSG_PUB.Count_And_Get(
9926      		        p_count => x_msg_count,
9927              		p_data => x_msg_data
9928      		);
9929 
9930  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
9931        IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
9932           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
9933                          G_MODULE||l_api_name,
9934                          '3000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
9935        END IF;
9936 
9937      		x_return_status := FND_API.G_RET_STS_ERROR ;
9938      		FND_MSG_PUB.Count_And_Get(
9939      		        p_count => x_msg_count,
9940              		p_data => x_msg_data
9941      		);
9942 
9943  WHEN OTHERS THEN
9944        IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
9945           FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
9946                          G_MODULE||l_api_name,
9947                          '4000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
9948        END IF;
9949 
9950      		x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
9951 
9952        		IF FND_MSG_PUB.Check_Msg_Level
9953      		   (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
9954      		THEN
9955          	    	FND_MSG_PUB.Add_Exc_Msg(
9956          	    	     G_PKG_NAME  	    ,
9957          	    	     l_api_name
9958      	    	      );
9959      		END IF;
9960 
9961      		FND_MSG_PUB.Count_And_Get(
9962      		     p_count => x_msg_count,
9963              	     p_data => x_msg_data);
9964  END get_current_config_dtls;
9965 
9966 
9967 /*========================================================================================+
9968   Function Name : check_rule_type_has_questions
9969   Description   : Returns 'Y' if a template with specified rule type has active questions,
9970 		          otherwise returns 'N'. Used in Rules Summary Page
9971   Parameters    : p_template_id template id
9972 	           	  p_rule_type	 rule type either 'CLAUSE_SELECTION' OR 'TERM_DEVIATION'
9973 +========================================================================================*/
9974 
9975 FUNCTION check_rule_type_has_questions (
9976     p_template_id   IN NUMBER,
9977     p_rule_type IN VARCHAR2)
9978   RETURN VARCHAR2 IS
9979 
9980 CURSOR csr_rules(p_org_id NUMBER, p_intent VARCHAR2) IS
9981 SELECT tr.rule_id
9982   FROM okc_xprt_template_rules tr,
9983        okc_xprt_rule_hdrs_all rhdr
9984  WHERE tr.rule_id = rhdr.rule_id
9985    AND tr.template_id = p_template_id
9986    AND rhdr.rule_type = p_rule_type
9987    AND rhdr.status_code IN ('ACTIVE','PENDING_PUB')
9988 UNION ALL
9989 SELECT r.rule_id
9990   FROM OKC_TERMS_TEMPLATES_ALL t,
9991        okc_xprt_rule_hdrs_all r
9992  WHERE  t.org_id = p_org_id
9993    AND  t.intent = p_intent
9994    AND r.rule_type = p_rule_type
9995    AND  r.status_code IN ('ACTIVE','PENDING_PUB')
9996    AND  NVL(r.org_wide_flag,'N') = 'Y'
9997    AND  t.template_id = p_template_id;
9998 
9999 
10000 CURSOR csr_questions(p_rule_id NUMBER) IS
10001   SELECT  object_code question_id
10002   FROM okc_xprt_rule_conditions cond
10003   WHERE cond.rule_id = p_rule_id
10004   AND cond.object_value_type ='QUESTION'
10005     UNION ALL
10006   SELECT object_code question_id
10007   FROM  okc_xprt_rule_conditions cond
10008   WHERE cond.rule_id = p_rule_id
10009   AND  cond.object_type ='QUESTION'
10010     UNION ALL
10011   SELECT object_value_id||'' question_id
10012   FROM okc_xprt_rule_outcomes xro
10013   WHERE xro.rule_id = p_rule_id
10014   AND xro.object_type='QUESTION';
10015 
10016 CURSOR csr_main IS
10017   SELECT org_id, intent
10018   FROM okc_terms_templates_all
10019   WHERE template_id = p_template_id;
10020 
10021 l_dummy  VARCHAR2(1);
10022 l_return VARCHAR2(1);
10023 l_org_id NUMBER;
10024 l_intent VARCHAR2(40);
10025 
10026 rec_rule csr_rules%rowtype;
10027 rec_question csr_questions%rowtype;
10028 rec_main csr_main%rowtype;
10029 
10030 BEGIN
10031      l_return := 'N';
10032      OPEN csr_main;
10033      FETCH csr_main INTO rec_main;
10034 	l_org_id := rec_main.org_id;
10035 	l_intent := rec_main.intent;
10036      CLOSE csr_main;
10037 
10038      IF l_org_id IS NULL THEN
10039 	 RETURN 'N';
10040      ELSE
10041 	   FOR rec_rule IN csr_rules( rec_main.org_id, rec_main.intent)
10042 	   LOOP
10043 		  FOR rec_question IN csr_questions(rec_rule.rule_id)
10044 		  LOOP
10045 			SELECT 'x' into l_dummy
10046 			FROM okc_xprt_question_orders
10047 			WHERE question_rule_status = 'ACTIVE'
10048 			AND template_id = p_template_id
10049 			AND question_id = rec_question.question_id;
10050 
10051 			IF l_dummy = 'x' THEN
10052 			 RETURN 'Y';
10053 			END IF;
10054 		  END LOOP;
10055 	   END LOOP;
10056        END IF;
10057    RETURN 'N';
10058 
10059 EXCEPTION
10060  WHEN OTHERS THEN
10061  --close cursors
10062  IF csr_main%ISOPEN THEN
10063    CLOSE csr_main;
10064  END IF;
10065  IF csr_rules%ISOPEN THEN
10066    CLOSE csr_rules;
10067  END IF;
10068  IF csr_questions%ISOPEN THEN
10069    CLOSE csr_questions;
10070  END IF;
10071  RETURN 'N';
10072 END check_rule_type_has_questions;
10073 
10074 PROCEDURE contract_expert_bv(
10075     p_api_version                  IN NUMBER,
10076     p_init_msg_list                IN VARCHAR2,
10077     p_document_id                  IN NUMBER,
10078     p_document_type                IN VARCHAR2,
10079     p_bv_mode                      IN VARCHAR2 ,
10080     x_return_status                OUT NOCOPY VARCHAR2,
10081     x_msg_count                    OUT NOCOPY NUMBER,
10082     x_msg_data                     OUT NOCOPY VARCHAR2)
10083 IS
10084 
10085 l_expert_articles_tbl expert_articles_tbl_type;
10086 l_qa_result_tbl_type OKC_TERMS_QA_GRP.qa_result_tbl_type;
10087 BEGIN
10088 
10089 	 contract_expert_bv(
10090 	    p_api_version           =>     p_api_version,
10091 	    p_init_msg_list         =>     p_init_msg_list,
10092 	    p_document_id           =>     p_document_id,
10093 	    p_document_type         =>     p_document_type,
10094 	    p_bv_mode               =>     p_bv_mode,
10095 	    p_sequence_id 	        =>	   NULL,
10096 	    x_qa_result_tbl         =>     l_qa_result_tbl_type  ,
10097 	    x_expert_articles_tbl   =>     l_expert_articles_tbl ,
10098   	    x_return_status         =>     x_return_status,
10099 	    x_msg_count             =>     x_msg_count,
10100 	    x_msg_data              =>     x_msg_data );
10101 
10102 
10103 END contract_expert_bv;
10104 
10105 FUNCTION is_config_complete(
10106     p_document_type         IN  VARCHAR2,
10107     p_document_id           IN  NUMBER
10108  ) RETURN VARCHAR2 IS
10109 
10110  l_api_name         CONSTANT VARCHAR2(30) := 'is_config_complete';
10111 
10112  CURSOR doc_config_details_csr IS
10113   select nvl(config_status, 0)
10114   from cz_config_hdrs_v chv, okc_template_usages otu
10115   where chv.config_hdr_id = otu.config_header_id
10116   and chv.config_rev_nbr = otu.config_revision_number
10117   and otu.document_type = p_document_type
10118   and otu.document_id = p_document_id;
10119 
10120   l_result     NUMBER;
10121 
10122 BEGIN
10123     l_result := 0;
10124 
10125     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
10126       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'1100: Entering is_config_complete ');
10127     END IF;
10128 
10129     OPEN  doc_config_details_csr ;
10130     FETCH doc_config_details_csr  into  l_result;
10131     IF doc_config_details_csr%NOTFOUND THEN
10132        l_result := 0;
10133     END IF;
10134     CLOSE doc_config_details_csr ;
10135 
10136     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
10137       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'2000: Result is_config_complete : ['||l_result||']');
10138     END IF;
10139 
10140     IF l_result = 2 THEN
10141         RETURN 'Y';
10142     ELSE
10143         RETURN 'N';
10144     END IF;
10145 
10146 EXCEPTION
10147  WHEN OTHERS THEN
10148    IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
10149       FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'2000: Leaving is_config_complete of EXCEPTION: '||sqlerrm);
10150    END IF;
10151  RETURN 'E';
10152 END is_config_complete;
10153 
10154 FUNCTION has_unanswered_questions(
10155     p_document_type         IN  VARCHAR2,
10156     p_document_id           IN  NUMBER,
10157     p_rule_type             IN  VARCHAR2
10158  ) RETURN VARCHAR2 IS
10159 
10160  l_api_name         CONSTANT VARCHAR2(30) := 'has_unanswered_questions';
10161 
10162  CURSOR doc_template_dtls_csr IS
10163   select u.template_id, a.contract_expert_enabled, u.contract_source_code
10164   from okc_template_usages u, okc_terms_templates_all a
10165   where u.template_id = a.template_id
10166   and u.document_type = p_document_type
10167   and u.document_id = p_document_id;
10168 
10169   l_return_val     VARCHAR2(1);
10170   l_template_id okc_terms_templates_all.template_id%type;
10171   l_expert_enabled okc_terms_templates_all.contract_expert_enabled%type;
10172   l_contract_source okc_template_usages.contract_source_code%type;
10173   l_has_questions VARCHAR2(1);
10174   l_ce_enabled VARCHAR2(50);
10175 
10176 BEGIN
10177     l_return_val := 'N';
10178 
10179     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
10180       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'1100: Entering has_unanswered_questions ');
10181     END IF;
10182 
10183     OPEN  doc_template_dtls_csr ;
10184     FETCH doc_template_dtls_csr  into l_template_id, l_expert_enabled, l_contract_source;
10185     IF doc_template_dtls_csr%NOTFOUND THEN
10186        l_return_val := 'N';
10187     END IF;
10188     CLOSE doc_template_dtls_csr ;
10189 
10190     -- Bug#  6329925. Check if CE Profile is Enabled
10191     FND_PROFILE.GET(name=> 'OKC_K_EXPERT_ENABLED', val => l_ce_enabled);
10192 
10193     IF NVL(l_ce_enabled,'N') = 'N' OR l_contract_source <> 'STRUCTURED' OR NVL(l_expert_enabled, 'N') <> 'Y' THEN
10194        l_return_val := 'N';
10195 
10196     /* Expert is not run completely */
10197     ELSIF is_config_complete(
10198                               p_document_type, p_document_id) <> 'Y' THEN
10199           l_has_questions := check_rule_type_has_questions(
10200     			p_template_id => l_template_id,
10201 				p_rule_type => p_rule_type );
10202 
10203           IF l_has_questions = 'Y' THEN
10204              l_return_val := 'Y';
10205           END IF;
10206 
10207     END IF;
10208 
10209     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
10210       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'2000: Result has_unanswered_questions : ['||l_return_val||']');
10211     END IF;
10212 
10213     RETURN l_return_val;
10214 
10215 EXCEPTION
10216  WHEN OTHERS THEN
10217    IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
10218       FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'2000: Leaving has_unanswered_questions of EXCEPTION: '||sqlerrm);
10219    END IF;
10220  RETURN 'E';
10221 END has_unanswered_questions;
10222 
10223 END OKC_XPRT_UTIL_PVT ;