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