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