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