[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.59.12010000.2 2008/10/22 12:51:54 ssreekum 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 BEGIN
2485
2486 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2487 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
2488 'Entered '||G_PKG_NAME ||'.'||l_api_name||' with p_contract_id'||
2489 p_contract_id||' p_item_key'||p_item_key);
2490 END IF;
2491
2492 DBMS_TRANSACTION.SAVEPOINT(l_api_name);
2493 -- Standard call to check for call compatibility.
2494 IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
2495 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2496 END IF;
2497
2498 -- Initialize message list if p_init_msg_list is set to TRUE.
2499 IF FND_API.to_Boolean( p_init_msg_list ) THEN
2500 FND_MSG_PUB.initialize;
2501 END IF;
2502
2503 -- Initialize API return status to success
2504 x_return_status := FND_API.G_RET_STS_SUCCESS;
2505
2506 IF p_item_key IS NULL THEN
2507 l_item_key := get_wf_item_key(p_contract_id);
2508 IF l_item_key IS NULL THEN
2509 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INVALID_WF_ITEM_KEY');
2510 FND_MSG_PUB.add;
2511 RAISE FND_API.G_EXC_ERROR;
2512 END IF;
2513 ELSE
2514 l_item_key := p_item_key;
2515 END IF; -- p_item_key IS NULL
2516
2517 IF activity_exist_in_process (
2518 p_item_type => G_ITEM_TYPE,
2519 p_item_key => l_item_key,
2520 p_activity_name => G_CUST_ACTION ) THEN
2521
2522 -- bug 5845505, send email only if template for the document type is setup
2523 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2524 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
2525 'OKS_WF_K_PROCESS_PVT.is_template_defined('||
2526 ' Contract ID ='||p_contract_id||
2527 ' Document Type ='||G_REPORT_TYPE_ACCEPT||')');
2528 END IF;
2529 is_template_defined (
2530 p_api_version => l_api_version,
2531 p_init_msg_list => G_FALSE,
2532 p_contract_id => p_contract_id,
2533 p_document_type => G_REPORT_TYPE_ACCEPT,
2534 x_template_defined_yn => l_send_email_yn,
2535 x_email_attr_rec => l_email_attr_rec,
2536 x_return_status => x_return_status,
2537 x_msg_data => x_msg_data,
2538 x_msg_count => x_msg_count
2539 );
2540
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.after',
2543 'OKS_WF_K_PROCESS_PVT.is_template_defined(x_return_status= '||
2544 x_return_status||' x_msg_count ='||x_msg_count||')');
2545 END IF;
2546 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
2547 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2548 ELSIF x_return_status = G_RET_STS_ERROR THEN
2549 RAISE FND_API.G_EXC_ERROR;
2550 END IF;
2551
2552 wf_engine.SetItemAttrText
2553 (
2554 itemtype => G_ITEM_TYPE,
2555 itemkey => l_item_key,
2556 aname => 'SEND_CONFIRM',
2557 avalue => l_send_email_yn
2558 );
2559
2560 --log interaction (media type WEB FORM) that customer has accepted the quote
2561 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2562 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
2563 'OKS_WF_K_PROCESS_PVT.set_email_attributes('||
2564 ' Contract ID = '||p_contract_id||
2565 substr(' IH Subject = '||l_email_attr_rec.ih_subject,1,100)||
2566 substr(' IH Message = '||l_email_attr_rec.ih_message||')',1,100));
2567 END IF;
2568 OKS_AUTO_REMINDER.log_interaction (
2569 p_api_version => l_api_version,
2570 p_init_msg_list => G_FALSE,
2571 x_return_status => x_return_status,
2572 x_msg_count => x_msg_count,
2573 x_msg_data => x_msg_data,
2574 p_chr_id => p_contract_id,
2575 p_subject => l_email_attr_rec.ih_subject,
2576 p_msg_body => l_email_attr_rec.ih_message,
2577 p_sent2_email => NULL,
2578 p_media_type => G_MEDIA_TYPE_WEB_FORM
2579 );
2580 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2581 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
2582 'OKS_AUTO_REMINDER.log_interaction(x_return_status= '||
2583 x_return_status||' x_msg_count ='||x_msg_count||')');
2584 END IF;
2585 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
2586 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2587 ELSIF x_return_status = G_RET_STS_ERROR THEN
2588 RAISE FND_API.G_EXC_ERROR;
2589 END IF;
2590 IF NVL(l_send_email_yn,'N') = 'Y' THEN
2591 l_email_attr_rec.CONTRACT_ID := p_contract_id;
2592 l_email_attr_rec.ITEM_KEY := l_item_key;
2593 l_email_attr_rec.EMAIL_TYPE := G_REPORT_TYPE_ACCEPT;
2594 l_email_attr_rec.TO_EMAIL := NULL;
2595 l_email_attr_rec.SENDER_EMAIL := NULL;
2596
2597 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2598 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
2599 'OKS_WF_K_PROCESS_PVT.set_email_attributes('||
2600 ' Contract ID ='||p_contract_id||
2601 ' Email Type ='||l_email_attr_rec.EMAIL_TYPE||')');
2602 END IF;
2603 set_email_attributes
2604 (
2605 p_api_version => l_api_version,
2606 p_init_msg_list => OKC_API.G_FALSE,
2607 p_email_attr => l_email_attr_rec,
2608 x_return_status => x_return_status,
2609 x_msg_data => x_msg_data,
2610 x_msg_count => x_msg_count
2611 );
2612 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2613 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
2614 'OKS_WF_K_PROCESS_PVT.set_email_attributes(x_return_status= '||
2615 x_return_status||' x_msg_count ='||x_msg_count||')');
2616 END IF;
2617 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
2618 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2619 ELSIF x_return_status = G_RET_STS_ERROR THEN
2620 RAISE FND_API.G_EXC_ERROR;
2621 END IF;
2622 END IF;
2623
2624 OPEN l_payment_csr(p_contract_id);
2625 FETCH l_payment_csr INTO l_notif_attr_rec.SUBJECT;
2626 CLOSE l_payment_csr;
2627
2628 l_notif_attr_rec.CONTRACT_ID := p_contract_id;
2629 l_notif_attr_rec.ITEM_KEY := l_item_key;
2630 l_notif_attr_rec.PERFORMER := NULL;
2631 l_notif_attr_rec.NTF_TYPE := G_NTF_TYPE_ACCEPT;
2632 l_notif_attr_rec.NTF_SUBJECT := NULL;
2633 l_notif_attr_rec.ACCEPT_DECLINE_BY := NULL;
2634
2635 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2636 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
2637 'OKS_WF_K_PROCESS_PVT.set_notification_attributes('||
2638 ' Contract ID ='||p_contract_id||
2639 ' Notification Type ='||l_notif_attr_rec.NTF_TYPE||
2640 ' Message Subject ='||l_notif_attr_rec.SUBJECT||')');
2641 END IF;
2642 set_notification_attributes
2643 (
2644 p_api_version => l_api_version,
2645 p_init_msg_list => OKC_API.G_FALSE,
2646 p_notif_attr => l_notif_attr_rec,
2647 x_return_status => x_return_status,
2648 x_msg_data => x_msg_data,
2649 x_msg_count => x_msg_count
2650 );
2651 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2652 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
2653 'OKS_WF_K_PROCESS_PVT.set_notification_attributes(x_return_status= '||
2654 x_return_status||' x_msg_count ='||x_msg_count||')');
2655 END IF;
2656 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
2657 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2658 ELSIF x_return_status = G_RET_STS_ERROR THEN
2659 RAISE FND_API.G_EXC_ERROR;
2660 END IF;
2661
2662 -- valid activity , complete the wf activity
2663 complete_activity
2664 (
2665 p_api_version => 1,
2666 p_init_msg_list => G_FALSE,
2667 p_contract_id => p_contract_id,
2668 p_item_key => l_item_key,
2669 p_resultout => 'ACCEPT',
2670 p_process_status => G_NEG_STS_QUOTE_ACPTD,
2671 p_activity_name => G_CUST_ACTION,
2672 x_return_status => x_return_status,
2673 x_msg_data => x_msg_data,
2674 x_msg_count => x_msg_count
2675 );
2676
2677 -- If any errors happen abort API
2678 IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
2679 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2680 ELSIF (x_return_status = G_RET_STS_ERROR) THEN
2681 RAISE FND_API.G_EXC_ERROR;
2682 END IF;
2683 ELSE
2684 -- invalid activity
2685 fnd_message.set_name(G_APP_NAME,'OKS_INVALID_CUST_ACPT_ACTION');
2686 fnd_message.set_token('K_NUMBER',get_concat_k_number(p_contract_id));
2687 fnd_msg_pub.add;
2688 RAISE FND_API.G_EXC_ERROR;
2689 END IF;
2690
2691 IF FND_API.to_boolean( p_commit ) THEN
2692 COMMIT;
2693 END IF;
2694
2695 -- Standard call to get message count and if count is 1, get message info.
2696 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
2697
2698 -- end debug log
2699 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2700 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
2701 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
2702 END IF;
2703 EXCEPTION
2704 WHEN FND_API.G_EXC_ERROR THEN
2705 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
2706 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
2707 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2708 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
2709 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_ERROR');
2710 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
2711 END IF;
2712 x_return_status := G_RET_STS_ERROR;
2713 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2714 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
2715 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
2716 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2717 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
2718 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_UNEXPECTED_ERROR');
2719 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
2720 END IF;
2721 x_return_status := G_RET_STS_UNEXP_ERROR ;
2722 WHEN OTHERS THEN
2723 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
2724 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2725 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
2726 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from OTHERS sqlcode = '
2727 ||SQLCODE||', sqlerrm = '||SQLERRM);
2728 END IF;
2729 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
2730 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
2731 x_return_status := G_RET_STS_UNEXP_ERROR ;
2732 END customer_accept_quote;
2733
2734 ---------------------------------------------------
2735 PROCEDURE customer_decline_quote
2736 (
2737 p_api_version IN NUMBER,
2738 p_init_msg_list IN VARCHAR2,
2739 p_commit IN VARCHAR2 DEFAULT 'F',
2740 p_contract_id IN NUMBER,
2741 p_item_key IN VARCHAR2,
2742 p_reason_code IN VARCHAR2,
2743 p_comments IN VARCHAR2,
2744 x_return_status OUT NOCOPY VARCHAR2,
2745 x_msg_data OUT NOCOPY VARCHAR2,
2746 x_msg_count OUT NOCOPY NUMBER
2747 ) AS
2748
2749 l_api_version CONSTANT NUMBER := 1;
2750 l_api_name CONSTANT VARCHAR2(30) := 'customer_decline_quote';
2751
2752 CURSOR c_old_sts (p_contract_id IN NUMBER) is
2753 SELECT STS_CODE
2754 FROM OKC_K_HEADERS_ALL_B okck,
2755 OKC_STATUSES_B sts
2756 WHERE sts.ste_code = 'ENTERED'
2757 AND id = p_contract_id
2758 AND sts.code = okck.sts_code;
2759
2760 CURSOR l_new_sts_code_csr IS
2761 SELECT CODE FROM okc_statuses_b
2762 WHERE ste_code = 'CANCELLED'
2763 AND default_yn = 'Y'
2764 AND sysdate BETWEEN START_DATE AND NVL(end_date,SYSDATE+1);
2765
2766 l_send_email_yn VARCHAR2(1) := 'N';
2767 l_item_key wf_items.item_key%TYPE;
2768 l_email_attr_rec OKS_WF_K_PROCESS_PVT.email_attr_rec;
2769 l_notif_attr_rec OKS_WF_K_PROCESS_PVT.notif_attr_rec;
2770 l_old_sts OKC_STATUSES_B.CODE%TYPE;
2771 l_new_sts OKC_STATUSES_B.CODE%TYPE;
2772 l_rownotfound BOOLEAN := FALSE;
2773 l_reason VARCHAR2(250);
2774
2775 BEGIN
2776 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2777 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
2778 'Entered '||G_PKG_NAME ||'.'||l_api_name||' with p_contract_id'||
2779 p_contract_id||' p_item_key:'||p_item_key);
2780 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
2781 'p_reason_code:'||p_reason_code||' p_comments:'||p_comments);
2782 END IF;
2783
2784 DBMS_TRANSACTION.SAVEPOINT(l_api_name);
2785 -- Standard call to check for call compatibility.
2786 IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
2787 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2788 END IF;
2789
2790 -- Initialize message list if p_init_msg_list is set to TRUE.
2791 IF FND_API.to_Boolean( p_init_msg_list ) THEN
2792 FND_MSG_PUB.initialize;
2793 END IF;
2794
2795 -- Initialize API return status to success
2796 x_return_status := FND_API.G_RET_STS_SUCCESS;
2797
2798 IF p_item_key IS NULL THEN
2799 l_item_key := get_wf_item_key(p_contract_id);
2800 IF l_item_key IS NULL THEN
2801 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INVALID_WF_ITEM_KEY');
2802 FND_MSG_PUB.add;
2803 RAISE FND_API.G_EXC_ERROR;
2804 END IF;
2805 ELSE
2806 l_item_key := p_item_key;
2807 END IF; -- p_item_key IS NULL
2808
2809 IF activity_exist_in_process (
2810 p_item_type => G_ITEM_TYPE,
2811 p_item_key => l_item_key,
2812 p_activity_name => G_CUST_ACTION ) THEN
2813
2814 -- bug 5845505, send email only if template for the document type is setup
2815 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2816 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
2817 'OKS_WF_K_PROCESS_PVT.is_template_defined('||
2818 ' Contract ID ='||p_contract_id||
2819 ' Document Type ='||G_REPORT_TYPE_CANCEL||')');
2820 END IF;
2821 is_template_defined (
2822 p_api_version => l_api_version,
2823 p_init_msg_list => G_FALSE,
2824 p_contract_id => p_contract_id,
2825 p_document_type => G_REPORT_TYPE_CANCEL,
2826 x_template_defined_yn => l_send_email_yn,
2827 x_email_attr_rec => l_email_attr_rec,
2828 x_return_status => x_return_status,
2829 x_msg_data => x_msg_data,
2830 x_msg_count => x_msg_count
2831 );
2832
2833 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2834 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
2835 'OKS_WF_K_PROCESS_PVT.is_template_defined(x_return_status= '||
2836 x_return_status||' x_msg_count ='||x_msg_count||')');
2837 END IF;
2838 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
2839 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2840 ELSIF x_return_status = G_RET_STS_ERROR THEN
2841 RAISE FND_API.G_EXC_ERROR;
2842 END IF;
2843
2844 wf_engine.SetItemAttrText
2845 (
2846 itemtype => G_ITEM_TYPE,
2847 itemkey => l_item_key,
2848 aname => 'SEND_CONFIRM',
2849 avalue => l_send_email_yn
2850 );
2851
2852 l_reason := get_lookup_meaning(p_reason_code,G_LKUP_TYPE_CNCL_REASON);
2853
2854 --log interaction (media type WEB FORM) that customer has declined the quote
2855 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2856 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
2857 'OKS_WF_K_PROCESS_PVT.set_email_attributes('||
2858 ' Contract ID = '||p_contract_id||
2859 substr(' IH Message = '||p_comments,1,100)||
2860 substr(' IH Subject = '||l_reason||')',1,100));
2861 END IF;
2862 OKS_AUTO_REMINDER.log_interaction (
2863 p_api_version => l_api_version,
2864 p_init_msg_list => G_FALSE,
2865 x_return_status => x_return_status,
2866 x_msg_count => x_msg_count,
2867 x_msg_data => x_msg_data,
2868 p_chr_id => p_contract_id,
2869 p_subject => l_reason,
2870 p_msg_body => p_comments,
2871 p_sent2_email => NULL,
2872 p_media_type => G_MEDIA_TYPE_WEB_FORM
2873 );
2874 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2875 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
2876 'OKS_AUTO_REMINDER.log_interaction(x_return_status= '||
2877 x_return_status||' x_msg_count ='||x_msg_count||')');
2878 END IF;
2879 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
2880 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2881 ELSIF x_return_status = G_RET_STS_ERROR THEN
2882 RAISE FND_API.G_EXC_ERROR;
2883 END IF;
2884 IF NVL(l_send_email_yn,'N') = 'Y' THEN
2885
2886 l_email_attr_rec.CONTRACT_ID := p_contract_id;
2887 l_email_attr_rec.ITEM_KEY := l_item_key;
2888 l_email_attr_rec.EMAIL_TYPE := G_REPORT_TYPE_CANCEL;
2889 l_email_attr_rec.TO_EMAIL := NULL;
2890 l_email_attr_rec.SENDER_EMAIL := NULL;
2891
2892 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2893 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
2894 'OKS_WF_K_PROCESS_PVT.set_email_attributes('||
2895 ' Contract ID ='||p_contract_id||
2896 ' Email Type ='||l_email_attr_rec.EMAIL_TYPE||')');
2897 END IF;
2898 set_email_attributes
2899 (
2900 p_api_version => l_api_version,
2901 p_init_msg_list => OKC_API.G_FALSE,
2902 p_email_attr => l_email_attr_rec,
2903 x_return_status => x_return_status,
2904 x_msg_data => x_msg_data,
2905 x_msg_count => x_msg_count
2906 );
2907 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2908 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
2909 'OKS_WF_K_PROCESS_PVT.set_email_attributes(x_return_status= '||
2910 x_return_status||' x_msg_count ='||x_msg_count||')');
2911 END IF;
2912 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
2913 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2914 ELSIF x_return_status = G_RET_STS_ERROR THEN
2915 RAISE FND_API.G_EXC_ERROR;
2916 END IF;
2917 END IF;
2918
2919 l_notif_attr_rec.CONTRACT_ID := p_contract_id;
2920 l_notif_attr_rec.ITEM_KEY := l_item_key;
2921 l_notif_attr_rec.PERFORMER := NULL;
2922 l_notif_attr_rec.NTF_TYPE := G_NTF_TYPE_DECLINE;
2923 l_notif_attr_rec.NTF_SUBJECT := NULL;
2924 l_notif_attr_rec.SUBJECT := l_reason;
2925 l_notif_attr_rec.MESSAGE1 := p_comments;
2926 l_notif_attr_rec.ACCEPT_DECLINE_BY := NULL;
2927
2928 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2929 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
2930 'OKS_WF_K_PROCESS_PVT.set_notification_attributes('||
2931 ' Contract ID ='||p_contract_id||
2932 ' Notification Type ='||l_notif_attr_rec.NTF_TYPE||
2933 ' Subject ='||l_notif_attr_rec.NTF_SUBJECT||')');
2934 END IF;
2935 set_notification_attributes
2936 (
2937 p_api_version => l_api_version,
2938 p_init_msg_list => OKC_API.G_FALSE,
2939 p_notif_attr => l_notif_attr_rec,
2940 x_return_status => x_return_status,
2941 x_msg_data => x_msg_data,
2942 x_msg_count => x_msg_count
2943 );
2944 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2945 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
2946 'OKS_WF_K_PROCESS_PVT.set_notification_attributes(x_return_status= '||
2947 x_return_status||' x_msg_count ='||x_msg_count||')');
2948 END IF;
2949 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
2950 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2951 ELSIF x_return_status = G_RET_STS_ERROR THEN
2952 RAISE FND_API.G_EXC_ERROR;
2953 END IF;
2954
2955 OPEN c_old_sts(p_contract_id);
2956 FETCH c_old_sts INTO l_old_sts;
2957 l_rownotfound := c_old_sts%NOTFOUND;
2958 CLOSE c_old_sts;
2959 IF NOT l_rownotfound THEN
2960
2961 -- Bug fix 5893728
2962 OPEN l_new_sts_code_csr;
2963 FETCH l_new_sts_code_csr INTO l_new_sts;
2964 CLOSE l_new_sts_code_csr;
2965
2966 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
2967 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
2968 'OKS_CHANGE_STATUS_PVT.UPDATE_HEADER_STATUS(p_id= '||p_contract_id||
2969 ' p_old_sts_code ='||l_old_sts||' p_comments ='||substr(p_comments,1,250)||
2970 ' p_canc_reason_code ='||p_reason_code||')');
2971 END IF;
2972 OKS_CHANGE_STATUS_PVT.UPDATE_HEADER_STATUS (
2973 x_return_status => x_return_status,
2974 x_msg_data => x_msg_data,
2975 x_msg_count => x_msg_count,
2976 p_init_msg_list => G_FALSE,
2977 p_id => p_contract_id,
2978 p_new_sts_code => l_new_sts,
2979 p_old_sts_code => l_old_sts,
2980 p_canc_reason_code => p_reason_code,
2981 p_comments => p_comments,
2982 p_term_cancel_source => G_PERFORMED_BY_CUST,
2983 p_date_cancelled => SYSDATE,
2984 p_validate_status => 'N') ;
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_CHANGE_STATUS_PVT.UPDATE_HEADER_STATUS(x_return_status= '||x_return_status||
2988 ' 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 ELSE
2996 FND_MESSAGE.set_name('OKS','OKS_CANT_CANCEL_K'); -- set the message here
2997 FND_MESSAGE.set_token('K_NUMBER',get_concat_k_number(p_contract_id));
2998 fnd_msg_pub.add;
2999 RAISE FND_API.G_EXC_ERROR;
3000 END IF;
3001 ELSE
3002 -- invalid activity
3003 fnd_message.set_name(G_APP_NAME,'OKS_INVALID_CUST_DCLN_ACTION');
3004 fnd_message.set_token('K_NUMBER',get_concat_k_number(p_contract_id));
3005 fnd_msg_pub.add;
3006 RAISE FND_API.G_EXC_ERROR;
3007 END IF;
3008
3009 IF FND_API.to_boolean( p_commit ) THEN
3010 COMMIT;
3011 END IF;
3012
3013 -- Standard call to get message count and if count is 1, get message info.
3014 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3015
3016 -- end debug log
3017 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3018 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
3019 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
3020 END IF;
3021
3022 EXCEPTION
3023 WHEN FND_API.G_EXC_ERROR THEN
3024 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
3025 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3026 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3027 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
3028 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_ERROR');
3029 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
3030 END IF;
3031 x_return_status := G_RET_STS_ERROR;
3032 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3033 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
3034 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3035 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3036 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
3037 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_UNEXPECTED_ERROR');
3038 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
3039 END IF;
3040 x_return_status := G_RET_STS_UNEXP_ERROR ;
3041 WHEN OTHERS THEN
3042 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
3043 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3044 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
3045 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from OTHERS sqlcode = '
3046 ||SQLCODE||', sqlerrm = '||SQLERRM);
3047 END IF;
3048 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
3049 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3050 x_return_status := G_RET_STS_UNEXP_ERROR ;
3051 END customer_decline_quote;
3052
3053 ---------------------------------------------------
3054 PROCEDURE customer_request_assistance
3055 (
3056 p_api_version IN NUMBER,
3057 p_init_msg_list IN VARCHAR2,
3058 p_commit IN VARCHAR2 DEFAULT 'F',
3059 p_contract_id IN NUMBER,
3060 p_item_key IN VARCHAR2,
3061 p_to_email IN VARCHAR2,
3062 p_cc_email IN VARCHAR2,
3063 p_subject IN VARCHAR2,
3064 p_message IN VARCHAR2,
3065 x_return_status OUT NOCOPY VARCHAR2,
3066 x_msg_data OUT NOCOPY VARCHAR2,
3067 x_msg_count OUT NOCOPY NUMBER
3068 ) AS
3069
3070 l_api_version CONSTANT NUMBER := 1;
3071 l_api_name CONSTANT VARCHAR2(30) := 'customer_request_assistance';
3072 l_item_key wf_items.item_key%TYPE;
3073 l_interaction_subject VARCHAR2(4000);
3074 l_interaction_message VARCHAR2(4000);
3075 l_role_name wf_roles.name%TYPE := NULL;
3076 l_role_email wf_roles.email_address%TYPE;
3077 l_notif_attr_rec OKS_WF_K_PROCESS_PVT.notif_attr_rec;
3078 l_salesrep_email VARCHAR2(240);
3079 l_salesrep_username VARCHAR2(100);
3080 l_display_rolename VARCHAR2(360);
3081
3082 tmp_email_list VARCHAR2(8000) ;
3083 i NUMBER := 0;
3084 j NUMBER := 0;
3085
3086 TYPE l_user_list IS TABLE OF VARCHAR2(500) INDEX BY BINARY_INTEGER;
3087 l_user_tbl l_user_list;
3088 l_user_name VARCHAR2(4000);
3089 x_user_name VARCHAR2(4000);
3090
3091
3092 BEGIN
3093 -- start debug log
3094 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3095 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
3096 'Entered '||G_PKG_NAME ||'.'||l_api_name||
3097 '(p_contract_id=>'||p_contract_id||
3098 ',p_item_key=>'||p_item_key||
3099 ',p_to_email=>'||p_to_email||')');
3100 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
3101 'p_cc_email=>'||p_cc_email||
3102 ',p_subject=>'||p_subject||
3103 ',p_message=>'||p_message||')');
3104 END IF;
3105
3106 DBMS_TRANSACTION.SAVEPOINT(l_api_name);
3107 -- Standard call to check for call compatibility.
3108 IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
3109 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3110 END IF;
3111
3112 -- Initialize message list if p_init_msg_list is set to TRUE.
3113 IF FND_API.to_Boolean( p_init_msg_list ) THEN
3114 FND_MSG_PUB.initialize;
3115 END IF;
3116
3117 -- Initialize API return status to success
3118 x_return_status := FND_API.G_RET_STS_SUCCESS;
3119
3120 IF p_item_key IS NULL THEN
3121 l_item_key := get_wf_item_key(p_contract_id);
3122 IF l_item_key IS NULL THEN
3123 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INVALID_WF_ITEM_KEY');
3124 FND_MSG_PUB.add;
3125 RAISE FND_API.G_EXC_ERROR;
3126 END IF;
3127 ELSE
3128 l_item_key := p_item_key;
3129 END IF; -- p_item_key IS NULL
3130
3131 IF activity_exist_in_process (
3132 p_item_type => G_ITEM_TYPE,
3133 p_item_key => l_item_key,
3134 p_activity_name => G_CUST_ACTION ) THEN
3135
3136 -- Ignore the p_to_email value and get the salesrep email and FND username again
3137 -- Due to big impact of changing the signature we r taking this route
3138 -- This changes are done due to the requirement to send notification to Salesrep
3139 -- and an email to cc'ed guys
3140 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3141 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
3142 'OKS_CUSTOMER_ACCEPTANCE_PVT.get_contract_salesrep_details('||
3143 ' Contract ID ='||p_contract_id||')');
3144 END IF;
3145 OKS_CUSTOMER_ACCEPTANCE_PVT.get_contract_salesrep_details
3146 (
3147 p_chr_id => p_contract_id,
3148 x_salesrep_email => l_salesrep_email,
3149 x_salesrep_username => l_salesrep_username,
3150 x_return_status => x_return_status,
3151 x_msg_data => x_msg_data,
3152 x_msg_count => x_msg_count
3153 );
3154 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3155 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
3156 'OKS_CUSTOMER_ACCEPTANCE_PVT.get_contract_salesrep_details(x_salesrep_email= '||
3157 l_salesrep_email||' x_salesrep_username= '||l_salesrep_username||
3158 'x_return_status= '||x_return_status||' x_msg_count ='||x_msg_count||')');
3159 END IF;
3160 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
3161 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3162 ELSIF x_return_status = G_RET_STS_ERROR THEN
3163 RAISE FND_API.G_EXC_ERROR;
3164 END IF;
3165
3166 IF p_cc_email IS NOT NULL THEN
3167 -- Create a adhoc user and role for wf to send the email
3168 l_role_name := p_contract_id||' - '||to_char(sysdate,'DDMMYYYYHHMISS');
3169
3170 -- Create adhoc user for wf
3171 --Convert email list (string) to PL/SQL Array for creating adhoc users
3172 tmp_email_list := p_cc_email;
3173
3174 LOOP
3175 i := INSTR(tmp_email_list,',');
3176
3177 -- debug log
3178 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3179 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
3180 G_MODULE||l_api_name,'i : '||i);
3181 END IF;
3182
3183 IF i > 0 THEN
3184 -- comma found
3185
3186 l_user_tbl(j) := SUBSTR(tmp_email_list,1,i-1);
3187
3188 -- debug log
3189 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3190 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE ,
3191 G_MODULE||l_api_name,'j :'||j);
3192 END IF;
3193
3194 tmp_email_list := SUBSTR(tmp_email_list,i+1, length(tmp_email_list) - i);
3195
3196 -- debug log
3197 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3198 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
3199 'tmp_email_list : '||tmp_email_list);
3200 END IF;
3201
3202 j := j + 1;
3203 ELSE
3204 -- no comma found i.e last contract id
3205 l_user_tbl(j) := tmp_email_list;
3206 EXIT;
3207 END IF;
3208
3209 END LOOP;
3210
3211 -- debug log
3212 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3213 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
3214 'After Converting email list to pl/sql');
3215 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
3216 'Count of Emails is : '||l_user_tbl.COUNT);
3217 END IF;
3218
3219
3220 -- for each email create a adhoc user
3221 FOR k IN NVL(l_user_tbl.FIRST,0)..NVL(l_user_tbl.LAST,-1)
3222 LOOP
3223
3224 x_user_name := '';
3225
3226 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3227 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
3228 'Wf_Directory.CreateAdHocUser(email_address ='||l_user_tbl(k)||')');
3229 END IF;
3230
3231 BEGIN
3232 WF_DIRECTORY.CreateAdHocUser(
3233 name => x_user_name,
3234 display_name => x_user_name,
3235 language => null,
3236 territory => null,
3237 description => 'OKS: Renewal Adhoc User',
3238 notification_preference => 'MAILHTML',
3239 email_address => l_user_tbl(k),
3240 status => 'ACTIVE',
3241 expiration_date => SYSDATE+1 ,
3242 parent_orig_system => null,
3243 parent_orig_system_id => null);
3244 EXCEPTION
3245 WHEN OTHERS THEN
3246 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_CREATE_ADHOC_USER_FAILED');
3247 FND_MESSAGE.set_token('USER_NAME',l_user_tbl(k));
3248 FND_MESSAGE.set_token('SQL_ERROR',SQLERRM);
3249 FND_MSG_PUB.add;
3250 RAISE FND_API.G_EXC_ERROR;
3251 END;
3252
3253
3254 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3255 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
3256 'Wf_Directory.CreateAdHocUser SUCCESS created user : '||x_user_name);
3257 END IF;
3258
3259 -- build concatinated list of user name for adhoc role
3260 l_user_name := l_user_name||','||x_user_name;
3261
3262 END LOOP;
3263
3264
3265 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3266 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
3267 'Wf_Directory.CreateAdHocRole(email_address ='||p_cc_email||')');
3268 END IF;
3269
3270 -- call wf api to create the adhoc role
3271 BEGIN
3272 l_display_rolename := substr(p_cc_email,1,360);
3273 Wf_Directory.CreateAdHocRole
3274 (
3275 role_name => l_role_name,
3276 role_display_name => l_role_name, --l_display_rolename, COMMENTED COZ EMAIL NOT DELIVERED
3277 language => null,
3278 territory => null,
3279 role_description => 'OKS: Renewal Adhoc role',
3280 notification_preference => 'MAILHTML',
3281 role_users => l_user_name,
3282 email_address => NULL,
3283 fax => null,
3284 status => 'ACTIVE',
3285 expiration_date => SYSDATE+1,
3286 parent_orig_system => null,
3287 parent_orig_system_id => null,
3288 owner_tag => null
3289 );
3290 EXCEPTION
3291 WHEN OTHERS THEN
3292 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_CREATE_ADHOC_ROLE_FAILED');
3293 FND_MESSAGE.set_token('ROLE_NAME',l_role_name);
3294 FND_MESSAGE.set_token('SQL_ERROR',SQLERRM);
3295 FND_MSG_PUB.add;
3296 RAISE FND_API.G_EXC_ERROR;
3297 END;
3298
3299 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3300 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
3301 'Wf_Directory.CreateAdHocRole - Success');
3302 END IF;
3303 END IF;
3304
3305 l_notif_attr_rec.CONTRACT_ID := p_contract_id;
3306 l_notif_attr_rec.ITEM_KEY := l_item_key;
3307 l_notif_attr_rec.PERFORMER := l_salesrep_username;
3308 l_notif_attr_rec.REQ_ASSIST_ROLE := l_role_name;
3309 l_notif_attr_rec.NTF_TYPE := G_NTF_TYPE_MESSAGE;
3310 l_notif_attr_rec.NTF_SUBJECT := NULL;
3311 l_notif_attr_rec.SUBJECT := p_subject;
3312 l_notif_attr_rec.MESSAGE1 := p_message;
3313 l_notif_attr_rec.ACCEPT_DECLINE_BY := NULL;
3314
3315 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3316 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
3317 'OKS_WF_K_PROCESS_PVT.set_notification_attributes('||
3318 ' Contract ID ='||p_contract_id||
3319 ' Notification Type ='||l_notif_attr_rec.NTF_TYPE||
3320 ' Subject ='||l_notif_attr_rec.NTF_SUBJECT||')');
3321 END IF;
3322 set_notification_attributes
3323 (
3324 p_api_version => l_api_version,
3325 p_init_msg_list => OKC_API.G_FALSE,
3326 p_notif_attr => l_notif_attr_rec,
3327 x_return_status => x_return_status,
3328 x_msg_data => x_msg_data,
3329 x_msg_count => x_msg_count
3330 );
3331 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3332 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
3333 'OKS_WF_K_PROCESS_PVT.set_notification_attributes(x_return_status= '||
3334 x_return_status||' x_msg_count ='||x_msg_count||')');
3335 END IF;
3336
3337 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
3338 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3339 ELSIF x_return_status = G_RET_STS_ERROR THEN
3340 RAISE FND_API.G_EXC_ERROR;
3341 END IF;
3342
3343 -- log interaction history
3344 fnd_message.set_name(G_APP_NAME,'OKS_IH_SUBJECT_CUST_ASS');
3345 l_interaction_subject := fnd_message.get;
3346
3347 fnd_message.set_name(G_APP_NAME,'OKS_IH_MESSAGE_CUST_ASS');
3348 fnd_message.set_token('K_NUMBER',get_concat_k_number(p_contract_id));
3349 fnd_message.set_token('SUBJECT',p_subject);
3350 fnd_message.set_token('MESSAGE',p_message);
3351 l_interaction_message := fnd_message.get;
3352
3353 IF p_cc_email IS NULL THEN
3354 l_role_email := l_salesrep_email;
3355 ELSE
3356 l_role_email := l_salesrep_email||','||p_cc_email;
3357 END IF;
3358
3359 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3360 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
3361 'OKS_AUTO_REMINDER.log_interaction(p_contract_id= '
3362 ||p_contract_id||' p_subject='||l_interaction_subject||
3363 ' p_msg_body='||l_interaction_message||
3364 ' p_sent2_email='||l_role_email||')');
3365 END IF;
3366 OKS_AUTO_REMINDER.log_interaction
3367 (
3368 p_api_version => l_api_version,
3369 p_init_msg_list => G_FALSE,
3370 x_return_status => x_return_status,
3371 x_msg_count => x_msg_data,
3372 x_msg_data => x_msg_count,
3373 p_chr_id => p_contract_id,
3374 p_subject => l_interaction_subject,
3375 p_msg_body => l_interaction_message,
3376 p_sent2_email => l_role_email
3377 );
3378 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3379 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
3380 'OKS_AUTO_REMINDER.log_interaction(x_return_status= '||x_return_status||
3381 ' x_msg_count ='||x_msg_count||')');
3382 END IF;
3383 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
3384 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3385 ELSIF x_return_status = G_RET_STS_ERROR THEN
3386 RAISE FND_API.G_EXC_ERROR;
3387 END IF;
3388
3389 -- valid activity , complete the wf activity
3390 complete_activity
3391 (
3392 p_api_version => 1,
3393 p_init_msg_list => FND_API.G_FALSE,
3394 p_contract_id => p_contract_id,
3395 p_item_key => l_item_key,
3396 p_resultout => 'REQUEST_ASSISTANCE',
3397 p_process_status => G_NEG_STS_ASSIST_REQD,
3398 p_activity_name => G_CUST_ACTION,
3399 x_return_status => x_return_status,
3400 x_msg_data => x_msg_data,
3401 x_msg_count => x_msg_count
3402 );
3403 -- If any errors happen abort API
3404 IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
3405 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3406 ELSIF (x_return_status = G_RET_STS_ERROR) THEN
3407 RAISE FND_API.G_EXC_ERROR;
3408 END IF;
3409
3410 ELSE
3411 -- invalid activity
3412 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INVALID_REQ_ASST_ACTION');
3413 fnd_message.set_token('K_NUMBER',get_concat_k_number(p_contract_id));
3414 FND_MSG_PUB.add;
3415 RAISE FND_API.G_EXC_ERROR;
3416 END IF;
3417
3418 IF FND_API.to_boolean( p_commit ) THEN
3419 COMMIT;
3420 END IF;
3421
3422 -- Standard call to get message count and if count is 1, get message info.
3423 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3424
3425 -- end debug log
3426 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3427 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
3428 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
3429 END IF;
3430
3431 EXCEPTION
3432 WHEN FND_API.G_EXC_ERROR THEN
3433 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
3434 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3435 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3436 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
3437 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_ERROR');
3438 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
3439 END IF;
3440 x_return_status := G_RET_STS_ERROR;
3441 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3442 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
3443 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3444 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3445 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
3446 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_UNEXPECTED_ERROR');
3447 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
3448 END IF;
3449 x_return_status := G_RET_STS_UNEXP_ERROR ;
3450 WHEN OTHERS THEN
3451 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
3452 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3453 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
3454 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from OTHERS sqlcode = '
3455 ||SQLCODE||', sqlerrm = '||SQLERRM);
3456 END IF;
3457 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
3458 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3459 x_return_status := G_RET_STS_UNEXP_ERROR ;
3460 END customer_request_assistance;
3461
3462 /*=========================================================================
3463 API name : update_negotiation_status
3464 Type : Private.
3465 Function : This procedure updates renewal status in OKS_K_HEADERS_B
3466 and bumps up the version.
3467 Pre-reqs : None.
3468 Parameters :
3469 IN : p_api_version IN NUMBER Required
3470 Api version
3471 : p_init_msg_list IN VARCHAR2 Required
3472 Initialize message stack parameter
3473 : p_chr_id IN NUMBER Required
3474 Contract header Id
3475 : p_negotiation_status IN VARCHAR2 Required
3476 New negotiation status that is to be updated.
3477 OUT : x_return_status OUT VARCHAR2(1)
3478 Api return status
3479 : x_msg_count OUT NUMBER
3480 Count of message on error stack
3481 : x_msg_data OUT VARCHAR2
3482 Actual error messages on error stack
3483 Note :
3484 =========================================================================*/
3485 PROCEDURE update_negotiation_status
3486 (
3487 p_api_version IN NUMBER,
3488 p_init_msg_list IN VARCHAR2,
3489 p_commit IN VARCHAR2 DEFAULT 'F',
3490 p_chr_id IN NUMBER,
3491 p_negotiation_status IN VARCHAR2,
3492 x_return_status OUT NOCOPY VARCHAR2,
3493 x_msg_count OUT NOCOPY NUMBER,
3494 x_msg_data OUT NOCOPY VARCHAR2
3495 ) IS
3496
3497 l_api_version CONSTANT NUMBER := 1.0;
3498 l_api_name CONSTANT VARCHAR2(30) := 'update_negotiation_status';
3499
3500 BEGIN
3501
3502 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3503 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
3504 'Entered '||G_PKG_NAME ||'.'||l_api_name||
3505 '(p_chr_id=>'||p_chr_id||'p_negotiation_status=>'||p_negotiation_status||')');
3506 END IF;
3507
3508 DBMS_TRANSACTION.SAVEPOINT(l_api_name);
3509 -- Standard call to check for call compatibility.
3510 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
3511 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3512 END IF;
3513
3514 IF FND_API.to_Boolean( p_init_msg_list ) THEN
3515 FND_MSG_PUB.initialize;
3516 END IF;
3517
3518 -- Initialize API return status to success
3519 x_return_status := FND_API.G_RET_STS_SUCCESS;
3520
3521 IF p_negotiation_status IS NOT NULL THEN
3522 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3523 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
3524 'Updating Contract: '||G_PKG_NAME ||'.'||l_api_name);
3525 END IF;
3526 UPDATE oks_k_headers_b
3527 SET renewal_status = p_negotiation_status,
3528 object_version_number = object_version_number + 1,
3529 last_update_date = SYSDATE,
3530 last_updated_by = FND_GLOBAL.USER_ID,
3531 last_update_login = FND_GLOBAL.LOGIN_ID
3532 WHERE chr_id = p_chr_id;
3533
3534 /* COMMENTING THE CODE DUE TO DEADLOCK ISSUES ENCOUNTERED WHILE COMPLETING WF
3535 -- bump up the minor version number
3536 UPDATE okc_k_vers_numbers
3537 SET minor_version = minor_version + 1,
3538 object_version_number = object_version_number + 1,
3539 last_update_date = SYSDATE,
3540 last_updated_by = FND_GLOBAL.USER_ID,
3541 last_update_login = FND_GLOBAL.LOGIN_ID
3542 WHERE chr_id = p_chr_id;
3543 */
3544 END IF;
3545
3546 IF FND_API.to_boolean( p_commit ) THEN
3547 COMMIT;
3548 END IF;
3549
3550 -- Standard call to get message count and if count is 1, get message info.
3551 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count=>x_msg_count, p_data=>x_msg_data);
3552
3553 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3554 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
3555 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
3556 END IF;
3557
3558 EXCEPTION
3559 WHEN FND_API.G_EXC_ERROR THEN
3560 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
3561 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3562 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3563 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
3564 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_ERROR');
3565 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
3566 END IF;
3567 x_return_status := G_RET_STS_ERROR;
3568 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3569 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
3570 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3571 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3572 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
3573 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_UNEXPECTED_ERROR');
3574 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
3575 END IF;
3576 x_return_status := G_RET_STS_UNEXP_ERROR ;
3577 WHEN OTHERS THEN
3578 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
3579 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3580 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
3581 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from OTHERS sqlcode = '
3582 ||SQLCODE||', sqlerrm = '||SQLERRM);
3583 END IF;
3584 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
3585 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3586 x_return_status := G_RET_STS_UNEXP_ERROR ;
3587 END update_negotiation_status;
3588
3589 /*=========================================================================
3590 API name : set_notification_attr
3591 Type : Private.
3592 Function : This procedure sets all the relavant wf item attribute
3593 values that will be used in notifications. This api is called
3594 from workflow node and is a wrapper for set_notification_attributes
3595 Pre-reqs : None.
3596 Parameters :
3597 IN : itemtype IN VARCHAR2 Required
3598 Workflow item type parameter
3599 : itemkey IN VARCHAR2 Required
3600 Workflow item key parameter
3601 : actid IN VARCHAR2 Required
3602 Workflow actid parameter
3603 : funcmode IN VARCHAR2 Required
3604 Workflow function mode parameter
3605 OUT : resultout OUT VARCHAR2(1)
3606 Workflow standard out parameter
3607 Note :
3608 =========================================================================*/
3609 PROCEDURE set_notification_attr
3610 (
3611 itemtype IN VARCHAR2,
3612 itemkey IN VARCHAR2,
3613 actid IN NUMBER,
3614 funcmode IN VARCHAR2,
3615 resultout OUT nocopy VARCHAR2
3616 ) IS
3617
3618 l_api_version CONSTANT NUMBER := 1.0;
3619 l_api_name CONSTANT VARCHAR2(30) := 'set_notification_attr';
3620 l_return_status VARCHAR2(1);
3621 l_msg_count NUMBER;
3622 l_msg_data VARCHAR2(4000);
3623
3624 l_contract_id NUMBER;
3625 l_notif_type VARCHAR2(30);
3626 l_notif_attr_rec OKS_WF_K_PROCESS_PVT.notif_attr_rec;
3627
3628 l_send_email_yn VARCHAR2(1) := 'N';
3629 l_email_attr_rec OKS_WF_K_PROCESS_PVT.email_attr_rec;
3630
3631 BEGIN
3632
3633 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3634 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
3635 'Entered '||G_PKG_NAME ||'.'||l_api_name);
3636 END IF;
3637 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3638 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3639 'itemtype: ' || itemtype ||
3640 ' itemkey: ' || itemkey ||
3641 ' actid: ' || to_char(actid) ||
3642 ' funcmode: ' || funcmode);
3643 END IF;
3644 IF (funcmode = 'RUN') THEN
3645
3646 l_contract_id := wf_engine.GetItemAttrNumber(
3647 itemtype => itemtype,
3648 itemkey => itemkey,
3649 aname => 'CONTRACT_ID');
3650
3651 l_notif_type := wf_engine.GetActivityAttrText
3652 (
3653 itemtype => itemtype,
3654 itemkey => itemkey,
3655 actid => actid,
3656 aname => 'NOTIF_TYPE'
3657 );
3658
3659 l_notif_attr_rec.CONTRACT_ID := l_contract_id;
3660 l_notif_attr_rec.ITEM_KEY := itemkey;
3661 l_notif_attr_rec.PERFORMER := NULL;
3662 l_notif_attr_rec.NTF_TYPE := l_notif_type;
3663 l_notif_attr_rec.NTF_SUBJECT := NULL;
3664 l_notif_attr_rec.SUBJECT := NULL;
3665 l_notif_attr_rec.ACCEPT_DECLINE_BY := NULL;
3666
3667 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3668 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
3669 'OKS_WF_K_PROCESS_PVT.set_notification_attributes('||
3670 ' Contract ID ='||l_contract_id||
3671 ' Notification Type ='||l_notif_attr_rec.NTF_TYPE||')');
3672 END IF;
3673 set_notification_attributes
3674 (
3675 p_api_version => l_api_version,
3676 p_init_msg_list => OKC_API.G_FALSE,
3677 p_notif_attr => l_notif_attr_rec,
3678 x_return_status => l_return_status,
3679 x_msg_data => l_msg_data,
3680 x_msg_count => l_msg_count
3681 );
3682 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3683 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
3684 'OKS_WF_K_PROCESS_PVT.set_notification_attributes(x_return_status= '||
3685 l_return_status||' x_msg_count ='||l_msg_count||')');
3686 END IF;
3687 IF l_return_status <> G_RET_STS_SUCCESS THEN
3688 RAISE FND_API.G_EXC_ERROR;
3689 END IF;
3690
3691 -- check if a template is defined to send a Activation
3692 -- confirmation message only in activation flow
3693 IF l_notif_type = G_NTF_TYPE_ACTIVE THEN
3694
3695 -- bug 5845505, send email only if template for the document type is setup
3696 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3697 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
3698 'OKS_WF_K_PROCESS_PVT.is_template_defined('||
3699 ' Contract ID ='||l_contract_id||
3700 ' Document Type ='||G_REPORT_TYPE_ACTIVE||')');
3701 END IF;
3702 is_template_defined (
3703 p_api_version => l_api_version,
3704 p_init_msg_list => G_FALSE,
3705 p_contract_id => l_contract_id,
3706 p_document_type => G_REPORT_TYPE_ACTIVE,
3707 x_template_defined_yn => l_send_email_yn,
3708 x_email_attr_rec => l_email_attr_rec,
3709 x_return_status => l_return_status,
3710 x_msg_data => l_msg_data,
3711 x_msg_count => l_msg_count
3712 );
3713 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3714 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
3715 'OKS_WF_K_PROCESS_PVT.is_template_defined(x_return_status= '||
3716 l_return_status||' x_msg_count ='||l_msg_count||')');
3717 END IF;
3718 IF l_return_status <> G_RET_STS_SUCCESS THEN
3719 RAISE FND_API.G_EXC_ERROR;
3720 END IF;
3721
3722 wf_engine.SetItemAttrText
3723 (
3724 itemtype => itemtype,
3725 itemkey => itemkey,
3726 aname => 'SEND_CONFIRM',
3727 avalue => l_send_email_yn
3728 );
3729 END IF;
3730
3731 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3732 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
3733 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=RUN');
3734 END IF;
3735 RETURN;
3736 END IF; -- (funcmode = 'RUN')
3737
3738 IF (funcmode = 'CANCEL') THEN
3739 resultout := 'COMPLETE:';
3740 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3741 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
3742 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
3743 END IF;
3744 RETURN;
3745 END IF; -- (funcmode = 'CANCEL')
3746
3747 IF (funcmode = 'TIMEOUT') THEN
3748 resultout := 'COMPLETE:';
3749 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3750 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
3751 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
3752 END IF;
3753 RETURN;
3754 END IF; -- (funcmode = 'TIMEOUT')
3755
3756 EXCEPTION
3757 WHEN FND_API.G_EXC_ERROR THEN
3758 l_msg_data := get_fnd_message;
3759 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3760 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
3761 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.FND_API.G_EXC_ERROR'
3762 ||' Itemtype: '||NVL(itemtype,'NULL')||' Itemkey: '||NVL(itemkey,'NULL'));
3763 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,l_msg_data);
3764 END IF;
3765 wf_core.CONTEXT
3766 (
3767 pkg_name => G_PKG_NAME,
3768 proc_name => l_api_name,
3769 arg1 => itemtype,
3770 arg2 => itemkey,
3771 arg3 => l_msg_data
3772 );
3773 WHEN others THEN
3774 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3775 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
3776 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
3777 ||SQLCODE||', sqlerrm = '||SQLERRM);
3778 END IF;
3779 wf_core.CONTEXT
3780 (
3781 pkg_name => G_PKG_NAME,
3782 proc_name => l_api_name,
3783 arg1 => itemtype,
3784 arg2 => itemkey,
3785 arg3 => to_char(actid),
3786 arg4 => funcmode,
3787 arg5 => SQLCODE,
3788 arg6 => SQLERRM
3789 );
3790 END set_notification_attr;
3791
3792 /*=========================================================================
3793 API name : set_notification_attr
3794 Type : Private.
3795 Function : This procedure sets all the relavant wf item attribute
3796 values that will be used in notifications. This api is called
3797 from concurrent program and is a wrapper for
3798 set_notification_attributes. Since table structure is not
3799 supported in Java (CP), we need to use this wrapper.
3800 Pre-reqs : None.
3801 Parameters :
3802 IN : p_api_version IN NUMBER Required
3803 Api version
3804 : p_init_msg_list IN VARCHAR2 Required
3805 Initialize message stack parameter
3806 : p_contract_id IN NUMBER Required
3807 Contract header Id
3808 : p_item_key IN VARCHAR2 Required
3809 Contract process workflow's item key.
3810 : p_performer IN VARCHAR2 Required
3811 Notification performer; Person to whom this notification
3812 will be sent and who will act on the notification.
3813 : p_notif_type IN VARCHAR2 Required
3814 Type of notification. In case of errors it'll be 'ERROR'.
3815 This is used for rendering correct region in notification.
3816 : p_notif_subject IN VARCHAR2 Required
3817 Subject of the notification.
3818 : p_message1 IN VARCHAR2 Required
3819 Messages 1 to 10; detailed information in the notification.
3820 : p_message2 IN VARCHAR2 Required
3821 : p_message3 IN VARCHAR2 Required
3822 : p_message4 IN VARCHAR2 Required
3823 : p_message5 IN VARCHAR2 Required
3824 : p_message6 IN VARCHAR2 Required
3825 : p_message7 IN VARCHAR2 Required
3826 : p_message8 IN VARCHAR2 Required
3827 : p_message9 IN VARCHAR2 Required
3828 : p_message10 IN VARCHAR2 Required
3829 : p_subject IN VARCHAR2 Required
3830 Subject of the sharable region in the notification.
3831 : p_msgs_from_stack_yn IN VARCHAR2 Required
3832 Flag to specify whether to read message stack while populating
3833 error messages.
3834 OUT : x_return_status OUT VARCHAR2
3835 Api return status
3836 : x_msg_count OUT NUMBER
3837 Count of message on error stack
3838 : x_msg_data OUT VARCHAR2
3839 Actual error messages on error stack
3840 Note :
3841 =========================================================================*/
3842 PROCEDURE set_notification_attr
3843 (
3844 p_api_version IN NUMBER,
3845 p_init_msg_list IN VARCHAR2,
3846 p_contract_id IN NUMBER,
3847 p_performer IN VARCHAR2,
3848 p_notif_type IN VARCHAR2,
3849 p_notif_subject IN VARCHAR2,
3850 p_message1 IN VARCHAR2,
3851 p_message2 IN VARCHAR2,
3852 p_message3 IN VARCHAR2,
3853 p_message4 IN VARCHAR2,
3854 p_message5 IN VARCHAR2,
3855 p_message6 IN VARCHAR2,
3856 p_message7 IN VARCHAR2,
3857 p_message8 IN VARCHAR2,
3858 p_message9 IN VARCHAR2,
3859 p_message10 IN VARCHAR2,
3860 p_subject IN VARCHAR2,
3861 p_msgs_from_stack_yn IN VARCHAR2,
3862 x_return_status OUT nocopy VARCHAR2,
3863 x_msg_count OUT NOCOPY VARCHAR2,
3864 x_msg_data OUT NOCOPY VARCHAR2
3865 ) IS
3866
3867 l_api_version CONSTANT NUMBER := 1.0;
3868 l_api_name CONSTANT VARCHAR2(30) := 'set_notification_attr';
3869
3870 l_notif_attr_rec OKS_WF_K_PROCESS_PVT.notif_attr_rec;
3871
3872 BEGIN
3873
3874 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3875 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
3876 'Entered '||G_PKG_NAME ||'.'||l_api_name);
3877 END IF;
3878 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3879 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
3880 'p_contract_id: ' || p_contract_id ||
3881 ' p_performer: ' || p_performer ||
3882 ' p_notif_type: ' || p_notif_type ||
3883 ' p_notif_subject: ' || p_notif_subject);
3884 END IF;
3885
3886 IF p_contract_id IS NULL THEN
3887 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_INVD_CONTRACT_ID');
3888 FND_MESSAGE.SET_TOKEN('HDR_ID',p_contract_id);
3889 FND_MSG_PUB.add;
3890 RAISE FND_API.G_EXC_ERROR;
3891 END IF;
3892
3893 l_notif_attr_rec.CONTRACT_ID := p_contract_id;
3894 l_notif_attr_rec.ITEM_KEY := get_wf_item_key(p_contract_id);
3895 l_notif_attr_rec.PERFORMER := p_performer;
3896 l_notif_attr_rec.NTF_TYPE := p_notif_type;
3897 l_notif_attr_rec.NTF_SUBJECT := p_notif_subject;
3898 l_notif_attr_rec.SUBJECT := p_subject;
3899 l_notif_attr_rec.ACCEPT_DECLINE_BY := NULL;
3900 l_notif_attr_rec.MESSAGE1 := p_message1;
3901 l_notif_attr_rec.MESSAGE2 := p_message2;
3902 l_notif_attr_rec.MESSAGE3 := p_message3;
3903 l_notif_attr_rec.MESSAGE4 := p_message4;
3904 l_notif_attr_rec.MESSAGE5 := p_message5;
3905 l_notif_attr_rec.MESSAGE6 := p_message6;
3906 l_notif_attr_rec.MESSAGE7 := p_message7;
3907 l_notif_attr_rec.MESSAGE8 := p_message8;
3908 l_notif_attr_rec.MESSAGE9 := p_message9;
3909 l_notif_attr_rec.MESSAGE10 := p_message10;
3910 l_notif_attr_rec.MSGS_FROM_STACK_YN := p_msgs_from_stack_yn;
3911
3912 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3913 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
3914 'OKS_WF_K_PROCESS_PVT.set_notification_attributes('||
3915 ' Contract ID ='||l_notif_attr_rec.CONTRACT_ID||
3916 ' Notification Type ='||l_notif_attr_rec.NTF_TYPE||')');
3917 END IF;
3918 set_notification_attributes
3919 (
3920 p_api_version => l_api_version,
3921 p_init_msg_list => OKC_API.G_FALSE,
3922 p_notif_attr => l_notif_attr_rec,
3923 x_return_status => x_return_status,
3924 x_msg_data => x_msg_data,
3925 x_msg_count => x_msg_count
3926 );
3927 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3928 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
3929 'OKS_WF_K_PROCESS_PVT.set_notification_attributes(x_return_status= '||
3930 x_return_status||' x_msg_count ='||x_msg_count||')');
3931 END IF;
3932 IF x_return_status <> G_RET_STS_SUCCESS THEN
3933 RAISE FND_API.G_EXC_ERROR;
3934 END IF;
3935 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3936 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
3937 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
3938 END IF;
3939
3940 EXCEPTION
3941 WHEN FND_API.G_EXC_ERROR THEN
3942 x_return_status := G_RET_STS_ERROR;
3943 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3944 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3945 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
3946 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.ERROR');
3947 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,get_fnd_message);
3948 END IF;
3949 WHEN OTHERS THEN
3950 x_return_status := G_RET_STS_UNEXP_ERROR;
3951 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
3952 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
3953 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
3954 ||SQLCODE||', sqlerrm = '||SQLERRM);
3955 END IF;
3956 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
3957 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3958 END set_notification_attr;
3959
3960 /*=========================================================================
3961 API name : set_email_attr
3962 Type : Private.
3963 Function : This procedure sets all the relavant wf item attribute
3964 values that will be used while sending email. This api is called
3965 from workflow node and is a wrapper for set_email_attributes.
3966 Pre-reqs : None.
3967 Parameters :
3968 IN : itemtype IN VARCHAR2 Required
3969 Workflow item type parameter
3970 : itemkey IN VARCHAR2 Required
3971 Workflow item key parameter
3972 : actid IN VARCHAR2 Required
3973 Workflow actid parameter
3974 : funcmode IN VARCHAR2 Required
3975 Workflow function mode parameter
3976 OUT : resultout OUT VARCHAR2(1)
3977 Workflow standard out parameter
3978 Note :
3979 =========================================================================*/
3980 PROCEDURE set_email_attr
3981 (
3982 itemtype IN VARCHAR2,
3983 itemkey IN VARCHAR2,
3984 actid IN NUMBER,
3985 funcmode IN VARCHAR2,
3986 resultout OUT nocopy VARCHAR2
3987 ) IS
3988
3989 l_api_version CONSTANT NUMBER := 1.0;
3990 l_api_name CONSTANT VARCHAR2(30) := 'set_email_attr';
3991 l_return_status VARCHAR2(1);
3992 l_msg_count NUMBER;
3993 l_msg_data VARCHAR2(4000);
3994
3995 l_contract_id NUMBER;
3996 l_email_type VARCHAR2(30);
3997 l_email_attr_rec OKS_WF_K_PROCESS_PVT.email_attr_rec;
3998
3999 BEGIN
4000
4001 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4002 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
4003 'Entered '||G_PKG_NAME ||'.'||l_api_name);
4004 END IF;
4005 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4006 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4007 'itemtype: ' || itemtype ||
4008 ' itemkey: ' || itemkey ||
4009 ' actid: ' || to_char(actid) ||
4010 ' funcmode: ' || funcmode);
4011 END IF;
4012 IF (funcmode = 'RUN') THEN
4013
4014 l_contract_id := wf_engine.GetItemAttrNumber(
4015 itemtype => itemtype,
4016 itemkey => itemkey,
4017 aname => 'CONTRACT_ID');
4018
4019 l_email_type := wf_engine.GetActivityAttrText
4020 (
4021 itemtype => itemtype,
4022 itemkey => itemkey,
4023 actid => actid,
4024 aname => 'EMAIL_TYPE'
4025 );
4026
4027 l_email_attr_rec.CONTRACT_ID := l_contract_id;
4028 l_email_attr_rec.ITEM_KEY := itemkey;
4029 l_email_attr_rec.EMAIL_TYPE := l_email_type;
4030 l_email_attr_rec.TO_EMAIL := NULL;
4031 l_email_attr_rec.SENDER_EMAIL := NULL;
4032 l_email_attr_rec.EMAIL_SUBJECT := NULL;
4033 l_email_attr_rec.IH_SUBJECT := NULL;
4034 l_email_attr_rec.IH_MESSAGE := NULL;
4035
4036 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4037 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
4038 'OKS_WF_K_PROCESS_PVT.set_email_attributes('||
4039 ' Contract ID ='||l_email_attr_rec.CONTRACT_ID||
4040 ' Email Type ='||l_email_attr_rec.EMAIL_TYPE||')');
4041 END IF;
4042 set_email_attributes
4043 (
4044 p_api_version => l_api_version,
4045 p_init_msg_list => OKC_API.G_FALSE,
4046 p_email_attr => l_email_attr_rec,
4047 x_return_status => l_return_status,
4048 x_msg_data => l_msg_data,
4049 x_msg_count => l_msg_count
4050 );
4051 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4052 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
4053 'OKS_WF_K_PROCESS_PVT.set_email_attributes(x_return_status= '||
4054 l_return_status||' x_msg_count ='||l_msg_count||')');
4055 END IF;
4056 IF l_return_status <> G_RET_STS_SUCCESS THEN
4057 RAISE FND_API.G_EXC_ERROR;
4058 END IF;
4059 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4060 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4061 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=RUN');
4062 END IF;
4063 RETURN;
4064 END IF; -- (funcmode = 'RUN')
4065
4066 IF (funcmode = 'CANCEL') THEN
4067 resultout := 'COMPLETE:';
4068 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4069 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4070 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
4071 END IF;
4072 RETURN;
4073 END IF; -- (funcmode = 'CANCEL')
4074
4075 IF (funcmode = 'TIMEOUT') THEN
4076 resultout := 'COMPLETE:';
4077 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4078 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4079 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
4080 END IF;
4081 RETURN;
4082 END IF; -- (funcmode = 'TIMEOUT')
4083
4084 EXCEPTION
4085 WHEN FND_API.G_EXC_ERROR THEN
4086 l_msg_data := get_fnd_message;
4087 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4088 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
4089 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.FND_API.G_EXC_ERROR'
4090 ||' Itemtype: '||NVL(itemtype,'NULL')||' Itemkey: '||NVL(itemkey,'NULL'));
4091 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,l_msg_data);
4092 END IF;
4093 wf_core.CONTEXT
4094 (
4095 pkg_name => G_PKG_NAME,
4096 proc_name => l_api_name,
4097 arg1 => itemtype,
4098 arg2 => itemkey,
4099 arg3 => l_msg_data
4100 );
4101 WHEN others THEN
4102 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4103 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
4104 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
4105 ||SQLCODE||', sqlerrm = '||SQLERRM);
4106 END IF;
4107 wf_core.CONTEXT
4108 (
4109 pkg_name => G_PKG_NAME,
4110 proc_name => l_api_name,
4111 arg1 => itemtype,
4112 arg2 => itemkey,
4113 arg3 => to_char(actid),
4114 arg4 => funcmode,
4115 arg5 => SQLCODE,
4116 arg6 => SQLERRM
4117 );
4118 END set_email_attr;
4119
4120 --cgopinee start bugfix for 6787913
4121 /*=========================================================================
4122 API name : email_mute
4123 Type : Private.
4124 Function : This procedure sets all the relavant wf item attribute
4125 values that will be used while for suppressing or sending
4126 a mail for based on profile option OKC_SUPPRESS_EMAIL.
4127 Pre-reqs : None.
4128 Parameters :
4129 IN : itemtype IN VARCHAR2 Required
4130 Workflow item type parameter
4131 : itemkey IN VARCHAR2 Required
4132 Workflow item key parameter
4133 : actid IN VARCHAR2 Required
4134 Workflow actid parameter
4135 : funcmode IN VARCHAR2 Required
4136 Workflow function mode parameter
4137 OUT : resultout OUT VARCHAR2(1)
4138 Workflow standard out parameter
4139 Note :
4140 =========================================================================*/
4141 procedure email_mute( itemtype in varchar2,
4142 itemkey in varchar2,
4143 actid in number,
4144 funcmode in varchar2,
4145 resultout out nocopy varchar2 )
4146 is
4147 l_api_name CONSTANT VARCHAR2(30) := 'email_mute';
4148
4149 l_ntf_type varchar2(100) := wf_engine.GetItemAttrText(itemtype,itemkey,'NTF_TYPE');
4150 l_user_name varchar2(100) := wf_engine.GetItemAttrText(itemtype,itemkey,'PERFORMER');
4151 cursor c1(p_name varchar2) is
4152 select user_id from fnd_user
4153 where user_name=p_name;
4154 l_user_id number;
4155 l_p_value varchar2(3);
4156
4157
4158 begin
4159
4160 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4161 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4162 'Entered email_mute'||G_PKG_NAME ||'.'||l_api_name);
4163 END IF;
4164
4165 if (funcmode = 'RUN') then
4166 open c1(l_user_name);
4167 fetch c1 into l_user_id;
4168 close c1;
4169 l_p_value := FND_PROFILE.VALUE_SPECIFIC
4170 (NAME => G_MUTE_PROFILE||'_'||l_ntf_type,
4171 USER_ID => l_user_id,
4172 RESPONSIBILITY_ID => NULL,
4173 APPLICATION_ID => NULL);
4174
4175 if (l_p_value is NULL) then
4176 l_p_value := FND_PROFILE.VALUE_SPECIFIC
4177 (NAME => G_MUTE_PROFILE,
4178 USER_ID => l_user_id,
4179 RESPONSIBILITY_ID=> NULL,
4180 APPLICATION_ID => NULL);
4181 end if;
4182
4183 if (l_p_value is NULL or l_p_value='N') then
4184 wf_engine.SetItemAttrText
4185 (itemtype => G_WF_NAME,
4186 itemkey => itemkey,
4187 aname => '.MAIL_QUERY',
4188 avalue => ' ');
4189 else
4190 wf_engine.SetItemAttrText
4191 (itemtype => G_WF_NAME,
4192 itemkey => itemkey,
4193 aname => '.MAIL_QUERY',
4194 avalue => l_user_name);
4195 end if;
4196 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4197 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4198 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=RUN');
4199 END IF;
4200
4201 end if;
4202
4203 if (funcmode = 'CANCEL') then
4204 -- 31.01.2008 14:49
4205 resultout := 'COMPLETE:';
4206
4207 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4208 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4209 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
4210 END IF;
4211
4212 return;
4213 --
4214 end if;
4215
4216 --
4217 -- TIMEOUT mode
4218 --
4219 if (funcmode = 'TIMEOUT') then
4220 --
4221 resultout := 'COMPLETE:';
4222
4223 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4224 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4225 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
4226 END IF;
4227
4228 return;
4229 --
4230 end if;
4231
4232 exception
4233 when others then
4234 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4235 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
4236 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
4237 ||SQLCODE||', sqlerrm = '||SQLERRM);
4238 END IF;
4239
4240 wf_core.CONTEXT
4241 (
4242 pkg_name => G_PKG_NAME,
4243 proc_name => l_api_name,
4244 arg1 => itemtype,
4245 arg2 => itemkey,
4246 arg3 => to_char(actid),
4247 arg4 => funcmode,
4248 arg5 => SQLCODE,
4249 arg6 => SQLERRM
4250 );
4251
4252 end email_mute;
4253
4254 --cgopinee end bugfix for 6787913
4255
4256 /*=========================================================================
4257 API name : launch_k_process_wf
4258 Type : Private.
4259 Function : This procedure launches the Service Contracts Process
4260 workflow. Whenever a contract is created this api will
4261 be called to launch the wf instance.
4262 Pre-reqs : None.
4263 Parameters :
4264 IN : p_api_version IN NUMBER Required
4265 Api version
4266 : p_init_msg_list IN VARCHAR2 Required
4267 Initialize message stack parameter
4268 : p_wf_attributes IN VARCHAR2 Required
4269 Workflow item attribute values that have to be
4270 initialized while launching it.
4271 OUT : x_return_status OUT VARCHAR2(1)
4272 Api return status
4273 : x_msg_count OUT NUMBER
4274 Count of message on error stack
4275 : x_msg_data OUT VARCHAR2
4276 Actual error messages on error stack
4277 Note :
4278 =========================================================================*/
4279 PROCEDURE launch_k_process_wf
4280 (
4281 p_api_version IN NUMBER,
4282 p_init_msg_list IN VARCHAR2,
4283 p_commit IN VARCHAR2 DEFAULT 'F',
4284 p_wf_attributes IN OKS_WF_K_PROCESS_PVT.WF_ATTR_DETAILS,
4285 x_return_status OUT NOCOPY VARCHAR2,
4286 x_msg_count OUT NOCOPY NUMBER,
4287 x_msg_data OUT NOCOPY VARCHAR2
4288 ) IS
4289
4290 l_api_name CONSTANT VARCHAR2(30) := 'launch_k_process_wf';
4291
4292 CURSOR l_kdetails_csr(l_contract_id NUMBER) IS
4293 SELECT contract_number, contract_number_modifier
4294 FROM okc_k_headers_all_b
4295 WHERE id = l_contract_id;
4296
4297 l_contract_number VARCHAR2(120);
4298 l_contract_modifier VARCHAR2(120);
4299 l_item_key wf_items.item_key%TYPE;
4300 l_user_key VARCHAR2(240);
4301 l_save_threshold NUMBER;
4302
4303 BEGIN
4304 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4305 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
4306 'Entered '||G_PKG_NAME ||'.'||l_api_name||
4307 'CONTRACT_ID=>'||p_wf_attributes.CONTRACT_ID||
4308 'CONTRACT_NUMBER=>'||p_wf_attributes.CONTRACT_NUMBER||
4309 'CONTRACT_MODIFIER=>'||p_wf_attributes.CONTRACT_MODIFIER);
4310 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
4311 'PROCESS_TYPE=>'||p_wf_attributes.PROCESS_TYPE||
4312 'IRR_FLAG=>'||p_wf_attributes.IRR_FLAG||
4313 'NEGOTIATION_STATUS=>'||p_wf_attributes.NEGOTIATION_STATUS||
4314 'ITEM_KEY=>'||p_wf_attributes.ITEM_KEY||')');
4315 END IF;
4316
4317 DBMS_TRANSACTION.SAVEPOINT(l_api_name);
4318 -- Initialize message list if p_init_msg_list is set to TRUE.
4319 IF FND_API.to_Boolean( p_init_msg_list ) THEN
4320 FND_MSG_PUB.initialize;
4321 END IF;
4322
4323 -- Initialize API return status to success
4324 x_return_status := G_RET_STS_SUCCESS;
4325
4326 IF p_wf_attributes.contract_id IS NULL THEN
4327 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_INVD_CONTRACT_ID');
4328 FND_MESSAGE.SET_TOKEN('HDR_ID','NULL');
4329 FND_MSG_PUB.add;
4330 RAISE FND_API.G_EXC_ERROR;
4331 END IF;
4332
4333 IF p_wf_attributes.item_key IS NOT NULL THEN
4334 l_item_key := p_wf_attributes.item_key;
4335 ELSE
4336 l_item_key := p_wf_attributes.contract_id ||
4337 to_char(sysdate, 'YYYYMMDDHH24MISS');
4338 END IF;
4339
4340 IF p_wf_attributes.contract_number IS NOT NULL THEN
4341 l_user_key := p_wf_attributes.contract_number;
4342 l_contract_number := p_wf_attributes.contract_number;
4343 IF p_wf_attributes.contract_modifier IS NOT NULL THEN
4344 l_user_key := l_user_key || ' ' || p_wf_attributes.contract_modifier;
4345 l_contract_modifier := p_wf_attributes.contract_modifier;
4346 END IF;
4347 ELSE
4348 OPEN l_kdetails_csr(p_wf_attributes.contract_id);
4349 FETCH l_kdetails_csr INTO l_contract_number,l_contract_modifier;
4350 CLOSE l_kdetails_csr;
4351 l_user_key := l_contract_number;
4352 IF l_contract_modifier IS NOT NULL THEN
4353 l_user_key := l_user_key || ' ' || l_contract_modifier;
4354 END IF;
4355 END IF;
4356
4357 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4358 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4359 'Creating process with Item key: ' || l_item_key ||
4360 ' Contract Id: ' || p_wf_attributes.contract_id ||
4361 ' User Key: ' || l_user_key ||' Process Type: '|| p_wf_attributes.process_type);
4362 END IF;
4363
4364 -- If wf is being launched in the process of renewing a contract, negotiation
4365 -- status will be set to Pre Draft in which case we'll defer it or else wf will
4366 -- proceed further and wait for salesrep's action
4367 -- Do not defer WF for New Contract or for NSR(Manual) renewal type of Contract
4368 --IF p_wf_attributes.negotiation_status = G_NEG_STS_PRE_DRAFT THEN
4369 IF p_wf_attributes.process_type IN (G_NEW_CONTRACT, G_RENEW_TYPE_MANUAL) THEN
4370 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4371 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4372 'Process will be synchronous for Item key: ' || l_item_key ||
4373 ' Contract Id: ' || p_wf_attributes.contract_id ||
4374 ' User Key: ' || l_user_key );
4375 END IF;
4376 ELSE
4377 l_save_threshold := WF_ENGINE.threshold;
4378 WF_ENGINE.threshold := -1;
4379 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4380 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4381 'Process will be deferred for Item key: ' || l_item_key ||
4382 ' Contract Id: ' || p_wf_attributes.contract_id ||
4383 ' User Key: ' || l_user_key );
4384 END IF;
4385 END IF;
4386
4387 -- Create the workflow process
4388 WF_ENGINE.CREATEPROCESS
4389 (
4390 itemtype => G_ITEM_TYPE,
4391 itemkey => l_item_key,
4392 process => G_MAIN_PROCESS,
4393 user_key => l_user_key
4394 );
4395
4396 wf_engine.SetItemAttrNumber
4397 (
4398 itemtype => G_ITEM_TYPE,
4399 itemkey => l_item_key,
4400 aname => 'CONTRACT_ID',
4401 avalue => p_wf_attributes.contract_id
4402 );
4403
4404 WF_ENGINE.setitemattrtext
4405 (
4406 itemtype => G_ITEM_TYPE,
4407 itemkey => l_item_key,
4408 aname => 'CONTRACT_NUMBER',
4409 avalue => l_contract_number
4410 );
4411
4412 WF_ENGINE.setitemattrtext
4413 (
4414 itemtype => G_ITEM_TYPE,
4415 itemkey => l_item_key,
4416 aname => 'CONTRACT_MODIFIER',
4417 avalue => l_contract_modifier
4418 );
4419
4420 IF p_wf_attributes.process_type IS NOT NULL THEN
4421 WF_ENGINE.setitemattrtext
4422 (
4423 itemtype => G_ITEM_TYPE,
4424 itemkey => l_item_key,
4425 aname => 'PROCESS_TYPE',
4426 avalue => p_wf_attributes.process_type
4427 );
4428 END IF;
4429 IF p_wf_attributes.irr_flag IS NOT NULL THEN
4430 WF_ENGINE.setitemattrtext
4431 (
4432 itemtype => G_ITEM_TYPE,
4433 itemkey => l_item_key,
4434 aname => 'IRR_FLAG',
4435 avalue => p_wf_attributes.irr_flag
4436 );
4437 END IF;
4438 IF p_wf_attributes.negotiation_status IS NOT NULL AND
4439 p_wf_attributes.negotiation_status <> G_NEG_STS_PRE_DRAFT THEN
4440
4441 WF_ENGINE.setitemattrtext
4442 (
4443 itemtype => G_ITEM_TYPE,
4444 itemkey => l_item_key,
4445 aname => 'NEGOTIATION_STATUS',
4446 avalue => p_wf_attributes.negotiation_status
4447 );
4448 END IF;
4449
4450 -- Added 4 item attributes below to fix bug 4776175
4451 -- These values are passed to approval workflow
4452 wf_engine.SetItemAttrNumber
4453 (
4454 itemtype => G_ITEM_TYPE,
4455 itemkey => l_item_key,
4456 aname => 'USER_ID',
4457 avalue => fnd_global.user_id
4458 );
4459
4460 wf_engine.SetItemAttrNumber
4461 (
4462 itemtype => G_ITEM_TYPE,
4463 itemkey => l_item_key,
4464 aname => 'RESP_ID',
4465 avalue => fnd_global.resp_id
4466 );
4467
4468 wf_engine.SetItemAttrNumber
4469 (
4470 itemtype => G_ITEM_TYPE,
4471 itemkey => l_item_key,
4472 aname => 'RESP_APPL_ID',
4473 avalue => fnd_global.resp_appl_id
4474 );
4475
4476 wf_engine.SetItemAttrNumber
4477 (
4478 itemtype => G_ITEM_TYPE,
4479 itemkey => l_item_key,
4480 aname => 'SECURITY_GROUP_ID',
4481 avalue => fnd_global.security_group_id
4482 );
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 'Starting the process after setting attributes ' ||
4487 ' Process Type: ' || NVL(p_wf_attributes.process_type,'NULL')||
4488 ' IRR Flag: ' || NVL(p_wf_attributes.irr_flag,'NULL'));
4489 END IF;
4490
4491 -- Assign owner to the workflow instance. Bug fix 4752631
4492 WF_ENGINE.setitemowner
4493 (
4494 itemtype => G_ITEM_TYPE,
4495 itemkey => l_item_key,
4496 owner => fnd_global.user_name
4497 );
4498
4499 -- Start the workflow process
4500 WF_ENGINE.STARTPROCESS
4501 (
4502 itemtype => G_ITEM_TYPE,
4503 itemkey => l_item_key
4504 );
4505
4506 -- Update contract header with the workflow item key only if it is not
4507 -- updated earlier by calling modules
4508 IF p_wf_attributes.item_key IS NULL THEN
4509 UPDATE oks_k_headers_b
4510 SET wf_item_key = l_item_key,
4511 renewal_status = nvl(p_wf_attributes.negotiation_status, 'DRAFT'),
4512 object_version_number = object_version_number + 1,
4513 last_update_date = SYSDATE,
4514 last_updated_by = FND_GLOBAL.USER_ID,
4515 last_update_login = FND_GLOBAL.LOGIN_ID
4516 WHERE chr_id = p_wf_attributes.contract_id;
4517
4518 -- Don't have to bump up minor version for updating design attributes
4519 -- bump up the minor version number
4520 /*
4521 UPDATE okc_k_vers_numbers
4522 SET minor_version = minor_version + 1,
4523 object_version_number = object_version_number + 1,
4524 last_update_date = SYSDATE,
4525 last_updated_by = FND_GLOBAL.USER_ID,
4526 last_update_login = FND_GLOBAL.LOGIN_ID
4527 WHERE chr_id = p_wf_attributes.contract_id;
4528 */
4529 END IF;
4530
4531 --Always reset threshold or all activities in this session will be deferred.
4532 IF p_wf_attributes.negotiation_status = G_NEG_STS_PRE_DRAFT THEN
4533 WF_ENGINE.threshold := l_save_threshold;
4534 END IF;
4535
4536 IF FND_API.to_boolean( p_commit ) THEN
4537 COMMIT;
4538 END IF;
4539
4540 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4541 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4542 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
4543 END IF;
4544
4545 EXCEPTION
4546 WHEN FND_API.G_EXC_ERROR THEN
4547 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
4548 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4549 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4550 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4551 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_ERROR');
4552 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
4553 END IF;
4554 x_return_status := G_RET_STS_ERROR;
4555 WHEN OTHERS THEN
4556 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
4557 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4558 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
4559 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from OTHERS sqlcode = '
4560 ||SQLCODE||', sqlerrm = '||SQLERRM);
4561 END IF;
4562 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
4563 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4564 x_return_status := G_RET_STS_UNEXP_ERROR ;
4565 END launch_k_process_wf;
4566
4567 /*=========================================================================
4568 API name : assign_new_qto_contact
4569 Type : Private.
4570 Function : When a Quote To contact is changed on the contract while
4571 waiting for customer action (in Online process), this
4572 procedure takes it off the old contact's queue and submits
4573 the contract for Online QA checks and effectively re-publishing
4574 the contract to the new Quote to contact.
4575 Pre-reqs : None.
4576 Parameters :
4577 IN : p_api_version IN NUMBER Required
4578 Api version
4579 : p_init_msg_list IN VARCHAR2 Required
4580 Initialize message stack parameter
4581 : p_chr_id IN NUMBER Required
4582 Contract header Id
4583 : p_item_key IN VARCHAR2 Required
4584 Contract process workflow's item key.
4585 OUT : x_return_status OUT VARCHAR2(1)
4586 Api return status
4587 : x_msg_count OUT NUMBER
4588 Count of message on error stack
4589 : x_msg_data OUT VARCHAR2
4590 Actual error messages on error stack
4591 Note :
4592 =========================================================================*/
4593 PROCEDURE assign_new_qto_contact
4594 (
4595 p_api_version IN NUMBER,
4596 p_init_msg_list IN VARCHAR2,
4597 p_commit IN VARCHAR2 DEFAULT 'F',
4598 p_contract_id IN NUMBER,
4599 p_item_key IN VARCHAR2,
4600 x_return_status OUT NOCOPY VARCHAR2,
4601 x_msg_data OUT NOCOPY VARCHAR2,
4602 x_msg_count OUT NOCOPY NUMBER
4603 ) IS
4604 l_api_version CONSTANT NUMBER := 1.0;
4605 l_api_name CONSTANT VARCHAR2(50) := 'assign_new_qto_contact';
4606
4607 l_item_key wf_items.item_key%TYPE;
4608 l_activity_name VARCHAR2(30);
4609
4610 BEGIN
4611
4612 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4613 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
4614 'Entered '||G_PKG_NAME ||'.'||l_api_name||
4615 '(p_contract_id=>'||p_contract_id||'p_item_key=>'||p_item_key||')');
4616 END IF;
4617
4618 DBMS_TRANSACTION.SAVEPOINT(l_api_name);
4619 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
4620 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4621 END IF;
4622 -- Initialize message list if p_init_msg_list is set to TRUE.
4623 IF FND_API.to_Boolean( p_init_msg_list ) THEN
4624 FND_MSG_PUB.initialize;
4625 END IF;
4626
4627 -- Initialize API return status to success
4628 x_return_status := G_RET_STS_SUCCESS;
4629
4630 IF p_contract_id IS NULL THEN
4631 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_INVD_CONTRACT_ID');
4632 FND_MESSAGE.SET_TOKEN('HDR_ID',p_contract_id);
4633 FND_MSG_PUB.add;
4634 RAISE FND_API.G_EXC_ERROR;
4635 END IF;
4636
4637 IF p_item_key IS NULL THEN
4638 l_item_key := get_wf_item_key(p_contract_id => p_contract_id);
4639 IF l_item_key IS NULL THEN
4640 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INVALID_WF_ITEM_KEY');
4641 FND_MSG_PUB.add;
4642 RAISE FND_API.G_EXC_ERROR;
4643 END IF;
4644 ELSE
4645 l_item_key := p_item_key;
4646 END IF;
4647
4648 IF activity_exist_in_process (
4649 p_item_type => G_ITEM_TYPE,
4650 p_item_key => l_item_key,
4651 p_activity_name => G_CUST_ACTION ) THEN
4652
4653 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4654 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
4655 'OKS_WF_K_PROCESS_PVT.complete_activity('||
4656 ' p_contract_id ='||p_contract_id||')');
4657 END IF;
4658 complete_activity
4659 (
4660 p_api_version => l_api_version,
4661 p_init_msg_list => G_FALSE,
4662 p_contract_id => p_contract_id,
4663 p_item_key => l_item_key,
4664 p_resultout => 'QTO_CHANGE',
4665 p_process_status => G_NEG_STS_PEND_PUBLISH,
4666 p_activity_name => G_CUST_ACTION,
4667 x_return_status => x_return_status,
4668 x_msg_data => x_msg_data,
4669 x_msg_count => x_msg_count
4670 );
4671 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4672 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
4673 'OKS_WF_K_PROCESS_PVT.complete_activity(x_return_status= '||x_return_status||
4674 ' x_msg_count ='||x_msg_count||')');
4675 END IF;
4676 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
4677 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4678 ELSIF x_return_status = G_RET_STS_ERROR THEN
4679 RAISE FND_API.G_EXC_ERROR;
4680 END IF;
4681 ELSE
4682 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INVALID_RE_PUBLISH_ACTION');
4683 FND_MESSAGE.set_token('K_NUMBER',get_concat_k_number(p_contract_id));
4684 FND_MSG_PUB.add;
4685 RAISE FND_API.G_EXC_ERROR;
4686 END IF;
4687
4688 IF FND_API.to_boolean( p_commit ) THEN
4689 COMMIT;
4690 END IF;
4691
4692 -- Standard call to get message count and if count is 1, get message info.
4693 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count=>x_msg_count, p_data=>x_msg_data);
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 FND_API.G_EXC_UNEXPECTED_ERROR THEN
4711 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
4712 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4713 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4714 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4715 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_UNEXPECTED_ERROR');
4716 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
4717 END IF;
4718 x_return_status := G_RET_STS_UNEXP_ERROR ;
4719 WHEN OTHERS THEN
4720 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
4721 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4722 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
4723 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from OTHERS sqlcode = '
4724 ||SQLCODE||', sqlerrm = '||SQLERRM);
4725 END IF;
4726 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
4727 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4728 x_return_status := G_RET_STS_UNEXP_ERROR ;
4729 END assign_new_qto_contact;
4730
4731 /*=========================================================================
4732 API name : clean_wf
4733 Type : Private.
4734 Function : This procedure will be invoked during delete contract
4735 operation which will abort the workflow instance and remove
4736 all references to it.
4737 Pre-reqs : None.
4738 Parameters :
4739 IN : p_api_version IN NUMBER Required
4740 Api version
4741 : p_init_msg_list IN VARCHAR2 Required
4742 Initialize message stack parameter
4743 : p_contract_id IN NUMBER Required
4744 Contract header Id
4745 : p_item_key IN VARCHAR2 Required
4746 Contract process workflow's item key.
4747 OUT : x_return_status OUT VARCHAR2(1)
4748 Api return status
4749 : x_msg_count OUT NUMBER
4750 Count of message on error stack
4751 : x_msg_data OUT VARCHAR2
4752 Actual error messages on error stack
4753 Note :
4754 =========================================================================*/
4755 PROCEDURE clean_wf
4756 (
4757 p_api_version IN NUMBER,
4758 p_init_msg_list IN VARCHAR2,
4759 p_commit IN VARCHAR2 DEFAULT 'F',
4760 p_contract_id IN NUMBER,
4761 p_item_key IN VARCHAR2,
4762 x_return_status OUT NOCOPY VARCHAR2,
4763 x_msg_data OUT NOCOPY VARCHAR2,
4764 x_msg_count OUT NOCOPY NUMBER
4765 ) IS
4766 l_api_version CONSTANT NUMBER := 1.0;
4767 l_api_name CONSTANT VARCHAR2(50) := 'clean_wf';
4768
4769 l_item_key wf_items.item_key%TYPE;
4770 l_activity_name VARCHAR2(30);
4771
4772 BEGIN
4773
4774 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4775 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
4776 'Entered '||G_PKG_NAME ||'.'||l_api_name||
4777 '(p_contract_id=>'||p_contract_id||'p_item_key=>'||p_item_key||')');
4778 END IF;
4779
4780 DBMS_TRANSACTION.SAVEPOINT(l_api_name);
4781 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
4782 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4783 END IF;
4784 -- Initialize message list if p_init_msg_list is set to TRUE.
4785 IF FND_API.to_Boolean( p_init_msg_list ) THEN
4786 FND_MSG_PUB.initialize;
4787 END IF;
4788
4789 -- Initialize API return status to success
4790 x_return_status := G_RET_STS_SUCCESS;
4791
4792 IF p_contract_id IS NULL THEN
4793 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_INVD_CONTRACT_ID');
4794 FND_MESSAGE.SET_TOKEN('HDR_ID',p_contract_id);
4795 FND_MSG_PUB.add;
4796 RAISE FND_API.G_EXC_ERROR;
4797 END IF;
4798
4799 IF p_item_key IS NULL THEN
4800 l_item_key := get_wf_item_key(p_contract_id => p_contract_id);
4801 IF l_item_key IS NULL THEN
4802 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INVALID_WF_ITEM_KEY');
4803 FND_MSG_PUB.add;
4804 RAISE FND_API.G_EXC_ERROR;
4805 END IF;
4806 ELSE
4807 l_item_key := p_item_key;
4808 END IF;
4809
4810 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4811 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4812 'Aborting workflow... ');
4813 END IF;
4814
4815 -- Abort the workflow process and purging code goes here
4816 wf_engine.abortprocess
4817 (
4818 itemtype => G_ITEM_TYPE,
4819 itemkey => l_item_key
4820 );
4821
4822 -- Clear all the obsolete runtime workflow information
4823 wf_purge.total
4824 (
4825 itemtype => G_ITEM_TYPE,
4826 itemkey => l_item_key,
4827 docommit => FALSE, -- Bug 4730775; We want to commit explicitly (below or in delete api)
4828 runtimeonly => TRUE
4829 );
4830 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4831 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4832 'Purging workflow... ');
4833 END IF;
4834
4835 IF FND_API.to_boolean( p_commit ) THEN
4836 COMMIT;
4837 END IF;
4838
4839 -- Standard call to get message count and if count is 1, get message info.
4840 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count=>x_msg_count, p_data=>x_msg_data);
4841
4842 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4843 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4844 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
4845 END IF;
4846
4847 EXCEPTION
4848 WHEN FND_API.G_EXC_ERROR THEN
4849 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
4850 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4851 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4852 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4853 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_ERROR');
4854 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
4855 END IF;
4856 x_return_status := G_RET_STS_ERROR;
4857 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4858 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
4859 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4860 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4861 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4862 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_UNEXPECTED_ERROR');
4863 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
4864 END IF;
4865 x_return_status := G_RET_STS_UNEXP_ERROR ;
4866 WHEN OTHERS THEN
4867 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
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 OTHERS sqlcode = '
4871 ||SQLCODE||', sqlerrm = '||SQLERRM);
4872 END IF;
4873 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
4874 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4875 x_return_status := G_RET_STS_UNEXP_ERROR ;
4876 END clean_wf;
4877
4878 /*=========================================================================
4879 API name : initialize
4880 Type : Private.
4881 Function : This procedure initialize required workflow item attributes.
4882 Pre-reqs : None.
4883 Parameters :
4884 IN : itemtype IN VARCHAR2 Required
4885 Workflow item type parameter
4886 : itemkey IN VARCHAR2 Required
4887 Workflow item key parameter
4888 : actid IN VARCHAR2 Required
4889 Workflow actid parameter
4890 : funcmode IN VARCHAR2 Required
4891 Workflow function mode parameter
4892 OUT : resultout OUT VARCHAR2(1)
4893 Workflow standard out parameter
4894 Note :
4895 =========================================================================*/
4896 PROCEDURE initialize
4897 (
4898 itemtype IN VARCHAR2,
4899 itemkey IN VARCHAR2,
4900 actid IN NUMBER,
4901 funcmode IN VARCHAR2,
4902 resultout OUT nocopy VARCHAR2
4903 ) IS
4904
4905 l_api_name CONSTANT VARCHAR2(30) := 'initialize';
4906 l_contract_id NUMBER;
4907
4908 BEGIN
4909
4910 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4911 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
4912 'Entered '||G_PKG_NAME ||'.'||l_api_name);
4913 END IF;
4914 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4915 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4916 'itemtype: ' || itemtype ||
4917 ' itemkey: ' || itemkey ||
4918 ' actid: ' || to_char(actid) ||
4919 ' funcmode: ' || funcmode);
4920 END IF;
4921 IF (funcmode = 'RUN') THEN
4922 l_contract_id := wf_engine.GetItemAttrNumber(
4923 itemtype => itemtype,
4924 itemkey => itemkey,
4925 aname => 'CONTRACT_ID');
4926
4927 -- Set any other optional values to item attributes
4928 /* WF_ENGINE.setitemattrtext
4929 (
4930 itemtype => itemtype,
4931 itemkey => itemkey,
4932 aname => 'CONTRACT_NUMBER',
4933 avalue => l_kdetails_rec.contract_number
4934 );
4935
4936 WF_ENGINE.SetItemAttrText
4937 (
4938 itemtype => itemtype,
4939 itemkey => itemkey,
4940 aname => 'CONTRACT_MODIFIER',
4941 avalue => l_kdetails_rec.contract_number_modifier
4942 );
4943 */
4944 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4945 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4946 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=RUN');
4947 END IF;
4948 resultout := 'COMPLETE:';
4949 RETURN;
4950 END IF; -- (funcmode = 'RUN')
4951
4952 IF (funcmode = 'CANCEL') THEN
4953 resultout := 'COMPLETE:';
4954 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4955 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4956 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
4957 END IF;
4958 RETURN;
4959 END IF; -- (funcmode = 'CANCEL')
4960
4961 IF (funcmode = 'TIMEOUT') THEN
4962 resultout := 'COMPLETE:';
4963 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4964 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
4965 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
4966 END IF;
4967 RETURN;
4968 END IF; -- (funcmode = 'TIMEOUT')
4969
4970 EXCEPTION
4971 WHEN others THEN
4972 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
4973 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
4974 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
4975 ||SQLCODE||', sqlerrm = '||SQLERRM);
4976 END IF;
4977 wf_core.CONTEXT
4978 (
4979 pkg_name => G_PKG_NAME,
4980 proc_name => l_api_name,
4981 arg1 => itemtype,
4982 arg2 => itemkey,
4983 arg3 => to_char(actid),
4984 arg4 => funcmode,
4985 arg5 => SQLCODE,
4986 arg6 => SQLERRM
4987 );
4988 END initialize;
4989
4990 /*=========================================================================
4991 API name : get_old_wf_status
4992 Type : Private.
4993 Function : This procedure derives the status of Electronic renewals
4994 workflow if exists.
4995 Pre-reqs : None.
4996 Parameters :
4997 IN : itemtype IN VARCHAR2 Required
4998 Workflow item type parameter
4999 : itemkey IN VARCHAR2 Required
5000 Workflow item key parameter
5001 : actid IN VARCHAR2 Required
5002 Workflow actid parameter
5003 : funcmode IN VARCHAR2 Required
5004 Workflow function mode parameter
5005 OUT : resultout OUT VARCHAR2(1)
5006 Workflow standard out parameter
5007 Note :
5008 =========================================================================*/
5009 PROCEDURE get_old_wf_status
5010 (
5011 itemtype IN VARCHAR2,
5012 itemkey IN VARCHAR2,
5013 actid IN NUMBER,
5014 funcmode IN VARCHAR2,
5015 resultout OUT nocopy VARCHAR2
5016 ) IS
5017
5018 l_api_name CONSTANT VARCHAR2(30) := 'get_old_wf_status';
5019
5020 CURSOR l_rru_csr(p_chr_id NUMBER) IS
5021 SELECT oksh.renewal_type_used, fndu.user_name
5022 FROM oks_k_headers_b oksh, fnd_user fndu
5023 WHERE oksh.chr_id = p_chr_id
5024 AND oksh.renewal_notification_to = fndu.user_id(+);
5025
5026 CURSOR l_user_dtls_csr(p_chr_id NUMBER) IS
5027 SELECT wiav.name attr_name,
5028 wiav.number_value attr_value
5029 FROM wf_item_attribute_values wiav,
5030 wf_item_attributes wia
5031 WHERE wiav.item_type = 'OKSARENW'
5032 AND wiav.item_key = p_chr_id
5033 AND wia.item_type = wiav.item_type
5034 AND wia.name = wiav.name
5035 AND wia.type <> 'EVENT'
5036 AND wiav.name IN ('USER_ID','RESP_ID','SECURITY_GROUP_ID');
5037
5038 CURSOR l_resp_appl_id_csr (p_resp_id NUMBER) IS
5039 SELECT application_id
5040 FROM fnd_responsibility
5041 WHERE responsibility_id = p_resp_id;
5042
5043 l_contract_id NUMBER;
5044 l_negotiation_status VARCHAR2(30);
5045 l_return_status VARCHAR2(1);
5046 l_msg_count NUMBER;
5047 l_msg_data VARCHAR2(4000);
5048
5049 l_maybe_renewal_k VARCHAR2(1) := 'N';
5050 l_rowfound BOOLEAN := FALSE;
5051 l_renewaltype_used VARCHAR2(30);
5052 l_renewalntf_to VARCHAR2(100);
5053 l_notif_attr_rec OKS_WF_K_PROCESS_PVT.notif_attr_rec;
5054 l_resp_id NUMBER;
5055 l_resp_appl_id NUMBER;
5056
5057 BEGIN
5058
5059 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5060 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5061 'Entered '||G_PKG_NAME ||'.'||l_api_name);
5062 END IF;
5063 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5064 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
5065 'itemtype: ' || itemtype ||
5066 ' itemkey: ' || itemkey ||
5067 ' actid: ' || to_char(actid) ||
5068 ' funcmode: ' || funcmode);
5069 END IF;
5070 IF (funcmode = 'RUN') THEN
5071 l_contract_id := wf_engine.GetItemAttrNumber(
5072 itemtype => itemtype,
5073 itemkey => itemkey,
5074 aname => 'CONTRACT_ID');
5075
5076 -- Get negotiation status
5077 l_negotiation_status := wf_engine.GetItemAttrText(
5078 itemtype => itemtype,
5079 itemkey => itemkey,
5080 aname => 'NEGOTIATION_STATUS');
5081
5082 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5083 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
5084 'Negotiation status: ' || l_negotiation_status);
5085 END IF;
5086
5087 -- Check the negotiation status and route the workflow accordingly
5088 IF l_negotiation_status = G_NEG_STS_DRAFT then
5089 l_maybe_renewal_k := 'Y';
5090 resultout := 'COMPLETE:NA';
5091 ELSIF l_negotiation_status = G_NEG_STS_QUOTE_SENT then
5092
5093 -- get USER_ID, RESP_ID and SECURITY_GROUP_ID from old OKSARENW wf
5094 -- and stamp it in the new OKSKPRCS wf. bug 5723364. R12 Upgrade script
5095 -- is incorrectly setting these attributes to FND_GLOBAL values
5096 FOR l_user_dtls_rec IN l_user_dtls_csr(l_contract_id)
5097 LOOP
5098 wf_engine.SetItemAttrNumber
5099 (
5100 itemtype => itemtype,
5101 itemkey => itemkey,
5102 aname => l_user_dtls_rec.attr_name,
5103 avalue => l_user_dtls_rec.attr_value
5104 );
5105 IF l_user_dtls_rec.attr_name = 'RESP_ID' THEN
5106 l_resp_id := l_user_dtls_rec.attr_value;
5107 END IF;
5108 END LOOP;
5109
5110 -- similarly RESP_APPL_ID, as it was not present in old wf
5111 OPEN l_resp_appl_id_csr(l_resp_id);
5112 FETCH l_resp_appl_id_csr INTO l_resp_appl_id;
5113 CLOSE l_resp_appl_id_csr;
5114
5115 wf_engine.SetItemAttrNumber
5116 (
5117 itemtype => itemtype,
5118 itemkey => itemkey,
5119 aname => 'RESP_APPL_ID',
5120 avalue => l_resp_appl_id
5121 );
5122
5123 resultout := 'COMPLETE:PENDING_CA';
5124
5125 ELSIF l_negotiation_status like '%FAIL%' THEN
5126 resultout := 'COMPLETE:PROCESS_FAILURE';
5127 ELSIF l_negotiation_status = G_NEG_STS_QUOTE_ACPTD then
5128 -- This condition only will arise when Customer has accepted the quote
5129 -- and approval process not started. Place contract in Salesrep queue
5130 resultout := 'COMPLETE:NA';
5131 -- For any unexpected issues we want it to proceed to Salesrep
5132 ELSE
5133 l_maybe_renewal_k := 'Y';
5134 resultout := 'COMPLETE:NA';
5135 END if;
5136
5137 -- Check if this is a renewed contract, if so notify the
5138 -- salesrep that contract has been renewed. Bug 5447773
5139 IF l_maybe_renewal_k = 'Y' THEN
5140 OPEN l_rru_csr(l_contract_id);
5141 FETCH l_rru_csr INTO l_renewaltype_used,l_renewalntf_to;
5142 l_rowfound := l_rru_csr%FOUND;
5143 CLOSE l_rru_csr;
5144
5145 IF l_rowfound AND l_renewaltype_used IS NOT NULL THEN
5146 -- If its a renewal, send a notification to salesrep
5147 l_notif_attr_rec.CONTRACT_ID := l_contract_id;
5148 l_notif_attr_rec.ITEM_KEY := itemkey;
5149 l_notif_attr_rec.PERFORMER := l_renewalntf_to;
5150 l_notif_attr_rec.NTF_TYPE := G_NTF_TYPE_RENEWED;
5151 l_notif_attr_rec.NTF_SUBJECT := NULL;
5152 l_notif_attr_rec.SUBJECT := NULL;
5153 l_notif_attr_rec.ACCEPT_DECLINE_BY := NULL;
5154
5155 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5156 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
5157 'OKS_WF_K_PROCESS_PVT.set_notification_attributes('||
5158 ' Contract ID ='||l_contract_id||
5159 ' Notification Type ='||l_notif_attr_rec.NTF_TYPE||
5160 ' Performer ='||l_notif_attr_rec.PERFORMER||')');
5161 END IF;
5162 set_notification_attributes
5163 (
5164 p_api_version => 1.0,
5165 p_init_msg_list => OKC_API.G_FALSE,
5166 p_notif_attr => l_notif_attr_rec,
5167 x_return_status => l_return_status,
5168 x_msg_data => l_msg_data,
5169 x_msg_count => l_msg_count
5170 );
5171 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5172 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
5173 'OKS_WF_K_PROCESS_PVT.set_notification_attributes(x_return_status= '||
5174 l_return_status||' x_msg_count ='||l_msg_count||')');
5175 END IF;
5176 IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
5177 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5178 ELSIF l_return_status = G_RET_STS_ERROR THEN
5179 RAISE FND_API.G_EXC_ERROR;
5180 END IF;
5181 resultout := 'COMPLETE:RENEWAL';
5182 END IF;
5183 END IF;
5184 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5185 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
5186 'Resultout: ' || resultout);
5187 END IF;
5188
5189 -- Reset negotiation status to NULL so that no other process will
5190 -- update incorrect Negotiation status
5191 wf_engine.SetItemAttrText
5192 (
5193 itemtype => itemtype,
5194 itemkey => itemkey,
5195 aname => 'NEGOTIATION_STATUS',
5196 avalue => NULL
5197 );
5198
5199 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5200 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5201 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=RUN');
5202 END IF;
5203 RETURN;
5204 END IF; -- (funcmode = 'RUN')
5205
5206 IF (funcmode = 'CANCEL') THEN
5207 resultout := 'COMPLETE:';
5208 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5209 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5210 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
5211 END IF;
5212 RETURN;
5213 END IF; -- (funcmode = 'CANCEL')
5214
5215 IF (funcmode = 'TIMEOUT') THEN
5216 resultout := 'COMPLETE:';
5217 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5218 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5219 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
5220 END IF;
5221 RETURN;
5222 END IF; -- (funcmode = 'TIMEOUT')
5223
5224 EXCEPTION
5225 WHEN others THEN
5226 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5227 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
5228 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
5229 ||SQLCODE||', sqlerrm = '||SQLERRM);
5230 END IF;
5231 wf_core.CONTEXT
5232 (
5233 pkg_name => G_PKG_NAME,
5234 proc_name => l_api_name,
5235 arg1 => itemtype,
5236 arg2 => itemkey,
5237 arg3 => to_char(actid),
5238 arg4 => funcmode,
5239 arg5 => SQLCODE,
5240 arg6 => SQLERRM
5241 );
5242 END get_old_wf_status;
5243
5244 /*=========================================================================
5245 API name : get_process_type
5246 Type : Private.
5247 Function : This procedure determines the renewal process this contract
5248 is going to follow during its lifecycle.
5249 Pre-reqs : None.
5250 Parameters :
5251 IN : itemtype IN VARCHAR2 Required
5252 Workflow item type parameter
5253 : itemkey IN VARCHAR2 Required
5254 Workflow item key parameter
5255 : actid IN VARCHAR2 Required
5256 Workflow actid parameter
5257 : funcmode IN VARCHAR2 Required
5258 Workflow function mode parameter
5259 OUT : resultout OUT VARCHAR2(1)
5260 Workflow standard out parameter
5261 Note :
5262 =========================================================================*/
5263 PROCEDURE get_process_type
5264 (
5265 itemtype IN VARCHAR2,
5266 itemkey IN VARCHAR2,
5267 actid IN NUMBER,
5268 funcmode IN VARCHAR2,
5269 resultout OUT nocopy VARCHAR2
5270 ) IS
5271
5272 l_api_name CONSTANT VARCHAR2(30) := 'get_process_type';
5273 l_return_status VARCHAR2(1);
5274 l_msg_count NUMBER;
5275 l_msg_data VARCHAR2(4000);
5276
5277 l_contract_id NUMBER;
5278 l_process_type VARCHAR2(30);
5279
5280 BEGIN
5281
5282 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5283 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5284 'Entered '||G_PKG_NAME ||'.'||l_api_name);
5285 END IF;
5286 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5287 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
5288 'itemtype: ' || itemtype ||
5289 ' itemkey: ' || itemkey ||
5290 ' actid: ' || to_char(actid) ||
5291 ' funcmode: ' || funcmode);
5292 END IF;
5293 IF (funcmode = 'RUN') THEN
5294
5295 l_contract_id := wf_engine.GetItemAttrNumber(
5296 itemtype => itemtype,
5297 itemkey => itemkey,
5298 aname => 'CONTRACT_ID');
5299
5300 -- Get process type to determine if this is a new or a renewal contract
5301 -- If it is a new contract, process type is always Manual
5302 -- If it is a renewal contract, determine if this contract qualifies
5303 -- for either Online or Evergreen process
5304 l_process_type := wf_engine.GetItemAttrText(
5305 itemtype => itemtype,
5306 itemkey => itemkey,
5307 aname => 'PROCESS_TYPE');
5308
5309 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5310 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
5311 'Process Type: ' ||NVL(l_process_type,'NULL'));
5312 END IF;
5313
5314 IF l_process_type = G_RENEW_TYPE_ONLINE THEN
5315 -- update process status to 'Pending Publication'
5316 update_negotiation_status
5317 (
5318 p_api_version => 1.0,
5319 p_init_msg_list => G_TRUE,
5320 p_chr_id => l_contract_id,
5321 p_negotiation_status => G_NEG_STS_PEND_PUBLISH,
5322 x_return_status => l_return_status,
5323 x_msg_count => l_msg_count,
5324 x_msg_data => l_msg_data
5325 );
5326 IF l_return_status <> G_RET_STS_SUCCESS THEN
5327 RAISE FND_API.G_EXC_ERROR;
5328 END IF;
5329 resultout := 'COMPLETE:ONLINE';
5330 ELSIF l_process_type = G_RENEW_TYPE_EVERGREEN THEN
5331 resultout := 'COMPLETE:EVERGREEN';
5332 ELSIF l_process_type = G_NEW_CONTRACT THEN -- New Contract do nothing.
5333 resultout := 'COMPLETE:';
5334 ELSE
5335 resultout := 'COMPLETE:';
5336 END IF;
5337
5338 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5339 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
5340 'Resultout: ' || resultout);
5341 END IF;
5342 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5343 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5344 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=RUN');
5345 END IF;
5346 RETURN;
5347 END IF; -- (funcmode = 'RUN')
5348
5349 IF (funcmode = 'CANCEL') THEN
5350 resultout := 'COMPLETE:';
5351 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5352 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5353 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
5354 END IF;
5355 RETURN;
5356 END IF; -- (funcmode = 'CANCEL')
5357
5358 IF (funcmode = 'TIMEOUT') THEN
5359 resultout := 'COMPLETE:';
5360 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5361 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5362 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
5363 END IF;
5364 RETURN;
5365 END IF; -- (funcmode = 'TIMEOUT')
5366
5367 EXCEPTION
5368 WHEN FND_API.G_EXC_ERROR THEN
5369 l_msg_data := get_fnd_message;
5370 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5371 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
5372 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'Error: Itemtype: '
5373 ||NVL(itemtype,'NULL')||' Itemkey: '||NVL(itemkey,'NULL'));
5374 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,l_msg_data);
5375 END IF;
5376 wf_core.CONTEXT
5377 (
5378 pkg_name => G_PKG_NAME,
5379 proc_name => l_api_name,
5380 arg1 => itemtype,
5381 arg2 => itemkey,
5382 arg3 => l_msg_data
5383 );
5384 WHEN others THEN
5385 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5386 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
5387 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
5388 ||SQLCODE||', sqlerrm = '||SQLERRM);
5389 END IF;
5390 wf_core.CONTEXT
5391 (
5392 pkg_name => G_PKG_NAME,
5393 proc_name => l_api_name,
5394 arg1 => itemtype,
5395 arg2 => itemkey,
5396 arg3 => to_char(actid),
5397 arg4 => funcmode,
5398 arg5 => SQLCODE,
5399 arg6 => SQLERRM
5400 );
5401 END get_process_type;
5402
5403 /*=========================================================================
5404 API name : salesrep_action
5405 Type : Private.
5406 Function : This procedure makes the workflow process wait for
5407 salesrep action.
5408 Pre-reqs : None.
5409 Parameters :
5410 IN : itemtype IN VARCHAR2 Required
5411 Workflow item type parameter
5412 : itemkey IN VARCHAR2 Required
5413 Workflow item key parameter
5414 : actid IN VARCHAR2 Required
5415 Workflow actid parameter
5416 : funcmode IN VARCHAR2 Required
5417 Workflow function mode parameter
5418 OUT : resultout OUT VARCHAR2(1)
5419 Workflow standard out parameter
5420 Note :
5421 =========================================================================*/
5422 PROCEDURE salesrep_action
5423 (
5424 itemtype IN VARCHAR2,
5425 itemkey IN VARCHAR2,
5426 actid IN NUMBER,
5427 funcmode IN VARCHAR2,
5428 resultout OUT nocopy VARCHAR2
5429 ) IS
5430
5431 l_api_name CONSTANT VARCHAR2(30) := 'salesrep_action';
5432 l_return_status VARCHAR2(1);
5433 l_msg_count NUMBER;
5434 l_msg_data VARCHAR2(4000);
5435
5436 BEGIN
5437
5438 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5439 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5440 'Entered '||G_PKG_NAME ||'.'||l_api_name);
5441 END IF;
5442 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5443 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
5444 'itemtype: ' || itemtype ||
5445 ' itemkey: ' || itemkey ||
5446 ' actid: ' || to_char(actid) ||
5447 ' funcmode: ' || funcmode);
5448 END IF;
5449 IF (funcmode = 'RUN') THEN
5450 resultout := 'NOTIFIED:';
5451 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5452 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5453 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=RUN');
5454 END IF;
5455 RETURN;
5456 END IF; -- (funcmode = 'RUN')
5457
5458 IF (funcmode = 'CANCEL') THEN
5459 resultout := 'COMPLETE:';
5460 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5461 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5462 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
5463 END IF;
5464 RETURN;
5465 END IF; -- (funcmode = 'CANCEL')
5466
5467 IF (funcmode = 'TIMEOUT') THEN
5468 resultout := 'COMPLETE:';
5469 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5470 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5471 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
5472 END IF;
5473 RETURN;
5474 END IF; -- (funcmode = 'TIMEOUT')
5475
5476 EXCEPTION
5477 WHEN others THEN
5478 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5479 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
5480 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
5481 ||SQLCODE||', sqlerrm = '||SQLERRM);
5482 END IF;
5483 wf_core.CONTEXT
5484 (
5485 pkg_name => G_PKG_NAME,
5486 proc_name => l_api_name,
5487 arg1 => itemtype,
5488 arg2 => itemkey,
5489 arg3 => to_char(actid),
5490 arg4 => funcmode,
5491 arg5 => SQLCODE,
5492 arg6 => SQLERRM
5493 );
5494 END salesrep_action;
5495
5496 /*=========================================================================
5497 API name : is_submit_for_approval_allowed
5498 Type : Private.
5499 Function : This procedure determines whether the contract is eligible
5500 to be submitted for approval.
5501 Pre-reqs : None.
5502 Parameters :
5503 IN : p_api_version IN NUMBER Required
5504 Api version
5505 : p_init_msg_list IN VARCHAR2 Required
5506 Initialize message stack parameter
5507 : p_chr_id IN NUMBER Required
5508 Contract header Id
5509 : p_item_key IN VARCHAR2 Required
5510 Contract process workflow's item key.
5511 OUT : x_return_status OUT VARCHAR2(1)
5512 Api return status
5513 : x_msg_count OUT NUMBER
5514 Count of message on error stack
5515 : x_msg_data OUT VARCHAR2
5516 Actual error messages on error stack
5517 Note :
5518 =========================================================================*/
5519 PROCEDURE is_submit_for_approval_allowed
5520 (
5521 p_api_version IN NUMBER,
5522 p_init_msg_list IN VARCHAR2,
5523 p_contract_id IN NUMBER,
5524 p_item_key IN VARCHAR2,
5525 x_activity_name OUT NOCOPY VARCHAR2,
5526 x_return_status OUT NOCOPY VARCHAR2,
5527 x_msg_count OUT NOCOPY NUMBER,
5528 x_msg_data OUT NOCOPY VARCHAR2
5529 ) IS
5530
5531 l_api_version CONSTANT NUMBER := 1.0;
5532 l_api_name CONSTANT VARCHAR2(50) := 'is_submit_for_approval_allowed';
5533 l_item_key wf_items.item_key%TYPE;
5534 l_contract_number VARCHAR2(120);
5535 l_contract_modifier VARCHAR2(120);
5536
5537 BEGIN
5538
5539 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5540 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
5541 'Entered '||G_PKG_NAME ||'.'||l_api_name||'with Contract Id '||p_contract_id);
5542 END IF;
5543
5544 -- Standard call to check for call compatibility.
5545 IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
5546 x_return_status := G_RET_STS_ERROR;
5547 RAISE FND_API.G_EXC_ERROR;
5548 END IF;
5549
5550 -- Initialize message list if p_init_msg_list is set to TRUE.
5551 IF FND_API.to_Boolean( p_init_msg_list ) THEN
5552 FND_MSG_PUB.initialize;
5553 END IF;
5554
5555 -- Initialize API return status to success
5556 x_return_status := FND_API.G_RET_STS_SUCCESS;
5557
5558 IF p_contract_id IS NULL THEN
5559 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_INVD_CONTRACT_ID');
5560 FND_MESSAGE.SET_TOKEN('HDR_ID',p_contract_id);
5561 FND_MSG_PUB.add;
5562 RAISE FND_API.G_EXC_ERROR;
5563 END IF;
5564
5565 IF p_item_key IS NULL THEN
5566 l_item_key := get_wf_item_key(p_contract_id => p_contract_id);
5567 IF l_item_key IS NULL THEN
5568 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INVALID_WF_ITEM_KEY');
5569 FND_MSG_PUB.add;
5570 RAISE FND_API.G_EXC_ERROR;
5571 END IF;
5572 ELSE
5573 l_item_key := p_item_key;
5574 END IF;
5575
5576 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5577 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
5578 'Item Key found '||l_item_key);
5579 END IF;
5580
5581 x_activity_name := get_notified_activity
5582 (
5583 p_item_type => G_ITEM_TYPE
5584 ,p_item_key => l_item_key
5585 );
5586
5587 IF x_activity_name = G_SALESREP_ACTION THEN
5588 x_return_status := G_RET_STS_SUCCESS;
5589 ELSIF x_activity_name = G_CUST_ACTION THEN
5590 FND_MESSAGE.set_name(G_APP_NAME,'OKS_WAIT_CUST_ACCEPTANCE');
5591 FND_MESSAGE.SET_TOKEN('K_NUMBER',get_concat_k_number(p_contract_id));
5592 FND_MSG_PUB.add;
5593 x_return_status := G_RET_STS_WARNING;
5594 x_activity_name := G_CUST_ACTION;
5595 ELSE
5596 FND_MESSAGE.set_name(G_APP_NAME,'OKS_SUBMIT_APRVL_NOT_ALWD');
5597 FND_MESSAGE.SET_TOKEN('K_NUMBER',get_concat_k_number(p_contract_id));
5598 FND_MSG_PUB.add;
5599 RAISE FND_API.G_EXC_ERROR;
5600 END IF;
5601 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5602 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
5603 'Activity: '||x_activity_name||' Return status '||x_return_status);
5604 END IF;
5605
5606 -- Standard call to get message count and if count is 1, get message info.
5607 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count=>x_msg_count, p_data=>x_msg_data);
5608
5609 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5610 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5611 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
5612 END IF;
5613
5614 EXCEPTION
5615 WHEN FND_API.G_EXC_ERROR THEN
5616 x_return_status := G_RET_STS_ERROR;
5617 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
5618 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5619 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
5620 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.ERROR');
5621 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,get_fnd_message);
5622 END IF;
5623 WHEN OTHERS THEN
5624 x_return_status := G_RET_STS_UNEXP_ERROR;
5625 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5626 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
5627 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
5628 ||SQLCODE||', sqlerrm = '||SQLERRM);
5629 END IF;
5630 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
5631 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
5632 END is_submit_for_approval_allowed;
5633
5634 FUNCTION set_user_context
5635 (
5636 p_wf_item_key IN VARCHAR2,
5637 p_user_id IN NUMBER,
5638 p_resp_id IN NUMBER,
5639 p_resp_appl_id IN NUMBER,
5640 p_security_group_id IN NUMBER,
5641 p_commit IN VARCHAR2
5642 ) RETURN VARCHAR2 AS
5643
5644 PRAGMA AUTONOMOUS_TRANSACTION;
5645
5646 l_api_name CONSTANT VARCHAR2(30) := 'set_user_context';
5647 l_return_status VARCHAR2(1) := G_RET_STS_SUCCESS;
5648
5649 BEGIN
5650
5651 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5652 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
5653 'Entered '||G_PKG_NAME ||'.'||l_api_name||
5654 ' Item Key =>'||p_wf_item_key||
5655 ' User Id=>'||p_user_id||'Resp Id=>'||p_resp_id||
5656 ' Resp Appl Id=>'||p_resp_appl_id||
5657 ' Security Group Id=>'||p_security_group_id );
5658 END IF;
5659 -- Reset following item attributes to reflect the current user
5660 begin
5661 wf_engine.SetItemAttrNumber(
5662 itemtype => G_ITEM_TYPE,
5663 itemkey => p_wf_item_key,
5664 aname => 'USER_ID',
5665 avalue => p_user_id);
5666 exception
5667 when others then
5668 wf_engine.AddItemAttr (
5669 itemtype => G_ITEM_TYPE,
5670 itemkey => p_wf_item_key,
5671 aname => 'USER_ID');
5672
5673 wf_engine.SetItemAttrNumber (
5674 itemtype => G_ITEM_TYPE,
5675 itemkey => p_wf_item_key,
5676 aname => 'USER_ID',
5677 avalue => p_user_id);
5678 end;
5679 begin
5680 wf_engine.SetItemAttrNumber(
5681 itemtype => G_ITEM_TYPE,
5682 itemkey => p_wf_item_key,
5683 aname => 'RESP_ID',
5684 avalue => p_resp_id);
5685 exception
5686 when others then
5687 wf_engine.AddItemAttr (
5688 itemtype => G_ITEM_TYPE,
5689 itemkey => p_wf_item_key,
5690 aname => 'RESP_ID');
5691
5692 wf_engine.SetItemAttrNumber (
5693 itemtype => G_ITEM_TYPE,
5694 itemkey => p_wf_item_key,
5695 aname => 'RESP_ID',
5696 avalue => p_resp_id);
5697 end;
5698 begin
5699 wf_engine.SetItemAttrNumber(
5700 itemtype => G_ITEM_TYPE,
5701 itemkey => p_wf_item_key,
5702 aname => 'RESP_APPL_ID',
5703 avalue => p_resp_appl_id);
5704 exception
5705 when others then
5706 wf_engine.AddItemAttr (
5707 itemtype => G_ITEM_TYPE,
5708 itemkey => p_wf_item_key,
5709 aname => 'RESP_APPL_ID');
5710
5711 wf_engine.SetItemAttrNumber (
5712 itemtype => G_ITEM_TYPE,
5713 itemkey => p_wf_item_key,
5714 aname => 'RESP_APPL_ID',
5715 avalue => p_resp_appl_id);
5716 end;
5717 begin
5718 wf_engine.SetItemAttrNumber(
5719 itemtype => G_ITEM_TYPE,
5720 itemkey => p_wf_item_key,
5721 aname => 'SECURITY_GROUP_ID',
5722 avalue => p_security_group_id);
5723 exception
5724 when others then
5725 wf_engine.AddItemAttr (
5726 itemtype => G_ITEM_TYPE,
5727 itemkey => p_wf_item_key,
5728 aname => 'SECURITY_GROUP_ID');
5729
5730 wf_engine.SetItemAttrNumber (
5731 itemtype => G_ITEM_TYPE,
5732 itemkey => p_wf_item_key,
5733 aname => 'SECURITY_GROUP_ID',
5734 avalue => p_security_group_id);
5735 end;
5736
5737 IF FND_API.to_boolean( p_commit ) THEN
5738 COMMIT;
5739 END IF;
5740 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5741 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
5742 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
5743 END IF;
5744 RETURN l_return_status;
5745 END;
5746
5747 /*=========================================================================
5748 API name : submit_for_approval
5749 Type : Private.
5750 Function : This procedure determines whether the contract is eligible
5751 to be submitted for approval.
5752 Pre-reqs : None.
5753 Parameters :
5754 IN : p_api_version IN NUMBER Required
5755 Api version
5756 : p_init_msg_list IN VARCHAR2 Required
5757 Initialize message stack parameter
5758 : p_chr_id IN NUMBER Required
5759 Contract header Id
5760 : p_item_key IN VARCHAR2 Required
5761 Contract process workflow's item key.
5762 : p_validate_yn IN VARCHAR2 Required
5763 Flag to check if submit for approval action is allowed.
5764 : p_qa_required_yn IN VARCHAR2 Required
5765 If Y QA checks will be performed else skipped.
5766 OUT : x_return_status OUT VARCHAR2(1)
5767 Api return status
5768 : x_msg_count OUT NUMBER
5769 Count of message on error stack
5770 : x_msg_data OUT VARCHAR2
5771 Actual error messages on error stack
5772 Note :
5773 =========================================================================*/
5774 PROCEDURE submit_for_approval
5775 (
5776 p_api_version IN NUMBER,
5777 p_init_msg_list IN VARCHAR2,
5778 p_commit IN VARCHAR2 DEFAULT 'F',
5779 p_contract_id IN NUMBER,
5780 p_item_key IN VARCHAR2,
5781 p_validate_yn IN VARCHAR2,
5782 p_qa_required_yn IN VARCHAR2,
5783 x_negotiation_status OUT NOCOPY VARCHAR2,
5784 x_return_status OUT NOCOPY VARCHAR2,
5785 x_msg_count OUT NOCOPY NUMBER,
5786 x_msg_data OUT NOCOPY VARCHAR2
5787 ) IS
5788
5789 l_api_version CONSTANT NUMBER := 1.0;
5790 l_api_name CONSTANT VARCHAR2(50) := 'submit_for_approval';
5791
5792 l_send_email_yn VARCHAR2(1) := 'N';
5793 l_item_key wf_items.item_key%TYPE;
5794 l_email_attr_rec OKS_WF_K_PROCESS_PVT.email_attr_rec;
5795 l_activity_name VARCHAR2(30);
5796 l_irr_flag VARCHAR2(1);
5797
5798 BEGIN
5799
5800 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5801 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
5802 'Entered '||G_PKG_NAME ||'.'||l_api_name||
5803 ' with Contract Id '||p_contract_id ||
5804 ' p_validate_yn '||p_validate_yn||' p_qa_required_yn '||p_qa_required_yn);
5805 END IF;
5806
5807 DBMS_TRANSACTION.SAVEPOINT(l_api_name);
5808 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
5809 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5810 END IF;
5811
5812 -- Initialize message list if p_init_msg_list is set to TRUE.
5813 IF FND_API.to_Boolean( p_init_msg_list ) THEN
5814 FND_MSG_PUB.initialize;
5815 END IF;
5816
5817 -- Initialize API return status to success
5818 x_return_status := G_RET_STS_SUCCESS;
5819
5820 IF p_contract_id IS NULL THEN
5821 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_INVD_CONTRACT_ID');
5822 FND_MESSAGE.SET_TOKEN('HDR_ID',p_contract_id);
5823 FND_MSG_PUB.add;
5824 RAISE FND_API.G_EXC_ERROR;
5825 END IF;
5826
5827 -- Check whether submit for approval actions is applicable for this contract
5828 -- If k is not in 'Entered' status, we should not allow submit for approval
5829 IF OKS_K_ACTIONS_PVT.validateForRenewalAction(p_chr_id => p_contract_id) = 'N' THEN
5830 x_return_status := G_RET_STS_ACTION_NOT_ALWD;
5831 RAISE ActionNotAllowedException;
5832 END IF;
5833
5834 IF p_item_key IS NULL THEN
5835 l_item_key := get_wf_item_key(p_contract_id => p_contract_id);
5836 IF l_item_key IS NULL THEN
5837 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INVALID_WF_ITEM_KEY');
5838 FND_MSG_PUB.add;
5839 RAISE FND_API.G_EXC_ERROR;
5840 END IF;
5841 ELSE
5842 l_item_key := p_item_key;
5843 END IF;
5844
5845 -- Skip the submit for approval allowed check when
5846 -- this api is called for the 2nd time.
5847 IF p_validate_yn = 'Y' THEN
5848 is_submit_for_approval_allowed
5849 (
5850 p_api_version => l_api_version,
5851 p_init_msg_list => G_FALSE,
5852 p_contract_id => p_contract_id,
5853 p_item_key => l_item_key,
5854 x_activity_name => l_activity_name,
5855 x_return_status => x_return_status,
5856 x_msg_count => x_msg_count,
5857 x_msg_data => x_msg_data
5858 );
5859 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
5860 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5861 ELSIF x_return_status = G_RET_STS_ERROR THEN
5862 RAISE FND_API.G_EXC_ERROR;
5863 ELSIF x_return_status = G_RET_STS_WARNING THEN
5864 Raise ActionNotAllowedException;
5865 END IF;
5866 ELSE
5867 -- Only check if the contract is in either Salesrep / Customer queue
5868 l_activity_name := get_notified_activity
5869 (
5870 p_item_type => G_ITEM_TYPE
5871 ,p_item_key => l_item_key
5872 );
5873 IF l_activity_name NOT IN (G_SALESREP_ACTION, G_CUST_ACTION) THEN
5874 FND_MESSAGE.set_name(G_APP_NAME,'OKS_SUBMIT_APPROVAL_NOT_ALLOWED');
5875 FND_MSG_PUB.add;
5876 RAISE FND_API.G_EXC_ERROR;
5877 ELSIF l_activity_name = G_CUST_ACTION THEN
5878
5879 -- bug 5845505, send email only if template for the document type is setup
5880 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5881 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
5882 'OKS_WF_K_PROCESS_PVT.is_template_defined('||
5883 ' Contract ID ='||p_contract_id||
5884 ' Document Type ='||G_REPORT_TYPE_ACCEPT||')');
5885 END IF;
5886 is_template_defined (
5887 p_api_version => l_api_version,
5888 p_init_msg_list => G_FALSE,
5889 p_contract_id => p_contract_id,
5890 p_document_type => G_REPORT_TYPE_ACCEPT,
5891 x_template_defined_yn => l_send_email_yn,
5892 x_email_attr_rec => l_email_attr_rec,
5893 x_return_status => x_return_status,
5894 x_msg_data => x_msg_data,
5895 x_msg_count => x_msg_count
5896 );
5897
5898 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5899 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
5900 'OKS_WF_K_PROCESS_PVT.is_template_defined(x_return_status= '||
5901 x_return_status||' x_msg_count ='||x_msg_count||')');
5902 END IF;
5903 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
5904 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5905 ELSIF x_return_status = G_RET_STS_ERROR THEN
5906 RAISE FND_API.G_EXC_ERROR;
5907 END IF;
5908
5909 wf_engine.SetItemAttrText
5910 (
5911 itemtype => G_ITEM_TYPE,
5912 itemkey => l_item_key,
5913 aname => 'SEND_CONFIRM',
5914 avalue => l_send_email_yn
5915 );
5916
5917 --log interaction (media type WEB FORM) that customer has accepted the quote
5918 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5919 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
5920 'OKS_WF_K_PROCESS_PVT.set_email_attributes('||
5921 ' Contract ID = '||p_contract_id||
5922 substr(' IH Subject = '||l_email_attr_rec.ih_subject,1,100)||
5923 substr(' IH Message = '||l_email_attr_rec.ih_message||')',1,100));
5924 END IF;
5925 OKS_AUTO_REMINDER.log_interaction (
5926 p_api_version => l_api_version,
5927 p_init_msg_list => G_FALSE,
5928 x_return_status => x_return_status,
5929 x_msg_count => x_msg_count,
5930 x_msg_data => x_msg_data,
5931 p_chr_id => p_contract_id,
5932 p_subject => l_email_attr_rec.ih_subject,
5933 p_msg_body => l_email_attr_rec.ih_message,
5934 p_sent2_email => NULL,
5935 p_media_type => G_MEDIA_TYPE_WEB_FORM
5936 );
5937 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5938 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
5939 'OKS_AUTO_REMINDER.log_interaction(x_return_status= '||
5940 x_return_status||' x_msg_count ='||x_msg_count||')');
5941 END IF;
5942 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
5943 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5944 ELSIF x_return_status = G_RET_STS_ERROR THEN
5945 RAISE FND_API.G_EXC_ERROR;
5946 END IF;
5947 IF NVL(l_send_email_yn,'N') = 'Y' THEN
5948
5949 l_email_attr_rec.CONTRACT_ID := p_contract_id;
5950 l_email_attr_rec.ITEM_KEY := l_item_key;
5951 l_email_attr_rec.EMAIL_TYPE := G_REPORT_TYPE_ACCEPT;
5952 l_email_attr_rec.TO_EMAIL := NULL;
5953 l_email_attr_rec.SENDER_EMAIL := NULL;
5954
5955 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5956 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
5957 'OKS_WF_K_PROCESS_PVT.set_email_attributes('||
5958 ' Contract ID ='||p_contract_id||
5959 ' Email Type ='||l_email_attr_rec.EMAIL_TYPE||')');
5960 END IF;
5961 set_email_attributes
5962 (
5963 p_api_version => l_api_version,
5964 p_init_msg_list => OKC_API.G_FALSE,
5965 p_email_attr => l_email_attr_rec,
5966 x_return_status => x_return_status,
5967 x_msg_data => x_msg_data,
5968 x_msg_count => x_msg_count
5969 );
5970 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
5971 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
5972 'OKS_WF_K_PROCESS_PVT.set_email_attributes(x_return_status= '||
5973 x_return_status||' x_msg_count ='||x_msg_count||')');
5974 END IF;
5975 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
5976 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5977 ELSIF x_return_status = G_RET_STS_ERROR THEN
5978 RAISE FND_API.G_EXC_ERROR;
5979 END IF;
5980 END IF;
5981 END IF;
5982 END IF;
5983
5984 -- If submit for approval action is taken at Authoring set this flag to 'N' so
5985 -- that QA check is not performed but when taken at Workbench, set it to 'Y'.
5986 wf_engine.SetItemAttrText
5987 (
5988 itemtype => G_ITEM_TYPE,
5989 itemkey => l_item_key,
5990 aname => 'QA_REQUIRED_YN',
5991 avalue => p_qa_required_yn
5992 );
5993
5994 -- Set wf item attributes to reflect the current user submitting for approval
5995 x_return_status := set_user_context(
5996 p_wf_item_key => l_item_key,
5997 p_user_id => fnd_global.user_id,
5998 p_resp_id => fnd_global.resp_id,
5999 p_resp_appl_id => fnd_global.resp_appl_id,
6000 p_security_group_id => fnd_global.security_group_id,
6001 p_commit => G_TRUE
6002 );
6003
6004 -- This call is made for Authoring so that they don't have to access DB to get
6005 -- the latest Negotiation status. Authoring shud consider the return parameter.
6006 l_irr_flag := get_irr_flag(p_contract_id => NULL,p_item_key => l_item_key);
6007 IF l_irr_flag = G_IRR_FLAG_REQD THEN
6008 x_negotiation_status := G_NEG_STS_PEND_IA;
6009 ELSIF l_irr_flag = G_IRR_FLAG_NOT_REQD THEN
6010 x_negotiation_status := G_NEG_STS_PEND_ACTIVATION;
6011 ELSE
6012 RAISE FND_API.G_EXC_ERROR;
6013 END IF;
6014
6015 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6016 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
6017 'Starting complete_activity with Activity '||l_activity_name);
6018 END IF;
6019 complete_activity
6020 (
6021 p_api_version => l_api_version,
6022 p_init_msg_list => G_FALSE,
6023 p_contract_id => p_contract_id,
6024 p_item_key => l_item_key,
6025 p_resultout => 'SUBMIT',
6026 p_process_status => x_negotiation_status,
6027 p_activity_name => l_activity_name,
6028 x_return_status => x_return_status,
6029 x_msg_data => x_msg_data,
6030 x_msg_count => x_msg_count
6031 );
6032 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6033 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
6034 ' Return status '||x_return_status||' x_msg_count '||x_msg_count);
6035 END IF;
6036 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
6037 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6038 ELSIF x_return_status = G_RET_STS_ERROR THEN
6039 RAISE FND_API.G_EXC_ERROR;
6040 END IF;
6041
6042 IF FND_API.to_boolean( p_commit ) THEN
6043 COMMIT;
6044 END IF;
6045 -- Standard call to get message count and if count is 1, get message info.
6046 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count=>x_msg_count, p_data=>x_msg_data);
6047
6048 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6049 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
6050 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
6051 END IF;
6052
6053 EXCEPTION
6054 WHEN ActionNotAllowedException THEN
6055 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
6056 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
6057 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6058 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
6059 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.ActionNotAllowedException '||
6060 ' Contract is either waiting for customer acceptance or not in entered status');
6061 END IF;
6062 WHEN FND_API.G_EXC_ERROR THEN
6063 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
6064 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
6065 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6066 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
6067 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_ERROR');
6068 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
6069 END IF;
6070 x_return_status := G_RET_STS_ERROR;
6071 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6072 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
6073 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
6074 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6075 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
6076 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_UNEXPECTED_ERROR');
6077 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
6078 END IF;
6079 x_return_status := G_RET_STS_UNEXP_ERROR ;
6080 WHEN OTHERS THEN
6081 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
6082 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6083 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
6084 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from OTHERS sqlcode = '
6085 ||SQLCODE||', sqlerrm = '||SQLERRM);
6086 END IF;
6087 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
6088 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
6089 x_return_status := G_RET_STS_UNEXP_ERROR ;
6090 END submit_for_approval;
6091
6092 /*=========================================================================
6093 API name : publish_to_customer
6094 Type : Private.
6095 Function : This procedure determines whether the contract is eligible
6096 to be submitted for approval.
6097 Pre-reqs : None.
6098 Parameters :
6099 IN : p_api_version IN NUMBER Required
6100 Api version
6101 : p_init_msg_list IN VARCHAR2 Required
6102 Initialize message stack parameter
6103 : p_contract_id IN NUMBER Required
6104 Contract header Id
6105 : p_item_key IN VARCHAR2 Required
6106 Contract process workflow's item key.
6107 OUT : x_return_status OUT VARCHAR2(1)
6108 Api return status
6109 : x_msg_count OUT NUMBER
6110 Count of message on error stack
6111 : x_msg_data OUT VARCHAR2
6112 Actual error messages on error stack
6113 Note :
6114 =========================================================================*/
6115 PROCEDURE publish_to_customer
6116 (
6117 p_api_version IN NUMBER,
6118 p_init_msg_list IN VARCHAR2,
6119 p_commit IN VARCHAR2 DEFAULT 'F',
6120 p_contract_id IN NUMBER,
6121 p_item_key IN VARCHAR2,
6122 x_return_status OUT NOCOPY VARCHAR2,
6123 x_msg_count OUT NOCOPY NUMBER,
6124 x_msg_data OUT NOCOPY VARCHAR2
6125 ) IS
6126
6127 l_api_version CONSTANT NUMBER := 1.0;
6128 l_api_name CONSTANT VARCHAR2(50) := 'publish_to_customer';
6129
6130 l_item_key VARCHAR2(80);
6131 l_activity_name VARCHAR2(30);
6132 l_negotiation_status VARCHAR2(30);
6133
6134 CURSOR l_nego_sts_csr (p_chr_id NUMBER) IS
6135 SELECT renewal_status FROM oks_k_headers_b
6136 WHERE chr_id = p_chr_id;
6137
6138 BEGIN
6139
6140 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6141 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
6142 'Entered '||G_PKG_NAME ||'.'||l_api_name||
6143 '(p_contract_id=>'||p_contract_id||'p_item_key=>'||p_item_key||')');
6144 END IF;
6145
6146 DBMS_TRANSACTION.SAVEPOINT(l_api_name);
6147 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
6148 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6149 END IF;
6150 -- Initialize message list if p_init_msg_list is set to TRUE.
6151 IF FND_API.to_Boolean( p_init_msg_list ) THEN
6152 FND_MSG_PUB.initialize;
6153 END IF;
6154
6155 -- Initialize API return status to success
6156 x_return_status := G_RET_STS_SUCCESS;
6157
6158 IF p_contract_id IS NULL THEN
6159 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_INVD_CONTRACT_ID');
6160 FND_MESSAGE.SET_TOKEN('HDR_ID',p_contract_id);
6161 FND_MSG_PUB.add;
6162 RAISE FND_API.G_EXC_ERROR;
6163 END IF;
6164
6165 OPEN l_nego_sts_csr (p_contract_id);
6166 FETCH l_nego_sts_csr INTO l_negotiation_status;
6167 CLOSE l_nego_sts_csr;
6168
6169 -- Updating the negotiation status to Quote Published coz when
6170 -- customer requests assistance, the contract is still in customers queue
6171 -- and salesrep in a way is republishing the contract
6172 -- Bug fix 5331882.
6173 IF NVL(l_negotiation_status,'X') = G_NEG_STS_ASSIST_REQD THEN
6174 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6175 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
6176 'Updating Negotiation status ' || l_negotiation_status || ' to Quote Published');
6177 END IF;
6178 update oks_k_headers_b set renewal_status = G_NEG_STS_QUOTE_SENT
6179 where chr_id = p_contract_id;
6180 ELSE
6181 -- Check whether publish to customer action is applicable for this contract
6182 -- If k is not in 'Entered' status, we should not allow for publishing it online
6183 IF OKS_K_ACTIONS_PVT.validateForRenewalAction(p_chr_id => p_contract_id) = 'N' THEN
6184 RAISE ActionNotAllowedException;
6185 END IF;
6186
6187 IF p_item_key IS NULL THEN
6188 l_item_key := get_wf_item_key(p_contract_id => p_contract_id);
6189 IF l_item_key IS NULL THEN
6190 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INVALID_WF_ITEM_KEY');
6191 FND_MSG_PUB.add;
6192 RAISE FND_API.G_EXC_ERROR;
6193 END IF;
6194 ELSE
6195 l_item_key := p_item_key;
6196 END IF;
6197
6198 IF activity_exist_in_process(
6199 p_item_type => G_ITEM_TYPE
6200 ,p_item_key => l_item_key
6201 ,p_activity_name => G_SALESREP_ACTION) THEN
6202 l_activity_name := G_SALESREP_ACTION;
6203 ELSE
6204 RAISE AlreadyPublishedException;
6205 END IF;
6206
6207 complete_activity
6208 (
6209 p_api_version => l_api_version,
6210 p_init_msg_list => G_FALSE,
6211 p_contract_id => p_contract_id,
6212 p_item_key => l_item_key,
6213 p_resultout => 'PUBLISH_ONLINE',
6214 p_process_status => G_NEG_STS_PEND_PUBLISH,
6215 p_activity_name => l_activity_name,
6216 x_return_status => x_return_status,
6217 x_msg_data => x_msg_data,
6218 x_msg_count => x_msg_count
6219 );
6220 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
6221 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6222 ELSIF x_return_status = G_RET_STS_ERROR THEN
6223 RAISE FND_API.G_EXC_ERROR;
6224 END IF;
6225
6226 -- Set this item attribute to 'Y' which indicates that this contract was
6227 -- published online manually. This is an important attribute since this is the only
6228 -- contract information that specifies that a contract is going thru online process
6229 wf_engine.SetItemAttrText
6230 (
6231 itemtype => G_ITEM_TYPE,
6232 itemkey => l_item_key,
6233 aname => 'PUBLISH_MAN_YN',
6234 avalue => 'Y'
6235 );
6236 END IF;
6237
6238 IF FND_API.to_boolean( p_commit ) THEN
6239 COMMIT;
6240 END IF;
6241
6242 -- Standard call to get message count and if count is 1, get message info.
6243 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count=>x_msg_count, p_data=>x_msg_data);
6244
6245 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6246 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
6247 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
6248 END IF;
6249
6250 EXCEPTION
6251 WHEN ActionNotAllowedException THEN
6252 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
6253 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
6254 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6255 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
6256 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.ActionNotAllowedException '||
6257 ' Contract cannot be published since it is not in entered status');
6258 END IF;
6259 x_return_status := G_RET_STS_ACTION_NOT_ALWD;
6260 WHEN AlreadyPublishedException THEN
6261 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
6262 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
6263 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6264 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
6265 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from AlreadyPublishedException');
6266 END IF;
6267 x_return_status := G_RET_STS_ALREADY_PUBLISHED;
6268 WHEN FND_API.G_EXC_ERROR THEN
6269 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
6270 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
6271 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6272 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
6273 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_ERROR');
6274 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
6275 END IF;
6276 x_return_status := G_RET_STS_ERROR;
6277 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6278 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
6279 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
6280 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6281 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
6282 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_UNEXPECTED_ERROR');
6283 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
6284 END IF;
6285 x_return_status := G_RET_STS_UNEXP_ERROR ;
6286 WHEN OTHERS THEN
6287 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
6288 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
6289 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
6290 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from OTHERS sqlcode = '
6291 ||SQLCODE||', sqlerrm = '||SQLERRM);
6292 END IF;
6293 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
6294 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
6295 x_return_status := G_RET_STS_UNEXP_ERROR ;
6296 END publish_to_customer;
6297
6298 /*=========================================================================
6299 API name : check_qa
6300 Type : Private.
6301 Function : This procedure executes all required QA checks during
6302 contract activation process. If the contract is going thru
6303 online process additional checks like Quote To Email address
6304 validation are performed.
6305 Pre-reqs : None.
6306 Parameters :
6307 IN : itemtype IN VARCHAR2 Required
6308 Workflow item type parameter
6309 : itemkey IN VARCHAR2 Required
6310 Workflow item key parameter
6311 : actid IN VARCHAR2 Required
6312 Workflow actid parameter
6313 : funcmode IN VARCHAR2 Required
6314 Workflow function mode parameter
6315 OUT : resultout OUT VARCHAR2(1)
6316 Workflow standard out parameter
6317 Note :
6318 =========================================================================*/
6319 PROCEDURE check_qa
6320 (
6321 itemtype IN VARCHAR2,
6322 itemkey IN VARCHAR2,
6323 actid IN NUMBER,
6324 funcmode IN VARCHAR2,
6325 resultout OUT nocopy VARCHAR2
6326 ) IS
6327
6328 l_api_name CONSTANT VARCHAR2(50) := 'check_qa';
6329 l_api_version CONSTANT NUMBER := 1.0;
6330 l_return_status VARCHAR2(1) := G_RET_STS_SUCCESS;
6331 l_msg_count NUMBER;
6332 l_msg_data VARCHAR2(2000);
6333
6334 CURSOR l_qa_csr ( p_chr_id NUMBER ) IS
6335 SELECT contract_number, contract_number_modifier, qcl_id,
6336 authoring_org_id, inv_organization_id
6337 FROM okc_k_headers_all_b
6338 WHERE id = p_chr_id;
6339
6340 l_contract_id NUMBER;
6341 l_qa_rec l_qa_csr%ROWTYPE;
6342 l_msg_tbl OKC_QA_CHECK_PUB.MSG_TBL_TYPE;
6343 l_count BINARY_INTEGER;
6344 l_msg_ctr BINARY_INTEGER := 1;
6345 l_qto_email VARCHAR2(2000);
6346 l_negotiation_status VARCHAR2(30);
6347 l_qa_calling_process VARCHAR2(30);
6348 l_online_yn VARCHAR2(1);
6349 l_stop VARCHAR2(1) := 'N';
6350 l_email_attr_rec OKS_WF_K_PROCESS_PVT.email_attr_rec;
6351 l_notif_attr_rec OKS_WF_K_PROCESS_PVT.notif_attr_rec;
6352
6353 BEGIN
6354
6355 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6356 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
6357 'Entered '||G_PKG_NAME ||'.'||l_api_name);
6358 END IF;
6359
6360 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6361 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
6362 'itemtype: ' || itemtype ||
6363 ' itemkey: ' || itemkey ||
6364 ' actid: ' || to_char(actid) ||
6365 ' funcmode: ' || funcmode);
6366 END IF;
6367 IF (funcmode = 'RUN') THEN
6368
6369 l_contract_id := wf_engine.GetItemAttrNumber(
6370 itemtype => itemtype,
6371 itemkey => itemkey,
6372 aname => 'CONTRACT_ID');
6373
6374 -- Initialize workflow message attributes to Null.
6375 FOR l_count IN 1 .. 10 LOOP
6376 wf_engine.SetItemAttrText
6377 (
6378 itemtype => itemtype,
6379 itemkey => itemkey,
6380 aname => 'MESSAGE' || l_count,
6381 avalue => NULL
6382 );
6383 END LOOP;
6384
6385 -- Get QA checklist associated with contract
6386 OPEN l_qa_csr (l_contract_id);
6387 FETCH l_qa_csr INTO l_qa_rec;
6388 IF l_qa_csr%NOTFOUND OR l_qa_rec.qcl_id IS NULL THEN
6389 CLOSE l_qa_csr;
6390 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_INVALID_QA_CHECKLIST');
6391 IF l_qa_rec.contract_number_modifier IS NOT NULL THEN
6392 FND_MESSAGE.SET_TOKEN('CONTRACT_NUM',l_qa_rec.contract_number ||' - ' ||
6393 l_qa_rec.contract_number_modifier);
6394 ELSE
6395 FND_MESSAGE.SET_TOKEN('CONTRACT_NUM',l_qa_rec.contract_number);
6396 END IF;
6397 FND_MSG_PUB.add;
6398 IF FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6399 FND_LOG.STRING(FND_LOG.LEVEL_ERROR ,G_MODULE||l_api_name,'Invalid QA checklist ');
6400 END IF;
6401 RAISE FND_API.G_EXC_ERROR;
6402 END IF;
6403 CLOSE l_qa_csr;
6404
6405 -- Initializing the context to global
6406 okc_context.set_okc_org_context(p_org_id => l_qa_rec.authoring_org_id,
6407 p_organization_id => l_qa_rec.inv_organization_id);
6408
6409 -- distinguish the process in which this QA check is invoked
6410 -- it can be either Pending IA or Pending Publication
6411 l_qa_calling_process := get_negotiation_status(p_contract_id => l_contract_id);
6412
6413 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6414 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
6415 'OKC_QA_CHECK_PUB.execute_qa_check_list(p_qcl_id= '||l_qa_rec.qcl_id||
6416 ' p_chr_id ='||l_contract_id||')');
6417 END IF;
6418 -- Execute the default and service contracts QA checklists
6419 OKC_QA_CHECK_PUB.execute_qa_check_list
6420 (
6421 p_api_version => l_api_version,
6422 p_init_msg_list => OKC_API.G_FALSE,
6423 x_return_status => l_return_status,
6424 x_msg_count => l_msg_count,
6425 x_msg_data => l_msg_data,
6426 p_qcl_id => l_qa_rec.qcl_id,
6427 p_chr_id => l_contract_id,
6428 x_msg_tbl => l_msg_tbl
6429 );
6430 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6431 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
6432 'OKC_QA_CHECK_PUB.execute_qa_check_list(x_return_status= '||l_return_status||
6433 ' x_msg_tbl.count ='||l_msg_tbl.count||')');
6434 END IF;
6435 IF l_return_status <> G_RET_STS_SUCCESS THEN
6436 RAISE FND_API.G_EXC_ERROR;
6437 END IF;
6438
6439 -- Check if any of the QA checks have failed. If so populate error message
6440 -- into workflow item attributes and mark the negotiation status coz we want to
6441 -- distinguish between online process QA failure and regular QA failure.
6442 IF l_msg_tbl.count >0 THEN
6443 l_count := l_msg_tbl.first;
6444 LOOP
6445 IF l_msg_tbl(l_count).error_status='E' THEN
6446 -- If this QA check is not called from Online process / Publish Online
6447 -- process then set the negotiation status to 'Internal Approval QA Failed'
6448 IF l_qa_calling_process = G_NEG_STS_PEND_PUBLISH THEN
6449 l_negotiation_status := G_NEG_STS_QPUB_QA_FAIL;
6450 ELSE
6451 l_negotiation_status := G_NEG_STS_IA_QA_FAIL;
6452 END IF;
6453
6454 IF l_msg_ctr <= 10 THEN
6455 wf_engine.SetItemAttrText
6456 (
6457 itemtype => itemtype,
6458 itemkey => itemkey,
6459 aname => 'MESSAGE' || l_msg_ctr,
6460 avalue => l_msg_tbl(l_count).data
6461 );
6462 l_msg_ctr := l_msg_ctr + 1;
6463 END IF;
6464 END IF;
6465 -- Stop populating wf messages when all 10 item attributes are full or
6466 -- we are at the end of the error message table
6467 IF (l_msg_ctr > 10) OR (l_count = l_msg_tbl.LAST) THEN
6468 l_stop := 'Y';
6469 END IF;
6470 EXIT WHEN l_stop = 'Y';
6471 l_count:=l_msg_tbl.next(l_count);
6472 END LOOP;
6473 END IF;
6474
6475 -- Perform these additional checks if the contract is going thru online process
6476 IF l_qa_calling_process = G_NEG_STS_PEND_PUBLISH THEN
6477
6478 -- Message stack is initialized since QA checks above will post
6479 -- 'Contracts QA process has completed successfully' message after completion
6480 FND_MSG_PUB.initialize;
6481 -- Since we are here we know that this QA check is called from Online process
6482 -- There are two qualifying paths for which a process can enter into this IF condition
6483 -- 1.Online process, 2.Publish quote online process
6484 BEGIN
6485 l_qto_email := get_qto_email(p_contract_id => l_contract_id);
6486 IF l_qto_email IS NULL THEN
6487 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6488 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name,'Quote To email not found');
6489 END IF;
6490 RAISE FND_API.G_EXC_ERROR;
6491 END IF;
6492 EXCEPTION
6493 WHEN FND_API.G_EXC_ERROR THEN
6494 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => l_msg_count, p_data => l_msg_data );
6495 -- Set the message only when a vacant message item attribute is available
6496 IF (l_msg_ctr < 10) THEN
6497 wf_engine.SetItemAttrText
6498 (
6499 itemtype => itemtype,
6500 itemkey => itemkey,
6501 aname => 'MESSAGE' || l_msg_ctr,
6502 avalue => substr(get_fnd_message,1,1500)
6503 );
6504 l_msg_ctr := l_msg_ctr + 1;
6505 END IF;
6506
6507 -- Update negotiation status to 'Publish QA Failed'
6508 l_negotiation_status := G_NEG_STS_QPUB_QA_FAIL;
6509 END;
6510 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6511 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
6512 'Negotiation Status: '||l_negotiation_status );
6513 END IF;
6514 -- Once all QA checks are successful, set all the email related attributes
6515 -- so that an email along with Quote can be sent to Quote To contact.
6516 -- THIS IF LOOP SHOULD BE ENTERED ONLY FOR CONTRACTS GOING THRU ONLINE
6517 -- PROCESS AND HAS SUCCESSFULLY COMPLETED ALL THE QA CHECKS.
6518 IF l_negotiation_status IS NULL then
6519 l_email_attr_rec.CONTRACT_ID := l_contract_id;
6520 l_email_attr_rec.ITEM_KEY := itemkey;
6521 l_email_attr_rec.EMAIL_TYPE := G_REPORT_TYPE_QUOTE;
6522 l_email_attr_rec.TO_EMAIL := l_qto_email;
6523 l_email_attr_rec.SENDER_EMAIL := NULL;
6524 l_email_attr_rec.EMAIL_SUBJECT := NULL;
6525 l_email_attr_rec.IH_SUBJECT := NULL;
6526 l_email_attr_rec.IH_MESSAGE := NULL;
6527
6528 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6529 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
6530 'OKS_WF_K_PROCESS_PVT.set_email_attributes('||
6531 ' Contract ID ='||l_contract_id||
6532 ' Email Type ='||l_email_attr_rec.TO_EMAIL||
6533 ' To Email ='||l_qto_email||')');
6534 END IF;
6535 set_email_attributes
6536 (
6537 p_api_version => l_api_version,
6538 p_init_msg_list => OKC_API.G_FALSE,
6539 p_email_attr => l_email_attr_rec,
6540 x_return_status => l_return_status,
6541 x_msg_data => l_msg_data,
6542 x_msg_count => l_msg_count
6543 );
6544 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6545 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
6546 'OKS_WF_K_PROCESS_PVT.set_email_attributes(x_return_status= '||l_return_status||
6547 ' x_msg_count ='||l_msg_count||')');
6548 END IF;
6549 IF l_return_status <> G_RET_STS_SUCCESS THEN
6550 RAISE FND_API.G_EXC_ERROR;
6551 END IF;
6552 END IF;
6553 END IF;
6554
6555 IF l_negotiation_status IS NOT NULL then
6556 -- update process status to either 'Quote Publish QA Failed' or 'Internal Approval QA Failed'
6557 update_negotiation_status
6558 (
6559 p_api_version => 1.0,
6560 p_init_msg_list => G_TRUE,
6561 p_chr_id => l_contract_id,
6562 p_negotiation_status => l_negotiation_status,
6563 x_return_status => l_return_status,
6564 x_msg_count => l_msg_count,
6565 x_msg_data => l_msg_data
6566 );
6567 IF l_return_status <> G_RET_STS_SUCCESS THEN
6568 RAISE FND_API.G_EXC_ERROR;
6569 END IF;
6570
6571 -- In case of errors, set wf attributes that'll be used by the notification
6572 -- which will be rendered by OAF embedded region.
6573 l_notif_attr_rec.CONTRACT_ID := l_contract_id;
6574 l_notif_attr_rec.ITEM_KEY := itemkey;
6575 l_notif_attr_rec.PERFORMER := NULL;
6576 l_notif_attr_rec.NTF_TYPE := G_NTF_TYPE_QA_FAIL;
6577 l_notif_attr_rec.NTF_SUBJECT := NULL;
6578 l_notif_attr_rec.SUBJECT := get_lookup_meaning(l_negotiation_status,G_LKUP_TYPE_NEGO_STATUS);
6579 l_notif_attr_rec.ACCEPT_DECLINE_BY := NULL;
6580
6581 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6582 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
6583 'OKS_WF_K_PROCESS_PVT.set_notification_attributes('||
6584 ' Contract ID ='||l_contract_id||
6585 ' Notification Type ='||l_notif_attr_rec.NTF_TYPE||
6586 ' Subject ='||l_notif_attr_rec.NTF_SUBJECT||')');
6587 END IF;
6588 set_notification_attributes
6589 (
6590 p_api_version => l_api_version,
6591 p_init_msg_list => OKC_API.G_FALSE,
6592 p_notif_attr => l_notif_attr_rec,
6593 x_return_status => l_return_status,
6594 x_msg_data => l_msg_data,
6595 x_msg_count => l_msg_count
6596 );
6597 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6598 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
6599 'OKS_WF_K_PROCESS_PVT.set_notification_attributes(x_return_status= '||
6600 l_return_status||' x_msg_count ='||l_msg_count||')');
6601 END IF;
6602 IF l_return_status <> G_RET_STS_SUCCESS THEN
6603 RAISE FND_API.G_EXC_ERROR;
6604 END IF;
6605 resultout := 'COMPLETE:F';
6606 ELSE
6607 resultout := 'COMPLETE:T';
6608 END IF;
6609
6610 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6611 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
6612 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
6613 END IF;
6614 RETURN;
6615 END IF; -- (funcmode = 'RUN')
6616
6617 IF (funcmode = 'CANCEL') THEN
6618 resultout := 'COMPLETE:';
6619 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6620 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
6621 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
6622 END IF;
6623 RETURN;
6624 END IF; -- (funcmode = 'CANCEL')
6625
6626 IF (funcmode = 'TIMEOUT') THEN
6627 resultout := 'COMPLETE:';
6628 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6629 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
6630 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
6631 END IF;
6632 RETURN;
6633 END IF; -- (funcmode = 'TIMEOUT')
6634 EXCEPTION
6635 WHEN FND_API.G_EXC_ERROR THEN
6636 resultout := 'COMPLETE:F';
6637 l_msg_data := get_fnd_message;
6638 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6639 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
6640 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'Error: Itemtype: '
6641 ||NVL(itemtype,'NULL')||' Itemkey: '||NVL(itemkey,'NULL'));
6642 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,l_msg_data);
6643 END IF;
6644 -- Since this is the primary cause of the error, we have to communicate it
6645 -- even with an expense of loosing a populated message.
6646 IF l_msg_ctr > 10 THEN
6647 l_msg_ctr := 10;
6648 END IF;
6649 wf_engine.SetItemAttrText
6650 (
6651 itemtype => itemtype,
6652 itemkey => itemkey,
6653 aname => 'MESSAGE' || l_msg_ctr,
6654 avalue => l_msg_data
6655 );
6656 BEGIN
6657 l_notif_attr_rec.CONTRACT_ID := l_contract_id;
6658 l_notif_attr_rec.ITEM_KEY := itemkey;
6659 l_notif_attr_rec.PERFORMER := NULL;
6660 l_notif_attr_rec.NTF_TYPE := G_NTF_TYPE_QA_FAIL;
6661 l_notif_attr_rec.NTF_SUBJECT := NULL;
6662 l_notif_attr_rec.SUBJECT := substr(get_fnd_message,1,200);
6663 l_notif_attr_rec.ACCEPT_DECLINE_BY := NULL;
6664 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6665 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
6666 'OKS_WF_K_PROCESS_PVT.set_notification_attributes('||
6667 ' Contract ID ='||l_contract_id||
6668 ' Notification Type ='||l_notif_attr_rec.NTF_TYPE||
6669 ' Subject ='||l_notif_attr_rec.NTF_SUBJECT||')');
6670 END IF;
6671 set_notification_attributes
6672 (
6673 p_api_version => l_api_version,
6674 p_init_msg_list => OKC_API.G_FALSE,
6675 p_notif_attr => l_notif_attr_rec,
6676 x_return_status => l_return_status,
6677 x_msg_data => l_msg_data,
6678 x_msg_count => l_msg_count
6679 );
6680 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6681 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
6682 'OKS_WF_K_PROCESS_PVT.set_notification_attributes(x_return_status= '||
6683 l_return_status||' x_msg_count ='||l_msg_count||')');
6684 END IF;
6685 EXCEPTION
6686 WHEN others THEN
6687 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6688 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
6689 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'G_EXC_ERROR.Others sqlcode = '
6690 ||SQLCODE||', sqlerrm = '||SQLERRM);
6691 END IF;
6692 END;
6693 WHEN others THEN
6694 resultout := 'COMPLETE:F';
6695 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6696 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
6697 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
6698 ||SQLCODE||', sqlerrm = '||SQLERRM);
6699 END IF;
6700 -- Since this is the primary cause of the error, we have to communicate it
6701 -- even with an expense of loosing a populated message.
6702 IF l_msg_ctr > 10 THEN
6703 l_msg_ctr := 10;
6704 END IF;
6705 wf_engine.SetItemAttrText
6706 (
6707 itemtype => itemtype,
6708 itemkey => itemkey,
6709 aname => 'MESSAGE' || l_msg_ctr,
6710 avalue => SQLCODE||':'||SQLERRM
6711 );
6712 BEGIN
6713 l_notif_attr_rec.CONTRACT_ID := l_contract_id;
6714 l_notif_attr_rec.ITEM_KEY := itemkey;
6715 l_notif_attr_rec.PERFORMER := NULL;
6716 l_notif_attr_rec.NTF_TYPE := G_NTF_TYPE_QA_FAIL;
6717 l_notif_attr_rec.NTF_SUBJECT := NULL;
6718 l_notif_attr_rec.SUBJECT := substr(SQLERRM,1,200);
6719 l_notif_attr_rec.ACCEPT_DECLINE_BY := NULL;
6720 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6721 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
6722 'OKS_WF_K_PROCESS_PVT.set_notification_attributes('||
6723 ' Contract ID ='||l_contract_id||
6724 ' Notification Type ='||l_notif_attr_rec.NTF_TYPE||
6725 ' Subject ='||l_notif_attr_rec.NTF_SUBJECT||')');
6726 END IF;
6727 set_notification_attributes
6728 (
6729 p_api_version => l_api_version,
6730 p_init_msg_list => OKC_API.G_FALSE,
6731 p_notif_attr => l_notif_attr_rec,
6732 x_return_status => l_return_status,
6733 x_msg_data => l_msg_data,
6734 x_msg_count => l_msg_count
6735 );
6736 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6737 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
6738 'OKS_WF_K_PROCESS_PVT.set_notification_attributes(x_return_status= '||
6739 l_return_status||' x_msg_count ='||l_msg_count||')');
6740 END IF;
6741 EXCEPTION
6742 WHEN others THEN
6743 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6744 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
6745 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'OTHERS.Others sqlcode = '
6746 ||SQLCODE||', sqlerrm = '||SQLERRM);
6747 END IF;
6748 END;
6749 END check_qa;
6750
6751 /*=========================================================================
6752 API name : customer_action
6753 Type : Private.
6754 Function : This procedure makes the workflow process wait for
6755 customer action.
6756 Pre-reqs : None.
6757 Parameters :
6758 IN : itemtype IN VARCHAR2 Required
6759 Workflow item type parameter
6760 : itemkey IN VARCHAR2 Required
6761 Workflow item key parameter
6762 : actid IN VARCHAR2 Required
6763 Workflow actid parameter
6764 : funcmode IN VARCHAR2 Required
6765 Workflow function mode parameter
6766 OUT : resultout OUT VARCHAR2(1)
6767 Workflow standard out parameter
6768 Note :
6769 =========================================================================*/
6770 PROCEDURE customer_action
6771 (
6772 itemtype IN VARCHAR2,
6773 itemkey IN VARCHAR2,
6774 actid IN NUMBER,
6775 funcmode IN VARCHAR2,
6776 resultout OUT nocopy VARCHAR2
6777 ) IS
6778
6779 l_api_name CONSTANT VARCHAR2(30) := 'customer_action';
6780 l_return_status VARCHAR2(1);
6781 l_msg_count NUMBER;
6782 l_msg_data VARCHAR2(4000);
6783
6784 BEGIN
6785
6786 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6787 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6788 'Entered '||G_PKG_NAME ||'.'||l_api_name);
6789 END IF;
6790 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6791 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
6792 'itemtype: ' || itemtype ||
6793 ' itemkey: ' || itemkey ||
6794 ' actid: ' || to_char(actid) ||
6795 ' funcmode: ' || funcmode);
6796 END IF;
6797 IF (funcmode = 'RUN') THEN
6798 resultout := 'NOTIFIED:';
6799 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6800 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
6801 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=RUN');
6802 END IF;
6803 RETURN;
6804 END IF; -- (funcmode = 'RUN')
6805
6806 IF (funcmode = 'CANCEL') THEN
6807 resultout := 'COMPLETE:';
6808 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6809 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
6810 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
6811 END IF;
6812 RETURN;
6813 END IF; -- (funcmode = 'CANCEL')
6814
6815 IF (funcmode = 'TIMEOUT') THEN
6816 resultout := 'COMPLETE:';
6817 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6818 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
6819 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
6820 END IF;
6821 RETURN;
6822 END IF; -- (funcmode = 'TIMEOUT')
6823
6824 EXCEPTION
6825 WHEN others THEN
6826 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6827 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
6828 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
6829 ||SQLCODE||', sqlerrm = '||SQLERRM);
6830 END IF;
6831 wf_core.CONTEXT
6832 (
6833 pkg_name => G_PKG_NAME,
6834 proc_name => l_api_name,
6835 arg1 => itemtype,
6836 arg2 => itemkey,
6837 arg3 => to_char(actid),
6838 arg4 => funcmode,
6839 arg5 => SQLCODE,
6840 arg6 => SQLERRM
6841 );
6842 END customer_action;
6843
6844 /*=========================================================================
6845 API name : get_approval_flag
6846 Type : Private.
6847 Function : This procedure determines whether this contract requires explicit
6848 action by Salesrep when a contract is accepted by customer during
6849 online process. The possible values are 'A' - Automatic,
6850 'M' - Manual and 'N' - Not required.
6851 New contracts always require internal review.
6852 Pre-reqs : None.
6853 Parameters :
6854 IN : itemtype IN VARCHAR2 Required
6855 Workflow item type parameter
6856 : itemkey IN VARCHAR2 Required
6857 Workflow item key parameter
6858 : actid IN VARCHAR2 Required
6859 Workflow actid parameter
6860 : funcmode IN VARCHAR2 Required
6861 Workflow function mode parameter
6862 OUT : resultout OUT VARCHAR2(1)
6863 Workflow standard out parameter
6864 Note :
6865 =========================================================================*/
6866 PROCEDURE get_approval_flag
6867 (
6868 itemtype IN VARCHAR2,
6869 itemkey IN VARCHAR2,
6870 actid IN NUMBER,
6871 funcmode IN VARCHAR2,
6872 resultout OUT nocopy VARCHAR2
6873 ) IS
6874
6875 l_api_name CONSTANT VARCHAR2(30) := 'get_approval_flag';
6876 l_return_status VARCHAR2(1);
6877 l_msg_count NUMBER;
6878 l_msg_data VARCHAR2(4000);
6879
6880 l_contract_id NUMBER;
6881 l_irr_flag VARCHAR2(1);
6882
6883 BEGIN
6884
6885 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6886 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
6887 'Entered '||G_PKG_NAME ||'.'||l_api_name);
6888 END IF;
6889 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6890 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
6891 'itemtype: ' || itemtype ||
6892 ' itemkey: ' || itemkey ||
6893 ' actid: ' || to_char(actid) ||
6894 ' funcmode: ' || funcmode);
6895 END IF;
6896 IF (funcmode = 'RUN') THEN
6897
6898 l_contract_id := wf_engine.GetItemAttrNumber(
6899 itemtype => itemtype,
6900 itemkey => itemkey,
6901 aname => 'CONTRACT_ID');
6902
6903 -- Get submit for approval flag to determine if this contract
6904 -- requires explict action by salesrep.
6905 l_irr_flag := wf_engine.GetItemAttrText(
6906 itemtype => itemtype,
6907 itemkey => itemkey,
6908 aname => 'IRR_FLAG');
6909
6910 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6911 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
6912 'Irr Flag: ' ||NVL(l_irr_flag,'NULL'));
6913 END IF;
6914
6915 -- 1. Require explicit action from Salesrep
6916 -- 2. For new contracts, Salesrep action is always required
6917 IF NVL(l_irr_flag,G_IRR_FLAG_REQD) IN (G_IRR_FLAG_MANUAL, G_IRR_FLAG_REQD) THEN
6918 resultout := 'COMPLETE:MANUAL';
6919 update_negotiation_status
6920 (
6921 p_api_version => 1.0,
6922 p_init_msg_list => G_FALSE,
6923 p_chr_id => l_contract_id,
6924 p_negotiation_status => G_NEG_STS_QUOTE_ACPTD,
6925 x_return_status => l_return_status,
6926 x_msg_count => l_msg_count,
6927 x_msg_data => l_msg_data
6928 );
6929 IF l_return_status <> G_RET_STS_SUCCESS THEN
6930 RAISE FND_API.G_EXC_ERROR;
6931 END IF;
6932 -- 3. Doesn't require explicit action from Salesrep
6933 ELSE
6934 resultout := 'COMPLETE:';
6935 END IF;
6936
6937 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6938 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
6939 'Resultout: ' || resultout);
6940 END IF;
6941 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6942 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
6943 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=RUN');
6944 END IF;
6945 RETURN;
6946 END IF; -- (funcmode = 'RUN')
6947
6948 IF (funcmode = 'CANCEL') THEN
6949 resultout := 'COMPLETE:';
6950 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6951 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
6952 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
6953 END IF;
6954 RETURN;
6955 END IF; -- (funcmode = 'CANCEL')
6956
6957 IF (funcmode = 'TIMEOUT') THEN
6958 resultout := 'COMPLETE:';
6959 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6960 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
6961 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
6962 END IF;
6963 RETURN;
6964 END IF; -- (funcmode = 'TIMEOUT')
6965
6966 EXCEPTION
6967 WHEN FND_API.G_EXC_ERROR THEN
6968 l_msg_data := get_fnd_message;
6969 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6970 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
6971 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'Error: Itemtype: '
6972 ||NVL(itemtype,'NULL')||' Itemkey: '||NVL(itemkey,'NULL'));
6973 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,l_msg_data);
6974 END IF;
6975 wf_core.CONTEXT
6976 (
6977 pkg_name => G_PKG_NAME,
6978 proc_name => l_api_name,
6979 arg1 => itemtype,
6980 arg2 => itemkey,
6981 arg3 => l_msg_data
6982 );
6983 WHEN others THEN
6984 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
6985 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
6986 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
6987 ||SQLCODE||', sqlerrm = '||SQLERRM);
6988 END IF;
6989 wf_core.CONTEXT
6990 (
6991 pkg_name => G_PKG_NAME,
6992 proc_name => l_api_name,
6993 arg1 => itemtype,
6994 arg2 => itemkey,
6995 arg3 => to_char(actid),
6996 arg4 => funcmode,
6997 arg5 => SQLCODE,
6998 arg6 => SQLERRM
6999 );
7000 END get_approval_flag;
7001
7002 /*=========================================================================
7003 API name : is_approval_required
7004 Type : Private.
7005 Function : This procedure determines whether this contract requires
7006 internal review or not. The possible values are 'A' Automatic
7007 'M' manual, 'Y' Required and 'N' Not required.
7008 New contracts always require internal review.
7009 Pre-reqs : None.
7010 Parameters :
7011 IN : itemtype IN VARCHAR2 Required
7012 Workflow item type parameter
7013 : itemkey IN VARCHAR2 Required
7014 Workflow item key parameter
7015 : actid IN VARCHAR2 Required
7016 Workflow actid parameter
7017 : funcmode IN VARCHAR2 Required
7018 Workflow function mode parameter
7019 OUT : resultout OUT VARCHAR2(1)
7020 Workflow standard out parameter
7021 Note :
7022 =========================================================================*/
7023 PROCEDURE is_approval_required
7024 (
7025 itemtype IN VARCHAR2,
7026 itemkey IN VARCHAR2,
7027 actid IN NUMBER,
7028 funcmode IN VARCHAR2,
7029 resultout OUT nocopy VARCHAR2
7030 ) IS
7031
7032 l_api_name CONSTANT VARCHAR2(30) := 'is_approval_required';
7033 l_return_status VARCHAR2(1);
7034 l_msg_count NUMBER;
7035 l_msg_data VARCHAR2(4000);
7036
7037 l_irr_flag VARCHAR2(1);
7038 l_contract_id NUMBER;
7039 BEGIN
7040
7041 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7042 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7043 'Entered '||G_PKG_NAME ||'.'||l_api_name);
7044 END IF;
7045 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7046 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7047 'itemtype: ' || itemtype ||
7048 ' itemkey: ' || itemkey ||
7049 ' actid: ' || to_char(actid) ||
7050 ' funcmode: ' || funcmode);
7051 END IF;
7052 IF (funcmode = 'RUN') THEN
7053
7054 l_irr_flag := get_irr_flag(p_contract_id => NULL,p_item_key => itemkey);
7055 IF l_irr_flag IS NOT NULL THEN
7056 resultout := 'COMPLETE:'||l_irr_flag;
7057 ELSE
7058 RAISE FND_API.G_EXC_ERROR;
7059 END IF;
7060
7061 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7062 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7063 'Resultout: ' || resultout);
7064 END IF;
7065 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7066 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7067 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=RUN');
7068 END IF;
7069 RETURN;
7070 END IF; -- (funcmode = 'RUN')
7071
7072 IF (funcmode = 'CANCEL') THEN
7073 resultout := 'COMPLETE:';
7074 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7075 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7076 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
7077 END IF;
7078 RETURN;
7079 END IF; -- (funcmode = 'CANCEL')
7080
7081 IF (funcmode = 'TIMEOUT') THEN
7082 resultout := 'COMPLETE:';
7083 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7084 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7085 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
7086 END IF;
7087 RETURN;
7088 END IF; -- (funcmode = 'TIMEOUT')
7089
7090 EXCEPTION
7091 WHEN FND_API.G_EXC_ERROR THEN
7092 l_msg_data := get_fnd_message;
7093 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7094 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
7095 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'Error: Itemtype: '
7096 ||NVL(itemtype,'NULL')||' Itemkey: '||NVL(itemkey,'NULL'));
7097 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,l_msg_data);
7098 END IF;
7099 wf_core.CONTEXT
7100 (
7101 pkg_name => G_PKG_NAME,
7102 proc_name => l_api_name,
7103 arg1 => itemtype,
7104 arg2 => itemkey,
7105 arg3 => l_msg_data
7106 );
7107 WHEN others THEN
7108 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7109 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
7110 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
7111 ||SQLCODE||', sqlerrm = '||SQLERRM);
7112 END IF;
7113 wf_core.CONTEXT
7114 (
7115 pkg_name => G_PKG_NAME,
7116 proc_name => l_api_name,
7117 arg1 => itemtype,
7118 arg2 => itemkey,
7119 arg3 => to_char(actid),
7120 arg4 => funcmode,
7121 arg5 => SQLCODE,
7122 arg6 => SQLERRM
7123 );
7124 END is_approval_required;
7125
7126 /*=========================================================================
7127 API name : process_negotiation_status
7128 Type : Private.
7129 Function : This procedure updates renewal status in OKS_K_HEADERS_B
7130 and bumps up the version. This is invoked from the workflow.
7131 Pre-reqs : None.
7132 Parameters :
7133 IN : itemtype IN VARCHAR2 Required
7134 Workflow item type parameter
7135 : itemkey IN VARCHAR2 Required
7136 Workflow item key parameter
7137 : actid IN VARCHAR2 Required
7138 Workflow actid parameter
7139 : funcmode IN VARCHAR2 Required
7140 Workflow function mode parameter
7141 OUT : resultout OUT VARCHAR2(1)
7142 Workflow standard out parameter
7143 Note :
7144 =========================================================================*/
7145 PROCEDURE process_negotiation_status
7146 (
7147 itemtype IN VARCHAR2,
7148 itemkey IN VARCHAR2,
7149 actid IN NUMBER,
7150 funcmode IN VARCHAR2,
7151 resultout OUT nocopy VARCHAR2
7152 ) IS
7153
7154 l_api_name CONSTANT VARCHAR2(30) := 'process_negotiation_status';
7155 l_return_status VARCHAR2(1);
7156 l_msg_count NUMBER;
7157 l_msg_data VARCHAR2(4000);
7158
7159 l_contract_id NUMBER;
7160 l_negotiation_status VARCHAR2(30);
7161 l_irr_flag VARCHAR2(1);
7162
7163 BEGIN
7164
7165 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7166 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7167 'Entered '||G_PKG_NAME ||'.'||l_api_name);
7168 END IF;
7169 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7170 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7171 'itemtype: ' || itemtype ||
7172 ' itemkey: ' || itemkey ||
7173 ' actid: ' || to_char(actid) ||
7174 ' funcmode: ' || funcmode);
7175 END IF;
7176 IF (funcmode = 'RUN') THEN
7177
7178 l_contract_id := wf_engine.GetItemAttrNumber(
7179 itemtype => itemtype,
7180 itemkey => itemkey,
7181 aname => 'CONTRACT_ID');
7182
7183 l_negotiation_status := wf_engine.GetActivityAttrText(
7184 itemtype => itemtype,
7185 itemkey => itemkey,
7186 actid => actid,
7187 aname => 'TARGET_NEGO_STATUS');
7188
7189 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7190 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7191 'Contract Id: ' || l_contract_id ||
7192 ' Negotiation status: ' || l_negotiation_status);
7193 END IF;
7194
7195 -- If internal approval is required update the negotiation status to
7196 -- Pending Internal review else Pending Activation.
7197 IF l_negotiation_status = G_NEG_STS_PEND_IA THEN
7198 l_irr_flag := get_irr_flag(p_contract_id => l_contract_id,p_item_key => itemkey);
7199 IF l_irr_flag = G_IRR_FLAG_REQD THEN
7200 l_negotiation_status := G_NEG_STS_PEND_IA;
7201 ELSIF l_irr_flag = G_IRR_FLAG_NOT_REQD THEN
7202 l_negotiation_status := G_NEG_STS_PEND_ACTIVATION;
7203 ELSE
7204 RAISE FND_API.G_EXC_ERROR;
7205 END IF;
7206 END IF;
7207
7208 update_negotiation_status
7209 (
7210 p_api_version => 1.0,
7211 p_init_msg_list => G_TRUE,
7212 p_chr_id => l_contract_id,
7213 p_negotiation_status => l_negotiation_status,
7214 x_return_status => l_return_status,
7215 x_msg_count => l_msg_count,
7216 x_msg_data => l_msg_data
7217 );
7218 IF l_return_status <> G_RET_STS_SUCCESS THEN
7219 RAISE NegStatusUpdateException;
7220 END IF;
7221
7222 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7223 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7224 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=RUN');
7225 END IF;
7226 RETURN;
7227 END IF; -- (funcmode = 'RUN')
7228
7229 IF (funcmode = 'CANCEL') THEN
7230 resultout := 'COMPLETE:';
7231 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7232 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7233 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
7234 END IF;
7235 RETURN;
7236 END IF; -- (funcmode = 'CANCEL')
7237
7238 IF (funcmode = 'TIMEOUT') THEN
7239 resultout := 'COMPLETE:';
7240 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7241 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7242 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
7243 END IF;
7244 RETURN;
7245 END IF; -- (funcmode = 'TIMEOUT')
7246
7247 EXCEPTION
7248 WHEN NegStatusUpdateException THEN
7249 l_msg_data := get_fnd_message;
7250 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7251 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
7252 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.NegStatusUpdateException'
7253 ||' Itemtype: '||NVL(itemtype,'NULL')||' Itemkey: '||NVL(itemkey,'NULL'));
7254 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,l_msg_data);
7255 END IF;
7256 wf_core.CONTEXT
7257 (
7258 pkg_name => G_PKG_NAME,
7259 proc_name => l_api_name,
7260 arg1 => itemtype,
7261 arg2 => itemkey,
7262 arg3 => l_msg_data
7263 );
7264 WHEN FND_API.G_EXC_ERROR THEN
7265 l_msg_data := get_fnd_message;
7266 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7267 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
7268 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'Error: Itemtype: '
7269 ||NVL(itemtype,'NULL')||' Itemkey: '||NVL(itemkey,'NULL'));
7270 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,l_msg_data);
7271 END IF;
7272 wf_core.CONTEXT
7273 (
7274 pkg_name => G_PKG_NAME,
7275 proc_name => l_api_name,
7276 arg1 => itemtype,
7277 arg2 => itemkey,
7278 arg3 => l_msg_data
7279 );
7280 WHEN others THEN
7281 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7282 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
7283 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
7284 ||SQLCODE||', sqlerrm = '||SQLERRM);
7285 END IF;
7286 wf_core.CONTEXT
7287 (
7288 pkg_name => G_PKG_NAME,
7289 proc_name => l_api_name,
7290 arg1 => itemtype,
7291 arg2 => itemkey,
7292 arg3 => to_char(actid),
7293 arg4 => funcmode,
7294 arg5 => SQLCODE,
7295 arg6 => SQLERRM
7296 );
7297 END process_negotiation_status;
7298
7299 /*=========================================================================
7300 API name : k_approval_start
7301 Type : Private.
7302 Function : This is a wrapper procedure to launch the approval
7303 workflow. Used to make it autonomous.
7304 Pre-reqs : None.
7305 Parameters :
7306 IN : p_api_version IN NUMBER Required
7307 Api version
7308 : p_init_msg_list IN VARCHAR2 Required
7309 Initialize message stack parameter
7310 : p_cotract_id IN NUMBER Required
7311 Contract header Id
7312 : p_process_id IN NUMBER Required
7313 Process definition id of approval process.
7314 : p_commit IN VARCHAR2 Required
7315 Commit or not to commit. That is the question :)
7316 OUT : x_return_status OUT VARCHAR2(1)
7317 Api return status
7318 : x_msg_count OUT NUMBER
7319 Count of message on error stack
7320 : x_msg_data OUT VARCHAR2
7321 Actual error messages on error stack
7322 Note :
7323 =========================================================================*/
7324 PROCEDURE k_approval_start
7325 (
7326 p_api_version IN NUMBER,
7327 p_init_msg_list IN VARCHAR2,
7328 p_contract_id IN NUMBER,
7329 p_process_id IN NUMBER,
7330 p_commit IN VARCHAR2,
7331 p_wf_item_key IN VARCHAR2,
7332 x_return_status OUT NOCOPY VARCHAR2,
7333 x_msg_data OUT NOCOPY VARCHAR2,
7334 x_msg_count OUT NOCOPY NUMBER
7335 ) AS
7336
7337 PRAGMA AUTONOMOUS_TRANSACTION;
7338
7339 l_api_name CONSTANT VARCHAR2(50) := 'k_approval_start';
7340 l_user_id NUMBER;
7341 l_resp_id NUMBER;
7342 l_resp_appl_id NUMBER;
7343 l_security_group_id NUMBER;
7344
7345 BEGIN
7346 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7347 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7348 'Entered '||G_PKG_NAME ||'.'||l_api_name);
7349 END IF;
7350 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7351 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7352 'p_contract_id: ' || p_contract_id ||
7353 ' p_process_id: ' || p_process_id ||
7354 ' p_commit: ' || p_commit ||
7355 ' p_wf_item_key: ' || p_wf_item_key);
7356 END IF;
7357 BEGIN
7358 l_user_id := wf_engine.GetItemAttrNumber
7359 (
7360 itemtype => G_ITEM_TYPE,
7361 itemkey => p_wf_item_key,
7362 aname => 'USER_ID'
7363 );
7364 EXCEPTION
7365 WHEN OTHERS THEN
7366 wf_engine.AddItemAttr
7367 (
7368 itemtype => G_ITEM_TYPE,
7369 itemkey => p_wf_item_key,
7370 aname => 'USER_ID'
7371 );
7372 wf_engine.SetItemAttrNumber
7373 (
7374 itemtype => G_ITEM_TYPE,
7375 itemkey => p_wf_item_key,
7376 aname => 'USER_ID',
7377 avalue => null
7378 );
7379 END;
7380 BEGIN
7381 l_resp_id := wf_engine.GetItemAttrNumber
7382 (
7383 itemtype => G_ITEM_TYPE,
7384 itemkey => p_wf_item_key,
7385 aname => 'RESP_ID'
7386 );
7387 EXCEPTION
7388 WHEN OTHERS THEN
7389 wf_engine.AddItemAttr
7390 (
7391 itemtype => G_ITEM_TYPE,
7392 itemkey => p_wf_item_key,
7393 aname => 'RESP_ID'
7394 );
7395 wf_engine.SetItemAttrNumber
7396 (
7397 itemtype => G_ITEM_TYPE,
7398 itemkey => p_wf_item_key,
7399 aname => 'RESP_ID',
7400 avalue => null
7401 );
7402 END;
7403 BEGIN
7404 l_resp_appl_id := wf_engine.GetItemAttrNumber
7405 (
7406 itemtype => G_ITEM_TYPE,
7407 itemkey => p_wf_item_key,
7408 aname => 'RESP_APPL_ID'
7409 );
7410
7411 EXCEPTION
7412 WHEN OTHERS THEN
7413 wf_engine.AddItemAttr
7414 (
7415 itemtype => G_ITEM_TYPE,
7416 itemkey => p_wf_item_key,
7417 aname => 'RESP_APPL_ID'
7418 );
7419 wf_engine.SetItemAttrNumber
7420 (
7421 itemtype => G_ITEM_TYPE,
7422 itemkey => p_wf_item_key,
7423 aname => 'RESP_APPL_ID',
7424 avalue => null
7425 );
7426 END;
7427 BEGIN
7428 l_security_group_id := wf_engine.GetItemAttrNumber
7429 (
7430 itemtype => G_ITEM_TYPE,
7431 itemkey => p_wf_item_key,
7432 aname => 'SECURITY_GROUP_ID'
7433 );
7434 EXCEPTION
7435 WHEN OTHERS THEN
7436 wf_engine.AddItemAttr
7437 (
7438 itemtype => G_ITEM_TYPE,
7439 itemkey => p_wf_item_key,
7440 aname => 'SECURITY_GROUP_ID'
7441 );
7442 wf_engine.SetItemAttrNumber
7443 (
7444 itemtype => G_ITEM_TYPE,
7445 itemkey => p_wf_item_key,
7446 aname => 'SECURITY_GROUP_ID',
7447 avalue => null
7448 );
7449 END;
7450
7451 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7452 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
7453 'OKC_CONTRACT_APPROVAL_PUB.k_approval_start(p_contract_id= '||
7454 p_contract_id||' p_process_id='||p_process_id||')');
7455 END IF;
7456
7457 BEGIN
7458 OKC_CONTRACT_APPROVAL_PUB.k_approval_start
7459 (
7460 p_api_version => p_api_version,
7461 p_init_msg_list => p_init_msg_list,
7462 x_return_status => x_return_status,
7463 x_msg_count => x_msg_count,
7464 x_msg_data => x_msg_data,
7465 p_contract_id => p_contract_id,
7466 p_process_id => p_process_id,
7467 p_do_commit => p_commit,
7468 p_access_level => 'Y',
7469 p_user_id => l_user_id,
7470 p_resp_id => l_resp_id,
7471 p_resp_appl_id => l_resp_appl_id,
7472 p_security_group_id => l_security_group_id
7473 );
7474 EXCEPTION
7475 WHEN OTHERS THEN
7476 x_return_status := G_RET_STS_UNEXP_ERROR;
7477 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7478 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name,
7479 'In Others exception for OKS_WF_K_PROCESS_PVT.k_approval_start');
7480 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name,
7481 'Error: '|| substr(SQLERRM,1,500));
7482 END IF;
7483 END;
7484 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7485 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
7486 'OKC_CONTRACT_APPROVAL_PUB.k_approval_start(x_return_status= '||
7487 x_return_status||' x_msg_count='||x_msg_count||')');
7488 END IF;
7489 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7490 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7491 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
7492 END IF;
7493 END;
7494
7495 /*=========================================================================
7496 API name : launch_approval_wf
7497 Type : Private.
7498 Function : This procedure launches the approval workflow.
7499 Pre-reqs : None.
7500 Parameters :
7501 IN : p_api_version IN NUMBER Required
7502 Api version
7503 : p_init_msg_list IN VARCHAR2 Required
7504 Initialize message stack parameter
7505 : p_chr_id IN NUMBER Required
7506 Contract header Id
7507 : p_negotiation_status IN VARCHAR2 Required
7508 New negotiation status that is to be updated.
7509 OUT : x_return_status OUT VARCHAR2(1)
7510 Api return status
7511 : x_msg_count OUT NUMBER
7512 Count of message on error stack
7513 : x_msg_data OUT VARCHAR2
7514 Actual error messages on error stack
7515 Note :
7516 =========================================================================*/
7517 PROCEDURE launch_approval_wf
7518 (
7519 itemtype IN VARCHAR2,
7520 itemkey IN VARCHAR2,
7521 actid IN NUMBER,
7522 funcmode IN VARCHAR2,
7523 resultout OUT nocopy VARCHAR2
7524 ) IS
7525
7526 l_api_name CONSTANT VARCHAR2(50) := 'launch_approval_wf';
7527 l_api_version CONSTANT NUMBER := 1.0;
7528 l_return_status VARCHAR2(1) := G_RET_STS_SUCCESS;
7529 l_msg_count NUMBER;
7530 l_msg_data VARCHAR2(2000);
7531
7532 CURSOR l_pdf_csr(p_chr_id number) is
7533 SELECT pdf_id
7534 FROM okc_k_processes kp, okc_process_defs_b pd
7535 WHERE kp.chr_id=p_chr_id and kp.pdf_id=pd.id and pd.usage='APPROVE';
7536
7537 l_contract_id NUMBER;
7538 l_pdf_id NUMBER;
7539 l_notif_attr_rec OKS_WF_K_PROCESS_PVT.notif_attr_rec;
7540
7541 BEGIN
7542 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7543 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
7544 'Entered '||G_PKG_NAME ||'.'||l_api_name);
7545 END IF;
7546 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7547 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7548 'itemtype: ' || itemtype ||
7549 ' itemkey: ' || itemkey ||
7550 ' actid: ' || to_char(actid) ||
7551 ' funcmode: ' || funcmode);
7552 END IF;
7553 IF (funcmode = 'RUN') THEN
7554
7555 l_contract_id := wf_engine.GetItemAttrNumber(
7556 itemtype => itemtype,
7557 itemkey => itemkey,
7558 aname => 'CONTRACT_ID');
7559
7560 OPEN l_pdf_csr(l_contract_id);
7561 FETCH l_pdf_csr into l_pdf_id;
7562 CLOSE l_pdf_csr;
7563
7564 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7565 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,'Pdf Id: ' || l_pdf_id);
7566 END IF;
7567
7568 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7569 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
7570 'OKC_CONTRACT_APPROVAL_PUB.k_approval_start(p_contract_id= '||
7571 l_contract_id||' p_process_id='||l_pdf_id||')');
7572 END IF;
7573 BEGIN
7574 k_approval_start
7575 (
7576 p_api_version => l_api_version,
7577 p_init_msg_list => G_FALSE,
7578 x_return_status => l_return_status,
7579 x_msg_count => l_msg_count,
7580 x_msg_data => l_msg_data,
7581 p_contract_id => l_contract_id,
7582 p_process_id => l_pdf_id,
7583 p_commit => G_TRUE,
7584 p_wf_item_key => itemkey
7585 );
7586 EXCEPTION
7587 WHEN OTHERS THEN
7588 l_return_status := G_RET_STS_UNEXP_ERROR;
7589 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7590 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name,
7591 'In Others exception for OKS_WF_K_PROCESS_PVT.k_approval_start');
7592 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name,
7593 'Error: '|| substr(SQLERRM,1,500));
7594 END IF;
7595 END;
7596 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7597 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
7598 'OKC_CONTRACT_APPROVAL_PUB.k_approval_start(x_return_status= '||
7599 l_return_status||' x_msg_count='||l_msg_count||')');
7600 END IF;
7601
7602 IF l_return_status <> G_RET_STS_SUCCESS THEN
7603 update_negotiation_status
7604 (
7605 p_api_version => l_api_version,
7606 p_init_msg_list => G_FALSE,
7607 p_chr_id => l_contract_id,
7608 p_negotiation_status => G_NEG_STS_IA_FAIL,
7609 x_return_status => l_return_status,
7610 x_msg_count => l_msg_count,
7611 x_msg_data => l_msg_data
7612 );
7613 IF l_return_status <> G_RET_STS_SUCCESS THEN
7614 RAISE FND_API.G_EXC_ERROR;
7615 END IF;
7616
7617 -- In case of errors, set wf attributes that'll be used by the notification
7618 -- and will be rendered by OAF embedded region.
7619 l_notif_attr_rec.CONTRACT_ID := l_contract_id;
7620 l_notif_attr_rec.ITEM_KEY := itemkey;
7621 l_notif_attr_rec.PERFORMER := NULL;
7622 l_notif_attr_rec.NTF_TYPE := G_NTF_TYPE_ERROR;
7623 l_notif_attr_rec.NTF_SUBJECT := NULL;
7624 l_notif_attr_rec.SUBJECT := get_lookup_meaning(G_NEG_STS_IA_FAIL,G_LKUP_TYPE_NEGO_STATUS);
7625 l_notif_attr_rec.ACCEPT_DECLINE_BY := NULL;
7626 l_notif_attr_rec.MSGS_FROM_STACK_YN:= 'Y';
7627
7628 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7629 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
7630 'OKS_WF_K_PROCESS_PVT.set_notification_attributes('||
7631 ' Contract ID ='||l_contract_id||
7632 ' Notification Type ='||l_notif_attr_rec.NTF_TYPE||
7633 ' Subject ='||l_notif_attr_rec.NTF_SUBJECT||')');
7634 END IF;
7635 set_notification_attributes
7636 (
7637 p_api_version => l_api_version,
7638 p_init_msg_list => OKC_API.G_FALSE,
7639 p_notif_attr => l_notif_attr_rec,
7640 x_return_status => l_return_status,
7641 x_msg_data => l_msg_data,
7642 x_msg_count => l_msg_count
7643 );
7644 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7645 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
7646 'OKS_WF_K_PROCESS_PVT.set_notification_attributes(x_return_status= '||
7647 l_return_status||' x_msg_count ='||l_msg_count||')');
7648 END IF;
7649 IF l_return_status <> G_RET_STS_SUCCESS THEN
7650 RAISE FND_API.G_EXC_ERROR;
7651 END IF;
7652 resultout := 'COMPLETE:ERROR';
7653 ELSE
7654 resultout := 'NOTIFIED:';
7655 END IF;
7656
7657 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7658 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7659 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
7660 END IF;
7661 RETURN;
7662 END IF; -- (funcmode = 'RUN')
7663
7664 IF (funcmode = 'CANCEL') THEN
7665 resultout := 'COMPLETE:';
7666 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7667 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7668 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
7669 END IF;
7670 RETURN;
7671 END IF; -- (funcmode = 'CANCEL')
7672
7673 IF (funcmode = 'TIMEOUT') THEN
7674 resultout := 'COMPLETE:';
7675 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7676 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7677 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
7678 END IF;
7679 RETURN;
7680 END IF; -- (funcmode = 'TIMEOUT')
7681 EXCEPTION
7682 WHEN FND_API.G_EXC_ERROR THEN
7683 resultout := 'COMPLETE:ERROR';
7684 l_msg_data := get_fnd_message;
7685 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7686 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
7687 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'Error: Itemtype: '
7688 ||NVL(itemtype,'NULL')||' Itemkey: '||NVL(itemkey,'NULL'));
7689 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,l_msg_data);
7690 END IF;
7691 wf_core.CONTEXT
7692 (
7693 pkg_name => G_PKG_NAME,
7694 proc_name => l_api_name,
7695 arg1 => itemtype,
7696 arg2 => itemkey,
7697 arg3 => l_msg_data
7698 );
7699 WHEN others THEN
7700 resultout := 'COMPLETE:ERROR';
7701 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7702 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
7703 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
7704 ||SQLCODE||', sqlerrm = '||SQLERRM);
7705 END IF;
7706 wf_core.CONTEXT
7707 (
7708 pkg_name => G_PKG_NAME,
7709 proc_name => l_api_name,
7710 arg1 => itemtype,
7711 arg2 => itemkey,
7712 arg3 => to_char(actid),
7713 arg4 => funcmode,
7714 arg5 => SQLCODE,
7715 arg6 => SQLERRM
7716 );
7717 END launch_approval_wf;
7718
7719 /*=========================================================================
7720 API name : accept_quote
7721 Type : Private.
7722 Function : This procedure will complete the workflow activities after
7723 quote has been accepted by Salesrep on behalf of customer
7724 while waiting for salesrep / customer action.
7725 Pre-reqs : None.
7726 Parameters :
7727 IN : p_api_version IN NUMBER Required
7728 Api version
7729 : p_init_msg_list IN VARCHAR2 Required
7730 Initialize message stack parameter
7731 : p_contract_id IN NUMBER Required
7732 Contract header Id
7733 : p_item_key IN VARCHAR2 Required
7734 Contract process workflow's item key.
7735 : p_accept_confirm_yn IN VARCHAR2 Required
7736 Flag to send acceptance confirmation eamil to customer
7737 after quote has been accepted. Valid values are 'Y', 'N'.
7738 OUT : x_return_status OUT VARCHAR2(1)
7739 Api return status
7740 : x_msg_count OUT NUMBER
7741 Count of message on error stack
7742 : x_msg_data OUT VARCHAR2
7743 Actual error messages on error stack
7744 Note :
7745 =========================================================================*/
7746 PROCEDURE accept_quote
7747 (
7748
7749 p_api_version IN NUMBER,
7750 p_init_msg_list IN VARCHAR2,
7751 p_commit IN VARCHAR2 DEFAULT 'F',
7752 p_contract_id IN NUMBER,
7753 p_item_key IN VARCHAR2,
7754 p_accept_confirm_yn IN VARCHAR2,
7755 x_return_status OUT NOCOPY VARCHAR2,
7756 x_msg_data OUT NOCOPY VARCHAR2,
7757 x_msg_count OUT NOCOPY NUMBER
7758 ) IS
7759
7760 l_api_version CONSTANT NUMBER := 1.0;
7761 l_api_name CONSTANT VARCHAR2(30) := 'accept_quote';
7762
7763 l_item_key wf_items.item_key%TYPE;
7764 l_activity_name VARCHAR2(30);
7765 l_email_attr_rec OKS_WF_K_PROCESS_PVT.email_attr_rec;
7766
7767 BEGIN
7768 -- start debug log
7769 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7770 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
7771 'Entered '||G_PKG_NAME ||'.'||l_api_name);
7772 END IF;
7773 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7774 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
7775 'Item key: ' || NVL(p_item_key,'NULL') ||
7776 ' Accept Confirm Flag: ' || p_accept_confirm_yn);
7777 END IF;
7778
7779 DBMS_TRANSACTION.SAVEPOINT(l_api_name);
7780 -- Standard call to check for call compatibility.
7781 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
7782 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7783 END IF;
7784
7785 -- Initialize message list if p_init_msg_list is set to TRUE.
7786 IF FND_API.to_Boolean( p_init_msg_list ) THEN
7787 FND_MSG_PUB.initialize;
7788 END IF;
7789
7790 -- Initialize API return status to success
7791 x_return_status := G_RET_STS_SUCCESS;
7792
7793 IF p_contract_id IS NULL THEN
7794 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_INVD_CONTRACT_ID');
7795 FND_MESSAGE.SET_TOKEN('HDR_ID','NULL');
7796 FND_MSG_PUB.add;
7797 RAISE FND_API.G_EXC_ERROR;
7798 END IF;
7799
7800 IF p_item_key IS NULL THEN
7801 l_item_key := get_wf_item_key(p_contract_id => p_contract_id);
7802 IF l_item_key IS NULL THEN
7803 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INVALID_WF_ITEM_KEY');
7804 FND_MSG_PUB.add;
7805 RAISE FND_API.G_EXC_ERROR;
7806 END IF;
7807 ELSE
7808 l_item_key := p_item_key;
7809 END IF;
7810
7811 -- Check if a confirmation email has to be delivered or not
7812 wf_engine.SetItemAttrText
7813 (
7814 itemtype => G_ITEM_TYPE,
7815 itemkey => l_item_key,
7816 aname => 'SEND_CONFIRM',
7817 avalue => p_accept_confirm_yn
7818 );
7819
7820 IF p_accept_confirm_yn = 'Y' THEN
7821 l_email_attr_rec.CONTRACT_ID := p_contract_id;
7822 l_email_attr_rec.ITEM_KEY := l_item_key;
7823 l_email_attr_rec.EMAIL_TYPE := G_REPORT_TYPE_ACCEPT;
7824 l_email_attr_rec.TO_EMAIL := NULL;
7825 l_email_attr_rec.SENDER_EMAIL := NULL;
7826 l_email_attr_rec.EMAIL_SUBJECT := NULL;
7827 l_email_attr_rec.IH_SUBJECT := NULL;
7828 l_email_attr_rec.IH_MESSAGE := NULL;
7829
7830 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7831 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
7832 'OKS_WF_K_PROCESS_PVT.set_email_attributes('||
7833 ' Contract ID ='||p_contract_id||
7834 ' Email Type ='||l_email_attr_rec.EMAIL_TYPE||')');
7835 END IF;
7836 set_email_attributes
7837 (
7838 p_api_version => l_api_version,
7839 p_init_msg_list => OKC_API.G_FALSE,
7840 p_email_attr => l_email_attr_rec,
7841 x_return_status => x_return_status,
7842 x_msg_data => x_msg_data,
7843 x_msg_count => x_msg_count
7844 );
7845 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7846 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
7847 'OKS_WF_K_PROCESS_PVT.set_email_attributes(x_return_status= '||
7848 x_return_status||' x_msg_count ='||x_msg_count||')');
7849 END IF;
7850 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
7851 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7852 ELSIF x_return_status = G_RET_STS_ERROR THEN
7853 RAISE FND_API.G_EXC_ERROR;
7854 END IF;
7855 END IF;
7856
7857 l_activity_name := get_notified_activity
7858 (
7859 p_item_type => G_ITEM_TYPE
7860 ,p_item_key => l_item_key
7861 );
7862 IF l_activity_name NOT IN (G_SALESREP_ACTION, G_CUST_ACTION) THEN
7863 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INV_SALESREP_ACPT_ACTION');
7864 FND_MSG_PUB.add;
7865 RAISE FND_API.G_EXC_ERROR;
7866 END IF;
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,
7870 'Item key: ' || l_item_key ||
7871 ' Completing activity - Activity Name: ' || l_activity_name);
7872 END IF;
7873
7874 complete_activity
7875 (
7876 p_api_version => l_api_version,
7877 p_init_msg_list => G_FALSE,
7878 p_contract_id => p_contract_id,
7879 p_item_key => l_item_key,
7880 p_resultout => 'SR_ACPTD',
7881 p_process_status => G_NEG_STS_QUOTE_ACPTD,
7882 p_activity_name => l_activity_name,
7883 x_return_status => x_return_status,
7884 x_msg_data => x_msg_data,
7885 x_msg_count => x_msg_count
7886 );
7887 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
7888 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7889 ELSIF x_return_status = G_RET_STS_ERROR THEN
7890 RAISE FND_API.G_EXC_ERROR;
7891 END IF;
7892
7893 IF FND_API.to_boolean( p_commit ) THEN
7894 COMMIT;
7895 END IF;
7896
7897 -- Standard call to get message count and if count is 1, get message info.
7898 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count=>x_msg_count, p_data=>x_msg_data);
7899
7900 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
7901 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7902 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
7903 END IF;
7904
7905 EXCEPTION
7906 WHEN FND_API.G_EXC_ERROR THEN
7907 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
7908 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
7909 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7910 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7911 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_ERROR');
7912 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
7913 END IF;
7914 x_return_status := G_RET_STS_ERROR;
7915 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7916 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
7917 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
7918 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7919 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
7920 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_UNEXPECTED_ERROR');
7921 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
7922 END IF;
7923 x_return_status := G_RET_STS_UNEXP_ERROR ;
7924 WHEN OTHERS THEN
7925 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
7926 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
7927 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
7928 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from OTHERS sqlcode = '
7929 ||SQLCODE||', sqlerrm = '||SQLERRM);
7930 END IF;
7931 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
7932 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
7933 x_return_status := G_RET_STS_UNEXP_ERROR ;
7934 END accept_quote;
7935
7936 /*=========================================================================
7937 API name : cancel_contract
7938 Type : Private.
7939 Function : This procedure will complete the workflow activities after
7940 quote has been declined or contract is cancelled by Salesrep
7941 on behalf of customer while waiting for salesrep/customer action.
7942 Pre-reqs : None.
7943 Parameters :
7944 IN : p_api_version IN NUMBER Required
7945 Api version
7946 : p_init_msg_list IN VARCHAR2 Required
7947 Initialize message stack parameter
7948 : p_contract_id IN NUMBER Required
7949 Contract header Id
7950 : p_item_key IN VARCHAR2 Required
7951 Contract process workflow's item key.
7952 : p_cancellation_reason IN VARCHAR2 Required
7953 Reason code of cancellation reason.
7954 : p_cancellation_date IN VARCHAR2 Required
7955 Date on which contract is cancelled.
7956 : p_cancel_source IN VARCHAR2 Required
7957 Parameter to identify cancellation source. This is
7958 significant in case of Quote To contact declines
7959 the renewal through Online process.
7960 : p_comments IN VARCHAR2 Required
7961 Any comments that were passed while cancelling contract.
7962 OUT : x_return_status OUT VARCHAR2(1)
7963 Api return status
7964 : x_msg_count OUT NUMBER
7965 Count of message on error stack
7966 : x_msg_data OUT VARCHAR2
7967 Actual error messages on error stack
7968 Note :
7969 =========================================================================*/
7970 PROCEDURE cancel_contract
7971 (
7972 p_api_version IN NUMBER,
7973 p_init_msg_list IN VARCHAR2,
7974 p_commit IN VARCHAR2 DEFAULT 'F',
7975 p_contract_id IN NUMBER,
7976 p_item_key IN VARCHAR2,
7977 p_cancellation_reason IN VARCHAR2,
7978 p_cancellation_date IN DATE,
7979 p_cancel_source IN VARCHAR2,
7980 p_comments IN VARCHAR2,
7981 x_return_status OUT NOCOPY VARCHAR2,
7982 x_msg_data OUT NOCOPY VARCHAR2,
7983 x_msg_count OUT NOCOPY NUMBER
7984 ) IS
7985
7986 l_api_version CONSTANT NUMBER := 1.0;
7987 l_api_name CONSTANT VARCHAR2(30) := 'cancel_contract';
7988
7989 l_send_email_yn VARCHAR2(1) := 'N';
7990 l_reason VARCHAR2(250);
7991
7992 l_item_key wf_items.item_key%TYPE;
7993 l_result_out wf_item_activity_statuses.activity_result_code%TYPE;
7994 l_process_status VARCHAR2(30);
7995 l_activity_name VARCHAR2(30);
7996 l_email_attr_rec OKS_WF_K_PROCESS_PVT.email_attr_rec;
7997
7998 BEGIN
7999 -- start debug log
8000 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8001 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
8002 'Entered '||G_PKG_NAME ||'.'||l_api_name);
8003 END IF;
8004 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8005 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
8006 'Item key: ' || NVL(l_item_key,'NULL')||' Cancel source '||p_cancel_source);
8007 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
8008 'Cancellation reason: ' || substr(NVL(p_cancellation_reason,'NULL'),1,1500)
8009 || ' Cancellation date: ' || to_char(p_cancellation_date));
8010 END IF;
8011
8012 DBMS_TRANSACTION.SAVEPOINT(l_api_name);
8013 -- Standard call to check for call compatibility.
8014 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
8015 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8016 END IF;
8017
8018 -- Initialize message list if p_init_msg_list is set to TRUE.
8019 IF FND_API.to_Boolean( p_init_msg_list ) THEN
8020 FND_MSG_PUB.initialize;
8021 END IF;
8022
8023 -- Initialize API return status to success
8024 x_return_status := FND_API.G_RET_STS_SUCCESS;
8025
8026 IF p_contract_id IS NULL THEN
8027 FND_MESSAGE.SET_NAME(G_APP_NAME,'OKS_INVD_CONTRACT_ID');
8028 FND_MESSAGE.SET_TOKEN('HDR_ID','NULL');
8029 FND_MSG_PUB.add;
8030 RAISE FND_API.G_EXC_ERROR;
8031 END IF;
8032
8033 IF p_item_key IS NULL THEN
8034 l_item_key := get_wf_item_key(p_contract_id => p_contract_id);
8035 IF l_item_key IS NULL THEN
8036 FND_MESSAGE.set_name(G_APP_NAME,'OKS_INVALID_WF_ITEM_KEY');
8037 FND_MSG_PUB.add;
8038 RAISE FND_API.G_EXC_ERROR;
8039 END IF;
8040 ELSE
8041 l_item_key := p_item_key;
8042 END IF;
8043 -- Salesrep is cancelling the contract while the contract is in his queue
8044 l_activity_name := get_notified_activity
8045 (
8046 p_item_type => G_ITEM_TYPE
8047 ,p_item_key => l_item_key
8048 );
8049 IF l_activity_name = G_SALESREP_ACTION THEN
8050 l_result_out := 'SR_CNCLD';
8051 l_process_status:= G_NEG_STS_QUOTE_CNCLD;
8052 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8053 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
8054 'Salesrep Cancelling: '||G_PKG_NAME ||'.'||l_api_name);
8055 END IF;
8056 ELSIF l_activity_name = G_CUST_ACTION THEN
8057 -- Customer is decling the quote
8058 IF NVL(p_cancel_source,'!') = G_PERFORMED_BY_CUST THEN
8059 l_result_out := 'DECLINE';
8060 l_process_status:= G_NEG_STS_QUOTE_DECLD;
8061 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8062 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
8063 'Customer Declining: '||G_PKG_NAME ||'.'||l_api_name);
8064 END IF;
8065
8066 -- Salesrep canceling the contract while waiting for customer action.
8067 ELSE
8068 l_result_out := 'SR_CNCLD';
8069 l_process_status:= G_NEG_STS_QUOTE_CNCLD;
8070 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8071 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
8072 'Salesrep Cancelling for Customer: '||G_PKG_NAME ||'.'||l_api_name);
8073 END IF;
8074
8075 -- bug 5845505, send email only if template for the document type is setup
8076 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8077 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
8078 'OKS_WF_K_PROCESS_PVT.is_template_defined('||
8079 ' Contract ID ='||p_contract_id||
8080 ' Document Type ='||G_REPORT_TYPE_CANCEL||')');
8081 END IF;
8082 is_template_defined (
8083 p_api_version => l_api_version,
8084 p_init_msg_list => G_FALSE,
8085 p_contract_id => p_contract_id,
8086 p_document_type => G_REPORT_TYPE_CANCEL,
8087 x_template_defined_yn => l_send_email_yn,
8088 x_email_attr_rec => l_email_attr_rec,
8089 x_return_status => x_return_status,
8090 x_msg_data => x_msg_data,
8091 x_msg_count => x_msg_count
8092 );
8093
8094 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8095 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
8096 'OKS_WF_K_PROCESS_PVT.is_template_defined(x_return_status= '||
8097 x_return_status||' x_msg_count ='||x_msg_count||')');
8098 END IF;
8099 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
8100 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8101 ELSIF x_return_status = G_RET_STS_ERROR THEN
8102 RAISE FND_API.G_EXC_ERROR;
8103 END IF;
8104
8105 wf_engine.SetItemAttrText
8106 (
8107 itemtype => G_ITEM_TYPE,
8108 itemkey => l_item_key,
8109 aname => 'SEND_CONFIRM',
8110 avalue => l_send_email_yn
8111 );
8112
8113 -- get the vendor side cancellation reason as customer side reasons are not
8114 -- accessible to vendor
8115 l_reason := get_lookup_meaning(p_cancellation_reason,G_LKUP_VNDR_CNCL_REASON);
8116
8117 --log interaction (media type WEB FORM) that salesrep has declined the quote
8118 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8119 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
8120 'OKS_WF_K_PROCESS_PVT.set_email_attributes('||
8121 ' Contract ID = '||p_contract_id||
8122 substr(' IH Message = '||p_comments,1,100)||
8123 substr(' IH Subject = '||l_reason||')',1,100));
8124 END IF;
8125 OKS_AUTO_REMINDER.log_interaction (
8126 p_api_version => l_api_version,
8127 p_init_msg_list => G_FALSE,
8128 x_return_status => x_return_status,
8129 x_msg_count => x_msg_count,
8130 x_msg_data => x_msg_data,
8131 p_chr_id => p_contract_id,
8132 p_subject => l_reason,
8133 p_msg_body => p_comments,
8134 p_sent2_email => NULL,
8135 p_media_type => G_MEDIA_TYPE_WEB_FORM
8136 );
8137 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8138 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
8139 'OKS_AUTO_REMINDER.log_interaction(x_return_status= '||
8140 x_return_status||' x_msg_count ='||x_msg_count||')');
8141 END IF;
8142 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
8143 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8144 ELSIF x_return_status = G_RET_STS_ERROR THEN
8145 RAISE FND_API.G_EXC_ERROR;
8146 END IF;
8147 IF NVL(l_send_email_yn,'N') = 'Y' THEN
8148 -- Log interaction and send cancellation confirmation email to customer
8149 l_email_attr_rec.CONTRACT_ID := p_contract_id;
8150 l_email_attr_rec.ITEM_KEY := l_item_key;
8151 l_email_attr_rec.EMAIL_TYPE := G_REPORT_TYPE_CANCEL;
8152 l_email_attr_rec.TO_EMAIL := NULL;
8153 l_email_attr_rec.SENDER_EMAIL := NULL;
8154
8155 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8156 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
8157 'OKS_WF_K_PROCESS_PVT.set_email_attributes('||
8158 ' Contract ID ='||p_contract_id||
8159 ' Email Type ='||l_email_attr_rec.EMAIL_TYPE||')');
8160 END IF;
8161 set_email_attributes
8162 (
8163 p_api_version => l_api_version,
8164 p_init_msg_list => OKC_API.G_FALSE,
8165 p_email_attr => l_email_attr_rec,
8166 x_return_status => x_return_status,
8167 x_msg_data => x_msg_data,
8168 x_msg_count => x_msg_count
8169 );
8170 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8171 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
8172 'OKS_WF_K_PROCESS_PVT.set_email_attributes(x_return_status= '||
8173 x_return_status||' x_msg_count ='||x_msg_count||')');
8174 END IF;
8175 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
8176 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8177 ELSIF x_return_status = G_RET_STS_ERROR THEN
8178 RAISE FND_API.G_EXC_ERROR;
8179 END IF;
8180 END IF;
8181 END IF;
8182 ELSE
8183
8184 -- MKS 10/12/2005 Bug#4643300: Need to stamp even for non salesrep/customer nodes.
8185
8186 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8187 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
8188 'Aborting Process and Updating Contract '||G_PKG_NAME ||'.'||l_api_name);
8189 END IF;
8190 UPDATE oks_k_headers_b
8191 SET renewal_status = G_NEG_STS_QUOTE_CNCLD,
8192 accepted_by = NULL,
8193 date_accepted = NULL,
8194 object_version_number = object_version_number + 1,
8195 last_update_date = SYSDATE,
8196 last_updated_by = FND_GLOBAL.USER_ID,
8197 last_update_login = FND_GLOBAL.LOGIN_ID
8198 WHERE chr_id = p_contract_id;
8199 wf_engine.AbortProcess (G_ITEM_TYPE, l_item_key);
8200 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8201 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
8202 'Updated Contract and Process Aborted '||G_PKG_NAME ||'.'||l_api_name);
8203 END IF;
8204 END IF;
8205
8206 IF l_activity_name IN (G_SALESREP_ACTION, G_CUST_ACTION) THEN
8207 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8208 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
8209 'OKS_WF_K_PROCESS_PVT.complete_activity(p_contract_id= '||
8210 p_contract_id||' p_resultout ='||l_result_out||
8211 ' p_process_status ='||l_process_status||
8212 ' p_activity_name ='||l_activity_name||')');
8213 END IF;
8214 complete_activity
8215 (
8216 p_api_version => 1.0,
8217 p_init_msg_list => G_FALSE,
8218 p_contract_id => p_contract_id,
8219 p_item_key => l_item_key,
8220 p_resultout => l_result_out,
8221 p_process_status => l_process_status,
8222 p_activity_name => l_activity_name,
8223 x_return_status => x_return_status,
8224 x_msg_count => x_msg_count,
8225 x_msg_data => x_msg_data
8226 ) ;
8227 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8228 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
8229 'OKS_WF_K_PROCESS_PVT.complete_activity(x_return_status= '||
8230 x_return_status||' x_msg_count ='||x_msg_count||')');
8231 END IF;
8232 IF x_return_status = G_RET_STS_UNEXP_ERROR THEN
8233 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8234 ELSIF x_return_status = G_RET_STS_ERROR THEN
8235 RAISE FND_API.G_EXC_ERROR;
8236 END IF;
8237 END IF;
8238
8239 IF FND_API.to_boolean( p_commit ) THEN
8240 COMMIT;
8241 END IF;
8242
8243 -- Standard call to get message count and if count is 1, get message info.
8244 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count=>x_msg_count, p_data=>x_msg_data);
8245
8246 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8247 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
8248 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
8249 END IF;
8250
8251 EXCEPTION
8252 WHEN FND_API.G_EXC_ERROR THEN
8253 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
8254 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8255 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
8256 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_ERROR');
8257 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
8258 END IF;
8259 x_return_status := G_RET_STS_ERROR;
8260 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
8261 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
8262 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8263 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
8264 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from G_EXC_UNEXPECTED_ERROR');
8265 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,get_fnd_message);
8266 END IF;
8267 x_return_status := G_RET_STS_UNEXP_ERROR ;
8268 WHEN OTHERS THEN
8269 DBMS_TRANSACTION.ROLLBACK_SAVEPOINT(l_api_name);
8270 IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
8271 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,
8272 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from OTHERS sqlcode = '
8273 ||SQLCODE||', sqlerrm = '||SQLERRM);
8274 END IF;
8275 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
8276 FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
8277 x_return_status := G_RET_STS_UNEXP_ERROR ;
8278 END cancel_contract;
8279
8280 /*=========================================================================
8281 API name : activate_contract
8282 Type : Private.
8283 Function : This procedure will approve and sign the contract.
8284 Pre-reqs : None.
8285 Parameters :
8286 IN : itemtype IN VARCHAR2 Required
8287 Workflow item type parameter
8288 : itemkey IN VARCHAR2 Required
8289 Workflow item key parameter
8290 : actid IN VARCHAR2 Required
8291 Workflow actid parameter
8292 : funcmode IN VARCHAR2 Required
8293 Workflow function mode parameter
8294 OUT : resultout OUT VARCHAR2(1)
8295 Workflow standard out parameter
8296 Note :
8297 =========================================================================*/
8298 PROCEDURE activate_contract
8299 (
8300 itemtype IN VARCHAR2,
8301 itemkey IN VARCHAR2,
8302 actid IN NUMBER,
8303 funcmode IN VARCHAR2,
8304 resultout OUT nocopy VARCHAR2
8305 ) IS
8306
8307 l_api_name CONSTANT VARCHAR2(50) := 'activate_contract';
8308 l_api_version CONSTANT NUMBER := 1.0;
8309 l_return_status VARCHAR2(1) := G_RET_STS_SUCCESS;
8310 l_msg_count NUMBER;
8311 l_msg_data VARCHAR2(2000);
8312
8313 l_contract_id NUMBER;
8314 l_notif_attr_rec OKS_WF_K_PROCESS_PVT.notif_attr_rec;
8315
8316 BEGIN
8317
8318 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8319 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,
8320 'Entered '||G_PKG_NAME ||'.'||l_api_name);
8321 END IF;
8322
8323 IF FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8324 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
8325 'itemtype: ' || itemtype ||
8326 ' itemkey: ' || itemkey ||
8327 ' actid: ' || to_char(actid) ||
8328 ' funcmode: ' || funcmode);
8329 END IF;
8330 IF (funcmode = 'RUN') THEN
8331
8332 l_contract_id := wf_engine.GetItemAttrNumber(
8333 itemtype => itemtype,
8334 itemkey => itemkey,
8335 aname => 'CONTRACT_ID');
8336
8337 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8338 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
8339 'OKC_CONTRACT_APPROVAL_PUB.k_approved(p_contract_id= '||l_contract_id||')');
8340 END IF;
8341 -- update the date approved of the contract
8342 OKC_CONTRACT_APPROVAL_PUB.k_approved
8343 (
8344 p_contract_id => l_contract_id,
8345 x_return_status => l_return_status
8346 );
8347 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8348 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
8349 'OKC_CONTRACT_APPROVAL_PUB.k_approved(x_return_status= '||l_return_status||')');
8350 END IF;
8351 IF l_return_status <> G_RET_STS_SUCCESS THEN
8352 update_negotiation_status
8353 (
8354 p_api_version => l_api_version,
8355 p_init_msg_list => G_FALSE,
8356 p_chr_id => l_contract_id,
8357 p_negotiation_status => G_NEG_STS_IA_FAIL,
8358 x_return_status => l_return_status,
8359 x_msg_count => l_msg_count,
8360 x_msg_data => l_msg_data
8361 );
8362 IF l_return_status <> G_RET_STS_SUCCESS THEN
8363 RAISE FND_API.G_EXC_ERROR;
8364 END IF;
8365
8366 -- In case of errors, set wf attributes that'll be used by the notification
8367 -- and will be rendered by OAF embedded region.
8368 l_notif_attr_rec.CONTRACT_ID := l_contract_id;
8369 l_notif_attr_rec.ITEM_KEY := itemkey;
8370 l_notif_attr_rec.PERFORMER := NULL;
8371 l_notif_attr_rec.NTF_TYPE := G_NTF_TYPE_ERROR;
8372 l_notif_attr_rec.NTF_SUBJECT := NULL;
8373 l_notif_attr_rec.SUBJECT := get_lookup_meaning(G_NEG_STS_IA_FAIL,G_LKUP_TYPE_NEGO_STATUS);
8374 l_notif_attr_rec.ACCEPT_DECLINE_BY := NULL;
8375 l_notif_attr_rec.MSGS_FROM_STACK_YN:= 'Y';
8376
8377 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8378 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
8379 'OKS_WF_K_PROCESS_PVT.set_notification_attributes('||
8380 ' Contract ID ='||l_contract_id||
8381 ' Notification Type ='||l_notif_attr_rec.NTF_TYPE||
8382 ' Subject ='||l_notif_attr_rec.NTF_SUBJECT||')');
8383 END IF;
8384 set_notification_attributes
8385 (
8386 p_api_version => l_api_version,
8387 p_init_msg_list => OKC_API.G_FALSE,
8388 p_notif_attr => l_notif_attr_rec,
8389 x_return_status => l_return_status,
8390 x_msg_data => l_msg_data,
8391 x_msg_count => l_msg_count
8392 );
8393 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8394 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
8395 'OKS_WF_K_PROCESS_PVT.set_notification_attributes(x_return_status= '||
8396 l_return_status||' x_msg_count ='||l_msg_count||')');
8397 END IF;
8398 RAISE FND_API.G_EXC_ERROR;
8399 END IF;
8400
8401 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8402 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
8403 'OKC_CONTRACT_APPROVAL_PUB.k_signed(p_contract_id= '||l_contract_id||')');
8404 END IF;
8405 -- sign the contract
8406 OKC_CONTRACT_APPROVAL_PUB.k_signed
8407 (
8408 p_contract_id => l_contract_id,
8409 p_complete_k_prcs => 'N',
8410 x_return_status => l_return_status
8411 );
8412 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8413 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
8414 'OKC_CONTRACT_APPROVAL_PUB.k_signed(x_return_status= '||l_return_status||')');
8415 END IF;
8416 IF l_return_status <> G_RET_STS_SUCCESS THEN
8417 update_negotiation_status
8418 (
8419 p_api_version => l_api_version,
8420 p_init_msg_list => G_FALSE,
8421 p_chr_id => l_contract_id,
8422 p_negotiation_status => G_NEG_STS_IA_FAIL,
8423 x_return_status => l_return_status,
8424 x_msg_count => l_msg_count,
8425 x_msg_data => l_msg_data
8426 );
8427 IF l_return_status <> G_RET_STS_SUCCESS THEN
8428 RAISE FND_API.G_EXC_ERROR;
8429 END IF;
8430
8431 -- In case of errors, set wf attributes that'll be used by the notification
8432 -- and will be rendered by OAF embedded region.
8433 l_notif_attr_rec.CONTRACT_ID := l_contract_id;
8434 l_notif_attr_rec.ITEM_KEY := itemkey;
8435 l_notif_attr_rec.PERFORMER := NULL;
8436 l_notif_attr_rec.NTF_TYPE := G_NTF_TYPE_ERROR;
8437 l_notif_attr_rec.NTF_SUBJECT := NULL;
8438 l_notif_attr_rec.SUBJECT := get_lookup_meaning(G_NEG_STS_IA_FAIL,G_LKUP_TYPE_NEGO_STATUS);
8439 l_notif_attr_rec.ACCEPT_DECLINE_BY := NULL;
8440 l_notif_attr_rec.MSGS_FROM_STACK_YN:= 'Y';
8441
8442 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8443 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.before',
8444 'OKS_WF_K_PROCESS_PVT.set_notification_attributes('||
8445 ' Contract ID ='||l_contract_id||
8446 ' Notification Type ='||l_notif_attr_rec.NTF_TYPE||
8447 ' Subject ='||l_notif_attr_rec.NTF_SUBJECT||')');
8448 END IF;
8449 set_notification_attributes
8450 (
8451 p_api_version => l_api_version,
8452 p_init_msg_list => OKC_API.G_FALSE,
8453 p_notif_attr => l_notif_attr_rec,
8454 x_return_status => l_return_status,
8455 x_msg_data => l_msg_data,
8456 x_msg_count => l_msg_count
8457 );
8458 IF FND_LOG.LEVEL_EVENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8459 fnd_log.string(FND_LOG.LEVEL_EVENT,G_MODULE||l_api_name||'.external_call.after',
8460 'OKS_WF_K_PROCESS_PVT.set_notification_attributes(x_return_status= '||
8461 l_return_status||' x_msg_count ='||l_msg_count||')');
8462 END IF;
8463 RAISE FND_API.G_EXC_ERROR;
8464 END IF;
8465
8466 resultout := 'COMPLETE:T';
8467 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8468 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
8469 'Leaving '||G_PKG_NAME ||'.'||l_api_name);
8470 END IF;
8471 RETURN;
8472 END IF; -- (funcmode = 'RUN')
8473
8474 IF (funcmode = 'CANCEL') THEN
8475 resultout := 'COMPLETE:';
8476 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8477 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
8478 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=CANCEL');
8479 END IF;
8480 RETURN;
8481 END IF; -- (funcmode = 'CANCEL')
8482
8483 IF (funcmode = 'TIMEOUT') THEN
8484 resultout := 'COMPLETE:';
8485 IF FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8486 fnd_log.string(FND_LOG.LEVEL_PROCEDURE,G_MODULE||l_api_name,
8487 'Leaving '||G_PKG_NAME ||'.'||l_api_name||' from funcmode=TIMEOUT');
8488 END IF;
8489 RETURN;
8490 END IF; -- (funcmode = 'TIMEOUT')
8491 EXCEPTION
8492 WHEN FND_API.G_EXC_ERROR THEN
8493 resultout := 'COMPLETE:F';
8494 l_msg_data := get_fnd_message;
8495 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8496 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
8497 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'Error: Itemtype: '
8498 ||NVL(itemtype,'NULL')||' Itemkey: '||NVL(itemkey,'NULL'));
8499 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,l_msg_data);
8500 END IF;
8501 wf_core.CONTEXT
8502 (
8503 pkg_name => G_PKG_NAME,
8504 proc_name => l_api_name,
8505 arg1 => itemtype,
8506 arg2 => itemkey,
8507 arg3 => l_msg_data
8508 );
8509 WHEN others THEN
8510 resultout := 'COMPLETE:F';
8511 l_msg_data := get_fnd_message;
8512 IF FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
8513 fnd_log.string(FND_LOG.LEVEL_EXCEPTION,G_MODULE||l_api_name,
8514 'Leaving '||G_PKG_NAME ||'.'||l_api_name||'.Others sqlcode = '
8515 ||SQLCODE||', sqlerrm = '||SQLERRM);
8516 END IF;
8517 wf_core.CONTEXT
8518 (
8519 pkg_name => G_PKG_NAME,
8520 proc_name => l_api_name,
8521 arg1 => itemtype,
8522 arg2 => itemkey,
8523 arg3 => to_char(actid),
8524 arg4 => funcmode,
8525 arg5 => SQLCODE,
8526 arg6 => SQLERRM
8527 );
8528 END activate_contract;
8529
8530 /*
8531 This procedure is a concurrent program, that launches wf for all
8532 ENTERED status contracts, that do not have a workflow associated with them
8533 and have not been submitted for approval.
8534 */
8535 PROCEDURE launch_wf_conc_prog
8536 (
8537 ERRBUF OUT NOCOPY VARCHAR2,
8538 RETCODE OUT NOCOPY NUMBER
8539 )
8540 IS
8541
8542 -- The following cursor will pick up all contracts which are in ENTERED status
8543 -- without any existing active renewal/process workflow (obviously !!!)
8544 -- and not been submitted for approval
8545 CURSOR c_old_k IS
8546 SELECT oksk.CHR_ID CHR_ID,
8547 nvl(oksk.RENEWAL_TYPE_USED, G_RENEW_TYPE_MANUAL) RENEWAL_TYPE_USED,
8548 nvl(oksk.APPROVAL_TYPE_USED, G_IRR_FLAG_REQD) APPROVAL_TYPE_USED,
8549 okck.CONTRACT_NUMBER CONTRACT_NUMBER,
8550 nvl(okck.CONTRACT_NUMBER_MODIFIER, FND_API.G_MISS_CHAR) CONTRACT_NUMBER_MODIFIER,
8551 nvl(oksk.RENEWAL_STATUS, G_NEG_STS_DRAFT) RENEWAL_STATUS
8552 FROM OKS_K_HEADERS_B oksk,
8553 OKC_K_HEADERS_ALL_B okck,
8554 OKC_STATUSES_B sts
8555 WHERE oksk.chr_id = okck.id
8556 AND sts.ste_code = 'ENTERED'
8557 AND sts.code = okck.sts_code
8558 AND okck.template_yn = 'N'
8559 --no active approval workflow exists
8560 AND NOT EXISTS
8561 (SELECT 1
8562 FROM WF_ITEMS WF,
8563 OKC_PROCESS_DEFS_B KPDF
8564 WHERE WF.item_key = okck.contract_number || okck.contract_number_modifier
8565 AND WF.end_date IS NULL
8566 AND WF.item_type = KPDF.wf_name
8567 AND KPDF.pdf_type = 'WPS')
8568 --for an ENTERED status contract, no active base workflow exists
8569 AND NOT EXISTS
8570 (SELECT 1
8571 FROM WF_ITEMS WF
8572 WHERE WF.item_key = oksk.wf_item_key
8573 AND WF.end_date IS NULL
8574 AND WF.item_type = G_ITEM_TYPE);
8575
8576 TYPE k_rec_tbl_type IS TABLE OF c_old_k%ROWTYPE INDEX BY BINARY_INTEGER;
8577
8578 l_return_status VARCHAR2(1) := 'S';
8579 l_msg_count NUMBER;
8580 l_msg_data VARCHAR2(2000);
8581
8582 l_k_rec_tbl k_rec_tbl_type;
8583 l_wf_attributes_tbl WF_ATTR_DETAILS_TBL;
8584
8585 l_rollcount NUMBER := 0;
8586 l_wfcount NUMBER := 0;
8587 l_errcount NUMBER := 0;
8588
8589 BEGIN
8590 retcode := 0; --0 for success, 1 for warning, 2 for error
8591
8592 FND_FILE.PUT_LINE(FND_FILE.LOG,'Starting Concurrent Program, time: '|| to_char(sysdate, 'DD-MON-YYYY HH24:MI:SS'));
8593 OPEN c_old_k;
8594 LOOP
8595
8596 FETCH c_old_k BULK COLLECT INTO l_k_rec_tbl LIMIT 1000;
8597 FND_FILE.PUT_LINE(FND_FILE.LOG,'Bulk fetched '||l_k_rec_tbl.COUNT ||' rows');
8598
8599 EXIT WHEN (l_k_rec_tbl.COUNT = 0);
8600 l_rollcount := l_rollcount + l_k_rec_tbl.COUNT;
8601
8602 FND_FILE.PUT_LINE(FND_FILE.LOG,'Launching Workflow ');
8603
8604 FOR i IN l_k_rec_tbl.FIRST..l_k_rec_tbl.LAST LOOP
8605 l_wf_attributes_tbl(i).CONTRACT_ID := l_k_rec_tbl(i).chr_id;
8606 l_wf_attributes_tbl(i).CONTRACT_NUMBER := l_k_rec_tbl(i).contract_number;
8607 IF (l_k_rec_tbl(i).contract_number_modifier = FND_API.G_MISS_CHAR) THEN
8608 l_wf_attributes_tbl(i).CONTRACT_MODIFIER := NULL;
8609 ELSE
8610 l_wf_attributes_tbl(i).CONTRACT_MODIFIER := l_k_rec_tbl(i).contract_number_modifier;
8611 END IF;
8612 l_wf_attributes_tbl(i).PROCESS_TYPE := l_k_rec_tbl(i).renewal_type_used;
8613 l_wf_attributes_tbl(i).IRR_FLAG := l_k_rec_tbl(i).approval_type_used;
8614 l_wf_attributes_tbl(i).NEGOTIATION_STATUS := l_k_rec_tbl(i).renewal_status;
8615 END LOOP;
8616
8617 l_return_status := 'S';
8618
8619 --if any errors happen, this procedure will roll it back for all the records passed in
8620 launch_k_process_wf_blk(
8621 p_api_version => 1.0,
8622 p_init_msg_list => FND_API.G_TRUE,
8623 p_commit => FND_API.G_FALSE,
8624 p_wf_attributes_tbl => l_wf_attributes_tbl,
8625 p_update_item_key => 'Y',
8626 x_return_status => l_return_status,
8627 x_msg_count => l_msg_count,
8628 x_msg_data => l_msg_data);
8629
8630 --if unexpected error happens - we abort, for other errors we will
8631 --try the next batch
8632 IF l_return_status = FND_API.g_ret_sts_unexp_error THEN
8633 l_errcount := l_errcount + l_k_rec_tbl.COUNT;
8634 FOR j IN 1..l_msg_count LOOP
8635 FND_FILE.PUT_LINE(FND_FILE.LOG, FND_MSG_PUB.get(j, 'F'));
8636 END LOOP;
8637 RAISE FND_API.g_exc_unexpected_error;
8638 ELSIF l_return_status = FND_API.g_ret_sts_error THEN
8639 --just log the error and continue
8640 l_errcount := l_errcount + l_k_rec_tbl.COUNT;
8641 retcode := 1;
8642 FOR j IN 1..l_msg_count LOOP
8643 FND_FILE.PUT_LINE(FND_FILE.LOG, FND_MSG_PUB.get(j, 'F'));
8644 END LOOP;
8645 ELSE
8646 l_wfcount := l_wfcount + l_k_rec_tbl.COUNT;
8647 END IF;
8648
8649 --delete for the the next loop
8650 l_wf_attributes_tbl.DELETE;
8651 COMMIT;
8652 FND_FILE.PUT_LINE(FND_FILE.LOG,'Rows processed so far: ' || l_rollcount);
8653 FND_FILE.PUT_LINE(FND_FILE.LOG,'Rows errored so far: ' || l_errcount);
8654 FND_FILE.PUT_LINE(FND_FILE.LOG,'Rows successful so far: '|| l_wfcount);
8655
8656
8657 END LOOP; -- main cursor loop
8658 CLOSE c_old_k;
8659
8660 FND_FILE.PUT_LINE(FND_FILE.LOG,'Total Rows processed: '|| l_rollcount);
8661 FND_FILE.PUT_LINE(FND_FILE.LOG,'Total Rows errored: '|| l_errcount);
8662 FND_FILE.PUT_LINE(FND_FILE.LOG,'Total Rows succesful: '|| l_wfcount);
8663
8664 FND_FILE.PUT_LINE(FND_FILE.LOG,'End Concurrent Program - Success, time: '|| to_char(sysdate, 'DD-MON-YYYY HH24:MI:SS')||' ,retcode='||retcode);
8665
8666 EXCEPTION
8667 WHEN OTHERS THEN
8668 retcode := 2;
8669 IF (c_old_k%isopen) THEN
8670 CLOSE c_old_k;
8671 END IF;
8672 errbuf := sqlcode||sqlerrm;
8673 FND_FILE.PUT_LINE(FND_FILE.LOG,'End Concurrent Program - Error, time: '|| to_char(sysdate, 'DD-MON-YYYY HH24:MI:SS')||' ,retcode='||retcode);
8674
8675 END launch_wf_conc_prog;
8676
8677
8678 /* Bulk API for launching wf for ENTERED status Service Contracts
8679 This procedure launches the workflow for a Service Contract. From R12 onwards every
8680 Service Contract when created has a workflow associated with it, that routes the
8681 contract till it is activated.
8682
8683 Parameters
8684 p_wf_attributes_tbl : table of records containg the details of the workflow to be
8685 launched
8686 p_update_item_key : Y|N indicating if oks_k_headers_b and oks_k_headers_bh are to be
8687 updated with the passed item keys
8688
8689 Rules for input record fiels
8690 1. Contract_id must be passed, if not passed the record is ignored
8691 2. Contract number and modifier must be passed, they are set as item attributes for the
8692 workflow
8693 3. Process_type and irr_flag are optional, they are stamped as workflow item
8694 attributes. Defaulted as - procees_type = NSR and irr_flag = Y
8695 4. Negotiation_status is optional, if NULL or PREDRAFT, it is defaulted as DRAFT. It is
8696 stamped as workflow item attribute.
8697 5. Item_key is optional, if not passed it is defaulted as
8698 contract_id || to_char(sysdate, 'YYYYMMDDHH24MISS').
8699
8700 */
8701 PROCEDURE launch_k_process_wf_blk
8702 (
8703 p_api_version IN NUMBER DEFAULT 1.0,
8704 p_init_msg_list IN VARCHAR2 DEFAULT 'F',
8705 p_commit IN VARCHAR2 DEFAULT 'F',
8706 p_wf_attributes_tbl IN WF_ATTR_DETAILS_TBL,
8707 p_update_item_key IN VARCHAR2 DEFAULT 'Y',
8708 x_return_status OUT NOCOPY VARCHAR2,
8709 x_msg_count OUT NOCOPY NUMBER,
8710 x_msg_data OUT NOCOPY VARCHAR2
8711 )
8712 IS
8713 l_api_name CONSTANT VARCHAR2(30) := 'launch_k_process_wf_blk';
8714 l_api_version CONSTANT NUMBER := 1;
8715 l_mod_name VARCHAR2(256) := G_MODULE || l_api_name;
8716 l_error_text VARCHAR2(512);
8717
8718 l_wf_err_name VARCHAR2(30);
8719 l_wf_err_msg VARCHAR2(2000);
8720 l_wf_err_stack VARCHAR2(4000);
8721
8722 l_item_keys WF_ENGINE_BULK.itemkeytabtype;
8723 l_user_keys WF_ENGINE_BULK.userkeytabtype;
8724 l_owner_roles WF_ENGINE_BULK.ownerroletabtype;
8725
8726 l_contract_id_names WF_ENGINE.nametabtyp;
8727 l_contract_number_names WF_ENGINE.nametabtyp;
8728 l_contract_modifier_names WF_ENGINE.nametabtyp;
8729 l_process_type_names WF_ENGINE.nametabtyp;
8730 l_irr_flag_names WF_ENGINE.nametabtyp;
8731 l_neg_status_names WF_ENGINE.nametabtyp;
8732 l_user_id_names WF_ENGINE.nametabtyp;
8733 l_responsibility_id_names WF_ENGINE.nametabtyp;
8734 l_resp_appl_id_names WF_ENGINE.nametabtyp;
8735 l_security_group_id_names WF_ENGINE.nametabtyp;
8736
8737 l_contract_id_values WF_ENGINE.numtabtyp;
8738 l_contract_number_values WF_ENGINE.texttabtyp;
8739 l_contract_modifier_values WF_ENGINE.texttabtyp;
8740 l_process_type_values WF_ENGINE.texttabtyp;
8741 l_irr_flag_values WF_ENGINE.texttabtyp;
8742 l_neg_status_values WF_ENGINE.texttabtyp;
8743 l_user_id_values WF_ENGINE.numtabtyp;
8744 l_responsibility_id_values WF_ENGINE.numtabtyp;
8745 l_resp_appl_id_values WF_ENGINE.numtabtyp;
8746 l_security_group_id_values WF_ENGINE.numtabtyp;
8747
8748 l_contract_id_count NUMBER := 0;
8749 l_date DATE := sysdate;
8750
8751 BEGIN
8752 --log key input parameters
8753 IF (FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level) THEN
8754 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);
8755 END IF;
8756
8757 --standard api initilization and checks
8758 SAVEPOINT launch_k_process_wf_blk_PVT;
8759 IF NOT FND_API.compatible_api_call (l_api_version, p_api_version, l_api_name, G_PKG_NAME)THEN
8760 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8761 END IF;
8762 IF FND_API.to_boolean(p_init_msg_list ) THEN
8763 FND_MSG_PUB.initialize;
8764 END IF;
8765 x_return_status := FND_API.G_RET_STS_SUCCESS;
8766
8767 IF (p_wf_attributes_tbl.count = 0 ) THEN
8768 RETURN;
8769 END IF;
8770
8771 FOR i IN p_wf_attributes_tbl.FIRST..p_wf_attributes_tbl.LAST LOOP
8772 IF (p_wf_attributes_tbl(i).contract_id IS NOT NULL) THEN
8773
8774 l_contract_id_count := l_contract_id_count + 1;
8775
8776 l_item_keys(l_contract_id_count) := nvl(p_wf_attributes_tbl(i).item_key,
8777 p_wf_attributes_tbl(i).contract_id ||to_char(l_date, 'YYYYMMDDHH24MISS'));
8778
8779 l_user_keys(l_contract_id_count) := p_wf_attributes_tbl(i).contract_number;
8780 IF (p_wf_attributes_tbl(i).contract_modifier IS NOT NULL) THEN
8781 l_user_keys(l_contract_id_count) := l_user_keys(l_contract_id_count) || ' ' ||
8782 p_wf_attributes_tbl(i).contract_modifier;
8783 END IF;
8784
8785 --setting it to null, ideally we should set it to contract salesrep,
8786 --but since it is expensive we can defer it to later in the Workflow
8787 l_owner_roles(l_contract_id_count) := NULL;
8788
8789 l_contract_id_names(l_contract_id_count) := 'CONTRACT_ID';
8790 l_contract_id_values(l_contract_id_count) := p_wf_attributes_tbl(i).contract_id;
8791
8792 l_contract_number_names(l_contract_id_count) := 'CONTRACT_NUMBER';
8793 l_contract_number_values(l_contract_id_count) := p_wf_attributes_tbl(i).contract_number;
8794
8795 l_contract_modifier_names(l_contract_id_count) := 'CONTRACT_MODIFIER';
8796 l_contract_modifier_values(l_contract_id_count) :=
8797 p_wf_attributes_tbl(i).contract_modifier;
8798
8799 l_process_type_names(l_contract_id_count) := 'PROCESS_TYPE';
8800 l_process_type_values(l_contract_id_count) := nvl(p_wf_attributes_tbl(i).process_type,G_RENEW_TYPE_MANUAL);
8801
8802 l_irr_flag_names(l_contract_id_count) := 'IRR_FLAG';
8803 l_irr_flag_values(l_contract_id_count) := nvl(p_wf_attributes_tbl(i).irr_flag, G_IRR_FLAG_REQD);
8804
8805 l_user_id_names(l_contract_id_count) := 'USER_ID';
8806 l_user_id_values(l_contract_id_count) := fnd_global.user_id;
8807
8808 l_responsibility_id_names(l_contract_id_count) := 'RESP_ID';
8809 l_responsibility_id_values(l_contract_id_count) := fnd_global.resp_id;
8810
8811 l_resp_appl_id_names(l_contract_id_count) := 'RESP_APPL_ID';
8812 l_resp_appl_id_values(l_contract_id_count) := fnd_global.resp_appl_id;
8813
8814 l_security_group_id_names(l_contract_id_count) := 'SECURITY_GROUP_ID';
8815 l_security_group_id_values(l_contract_id_count) := fnd_global.security_group_id;
8816
8817 l_neg_status_names(l_contract_id_count) := 'NEGOTIATION_STATUS';
8818 IF (p_wf_attributes_tbl(i).negotiation_status IS NULL OR
8819 p_wf_attributes_tbl(i).negotiation_status = G_NEG_STS_PRE_DRAFT) THEN
8820 l_neg_status_values(l_contract_id_count) := G_NEG_STS_DRAFT;
8821 ELSE
8822 l_neg_status_values(l_contract_id_count) := p_wf_attributes_tbl(i).negotiation_status;
8823 END IF;
8824
8825 END IF;
8826 END LOOP;
8827
8828 IF (l_contract_id_count > 0) THEN
8829
8830 IF (FND_LOG.level_statement >= FND_LOG.g_current_runtime_level) THEN
8831 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');
8832 END IF;
8833
8834 WF_ENGINE_BULK.createprocess(
8835 itemtype => G_ITEM_TYPE,
8836 itemkeys => l_item_keys,
8837 process => G_MAIN_PROCESS,
8838 user_keys => l_user_keys,
8839 owner_roles => l_owner_roles);
8840
8841 WF_ENGINE_BULK.setitemattrnumber(
8842 itemtype => G_ITEM_TYPE,
8843 itemkeys => l_item_keys,
8844 anames => l_contract_id_names,
8845 avalues => l_contract_id_values);
8846
8847 WF_ENGINE_BULK.setitemattrtext(
8848 itemtype => G_ITEM_TYPE,
8849 itemkeys => l_item_keys,
8850 anames => l_contract_number_names,
8851 avalues => l_contract_number_values);
8852
8853 WF_ENGINE_BULK.setitemattrtext(
8854 itemtype => G_ITEM_TYPE,
8855 itemkeys => l_item_keys,
8856 anames => l_contract_modifier_names,
8857 avalues => l_contract_modifier_values);
8858
8859 WF_ENGINE_BULK.setitemattrtext(
8860 itemtype => G_ITEM_TYPE,
8861 itemkeys => l_item_keys,
8862 anames => l_process_type_names,
8863 avalues => l_process_type_values);
8864
8865 WF_ENGINE_BULK.setitemattrtext(
8866 itemtype => G_ITEM_TYPE,
8867 itemkeys => l_item_keys,
8868 anames => l_irr_flag_names,
8869 avalues => l_irr_flag_values);
8870
8871 WF_ENGINE_BULK.setitemattrtext(
8872 itemtype => G_ITEM_TYPE,
8873 itemkeys => l_item_keys,
8874 anames => l_neg_status_names,
8875 avalues => l_neg_status_values);
8876
8877 WF_ENGINE_BULK.setitemattrnumber(
8878 itemtype => G_ITEM_TYPE,
8879 itemkeys => l_item_keys,
8880 anames => l_user_id_names,
8881 avalues => l_user_id_values);
8882
8883 WF_ENGINE_BULK.setitemattrnumber(
8884 itemtype => G_ITEM_TYPE,
8885 itemkeys => l_item_keys,
8886 anames => l_responsibility_id_names,
8887 avalues => l_responsibility_id_values);
8888
8889 WF_ENGINE_BULK.setitemattrnumber(
8890 itemtype => G_ITEM_TYPE,
8891 itemkeys => l_item_keys,
8892 anames => l_resp_appl_id_names,
8893 avalues => l_resp_appl_id_values);
8894
8895 WF_ENGINE_BULK.setitemattrnumber(
8896 itemtype => G_ITEM_TYPE,
8897 itemkeys => l_item_keys,
8898 anames => l_security_group_id_names,
8899 avalues => l_security_group_id_values);
8900
8901 IF (FND_LOG.level_statement >= FND_LOG.g_current_runtime_level) THEN
8902 FND_LOG.string(FND_LOG.level_statement, l_mod_name || '.bulk_wf', ',calling WF_ENGINE_BULK.startprocess');
8903 END IF;
8904
8905 WF_ENGINE_BULK.startprocess(
8906 itemtype => G_ITEM_TYPE,
8907 itemkeys => l_item_keys);
8908
8909 IF ( nvl(p_update_item_key, 'N') = 'Y' ) THEN
8910
8911 IF (FND_LOG.level_statement >= FND_LOG.g_current_runtime_level) THEN
8912 FND_LOG.string(FND_LOG.level_statement, l_mod_name || '.update', ',upating oks_k_headers_b');
8913 END IF;
8914
8915 FORALL i IN l_contract_id_values.FIRST..l_contract_id_values.LAST
8916 UPDATE oks_k_headers_b
8917 SET wf_item_key = l_item_keys(i),
8918 renewal_status = nvl(renewal_status,G_NEG_STS_DRAFT),
8919 object_version_number = object_version_number + 1,
8920 last_update_date = SYSDATE,
8921 last_updated_by = FND_GLOBAL.USER_ID,
8922 last_update_login = FND_GLOBAL.LOGIN_ID
8923 WHERE chr_id = l_contract_id_values(i);
8924
8925 FORALL i IN l_contract_id_values.FIRST..l_contract_id_values.LAST
8926 UPDATE oks_k_headers_bh
8927 SET wf_item_key = l_item_keys(i),
8928 object_version_number = object_version_number + 1,
8929 renewal_status = nvl(renewal_status,G_NEG_STS_DRAFT),
8930 last_update_date = SYSDATE,
8931 last_updated_by = FND_GLOBAL.USER_ID,
8932 last_update_login = FND_GLOBAL.LOGIN_ID
8933 WHERE chr_id = l_contract_id_values(i);
8934 END IF;
8935 END IF;
8936
8937 --standard check of p_commit
8938 IF FND_API.to_boolean( p_commit ) THEN
8939 COMMIT;
8940 END IF;
8941 IF (FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level) THEN
8942 FND_LOG.string(FND_LOG.level_procedure, l_mod_name || '.end', 'x_return_status='|| x_return_status);
8943 END IF;
8944 FND_MSG_PUB.count_and_get(p_count => x_msg_count, p_data => x_msg_data );
8945
8946 EXCEPTION
8947 WHEN FND_API.g_exc_error THEN
8948 ROLLBACK TO launch_k_process_wf_blk_PVT;
8949 x_return_status := FND_API.g_ret_sts_error ;
8950
8951 IF (FND_LOG.level_error >= FND_LOG.g_current_runtime_level) THEN
8952 FND_LOG.string(FND_LOG.level_error, l_mod_name || '.end_error', 'x_return_status=' || x_return_status);
8953 END IF;
8954 FND_MSG_PUB.count_and_get(p_count => x_msg_count, p_data => x_msg_data );
8955
8956 WHEN FND_API.g_exc_unexpected_error THEN
8957 ROLLBACK TO launch_k_process_wf_blk_PVT;
8958 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
8959
8960 IF (FND_LOG.level_unexpected >= FND_LOG.g_current_runtime_level) THEN
8961 FND_LOG.string(FND_LOG.level_unexpected, l_mod_name || '.end_unexpected_error', 'x_return_status=' || x_return_status);
8962 END IF;
8963 FND_MSG_PUB.count_and_get(p_count => x_msg_count, p_data => x_msg_data );
8964
8965 WHEN OTHERS THEN
8966 ROLLBACK TO launch_k_process_wf_blk_PVT;
8967
8968 --since we are calling workflow api's we need to check for workflow errors
8969 WF_CORE.get_error(l_wf_err_name, l_wf_err_msg, l_wf_err_stack, 4000);
8970
8971 IF (l_wf_err_name IS NOT NULL) THEN
8972 --workflow error
8973 WF_CORE.clear;
8974 --set the status to error, so that calling program can handle it
8975 x_return_status := FND_API.g_ret_sts_error ;
8976 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name, l_wf_err_name||' '||l_wf_err_msg);
8977
8978 IF (FND_LOG.level_unexpected >= FND_LOG.g_current_runtime_level) THEN
8979 FND_LOG.string(FND_LOG.level_unexpected, l_mod_name || '.end_workflow_error', 'x_return_status=' || x_return_status);
8980 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);
8981 END IF;
8982
8983 ELSE
8984 --other error
8985 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
8986
8987 IF (FND_LOG.level_unexpected >= FND_LOG.g_current_runtime_level) THEN
8988 --first log the sqlerrm
8989 l_error_text := substr (SQLERRM, 1, 240);
8990 FND_LOG.string(FND_LOG.level_unexpected, l_mod_name || '.end_other_error', l_error_text);
8991 --then add it to the message api list
8992 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name, l_error_text);
8993 END IF;
8994 END IF;
8995
8996 FND_MSG_PUB.count_and_get(p_count => x_msg_count, p_data => x_msg_data );
8997
8998 END launch_k_process_wf_blk;
8999
9000 END OKS_WF_K_PROCESS_PVT;