DBA Data[Home] [Help]

PACKAGE BODY: APPS.OKC_TERMS_UTIL_PVT

Source


1 PACKAGE BODY OKC_TERMS_UTIL_PVT AS
2 /* $Header: OKCVDUTB.pls 120.34.12020000.4 2013/03/12 06:50:46 nbingi ship $ */
3   g_concat_art_no  VARCHAR2(1) := NVL(FND_PROFILE.VALUE('OKC_CONCAT_ART_NO'),'N');
4 
5   ---------------------------------------------------------------------------
6   -- GLOBAL MESSAGE CONSTANTS
7   ---------------------------------------------------------------------------
8   G_FND_APP                    CONSTANT VARCHAR2(200) := OKC_API.G_FND_APP;
9   G_UNABLE_TO_RESERVE_REC      CONSTANT VARCHAR2(200) := OKC_API.G_UNABLE_TO_RESERVE_REC;
10   G_RECORD_DELETED             CONSTANT VARCHAR2(200) := OKC_API.G_RECORD_DELETED;
11   G_RECORD_CHANGED             CONSTANT VARCHAR2(200) := OKC_API.G_RECORD_CHANGED;
12   G_RECORD_LOGICALLY_DELETED   CONSTANT VARCHAR2(200) := OKC_API.G_RECORD_LOGICALLY_DELETED;
13   G_REQUIRED_VALUE             CONSTANT VARCHAR2(200) := OKC_API.G_REQUIRED_VALUE;
14   G_INVALID_VALUE              CONSTANT VARCHAR2(200) := OKC_API.G_INVALID_VALUE;
15   G_COL_NAME_TOKEN             CONSTANT VARCHAR2(200) := OKC_API.G_COL_NAME_TOKEN;
16   G_PARENT_TABLE_TOKEN         CONSTANT VARCHAR2(200) := OKC_API.G_PARENT_TABLE_TOKEN;
17   G_CHILD_TABLE_TOKEN          CONSTANT VARCHAR2(200) := OKC_API.G_CHILD_TABLE_TOKEN;
18   ---------------------------------------------------------------------------
19   -- GLOBAL CONSTANTS
20   ---------------------------------------------------------------------------
21   G_PKG_NAME                   CONSTANT   VARCHAR2(200) := 'OKC_TERMS_UTIL_PVT';
22   G_MODULE                     CONSTANT   VARCHAR2(250)   := 'okc.plsql.'||G_PKG_NAME||'.';
23   G_APP_NAME                   CONSTANT   VARCHAR2(3)   := OKC_API.G_APP_NAME;
24 
25   G_TMPL_DOC_TYPE              CONSTANT   VARCHAR2(30)  := OKC_TERMS_UTIL_GRP.G_TMPL_DOC_TYPE;
26   G_UNASSIGNED_SECTION_CODE    CONSTANT   VARCHAR2(30)  := 'UNASSIGNED';
27   G_AMEND_CODE_UPDATED         CONSTANT   VARCHAR2(30)  := 'UPDATED';
28   G_ATTACHED_CONTRACT_SOURCE   CONSTANT   VARCHAR2(30) := 'ATTACHED';
29   ------------------------------------------------------------------------------
30   -- GLOBAL CONSTANTS
31   ------------------------------------------------------------------------------
32   G_FALSE                      CONSTANT   VARCHAR2(1) := FND_API.G_FALSE;
33   G_TRUE                       CONSTANT   VARCHAR2(1) := FND_API.G_TRUE;
34 
35   G_RET_STS_SUCCESS            CONSTANT   VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
36   G_RET_STS_ERROR              CONSTANT   VARCHAR2(1) := FND_API.G_RET_STS_ERROR;
37   G_RET_STS_UNEXP_ERROR        CONSTANT   VARCHAR2(1) := FND_API.G_RET_STS_UNEXP_ERROR;
38 
39   G_UNEXPECTED_ERROR           CONSTANT   VARCHAR2(200) := 'OKC_UNEXPECTED_ERROR';
40   G_SQLERRM_TOKEN              CONSTANT   VARCHAR2(200) := 'ERROR_MESSAGE';
41   G_SQLCODE_TOKEN              CONSTANT   VARCHAR2(200) := 'ERROR_CODE';
42   ------------------------------------------------------------------------------
43   -- GLOBAL EXCEPTIONS
44   ------------------------------------------------------------------------------
45   E_Resource_Busy               EXCEPTION;
46   PRAGMA EXCEPTION_INIT(E_Resource_Busy, -00054);
47 
48   -- 11.5.10+ change
49   -- Global variable set by the original Merge_Template_Working_Copy procedure
50   -- Returned by the overloaded Merge_Template_Working_Copy
51   g_parent_template_id          NUMBER;
52 
53 
54 --==================== INTERNAL PROCEDURES ============================
55  PROCEDURE ALLOWED_TMPL_USAGES_Delete_Set(
56           x_return_status         OUT NOCOPY VARCHAR2,
57           x_msg_data              OUT NOCOPY VARCHAR2,
58           x_msg_count             OUT NOCOPY NUMBER,
59           p_template_id           IN NUMBER
60   ) IS
61     l_api_name         CONSTANT VARCHAR2(30) := 'ALLOWED_TMPL_USAGES_Delete_Set';
62 
63 
64     CURSOR l_get_rec IS
65       SELECT allowed_tmpl_usages_id,object_version_number
66         FROM OKC_ALLOWED_TMPL_USAGES
67        WHERE TEMPLATE_ID = p_template_id;
68    BEGIN
69 
70     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
71       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'100: Entered ALLOWED_TMPL_USAGES_Delete_Set');
72     END IF;
73 
74     FOR cr IN l_get_rec LOOP
75 
76       OKC_ALLOWED_TMPL_USAGES_GRP.Delete_Allowed_Tmpl_Usages(
77                             p_api_version   => 1,
78                             p_init_msg_list => FND_API.G_FALSE,
79                             p_commit        => FND_API.G_FALSE,
80                             x_return_status => x_return_status,
81                             x_msg_count     => x_msg_count,
82                             x_msg_data      => x_msg_data,
83 
84                             p_allowed_tmpl_usages_id => cr.allowed_tmpl_usages_id,
85 
86                             p_object_version_number  => cr.object_version_number
87                          );
88 
89         IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
90              RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
91         ELSIF (x_return_status = G_RET_STS_ERROR) THEN
92              RAISE FND_API.G_EXC_ERROR ;
93         END IF;
94     END LOOP;
95 
96     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
97       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'400: Leaving ALLOWED_TMPL_USAGES_Delete_Set');
98     END IF;
99    EXCEPTION
100    WHEN FND_API.G_EXC_ERROR THEN
101       IF (l_get_rec%ISOPEN) THEN
102         CLOSE l_get_rec;
103       END IF;
104 
105       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
106          FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'500: Leaving ALLOWED_TMPL_USAGES_Delete_Set:FND_API.G_EXC_ERROR Exception');
107       END IF;
108       x_return_status := G_RET_STS_ERROR ;
109 
110     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
111       IF (l_get_rec%ISOPEN) THEN
112         CLOSE l_get_rec;
113       END IF;
114 
115       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
116          FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'500: Leaving ALLOWED_TMPL_USAGES_Delete_Set:FND_API.G_EXC_UNEXPECTED_ERROR Exception');
117       END IF;
118       x_return_status := G_RET_STS_UNEXP_ERROR ;
119 
120 
121    WHEN OTHERS THEN
122       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
123         FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'600: Leaving ALLOWED_TMPL_USAGES_Delete_Set because of EXCEPTION: '||sqlerrm);
124       END IF;
125 
126       IF (l_get_rec%ISOPEN) THEN
127         CLOSE l_get_rec;
128       END IF;
129 
130       x_return_status := G_RET_STS_UNEXP_ERROR ;
131       IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
132         FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
133       END IF;
134   END ALLOWED_TMPL_USAGES_Delete_Set;
135 ---
136 
137  PROCEDURE Update_Allowed_Tmpl_Usages_Id(
138           x_return_status         OUT NOCOPY VARCHAR2,
139           x_msg_data              OUT NOCOPY VARCHAR2,
140           x_msg_count             OUT NOCOPY NUMBER,
141           p_old_template_id       IN NUMBER,
142           p_new_template_id       IN NUMBER
143   ) IS
144     l_api_name CONSTANT VARCHAR2(30) := 'Update_Allowed_Tmpl_Usages_Id';
145     CURSOR l_get_rec IS
146       SELECT allowed_tmpl_usages_id,object_version_number,document_type,default_yn
147         FROM OKC_ALLOWED_TMPL_USAGES
148        WHERE TEMPLATE_ID = p_old_template_id;
149    BEGIN
150     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
151        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'1100: Entered Update_Allowed_Tmpl_Usages_Id');
152 
153     END IF;
154 
155  FOR cr in l_get_rec LOOP
156 
157          OKC_ALLOWED_TMPL_USAGES_GRP.update_Allowed_Tmpl_Usages(
158                             p_api_version   => 1,
159                             p_init_msg_list => FND_API.G_FALSE,
160                             p_commit        => FND_API.G_FALSE,
161                             x_return_status => x_return_status,
162                             x_msg_count     => x_msg_count,
163                             x_msg_data      => x_msg_data,
164                             p_template_id => p_new_template_id,
165                             p_document_type => cr.document_type,
166                             p_default_yn    => cr.default_yn,
167                             p_allowed_tmpl_usages_id => cr.allowed_tmpl_usages_id,
168 
169                             p_object_version_number  => cr.object_version_number
170                          );
171 
172         IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
173              RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
174         ELSIF (x_return_status = G_RET_STS_ERROR) THEN
175              RAISE FND_API.G_EXC_ERROR ;
176         END IF;
177 
178   END LOOP;
179 
180     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
181        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'1400: Update_Allowed_Tmpl_Usages_Id');
182     END IF;
183 
184 EXCEPTION
185    WHEN FND_API.G_EXC_ERROR THEN
186       IF (l_get_rec%ISOPEN) THEN
187         CLOSE l_get_rec;
188       END IF;
189 
190       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
191          FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'500: Leaving Update_Allowed_Tmpl_Usages_Id :FND_API.G_EXC_ERROR');
192       END IF;
193       x_return_status := G_RET_STS_ERROR ;
194 
195     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
196       IF (l_get_rec%ISOPEN) THEN
197         CLOSE l_get_rec;
198       END IF;
199 
200       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
201          FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'500: Leaving Update_Allowed_Tmpl_Usages_Id : FND_API.G_EXC_UNEXPECTED_ERROR');
202       END IF;
203       x_return_status := G_RET_STS_UNEXP_ERROR ;
204 
205 
206    WHEN OTHERS THEN
207       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
208         FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'1600: Leaving Update_Allowed_Tmpl_Usages_Id because of EXCEPTION: '||sqlerrm);
209       END IF;
210 
211       IF (l_get_rec%ISOPEN) THEN
212         CLOSE l_get_rec;
213       END IF;
214 
215       x_return_status := G_RET_STS_UNEXP_ERROR ;
216       IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
217         FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
218       END IF;
219 
220 
221   END Update_Allowed_Tmpl_Usages_Id;
222 
223 --==================== INTERNAL PROCEDURES ============================
224 
225 
226 /*
227 -- PROCEDURE Delete_Doc
228 -- To be used to delete Terms whenever a document is deleted.
229 */
230   PROCEDURE Delete_Doc (
231     x_return_status    OUT NOCOPY VARCHAR2,
232 
233     p_doc_type         IN  VARCHAR2,
234     p_doc_id           IN  NUMBER
235 
236     ,p_retain_lock_terms_yn        IN VARCHAR2 := 'N'
237     ,p_retain_lock_xprt_yn         IN VARCHAR2 := 'N'
238 
239   ) IS
240     l_api_version      CONSTANT NUMBER := 1;
241     l_api_name         CONSTANT VARCHAR2(30) := 'Delete_Doc';
242     l_found            BOOLEAN;
243     l_status           OKC_TERMS_TEMPLATES.STATUS_CODE%TYPE;
244     l_flag             VARCHAR2(1);
245     l_objnum           NUMBER;
246     l_msg_count        NUMBER;
247     l_msg_data         VARCHAR2(2000);
248 
249     CURSOR tmpl_sts_crs IS
250       SELECT STATUS_CODE FROM okc_terms_templates
251         WHERE TEMPLATE_ID = p_doc_id;
252 
253     CURSOR tmpl_prnt_crs IS
254       SELECT '!' FROM okc_terms_templates
255         WHERE parent_template_id = p_doc_id;
256 
257     CURSOR tmpl_usd_crs IS
258       SELECT '!' FROM okc_template_usages_v
259         WHERE TEMPLATE_ID = p_doc_id AND ROWNUM=1;
260 
261     CURSOR tt_csr IS
262       SELECT TEMPLATE_ID, object_version_number,template_model_id
263         FROM okc_terms_templates
264        WHERE template_id=p_doc_id;
265 
266     CURSOR objnum_tu_csr IS
267       SELECT object_version_number
268         FROM OKC_TEMPLATE_USAGES
269        WHERE DOCUMENT_TYPE = p_doc_type AND DOCUMENT_ID = p_doc_id;
270 
271     CURSOR objnum_mlp_tu_csr IS
272       SELECT object_version_number
273         FROM OKC_MLP_TEMPLATE_USAGES
274        WHERE DOCUMENT_TYPE = p_doc_type AND DOCUMENT_ID = p_doc_id;
275 
276    BEGIN
277     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
278        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'2900: Entered Delete_Doc');
279     END IF;
280     --  Initialize API return status to success
281     x_return_status := G_RET_STS_SUCCESS;
282 
283     IF p_doc_type=G_TMPL_DOC_TYPE THEN
284 
285       OPEN tmpl_sts_crs;
286       FETCH tmpl_sts_crs INTO l_status;
287       l_found := tmpl_sts_crs%FOUND;
288       CLOSE tmpl_sts_crs;
289 
290       IF NOT l_found THEN
291         --?? Put some Message output
292         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
293          FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'3000: Template has not been found');
294         END IF;
295         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
296       END IF;
297 
298       OPEN tmpl_prnt_crs;
299       FETCH tmpl_prnt_crs INTO l_status;
300       l_found := tmpl_prnt_crs%FOUND;
301       CLOSE tmpl_prnt_crs;
302 
303       IF l_status NOT IN ('DRAFT', 'REJECTED','REVISION')
304        OR l_found THEN  -- true if there's a revision for the template
305         --?? Put some Message output
306         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
307          FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'3100: Template Status is not valid to delete it');
308         END IF;
309         RAISE FND_API.G_EXC_ERROR;
310       END IF;
311 
312       OPEN tmpl_usd_crs;
313       FETCH tmpl_usd_crs INTO l_flag;
314       l_found := tmpl_usd_crs%FOUND;
315       CLOSE tmpl_usd_crs;
316 
317       IF l_found THEN
318         --?? Put some Message output
319         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
320          FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'3200: Template is already used - so can not be deleted');
321         END IF;
322         RAISE FND_API.G_EXC_ERROR;
323       END IF;
324 
325       --------------------------------------------
326       -- Delete the record from OKC_ALLOWED_TMPL_USAGES_V
327       --------------------------------------------
328       IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
329        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'3300: Delete each record from OKC_ALLOWED_TMPL_USAGES_V in a loop');
330       END IF;
331       --------------------------------------------
332       ALLOWED_TMPL_USAGES_Delete_Set(
333           x_return_status         => x_return_status,
334           x_msg_data              => l_msg_data,
335           x_msg_count             => l_msg_count,
336           p_template_id           => p_doc_id
337       );
338       --------------------------------------------
339       IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
340         RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
341       ELSIF (x_return_status = G_RET_STS_ERROR) THEN
342         RAISE FND_API.G_EXC_ERROR ;
343       END IF;
344       --------------------------------------------
345 
346       -- Delete record from okc_terms_templates
347       IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
348        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'3400: Delete each record from okc_terms_templates in a loop');
349       END IF;
350       FOR cr IN tt_csr LOOP
351         --------------------------------------------
352         -- Delete each record from okc_terms_templates for
353         --------------------------------------------
354         OKC_TERMS_TEMPLATES_PVT.Delete_Row(
355           x_return_status         => x_return_status,
356           p_template_id           => cr.template_id,
357           p_object_version_number => cr.object_version_number
358         );
359         --------------------------------------------
360         IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
361           RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
362         ELSIF (x_return_status = G_RET_STS_ERROR) THEN
363           RAISE FND_API.G_EXC_ERROR ;
364         END IF;
365         --------------------------------------------
366         /*
367       * Removed call to OKC_EXPRT_UTIL_GRP for 11.5.10+: Contract Expert Changes
368       */
369         --------------------------------------------
370 
371 --Added 11.5.10+ CE
372         --------------------------------------------
373        OKC_XPRT_TMPL_RULE_ASSNS_PVT.delete_template_rule_assns(
374                              p_api_version            => 1,
375                              p_init_msg_list          => OKC_API.G_FALSE,
376                              p_commit                 => OKC_API.G_FALSE,
377                              p_template_id            => cr.template_id,
378                              x_return_status          => x_return_status,
379                              x_msg_data               => l_msg_data,
380                              x_msg_count                  => l_msg_count);
381          --------------------------------------------
382        IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
383          RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
384        ELSIF (x_return_status = G_RET_STS_ERROR) THEN
385          RAISE FND_API.G_EXC_ERROR ;
386        END IF;
387       --------------------------------------------
388 
389       END LOOP;
390 
391     END IF;
392 
393     --------------------------------------------
394     --    Delete record from okc_k_art_varaibles
395     --------------------------------------------
396     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
397      FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'3500: Delete records from okc_k_art_varaibles for the doc');
398     END IF;
399     OKC_K_ART_VARIABLES_PVT.delete_set(
400       x_return_status => x_return_status,
401       p_doc_type      => p_doc_type,
402       p_doc_id        => p_doc_id
403       ,p_retain_lock_terms_yn => p_retain_lock_terms_yn
404     );
405     --------------------------------------------
406     IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
407       RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
408     ELSIF (x_return_status = G_RET_STS_ERROR) THEN
409       RAISE FND_API.G_EXC_ERROR ;
410     END IF;
411     --------------------------------------------
412 
413     --------------------------------------------
414     --    Delete record from okc_k_articles_v
415     --------------------------------------------
416     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
417      FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'3600: Delete records from okc_k_articles_v for the doc');
418     END IF;
419     OKC_K_ARTICLES_PVT.delete_set(
420       x_return_status => x_return_status,
421       p_doc_type      => p_doc_type,
422       p_doc_id        => p_doc_id
423       ,p_retain_lock_terms_yn => p_retain_lock_terms_yn
424     );
425     --------------------------------------------
426     IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
427       RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
428     ELSIF (x_return_status = G_RET_STS_ERROR) THEN
429       RAISE FND_API.G_EXC_ERROR ;
430     END IF;
431     --------------------------------------------
432 
433     --------------------------------------------
434     --    Delete record from okc_sections_v
435     --------------------------------------------
436     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
437      FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'3700: Delete records from okc_sections_v for the doc');
438     END IF;
439     OKC_TERMS_SECTIONS_PVT.delete_set(
440       x_return_status => x_return_status,
441       p_doc_type      => p_doc_type,
442       p_doc_id        => p_doc_id
443       ,p_retain_lock_terms_yn => p_retain_lock_terms_yn
444     );
445     --------------------------------------------
446     IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
447       RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
448     ELSIF (x_return_status = G_RET_STS_ERROR) THEN
449       RAISE FND_API.G_EXC_ERROR ;
450     END IF;
451     --------------------------------------------
452 
453    -------------------------------------------------
454    -- Remove any uploaded terms under review
455    ------------------------------------------------
456 
457     OKC_REVIEW_UPLD_TERMS_PVT.delete_uploaded_terms(
458       p_api_version       => l_api_version,
459       p_document_type     => p_doc_type,
460       p_document_id      => p_doc_id,
461       x_return_status    => x_return_status,
462 	 x_msg_data         => l_msg_data,
463 	 x_msg_count        => l_msg_count);
464       --------------------------------------------
465 	   IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
466 	        RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
467 	   ELSIF (x_return_status = G_RET_STS_ERROR) THEN
468 	        RAISE FND_API.G_EXC_ERROR ;
469 	   END IF;
470 	 --------------------------------------------
471 
472    ------------------------------------------------
473 
474     --------------------------------------------
475     --    Delete record form okc_template_usages
476     --------------------------------------------
477     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
478      FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'3800: Delete a record from okc_template_usages for the doc');
479     END IF;
480     l_objnum := -1;
481     OPEN objnum_tu_csr;
482     FETCH objnum_tu_csr INTO l_objnum;
483     l_found := objnum_tu_csr%FOUND;
484     CLOSE objnum_tu_csr;
485     IF l_found THEN
486       OKC_TEMPLATE_USAGES_PVT.delete_row(
487         x_return_status         => x_return_status,
488         p_document_type         => p_doc_type,
489         p_document_id           => p_doc_id,
490         p_object_version_number => l_objnum
491         , p_retain_lock_xprt_yn   => p_retain_lock_xprt_yn
492       );
493       --------------------------------------------
494       IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
495         RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
496       ELSIF (x_return_status = G_RET_STS_ERROR) THEN
497         RAISE FND_API.G_EXC_ERROR ;
498       END IF;
499       --------------------------------------------
500     END IF;
501 
502      --------------------------------------------
503     -- kkolukul: CLM changes: Delete records from okc_mlp_template_usages
504     --Delete records from okc_mlp_template_usages when removing terms.
505     --------------------------------------------
506     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
507      FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'3900: Delete a record from okc_template_usages for the doc');
508     END IF;
509 
510     l_objnum := -1;
511     OPEN objnum_mlp_tu_csr;
512     FETCH objnum_mlp_tu_csr INTO l_objnum;
513     l_found := objnum_mlp_tu_csr%FOUND;
514     CLOSE objnum_mlp_tu_csr;
515     IF l_found THEN
516       OKC_CLM_PKG.Delete_Usages_Row(
517         x_return_status         => x_return_status,
518         p_document_type         => p_doc_type,
519         p_document_id           => p_doc_id,
520         p_object_version_number => l_objnum
521       );
522       --------------------------------------------
523       IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
524         RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
525       ELSIF (x_return_status = G_RET_STS_ERROR) THEN
526         RAISE FND_API.G_EXC_ERROR ;
527       END IF;
528       --------------------------------------------
529     END IF;
530 
531     ---end clm changes.
532 
533     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
534      FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'4000: Leaving Delete_Doc');
535     END IF;
536    EXCEPTION
537     WHEN FND_API.G_EXC_ERROR THEN
538       IF tmpl_sts_crs%ISOPEN THEN
539         CLOSE tmpl_sts_crs;
540       END IF;
541 
542       IF tmpl_usd_crs%ISOPEN THEN
543         CLOSE tmpl_usd_crs;
544       END IF;
545 
546       IF tmpl_prnt_crs%ISOPEN THEN
547         CLOSE tmpl_prnt_crs;
548       END IF;
549 
550       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
551          FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'4100: Leaving Delete_Doc : OKC_API.G_EXCEPTION_ERROR Exception');
552       END IF;
553       x_return_status := G_RET_STS_ERROR ;
554 
555     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
556       IF tmpl_sts_crs%ISOPEN THEN
557         CLOSE tmpl_sts_crs;
558       END IF;
559 
560       IF tmpl_usd_crs%ISOPEN THEN
561         CLOSE tmpl_usd_crs;
562       END IF;
563 
564       IF tmpl_prnt_crs%ISOPEN THEN
565         CLOSE tmpl_prnt_crs;
566       END IF;
567 
568       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
569          FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'4200: Leaving Delete_Doc : OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception');
570       END IF;
571       x_return_status := G_RET_STS_UNEXP_ERROR ;
572 
573     WHEN OTHERS THEN
574       IF tmpl_sts_crs%ISOPEN THEN
575         CLOSE tmpl_sts_crs;
576       END IF;
577 
578       IF tmpl_usd_crs%ISOPEN THEN
579         CLOSE tmpl_usd_crs;
580       END IF;
581 
582       IF tmpl_prnt_crs%ISOPEN THEN
583         CLOSE tmpl_prnt_crs;
584       END IF;
585 
586       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
587         FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'4300: Leaving Delete_Doc because of EXCEPTION: '||sqlerrm);
588       END IF;
589 
590       IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
591         FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
592       END IF;
593       x_return_status := G_RET_STS_UNEXP_ERROR ;
594   END Delete_Doc ;
595 /*
596 -- PROCEDURE delete_doc_version
597 -- To be used to delete Terms whenever a document is deleted.
598 */
599   PROCEDURE delete_doc_version (
600     x_return_status    OUT NOCOPY VARCHAR2,
601 
602     p_doc_type         IN  VARCHAR2,
603     p_doc_id           IN  NUMBER,
604     p_version_number   IN  NUMBER
605 
606   ) IS
607     l_api_version      CONSTANT NUMBER := 1;
608     l_api_name         CONSTANT VARCHAR2(30) := 'delete_doc_version';
609     l_found            BOOLEAN;
610     l_status           OKC_TERMS_TEMPLATES.STATUS_CODE%TYPE;
611     l_flag             VARCHAR2(1);
612     l_objnum           NUMBER;
613     l_msg_count        NUMBER;
614     l_msg_data         VARCHAR2(2000);
615 
616    BEGIN
617 
618     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
619        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'2900: Entered delete_doc_version');
620     END IF;
621     --  Initialize API return status to success
622     x_return_status := G_RET_STS_SUCCESS;
623 
624 
625     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
626      FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'3500: Delete records from okc_k_art_varaibles_h for the doc');
627     END IF;
628 
629     x_return_status:=OKC_K_ART_VARIABLES_PVT.delete_version(
630       p_doc_type      => p_doc_type,
631       p_doc_id        => p_doc_id,
632       p_major_version => p_version_number
633     );
634     --------------------------------------------
635     IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
636       RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
637     ELSIF (x_return_status = G_RET_STS_ERROR) THEN
638       RAISE FND_API.G_EXC_ERROR ;
639     END IF;
640     --------------------------------------------
641 
642     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
643      FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'3600: Delete records from okc_k_articles_bh for the doc');
644     END IF;
645 
646     x_return_status:=OKC_K_ARTICLES_PVT.delete_version(
647       p_doc_type      => p_doc_type,
648       p_doc_id        => p_doc_id,
649       p_major_version => p_version_number
650     );
651     --------------------------------------------
652     IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
653       RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
654     ELSIF (x_return_status = G_RET_STS_ERROR) THEN
655       RAISE FND_API.G_EXC_ERROR ;
656     END IF;
657     --------------------------------------------
658 
659     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
660      FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'3700: Delete records from okc_sections_h for the doc');
661     END IF;
662     x_return_status:=OKC_TERMS_SECTIONS_PVT.delete_version(
663       p_doc_type      => p_doc_type,
664       p_doc_id        => p_doc_id,
665       p_major_version => p_version_number
666     );
667     --------------------------------------------
668     IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
669       RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
670     ELSIF (x_return_status = G_RET_STS_ERROR) THEN
671       RAISE FND_API.G_EXC_ERROR ;
672     END IF;
673     --------------------------------------------
674 
675     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
676         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'3800: Delete a record from okc_template_usages_h for the doc');
677     END IF;
678 
679      x_return_status:=OKC_TEMPLATE_USAGES_PVT.delete_version(
680         p_doc_type         => p_doc_type,
681         p_doc_id           => p_doc_id,
682         p_major_version => p_version_number
683       );
684       --------------------------------------------
685       IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
686         RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
687       ELSIF (x_return_status = G_RET_STS_ERROR) THEN
688         RAISE FND_API.G_EXC_ERROR ;
689       END IF;
690       --------------------------------------------
691 
692     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
693      FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'4000: Leaving delete_doc_version');
694     END IF;
695 
696    EXCEPTION
697     WHEN FND_API.G_EXC_ERROR THEN
698       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
699          FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'4100: Leaving delete_doc_version : OKC_API.G_EXCEPTION_ERROR Exception');
700       END IF;
701       x_return_status := G_RET_STS_ERROR ;
702 
703     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
704       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
705          FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'4200: Leaving delete_doc_version : OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception');
706       END IF;
707       x_return_status := G_RET_STS_UNEXP_ERROR ;
708 
709     WHEN OTHERS THEN
710 
711       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
712         FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'4300: Leaving delete_doc_version because of EXCEPTION: '||sqlerrm);
713       END IF;
714 
715       IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
716         FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
717       END IF;
718       x_return_status := G_RET_STS_UNEXP_ERROR ;
719   END Delete_Doc_version ;
720 
721 /*
722 -- PROCEDURE Mark_Amendment
723 -- This API will be used to mark any article as amended if any of variables have been changed.
724 */
725   PROCEDURE Mark_Amendment (
726     p_api_version       IN  NUMBER,
727     p_init_msg_list     IN  VARCHAR2 :=  FND_API.G_FALSE,
728 
729     x_return_status     OUT NOCOPY VARCHAR2,
730     x_msg_data          OUT NOCOPY VARCHAR2,
731     x_msg_count         OUT NOCOPY NUMBER,
732 
733     p_doc_type          IN  VARCHAR2,
734     p_doc_id            IN  NUMBER,
735     p_variable_code     IN  VARCHAR2
736   ) IS
737     l_api_version       CONSTANT NUMBER := 1;
738     l_api_name          CONSTANT VARCHAR2(30) := 'Mark_Amendment';
739     CURSOR idlist_crs IS
740     SELECT distinct id, kart.object_version_number
741       FROM okc_k_articles_b kart, okc_k_art_variables var
742      WHERE document_type = p_doc_type
743        AND document_id = p_doc_id
744        AND var.cat_id = kart.id
745        AND kart.amendment_operation_code IS NULL
746        and var.variable_code = p_variable_code;
747    BEGIN
748     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
749        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'4400: Entered Mark_Amendment');
750     END IF;
751     -- Standard Start of API savepoint
752     SAVEPOINT g_Mark_Amendment;
753     -- Standard call to check for call compatibility.
754     IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
755       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
756     END IF;
757     -- Initialize message list if p_init_msg_list is set to TRUE.
758     IF FND_API.to_Boolean( p_init_msg_list ) THEN
759       FND_MSG_PUB.initialize;
760     END IF;
761     --  Initialize API return status to success
762     x_return_status := G_RET_STS_SUCCESS;
763 
764     -- Delete record from okc_K_ARTICLES
765     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
766      FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'4500: Update each record from okc_K_ARTICLES in a loop');
767     END IF;
768     FOR cr IN idlist_crs LOOP
769       --------------------------------------------
770       -- Update each record from okc_terms_templates for
771       --------------------------------------------
772       OKC_K_ARTICLES_GRP.Update_article(
773         p_api_version                => 1,
774         p_init_msg_list              => FND_API.G_FALSE ,
775         x_return_status              => x_return_status,
776         x_msg_data                   => x_msg_data,
777         x_msg_count                  => x_msg_count,
778         p_mode                       => 'AMEND',
779         p_id                         => cr.id,
780         p_object_version_number      => cr.object_version_number
781       );
782       --------------------------------------------
783       IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
784         RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
785       ELSIF (x_return_status = G_RET_STS_ERROR) THEN
786         RAISE FND_API.G_EXC_ERROR ;
787       END IF;
788       --------------------------------------------
789     END LOOP;
790 
791     -- Standard call to get message count and if count is 1, get message info.
792     FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
793     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
794      FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'4600: Leaving Mark_Amendment');
795     END IF;
796    EXCEPTION
797     WHEN FND_API.G_EXC_ERROR THEN
798       ROLLBACK TO g_Mark_Amendment;
799       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
800          FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'4700: Leaving Mark_Amendment : OKC_API.G_EXCEPTION_ERROR Exception');
801       END IF;
802       x_return_status := G_RET_STS_ERROR ;
803       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
804 
805     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
806       ROLLBACK TO g_Mark_Amendment;
807       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
808          FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'4800: Leaving Mark_Amendment : OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception');
809       END IF;
810       x_return_status := G_RET_STS_UNEXP_ERROR ;
811       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
812 
813     WHEN OTHERS THEN
814       ROLLBACK TO g_Mark_Amendment;
815       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
816         FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'4900: Leaving Mark_Amendment because of EXCEPTION: '||sqlerrm);
817       END IF;
818 
819       x_return_status := G_RET_STS_UNEXP_ERROR ;
820       IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
821         FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
822       END IF;
823       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
824   END Mark_Amendment;
825 
826     /*
827     -- PROCEDURE Merge_Template_Working_Copy
828     -- To be used to merge a working copy of a template is approved and old copy
829     -- and working copy
830     -- 11.5.10+ changes
831         1. Store the parent template id in a package global variable. This will retrieved
832             and returned by the overaloaded procedure.
833         2. Update the table OKC_TMPL_DRAFT_CLAUSES with the merged/parent template id.
834     */
835     PROCEDURE Merge_Template_Working_Copy (
836         p_api_version      IN  NUMBER,
837         p_init_msg_list    IN  VARCHAR2 := FND_API.G_FALSE,
838         p_commit           IN  VARCHAR2 := FND_API.G_FALSE,
839 
840         x_return_status    OUT NOCOPY VARCHAR2,
841         x_msg_data         OUT NOCOPY VARCHAR2,
842         x_msg_count        OUT NOCOPY NUMBER,
843 
844         p_template_id      IN  NUMBER
845     ) IS
846         l_api_version      CONSTANT NUMBER := 1;
847         l_api_name         CONSTANT VARCHAR2(30) := 'Merge_Template_Working_Copy';
848 
849         l_base_template_id NUMBER;
850         l_found            BOOLEAN;
851 
852         CURSOR get_par_id_csr IS
853             SELECT parent_template_id
854             FROM okc_terms_templates_all
855             WHERE template_id=p_template_id;
856 
857         CURSOR atu_csr IS
858             SELECT template_id, document_type
859             FROM OKC_ALLOWED_TMPL_USAGES
860             WHERE TEMPLATE_ID = l_base_template_id;
861 
862         CURSOR kart_csr IS
863             SELECT id, object_version_number
864             FROM okc_k_articles_b
865             WHERE document_type=G_TMPL_DOC_TYPE
866                 AND document_id = p_template_id;
867 
868         CURSOR sect_csr IS
869             SELECT id, object_version_number
870             FROM okc_sections_b
871             WHERE document_type=G_TMPL_DOC_TYPE
872                 AND document_id = p_template_id;
873 
874     BEGIN
875         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
876             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'5000: Entered Merge_Template_Working_Copy');
877         END IF;
878         -- Standard Start of API savepoint
879         SAVEPOINT g_Merge_Template_Working_Copy;
880         -- Standard call to check for call compatibility.
881         IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
882             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
883         END IF;
884         -- Initialize message list if p_init_msg_list is set to TRUE.
885         IF FND_API.to_Boolean( p_init_msg_list ) THEN
886             FND_MSG_PUB.initialize;
887         END IF;
888         --  Initialize API return status to success
889         x_return_status := G_RET_STS_SUCCESS;
890 
891         -- ================ Actual Procedure Code Start =======================
892 
893         --------------------------------------------
894         -- Get template id of original template
895         --------------------------------------------
896         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
897             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'5100: - get template id of original template');
898         END IF;
899         --------------------------------------------
900         OPEN get_par_id_csr;
901         FETCH get_par_id_csr INTO l_base_template_id;
902         l_found := get_par_id_csr%FOUND;
903         CLOSE get_par_id_csr;
904         IF not l_found THEN
905             Okc_Api.Set_Message(G_APP_NAME, G_INVALID_VALUE, G_COL_NAME_TOKEN, 'p_template_id');
906             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
907         END IF;
908 
909         --------------------------------------------
910         -- Delete Base Template
911         --------------------------------------------
912         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
913             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'5200: - Delete Base Template');
914         END IF;
915         --------------------------------------------
916         OKC_TERMS_TEMPLATES_PVT.Delete_Row(
917             x_return_status         => x_return_status,
918             p_template_id           => l_base_template_id,
919             p_object_version_number => NULL ,
920       p_delete_parent_yn      => 'Y'
921         );
922         --------------------------------------------
923         IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
924             RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
925         ELSIF (x_return_status = G_RET_STS_ERROR) THEN
926             RAISE FND_API.G_EXC_ERROR ;
927         END IF;
928         --------------------------------------------
929 
930         --------------------------------------------
931         -- Delete Allowed template usage record for base template:
932         --------------------------------------------
933         ALLOWED_TMPL_USAGES_Delete_Set(
934             x_return_status         => x_return_status,
935             x_msg_data            => x_msg_data,
936             x_msg_count           => x_msg_count,
937             p_template_id           => l_base_template_id
938         );
939         --------------------------------------------
940         IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
941             RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
942         ELSIF (x_return_status = G_RET_STS_ERROR) THEN
943             RAISE FND_API.G_EXC_ERROR ;
944         END IF;
945         --------------------------------------------
946 
947         --------------------------------------------
948         --    Delete record from okc_k_art_varaibles
949         --------------------------------------------
950         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
951             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'5300: Delete records from okc_k_art_varaibles for the doc');
952         END IF;
953         --------------------------------------------
954         OKC_K_ART_VARIABLES_PVT.delete_set(
955             x_return_status => x_return_status,
956             p_doc_type      => G_TMPL_DOC_TYPE,
957             p_doc_id        => l_base_template_id
958         );
959         --------------------------------------------
960         IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
961             RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
962         ELSIF (x_return_status = G_RET_STS_ERROR) THEN
963             RAISE FND_API.G_EXC_ERROR ;
964         END IF;
965         --------------------------------------------
966 
967         --------------------------------------------
968         --    Delete record from okc_k_articles_v
969         --------------------------------------------
970         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
971             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'5400: Delete records from okc_k_articles_v for the doc');
972         END IF;
973         --------------------------------------------
974         OKC_K_ARTICLES_PVT.delete_set(
975             x_return_status => x_return_status,
976             p_doc_type      => G_TMPL_DOC_TYPE,
977             p_doc_id        => l_base_template_id
978         );
979         --------------------------------------------
980         IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
981             RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
982         ELSIF (x_return_status = G_RET_STS_ERROR) THEN
983             RAISE FND_API.G_EXC_ERROR ;
984         END IF;
985         --------------------------------------------
986 
987         --------------------------------------------
988         --    Delete record from okc_sections_v
989         --------------------------------------------
990         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
991             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'5500: Delete records from okc_sections_v for the doc');
992         END IF;
993         OKC_TERMS_SECTIONS_PVT.delete_set(
994             x_return_status => x_return_status,
995             p_doc_type      => G_TMPL_DOC_TYPE,
996             p_doc_id        => l_base_template_id
997         );
998         --------------------------------------------
999         IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
1000             RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
1001         ELSIF (x_return_status = G_RET_STS_ERROR) THEN
1002             RAISE FND_API.G_EXC_ERROR ;
1003         END IF;
1004         --------------------------------------------
1005 
1006         --------------------------------------------
1007         -- Delete base template's Deliverables: Call Deliverable API to delete delevirable from the base template.
1008         --------------------------------------------
1009         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1010             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'5600: Delete delevirable from the base template');
1011         END IF;
1012         Okc_Deliverable_Process_Pvt.Delete_Deliverables(
1013             p_api_version    => p_api_version,
1014             p_init_msg_list  => p_init_msg_list,
1015             p_doc_type      => G_TMPL_DOC_TYPE,
1016             p_doc_id        => l_base_template_id,
1017             p_doc_version    => -99,
1018             x_msg_data       => x_msg_data,
1019             x_msg_count      => x_msg_count,
1020             x_return_status  => x_return_status
1021         );
1022         --------------------------------------------
1023         IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
1024             RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
1025         ELSIF (x_return_status = G_RET_STS_ERROR) THEN
1026             RAISE FND_API.G_EXC_ERROR ;
1027         END IF;
1028         --------------------------------------------
1029 
1030 
1031         --------------------------------------------
1032         -- Update Template Id of working template:
1033         --------------------------------------------
1034         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1035             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'5700: Update Template Id of working template to old template');
1036         END IF;
1037 
1038         OKC_TERMS_TEMPLATES_PVT.Update_Template_Id(
1039             x_return_status      => x_return_status,
1040             p_old_template_id    => p_template_id,
1041             p_new_template_id    => l_base_template_id
1042         );
1043         --------------------------------------------
1044         IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
1045             RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
1046         ELSIF (x_return_status = G_RET_STS_ERROR) THEN
1047             RAISE FND_API.G_EXC_ERROR ;
1048         END IF;
1049         --------------------------------------------
1050 
1051         --------------------------------------------
1052         -- Update Allowed template Usages Record:
1053         --------------------------------------------
1054         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1055             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'5800: Update Template Id of working template to old template for the template Usages ');
1056         END IF;
1057         Update_Allowed_Tmpl_Usages_Id(
1058             x_return_status      => x_return_status,
1059             x_msg_data           => x_msg_data,
1060             x_msg_count          => x_msg_count,
1061             p_old_template_id    => p_template_id,
1062             p_new_template_id    => l_base_template_id
1063         );
1064         --------------------------------------------
1065         IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
1066             RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
1067         ELSIF (x_return_status = G_RET_STS_ERROR) THEN
1068             RAISE FND_API.G_EXC_ERROR ;
1069         END IF;
1070         --------------------------------------------
1071 
1072         --------------------------------------------
1073         -- Update sections of working template:
1074         --------------------------------------------
1075         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1076             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'5900: Update Template Id of working template to old template for the sections');
1077         END IF;
1078         FOR cr IN sect_csr LOOP
1079             --------------------------------------------
1080             -- Update each record from okc_K_ARTICLES for
1081             --------------------------------------------
1082             OKC_TERMS_SECTIONS_PVT.Update_Row(
1083                 x_return_status         => x_return_status,
1084                 p_id                    => cr.id,
1085                 p_document_id           => l_base_template_id,
1086                 p_object_version_number => cr.object_version_number
1087             );
1088             --------------------------------------------
1089             IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
1090                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
1091             ELSIF (x_return_status = G_RET_STS_ERROR) THEN
1092                 RAISE FND_API.G_EXC_ERROR ;
1093             END IF;
1094             --------------------------------------------
1095         END LOOP;
1096 
1097         --------------------------------------------
1098         -- Update articles of working template:
1099         --------------------------------------------
1100         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1101             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'6000: Update Template Id of working template to old template for the articles');
1102         END IF;
1103         FOR cr IN kart_csr LOOP
1104             --------------------------------------------
1105             -- Update each record from okc_K_ARTICLES for
1106             --------------------------------------------
1107             OKC_K_ARTICLES_PVT.Update_Row(
1108                 x_return_status         => x_return_status,
1109                 p_id                    => cr.id,
1110                 p_document_id           => l_base_template_id,
1111                 p_object_version_number => cr.object_version_number
1112             );
1113             --------------------------------------------
1114             IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
1115                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
1116             ELSIF (x_return_status = G_RET_STS_ERROR) THEN
1117                 RAISE FND_API.G_EXC_ERROR ;
1118             END IF;
1119             --------------------------------------------
1120         END LOOP;
1121 
1122         --------------------------------------------
1123         -- Call deliverable APIs to update deliverable records with l_base_template_id
1124         --------------------------------------------
1125         OKC_DELIVERABLE_PROCESS_PVT.update_del_for_template_merge (
1126             p_api_version         => p_api_version ,
1127             p_init_msg_list       => p_init_msg_list,
1128             x_msg_data            => x_msg_data  ,
1129             x_msg_count           => x_msg_count ,
1130             x_return_status       => x_return_status,
1131 
1132             p_base_template_id    => l_base_template_id,
1133             p_working_template_id  => p_template_id
1134         );
1135         --------------------------------------------
1136         IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
1137             RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
1138         ELSIF (x_return_status = G_RET_STS_ERROR) THEN
1139             RAISE FND_API.G_EXC_ERROR ;
1140         END IF;
1141         --------------------------------------------
1142 
1143 --Added 11.5.10+ CE
1144         --------------------------------------------
1145         -- Call merge_template_rule_assns to merge CE rules
1146         --------------------------------------------
1147         OKC_XPRT_TMPL_RULE_ASSNS_PVT.merge_template_rule_assns (
1148             p_api_version         => p_api_version ,
1149             p_init_msg_list       => p_init_msg_list,
1150             p_commit              => FND_API.G_FALSE,
1151             x_msg_data            => x_msg_data  ,
1152             x_msg_count           => x_msg_count ,
1153             x_return_status       => x_return_status,
1154 
1155             p_template_id         => p_template_id,
1156             p_parent_template_id  => l_base_template_id
1157         );
1158         --------------------------------------------
1159         IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
1160             RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
1161         ELSIF (x_return_status = G_RET_STS_ERROR) THEN
1162             RAISE FND_API.G_EXC_ERROR ;
1163         END IF;
1164         --------------------------------------------
1165 
1166         --------------------------------------------
1167         -- Update OKC_TMPL_DRAFT_CLAUSES
1168         --------------------------------------------
1169         UPDATE OKC_TMPL_DRAFT_CLAUSES
1170             SET template_id = l_base_template_id
1171             WHERE   template_id = p_template_id;
1172 
1173         -- Store the l_base_template_id in the package global variable for
1174         -- retrieval by the overloaded procedure.
1175         g_parent_template_id := l_base_template_id;
1176 
1177         -- ================ Actual Procedure Code end =======================
1178 
1179         -- Standard call to get message count and if count is 1, get message info.
1180         FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
1181         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1182             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'6100: Leaving Merge_Template_Working_Copy');
1183         END IF;
1184 
1185     EXCEPTION
1186         WHEN FND_API.G_EXC_ERROR THEN
1187             ROLLBACK TO g_Merge_Template_Working_Copy;
1188             IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1189                 FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'6200: Leaving Merge_Template_Working_Copy : OKC_API.G_EXCEPTION_ERROR Exception');
1190             END IF;
1191             x_return_status := G_RET_STS_ERROR ;
1192             FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
1193 
1194         WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1195             ROLLBACK TO g_Merge_Template_Working_Copy;
1196             IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1197                 FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'6300: Leaving Merge_Template_Working_Copy : OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception');
1198             END IF;
1199             x_return_status := G_RET_STS_UNEXP_ERROR ;
1200             FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
1201 
1202         WHEN OTHERS THEN
1203             ROLLBACK TO g_Merge_Template_Working_Copy;
1204             IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1205                 FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'6400: Leaving Merge_Template_Working_Copy because of EXCEPTION: '||sqlerrm);
1206             END IF;
1207 
1208             x_return_status := G_RET_STS_UNEXP_ERROR ;
1209             IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
1210                 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
1211             END IF;
1212             FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
1213     END Merge_Template_Working_Copy ;
1214 
1215 /*
1216 -- PROCEDURE Get_System_Variables
1217 -- Based on doc type this API will call different integrating API and will
1218 -- get values of all variables being used in Terms and Conditions of a document
1219 */
1220 
1221   PROCEDURE Get_System_Variables (
1222     p_api_version       IN  NUMBER,
1223     p_init_msg_list     IN  VARCHAR2 :=  FND_API.G_FALSE,
1224 
1225     x_return_status     OUT NOCOPY VARCHAR2,
1226     x_msg_data          OUT NOCOPY VARCHAR2,
1227     x_msg_count         OUT NOCOPY NUMBER,
1228 
1229     p_doc_type          IN  VARCHAR2,
1230     p_doc_id            IN  NUMBER,
1231     p_only_doc_variables IN  VARCHAR2 := FND_API.G_TRUE,
1232 
1233     x_sys_var_value_tbl OUT NOCOPY OKC_TERMS_UTIL_GRP.sys_var_value_tbl_type
1234   ) IS
1235     l_api_version       CONSTANT NUMBER := 1;
1236     l_api_name          CONSTANT VARCHAR2(30) := 'Get_System_Variables';
1237     i NUMBER := 1;
1238     l_doc_class         VARCHAR2(30) := '?';
1239     CURSOR var_doc_lst_crs IS
1240      SELECT distinct var.variable_code
1241        FROM okc_k_articles_b kart, okc_k_art_variables var
1242        WHERE kart.document_type=p_doc_type AND kart.document_id=p_doc_id
1243          and var.cat_id=kart.id AND variable_type='S';
1244 
1245     CURSOR var_def_lst_crs IS
1246       SELECT busvar.variable_code
1247          FROM OKC_BUS_DOC_TYPES_B vo, OKC_BUS_VARIABLES_B busvar
1248          WHERE vo.document_type=p_doc_type AND busvar.contract_expert_yn='Y'
1249            AND busvar.variable_intent=vo.intent;
1250     CURSOR doc_cls_lst_crs IS
1251       SELECT document_type_class
1252         FROM okc_bus_doc_types_v
1253         WHERE document_type=p_doc_type;
1254    BEGIN
1255     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1256        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'6500: Entered Get_System_Variables');
1257     END IF;
1258     -- Standard Start of API savepoint
1259     SAVEPOINT g_Get_System_Variables;
1260     -- Standard call to check for call compatibility.
1261     IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
1262       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1263     END IF;
1264     -- Initialize message list if p_init_msg_list is set to TRUE.
1265     IF FND_API.to_Boolean( p_init_msg_list ) THEN
1266       FND_MSG_PUB.initialize;
1267     END IF;
1268     --  Initialize API return status to success
1269     x_return_status := G_RET_STS_SUCCESS;
1270 
1271     IF p_only_doc_variables = FND_API.G_TRUE THEN
1272       FOR cr IN var_doc_lst_crs LOOP
1273        x_sys_var_value_tbl(i).Variable_code := cr.variable_code;
1274        i := i+1;
1275       END LOOP;
1276      ELSE
1277       FOR cr IN var_def_lst_crs LOOP
1278        x_sys_var_value_tbl(i).Variable_code := cr.variable_code;
1279        i := i+1;
1280       END LOOP;
1281     END IF;
1282 
1283     OPEN doc_cls_lst_crs;
1284     FETCH doc_cls_lst_crs INTO l_doc_class;
1285     CLOSE doc_cls_lst_crs;
1286 
1287     IF l_doc_class in ('BSA','SO') THEN
1288     --IF l_doc_class = 'OM' THEN
1289       OKC_OM_INT_GRP.get_article_variable_values(
1290         p_api_version         => p_api_version ,
1291         p_init_msg_list       => p_init_msg_list,
1292         x_msg_data            => x_msg_data  ,
1293         x_msg_count           => x_msg_count ,
1294         x_return_status       => x_return_status,
1295 
1296         p_doc_type            => p_doc_type,
1297         p_doc_id              => p_doc_id,
1298         p_sys_var_value_tbl   => x_sys_var_value_tbl);
1299 
1300       --------------------------------------------
1301       IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
1302         RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
1303       ELSIF (x_return_status = G_RET_STS_ERROR) THEN
1304         RAISE FND_API.G_EXC_ERROR ;
1305       END IF;
1306       --------------------------------------------
1307      ELSIF l_doc_class = 'PO' THEN
1308       OKC_PO_INT_GRP.get_article_variable_values(
1309         p_api_version         => p_api_version ,
1310         p_init_msg_list       => p_init_msg_list,
1311         x_msg_data            => x_msg_data  ,
1312         x_msg_count           => x_msg_count ,
1313         x_return_status       => x_return_status,
1314 
1315         p_doc_type            => p_doc_type,
1316         p_doc_id              => p_doc_id,
1317         p_sys_var_value_tbl   => x_sys_var_value_tbl);
1318       --------------------------------------------
1319       IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
1320         RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
1321       ELSIF (x_return_status = G_RET_STS_ERROR) THEN
1322         RAISE FND_API.G_EXC_ERROR ;
1323       END IF;
1324       --------------------------------------------
1325      ELSIF l_doc_class = 'SOURCING' THEN
1326 
1327       OKC_PON_INT_GRP.get_article_variable_values(
1328         p_api_version         => p_api_version ,
1329         p_init_msg_list       => p_init_msg_list,
1330         x_msg_data            => x_msg_data  ,
1331         x_msg_count           => x_msg_count ,
1332         x_return_status       => x_return_status,
1333 
1334         p_doc_type            => p_doc_type,
1335         p_doc_id              => p_doc_id,
1336         p_sys_var_value_tbl   => x_sys_var_value_tbl);
1337       --------------------------------------------
1338       IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
1339         RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
1340       ELSIF (x_return_status = G_RET_STS_ERROR) THEN
1341         RAISE FND_API.G_EXC_ERROR ;
1342       END IF;
1343       --------------------------------------------
1344      ELSIF l_doc_class = 'QUOTE' THEN
1345 
1346       OKC_ASO_INT_GRP.get_article_variable_values(
1347         p_api_version         => p_api_version ,
1348         p_init_msg_list       => p_init_msg_list,
1349         x_msg_data            => x_msg_data  ,
1350         x_msg_count           => x_msg_count ,
1351         x_return_status       => x_return_status,
1352       --  p_doc_type            => p_doc_type,
1353         p_doc_id              => p_doc_id,
1354         p_sys_var_value_tbl   => x_sys_var_value_tbl);
1355 
1356       --------------------------------------------
1357       IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
1358         RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
1359       ELSIF (x_return_status = G_RET_STS_ERROR) THEN
1360         RAISE FND_API.G_EXC_ERROR ;
1361       END IF;
1362       --------------------------------------------
1363           --kkolukul:bug 6924032 Modified for Repository Enhancement
1364       ELSIF l_doc_class = 'REPOSITORY' THEN
1365 
1366        OKC_XPRT_REP_INT_PVT.get_clause_variable_values(
1367           p_api_version          => p_api_version,
1368           p_init_msg_list        => p_init_msg_list,
1369           p_doc_type             => p_doc_type,
1370           p_doc_id               => p_doc_id,
1371           p_sys_var_value_tbl    => x_sys_var_value_tbl,
1372           x_return_status        => x_return_status,
1373           x_msg_data             => x_msg_data,
1374           x_msg_count            => x_msg_count );
1375 
1376      --------------------------------------------
1377       IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
1378         RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
1379       ELSIF (x_return_status = G_RET_STS_ERROR) THEN
1380         RAISE FND_API.G_EXC_ERROR ;
1381       END IF;
1382       --------------------------------------------
1383 
1384     ELSE
1385       NULL;
1386     END IF;
1387 
1388     -- Standard call to get message count and if count is 1, get message info.
1389     FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
1390     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1391      FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'6600: Leaving Get_System_Variables');
1392     END IF;
1393    EXCEPTION
1394     WHEN FND_API.G_EXC_ERROR THEN
1395       ROLLBACK TO g_Get_System_Variables;
1396       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1397          FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'6700: Leaving Get_System_Variables : OKC_API.G_EXCEPTION_ERROR Exception');
1398       END IF;
1399       x_return_status := G_RET_STS_ERROR ;
1400       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
1401 
1402     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1403       ROLLBACK TO g_Get_System_Variables;
1404       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1405          FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'6800: Leaving Get_System_Variables : OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception');
1406       END IF;
1407       x_return_status := G_RET_STS_UNEXP_ERROR ;
1408       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
1409 
1410     WHEN OTHERS THEN
1411       ROLLBACK TO g_Get_System_Variables;
1412       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1413         FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'6900: Leaving Get_System_Variables because of EXCEPTION: '||sqlerrm);
1414       END IF;
1415 
1416       x_return_status := G_RET_STS_UNEXP_ERROR ;
1417       IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
1418         FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
1419       END IF;
1420       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
1421   END Get_System_Variables ;
1422 
1423 /*
1424 -- PROCEDURE Substitute_Var_Value_Globally
1425 -- to be called from T and C authoring UI to substitute variable value of any value
1426 -- for every occurance of variable on document
1427 */
1428   PROCEDURE Substitute_Var_Value_Globally (
1429     p_api_version       IN  NUMBER,
1430     p_init_msg_list     IN  VARCHAR2 :=  FND_API.G_FALSE,
1431 
1432     x_return_status     OUT NOCOPY VARCHAR2,
1433     x_msg_data          OUT NOCOPY VARCHAR2,
1434     x_msg_count         OUT NOCOPY NUMBER,
1435 
1436     p_doc_type          IN  VARCHAR2,
1437     p_doc_id            IN  NUMBER,
1438     p_variable_code     IN  VARCHAR2,
1439     p_variable_value    IN  VARCHAR2,
1440     p_variable_value_id IN  VARCHAR2,
1441     p_mode              IN  VARCHAR2,
1442     p_validate_commit   IN  VARCHAR2 :=  FND_API.G_TRUE,
1443     p_validation_string IN VARCHAR2 := NULL
1444   ) IS
1445     l_api_version       CONSTANT NUMBER := 1;
1446     l_api_name          CONSTANT VARCHAR2(30) := 'Substitute_Var_Value_Globally';
1447     l_dummy             VARCHAR2(10);
1448     CURSOR var_lst_crs IS
1449      SELECT cat_id, object_version_number
1450       FROM okc_k_art_variables
1451       WHERE variable_code=p_variable_code
1452         AND cat_id IN (SELECT id FROM okc_k_articles_b
1453                        WHERE document_type=p_doc_type AND document_id=p_doc_id);
1454     CURSOR art_lst_crs IS
1455      SELECT id, object_version_number
1456        FROM okc_k_articles_b a
1457        WHERE document_type=p_doc_type AND document_id=p_doc_id
1458          and EXISTS (SELECT '!' FROM okc_k_art_variables v
1459                       WHERE v.variable_code=p_variable_code AND v.cat_id = a.cat_id );
1460    BEGIN
1461     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1462        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'7000: Entered Substitute_Var_Value_Globally');
1463     END IF;
1464     -- Standard Start of API savepoint
1465     SAVEPOINT g_Subst_Var_Value_Globally;
1466     -- Standard call to check for call compatibility.
1467     IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
1468       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1469     END IF;
1470     -- Initialize message list if p_init_msg_list is set to TRUE.
1471     IF FND_API.to_Boolean( p_init_msg_list ) THEN
1472       FND_MSG_PUB.initialize;
1473     END IF;
1474     --  Initialize API return status to success
1475     x_return_status := G_RET_STS_SUCCESS;
1476 
1477     IF p_validate_commit = G_TRUE THEN
1478       l_dummy := OKC_TERMS_UTIL_GRP.Ok_To_Commit(
1479         p_api_version         => p_api_version ,
1480         p_init_msg_list       => p_init_msg_list,
1481         x_msg_data            => x_msg_data  ,
1482         x_msg_count           => x_msg_count ,
1483         x_return_status       => x_return_status,
1484 
1485         p_validation_string   => p_validation_string,
1486 --        p_tmpl_change         => 'D',
1487 
1488         p_doc_id              => p_doc_id,
1489         p_doc_type            => p_doc_type
1490       );
1491       --------------------------------------------
1492       IF (l_dummy = 'N' OR x_return_status = G_RET_STS_UNEXP_ERROR) THEN
1493         RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
1494        ELSIF (x_return_status = G_RET_STS_ERROR) THEN
1495         RAISE FND_API.G_EXC_ERROR ;
1496       END IF;
1497       --------------------------------------------
1498     END IF;
1499 
1500     FOR cr IN var_lst_crs LOOP
1501       OKC_K_ART_VARIABLES_PVT.update_row(
1502         x_return_status          => x_return_status,
1503         p_cat_id                 => cr.cat_id,
1504         p_variable_code          => p_variable_code,
1505         p_variable_type          => NULL,
1506         p_external_yn            => NULL,
1507         p_variable_value_id      => p_variable_value_id,
1508         p_variable_value         => p_variable_value,
1509         p_attribute_value_set_id => NULL,
1510         p_object_version_number  => cr.object_version_number
1511       );
1512       --------------------------------------------
1513       IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
1514         RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
1515        ELSIF (x_return_status = G_RET_STS_ERROR) THEN
1516         RAISE FND_API.G_EXC_ERROR ;
1517       END IF;
1518       --------------------------------------------
1519     END LOOP;
1520 
1521     IF p_mode = 'AMEND' THEN
1522       FOR cr IN art_lst_crs LOOP
1523         OKC_K_ARTICLES_PVT.update_row(
1524           x_return_status              => x_return_status,
1525           p_id                         => cr.id,
1526           p_sav_sae_id                 => NULL,
1527           p_document_type              => NULL,
1528           p_document_id                => NULL,
1529           p_source_flag                => NULL,
1530           p_mandatory_yn               => NULL,
1531           p_scn_id                     => NULL,
1532           p_label                      => NULL,
1533           p_amendment_description      => NULL,
1534           p_amendment_operation_code   => G_AMEND_CODE_UPDATED,
1535           p_article_version_id         => NULL,
1536           p_change_nonstd_yn           => NULL,
1537           p_orig_system_reference_code => NULL,
1538           p_orig_system_reference_id1  => NULL,
1539           p_orig_system_reference_id2  => NULL,
1540           p_display_sequence           => NULL,
1541           p_print_text_yn              => NULL,
1542           p_object_version_number      => cr.object_version_number
1543         );
1544         --------------------------------------------
1545         IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
1546           RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
1547         ELSIF (x_return_status = G_RET_STS_ERROR) THEN
1548           RAISE FND_API.G_EXC_ERROR ;
1549         END IF;
1550         --------------------------------------------
1551       END LOOP;
1552     END IF;
1553 
1554     -- Standard call to get message count and if count is 1, get message info.
1555     FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
1556     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1557      FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'7100: Leaving Substitute_Var_Value_Globally');
1558     END IF;
1559    EXCEPTION
1560     WHEN FND_API.G_EXC_ERROR THEN
1561       ROLLBACK TO g_Subst_Var_Value_Globally;
1562       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1563          FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'7200: Leaving Substitute_Var_Value_Globally : OKC_API.G_EXCEPTION_ERROR Exception');
1564       END IF;
1565       x_return_status := G_RET_STS_ERROR ;
1566       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
1567 
1568     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1569       ROLLBACK TO g_Subst_Var_Value_Globally;
1570       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1571          FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'7300: Leaving Substitute_Var_Value_Globally : OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception');
1572       END IF;
1573       x_return_status := G_RET_STS_UNEXP_ERROR ;
1574       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
1575 
1576     WHEN OTHERS THEN
1577       ROLLBACK TO g_Subst_Var_Value_Globally;
1578       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1579         FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'7400: Leaving Substitute_Var_Value_Globally because of EXCEPTION: '||sqlerrm);
1580       END IF;
1581 
1582       x_return_status := G_RET_STS_UNEXP_ERROR ;
1583       IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
1584         FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
1585       END IF;
1586       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
1587   END Substitute_Var_Value_Globally ;
1588 /*
1589 -- PROCEDURE Create_Unassigned_Section
1590 -- creating un-assigned sections in a document
1591 */
1592   PROCEDURE Create_Unassigned_Section (
1593     p_api_version       IN  NUMBER,
1594     p_init_msg_list     IN  VARCHAR2 :=  FND_API.G_FALSE,
1595     p_commit            IN  VARCHAR2 :=  FND_API.G_FALSE,
1596 
1597     x_return_status     OUT NOCOPY VARCHAR2,
1598     x_msg_data          OUT NOCOPY VARCHAR2,
1599     x_msg_count         OUT NOCOPY NUMBER,
1600 
1601     p_doc_type          IN  VARCHAR2,
1602     p_doc_id            IN  NUMBER,
1603 
1604     x_scn_id            OUT NOCOPY NUMBER
1605   ) IS
1606     l_api_version       CONSTANT NUMBER := 1;
1607     l_api_name          CONSTANT VARCHAR2(30) := 'Create_Unassigned_Section';
1608     l_meaning           VARCHAR2(100);
1609     l_sequence          NUMBER;
1610 
1611 Cursor l_get_max_seq_csr IS
1612 SELECT nvl(max(section_sequence),0)+10
1613 FROM OKC_SECTIONS_B
1614 WHERE DOCUMENT_TYPE= p_doc_type
1615 AND   DOCUMENT_ID  = p_doc_id
1616 AND   SCN_ID IS NULL;
1617 
1618    BEGIN
1619     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1620        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'7500: Entered Create_Unassigned_Section');
1621     END IF;
1622     -- Standard Start of API savepoint
1623     SAVEPOINT g_Create_Unassigned_Section;
1624     -- Standard call to check for call compatibility.
1625     IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
1626       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1627     END IF;
1628     -- Initialize message list if p_init_msg_list is set to TRUE.
1629     IF FND_API.to_Boolean( p_init_msg_list ) THEN
1630       FND_MSG_PUB.initialize;
1631     END IF;
1632     --  Initialize API return status to success
1633     x_return_status := G_RET_STS_SUCCESS;
1634 
1635     --------------------------------------------
1636     -- Call Simple API of okc_sections_b with following input
1637     -- doc_type=p_doc_type, doc_id=p_doc_id, scn_code=G_UNASSIGNED_SECTION_CODE,
1638     -- heading = < get meaning of G_UNASSIGNED_SECTION_CODE by quering fnd_lookups>.
1639     -- Set x_scn_id to id returned by simpel API.
1640     --------------------------------------------
1641     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1642        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'7600: Calling Simple API to Create a Section');
1643     END IF;
1644     --------------------------------------------
1645     l_meaning := Okc_Util.Decode_Lookup('OKC_ARTICLE_SECTION',G_UNASSIGNED_SECTION_CODE);
1646 
1647 --Bug 3669528 Unassigned section should always come at the bottom, so use a 'high' value
1648 /*
1649     OPEN  l_get_max_seq_csr;
1650     FETCH l_get_max_seq_csr INTO l_sequence;
1651     CLOSE l_get_max_seq_csr;
1652 */
1653     l_sequence:= 9999;
1654 
1655     OKC_TERMS_SECTIONS_PVT.insert_row(
1656       x_return_status              => x_return_status,
1657       p_id                         => NULL,
1658       p_section_sequence           => l_sequence,
1659       p_label                      => NULL,
1660       p_scn_id                     => NULL,
1661       p_heading                    => l_meaning,
1662       p_description                => l_meaning,
1663       p_document_type              => p_doc_type,
1664       p_document_id                => p_doc_id,
1665       p_scn_code                   => G_UNASSIGNED_SECTION_CODE,
1666       p_amendment_description      => NULL,
1667       p_amendment_operation_code   => NULL,
1668       p_orig_system_reference_code => NULL,
1669       p_orig_system_reference_id1  => NULL,
1670       p_orig_system_reference_id2  => NULL,
1671       p_print_yn                   => 'N',
1672       x_id                         => x_scn_id
1673     );
1674     --------------------------------------------
1675     IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
1676       RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
1677     ELSIF (x_return_status = G_RET_STS_ERROR) THEN
1678       RAISE FND_API.G_EXC_ERROR ;
1679     END IF;
1680     --------------------------------------------
1681 
1682     IF FND_API.To_Boolean( p_commit ) THEN
1683       COMMIT WORK;
1684     END IF;
1685     -- Standard call to get message count and if count is 1, get message info.
1686     FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
1687     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1688      FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'7700: Leaving Create_Unassigned_Section');
1689     END IF;
1690    EXCEPTION
1691     WHEN FND_API.G_EXC_ERROR THEN
1692       ROLLBACK TO g_Create_Unassigned_Section;
1693       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1694          FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'7800: Leaving Create_Unassigned_Section : OKC_API.G_EXCEPTION_ERROR Exception');
1695       END IF;
1696 
1697       IF l_get_max_seq_csr%ISOPEN THEN
1698          CLOSE l_get_max_seq_csr;
1699       END IF;
1700 
1701       x_return_status := G_RET_STS_ERROR ;
1702       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
1703 
1704     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1705       ROLLBACK TO g_Create_Unassigned_Section;
1706       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1707          FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'7900: Leaving Create_Unassigned_Section : OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception');
1708       END IF;
1709 
1710       IF l_get_max_seq_csr%ISOPEN THEN
1711          CLOSE l_get_max_seq_csr;
1712       END IF;
1713 
1714       x_return_status := G_RET_STS_UNEXP_ERROR ;
1715       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
1716 
1717     WHEN OTHERS THEN
1718       ROLLBACK TO g_Create_Unassigned_Section;
1719       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1720         FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'8000: Leaving Create_Unassigned_Section because of EXCEPTION: '||sqlerrm);
1721       END IF;
1722 
1723       IF l_get_max_seq_csr%ISOPEN THEN
1724          CLOSE l_get_max_seq_csr;
1725       END IF;
1726 
1727       x_return_status := G_RET_STS_UNEXP_ERROR ;
1728       IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
1729         FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
1730       END IF;
1731       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
1732   END Create_Unassigned_Section ;
1733 /*
1734 -- To Check if document type is valid
1735 */
1736 FUNCTION is_doc_type_valid(
1737 p_doc_type      IN  VARCHAR2,
1738 x_return_status OUT NOCOPY VARCHAR2
1739 ) RETURN  VARCHAR2 IS
1740 l_dummy    VARCHAR2(1)  := '?';
1741 l_return   VARCHAR2(1) := FND_API.G_TRUE;
1742 cursor l_check_doc_type_crs IS
1743 SELECT 'X' FROM OKC_BUS_DOC_TYPES_B
1744            WHERE document_type=p_doc_type;
1745 BEGIN
1746 
1747 OPEN  l_check_doc_type_crs;
1748 FETCH l_check_doc_type_crs INTO l_dummy;
1749 IF l_check_doc_type_crs%NOTFOUND THEN
1750    return FND_API.G_FALSE;
1751 ELSE
1752    return FnD_API.G_TRUE;
1753 END IF;
1754 
1755 CLOSE l_check_doc_type_crs;
1756 
1757 return l_return;
1758 x_return_status := G_RET_STS_SUCCESS ;
1759 
1760 EXCEPTION
1761 WHEN OTHERS THEN
1762 
1763 IF l_check_doc_type_crs%ISOPEN THEN
1764    CLOSE l_check_doc_type_crs;
1765 END IF;
1766 return  FND_API.G_FALSE;
1767 x_return_status := G_RET_STS_UNEXP_ERROR ;
1768 
1769 END;
1770 /*
1771 -- FUNCTION Get_Message
1772 -- to be used to put tokens in messages code and return translated messaged.
1773 -- It will be mainly used by QA API.                  |
1774 */
1775   FUNCTION Get_Message (
1776     p_app_name       IN VARCHAR2,
1777     p_msg_name       IN VARCHAR2,
1778     p_token1         IN VARCHAR2,
1779     p_token1_value   IN VARCHAR2,
1780     p_token2         IN VARCHAR2,
1781     p_token2_value   IN VARCHAR2,
1782     p_token3         IN VARCHAR2,
1783     p_token3_value   IN VARCHAR2,
1784     p_token4         IN VARCHAR2,
1785     p_token4_value   IN VARCHAR2,
1786     p_token5         IN VARCHAR2,
1787     p_token5_value   IN VARCHAR2,
1788     p_token6         IN VARCHAR2,
1789     p_token6_value   IN VARCHAR2,
1790     p_token7         IN VARCHAR2,
1791     p_token7_value   IN VARCHAR2,
1792     p_token8         IN VARCHAR2,
1793     p_token8_value   IN VARCHAR2,
1794     p_token9         IN VARCHAR2,
1795     p_token9_value   IN VARCHAR2,
1796     p_token10        IN VARCHAR2,
1797     p_token10_value  IN VARCHAR2
1798   ) RETURN VARCHAR2 IS
1799   BEGIN
1800     Fnd_Message.Set_Name( p_app_name, p_msg_name );
1801     IF (p_token1 IS NOT NULL) AND (p_token1_value IS NOT NULL) THEN
1802       Fnd_Message.Set_Token( token => p_token1, value => p_token1_value);
1803     END IF;
1804     IF (p_token2 IS NOT NULL) AND (p_token2_value IS NOT NULL) THEN
1805       Fnd_Message.Set_Token( token => p_token2, value => p_token2_value);
1806     END IF;
1807     IF (p_token3 IS NOT NULL) AND (p_token3_value IS NOT NULL) THEN
1808       Fnd_Message.Set_Token( token => p_token3, value => p_token3_value);
1809     END IF;
1810     IF (p_token4 IS NOT NULL) AND (p_token4_value IS NOT NULL) THEN
1811       Fnd_Message.Set_Token( token => p_token4, value => p_token4_value);
1812     END IF;
1813     IF (p_token5 IS NOT NULL) AND (p_token5_value IS NOT NULL) THEN
1814       Fnd_Message.Set_Token( token => p_token5, value => p_token5_value);
1815     END IF;
1816     IF (p_token6 IS NOT NULL) AND (p_token6_value IS NOT NULL) THEN
1817       Fnd_Message.Set_Token( token => p_token6, value => p_token6_value);
1818     END IF;
1819     IF (p_token7 IS NOT NULL) AND (p_token7_value IS NOT NULL) THEN
1820       Fnd_Message.Set_Token( token => p_token7, value => p_token7_value);
1821     END IF;
1822     IF (p_token8 IS NOT NULL) AND (p_token8_value IS NOT NULL) THEN
1823       Fnd_Message.Set_Token( token => p_token8, value => p_token8_value);
1824     END IF;
1825     IF (p_token9 IS NOT NULL) AND (p_token9_value IS NOT NULL) THEN
1826       Fnd_Message.Set_Token( token => p_token9, value => p_token9_value);
1827     END IF;
1828     IF (p_token10 IS NOT NULL) AND (p_token10_value IS NOT NULL) THEN
1829       Fnd_Message.Set_Token( token => p_token10, value => p_token10_value);
1830     END IF;
1831     RETURN Fnd_Message.Get;
1832 
1833   END Get_Message;
1834 
1835 /* Modified Cursor for Bug 4956969 */
1836 Function Get_latest_art_version(p_article_id  IN NUMBER,
1837                             p_org_id IN NUMBER,
1838                             p_eff_date IN DATE)
1839   RETURN Varchar2 IS
1840   l_display_name okc_article_versions.display_name%TYPE;
1841   l_global_org_id number;
1842   CURSOR ver_csr IS
1843   SELECT nvl(ver.display_name,art.article_title) name
1844   FROM okc_articles_all art,
1845        okc_article_versions ver
1846   WHERE art.org_id = p_org_id
1847   AND art.article_id = p_article_id
1848   AND art.article_id = ver.article_id
1849   AND ver.start_date <= nvl(p_eff_date,sysdate)
1850   AND ver.start_date = (select max(start_date)
1851                             from okc_article_versions ver1
1852                             where ver1.article_id = ver.article_id
1853                             and ver1.start_date <= nvl(p_eff_date,sysdate)
1854 					   and ver1.article_status = ver.article_status)
1855   AND (ver.article_status = 'APPROVED' OR
1856       not exists (select 1
1857                   from okc_article_versions ver2
1858                   where ver2.article_id = art.article_id
1859                   and ver2.start_date <= nvl(p_eff_date,sysdate)
1860                   and ver2.article_status = 'APPROVED'));
1861 
1862 BEGIN
1863     Open ver_csr;
1864     Fetch ver_csr Into l_display_name;
1865     Close ver_csr;
1866     Return l_display_name;
1867 End Get_latest_art_version;
1868 
1869 /* Modified Cursor for Bug 4956969 */
1870 Function Get_latest_tmpl_art_version_id(p_article_id  IN NUMBER,
1871            p_eff_date IN DATE)
1872   RETURN NUMBER IS
1873   l_article_version_id okc_article_versions.article_version_id%TYPE;
1874   CURSOR ver_csr IS
1875   SELECT ver.article_version_id
1876   FROM okc_articles_all art,
1877        okc_article_versions ver
1878   WHERE art.article_id = p_article_id
1879   AND art.article_id = ver.article_id
1880   AND ver.start_date <= nvl(p_eff_date,sysdate)
1881   AND ver.start_date = (select max(start_date)
1882                             from okc_article_versions ver1
1883                             where ver1.article_id = ver.article_id
1884                             and ver1.start_date <= nvl(p_eff_date,sysdate)
1885 					   and ver1.article_status = ver.article_status)
1886   AND (ver.article_status = 'APPROVED' OR
1887        not exists (select 1
1888                   from okc_article_versions ver2
1889                   where ver2.article_id = art.article_id
1890                   and ver2.start_date <= nvl(p_eff_date,sysdate)
1891                   and ver2.article_status = 'APPROVED'));
1892 BEGIN
1893   Open ver_csr;
1894   Fetch ver_csr Into l_article_version_id;
1895   Close ver_csr;
1896   Return l_article_version_id;
1897 End Get_latest_tmpl_art_version_id;
1898 
1899 
1900 /*********************************
1901 -- FUNCTION Get_alternate_yn
1902 --
1903 *********************************/
1904 Function Get_alternate_yn(p_article_id  IN NUMBER,
1905                             p_org_id IN NUMBER)
1906   RETURN Varchar2 IS
1907 
1908   l_alternate_yn varchar(1) := 'N';
1909   l_global_org_id number;
1910 
1911   CURSOR alt_csr IS
1912   SELECT 1
1913   FROM dual
1914   WHERE exists (select 1
1915                 from OKC_ARTICLE_RELATNS_ALL
1916                 where org_id = p_org_id
1917                 and source_article_id = p_article_id
1918                 and relationship_type = 'ALTERNATE');
1919 BEGIN
1920     Open alt_csr;
1921     Fetch alt_csr Into l_alternate_yn;
1922     if alt_csr%found then
1923       l_alternate_yn := 'Y';
1924     else
1925       l_alternate_yn := 'N';
1926     end if;
1927     Close alt_csr;
1928     Return l_alternate_yn;
1929 
1930 End Get_alternate_yn;
1931 
1932 
1933 /*********************************
1934 -- FUNCTION Tmpl_Intent_Editable
1935 --
1936 *********************************/
1937 Function Tmpl_Intent_Editable(p_template_id  IN NUMBER)
1938   RETURN Varchar2 IS
1939 
1940   l_editable_yn varchar(1) := 'N';
1941   l_deliverables_exist varchar2(250);
1942   x_return_status varchar2(150);
1943   x_msg_data varchar2(2000);
1944   x_msg_count number;
1945 
1946   CURSOR editable_csr IS
1947   SELECT 1
1948   FROM okc_terms_templates_all
1949   WHERE template_id = p_template_id
1950   AND working_copy_flag = 'Y'
1951   UNION ALL
1952   SELECT 1
1953   FROM okc_allowed_tmpl_usages
1954   WHERE template_id = p_template_id
1955   UNION ALL
1956   SELECT 1
1957   FROM okc_k_articles_b
1958   WHERE document_type = 'TEMPLATE'
1959   AND   document_id = p_template_id;
1960 
1961 BEGIN
1962   Open editable_csr;
1963   Fetch editable_csr Into l_editable_yn;
1964     if editable_csr%found then
1965       l_editable_yn := 'N';
1966     else
1967       l_editable_yn := 'Y';
1968     end if;
1969   Close editable_csr;
1970   IF l_editable_yn = 'Y' THEN
1971     l_deliverables_exist :=  okc_terms_util_grp.Is_Deliverable_Exist(
1972          p_api_version      => 1,
1973          p_init_msg_list    =>  FND_API.G_FALSE,
1974          x_return_status    => x_return_status,
1975          x_msg_data         => x_msg_data,
1976          x_msg_count        => x_msg_count,
1977          p_doc_type         => 'TEMPLATE',
1978          p_doc_id           => p_template_id);
1979     IF  UPPER(nvl(l_deliverables_exist,'NONE')) <> 'NONE' THEN
1980       l_editable_yn := 'N';
1981     END IF;
1982   END IF;
1983   Return l_editable_yn;
1984 
1985 End Tmpl_Intent_Editable;
1986 
1987 
1988 
1989 /*********************************
1990 -- FUNCTION Has_Alternates
1991 --
1992 *********************************/
1993 Function Has_Alternates(p_article_id  IN NUMBER,
1994                         p_eff_date IN DATE,
1995                         p_document_type IN VARCHAR2)
1996   RETURN Varchar2 IS
1997 
1998   l_alternate_yn varchar(1) := 'N';
1999 
2000   CURSOR alt_csr IS
2001   SELECT 1
2002   FROM okc_article_relatns_all reln,
2003        okc_article_versions ver
2004   WHERE reln.source_article_id = p_article_id
2005   AND reln.relationship_type = 'ALTERNATE'
2006   AND reln.target_article_id = ver.article_id
2007   AND NVL(p_eff_date,SYSDATE) BETWEEN ver.start_date AND NVL(ver.end_date, nvl(p_eff_date,SYSDATE))
2008   AND ver.article_status = 'APPROVED'
2009   AND reln.org_id = mo_global.get_current_org_id()
2010   AND ( ver.provision_yn = 'N' OR
2011         ( p_document_type IN (select document_type
2012                                 from okc_bus_doc_types_b
2013                                where provision_allowed_yn = 'Y'
2014                              )
2015         )
2016       );
2017 
2018 BEGIN
2019     Open alt_csr;
2020     Fetch alt_csr Into l_alternate_yn;
2021     if alt_csr%found then
2022       l_alternate_yn := 'Y';
2023     else
2024       l_alternate_yn := 'N';
2025     end if;
2026     Close alt_csr;
2027     Return l_alternate_yn;
2028 
2029 End Has_alternates;
2030 
2031 FUNCTION Has_Alternates(p_article_id  IN NUMBER,
2032                         p_start_date IN DATE,
2033                         p_end_date IN DATE,
2034                         p_org_id IN NUMBER,
2035                         p_document_type IN VARCHAR2)
2036   RETURN Varchar2 IS
2037 
2038   l_effective_date DATE;
2039   l_alternate_yn varchar(1) := 'N';
2040 
2041   CURSOR alt_csr(cp_effective_date DATE) IS
2042   SELECT 1
2043   FROM   okc_article_relatns_all reln,
2044          okc_article_versions ver,
2045      okc_articles_all art
2046   WHERE  reln.source_article_id = p_article_id
2047   AND    reln.relationship_type = 'ALTERNATE'
2048   AND    reln.target_article_id = art.article_id
2049   AND    art.article_id = ver.article_id
2050   AND    cp_effective_date BETWEEN ver.start_date AND NVL(ver.end_date, cp_effective_date)
2051   AND ( ( p_document_type = 'TEMPLATE')  OR  ( ver.article_status IN ('APPROVED','ON_HOLD')) )
2052   AND reln.org_id = p_org_id
2053   AND ( (p_org_id = art.org_id
2054     )
2055         OR
2056         ( exists ( SELECT 1
2057                    FROM   okc_article_ADOPTIONS ADP
2058                    WHERE  adp.global_article_version_id = ver.article_version_id
2059                    AND    adp.adoption_type = 'ADOPTED'
2060                    AND    adp.local_org_id = p_org_id
2061                    AND    adp.adoption_status IN ( 'APPROVED', 'ON_HOLD')
2062          )
2063         )
2064       )
2065   AND ( ver.provision_yn = 'N' OR
2066         ( p_document_type
2067       IN ( SELECT document_type
2068                FROM okc_bus_doc_types_b
2069                WHERE provision_allowed_yn = 'Y'
2070              )
2071         )
2072       );
2073 
2074 BEGIN
2075   IF p_document_type = 'TEMPLATE' THEN
2076     IF ((p_end_date IS NULL) OR (TRUNC(p_end_date) >= TRUNC(SYSDATE)))  THEN
2077       IF TRUNC(p_start_date) < TRUNC(SYSDATE) THEN
2078         l_effective_date := TRUNC(SYSDATE);
2079       ELSE
2080         l_effective_date := TRUNC(p_start_date);
2081       END IF;
2082     ELSIF TRUNC(p_end_date) < TRUNC(SYSDATE) THEN
2083       l_effective_date := TRUNC(p_end_date);
2084     END IF;
2085   ELSE
2086     l_effective_date := NVL(p_start_date,TRUNC(SYSDATE));
2087   END IF;
2088 
2089   OPEN alt_csr(l_effective_date);
2090   FETCH alt_csr Into l_alternate_yn;
2091     IF alt_csr%found then
2092       l_alternate_yn := 'Y';
2093     ELSE
2094       l_alternate_yn := 'N';
2095     END IF;
2096   CLOSE alt_csr;
2097   RETURN l_alternate_yn;
2098 
2099 END Has_alternates;
2100 
2101 FUNCTION Has_amendments(p_document_id  IN NUMBER,
2102                         p_document_type IN VARCHAR2,
2103             p_document_version IN NUMBER)
2104   RETURN Varchar2 IS
2105   l_amendment VARCHAR2(150);
2106   l_return_status VARCHAR2(150);
2107   l_msg_data VARCHAR2(2000);
2108   l_msg_count NUMBER;
2109 
2110   CURSOR l_art_amendment_csr IS
2111   SELECT 1
2112   FROM okc_k_articles_b kart,
2113        okc_template_usages usg
2114   WHERE usg.document_type = p_document_type
2115   AND usg.document_id = p_document_id
2116   AND usg.document_type = kart.document_type
2117   AND usg.document_id = kart.document_id
2118   AND NVL(usg.contract_source_code,'STRUCTURED') = 'STRUCTURED'
2119   AND (kart.amendment_operation_code IS NOT NULL OR
2120       kart.summary_amend_operation_code IS NOT NULL)
2121   UNION ALL
2122   SELECT 1
2123   FROM okc_sections_b scn,
2124        okc_template_usages usg
2125   WHERE usg.document_type = p_document_type
2126   AND usg.document_id = p_document_id
2127   AND NVL(usg.contract_source_code,'STRUCTURED') = 'STRUCTURED'
2128   AND usg.document_type = scn.document_type
2129   AND usg.document_id = scn.document_id
2130   AND (scn.amendment_operation_code IS NOT NULL OR
2131       scn.summary_amend_operation_code IS NOT NULL)
2132   UNION ALL
2133   SELECT 1
2134   FROM okc_contract_docs kdoc,
2135        okc_template_usages usg
2136   WHERE usg.document_type = p_document_type
2137   AND usg.document_id = p_document_id
2138   AND usg.document_type = kdoc.business_document_type
2139   AND usg.document_id = kdoc.business_document_id
2140   AND NVL(usg.contract_source_code,'STRUCTURED') = 'ATTACHED'
2141   AND kdoc.primary_contract_doc_flag = 'Y'
2142   AND kdoc.delete_flag = 'Y'
2143   AND kdoc.effective_from_version = p_document_version
2144   AND ((NVL(p_document_version, -99) = -99)
2145         OR
2146         (
2147      exists (SELECT 1
2148              FROM
2149          OKC_TEMPLATE_USAGES_H usgH
2150        WHERE
2151          usgH.document_type = p_document_type
2152          AND usgH.document_id = p_document_id
2153          AND usgH.major_version < p_document_version
2154       )
2155       )
2156    )
2157   UNION ALL
2158   SELECT 1
2159   FROM okc_contract_docs kdoc,
2160        okc_template_usages usg
2161   WHERE usg.document_type = p_document_type
2162   AND usg.document_id = p_document_id
2163   AND usg.document_type = kdoc.business_document_type
2164   AND usg.document_id = kdoc.business_document_id
2165   AND NVL(usg.contract_source_code,'STRUCTURED') = 'ATTACHED'
2166   AND kdoc.primary_contract_doc_flag = 'Y'
2167   AND kdoc.business_document_type = kdoc.effective_from_type
2168   AND kdoc.business_document_id = kdoc.effective_from_id
2169   AND kdoc.business_document_version = kdoc.effective_from_version
2170   AND ((kdoc.effective_from_version > 0 and
2171         kdoc.effective_from_version = p_document_version)OR
2172         kdoc.effective_from_version = -99)
2173   AND ((NVL(p_document_version, -99) = -99)
2174         OR
2175         (
2176      exists (SELECT 1
2177              FROM
2178          OKC_TEMPLATE_USAGES_H usgH
2179        WHERE
2180          usgH.document_type = p_document_type
2181          AND usgH.document_id = p_document_id
2182          AND usgH.major_version < p_document_version
2183       )
2184       )
2185    )
2186     ;
2187 BEGIN
2188   OPEN l_art_amendment_csr;
2189   FETCH l_art_amendment_csr INTO l_amendment;
2190   IF l_art_amendment_csr%FOUND THEN
2191     RETURN 'Y';
2192   END IF;
2193   CLOSE l_art_amendment_csr;
2194 
2195 
2196   l_amendment :=
2197   OKC_DELIVERABLE_PROCESS_PVT.deliverables_amended(
2198                  p_api_version      => 1,
2199                  p_init_msg_list    => FND_API.G_FALSE,
2200 
2201                  x_return_status    => l_return_status,
2202                  x_msg_data        => l_msg_data,
2203                  x_msg_count        => l_msg_count,
2204 
2205                  p_doctype  => p_document_type,
2206                  p_docid => p_document_id);
2207 
2208 
2209   IF NVL(l_amendment,'NONE') = 'NONE' THEN
2210     RETURN 'N';
2211   ELSE
2212     RETURN 'Y';
2213   END IF;
2214 EXCEPTION
2215   WHEN OTHERS THEN
2216     RETURN 'N';
2217 END Has_amendments;
2218 
2219 
2220 
2221 
2222 
2223 /*********************************
2224 -- FUNCTION get_summary_amend_code
2225 --
2226 *********************************/
2227 FUNCTION get_summary_amend_code(
2228    p_existing_summary_code IN VARCHAR2,
2229    p_existing_operation_code IN VARCHAR2, -- we don't need the parameter, but keep it for compatibility
2230    p_amend_operation_code  IN VARCHAR2
2231   ) return  VARCHAR2 IS
2232   l_new_summary_code OKC_K_ARTICLES_B.SUMMARY_AMEND_OPERATION_CODE%TYPE;
2233 
2234 BEGIN
2235 
2236    IF p_existing_summary_code='ADDED' AND p_amend_operation_code ='DELETED' THEN
2237      l_new_summary_code:=FND_API.G_MISS_CHAR; -- Summary should be set to NULL
2238     ELSIF p_existing_summary_code='ADDED' AND p_amend_operation_code = 'UPDATED' THEN
2239      l_new_summary_code:=p_existing_summary_code;
2240     ELSIF p_existing_summary_code='DELETED' AND p_amend_operation_code = 'UPDATED' THEN
2241      l_new_summary_code:=p_existing_summary_code;
2242     ELSIF p_existing_summary_code='DELETED' AND p_amend_operation_code = 'ADDED' THEN
2243      l_new_summary_code:=FND_API.G_MISS_CHAR;
2244     ELSE
2245      l_new_summary_code := p_amend_operation_code;
2246    END IF;
2247 
2248    return l_new_summary_code;
2249 
2250 END get_summary_amend_code;
2251 
2252 /*********************************
2253 -- FUNCTION get_actual_summary_amend_code
2254 -- Wraps get_summary_amend_code and replaces G_MISS_CHAR with null
2255 *********************************/
2256 FUNCTION get_actual_summary_amend_code(
2257    p_existing_summary_code IN VARCHAR2,
2258    p_existing_operation_code IN VARCHAR2,
2259    p_amend_operation_code  IN VARCHAR2
2260   ) return  VARCHAR2 IS
2261   l_new_summary_code OKC_K_ARTICLES_B.SUMMARY_AMEND_OPERATION_CODE%TYPE;
2262 
2263 BEGIN
2264          l_new_summary_code:=get_summary_amend_code(p_existing_summary_code=>p_existing_summary_code,
2265                   p_existing_operation_code=>p_existing_operation_code,
2266                   p_amend_operation_code=>p_amend_operation_code);
2267 
2268      if l_new_summary_code = FND_API.G_MISS_CHAR then
2269     return NULL;
2270      end if;
2271 
2272      return l_new_summary_code;
2273 END get_actual_summary_amend_code;
2274 
2275 
2276 
2277 /*********************************
2278 -- FUNCTION get_article_version_number
2279 --
2280 *********************************/
2281 FUNCTION get_article_version_number(p_art_version_id IN NUMBER)
2282   RETURN Varchar2 IS
2283 CURSOR csr_art_ver IS
2284 SELECT article_version_number
2285 FROM okc_article_versions
2286 WHERE article_version_id = p_art_version_id;
2287 
2288 l_article_version_number VARCHAR2(240);
2289 
2290 BEGIN
2291  OPEN csr_art_ver;
2292    FETCH csr_art_ver INTO l_article_version_number;
2293  CLOSE csr_art_ver;
2294  RETURN l_article_version_number;
2295 END get_article_version_number;
2296 
2297 /*********************************
2298 -- FUNCTION get_section_label
2299 --
2300 *********************************/
2301 FUNCTION get_section_label(p_scn_id IN NUMBER)
2302   RETURN Varchar2 IS
2303 CURSOR csr_section_label IS
2304 SELECT heading
2305 FROM okc_sections_b
2306 WHERE id = p_scn_id;
2307 
2308 l_label VARCHAR2(240);
2309 
2310 BEGIN
2311  OPEN csr_section_label;
2312    FETCH csr_section_label INTO l_label;
2313  CLOSE csr_section_label;
2314  RETURN l_label;
2315 END get_section_label;
2316 
2317 /*********************************
2318 -- FUNCTION get_latest_art_version_no
2319 --
2320 *********************************/
2321 FUNCTION get_latest_art_version_no(
2322   p_article_id IN NUMBER,
2323   p_document_type IN VARCHAR2,
2324   p_document_id IN NUMBER )
2325 RETURN Varchar2 IS
2326 
2327 l_article_version_number VARCHAR2(240);
2328 l_article_version_id  NUMBER;
2329 l_local_article_id NUMBER;
2330 l_adoption_type VARCHAR2(100);
2331 
2332 BEGIN
2333 
2334  get_latest_article_details
2335  (
2336   p_article_id  => p_article_id,
2337   p_document_type => p_document_type,
2338   p_document_id => p_document_id,
2339   x_article_version_id => l_article_version_id,
2340   x_article_version_number => l_article_version_number,
2341   x_local_article_id => l_local_article_id,
2342   x_adoption_type => l_adoption_type
2343  );
2344 
2345  RETURN l_article_version_number;
2346 
2347 END get_latest_art_version_no;
2348 
2349 /*********************************
2350 -- FUNCTION get_latest_art_version_id
2351 --
2352 *********************************/
2353 FUNCTION get_latest_art_version_id(
2354   p_article_id IN NUMBER,
2355   p_document_type IN VARCHAR2,
2356   p_document_id IN NUMBER )
2357 RETURN NUMBER IS
2358 
2359 l_article_version_number VARCHAR2(240);
2360 l_article_version_id  NUMBER;
2361 l_local_article_id NUMBER;
2362 l_adoption_type VARCHAR2(100);
2363 
2364 BEGIN
2365 
2366  get_latest_article_details
2367  (
2368   p_article_id  => p_article_id,
2369   p_document_type => p_document_type,
2370   p_document_id => p_document_id,
2371   x_article_version_id => l_article_version_id,
2372   x_article_version_number => l_article_version_number,
2373   x_local_article_id => l_local_article_id,
2374   x_adoption_type => l_adoption_type
2375  );
2376 
2377  RETURN l_article_version_id;
2378 
2379 END get_latest_art_version_id;
2380 
2381 /*********************************
2382 -- FUNCTION get_article_name
2383 --
2384 *********************************/
2385 FUNCTION get_article_name(
2386  p_article_id IN NUMBER,
2387  p_article_version_id IN NUMBER)
2388 RETURN Varchar2 IS
2389 
2390 CURSOR csr_article_title IS
2391 SELECT a.article_title, a.article_number
2392 FROM okc_articles_all a
2393 WHERE a.article_id = p_article_id;
2394 
2395 CURSOR csr_article_display_name IS
2396 SELECT a.display_name
2397 FROM okc_article_versions a
2398 WHERE a.article_version_id = p_article_version_id;
2399 
2400 l_article_title VARCHAR2(450) :='';
2401 l_article_number VARCHAR2(450) :='';
2402 l_display_name VARCHAR2(450) :='';
2403 l_article_name VARCHAR2(1000) :='';
2404 
2405 BEGIN
2406 
2407   OPEN csr_article_title;
2408     FETCH csr_article_title INTO l_article_title, l_article_number;
2409   CLOSE csr_article_title;
2410 
2411   OPEN csr_article_display_name;
2412     FETCH csr_article_display_name INTO l_display_name;
2413   CLOSE csr_article_display_name;
2414 
2415  IF g_concat_art_no = 'Y' THEN
2416     IF l_article_number IS NOT NULL THEN
2417        l_article_number := l_article_number||':';
2418     END IF;
2419     l_article_name := NVL(l_article_number,'')||NVL(l_display_name,l_article_title);
2420  ELSE
2421     l_article_name := NVL(l_display_name,l_article_title);
2422  END IF;
2423 
2424  RETURN l_article_name;
2425 END get_article_name;
2426 
2427 /*********************************
2428 -- FUNCTION GET_SECTION_NAME
2429 --
2430 *********************************/
2431 FUNCTION GET_SECTION_NAME(
2432             p_CONTEXT IN VARCHAR2,
2433             p_ID IN NUMBER
2434                 )
2435     RETURN VARCHAR2 IS
2436 
2437        -- Fix for Bug 5377982
2438 	  -- l_name varchar2(80) := null;
2439 	     l_name   OKC_SECTIONS_B.HEADING%TYPE := null;
2440 
2441 
2442 
2443          cursor section_cur(l_section_id NUMBER) is
2444          select HEADING FROM OKC_SECTIONS_B WHERE ID = l_section_id ;
2445 
2446          cursor section_for_article_id(l_article_id NUMBER) is
2447          select HEADING FROM OKC_SECTIONS_B WHERE ID = (select scn_id from okc_k_articles_b where id = l_article_id) ;
2448 
2449 
2450     BEGIN
2451 
2452     if p_CONTEXT = 'SECTION' THEN
2453         Open  section_cur(p_ID);
2454         fetch section_cur into l_name;
2455         close section_cur;
2456     elsif p_CONTEXT = 'ARTICLE' THEN
2457         Open  section_for_article_id(p_ID);
2458         fetch section_for_article_id into l_name;
2459         close section_for_article_id;
2460     else
2461         l_name := null;
2462     end if;
2463 
2464     return(l_name);
2465 
2466 
2467     END GET_SECTION_NAME;
2468 
2469 /*********************************
2470 -- FUNCTION GET_SECTION_NAME - given article_version_id returns the default section or the Unassinged Section name
2471 --
2472 *********************************/
2473 
2474 
2475   FUNCTION GET_SECTION_NAME(p_article_version_id NUMBER)
2476     RETURN VARCHAR2 IS
2477 
2478     --l_name varchar2(80) := null;
2479     l_name   FND_LOOKUPS.MEANING%TYPE := null;
2480     l_article_version_id NUMBER;
2481     cursor get_default_section_name(l_article_version_id NUMBER) is
2482     select meaning from fnd_lookups where lookup_type = 'OKC_ARTICLE_SECTION' and lookup_code = (
2483     select default_section from okc_article_versions where article_version_id = l_article_version_id);
2484 
2485     cursor get_unassigned_section_name is
2486       select meaning from fnd_lookups where lookup_type = 'OKC_ARTICLE_SECTION' and
2487          lookup_code = 'UNASSIGNED';
2488 
2489 
2490     BEGIN
2491 
2492            open get_default_section_name(p_article_version_id);
2493            fetch get_default_section_name into l_name;
2494            if get_default_section_name%NOTFOUND or l_name is null THEN
2495              open get_unassigned_section_name;
2496               fetch get_unassigned_section_name into l_name;
2497               close get_unassigned_section_name;
2498            end if;
2499            close get_default_section_name;
2500     return(l_name);
2501     END GET_SECTION_NAME;
2502 
2503 /*********************************
2504   FUNCTION GET_SECTION_NAME - returns Default section for article_version
2505   or one defined in expert enabled template.
2506   Parameters: p_article_version_id
2507           p_template_id
2508 **********************************/
2509 
2510 function get_section_name(p_article_version_id IN Number,
2511            p_template_id in Number)
2512  return varchar2 is
2513  --l_name varchar2(80);
2514  l_name FND_LOOKUPS.MEANING%TYPE;
2515 
2516  cursor get_article_section_name(l_article_version_id NUMBER) is
2517  select meaning from fnd_lookups
2518   where lookup_type = 'OKC_ARTICLE_SECTION'
2519     and lookup_code = (select default_section from okc_article_versions
2520                         where article_version_id = l_article_version_id);
2521 
2522  cursor get_expert_section_name(l_template_id NUMBER) is
2523  select meaning from fnd_lookups
2524   where lookup_type = 'OKC_ARTICLE_SECTION'
2525     and lookup_code = (select xprt_scn_code from okc_terms_templates_all
2526                         where template_id = l_template_id);
2527 
2528  cursor get_unassigned_section_name is
2529  select meaning from fnd_lookups where lookup_type = 'OKC_ARTICLE_SECTION'
2530     and lookup_code = 'UNASSIGNED';
2531 
2532  Begin
2533 
2534     Open get_article_section_name(p_article_version_id);
2535     Fetch get_article_section_name into l_name;
2536 
2537     If get_article_section_name%FOUND and l_name is NOT NULL then
2538         close get_article_section_name;
2539         return l_name;
2540     end if;
2541 
2542     Open get_expert_section_name (p_template_id);
2543     Fetch get_expert_section_name into l_name;
2544 
2545     If get_expert_section_name%FOUND and l_name is NOT NULL then
2546         close get_expert_section_name;
2547         return l_name;
2548     end if;
2549 
2550     Open get_unassigned_section_name;
2551     Fetch get_unassigned_section_name into l_name;
2552 
2553     If get_unassigned_section_name%FOUND and l_name is NOT NULL then
2554         close get_unassigned_section_name;
2555         return l_name;
2556     end if;
2557 
2558 Exception
2559 WHEN OTHERS then
2560     if  get_article_section_name%ISOPEN then
2561         close get_article_section_name;
2562     end if;
2563     if get_expert_section_name%ISOPEN then
2564         close get_expert_section_name;
2565     end if;
2566     if get_unassigned_section_name%ISOPEN then
2567         close get_unassigned_section_name;
2568     end if;
2569 
2570 end get_section_name;
2571 
2572 
2573 
2574 /*********************************
2575 -- FUNCTION GET_VALUE_SET_VARIABLE_VALUE
2576 --
2577 *********************************/
2578     FUNCTION  GET_VALUE_SET_VARIABLE_VALUE (
2579     p_CONTEXT            IN VARCHAR2,
2580       p_VALUE_SET_ID                  IN NUMBER,
2581     p_FLEX_VALUE_ID            IN VARCHAR2 )
2582     RETURN VARCHAR2 IS
2583 
2584     --l_name varchar2(80) := null;
2585     l_name FND_FLEX_VALUES_VL.FLEX_VALUE%TYPE := null;
2586 
2587       cursor flex_value_vl_csr(l_value_set_id NUMBER, l_flex_value_id VARCHAR2) is
2588           select value.flex_value
2589              from   fnd_flex_values_vl value,
2590                 fnd_flex_value_sets val_set
2591              where
2592                       value.FLEX_VALUE_SET_ID = val_set.FLEX_VALUE_SET_ID
2593               and val_set.flex_value_set_id = l_value_set_id
2594                   and to_char(value.flex_value_id)= l_flex_value_id;
2595 
2596     BEGIN
2597 
2598     if p_CONTEXT = 'I' THEN
2599         Open  flex_value_vl_csr(p_VALUE_SET_ID, p_FLEX_VALUE_ID);
2600         fetch flex_value_vl_csr into l_name;
2601         close flex_value_vl_csr;
2602       else
2603         l_name := null;
2604     end if;
2605 
2606     return(l_name);
2607     END GET_VALUE_SET_VARIABLE_VALUE;
2608 
2609 
2610 /*********************************
2611 -- PROCEDURE get_latest_article_details
2612 --
2613 *********************************/
2614 PROCEDURE get_latest_article_details(
2615   p_article_id IN NUMBER,
2616   p_document_type IN VARCHAR2,
2617   p_document_id IN NUMBER,
2618   x_article_version_id OUT NOCOPY NUMBER,
2619   x_article_version_number OUT NOCOPY VARCHAR2,
2620   x_local_article_id OUT NOCOPY NUMBER,
2621   x_adoption_type OUT NOCOPY VARCHAR2 ) IS
2622 
2623 CURSOR csr_effective_date IS
2624 SELECT tu.article_effective_date
2625 FROM okc_template_usages tu
2626 WHERE tu.document_type = p_document_type
2627   AND tu.document_id = p_document_id;
2628 
2629 -- effectivity date for templates
2630 CURSOR csr_template_effective_date IS
2631 SELECT start_date, end_date
2632 FROM OKC_TERMS_TEMPLATES_ALL
2633 WHERE template_id=p_document_id;
2634 
2635 CURSOR l_get_latest_article_csr(p_article_effective_date IN DATE) IS
2636 SELECT article_version_id ,
2637        article_version_number
2638 FROM okc_article_versions
2639 WHERE  article_id= p_article_id
2640 AND    article_status in ('ON_HOLD','APPROVED')
2641 AND    sysdate >= Start_date
2642 AND    sysdate <= nvl(end_date,sysdate+1)
2643 AND    p_document_type <> 'TEMPLATE'
2644 UNION ALL
2645 SELECT article_version_id ,
2646        article_version_number
2647 FROM okc_article_versions
2648 WHERE  article_id= p_article_id
2649 AND    nvl(p_article_effective_date,sysdate) >= Start_date
2650 AND    nvl(p_article_effective_date,sysdate) <= nvl(end_date, nvl(p_article_effective_date,sysdate) +1)
2651 AND    p_document_type = 'TEMPLATE'
2652 ;
2653 
2654 CURSOR l_get_local_article_csr(p_article_effective_date IN DATE, b_local_org_id IN NUMBER) IS
2655 SELECT ADP.LOCAL_ARTICLE_VERSION_ID LOCAL_ARTICLE_VERSION_ID,
2656        ADP.ADOPTION_TYPE,
2657        VERS1.ARTICLE_ID
2658 FROM   OKC_ARTICLE_VERSIONS VERS,
2659        OKC_ARTICLE_ADOPTIONS  ADP,
2660        OKC_ARTICLE_VERSIONS  VERS1
2661 WHERE ADP.GLOBAL_ARTICLE_VERSION_ID = VERS.ARTICLE_VERSION_ID
2662 AND    VERS.ARTICLE_ID         = p_article_id
2663 AND    nvl(p_article_effective_date,sysdate) >=  VERS.START_DATE
2664 AND    nvl(p_article_effective_date,sysdate) <= nvl(VERS.end_date, nvl(p_article_effective_date,sysdate) +1)
2665 AND    VERS.ARTICLE_STATUS     IN ('ON_HOLD','APPROVED')
2666 AND    VERS1.ARTICLE_VERSION_ID     =ADP.LOCAL_ARTICLE_VERSION_ID
2667 AND    ADP.ADOPTION_TYPE = 'LOCALIZED'
2668 AND    ADP.LOCAL_ORG_ID = b_local_org_id
2669 AND  ADP.adoption_status IN ( 'APPROVED', 'ON_HOLD')
2670 AND  p_document_type <> 'TEMPLATE'
2671 UNION ALL
2672 SELECT ADP.GLOBAL_ARTICLE_VERSION_ID LOCAL_ARTICLE_VERSION_ID,
2673        ADP.ADOPTION_TYPE,
2674        VERS.ARTICLE_ID
2675 FROM   OKC_ARTICLE_VERSIONS VERS,
2676        OKC_ARTICLE_ADOPTIONS  ADP
2677 WHERE ADP.GLOBAL_ARTICLE_VERSION_ID = VERS.ARTICLE_VERSION_ID
2678 AND    VERS.ARTICLE_ID         = p_article_id
2679 AND    nvl(p_article_effective_date,sysdate) >=  VERS.START_DATE
2680 AND    nvl(p_article_effective_date,sysdate) <= nvl(VERS.end_date, nvl(p_article_effective_date,sysdate) +1)
2681 AND    VERS.ARTICLE_STATUS     IN ('ON_HOLD','APPROVED')
2682 AND    ADP.ADOPTION_TYPE = 'ADOPTED'
2683 AND    ADP.LOCAL_ORG_ID = b_local_org_id
2684 AND  ADP.adoption_status IN ( 'APPROVED', 'ON_HOLD')
2685 AND  p_document_type <> 'TEMPLATE'
2686 UNION ALL
2687 SELECT ADP.LOCAL_ARTICLE_VERSION_ID LOCAL_ARTICLE_VERSION_ID,
2688        ADP.ADOPTION_TYPE,
2689        VERS1.ARTICLE_ID
2690 FROM   OKC_ARTICLE_VERSIONS VERS,
2691        OKC_ARTICLE_ADOPTIONS  ADP,
2692        OKC_ARTICLE_VERSIONS  VERS1
2693 WHERE ADP.GLOBAL_ARTICLE_VERSION_ID = VERS.ARTICLE_VERSION_ID
2694 AND    VERS.ARTICLE_ID         = p_article_id
2695 AND    nvl(p_article_effective_date,sysdate) >=  VERS.START_DATE
2696 AND    nvl(p_article_effective_date,sysdate) <= nvl(VERS.end_date, nvl(p_article_effective_date,sysdate) +1)
2697 AND    VERS1.ARTICLE_VERSION_ID     =ADP.LOCAL_ARTICLE_VERSION_ID
2698 AND    ADP.ADOPTION_TYPE = 'LOCALIZED'
2699 AND    ADP.LOCAL_ORG_ID = b_local_org_id
2700 AND  ADP.adoption_status IN ( 'APPROVED', 'ON_HOLD')
2701 AND  p_document_type = 'TEMPLATE'
2702 UNION ALL
2703 SELECT ADP.GLOBAL_ARTICLE_VERSION_ID LOCAL_ARTICLE_VERSION_ID,
2704        ADP.ADOPTION_TYPE,
2705        VERS.ARTICLE_ID
2706 FROM   OKC_ARTICLE_VERSIONS VERS,
2707        OKC_ARTICLE_ADOPTIONS  ADP
2708 WHERE ADP.GLOBAL_ARTICLE_VERSION_ID = VERS.ARTICLE_VERSION_ID
2709 AND    VERS.ARTICLE_ID         = p_article_id
2710 AND    nvl(p_article_effective_date,sysdate) >=  VERS.START_DATE
2711 AND    nvl(p_article_effective_date,sysdate) <= nvl(VERS.end_date, nvl(p_article_effective_date,sysdate) +1)
2712 AND    ADP.ADOPTION_TYPE = 'ADOPTED'
2713 AND    ADP.LOCAL_ORG_ID = b_local_org_id
2714 AND  ADP.adoption_status IN ( 'APPROVED', 'ON_HOLD')
2715 AND  p_document_type = 'TEMPLATE'
2716 ;
2717 
2718 CURSOR l_get_article_org_csr IS
2719 SELECT org_id
2720 FROM OKC_ARTICLES_ALL
2721 WHERE article_id = p_article_id;
2722 
2723 CURSOR l_article_number (b_article__version_id IN NUMBER) IS
2724 SELECT article_version_number
2725 FROM okc_article_versions
2726 WHERE article_version_id= b_article__version_id;
2727  l_api_name                     CONSTANT VARCHAR2(30) := 'get_latest_article_details';
2728 l_effective_date DATE := null;
2729 l_article_version_id NUMBER;
2730 l_article_version_number VARCHAR2(240);
2731 l_adoption_type  VARCHAR2(100);
2732 l_local_article_id  NUMBER;
2733 l_current_org_id VARCHAR2(100);
2734 l_article_org_id  NUMBER;
2735 l_template_start_date  DATE :=null;
2736 l_template_end_date DATE :=null;
2737 
2738 BEGIN
2739 
2740  IF p_document_type = 'TEMPLATE' THEN
2741    OPEN csr_template_effective_date;
2742      FETCH csr_template_effective_date INTO l_template_start_date, l_template_end_date;
2743    CLOSE csr_template_effective_date;
2744 
2745     IF NVL(l_template_end_date,sysdate) >= sysdate  THEN
2746        IF l_template_start_date > sysdate THEN
2747           l_effective_date := l_template_start_date;
2748        ELSE
2749           l_effective_date := sysdate;
2750        END IF;
2751     ELSE
2752        l_effective_date := l_template_end_date;
2753     END IF;
2754 
2755  ELSE
2756    -- document type not TEMPLATE
2757    OPEN csr_effective_date;
2758      FETCH csr_effective_date INTO l_effective_date;
2759    CLOSE csr_effective_date;
2760  END IF;
2761 
2762  -- check if Article is global or local
2763     OPEN l_get_article_org_csr;
2764       FETCH l_get_article_org_csr INTO l_article_org_id;
2765     CLOSE l_get_article_org_csr;
2766 
2767  -- current Org Id
2768     -- fnd_profile.get('ORG_ID',l_current_org_id);
2769     l_current_org_id := OKC_TERMS_UTIL_PVT.get_current_org_id(p_document_type, p_document_id);
2770 
2771     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2772          FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'100: l_article_org_id : '||l_article_org_id);
2773          FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'100: l_current_org_id : '||l_current_org_id);
2774     END IF;
2775 
2776     IF nvl(l_current_org_id,'?') <> l_article_org_id THEN
2777        -- this is a ADOPTED OR LOCALIZED ARTICLE
2778        OPEN  l_get_local_article_csr(l_effective_date , l_current_org_id);
2779          FETCH l_get_local_article_csr INTO l_article_version_id, l_adoption_type, l_local_article_id;
2780        CLOSE l_get_local_article_csr;
2781        -- get article version number
2782        OPEN l_article_number(l_article_version_id);
2783          FETCH l_article_number INTO l_article_version_number;
2784        CLOSE l_article_number;
2785 
2786         x_article_version_id  := l_article_version_id;
2787         x_article_version_number := l_article_version_number;
2788         x_local_article_id := l_local_article_id;
2789         x_adoption_type  := l_adoption_type;
2790 
2791     ELSE
2792       -- normal case
2793         OPEN l_get_latest_article_csr (l_effective_date);
2794           FETCH l_get_latest_article_csr INTO l_article_version_id,l_article_version_number;
2795         CLOSE l_get_latest_article_csr;
2796 
2797         x_article_version_id  := l_article_version_id;
2798         x_article_version_number := l_article_version_number;
2799         x_local_article_id := p_article_id;
2800         x_adoption_type  := NULL;
2801 
2802     END IF;
2803 
2804 END get_latest_article_details;
2805 
2806 /*********************************
2807 -- FUNCTION get_local_article_id
2808 --
2809 *********************************/
2810 FUNCTION get_local_article_id(
2811   p_article_id IN NUMBER,
2812   p_document_type IN VARCHAR2,
2813   p_document_id IN NUMBER )
2814 RETURN NUMBER IS
2815    l_api_name                     CONSTANT VARCHAR2(30) := 'get_local_article_id';
2816 l_article_version_number VARCHAR2(240);
2817 l_article_version_id  NUMBER;
2818 l_local_article_id NUMBER;
2819 l_adoption_type VARCHAR2(100);
2820 
2821 BEGIN
2822 
2823  get_latest_article_details
2824  (
2825   p_article_id  => p_article_id,
2826   p_document_type => p_document_type,
2827   p_document_id => p_document_id,
2828   x_article_version_id => l_article_version_id,
2829   x_article_version_number => l_article_version_number,
2830   x_local_article_id => l_local_article_id,
2831   x_adoption_type => l_adoption_type
2832  );
2833 
2834  RETURN l_local_article_id;
2835 
2836 END get_local_article_id;
2837 
2838 /*********************************
2839 -- FUNCTION get_adoption_type
2840 --
2841 *********************************/
2842 
2843 FUNCTION get_adoption_type(
2844   p_article_id IN NUMBER,
2845   p_document_type IN VARCHAR2,
2846   p_document_id IN NUMBER )
2847 RETURN Varchar2 IS
2848 l_api_name                     CONSTANT VARCHAR2(30) := 'get_adoption_type';
2849 l_article_version_number VARCHAR2(240);
2850 l_article_version_id  NUMBER;
2851 l_local_article_id NUMBER;
2852 l_adoption_type VARCHAR2(100);
2853 
2854 BEGIN
2855 
2856  get_latest_article_details
2857  (
2858   p_article_id  => p_article_id,
2859   p_document_type => p_document_type,
2860   p_document_id => p_document_id,
2861   x_article_version_id => l_article_version_id,
2862   x_article_version_number => l_article_version_number,
2863   x_local_article_id => l_local_article_id,
2864   x_adoption_type => l_adoption_type
2865  );
2866 
2867  RETURN l_adoption_type;
2868 
2869 END get_adoption_type;
2870 
2871 /*********************************
2872 -- FUNCTION get_print_template_name
2873 --
2874 *********************************/
2875 FUNCTION get_print_template_name(p_print_template_id IN NUMBER)
2876 RETURN VARCHAR2 IS
2877   l_api_name                     CONSTANT VARCHAR2(30) := 'get_print_template_name';
2878 l_sql_stmt VARCHAR2(4000);
2879 l_print_template_name VARCHAR2(255);
2880 l_dummy VARCHAR2(1);
2881 TYPE name_csr IS REF CURSOR;
2882 l_tmpl_csr NAME_CSR;
2883 l_apps_user VARCHAR2(150);
2884 
2885 CURSOR l_apps_user_csr IS
2886   SELECT oracle_username
2887   FROM fnd_oracle_userid
2888   WHERE read_only_flag = 'U';
2889 
2890 CURSOR l_xdo_view_csr(pc_user VARCHAR2) IS
2891 SELECT 1
2892 FROM all_views
2893 WHERE view_name like 'XDO_TEMPLATES_VL'
2894 AND owner = pc_user;
2895 
2896 BEGIN
2897 
2898   OPEN l_apps_user_csr;
2899   FETCH l_apps_user_csr INTO l_apps_user;
2900   CLOSE l_apps_user_csr;
2901 
2902   OPEN l_xdo_view_csr(l_apps_user);
2903   FETCH l_xdo_view_csr INTO l_dummy;
2904   IF l_xdo_view_csr%FOUND THEN
2905     l_sql_stmt := 'SELECT SUBSTR(TEMPLATE_NAME,1,255) FROM XDO_TEMPLATES_VL WHERE TEMPLATE_ID = :1';
2906 
2907     OPEN l_tmpl_csr FOR l_sql_stmt USING p_print_template_id;
2908     FETCH l_tmpl_csr INTO l_print_template_name;
2909     CLOSE l_tmpl_csr;
2910   END IF;
2911   CLOSE l_xdo_view_csr;
2912 
2913   RETURN l_print_template_name;
2914 
2915 END get_print_template_name;
2916 
2917 
2918 /*********************************
2919 -- FUNCTION get_current_org_id
2920 --
2921 *********************************/
2922 FUNCTION get_current_org_id
2923 (
2924  p_doc_type   IN  VARCHAR2,
2925  p_doc_id     IN  NUMBER
2926 ) RETURN NUMBER IS
2927 
2928 CURSOR l_org_id_csr IS
2929 SELECT t.org_id
2930 FROM okc_terms_templates_all t,
2931      okc_template_usages u
2932 WHERE t.template_id = u.template_id
2933   AND u.document_type = p_doc_type
2934   AND u.document_id =   p_doc_id ;
2935 
2936 CURSOR l_tmpl_org_id_csr IS
2937 SELECT  t.org_id
2938 FROM okc_terms_templates_all t
2939 WHERE t.template_id = p_doc_id ;
2940 
2941 l_current_org_id NUMBER;
2942  l_api_name                     CONSTANT VARCHAR2(30) := 'get_current_org_id';
2943 BEGIN
2944  IF p_doc_type = G_TMPL_DOC_TYPE  THEN
2945    OPEN l_tmpl_org_id_csr;
2946      FETCH l_tmpl_org_id_csr INTO l_current_org_id;
2947    CLOSE l_tmpl_org_id_csr;
2948  ELSE
2949    -- doc is not template
2950    OPEN l_org_id_csr;
2951      FETCH l_org_id_csr INTO l_current_org_id;
2952    CLOSE l_org_id_csr;
2953  END IF;
2954 
2955  RETURN l_current_org_id;
2956 
2957 END get_current_org_id;
2958 
2959 
2960 FUNCTION get_template_model_name
2961 (
2962  p_template_id   IN  NUMBER,
2963  p_template_model_id     IN  NUMBER
2964 ) RETURN VARCHAR2 IS
2965 x_return_status VARCHAR2(50);
2966 x_msg_count NUMBER;
2967 x_msg_data VARCHAR2(4000);
2968 x_template_model_name VARCHAR2(255) NULL;
2969 x_published_by VARCHAR2(255) := NULL;
2970 x_publish_date DATE := NULL;
2971 x_publication_id NUMBER := NULL;
2972  l_api_name                     CONSTANT VARCHAR2(30) := 'get_template_model_name';
2973 BEGIN
2974   BEGIN
2975         /*
2976       * Removed call to OKC_EXPRT_UTIL_GRP for 11.5.10+: Contract Expert Changes
2977       */
2978       x_template_model_name := NULL;
2979   EXCEPTION
2980     WHEN OTHERS THEN
2981       x_template_model_name := NULL;
2982   END;
2983 
2984 RETURN x_template_model_name;
2985 END;
2986 
2987 FUNCTION get_tmpl_model_published_by
2988 (
2989  p_template_id   IN  NUMBER,
2990  p_template_model_id     IN  NUMBER
2991 ) RETURN VARCHAR2 IS
2992 x_return_status VARCHAR2(50);
2993 x_msg_count NUMBER;
2994 x_msg_data VARCHAR2(4000);
2995 x_template_model_name VARCHAR2(255) NULL;
2996 x_published_by VARCHAR2(255) := NULL;
2997 x_publish_date DATE := NULL;
2998 x_publication_id NUMBER := NULL;
2999 
3000 BEGIN
3001   BEGIN
3002 
3003         /*
3004       * Removed call to OKC_EXPRT_UTIL_GRP for 11.5.10+: Contract Expert Changes
3005       */
3006       x_published_by := NULL;
3007   EXCEPTION
3008     WHEN OTHERS THEN
3009       x_published_by := NULL;
3010   END;
3011 
3012 RETURN x_published_by;
3013 END;
3014 
3015 FUNCTION get_tmpl_model_publish_date
3016 (
3017  p_template_id   IN  NUMBER,
3018  p_template_model_id     IN  NUMBER
3019 ) RETURN DATE IS
3020 x_return_status VARCHAR2(50);
3021 x_msg_count NUMBER;
3022 x_msg_data VARCHAR2(4000);
3023 x_template_model_name VARCHAR2(255) NULL;
3024 x_published_by VARCHAR2(255) := NULL;
3025 x_publish_date DATE := NULL;
3026 x_publication_id NUMBER := NULL;
3027  l_api_name                     CONSTANT VARCHAR2(30) := 'get_tmpl_model_publish_date';
3028 BEGIN
3029   BEGIN
3030 
3031         /*
3032       * Removed call to OKC_EXPRT_UTIL_GRP for 11.5.10+: Contract Expert Changes
3033       */
3034       x_publish_date := NULL;
3035   EXCEPTION
3036     WHEN OTHERS THEN
3037       x_publish_date := NULL;
3038   END;
3039 
3040 RETURN x_publish_date;
3041 END;
3042 FUNCTION get_chr_id_for_doc_id
3043 (
3044  p_document_id    IN  NUMBER
3045  ) RETURN NUMBER IS
3046  l_api_name                     CONSTANT VARCHAR2(30) := 'get_chr_id_for_doc_id';
3047  CURSOR l_get_id IS
3048 SELECT  id
3049 FROM okc_k_headers_b
3050 WHERE document_id = p_document_id ;
3051 l_chr_id   NUMBER;
3052  BEGIN
3053     open l_get_id;
3054     fetch l_get_id into l_chr_id;
3055     close l_get_id;
3056     return l_chr_id;
3057   END;
3058 
3059 --Checks if the given function is accessible to the user and returns 'Y' if accessible else 'N'
3060 FUNCTION is_Function_Accessible(
3061   p_function_name    IN VARCHAR2
3062  ) RETURN VARCHAR2 IS
3063  l_api_name                     CONSTANT VARCHAR2(30) := 'is_Function_Accessible';
3064 BEGIN
3065    IF (p_function_name is null) THEN
3066       RETURN 'N' ;
3067    ELSIF fnd_function.test(p_function_name,'N') THEN
3068           RETURN 'Y' ;
3069    ELSE
3070      RETURN 'N' ;
3071    END IF;
3072 EXCEPTION
3073  WHEN OTHERS THEN
3074    IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3075       FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'2000: Leaving is_Function_Accessible because of EXCEPTION: '||sqlerrm);
3076    END IF;
3077  RETURN NULL;
3078 END is_Function_Accessible;
3079 
3080 /************************************************************************************
3081 --Procedure that checks for template information for a given documentId, documentType
3082   Input: p_document_type,
3083          p_document_id,
3084          p_mode
3085          p_eff_date
3086          p_org_id
3087 
3088    Returns: x_template_exists
3089             x_template_id
3090             x_template_name
3091             x_enable_expert_button
3092             x_template_org_id
3093             x_doc_numbering_scheme
3094             x_config_header_id
3095             x_config_revision_number
3096             x_valid_config_yn
3097    Purpose: For the given document_type, document_id,
3098             a.if there is no record in
3099               template_usages, returns the default template details if one exists
3100             b.else it returns the template information as listed in the Out variables
3101               If the mode is not 'VIEW', it updates the template usages record based on
3102               business rules.
3103 
3104    Where Used: In Authoring page: Structure page invokes this procedure
3105 *************************************************************************************/
3106 PROCEDURE get_template_details (
3107     p_api_version       IN  NUMBER,
3108     p_init_msg_list     IN  VARCHAR2 :=  FND_API.G_FALSE,
3109     p_commit            IN  VARCHAR2 :=  FND_API.G_FALSE,
3110 
3111     x_return_status     OUT NOCOPY VARCHAR2,
3112     x_msg_data          OUT NOCOPY VARCHAR2,
3113     x_msg_count         OUT NOCOPY NUMBER,
3114 
3115     p_document_type          IN  VARCHAR2,
3116     p_document_id            IN  NUMBER,
3117     p_mode in VARCHAR2,
3118   p_eff_date IN DATE,
3119   p_org_id   IN NUMBER,
3120   x_template_exists OUT NOCOPY VARCHAR2,
3121   x_template_id OUT NOCOPY NUMBER,
3122   x_template_name OUT NOCOPY VARCHAR2,
3123   x_enable_expert_button OUT NOCOPY VARCHAR2,
3124   x_template_org_id OUT NOCOPY NUMBER,
3125   x_doc_numbering_scheme OUT NOCOPY VARCHAR2,
3126   x_config_header_id OUT NOCOPY NUMBER,
3127   x_config_revision_number OUT NOCOPY NUMBER,
3128     x_valid_config_yn OUT NOCOPY VARCHAR2
3129   ) IS
3130     l_api_version       CONSTANT NUMBER := 1;
3131     l_api_name          CONSTANT VARCHAR2(30) := 'get_template_details';
3132     l_meaning           VARCHAR2(100);
3133     l_sequence          NUMBER;
3134 
3135     l_template_exists VARCHAR2(5) := 'false';
3136     l_template_id NUMBER := 0;
3137     l_template_name  VARCHAR2(2000);
3138     l_enable_expert_button VARCHAR2(5) := 'false';
3139     l_template_org_id NUMBER;
3140 
3141     l_doc_numbering_scheme VARCHAR(2000);
3142     l_config_header_id  NUMBER;
3143     l_config_revision_number NUMBER;
3144     l_valid_config_yn VARCHAR2(2000);
3145     l_article_effective_date DATE;
3146     l_update_date BOOLEAN := false;
3147     l_update_date_with DATE := FND_API.G_MISS_DATE;
3148 
3149 
3150 Cursor l_get_template_details_csr IS
3151 select a.template_id, b.template_name, a.article_effective_date,
3152 a.doc_numbering_scheme,
3153 a.config_header_id, a.config_revision_number,
3154 a.valid_config_yn, b.org_id
3155 from okc_template_usages a ,okc_terms_templates_all b
3156 where a.template_id = b.template_id
3157 and a.document_id = p_document_id and a.document_type = p_document_type;
3158 
3159 cursor l_get_dflt_tmpl_dtls_csr is
3160 select a.template_id, b.template_name
3161     from
3162     okc_allowed_tmpl_usages a, okc_terms_templates_all b
3163     where a.template_id = b.template_id
3164     and a.default_yn = 'Y'
3165     and b.status_code = 'APPROVED'
3166     and a.document_type = p_document_type
3167     and b.org_id = p_org_id
3168     and nvl(p_eff_date,trunc(sysdate)) between start_date and nvl(end_date, trunc(sysdate));
3169 
3170    BEGIN
3171     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3172        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'7500: Entered get_template_details');
3173     END IF;
3174 
3175     -- Standard call to check for call compatibility.
3176     IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
3177       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3178     END IF;
3179     -- Initialize message list if p_init_msg_list is set to TRUE.
3180     IF FND_API.to_Boolean( p_init_msg_list ) THEN
3181       FND_MSG_PUB.initialize;
3182     END IF;
3183     --  Initialize API return status to success
3184     x_return_status := G_RET_STS_SUCCESS;
3185 
3186         x_template_exists  := 'false';
3187         x_template_id := 0;
3188         x_enable_expert_button  := 'false';
3189         x_template_org_id  := 0;
3190 
3191 
3192     --------------------------------------------
3193     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3194        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'7600: get_template_details');
3195     END IF;
3196     --------------------------------------------
3197 
3198 
3199 
3200     open l_get_template_details_csr;
3201     fetch l_get_template_details_csr into l_template_id, l_template_name,
3202     l_article_effective_date,
3203       x_doc_numbering_scheme,
3204     l_config_header_id, l_config_revision_number,
3205     l_valid_config_yn, l_template_org_id;
3206     IF l_get_template_details_csr%NOTFOUND  THEN
3207         if(p_mode <> 'UPDATE') THEN
3208          close l_get_template_details_csr;
3209         else
3210             open l_get_dflt_tmpl_dtls_csr;
3211             fetch l_get_dflt_tmpl_dtls_csr into l_template_id, l_template_name;
3212             if l_get_dflt_tmpl_dtls_csr%NOTFOUND THEN
3213                 x_template_exists := 'false';
3214             else
3215                 x_template_exists :='false';
3216                 x_enable_expert_button := 'false';
3217                 x_template_id := l_template_id;
3218                 x_template_name := l_template_name;
3219             end if;
3220             close l_get_dflt_tmpl_dtls_csr;
3221         end if;
3222     else
3223         x_template_exists := 'true';
3224         x_template_id := l_template_id;
3225         x_template_name := l_template_name;
3226         x_template_org_id := l_template_org_id;
3227 
3228         x_config_header_id := l_config_header_id;
3229         x_config_revision_number := l_config_revision_number;
3230         x_doc_numbering_scheme :=l_doc_numbering_scheme;
3231         x_valid_config_yn := l_valid_config_yn;
3232 
3233         if( p_mode is not null and p_mode <> 'VIEW') THEN
3234                OKC_XPRT_UTIL_PVT.enable_expert_button(
3235                 p_api_version                         => p_api_version,
3236                 p_init_msg_list           => NULL,
3237                 p_template_id                      => x_template_id,
3238                 p_document_id                     => p_document_id,
3239                 p_document_type                    => p_document_type,
3240                 x_enable_expert_button                => x_enable_expert_button,
3241                 x_return_status              => x_return_status,
3242                 x_msg_count                => x_msg_count,
3243                 x_msg_data                   => x_msg_data );
3244         l_update_date := false;
3245         if(l_article_effective_date is NULL) then
3246             l_update_date := true;
3247             l_update_date_with := p_eff_date;
3248         elsif(l_article_effective_date <> p_eff_date and p_eff_date is NULL) then
3249             l_update_date := true;
3250             l_update_date_with := FND_API.G_MISS_DATE;
3251         elsif(l_article_effective_date <> p_eff_date ) then
3252             l_update_date := true;
3253             l_update_date_with := p_eff_date;
3254         end if;
3255         if(l_update_date and l_update_date_with is NOT NULL) then
3256        UPDATE okc_template_usages
3257           SET article_effective_date = l_update_date_with
3258           WHERE document_type = p_document_type
3259           AND document_id = p_document_id;
3260         end if;
3261       end if;
3262     end if;
3263     IF l_get_template_details_csr%ISOPEN THEN
3264         CLOSE l_get_template_details_csr;
3265     END IF;
3266 
3267 
3268 
3269 
3270     --------------------------------------------
3271     IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
3272       RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3273     ELSIF (x_return_status = G_RET_STS_ERROR) THEN
3274       RAISE FND_API.G_EXC_ERROR ;
3275     END IF;
3276     --------------------------------------------
3277 
3278     IF FND_API.To_Boolean( p_commit ) THEN
3279       COMMIT WORK;
3280     END IF;
3281     -- Standard call to get message count and if count is 1, get message info.
3282     FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3283     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3284      FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'7700: Leaving get_template_details');
3285     END IF;
3286    EXCEPTION
3287     WHEN FND_API.G_EXC_ERROR THEN
3288 
3289       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3290          FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'7800: Leaving get_template_details : OKC_API.G_EXCEPTION_ERROR Exception');
3291       END IF;
3292 
3293       IF l_get_template_details_csr%ISOPEN THEN
3294          CLOSE l_get_template_details_csr;
3295       END IF;
3296 
3297       IF l_get_dflt_tmpl_dtls_csr%ISOPEN THEN
3298          CLOSE l_get_dflt_tmpl_dtls_csr;
3299       END IF;
3300 
3301 
3302       x_return_status := G_RET_STS_ERROR ;
3303       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3304 
3305     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3306       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3307          FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'7900: Leaving get_template_details : OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception');
3308       END IF;
3309 
3310       IF l_get_template_details_csr%ISOPEN THEN
3311          CLOSE l_get_template_details_csr;
3312       END IF;
3313       IF l_get_dflt_tmpl_dtls_csr%ISOPEN THEN
3314          CLOSE l_get_dflt_tmpl_dtls_csr;
3315       END IF;
3316 
3317       x_return_status := G_RET_STS_UNEXP_ERROR ;
3318       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3319 
3320     WHEN OTHERS THEN
3321       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3322         FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'8000: Leaving get_template_details because of EXCEPTION: '||sqlerrm);
3323       END IF;
3324 
3325       IF l_get_template_details_csr%ISOPEN THEN
3326          CLOSE l_get_template_details_csr;
3327       END IF;
3328       IF l_get_dflt_tmpl_dtls_csr%ISOPEN THEN
3329          CLOSE l_get_dflt_tmpl_dtls_csr;
3330       END IF;
3331 
3332       x_return_status := G_RET_STS_UNEXP_ERROR ;
3333       IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
3334         FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
3335       END IF;
3336       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3337   END get_template_details ;
3338 
3339 
3340 --Checks if the given section is deleted
3341 FUNCTION is_section_deleted(
3342   p_scn_id    IN NUMBER
3343  ) RETURN VARCHAR2 IS
3344  /*
3345   This function will be called from Update Section Page
3346   Given a scn_id it will return the following:
3347   'D' If the section is deleted i.e AMENDMENT_OPERATION_CODE or SUMMARY_AMEND_OPERATION_CODE is 'DELETED'
3348   'E' If the scn_id does not exists which will result in Stale Data Error
3349   'S' If the scn_id is NOT deleted and exists
3350  */
3351  CURSOR csr_check_section IS
3352  SELECT amendment_operation_code,summary_amend_operation_code
3353  FROM okc_sections_b
3354  WHERE id = p_scn_id;
3355  l_api_name                     CONSTANT VARCHAR2(30) := 'is_section_deleted';
3356  l_amendment_operation_code        VARCHAR2(30);
3357  l_summary_amend_operation_code    VARCHAR2(30);
3358  l_return                          VARCHAR2(1);
3359 
3360 BEGIN
3361    OPEN csr_check_section;
3362      FETCH csr_check_section INTO l_amendment_operation_code, l_summary_amend_operation_code;
3363      IF csr_check_section%NOTFOUND THEN
3364        l_return := 'E';
3365      ELSE
3366         IF (NVL(l_amendment_operation_code,'x') = 'DELETED' OR
3367            NVL(l_summary_amend_operation_code,'x') = 'DELETED') THEN
3368            l_return := 'D';
3369         ELSE
3370             l_return := 'S';
3371         END IF;
3372      END IF;
3373    CLOSE csr_check_section;
3374 
3375    RETURN l_return;
3376 
3377 EXCEPTION
3378  WHEN OTHERS THEN
3379    IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3380       FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'2000: Leaving is_section_deleted because of EXCEPTION: '||sqlerrm);
3381    END IF;
3382  RETURN NULL;
3383 
3384 END is_section_deleted;
3385 
3386 --Checks if the given article is deleted
3387 FUNCTION is_article_deleted(
3388   p_cat_id    IN NUMBER,
3389   p_article_id IN NUMBER
3390  ) RETURN VARCHAR2 IS
3391  /*
3392   This function will be called from Update Article Page
3393   Given a cat_id and sav_sae_id it will return the following:
3394   'D' If the article is deleted i.e AMENDMENT_OPERATION_CODE or SUMMARY_AMEND_OPERATION_CODE is 'DELETED'
3395   'E' If the sav_sae_id does not match the sav_sae_id in record
3396   'S' If the article record is NOT deleted and exists
3397  */
3398  CURSOR csr_check_article IS
3399  SELECT amendment_operation_code,summary_amend_operation_code
3400  FROM okc_k_articles_b
3401  WHERE id = p_cat_id
3402    AND sav_sae_id = p_article_id ;
3403  l_api_name                     CONSTANT VARCHAR2(30) := 'is_article_deleted';
3404  l_amendment_operation_code        VARCHAR2(30);
3405  l_summary_amend_operation_code    VARCHAR2(30);
3406  l_return                          VARCHAR2(1);
3407 
3408 BEGIN
3409   OPEN csr_check_article;
3410     FETCH csr_check_article INTO  l_amendment_operation_code, l_summary_amend_operation_code;
3411      IF csr_check_article%NOTFOUND THEN
3412         l_return := 'E';
3413      ELSE
3414         IF (NVL(l_amendment_operation_code,'x') = 'DELETED' OR
3415            NVL(l_summary_amend_operation_code,'x') = 'DELETED') THEN
3416            l_return := 'D';
3417         ELSE
3418             l_return := 'S';
3419         END IF;
3420      END IF;
3421 
3422 EXCEPTION
3423  WHEN OTHERS THEN
3424    IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3425       FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'2000: Leaving is_article_deleted because of EXCEPTION: '||sqlerrm);
3426    END IF;
3427  RETURN NULL;
3428 
3429 END is_article_deleted;
3430 
3431 
3432 --Checks if the given article has deliverable type variables and the deliverable is amended
3433 --To be used by the Printing program
3434  FUNCTION deliverable_amendment_exists(
3435   p_cat_id    IN NUMBER,
3436   p_document_id IN NUMBER,
3437   p_document_type IN VARCHAR2
3438  ) RETURN VARCHAR2 IS
3439  /*
3440   This function will be called from Printing Program
3441   Given a cat_id, document_type and document_id it will return the following:
3442   'Y' If the clause has deliverable type variables and deliverable amendments exist
3443   'N' If (the clause has no deliverable type variables) OR
3444          (has deliverable type variables AND deliverable amendments do not exist)
3445  */
3446 
3447  CURSOR l_doc_variable_csr IS
3448  SELECT variable_code
3449  FROM okc_k_art_variables
3450  WHERE cat_id = p_cat_id
3451  AND variable_type = 'D';
3452  l_api_name                     CONSTANT VARCHAR2(30) := 'deliverable_amendment_exists';
3453  l_variable_type        okc_k_art_variables.variable_type%TYPE;
3454  l_return               VARCHAR2(1) := 'N';
3455  l_msg_data             VARCHAR2(2000);
3456  l_msg_count            NUMBER;
3457  l_return_status        VARCHAR2(30);
3458 
3459 BEGIN
3460   IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3461     FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'1000: Entered OKC_TERMS_UTIL_PVT.deliverable_amendment_exists');
3462     FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'1010: p_cat_id='||p_cat_id);
3463     FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'1020: p_document_id='||p_document_id);
3464     FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'1030: p_document_type='||p_document_type);
3465   END IF;
3466   FOR rec IN l_doc_variable_csr LOOP
3467     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3468       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'1040: Before calling OKC_DELIVERABLE_PROCESS_PVT.deliverable_amendment_exists');
3469     END IF;
3470     l_return :=  OKC_DELIVERABLE_PROCESS_PVT.deliverable_amendment_exists
3471                             ( p_api_version       => 1,
3472                               p_init_msg_list     => FND_API.G_FALSE,
3473                               p_bus_doc_type      => p_document_type,
3474                               p_bus_doc_id        => p_document_id,
3475                               p_variable_code     => rec.variable_code,
3476                               x_msg_data          => l_msg_data,
3477                               x_msg_count         => l_msg_count,
3478                               x_return_status     => l_return_status);
3479     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3480       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'1050: After calling OKC_DELIVERABLE_PROCESS_PVT.deliverable_amendment_exists');
3481       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'1060: x_return_status='||l_return_status);
3482       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'1070: l_return='||l_return);
3483     END IF;
3484     IF l_return = 'Y' THEN
3485       RETURN l_return;
3486     END IF;
3487   END LOOP;
3488   IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3489       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'1090: l_return='||l_return);
3490   END IF;
3491 
3492   RETURN l_return;
3493 
3494 EXCEPTION
3495  WHEN OTHERS THEN
3496    IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3497       FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'1090: Leaving OKC_TERMS_UTIL_PVT.deliverable_amendment_exists because of EXCEPTION: '||sqlerrm);
3498    END IF;
3499  RETURN 'N';
3500 
3501 END deliverable_amendment_exists;
3502 
3503 /*
3504 -- PROCEDURE purge_qa_results
3505 -- Called by concurrent program to purge old QA error data.
3506 -- Parameter p_num_days is how far in the past to start the purge
3507 */
3508    PROCEDURE purge_qa_results (
3509     errbuf  OUT NOCOPY VARCHAR2,
3510     retcode OUT NOCOPY VARCHAR2,
3511     p_num_days IN NUMBER default 3)
3512     IS
3513     l_api_name      CONSTANT VARCHAR2(30) :='purge_qa_validation_results';
3514     l_api_version     CONSTANT VARCHAR2(30) := 1.0;
3515     l_init_msg_list   VARCHAR2(3) := 'T';
3516     l_return_status   VARCHAR2(1)  := FND_API.G_RET_STS_SUCCESS;
3517     l_msg_count       NUMBER;
3518     l_msg_data        VARCHAR2(1000);
3519     l_num_days        NUMBER;
3520 
3521     E_Resource_Busy   EXCEPTION;
3522     PRAGMA EXCEPTION_INIT(E_Resource_Busy,  -00054);
3523 
3524     BEGIN
3525          IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3526           FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,l_api_name,'100: Inside OKC_TERMS_UTIL_PVT.PURGE_QA_RESULTS');
3527           FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,l_api_name,'Parameters:  p_num_days='||p_num_days);
3528      END IF;
3529 
3530      FND_FILE.PUT_LINE(FND_FILE.LOG,'Parameters:  p_num_days='||p_num_days);
3531     if p_num_days < 1 then
3532       l_num_days := 1;
3533       FND_FILE.PUT_LINE(FND_FILE.LOG,'Setting p_num_days to 1 to prevent any current data from being deleted');
3534     else
3535       l_num_days := p_num_days;
3536     end if;
3537 
3538     --Initialize the return code
3539         retcode := 0;
3540 
3541     delete from OKC_QA_ERRORS_T qa
3542     where creation_date <= sysdate - l_num_days;
3543 
3544     commit;
3545 
3546          IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3547           FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,l_api_name,'100: leaving OKC_TERMS_UTIL_PVT.PURGE_QA_RESULTS');
3548          END IF;
3549 EXCEPTION
3550     WHEN E_Resource_Busy THEN
3551       l_return_status := fnd_api.g_ret_sts_error;
3552          IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3553           FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,l_api_name,'200: Resource busy exception');
3554          END IF;
3555       IF FND_MSG_PUB.Count_Msg > 0 Then
3556         FOR I IN 1..FND_MSG_PUB.Count_Msg LOOP
3557           FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MSG_PUB.Get(i,p_encoded =>FND_API.G_FALSE ));
3558         END LOOP;
3559 
3560       END IF;
3561       FND_MSG_PUB.initialize;
3562       RAISE APP_EXCEPTIONS.RECORD_LOCK_EXCEPTION;
3563     WHEN OTHERS THEN
3564       retcode := 2;
3565       errbuf  := substr(sqlerrm,1,200);
3566       IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3567           FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,l_api_name,'200: Other exception');
3568          END IF;
3569       IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
3570         FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME,l_api_name);
3571       END IF;
3572       IF FND_MSG_PUB.Count_Msg > 0 Then
3573         FOR I IN 1..FND_MSG_PUB.Count_Msg LOOP
3574           FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MSG_PUB.Get(i,p_encoded =>FND_API.G_FALSE ));
3575         END LOOP;
3576       END IF;
3577       FND_MSG_PUB.initialize;
3578 
3579     END PURGE_QA_RESULTS;
3580 
3581     ------------------------------------------------------
3582     -- FUNCTION get_latest_tmpl_art_version_id
3583     -------------------------------------------------------
3584     /*
3585     -- 11.5.10+
3586     -- 2004/8/20 ANJKUMAR: overloaded function with additional params
3587     -- p_doc_type and p_doc_id, changes logic only for p_doc_type = 'TEMPLATE'
3588     -- looks in first in new table OKC_TMPL_DRAFT_CLAUSES if status
3589     -- DRAFT/REJECTED/PENDING_APPROVAL for article versions
3590     --
3591     */
3592     FUNCTION get_latest_tmpl_art_version_id(
3593         p_article_id    IN NUMBER,
3594         p_start_date    IN DATE,
3595         p_end_date        IN DATE,
3596         p_status_code    IN VARCHAR2,
3597         p_doc_type        IN VARCHAR2 DEFAULT NULL,
3598         p_doc_id        IN NUMBER DEFAULT NULL
3599         ,p_org_id        in number default null) RETURN NUMBER
3600     IS
3601         l_article_version_id okc_article_versions.article_version_id%TYPE;
3602         l_effective_date DATE;
3603         l_article_org_id NUMBER;
3604         l_current_org_id NUMBER;
3605  l_api_name                     CONSTANT VARCHAR2(30) := 'get_latest_tmpl_art_version_id';
3606         -- new variable
3607         l_stop BOOLEAN := TRUE;
3608 
3609         -- new cursor to get draft/rejected versions from table OKC_TMPL_DRAFT_CLAUSES
3610         CURSOR l_draft_selected_ver_csr IS
3611         SELECT ARTV.article_version_id
3612         FROM OKC_TMPL_DRAFT_CLAUSES TMPLC,
3613              OKC_ARTICLE_VERSIONS ARTV
3614         WHERE TMPLC.template_id = p_doc_id
3615             AND TMPLC.article_id = p_article_id
3616             AND TMPLC.selected_yn     = 'Y'
3617               AND ARTV.article_id = TMPLC.article_id
3618             AND ARTV.article_version_id = TMPLC.article_version_id
3619             AND ARTV.article_status in ('DRAFT', 'REJECTED')
3620             AND EXISTS (SELECT 1 FROM OKC_K_ARTICLES_B KART
3621                     WHERE  KART.document_type = p_doc_type
3622                     AND KART.document_id = p_doc_id
3623                     AND KART.sav_sae_id = TMPLC.article_id);
3624 
3625         -- modify this cursor to exclude versions from the the table OKC_DRAFT_CLAUSES
3626         CURSOR l_draft_ver_csr(cp_effective_date DATE) IS
3627             SELECT ver.article_version_id
3628             FROM okc_articles_all art,
3629                 okc_article_versions ver
3630             WHERE art.article_id = p_article_id
3631                 AND art.article_id = ver.article_id
3632                 AND cp_effective_date BETWEEN ver.start_date AND NVL(ver.end_date,cp_effective_date+1)
3633                 -- begin change
3634                 -- Bug 4021182, we cannot include pending approval, on hold or expired clauses here
3635                 AND VER.article_status IN ('APPROVED', 'DRAFT', 'REJECTED')
3636                 AND NOT EXISTS (SELECT 1 from OKC_TMPL_DRAFT_CLAUSES TMPLC
3637                     WHERE TMPLC.template_id = p_doc_id
3638                     AND TMPLC.article_id = p_article_id
3639                     AND    TMPLC.article_version_id = VER.article_version_id)
3640                 -- end change
3641                 ORDER BY ver.article_version_number DESC;
3642 
3643         -- last effort to get a clause for template in draft status
3644         CURSOR l_draft_latest_ver_csr(cp_effective_date DATE) IS
3645             SELECT ver.article_version_id
3646             FROM okc_articles_all art,
3647                 okc_article_versions ver
3648             WHERE art.article_id = p_article_id
3649                 AND art.article_id = ver.article_id
3650                 -- Bugs 4018610, 4018467, the start date of draft clause can be
3651                 -- changed to a future date, making this cursor return nothing
3652                 -- The draft clause status can also change to pending approval
3653                 -- or an approved clause can be put on hold after including in the template
3654                 -- AND ver.start_date <= cp_effective_date
3655                 AND ver.start_date = (SELECT max(start_date)
3656                     FROM okc_article_versions ver1
3657                     WHERE ver1.article_id = ver.article_id
3658                     --AND ver1.start_date <= cp_effective_date
3659                     --AND ver1.article_status = 'APPROVED'
3660                     );
3661 
3662         -- new cursor to get draft/rejected versions from table OKC_TMPL_DRAFT_CLAUSES
3663         CURSOR l_pen_app_selected_ver_csr IS
3664             SELECT ARTV.article_version_id
3665             FROM OKC_TMPL_DRAFT_CLAUSES TMPLC,
3666                 OKC_ARTICLE_VERSIONS ARTV
3667             WHERE TMPLC.template_id = p_doc_id
3668                 AND TMPLC.article_id = p_article_id
3669                 AND TMPLC.selected_yn     = 'Y'
3670                 AND ARTV.article_id = TMPLC.article_id
3671                 AND ARTV.article_version_id = TMPLC.article_version_id
3672                 AND ARTV.article_status = 'PENDING_APPROVAL'
3673                 AND EXISTS (SELECT 1 FROM OKC_K_ARTICLES_B KART
3674                     WHERE  KART.document_type = p_doc_type
3675                     AND KART.document_id = p_doc_id
3676                     AND KART.sav_sae_id = TMPLC.article_id);
3677 
3678 
3679         CURSOR l_approved_ver_csr(cp_effective_date DATE) IS
3680             SELECT ver.article_version_id
3681             FROM okc_articles_all art,
3682                 okc_article_versions ver
3683             WHERE art.article_id = p_article_id
3684                 AND art.article_id = ver.article_id
3685                 AND ver.article_status IN  ('APPROVED','EXPIRED','ON_HOLD')
3686                 AND cp_effective_date BETWEEN ver.start_date AND NVL(ver.end_date,cp_effective_date+1);
3687 
3688         CURSOR l_approved_latest_ver_csr(cp_effective_date DATE) IS
3689             SELECT ver.article_version_id
3690             FROM okc_articles_all art,
3691                 okc_article_versions ver
3692             WHERE art.article_id = p_article_id
3693                 AND art.article_id = ver.article_id
3694                 AND ver.start_date <= cp_effective_date
3695                 AND ver.article_status IN ('APPROVED','EXPIRED','ON_HOLD')
3696                 AND ver.start_date = (SELECT max(start_date)
3697                     FROM okc_article_versions ver1
3698                     WHERE ver1.article_id = ver.article_id
3699                     AND ver1.start_date <= cp_effective_date
3700                     AND ver1.article_status IN ('APPROVED','EXPIRED','ON_HOLD'));
3701 
3702         -- cursor to get article org id and local org id
3703         CURSOR l_get_article_org_csr(b_article_id NUMBER) IS
3704             SELECT org_id,
3705             mo_global.get_current_org_id() current_org_id
3706             FROM OKC_ARTICLES_ALL
3707             WHERE article_id = b_article_id;
3708 
3709         -- cursor to get latest adopted article version id for global article
3710         CURSOR l_get_max_adopted_article_csr(b_article_id IN NUMBER, b_current_org_id IN NUMBER) IS
3711             SELECT ADP.GLOBAL_ARTICLE_VERSION_ID
3712                 FROM OKC_ARTICLE_ADOPTIONS  ADP,
3713                     OKC_ARTICLE_VERSIONS VER
3714                 WHERE ADP.GLOBAL_ARTICLE_VERSION_ID = VER.article_version_id
3715                     AND   VER.article_id = b_article_id
3716                     AND   ADP.LOCAL_ORG_ID = b_current_org_id
3717                     --AND   ADP.adoption_status IN ( 'APPROVED', 'ON_HOLD')
3718                     AND   ADP.ADOPTION_TYPE IN ('ADOPTED','AVAILABLE')
3719                     ORDER BY VER.article_version_number desc,
3720                  DECODE(ADP.adoption_status,'APPROVED','001','ON_HOLD','001','002') desc;
3721 
3722 
3723     BEGIN
3724         -- determine the effective date
3725         IF ((p_end_date IS NULL) OR (TRUNC(p_end_date) >= TRUNC(SYSDATE)))  THEN
3726             IF TRUNC(p_start_date) < TRUNC(SYSDATE) THEN
3727                 l_effective_date := TRUNC(sysdate);
3728             ELSE
3729                 l_effective_date := TRUNC(p_start_date);
3730             END IF;
3731 
3732         ELSIF TRUNC(p_end_date) < TRUNC(SYSDATE) THEN
3733             l_effective_date := TRUNC(p_end_date);
3734         END IF;
3735 
3736 
3737  -- check if this is a global article in local template
3738         OPEN l_get_article_org_csr(p_article_id);
3739         FETCH l_get_article_org_csr INTO l_article_org_id, l_current_org_id;
3740         CLOSE l_get_article_org_csr;
3741 
3742          -- For bug fix 15875890
3743          if p_org_id is not null then
3744             l_current_org_id :=  p_org_id;
3745          end if;
3746 
3747         -- if the org ids are different then display the lastest adopted version
3748         IF l_article_org_id <> l_current_org_id THEN
3749             OPEN l_get_max_adopted_article_csr(p_article_id, l_current_org_id);
3750             FETCH l_get_max_adopted_article_csr INTO l_article_version_id;
3751             CLOSE l_get_max_adopted_article_csr;
3752 
3753             RETURN l_article_version_id;
3754         END IF; -- global article in local template
3755 
3756 
3757         IF p_status_code IN ('DRAFT','REJECTED','REVISION') THEN
3758 
3759             -- begin changes
3760             IF (NVL(p_doc_type,'*') = 'TEMPLATE' AND p_doc_id is not null) THEN
3761                 OPEN l_draft_selected_ver_csr;
3762                 FETCH l_draft_selected_ver_csr INTO l_article_version_id;
3763 
3764                 IF l_draft_selected_ver_csr%NOTFOUND THEN
3765                     l_stop := FALSE;
3766                 END IF;
3767                 CLOSE l_draft_selected_ver_csr;
3768             ELSE
3769                 l_stop := FALSE;
3770             END IF;
3771 
3772             IF NOT l_stop THEN
3773             -- end changes
3774 
3775                 OPEN l_draft_ver_csr(l_effective_date);
3776                 FETCH l_draft_ver_csr INTO l_article_version_id;
3777                 IF l_draft_ver_csr%NOTFOUND THEN
3778 
3779                     OPEN l_draft_latest_ver_csr(l_effective_date);
3780                     FETCH l_draft_latest_ver_csr INTO l_article_version_id;
3781                     CLOSE l_draft_latest_ver_csr;
3782 
3783                 END IF;
3784                 CLOSE l_draft_ver_csr;
3785 
3786             END IF;
3787 
3788         ELSIF p_status_code IN ('APPROVED','ON_HOLD','PENDING_APPROVAL') THEN
3789             -- begin changes
3790             IF (p_status_code = 'PENDING_APPROVAL' AND
3791                 NVL(p_doc_type,'*') = 'TEMPLATE' AND
3792                 p_doc_id is not null) THEN
3793 
3794                 OPEN l_pen_app_selected_ver_csr;
3795                 FETCH l_pen_app_selected_ver_csr INTO l_article_version_id;
3796 
3797                 IF l_pen_app_selected_ver_csr%NOTFOUND THEN
3798                     l_stop := FALSE;
3799                 END IF;
3800                 CLOSE l_pen_app_selected_ver_csr;
3801             ELSE
3802                 l_stop := FALSE;
3803             END IF;
3804 
3805             IF NOT l_stop THEN
3806             -- end changes
3807 
3808                 OPEN l_approved_ver_csr(l_effective_date);
3809                 FETCH l_approved_ver_csr INTO l_article_version_id;
3810                 IF l_approved_ver_csr%NOTFOUND THEN
3811 
3812                     OPEN l_approved_latest_ver_csr(l_effective_date);
3813                     FETCH l_approved_latest_ver_csr INTO l_article_version_id;
3814                     CLOSE l_approved_latest_ver_csr;
3815                 END IF;
3816                 CLOSE l_approved_ver_csr;
3817             END IF;
3818 
3819         END IF;
3820 
3821         RETURN l_article_version_id;
3822 
3823     END Get_latest_tmpl_art_version_id;
3824 
3825 
3826     ------------------------------------------------------
3827     -- PROCEDURE create_tmpl_clauses_to_submit
3828     -------------------------------------------------------
3829     /*
3830     --11.5.10+
3831     --finds draft clauses to be submitted with template and creates rows in OKC_TMPL_DRAFT_CLAUSES
3832     --returns whether there is a draft clause through x_drafts_present
3833     */
3834     PROCEDURE create_tmpl_clauses_to_submit  (
3835         p_api_version                  IN NUMBER,
3836         p_init_msg_list                IN VARCHAR2,
3837         p_template_id                  IN VARCHAR2,
3838         p_template_start_date          IN DATE DEFAULT NULL,
3839         p_template_end_date            IN DATE DEFAULT NULL,
3840         p_org_id                       IN NUMBER,
3841         x_drafts_present               OUT NOCOPY VARCHAR2,
3842         x_return_status                OUT NOCOPY VARCHAR2,
3843         x_msg_count                    OUT NOCOPY NUMBER,
3844         x_msg_data                     OUT NOCOPY VARCHAR2)
3845     IS
3846          l_api_name                     CONSTANT VARCHAR2(30) := 'create_tmpl_clauses_to_submit';
3847         l_effective_date           DATE;
3848         l_article_id               OKC_ARTICLES_ALL.ARTICLE_ID%TYPE;
3849         l_section_name             OKC_SECTIONS_B.HEADING%TYPE;
3850         l_article_label            OKC_SECTIONS_B.LABEL%TYPE;
3851         l_multiple_sections        VARCHAR2(1);
3852         l_return_status            VARCHAR2(1);
3853         l_start_date               OKC_TERMS_TEMPLATES_ALL.START_DATE%TYPE;
3854         l_end_date                 OKC_TERMS_TEMPLATES_ALL.END_DATE%TYPE;
3855         l_row_notfound             BOOLEAN;
3856         l_user_id                  NUMBER;
3857         l_login_id                 NUMBER;
3858 
3859 
3860         CURSOR template_csr  (cp_template_id NUMBER) is
3861             SELECT START_DATE, END_DATE
3862             FROM OKC_TERMS_TEMPLATES_ALL
3863             WHERE TEMPLATE_ID = cp_template_id;
3864 
3865         /* no longer used
3866         CURSOR expert_clauses_csr (cp_org_id NUMBER, cp_effective_date DATE,
3867             cp_template_id NUMBER) IS
3868             SELECT
3869                 oav.article_version_id,
3870                 oav.article_id,
3871                 oav.start_date,
3872                 oav.end_date
3873             FROM  okc_article_Versions oav,
3874                 okc_articles_all oaa
3875             WHERE oav.article_id  = oaa.article_id
3876                 AND oaa.org_id = cp_org_id
3877                 AND oav.article_status IN  ('DRAFT','REJECTED')
3878                 AND oav.start_date <= cp_effective_date
3879                 AND nvl(oav.end_date, nvl(cp_effective_date,sysdate) +1) >= nvl(cp_effective_date,sysdate)
3880                 AND oaa.article_id in
3881                     (SELECT clause_id from okc_xprt_clauses_v oxc
3882                     WHERE   oxc.template_id = cp_template_id);
3883         */
3884 
3885         CURSOR sec_name_csr (cp_template_id NUMBER, cp_article_id NUMBER)IS
3886             SELECT osb.heading, nvl(oka.label, '-98766554433.77'),osb.label section_label
3887             FROM okc_sections_b osb,okc_k_articles_b oka
3888             WHERE oka.document_id = cp_template_id
3889                 AND oka.sav_sae_id = cp_article_id
3890                 AND oka.scn_id = osb.id
3891                 AND rownum < 3;
3892 
3893         --this cursor returns distinct article_ids
3894         CURSOR draft_articles_csr (cp_org_id  NUMBER, cp_effective_date  DATE,
3895             cp_template_id  NUMBER)IS
3896             SELECT  oav.article_version_id,
3897                 oav.article_id
3898             FROM    okc_article_Versions oav,
3899                 okc_articles_all oaa
3900             WHERE oav.article_id  = oaa.article_id
3901                 AND oaa.org_id = cp_org_id
3902                 AND oav.article_status IN  ('DRAFT','REJECTED')
3903                 AND oaa.standard_yn = 'Y'
3904                 AND oav.start_date <= cp_effective_date
3905                 AND nvl(oav.end_date, nvl(cp_effective_date,sysdate) +1) >= nvl(cp_effective_date,sysdate)
3906                 AND oaa.article_id in
3907                     (SELECT  sav_sae_id from okc_k_articles_b oka
3908                     WHERE   oka.document_id = cp_template_id
3909                     AND     oka.document_type='TEMPLATE');
3910 
3911         CURSOR valid_ver_csr (cp_article_id NUMBER, cp_article_version_id NUMBER,
3912             cp_template_effective_date DATE) IS
3913             SELECT 'Y' from okc_Article_versions
3914             WHERE article_id = cp_article_id
3915                 AND article_version_id <> cp_article_version_id
3916                 AND article_status = 'APPROVED'
3917                 AND start_date <= cp_template_effective_date
3918                 AND nvl(end_date, nvl(cp_template_effective_date,sysdate) +1) >= nvl(cp_template_effective_date,sysdate)
3919                 AND rownum < 2;
3920 
3921         CURSOR fnd_section_name_csr is
3922             SELECT meaning
3923             FROM fnd_lookups
3924             WHERE lookup_code = 'UNASSIGNED' and lookup_type = 'OKC_ARTICLE_SECTION';
3925 
3926 -- muteshev bug#4327485 begin
3927 -- created new cursor selected_yn_csr
3928 -- it takes selected_yn flag value from table OKC_TMPL_DRAFT_CLAUSES
3929         cursor selected_yn_csr( cp_template_id number,
3930                                 cp_article_id number,
3931                                 cp_article_version_id number) is
3932             select selected_yn
3933             from OKC_TMPL_DRAFT_CLAUSES
3934             where template_id = cp_template_id
3935             and article_id = cp_article_id
3936             and article_version_id = cp_article_version_id;
3937 -- muteshev bug#4327485 end
3938 
3939         TYPE  draft_articles_tbl_type   is TABLE of draft_articles_csr%ROWTYPE  INDEX BY BINARY_INTEGER;
3940         TYPE sec_details_tbl_type       is TABLE of sec_name_csr%ROWTYPE   INDEX BY BINARY_INTEGER ;
3941         TYPE section_label_tbl_type    IS TABLE of OKC_SECTIONS_B.LABEL%TYPE INDEX BY BINARY_INTEGER ;
3942         TYPE article_id_tbl_type    IS TABLE of OKC_TMPL_DRAFT_CLAUSES.ARTICLE_ID%TYPE INDEX BY BINARY_INTEGER ;
3943         TYPE article_version_id_tbl_type    IS TABLE of OKC_TMPL_DRAFT_CLAUSES.ARTICLE_VERSION_ID%TYPE INDEX BY BINARY_INTEGER ;
3944         TYPE section_name_tbl_type    IS TABLE of OKC_TMPL_DRAFT_CLAUSES.SECTION_NAME%TYPE INDEX BY BINARY_INTEGER ;
3945         TYPE article_label_tbl_type    IS TABLE of OKC_TMPL_DRAFT_CLAUSES.ARTICLE_LABEL%TYPE INDEX BY BINARY_INTEGER ;
3946         TYPE multiple_scns_yn_tbl_type    IS TABLE of OKC_TMPL_DRAFT_CLAUSES.MULTIPLE_SCNS_YN%TYPE INDEX BY BINARY_INTEGER ;
3947         TYPE prev_val_version_yn_tbl_type    IS TABLE of OKC_TMPL_DRAFT_CLAUSES.PREV_VAL_VERSION_YN%TYPE INDEX BY BINARY_INTEGER ;
3948         TYPE selected_yn_tbl_type    IS TABLE of OKC_TMPL_DRAFT_CLAUSES.SELECTED_YN%TYPE INDEX BY BINARY_INTEGER ;
3949 
3950         draft_articles_tbl              draft_articles_tbl_type;
3951         sec_details_tbl                 sec_details_tbl_type;
3952 
3953         article_id_tbl                  article_id_tbl_type;
3954         article_version_id_tbl          article_version_id_tbl_type;
3955         section_name_tbl                section_name_tbl_type;
3956         article_label_tbl               article_label_tbl_type;
3957         t_section_name_tbl                section_name_tbl_type;
3958         t_article_label_tbl               article_label_tbl_type;
3959         multiple_scns_yn_tbl            multiple_scns_yn_tbl_type;
3960         prev_val_version_yn_tbl         prev_val_version_yn_tbl_type;
3961         selected_yn_tbl                 selected_yn_tbl_type;
3962         t_section_label_tbl             section_label_tbl_type;
3963     BEGIN
3964 
3965         x_return_status            := G_RET_STS_SUCCESS;
3966         x_drafts_present           := 'N';
3967         l_row_notfound             := false;
3968 
3969         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3970             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'100: Entering create_tmpl_clauses_to_submit');
3971         END IF;
3972 
3973 
3974         IF p_template_start_date is NULL THEN
3975 
3976             OPEN template_csr (p_template_id);
3977             FETCH template_csr into l_start_date, l_end_date;
3978             l_row_notfound := template_csr%NOTFOUND;
3979             CLOSE template_csr;
3980 
3981             IF l_row_notfound THEN
3982                 Okc_Api.Set_Message(
3983                     p_app_name     => G_APP_NAME,
3984                     p_msg_name     => 'OKC_TERM_INVALID_TEMPLATE_ID');
3985                 RAISE FND_API.G_EXC_ERROR;
3986             END IF;
3987 
3988         ELSE
3989             l_start_date := p_template_start_date;
3990             l_end_date := p_template_end_date;
3991         END IF;
3992 
3993         IF NVL(l_end_date,sysdate) >= sysdate  THEN
3994             IF l_start_date > sysdate THEN
3995                 l_effective_date := l_start_date;
3996             ELSE
3997                 l_effective_date := sysdate;
3998             END IF;
3999         ELSE
4000             l_effective_date := l_end_date;
4001         END IF;
4002 
4003         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4004             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'200: Effective date is '||l_effective_date);
4005         END IF;
4006 
4007 
4008         OPEN draft_articles_csr(p_org_id, l_effective_date, p_template_id);
4009         FETCH draft_articles_csr BULK COLLECT INTO article_version_id_tbl, article_id_tbl;
4010         CLOSE draft_articles_csr;
4011 
4012         IF article_id_tbl.COUNT = 0  THEN
4013             x_drafts_present := 'N';
4014         ELSIF article_id_tbl.COUNT > 0 THEN
4015             x_drafts_present := 'Y';
4016             IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4017                 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'300: Draft clauses exist. Number of Draft clauses: '||draft_articles_tbl.COUNT);
4018             END IF;
4019 
4020 
4021             FOR i IN article_id_tbl.FIRST..article_id_tbl.LAST LOOP
4022 
4023                 -- initiliaze all tables so that subscripts are always in sync
4024                 section_name_tbl(i)             := NULL;
4025                 article_label_tbl(i)            := NULL;
4026                 t_section_name_tbl(i)             := NULL;
4027                 t_article_label_tbl(i)            := NULL;
4028                 multiple_scns_yn_tbl(i)         := 'N';
4029                 prev_val_version_yn_tbl(i)      := NULL;
4030                 selected_yn_tbl(i)              := NULL;
4031 
4032                 OPEN sec_name_csr(p_template_id , article_id_tbl(i));
4033                 FETCH sec_name_csr BULK COLLECT INTO t_section_name_tbl, t_article_label_tbl, t_section_label_tbl;
4034                 CLOSE sec_name_csr;
4035 
4036                 IF t_section_name_tbl.COUNT > 0 Then
4037                     IF t_section_name_tbl.COUNT = 2  then
4038                         multiple_scns_yn_tbl(i)  := 'Y';
4039                     ELSE
4040                         multiple_scns_yn_tbl(i)  := 'N';
4041                     END IF;
4042                              article_label_tbl(i) := t_article_label_tbl(1);
4043            section_name_tbl(i) :=  t_section_label_tbl(1) || ' ' || t_section_name_tbl(1);
4044                 ELSE
4045                     --retrieve 'Unassigned' if there is no section name
4046                     OPEN fnd_section_name_csr;
4047                     FETCH fnd_section_name_csr INTO section_name_tbl(i);
4048                     CLOSE fnd_section_name_csr;
4049                 END IF;
4050 
4051                 OPEN valid_ver_csr(article_id_tbl(i),
4052                     article_version_id_tbl(i), l_effective_date);
4053                 FETCH valid_ver_csr into prev_val_version_yn_tbl(i);
4054                 l_row_notfound := valid_ver_csr%NOTFOUND;
4055                 CLOSE valid_ver_csr;
4056 
4057                 IF l_row_notfound THEN
4058                     prev_val_version_yn_tbl(i) := 'N';
4059                 ELSE
4060                     prev_val_version_yn_tbl(i) := 'Y';
4061                 END IF;
4062 
4063 -- muteshev bug#4327485 begin
4064 -- instead of unconditionally setting selected_yn := 'Y'
4065 -- use selected_yn_csr and set selected_yn flag accordingly:
4066 -- if %found use cursor result value for selected_yn,
4067 -- if %notfound use selected_yn := 'Y' (by default)
4068                 open selected_yn_csr(   p_template_id,
4069                                         article_id_tbl(i),
4070                                         article_version_id_tbl(i));
4071                 fetch selected_yn_csr into selected_yn_tbl(i);
4072                 if selected_yn_csr%NOTFOUND then
4073                     selected_yn_tbl(i) := 'Y';
4074                 end if;
4075                 close selected_yn_csr;
4076 -- muteshev bug#4327485 end
4077 
4078             END LOOP;
4079 
4080         END IF ;
4081 
4082         draft_articles_tbl.DELETE;
4083 
4084 
4085         --delete old records associated with the template id
4086         DELETE FROM OKC_TMPL_DRAFT_CLAUSES
4087             WHERE template_id = p_template_id;
4088 
4089         IF  article_id_tbl.COUNT > 0 THEN
4090             l_user_id                  := Fnd_Global.user_id;
4091             l_login_id                 := Fnd_Global.login_id;
4092 
4093             FORALL i IN article_id_tbl.FIRST .. article_id_tbl.LAST
4094 
4095             INSERT INTO OKC_TMPL_DRAFT_CLAUSES
4096             (
4097                 TEMPLATE_ID,
4098                 ARTICLE_ID,
4099                 ARTICLE_VERSION_ID,
4100                 SECTION_NAME,
4101                 ARTICLE_LABEL,
4102                 MULTIPLE_SCNS_YN,
4103                 PREV_VAL_VERSION_YN,
4104                 SELECTED_YN,
4105                 WF_SEQ_ID,
4106                 OBJECT_VERSION_NUMBER,
4107                 CREATED_BY,
4108                 CREATION_DATE,
4109                 LAST_UPDATE_DATE,
4110                 LAST_UPDATED_BY,
4111                 LAST_UPDATE_LOGIN
4112             )
4113             VALUES
4114             (
4115                 p_template_id,
4116                 article_id_tbl(i),
4117                 article_version_id_tbl(i),
4118                 section_name_tbl(i),
4119                 decode(article_label_tbl(i),'-98766554433.77',NULL,article_label_tbl(i)),
4120                 multiple_scns_yn_tbl(i),
4121                 prev_val_version_yn_tbl(i),
4122                 selected_yn_tbl(i),
4123                 null,
4124                 1,
4125                 l_user_id,
4126                 sysdate,
4127                 sysdate,
4128                 l_user_id,
4129                 l_login_id);
4130             --COMMIT;
4131         END IF;
4132 
4133     EXCEPTION
4134         WHEN FND_API.G_EXC_ERROR THEN
4135             IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4136                 FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'300: Leaving create_tmpl_clauses_to_submit: OKC_API.G_EXCEPTION_ERROR Exception');
4137             END IF;
4138             x_return_status := G_RET_STS_ERROR;
4139 
4140         WHEN OTHERS THEN
4141             IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4142                 FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'500: Leaving create_tmpl_clauses_to_submit because of EXCEPTION: '||sqlerrm);
4143             END IF;
4144             Okc_Api.Set_Message(
4145                 p_app_name     => G_APP_NAME,
4146                 p_msg_name     => G_UNEXPECTED_ERROR,
4147                 p_token1       => G_SQLCODE_TOKEN,
4148                 p_token1_value => sqlcode,
4149                 p_token2       => G_SQLERRM_TOKEN,
4150                 p_token2_value => sqlerrm);
4151                 x_return_status := G_RET_STS_ERROR;
4152 
4153     END create_tmpl_clauses_to_submit;
4154 
4155 
4156     ---------------------------------------------------------------------------
4157     -- Overloaded Procedure merge_template_working_copy
4158     ---------------------------------------------------------------------------
4159     /*
4160     -- PROCEDURE merge_template_working_copy, 11.5.10+ overloaded version
4161     -- To be used to merge a working copy of a template is approved and old copy
4162     -- and working copy
4163     -- new out parameter x_parent_template_id returns the template id of the merged template
4164     */
4165     PROCEDURE merge_template_working_copy (
4166         p_api_version           IN  NUMBER,
4167         p_init_msg_list         IN  VARCHAR2 DEFAULT FND_API.G_FALSE,
4168         p_commit                IN  VARCHAR2 DEFAULT FND_API.G_FALSE,
4169         x_return_status         OUT NOCOPY VARCHAR2,
4170         x_msg_data              OUT NOCOPY VARCHAR2,
4171         x_msg_count             OUT NOCOPY NUMBER,
4172 
4173         p_template_id           IN  NUMBER,
4174         x_parent_template_id    OUT NOCOPY NUMBER)
4175     IS
4176  l_api_name                     CONSTANT VARCHAR2(30) := 'merge_template_working_copy';
4177     BEGIN
4178 
4179         -- call the existing procedure
4180         merge_template_working_copy (
4181         p_api_version           => p_api_version,
4182         p_init_msg_list         => p_init_msg_list,
4183         p_commit                => p_commit,
4184 
4185         x_return_status         => x_return_status,
4186         x_msg_data              => x_msg_data,
4187         x_msg_count             => x_msg_count,
4188 
4189         p_template_id           => p_template_id);
4190 
4191         -- set the out param from the global variable set by the
4192         -- existing procedure
4193         x_parent_template_id := g_parent_template_id;
4194 
4195     END merge_template_working_copy;
4196 
4197     FUNCTION unadopted_art_exist_on_tmpl(
4198             p_template_id          IN NUMBER,
4199       p_org_id               IN NUMBER )
4200     RETURN VARCHAR2 IS
4201     l_dummy VARCHAR2(1) := 'N';
4202     l_api_name CONSTANT VARCHAR2(30) := 'unadopted_art_exist_on_tmpl';
4203 
4204 -- Fix for the bug# 5011432, reframed the cursor query
4205     CURSOR unadopted_art_chk_csr(lc_tmpl_id NUMBER,
4206                                  lc_org_id NUMBER) IS
4207 SELECT 'Y'
4208     FROM okc_terms_templates_all tmpl,
4209          okc_k_articles_b kart,
4210 	    okc_article_versions ver
4211     WHERE tmpl.template_id = lc_tmpl_id
4212     AND   kart.document_id = tmpl.template_id
4213     AND   kart.document_type = 'TEMPLATE'
4214     AND   ver.article_id = kart.sav_sae_id
4215     AND   ver.global_yn = 'Y'
4216     AND NOT EXISTS (SELECT 1
4217                     FROM okc_article_adoptions  adp,
4218                          okc_article_versions ver1
4219                     WHERE adp.global_article_version_id = ver1.article_version_id
4220                     AND   ver1.article_id = ver.article_id
4221                     AND   adp.local_org_id =   lc_org_id
4222                     AND   adp.adoption_status IN ( 'APPROVED', 'ON_HOLD')
4223                     AND   adp.adoption_type = 'ADOPTED');
4224 -- End of Fix for the bug# 5011432
4225 BEGIN
4226 
4227     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4228       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'100: Entered unadopted_art_exist_on_tmpl');
4229     END IF;
4230 
4231    OPEN unadopted_art_chk_csr(p_template_id,p_org_id);
4232    FETCH unadopted_art_chk_csr INTO l_dummy;
4233    CLOSE unadopted_art_chk_csr;
4234 
4235     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4236       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'200: Fetched unadopted_art_chk_csr');
4237       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'300: l_dummy='||l_dummy);
4238     END IF;
4239 
4240       RETURN l_dummy;
4241 
4242     EXCEPTION
4243       WHEN OTHERS THEN
4244         IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4245           FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'400: Leaving unadopted_art_exist_on_tmpl because of EXCEPTION: '||sqlerrm);
4246         END IF;
4247 
4248       IF (unadopted_art_chk_csr%ISOPEN) THEN
4249         CLOSE unadopted_art_chk_csr;
4250       END IF;
4251       RETURN l_dummy;
4252 
4253     END unadopted_art_exist_on_tmpl;
4254 
4255 
4256     -- Start of comments
4257     --API name      : update_contract_admin
4258     --Type          : Private.
4259     --Function      : API to update Contract Administrator of Blanket Sales
4260     --                Agreements, Sales Orders and Sales Quotes
4261     --Pre-reqs      : None.
4262     --Parameters    :
4263     --IN            : p_api_version         IN NUMBER       Required
4264     --              : p_init_msg_list       IN VARCHAR2     Optional
4265     --                   Default = FND_API.G_FALSE
4266     --              : p_commit              IN VARCHAR2     Optional
4267     --                   Default = FND_API.G_FALSE
4268     --              : p_doc_ids_tbl         IN doc_ids_tbl       Required
4269     --                   List of document ids whose Contract Administrator to be changed
4270     --              : p_doc_types_tbl       IN doc_types_tbl       Required
4271     --                   List of document types whose Contract Administrator to be changed
4272     --              : p_new_con_admin_user_ids_tbl IN new_con_admin_user_ids_tbl       Required
4273     --                   List of new Contract Administrator ids
4274     --OUT           : x_return_status       OUT  VARCHAR2(1)
4275     --              : x_msg_count           OUT  NUMBER
4276     --              : x_msg_data            OUT  VARCHAR2(2000)
4277     --Note          :
4278     -- End of comments
4279     PROCEDURE update_contract_admin(
4280                                     p_api_version     IN   NUMBER,
4281                                     p_init_msg_list   IN   VARCHAR2,
4282                                     p_commit          IN   VARCHAR2,
4283                                     p_doc_ids_tbl     IN   doc_ids_tbl,
4284                                     p_doc_types_tbl              IN   doc_types_tbl,
4285                                     p_new_con_admin_user_ids_tbl IN   new_con_admin_user_ids_tbl,
4286                                     x_return_status   OUT NOCOPY   VARCHAR2,
4287                                     x_msg_count       OUT NOCOPY  NUMBER,
4288                                     x_msg_data        OUT NOCOPY  VARCHAR2)
4289     IS
4290 
4291       l_api_name          VARCHAR2(30);
4292       l_api_version       NUMBER;
4293       dml_errors exception;
4294 
4295     BEGIN
4296 
4297       l_api_name := 'update_contract_admin';
4298       l_api_version := 1.0;
4299 
4300       IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4301         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
4302               'Entered OKC_TERMS_UTIL_PVT.update_contract_admin');
4303       END IF;
4304 
4305       -- Standard Start of API savepoint
4306       SAVEPOINT update_contract_admin;
4307 
4308       -- Standard call to check for call compatibility.
4309       IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
4310         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4311       END IF;
4312 
4313       -- Initialize message list if p_init_msg_list is set to TRUE.
4314       IF FND_API.to_Boolean( p_init_msg_list ) THEN
4315         FND_MSG_PUB.initialize;
4316       END IF;
4317 
4318       --  Initialize API return status to success
4319       x_return_status := FND_API.G_RET_STS_SUCCESS;
4320 
4321       FORALL  i  IN  p_doc_ids_tbl.FIRST..p_doc_ids_tbl.LAST
4322         UPDATE  okc_template_usages
4323         SET     contract_admin_id = p_new_con_admin_user_ids_tbl(i)
4324         WHERE   document_id = p_doc_ids_tbl(i)
4325         AND     document_type = p_doc_types_tbl(i);
4326 
4327       IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4328         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
4329                  'Leaving OKC_TERMS_UTIL_PVT.update_contract_admin');
4330       END IF;
4331 
4332       EXCEPTION
4333 
4334         WHEN OTHERS THEN
4335           IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4336              fnd_log.string(FND_LOG.LEVEL_EXCEPTION,
4337                    g_module || l_api_name,
4338                    'Leaving OKC_TERMS_UTIL_PVT.update_contract_admin because of EXCEPTION: ' || sqlerrm);
4339           END IF;
4340 
4341           ROLLBACK TO update_contract_admin;
4342 
4343           x_return_status := FND_API.G_RET_STS_ERROR;
4344           FND_MSG_PUB.Count_And_Get(
4345                   p_count =>  x_msg_count,
4346                   p_data  =>  x_msg_data);
4347 
4348 
4349     END update_contract_admin;
4350 
4351 
4352     -- Start of comments
4353     --API name      : get_sales_group_con_admin
4354     --Type          : Private.
4355     --Function      : API to get Contract Administrator of a business document
4356     --                according to Sales Group Assignment
4357     --Pre-reqs      : None.
4358     --Parameters    :
4359     --IN            : p_api_version         IN NUMBER       Required
4360     --              : p_init_msg_list       IN VARCHAR2     Optional
4361     --                   Default = FND_API.G_FALSE
4362     --              : p_doc_id         IN NUMBER       Required
4363     --                   Id of document whose Contract Administrator is required
4364     --              : p_doc_type       IN VARCHAR2       Required
4365     --                   Type of document whose Contract Administrator is required
4366     --OUT           : x_new_con_admin_user_id OUT NUMBER
4367     --                   New Contract Administrator id
4368     --              : x_return_status       OUT  VARCHAR2(1)
4369     --              : x_msg_count           OUT  NUMBER
4370     --              : x_msg_data            OUT  VARCHAR2(2000)
4371     --Note          :
4372     -- End of comments
4373     PROCEDURE get_sales_group_con_admin(
4374                                     p_api_version             IN  NUMBER,
4375                                     p_init_msg_list           IN  VARCHAR2,
4376                                     p_doc_id                  IN  NUMBER,
4377                                     p_doc_type                IN  VARCHAR2,
4378                                     x_new_con_admin_user_id   OUT NOCOPY  NUMBER,
4379                                     x_return_status           OUT NOCOPY  VARCHAR2,
4380                                     x_msg_count               OUT NOCOPY  NUMBER,
4381                                     x_msg_data                OUT NOCOPY  VARCHAR2)
4382     IS
4383 
4384       l_api_name          VARCHAR2(30);
4385       l_api_version       NUMBER;
4386       l_primary_salesperson_id  aso_quote_headers_all.resource_id%TYPE;
4387       l_sales_group_id  aso_quote_headers_all.resource_grp_id%TYPE;
4388       l_quote_org_id  aso_quote_headers_all.org_id%TYPE;
4389       l_quote_number  aso_quote_headers_all.quote_number%TYPE;
4390 
4391       CURSOR quote_details_csr IS
4392         SELECT resource_id,
4393                resource_grp_id,
4394                quote_number
4395         FROM   aso_quote_headers_all
4396         WHERE  quote_header_id = p_doc_id;
4397 
4398       CURSOR quote_sales_team_csr(p_quote_number IN aso_quote_headers_all.quote_number%TYPE) IS
4399         SELECT sre.user_id
4400         FROM   aso_quote_accesses sales_team,
4401                 jtf_rs_role_relations rr,
4402                 jtf_rs_roles_b rl,
4403                 jtf_rs_resource_extns sre
4404         WHERE  sales_team.quote_number = p_quote_number
4405         AND    rr.ROLE_ID = rl.ROLE_ID
4406         AND    NVL(rr.delete_flag,'N')  <> 'Y'
4407         AND    rr.Role_resource_type = 'RS_INDIVIDUAL'
4408 -- For Bug# 6343627         AND    (rr.end_date_active IS NULL  OR  rr.end_date_active >= SYSDATE)
4409 	AND    (rr.end_date_active IS NULL  OR  rr.end_date_active > SYSDATE)
4410         AND    (
4411                  (rl.role_type_code = 'CONTRACTS' AND rl.role_code = 'CONTRACTS_ADMIN')
4412                OR
4413                  (rl.role_type_code = 'SALES'     AND rl.role_code = 'CONTRACTS_ADMIN')
4414                OR
4415                  (rl.role_code = 'CONTRACTS_ADMIN')
4416                )
4417         AND    rr.role_resource_id = sales_team.resource_id
4418         AND    sre.resource_id = sales_team.resource_id;
4419 
4420       CURSOR con_admin_role_member_csr(p_sales_group_id IN aso_quote_headers_all.resource_grp_id%TYPE) IS
4421         SELECT sre.user_id
4422         FROM  jtf_rs_group_members srg,
4423               jtf_rs_resource_extns sre,
4424               jtf_rs_role_relations rr,
4425               jtf_rs_roles_b rl
4426         WHERE  srg.group_id = p_sales_group_id
4427         AND    srg.resource_id = sre.resource_id
4428         AND    NVL(srg.delete_flag,'N')  <> 'Y'
4429         AND    rr.ROLE_ID = rl.ROLE_ID
4430         AND    NVL(rr.delete_flag,'N')  <> 'Y'
4431 	 -- For Bug# 6343627 AND            AND    rr.Role_resource_type = 'RS_INDIVIDUAL'
4432         AND    rr.Role_resource_type = 'RS_GROUP_MEMBER'
4433  -- For Bug# 6343627        AND    (rr.end_date_active IS NULL  OR  rr.end_date_active >= SYSDATE)
4434         AND    (rr.end_date_active IS NULL  OR  rr.end_date_active > SYSDATE)
4435         AND    rl.role_type_code = 'CONTRACTS'
4436         AND    rl.role_code = 'CONTRACTS_ADMIN'
4437 	 -- For Bug# 6343627       AND    rr.role_resource_id = sre.resource_id;
4438         AND    rr.role_resource_id = srg.GROUP_MEMBER_ID;
4439 
4440       CURSOR parent_group_csr(p_sales_group_id IN aso_quote_headers_all.resource_grp_id%TYPE) IS
4441         SELECT related_group_id
4442         FROM  jtf_rs_grp_relations
4443         WHERE group_id = p_sales_group_id
4444         AND   relation_type = 'PARENT_GROUP';
4445 
4446     BEGIN
4447 
4448       l_api_name := 'get_sales_group_con_admin';
4449       l_api_version := 1.0;
4450 
4451       IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4452         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
4453           'Entered OKC_TERMS_UTIL_PVT.get_sales_group_con_admin');
4454         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
4455                 'p_doc_id: ' || p_doc_id);
4456         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
4457                 'p_doc_type: ' || p_doc_type);
4458       END IF;
4459 
4460       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4461         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4462                 'Getting current Sales Quote details');
4463       END IF;
4464 
4465       -- Get details of the current Sales Quote
4466       OPEN quote_details_csr;
4467       FETCH quote_details_csr INTO l_primary_salesperson_id, l_sales_group_id, l_quote_number;
4468       CLOSE quote_details_csr;
4469 
4470       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4471         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4472                 'Getting Contract Administrator from Sales Quote''s Sales Team');
4473       END IF;
4474 
4475       -- From Sales Team of the Quote, pick the user with a role type of Contracts and
4476       -- a role of Contract Administrator, if this isn't available, pick the user with
4477       -- a role type of Sales and a role of Contract Administrator, and if this isn't
4478       -- available, pick the user with any role type and a role of Contract Administrator
4479       OPEN quote_sales_team_csr(l_quote_number);
4480 
4481       -- Even though the cursor returns multiple rows we'll consider only the first row in
4482       -- the resultset, so we're not looping through the resultset
4483       FETCH quote_sales_team_csr INTO x_new_con_admin_user_id;
4484       CLOSE quote_sales_team_csr;
4485 
4486 
4487       -- If no Contract Administrator defined on the sales team,
4488       IF(x_new_con_admin_user_id IS NULL) THEN
4489 
4490         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4491             FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4492                     'No Contract Administrator found in Sales Quote''s Sales Team');
4493         END IF;
4494 
4495         -- If current Quote has a Primary Sales Group selected
4496         IF(l_sales_group_id IS NOT NULL) THEN
4497 
4498           IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4499             FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4500                'Getting Contract Administrator from current Quote''s Primary Salesperson''s Primary Sales Group');
4501           END IF;
4502 
4503           -- Look at the primary sales group in the Quote for a Contract Administrator
4504           OPEN con_admin_role_member_csr(l_sales_group_id);
4505           FETCH con_admin_role_member_csr INTO x_new_con_admin_user_id;
4506           CLOSE con_admin_role_member_csr;
4507 
4508           -- In the case where neither the sales team nor the primary sales group have a contract administrator defined,
4509           IF(x_new_con_admin_user_id IS NULL) THEN
4510 
4511             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4512               FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4513                  'No Contract Administrator found in the current Quote''s Primary Salesperson''s Primary Sales Group');
4514               FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4515                  'Getting parent group of the current Quote''s Primary Salesperson''s Primary Sales Group');
4516             END IF;
4517 
4518             -- Get parent of the primary Salesperson's primary sales group in the Quote
4519             OPEN parent_group_csr(l_sales_group_id);
4520             FETCH parent_group_csr INTO l_sales_group_id;
4521             CLOSE parent_group_csr;
4522 
4523             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4524                 FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4525                    'Getting Contract Administrator from parent of current Quote''s Primary Salesperson''s Primary Sales Group');
4526             END IF;
4527 
4528             -- Check the parent sales group for a Contract Administrator
4529             OPEN con_admin_role_member_csr(l_sales_group_id);
4530             FETCH con_admin_role_member_csr INTO x_new_con_admin_user_id;
4531             CLOSE con_admin_role_member_csr;
4532 
4533           END IF; -- End of (x_new_con_admin_user_id IS NULL)
4534 
4535         END IF; -- End of (l_sales_group_id IS NOT NULL)
4536 
4537       END IF; -- End of (x_new_con_admin_user_id IS NULL)
4538 
4539       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4540         FND_LOG.STRING( FND_LOG.LEVEL_STATEMENT ,G_MODULE||l_api_name,
4541            'New Contract Administrator Id ' || x_new_con_admin_user_id);
4542       END IF;
4543 
4544 
4545       IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4546         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,G_MODULE||l_api_name,
4547              'Leaving OKC_TERMS_UTIL_PVT.get_sales_group_con_admin');
4548       END IF;
4549 
4550     EXCEPTION
4551 
4552         WHEN OTHERS THEN
4553           IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4554              fnd_log.string(FND_LOG.LEVEL_EXCEPTION,
4555                    g_module || l_api_name,
4556                    'Leaving OKC_TERMS_UTIL_PVT.get_sales_group_con_admin because of EXCEPTION: ' || sqlerrm);
4557           END IF;
4558 
4559           x_return_status := FND_API.G_RET_STS_ERROR;
4560           FND_MSG_PUB.Count_And_Get(
4561                   p_count =>  x_msg_count,
4562                   p_data  =>  x_msg_data);
4563 
4564         --close cursors
4565         IF (quote_details_csr%ISOPEN) THEN
4566           CLOSE quote_details_csr ;
4567         END IF;
4568         IF (quote_sales_team_csr%ISOPEN) THEN
4569           CLOSE quote_sales_team_csr ;
4570         END IF;
4571         IF (con_admin_role_member_csr%ISOPEN) THEN
4572           CLOSE con_admin_role_member_csr ;
4573         END IF;
4574         IF (parent_group_csr%ISOPEN) THEN
4575           CLOSE parent_group_csr ;
4576         END IF;
4577 
4578     END get_sales_group_con_admin;
4579 
4580 FUNCTION has_uploaded_terms(p_document_type IN VARCHAR2,
4581                         p_document_id   IN NUMBER
4582             )
4583   RETURN Varchar2 IS
4584   l_has_uploaded_terms VARCHAR2(1);
4585 
4586   CURSOR l_review_uploaded_terms_csr IS
4587   SELECT 'Y'
4588   FROM okc_review_upld_terms rev
4589   WHERE rev.document_type = p_document_type
4590   AND rev.document_id = p_document_id
4591     ;
4592 BEGIN
4593   OPEN l_review_uploaded_terms_csr;
4594   FETCH l_review_uploaded_terms_csr INTO l_has_uploaded_terms;
4595   IF l_has_uploaded_terms = 'Y' THEN
4596     RETURN 'Y';
4597   else
4598     RETURN 'N';
4599   END IF;
4600   CLOSE l_review_uploaded_terms_csr;
4601 
4602 EXCEPTION
4603   WHEN OTHERS THEN
4604     RETURN 'N';
4605 END has_uploaded_terms;
4606 
4607 
4608 FUNCTION is_terms_locked(p_document_type IN VARCHAR2,
4609                         p_document_id   IN NUMBER
4610             )
4611   RETURN Varchar2 IS
4612   l_terms_locked VARCHAR2(1);
4613 
4614   CURSOR l_terms_locked_csr IS
4615   SELECT  lock_terms_flag
4616   FROM okc_template_usages usg
4617   WHERE usg.document_type = p_document_type
4618   AND usg.document_id = p_document_id
4619     ;
4620 BEGIN
4621   OPEN l_terms_locked_csr;
4622   FETCH l_terms_locked_csr INTO l_terms_locked;
4623   IF l_terms_locked = 'Y' THEN
4624     RETURN 'Y';
4625   else
4626     RETURN 'N';
4627   END IF;
4628   CLOSE l_terms_locked_csr;
4629 
4630 EXCEPTION
4631   WHEN OTHERS THEN
4632     RETURN 'N';
4633 END is_terms_locked;
4634 
4635 
4636 
4637 FUNCTION get_default_contract_admin_id(p_document_type IN VARCHAR2,
4638          p_document_id IN NUMBER)
4639   RETURN NUMBER IS
4640   l_api_version      CONSTANT NUMBER := 1;
4641   l_default_ctrt_admin_id NUMBER;
4642   l_return_status VARCHAR2(150);
4643   l_msg_data VARCHAR2(2000);
4644   l_msg_count NUMBER;
4645   BEGIN
4646 
4647   IF (p_document_type <> 'QUOTE') THEN
4648      RETURN NULL;
4649   END IF;
4650    get_sales_group_con_admin(
4651        p_api_version             => l_api_version,
4652 	  p_init_msg_list           => FND_API.G_FALSE,
4653 	  p_doc_id                  => p_document_id,
4654 	  p_doc_type                => p_document_type,
4655 	  x_new_con_admin_user_id   => l_default_ctrt_admin_id,
4656 	  x_return_status           => l_return_status,
4657 	  x_msg_count               => l_msg_count,
4658 	  x_msg_data                => l_msg_data);
4659 
4660     RETURN l_default_ctrt_admin_id;
4661    EXCEPTION
4662       WHEN OTHERS THEN
4663 	    RETURN NULL;
4664 END get_default_contract_admin_id;
4665 
4666 FUNCTION get_contract_admin_name(p_contract_admin_id NUMBER)
4667   RETURN VARCHAR2 IS
4668   l_contract_admin_name PER_ALL_PEOPLE_F.FULL_NAME%TYPE := NULL;
4669 
4670   CURSOR get_ctrt_admin_name IS
4671     select adminppl.full_name
4672       from fnd_user ctrtadm, PER_ALL_PEOPLE_F adminppl
4673 	 where p_contract_admin_id = ctrtadm.user_id(+)
4674 	 and ctrtadm.employee_id = adminppl.person_id(+)
4675 	 and adminppl.effective_start_date = adminppl.start_date;
4676   BEGIN
4677 
4678   IF (p_contract_admin_id is NULL) THEN
4679      RETURN NULL;
4680   END IF;
4681 
4682      OPEN get_ctrt_admin_name;
4683 	FETCH get_ctrt_admin_name into l_contract_admin_name;
4684 	CLOSE get_ctrt_admin_name;
4685     RETURN l_contract_admin_name;
4686    EXCEPTION
4687       WHEN OTHERS THEN
4688 	    RETURN NULL;
4689 END get_contract_admin_name;
4690 
4691 PROCEDURE get_default_contract_admin(
4692   p_api_version          IN  NUMBER,
4693   p_init_msg_list        IN  VARCHAR2 :=  FND_API.G_FALSE,
4694 
4695   p_document_type        IN  VARCHAR2,
4696   p_document_id           IN  NUMBER,
4697   x_has_default_contract_admin OUT NOCOPY VARCHAR2,
4698   x_def_contract_admin_name OUT NOCOPY VARCHAR2,
4699   x_def_contract_admin_id OUT NOCOPY NUMBER,
4700   x_return_status        OUT NOCOPY VARCHAR2,
4701   x_msg_data             OUT NOCOPY VARCHAR2,
4702   x_msg_count            OUT NOCOPY NUMBER
4703   )
4704 
4705   IS
4706     l_api_version      CONSTANT NUMBER := 1;
4707   l_api_name         CONSTANT VARCHAR2(30) := 'get_default_contract_admin';
4708 BEGIN
4709 
4710     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4711        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'8000: Entered get_default_contract_admin');
4712     END IF;
4713 
4714     -- Standard call to check for call compatibility.
4715     IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
4716       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4717     END IF;
4718 
4719     -- Initialize message list if p_init_msg_list is set to TRUE.
4720     IF FND_API.to_Boolean( p_init_msg_list ) THEN
4721       FND_MSG_PUB.initialize;
4722     END IF;
4723 
4724     x_return_status := G_RET_STS_SUCCESS;
4725     x_def_contract_admin_id := NULL;
4726     x_def_contract_admin_name := NULL;
4727     x_has_default_contract_admin := 'N';
4728     x_def_contract_admin_id := get_default_contract_admin_id(p_document_type, p_document_id );
4729     if(x_def_contract_admin_id is not null) then
4730          x_has_default_contract_admin := 'Y';
4731          x_def_contract_admin_name := get_contract_admin_name(x_def_contract_admin_id);
4732     end if;
4733 
4734 
4735     -- Standard call to get message count and if count is 1, get message info.
4736     FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4737 
4738     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4739       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'8100: get_default_contract_admin');
4740     END IF;
4741 
4742 EXCEPTION
4743   WHEN OTHERS THEN
4744 
4745       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4746         FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'8200: Leaving get_default_contract_admin because of EXCEPTION:'||sqlerrm);
4747       END IF;
4748       IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
4749         FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
4750       END IF;
4751       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4752       x_return_status := G_RET_STS_UNEXP_ERROR ;
4753 END get_default_contract_admin;
4754 
4755 -- This is a temporary api that has been created to be
4756 -- used only when the layout template code is not present in session
4757 -- The layout template code is fetched based on the
4758 -- Business Document Type
4759 -- Business Document Type class
4760 -- Business Document Id
4761 -- Operating Unit
4762 FUNCTION get_layout_template_code(
4763     p_doc_type IN VARCHAR2,
4764     p_doc_type_class IN VARCHAR2,
4765     p_doc_id   IN NUMBER,
4766     p_org_id IN NUMBER)
4767     RETURN Varchar2 IS
4768     l_doc_type varchar2(10);
4769     l_doc_sub_type varchar2(30);
4770     l_layout_template_code varchar2(30) := 'E';
4771 
4772  cursor get_po_lay_templ_csr(l_doc_type VARCHAR2,l_doc_sub_type VARCHAR2) is
4773  -- Fix for bug# 5010387, replaced po_document_types_v with  po_document_types_all_b and added org_id condition
4774 SELECT
4775     contract_template_code
4776 FROM po_document_types_all_b
4777 WHERE org_id = p_org_id
4778     AND document_type_code = l_doc_type
4779     AND document_subtype= l_doc_sub_type;
4780 
4781  cursor get_souring_lay_templ_csr is
4782 SELECT
4783     podoctypes.contract_template_code
4784 FROM pon_auction_headers_all pah,
4785     po_document_types_all_b podoctypes,
4786     pon_auc_doctypes pac
4787 WHERE auction_header_id = p_doc_id
4788     AND pah.doctype_id = pac.doctype_id
4789     AND pah.org_id = podoctypes.org_id
4790     AND pac.document_type_code = podoctypes.document_type_code;
4791 
4792  cursor get_bsa_lay_templ_csr is
4793 SELECT
4794     xdb.template_code
4795 FROM oe_blanket_headers_all oeb,
4796     oe_transaction_types_all otl,
4797     xdo_templates_b xdb
4798 WHERE oeb.order_type_id = otl.transaction_type_id
4799     AND oeb.header_id = p_doc_id
4800     AND otl.layout_template_id = xdb.template_id;
4801 
4802  cursor get_order_lay_templ_csr is
4803 SELECT
4804     xdb.template_code
4805 FROM oe_order_headers_all oeb,
4806     oe_transaction_types_vl otl,
4807     xdo_templates_b xdb
4808 WHERE oeb.order_type_id = otl.transaction_type_id
4809     AND oeb.header_id = p_doc_id
4810     AND otl.layout_template_id = xdb.template_id;
4811 
4812 --ER Structured Terms Authoring in Repository - strivedi
4813   CURSOR get_rep_lay_templ_csr IS
4814 SELECT
4815     xdb.template_code
4816 FROM
4817     okc_terms_templates_all otta,
4818     okc_template_usages_v otuv,
4819     xdo_templates_b xdb
4820 WHERE otuv.document_id = p_doc_id
4821     AND otuv.document_type = p_doc_type
4822     AND otuv.template_id =  otta.template_id
4823     AND otta.print_template_id = xdb.template_id;
4824 
4825  BEGIN
4826  IF p_doc_type_class = 'PO' THEN
4827     MO_GLOBAL.INIT('PO');
4828     mo_global.set_policy_context('S',p_org_id);
4829     l_doc_type := substr(p_doc_type,1,instr(p_doc_type,'_')-1);
4830     l_doc_sub_type := substr(p_doc_type,instr(p_doc_type,'_')+1,length(p_doc_type)- instr(p_doc_type,'_'));
4831     open get_po_lay_templ_csr(l_doc_type,l_doc_sub_type);
4832     fetch get_po_lay_templ_csr into l_layout_template_code;
4833     close get_po_lay_templ_csr;
4834  ELSIF p_doc_type_class = 'SOURCING' THEN
4835     MO_GLOBAL.INIT('PON');
4836     mo_global.set_policy_context('S',p_org_id);
4837     open get_souring_lay_templ_csr;
4838     fetch get_souring_lay_templ_csr into l_layout_template_code;
4839     close get_souring_lay_templ_csr;
4840  ELSIF p_doc_type_class = 'SO' or p_doc_type_class = 'BSA' THEN
4841     MO_GLOBAL.INIT('ONT');
4842     mo_global.set_policy_context('S',204);
4843     IF p_doc_type = 'O' THEN
4844         open get_order_lay_templ_csr;
4845         fetch get_order_lay_templ_csr into l_layout_template_code;
4846         close get_order_lay_templ_csr;
4847     ELSIF p_doc_type = 'B' THEN
4848         open get_bsa_lay_templ_csr;
4849         fetch get_bsa_lay_templ_csr into l_layout_template_code;
4850         close get_bsa_lay_templ_csr;
4851     END IF;
4852  ELSIF p_doc_type_class = 'QUOTE' THEN
4853     select fnd_profile.value('ASO_DEFAULT_LAYOUT_TEMPLATE') into l_layout_template_code from dual;
4854 
4855 --ER Structured Terms Authoring in Repository - strivedi
4856  ELSIF p_doc_type_class = 'REPOSITORY' THEN
4857         OPEN get_rep_lay_templ_csr;
4858         fetch get_rep_lay_templ_csr into l_layout_template_code;
4859         CLOSE get_rep_lay_templ_csr;
4860  ELSE
4861      l_layout_template_code := 'E';
4862  END IF;
4863 return l_layout_template_code;
4864 
4865 EXCEPTION
4866   WHEN OTHERS THEN
4867     RETURN 'E';
4868 END get_layout_template_code;
4869 
4870 
4871 --For R12 MSWord@WaySync
4872 
4873 PROCEDURE lock_contract(
4874   p_api_version          IN  NUMBER,
4875   p_init_msg_list        IN  VARCHAR2 :=  FND_API.G_FALSE,
4876 
4877   p_commit               IN  Varchar2,
4878   p_document_type        IN  VARCHAR2,
4879   p_document_id           IN  NUMBER,
4880   x_return_status        OUT NOCOPY VARCHAR2,
4881   x_msg_data             OUT NOCOPY VARCHAR2,
4882   x_msg_count            OUT NOCOPY NUMBER)
4883   IS
4884   l_api_version      CONSTANT NUMBER := 1;
4885   l_api_name         CONSTANT VARCHAR2(30) := 'lock_contract';
4886 
4887 BEGIN
4888 
4889     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4890        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'8000: Entered lock_contract');
4891     END IF;
4892 
4893     -- Standard call to check for call compatibility.
4894     IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
4895       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4896     END IF;
4897 
4898     -- Initialize message list if p_init_msg_list is set to TRUE.
4899     IF FND_API.to_Boolean( p_init_msg_list ) THEN
4900       FND_MSG_PUB.initialize;
4901     END IF;
4902 
4903     x_return_status := G_RET_STS_SUCCESS;
4904 OKC_TEMPLATE_USAGES_GRP.update_template_usages(
4905     p_api_version                  => l_api_version,
4906     p_init_msg_list                => p_init_msg_list ,
4907     p_validation_level             => FND_API.G_VALID_LEVEL_FULL,
4908     p_commit                       => FND_API.G_FALSE,
4909     x_return_status                => x_return_status,
4910     x_msg_count                    => x_msg_count,
4911     x_msg_data                     => x_msg_data,
4912     p_document_type          => p_document_type,
4913     p_document_id            => p_document_id,
4914     p_lock_terms_flag        => 'Y',
4915     p_locked_by_user_id      => FND_GLOBAL.user_id);
4916 
4917 
4918     -- Standard call to get message count and if count is 1, get message info.
4919     FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4920 
4921     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4922       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'8100: Leaving lock_contract');
4923     END IF;
4924 
4925 EXCEPTION
4926   WHEN OTHERS THEN
4927 
4928       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4929         FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'8200: Leaving lock_contract because of EXCEPTION:'||sqlerrm);
4930       END IF;
4931       IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
4932         FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
4933       END IF;
4934       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4935       x_return_status := G_RET_STS_UNEXP_ERROR ;
4936 END lock_contract;
4937 
4938 --For R12: MSWord2WaySync
4939 PROCEDURE unlock_contract(
4940   p_api_version          IN  NUMBER,
4941   p_init_msg_list        IN  VARCHAR2 :=  FND_API.G_FALSE,
4942 
4943   p_commit               IN  Varchar2,
4944   p_document_type        IN  VARCHAR2,
4945   p_document_id           IN  NUMBER,
4946   x_return_status        OUT NOCOPY VARCHAR2,
4947   x_msg_data             OUT NOCOPY VARCHAR2,
4948   x_msg_count            OUT NOCOPY NUMBER)
4949   IS
4950     l_api_version      CONSTANT NUMBER := 1;
4951   l_api_name         CONSTANT VARCHAR2(30) := 'unlock_contract';
4952 BEGIN
4953 
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,'8000: Entered lock_contract');
4956     END IF;
4957 
4958     -- Standard call to check for call compatibility.
4959     IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
4960       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4961     END IF;
4962 
4963     -- Initialize message list if p_init_msg_list is set to TRUE.
4964     IF FND_API.to_Boolean( p_init_msg_list ) THEN
4965       FND_MSG_PUB.initialize;
4966     END IF;
4967 
4968     x_return_status := G_RET_STS_SUCCESS;
4969 OKC_TEMPLATE_USAGES_GRP.update_template_usages(
4970     p_api_version                  => l_api_version,
4971     p_init_msg_list                => p_init_msg_list ,
4972     p_validation_level             => FND_API.G_VALID_LEVEL_FULL,
4973     p_commit                       => FND_API.G_FALSE,
4974     x_return_status                => x_return_status,
4975     x_msg_count                    => x_msg_count,
4976     x_msg_data                     => x_msg_data,
4977     p_document_type          => p_document_type,
4978     p_document_id            => p_document_id,
4979     p_lock_terms_flag        => 'N');
4980 
4981 
4982     -- Standard call to get message count and if count is 1, get message info.
4983     FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4984 
4985     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4986       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'8100: Leaving lock_contract');
4987     END IF;
4988 
4989 EXCEPTION
4990   WHEN OTHERS THEN
4991 
4992       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4993         FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'8200: Leaving lock_contract because of EXCEPTION:'||sqlerrm);
4994       END IF;
4995       IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
4996         FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
4997       END IF;
4998       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4999       x_return_status := G_RET_STS_UNEXP_ERROR ;
5000 END unlock_contract;
5001 
5002 FUNCTION get_sys_last_upd_date (
5003   p_document_type         IN  VARCHAR2,
5004   p_document_id           IN  NUMBER)
5005   RETURN DATE IS
5006 
5007 		 l_article_change_date  date;
5008 		 l_section_change_date  date;
5009 		 l_variable_change_date date;
5010 		 l_sys_last_update_date date;
5011 		 l_contract_source_code OKC_TEMPLATE_USAGES.CONTRACT_SOURCE_CODE%TYPE;
5012 
5013 		 Cursor l_get_max_art_date_csr IS
5014 		 SELECT max(Nvl(LAST_UPDATE_DATE,CREATION_DATE))
5015 		 FROM OKC_K_ARTICLES_B
5016 		 WHERE DOCUMENT_TYPE=p_document_type
5017 		 AND   DOCUMENT_ID=p_document_id;
5018 
5019 		 Cursor l_get_max_scn_date_csr IS
5020 		 SELECT max(Nvl(LAST_UPDATE_DATE,CREATION_DATE))
5021 		 FROM OKC_SECTIONS_B
5022 		 WHERE DOCUMENT_TYPE=p_document_type
5023 		 AND   DOCUMENT_ID=p_document_id;
5024 
5025            Cursor l_get_max_var_date_csr IS
5026 		 SELECT MAX(NVL(LAST_UPDATE_DATE,CREATION_DATE))
5027 		 FROM OKC_K_ART_VARIABLES WHERE CAT_ID IN (
5028 		 SELECT ID FROM OKC_K_ARTICLES_B
5029 		   WHERE DOCUMENT_TYPE = p_document_type
5030 		   AND DOCUMENT_ID = document_id);
5031 
5032 		 Cursor l_get_max_usg_upd_date_csr IS
5033 		 SELECT MAX(LAST_UPDATE_DATE)
5034 		 FROM   okc_template_usages
5035 		 WHERE  document_type = p_document_type
5036 		 AND    document_id = p_document_id;
5037 
5038 		 Cursor l_get_contract_source_csr IS
5039 		 SELECT contract_source_code
5040 		 FROM okc_template_usages
5041 		 WHERE document_type = p_document_type
5042 		 AND document_id = p_document_id;
5043 
5044 		 BEGIN
5045 		   IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5046 		          FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE,'9200: get_sys_last_upd_date p_doc_type : '||p_document_type);
5047 				       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE,'9300: get_sys_last_upd_date p_doc_id : '||p_document_id);
5048 	        END IF;
5049 
5050 
5051 		   OPEN l_get_contract_source_csr;
5052 			   FETCH l_get_contract_source_csr INTO l_contract_source_code;
5053 		        CLOSE l_get_contract_source_csr;
5054 
5055 
5056 		   IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5057 		         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE,'9310: After fetching l_get_contract_source_csr');
5058 		         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE,'9320: Contract Source Code :'||l_contract_source_code);
5059 		   END IF;
5060 
5061 		   IF l_contract_source_code = G_ATTACHED_CONTRACT_SOURCE THEN
5062 			    IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5063 		           FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE,'9330: Before opening l_get_max_usg_upd_date_csr');
5064 		         END IF;
5065 
5066 			    OPEN l_get_max_usg_upd_date_csr;
5067 			        FETCH l_get_max_usg_upd_date_csr INTO l_sys_last_update_date;
5068 			    CLOSE l_get_max_usg_upd_date_csr;
5069 
5070 			    IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5071 			        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE,'9340: After fetching l_get_max_usg_upd_date_csr');
5072 			        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE,'9350: l_terms_changed_date :'||l_sys_last_update_date);
5073 			    END IF;
5074 
5075 		    ELSE
5076                   OPEN  l_get_max_art_date_csr;
5077 			   FETCH l_get_max_art_date_csr INTO l_article_change_date;
5078 			   CLOSE l_get_max_art_date_csr;
5079 
5080                   OPEN  l_get_max_scn_date_csr;
5081 			     FETCH l_get_max_scn_date_csr INTO l_section_change_date;
5082 			   CLOSE l_get_max_scn_date_csr;
5083 
5084                   OPEN  l_get_max_var_date_csr;
5085 			     FETCH l_get_max_var_date_csr INTO l_variable_change_date;
5086 			   CLOSE l_get_max_var_date_csr;
5087 
5088                   OPEN l_get_max_usg_upd_date_csr;
5089 			      FETCH l_get_max_usg_upd_date_csr INTO l_sys_last_update_date;
5090 		        CLOSE l_get_max_usg_upd_date_csr;
5091 
5092                  --Begin:Fix for bug# 4909079. Added nvl check for article, section, variable, usages dates
5093                    l_article_change_date  := nvl(l_article_change_date ,okc_api.g_miss_date);
5094                    l_section_change_date  := nvl(l_section_change_date ,okc_api.g_miss_date);
5095                    l_variable_change_date := nvl(l_variable_change_date,okc_api.g_miss_date);
5096                    l_sys_last_update_date := nvl(l_sys_last_update_date,okc_api.g_miss_date);
5097 			  --End:Fix for bug# 4909079
5098 
5099 			  l_sys_last_update_date := Greatest(l_article_change_date, l_section_change_date,l_variable_change_date,l_sys_last_update_date);
5100 			  if(l_sys_last_update_date = OKC_API.G_MISS_DATE) THEN
5101 			     l_sys_last_update_date := sysdate;
5102 			  end if;
5103              END IF;
5104 
5105              IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5106 		      FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE,'9700: l_sys_last_update_date : '||l_sys_last_update_date);
5107 	        END IF;
5108 		   return l_sys_last_update_date;
5109           EXCEPTION
5110 		  WHEN OTHERS THEN
5111 		    RETURN NULL;
5112 END get_sys_last_upd_date;
5113 
5114 /*
5115   Function Name : get_revert_art_version_id
5116   Purpose       : This function returns the latest article_version_id of the ref_article_id queried using id
5117                   of OKC_K_ARTICLES_B.
5118   Usage         : This function is used in the Revert to Standard UI to query the latest article_version_id
5119                   for the ref_article_id of the article in OKC_K_ARTICLES_B queried using the id (primary_key).
5120 */
5121 
5122   FUNCTION get_revert_art_version_id(
5123         p_id IN NUMBER,
5124         p_document_type IN VARCHAR2,
5125         p_document_id IN NUMBER ) RETURN NUMBER
5126 	    IS
5127 
5128 	    l_article_version_number OKC_ARTICLES_ALL.ARTICLE_NUMBER%TYPE;
5129 	    l_article_version_id  OKC_ARTICLE_VERSIONS.ARTICLE_VERSION_ID%TYPE;
5130 	    l_local_article_id OKC_K_ARTICLES_B.ORIG_ARTICLE_ID%TYPE;
5131 	    l_adoption_type OKC_ARTICLE_VERSIONS.ADOPTION_TYPE%TYPE;
5132 	    l_ref_article_id OKC_K_ARTICLES_B.REF_ARTICLE_ID%TYPE;
5133 
5134 
5135         -- Fix for bug# 5235082. Changed the query to use id instead of sav_sae_id
5136 	    cursor get_ref_article_id is
5137 	      select ref_article_id from okc_k_articles_b
5138 		  where id = p_id;
5139 
5140 	    BEGIN
5141 	      open get_ref_article_id;
5142 		  fetch get_ref_article_id into l_ref_article_id;
5143 		 close get_ref_article_id;
5144 
5145 	     get_latest_article_details
5146 		 (
5147 		   p_article_id  => l_ref_article_id,
5148 		   p_document_type => p_document_type,
5149 		   p_document_id => p_document_id,
5150 	        x_article_version_id => l_article_version_id,
5151 		   x_article_version_number => l_article_version_number,
5152 		   x_local_article_id => l_local_article_id,
5153 		   x_adoption_type => l_adoption_type);
5154 
5155 	     RETURN l_article_version_id;
5156 END get_revert_art_version_id;
5157 
5158 
5159     -- Start of comments
5160     --API name      : set_udv_with_procedures
5161     --Type          : Private.
5162     --Function      : API to set the user defined variables with procedures,
5163     --                with values and insert them in a temporary table used in printing terms and review messages when the modified terms are uploaded
5164     --Pre-reqs      : None.
5165     --Parameters    :
5166     --IN            : p_api_version         IN NUMBER       Required
5167     --              : p_init_msg_list       IN VARCHAR2     Optional
5168     --                   Default = FND_API.G_FALSE
5169     --              : p_document_id         IN NUMBER       Required
5170     --                   Id of document whose udv with procs are to be set
5171     --              : p_doc_type            IN VARCHAR2       Required
5172     --                   Type of document whose udv with procs are to be set
5173     --              : p_output_error        IN VARCHAR2     Optional
5174     --              : x_return_status       OUT  VARCHAR2(1)
5175     --              : x_msg_count           OUT  NUMBER
5176     --              : x_msg_data            OUT  VARCHAR2(2000)
5177     --Note          :
5178     -- End of comments
5179 
5180 
5181 PROCEDURE set_udv_with_procedures (
5182     p_api_version       IN  NUMBER,
5183     p_init_msg_list     IN  VARCHAR2 :=  FND_API.G_FALSE,
5184 
5185     p_document_type     IN  VARCHAR2,
5186     p_document_id       IN  NUMBER,
5187     p_output_error      IN  VARCHAR2 :=  FND_API.G_TRUE,
5188 
5189     x_return_status     OUT NOCOPY VARCHAR2,
5190     x_msg_data          OUT NOCOPY VARCHAR2,
5191     x_msg_count         OUT NOCOPY NUMBER
5192 
5193   ) IS
5194     l_api_version       CONSTANT NUMBER := 1.0;
5195     l_api_name          CONSTANT VARCHAR2(30) := 'set_udv_with_procedures';
5196 
5197     l_variable_value        VARCHAR2(2500) := NULL;
5198     l_previous_var_code		okc_bus_variables_b.variable_code%TYPE := '-99';
5199 	l_return_status			VARCHAR2(10) := NULL;
5200 
5201 CURSOR csr_get_udv_with_procs IS
5202 SELECT VB.variable_code,
5203        KA.id,
5204        KA.article_version_id
5205 FROM okc_k_articles_b KA,
5206      okc_k_art_variables KV,
5207      okc_bus_variables_b VB
5208 WHERE VB.variable_code = KV.variable_code
5209 AND KA.id = KV.cat_id
5210 AND VB.variable_source = 'P'
5211 AND KA.document_type = p_document_type
5212 AND KA.document_id = p_document_id
5213 ORDER BY VB.variable_code;
5214 
5215    BEGIN
5216     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5217 		FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'100: Entered set_udv_with_procedures');
5218 		FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'100: p_document_type:'||p_document_type);
5219 		FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'100: p_document_id:'||p_document_id);
5220     END IF;
5221 
5222     /* Standard call to check for call compatibility */
5223     IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
5224 		RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5225     END IF;
5226 
5227     /* Initialize message list if p_init_msg_list is set to TRUE */
5228     IF FND_API.to_Boolean( p_init_msg_list ) THEN
5229 		FND_MSG_PUB.initialize;
5230     END IF;
5231 
5232     /* Initialize API return status to success */
5233     x_return_status := G_RET_STS_SUCCESS;
5234 
5235     /* Clear the temp table */
5236     DELETE FROM OKC_TERMS_UDV_WITH_PROCEDURE_T;
5237 
5238     FOR csr_udv_with_procs_rec IN csr_get_udv_with_procs LOOP
5239 
5240         /* Get the variable value */
5241 		IF l_previous_var_code <> csr_udv_with_procs_rec.variable_code THEN
5242 
5243 		    l_variable_value := NULL;
5244 
5245 			get_udv_with_proc_value (
5246 				p_document_type => p_document_type,
5247 				p_document_id  => p_document_id,
5248 				p_variable_code => csr_udv_with_procs_rec.variable_code,
5249 				p_output_error => p_output_error,
5250 				x_variable_value =>	l_variable_value,
5251 				x_return_status	=> l_return_status,
5252 				x_msg_data => x_msg_data,
5253 				x_msg_count	=> x_msg_count );
5254 
5255 		END IF;
5256 
5257 		/* Insert data into the temp table */
5258 		IF l_variable_value IS NOT NULL THEN
5259 
5260 			INSERT INTO OKC_TERMS_UDV_WITH_PROCEDURE_T
5261 			(
5262 				VARIABLE_CODE,
5263 				VARIABLE_VALUE,
5264 				DOC_TYPE,
5265 				DOC_ID,
5266 				ARTICLE_VERSION_ID,
5267 				CAT_ID
5268 			)
5269 			VALUES
5270 			(
5271 				csr_udv_with_procs_rec.variable_code,		-- VARIABLE_CODE
5272 				l_variable_value,	 						-- VARIABLE_VALUE
5273 				p_document_type, 							-- DOCUMENT_TYPE
5274 				p_document_id, 								-- DOCUMENT_ID
5275 				csr_udv_with_procs_rec.article_version_id,  -- ARTICLE_VERSION_ID
5276 				csr_udv_with_procs_rec.id					-- CAT_ID
5277 			);
5278 		END IF;
5279 
5280 		l_previous_var_code := csr_udv_with_procs_rec.variable_code;
5281 
5282     END LOOP;
5283 
5284 	IF p_output_error = FND_API.G_TRUE AND FND_MSG_PUB.Count_Msg > 0 THEN
5285 
5286 		x_return_status := G_RET_STS_ERROR;
5287 		RAISE FND_API.G_EXC_ERROR;
5288 	END IF;
5289 
5290     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5291         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'200: Leaving set_udv_with_procedures');
5292     END IF;
5293 
5294    EXCEPTION
5295     WHEN FND_API.G_EXC_ERROR THEN
5296 
5297       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5298          FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'1000: Leaving set_udv_with_procedures : OKC_API.G_EXCEPTION_ERROR Exception');
5299       END IF;
5300 
5301       IF csr_get_udv_with_procs%ISOPEN THEN
5302          CLOSE csr_get_udv_with_procs;
5303       END IF;
5304 
5305       x_return_status := G_RET_STS_ERROR ;
5306       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
5307 
5308     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5309 
5310       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5311          FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'2000: Leaving set_udv_with_procedures : OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception');
5312       END IF;
5313 
5314       IF csr_get_udv_with_procs%ISOPEN THEN
5315          CLOSE csr_get_udv_with_procs;
5316       END IF;
5317 
5318       x_return_status := G_RET_STS_UNEXP_ERROR ;
5319       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
5320 
5321     WHEN OTHERS THEN
5322 
5323       IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5324         FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'3000: Leaving set_udv_with_procedures because of EXCEPTION: '||sqlerrm);
5325       END IF;
5326 
5327       IF csr_get_udv_with_procs%ISOPEN THEN
5328          CLOSE csr_get_udv_with_procs;
5329       END IF;
5330 
5331       x_return_status := G_RET_STS_UNEXP_ERROR ;
5332       IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
5333         FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
5334       END IF;
5335       FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
5336 
5337 END set_udv_with_procedures ;
5338 
5339     -- Start of comments
5340     --API name      : get_udv_with_proc_value
5341     --Function      : This API returns the value for a user defined variable with procedure as source.
5342     --                This API is used in print terms and validate terms
5343     --Pre-reqs      : None.
5344     --Parameters    :
5345     --IN            : p_document_id         IN NUMBER       Required
5346     --              : p_doc_type            IN VARCHAR2		Required
5347 	--		        : p_variable_code       IN VARCHAR2		Required
5348 	--				: p_output_error		IN VARCHAR2     Optional
5349 	--				: x_variable_value		OUT  VARCHAR2
5350     --              : x_return_status       OUT  VARCHAR2(1)
5351     --              : x_msg_count           OUT  NUMBER
5352     --              : x_msg_data            OUT  VARCHAR2(2000)
5353     --Note          :
5354     -- End of comments
5355 
5356 PROCEDURE get_udv_with_proc_value (
5357         p_document_type         IN  VARCHAR2,
5358         p_document_id           IN  NUMBER,
5359         p_variable_code         IN  VARCHAR2,
5360 		p_output_error			IN  VARCHAR2 :=  FND_API.G_FALSE,
5361 		x_variable_value		OUT NOCOPY VARCHAR2,
5362 	    x_return_status			OUT NOCOPY VARCHAR2,
5363 		x_msg_data				OUT NOCOPY VARCHAR2,
5364 	    x_msg_count				OUT NOCOPY NUMBER
5365 
5366 	) IS
5367 
5368 
5369     l_api_name            CONSTANT VARCHAR2(30) := 'get_udv_with_proc_value';
5370 
5371     l_variable_value      VARCHAR2(2500) := NULL;
5372 
5373 	l_procedure_name      okc_bus_variables_b.procedure_name%TYPE;
5374     l_value_set_id        okc_bus_variables_b.value_set_id%TYPE;
5375 	l_variable_name       okc_bus_variables_tl.variable_name%TYPE;
5376     l_variable_value_id	  VARCHAR2(2500) := NULL;
5377     l_return_status       VARCHAR2(10);
5378     l_msg_count           NUMBER;
5379     l_msg_data            VARCHAR2(2500);
5380     l_dynamic_sql_stmt	  LONG;
5381 
5382     l_procedure_spec_status     ALL_OBJECTS.status%TYPE;
5383     l_procedure_body_status     ALL_OBJECTS.status%TYPE;
5384     l_dummy                     VARCHAR2(1);
5385 
5386 	l_validation_type           fnd_flex_value_sets.validation_type%TYPE;
5387     l_table_name                fnd_flex_validation_tables.application_table_name%TYPE;
5388     l_name_col                  fnd_flex_validation_tables.value_column_name%TYPE;
5389     l_id_col                    fnd_flex_validation_tables.id_column_name%TYPE;
5390     l_additional_where_clause   fnd_flex_validation_tables.additional_where_clause%TYPE;
5391     l_sql_stmt                  LONG;
5392     TYPE cur_typ IS REF CURSOR;
5393     c_cursor cur_typ;
5394 
5395 CURSOR csr_get_udv_with_proc_dtls IS
5396 SELECT VB.procedure_name,
5397        VB.value_set_id,
5398 	   VT.variable_name
5399 FROM okc_bus_variables_b VB,
5400      okc_bus_variables_tl VT
5401 WHERE VB.variable_code = VT.variable_code
5402 AND VT.language =  USERENV('LANG')
5403 AND VB.variable_code = p_variable_code
5404 AND VB.variable_source = 'P';
5405 
5406 CURSOR csr_get_validation_type(p_value_set_id IN NUMBER) IS
5407 SELECT validation_type
5408 FROM FND_FLEX_VALUE_SETS
5409 WHERE  flex_value_set_id = p_value_set_id;
5410 
5411 CURSOR csr_value_set_table(p_value_set_id IN NUMBER) IS
5412 SELECT  application_table_name,
5413         value_column_name,
5414         id_column_name,
5415         additional_where_clause
5416 FROM fnd_flex_validation_tables
5417 WHERE flex_value_set_id = p_value_set_id;
5418 
5419 --Expected procedure name is SCHEMA.PACKAGENAME.PROCEDURENAME
5420 
5421 CURSOR csr_check_proc_spec_status (p_procedure_name VARCHAR2) IS
5422 SELECT status
5423 FROM all_objects
5424 WHERE object_name = SUBSTR(p_procedure_name,
5425                            INSTR(p_procedure_name,'.')+1,
5426                            (INSTR(p_procedure_name,'.',1,2) -
5427                             INSTR(p_procedure_name,'.') - 1))
5428 AND object_type = 'PACKAGE'
5429 AND owner = SUBSTR(p_procedure_name,1,INSTR(p_procedure_name,'.')-1);
5430 
5431 
5432 CURSOR csr_check_proc_body_status (p_procedure_name VARCHAR2) IS
5433 SELECT status
5434 FROM all_objects
5435 WHERE object_name = SUBSTR(p_procedure_name,
5436                            INSTR(p_procedure_name,'.')+1,
5437                            (INSTR(p_procedure_name,'.',1,2) -
5438                             INSTR(p_procedure_name,'.') - 1))
5439 AND object_type = 'PACKAGE BODY'
5440 AND owner = SUBSTR(p_procedure_name,1,INSTR(p_procedure_name,'.')-1);
5441 
5442 CURSOR csr_check_proc_exists (p_procedure_name VARCHAR2) IS
5443 SELECT 'X'
5444 FROM all_source
5445 WHERE name = SUBSTR(p_procedure_name,
5446                            INSTR(p_procedure_name,'.')+1,
5447                            (INSTR(p_procedure_name,'.',1,2) -
5448                             INSTR(p_procedure_name,'.') - 1))
5449 AND type = 'PACKAGE'
5450 AND owner = SUBSTR(p_procedure_name,1,INSTR(p_procedure_name,'.')-1)
5451 AND text LIKE '%' || SUBSTR(p_procedure_name,INSTR(p_procedure_name,'.',1,2)+1) || '%';
5452 
5453 
5454 	BEGIN
5455 		IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5456 			FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'100: Entered get_udv_with_proc_value');
5457 	    END IF;
5458 
5459 	    /* Initialize API return status to success */
5460 		x_return_status := G_RET_STS_SUCCESS;
5461 
5462 		BEGIN
5463 			OPEN csr_get_udv_with_proc_dtls;
5464             FETCH csr_get_udv_with_proc_dtls INTO l_procedure_name, l_value_set_id, l_variable_name;
5465             CLOSE csr_get_udv_with_proc_dtls;
5466 
5467 
5468 		    /* Execute the procedure */
5469 		    l_dynamic_sql_stmt := 'BEGIN '||l_procedure_name || '(' ||
5470 				'x_return_status =>     '|| ':1' || ',' ||
5471 				'x_msg_data =>          '|| ':2' || ',' ||
5472 				'x_msg_count =>         '|| ':3' || ',' ||
5473 				'p_doc_type =>          '|| ':4' || ',' ||
5474 				'p_doc_id =>            '|| ':5' || ',' ||
5475 				'p_variable_code =>     '|| ':6' || ',' ||
5476 				'x_variable_value_id => '|| ':7' || '); END;';
5477 
5478 			IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5479 				FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE , G_MODULE||l_api_name,'200: l_dynamic_sql_stmt '|| l_dynamic_sql_stmt);
5480 				FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'200: variable_code:'||p_variable_code);
5481 			END IF;
5482 
5483 	        l_variable_value_id := NULL;
5484 
5485 			EXECUTE IMMEDIATE l_dynamic_sql_stmt
5486 				USING OUT l_return_status, OUT l_msg_data, OUT l_msg_count,
5487 			    p_document_type, p_document_id, p_variable_code,
5488 			    IN OUT l_variable_value_id;
5489 
5490 	        IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5491 				FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'300: Procedure return status:'||l_return_status);
5492 			    FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'300: Variable value id:'||l_variable_value_id);
5493 	        END IF;
5494 
5495 	        IF (l_return_status = G_RET_STS_ERROR) THEN
5496 
5497 				l_variable_value_id := NULL;
5498 
5499 				IF p_output_error = FND_API.G_TRUE THEN
5500 					FND_MESSAGE.set_name('OKC','OKC_UDV_PROC_EXEC');
5501 	                FND_MESSAGE.set_token('VAR_NAME', l_variable_name);
5502 		            FND_MESSAGE.set_token('PROC_NAME', l_procedure_name);
5503 			        FND_MSG_PUB.ADD;
5504 				END IF;
5505 	        ELSIF (l_return_status = G_RET_STS_UNEXP_ERROR) THEN
5506 
5507 				l_variable_value_id := NULL;
5508 
5509 				IF p_output_error = FND_API.G_TRUE THEN
5510 					FND_MESSAGE.set_name('OKC','OKC_UDV_PROC_UNEXP');
5511 					FND_MESSAGE.set_token('VAR_NAME', l_variable_name);
5512 	                FND_MESSAGE.set_token('PROC_NAME', l_procedure_name);
5513 		            FND_MSG_PUB.ADD;
5514 				END IF;
5515 			END IF;
5516 
5517 	    EXCEPTION
5518 	    WHEN OTHERS THEN
5519 
5520 			l_variable_value_id := NULL;
5521 
5522 			IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5523 			    FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'400: Error in procedure execution:'||sqlerrm);
5524 			END IF;
5525 
5526 			IF p_output_error = FND_API.G_TRUE THEN
5527 
5528 				l_dummy := '?';
5529                 OPEN csr_check_proc_exists(p_procedure_name => l_procedure_name);
5530                 FETCH csr_check_proc_exists INTO l_dummy;
5531 
5532                 OPEN csr_check_proc_spec_status(p_procedure_name => l_procedure_name);
5533                 FETCH csr_check_proc_spec_status INTO l_procedure_spec_status;
5534 
5535                 OPEN csr_check_proc_body_status(p_procedure_name => l_procedure_name);
5536                 FETCH csr_check_proc_body_status INTO l_procedure_body_status;
5537 
5538                 CLOSE csr_check_proc_exists;
5539                 CLOSE csr_check_proc_spec_status;
5540                 CLOSE csr_check_proc_body_status;
5541 
5542                 IF l_dummy <> 'X' THEN
5543                     FND_MESSAGE.set_name('OKC','OKC_UDV_PROC_NOT_EXIST');
5544                     FND_MESSAGE.set_token('VAR_NAME', l_variable_name);
5545                     FND_MESSAGE.set_token('PROC_NAME', l_procedure_name);
5546                     FND_MSG_PUB.ADD;
5547                 ELSIF l_procedure_spec_status = 'INVALID' OR l_procedure_body_status = 'INVALID' THEN
5548                     FND_MESSAGE.set_name('OKC','OKC_UDV_PROC_INVALID');
5549                     FND_MESSAGE.set_token('VAR_NAME', l_variable_name);
5550                     FND_MESSAGE.set_token('PROC_NAME', l_procedure_name);
5551                     FND_MSG_PUB.ADD;
5552                 END IF;
5553 			END IF;
5554 
5555 	    END;
5556 
5557         /* Get the variable value from the variable value id using the value set */
5558 
5559 		IF l_variable_value_id IS NOT NULL THEN
5560 
5561 	        BEGIN
5562 
5563 	            l_variable_value := NULL;
5564 
5565 				OPEN csr_get_validation_type(p_value_set_id => l_value_set_id);
5566 				FETCH csr_get_validation_type INTO l_validation_type;
5567 				CLOSE csr_get_validation_type;
5568 
5569 	            /* Valueset is Table type, execute the dynamic sql to get the variable value */
5570 	            IF l_validation_type = 'F' THEN
5571 
5572 					OPEN csr_value_set_table(p_value_set_id => l_value_set_id);
5573 					FETCH csr_value_set_table INTO l_table_name, l_name_col, l_id_col, l_additional_where_clause;
5574 					CLOSE csr_value_set_table;
5575 
5576 					l_sql_stmt :=   'SELECT '||l_name_col||
5577 									' FROM ('||
5578 									' SELECT '||l_name_col||' , '||l_id_col||
5579 									' FROM  '||l_table_name||' ';
5580 
5581 					IF TRIM(l_additional_where_clause) IS NOT NULL THEN
5582 						IF INSTR(UPPER(l_additional_where_clause),'WHERE') > 0 THEN
5583 							l_sql_stmt := l_sql_stmt || l_additional_where_clause;
5584 						ELSE
5585 							l_sql_stmt :=  l_sql_stmt || 'WHERE '||l_additional_where_clause;
5586 						END IF;
5587 					END IF;
5588 
5589 					l_sql_stmt := l_sql_stmt ||  ' ) WHERE to_char('||l_id_col|| ') = '''|| l_variable_value_id || '''';
5590 
5591 	                OPEN c_cursor FOR l_sql_stmt;
5592 	                FETCH c_cursor INTO l_variable_value;
5593 	                CLOSE c_cursor;
5594 
5595 	            /* Valueset is Independent type */
5596 	            ELSIF l_validation_type = 'I' THEN
5597 
5598 					l_variable_value := OKC_TERMS_UTIL_PVT.GET_VALUE_SET_VARIABLE_VALUE (
5599 										p_CONTEXT => l_validation_type,
5600 										p_VALUE_SET_ID => l_value_set_id,
5601 										p_FLEX_VALUE_ID => l_variable_value_id);
5602 
5603 				/* Valueset is None type */
5604 				ELSE
5605 
5606 					l_variable_value := l_variable_value_id;
5607 				END IF;
5608 
5609 	        EXCEPTION
5610             WHEN OTHERS THEN
5611 
5612 				l_variable_value := NULL;
5613 
5614 				IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5615 					FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'500: Error while fetching value from valueset:'||sqlerrm);
5616 				END IF;
5617 
5618 				IF p_output_error = FND_API.G_TRUE THEN
5619 					FND_MESSAGE.set_name('OKC','OKC_UDV_VSET_INVALID');
5620 					FND_MESSAGE.set_token('VAR_NAME', l_variable_name);
5621 					FND_MSG_PUB.ADD;
5622 				END IF;
5623 	        END;
5624 
5625 	    END IF;   /* IF l_variable_value_id IS NOT NULL*/
5626 
5627 		x_variable_value := l_variable_value;
5628 
5629 		IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5630 		    FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'600: Variable value:'||l_variable_value);
5631 			FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE, G_MODULE||l_api_name,'700: Leaving  get_udv_with_proc_value');
5632 		END IF;
5633 
5634 	EXCEPTION
5635 	WHEN FND_API.G_EXC_ERROR THEN
5636 
5637 		IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5638 		 FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'1000: Leaving get_udv_with_proc_value : OKC_API.G_EXCEPTION_ERROR Exception');
5639 		END IF;
5640 
5641 		IF csr_get_udv_with_proc_dtls%ISOPEN THEN
5642 		 CLOSE csr_get_udv_with_proc_dtls;
5643 		END IF;
5644 
5645 		x_return_status := G_RET_STS_ERROR ;
5646 		FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
5647 
5648 	WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5649 
5650 		IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5651 		 FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'2000: Leaving get_udv_with_proc_value : OKC_API.G_EXCEPTION_UNEXPECTED_ERROR Exception');
5652 		END IF;
5653 
5654 		IF csr_get_udv_with_proc_dtls%ISOPEN THEN
5655 		 CLOSE csr_get_udv_with_proc_dtls;
5656 		END IF;
5657 
5658 		x_return_status := G_RET_STS_UNEXP_ERROR ;
5659 		FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
5660 
5661 	WHEN OTHERS THEN
5662 
5663 		IF ( FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5664 		FND_LOG.STRING( FND_LOG.LEVEL_EXCEPTION, G_MODULE||l_api_name,'3000: Leaving get_udv_with_proc_value because of EXCEPTION: '||sqlerrm);
5665 		END IF;
5666 
5667 		IF csr_get_udv_with_proc_dtls%ISOPEN THEN
5668 		 CLOSE csr_get_udv_with_proc_dtls;
5669 		END IF;
5670 
5671 		x_return_status := G_RET_STS_UNEXP_ERROR ;
5672 		IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
5673 		FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
5674 		END IF;
5675 		FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
5676 
5677 END get_udv_with_proc_value;
5678 
5679 
5680 END OKC_TERMS_UTIL_PVT;