[Home] [Help]
PACKAGE BODY: APPS.OKS_WF_K_PROCESS_PVT
Source
1 PACKAGE BODY OKS_WF_K_PROCESS_PVT AS
2 /* $Header: OKSVKWFB.pls 120.66.12020000.2 2013/02/04 15:46:56 mchandak ship $ */
3
4 ------------------------------------------------------------------------------
5 -- GLOBAL CONSTANTS
6 ------------------------------------------------------------------------------
7 G_PKG_NAME CONSTANT VARCHAR2(200) := 'OKS_WF_K_PROCESS_PVT';
8 G_APP_NAME CONSTANT VARCHAR2(3) := 'OKS';
9
10 G_LEVEL_PROCEDURE CONSTANT NUMBER := FND_LOG.LEVEL_PROCEDURE;
11 G_MODULE CONSTANT VARCHAR2(250) := 'oks.plsql.'||g_pkg_name||'.';
12 G_APPLICATION_ID CONSTANT NUMBER :=515; -- OKS 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 G_RET_STS_WARNING CONSTANT VARCHAR2(1) := 'W';
21 G_RET_STS_ALREADY_PUBLISHED CONSTANT VARCHAR2(1) := 'P';
22 G_RET_STS_ACTION_NOT_ALWD CONSTANT VARCHAR2(1) := 'C';
23
24 G_ITEM_TYPE CONSTANT VARCHAR2(30) := 'OKSKPRCS';
25 G_MAIN_PROCESS CONSTANT VARCHAR2(30) := 'K_PROCESS';
26
27 G_RENEW_TYPE_ONLINE CONSTANT VARCHAR2(30) := 'ERN';
28 G_RENEW_TYPE_EVERGREEN CONSTANT VARCHAR2(30) := 'EVN';
29 G_RENEW_TYPE_MANUAL CONSTANT VARCHAR2(30) := 'NSR';
30 G_NEW_CONTRACT CONSTANT VARCHAR2(30) := 'MANUAL';
31
32 G_NEG_STS_PRE_DRAFT CONSTANT VARCHAR2(30) := 'PREDRAFT';
33 G_NEG_STS_DRAFT CONSTANT VARCHAR2(30) := 'DRAFT';
34 G_NEG_STS_QUOTE_SENT CONSTANT VARCHAR2(30) := 'SNT';
35 G_NEG_STS_QPUB_QA_FAIL CONSTANT VARCHAR2(30) := 'QPUB_QA_FAIL';
36 G_NEG_STS_PEND_PUBLISH CONSTANT VARCHAR2(30) := 'PEND_PUBLISH';
37 G_NEG_STS_PEND_IA CONSTANT VARCHAR2(30) := 'PENDING_IA';
38 G_NEG_STS_REJECTED CONSTANT VARCHAR2(30) := 'REJECTED';
39 G_NEG_STS_ASSIST_REQD CONSTANT VARCHAR2(30) := 'ASSIST_REQD';
40 G_NEG_STS_IA_QA_FAIL CONSTANT VARCHAR2(30) := 'IA_QA_FAIL';
41 G_NEG_STS_IA_FAIL CONSTANT VARCHAR2(30) := 'IA_FAIL';
42 G_NEG_STS_PEND_ACTIVATION CONSTANT VARCHAR2(30) := 'PEND_ACTIVATION';
43 -- In order to keep the compatibility maintained the same code
44 G_NEG_STS_QUOTE_ACPTD CONSTANT VARCHAR2(30) := 'ACT';
45 G_NEG_STS_QUOTE_DECLD CONSTANT VARCHAR2(30) := 'QUOTE_DECLD';
46 G_NEG_STS_QUOTE_CNCLD CONSTANT VARCHAR2(30) := 'QUOTE_CNCLD';
47 G_NEG_STS_COMPLETE CONSTANT VARCHAR2(30) := 'COMPLETE';
48
49 G_SALESREP_ACTION CONSTANT VARCHAR2(30) := 'SALESREP_ACTION';
50 G_CUST_ACTION CONSTANT VARCHAR2(30) := 'CUST_ACTION';
51
52 G_PERFORMED_BY_CUST CONSTANT VARCHAR2(30) := 'CUSTOMER';
53
54 G_IRR_FLAG_AUTOMATIC CONSTANT VARCHAR2(1) := 'A';
55 G_IRR_FLAG_MANUAL CONSTANT VARCHAR2(1) := 'M';
56 G_IRR_FLAG_REQD CONSTANT VARCHAR2(1) := 'Y';
57 G_IRR_FLAG_NOT_REQD CONSTANT VARCHAR2(1) := 'N';
58
59 G_NTF_TYPE_ACCEPT CONSTANT VARCHAR2(30) := 'ACCEPT';
60 G_NTF_TYPE_DECLINE CONSTANT VARCHAR2(30) := 'DECLINE';
61 G_NTF_TYPE_ERROR CONSTANT VARCHAR2(30) := 'ERROR';
62 G_NTF_TYPE_MESSAGE CONSTANT VARCHAR2(30) := 'MESSAGE';
63 G_NTF_TYPE_QA_FAIL CONSTANT VARCHAR2(30) := 'QA_FAILURE';
64 G_NTF_TYPE_QUOTE_PB CONSTANT VARCHAR2(30) := 'QUOTE_PB';
65 G_NTF_TYPE_ACTIVE CONSTANT VARCHAR2(30) := 'ACTIVE';
66 G_NTF_TYPE_RENEWED CONSTANT VARCHAR2(30) := 'RENEWED';
67
68 G_REPORT_TYPE_ACCEPT CONSTANT VARCHAR2(30) := 'ACCEPT';
69 G_REPORT_TYPE_ACTIVE CONSTANT VARCHAR2(30) := 'ACTIVE';
70 G_REPORT_TYPE_CANCEL CONSTANT VARCHAR2(30) := 'CANCEL';
71 G_REPORT_TYPE_QUOTE CONSTANT VARCHAR2(30) := 'QUOTE';
72
73 G_DEFAULT_NTF_PERFORMER CONSTANT VARCHAR2(30) := 'SYSADMIN';
74
75 G_LKUP_TYPE_NEGO_STATUS CONSTANT VARCHAR2(30) := 'OKS_AUTO_RENEW_STATUS';
76 G_LKUP_TYPE_CNCL_REASON CONSTANT VARCHAR2(30) := 'OKS_CANCEL_REASON';
77 G_LKUP_VNDR_CNCL_REASON CONSTANT VARCHAR2(30) := 'OKC_STS_CHG_REASON';
78 G_LKUP_TYPE_PAY_TYPES CONSTANT VARCHAR2(30) := 'OKS_OA_PAYMENT_TYPES';
79
80 G_MEDIA_TYPE_WEB_FORM CONSTANT VARCHAR2(30) := 'WEB FORM';
81
82 --cgopinee bugfix for 6787913
83 G_MUTE_PROFILE CONSTANT VARCHAR2(30) := 'OKC_SUPPRESS_EMAILS';
84 G_WF_NAME varchar2(100) := 'OKSKPRCS';
85 G_PROCESS_NAME varchar2(100) := 'K_PROCESS';
86
87 ------------------------------------------------------------------------------
88 -- EXCEPTIONS
89 ------------------------------------------------------------------------------
90 InvalidContractException EXCEPTION;
91 NegStatusUpdateException EXCEPTION;
92 ActionNotAllowedException EXCEPTION;
93 AlreadyPublishedException EXCEPTION;
94
95 FUNCTION get_fnd_message RETURN VARCHAR2 IS
96 i NUMBER := 0;
97 l_return_status VARCHAR2(1);
98 l_msg_count NUMBER;
99 l_msg_data VARCHAR2(2000);
100 l_msg_index_out NUMBER;
101 l_mesg VARCHAR2(2000) := NULL;
102 BEGIN
103 FOR i in 1..fnd_msg_pub.count_msg
104 LOOP
105 fnd_msg_pub.get
106 (
107 p_msg_index => i,
108 p_encoded => 'F',
109 p_data => l_msg_data,
110 p_msg_index_out => l_msg_index_out
111 );
112 IF l_mesg IS NULL THEN
113 l_mesg := i || ':' || l_msg_data;
114 ELSE
115 l_mesg := l_mesg || ':' || i || ':' || l_msg_data;
116 END IF;
117 END LOOP;
118 RETURN l_mesg;
119 END get_fnd_message;
120
121 FUNCTION replace_token
122 (
123 p_message IN VARCHAR2,
124 p_token IN VARCHAR2,
125 p_value IN VARCHAR2
126 ) RETURN VARCHAR2 AS
127
128 l_api_name CONSTANT VARCHAR2(30) := 'replace_token';
129 l_search_str VARCHAR2(50);
130 l_message VARCHAR2(2000);
131
132 BEGIN
133
134 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
135 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
136 'Entered '||G_PKG_NAME ||'.'||l_api_name);
137 END IF;
138
139 IF p_message IS NOT NULL THEN
140 l_search_str := '&' || p_token;
141 IF INSTR(p_message, l_search_str) <> 0 then
142 l_message := substrb(REPLACE(p_message, l_search_str, p_value),1,2000);
143 ELSE
144 l_message := substrb(p_message||' ('||p_token||'='||p_value||')',1,2000);
145 END IF;
146 ELSE
147 l_message := NULL;
148 END IF;
149
150 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
151 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
152 'Message: ' ||l_message);
153 END IF;
154
155 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
156 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
157 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
158 END IF;
159 RETURN l_message;
160
161 EXCEPTION
162 WHEN OTHERS THEN
163 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
164 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
165 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
166 ||SQLCODE||', sqlerrm = '||SQLERRM);
167 END IF;
168 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
169 RETURN NULL;
170 END replace_token;
171
172 FUNCTION get_message
173 (
174 p_message_name IN VARCHAR2,
175 p_language IN VARCHAR2
176 ) RETURN VARCHAR2 AS
177
178 l_api_name CONSTANT VARCHAR2(30) := 'get_message';
179
180 CURSOR l_fnd_msg_csr (p_msg_name VARCHAR2, p_lang VARCHAR2) IS
181 SELECT message_text
182 FROM fnd_new_messages m, fnd_application a
183 WHERE p_msg_name = m.message_name
184 AND p_lang = m.language_code
185 AND G_APP_NAME = a.application_short_name
186 AND m.application_id = a.application_id;
187
188 l_rownotfound BOOLEAN := FALSE;
189 l_message VARCHAR2(2000);
190
191 BEGIN
192
193 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
194 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
195 'Entered '||G_PKG_NAME ||'.'||l_api_name);
196 END IF;
197
198 IF p_language IS NOT NULL THEN
199 OPEN l_fnd_msg_csr(p_message_name,p_language);
200 FETCH l_fnd_msg_csr INTO l_message;
201 l_rownotfound := l_fnd_msg_csr%NOTFOUND;
202 CLOSE l_fnd_msg_csr;
203 END IF;
204
205 IF l_rownotfound THEN
206 l_message := NULL;
207 END IF;
208
209 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
210 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
211 'Message: ' ||l_message);
212 END IF;
213
214 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
215 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
216 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
217 END IF;
218 RETURN l_message;
219
220 EXCEPTION
221 WHEN OTHERS THEN
222 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
223 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
224 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
225 ||SQLCODE||', sqlerrm = '||SQLERRM);
226 END IF;
227 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
228 RETURN NULL;
229 END get_message;
230
231 FUNCTION get_concat_k_number
232 (
233 p_contract_id IN NUMBER
234 ) RETURN VARCHAR2 AS
235
236 l_api_name CONSTANT VARCHAR2(30) := 'get_concat_k_number';
237 l_item_key wf_items.item_key%TYPE :=NULL;
238
239 CURSOR l_kdetails_csr(p_contract_id NUMBER) IS
240 SELECT contract_number,contract_number_modifier
241 FROM okc_k_headers_all_b
242 WHERE id = p_contract_id;
243
244 l_kdetails_rec l_kdetails_csr%ROWTYPE;
245 l_rownotfound BOOLEAN := FALSE;
246 l_concat_k_number VARCHAR2(250);
247
248 BEGIN
249
250 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
251 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
252 'Entered '||G_PKG_NAME ||'.'||l_api_name);
253 END IF;
254
255 OPEN l_kdetails_csr(p_contract_id);
256 FETCH l_kdetails_csr INTO l_kdetails_rec;
257 l_rownotfound := l_kdetails_csr%NOTFOUND;
258 CLOSE l_kdetails_csr;
259
260 IF l_rownotfound THEN
261 l_concat_k_number := NULL;
262 ELSE
263 IF l_kdetails_rec.contract_number_modifier IS NULL THEN
264 l_concat_k_number := l_kdetails_rec.contract_number;
265 ELSE
266 l_concat_k_number := l_kdetails_rec.contract_number || ' - ' ||
267 l_kdetails_rec.contract_number_modifier;
268 END IF;
269 END IF;
270 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
271 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
272 'Contract Number: ' ||l_concat_k_number);
273 END IF;
274
275 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
276 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
277 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
278 END IF;
279 RETURN l_concat_k_number;
280
281 EXCEPTION
282 WHEN OTHERS THEN
283 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
284 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
285 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
286 ||SQLCODE||', sqlerrm = '||SQLERRM);
287 END IF;
288 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
289 RETURN NULL;
290 END get_concat_k_number;
291
292 FUNCTION get_lookup_meaning
293 (
294 p_lookup_code IN VARCHAR2,
295 p_lookup_type IN VARCHAR2
296 ) RETURN VARCHAR2 AS
297
298 l_api_name CONSTANT VARCHAR2(30) := 'get_lookup_meaning';
299 l_meaning VARCHAR2(250);
300
301 CURSOR l_lookup_csr IS
302 SELECT meaning
303 FROM FND_LOOKUPS
304 WHERE lookup_code = p_lookup_code
305 AND lookup_type = p_lookup_type;
306
307 BEGIN
308 -- start debug log
309 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
310 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
311 'Entered '||G_PKG_NAME ||'.'||l_api_name);
312 END IF;
313
314 OPEN l_lookup_csr;
315 FETCH l_lookup_csr INTO l_meaning;
316 CLOSE l_lookup_csr;
317
318 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
319 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
320 'Meaning: ' ||l_meaning);
321 END IF;
322
323 -- end debug log
324 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
325 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
326 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
327 END IF;
328
329 RETURN l_meaning;
330 EXCEPTION
331 WHEN OTHERS THEN
332 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
333 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
334 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
335 ||SQLCODE||', sqlerrm = '||SQLERRM);
336 END IF;
337 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
338 RETURN NULL;
339 END get_lookup_meaning;
340
341 FUNCTION get_wf_item_key
342 (
343 p_contract_id IN NUMBER
344 ) RETURN VARCHAR2 AS
345
346 l_api_name CONSTANT VARCHAR2(30) := 'get_wf_item_key';
347 l_item_key wf_items.item_key%TYPE :=NULL;
348
349
350 CURSOR csr_k_item_key IS
351 SELECT wf_item_key
352 FROM oks_k_headers_b
353 WHERE chr_id = p_contract_id;
354
355 l_rownotfound BOOLEAN := FALSE;
356 BEGIN
357 -- start debug log
358 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
359 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
360 'Entered '||G_PKG_NAME ||'.'||l_api_name);
361 END IF;
362
363 OPEN csr_k_item_key;
364 FETCH csr_k_item_key INTO l_item_key;
365 l_rownotfound := csr_k_item_key%NOTFOUND;
366 CLOSE csr_k_item_key;
367
368 IF l_rownotfound OR l_item_key IS NULL THEN
369 l_item_key := NULL;
370 END IF; -- item_key is null
371
372 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
373 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
374 'Item Key: ' ||l_item_key);
375 END IF;
376
377 -- end debug log
378 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
379 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
380 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
381 END IF;
382
383 RETURN l_item_key;
384 EXCEPTION
385 WHEN OTHERS THEN
386 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
387 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
388 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
389 ||SQLCODE||', sqlerrm = '||SQLERRM);
390 END IF;
391 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
392 END get_wf_item_key;
393
394 -- Check if a template is defined for a particular type of document
395 -- like ACTIVE, ACCEPT or DECLINE etc
396 PROCEDURE is_template_defined
397 (
398 p_api_version IN NUMBER,
399 p_init_msg_list IN VARCHAR2,
400 p_contract_id IN NUMBER,
401 p_document_type IN VARCHAR2,
402 x_template_defined_yn OUT NOCOPY VARCHAR2,
403 x_email_attr_rec OUT NOCOPY email_attr_rec,
404 x_return_status OUT NOCOPY VARCHAR2,
405 x_msg_data OUT NOCOPY VARCHAR2,
406 x_msg_count OUT NOCOPY NUMBER
407 ) IS
408
409 l_api_version CONSTANT NUMBER := 1.0;
410 l_api_name CONSTANT VARCHAR2(50) := 'is_template_defined';
411
412 CURSOR l_acceptedby_csr(p_user_id NUMBER) IS
413 SELECT user_name
414 FROM fnd_user fndu
415 WHERE fndu.user_id = p_user_id;
416
417 CURSOR l_party_csr(p_chr_id NUMBER) IS
418 SELECT b.party_name
419 FROM OKC_K_PARTY_ROLES_B a, hz_parties b
420 WHERE a.dnz_chr_id = p_chr_id
421 AND a.object1_id1 = b.party_id;
422
423 CURSOR l_kdetails_csr(p_chr_id NUMBER) IS
424 SELECT contract_number,contract_number_modifier,
425 to_char(OKS_EXTWAR_UTIL_PVT.round_currency_amt(estimated_amount,currency_code),
426 fnd_currency.get_format_mask(currency_code, 50)
427 ) estimated_amount, currency_code
428 FROM okc_k_headers_all_b
429 WHERE id = p_chr_id;
430
431 CURSOR l_install_lang_csr IS
432 SELECT language_code
433 FROM fnd_languages
434 WHERE installed_flag = 'B';
435
436 l_language VARCHAR2(50);
437 l_email_body_id NUMBER;
438 l_attachment_id NUMBER;
439 l_attachment_name VARCHAR2(150);
440 l_contract_status VARCHAR2(30);
441
442 l_kdetails_rec l_kdetails_csr%ROWTYPE;
443 l_party_name VARCHAR2(360);
444 l_concat_k_number VARCHAR2(300);
445 l_accepted_by VARCHAR2(100);
446 l_iso_language VARCHAR2(6);
447 l_iso_territory VARCHAR2(6);
448 l_gcd_language VARCHAR2(50);
449
450 BEGIN
451
452 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
453 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
454 'Entered '||G_PKG_NAME ||'.'||l_api_name||' with parameters');
455 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
456 'Contract ID: '||p_contract_id||
457 ' Document Type: '||p_document_type);
458 END IF;
459
460 -- Initialize message list if p_init_msg_list is set to TRUE.
461 IF FND_API.to_Boolean( p_init_msg_list ) THEN
462 FND_MSG_PUB.initialize;
463 END IF;
464
465 -- Initialize API return status to success
466 x_return_status := G_RET_STS_SUCCESS;
467 x_template_defined_yn := 'N';
468
469 IF p_contract_id IS NULL THEN
470 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_INVD_CONTRACT_ID');
471 FND_MESSAGE.SET_TOKEN('HDR_ID','null');
472 FND_MSG_PUB.add;
473 RAISE FND_API.G_EXC_ERROR;
474 END IF;
475 okc_context.set_okc_org_context(p_chr_id => p_contract_id);
476
477 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
478 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
479 'OKS_TEMPLATE_SET_PUB.get_template_set_dtls(p_contract_id= '
480 ||p_contract_id||' p_document_type ='||p_document_type||')');
481 END IF;
482
483 OKS_TEMPLATE_SET_PUB.get_template_set_dtls
484 (
485 p_api_version => l_api_version,
486 p_init_msg_list => G_FALSE,
487 p_contract_id => p_contract_id,
488 p_document_type => p_document_type,
489 x_template_language => l_language,
490 x_message_template_id => x_email_attr_rec.email_body_id,
491 x_attachment_template_id => x_email_attr_rec.attachment_id,
492 x_attachment_name => x_email_attr_rec.attachment_name,
493 x_contract_update_status => x_email_attr_rec.contract_status,
494 x_return_status => x_return_status,
495 x_msg_data => x_msg_data,
496 x_msg_count => x_msg_count
497 );
498
499 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
500 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
501 'OKS_TEMPLATE_SET_PUB.get_template_set_dtls(x_return_status= '||x_return_status||
502 ' x_msg_count ='||x_msg_count||')');
503 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
504 ' x_template_language ='||l_language||
505 ' x_message_template_id ='||x_email_attr_rec.email_body_id||
506 ' x_attachment_template_id ='||x_email_attr_rec.attachment_id||
507 ' x_attachment_name ='||x_email_attr_rec.attachment_name||
508 ' x_contract_update_status ='||x_email_attr_rec.contract_status);
509 END IF;
510 IF x_return_status <> G_RET_STS_SUCCESS THEN
511 RAISE FND_API.G_EXC_ERROR;
512 END IF;
513
514 IF NVL(x_email_attr_rec.email_body_id,x_email_attr_rec.attachment_id) IS NOT NULL THEN
515 x_template_defined_yn := 'Y';
516 ELSE
517 x_template_defined_yn := 'N';
518 END IF;
519
520 IF p_document_type IN (G_REPORT_TYPE_ACCEPT,G_REPORT_TYPE_CANCEL) THEN
521 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
522 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
523 'OKS_RENEW_UTIL_PVT.get_language_info(p_contract_id= '
524 ||p_contract_id||' p_document_type ='||p_document_type||')');
525 END IF;
526 OKS_RENEW_UTIL_PVT.get_language_info
527 (
528 p_api_version => l_api_version,
529 p_init_msg_list => G_FALSE,
530 p_contract_id => p_contract_id,
531 p_document_type => p_document_type,
532 p_template_id => NVL(x_email_attr_rec.email_body_id,x_email_attr_rec.attachment_id),
533 p_template_language => l_language,
534 x_fnd_language => l_language,
535 x_fnd_iso_language => l_iso_language,
536 x_fnd_iso_territory => l_iso_territory,
537 x_gcd_template_lang => l_gcd_language,
538 x_return_status => x_return_status,
539 x_msg_count => x_msg_count,
540 x_msg_data => x_msg_data
541 );
542 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
543 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
544 'OKS_RENEW_UTIL_PVT.get_language_info(x_return_status= '
545 ||x_return_status||' x_msg_count ='||x_msg_count||')');
546 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
547 ' x_fnd_language ='||l_language||
548 ' x_fnd_iso_language ='||l_iso_language||
549 ' x_fnd_iso_territory ='||l_iso_territory);
550 END IF;
551 IF x_return_status <> G_RET_STS_SUCCESS THEN
552 RAISE FND_API.G_EXC_ERROR;
553 END IF;
554 IF l_language IS NULL THEN
555 OPEN l_install_lang_csr;
556 FETCH l_install_lang_csr INTO l_language;
557 CLOSE l_install_lang_csr;
558 END IF;
559
560 OPEN l_kdetails_csr(p_contract_id);
561 FETCH l_kdetails_csr INTO l_kdetails_rec;
562 CLOSE l_kdetails_csr;
563
564 OPEN l_party_csr(p_contract_id);
565 FETCH l_party_csr INTO l_party_name;
566 CLOSE l_party_csr;
567
568 IF l_kdetails_rec.CONTRACT_NUMBER_MODIFIER IS NULL THEN
569 l_concat_k_number := l_kdetails_rec.CONTRACT_NUMBER;
570 ELSE
571 l_concat_k_number := l_kdetails_rec.CONTRACT_NUMBER || ' - ' ||
572 l_kdetails_rec.CONTRACT_NUMBER_MODIFIER;
573 END IF;
574
575 -- Depending on the type of email being sent get appropriate email subject
576 -- interaction history subject and message
577 -- Quote has been accepted by either salesrep or Customer
578 IF p_document_type = G_REPORT_TYPE_ACCEPT THEN
579 x_email_attr_rec.ih_subject := get_message('OKS_IH_SUBJECT_ACCEPT',l_language);
580 -- assemble interaction history body
581 OPEN l_acceptedby_csr(FND_GLOBAL.USER_ID);
582 FETCH l_acceptedby_csr INTO l_accepted_by;
583 CLOSE l_acceptedby_csr;
584
585 x_email_attr_rec.ih_message := get_message('OKS_IH_MESSAGE_ACCEPT',l_language);
586 x_email_attr_rec.ih_message := replace_token(x_email_attr_rec.ih_message,'K_NUMBER',l_concat_k_number);
587 x_email_attr_rec.ih_message := replace_token(x_email_attr_rec.ih_message,'K_AMOUNT',l_kdetails_rec.estimated_amount);
588 x_email_attr_rec.ih_message := replace_token(x_email_attr_rec.ih_message,'CURRENCY',l_kdetails_rec.currency_code);
589 x_email_attr_rec.ih_message := replace_token(x_email_attr_rec.ih_message,'CUST_NAME',l_party_name);
590 x_email_attr_rec.ih_message := replace_token(x_email_attr_rec.ih_message,'ACCEPTED_BY',l_accepted_by);
591
592 IF x_template_defined_yn = 'Y' THEN
593 x_email_attr_rec.email_subject := get_message('OKS_EMAIL_SUB_ACCEPT',l_language);
594 x_email_attr_rec.email_subject := replace_token(x_email_attr_rec.email_subject,'K_NUMBER',l_concat_k_number);
595 x_email_attr_rec.email_subject := replace_token(x_email_attr_rec.email_subject,'K_AMOUNT',l_kdetails_rec.estimated_amount);
596 x_email_attr_rec.email_subject := replace_token(x_email_attr_rec.email_subject,'CURRENCY',l_kdetails_rec.currency_code);
597 x_email_attr_rec.email_subject := replace_token(x_email_attr_rec.email_subject,'CUST_NAME',l_party_name);
598 END IF;
599
600 -- Quote has been declined by customer or cancelled by salesrep
601 ELSIF p_document_type = G_REPORT_TYPE_CANCEL THEN
602 x_email_attr_rec.ih_subject := get_message('OKS_IH_SUBJECT_CANCEL',l_language);
603 -- assemble interaction history body
604 x_email_attr_rec.ih_message := get_message('OKS_IH_MESSAGE_CANCEL',l_language);
605 x_email_attr_rec.ih_message := replace_token(x_email_attr_rec.ih_message,'K_NUMBER',l_concat_k_number);
606 x_email_attr_rec.ih_message := replace_token(x_email_attr_rec.ih_message,'K_AMOUNT',l_kdetails_rec.estimated_amount);
607 x_email_attr_rec.ih_message := replace_token(x_email_attr_rec.ih_message,'CURRENCY',l_kdetails_rec.currency_code);
608 x_email_attr_rec.ih_message := replace_token(x_email_attr_rec.ih_message,'CUST_NAME',l_party_name);
609
610 IF x_template_defined_yn = 'Y' THEN
611 x_email_attr_rec.email_subject := get_message('OKS_EMAIL_SUB_CANCEL',l_language);
612 x_email_attr_rec.email_subject := replace_token(x_email_attr_rec.email_subject,'K_NUMBER',l_concat_k_number);
613 x_email_attr_rec.email_subject := replace_token(x_email_attr_rec.email_subject,'K_AMOUNT',l_kdetails_rec.estimated_amount);
614 x_email_attr_rec.email_subject := replace_token(x_email_attr_rec.email_subject,'CURRENCY',l_kdetails_rec.currency_code);
615 x_email_attr_rec.email_subject := replace_token(x_email_attr_rec.email_subject,'CUST_NAME',l_party_name);
616 END IF;
617
618 END IF;
619
620 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
621 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT,G_MODULE||l_api_name,
622 substr('IH Subject '||x_email_attr_rec.ih_subject,1,240) ||
623 substr(' IH Message '||x_email_attr_rec.ih_message,1,240)||
624 substr(' Email subject '||x_email_attr_rec.email_subject,1,240));
625 END IF;
626 END IF;
627
628 -- Standard call to get message count and if count is 1, get message info.
629 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count=>x_msg_count, p_data=>x_msg_data);
630
631 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
632 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
633 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
634 END IF;
635
636 EXCEPTION
637 WHEN FND_API.G_EXC_ERROR THEN
638 x_return_status := G_RET_STS_ERROR;
639 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
640 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
641 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
642 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.ERROR');
643 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,get_fnd_message);
644 END IF;
645 WHEN OTHERS THEN
646 x_return_status := G_RET_STS_UNEXP_ERROR;
647 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
648 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
649 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
650 ||SQLCODE||', sqlerrm = '||SQLERRM);
651 END IF;
652 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
653 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
654 END is_template_defined;
655
656 FUNCTION get_irr_flag
657 (
658 p_contract_id IN NUMBER,
659 p_item_key IN VARCHAR2
660 ) RETURN VARCHAR2 AS
661
662 l_api_name CONSTANT VARCHAR2(30) := 'get_irr_flag';
663 l_item_key wf_items.item_key%TYPE :=NULL;
664 l_irr_flag VARCHAR2(1) := NULL;
665
666 BEGIN
667
668 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
669 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
670 'Entered '||G_PKG_NAME ||'.'||l_api_name||
671 ' with p_contract_id: '||p_contract_id||'p_item_key '||p_item_key);
672 END IF;
673
674 IF p_item_key IS NULL THEN
675 IF p_contract_id IS NOT NULL THEN
676 l_item_key := get_wf_item_key(p_contract_id);
677 ELSE
678 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_INVD_CONTRACT_ID');
679 FND_MESSAGE.SET_TOKEN('HDR_ID',p_contract_id);
680 FND_MSG_PUB.add;
681 RAISE FND_API.G_EXC_ERROR;
682 END IF;
683 ELSE
684 l_item_key := p_item_key;
685 END IF;
686
687 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
688 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
689 'Item Key: ' ||l_item_key);
690 END IF;
691
692 l_irr_flag := wf_engine.GetItemAttrText(
693 itemtype => G_ITEM_TYPE,
694 itemkey => l_item_key,
695 aname => 'IRR_FLAG');
696
697 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
698 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
699 'Irr Flag: ' ||NVL(l_irr_flag,'NULL'));
700 END IF;
701
702 IF l_irr_flag IN (G_IRR_FLAG_AUTOMATIC,G_IRR_FLAG_MANUAL,G_IRR_FLAG_REQD) THEN
703 l_irr_flag := G_IRR_FLAG_REQD;
704 ELSIF l_irr_flag = G_IRR_FLAG_NOT_REQD THEN
705 l_irr_flag := G_IRR_FLAG_NOT_REQD;
706 ELSE
707 l_irr_flag := G_IRR_FLAG_REQD;
708 END IF;
709
710 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
711 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
712 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' with l_irr_flag '||l_irr_flag);
713 END IF;
714
715 RETURN l_irr_flag;
716 EXCEPTION
717 WHEN FND_API.G_EXC_ERROR THEN
718 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
719 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
720 'Leaving with Exception '||G_PKG_NAME ||'.'||l_api_name);
721 END IF;
722 RETURN NULL;
723 WHEN OTHERS THEN
724 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
725 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
726 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
727 ||SQLCODE||', sqlerrm = '||SQLERRM);
728 END IF;
729 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
730 RETURN NULL;
731 END get_irr_flag;
732
733 FUNCTION activity_exist_in_process
734 (
735 p_item_type IN VARCHAR2,
736 p_item_key IN VARCHAR2,
737 p_activity_name IN VARCHAR2
738 ) RETURN BOOLEAN AS
739
740 l_activity_status VARCHAR2(3);
741 l_rowfound BOOLEAN := FALSE;
742 l_api_name CONSTANT VARCHAR2(50) := 'activity_exist_in_process';
743 CURSOR check_activity_csr IS
744 SELECT '1'
745 FROM wf_item_activity_statuses wias, wf_process_activities wpa
746 WHERE wias.item_type = p_item_type
747 AND wias.item_key = p_item_key
748 AND wias.process_activity = wpa.instance_id
749 AND wpa.ACTIVITY_ITEM_TYPE = p_item_type
750 AND wpa.activity_name = p_activity_name
751 AND wias.activity_status = 'NOTIFIED';
752 BEGIN
753
754 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
755 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
756 'Entered '||G_PKG_NAME ||'.'||l_api_name );
757 END IF;
758 OPEN check_activity_csr;
759 FETCH check_activity_csr INTO l_activity_status;
760 l_rowfound := check_activity_csr%FOUND;
761 CLOSE check_activity_csr;
762 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
763 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
764 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' l_activity_status='||l_activity_status);
765 END IF;
766 RETURN l_rowfound;
767 EXCEPTION
768 WHEN OTHERS THEN
769 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
770 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
771 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
772 ||SQLCODE||', sqlerrm = '||SQLERRM);
773 END IF;
774 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
775 RETURN FALSE;
776 END activity_exist_in_process;
777
778 FUNCTION get_notified_activity
779 (
780 p_item_type IN VARCHAR2,
781 p_item_key IN VARCHAR2
782 ) RETURN VARCHAR2 AS
783
784 l_activity_name VARCHAR2(30) := NULL;
785 l_api_name CONSTANT VARCHAR2(50) := 'get_notified_activity';
786
787 CURSOR check_activity_csr IS
788 SELECT ACTIVITY_NAME
789 FROM wf_item_activity_statuses wias, wf_process_activities wpa
790 WHERE wias.item_type = p_item_type
791 AND wias.item_key = p_item_key
792 AND wias.process_activity = wpa.instance_id
793 AND wpa.ACTIVITY_ITEM_TYPE = p_item_type
794 AND wias.activity_status = 'NOTIFIED';
795 BEGIN
796
797 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
798 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
799 'Entered '||G_PKG_NAME ||'.'||l_api_name );
800 END IF;
801 OPEN check_activity_csr;
802 FETCH check_activity_csr INTO l_activity_name;
803 CLOSE check_activity_csr;
804 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
805 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
806 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' l_activity_name='||l_activity_name);
807 END IF;
808 RETURN nvl(l_activity_name, '?');
809 EXCEPTION
810 WHEN OTHERS THEN
811 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
812 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
813 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
814 ||SQLCODE||', sqlerrm = '||SQLERRM);
815 END IF;
816 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
817 RETURN 'ERR';
818 END get_notified_activity;
819
820 /*=========================================================================
821 API name : is_online_k_yn
822 Type : Private.
823 Function : This procedure determines whether the contract is going
824 through online process (either by qualification or by
825 being submitted by salesrep).
826 Pre-reqs : None.
827 Parameters :
828 IN : p_api_version IN NUMBER Required
829 Api version
830 : p_init_msg_list IN VARCHAR2 Required
831 Initialize message stack parameter
832 : p_contract_id IN NUMBER Required
833 Contract header Id
834 : p_item_key IN VARCHAR2 Required
835 Contract process workflow's item key.
836 OUT : x_online_yn OUT VARCHAR2(1)
837 Returns 'Y' if going through online process else 'N'.
838 : x_return_status OUT VARCHAR2(1)
839 Api return status
840 : x_msg_count OUT NUMBER
841 Count of message on error stack
842 : x_msg_data OUT VARCHAR2
843 Actual error messages on error stack
844 Note :
845 =========================================================================*/
846 PROCEDURE is_online_k_yn
847 (
848 p_api_version IN NUMBER,
849 p_init_msg_list IN VARCHAR2,
850 p_contract_id IN NUMBER,
851 p_item_key IN VARCHAR2,
852 x_online_yn OUT NOCOPY VARCHAR2,
853 x_return_status OUT NOCOPY VARCHAR2,
854 x_msg_count OUT NOCOPY NUMBER,
855 x_msg_data OUT NOCOPY VARCHAR2
856 ) IS
857
858 l_api_version CONSTANT NUMBER := 1.0;
859 l_api_name CONSTANT VARCHAR2(50) := 'is_online_k_yn';
860
861 l_item_key wf_items.item_key%TYPE;
862 l_publish_manually VARCHAR2(1);
863 l_process_type VARCHAR2(30);
864
865 BEGIN
866
867 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
868 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
869 'Entered '||G_PKG_NAME ||'.'||l_api_name||'with Contract Id '||p_contract_id);
870 END IF;
871
872 -- Standard call to check for call compatibility.
873 IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
874 x_return_status := G_RET_STS_ERROR;
875 RAISE FND_API.G_EXC_ERROR;
876 END IF;
877
878 -- Initialize message list if p_init_msg_list is set to TRUE.
879 IF FND_API.to_Boolean( p_init_msg_list ) THEN
880 FND_MSG_PUB.initialize;
881 END IF;
882
883 -- Initialize API return status to success
884 x_return_status := FND_API.G_RET_STS_SUCCESS;
885
886 IF p_contract_id IS NULL THEN
887 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_INVD_CONTRACT_ID');
888 FND_MESSAGE.SET_TOKEN('HDR_ID',p_contract_id);
889 FND_MSG_PUB.add;
890 RAISE FND_API.G_EXC_ERROR;
891 END IF;
892
893 IF p_item_key IS NULL THEN
894 l_item_key := get_wf_item_key(p_contract_id => p_contract_id);
895 IF l_item_key IS NULL THEN
896 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INVALID_WF_ITEM_KEY');
897 FND_MSG_PUB.add;
898 RAISE FND_API.G_EXC_ERROR;
899 END IF;
900 ELSE
901 l_item_key := p_item_key;
902 END IF;
903
904 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
905 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
906 'Item Key found '||l_item_key);
907 END IF;
908
909 l_publish_manually := wf_engine.GetItemAttrText(
910 itemtype => G_ITEM_TYPE,
911 itemkey => l_item_key,
912 aname => 'PUBLISH_MAN_YN');
913 IF NVL(l_publish_manually,'N') = 'Y' THEN
914 x_online_yn := 'Y';
915 ELSE
916 l_process_type := wf_engine.GetItemAttrText(
917 itemtype => G_ITEM_TYPE,
918 itemkey => l_item_key,
919 aname => 'PROCESS_TYPE');
920 -- bug fix 5661529
921 IF NVL(l_process_type, G_RENEW_TYPE_MANUAL) = G_RENEW_TYPE_ONLINE THEN
922 x_online_yn := 'Y';
923 ELSE
924 x_online_yn := 'N';
925 END IF;
926 END IF;
927 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
928 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
929 'Publish manual Flag '||l_publish_manually ||
930 ' Process Type '|| l_process_type ||
931 ' Online YN ' || x_online_yn);
932 END IF;
933 -- Standard call to get message count and if count is 1, get message info.
934 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count=>x_msg_count, p_data=>x_msg_data);
935
936 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
937 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
938 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
939 END IF;
940
941 EXCEPTION
942 WHEN FND_API.G_EXC_ERROR THEN
943 x_return_status := G_RET_STS_ERROR;
944 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
945 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
946 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
947 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.ERROR');
948 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,get_fnd_message);
949 END IF;
950 WHEN OTHERS THEN
951 x_return_status := G_RET_STS_UNEXP_ERROR;
952 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
953 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
954 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
955 ||SQLCODE||', sqlerrm = '||SQLERRM);
956 END IF;
957 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
958 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
959 END is_online_k_yn;
960
961 PROCEDURE complete_activity
962 (
963 p_api_version IN NUMBER,
964 p_init_msg_list IN VARCHAR2,
965 p_contract_id IN NUMBER,
966 p_item_key IN VARCHAR2,
967 p_resultout IN VARCHAR2,
968 p_process_status IN VARCHAR2,
969 p_activity_name IN VARCHAR2,
970 x_return_status OUT NOCOPY VARCHAR2,
971 x_msg_data OUT NOCOPY VARCHAR2,
972 x_msg_count OUT NOCOPY NUMBER
973 ) AS
974
975 l_api_version CONSTANT NUMBER := 1;
976 l_api_name CONSTANT VARCHAR2(30) := 'complete_activity';
977 l_item_key wf_items.item_key%TYPE;
978
979 BEGIN
980 -- start debug log
981 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
982 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
983 'Entered '||G_PKG_NAME ||'.'||l_api_name||' with p_contract_id '||p_contract_id);
984 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
985 'and p_item_key '||p_item_key||' p_resultout ='||p_resultout||
986 ' p_process_status ='||p_process_status||' p_activity_name ='||p_activity_name);
987 END IF;
988
989 -- Standard call to check for call compatibility.
990 IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
991 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
992 END IF;
993
994 -- Initialize message list if p_init_msg_list is set to TRUE.
995 IF FND_API.to_Boolean( p_init_msg_list ) THEN
996 FND_MSG_PUB.initialize;
997 END IF;
998
999 -- Initialize API return status to success
1000 x_return_status := FND_API.G_RET_STS_SUCCESS;
1001
1002 IF p_item_key IS NULL THEN
1003 l_item_key := get_wf_item_key(p_contract_id);
1004 IF l_item_key IS NULL THEN
1005 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INVALID_WF_ITEM_KEY');
1006 FND_MSG_PUB.add;
1007 RAISE FND_API.G_EXC_ERROR;
1008 END IF;
1009 ELSE
1010 l_item_key := p_item_key;
1011 END IF; -- p_item_key IS NULL
1012
1013 -- if p_process_status is passed then update the renewal status in oks_k_headers_b
1014 IF p_process_status IS NOT NULL THEN
1015 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1016 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
1017 'Updating Contract '||G_PKG_NAME ||'.'||l_api_name);
1018 END IF;
1019
1020 UPDATE oks_k_headers_b
1021 SET renewal_status = p_process_status ,
1022 -- commented and replaced following 2 lines. Accepted by and date accepted were getting cleared
1023 -- accepted_by = DECODE(p_process_status,G_NEG_STS_QUOTE_ACPTD,FND_GLOBAL.USER_ID,accepted_by),
1024 -- date_accepted = DECODE(p_process_status,G_NEG_STS_QUOTE_ACPTD,sysdate,date_accepted),
1025 accepted_by = DECODE(p_process_status,G_NEG_STS_QUOTE_ACPTD,NVL(accepted_by,FND_GLOBAL.USER_ID),accepted_by),
1026 date_accepted = DECODE(p_process_status,G_NEG_STS_QUOTE_ACPTD,NVL(date_accepted,sysdate),date_accepted),
1027 object_version_number = object_version_number + 1,
1028 last_update_date = SYSDATE,
1029 last_updated_by = FND_GLOBAL.USER_ID,
1030 last_update_login = FND_GLOBAL.LOGIN_ID
1031 WHERE chr_id = p_contract_id;
1032
1033 /* MKS 10/12/2005 Bug#4643300
1034 -- bump up the minor version number
1035 UPDATE okc_k_vers_numbers
1036 SET minor_version = minor_version + 1,
1037 object_version_number = object_version_number + 1,
1038 last_update_date = SYSDATE,
1039 last_updated_by = FND_GLOBAL.USER_ID,
1040 last_update_login = FND_GLOBAL.LOGIN_ID
1041 WHERE chr_id = p_contract_id;
1042 */
1043 END IF; -- p_process_status is passed
1044
1045 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1046 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
1047 'Completing Activity '||G_PKG_NAME ||'.'||l_api_name);
1048 END IF;
1049
1050 -- Call the wf complete activity
1051 wf_engine.completeactivityinternalname
1052 (
1053 itemtype => G_ITEM_TYPE,
1054 itemkey => l_item_key,
1055 activity => p_activity_name,
1056 result => p_resultout
1057 );
1058
1059
1060 -- Standard call to get message count and if count is 1, get message info.
1061 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
1062
1063 -- end debug log
1064 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1065 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
1066 G_MODULE||l_api_name,
1067 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
1068 END IF;
1069
1070 EXCEPTION
1071 WHEN FND_API.G_EXC_ERROR THEN
1072 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
1073 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1074 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
1075 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_ERROR');
1076 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
1077 END IF;
1078 x_return_status := G_RET_STS_ERROR ;
1079
1080 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1081 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
1082 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1083 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
1084 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_UNEXPECTED_ERROR');
1085 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
1086 END IF;
1087 x_return_status := G_RET_STS_UNEXP_ERROR ;
1088
1089 WHEN OTHERS THEN
1090 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1091 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
1092 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from OTHERS sqlcode = '
1093 ||SQLCODE||', sqlerrm = '||SQLERRM);
1094 END IF;
1095 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
1096 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
1097 x_return_status := G_RET_STS_UNEXP_ERROR ;
1098 END complete_activity;
1099
1100 FUNCTION get_negotiation_status
1101 (
1102 p_contract_id IN NUMBER
1103 ) RETURN VARCHAR2 AS
1104
1105 l_api_name CONSTANT VARCHAR2(30) := 'get_negotiation_status';
1106
1107 CURSOR l_NegotiationStatus_csr(l_contract_id NUMBER) IS
1108 SELECT renewal_status
1109 FROM oks_k_headers_b
1110 WHERE chr_id = l_contract_id;
1111
1112 l_negotiation_status VARCHAR2(30);
1113 BEGIN
1114 -- start debug log
1115 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1116 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
1117 'Entered '||G_PKG_NAME ||'.'||l_api_name||' with p_contract_id '||p_contract_id);
1118 END IF;
1119
1120 -- Get negotiation status
1121 OPEN l_NegotiationStatus_csr(p_contract_id);
1122 FETCH l_NegotiationStatus_csr INTO l_negotiation_status;
1123 CLOSE l_NegotiationStatus_csr;
1124
1125 IF l_negotiation_status IS NULL THEN
1126 fnd_message.set_name(G_APP_NAME,'OKS_INVALID_NEG_STATUS');
1127 fnd_msg_pub.add;
1128 RAISE FND_API.G_EXC_ERROR;
1129 END IF;
1130
1131 -- end debug log
1132 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1133 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
1134 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' with negotiation status '||l_negotiation_status);
1135 END IF;
1136
1137 RETURN l_negotiation_status;
1138 EXCEPTION
1139 WHEN FND_API.G_EXC_ERROR THEN
1140 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1141 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
1142 'Leaving with Exception '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_ERROR');
1143 END IF;
1144 RETURN NULL;
1145 WHEN OTHERS THEN
1146 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1147 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
1148 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
1149 ||SQLCODE||', sqlerrm = '||SQLERRM);
1150 END IF;
1151 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
1152 RETURN NULL;
1153
1154 END get_negotiation_status;
1155
1156 /*=========================================================================
1157 API name : in_process_yn
1158 Type : Private.
1159 Function : This procedure determines whether the contract is going
1160 through approval process so that Authoring can open the
1161 contract in read-only more. This is a replacement api for
1162 IN_PROCESS_YN in OKSAUDET.pld. Signature is kept so as to
1163 make it no impact for Authoring.
1164 Pre-reqs : None.
1165 Parameters :
1166 IN : p_contract_number IN VARCHAR2 Required
1167 Contract Number
1168 : p_contract_number_modifier IN VARCHAR2 Required
1169 Contract Number Modifier
1170 : p_workflow_name IN VARCHAR2 Required
1171 Approval Workflow Name
1172 : p_chr_id IN NUMBER
1173 Contract header Id
1174 OUT : x_active OUT VARCHAR2(1)
1175 Returns 'Y' if in process else 'N'
1176 Note :
1177 =========================================================================*/
1178 FUNCTION in_process_yn
1179 (
1180 p_contract_number IN VARCHAR2,
1181 p_contract_number_modifier IN VARCHAR2,
1182 p_workflow_name IN VARCHAR2,
1183 p_chr_id IN NUMBER DEFAULT NULL
1184 ) RETURN VARCHAR2 AS
1185
1186 l_api_name CONSTANT VARCHAR2(30) := 'in_process_yn';
1187
1188 CURSOR l_wfactive_csr IS
1189 SELECT 'Y'
1190 FROM wf_items
1191 WHERE item_type = p_workflow_name
1192 AND item_key = p_contract_number || p_contract_number_modifier
1193 AND end_date IS NULL;
1194
1195 CURSOR l_chrid_csr IS
1196 SELECT id
1197 FROM okc_k_headers_all_b
1198 WHERE contract_number = p_contract_number
1199 AND contract_number_modifier = p_contract_number_modifier;
1200
1201 l_rownotfound BOOLEAN := FALSE;
1202 l_chr_id NUMBER;
1203 l_negotiation_status VARCHAR2(30);
1204 x_active VARCHAR2(1) := 'N';
1205
1206 BEGIN
1207
1208 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1209 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
1210 'Entered '||G_PKG_NAME ||'.'||l_api_name);
1211 END IF;
1212
1213 OPEN l_wfactive_csr;
1214 FETCH l_wfactive_csr INTO x_active;
1215 l_rownotfound := l_wfactive_csr%NOTFOUND;
1216 CLOSE l_wfactive_csr;
1217
1218 IF l_rownotfound THEN
1219 IF p_chr_id IS NULL THEN
1220 OPEN l_chrid_csr;
1221 FETCH l_chrid_csr INTO l_chr_id;
1222 CLOSE l_chrid_csr;
1223 l_negotiation_status := get_negotiation_status(p_contract_id => l_chr_id);
1224 ELSE
1225 l_negotiation_status := get_negotiation_status(p_contract_id => p_chr_id);
1226 END IF;
1227
1228 IF NVL(l_negotiation_status,'X') IN ('PEND_PUBLISH','PEND_ACTIVATION') THEN
1229 x_active := 'Y';
1230 END IF;
1231 END IF;
1232
1233 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1234 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,'In process? '||x_active);
1235 END IF;
1236
1237 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1238 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
1239 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
1240 END IF;
1241 RETURN x_active;
1242
1243 EXCEPTION
1244 WHEN OTHERS THEN
1245 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1246 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
1247 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
1248 ||SQLCODE||', sqlerrm = '||SQLERRM);
1249 END IF;
1250 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
1251 RETURN NULL;
1252 END in_process_yn;
1253
1254 FUNCTION get_qto_email
1255 (
1256 p_contract_id IN NUMBER
1257 ) RETURN VARCHAR2 AS
1258
1259 l_api_name CONSTANT VARCHAR2(30) := 'get_qto_email';
1260
1261 CURSOR l_QToContact_csr ( l_contract_id NUMBER ) IS
1262 SELECT quote_to_email_id
1263 FROM oks_k_headers_b
1264 WHERE chr_id = l_contract_id;
1265
1266 CURSOR l_emailAddress_csr ( p_contactPoint_id NUMBER ) IS
1267 SELECT email_address
1268 FROM hz_contact_points
1269 WHERE contact_point_id = p_contactPoint_id
1270 AND content_source_type = 'USER_ENTERED';
1271
1272 l_qto_email VARCHAR2(2000);
1273 l_contact_id NUMBER;
1274 BEGIN
1275 -- start debug log
1276 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1277 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
1278 'Entered '||G_PKG_NAME ||'.'||l_api_name||' with p_contract_id '||p_contract_id);
1279 END IF;
1280
1281 -- Get contact point id of Quote To contact's email address
1282 OPEN l_QToContact_csr(p_contract_id);
1283 FETCH l_QToContact_csr INTO l_contact_id;
1284 CLOSE l_QToContact_csr;
1285
1286 IF l_contact_id IS NULL THEN
1287 fnd_message.set_name(G_APP_NAME,'OKS_NO_QTO_CONTACT');
1288 fnd_msg_pub.add;
1289 RAISE FND_API.G_EXC_ERROR;
1290 END IF;
1291
1292 OPEN l_emailAddress_csr (l_contact_id) ;
1293 FETCH l_emailAddress_csr INTO l_qto_email;
1294 CLOSE l_emailAddress_csr;
1295
1296 IF l_qto_email IS NULL THEN
1297 fnd_message.set_name(G_APP_NAME,'OKS_NO_QTO_EMAIL');
1298 fnd_msg_pub.add;
1299 RAISE FND_API.G_EXC_ERROR;
1300 END IF;
1301
1302 -- end debug log
1303 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1304 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
1305 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' with l_qto_email '||l_qto_email);
1306 END IF;
1307
1308 RETURN l_qto_email;
1309 EXCEPTION
1310 WHEN FND_API.G_EXC_ERROR THEN
1311 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1312 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
1313 'Leaving with Exception '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_ERROR');
1314 END IF;
1315 RETURN NULL;
1316 WHEN OTHERS THEN
1317 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1318 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
1319 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
1320 ||SQLCODE||', sqlerrm = '||SQLERRM);
1321 END IF;
1322 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
1323 RETURN NULL;
1324
1325 END get_qto_email;
1326
1327 /*=========================================================================
1328 API name : set_notification_attributes
1329 Type : Private.
1330 Function : This procedure sets all the relavant wf item attribute
1331 values that will be used in notifications.
1332 Pre-reqs : None.
1333 Parameters :
1334 IN : p_api_version IN NUMBER Required
1335 Api version
1336 : p_init_msg_list IN VARCHAR2 Required
1337 Initialize message stack parameter
1338 : p_notif_attr IN VARCHAR2 Required
1339 Workflow item attributes related to notifications.
1340 OUT : x_return_status OUT VARCHAR2(1)
1341 Api return status
1342 : x_msg_count OUT NUMBER
1343 Count of message on error stack
1344 : x_msg_data OUT VARCHAR2
1345 Actual error messages on error stack
1346 Note :
1347 =========================================================================*/
1348 PROCEDURE set_notification_attributes
1349 (
1350 p_api_version IN NUMBER,
1351 p_init_msg_list IN VARCHAR2,
1352 p_notif_attr IN notif_attr_rec,
1353 x_return_status OUT NOCOPY VARCHAR2,
1354 x_msg_data OUT NOCOPY VARCHAR2,
1355 x_msg_count OUT NOCOPY NUMBER
1356 ) IS
1357 l_api_version CONSTANT NUMBER := 1.0;
1358 l_api_name CONSTANT VARCHAR2(50) := 'set_notification_attributes';
1359
1360 CURSOR l_party_csr(p_chr_id NUMBER) IS
1361 SELECT b.party_name
1362 FROM OKC_K_PARTY_ROLES_B a, hz_parties b
1363 WHERE a.dnz_chr_id = p_chr_id
1364 AND a.object1_id1 = b.party_id;
1365
1366 CURSOR l_kdetails_csr(p_chr_id NUMBER) IS
1367 SELECT okch.contract_number,okch.contract_number_modifier,
1368 to_char(OKS_EXTWAR_UTIL_PVT.round_currency_amt(okch.estimated_amount,okch.currency_code),
1369 fnd_currency.get_format_mask(okch.currency_code, 50)
1370 ) estimated_amount,okch.currency_code,hro.name,okch.short_description
1371 FROM okc_k_headers_all_v okch, hr_all_organization_units hro
1372 WHERE okch.id = p_chr_id
1373 AND hro.organization_id = okch.authoring_org_id;
1374
1375 -- Get Vendor contact or helpdesk name
1376 CURSOR l_contact_name_csr(p_user_name VARCHAR2) IS
1377 SELECT source_name
1378 FROM jtf_rs_resource_extns
1379 WHERE user_name = p_user_name;
1380
1381 -- Get quote To contact fnd user name
1382 CURSOR l_qto_name_csr(p_chr_id NUMBER) IS
1383 SELECT fu.user_name
1384 FROM oks_k_headers_b ks, fnd_user fu
1385 WHERE ks.chr_id = p_chr_id
1386 AND fu.person_party_id = ks.person_party_id;
1387
1388 -- Get quote To contact name
1389 CURSOR l_qtocontact_name_csr(p_chr_id NUMBER) IS
1390 select SUBSTRB(P.PERSON_LAST_NAME,1,50) || ', ' || SUBSTRB(P.PERSON_FIRST_NAME,1,40) name
1391 FROM OKS_K_HEADERS_B OKSH,
1392 HZ_CUST_ACCOUNT_ROLES CAR,
1393 HZ_PARTIES P,
1394 HZ_RELATIONSHIPS R
1395 WHERE OKSH.quote_to_contact_id = car.CUST_ACCOUNT_ROLE_ID
1396 AND CAR.ROLE_TYPE = 'CONTACT'
1397 AND R.PARTY_ID = CAR.PARTY_ID
1398 AND R.CONTENT_SOURCE_TYPE = 'USER_ENTERED'
1399 AND P.PARTY_ID = R.SUBJECT_ID
1400 AND R.DIRECTIONAL_FLAG = 'F'
1401 AND oksh.chr_id = p_chr_id;
1402
1403 -- Get original contract number and modifier of the renewed contract
1404 CURSOR l_old_k_num(p_chr_id NUMBER) IS
1405 SELECT decode(kh.contract_number_modifier,NULL,kh.contract_number, kh.contract_number||' - '|| kh.contract_number_modifier)
1406 FROM okc_operation_lines ol,
1407 okc_operation_instances oi,
1408 okc_class_operations co,
1409 okc_k_headers_all_b kh
1410 WHERE co.cls_code = 'SERVICE'
1411 AND co.opn_code = 'RENEWAL'
1412 AND co.id = oi.cop_id
1413 AND ol.oie_id = oi.id
1414 AND ol.subject_chr_id = p_chr_id
1415 AND ol.object_chr_id IS NOT NULL
1416 AND ol.object_cle_id IS NULL
1417 AND ol.subject_cle_id IS NULL
1418 AND ol.process_flag = 'P'
1419 AND ol.object_chr_id = kh.id;
1420
1421 l_kdetails_rec l_kdetails_csr%ROWTYPE;
1422 l_item_key wf_items.item_key%TYPE;
1423 l_party_name VARCHAR2(360);
1424 l_notif_subject VARCHAR2(2000);
1425 l_salesrep_id NUMBER;
1426 l_salesrep_name VARCHAR2(100);
1427 l_concat_k_number VARCHAR2(250);
1428 l_old_k_number VARCHAR2(250);
1429 l_vc_name VARCHAR2(360);
1430 l_from_role VARCHAR2(360);
1431 l_rownotfound BOOLEAN := FALSE;
1432 l_counter NUMBER;
1433 l_msg_count NUMBER;
1434 l_msg_data VARCHAR2(2000);
1435 l_msg_index_out NUMBER;
1436 l_qtocontact_name VARCHAR2(220);
1437
1438 BEGIN
1439
1440 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1441 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
1442 'Entered '||G_PKG_NAME ||'.'||l_api_name||' with parameters');
1443 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
1444 'Contract Id ' ||p_notif_attr.CONTRACT_ID||
1445 ' Item Key ' ||p_notif_attr.ITEM_KEY ||
1446 ' NTF type' ||p_notif_attr.NTF_TYPE ||
1447 ' NTF subject' ||p_notif_attr.NTF_SUBJECT||
1448 ' Subject ' ||p_notif_attr.SUBJECT);
1449 END IF;
1450
1451 -- Initialize message list if p_init_msg_list is set to TRUE.
1452 IF FND_API.to_Boolean( p_init_msg_list ) THEN
1453 FND_MSG_PUB.initialize;
1454 END IF;
1455
1456 -- Initialize API return status to success
1457 x_return_status := G_RET_STS_SUCCESS;
1458
1459 OPEN l_kdetails_csr(p_notif_attr.CONTRACT_ID);
1460 FETCH l_kdetails_csr INTO l_kdetails_rec;
1461 l_rownotfound := l_kdetails_csr%NOTFOUND;
1462 CLOSE l_kdetails_csr;
1463 IF l_rownotfound THEN
1464 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_INVD_CONTRACT_ID');
1465 FND_MESSAGE.SET_TOKEN('HDR_ID',p_notif_attr.CONTRACT_ID);
1466 FND_MSG_PUB.add;
1467 RAISE FND_API.G_EXC_ERROR;
1468 END IF;
1469
1470 IF l_kdetails_rec.contract_number_modifier IS NULL THEN
1471 l_concat_k_number := l_kdetails_rec.contract_number;
1472 ELSE
1473 l_concat_k_number := l_kdetails_rec.contract_number || ' - ' ||
1474 l_kdetails_rec.contract_number_modifier;
1475 END IF;
1476
1477 OPEN l_party_csr(p_notif_attr.CONTRACT_ID);
1478 FETCH l_party_csr INTO l_party_name;
1479 CLOSE l_party_csr;
1480
1481 okc_context.set_okc_org_context(p_chr_id => p_notif_attr.CONTRACT_ID);
1482 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1483 fnd_log.string(FND_LOG.LEVEL_STATEMENT,G_MODULE||l_api_name,'Party name '||l_party_name);
1484 END IF;
1485
1486 IF p_notif_attr.ITEM_KEY IS NULL THEN
1487 l_item_key := get_wf_item_key(p_notif_attr.CONTRACT_ID);
1488 ELSE
1489 l_item_key := p_notif_attr.ITEM_KEY;
1490 END IF;
1491
1492 IF p_notif_attr.REQ_ASSIST_ROLE IS NOT NULL THEN
1493 wf_engine.SetItemAttrText
1494 (
1495 itemtype => G_ITEM_TYPE,
1496 itemkey => l_item_key,
1497 aname => 'REQ_ASSIST_ROLE',
1498 avalue => p_notif_attr.REQ_ASSIST_ROLE
1499 );
1500 END IF;
1501
1502 IF p_notif_attr.PERFORMER IS NOT NULL THEN
1503 wf_engine.SetItemAttrText
1504 (
1505 itemtype => G_ITEM_TYPE,
1506 itemkey => l_item_key,
1507 aname => 'PERFORMER',
1508 avalue => p_notif_attr.PERFORMER
1509 );
1510 l_salesrep_name := p_notif_attr.PERFORMER;
1511 ELSE
1512 -- Get Salesrep user name which will be used as performer
1513 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1514 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
1515 'OKS_RENEW_CONTRACT_PVT.GET_USER_NAME(p_chr_id= '
1516 ||p_notif_attr.CONTRACT_ID||')');
1517 END IF;
1518 OKS_RENEW_CONTRACT_PVT.GET_USER_NAME
1519 (
1520 p_api_version => l_api_version,
1521 p_init_msg_list => G_FALSE,
1522 x_return_status => x_return_status,
1523 x_msg_count => x_msg_count,
1524 x_msg_data => x_msg_data,
1525 p_chr_id => p_notif_attr.CONTRACT_ID,
1526 p_hdesk_user_id => NULL,
1527 x_user_id => l_salesrep_id,
1528 x_user_name => l_salesrep_name
1529 );
1530 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1531 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
1532 'OKS_RENEW_CONTRACT_PVT.GET_USER_NAME(x_return_status= '||
1533 x_return_status||' x_msg_count ='||x_msg_count||')');
1534 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
1535 ' x_user_id ='||l_salesrep_id||
1536 ' x_user_name ='||l_salesrep_name);
1537 END IF;
1538 IF x_return_status <> G_RET_STS_SUCCESS THEN
1539 RAISE FND_API.G_EXC_ERROR;
1540 END IF;
1541 wf_engine.SetItemAttrText
1542 (
1543 itemtype => G_ITEM_TYPE,
1544 itemkey => l_item_key,
1545 aname => 'PERFORMER',
1546 avalue => NVL(l_salesrep_name,G_DEFAULT_NTF_PERFORMER)
1547 );
1548 END IF;
1549
1550 wf_engine.SetItemAttrText
1551 (
1552 itemtype => G_ITEM_TYPE,
1553 itemkey => l_item_key,
1554 aname => 'OPERATING_UNIT',
1555 avalue => l_kdetails_rec.name
1556 );
1557
1558 wf_engine.SetItemAttrText
1559 (
1560 itemtype => G_ITEM_TYPE,
1561 itemkey => l_item_key,
1562 aname => 'K_DESCRIPTION',
1563 avalue => l_kdetails_rec.short_description
1564 );
1565
1566 wf_engine.SetItemAttrText
1567 (
1568 itemtype => G_ITEM_TYPE,
1569 itemkey => l_item_key,
1570 aname => 'CONCAT_K_NUMBER',
1571 avalue => l_concat_k_number
1572 );
1573
1574 OPEN l_contact_name_csr(l_salesrep_name);
1575 FETCH l_contact_name_csr INTO l_vc_name;
1576 CLOSE l_contact_name_csr;
1577
1578 wf_engine.SetItemAttrText
1579 (
1580 itemtype => G_ITEM_TYPE,
1581 itemkey => l_item_key,
1582 aname => 'VC_NAME',
1583 avalue => l_vc_name
1584 );
1585
1586 -- Notification is sent from Vendor contact or Helpdesk by default
1587 -- but will change to quote to contact in case of request for assistance
1588 IF p_notif_attr.NTF_TYPE = G_NTF_TYPE_MESSAGE THEN
1589 OPEN l_qto_name_csr(p_notif_attr.CONTRACT_ID);
1590 FETCH l_qto_name_csr INTO l_from_role;
1591 CLOSE l_qto_name_csr;
1592 wf_engine.SetItemAttrText
1593 (
1594 itemtype => G_ITEM_TYPE,
1595 itemkey => l_item_key,
1596 aname => 'FROM',
1597 avalue => l_from_role
1598 );
1599 ELSE
1600 wf_engine.SetItemAttrText
1601 (
1602 itemtype => G_ITEM_TYPE,
1603 itemkey => l_item_key,
1604 aname => 'FROM',
1605 avalue => l_salesrep_name
1606 );
1607 END IF;
1608
1609 wf_engine.SetItemAttrText
1610 (
1611 itemtype => G_ITEM_TYPE,
1612 itemkey => l_item_key,
1613 aname => 'NTF_TYPE',
1614 avalue => p_notif_attr.NTF_TYPE
1615 );
1616
1617 wf_engine.SetItemAttrText
1618 (
1619 itemtype => G_ITEM_TYPE,
1620 itemkey => l_item_key,
1621 aname => 'SUBJECT',
1622 avalue => p_notif_attr.SUBJECT
1623 );
1624
1625 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1626 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
1627 'Notification Type: '|| p_notif_attr.NTF_TYPE);
1628 END IF;
1629
1630 IF p_notif_attr.NTF_TYPE = G_NTF_TYPE_ACCEPT THEN
1631 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_NTF_SUB_ACCEPTED');
1632 FND_MESSAGE.SET_TOKEN('K_NUMBER',l_concat_k_number);
1633 FND_MESSAGE.SET_TOKEN('K_AMOUNT',l_kdetails_rec.estimated_amount);
1634 FND_MESSAGE.SET_TOKEN('CURRENCY',l_kdetails_rec.currency_code);
1635 FND_MESSAGE.SET_TOKEN('CUST_NAME',l_party_name);
1636 l_notif_subject := FND_MESSAGE.GET;
1637
1638 ELSIF p_notif_attr.NTF_TYPE = G_NTF_TYPE_DECLINE THEN
1639 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_NTF_SUB_DECLINED');
1640 FND_MESSAGE.SET_TOKEN('K_NUMBER',l_concat_k_number);
1641 FND_MESSAGE.SET_TOKEN('K_AMOUNT',l_kdetails_rec.estimated_amount);
1642 FND_MESSAGE.SET_TOKEN('CURRENCY',l_kdetails_rec.currency_code);
1643 FND_MESSAGE.SET_TOKEN('CUST_NAME',l_party_name);
1644 l_notif_subject := FND_MESSAGE.GET;
1645
1646 ELSIF p_notif_attr.NTF_TYPE = G_NTF_TYPE_RENEWED THEN
1647 -- Reset notification type since notification doesn't have any special region
1648 -- to be rendered.
1649 wf_engine.SetItemAttrText
1650 (
1651 itemtype => G_ITEM_TYPE,
1652 itemkey => l_item_key,
1653 aname => 'NTF_TYPE',
1654 avalue => NULL
1655 );
1656
1657 OPEN l_old_k_num(p_notif_attr.CONTRACT_ID);
1658 FETCH l_old_k_num INTO l_old_k_number;
1659 CLOSE l_old_k_num;
1660
1661 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_NTF_SUB_RENEWED');
1662 FND_MESSAGE.SET_TOKEN('K_NUMBER',l_old_k_number);
1663 FND_MESSAGE.SET_TOKEN('K_AMOUNT',l_kdetails_rec.estimated_amount);
1664 FND_MESSAGE.SET_TOKEN('CURRENCY',l_kdetails_rec.currency_code);
1665 FND_MESSAGE.SET_TOKEN('CUST_NAME',l_party_name);
1666 l_notif_subject := FND_MESSAGE.GET;
1667
1668 ELSIF p_notif_attr.NTF_TYPE = G_NTF_TYPE_ERROR THEN
1669 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_NTF_SUB_WF_ERROR');
1670 FND_MESSAGE.SET_TOKEN('K_NUMBER',l_concat_k_number);
1671 FND_MESSAGE.SET_TOKEN('K_AMOUNT',l_kdetails_rec.estimated_amount);
1672 FND_MESSAGE.SET_TOKEN('CURRENCY',l_kdetails_rec.currency_code);
1673 FND_MESSAGE.SET_TOKEN('CUST_NAME',l_party_name);
1674 l_notif_subject := FND_MESSAGE.GET;
1675
1676 ELSIF p_notif_attr.NTF_TYPE = G_NTF_TYPE_MESSAGE THEN
1677
1678 OPEN l_qtocontact_name_csr(p_notif_attr.CONTRACT_ID);
1679 FETCH l_qtocontact_name_csr INTO l_qtocontact_name;
1680 CLOSE l_qtocontact_name_csr;
1681
1682 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_NTF_SUB_REQUEST_ASSIST');
1683 FND_MESSAGE.SET_TOKEN('QTO_CONTACT',l_qtocontact_name);
1684 FND_MESSAGE.SET_TOKEN('K_NUMBER',l_concat_k_number);
1685 FND_MESSAGE.SET_TOKEN('CUST_NAME',l_party_name);
1686 l_notif_subject := FND_MESSAGE.GET;
1687
1688 ELSIF p_notif_attr.NTF_TYPE = G_NTF_TYPE_QA_FAIL THEN
1689 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_NTF_SUB_QA_FAIL');
1690 FND_MESSAGE.SET_TOKEN('K_NUMBER',l_concat_k_number);
1691 FND_MESSAGE.SET_TOKEN('K_AMOUNT',l_kdetails_rec.estimated_amount);
1692 FND_MESSAGE.SET_TOKEN('CURRENCY',l_kdetails_rec.currency_code);
1693 FND_MESSAGE.SET_TOKEN('CUST_NAME',l_party_name);
1694 l_notif_subject := FND_MESSAGE.GET;
1695
1696 ELSIF p_notif_attr.NTF_TYPE = G_NTF_TYPE_QUOTE_PB THEN
1697 -- Reset notification type since notification doesn't have any special region
1698 -- to be rendered.
1699 wf_engine.SetItemAttrText
1700 (
1701 itemtype => G_ITEM_TYPE,
1702 itemkey => l_item_key,
1703 aname => 'NTF_TYPE',
1704 avalue => NULL
1705 );
1706
1707 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_NTF_SUB_QPUB_SUCCESS');
1708 FND_MESSAGE.SET_TOKEN('K_NUMBER',l_concat_k_number);
1709 FND_MESSAGE.SET_TOKEN('K_AMOUNT',l_kdetails_rec.estimated_amount);
1710 FND_MESSAGE.SET_TOKEN('CURRENCY',l_kdetails_rec.currency_code);
1711 FND_MESSAGE.SET_TOKEN('CUST_NAME',l_party_name);
1712 l_notif_subject := FND_MESSAGE.GET;
1713
1714 ELSIF p_notif_attr.NTF_TYPE = G_NTF_TYPE_ACTIVE THEN
1715 -- Reset notification type since notification doesn't have any special region
1716 -- to be rendered.
1717 wf_engine.SetItemAttrText
1718 (
1719 itemtype => G_ITEM_TYPE,
1720 itemkey => l_item_key,
1721 aname => 'NTF_TYPE',
1722 avalue => NULL
1723 );
1724
1725 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_NTF_SUB_ACTIVATED');
1726 FND_MESSAGE.SET_TOKEN('K_NUMBER',l_concat_k_number);
1727 FND_MESSAGE.SET_TOKEN('K_AMOUNT',l_kdetails_rec.estimated_amount);
1728 FND_MESSAGE.SET_TOKEN('CURRENCY',l_kdetails_rec.currency_code);
1729 FND_MESSAGE.SET_TOKEN('CUST_NAME',l_party_name);
1730 l_notif_subject := FND_MESSAGE.GET;
1731
1732 ELSE
1733 RAISE FND_API.G_EXC_ERROR;
1734 END IF;
1735
1736 wf_engine.SetItemAttrText
1737 (
1738 itemtype => G_ITEM_TYPE,
1739 itemkey => l_item_key,
1740 aname => 'NTF_SUBJECT',
1741 avalue => l_notif_subject
1742 );
1743
1744 -- Initialize all message attributes to Null other than in QA Failure case
1745 IF p_notif_attr.NTF_TYPE <> G_NTF_TYPE_QA_FAIL THEN
1746 FOR l_counter IN 1 .. 10 LOOP
1747 wf_engine.SetItemAttrText
1748 (
1749 itemtype => G_ITEM_TYPE,
1750 itemkey => l_item_key,
1751 aname => 'MESSAGE' || l_counter,
1752 avalue => NULL
1753 );
1754 END LOOP;
1755 END IF;
1756
1757 -- If this flag is set to Y, retrieve messages from error stack and assign them
1758 -- to the message attibutes.
1759 IF NVL(p_notif_attr.MSGS_FROM_STACK_YN,'N') = 'Y' THEN
1760 l_msg_count := NVL(fnd_msg_pub.count_msg,0);
1761 IF l_msg_count>0 THEN
1762
1763 IF l_msg_count>10 THEN l_msg_count := 10; END IF;
1764 FOR l_counter in 1..l_msg_count Loop
1765 fnd_msg_pub.get
1766 (
1767 p_msg_index => l_counter,
1768 p_encoded => 'F',
1769 p_data => l_msg_data,
1770 p_msg_index_out => l_msg_index_out
1771 );
1772
1773 wf_engine.SetItemAttrText
1774 (
1775 itemtype => G_ITEM_TYPE,
1776 itemkey => l_item_key,
1777 aname => 'MESSAGE' || l_counter,
1778 avalue => l_msg_data
1779 );
1780 END LOOP;
1781 FND_MESSAGE.CLEAR;
1782 END IF;
1783 -- Messages are passed so assign them to wf message attibutes.
1784 ELSE
1785 IF p_notif_attr.MESSAGE1 IS NOT NULL THEN
1786 wf_engine.SetItemAttrText
1787 (
1788 itemtype => G_ITEM_TYPE,
1789 itemkey => l_item_key,
1790 aname => 'MESSAGE1',
1791 avalue => p_notif_attr.MESSAGE1
1792 );
1793 END IF;
1794
1795 IF p_notif_attr.MESSAGE2 IS NOT NULL THEN
1796 wf_engine.SetItemAttrText
1797 (
1798 itemtype => G_ITEM_TYPE,
1799 itemkey => l_item_key,
1800 aname => 'MESSAGE2',
1801 avalue => p_notif_attr.MESSAGE2
1802 );
1803 END IF;
1804
1805 IF p_notif_attr.MESSAGE3 IS NOT NULL THEN
1806 wf_engine.SetItemAttrText
1807 (
1808 itemtype => G_ITEM_TYPE,
1809 itemkey => l_item_key,
1810 aname => 'MESSAGE3',
1811 avalue => p_notif_attr.MESSAGE3
1812 );
1813 END IF;
1814
1815 IF p_notif_attr.MESSAGE4 IS NOT NULL THEN
1816 wf_engine.SetItemAttrText
1817 (
1818 itemtype => G_ITEM_TYPE,
1819 itemkey => l_item_key,
1820 aname => 'MESSAGE4',
1821 avalue => p_notif_attr.MESSAGE4
1822 );
1823 END IF;
1824
1825 IF p_notif_attr.MESSAGE5 IS NOT NULL THEN
1826 wf_engine.SetItemAttrText
1827 (
1828 itemtype => G_ITEM_TYPE,
1829 itemkey => l_item_key,
1830 aname => 'MESSAGE5',
1831 avalue => p_notif_attr.MESSAGE5
1832 );
1833 END IF;
1834
1835 IF p_notif_attr.MESSAGE6 IS NOT NULL THEN
1836 wf_engine.SetItemAttrText
1837 (
1838 itemtype => G_ITEM_TYPE,
1839 itemkey => l_item_key,
1840 aname => 'MESSAGE6',
1841 avalue => p_notif_attr.MESSAGE6
1842 );
1843 END IF;
1844
1845 IF p_notif_attr.MESSAGE7 IS NOT NULL THEN
1846 wf_engine.SetItemAttrText
1847 (
1848 itemtype => G_ITEM_TYPE,
1849 itemkey => l_item_key,
1850 aname => 'MESSAGE7',
1851 avalue => p_notif_attr.MESSAGE7
1852 );
1853 END IF;
1854
1855 IF p_notif_attr.MESSAGE8 IS NOT NULL THEN
1856 wf_engine.SetItemAttrText
1857 (
1858 itemtype => G_ITEM_TYPE,
1859 itemkey => l_item_key,
1860 aname => 'MESSAGE8',
1861 avalue => p_notif_attr.MESSAGE8
1862 );
1863 END IF;
1864
1865 IF p_notif_attr.MESSAGE9 IS NOT NULL THEN
1866 wf_engine.SetItemAttrText
1867 (
1868 itemtype => G_ITEM_TYPE,
1869 itemkey => l_item_key,
1870 aname => 'MESSAGE9',
1871 avalue => p_notif_attr.MESSAGE9
1872 );
1873 END IF;
1874
1875 IF p_notif_attr.MESSAGE10 IS NOT NULL THEN
1876 wf_engine.SetItemAttrText
1877 (
1878 itemtype => G_ITEM_TYPE,
1879 itemkey => l_item_key,
1880 aname => 'MESSAGE10',
1881 avalue => p_notif_attr.MESSAGE10
1882 );
1883 END IF;
1884 END IF;
1885 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1886 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT,G_MODULE||l_api_name,
1887 'Successfully set workflow attributes ');
1888 END IF;
1889
1890 -- Standard call to get message count and if count is 1, get message info.
1891 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count=>x_msg_count, p_data=>x_msg_data);
1892
1893 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1894 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
1895 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
1896 END IF;
1897
1898 EXCEPTION
1899 WHEN FND_API.G_EXC_ERROR THEN
1900 x_return_status := G_RET_STS_ERROR;
1901 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
1902 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1903 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
1904 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.ERROR');
1905 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,get_fnd_message);
1906 END IF;
1907 WHEN OTHERS THEN
1908 x_return_status := G_RET_STS_UNEXP_ERROR;
1909 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1910 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
1911 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
1912 ||SQLCODE||', sqlerrm = '||SQLERRM);
1913 END IF;
1914 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
1915 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
1916 END set_notification_attributes;
1917
1918 /*=========================================================================
1919 API name : set_email_attributes
1920 Type : Private.
1921 Function : This procedure sets all the relavant wf item attribute
1922 values that will be used while sending out an email. If
1923 the values that need to be set are null, existing values
1924 are reset to NULL so that incorrect data will not be used.
1925 Pre-reqs : None.
1926 Parameters :
1927 IN : p_api_version IN NUMBER Required
1928 Api version
1929 : p_init_msg_list IN VARCHAR2 Required
1930 Initialize message stack parameter
1931 : p_email_attr IN VARCHAR2 Required
1932 Workflow item attributes related to email delivery.
1933 OUT : x_return_status OUT VARCHAR2(1)
1934 Api return status
1935 : x_msg_count OUT NUMBER
1936 Count of message on error stack
1937 : x_msg_data OUT VARCHAR2
1938 Actual error messages on error stack
1939 Note :
1940 =========================================================================*/
1941 PROCEDURE set_email_attributes
1942 (
1943 p_api_version IN NUMBER,
1944 p_init_msg_list IN VARCHAR2,
1945 p_email_attr IN email_attr_rec,
1946 x_return_status OUT NOCOPY VARCHAR2,
1947 x_msg_data OUT NOCOPY VARCHAR2,
1948 x_msg_count OUT NOCOPY NUMBER
1949 ) IS
1950 l_api_version CONSTANT NUMBER := 1.0;
1951 l_api_name CONSTANT VARCHAR2(50) := 'set_email_attributes';
1952
1953 CURSOR l_email_csr(p_user_id VARCHAR2) IS
1954 SELECT source_email
1955 FROM jtf_rs_resource_extns
1956 WHERE user_id = p_user_id;
1957
1958 CURSOR l_acceptedby_csr(p_user_id NUMBER) IS
1959 SELECT user_name
1960 FROM fnd_user fndu
1961 WHERE fndu.user_id = p_user_id;
1962
1963 CURSOR l_party_csr(p_chr_id NUMBER) IS
1964 SELECT b.party_name
1965 FROM OKC_K_PARTY_ROLES_B a, hz_parties b
1966 WHERE a.dnz_chr_id = p_chr_id
1967 AND a.object1_id1 = b.party_id;
1968
1969 CURSOR l_kdetails_csr(p_chr_id NUMBER) IS
1970 SELECT contract_number,contract_number_modifier,
1971 to_char(OKS_EXTWAR_UTIL_PVT.round_currency_amt(estimated_amount,currency_code),
1972 fnd_currency.get_format_mask(currency_code, 50)
1973 ) estimated_amount, currency_code
1974 FROM okc_k_headers_all_b
1975 WHERE id = p_chr_id;
1976
1977 CURSOR l_install_lang_csr IS
1978 SELECT language_code
1979 FROM fnd_languages
1980 WHERE installed_flag = 'B';
1981
1982 l_language VARCHAR2(50);
1983 l_email_body_id NUMBER;
1984 l_attachment_id NUMBER;
1985 l_attachment_name VARCHAR2(150);
1986 l_contract_status VARCHAR2(30);
1987 l_rownotfound BOOLEAN := FALSE;
1988 l_qto_email VARCHAR2(4000);
1989 l_sender_email VARCHAR2(4000);
1990 l_salesrep_id NUMBER;
1991 l_salesrep_name VARCHAR2(100);
1992 l_email_subject VARCHAR2(4000);
1993 l_ih_subject VARCHAR2(4000);
1994 l_ih_message VARCHAR2(4000);
1995
1996 l_kdetails_rec l_kdetails_csr%ROWTYPE;
1997 l_item_key wf_items.item_key%TYPE;
1998 l_party_name VARCHAR2(360);
1999 l_concat_k_number VARCHAR2(300);
2000 l_accepted_by VARCHAR2(100);
2001 l_iso_language VARCHAR2(6);
2002 l_iso_territory VARCHAR2(6);
2003 l_gcd_language VARCHAR2(50);
2004
2005 BEGIN
2006
2007 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2008 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
2009 'Entered '||G_PKG_NAME ||'.'||l_api_name||' with parameters');
2010 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
2011 'Contract ID:' ||p_email_attr.CONTRACT_ID||
2012 ' Item Key:' ||p_email_attr.ITEM_KEY||
2013 ' Email Type:' ||p_email_attr.EMAIL_TYPE);
2014 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
2015 'To Email:' ||p_email_attr.TO_EMAIL||
2016 ' Sender Email:' ||p_email_attr.SENDER_EMAIL||
2017 ' Email Subject:' ||substr(p_email_attr.EMAIL_SUBJECT,1,150));
2018 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
2019 'IH subject:' ||substr(p_email_attr.IH_SUBJECT,1,150)||
2020 ' IH message:' ||substr(p_email_attr.IH_MESSAGE,1,150));
2021 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
2022 'Message Template: ' ||p_email_attr.email_body_id||
2023 ' Attachment Template: '||p_email_attr.attachment_id||
2024 ' Attachment Name: ' ||p_email_attr.attachment_name||
2025 ' Contract status: ' ||p_email_attr.contract_status);
2026 END IF;
2027
2028 -- Initialize message list if p_init_msg_list is set to TRUE.
2029 IF FND_API.to_Boolean( p_init_msg_list ) THEN
2030 FND_MSG_PUB.initialize;
2031 END IF;
2032
2033 -- Initialize API return status to success
2034 x_return_status := G_RET_STS_SUCCESS;
2035
2036 IF p_email_attr.CONTRACT_ID IS NULL THEN
2037 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_INVD_CONTRACT_ID');
2038 FND_MESSAGE.SET_TOKEN('HDR_ID','null');
2039 FND_MSG_PUB.add;
2040 RAISE FND_API.G_EXC_ERROR;
2041 END IF;
2042
2043 IF p_email_attr.TO_EMAIL IS NULL THEN
2044 l_qto_email := get_qto_email(p_contract_id => p_email_attr.CONTRACT_ID);
2045 IF l_qto_email IS NULL THEN
2046 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2047 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name,'Quote To email not found');
2048 END IF;
2049 RAISE FND_API.G_EXC_ERROR;
2050 END IF;
2051 ELSE
2052 l_qto_email := p_email_attr.TO_EMAIL;
2053 END IF;
2054
2055 IF p_email_attr.SENDER_EMAIL IS NULL THEN
2056
2057 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2058 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
2059 'OKS_RENEW_CONTRACT_PVT.GET_USER_NAME(p_chr_id= '
2060 ||p_email_attr.CONTRACT_ID||')');
2061 END IF;
2062 OKS_RENEW_CONTRACT_PVT.GET_USER_NAME
2063 (
2064 p_api_version => l_api_version,
2065 p_init_msg_list => G_FALSE,
2066 x_return_status => x_return_status,
2067 x_msg_count => x_msg_count,
2068 x_msg_data => x_msg_data,
2069 p_chr_id => p_email_attr.CONTRACT_ID,
2070 p_hdesk_user_id => NULL,
2071 x_user_id => l_salesrep_id,
2072 x_user_name => l_salesrep_name
2073 );
2074 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2075 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
2076 'OKS_RENEW_CONTRACT_PVT.GET_USER_NAME(x_return_status= '||x_return_status||
2077 ' x_msg_count ='||x_msg_count||')');
2078 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
2079 ' x_user_id ='||l_salesrep_id||
2080 ' x_user_name ='||l_salesrep_name);
2081 END IF;
2082 IF x_return_status <> G_RET_STS_SUCCESS THEN
2083 RAISE FND_API.G_EXC_ERROR;
2084 END IF;
2085
2086 OPEN l_email_csr(l_salesrep_id);
2087 FETCH l_email_csr INTO l_sender_email;
2088 l_rownotfound := l_email_csr%NOTFOUND;
2089 CLOSE l_email_csr;
2090
2091 IF l_rownotfound THEN
2092 -- Sender email is not found
2093 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_EMAIL_NOT_FOUND');
2094 FND_MESSAGE.SET_TOKEN('USER_NAME',l_salesrep_name);
2095 FND_MSG_PUB.add;
2096 RAISE FND_API.G_EXC_ERROR;
2097 END IF;
2098 ELSE
2099 l_sender_email := p_email_attr.SENDER_EMAIL;
2100 END IF;
2101
2102 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2103 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT,G_MODULE||l_api_name,
2104 substr('To: '||l_qto_email,1,4000));
2105 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT,G_MODULE||l_api_name,
2106 substr('Sender: '||l_sender_email,1,4000));
2107 END IF;
2108
2109 -- Get item key in order to retrieve contract information
2110 IF p_email_attr.ITEM_KEY IS NULL THEN
2111 l_item_key := get_wf_item_key(p_contract_id => p_email_attr.CONTRACT_ID);
2112 IF l_item_key IS NULL THEN
2113 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INVALID_WF_ITEM_KEY');
2114 FND_MSG_PUB.add;
2115 RAISE FND_API.G_EXC_ERROR;
2116 END IF;
2117 ELSE
2118 l_item_key := p_email_attr.ITEM_KEY;
2119 END IF;
2120
2121 IF ((p_email_attr.IH_SUBJECT IS NULL) OR
2122 (p_email_attr.IH_MESSAGE IS NULL) OR
2123 (p_email_attr.EMAIL_SUBJECT IS NULL)) THEN
2124
2125 okc_context.set_okc_org_context(p_chr_id => p_email_attr.CONTRACT_ID);
2126
2127 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2128 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
2129 'OKS_TEMPLATE_SET_PUB.get_template_set_dtls(p_contract_id= '
2130 ||p_email_attr.CONTRACT_ID||
2131 ' p_document_type ='||p_email_attr.EMAIL_TYPE||')');
2132 END IF;
2133
2134 OKS_TEMPLATE_SET_PUB.get_template_set_dtls
2135 (
2136 p_api_version => l_api_version,
2137 p_init_msg_list => G_FALSE,
2138 p_contract_id => p_email_attr.CONTRACT_ID,
2139 p_document_type => p_email_attr.EMAIL_TYPE,
2140 x_template_language => l_language,
2141 x_message_template_id => l_email_body_id,
2142 x_attachment_template_id => l_attachment_id,
2143 x_attachment_name => l_attachment_name,
2144 x_contract_update_status => l_contract_status,
2145 x_return_status => x_return_status,
2146 x_msg_data => x_msg_data,
2147 x_msg_count => x_msg_count
2148 );
2149
2150 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2151 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
2152 'OKS_TEMPLATE_SET_PUB.get_template_set_dtls(x_return_status= '||x_return_status||
2153 ' x_msg_count ='||x_msg_count||')');
2154 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
2155 ' x_template_language ='||l_language||
2156 ' x_message_template_id ='||l_email_body_id||
2157 ' x_attachment_template_id ='||l_attachment_id||
2158 ' x_attachment_name ='||l_attachment_name||
2159 ' x_contract_update_status ='||l_contract_status);
2160 END IF;
2161 IF x_return_status <> G_RET_STS_SUCCESS THEN
2162 RAISE FND_API.G_EXC_ERROR;
2163 END IF;
2164
2165 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2166 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
2167 'OKS_RENEW_UTIL_PVT.get_language_info(p_contract_id= '
2168 ||p_email_attr.CONTRACT_ID||
2169 ' p_document_type ='||p_email_attr.EMAIL_TYPE||')');
2170 END IF;
2171 OKS_RENEW_UTIL_PVT.get_language_info
2172 (
2173 p_api_version => l_api_version,
2174 p_init_msg_list => G_FALSE,
2175 p_contract_id => p_email_attr.CONTRACT_ID,
2176 p_document_type => p_email_attr.EMAIL_TYPE,
2177 p_template_id => l_attachment_id,
2178 p_template_language => l_language,
2179 x_fnd_language => l_language,
2180 x_fnd_iso_language => l_iso_language,
2181 x_fnd_iso_territory => l_iso_territory,
2182 x_gcd_template_lang => l_gcd_language,
2183 x_return_status => x_return_status,
2184 x_msg_count => x_msg_count,
2185 x_msg_data => x_msg_data
2186 );
2187 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2188 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
2189 'OKS_RENEW_UTIL_PVT.get_language_info(x_return_status= '
2190 ||x_return_status||' x_msg_count ='||x_msg_count||')');
2191 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
2192 ' x_fnd_language ='||l_language||
2193 ' x_fnd_iso_language ='||l_iso_language||
2194 ' x_fnd_iso_territory ='||l_iso_territory);
2195 END IF;
2196 IF x_return_status <> G_RET_STS_SUCCESS THEN
2197 RAISE FND_API.G_EXC_ERROR;
2198 END IF;
2199 IF l_language IS NULL THEN
2200 OPEN l_install_lang_csr;
2201 FETCH l_install_lang_csr INTO l_language;
2202 CLOSE l_install_lang_csr;
2203 END IF;
2204
2205 OPEN l_kdetails_csr(p_email_attr.CONTRACT_ID);
2206 FETCH l_kdetails_csr INTO l_kdetails_rec;
2207 CLOSE l_kdetails_csr;
2208
2209 OPEN l_party_csr(p_email_attr.CONTRACT_ID);
2210 FETCH l_party_csr INTO l_party_name;
2211 CLOSE l_party_csr;
2212
2213 IF l_kdetails_rec.CONTRACT_NUMBER_MODIFIER IS NULL THEN
2214 l_concat_k_number := l_kdetails_rec.CONTRACT_NUMBER;
2215 ELSE
2216 l_concat_k_number := l_kdetails_rec.CONTRACT_NUMBER || ' - ' ||
2217 l_kdetails_rec.CONTRACT_NUMBER_MODIFIER;
2218 END IF;
2219
2220 -- Depending on the type of email being sent get appropriate email subject
2221 -- interaction history subject and message
2222 -- Quote has been accepted by either salesrep or Customer
2223 IF p_email_attr.EMAIL_TYPE = G_REPORT_TYPE_ACCEPT THEN
2224 IF p_email_attr.IH_SUBJECT IS NULL THEN
2225 l_ih_subject := get_message('OKS_IH_SUBJECT_ACCEPT',l_language);
2226 ELSE
2227 l_ih_subject := p_email_attr.IH_SUBJECT;
2228 END IF;
2229 -- assemble interaction history body
2230 IF p_email_attr.IH_MESSAGE IS NULL THEN
2231 OPEN l_acceptedby_csr(FND_GLOBAL.USER_ID);
2232 FETCH l_acceptedby_csr INTO l_accepted_by;
2233 CLOSE l_acceptedby_csr;
2234
2235 l_ih_message := get_message('OKS_IH_MESSAGE_ACCEPT',l_language);
2236 l_ih_message := replace_token(l_ih_message,'K_NUMBER',l_concat_k_number);
2237 l_ih_message := replace_token(l_ih_message,'K_AMOUNT',l_kdetails_rec.estimated_amount);
2238 l_ih_message := replace_token(l_ih_message,'CURRENCY',l_kdetails_rec.currency_code);
2239 l_ih_message := replace_token(l_ih_message,'CUST_NAME',l_party_name);
2240 l_ih_message := replace_token(l_ih_message,'ACCEPTED_BY',l_accepted_by);
2241 ELSE
2242 l_ih_message := p_email_attr.IH_MESSAGE;
2243 END IF;
2244 IF p_email_attr.EMAIL_SUBJECT IS NULL THEN
2245 l_email_subject := get_message('OKS_EMAIL_SUB_ACCEPT',l_language);
2246 l_email_subject := replace_token(l_email_subject,'K_NUMBER',l_concat_k_number);
2247 l_email_subject := replace_token(l_email_subject,'K_AMOUNT',l_kdetails_rec.estimated_amount);
2248 l_email_subject := replace_token(l_email_subject,'CURRENCY',l_kdetails_rec.currency_code);
2249 l_email_subject := replace_token(l_email_subject,'CUST_NAME',l_party_name);
2250 ELSE
2251 l_email_subject := p_email_attr.EMAIL_SUBJECT;
2252 END IF;
2253
2254 -- Activation confirmation
2255 ELSIF p_email_attr.EMAIL_TYPE = G_REPORT_TYPE_ACTIVE THEN
2256 IF p_email_attr.IH_SUBJECT IS NULL THEN
2257 l_ih_subject := get_message('OKS_IH_SUBJECT_ACTIVE',l_language);
2258 ELSE
2259 l_ih_subject := p_email_attr.IH_SUBJECT;
2260 END IF;
2261 -- assemble interaction history body
2262 IF p_email_attr.IH_MESSAGE IS NULL THEN
2263 l_ih_message := get_message('OKS_IH_MESSAGE_ACTIVE',l_language);
2264 l_ih_message := replace_token(l_ih_message,'K_NUMBER',l_concat_k_number);
2265 l_ih_message := replace_token(l_ih_message,'K_AMOUNT',l_kdetails_rec.estimated_amount);
2266 l_ih_message := replace_token(l_ih_message,'CURRENCY',l_kdetails_rec.currency_code);
2267 l_ih_message := replace_token(l_ih_message,'CUST_NAME',l_party_name);
2268 ELSE
2269 l_ih_message := p_email_attr.IH_MESSAGE;
2270 END IF;
2271 IF p_email_attr.EMAIL_SUBJECT IS NULL THEN
2272 l_email_subject := get_message('OKS_EMAIL_SUB_ACTIVE',l_language);
2273 l_email_subject := replace_token(l_email_subject,'K_NUMBER',l_concat_k_number);
2274 l_email_subject := replace_token(l_email_subject,'K_AMOUNT',l_kdetails_rec.estimated_amount);
2275 l_email_subject := replace_token(l_email_subject,'CURRENCY',l_kdetails_rec.currency_code);
2276 l_email_subject := replace_token(l_email_subject,'CUST_NAME',l_party_name);
2277 ELSE
2278 l_email_subject := p_email_attr.EMAIL_SUBJECT;
2279 END IF;
2280
2281 -- Quote has been declined by customer or cancelled by salesrep
2282 ELSIF p_email_attr.EMAIL_TYPE = G_REPORT_TYPE_CANCEL THEN
2283 IF p_email_attr.IH_SUBJECT IS NULL THEN
2284 l_ih_subject := get_message('OKS_IH_SUBJECT_CANCEL',l_language);
2285 ELSE
2286 l_ih_subject := p_email_attr.IH_SUBJECT;
2287 END IF;
2288 -- assemble interaction history body
2289 IF p_email_attr.IH_MESSAGE IS NULL THEN
2290 l_ih_message := get_message('OKS_IH_MESSAGE_CANCEL',l_language);
2291 l_ih_message := replace_token(l_ih_message,'K_NUMBER',l_concat_k_number);
2292 l_ih_message := replace_token(l_ih_message,'K_AMOUNT',l_kdetails_rec.estimated_amount);
2293 l_ih_message := replace_token(l_ih_message,'CURRENCY',l_kdetails_rec.currency_code);
2294 l_ih_message := replace_token(l_ih_message,'CUST_NAME',l_party_name);
2295 ELSE
2296 l_ih_message := p_email_attr.IH_MESSAGE;
2297 END IF;
2298 IF p_email_attr.EMAIL_SUBJECT IS NULL THEN
2299 l_email_subject := get_message('OKS_EMAIL_SUB_CANCEL',l_language);
2300 l_email_subject := replace_token(l_email_subject,'K_NUMBER',l_concat_k_number);
2301 l_email_subject := replace_token(l_email_subject,'K_AMOUNT',l_kdetails_rec.estimated_amount);
2302 l_email_subject := replace_token(l_email_subject,'CURRENCY',l_kdetails_rec.currency_code);
2303 l_email_subject := replace_token(l_email_subject,'CUST_NAME',l_party_name);
2304 ELSE
2305 l_email_subject := p_email_attr.EMAIL_SUBJECT;
2306 END IF;
2307
2308 -- Quote is being sent to customer for online acceptance
2309 ELSIF p_email_attr.EMAIL_TYPE = G_REPORT_TYPE_QUOTE THEN
2310 IF p_email_attr.IH_SUBJECT IS NULL THEN
2311 l_ih_subject := get_message('OKS_INT_HISTORY_SUBJECT',l_language);
2312 ELSE
2313 l_ih_subject := p_email_attr.IH_SUBJECT;
2314 END IF;
2315 -- assemble interaction history body
2316 IF p_email_attr.IH_MESSAGE IS NULL THEN
2317 l_ih_message := get_message('OKS_INT_HISTORY_MSG_BODY',l_language);
2318 l_ih_message := replace_token(l_ih_message,'TOKEN1',l_kdetails_rec.contract_number);
2319 l_ih_message := replace_token(l_ih_message,'TOKEN2',l_kdetails_rec.contract_number_modifier);
2320 l_ih_message := replace_token(l_ih_message,'TOKEN3',l_qto_email);
2321 ELSE
2322 l_ih_message := p_email_attr.IH_MESSAGE;
2323 END IF;
2324 IF p_email_attr.EMAIL_SUBJECT IS NULL THEN
2325 l_email_subject := get_message('OKS_ERN_QEMAIL_SUBJECT',l_language);
2326 l_email_subject := replace_token(l_email_subject,'TOKEN1',l_concat_k_number);
2327 ELSE
2328 l_email_subject := p_email_attr.EMAIL_SUBJECT;
2329 END IF;
2330
2331 ELSE
2332 RAISE FND_API.G_EXC_ERROR;
2333 END IF;
2334
2335 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2336 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT,G_MODULE||l_api_name,
2337 substr('IH Subject '||l_ih_subject,1,1000) ||
2338 substr(' IH Message '||l_ih_message,1,1000) ||
2339 substr(' Email Subject '||l_email_subject,1,1000));
2340 END IF;
2341 END IF;
2342
2343 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2344 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT,G_MODULE||l_api_name,
2345 'Setting workflow attributes ');
2346 END IF;
2347
2348 WF_ENGINE.SetItemAttrText
2349 (
2350 itemtype => G_ITEM_TYPE,
2351 itemkey => l_item_key,
2352 aname => 'TO_EMAIL',
2353 avalue => l_qto_email
2354 );
2355
2356 WF_ENGINE.SetItemAttrText
2357 (
2358 itemtype => G_ITEM_TYPE,
2359 itemkey => l_item_key,
2360 aname => 'SENDER_EMAIL',
2361 avalue => l_sender_email
2362 );
2363
2364 WF_ENGINE.SetItemAttrNumber
2365 (
2366 itemtype => G_ITEM_TYPE,
2367 itemkey => l_item_key,
2368 aname => 'ATTACHMENT_ID',
2369 avalue => NVL(p_email_attr.attachment_id,l_attachment_id)
2370 );
2371
2372 WF_ENGINE.SetItemAttrNumber
2373 (
2374 itemtype => G_ITEM_TYPE,
2375 itemkey => l_item_key,
2376 aname => 'EMAIL_BODY_ID',
2377 avalue => NVL(p_email_attr.email_body_id,l_email_body_id)
2378 );
2379
2380 WF_ENGINE.SetItemAttrText
2381 (
2382 itemtype => G_ITEM_TYPE,
2383 itemkey => l_item_key,
2384 aname => 'ATTACHMENT_NAME',
2385 avalue => NVL(p_email_attr.attachment_name,l_attachment_name)
2386 );
2387
2388 WF_ENGINE.SetItemAttrText
2389 (
2390 itemtype => G_ITEM_TYPE,
2391 itemkey => l_item_key,
2392 aname => 'CONTRACT_STATUS',
2393 avalue => NVL(p_email_attr.contract_status,l_contract_status)
2394 );
2395
2396 WF_ENGINE.SetItemAttrText
2397 (
2398 itemtype => G_ITEM_TYPE,
2399 itemkey => l_item_key,
2400 aname => 'IH_SUBJECT',
2401 avalue => NVL(p_email_attr.ih_subject,l_ih_subject)
2402 );
2403
2404 WF_ENGINE.SetItemAttrText
2405 (
2406 itemtype => G_ITEM_TYPE,
2407 itemkey => l_item_key,
2408 aname => 'IH_MESSAGE',
2409 avalue => NVL(p_email_attr.ih_message,l_ih_message)
2410 );
2411
2412 WF_ENGINE.SetItemAttrText
2413 (
2414 itemtype => G_ITEM_TYPE,
2415 itemkey => l_item_key,
2416 aname => 'EMAIL_SUBJECT',
2417 avalue => NVL(p_email_attr.email_subject,l_email_subject)
2418 );
2419
2420 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2421 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT,G_MODULE||l_api_name,
2422 'Successfully set workflow attributes ');
2423 END IF;
2424
2425 -- Standard call to get message count and if count is 1, get message info.
2426 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count=>x_msg_count, p_data=>x_msg_data);
2427
2428 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2429 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
2430 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
2431 END IF;
2432
2433 EXCEPTION
2434 WHEN FND_API.G_EXC_ERROR THEN
2435 x_return_status := G_RET_STS_ERROR;
2436 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
2437 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2438 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
2439 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.ERROR');
2440 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,get_fnd_message);
2441 END IF;
2442 WHEN OTHERS THEN
2443 x_return_status := G_RET_STS_UNEXP_ERROR;
2444 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2445 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
2446 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
2447 ||SQLCODE||', sqlerrm = '||SQLERRM);
2448 END IF;
2449 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
2450 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
2451 END set_email_attributes;
2452
2453 ---------------------------------------------------
2454 PROCEDURE customer_accept_quote
2455 (
2456 p_api_version IN NUMBER,
2457 p_init_msg_list IN VARCHAR2,
2458 p_commit IN VARCHAR2 DEFAULT 'F',
2459 p_contract_id IN NUMBER,
2460 p_item_key IN VARCHAR2,
2461 x_return_status OUT NOCOPY VARCHAR2,
2462 x_msg_data OUT NOCOPY VARCHAR2,
2463 x_msg_count OUT NOCOPY NUMBER
2464 ) AS
2465
2466 l_api_version CONSTANT NUMBER := 1;
2467 l_api_name CONSTANT VARCHAR2(30) := 'customer_accept_quote';
2468
2469 l_send_email_yn VARCHAR2(1) := 'N';
2470 l_item_key wf_items.item_key%TYPE;
2471 l_email_attr_rec OKS_WF_K_PROCESS_PVT.email_attr_rec;
2472 l_notif_attr_rec OKS_WF_K_PROCESS_PVT.notif_attr_rec;
2473
2474 CURSOR l_payment_csr(p_chr_id NUMBER) IS
2475 SELECT fndl.meaning
2476 FROM okc_k_headers_all_b okch,
2477 oks_k_headers_b oksh,
2478 fnd_lookups fndl
2479 WHERE okch.id = oksh.chr_id
2480 AND oksh.chr_id = p_chr_id
2481 AND fndl.lookup_code = DECODE(oksh.payment_type, NULL, okch.payment_instruction_type)
2482 AND fndl.lookup_type = G_LKUP_TYPE_PAY_TYPES;
2483
2484 /*Added for ER 13869562*/
2485 CURSOR validate_wf_attribute(p_item_key varchar2) IS
2486 SELECT text_value
2487 FROM wf_item_attribute_values
2488 WHERE item_type=G_ITEM_TYPE
2489 AND item_key=p_item_key
2490 AND name = 'CC_EMAIL';
2491
2492 CURSOR get_cc_email(p_chr_id NUMBER) IS
2493 SELECT cc_email_address
2494 FROM oks_k_headers_b
2495 WHERE chr_id=p_chr_id;
2496
2497 l_cc_email_address VARCHAR2(2000);
2498 l_text_value varchar2(2000);
2499 /*Added for ER 13869562*/
2500
2501
2502 BEGIN
2503
2504 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2505 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
2506 'Entered '||G_PKG_NAME ||'.'||l_api_name||' with p_contract_id'||
2507 p_contract_id||' p_item_key'||p_item_key);
2508 END IF;
2509
2510 DBMS_TRANSACTION.SAVEPOINT(l_api_name);
2511 -- Standard call to check for call compatibility.
2512 IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
2513 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2514 END IF;
2515
2516 -- Initialize message list if p_init_msg_list is set to TRUE.
2517 IF FND_API.to_Boolean( p_init_msg_list ) THEN
2518 FND_MSG_PUB.initialize;
2519 END IF;
2520
2521 -- Initialize API return status to success
2522 x_return_status := FND_API.G_RET_STS_SUCCESS;
2523
2524 IF p_item_key IS NULL THEN
2525 l_item_key := get_wf_item_key(p_contract_id);
2526 IF l_item_key IS NULL THEN
2527 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INVALID_WF_ITEM_KEY');
2528 FND_MSG_PUB.add;
2529 RAISE FND_API.G_EXC_ERROR;
2530 END IF;
2531 ELSE
2532 l_item_key := p_item_key;
2533 END IF; -- p_item_key IS NULL
2534
2535 IF activity_exist_in_process (
2536 p_item_type => G_ITEM_TYPE,
2537 p_item_key => l_item_key,
2538 p_activity_name => G_CUST_ACTION ) THEN
2539
2540 -- bug 5845505, send email only if template for the document type is setup
2541 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2542 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
2543 'OKS_WF_K_PROCESS_PVT.is_template_defined('||
2544 ' Contract ID ='||p_contract_id||
2545 ' Document Type ='||G_REPORT_TYPE_ACCEPT||')');
2546 END IF;
2547 is_template_defined (
2548 p_api_version => l_api_version,
2549 p_init_msg_list => G_FALSE,
2550 p_contract_id => p_contract_id,
2551 p_document_type => G_REPORT_TYPE_ACCEPT,
2552 x_template_defined_yn => l_send_email_yn,
2553 x_email_attr_rec => l_email_attr_rec,
2554 x_return_status => x_return_status,
2555 x_msg_data => x_msg_data,
2556 x_msg_count => x_msg_count
2557 );
2558
2559 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2560 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
2561 'OKS_WF_K_PROCESS_PVT.is_template_defined(x_return_status= '||
2562 x_return_status||' x_msg_count ='||x_msg_count||')');
2563 END IF;
2564 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
2565 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2566 ELSIF x_return_status = G_RET_STS_ERROR THEN
2567 RAISE FND_API.G_EXC_ERROR;
2568 END IF;
2569
2570 wf_engine.SetItemAttrText
2571 (
2572 itemtype => G_ITEM_TYPE,
2573 itemkey => l_item_key,
2574 aname => 'SEND_CONFIRM',
2575 avalue => l_send_email_yn
2576 );
2577
2578 --log interaction (media type WEB FORM) that customer has accepted the quote
2579 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2580 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
2581 'OKS_WF_K_PROCESS_PVT.set_email_attributes('||
2582 ' Contract ID = '||p_contract_id||
2583 substr(' IH Subject = '||l_email_attr_rec.ih_subject,1,100)||
2584 substr(' IH Message = '||l_email_attr_rec.ih_message||')',1,100));
2585 END IF;
2586 OKS_AUTO_REMINDER.log_interaction (
2587 p_api_version => l_api_version,
2588 p_init_msg_list => G_FALSE,
2589 x_return_status => x_return_status,
2590 x_msg_count => x_msg_count,
2591 x_msg_data => x_msg_data,
2592 p_chr_id => p_contract_id,
2593 p_subject => l_email_attr_rec.ih_subject,
2594 p_msg_body => l_email_attr_rec.ih_message,
2595 p_sent2_email => NULL,
2596 p_media_type => G_MEDIA_TYPE_WEB_FORM
2597 );
2598 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2599 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
2600 'OKS_AUTO_REMINDER.log_interaction(x_return_status= '||
2601 x_return_status||' x_msg_count ='||x_msg_count||')');
2602 END IF;
2603 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
2604 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2605 ELSIF x_return_status = G_RET_STS_ERROR THEN
2606 RAISE FND_API.G_EXC_ERROR;
2607 END IF;
2608 IF NVL(l_send_email_yn,'N') = 'Y' THEN
2609 l_email_attr_rec.CONTRACT_ID := p_contract_id;
2610 l_email_attr_rec.ITEM_KEY := l_item_key;
2611 l_email_attr_rec.EMAIL_TYPE := G_REPORT_TYPE_ACCEPT;
2612 l_email_attr_rec.TO_EMAIL := NULL;
2613 l_email_attr_rec.SENDER_EMAIL := NULL;
2614
2615 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2616 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
2617 'OKS_WF_K_PROCESS_PVT.set_email_attributes('||
2618 ' Contract ID ='||p_contract_id||
2619 ' Email Type ='||l_email_attr_rec.EMAIL_TYPE||')');
2620 END IF;
2621 set_email_attributes
2622 (
2623 p_api_version => l_api_version,
2624 p_init_msg_list => OKC_API.G_FALSE,
2625 p_email_attr => l_email_attr_rec,
2626 x_return_status => x_return_status,
2627 x_msg_data => x_msg_data,
2628 x_msg_count => x_msg_count
2629 );
2630 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2631 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
2632 'OKS_WF_K_PROCESS_PVT.set_email_attributes(x_return_status= '||
2633 x_return_status||' x_msg_count ='||x_msg_count||')');
2634 END IF;
2635 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
2636 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2637 ELSIF x_return_status = G_RET_STS_ERROR THEN
2638 RAISE FND_API.G_EXC_ERROR;
2639 END IF;
2640 END IF;
2641
2642 /*Added for ER 13869562 spingali*/
2643
2644 OPEN validate_wf_attribute(l_item_key);
2645 FETCH validate_wf_attribute INTO l_text_value;
2646
2647 IF validate_wf_attribute%FOUND THEN
2648
2649 OPEN get_cc_email(p_contract_id);
2650 FETCH get_cc_email INTO l_cc_email_address;
2651 IF get_cc_email%FOUND THEN
2652
2653 WF_ENGINE.SetItemAttrText
2654 (
2655 itemtype => G_ITEM_TYPE,
2656 itemkey => l_item_key,
2657 aname => 'CC_EMAIL',
2658 avalue => l_cc_email_address
2659 );
2660
2661 END IF;
2662
2663 CLOSE get_cc_email;
2664
2665 ELSE
2666
2667 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2668 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
2669 'OKS_WF_K_PROCESS_PVT.set_email_attributes attribute CC_EMAIL is not defined for this workflow item key '||
2670 l_item_key||')');
2671 END IF;
2672
2673 END IF;
2674 CLOSE validate_wf_attribute;
2675
2676
2677 /*Added for ER 13869562 spingali*/
2678
2679
2680 OPEN l_payment_csr(p_contract_id);
2681 FETCH l_payment_csr INTO l_notif_attr_rec.SUBJECT;
2682 CLOSE l_payment_csr;
2683
2684 l_notif_attr_rec.CONTRACT_ID := p_contract_id;
2685 l_notif_attr_rec.ITEM_KEY := l_item_key;
2686 l_notif_attr_rec.PERFORMER := NULL;
2687 l_notif_attr_rec.NTF_TYPE := G_NTF_TYPE_ACCEPT;
2688 l_notif_attr_rec.NTF_SUBJECT := NULL;
2689 l_notif_attr_rec.ACCEPT_DECLINE_BY := NULL;
2690
2691 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2692 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
2693 'OKS_WF_K_PROCESS_PVT.set_notification_attributes('||
2694 ' Contract ID ='||p_contract_id||
2695 ' Notification Type ='||l_notif_attr_rec.NTF_TYPE||
2696 ' Message Subject ='||l_notif_attr_rec.SUBJECT||')');
2697 END IF;
2698 set_notification_attributes
2699 (
2700 p_api_version => l_api_version,
2701 p_init_msg_list => OKC_API.G_FALSE,
2702 p_notif_attr => l_notif_attr_rec,
2703 x_return_status => x_return_status,
2704 x_msg_data => x_msg_data,
2705 x_msg_count => x_msg_count
2706 );
2707 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2708 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
2709 'OKS_WF_K_PROCESS_PVT.set_notification_attributes(x_return_status= '||
2710 x_return_status||' x_msg_count ='||x_msg_count||')');
2711 END IF;
2712 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
2713 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2714 ELSIF x_return_status = G_RET_STS_ERROR THEN
2715 RAISE FND_API.G_EXC_ERROR;
2716 END IF;
2717
2718 -- valid activity , complete the wf activity
2719 complete_activity
2720 (
2721 p_api_version => 1,
2722 p_init_msg_list => G_FALSE,
2723 p_contract_id => p_contract_id,
2724 p_item_key => l_item_key,
2725 p_resultout => 'ACCEPT',
2726 p_process_status => G_NEG_STS_QUOTE_ACPTD,
2727 p_activity_name => G_CUST_ACTION,
2728 x_return_status => x_return_status,
2729 x_msg_data => x_msg_data,
2730 x_msg_count => x_msg_count
2731 );
2732
2733 -- If any errors happen abort API
2734 IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
2735 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2736 ELSIF (x_return_status = G_RET_STS_ERROR) THEN
2737 RAISE FND_API.G_EXC_ERROR;
2738 END IF;
2739 ELSE
2740 -- invalid activity
2741 fnd_message.set_name(G_APP_NAME,'OKS_INVALID_CUST_ACPT_ACTION');
2742 fnd_message.set_token('K_NUMBER',get_concat_k_number(p_contract_id));
2743 fnd_msg_pub.add;
2744 RAISE FND_API.G_EXC_ERROR;
2745 END IF;
2746
2747 IF FND_API.to_boolean( p_commit ) THEN
2748 COMMIT;
2749 END IF;
2750
2751 -- Standard call to get message count and if count is 1, get message info.
2752 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
2753
2754 -- end debug log
2755 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2756 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
2757 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
2758 END IF;
2759 EXCEPTION
2760 WHEN FND_API.G_EXC_ERROR THEN
2761 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
2762 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
2763 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2764 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
2765 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_ERROR');
2766 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
2767 END IF;
2768 x_return_status := G_RET_STS_ERROR;
2769 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2770 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
2771 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
2772 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2773 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
2774 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_UNEXPECTED_ERROR');
2775 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
2776 END IF;
2777 x_return_status := G_RET_STS_UNEXP_ERROR ;
2778 WHEN OTHERS THEN
2779 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
2780 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2781 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
2782 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from OTHERS sqlcode = '
2783 ||SQLCODE||', sqlerrm = '||SQLERRM);
2784 END IF;
2785 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
2786 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
2787 x_return_status := G_RET_STS_UNEXP_ERROR ;
2788 END customer_accept_quote;
2789
2790 ---------------------------------------------------
2791 PROCEDURE customer_decline_quote
2792 (
2793 p_api_version IN NUMBER,
2794 p_init_msg_list IN VARCHAR2,
2795 p_commit IN VARCHAR2 DEFAULT 'F',
2796 p_contract_id IN NUMBER,
2797 p_item_key IN VARCHAR2,
2798 p_reason_code IN VARCHAR2,
2799 p_comments IN VARCHAR2,
2800 x_return_status OUT NOCOPY VARCHAR2,
2801 x_msg_data OUT NOCOPY VARCHAR2,
2802 x_msg_count OUT NOCOPY NUMBER
2803 ) AS
2804
2805 l_api_version CONSTANT NUMBER := 1;
2806 l_api_name CONSTANT VARCHAR2(30) := 'customer_decline_quote';
2807
2808 CURSOR c_old_sts (p_contract_id IN NUMBER) is
2809 SELECT STS_CODE
2810 FROM OKC_K_HEADERS_ALL_B okck,
2811 OKC_STATUSES_B sts
2812 WHERE sts.ste_code = 'ENTERED'
2813 AND id = p_contract_id
2814 AND sts.code = okck.sts_code;
2815
2816 CURSOR l_new_sts_code_csr IS
2817 SELECT CODE FROM okc_statuses_b
2818 WHERE ste_code = 'CANCELLED'
2819 AND default_yn = 'Y'
2820 AND sysdate BETWEEN START_DATE AND NVL(end_date,SYSDATE+1);
2821
2822 /*Added for ER 13869562 spingali*/
2823
2824 CURSOR validate_wf_attribute(p_item_key VARCHAR2) IS
2825 SELECT text_value
2826 FROM wf_item_attribute_values
2827 WHERE item_type=G_ITEM_TYPE
2828 AND item_key=p_item_key
2829 AND name = 'CC_EMAIL';
2830
2831
2832 CURSOR get_cc_email(p_chr_id NUMBER) IS
2833 SELECT cc_email_address
2834 FROM oks_k_headers_b
2835 WHERE chr_id=p_chr_id;
2836
2837 l_cc_email_address VARCHAR2(2000);
2838
2839 l_text_value VARCHAR2(2000);
2840
2841 /*Added for ER 13869562 spingali*/
2842
2843
2844 l_send_email_yn VARCHAR2(1) := 'N';
2845 l_item_key wf_items.item_key%TYPE;
2846 l_email_attr_rec OKS_WF_K_PROCESS_PVT.email_attr_rec;
2847 l_notif_attr_rec OKS_WF_K_PROCESS_PVT.notif_attr_rec;
2848 l_old_sts OKC_STATUSES_B.CODE%TYPE;
2849 l_new_sts OKC_STATUSES_B.CODE%TYPE;
2850 l_rownotfound BOOLEAN := FALSE;
2851 l_reason VARCHAR2(250);
2852
2853 BEGIN
2854 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2855 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
2856 'Entered '||G_PKG_NAME ||'.'||l_api_name||' with p_contract_id'||
2857 p_contract_id||' p_item_key:'||p_item_key);
2858 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
2859 'p_reason_code:'||p_reason_code||' p_comments:'||p_comments);
2860 END IF;
2861
2862 DBMS_TRANSACTION.SAVEPOINT(l_api_name);
2863 -- Standard call to check for call compatibility.
2864 IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
2865 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2866 END IF;
2867
2868 -- Initialize message list if p_init_msg_list is set to TRUE.
2869 IF FND_API.to_Boolean( p_init_msg_list ) THEN
2870 FND_MSG_PUB.initialize;
2871 END IF;
2872
2873 -- Initialize API return status to success
2874 x_return_status := FND_API.G_RET_STS_SUCCESS;
2875
2876 IF p_item_key IS NULL THEN
2877 l_item_key := get_wf_item_key(p_contract_id);
2878 IF l_item_key IS NULL THEN
2879 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INVALID_WF_ITEM_KEY');
2880 FND_MSG_PUB.add;
2881 RAISE FND_API.G_EXC_ERROR;
2882 END IF;
2883 ELSE
2884 l_item_key := p_item_key;
2885 END IF; -- p_item_key IS NULL
2886
2887 IF activity_exist_in_process (
2888 p_item_type => G_ITEM_TYPE,
2889 p_item_key => l_item_key,
2890 p_activity_name => G_CUST_ACTION ) THEN
2891
2892 -- bug 5845505, send email only if template for the document type is setup
2893 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2894 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
2895 'OKS_WF_K_PROCESS_PVT.is_template_defined('||
2896 ' Contract ID ='||p_contract_id||
2897 ' Document Type ='||G_REPORT_TYPE_CANCEL||')');
2898 END IF;
2899 is_template_defined (
2900 p_api_version => l_api_version,
2901 p_init_msg_list => G_FALSE,
2902 p_contract_id => p_contract_id,
2903 p_document_type => G_REPORT_TYPE_CANCEL,
2904 x_template_defined_yn => l_send_email_yn,
2905 x_email_attr_rec => l_email_attr_rec,
2906 x_return_status => x_return_status,
2907 x_msg_data => x_msg_data,
2908 x_msg_count => x_msg_count
2909 );
2910
2911 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2912 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
2913 'OKS_WF_K_PROCESS_PVT.is_template_defined(x_return_status= '||
2914 x_return_status||' x_msg_count ='||x_msg_count||')');
2915 END IF;
2916 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
2917 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2918 ELSIF x_return_status = G_RET_STS_ERROR THEN
2919 RAISE FND_API.G_EXC_ERROR;
2920 END IF;
2921
2922 wf_engine.SetItemAttrText
2923 (
2924 itemtype => G_ITEM_TYPE,
2925 itemkey => l_item_key,
2926 aname => 'SEND_CONFIRM',
2927 avalue => l_send_email_yn
2928 );
2929
2930 l_reason := get_lookup_meaning(p_reason_code,G_LKUP_TYPE_CNCL_REASON);
2931
2932 --log interaction (media type WEB FORM) that customer has declined the quote
2933 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2934 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
2935 'OKS_WF_K_PROCESS_PVT.set_email_attributes('||
2936 ' Contract ID = '||p_contract_id||
2937 substr(' IH Message = '||p_comments,1,100)||
2938 substr(' IH Subject = '||l_reason||')',1,100));
2939 END IF;
2940 OKS_AUTO_REMINDER.log_interaction (
2941 p_api_version => l_api_version,
2942 p_init_msg_list => G_FALSE,
2943 x_return_status => x_return_status,
2944 x_msg_count => x_msg_count,
2945 x_msg_data => x_msg_data,
2946 p_chr_id => p_contract_id,
2947 p_subject => l_reason,
2948 p_msg_body => p_comments,
2949 p_sent2_email => NULL,
2950 p_media_type => G_MEDIA_TYPE_WEB_FORM
2951 );
2952 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2953 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
2954 'OKS_AUTO_REMINDER.log_interaction(x_return_status= '||
2955 x_return_status||' x_msg_count ='||x_msg_count||')');
2956 END IF;
2957 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
2958 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2959 ELSIF x_return_status = G_RET_STS_ERROR THEN
2960 RAISE FND_API.G_EXC_ERROR;
2961 END IF;
2962 IF NVL(l_send_email_yn,'N') = 'Y' THEN
2963
2964 l_email_attr_rec.CONTRACT_ID := p_contract_id;
2965 l_email_attr_rec.ITEM_KEY := l_item_key;
2966 l_email_attr_rec.EMAIL_TYPE := G_REPORT_TYPE_CANCEL;
2967 l_email_attr_rec.TO_EMAIL := NULL;
2968 l_email_attr_rec.SENDER_EMAIL := NULL;
2969
2970 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2971 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
2972 'OKS_WF_K_PROCESS_PVT.set_email_attributes('||
2973 ' Contract ID ='||p_contract_id||
2974 ' Email Type ='||l_email_attr_rec.EMAIL_TYPE||')');
2975 END IF;
2976 set_email_attributes
2977 (
2978 p_api_version => l_api_version,
2979 p_init_msg_list => OKC_API.G_FALSE,
2980 p_email_attr => l_email_attr_rec,
2981 x_return_status => x_return_status,
2982 x_msg_data => x_msg_data,
2983 x_msg_count => x_msg_count
2984 );
2985 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2986 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
2987 'OKS_WF_K_PROCESS_PVT.set_email_attributes(x_return_status= '||
2988 x_return_status||' x_msg_count ='||x_msg_count||')');
2989 END IF;
2990 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
2991 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2992 ELSIF x_return_status = G_RET_STS_ERROR THEN
2993 RAISE FND_API.G_EXC_ERROR;
2994 END IF;
2995 END IF;
2996
2997 /*Added for ER 13869562 spingali*/
2998
2999 OPEN validate_wf_attribute(l_item_key);
3000 FETCH validate_wf_attribute INTO l_text_value;
3001
3002 IF validate_wf_attribute%FOUND THEN
3003
3004 OPEN get_cc_email(p_contract_id);
3005 FETCH get_cc_email INTO l_cc_email_address;
3006 IF get_cc_email%FOUND THEN
3007
3008 WF_ENGINE.SetItemAttrText
3009 (
3010 itemtype => G_ITEM_TYPE,
3011 itemkey => l_item_key,
3012 aname => 'CC_EMAIL',
3013 avalue => l_cc_email_address
3014 );
3015
3016 END IF;
3017
3018 CLOSE get_cc_email;
3019
3020 ELSE
3021
3022 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3023 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
3024 'OKS_WF_K_PROCESS_PVT.set_email_attributes attribute CC_EMAIL is not defined for this workflow item key '||
3025 l_item_key||')');
3026 END IF;
3027
3028 END IF;
3029 CLOSE validate_wf_attribute;
3030
3031
3032 /*Added for ER 13869562 spingali*/
3033
3034
3035 l_notif_attr_rec.CONTRACT_ID := p_contract_id;
3036 l_notif_attr_rec.ITEM_KEY := l_item_key;
3037 l_notif_attr_rec.PERFORMER := NULL;
3038 l_notif_attr_rec.NTF_TYPE := G_NTF_TYPE_DECLINE;
3039 l_notif_attr_rec.NTF_SUBJECT := NULL;
3040 l_notif_attr_rec.SUBJECT := l_reason;
3041 l_notif_attr_rec.MESSAGE1 := p_comments;
3042 l_notif_attr_rec.ACCEPT_DECLINE_BY := NULL;
3043
3044 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3045 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
3046 'OKS_WF_K_PROCESS_PVT.set_notification_attributes('||
3047 ' Contract ID ='||p_contract_id||
3048 ' Notification Type ='||l_notif_attr_rec.NTF_TYPE||
3049 ' Subject ='||l_notif_attr_rec.NTF_SUBJECT||')');
3050 END IF;
3051 set_notification_attributes
3052 (
3053 p_api_version => l_api_version,
3054 p_init_msg_list => OKC_API.G_FALSE,
3055 p_notif_attr => l_notif_attr_rec,
3056 x_return_status => x_return_status,
3057 x_msg_data => x_msg_data,
3058 x_msg_count => x_msg_count
3059 );
3060 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3061 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
3062 'OKS_WF_K_PROCESS_PVT.set_notification_attributes(x_return_status= '||
3063 x_return_status||' x_msg_count ='||x_msg_count||')');
3064 END IF;
3065 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
3066 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3067 ELSIF x_return_status = G_RET_STS_ERROR THEN
3068 RAISE FND_API.G_EXC_ERROR;
3069 END IF;
3070
3071 OPEN c_old_sts(p_contract_id);
3072 FETCH c_old_sts INTO l_old_sts;
3073 l_rownotfound := c_old_sts%NOTFOUND;
3074 CLOSE c_old_sts;
3075 IF NOT l_rownotfound THEN
3076
3077 -- Bug fix 5893728
3078 OPEN l_new_sts_code_csr;
3079 FETCH l_new_sts_code_csr INTO l_new_sts;
3080 CLOSE l_new_sts_code_csr;
3081
3082 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3083 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
3084 'OKS_CHANGE_STATUS_PVT.UPDATE_HEADER_STATUS(p_id= '||p_contract_id||
3085 ' p_old_sts_code ='||l_old_sts||' p_comments ='||substr(p_comments,1,250)||
3086 ' p_canc_reason_code ='||p_reason_code||')');
3087 END IF;
3088 OKS_CHANGE_STATUS_PVT.UPDATE_HEADER_STATUS (
3089 x_return_status => x_return_status,
3090 x_msg_data => x_msg_data,
3091 x_msg_count => x_msg_count,
3092 p_init_msg_list => G_FALSE,
3093 p_id => p_contract_id,
3094 p_new_sts_code => l_new_sts,
3095 p_old_sts_code => l_old_sts,
3096 p_canc_reason_code => p_reason_code,
3097 p_comments => p_comments,
3098 p_term_cancel_source => G_PERFORMED_BY_CUST,
3099 p_date_cancelled => SYSDATE,
3100 p_validate_status => 'N') ;
3101 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3102 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
3103 'OKS_CHANGE_STATUS_PVT.UPDATE_HEADER_STATUS(x_return_status= '||x_return_status||
3104 ' x_msg_count ='||x_msg_count||')');
3105 END IF;
3106 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
3107 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3108 ELSIF x_return_status = G_RET_STS_ERROR THEN
3109 RAISE FND_API.G_EXC_ERROR;
3110 END IF;
3111 ELSE
3112 FND_MESSAGE.set_name('OKS','OKS_CANT_CANCEL_K'); -- set the message here
3113 FND_MESSAGE.set_token('K_NUMBER',get_concat_k_number(p_contract_id));
3114 fnd_msg_pub.add;
3115 RAISE FND_API.G_EXC_ERROR;
3116 END IF;
3117 ELSE
3118 -- invalid activity
3119 fnd_message.set_name(G_APP_NAME,'OKS_INVALID_CUST_DCLN_ACTION');
3120 fnd_message.set_token('K_NUMBER',get_concat_k_number(p_contract_id));
3121 fnd_msg_pub.add;
3122 RAISE FND_API.G_EXC_ERROR;
3123 END IF;
3124
3125 IF FND_API.to_boolean( p_commit ) THEN
3126 COMMIT;
3127 END IF;
3128
3129 -- Standard call to get message count and if count is 1, get message info.
3130 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3131
3132 -- end debug log
3133 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3134 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
3135 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
3136 END IF;
3137
3138 EXCEPTION
3139 WHEN FND_API.G_EXC_ERROR THEN
3140 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
3141 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3142 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3143 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
3144 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_ERROR');
3145 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
3146 END IF;
3147 x_return_status := G_RET_STS_ERROR;
3148 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3149 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
3150 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3151 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3152 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
3153 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_UNEXPECTED_ERROR');
3154 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
3155 END IF;
3156 x_return_status := G_RET_STS_UNEXP_ERROR ;
3157 WHEN OTHERS THEN
3158 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
3159 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3160 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
3161 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from OTHERS sqlcode = '
3162 ||SQLCODE||', sqlerrm = '||SQLERRM);
3163 END IF;
3164 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
3165 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3166 x_return_status := G_RET_STS_UNEXP_ERROR ;
3167 END customer_decline_quote;
3168
3169 ---------------------------------------------------
3170 PROCEDURE customer_request_assistance
3171 (
3172 p_api_version IN NUMBER,
3173 p_init_msg_list IN VARCHAR2,
3174 p_commit IN VARCHAR2 DEFAULT 'F',
3175 p_contract_id IN NUMBER,
3176 p_item_key IN VARCHAR2,
3177 p_to_email IN VARCHAR2,
3178 p_cc_email IN VARCHAR2,
3179 p_subject IN VARCHAR2,
3180 p_message IN VARCHAR2,
3181 x_return_status OUT NOCOPY VARCHAR2,
3182 x_msg_data OUT NOCOPY VARCHAR2,
3183 x_msg_count OUT NOCOPY NUMBER
3184 ) AS
3185
3186 l_api_version CONSTANT NUMBER := 1;
3187 l_api_name CONSTANT VARCHAR2(30) := 'customer_request_assistance';
3188 l_item_key wf_items.item_key%TYPE;
3189 l_interaction_subject VARCHAR2(4000);
3190 l_interaction_message VARCHAR2(4000);
3191 l_role_name wf_roles.name%TYPE := NULL;
3192 l_role_email wf_roles.email_address%TYPE;
3193 l_notif_attr_rec OKS_WF_K_PROCESS_PVT.notif_attr_rec;
3194 l_salesrep_email VARCHAR2(240);
3195 l_salesrep_username VARCHAR2(100);
3196 l_display_rolename VARCHAR2(360);
3197
3198 tmp_email_list VARCHAR2(8000) ;
3199 i NUMBER := 0;
3200 j NUMBER := 0;
3201
3202 TYPE l_user_list IS TABLE OF VARCHAR2(500) INDEX BY BINARY_INTEGER;
3203 l_user_tbl l_user_list;
3204 l_user_name VARCHAR2(4000);
3205 x_user_name VARCHAR2(4000);
3206
3207
3208 BEGIN
3209 -- start debug log
3210 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3211 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
3212 'Entered '||G_PKG_NAME ||'.'||l_api_name||
3213 '(p_contract_id=>'||p_contract_id||
3214 ',p_item_key=>'||p_item_key||
3215 ',p_to_email=>'||p_to_email||')');
3216 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
3217 'p_cc_email=>'||p_cc_email||
3218 ',p_subject=>'||p_subject||
3219 ',p_message=>'||p_message||')');
3220 END IF;
3221
3222 DBMS_TRANSACTION.SAVEPOINT(l_api_name);
3223 -- Standard call to check for call compatibility.
3224 IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
3225 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3226 END IF;
3227
3228 -- Initialize message list if p_init_msg_list is set to TRUE.
3229 IF FND_API.to_Boolean( p_init_msg_list ) THEN
3230 FND_MSG_PUB.initialize;
3231 END IF;
3232
3233 -- Initialize API return status to success
3234 x_return_status := FND_API.G_RET_STS_SUCCESS;
3235
3236 IF p_item_key IS NULL THEN
3237 l_item_key := get_wf_item_key(p_contract_id);
3238 IF l_item_key IS NULL THEN
3239 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INVALID_WF_ITEM_KEY');
3240 FND_MSG_PUB.add;
3241 RAISE FND_API.G_EXC_ERROR;
3242 END IF;
3243 ELSE
3244 l_item_key := p_item_key;
3245 END IF; -- p_item_key IS NULL
3246
3247 IF activity_exist_in_process (
3248 p_item_type => G_ITEM_TYPE,
3249 p_item_key => l_item_key,
3250 p_activity_name => G_CUST_ACTION ) THEN
3251
3252 -- Ignore the p_to_email value and get the salesrep email and FND username again
3253 -- Due to big impact of changing the signature we r taking this route
3254 -- This changes are done due to the requirement to send notification to Salesrep
3255 -- and an email to cc'ed guys
3256 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3257 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
3258 'OKS_CUSTOMER_ACCEPTANCE_PVT.get_contract_salesrep_details('||
3259 ' Contract ID ='||p_contract_id||')');
3260 END IF;
3261 OKS_CUSTOMER_ACCEPTANCE_PVT.get_contract_salesrep_details
3262 (
3263 p_chr_id => p_contract_id,
3264 x_salesrep_email => l_salesrep_email,
3265 x_salesrep_username => l_salesrep_username,
3266 x_return_status => x_return_status,
3267 x_msg_data => x_msg_data,
3268 x_msg_count => x_msg_count
3269 );
3270 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3271 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
3272 'OKS_CUSTOMER_ACCEPTANCE_PVT.get_contract_salesrep_details(x_salesrep_email= '||
3273 l_salesrep_email||' x_salesrep_username= '||l_salesrep_username||
3274 'x_return_status= '||x_return_status||' x_msg_count ='||x_msg_count||')');
3275 END IF;
3276 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
3277 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3278 ELSIF x_return_status = G_RET_STS_ERROR THEN
3279 RAISE FND_API.G_EXC_ERROR;
3280 END IF;
3281
3282 IF p_cc_email IS NOT NULL THEN
3283 -- Create a adhoc user and role for wf to send the email
3284 l_role_name := p_contract_id||' - '||to_char(sysdate,'DDMMYYYYHHMISS');
3285
3286 -- Create adhoc user for wf
3287 --Convert email list (string) to PL/SQL Array for creating adhoc users
3288 tmp_email_list := p_cc_email;
3289
3290 LOOP
3291 i := INSTR(tmp_email_list,',');
3292
3293 -- debug log
3294 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3295 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
3296 G_MODULE||l_api_name,'i : '||i);
3297 END IF;
3298
3299 IF i > 0 THEN
3300 -- comma found
3301
3302 l_user_tbl(j) := SUBSTR(tmp_email_list,1,i-1);
3303
3304 -- debug log
3305 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3306 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
3307 G_MODULE||l_api_name,'j :'||j);
3308 END IF;
3309
3310 tmp_email_list := SUBSTR(tmp_email_list,i+1, length(tmp_email_list) - i);
3311
3312 -- debug log
3313 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3314 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
3315 'tmp_email_list : '||tmp_email_list);
3316 END IF;
3317
3318 j := j + 1;
3319 ELSE
3320 -- no comma found i.e last contract id
3321 l_user_tbl(j) := tmp_email_list;
3322 EXIT;
3323 END IF;
3324
3325 END LOOP;
3326
3327 -- debug log
3328 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3329 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
3330 'After Converting email list to pl/sql');
3331 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
3332 'Count of Emails is : '||l_user_tbl.COUNT);
3333 END IF;
3334
3335
3336 -- for each email create a adhoc user
3337 FOR k IN NVL(l_user_tbl.FIRST,0)..NVL(l_user_tbl.LAST,-1)
3338 LOOP
3339
3340 x_user_name := '';
3341
3342 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3343 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
3344 'Wf_Directory.CreateAdHocUser(email_address ='||l_user_tbl(k)||')');
3345 END IF;
3346
3347 BEGIN
3348 WF_DIRECTORY.CreateAdHocUser(
3349 name => x_user_name,
3350 display_name => x_user_name,
3351 language => null,
3352 territory => null,
3353 description => 'OKS: Renewal Adhoc User',
3354 notification_preference => 'MAILHTML',
3355 email_address => l_user_tbl(k),
3356 status => 'ACTIVE',
3357 expiration_date => SYSDATE+1 ,
3358 parent_orig_system => null,
3359 parent_orig_system_id => null);
3360 EXCEPTION
3361 WHEN OTHERS THEN
3362 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_CREATE_ADHOC_USER_FAILED');
3363 FND_MESSAGE.set_token('USER_NAME',l_user_tbl(k));
3364 FND_MESSAGE.set_token('SQL_ERROR',SQLERRM);
3365 FND_MSG_PUB.add;
3366 RAISE FND_API.G_EXC_ERROR;
3367 END;
3368
3369
3370 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3371 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
3372 'Wf_Directory.CreateAdHocUser SUCCESS created user : '||x_user_name);
3373 END IF;
3374
3375 -- build concatinated list of user name for adhoc role
3376 l_user_name := l_user_name||','||x_user_name;
3377
3378 END LOOP;
3379
3380
3381 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3382 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
3383 'Wf_Directory.CreateAdHocRole(email_address ='||p_cc_email||')');
3384 END IF;
3385
3386 -- call wf api to create the adhoc role
3387 BEGIN
3388 l_display_rolename := substr(p_cc_email,1,360);
3389 Wf_Directory.CreateAdHocRole
3390 (
3391 role_name => l_role_name,
3392 role_display_name => l_role_name, --l_display_rolename, COMMENTED COZ EMAIL NOT DELIVERED
3393 language => null,
3394 territory => null,
3395 role_description => 'OKS: Renewal Adhoc role',
3396 notification_preference => 'MAILHTML',
3397 role_users => l_user_name,
3398 email_address => NULL,
3399 fax => null,
3400 status => 'ACTIVE',
3401 expiration_date => SYSDATE+1,
3402 parent_orig_system => null,
3403 parent_orig_system_id => null,
3404 owner_tag => null
3405 );
3406 EXCEPTION
3407 WHEN OTHERS THEN
3408 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_CREATE_ADHOC_ROLE_FAILED');
3409 FND_MESSAGE.set_token('ROLE_NAME',l_role_name);
3410 FND_MESSAGE.set_token('SQL_ERROR',SQLERRM);
3411 FND_MSG_PUB.add;
3412 RAISE FND_API.G_EXC_ERROR;
3413 END;
3414
3415 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3416 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
3417 'Wf_Directory.CreateAdHocRole - Success');
3418 END IF;
3419 END IF;
3420
3421 l_notif_attr_rec.CONTRACT_ID := p_contract_id;
3422 l_notif_attr_rec.ITEM_KEY := l_item_key;
3423 l_notif_attr_rec.PERFORMER := l_salesrep_username;
3424 l_notif_attr_rec.REQ_ASSIST_ROLE := l_role_name;
3425 l_notif_attr_rec.NTF_TYPE := G_NTF_TYPE_MESSAGE;
3426 l_notif_attr_rec.NTF_SUBJECT := NULL;
3427 l_notif_attr_rec.SUBJECT := p_subject;
3428 l_notif_attr_rec.MESSAGE1 := p_message;
3429 l_notif_attr_rec.ACCEPT_DECLINE_BY := NULL;
3430
3431 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3432 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
3433 'OKS_WF_K_PROCESS_PVT.set_notification_attributes('||
3434 ' Contract ID ='||p_contract_id||
3435 ' Notification Type ='||l_notif_attr_rec.NTF_TYPE||
3436 ' Subject ='||l_notif_attr_rec.NTF_SUBJECT||')');
3437 END IF;
3438 set_notification_attributes
3439 (
3440 p_api_version => l_api_version,
3441 p_init_msg_list => OKC_API.G_FALSE,
3442 p_notif_attr => l_notif_attr_rec,
3443 x_return_status => x_return_status,
3444 x_msg_data => x_msg_data,
3445 x_msg_count => x_msg_count
3446 );
3447 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3448 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
3449 'OKS_WF_K_PROCESS_PVT.set_notification_attributes(x_return_status= '||
3450 x_return_status||' x_msg_count ='||x_msg_count||')');
3451 END IF;
3452
3453 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
3454 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3455 ELSIF x_return_status = G_RET_STS_ERROR THEN
3456 RAISE FND_API.G_EXC_ERROR;
3457 END IF;
3458
3459 -- log interaction history
3460 fnd_message.set_name(G_APP_NAME,'OKS_IH_SUBJECT_CUST_ASS');
3461 l_interaction_subject := fnd_message.get;
3462
3463 fnd_message.set_name(G_APP_NAME,'OKS_IH_MESSAGE_CUST_ASS');
3464 fnd_message.set_token('K_NUMBER',get_concat_k_number(p_contract_id));
3465 fnd_message.set_token('SUBJECT',p_subject);
3466 fnd_message.set_token('MESSAGE',p_message);
3467 l_interaction_message := fnd_message.get;
3468
3469 IF p_cc_email IS NULL THEN
3470 l_role_email := l_salesrep_email;
3471 ELSE
3472 l_role_email := l_salesrep_email||','||p_cc_email;
3473 END IF;
3474
3475 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3476 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
3477 'OKS_AUTO_REMINDER.log_interaction(p_contract_id= '
3478 ||p_contract_id||' p_subject='||l_interaction_subject||
3479 ' p_msg_body='||l_interaction_message||
3480 ' p_sent2_email='||l_role_email||')');
3481 END IF;
3482 OKS_AUTO_REMINDER.log_interaction
3483 (
3484 p_api_version => l_api_version,
3485 p_init_msg_list => G_FALSE,
3486 x_return_status => x_return_status,
3487 x_msg_count => x_msg_data,
3488 x_msg_data => x_msg_count,
3489 p_chr_id => p_contract_id,
3490 p_subject => l_interaction_subject,
3491 p_msg_body => l_interaction_message,
3492 p_sent2_email => l_role_email
3493 );
3494 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3495 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
3496 'OKS_AUTO_REMINDER.log_interaction(x_return_status= '||x_return_status||
3497 ' x_msg_count ='||x_msg_count||')');
3498 END IF;
3499 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
3500 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3501 ELSIF x_return_status = G_RET_STS_ERROR THEN
3502 RAISE FND_API.G_EXC_ERROR;
3503 END IF;
3504
3505 -- valid activity , complete the wf activity
3506 complete_activity
3507 (
3508 p_api_version => 1,
3509 p_init_msg_list => FND_API.G_FALSE,
3510 p_contract_id => p_contract_id,
3511 p_item_key => l_item_key,
3512 p_resultout => 'REQUEST_ASSISTANCE',
3513 p_process_status => G_NEG_STS_ASSIST_REQD,
3514 p_activity_name => G_CUST_ACTION,
3515 x_return_status => x_return_status,
3516 x_msg_data => x_msg_data,
3517 x_msg_count => x_msg_count
3518 );
3519 -- If any errors happen abort API
3520 IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
3521 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3522 ELSIF (x_return_status = G_RET_STS_ERROR) THEN
3523 RAISE FND_API.G_EXC_ERROR;
3524 END IF;
3525
3526 ELSE
3527 -- invalid activity
3528 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INVALID_REQ_ASST_ACTION');
3529 fnd_message.set_token('K_NUMBER',get_concat_k_number(p_contract_id));
3530 FND_MSG_PUB.add;
3531 RAISE FND_API.G_EXC_ERROR;
3532 END IF;
3533
3534 IF FND_API.to_boolean( p_commit ) THEN
3535 COMMIT;
3536 END IF;
3537
3538 -- Standard call to get message count and if count is 1, get message info.
3539 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3540
3541 -- end debug log
3542 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3543 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
3544 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
3545 END IF;
3546
3547 EXCEPTION
3548 WHEN FND_API.G_EXC_ERROR THEN
3549 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
3550 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3551 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3552 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
3553 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_ERROR');
3554 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
3555 END IF;
3556 x_return_status := G_RET_STS_ERROR;
3557 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3558 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
3559 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3560 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3561 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
3562 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_UNEXPECTED_ERROR');
3563 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
3564 END IF;
3565 x_return_status := G_RET_STS_UNEXP_ERROR ;
3566 WHEN OTHERS THEN
3567 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
3568 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3569 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
3570 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from OTHERS sqlcode = '
3571 ||SQLCODE||', sqlerrm = '||SQLERRM);
3572 END IF;
3573 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
3574 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3575 x_return_status := G_RET_STS_UNEXP_ERROR ;
3576 END customer_request_assistance;
3577
3578 /*=========================================================================
3579 API name : update_negotiation_status
3580 Type : Private.
3581 Function : This procedure updates renewal status in OKS_K_HEADERS_B
3582 and bumps up the version.
3583 Pre-reqs : None.
3584 Parameters :
3585 IN : p_api_version IN NUMBER Required
3586 Api version
3587 : p_init_msg_list IN VARCHAR2 Required
3588 Initialize message stack parameter
3589 : p_chr_id IN NUMBER Required
3590 Contract header Id
3591 : p_negotiation_status IN VARCHAR2 Required
3592 New negotiation status that is to be updated.
3593 OUT : x_return_status OUT VARCHAR2(1)
3594 Api return status
3595 : x_msg_count OUT NUMBER
3596 Count of message on error stack
3597 : x_msg_data OUT VARCHAR2
3598 Actual error messages on error stack
3599 Note :
3600 =========================================================================*/
3601 PROCEDURE update_negotiation_status
3602 (
3603 p_api_version IN NUMBER,
3604 p_init_msg_list IN VARCHAR2,
3605 p_commit IN VARCHAR2 DEFAULT 'F',
3606 p_chr_id IN NUMBER,
3607 p_negotiation_status IN VARCHAR2,
3608 x_return_status OUT NOCOPY VARCHAR2,
3609 x_msg_count OUT NOCOPY NUMBER,
3610 x_msg_data OUT NOCOPY VARCHAR2
3611 ) IS
3612
3613 l_api_version CONSTANT NUMBER := 1.0;
3614 l_api_name CONSTANT VARCHAR2(30) := 'update_negotiation_status';
3615
3616 BEGIN
3617
3618 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3619 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
3620 'Entered '||G_PKG_NAME ||'.'||l_api_name||
3621 '(p_chr_id=>'||p_chr_id||'p_negotiation_status=>'||p_negotiation_status||')');
3622 END IF;
3623
3624 DBMS_TRANSACTION.SAVEPOINT(l_api_name);
3625 -- Standard call to check for call compatibility.
3626 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
3627 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3628 END IF;
3629
3630 IF FND_API.to_Boolean( p_init_msg_list ) THEN
3631 FND_MSG_PUB.initialize;
3632 END IF;
3633
3634 -- Initialize API return status to success
3635 x_return_status := FND_API.G_RET_STS_SUCCESS;
3636
3637 IF p_negotiation_status IS NOT NULL THEN
3638 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3639 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
3640 'Updating Contract: '||G_PKG_NAME ||'.'||l_api_name);
3641 END IF;
3642 UPDATE oks_k_headers_b
3643 SET renewal_status = p_negotiation_status,
3644 object_version_number = object_version_number + 1,
3645 last_update_date = SYSDATE,
3646 last_updated_by = FND_GLOBAL.USER_ID,
3647 last_update_login = FND_GLOBAL.LOGIN_ID,
3648 /* Added by sjanakir for Bug# 7639337 */
3649 quote_sent_flag = DECODE(p_negotiation_status,G_NEG_STS_QUOTE_SENT,'Y',quote_sent_flag)
3650 WHERE chr_id = p_chr_id;
3651
3652 /* COMMENTING THE CODE DUE TO DEADLOCK ISSUES ENCOUNTERED WHILE COMPLETING WF
3653 -- bump up the minor version number
3654 UPDATE okc_k_vers_numbers
3655 SET minor_version = minor_version + 1,
3656 object_version_number = object_version_number + 1,
3657 last_update_date = SYSDATE,
3658 last_updated_by = FND_GLOBAL.USER_ID,
3659 last_update_login = FND_GLOBAL.LOGIN_ID
3660 WHERE chr_id = p_chr_id;
3661 */
3662 END IF;
3663
3664 IF FND_API.to_boolean( p_commit ) THEN
3665 COMMIT;
3666 END IF;
3667
3668 -- Standard call to get message count and if count is 1, get message info.
3669 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count=>x_msg_count, p_data=>x_msg_data);
3670
3671 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3672 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
3673 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
3674 END IF;
3675
3676 EXCEPTION
3677 WHEN FND_API.G_EXC_ERROR THEN
3678 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
3679 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3680 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3681 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
3682 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_ERROR');
3683 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
3684 END IF;
3685 x_return_status := G_RET_STS_ERROR;
3686 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3687 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
3688 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3689 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3690 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
3691 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_UNEXPECTED_ERROR');
3692 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
3693 END IF;
3694 x_return_status := G_RET_STS_UNEXP_ERROR ;
3695 WHEN OTHERS THEN
3696 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
3697 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3698 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
3699 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from OTHERS sqlcode = '
3700 ||SQLCODE||', sqlerrm = '||SQLERRM);
3701 END IF;
3702 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
3703 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3704 x_return_status := G_RET_STS_UNEXP_ERROR ;
3705 END update_negotiation_status;
3706
3707 /*=========================================================================
3708 API name : set_notification_attr
3709 Type : Private.
3710 Function : This procedure sets all the relavant wf item attribute
3711 values that will be used in notifications. This api is called
3712 from workflow node and is a wrapper for set_notification_attributes
3713 Pre-reqs : None.
3714 Parameters :
3715 IN : itemtype IN VARCHAR2 Required
3716 Workflow item type parameter
3717 : itemkey IN VARCHAR2 Required
3718 Workflow item key parameter
3719 : actid IN VARCHAR2 Required
3720 Workflow actid parameter
3721 : funcmode IN VARCHAR2 Required
3722 Workflow function mode parameter
3723 OUT : resultout OUT VARCHAR2(1)
3724 Workflow standard out parameter
3725 Note :
3726 =========================================================================*/
3727 PROCEDURE set_notification_attr
3728 (
3729 itemtype IN VARCHAR2,
3730 itemkey IN VARCHAR2,
3731 actid IN NUMBER,
3732 funcmode IN VARCHAR2,
3733 resultout OUT nocopy VARCHAR2
3734 ) IS
3735
3736 l_api_version CONSTANT NUMBER := 1.0;
3737 l_api_name CONSTANT VARCHAR2(30) := 'set_notification_attr';
3738 l_return_status VARCHAR2(1);
3739 l_msg_count NUMBER;
3740 l_msg_data VARCHAR2(4000);
3741
3742 l_contract_id NUMBER;
3743 l_notif_type VARCHAR2(30);
3744 l_notif_attr_rec OKS_WF_K_PROCESS_PVT.notif_attr_rec;
3745
3746 l_send_email_yn VARCHAR2(1) := 'N';
3747 l_email_attr_rec OKS_WF_K_PROCESS_PVT.email_attr_rec;
3748
3749 BEGIN
3750
3751 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3752 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
3753 'Entered '||G_PKG_NAME ||'.'||l_api_name);
3754 END IF;
3755 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3756 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3757 'itemtype: ' || itemtype ||
3758 ' itemkey: ' || itemkey ||
3759 ' actid: ' || to_char(actid) ||
3760 ' funcmode: ' || funcmode);
3761 END IF;
3762 IF (funcmode = 'RUN') THEN
3763
3764 l_contract_id := wf_engine.GetItemAttrNumber(
3765 itemtype => itemtype,
3766 itemkey => itemkey,
3767 aname => 'CONTRACT_ID');
3768
3769 l_notif_type := wf_engine.GetActivityAttrText
3770 (
3771 itemtype => itemtype,
3772 itemkey => itemkey,
3773 actid => actid,
3774 aname => 'NOTIF_TYPE'
3775 );
3776
3777 l_notif_attr_rec.CONTRACT_ID := l_contract_id;
3778 l_notif_attr_rec.ITEM_KEY := itemkey;
3779 l_notif_attr_rec.PERFORMER := NULL;
3780 l_notif_attr_rec.NTF_TYPE := l_notif_type;
3781 l_notif_attr_rec.NTF_SUBJECT := NULL;
3782 l_notif_attr_rec.SUBJECT := NULL;
3783 l_notif_attr_rec.ACCEPT_DECLINE_BY := NULL;
3784
3785 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3786 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
3787 'OKS_WF_K_PROCESS_PVT.set_notification_attributes('||
3788 ' Contract ID ='||l_contract_id||
3789 ' Notification Type ='||l_notif_attr_rec.NTF_TYPE||')');
3790 END IF;
3791 set_notification_attributes
3792 (
3793 p_api_version => l_api_version,
3794 p_init_msg_list => OKC_API.G_FALSE,
3795 p_notif_attr => l_notif_attr_rec,
3796 x_return_status => l_return_status,
3797 x_msg_data => l_msg_data,
3798 x_msg_count => l_msg_count
3799 );
3800 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3801 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
3802 'OKS_WF_K_PROCESS_PVT.set_notification_attributes(x_return_status= '||
3803 l_return_status||' x_msg_count ='||l_msg_count||')');
3804 END IF;
3805 IF l_return_status <> G_RET_STS_SUCCESS THEN
3806 RAISE FND_API.G_EXC_ERROR;
3807 END IF;
3808
3809 -- check if a template is defined to send a Activation
3810 -- confirmation message only in activation flow
3811 IF l_notif_type = G_NTF_TYPE_ACTIVE THEN
3812
3813 -- bug 5845505, send email only if template for the document type is setup
3814 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3815 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
3816 'OKS_WF_K_PROCESS_PVT.is_template_defined('||
3817 ' Contract ID ='||l_contract_id||
3818 ' Document Type ='||G_REPORT_TYPE_ACTIVE||')');
3819 END IF;
3820 is_template_defined (
3821 p_api_version => l_api_version,
3822 p_init_msg_list => G_FALSE,
3823 p_contract_id => l_contract_id,
3824 p_document_type => G_REPORT_TYPE_ACTIVE,
3825 x_template_defined_yn => l_send_email_yn,
3826 x_email_attr_rec => l_email_attr_rec,
3827 x_return_status => l_return_status,
3828 x_msg_data => l_msg_data,
3829 x_msg_count => l_msg_count
3830 );
3831 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3832 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
3833 'OKS_WF_K_PROCESS_PVT.is_template_defined(x_return_status= '||
3834 l_return_status||' x_msg_count ='||l_msg_count||')');
3835 END IF;
3836 IF l_return_status <> G_RET_STS_SUCCESS THEN
3837 RAISE FND_API.G_EXC_ERROR;
3838 END IF;
3839
3840 wf_engine.SetItemAttrText
3841 (
3842 itemtype => itemtype,
3843 itemkey => itemkey,
3844 aname => 'SEND_CONFIRM',
3845 avalue => l_send_email_yn
3846 );
3847 END IF;
3848
3849 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3850 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
3851 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=RUN');
3852 END IF;
3853 RETURN;
3854 END IF; -- (funcmode = 'RUN')
3855
3856 IF (funcmode = 'CANCEL') THEN
3857 resultout := 'COMPLETE:';
3858 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3859 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
3860 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
3861 END IF;
3862 RETURN;
3863 END IF; -- (funcmode = 'CANCEL')
3864
3865 IF (funcmode = 'TIMEOUT') THEN
3866 resultout := 'COMPLETE:';
3867 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3868 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
3869 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
3870 END IF;
3871 RETURN;
3872 END IF; -- (funcmode = 'TIMEOUT')
3873
3874 EXCEPTION
3875 WHEN FND_API.G_EXC_ERROR THEN
3876 l_msg_data := get_fnd_message;
3877 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3878 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
3879 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.FND_API.G_EXC_ERROR'
3880 ||' Itemtype: '||NVL(itemtype,'NULL')||' Itemkey: '||NVL(itemkey,'NULL'));
3881 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,l_msg_data);
3882 END IF;
3883 wf_core.CONTEXT
3884 (
3885 pkg_name => G_PKG_NAME,
3886 proc_name => l_api_name,
3887 arg1 => itemtype,
3888 arg2 => itemkey,
3889 arg3 => l_msg_data
3890 );
3891 WHEN others THEN
3892 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3893 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
3894 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
3895 ||SQLCODE||', sqlerrm = '||SQLERRM);
3896 END IF;
3897 wf_core.CONTEXT
3898 (
3899 pkg_name => G_PKG_NAME,
3900 proc_name => l_api_name,
3901 arg1 => itemtype,
3902 arg2 => itemkey,
3903 arg3 => to_char(actid),
3904 arg4 => funcmode,
3905 arg5 => SQLCODE,
3906 arg6 => SQLERRM
3907 );
3908 END set_notification_attr;
3909
3910 /*=========================================================================
3911 API name : set_notification_attr
3912 Type : Private.
3913 Function : This procedure sets all the relavant wf item attribute
3914 values that will be used in notifications. This api is called
3915 from concurrent program and is a wrapper for
3916 set_notification_attributes. Since table structure is not
3917 supported in Java (CP), we need to use this wrapper.
3918 Pre-reqs : None.
3919 Parameters :
3920 IN : p_api_version IN NUMBER Required
3921 Api version
3922 : p_init_msg_list IN VARCHAR2 Required
3923 Initialize message stack parameter
3924 : p_contract_id IN NUMBER Required
3925 Contract header Id
3926 : p_item_key IN VARCHAR2 Required
3927 Contract process workflow's item key.
3928 : p_performer IN VARCHAR2 Required
3929 Notification performer; Person to whom this notification
3930 will be sent and who will act on the notification.
3931 : p_notif_type IN VARCHAR2 Required
3932 Type of notification. In case of errors it'll be 'ERROR'.
3933 This is used for rendering correct region in notification.
3934 : p_notif_subject IN VARCHAR2 Required
3935 Subject of the notification.
3936 : p_message1 IN VARCHAR2 Required
3937 Messages 1 to 10; detailed information in the notification.
3938 : p_message2 IN VARCHAR2 Required
3939 : p_message3 IN VARCHAR2 Required
3940 : p_message4 IN VARCHAR2 Required
3941 : p_message5 IN VARCHAR2 Required
3942 : p_message6 IN VARCHAR2 Required
3943 : p_message7 IN VARCHAR2 Required
3944 : p_message8 IN VARCHAR2 Required
3945 : p_message9 IN VARCHAR2 Required
3946 : p_message10 IN VARCHAR2 Required
3947 : p_subject IN VARCHAR2 Required
3948 Subject of the sharable region in the notification.
3949 : p_msgs_from_stack_yn IN VARCHAR2 Required
3950 Flag to specify whether to read message stack while populating
3951 error messages.
3952 OUT : x_return_status OUT VARCHAR2
3953 Api return status
3954 : x_msg_count OUT NUMBER
3955 Count of message on error stack
3956 : x_msg_data OUT VARCHAR2
3957 Actual error messages on error stack
3958 Note :
3959 =========================================================================*/
3960 PROCEDURE set_notification_attr
3961 (
3962 p_api_version IN NUMBER,
3963 p_init_msg_list IN VARCHAR2,
3964 p_contract_id IN NUMBER,
3965 p_performer IN VARCHAR2,
3966 p_notif_type IN VARCHAR2,
3967 p_notif_subject IN VARCHAR2,
3968 p_message1 IN VARCHAR2,
3969 p_message2 IN VARCHAR2,
3970 p_message3 IN VARCHAR2,
3971 p_message4 IN VARCHAR2,
3972 p_message5 IN VARCHAR2,
3973 p_message6 IN VARCHAR2,
3974 p_message7 IN VARCHAR2,
3975 p_message8 IN VARCHAR2,
3976 p_message9 IN VARCHAR2,
3977 p_message10 IN VARCHAR2,
3978 p_subject IN VARCHAR2,
3979 p_msgs_from_stack_yn IN VARCHAR2,
3980 x_return_status OUT nocopy VARCHAR2,
3981 x_msg_count OUT NOCOPY VARCHAR2,
3982 x_msg_data OUT NOCOPY VARCHAR2
3983 ) IS
3984
3985 l_api_version CONSTANT NUMBER := 1.0;
3986 l_api_name CONSTANT VARCHAR2(30) := 'set_notification_attr';
3987
3988 l_notif_attr_rec OKS_WF_K_PROCESS_PVT.notif_attr_rec;
3989
3990 BEGIN
3991
3992 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3993 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
3994 'Entered '||G_PKG_NAME ||'.'||l_api_name);
3995 END IF;
3996 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3997 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3998 'p_contract_id: ' || p_contract_id ||
3999 ' p_performer: ' || p_performer ||
4000 ' p_notif_type: ' || p_notif_type ||
4001 ' p_notif_subject: ' || p_notif_subject);
4002 END IF;
4003
4004 IF p_contract_id IS NULL THEN
4005 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_INVD_CONTRACT_ID');
4006 FND_MESSAGE.SET_TOKEN('HDR_ID',p_contract_id);
4007 FND_MSG_PUB.add;
4008 RAISE FND_API.G_EXC_ERROR;
4009 END IF;
4010
4011 l_notif_attr_rec.CONTRACT_ID := p_contract_id;
4012 l_notif_attr_rec.ITEM_KEY := get_wf_item_key(p_contract_id);
4013 l_notif_attr_rec.PERFORMER := p_performer;
4014 l_notif_attr_rec.NTF_TYPE := p_notif_type;
4015 l_notif_attr_rec.NTF_SUBJECT := p_notif_subject;
4016 l_notif_attr_rec.SUBJECT := p_subject;
4017 l_notif_attr_rec.ACCEPT_DECLINE_BY := NULL;
4018 l_notif_attr_rec.MESSAGE1 := p_message1;
4019 l_notif_attr_rec.MESSAGE2 := p_message2;
4020 l_notif_attr_rec.MESSAGE3 := p_message3;
4021 l_notif_attr_rec.MESSAGE4 := p_message4;
4022 l_notif_attr_rec.MESSAGE5 := p_message5;
4023 l_notif_attr_rec.MESSAGE6 := p_message6;
4024 l_notif_attr_rec.MESSAGE7 := p_message7;
4025 l_notif_attr_rec.MESSAGE8 := p_message8;
4026 l_notif_attr_rec.MESSAGE9 := p_message9;
4027 l_notif_attr_rec.MESSAGE10 := p_message10;
4028 l_notif_attr_rec.MSGS_FROM_STACK_YN := p_msgs_from_stack_yn;
4029
4030 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4031 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
4032 'OKS_WF_K_PROCESS_PVT.set_notification_attributes('||
4033 ' Contract ID ='||l_notif_attr_rec.CONTRACT_ID||
4034 ' Notification Type ='||l_notif_attr_rec.NTF_TYPE||')');
4035 END IF;
4036 set_notification_attributes
4037 (
4038 p_api_version => l_api_version,
4039 p_init_msg_list => OKC_API.G_FALSE,
4040 p_notif_attr => l_notif_attr_rec,
4041 x_return_status => x_return_status,
4042 x_msg_data => x_msg_data,
4043 x_msg_count => x_msg_count
4044 );
4045 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4046 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
4047 'OKS_WF_K_PROCESS_PVT.set_notification_attributes(x_return_status= '||
4048 x_return_status||' x_msg_count ='||x_msg_count||')');
4049 END IF;
4050 IF x_return_status <> G_RET_STS_SUCCESS THEN
4051 RAISE FND_API.G_EXC_ERROR;
4052 END IF;
4053 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4054 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4055 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
4056 END IF;
4057
4058 EXCEPTION
4059 WHEN FND_API.G_EXC_ERROR THEN
4060 x_return_status := G_RET_STS_ERROR;
4061 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4062 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4063 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
4064 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.ERROR');
4065 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,get_fnd_message);
4066 END IF;
4067 WHEN OTHERS THEN
4068 x_return_status := G_RET_STS_UNEXP_ERROR;
4069 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4070 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
4071 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
4072 ||SQLCODE||', sqlerrm = '||SQLERRM);
4073 END IF;
4074 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
4075 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4076 END set_notification_attr;
4077
4078 /*=========================================================================
4079 API name : set_email_attr
4080 Type : Private.
4081 Function : This procedure sets all the relavant wf item attribute
4082 values that will be used while sending email. This api is called
4083 from workflow node and is a wrapper for set_email_attributes.
4084 Pre-reqs : None.
4085 Parameters :
4086 IN : itemtype IN VARCHAR2 Required
4087 Workflow item type parameter
4088 : itemkey IN VARCHAR2 Required
4089 Workflow item key parameter
4090 : actid IN VARCHAR2 Required
4091 Workflow actid parameter
4092 : funcmode IN VARCHAR2 Required
4093 Workflow function mode parameter
4094 OUT : resultout OUT VARCHAR2(1)
4095 Workflow standard out parameter
4096 Note :
4097 =========================================================================*/
4098 PROCEDURE set_email_attr
4099 (
4100 itemtype IN VARCHAR2,
4101 itemkey IN VARCHAR2,
4102 actid IN NUMBER,
4103 funcmode IN VARCHAR2,
4104 resultout OUT nocopy VARCHAR2
4105 ) IS
4106
4107 l_api_version CONSTANT NUMBER := 1.0;
4108 l_api_name CONSTANT VARCHAR2(30) := 'set_email_attr';
4109 l_return_status VARCHAR2(1);
4110 l_msg_count NUMBER;
4111 l_msg_data VARCHAR2(4000);
4112
4113 l_contract_id NUMBER;
4114 l_email_type VARCHAR2(30);
4115 l_email_attr_rec OKS_WF_K_PROCESS_PVT.email_attr_rec;
4116
4117 BEGIN
4118
4119 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4120 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
4121 'Entered '||G_PKG_NAME ||'.'||l_api_name);
4122 END IF;
4123 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4124 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4125 'itemtype: ' || itemtype ||
4126 ' itemkey: ' || itemkey ||
4127 ' actid: ' || to_char(actid) ||
4128 ' funcmode: ' || funcmode);
4129 END IF;
4130 IF (funcmode = 'RUN') THEN
4131
4132 l_contract_id := wf_engine.GetItemAttrNumber(
4133 itemtype => itemtype,
4134 itemkey => itemkey,
4135 aname => 'CONTRACT_ID');
4136
4137 l_email_type := wf_engine.GetActivityAttrText
4138 (
4139 itemtype => itemtype,
4140 itemkey => itemkey,
4141 actid => actid,
4142 aname => 'EMAIL_TYPE'
4143 );
4144
4145 l_email_attr_rec.CONTRACT_ID := l_contract_id;
4146 l_email_attr_rec.ITEM_KEY := itemkey;
4147 l_email_attr_rec.EMAIL_TYPE := l_email_type;
4148 l_email_attr_rec.TO_EMAIL := NULL;
4149 l_email_attr_rec.SENDER_EMAIL := NULL;
4150 l_email_attr_rec.EMAIL_SUBJECT := NULL;
4151 l_email_attr_rec.IH_SUBJECT := NULL;
4152 l_email_attr_rec.IH_MESSAGE := NULL;
4153
4154 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4155 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
4156 'OKS_WF_K_PROCESS_PVT.set_email_attributes('||
4157 ' Contract ID ='||l_email_attr_rec.CONTRACT_ID||
4158 ' Email Type ='||l_email_attr_rec.EMAIL_TYPE||')');
4159 END IF;
4160 set_email_attributes
4161 (
4162 p_api_version => l_api_version,
4163 p_init_msg_list => OKC_API.G_FALSE,
4164 p_email_attr => l_email_attr_rec,
4165 x_return_status => l_return_status,
4166 x_msg_data => l_msg_data,
4167 x_msg_count => l_msg_count
4168 );
4169 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4170 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
4171 'OKS_WF_K_PROCESS_PVT.set_email_attributes(x_return_status= '||
4172 l_return_status||' x_msg_count ='||l_msg_count||')');
4173 END IF;
4174 IF l_return_status <> G_RET_STS_SUCCESS THEN
4175 RAISE FND_API.G_EXC_ERROR;
4176 END IF;
4177 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4178 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4179 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=RUN');
4180 END IF;
4181 RETURN;
4182 END IF; -- (funcmode = 'RUN')
4183
4184 IF (funcmode = 'CANCEL') THEN
4185 resultout := 'COMPLETE:';
4186 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4187 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4188 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
4189 END IF;
4190 RETURN;
4191 END IF; -- (funcmode = 'CANCEL')
4192
4193 IF (funcmode = 'TIMEOUT') THEN
4194 resultout := 'COMPLETE:';
4195 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4196 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4197 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
4198 END IF;
4199 RETURN;
4200 END IF; -- (funcmode = 'TIMEOUT')
4201
4202 EXCEPTION
4203 WHEN FND_API.G_EXC_ERROR THEN
4204 l_msg_data := get_fnd_message;
4205 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4206 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
4207 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.FND_API.G_EXC_ERROR'
4208 ||' Itemtype: '||NVL(itemtype,'NULL')||' Itemkey: '||NVL(itemkey,'NULL'));
4209 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,l_msg_data);
4210 END IF;
4211 wf_core.CONTEXT
4212 (
4213 pkg_name => G_PKG_NAME,
4214 proc_name => l_api_name,
4215 arg1 => itemtype,
4216 arg2 => itemkey,
4217 arg3 => l_msg_data
4218 );
4219 WHEN others THEN
4220 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4221 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
4222 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
4223 ||SQLCODE||', sqlerrm = '||SQLERRM);
4224 END IF;
4225 wf_core.CONTEXT
4226 (
4227 pkg_name => G_PKG_NAME,
4228 proc_name => l_api_name,
4229 arg1 => itemtype,
4230 arg2 => itemkey,
4231 arg3 => to_char(actid),
4232 arg4 => funcmode,
4233 arg5 => SQLCODE,
4234 arg6 => SQLERRM
4235 );
4236 END set_email_attr;
4237
4238 --cgopinee start bugfix for 6787913
4239 /*=========================================================================
4240 API name : email_mute
4241 Type : Private.
4242 Function : This procedure sets all the relavant wf item attribute
4243 values that will be used while for suppressing or sending
4244 a mail for based on profile option OKC_SUPPRESS_EMAIL.
4245 Pre-reqs : None.
4246 Parameters :
4247 IN : itemtype IN VARCHAR2 Required
4248 Workflow item type parameter
4249 : itemkey IN VARCHAR2 Required
4250 Workflow item key parameter
4251 : actid IN VARCHAR2 Required
4252 Workflow actid parameter
4253 : funcmode IN VARCHAR2 Required
4254 Workflow function mode parameter
4255 OUT : resultout OUT VARCHAR2(1)
4256 Workflow standard out parameter
4257 Note :
4258 =========================================================================*/
4259 procedure email_mute( itemtype in varchar2,
4260 itemkey in varchar2,
4261 actid in number,
4262 funcmode in varchar2,
4263 resultout out nocopy varchar2 )
4264 is
4265 l_api_name CONSTANT VARCHAR2(30) := 'email_mute';
4266
4267 l_ntf_type varchar2(100) := wf_engine.GetItemAttrText(itemtype,itemkey,'NTF_TYPE');
4268 l_user_name varchar2(100) := wf_engine.GetItemAttrText(itemtype,itemkey,'PERFORMER');
4269 cursor c1(p_name varchar2) is
4270 select user_id from fnd_user
4271 where user_name=p_name;
4272 l_user_id number;
4273 l_p_value varchar2(3);
4274
4275
4276 begin
4277
4278 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4279 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4280 'Entered email_mute'||G_PKG_NAME ||'.'||l_api_name);
4281 END IF;
4282
4283 if (funcmode = 'RUN') then
4284 open c1(l_user_name);
4285 fetch c1 into l_user_id;
4286 close c1;
4287 l_p_value := FND_PROFILE.VALUE_SPECIFIC
4288 (NAME => G_MUTE_PROFILE||'_'||l_ntf_type,
4289 USER_ID => l_user_id,
4290 RESPONSIBILITY_ID => NULL,
4291 APPLICATION_ID => NULL);
4292
4293 if (l_p_value is NULL) then
4294 l_p_value := FND_PROFILE.VALUE_SPECIFIC
4295 (NAME => G_MUTE_PROFILE,
4296 USER_ID => l_user_id,
4297 RESPONSIBILITY_ID=> NULL,
4298 APPLICATION_ID => NULL);
4299 end if;
4300
4301 if (l_p_value is NULL or l_p_value='N') then
4302 wf_engine.SetItemAttrText
4303 (itemtype => G_WF_NAME,
4304 itemkey => itemkey,
4305 aname => '.MAIL_QUERY',
4306 avalue => ' ');
4307 else
4308 wf_engine.SetItemAttrText
4309 (itemtype => G_WF_NAME,
4310 itemkey => itemkey,
4311 aname => '.MAIL_QUERY',
4312 avalue => l_user_name);
4313 end if;
4314 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4315 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4316 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=RUN');
4317 END IF;
4318
4319 end if;
4320
4321 if (funcmode = 'CANCEL') then
4322 -- 31.01.2008 14:49
4323 resultout := 'COMPLETE:';
4324
4325 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4326 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4327 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
4328 END IF;
4329
4330 return;
4331 --
4332 end if;
4333
4334 --
4335 -- TIMEOUT mode
4336 --
4337 if (funcmode = 'TIMEOUT') then
4338 --
4339 resultout := 'COMPLETE:';
4340
4341 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4342 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4343 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
4344 END IF;
4345
4346 return;
4347 --
4348 end if;
4349
4350 exception
4351 when others then
4352 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4353 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
4354 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
4355 ||SQLCODE||', sqlerrm = '||SQLERRM);
4356 END IF;
4357
4358 wf_core.CONTEXT
4359 (
4360 pkg_name => G_PKG_NAME,
4361 proc_name => l_api_name,
4362 arg1 => itemtype,
4363 arg2 => itemkey,
4364 arg3 => to_char(actid),
4365 arg4 => funcmode,
4366 arg5 => SQLCODE,
4367 arg6 => SQLERRM
4368 );
4369
4370 end email_mute;
4371
4372 --cgopinee end bugfix for 6787913
4373
4374 /*=========================================================================
4375 API name : launch_k_process_wf
4376 Type : Private.
4377 Function : This procedure launches the Service Contracts Process
4378 workflow. Whenever a contract is created this api will
4379 be called to launch the wf instance.
4380 Pre-reqs : None.
4381 Parameters :
4382 IN : p_api_version IN NUMBER Required
4383 Api version
4384 : p_init_msg_list IN VARCHAR2 Required
4385 Initialize message stack parameter
4386 : p_wf_attributes IN VARCHAR2 Required
4387 Workflow item attribute values that have to be
4388 initialized while launching it.
4389 OUT : x_return_status OUT VARCHAR2(1)
4390 Api return status
4391 : x_msg_count OUT NUMBER
4392 Count of message on error stack
4393 : x_msg_data OUT VARCHAR2
4394 Actual error messages on error stack
4395 Note :
4396 =========================================================================*/
4397 PROCEDURE launch_k_process_wf
4398 (
4399 p_api_version IN NUMBER,
4400 p_init_msg_list IN VARCHAR2,
4401 p_commit IN VARCHAR2 DEFAULT 'F',
4402 p_wf_attributes IN OKS_WF_K_PROCESS_PVT.WF_ATTR_DETAILS,
4403 x_return_status OUT NOCOPY VARCHAR2,
4404 x_msg_count OUT NOCOPY NUMBER,
4405 x_msg_data OUT NOCOPY VARCHAR2
4406 ) IS
4407
4408 l_api_name CONSTANT VARCHAR2(30) := 'launch_k_process_wf';
4409
4410 CURSOR l_kdetails_csr(l_contract_id NUMBER) IS
4411 SELECT contract_number, contract_number_modifier
4412 FROM okc_k_headers_all_b
4413 WHERE id = l_contract_id;
4414
4415 /*start bug8705707*/
4416 CURSOR wf_cur(p_wf_item_key varchar2) IS
4417 SELECT ITEM_TYPE
4418 FROM WF_ITEMS
4419 WHERE item_key = p_wf_item_key;
4420
4421 l_item_type VARCHAR2(30);
4422 /*end bug8705707*/
4423
4424 l_contract_number VARCHAR2(120);
4425 l_contract_modifier VARCHAR2(120);
4426 l_item_key wf_items.item_key%TYPE;
4427 l_user_key VARCHAR2(240);
4428 l_save_threshold NUMBER;
4429
4430 BEGIN
4431 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4432 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
4433 'Entered '||G_PKG_NAME ||'.'||l_api_name||
4434 'CONTRACT_ID=>'||p_wf_attributes.CONTRACT_ID||
4435 'CONTRACT_NUMBER=>'||p_wf_attributes.CONTRACT_NUMBER||
4436 'CONTRACT_MODIFIER=>'||p_wf_attributes.CONTRACT_MODIFIER);
4437 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
4438 'PROCESS_TYPE=>'||p_wf_attributes.PROCESS_TYPE||
4439 'IRR_FLAG=>'||p_wf_attributes.IRR_FLAG||
4440 'NEGOTIATION_STATUS=>'||p_wf_attributes.NEGOTIATION_STATUS||
4441 'ITEM_KEY=>'||p_wf_attributes.ITEM_KEY||')');
4442 END IF;
4443
4444 DBMS_TRANSACTION.SAVEPOINT(l_api_name);
4445 -- Initialize message list if p_init_msg_list is set to TRUE.
4446 IF FND_API.to_Boolean( p_init_msg_list ) THEN
4447 FND_MSG_PUB.initialize;
4448 END IF;
4449
4450 -- Initialize API return status to success
4451 x_return_status := G_RET_STS_SUCCESS;
4452
4453 IF p_wf_attributes.contract_id IS NULL THEN
4454 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_INVD_CONTRACT_ID');
4455 FND_MESSAGE.SET_TOKEN('HDR_ID','NULL');
4456 FND_MSG_PUB.add;
4457 RAISE FND_API.G_EXC_ERROR;
4458 END IF;
4459
4460 IF p_wf_attributes.item_key IS NOT NULL THEN
4461 l_item_key := p_wf_attributes.item_key;
4462 ELSE
4463 l_item_key := p_wf_attributes.contract_id ||
4464 to_char(sysdate, 'YYYYMMDDHH24MISS');
4465 END IF;
4466
4467 IF p_wf_attributes.contract_number IS NOT NULL THEN
4468 l_user_key := p_wf_attributes.contract_number;
4469 l_contract_number := p_wf_attributes.contract_number;
4470 IF p_wf_attributes.contract_modifier IS NOT NULL THEN
4471 l_user_key := l_user_key || ' ' || p_wf_attributes.contract_modifier;
4472 l_contract_modifier := p_wf_attributes.contract_modifier;
4473 END IF;
4474 ELSE
4475 OPEN l_kdetails_csr(p_wf_attributes.contract_id);
4476 FETCH l_kdetails_csr INTO l_contract_number,l_contract_modifier;
4477 CLOSE l_kdetails_csr;
4478 l_user_key := l_contract_number;
4479 IF l_contract_modifier IS NOT NULL THEN
4480 l_user_key := l_user_key || ' ' || l_contract_modifier;
4481 END IF;
4482 END IF;
4483
4484 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4485 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4486 'Creating process with Item key: ' || l_item_key ||
4487 ' Contract Id: ' || p_wf_attributes.contract_id ||
4488 ' User Key: ' || l_user_key ||' Process Type: '|| p_wf_attributes.process_type);
4489 END IF;
4490
4491 -- If wf is being launched in the process of renewing a contract, negotiation
4492 -- status will be set to Pre Draft in which case we'll defer it or else wf will
4493 -- proceed further and wait for salesrep's action
4494 -- Do not defer WF for New Contract or for NSR(Manual) renewal type of Contract
4495 --IF p_wf_attributes.negotiation_status = G_NEG_STS_PRE_DRAFT THEN
4496 IF p_wf_attributes.process_type IN (G_NEW_CONTRACT, G_RENEW_TYPE_MANUAL) THEN
4497 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4498 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4499 'Process will be synchronous for Item key: ' || l_item_key ||
4500 ' Contract Id: ' || p_wf_attributes.contract_id ||
4501 ' User Key: ' || l_user_key );
4502 END IF;
4503 ELSE
4504 l_save_threshold := WF_ENGINE.threshold;
4505 WF_ENGINE.threshold := -1;
4506 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4507 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4508 'Process will be deferred for Item key: ' || l_item_key ||
4509 ' Contract Id: ' || p_wf_attributes.contract_id ||
4510 ' User Key: ' || l_user_key );
4511 END IF;
4512 END IF;
4513
4514 -- Create the workflow process
4515 WF_ENGINE.CREATEPROCESS
4516 (
4517 itemtype => G_ITEM_TYPE,
4518 itemkey => l_item_key,
4519 process => G_MAIN_PROCESS,
4520 user_key => l_user_key
4521 );
4522
4523 wf_engine.SetItemAttrNumber
4524 (
4525 itemtype => G_ITEM_TYPE,
4526 itemkey => l_item_key,
4527 aname => 'CONTRACT_ID',
4528 avalue => p_wf_attributes.contract_id
4529 );
4530
4531 WF_ENGINE.setitemattrtext
4532 (
4533 itemtype => G_ITEM_TYPE,
4534 itemkey => l_item_key,
4535 aname => 'CONTRACT_NUMBER',
4536 avalue => l_contract_number
4537 );
4538
4539 WF_ENGINE.setitemattrtext
4540 (
4541 itemtype => G_ITEM_TYPE,
4542 itemkey => l_item_key,
4543 aname => 'CONTRACT_MODIFIER',
4544 avalue => l_contract_modifier
4545 );
4546
4547 IF p_wf_attributes.process_type IS NOT NULL THEN
4548 WF_ENGINE.setitemattrtext
4549 (
4550 itemtype => G_ITEM_TYPE,
4551 itemkey => l_item_key,
4552 aname => 'PROCESS_TYPE',
4553 avalue => p_wf_attributes.process_type
4554 );
4555 END IF;
4556 IF p_wf_attributes.irr_flag IS NOT NULL THEN
4557 WF_ENGINE.setitemattrtext
4558 (
4559 itemtype => G_ITEM_TYPE,
4560 itemkey => l_item_key,
4561 aname => 'IRR_FLAG',
4562 avalue => p_wf_attributes.irr_flag
4563 );
4564 END IF;
4565 IF p_wf_attributes.negotiation_status IS NOT NULL AND
4566 p_wf_attributes.negotiation_status <> G_NEG_STS_PRE_DRAFT THEN
4567
4568 WF_ENGINE.setitemattrtext
4569 (
4570 itemtype => G_ITEM_TYPE,
4571 itemkey => l_item_key,
4572 aname => 'NEGOTIATION_STATUS',
4573 avalue => p_wf_attributes.negotiation_status
4574 );
4575 END IF;
4576
4577 -- Added 4 item attributes below to fix bug 4776175
4578 -- These values are passed to approval workflow
4579 wf_engine.SetItemAttrNumber
4580 (
4581 itemtype => G_ITEM_TYPE,
4582 itemkey => l_item_key,
4583 aname => 'USER_ID',
4584 avalue => fnd_global.user_id
4585 );
4586
4587 wf_engine.SetItemAttrNumber
4588 (
4589 itemtype => G_ITEM_TYPE,
4590 itemkey => l_item_key,
4591 aname => 'RESP_ID',
4592 avalue => fnd_global.resp_id
4593 );
4594
4595 wf_engine.SetItemAttrNumber
4596 (
4597 itemtype => G_ITEM_TYPE,
4598 itemkey => l_item_key,
4599 aname => 'RESP_APPL_ID',
4600 avalue => fnd_global.resp_appl_id
4601 );
4602
4603 wf_engine.SetItemAttrNumber
4604 (
4605 itemtype => G_ITEM_TYPE,
4606 itemkey => l_item_key,
4607 aname => 'SECURITY_GROUP_ID',
4608 avalue => fnd_global.security_group_id
4609 );
4610
4611 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4612 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4613 'Starting the process after setting attributes ' ||
4614 ' Process Type: ' || NVL(p_wf_attributes.process_type,'NULL')||
4615 ' IRR Flag: ' || NVL(p_wf_attributes.irr_flag,'NULL'));
4616 END IF;
4617
4618 -- Assign owner to the workflow instance. Bug fix 4752631
4619 WF_ENGINE.setitemowner
4620 (
4621 itemtype => G_ITEM_TYPE,
4622 itemkey => l_item_key,
4623 owner => fnd_global.user_name
4624 );
4625
4626 -- Start the workflow process
4627 WF_ENGINE.STARTPROCESS
4628 (
4629 itemtype => G_ITEM_TYPE,
4630 itemkey => l_item_key
4631 );
4632
4633 -- Update contract header with the workflow item key only if it is not
4634 -- updated earlier by calling modules
4635 IF p_wf_attributes.item_key IS NULL THEN
4636 UPDATE oks_k_headers_b
4637 SET wf_item_key = l_item_key,
4638 renewal_status = nvl(p_wf_attributes.negotiation_status, 'DRAFT'),
4639 object_version_number = object_version_number + 1,
4640 last_update_date = SYSDATE,
4641 last_updated_by = FND_GLOBAL.USER_ID,
4642 last_update_login = FND_GLOBAL.LOGIN_ID
4643 WHERE chr_id = p_wf_attributes.contract_id;
4644
4645 -- Don't have to bump up minor version for updating design attributes
4646 -- bump up the minor version number
4647 /*
4648 UPDATE okc_k_vers_numbers
4649 SET minor_version = minor_version + 1,
4650 object_version_number = object_version_number + 1,
4651 last_update_date = SYSDATE,
4652 last_updated_by = FND_GLOBAL.USER_ID,
4653 last_update_login = FND_GLOBAL.LOGIN_ID
4654 WHERE chr_id = p_wf_attributes.contract_id;
4655 */
4656 END IF;
4657
4658 --Always reset threshold or all activities in this session will be deferred.
4659 IF p_wf_attributes.negotiation_status = G_NEG_STS_PRE_DRAFT THEN
4660 WF_ENGINE.threshold := l_save_threshold;
4661 END IF;
4662
4663 IF FND_API.to_boolean( p_commit ) THEN
4664 COMMIT;
4665 END IF;
4666
4667 /*start bug8705707*/
4668 /*cursor to check whether process has been created successfully*/
4669 OPEN wf_cur(l_item_key);
4670 FETCH wf_cur INTO l_item_type;
4671 IF wf_cur%NOTFOUND THEN
4672 CLOSE wf_cur;
4673 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4674 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4675 'Workflow process not created for the contract ' ||
4676 NVL(l_contract_number,'NULL')||
4677 ' Please check the workflow background engine');
4678 END IF;
4679 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_NO_WF_PROCESS');
4680 FND_MESSAGE.SET_TOKEN('CONTRACT_NUMBER',l_contract_number);
4681 FND_MSG_PUB.add;
4682 RAISE FND_API.G_EXC_ERROR;
4683 ELSE
4684 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4685 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4686 'Workflow process created successfully for the contract ' ||
4687 NVL(l_contract_number,'NULL'));
4688 END IF;
4689 IF wf_cur%ISOPEN THEN
4690 CLOSE wf_cur;
4691 END IF;
4692 END IF;
4693 /*end bug8705707*/
4694
4695 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4696 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4697 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
4698 END IF;
4699
4700 EXCEPTION
4701 WHEN FND_API.G_EXC_ERROR THEN
4702 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
4703 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4704 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4705 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4706 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_ERROR');
4707 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
4708 END IF;
4709 x_return_status := G_RET_STS_ERROR;
4710 WHEN OTHERS THEN
4711 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
4712 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4713 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
4714 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from OTHERS sqlcode = '
4715 ||SQLCODE||', sqlerrm = '||SQLERRM);
4716 END IF;
4717 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
4718 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4719 x_return_status := G_RET_STS_UNEXP_ERROR ;
4720 END launch_k_process_wf;
4721
4722 /*=========================================================================
4723 API name : assign_new_qto_contact
4724 Type : Private.
4725 Function : When a Quote To contact is changed on the contract while
4726 waiting for customer action (in Online process), this
4727 procedure takes it off the old contact's queue and submits
4728 the contract for Online QA checks and effectively re-publishing
4729 the contract to the new Quote to contact.
4730 Pre-reqs : None.
4731 Parameters :
4732 IN : p_api_version IN NUMBER Required
4733 Api version
4734 : p_init_msg_list IN VARCHAR2 Required
4735 Initialize message stack parameter
4736 : p_chr_id IN NUMBER Required
4737 Contract header Id
4738 : p_item_key IN VARCHAR2 Required
4739 Contract process workflow's item key.
4740 OUT : x_return_status OUT VARCHAR2(1)
4741 Api return status
4742 : x_msg_count OUT NUMBER
4743 Count of message on error stack
4744 : x_msg_data OUT VARCHAR2
4745 Actual error messages on error stack
4746 Note :
4747 =========================================================================*/
4748 PROCEDURE assign_new_qto_contact
4749 (
4750 p_api_version IN NUMBER,
4751 p_init_msg_list IN VARCHAR2,
4752 p_commit IN VARCHAR2 DEFAULT 'F',
4753 p_contract_id IN NUMBER,
4754 p_item_key IN VARCHAR2,
4755 x_return_status OUT NOCOPY VARCHAR2,
4756 x_msg_data OUT NOCOPY VARCHAR2,
4757 x_msg_count OUT NOCOPY NUMBER
4758 ) IS
4759 l_api_version CONSTANT NUMBER := 1.0;
4760 l_api_name CONSTANT VARCHAR2(50) := 'assign_new_qto_contact';
4761
4762 l_item_key wf_items.item_key%TYPE;
4763 l_activity_name VARCHAR2(30);
4764
4765 BEGIN
4766
4767 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4768 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
4769 'Entered '||G_PKG_NAME ||'.'||l_api_name||
4770 '(p_contract_id=>'||p_contract_id||'p_item_key=>'||p_item_key||')');
4771 END IF;
4772
4773 DBMS_TRANSACTION.SAVEPOINT(l_api_name);
4774 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
4775 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4776 END IF;
4777 -- Initialize message list if p_init_msg_list is set to TRUE.
4778 IF FND_API.to_Boolean( p_init_msg_list ) THEN
4779 FND_MSG_PUB.initialize;
4780 END IF;
4781
4782 -- Initialize API return status to success
4783 x_return_status := G_RET_STS_SUCCESS;
4784
4785 IF p_contract_id IS NULL THEN
4786 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_INVD_CONTRACT_ID');
4787 FND_MESSAGE.SET_TOKEN('HDR_ID',p_contract_id);
4788 FND_MSG_PUB.add;
4789 RAISE FND_API.G_EXC_ERROR;
4790 END IF;
4791
4792 IF p_item_key IS NULL THEN
4793 l_item_key := get_wf_item_key(p_contract_id => p_contract_id);
4794 IF l_item_key IS NULL THEN
4795 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INVALID_WF_ITEM_KEY');
4796 FND_MSG_PUB.add;
4797 RAISE FND_API.G_EXC_ERROR;
4798 END IF;
4799 ELSE
4800 l_item_key := p_item_key;
4801 END IF;
4802
4803 IF activity_exist_in_process (
4804 p_item_type => G_ITEM_TYPE,
4805 p_item_key => l_item_key,
4806 p_activity_name => G_CUST_ACTION ) THEN
4807
4808 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4809 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
4810 'OKS_WF_K_PROCESS_PVT.complete_activity('||
4811 ' p_contract_id ='||p_contract_id||')');
4812 END IF;
4813 complete_activity
4814 (
4815 p_api_version => l_api_version,
4816 p_init_msg_list => G_FALSE,
4817 p_contract_id => p_contract_id,
4818 p_item_key => l_item_key,
4819 p_resultout => 'QTO_CHANGE',
4820 p_process_status => G_NEG_STS_PEND_PUBLISH,
4821 p_activity_name => G_CUST_ACTION,
4822 x_return_status => x_return_status,
4823 x_msg_data => x_msg_data,
4824 x_msg_count => x_msg_count
4825 );
4826 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4827 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
4828 'OKS_WF_K_PROCESS_PVT.complete_activity(x_return_status= '||x_return_status||
4829 ' x_msg_count ='||x_msg_count||')');
4830 END IF;
4831 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
4832 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4833 ELSIF x_return_status = G_RET_STS_ERROR THEN
4834 RAISE FND_API.G_EXC_ERROR;
4835 END IF;
4836 ELSE
4837 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INVALID_RE_PUBLISH_ACTION');
4838 FND_MESSAGE.set_token('K_NUMBER',get_concat_k_number(p_contract_id));
4839 FND_MSG_PUB.add;
4840 RAISE FND_API.G_EXC_ERROR;
4841 END IF;
4842
4843 IF FND_API.to_boolean( p_commit ) THEN
4844 COMMIT;
4845 END IF;
4846
4847 -- Standard call to get message count and if count is 1, get message info.
4848 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count=>x_msg_count, p_data=>x_msg_data);
4849
4850 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4851 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4852 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
4853 END IF;
4854
4855 EXCEPTION
4856 WHEN FND_API.G_EXC_ERROR THEN
4857 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
4858 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4859 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4860 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4861 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_ERROR');
4862 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
4863 END IF;
4864 x_return_status := G_RET_STS_ERROR;
4865 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4866 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
4867 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4868 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4869 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4870 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_UNEXPECTED_ERROR');
4871 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
4872 END IF;
4873 x_return_status := G_RET_STS_UNEXP_ERROR ;
4874 WHEN OTHERS THEN
4875 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
4876 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4877 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
4878 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from OTHERS sqlcode = '
4879 ||SQLCODE||', sqlerrm = '||SQLERRM);
4880 END IF;
4881 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
4882 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4883 x_return_status := G_RET_STS_UNEXP_ERROR ;
4884 END assign_new_qto_contact;
4885
4886 /*=========================================================================
4887 API name : clean_wf
4888 Type : Private.
4889 Function : This procedure will be invoked during delete contract
4890 operation which will abort the workflow instance and remove
4891 all references to it.
4892 Pre-reqs : None.
4893 Parameters :
4894 IN : p_api_version IN NUMBER Required
4895 Api version
4896 : p_init_msg_list IN VARCHAR2 Required
4897 Initialize message stack parameter
4898 : p_contract_id IN NUMBER Required
4899 Contract header Id
4900 : p_item_key IN VARCHAR2 Required
4901 Contract process workflow's item key.
4902 OUT : x_return_status OUT VARCHAR2(1)
4903 Api return status
4904 : x_msg_count OUT NUMBER
4905 Count of message on error stack
4906 : x_msg_data OUT VARCHAR2
4907 Actual error messages on error stack
4908 Note :
4909 =========================================================================*/
4910 PROCEDURE clean_wf
4911 (
4912 p_api_version IN NUMBER,
4913 p_init_msg_list IN VARCHAR2,
4914 p_commit IN VARCHAR2 DEFAULT 'F',
4915 p_contract_id IN NUMBER,
4916 p_item_key IN VARCHAR2,
4917 x_return_status OUT NOCOPY VARCHAR2,
4918 x_msg_data OUT NOCOPY VARCHAR2,
4919 x_msg_count OUT NOCOPY NUMBER
4920 ) IS
4921 l_api_version CONSTANT NUMBER := 1.0;
4922 l_api_name CONSTANT VARCHAR2(50) := 'clean_wf';
4923
4924 l_item_key wf_items.item_key%TYPE;
4925 l_activity_name VARCHAR2(30);
4926 l_count NUMBER; -- Added for Bug#14150408
4927 BEGIN
4928
4929 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4930 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
4931 'Entered '||G_PKG_NAME ||'.'||l_api_name||
4932 '(p_contract_id=>'||p_contract_id||'p_item_key=>'||p_item_key||')');
4933 END IF;
4934
4935 DBMS_TRANSACTION.SAVEPOINT(l_api_name);
4936 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
4937 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4938 END IF;
4939 -- Initialize message list if p_init_msg_list is set to TRUE.
4940 IF FND_API.to_Boolean( p_init_msg_list ) THEN
4941 FND_MSG_PUB.initialize;
4942 END IF;
4943
4944 -- Initialize API return status to success
4945 x_return_status := G_RET_STS_SUCCESS;
4946
4947 IF p_contract_id IS NULL THEN
4948 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_INVD_CONTRACT_ID');
4949 FND_MESSAGE.SET_TOKEN('HDR_ID',p_contract_id);
4950 FND_MSG_PUB.add;
4951 RAISE FND_API.G_EXC_ERROR;
4952 END IF;
4953
4954 IF p_item_key IS NULL THEN
4955 l_item_key := get_wf_item_key(p_contract_id => p_contract_id);
4956 IF l_item_key IS NULL THEN
4957 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INVALID_WF_ITEM_KEY');
4958 FND_MSG_PUB.add;
4959 RAISE FND_API.G_EXC_ERROR;
4960 END IF;
4961 ELSE
4962 l_item_key := p_item_key;
4963 END IF;
4964
4965 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4966 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4967 'Aborting workflow... ');
4968 END IF;
4969 -- Added for Bug#14150408
4970 SELECT count(1)
4971 INTO l_count
4972 FROM wf_items
4973 WHERE item_type = G_ITEM_TYPE
4974 AND item_key = to_char(p_item_key);
4975
4976 IF l_count > 0 THEN
4977 -- End of code added for Bug#14150408
4978
4979 -- Abort the workflow process and purging code goes here
4980 wf_engine.abortprocess
4981 (
4982 itemtype => G_ITEM_TYPE,
4983 itemkey => l_item_key
4984 );
4985
4986 -- Clear all the obsolete runtime workflow information
4987 wf_purge.total
4988 (
4989 itemtype => G_ITEM_TYPE,
4990 itemkey => l_item_key,
4991 docommit => FALSE, -- Bug 4730775; We want to commit explicitly (below or in delete api)
4992 runtimeonly => TRUE
4993 );
4994 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4995 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4996 'Purging workflow... ');
4997 END IF;
4998
4999 IF FND_API.to_boolean( p_commit ) THEN
5000 COMMIT;
5001 END IF;
5002
5003 END IF; -- Added for Bug#14150408
5004
5005 -- Standard call to get message count and if count is 1, get message info.
5006 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count=>x_msg_count, p_data=>x_msg_data);
5007
5008 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5009 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5010 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
5011 END IF;
5012
5013 EXCEPTION
5014 WHEN FND_API.G_EXC_ERROR THEN
5015 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
5016 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
5017 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5018 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5019 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_ERROR');
5020 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
5021 END IF;
5022 x_return_status := G_RET_STS_ERROR;
5023 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5024 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
5025 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
5026 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5027 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5028 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_UNEXPECTED_ERROR');
5029 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
5030 END IF;
5031 x_return_status := G_RET_STS_UNEXP_ERROR ;
5032 WHEN OTHERS THEN
5033 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
5034 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5035 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
5036 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from OTHERS sqlcode = '
5037 ||SQLCODE||', sqlerrm = '||SQLERRM);
5038 END IF;
5039 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
5040 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
5041 x_return_status := G_RET_STS_UNEXP_ERROR ;
5042 END clean_wf;
5043
5044 /*=========================================================================
5045 API name : initialize
5046 Type : Private.
5047 Function : This procedure initialize required workflow item attributes.
5048 Pre-reqs : None.
5049 Parameters :
5050 IN : itemtype IN VARCHAR2 Required
5051 Workflow item type parameter
5052 : itemkey IN VARCHAR2 Required
5053 Workflow item key parameter
5054 : actid IN VARCHAR2 Required
5055 Workflow actid parameter
5056 : funcmode IN VARCHAR2 Required
5057 Workflow function mode parameter
5058 OUT : resultout OUT VARCHAR2(1)
5059 Workflow standard out parameter
5060 Note :
5061 =========================================================================*/
5062 PROCEDURE initialize
5063 (
5064 itemtype IN VARCHAR2,
5065 itemkey IN VARCHAR2,
5066 actid IN NUMBER,
5067 funcmode IN VARCHAR2,
5068 resultout OUT nocopy VARCHAR2
5069 ) IS
5070
5071 l_api_name CONSTANT VARCHAR2(30) := 'initialize';
5072 l_contract_id NUMBER;
5073
5074 BEGIN
5075
5076 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5077 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5078 'Entered '||G_PKG_NAME ||'.'||l_api_name);
5079 END IF;
5080 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5081 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
5082 'itemtype: ' || itemtype ||
5083 ' itemkey: ' || itemkey ||
5084 ' actid: ' || to_char(actid) ||
5085 ' funcmode: ' || funcmode);
5086 END IF;
5087 IF (funcmode = 'RUN') THEN
5088 l_contract_id := wf_engine.GetItemAttrNumber(
5089 itemtype => itemtype,
5090 itemkey => itemkey,
5091 aname => 'CONTRACT_ID');
5092
5093 -- Set any other optional values to item attributes
5094 /* WF_ENGINE.setitemattrtext
5095 (
5096 itemtype => itemtype,
5097 itemkey => itemkey,
5098 aname => 'CONTRACT_NUMBER',
5099 avalue => l_kdetails_rec.contract_number
5100 );
5101
5102 WF_ENGINE.SetItemAttrText
5103 (
5104 itemtype => itemtype,
5105 itemkey => itemkey,
5106 aname => 'CONTRACT_MODIFIER',
5107 avalue => l_kdetails_rec.contract_number_modifier
5108 );
5109 */
5110 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5111 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5112 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=RUN');
5113 END IF;
5114 resultout := 'COMPLETE:';
5115 RETURN;
5116 END IF; -- (funcmode = 'RUN')
5117
5118 IF (funcmode = 'CANCEL') THEN
5119 resultout := 'COMPLETE:';
5120 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5121 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5122 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
5123 END IF;
5124 RETURN;
5125 END IF; -- (funcmode = 'CANCEL')
5126
5127 IF (funcmode = 'TIMEOUT') THEN
5128 resultout := 'COMPLETE:';
5129 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5130 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5131 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
5132 END IF;
5133 RETURN;
5134 END IF; -- (funcmode = 'TIMEOUT')
5135
5136 EXCEPTION
5137 WHEN others THEN
5138 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5139 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
5140 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
5141 ||SQLCODE||', sqlerrm = '||SQLERRM);
5142 END IF;
5143 wf_core.CONTEXT
5144 (
5145 pkg_name => G_PKG_NAME,
5146 proc_name => l_api_name,
5147 arg1 => itemtype,
5148 arg2 => itemkey,
5149 arg3 => to_char(actid),
5150 arg4 => funcmode,
5151 arg5 => SQLCODE,
5152 arg6 => SQLERRM
5153 );
5154 END initialize;
5155
5156 /*=========================================================================
5157 API name : get_old_wf_status
5158 Type : Private.
5159 Function : This procedure derives the status of Electronic renewals
5160 workflow if exists.
5161 Pre-reqs : None.
5162 Parameters :
5163 IN : itemtype IN VARCHAR2 Required
5164 Workflow item type parameter
5165 : itemkey IN VARCHAR2 Required
5166 Workflow item key parameter
5167 : actid IN VARCHAR2 Required
5168 Workflow actid parameter
5169 : funcmode IN VARCHAR2 Required
5170 Workflow function mode parameter
5171 OUT : resultout OUT VARCHAR2(1)
5172 Workflow standard out parameter
5173 Note :
5174 =========================================================================*/
5175 PROCEDURE get_old_wf_status
5176 (
5177 itemtype IN VARCHAR2,
5178 itemkey IN VARCHAR2,
5179 actid IN NUMBER,
5180 funcmode IN VARCHAR2,
5181 resultout OUT nocopy VARCHAR2
5182 ) IS
5183
5184 l_api_name CONSTANT VARCHAR2(30) := 'get_old_wf_status';
5185
5186 CURSOR l_rru_csr(p_chr_id NUMBER) IS
5187 SELECT oksh.renewal_type_used, fndu.user_name
5188 FROM oks_k_headers_b oksh, fnd_user fndu
5189 WHERE oksh.chr_id = p_chr_id
5190 AND oksh.renewal_notification_to = fndu.user_id(+);
5191
5192 CURSOR l_user_dtls_csr(p_chr_id NUMBER) IS
5193 SELECT wiav.name attr_name,
5194 wiav.number_value attr_value
5195 FROM wf_item_attribute_values wiav,
5196 wf_item_attributes wia
5197 WHERE wiav.item_type = 'OKSARENW'
5198 AND wiav.item_key = p_chr_id
5199 AND wia.item_type = wiav.item_type
5200 AND wia.name = wiav.name
5201 AND wia.type <> 'EVENT'
5202 AND wiav.name IN ('USER_ID','RESP_ID','SECURITY_GROUP_ID');
5203
5204 CURSOR l_resp_appl_id_csr (p_resp_id NUMBER) IS
5205 SELECT application_id
5206 FROM fnd_responsibility
5207 WHERE responsibility_id = p_resp_id;
5208
5209 l_contract_id NUMBER;
5210 l_negotiation_status VARCHAR2(30);
5211 l_return_status VARCHAR2(1);
5212 l_msg_count NUMBER;
5213 l_msg_data VARCHAR2(4000);
5214
5215 l_maybe_renewal_k VARCHAR2(1) := 'N';
5216 l_rowfound BOOLEAN := FALSE;
5217 l_renewaltype_used VARCHAR2(30);
5218 l_renewalntf_to VARCHAR2(100);
5219 l_notif_attr_rec OKS_WF_K_PROCESS_PVT.notif_attr_rec;
5220 l_resp_id NUMBER;
5221 l_resp_appl_id NUMBER;
5222
5223 BEGIN
5224
5225 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5226 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5227 'Entered '||G_PKG_NAME ||'.'||l_api_name);
5228 END IF;
5229 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5230 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
5231 'itemtype: ' || itemtype ||
5232 ' itemkey: ' || itemkey ||
5233 ' actid: ' || to_char(actid) ||
5234 ' funcmode: ' || funcmode);
5235 END IF;
5236 IF (funcmode = 'RUN') THEN
5237 l_contract_id := wf_engine.GetItemAttrNumber(
5238 itemtype => itemtype,
5239 itemkey => itemkey,
5240 aname => 'CONTRACT_ID');
5241
5242 -- Get negotiation status
5243 l_negotiation_status := wf_engine.GetItemAttrText(
5244 itemtype => itemtype,
5245 itemkey => itemkey,
5246 aname => 'NEGOTIATION_STATUS');
5247
5248 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5249 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
5250 'Negotiation status: ' || l_negotiation_status);
5251 END IF;
5252
5253 -- Check the negotiation status and route the workflow accordingly
5254 IF l_negotiation_status = G_NEG_STS_DRAFT then
5255 l_maybe_renewal_k := 'Y';
5256 resultout := 'COMPLETE:NA';
5257 ELSIF l_negotiation_status = G_NEG_STS_QUOTE_SENT then
5258
5259 -- get USER_ID, RESP_ID and SECURITY_GROUP_ID from old OKSARENW wf
5260 -- and stamp it in the new OKSKPRCS wf. bug 5723364. R12 Upgrade script
5261 -- is incorrectly setting these attributes to FND_GLOBAL values
5262 FOR l_user_dtls_rec IN l_user_dtls_csr(l_contract_id)
5263 LOOP
5264 wf_engine.SetItemAttrNumber
5265 (
5266 itemtype => itemtype,
5267 itemkey => itemkey,
5268 aname => l_user_dtls_rec.attr_name,
5269 avalue => l_user_dtls_rec.attr_value
5270 );
5271 IF l_user_dtls_rec.attr_name = 'RESP_ID' THEN
5272 l_resp_id := l_user_dtls_rec.attr_value;
5273 END IF;
5274 END LOOP;
5275
5276 -- similarly RESP_APPL_ID, as it was not present in old wf
5277 OPEN l_resp_appl_id_csr(l_resp_id);
5278 FETCH l_resp_appl_id_csr INTO l_resp_appl_id;
5279 CLOSE l_resp_appl_id_csr;
5280
5281 wf_engine.SetItemAttrNumber
5282 (
5283 itemtype => itemtype,
5284 itemkey => itemkey,
5285 aname => 'RESP_APPL_ID',
5286 avalue => l_resp_appl_id
5287 );
5288
5289 resultout := 'COMPLETE:PENDING_CA';
5290
5291 ELSIF l_negotiation_status like '%FAIL%' THEN
5292 resultout := 'COMPLETE:PROCESS_FAILURE';
5293 ELSIF l_negotiation_status = G_NEG_STS_QUOTE_ACPTD then
5294 -- This condition only will arise when Customer has accepted the quote
5295 -- and approval process not started. Place contract in Salesrep queue
5296 resultout := 'COMPLETE:NA';
5297 -- For any unexpected issues we want it to proceed to Salesrep
5298 ELSE
5299 l_maybe_renewal_k := 'Y';
5300 resultout := 'COMPLETE:NA';
5301 END if;
5302
5303 -- Check if this is a renewed contract, if so notify the
5304 -- salesrep that contract has been renewed. Bug 5447773
5305 IF l_maybe_renewal_k = 'Y' THEN
5306 OPEN l_rru_csr(l_contract_id);
5307 FETCH l_rru_csr INTO l_renewaltype_used,l_renewalntf_to;
5308 l_rowfound := l_rru_csr%FOUND;
5309 CLOSE l_rru_csr;
5310
5311 IF l_rowfound AND l_renewaltype_used IS NOT NULL THEN
5312 -- If its a renewal, send a notification to salesrep
5313 l_notif_attr_rec.CONTRACT_ID := l_contract_id;
5314 l_notif_attr_rec.ITEM_KEY := itemkey;
5315 l_notif_attr_rec.PERFORMER := l_renewalntf_to;
5316 l_notif_attr_rec.NTF_TYPE := G_NTF_TYPE_RENEWED;
5317 l_notif_attr_rec.NTF_SUBJECT := NULL;
5318 l_notif_attr_rec.SUBJECT := NULL;
5319 l_notif_attr_rec.ACCEPT_DECLINE_BY := NULL;
5320
5321 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5322 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
5323 'OKS_WF_K_PROCESS_PVT.set_notification_attributes('||
5324 ' Contract ID ='||l_contract_id||
5325 ' Notification Type ='||l_notif_attr_rec.NTF_TYPE||
5326 ' Performer ='||l_notif_attr_rec.PERFORMER||')');
5327 END IF;
5328 set_notification_attributes
5329 (
5330 p_api_version => 1.0,
5331 p_init_msg_list => OKC_API.G_FALSE,
5332 p_notif_attr => l_notif_attr_rec,
5333 x_return_status => l_return_status,
5334 x_msg_data => l_msg_data,
5335 x_msg_count => l_msg_count
5336 );
5337 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5338 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
5339 'OKS_WF_K_PROCESS_PVT.set_notification_attributes(x_return_status= '||
5340 l_return_status||' x_msg_count ='||l_msg_count||')');
5341 END IF;
5342 IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
5343 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5344 ELSIF l_return_status = G_RET_STS_ERROR THEN
5345 RAISE FND_API.G_EXC_ERROR;
5346 END IF;
5347 resultout := 'COMPLETE:RENEWAL';
5348 END IF;
5349 END IF;
5350 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5351 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
5352 'Resultout: ' || resultout);
5353 END IF;
5354
5355 -- Reset negotiation status to NULL so that no other process will
5356 -- update incorrect Negotiation status
5357 wf_engine.SetItemAttrText
5358 (
5359 itemtype => itemtype,
5360 itemkey => itemkey,
5361 aname => 'NEGOTIATION_STATUS',
5362 avalue => NULL
5363 );
5364
5365 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5366 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5367 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=RUN');
5368 END IF;
5369 RETURN;
5370 END IF; -- (funcmode = 'RUN')
5371
5372 IF (funcmode = 'CANCEL') THEN
5373 resultout := 'COMPLETE:';
5374 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5375 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5376 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
5377 END IF;
5378 RETURN;
5379 END IF; -- (funcmode = 'CANCEL')
5380
5381 IF (funcmode = 'TIMEOUT') THEN
5382 resultout := 'COMPLETE:';
5383 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5384 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5385 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
5386 END IF;
5387 RETURN;
5388 END IF; -- (funcmode = 'TIMEOUT')
5389
5390 EXCEPTION
5391 WHEN others THEN
5392 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5393 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
5394 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
5395 ||SQLCODE||', sqlerrm = '||SQLERRM);
5396 END IF;
5397 wf_core.CONTEXT
5398 (
5399 pkg_name => G_PKG_NAME,
5400 proc_name => l_api_name,
5401 arg1 => itemtype,
5402 arg2 => itemkey,
5403 arg3 => to_char(actid),
5404 arg4 => funcmode,
5405 arg5 => SQLCODE,
5406 arg6 => SQLERRM
5407 );
5408 END get_old_wf_status;
5409
5410 /*=========================================================================
5411 API name : get_process_type
5412 Type : Private.
5413 Function : This procedure determines the renewal process this contract
5414 is going to follow during its lifecycle.
5415 Pre-reqs : None.
5416 Parameters :
5417 IN : itemtype IN VARCHAR2 Required
5418 Workflow item type parameter
5419 : itemkey IN VARCHAR2 Required
5420 Workflow item key parameter
5421 : actid IN VARCHAR2 Required
5422 Workflow actid parameter
5423 : funcmode IN VARCHAR2 Required
5424 Workflow function mode parameter
5425 OUT : resultout OUT VARCHAR2(1)
5426 Workflow standard out parameter
5427 Note :
5428 =========================================================================*/
5429 PROCEDURE get_process_type
5430 (
5431 itemtype IN VARCHAR2,
5432 itemkey IN VARCHAR2,
5433 actid IN NUMBER,
5434 funcmode IN VARCHAR2,
5435 resultout OUT nocopy VARCHAR2
5436 ) IS
5437
5438 l_api_name CONSTANT VARCHAR2(30) := 'get_process_type';
5439 l_return_status VARCHAR2(1);
5440 l_msg_count NUMBER;
5441 l_msg_data VARCHAR2(4000);
5442
5443 l_contract_id NUMBER;
5444 l_process_type VARCHAR2(30);
5445
5446 BEGIN
5447
5448 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5449 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5450 'Entered '||G_PKG_NAME ||'.'||l_api_name);
5451 END IF;
5452 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5453 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
5454 'itemtype: ' || itemtype ||
5455 ' itemkey: ' || itemkey ||
5456 ' actid: ' || to_char(actid) ||
5457 ' funcmode: ' || funcmode);
5458 END IF;
5459 IF (funcmode = 'RUN') THEN
5460
5461 l_contract_id := wf_engine.GetItemAttrNumber(
5462 itemtype => itemtype,
5463 itemkey => itemkey,
5464 aname => 'CONTRACT_ID');
5465
5466 -- Get process type to determine if this is a new or a renewal contract
5467 -- If it is a new contract, process type is always Manual
5468 -- If it is a renewal contract, determine if this contract qualifies
5469 -- for either Online or Evergreen process
5470 l_process_type := wf_engine.GetItemAttrText(
5471 itemtype => itemtype,
5472 itemkey => itemkey,
5473 aname => 'PROCESS_TYPE');
5474
5475 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5476 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
5477 'Process Type: ' ||NVL(l_process_type,'NULL'));
5478 END IF;
5479
5480 IF l_process_type = G_RENEW_TYPE_ONLINE THEN
5481 -- update process status to 'Pending Publication'
5482 update_negotiation_status
5483 (
5484 p_api_version => 1.0,
5485 p_init_msg_list => G_TRUE,
5486 p_chr_id => l_contract_id,
5487 p_negotiation_status => G_NEG_STS_PEND_PUBLISH,
5488 x_return_status => l_return_status,
5489 x_msg_count => l_msg_count,
5490 x_msg_data => l_msg_data
5491 );
5492 IF l_return_status <> G_RET_STS_SUCCESS THEN
5493 RAISE FND_API.G_EXC_ERROR;
5494 END IF;
5495 resultout := 'COMPLETE:ONLINE';
5496 ELSIF l_process_type = G_RENEW_TYPE_EVERGREEN THEN
5497 resultout := 'COMPLETE:EVERGREEN';
5498 ELSIF l_process_type = G_NEW_CONTRACT THEN -- New Contract do nothing.
5499 resultout := 'COMPLETE:';
5500 ELSE
5501 resultout := 'COMPLETE:';
5502 END IF;
5503
5504 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5505 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
5506 'Resultout: ' || resultout);
5507 END IF;
5508 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5509 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5510 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=RUN');
5511 END IF;
5512 RETURN;
5513 END IF; -- (funcmode = 'RUN')
5514
5515 IF (funcmode = 'CANCEL') THEN
5516 resultout := 'COMPLETE:';
5517 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5518 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5519 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
5520 END IF;
5521 RETURN;
5522 END IF; -- (funcmode = 'CANCEL')
5523
5524 IF (funcmode = 'TIMEOUT') THEN
5525 resultout := 'COMPLETE:';
5526 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5527 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5528 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
5529 END IF;
5530 RETURN;
5531 END IF; -- (funcmode = 'TIMEOUT')
5532
5533 EXCEPTION
5534 WHEN FND_API.G_EXC_ERROR THEN
5535 l_msg_data := get_fnd_message;
5536 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5537 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
5538 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'Error: Itemtype: '
5539 ||NVL(itemtype,'NULL')||' Itemkey: '||NVL(itemkey,'NULL'));
5540 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,l_msg_data);
5541 END IF;
5542 wf_core.CONTEXT
5543 (
5544 pkg_name => G_PKG_NAME,
5545 proc_name => l_api_name,
5546 arg1 => itemtype,
5547 arg2 => itemkey,
5548 arg3 => l_msg_data
5549 );
5550 WHEN others THEN
5551 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5552 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
5553 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
5554 ||SQLCODE||', sqlerrm = '||SQLERRM);
5555 END IF;
5556 wf_core.CONTEXT
5557 (
5558 pkg_name => G_PKG_NAME,
5559 proc_name => l_api_name,
5560 arg1 => itemtype,
5561 arg2 => itemkey,
5562 arg3 => to_char(actid),
5563 arg4 => funcmode,
5564 arg5 => SQLCODE,
5565 arg6 => SQLERRM
5566 );
5567 END get_process_type;
5568
5569 /*cgopinee bugfix for 8361496*/
5570 /*=========================================================================
5571 API name : get_curr_conv_date_validity
5572 Type : Private.
5573 Function : This procedure determines the validity of the currency
5574 conversion date.
5575 Pre-reqs : None.
5576 Parameters :
5577 IN : itemtype IN VARCHAR2 Required
5578 Workflow item type parameter
5579 : itemkey IN VARCHAR2 Required
5580 Workflow item key parameter
5581 : actid IN VARCHAR2 Required
5582 Workflow actid parameter
5583 : funcmode IN VARCHAR2 Required
5584 Workflow function mode parameter
5585 OUT : resultout OUT VARCHAR2(1)
5586 Workflow standard out parameter
5587 Note :
5588 =========================================================================*/
5589 PROCEDURE get_curr_conv_date_validity
5590 (
5591 itemtype IN VARCHAR2,
5592 itemkey IN VARCHAR2,
5593 actid IN NUMBER,
5594 funcmode IN VARCHAR2,
5595 resultout OUT nocopy VARCHAR2
5596 ) IS
5597
5598 l_api_name CONSTANT VARCHAR2(30) := 'get_curr_conv_date_validity';
5599 l_return_status VARCHAR2(1);
5600 l_msg_count NUMBER;
5601 l_msg_data VARCHAR2(4000);
5602
5603 CURSOR l_curr_conv_invalid_csr (p_chr_id NUMBER) IS
5604 SELECT 'Y' FROM okc_k_headers_all_b
5605 WHERE id =p_chr_id AND
5606 Upper(conversion_type) ='USER'
5607 AND conversion_rate_date NOT BETWEEN start_date AND end_date;
5608
5609 l_contract_id NUMBER;
5610 l_invalid VARCHAR2(1);
5611
5612 BEGIN
5613
5614 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5615 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5616 'Entered '||G_PKG_NAME ||'.'||l_api_name);
5617 END IF;
5618 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5619 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
5620 'itemtype: ' || itemtype ||
5621 ' itemkey: ' || itemkey ||
5622 ' actid: ' || to_char(actid) ||
5623 ' funcmode: ' || funcmode);
5624 END IF;
5625 IF (funcmode = 'RUN') THEN
5626
5627 l_contract_id := wf_engine.GetItemAttrNumber(
5628 itemtype => itemtype,
5629 itemkey => itemkey,
5630 aname => 'CONTRACT_ID');
5631
5632 OPEN l_curr_conv_invalid_csr(l_contract_id);
5633 FETCH l_curr_conv_invalid_csr INTO l_invalid;
5634 CLOSE l_curr_conv_invalid_csr;
5635
5636 IF l_invalid = 'Y' THEN
5637 resultout := 'Y';
5638 END IF;
5639
5640 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5641 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
5642 'Resultout: ' || resultout);
5643 END IF;
5644
5645 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5646 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5647 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=RUN');
5648 END IF;
5649 RETURN;
5650 END IF; -- (funcmode = 'RUN')
5651
5652 IF (funcmode = 'CANCEL') THEN
5653 resultout := 'COMPLETE:';
5654 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5655 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5656 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
5657 END IF;
5658 RETURN;
5659 END IF; -- (funcmode = 'CANCEL')
5660
5661 IF (funcmode = 'TIMEOUT') THEN
5662 resultout := 'COMPLETE:';
5663 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5664 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5665 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
5666 END IF;
5667 RETURN;
5668 END IF; -- (funcmode = 'TIMEOUT')
5669
5670 EXCEPTION
5671 WHEN FND_API.G_EXC_ERROR THEN
5672 l_msg_data := get_fnd_message;
5673 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5674 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
5675 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'Error: Itemtype: '
5676 ||NVL(itemtype,'NULL')||' Itemkey: '||NVL(itemkey,'NULL'));
5677 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,l_msg_data);
5678 END IF;
5679 wf_core.CONTEXT
5680 (
5681 pkg_name => G_PKG_NAME,
5682 proc_name => l_api_name,
5683 arg1 => itemtype,
5684 arg2 => itemkey,
5685 arg3 => l_msg_data
5686 );
5687 WHEN others THEN
5688 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5689 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
5690 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
5691 ||SQLCODE||', sqlerrm = '||SQLERRM);
5692 END IF;
5693 wf_core.CONTEXT
5694 (
5695 pkg_name => G_PKG_NAME,
5696 proc_name => l_api_name,
5697 arg1 => itemtype,
5698 arg2 => itemkey,
5699 arg3 => to_char(actid),
5700 arg4 => funcmode,
5701 arg5 => SQLCODE,
5702 arg6 => SQLERRM
5703 );
5704 END get_curr_conv_date_validity;
5705 /*end of bugfix 8361496*/
5706
5707 /*=========================================================================
5708 API name : salesrep_action
5709 Type : Private.
5710 Function : This procedure makes the workflow process wait for
5711 salesrep action.
5712 Pre-reqs : None.
5713 Parameters :
5714 IN : itemtype IN VARCHAR2 Required
5715 Workflow item type parameter
5716 : itemkey IN VARCHAR2 Required
5717 Workflow item key parameter
5718 : actid IN VARCHAR2 Required
5719 Workflow actid parameter
5720 : funcmode IN VARCHAR2 Required
5721 Workflow function mode parameter
5722 OUT : resultout OUT VARCHAR2(1)
5723 Workflow standard out parameter
5724 Note :
5725 =========================================================================*/
5726 PROCEDURE salesrep_action
5727 (
5728 itemtype IN VARCHAR2,
5729 itemkey IN VARCHAR2,
5730 actid IN NUMBER,
5731 funcmode IN VARCHAR2,
5732 resultout OUT nocopy VARCHAR2
5733 ) IS
5734
5735 l_api_name CONSTANT VARCHAR2(30) := 'salesrep_action';
5736 l_return_status VARCHAR2(1);
5737 l_msg_count NUMBER;
5738 l_msg_data VARCHAR2(4000);
5739
5740 BEGIN
5741
5742 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5743 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5744 'Entered '||G_PKG_NAME ||'.'||l_api_name);
5745 END IF;
5746 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5747 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
5748 'itemtype: ' || itemtype ||
5749 ' itemkey: ' || itemkey ||
5750 ' actid: ' || to_char(actid) ||
5751 ' funcmode: ' || funcmode);
5752 END IF;
5753 IF (funcmode = 'RUN') THEN
5754 resultout := 'NOTIFIED:';
5755 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5756 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5757 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=RUN');
5758 END IF;
5759 RETURN;
5760 END IF; -- (funcmode = 'RUN')
5761
5762 IF (funcmode = 'CANCEL') THEN
5763 resultout := 'COMPLETE:';
5764 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5765 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5766 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
5767 END IF;
5768 RETURN;
5769 END IF; -- (funcmode = 'CANCEL')
5770
5771 IF (funcmode = 'TIMEOUT') THEN
5772 resultout := 'COMPLETE:';
5773 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5774 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5775 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
5776 END IF;
5777 RETURN;
5778 END IF; -- (funcmode = 'TIMEOUT')
5779
5780 EXCEPTION
5781 WHEN others THEN
5782 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5783 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
5784 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
5785 ||SQLCODE||', sqlerrm = '||SQLERRM);
5786 END IF;
5787 wf_core.CONTEXT
5788 (
5789 pkg_name => G_PKG_NAME,
5790 proc_name => l_api_name,
5791 arg1 => itemtype,
5792 arg2 => itemkey,
5793 arg3 => to_char(actid),
5794 arg4 => funcmode,
5795 arg5 => SQLCODE,
5796 arg6 => SQLERRM
5797 );
5798 END salesrep_action;
5799
5800 /*=========================================================================
5801 API name : is_submit_for_approval_allowed
5802 Type : Private.
5803 Function : This procedure determines whether the contract is eligible
5804 to be submitted for approval.
5805 Pre-reqs : None.
5806 Parameters :
5807 IN : p_api_version IN NUMBER Required
5808 Api version
5809 : p_init_msg_list IN VARCHAR2 Required
5810 Initialize message stack parameter
5811 : p_chr_id IN NUMBER Required
5812 Contract header Id
5813 : p_item_key IN VARCHAR2 Required
5814 Contract process workflow's item key.
5815 OUT : x_return_status OUT VARCHAR2(1)
5816 Api return status
5817 : x_msg_count OUT NUMBER
5818 Count of message on error stack
5819 : x_msg_data OUT VARCHAR2
5820 Actual error messages on error stack
5821 Note :
5822 =========================================================================*/
5823 PROCEDURE is_submit_for_approval_allowed
5824 (
5825 p_api_version IN NUMBER,
5826 p_init_msg_list IN VARCHAR2,
5827 p_contract_id IN NUMBER,
5828 p_item_key IN VARCHAR2,
5829 x_activity_name OUT NOCOPY VARCHAR2,
5830 x_return_status OUT NOCOPY VARCHAR2,
5831 x_msg_count OUT NOCOPY NUMBER,
5832 x_msg_data OUT NOCOPY VARCHAR2
5833 ) IS
5834
5835 l_api_version CONSTANT NUMBER := 1.0;
5836 l_api_name CONSTANT VARCHAR2(50) := 'is_submit_for_approval_allowed';
5837 l_item_key wf_items.item_key%TYPE;
5838 l_contract_number VARCHAR2(120);
5839 l_contract_modifier VARCHAR2(120);
5840
5841 BEGIN
5842
5843 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5844 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
5845 'Entered '||G_PKG_NAME ||'.'||l_api_name||'with Contract Id '||p_contract_id);
5846 END IF;
5847
5848 -- Standard call to check for call compatibility.
5849 IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
5850 x_return_status := G_RET_STS_ERROR;
5851 RAISE FND_API.G_EXC_ERROR;
5852 END IF;
5853
5854 -- Initialize message list if p_init_msg_list is set to TRUE.
5855 IF FND_API.to_Boolean( p_init_msg_list ) THEN
5856 FND_MSG_PUB.initialize;
5857 END IF;
5858
5859 -- Initialize API return status to success
5860 x_return_status := FND_API.G_RET_STS_SUCCESS;
5861
5862 IF p_contract_id IS NULL THEN
5863 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_INVD_CONTRACT_ID');
5864 FND_MESSAGE.SET_TOKEN('HDR_ID',p_contract_id);
5865 FND_MSG_PUB.add;
5866 RAISE FND_API.G_EXC_ERROR;
5867 END IF;
5868
5869 IF p_item_key IS NULL THEN
5870 l_item_key := get_wf_item_key(p_contract_id => p_contract_id);
5871 IF l_item_key IS NULL THEN
5872 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INVALID_WF_ITEM_KEY');
5873 FND_MSG_PUB.add;
5874 RAISE FND_API.G_EXC_ERROR;
5875 END IF;
5876 ELSE
5877 l_item_key := p_item_key;
5878 END IF;
5879
5880 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5881 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
5882 'Item Key found '||l_item_key);
5883 END IF;
5884
5885 x_activity_name := get_notified_activity
5886 (
5887 p_item_type => G_ITEM_TYPE
5888 ,p_item_key => l_item_key
5889 );
5890
5891 IF x_activity_name = G_SALESREP_ACTION THEN
5892 x_return_status := G_RET_STS_SUCCESS;
5893 ELSIF x_activity_name = G_CUST_ACTION THEN
5894 FND_MESSAGE.set_name(G_APP_NAME,'OKS_WAIT_CUST_ACCEPTANCE');
5895 FND_MESSAGE.SET_TOKEN('K_NUMBER',get_concat_k_number(p_contract_id));
5896 FND_MSG_PUB.add;
5897 x_return_status := G_RET_STS_WARNING;
5898 x_activity_name := G_CUST_ACTION;
5899 ELSE
5900 FND_MESSAGE.set_name(G_APP_NAME,'OKS_SUBMIT_APRVL_NOT_ALWD');
5901 FND_MESSAGE.SET_TOKEN('K_NUMBER',get_concat_k_number(p_contract_id));
5902 FND_MSG_PUB.add;
5903 RAISE FND_API.G_EXC_ERROR;
5904 END IF;
5905 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5906 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
5907 'Activity: '||x_activity_name||' Return status '||x_return_status);
5908 END IF;
5909
5910 -- Standard call to get message count and if count is 1, get message info.
5911 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count=>x_msg_count, p_data=>x_msg_data);
5912
5913 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5914 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5915 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
5916 END IF;
5917
5918 EXCEPTION
5919 WHEN FND_API.G_EXC_ERROR THEN
5920 x_return_status := G_RET_STS_ERROR;
5921 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
5922 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5923 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
5924 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.ERROR');
5925 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,get_fnd_message);
5926 END IF;
5927 WHEN OTHERS THEN
5928 x_return_status := G_RET_STS_UNEXP_ERROR;
5929 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5930 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
5931 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
5932 ||SQLCODE||', sqlerrm = '||SQLERRM);
5933 END IF;
5934 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
5935 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
5936 END is_submit_for_approval_allowed;
5937
5938 FUNCTION set_user_context
5939 (
5940 p_wf_item_key IN VARCHAR2,
5941 p_user_id IN NUMBER,
5942 p_resp_id IN NUMBER,
5943 p_resp_appl_id IN NUMBER,
5944 p_security_group_id IN NUMBER,
5945 p_commit IN VARCHAR2
5946 ) RETURN VARCHAR2 AS
5947
5948 PRAGMA AUTONOMOUS_TRANSACTION;
5949
5950 l_api_name CONSTANT VARCHAR2(30) := 'set_user_context';
5951 l_return_status VARCHAR2(1) := G_RET_STS_SUCCESS;
5952
5953 BEGIN
5954
5955 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5956 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5957 'Entered '||G_PKG_NAME ||'.'||l_api_name||
5958 ' Item Key =>'||p_wf_item_key||
5959 ' User Id=>'||p_user_id||'Resp Id=>'||p_resp_id||
5960 ' Resp Appl Id=>'||p_resp_appl_id||
5961 ' Security Group Id=>'||p_security_group_id );
5962 END IF;
5963 -- Reset following item attributes to reflect the current user
5964 begin
5965 wf_engine.SetItemAttrNumber(
5966 itemtype => G_ITEM_TYPE,
5967 itemkey => p_wf_item_key,
5968 aname => 'USER_ID',
5969 avalue => p_user_id);
5970 exception
5971 when others then
5972 wf_engine.AddItemAttr (
5973 itemtype => G_ITEM_TYPE,
5974 itemkey => p_wf_item_key,
5975 aname => 'USER_ID');
5976
5977 wf_engine.SetItemAttrNumber (
5978 itemtype => G_ITEM_TYPE,
5979 itemkey => p_wf_item_key,
5980 aname => 'USER_ID',
5981 avalue => p_user_id);
5982 end;
5983 begin
5984 wf_engine.SetItemAttrNumber(
5985 itemtype => G_ITEM_TYPE,
5986 itemkey => p_wf_item_key,
5987 aname => 'RESP_ID',
5988 avalue => p_resp_id);
5989 exception
5990 when others then
5991 wf_engine.AddItemAttr (
5992 itemtype => G_ITEM_TYPE,
5993 itemkey => p_wf_item_key,
5994 aname => 'RESP_ID');
5995
5996 wf_engine.SetItemAttrNumber (
5997 itemtype => G_ITEM_TYPE,
5998 itemkey => p_wf_item_key,
5999 aname => 'RESP_ID',
6000 avalue => p_resp_id);
6001 end;
6002 begin
6003 wf_engine.SetItemAttrNumber(
6004 itemtype => G_ITEM_TYPE,
6005 itemkey => p_wf_item_key,
6006 aname => 'RESP_APPL_ID',
6007 avalue => p_resp_appl_id);
6008 exception
6009 when others then
6010 wf_engine.AddItemAttr (
6011 itemtype => G_ITEM_TYPE,
6012 itemkey => p_wf_item_key,
6013 aname => 'RESP_APPL_ID');
6014
6015 wf_engine.SetItemAttrNumber (
6016 itemtype => G_ITEM_TYPE,
6017 itemkey => p_wf_item_key,
6018 aname => 'RESP_APPL_ID',
6019 avalue => p_resp_appl_id);
6020 end;
6021 begin
6022 wf_engine.SetItemAttrNumber(
6023 itemtype => G_ITEM_TYPE,
6024 itemkey => p_wf_item_key,
6025 aname => 'SECURITY_GROUP_ID',
6026 avalue => p_security_group_id);
6027 exception
6028 when others then
6029 wf_engine.AddItemAttr (
6030 itemtype => G_ITEM_TYPE,
6031 itemkey => p_wf_item_key,
6032 aname => 'SECURITY_GROUP_ID');
6033
6034 wf_engine.SetItemAttrNumber (
6035 itemtype => G_ITEM_TYPE,
6036 itemkey => p_wf_item_key,
6037 aname => 'SECURITY_GROUP_ID',
6038 avalue => p_security_group_id);
6039 end;
6040
6041 IF FND_API.to_boolean( p_commit ) THEN
6042 COMMIT;
6043 END IF;
6044 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6045 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
6046 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
6047 END IF;
6048 RETURN l_return_status;
6049 END;
6050
6051 /*=========================================================================
6052 API name : submit_for_approval
6053 Type : Private.
6054 Function : This procedure determines whether the contract is eligible
6055 to be submitted for approval.
6056 Pre-reqs : None.
6057 Parameters :
6058 IN : p_api_version IN NUMBER Required
6059 Api version
6060 : p_init_msg_list IN VARCHAR2 Required
6061 Initialize message stack parameter
6062 : p_chr_id IN NUMBER Required
6063 Contract header Id
6064 : p_item_key IN VARCHAR2 Required
6065 Contract process workflow's item key.
6066 : p_validate_yn IN VARCHAR2 Required
6067 Flag to check if submit for approval action is allowed.
6068 : p_qa_required_yn IN VARCHAR2 Required
6069 If Y QA checks will be performed else skipped.
6070 OUT : x_return_status OUT VARCHAR2(1)
6071 Api return status
6072 : x_msg_count OUT NUMBER
6073 Count of message on error stack
6074 : x_msg_data OUT VARCHAR2
6075 Actual error messages on error stack
6076 Note :
6077 =========================================================================*/
6078 PROCEDURE submit_for_approval
6079 (
6080 p_api_version IN NUMBER,
6081 p_init_msg_list IN VARCHAR2,
6082 p_commit IN VARCHAR2 DEFAULT 'F',
6083 p_contract_id IN NUMBER,
6084 p_item_key IN VARCHAR2,
6085 p_validate_yn IN VARCHAR2,
6086 p_qa_required_yn IN VARCHAR2,
6087 x_negotiation_status OUT NOCOPY VARCHAR2,
6088 x_return_status OUT NOCOPY VARCHAR2,
6089 x_msg_count OUT NOCOPY NUMBER,
6090 x_msg_data OUT NOCOPY VARCHAR2
6091 ) IS
6092
6093 l_api_version CONSTANT NUMBER := 1.0;
6094 l_api_name CONSTANT VARCHAR2(50) := 'submit_for_approval';
6095
6096 l_send_email_yn VARCHAR2(1) := 'N';
6097 l_item_key wf_items.item_key%TYPE;
6098 l_email_attr_rec OKS_WF_K_PROCESS_PVT.email_attr_rec;
6099 l_activity_name VARCHAR2(30);
6100 l_irr_flag VARCHAR2(1);
6101
6102 BEGIN
6103
6104 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6105 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
6106 'Entered '||G_PKG_NAME ||'.'||l_api_name||
6107 ' with Contract Id '||p_contract_id ||
6108 ' p_validate_yn '||p_validate_yn||' p_qa_required_yn '||p_qa_required_yn);
6109 END IF;
6110
6111 DBMS_TRANSACTION.SAVEPOINT(l_api_name);
6112 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
6113 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6114 END IF;
6115
6116 -- Initialize message list if p_init_msg_list is set to TRUE.
6117 IF FND_API.to_Boolean( p_init_msg_list ) THEN
6118 FND_MSG_PUB.initialize;
6119 END IF;
6120
6121 -- Initialize API return status to success
6122 x_return_status := G_RET_STS_SUCCESS;
6123
6124 IF p_contract_id IS NULL THEN
6125 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_INVD_CONTRACT_ID');
6126 FND_MESSAGE.SET_TOKEN('HDR_ID',p_contract_id);
6127 FND_MSG_PUB.add;
6128 RAISE FND_API.G_EXC_ERROR;
6129 END IF;
6130
6131 -- Check whether submit for approval actions is applicable for this contract
6132 -- If k is not in 'Entered' status, we should not allow submit for approval
6133 IF OKS_K_ACTIONS_PVT.validateForRenewalAction(p_chr_id => p_contract_id) = 'N' THEN
6134 x_return_status := G_RET_STS_ACTION_NOT_ALWD;
6135 RAISE ActionNotAllowedException;
6136 END IF;
6137
6138 IF p_item_key IS NULL THEN
6139 l_item_key := get_wf_item_key(p_contract_id => p_contract_id);
6140 IF l_item_key IS NULL THEN
6141 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INVALID_WF_ITEM_KEY');
6142 FND_MSG_PUB.add;
6143 RAISE FND_API.G_EXC_ERROR;
6144 END IF;
6145 ELSE
6146 l_item_key := p_item_key;
6147 END IF;
6148
6149 -- Skip the submit for approval allowed check when
6150 -- this api is called for the 2nd time.
6151 IF p_validate_yn = 'Y' THEN
6152 is_submit_for_approval_allowed
6153 (
6154 p_api_version => l_api_version,
6155 p_init_msg_list => G_FALSE,
6156 p_contract_id => p_contract_id,
6157 p_item_key => l_item_key,
6158 x_activity_name => l_activity_name,
6159 x_return_status => x_return_status,
6160 x_msg_count => x_msg_count,
6161 x_msg_data => x_msg_data
6162 );
6163 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
6164 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6165 ELSIF x_return_status = G_RET_STS_ERROR THEN
6166 RAISE FND_API.G_EXC_ERROR;
6167 ELSIF x_return_status = G_RET_STS_WARNING THEN
6168 Raise ActionNotAllowedException;
6169 END IF;
6170 ELSE
6171 -- Only check if the contract is in either Salesrep / Customer queue
6172 l_activity_name := get_notified_activity
6173 (
6174 p_item_type => G_ITEM_TYPE
6175 ,p_item_key => l_item_key
6176 );
6177 IF l_activity_name NOT IN (G_SALESREP_ACTION, G_CUST_ACTION) THEN
6178 FND_MESSAGE.set_name(G_APP_NAME,'OKS_SUBMIT_APPROVAL_NOT_ALLOWED');
6179 FND_MSG_PUB.add;
6180 RAISE FND_API.G_EXC_ERROR;
6181 ELSIF l_activity_name = G_CUST_ACTION THEN
6182
6183 -- bug 5845505, send email only if template for the document type is setup
6184 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6185 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
6186 'OKS_WF_K_PROCESS_PVT.is_template_defined('||
6187 ' Contract ID ='||p_contract_id||
6188 ' Document Type ='||G_REPORT_TYPE_ACCEPT||')');
6189 END IF;
6190 is_template_defined (
6191 p_api_version => l_api_version,
6192 p_init_msg_list => G_FALSE,
6193 p_contract_id => p_contract_id,
6194 p_document_type => G_REPORT_TYPE_ACCEPT,
6195 x_template_defined_yn => l_send_email_yn,
6196 x_email_attr_rec => l_email_attr_rec,
6197 x_return_status => x_return_status,
6198 x_msg_data => x_msg_data,
6199 x_msg_count => x_msg_count
6200 );
6201
6202 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6203 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
6204 'OKS_WF_K_PROCESS_PVT.is_template_defined(x_return_status= '||
6205 x_return_status||' x_msg_count ='||x_msg_count||')');
6206 END IF;
6207 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
6208 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6209 ELSIF x_return_status = G_RET_STS_ERROR THEN
6210 RAISE FND_API.G_EXC_ERROR;
6211 END IF;
6212
6213 wf_engine.SetItemAttrText
6214 (
6215 itemtype => G_ITEM_TYPE,
6216 itemkey => l_item_key,
6217 aname => 'SEND_CONFIRM',
6218 avalue => l_send_email_yn
6219 );
6220
6221 --log interaction (media type WEB FORM) that customer has accepted the quote
6222 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6223 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
6224 'OKS_WF_K_PROCESS_PVT.set_email_attributes('||
6225 ' Contract ID = '||p_contract_id||
6226 substr(' IH Subject = '||l_email_attr_rec.ih_subject,1,100)||
6227 substr(' IH Message = '||l_email_attr_rec.ih_message||')',1,100));
6228 END IF;
6229 OKS_AUTO_REMINDER.log_interaction (
6230 p_api_version => l_api_version,
6231 p_init_msg_list => G_FALSE,
6232 x_return_status => x_return_status,
6233 x_msg_count => x_msg_count,
6234 x_msg_data => x_msg_data,
6235 p_chr_id => p_contract_id,
6236 p_subject => l_email_attr_rec.ih_subject,
6237 p_msg_body => l_email_attr_rec.ih_message,
6238 p_sent2_email => NULL,
6239 p_media_type => G_MEDIA_TYPE_WEB_FORM
6240 );
6241 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6242 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
6243 'OKS_AUTO_REMINDER.log_interaction(x_return_status= '||
6244 x_return_status||' x_msg_count ='||x_msg_count||')');
6245 END IF;
6246 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
6247 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6248 ELSIF x_return_status = G_RET_STS_ERROR THEN
6249 RAISE FND_API.G_EXC_ERROR;
6250 END IF;
6251 IF NVL(l_send_email_yn,'N') = 'Y' THEN
6252
6253 l_email_attr_rec.CONTRACT_ID := p_contract_id;
6254 l_email_attr_rec.ITEM_KEY := l_item_key;
6255 l_email_attr_rec.EMAIL_TYPE := G_REPORT_TYPE_ACCEPT;
6256 l_email_attr_rec.TO_EMAIL := NULL;
6257 l_email_attr_rec.SENDER_EMAIL := NULL;
6258
6259 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6260 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
6261 'OKS_WF_K_PROCESS_PVT.set_email_attributes('||
6262 ' Contract ID ='||p_contract_id||
6263 ' Email Type ='||l_email_attr_rec.EMAIL_TYPE||')');
6264 END IF;
6265 set_email_attributes
6266 (
6267 p_api_version => l_api_version,
6268 p_init_msg_list => OKC_API.G_FALSE,
6269 p_email_attr => l_email_attr_rec,
6270 x_return_status => x_return_status,
6271 x_msg_data => x_msg_data,
6272 x_msg_count => x_msg_count
6273 );
6274 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6275 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
6276 'OKS_WF_K_PROCESS_PVT.set_email_attributes(x_return_status= '||
6277 x_return_status||' x_msg_count ='||x_msg_count||')');
6278 END IF;
6279 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
6280 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6281 ELSIF x_return_status = G_RET_STS_ERROR THEN
6282 RAISE FND_API.G_EXC_ERROR;
6283 END IF;
6284 END IF;
6285 END IF;
6286 END IF;
6287
6288 -- If submit for approval action is taken at Authoring set this flag to 'N' so
6289 -- that QA check is not performed but when taken at Workbench, set it to 'Y'.
6290 wf_engine.SetItemAttrText
6291 (
6292 itemtype => G_ITEM_TYPE,
6293 itemkey => l_item_key,
6294 aname => 'QA_REQUIRED_YN',
6295 avalue => p_qa_required_yn
6296 );
6297
6298 -- Set wf item attributes to reflect the current user submitting for approval
6299 x_return_status := set_user_context(
6300 p_wf_item_key => l_item_key,
6301 p_user_id => fnd_global.user_id,
6302 p_resp_id => fnd_global.resp_id,
6303 p_resp_appl_id => fnd_global.resp_appl_id,
6304 p_security_group_id => fnd_global.security_group_id,
6305 p_commit => G_TRUE
6306 );
6307
6308 -- This call is made for Authoring so that they don't have to access DB to get
6309 -- the latest Negotiation status. Authoring shud consider the return parameter.
6310 l_irr_flag := get_irr_flag(p_contract_id => NULL,p_item_key => l_item_key);
6311 IF l_irr_flag = G_IRR_FLAG_REQD THEN
6312 x_negotiation_status := G_NEG_STS_PEND_IA;
6313 ELSIF l_irr_flag = G_IRR_FLAG_NOT_REQD THEN
6314 x_negotiation_status := G_NEG_STS_PEND_ACTIVATION;
6315 ELSE
6316 RAISE FND_API.G_EXC_ERROR;
6317 END IF;
6318
6319 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6320 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
6321 'Starting complete_activity with Activity '||l_activity_name);
6322 END IF;
6323 complete_activity
6324 (
6325 p_api_version => l_api_version,
6326 p_init_msg_list => G_FALSE,
6327 p_contract_id => p_contract_id,
6328 p_item_key => l_item_key,
6329 p_resultout => 'SUBMIT',
6330 p_process_status => x_negotiation_status,
6331 p_activity_name => l_activity_name,
6332 x_return_status => x_return_status,
6333 x_msg_data => x_msg_data,
6334 x_msg_count => x_msg_count
6335 );
6336 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6337 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
6338 ' Return status '||x_return_status||' x_msg_count '||x_msg_count);
6339 END IF;
6340 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
6341 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6342 ELSIF x_return_status = G_RET_STS_ERROR THEN
6343 RAISE FND_API.G_EXC_ERROR;
6344 END IF;
6345
6346 IF FND_API.to_boolean( p_commit ) THEN
6347 COMMIT;
6348 END IF;
6349 -- Standard call to get message count and if count is 1, get message info.
6350 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count=>x_msg_count, p_data=>x_msg_data);
6351
6352 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6353 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
6354 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
6355 END IF;
6356
6357 EXCEPTION
6358 WHEN ActionNotAllowedException THEN
6359 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
6360 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
6361 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6362 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
6363 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.ActionNotAllowedException '||
6364 ' Contract is either waiting for customer acceptance or not in entered status');
6365 END IF;
6366 WHEN FND_API.G_EXC_ERROR THEN
6367 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
6368 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
6369 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6370 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
6371 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_ERROR');
6372 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
6373 END IF;
6374 x_return_status := G_RET_STS_ERROR;
6375 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6376 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
6377 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
6378 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6379 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
6380 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_UNEXPECTED_ERROR');
6381 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
6382 END IF;
6383 x_return_status := G_RET_STS_UNEXP_ERROR ;
6384 WHEN OTHERS THEN
6385 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
6386 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6387 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
6388 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from OTHERS sqlcode = '
6389 ||SQLCODE||', sqlerrm = '||SQLERRM);
6390 END IF;
6391 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
6392 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
6393 x_return_status := G_RET_STS_UNEXP_ERROR ;
6394 END submit_for_approval;
6395
6396 /*=========================================================================
6397 API name : publish_to_customer
6398 Type : Private.
6399 Function : This procedure determines whether the contract is eligible
6400 to be submitted for approval.
6401 Pre-reqs : None.
6402 Parameters :
6403 IN : p_api_version IN NUMBER Required
6404 Api version
6405 : p_init_msg_list IN VARCHAR2 Required
6406 Initialize message stack parameter
6407 : p_contract_id IN NUMBER Required
6408 Contract header Id
6409 : p_item_key IN VARCHAR2 Required
6410 Contract process workflow's item key.
6411 OUT : x_return_status OUT VARCHAR2(1)
6412 Api return status
6413 : x_msg_count OUT NUMBER
6414 Count of message on error stack
6415 : x_msg_data OUT VARCHAR2
6416 Actual error messages on error stack
6417 Note :
6418 =========================================================================*/
6419 PROCEDURE publish_to_customer
6420 (
6421 p_api_version IN NUMBER,
6422 p_init_msg_list IN VARCHAR2,
6423 p_commit IN VARCHAR2 DEFAULT 'F',
6424 p_contract_id IN NUMBER,
6425 p_item_key IN VARCHAR2,
6426 x_return_status OUT NOCOPY VARCHAR2,
6427 x_msg_count OUT NOCOPY NUMBER,
6428 x_msg_data OUT NOCOPY VARCHAR2
6429 ) IS
6430
6431 l_api_version CONSTANT NUMBER := 1.0;
6432 l_api_name CONSTANT VARCHAR2(50) := 'publish_to_customer';
6433
6434 l_item_key VARCHAR2(80);
6435 l_activity_name VARCHAR2(30);
6436 l_negotiation_status VARCHAR2(30);
6437
6438 CURSOR l_nego_sts_csr (p_chr_id NUMBER) IS
6439 SELECT renewal_status FROM oks_k_headers_b
6440 WHERE chr_id = p_chr_id;
6441
6442 BEGIN
6443
6444 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6445 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
6446 'Entered '||G_PKG_NAME ||'.'||l_api_name||
6447 '(p_contract_id=>'||p_contract_id||'p_item_key=>'||p_item_key||')');
6448 END IF;
6449
6450 DBMS_TRANSACTION.SAVEPOINT(l_api_name);
6451 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
6452 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6453 END IF;
6454 -- Initialize message list if p_init_msg_list is set to TRUE.
6455 IF FND_API.to_Boolean( p_init_msg_list ) THEN
6456 FND_MSG_PUB.initialize;
6457 END IF;
6458
6459 -- Initialize API return status to success
6460 x_return_status := G_RET_STS_SUCCESS;
6461
6462 IF p_contract_id IS NULL THEN
6463 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_INVD_CONTRACT_ID');
6464 FND_MESSAGE.SET_TOKEN('HDR_ID',p_contract_id);
6465 FND_MSG_PUB.add;
6466 RAISE FND_API.G_EXC_ERROR;
6467 END IF;
6468
6469 OPEN l_nego_sts_csr (p_contract_id);
6470 FETCH l_nego_sts_csr INTO l_negotiation_status;
6471 CLOSE l_nego_sts_csr;
6472
6473 -- Updating the negotiation status to Quote Published coz when
6474 -- customer requests assistance, the contract is still in customers queue
6475 -- and salesrep in a way is republishing the contract
6476 -- Bug fix 5331882.
6477 IF NVL(l_negotiation_status,'X') = G_NEG_STS_ASSIST_REQD THEN
6478 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6479 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
6480 'Updating Negotiation status ' || l_negotiation_status || ' to Quote Published');
6481 END IF;
6482 update oks_k_headers_b set renewal_status = G_NEG_STS_QUOTE_SENT
6483 where chr_id = p_contract_id;
6484 ELSE
6485 -- Check whether publish to customer action is applicable for this contract
6486 -- If k is not in 'Entered' status, we should not allow for publishing it online
6487 IF OKS_K_ACTIONS_PVT.validateForRenewalAction(p_chr_id => p_contract_id) = 'N' THEN
6488 RAISE ActionNotAllowedException;
6489 END IF;
6490
6491 IF p_item_key IS NULL THEN
6492 l_item_key := get_wf_item_key(p_contract_id => p_contract_id);
6493 IF l_item_key IS NULL THEN
6494 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INVALID_WF_ITEM_KEY');
6495 FND_MSG_PUB.add;
6496 RAISE FND_API.G_EXC_ERROR;
6497 END IF;
6498 ELSE
6499 l_item_key := p_item_key;
6500 END IF;
6501
6502 IF activity_exist_in_process(
6503 p_item_type => G_ITEM_TYPE
6504 ,p_item_key => l_item_key
6505 ,p_activity_name => G_SALESREP_ACTION) THEN
6506 l_activity_name := G_SALESREP_ACTION;
6507 ELSE
6508 RAISE AlreadyPublishedException;
6509 END IF;
6510
6511 complete_activity
6512 (
6513 p_api_version => l_api_version,
6514 p_init_msg_list => G_FALSE,
6515 p_contract_id => p_contract_id,
6516 p_item_key => l_item_key,
6517 p_resultout => 'PUBLISH_ONLINE',
6518 p_process_status => G_NEG_STS_PEND_PUBLISH,
6519 p_activity_name => l_activity_name,
6520 x_return_status => x_return_status,
6521 x_msg_data => x_msg_data,
6522 x_msg_count => x_msg_count
6523 );
6524 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
6525 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6526 ELSIF x_return_status = G_RET_STS_ERROR THEN
6527 RAISE FND_API.G_EXC_ERROR;
6528 END IF;
6529
6530 -- Set this item attribute to 'Y' which indicates that this contract was
6531 -- published online manually. This is an important attribute since this is the only
6532 -- contract information that specifies that a contract is going thru online process
6533 wf_engine.SetItemAttrText
6534 (
6535 itemtype => G_ITEM_TYPE,
6536 itemkey => l_item_key,
6537 aname => 'PUBLISH_MAN_YN',
6538 avalue => 'Y'
6539 );
6540 END IF;
6541
6542 IF FND_API.to_boolean( p_commit ) THEN
6543 COMMIT;
6544 END IF;
6545
6546 -- Standard call to get message count and if count is 1, get message info.
6547 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count=>x_msg_count, p_data=>x_msg_data);
6548
6549 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6550 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
6551 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
6552 END IF;
6553
6554 EXCEPTION
6555 WHEN ActionNotAllowedException THEN
6556 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
6557 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
6558 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6559 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
6560 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.ActionNotAllowedException '||
6561 ' Contract cannot be published since it is not in entered status');
6562 END IF;
6563 x_return_status := G_RET_STS_ACTION_NOT_ALWD;
6564 WHEN AlreadyPublishedException THEN
6565 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
6566 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
6567 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6568 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
6569 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from AlreadyPublishedException');
6570 END IF;
6571 x_return_status := G_RET_STS_ALREADY_PUBLISHED;
6572 WHEN FND_API.G_EXC_ERROR THEN
6573 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
6574 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
6575 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6576 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
6577 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_ERROR');
6578 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
6579 END IF;
6580 x_return_status := G_RET_STS_ERROR;
6581 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6582 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
6583 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
6584 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6585 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
6586 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_UNEXPECTED_ERROR');
6587 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
6588 END IF;
6589 x_return_status := G_RET_STS_UNEXP_ERROR ;
6590 WHEN OTHERS THEN
6591 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
6592 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6593 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
6594 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from OTHERS sqlcode = '
6595 ||SQLCODE||', sqlerrm = '||SQLERRM);
6596 END IF;
6597 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
6598 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
6599 x_return_status := G_RET_STS_UNEXP_ERROR ;
6600 END publish_to_customer;
6601
6602 /*=========================================================================
6603 API name : check_qa
6604 Type : Private.
6605 Function : This procedure executes all required QA checks during
6606 contract activation process. If the contract is going thru
6607 online process additional checks like Quote To Email address
6608 validation are performed.
6609 Pre-reqs : None.
6610 Parameters :
6611 IN : itemtype IN VARCHAR2 Required
6612 Workflow item type parameter
6613 : itemkey IN VARCHAR2 Required
6614 Workflow item key parameter
6615 : actid IN VARCHAR2 Required
6616 Workflow actid parameter
6617 : funcmode IN VARCHAR2 Required
6618 Workflow function mode parameter
6619 OUT : resultout OUT VARCHAR2(1)
6620 Workflow standard out parameter
6621 Note :
6622 =========================================================================*/
6623 PROCEDURE check_qa
6624 (
6625 itemtype IN VARCHAR2,
6626 itemkey IN VARCHAR2,
6627 actid IN NUMBER,
6628 funcmode IN VARCHAR2,
6629 resultout OUT nocopy VARCHAR2
6630 ) IS
6631
6632 l_api_name CONSTANT VARCHAR2(50) := 'check_qa';
6633 l_api_version CONSTANT NUMBER := 1.0;
6634 l_return_status VARCHAR2(1) := G_RET_STS_SUCCESS;
6635 l_msg_count NUMBER;
6636 l_msg_data VARCHAR2(2000);
6637
6638 CURSOR l_qa_csr ( p_chr_id NUMBER ) IS
6639 SELECT contract_number, contract_number_modifier, qcl_id,
6640 authoring_org_id, inv_organization_id
6641 FROM okc_k_headers_all_b
6642 WHERE id = p_chr_id;
6643
6644 l_contract_id NUMBER;
6645 l_qa_rec l_qa_csr%ROWTYPE;
6646 l_msg_tbl OKC_QA_CHECK_PUB.MSG_TBL_TYPE;
6647 l_count BINARY_INTEGER;
6648 l_msg_ctr BINARY_INTEGER := 1;
6649 l_qto_email VARCHAR2(2000);
6650 l_negotiation_status VARCHAR2(30);
6651 l_qa_calling_process VARCHAR2(30);
6652 l_online_yn VARCHAR2(1);
6653 l_stop VARCHAR2(1) := 'N';
6654 l_email_attr_rec OKS_WF_K_PROCESS_PVT.email_attr_rec;
6655 l_notif_attr_rec OKS_WF_K_PROCESS_PVT.notif_attr_rec;
6656
6657 BEGIN
6658
6659 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6660 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
6661 'Entered '||G_PKG_NAME ||'.'||l_api_name);
6662 END IF;
6663
6664 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6665 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
6666 'itemtype: ' || itemtype ||
6667 ' itemkey: ' || itemkey ||
6668 ' actid: ' || to_char(actid) ||
6669 ' funcmode: ' || funcmode);
6670 END IF;
6671 IF (funcmode = 'RUN') THEN
6672
6673 l_contract_id := wf_engine.GetItemAttrNumber(
6674 itemtype => itemtype,
6675 itemkey => itemkey,
6676 aname => 'CONTRACT_ID');
6677
6678 -- Initialize workflow message attributes to Null.
6679 FOR l_count IN 1 .. 10 LOOP
6680 wf_engine.SetItemAttrText
6681 (
6682 itemtype => itemtype,
6683 itemkey => itemkey,
6684 aname => 'MESSAGE' || l_count,
6685 avalue => NULL
6686 );
6687 END LOOP;
6688
6689 -- Get QA checklist associated with contract
6690 OPEN l_qa_csr (l_contract_id);
6691 FETCH l_qa_csr INTO l_qa_rec;
6692 IF l_qa_csr%NOTFOUND OR l_qa_rec.qcl_id IS NULL THEN
6693 CLOSE l_qa_csr;
6694 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_INVALID_QA_CHECKLIST');
6695 IF l_qa_rec.contract_number_modifier IS NOT NULL THEN
6696 FND_MESSAGE.SET_TOKEN('CONTRACT_NUM',l_qa_rec.contract_number ||' - ' ||
6697 l_qa_rec.contract_number_modifier);
6698 ELSE
6699 FND_MESSAGE.SET_TOKEN('CONTRACT_NUM',l_qa_rec.contract_number);
6700 END IF;
6701 FND_MSG_PUB.add;
6702 IF FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6703 FND_LOG.STRING(FND_LOG.LEVEL_ERROR ,G_MODULE||l_api_name,'Invalid QA checklist ');
6704 END IF;
6705 RAISE FND_API.G_EXC_ERROR;
6706 END IF;
6707 CLOSE l_qa_csr;
6708
6709 -- Initializing the context to global
6710 okc_context.set_okc_org_context(p_org_id => l_qa_rec.authoring_org_id,
6711 p_organization_id => l_qa_rec.inv_organization_id);
6712
6713 -- distinguish the process in which this QA check is invoked
6714 -- it can be either Pending IA or Pending Publication
6715 l_qa_calling_process := get_negotiation_status(p_contract_id => l_contract_id);
6716
6717 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6718 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
6719 'OKC_QA_CHECK_PUB.execute_qa_check_list(p_qcl_id= '||l_qa_rec.qcl_id||
6720 ' p_chr_id ='||l_contract_id||')');
6721 END IF;
6722 -- Execute the default and service contracts QA checklists
6723 OKC_QA_CHECK_PUB.execute_qa_check_list
6724 (
6725 p_api_version => l_api_version,
6726 p_init_msg_list => OKC_API.G_FALSE,
6727 x_return_status => l_return_status,
6728 x_msg_count => l_msg_count,
6729 x_msg_data => l_msg_data,
6730 p_qcl_id => l_qa_rec.qcl_id,
6731 p_chr_id => l_contract_id,
6732 x_msg_tbl => l_msg_tbl
6733 );
6734 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6735 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
6736 'OKC_QA_CHECK_PUB.execute_qa_check_list(x_return_status= '||l_return_status||
6737 ' x_msg_tbl.count ='||l_msg_tbl.count||')');
6738 END IF;
6739 IF l_return_status <> G_RET_STS_SUCCESS THEN
6740 RAISE FND_API.G_EXC_ERROR;
6741 END IF;
6742
6743 -- Check if any of the QA checks have failed. If so populate error message
6744 -- into workflow item attributes and mark the negotiation status coz we want to
6745 -- distinguish between online process QA failure and regular QA failure.
6746 IF l_msg_tbl.count >0 THEN
6747 l_count := l_msg_tbl.first;
6748 LOOP
6749 IF l_msg_tbl(l_count).error_status='E' THEN
6750 -- If this QA check is not called from Online process / Publish Online
6751 -- process then set the negotiation status to 'Internal Approval QA Failed'
6752 IF l_qa_calling_process = G_NEG_STS_PEND_PUBLISH THEN
6753 l_negotiation_status := G_NEG_STS_QPUB_QA_FAIL;
6754 ELSE
6755 l_negotiation_status := G_NEG_STS_IA_QA_FAIL;
6756 END IF;
6757
6758 IF l_msg_ctr <= 10 THEN
6759 wf_engine.SetItemAttrText
6760 (
6761 itemtype => itemtype,
6762 itemkey => itemkey,
6763 aname => 'MESSAGE' || l_msg_ctr,
6764 avalue => l_msg_tbl(l_count).data
6765 );
6766 l_msg_ctr := l_msg_ctr + 1;
6767 END IF;
6768 END IF;
6769 -- Stop populating wf messages when all 10 item attributes are full or
6770 -- we are at the end of the error message table
6771 IF (l_msg_ctr > 10) OR (l_count = l_msg_tbl.LAST) THEN
6772 l_stop := 'Y';
6773 END IF;
6774 EXIT WHEN l_stop = 'Y';
6775 l_count:=l_msg_tbl.next(l_count);
6776 END LOOP;
6777 END IF;
6778
6779 -- Perform these additional checks if the contract is going thru online process
6780 IF l_qa_calling_process = G_NEG_STS_PEND_PUBLISH THEN
6781
6782 -- Message stack is initialized since QA checks above will post
6783 -- 'Contracts QA process has completed successfully' message after completion
6784 FND_MSG_PUB.initialize;
6785 -- Since we are here we know that this QA check is called from Online process
6786 -- There are two qualifying paths for which a process can enter into this IF condition
6787 -- 1.Online process, 2.Publish quote online process
6788 BEGIN
6789 l_qto_email := get_qto_email(p_contract_id => l_contract_id);
6790 IF l_qto_email IS NULL THEN
6791 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6792 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name,'Quote To email not found');
6793 END IF;
6794 RAISE FND_API.G_EXC_ERROR;
6795 END IF;
6796 EXCEPTION
6797 WHEN FND_API.G_EXC_ERROR THEN
6798 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => l_msg_count, p_data => l_msg_data );
6799 -- Set the message only when a vacant message item attribute is available
6800 IF (l_msg_ctr < 10) THEN
6801 wf_engine.SetItemAttrText
6802 (
6803 itemtype => itemtype,
6804 itemkey => itemkey,
6805 aname => 'MESSAGE' || l_msg_ctr,
6806 avalue => substr(get_fnd_message,1,1500)
6807 );
6808 l_msg_ctr := l_msg_ctr + 1;
6809 END IF;
6810
6811 -- Update negotiation status to 'Publish QA Failed'
6812 l_negotiation_status := G_NEG_STS_QPUB_QA_FAIL;
6813 END;
6814 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6815 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
6816 'Negotiation Status: '||l_negotiation_status );
6817 END IF;
6818 -- Once all QA checks are successful, set all the email related attributes
6819 -- so that an email along with Quote can be sent to Quote To contact.
6820 -- THIS IF LOOP SHOULD BE ENTERED ONLY FOR CONTRACTS GOING THRU ONLINE
6821 -- PROCESS AND HAS SUCCESSFULLY COMPLETED ALL THE QA CHECKS.
6822 IF l_negotiation_status IS NULL then
6823 l_email_attr_rec.CONTRACT_ID := l_contract_id;
6824 l_email_attr_rec.ITEM_KEY := itemkey;
6825 l_email_attr_rec.EMAIL_TYPE := G_REPORT_TYPE_QUOTE;
6826 l_email_attr_rec.TO_EMAIL := l_qto_email;
6827 l_email_attr_rec.SENDER_EMAIL := NULL;
6828 l_email_attr_rec.EMAIL_SUBJECT := NULL;
6829 l_email_attr_rec.IH_SUBJECT := NULL;
6830 l_email_attr_rec.IH_MESSAGE := NULL;
6831
6832 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6833 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
6834 'OKS_WF_K_PROCESS_PVT.set_email_attributes('||
6835 ' Contract ID ='||l_contract_id||
6836 ' Email Type ='||l_email_attr_rec.TO_EMAIL||
6837 ' To Email ='||l_qto_email||')');
6838 END IF;
6839 set_email_attributes
6840 (
6841 p_api_version => l_api_version,
6842 p_init_msg_list => OKC_API.G_FALSE,
6843 p_email_attr => l_email_attr_rec,
6844 x_return_status => l_return_status,
6845 x_msg_data => l_msg_data,
6846 x_msg_count => l_msg_count
6847 );
6848 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6849 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
6850 'OKS_WF_K_PROCESS_PVT.set_email_attributes(x_return_status= '||l_return_status||
6851 ' x_msg_count ='||l_msg_count||')');
6852 END IF;
6853 IF l_return_status <> G_RET_STS_SUCCESS THEN
6854 RAISE FND_API.G_EXC_ERROR;
6855 END IF;
6856 END IF;
6857 END IF;
6858
6859 IF l_negotiation_status IS NOT NULL then
6860 -- update process status to either 'Quote Publish QA Failed' or 'Internal Approval QA Failed'
6861 update_negotiation_status
6862 (
6863 p_api_version => 1.0,
6864 p_init_msg_list => G_TRUE,
6865 p_chr_id => l_contract_id,
6866 p_negotiation_status => l_negotiation_status,
6867 x_return_status => l_return_status,
6868 x_msg_count => l_msg_count,
6869 x_msg_data => l_msg_data
6870 );
6871 IF l_return_status <> G_RET_STS_SUCCESS THEN
6872 RAISE FND_API.G_EXC_ERROR;
6873 END IF;
6874
6875 -- In case of errors, set wf attributes that'll be used by the notification
6876 -- which will be rendered by OAF embedded region.
6877 l_notif_attr_rec.CONTRACT_ID := l_contract_id;
6878 l_notif_attr_rec.ITEM_KEY := itemkey;
6879 l_notif_attr_rec.PERFORMER := NULL;
6880 l_notif_attr_rec.NTF_TYPE := G_NTF_TYPE_QA_FAIL;
6881 l_notif_attr_rec.NTF_SUBJECT := NULL;
6882 l_notif_attr_rec.SUBJECT := get_lookup_meaning(l_negotiation_status,G_LKUP_TYPE_NEGO_STATUS);
6883 l_notif_attr_rec.ACCEPT_DECLINE_BY := NULL;
6884
6885 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6886 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
6887 'OKS_WF_K_PROCESS_PVT.set_notification_attributes('||
6888 ' Contract ID ='||l_contract_id||
6889 ' Notification Type ='||l_notif_attr_rec.NTF_TYPE||
6890 ' Subject ='||l_notif_attr_rec.NTF_SUBJECT||')');
6891 END IF;
6892 set_notification_attributes
6893 (
6894 p_api_version => l_api_version,
6895 p_init_msg_list => OKC_API.G_FALSE,
6896 p_notif_attr => l_notif_attr_rec,
6897 x_return_status => l_return_status,
6898 x_msg_data => l_msg_data,
6899 x_msg_count => l_msg_count
6900 );
6901 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6902 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
6903 'OKS_WF_K_PROCESS_PVT.set_notification_attributes(x_return_status= '||
6904 l_return_status||' x_msg_count ='||l_msg_count||')');
6905 END IF;
6906 IF l_return_status <> G_RET_STS_SUCCESS THEN
6907 RAISE FND_API.G_EXC_ERROR;
6908 END IF;
6909 resultout := 'COMPLETE:F';
6910 ELSE
6911 resultout := 'COMPLETE:T';
6912 END IF;
6913
6914 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6915 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
6916 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
6917 END IF;
6918 RETURN;
6919 END IF; -- (funcmode = 'RUN')
6920
6921 IF (funcmode = 'CANCEL') THEN
6922 resultout := 'COMPLETE:';
6923 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6924 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
6925 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
6926 END IF;
6927 RETURN;
6928 END IF; -- (funcmode = 'CANCEL')
6929
6930 IF (funcmode = 'TIMEOUT') THEN
6931 resultout := 'COMPLETE:';
6932 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6933 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
6934 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
6935 END IF;
6936 RETURN;
6937 END IF; -- (funcmode = 'TIMEOUT')
6938 EXCEPTION
6939 WHEN FND_API.G_EXC_ERROR THEN
6940 resultout := 'COMPLETE:F';
6941 l_msg_data := get_fnd_message;
6942 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6943 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
6944 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'Error: Itemtype: '
6945 ||NVL(itemtype,'NULL')||' Itemkey: '||NVL(itemkey,'NULL'));
6946 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,l_msg_data);
6947 END IF;
6948 -- Since this is the primary cause of the error, we have to communicate it
6949 -- even with an expense of loosing a populated message.
6950 IF l_msg_ctr > 10 THEN
6951 l_msg_ctr := 10;
6952 END IF;
6953 wf_engine.SetItemAttrText
6954 (
6955 itemtype => itemtype,
6956 itemkey => itemkey,
6957 aname => 'MESSAGE' || l_msg_ctr,
6958 avalue => l_msg_data
6959 );
6960 BEGIN
6961 l_notif_attr_rec.CONTRACT_ID := l_contract_id;
6962 l_notif_attr_rec.ITEM_KEY := itemkey;
6963 l_notif_attr_rec.PERFORMER := NULL;
6964 l_notif_attr_rec.NTF_TYPE := G_NTF_TYPE_QA_FAIL;
6965 l_notif_attr_rec.NTF_SUBJECT := NULL;
6966 l_notif_attr_rec.SUBJECT := substr(get_fnd_message,1,200);
6967 l_notif_attr_rec.ACCEPT_DECLINE_BY := NULL;
6968 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6969 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
6970 'OKS_WF_K_PROCESS_PVT.set_notification_attributes('||
6971 ' Contract ID ='||l_contract_id||
6972 ' Notification Type ='||l_notif_attr_rec.NTF_TYPE||
6973 ' Subject ='||l_notif_attr_rec.NTF_SUBJECT||')');
6974 END IF;
6975 set_notification_attributes
6976 (
6977 p_api_version => l_api_version,
6978 p_init_msg_list => OKC_API.G_FALSE,
6979 p_notif_attr => l_notif_attr_rec,
6980 x_return_status => l_return_status,
6981 x_msg_data => l_msg_data,
6982 x_msg_count => l_msg_count
6983 );
6984 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6985 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
6986 'OKS_WF_K_PROCESS_PVT.set_notification_attributes(x_return_status= '||
6987 l_return_status||' x_msg_count ='||l_msg_count||')');
6988 END IF;
6989 EXCEPTION
6990 WHEN others THEN
6991 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6992 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
6993 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'G_EXC_ERROR.Others sqlcode = '
6994 ||SQLCODE||', sqlerrm = '||SQLERRM);
6995 END IF;
6996 END;
6997 WHEN others THEN
6998 resultout := 'COMPLETE:F';
6999 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7000 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
7001 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
7002 ||SQLCODE||', sqlerrm = '||SQLERRM);
7003 END IF;
7004 -- Since this is the primary cause of the error, we have to communicate it
7005 -- even with an expense of loosing a populated message.
7006 IF l_msg_ctr > 10 THEN
7007 l_msg_ctr := 10;
7008 END IF;
7009 wf_engine.SetItemAttrText
7010 (
7011 itemtype => itemtype,
7012 itemkey => itemkey,
7013 aname => 'MESSAGE' || l_msg_ctr,
7014 avalue => SQLCODE||':'||SQLERRM
7015 );
7016 BEGIN
7017 l_notif_attr_rec.CONTRACT_ID := l_contract_id;
7018 l_notif_attr_rec.ITEM_KEY := itemkey;
7019 l_notif_attr_rec.PERFORMER := NULL;
7020 l_notif_attr_rec.NTF_TYPE := G_NTF_TYPE_QA_FAIL;
7021 l_notif_attr_rec.NTF_SUBJECT := NULL;
7022 l_notif_attr_rec.SUBJECT := substr(SQLERRM,1,200);
7023 l_notif_attr_rec.ACCEPT_DECLINE_BY := NULL;
7024 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7025 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
7026 'OKS_WF_K_PROCESS_PVT.set_notification_attributes('||
7027 ' Contract ID ='||l_contract_id||
7028 ' Notification Type ='||l_notif_attr_rec.NTF_TYPE||
7029 ' Subject ='||l_notif_attr_rec.NTF_SUBJECT||')');
7030 END IF;
7031 set_notification_attributes
7032 (
7033 p_api_version => l_api_version,
7034 p_init_msg_list => OKC_API.G_FALSE,
7035 p_notif_attr => l_notif_attr_rec,
7036 x_return_status => l_return_status,
7037 x_msg_data => l_msg_data,
7038 x_msg_count => l_msg_count
7039 );
7040 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7041 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
7042 'OKS_WF_K_PROCESS_PVT.set_notification_attributes(x_return_status= '||
7043 l_return_status||' x_msg_count ='||l_msg_count||')');
7044 END IF;
7045 EXCEPTION
7046 WHEN others THEN
7047 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7048 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
7049 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'OTHERS.Others sqlcode = '
7050 ||SQLCODE||', sqlerrm = '||SQLERRM);
7051 END IF;
7052 END;
7053 END check_qa;
7054
7055 /*=========================================================================
7056 API name : customer_action
7057 Type : Private.
7058 Function : This procedure makes the workflow process wait for
7059 customer action.
7060 Pre-reqs : None.
7061 Parameters :
7062 IN : itemtype IN VARCHAR2 Required
7063 Workflow item type parameter
7064 : itemkey IN VARCHAR2 Required
7065 Workflow item key parameter
7066 : actid IN VARCHAR2 Required
7067 Workflow actid parameter
7068 : funcmode IN VARCHAR2 Required
7069 Workflow function mode parameter
7070 OUT : resultout OUT VARCHAR2(1)
7071 Workflow standard out parameter
7072 Note :
7073 =========================================================================*/
7074 PROCEDURE customer_action
7075 (
7076 itemtype IN VARCHAR2,
7077 itemkey IN VARCHAR2,
7078 actid IN NUMBER,
7079 funcmode IN VARCHAR2,
7080 resultout OUT nocopy VARCHAR2
7081 ) IS
7082
7083 l_api_name CONSTANT VARCHAR2(30) := 'customer_action';
7084 l_return_status VARCHAR2(1);
7085 l_msg_count NUMBER;
7086 l_msg_data VARCHAR2(4000);
7087
7088 BEGIN
7089
7090 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7091 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7092 'Entered '||G_PKG_NAME ||'.'||l_api_name);
7093 END IF;
7094 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7095 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7096 'itemtype: ' || itemtype ||
7097 ' itemkey: ' || itemkey ||
7098 ' actid: ' || to_char(actid) ||
7099 ' funcmode: ' || funcmode);
7100 END IF;
7101 IF (funcmode = 'RUN') THEN
7102 resultout := 'NOTIFIED:';
7103 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7104 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7105 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=RUN');
7106 END IF;
7107 RETURN;
7108 END IF; -- (funcmode = 'RUN')
7109
7110 IF (funcmode = 'CANCEL') THEN
7111 resultout := 'COMPLETE:';
7112 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7113 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7114 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
7115 END IF;
7116 RETURN;
7117 END IF; -- (funcmode = 'CANCEL')
7118
7119 IF (funcmode = 'TIMEOUT') THEN
7120 resultout := 'COMPLETE:';
7121 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7122 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7123 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
7124 END IF;
7125 RETURN;
7126 END IF; -- (funcmode = 'TIMEOUT')
7127
7128 EXCEPTION
7129 WHEN others THEN
7130 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7131 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
7132 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
7133 ||SQLCODE||', sqlerrm = '||SQLERRM);
7134 END IF;
7135 wf_core.CONTEXT
7136 (
7137 pkg_name => G_PKG_NAME,
7138 proc_name => l_api_name,
7139 arg1 => itemtype,
7140 arg2 => itemkey,
7141 arg3 => to_char(actid),
7142 arg4 => funcmode,
7143 arg5 => SQLCODE,
7144 arg6 => SQLERRM
7145 );
7146 END customer_action;
7147
7148 /*=========================================================================
7149 API name : get_approval_flag
7150 Type : Private.
7151 Function : This procedure determines whether this contract requires explicit
7152 action by Salesrep when a contract is accepted by customer during
7153 online process. The possible values are 'A' - Automatic,
7154 'M' - Manual and 'N' - Not required.
7155 New contracts always require internal review.
7156 Pre-reqs : None.
7157 Parameters :
7158 IN : itemtype IN VARCHAR2 Required
7159 Workflow item type parameter
7160 : itemkey IN VARCHAR2 Required
7161 Workflow item key parameter
7162 : actid IN VARCHAR2 Required
7163 Workflow actid parameter
7164 : funcmode IN VARCHAR2 Required
7165 Workflow function mode parameter
7166 OUT : resultout OUT VARCHAR2(1)
7167 Workflow standard out parameter
7168 Note :
7169 =========================================================================*/
7170 PROCEDURE get_approval_flag
7171 (
7172 itemtype IN VARCHAR2,
7173 itemkey IN VARCHAR2,
7174 actid IN NUMBER,
7175 funcmode IN VARCHAR2,
7176 resultout OUT nocopy VARCHAR2
7177 ) IS
7178
7179 l_api_name CONSTANT VARCHAR2(30) := 'get_approval_flag';
7180 l_return_status VARCHAR2(1);
7181 l_msg_count NUMBER;
7182 l_msg_data VARCHAR2(4000);
7183
7184 l_contract_id NUMBER;
7185 l_irr_flag VARCHAR2(1);
7186
7187 BEGIN
7188
7189 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7190 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7191 'Entered '||G_PKG_NAME ||'.'||l_api_name);
7192 END IF;
7193 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7194 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7195 'itemtype: ' || itemtype ||
7196 ' itemkey: ' || itemkey ||
7197 ' actid: ' || to_char(actid) ||
7198 ' funcmode: ' || funcmode);
7199 END IF;
7200 IF (funcmode = 'RUN') THEN
7201
7202 l_contract_id := wf_engine.GetItemAttrNumber(
7203 itemtype => itemtype,
7204 itemkey => itemkey,
7205 aname => 'CONTRACT_ID');
7206
7207 -- Get submit for approval flag to determine if this contract
7208 -- requires explict action by salesrep.
7209 l_irr_flag := wf_engine.GetItemAttrText(
7210 itemtype => itemtype,
7211 itemkey => itemkey,
7212 aname => 'IRR_FLAG');
7213
7214 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7215 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7216 'Irr Flag: ' ||NVL(l_irr_flag,'NULL'));
7217 END IF;
7218
7219 -- 1. Require explicit action from Salesrep
7220 -- 2. For new contracts, Salesrep action is always required
7221 IF NVL(l_irr_flag,G_IRR_FLAG_REQD) IN (G_IRR_FLAG_MANUAL, G_IRR_FLAG_REQD) THEN
7222 resultout := 'COMPLETE:MANUAL';
7223 update_negotiation_status
7224 (
7225 p_api_version => 1.0,
7226 p_init_msg_list => G_FALSE,
7227 p_chr_id => l_contract_id,
7228 p_negotiation_status => G_NEG_STS_QUOTE_ACPTD,
7229 x_return_status => l_return_status,
7230 x_msg_count => l_msg_count,
7231 x_msg_data => l_msg_data
7232 );
7233 IF l_return_status <> G_RET_STS_SUCCESS THEN
7234 RAISE FND_API.G_EXC_ERROR;
7235 END IF;
7236 -- 3. Doesn't require explicit action from Salesrep
7237 ELSE
7238 resultout := 'COMPLETE:';
7239 END IF;
7240
7241 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7242 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7243 'Resultout: ' || resultout);
7244 END IF;
7245 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7246 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7247 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=RUN');
7248 END IF;
7249 RETURN;
7250 END IF; -- (funcmode = 'RUN')
7251
7252 IF (funcmode = 'CANCEL') THEN
7253 resultout := 'COMPLETE:';
7254 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7255 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7256 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
7257 END IF;
7258 RETURN;
7259 END IF; -- (funcmode = 'CANCEL')
7260
7261 IF (funcmode = 'TIMEOUT') THEN
7262 resultout := 'COMPLETE:';
7263 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7264 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7265 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
7266 END IF;
7267 RETURN;
7268 END IF; -- (funcmode = 'TIMEOUT')
7269
7270 EXCEPTION
7271 WHEN FND_API.G_EXC_ERROR THEN
7272 l_msg_data := get_fnd_message;
7273 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7274 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
7275 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'Error: Itemtype: '
7276 ||NVL(itemtype,'NULL')||' Itemkey: '||NVL(itemkey,'NULL'));
7277 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,l_msg_data);
7278 END IF;
7279 wf_core.CONTEXT
7280 (
7281 pkg_name => G_PKG_NAME,
7282 proc_name => l_api_name,
7283 arg1 => itemtype,
7284 arg2 => itemkey,
7285 arg3 => l_msg_data
7286 );
7287 WHEN others THEN
7288 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7289 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
7290 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
7291 ||SQLCODE||', sqlerrm = '||SQLERRM);
7292 END IF;
7293 wf_core.CONTEXT
7294 (
7295 pkg_name => G_PKG_NAME,
7296 proc_name => l_api_name,
7297 arg1 => itemtype,
7298 arg2 => itemkey,
7299 arg3 => to_char(actid),
7300 arg4 => funcmode,
7301 arg5 => SQLCODE,
7302 arg6 => SQLERRM
7303 );
7304 END get_approval_flag;
7305
7306 /*=========================================================================
7307 API name : is_approval_required
7308 Type : Private.
7309 Function : This procedure determines whether this contract requires
7310 internal review or not. The possible values are 'A' Automatic
7311 'M' manual, 'Y' Required and 'N' Not required.
7312 New contracts always require internal review.
7313 Pre-reqs : None.
7314 Parameters :
7315 IN : itemtype IN VARCHAR2 Required
7316 Workflow item type parameter
7317 : itemkey IN VARCHAR2 Required
7318 Workflow item key parameter
7319 : actid IN VARCHAR2 Required
7320 Workflow actid parameter
7321 : funcmode IN VARCHAR2 Required
7322 Workflow function mode parameter
7323 OUT : resultout OUT VARCHAR2(1)
7324 Workflow standard out parameter
7325 Note :
7326 =========================================================================*/
7327 PROCEDURE is_approval_required
7328 (
7329 itemtype IN VARCHAR2,
7330 itemkey IN VARCHAR2,
7331 actid IN NUMBER,
7332 funcmode IN VARCHAR2,
7333 resultout OUT nocopy VARCHAR2
7334 ) IS
7335
7336 l_api_name CONSTANT VARCHAR2(30) := 'is_approval_required';
7337 l_return_status VARCHAR2(1);
7338 l_msg_count NUMBER;
7339 l_msg_data VARCHAR2(4000);
7340
7341 l_irr_flag VARCHAR2(1);
7342 l_contract_id NUMBER;
7343 BEGIN
7344
7345 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7346 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7347 'Entered '||G_PKG_NAME ||'.'||l_api_name);
7348 END IF;
7349 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7350 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7351 'itemtype: ' || itemtype ||
7352 ' itemkey: ' || itemkey ||
7353 ' actid: ' || to_char(actid) ||
7354 ' funcmode: ' || funcmode);
7355 END IF;
7356 IF (funcmode = 'RUN') THEN
7357
7358 l_irr_flag := get_irr_flag(p_contract_id => NULL,p_item_key => itemkey);
7359 IF l_irr_flag IS NOT NULL THEN
7360 resultout := 'COMPLETE:'||l_irr_flag;
7361 ELSE
7362 RAISE FND_API.G_EXC_ERROR;
7363 END IF;
7364
7365 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7366 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7367 'Resultout: ' || resultout);
7368 END IF;
7369 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7370 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7371 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=RUN');
7372 END IF;
7373 RETURN;
7374 END IF; -- (funcmode = 'RUN')
7375
7376 IF (funcmode = 'CANCEL') THEN
7377 resultout := 'COMPLETE:';
7378 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7379 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7380 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
7381 END IF;
7382 RETURN;
7383 END IF; -- (funcmode = 'CANCEL')
7384
7385 IF (funcmode = 'TIMEOUT') THEN
7386 resultout := 'COMPLETE:';
7387 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7388 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7389 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
7390 END IF;
7391 RETURN;
7392 END IF; -- (funcmode = 'TIMEOUT')
7393
7394 EXCEPTION
7395 WHEN FND_API.G_EXC_ERROR THEN
7396 l_msg_data := get_fnd_message;
7397 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7398 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
7399 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'Error: Itemtype: '
7400 ||NVL(itemtype,'NULL')||' Itemkey: '||NVL(itemkey,'NULL'));
7401 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,l_msg_data);
7402 END IF;
7403 wf_core.CONTEXT
7404 (
7405 pkg_name => G_PKG_NAME,
7406 proc_name => l_api_name,
7407 arg1 => itemtype,
7408 arg2 => itemkey,
7409 arg3 => l_msg_data
7410 );
7411 WHEN others THEN
7412 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7413 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
7414 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
7415 ||SQLCODE||', sqlerrm = '||SQLERRM);
7416 END IF;
7417 wf_core.CONTEXT
7418 (
7419 pkg_name => G_PKG_NAME,
7420 proc_name => l_api_name,
7421 arg1 => itemtype,
7422 arg2 => itemkey,
7423 arg3 => to_char(actid),
7424 arg4 => funcmode,
7425 arg5 => SQLCODE,
7426 arg6 => SQLERRM
7427 );
7428 END is_approval_required;
7429
7430 /*=========================================================================
7431 API name : process_negotiation_status
7432 Type : Private.
7433 Function : This procedure updates renewal status in OKS_K_HEADERS_B
7434 and bumps up the version. This is invoked from the workflow.
7435 Pre-reqs : None.
7436 Parameters :
7437 IN : itemtype IN VARCHAR2 Required
7438 Workflow item type parameter
7439 : itemkey IN VARCHAR2 Required
7440 Workflow item key parameter
7441 : actid IN VARCHAR2 Required
7442 Workflow actid parameter
7443 : funcmode IN VARCHAR2 Required
7444 Workflow function mode parameter
7445 OUT : resultout OUT VARCHAR2(1)
7446 Workflow standard out parameter
7447 Note :
7448 =========================================================================*/
7449 PROCEDURE process_negotiation_status
7450 (
7451 itemtype IN VARCHAR2,
7452 itemkey IN VARCHAR2,
7453 actid IN NUMBER,
7454 funcmode IN VARCHAR2,
7455 resultout OUT nocopy VARCHAR2
7456 ) IS
7457
7458 l_api_name CONSTANT VARCHAR2(30) := 'process_negotiation_status';
7459 l_return_status VARCHAR2(1);
7460 l_msg_count NUMBER;
7461 l_msg_data VARCHAR2(4000);
7462
7463 l_contract_id NUMBER;
7464 l_negotiation_status VARCHAR2(30);
7465 l_irr_flag VARCHAR2(1);
7466
7467 BEGIN
7468
7469 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7470 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7471 'Entered '||G_PKG_NAME ||'.'||l_api_name);
7472 END IF;
7473 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7474 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7475 'itemtype: ' || itemtype ||
7476 ' itemkey: ' || itemkey ||
7477 ' actid: ' || to_char(actid) ||
7478 ' funcmode: ' || funcmode);
7479 END IF;
7480 IF (funcmode = 'RUN') THEN
7481
7482 l_contract_id := wf_engine.GetItemAttrNumber(
7483 itemtype => itemtype,
7484 itemkey => itemkey,
7485 aname => 'CONTRACT_ID');
7486
7487 l_negotiation_status := wf_engine.GetActivityAttrText(
7488 itemtype => itemtype,
7489 itemkey => itemkey,
7490 actid => actid,
7491 aname => 'TARGET_NEGO_STATUS');
7492
7493 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7494 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7495 'Contract Id: ' || l_contract_id ||
7496 ' Negotiation status: ' || l_negotiation_status);
7497 END IF;
7498
7499 -- If internal approval is required update the negotiation status to
7500 -- Pending Internal review else Pending Activation.
7501 IF l_negotiation_status = G_NEG_STS_PEND_IA THEN
7502 l_irr_flag := get_irr_flag(p_contract_id => l_contract_id,p_item_key => itemkey);
7503 IF l_irr_flag = G_IRR_FLAG_REQD THEN
7504 l_negotiation_status := G_NEG_STS_PEND_IA;
7505 ELSIF l_irr_flag = G_IRR_FLAG_NOT_REQD THEN
7506 l_negotiation_status := G_NEG_STS_PEND_ACTIVATION;
7507 ELSE
7508 RAISE FND_API.G_EXC_ERROR;
7509 END IF;
7510 END IF;
7511
7512 update_negotiation_status
7513 (
7514 p_api_version => 1.0,
7515 p_init_msg_list => G_TRUE,
7516 p_chr_id => l_contract_id,
7517 p_negotiation_status => l_negotiation_status,
7518 x_return_status => l_return_status,
7519 x_msg_count => l_msg_count,
7520 x_msg_data => l_msg_data
7521 );
7522 IF l_return_status <> G_RET_STS_SUCCESS THEN
7523 RAISE NegStatusUpdateException;
7524 END IF;
7525
7526 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7527 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7528 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=RUN');
7529 END IF;
7530 RETURN;
7531 END IF; -- (funcmode = 'RUN')
7532
7533 IF (funcmode = 'CANCEL') THEN
7534 resultout := 'COMPLETE:';
7535 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7536 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7537 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
7538 END IF;
7539 RETURN;
7540 END IF; -- (funcmode = 'CANCEL')
7541
7542 IF (funcmode = 'TIMEOUT') THEN
7543 resultout := 'COMPLETE:';
7544 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7545 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7546 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
7547 END IF;
7548 RETURN;
7549 END IF; -- (funcmode = 'TIMEOUT')
7550
7551 EXCEPTION
7552 WHEN NegStatusUpdateException THEN
7553 l_msg_data := get_fnd_message;
7554 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7555 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
7556 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.NegStatusUpdateException'
7557 ||' Itemtype: '||NVL(itemtype,'NULL')||' Itemkey: '||NVL(itemkey,'NULL'));
7558 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,l_msg_data);
7559 END IF;
7560 wf_core.CONTEXT
7561 (
7562 pkg_name => G_PKG_NAME,
7563 proc_name => l_api_name,
7564 arg1 => itemtype,
7565 arg2 => itemkey,
7566 arg3 => l_msg_data
7567 );
7568 WHEN FND_API.G_EXC_ERROR THEN
7569 l_msg_data := get_fnd_message;
7570 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7571 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
7572 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'Error: Itemtype: '
7573 ||NVL(itemtype,'NULL')||' Itemkey: '||NVL(itemkey,'NULL'));
7574 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,l_msg_data);
7575 END IF;
7576 wf_core.CONTEXT
7577 (
7578 pkg_name => G_PKG_NAME,
7579 proc_name => l_api_name,
7580 arg1 => itemtype,
7581 arg2 => itemkey,
7582 arg3 => l_msg_data
7583 );
7584 WHEN others THEN
7585 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7586 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
7587 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
7588 ||SQLCODE||', sqlerrm = '||SQLERRM);
7589 END IF;
7590 wf_core.CONTEXT
7591 (
7592 pkg_name => G_PKG_NAME,
7593 proc_name => l_api_name,
7594 arg1 => itemtype,
7595 arg2 => itemkey,
7596 arg3 => to_char(actid),
7597 arg4 => funcmode,
7598 arg5 => SQLCODE,
7599 arg6 => SQLERRM
7600 );
7601 END process_negotiation_status;
7602
7603 /*=========================================================================
7604 API name : k_approval_start
7605 Type : Private.
7606 Function : This is a wrapper procedure to launch the approval
7607 workflow. Used to make it autonomous.
7608 Pre-reqs : None.
7609 Parameters :
7610 IN : p_api_version IN NUMBER Required
7611 Api version
7612 : p_init_msg_list IN VARCHAR2 Required
7613 Initialize message stack parameter
7614 : p_cotract_id IN NUMBER Required
7615 Contract header Id
7616 : p_process_id IN NUMBER Required
7617 Process definition id of approval process.
7618 : p_commit IN VARCHAR2 Required
7619 Commit or not to commit. That is the question :)
7620 OUT : x_return_status OUT VARCHAR2(1)
7621 Api return status
7622 : x_msg_count OUT NUMBER
7623 Count of message on error stack
7624 : x_msg_data OUT VARCHAR2
7625 Actual error messages on error stack
7626 Note :
7627 =========================================================================*/
7628 PROCEDURE k_approval_start
7629 (
7630 p_api_version IN NUMBER,
7631 p_init_msg_list IN VARCHAR2,
7632 p_contract_id IN NUMBER,
7633 p_process_id IN NUMBER,
7634 p_commit IN VARCHAR2,
7635 p_wf_item_key IN VARCHAR2,
7636 x_return_status OUT NOCOPY VARCHAR2,
7637 x_msg_data OUT NOCOPY VARCHAR2,
7638 x_msg_count OUT NOCOPY NUMBER
7639 ) AS
7640
7641 PRAGMA AUTONOMOUS_TRANSACTION;
7642
7643 l_api_name CONSTANT VARCHAR2(50) := 'k_approval_start';
7644 l_user_id NUMBER;
7645 l_resp_id NUMBER;
7646 l_resp_appl_id NUMBER;
7647 l_security_group_id NUMBER;
7648
7649 BEGIN
7650 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7651 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7652 'Entered '||G_PKG_NAME ||'.'||l_api_name);
7653 END IF;
7654 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7655 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7656 'p_contract_id: ' || p_contract_id ||
7657 ' p_process_id: ' || p_process_id ||
7658 ' p_commit: ' || p_commit ||
7659 ' p_wf_item_key: ' || p_wf_item_key);
7660 END IF;
7661 BEGIN
7662 l_user_id := wf_engine.GetItemAttrNumber
7663 (
7664 itemtype => G_ITEM_TYPE,
7665 itemkey => p_wf_item_key,
7666 aname => 'USER_ID'
7667 );
7668 EXCEPTION
7669 WHEN OTHERS THEN
7670 wf_engine.AddItemAttr
7671 (
7672 itemtype => G_ITEM_TYPE,
7673 itemkey => p_wf_item_key,
7674 aname => 'USER_ID'
7675 );
7676 wf_engine.SetItemAttrNumber
7677 (
7678 itemtype => G_ITEM_TYPE,
7679 itemkey => p_wf_item_key,
7680 aname => 'USER_ID',
7681 avalue => null
7682 );
7683 END;
7684 BEGIN
7685 l_resp_id := wf_engine.GetItemAttrNumber
7686 (
7687 itemtype => G_ITEM_TYPE,
7688 itemkey => p_wf_item_key,
7689 aname => 'RESP_ID'
7690 );
7691 EXCEPTION
7692 WHEN OTHERS THEN
7693 wf_engine.AddItemAttr
7694 (
7695 itemtype => G_ITEM_TYPE,
7696 itemkey => p_wf_item_key,
7697 aname => 'RESP_ID'
7698 );
7699 wf_engine.SetItemAttrNumber
7700 (
7701 itemtype => G_ITEM_TYPE,
7702 itemkey => p_wf_item_key,
7703 aname => 'RESP_ID',
7704 avalue => null
7705 );
7706 END;
7707 BEGIN
7708 l_resp_appl_id := wf_engine.GetItemAttrNumber
7709 (
7710 itemtype => G_ITEM_TYPE,
7711 itemkey => p_wf_item_key,
7712 aname => 'RESP_APPL_ID'
7713 );
7714
7715 EXCEPTION
7716 WHEN OTHERS THEN
7717 wf_engine.AddItemAttr
7718 (
7719 itemtype => G_ITEM_TYPE,
7720 itemkey => p_wf_item_key,
7721 aname => 'RESP_APPL_ID'
7722 );
7723 wf_engine.SetItemAttrNumber
7724 (
7725 itemtype => G_ITEM_TYPE,
7726 itemkey => p_wf_item_key,
7727 aname => 'RESP_APPL_ID',
7728 avalue => null
7729 );
7730 END;
7731 BEGIN
7732 l_security_group_id := wf_engine.GetItemAttrNumber
7733 (
7734 itemtype => G_ITEM_TYPE,
7735 itemkey => p_wf_item_key,
7736 aname => 'SECURITY_GROUP_ID'
7737 );
7738 EXCEPTION
7739 WHEN OTHERS THEN
7740 wf_engine.AddItemAttr
7741 (
7742 itemtype => G_ITEM_TYPE,
7743 itemkey => p_wf_item_key,
7744 aname => 'SECURITY_GROUP_ID'
7745 );
7746 wf_engine.SetItemAttrNumber
7747 (
7748 itemtype => G_ITEM_TYPE,
7749 itemkey => p_wf_item_key,
7750 aname => 'SECURITY_GROUP_ID',
7751 avalue => null
7752 );
7753 END;
7754
7755 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7756 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
7757 'OKC_CONTRACT_APPROVAL_PUB.k_approval_start(p_contract_id= '||
7758 p_contract_id||' p_process_id='||p_process_id||')');
7759 END IF;
7760
7761 BEGIN
7762 OKC_CONTRACT_APPROVAL_PUB.k_approval_start
7763 (
7764 p_api_version => p_api_version,
7765 p_init_msg_list => p_init_msg_list,
7766 x_return_status => x_return_status,
7767 x_msg_count => x_msg_count,
7768 x_msg_data => x_msg_data,
7769 p_contract_id => p_contract_id,
7770 p_process_id => p_process_id,
7771 p_do_commit => p_commit,
7772 p_access_level => 'Y',
7773 p_user_id => l_user_id,
7774 p_resp_id => l_resp_id,
7775 p_resp_appl_id => l_resp_appl_id,
7776 p_security_group_id => l_security_group_id
7777 );
7778 EXCEPTION
7779 WHEN OTHERS THEN
7780 x_return_status := G_RET_STS_UNEXP_ERROR;
7781 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7782 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name,
7783 'In Others exception for OKS_WF_K_PROCESS_PVT.k_approval_start');
7784 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name,
7785 'Error: '|| substr(SQLERRM,1,500));
7786 END IF;
7787 END;
7788 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7789 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
7790 'OKC_CONTRACT_APPROVAL_PUB.k_approval_start(x_return_status= '||
7791 x_return_status||' x_msg_count='||x_msg_count||')');
7792 END IF;
7793 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7794 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7795 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
7796 END IF;
7797 END;
7798
7799 /*=========================================================================
7800 API name : launch_approval_wf
7801 Type : Private.
7802 Function : This procedure launches the approval workflow.
7803 Pre-reqs : None.
7804 Parameters :
7805 IN : p_api_version IN NUMBER Required
7806 Api version
7807 : p_init_msg_list IN VARCHAR2 Required
7808 Initialize message stack parameter
7809 : p_chr_id IN NUMBER Required
7810 Contract header Id
7811 : p_negotiation_status IN VARCHAR2 Required
7812 New negotiation status that is to be updated.
7813 OUT : x_return_status OUT VARCHAR2(1)
7814 Api return status
7815 : x_msg_count OUT NUMBER
7816 Count of message on error stack
7817 : x_msg_data OUT VARCHAR2
7818 Actual error messages on error stack
7819 Note :
7820 =========================================================================*/
7821 PROCEDURE launch_approval_wf
7822 (
7823 itemtype IN VARCHAR2,
7824 itemkey IN VARCHAR2,
7825 actid IN NUMBER,
7826 funcmode IN VARCHAR2,
7827 resultout OUT nocopy VARCHAR2
7828 ) IS
7829
7830 l_api_name CONSTANT VARCHAR2(50) := 'launch_approval_wf';
7831 l_api_version CONSTANT NUMBER := 1.0;
7832 l_return_status VARCHAR2(1) := G_RET_STS_SUCCESS;
7833 l_msg_count NUMBER;
7834 l_msg_data VARCHAR2(2000);
7835
7836 CURSOR l_pdf_csr(p_chr_id number) is
7837 SELECT pdf_id
7838 FROM okc_k_processes kp, okc_process_defs_b pd
7839 WHERE kp.chr_id=p_chr_id and kp.pdf_id=pd.id and pd.usage='APPROVE';
7840
7841 l_contract_id NUMBER;
7842 l_pdf_id NUMBER;
7843 l_notif_attr_rec OKS_WF_K_PROCESS_PVT.notif_attr_rec;
7844
7845 BEGIN
7846 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7847 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7848 'Entered '||G_PKG_NAME ||'.'||l_api_name);
7849 END IF;
7850 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7851 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7852 'itemtype: ' || itemtype ||
7853 ' itemkey: ' || itemkey ||
7854 ' actid: ' || to_char(actid) ||
7855 ' funcmode: ' || funcmode);
7856 END IF;
7857 IF (funcmode = 'RUN') THEN
7858
7859 l_contract_id := wf_engine.GetItemAttrNumber(
7860 itemtype => itemtype,
7861 itemkey => itemkey,
7862 aname => 'CONTRACT_ID');
7863
7864 OPEN l_pdf_csr(l_contract_id);
7865 FETCH l_pdf_csr into l_pdf_id;
7866 CLOSE l_pdf_csr;
7867
7868 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7869 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,'Pdf Id: ' || l_pdf_id);
7870 END IF;
7871
7872 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7873 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
7874 'OKC_CONTRACT_APPROVAL_PUB.k_approval_start(p_contract_id= '||
7875 l_contract_id||' p_process_id='||l_pdf_id||')');
7876 END IF;
7877 BEGIN
7878 k_approval_start
7879 (
7880 p_api_version => l_api_version,
7881 p_init_msg_list => G_FALSE,
7882 x_return_status => l_return_status,
7883 x_msg_count => l_msg_count,
7884 x_msg_data => l_msg_data,
7885 p_contract_id => l_contract_id,
7886 p_process_id => l_pdf_id,
7887 p_commit => G_TRUE,
7888 p_wf_item_key => itemkey
7889 );
7890 EXCEPTION
7891 WHEN OTHERS THEN
7892 l_return_status := G_RET_STS_UNEXP_ERROR;
7893 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7894 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name,
7895 'In Others exception for OKS_WF_K_PROCESS_PVT.k_approval_start');
7896 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name,
7897 'Error: '|| substr(SQLERRM,1,500));
7898 END IF;
7899 END;
7900 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7901 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
7902 'OKC_CONTRACT_APPROVAL_PUB.k_approval_start(x_return_status= '||
7903 l_return_status||' x_msg_count='||l_msg_count||')');
7904 END IF;
7905
7906 IF l_return_status <> G_RET_STS_SUCCESS THEN
7907 update_negotiation_status
7908 (
7909 p_api_version => l_api_version,
7910 p_init_msg_list => G_FALSE,
7911 p_chr_id => l_contract_id,
7912 p_negotiation_status => G_NEG_STS_IA_FAIL,
7913 x_return_status => l_return_status,
7914 x_msg_count => l_msg_count,
7915 x_msg_data => l_msg_data
7916 );
7917 IF l_return_status <> G_RET_STS_SUCCESS THEN
7918 RAISE FND_API.G_EXC_ERROR;
7919 END IF;
7920
7921 -- In case of errors, set wf attributes that'll be used by the notification
7922 -- and will be rendered by OAF embedded region.
7923 l_notif_attr_rec.CONTRACT_ID := l_contract_id;
7924 l_notif_attr_rec.ITEM_KEY := itemkey;
7925 l_notif_attr_rec.PERFORMER := NULL;
7926 l_notif_attr_rec.NTF_TYPE := G_NTF_TYPE_ERROR;
7927 l_notif_attr_rec.NTF_SUBJECT := NULL;
7928 l_notif_attr_rec.SUBJECT := get_lookup_meaning(G_NEG_STS_IA_FAIL,G_LKUP_TYPE_NEGO_STATUS);
7929 l_notif_attr_rec.ACCEPT_DECLINE_BY := NULL;
7930 l_notif_attr_rec.MSGS_FROM_STACK_YN:= 'Y';
7931
7932 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7933 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
7934 'OKS_WF_K_PROCESS_PVT.set_notification_attributes('||
7935 ' Contract ID ='||l_contract_id||
7936 ' Notification Type ='||l_notif_attr_rec.NTF_TYPE||
7937 ' Subject ='||l_notif_attr_rec.NTF_SUBJECT||')');
7938 END IF;
7939 set_notification_attributes
7940 (
7941 p_api_version => l_api_version,
7942 p_init_msg_list => OKC_API.G_FALSE,
7943 p_notif_attr => l_notif_attr_rec,
7944 x_return_status => l_return_status,
7945 x_msg_data => l_msg_data,
7946 x_msg_count => l_msg_count
7947 );
7948 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7949 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
7950 'OKS_WF_K_PROCESS_PVT.set_notification_attributes(x_return_status= '||
7951 l_return_status||' x_msg_count ='||l_msg_count||')');
7952 END IF;
7953 IF l_return_status <> G_RET_STS_SUCCESS THEN
7954 RAISE FND_API.G_EXC_ERROR;
7955 END IF;
7956 resultout := 'COMPLETE:ERROR';
7957 ELSE
7958 resultout := 'NOTIFIED:';
7959 END IF;
7960
7961 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7962 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7963 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
7964 END IF;
7965 RETURN;
7966 END IF; -- (funcmode = 'RUN')
7967
7968 IF (funcmode = 'CANCEL') THEN
7969 resultout := 'COMPLETE:';
7970 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7971 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7972 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
7973 END IF;
7974 RETURN;
7975 END IF; -- (funcmode = 'CANCEL')
7976
7977 IF (funcmode = 'TIMEOUT') THEN
7978 resultout := 'COMPLETE:';
7979 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7980 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7981 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
7982 END IF;
7983 RETURN;
7984 END IF; -- (funcmode = 'TIMEOUT')
7985 EXCEPTION
7986 WHEN FND_API.G_EXC_ERROR THEN
7987 resultout := 'COMPLETE:ERROR';
7988 l_msg_data := get_fnd_message;
7989 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7990 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
7991 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'Error: Itemtype: '
7992 ||NVL(itemtype,'NULL')||' Itemkey: '||NVL(itemkey,'NULL'));
7993 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,l_msg_data);
7994 END IF;
7995 wf_core.CONTEXT
7996 (
7997 pkg_name => G_PKG_NAME,
7998 proc_name => l_api_name,
7999 arg1 => itemtype,
8000 arg2 => itemkey,
8001 arg3 => l_msg_data
8002 );
8003 WHEN others THEN
8004 resultout := 'COMPLETE:ERROR';
8005 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8006 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
8007 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
8008 ||SQLCODE||', sqlerrm = '||SQLERRM);
8009 END IF;
8010 wf_core.CONTEXT
8011 (
8012 pkg_name => G_PKG_NAME,
8013 proc_name => l_api_name,
8014 arg1 => itemtype,
8015 arg2 => itemkey,
8016 arg3 => to_char(actid),
8017 arg4 => funcmode,
8018 arg5 => SQLCODE,
8019 arg6 => SQLERRM
8020 );
8021 END launch_approval_wf;
8022
8023 /*=========================================================================
8024 API name : accept_quote
8025 Type : Private.
8026 Function : This procedure will complete the workflow activities after
8027 quote has been accepted by Salesrep on behalf of customer
8028 while waiting for salesrep / customer action.
8029 Pre-reqs : None.
8030 Parameters :
8031 IN : p_api_version IN NUMBER Required
8032 Api version
8033 : p_init_msg_list IN VARCHAR2 Required
8034 Initialize message stack parameter
8035 : p_contract_id IN NUMBER Required
8036 Contract header Id
8037 : p_item_key IN VARCHAR2 Required
8038 Contract process workflow's item key.
8039 : p_accept_confirm_yn IN VARCHAR2 Required
8040 Flag to send acceptance confirmation eamil to customer
8041 after quote has been accepted. Valid values are 'Y', 'N'.
8042 OUT : x_return_status OUT VARCHAR2(1)
8043 Api return status
8044 : x_msg_count OUT NUMBER
8045 Count of message on error stack
8046 : x_msg_data OUT VARCHAR2
8047 Actual error messages on error stack
8048 Note :
8049 =========================================================================*/
8050 PROCEDURE accept_quote
8051 (
8052
8053 p_api_version IN NUMBER,
8054 p_init_msg_list IN VARCHAR2,
8055 p_commit IN VARCHAR2 DEFAULT 'F',
8056 p_contract_id IN NUMBER,
8057 p_item_key IN VARCHAR2,
8058 p_accept_confirm_yn IN VARCHAR2,
8059 x_return_status OUT NOCOPY VARCHAR2,
8060 x_msg_data OUT NOCOPY VARCHAR2,
8061 x_msg_count OUT NOCOPY NUMBER
8062 ) IS
8063
8064 l_api_version CONSTANT NUMBER := 1.0;
8065 l_api_name CONSTANT VARCHAR2(30) := 'accept_quote';
8066
8067 l_item_key wf_items.item_key%TYPE;
8068 l_activity_name VARCHAR2(30);
8069 l_email_attr_rec OKS_WF_K_PROCESS_PVT.email_attr_rec;
8070
8071 BEGIN
8072 -- start debug log
8073 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8074 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
8075 'Entered '||G_PKG_NAME ||'.'||l_api_name);
8076 END IF;
8077 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8078 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
8079 'Item key: ' || NVL(p_item_key,'NULL') ||
8080 ' Accept Confirm Flag: ' || p_accept_confirm_yn);
8081 END IF;
8082
8083 DBMS_TRANSACTION.SAVEPOINT(l_api_name);
8084 -- Standard call to check for call compatibility.
8085 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
8086 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8087 END IF;
8088
8089 -- Initialize message list if p_init_msg_list is set to TRUE.
8090 IF FND_API.to_Boolean( p_init_msg_list ) THEN
8091 FND_MSG_PUB.initialize;
8092 END IF;
8093
8094 -- Initialize API return status to success
8095 x_return_status := G_RET_STS_SUCCESS;
8096
8097 IF p_contract_id IS NULL THEN
8098 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_INVD_CONTRACT_ID');
8099 FND_MESSAGE.SET_TOKEN('HDR_ID','NULL');
8100 FND_MSG_PUB.add;
8101 RAISE FND_API.G_EXC_ERROR;
8102 END IF;
8103
8104 IF p_item_key IS NULL THEN
8105 l_item_key := get_wf_item_key(p_contract_id => p_contract_id);
8106 IF l_item_key IS NULL THEN
8107 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INVALID_WF_ITEM_KEY');
8108 FND_MSG_PUB.add;
8109 RAISE FND_API.G_EXC_ERROR;
8110 END IF;
8111 ELSE
8112 l_item_key := p_item_key;
8113 END IF;
8114
8115 -- Check if a confirmation email has to be delivered or not
8116 wf_engine.SetItemAttrText
8117 (
8118 itemtype => G_ITEM_TYPE,
8119 itemkey => l_item_key,
8120 aname => 'SEND_CONFIRM',
8121 avalue => p_accept_confirm_yn
8122 );
8123
8124 IF p_accept_confirm_yn = 'Y' THEN
8125 l_email_attr_rec.CONTRACT_ID := p_contract_id;
8126 l_email_attr_rec.ITEM_KEY := l_item_key;
8127 l_email_attr_rec.EMAIL_TYPE := G_REPORT_TYPE_ACCEPT;
8128 l_email_attr_rec.TO_EMAIL := NULL;
8129 l_email_attr_rec.SENDER_EMAIL := NULL;
8130 l_email_attr_rec.EMAIL_SUBJECT := NULL;
8131 l_email_attr_rec.IH_SUBJECT := NULL;
8132 l_email_attr_rec.IH_MESSAGE := NULL;
8133
8134 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8135 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
8136 'OKS_WF_K_PROCESS_PVT.set_email_attributes('||
8137 ' Contract ID ='||p_contract_id||
8138 ' Email Type ='||l_email_attr_rec.EMAIL_TYPE||')');
8139 END IF;
8140 set_email_attributes
8141 (
8142 p_api_version => l_api_version,
8143 p_init_msg_list => OKC_API.G_FALSE,
8144 p_email_attr => l_email_attr_rec,
8145 x_return_status => x_return_status,
8146 x_msg_data => x_msg_data,
8147 x_msg_count => x_msg_count
8148 );
8149 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8150 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
8151 'OKS_WF_K_PROCESS_PVT.set_email_attributes(x_return_status= '||
8152 x_return_status||' x_msg_count ='||x_msg_count||')');
8153 END IF;
8154 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
8155 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8156 ELSIF x_return_status = G_RET_STS_ERROR THEN
8157 RAISE FND_API.G_EXC_ERROR;
8158 END IF;
8159 END IF;
8160
8161 l_activity_name := get_notified_activity
8162 (
8163 p_item_type => G_ITEM_TYPE
8164 ,p_item_key => l_item_key
8165 );
8166 IF l_activity_name NOT IN (G_SALESREP_ACTION, G_CUST_ACTION) THEN
8167 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INV_SALESREP_ACPT_ACTION');
8168 FND_MSG_PUB.add;
8169 RAISE FND_API.G_EXC_ERROR;
8170 END IF;
8171
8172 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8173 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
8174 'Item key: ' || l_item_key ||
8175 ' Completing activity - Activity Name: ' || l_activity_name);
8176 END IF;
8177
8178 complete_activity
8179 (
8180 p_api_version => l_api_version,
8181 p_init_msg_list => G_FALSE,
8182 p_contract_id => p_contract_id,
8183 p_item_key => l_item_key,
8184 p_resultout => 'SR_ACPTD',
8185 p_process_status => G_NEG_STS_QUOTE_ACPTD,
8186 p_activity_name => l_activity_name,
8187 x_return_status => x_return_status,
8188 x_msg_data => x_msg_data,
8189 x_msg_count => x_msg_count
8190 );
8191 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
8192 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8193 ELSIF x_return_status = G_RET_STS_ERROR THEN
8194 RAISE FND_API.G_EXC_ERROR;
8195 END IF;
8196
8197 IF FND_API.to_boolean( p_commit ) THEN
8198 COMMIT;
8199 END IF;
8200
8201 -- Standard call to get message count and if count is 1, get message info.
8202 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count=>x_msg_count, p_data=>x_msg_data);
8203
8204 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8205 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
8206 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
8207 END IF;
8208
8209 EXCEPTION
8210 WHEN FND_API.G_EXC_ERROR THEN
8211 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
8212 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
8213 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8214 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
8215 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_ERROR');
8216 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
8217 END IF;
8218 x_return_status := G_RET_STS_ERROR;
8219 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
8220 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
8221 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
8222 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8223 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
8224 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_UNEXPECTED_ERROR');
8225 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
8226 END IF;
8227 x_return_status := G_RET_STS_UNEXP_ERROR ;
8228 WHEN OTHERS THEN
8229 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
8230 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8231 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
8232 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from OTHERS sqlcode = '
8233 ||SQLCODE||', sqlerrm = '||SQLERRM);
8234 END IF;
8235 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
8236 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
8237 x_return_status := G_RET_STS_UNEXP_ERROR ;
8238 END accept_quote;
8239
8240 /*=========================================================================
8241 API name : cancel_contract
8242 Type : Private.
8243 Function : This procedure will complete the workflow activities after
8244 quote has been declined or contract is cancelled by Salesrep
8245 on behalf of customer while waiting for salesrep/customer action.
8246 Pre-reqs : None.
8247 Parameters :
8248 IN : p_api_version IN NUMBER Required
8249 Api version
8250 : p_init_msg_list IN VARCHAR2 Required
8251 Initialize message stack parameter
8252 : p_contract_id IN NUMBER Required
8253 Contract header Id
8254 : p_item_key IN VARCHAR2 Required
8255 Contract process workflow's item key.
8256 : p_cancellation_reason IN VARCHAR2 Required
8257 Reason code of cancellation reason.
8258 : p_cancellation_date IN VARCHAR2 Required
8259 Date on which contract is cancelled.
8260 : p_cancel_source IN VARCHAR2 Required
8261 Parameter to identify cancellation source. This is
8262 significant in case of Quote To contact declines
8263 the renewal through Online process.
8264 : p_comments IN VARCHAR2 Required
8265 Any comments that were passed while cancelling contract.
8266 OUT : x_return_status OUT VARCHAR2(1)
8267 Api return status
8268 : x_msg_count OUT NUMBER
8269 Count of message on error stack
8270 : x_msg_data OUT VARCHAR2
8271 Actual error messages on error stack
8272 Note :
8273 =========================================================================*/
8274 PROCEDURE cancel_contract
8275 (
8276 p_api_version IN NUMBER,
8277 p_init_msg_list IN VARCHAR2,
8278 p_commit IN VARCHAR2 DEFAULT 'F',
8279 p_contract_id IN NUMBER,
8280 p_item_key IN VARCHAR2,
8281 p_cancellation_reason IN VARCHAR2,
8282 p_cancellation_date IN DATE,
8283 p_cancel_source IN VARCHAR2,
8284 p_comments IN VARCHAR2,
8285 x_return_status OUT NOCOPY VARCHAR2,
8286 x_msg_data OUT NOCOPY VARCHAR2,
8287 x_msg_count OUT NOCOPY NUMBER
8288 ) IS
8289
8290 l_api_version CONSTANT NUMBER := 1.0;
8291 l_api_name CONSTANT VARCHAR2(30) := 'cancel_contract';
8292
8293 l_send_email_yn VARCHAR2(1) := 'N';
8294 l_reason VARCHAR2(250);
8295
8296 l_item_key wf_items.item_key%TYPE;
8297 l_result_out wf_item_activity_statuses.activity_result_code%TYPE;
8298 l_process_status VARCHAR2(30);
8299 l_activity_name VARCHAR2(30);
8300 l_email_attr_rec OKS_WF_K_PROCESS_PVT.email_attr_rec;
8301
8302 BEGIN
8303 -- start debug log
8304 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8305 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
8306 'Entered '||G_PKG_NAME ||'.'||l_api_name);
8307 END IF;
8308 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8309 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
8310 'Item key: ' || NVL(l_item_key,'NULL')||' Cancel source '||p_cancel_source);
8311 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
8312 'Cancellation reason: ' || substr(NVL(p_cancellation_reason,'NULL'),1,1500)
8313 || ' Cancellation date: ' || to_char(p_cancellation_date));
8314 END IF;
8315
8316 DBMS_TRANSACTION.SAVEPOINT(l_api_name);
8317 -- Standard call to check for call compatibility.
8318 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
8319 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8320 END IF;
8321
8322 -- Initialize message list if p_init_msg_list is set to TRUE.
8323 IF FND_API.to_Boolean( p_init_msg_list ) THEN
8324 FND_MSG_PUB.initialize;
8325 END IF;
8326
8327 -- Initialize API return status to success
8328 x_return_status := FND_API.G_RET_STS_SUCCESS;
8329
8330 IF p_contract_id IS NULL THEN
8331 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_INVD_CONTRACT_ID');
8332 FND_MESSAGE.SET_TOKEN('HDR_ID','NULL');
8333 FND_MSG_PUB.add;
8334 RAISE FND_API.G_EXC_ERROR;
8335 END IF;
8336
8337 IF p_item_key IS NULL THEN
8338 l_item_key := get_wf_item_key(p_contract_id => p_contract_id);
8339 IF l_item_key IS NULL THEN
8340 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INVALID_WF_ITEM_KEY');
8341 FND_MSG_PUB.add;
8342 RAISE FND_API.G_EXC_ERROR;
8343 END IF;
8344 ELSE
8345 l_item_key := p_item_key;
8346 END IF;
8347 -- Salesrep is cancelling the contract while the contract is in his queue
8348 l_activity_name := get_notified_activity
8349 (
8350 p_item_type => G_ITEM_TYPE
8351 ,p_item_key => l_item_key
8352 );
8353 IF l_activity_name = G_SALESREP_ACTION THEN
8354 l_result_out := 'SR_CNCLD';
8355 l_process_status:= G_NEG_STS_QUOTE_CNCLD;
8356 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8357 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
8358 'Salesrep Cancelling: '||G_PKG_NAME ||'.'||l_api_name);
8359 END IF;
8360 ELSIF l_activity_name = G_CUST_ACTION THEN
8361 -- Customer is decling the quote
8362 IF NVL(p_cancel_source,'!') = G_PERFORMED_BY_CUST THEN
8363 l_result_out := 'DECLINE';
8364 l_process_status:= G_NEG_STS_QUOTE_DECLD;
8365 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8366 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
8367 'Customer Declining: '||G_PKG_NAME ||'.'||l_api_name);
8368 END IF;
8369
8370 -- Salesrep canceling the contract while waiting for customer action.
8371 ELSE
8372 l_result_out := 'SR_CNCLD';
8373 l_process_status:= G_NEG_STS_QUOTE_CNCLD;
8374 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8375 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
8376 'Salesrep Cancelling for Customer: '||G_PKG_NAME ||'.'||l_api_name);
8377 END IF;
8378
8379 -- bug 5845505, send email only if template for the document type is setup
8380 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8381 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
8382 'OKS_WF_K_PROCESS_PVT.is_template_defined('||
8383 ' Contract ID ='||p_contract_id||
8384 ' Document Type ='||G_REPORT_TYPE_CANCEL||')');
8385 END IF;
8386 is_template_defined (
8387 p_api_version => l_api_version,
8388 p_init_msg_list => G_FALSE,
8389 p_contract_id => p_contract_id,
8390 p_document_type => G_REPORT_TYPE_CANCEL,
8391 x_template_defined_yn => l_send_email_yn,
8392 x_email_attr_rec => l_email_attr_rec,
8393 x_return_status => x_return_status,
8394 x_msg_data => x_msg_data,
8395 x_msg_count => x_msg_count
8396 );
8397
8398 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8399 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
8400 'OKS_WF_K_PROCESS_PVT.is_template_defined(x_return_status= '||
8401 x_return_status||' x_msg_count ='||x_msg_count||')');
8402 END IF;
8403 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
8404 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8405 ELSIF x_return_status = G_RET_STS_ERROR THEN
8406 RAISE FND_API.G_EXC_ERROR;
8407 END IF;
8408
8409 wf_engine.SetItemAttrText
8410 (
8411 itemtype => G_ITEM_TYPE,
8412 itemkey => l_item_key,
8413 aname => 'SEND_CONFIRM',
8414 avalue => l_send_email_yn
8415 );
8416
8417 -- get the vendor side cancellation reason as customer side reasons are not
8418 -- accessible to vendor
8419 l_reason := get_lookup_meaning(p_cancellation_reason,G_LKUP_VNDR_CNCL_REASON);
8420
8421 --log interaction (media type WEB FORM) that salesrep has declined the quote
8422 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8423 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
8424 'OKS_WF_K_PROCESS_PVT.set_email_attributes('||
8425 ' Contract ID = '||p_contract_id||
8426 substr(' IH Message = '||p_comments,1,100)||
8427 substr(' IH Subject = '||l_reason||')',1,100));
8428 END IF;
8429 OKS_AUTO_REMINDER.log_interaction (
8430 p_api_version => l_api_version,
8431 p_init_msg_list => G_FALSE,
8432 x_return_status => x_return_status,
8433 x_msg_count => x_msg_count,
8434 x_msg_data => x_msg_data,
8435 p_chr_id => p_contract_id,
8436 p_subject => l_reason,
8437 p_msg_body => p_comments,
8438 p_sent2_email => NULL,
8439 p_media_type => G_MEDIA_TYPE_WEB_FORM
8440 );
8441 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8442 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
8443 'OKS_AUTO_REMINDER.log_interaction(x_return_status= '||
8444 x_return_status||' x_msg_count ='||x_msg_count||')');
8445 END IF;
8446 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
8447 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8448 ELSIF x_return_status = G_RET_STS_ERROR THEN
8449 RAISE FND_API.G_EXC_ERROR;
8450 END IF;
8451 IF NVL(l_send_email_yn,'N') = 'Y' THEN
8452 -- Log interaction and send cancellation confirmation email to customer
8453 l_email_attr_rec.CONTRACT_ID := p_contract_id;
8454 l_email_attr_rec.ITEM_KEY := l_item_key;
8455 l_email_attr_rec.EMAIL_TYPE := G_REPORT_TYPE_CANCEL;
8456 l_email_attr_rec.TO_EMAIL := NULL;
8457 l_email_attr_rec.SENDER_EMAIL := NULL;
8458
8459 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8460 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
8461 'OKS_WF_K_PROCESS_PVT.set_email_attributes('||
8462 ' Contract ID ='||p_contract_id||
8463 ' Email Type ='||l_email_attr_rec.EMAIL_TYPE||')');
8464 END IF;
8465 set_email_attributes
8466 (
8467 p_api_version => l_api_version,
8468 p_init_msg_list => OKC_API.G_FALSE,
8469 p_email_attr => l_email_attr_rec,
8470 x_return_status => x_return_status,
8471 x_msg_data => x_msg_data,
8472 x_msg_count => x_msg_count
8473 );
8474 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8475 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
8476 'OKS_WF_K_PROCESS_PVT.set_email_attributes(x_return_status= '||
8477 x_return_status||' x_msg_count ='||x_msg_count||')');
8478 END IF;
8479 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
8480 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8481 ELSIF x_return_status = G_RET_STS_ERROR THEN
8482 RAISE FND_API.G_EXC_ERROR;
8483 END IF;
8484 END IF;
8485 END IF;
8486 ELSE
8487
8488 -- MKS 10/12/2005 Bug#4643300: Need to stamp even for non salesrep/customer nodes.
8489
8490 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8491 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
8492 'Aborting Process and Updating Contract '||G_PKG_NAME ||'.'||l_api_name);
8493 END IF;
8494 UPDATE oks_k_headers_b
8495 SET renewal_status = G_NEG_STS_QUOTE_CNCLD,
8496 accepted_by = NULL,
8497 date_accepted = NULL,
8498 object_version_number = object_version_number + 1,
8499 last_update_date = SYSDATE,
8500 last_updated_by = FND_GLOBAL.USER_ID,
8501 last_update_login = FND_GLOBAL.LOGIN_ID
8502 WHERE chr_id = p_contract_id;
8503 wf_engine.AbortProcess (G_ITEM_TYPE, l_item_key);
8504 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8505 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
8506 'Updated Contract and Process Aborted '||G_PKG_NAME ||'.'||l_api_name);
8507 END IF;
8508 END IF;
8509
8510 IF l_activity_name IN (G_SALESREP_ACTION, G_CUST_ACTION) THEN
8511 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8512 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
8513 'OKS_WF_K_PROCESS_PVT.complete_activity(p_contract_id= '||
8514 p_contract_id||' p_resultout ='||l_result_out||
8515 ' p_process_status ='||l_process_status||
8516 ' p_activity_name ='||l_activity_name||')');
8517 END IF;
8518 complete_activity
8519 (
8520 p_api_version => 1.0,
8521 p_init_msg_list => G_FALSE,
8522 p_contract_id => p_contract_id,
8523 p_item_key => l_item_key,
8524 p_resultout => l_result_out,
8525 p_process_status => l_process_status,
8526 p_activity_name => l_activity_name,
8527 x_return_status => x_return_status,
8528 x_msg_count => x_msg_count,
8529 x_msg_data => x_msg_data
8530 ) ;
8531 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8532 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
8533 'OKS_WF_K_PROCESS_PVT.complete_activity(x_return_status= '||
8534 x_return_status||' x_msg_count ='||x_msg_count||')');
8535 END IF;
8536 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
8537 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8538 ELSIF x_return_status = G_RET_STS_ERROR THEN
8539 RAISE FND_API.G_EXC_ERROR;
8540 END IF;
8541 END IF;
8542
8543 IF FND_API.to_boolean( p_commit ) THEN
8544 COMMIT;
8545 END IF;
8546
8547 -- Standard call to get message count and if count is 1, get message info.
8548 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count=>x_msg_count, p_data=>x_msg_data);
8549
8550 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8551 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
8552 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
8553 END IF;
8554
8555 EXCEPTION
8556 WHEN FND_API.G_EXC_ERROR THEN
8557 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
8558 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8559 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
8560 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_ERROR');
8561 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
8562 END IF;
8563 x_return_status := G_RET_STS_ERROR;
8564 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
8565 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
8566 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8567 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
8568 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_UNEXPECTED_ERROR');
8569 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
8570 END IF;
8571 x_return_status := G_RET_STS_UNEXP_ERROR ;
8572 WHEN OTHERS THEN
8573 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
8574 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8575 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
8576 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from OTHERS sqlcode = '
8577 ||SQLCODE||', sqlerrm = '||SQLERRM);
8578 END IF;
8579 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
8580 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
8581 x_return_status := G_RET_STS_UNEXP_ERROR ;
8582 END cancel_contract;
8583
8584 /*=========================================================================
8585 API name : activate_contract
8586 Type : Private.
8587 Function : This procedure will approve and sign the contract.
8588 Pre-reqs : None.
8589 Parameters :
8590 IN : itemtype IN VARCHAR2 Required
8591 Workflow item type parameter
8592 : itemkey IN VARCHAR2 Required
8593 Workflow item key parameter
8594 : actid IN VARCHAR2 Required
8595 Workflow actid parameter
8596 : funcmode IN VARCHAR2 Required
8597 Workflow function mode parameter
8598 OUT : resultout OUT VARCHAR2(1)
8599 Workflow standard out parameter
8600 Note :
8601 =========================================================================*/
8602 PROCEDURE activate_contract
8603 (
8604 itemtype IN VARCHAR2,
8605 itemkey IN VARCHAR2,
8606 actid IN NUMBER,
8607 funcmode IN VARCHAR2,
8608 resultout OUT nocopy VARCHAR2
8609 ) IS
8610
8611 l_api_name CONSTANT VARCHAR2(50) := 'activate_contract';
8612 l_api_version CONSTANT NUMBER := 1.0;
8613 l_return_status VARCHAR2(1) := G_RET_STS_SUCCESS;
8614 l_msg_count NUMBER;
8615 l_msg_data VARCHAR2(2000);
8616
8617 l_contract_id NUMBER;
8618 l_notif_attr_rec OKS_WF_K_PROCESS_PVT.notif_attr_rec;
8619
8620 BEGIN
8621
8622 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8623 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
8624 'Entered '||G_PKG_NAME ||'.'||l_api_name);
8625 END IF;
8626
8627 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8628 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
8629 'itemtype: ' || itemtype ||
8630 ' itemkey: ' || itemkey ||
8631 ' actid: ' || to_char(actid) ||
8632 ' funcmode: ' || funcmode);
8633 END IF;
8634 IF (funcmode = 'RUN') THEN
8635
8636 l_contract_id := wf_engine.GetItemAttrNumber(
8637 itemtype => itemtype,
8638 itemkey => itemkey,
8639 aname => 'CONTRACT_ID');
8640
8641 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8642 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
8643 'OKC_CONTRACT_APPROVAL_PUB.k_approved(p_contract_id= '||l_contract_id||')');
8644 END IF;
8645 -- update the date approved of the contract
8646 OKC_CONTRACT_APPROVAL_PUB.k_approved
8647 (
8648 p_contract_id => l_contract_id,
8649 x_return_status => l_return_status
8650 );
8651 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8652 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
8653 'OKC_CONTRACT_APPROVAL_PUB.k_approved(x_return_status= '||l_return_status||')');
8654 END IF;
8655 IF l_return_status <> G_RET_STS_SUCCESS THEN
8656 update_negotiation_status
8657 (
8658 p_api_version => l_api_version,
8659 p_init_msg_list => G_FALSE,
8660 p_chr_id => l_contract_id,
8661 p_negotiation_status => G_NEG_STS_IA_FAIL,
8662 x_return_status => l_return_status,
8663 x_msg_count => l_msg_count,
8664 x_msg_data => l_msg_data
8665 );
8666 IF l_return_status <> G_RET_STS_SUCCESS THEN
8667 RAISE FND_API.G_EXC_ERROR;
8668 END IF;
8669
8670 -- In case of errors, set wf attributes that'll be used by the notification
8671 -- and will be rendered by OAF embedded region.
8672 l_notif_attr_rec.CONTRACT_ID := l_contract_id;
8673 l_notif_attr_rec.ITEM_KEY := itemkey;
8674 l_notif_attr_rec.PERFORMER := NULL;
8675 l_notif_attr_rec.NTF_TYPE := G_NTF_TYPE_ERROR;
8676 l_notif_attr_rec.NTF_SUBJECT := NULL;
8677 l_notif_attr_rec.SUBJECT := get_lookup_meaning(G_NEG_STS_IA_FAIL,G_LKUP_TYPE_NEGO_STATUS);
8678 l_notif_attr_rec.ACCEPT_DECLINE_BY := NULL;
8679 l_notif_attr_rec.MSGS_FROM_STACK_YN:= 'Y';
8680
8681 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8682 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
8683 'OKS_WF_K_PROCESS_PVT.set_notification_attributes('||
8684 ' Contract ID ='||l_contract_id||
8685 ' Notification Type ='||l_notif_attr_rec.NTF_TYPE||
8686 ' Subject ='||l_notif_attr_rec.NTF_SUBJECT||')');
8687 END IF;
8688 set_notification_attributes
8689 (
8690 p_api_version => l_api_version,
8691 p_init_msg_list => OKC_API.G_FALSE,
8692 p_notif_attr => l_notif_attr_rec,
8693 x_return_status => l_return_status,
8694 x_msg_data => l_msg_data,
8695 x_msg_count => l_msg_count
8696 );
8697 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8698 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
8699 'OKS_WF_K_PROCESS_PVT.set_notification_attributes(x_return_status= '||
8700 l_return_status||' x_msg_count ='||l_msg_count||')');
8701 END IF;
8702 RAISE FND_API.G_EXC_ERROR;
8703 END IF;
8704
8705 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8706 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
8707 'OKC_CONTRACT_APPROVAL_PUB.k_signed(p_contract_id= '||l_contract_id||')');
8708 END IF;
8709 -- sign the contract
8710 OKC_CONTRACT_APPROVAL_PUB.k_signed
8711 (
8712 p_contract_id => l_contract_id,
8713 p_complete_k_prcs => 'N',
8714 x_return_status => l_return_status
8715 );
8716 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8717 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
8718 'OKC_CONTRACT_APPROVAL_PUB.k_signed(x_return_status= '||l_return_status||')');
8719 END IF;
8720 IF l_return_status <> G_RET_STS_SUCCESS THEN
8721 update_negotiation_status
8722 (
8723 p_api_version => l_api_version,
8724 p_init_msg_list => G_FALSE,
8725 p_chr_id => l_contract_id,
8726 p_negotiation_status => G_NEG_STS_IA_FAIL,
8727 x_return_status => l_return_status,
8728 x_msg_count => l_msg_count,
8729 x_msg_data => l_msg_data
8730 );
8731 IF l_return_status <> G_RET_STS_SUCCESS THEN
8732 RAISE FND_API.G_EXC_ERROR;
8733 END IF;
8734
8735 -- In case of errors, set wf attributes that'll be used by the notification
8736 -- and will be rendered by OAF embedded region.
8737 l_notif_attr_rec.CONTRACT_ID := l_contract_id;
8738 l_notif_attr_rec.ITEM_KEY := itemkey;
8739 l_notif_attr_rec.PERFORMER := NULL;
8740 l_notif_attr_rec.NTF_TYPE := G_NTF_TYPE_ERROR;
8741 l_notif_attr_rec.NTF_SUBJECT := NULL;
8742 l_notif_attr_rec.SUBJECT := get_lookup_meaning(G_NEG_STS_IA_FAIL,G_LKUP_TYPE_NEGO_STATUS);
8743 l_notif_attr_rec.ACCEPT_DECLINE_BY := NULL;
8744 l_notif_attr_rec.MSGS_FROM_STACK_YN:= 'Y';
8745
8746 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8747 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
8748 'OKS_WF_K_PROCESS_PVT.set_notification_attributes('||
8749 ' Contract ID ='||l_contract_id||
8750 ' Notification Type ='||l_notif_attr_rec.NTF_TYPE||
8751 ' Subject ='||l_notif_attr_rec.NTF_SUBJECT||')');
8752 END IF;
8753 set_notification_attributes
8754 (
8755 p_api_version => l_api_version,
8756 p_init_msg_list => OKC_API.G_FALSE,
8757 p_notif_attr => l_notif_attr_rec,
8758 x_return_status => l_return_status,
8759 x_msg_data => l_msg_data,
8760 x_msg_count => l_msg_count
8761 );
8762 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8763 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
8764 'OKS_WF_K_PROCESS_PVT.set_notification_attributes(x_return_status= '||
8765 l_return_status||' x_msg_count ='||l_msg_count||')');
8766 END IF;
8767 RAISE FND_API.G_EXC_ERROR;
8768 END IF;
8769
8770 resultout := 'COMPLETE:T';
8771 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8772 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
8773 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
8774 END IF;
8775 RETURN;
8776 END IF; -- (funcmode = 'RUN')
8777
8778 IF (funcmode = 'CANCEL') THEN
8779 resultout := 'COMPLETE:';
8780 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8781 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
8782 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
8783 END IF;
8784 RETURN;
8785 END IF; -- (funcmode = 'CANCEL')
8786
8787 IF (funcmode = 'TIMEOUT') THEN
8788 resultout := 'COMPLETE:';
8789 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8790 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
8791 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
8792 END IF;
8793 RETURN;
8794 END IF; -- (funcmode = 'TIMEOUT')
8795 EXCEPTION
8796 WHEN FND_API.G_EXC_ERROR THEN
8797 resultout := 'COMPLETE:F';
8798 l_msg_data := get_fnd_message;
8799 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8800 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
8801 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'Error: Itemtype: '
8802 ||NVL(itemtype,'NULL')||' Itemkey: '||NVL(itemkey,'NULL'));
8803 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,l_msg_data);
8804 END IF;
8805 wf_core.CONTEXT
8806 (
8807 pkg_name => G_PKG_NAME,
8808 proc_name => l_api_name,
8809 arg1 => itemtype,
8810 arg2 => itemkey,
8811 arg3 => l_msg_data
8812 );
8813 WHEN others THEN
8814 resultout := 'COMPLETE:F';
8815 l_msg_data := get_fnd_message;
8816 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8817 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
8818 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
8819 ||SQLCODE||', sqlerrm = '||SQLERRM);
8820 END IF;
8821 wf_core.CONTEXT
8822 (
8823 pkg_name => G_PKG_NAME,
8824 proc_name => l_api_name,
8825 arg1 => itemtype,
8826 arg2 => itemkey,
8827 arg3 => to_char(actid),
8828 arg4 => funcmode,
8829 arg5 => SQLCODE,
8830 arg6 => SQLERRM
8831 );
8832 END activate_contract;
8833
8834 /*
8835 This procedure is a concurrent program, that launches wf for all
8836 ENTERED status contracts, that do not have a workflow associated with them
8837 and have not been submitted for approval.
8838 */
8839 PROCEDURE launch_wf_conc_prog
8840 (
8841 ERRBUF OUT NOCOPY VARCHAR2,
8842 RETCODE OUT NOCOPY NUMBER
8843 )
8844 IS
8845
8846 -- The following cursor will pick up all contracts which are in ENTERED status
8847 -- without any existing active renewal/process workflow (obviously !!!)
8848 -- and not been submitted for approval
8849 CURSOR c_old_k IS
8850 SELECT oksk.CHR_ID CHR_ID,
8851 nvl(oksk.RENEWAL_TYPE_USED, G_RENEW_TYPE_MANUAL) RENEWAL_TYPE_USED,
8852 nvl(oksk.APPROVAL_TYPE_USED, G_IRR_FLAG_REQD) APPROVAL_TYPE_USED,
8853 okck.CONTRACT_NUMBER CONTRACT_NUMBER,
8854 nvl(okck.CONTRACT_NUMBER_MODIFIER, FND_API.G_MISS_CHAR) CONTRACT_NUMBER_MODIFIER,
8855 nvl(oksk.RENEWAL_STATUS, G_NEG_STS_DRAFT) RENEWAL_STATUS
8856 FROM OKS_K_HEADERS_B oksk,
8857 OKC_K_HEADERS_ALL_B okck,
8858 OKC_STATUSES_B sts
8859 WHERE oksk.chr_id = okck.id
8860 AND sts.ste_code = 'ENTERED'
8861 AND sts.code = okck.sts_code
8862 AND okck.template_yn = 'N'
8863 --no active approval workflow exists
8864 AND NOT EXISTS
8865 (SELECT 1
8866 FROM WF_ITEMS WF,
8867 OKC_PROCESS_DEFS_B KPDF
8868 WHERE WF.item_key = okck.contract_number || okck.contract_number_modifier
8869 AND WF.end_date IS NULL
8870 AND WF.item_type = KPDF.wf_name
8871 AND KPDF.pdf_type = 'WPS')
8872 --for an ENTERED status contract, no active base workflow exists
8873 AND NOT EXISTS
8874 (SELECT 1
8875 FROM WF_ITEMS WF
8876 WHERE WF.item_key = oksk.wf_item_key
8877 AND WF.end_date IS NULL
8878 AND WF.item_type = G_ITEM_TYPE);
8879
8880 TYPE k_rec_tbl_type IS TABLE OF c_old_k%ROWTYPE INDEX BY BINARY_INTEGER;
8881
8882 l_return_status VARCHAR2(1) := 'S';
8883 l_msg_count NUMBER;
8884 l_msg_data VARCHAR2(2000);
8885
8886 l_k_rec_tbl k_rec_tbl_type;
8887 l_wf_attributes_tbl WF_ATTR_DETAILS_TBL;
8888
8889 l_rollcount NUMBER := 0;
8890 l_wfcount NUMBER := 0;
8891 l_errcount NUMBER := 0;
8892
8893 BEGIN
8894 retcode := 0; --0 for success, 1 for warning, 2 for error
8895
8896 FND_FILE.PUT_LINE(FND_FILE.LOG,'Starting Concurrent Program, time: '|| to_char(sysdate, 'DD-MON-YYYY HH24:MI:SS'));
8897 OPEN c_old_k;
8898 LOOP
8899
8900 FETCH c_old_k BULK COLLECT INTO l_k_rec_tbl LIMIT 1000;
8901 FND_FILE.PUT_LINE(FND_FILE.LOG,'Bulk fetched '||l_k_rec_tbl.COUNT ||' rows');
8902
8903 EXIT WHEN (l_k_rec_tbl.COUNT = 0);
8904 l_rollcount := l_rollcount + l_k_rec_tbl.COUNT;
8905
8906 FND_FILE.PUT_LINE(FND_FILE.LOG,'Launching Workflow ');
8907
8908 FOR i IN l_k_rec_tbl.FIRST..l_k_rec_tbl.LAST LOOP
8909 l_wf_attributes_tbl(i).CONTRACT_ID := l_k_rec_tbl(i).chr_id;
8910 l_wf_attributes_tbl(i).CONTRACT_NUMBER := l_k_rec_tbl(i).contract_number;
8911 IF (l_k_rec_tbl(i).contract_number_modifier = FND_API.G_MISS_CHAR) THEN
8912 l_wf_attributes_tbl(i).CONTRACT_MODIFIER := NULL;
8913 ELSE
8914 l_wf_attributes_tbl(i).CONTRACT_MODIFIER := l_k_rec_tbl(i).contract_number_modifier;
8915 END IF;
8916 l_wf_attributes_tbl(i).PROCESS_TYPE := l_k_rec_tbl(i).renewal_type_used;
8917 l_wf_attributes_tbl(i).IRR_FLAG := l_k_rec_tbl(i).approval_type_used;
8918 l_wf_attributes_tbl(i).NEGOTIATION_STATUS := l_k_rec_tbl(i).renewal_status;
8919 END LOOP;
8920
8921 l_return_status := 'S';
8922
8923 --if any errors happen, this procedure will roll it back for all the records passed in
8924 launch_k_process_wf_blk(
8925 p_api_version => 1.0,
8926 p_init_msg_list => FND_API.G_TRUE,
8927 p_commit => FND_API.G_FALSE,
8928 p_wf_attributes_tbl => l_wf_attributes_tbl,
8929 p_update_item_key => 'Y',
8930 x_return_status => l_return_status,
8931 x_msg_count => l_msg_count,
8932 x_msg_data => l_msg_data);
8933
8934 --if unexpected error happens - we abort, for other errors we will
8935 --try the next batch
8936 IF l_return_status = FND_API.g_ret_sts_unexp_error THEN
8937 l_errcount := l_errcount + l_k_rec_tbl.COUNT;
8938 FOR j IN 1..l_msg_count LOOP
8939 FND_FILE.PUT_LINE(FND_FILE.LOG, FND_MSG_PUB.get(j, 'F'));
8940 END LOOP;
8941 RAISE FND_API.g_exc_unexpected_error;
8942 ELSIF l_return_status = FND_API.g_ret_sts_error THEN
8943 --just log the error and continue
8944 l_errcount := l_errcount + l_k_rec_tbl.COUNT;
8945 retcode := 1;
8946 FOR j IN 1..l_msg_count LOOP
8947 FND_FILE.PUT_LINE(FND_FILE.LOG, FND_MSG_PUB.get(j, 'F'));
8948 END LOOP;
8949 ELSE
8950 l_wfcount := l_wfcount + l_k_rec_tbl.COUNT;
8951 END IF;
8952
8953 --delete for the the next loop
8954 l_wf_attributes_tbl.DELETE;
8955 COMMIT;
8956 FND_FILE.PUT_LINE(FND_FILE.LOG,'Rows processed so far: ' || l_rollcount);
8957 FND_FILE.PUT_LINE(FND_FILE.LOG,'Rows errored so far: ' || l_errcount);
8958 FND_FILE.PUT_LINE(FND_FILE.LOG,'Rows successful so far: '|| l_wfcount);
8959
8960
8961 END LOOP; -- main cursor loop
8962 CLOSE c_old_k;
8963
8964 FND_FILE.PUT_LINE(FND_FILE.LOG,'Total Rows processed: '|| l_rollcount);
8965 FND_FILE.PUT_LINE(FND_FILE.LOG,'Total Rows errored: '|| l_errcount);
8966 FND_FILE.PUT_LINE(FND_FILE.LOG,'Total Rows succesful: '|| l_wfcount);
8967
8968 FND_FILE.PUT_LINE(FND_FILE.LOG,'End Concurrent Program - Success, time: '|| to_char(sysdate, 'DD-MON-YYYY HH24:MI:SS')||' ,retcode='||retcode);
8969
8970 EXCEPTION
8971 WHEN OTHERS THEN
8972 retcode := 2;
8973 IF (c_old_k%isopen) THEN
8974 CLOSE c_old_k;
8975 END IF;
8976 errbuf := sqlcode||sqlerrm;
8977 FND_FILE.PUT_LINE(FND_FILE.LOG,'End Concurrent Program - Error, time: '|| to_char(sysdate, 'DD-MON-YYYY HH24:MI:SS')||' ,retcode='||retcode);
8978
8979 END launch_wf_conc_prog;
8980
8981
8982 /* Bulk API for launching wf for ENTERED status Service Contracts
8983 This procedure launches the workflow for a Service Contract. From R12 onwards every
8984 Service Contract when created has a workflow associated with it, that routes the
8985 contract till it is activated.
8986
8987 Parameters
8988 p_wf_attributes_tbl : table of records containg the details of the workflow to be
8989 launched
8990 p_update_item_key : Y|N indicating if oks_k_headers_b and oks_k_headers_bh are to be
8991 updated with the passed item keys
8992
8993 Rules for input record fiels
8994 1. Contract_id must be passed, if not passed the record is ignored
8995 2. Contract number and modifier must be passed, they are set as item attributes for the
8996 workflow
8997 3. Process_type and irr_flag are optional, they are stamped as workflow item
8998 attributes. Defaulted as - procees_type = NSR and irr_flag = Y
8999 4. Negotiation_status is optional, if NULL or PREDRAFT, it is defaulted as DRAFT. It is
9000 stamped as workflow item attribute.
9001 5. Item_key is optional, if not passed it is defaulted as
9002 contract_id || to_char(sysdate, 'YYYYMMDDHH24MISS').
9003
9004 */
9005 PROCEDURE launch_k_process_wf_blk
9006 (
9007 p_api_version IN NUMBER DEFAULT 1.0,
9008 p_init_msg_list IN VARCHAR2 DEFAULT 'F',
9009 p_commit IN VARCHAR2 DEFAULT 'F',
9010 p_wf_attributes_tbl IN WF_ATTR_DETAILS_TBL,
9011 p_update_item_key IN VARCHAR2 DEFAULT 'Y',
9012 x_return_status OUT NOCOPY VARCHAR2,
9013 x_msg_count OUT NOCOPY NUMBER,
9014 x_msg_data OUT NOCOPY VARCHAR2
9015 )
9016 IS
9017 l_api_name CONSTANT VARCHAR2(30) := 'launch_k_process_wf_blk';
9018 l_api_version CONSTANT NUMBER := 1;
9019 l_mod_name VARCHAR2(256) := G_MODULE || l_api_name;
9020 l_error_text VARCHAR2(512);
9021
9022 l_wf_err_name VARCHAR2(30);
9023 l_wf_err_msg VARCHAR2(2000);
9024 l_wf_err_stack VARCHAR2(4000);
9025
9026 l_item_keys WF_ENGINE_BULK.itemkeytabtype;
9027 l_user_keys WF_ENGINE_BULK.userkeytabtype;
9028 l_owner_roles WF_ENGINE_BULK.ownerroletabtype;
9029
9030 l_contract_id_names WF_ENGINE.nametabtyp;
9031 l_contract_number_names WF_ENGINE.nametabtyp;
9032 l_contract_modifier_names WF_ENGINE.nametabtyp;
9033 l_process_type_names WF_ENGINE.nametabtyp;
9034 l_irr_flag_names WF_ENGINE.nametabtyp;
9035 l_neg_status_names WF_ENGINE.nametabtyp;
9036 l_user_id_names WF_ENGINE.nametabtyp;
9037 l_responsibility_id_names WF_ENGINE.nametabtyp;
9038 l_resp_appl_id_names WF_ENGINE.nametabtyp;
9039 l_security_group_id_names WF_ENGINE.nametabtyp;
9040
9041 l_contract_id_values WF_ENGINE.numtabtyp;
9042 l_contract_number_values WF_ENGINE.texttabtyp;
9043 l_contract_modifier_values WF_ENGINE.texttabtyp;
9044 l_process_type_values WF_ENGINE.texttabtyp;
9045 l_irr_flag_values WF_ENGINE.texttabtyp;
9046 l_neg_status_values WF_ENGINE.texttabtyp;
9047 l_user_id_values WF_ENGINE.numtabtyp;
9048 l_responsibility_id_values WF_ENGINE.numtabtyp;
9049 l_resp_appl_id_values WF_ENGINE.numtabtyp;
9050 l_security_group_id_values WF_ENGINE.numtabtyp;
9051
9052 l_contract_id_count NUMBER := 0;
9053 l_date DATE := sysdate;
9054
9055 BEGIN
9056 --log key input parameters
9057 IF (FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level) THEN
9058 FND_LOG.string(FND_LOG.level_procedure, l_mod_name || '.begin', 'p_api_version=' || p_api_version ||' ,p_commit='|| p_commit ||' ,p_wf_attributes_tbl.count='|| p_wf_attributes_tbl.count||' ,p_update_item_key='||p_update_item_key);
9059 END IF;
9060
9061 --standard api initilization and checks
9062 SAVEPOINT launch_k_process_wf_blk_PVT;
9063 IF NOT FND_API.compatible_api_call (l_api_version, p_api_version, l_api_name, G_PKG_NAME)THEN
9064 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9065 END IF;
9066 IF FND_API.to_boolean(p_init_msg_list ) THEN
9067 FND_MSG_PUB.initialize;
9068 END IF;
9069 x_return_status := FND_API.G_RET_STS_SUCCESS;
9070
9071 IF (p_wf_attributes_tbl.count = 0 ) THEN
9072 RETURN;
9073 END IF;
9074
9075 FOR i IN p_wf_attributes_tbl.FIRST..p_wf_attributes_tbl.LAST LOOP
9076 IF (p_wf_attributes_tbl(i).contract_id IS NOT NULL) THEN
9077
9078 l_contract_id_count := l_contract_id_count + 1;
9079
9080 l_item_keys(l_contract_id_count) := nvl(p_wf_attributes_tbl(i).item_key,
9081 p_wf_attributes_tbl(i).contract_id ||to_char(l_date, 'YYYYMMDDHH24MISS'));
9082
9083 l_user_keys(l_contract_id_count) := p_wf_attributes_tbl(i).contract_number;
9084 IF (p_wf_attributes_tbl(i).contract_modifier IS NOT NULL) THEN
9085 l_user_keys(l_contract_id_count) := l_user_keys(l_contract_id_count) || ' ' ||
9086 p_wf_attributes_tbl(i).contract_modifier;
9087 END IF;
9088
9089 --setting it to null, ideally we should set it to contract salesrep,
9090 --but since it is expensive we can defer it to later in the Workflow
9091 l_owner_roles(l_contract_id_count) := NULL;
9092
9093 l_contract_id_names(l_contract_id_count) := 'CONTRACT_ID';
9094 l_contract_id_values(l_contract_id_count) := p_wf_attributes_tbl(i).contract_id;
9095
9096 l_contract_number_names(l_contract_id_count) := 'CONTRACT_NUMBER';
9097 l_contract_number_values(l_contract_id_count) := p_wf_attributes_tbl(i).contract_number;
9098
9099 l_contract_modifier_names(l_contract_id_count) := 'CONTRACT_MODIFIER';
9100 l_contract_modifier_values(l_contract_id_count) :=
9101 p_wf_attributes_tbl(i).contract_modifier;
9102
9103 l_process_type_names(l_contract_id_count) := 'PROCESS_TYPE';
9104 l_process_type_values(l_contract_id_count) := nvl(p_wf_attributes_tbl(i).process_type,G_RENEW_TYPE_MANUAL);
9105
9106 l_irr_flag_names(l_contract_id_count) := 'IRR_FLAG';
9107 l_irr_flag_values(l_contract_id_count) := nvl(p_wf_attributes_tbl(i).irr_flag, G_IRR_FLAG_REQD);
9108
9109 l_user_id_names(l_contract_id_count) := 'USER_ID';
9110 l_user_id_values(l_contract_id_count) := fnd_global.user_id;
9111
9112 l_responsibility_id_names(l_contract_id_count) := 'RESP_ID';
9113 l_responsibility_id_values(l_contract_id_count) := fnd_global.resp_id;
9114
9115 l_resp_appl_id_names(l_contract_id_count) := 'RESP_APPL_ID';
9116 l_resp_appl_id_values(l_contract_id_count) := fnd_global.resp_appl_id;
9117
9118 l_security_group_id_names(l_contract_id_count) := 'SECURITY_GROUP_ID';
9119 l_security_group_id_values(l_contract_id_count) := fnd_global.security_group_id;
9120
9121 l_neg_status_names(l_contract_id_count) := 'NEGOTIATION_STATUS';
9122 IF (p_wf_attributes_tbl(i).negotiation_status IS NULL OR
9123 p_wf_attributes_tbl(i).negotiation_status = G_NEG_STS_PRE_DRAFT) THEN
9124 l_neg_status_values(l_contract_id_count) := G_NEG_STS_DRAFT;
9125 ELSE
9126 l_neg_status_values(l_contract_id_count) := p_wf_attributes_tbl(i).negotiation_status;
9127 END IF;
9128
9129 END IF;
9130 END LOOP;
9131
9132 IF (l_contract_id_count > 0) THEN
9133
9134 IF (FND_LOG.level_statement >= FND_LOG.g_current_runtime_level) THEN
9135 FND_LOG.string(FND_LOG.level_statement, l_mod_name || '.bulk_wf', 'l_contract_id_count='||l_contract_id_count||' ,calling WF_ENGINE_BULK.createprocess');
9136 END IF;
9137
9138 WF_ENGINE_BULK.createprocess(
9139 itemtype => G_ITEM_TYPE,
9140 itemkeys => l_item_keys,
9141 process => G_MAIN_PROCESS,
9142 user_keys => l_user_keys,
9143 owner_roles => l_owner_roles);
9144
9145 WF_ENGINE_BULK.setitemattrnumber(
9146 itemtype => G_ITEM_TYPE,
9147 itemkeys => l_item_keys,
9148 anames => l_contract_id_names,
9149 avalues => l_contract_id_values);
9150
9151 WF_ENGINE_BULK.setitemattrtext(
9152 itemtype => G_ITEM_TYPE,
9153 itemkeys => l_item_keys,
9154 anames => l_contract_number_names,
9155 avalues => l_contract_number_values);
9156
9157 WF_ENGINE_BULK.setitemattrtext(
9158 itemtype => G_ITEM_TYPE,
9159 itemkeys => l_item_keys,
9160 anames => l_contract_modifier_names,
9161 avalues => l_contract_modifier_values);
9162
9163 WF_ENGINE_BULK.setitemattrtext(
9164 itemtype => G_ITEM_TYPE,
9165 itemkeys => l_item_keys,
9166 anames => l_process_type_names,
9167 avalues => l_process_type_values);
9168
9169 WF_ENGINE_BULK.setitemattrtext(
9170 itemtype => G_ITEM_TYPE,
9171 itemkeys => l_item_keys,
9172 anames => l_irr_flag_names,
9173 avalues => l_irr_flag_values);
9174
9175 WF_ENGINE_BULK.setitemattrtext(
9176 itemtype => G_ITEM_TYPE,
9177 itemkeys => l_item_keys,
9178 anames => l_neg_status_names,
9179 avalues => l_neg_status_values);
9180
9181 WF_ENGINE_BULK.setitemattrnumber(
9182 itemtype => G_ITEM_TYPE,
9183 itemkeys => l_item_keys,
9184 anames => l_user_id_names,
9185 avalues => l_user_id_values);
9186
9187 WF_ENGINE_BULK.setitemattrnumber(
9188 itemtype => G_ITEM_TYPE,
9189 itemkeys => l_item_keys,
9190 anames => l_responsibility_id_names,
9191 avalues => l_responsibility_id_values);
9192
9193 WF_ENGINE_BULK.setitemattrnumber(
9194 itemtype => G_ITEM_TYPE,
9195 itemkeys => l_item_keys,
9196 anames => l_resp_appl_id_names,
9197 avalues => l_resp_appl_id_values);
9198
9199 WF_ENGINE_BULK.setitemattrnumber(
9200 itemtype => G_ITEM_TYPE,
9201 itemkeys => l_item_keys,
9202 anames => l_security_group_id_names,
9203 avalues => l_security_group_id_values);
9204
9205 IF (FND_LOG.level_statement >= FND_LOG.g_current_runtime_level) THEN
9206 FND_LOG.string(FND_LOG.level_statement, l_mod_name || '.bulk_wf', ',calling WF_ENGINE_BULK.startprocess');
9207 END IF;
9208
9209 WF_ENGINE_BULK.startprocess(
9210 itemtype => G_ITEM_TYPE,
9211 itemkeys => l_item_keys);
9212
9213 IF ( nvl(p_update_item_key, 'N') = 'Y' ) THEN
9214
9215 IF (FND_LOG.level_statement >= FND_LOG.g_current_runtime_level) THEN
9216 FND_LOG.string(FND_LOG.level_statement, l_mod_name || '.update', ',upating oks_k_headers_b');
9217 END IF;
9218
9219 FORALL i IN l_contract_id_values.FIRST..l_contract_id_values.LAST
9220 UPDATE oks_k_headers_b
9221 SET wf_item_key = l_item_keys(i),
9222 renewal_status = nvl(renewal_status,G_NEG_STS_DRAFT),
9223 object_version_number = object_version_number + 1,
9224 last_update_date = SYSDATE,
9225 last_updated_by = FND_GLOBAL.USER_ID,
9226 last_update_login = FND_GLOBAL.LOGIN_ID
9227 WHERE chr_id = l_contract_id_values(i);
9228
9229 FORALL i IN l_contract_id_values.FIRST..l_contract_id_values.LAST
9230 UPDATE oks_k_headers_bh
9231 SET wf_item_key = l_item_keys(i),
9232 object_version_number = object_version_number + 1,
9233 renewal_status = nvl(renewal_status,G_NEG_STS_DRAFT),
9234 last_update_date = SYSDATE,
9235 last_updated_by = FND_GLOBAL.USER_ID,
9236 last_update_login = FND_GLOBAL.LOGIN_ID
9237 WHERE chr_id = l_contract_id_values(i);
9238 END IF;
9239 END IF;
9240
9241 --standard check of p_commit
9242 IF FND_API.to_boolean( p_commit ) THEN
9243 COMMIT;
9244 END IF;
9245 IF (FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level) THEN
9246 FND_LOG.string(FND_LOG.level_procedure, l_mod_name || '.end', 'x_return_status='|| x_return_status);
9247 END IF;
9248 FND_MSG_PUB.count_and_get(p_count => x_msg_count, p_data => x_msg_data );
9249
9250 EXCEPTION
9251 WHEN FND_API.g_exc_error THEN
9252 ROLLBACK TO launch_k_process_wf_blk_PVT;
9253 x_return_status := FND_API.g_ret_sts_error ;
9254
9255 IF (FND_LOG.level_error >= FND_LOG.g_current_runtime_level) THEN
9256 FND_LOG.string(FND_LOG.level_error, l_mod_name || '.end_error', 'x_return_status=' || x_return_status);
9257 END IF;
9258 FND_MSG_PUB.count_and_get(p_count => x_msg_count, p_data => x_msg_data );
9259
9260 WHEN FND_API.g_exc_unexpected_error THEN
9261 ROLLBACK TO launch_k_process_wf_blk_PVT;
9262 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
9263
9264 IF (FND_LOG.level_unexpected >= FND_LOG.g_current_runtime_level) THEN
9265 FND_LOG.string(FND_LOG.level_unexpected, l_mod_name || '.end_unexpected_error', 'x_return_status=' || x_return_status);
9266 END IF;
9267 FND_MSG_PUB.count_and_get(p_count => x_msg_count, p_data => x_msg_data );
9268
9269 WHEN OTHERS THEN
9270 ROLLBACK TO launch_k_process_wf_blk_PVT;
9271
9272 --since we are calling workflow api's we need to check for workflow errors
9273 WF_CORE.get_error(l_wf_err_name, l_wf_err_msg, l_wf_err_stack, 4000);
9274
9275 IF (l_wf_err_name IS NOT NULL) THEN
9276 --workflow error
9277 WF_CORE.clear;
9278 --set the status to error, so that calling program can handle it
9279 x_return_status := FND_API.g_ret_sts_error ;
9280 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name, l_wf_err_name||' '||l_wf_err_msg);
9281
9282 IF (FND_LOG.level_unexpected >= FND_LOG.g_current_runtime_level) THEN
9283 FND_LOG.string(FND_LOG.level_unexpected, l_mod_name || '.end_workflow_error', 'x_return_status=' || x_return_status);
9284 FND_LOG.string(FND_LOG.level_unexpected, l_mod_name || '.end_workflow_error', 'err_name=' || l_wf_err_name||', err_msg='|| l_wf_err_msg||',err_stack='|| l_wf_err_stack);
9285 END IF;
9286
9287 ELSE
9288 --other error
9289 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
9290
9291 IF (FND_LOG.level_unexpected >= FND_LOG.g_current_runtime_level) THEN
9292 --first log the sqlerrm
9293 l_error_text := substr (SQLERRM, 1, 240);
9294 FND_LOG.string(FND_LOG.level_unexpected, l_mod_name || '.end_other_error', l_error_text);
9295 --then add it to the message api list
9296 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name, l_error_text);
9297 END IF;
9298 END IF;
9299
9300 FND_MSG_PUB.count_and_get(p_count => x_msg_count, p_data => x_msg_data );
9301
9302 END launch_k_process_wf_blk;
9303
9304 END OKS_WF_K_PROCESS_PVT;