[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 ;