DBA Data[Home] [Help]

PACKAGE BODY: APPS.OKS_WF_K_PROCESS_PVT

Source


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